Guide
Languages and translations
Coincide ships in English and 18 other languages, and Coincide Remote, its iPhone and iPad companion (coming soon), uses the same ones. The translations are machine-made and marked for review in the string catalogs, so corrections from people who speak them are welcome.
Updated
The languages
| Language | Code |
|---|---|
| English (the source) | en |
| Chinese, Simplified | zh-Hans |
| Chinese, Traditional | zh-Hant |
| Dutch | nl |
| French | fr |
| German | de |
| Hindi | hi |
| Indonesian | id |
| Italian | it |
| Japanese | ja |
| Korean | ko |
| Polish | pl |
| Portuguese (Brazil) | pt-BR |
| Russian | ru |
| Spanish (Spain) | es |
| Spanish (Latin America) | es-419 |
| Turkish | tr |
| Ukrainian | uk |
| Vietnamese | vi |
Choosing Coincide’s language
Coincide follows the language you picked for your Mac, or the one you picked for Coincide alone. To use a different language for Coincide only, open System Settings › General › Language & Region, add Coincide under Applications and choose its language, then reopen Coincide. Text that isn’t translated yet appears in English.
Reporting a bad translation
If a translation is wrong, unclear or doesn’t fit, tell us: open a bug report from Help › Report an Issue…, or use /bug in the Discord. Say which language, where in the app the text appears, what it says now and what it should say.
Fixing translations yourself
The strings live in Xcode string catalogs:
| Catalog | What it holds |
|---|---|
Coincide/Resources/Localizable.xcstrings | The Mac app, including the text of its shared frameworks |
CoincideRemote/Localizable.xcstrings | Coincide Remote on iPhone and iPad. A few strings of its shared package are kept here by hand, marked “manual”. |
Coincide/Resources/InfoPlist.xcstrings, CoincideRemote/InfoPlist.xcstrings | The permission texts macOS and iOS show, keyed by their Info.plist key |
scripts/translations.py lists what a language is missing, checks your translations and imports them. For German, for example:
scripts/translations.py missing de > de.json # the strings German lacks, with their English text
# translate de.json into {"key": "translation"}
scripts/translations.py check de de-translated.json
scripts/translations.py import de de-translated.json
Start the command with --catalog <path> to work on another catalog, such as --catalog CoincideRemote/Localizable.xcstrings.
What check enforces
- Placeholders must match the English: the same kinds, in any order only when numbered (
%2$@ … %1$@). - Plurals: a string with one number placeholder becomes
{"plural": {"one": "…", "other": "…"}}, using exactly the plural forms of the language, such as one, few, many and other for Polish, Russian and Ukrainian, or only other for Japanese, Korean, Chinese, Indonesian and Vietnamese.
Imported strings are marked “needs review” in the catalog. Write whole sentences with placeholders rather than pieces joined in code, so each language can order the words its own way.
When you change English text
New or changed strings fall back to English until they’re translated, so a pull request that changes text should translate it for every language. First update the catalogs with every string the code uses (this builds both apps, so it needs Xcode):
scripts/sync-strings.sh # or: scripts/sync-strings.sh mac | ios
Then run missing, translate and import for each language, and commit the catalogs. The rest of the contributing workflow is in Build from source and CONTRIBUTING.md.