Skip to main content
The ef CLI covers both ways of building a multilingual site: a page per language linked as translations, and one page with its texts in the brand dictionary. It calls the same API as the app, with the same permissions.

Before you start

  • Connect the CLI to your project: Connect the ef CLI.
  • These commands need ef 0.26.2 or later. Check with ef --version; update with npm i -g @elasticfunnels/cli@latest.
  • Add the brand’s languages first, in Pages → Advanced → Translations or with ef translations push (below). Every command takes the language code you gave there (ro, pt-br).
  • ef claude writes a section on multilingual sites into the project’s CLAUDE.md, so an AI agent working in the folder uses these commands.

Translate a page

translate copies the group’s source page, so ef pages translate ro/about --lang es also copies about. It refuses (exit 2) when the group already has that language or the slug is taken. Translate pages/ro/about.ef, then ef push pages/ro/about.ef. Link pages that already exist, or undo a link:

Translate a component

A page in Romanian then includes the Romanian header; pages in other languages keep the base one. --code and --name set the new component’s code and name.

The language in your local files

ef pull writes each page’s language and source into the first line of its file:
translation_of is the source page’s slug (for a component, its code). Change a page’s language with ef pages settings, which updates the server and this line together. ef push sends language and translation_of only when you changed them in the file since the last pull, so pushing an older file never undoes a change someone made in the app.

Stale and missing translations

check lists, per source page or component, which languages exist, which are missing and which are stale: the source’s text (SEO title, SEO description and visible text) changed since the translation was made or marked up to date. It also reads the source’s local file, so an edit you have not pushed yet shows as “stale after push”. Only pages that already have at least one translation count. A page with a language and no translation yet is one you chose not to translate (most sites translate some pages, not all), so it is not reported as missing; add --untranslated to list those too. It also lists every page with a language whose file still has its own hreflang, canonical or og:locale tag. EF writes those tags for pages with a language and leaves its own out when the page declares one, so a hand-written tag left over from an older setup quietly wins. ef push and ef lint print the same warning for that file. It exits 1 when a translation is stale, and with --strict also when one is missing or a page keeps its own language tags, so it can stop a publish:

The brand dictionary as files

Without --prune, push never deletes: a key that is only on the server stays, and the output says how many there are. ef push skips the translations/ folder; send it with ef translations push.

Brand settings

See Language prompt and switcher for the prompt options and SEO for what x-default does.

Exit codes