একটি স্ট্রিং রিসোর্স আপনার অ্যাপ্লিকেশনের জন্য ঐচ্ছিক টেক্সট স্টাইলিং এবং ফরম্যাটিং সহ টেক্সট স্ট্রিং সরবরাহ করে। তিন ধরনের রিসোর্স রয়েছে যা আপনার অ্যাপ্লিকেশনকে স্ট্রিং সরবরাহ করতে পারে:
- স্ট্রিং
- এক্সএমএল রিসোর্স যা একটি একক স্ট্রিং প্রদান করে।
- স্ট্রিং অ্যারে
- এক্সএমএল রিসোর্স যা স্ট্রিং-এর একটি অ্যারে প্রদান করে।
- পরিমাণ স্ট্রিং (বহুবচন)
- এক্সএমএল রিসোর্স যা বহুবচন করার জন্য বিভিন্ন স্ট্রিং বহন করে।
সমস্ত স্ট্রিং-এর উপর কিছু স্টাইলিং মার্কআপ এবং ফরম্যাটিং আর্গুমেন্ট প্রয়োগ করা যায়। স্ট্রিং-এর স্টাইলিং ও ফরম্যাটিং সম্পর্কে জানতে, ফরম্যাটিং ও স্টাইলিং অংশটি দেখুন।
স্ট্রিং
একটি একক স্ট্রিং যা অ্যাপ্লিকেশন কোড (যেমন একটি কম্পোজেবল ফাংশন) বা অন্যান্য রিসোর্স ফাইল থেকে রেফারেন্স করা যেতে পারে।
- ফাইলের অবস্থান:
-
res/values/ filename .xml
ফাইলের নামটি ইচ্ছামত হতে পারে।<string>এলিমেন্টেরnameরিসোর্স আইডি হিসেবে ব্যবহৃত হয়। - সংকলিত রিসোর্স ডেটাটাইপ:
- একটি
Stringএর রিসোর্স পয়েন্টার। - তথ্যসূত্র:
- কোটলিনে:
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`-এর ভেতর থেকে একটি স্ট্রিং পুনরুদ্ধার করে।@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এর একটি অ্যারের রিসোর্স পয়েন্টার। - তথ্যসূত্র:
- কোটলিনে:
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`-এর ভেতর থেকে একটি স্ট্রিং অ্যারে পুনরুদ্ধার করে।@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)ব্যবহার করুন।
পরিমাণ স্ট্রিং (বহুবচন)
পরিমাণ বোঝানোর ক্ষেত্রে ব্যাকরণগত সামঞ্জস্যের জন্য বিভিন্ন ভাষার বিভিন্ন নিয়ম রয়েছে। উদাহরণস্বরূপ, ইংরেজিতে ১ পরিমাণটি একটি বিশেষ ক্ষেত্র। আমরা লিখি "1 book", কিন্তু অন্য যেকোনো পরিমাণের জন্য আমরা লিখি " n books"। একবচন ও বহুবচনের মধ্যে এই পার্থক্যটি খুবই প্রচলিত, কিন্তু অন্যান্য ভাষা আরও সূক্ষ্ম পার্থক্য করে থাকে। অ্যান্ড্রয়েড দ্বারা সমর্থিত সম্পূর্ণ সেটটি হলো zero , one , two , few , many , এবং other ।
কোনো নির্দিষ্ট ভাষা ও পরিমাণের জন্য কোন কারক (case) ব্যবহার করা হবে, তা নির্ধারণের নিয়মকানুন বেশ জটিল হতে পারে, তাই অ্যান্ড্রয়েড আপনার জন্য উপযুক্ত রিসোর্সটি বেছে নিতে pluralStringResource() এর মতো মেথড সরবরাহ করে।
যদিও ঐতিহাসিকভাবে একে 'কোয়ান্টিটি স্ট্রিং' বলা হয় (এবং এপিআই-তেও এখনও তাই বলা হয়), কোয়ান্টিটি স্ট্রিং শুধুমাত্র বহুবচনের জন্য ব্যবহার করা উচিত। উদাহরণস্বরূপ, অপঠিত বার্তা থাকলে জিমেইলের "Inbox" বনাম "Inbox (12)"-এর মতো কিছু বাস্তবায়নের জন্য কোয়ান্টিটি স্ট্রিং ব্যবহার করা একটি ভুল হবে। if স্টেটমেন্টের পরিবর্তে কোয়ান্টিটি স্ট্রিং ব্যবহার করা সুবিধাজনক মনে হতে পারে, কিন্তু এটা মনে রাখা গুরুত্বপূর্ণ যে কিছু ভাষা (যেমন চীনা) এই ব্যাকরণগত পার্থক্যগুলো একেবারেই করে না, তাই আপনি সর্বদা other স্ট্রিংটি পাবেন।
কোন স্ট্রিংটি ব্যবহার করা হবে তার নির্বাচন শুধুমাত্র ব্যাকরণগত প্রয়োজনীয়তার উপর ভিত্তি করে করা হয়। ইংরেজিতে, পরিমাণ ০ হলেও zero জন্য ব্যবহৃত স্ট্রিংটি উপেক্ষা করা হয়, কারণ ০ ব্যাকরণগতভাবে ২ বা ১ ছাড়া অন্য যেকোনো সংখ্যা থেকে আলাদা নয় ("zero books", "one book", "two books", ইত্যাদি)। বিপরীতে, কোরিয়ান ভাষায় কেবল other স্ট্রিংটিই ব্যবহৃত হয়।
এই বিষয়টি দ্বারাও বিভ্রান্ত হবেন না যে, ধরা যাক, two শব্দটি শুনে মনে হতে পারে এটি কেবল ২ পরিমাণটির ক্ষেত্রেই প্রযোজ্য: একটি ভাষার প্রয়োজন হতে পারে যে ২, ১২, ১০২ (এবং আরও অনেক) সংখ্যাগুলোকে একে অপরের মতো করে গণ্য করা হবে, কিন্তু অন্যান্য পরিমাণ থেকে ভিন্নভাবে। আপনার অনুবাদকের উপর নির্ভর করুন, কারণ তিনি জানেন যে তাদের ভাষা আসলে কোন কোন পার্থক্যের উপর জোর দেয়।
আপনার বার্তায় যদি পরিমাণের সংখ্যাটি না থাকে, তবে সম্ভবত এটি বহুবচন হিসেবে উপযুক্ত নয়। উদাহরণস্বরূপ, লিথুয়ানিয়ান ভাষায় ১ এবং ১০১ উভয়ের জন্যই একবচন ব্যবহৃত হয়, তাই "১টি বই" এর অনুবাদ হয় "১ ক্নিগা", এবং "১০১টি বই" এর অনুবাদ হয় "১০১ ক্নিগা"। অন্যদিকে, "একটি বই" এর অনুবাদ হয় "ক্নিগা" এবং "অনেকগুলো বই" এর অনুবাদ হয় "ডাউগ ক্নিগু"। যদি কোনো ইংরেজি বহুবচন বার্তায় প্রকৃত সংখ্যাটি ছাড়া "একটি বই" (একবচন) এবং "অনেকগুলো বই" (বহুবচন) থাকে, তবে এর অনুবাদ "ক্নিগা" (একটি বই)/"ডাউগ ক্নিগু" (অনেকগুলো বই) হতে পারে, কিন্তু লিথুয়ানিয়ান নিয়ম অনুযায়ী, সংখ্যাটি ১০১ হলে এর অনুবাদ "ক্নিগা" (একটি বই) হবে।
অনেক সময় "বই: ১"-এর মতো পরিমাণ-নিরপেক্ষ বাক্য ব্যবহার করে পরিমাণবাচক স্ট্রিং এড়ানো সম্ভব। যদি আপনার অ্যাপ্লিকেশনের জন্য এটি একটি গ্রহণযোগ্য শৈলী হয়, তবে এটি আপনার এবং আপনার অনুবাদকদের কাজকে সহজ করে তোলে।
API 24+ সংস্করণে আপনি এর পরিবর্তে আরও অনেক বেশি শক্তিশালী ICU MessageFormat ক্লাসটি ব্যবহার করতে পারেন।
- ফাইলের অবস্থান:
-
res/values/ filename .xml
ফাইলের নামটি ইচ্ছামত হতে পারে।<plurals>এলিমেন্টেরnameরিসোর্স আইডি হিসেবে ব্যবহৃত হয়। - তথ্যসূত্র:
- কোটলিনে:
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 এস্কেপিং নিয়ম অনুযায়ী অক্ষরগুলোকে এস্কেপ করতে হবে। অ্যান্ড্রয়েডে বিশেষ অর্থ বহনকারী কোনো অক্ষরকে এস্কেপ করার প্রয়োজন হলে, তার আগে একটি ব্যাকস্ল্যাশ ব্যবহার করা উচিত।
ডিফল্টভাবে অ্যান্ড্রয়েড পরপর থাকা একাধিক হোয়াইটস্পেস ক্যারেক্টারকে একটিমাত্র স্পেসে পরিণত করে। আপনার স্ট্রিং-এর প্রাসঙ্গিক অংশটিকে ডাবল কোটেশনের মধ্যে রেখে আপনি এটি এড়াতে পারেন। এক্ষেত্রে, কোটেশনের ভেতরের অঞ্চলের সমস্ত হোয়াইটস্পেস ক্যারেক্টার (নতুন লাইন সহ) অক্ষত থাকবে। ডাবল কোটেশন আপনাকে সাধারণ, আন-এসকেপড সিঙ্গেল কোটেশনও ব্যবহার করার সুযোগ দেবে।
| চরিত্র | পলাতক রূপ(গুলি) |
|---|---|
| @ | \@ |
| ? | \? |
| নতুন লাইন | \n |
| ট্যাব | \t |
| U+XXXX ইউনিকোড অক্ষর | \uXXXX |
একক উদ্ধৃতি চিহ্ন ( ' ) | নিম্নলিখিতগুলির যেকোনো একটি:
|
দ্বি-উদ্ধৃতি ( " ) | \"মনে রাখবেন যে স্ট্রিংটিকে একক উদ্ধৃতি চিহ্ন দিয়ে ঘিরে রাখলে তা কাজ করে না। |
আপনার রিসোর্স ফাইলটি XML হিসেবে পার্স করার পরে হোয়াইটস্পেস কলাপসিং এবং অ্যান্ড্রয়েড এস্কেপিং ঘটে। এর মানে হলো, <string>      </string> (স্পেস, বিরামচিহ্নের স্পেস, ইউনিকোড Em স্পেস) সবগুলোই একটিমাত্র স্পেসে ( " " ) পরিণত হয়, কারণ ফাইলটি XML হিসেবে পার্স করার পর এগুলো সবই ইউনিকোড স্পেস হয়ে যায়। এই স্পেসগুলোকে যেমন আছে তেমন রাখতে, আপনি হয় সেগুলোকে কোট করতে পারেন ( <string>"      "</string> ) অথবা অ্যান্ড্রয়েড এস্কেপিং ব্যবহার করতে পারেন ( <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, ) ) }
এইচটিএমএল মার্কআপ দিয়ে স্টাইলিং
আপনি এইচটিএমএল মার্কআপ ব্যবহার করে আপনার স্ট্রিংগুলিতে স্টাইলিং যোগ করতে পারেন। উদাহরণস্বরূপ:
<?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 হলো একটি Compose টেক্সট অবজেক্ট, যাকে আপনি রঙ এবং ফন্ট ওয়েটের মতো প্রোপার্টি দিয়ে স্টাইল করতে পারেন। 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) }
একক-ভাষার অ্যাপ বা কম্পোজ-এর স্ট্যাটিক টেক্সটের জন্য সরাসরি AnnotatedString তৈরি করাই প্রস্তাবিত পদ্ধতি। তবে, স্থানীয়করণের প্রয়োজন এমন স্টাইল করা টেক্সটের জন্য, পরবর্তী বিভাগে বিস্তারিতভাবে বর্ণিত XML <annotation> পদ্ধতিটি দেখুন।
টীকা ব্যবহার করে অনূদিত স্ট্রিং স্টাইল করা
যেসব স্ট্রিং-এর জন্য কাস্টম স্টাইলিং এবং অনুবাদের প্রয়োজন, সেগুলোর জন্য প্রতিটি লোকেলের strings.xml ফাইলে <annotation> ট্যাগটি সংজ্ঞায়িত করুন। অনুবাদকরা বাক্যের যেখানেই থাকুক না কেন, অ্যানোটেশনটি সংরক্ষণ করে। 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> ট্যাগটি অপরিবর্তিত রয়েছে। শুধুমাত্র পুনরুদ্ধার কোডটি ভিন্ন। অনুবাদকরা প্রতিটি ভাষায় সঠিক শব্দটিকে মোড়ানোর জন্য ট্যাগটি সরিয়ে নেন।
অতিরিক্ত সম্পদ
স্ট্রিং রিসোর্স সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত অতিরিক্ত রিসোর্সগুলো দেখুন: