Updated translations

This commit is contained in:
Lauri Ojansivu committed 2026-10-14 17:29:25 +03:00
1 parent 030c8c524c
commit b7346d2429
29 files changed
+871 -792

No files matched your search

+1 -1
View File
@@ -7,4 +7,4 @@
.column-sets-column { min-width: 14em; max-width: 18em; background: rgba(0, 0, 0, 0.05); border-radius: 4px; padding: 0.4em; }
.column-sets-column-header { font-weight: bold; margin-bottom: 0.4em; display: flex; gap: 0.4em; align-items: center; }
.column-sets-card { background: #fff; border-radius: 3px; padding: 0.35em 0.5em; margin-bottom: 0.35em; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.15); cursor: grab; }
.column-sets-card .card-label { font-size: 0.75em; margin-right: 0.2em; }
.column-sets-card .card-label { font-size: 0.75em; margin-inline-end: 0.2em; }
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -1098,7 +1098,7 @@
"instance-editing-desc": "非成员的已登录用户可以添加、编辑、移动和评论卡片,并在这样做时成为普通成员。",
"board-instance-info": "此看板将对<strong>所有已登录的用户</strong>可见。",
"profile": "轮廓",
"public": "民众",
"public": "公开",
"public-desc": "该委员会是公开的。任何知道该链接的人都可以看到它,并且会显示在 Google 等搜索引擎中。只有添加到论坛的人员才能编辑。",
"custom-private-desc": "自定义 私人的 描述",
"custom-private-desc-placeholder": "留空以使用默认 私人的 看板描述",
+1 -1
View File
@@ -1120,7 +1120,7 @@
"restore": "Restaurar",
"rescue-card-description": "Mostrar el diálogo de emergencia antes de cerrar las descripciones de las tarjetas no guardada",
"rescue-card-description-dialogue": "¿Sobreescribir la descripción actual de la tarjeta con sus cambios?",
"save": "Añadir",
"save": "Guardar",
"search": "Buscar",
"rules": "Reglas",
"search-cards": "Buscar entre los títulos, las descripciones de las tarjetas/listas y los campos personalizados en este tablero.",
+1 -1
View File
@@ -1120,7 +1120,7 @@
"restore": "Restaurar",
"rescue-card-description": "Mostrar el diálogo de emergencia antes de cerrar las descripciones de las tarjetas no guardada",
"rescue-card-description-dialogue": "¿Sobreescribir la descripción actual de la tarjeta con sus cambios?",
"save": "Añadir",
"save": "Guardar",
"search": "Buscar",
"rules": "Reglas",
"search-cards": "Buscar entre los títulos, las descripciones de las tarjetas/listas y los campos personalizados en este tablero.",
+1 -1
View File
@@ -1120,7 +1120,7 @@
"restore": "Restaurar",
"rescue-card-description": "Mostrar el diálogo de emergencia antes de cerrar las descripciones de las tarjetas no guardada",
"rescue-card-description-dialogue": "¿Sobreescribir la descripción actual de la tarjeta con sus cambios?",
"save": "Añadir",
"save": "Guardar",
"search": "Buscar",
"rules": "Reglas",
"search-cards": "Buscar entre los títulos, las descripciones de las tarjetas/listas y los campos personalizados en este tablero.",
+1 -1
View File
@@ -1120,7 +1120,7 @@
"restore": "Restaurar",
"rescue-card-description": "Mostrar el diálogo de emergencia antes de cerrar las descripciones de las tarjetas no guardada",
"rescue-card-description-dialogue": "¿Sobreescribir la descripción actual de la tarjeta con sus cambios?",
"save": "Añadir",
"save": "Guardar",
"search": "Buscar",
"rules": "Reglas",
"search-cards": "Buscar entre los títulos, las descripciones de las tarjetas/listas y los campos personalizados en este tablero.",
+1 -1
View File
@@ -1120,7 +1120,7 @@
"restore": "Restaurar",
"rescue-card-description": "Mostrar el diálogo de emergencia antes de cerrar las descripciones de las tarjetas no guardada",
"rescue-card-description-dialogue": "¿Sobreescribir la descripción actual de la tarjeta con sus cambios?",
"save": "Añadir",
"save": "Guardar",
"search": "Buscar",
"rules": "Reglas",
"search-cards": "Buscar entre los títulos, las descripciones de las tarjetas/listas y los campos personalizados en este tablero.",
+1 -1
View File
@@ -1120,7 +1120,7 @@
"restore": "Restaurar",
"rescue-card-description": "Mostrar el diálogo de emergencia antes de cerrar las descripciones de las tarjetas no guardada",
"rescue-card-description-dialogue": "¿Sobreescribir la descripción actual de la tarjeta con sus cambios?",
"save": "Añadir",
"save": "Guardar",
"search": "Buscar",
"rules": "Reglas",
"search-cards": "Buscar entre los títulos, las descripciones de las tarjetas/listas y los campos personalizados en este tablero.",
+1 -1
View File
@@ -1120,7 +1120,7 @@
"restore": "Restaurar",
"rescue-card-description": "Mostrar el diálogo de emergencia antes de cerrar las descripciones de las tarjetas no guardada",
"rescue-card-description-dialogue": "¿Sobreescribir la descripción actual de la tarjeta con sus cambios?",
"save": "Añadir",
"save": "Guardar",
"search": "Buscar",
"rules": "Reglas",
"search-cards": "Buscar entre los títulos, las descripciones de las tarjetas/listas y los campos personalizados en este tablero.",
+1 -1
View File
@@ -1089,7 +1089,7 @@
"preview": "Eelvaade",
"previewAttachedImagePopup-title": "Eelvaade",
"previewClipboardImagePopup-title": "Eelvaade",
"private": "Eraldi",
"private": "Privaatne",
"private-desc": "See foorum on privaatne. Seda saavad vaadata ja muuta ainult tahvlile lisatud inimesed.",
"instance": "Sisselogitud kasutajad",
"instance-desc": "Kõik sellesse WeKani sisse loginud kasutajad saavad seda tahvlit vaadata. Sisse logimata inimestele seda kunagi ei näidata. Muuta saavad ainult tahvlile lisatud inimesed.",
+1 -1
View File
@@ -1238,7 +1238,7 @@
"wipLimitErrorPopup-dialog-pt1": "تعداد وظایف در این لیست بیشتر از محدودیت WIP تعریف‌شده شماست.",
"wipLimitErrorPopup-dialog-pt2": "لطفاً برخی وظایف را از این لیست خارج کنید یا محدودیت WIP بالاتری تنظیم کنید.",
"admin-panel": "پیشخوان مدیریتی",
"settings": "تنظمات",
"settings": "تنظیمات",
"attachment-transfer-limits-title": "محدودیت‌های اندازه فایل ضمیمه و API",
"attachment-limits": "محدودیت‌ها",
"attachment-transfer-limits-description": "حداکثر محدودیت اندازه فایل برای بارگذاری و دانلود را پیکربندی کنید. بافر انتقال API سقف‌های ایمنی جداگانه‌ای در سمت سرور دارد.",
+1 -1
View File
@@ -1237,7 +1237,7 @@
"wipLimitErrorPopup-title": "अमान्य WIP सीमा",
"wipLimitErrorPopup-dialog-pt1": "The number of tasks अंदर में यह सूची is higher than the WIP limit you've defined.",
"wipLimitErrorPopup-dialog-pt2": "Please स्थानांतरित some tasks out of यह list, or set एक higher WIP limit.",
"admin-panel": "व्यवस्थापक Panel",
"admin-panel": "व्यवस्थापक पैनल",
"settings": "सेटिंग्स",
"attachment-transfer-limits-title": "संलग्नक और API फ़ाइल आकार सीमाएं",
"attachment-limits": "सीमाएं",
+1 -1
View File
@@ -211,7 +211,7 @@
"add-template-container": "შაბლონების კონტეინერის დამატება",
"assign-member": "უფლებამოსილი წევრი",
"attached": "მიბმული",
"attachment": "მიბმული ფიალი",
"attachment": "მიბმული ფაილი",
"attachment-delete-pop": "მიბმული ფაილის წაშლა მუდმივია. შეუძლებელია მისი უკან დაბრუნება.",
"attachment-soft-delete-pop": "მიბმული ფაილი ამ ბარათიდან იშლება, ხოლო თავად ფაილი ინახება. ყველას, ვისაც ბარათის რედაქტირება შეუძლია, შეუძლია მისი აღდგენა ბარათის ისტორიიდან.",
"attachmentDeletePopup-title": "გსურთ მიბმული ფაილის წაშლა?",
+2 -2
View File
@@ -2151,7 +2151,7 @@
"sort-boards-title-desc": "Nosaukums (Z → A)",
"sort-is-on": "Rūšiavimas įjungtas",
"cardsSortPopup-title": "Rūšiuoti korteles",
"due-date": "Terminas",
"due-date": "Termiņš",
"due-complete": "Termiņš pabeigts",
"card-mark-complete": "Atzīmēt kā pabeigtu",
"card-mark-incomplete": "Atzīmēt kā nepabeigtu",
@@ -2432,7 +2432,7 @@
"path": "Kelias",
"version-name": "Versija-Pavadinimas",
"size": "Dydis",
"storage": "Sandėliavimas",
"storage": "Krātuve",
"action": "Darbība",
"board-title": "Valdybos pavadinimas",
"board-status": "Tāfeles statuss",
+3 -3
View File
@@ -1083,7 +1083,7 @@
"or": "или",
"page-maybe-private": "Оваа страница можеби е приватна. Можеби ќе можете да ја видите ако <a href='%s'>се најавите</a>.",
"page-not-found": "Страницата не е најдена.",
"password": "Парола",
"password": "Лозинка",
"paste-or-dragdrop": "за да залепите или повлечете и испуштите слика во него (само слики)",
"participating": "Учествујем",
"preview": "Преглед",
@@ -1238,7 +1238,7 @@
"wipLimitErrorPopup-dialog-pt1": "Бројот на задачи во овој список е поголем од ограничувањето WIP што го поставивте.",
"wipLimitErrorPopup-dialog-pt2": "Преместете некои задачи надвор од овој список или поставете повисоко ограничување WIP.",
"admin-panel": "Администраторски панел",
"settings": "Настройки",
"settings": "Поставки",
"attachment-transfer-limits-title": "Ограничувања на големината на датотеки за прилози и API",
"attachment-limits": "Ограничувања",
"attachment-transfer-limits-description": "Конфигурирајте максимални ограничувања на големината на датотеки за прикачувања и преземања. Баферирањето на API преноси има одделни безбедносни ограничувања на страната на серверот.",
@@ -2151,7 +2151,7 @@
"sort-boards-title-desc": "Наслов (Z → A)",
"sort-is-on": "Сортирањето е вклучено",
"cardsSortPopup-title": "Сложи предмете",
"due-date": "По крајњем року",
"due-date": "Краен рок",
"due-complete": "Рок завршен",
"card-mark-complete": "Означи како завршена",
"card-mark-incomplete": "Означи како незавршена",
+1 -1
View File
@@ -247,7 +247,7 @@
"board-nb-stars": "%sbintang",
"board-not-found": "Papan tidak dijumpai",
"board-private-info": "Papan ini akan menjadi <strong>peribadi </strong>.",
"board-public-info": "Panpan ini akan menjadi <strong>Umum </strong>.",
"board-public-info": "Papan ini akan menjadi <strong>Umum</strong>.",
"board-drag-drop-reorder-or-click-open": "Seret dan lepas untuk menyusun semula ikon papan. Klik pada ikon papan untuk papar.",
"board-open-and-move-between-remaining-and-workspaces": "Klik untuk membuka papan. Gunakan pemegang seret untuk menetapkan papan ke __workspaces__ (lepaskan pada ruang kerja di bar sisi).",
"boardChangeColorPopup-title": "Ubah latar belakang Papan",
+1 -1
View File
@@ -1083,7 +1083,7 @@
"or": "o",
"page-maybe-private": "Aquesta pagina es benlèu privada. La poiretz benlèu veire en vos <a href='%s'>connectant</a>.",
"page-not-found": "Pagina pas trapada",
"password": "Mot de Santa-Clara",
"password": "Senhal",
"paste-or-dragdrop": "per pegar, o lisatz e depausatz un fichièr imatge aicí (imatges solament)",
"participating": "Participant",
"preview": "Apercebut",
+8 -8
View File
@@ -271,7 +271,7 @@
"zoom-out": "Micșorează",
"zoom-level": "Nivel de zoom",
"enter-zoom-level": "Introduceți nivelul de zoom (50-300%):",
"board-view-cal": "Calendario",
"board-view-cal": "Calendar",
"board-view-calendar-mode": "Mod calendar",
"board-view-multiboard-cal": "Calendar pentru mai multe panouri",
"board-view-swimlanes": "Swimlane",
@@ -356,7 +356,7 @@
"swimlane-archive-pop": "Culoarul nu va mai fi vizibil pe panou după arhivare.",
"swimlane-archive-suggest": "Puteți restaura ulterior culoarul din Arhivă, în Setările panoului.",
"swimlaneArchivePopup-title": "Arhivați culoarul?",
"card-due": "Scadenza",
"card-due": "Scadență",
"checklist-item-assignee": "Cine este responsabil pentru acest element",
"checklist-item-assignee-none": "Nimeni",
"checklistItemAssigneePopup-title": "Responsabil",
@@ -454,10 +454,10 @@
"cardTemplatePopup-title": "Creează șablon",
"cards": "Carduri",
"cards-count": "Carduri",
"cards-count-one": "Scheda",
"cards-count-one": "Card",
"casSignIn": "Autentificare cu CAS",
"samlSignIn": "Autentificare cu SAML",
"cardType-card": "Scheda",
"cardType-card": "Card",
"cardType-linkedCard": "Card asociat",
"cardType-linkedBoard": "Panou asociat",
"change": "Schimbă",
@@ -723,7 +723,7 @@
"export": "Exportă",
"export-board": "Exportă panoul",
"export-board-without-attachments": "fără atașamente",
"export-ical-feed": "Calendario (iCal)",
"export-ical-feed": "Flux de calendar (iCal)",
"user-can-not-export-excel": "Utilizatorul nu poate exporta în Excel",
"export-card": "Exportă cardul",
"export-card-pdf": "Esporta scheda in PDF",
@@ -1023,7 +1023,7 @@
"list-delete-suggest-archive": "Puteți muta o listă în arhivă pentru a o elimina din panou și a păstra activitatea.",
"lists": "Liste",
"swimlanes": "Swimlane",
"calendar": "Calendario",
"calendar": "Calendar",
"gantt": "Gantt",
"log-out": "Deconectare",
"log-out-everywhere": "Deconectare de pretutindeni",
@@ -1643,7 +1643,7 @@
"r-when-a-attach": "Când un atașament",
"r-when-a-card-matches-advanced-filter": "Când un card corespunde filtrului avansat",
"r-when-a-card-title-or-description-contains": "Când titlul sau descrierea cardului conține",
"r-when-a-due-date-changed": "Scadenza: data a fost modificată",
"r-when-a-due-date-changed": "Când data scadentă este setată sau modificată",
"r-when-a-start-date-changed": "Inizio: data a fost modificată",
"r-when-a-end-date-changed": "Fine: data a fost modificată",
"r-when-a-received-date-changed": "Ricevuta: data a fost modificată",
@@ -3185,7 +3185,7 @@
"flow-target-count": "Carduri țintă",
"flow-finish-days": "Zile până la finalizare",
"flow-finish-date": "Data finalizării",
"flow-target-date": "Scadenza",
"flow-target-date": "Dată țintă",
"flow-capacity": "Cel puțin atâtea carduri",
"flow-history-days": "Zile de istoric",
"flow-beyond-horizon": "Dincolo de orizontul simulării",
+7 -7
View File
@@ -271,7 +271,7 @@
"zoom-out": "Micșorează",
"zoom-level": "Nivel de zoom",
"enter-zoom-level": "Introduceți nivelul de zoom (50-300%):",
"board-view-cal": "Calendario",
"board-view-cal": "Calendar",
"board-view-calendar-mode": "Mod calendar",
"board-view-multiboard-cal": "Calendar (toate panourile)",
"board-view-swimlanes": "Swimlane",
@@ -356,7 +356,7 @@
"swimlane-archive-pop": "Culoarul nu va mai fi vizibil pe panou după arhivare.",
"swimlane-archive-suggest": "Puteți restaura ulterior culoarul din Arhivă, în Setările panoului.",
"swimlaneArchivePopup-title": "Arhivați culoarul?",
"card-due": "Scadenza",
"card-due": "Scadență",
"checklist-item-assignee": "Cine este responsabil pentru acest element",
"checklist-item-assignee-none": "Nimeni",
"checklistItemAssigneePopup-title": "Responsabil",
@@ -454,10 +454,10 @@
"cardTemplatePopup-title": "Creează un șablon",
"cards": "Carduri",
"cards-count": "Carduri",
"cards-count-one": "Scheda",
"cards-count-one": "Card",
"casSignIn": "Autentificare cu CAS",
"samlSignIn": "Autentificare cu SAML",
"cardType-card": "Scheda",
"cardType-card": "Card",
"cardType-linkedCard": "Card asociat",
"cardType-linkedBoard": "Panou asociat",
"change": "Schimbă",
@@ -723,7 +723,7 @@
"export": "Exportă",
"export-board": "Exportă panoul",
"export-board-without-attachments": "fără atașamente",
"export-ical-feed": "Calendario (iCal)",
"export-ical-feed": "Flux de calendar (iCal)",
"user-can-not-export-excel": "Utilizatorul nu poate exporta în Excel",
"export-card": "Exportă cardul",
"export-card-pdf": "Esporta scheda in PDF",
@@ -1023,7 +1023,7 @@
"list-delete-suggest-archive": "Puteți muta o listă în arhivă pentru a o elimina din panou și a păstra activitatea.",
"lists": "Liste",
"swimlanes": "Swimlane",
"calendar": "Calendario",
"calendar": "Calendar",
"gantt": "Gantt",
"log-out": "Deconectare",
"log-out-everywhere": "Deconectare peste tot",
@@ -3185,7 +3185,7 @@
"flow-target-count": "Carduri țintă",
"flow-finish-days": "Zile până la finalizare",
"flow-finish-date": "Data finalizării",
"flow-target-date": "Scadenza",
"flow-target-date": "Dată țintă",
"flow-capacity": "Cel puțin atâtea carduri",
"flow-history-days": "Zile de istoric",
"flow-beyond-horizon": "Dincolo de orizontul simulării",
+1 -1
View File
@@ -1089,7 +1089,7 @@
"preview": "Hakiki",
"previewAttachedImagePopup-title": "Hakiki",
"previewClipboardImagePopup-title": "Hakiki",
"private": "Privat",
"private": "Binafsi",
"private-desc": "Bodi hii ni ya kibinafsi. Watu walioongezwa kwenye ubao pekee ndio wanaoweza kuitazama na kuihariri.",
"instance": "Watumiaji walioingia",
"instance-desc": "Kila mtumiaji aliyeingia katika WeKan hii anaweza kuona bodi hii. Haionyeshwi kamwe kwa watu ambao hawajaingia. Watu walioongezwa kwenye bodi pekee ndio wanaoweza kuhariri.",
+1 -1
View File
@@ -2432,7 +2432,7 @@
"path": "Hi Xitsonga: mhaka",
"version-name": "mhaka-vito",
"size": "Hi Xitsonga: mhaka",
"storage": "Hi Xitsonga: mhaka",
"storage": "Vuhlayiselo",
"action": "xiendlo",
"board-title": "bodo nhlokomhaka",
"board-status": "bodo xiyimo",
+1 -1
View File
@@ -125,7 +125,7 @@
"unset-default-board-template": "Standart doska shablonini olib tashlash",
"activity-dueDate": "to'lov sanasi tahrirlangan %s / %s",
"activity-endDate": "tahrirlangan tugash sanasi %s / %s",
"add-attachment": "Qo'shiq qo'shish",
"add-attachment": "Ilova qo'shish",
"add-board": "Taxta qo'shish",
"add-template": "Shablon qo'shish",
"add-card": "Karta qo'shish",
+2 -2
View File
@@ -2432,7 +2432,7 @@
"path": "Laluan",
"version-name": "Nama Versi",
"size": "Saiz",
"storage": "Storan",
"storage": "Lưu trữ",
"action": "Hoạt động",
"board-title": "Judul Papan",
"board-status": "Trạng thái bảng",
@@ -2621,7 +2621,7 @@
"sandstorm-migration-success": "Thành công",
"sandstorm-migration-failed": "Thất bại",
"sandstorm-migration-pending": "Chưa di trú",
"sandstorm-storage-item": "Storan",
"sandstorm-storage-item": "Lưu trữ",
"sandstorm-disk-usage": "Sử dụng đĩa",
"sandstorm-raw-mongodb": "Tệp cơ sở dữ liệu MongoDB 3 thô",
"sandstorm-delete-raw-mongodb": "Xóa các tệp cơ sở dữ liệu MongoDB thô",
+1 -1
View File
@@ -1083,7 +1083,7 @@
"or": "אָדער",
"page-maybe-private": "דער בלאַט קען זיין פּריוואַט. איר קען זיין ביכולת צו זען עס דורך <a href='%s'>לאָגינג אין</a>.",
"page-not-found": "בלאַט ניט געפונען.",
"password": "שפּריכוואָרט",
"password": "פּאַראָל",
"paste-or-dragdrop": "צו פּאַפּ, אָדער שלעפּן און פאַלן בילד טעקע (בלויז בילד)",
"participating": "פּאַרטיסאַפּייטינג",
"preview": "פאָרויסיקע ווייַזונג",
+1 -1
View File
@@ -211,7 +211,7 @@
"add-template-container": "新增模板容器",
"assign-member": "指定成員",
"attached": "隨附的",
"attachment": "依戀",
"attachment": "附件",
"attachment-delete-pop": "刪除附件是永久性的。無法撤銷。",
"attachment-soft-delete-pop": "附件會由呢張卡片移除,檔案會保留。任何可以編輯呢張卡片嘅人都可以喺卡片歷史入面恢復佢。",
"attachmentDeletePopup-title": "刪除附件?",
+2 -2
View File
@@ -262,7 +262,7 @@
"boardMenuPopup-title": "ⵜⵉⵙⵖⴰⵍ ⵏ ⵜⴼⵍⵡⵉⵜ",
"allBoardsMenuPopup-title": "ⵜⵉⵙⵖⴰⵍ",
"boardChangeViewPopup-title": "ⵜⴰⵎⵓⵖⵍⵉ ⵏ ⵜⴼⵍⵡⵉⵜ",
"boards": "Tifelwin",
"boards": "ⵜⵉⴼⵍⵡⵉⵏ",
"board-view": "ⵜⴰⵎⵓⵖⵍⵉ ⵏ ⵜⴼⵍⵡⵉⵜ",
"desktop-mode": "ⵜⴰⵍⵖⴰ Desktop",
"mobile-mode": "ⵜⴰⵍⵖⴰ Mobile",
@@ -1986,7 +1986,7 @@
"person": "شخص",
"my-cards": "ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⵉⵏⵓ",
"my-attachments": "ⵜⵉⵙⵉⵡⴰⵢ ⵢⵔⵏⴰⵏ ⵉⵏⵓ",
"card": "Takarḍa",
"card": "ⵜⴰⴽⴰⵔⴹⴰ",
"board-table-card-title-wrap-on": "ⵉⵣⵡⴰⵍⵏ ⵏ ⵜⴽⴰⵕⴹⵉⵡⵉⵏ ⵜⵜⵓⴽⴽⵜⵙⵏ ⴳ ⵓⵎⵎⴰⵙ ⵏ ⵓⴳⴳⴰⵔ ⵏ ⵢⴰⵜ ⵜⵜⴰⵕⵕⴰ. ⵙⵉⵜⵢ ⵉⵏⵏⴰ ⴰⴷ ⵜⵏⵇⵇⵙⵜ ⵙ ⵜⵏⵇⵇⵉⴹⵉⵏ.",
"board-table-card-title-wrap-off": "ⵉⵣⵡⴰⵍⵏ ⵏ ⵜⴽⴰⵕⴹⵉⵡⵉⵏ ⵜⵜⵓⵏⵇⵇⵙⵏ ⵙ ⵜⵏⵇⵇⵉⴹⵉⵏ. ⵙⵉⵜⵢ ⵉⵏⵏⴰ ⴰⴷ ⵜⵜⵓⴽⴽⵜⵙⵏ ⴳ ⵓⴳⴳⴰⵔ ⵏ ⵢⴰⵜ ⵜⵜⴰⵕⵕⴰ.",
"board-table-group-by-swimlane-on": "ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⵜⵜⵓⵙⵎⵓⵏⵏⵜ ⵙ ⵓⴱⵔⵉⴷ. ⵙⵉⵜⵢ ⵉⵏⵏⴰ ⴰⴷ ⵜⵏⵜ ⵜⵙⴽⵏⵜ ⴷ ⵜⴰⵍⵍⵓⵙⵜ ⵜⴰⵣⴰⵍⵍⴰⵏⵜ.",
@@ -1056,6 +1056,9 @@ const LOCALE_INVARIANTS = {
'blockly-MATH_SUBTRACTION_SYMBOL_ARIA', 'blockly-MATH_TRIG_COS',
'blockly-MATH_TRIG_SIN', 'blockly-SHIFT_KEY', 'blockly-SHORTCUTS_GENERAL',
'blockly-TAB_KEY', 'blockly-WINDOWS', 'scrum-sprint',
// Romanian "calendar" and "card" (DEX); the file had the Italian
// "Calendario" and "Scheda" in these.
'calendar', 'board-view-cal', 'cardType-card', 'cards-count-one',
])])),
rup: new Set(['color-indigo', 'color-magenta']),
lld: new Set(['move-progress-file']),
@@ -0,0 +1,76 @@
'use strict';
// Wrong-language values found by the 2026-10-14 translation rounds, replaced
// with the language each locale tag names.
// Run: node tests/wrongLanguageCorrections20261014.test.cjs
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const ROOT = path.join(__dirname, '..');
const locale = tag => JSON.parse(fs.readFileSync(path.join(ROOT, `imports/i18n/data/${tag}.i18n.json`), 'utf8'));
const en = locale('en');
const tokens = value => (String(value).match(/__[A-Za-z0-9_]+__|%(?:\d+\$)?[sd]/g) || []).sort();
(async () => {
// Spanish: "Añadir" is Add, and it was on every Save button.
for (const tag of ['es', 'es-CL', 'es-CO', 'es-LA', 'es-MX', 'es-PY', 'es_CO']) {
assert.equal(locale(tag).save, 'Guardar', tag);
}
console.log(' ok - Spanish Save says Guardar');
// Bosnian is written in Latin script here; its file had 748 Serbian
// Cyrillic values. None is left, and every placeholder survived.
const bs = locale('bs');
const cyrillic = Object.entries(bs).filter(([, v]) => /[Ѐ-ӿ]/.test(v)).map(([k]) => k);
assert.deepEqual(cyrillic, [], 'no Cyrillic in the Bosnian file');
for (const [key, value] of Object.entries(bs)) {
if (key in en) assert.deepEqual(tokens(value), tokens(en[key]), `bs ${key} keeps its placeholders`);
}
assert.equal(bs.storage, 'Skladište');
assert.equal(bs['log-in'], 'Prijavi se');
console.log(' ok - Bosnian in Latin script, placeholders intact');
// One value each, in the locale's own language.
const expected = {
ro: { 'card-due': 'Scadență', calendar: 'Calendar' },
'ro-RO': { 'card-due': 'Scadență', calendar: 'Calendar' },
lv: { storage: 'Krātuve', 'due-date': 'Termiņš' },
'vi-VN': { storage: 'Lưu trữ' },
zgh: { boards: 'ⵜⵉⴼⵍⵡⵉⵏ', card: 'ⵜⴰⴽⴰⵔⴹⴰ' },
fa: { settings: 'تنظیمات' },
mk: { 'due-date': 'Краен рок', settings: 'Поставки', password: 'Лозинка' },
ka: { attachment: 'მიბმული ფაილი' },
'et-EE': { private: 'Privaatne' },
uz: { 'add-attachment': "Ilova qo'shish" },
yue_CN: { attachment: '附件' },
cmn: { public: '公开' },
hi: { 'admin-panel': 'व्यवस्थापक पैनल' },
sw: { private: 'Binafsi' },
yi: { password: 'פּאַראָל' },
oc: { password: 'Senhal' },
ts: { storage: 'Vuhlayiselo' },
};
for (const [tag, values] of Object.entries(expected)) {
const data = locale(tag);
for (const [key, value] of Object.entries(values)) assert.equal(data[key], value, `${tag} ${key}`);
}
assert.match(locale('ms')['board-public-info'], /^Papan ini/, 'not the typo "Panpan"');
console.log(' ok - the single values');
// Negative: the wrong words are gone, whatever key they were under.
const gone = {
ro: /Scadenza|Calendario|Scheda/, 'ro-RO': /Scadenza|Calendario|Scheda/, lv: /Sandėliavimas|\bTerminas\b/,
'vi-VN': /\bStoran\b/, mk: /Настройки|По крајњем/, fa: /تنظمات/, uz: /Qo'shiq qo'shish/,
yue_CN: /依戀/, ts: /Hi Xitsonga: mhaka/, oc: /Santa-Clara/,
};
for (const [tag, pattern] of Object.entries(gone)) {
for (const [key, value] of Object.entries(locale(tag))) assert.doesNotMatch(value, pattern, `${tag} ${key}`);
}
console.log(' ok - and nowhere else in those files');
console.log('\nwrongLanguageCorrections20261014: all tests passed');
})().catch(error => {
console.error(error);
process.exit(1);
});