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
ef0.26.2 or later. Check withef --version; update withnpm 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 claudewrites a section on multilingual sites into the project’sCLAUDE.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
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
x-default
does.