Localization (локализација, l10n) — адаптација садржаја мобилне апликације за језик, регион и културне особености циљне публике. За разлику од интернационализације (i18n), где се код припрема за превођење, локализација је сам процес превођења стрингова, форматирања датума, бројева и валута, избора слика и уважавања локалних норми. На iOS-у преводи се чувају у Localizable.strings (фасцикле .lproj за сваки језик), на Android-у — у values-ru, values-de и другим директоријумима ресурса. Више — у Android водичу за локализацију.
Главно
Localization (скраћено l10n — 10 слова између „l" и „n") — је процес адаптације апликације за конкретан језик и регион. Ако је i18n архитектонски темељ, онда је l10n испуна. i18n омогућава превођење, l10n га извршава. Локализација укључује: превођење свих текстова интерфејса, адаптацију формата датума и бројева, замену слика са културно осетљивим садржајем, корекцију правних текстова (политика приватности, EULA), подешавање система плаћања за регион и тестирање на циљним уређајима.
Пословна рентабилност — локализација директно утиче на конверзију. Према подацима CSA Research (2023), 76% корисника преферира куповину у апликацијама на матерњем језику, а 40% никада не купује на страном. Локализација на јапански за малопродајну апликацију повећава конверзију у просеку за 150% (Google, 2022). Локализоване апликације добијају 2–3 пута више органских инсталација у регионалним App Store и Google Play захваљујући регионалном ASO (кључне речи на циљном језику).
i18n vs l10n — две стране истог процеса. i18n: издвајање стрингова у ресурсе, подршка за RTL, форматирање бројева. Ради се једном од стране програмера. l10n: превођење стрингова, адаптација садржаја, локално тестирање. Ради се више пута од стране преводилаца и QA за сваку локализацију. У IT Sectr-у издвајамо 20–30% времена спринта за локализацију сваког новог језика — то укључује превођење, ревизију, тестирање на уређајима и исправљање грешака.
Localizable.strings — главни фајл за чување превода у iOS-у. Свака локализација има своју фасциклу .lproj: en.lproj/Localizable.strings, ru.lproj/Localizable.strings, de.lproj/Localizable.strings. Формат: „кључ" = „вредност"; (са тачком и зарезом). Apple користи Base Internationalization: Storyboard и XIB се креирају једном (Base.lproj), а стрингови интерфејса се извозе у Localizable.strings за сваки језик. Ово елиминише потребу за креирањем копија XIB-а за сваку локализацију.
// en.lproj/Localizable.strings
// "settings.title" = "Settings";
// "profile.greeting" = "Hello, %@!";
// "items.count" = "%d item(s)";
// ru.lproj/Localizable.strings
// "settings.title" = "Настройки";
// "profile.greeting" = "Здравствуйте, %@!";
// "items.count" = "%d шт.";
// Учитавање стринга по кључу
navigationItem.title = NSLocalizedString(
"settings.title",
comment: "Наслов екрана подешавања"
)
// Стринг са параметром
let name = "Ана"
greetingLabel.text = String.localizedStringWithFormat(
NSLocalizedString("profile.greeting", comment: ""), name
)
// XLIFF увоз (Xcode → Editor → Import Localizations)
// Аутоматски ажурира .lproj фајлове након рада преводиоца
Base Internationalization — приступ Apple-а у коме се интерфејс (Storyboard, XIB) креира једном у Base.lproj. При додавању језика, Xcode извози стрингове из Base-а у XLIFF фајл. Преводилац преводи XLIFF. Након импорта, Xcode креира .lproj са преведеним стринговима. Предност: не мора се дуплирати XIB за сваки језик. Ограничење: за RTL језике (арапски, хебрејски) може бити потребан посебан XIB са огледалним распоредом.
InfoPlist.strings — фајл за локализацију назива апликације (CFBundleDisplayName), дозвола камере/микрофона (NSCameraUsageDescription) и других вредности из Info.plist-а. Креира се у .lproj: ru.lproj/InfoPlist.strings. Формат: CFBundleDisplayName = „Моја апликација"; NSCameraUsageDescription = „Апликацији је потребан приступ камери за снимање фотографија";. Без локализације InfoPlist.strings-а, системски дијалози ће бити на енглеском.
Android ресурси за локализацију су организовани кроз квалификаторе (qualifiers) у називима директоријума. За руски језик — res/values-ru/, за немачки — res/values-de/, за бразилски португалски — res/values-pt-rBR/. Android подржава преко 160 локализација. Систем аутоматски бира ресурсе на основу језика уређаја (Locale.getDefault()). Ако тачна локализација не постоји — користе се ресурси из values/ (основна локализација, обично en).
// res/values/strings.xml (основни — енглески)
<string name="settings_title">Settings</string>
<string name="greeting">Hello, %s!</string>
// res/values-ru/strings.xml (руски)
<string name="settings_title">Подешавања</string>
<string name="greeting">Здраво, %s!</string>
// res/values-de/strings.xml (немачки)
<string name="settings_title">Einstellungen</string>
<string name="greeting">Hallo, %s!</string>
// Kotlin — јединствени код за све језике
textView.text = getString(R.string.settings_title)
// Стринг са параметром
val greeting = getString(R.string.greeting, userName)
// Локализоване слике
// res/drawable-ru/flag.png — застава за руску верзију
// res/drawable/flag.png — подразумевана застава
// Локализација распореда (за RTL језике)
// res/layout-ar/activity_main.xml — арапска верзија
Локализација не само стрингова — Android омогућава локализацију слика (res/drawable-ru/), боја (res/values-ru/colors.xml), димензија (res/values-ru/dimens.xml), анимација, менија, па чак и целих layout-а. За језике са различитом дужином речи (немачки је 30–40% дужи од енглеског) користите локализоване dimens.xml са повећаном ширином дугмади. За регионе са другом симболиком боја (бела — жалост у Кини) — локализоване colors.xml.
Тестирање — пребаците језик уређаја на циљни кроз Подешавања → Систем → Језик. Проверите: сви стрингови су преведени, датуми се правилно форматирају, бројеви се приказују са правилним сепаратором, слике одговарају региону, layout се не „ломи" при дугачким стринговима. За аутоматизацију користите Espresso са LocaleTestRule (Android Testing Library) — омогућава покретање тестова са различитим локализацијама без ручног пребацивања језика.
Културне особености — локализација се не ограничава на превођење стрингова. Симболика боја се разликује: црвена — срећа у Кини, опасност у САД, жалост у Јужној Африци. Бела — чистоћа у Европи, жалост у Кини. Иконе са гестовима: палац горе — позитив у САД, увреда на Блиском Истоку. Слике људи: у арапским земљама неприхватљиве су слике жена у купаћим костимима. Религијски симболи: крст, полумесец, Давидова звезда треба да се користе само у одговарајућем контексту.
Правни захтеви — свака држава има своје законе о дигиталним производима. GDPR (ЕУ) — обавезна сагласност за cookies и обраду података. CCPA (Калифорнија) — право на брисање података. Закон о личним подацима (Русија, 152-ФЗ) — чување података на серверима РФ. LGPD (Бразил) — аналог GDPR-а. Плаћања: у Кини су потребни Alipay/WeChat Pay, у Индији — UPI, у Бразилу — Boleto и PIX. Подесите платни пролаз за регион пре покретања локализације.
| Аспект | САД | Кина | УАЕ | Немачка |
|---|---|---|---|---|
| Систем плаћања | Apple Pay, картице | Alipay, WeChat Pay | Картице, Apple Pay | PayPal, Giropay |
| Боје бренда | Било које | Црвена — срећа | Зелена — ислам | Црна/жута |
| Друштвене мреже | Instagram, X | WeChat, Douyin | WhatsApp, X | WhatsApp, X |
| Датум | MM/dd/yyyy | yyyy/MM/dd | dd/MM/yyyy | dd.MM.yyyy |
| Закон о подацима | CCPA | PIPL | PDPL | GDPR |
Примери и садржај — прилагодите примере региону. За немачку локализацију користите метрички систем (кг, км), за америчку — империјални (lb, mi). Телефонски бројеви, поштански бројеви, адресе — форматирају се различито. Валутни примери: ¥1000 у Јапану, $9.99 у САД, 999 ₽ у Русији. Слике хране, одеће, ентеријера треба да одговарају регионалним стандардима. У IT Sectr-у препоручујемо ангажовање локалних консултаната за проверу културне адаптације.
Алати за локализацију — професионалне платформе аутоматизују процес: Lokalise, Crowdin, POEditor, Smartling, Phrase. Оне се интегришу са репозиторијумом, аутоматски увозе нове стрингове, прате промене (Delta updates — преводе се само измењени стрингови), пружају Translation Memory (ТМ — чување раније преведених фраза) и Glossary (глосар термина). Просечна цена професионалног превода: $0.08–0.15 по речи (зависи од језика).
Процес — (1) Програмер додаје i18n кључеве у код, гура у репозиторијум. (2) CI/CD (GitHub Actions / GitLab CI) аутоматски шаље нове кључеве на платформу за локализацију. (3) Преводиоци добијају обавештење, преводе, чувају. (4) Преведени фајлови аутоматски креирају PR у репозиторијуму. (5) QA проверава локализацију на уређајима. (6) Издање. Циклус за једну локализацију: 2–5 радних дана (у зависности од обима). За 10 локализација: 5–15 дана при паралелном раду преводилаца.
Machine Translation + Human Review — савремени стандард. Превод неуронском мрежом (DeepL, Google Translate, GPT-4) даје квалитет 80–90% за популарне језичке парове. Човек-преводилац проверава: терминологију, контекст (речи могу имати различита значења на различитим екранима), културну адаптацију. У IT Sectr-у користимо хибридни приступ: ML превод + ревизија од стране изворног говорника. За критичне стрингове (правни, плаћања) — само професионални преводилац. Уштеда: до 60% трошкова уз очување квалитета.
Често постављана питања
Интернационализација — припрема кода за превођење (издвајање стрингова, RTL, форматирање). Локализација — само превођење и културна адаптација. i18n ради програмер једном, l10n — преводилац за сваки језик. i18n без l10n — апликација је спремна за превод, али није преведена. l10n без i18n — мора се преписивати код за сваки језик.
У фајловима Localizable.strings унутар .lproj фасцикли. За сваки језик: en.lproj (енглески), ru.lproj (руски), de.lproj (немачки). Формат: „кључ" = „вредност";. За множину — Localizable.stringsdict. Подешавања апликације (CFBundleDisplayName) — у InfoPlist.strings. Xcode управља .lproj-ом кроз Base Internationalization.
values-ru — директоријум ресурса Android-а за руски језик. Садржи strings.xml са преводима. Исто за друге језике: values-de (немачки), values-fr (француски). Android бира ресурсе на основу системског језика. Ако values-ru није пронађен — користи values/ (основни језик, обично енглески).
Увек користите Locale API. iOS: DateFormatter.locale = Locale(identifier: locale). Android: DateFormat.getDateInstance(DateFormat.SHORT, locale). Русија: 31.12.2024. САД: 12/31/2024. Јапан: 2024/12/31. Никада не постављајте фиксни формат — свака држава има своје стандарде. За унос датума користите UIDatePicker / DatePicker.
За глобалну покривеност довољно је 10–15 језика: енглески, шпански, француски, немачки, јапански, кинески, корејски, португалски, руски, италијански, арапски. За регионалну — 1–2 језика. Свака додатна локализација повећава органске инсталације за 5–15% у одговарајућем региону. App Store захтева најмање енглеску локализацију.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође