Globalization: কী, i18n এবং অ্যাপে বহুভাষিক সমর্থন

লেখক: IT Sectr প্রকাশিত: 2026-02-26 পড়ার সময়: 8 মিনিট

Globalization (বিশ্বায়ন, এছাড়াও আন্তর্জাতিকীকরণ, i18n) — সোর্স কোড পরিবর্তন না করে একাধিক ভাষা এবং আঞ্চলিক ফরম্যাটে কাজ করার জন্য মোবাইল অ্যাপ প্রস্তুত করার প্রক্রিয়া। এর মধ্যে রয়েছে কোড থেকে স্ট্রিং রিসোর্স বের করা, বিভিন্ন তারিখ, সংখ্যা এবং মুদ্রা ফরম্যাট সমর্থন করা, টেক্সট দিক (LTR/RTL) বিবেচনা করা এবং বিভিন্ন ভাষার জন্য লেআউট অভিযোজিত করা। iOS-এ NSLocalizedString এবং Localizable.strings ব্যবহৃত হয়, Android-এ — values-{lang} ডিরেক্টরিতে strings.xml। আরও জানতে — Apple-এর আন্তর্জাতিকীকরণ ডকুমেন্টেশন দেখুন।

মূল বিষয়

  • Globalization (i18n) — একাধিক ভাষা এবং অঞ্চলের জন্য অ্যাপ কোড প্রস্তুত করা
  • NSLocalizedString — Localizable.strings থেকে অনূদিত স্ট্রিং বের করার Swift ম্যাক্রো
  • strings.xml — Android XML ফাইল যেখানে প্রতিটি ভাষার জন্য রিসোর্স স্ট্রিং সংরক্ষিত থাকে
  • RTL — ডান-থেকে-বামে লেখা ভাষার (আরবি, হিব্রু, উর্দু) সমর্থন
  • ফরম্যাট — তারিখ, সংখ্যা এবং মুদ্রা Locale-নির্ভর API-র মাধ্যমে ফরম্যাট করতে হবে

Globalization (i18n) কী এবং কেন প্রয়োজন?

Globalization (সংক্ষেপে i18n — "i" এবং "n"-এর মধ্যে 18টি অক্ষর) — যেকোনো ভাষা এবং অঞ্চলে কাজ করার জন্য অ্যাপের আর্কিটেকচারাল প্রস্তুতি। i18n-এর মূল নিয়ম: সোর্স কোডে কোনো টেক্সট স্ট্রিং হার্ডকোডেড (hardcoded) থাকবে না। পরিবর্তে, স্ট্রিংগুলি রিসোর্স ফাইলে নেওয়া হয়, এবং কোড কী-এর মাধ্যমে সেগুলি অ্যাক্সেস করে। নতুন ভাষা যোগ করার সময়, শুধু একটি অনুবাদ ফাইল যোগ করাই যথেষ্ট — কোড অপরিবর্তিত থাকে। এটিই i18n-কে স্থানীয়করণ (l10n) থেকে আলাদা করে, যেখানে স্ট্রিংগুলি নিজেরাই অনুবাদ করা হয়।

ব্যবসায়িক যুক্তি — বিশ্বায়ন বাজার সম্প্রসারিত করে। Common Sense Advisory (2023) অনুসারে, 70% এর বেশি ব্যবহারকারী নিজ মাতৃভাষায় অ্যাপে কেনাকাটা পছন্দ করেন। 10টি ভাষায় স্থানীয়করণ সম্ভাব্য দর্শক 80% পর্যন্ত বাড়ায়। i18n ছাড়া, প্রতিটি নতুন ভাষায় সম্প্রসারণের জন্য কোড পরিবর্তনের প্রয়োজন হয়, যা বাজারে প্রবেশকে ধীর করে এবং খরচ 5–10 গুণ বাড়ায়। সঠিক i18n আর্কিটেকচার ন্যূনতম খরচে 40+ ভাষা সমর্থন করতে দেয়।

i18n উপাদান অন্তর্ভুক্ত: স্ট্রিং এক্সটার্নালাইজেশন, বহুবচন (1/2/5+ এর জন্য), তারিখ এবং সংখ্যা ফরম্যাটিং (DateFormatter/SimpleDateFormat), RTL ভাষা সমর্থন (Right-to-Left), লোকেল-নির্দিষ্ট সাজানো (Collator), আঞ্চলিক প্রতীক (হাজার বিভাজক, দশমিক চিহ্ন)। IT Sectr-এ, আমরা i18n আর্কিটেকচার পর্যায়ে অন্তর্ভুক্ত করি, পরে নয় — এটি পরবর্তী স্থানীয়করণে 60% পর্যন্ত সময় বাঁচায়।

iOS-এ আন্তর্জাতিকীকরণ: NSLocalizedString এবং XLIFF

NSLocalizedString — অনুবাদের সাথে কাজ করার প্রধান Swift ম্যাক্রো। ফরম্যাট: NSLocalizedString("key", comment: "অনুবাদকের জন্য বিবরণ")। ম্যাক্রো স্বয়ংক্রিয়ভাবে ডিভাইসের বর্তমান লোকেলের (NSLocale.preferredLanguages) জন্য Localizable.strings থেকে স্ট্রিং প্রতিস্থাপন করে। যদি কী-র জন্য অনুবাদ না পাওয়া যায়, তাহলে কী নিজেই বা ডেভেলপমেন্ট ভাষার মান (সাধারণত en) ফেরত দেওয়া হয়। Apple কী হিসেবে ইংরেজি স্ট্রিংয়ের পরিবর্তে অর্থপূর্ণ কী ব্যবহার করার সুপারিশ করে।

swift
// 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 এবং i18n

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-এ আন্তর্জাতিকীকরণ: strings.xml এবং RTL

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) ব্যবহার করা হয়।

kotlin
// 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 ডিসপ্লের জন্য রুশ।

আঞ্চলিক ফরম্যাট: iOS এবং Android-এ তারিখ, সংখ্যা, মুদ্রা

তারিখ এবং সময় — i18n-এর মূল দিকগুলির মধ্যে একটি। বিভিন্ন অঞ্চল বিভিন্ন ফরম্যাট ব্যবহার করে: রাশিয়া — DD.MM.YYYY, USA — 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 (USA) বনাম 1.234,56 (রাশিয়া), 1 234,56 (ফ্রান্স)। iOS: .locale = locale সহ NumberFormatter। Android: DecimalFormatSymbols(locale) সহ DecimalFormat। মুদ্রার জন্য: ফরম্যাট ¥1,234 (জাপান) বনাম $1,234.56 (USA) বনাম 1 234,56 ₽ (রাশিয়া)। মুদ্রা এবং সংখ্যা কখনও ম্যানুয়ালি একত্রিত করবেন না — NumberFormatter.currencyCode এবং .currencySymbol ব্যবহার করুন।

অঞ্চলতারিখসংখ্যামুদ্রা
রাশিয়া31.12.20241 234,561 234,56 ₽
USA12/31/20241,234.56$1,234.56
জার্মানি31.12.20241.234,561.234,56 €
জাপান2024/12/311,234¥1,234
সৌদি আরব31/12/20241,234.561,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 এবং l10n-এর মধ্যে পার্থক্য কী?

i18n (আন্তর্জাতিকীকরণ) — কোড প্রস্তুতি: স্ট্রিং এক্সটার্নালাইজেশন, RTL সমর্থন, ফরম্যাটিং। ডেভেলপার একবার করে। l10n (স্থানীয়করণ) — নির্দিষ্ট ভাষায় স্ট্রিং অনুবাদ। অনুবাদক প্রতিটি লোকেলের জন্য বহুবার করে। i18n আর্কিটেকচার, l10n কন্টেন্ট। i18n ছাড়া স্থানীয়করণ নীতিগতভাবে অসম্ভব।

Swift-এ NSLocalizedString কীভাবে কাজ করে?

NSLocalizedString — একটি ম্যাক্রো যা ডিভাইসের বর্তমান লোকেলের জন্য Localizable.strings-এ কী দ্বারা মান খোঁজে। যদি অনুবাদ পাওয়া যায়, তবে তা ফেরত দেয়। না পেলে, কী ফেরত দেয়। ফরম্যাট: NSLocalizedString("key", comment: "বিবরণ")। প্যারামিটার সহ ফরম্যাটিংয়ের জন্য, String.localizedStringWithFormat() ব্যবহার করুন।

Android-এ strings.xml কীভাবে গঠিত?

strings.xml — res/values/{lang}/ ডিরেক্টরিতে অনুবাদ সহ ফাইল। বেস ভার্সন values/strings.xml-এ, অনুবাদ values-ru/strings.xml-এ। কোড getString(R.string.key) এর মাধ্যমে অ্যাক্সেস করে। Android সিস্টেম ভাষার উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে উপযুক্ত ফাইল নির্বাচন করে। বহুবচনের জন্য, <plurals> রিসোর্স zero/one/few/many/other কোয়ালিফায়ার সহ ব্যবহৃত হয়।

i18n প্রসঙ্গে RTL কী?

RTL (Right-to-Left) — আরবি, হিব্রু, উর্দু, ফার্সির জন্য লেখার দিক। Android: ম্যানিফেস্টে supportsRtl="true", android:layoutDirection, Gravity.START/END। iOS: UISemanticContentAttribute.forceLeftToRight জোরপূর্বক RTL-এর জন্য। লেআউট মিরর করা উচিত: মেনু ডানদিকে, টেক্সট — ডান থেকে বামে, নেভিগেশন আইকন — উল্টো।

প্রকাশনার জন্য কোন ভাষাগুলি বাধ্যতামূলক?

বৈশ্বিক প্রকাশনার জন্য ন্যূনতম সেট: ইংরেজি, স্প্যানিশ, ফরাসি, জার্মান, জাপানি, চীনা, কোরিয়ান, পর্তুগিজ, রুশ, ইতালীয়। App Store-এ ন্যূনতম ইংরেজি স্থানীয়করণ প্রয়োজন। প্রতিটি অতিরিক্ত লোকেল সম্ভাব্য দর্শক বাড়ায়। স্থানীয় বাজারের জন্য, 1–2 ভাষা যথেষ্ট।

সারাংশ

  • Globalization (i18n) — একাধিক ভাষা এবং অঞ্চলের জন্য অ্যাপের আর্কিটেকচারাল প্রস্তুতি
  • NSLocalizedString — Localizable.strings + XLIFF এক্সপোর্টের মাধ্যমে স্ট্রিং অনুবাদের Swift ম্যাক্রো
  • strings.xml — values-{lang} ডিরেক্টরিতে অনুবাদ সহ Android রিসোর্স
  • RTL — আরবি, হিব্রু, উর্দু এবং ফার্সির জন্য বাধ্যতামূলক সমর্থন
  • ফরম্যাট — তারিখ এবং সংখ্যা Locale API-র মাধ্যমে কঠোরভাবে ফরম্যাট করা হয়, ম্যানুয়াল নয়
  • বহুবচন — iOS: stringsdict, Android: <plurals> ছয়টি পরিমাণ ফর্ম সহ
  • সিউডোলোকালাইজেশন — অনুবাদের আগে i18n পরীক্ষার কৌশল (80% সমস্যা সনাক্ত করে)

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন