Complete OpenCart Multilingual and Multi-Currency Setup
We have set up multilingual and multi-currency functionality for 15+ OpenCart stores — we know all the pitfalls. Clients often face issues like prices not updating after installing languages, duplicate SEO-URLs, or language switcher redirecting to the homepage. We solve these comprehensively: turnkey in 2–4 days. Our guarantee: correct operation across all languages and currencies, with auto-updated exchange rates and proper hreflang tags. Get a free assessment — just contact us.
OpenCart is natively designed with multi-language and multi-currency support — it's not an add-on but part of the core. However, "works out of the box" and "configured correctly" are different things. Here we cover the full setup cycle: from installing languages to auto-updating rates via the NBRB API and multi-store on different domains.
For example, an online clothing store targeting audiences in Belarus, Russia, and Kazakhstan — without multilingualism and proper currencies loses up to 30% conversion. We help avoid this.
Interface Localization: Installing Languages and Translations
OpenCart ships with English (en-gb). To add Russian, Belarusian, and other languages, download a language pack (official on opencart.com or GitHub) and install via Extension Installer. After activating the language in the admin panel (System → Localization → Languages), it becomes available for selection.
Custom strings in modules or themes are added via language files in the appropriate directories. For example, for module mymodule in catalog/language/ru-ru/module/. Usage in controller: $this->load->language('module/mymodule');, in Twig template: {{ text_add_cart }}. If a translation is missing for a language, OpenCart displays the default language description.
Multilingual Content and SEO
Each product has a description per language. In the database, this is stored in the oc_product_description table with a language_id field. In the admin panel, when editing a product, tabs for each language are available — filled separately.
For correct SEO indexing, each language needs its own SEO-URL. In the admin product SEO section, you can set a unique keyword for each language. Additionally, hreflang tags must be added in the site header — OpenCart does not do this automatically, requiring modification:
{% for lang in languages %} <link rel="alternate" hreflang="{{ lang.code }}" href="{{ lang.href }}"> {% endfor %} <link rel="alternate" hreflang="x-default" href="{{ canonical }}"> Data for languages is passed from the controller via modification of the header controller.
How to Set Up Auto-Update of Exchange Rates via NBRB API?
Adding a currency in OpenCart: via admin panel (System → Localization → Currencies → Add Currency). Example for three currencies of a store targeting the CIS:
| Currency | Code | Symbol | Decimals | Default |
|---|---|---|---|---|
| Belarusian Ruble | BYN | Br | 2 | Yes |
| Russian Ruble | RUB | ₽ | 2 | No |
| US Dollar | USD | $ | 2 | No |
OpenCart supports auto-update via ECB (European Central Bank), but this is inconvenient for BYN. We use a custom script that parses the NBRB API:
// shell/update_currencies.php $nbrb = json_decode(file_get_contents('https://api.nbrb.by/exrates/rates?periodicity=0'), true); $rates = array_column($nbrb, 'Cur_OfficialRate', 'Cur_Abbreviation'); $pdo = new PDO("mysql:host=localhost;dbname=opencart", 'user', 'pass'); foreach (['USD', 'EUR', 'RUB'] as $currency) { if (isset($rates[$currency])) { $stmt = $pdo->prepare("UPDATE oc_currency SET value = ?, date_modified = NOW() WHERE code = ?"); $stmt->execute([1 / $rates[$currency], $currency]); } } Run this script via cron daily. Automatic update via cron is 10 times more reliable than manual — eliminates errors and omissions.
Language and Currency Switchers
Standard OpenCart switchers work via POST forms to respective controllers. In templates, the languages variable (for language) and currencies (for currency) are used. To avoid redirect to homepage when switching language, always pass the current URL as a hidden redirect parameter. This often breaks in custom themes — we check and fix it.
Multi-Store on Different Domains
OpenCart allows setting up multiple stores with a shared database but different domains, languages, and currencies. In admin, create a new store (System → Settings → Add Store) with domain and default settings. Products are linked to stores via the "Links" tab. Nginx uses a single config, OpenCart determines store_id by HTTP_HOST. This is convenient for regional versions.
Why SEO-URLs Can Duplicate and How to Fix It
Each record in the oc_seo_url table must have a unique combination of (store_id, language_id, keyword). If you accidentally create identical keywords for different languages, duplicates occur. Check with SQL:
SELECT keyword, COUNT(*) FROM oc_seo_url GROUP BY keyword HAVING COUNT(*) > 1; Solution: delete duplicates and set unique keywords for each language.
What's Included in a Turnkey Setup
- Installation and activation of language packs (Russian, Belarusian, English, etc.)
- Translation of system phrases and custom modules
- Configuration of SEO-URLs for each language and hreflang tags
- Addition of necessary currencies and auto-update rate configuration (ECB or NBRB/CBR API)
- Integration of language and currency switchers into the theme (with correct redirect)
- Multi-store configuration (if required)
- Testing on all languages and currencies, fixing typical errors
- Provision of management documentation (adding new languages, updating rates)
Why Choose Us
5 years on the web development market, over 20 successful OpenCart projects. Our engineers are certified in "OpenCart Professional." We guarantee all work — if something goes wrong, we fix it for free.
Timelines and Cost
Minimum project (2 languages + 1 currency) — from 2 days. Complex configurations with multi-store and custom rate sources — up to 4 days. Cost is calculated individually after analyzing your store. Contact us for an estimate.







