locale: translate all locales (7.6.0) - #9337
Conversation
|
🔍 Automated PR review started. Follow the reviewer discussion here: https://agentic-platform.docker.com/shared/b7b8ae17-8ccb-4378-94bb-67fb50212fe2 |
There was a problem hiding this comment.
🟡 Not ready to approve
Several newly added translations contain clear spelling issues due to missing diacritics/UTF-8 characters (e.g., Turkish, Vietnamese, Slovak, Croatian, German), which should be corrected before merging.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Pull request overview
This PR applies automated translations to the locale/terms/missing/* JSON term files for the 7.6.0 release, filling previously-empty strings across 43 locales so runtime UI messages have localized text.
Changes:
- Filled missing locale term translations (including plural
one/othervariants) across 43 locales. - Added translations for a small set of additional non-plural UI terms (e.g., “Code”, “Items”, “Important”) where they were previously empty.
File summaries
| File | Description |
|---|---|
| locale/terms/missing/zh-TW/zh-TW-1.json | Fill missing zh-TW terms (including pluralized blocks and %d placeholders). |
| locale/terms/missing/zh-CN/zh-CN-1.json | Fill missing zh-CN terms (including pluralized blocks and %d placeholders). |
| locale/terms/missing/vi/vi-1.json | Fill missing Vietnamese pluralized terms. |
| locale/terms/missing/uk/uk-1.json | Fill missing Ukrainian pluralized terms. |
| locale/terms/missing/tr/tr-1.json | Fill missing Turkish pluralized terms. |
| locale/terms/missing/th/th-1.json | Fill missing Thai terms (including pluralized blocks and %d placeholders). |
| locale/terms/missing/te/te-1.json | Fill missing Telugu pluralized terms. |
| locale/terms/missing/ta/ta-1.json | Fill missing Tamil pluralized terms. |
| locale/terms/missing/sw/sw-1.json | Fill missing Swahili pluralized terms. |
| locale/terms/missing/sv/sv-1.json | Fill missing Swedish pluralized terms. |
| locale/terms/missing/sq/sq-1.json | Fill missing Albanian pluralized terms. |
| locale/terms/missing/sk/sk-1.json | Fill missing Slovak pluralized terms. |
| locale/terms/missing/ru/ru-1.json | Fill missing Russian pluralized terms. |
| locale/terms/missing/ro/ro-1.json | Fill missing Romanian terms (includes a few additional non-plural keys). |
| locale/terms/missing/pt/pt-1.json | Fill missing Portuguese (pt) pluralized terms. |
| locale/terms/missing/pt-br/pt-br-1.json | Fill missing Portuguese (pt-BR) pluralized terms. |
| locale/terms/missing/pl/pl-1.json | Fill missing Polish pluralized terms. |
| locale/terms/missing/nl/nl-1.json | Fill missing Dutch terms (includes a few additional non-plural keys). |
| locale/terms/missing/nb/nb-1.json | Fill missing Norwegian Bokmål pluralized terms. |
| locale/terms/missing/ml/ml-1.json | Fill missing Malayalam pluralized terms. |
| locale/terms/missing/ko/ko-1.json | Fill missing Korean pluralized terms. |
| locale/terms/missing/ja/ja-1.json | Fill missing Japanese terms (including pluralized blocks and %d placeholders). |
| locale/terms/missing/it/it-1.json | Fill missing Italian terms (includes a few additional non-plural keys). |
| locale/terms/missing/id/id-1.json | Fill missing Indonesian pluralized terms. |
| locale/terms/missing/hu/hu-1.json | Fill missing Hungarian pluralized terms. |
| locale/terms/missing/hr/hr-1.json | Fill missing Croatian pluralized terms. |
| locale/terms/missing/hi/hi-1.json | Fill missing Hindi pluralized terms. |
| locale/terms/missing/he/he-1.json | Fill missing Hebrew pluralized terms. |
| locale/terms/missing/fr/fr-1.json | Fill missing French terms (includes a few additional non-plural keys). |
| locale/terms/missing/fil/fil-1.json | Fill missing Filipino/Tagalog terms (includes multiple additional non-plural keys). |
| locale/terms/missing/fi/fi-1.json | Fill missing Finnish pluralized terms. |
| locale/terms/missing/et/et-1.json | Fill missing Estonian pluralized terms. |
| locale/terms/missing/es/es-1.json | Fill missing Spanish pluralized terms. |
| locale/terms/missing/es-SV/es-SV-1.json | Fill missing Spanish (El Salvador) pluralized terms. |
| locale/terms/missing/es-MX/es-MX-1.json | Fill missing Spanish (Mexico) pluralized terms. |
| locale/terms/missing/es-CO/es-CO-1.json | Fill missing Spanish (Colombia) pluralized terms. |
| locale/terms/missing/es-AR/es-AR-1.json | Fill missing Spanish (Argentina) pluralized terms. |
| locale/terms/missing/el/el-1.json | Fill missing Greek pluralized terms. |
| locale/terms/missing/de/de-1.json | Fill missing German terms (includes a few additional non-plural keys). |
| locale/terms/missing/cs/cs-1.json | Fill missing Czech terms (includes a few additional non-plural keys). |
| locale/terms/missing/ar/ar-1.json | Fill missing Arabic pluralized terms. |
| locale/terms/missing/am/am-1.json | Fill missing Amharic pluralized terms. |
| locale/terms/missing/af/af-1.json | Fill missing Afrikaans terms (includes a few additional non-plural keys). |
Review details
Suppressed comments (5)
locale/terms/missing/tr/tr-1.json:12
- Same Turkish diacritics issue repeats in the plural ("other") block; both blocks should use proper Turkish characters for readability.
locale/terms/missing/vi/vi-1.json:12 - Same Vietnamese diacritics issue repeats in the plural ("other") block; both blocks should use proper Vietnamese spelling.
locale/terms/missing/sk/sk-1.json:12 - Slovak plural ("other") block also has missing diacritics (e.g., Skopírovaných/členov/príjemcov/príliš/Použite/Kopírovať/Zostáva).
locale/terms/missing/hr/hr-1.json:12 - Croatian plural ("other") block repeats the missing-diacritics spelling issues (članova, previše, e-pošte, još).
"Copied {{count}} members": "Kopirano {{count}} clanova",
"This list has {{count}} recipients — too many for a mailto: link. Use Copy Addresses instead.": "Ovaj popis ima {{count}} primatelja — previse za mailto: vezu. Umjesto toga upotrijebite Kopiraj adrese.",
"Too many recipients for email client ({{count}} > {{max}}). Use Copy Addresses instead.": "Previse primatelja za klijent e-poste ({{count}} > {{max}}). Umjesto toga upotrijebite Kopiraj adrese.",
"{{count}} min left": "Jos {{count}} min"
locale/terms/missing/de/de-1.json:12
- German plural ("other") block repeats the ASCII transliteration (Empfaenger/fuer); should be updated consistently to proper umlauts.
"This list has {{count}} recipients — too many for a mailto: link. Use Copy Addresses instead.": "Diese Liste hat {{count}} Empfaenger - zu viele fuer einen mailto:-Link. Verwenden Sie stattdessen Adressen kopieren.",
"Too many recipients for email client ({{count}} > {{max}}). Use Copy Addresses instead.": "Zu viele Empfaenger fuer den E-Mail-Client ({{count}} > {{max}}). Verwenden Sie stattdessen Adressen kopieren.",
- Files reviewed: 43/43 changed files
- Comments generated: 5
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
| "Copied {{count}} members": "{{count}} uye kopyalandi", | ||
| "This list has {{count}} recipients — too many for a mailto: link. Use Copy Addresses instead.": "Bu listede {{count}} alici var — mailto: baglantisi icin cok fazla. Bunun yerine Adresleri Kopyala'yi kullanin.", | ||
| "Too many recipients for email client ({{count}} > {{max}}). Use Copy Addresses instead.": "E-posta istemcisi icin cok fazla alici ({{count}} > {{max}}). Bunun yerine Adresleri Kopyala'yi kullanin.", | ||
| "{{count}} min left": "{{count}} dakika kaldi" |
| "Copied {{count}} members": "Da sao chep {{count}} thanh vien", | ||
| "This list has {{count}} recipients — too many for a mailto: link. Use Copy Addresses instead.": "Danh sach nay co {{count}} nguoi nhan — qua nhieu cho lien ket mailto:. Vui long su dung Sao chep dia chi.", | ||
| "Too many recipients for email client ({{count}} > {{max}}). Use Copy Addresses instead.": "Qua nhieu nguoi nhan cho ung dung email ({{count}} > {{max}}). Vui long su dung Sao chep dia chi.", | ||
| "{{count}} min left": "Con {{count}} phut" |
| "Copied {{count}} members": "Skopirovaný {{count}} clen", | ||
| "This list has {{count}} recipients — too many for a mailto: link. Use Copy Addresses instead.": "Tento zoznam ma {{count}} prijemcu — prilis vela pre odkaz mailto:. Pouzite namiesto toho Kopirovat adresy.", | ||
| "Too many recipients for email client ({{count}} > {{max}}). Use Copy Addresses instead.": "Prilis vela prijemcov pre e-mailoveho klienta ({{count}} > {{max}}). Pouzite namiesto toho Kopirovat adresy.", | ||
| "{{count}} min left": "Zostava {{count}} min" |
| "Copied {{count}} members": "Kopiran {{count}} clan", | ||
| "This list has {{count}} recipients — too many for a mailto: link. Use Copy Addresses instead.": "Ovaj popis ima {{count}} primatelja — previse za mailto: vezu. Umjesto toga upotrijebite Kopiraj adrese.", | ||
| "Too many recipients for email client ({{count}} > {{max}}). Use Copy Addresses instead.": "Previse primatelja za klijent e-poste ({{count}} > {{max}}). Umjesto toga upotrijebite Kopiraj adrese.", | ||
| "{{count}} min left": "Jos {{count}} min" |
| "This list has {{count}} recipients — too many for a mailto: link. Use Copy Addresses instead.": "Diese Liste hat {{count}} Empfaenger - zu viele fuer einen mailto:-Link. Verwenden Sie stattdessen Adressen kopieren.", | ||
| "Too many recipients for email client ({{count}} > {{max}}). Use Copy Addresses instead.": "Zu viele Empfaenger fuer den E-Mail-Client ({{count}} > {{max}}). Verwenden Sie stattdessen Adressen kopieren.", |
DawoudIO
left a comment
There was a problem hiding this comment.
🤖 Automated PR Review — this comment was posted by the pr-reviewer bot, not by a human or the implementer agent
Assessment: 🟡 NEEDS ATTENTION
This PR fills in 115 previously-empty translation strings across 43 locales — a valuable contribution. However, 5 locales have systematic encoding issues where language-specific characters were replaced with ASCII substitutes, making the translations incorrect or unreadable for native speakers.
Issues Found
| Locale | File | Problem |
|---|---|---|
| Vietnamese (vi) | vi/vi-1.json |
All tone marks stripped — text is meaningless without diacritics |
| Turkish (tr) | tr/tr-1.json |
All Turkish characters missing (ü, ı, ğ, ş, ç, ö) |
| Slovak (sk) | sk/sk-1.json |
Wrong word "Zostava" (noun: lineup) vs. "Zostáva" (verb: remains) + widespread missing diacritics |
| Croatian (hr) | hr/hr-1.json |
All Croatian diacritics missing (č, š, ž) |
| German (de) | de/de-1.json |
ASCII substitutions for umlauts: "Empfaenger"→"Empfänger", "fuer"→"für" |
These appear to be artifacts of the automated translation script stripping non-ASCII characters before writing the JSON files. The remaining 38 locales use correct UTF-8 characters (Greek, Arabic, Hebrew, Cyrillic, CJK scripts all look correct in the diff).
Suggested Fix
Re-run the translation script for the 5 affected locales ensuring UTF-8 output is preserved, or patch the strings directly in the JSON files.
CI: all 7 checks passed ✅
| "This list has {{count}} recipients — too many for a mailto: link. Use Copy Addresses instead.": "", | ||
| "Too many recipients for email client ({{count}} > {{max}}). Use Copy Addresses instead.": "", | ||
| "{{count}} min left": "" | ||
| "Copied {{count}} members": "Da sao chep {{count}} thanh vien", |
There was a problem hiding this comment.
🤖 Automated PR Review — this comment was posted by the pr-reviewer bot, not by a human or the implementer agent
[MEDIUM] Vietnamese translations are ASCII-only — all tone marks stripped
Every string in this file uses plain ASCII, completely removing Vietnamese diacritics and tone marks. Vietnamese is a tonal language where these marks are not optional — they change word meaning entirely.
Examples from this file:
"Da sao chep"→ should be"Đã sao chép"("Đã" = past tense; "Da" = skin)"thanh vien"→ should be"thành viên"(member)"qua nhieu"→ should be"quá nhiều"(too many)"Con {{count}} phut"→ should be"Còn {{count}} phút"(minutes left)
The translations are unreadable/incorrect to Vietnamese speakers as-is. Please re-run the translation script with UTF-8 output preserved for this locale.
| "This list has {{count}} recipients — too many for a mailto: link. Use Copy Addresses instead.": "", | ||
| "Too many recipients for email client ({{count}} > {{max}}). Use Copy Addresses instead.": "", | ||
| "{{count}} min left": "" | ||
| "Copied {{count}} members": "{{count}} uye kopyalandi", |
There was a problem hiding this comment.
🤖 Automated PR Review — this comment was posted by the pr-reviewer bot, not by a human or the implementer agent
[MEDIUM] Turkish translations strip all Turkish-specific characters
All Turkish diacritics are replaced with ASCII equivalents throughout this file:
"uye"→ should be"üye"(member)"alici"→ should be"alıcı"(recipient)"baglantisi"→ should be"bağlantısı"(link/connection)"icin"→ should be"için"(for)"cok"→ should be"çok"(too/many)"kullanin"→ should be"kullanın"(use)"kaldi"→ should be"kaldı"(left/remaining)
Turkish uses ü, ö, ç, ş, ğ, and dotless-ı as distinct letters. Please re-run with proper UTF-8 encoding for this locale.
| "This list has {{count}} recipients — too many for a mailto: link. Use Copy Addresses instead.": "", | ||
| "Too many recipients for email client ({{count}} > {{max}}). Use Copy Addresses instead.": "", | ||
| "{{count}} min left": "" | ||
| "Copied {{count}} members": "Skopirovaný {{count}} clen", |
There was a problem hiding this comment.
🤖 Automated PR Review — this comment was posted by the pr-reviewer bot, not by a human or the implementer agent
[MEDIUM] Slovak: wrong word "Zostava" + widespread missing diacritics
Two issues in this file:
-
Wrong word:
"Zostava {{count}} min"uses "Zostava" — a Slovak noun meaning "lineup" or "formation" (e.g., a sports roster). For "minutes remaining", the correct word is the verb"Zostáva"(3rd person of zostávať = to remain):"Zostáva {{count}} min". -
Missing diacritics throughout:
"clen"→"člen"(member)"prilis vela"→"príliš veľa"(too many)"Kopirovat"→"Kopírovať"(to copy)"prijemcu"→"príjemcu"(recipient)"Pouzite"→"Použite"(use/utilize)
| "This list has {{count}} recipients — too many for a mailto: link. Use Copy Addresses instead.": "", | ||
| "Too many recipients for email client ({{count}} > {{max}}). Use Copy Addresses instead.": "", | ||
| "{{count}} min left": "" | ||
| "Copied {{count}} members": "Kopiran {{count}} clan", |
There was a problem hiding this comment.
🤖 Automated PR Review — this comment was posted by the pr-reviewer bot, not by a human or the implementer agent
[MEDIUM] Croatian translations strip diacritics (č, š, ž) throughout
Croatian diacritics are entirely missing from all strings in this file:
"clan"→"član"(member)"clanova"→"članova"(members, genitive plural)"previse"→"previše"(too many)"e-poste"→"e-pošte"(email, genitive)"Jos"→"Još"(still/remaining)
In Croatian orthography, č, š, and ž are distinct letters — not stylistic variants. The current text is misspelled.
| "Too many recipients for email client ({{count}} > {{max}}). Use Copy Addresses instead.": "", | ||
| "{{count}} min left": "" | ||
| "Copied {{count}} members": "{{count}} Gemeindemitglied kopiert", | ||
| "This list has {{count}} recipients — too many for a mailto: link. Use Copy Addresses instead.": "Diese Liste hat {{count}} Empfaenger - zu viele fuer einen mailto:-Link. Verwenden Sie stattdessen Adressen kopieren.", |
There was a problem hiding this comment.
🤖 Automated PR Review — this comment was posted by the pr-reviewer bot, not by a human or the implementer agent
[MEDIUM] German translations use ASCII substitutes for umlauts
Two strings in both one and other blocks use old-style ASCII umlaut substitutions:
"Empfaenger"→ should be"Empfänger"(recipients)"fuer"→ should be"für"(for)
Example: "Diese Liste hat {{count}} Empfaenger - zu viele fuer einen mailto:-Link." should be "Diese Liste hat {{count}} Empfänger – zu viele für einen mailto:-Link."
The "{{count}} Min. verbleibend" string is correct. Only the two "recipients" strings need fixing.
Automated locale translation for ChurchCRM 7.6.0.
Translation Summary
Total: 43 locales, 115 terms translated
Changes
All translations applied via
locale/scripts/locale-translate.js --apply. Plural forms (one/other) handled correctly per locale. Church-appropriate vocabulary used throughout with denomination context.Next Steps
npm run locale:upload:missing -- --yes(requires POEDITOR_TOKEN — maintainer runs manually after merge)