Skip to main content
For Dashboard UI translations see Dashboard Customization: Translations.
Every translatable record keeps one row per language, so a product genuinely has a French name rather than a French name pasted over the English one.

What can be translated

Note that slugs are translated too. A French page can live at /produits/sac-spree rather than at the English slug with French words on it — which is what search engines actually reward. See Slugs.

Reading translated content

Ask for a locale and you get that language back. Nothing else about the request changes:
If a field has no translation for the requested locale, you get the default-language value rather than an empty string — a half-translated catalogue still renders as a usable page.
Responses vary by locale, so if you cache them, include the locale in the cache key. Spree sets Vary headers for you, which is enough for a CDN but not for a hand-rolled in-memory cache.

Writing translations

Merchants translate in the dashboard, switching locale on the record they’re editing. For bulk work — handing a catalogue to a translation agency — export to CSV, translate, and import it back. Translations can also be written through the Admin API, which is what you’d use to sync from an external translation service. Writes go through one batch endpoint — every entry succeeds or none do — so a product and its option values can be translated in a single request:
Asking the API which resources are translatable means a translation tool doesn’t need a hardcoded list that goes stale.