প্রতি-অ্যাপ ভাষা পছন্দ, প্রতি-অ্যাপ ভাষা পছন্দ, প্রতি-অ্যাপ ভাষা পছন্দ

সিস্টেম সেটিংসে অ্যাপ-ভিত্তিক ভাষা

অনেক ক্ষেত্রে, বহুভাষী ব্যবহারকারীরা তাদের সিস্টেমের ভাষা একটি নির্দিষ্ট ভাষায়—যেমন ইংরেজিতে—সেট করেন, কিন্তু তারা নির্দিষ্ট অ্যাপের জন্য অন্যান্য ভাষা, যেমন ডাচ, চীনা বা হিন্দি, নির্বাচন করতে চান। এই ব্যবহারকারীদের আরও ভালো অভিজ্ঞতা দিতে অ্যাপগুলোকে সাহায্য করার জন্য, অ্যান্ড্রয়েড ১৩ একাধিক ভাষা সমর্থনকারী অ্যাপগুলোর জন্য নিম্নলিখিত বৈশিষ্ট্যগুলো চালু করেছে:

  • সিস্টেম সেটিংস : একটি কেন্দ্রীয় স্থান যেখানে ব্যবহারকারীরা প্রতিটি অ্যাপের জন্য পছন্দের ভাষা নির্বাচন করতে পারেন।

    আপনি আপনার অ্যাপটিকে এমনভাবে কনফিগার করতে পারেন যাতে এটি প্রতি-অ্যাপ ভাষার পছন্দ সমর্থন করার জন্য প্রয়োজনীয় ফাইলগুলি স্বয়ংক্রিয়ভাবে তৈরি করে এবং সিস্টেম সেটিংসে তা প্রদর্শন করে। আরও জানতে, স্বয়ংক্রিয় প্রতি-অ্যাপ ভাষা সমর্থন সক্রিয় করার নির্দেশাবলী দেখুন।

  • অতিরিক্ত এপিআই : এই পাবলিক এপিআইগুলো, যেমন LocaleManager এর setApplicationLocales এবং getApplicationLocales মেথডগুলো, অ্যাপগুলোকে রানটাইমে সিস্টেমের ভাষা থেকে ভিন্ন একটি ভাষা সেট করার সুযোগ দেয়।

    এই API-গুলো সিস্টেম সেটিংসের সাথে স্বয়ংক্রিয়ভাবে সিঙ্ক হয়; তাই, যে অ্যাপগুলো কাস্টম ইন-অ্যাপ ল্যাঙ্গুয়েজ পিকার তৈরি করতে এই API-গুলো ব্যবহার করে, তারা নিশ্চিত করতে পারে যে ব্যবহারকারীরা তাদের ভাষার পছন্দ যেখানেই নির্বাচন করুক না কেন, একটি সামঞ্জস্যপূর্ণ ইউজার এক্সপেরিয়েন্স পাবেন। পাবলিক API-গুলো আপনাকে বয়লারপ্লেট কোডের পরিমাণ কমাতেও সাহায্য করে, এগুলো স্প্লিট APK সমর্থন করে এবং অ্যাপ-স্তরের ব্যবহারকারীর ভাষার সেটিংস সংরক্ষণের জন্য ‘অটো ব্যাকআপ ফর অ্যাপস’ সমর্থন করে।

    পূর্ববর্তী অ্যান্ড্রয়েড সংস্করণগুলির সাথে ব্যাকওয়ার্ড কম্প্যাটিবিলিটির জন্য, AndroidX-এ সমতুল্য API-গুলিও উপলব্ধ রয়েছে। তবে, Android 12 (API লেভেল 32) এবং তার আগের সংস্করণগুলির জন্য, ব্যাকওয়ার্ড কম্প্যাটিবল API-গুলি অ্যাপ্লিকেশন কনটেক্সটের পরিবর্তে AppCompatActivity কনটেক্সটের সাথে কাজ করে। Appcompat 1.6.0 বা তার উচ্চতর সংস্করণ ব্যবহার করে ব্যাকওয়ার্ড কম্প্যাটিবল API-গুলি অ্যাক্সেস করুন।

এই বৈশিষ্ট্যটি বাস্তবায়নের সংক্ষিপ্ত বিবরণ

নিম্নলিখিত সারণিতে বিভিন্ন ব্যবহারের ক্ষেত্রের উপর ভিত্তি করে প্রস্তাবিত বাস্তবায়নগুলো দেখানো হয়েছে।

ব্যবহারের ক্ষেত্র প্রস্তাবিত বাস্তবায়ন
আপনার অ্যাপে কোনো ইন-অ্যাপ ভাষা বাছাই করার অপশন নেই।
  1. একটি LocaleConfig ফাইল তৈরি করতে এবং আপনার অ্যাপের ভাষাগুলো সিস্টেম সেটিংসে যোগ করতে, অ্যাপ-ভিত্তিক স্বয়ংক্রিয় ভাষা সমর্থন সক্রিয় করুন।
  2. ঐচ্ছিকভাবে, আপনি যদি অ্যাপের মধ্যে ভাষা বাছাই করার ব্যবস্থা যোগ করতে চান: তাহলে Compose-এ তা প্রয়োগ করুন অথবা AndroidX লাইব্রেরি ব্যবহার করুন এবং autoStoreLocales এর মাধ্যমে পূর্ববর্তী সংস্করণের সাথে সামঞ্জস্যতা (backward compatibility) সমর্থন করার জন্য আমাদের API বাস্তবায়নে সম্মতি দিন।
আপনার অ্যাপে ইতিমধ্যেই একটি ইন-অ্যাপ ভাষা বাছাই করার অপশন আছে।
  1. একটি LocaleConfig ফাইল তৈরি করতে এবং আপনার অ্যাপের ভাষাগুলো সিস্টেম সেটিংসে যোগ করতে, অ্যাপ-ভিত্তিক স্বয়ংক্রিয় ভাষা সমর্থন সক্রিয় করুন।
  2. ব্যবহারকারীরা যাতে একটি সামঞ্জস্যপূর্ণ অভিজ্ঞতা পান, তা নিশ্চিত করতে আপনার অ্যাপের কাস্টম লজিককে Compose বা পাবলিক API ব্যবহারে স্থানান্তরিত করুন।
  3. নিম্নলিখিত প্রান্তিক পরিস্থিতিগুলো সামাল দিন:
    1. অ্যান্ড্রয়েড ১৩ চালিত কোনো ডিভাইসে আপনার অ্যাপটি প্রথমবার চালানোর সময় AppCompatDelegate.setApplicationLocales কল করুন।
    2. নিম্নলিখিত ক্ষেত্রগুলির জন্য সিস্টেমে পূর্ব-বিদ্যমান ব্যবহারকারী-অনুরোধিত লোকেল সরবরাহ করতে AppCompatDelegate.setApplicationLocales কল করুন:

ব্যবহারকারীদের জন্য সিস্টেম সেটিংস

অ্যান্ড্রয়েড ১৩ থেকে, প্রতিটি অ্যাপের জন্য আলাদা ভাষার পছন্দ নির্ধারণ করার জন্য সিস্টেম সেটিংসে একটি কেন্দ্রীয় স্থান অন্তর্ভুক্ত করা হয়েছে। অ্যান্ড্রয়েড ১৩ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলিতে আপনার অ্যাপের ভাষাগুলি সিস্টেম সেটিংসে কনফিগার করা যায় তা নিশ্চিত করতে, স্বয়ংক্রিয় প্রতি-অ্যাপ ভাষা সমর্থন (প্রস্তাবিত) চালু করুন অথবা ম্যানুয়ালি সমর্থন কনফিগার করুন

প্রতিটি অ্যাপের জন্য স্বয়ংক্রিয় ভাষা সমর্থন সক্রিয় করুন

আপনার অ্যাপগুলিতে প্রতিটির জন্য আলাদা ভাষা সমর্থন যোগ করার জন্য এটিই প্রস্তাবিত পদ্ধতি, কারণ এর জন্য XML পরিবর্তনের প্রয়োজন হয় না।

অ্যান্ড্রয়েড স্টুডিও জিরাফ এবং এজিপি ৮.১ থেকে শুরু করে, আপনি আপনার অ্যাপকে স্বয়ংক্রিয়ভাবে প্রতিটি অ্যাপের জন্য আলাদা ভাষার পছন্দ সমর্থন করার জন্য কনফিগার করতে পারেন। আপনার প্রোজেক্টের রিসোর্সের উপর ভিত্তি করে, এজিপি LocaleConfig ফাইলটি তৈরি করে এবং চূড়ান্ত ম্যানিফেস্ট ফাইলে এর একটি রেফারেন্স যোগ করে, ফলে আপনাকে আর এটি ম্যানুয়ালি করতে হয় না। LocaleConfig ফাইলে কোন লোকেলগুলো অন্তর্ভুক্ত করতে হবে তা নির্ধারণ করার জন্য এজিপি আপনার অ্যাপ মডিউলের res ফোল্ডারের রিসোর্স এবং যেকোনো লাইব্রেরি মডিউল ডিপেন্ডেন্সি ব্যবহার করে। এর মানে হলো, আপনি যদি আপনার অ্যাপে কোনো নতুন ভাষার জন্য রিসোর্স যোগ করেন, তাহলে আপনাকে LocaleConfig ফাইল আপডেট করার বিষয়ে চিন্তা করতে হবে না।

উল্লেখ্য যে, স্বয়ংক্রিয় প্রতি-অ্যাপ ভাষা বৈশিষ্ট্যটি অ্যান্ড্রয়েড ১৩ (এপিআই লেভেল ৩৩) বা তার উচ্চতর সংস্করণে চালিত অ্যাপগুলোকে সমর্থন করে। এই বৈশিষ্ট্যটি ব্যবহার করার জন্য, আপনাকে compileSdkVersion অবশ্যই ৩৩ বা তার বেশি সেট করতে হবে। অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলোর জন্য প্রতি-অ্যাপ ভাষার পছন্দগুলো কনফিগার করতে, আপনাকে এখনও এপিআই এবং ইন-অ্যাপ ল্যাঙ্গুয়েজ পিকার ব্যবহার করতে হবে।

প্রতিটি অ্যাপের জন্য স্বয়ংক্রিয় ভাষা সমর্থন চালু করতে, এই ধাপগুলো অনুসরণ করুন:

  1. ফিচারটি চালু করতে, মডিউল-স্তরের build.gradle.kts ফাইলের (আপনি Groovy ব্যবহার করলে build.gradle ফাইল) androidResources {} ব্লকে generateLocaleConfig সেটিংটি ব্যবহার করুন। ফিচারটি ডিফল্টরূপে বন্ধ থাকে।

কোটলিন

    android {
      androidResources {
        generateLocaleConfig = true
      }
    }

গ্রুভি

  android {
    androidResources {
      generateLocaleConfig true
    }
  }
  1. একটি ডিফল্ট লোকেল নির্দিষ্ট করুন:
    1. অ্যাপ মডিউলের res ফোল্ডারে resources.properties নামে একটি নতুন ফাইল তৈরি করুন।
    2. resources.properties ফাইলে, unqualifiedResLocale লেবেলটি ব্যবহার করে ডিফল্ট লোকেল সেট করুন। লোকেলের নামগুলো ফরম্যাট করার জন্য, “How to form locale names” দেখুন।

AGP স্বয়ংক্রিয়ভাবে তৈরি হওয়া LocaleConfig ফাইলে এই ডিফল্ট লোকেল এবং res ফোল্ডারের values-* ডিরেক্টরি ব্যবহার করে আপনার নির্দিষ্ট করা যেকোনো বিকল্প লোকেল যোগ করে।

লোকেল নাম কীভাবে তৈরি করবেন

লোকেল নাম তৈরি করতে, ভাষা কোডের সাথে ঐচ্ছিক স্ক্রিপ্ট এবং অঞ্চল কোড একত্রিত করুন, এবং প্রতিটিকে একটি ড্যাশ দিয়ে আলাদা করুন:

  • ভাষা: দুই বা তিন অক্ষরের ISO 639-2 কোডটি ব্যবহার করুন।
  • স্ক্রিপ্ট (ঐচ্ছিক): ISO 15924 কোডটি ব্যবহার করুন।
  • অঞ্চল (ঐচ্ছিক): দুই অক্ষরের ISO 3166-1-alpha-2 কোড অথবা তিন অঙ্কের UN_M.49 কোড ব্যবহার করুন।

উদাহরণস্বরূপ, যদি আপনার ডিফল্ট লোকেল আমেরিকান ইংরেজি হয়:

unqualifiedResLocale=en-US

সিস্টেম সেটিংসে সমর্থিত ভাষা যোগ করতে android:localeConfig ব্যবহার করুন।

অ্যান্ড্রয়েড ১৩ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলিতে সিস্টেম সেটিংসে আপনার অ্যাপের ভাষাগুলি কনফিগার করা যায় তা নিশ্চিত করতে, আপনি ম্যানুয়ালি এটি সেট আপ করতে পারেন। এটি করার জন্য, একটি locale_config XML ফাইল তৈরি করুন এবং android:localeConfig অ্যাট্রিবিউট ব্যবহার করে এটিকে আপনার অ্যাপের ম্যানিফেস্টে যুক্ত করুন। android:localeConfig ম্যানিফেস্ট এন্ট্রিটি বাদ দিলে এটি বোঝায় যে, ব্যবহারকারীরা তাদের সিস্টেম সেটিংসে নিজেদের সিস্টেমের ভাষা থেকে আলাদাভাবে আপনার অ্যাপের ভাষা সেট করতে পারবে না।

ব্যবহারকারীর সিস্টেম সেটিংসে আপনার অ্যাপের সমর্থিত ভাষাগুলো ম্যানুয়ালি যোগ করতে:

  1. res/xml/locale_config.xml নামে একটি ফাইল তৈরি করুন এবং আপনার অ্যাপের ভাষাগুলো নির্দিষ্ট করুন, যার মধ্যে আপনার অ্যাপের চূড়ান্ত ফলব্যাক লোকেলও অন্তর্ভুক্ত থাকবে, যেটি হলো res/values/strings.xml এ নির্দিষ্ট করা লোকেল।

    ফরম্যাটের প্রয়োজনীয়তা জানতে 'কীভাবে লোকেল নাম তৈরি করতে হয়' দেখুন। এছাড়াও, সর্বাধিক ব্যবহৃত লোকেলগুলির তালিকার জন্য নমুনা locale_config.xml ফাইলটি দেখুন।

    উদাহরণস্বরূপ, নিম্নলিখিত ভাষাগুলো সমর্থন করে এমন একটি অ্যাপের জন্য locale_config.xml ফাইলটি এইভাবে ফরম্যাট করুন:

    • চূড়ান্ত বিকল্প স্থান হিসেবে ইংরেজি (মার্কিন যুক্তরাষ্ট্র)
    • ইংরেজি (যুক্তরাজ্য)
    • ফরাসি
    • জাপানি
    • চীনা (সরলীকৃত, ম্যাকাও)
    • চীনা (ঐতিহ্যবাহী, ম্যাকাও)
    <?xml version="1.0" encoding="utf-8"?>
    <locale-config xmlns:android="http://schemas.android.com/apk/res/android">
       <locale android:name="en-US"/>
       <locale android:name="en-GB"/>
       <locale android:name="fr"/>
       <locale android:name="ja"/>
       <locale android:name="zh-Hans-MO"/>
       <locale android:name="zh-Hant-MO"/>
    </locale-config>
    
  2. ম্যানিফেস্টে এই নতুন ফাইলটিকে নির্দেশ করে একটি লাইন যোগ করুন:

    <manifest>
        ...
        <application
            ...
            android:localeConfig="@xml/locale_config">
        </application>
    </manifest>
    

অ্যান্ড্রয়েড সেটিংসে অ্যাপ-ভিত্তিক ভাষার তালিকায় প্রদর্শিত ভাষাগুলো কাস্টমাইজ করতে, আপনি LocaleManager.setOverrideLocaleConfig ব্যবহার করে আপনার অ্যাপের localeConfig ডায়নামিকভাবে আপডেট করতে পারেন। এর মাধ্যমে আপনি অঞ্চল অনুযায়ী ভাষার তালিকা কাস্টমাইজ করতে, A/B পরীক্ষা চালাতে এবং আপনার অ্যাপ যদি সার্ভার-সাইড লোকালাইজেশন পুশ ব্যবহার করে, তবে আপডেট করা লোকেল সরবরাহ করতে পারবেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

//For setOverrideLocaleConfig
val localeManager = applicationContext
    .getSystemService(LocaleManager::class.java)
localeManager.overrideLocaleConfig = LocaleConfig(
LocaleList.forLanguageTags("en-US,ja-JP,zh-Hans-SG")
)

//For getOverrideLocaleConfig
// The app calls the API to get the override LocaleConfig
val overrideLocaleConfig = localeManager.overrideLocaleConfig
// If the returned overrideLocaleConfig isn't equal to NULL, then the app calls the API to get the supported Locales
val supportedLocales = overrideLocaleConfig.supportedLocales()

এছাড়াও, দেখানো অনুযায়ী কিবোর্ডের ভাষা আপডেট করার জন্য IME-গুলি এখন LocaleManager.getApplicationLocales ব্যবহার করে বর্তমান অ্যাপের UI ভাষা জানতে পারে:

val currentAppLocales: LocaleList = applicationContext.getSystemService(LocaleManager::class.java).getApplicationLocales(appPackageName)

Gradle-এ সমর্থিত ভাষাগুলি নির্দিষ্ট করুন

যদি আগে থেকে উল্লেখ করা না থাকে, তাহলে আপনার অ্যাপের মডিউল-স্তরের build.gradle ফাইলে resourceConfigurations প্রপার্টি ব্যবহার করে একই ভাষাগুলো নির্দিষ্ট করুন:

android {
  ...
  defaultConfig {
    resourceConfigurations += ["en", "en-rGB", "fr", "ja", "b+zh+Hans+MO", "b+zh+Hant+MO"]
  }
}

যখন resourceConfigurations প্রপার্টিটি উপস্থিত থাকে, তখন বিল্ড সিস্টেম শুধুমাত্র এই নির্দিষ্ট ভাষাগুলোর জন্য APK-তে ভাষার রিসোর্স অন্তর্ভুক্ত করে, যার ফলে অন্যান্য লাইব্রেরি থেকে অনূদিত স্ট্রিং অন্তর্ভুক্ত হওয়া থেকে বিরত থাকে, যে লাইব্রেরিগুলো এমন ভাষা সমর্থন করতে পারে যা আপনার অ্যাপ সমর্থন করে না। আরও তথ্যের জন্য, আপনার অ্যাপ যে ভাষাগুলো সমর্থন করে তা নির্দিষ্ট করুন দেখুন।

সিস্টেম সেটিংসে ব্যবহারকারীরা কীভাবে অ্যাপের ভাষা নির্বাচন করেন

ব্যবহারকারীরা সিস্টেম সেটিংসের মাধ্যমে প্রতিটি অ্যাপের জন্য তাদের পছন্দের ভাষা নির্বাচন করতে পারেন। তারা দুটি ভিন্ন উপায়ে এই সেটিংসে প্রবেশ করতে পারেন:

  • সিস্টেম সেটিংসের মাধ্যমে অ্যাক্সেস করুন

    সেটিংস > সিস্টেম > ভাষা ও ইনপুট > অ্যাপের ভাষা > (একটি অ্যাপ নির্বাচন করুন)

  • অ্যাপ সেটিংসের মাধ্যমে অ্যাক্সেস করুন

    সেটিংস > অ্যাপস > (একটি অ্যাপ নির্বাচন করুন) > ভাষা

অ্যাপের মধ্যে ভাষা বাছাইকারী পরিচালনা করুন

যেসব অ্যাপে আগে থেকেই ইন-অ্যাপ ল্যাঙ্গুয়েজ পিকার আছে বা যারা এটি ব্যবহার করতে চান, তাদের অ্যাপের জন্য ব্যবহারকারীর পছন্দের ভাষা সেট করা ও পাওয়ার কাজটি কাস্টম অ্যাপ লজিকের পরিবর্তে পাবলিক এপিআই ব্যবহার করুন। আপনি যদি আপনার ইন-অ্যাপ ল্যাঙ্গুয়েজ পিকারের জন্য পাবলিক এপিআই ব্যবহার করেন, তাহলে ব্যবহারকারী আপনার ইন-অ্যাপ অভিজ্ঞতার মাধ্যমে যে ভাষাটি নির্বাচন করবেন, সেই অনুযায়ী ডিভাইসের সিস্টেম সেটিংস স্বয়ংক্রিয়ভাবে আপডেট হয়ে যাবে।

Jetpack Compose ব্যবহার করে বাস্তবায়ন করুন

যেসব অ্যাপ সম্পূর্ণরূপে জেটপ্যাক কম্পোজ দিয়ে তৈরি, সেগুলোর লোকেল পরিবর্তিত হলে সিস্টেম স্বয়ংক্রিয়ভাবে UI আপডেট পরিচালনা করে। নতুন ভাষা সেট করার জন্য API কল করলে একটি কনফিগারেশন পরিবর্তন ঘটে। কম্পোজ আপনার UI পুনর্গঠন করে এবং নতুন লোকেল ব্যবহার করে যেকোনো stringResource কল স্বয়ংক্রিয়ভাবে সমাধান করে এর প্রতিক্রিয়া জানায়।

অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩২) এবং এর নিচের সংস্করণগুলোর সাথে ব্যাকওয়ার্ড কম্প্যাটিবিলিটি বজায় রাখার জন্য, অ্যাপের মধ্যে ল্যাঙ্গুয়েজ পিকার ইমপ্লিমেন্ট করার সময় আমরা অ্যান্ড্রয়েডএক্স সাপোর্ট লাইব্রেরি ( AppCompatDelegate ) ব্যবহার করার জন্য জোরালোভাবে সুপারিশ করি। আপনি যদি এই পদ্ধতি ব্যবহার করেন, তবে আপনার কম্পোজ UI হোস্টকারী অ্যাক্টিভিটিকে অবশ্যই AppCompatActivity এক্সটেন্ড করতে হবে। তবে, প্রয়োজনে আপনি সরাসরি ফ্রেমওয়ার্ক এপিআইগুলোও ইমপ্লিমেন্ট করতে পারেন।

নিম্নলিখিত কোড স্নিপেটটি একটি কম্পোজেবল ফাংশনের মধ্যে কীভাবে বর্তমান অ্যাপ লোকেল পড়তে এবং একটি নতুন লোকেল সেট করতে হয় তার একটি উদাহরণ দেখায়:

import androidx.appcompat.app.AppCompatDelegate
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.core.os.LocaleListCompat

@Composable
fun LanguageSelector() {
    // Retrieve the currently configured app locale.
    // If no app-specific locale is set, LocaleListCompat.get(0) returns null,
    // so we safely fall back to a default (e.g., "en").
    val appLocales = AppCompatDelegate.getApplicationLocales()
    val currentLocaleTag = appLocales.get(0)?.toLanguageTag() ?: "en"

    // Example UI: A button to toggle between English and Spanish
    Button(
        onClick = {
            val newLanguageTag = if (currentLocaleTag == "en") "es" else "en"
            val localeList = LocaleListCompat.forLanguageTags(newLanguageTag)

            // Setting the locale re-creates the Activity by default,
            // which automatically applies the new configuration to Compose.
            AppCompatDelegate.setApplicationLocales(localeList)
        }
    ) {
        Text(
            text = if (currentLocaleTag == "en") "Switch to Spanish" else "Switch to English"
        )
    }
}

ব্যবহারকারীর পছন্দের ভাষা সেট করতে, আপনাকে ল্যাঙ্গুয়েজ পিকার থেকে ব্যবহারকারীকে একটি লোকেল বেছে নিতে বলতে হবে, তারপর সিস্টেমে সেই মানটি সেট করতে হবে:

val appLocale: LocaleListCompat = LocaleListCompat.forLanguageTags("xx-YY")
// Call this on the main thread as it may require Activity.restart()
AppCompatDelegate.setApplicationLocales(appLocale)

মনে রাখবেন যে, setApplicationLocales কল করলে আপনার Activity পুনরায় তৈরি হয়, যদি না আপনার অ্যাপ নিজেই লোকেল কনফিগারেশন পরিবর্তনগুলি পরিচালনা করে

ব্যবহারকারীর পছন্দের লোকেল পেতে AppCompatDelegate.getApplicationLocales ব্যবহার করুন। ব্যবহারকারী সিস্টেম সেটিংস থেকে অথবা আপনার অ্যাপের ভেতরের ভাষা বাছাইকারী থেকে তাদের অ্যাপ লোকেল নির্বাচন করে থাকতে পারেন।

অ্যান্ড্রয়েড ১২ এবং এর নিচের সংস্করণ সমর্থন করে

Android 12 (API লেভেল 32) এবং এর নিচের সংস্করণ চালিত ডিভাইসগুলোকে সাপোর্ট করার জন্য, AndroidX-কে লোকেল স্টোরেজ পরিচালনা করতে বলুন। এর জন্য আপনার অ্যাপের AppLocalesMetadataHolderService সার্ভিসের ম্যানিফেস্ট এন্ট্রিতে autoStoreLocales এর ভ্যালু true এবং android:enabled এর ভ্যালু false সেট করুন, যেমনটি নিচের কোড স্নিপেটে দেখানো হয়েছে:

<application
  ...
  <service
    android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
    android:enabled="false"
    android:exported="false">
    <meta-data
      android:name="autoStoreLocales"
      android:value="true" />
  </service>
  ...
</application>

মনে রাখবেন যে autoStoreLocales এর মান true সেট করলে মেইন থ্রেডে একটি ব্লকিং রিড শুরু হয় এবং আপনি যদি থ্রেড ভায়োলেশন লগ করেন, তাহলে এটি StrictMode diskRead এবং diskWrite ভায়োলেশনের কারণ হতে পারে। আরও তথ্যের জন্য AppCompatDelegate.setApplicationLocales দেখুন।

কাস্টম স্টোরেজ হ্যান্ডলিং

ম্যানিফেস্ট এন্ট্রি বাদ দেওয়া বা autoStoreLocales কে false সেট করা ইঙ্গিত দেয় যে আপনি আপনার নিজস্ব স্টোরেজ পরিচালনা করছেন। এই ক্ষেত্রে, Android 12 (API লেভেল 32) বা তার নিচের সংস্করণে, আপনাকে অ্যাক্টিভিটি লাইফসাইকেলে onCreate আগে এবং AppCompatDelegate.setApplicationLocales এ গেট কল করার সময় স্টোর করা লোকেলগুলো অবশ্যই সরবরাহ করতে হবে।

আপনার অ্যাপের যদি একটি কাস্টম লোকেল স্টোরেজ লোকেশন থাকে, তাহলে আমরা আপনার কাস্টম লোকেল স্টোরেজ সলিউশন এবং autoStoreLocales মধ্যে একটি ওয়ান-টাইম হ্যান্ডঅফ ব্যবহার করার পরামর্শ দিই, যাতে ব্যবহারকারীরা তাদের পছন্দের ভাষায় আপনার অ্যাপটি উপভোগ করতে পারেন। এটি বিশেষ করে সেইসব ক্ষেত্রে প্রযোজ্য যখন কোনো ডিভাইস Android 13-এ আপগ্রেড হওয়ার পর আপনার অ্যাপটি প্রথমবার চালানো হয়। এই ক্ষেত্রে, আপনি আপনার কাস্টম স্টোরেজ থেকে লোকেলগুলো পুনরুদ্ধার করে এবং AppCompatDelegate.setApplicationLocales এ পাস করার মাধ্যমে আগে থেকে বিদ্যমান, ব্যবহারকারীর অনুরোধ করা লোকেলগুলো সরবরাহ করতে পারেন।

অ্যান্ড্রয়েড ফ্রেমওয়ার্ক এপিআই ব্যবহার করে বাস্তবায়ন করুন

যদিও আমরা অ্যাপের মধ্যে ভাষা নির্বাচক (language picker) প্রয়োগ করার জন্য AndroidX সাপোর্ট লাইব্রেরি ব্যবহারের জোরালো পরামর্শ দিই, তবুও Android 13 চালিত ডিভাইসগুলোর জন্য আপনি Android ফ্রেমওয়ার্কের setApplicationLocales এবং getApplicationLocales মেথডগুলোও ব্যবহার করতে পারেন।

নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে LocaleManager সিস্টেম সার্ভিস ব্যবহার করে ব্যবহারকারীর পছন্দের ভাষা সেট এবং গেট করতে হয়:

import android.app.LocaleManager
import android.content.Context
import android.os.Build
import android.os.LocaleList
import androidx.annotation.RequiresApi
import java.util.Locale

@RequiresApi(Build.VERSION_CODES.TIRAMISU)
fun setAppLanguage(context: Context, languageTag: String) {
    // 1. Retrieve the system service
    val localeManager = context.getSystemService(LocaleManager::class.java)

    // 2. Create a LocaleList from the language tag (e.g., "es-ES" or "ja")
    val localeList = LocaleList(Locale.forLanguageTag(languageTag))

    // 3. Set the locale. The system automatically updates the locale and
    // restarts the app, including any necessary configuration updates.
    localeManager.applicationLocales = localeList
}

@RequiresApi(Build.VERSION_CODES.TIRAMISU)
fun getAppLanguage(context: Context): String {
    val localeManager = context.getSystemService(LocaleManager::class.java)
    val currentLocales = localeManager.applicationLocales

    // Return the primary app locale, or fall back to the system default
    return if (!currentLocales.isEmpty) {
        currentLocales.get(0).toLanguageTag()
    } else {
        Locale.getDefault().toLanguageTag()
    }
}

অতিরিক্ত সর্বোত্তম অনুশীলন

নিম্নলিখিত সর্বোত্তম অনুশীলনগুলো নোট করুন।

অন্য অ্যাপে কোনো ইন্টেন্ট কল করার সময় ভাষা বিবেচনা করুন।

ভাষা-কেন্দ্রিক ইন্টেন্ট আপনাকে নির্দিষ্ট করে দেওয়ার সুযোগ দিতে পারে যে, চালু হওয়া অ্যাপটি কোন ভাষায় চলবে। এর একটি উদাহরণ হলো স্পিচ রিকগনাইজার এপিআই-এর EXTRA_LANGUAGE ফিচারটি।

ক্রোম কাস্টম ট্যাবের জন্য Accept-Language হেডারটি বিবেচনা করুন।

ক্রোম কাস্টম ট্যাব খোলার সময় ওয়েব পেজটি আপনার অ্যাপের ভাষায় খোলার জন্য Browser.EXTRA_HEADERS এর মাধ্যমে Accept-Language হেডারটি যোগ করার কথা বিবেচনা করুন।

আপনি যদি সিস্টেম সেটিংস থেকে অ্যাপ-ভিত্তিক ভাষার পছন্দগুলি মুছে ফেলেন, তাহলে আপনার অ্যাপের লোকেলকে সিস্টেম লোকেলে রিসেট করুন।

আপনি যদি সিস্টেম সেটিংস থেকে আপনার অ্যাপের ভাষার পছন্দগুলি মুছে ফেলেন (আপনার অ্যাপের AndroidManifest.xml থেকে android:localeConfig সরিয়ে দিয়ে), তাহলে ব্যবহারকারীরা সহজে তাদের অ্যাপের ভাষা সিস্টেমের ডিফল্ট ভাষায় ফিরিয়ে আনতে পারবেন না।

এই কারণে, আপনি যদি android:localeConfig মুছে ফেলেন, তাহলে নিচের কোড স্নিপেটে দেখানো অনুযায়ী LocaleListCompat.getEmptyLocaleList অথবা LocaleList.getEmptyLocaleList ব্যবহার করে অ্যাপের লোকেলকে সিস্টেম লোকেলে রিসেট করার কথা বিবেচনা করতে পারেন:

// Use the AndroidX APIs to reset to the system locale for backward and forward compatibility
AppCompatDelegate.setApplicationLocales(
  LocaleListCompat.getEmptyLocaleList()
)

// Or use the Framework APIs for Android 13 and above to reset to the system locale
val context = LocalContext.current
context.getSystemService(LocaleManager::class.java)
  .applicationLocales = LocaleList.getEmptyLocaleList()

নমুনা locale_config.xml ফাইল

ডিফল্টরূপে, অ্যান্ড্রয়েড ওপেন সোর্স প্রজেক্ট (AOSP)-এ অ্যান্ড্রয়েড সর্বাধিক ব্যবহৃত কিছু স্ট্যান্ডার্ড লোকেলের জন্য সিস্টেম-স্তরের অনুবাদ অন্তর্ভুক্ত করে। এই বিভাগে অন্তর্ভুক্ত নমুনা locale_config.xml ফাইলটি এই প্রতিটি লোকেলের জন্য প্রস্তাবিত ফরম্যাট দেখায়। আপনার অ্যাপ যে ভাষাগুলো সমর্থন করে, সেগুলোর জন্য আপনার নিজস্ব locale_config.xml ফাইল তৈরি করতে এই নমুনা ফাইলটি রেফারেন্স হিসেবে ব্যবহার করুন।

<?xml version="1.0" encoding="utf-8"?>
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
   <locale android:name="af"/> <!-- Afrikaans -->
   <locale android:name="am"/> <!-- Amharic -->
   <locale android:name="ar"/> <!-- Arabic -->
   <locale android:name="as"/> <!-- Assamese -->
   <locale android:name="az"/> <!-- Azerbaijani -->
   <locale android:name="be"/> <!-- Belarusian -->
   <locale android:name="bg"/> <!-- Bulgarian -->
   <locale android:name="bn"/> <!-- Bengali -->
   <locale android:name="bs"/> <!-- Bosnian -->
   <locale android:name="ca"/> <!-- Catalan -->
   <locale android:name="cs"/> <!-- Czech -->
   <locale android:name="da"/> <!-- Danish -->
   <locale android:name="de"/> <!-- German -->
   <locale android:name="el"/> <!-- Greek -->
   <locale android:name="en-AU"/> <!-- English (Australia) -->
   <locale android:name="en-CA"/> <!-- English (Canada) -->
   <locale android:name="en-GB"/> <!-- English (United Kingdom) -->
   <locale android:name="en-IN"/> <!-- English (India) -->
   <locale android:name="en-US"/> <!-- English (United States) -->
   <locale android:name="es"/> <!-- Spanish (Spain) -->
   <locale android:name="es-US"/> <!-- Spanish (United States) -->
   <locale android:name="et"/> <!-- Estonian -->
   <locale android:name="eu"/> <!-- Basque -->
   <locale android:name="fa"/> <!-- Farsi -->
   <locale android:name="fi"/> <!-- Finnish -->
   <locale android:name="fil"/> <!-- Filipino -->
   <locale android:name="fr"/> <!-- French (France) -->
   <locale android:name="fr-CA"/> <!-- French (Canada) -->
   <locale android:name="gl"/> <!-- Galician -->
   <locale android:name="gu"/> <!-- Gujarati -->
   <locale android:name="hi"/> <!-- Hindi -->
   <locale android:name="hr"/> <!-- Croatian -->
   <locale android:name="hu"/> <!-- Hungarian -->
   <locale android:name="hy"/> <!-- Armenian -->
   <locale android:name="in"/> <!-- Indonesian -->
   <locale android:name="is"/> <!-- Icelandic -->
   <locale android:name="it"/> <!-- Italian -->
   <locale android:name="iw"/> <!-- Hebrew -->
   <locale android:name="ja"/> <!-- Japanese -->
   <locale android:name="ka"/> <!-- Georgian -->
   <locale android:name="kk"/> <!-- Kazakh -->
   <locale android:name="km"/> <!-- Khmer -->
   <locale android:name="kn"/> <!-- Kannada -->
   <locale android:name="ko"/> <!-- Korean -->
   <locale android:name="ky"/> <!-- Kyrgyz -->
   <locale android:name="lo"/> <!-- Lao -->
   <locale android:name="lt"/> <!-- Lithuanian -->
   <locale android:name="lv"/> <!-- Latvian -->
   <locale android:name="mk"/> <!-- Macedonian -->
   <locale android:name="ml"/> <!-- Malayalam -->
   <locale android:name="mn"/> <!-- Mongolian -->
   <locale android:name="mr"/> <!-- Marathi -->
   <locale android:name="ms"/> <!-- Malay -->
   <locale android:name="my"/> <!-- Burmese -->
   <locale android:name="nb"/> <!-- Norwegian -->
   <locale android:name="ne"/> <!-- Nepali -->
   <locale android:name="nl"/> <!-- Dutch -->
   <locale android:name="or"/> <!-- Odia -->
   <locale android:name="pa"/> <!-- Punjabi -->
   <locale android:name="pl"/> <!-- Polish -->
   <locale android:name="pt-BR"/> <!-- Portuguese (Brazil) -->
   <locale android:name="pt-PT"/> <!-- Portuguese (Portugal) -->
   <locale android:name="ro"/> <!-- Romanian -->
   <locale android:name="ru"/> <!-- Russian -->
   <locale android:name="si"/> <!-- Sinhala -->
   <locale android:name="sk"/> <!-- Slovak -->
   <locale android:name="sl"/> <!-- Slovenian -->
   <locale android:name="sq"/> <!-- Albanian -->
   <locale android:name="sr"/> <!-- Serbian (Cyrillic) -->
   <locale android:name="sr-Latn"/> <!-- Serbian (Latin) -->
   <locale android:name="sv"/> <!-- Swedish -->
   <locale android:name="sw"/> <!-- Swahili -->
   <locale android:name="ta"/> <!-- Tamil -->
   <locale android:name="te"/> <!-- Telugu -->
   <locale android:name="th"/> <!-- Thai -->
   <locale android:name="tr"/> <!-- Turkish -->
   <locale android:name="uk"/> <!-- Ukrainian -->
   <locale android:name="ur"/> <!-- Urdu -->
   <locale android:name="uz"/> <!-- Uzbek -->
   <locale android:name="vi"/> <!-- Vietnamese -->
   <locale android:name="zh-Hans"/> <!-- Chinese (Simplified) -->
   <locale android:name="zh-Hant"/> <!-- Chinese (Traditional) -->
   <locale android:name="zu"/> <!-- Zulu -->
</locale-config>

অতিরিক্ত সম্পদ

অতিরিক্ত তথ্যের জন্য আমাদের কোড স্যাম্পল, ব্লগ আর্টিকেল এবং ভিডিও দেখুন।