ইউনিকোড এবং আন্তর্জাতিকীকরণ সমর্থন

অ্যান্ড্রয়েড ইউনিকোড এবং অন্যান্য আন্তর্জাতিকীকরণ সমর্থন প্রদানের জন্য ICU লাইব্রেরি এবং CLDR প্রজেক্ট ব্যবহার করে। এই পৃষ্ঠায় ইউনিকোড এবং আন্তর্জাতিকীকরণ সমর্থন সম্পর্কিত আলোচনা দুটি বিভাগে বিভক্ত: অ্যান্ড্রয়েড ৬.০ (এপিআই লেভেল ২৩) ও তার নিম্ন সংস্করণ, এবং অ্যান্ড্রয়েড ৭.০ (এপিআই লেভেল ২৪) ও তার উচ্চ সংস্করণ।

অ্যান্ড্রয়েড ৬.০ (এপিআই লেভেল ২৩) পর্যন্ত ইউনিকোড এবং আন্তর্জাতিকীকরণ সমর্থন।

অ্যান্ড্রয়েড প্ল্যাটফর্ম ল্যাটিন এবং অ-ল্যাটিন উভয় প্রকার বানানরীতি পরিচালনার জন্য বিভিন্ন ক্লাস বাস্তবায়ন করতে ICU এবং CLDR ব্যবহার করে, যা Locale , Character এবং java.text এর অনেক সাবক্লাসের মতো ক্লাসগুলো উন্মুক্ত করে। যে অ্যাপে উন্মুক্ত ক্লাসগুলোর বাইরেও আন্তর্জাতিকীকরণের কার্যকারিতা প্রয়োজন এবং যা অ্যান্ড্রয়েড ৬.০ (এপিআই লেভেল ২৩) পর্যন্ত প্ল্যাটফর্মের সংস্করণগুলোকে লক্ষ্য করে তৈরি, সেটিতে অবশ্যই ICU লাইব্রেরি অন্তর্ভুক্ত করতে হবে।

সংস্করণ

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

সারণি ১. অ্যান্ড্রয়েড ৬.০ (এপিআই লেভেল ২৩) পর্যন্ত ব্যবহৃত আইসিইউ এবং সিএলডিআর সংস্করণসমূহ।

প্ল্যাটফর্ম (এপিআই স্তর) আইসিইউ সিএলডিআর ইউনিকোড
অ্যান্ড্রয়েড ১.৫–২.০ (এপিআই লেভেল ৩–৭) ৩.৮ ১.৫ ৫.০
অ্যান্ড্রয়েড ২.২ (এপিআই লেভেল ৮) ৪.২ ১.৭ ৫.১
অ্যান্ড্রয়েড ২.৩–৩.০ (এপিআই লেভেল ৯–১৩) ৪.৪ ১.৮ ৫.২
অ্যান্ড্রয়েড ৪.০ (এপিআই লেভেল ১৪-১৫) ৪.৬ ১.৯ ৬.০
অ্যান্ড্রয়েড ৪.১ (এপিআই লেভেল ১৬-১৭) ৪.৮ ২.০ ৬.০
অ্যান্ড্রয়েড ৪.৩ (এপিআই লেভেল ১৮) ৫০ ২২.১ ৬.২
অ্যান্ড্রয়েড ৪.৪ (এপিআই লেভেল ১৯-২০) ৫১ ২৩ ৬.২
অ্যান্ড্রয়েড ৫.০ (এপিআই লেভেল ২১-২২) ৫৩ ২৫ ৬.৩
অ্যান্ড্রয়েড ৬.০ (এপিআই লেভেল ২৩) ৫৫.১ ২৭.০.১ ৭.০

অ্যান্ড্রয়েড ফ্রেমওয়ার্ক অ্যান্ড্রয়েড ৭.০ (এপিআই লেভেল ২৪) এবং তার উচ্চতর সংস্করণের অ্যাপগুলোর জন্য ইউনিকোড ও আন্তর্জাতিকীকরণের আরও ব্যাপক সমর্থন প্রদান করে। এই পৃষ্ঠার পরবর্তী অংশে সেই সমর্থন সম্পর্কে বিস্তারিত তথ্য দেওয়া হয়েছে।

অ্যান্ড্রয়েড ৭.০ (এপিআই লেভেল ২৪) এবং তার পরবর্তী সংস্করণগুলোতে ইউনিকোড এবং আন্তর্জাতিকীকরণ সমর্থন।

অ্যান্ড্রয়েড ৭.০ (এপিআই লেভেল ২৪) এবং এর পরবর্তী সংস্করণগুলোর জন্য, অ্যান্ড্রয়েড প্ল্যাটফর্ম অ্যাপ ডেভেলপারদের ব্যবহারের উদ্দেশ্যে android.icu প্যাকেজের অধীনে ICU4J এপিআই-এর একটি উপসেট উন্মুক্ত করে। ICU4J হলো একটি ওপেন-সোর্স ও বহুল ব্যবহৃত জাভা লাইব্রেরির সমষ্টি, যা সফটওয়্যার অ্যাপ্লিকেশনগুলোর জন্য ইউনিকোড এবং আন্তর্জাতিকীকরণ সমর্থন প্রদান করে।

ICU4J API-গুলো ডিভাইসে থাকা লোকালাইজেশন ডেটা ব্যবহার করে। ফলে, আপনার অ্যাপে ICU4J লাইব্রেরিগুলো কম্পাইল না করে আপনি আপনার অ্যাপের সাইজ কমাতে পারেন। এর পরিবর্তে, আপনি ফ্রেমওয়ার্কের মধ্যে সেগুলোকে কল করতে পারেন। যদি আপনি এটি করেন, তবে আপনি আপনার APK-এর একাধিক সংস্করণ সরবরাহ করতে চাইতে পারেন, যাতে Android 7.0 (API লেভেল 24)-এর চেয়ে নিম্ন সংস্করণের ব্যবহারকারীরা ICU4J লাইব্রেরিযুক্ত অ্যাপটির সংস্করণটি ডাউনলোড করতে পারেন।

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

অ্যান্ড্রয়েডে ICU4J

অ্যান্ড্রয়েড com.ibm.icu পরিবর্তে android.icu প্যাকেজের মাধ্যমে ICU4J API-গুলোর একটি উপসেট প্রকাশ করে। কিছু ICU4J API অ্যান্ড্রয়েড ফ্রেমওয়ার্ক দ্বারা প্রকাশিত হয় না, যেমন API-গুলো ডেপ্রিকেটেড বা স্থিতিশীল হিসেবে ঘোষিত না হওয়ার কারণে। ভবিষ্যতে ICU টিম যখন কোনো API ডেপ্রিকেটেড ঘোষণা করবে, অ্যান্ড্রয়েডও সেগুলোকে ডেপ্রিকেটেড হিসেবে চিহ্নিত করবে কিন্তু সেগুলোকে অন্তর্ভুক্ত করা অব্যাহত রাখবে।

এখানে কয়েকটি অনুস্মারক দেওয়া হলো:

  • ICU4J অ্যান্ড্রয়েড ফ্রেমওয়ার্ক API-গুলোতে ICU4J-এর সমস্ত API অন্তর্ভুক্ত নেই।
  • অ্যান্ড্রয়েড ফ্রেমওয়ার্কের এপিআইগুলো রিসোর্সের মাধ্যমে স্থানীয়করণ করার ক্ষেত্রে অ্যান্ড্রয়েডের সমর্থনকে প্রতিস্থাপন করে না।
  • কিছু ক্ষেত্রে, অ্যান্ড্রয়েড ফ্রেমওয়ার্ক ICU লাইব্রেরির চেয়ে বেশি অক্ষর সমর্থন করে। উদাহরণস্বরূপ, android.text ক্লাসের ইমোজি সমর্থনের ক্ষেত্রে এটি সত্য।

com.ibm.icu থেকে android.icu প্যাকেজে স্থানান্তরিত হন।

যদি আপনি আপনার অ্যাপে ইতিমধ্যেই ICU4J API ব্যবহার করে থাকেন এবং android.icu API আপনার প্রয়োজনীয়তা পূরণ করে, তাহলে ফ্রেমওয়ার্ক API-তে স্থানান্তরিত হতে হলে আপনাকে আপনার Java ইম্পোর্টগুলো com.ibm.icu থেকে android.icu তে পরিবর্তন করতে হবে। এরপর আপনি অ্যাপ থেকে আপনার নিজের ICU4J ফাইলের কপিটি সরিয়ে ফেলতে পারেন।

দ্রষ্টব্য : ICU4J ফ্রেমওয়ার্ক API-গুলো com.ibm.icu এর পরিবর্তে android.icu নেমস্পেস ব্যবহার করে। যেসব অ্যাপে নিজস্ব com.ibm.icu লাইব্রেরি থাকে, সেগুলোতে নেমস্পেস দ্বন্দ্ব এড়ানোর জন্যই এটি করা হয়।

অন্যান্য অ্যান্ড্রয়েড এসডিকে এপিআই থেকে android.icu এপিআই-তে স্থানান্তরিত করুন

java এবং android প্যাকেজের কিছু ক্লাসের সমতুল্য ক্লাস ICU4J-তে পাওয়া যায়। তবে, ICU4J প্রায়শই বিভিন্ন স্ট্যান্ডার্ড এবং ভাষার জন্য আরও ব্যাপক সমর্থন প্রদান করে।

আপনাকে শুরু করার জন্য সারণি ২-এ এই সমতুল্যতাগুলোর কিছু উদাহরণ দেখানো হলো:

সারণি ২. অ্যান্ড্রয়েড এবং জাভা ICU4J ক্লাসসমূহ

শ্রেণী বিকল্প
java.lang.Character android.icu.lang.UCharacter
java.text.BreakIterator android.icu.text.BreakIterator
java.text.DecimalFormat android.icu.text.DecimalFormat
java.util.Calendar android.icu.util.Calendar
android.text.BidiFormatter android.icu.text.Bidi
android.text.format.DateFormat android.icu.text.DateFormat
android.text.format.DateUtils android.icu.text.DateFormat android.icu.text.RelativeDateTimeFormatter

অ্যান্ড্রয়েডে ICU4C

অ্যান্ড্রয়েড, libicuuc.so বা libicui18n.so এর পরিবর্তে libicu.so লাইব্রেরির মাধ্যমে ICU4C API-গুলোর একটি উপসেট প্রকাশ করে। এই API-গুলো অ্যান্ড্রয়েড ১২ (API লেভেল ৩১) থেকে পাওয়া যায়। NDK হেডারগুলো NDK রিলিজ r22b থেকে পাওয়া যায়। অ্যান্ড্রয়েড NDK-এর মাধ্যমে কোনো C++ API প্রকাশ করা হয় না। কিছু C API পাওয়া যায় না।

সংস্করণ

অ্যান্ড্রয়েড প্ল্যাটফর্মের পরবর্তী রিলিজগুলো ICU-এর নতুন সংস্করণ এবং সংশ্লিষ্ট CLDR ও ইউনিকোড সংস্করণগুলোর সাথে সঙ্গতিপূর্ণ। সারণি ৩-এ অ্যান্ড্রয়েড ৭.০ (এপিআই লেভেল ২৪) থেকে শুরু করে এই সঙ্গতি দেখানো হয়েছে। রানটাইমে ICU সংস্করণের তথ্য পেতে VersionInfo.ICU_VERSION এপিআই (যা অ্যান্ড্রয়েড ৭.০ থেকে উপলব্ধ) ব্যবহার করুন।

সারণি ৩. অ্যান্ড্রয়েড ৭.০ (এপিআই লেভেল ২৪) থেকে অ্যান্ড্রয়েড ১৫ (এপিআই লেভেল ৩৫) পর্যন্ত ব্যবহৃত আইসিইউ এবং সিএলডিআর সংস্করণসমূহ।

প্ল্যাটফর্ম (এপিআই স্তর) আইসিইউ সিএলডিআর ইউনিকোড
অ্যান্ড্রয়েড ৭.০ - ৭.১ (এপিআই লেভেল ২৪ - ২৫) ৫৬ ২৮ ৮.০
অ্যান্ড্রয়েড ৮.০ - ৮.১ (এপিআই লেভেল ২৬ - ২৭) ৫৮.২ ৩০.০.৩ ৯.০
অ্যান্ড্রয়েড ৯ (এপিআই লেভেল ২৮) ৬০.২ ৩২.০.১ ১০.০
অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) ৬৩.২ ৩৪ ১১.০
অ্যান্ড্রয়েড ১১ (এপিআই লেভেল ৩০) ৬৬.১ ৩৬ ১৩.০
অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১ - ৩২) ৬৮.২ ৩৮.১ ১৩.০
অ্যান্ড্রয়েড ১৩ (এপিআই লেভেল ৩৩) ৭০.১ ৪০ ১৪.০
অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) ৭২.১ ৪২ ১৫.০
অ্যান্ড্রয়েড ১৫ (এপিআই লেভেল ৩৫) ৭৫.১ ৪৫ ১৫.১

২৪ ঘণ্টা/১২ ঘণ্টা সময় বিন্যাস সেটিং

অ্যান্ড্রয়েডের ICU, DateFormat.is24HourFormat() থেকে প্রাপ্ত ব্যবহারকারীর ২৪-ঘণ্টা/১২-ঘণ্টা সময় বিন্যাস সেটিংটি অনুসরণ করে না। এই সেটিংটি অনুসরণ করার জন্য, হয় DateFormat অথবা DateUtils সময় বিন্যাস পদ্ধতি ব্যবহার করুন, অথবা is24HourFormat() বিভিন্ন রিটার্ন মানের জন্য উপযুক্ত ঘণ্টার প্যাটার্ন চিহ্ন ('h' ১২-ঘণ্টার জন্য, 'H' ২৪-ঘণ্টার জন্য) সহ ICU সময় বিন্যাস প্যাটার্ন ব্যবহার করুন। উদাহরণস্বরূপ, এই কোডটি বর্তমান সময় সহ একটি স্ট্রিং তৈরি করে যা ব্যবহারকারীর ১২-ঘণ্টা/২৪-ঘণ্টা সেটিংটি অনুসরণ করে:

কোটলিন

val skeleton: String = if (DateFormat.is24HourFormat(context)) "Hm" else "hm"
val formattedTime: String = android.icu.text.DateFormat.getInstanceForSkeleton(
        skeleton,
        Locale.getDefault()).format(Date()
)

জাভা

String skeleton = DateFormat.is24HourFormat(context) ? "Hm" : "hm";
String formattedTime = android.icu.text.DateFormat.getInstanceForSkeleton(skeleton, Locale.getDefault()).format(new Date());

প্রতিবর্ণীকরণকারীর স্থিতিশীলতা

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

লাইসেন্সিং

ICU4J, ICU লাইসেন্সের অধীনে প্রকাশিত হয়েছে। বিস্তারিত জানতে, ICU ব্যবহারকারী নির্দেশিকা দেখুন।