स्ट्रिंग रिसॉर्स

स्ट्रिंग रिसॉर्स, आपके ऐप्लिकेशन के लिए टेक्स्ट स्ट्रिंग उपलब्ध कराता है. इसमें टेक्स्ट स्टाइलिंग और फ़ॉर्मैटिंग का विकल्प होता है. तीन तरह के संसाधन, आपके ऐप्लिकेशन को स्ट्रिंग उपलब्ध करा सकते हैं:

String
एक्सएमएल संसाधन, जो एक स्ट्रिंग उपलब्ध कराता है.
String Array
एक्सएमएल संसाधन, जो स्ट्रिंग का ऐरे उपलब्ध कराता है.
संख्या के हिसाब से स्ट्रिंग (प्लूरल)
यह एक एक्सएमएल संसाधन है, जिसमें प्लूरलाइज़ेशन के लिए अलग-अलग स्ट्रिंग होती हैं.

सभी स्ट्रिंग में, स्टाइलिंग मार्कअप और फ़ॉर्मैटिंग आर्ग्युमेंट लागू किए जा सकते हैं. स्ट्रिंग को स्टाइल करने और फ़ॉर्मैट करने के बारे में जानकारी के लिए, फ़ॉर्मैटिंग और स्टाइलिंग सेक्शन देखें.

स्ट्रिंग

एक ऐसी स्ट्रिंग जिसे ऐप्लिकेशन कोड (जैसे कि कंपोज़ेबल फ़ंक्शन) या अन्य संसाधन फ़ाइलों से रेफ़रंस किया जा सकता है.

फ़ाइल की जगह की जानकारी:
res/values/filename.xml
फ़ाइल का नाम कुछ भी हो सकता है. <string> एलिमेंट के name का इस्तेमाल, संसाधन आईडी के तौर पर किया जाता है.
कंपाइल किया गया रिसॉर्स डेटाटाइप:
String का संसाधन पॉइंटर.
संसाधन का रेफ़रंस:
Kotlin में: R.string.string_name
एक्सएमएल में: @string/string_name
सिंटैक्स:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string
        name="string_name"
        >text_string</string>
</resources>
elements:
<resources>
ज़रूरी है. यह रूट नोड होना चाहिए.

कोई एट्रिब्यूट नहीं है.

<string>
एक स्ट्रिंग, जिसमें स्टाइलिंग टैग शामिल हो सकते हैं. ध्यान दें कि आपको ऐस्ट्रॉफ़ी और कोटेशन मार्क को एस्केप करना होगा. स्ट्रिंग को सही तरीके से स्टाइल और फ़ॉर्मैट करने के बारे में ज़्यादा जानने के लिए, यहां मौजूद फ़ॉर्मैटिंग और स्टाइलिंग लेख पढ़ें.

एट्रिब्यूट:

name
String. स्ट्रिंग का नाम. इस नाम का इस्तेमाल संसाधन आईडी के तौर पर किया जाता है.
उदाहरण:
एक्सएमएल फ़ाइल को 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))
}

ध्यान दें: कंपोज़ेबल फ़ंक्शन के बाहर की स्ट्रिंग को वापस पाने के लिए, 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
एक्सएमएल में: @[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>
elements:
<resources>
ज़रूरी है. यह रूट नोड होना चाहिए.

कोई एट्रिब्यूट नहीं है.

<string-array>
यह स्ट्रिंग की एक कैटगरी तय करता है. इसमें एक या उससे ज़्यादा <item> एलिमेंट होते हैं.

एट्रिब्यूट:

name
String. ऐरे का नाम. इस नाम का इस्तेमाल, ऐरे को रेफ़रंस देने के लिए संसाधन आईडी के तौर पर किया जाता है.
<item>
एक स्ट्रिंग, जिसमें स्टाइलिंग टैग शामिल हो सकते हैं. वैल्यू, किसी अन्य स्ट्रिंग संसाधन का रेफ़रंस हो सकती है. यह <string-array> एलिमेंट का चाइल्ड एलिमेंट होना चाहिए. ध्यान दें कि आपको ऐस्ट्रॉफ़ी और कोटेशन मार्क को एस्केप करना होगा. स्ट्रिंग को सही तरीके से स्टाइल और फ़ॉर्मैट करने के बारे में जानने के लिए, यहां मौजूद फ़ॉर्मैटिंग और स्टाइलिंग सेक्शन देखें.

कोई एट्रिब्यूट नहीं है.

उदाहरण:
एक्सएमएल फ़ाइल को 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) का इस्तेमाल करें.

संख्या वाली स्ट्रिंग (प्लूरल)

अलग-अलग भाषाओं में, संख्या के हिसाब से व्याकरण के नियम अलग-अलग होते हैं. उदाहरण के लिए, अंग्रेज़ी में 1 की मात्रा एक खास मामला है. हम "1 किताब" लिखते हैं, लेकिन किसी अन्य संख्या के लिए हम "n किताबें" लिखेंगे. एकवचन और बहुवचन के बीच का यह अंतर बहुत आम है, लेकिन अन्य भाषाओं में ज़्यादा अंतर होता है. Android पर इन सभी फ़ॉर्मैट का इस्तेमाल किया जा सकता है: zero, one, two, few, many, और other.

किसी भाषा और संख्या के लिए कौनसा केस इस्तेमाल करना है, इसके नियम बहुत जटिल हो सकते हैं. इसलिए, Android आपको pluralStringResource() जैसे तरीके उपलब्ध कराता है, ताकि आपके लिए सही संसाधन चुना जा सके.

हालांकि, इन्हें पहले "संख्या स्ट्रिंग" कहा जाता था (और अब भी एपीआई में इन्हें यही कहा जाता है), संख्या स्ट्रिंग का इस्तेमाल सिर्फ़ बहुवचन के लिए किया जाना चाहिए. उदाहरण के लिए, Gmail के "इनबॉक्स" बनाम "इनबॉक्स (12)" जैसे किसी फ़ंक्शन को लागू करने के लिए, संख्या वाली स्ट्रिंग का इस्तेमाल करना एक गलती होगी. ऐसा तब किया जाता है, जब पढ़े नहीं गए मैसेज मौजूद हों. ऐसा लग सकता है कि if स्टेटमेंट के बजाय, संख्या वाली स्ट्रिंग का इस्तेमाल करना ज़्यादा आसान है. हालांकि, यह ध्यान रखना ज़रूरी है कि कुछ भाषाओं (जैसे, चाइनीज़) में व्याकरण के हिसाब से ये अंतर नहीं किए जाते. इसलिए, आपको हमेशा other स्ट्रिंग मिलेगी.

किस स्ट्रिंग का इस्तेमाल करना है, यह सिर्फ़ व्याकरण के हिसाब से ज़रूरी होने पर तय किया जाता है. अंग्रेज़ी में, zero के लिए स्ट्रिंग को अनदेखा किया जाता है. भले ही, संख्या 0 हो. ऐसा इसलिए, क्योंकि व्याकरण के हिसाब से 0, 2 या 1 के अलावा किसी अन्य संख्या से अलग नहीं है ("शून्य किताबें", "एक किताब", "दो किताबें" वगैरह). इसके उलट, कोरियन भाषा में other स्ट्रिंग का इस्तेमाल सिर्फ़ एक बार किया जाता है.

इस बात से भी गुमराह न हों कि two सिर्फ़ 2 की संख्या पर लागू होता है. किसी भाषा में, 2, 12, 102 (और इसी तरह की अन्य संख्याएं) को एक जैसा माना जा सकता है, लेकिन अन्य संख्याओं से अलग माना जा सकता है. अपने अनुवादक पर भरोसा करें, ताकि आपको पता चल सके कि उनकी भाषा में किन शब्दों का इस्तेमाल करना ज़रूरी है.

अगर आपके मैसेज में संख्या नहीं है, तो शायद यह प्लूरल के लिए सही विकल्प नहीं है. उदाहरण के लिए, लिथुआनियन भाषा में 1 और 101, दोनों के लिए एकवचन का इस्तेमाल किया जाता है. इसलिए, "1 किताब" का अनुवाद "1 knyga" और "101 किताबें" का अनुवाद "101 knyga" के तौर पर किया जाता है. वहीं, "a book" का मतलब "knyga" और "many books" का मतलब "daug knygų" होता है. अगर अंग्रेज़ी के किसी प्लूरल मैसेज में "a book" (सिंगुलर) और "many books" (प्लूरल) शामिल हैं, लेकिन उनमें किताबों की संख्या नहीं दी गई है, तो इसे "knyga" (एक किताब)/"daug knygų" (कई किताबें) के तौर पर अनुवादित किया जा सकता है. हालांकि, लिथुआनियन भाषा के नियमों के मुताबिक, किताबों की संख्या 101 होने पर, "knyga" (एक किताब) दिखेगा.

अक्सर, "किताबें: 1" जैसे फ़ॉर्मूले का इस्तेमाल करके, मात्रा की स्ट्रिंग से बचा जा सकता है. अगर आपके ऐप्लिकेशन के लिए यह स्टाइल सही है, तो इससे आपको और अनुवादकों को आसानी होगी.

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>
elements:
<resources>
ज़रूरी है. यह रूट नोड होना चाहिए.

कोई एट्रिब्यूट नहीं है.

<plurals>
यह स्ट्रिंग का एक कलेक्शन होता है. इसमें से एक स्ट्रिंग, किसी चीज़ की मात्रा के हिसाब से दी जाती है. इसमें एक या उससे ज़्यादा <item> एलिमेंट होते हैं.

एट्रिब्यूट:

name
String. स्ट्रिंग के पेयर का नाम. इस नाम का इस्तेमाल, संसाधन आईडी के तौर पर किया जाता है.
<item>
बहुवचन या एकवचन वाली स्ट्रिंग. वैल्यू, किसी अन्य स्ट्रिंग संसाधन का रेफ़रंस हो सकती है. यह <plurals> एलिमेंट का चाइल्ड एलिमेंट होना चाहिए. ध्यान दें कि आपको ऐपोस्ट्रॉफ़ी और उद्धरण चिह्नों को एस्केप करना होगा. स्ट्रिंग को सही तरीके से स्टाइल और फ़ॉर्मैट करने के बारे में जानने के लिए, यहां मौजूद फ़ॉर्मैटिंग और स्टाइलिंग देखें.

एट्रिब्यूट:

quantity
कीवर्ड. यह वैल्यू बताती है कि इस स्ट्रिंग का इस्तेमाल कब किया जाना चाहिए. मान्य वैल्यू. इनके उदाहरण कोष्ठक में दिए गए हैं. हालांकि, इसमें और भी उदाहरण शामिल हो सकते हैं:
मानब्यौरा
zeroजब भाषा में 0 को खास तरीके से लिखा जाता है, जैसे कि अरबी में.
oneजब भाषा में संख्याओं को खास तरीके से लिखा जाता है. जैसे, अंग्रेज़ी और ज़्यादातर भाषाओं में 1 को एक लिखा जाता है. वहीं, रशियन भाषा में 1 से खत्म होने वाली कोई भी संख्या, इस क्लास में आती है. हालांकि, 11 से खत्म होने वाली संख्या इस क्लास में नहीं आती.
twoजब भाषा में संख्याओं को खास तरीके से लिखा जाता है. जैसे, वेल्श में दो को 2 लिखा जाता है या स्लोवेनियन में 102 लिखा जाता है.
fewजब भाषा में "छोटी" संख्याओं को खास तरीके से इस्तेमाल करने की ज़रूरत होती है. जैसे, चेक भाषा में 2, 3, और 4; या पोलिश भाषा में ऐसी संख्याएं जिनके आखिर में 2, 3 या 4 आता है, लेकिन 12, 13 या 14 नहीं.
manyजब भाषा में "बड़ी" संख्याओं को खास तरीके से लिखा जाता है. जैसे, माल्टीज़ भाषा में 11 से 99 तक की संख्याओं को खास तरीके से लिखा जाता है.
otherजब भाषा में दी गई संख्या के लिए किसी खास फ़ॉर्मैट की ज़रूरत नहीं होती है. जैसे, चीनी भाषा में सभी संख्याओं के लिए या अंग्रेज़ी में 42 के लिए.
उदाहरण:

एक्सएमएल फ़ाइल को 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>

एक्सएमएल फ़ाइल को 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) का इस्तेमाल करें.

फ़ॉर्मैट और स्टाइल

यहां कुछ ज़रूरी बातें बताई गई हैं, जिनके बारे में आपको पता होना चाहिए. इनकी मदद से, स्ट्रिंग रिसॉर्स को सही तरीके से फ़ॉर्मैट और स्टाइल किया जा सकता है.

खास वर्णों को मैनेज करना

अगर किसी स्ट्रिंग में ऐसे वर्ण शामिल हैं जिनका एक्सएमएल में खास इस्तेमाल होता है, तो आपको एक्सएमएल/एचटीएमएल के एस्केपिंग के स्टैंडर्ड नियमों के मुताबिक वर्णों को एस्केप करना होगा. अगर आपको Android में किसी ऐसे वर्ण को एस्केप करना है जिसका खास मतलब है, तो आपको पहले बैकस्लैश का इस्तेमाल करना चाहिए.

डिफ़ॉल्ट रूप से, Android खाली जगह वाले वर्णों के क्रम को एक ही जगह में छोटा कर देगा. अपनी स्ट्रिंग के काम के हिस्से को डबल कोट में रखकर, इससे बचा जा सकता है. इस मामले में, कोट किए गए हिस्से में मौजूद सभी खाली सफ़ेद जगह (नई लाइनें भी शामिल हैं) सुरक्षित रहेंगी. डबल कोट का इस्तेमाल करके, सिंगल कोट का भी इस्तेमाल किया जा सकता है.

वर्ण एस्केप किए गए फ़ॉर्म
@ \@
? \?
नई लाइन \n
टैब \t
U+XXXX यूनिकोड वर्ण \uXXXX
सिंगल कोट (')

इनमें से कोई भी:

  • \'
  • पूरी स्ट्रिंग को डबल कोट में रखें (उदाहरण के लिए, "This'll work")
डबल कोट (") \"

ध्यान दें कि स्ट्रिंग को सिंगल कोट में रखने से काम नहीं चलता.

आपकी संसाधन फ़ाइल को एक्सएमएल के तौर पर पार्स करने के बाद, व्हाइटस्पेस को छोटा किया जाता है और Android एस्केपिंग की जाती है. इसका मतलब है कि <string> &#32; &#8200; &#8195;</string> (स्पेस, विराम चिह्न स्पेस, यूनिकोड एम स्पेस) सभी एक स्पेस (" ") में बदल जाते हैं, क्योंकि फ़ाइल को एक्सएमएल के तौर पर पार्स करने के बाद, ये सभी यूनिकोड स्पेस होते हैं. उन स्पेस को उसी तरह बनाए रखने के लिए, उन्हें कोट किया जा सकता है (<string>" &#32; &#8200; &#8195;"</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,
        )
    )
}

एचटीएमएल मार्कअप का इस्तेमाल करके स्टाइलिंग करना

एचटीएमएल मार्कअप का इस्तेमाल करके, अपनी स्ट्रिंग में स्टाइलिंग जोड़ी जा सकती है. उदाहरण के लिए:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="welcome">Welcome to <b>Android</b>!</string>
</resources>

इन एचटीएमएल एलिमेंट का इस्तेमाल किया जा सकता है:

  • बोल्ड: <b>
  • इटैलिक: <i>, <cite>, <dfn>, <em>
  • 25% बड़ा टेक्स्ट: <big>
  • 20% छोटा टेक्स्ट: <small>
  • फ़ॉन्ट की प्रॉपर्टी सेट की जा रही हैं: <font face="font_family" color="hex_color">. फ़ॉन्ट फ़ैमिली के उदाहरणों में monospace, serif, और sans_serif शामिल हैं.
  • मोनोस्पेस फ़ॉन्ट फ़ैमिली सेट करना: <tt>
  • स्ट्राइकथ्रू: <s>, <strike>, <del>
  • अंडरलाइन: <u>
  • सुपरस्क्रिप्ट: <sup>
  • सबस्क्रिप्ट: <sub>
  • बुलेट पॉइंट: <ul>, <li>
  • लाइन ब्रेक: <br>
  • भाग देना: <div>
  • सीएसएस स्टाइल: <span style="color|background_color|text-decoration">
  • पैराग्राफ़: <p dir="rtl | ltr" style="…">

कुछ मामलों में, आपको स्टाइल वाला ऐसा टेक्स्ट संसाधन बनाना पड़ सकता है जिसका इस्तेमाल फ़ॉर्मैट स्ट्रिंग के तौर पर भी किया जाता है. आम तौर पर, यह काम नहीं करता है, क्योंकि फ़ॉर्मैट करने के तरीके, जैसे कि stringResource(), स्ट्रिंग से स्टाइल की सारी जानकारी हटा देते हैं. इसके लिए, एचटीएमएल टैग को एस्केप की गई इकाइयों के साथ लिखा जाता है. इसके बाद, फ़ॉर्मैटिंग होने पर, AnnotatedString.fromHtml() की मदद से उन्हें वापस लाया जाता है. उदाहरण के लिए:

  1. स्टाइल किए गए टेक्स्ट रिसॉर्स को एचटीएमएल-एस्केप्ड स्ट्रिंग के तौर पर सेव करें:
    <resources>
      <string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>
    </resources>

    इस फ़ॉर्मैट की गई स्ट्रिंग में, <b> एलिमेंट जोड़ा गया है. ध्यान दें कि ओपनिंग ब्रैकेट को &lt; नोटेशन का इस्तेमाल करके, एचटीएमएल से एस्केप किया गया है.

  2. इसके बाद, स्ट्रिंग को सामान्य तरीके से फ़ॉर्मैट करें. हालांकि, एचटीएमएल टेक्स्ट को स्टाइल वाली कंपोज़ स्ट्रिंग में बदलने के लिए, AnnotatedString.fromHtml() को भी कॉल करें.

fromHtml() सभी एचटीएमएल इकाइयों को फ़ॉर्मैट करता है. इसलिए, फ़ॉर्मैट किए गए टेक्स्ट के साथ इस्तेमाल की जाने वाली स्ट्रिंग में मौजूद सभी एचटीएमएल वर्णों को एस्केप करना न भूलें. इसके लिए, 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)
}

एक ही भाषा वाले ऐप्लिकेशन या Compose में स्टैटिक टेक्स्ट के लिए, AnnotatedString को सीधे तौर पर बनाने का सुझाव दिया जाता है. हालांकि, स्टाइल किए गए ऐसे टेक्स्ट के लिए जिसे स्थानीय भाषा में बदलने की ज़रूरत होती है, अगले सेक्शन में दी गई एक्सएमएल <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)
}

आपके एक्सएमएल में मौजूद <annotation> टैग में कोई बदलाव नहीं किया गया है. सिर्फ़ कोड पाने का तरीका अलग होता है. अनुवादक अब भी टैग को इस तरह से बदलते हैं कि हर भाषा में सही शब्द शामिल हो.

अन्य संसाधन

स्ट्रिंग रिसॉर्स के बारे में ज़्यादा जानने के लिए, यहां दिए गए अतिरिक्त संसाधन देखें:

दस्तावेज़

कॉन्टेंट देखता है