Handbook
Workspace localization scope
Canonical source: edit this file only at the workspace root: 05-workspace-localization-scope.md (relative to the multi-repo workspace that contains blueprints/, forgesdlc/, forgesdlc-kitchensink/, etc.).
Updated
Copies: the same filename is synced into each standalone git repository by sync-workspace-localization-scope.sh at the workspace root. Do not edit those copies by hand; change the canonical file, run the script, then commit per repo.
Last updated: 2026-04-06
1. Policy scope
- Geographic Europe — national / official languages of European states. Sub-state regional-only locales (for example Catalan, Welsh, Basque, Scots Gaelic) are out of scope unless this document is amended with an explicit exception.
- Balkan languages — separate SKUs. Bosnian, Croatian, Serbian, Slovenian, Albanian, Macedonian, and Montenegrin are not merged into a single Serbo-Croatian locale; each has its own row and translation memory.
- Baltic languages — separate SKUs. Estonian, Latvian, and Lithuanian are always three distinct locales.
- Ukrainian is in scope (
uk). Russian and Belarusian are not in scope for any product SKU (noru*, nobe*). - Extended locales (policy): Turkish, Hebrew, and a single Arabic SKU (
ar) are supported alongside European locales. - Andorra has only Catalan as official; Catalan is treated as regional-only here. For Andorra users, default to Spanish or French product locales until an exception is added.
2. Excluded language tags
| Tag pattern | Reason |
|---|---|
ru, ru-RU, … |
Policy: Russian not supported |
be, be-BY, … |
Policy: Belarusian not supported |
Do not ship store listings, in-app resources, or static site trees for these tags.
3. RTL and complex scripts
| Tag | Direction | Notes |
|---|---|---|
he, he-IL |
RTL | Full layout mirroring, bidi, icon direction, QA pass |
ar |
RTL | Same as Hebrew for UI chrome |
el |
LTR | Greek script |
bg, mk, sr, uk, … |
LTR | Cyrillic; watch line length and fonts |
Turkish (tr, tr-TR) is LTR but uses dotted capital İ; sorting and search must be locale-aware.
4. Arabic (single SKU)
- Standard tag:
ar(generic; MSA-oriented for formal UI copy). - Policy: one Arabic locale for the workspace unless this file is revised. National variants (
ar-SA,ar-EG, …) are out of scope until explicitly added.
5. Montenegrin vs Serbian
| Language | Preferred BCP-47 | Notes |
|---|---|---|
| Montenegrin | cnr |
ISO 639-3; use where the platform supports it |
| Fallback | sr-Latn-ME |
Some stacks lack cnr; document product-specific choice |
Android resource qualifiers may differ from web hreflang; align per platform in implementation guides.
6. Master locale table (supported SKUs)
Primary tags are BCP-47. Where a country variant matters for stores or legal copy, a more specific subtag may be used in implementation; the language row still counts as one workspace SKU.
Western, northern, and southern Europe
| Language | Primary tag(s) | Notes |
|---|---|---|
| English | en, en-GB |
UK, Ireland (English), Malta (with mt) |
| Irish | ga |
Ireland co-official |
| French | fr |
FR, BE, CH, LU, MC, etc. |
| German | de |
DE, AT, LI; de-CH in CH |
| Dutch | nl |
NL, BE |
| Luxembourgish | lb |
LU |
| Maltese | mt |
MT |
| Greek | el |
GR, CY |
| Spanish | es |
ES |
| Portuguese | pt |
PT |
| Italian | it |
IT, CH (it-CH), SM, VA |
| Icelandic | is |
IS |
| Norwegian Bokmål | nb |
NO |
| Norwegian Nynorsk | nn |
NO (separate SKU from nb) |
| Swedish | sv |
SE |
| Danish | da |
DK |
| Finnish | fi |
FI |
Central and eastern Europe (non-Balkan list below)
| Language | Primary tag(s) | Notes |
|---|---|---|
| Polish | pl |
PL |
| Czech | cs |
CZ |
| Slovak | sk |
SK |
| Hungarian | hu |
HU |
| Romanian | ro |
RO, MD |
| Bulgarian | bg |
BG |
Balkan (separate SKUs)
| Language | Primary tag(s) | Notes |
|---|---|---|
| Bosnian | bs |
BA |
| Croatian | hr |
HR |
| Serbian | sr |
RS; script variants (sr-Cyrl, sr-Latn) per product |
| Slovenian | sl |
SI |
| Albanian | sq |
AL, XK |
| Macedonian | mk |
MK |
| Montenegrin | cnr |
ME; see §5 |
Baltic (separate SKUs)
| Language | Primary tag(s) | Notes |
|---|---|---|
| Estonian | et |
EE |
| Latvian | lv |
LV |
| Lithuanian | lt |
LT |
Other Europe
| Language | Primary tag(s) | Notes |
|---|---|---|
| Ukrainian | uk |
UA |
Extended (non-European policy)
| Language | Primary tag(s) | Notes |
|---|---|---|
| Turkish | tr, tr-TR |
TR; also official in CY |
| Hebrew | he, he-IL |
IL; RTL |
| Arabic | ar |
RTL; single SKU (§4) |
7. i18n and l10n standards (workspace)
- Identifiers: use BCP-47 tags consistently (APIs, filenames, config).
- Excluded locales: never ship
ru*orbe*for this workspace’s products. - Dynamic strings: use ICU-style placeholders (
{name}, plural rules) in Android, Python, and TS as appropriate; do not concatenate translated fragments for grammar. - Static sites: when multiple languages exist, use stable URLs and
hreflangalternates for equivalent pages. - Stores and marketing: store listing locales may differ from in-app first ship; still must not use excluded tags.
- QA: RTL (
he,ar) requires a dedicated pass; Cyrillic and Greek need font and overflow checks.
8. Approximate locale count
- Western / northern / southern (table §6.1): 16 language rows (English counts as one policy row;
en-GBis a variant). - Central / eastern (§6.2): 6.
- Balkan (§6.3): 7.
- Baltic (§6.4): 3.
- Other Europe (§6.5): 1.
- Extended (§6.6): 3.
Rough total: about 36 named language SKUs (plus regional variants like en-GB / de-CH where products require them). Use this for TMS sizing and budgeting, not as a hard cap on resource-qualifier explosion per platform.
9. Propagation
After editing the canonical file:
./sync-workspace-localization-scope.sh
Commit the updated WORKSPACE-LOCALIZATION-SCOPE.md in each repository that received a copy (one commit per repo).
This duplicated file is an intentional workspace policy exception to “single source of truth” for Markdown in other contexts: each repo must carry the same SKU list for implementers without submodule pull order dependencies.