-
-
Notifications
You must be signed in to change notification settings - Fork 11k
Description
Please help us translate Ghost to your language!
General needs
- Contribute new languages (provided you speak them fluently or near-fluently)
- Help complete languages that are only partially translated
- Improve the quality of existing translations
- Fix errors (see below)
Notes & tips
🔖 For help getting started, see https://forum.ghost.org/t/help-translate-ghost-beta/37461 - the original directions were only for portal, but can be generalized to any language file.
🤖 NO AI translations, please. Native/very fluent speakers only.
✉ Read your email! Please make sure you have your Github notifications sent somewhere you will see them. Most PRs need at least one round of adjustment before merging.
🆕 New Github users are welcome! When you submit your PR, please make sure that the "files changed" tab shows only the changes you intended to make. If you have questions, please leave a comment and I'll try to help get you sorted out.
👋 Formality: Ghost's brand has a friendly and fairly informal tone. If your language has both formal and informal form, choose one or the other and use it consistently. Most languages are using the informal version, but if the informal version might be considered rude, then choose the formal.
🤗 All kinds of people use Ghost. When possible, prefer gender-neutral language.
👍 Translations should work for a variety of Ghost sites. Choose translations that will make sense for both personal blogs/newsletters and news publications.
👉 Please @ cathysarisky if you add a language PR. Thanks!
Common issues to avoid & other notes:
- Please give your PR a descriptive title that includes the language you are working on.
- Check before starting that there isn't another PR for the same language. If there is, please review it rather than duplicating work.
- Consult the context.json file if you aren't sure how a string will be used.
- We use "Jamie Larson" for a placeholder in any field that needs a name. Please do not transliterate. Please do not replace with "Name". Instead, choose a name that will be recognized as a name in your language. Choose something uncontroversial and common. If possible, choose a non-gendered name.
- Do not translate variables (inside {}). Do not add variables. If you remove a variable, leave a note (see "Known Errors" below).
- Watch out for "You are receiving this because you are a %%{status}%% subscriber to {site}.'", which takes the "free", "trialing", "paid", and "complimentary" strings in the %%{status}%% field. These strings need to work together.
- If you are changing existing translations, please leave an explanation of why.
Completion status (last generated 8/7/2025):
Translation Completion Statistics
Language | Need translation | Completion % | Invalid Variables | Missing Variables | Intentional Overrides |
---|---|---|---|---|---|
Spanish (es) 🥇 | 0 | 100% | 0 | 0 | 0 |
French (fr) 🥇 | 0 | 100% | 0 | 0 | 0 |
Hindi (hi) 🥇 | 1 | 100% | 0 | 0 | 0 |
Hungarian (hu) 🥇 | 0 | 100% | 0 | 0 | 0 |
Punjabi (pa) 🥇 | 0 | 100% | 0 | 0 | 0 |
Russian (ru) 🥇 | 0 | 100% | 0 | 0 | 0 |
Vietnamese (vi) 🥇 | 0 | 100% | 0 | 0 | 0 |
Bulgarian (bg) 🥈 | 8 | 98% | 0 | 0 | 0 |
Italian (it) 🥈 | 9 | 98% | 0 | 0 | 0 |
Turkish (tr) 🥈 | 6 | 98% | 0 | 0 | 0 |
Mongolian (mn) 🥉 | 13 | 97% | 0 | 0 | 0 |
Polish (pl) 🥉 | 13 | 97% | 0 | 0 | 0 |
Danish (da) 🥉 | 14 | 96% | 1 ❌ | 1 ❌ | 0 |
German (de) 🥉 | 14 | 96% | 0 | 0 | 1 ✅ |
Brazilian Portuguese (pt-BR) 🥉 | 14 | 96% | 0 | 0 | 0 |
Swiss German (de-CH) | 26 | 93% | 2 ❌ | 3 ❌ | 0 |
Norwegian Bokmål (nb) | 28 | 93% | 0 | 0 | 0 |
Slovenian (sl) | 27 | 93% | 0 | 0 | 0 |
Catalan (ca) | 31 | 92% | 0 | 0 | 0 |
Scottish Gaelic (gd) | 30 | 92% | 0 | 0 | 0 |
Croatian (hr) | 30 | 92% | 0 | 0 | 0 |
Latvian (lv) | 31 | 92% | 1 ❌ | 0 | 0 |
Dutch (nl) | 29 | 92% | 0 | 0 | 0 |
Chinese (Traditional) (zh-Hant) | 30 | 92% | 0 | 0 | 0 |
Slovak (sk) | 34 | 91% | 0 | 1 ❌ | 0 |
Arabic (ar) | 43 | 89% | 0 | 0 | 0 |
Hebrew (he) | 41 | 89% | 0 | 0 | 0 |
Korean (ko) | 41 | 89% | 0 | 0 | 0 |
Swedish (sv) | 41 | 89% | 0 | 0 | 0 |
Indonesian (id) | 65 | 83% | 0 | 0 | 0 |
Tamil (ta) | 65 | 83% | 0 | 0 | 0 |
Ukrainian (uk) | 65 | 83% | 0 | 0 | 0 |
Czech (cs) | 78 | 79% | 0 | 0 | 0 |
Romanian (ro) | 81 | 78% | 0 | 0 | 0 |
Portuguese (pt) | 85 | 77% | 0 | 1 ❌ | 0 |
Estonian (et) | 101 | 73% | 0 | 0 | 0 |
Chinese (Simplified) (zh) | 102 | 73% | 0 | 0 | 0 |
Japanese (ja) | 108 | 71% | 0 | 2 ❌ | 0 |
Serbian (Cyrillic) (sr-Cyrl) | 111 | 70% | 0 | 0 | 0 |
Bosnian (bs) | 121 | 68% | 0 | 0 | 0 |
Greek (el) | 121 | 68% | 0 | 0 | 0 |
Persian (fa) | 121 | 68% | 0 | 0 | 0 |
Kazakh (kz) | 121 | 68% | 0 | 0 | 0 |
Lithuanian (lt) | 121 | 68% | 0 | 1 ❌ | 0 |
Afrikaans (af) | 123 | 67% | 0 | 0 | 0 |
Macedonian (mk) | 125 | 67% | 0 | 0 | 0 |
Swahili (sw) | 125 | 67% | 0 | 0 | 0 |
Bengali (bn) | 126 | 66% | 0 | 0 | 0 |
Sinhala (si) | 128 | 66% | 2 ❌ | 2 ❌ | 0 |
Thai (th) | 127 | 66% | 1 ❌ | 1 ❌ | 0 |
Finnish (fi) | 135 | 64% | 0 | 0 | 0 |
Urdu (ur) | 140 | 63% | 0 | 0 | 0 |
Icelandic (is) | 192 | 49% | 1 ❌ | 2 ❌ | 0 |
Norwegian Nynorsk (nn) | 192 | 49% | 0 | 2 ❌ | 0 |
Malay (ms) | 196 | 48% | 0 | 0 | 0 |
Albanian (sq) | 204 | 46% | 0 | 2 ❌ | 0 |
Nepali (ne) | 217 | 42% | 0 | 0 | 0 |
Serbian (sr) | 234 | 38% | 0 | 0 | 0 |
Esperanto (eo) | 295 | 22% | 0 | 0 | 0 |
Uzbek (uz) | 295 | 22% | 0 | 0 | 0 |
Known errors
Some existing translations in ghost/i18n/locales/**/*.json may have errors in usage of variables. Variables, surrounded by { } (always a single set, not doubles) should match in the key (left side) and value (right side). They should never translated. New variables should never be added to the right side, as they will not be correctly substituted. If a variable is not present on the right side, one should generally suspect an error, although a few may be deliberate.
If your language has any "Invalid Variables" listed above, these need to be corrected. Your strings will not display correctly. If your theme has "Missing variables", these might or might not be intentional. You can edit the error tracking file below to update anything intentional to explain your choice.
Errors are tracked in ghost/i18n/test/i18n-ignores.json . If you correct an error, you can also delete the override.