Shopify Markets setup
Markets is Shopify’s name for the framework that ties together a country, a currency, a language, and a pricing strategy.1
Open Markets
Shopify admin → Settings → Markets.
2
Add a market
Add market. Pick the countries it covers (e.g., European Union, or a single country, or Rest of World).
3
Set the currency
Each market can use its own currency. Choose the local currency or use Shopify Payments’ automatic currency conversion.
4
Set the language
Each market can have its own primary language. Add multiple if you want to offer choices to shoppers.
5
Configure pricing
Same as primary market — use exchange rates. Custom — set per-product prices per market. Rounding rules — keep prices ending in .99 across currencies.
6
Publish
Markets go live the moment they’re saved. Visitors from those countries see the configured currency and language by default.
Multi-currency switching
Once you’ve configured more than one currency, Voyager renders a currency switcher in the announcement bar (right side) and in the footer.
The selected currency is stored in a Shopify cookie. It persists across pages and across sessions on the same device.
Prices format via Shopify’s
money filter — which honors the shopper’s chosen currency, locale formatting, and Theme settings → Currency → Show currency codes (which appends e.g. USD next to each price).
Multi-language switching
Same pattern as currency. After adding a second language in Markets:- Voyager renders a language switcher in the announcement bar and footer.
- Translations are stored as
locales/[lang].jsonfiles (e.g.,locales/fr.json). - Shopify’s Translate & Adapt app (free, first-party) lets non-developers translate every storefront string in a friendly UI.
Locale files
Voyager ships withlocales/en.default.json containing every translatable string the theme renders. To support a new language manually:
1
Duplicate the English file
locales/en.default.json → save as locales/fr.json (for French), locales/ar.json (Arabic), etc.2
Translate every value
Keys stay the same; values get translated. Don’t translate the keys themselves.
3
Push to the theme
shopify theme push --only=locales/. Or upload via the code editor.4
Activate in Markets
The language only takes effect once it’s added to a market.
RTL support
Voyager supports right-to-left languages (Arabic, Hebrew, Persian).
To test RTL without setting up Markets: append
?_pos=rtl to any URL on the Theme Editor preview. (This is a development-only override; production RTL is controlled by Markets.)
Money formatting
Shopify exposes two filters:money and money_with_currency.
Voyager uses
money everywhere — the currency code is appended automatically when Theme settings → Currency → Show currency codes is checked.
Format itself is controlled by the shop’s currency settings in Settings → Currency. Most stores leave this on the default. If you want to override (e.g., always use European spacing — 45,00 € even for USD), use Shopify’s HTML format override: Settings → Currency → Change formatting.
Country selector in the header
The header’s right utility cluster contains the country / language selector. It expands into a small dropdown on click. To customize:1
Open the header section
Theme Editor → Header in the left rail.
2
Find the locale settings
Scroll to Localization. The selector is on by default if more than one country or language is configured in Markets.
3
Toggle the components
Show country selector — toggles the country dropdown. Show language selector — toggles the language dropdown.
4
Style overrides
The selector inherits the global typography. No section-specific overrides needed.
Common gotchas
My language switcher shows but the page doesn't translate
My language switcher shows but the page doesn't translate
The locale file is missing. Voyager falls back to English if the requested language’s locale file doesn’t exist. Check
locales/ for the file matching the language code.Prices look wrong in the cart drawer
Prices look wrong in the cart drawer
The cart drawer uses Section Rendering API — currency conversion happens server-side at render. If prices look off, force a hard reload (Cmd-Shift-R) to clear the cached drawer markup.
Arabic text reads ltr instead of rtl
Arabic text reads ltr instead of rtl
The
<html dir="rtl"> attribute isn’t set. This is automatic via Markets — confirm the market is configured with Arabic as its language, not just as a translation pair.One section ignores RTL mirroring
One section ignores RTL mirroring
Likely a section that uses absolute positioning or hand-rolled margins instead of logical properties. Voyager’s native sections all use logical properties; if you’ve added custom sections, audit their CSS.
Where to next
Performance and accessibility
Lighthouse, image weight, app weight.
Support and changelog
Help and version history.