स्ट्रिंग रिसॉर्स, आपके ऐप्लिकेशन के लिए टेक्स्ट स्ट्रिंग उपलब्ध कराता है. इसमें टेक्स्ट स्टाइलिंग और फ़ॉर्मैटिंग का विकल्प होता है. तीन तरह के संसाधन, आपके ऐप्लिकेशन को स्ट्रिंग उपलब्ध करा सकते हैं:
- 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:
- उदाहरण:
- एक्सएमएल फ़ाइल को
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:
- उदाहरण:
- एक्सएमएल फ़ाइल को
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:
- उदाहरण:
एक्सएमएल फ़ाइल को
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 |
सिंगल कोट (') |
इनमें से कोई भी:
|
डबल कोट (") |
\"
ध्यान दें कि स्ट्रिंग को सिंगल कोट में रखने से काम नहीं चलता. |
आपकी संसाधन फ़ाइल को एक्सएमएल के तौर पर पार्स करने के बाद, व्हाइटस्पेस को छोटा किया जाता है और Android एस्केपिंग की जाती है. इसका मतलब है कि <string>      </string> (स्पेस, विराम चिह्न स्पेस, यूनिकोड एम स्पेस) सभी एक स्पेस (" ") में बदल जाते हैं, क्योंकि फ़ाइल को एक्सएमएल के तौर पर पार्स करने के बाद, ये सभी यूनिकोड स्पेस होते हैं.
उन स्पेस को उसी तरह बनाए रखने के लिए, उन्हें कोट किया जा सकता है
(<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, ) ) }
एचटीएमएल मार्कअप का इस्तेमाल करके स्टाइलिंग करना
एचटीएमएल मार्कअप का इस्तेमाल करके, अपनी स्ट्रिंग में स्टाइलिंग जोड़ी जा सकती है. उदाहरण के लिए:
<?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() की मदद से उन्हें वापस लाया जाता है. उदाहरण के लिए:
- स्टाइल किए गए टेक्स्ट रिसॉर्स को एचटीएमएल-एस्केप्ड स्ट्रिंग के तौर पर सेव करें:
<resources> <string name="welcome_messages">Hello, %1$s! You have <b>%2$d new messages</b>.</string> </resources>
इस फ़ॉर्मैट की गई स्ट्रिंग में,
<b>एलिमेंट जोड़ा गया है. ध्यान दें कि ओपनिंग ब्रैकेट को<नोटेशन का इस्तेमाल करके, एचटीएमएल से एस्केप किया गया है. - इसके बाद, स्ट्रिंग को सामान्य तरीके से फ़ॉर्मैट करें. हालांकि, एचटीएमएल टेक्स्ट को स्टाइल वाली कंपोज़ स्ट्रिंग में बदलने के लिए,
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> टैग में कोई बदलाव नहीं किया गया है. सिर्फ़ कोड पाने का तरीका अलग होता है. अनुवादक अब भी टैग को इस तरह से बदलते हैं कि हर भाषा में सही शब्द शामिल हो.
अन्य संसाधन
स्ट्रिंग रिसॉर्स के बारे में ज़्यादा जानने के लिए, यहां दिए गए अतिरिक्त संसाधन देखें: