অ্যান্ড্রয়েড অনেক অঞ্চলের অনেক ডিভাইসে চলে। সর্বাধিক সংখ্যক ব্যবহারকারীর কাছে পৌঁছানোর জন্য, নিশ্চিত করুন যে আপনার অ্যাপটি যে অঞ্চলে ব্যবহৃত হচ্ছে, সেখানকার উপযোগী উপায়ে টেক্সট, অডিও ফাইল, সংখ্যা, মুদ্রা এবং গ্রাফিক্স পরিচালনা করে।
এই পৃষ্ঠায় অ্যান্ড্রয়েড অ্যাপ স্থানীয়করণ করার সর্বোত্তম পদ্ধতি বর্ণনা করা হয়েছে।
আপনার কোটলিন সম্পর্কে কার্যকরী জ্ঞান থাকতে হবে এবং অ্যান্ড্রয়েড রিসোর্স লোডিং , অ্যাক্টিভিটি লাইফসাইকেলের মতো ডেভেলপমেন্ট সংক্রান্ত বিষয়সমূহ, এবং আন্তর্জাতিকীকরণ ও স্থানীয়করণের সাধারণ নীতিগুলির সাথে পরিচিতি থাকতে হবে।
আপনার অ্যাপের স্থানীয়করণ করা অংশগুলোকে মূল কার্যকারিতা থেকে যথাসম্ভব আলাদা রাখতে অ্যান্ড্রয়েড রিসোর্স ফ্রেমওয়ার্ক ব্যবহার করা একটি ভালো অভ্যাস।
- এই পৃষ্ঠায় এবং 'অ্যাপ রিসোর্স ওভারভিউ'- তে বর্ণিত পদ্ধতি অনুযায়ী আপনার অ্যাপের ইউজার ইন্টারফেসের অধিকাংশ বা সমস্ত বিষয়বস্তু রিসোর্স ফাইলে রাখুন।
- অন্যদিকে, ইউজার ইন্টারফেসের আচরণ আপনার কোটলিন-ভিত্তিক কোড দ্বারা চালিত হয়। উদাহরণস্বরূপ, যদি ব্যবহারকারীরা এমন ডেটা ইনপুট করে যা লোকেল (locale) অনুযায়ী ভিন্নভাবে ফরম্যাট বা সর্ট করার প্রয়োজন হয়, তাহলে আপনি প্রোগ্রাম্যাটিকভাবে ডেটাটি পরিচালনা করার জন্য কোটলিন ব্যবহার করেন। এই পৃষ্ঠায় আপনার কোটলিন-ভিত্তিক কোডকে কীভাবে স্থানীয়করণ করবেন তা আলোচনা করা হয়নি।
এই নির্দেশিকাটি সমস্ত অ্যান্ড্রয়েড অ্যাপে ব্যবহৃত মূল অ্যান্ড্রয়েড স্থানীয়করণ সিস্টেম নিয়ে আলোচনা করে। আপনার Jetpack Compose UI-তে এই স্থানীয়কৃত রিসোর্সগুলি কীভাবে লোড করবেন তা জানতে, “Resources in Compose” দেখুন।
আপনার অ্যাপে স্ট্রিং স্থানীয়করণ করার একটি সংক্ষিপ্ত নির্দেশিকার জন্য, ‘বিভিন্ন ভাষা ও সংস্কৃতি সমর্থন করুন’ দেখুন।
সংক্ষিপ্ত বিবরণ: অ্যান্ড্রয়েডে রিসোর্স স্যুইচিং
রিসোর্স হলো টেক্সট স্ট্রিং, সাউন্ড, গ্রাফিক্স এবং অন্য যেকোনো স্ট্যাটিক ডেটা যা আপনার অ্যান্ড্রয়েড অ্যাপের প্রয়োজন। একটি অ্যাপে একাধিক রিসোর্স সেট থাকতে পারে, যার প্রতিটি ভিন্ন ভিন্ন ডিভাইস কনফিগারেশনের জন্য কাস্টমাইজ করা থাকে। যখন কোনো ব্যবহারকারী অ্যাপটি চালান, অ্যান্ড্রয়েড স্বয়ংক্রিয়ভাবে সেই রিসোর্সগুলো নির্বাচন করে লোড করে যা ডিভাইসটির সাথে সবচেয়ে ভালোভাবে মেলে।
এই পৃষ্ঠাটি স্থানীয়করণ এবং লোকেল-এর উপর আলোকপাত করে। রিসোর্স-সুইচিং এবং স্ক্রিন ওরিয়েন্টেশন বা টাচস্ক্রিন টাইপের মতো আপনি নির্দিষ্ট করতে পারেন এমন সমস্ত ধরণের কনফিগারেশনের সম্পূর্ণ বিবরণের জন্য, "বিকল্প রিসোর্স সরবরাহ করুন" দেখুন।
যখন আপনি আপনার অ্যাপ লেখেন, তখন অ্যাপের ব্যবহারের জন্য আপনি ডিফল্ট এবং বিকল্প রিসোর্স তৈরি করেন। ব্যবহারকারীরা যখন আপনার অ্যাপ চালান, তখন অ্যান্ড্রয়েড সিস্টেম ডিভাইসের লোকেলের উপর ভিত্তি করে কোন রিসোর্সগুলো লোড করবে তা নির্বাচন করে। রিসোর্স তৈরি করার জন্য, আপনাকে প্রজেক্টের res/ ডিরেক্টরির বিশেষ নামযুক্ত সাবডিরেক্টরিগুলোর মধ্যে ফাইল রাখতে হয়।
ডিফল্ট রিসোর্স কেন গুরুত্বপূর্ণ
যখন অ্যাপটি এমন কোনো লোকেলে চলে যার জন্য আপনি লোকেল-নির্দিষ্ট টেক্সট প্রদান করেননি, তখন অ্যান্ড্রয়েড res/values/strings.xml থেকে ডিফল্ট স্ট্রিংগুলো লোড করে। যদি এই ডিফল্ট ফাইলটি অনুপস্থিত থাকে, অথবা আপনার অ্যাপের প্রয়োজনীয় কোনো স্ট্রিং এতে না থাকে, তাহলে আপনার অ্যাপটি চলে না এবং একটি এরর দেখায়। ডিফল্ট টেক্সট ফাইলটি অসম্পূর্ণ থাকলে কী হতে পারে, তা নিচের উদাহরণটিতে দেখানো হয়েছে।
উদাহরণ:
একটি অ্যাপের কোটলিন-ভিত্তিক কোডে শুধুমাত্র দুটি স্ট্রিং, text_a এবং text_b এর উল্লেখ রয়েছে। অ্যাপটিতে একটি স্থানীয় রিসোর্স ফাইল ( res/values-en/strings.xml ) অন্তর্ভুক্ত আছে, যা text_a এবং text_b ইংরেজিতে সংজ্ঞায়িত করে। অ্যাপটিতে একটি ডিফল্ট রিসোর্স ফাইলও ( res/values/strings.xml ) রয়েছে, যাতে text_a এর সংজ্ঞা থাকলেও text_b এর কোনো সংজ্ঞা নেই।
- যে ডিভাইসের লোকেল ইংরেজিতে সেট করা আছে, সেখানে এই অ্যাপটি চালু করলে এটি কোনো সমস্যা ছাড়াই চলতে পারে, কারণ
res/values-en/strings.xmlপ্রয়োজনীয় দুটি টেক্সট স্ট্রিংই রয়েছে। - তবে, ইংরেজি ছাড়া অন্য কোনো ভাষায় সেট করা ডিভাইসে এই অ্যাপটি চালু করলে, ব্যবহারকারী একটি ত্রুটির বার্তা এবং একটি ‘ফোর্স ক্লোজ’ বাটন দেখতে পান। অ্যাপটি লোড হয় না।
এই পরিস্থিতি এড়ানোর জন্য, নিশ্চিত করুন যে একটি res/values/strings.xml ফাইল বিদ্যমান আছে এবং এতে প্রতিটি প্রয়োজনীয় স্ট্রিং সংজ্ঞায়িত করা আছে। এই পরিস্থিতি শুধু স্ট্রিং-এর ক্ষেত্রেই নয়, সব ধরনের রিসোর্সের ক্ষেত্রেই প্রযোজ্য: আপনাকে এক সেট ডিফল্ট রিসোর্স ফাইল তৈরি করতে হবে, যেগুলোতে আপনার অ্যাপের ব্যবহৃত সমস্ত রিসোর্স, যেমন ড্রয়েবল, ফন্ট বা কালার, অন্তর্ভুক্ত থাকবে। টেস্টিং সম্পর্কে তথ্যের জন্য, ‘ডিফল্ট রিসোর্সের জন্য পরীক্ষা’ (Test for default resources) বিভাগটি দেখুন।
স্থানীয়করণের জন্য সম্পদ ব্যবহার করুন
এই অংশে ডিফল্ট রিসোর্স এবং বিকল্প রিসোর্স কীভাবে তৈরি করতে হয় তা আলোচনা করা হয়েছে। এছাড়াও, রিসোর্সগুলোকে কীভাবে অগ্রাধিকার দেওয়া হয় এবং কোডে কীভাবে আপনার রিসোর্সগুলোকে উল্লেখ করতে হয়, তাও ব্যাখ্যা করা হয়েছে।
ডিফল্ট রিসোর্স তৈরি করুন
অ্যাপটির ডিফল্ট টেক্সট res/values/strings.xml ফাইলে রাখুন। এই স্ট্রিংগুলোর জন্য ডিফল্ট ভাষা ব্যবহার করুন—অর্থাৎ, আপনার অ্যাপের অধিকাংশ ব্যবহারকারী যে ভাষায় কথা বলবেন বলে আপনি আশা করেন।
ডিফল্ট রিসোর্স সেটে যেকোনো ডিফল্ট ড্রয়েবল অন্তর্ভুক্ত থাকে এবং এতে আইকন বা স্ট্রিং-এর মতো অন্যান্য ধরনের রিসোর্সও থাকতে পারে। এই রিসোর্সগুলো নিম্নলিখিত ডিরেক্টরিগুলোতে রাখা হয়:
-
res/drawable/: গুগল প্লে-তে অ্যাপটির আইকনের জন্য প্রয়োজনীয় ডিরেক্টরি, যেখানে অন্তত একটি গ্রাফিক ফাইল থাকবে। -
res/xml/: যদি আপনার কোনোres/xml- <qualifiers>ফোল্ডার থাকে তবে এটি আবশ্যক। -
res/raw/: যদি আপনার কোনোres/raw- <qualifiers>ফোল্ডার থাকে তবে এটি আবশ্যক।
বিকল্প সংস্থান তৈরি করুন
একটি অ্যাপ স্থানীয়করণ করার একটি বড় অংশ হলো বিভিন্ন ভাষার জন্য বিকল্প টেক্সট প্রদান করা। কিছু ক্ষেত্রে, আপনাকে বিকল্প গ্রাফিক্স, সাউন্ড এবং অন্যান্য স্থানীয়-নির্দিষ্ট রিসোর্সও সরবরাহ করতে হয়।
একটি অ্যাপ একাধিক res/ <qualifiers> / ডিরেক্টরি নির্দিষ্ট করতে পারে, যার প্রতিটির জন্য আলাদা কোয়ালিফায়ার থাকে। ভিন্ন কোনো লোকেলের জন্য বিকল্প রিসোর্স তৈরি করতে, আপনাকে এমন একটি কোয়ালিফায়ার ব্যবহার করতে হবে যা কোনো ভাষা বা ভাষা-অঞ্চলের সমন্বয় নির্দিষ্ট করে। একটি রিসোর্স ডিরেক্টরির নাম অবশ্যই 'বিকল্প রিসোর্স সরবরাহ করুন' অংশে বর্ণিত নামকরণের নিয়ম মেনে চলতে হবে, অন্যথায় আপনার অ্যাপ কম্পাইল করা যাবে না।
উদাহরণ:
ধরা যাক, আপনার অ্যাপের ডিফল্ট ভাষা ইংরেজি এবং আপনি আপনার অ্যাপের সমস্ত লেখা ফরাসি ভাষায় এবং অ্যাপের শিরোনাম ছাড়া বাকি সমস্ত লেখা জাপানি ভাষায় স্থানীয়করণ করতে চান। এই ক্ষেত্রে, আপনাকে তিনটি strings.xml ফাইল তৈরি করতে হবে, যার প্রতিটি একটি লোকেল-নির্দিষ্ট রিসোর্স ডিরেক্টরিতে সংরক্ষিত থাকবে:
-
res/values/strings.xml
অ্যাপটি যে সমস্ত স্ট্রিং ব্যবহার করে, তার সবগুলোর ইংরেজি টেক্সট এতে রয়েছে, যার মধ্যেtitleনামের স্ট্রিংটির টেক্সটও অন্তর্ভুক্ত। -
res/values-fr/strings.xml
titleসহ সমস্ত স্ট্রিং-এর জন্য ফরাসি লেখা অন্তর্ভুক্ত করুন। -
res/values-ja/strings.xml
titleছাড়া বাকি সব স্ট্রিং-এ জাপানি লেখা থাকতে হবে।
আপনার কোটলিন-ভিত্তিক কোডে যদি R.string.title কে উল্লেখ করা হয়, তাহলে রানটাইমে যা ঘটে তা হলো:
- ডিভাইসটি ফরাসি ছাড়া অন্য কোনো ভাষায় সেট করা থাকলে, অ্যান্ড্রয়েড
res/values/strings.xmlফাইল থেকেtitleলোড করে। - ডিভাইসটি ফরাসি ভাষায় সেট করা থাকলে, অ্যান্ড্রয়েড
res/values-fr/strings.xmlফাইল থেকেtitleলোড করে।
ডিভাইসটি জাপানি ভাষায় সেট করা থাকলে, অ্যান্ড্রয়েড res/values-ja/strings.xml ফাইলে title খোঁজে। কিন্তু সেই ফাইলে এই ধরনের কোনো স্ট্রিং অন্তর্ভুক্ত না থাকায়, অ্যান্ড্রয়েড ডিফল্ট পদ্ধতিতে ফিরে যায় এবং res/values/strings.xml ফাইল থেকে ইংরেজিতে title লোড করে।
কোন সম্পদগুলো অগ্রাধিকার পায়?
যদি কোনো ডিভাইসের কনফিগারেশনের সাথে একাধিক রিসোর্স ফাইল মিলে যায়, তবে কোন ফাইলটি ব্যবহার করা হবে তা নির্ধারণ করার জন্য অ্যান্ড্রয়েড কিছু নির্দিষ্ট নিয়ম অনুসরণ করে। রিসোর্স ডিরেক্টরির নামে যে সমস্ত নির্দেশক উল্লেখ করা যায়, সেগুলোর মধ্যে লোকেল (locale) প্রায় সবসময়ই অগ্রাধিকার পায়।
উদাহরণ:
ধরে নিন যে একটি অ্যাপে ডিফল্ট গ্রাফিক্সের একটি সেট এবং আরও দুটি গ্রাফিক্সের সেট রয়েছে, যার প্রতিটি ভিন্ন ভিন্ন ডিভাইস সেটআপের জন্য অপ্টিমাইজ করা হয়েছে:
-
res/drawable/
ডিফল্ট গ্রাফিক্স রয়েছে। -
res/drawable-small-land-stylus/
এতে এমন গ্রাফিক্স রয়েছে যা স্টাইলাস-ভিত্তিক ইনপুট গ্রহণকারী এবং ল্যান্ডস্কেপ ওরিয়েন্টেশনে থাকা QVGA লো-ডেনসিটি স্ক্রিনযুক্ত ডিভাইসের সাথে ব্যবহারের জন্য অপ্টিমাইজ করা হয়েছে। -
res/drawable-ja/
জাপানি ভাষার ব্যবহারের জন্য অপ্টিমাইজ করা গ্রাফিক্স রয়েছে।
অ্যাপটি যদি জাপানি ভাষা ব্যবহারের জন্য কনফিগার করা কোনো ডিভাইসে চলে, তাহলে অ্যান্ড্রয়েড res/drawable-ja/ থেকে গ্রাফিক্স লোড করে, এমনকি যদি ডিভাইসটি স্টাইলাস দ্বারা ইনপুট গ্রহণ করে এবং ল্যান্ডস্কেপ ওরিয়েন্টেশনে থাকা QVGA লো-ডেনসিটি স্ক্রিনেরও হয়।
ব্যতিক্রম: নির্বাচন প্রক্রিয়ায় লোকেলের চেয়ে শুধুমাত্র মোবাইল কান্ট্রি কোড (MCC) এবং মোবাইল নেটওয়ার্ক কোড (MNC) অগ্রাধিকার পায়।
উদাহরণ:
ধরে নিন আপনার নিম্নলিখিত পরিস্থিতিটি রয়েছে:
- অ্যাপ কোডে
R.string.text_aব্যবহার করার কথা বলা হয়েছে। - দুটি প্রাসঙ্গিক রিসোর্স ফাইল উপলব্ধ আছে:
-
res/values-mcc404/strings.xml, যেখানে অ্যাপটির ডিফল্ট ভাষা, এই ক্ষেত্রে ইংরেজি, ব্যবহার করেtext_aঅন্তর্ভুক্ত করা হয়েছে। -
res/values-hi/strings.xml, যেখানে হিন্দিতেtext_aঅন্তর্ভুক্ত আছে।
-
- অ্যাপটি এমন একটি ডিভাইসে চলছে যার কনফিগারেশন নিম্নরূপ:
- সিম কার্ডটি ভারতের একটি মোবাইল নেটওয়ার্কের (এমসিসি ৪০৪) সাথে সংযুক্ত।
- ভাষাটি হিন্দিতে (
hi) সেট করা আছে।
ডিভাইসটি হিন্দিতে কনফিগার করা থাকলেও অ্যান্ড্রয়েড res/values-mcc404/strings.xml থেকে text_a (ইংরেজিতে) লোড করে। এর কারণ হলো, রিসোর্স-নির্বাচন প্রক্রিয়ায় অ্যান্ড্রয়েড ভাষার মিলের চেয়ে MCC-এর মিলকে বেশি প্রাধান্য দেয়।
নির্বাচন প্রক্রিয়াটি সবসময় এই উদাহরণগুলোর মতো এতটা সহজ-সরল নয়। প্রক্রিয়াটির আরও বিশদ বিবরণের জন্য, ‘অ্যান্ড্রয়েড কীভাবে সবচেয়ে উপযুক্ত রিসোর্স খুঁজে বের করে ’ দেখুন। সমস্ত কোয়ালিফায়ারগুলো ‘অ্যাপ রিসোর্স ওভারভিউ’ -তে বর্ণনা করা হয়েছে এবং অগ্রাধিকারের ক্রমানুসারে তালিকাভুক্ত করা হয়েছে।
কোডে থাকা রিসোর্সগুলো দেখুন
আপনার অ্যাপের কোটলিন-ভিত্তিক কোডে, আপনি R. resource_type . resource_name অথবা android.R. resource_type . resource_name সিনট্যাক্স ব্যবহার করে রিসোর্স উল্লেখ করেন । আরও তথ্যের জন্য, আপনার অ্যাপের রিসোর্স অ্যাক্সেস করুন (Access your app resources ) দেখুন।
স্থানীয়করণের জন্য স্ট্রিংগুলি পরিচালনা করুন
এই বিভাগে আপনার স্থানীয়করণ-সম্পর্কিত স্ট্রিংগুলি পরিচালনা করার সর্বোত্তম পদ্ধতি বর্ণনা করা হয়েছে।
সমস্ত স্ট্রিং strings.xml-এ স্থানান্তর করুন।
আপনার অ্যাপ তৈরি করার সময় কোনো স্ট্রিং হার্ডকোড করবেন না। এর পরিবর্তে, আপনার সমস্ত স্ট্রিংকে একটি ডিফল্ট strings.xml ফাইলে রিসোর্স হিসেবে ঘোষণা করুন, যা সেগুলোকে আপডেট এবং স্থানীয়করণ করা সহজ করে তোলে। strings.xml ফাইলের স্ট্রিংগুলো কম্পাইল করা কোডে কোনো পরিবর্তন ছাড়াই সহজেই বের করে আনা, অনুবাদ করা এবং উপযুক্ত কোয়ালিফায়ারসহ আপনার অ্যাপে পুনরায় যুক্ত করা যায়।
উদাহরণস্বরূপ, Compose ব্যবহার করে আপনি এইভাবে একটি স্ট্রিং লোড করতে পারেন:
// In the res/values/strings.xml file // <string name="compose">Jetpack Compose</string> // In your Compose code Text( text = stringResource(R.string.compose) )
যদি আপনি টেক্সট সহ ছবি তৈরি করেন, তাহলে সেই স্ট্রিংগুলোও strings.xml এ রাখুন এবং অনুবাদের পর ছবিগুলো পুনরায় তৈরি করুন।
UI স্ট্রিংগুলির জন্য অ্যান্ড্রয়েড নির্দেশিকা অনুসরণ করুন
আপনার UI ডিজাইন ও ডেভেলপ করার সময়, আপনি ব্যবহারকারীর সাথে কীভাবে কথা বলছেন সেদিকে বিশেষভাবে মনোযোগ দিন। সাধারণভাবে, একটি সংক্ষিপ্ত ও বন্ধুত্বপূর্ণ শৈলী ব্যবহার করুন এবং আপনার UI জুড়ে একটি সামঞ্জস্যপূর্ণ শৈলী বজায় রাখুন।
লেখার ধরণ এবং শব্দচয়নের জন্য ম্যাটেরিয়াল ডিজাইনের সুপারিশগুলো অবশ্যই পড়ুন এবং অনুসরণ করুন। এটি করলে আপনার অ্যাপগুলো ব্যবহারকারীর কাছে আরও পরিশীলিত মনে হবে এবং ব্যবহারকারীরা আপনার ইউআই (UI) আরও দ্রুত বুঝতে পারবে।
এছাড়াও, যেখানে সম্ভব সর্বদা অ্যান্ড্রয়েডের প্রমিত পরিভাষা ব্যবহার করুন, যেমন অ্যাপ বার, অপশন মেনু, সিস্টেম বার এবং নোটিফিকেশনের মতো UI উপাদানগুলোর জন্য। অ্যান্ড্রয়েডের পরিভাষা সঠিকভাবে এবং ধারাবাহিকভাবে ব্যবহার করলে অনুবাদ সহজ হয় এবং ব্যবহারকারীদের জন্য একটি উন্নততর চূড়ান্ত ফলাফল পাওয়া যায়।
ঘোষিত স্ট্রিংগুলির জন্য পর্যাপ্ত প্রেক্ষাপট প্রদান করুন।
আপনার strings.xml ফাইলে স্ট্রিং ঘোষণা করার সময়, স্ট্রিংটি কোন প্রেক্ষাপটে ব্যবহৃত হচ্ছে তা অবশ্যই বর্ণনা করুন। এই তথ্য অনুবাদকের জন্য অত্যন্ত মূল্যবান এবং এর ফলে উন্নত মানের অনুবাদ পাওয়া যায়। এটি আপনাকে আপনার স্ট্রিংগুলো আরও কার্যকরভাবে পরিচালনা করতেও সাহায্য করে।
এখানে একটি উদাহরণ দেওয়া হলো:
<!-- The action for submitting a form. This text is on a button that can fit 30 chars --> <string name="login_submit_button">Sign in</string>
নিম্নলিখিতের মতো প্রাসঙ্গিক তথ্য প্রদান করার কথা বিবেচনা করুন:
- এই স্ট্রিংটি কীসের জন্য? এটি কখন এবং কোথায় ব্যবহারকারীর সামনে উপস্থাপন করা হয়?
- UI-তে এটি কোথায় আছে? উদাহরণস্বরূপ, টেক্সট বক্সের তুলনায় বাটনে অনুবাদ কম নমনীয়।
বার্তার যে অংশগুলো অনুবাদ করা হবে না, সেগুলো চিহ্নিত করুন।
প্রায়শই স্ট্রিং-এ এমন টেক্সট থাকে যা অন্য ভাষায় অনুবাদ করার জন্য নয়। এর সাধারণ উদাহরণ হলো কোডের একটি অংশ, কোনো মানের জন্য প্লেসহোল্ডার, একটি বিশেষ প্রতীক বা একটি নাম। অনুবাদের জন্য আপনার স্ট্রিং প্রস্তুত করার সময়, এমন টেক্সট খুঁজে বের করুন এবং চিহ্নিত করুন যা অনুবাদ ছাড়াই অপরিবর্তিত রাখতে হবে, যাতে অনুবাদক তা পরিবর্তন না করে।
যে টেক্সট অনুবাদ করা হবে না, তা চিহ্নিত করতে একটি <xliff:g> প্লেসহোল্ডার ট্যাগ ব্যবহার করুন। এখানে একটি উদাহরণ ট্যাগ দেওয়া হলো যা নির্দেশ করে যে, বার্তার অখণ্ডতা নষ্ট হওয়া এড়াতে অনুবাদের সময় "%1$s" লেখাটি পরিবর্তন করা হবে না:
<string name="countdown"> <xliff:g id="time" example="5 days">%1$s</xliff:g> until holiday </string>
যখন আপনি একটি প্লেসহোল্ডার ট্যাগ ঘোষণা করবেন, তখন একটি ID অ্যাট্রিবিউট যোগ করুন যা ব্যাখ্যা করে যে প্লেসহোল্ডারটি কীসের জন্য। যদি আপনার অ্যাপ পরবর্তীতে প্লেসহোল্ডারের মান প্রতিস্থাপন করে, তবে এর প্রত্যাশিত ব্যবহার স্পষ্ট করার জন্য একটি example অ্যাট্রিবিউট প্রদান করতে ভুলবেন না।
এখানে প্লেসহোল্ডার ট্যাগের আরও কিছু উদাহরণ দেওয়া হলো:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- Example placeholder for a special Unicode symbol --> <string name="star_rating">Check out our 5 <xliff:g id="star">\u2605</xliff:g> </string> <!-- Example placeholder for a URL --> <string name="app_homeurl"> Visit us at <xliff:g id="application_homepage">http://my/app/home.html</xliff:g> </string> <!-- Example placeholder for a name --> <string name="prod_name"> Learn more at <xliff:g id="prod_gamegroup">Game Group</xliff:g> </string> <!-- Example placeholder for a literal --> <string name="promo_message"> Please use the "<xliff:g id="promotion_code">ABCDEFG</xliff:g>" to get a discount. </string> ... </resources>
স্থানীয়করণ চেকলিস্ট
একটি অ্যান্ড্রয়েড অ্যাপ স্থানীয়করণ এবং বিতরণ করার প্রক্রিয়া সম্পর্কে সম্পূর্ণ জানার জন্য, “আপনার অ্যাপ অনুবাদ ও স্থানীয়করণ করুন” দেখুন।
স্থানীয়করণের টিপস
আপনার অ্যাপটি স্থানীয়করণ করার সময় এই পরামর্শগুলো অনুসরণ করুন।
আপনার অ্যাপটি যেকোনো লোকাল-এ কাজ করার জন্য ডিজাইন করুন।
ব্যবহারকারী কোন ডিভাইসে আপনার অ্যাপটি চালাচ্ছেন, সে সম্পর্কে কোনো কিছু ধরে নেবেন না। ডিভাইসটিতে এমন হার্ডওয়্যার থাকতে পারে যা আপনি আশা করেননি, অথবা এটি এমন কোনো লোকাল-এ সেট করা থাকতে পারে যার জন্য আপনি পরিকল্পনা করেননি বা যা আপনি পরীক্ষা করতে পারবেন না। আপনার অ্যাপটি এমনভাবে ডিজাইন করুন যাতে এটি যে ডিভাইসেই চলুক না কেন, স্বাভাবিকভাবে কাজ করে অথবা ত্রুটিটি সুন্দরভাবে সামলে নেয়।
গুরুত্বপূর্ণ: নিশ্চিত করুন যে আপনার অ্যাপে ডিফল্ট রিসোর্সের একটি সম্পূর্ণ সেট অন্তর্ভুক্ত আছে: ফোল্ডারের নামে কোনো অতিরিক্ত সংশোধক ছাড়া res/drawable/ এবং res/values/ ফোল্ডারগুলো অন্তর্ভুক্ত করুন, যেগুলোতে আপনার অ্যাপের প্রয়োজনীয় সমস্ত ছবি এবং টেক্সট থাকবে।
যদি কোনো অ্যাপে একটিও ডিফল্ট রিসোর্স অনুপস্থিত থাকে, তবে সেটি অসমর্থিত লোকেলে সেট করা ডিভাইসে চলে না। উদাহরণস্বরূপ, যদি res/values/strings.xml ডিফল্ট ফাইলটিতে অ্যাপটির প্রয়োজনীয় একটি স্ট্রিং না থাকে, তাহলে অ্যাপটি যখন কোনো অসমর্থিত লোকেলে চলে এবং res/values/strings.xml লোড করার চেষ্টা করে, তখন ব্যবহারকারী একটি ত্রুটির বার্তা এবং একটি 'ফোর্স ক্লোজ' বাটন দেখতে পান।
আরও তথ্যের জন্য, ডিফল্ট রিসোর্সের জন্য পরীক্ষা বিভাগটি দেখুন।
প্রয়োজনের চেয়ে বেশি রিসোর্স ফাইল এবং টেক্সট স্ট্রিং তৈরি করা থেকে বিরত থাকুন।
আপনার অ্যাপের প্রতিটি রিসোর্সের জন্য সম্ভবত লোকেল-নির্দিষ্ট বিকল্প তৈরি করার প্রয়োজন নেই। উদাহরণস্বরূপ, res/drawable/ ডিরেক্টরিতে সংজ্ঞায়িত একটি অ্যাপ লোগো যেকোনো লোকেলে কাজ করতে পারে, সেক্ষেত্রে কোনো বিকল্প গ্রাফিক ফাইল তৈরি করার প্রয়োজন নেই।
এছাড়াও, আপনার প্রতিটি স্ট্রিং-এর জন্য বিকল্প টেক্সট তৈরি করার প্রয়োজন নাও হতে পারে। উদাহরণস্বরূপ, নিম্নলিখিতটি বিবেচনা করুন:
- আপনার অ্যাপের ডিফল্ট ভাষা হলো আমেরিকান ইংরেজি। অ্যাপে ব্যবহৃত প্রতিটি স্ট্রিং
res/values/strings.xmlফাইলে আমেরিকান ইংরেজি বানান ব্যবহার করে সংজ্ঞায়িত করা হয়েছে। - কয়েকটি গুরুত্বপূর্ণ বাক্যাংশের জন্য আপনি ব্রিটিশ ইংরেজি বানান ব্যবহার করতে চান। আপনি চান যে, আপনার অ্যাপটি যখন যুক্তরাজ্যের কোনো ডিভাইসে চলবে, তখন এই বিকল্প বানানগুলো ব্যবহৃত হোক।
এটি করার জন্য, res/values-en-rGB/strings.xml নামে একটি ছোট ফাইল তৈরি করুন, যাতে শুধুমাত্র সেই স্ট্রিংগুলো অন্তর্ভুক্ত থাকবে যেগুলো অ্যাপটি যুক্তরাজ্যে (UK) চলার সময় ভিন্ন হয়। বাকি সমস্ত স্ট্রিংয়ের জন্য, অ্যাপটি ডিফল্ট সেটিংসে ফিরে যাবে এবং res/values/strings.xml ফাইলে যা সংজ্ঞায়িত করা আছে, তা-ই ব্যবহার করবে।
ম্যানুয়াল লোকেল অনুসন্ধানের জন্য LocalConfiguration ব্যবহার করুন
অ্যান্ড্রয়েডের দেওয়া LocalConfiguration ব্যবহার করে আপনি লোকেলটি খুঁজে নিতে পারেন, যেমনটি নিচের উদাহরণে দেখানো হয়েছে:
val locale = LocalConfiguration.current.locales[0]
অ্যাপের অনুবাদ পরিষেবা ব্যবহার করুন
অ্যাপ অনুবাদ পরিষেবাটি প্লে কনসোলের সাথে সমন্বিত। এর মাধ্যমে আপনি তাৎক্ষণিক মূল্য জানতে এবং কোনো অনুবাদ সংস্থার কাছে অর্ডার দিতে পারেন। আপনি অ্যাপের UI স্ট্রিং, প্লে স্টোর লিস্টিং টেক্সট, IAP নাম এবং বিজ্ঞাপন ক্যাম্পেইনের টেক্সট এক বা একাধিক ভাষায় অনুবাদের জন্য অর্ডার দিতে পারেন।
অ্যাপ স্ট্রিং অনুবাদ করতে জেমিনি ব্যবহার করুন
আপনি অ্যান্ড্রয়েড স্টুডিওতে জেমিনি ব্যবহার করে সরাসরি আপনার প্রোজেক্টের মধ্যেই অ্যাপের স্ট্রিং রিসোর্সগুলো অনুবাদ করতে পারেন। আরও তথ্যের জন্য, “আপনার অ্যাপ অনুবাদ ও স্থানীয়করণ করুন” দেখুন।
স্থানীয় অ্যাপ পরীক্ষা করুন
আপনার স্থানীয়করণ করা অ্যাপটি কোনো ডিভাইসে অথবা অ্যান্ড্রয়েড এমুলেটর ব্যবহার করে পরীক্ষা করুন। বিশেষ করে, আপনার অ্যাপটি পরীক্ষা করে নিশ্চিত করুন যে সমস্ত প্রয়োজনীয় ডিফল্ট রিসোর্স অন্তর্ভুক্ত রয়েছে।
একটি ডিভাইসে পরীক্ষা করুন
মনে রাখবেন যে, আপনি যে ডিভাইসে পরীক্ষা করছেন তা অন্যান্য স্থানের গ্রাহকদের জন্য উপলব্ধ ডিভাইসগুলো থেকে উল্লেখযোগ্যভাবে ভিন্ন হতে পারে। আপনার ডিভাইসে উপলব্ধ লোকেলগুলো অন্যান্য ডিভাইসে উপলব্ধ লোকেলগুলো থেকে আলাদা হতে পারে। এছাড়াও, ডিভাইসের স্ক্রিনের রেজোলিউশন এবং ডেনসিটি ভিন্ন হতে পারে, যা আপনার UI-তে স্ট্রিং এবং ড্রয়েবলগুলোর প্রদর্শনকে প্রভাবিত করতে পারে।
ডিভাইসের লোকেল বা ভাষা পরিবর্তন করতে সেটিংস অ্যাপ ব্যবহার করুন।
কম্পোজেবল প্রিভিউ দিয়ে পরীক্ষা করুন
ডিভাইসে পরীক্ষা করার আগে, আপনি এমুলেটরে ডেপ্লয় না করেই স্থানীয় UI পরীক্ষা করার জন্য Android Studio-তে কম্পোজেবল প্রিভিউ ব্যবহার করতে পারেন। আপনার UI বিভিন্ন ভাষায় প্রিভিউ করার জন্য, @Preview অ্যানোটেশনটি ব্যবহার করুন (যেমন @Preview(locale = "fr") )। এছাড়াও, আপনি @Preview(locale = "ar") -এর মতো একটি RTL লোকেল উল্লেখ করে ডান থেকে বাম (RTL) লেআউট পরীক্ষা করতে পারেন।
এমুলেটরে পরীক্ষা করুন
এমুলেটর ব্যবহারের বিস্তারিত জানতে, অ্যান্ড্রয়েড এমুলেটরে অ্যাপ চালান (Run apps on the Android Emulator ) দেখুন।
একটি কাস্টম লোকেল তৈরি করুন এবং ব্যবহার করুন
একটি "কাস্টম" লোকেল হলো এমন একটি ভাষা বা অঞ্চলের সংমিশ্রণ যা অ্যান্ড্রয়েড সিস্টেম ইমেজ স্পষ্টভাবে সমর্থন করে না। এমুলেটরে একটি কাস্টম লোকেল তৈরি করে আপনি পরীক্ষা করতে পারেন যে আপনার অ্যাপটি সেই কাস্টম লোকেলে কেমন চলে। এটি করার দুটি উপায় আছে:
- কাস্টম লোকেল অ্যাপটি ব্যবহার করুন, যা অ্যাপ ট্যাব থেকে অ্যাক্সেস করা যায়। একটি কাস্টম লোকেল তৈরি করার পর, লোকেলের নামটি স্পর্শ করে ধরে রেখে সেটিতে সুইচ করুন।
- পরবর্তী বিভাগে বর্ণিত পদ্ধতি অনুসারে
adbশেল থেকে একটি কাস্টম লোকেল পরিবর্তন করুন।
আপনি যখন এমুলেটরটিকে এমন একটি লোকেলে সেট করেন যা অ্যান্ড্রয়েড সিস্টেম ইমেজে উপলব্ধ নয়, তখন সিস্টেমটি তার ডিফল্ট ভাষায় প্রদর্শিত হয়। তবে, আপনার অ্যাপটি সঠিকভাবে স্থানীয়করণ হয়ে যায়।
adb শেল থেকে এমুলেটরের লোকেল পরিবর্তন করুন
adb শেল ব্যবহার করে এমুলেটরে লোকেল পরিবর্তন করতে, নিম্নলিখিতগুলি করুন:
- আপনি যে লোকেলটি পরীক্ষা করতে চান তা বেছে নিন এবং এর BCP-47 ল্যাঙ্গুয়েজ ট্যাগ নির্ধারণ করুন, যেমন কানাডিয়ান ফ্রেঞ্চের জন্য
fr-CA। - একটি এমুলেটর চালু করুন।
- হোস্ট কম্পিউটারের কমান্ড-লাইন শেল থেকে নিম্নলিখিত কমান্ডটি চালান:
adb shell
অথবা, যদি আপনার কোনো ডিভাইস সংযুক্ত থাকে, তাহলে-eঅপশনটি যোগ করে এমুলেটর ব্যবহারের বিষয়টি নির্দিষ্ট করুন:
adb -e shell -
adbশেল প্রম্পটে (#), এই কমান্ডটি চালান:
setprop persist.sys.locale [ BCP-47 language tag ];stop;sleep 5;start
ধাপ ১ থেকে প্রাপ্ত উপযুক্ত কোডগুলো দিয়ে বন্ধনীতে থাকা অংশগুলো প্রতিস্থাপন করুন।
উদাহরণস্বরূপ, কানাডিয়ান ফরাসি ভাষায় পরীক্ষা করার জন্য:
setprop persist.sys.locale fr-CA;stop;sleep 5;start
এর ফলে এমুলেটরটি রিস্টার্ট হয়। হোম স্ক্রিনটি আবার দেখা গেলে, আপনার অ্যাপটি পুনরায় চালু করুন, এবং অ্যাপটি নতুন লোকেল সহ চালু হবে।
ডিফল্ট রিসোর্সের জন্য পরীক্ষা করুন
একটি অ্যাপে প্রয়োজনীয় প্রতিটি স্ট্রিং রিসোর্স অন্তর্ভুক্ত আছে কিনা তা পরীক্ষা করতে, নিম্নলিখিতগুলি করুন:
- এমুলেটর বা ডিভাইসটিকে এমন একটি ভাষায় সেট করুন যা আপনার অ্যাপ সমর্থন করে না। উদাহরণস্বরূপ, যদি অ্যাপটিতে
res/values-fr/ফোল্ডারে ফরাসি স্ট্রিং থাকে কিন্তুres/values-es/ফোল্ডারে কোনো স্প্যানিশ স্ট্রিং না থাকে, তাহলে এমুলেটরের লোকেল স্প্যানিশে সেট করুন। আপনি কাস্টম লোকেল (Custom Locale) অ্যাপটি ব্যবহার করে এমুলেটরটিকে একটি অসমর্থিত লোকেলে সেট করতে পারেন। - অ্যাপটি চালান।
- যদি অ্যাপটি একটি ত্রুটির বার্তা এবং একটি ফোর্স ক্লোজ বাটন দেখায়, তাহলে সম্ভবত এটি এমন কোনো স্ট্রিং খুঁজছে যা উপলব্ধ নেই। নিশ্চিত করুন যে আপনার
res/values/strings.xmlফাইলে অ্যাপটি দ্বারা ব্যবহৃত প্রতিটি স্ট্রিং-এর একটি সংজ্ঞা অন্তর্ভুক্ত আছে।
পরীক্ষাটি সফল হলে, অন্যান্য ধরনের কনফিগারেশনের জন্য এটি পুনরাবৃত্তি করুন। উদাহরণস্বরূপ, যদি অ্যাপটিতে res/values-land/strings.xml নামের একটি স্ট্রিং ফাইল থাকে কিন্তু res/values-port/strings.xml নামের কোনো ফাইল না থাকে, তাহলে এমুলেটর বা ডিভাইসটিকে পোর্ট্রেট ওরিয়েন্টেশনে সেট করুন এবং দেখুন অ্যাপটি চলে কিনা।
অতিরিক্ত সম্পদ
স্থানীয়করণ সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত অতিরিক্ত উৎসগুলো দেখুন: