Localization
Finqu themes support multiple languages through JSON files in the locales/ directory.
Storefront translations
Each language needs a locale file:
locales/
en.json
fi.json
sv.jsonUse translation keys in your Liquid templates:
{{ 'general.add_to_cart' | t }}Keys are nested in the JSON file:
{
"general": {
"add_to_cart": "Add to cart"
}
}The active language comes from the customer’s locale (request.locale).
Schema translations
Section, block, and setting labels shown in the theme designer can be translated separately from storefront copy using schema locale files:
locales/
en.json
en.schema.json
fi.json
fi.schema.jsonen.json — strings customers see on the storefront.
en.schema.json — labels merchants see in the designer (section names, setting labels, block titles).
Example locales/fi.schema.json:
{
"sections": {
"hero": {
"name": "Hero-banneri",
"settings": {
"heading": {
"label": "Otsikko"
}
}
}
}
}At runtime, schema translations are merged into the corresponding locale. You do not need to duplicate schema labels inside fi.json unless the same string is also used on the storefront.
Translating schema in section files
You can also localize schema inline when defining {% schema %}:
{% schema %}
{
"name": {
"en": "Hero banner",
"fi": "Hero-banneri"
},
"settings": [
{
"type": "text",
"id": "heading",
"label": {
"en": "Heading",
"fi": "Otsikko"
}
}
]
}
{% endschema %}Use inline localization for small schemas; use {lang}.schema.json when you have many sections and blocks to translate.
Best practices
- Keep storefront copy in
{lang}.jsonand designer labels in{lang}.schema.jsonor inline schema objects. - Ship a locale file for every language your theme claims to support.
- Use the same language codes as your store’s enabled locales (
en,fi,sv, etc.). - Test language switching with the
localizationform or store locale picker on a deployed store.