diff --git a/client/public/locales/lt/common.json b/client/public/locales/lt/common.json
index 2dbd9ca7..ded7641d 100644
--- a/client/public/locales/lt/common.json
+++ b/client/public/locales/lt/common.json
@@ -354,7 +354,8 @@
"non_unique_key_error": "Raktas turi būti unukalus.",
"key_not_changed": "Prašome pakeisti raktą į ką nors kitą.",
"delete_confirm": "Šalinti lauką {{name}}?",
- "delete_confirm_description": "Tai ištrins lauką ir visus susijusius duomenis visiems objektams."
+ "delete_confirm_description": "Tai ištrins lauką ir visus susijusius duomenis visiems objektams.",
+ "choices_reorder_hint": "Temkite arba naudokite rodyklių klavišus, kad pakeistumėte eilės tvarką."
}
},
"documentTitle": {
@@ -396,5 +397,10 @@
"new_location": "Nauja vieta",
"no_location": "Be vietos",
"no_locations_help": "Šiame puslapyje galite tvarkyti rites pagal vietas, pridėkite keletą ričių, kad pradėtumėte!"
+ },
+ "theme": {
+ "label": "Tema",
+ "system": "Sistema",
+ "dark": "Tamsus"
}
}
diff --git a/client/public/locales/pl/common.json b/client/public/locales/pl/common.json
index 2bb533c0..a5078ac7 100644
--- a/client/public/locales/pl/common.json
+++ b/client/public/locales/pl/common.json
@@ -8,7 +8,7 @@
},
"buttons": {
"edit": "Edytuj",
- "unArchive": "Odarchiwizuj",
+ "unArchive": "Przywróć",
"cancel": "Anuluj",
"create": "Utwórz",
"save": "Zapisz",
@@ -56,7 +56,7 @@
"first_used": "Pierwsze użycie",
"last_used": "Ostatnie użycie",
"comment": "Komentarz",
- "archived": "Zarchiwizowano",
+ "archived": "Zarchiwizowana",
"used_weight": "Zużyta waga",
"registered": "Zarejestrowano",
"measured_weight": "Zmierzona waga",
@@ -111,7 +111,7 @@
"importProgress": "Importowanie: {{processed}}/{{total}}",
"error": "Błąd (kod statusu: {{statusCode}})",
"createError": "Wystąpił błąd podczas tworzenia {{resource}} (kod statusu: {{statusCode}})",
- "saveSuccessful": "Pomyślnie zapisano!",
+ "saveSuccessful": "Zapisano pomyślnie!",
"validationError": "Błąd walidacji: {{error}}"
},
"loading": "Wczytywanie",
@@ -125,38 +125,38 @@
"printing": {
"generic": {
"title": "Drukowanie",
- "helpMargin": "Marginesy powinny być skonfigurowane tak, aby pasowały do papieru etykietowego i drukarki, ich zmiana wpłynie na rozmiar całej siatki.",
- "helpPrinterMargin": "Bezpieczna strefa powinna być ustawiona tak, aby znajdowała się jak najbliżej krawędzi papieru, na którym drukarka może drukować, zmiana tych ustawień nie wpłynie na całą siatkę.",
+ "helpMargin": "Marginesy powinny odpowiadać papierowi etykiet i drukarce — ich zmiana wpływa na rozmiar całej siatki.",
+ "helpPrinterMargin": "Strefę bezpieczną ustaw na to, jak blisko krawędzi papieru drukarka jeszcze drukuje. Zmiana tych wartości nie wpływa na całą siatkę.",
"print": "Drukuj",
"columns": "Kolumny",
"rows": "Wiersze",
"paperSize": "Rozmiar papieru",
- "customSize": "Niestandardowy",
+ "customSize": "Własny",
"dimensions": "Wymiary",
"showBorder": "Pokaż obramowanie",
"previewScale": "Skala podglądu",
- "skipItems": "Pomiń elementy",
+ "skipItems": "Pomiń pozycje",
"contentSettings": "Ustawienia zawartości",
"layoutSettings": "Ustawienia układu",
- "verticalSpacing": "Pionowy odstęp",
- "marginLeft": "Lewy margines",
- "marginRight": "Prawy margines",
- "marginTop": "Górny margines",
- "marginBottom": "Dolny margines",
- "printerMarginLeft": "Bezpieczna strefa po lewej",
- "printerMarginRight": "Bezpieczna strefa po prawej",
- "printerMarginTop": "Bezpieczna strefa od góry",
+ "verticalSpacing": "Odstęp pionowy",
+ "marginLeft": "Margines lewy",
+ "marginRight": "Margines prawy",
+ "marginTop": "Margines górny",
+ "marginBottom": "Margines dolny",
+ "printerMarginLeft": "Strefa bezpieczna lewo",
+ "printerMarginRight": "Strefa bezpieczna prawo",
+ "printerMarginTop": "Strefa bezpieczna góra",
"borders": {
"none": "Brak",
"border": "Obwódka",
"grid": "Siatka"
},
- "description": "Dostosuj poniższe ustawienia, aby uzyskać pożądany układ wydruku. Należy pamiętać, że drukarki i system operacyjny mogą stosować własne marginesy i skalowanie, więc może być konieczne wykonanie kilku prób i błędów, zanim wszystko będzie prawidłowe. Przed wydrukowaniem etykiet przetestuj je na zwykłym papierze.",
- "horizontalSpacing": "Poziomy odstęp",
- "printerMarginBottom": "Bezpieczna strefa od dołu",
+ "description": "Dopasuj ustawienia poniżej, aby uzyskać właściwy układ wydruku. Pamiętaj, że drukarka i system mogą dodać własne marginesy i skalowanie, więc zwykle trzeba trochę poeksperymentować. Przetestuj na zwykłej kartce, zanim zujesz właściwe etykiety.",
+ "horizontalSpacing": "Odstęp poziomy",
+ "printerMarginBottom": "Strefa bezpieczna dół",
"newSetting": "Nowe",
"defaultSettings": "Domyślne",
- "itemCopies": "Skopiuj element",
+ "itemCopies": "Kopie pozycji",
"settings": "Presety",
"saveAsImage": "Zapisz jako obraz",
"duplicateSettings": "Zduplikuj",
@@ -186,12 +186,12 @@
"template": "Wzór etykiety",
"useHTTPUrl": {
"preview": "Podgląd:",
- "label": "Link kodu QR",
+ "label": "Link w kodzie QR",
"options": {
- "default": "Domyślne",
+ "default": "Domyślny",
"url": "URL"
},
- "tooltip": "Zostanie użyty link który będzie działał tylko gdy zostanie zeskanowany przez funkcję skanowania Spoolmana (Domyślna opcja). Link URL używa bazowego URL ustawionego w ustawieniach lub aktualnego URL strony jeżeli nie jest ustawiony w ustawieniach."
+ "tooltip": "Użyje zastrzeżonego linku, który zadziała tylko po zeskanowaniu za pomocą funkcji skanowania w Spoolman (domyślnie). Opcja URL używa podstawowego adresu URL określonego w ustawieniach lub, jeśli nie jest ustawiony, adresu URL bieżącej strony."
},
"showQRCode": "Drukuj kod QR",
"showQRCodeMode": {
@@ -216,13 +216,13 @@
"title": "Skaner kodów QR",
"error": {
"notAllowed": "Nie zezwolono na dostęp do kamery.",
- "insecureContext": "Strona nie jest dostarczana przez HTTPS.",
- "streamApiNotSupported": "Przeglądarka nie obsługuje API MediaStream.",
+ "insecureContext": "Strona nie jest serwowana przez HTTPS.",
+ "streamApiNotSupported": "Przeglądarka nie obsługuje MediaStream API.",
"notReadable": "Kamera jest niedostępna do odczytu.",
"notFound": "Nie znaleziono kamery.",
"unknown": "Wystąpił nieznany błąd. ({{error}})"
},
- "description": "Zeskanuj kod QR Spoolman, aby wyświetlić szczegółowe informacje o szpuli."
+ "description": "Zeskanuj kod QR Spoolmana, aby zobaczyć szczegóły szpuli."
},
"filament": {
"filament": "Filamenty",
@@ -248,7 +248,7 @@
"single_color": "Pojedynczy",
"multi_color": "Wielo",
"longitudinal": "Wzdłużny",
- "coaxial": "Koekstrudowany"
+ "coaxial": "Współwytłaczany"
},
"fields_help": {
"material": "Np. PLA, ABS, PETG itp.",
@@ -348,7 +348,7 @@
"help": "Pomoc",
"description": "
PomocOto kilka wskazówek na początek.
Spoolman przechowuje 3 różne typy danych:
Aby dodać nową szpulę do bazy danych, zacznij od utworzenia obiektu Filament. Gdy już to zrobisz, przejdź do utworzenia obiektu Szpula dla tej konkretnej szpuli. Jeśli później zdobędziesz dodatkowe szpule tego samego filamentu, po prostu wygeneruj dodatkowe obiekty Szpula i ponownie użyj tego samego obiektu Filament.
Opcjonalnie możesz także wygenerować obiekt Producent dla firmy produkującej filament, jeśli chcesz śledzić te informacje.
Masz możliwość połączenia innych usług drukarek 3D ze Spoolmanem, takich jak Moonraker, który może automatycznie monitorować zużycie filamentu i aktualizować obiekty Szpula. Wskazówki dotyczące konfiguracji można znaleźć w Spoolman README.
"
},
- "kofi": "Daj napiwek na Ko-fi",
+ "kofi": "Wesprzyj mnie na Ko-fi",
"home": {
"home": "Strona główna",
"welcome": "Witaj w instancji Spoolman!",
@@ -395,11 +395,12 @@
"boolean": "Wartość logiczna"
},
"non_unique_key_error": "Klucz musi być unikalny.",
- "description": "Tutaj możesz dodać dodatkowe pola niestandardowe do swoich podmiotów.
Po dodaniu pola nie można zmienić jego klucza ani typu, a w przypadku pól typu wyboru nie można usunąć wyborów ani zmienić stanu wielokrotnego wyboru. Jeśli usuniesz pole, powiązane dane dla wszystkich podmiotów zostaną usunięte.
Klucz jest tym, co inne programy odczytują/zapisują jako dane, więc jeśli twoje niestandardowe pole ma być zintegrowane z programem innej firmy, upewnij się, że ustawiłeś je poprawnie. Wartość domyślna jest stosowana tylko do nowych elementów.
Dodatkowych pól nie można sortować ani filtrować w widokach tabeli.
",
+ "description": "Tutaj możesz dodać dodatkowe pola niestandardowe do swoich encji.
Po dodaniu pola nie można zmienić jego klucza ani typu, a w przypadku pól typu „wybór” nie można usuwać opcji ani zmieniać ustawienia wielu wyborów. Usunięcie pola spowoduje usunięcie powiązanych danych dla wszystkich encji.
Klucz jest wartością, którą inne programy odczytują i zapisują jako dane, więc jeśli Twoje pole niestandardowe ma integrować się z programem zewnętrznym, upewnij się, że jest ustawione poprawnie. Wartość domyślna jest stosowana tylko do nowych elementów.
Pola dodatkowe można wyświetlać i sortować w widokach tabeli. Pola typu „wybór” i logiczne (boolean) udostępniają tam również opcje filtrowania, a wszystkie typy pól dodatkowych obsługują filtrowanie wartości pustych.
",
"choices_missing_error": "Nie możesz usunąc możliwośći wyboru. Ten wybór nie istnieje: {{choices}}",
"key_not_changed": "Zmień klucz na inny.",
"delete_confirm": "Usunąć pole {{name}}?",
- "delete_confirm_description": "Ta akcja usunie wszystkie pola i powiązane z nimi dane dla wszystkich obiektów."
+ "delete_confirm_description": "Ta akcja usunie wszystkie pola i powiązane z nimi dane dla wszystkich obiektów.",
+ "choices_reorder_hint": "Przeciągnij lub użyj klawiszy strzałek, aby zmienić kolejność tej opcji."
},
"header": "Ustawienia"
},
@@ -408,5 +409,11 @@
"new_location": "Nowa lokalizacja",
"no_location": "Brak lokalizacji",
"no_locations_help": "Ta strona pozwala uporządkować szpule w lokalizacjach, dodaj kilka szpul aby rozpocząć!"
+ },
+ "theme": {
+ "label": "Motyw",
+ "system": "System",
+ "light": "Jasny",
+ "dark": "Ciemny"
}
}
diff --git a/client/public/locales/th/common.json b/client/public/locales/th/common.json
index c93efd9e..44d0a893 100644
--- a/client/public/locales/th/common.json
+++ b/client/public/locales/th/common.json
@@ -31,7 +31,7 @@
"create": "สร้างม้วนพลาสติก",
"adjust": "ปรับการใช้ม้วนพลาสติก",
"edit": "แก้ไขม้วนพลาสติก",
- "list": "รายการม้วนพลาสติก",
+ "list": "ม้วนพลาสติก",
"show": "แสดงม้วนพลาสติก"
},
"form": {
@@ -175,10 +175,10 @@
},
"filament": {
"fields_help": {
- "spool_weight": "น้ำหนักม้วนพลาสติกเปล่า ใช้เพื่อคำนวณน้ำหนักรวมของม้วนพลาสติก",
+ "spool_weight": "น้ำหนักของม้วนพลาสติกเปล่า ใช้เพื่อคำนวณน้ำหนักที่วัดได้ของม้วนพลาสติก",
"material": "ตัวอย่างเช่น PLA, ABS, PETG, TPU, ASA, PC, PA เป็นต้น",
"article_number": "เช่น EAN, UPC, เป็นต้น",
- "price": "ราคาของม้วนพลาสติกเต็ม (เส้นพลาสติกทั้งหมด)",
+ "price": "ราคาของม้วนพลาสติกเต็ม",
"weight": "น้ำหนักของเส้นพลาสติกในม้วนพลาสติก (สุทธิ) ไม่รวมม้วนพลาสติกเปล่า เป็นค่าน้ำหนักที่มักระบุบนบรรจุภัณฑ์",
"name": "ชื่อเส้นพลาสติก เพื่อแยกความต่างระหว่างเส้นพลาสติกแบบเดียวกันจากผู้ผลิตเดียวกัน โดยทั่วไปควรระบุสีในชื่อด้วย",
"multi_color_direction": "เส้นพลาสติกหลายสีสามารถมีหลายสีได้ 2 รูปแบบ: แบบ coextrusion (เช่น เส้นพลาสติกสองสีพร้อมกัน) หรือแบบไล่สีตามความยาว (เช่น เส้นพลาสติกเปลี่ยนสีไปเรื่อยๆ)"
@@ -193,15 +193,15 @@
"material": "วัสดุ",
"id": "ID",
"settings_bed_temp": "อุณหภูมิฐานพิมพ์",
- "vendor_name": "ยี่ห้อ",
+ "vendor_name": "ผู้ผลิต",
"diameter": "เส้นผ่านศูนย์กลาง",
- "article_number": "เลขบทความ",
+ "article_number": "รหัสสินค้า",
"multi_color": "หลายสี",
"external_id": "รหัสภายนอก",
"color_hex": "สี",
"price": "ราคา",
"spool_weight": "น้ำหนักม้วนพลาสติกเปล่า",
- "coaxial": "เส้นหลายสี",
+ "coaxial": "เส้นประกบหลายสี",
"name": "ชื่อ",
"spools": "แสดงม้วนพลาสติก",
"registered": "ลงทะเบียน",
@@ -209,7 +209,7 @@
},
"titles": {
"edit": "แก้ไขเส้นพลาสติก",
- "list": "รายการเส้นพลาสติก",
+ "list": "เส้นพลาสติก",
"show": "แสดงเส้นพลาสติก",
"clone": "ทำซ้ำเส้นพลาสติก",
"show_title": "[เส้นพลาสติก #{{id}}] {{name}}",
@@ -218,7 +218,7 @@
"form": {
"filament_updated": "เส้นพลาสติกนี้ได้รับการอัปเดตโดยผู้อื่นหลังจากที่คุณเปิดหน้านี้ การบันทึกจะเขียนทับการเปลี่ยนแปลง!",
"import_external": "นำเข้าจากภายนอก",
- "import_external_description": "เลือกเส้นพลาสติกในรายการเพื่อกรอกข้อมูลอัตโนมัติในฟอร์มนี้ การดำเนินการนี้จะเขียนทับข้อมูลที่คุณกรอกไว้ อ็อบเจ็กต์ผู้ผลิตจะถูกสร้างขึ้นโดยอัตโนมัติเมื่อคุณคลิกตกลง"
+ "import_external_description": "เลือกเส้นพลาสติกในรายการเพื่อกรอกข้อมูลอัตโนมัติในฟอร์มนี้ การดำเนินการนี้จะเขียนทับข้อมูลที่คุณกรอกไว้
อ็อบเจ็กต์ผู้ผลิตจะถูกสร้างขึ้นโดยอัตโนมัติเมื่อคุณคลิกตกลง หากจำเป็น"
},
"buttons": {
"add_spool": "เพิ่มม้วนพลาสติก"
@@ -270,7 +270,7 @@
"locations": {
"list": "สถานที่เก็บ | Spoolman"
},
- "default": "สปูลแมน"
+ "default": "Spoolman"
},
"notifications": {
"error": "เกิดข้อผิดพลาด (รหัสสถานะ: {{statusCode}})",
@@ -296,12 +296,12 @@
},
"vendor": {
"titles": {
- "create": "สร้างผู้ผลิต/ยี่ห้อ",
- "list": "รายการผู้ผลิต/ยี่ห้อ",
- "clone": "ทำซ้ำผู้ผลิต/ยี่ห้อ",
+ "create": "สร้างผู้ผลิต",
+ "list": "ผู้ผลิต",
+ "clone": "ทำซ้ำผู้ผลิต",
"show_title": "[ผู้ผลิต #{{id}}] {{name}}",
- "edit": "แก้ไขผู้ผลิต/ยี่ห้อ",
- "show": "แสดงผู้ผลิต/ยี่ห้อ"
+ "edit": "แก้ไขผู้ผลิต",
+ "show": "แสดงผู้ผลิต"
},
"fields": {
"empty_spool_weight": "น้ำหนักม้วนพลาสติกเปล่า",
@@ -312,21 +312,21 @@
"name": "ชื่อ"
},
"fields_help": {
- "empty_spool_weight": "น้ำหนักม้วนพลาสติกเปล่าของผู้ผลิตนี้"
+ "empty_spool_weight": "น้ำหนักของม้วนพลาสติกเปล่าจากผู้ผลิตนี้"
},
"form": {
- "vendor_updated": "ผู้ผลิตนี้ถูกอัปเดตโดยผู้อื่นหลังจากที่คุณเปิดหน้านี้ การบันทึกจะเขียนทับการเปลี่ยนแปลง!"
+ "vendor_updated": "ผู้ผลิตนี้ได้รับการอัปเดตโดยผู้อื่นหลังจากที่คุณเปิดหน้านี้ การบันทึกจะเขียนทับการเปลี่ยนแปลง!"
},
"vendor": "ผู้ผลิต"
},
"help": {
"resources": {
- "vendor": "บริษัทที่ผลิตเส้นพลาสติก",
- "spool": "ม้วนพลาสติกจริงสำหรับเส้นพลาสติกเฉพาะ",
- "filament": "แบรนด์เส้นพลาสติก มีคุณสมบัติต่างๆ เช่น ชื่อ วัสดุ สี เส้นผ่านศูนย์กลาง และอื่นๆ"
+ "vendor": "บริษัทที่เป็นผู้ผลิตเส้นพลาสติก",
+ "spool": "ม้วนพลาสติกจริงของเส้นพลาสติกเฉพาะแต่ละม้วน",
+ "filament": "แบรนด์ของเส้นพลาสติก ซึ่งมีคุณสมบัติต่างๆ เช่น ชื่อ วัสดุ สี เส้นผ่านศูนย์กลาง และอื่นๆ"
},
"help": "วิธีใช้",
- "description": "วิธีใช้นี่คือเคล็ดลับบางส่วนเพื่อเริ่มต้น
Spoolman เก็บข้อมูลหลัก 3 ประเภท:
ในการเพิ่มม้วนพลาสติกใหม่ลงในฐานข้อมูล ให้เริ่มด้วยการสร้างอ็อบเจ็กต์ เส้นพลาสติก เมื่อเสร็จแล้วจึงสร้างอ็อบเจ็กต์ ม้วนพลาสติก สำหรับม้วนพลาสติกนั้น หากคุณได้ม้วนพลาสติกเพิ่มในภายหลัง ก็เพียงสร้างอ็อบเจ็กต์ม้วนพลาสติกใหม่และใช้วัตถุ เส้นพลาสติก เดิมได้
คุณสามารถสร้างอ็อบเจ็กต์ Manufacturer เพื่อเก็บข้อมูลบริษัทผู้ผลิตเส้นพลาสติกหากคุณต้องการติดตามข้อมูลนั้น
คุณสามารถเชื่อมต่อบริการ 3D printer อื่นๆ เข้ากับ Spoolman เช่น Moonraker เพื่อบันทึกปริมาณการใช้เส้นพลาสติกโดยอัตโนมัติและอัปเดตอ็อบเจ็กต์ม้วนพลาสติกของคุณ ดูเพิ่มเติมได้ที่ Spoolman README
"
+ "description": "วิธีใช้นี่คือเคล็ดลับบางส่วนเพื่อเริ่มต้นใช้งาน
Spoolman เก็บข้อมูล 3 ประเภทที่แตกต่างกัน:
ในการเพิ่มม้วนพลาสติกใหม่ลงในฐานข้อมูล ให้เริ่มด้วยการสร้างอ็อบเจ็กต์ Filament เมื่อเสร็จแล้วจึงสร้างอ็อบเจ็กต์ Spool สำหรับม้วนพลาสติกนั้น หากคุณได้ม้วนพลาสติกของเส้นพลาสติกเดิมเพิ่มในภายหลัง ก็เพียงสร้างอ็อบเจ็กต์ Spool ใหม่และใช้อ็อบเจ็กต์ Filament เดิมซ้ำได้
นอกจากนี้คุณยังสามารถสร้างอ็อบเจ็กต์ Manufacturer สำหรับบริษัทที่ผลิตเส้นพลาสติกได้หากต้องการติดตามข้อมูลนั้น
คุณสามารถเชื่อมต่อบริการเครื่องพิมพ์ 3D อื่นๆ เข้ากับ Spoolman เช่น Moonraker ซึ่งสามารถตรวจสอบการใช้เส้นพลาสติกโดยอัตโนมัติและอัปเดตอ็อบเจ็กต์ Spool ให้คุณ ดูคำแนะนำในการตั้งค่าได้ที่ Spoolman README
"
},
"dashboard": {
"title": "แดชบอร์ด"
@@ -340,17 +340,17 @@
"label": "สกุลเงิน"
},
"base_url": {
- "label": "URLพื้นฐาน",
- "tooltip": "URLพื้นฐาน ที่ใช้สำหรับสร้างฟีเจอร์ต่างๆ เช่น QR code"
+ "label": "URL พื้นฐาน",
+ "tooltip": "URL พื้นฐานที่ใช้สำหรับสร้างฟีเจอร์ต่างๆ เช่น QR code"
},
"round_prices": {
- "label": "",
- "tooltip": ""
+ "label": "ปัดเศษราคา",
+ "tooltip": "ปัดเศษราคาเป็นจำนวนเต็มที่ใกล้ที่สุด"
}
},
"extra_fields": {
"params": {
- "multi_choice": "เลือกหลายตัว",
+ "multi_choice": "เลือกได้หลายรายการ",
"key": "คีย์",
"name": "ชื่อ",
"field_type": "ประเภท",
@@ -359,7 +359,7 @@
"default_value": "ค่าเริ่มต้น",
"choices": "ตัวเลือก"
},
- "delete_confirm_description": "สิ่งนี้จะลบฟิลด์และข้อมูลที่เกี่ยวข้องทั้งหมดสำหรับเอนทิตี",
+ "delete_confirm_description": "สิ่งนี้จะลบฟิลด์และข้อมูลที่เกี่ยวข้องทั้งหมดของทุกเอนทิตี",
"field_type": {
"text": "ข้อความ",
"integer": "จำนวนเต็ม",
@@ -367,7 +367,7 @@
"float": "ทศนิยม",
"float_range": "ช่วงทศนิยม",
"datetime": "วันเวลา",
- "boolean": "บูลีน(ใส่เฉพาะ ใช่/ไม่)",
+ "boolean": "บูลีน",
"choice": "ตัวเลือก"
},
"tab": "ฟิลด์เพิ่มเติม",
@@ -377,7 +377,8 @@
"non_unique_key_error": "คีย์ต้องไม่ซ้ำ",
"key_not_changed": "โปรดเปลี่ยนคีย์เป็นอย่างอื่น",
"delete_confirm": "ลบฟิลด์ {{name}} หรือไม่?",
- "description": "คุณสามารถเพิ่มฟิลด์ที่กำหนดเองเพิ่มเติมสำหรับเอนทิตีของคุณได้ที่นี่
เมื่อเพิ่มฟิลด์แล้ว คุณจะไม่สามารถเปลี่ยนคีย์หรือประเภทของฟิลด์ได้ และสำหรับฟิลด์ประเภทตัวเลือกคุณจะไม่สามารถลบตัวเลือกหรือเปลี่ยนโหมด multi choice ได้ หากคุณลบฟิลด์ ข้อมูลของเอนทิตีทั้งหมดจะถูกลบด้วย
คีย์คือสิ่งที่โปรแกรมอื่นจะใช้เพื่ออ่าน/เขียนข้อมูล ดังนั้นหากฟิลด์ที่คุณสร้างเพื่อเชื่อมต่อกับโปรแกรมอื่น กรุณาตั้งค่าให้ถูกต้อง ค่าดีฟอลต์จะถูกนำไปใช้เฉพาะกับรายการใหม่เท่านั้น
ฟิลด์เพิ่มเติมไม่สามารถเรียงหรือกรองได้ในตาราง
"
+ "description": "คุณสามารถเพิ่มฟิลด์ที่กำหนดเองเพิ่มเติมสำหรับเอนทิตีของคุณได้ที่นี่
เมื่อเพิ่มฟิลด์แล้ว คุณจะไม่สามารถเปลี่ยนคีย์หรือประเภทของฟิลด์ได้ และสำหรับฟิลด์ประเภทตัวเลือกคุณจะไม่สามารถลบตัวเลือกหรือเปลี่ยนสถานะตัวเลือกหลายรายการได้ หากคุณลบฟิลด์ ข้อมูลที่เกี่ยวข้องของทุกเอนทิตีจะถูกลบไปด้วย
คีย์คือสิ่งที่โปรแกรมอื่นจะใช้เพื่ออ่าน/เขียนข้อมูล ดังนั้นหากฟิลด์ที่คุณสร้างต้องการเชื่อมต่อกับโปรแกรมภายนอก กรุณาตั้งค่าให้ถูกต้อง ค่าเริ่มต้นจะถูกนำไปใช้เฉพาะกับรายการใหม่เท่านั้น
ฟิลด์เพิ่มเติมสามารถแสดงและจัดเรียงในมุมมองตารางได้ ฟิลด์ประเภทตัวเลือกและบูลีนยังมีตัวเลือกการกรองที่นั่นด้วย และฟิลด์เพิ่มเติมทุกประเภทรองรับการกรองหาค่าว่าง
",
+ "choices_reorder_hint": "ลาก หรือใช้ปุ่มลูกศร เพื่อจัดเรียงตัวเลือกนี้"
}
},
"locations": {
@@ -388,11 +389,17 @@
},
"home": {
"home": "หน้าแรก",
- "welcome": "",
- "description": ""
+ "welcome": "ยินดีต้อนรับสู่ Spoolman ของคุณ!",
+ "description": "ดูเหมือนว่าคุณยังไม่ได้เพิ่มม้วนพลาสติกใดๆ ดูคำแนะนำการเริ่มต้นใช้งานได้ที่ หน้าวิธีใช้"
},
"warnWhenUnsavedChanges": "คุณแน่ใจหรือไม่ว่าต้องการออก? คุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก",
"table": {
"actions": "การดำเนินการ"
+ },
+ "theme": {
+ "label": "ธีม",
+ "system": "ตามระบบ",
+ "light": "โหมดสว่าง",
+ "dark": "โหมดมืด"
}
}
diff --git a/client_v2/locales/de/common.json b/client_v2/locales/de/common.json
index 2bd006fc..11bf6e6f 100644
--- a/client_v2/locales/de/common.json
+++ b/client_v2/locales/de/common.json
@@ -72,10 +72,12 @@
"changeFilament.failed": "Konnte das Filament nicht ändern.",
"changeFilament.importNote": "Wenn du der Änderung zustimmst, wird dieses Filament deinem Katalog hinzugefügt.",
"changeFilament.intro": "Spule #{{id}} behält ihre Nummer, Standort, Daten und Verbrauchshistorie — nur das Filament, das es hält, verändert sich.",
+ "changeFilament.newTag": "neu",
"changeFilament.next": "Ändere zu",
"changeFilament.now": "Momentan",
"changeFilament.pickBelow": "Wähle ein Filament von unten",
"changeFilament.title": "Ändere Filament",
+ "changeFilament.useExisting": "Wähle ein bestehendes Filament",
"changeFilament.weightFollows": "Diese Spule hat selbst kein volles Gewicht, deshalb wird die des Filaments verwendet: {{full}}, damit bleiben {{remaining}} nachdem {{used}} verwendet wurden.",
"changeVendor.action": "Ändern",
"changeVendor.apply": "Ändere Hersteller",
@@ -96,6 +98,7 @@
"changeVendor.now": "Momentan",
"changeVendor.pickBelow": "Wähle einen Hersteller von unten",
"changeVendor.searchPlaceholder": "Suche oder nenne einen Hersteller",
+ "changeVendor.tareFollows": "Nach der Änderung sind es {{value}}, was dem Gewicht einer leeren Spule entspricht, wenn man eine misst.",
"changeVendor.title": "Ändere Hersteller",
"changeVendor.willBeCreated": "Wird erzeugt",
"common.decrement": "Verringern",
diff --git a/client_v2/locales/lt/common.json b/client_v2/locales/lt/common.json
index e3c3db5e..953b3e5c 100644
--- a/client_v2/locales/lt/common.json
+++ b/client_v2/locales/lt/common.json
@@ -1,48 +1,48 @@
{
"add.addAndNew": "",
- "add.adding": "",
+ "add.adding": "Pridedama...",
"add.advanced": "",
- "add.advancedNote": "",
- "add.change": "",
+ "add.advancedNote": "tankis, skersmuo, temperatūros (automatiškai užpildoma pagal medžiagą)",
+ "add.change": "Keisti",
"add.count": "",
"add.createNew": "",
- "add.createNewSub": "",
- "add.dbUnavailable": "",
- "add.duplicate": "",
- "add.duplicateNote": "",
- "add.duplicateRename": "",
+ "add.createNewSub": "nėra tavo kataloge ar {{name}}",
+ "add.dbUnavailable": "{{name}} nepasiekiams",
+ "add.duplicate": "dvigubinti",
+ "add.duplicateNote": "Spesifikacijos, gamintojas ir kainos buvo per kopijuotos. Pervardinkite ir suteikite spalvą.",
+ "add.duplicateRename": "Pavadinimas nepakeistas — pervardykite, kad galėtumėte atskirti.",
"add.duplicateTitle": "",
"add.filamentNamePlaceholder": "",
- "add.fill.full": "",
+ "add.fill.full": "Pilnas",
"add.fillLevel": "",
"add.importNote": "",
"add.inCatalog": "",
- "add.locationHint": "",
- "add.locationPlaceholder": "",
- "add.manufacturerPlaceholder": "",
+ "add.locationHint": "Kur fiziškai laikote ritę – lentynoje, dėžėje ar ant spausdintuvo. Palikite lauką tuščią, jei visas jas laikote vienoje vietoje.",
+ "add.locationPlaceholder": "pvz. Lentyna A, Džiovinimo dėžė 2, Spausdintuvas 1",
+ "add.manufacturerPlaceholder": "pvz. Polymaker",
"add.nameHint": "",
"add.newFilament": "",
"add.newFilamentTitle": "",
"add.noCatalog": "",
- "add.noManufacturer": "",
- "add.pickColor": "",
- "add.searchPlaceholder": "",
- "add.searching": "",
+ "add.noManufacturer": "Trūksta gamintojo",
+ "add.pickColor": "Pasirinkite spalvą",
+ "add.searchPlaceholder": "Ieškokite savo kataloge ir {{name}}...",
+ "add.searching": "Ieškoma...",
"add.spoolWeightPreset.cardboard": "",
"add.spoolWeightPreset.plastic": "",
"add.spoolWeightPresetsLead": "",
- "add.step2": "",
- "add.typeToSearchAll": "",
- "add.typeToSearchMatches": "",
- "add.useExisting": "",
- "add.vendorHint.existing": "",
- "add.vendorHint.new": "",
- "add.vendorHint.optional": "",
- "add.yourCatalog": "",
+ "add.step2": "Žingsnis 2 · ritės duomenys",
+ "add.typeToSearchAll": "Rašykite, norėdami ieškoti tarp tūkstančių gijų",
+ "add.typeToSearchMatches": "Rašykite – atitikmenų nerasta",
+ "add.useExisting": "Naudoti esamą",
+ "add.vendorHint.existing": "Naudoti esamą gamintoją „{{name}}“",
+ "add.vendorHint.new": "Naujas gamintojas „{{name}}“ bus sukurtas",
+ "add.vendorHint.optional": "Nebūtina – palikite tuščią, jei gamintojo nėra",
+ "add.yourCatalog": "Jūsų katalogas",
"buttons.archive": "Archyvas",
"buttons.cancel": "Atšaukti",
"buttons.clear": "Išvalyti",
- "buttons.close": "",
+ "buttons.close": "Uždaryti",
"buttons.delete": "Šalinti",
"buttons.edit": "Redaguoti",
"buttons.filter": "Filtras",
@@ -51,40 +51,40 @@
"buttons.unArchive": "Išarchyvuoti",
"common.decrement": "",
"common.increment": "",
- "common.remove": "",
- "common.search": "",
- "dashboard.addFieldHint": "",
+ "common.remove": "Panaikinti",
+ "common.search": "Ieškoti",
+ "dashboard.addFieldHint": "Nustatymuose prie ritinių pridėkite teksto arba pasirinkimo lauką, kad pagal jį taip pat būtų galima grupuoti",
"dashboard.dashboard": "",
- "dashboard.deleteGroup": "",
- "dashboard.dragHint": "",
- "dashboard.dropHere": "",
+ "dashboard.deleteGroup": "Ištrinti grupę",
+ "dashboard.dragHint": "Nutempkite ritę prie kitos kortelės, kad pakeistumėte jos {{field}}, arba ant kortelės, kad pakeistumėte tvarką",
+ "dashboard.dropHere": "Čia dėkite rites",
"dashboard.emptyHelp": "",
- "dashboard.errorEmptyName": "",
- "dashboard.errorExists": "",
- "dashboard.errorRename": "",
- "dashboard.lastUsed": "",
- "dashboard.newGroup": "",
- "dashboard.newGroupName": "",
- "dashboard.reorderGroup": "",
- "dashboard.unassigned": "",
- "datetime.done": "",
- "datetime.hour": "",
- "datetime.minute": "",
- "datetime.nextMonth": "",
- "datetime.now": "",
- "datetime.pick": "",
- "datetime.prevMonth": "",
- "datetime.time": "",
+ "dashboard.errorEmptyName": "Pavadinimo laukas negali būti tuščias",
+ "dashboard.errorExists": "Tokio pavadinimo grupė jau egzistuoja",
+ "dashboard.errorRename": "Nepavyko pervardyti grupės",
+ "dashboard.lastUsed": "Paskutinį kartą naudota prieš {{time}}",
+ "dashboard.newGroup": "Nauja grupė",
+ "dashboard.newGroupName": "Nauja grupė {{n}}",
+ "dashboard.reorderGroup": "Temkite, kad perrūšiuotumėte grupes",
+ "dashboard.unassigned": "Nepriskita",
+ "datetime.done": "Baigta",
+ "datetime.hour": "Valanda",
+ "datetime.minute": "Minutė",
+ "datetime.nextMonth": "Kitas mėnuo",
+ "datetime.now": "Dabar",
+ "datetime.pick": "Pasirinkite datą ir laiką",
+ "datetime.prevMonth": "Praeitas mėnuo",
+ "datetime.time": "Laikas",
"documentTitle.dashboard.list": "",
- "documentTitle.labels.list": "",
+ "documentTitle.labels.list": "Etiketės | Spoolman",
"documentTitle.library.list": "",
"documentTitle.locations.list": "Vieta | Spoolman",
"documentTitle.settings.list": "",
- "filament.fields.addColor": "",
+ "filament.fields.addColor": "Pridėti spalvą",
"filament.fields.articleNumber": "Gaminio numeris",
"filament.fields.coaxial": "Koekstruduotas",
"filament.fields.colorHex": "Spalva",
- "filament.fields.colorType": "",
+ "filament.fields.colorType": "Spalvos tipas",
"filament.fields.comment": "Komentaras",
"filament.fields.density": "Tankis",
"filament.fields.diameter": "Skersmuo",
@@ -96,7 +96,7 @@
"filament.fields.name": "Pavadinimas",
"filament.fields.price": "Kaina",
"filament.fields.registered": "Registruota",
- "filament.fields.removeColor": "",
+ "filament.fields.removeColor": "Panaikinti spalvą",
"filament.fields.settingsBedTemp": "Pado temperatūra",
"filament.fields.settingsExtruderTemp": "Ekstruderio temperatūra",
"filament.fields.singleColor": "Viena",
@@ -104,12 +104,12 @@
"filament.fields.vendor": "Gamintojas",
"filament.fields.weight": "Svoris",
"filament.fieldsHelp.articleNumber": "Pvz. EAN, UPC, ir tt.",
- "filament.fieldsHelp.multiColorDirection": "Gijos turėti kelias spalvas dviem būdais: arba dėl koekstruzijos, kaip dviejų spalvų gijos su nuosekliomis daugiaspalvėmis spalvomis, arba dėl išilginių spalvų pokyčių, kaip gradientinės gijos, kurios keičia spalvas išilgai ritės.",
- "filament.fieldsHelp.spoolWeight": "Tuščios ritės svoris. Naudojamas išmatuotam ritės svoriui nustatyti.",
+ "filament.fieldsHelp.multiColorDirection": "Gijos gali turėti kelias spalvas dviem būdais: arba dėl koekstruzijos, kaip dviejų spalvų gijos su nuosekliomis daugiaspalvėmis spalvomis, arba dėl išilginių spalvų pokyčių, kaip gradientinės gijos, kurios keičia spalvas išilgai ritės.",
+ "filament.fieldsHelp.spoolWeight": "Tuščios ritės svoris. Naudojamas išmatuotam ritės svoriui nustatyti. Nesi tikras? Kartoninės ritės dažniausiai sveria 130 – 150 g. ir plastikinės 180 – 250 g, — tiksliam svoriui nustatyti pasverkite ritę jai pasibaigus.",
"filament.fieldsHelp.weight": "Pilnos ritės gijos svoris (grynasis svoris). Į šį skaičių neturėtų būti įtrauktas pačios ritės svoris, tik gijos svoris. Tai paprastai nurodoma ant pakuotės.",
"filament.filament": "Gijos",
"footer.documentation": "",
- "footer.reportIssue": "",
+ "footer.reportIssue": "Praneškite apie problemą",
"help.help": "Pagalba",
"inspector.addSpoolsOfThis": "",
"inspector.adjustFailed": "",
diff --git a/client_v2/locales/pl/common.json b/client_v2/locales/pl/common.json
index 425744b2..0f976a97 100644
--- a/client_v2/locales/pl/common.json
+++ b/client_v2/locales/pl/common.json
@@ -1,463 +1,570 @@
{
- "add.addAndNew": "",
- "add.adding": "",
- "add.advanced": "",
- "add.advancedNote": "",
- "add.change": "",
- "add.count": "",
- "add.createNew": "",
- "add.createNewSub": "",
- "add.dbUnavailable": "",
- "add.duplicate": "",
- "add.duplicateNote": "",
- "add.duplicateRename": "",
- "add.duplicateTitle": "",
- "add.filamentNamePlaceholder": "",
- "add.fill.full": "",
- "add.fillLevel": "",
- "add.importNote": "",
- "add.inCatalog": "",
- "add.locationHint": "",
- "add.locationPlaceholder": "",
- "add.manufacturerPlaceholder": "",
- "add.nameHint": "",
- "add.newFilament": "",
- "add.newFilamentTitle": "",
- "add.noCatalog": "",
- "add.noManufacturer": "",
- "add.pickColor": "",
- "add.searchPlaceholder": "",
- "add.searching": "",
- "add.spoolWeightPreset.cardboard": "",
- "add.spoolWeightPreset.plastic": "",
- "add.spoolWeightPresetsLead": "",
- "add.step2": "",
- "add.typeToSearchAll": "",
- "add.typeToSearchMatches": "",
- "add.useExisting": "",
- "add.vendorHint.existing": "",
- "add.vendorHint.new": "",
- "add.vendorHint.optional": "",
- "add.yourCatalog": "",
+ "add.addAndNew": "Dodaj i nowa",
+ "add.addN_few": "Dodaj {{count}} szpule",
+ "add.addN_many": "dodaj {{count}} szpul",
+ "add.addN_one": "Dodaj {{count}} szpulę",
+ "add.adding": "Dodawanie...",
+ "add.advanced": "Parametry zaawansowane",
+ "add.advancedNote": "gęstość, średnica, temperatury (uzupełniane z materiału)",
+ "add.change": "zmień",
+ "add.count": "Liczba",
+ "add.createNew": "Utwórz nowy filament",
+ "add.createNewSub": "brak w katalogu i w {{name}}",
+ "add.dbUnavailable": "{{name}} niedostępna",
+ "add.duplicate": "duplikuj",
+ "add.duplicateNote": "Parametry, producent i cena zostały skopiowane. Nadaj nową nazwę i kolor.",
+ "add.duplicateRename": "Nadal ma nazwę oryginału — zmień ją, żeby je rozróżnić.",
+ "add.duplicateTitle": "Nowy filament · kopia „{{name}}”",
+ "add.filamentNamePlaceholder": "np. PolyTerra Matte Sage",
+ "add.fill.full": "Pełna",
+ "add.fillLevel": "Poziom napełnienia",
+ "add.importNote": "Ten filament trafi do katalogu po dodaniu szpul.",
+ "add.inCatalog": "w katalogu",
+ "add.locationHint": "Gdzie fizycznie trzymasz szpulę — półka, pudełko albo drukarka. Zostaw puste, jeśli wszystkie są w jednym miejscu.",
+ "add.locationPlaceholder": "np. Półka A, Dry box 2, Drukarka 1",
+ "add.manufacturerPlaceholder": "np. Polymaker",
+ "add.nameHint": "Uwzględnij kolor — to on odróżnia filamenty od siebie.",
+ "add.newFilament": "nowy filament",
+ "add.newFilamentTitle": "Nowy filament",
+ "add.noCatalog": "Brak filamentów w katalogu",
+ "add.noManufacturer": "Brak producenta",
+ "add.pickColor": "Wybierz kolor",
+ "add.searchPlaceholder": "Szukaj w katalogu i {{name}}...",
+ "add.searching": "Szukanie...",
+ "add.section.filament": "Filament",
+ "add.section.filamentNote": "Produkt na szpuli — jeden wpis na kolor.",
+ "add.section.manufacturer": "Producent",
+ "add.section.manufacturerNote": "Kto produkuje filament. Dodajesz raz, potem używasz dla wszystkich ich filamentów.",
+ "add.section.spool": "Szpula",
+ "add.section.spoolNote": "Fizyczne szpule dodawane do magazynu.",
+ "add.section.spoolSharedNote": "Waga, waga szpuli i cena zostaną też zapisane jako domyślne dla nowego filamentu.",
+ "add.spoolWeightPreset.cardboard": "Karton {{weight}} g",
+ "add.spoolWeightPreset.plastic": "Plastik {{weight}} g",
+ "add.spoolWeightPresetsLead": "Zacznij od typowej szpuli:",
+ "add.step2": "Krok 2 · dane szpuli",
+ "add.step2New": "Krok 2 · dane filamentu i szpuli",
+ "add.summary_few": "{{count}} szpule",
+ "add.summary_many": "{{count}} szpul",
+ "add.summary_one": "{{count}} szpula",
+ "add.typeToSearchAll": "Wpisz, aby przeszukać tysiące filamentów",
+ "add.typeToSearchMatches": "Wpisz, aby szukać — brak wyników",
+ "add.useExisting": "użyj istniejącego",
+ "add.vendorHint.existing": "Używany istniejący producent „{{name}}”",
+ "add.vendorHint.new": "Zostanie utworzony nowy producent „{{name}}”",
+ "add.vendorHint.optional": "Opcjonalnie — zostaw puste, jeśli bez producenta",
+ "add.weightPresets": "Typowe rozmiary rolek",
+ "add.yourCatalog": "Twój katalog",
+ "buttons.apply": "Zastosuj",
"buttons.archive": "Archiwizuj",
"buttons.cancel": "Anuluj",
"buttons.clear": "Wyczyść",
- "buttons.close": "",
+ "buttons.close": "Zamknij",
"buttons.delete": "Usuń",
"buttons.edit": "Edytuj",
"buttons.filter": "Filtruj",
"buttons.save": "Zapisz",
"buttons.showArchived": "Pokaż zarchiwizowane",
- "buttons.unArchive": "Odarchiwizuj",
- "common.decrement": "",
- "common.increment": "",
- "common.remove": "",
- "common.search": "",
- "dashboard.addFieldHint": "",
- "dashboard.dashboard": "",
- "dashboard.deleteGroup": "",
- "dashboard.dragHint": "",
- "dashboard.dropHere": "",
- "dashboard.emptyHelp": "",
- "dashboard.errorEmptyName": "",
- "dashboard.errorExists": "",
- "dashboard.errorRename": "",
- "dashboard.lastUsed": "",
- "dashboard.newGroup": "",
- "dashboard.newGroupName": "",
- "dashboard.reorderGroup": "",
- "dashboard.unassigned": "",
- "datetime.done": "",
- "datetime.hour": "",
- "datetime.minute": "",
- "datetime.nextMonth": "",
- "datetime.now": "",
- "datetime.pick": "",
- "datetime.prevMonth": "",
- "datetime.time": "",
- "documentTitle.dashboard.list": "",
- "documentTitle.labels.list": "",
- "documentTitle.library.list": "",
+ "buttons.unArchive": "Przywróć",
+ "changeFilament.action": "Zmień",
+ "changeFilament.adoptWeight": "Ustaw pełną wagę tej szpuli na {{full}}",
+ "changeFilament.adoptWeightHelp": "Zapisana jest jako {{current}}, z filamentu, który była wcześniej. Zużyta waga ({{used}}) zostaje w obu przypadkach, zostaje {{remaining}}.",
+ "changeFilament.apply": "Zmień filament",
+ "changeFilament.applying": "Zmienianie...",
+ "changeFilament.current": "obecny",
+ "changeFilament.done": "Filament zmieniony.",
+ "changeFilament.failed": "Nie udało się zmienić filamentu.",
+ "changeFilament.importNote": "Ten filament trafi do katalogu po zatwierdzeniu zmiany.",
+ "changeFilament.intro": "Szpula nr {{id}} zachowuje numer, lokalizację, daty i historię zużycia — zmienia się tylko filament.",
+ "changeFilament.newTag": "nowy",
+ "changeFilament.next": "Zmień na",
+ "changeFilament.now": "Obecnie",
+ "changeFilament.pickBelow": "Wybierz filament poniżej",
+ "changeFilament.title": "Zmień filament",
+ "changeFilament.useExisting": "Wybierz istniejący filament",
+ "changeFilament.weightFollows": "Ta szpula nie ma własnej pełnej wagi, więc przejmuje ją z nowego filamentu: {{full}}, po już zużytych {{used}} zostaje {{remaining}}.",
+ "changeVendor.action": "Zmień",
+ "changeVendor.apply": "Zmień producenta",
+ "changeVendor.applying": "Zmienianie...",
+ "changeVendor.clearHint": "Zostaw ten filament bez producenta",
+ "changeVendor.create": "Utwórz „{{name}}”",
+ "changeVendor.createHint": "Nie ma go jeszcze na liście producentów — zostanie dodany",
+ "changeVendor.current": "obecny",
+ "changeVendor.done": "Producent zmieniony.",
+ "changeVendor.emptySpool": "Pusta szpula {{value}}",
+ "changeVendor.failed": "Nie udało się zmienić producenta.",
+ "changeVendor.intro": "„{{name}}” zachowuje szpule, parametry i historię — zmienia się tylko producent, pod którym jest zapisany.",
+ "changeVendor.next": "Zmień na",
+ "changeVendor.noEmptySpool": "Brak wagi pustej szpuli",
+ "changeVendor.noMatches": "Brak pasujących producentów",
+ "changeVendor.none": "Brak producentów",
+ "changeVendor.noneNote": "Bez marki",
+ "changeVendor.now": "Obecnie",
+ "changeVendor.pickBelow": "Wybierz producenta poniżej",
+ "changeVendor.searchPlaceholder": "Szukaj lub wpisz producenta",
+ "changeVendor.tareFollows": "Ten filament nie ma własnej wagi pustej szpuli, więc bierze ją od producenta. Po zmianie będzie to {{value}} — tyle waży pusta szpula przy ważeniu.",
+ "changeVendor.tareGone": "Ten filament nie ma własnej wagi pustej szpuli i bierze {{current}} od producenta. Po zmianie nie będzie czego przejąć, dopóki nie ustawisz jej przy filamencie.",
+ "changeVendor.title": "Zmień producenta",
+ "changeVendor.willBeCreated": "Zostanie utworzony",
+ "common.decrement": "Zmniejsz",
+ "common.increment": "Zwiększ",
+ "common.remove": "Usuń",
+ "common.search": "Szukaj",
+ "dashboard.addFieldHint": "Dodaj pole tekstowe lub wyboru do szpul w Ustawieniach, aby też po nim grupować",
+ "dashboard.dashboard": "Pulpit",
+ "dashboard.deleteGroup": "Usuń grupę",
+ "dashboard.dragHint": "Przeciągnij szpulę na inną kartę, aby zmienić {{field}}, albo w obrębie karty, aby zmienić kolejność",
+ "dashboard.dropHere": "upuść szpule tutaj",
+ "dashboard.emptyHelp": "Ta strona grupuje szpule według wybranego pola — dodaj szpule, aby zacząć!",
+ "dashboard.errorEmptyName": "Nazwa nie może być pusta",
+ "dashboard.errorExists": "Grupa o tej nazwie już istnieje",
+ "dashboard.errorRename": "Nie udało się zmienić nazwy grupy",
+ "dashboard.lastUsed": "Ostatnio użyta {{time}} temu",
+ "dashboard.newGroup": "Nowa grupa",
+ "dashboard.newGroupName": "Nowa grupa {{n}}",
+ "dashboard.reorderGroup": "Przeciągnij, aby zmienić kolejność grupy",
+ "dashboard.spoolCount_few": "{{count}} szpule",
+ "dashboard.spoolCount_many": "{{count}} szpul",
+ "dashboard.spoolCount_one": "{{count}} szpula",
+ "dashboard.unassigned": "Nieprzypisane",
+ "datetime.done": "Gotowe",
+ "datetime.hour": "Godzina",
+ "datetime.minute": "Minuta",
+ "datetime.nextMonth": "Następny miesiąc",
+ "datetime.now": "Teraz",
+ "datetime.pick": "Wybierz datę i godzinę",
+ "datetime.prevMonth": "Poprzedni miesiąc",
+ "datetime.time": "Czas",
+ "documentTitle.dashboard.list": "Pulpit | Spoolman",
+ "documentTitle.labels.list": "Etykiety | Spoolman",
+ "documentTitle.library.list": "Biblioteka | Spoolman",
"documentTitle.locations.list": "Lokalizacje | Spoolman",
- "documentTitle.settings.list": "",
- "filament.fields.addColor": "",
+ "documentTitle.settings.list": "Ustawienia | Spoolman",
+ "filament.fields.addColor": "Dodaj kolor",
"filament.fields.articleNumber": "Numer artykułu",
- "filament.fields.coaxial": "Koekstrudowany",
+ "filament.fields.coaxial": "Współwytłaczany",
"filament.fields.colorHex": "Kolor",
- "filament.fields.colorType": "",
+ "filament.fields.colorType": "Typ koloru",
"filament.fields.comment": "Komentarz",
"filament.fields.density": "Gęstość",
"filament.fields.diameter": "Średnica",
- "filament.fields.externalId": "Zewnętrzne ID",
+ "filament.fields.externalId": "ID zewnętrzne",
"filament.fields.id": "ID",
"filament.fields.longitudinal": "Wzdłużny",
"filament.fields.material": "Materiał",
"filament.fields.multiColor": "Wielo",
"filament.fields.name": "Nazwa",
+ "filament.fields.opacity": "Krycie",
"filament.fields.price": "Cena",
"filament.fields.registered": "Zarejestrowano",
- "filament.fields.removeColor": "",
- "filament.fields.settingsBedTemp": "Temperatura stołu",
- "filament.fields.settingsExtruderTemp": "Temperatura ekstrudera",
- "filament.fields.singleColor": "Pojedynczy",
+ "filament.fields.removeColor": "Usuń kolor",
+ "filament.fields.settingsBedTemp": "Temp. stołu",
+ "filament.fields.settingsExtruderTemp": "Temp. extrudera",
+ "filament.fields.singleColor": "Jednolity",
"filament.fields.spoolWeight": "Waga szpuli",
"filament.fields.vendor": "Producent",
"filament.fields.weight": "Waga",
- "filament.fieldsHelp.articleNumber": "Np. EAN, UPC itp.",
- "filament.fieldsHelp.multiColorDirection": "Filamenty mogą mieć wiele kolorów na dwa sposoby: Kolory mogą się ciągnąć równolegle na całej długości filamentu lub kolory filamentu mogą się zmieniać na długości filamentu.",
- "filament.fieldsHelp.spoolWeight": "Waga pustej szpuli. Używana do określenia ciężaru szpuli.",
- "filament.fieldsHelp.weight": "Waga filamentu na pełnej szpuli (waga netto). Nie powinno to obejmować wagi samej szpuli, a jedynie filamentu. Jest to zwykle napisane na opakowaniu.",
+ "filament.fieldsHelp.articleNumber": "Np. EAN, UPC itd.",
+ "filament.fieldsHelp.multiColorDirection": "Filament może mieć kilka kolorów na dwa sposoby: przez współwytłaczanie, jak dwukolorowe filamenty o stałym układzie barw, albo przez zmianę wzdłużną, jak filamenty gradientowe, których kolor przechodzi wzdłuż szpuli.",
+ "filament.fieldsHelp.spoolWeight": "Waga pustej szpuli. Służy do wyliczenia zmierzonej wagi szpuli. Nie wiesz ile? Kartonowe zwykle ważą 130–150 g, plastikowe 180–250 g — dokładną wartość dostaniesz, ważąc szpulę po zużyciu filamentu.",
+ "filament.fieldsHelp.weight": "Waga filamentu na pełnej szpuli (masa netto). Nie wliczaj samej szpuli, tylko filament. To zwykle to, co jest napisane na opakowaniu.",
"filament.filament": "Filamenty",
- "footer.documentation": "",
- "footer.reportIssue": "",
+ "footer.documentation": "Dokumentacja",
+ "footer.reportIssue": "Zgłoś problem",
"help.help": "Pomoc",
- "inspector.addSpoolsOfThis": "",
- "inspector.adjustFailed": "",
- "inspector.adjustHelp": "",
- "inspector.adjustWeight": "",
- "inspector.apply": "",
- "inspector.applying": "",
- "inspector.colorHex": "",
- "inspector.consumeAmount": "",
- "inspector.delete.deleting": "",
- "inspector.delete.errorGone": "",
- "inspector.delete.errorSpoolsExist": "",
- "inspector.delete.errorUnknown": "",
- "inspector.delete.filament": "",
- "inspector.delete.filamentBlockedHint": "",
- "inspector.delete.filamentBlockedTitle": "",
- "inspector.delete.filamentBody": "",
- "inspector.delete.filamentDone": "",
- "inspector.delete.filamentTitle": "",
- "inspector.delete.spool": "",
- "inspector.delete.spoolBody": "",
- "inspector.delete.spoolDone": "",
- "inspector.delete.spoolRemaining": "",
- "inspector.delete.spoolTitle": "",
- "inspector.delete.vendor": "",
- "inspector.delete.vendorBody": "",
- "inspector.delete.vendorDone": "",
- "inspector.delete.vendorTitle": "",
- "inspector.duplicateFilament": "",
- "inspector.empty": "",
- "inspector.enterValidLength": "",
- "inspector.enterValidWeight": "",
- "inspector.loading": "",
- "inspector.manageExtraFields": "",
- "inspector.measuredHelp": "",
- "inspector.multi": "",
- "inspector.newGross": "",
- "inspector.noExtraFields": "",
- "inspector.notFound": "",
- "inspector.ofRemaining": "",
- "inspector.openFilament": "",
- "inspector.openLink": "",
- "inspector.openManufacturer": "",
- "inspector.specs": "",
- "inspector.spoolsCount": "",
- "inspector.spoolsTotalRemaining": "",
- "inspector.used": "",
- "kofi": "Daj napiwek na Ko-fi",
- "labels.addHead": "",
- "labels.addQr": "",
- "labels.addRect": "",
- "labels.addSwatch": "",
- "labels.addText": "",
- "labels.align": "",
- "labels.alignCenter": "",
- "labels.alignLeft": "",
- "labels.alignRight": "",
- "labels.blank": "",
- "labels.bold": "",
- "labels.canvasHint": "",
- "labels.centerLogo": "",
- "labels.chooseField": "",
- "labels.clearFill": "",
- "labels.copies": "",
- "labels.cornerRadiusMm": "",
- "labels.createFirst": "",
- "labels.cutGuides": "",
- "labels.deleteConfirm": "",
- "labels.deleteElement": "",
- "labels.designName": "",
- "labels.designerDesc": "",
- "labels.designerTitle": "",
- "labels.dpi": "",
- "labels.dpiHint": "",
- "labels.duplicate": "",
- "labels.fields.bedTemp": "",
- "labels.fields.diameterMm": "",
- "labels.fields.groupVendor": "",
- "labels.fields.initialG": "",
- "labels.fields.netWeightG": "",
- "labels.fields.remainingG": "",
- "labels.fill": "",
- "labels.fitWidth": "",
- "labels.fitWidthHint": "",
- "labels.fontMm": "",
- "labels.gridInfo": "",
- "labels.hMm": "",
- "labels.heightMm": "",
- "labels.hintNowrap": "",
- "labels.hintSwatch": "",
- "labels.hintWrap": "",
+ "inspector.addSpoolsOfThis": "Dodaj szpule tego filamentu",
+ "inspector.adjustFailed": "Nie udało się skorygować wagi.",
+ "inspector.adjustHelp": "Wartość dodatnia zużywa filament, ujemna dodaje go z powrotem.",
+ "inspector.adjustWeight": "Skoryguj wagę",
+ "inspector.apply": "Zastosuj",
+ "inspector.applying": "Stosowanie...",
+ "inspector.colorHex": "Kolor hex",
+ "inspector.consumeAmount": "Ilość do zużycia:",
+ "inspector.defaultFrom.filament": "{{value}} · domyślne filamentu",
+ "inspector.defaultFrom.manufacturer": "{{value}} · domyślne producenta",
+ "inspector.delete.deleting": "Usuwanie...",
+ "inspector.delete.errorGone": "Ten element był już usunięty.",
+ "inspector.delete.errorSpoolsExist": "Nie można usunąć tego filamentu — nadal używają go szpule.",
+ "inspector.delete.errorUnknown": "Usuwanie nie powiodło się. Szczegóły w logach serwera.",
+ "inspector.delete.filament": "Usuń filament",
+ "inspector.delete.filamentBlockedHint": "Najpierw usuń te szpule. Sama archiwizacja nie wystarczy.",
+ "inspector.delete.filamentBlockedTitle": "Tego filamentu nie można usunąć",
+ "inspector.delete.filamentBlocked_few": "{{count}} szpule nadal używają „{{name}}”, w tym zarchiwizowane.",
+ "inspector.delete.filamentBlocked_many": "{{count}} szpul nadal używa „{{name}}”, w tym zarchiwizowane.",
+ "inspector.delete.filamentBlocked_one": "{{count}} szpula nadal używa „{{name}}”, w tym zarchiwizowane.",
+ "inspector.delete.filamentBody": "„{{name}}” zostanie usunięty z katalogu. Tej operacji nie można cofnąć.",
+ "inspector.delete.filamentDone": "Filament usunięty.",
+ "inspector.delete.filamentTitle": "Usunąć ten filament?",
+ "inspector.delete.spool": "Usuń szpulę",
+ "inspector.delete.spoolBody": "Szpula nr {{id}} „{{name}}” zostanie usunięta wraz z historią zużycia. Tej operacji nie można cofnąć.",
+ "inspector.delete.spoolDone": "Szpula usunięta.",
+ "inspector.delete.spoolRemaining": "Zostało jeszcze {{weight}} filamentu. Zarchiwizuj ją, jeśli chcesz ją tylko odłożyć na bok.",
+ "inspector.delete.spoolTitle": "Usunąć tę szpulę?",
+ "inspector.delete.vendor": "Usuń producenta",
+ "inspector.delete.vendorBody": "„{{name}}” zostanie usunięty. Tej operacji nie można cofnąć.",
+ "inspector.delete.vendorDone": "Producent usunięty.",
+ "inspector.delete.vendorOrphans_few": "{{count}} filamenty zostały zachowane, ale nie mają już producenta.",
+ "inspector.delete.vendorOrphans_many": "{{count}} filamentów zostało zachowanych, ale nie mają już producenta.",
+ "inspector.delete.vendorOrphans_one": "{{count}} filament został zachowany, ale nie ma już producenta.",
+ "inspector.delete.vendorTitle": "Usunąć tego producenta?",
+ "inspector.duplicateFilament": "Duplikuj",
+ "inspector.empty": "Wybierz szpulę, filament albo producenta z listy, aby zobaczyć szczegóły.",
+ "inspector.enterValidLength": "Podaj poprawną długość.",
+ "inspector.enterValidWeight": "Podaj poprawną wagę.",
+ "inspector.loading": "Wczytywanie...",
+ "inspector.manageExtraFields": "Zarządzaj polami",
+ "inspector.measuredHelp": "Całkowita waga szpuli + pozostałego filamentu, odczytana z wagi.",
+ "inspector.multi": "wielo ×{{count}}",
+ "inspector.newGross": "Nowa waga brutto:",
+ "inspector.noExtraFields": "Na razie brak — dodaj własne pola na to, czego Spoolman nie śledzi.",
+ "inspector.notFound": "Nie znaleziono tego elementu. Mógł zostać usunięty.",
+ "inspector.ofRemaining": "z {{weight}} pozostało · {{length}} m",
+ "inspector.openFilament": "Otwórz filament",
+ "inspector.openLink": "Otwórz {{url}} w nowej karcie",
+ "inspector.openManufacturer": "Otwórz producenta",
+ "inspector.override.byFilament": "Nadpisane przez ten filament · {{value}}",
+ "inspector.override.bySpool": "Nadpisane przez tę szpulę · {{value}}",
+ "inspector.override.overridesFilament": "Nadpisuje filament · {{value}}",
+ "inspector.override.overridesManufacturer": "Nadpisuje producenta · {{value}}",
+ "inspector.specs": "Parametry — edycja w miejscu",
+ "inspector.spoolsCount": "Szpule · {{count}}",
+ "inspector.spoolsTotalRemaining": "{{weight}} łącznie",
+ "inspector.used": "zużyto",
+ "inspector.vendorSub_few": "{{count}} filamenty",
+ "inspector.vendorSub_many": "{{count}} filamentów",
+ "inspector.vendorSub_one": "{{count}} filament",
+ "kofi": "Wesprzyj mnie na Ko-fi",
+ "labels.addHead": "Dodaj",
+ "labels.addQr": "Kod QR",
+ "labels.addRect": "Prostokąt",
+ "labels.addSwatch": "Próbka koloru",
+ "labels.addText": "Tekst / pole",
+ "labels.align": "Wyrównanie",
+ "labels.alignCenter": "Do środka",
+ "labels.alignLeft": "Do lewej",
+ "labels.alignRight": "Do prawej",
+ "labels.blank": "Nie masz jeszcze żadnych projektów etykiet.",
+ "labels.bold": "Pogrubienie",
+ "labels.canvasHint": "Przeciągnij, aby przesunąć · kliknij, aby zaznaczyć · uchwyty zmieniają rozmiar.",
+ "labels.centerLogo": "Wyśrodkuj logo Spoolmana",
+ "labels.chooseField": "Wybierz pole...",
+ "labels.clearFill": "Usuń wypełnienie (sam obrys)",
+ "labels.copies": "Kopie",
+ "labels.cornerRadiusMm": "Promień narożnika",
+ "labels.createFirst": "Utwórz pierwszą etykietę",
+ "labels.cutGuides": "Linie cięcia",
+ "labels.deleteConfirm": "Usunąć ten projekt etykiety?",
+ "labels.deleteElement": "Usuń element",
+ "labels.designName": "Nazwa projektu",
+ "labels.designerDesc": "Projektuj etykiety z kodem QR z dowolnym polem szpuli, filamentu albo producenta, a potem drukuj je na arkuszach albo drukarce etykiet. Projekty są zapisywane na serwerze.",
+ "labels.designerTitle": "Projektant etykiet",
+ "labels.dpi": "Rozdzielczość",
+ "labels.dpiHint": "Dopasuj do drukarki, żeby małe etykiety były ostre: 203 dpi dla większości termicznych drukarek etykiet, 300 lub więcej dla laserowych i atramentowych.",
+ "labels.duplicate": "Duplikuj",
+ "labels.exportDescAml": "Zapisuje jeden plik etykiety .aml na każdą wybraną etykietę, każda {{w}}×{{h}} mm. Otwiera się w aplikacjach LPAPI dołączanych do większości termicznych drukarek etykiet, które odczytują rozmiar fizyczny z pliku.",
+ "labels.exportDescPng": "Zapisuje jeden obraz PNG na każdą wybraną etykietę, każda {{w}}×{{h}} mm.",
+ "labels.exportFormat": "Format pliku",
+ "labels.exportFormatOptions.aml": "Plik etykiety AML",
+ "labels.exportFormatOptions.png": "Obraz PNG",
+ "labels.fields.bedTemp": "Temp. stołu",
+ "labels.fields.diameterMm": "Średnica (mm)",
+ "labels.fields.groupVendor": "Producent",
+ "labels.fields.initialG": "Początkowa (g)",
+ "labels.fields.netWeightG": "Waga netto (g)",
+ "labels.fields.remainingG": "Pozostało (g)",
+ "labels.filamentsSelected_few": "Wybrano {{count}} filamenty",
+ "labels.filamentsSelected_many": "Wybrano {{count}} filamentów",
+ "labels.filamentsSelected_one": "Wybrano {{count}} filament",
+ "labels.fill": "Wypełnienie",
+ "labels.fitWidth": "Dopasuj szerokość do kolumn",
+ "labels.fitWidthHint": "Ustaw szerokość etykiety tak, aby wybrana liczba kolumn wypełniła stronę.",
+ "labels.fontMm": "Czcionka",
+ "labels.gridInfo": "{{cols}} × {{rows}} = {{perPage}} etykiet / strona",
+ "labels.hMm": "W",
+ "labels.heightMm": "Wysokość",
+ "labels.hintNowrap": "Tekst zostaje w jednej linii; wszystko poza szerokością jest obcinane.",
+ "labels.hintSwatch": "Wypełniane kolorem(-ami) filamentu szpuli przy druku.",
+ "labels.hintWrap": "Owiń pole, aby ukryć je, gdy jest puste:",
"labels.imageDesc": "",
- "labels.imageZipNote": "",
- "labels.insertField": "",
- "labels.kind.qr": "",
- "labels.kind.rect": "",
- "labels.kind.swatch": "",
- "labels.kind.text": "",
- "labels.labelSize": "",
- "labels.labelType": "",
- "labels.layout": "",
- "labels.modeImage": "",
- "labels.modeLabel": "",
- "labels.modeSheet": "",
- "labels.new": "",
- "labels.newText": "",
- "labels.noDesignsOption": "",
- "labels.noFilaments": "",
- "labels.noSpools": "",
- "labels.onePerLabel": "",
- "labels.preparing": "",
- "labels.preview": "",
- "labels.previewWith": "",
- "labels.radiusMm": "",
- "labels.sampleData": "",
- "labels.saved": "",
- "labels.saving": "",
- "labels.searchFilaments": "",
- "labels.searchSpools": "",
- "labels.selectAllShort": "",
- "labels.selectAtLeastOne": "",
- "labels.selectAtLeastOneFilament": "",
- "labels.selectDesign": "",
- "labels.selectElement": "",
- "labels.selectNoneShort": "",
- "labels.selectRecentHint": "",
- "labels.selectRecentShort": "",
- "labels.showingFilament": "",
- "labels.showingReal": "",
- "labels.showingSpool": "",
- "labels.showingTags": "",
- "labels.sizeMm": "",
- "labels.skipHint": "",
- "labels.sortHint": "",
- "labels.sortId": "",
- "labels.sortNewest": "",
- "labels.stroke": "",
- "labels.strokeMm": "",
- "labels.tabDesign": "",
- "labels.tabPrint": "",
- "labels.textTemplate": "",
- "labels.typeFilament": "",
- "labels.typeHint": "",
- "labels.typeSpool": "",
- "labels.unknownFilament": "",
- "labels.wMm": "",
- "labels.widthMm": "",
- "labels.wrapText": "",
- "labels.xMm": "",
- "labels.yMm": "",
- "library.apiError": "",
- "library.collapseGroup": "",
- "library.emptyBody": "",
- "library.emptyFiltered": "",
- "library.emptyTitle": "",
- "library.expandGroup": "",
- "library.filterBy": "",
- "library.groupBy": "",
- "library.groupNone": "",
- "library.nUnused": "",
- "library.noLocation": "",
- "library.noValues": "",
- "library.openGroup": "",
- "library.openManufacturer": "",
- "library.section.extra": "",
- "library.section.filament": "",
- "library.section.spool": "",
- "library.section.vendor": "",
- "library.showMore": "",
- "library.sort.nozzle": "",
- "library.sortBy": "",
- "library.unassigned": "",
- "library.unitGroups": "",
- "library.unitSpools": "",
- "library.unused": "",
- "library.unusedGroup": "",
- "library.unusedGroupMixed": "",
- "library.unusedSub": "",
- "library.unusedSubMixed": "",
- "library.used": "",
- "library.usedAgo": "",
+ "labels.imageZipNote": "Powyżej {{threshold}} etykiet pliki są pakowane do jednego ZIP-a.",
+ "labels.insertField": "Wstaw pole",
+ "labels.kind.qr": "Kod QR",
+ "labels.kind.rect": "Prostokąt",
+ "labels.kind.swatch": "Próbka",
+ "labels.kind.text": "Tekst",
+ "labels.labelSize": "Rozmiar etykiety",
+ "labels.labelType": "Typ etykiety",
+ "labels.layout": "Układ",
+ "labels.modeImage": "Pliki",
+ "labels.modeLabel": "Drukarka etykiet",
+ "labels.modeSheet": "Arkusz (siatka)",
+ "labels.new": "Nowy",
+ "labels.newText": "Nowy tekst",
+ "labels.noDesignsOption": "Brak projektów",
+ "labels.noFilaments": "Brak filamentów.",
+ "labels.noSpools": "Brak szpul.",
+ "labels.onePerLabel": "Jedna strona {{w}}×{{h}} mm na etykietę.",
+ "labels.preparing": "Przygotowywanie...",
+ "labels.preview": "Podgląd",
+ "labels.previewWith": "Podgląd z",
+ "labels.printN_few": "Drukuj {{count}} etykiety",
+ "labels.printN_many": "Drukuj {{count}} etykiet",
+ "labels.printN_one": "Drukuj {{count}} etykietę",
+ "labels.radiusMm": "Promień",
+ "labels.sampleData": "Dane przykładowe",
+ "labels.saveAsFormat": "Zapisz jako {{format}}",
+ "labels.saved": "Zapisano",
+ "labels.saving": "Zapisywanie...",
+ "labels.searchFilaments": "Szukaj filamentów...",
+ "labels.searchSpools": "Szukaj szpul...",
+ "labels.selectAllShort": "Wszystkie",
+ "labels.selectAtLeastOne": "Wybierz przynajmniej jedną szpulę.",
+ "labels.selectAtLeastOneFilament": "Wybierz przynajmniej jeden filament.",
+ "labels.selectDesign": "Wybierz projekt etykiety",
+ "labels.selectElement": "Zaznacz element do edycji albo dodaj nowy z palety.",
+ "labels.selectNoneShort": "Żadne",
+ "labels.selectRecentHint": "Zaznacz szpule dodane w ciągu ostatnich 24 godzin",
+ "labels.selectRecentShort": "Ostatnie ({{count}})",
+ "labels.showingFilament": "Pokazywany filament nr {{id}}",
+ "labels.showingReal": "Pokazywane rzeczywiste dane szpuli.",
+ "labels.showingSpool": "Pokazywana szpula nr {{id}}",
+ "labels.showingTags": "Pola widać jako tagi, dopóki nie wybierzesz szpuli powyżej.",
+ "labels.sizeMm": "Rozmiar",
+ "labels.skipHint": "Pomiń pozycje zostawia tyle pustych komórek przed pierwszą etykietą, żebyś mógł użyć częściowo zużytego arkusza: policz już oderwane etykiety, od lewej do prawej od góry.",
+ "labels.sortHint": "Sortuj szpule",
+ "labels.sortId": "#",
+ "labels.sortNewest": "Najnowsze",
+ "labels.stroke": "Obrys",
+ "labels.strokeMm": "Obrys",
+ "labels.tabDesign": "Projekt",
+ "labels.tabPrint": "Druk",
+ "labels.textTemplate": "Tekst / szablon",
+ "labels.typeFilament": "Filament",
+ "labels.typeHint": "Etykiety filamentu pomijają pola tylko szpuli, a ich kod QR prowadzi do filamentu, nie do szpuli.",
+ "labels.typeSpool": "Szpula",
+ "labels.unknownFilament": "Nieznany filament",
+ "labels.wMm": "S",
+ "labels.widthMm": "Szerokość",
+ "labels.wrapText": "Zawijaj tekst",
+ "labels.xMm": "X",
+ "labels.yMm": "Y",
+ "library.apiError": "Nie udało się połączyć z API Spoolmana. Czy backend działa?",
+ "library.collapseGroup": "Ukryj te szpule",
+ "library.dateFilter.ago": "{{span}} temu",
+ "library.dateFilter.between": "{{from}} – {{to}}",
+ "library.dateFilter.customRange": "Własny zakres",
+ "library.dateFilter.from": "Od",
+ "library.dateFilter.last": "Ostatnie {{span}}",
+ "library.dateFilter.never": "Nigdy",
+ "library.dateFilter.olderThan": "Starsze niż {{span}}",
+ "library.dateFilter.since": "Od {{date}}",
+ "library.dateFilter.to": "Do (opcjonalnie)",
+ "library.dateFilter.until": "Do {{date}}",
+ "library.emptyBody": "Dodaj pierwszą szpulę, aby zacząć śledzić filament.",
+ "library.emptyFiltered": "Żadne {{unit}} nie pasują do bieżących filtrów.",
+ "library.emptyTitle": "Brak szpul",
+ "library.expandGroup": "Pokaż te szpule",
+ "library.filterBy": "Filtruj według",
+ "library.groupBy": "Grupuj",
+ "library.groupNone": "Brak (płaska lista)",
+ "library.groupSpools_few": "{{count}} szpule",
+ "library.groupSpools_many": "{{count}} szpul",
+ "library.groupSpools_one": "{{count}} szpula",
+ "library.nUnused": "×{{count}} nieużywane",
+ "library.noLocation": "brak lokalizacji",
+ "library.noValues": "Brak wartości",
+ "library.openGroup": "Otwórz {{name}}",
+ "library.openManufacturer": "Otwórz producenta {{name}}",
+ "library.resizeList": "Zmień szerokość listy (podwójne kliknięcie resetuje)",
+ "library.section.extra": "Dodatkowe pola",
+ "library.section.filament": "Filament",
+ "library.section.spool": "Szpula",
+ "library.section.vendor": "Producent",
+ "library.showMore": "pokaż jeszcze {{count}}",
+ "library.sort.nozzle": "Temp. dyszy",
+ "library.sortBy": "Sortuj",
+ "library.unassigned": "nieprzypisane",
+ "library.unitGroups": "grupy",
+ "library.unitSpools": "szpule",
+ "library.unused": "nieużywane",
+ "library.unusedGroup": "{{count}} nieużywanych · po {{weight}} g",
+ "library.unusedGroupMixed": "{{count}} nieużywanych",
+ "library.unusedSub": "po {{weight}} g · {{location}}",
+ "library.unusedSubMixed": "{{location}}",
+ "library.used": "używane",
+ "library.usedAgo": "użyta {{time}} temu",
"loading": "Wczytywanie",
"locations.locations": "Lokalizacje",
"locations.newLocation": "Nowa lokalizacja",
"locations.noLocation": "Brak lokalizacji",
"locations.noLocationsHelp": "Ta strona pozwala uporządkować szpule w lokalizacjach, dodaj kilka szpul aby rozpocząć!",
- "nav.labels": "",
- "nav.library": "",
+ "nav.labels": "Etykiety",
+ "nav.library": "Biblioteka",
"no": "Nie",
"notifications.error": "Błąd (kod statusu: {{statusCode}})",
- "notifications.saveSuccessful": "Pomyślnie zapisano!",
- "pagination.empty": "",
- "pagination.next": "",
- "pagination.pageSize": "",
- "pagination.perPage": "",
- "pagination.prev": "",
- "pagination.range": "",
+ "notifications.saveSuccessful": "Zapisano pomyślnie!",
+ "pagination.empty": "Brak {{unit}}",
+ "pagination.next": "Następna strona",
+ "pagination.pageSize": "Rozmiar strony",
+ "pagination.perPage": "{{size}} / stronę",
+ "pagination.prev": "Poprzednia strona",
+ "pagination.range": "{{from}}–{{to}} z {{total}} {{unit}}",
"printing.generic.columns": "Kolumny",
- "printing.generic.customSize": "Niestandardowy",
- "printing.generic.description": "Dostosuj poniższe ustawienia, aby uzyskać pożądany układ wydruku. Należy pamiętać, że drukarki i system operacyjny mogą stosować własne marginesy i skalowanie, więc może być konieczne wykonanie kilku prób i błędów, zanim wszystko będzie prawidłowe. Przed wydrukowaniem etykiet przetestuj je na zwykłym papierze.",
+ "printing.generic.customSize": "Własny",
+ "printing.generic.description": "Dopasuj ustawienia poniżej, aby uzyskać właściwy układ wydruku. Pamiętaj, że drukarka i system mogą dodać własne marginesy i skalowanie, więc zwykle trzeba trochę poeksperymentować. Przetestuj na zwykłej kartce, zanim zujesz właściwe etykiety.",
"printing.generic.dimensions": "Wymiary",
- "printing.generic.gridTooWide": "",
- "printing.generic.helpMargin": "Marginesy powinny być skonfigurowane tak, aby pasowały do papieru etykietowego i drukarki, ich zmiana wpłynie na rozmiar całej siatki.",
- "printing.generic.helpPrinterMargin": "Bezpieczna strefa powinna być ustawiona tak, aby znajdowała się jak najbliżej krawędzi papieru, na którym drukarka może drukować, zmiana tych ustawień nie wpłynie na całą siatkę.",
- "printing.generic.horizontalSpacing": "Poziomy odstęp",
- "printing.generic.itemCopies": "Skopiuj element",
- "printing.generic.marginBottom": "Dolny margines",
- "printing.generic.marginLeft": "Lewy margines",
- "printing.generic.marginRight": "Prawy margines",
- "printing.generic.marginTop": "Górny margines",
+ "printing.generic.gridTooWide": "Etykiety są szersze niż strona. Zmniejsz liczbę kolumn, odstępy albo marginesy.",
+ "printing.generic.helpMargin": "Marginesy powinny odpowiadać papierowi etykiet i drukarce — ich zmiana wpływa na rozmiar całej siatki.",
+ "printing.generic.helpPrinterMargin": "Strefę bezpieczną ustaw na to, jak blisko krawędzi papieru drukarka jeszcze drukuje. Zmiana tych wartości nie wpływa na całą siatkę.",
+ "printing.generic.horizontalSpacing": "Odstęp poziomy",
+ "printing.generic.itemCopies": "Kopie pozycji",
+ "printing.generic.marginBottom": "Margines dolny",
+ "printing.generic.marginLeft": "Margines lewy",
+ "printing.generic.marginRight": "Margines prawy",
+ "printing.generic.marginTop": "Margines górny",
"printing.generic.paperSize": "Rozmiar papieru",
- "printing.generic.printerMarginBottom": "Bezpieczna strefa od dołu",
- "printing.generic.printerMarginLeft": "Bezpieczna strefa po lewej",
- "printing.generic.printerMarginRight": "Bezpieczna strefa po prawej",
- "printing.generic.printerMarginTop": "Bezpieczna strefa od góry",
+ "printing.generic.printerMarginBottom": "Strefa bezpieczna dół",
+ "printing.generic.printerMarginLeft": "Strefa bezpieczna lewo",
+ "printing.generic.printerMarginRight": "Strefa bezpieczna prawo",
+ "printing.generic.printerMarginTop": "Strefa bezpieczna góra",
"printing.generic.saveAsImage": "Zapisz jako obraz",
- "printing.generic.skipItems": "Pomiń elementy",
- "printing.generic.verticalSpacing": "Pionowy odstęp",
+ "printing.generic.skipItems": "Pomiń pozycje",
+ "printing.generic.verticalSpacing": "Odstęp pionowy",
"printing.qrcode.button": "Drukuj etykiety",
- "printing.qrcode.customUrl.caveat": "",
- "printing.qrcode.customUrl.hint": "",
- "printing.qrcode.customUrl.label": "",
- "printing.qrcode.useHTTPUrl.label": "Link kodu QR",
- "printing.qrcode.useHTTPUrl.options.custom": "",
- "printing.qrcode.useHTTPUrl.options.default": "Domyślne",
+ "printing.qrcode.customUrl.caveat": "Własny URL nie wróci skanem do Spoolmana — użyj go, żeby kod QR otwierał zewnętrzną aplikację albo inny host.",
+ "printing.qrcode.customUrl.hint": "Wstaw identyfikator szpuli w dowolnym miejscu za pomocą placeholdera",
+ "printing.qrcode.customUrl.label": "Własny szablon URL",
+ "printing.qrcode.useHTTPUrl.label": "Link w kodzie QR",
+ "printing.qrcode.useHTTPUrl.options.custom": "Własny URL",
+ "printing.qrcode.useHTTPUrl.options.default": "Domyślny",
"printing.qrcode.useHTTPUrl.options.url": "URL",
"printing.qrcode.useHTTPUrl.preview": "Podgląd:",
- "printing.qrcode.useHTTPUrl.tooltip": "Zostanie użyty link który będzie działał tylko gdy zostanie zeskanowany przez funkcję skanowania Spoolmana (Domyślna opcja). Link URL używa bazowego URL ustawionego w ustawieniach lub aktualnego URL strony jeżeli nie jest ustawiony w ustawieniach.",
+ "printing.qrcode.useHTTPUrl.tooltip": "Domyślnie tworzy kod czytelny tylko dla własnego skanera Spoolmana. Opcja URL tworzy zwykły link sieciowy, który otworzy dowolny skaner — na podstawie podstawowego adresu URL z ustawień lub adresu tej witryny, jeśli ustawienie jest puste.",
"printing.spoolSelect.selectedTotal_few": "Wybrano {{count}} szpule",
"printing.spoolSelect.selectedTotal_many": "Wybrano {{count}} szpul",
"printing.spoolSelect.selectedTotal_one": "Wybrano {{count}} szpulę",
- "scanner.description": "Zeskanuj kod QR Spoolman, aby wyświetlić szczegółowe informacje o szpuli.",
- "scanner.error.inUse": "",
- "scanner.error.insecureContext": "Strona nie jest dostarczana przez HTTPS.",
+ "scanner.description": "Zeskanuj kod QR Spoolmana, aby zobaczyć szczegóły szpuli.",
+ "scanner.error.inUse": "Kamera jest już używana przez inną aplikację.",
+ "scanner.error.insecureContext": "Strona nie jest serwowana przez HTTPS.",
"scanner.error.notAllowed": "Nie zezwolono na dostęp do kamery.",
"scanner.error.notFound": "Nie znaleziono kamery.",
- "scanner.error.streamApiNotSupported": "Przeglądarka nie obsługuje API MediaStream.",
+ "scanner.error.streamApiNotSupported": "Przeglądarka nie obsługuje MediaStream API.",
"scanner.error.unknown": "Wystąpił nieznany błąd. ({{error}})",
- "scanner.starting": "",
+ "scanner.starting": "Uruchamianie kamery...",
"scanner.title": "Skaner kodów QR",
- "search.colorHint": "",
- "search.noResults": "",
- "search.searching": "",
- "search.section.filaments": "",
- "search.section.spools": "",
- "search.section.vendors": "",
- "search.threshold": "",
- "search.unknownFilament": "",
- "settings.appearance.tab": "",
- "settings.appearance.theme.dark": "",
- "settings.appearance.theme.desc": "",
- "settings.appearance.theme.label": "",
- "settings.appearance.theme.light": "",
- "settings.appearance.theme.system": "",
- "settings.extraFields.addChoice": "",
- "settings.extraFields.addChoicesFirst": "",
- "settings.extraFields.addEntityField": "",
+ "search.colorHint": "Nazwy kolorów trzeba wpisywać po angielsku.",
+ "search.moreSpools": "+{{count}} więcej",
+ "search.noResults": "Brak wyników",
+ "search.searching": "Szukanie...",
+ "search.section.filaments": "Filamenty",
+ "search.section.spools": "Szpule",
+ "search.section.vendors": "Producenci",
+ "search.threshold": "Dopasowanie koloru",
+ "search.unknownFilament": "Nieznany filament",
+ "settings.appearance.tab": "Wygląd",
+ "settings.appearance.theme.dark": "Ciemny",
+ "settings.appearance.theme.desc": "Motyw kolorystyczny (tylko ta przeglądarka)",
+ "settings.appearance.theme.label": "Motyw",
+ "settings.appearance.theme.light": "Jasny",
+ "settings.appearance.theme.system": "Systemowy",
+ "settings.extraFields.addChoice": "dodaj opcję...",
+ "settings.extraFields.addChoicesFirst": "Najpierw dodaj opcje",
+ "settings.extraFields.addEntityField": "Dodaj pole {{entity}}",
"settings.extraFields.booleanFalse": "Nie",
"settings.extraFields.booleanTrue": "Tak",
- "settings.extraFields.deleteConfirm": "Usunąć pole {{name}}?",
- "settings.extraFields.description.constraints": "Po dodaniu pola nie można zmienić jego klucza ani typu, a w przypadku pól typu wyboru nie można usunąć wyborów ani zmienić stanu wielokrotnego wyboru. Jeśli usuniesz pole, powiązane dane dla wszystkich podmiotów zostaną usunięte.",
- "settings.extraFields.description.intro": "Tutaj możesz dodać dodatkowe pola niestandardowe do swoich podmiotów.",
- "settings.extraFields.description.keyUsage": "Klucz jest tym, co inne programy odczytują/zapisują jako dane, więc jeśli twoje niestandardowe pole ma być zintegrowane z programem innej firmy, upewnij się, że ustawiłeś je poprawnie. Wartość domyślna jest stosowana tylko do nowych elementów.",
- "settings.extraFields.description.tableViews": "Dodatkowych pól nie można sortować ani filtrować w widokach tabeli.",
- "settings.extraFields.editorEdit": "",
- "settings.extraFields.editorNew": "",
- "settings.extraFields.errors.choiceNeeded": "",
- "settings.extraFields.errors.choicesRemoved": "",
- "settings.extraFields.errors.deleteFailed": "",
- "settings.extraFields.errors.keyFormat": "",
- "settings.extraFields.errors.nameRequired": "",
- "settings.extraFields.errors.saveFailed": "",
- "settings.extraFields.fieldType.boolean": "Wartość logiczna",
+ "settings.extraFields.deleteConfirm": "Usunąć pole {{name}} na {{entity}}?",
+ "settings.extraFields.description.constraints": "Po dodaniu pola nie zmienisz już klucza ani typu, a w polach wyboru nie usuniesz opcji ani nie zmienisz trybu wielokrotnego wyboru. Usunięcie pola kasuje powiązane dane ze wszystkich encji.",
+ "settings.extraFields.description.intro": "Tutaj dodasz własne dodatkowe pola do encji.",
+ "settings.extraFields.description.keyUsage": "Klucz to nazwa, pod którą inne programy odczytują i zapisują dane. Jeśli pole ma się integrować z zewnętrznym programem, ustaw go poprawnie. Wartość domyślna dotyczy tylko nowych elementów.",
+ "settings.extraFields.description.tableViews": "Dodatkowe pola można pokazywać i sortować w widokach tabeli. Pola wyboru i logiczne dają tam też filtry, a wszystkie typy obsługują filtrowanie pustych wartości.",
+ "settings.extraFields.editorEdit": "Edytuj pole {{entity}}",
+ "settings.extraFields.editorNew": "Nowe pole {{entity}}",
+ "settings.extraFields.errors.choiceNeeded": "Pole wyboru wymaga przynajmniej jednej opcji.",
+ "settings.extraFields.errors.choicesRemoved": "Istniejących opcji nie można usunąć: {{choices}}.",
+ "settings.extraFields.errors.deleteFailed": "Nie udało się usunąć pola.",
+ "settings.extraFields.errors.keyFormat": "Klucz może zawierać tylko małe litery, cyfry i podkreślenia.",
+ "settings.extraFields.errors.nameRequired": "Nazwa jest wymagana.",
+ "settings.extraFields.errors.saveFailed": "Nie udało się zapisać pola.",
+ "settings.extraFields.fieldType.boolean": "Logiczne",
"settings.extraFields.fieldType.choice": "Wybór",
- "settings.extraFields.fieldType.datetime": "Data i Czas",
- "settings.extraFields.fieldType.float": "Liczba zmiennoprzecinkowa",
- "settings.extraFields.fieldType.floatRange": "Zakres",
- "settings.extraFields.fieldType.integer": "Liczba całkowita",
- "settings.extraFields.fieldType.integerRange": "Zakres liczb",
+ "settings.extraFields.fieldType.datetime": "Data i czas",
+ "settings.extraFields.fieldType.float": "Zmiennoprzecinkowa",
+ "settings.extraFields.fieldType.floatRange": "Zakres zmiennoprzecinkowy",
+ "settings.extraFields.fieldType.integer": "Całkowita",
+ "settings.extraFields.fieldType.integerRange": "Zakres całkowity",
"settings.extraFields.fieldType.text": "Tekst",
- "settings.extraFields.max": "",
- "settings.extraFields.min": "",
- "settings.extraFields.multiSuffix": "",
- "settings.extraFields.multiple": "",
- "settings.extraFields.namePlaceholder": "",
+ "settings.extraFields.max": "maks.",
+ "settings.extraFields.min": "min.",
+ "settings.extraFields.multiSuffix": " · multi",
+ "settings.extraFields.multiple": "Wiele",
+ "settings.extraFields.namePlaceholder": "Nazwa wyświetlana",
"settings.extraFields.nonUniqueKeyError": "Klucz musi być unikalny.",
- "settings.extraFields.none": "",
- "settings.extraFields.params.choices": "Wybory",
- "settings.extraFields.params.defaultValue": "Domyślna wartość",
+ "settings.extraFields.none": "Brak dodatkowych pól {{entity}}.",
+ "settings.extraFields.params.choices": "Opcje",
+ "settings.extraFields.params.defaultValue": "Wartość domyślna",
"settings.extraFields.params.fieldType": "Typ",
"settings.extraFields.params.key": "Klucz",
"settings.extraFields.params.name": "Nazwa",
"settings.extraFields.params.order": "Kolejność",
"settings.extraFields.params.unit": "Jednostka",
- "settings.extraFields.saveField": "",
- "settings.extraFields.tab": "Dodatkowe parametry",
+ "settings.extraFields.reorderChoice": "Przeciągnij albo użyj strzałek, aby zmienić kolejność tej opcji.",
+ "settings.extraFields.saveField": "Zapisz pole",
+ "settings.extraFields.tab": "Dodatkowe pola",
"settings.general.baseUrl.label": "Bazowy URL",
- "settings.general.baseUrl.tooltip": "Bazowy URL zostanie użyty podczas generowania QR code oraz w innych funkcjonalnościach.",
- "settings.general.currency.desc": "",
+ "settings.general.baseUrl.tooltip": "Bazowy URL używany przy generowaniu m.in. kodów QR.",
+ "settings.general.currency.desc": "Trzyliterowy kod ISO (np. PLN, EUR, USD) używany przy cenach",
"settings.general.currency.label": "Waluta",
- "settings.general.roundPrices.label": "Zaokrąglone ceny",
- "settings.general.roundPrices.tooltip": "Zaokrąglij ceny do najbliższej liczby całkowitej.",
+ "settings.general.roundPrices.label": "Zaokrąglaj ceny",
+ "settings.general.roundPrices.tooltip": "Zaokrąglaj ceny do najbliższej liczby całkowitej.",
"settings.general.tab": "Ogólne",
"settings.header": "Ustawienia",
- "settings.language.desc": "",
- "settings.language.label": "",
- "settings.library.lowThreshold.desc": "",
- "settings.library.lowThreshold.label": "",
- "settings.library.tab": "",
- "spool.fields.archived": "Zarchiwizowano",
+ "settings.language.desc": "Język interfejsu (tylko ta przeglądarka)",
+ "settings.language.label": "Język",
+ "settings.library.lowThreshold.desc": "Szpule o wadze równej lub niższej są oznaczane na czerwono (tylko ta przeglądarka)",
+ "settings.library.lowThreshold.label": "Próg niskiego stanu",
+ "settings.library.tab": "Zachowanie biblioteki",
+ "spool.fields.archived": "Zarchiwizowana",
"spool.fields.comment": "Komentarz",
"spool.fields.filament": "Filament",
"spool.fields.firstUsed": "Pierwsze użycie",
"spool.fields.id": "ID",
"spool.fields.lastUsed": "Ostatnie użycie",
"spool.fields.location": "Lokalizacja",
- "spool.fields.lotNr": "Numer partii (LOT)",
+ "spool.fields.lotNr": "Nr partii",
"spool.fields.material": "Materiał",
"spool.fields.measuredWeight": "Zmierzona waga",
"spool.fields.price": "Cena",
"spool.fields.registered": "Zarejestrowano",
"spool.fields.remainingWeight": "Pozostała waga",
+ "spool.fields.spoolWeight": "Waga szpuli",
"spool.fields.usedWeight": "Zużyta waga",
- "spool.fieldsHelp.location": "Wpisz gdzie znajduje się szpula, jeśli masz wiele lokalizacji, w których przechowujesz szpule.",
- "spool.fieldsHelp.lotNr": "Numer partii producenta. Może być stosowany w celu zapewnienia jednolitego koloru wydruku w przypadku użycia wielu szpul.",
- "spool.fieldsHelp.measuredWeight": "Waga filamentu i szpuli.",
- "spool.fieldsHelp.price": "Cena pełnej szpuli. Jeśli nie ustawiona, cena filamentu będzie domyślna.",
- "spool.fieldsHelp.remainingWeight": "Ile filamentu pozostało na szpuli. W przypadku nowej szpuli powinno to odpowiadać wadze szpuli.",
- "spool.fieldsHelp.usedWeight": "Podaj ile filamentu użyto ze szpuli. Jeśli jest nowa, podaj 0g użycia.",
+ "spool.fields.weight": "Waga",
+ "spool.fieldsHelp.location": "Gdzie fizycznie trzymasz tę szpulę — półka, szuflada, dry box albo drukarka, w której jest załadowana. W bibliotece szpule są grupowane po lokalizacji, więc tak je potem znajdziesz.",
+ "spool.fieldsHelp.lotNr": "Numer partii producenta. Przydaje się, gdy chcesz utrzymać ten sam odcień przy użyciu kilku szpul.",
+ "spool.fieldsHelp.measuredWeight": "Ile ważą filament i szpula razem.",
+ "spool.fieldsHelp.price": "Cena pełnej szpuli. Jeśli pusta, przyjmowana jest cena filamentu.",
+ "spool.fieldsHelp.remainingWeight": "Ile filamentu zostało na szpuli. W nowej szpuli powinno to odpowiadać wadze netto pełnej rolki.",
+ "spool.fieldsHelp.spoolWeight": "Ile waży ta szpula na pusto. Zostaw puste, aby brać wagę szpuli z filamentu, i ustaw, gdy ta konkretna się różni — przekręcona rolka albo rdzeń kartonowy zamieniony na plastikowy. To właśnie jest odejmowane od odczytu przy korekcie wagą zmierzoną, więc zła wartość przekłamuje, ile filamentu zostało.",
+ "spool.fieldsHelp.usedWeight": "Ile filamentu zużyto z tej szpuli. Nowa szpula powinna mieć 0 g zużycia.",
+ "spool.fieldsHelp.weight": "Ile filamentu miała ta szpula na pełno (masa netto, bez samej szpuli). Zostaw puste, aby brać wagę z filamentu, i ustaw, gdy ta konkretna się różni — niepełna rolka albo ten sam filament kupiony na większej.",
"spool.form.measurementType.length": "Długość",
"spool.form.measurementType.weight": "Waga",
"spool.spool": "Szpule",
- "topbar.addSpools": "",
- "topbar.searchPlaceholder": "",
+ "topbar.addSpools": "Dodaj szpule",
+ "topbar.searchPlaceholder": "Szukaj — spróbuj \"red\" albo \"pla\"",
"unknown": "Nieznane",
- "validation.hexDigits": "",
- "validation.maxChars": "",
- "validation.mustBeGt": "",
- "validation.mustBeMax": "",
- "validation.mustBeMin": "",
- "validation.mustBeNumber": "",
- "validation.required": "",
+ "validation.hexDigits": "Podaj 6 albo 8 cyfr hex",
+ "validation.maxChars": "Co najwyżej {{max}} znaków",
+ "validation.mustBeGt": "Musi być większe niż {{value}}",
+ "validation.mustBeMax": "Musi być {{value}} albo mniej",
+ "validation.mustBeMin": "Musi być {{value}} albo więcej",
+ "validation.mustBeNumber": "Musi być liczbą",
+ "validation.required": "Wymagane",
"vendor.fields.comment": "Komentarz",
"vendor.fields.emptySpoolWeight": "Waga pustej szpuli",
- "vendor.fields.externalId": "Zewnętrzne ID",
+ "vendor.fields.externalId": "ID zewnętrzne",
"vendor.fields.id": "ID",
"vendor.fields.name": "Nazwa",
"vendor.fields.registered": "Zarejestrowano",
- "vendor.fieldsHelp.emptySpoolWeight": "Waga pustej szpuli od tego producenta.",
+ "vendor.fieldsHelp.emptySpoolWeight": "Waga pustej szpuli tego producenta.",
"yes": "Tak"
}
diff --git a/client_v2/locales/th/common.json b/client_v2/locales/th/common.json
index 0ff6a23d..744997d3 100644
--- a/client_v2/locales/th/common.json
+++ b/client_v2/locales/th/common.json
@@ -1,93 +1,143 @@
{
- "add.addAndNew": "",
- "add.addN_other": "",
- "add.adding": "",
- "add.advanced": "",
- "add.advancedNote": "",
- "add.change": "",
- "add.count": "",
- "add.createNew": "",
- "add.createNewSub": "",
- "add.dbUnavailable": "",
- "add.duplicate": "",
- "add.duplicateNote": "",
- "add.duplicateRename": "",
- "add.duplicateTitle": "",
- "add.filamentNamePlaceholder": "",
- "add.fill.full": "",
- "add.fillLevel": "",
- "add.importNote": "",
- "add.inCatalog": "",
- "add.locationHint": "",
- "add.locationPlaceholder": "",
- "add.manufacturerPlaceholder": "",
- "add.nameHint": "",
- "add.newFilament": "",
- "add.newFilamentTitle": "",
- "add.noCatalog": "",
- "add.noManufacturer": "",
- "add.pickColor": "",
- "add.searchPlaceholder": "",
- "add.searching": "",
- "add.spoolWeightPreset.cardboard": "",
- "add.spoolWeightPreset.plastic": "",
- "add.spoolWeightPresetsLead": "",
- "add.step2": "",
- "add.summary_other": "",
- "add.typeToSearchAll": "",
- "add.typeToSearchMatches": "",
- "add.useExisting": "",
- "add.vendorHint.existing": "",
- "add.vendorHint.new": "",
- "add.vendorHint.optional": "",
- "add.yourCatalog": "",
+ "add.addAndNew": "บันทึกและเพิ่มรายการใหม่",
+ "add.addN_other": "เพิ่ม {{count}} ม้วน",
+ "add.adding": "กำลังเพิ่ม...",
+ "add.advanced": "สเปกขั้นสูง",
+ "add.advancedNote": "ความหนาแน่น เส้นผ่านศูนย์กลาง อุณหภูมิ (กรอกอัตโนมัติตามวัสดุ)",
+ "add.change": "เปลี่ยน",
+ "add.count": "จำนวน",
+ "add.createNew": "สร้างเส้นพลาสติกใหม่",
+ "add.createNewSub": "ไม่อยู่ในแค็ตตาล็อกของคุณหรือ {{name}}",
+ "add.dbUnavailable": "ไม่สามารถใช้งาน {{name}} ได้",
+ "add.duplicate": "ทำซ้ำ",
+ "add.duplicateNote": "คัดลอกสเปก ผู้ผลิต และราคามาแล้ว กรุณาตั้งชื่อและเลือกสีใหม่",
+ "add.duplicateRename": "ชื่อยังเหมือนกับต้นฉบับ — เปลี่ยนชื่อเพื่อแยกความต่าง",
+ "add.duplicateTitle": "เส้นพลาสติกใหม่ · สำเนาของ “{{name}}”",
+ "add.filamentNamePlaceholder": "เช่น PolyTerra Matte Sage",
+ "add.fill.full": "เต็มม้วน",
+ "add.fillLevel": "ระดับปริมาณคงเหลือ",
+ "add.importNote": "เส้นพลาสติกนี้จะถูกเพิ่มลงในแค็ตตาล็อกของคุณเมื่อคุณเพิ่มม้วนพลาสติก",
+ "add.inCatalog": "ในแค็ตตาล็อก",
+ "add.locationHint": "ตำแหน่งที่คุณจัดเก็บม้วนพลาสติกจริง — เช่น ชั้นวาง กล่อง หรือเครื่องพิมพ์ เว้นว่างไว้หากเก็บไว้ที่เดียวกันทั้งหมด",
+ "add.locationPlaceholder": "เช่น ชั้นวาง A, กล่องกันชื้น 2, เครื่องพิมพ์ 1",
+ "add.manufacturerPlaceholder": "เช่น Polymaker",
+ "add.nameHint": "ระบุชื่อสีด้วย — เพื่อช่วยแยกความต่างของเส้นพลาสติก",
+ "add.newFilament": "เส้นพลาสติกใหม่",
+ "add.newFilamentTitle": "เส้นพลาสติกใหม่",
+ "add.noCatalog": "ไม่มีเส้นพลาสติกในแค็ตตาล็อกของคุณ",
+ "add.noManufacturer": "ไม่มีผู้ผลิต",
+ "add.pickColor": "เลือกสี",
+ "add.searchPlaceholder": "ค้นหาในแค็ตตาล็อกของคุณและ {{name}}...",
+ "add.searching": "กำลังค้นหา...",
+ "add.section.filament": "เส้นพลาสติก",
+ "add.section.filamentNote": "ผลิตภัณฑ์บนม้วนพลาสติก — หนึ่งรายการต่อหนึ่งสี",
+ "add.section.manufacturer": "ผู้ผลิต",
+ "add.section.manufacturerNote": "ผู้ผลิตเส้นพลาสติก เพิ่มเพียงครั้งเดียวแล้วนำไปใช้ซ้ำกับเส้นพลาสติกทั้งหมดของแบรนด์นี้",
+ "add.section.spool": "ม้วนพลาสติก",
+ "add.section.spoolNote": "ม้วนพลาสติกจริงที่จะบันทึกลงในคลังของคุณ",
+ "add.section.spoolSharedNote": "น้ำหนัก น้ำหนักม้วนเปล่า และราคา จะถูกบันทึกเป็นค่าเริ่มต้นของเส้นพลาสติกใหม่ด้วย",
+ "add.spoolWeightPreset.cardboard": "กระดาษแข็ง {{weight}} ก.",
+ "add.spoolWeightPreset.plastic": "พลาสติก {{weight}} ก.",
+ "add.spoolWeightPresetsLead": "เริ่มต้นจากม้วนทั่วไป:",
+ "add.step2": "ขั้นตอนที่ 2 · รายละเอียดม้วนพลาสติก",
+ "add.step2New": "ขั้นตอนที่ 2 · รายละเอียดเส้นและม้วนพลาสติก",
+ "add.summary_other": "{{count}} ม้วน",
+ "add.typeToSearchAll": "พิมพ์เพื่อค้นหาเส้นพลาสติกนับพันรายการ",
+ "add.typeToSearchMatches": "พิมพ์เพื่อค้นหา — ไม่พบรายการที่ตรงกัน",
+ "add.useExisting": "ใช้รายการที่มีอยู่แล้ว",
+ "add.vendorHint.existing": "ใช้ผู้ผลิตที่มีอยู่แล้ว “{{name}}”",
+ "add.vendorHint.new": "จะสร้างผู้ผลิตใหม่ “{{name}}”",
+ "add.vendorHint.optional": "ไม่บังคับ — เว้นว่างไว้หากไม่มีผู้ผลิต",
+ "add.weightPresets": "ขนาดยอดนิยม",
+ "add.yourCatalog": "แค็ตตาล็อกของคุณ",
+ "buttons.apply": "นำไปใช้",
"buttons.archive": "เก็บถาวร",
"buttons.cancel": "ยกเลิก",
"buttons.clear": "ล้าง",
- "buttons.close": "",
+ "buttons.close": "ปิด",
"buttons.delete": "ลบ",
"buttons.edit": "แก้ไข",
"buttons.filter": "กรอง",
"buttons.save": "บันทึก",
"buttons.showArchived": "แสดงที่เก็บถาวร",
"buttons.unArchive": "ยกเลิกเก็บถาวร",
- "common.decrement": "",
- "common.increment": "",
- "common.remove": "",
- "common.search": "",
- "dashboard.addFieldHint": "",
- "dashboard.dashboard": "",
- "dashboard.deleteGroup": "",
- "dashboard.dragHint": "",
- "dashboard.dropHere": "",
- "dashboard.emptyHelp": "",
- "dashboard.errorEmptyName": "",
- "dashboard.errorExists": "",
- "dashboard.errorRename": "",
- "dashboard.lastUsed": "",
- "dashboard.newGroup": "",
- "dashboard.newGroupName": "",
- "dashboard.reorderGroup": "",
- "dashboard.spoolCount_other": "",
- "dashboard.unassigned": "",
- "datetime.done": "",
- "datetime.hour": "",
- "datetime.minute": "",
- "datetime.nextMonth": "",
- "datetime.now": "",
- "datetime.pick": "",
- "datetime.prevMonth": "",
- "datetime.time": "",
- "documentTitle.dashboard.list": "",
- "documentTitle.labels.list": "",
- "documentTitle.library.list": "",
+ "changeFilament.action": "เปลี่ยน",
+ "changeFilament.adoptWeight": "ตั้งค่าน้ำหนักเต็มม้วนนี้เป็น {{full}}",
+ "changeFilament.adoptWeightHelp": "บันทึกเดิมคือ {{current}} จากเส้นพลาสติกเดิม น้ำหนักที่ใช้ไป ({{used}}) จะยังคงเดิม ทำให้เหลือ {{remaining}}",
+ "changeFilament.apply": "เปลี่ยนเส้นพลาสติก",
+ "changeFilament.applying": "กำลังเปลี่ยน...",
+ "changeFilament.current": "ปัจจุบัน",
+ "changeFilament.done": "เปลี่ยนเส้นพลาสติกเรียบร้อยแล้ว",
+ "changeFilament.failed": "ไม่สามารถเปลี่ยนเส้นพลาสติกได้",
+ "changeFilament.importNote": "เส้นพลาสติกนี้จะถูกเพิ่มลงในแค็ตตาล็อกของคุณเมื่อคุณบันทึกการเปลี่ยนแปลง",
+ "changeFilament.intro": "ม้วนพลาสติก #{{id}} จะยังคงรักษาหมายเลข สถานที่จัดเก็บ วันที่ และประวัติการใช้งานเดิมไว้ — เปลี่ยนเฉพาะเส้นพลาสติกที่บรรจุอยู่เท่านั้น",
+ "changeFilament.newTag": "ใหม่",
+ "changeFilament.next": "เปลี่ยนเป็น",
+ "changeFilament.now": "ปัจจุบัน",
+ "changeFilament.pickBelow": "เลือกเส้นพลาสติกด้านล่าง",
+ "changeFilament.title": "เปลี่ยนเส้นพลาสติก",
+ "changeFilament.useExisting": "เลือกเส้นพลาสติกที่มีอยู่แล้ว",
+ "changeFilament.weightFollows": "ม้วนพลาสติกนี้ไม่ได้ระบุน้ำหนักเต็มม้วนไว้ จึงใช้น้ำหนักของเส้นพลาสติกใหม่: {{full}} คงเหลือ {{remaining}} หลังจากหักลบ {{used}} ที่ใช้ไปแล้ว",
+ "changeVendor.action": "เปลี่ยน",
+ "changeVendor.apply": "เปลี่ยนผู้ผลิต",
+ "changeVendor.applying": "กำลังเปลี่ยน...",
+ "changeVendor.clearHint": "กำหนดให้เส้นพลาสติกนี้ไม่มีผู้ผลิต",
+ "changeVendor.create": "สร้าง “{{name}}”",
+ "changeVendor.createHint": "ยังไม่มีในรายชื่อผู้ผลิตของคุณ — ระบบจะเพิ่มให้อัตโนมัติ",
+ "changeVendor.current": "ปัจจุบัน",
+ "changeVendor.done": "เปลี่ยนผู้ผลิตเรียบร้อยแล้ว",
+ "changeVendor.emptySpool": "ม้วนเปล่า {{value}}",
+ "changeVendor.failed": "ไม่สามารถเปลี่ยนผู้ผลิตได้",
+ "changeVendor.intro": "“{{name}}” จะยังคงรักษาม้วนพลาสติก สเปก และประวัติเดิมไว้ — เปลี่ยนเฉพาะผู้ผลิตที่จัดหมวดหมู่ไว้เท่านั้น",
+ "changeVendor.next": "เปลี่ยนเป็น",
+ "changeVendor.noEmptySpool": "ไม่มีน้ำหนักม้วนพลาสติกเปล่า",
+ "changeVendor.noMatches": "ไม่พบผู้ผลิตที่ตรงกัน",
+ "changeVendor.none": "ยังไม่มีผู้ผลิต",
+ "changeVendor.noneNote": "ไม่ได้ระบุแบรนด์",
+ "changeVendor.now": "ปัจจุบัน",
+ "changeVendor.pickBelow": "เลือกผู้ผลิตด้านล่าง",
+ "changeVendor.searchPlaceholder": "ค้นหาหรือพิมพ์ชื่อผู้ผลิต",
+ "changeVendor.tareFollows": "เส้นพลาสติกนี้ไม่ได้ระบุน้ำหนักม้วนเปล่าไว้ จึงใช้น้ำหนักของผู้ผลิต หลังเปลี่ยนจะเป็น {{value}} ซึ่งเป็นน้ำหนักม้วนเปล่าเมื่อคุณนำไปชั่ง",
+ "changeVendor.tareGone": "เส้นพลาสติกนี้ไม่ได้ระบุน้ำหนักม้วนเปล่าไว้และเดิมใช้ {{current}} ของผู้ผลิต หลังเปลี่ยนจะไม่มีค่าน้ำหนักม้วนเปล่า จนกว่าคุณจะกำหนดให้กับเส้นพลาสติกนี้",
+ "changeVendor.title": "เปลี่ยนผู้ผลิต",
+ "changeVendor.willBeCreated": "จะถูกสร้างใหม่",
+ "common.decrement": "ลดลง",
+ "common.increment": "เพิ่มขึ้น",
+ "common.remove": "ลบออก",
+ "common.search": "ค้นหา",
+ "dashboard.addFieldHint": "เพิ่มฟิลด์ข้อความหรือตัวเลือกในม้วนพลาสติกที่หน้าการตั้งค่าเพื่อจัดกลุ่มตามฟิลด์นั้นได้ด้วย",
+ "dashboard.dashboard": "แดชบอร์ด",
+ "dashboard.deleteGroup": "ลบกลุ่ม",
+ "dashboard.dragHint": "ลากม้วนพลาสติกไปยังการ์ดอื่นเพื่อเปลี่ยน {{field}} หรือลากภายในการ์ดเพื่อจัดเรียงลำดับ",
+ "dashboard.dropHere": "วางม้วนพลาสติกที่นี่",
+ "dashboard.emptyHelp": "หน้านี้จะจัดกลุ่มม้วนพลาสติกของคุณตามฟิลด์ที่คุณเลือก เพิ่มม้วนพลาสติกเพื่อเริ่มต้น!",
+ "dashboard.errorEmptyName": "ชื่อต้องไม่ว่างเปล่า",
+ "dashboard.errorExists": "มีกลุ่มที่ใช้ชื่อนี้อยู่แล้ว",
+ "dashboard.errorRename": "ไม่สามารถเปลี่ยนชื่อกลุ่มได้",
+ "dashboard.lastUsed": "ใช้งานล่าสุดเมื่อ {{time}}",
+ "dashboard.newGroup": "กลุ่มใหม่",
+ "dashboard.newGroupName": "กลุ่มใหม่ {{n}}",
+ "dashboard.reorderGroup": "ลากเพื่อจัดเรียงกลุ่ม",
+ "dashboard.spoolCount_other": "{{count}} ม้วน",
+ "dashboard.unassigned": "ยังไม่ได้จัดกลุ่ม",
+ "datetime.done": "เสร็จสิ้น",
+ "datetime.hour": "ชั่วโมง",
+ "datetime.minute": "นาที",
+ "datetime.nextMonth": "เดือนถัดไป",
+ "datetime.now": "ตอนนี้",
+ "datetime.pick": "เลือกวันเวลา",
+ "datetime.prevMonth": "เดือนก่อนหน้า",
+ "datetime.time": "เวลา",
+ "documentTitle.dashboard.list": "แดชบอร์ด | Spoolman",
+ "documentTitle.labels.list": "ฉลาก | Spoolman",
+ "documentTitle.library.list": "คลังข้อมูล | Spoolman",
"documentTitle.locations.list": "สถานที่เก็บ | Spoolman",
- "documentTitle.settings.list": "",
- "filament.fields.addColor": "",
- "filament.fields.articleNumber": "เลขบทความ",
- "filament.fields.coaxial": "เส้นหลายสี",
+ "documentTitle.settings.list": "การตั้งค่า | Spoolman",
+ "filament.fields.addColor": "เพิ่มสี",
+ "filament.fields.articleNumber": "รหัสสินค้า",
+ "filament.fields.coaxial": "เส้นประกบหลายสี",
"filament.fields.colorHex": "สี",
- "filament.fields.colorType": "",
+ "filament.fields.colorType": "ประเภทสี",
"filament.fields.comment": "หมายเหตุ",
"filament.fields.density": "ความหนาแน่น",
"filament.fields.diameter": "เส้นผ่านศูนย์กลาง",
@@ -97,9 +147,10 @@
"filament.fields.material": "วัสดุ",
"filament.fields.multiColor": "หลายสี",
"filament.fields.name": "ชื่อ",
+ "filament.fields.opacity": "ความทึบแสง",
"filament.fields.price": "ราคา",
"filament.fields.registered": "ลงทะเบียน",
- "filament.fields.removeColor": "",
+ "filament.fields.removeColor": "ลบสีออก",
"filament.fields.settingsBedTemp": "อุณหภูมิฐานพิมพ์",
"filament.fields.settingsExtruderTemp": "อุณหภูมิหัวพิมพ์",
"filament.fields.singleColor": "สีเดียว",
@@ -108,219 +159,242 @@
"filament.fields.weight": "น้ำหนัก",
"filament.fieldsHelp.articleNumber": "เช่น EAN, UPC, เป็นต้น",
"filament.fieldsHelp.multiColorDirection": "เส้นพลาสติกหลายสีสามารถมีหลายสีได้ 2 รูปแบบ: แบบ coextrusion (เช่น เส้นพลาสติกสองสีพร้อมกัน) หรือแบบไล่สีตามความยาว (เช่น เส้นพลาสติกเปลี่ยนสีไปเรื่อยๆ)",
- "filament.fieldsHelp.spoolWeight": "น้ำหนักม้วนพลาสติกเปล่า ใช้เพื่อคำนวณน้ำหนักรวมของม้วนพลาสติก",
+ "filament.fieldsHelp.spoolWeight": "น้ำหนักของม้วนพลาสติกเปล่า ใช้เพื่อคำนวณน้ำหนักที่วัดได้ของม้วนพลาสติก หากไม่แน่ใจ ม้วนกระดาษมักหนัก 130–150 ก. และม้วนพลาสติกหนัก 180–250 ก. — หากต้องการตัวเลขที่แม่นยำ ให้นำม้วนเปล่าไปชั่งเมื่อใช้หมด",
"filament.fieldsHelp.weight": "น้ำหนักของเส้นพลาสติกในม้วนพลาสติก (สุทธิ) ไม่รวมม้วนพลาสติกเปล่า เป็นค่าน้ำหนักที่มักระบุบนบรรจุภัณฑ์",
"filament.filament": "เส้นพลาสติก",
- "footer.documentation": "",
- "footer.reportIssue": "",
+ "footer.documentation": "เอกสารคู่มือ",
+ "footer.reportIssue": "รายงานปัญหา",
"help.help": "วิธีใช้",
- "inspector.addSpoolsOfThis": "",
- "inspector.adjustFailed": "",
- "inspector.adjustHelp": "",
- "inspector.adjustWeight": "",
- "inspector.apply": "",
- "inspector.applying": "",
- "inspector.colorHex": "",
- "inspector.consumeAmount": "",
- "inspector.delete.deleting": "",
- "inspector.delete.errorGone": "",
- "inspector.delete.errorSpoolsExist": "",
- "inspector.delete.errorUnknown": "",
- "inspector.delete.filament": "",
- "inspector.delete.filamentBlockedHint": "",
- "inspector.delete.filamentBlockedTitle": "",
- "inspector.delete.filamentBlocked_other": "",
- "inspector.delete.filamentBody": "",
- "inspector.delete.filamentDone": "",
- "inspector.delete.filamentTitle": "",
- "inspector.delete.spool": "",
- "inspector.delete.spoolBody": "",
- "inspector.delete.spoolDone": "",
- "inspector.delete.spoolRemaining": "",
- "inspector.delete.spoolTitle": "",
- "inspector.delete.vendor": "",
- "inspector.delete.vendorBody": "",
- "inspector.delete.vendorDone": "",
- "inspector.delete.vendorOrphans_other": "",
- "inspector.delete.vendorTitle": "",
- "inspector.duplicateFilament": "",
- "inspector.empty": "",
- "inspector.enterValidLength": "",
- "inspector.enterValidWeight": "",
- "inspector.loading": "",
- "inspector.manageExtraFields": "",
- "inspector.measuredHelp": "",
- "inspector.multi": "",
- "inspector.newGross": "",
- "inspector.noExtraFields": "",
- "inspector.notFound": "",
- "inspector.ofRemaining": "",
- "inspector.openFilament": "",
- "inspector.openLink": "",
- "inspector.openManufacturer": "",
- "inspector.specs": "",
- "inspector.spoolsCount": "",
- "inspector.spoolsTotalRemaining": "",
- "inspector.used": "",
- "inspector.vendorSub_other": "",
+ "inspector.addSpoolsOfThis": "เพิ่มม้วนพลาสติกจากเส้นพลาสติกนี้",
+ "inspector.adjustFailed": "ปรับค่าน้ำหนักไม่สำเร็จ",
+ "inspector.adjustHelp": "ค่าบวกคือใช้เส้นพลาสติก ค่าลบคือเพิ่มเส้นพลาสติกกลับเข้าไป",
+ "inspector.adjustWeight": "ปรับน้ำหนัก",
+ "inspector.apply": "นำไปใช้",
+ "inspector.applying": "กำลังนำไปใช้...",
+ "inspector.colorHex": "รหัสสี (HEX)",
+ "inspector.consumeAmount": "ปริมาณที่ใช้ไป:",
+ "inspector.defaultFrom.filament": "{{value}} · ค่าเริ่มต้นของเส้นพลาสติก",
+ "inspector.defaultFrom.manufacturer": "{{value}} · ค่าเริ่มต้นของผู้ผลิต",
+ "inspector.delete.deleting": "กำลังลบ...",
+ "inspector.delete.errorGone": "รายการนี้ถูกลบไปแล้ว",
+ "inspector.delete.errorSpoolsExist": "ไม่สามารถลบเส้นพลาสติกนี้ได้ — ยังมีม้วนพลาสติกที่ใช้งานอยู่",
+ "inspector.delete.errorUnknown": "การลบล้มเหลว ตรวจสอบรายละเอียดได้ที่ server logs",
+ "inspector.delete.filament": "ลบเส้นพลาสติก",
+ "inspector.delete.filamentBlockedHint": "ลบม้วนพลาสติกเหล่านั้นออกก่อน การเก็บถาวรยังไม่เพียงพอ",
+ "inspector.delete.filamentBlockedTitle": "ไม่สามารถลบเส้นพลาสติกนี้ได้",
+ "inspector.delete.filamentBlocked_other": "ยังมี {{count}} ม้วนพลาสติกที่ใช้ “{{name}}” อยู่ (รวมถึงที่เก็บถาวร)",
+ "inspector.delete.filamentBody": "“{{name}}” จะถูกลบออกจากแค็ตตาล็อกของคุณ และไม่สามารถยกเลิกการกระทำนี้ได้",
+ "inspector.delete.filamentDone": "ลบเส้นพลาสติกเรียบร้อยแล้ว",
+ "inspector.delete.filamentTitle": "ลบเส้นพลาสติกนี้หรือไม่?",
+ "inspector.delete.spool": "ลบม้วนพลาสติก",
+ "inspector.delete.spoolBody": "ม้วนพลาสติก #{{id}} ของ “{{name}}” จะถูกลบออกพร้อมกับประวัติการใช้งาน และไม่สามารถยกเลิกการกระทำนี้ได้",
+ "inspector.delete.spoolDone": "ลบม้วนพลาสติกเรียบร้อยแล้ว",
+ "inspector.delete.spoolRemaining": "ยังมีเส้นพลาสติกเหลืออยู่ {{weight}} ให้เลือกเก็บถาวรแทนหากต้องการซ่อนรายการไว้",
+ "inspector.delete.spoolTitle": "ลบม้วนพลาสติกนี้หรือไม่?",
+ "inspector.delete.vendor": "ลบผู้ผลิต",
+ "inspector.delete.vendorBody": "“{{name}}” จะถูกลบออก และไม่สามารถยกเลิกการกระทำนี้ได้",
+ "inspector.delete.vendorDone": "ลบผู้ผลิตเรียบร้อยแล้ว",
+ "inspector.delete.vendorOrphans_other": "เส้นพลาสติกทั้ง {{count}} รายการจะยังคงอยู่ แต่จะไม่มีผู้ผลิตระบุไว้",
+ "inspector.delete.vendorTitle": "ลบผู้ผลิตนี้หรือไม่?",
+ "inspector.duplicateFilament": "ทำซ้ำ",
+ "inspector.empty": "เลือกม้วนพลาสติก เส้นพลาสติก หรือผู้ผลิตจากรายการเพื่อดูรายละเอียดที่นี่",
+ "inspector.enterValidLength": "กรุณากรอกความยาวที่ถูกต้อง",
+ "inspector.enterValidWeight": "กรุณากรอกน้ำหนักที่ถูกต้อง",
+ "inspector.loading": "กำลังโหลด...",
+ "inspector.manageExtraFields": "จัดการฟิลด์",
+ "inspector.measuredHelp": "น้ำหนักรวมของม้วนพลาสติก + เส้นพลาสติกคงเหลือ ตามที่อ่านได้จากตาชั่ง",
+ "inspector.multi": "หลายรายการ ×{{count}}",
+ "inspector.newGross": "น้ำหนักรวมใหม่ (Gross Weight):",
+ "inspector.noExtraFields": "ยังไม่มี — เพิ่มฟิลด์ที่คุณกำหนดเองเพื่อติดตามข้อมูลอื่นๆ นอกเหนือจากที่ Spoolman มีให้",
+ "inspector.notFound": "ไม่พบรายการนี้ รายการอาจถูกลบไปแล้ว",
+ "inspector.ofRemaining": "จากคงเหลือ {{weight}} · {{length}} ม.",
+ "inspector.openFilament": "เปิดข้อมูลเส้นพลาสติก",
+ "inspector.openLink": "เปิด {{url}} ในแท็บใหม่",
+ "inspector.openManufacturer": "เปิดข้อมูลผู้ผลิต",
+ "inspector.override.byFilament": "ถูกแทนที่โดยเส้นพลาสติกนี้ · {{value}}",
+ "inspector.override.bySpool": "ถูกแทนที่โดยม้วนพลาสติกนี้ · {{value}}",
+ "inspector.override.overridesFilament": "แทนที่เส้นพลาสติก · {{value}}",
+ "inspector.override.overridesManufacturer": "แทนที่ผู้ผลิต · {{value}}",
+ "inspector.specs": "สเปก — แก้ไขได้โดยตรง",
+ "inspector.spoolsCount": "ม้วนพลาสติก · {{count}}",
+ "inspector.spoolsTotalRemaining": "รวมทั้งหมด {{weight}}",
+ "inspector.used": "ใช้ไปแล้ว",
+ "inspector.vendorSub_other": "{{count}} เส้นพลาสติก",
"kofi": "สนับสนุนเราได้ที่ Ko-fi",
- "labels.addHead": "",
- "labels.addQr": "",
- "labels.addRect": "",
- "labels.addSwatch": "",
- "labels.addText": "",
- "labels.align": "",
- "labels.alignCenter": "",
- "labels.alignLeft": "",
- "labels.alignRight": "",
- "labels.blank": "",
- "labels.bold": "",
- "labels.canvasHint": "",
- "labels.centerLogo": "",
- "labels.chooseField": "",
- "labels.clearFill": "",
- "labels.copies": "",
- "labels.cornerRadiusMm": "",
- "labels.createFirst": "",
- "labels.cutGuides": "",
- "labels.deleteConfirm": "",
- "labels.deleteElement": "",
- "labels.designName": "",
- "labels.designerDesc": "",
- "labels.designerTitle": "",
- "labels.dpi": "",
- "labels.dpiHint": "",
- "labels.duplicate": "",
- "labels.fields.bedTemp": "",
- "labels.fields.diameterMm": "",
- "labels.fields.groupVendor": "",
- "labels.fields.initialG": "",
- "labels.fields.netWeightG": "",
- "labels.fields.remainingG": "",
- "labels.filamentsSelected_other": "",
- "labels.fill": "",
- "labels.fitWidth": "",
- "labels.fitWidthHint": "",
- "labels.fontMm": "",
- "labels.gridInfo": "",
- "labels.hMm": "",
- "labels.heightMm": "",
- "labels.hintNowrap": "",
- "labels.hintSwatch": "",
- "labels.hintWrap": "",
+ "labels.addHead": "เพิ่ม",
+ "labels.addQr": "QR code",
+ "labels.addRect": "สี่เหลี่ยม",
+ "labels.addSwatch": "ตัวอย่างสี (Swatch)",
+ "labels.addText": "ข้อความ / ฟิลด์",
+ "labels.align": "จัดแนว",
+ "labels.alignCenter": "กึ่งกลาง",
+ "labels.alignLeft": "ชิดซ้าย",
+ "labels.alignRight": "ชิดขวา",
+ "labels.blank": "คุณยังไม่มีรูปแบบฉลากใดๆ",
+ "labels.bold": "ตัวหนา",
+ "labels.canvasHint": "ลากเพื่อย้าย · คลิกเพื่อเลือก · ดึงจุดจับเพื่อปรับขนาด",
+ "labels.centerLogo": "จัดโลโก้ Spoolman กึ่งกลาง",
+ "labels.chooseField": "เลือกฟิลด์...",
+ "labels.clearFill": "ล้างสีพื้นหลัง (เส้นขอบเท่านั้น)",
+ "labels.copies": "สำเนา",
+ "labels.cornerRadiusMm": "รัศมีมุมโค้ง",
+ "labels.createFirst": "สร้างฉลากแรกของคุณ",
+ "labels.cutGuides": "เส้นนำการตัด",
+ "labels.deleteConfirm": "ลบรูปแบบฉลากนี้หรือไม่?",
+ "labels.deleteElement": "ลบองค์ประกอบ",
+ "labels.designName": "ชื่อรูปแบบฉลาก",
+ "labels.designerDesc": "ออกแบบฉลาก QR code พร้อมฟิลด์ของม้วนพลาสติก เส้นพลาสติก หรือผู้ผลิต แล้วพิมพ์ลงบนแผ่นสติกเกอร์หรือเครื่องพิมพ์ฉลาก รูปแบบจะถูกบันทึกไว้บนเซิร์ฟเวอร์",
+ "labels.designerTitle": "ตัวออกแบบฉลาก",
+ "labels.dpi": "ความละเอียด",
+ "labels.dpiHint": "กำหนดให้ตรงกับเครื่องพิมพ์เพื่อให้ฉลากขนาดเล็กคมชัด: 203 dpi สำหรับเครื่องพิมพ์ฉลากความร้อนส่วนใหญ่, 300 ขึ้นไปสำหรับเลเซอร์และอิงค์เจ็ท",
+ "labels.duplicate": "ทำซ้ำ",
+ "labels.exportDescAml": "บันทึกไฟล์ฉลาก .aml หนึ่งไฟล์ต่อฉลากที่เลือก แต่ละฉลากขนาด {{w}}×{{h}} มม. เปิดใช้งานได้ในแอปที่ใช้ LPAPI ซึ่งมาพร้อมกับเครื่องพิมพ์ฉลากความร้อนส่วนใหญ่ โดยจะอ่านขนาดจริงจากไฟล์",
+ "labels.exportDescPng": "บันทึกภาพ PNG หนึ่งไฟล์ต่อฉลากที่เลือก แต่ละฉลากขนาด {{w}}×{{h}} มม.",
+ "labels.exportFormat": "รูปแบบไฟล์",
+ "labels.exportFormatOptions.aml": "ไฟล์ฉลาก AML",
+ "labels.exportFormatOptions.png": "รูปภาพ PNG",
+ "labels.fields.bedTemp": "อุณหภูมิฐานพิมพ์",
+ "labels.fields.diameterMm": "เส้นผ่านศูนย์กลาง (มม.)",
+ "labels.fields.groupVendor": "ผู้ผลิต",
+ "labels.fields.initialG": "เริ่มต้น (ก.)",
+ "labels.fields.netWeightG": "น้ำหนักสุทธิ (ก.)",
+ "labels.fields.remainingG": "คงเหลือ (ก.)",
+ "labels.filamentsSelected_other": "เลือก {{count}} เส้นพลาสติก",
+ "labels.fill": "สีพื้นหลัง",
+ "labels.fitWidth": "ปรับความกว้างให้พอดีกับคอลัมน์",
+ "labels.fitWidthHint": "ตั้งค่าความกว้างฉลากเพื่อให้จำนวนคอลัมน์ที่เลือกพอดีกับหน้ากระดาษ",
+ "labels.fontMm": "ฟอนต์",
+ "labels.gridInfo": "{{cols}} × {{rows}} = {{perPage}} ฉลาก / หน้า",
+ "labels.hMm": "สูง",
+ "labels.heightMm": "ความสูง",
+ "labels.hintNowrap": "ข้อความจะอยู่บรรทัดเดียว ส่วนที่เกินความกว้างจะถูกตัดออก",
+ "labels.hintSwatch": "จะเติมด้วยสีเส้นพลาสติกของม้วนนั้นในขณะพิมพ์",
+ "labels.hintWrap": "ครอบฟิลด์เพื่อซ่อนเมื่อไม่มีข้อมูล:",
"labels.imageDesc": "",
- "labels.imageZipNote": "",
- "labels.insertField": "",
- "labels.kind.qr": "",
- "labels.kind.rect": "",
- "labels.kind.swatch": "",
- "labels.kind.text": "",
- "labels.labelSize": "",
- "labels.labelType": "",
- "labels.layout": "",
- "labels.modeImage": "",
- "labels.modeLabel": "",
- "labels.modeSheet": "",
- "labels.new": "",
- "labels.newText": "",
- "labels.noDesignsOption": "",
- "labels.noFilaments": "",
- "labels.noSpools": "",
- "labels.onePerLabel": "",
- "labels.preparing": "",
- "labels.preview": "",
- "labels.previewWith": "",
- "labels.printN_other": "",
- "labels.radiusMm": "",
- "labels.sampleData": "",
- "labels.saved": "",
- "labels.saving": "",
- "labels.searchFilaments": "",
- "labels.searchSpools": "",
- "labels.selectAllShort": "",
- "labels.selectAtLeastOne": "",
- "labels.selectAtLeastOneFilament": "",
- "labels.selectDesign": "",
- "labels.selectElement": "",
- "labels.selectNoneShort": "",
- "labels.selectRecentHint": "",
- "labels.selectRecentShort": "",
- "labels.showingFilament": "",
- "labels.showingReal": "",
- "labels.showingSpool": "",
- "labels.showingTags": "",
- "labels.sizeMm": "",
- "labels.skipHint": "",
- "labels.sortHint": "",
- "labels.sortId": "",
- "labels.sortNewest": "",
- "labels.stroke": "",
- "labels.strokeMm": "",
- "labels.tabDesign": "",
- "labels.tabPrint": "",
- "labels.textTemplate": "",
- "labels.typeFilament": "",
- "labels.typeHint": "",
- "labels.typeSpool": "",
- "labels.unknownFilament": "",
- "labels.wMm": "",
- "labels.widthMm": "",
- "labels.wrapText": "",
- "labels.xMm": "",
- "labels.yMm": "",
- "library.apiError": "",
- "library.collapseGroup": "",
- "library.emptyBody": "",
- "library.emptyFiltered": "",
- "library.emptyTitle": "",
- "library.expandGroup": "",
- "library.filterBy": "",
- "library.groupBy": "",
- "library.groupNone": "",
- "library.groupSpools_other": "",
- "library.nUnused": "",
- "library.noLocation": "",
- "library.noValues": "",
- "library.openGroup": "",
- "library.openManufacturer": "",
- "library.section.extra": "",
- "library.section.filament": "",
- "library.section.spool": "",
- "library.section.vendor": "",
- "library.showMore": "",
- "library.sort.nozzle": "",
- "library.sortBy": "",
- "library.unassigned": "",
- "library.unitGroups": "",
- "library.unitSpools": "",
- "library.unused": "",
- "library.unusedGroup": "",
- "library.unusedGroupMixed": "",
- "library.unusedSub": "",
- "library.unusedSubMixed": "",
- "library.used": "",
- "library.usedAgo": "",
+ "labels.imageZipNote": "ฉลากที่มากกว่า {{threshold}} รายการจะถูกส่งออกเป็นไฟล์ zipไฟล์เดียว",
+ "labels.insertField": "แทรกฟิลด์",
+ "labels.kind.qr": "QR code",
+ "labels.kind.rect": "สี่เหลี่ยม",
+ "labels.kind.swatch": "ตัวอย่างสี",
+ "labels.kind.text": "ข้อความ",
+ "labels.labelSize": "ขนาดฉลาก",
+ "labels.labelType": "ประเภทฉลาก",
+ "labels.layout": "เค้าโครง",
+ "labels.modeImage": "ไฟล์",
+ "labels.modeLabel": "เครื่องพิมพ์ฉลาก",
+ "labels.modeSheet": "แผ่นสติกเกอร์ (เรียงแถว)",
+ "labels.new": "ใหม่",
+ "labels.newText": "ข้อความใหม่",
+ "labels.noDesignsOption": "ยังไม่มีรูปแบบฉลาก",
+ "labels.noFilaments": "ไม่มีเส้นพลาสติก",
+ "labels.noSpools": "ไม่มีม้วนพลาสติก",
+ "labels.onePerLabel": "หนึ่งหน้าขนาด {{w}}×{{h}} มม. ต่อหนึ่งฉลาก",
+ "labels.preparing": "กำลังเตรียมพิมพ์...",
+ "labels.preview": "ตัวอย่าง",
+ "labels.previewWith": "ดูตัวอย่างด้วย",
+ "labels.printN_other": "พิมพ์ {{count}} ฉลาก",
+ "labels.radiusMm": "รัศมีมุม",
+ "labels.sampleData": "ข้อมูลตัวอย่าง",
+ "labels.saveAsFormat": "บันทึกเป็น {{format}}",
+ "labels.saved": "บันทึกแล้ว",
+ "labels.saving": "กำลังบันทึก...",
+ "labels.searchFilaments": "ค้นหาเส้นพลาสติก...",
+ "labels.searchSpools": "ค้นหาม้วนพลาสติก...",
+ "labels.selectAllShort": "ทั้งหมด",
+ "labels.selectAtLeastOne": "กรุณาเลือกม้วนพลาสติกอย่างน้อย 1 ม้วน",
+ "labels.selectAtLeastOneFilament": "กรุณาเลือกเส้นพลาสติกอย่างน้อย 1 รายการ",
+ "labels.selectDesign": "เลือกรูปแบบฉลาก",
+ "labels.selectElement": "เลือกองค์ประกอบเพื่อแก้ไข หรือเพิ่มองค์ประกอบจากพาเล็ตต์",
+ "labels.selectNoneShort": "ไม่เลือก",
+ "labels.selectRecentHint": "เลือกม้วนพลาสติกที่เพิ่มเข้ามาในช่วง 24 ชั่วโมงที่ผ่านมา",
+ "labels.selectRecentShort": "ล่าสุด ({{count}})",
+ "labels.showingFilament": "กำลังแสดงเส้นพลาสติก #{{id}}",
+ "labels.showingReal": "กำลังแสดงข้อมูลจริงของม้วนพลาสติก",
+ "labels.showingSpool": "กำลังแสดงม้วนพลาสติก #{{id}}",
+ "labels.showingTags": "ฟิลด์จะแสดงเป็นแท็กจนกว่าคุณจะเลือกม้วนพลาสติกด้านบน",
+ "labels.sizeMm": "ขนาด",
+ "labels.skipHint": "ข้ามรายการจะเว้นช่องว่างตามจำนวนนั้นไว้ก่อนฉลากแรก ช่วยให้คุณนำแผ่นสติกเกอร์ที่ใช้ไปบางส่วนกลับมาใช้ใหม่ได้: ให้นับฉลากที่ลอกออกไปแล้วจากซ้ายไปขวาจากบนลงล่าง",
+ "labels.sortHint": "จัดเรียงม้วนพลาสติก",
+ "labels.sortId": "#",
+ "labels.sortNewest": "ใหม่สุด",
+ "labels.stroke": "เส้นขอบ",
+ "labels.strokeMm": "ความหนาเส้นขอบ",
+ "labels.tabDesign": "ออกแบบ",
+ "labels.tabPrint": "พิมพ์",
+ "labels.textTemplate": "ข้อความ / เทมเพลต",
+ "labels.typeFilament": "เส้นพลาสติก",
+ "labels.typeHint": "ฉลากเส้นพลาสติกจะละเว้นฟิลด์เฉพาะของม้วนพลาสติก และ QR code จะลิงก์ไปยังเส้นพลาสติกแทนม้วนพลาสติก",
+ "labels.typeSpool": "ม้วนพลาสติก",
+ "labels.unknownFilament": "ไม่ทราบเส้นพลาสติก",
+ "labels.wMm": "กว้าง",
+ "labels.widthMm": "ความกว้าง",
+ "labels.wrapText": "ตัดข้อความอัตโนมัติ",
+ "labels.xMm": "X",
+ "labels.yMm": "Y",
+ "library.apiError": "ไม่สามารถเชื่อมต่อกับ Spoolman API ได้ Backend กำลังทำงานอยู่หรือไม่?",
+ "library.collapseGroup": "ซ่อนม้วนพลาสติกเหล่านี้",
+ "library.dateFilter.ago": "{{span}} ที่แล้ว",
+ "library.dateFilter.between": "{{from}} – {{to}}",
+ "library.dateFilter.customRange": "กำหนดช่วงเอง",
+ "library.dateFilter.from": "จาก",
+ "library.dateFilter.last": "{{span}} ล่าสุด",
+ "library.dateFilter.never": "ไม่เคย",
+ "library.dateFilter.olderThan": "เก่ากว่า {{span}}",
+ "library.dateFilter.since": "ตั้งแต่ {{date}}",
+ "library.dateFilter.to": "ถึง (ไม่บังคับ)",
+ "library.dateFilter.until": "จนถึง {{date}}",
+ "library.emptyBody": "เพิ่มม้วนพลาสติกแรกของคุณเพื่อเริ่มติดตามเส้นพลาสติก",
+ "library.emptyFiltered": "ไม่พบ {{unit}} ที่ตรงกับตัวกรองปัจจุบัน",
+ "library.emptyTitle": "ยังไม่มีม้วนพลาสติก",
+ "library.expandGroup": "แสดงม้วนพลาสติกเหล่านี้",
+ "library.filterBy": "กรองโดย",
+ "library.groupBy": "จัดกลุ่ม",
+ "library.groupNone": "ไม่จัดกลุ่ม (แบบเรียบ)",
+ "library.groupSpools_other": "{{count}} ม้วน",
+ "library.nUnused": "×{{count}} ยังไม่ได้ใช้",
+ "library.noLocation": "ไม่มีสถานที่เก็บ",
+ "library.noValues": "ไม่มีข้อมูล",
+ "library.openGroup": "เปิด {{name}}",
+ "library.openManufacturer": "เปิดผู้ผลิต {{name}}",
+ "library.resizeList": "ปรับขนาดรายการ (ดับเบิลคลิกเพื่อรีเซ็ต)",
+ "library.section.extra": "ฟิลด์เพิ่มเติม",
+ "library.section.filament": "เส้นพลาสติก",
+ "library.section.spool": "ม้วนพลาสติก",
+ "library.section.vendor": "ผู้ผลิต",
+ "library.showMore": "แสดงเพิ่มอีก {{count}} รายการ",
+ "library.sort.nozzle": "อุณหภูมิหัวพิมพ์",
+ "library.sortBy": "จัดเรียง",
+ "library.unassigned": "ยังไม่ได้ระบุ",
+ "library.unitGroups": "กลุ่ม",
+ "library.unitSpools": "ม้วน",
+ "library.unused": "ยังไม่ได้ใช้",
+ "library.unusedGroup": "{{count}} ยังไม่ได้ใช้ · ม้วนละ {{weight}} ก.",
+ "library.unusedGroupMixed": "{{count}} ยังไม่ได้ใช้",
+ "library.unusedSub": "ม้วนละ {{weight}} ก. · {{location}}",
+ "library.unusedSubMixed": "{{location}}",
+ "library.used": "ใช้งานแล้ว",
+ "library.usedAgo": "ใช้งานไปเมื่อ {{time}}",
"loading": "กำลังโหลด",
"locations.locations": "สถานที่เก็บ",
"locations.newLocation": "สถานที่เก็บใหม่",
"locations.noLocation": "ไม่มีสถานที่เก็บ",
"locations.noLocationsHelp": "หน้านี้ให้คุณจัดการม้วนพลาสติกตามสถานที่เก็บ เพิ่มม้วนพลาสติกเพื่อเริ่มต้น!",
- "nav.labels": "",
- "nav.library": "",
+ "nav.labels": "ฉลาก",
+ "nav.library": "คลังข้อมูล",
"no": "ไม่",
"notifications.error": "เกิดข้อผิดพลาด (รหัสสถานะ: {{statusCode}})",
"notifications.saveSuccessful": "บันทึกสำเร็จ!",
- "pagination.empty": "",
- "pagination.next": "",
- "pagination.pageSize": "",
- "pagination.perPage": "",
- "pagination.prev": "",
- "pagination.range": "",
+ "pagination.empty": "ไม่มี {{unit}}",
+ "pagination.next": "หน้าถัดไป",
+ "pagination.pageSize": "ขนาดหน้า",
+ "pagination.perPage": "{{size}} / หน้า",
+ "pagination.prev": "หน้าก่อนหน้า",
+ "pagination.range": "{{from}}–{{to}} จาก {{total}} {{unit}}",
"printing.generic.columns": "คอลัมน์",
"printing.generic.customSize": "กำหนดเอง",
"printing.generic.description": "ปรับการตั้งค่าด้านล่างเพื่อให้ได้รูปแบบการพิมพ์ที่ต้องการ โปรดทราบว่าเครื่องพิมพ์และระบบปฏิบัติการของคุณอาจมีการตั้งค่าขอบกระดาษและการปรับขนาดของตัวเอง ดังนั้นคุณอาจต้องลองผิดลองถูกเล็กน้อยก่อนที่จะได้ผลลัพธ์ที่ถูกต้อง แนะนำให้ทดสอบบนกระดาษธรรมดาก่อนที่จะพิมพ์บนกระดาษสติกเกอร์จริง",
"printing.generic.dimensions": "ขนาด",
- "printing.generic.gridTooWide": "",
+ "printing.generic.gridTooWide": "ฉลากมีความกว้างเกินหน้ากระดาษ กรุณาลดจำนวนคอลัมน์ ระยะห่าง หรือระยะขอบ",
"printing.generic.helpMargin": "การตั้งค่าขอบกระดาษควรกำหนดให้ตรงกับขนาดกระดาษและเครื่องพิมพ์ของคุณ การเปลี่ยนค่านี้จะมีผลต่อขนาดตารางทั้งหมด",
"printing.generic.helpPrinterMargin": "Safe-Zone ควรกำหนดเป็นค่าระยะห่างจากขอบกระดาษที่เครื่องพิมพ์สามารถพิมพ์ได้ การเปลี่ยนค่านี้จะไม่กระทบต่อขนาดตารางทั้งหมด",
"printing.generic.horizontalSpacing": "ระยะห่างแนวนอน",
@@ -338,72 +412,73 @@
"printing.generic.skipItems": "ข้ามรายการ",
"printing.generic.verticalSpacing": "ระยะห่างแนวตั้ง",
"printing.qrcode.button": "พิมพ์ฉลาก",
- "printing.qrcode.customUrl.caveat": "",
- "printing.qrcode.customUrl.hint": "",
- "printing.qrcode.customUrl.label": "",
+ "printing.qrcode.customUrl.caveat": "URL ที่กำหนดเองจะไม่สามารถสแกนกลับเข้ามาใน Spoolman ได้ — ใช้เพื่อชี้ QR code ไปยังแอปภายนอกหรือโฮสต์อื่น",
+ "printing.qrcode.customUrl.hint": "แทรก spool id ตรงจุดใดก็ได้โดยใช้ตัวยึดตำแหน่ง",
+ "printing.qrcode.customUrl.label": "เทมเพลต URL กำหนดเอง",
"printing.qrcode.useHTTPUrl.label": "ลิงก์ QR code",
- "printing.qrcode.useHTTPUrl.options.custom": "",
+ "printing.qrcode.useHTTPUrl.options.custom": "URL กำหนดเอง",
"printing.qrcode.useHTTPUrl.options.default": "ค่าเริ่มต้น",
"printing.qrcode.useHTTPUrl.options.url": "URL",
"printing.qrcode.useHTTPUrl.preview": "ตัวอย่าง:",
"printing.qrcode.useHTTPUrl.tooltip": "จะใช้ลิงก์ภายในที่จะทำงานได้เฉพาะเมื่อสแกนจากฟีเจอร์สแกนของ Spoolman (ค่าเริ่มต้น) URL จะใช้จาก base URL ที่กำหนดไว้ใน settings หรือใช้ URL ของหน้าปัจจุบันหากไม่ได้ตั้งค่า",
"printing.spoolSelect.selectedTotal_other": "เลือก {{count}} ม้วนพลาสติก",
"scanner.description": "สแกน Spoolman QR code เพื่อดูข้อมูลเกี่ยวกับม้วนพลาสติก",
- "scanner.error.inUse": "",
+ "scanner.error.inUse": "กล้องกำลังถูกใช้งานโดยแอปพลิเคชันอื่น",
"scanner.error.insecureContext": "หน้านี้ไม่ได้ถูกให้บริการผ่าน HTTPS",
"scanner.error.notAllowed": "คุณไม่ได้อนุญาตให้เข้าถึงกล้อง",
"scanner.error.notFound": "ไม่พบกล้อง",
"scanner.error.streamApiNotSupported": "เบราว์เซอร์ไม่รองรับ MediaStream API",
"scanner.error.unknown": "เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ ({{error}})",
- "scanner.starting": "",
+ "scanner.starting": "กำลังเปิดใช้งานกล้อง...",
"scanner.title": "เครื่องสแกน QR Code",
- "search.colorHint": "",
- "search.noResults": "",
- "search.searching": "",
- "search.section.filaments": "",
- "search.section.spools": "",
- "search.section.vendors": "",
- "search.threshold": "",
- "search.unknownFilament": "",
- "settings.appearance.tab": "",
- "settings.appearance.theme.dark": "",
- "settings.appearance.theme.desc": "",
- "settings.appearance.theme.label": "",
- "settings.appearance.theme.light": "",
- "settings.appearance.theme.system": "",
- "settings.extraFields.addChoice": "",
- "settings.extraFields.addChoicesFirst": "",
- "settings.extraFields.addEntityField": "",
+ "search.colorHint": "ชื่อสีต้องกรอกเป็นภาษาอังกฤษ",
+ "search.moreSpools": "อีก +{{count}} ม้วน",
+ "search.noResults": "ไม่พบรายการที่ตรงกัน",
+ "search.searching": "กำลังค้นหา...",
+ "search.section.filaments": "เส้นพลาสติก",
+ "search.section.spools": "ม้วนพลาสติก",
+ "search.section.vendors": "ผู้ผลิต",
+ "search.threshold": "การจับคู่สี",
+ "search.unknownFilament": "ไม่ทราบเส้นพลาสติก",
+ "settings.appearance.tab": "รูปลักษณ์",
+ "settings.appearance.theme.dark": "โหมดมืด",
+ "settings.appearance.theme.desc": "ธีมสี (เฉพาะเบราว์เซอร์นี้)",
+ "settings.appearance.theme.label": "ธีม",
+ "settings.appearance.theme.light": "โหมดสว่าง",
+ "settings.appearance.theme.system": "ตามระบบ",
+ "settings.extraFields.addChoice": "เพิ่มตัวเลือก...",
+ "settings.extraFields.addChoicesFirst": "กรุณาเพิ่มตัวเลือกก่อน",
+ "settings.extraFields.addEntityField": "เพิ่มฟิลด์ {{entity}}",
"settings.extraFields.booleanFalse": "ไม่",
"settings.extraFields.booleanTrue": "ใช่",
- "settings.extraFields.deleteConfirm": "ลบฟิลด์ {{name}} หรือไม่?",
+ "settings.extraFields.deleteConfirm": "ลบฟิลด์ {{name}} บน {{entity}} หรือไม่?",
"settings.extraFields.description.constraints": "เมื่อเพิ่มฟิลด์แล้ว คุณจะไม่สามารถเปลี่ยนคีย์หรือประเภทของฟิลด์ได้ และสำหรับฟิลด์ประเภทตัวเลือกคุณจะไม่สามารถลบตัวเลือกหรือเปลี่ยนโหมด multi choice ได้ หากคุณลบฟิลด์ ข้อมูลของเอนทิตีทั้งหมดจะถูกลบด้วย",
"settings.extraFields.description.intro": "คุณสามารถเพิ่มฟิลด์ที่กำหนดเองเพิ่มเติมสำหรับเอนทิตีของคุณได้ที่นี่",
"settings.extraFields.description.keyUsage": "คีย์คือสิ่งที่โปรแกรมอื่นจะใช้เพื่ออ่าน/เขียนข้อมูล ดังนั้นหากฟิลด์ที่คุณสร้างเพื่อเชื่อมต่อกับโปรแกรมอื่น กรุณาตั้งค่าให้ถูกต้อง ค่าดีฟอลต์จะถูกนำไปใช้เฉพาะกับรายการใหม่เท่านั้น",
- "settings.extraFields.description.tableViews": "ฟิลด์เพิ่มเติมไม่สามารถเรียงหรือกรองได้ในตาราง",
- "settings.extraFields.editorEdit": "",
- "settings.extraFields.editorNew": "",
- "settings.extraFields.errors.choiceNeeded": "",
- "settings.extraFields.errors.choicesRemoved": "",
- "settings.extraFields.errors.deleteFailed": "",
- "settings.extraFields.errors.keyFormat": "",
- "settings.extraFields.errors.nameRequired": "",
- "settings.extraFields.errors.saveFailed": "",
- "settings.extraFields.fieldType.boolean": "บูลีน(ใส่เฉพาะ ใช่/ไม่)",
- "settings.extraFields.fieldType.choice": "ตัวเลือก",
- "settings.extraFields.fieldType.datetime": "วันเวลา",
- "settings.extraFields.fieldType.float": "ทศนิยม",
- "settings.extraFields.fieldType.floatRange": "ช่วงทศนิยม",
- "settings.extraFields.fieldType.integer": "จำนวนเต็ม",
- "settings.extraFields.fieldType.integerRange": "ช่วงจำนวนเต็ม",
- "settings.extraFields.fieldType.text": "ข้อความ",
- "settings.extraFields.max": "",
- "settings.extraFields.min": "",
- "settings.extraFields.multiSuffix": "",
- "settings.extraFields.multiple": "",
- "settings.extraFields.namePlaceholder": "",
+ "settings.extraFields.description.tableViews": "ฟิลด์เพิ่มเติมสามารถแสดงและจัดเรียงในมุมมองตารางได้ ฟิลด์ประเภทตัวเลือกและบูลีนยังมีตัวเลือกการกรองที่นั่นด้วย และฟิลด์เพิ่มเติมทุกประเภทรองรับการกรองหาค่าว่าง",
+ "settings.extraFields.editorEdit": "แก้ไขฟิลด์ {{entity}}",
+ "settings.extraFields.editorNew": "เพิ่มฟิลด์ {{entity}} ใหม่",
+ "settings.extraFields.errors.choiceNeeded": "ฟิลด์ประเภทตัวเลือกต้องมีตัวเลือกอย่างน้อย 1 รายการ",
+ "settings.extraFields.errors.choicesRemoved": "ไม่สามารถลบตัวเลือกที่มีอยู่เดิมได้: {{choices}}",
+ "settings.extraFields.errors.deleteFailed": "ลบฟิลด์ไม่สำเร็จ",
+ "settings.extraFields.errors.keyFormat": "คีย์ต้องประกอบด้วยตัวพิมพ์เล็ก ตัวเลข และขีดล่างเท่านั้น",
+ "settings.extraFields.errors.nameRequired": "จำเป็นต้องระบุชื่อ",
+ "settings.extraFields.errors.saveFailed": "บันทึกฟิลด์ไม่สำเร็จ",
+ "settings.extraFields.fieldType.boolean": "บูลีน (Boolean)",
+ "settings.extraFields.fieldType.choice": "ตัวเลือก (Choice)",
+ "settings.extraFields.fieldType.datetime": "วันเวลา (Datetime)",
+ "settings.extraFields.fieldType.float": "ทศนิยม (Float)",
+ "settings.extraFields.fieldType.floatRange": "ช่วงทศนิยม (Float Range)",
+ "settings.extraFields.fieldType.integer": "จำนวนเต็ม (Integer)",
+ "settings.extraFields.fieldType.integerRange": "ช่วงจำนวนเต็ม (Integer Range)",
+ "settings.extraFields.fieldType.text": "ข้อความ (Text)",
+ "settings.extraFields.max": "สูงสุด",
+ "settings.extraFields.min": "ต่ำสุด",
+ "settings.extraFields.multiSuffix": " · หลายรายการ",
+ "settings.extraFields.multiple": "เลือกได้หลายรายการ",
+ "settings.extraFields.namePlaceholder": "ชื่อที่แสดง",
"settings.extraFields.nonUniqueKeyError": "คีย์ต้องไม่ซ้ำ",
- "settings.extraFields.none": "",
+ "settings.extraFields.none": "ยังไม่มีการกำหนดฟิลด์เพิ่มเติมของ {{entity}}",
"settings.extraFields.params.choices": "ตัวเลือก",
"settings.extraFields.params.defaultValue": "ค่าเริ่มต้น",
"settings.extraFields.params.fieldType": "ประเภท",
@@ -411,21 +486,22 @@
"settings.extraFields.params.name": "ชื่อ",
"settings.extraFields.params.order": "ลำดับ",
"settings.extraFields.params.unit": "หน่วย",
- "settings.extraFields.saveField": "",
+ "settings.extraFields.reorderChoice": "ลาก หรือใช้ปุ่มลูกศร เพื่อจัดเรียงตัวเลือกนี้",
+ "settings.extraFields.saveField": "บันทึกฟิลด์",
"settings.extraFields.tab": "ฟิลด์เพิ่มเติม",
- "settings.general.baseUrl.label": "URLพื้นฐาน",
- "settings.general.baseUrl.tooltip": "URLพื้นฐาน ที่ใช้สำหรับสร้างฟีเจอร์ต่างๆ เช่น QR code",
- "settings.general.currency.desc": "",
+ "settings.general.baseUrl.label": "URL พื้นฐาน",
+ "settings.general.baseUrl.tooltip": "URL พื้นฐานที่ใช้สำหรับสร้างฟีเจอร์ต่างๆ เช่น QR code",
+ "settings.general.currency.desc": "รหัส ISO 3 ตัวอักษร (เช่น THB, EUR, USD) สำหรับแสดงราคา",
"settings.general.currency.label": "สกุลเงิน",
- "settings.general.roundPrices.label": "",
- "settings.general.roundPrices.tooltip": "",
+ "settings.general.roundPrices.label": "ปัดเศษราคา",
+ "settings.general.roundPrices.tooltip": "ปัดเศษราคาเป็นจำนวนเต็มที่ใกล้ที่สุด",
"settings.general.tab": "ทั่วไป",
"settings.header": "การตั้งค่า",
- "settings.language.desc": "",
- "settings.language.label": "",
- "settings.library.lowThreshold.desc": "",
- "settings.library.lowThreshold.label": "",
- "settings.library.tab": "",
+ "settings.language.desc": "ภาษาของอินเทอร์เฟซ (เฉพาะเบราว์เซอร์นี้)",
+ "settings.language.label": "ภาษา",
+ "settings.library.lowThreshold.desc": "ม้วนพลาสติกที่มีน้ำหนักเท่ากับหรือต่ำกว่านี้จะถูกไฮไลต์สีแดง (เฉพาะเบราว์เซอร์นี้)",
+ "settings.library.lowThreshold.label": "เกณฑ์เตือนพลาสติกใกล้หมด",
+ "settings.library.tab": "พฤติกรรมคลังข้อมูล",
"spool.fields.archived": "เก็บถาวร",
"spool.fields.comment": "หมายเหตุ",
"spool.fields.filament": "เส้นพลาสติก",
@@ -439,26 +515,30 @@
"spool.fields.price": "ราคา",
"spool.fields.registered": "ลงทะเบียน",
"spool.fields.remainingWeight": "น้ำหนักคงเหลือ",
+ "spool.fields.spoolWeight": "น้ำหนักม้วนพลาสติกเปล่า",
"spool.fields.usedWeight": "น้ำหนักที่ใช้ไป",
- "spool.fieldsHelp.location": "ตำแหน่งที่เก็บม้วนพลาสติก หากคุณมีหลายที่เก็บ นี่คือที่ที่คุณจัดเก็บม้วนพลาสติก",
+ "spool.fields.weight": "น้ำหนัก",
+ "spool.fieldsHelp.location": "ตำแหน่งที่คุณจัดเก็บม้วนพลาสติกจริง — เช่น ชั้นวาง ลิ้นชัก กล่องกันชื้น หรือเครื่องพิมพ์ที่กำลังใส่อยู่ ม้วนพลาสติกจะถูกจัดกลุ่มตามสถานที่ในคลัง เพื่อให้คุณค้นหากลับมาได้ง่าย",
"spool.fieldsHelp.lotNr": "เลขล็อตของผู้ผลิต ใช้เพื่อให้มั่นใจว่า การพิมพ์จะมีสีสม่ำเสมอ หากต้องใช้พลาสติกหลายม้วน",
"spool.fieldsHelp.measuredWeight": "น้ำหนักรวมของเส้นพลาสติกและม้วนพลาสติก",
"spool.fieldsHelp.price": "ราคาของม้วนพลาสติกเต็ม หากไม่ได้ตั้งค่า จะใช้ราคาของเส้นพลาสติกแทน",
- "spool.fieldsHelp.remainingWeight": "ปริมาณเส้นพลาสติกที่เหลืออยู่ในม้วนพลาสติก สำหรับม้วนพลาสติกใหม่ควรมีค่าเท่ากับน้ำหนักของม้วนพลาสติกเต็ม",
+ "spool.fieldsHelp.remainingWeight": "ปริมาณเส้นพลาสติกที่เหลืออยู่ในม้วน สำหรับม้วนพลาสติกใหม่ควรมีค่าเท่ากับน้ำหนักของม้วนพลาสติกเต็ม",
+ "spool.fieldsHelp.spoolWeight": "น้ำหนักของม้วนพลาสติกนี้เมื่อไม่มีเส้นพลาสติก (ม้วนเปล่า) เว้นว่างไว้เพื่อใช้น้ำหนักม้วนเปล่าตามเส้นพลาสติก และระบุเมื่อม้วนนี้มีความแตกต่าง — เช่น ม้วนที่กรอใหม่ หรือเปลี่ยนแกนกระดาษเป็นพลาสติก ค่าน้ำหนักนี้จะถูกนำไปลบเมื่อคุณปรับค่าน้ำหนักที่วัดได้ หากระบุผิดจะทำให้การคำนวณเส้นพลาสติกคงเหลือคลาดเคลื่อน",
"spool.fieldsHelp.usedWeight": "ปริมาณเส้นพลาสติกที่ถูกใช้ไปจากม้วนพลาสติก ม้วนพลาสติกใหม่ควรเริ่มต้นที่ 0 กรัม",
+ "spool.fieldsHelp.weight": "ปริมาณเส้นพลาสติกที่ม้วนนี้บรรจุได้เมื่อเต็ม (น้ำหนักสุทธิ ไม่รวมม้วนเปล่า) เว้นว่างไว้เพื่อใช้น้ำหนักตามเส้นพลาสติก และระบุเมื่อม้วนนี้แตกต่างจากปกติ — เช่น ม้วนแบ่ง หรือเส้นพลาสติกเดียวกันแต่ซื้อแบบม้วนขนาดใหญ่กว่า",
"spool.form.measurementType.length": "ความยาว",
"spool.form.measurementType.weight": "น้ำหนัก",
"spool.spool": "ม้วนพลาสติก",
- "topbar.addSpools": "",
- "topbar.searchPlaceholder": "",
+ "topbar.addSpools": "เพิ่มม้วนพลาสติก",
+ "topbar.searchPlaceholder": "ค้นหา — เช่น \"red\" หรือ \"pla\"",
"unknown": "ไม่ทราบ",
- "validation.hexDigits": "",
- "validation.maxChars": "",
- "validation.mustBeGt": "",
- "validation.mustBeMax": "",
- "validation.mustBeMin": "",
- "validation.mustBeNumber": "",
- "validation.required": "",
+ "validation.hexDigits": "ต้องเป็นรหัสสี Hex 6 หรือ 8 หลัก",
+ "validation.maxChars": "ความยาวต้องไม่เกิน {{max}} ตัวอักษร",
+ "validation.mustBeGt": "ค่าต้องมากกว่า {{value}}",
+ "validation.mustBeMax": "ค่าต้องไม่เกิน {{value}}",
+ "validation.mustBeMin": "ค่าต้องไม่น้อยกว่า {{value}}",
+ "validation.mustBeNumber": "ต้องเป็นตัวเลขเท่านั้น",
+ "validation.required": "จำเป็นต้องระบุ",
"vendor.fields.comment": "หมายเหตุ",
"vendor.fields.emptySpoolWeight": "น้ำหนักม้วนพลาสติกเปล่า",
"vendor.fields.externalId": "รหัสภายนอก",
diff --git a/client_v2/src/lib/api/spoolSource.ts b/client_v2/src/lib/api/spoolSource.ts
index 812df16f..946f6b07 100644
--- a/client_v2/src/lib/api/spoolSource.ts
+++ b/client_v2/src/lib/api/spoolSource.ts
@@ -23,7 +23,7 @@ import {
} from './map';
import { inventory } from '$lib/stores/inventory.svelte';
import { isDateFilterProp, parseDateFilter, resolveDateFilter } from '$lib/library/dateFilter';
-import { filamentLabel } from '$lib/utils/library';
+import { filamentLabel, type FilterOption } from '$lib/utils/library';
import type { EntityType } from './fields';
import { type ExternalFilament } from './external';
import { searchAll } from './search';
@@ -493,20 +493,30 @@ class HttpSpoolSource {
return getJson('/material');
}
/**
- * Every filament as a `{ value: id, label }` option for the "filament" filter,
- * so a spool listing can be narrowed to one specific filament (e.g. a given
- * colour from a given manufacturer). Filaments are cached so the chosen chip
- * can render its label from the reactive store.
+ * Every filament as an option for the "filament" filter, so a spool listing can
+ * be narrowed to one specific filament (e.g. a given colour from a given
+ * manufacturer). Each option carries the filament's colours and material as
+ * well as its label, since the menu shows all three. Filaments are cached so
+ * the chosen chip can render its label from the reactive store.
*/
- async filamentOptions(): Promise<{ value: string; label: string }[]> {
+ async filamentOptions(): Promise {
const items = await getJson('/filament');
const filaments = items.map((f) => {
if (f.vendor) inventory.upsertVendor(mapVendor(f.vendor));
return mapFilament(f);
});
inventory.upsertFilaments(filaments);
+ // The label already carries the manufacturer, so the material is what's left
+ // to tell two same-named filaments apart; the colors are what the eye goes
+ // to first. Both are free here — this fetches whole filaments anyway.
return filaments
- .map((f) => ({ value: f.id, label: filamentLabel(f, inventory.vendorOf(f)) }))
+ .map((f) => ({
+ value: f.id,
+ label: filamentLabel(f, inventory.vendorOf(f)),
+ meta: f.material,
+ colors: f.colors,
+ direction: f.multiColorDirection
+ }))
.sort((a, b) => a.label.localeCompare(b.label));
}
/** Distinct values currently stored for a scalar extra field (text/single-choice). */
diff --git a/client_v2/src/lib/components/library/ListToolbar.svelte b/client_v2/src/lib/components/library/ListToolbar.svelte
index 52fa449c..b721bb00 100644
--- a/client_v2/src/lib/components/library/ListToolbar.svelte
+++ b/client_v2/src/lib/components/library/ListToolbar.svelte
@@ -11,9 +11,10 @@
withinLast,
type DateFilterProp
} from '$lib/library/dateFilter';
- import { sortDefs, filamentLabel, type SortDef } from '$lib/utils/library';
+ import { sortDefs, filamentLabel, type FilterOption, type SortDef } from '$lib/utils/library';
import { filterByQuery, matchesTerms, searchTerms } from '$lib/utils/match';
import MenuSearch from '../MenuSearch.svelte';
+ import Swatch from '../Swatch.svelte';
import { spoolSource } from '$lib/api/spoolSource';
import { inventory } from '$lib/stores/inventory.svelte';
import { fields } from '$lib/stores/fields.svelte';
@@ -63,10 +64,6 @@
fields.ensure('vendor');
});
- interface FilterOption {
- value: string;
- label: string;
- }
// Most filters pick from a set of values the API can enumerate; a date filter
// picks a range instead, so it gets a panel of its own rather than an option
// list (see library/dateFilter for the grammar behind it).
@@ -229,6 +226,14 @@
return parsed?.kind === 'range' ? parsed : null;
});
+ // The values this property already filters by. A filter's chip sits in the
+ // toolbar behind the open menu, which is no help when the list is long and the
+ // menu covers it, so the list says so itself (#1090). Values only: a date
+ // filter holds one range at a time, so its presets are a choice, not a set.
+ let activeValues = $derived(
+ new Set(libraryState.filters.filter((f) => f.prop === filterProp).map((f) => f.value))
+ );
+
async function openProp(category: FilterCategory) {
filterProp = category.key;
// The query that found this property says nothing about its values.
@@ -335,7 +340,11 @@
let noSpoolsMatches = $derived(
libraryState.group === 'filament' && matchesTerms(m['buttons.showNoSpools'](), searchTerms(menuQuery))
);
- let visibleOptions = $derived(filterByQuery(options, menuQuery, (o) => o.label));
+ // An option's secondary text is on screen, so it has to be searchable: typing
+ // "petg" against a list that visibly says PETG must not come back empty.
+ let visibleOptions = $derived(
+ filterByQuery(options, menuQuery, (o) => (o.meta ? `${o.label} ${o.meta}` : o.label))
+ );
let visibleSortSections = $derived(
sortSections
.map((sec) => ({ ...sec, items: filterByQuery(sec.items, menuQuery, (it) => it.labelKey()) }))
@@ -352,7 +361,6 @@
const first = visibleOptions[0];
if (!first) return;
params.toggleFilter(filterProp!, first.value);
- close();
}
function chooseFirstSort() {
const first = visibleSortSections[0]?.items[0];
@@ -545,15 +553,32 @@
onenter={chooseFirstOption}
/>
{/if}
+
{#each visibleOptions as opt (opt.value)}
+ {@const checked = activeValues.has(opt.value)}
{:else}
@@ -855,6 +880,13 @@
color: var(--text-faint);
font-size: 11px;
}
+ /* Sits with the label rather than off at the row's right edge: it's there to
+ qualify the name it follows, which is the whole point when two filaments
+ share one. */
+ .mi-sub {
+ color: var(--text-muted);
+ font-size: 11px;
+ }
.mi-dir {
color: var(--accent-muted);
font-size: 11px;
diff --git a/client_v2/src/lib/utils/library.ts b/client_v2/src/lib/utils/library.ts
index ef9c10d4..1d550e98 100644
--- a/client_v2/src/lib/utils/library.ts
+++ b/client_v2/src/lib/utils/library.ts
@@ -164,6 +164,24 @@ export function filamentLabel(filament: Filament, vendor: Vendor): string {
return filament.material?.trim() || `#${filament.id}`;
}
+// --- filter menu metadata -------------------------------------------------
+
+/**
+ * One value on the filter menu's second level. Most properties enumerate bare
+ * strings, where the value is the whole story; a filament is a thing with a look
+ * and a material, and two of them can share a name (#1087, #1088). So an option
+ * carries whatever it has beyond its label and the menu draws what it finds,
+ * which keeps the option list one type however it was built.
+ */
+export interface FilterOption {
+ value: string;
+ label: string;
+ /** Secondary text shown beside the label, and searched along with it. */
+ meta?: string;
+ colors?: string[];
+ direction?: MultiColorDirection;
+}
+
// --- sort menu metadata ---------------------------------------------------
export interface SortDef {
diff --git a/tests_frontend_v2/tests/helpers.ts b/tests_frontend_v2/tests/helpers.ts
index f7663f77..c1db1ac8 100644
--- a/tests_frontend_v2/tests/helpers.ts
+++ b/tests_frontend_v2/tests/helpers.ts
@@ -232,6 +232,13 @@ export async function openToolbarMenu(page: Page, name: "Filter" | "Group" | "So
export async function addFilter(page: Page, property: string, value: string): Promise {
const menu = await openToolbarMenu(page, "Filter");
await menu.getByRole("button", { name: property, exact: true }).click();
- await menu.getByRole("button", { name: value, exact: true }).click();
+ // A value is a checkbox rather than a plain entry: it carries whether it is
+ // already applied, and picking one leaves the menu open so several can be
+ // picked in a row (#1090, #1089).
+ await menu.getByRole("menuitemcheckbox", { name: value, exact: true }).click();
await expect(page.getByRole("button", { name: `${property}: ${value}` })).toBeVisible();
+ // Which means this has to close it again: every caller expects to be handed a
+ // toolbar with nothing covering it, and two of these calls run back to back.
+ await onlyVisible(page.getByRole("button", { name: /^Filter$/ })).click();
+ await expect(menu).toBeHidden();
}