docs

❌ Locales and Multi-Language Setup

Overview

SCAYLE provides a comprehensive internationalization system that supports multiple languages and locales across different shop countries. Understanding how locales work and how to set up multi-language shops is essential for serving customers in their preferred language.

What are Locales?

A locale is a combination of a language and a territory that determines how content is displayed to users. In SCAYLE, locales are represented using standard ISO codes that encode both language and territory information.

Locale Code Structure

Locale codes follow the format language_TERRITORY where:

  • language is the ISO 639 language code (e.g., en, de, fr)
  • TERRITORY is the ISO 3166 country code (e.g., GB, DE, CH)

Examples:

  • en_GB - English (Great Britain)
  • de_DE - German (Germany)
  • fr_CH - French (Switzerland)
  • en_US - English (United States)

Supported Locales

SCAYLE supports a wide range of locales, including EU languages (Bulgarian, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hungarian, Italian, Latvian, Lithuanian, Polish, Portuguese, Romanian, Slovak, Slovenian, Spanish, Swedish, Norwegian) and non-EU languages (Turkish, English US).

Supported locales
  • bg_BG - Bulgarian
  • hr_HR - Croatian
  • cs_CZ - Czech
  • da_DK - Danish
  • nl_NL - Dutch
  • en_GB - English
  • et_EE - Estonian
  • fi_FI - Finnish
  • fr_FR - French
  • de_DE - German (Germany)
  • de_CH - German (Switzerland)
  • el_GR - Greek
  • hu_HU - Hungarian
  • ga_IE - Irish
  • it_IT - Italian
  • lv_LV - Latvian
  • lt_LT - Lithuanian
  • mt_MT - Maltese
  • pl_PL - Polish
  • pt_PT - Portuguese
  • ro_RO - Romanian
  • sk_SK - Slovak
  • sl_SI - Slovenian
  • es_ES - Spanish
  • sv_SE - Swedish
  • en_ZZ - English (global)
  • es_ZZ - Spanish (global)
  • de_AT - German (Austria)
  • fr_BE - French (Belgium)
  • de_BE - German (Belgium)
  • nl_BE - Dutch (Belgium)
  • ca_AD - Catalan (Andorra)
  • ar_AE - Arabic (United Arab Emirates)
  • fa_AF - Persian (Afghanistan)
  • ps_AF - Pashto (Afghanistan)
  • en_AG - English (Antigua & Barbuda)
  • en_AI - English (Anguilla)
  • sq_AL - Albanian (Albania)
  • hy_AM - Armenian (Armenia)
  • ln_AO - Lingala (Angola)
  • es_AR - Spanish (Argentina)
  • en_AS - English (American Samoa)
  • en_AU - English (Australia)
  • nl_AW - Dutch (Aruba)
  • sv_AX - Swedish (Åland Islands)
  • az_AZ - Azerbaijani
  • bs_BA - Bosnian (Bosnia)
  • en_BB - English (Barbados)
  • bn_BD - Bangla (Bangladesh)
  • fr_BF - French (Burkina Faso)
  • ar_BH - Arabic (Bahrain)
  • rn_BI - Rundi (Burundi)
  • yo_BJ - Yoruba (Benin)
  • en_BM - English (Bermuda)
  • ms_BN - Malay (Brunei)
  • es_BO - Spanish (Bolivia)
  • pt_BR - Portuguese (Brazil)
  • en_BS - English (Bahamas)
  • dz_BT - Dzongkha (Bhutan)
  • en_BW - English (Botswana)
  • be_BY - Belarusian (Belarus)
  • en_BZ - English (Belize)
  • en_CA - English (Canada)
  • en_CC - English (Cocos Keeling Islands)
  • fr_CD - French (Congo - Kinshasa)
  • fr_CF - French (Central African Republic)
  • fr_CG - French (Congo - Brazzaville)
  • fr_CI - French (Côte d’Ivoire)
  • en_CK - English (Cook Islands)
  • en_CL - Spanish (Chile)
  • en_CM - English (Cameroon)
  • fr_CM - French (Cameroon)
  • zh_CN - Chinese (China)
  • es_CO - Spanish (Colombia)
  • es_CR - Spanish (Costa Rica)
  • es_CU - Spanish (Cuba)
  • pt_CV - Portuguese (Cape Verde)
  • en_CX - English (Christmas Island)
  • el_CY - Greek (Cyprus)
  • tr_CY - Turkish (Cyprus)
  • ar_DJ - Arabic (Djibouti)
  • en_DM - English (Dominica)
  • es_DO - Spanish (Dominican Republic)
  • ar_DZ - Arabic (Algeria)
  • fr_DZ - French (Algeria)
  • es_EC - Spanish (Ecuador)
  • qu_EC - Quechua (Ecuador)
  • ar_EG - Arabic (Egypt)
  • ar_EH - Arabic (Western Sahara)
  • ar_ER - Arabic (Eritrea)
  • am_ET - Amharic (Ethiopia)
  • en_FJ - English (Fiji)
  • en_FK - English (Falkland Islands)
  • en_FM - English (Micronesia)
  • fo_FO - Faroese (Faroe Islands)
  • fr_GA - French (Gabon)
  • en_GD - English (Grenada)
  • ka_GE - Georgian (Georgia)
  • os_GE - Ossetic (Georgia)
  • fr_GF - French (French Guiana)
  • en_GG - English (Guernsey)
  • en_GH - English (Ghana)
  • ak_GH - Akan (Ghana)
  • en_GI - English (Gibraltar)
  • da_GL - Danish (Greenland)
  • en_GM - English (Gambia)
  • fr_GN - French (Guinea)
  • fr_GP - French (Guadeloupe)
  • fr_GQ - French (Equatorial Guinea)
  • es_GQ - Spanish (Equatorial Guinea)
  • es_GT - Spanish (Guatemala)
  • en_GU - English (Guam)
  • pt_GW - Portuguese (Guinea-Bissau)
  • en_GY - English (Guyana)
  • en_HK - English (Hong Kong)
  • zh_HK - Chinese (Hong Kong)
  • es_HN - Spanish (Honduras)
  • fr_HT - French (Haiti)
  • id_ID - Indonesian (Indonesia)
  • he_IL - Hebrew (Israel)
  • ar_IL - Arabic (Israel)
  • en_IM - English (Isle of Man)
  • en_IN - English (India)
  • hi_IN - Hindi (India)
  • bn_IN - Bangla (India)
  • ur_IN - Urdu (India)
  • pa_IN - Punjabi (India)
  • ar_IQ - Arabic (Iraq)
  • fa_IR - Persian (Iran)
  • is_IS - Icelandic (Iceland)
  • en_JE - English (Jersey)
  • en_JM - English (Jamaica)
  • ar_JO - Arabic (Jordan)
  • ja_JP - Japanese (Japan)
  • sw_KE - Swahili (Kenya)
  • en_KE - English (Kenya)
  • ky_KG - Kyrgyz (Kyrgyzstan)
  • ru_KG - Russian (Kyrgyzstan)
  • km_KH - Khmer (Cambodia)
  • en_KI - English (Kiribati)
  • fr_KM - French (Comoros)
  • ar_KM - Arabic (Comoros)
  • en_KN - English (St. Kitts & Nevis)
  • ko_KP - Korean (North Korea)
  • ko_KR - Korean (South Korea)
  • ar_KW - Arabic (Kuwait)
  • en_KY - English (Cayman Islands)
  • kk_KZ - Kazakh (Kazakhstan)
  • ru_KZ - Russian (Kazakhstan)
  • lo_LA - Lao (Laos)
  • ar_LB - Arabic (Lebanon)
  • en_LC - English (St. Lucia)
  • de_LI - German (Liechtenstein)
  • si_LK - Sinhala (Sri Lanka)
  • ta_LK - Tamil (Sri Lanka)
  • en_LR - English (Liberia)
  • en_LS - English (Lesotho)
  • de_LU - German (Luxembourg)
  • fr_LU - French (Luxembourg)
  • lb_LU - Luxembourgish (Luxembourg)
  • pt_LU - Portuguese (Luxembourg)
  • ar_LY - Arabic (Libya)
  • ar_MA - Arabic (Morocco)
  • fr_MA - French (Morocco)
  • fr_MC - French (Monaco)
  • ro_MD - Romanian (Moldova)
  • ru_MD - Russian (Moldova)
  • en_MG - English (Madagascar)
  • fr_MG - French (Madagascar)
  • mg_MG - Malagasy (Madagascar)
  • en_MH - English (Marshall Islands)
  • sq_MK - Albanian (Macedonia)
  • mk_MK - Macedonian (Macedonia)
  • bm_ML - Bambara (Mali)
  • fr_ML - French (Mali)
  • my_MM - Burmese (Myanmar Burma)
  • mn_MN - Mongolian (Mongolia)
  • en_MO - English (Macau SAR China)
  • pt_MO - Portuguese (Macau SAR China)
  • zh_MO - Chinese (Macau SAR China)
  • en_MP - English (Northern Mariana Islands)
  • fr_MQ - French (Martinique)
  • ar_MR - Arabic (Mauritania)
  • ff_MR - Fulah (Mauritania)
  • fr_MR - French (Mauritania)
  • en_MS - English (Montserrat)
  • en_MU - English (Mauritius)
  • fr_MU - French (Mauritius)
  • en_MW - English (Malawi)
  • es_MX - Spanish (Mexico)
  • en_MY - English (Malaysia)
  • ms_MY - Malay (Malaysia)
  • ta_MY - Tamil (Malaysia)
  • pt_MZ - Portuguese (Mozambique)
  • af_NA - Afrikaans (Namibia)
  • en_NA - English (Namibia)
  • fr_NC - French (New Caledonia)
  • fr_NE - English (Norfolk Island)
  • ha_NE - Hausa (Niger)
  • en_NF - English (Norfolk Island)
  • en_NG - English (Nigeria)
  • ha_NG - Hausa (Nigeria)
  • ig_NG - Igbo (Nigeria)
  • yo_NG - Yoruba (Nigeria)
  • es_NI - Spanish (Nicaragua)
  • nb_NO - Norwegian Bokmål (Norway)
  • nn_NO - Norwegian Nynorsk (Norway)
  • se_NO - Northern Sami (Norway)
  • ne_NP - Nepali (Nepal)
  • en_NR - English (Nauru)
  • en_NU - English (Niue)
  • en_NZ - English (New Zealand)
  • ar_OM - Arabic (Oman)
  • es_PA - Spanish (Panama)
  • qu_PE - Quechua (Peru)
  • es_PE - Spanish (Peru)
  • fr_PF - French (French Polynesia)
  • en_PG - English (Papua New Guinea)
  • en_PH - English (Philippines)
  • es_PH - Spanish (Philippines)
  • en_PK - English (Pakistan)
  • pa_PK - Punjabi (Pakistan)
  • ur_PK - Urdu (Pakistan)
  • fr_PM - French (St. Pierre & Miquelon)
  • en_PN - English (Pitcairn Islands)
  • en_PR - English (Puerto Rico)
  • es_PR - Spanish (Puerto Rico)
  • en_PW - English (Palau)
  • es_PY - Spanish (Paraguay)
  • ar_QA - Arabic (Qatar)
  • fr_RE - French (Réunion)
  • ce_RU - Chechen (Russia)
  • os_RU - Ossetic (Russia)
  • ru_RU - Russian (Russia)
  • tt_RU - Tatar (Russia)
  • en_RW - English (Rwanda)
  • ar_SA - Arabic (Saudi Arabia)
  • en_SB - English (Solomon Islands)
  • fr_SC - French (Seychelles)
  • ar_SD - Arabic (Sudan)
  • en_SD - English (Sudan)
  • en_SG - English (Singapore)
  • ms_SG - Malay (Singapore)
  • ta_SG - Tamil (Singapore)
  • zh_SG - Chinese (Singapore)
  • en_SH - English (St. Helena)
  • en_SL - English (Sierra Leone)
  • it_SM - Italian (San Marino)
  • ff_SN - Fulah (Senegal)
  • fr_SN - French (Senegal)
  • wo_SN - Wolof (Senegal)
  • ar_SO - Arabic (Somalia)
  • so_SO - Somali (Somalia)
  • nl_SR - Dutch (Suriname)
  • pt_ST - Portuguese (São Tomé & Príncipe)
  • es_SV - Spanish (El Salvador)
  • ar_SY - Arabic (Syria)
  • fr_SY - French (Syria)
  • en_SZ - English (Swaziland)
  • en_TC - English (Turks & Caicos Islands)
  • fr_TD - French (Chad)
  • ar_TD - Arabic (Chad)
  • ee_TG - Ewe (Togo)
  • fr_TG - French (Togo)
  • th_TH - Thai (Thailand)
  • tg_TJ - Tajik (Tajikistan)
  • en_TK - English (Tokelau)
  • pt_TL - Portuguese (Timor-Leste)
  • ar_TN - Arabic (Tunisia)
  • fr_TN - French (Tunisia)
  • en_TO - English (Tonga)
  • to_TO - Tongan (Tonga)
  • tr_TR - Turkish (Turkey)
  • en_TT - English (Trinidad & Tobago)
  • en_TV - English (Tuvalu)
  • zh_TW - Chinese (Taiwan)
  • en_TZ - English (Tanzania)
  • sw_TZ - Swahili (Tanzania)
  • ru_UA - Russian (Ukraine)
  • uk_UA - Ukrainian (Ukraine)
  • sw_UG - Swahili (Uganda)
  • en_US - English (United States)
  • es_US - Spanish (United States)
  • es_UY - Spanish (Uruguay)
  • uz_UZ - Uzbek (Uzbekistan)
  • it_VA - Italian (Vatican City)
  • en_VC - English (St. Vincent & Grenadines)
  • es_VE - Spanish (Venezuela)
  • en_VG - English (British Virgin Islands)
  • en_VI - English (U.S. Virgin Islands)
  • vi_VN - Vietnamese (Vietnam)
  • en_VU - English (Vanuatu)
  • fr_VU - French (Vanuatu)
  • fr_WF - French (Wallis & Futuna)
  • en_WS - English (Samoa)
  • ar_YE - Arabic (Yemen)
  • fr_YT - French (Mayotte)
  • af_ZA - Afrikaans (South Africa)
  • en_ZA - English (South Africa)
  • zu_ZA - Zulu (South Africa)
  • en_ZM - English (Zambia)
  • en_ZW - English (Zimbabwe)
  • nd_ZW - North Ndebele (Zimbabwe)
  • sn_ZW - Shona (Zimbabwe)
  • sr_RS - Serbian (Serbia)
  • fr_CH - French (Switzerland)

Custom Locales

SCAYLE also supports custom locales for special use cases:

  • en_ZZ - English (Global) - used for global shops
  • en_AA - English (Europe) - used for European shops

Multi-Language Shop Setup

Understanding Shop Countries and Languages

In SCAYLE, you must create a separate shop country for every country and language combination. This means:

  • A Swiss shop in French = one shop country
  • A Swiss shop in German = another shop country
  • A German shop in English = another shop country

Current Limitations

One Language per Shop Country:

  • Each shop country can only support one language at a time
  • Multiple languages in the same country require separate shop countries
  • The supportedLanguageCodes array is currently not used in practice

Language Sharing Across Shops:

  • Multiple shops using the same language share the same translation container
  • This can be problematic when different brands need different translations for the same language
  • Workarounds include using country-specific values or language overrides

Setting Up Multi-Language Shops

Step 1: Create Shop Countries

For each country and language combination, create a separate shop country:

Step 2: Configure Translations

  1. Navigate to SCAYLE Panel: Shops ➜ Shop ➜ Internationalization ➜ Translations
  2. Select target language for each shop country
  3. Manage translations for Attribute Groups, Simple Attributes, Advanced Attributes, Master Categories, Default Filters, and Checkout Content

Step 3: Handle Checkout Translations

For Checkout translations, you have two options:

Option A: SCAYLE Panel (Recommended)

  • Enable Panel translations under Settings ➜ Checkout ➜ Configurations ➜ Disable Panel Translations
  • Manage translations directly in the Panel
  • Use AI-assisted translation features

Option B: Crowdin (Legacy)

  • Access Crowdin through your SCAYLE Account Manager
  • Manage translations in the external platform
  • Release translations through Crowdin's release process

Multi-Country Shops

For regional or global shops, SCAYLE offers multi-country configurations:

Europe Shop (AA):

  • Country code: AA
  • Language code: en_ZZ
  • Currency: EUR
  • Example: shop.eu

Global Shop (ZZ):

  • Country code: ZZ
  • Language code: en_ZZ
  • Currency: USD
  • Example: shop.com

Example Multi-Language Shop Configuration

Here's an example setup for a fashion retailer serving Germany, Switzerland, and Austria:

Shop CountryCountry CodeLanguage CodeCurrencyURL
Germany (German)DEde_DEEURshop.de
Germany (English)DEen_GBEURshop.de/en
Switzerland (German)CHde_CHCHFshop.ch
Switzerland (French)CHfr_CHCHFshop.ch/fr
Austria (German)ATde_ATEURshop.at

Best Practices

  1. Plan Your Structure: Determine which countries and languages you need before setup
  2. Use Standard Locales: Stick to standard ISO locale codes when possible
  3. Consider Translation Sharing: Be aware that shops with the same language share translations
  4. Test Fallbacks: Ensure your translation layers work correctly
  5. Monitor Coverage: Regularly check for missing translations
  6. Use Panel Translations: Prefer SCAYLE Panel over Crowdin for easier management

Translation Layers in SCAYLE Checkout

SCAYLE implements a sophisticated four-layer translation system that ensures users never see untranslated strings.

Layer 1: English Default Translations (Least Important)

  • Base layer providing English translations for all new features
  • Fallback when all other layers fail
  • Not intended for end users but ensures complete coverage

Layer 2: AI-Generated Translations

  • Provides locale-specific translations generated by AI
  • Available for approximately 20 supported locales
  • Automatically generates translations when new English keys are added

Layer 3: Crowdin Translations

  • Manual translations managed through the Crowdin platform
  • Currently being phased out in favor of Panel translations
  • Access managed by your SCAYLE Account Manager

Layer 4: SCAYLE Panel Translations (Most Important)

  • Primary translation management system
  • Real-time updates with AI-assisted translation
  • Can be enabled under Settings ➜ Checkout ➜ Configurations ➜ Disable Panel Translations

All layers are deeply merged, meaning if a single layer is missing a translation, the system automatically falls back to the previous layer. This ensures customers never see untranslated strings.