Skip to main content

Overview

Two different things need translating, and they’re handled separately because they belong to different people. Your content — product names, descriptions, category names — is written by whoever runs the store. Spree stores a version of each field per language. The interface — button labels, error messages, email wording — is written by Spree, and is already translated into dozens of languages by the community.
Which languages a region gets is decided by its Market. A market sets the default locale alongside the currency, so a visitor from France lands on French prices and French copy without choosing anything.

Translating content

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:
Asking the API which resources are translatable means a translation tool doesn’t need a hardcoded list that goes stale.

Translating the interface

Spree’s own strings — everything in the dashboard and in transactional emails — come from a community-maintained project covering 40+ languages.
That’s the whole installation. Locales are picked up automatically; nothing needs copying into your app.
See the supported locales in the Spree I18n repository. Contributions are welcome if yours is incomplete.