স্ট্রিং সম্পদ

একটি স্ট্রিং রিসোর্স আপনার অ্যাপ্লিকেশনের জন্য ঐচ্ছিক টেক্সট স্টাইলিং এবং ফরম্যাটিং সহ টেক্সট স্ট্রিং সরবরাহ করে। তিন ধরনের রিসোর্স রয়েছে যা আপনার অ্যাপ্লিকেশনকে স্ট্রিং সরবরাহ করতে পারে:

স্ট্রিং
এক্সএমএল রিসোর্স যা একটি একক স্ট্রিং প্রদান করে।
স্ট্রিং অ্যারে
এক্সএমএল রিসোর্স যা স্ট্রিং-এর একটি অ্যারে প্রদান করে।
পরিমাণ স্ট্রিং (বহুবচন)
এক্সএমএল রিসোর্স যা বহুবচন করার জন্য বিভিন্ন স্ট্রিং বহন করে।

সমস্ত স্ট্রিং-এর উপর কিছু স্টাইলিং মার্কআপ এবং ফরম্যাটিং আর্গুমেন্ট প্রয়োগ করা যায়। স্ট্রিং-এর স্টাইলিং ও ফরম্যাটিং সম্পর্কে জানতে, ফরম্যাটিং ও স্টাইলিং অংশটি দেখুন।

স্ট্রিং

একটি একক স্ট্রিং যা অ্যাপ্লিকেশন কোড (যেমন একটি কম্পোজেবল ফাংশন) বা অন্যান্য রিসোর্স ফাইল থেকে রেফারেন্স করা যেতে পারে।

ফাইলের অবস্থান:
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>
উপাদানসমূহ:
<resources>
আবশ্যক। এটি অবশ্যই রুট নোড হতে হবে।

কোনো অ্যাট্রিবিউট নেই।

<string>
একটি স্ট্রিং, যাতে স্টাইলিং ট্যাগ অন্তর্ভুক্ত থাকতে পারে। মনে রাখবেন যে আপনাকে অবশ্যই অ্যাপস্ট্রফি এবং উদ্ধৃতি চিহ্ন এস্কেপ করতে হবে। আপনার স্ট্রিংগুলিকে কীভাবে সঠিকভাবে স্টাইল এবং ফরম্যাট করতে হয় সে সম্পর্কে আরও তথ্যের জন্য, নিচে 'ফরম্যাটিং এবং স্টাইলিং' দেখুন।

বৈশিষ্ট্য:

name
স্ট্রিং । স্ট্রিংটির জন্য একটি নাম। এই নামটি রিসোর্স আইডি হিসেবে ব্যবহৃত হয়।
উদাহরণ:
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))
}

দ্রষ্টব্য: কম্পোজেবল ফাংশনের বাইরে কোনো স্ট্রিং পেতে, context.getString(R.string.hello) ব্যবহার করুন।

আপনি অন্যান্য XML ফাইল, যেমন আপনার 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>
উপাদানসমূহ:
<resources>
আবশ্যক। এটি অবশ্যই রুট নোড হতে হবে।

কোনো অ্যাট্রিবিউট নেই।

<string-array>
স্ট্রিং-এর একটি অ্যারে সংজ্ঞায়িত করে। এতে এক বা একাধিক <item> উপাদান থাকে।

বৈশিষ্ট্য:

name
স্ট্রিং । অ্যারের জন্য একটি নাম। এই নামটি অ্যারেটিকে উল্লেখ করার জন্য রিসোর্স আইডি হিসেবে ব্যবহৃত হয়।
<item>
একটি স্ট্রিং, যাতে স্টাইলিং ট্যাগ অন্তর্ভুক্ত থাকতে পারে। এর ভ্যালুটি অন্য কোনো স্ট্রিং রিসোর্সের রেফারেন্স হতে পারে। এটি অবশ্যই একটি <string-array> এলিমেন্টের চাইল্ড হতে হবে। মনে রাখবেন যে আপনাকে অবশ্যই অ্যাপস্ট্রফি এবং কোটেশন মার্ক এস্কেপ করতে হবে। আপনার স্ট্রিংগুলোকে কীভাবে সঠিকভাবে স্টাইল ও ফরম্যাট করতে হয়, সে সম্পর্কে তথ্যের জন্য নিচে ‘ফরম্যাটিং এবং স্টাইলিং’ অংশটি দেখুন।

কোনো অ্যাট্রিবিউট নেই।

উদাহরণ:
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>
উপাদানসমূহ:
<resources>
আবশ্যক। এটি অবশ্যই রুট নোড হতে হবে।

কোনো অ্যাট্রিবিউট নেই।

<plurals>
স্ট্রিং-এর একটি সংগ্রহ, যেখান থেকে কোনো কিছুর পরিমাণের ওপর নির্ভর করে একটি স্ট্রিং সরবরাহ করা হয়। এতে এক বা একাধিক <item> উপাদান থাকে।

বৈশিষ্ট্য:

name
স্ট্রিং । স্ট্রিং জোড়াটির একটি নাম। এই নামটি রিসোর্স আইডি হিসেবে ব্যবহৃত হয়।
<item>
একটি বহুবচন বা একবচন স্ট্রিং। এর মান অন্য কোনো স্ট্রিং রিসোর্সের একটি রেফারেন্স হতে পারে। এটি অবশ্যই একটি <plurals> এলিমেন্টের চাইল্ড হতে হবে। মনে রাখবেন যে আপনাকে অবশ্যই অ্যাপস্ট্রফি এবং উদ্ধৃতি চিহ্ন এস্কেপ করতে হবে। আপনার স্ট্রিংগুলোকে কীভাবে সঠিকভাবে স্টাইল ও ফরম্যাট করতে হয়, সে সম্পর্কে তথ্যের জন্য নিচে ‘ফরম্যাটিং এবং স্টাইলিং’ অংশটি দেখুন।

বৈশিষ্ট্য:

quantity
কীওয়ার্ড । একটি মান যা নির্দেশ করে কখন এই স্ট্রিংটি ব্যবহার করা উচিত। বৈধ মানসমূহ, বন্ধনীতে অসম্পূর্ণ উদাহরণসহ:
মূল্য বর্ণনা
zero যখন কোনো ভাষায় ০ সংখ্যাটির বিশেষ ব্যবহারের প্রয়োজন হয় (যেমন আরবিতে)।
one যখন কোনো ভাষায় একের মতো সংখ্যার জন্য বিশেষ ব্যবস্থার প্রয়োজন হয় (যেমন ইংরেজি এবং বেশিরভাগ অন্যান্য ভাষায় ১ সংখ্যার ক্ষেত্রে; রুশ ভাষায়, যে কোনো সংখ্যা যার শেষে ১ আছে কিন্তু ১১ নেই, তা এই শ্রেণীর অন্তর্ভুক্ত)।
two যখন কোনো ভাষায় দুই-এর মতো সংখ্যার জন্য বিশেষ পদ্ধতির প্রয়োজন হয় (যেমন ওয়েলশ ভাষায় ২, বা স্লোভেনীয় ভাষায় ১০২)।
few যখন কোনো ভাষায় "ছোট" সংখ্যার জন্য বিশেষ ব্যবস্থার প্রয়োজন হয় (যেমন চেক ভাষায় ২, ৩, এবং ৪-এর ক্ষেত্রে; অথবা পোলিশ ভাষায় যে সংখ্যাগুলোর শেষে ২, ৩, বা ৪ থাকে কিন্তু ১২, ১৩, বা ১৪ থাকে না)।
many যখন ভাষায় বড় সংখ্যার জন্য বিশেষ ব্যবস্থার প্রয়োজন হয় (যেমন মাল্টিজ ভাষায় ১১-৯৯ পর্যন্ত শেষ হওয়া সংখ্যাগুলোর ক্ষেত্রে)।
other যখন ভাষাটিতে প্রদত্ত পরিমাণের জন্য কোনো বিশেষ ব্যবস্থার প্রয়োজন হয় না (যেমন চীনা ভাষায় সমস্ত সংখ্যার ক্ষেত্রে, বা ইংরেজিতে ৪২-এর ক্ষেত্রে)।
উদাহরণ:

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
একক উদ্ধৃতি চিহ্ন ( ' )

নিম্নলিখিতগুলির যেকোনো একটি:

  • \'
  • সম্পূর্ণ স্ট্রিংটিকে ডাবল কোটেশনের মধ্যে রাখুন (উদাহরণস্বরূপ, "This'll work" )।
দ্বি-উদ্ধৃতি ( " ) \"

মনে রাখবেন যে স্ট্রিংটিকে একক উদ্ধৃতি চিহ্ন দিয়ে ঘিরে রাখলে তা কাজ করে না।

আপনার রিসোর্স ফাইলটি XML হিসেবে পার্স করার পরে হোয়াইটস্পেস কলাপসিং এবং অ্যান্ড্রয়েড এস্কেপিং ঘটে। এর মানে হলো, <string> &#32; &#8200; &#8195;</string> (স্পেস, বিরামচিহ্নের স্পেস, ইউনিকোড Em স্পেস) সবগুলোই একটিমাত্র স্পেসে ( " " ) পরিণত হয়, কারণ ফাইলটি XML হিসেবে পার্স করার পর এগুলো সবই ইউনিকোড স্পেস হয়ে যায়। এই স্পেসগুলোকে যেমন আছে তেমন রাখতে, আপনি হয় সেগুলোকে কোট করতে পারেন ( <string>" &#32; &#8200; &#8195;"</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() দিয়ে পুনরুদ্ধার করা হয়। উদাহরণস্বরূপ:

  1. আপনার স্টাইল করা টেক্সট রিসোর্সটিকে একটি HTML-এস্কেপড স্ট্রিং হিসেবে সংরক্ষণ করুন:
    <resources>
      <string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>
    </resources>

    এই ফরম্যাট করা স্ট্রিংটিতে একটি <b> এলিমেন্ট যোগ করা হয়েছে। লক্ষ্য করুন যে, শুরুর বন্ধনীটি &lt; চিহ্ন ব্যবহার করে HTML-এস্কেপ করা হয়েছে।

  2. এরপর স্ট্রিংটিকে যথারীতি ফরম্যাট করুন, কিন্তু 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> ট্যাগটি অপরিবর্তিত রয়েছে। শুধুমাত্র পুনরুদ্ধার কোডটি ভিন্ন। অনুবাদকরা প্রতিটি ভাষায় সঠিক শব্দটিকে মোড়ানোর জন্য ট্যাগটি সরিয়ে নেন।

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

স্ট্রিং রিসোর্স সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত অতিরিক্ত রিসোর্সগুলো দেখুন:

ডকুমেন্টেশন

বিষয়বস্তু দেখুন