Globalizare: ce este, i18n și multilingvismul în aplicații

Autor: IT Sectr Publicat: 2026-02-26 Timp de citire: 8 min

Globalizarea (globalizare, de asemenea internaționalizare, i18n) — procesul de pregătire a aplicației mobile pentru lucrul cu mai multe limbi și formate regionale fără modificarea codului sursă. Include extragerea resurselor text din cod, suportul pentru diferite formate de date, numere și valute, luarea în considerare a direcției textului (LTR/RTL) și adaptarea layout-ului pentru diferite limbi. În iOS se folosesc NSLocalizedString și Localizable.strings, în Android — strings.xml în directoarele values-{lang}. Mai multe în documentația Apple despre internaționalizare.

Principalele

  • Globalizare (i18n) — pregătirea codului aplicației pentru mai multe limbi și regiuni
  • NSLocalizedString — macro-ul Swift pentru extragerea șirurilor traduse din Localizable.strings
  • strings.xml — fișierul XML Android unde sunt stocate resursele de șiruri pentru fiecare limbă
  • RTL — suport pentru limbile scrise de la dreapta la stânga (arabă, ebraică, urdu)
  • Formate — datele, numerele și valutele trebuie formatate prin API-uri dependente de Locale

Ce este Globalizarea (i18n) și de ce este necesară?

Globalizarea (abreviat i18n — 18 litere între «i» și «n») — pregătirea arhitecturală a aplicației pentru lucrul cu orice limbă și regiune. Regula cheie a i18n: niciun șir de text nu trebuie să fie codificat fix (hardcoded) în codul sursă. În schimb, șirurile sunt extrase în fișiere de resurse, iar codul le accesează prin chei. La adăugarea unei noi limbi, este suficient să adaugi un fișier de traducere — codul rămâne neschimbat. Aceasta deosebește i18n de localizare (l10n), unde se traduc șirurile în sine.

Argumentul de afaceri — globalizarea crește piața. Conform Common Sense Advisory (2023), peste 70% dintre utilizatori preferă să cumpere în aplicații în limba lor maternă. Localizarea în 10 limbi crește audiența potențială cu 80%. Fără i18n, fiecare extindere într-o nouă limbă necesită modificări de cod, ceea ce încetinește intrarea pe piață și crește costul de 5–10 ori. O arhitectură i18n corectă permite suportarea a 40+ limbi cu costuri minime.

Componente i18n includ: externalizarea șirurilor (String externalization), pluralizarea (pluralization pentru 1/2/5+), formatarea datelor și numerelor (DateFormatter/SimpleDateFormat), suportul pentru limbile RTL (Right-to-Left), sortarea după regulile locale (Collator), simbolurile regionale (separatori de mii, semne zecimale). În IT Sectr punem i18n în faza de arhitectură, nu adăugăm post-factum — aceasta economisește până la 60% din timp la localizarea ulterioară.

Internaționalizare în iOS: NSLocalizedString și XLIFF

NSLocalizedString — macro-ul principal Swift pentru lucrul cu traduceri. Format: NSLocalizedString(«key», comment: «descriere pentru traducător»). Macro-ul înlocuiește automat șirul din Localizable.strings pentru locale-ul curent al dispozitivului (NSLocale.preferredLanguages). Dacă traducerea pentru cheie nu este găsită, se returnează cheia însăși sau valoarea în development language (de obicei en). Apple recomandă utilizarea cheilor semnificative, nu a șirurilor englezești ca chei.

swift
// Localizable.strings (en)
// "welcome_title" = "Bun venit!";
// Localizable.strings (ru)
// "welcome_title" = "Bun venit!";

// Cod Swift — unic pentru toate limbile
titleLabel.text = NSLocalizedString(
    "welcome_title",
    comment: "Titlul ecranului de bun venit"
)

// Pluralizare prin Localizable.stringsdict
// 
// <dict>
//     <key>items_count</key>
//     <dict>
//         <key>NSStringLocalizedFormatKey</key>
//         <string>%#@items@</string>
//         <key>items</key>
//         <dict>
//             <key>one</key>
//             <string>%d produs</string>
//             <key>few</key>
//             <string>%d produse</string>
//             <key>many</key>
//             <string>%d de produse</string>
//         </dict>
//     </dict>
// </dict>

// Utilizarea pluralizării
let items = 5
let label = String.localizedStringWithFormat(
    NSLocalizedString("items_count", comment: ""), items
)

XLIFF — format de schimb de traduceri între developeri și traducători. Xcode exportă un fișier XLIFF (Editor → Export for Localization) care conține toate șirurile pentru traducere. Traducătorul lucrează cu XLIFF în instrumente CAT (Trados, memoQ, Smartcat). După traducere, XLIFF este importat înapoi în Xcode (Editor → Import Localizations). XLIFF actualizează automat toate directoarele .lproj. Acesta este fluxul de lucru standard de localizare a aplicațiilor iOS în producție.

SwiftUI și i18n

SwiftUI lucrează cu NSLocalizedString prin inițializatorul Text. Textul în SwiftUI este automat internaționalizat: Text(«welcome_title») caută traducerea în Localizable.strings la fel ca NSLocalizedString. Pentru pluralizare folosiți Text(«%d items», count: items). SwiftUI suportă formatarea datelor prin Text(date, style: .date) — folosește automat Locale.current. Apple recomandă SwiftUI pentru proiecte noi, deoarece internaționalizarea în el este mai transparentă.

Internaționalizare în Android: strings.xml și RTL

Android i18n se bazează pe sistemul de resurse. Șirurile sunt extrase în res/values/strings.xml pentru limba implicită (de obicei engleză). Pentru fiecare limbă se creează un director separat: res/values-ru/strings.xml (rusă), res/values-de/strings.xml (germană), res/values-fr/strings.xml (franceză). Android selectează automat șirurile pe baza limbii de sistem a dispozitivului (Locale.getDefault()). Dacă nu există un locale exact, se folosește versiunea de bază (values/strings.xml).

kotlin
// res/values/strings.xml (engleză, implicit)
<resources>
    <string name="welcome_title">Welcome!</string>
    <string name="items_count">%d item(s)</string>
</resources>

// res/values-ru/strings.xml (rusă)
<resources>
    <string name="welcome_title">Bun venit!</string>
    <plurals name="items_count">
        <item quantity="one">%d produs</item>
        <item quantity="few">%d produse</item>
        <item quantity="many">%d de produse</item>
    </plurals>
</resources>

// Cod Kotlin
textView.text = getString(R.string.welcome_title)

// Pluralizare
val items = 5
textView.text = resources.getQuantityString(
    R.plurals.items_count, items, items
)

// Suport RTL în cod
textView.textDirection = View.TEXT_DIRECTION_LOCALE
// Manifest: supportsRtl="true"

RTL (Right-to-Left) — suport pentru limbile în care textul se citește de la dreapta la stânga (arabă, ebraică, urdu, persană). Android suportă RTL prin atributele android:layoutDirection și android:textDirection. În manifest setați android:supportsRtl="true" — iar Android reflectă automat layout-ul. NavDrawer, pictogramele înapoi/înainte, alinierea textului trebuie să funcționeze în ambele direcții. În cod folosiți View.LAYOUT_DIRECTION_LOCALE și Gravity.START/END în loc de LEFT/RIGHT.

Resurse localizate

Android Resource Qualifiers permit localizarea nu doar a șirurilor, ci și a imaginilor (res/drawable-ru/), layout-urilor (res/layout-ru/), animațiilor, culorilor. Pentru arabă și ebraică sunt necesare layout-uri separate cu oglindirea elementelor — folosiți res/layout-ar/ (arabă). Android suportă și variante regionale: values-rUS, values-rGB, values-de-DE. Qualifiers se combină: values-ldrtl-ru — rusă pentru afișaje RTL.

Formate regionale: date, numere, valută în iOS și Android

Date și timp — unul dintre aspectele cheie ale i18n. Diferite regiuni folosesc formate diferite: Rusia — ZZ.LL.AAAA, SUA — LL/ZZ/AAAA, Japonia — AAAA.LL.ZZ. Utilizarea unui format fix (yyyy-MM-dd) pentru afișarea utilizatorului este o eroare. În iOS folosiți DateFormatter cu Locale(identifier: locale), în Android — DateFormat.getDateInstance(DateFormat.SHORT, locale). Pentru asistenți vocali și căutarea AI, datele trebuie să fie în ISO 8601 în reprezentarea internă.

Numere și valută — în diferite regiuni separatori diferiți: 1,234.56 (SUA) vs 1.234,56 (Rusia), 1 234,56 (Franța). iOS: NumberFormatter cu .locale = locale. Android: DecimalFormat cu DecimalFormatSymbols(locale). Pentru valute: format ¥1,234 (Japonia) vs $1,234.56 (SUA) vs 1 234,56 ₽ (Rusia). Nu concatenați niciodată valuta și numărul manual — folosiți NumberFormatter.currencyCode și .currencySymbol.

RegiuneDataNumărValută
Rusia31.12.20241 234,561 234,56 ₽
SUA12/31/20241,234.56$1,234.56
Germania31.12.20241.234,561.234,56 €
Japonia2024/12/311,234¥1,234
Arabia Saudită31/12/20241,234.561,234.56 SAR

Sortare (Collation) — sortarea alfabetică diferă în diferite limbi. În spaniolă «ch» vine după «c». În suedeză «ä» este la sfârșitul alfabetului. În germană «ß» se sortează ca «ss». iOS: LocalizedComparison (String.localizedCompare). Android: Collator.getInstance(locale). Nu folosiți niciodată compareTo() pentru șirurile afișate utilizatorului — folosește ordinea Unicode Code Point, care nu ține cont de regulile regionale.

Cele mai bune practici de internaționalizare a aplicațiilor mobile

Principii arhitecturale — începeți i18n de la primul commit. Fiecare șir din cod trebuie să treacă printr-o funcție de înfășurare (tr("key")), care nu există până la configurarea i18n — aceasta îl va forța pe dezvoltator să extragă șirurile imediat. Nu folosiți șirurile englezești ca chei — la modificarea formulării în engleză va trebui să actualizați toate traducerile. Folosiți chei semnificative: «profile.title», «settings.language.label».

Pseudolocalizare — tehnica de testare a i18n înainte de traducerea efectivă. Înlocuiți fiecare literă latină cu simboluri cu diacritice (á, é, ñ, ü) pentru verificarea codificării, adăugați prefixul [XXX] pentru verificarea trunchierii șirurilor. Xcode: scheme de lansare — pseudolimba «Double-Length Pseudolanguage». Android: Developer Options — Force RTL layout direction, System font scale până la 200%. Pseudolocalizarea găsește 80% din problemele i18n fără implicarea traducătorului.

Lista de verificare IT Sectr i18n — înainte de lansare verificăm: (1) nu există șiruri hardcoded în cod (excepție: loguri), (2) pluralizarea funcționează corect pentru toate limbile, (3) datele/numerele sunt formatate prin Locale API, (4) layout-ul se afișează corect în limbile RTL, (5) șirurile nu sunt trunchiate la scalarea maximă, (6) pseudolocalizarea nu a evidențiat erori, (7) toate limbile declarate în magazine au un set complet de traduceri.

Întrebări frecvente

Cu ce diferă i18n de l10n?

i18n (internaționalizare) — pregătirea codului: extragerea șirurilor, suport RTL, formatare. Se face de către dezvoltator o singură dată. l10n (localizare) — traducerea șirurilor într-o limbă specifică. Se face de către traducător de multe ori pentru fiecare localizare. i18n — arhitectură, l10n — conținut. Fără i18n, localizarea este imposibilă în principiu.

Cum funcționează NSLocalizedString în Swift?

NSLocalizedString — macro care caută valoarea după cheie în Localizable.strings pentru locale-ul curent al dispozitivului. Dacă traducerea este găsită — o returnează. Dacă nu — returnează cheia. Format: NSLocalizedString(«key», comment: «descriere»). Pentru formatarea cu parametri folosiți String.localizedStringWithFormat().

Cum sunt organizate strings.xml în Android?

strings.xml — fișier cu traduceri în directorul res/values/{lang}/. Versiunea de bază în values/strings.xml, traducerile — în values-ru/strings.xml. Codul accesează prin getString(R.string.key). Android însuși alege fișierul necesar pe baza limbii de sistem. Pentru pluralizare se folosește resursa <plurals> cu specificatorii zero/one/few/many/other.

Ce este RTL în contextul i18n?

RTL (Right-to-Left) — direcția de scriere pentru arabă, ebraică, urdu, persană. Android: supportsRtl="true" în manifest, android:layoutDirection, Gravity.START/END. iOS: UISemanticContentAttribute.forceLeftToRight pentru RTL forțat. Layout-ul trebuie să se oglindească: meniul în dreapta, textul — de la dreapta la stânga, pictogramele de navigare — răsturnate.

Ce limbi sunt obligatorii pentru publicare?

Pentru publicarea globală setul minim: engleză, spaniolă, franceză, germană, japoneză, chineză, coreeană, portugheză, rusă, italiană. App Store necesită cel puțin localizarea în engleză. Fiecare localizare suplimentară crește audiența potențială. Pentru piața locală sunt suficiente 1–2 limbi.

Rezumat

  • Globalizare (i18n) — pregătirea arhitecturală a aplicației pentru multiple limbi și regiuni
  • NSLocalizedString — macro Swift pentru traducerea șirurilor prin Localizable.strings + export XLIFF
  • strings.xml — resursa Android cu traduceri în directoarele values-{lang}
  • RTL — suport obligatoriu pentru arabă, ebraică, urdu și persană
  • Formate — datele și numerele se formatează strict prin Locale API, nu manual
  • Pluralizare — iOS: stringsdict, Android: <plurals> cu șase forme de cantitate
  • Pseudolocalizare — tehnică de testare i18n înainte de traducere (detectează 80% din probleme)

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și