Globalization (عالمگیریت، بین الاقوامیت بھی کہتے ہیں، i18n) — ماخذ کوڈ کو تبدیل کیے بغیر متعدد زبانوں اور علاقائی فارمیٹس کے ساتھ کام کرنے کے لیے موبائل ایپلیکیشن تیار کرنے کا عمل ہے۔ اس میں کوڈ سے سٹرنگ وسائل نکالنا، تاریخوں، نمبروں اور کرنسیوں کے مختلف فارمیٹس کی حمایت، متن کی سمت (LTR/RTL) کا خیال رکھنا اور مختلف زبانوں کے لیے لے آؤٹ کو ڈھالنا شامل ہے۔ iOS میں NSLocalizedString اور Localizable.strings استعمال ہوتا ہے، Android میں — values-{lang} ڈائریکٹریز میں strings.xml۔ مزید تفصیل کے لیے — Apple کی بین الاقوامیت دستاویزات دیکھیں۔
اہم نکات
Globalization (مخفف i18n — "i" اور "n" کے درمیان 18 حروف) — کسی بھی زبان اور خطے کے ساتھ کام کرنے کے لیے ایپلیکیشن کی تعمیراتی تیاری ہے۔ i18n کا کلیدی اصول: ماخذ کوڈ میں کوئی بھی متن کی سٹرنگ ہارڈ کوڈڈ (hardcoded) نہیں ہونی چاہیے۔ اس کے بجائے، سٹرنگز کو وسائل کی فائلوں میں نکالا جاتا ہے، اور کوڈ ان تک کنجیوں (keys) کے ذریعے رسائی حاصل کرتا ہے۔ نئی زبان شامل کرتے وقت، صرف ترجمہ فائل شامل کرنا کافی ہے — کوڈ تبدیل نہیں ہوتا۔ یہ i18n کو مقامی کاری (l10n) سے ممتاز کرتا ہے، جہاں خود سٹرنگز کا ترجمہ کیا جاتا ہے۔
کاروباری دلیل — عالمگیریت بازار کو وسعت دیتی ہے۔ Common Sense Advisory (2023) کے مطابق، 70% سے زیادہ صارفین اپنی مادری زبان میں ایپس میں خریداری کو ترجیح دیتے ہیں۔ 10 زبانوں میں مقامی کاری ممکنہ سامعین کو 80% تک بڑھاتی ہے۔ i18n کے بغیر، ہر نئی زبان میں توسیع کے لیے کوڈ میں تبدیلیوں کی ضرورت ہوتی ہے، جو بازار میں داخلے کو سست کرتی ہے اور اخراجات کو 5–10 گنا بڑھاتی ہے۔ صحیح i18n آرکیٹیکچر کم سے کم اخراجات کے ساتھ 40+ زبانوں کی حمایت کرنے کی اجازت دیتا ہے۔
i18n کے اجزاء میں شامل ہیں: سٹرنگ خارجی کاری (String externalization)، جمع (pluralization برائے 1/2/5+)، تاریخوں اور نمبروں کی فارمیٹنگ (DateFormatter/SimpleDateFormat)، RTL زبانوں کی حمایت (Right-to-Left)، لوکیل کے قواعد کے مطابق ترتیب (Collator)، علاقائی علامات (ہزاروں کا جداکنندہ، اعشاریہ نشانات)۔ IT Sectr میں، ہم i18n کو تعمیراتی مرحلے میں شامل کرتے ہیں، بعد میں نہیں — اس سے بعد کی مقامی کاری میں 60% تک وقت بچتا ہے۔
NSLocalizedString — تراجم کے ساتھ کام کرنے کا بنیادی Swift میکرو ہے۔ فارمیٹ: NSLocalizedString("key", comment: "مترجم کے لیے وضاحت")۔ میکرو خود بخود ڈیوائس کے موجودہ لوکیل (NSLocale.preferredLanguages) کے لیے Localizable.strings سے سٹرنگ بدل دیتا ہے۔ اگر کنجی کے لیے ترجمہ نہ ملے تو خود کنجی یا ترقیاتی زبان (عام طور پر en) میں قیمت واپس کی جاتی ہے۔ Apple کنجیوں کے طور پر انگریزی سٹرنگز استعمال کرنے کے بجائے معنی خیز کنجیاں استعمال کرنے کی سفارش کرتا ہے۔
// Localizable.strings (en)
// "welcome_title" = "Welcome!";
// Localizable.strings (ru)
// "welcome_title" = "خوش آمدید!";
// Swift کوڈ — تمام زبانوں کے لیے یکساں
titleLabel.text = NSLocalizedString(
"welcome_title",
comment: "خوش آمدید اسکرین کا عنوان"
)
// Localizable.stringsdict کے ذریعے جمع
//
// <dict>
// <key>items_count</key>
// <dict>
// <key>NSStringLocalizedFormatKey</key>
// <string>%#@items@</string>
// <key>items</key>
// <dict>
// <key>one</key>
// <string>%d پروڈکٹ</string>
// <key>few</key>
// <string>%d پروڈکٹس</string>
// <key>many</key>
// <string>%d پروڈکٹس</string>
// </dict>
// </dict>
// </dict>
// جمع کا استعمال
let items = 5
let label = String.localizedStringWithFormat(
NSLocalizedString("items_count", comment: ""), items
)
XLIFF — ڈیولپرز اور مترجمین کے درمیان تراجم کے تبادلے کا فارمیٹ ہے۔ Xcode ایک XLIFF فائل برآمد کرتا ہے (Editor → Export for Localization) جس میں ترجمہ کے لیے تمام سٹرنگز ہوتی ہیں۔ مترجم CAT ٹولز (Trados، memoQ، Smartcat) میں XLIFF کے ساتھ کام کرتا ہے۔ ترجمے کے بعد، XLIFF واپس Xcode میں درآمد کیا جاتا ہے (Editor → Import Localizations)۔ XLIFF خود بخود تمام .lproj ڈائریکٹریز کو اپ ڈیٹ کرتا ہے۔ پروڈکشن میں iOS ایپس کی مقامی کاری کا یہ معیاری ورک فلو ہے۔
SwiftUI Text انیشیالائزر کے ذریعے NSLocalizedString کے ساتھ کام کرتا ہے۔ SwiftUI میں متن خود بخود بین الاقوامی ہوتا ہے: Text("welcome_title") NSLocalizedString کی طرح Localizable.strings میں ترجمہ تلاش کرتا ہے۔ جمع کے لیے، Text("%d items", count: items) استعمال کریں۔ SwiftUI Text(date, style: .date) کے ذریعے تاریخ فارمیٹنگ کی حمایت کرتا ہے — یہ خود بخود Locale.current استعمال کرتا ہے۔ Apple نئے پروجیکٹس کے لیے SwiftUI تجویز کرتا ہے کیونکہ اس میں بین الاقوامیت زیادہ شفاف ہے۔
Android i18n وسائل کے نظام پر مبنی ہے۔ ڈیفالٹ زبان (عام طور پر انگریزی) کے لیے سٹرنگز res/values/strings.xml میں رکھی جاتی ہیں۔ ہر زبان کے لیے علیحدہ ڈائریکٹری بنائی جاتی ہے: res/values-ru/strings.xml (روسی)، res/values-de/strings.xml (جرمن)، res/values-fr/strings.xml (فرانسیسی)۔ Android ڈیوائس کی سسٹم زبان (Locale.getDefault()) کی بنیاد پر خود بخود سٹرنگز منتخب کرتا ہے۔ اگر صحیح لوکیل نہ ملے تو بنیاد (values/strings.xml) استعمال ہوتی ہے۔
// res/values/strings.xml (انگریزی، ڈیفالٹ)
<resources>
<string name="welcome_title">Welcome!</string>
<string name="items_count">%d item(s)</string>
</resources>
// res/values-ru/strings.xml (روسی)
<resources>
<string name="welcome_title">خوش آمدید!</string>
<plurals name="items_count">
<item quantity="one">%d شے</item>
<item quantity="few">%d اشیاء</item>
<item quantity="many">%d اشیاء</item>
</plurals>
</resources>
// Kotlin کوڈ
textView.text = getString(R.string.welcome_title)
// جمع
val items = 5
textView.text = resources.getQuantityString(
R.plurals.items_count, items, items
)
// کوڈ میں RTL حمایت
textView.textDirection = View.TEXT_DIRECTION_LOCALE
// Manifest: supportsRtl="true"
RTL (Right-to-Left) — ان زبانوں کی حمایت جہاں متن دائیں سے بائیں پڑھا جاتا ہے (عربی، عبرانی، اردو، فارسی)۔ Android android:layoutDirection اور android:textDirection خصوصیات کے ذریعے RTL کی حمایت کرتا ہے۔ مینی فیسٹ میں android:supportsRtl="true" بتائیں — اور Android خود بخود لے آؤٹ کو آئینہ دار کر دے گا۔ NavDrawer، واپس/آگے کے آئیکنز، متن کی سیدھ دونوں سمتوں میں کام کرنا چاہیے۔ کوڈ میں LEFT/RIGHT کی جگہ View.LAYOUT_DIRECTION_LOCALE اور Gravity.START/END استعمال کریں۔
Android Resource Qualifiers نہ صرف سٹرنگز بلکہ تصاویر (res/drawable-ru/)، لے آؤٹس (res/layout-ru/)، اینیمیشنز، رنگوں کو بھی مقامی کرنے کی اجازت دیتے ہیں۔ عربی اور عبرانی کے لیے، آئینہ دار عناصر کے ساتھ علیحدہ لے آؤٹ کی ضرورت ہے — res/layout-ar/ (عربی) استعمال کریں۔ Android علاقائی متغیرات کو بھی سپورٹ کرتا ہے: values-rUS، values-rGB، values-de-DE۔ کوالیفائرز کو ملایا جا سکتا ہے: values-ldrtl-ru — RTL ڈسپلے کے لیے روسی۔
تاریخیں اور وقت — i18n کے اہم پہلوؤں میں سے ایک ہے۔ مختلف علاقے مختلف فارمیٹس استعمال کرتے ہیں: روس — DD.MM.YYYY، امریکہ — MM/DD/YYYY، جاپان — YYYY.MM.DD۔ صارف کو دکھانے کے لیے مقررہ فارمیٹ (yyyy-MM-dd) استعمال کرنا غلطی ہے۔ iOS میں، Locale(identifier: locale) کے ساتھ DateFormatter استعمال کریں، Android میں — DateFormat.getDateInstance(DateFormat.SHORT, locale)۔ صوتی معاونین اور AI تلاش کے لیے، تاریخیں داخلی طور پر ISO 8601 میں ہونی چاہئیں۔
نمبر اور کرنسی — مختلف علاقوں میں مختلف جداکنندے ہوتے ہیں: 1,234.56 (امریکہ) بمقابلہ 1.234,56 (روس)، 1 234,56 (فرانس)۔ iOS: .locale = locale کے ساتھ NumberFormatter۔ Android: DecimalFormatSymbols(locale) کے ساتھ DecimalFormat۔ کرنسیوں کے لیے: فارمیٹ ¥1,234 (جاپان) بمقابلہ $1,234.56 (امریکہ) بمقابلہ 1 234,56 ₽ (روس)۔ کرنسی اور نمبر کو کبھی ہاتھ سے نہ ملائیں — NumberFormatter.currencyCode اور .currencySymbol استعمال کریں۔
| علاقہ | تاریخ | نمبر | کرنسی |
|---|---|---|---|
| روس | 31.12.2024 | 1 234,56 | 1 234,56 ₽ |
| امریکہ | 12/31/2024 | 1,234.56 | $1,234.56 |
| جرمنی | 31.12.2024 | 1.234,56 | 1.234,56 € |
| جاپان | 2024/12/31 | 1,234 | ¥1,234 |
| سعودی عرب | 31/12/2024 | 1,234.56 | 1,234.56 SAR |
ترتیب (Collation) — حروف تہجی کی ترتیب زبانوں میں مختلف ہوتی ہے۔ ہسپانوی میں، "ch" "c" کے بعد آتا ہے۔ سویڈش میں، "ä" حروف تہجی کے آخر میں ہے۔ جرمن میں، "ß" کو "ss" کی طرح ترتیب دیا جاتا ہے۔ iOS: LocalizedComparison (String.localizedCompare)۔ Android: Collator.getInstance(locale)۔ صارف کو دکھائی جانے والی سٹرنگز کے لیے کبھی compareTo() استعمال نہ کریں — یہ Unicode Code Point ترتیب استعمال کرتا ہے، جو علاقائی قواعد کا خیال نہیں رکھتا۔
تعمیراتی اصول — پہلے commit سے i18n شروع کریں۔ کوڈ میں ہر سٹرنگ کو ایک ریپر فنکشن (tr("key")) سے گزرنا چاہیے جو i18n سیٹ ہونے تک موجود نہیں ہوتا — یہ ڈیولپر کو فوری طور پر سٹرنگ خارجی کرنے پر مجبور کرتا ہے۔ انگریزی سٹرنگز کو کنجیوں کے طور پر استعمال نہ کریں — جب انگریزی عبارت بدلتی ہے تو تمام تراجم کو اپ ڈیٹ کرنا ہوتا ہے۔ معنی خیز کنجیاں استعمال کریں: "profile.title"، "settings.language.label"۔
جعلی مقامی کاری (Pseudolocalization) — اصل ترجمے سے پہلے i18n جانچ کی تکنیک ہے۔ انکوڈنگ جانچنے کے لیے ہر لاطینی حرف کو اعراب والے حروف (á، é، ñ، ü) سے بدلیں، سٹرنگ کٹاؤ جانچنے کے لیے [XXX] سابقہ شامل کریں۔ Xcode: رن اسکیمیں — "Double-Length Pseudolanguage" جعلی زبان۔ Android: ڈیولپر آپشنز — RTL لے آؤٹ سمت مجبور کریں، سسٹم فونٹ اسکیل 200% تک۔ جعلی مقامی کاری مترجم کی شمولیت کے بغیر 80% i18n مسائل تلاش کرتی ہے۔
IT Sectr i18n چیک لسٹ — ریلیز سے پہلے ہم چیک کرتے ہیں: (1) کوڈ میں کوئی ہارڈ کوڈڈ سٹرنگ نہیں (استثنا: لاگز)، (2) جمع تمام زبانوں میں صحیح کام کرتا ہے، (3) تاریخیں/نمبر Locale API کے ذریعے فارمیٹ ہوتے ہیں، (4) لے آؤٹ RTL زبانوں پر صحیح دکھائی دیتا ہے، (5) زیادہ سے زیادہ اسکیلنگ پر سٹرنگ نہیں کٹتی، (6) جعلی مقامی کاری میں کوئی خرابی نہیں، (7) اسٹورز میں اعلان کردہ تمام زبانوں کے پاس تراجم کا مکمل سیٹ ہے۔
اکثر پوچھے جانے والے سوالات
i18n (بین الاقوامیت) — کوڈ کی تیاری: سٹرنگ خارجی کاری، RTL حمایت، فارمیٹنگ۔ ڈیولپر ایک بار کرتا ہے۔ l10n (مقامی کاری) — سٹرنگز کا مخصوص زبان میں ترجمہ۔ مترجم ہر لوکیل کے لیے کئی بار کرتا ہے۔ i18n آرکیٹیکچر ہے، l10n مواد ہے۔ i18n کے بغیر، مقامی کاری اصولی طور پر ناممکن ہے۔
NSLocalizedString — ایک میکرو جو ڈیوائس کے موجودہ لوکیل کے لیے Localizable.strings میں کنجی سے قدر تلاش کرتا ہے۔ اگر ترجمہ مل جائے تو واپس کرتا ہے، ورنہ کنجی واپس کرتا ہے۔ فارمیٹ: NSLocalizedString("key", comment: "وضاحت")۔ پیرامیٹرز کے ساتھ فارمیٹنگ کے لیے، String.localizedStringWithFormat() استعمال کریں۔
strings.xml — res/values/{lang}/ ڈائریکٹری میں تراجم والی فائل۔ بنیادی ورژن values/strings.xml میں، تراجم values-ru/strings.xml میں۔ کوڈ getString(R.string.key) کے ذریعے رسائی کرتا ہے۔ Android سسٹم زبان کی بنیاد پر خود بخود مناسب فائل منتخب کرتا ہے۔ جمع کے لیے، <plurals> وسائل zero/one/few/many/other کوالیفائرز کے ساتھ استعمال ہوتا ہے۔
RTL (Right-to-Left) — عربی، عبرانی، اردو، فارسی کے لیے تحریر کی سمت۔ Android: مینی فیسٹ میں supportsRtl="true"، android:layoutDirection، Gravity.START/END۔ iOS: UISemanticContentAttribute.forceLeftToRight جبری RTL کے لیے۔ لے آؤٹ آئینہ دار ہونا چاہیے: مینو دائیں طرف، متن — دائیں سے بائیں، نیویگیشن آئیکن — الٹے۔
عالمی اشاعت کے لیے کم از کم سیٹ: انگریزی، ہسپانوی، فرانسیسی، جرمن، جاپانی، چینی، کورین، پرتگالی، روسی، اطالوی۔ App Store کو کم از کم انگریزی مقامی کاری درکار ہے۔ ہر اضافی لوکیل ممکنہ سامعین کو بڑھاتا ہے۔ مقامی بازار کے لیے، 1–2 زبانیں کافی ہیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں