Voyager is built to be sold from anywhere to anywhere. The platform layer — Shopify Markets — handles currencies, languages, taxes, and routing. The theme layer renders the switchers and respects the shopper’s choice across every page.Documentation Index
Fetch the complete documentation index at: https://voyage-theme.fasil.in/llms.txt
Use this file to discover all available pages before exploring further.
Shopify Markets setup
Markets is Shopify’s name for the framework that ties together a country, a currency, a language, and a pricing strategy.Add a market
Add market. Pick the countries it covers (e.g., European Union, or a single country, or Rest of World).
Set the currency
Each market can use its own currency. Choose the local currency or use Shopify Payments’ automatic currency conversion.
Set the language
Each market can have its own primary language. Add multiple if you want to offer choices to shoppers.
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.
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.| Surface | Where it lives |
|---|---|
| Announcement bar | Top right, next to the language picker |
| Footer | Bottom row, alongside payment icons |
| URL parameter | ?currency=USD works on any page |
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:
Duplicate the English file
locales/en.default.json → save as locales/fr.json (for French), locales/ar.json (Arabic), etc.Translate every value
Keys stay the same; values get translated. Don’t translate the keys themselves.
RTL support
Voyager supports right-to-left languages (Arabic, Hebrew, Persian).| What Voyager does | What it means |
|---|---|
Sets dir="rtl" on <html> for RTL locales | Browser mirrors block-level layout automatically |
Uses CSS logical properties (margin-inline-start, etc.) | Flex and grid layouts mirror without overrides |
| Falls back to Tajawal for body | Tajawal supports Arabic, Hebrew, Persian, Urdu |
| Mirrors icon positions | Chevrons, carousel arrows, and accordion indicators all flip |
?_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.
| Filter | Output |
|---|---|
{{ product.price | money }} | $45.00 |
{{ product.price | money_with_currency }} | $45.00 USD |
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:Find the locale settings
Scroll to Localization. The selector is on by default if more than one country or language is configured in Markets.
Toggle the components
Show country selector — toggles the country dropdown. Show language selector — toggles the language dropdown.
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.