To translate custom Liquid sections in Shopify, you first need to expose the hardcoded text inside your section and snippet files as translatable content, because Shopify’s translation editor and Markets never touch strings written directly into a .liquid file. Once that text lives in your theme’s locale files as translatable resources, a tool like LocaleFlow can translate it across all your active languages and keep it in sync automatically. This guide walks through exactly why hardcoded theme text stays stuck in one language and what to do about it.
Custom sections are where most merchants get caught. You hire a developer to build a bespoke hero banner, an announcement bar, or a “Why shop with us” block, and it looks perfect in English. Then you add French and German through Markets, translate your products, and the custom section is still sitting there in English on every localized page. The reason is simple, and once you understand it the fix is straightforward.
What “Custom Liquid Sections” Actually Means
A custom Liquid section is any theme block built from a .liquid file in your theme’s sections/ or snippets/ folders that contains text your customers read. That text usually lives in one of two places:
Hardcoded strings. These are words typed directly between your HTML tags, like <h2>Free shipping over $50</h2> written straight into sections/custom-banner.liquid. Shopify treats this as part of the theme’s code, not as content, so it never enters the translation system.
Schema settings and defaults. Custom sections often expose fields in the theme editor through a {% schema %} block, with default values like "default": "Shop the collection". If those defaults are not set up as translatable, the merchant-entered text can also be stranded in one language.
The distinction matters because Shopify has two completely separate buckets: content that is translatable and code that is not. Products, collections, pages, metafields, and theme text exposed through locale files all live in the translatable bucket. Raw strings inside your Liquid files live in the code bucket, and the translation layer simply does not see them.
Why Shopify Markets and the Translation Editor Skip Hardcoded Text
Adding a language through Shopify Markets does not translate anything on its own. It switches on the translation layer and creates language subfolders like /fr/ and /de/. From there, Shopify’s translation editor (or an app) fills in translations for anything registered as a translatable resource.
Hardcoded strings are never registered as translatable resources. When you write <p>Handmade in Italy</p> directly in a section file, Shopify has no key to attach a French value to. There is no field in the translation editor for it, no place for Markets to route a localized version, and nothing for an app to sync. The English text is compiled into the page and served identically in every language.
This is by design. Shopify separates presentation code from content so themes stay portable. The tradeoff is that any text a developer bakes into a custom section becomes invisible to translation until you deliberately expose it.
Theme Locale Files vs Hardcoded Strings
The bridge between the two buckets is the theme locale file. Every Shopify theme ships with a locales/ folder, and locales/en.default.json holds structured strings your Liquid can reference with the t (translate) filter.
Instead of writing text directly in the section:
<h2>Why shop with us</h2>
you add a key to locales/en.default.json:
{ "sections": { "custom": { "heading": "Why shop with us" } } }
and reference it in the section file:
<h2>{{ 'sections.custom.heading' | t }}</h2>
Now that string is a translatable resource. It appears in Shopify’s translation editor under theme content, Markets can route localized versions, and a translation app can generate and sync every language. For schema-driven text, use the label and default_content conventions so merchant-facing labels and defaults become translatable too. Dawn and other Online Store 2.0 themes follow this pattern throughout, which is why they translate cleanly. If you are working from Dawn specifically, our guide to translating the Dawn theme covers the theme-content workflow end to end.
A quick way to audit your sections
Open each custom file in sections/ and snippets/ and scan for any customer-facing words sitting between HTML tags or in schema default values without a | t filter. Every one of those is a string that will stay in your source language until you move it into a locale file. Metafield-driven content is a related case worth checking as well, since custom sections often render metafields directly; see how to translate metafields for that side of the setup.
Translating Custom Sections With LocaleFlow
Once your hardcoded text is exposed as translatable content, LocaleFlow handles the rest. LocaleFlow translates Shopify-native content, including products, collections, theme content exposed as translatable resources, and metafields, across all the languages configured in your Shopify Markets, and it keeps them in sync automatically.
Here is the workflow:
-
Expose your hardcoded strings first. For any text baked into a custom section or snippet, move it into
locales/en.default.jsonand reference it with thetfilter, as shown above. This is the one step that must happen in the theme code. -
Install LocaleFlow from the Shopify App Store and connect your store. It reads your translatable resources through the Shopify Admin API.
-
Select theme content in your LocaleFlow dashboard alongside products and collections. The locale-file strings you exposed now show up as translatable theme content.
-
Choose your target languages from the ones you have configured in Shopify Markets, then run the translation across all of them at once.
-
Preview each language to confirm your custom section headings, buttons, and labels read naturally in context. Longer languages like German can shift layout, so check spacing.
-
Let auto-sync take over. When you add a new locale key or edit an exposed string, LocaleFlow picks up the change and updates every active language, so your custom sections do not drift out of sync.
For text that stays truly hardcoded (never exposed to a locale file), no translation tool can reach it, including LocaleFlow. The rule of thumb: for theme text exposed as translatable content, LocaleFlow translates and syncs it automatically; for anything left inside the raw .liquid code, expose it first.
Why This Is Worth Doing
A custom section is often the most persuasive part of a store: the value proposition, the trust badges, the shipping promise. Leaving it in one language undercuts every localized page it appears on. CSA Research found that 76% of consumers prefer buying in their native language, and a half-translated page sends the opposite signal. Exposing your custom sections properly means the whole page speaks the customer’s language, not just the product title.
If you are still comparing translation tools and want to see how LocaleFlow handles theme content against other Shopify apps, the comparison page breaks down coverage across resource types.
Ready to translate your custom sections across every language? Install LocaleFlow from the Shopify App Store and start translating today.
Written by Kwadwo Adu, Co-founder of LocaleFlow