🌐 i18n mega-issue
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.
Hello, @cathysarisky can you assign this to me.
Hello, @cathysarisky can you assign this to me.
Please feel free to open a PR that resolves the issues above (or make other translation improvements) for any languages that you speak fluently.
Is this issue resolved? Is there any chance I can work on it?
Is this issue resolved? Is there any chance I can work on it?
Please feel free to open a PR that resolves the issues above (or make other translation improvements) for any languages that you speak fluently.
can i work on Hindi translation
can i work on Hindi translation
That'd be great, @dawgdevv ! Looks like there are still some untranslated strings that would be a good place to start.
@rohit-bhardwajj submitted some translations for Hindi a couple weeks ago (that have been merged), so I'm going to @ him here, in hopes that you two can coordinate work and review each other's contributions.
Let me know if you have any questions.
can i work on Hindi translation
That'd be great, @dawgdevv ! Looks like there are still some untranslated strings that would be a good place to start.
@rohit-bhardwajj submitted some translations for Hindi a couple weeks ago (that have been merged), so I'm going to @ him here, in hopes that you two can coordinate work and review each other's contributions.
Let me know if you have any questions.
Okay will update you with the translation.
can i work on Hindi translation
That'd be great, @dawgdevv ! Looks like there are still some untranslated strings that would be a good place to start.
@rohit-bhardwajj submitted some translations for Hindi a couple weeks ago (that have been merged), so I'm going to @ him here, in hopes that you two can coordinate work and review each other's contributions.
Let me know if you have any questions.
Hey @cathysarisky, thanks for the mention!
Hi @dawgdevv 👋 I’d be happy to help coordinate or review anything you're working on.
@cathysarisky — if needed, I can also pick up and complete the remaining untranslated strings. Let me know what works best!
can i work on Hindi translation
That'd be great, @dawgdevv ! Looks like there are still some untranslated strings that would be a good place to start. @rohit-bhardwajj submitted some translations for Hindi a couple weeks ago (that have been merged), so I'm going to @ him here, in hopes that you two can coordinate work and review each other's contributions. Let me know if you have any questions.
Hey @cathysarisky, thanks for the mention!
Hi @dawgdevv 👋 I’d be happy to help coordinate or review anything you're working on.
@cathysarisky — if needed, I can also pick up and complete the remaining untranslated strings. Let me know what works best!
hello @rohit-bhardwajj i can complete the left over translation can you review it for me
Can i complete remaining hindi translations? as shown above they are still 83%
Can i complete remaining hindi translations? as shown above they are still 83%
i think i have completed all the translation @cathysarisky have you updated
Can i complete remaining hindi translations? as shown above they are still 83%
i think i have completed all the translation @cathysarisky have you updated
Stats updated! :)
Can i complete remaining hindi translations? as shown above they are still 83%
i think i have completed all the translation @cathysarisky have you updated
Stats updated! :)
Thanks for the update! 🙌
Missing {status} in translated string
Great translation 👍
I'm interested in working on this issue. Could you provide more context about what you're looking for? Any additional details about requirements or constraints would be helpful.
I'm interested in working on this issue. Could you provide more context about what you're looking for? Any additional details about requirements or constraints would be helpful.
Did you watch the video in the linked forum thread? Did you have a question? If something is not clear, please ask a more specific question and I'll try to clarify. Thanks.
Hi, it seems that the subscribers only warning in subscribers only posts is not getting translated when using other languages other than english. Tried with french and german. Using Ghost Pro.
Hi, it seems that the subscribers only warning in subscribers only posts is not getting translated when using other languages other than english. Tried with french and german. Using Ghost Pro.
That's under theme control, not part of this project. To fix it, you need to put a (translated/wrapped for translation) copy of content-cta.hbs into your partials. See the note about templates here: https://docs.ghost.org/themes/helpers/utility/translate
Hi, it seems that the subscribers only warning in subscribers only posts is not getting translated when using other languages other than english. Tried with french and german. Using Ghost Pro.
That's under theme control, not part of this project. To fix it, you need to put a (translated/wrapped for translation) copy of content-cta.hbs into your partials. See the note about templates here: https://docs.ghost.org/themes/helpers/utility/translate
Thank you so much for the quick answer, a file was indeed missing from my theme. (Or skill issue from my part for not reading the doc !)
Hi, Regarding the new one-time code translation:
- Line 175 in api.js:
${t('Or use this link to securely sign in')}: - Line 139 in signin.js:
${t('Or, skip the code and sign in directly')}: - Line 129 in signin.js:
${t('Welcome back! Here's your code to sign in to {siteTitle}')}:
It would be better to include the colon inside the translation, because in French typography a space is required before a colon. To work around this, I had to add a space at the end of my translation ("[...] connectez-vous directement "), which coderabbit didn’t like.
It would be better to include the colon inside the translation, because in French typography a space is required before a colon. To work around this, I had to add a space at the end of my translation ("[...] connectez-vous directement "), which coderabbit didn’t like.
Unfortunately, making changes to the strings after we have some translations already in tends to make a bit of a mess. You're 100% welcome to just include the space in your translation. I don't care if Coderabbit is happy or not. :)