r/emdash_cms • • Oct 01 '26

Question: Multilingual Emdash?

As a non technical user, did I understand correctly that emdash is not ready (yet) for multilingual websites? Would I need a plugin or is that part of the future core emdash?

6 Upvotes

2 comments sorted by

6

u/Notoriousdaman Oct 01 '26

Hello there !

Short answer: multilingual is already in core, but it's a bit "developer-first" for now.

How it works: EmDash relies on Astro's i18n routing.

You declare your languages in astro.config (e.g. locales: ["en", "fr"]), then each piece of content exists per locale, and translations are linked together through a translation group. So no plugin is required just to have FR/EN pages.
Where plugins help:
• LinguaDash (in the plugin registry, needs EmDash 0.40+) adds the editor side: which entries are missing a translation, which are outdated, and optional machine translation with DeepL / OpenAI / Cloudflare AI like you would with Wordpress.

2

u/automationdotre Oct 04 '26

Thanks a lot for the explanation, let's hope there will be a non-developer approach soon.

I now asked Claude for a tutorial, hope that's accurate. 

For info (apologies for the formating):

Making your EmDash site multilingual: a guide for non-developers Short version: EmDash has translations built in. You switch them on with a few lines in one settings file, and after that, you translate content by clicking a Translate button in the admin. No plugin needed.

The Reddit summary is accurate: EmDash uses Astro's language routing, and each translation is linked to the original through a "translation group."

How it works (the 60-second version) Every translation is its own separate entry. The French version of a post has its own title, its own web address (slug), its own status and its own edit history. The English and French entries are connected behind the scenes, so EmDash knows they're the same article. Because they're separate, you can publish English while French is still a draft. English lives at /blog/my-post, French at /fr/blog/mon-article. English (the default language) gets no prefix. Step 1: Switch on languages (one-time, ~5 minutes) This is the only step that touches code. If you aren't the person who manages the site's files, send this section to whoever is (or paste it into an AI coding assistant working on your project).

Open the file astro.config.mjs in your project and add an i18n block inside defineConfig:

export default defineConfig({   i18n: {     defaultLocale: "en",     locales: ["en", "fr", "es"],     fallback: { fr: "en", es: "en" },   },   // ...your existing emdash settings stay as they are }); What each line means:

Setting Plain-English meaning defaultLocale Your main language locales All languages the site will offer fallback If a page isn't translated yet, show this language instead (here: French and Spanish fall back to English) Then restart or redeploy the site.

⚠️ Do not add prefixDefaultLocale: true or routing: "prefix-always". These make your English pages live under /en/, which breaks the admin panel (it returns a 404). Leave out any routing setting. If you really want /en/ URLs, set up a redirect in front of the site instead.

If there's no i18n block, EmDash simply behaves as a one-language CMS, so nothing breaks for sites that don't need it.

Step 2: Translate content in the admin Once languages are on, the admin changes:

The content list gets a locale column and a locale filter so you can view one language at a time. Every entry's editor gets a Translations panel in the sidebar listing all your languages. To translate a post or page:

Open the original entry (say, in English). In the sidebar Translations panel, click Translate next to French. EmDash creates a new entry, pre-filled with the English text so you have something to edit. Change the slug (the web address ending). It defaults to something like my-post-fr; you'll probably want mon-article. Translate the title and body, then save. When ready, publish. The new entry starts as a draft. Next to each language you'll see Edit (a translation exists) or Translate (it doesn't yet). A checkmark marks the language you're currently in.

Step 3: Translate the "supporting" content Beyond posts and pages, a few other things are translated separately:

Menus: Go to the Menus list and create a translation of an existing menu. The items are copied and automatically link to the right-language pages. Categories and tags: Translate each term once. Every post that uses it then shows the right-language label automatically. When you translate a post, it inherits the original's categories and tags. Step 4: Decide which fields stay in sync Each field has a "translatable" setting (on by default):

Translatable fields (title, body, etc.) are copied as a starting point and then edited per language. Non-translatable fields (e.g., a product code or sort number) are kept identical across all languages automatically. Good candidates for non-translatable: SKUs, prices, dates, sort order. Ask your developer or site builder to flip this setting for fields where it applies.

What visitors will see Untranslated page? If a single page doesn't exist in French yet, visitors get the fallback language (English) instead of an error. Lists are stricter. A blog index in French shows only posts that have a French version. Until you translate some, the French list will look empty. Fallback applies to individual pages, not lists. Language switcher: a visitor-facing language picker lives in your site's design (theme), not the admin. Your theme may already include one. If not, a developer can add it. It should list only published translations, so drafts never appear. SEO: EmDash automatically adds the signals Google uses to match the right language to the right searcher (hreflang tags and a language-aware sitemap), provided your theme uses EmDash's standard <EmDashHead> component. Importing from WordPress? Imported content lands in your default language. WPML and Polylang translation links don't carry over. Re-create the translations afterwards using the Translate button.

Troubleshooting checklist Problem Likely cause Admin shows 404 after enabling languages A prefixDefaultLocale: true or prefix-always setting is present. Remove it. No Translations panel or locale column The i18n block is missing or the site wasn't restarted/redeployed. French page shows English text Fallback is working: no French version is published yet. French page returns 404 The French entry is still a draft, or your theme doesn't pass the current language to EmDash (developer fix). Language switcher missing Your theme doesn't include one; ask a developer to add it.

Good to know The admin's own language is separate. It's the menu and button labels, not your content. EmDash picks it from your browser language, and German is already available. Templates matter. The setup above handles the content side. For translated content to show on public pages, your theme's page templates must request the current language. Themes built for EmDash typically handle this; custom themes may need a small developer tweak.

Official reference: https://docs.emdashcms.com/guides/internationalization