Ghost i18n: how to make your Ghost blog multilingual (2026)
Ghost is a fast, focused publishing platform built for independent creators and professional publishers. Going multilingual opens your content to entirely new audiences — but Ghost handles internationalization differently from other CMS platforms. Here are the two approaches available and how to choose between them.
Ghost's built-in approach to i18n
Ghost does not have native multilingual routing. There is no built-in concept of locale-specific URLs like /fr/post-slug or an automatic way to switch between language versions of a post. Instead, the Ghost ecosystem approaches translation through a manual content-duplication workflow.
The typical pattern works like this: you create a separate translated post for each language, tag it with the locale (e.g. lang:fr), and use the {{lang}} theme helper to set the HTML lang attribute on the page. Ghost also ships with a theme translation system — you can place a locales/fr.json file in your theme to translate fixed UI strings like navigation labels, button text, and membership prompts.
Pros of Ghost's manual approach
- →Each translated post is a first-class Ghost post with its own URL, metadata, and canonical — works natively with Ghost's SEO layer
- →Full editorial control — human translators or translation agencies can review and approve every sentence before publication
- →No third-party dependencies — everything lives inside Ghost and your theme
Cons of Ghost's manual approach
- →Every post must be duplicated and manually translated for each language — a two-language blog doubles your content workload
- →Updates to the original post must be reflected manually in all translated versions — no synchronization
- →Theme locale files only cover static UI strings — body content, post titles, and excerpt text require manual duplicate posts
- →Requires theme access to set up
{{lang}}and locale JSON — Ghost(Pro) users without a custom theme have limited options
Automatic translation with a script tag
A DOM-based translation approach works at the published-HTML level rather than inside Ghost's content model. You paste a single script tag into Ghost Admin → Settings → Code Injection → Site Footer, and the widget observes the fully rendered DOM — including every post, page, tag archive, and the Ghost Portal membership UI — and translates it automatically.
This works identically on Ghost(Pro) and self-hosted Ghost instances. Because Code Injection is a standard Ghost feature available on all plans, no theme access or custom theme is required.
Pros of automatic translation
- →Zero content duplication — your Ghost content library stays exactly as it is
- →Instant coverage of all existing and future posts — no per-post translation work
- →Translates everything in the DOM: post body, titles, navigation, Ghost Portal, tags, and author bios
- →hreflang tags are added automatically — no theme edits needed for multilingual SEO
- →Simple character-based monthly plans, no per-post translation fees
Cons of automatic translation
- →Translations are generated from published content — you review and override them in the dashboard rather than before publication
- →The first visitor to a new language page triggers the initial translation — subsequent visitors see cached results
Step-by-step: add multilingual support to Ghost
- 1
Create a Lingvit project
Sign up at app.lingvit.com, create a new project, and enter your Ghost site's domain. Select the target languages you want to support from the dashboard.
- 2
Open Ghost Admin → Settings → Code Injection
In your Ghost Admin panel navigate to Settings → Code Injection. You will see two text areas: Site Header and Site Footer. Use the Site Footer field — it injects code immediately before the
</body>tag on every page of your Ghost site. - 3
Paste the Lingvit script tag
Paste the script tag from your Lingvit project settings into the Site Footer field. It looks like this:
<script src="https://cdn.lingvit.com/widget.bundle.js" data-project-id="YOUR_PROJECT_ID" async></script>Replace
YOUR_PROJECT_IDwith the project ID shown in your Lingvit dashboard. Save the Code Injection settings. - 4
Confirm the language switcher appears on your site
Visit your Ghost site in a browser. The Lingvit language switcher widget will appear automatically. Click a target language — the first translation request generates translations and caches them. All subsequent visits for that language are served from cache instantly.
SEO and hreflang for Ghost
Multilingual SEO requires that search engines can discover, crawl, and correctly attribute each language version of your content. The two Ghost approaches handle this very differently.
With automatic translation (Lingvit)
Lingvit injects hreflang link tags into the page <head> for every active language automatically. Translated meta titles and descriptions are also served per locale, so search results in French, German, or Japanese display the correct localized snippet. No theme modification is required.
With Ghost's manual approach
When you manually duplicate posts per language, you are responsible for adding hreflang annotations. This typically means editing your Ghost theme to inject <link rel="alternate" hreflang="fr" href="..." /> tags in the <head> partial. Without these tags, search engines may treat your translated posts as duplicate content rather than language alternates.
URL structure
With Lingvit, each language gets a URL-prefix path: /fr/, /de/, /ja/. These URLs are crawlable and indexable, allowing Google to rank each language version independently for queries in that language.
Which approach is right for you?
| Factor | Ghost manual duplication | Automatic translation |
|---|---|---|
| Setup time | Hours to days per language | Guided code injection |
| Content maintenance | Manual — update every translated post on each change | Automatic — reflects published content |
| Editorial control | Full — review before publication | Post-publish review via dashboard |
| Theme access required | Yes (for hreflang + lang attribute) | No |
| Ghost Portal translated | Locale JSON files only (static strings) | Yes (full DOM) |
| hreflang setup | Manual theme edit | Automatic |
| Cost | Translation team / agency cost | Monthly character allowance |
Scroll horizontally to view every column.
Choose manual post duplication if your publication has a dedicated translation team, requires editorial approval for every sentence before it goes live, and targets one or two languages where the maintenance cost is acceptable.
Choose automatic translation if you want immediate multilingual coverage of your entire Ghost archive, are running Ghost(Pro) without custom theme access, or are targeting more languages than your team can realistically translate and maintain manually.
Frequently asked questions
- Does it work with Ghost(Pro) without a custom theme?
- Yes. Ghost's Code Injection feature is available on all Ghost(Pro) plans and self-hosted instances. Pasting the script tag in Site Footer does not require any theme editing or custom theme access.
- Can it translate Ghost Portal (membership UI)?
- Yes. Ghost Portal renders its membership and subscription UI directly into the page DOM. The translation widget observes these elements and translates them automatically, including sign-up prompts, member login text, and tier descriptions.
- Will it affect Ghost's SEO?
- Lingvit runtime translation does not add general indexable locale URLs at launch. Preserve Ghost's SEO settings and use a separate server-rendered locale-routing approach when multilingual indexing is required.
- Does it translate existing posts automatically?
- Yes. All published posts and pages are translated on the first visitor request for each language. Translations are then cached, so subsequent visitors see fully translated content with no delay.
Related guides
Translate your Ghost blog
Add Lingvit to an eligible Ghost theme through Code Injection. Plans start at $9/month.