স্ট্রিং রিসোর্স আপনার অ্যাপ্লিকেশনের জন্য ঐচ্ছিক টেক্সট স্টাইলিং ও ফর্ম্যাটিং সহ টেক্সট স্ট্রিং প্রদান করে। তিন ধরনের রিসোর্স আপনার অ্যাপ্লিকেশনকে স্ট্রিং প্রদান করতে পারে:
- স্ট্রিং
- XML রিসোর্স যা একটি স্ট্রিং প্রদান করে।
- স্ট্রিং অ্যারে
- XML রিসোর্স যা স্ট্রিংয়ের একটি অ্যারে প্রদান করে।
- পরিমাণ স্ট্রিং (বহুবচন)
- XML রিসোর্স যা বহুবচনের জন্য বিভিন্ন স্ট্রিং বহন করে।
সব স্ট্রিং কিছু স্টাইলিং মার্কআপ এবং ফর্ম্যাটিং আর্গুমেন্ট প্রয়োগ করতে সক্ষম। স্ট্রিং স্টাইলিং ও ফর্ম্যাটিং সম্পর্কে তথ্যের জন্য, ফর্ম্যাটিং ও স্টাইলিং সংক্রান্ত বিভাগ দেখুন।
স্ট্রিং
একটি স্ট্রিং যা অ্যাপ্লিকেশন কোড (যেমন কম্পোজেবল ফাংশন) বা অন্যান্য রিসোর্স ফাইল থেকে রেফারেন্স করা যেতে পারে।
- ফাইলের লোকেশন:
res/values/filename.xml
ফাইলের নাম ইচ্ছামতো দেওয়া হয়েছে।<string>এলিমেন্টেরnameরিসোর্স আইডি হিসেবে ব্যবহার করা হয়।- কম্পাইল করা রিসোর্স ডেটাটাইপ:
- রিসোর্স পয়েন্টার থেকে
String। - রিসোর্স রেফারেন্স:
-
Kotlin-এ:
R.string.string_name
XML-এ:@string/string_name - সিনট্যাক্স:
-
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="string_name" >text_string</string> </resources>
- এলিমেন্ট:
- উদাহরণ:
- XML ফাইল
res/values/strings.xml-এ সেভ করা হয়েছে:<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello!</string> </resources>
এই অ্যাপ্লিকেশন কোড
stringResource()-এর সাথে কম্পোজেবলের ভিতর থেকে একটি স্ট্রিং ফিরিয়ে আনে:@Composable fun Greeting() { Text(text = stringResource(R.string.hello)) }
মনে রাখবেন: কম্পোজেবল ফাংশনের বাইরে থেকে স্ট্রিং ফিরিয়ে আনতে,
এছাড়াও, আপনি অন্যান্য XML ফাইল থেকে স্ট্রিং রিসোর্স রেফারেন্স করতে পারেন, যেমন আপনারcontext.getString(R.string.hello)ব্যবহার করুন।AndroidManifest.xml:<activity android:name=".MainActivity" android:label="@string/hello" />
স্ট্রিং অ্যারে
স্ট্রিংয়ের একটি অ্যারে যা অ্যাপ্লিকেশন থেকে রেফারেন্স করা যেতে পারে।
- ফাইলের লোকেশন:
res/values/filename.xml
ফাইলের নাম ইচ্ছামতো দেওয়া হয়েছে।<string-array>এলিমেন্টেরnameরিসোর্স আইডি হিসেবে ব্যবহার করা হয়।- কম্পাইল করা রিসোর্স ডেটাটাইপ:
- রিসোর্স পয়েন্টার
String-এর অ্যারেতে পয়েন্ট করে। - রিসোর্স রেফারেন্স:
-
Kotlin-এ:
R.array.string_array_name
XML-এ:@[package:]array/string_array_name - সিনট্যাক্স:
-
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="string_array_name"> <item >text_string</item> </string-array> </resources>
- এলিমেন্ট:
- উদাহরণ:
- XML ফাইল
res/values/strings.xml-এ সেভ করা হয়েছে:<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="planets_array"> <item>Mercury</item> <item>Venus</item> <item>Earth</item> <item>Mars</item> </string-array> </resources>
এই অ্যাপ্লিকেশন কোড
stringArrayResource()-এর সাথে কম্পোজেবলের ভিতর থেকে একটি স্ট্রিং অ্যারে ফিরিয়ে আনে:@Composable fun PlanetList() { val planets: Array
= stringArrayResource(R.array.planets_array) // Render the array, e.g. inside a LazyColumn. } মনে রাখবেন: কম্পোজেবল ফাংশনের বাইরে স্ট্রিং অ্যারে ফিরিয়ে আনতে,
context.resources.getStringArray(R.array.planets_array)ব্যবহার করুন।
পরিমাণ স্ট্রিং (বহুবচন)
পরিমাণের সাথে ব্যাকরণগত মিলের জন্য বিভিন্ন ভাষায় বিভিন্ন নিয়ম
রয়েছে। যেমন, ইংরেজিতে ১ সংখ্যাটি একটি বিশেষ কেস। আমরা লিখি
"১টি বই", কিন্তু অন্য যেকোনও পরিমাণের জন্য আমরা লিখব "nটি বই"। একবচন ও বহুবচনের মধ্যে এই পার্থক্য
খুবই সাধারণ, তবে অন্যান্য ভাষায় আরও সূক্ষ্ম
পার্থক্য করা হয়। Android-এ কাজ করে এমন সম্পূর্ণ সেট হল zero, one, two, few,
many এবং other।
কোনও নির্দিষ্ট ভাষা ও পরিমাণের জন্য কোন কেস ব্যবহার করা হবে তা নির্ধারণ করার নিয়ম
খুব জটিল হতে পারে, তাই Android আপনাকে pluralStringResource()-এর মতো পদ্ধতি প্রদান করে
যাতে আপনি উপযুক্ত রিসোর্স বেছে নিতে পারেন।
যদিও ঐতিহাসিকভাবে "পরিমাণ স্ট্রিং" বলা হয় (এবং এখনও API-তে তাই বলা হয়),
পরিমাণ স্ট্রিং শুধুমাত্র বহুবচনের জন্য ব্যবহার করা উচিত। উদাহরণস্বরূপ, অপঠিত মেসেজ থাকলে, Gmail-এর "ইনবক্স" বনাম "ইনবক্স (12)"-এর মতো কিছু প্রয়োগ করতে পরিমাণ স্ট্রিং ব্যবহার করা ভুল হবে। if স্টেটমেন্টের পরিবর্তে
পরিমাণ স্ট্রিং ব্যবহার করা সুবিধাজনক বলে মনে হতে পারে, তবে এটি
মনে রাখা গুরুত্বপূর্ণ যে কিছু ভাষায় (যেমন চীনা) এই ব্যাকরণগত পার্থক্যগুলি
একেবারেই করা হয় না, তাই আপনি সবসময় other স্ট্রিং পাবেন।
কোন স্ট্রিং ব্যবহার করা হবে তা ব্যাকরণগত
প্রয়োজনীয়তার উপর ভিত্তি করে বেছে নেওয়া হয়। ইংরেজিতে, zero-এর জন্য স্ট্রিং উপেক্ষা করা হয়, এমনকি পরিমাণ 0 হলেও, কারণ ব্যাকরণগতভাবে 0, 2 বা 1 ছাড়া অন্য কোনও সংখ্যার থেকে আলাদা নয়
("zero books", "one book", "two books" ইত্যাদি)। অন্যদিকে, কোরিয়ান ভাষায়
শুধুমাত্র other স্ট্রিং ব্যবহার করা হয়।
এই তথ্য দ্বারা বিভ্রান্ত হবেন না যে, ধরুন, two এমনভাবে উচ্চারণ করা হয় যা শুধুমাত্র
২ সংখ্যার ক্ষেত্রে প্রযোজ্য: কোনও ভাষায় ২, ১২, ১০২ (এবং আরও অনেক) সংখ্যাকে
একইভাবে ব্যবহার করা হয় কিন্তু অন্যান্য সংখ্যার ক্ষেত্রে আলাদাভাবে ব্যবহার করা হয়। তাদের ভাষায় আসলে কী পার্থক্য রয়েছে তা জানতে আপনার অনুবাদকের উপর নির্ভর করুন।
আপনার মেসেজে যদি পরিমাণ সংক্রান্ত সংখ্যা না থাকে, তাহলে সম্ভবত এটি বহুবচনের জন্য উপযুক্ত নয়। যেমন, লিথুয়ানিয়ান ভাষায় ১ ও ১০১, দুটির ক্ষেত্রেই একবচন ব্যবহার করা হয়, তাই "১টি বই" অনুবাদ করা হয় "1 knyga" হিসেবে এবং "১০১টি বই" অনুবাদ করা হয় "101 knyga" হিসেবে। এদিকে "একটি বই" হল "knyga" এবং "অনেক বই" হল "daug knygų"। যদি কোনও ইংরেজি বহুবচন মেসেজে "একটি বই" (একবচন) এবং "অনেক বই" (বহুবচন) থাকে, তাহলে এটি "knyga" (একটি বই)/"daug knygų" (অনেক বই) হিসেবে অনুবাদ করা যেতে পারে, কিন্তু লিথুয়ানিয়ান নিয়ম অনুযায়ী, সংখ্যাটি ১০১ হলে এটি "knyga" (একটি বই) দেখাবে।
"বই: ১"-এর মতো পরিমাণ-নিরপেক্ষ ফর্মুলেশন ব্যবহার করে পরিমাণ স্ট্রিং এড়ানো প্রায়শই সম্ভব। আপনার অ্যাপ্লিকেশনের জন্য এই স্টাইল গ্রহণযোগ্য হলে, এটি আপনার এবং আপনার অনুবাদকের কাজ সহজ করে তোলে।
API 24+ ভার্সনে আপনি এর পরিবর্তে অনেক বেশি শক্তিশালী ICU MessageFormat
ক্লাস ব্যবহার করতে পারবেন।
- ফাইলের লোকেশন:
res/values/filename.xml
ফাইলের নাম ইচ্ছামতো দেওয়া হয়েছে।<plurals>এলিমেন্টেরnameরিসোর্স আইডি হিসেবে ব্যবহার করা হয়।- রিসোর্স রেফারেন্স:
-
Kotlin-এ:
R.plurals.plural_name - সিনট্যাক্স:
-
<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="plural_name"> <item quantity=["zero" | "one" | "two" | "few" | "many" | "other"] >text_string</item> </plurals> </resources>
- এলিমেন্ট:
- উদাহরণ:
XML ফাইল
res/values/strings.xml-এ সেভ করা হয়েছে:<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberOfSongsAvailable"> <!-- As a developer, you should always supply "one" and "other" strings. Your translators will know which strings are actually needed for their language. Always include %d in "one" because translators will need to use %d for languages where "one" doesn't mean 1 (as explained above). --> <item quantity="one">%d song found.</item> <item quantity="other">%d songs found.</item> </plurals> </resources>
XML ফাইল
res/values-pl/strings.xml-এ সেভ করা হয়েছে:<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberOfSongsAvailable"> <item quantity="one">Znaleziono %d piosenkę.</item> <item quantity="few">Znaleziono %d piosenki.</item> <item quantity="other">Znaleziono %d piosenek.</item> </plurals> </resources>
এই অ্যাপ্লিকেশন কোড
pluralStringResource()-এর সাথে কম্পোজেবলের ভিতর থেকে একটি বহুবচন স্ট্রিং ফিরিয়ে আনে:@Composable fun SongCount(count: Int) { Text( text = pluralStringResource( R.plurals.numberOfSongsAvailable, count, count, ) ) }
pluralStringResource()ফাংশন ব্যবহার করার সময়, আপনার স্ট্রিংয়ে সংখ্যার সাথে স্ট্রিং ফর্ম্যাটিং থাকলে, আপনাকেcountদুবার পাস করতে হবে। যেমন, স্ট্রিং%d songs found-এর জন্য, প্রথমcountপ্যারামিটার উপযুক্ত বহুবচন স্ট্রিং বেছে নেয় এবং দ্বিতীয়countপ্যারামিটার%dপ্লেসহোল্ডারে যোগ করা হয়। আপনার বহুবচন স্ট্রিংয়ে স্ট্রিং ফর্ম্যাটিং অন্তর্ভুক্ত না থাকলে, আপনাকেpluralStringResource-এ তৃতীয় প্যারামিটার পাস করতে হবে না।মনে রাখবেন: কম্পোজেবল ফাংশনের বাইরে বহুবচন স্ট্রিং ফিরিয়ে আনতে,
context.resources.getQuantityString(R.plurals.numberOfSongsAvailable, count, count)ব্যবহার করুন।
ফর্ম্যাট ও স্টাইল
আপনার স্ট্রিং রিসোর্স কীভাবে সঠিকভাবে ফর্ম্যাট এবং স্টাইল করবেন সে সম্পর্কে এখানে কয়েকটি গুরুত্বপূর্ণ বিষয় রয়েছে যা আপনার জানা উচিত।
বিশেষ অক্ষর ম্যানেজ করা
কোনও স্ট্রিংয়ে XML-এ বিশেষ ব্যবহার আছে এমন অক্ষর থাকলে, আপনাকে স্ট্যান্ডার্ড XML/HTML এস্কেপিং নিয়ম অনুযায়ী অক্ষরগুলি এস্কেপ করতে হবে। Android-এ বিশেষ অর্থ আছে এমন কোনও অক্ষর এড়িয়ে যেতে চাইলে, আপনাকে আগে ব্যাকস্ল্যাশ ব্যবহার করতে হবে।
ডিফল্ট হিসেবে, Android হোয়াইটস্পেস অক্ষরের ক্রমকে একটি স্পেসে সংক্ষিপ্ত করবে। আপনার স্ট্রিংয়ের প্রাসঙ্গিক অংশ ডবল কোটেশনের মধ্যে রেখে আপনি এটি এড়াতে পারবেন। এই ক্ষেত্রে, উদ্ধৃত অঞ্চলের মধ্যে সব হোয়াইটস্পেস অক্ষর (নতুন লাইন সহ) সংরক্ষিত থাকবে। ডবল কোটেশন ব্যবহার করলে আপনি রেগুলার সিঙ্গেল আনএসকেপড কোটেশনও ব্যবহার করতে পারবেন।
| অক্ষর | এড়িয়ে যাওয়া ফর্ম |
|---|---|
| @ | \@ |
| ? | \? |
| নতুন লাইন | \n |
| ট্যাব | \t |
| U+XXXX ইউনিকোড অক্ষর | \uXXXX |
সিঙ্গেল কোটেশন (') |
নিম্নলিখিত যেকোনও একটি:
|
ডবল কোটেশন (") |
\"
মনে রাখবেন, স্ট্রিংয়ের দু'পাশে সিঙ্গেল কোট দিলে কাজ হবে না। |
আপনার রিসোর্স ফাইল XML হিসেবে পার্স করার পরে হোয়াইটস্পেস কোল্যাপ্সিং ও Android এস্কেপিং
হয়। এর অর্থ হল, <string>      </string>
(স্পেস, বিরামচিহ্ন স্পেস, ইউনিকোড Em স্পেস) সবকটি একটি স্পেসে
(" ") পরিণত হয়, কারণ ফাইলটি XML হিসেবে পার্স করার পরে সেগুলি সবই ইউনিকোড স্পেস।
সেই স্পেসগুলি যেমন আছে তেমন রাখতে, আপনি হয় সেগুলি কোট করতে পারেন
(<string>"      "</string>)
অথবা Android এস্কেপিং ব্যবহার করতে পারেন
(<string> \u0032 \u8200 \u8195</string>)।
স্ট্রিং ফর্ম্যাট করা
আপনার স্ট্রিং ফর্ম্যাট করতে হলে, স্ট্রিং রিসোর্সে ফর্ম্যাট আর্গুমেন্ট যোগ করে তা করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণ রিসোর্সে দেখানো হয়েছে।
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
এই অ্যাপ্লিকেশন কোডটি সরাসরি stringResource()-এ আর্গুমেন্ট পাস করে কম্পোজেবলের ভিতর থেকে স্ট্রিং ফর্ম্যাট করে:
@Composable fun WelcomeMessage(username: String, mailCount: Int) { Text( text = stringResource( R.string.welcome_messages, username, mailCount, ) ) }
HTML মার্কআপের মাধ্যমে স্টাইল করা
HTML মার্কআপের মাধ্যমে আপনি স্ট্রিংয়ে স্টাইলিং যোগ করতে পারবেন। যেমন:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="welcome">Welcome to <b>Android</b>!</string> </resources>
নিম্নলিখিত HTML এলিমেন্ট কাজ করে:
- বোল্ড:
<b> - ইটালিক:
<i>,<cite>,<dfn>,<em> - ২৫% বড় টেক্সট:
<big> - ২০% ছোট টেক্সট:
<small> - ফন্ট প্রপার্টি সেট করা হচ্ছে:
<font face="font_family" color="hex_color">। সম্ভাব্য ফন্ট ফ্যামিলির উদাহরণের মধ্যেmonospace,serifওsans_serifঅন্তর্ভুক্ত। - মোনোস্পেস ফন্ট ফ্যামিলি সেট করা হচ্ছে:
<tt> - স্ট্রাইকথ্রু:
<s>,<strike>,<del> - আন্ডারলাইন:
<u> - সুপারস্ক্রিপ্ট:
<sup> - সাবস্ক্রিপ্ট:
<sub> - বুলেট পয়েন্ট:
<ul>,<li> - লাইন ব্রেক:
<br> - ডিভিশন:
<div> - CSS স্টাইল:
<span style="color|background_color|text-decoration"> - অনুচ্ছেদ:
<p dir="rtl | ltr" style="…">টি
কিছু ক্ষেত্রে, আপনি হয়ত স্টাইল করা টেক্সট রিসোর্স তৈরি করতে চাইবেন যা ফর্ম্যাট স্ট্রিং হিসেবেও
ব্যবহার করা হয়। সাধারণত, এটি কাজ করে না কারণ ফর্ম্যাটিং পদ্ধতি,
যেমন stringResource(), স্ট্রিং থেকে সব স্টাইল সংক্রান্ত তথ্য সরিয়ে দেয়।
এর সমাধান হল, এস্কেপ করা এন্টিটি সহ HTML ট্যাগ লেখা, যা
ফরম্যাটিং হওয়ার পরে AnnotatedString.fromHtml()-এর মাধ্যমে
পুনরুদ্ধার করা হয়। যেমন:
- আপনার স্টাইল করা টেক্সট রিসোর্স HTML-এস্কেপড স্ট্রিং হিসেবে স্টোর করুন:
<resources> <string name="welcome_messages">Hello, %1$s! You have <b>%2$d new messages</b>.</string> </resources>
এই ফর্ম্যাট করা স্ট্রিংয়ে, একটি
<b>এলিমেন্ট যোগ করা হয়েছে। লক্ষ্য করুন যে শুরুর ব্র্যাকেটটি HTML-এস্কেপ করা হয়েছে,<নোটেশন ব্যবহার করে। - তারপর, স্ট্রিংটি স্বাভাবিকভাবে ফর্ম্যাট করুন, তবে HTML টেক্সটকে একটি স্টাইল করা কম্পোজ স্ট্রিংয়ে রূপান্তর করতে
AnnotatedString.fromHtml()কল করুন।
যেহেতু fromHtml() সব HTML এন্টিটি ফর্ম্যাট করে, তাই ফর্ম্যাট করা টেক্সটের সাথে আপনি যে স্ট্রিং ব্যবহার করেন,
সেখানে সম্ভাব্য HTML অক্ষর এড়িয়ে যেতে ভুলবেন না,
TextUtils.htmlEncode() ব্যবহার করে।
import android.text.TextUtils import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.fromHtml @Composable fun WelcomeHtmlMessage(username: String, mailCount: Int) { // Escape the username in case it contains characters like "<" or "&" val escapedUsername = TextUtils.htmlEncode(username) val text = stringResource( R.string.welcome_messages, escapedUsername, mailCount, ) Text( text = AnnotatedString.fromHtml(text) ) }
AnnotatedString-এর মাধ্যমে স্টাইলিং
AnnotatedString হল একটি কম্পোজ টেক্সট অবজেক্ট যা আপনি রঙ এবং ফন্ট ওয়েটের মতো
প্রপার্টি দিয়ে স্টাইল করতে পারেন। buildAnnotatedString এবং withStyle ব্যবহার করে
প্রোগ্রাম্যাটিক্যালি স্টাইল করা টেক্সট তৈরি করুন।
এই অ্যাপ্লিকেশন কোডটি মিশ্র স্টাইল সহ একটি টেক্সট এলিমেন্ট তৈরি করে:
@Composable fun StyledGreeting() { val styled = buildAnnotatedString { append("Welcome to ") withStyle(SpanStyle(fontWeight = FontWeight.Bold)) { append("Android") } append("!") } Text(text = styled) }
রঙ, ফন্ট সাইজ ও টেক্সট ডেকোরেশন প্রয়োগ করতে, SpanStyle ব্যবহার করুন। প্যারাগ্রাফ-লেভেল স্টাইলিং (যেমন অ্যালাইনমেন্ট বা লাইনের উচ্চতা)
প্রয়োগ করতে, ParagraphStyle ব্যবহার করুন:
@Composable fun RichText() { val text = buildAnnotatedString { withStyle(ParagraphStyle(lineHeight = 24.sp, textAlign = TextAlign.Center)) { withStyle(SpanStyle(color = Color.Gray)) { append("Hello, ") } withStyle( SpanStyle( fontWeight = FontWeight.Bold, color = Color.Red, ) ) { append("world") } append("!") } } Text(text = text) }
একক-ভাষার অ্যাপ বা Compose-এ স্ট্যাটিক টেক্সটের জন্য সরাসরি AnnotatedString তৈরি করা হল
সাজেস্ট করা পদ্ধতি। তবে, স্টাইল করা টেক্সট যা
লোকালাইজ করতে হবে, তার জন্য পরবর্তী বিভাগে বিস্তারিত XML <annotation> পদ্ধতি
দেখুন।
Styling translated strings with annotations
যেসব স্ট্রিংয়ের জন্য কাস্টম স্টাইলিং এবং অনুবাদ প্রয়োজন, সেগুলির জন্য প্রতিটি লোকেলে strings.xml-এ
<annotation> ট্যাগ নির্ধারণ করুন। Translators preserve the
annotation regardless of where it lands in the sentence. context.resources.getText()-এর সাথে স্ট্রিংটি পড়ুন,
এর Annotation স্প্যানগুলি দেখুন এবং ফলাফলটিকে
একটি AnnotatedString-এ রূপান্তর করুন:
@Composable fun AnnotatedTitle() { val context = LocalContext.current val source = context.resources.getText(R.string.title) as SpannedString val text = buildAnnotatedString { append(source.toString()) source.getSpans(0, source.length, Annotation::class.java) .forEach { annotation -> if (annotation.key == "font" && annotation.value == "title_emphasis") { addStyle( SpanStyle( fontFamily = FontFamily( Font(R.font.permanent_marker) ) ), source.getSpanStart(annotation), source.getSpanEnd(annotation), ) } } } Text(text = text) }
আপনার XML-এ <annotation> ট্যাগ অপরিবর্তিত আছে। শুধু রিট্রিভাল কোড
আলাদা। অনুবাদকরা এখনও প্রতিটি ভাষায় সঠিক শব্দ র্যাপ করার জন্য ট্যাগটি
সরান।
অতিরিক্ত রিসোর্স
স্ট্রিং রিসোর্স সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত অতিরিক্ত রিসোর্স দেখুন: