বিভিন্ন ভাষা এবং সংস্কৃতি সমর্থন করুন

অ্যাপগুলিতে এমন সংস্থান রয়েছে যা একটি নির্দিষ্ট সংস্কৃতির জন্য নির্দিষ্ট হতে পারে। উদাহরণস্বরূপ, একটি অ্যাপে সংস্কৃতি-নির্দিষ্ট স্ট্রিং অন্তর্ভুক্ত থাকতে পারে যা বর্তমান লোকেলের ভাষায় অনুবাদ করা হয়।

সংস্কৃতি-নির্দিষ্ট সংস্থানগুলিকে আপনার বাকি অ্যাপ থেকে আলাদা করে রাখা একটি ভাল অভ্যাস। Android সিস্টেম লোকেল সেটিং এর উপর ভিত্তি করে ভাষা- এবং সংস্কৃতি-নির্দিষ্ট সংস্থানগুলি সমাধান করে৷ আপনি আপনার অ্যান্ড্রয়েড প্রোজেক্টে রিসোর্স ডিরেক্টরি ব্যবহার করে বিভিন্ন লোকেলের জন্য সমর্থন প্রদান করতে পারেন।

আপনি আপনার অ্যাপ ব্যবহার করে লোকেদের সংস্কৃতির জন্য উপযোগী সম্পদ নির্দিষ্ট করতে পারেন। আপনি আপনার ব্যবহারকারীদের ভাষা এবং সংস্কৃতির জন্য উপযুক্ত যে কোনও সংস্থান প্রকার সরবরাহ করতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত স্ক্রিনশটগুলি ডিভাইসের ডিফল্ট en_US লোকেলে এবং স্প্যানিশ es_ES লোকেলে স্ট্রিং এবং অঙ্কনযোগ্য সংস্থান প্রদর্শন করে এমন একটি অ্যাপ দেখায়।

বর্তমান লোকেলের উপর নির্ভর করে অ্যাপটি একটি ভিন্ন পাঠ্য এবং আইকন দেখায়

চিত্র 1. বর্তমান লোকেলের উপর নির্ভর করে বিভিন্ন সংস্থান ব্যবহার করে অ্যাপ।

আপনি যখন Android SDK টুলস ব্যবহার করে একটি প্রজেক্ট তৈরি করেন, তখন টুলগুলি প্রোজেক্টের শীর্ষ স্তরে একটি res/ ডিরেক্টরি তৈরি করে। এই res/ ডিরেক্টরির মধ্যে বিভিন্ন ধরনের রিসোর্সের জন্য সাবডিরেক্টরি রয়েছে। এছাড়াও কিছু ডিফল্ট ফাইল আছে, যেমন res/values/strings.xml ফাইল, যা আপনার স্ট্রিং মান ধরে রাখে।

বিভিন্ন ভাষা সমর্থন করা লোকেল-নির্দিষ্ট সংস্থান ব্যবহার করার বাইরে যায়। কিছু ব্যবহারকারী তাদের UI লোকেলের জন্য ডান-থেকে-বামে (RTL) স্ক্রিপ্ট যেমন আরবি বা হিব্রু ব্যবহার করে এমন একটি ভাষা বেছে নেন। অন্যান্য ব্যবহারকারী যারা তাদের UI লোকেল এমন একটি ভাষায় সেট করে যা LTR স্ক্রিপ্ট ব্যবহার করে, যেমন ইংরেজি, তারা RTL স্ক্রিপ্ট ব্যবহার করে এমন একটি ভাষায় সামগ্রী দেখতে বা তৈরি করতে পারে। উভয় ধরনের ব্যবহারকারীদের সমর্থন করার জন্য, আপনার অ্যাপকে নিম্নলিখিত কাজ করতে হবে:

  • RTL লোকেলের জন্য একটি RTL UI লেআউট নিয়োগ করুন।
  • বিন্যাসিত বার্তাগুলির ভিতরে প্রদর্শিত পাঠ্য ডেটার দিকটি সনাক্ত করুন এবং ঘোষণা করুন৷ সাধারণত, আপনি একটি পদ্ধতি কল করতে পারেন, যেমন এই নির্দেশিকায় বর্ণিত হয়েছে, যা আপনার জন্য পাঠ্য ডেটার দিকনির্দেশ নির্ধারণ করে।

লোকেল ডিরেক্টরি এবং সংস্থান ফাইল তৈরি করুন

আরও লোকেলের জন্য সমর্থন যোগ করতে, res/ ভিতরে অতিরিক্ত ডিরেক্টরি তৈরি করুন। প্রতিটি ডিরেক্টরির নাম নিম্নলিখিত বিন্যাস মেনে চলতে হবে:

<resource type>-b+<language code>[+<country code>]

উদাহরণস্বরূপ, values-b+es/ ভাষা কোড es সহ লোকেলের জন্য স্ট্রিং সংস্থান রয়েছে। একইভাবে, mipmap-b+es+ES/ es ভাষা কোড এবং ES দেশের কোড সহ লোকেলের জন্য আইকন রয়েছে।

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

আপনি কোন লোকেল সমর্থন করবেন তা স্থির করার পরে, রিসোর্স সাবডিরেক্টরি এবং ফাইল তৈরি করুন। উদাহরণ স্বরূপ:

MyProject/
    res/
       values/
           strings.xml
       values-b+es/
           strings.xml
       mipmap/
           country_flag.png
       mipmap-b+es+ES/
           country_flag.png

স্থানীয় রিসোর্স দিয়ে রিসোর্স ফাইল পপুলেট করুন। নিম্নলিখিত স্থানীয় স্ট্রিং এবং ইমেজ রিসোর্স ফাইলের উদাহরণ:

/values/strings.xml এ ইংরেজি স্ট্রিং (ডিফল্ট লোকেল) :

<resources>
    <string name="hello_world">Hello World!</string>
</resources>

/values-b+es/strings.xml এ স্প্যানিশ স্ট্রিং ( es লোকেল) :

<resources>
    <string name="hello_world">¡Hola Mundo!</string>
</resources>

/mipmap/country_flag.png এ মার্কিন পতাকা আইকন (ডিফল্ট লোকেল) :

মার্কিন যুক্তরাষ্ট্রের পতাকার আইকন

চিত্র 2. আইকনটি ডিফল্ট (en_US) লোকেলের জন্য ব্যবহৃত হয়।

/mipmap-b+es+ES/country_flag.png এ স্প্যানিশ পতাকা আইকন ( es_ES লোকেল) :

স্পেনের পতাকার আইকন

চিত্র 3. es_ES লোকেলের জন্য ব্যবহৃত আইকন।

দ্রষ্টব্য: আপনি কনফিগারেশন কোয়ালিফায়ার ব্যবহার করতে পারেন, যেমন লোকেল কোয়ালিফায়ার, যেকোনো রিসোর্স টাইপের উপর। উদাহরণস্বরূপ, আপনি আপনার বিটম্যাপ অঙ্কনযোগ্যগুলির স্থানীয় সংস্করণ প্রদান করতে চাইতে পারেন। আরও তথ্যের জন্য, আপনার অ্যাপ স্থানীয়করণ দেখুন।

আপনার অ্যাপে সম্পদ ব্যবহার করুন

আপনার সোর্স কোড এবং অন্যান্য XML ফাইলের রিসোর্স রেফারেন্স করুন প্রতিটি রিসোর্সের name অ্যাট্রিবিউট ব্যবহার করে: R.<resource type>.<resource name> । নিম্নলিখিত উদাহরণগুলিতে দেখানো হয়েছে এমন বিভিন্ন পদ্ধতি রয়েছে যা এইভাবে একটি সংস্থান গ্রহণ করে:

কোটলিন

// Get a string resource
val hello = resources.getString(R.string.hello_world)

// Or supply a string resource to a method that requires a string
TextView(this).apply {
    setText(R.string.hello_world)
}

জাভা

// Get a string resource
String hello = getResources().getString(R.string.hello_world);

// Or supply a string resource to a method that requires a string
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);

XML ফাইলগুলিতে, আপনি সিনট্যাক্স সহ একটি সংস্থান উল্লেখ করতে পারেন @<resource type>/<resource name> যখনই XML অ্যাট্রিবিউট একটি সামঞ্জস্যপূর্ণ মান গ্রহণ করে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@mipmap/country_flag" />

দ্রষ্টব্য : ব্যবহারকারীর ভাষা সেটিংস সঠিকভাবে অগ্রাধিকার দেওয়া হয়েছে তা নিশ্চিত করতে, resConfigs প্রপার্টি ব্যবহার করে আপনার অ্যাপ যে ভাষাগুলিকে সমর্থন করে তা নির্দিষ্ট করুন৷ আরও তথ্যের জন্য, আপনার অ্যাপ যে ভাষাগুলি সমর্থন করে তা নির্দিষ্ট করুন দেখুন৷

বার্তাগুলিতে পাঠ্য ফর্ম্যাট করুন

একটি অ্যাপের সবচেয়ে সাধারণ কাজগুলির মধ্যে একটি হল পাঠ্য বিন্যাস করা। স্থানীয় বার্তাগুলি যথাযথ অবস্থানে পাঠ্য এবং সংখ্যাসূচক ডেটা সন্নিবেশ করে ফর্ম্যাট করা হয়। দুর্ভাগ্যবশত, একটি RTL UI বা RTL ডেটা নিয়ে কাজ করার সময়, সাধারণ বিন্যাস ভুল বা এমনকি অপঠিত পাঠ্য আউটপুট প্রদর্শন করতে পারে।

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

অ্যাপ্লিকেশানগুলি প্রায়শই এই ধরণের এমবেড করা বিপরীত-দিক টেক্সটের উদাহরণ তৈরি করে, যেমন একটি নির্বিচারে ভাষার পাঠ্য ডেটা এবং স্থানীয় বার্তাগুলিতে একটি নির্বিচারে পাঠ্য দিক সন্নিবেশ করে৷ এই দিকনির্দেশের মিশ্রণে প্রায়শই বিপরীত দিকনির্দেশের পাঠ্য কোথায় শুরু এবং শেষ হয় তার একটি স্পষ্ট ইঙ্গিত অন্তর্ভুক্ত করে না, তাই অ্যাপ-উত্পাদিত পাঠ্য ব্যবহারকারীর অভিজ্ঞতা খারাপ করতে পারে।

যদিও দ্বিমুখী পাঠ্যের সিস্টেমের ডিফল্ট পরিচালনা সাধারণত প্রত্যাশিত টেক্সট রেন্ডার করে, আপনার অ্যাপ যখন এটিকে একটি স্থানীয় বার্তায় সন্নিবেশিত করে তখন পাঠ্যটি সঠিকভাবে রেন্ডার নাও হতে পারে। নিম্নলিখিত পরিস্থিতিগুলির উদাহরণ যেখানে পাঠ্য ভুলভাবে প্রদর্শিত হতে পারে:

  • একটি বার্তার শুরুতে পাঠ্য সন্নিবেশ করা হয়েছে:

    PERSON_NAME আপনাকে কল করছে৷

  • একটি নম্বর দিয়ে শুরু হওয়া পাঠ্য, যেমন একটি ঠিকানা বা টেলিফোন নম্বর:

    987 654-3210

  • টেক্সট যা বিরাম চিহ্ন দিয়ে শুরু হয়, যেমন একটি ফোন নম্বর:

    +19876543210

  • পাঠ্য যা বিরাম চিহ্ন দিয়ে শেষ হয়:

    তুমি কি নিশ্চিত?

  • ইতিমধ্যে উভয় দিকনির্দেশ ধারণ করা পাঠ্য:

    בננה শব্দটি কলার জন্য হিব্রু।

উদাহরণ

ধরুন একটি অ্যাপকে মাঝে মাঝে "আপনি কি %s বলতে চাইছেন?" বার্তা প্রদর্শন করতে হবে, রানটাইমে %s এর জায়গায় একটি ঠিকানা ঢোকানো হবে। অ্যাপটি বিভিন্ন UI লোকেল সমর্থন করে, তাই বার্তাটি একটি লোকেল-নির্দিষ্ট সংস্থান থেকে আসে এবং ডিভাইসটি একটি RTL লোকেলে সেট করা হলে RTL দিক ব্যবহার করে। উদাহরণস্বরূপ, একটি হিব্রু UI এর জন্য, বার্তাটি নিম্নরূপ প্রদর্শিত হবে:

האם התכוונת ל %s ?

যাইহোক, প্রস্তাবিত ঠিকানাটি এমন একটি ডাটাবেস থেকে আসতে পারে যা লোকেলের ভাষায় পাঠ্য অন্তর্ভুক্ত করে না। উদাহরণস্বরূপ, যদি ঠিকানাটি ক্যালিফোর্নিয়ার একটি স্থানের জন্য হয় তবে এটি ইংরেজি পাঠ্য ব্যবহার করে ডাটাবেসে উপস্থিত হয়। আপনি যদি পাঠ্যের দিকনির্দেশ সম্পর্কিত কোনো ইঙ্গিত না দিয়ে RTL বার্তায় "15 Bay Street, Laurel, CA" ঠিকানাটি সন্নিবেশ করেন, ফলাফলটি প্রত্যাশিত বা সঠিক নয়:

האם התכוונת ל 15 বে স্ট্রিট, লরেল, CA?

বাড়ির নম্বরটি ঠিকানার ডানদিকে প্রদর্শিত হবে, বাম দিকে নয়। এটি বাড়ির নম্বরটিকে একটি অদ্ভুত পোস্টাল কোডের মতো দেখায়। একই সমস্যা ঘটতে পারে যদি আপনি LTR পাঠ্য দিকনির্দেশ ব্যবহার করে এমন একটি বার্তার মধ্যে RTL পাঠ্য অন্তর্ভুক্ত করেন।

ব্যাখ্যা এবং সমাধান

এই উদাহরণে সমস্যাটি ঘটে কারণ টেক্সট ফরম্যাটারটি নির্দিষ্ট করে না যে "15" ঠিকানার অংশ, তাই সিস্টেম নির্ধারণ করতে পারে না যে "15" RTL পাঠ্যের অংশ যা এটির আগে আসে বা LTR পাঠ্য। যে এটা পরে আসে.

এই সমস্যা সমাধানের জন্য, BidiFormatter ক্লাস থেকে unicodeWrap() পদ্ধতি ব্যবহার করুন। এই পদ্ধতিটি একটি স্ট্রিংয়ের দিক সনাক্ত করে এবং এটিকে ইউনিকোড ফর্ম্যাটিং অক্ষরগুলিতে মোড়ানো হয় যা সেই দিকটি ঘোষণা করে।

নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে unicodeWrap() ব্যবহার করতে হয়:

কোটলিন

val mySuggestion = "15 Bay Street, Laurel, CA"
val myBidiFormatter: BidiFormatter = BidiFormatter.getInstance()

// The "did_you_mean" localized string resource includes
// a "%s" placeholder for the suggestion.
String.format(getString(R.string.did_you_mean), myBidiFormatter.unicodeWrap(mySuggestion))

জাভা

String mySuggestion = "15 Bay Street, Laurel, CA";
BidiFormatter myBidiFormatter = BidiFormatter.getInstance();

// The "did_you_mean" localized string resource includes
// a "%s" placeholder for the suggestion.
String.format(getString(R.string.did_you_mean),
        myBidiFormatter.unicodeWrap(mySuggestion));

কারণ "15" এখন পাঠ্যের ভিতরে প্রদর্শিত হয় যা LTR হিসাবে ঘোষণা করা হয়েছে, এটি সঠিক অবস্থানে প্রদর্শিত হয়:

האם התכוונת ל 15 বে স্ট্রিট, লরেল, CA ?

নিম্নলিখিতগুলির মধ্যে একটি প্রযোজ্য হলে ব্যতীত আপনি একটি স্থানীয় বার্তায় যে পাঠ্য সন্নিবেশ করেন তার প্রতিটি অংশে unicodeWrap() পদ্ধতি ব্যবহার করুন:

  • পাঠ্যটি একটি মেশিন-পঠনযোগ্য স্ট্রিংয়ে ঢোকানো হচ্ছে, যেমন একটি URI বা একটি SQL ক্যোয়ারী৷
  • আপনি জানেন যে পাঠ্যের অংশটি ইতিমধ্যেই সঠিকভাবে মোড়ানো হয়েছে।

দ্রষ্টব্য: যদি আপনার অ্যাপটি Android 4.3 (API স্তর 18) বা উচ্চতরকে লক্ষ্য করে, তাহলে Android Framework-এ পাওয়া BidiFormatter এর সংস্করণটি ব্যবহার করুন। অন্যথায়, সাপোর্ট লাইব্রেরিতে পাওয়া BidiFormatter এর সংস্করণ ব্যবহার করুন।

ফরম্যাট নম্বর

আপনার অ্যাপের যুক্তিতে নম্বরগুলিকে স্ট্রিংয়ে রূপান্তর করতে ফর্ম্যাট স্ট্রিং ব্যবহার করুন, পদ্ধতি কল নয়:

কোটলিন

var myIntAsString = "$myInt"

জাভা

String myIntAsString = String.format("%d", myInt);

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

আপনি যখন String.format() ব্যবহার করেন এমন একটি ডিভাইসে একটি SQL কোয়েরি তৈরি করার জন্য যেটি একটি লোকেলে সেট করে যা নিজস্ব সংখ্যার সেট ব্যবহার করে, যেমন ফার্সি এবং বেশিরভাগ আরবি লোকেল, সমস্যা দেখা দেয় যদি কোয়েরির কোনো প্যারামিটার সংখ্যা হয়। এর কারণ হল সংখ্যাটি লোকেলের অঙ্কগুলিতে ফর্ম্যাট করা হয়েছে এবং এই সংখ্যাগুলি এসকিউএল-এ অবৈধ৷

ASCII-ফরম্যাট করা নম্বরগুলি সংরক্ষণ করতে এবং SQL ক্যোয়ারী বৈধ রাখতে, আপনাকে পরিবর্তে String.format() এর ওভারলোডেড সংস্করণ ব্যবহার করতে হবে যাতে প্রথম প্যারামিটার হিসাবে একটি লোকেল অন্তর্ভুক্ত থাকে। লোকেল আর্গুমেন্ট Locale.US ব্যবহার করুন।

সমর্থন লেআউট মিররিং

যারা RTL স্ক্রিপ্ট ব্যবহার করে তারা একটি RTL ব্যবহারকারী ইন্টারফেস পছন্দ করে, যার মধ্যে ডান-সারিবদ্ধ মেনু, ডান-সারিবদ্ধ পাঠ্য এবং বাম দিকে নির্দেশিত ফরোয়ার্ড তীর রয়েছে।

চিত্র 4 সেটিংস অ্যাপের মধ্যে একটি স্ক্রিনের LTR সংস্করণ এবং এর RTL প্রতিরূপের মধ্যে বৈসাদৃশ্য দেখায়:

বিজ্ঞপ্তির ক্ষেত্রটি উপরের-ডান কোণের কাছে ডান-সারিবদ্ধ, অ্যাপ বারে মেনু বোতামটি উপরের-বাম কোণের কাছে, স্ক্রিনের প্রধান অংশের সামগ্রীটি বাম-সারিবদ্ধ এবং LTR প্রদর্শিত হয় এবং পিছনের বোতামটি নীচে-বাম কোণের কাছাকাছি এবং বাম দিকে নির্দেশ করছে৷বিজ্ঞপ্তির ক্ষেত্রটি উপরের-বাম কোণের কাছে বাম-সারিবদ্ধ, অ্যাপ বারে মেনু বোতামটি উপরের-ডান কোণার কাছে, স্ক্রিনের প্রধান অংশের বিষয়বস্তু ডান-সারিবদ্ধ এবং RTL প্রদর্শিত হয় এবং পিছনের বোতামটি নীচে-ডান কোণের কাছে এবং ডানদিকে নির্দেশ করছে
চিত্র 4. একটি সেটিংস স্ক্রিনের LTR এবং RTL ভেরিয়েন্ট।

আপনার অ্যাপে আরটিএল সমর্থন যোগ করার সময়, নিম্নলিখিত বিষয়গুলি মনে রাখবেন:

  • RTL টেক্সট মিররিং শুধুমাত্র অ্যাপ্লিকেশানগুলিতে সমর্থিত যখন Android 4.2 (API স্তর 17) বা উচ্চতর চলমান ডিভাইসগুলিতে ব্যবহার করা হয়৷ কিভাবে পুরানো ডিভাইসে টেক্সট মিররিং সমর্থন করতে হয় তা শিখতে, এই গাইডে লিগ্যাসি অ্যাপের জন্য সমর্থন প্রদান দেখুন।
  • আপনার অ্যাপটি একটি RTL টেক্সট দিকনির্দেশ সমর্থন করে কিনা তা পরীক্ষা করতে, এই নির্দেশিকায় বর্ণিত ডেভেলপার বিকল্পগুলি ব্যবহার করে পরীক্ষা করুন এবং যারা RTL স্ক্রিপ্ট ব্যবহার করেন তাদের আপনার অ্যাপ ব্যবহার করার জন্য আমন্ত্রণ জানান।

দ্রষ্টব্য: লেআউট মিররিং সম্পর্কিত অতিরিক্ত নকশা নির্দেশিকা দেখতে, যে উপাদানগুলি আয়না করার জন্য উপযুক্ত এবং নয় তার তালিকা সহ, দ্বিমুখীতা উপাদান নকশা নির্দেশিকা দেখুন।

আপনার অ্যাপে UI লেআউটটি মিরর করতে যাতে এটি একটি RTL লোকেলে RTL প্রদর্শিত হয়, নিম্নলিখিত বিভাগগুলিতে পদক্ষেপগুলি সম্পূর্ণ করুন৷

বিল্ড এবং ম্যানিফেস্ট ফাইলগুলি পরিবর্তন করুন

আপনার অ্যাপ মডিউলের build.gradle ফাইল এবং অ্যাপ ম্যানিফেস্ট ফাইল নিম্নরূপ পরিবর্তন করুন:

build.gradle (Module: app)

গ্রোভি

android {
    ...
    defaultConfig {
        targetSdkVersion 17 // Or higher
        ...
    }
}

কোটলিন

android {
    ...
    defaultConfig {
        targetSdkVersion(17) // Or higher
        ...
    }
}

AndroidManifest.xml

<manifest ... >
    ...
    <application ...
        android:supportsRtl="true">
    </application>
</manifest>

দ্রষ্টব্য: যদি আপনার অ্যাপটি Android 4.1.1 (API লেভেল 16) বা তার নিচের দিকে লক্ষ্য করে, android:supportsRtl অ্যাট্রিবিউট উপেক্ষা করা হয়, সাথে আপনার অ্যাপের লেআউট ফাইলে উপস্থিত যেকোনও start এবং end অ্যাট্রিবিউট মানগুলিকে উপেক্ষা করা হয়। এই ক্ষেত্রে, RTL লেআউট মিররিং আপনার অ্যাপে স্বয়ংক্রিয়ভাবে ঘটবে না।

বিদ্যমান সম্পদ আপডেট করুন

আপনার বিদ্যমান লেআউট রিসোর্স ফাইলগুলিতে যথাক্রমে left এবং right start এবং end রূপান্তর করুন। এটি ফ্রেমওয়ার্কটিকে ব্যবহারকারীর ভাষা সেটিংসের উপর ভিত্তি করে আপনার অ্যাপের UI উপাদানগুলিকে সারিবদ্ধ করতে দেয়৷

দ্রষ্টব্য: আপনার সংস্থানগুলি আপডেট করার আগে, লিগ্যাসি অ্যাপ্লিকেশানগুলি বা Android 4.1.1 (API স্তর 16) এবং নিম্নতরকে লক্ষ্য করে এমন অ্যাপ্লিকেশানগুলির জন্য কীভাবে সহায়তা প্রদান করবেন তা শিখুন৷

ফ্রেমওয়ার্কের RTL প্রান্তিককরণ ক্ষমতাগুলি ব্যবহার করতে, আপনার লেআউট ফাইলগুলির বৈশিষ্ট্যগুলি পরিবর্তন করুন যা সারণী 1 এ প্রদর্শিত হয়৷

সারণী 1. যখন আপনার অ্যাপ একাধিক পাঠ্য নির্দেশ সমর্থন করে তখন ব্যবহার করার বৈশিষ্ট্যগুলি৷

শুধুমাত্র LTR সমর্থনকারী বৈশিষ্ট্য LTR এবং RTL সমর্থনকারী বৈশিষ্ট্য
android:gravity="left" android:gravity="start"
android:gravity="right" android:gravity="end"
android:layout_gravity="left" android:layout_gravity="start"
android:layout_gravity="right" android:layout_gravity="end"
android:paddingLeft android:paddingStart
android:paddingRight android:paddingEnd
android:drawableLeft android:drawableStart
android:drawableRight android:drawableEnd
android:layout_alignLeft android:layout_alignStart
android:layout_alignRight android:layout_alignEnd
android:layout_marginLeft android:layout_marginStart
android:layout_marginRight android:layout_marginEnd
android:layout_alignParentLeft android:layout_alignParentStart
android:layout_alignParentRight android:layout_alignParentEnd
android:layout_toLeftOf android:layout_toStartOf
android:layout_toRightOf android:layout_toEndOf

সারণী 2 দেখায় কিভাবে সিস্টেম টার্গেট SDK সংস্করণের উপর ভিত্তি করে UI সারিবদ্ধ বৈশিষ্ট্যগুলি পরিচালনা করে, left এবং right বৈশিষ্ট্যগুলি সংজ্ঞায়িত করা হয়েছে কিনা এবং start এবং end বৈশিষ্ট্যগুলি সংজ্ঞায়িত করা হয়েছে কিনা৷

সারণি 2. টার্গেট SDK সংস্করণ এবং সংজ্ঞায়িত বৈশিষ্ট্যের উপর ভিত্তি করে UI উপাদান প্রান্তিককরণ আচরণ

Android 4.2 টার্গেটিং
(API লেভেল 17) বা উচ্চতর?
বাম এবং ডান সংজ্ঞায়িত? শুরু এবং শেষ সংজ্ঞায়িত? ফলাফল
হ্যাঁ হ্যাঁ হ্যাঁ start এবং end ব্যবহার করা হয়, left এবং right ওভাররাইড করে
হ্যাঁ হ্যাঁ না left এবং right ব্যবহার করা হয়
হ্যাঁ না হ্যাঁ start এবং end ব্যবহার করা হয়
না হ্যাঁ হ্যাঁ left এবং right ব্যবহার করা হয় ( start এবং end উপেক্ষা করা হয়)
না হ্যাঁ না left এবং right ব্যবহার করা হয়
না না হ্যাঁ left এবং right start এবং end সংকল্প

দিকনির্দেশ- এবং ভাষা-নির্দিষ্ট সংস্থান যোগ করুন

এই ধাপে আপনার লেআউট, অঙ্কনযোগ্য এবং মান সম্পদ ফাইলের নির্দিষ্ট সংস্করণ যোগ করা জড়িত যা বিভিন্ন ভাষা এবং পাঠ্য দিকনির্দেশের জন্য কাস্টমাইজ করা মান ধারণ করে।

Android 4.2 (API স্তর 17) এবং উচ্চতর, আপনি -ldrtl (লেআউট-দিক-দিক-ডান-থেকে-বামে) এবং -ldltr (লেআউট-দিক-বাম-থেকে-ডান) রিসোর্স কোয়ালিফায়ারগুলি ব্যবহার করতে পারেন৷ বিদ্যমান সংস্থানগুলির সাথে পশ্চাৎপদ সামঞ্জস্য বজায় রাখতে, Android এর পুরানো সংস্করণগুলি সঠিক পাঠ্যের দিকনির্দেশ অনুমান করতে একটি সংস্থানের ভাষা যোগ্যতা ব্যবহার করে৷

ধরুন আপনি RTL স্ক্রিপ্ট সমর্থন করার জন্য একটি নির্দিষ্ট লেআউট ফাইল যোগ করতে চান, যেমন হিব্রু, আরবি এবং ফার্সি ভাষা। এটি করার জন্য, আপনার res/ ডিরেক্টরিতে একটি layout-ldrtl/ ডিরেক্টরি যোগ করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

res/
    layout/
        main.xml This layout file is loaded by default.
    layout-ldrtl/
        main.xml This layout file is loaded for languages using an
                 RTL text direction, including Arabic, Persian, and Hebrew.

আপনি যদি লেআউটের একটি নির্দিষ্ট সংস্করণ যোগ করতে চান যা শুধুমাত্র আরবি পাঠ্যের জন্য ডিজাইন করা হয়েছে, তাহলে আপনার ডিরেক্টরির কাঠামোটি নিচের মত দেখায়:

res/
    layout/
        main.xml This layout file is loaded by default.
    layout-ar/
        main.xml This layout file is loaded for Arabic text.
    layout-ldrtl/
        main.xml This layout file is loaded only for non-Arabic
                 languages that use an RTL text direction.

দ্রষ্টব্য: ভাষা-নির্দিষ্ট সংস্থানগুলি বিন্যাস-নির্দেশ-নির্দিষ্ট সংস্থানগুলির উপর অগ্রাধিকার নেয়, যা ডিফল্ট সংস্থানগুলির উপর অগ্রাধিকার নেয়৷

সমর্থিত উইজেট ব্যবহার করুন

Android 4.2 (API স্তর 17) অনুসারে, বেশিরভাগ ফ্রেমওয়ার্ক UI উপাদানগুলি স্বয়ংক্রিয়ভাবে RTL পাঠ্য দিকনির্দেশ সমর্থন করে। যাইহোক, বেশ কিছু ফ্রেমওয়ার্ক উপাদান, যেমন ViewPager , RTL পাঠ্য দিকনির্দেশ সমর্থন করে না।

হোম-স্ক্রীন উইজেটগুলি RTL পাঠ্য দিকনির্দেশকে সমর্থন করে যতক্ষণ না তাদের সংশ্লিষ্ট ম্যানিফেস্ট ফাইলগুলিতে অ্যাট্রিবিউট অ্যাসাইনমেন্ট android:supportsRtl="true" অন্তর্ভুক্ত থাকে।

লিগ্যাসি অ্যাপের জন্য সমর্থন প্রদান করুন

যদি আপনার অ্যাপটি Android 4.1.1 (API লেভেল 16) বা তার নিচের দিকে লক্ষ্য করে, তাহলে start এবং end পাশাপাশি left এবং right বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করুন।

আপনার লেআউটে RTL পাঠ্য দিকনির্দেশ ব্যবহার করা প্রয়োজন কিনা তা পরীক্ষা করতে, নিম্নলিখিত যুক্তিটি ব্যবহার করুন:

কোটলিন

private fun shouldUseLayoutRtl(): Boolean {
    return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
        View.LAYOUT_DIRECTION_RTL == layoutDirection
    } else {
        false
    }
}

জাভা

private boolean shouldUseLayoutRtl() {
    if (android.os.Build.VERSION.SDK_INT >=
            android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
        return View.LAYOUT_DIRECTION_RTL == getLayoutDirection();
    } else {
        return false;
    }
}

দ্রষ্টব্য: সামঞ্জস্যের সমস্যা এড়াতে, Android SDK বিল্ড টুলের 23.0.1 বা উচ্চতর সংস্করণ ব্যবহার করুন।

বিকাশকারী বিকল্পগুলি ব্যবহার করে পরীক্ষা করুন

Android 4.4 (API স্তর 19) বা উচ্চতর চলমান ডিভাইসগুলিতে, আপনি অন-ডিভাইস বিকাশকারী বিকল্পগুলিতে ফোর্স RTL লেআউট দিকনির্দেশ সক্ষম করতে পারেন৷ এই সেটিং আপনাকে RTL মোডে LTR স্ক্রিপ্ট, যেমন ইংরেজি পাঠ্য ব্যবহার করে এমন পাঠ্য দেখতে দেয়।

অ্যাপ লজিক আপডেট করুন

এই বিভাগটি একাধিক পাঠ্য দিকনির্দেশ পরিচালনার জন্য আপনার অ্যাপকে অভিযোজিত করার সময় আপডেট করার জন্য আপনার অ্যাপের যুক্তির নির্দিষ্ট দিকগুলি বর্ণনা করে।

সম্পত্তি পরিবর্তন

যেকোন RTL-সম্পর্কিত সম্পত্তির পরিবর্তন পরিচালনা করতে - যেমন লেআউট দিক, লেআউট প্যারামিটার, প্যাডিং, টেক্সট দিকনির্দেশ, টেক্সট সারিবদ্ধকরণ, বা অঙ্কনযোগ্য অবস্থান - onRtlPropertiesChanged() কলব্যাক ব্যবহার করুন। এই কলব্যাক আপনাকে বর্তমান লেআউট দিকনির্দেশ পেতে এবং সেই অনুযায়ী একটি কার্যকলাপের View অবজেক্ট আপডেট করতে দেয়।

ভিউ

আপনি যদি একটি UI উইজেট তৈরি করেন যা সরাসরি একটি কার্যকলাপের ভিউ হায়ারার্কির অংশ নয়, যেমন একটি ডায়ালগ বা টোস্ট-এর মতো UI উপাদান, তাহলে প্রেক্ষাপটের উপর নির্ভর করে সঠিক লেআউট দিক নির্ধারণ করুন। নিম্নলিখিত কোড স্নিপেট এই প্রক্রিয়াটি কিভাবে সম্পূর্ণ করতে হয় তা প্রদর্শন করে:

কোটলিন

val config: Configuration = context.resources.configuration
view.layoutDirection = config.layoutDirection

জাভা

final Configuration config =
    getContext().getResources().getConfiguration();
view.setLayoutDirection(config.getLayoutDirection());

View ক্লাসের বেশ কয়েকটি পদ্ধতির অতিরিক্ত বিবেচনার প্রয়োজন:

onMeasure()
পাঠ্যের দিকনির্দেশের উপর নির্ভর করে দেখুন পরিমাপ পরিবর্তিত হতে পারে।
onLayout()
আপনি যদি নিজের লেআউট বাস্তবায়ন তৈরি করেন, তাহলে আপনাকে আপনার onLayout() সংস্করণে super() কল করতে হবে এবং RTL স্ক্রিপ্ট সমর্থন করার জন্য আপনার কাস্টম লজিক মানিয়ে নিতে হবে।
onDraw()
আপনি যদি একটি কাস্টম ভিউ প্রয়োগ করেন বা একটি অঙ্কনে উন্নত কার্যকারিতা যোগ করেন, তাহলে আপনাকে RTL স্ক্রিপ্ট সমর্থন করার জন্য আপনার কোড আপডেট করতে হবে৷ আপনার উইজেটটি আরটিএল মোডে আছে কিনা তা নির্ধারণ করতে নিম্নলিখিত কোডটি ব্যবহার করুন:

কোটলিন

// On devices running Android 4.1.1 (API level 16) and lower,
// you can call the isLayoutRtl() system method directly.
fun isLayoutRtl(): Boolean = layoutDirection == LAYOUT_DIRECTION_RTL

জাভা

// On devices running Android 4.1.1 (API level 16) and lower,
// you can call the isLayoutRtl() system method directly.
public boolean isLayoutRtl() {
    return (getLayoutDirection() == LAYOUT_DIRECTION_RTL);
}

অঙ্কনযোগ্য

আপনার যদি RTL লেআউটের জন্য মিরর করা প্রয়োজন এমন একটি অঙ্কনযোগ্য থাকে, তাহলে ডিভাইসে চলমান Android এর সংস্করণের উপর ভিত্তি করে এই ধাপগুলির একটি সম্পূর্ণ করুন:

  • Android 4.3 (API লেভেল 18) এবং তার নিচের ডিভাইসে চলমান ডিভাইসগুলিতে -ldrtl রিসোর্স ফাইল যোগ করুন এবং সংজ্ঞায়িত করুন।
  • অ্যান্ড্রয়েড 4.4 (API লেভেল 19) এবং উচ্চতর, আপনার আঁকারযোগ্য সংজ্ঞায়িত করার সময় android:autoMirrored="true" ব্যবহার করুন, যা সিস্টেমকে আপনার জন্য RTL লেআউট মিররিং পরিচালনা করতে দেয়।

    দ্রষ্টব্য: android:autoMirrored অ্যাট্রিবিউট শুধুমাত্র সাধারণ অঙ্কনযোগ্যগুলির জন্য কাজ করে যার দ্বিমুখী মিররিং সম্পূর্ণ অঙ্কনযোগ্য গ্রাফিকাল মিররিং। যদি আপনার অঙ্কনে একাধিক উপাদান থাকে, অথবা যদি আপনার অঙ্কনযোগ্য প্রতিফলিত করে তার ব্যাখ্যা পরিবর্তন করে, আপনি নিজেই মিররিং করতে পারেন। যখনই সম্ভব, আপনার মিরর করা অঙ্কনগুলি ব্যবহারকারীদের কাছে অর্থবহ কিনা তা নির্ধারণ করতে দ্বিমুখী বিশেষজ্ঞের সাথে পরীক্ষা করুন৷

মহাকর্ষ

যদি আপনার অ্যাপের লেআউট কোড Gravity.LEFT বা Gravity.RIGHT ব্যবহার করে, তাহলে এই মানগুলিকে যথাক্রমে Gravity.START এবং Gravity.END তে পরিবর্তন করুন৷

আপনার যদি কোটলিন বা জাভা কোড থাকে যা Gravity.LEFT বা Gravity.RIGHT বৈশিষ্ট্যের উপর নির্ভর করে, তাহলে আপনি layoutDirection সাথে মিল করার জন্য absoluteGravity সেট করে এই পরিবর্তনের সাথে কাজ করার জন্য এটিকে মানিয়ে নিতে পারেন।

উদাহরণস্বরূপ, যদি আপনি নিম্নলিখিত কোড ব্যবহার করছেন:

কোটলিন

when (gravity and Gravity.HORIZONTAL_GRAVITY_MASK) {
    Gravity.LEFT -> {
        // Handle objects that are left-aligned.
    }
    Gravity.RIGHT -> {
        // Handle objects that are right-aligned.
    }
}

জাভা

switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
    case Gravity.LEFT:
        // Handle objects that are left-aligned.
        break;
    case Gravity.RIGHT:
        // Handle objects that are right-aligned.
        break;
}

এটিকে নিম্নলিখিতগুলিতে পরিবর্তন করুন:

কোটলিন

val absoluteGravity: Int = Gravity.getAbsoluteGravity(gravity, layoutDirection)
when (absoluteGravity and Gravity.HORIZONTAL_GRAVITY_MASK) {
    Gravity.LEFT -> {
        // Handle objects that are left-aligned.
    }
    Gravity.RIGHT -> {
        // Handle objects that are right-aligned.
    }
}

জাভা

final int layoutDirection = getLayoutDirection();
final int absoluteGravity =
        Gravity.getAbsoluteGravity(gravity, layoutDirection);
switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
    case Gravity.LEFT:
        // Handle objects that are left-aligned.
        break;
    case Gravity.RIGHT:
        // Handle objects that are right-aligned.
        break;
}

এর মানে হল আপনি আপনার বিদ্যমান কোড রাখতে পারেন যা বাম-সারিবদ্ধ এবং ডান-সারিবদ্ধ মানগুলি পরিচালনা করে, এমনকি যদি আপনি আপনার মাধ্যাকর্ষণ মানগুলির জন্য start এবং end ব্যবহার করেন।

দ্রষ্টব্য: আপনার মাধ্যাকর্ষণ সেটিংস প্রয়োগ করার সময়, Gravity.apply() এর একটি ওভারলোডেড সংস্করণ ব্যবহার করুন যাতে একটি layoutDirection আর্গুমেন্ট অন্তর্ভুক্ত থাকে।

মার্জিন এবং প্যাডিং

আপনার অ্যাপে RTL স্ক্রিপ্ট সমর্থন করতে, মার্জিন এবং প্যাডিং মান সম্পর্কিত এই সেরা অনুশীলনগুলি অনুসরণ করুন:

  • দিকনির্দেশ-নির্দিষ্ট বৈশিষ্ট্যের সমতুল্য leftMargin এবং rightMargin এর পরিবর্তে getMarginStart() এবং getMarginEnd() ব্যবহার করুন।
  • setMargins() ব্যবহার করার সময়, আপনার অ্যাপ যদি RTL স্ক্রিপ্ট সনাক্ত করে তাহলে left এবং right আর্গুমেন্টের মানগুলিকে অদলবদল করুন।
  • আপনার অ্যাপে কাস্টম প্যাডিং লজিক থাকলে, setPadding() এবং setPaddingRelative() ওভাররাইড করুন।

প্রতি-অ্যাপ ভাষা পছন্দ সমর্থন

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

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

    আপনার অ্যাপটিকে অবশ্যই তার ম্যানিফেস্টে android:localeConfig অ্যাট্রিবিউটটি ঘোষণা করতে হবে যাতে সিস্টেমটি একাধিক ভাষা সমর্থন করে। আরও জানতে, একটি রিসোর্স ফাইল তৈরি এবং আপনার অ্যাপের ম্যানিফেস্ট ফাইলে ঘোষণা করার নির্দেশাবলী দেখুন।

  • অতিরিক্ত API : এই সর্বজনীন APIগুলি, যেমন l10n-placeholder1 "> setApplicationLocales() এবং l10n-placeholder2 "> getApplicationLocales() পদ্ধতিগুলি LocaleManager এ, অ্যাপগুলিকে রানটাইমে সিস্টেমের ভাষা থেকে একটি ভিন্ন ভাষা সেট করতে দিন৷

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

    পূর্ববর্তী অ্যান্ড্রয়েড সংস্করণগুলির সাথে পিছিয়ে থাকা সামঞ্জস্যের জন্য, সমতুল্য APIগুলিও AndroidX-এ উপলব্ধ। আমরা Appcompat 1.6.0-beta01 বা উচ্চতর ব্যবহার করার পরামর্শ দিই।

    আরও জানতে, নতুন APIs বাস্তবায়নের নির্দেশাবলী দেখুন।

আরো দেখুন

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

পুরানো ডিভাইসগুলিকে সমর্থন করার বিষয়ে আরও জানতে, নিম্নলিখিত সংস্থানগুলি দেখুন:

ব্লগ এর লেখাগুলো