Multi-language (i18n)
Localize UI strings and dynamic content; locale routing and translation overlays.
A storefront can serve multiple languages. There are two layers: UI strings and dynamic content.
UI strings
Theme copy uses the Liquid | t filter backed by per-store locales/<lang>.json
files. Section settings can be both customizer-editable and localized.
Dynamic content (translation overlay)
Products, collections, pages, blog posts, menus, content records, theme/section settings, and global resources (attributes, options, brand…) are translated via a translation overlay: per-locale field overrides stored separately from the source. Manage them with the translation tools/mutations:
mutation {
upsertTranslations(input: { entries: [
{ resourceType: "product", resourceId: "123", field: "title", locale: "vi", value: "Ghế Aeron" }
]})
}resource_type covers product, collection, page, blog_post, menu_item,
content_record, theme_section, page_section, theme_setting, plus global
types like eav_attribute / eav_option. An empty value deletes the override.
Locale routing
A store declares its supported_locales + default. Non-default locales are
served under a path prefix (e.g. /vi/...); the renderer applies that locale's
overlay and emits hreflang. Global attribute/option translations apply across
every product at once.
Tip
The shop-i18n playbook is the hands-on guide for
making a store bilingual via the MCP.
