Globalization: nedir, i18n ve uygulamalarda çok dillilik

Yazar: IT Sectr Yayınlanma: 2026-02-26 Okuma süresi: 8 dk

Globalization (küreselleşme, ayrıca uluslararasılaştırma, i18n) — kaynak kodunu değiştirmeden mobil uygulamayı birden çok dil ve bölgesel biçimle çalışacak şekilde hazırlama sürecidir. Koddan dize kaynaklarını çıkarmayı, farklı tarih, sayı ve para birimi biçimlerini desteklemeyi, metin yönünü (LTR/RTL) dikkate almayı ve farklı diller için düzeni uyarlamayı içerir. iOS'ta NSLocalizedString ve Localizable.strings kullanılır, Android'de — values-{lang} dizinlerinde strings.xml. Daha fazlası için Apple uluslararasılaştırma dokümantasyonuna bakın.

Önemli Noktalar

  • Globalization (i18n) — uygulama kodunun birden çok dil ve bölgeye hazırlanması
  • NSLocalizedString — Localizable.strings'den çevrilmiş dizeleri almak için Swift makrosu
  • strings.xml — her dil için kaynak dizelerinin depolandığı Android XML dosyası
  • RTL — sağdan sola yazılan diller (Arapça, İbranice, Urduca) desteği
  • Biçimler — tarihler, sayılar ve para birimleri Locale bağımlı API'ler aracılığıyla biçimlendirilmelidir

Globalization (i18n) nedir ve neden gereklidir?

Globalization (kısaltma i18n — "i" ve "n" arasında 18 harf) — uygulamanın herhangi bir dil ve bölgeyle çalışacak şekilde mimari hazırlığıdır. i18n'nin temel kuralı: kaynak kodunda hiçbir metin dizesi sabit kodlanmış (hardcoded) olmamalıdır. Bunun yerine, dizeler kaynak dosyalarına çıkarılır ve kod bunlara anahtarlar aracılığıyla erişir. Yeni bir dil eklerken, yalnızca bir çeviri dosyası eklemek yeterlidir — kod değişmeden kalır. Bu, i18n'yi dizelerin kendilerinin çevrildiği yerelleştirmeden (l10n) ayırır.

İş gerekçesi — küreselleşme pazarı genişletir. Common Sense Advisory'e (2023) göre, kullanıcıların %70'inden fazlası kendi ana dillerindeki uygulamalardan satın almayı tercih ediyor. 10 dilde yerelleştirme, potansiyel kitleyi %80 artırır. i18n olmadan, her yeni dil genişlemesi kod değişiklikleri gerektirir, pazara çıkış süresini yavaşlatır ve maliyetleri 5-10 kat artırır. Doğru i18n mimarisi, minimum maliyetle 40+ dili desteklemeye olanak tanır.

i18n bileşenleri şunları içerir: dize dışsallaştırması, çoğul biçimler (1/2/5+ için), tarih ve sayı biçimlendirme (DateFormatter/SimpleDateFormat), RTL dilleri desteği (Right-to-Left), yerel ayara göre sıralama (Collator), bölgesel semboller (bin ayırıcıları, ondalık işaretleri). IT Sectr'de, i18n'yi sonradan değil, mimari aşamada uygularız — bu, sonraki yerelleştirmede %60'a kadar zaman tasarrufu sağlar.

iOS'ta Uluslararasılaştırma: NSLocalizedString ve XLIFF

NSLocalizedString — çevirilerle çalışmak için birincil Swift makrosudur. Biçim: NSLocalizedString("key", comment: "çevirmen için açıklama"). Makro, geçerli cihaz yerel ayarı (NSLocale.preferredLanguages) için Localizable.strings'den dizeyi otomatik olarak değiştirir. Anahtar için çeviri bulunamazsa, anahtarın kendisi veya geliştirme dilindeki (genellikle en) değer döndürülür. Apple, anahtar olarak İngilizce dizeler yerine anlamlı anahtarlar kullanmayı önerir.

swift
// Localizable.strings (en)
// "welcome_title" = "Welcome!";
// Localizable.strings (ru)
// "welcome_title" = "Hoş geldiniz!";

// Swift kodu — tüm diller için birleşik
titleLabel.text = NSLocalizedString(
    "welcome_title",
    comment: "Karşılama ekranı başlığı"
)

// Localizable.stringsdict ile çoğullar
// 
// <dict>
//     <key>items_count</key>
//     <dict>
//         <key>NSStringLocalizedFormatKey</key>
//         <string>%#@items@</string>
//         <key>items</key>
//         <dict>
//             <key>one</key>
//             <string>%d ürün</string>
//             <key>few</key>
//             <string>%d ürün</string>
//             <key>many</key>
//             <string>%d ürün</string>
//         </dict>
//     </dict>
// </dict>

// Çoğulların kullanımı
let items = 5
let label = String.localizedStringWithFormat(
    NSLocalizedString("items_count", comment: ""), items
)

XLIFF — geliştiriciler ve çevirmenler arasında çeviri alışveriş biçimidir. Xcode, çevrilecek tüm dizeleri içeren bir XLIFF dosyası dışa aktarır (Editor → Export for Localization). Çevirmen, CAT araçlarında (Trados, memoQ, Smartcat) XLIFF ile çalışır. Çeviriden sonra XLIFF, Xcode'a geri aktarılır (Editor → Import Localizations). XLIFF, tüm .lproj dizinlerini otomatik olarak günceller. Bu, üretimdeki iOS uygulamaları için standart yerelleştirme iş akışıdır.

SwiftUI ve i18n

SwiftUI, Text başlatıcısı aracılığıyla NSLocalizedString ile çalışır. SwiftUI'deki metin otomatik olarak uluslararasılaştırılır: Text("welcome_title"), NSLocalizedString gibi Localizable.strings'de çeviriyi arar. Çoğullar için Text("%d items", count: items) kullanın. SwiftUI, Text(date, style: .date) aracılığıyla tarih biçimlendirmeyi destekler — otomatik olarak Locale.current kullanır. Apple, yeni projeler için SwiftUI'yi önerir çünkü uluslararasılaştırma daha şeffaftır.

Android'de Uluslararasılaştırma: strings.xml ve RTL

Android i18n, kaynak sistemi üzerine kuruludur. Varsayılan dil (genellikle İngilizce) için dizeler res/values/strings.xml dosyasına yerleştirilir. Her dil için ayrı bir dizin oluşturulur: res/values-ru/strings.xml (Rusça), res/values-de/strings.xml (Almanca), res/values-fr/strings.xml (Fransızca). Android, cihazın sistem diline (Locale.getDefault()) göre otomatik olarak dizeleri seçer. Tam yerel ayar bulunamazsa, temel (values/strings.xml) kullanılır.

kotlin
// res/values/strings.xml (İngilizce, varsayılan)
<resources>
    <string name="welcome_title">Welcome!</string>
    <string name="items_count">%d item(s)</string>
</resources>

// res/values-ru/strings.xml (Rusça)
<resources>
    <string name="welcome_title">Hoş geldiniz!</string>
    <plurals name="items_count">
        <item quantity="one">%d öğe</item>
        <item quantity="few">%d öğe</item>
        <item quantity="many">%d öğe</item>
    </plurals>
</resources>

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

// Çoğullar
val items = 5
textView.text = resources.getQuantityString(
    R.plurals.items_count, items, items
)

// Kodda RTL desteği
textView.textDirection = View.TEXT_DIRECTION_LOCALE
// Manifest: supportsRtl="true"

RTL (Right-to-Left) — metnin sağdan sola okunduğu diller (Arapça, İbranice, Urduca, Farsça) desteğidir. Android, RTL'yi android:layoutDirection ve android:textDirection nitelikleri aracılığıyla destekler. Bildirimde android:supportsRtl="true" belirtin — ve Android düzeni otomatik olarak yansıtacaktır. NavDrawer, geri/ileri simgeleri, metin hizalaması her iki yönde de çalışmalıdır. Kodda, LEFT/RIGHT yerine View.LAYOUT_DIRECTION_LOCALE ve Gravity.START/END kullanın.

Yerelleştirilmiş Kaynaklar

Android Resource Qualifiers yalnızca dizeleri değil, aynı zamanda görselleri (res/drawable-ru/), düzenleri (res/layout-ru/), animasyonları, renkleri de yerelleştirmeye olanak tanır. Arapça ve İbranice için, yansıtılmış öğelerle ayrı düzenler gerekir — res/layout-ar/ (Arapça) kullanın. Android ayrıca bölgesel varyantları da destekler: values-rUS, values-rGB, values-de-DE. Niteleyiciler birleştirilebilir: values-ldrtl-ru — RTL ekranlar için Rusça.

Bölgesel Biçimler: iOS ve Android'de tarihler, sayılar, para birimi

Tarihler ve saat — i18n'nin temel yönlerinden biridir. Farklı bölgeler farklı biçimler kullanır: Rusya — GG.AA.YYYY, ABD — AA/GG/YYYY, Japonya — YYYY.AA.GG. Kullanıcıya göstermek için sabit bir biçim (yyyy-MM-dd) kullanmak hatadır. iOS'ta Locale(identifier: locale) ile DateFormatter kullanın, Android'de — DateFormat.getDateInstance(DateFormat.SHORT, locale). Sesli asistanlar ve AI araması için tarihler dahili olarak ISO 8601 biçiminde olmalıdır.

Sayılar ve para birimi — farklı bölgelerin farklı ayırıcıları vardır: 1,234.56 (ABD) vs 1.234,56 (Rusya), 1 234,56 (Fransa). iOS: .locale = locale ile NumberFormatter. Android: DecimalFormatSymbols(locale) ile DecimalFormat. Para birimleri için: biçim ¥1,234 (Japonya) vs $1,234.56 (ABD) vs 1 234,56 ₽ (Rusya). Para birimini ve sayıyı asla manuel olarak birleştirmeyin — NumberFormatter.currencyCode ve .currencySymbol kullanın.

BölgeTarihSayıPara Birimi
Rusya31.12.20241 234,561 234,56 ₽
ABD12/31/20241,234.56$1,234.56
Almanya31.12.20241.234,561.234,56 €
Japonya2024/12/311,234¥1,234
Suudi Arabistan31/12/20241,234.561,234.56 SAR

Sıralama (Collation) — alfabetik sıralama diller arasında farklılık gösterir. İspanyolcada "ch", "c"den sonra gelir. İsveççede "ä" alfabenin sonundadır. Almancada "ß", "ss" olarak sıralanır. iOS: LocalizedComparison (String.localizedCompare). Android: Collator.getInstance(locale). Kullanıcıya gösterilen dizeler için asla compareTo() kullanmayın — bölgesel kuralları dikkate almayan Unicode Code Point sırasını kullanır.

Mobil Uygulama Uluslararasılaştırması için En İyi Uygulamalar

Mimari ilkeler — i18n'ye ilk committen başlayın. Koddaki her dize, i18n yapılandırılana kadar var olmayan bir sarmalayıcı işlevden (tr("key")) geçmelidir — bu, geliştiriciyi hemen dizeleri dışsallaştırmaya zorlar. İngilizce dizeleri anahtar olarak kullanmayın — İngilizce ifade değiştiğinde tüm çevirilerin güncellenmesi gerekir. Anlamlı anahtarlar kullanın: "profile.title", "settings.language.label".

Sözde yerelleştirme (Pseudolocalization) — gerçek çeviriden önce i18n test tekniğidir. Kodlamayı kontrol etmek için her Latin harfini aksanlı karakterlerle (á, é, ñ, ü) değiştirin, dize kesilmelerini kontrol etmek için [XXX] öneki ekleyin. Xcode: çalıştırma şemaları — "Double-Length Pseudolanguage" sözde dil. Android: Geliştirici Seçenekleri — RTL düzen yönünü zorla, sistem yazı tipi ölçeği %200'e kadar. Sözde yerelleştirme, çevirmen katılımı olmadan i18n sorunlarının %80'ini bulur.

IT Sectr i18n kontrol listesi — sürümden önce şunları kontrol ederiz: (1) kodda sabit kodlanmış dize yok (istisna: günlükler), (2) çoğullar tüm dillerde doğru çalışıyor, (3) tarihler/sayılar Locale API aracılığıyla biçimlendiriliyor, (4) düzen RTL dillerinde doğru görüntüleniyor, (5) maksimum ölçeklemede dizeler kesilmiyor, (6) sözde yerelleştirme hata vermedi, (7) mağazalarda beyan edilen tüm dillerin eksiksiz çeviri seti var.

Sıkça Sorulan Sorular

i18n, l10n'dan nasıl farklıdır?

i18n (uluslararasılaştırma) — kod hazırlığı: dize dışsallaştırması, RTL desteği, biçimlendirme. Geliştirici tarafından bir kez yapılır. l10n (yerelleştirme) — dizelerin belirli bir dile çevrilmesi. Çevirmen tarafından her yerel ayar için birçok kez yapılır. i18n mimaridir, l10n içeriktir. i18n olmadan yerelleştirme prensipte imkansızdır.

Swift'te NSLocalizedString nasıl çalışır?

NSLocalizedString — geçerli cihaz yerel ayarı için Localizable.strings'te anahtarla değer arayan bir makrodur. Çeviri bulunursa döndürür, bulunmazsa anahtarı döndürür. Biçim: NSLocalizedString("key", comment: "açıklama"). Parametrelerle biçimlendirme için String.localizedStringWithFormat() kullanın.

Android'de strings.xml nasıl yapılandırılmıştır?

strings.xml — res/values/{lang}/ dizininde çevirileri olan dosyadır. Temel sürüm values/strings.xml'de, çeviriler values-ru/strings.xml'dedir. Kod, getString(R.string.key) aracılığıyla erişir. Android, sistem diline göre otomatik olarak uygun dosyayı seçer. Çoğullar için, zero/one/few/many/other niteleyicileriyle <plurals> kaynağı kullanılır.

i18n bağlamında RTL nedir?

RTL (Right-to-Left) — Arapça, İbranice, Urduca, Farsça için yazma yönüdür. Android: manifestte supportsRtl="true", android:layoutDirection, Gravity.START/END. iOS: zorunlu RTL için UISemanticContentAttribute.forceLeftToRight. Düzen yansıtılmalıdır: menü sağda, metin — sağdan sola, gezinme simgeleri — ters.

Yayınlama için hangi diller zorunludur?

Küresel yayın için minimum set: İngilizce, İspanyolca, Fransızca, Almanca, Japonca, Çince, Korece, Portekizce, Rusça, İtalyanca. App Store en az İngilizce yerelleştirme gerektirir. Her ek yerel ayar, potansiyel kitleyi genişletir. Yerel bir pazar için 1-2 dil yeterlidir.

Özet

  • Globalization (i18n) — birden çok dil ve bölge için uygulamanın mimari hazırlığı
  • NSLocalizedString — Localizable.strings + XLIFF dışa aktarma yoluyla dize çevirisi için Swift makrosu
  • strings.xml — values-{lang} dizinlerinde çevirileri olan Android kaynağı
  • RTL — Arapça, İbranice, Urduca ve Farsça için zorunlu destek
  • Biçimler — tarihler ve sayılar Locale API aracılığıyla sıkı bir şekilde biçimlendirilir, manuel değil
  • Çoğullar — iOS: stringsdict, Android: altı miktar biçimiyle <plurals>
  • Sözde yerelleştirme — çeviriden önce i18n test tekniği (sorunların %80'ini tespit eder)

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun