अलग-अलग भाषाओं और संस्कृतियों के हिसाब से बनाना

ऐप्लिकेशन में ऐसे संसाधन शामिल हैं जो किसी खास संस्कृति के लिए खास हो सकते हैं. उदाहरण के लिए, किसी ऐप्लिकेशन में संस्कृति के हिसाब से ऐसी स्ट्रिंग शामिल हो सकती हैं जिनका अनुवाद आपकी मौजूदा स्थान-भाषा की भाषा.

यह एक अच्छा तरीका है संस्कृति से जुड़े संसाधनों को आपके ऐप्लिकेशन से अलग करना चाहिए. Android ठीक हो जाता है इसमें भाषा और संस्कृति के हिसाब से संसाधन शामिल किए गए हैं. ये संसाधन, सिस्टम की स्थान-भाषा की सेटिंग के आधार पर तय किए जाते हैं. आपने लोगों तक पहुंचाया मुफ़्त में में संसाधन डायरेक्ट्री का इस्तेमाल करके अलग-अलग भाषाओं के लिए सहायता उपलब्ध करा सकता है आपका Android प्रोजेक्ट.

आपके पास अपनी संस्कृति के बारे में जानकारी देने के लिए, है. आप किसी भी तरह के संसाधन उपलब्ध करा सकते हैं सही है, जो आपके उपयोगकर्ताओं की भाषा और संस्कृति के हिसाब से सही हो. उदाहरण के लिए, नीचे दिए गए स्क्रीनशॉट में, एक ऐप्लिकेशन दिखाया गया है. इसमें स्ट्रिंग और ड्रॉ किए जा सकने वाले संसाधन दिख रहे हैं डिवाइस की डिफ़ॉल्ट en_US स्थान-भाषा और स्पैनिश es_ES स्थान-भाषा.

यह ऐप्लिकेशन,
मौजूदा स्थान-भाषा के हिसाब से अलग-अलग टेक्स्ट और आइकॉन

पहला डायग्राम. ऐप्लिकेशन, अलग-अलग संसाधनों का इस्तेमाल करता है. ये संसाधन इस बात पर निर्भर करते हैं कि मौजूदा स्थान-भाषा.

जब Android SDK का इस्तेमाल करके कोई प्रोजेक्ट बनाया जाता है टूल, टूल, इसके टॉप लेवल में res/ डायरेक्ट्री जनरेट करते हैं को भी शामिल किया है. इस res/ डायरेक्ट्री में, अलग-अलग रिसॉर्स की सबडायरेक्ट्री हैं प्रकार. यहां कुछ डिफ़ॉल्ट फ़ाइलें भी मौजूद होती हैं, जैसे कि res/values/strings.xml फ़ाइल है, जिसमें आपकी स्ट्रिंग वैल्यू होती हैं.

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

  • RTL स्थान-भाषा के लिए, RTL यूज़र इंटरफ़ेस (यूआई) लेआउट इस्तेमाल करें.
  • इसके अंदर दिखाए जाने वाले टेक्स्ट डेटा का पता लगाएं और उसकी दिशा बताएं फ़ॉर्मैट किए गए मैसेज का इस्तेमाल करें. आम तौर पर, आप किसी तरीके को कॉल करें, जैसा कि इस गाइड की मदद से, टेक्स्ट डेटा की दिशा तय करता है.

स्थान-भाषा डायरेक्ट्री और रिसॉर्स फ़ाइलें बनाएं

अगर आपको ज़्यादा भाषाओं के लिए सहायता चाहिए, तो इसके अंदर अतिरिक्त डायरेक्ट्री बनाएं res/. हर डायरेक्ट्री का नाम नीचे दिए गए फ़ॉर्मैट में होना चाहिए:

<resource type>-b+<language code>[+<country code>]

उदाहरण के लिए, values-b+es/ में स्ट्रिंग es भाषा कोड वाली स्थानीय भाषाओं के लिए संसाधन. इसी तरह, mipmap-b+es+ES/ में es वाली स्थान-भाषाओं के आइकॉन शामिल हैं भाषा कोड और ES देश कोड.

Android, स्थानीय भाषा की सेटिंग के हिसाब से सही संसाधन लोड करता है रनटाइम में डिवाइस इस्तेमाल करते हैं. ज़्यादा जानकारी के लिए, यह देखें वैकल्पिक संसाधन उपलब्ध कराएं.

यह तय करने के बाद कि कौनसी स्थान-भाषाएं इस्तेमाल करनी हैं, संसाधन सबडायरेक्ट्री बनाएं और फ़ाइलें शामिल हैं. उदाहरण के लिए:

MyProject/
    res/
       values/
           strings.xml
       values-b+es/
           strings.xml
       mipmap/
           country_flag.png
       mipmap-b+es+ES/
           country_flag.png

संसाधन फ़ाइलों में स्थानीय जगह के अनुसार संसाधन डालें. स्थानीय जगह के अनुसार स्ट्रिंग और इमेज रिसॉर्स फ़ाइलों के उदाहरण यहां दिए गए हैं:

/values/strings.xml में अंग्रेज़ी स्ट्रिंग (डिफ़ॉल्ट स्थान:)

<resources>
    <string name="hello_world">Hello World!</string>
</resources>

/values-b+es/strings.xml में स्पैनिश स्ट्रिंग (es स्थान):

<resources>
    <string name="hello_world">¡Hola Mundo!</string>
</resources>

इसमें अमेरिकी फ़्लैग आइकॉन (डिफ़ॉल्ट स्थान-भाषा) /mipmap/country_flag.png:

उस झंडे का आइकॉन
संयुक् त राज् य

दूसरा डायग्राम. डिफ़ॉल्ट (en_US) स्थान-भाषा के लिए इस्तेमाल होने वाला आइकॉन.

स्पैनिश फ़्लैग आइकॉन (es_ES स्थान-भाषा) /mipmap-b+es+ES/country_flag.png:

के झंडे का आइकॉन
स्पेन

तीसरी इमेज. es_ES स्थान के लिए इस्तेमाल किया गया आइकॉन.

ध्यान दें: आपके पास कॉन्फ़िगरेशन क्वालीफ़ायर का इस्तेमाल करने का विकल्प है, जैसे, किसी भी संसाधन टाइप पर स्थान-भाषा का क्वालीफ़ायर. उदाहरण के लिए, हो सकता है कि अपने बिट मैप ड्रॉबल के स्थानीय वर्शन उपलब्ध कराने के लिए कर सकते हैं. ज़्यादा जानकारी के लिए, ऐप्लिकेशन को स्थानीय भाषा में लिखना लेख पढ़ें.

अपने ऐप्लिकेशन में संसाधन इस्तेमाल करना

यहां दिए गए लिंक पर क्लिक करके, अपने सोर्स कोड और अन्य एक्सएमएल फ़ाइलों में मौजूद संसाधनों का रेफ़रंस दिया जा सकता है हर संसाधन का name एट्रिब्यूट: R.<resource type>.<resource name>. अलग-अलग तरह के जो इस तरह से संसाधन स्वीकार करते हैं, जैसा कि नीचे दिए गए उदाहरणों में दिखाया गया है:

Kotlin

// Get a string resource
val hello = resources.getString(R.string.hello_world)

// Or supply a string resource to a method that requires a string
TextView(this).apply {
    setText(R.string.hello_world)
}

Java

// Get a string resource
String hello = getResources().getString(R.string.hello_world);

// Or supply a string resource to a method that requires a string
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);

एक्सएमएल फ़ाइलों में, सिंटैक्स के साथ किसी संसाधन को देखा जा सकता है @<resource type>/<resource name> जब भी एक्सएमएल एट्रिब्यूट के लिए, ज़रूरत के हिसाब से वैल्यू दी जा सकती है, जैसा कि इस उदाहरण में दिखाया गया है:

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@mipmap/country_flag" />

ध्यान दें: यह पक्का करने के लिए कि उपयोगकर्ता की भाषा की सेटिंग को प्राथमिकता दी गई है सही में, resConfigs प्रॉपर्टी का इस्तेमाल करके अपने ऐप्लिकेशन में इस्तेमाल की जा सकने वाली भाषाएं तय करें. इसके लिए ज़्यादा जानकारी के लिए, देखें उन भाषाओं के बारे में बताएं जो आपके ऐप्लिकेशन में काम करती हैं.

मैसेज के टेक्स्ट को फ़ॉर्मैट करना

किसी ऐप्लिकेशन के सबसे सामान्य कामों में से एक है टेक्स्ट को फ़ॉर्मैट करना. स्थानीय जगह के अनुसार मैसेज टेक्स्ट और न्यूमेरिक डेटा को सही जगहों पर डालकर फ़ॉर्मैट किए जाते हैं. माफ़ करें, आरटीएल यूज़र इंटरफ़ेस (यूआई) या आरटीएल डेटा के साथ काम करते समय, आसान फ़ॉर्मैटिंग गलत या न पढ़ा जा सकने वाला टेक्स्ट आउटपुट दिखाना.

अरबी, हिब्रू, फ़ारसी, और उर्दू जैसी भाषाओं को RTL लिखा जाता है. हालांकि, नंबर और एम्बेड किए गए जैसे कुछ एलिमेंट एलटीआर टेक्स्ट को आरटीएल टेक्स्ट के अंदर एलटीआर लिखा जाता है. अंग्रेज़ी के साथ-साथ एलटीआर स्क्रिप्ट का इस्तेमाल करने वाली भाषाएं भी दोतरफ़ा होती हैं. क्योंकि उनमें एम्बेड की गई RTL स्क्रिप्ट शामिल हो सकती हैं, जिन्हें RTL दिखाना ज़रूरी है.

ऐप्लिकेशन अक्सर इस तरह के एम्बेड किए गए विपरीत दिशा वाले टेक्स्ट के इंस्टेंस जनरेट करते हैं, जैसे, किसी आर्बिट्रेरी इमेज का टेक्स्ट डेटा डालकर स्थानीय भाषा के अनुसार मैसेज में आर्बिट्रेरी टेक्स्ट डायरेक्शन का इस्तेमाल कर सकते हैं. दिशा-निर्देशों का मिला-जुला रूप विपरीत दिशा वाला टेक्स्ट शुरू और खत्म होता है, इसलिए ऐप्लिकेशन से जनरेट हुआ टेक्स्ट के कारण उपयोगकर्ता अनुभव खराब हो सकता है.

हालांकि, आम तौर पर सिस्टम में दोतरफ़ा टेक्स्ट को डिफ़ॉल्ट तौर पर हैंडल करने की प्रोसेस टेक्स्ट उम्मीद के मुताबिक है, तो हो सकता है कि आपका ऐप्लिकेशन ठीक से रेंडर न हो उसे स्थानीय भाषा में लिखे गए मैसेज में डालता है. नीचे स्थितियों के उदाहरण दिए गए हैं जहां टेक्स्ट के गलत दिखने की संभावना हो:

  • मैसेज के शुरू में डाला गया टेक्स्ट:

    PERSON_NAME आपको कॉल कर रहा/रही है

  • नंबर से शुरू होने वाला टेक्स्ट, जैसे कि पता या टेलीफ़ोन नंबर:

    987 654-3210

  • विराम चिह्न से शुरू होने वाला टेक्स्ट, जैसे कि फ़ोन नंबर:

    +19876543210

  • विराम चिह्न के साथ खत्म होने वाला टेक्स्ट:

    क्या आपको वाकई ऐसा करना है?

  • वह टेक्स्ट जिसमें दोनों निर्देश पहले से मौजूद हैं:

    केले के लिए संबंधित लाइन वाला पिन, हीब्रू भाषा है.

उदाहरण

मान लीजिए कि किसी ऐप्लिकेशन को कभी-कभी "क्या आपका मतलब %s है?”, जिसमें रनटाइम के दौरान %s की जगह पता शामिल किया गया है. ऐप्लिकेशन, यूज़र इंटरफ़ेस (यूआई) में अलग-अलग स्थान-भाषा के साथ काम करता है. इसलिए, आपको मैसेज किसी खास स्थान-भाषा के हिसाब से ही मिलेगा संसाधन उपलब्ध कराता है और जब डिवाइस को RTL स्थान पर सेट किया जाता है, तो यह RTL दिशा का उपयोग करता है. उदाहरण के लिए, हिब्रू के लिए यूज़र इंटरफ़ेस (यूआई) पर, मैसेज इस तरह दिखेगा:

האה הכונת ל %s?

हालांकि, सुझाया गया पता किसी ऐसे डेटाबेस से आ सकता है जिसमें टेक्स्ट शामिल नहीं होता का इस्तेमाल किया जा सकता है. उदाहरण के लिए, अगर पता किसी जगह का है में शामिल है, तो यह डेटाबेस में अंग्रेज़ी टेक्स्ट का इस्तेमाल करके दिखता है. यदि आप पता "15 बे स्ट्रीट, लॉरेल, कैलिफ़ोर्निया" में बिना कोई रुकावट डाले टेक्स्ट दिशा से संबंधित संकेत, परिणाम अपेक्षित या सही नहीं है:

האה הכוהת ל 15 Bay Street, Laurel, कैलिफ़ोर्निया?

घर का नंबर पते की दाईं ओर दिखता है, उम्मीद के मुताबिक छोड़ दिया गया है. इससे घर का नंबर एक अजीब डाक के जैसा दिखता है कोड. यही समस्या तब भी आ सकती है, जब किसी मैसेज में, LTR टेक्स्ट की दिशा का इस्तेमाल करता है.

जानकारी और समाधान

इस उदाहरण में समस्या इसलिए आती है, क्योंकि टेक्स्ट फ़ॉर्मैट करने वाला टूल बताएं कि "15" पते का हिस्सा है, इसलिए सिस्टम यह तय नहीं कर सकता कि क्या "15" आरटीएल टेक्स्ट का हिस्सा, इससे पहले आने वाले आरटीएल टेक्स्ट या आने वाले एलटीआर टेक्स्ट का है उसके बाद.

इस सवाल को हल करने के लिए, BidiFormatter में दिए गए unicodeWrap() तरीके का इस्तेमाल करें क्लास. यह तरीका, स्ट्रिंग की दिशा का पता लगाता है और उसे यूनिकोड में रैप कर देता है फ़ॉर्मैटिंग वर्ण जो उस दिशा के बारे में बताते हैं.

नीचे दिया गया कोड स्निपेट, unicodeWrap():

Kotlin

val mySuggestion = "15 Bay Street, Laurel, CA"
val myBidiFormatter: BidiFormatter = BidiFormatter.getInstance()

// The "did_you_mean" localized string resource includes
// a "%s" placeholder for the suggestion.
String.format(getString(R.string.did_you_mean), myBidiFormatter.unicodeWrap(mySuggestion))

Java

String mySuggestion = "15 Bay Street, Laurel, CA";
BidiFormatter myBidiFormatter = BidiFormatter.getInstance();

// The "did_you_mean" localized string resource includes
// a "%s" placeholder for the suggestion.
String.format(getString(R.string.did_you_mean),
        myBidiFormatter.unicodeWrap(mySuggestion));

क्योंकि "15" अब टेक्स्ट के अंदर दिखाई देता है, एलटीआर के तौर पर बताए गए हैं, तो यह सही जगह पर दिखाया जाता है:

ההא AdMob ההכונת ל 15 Bay Street, Laurel, CA?

unicodeWrap() तरीके का इस्तेमाल इन पर करें टेक्स्ट का हर वह हिस्सा जिसे स्थानीय भाषा में लिखे गए मैसेज में शामिल किया जाता है. हालांकि, इनमें से कोई एक शर्त लागू नहीं होती:

  • टेक्स्ट को एक ऐसी स्ट्रिंग में डाला जा रहा है जिसे मशीन आसानी से पढ़ सके, जैसे कि यूआरआई या एसक्यूएल क्वेरी का इस्तेमाल करें.
  • आपको पता है कि टेक्स्ट का टुकड़ा पहले से ही सही तरह से रैप किया गया है.

ध्यान दें: अगर आपका ऐप्लिकेशन Android 4.3 (एपीआई लेवल 18) को टारगेट करता है या बाद के वर्शन का इस्तेमाल करने के लिए, BidiFormatter के उस वर्शन का इस्तेमाल करें जो Android फ़्रेमवर्क. या फिर, Google Ads खाते का BidiFormatter सहायता लाइब्रेरी में मौजूद है.

नंबर फ़ॉर्मैट करना

इस्तेमाल की जाने वाली चीज़ें फ़ॉर्मैट स्ट्रिंग होती है, न कि मेथड कॉल. लॉजिक:

Kotlin

var myIntAsString = "$myInt"

Java

String myIntAsString = String.format("%d", myInt);

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

जब आप String.format() ऐसे डिवाइस पर एसक्यूएल क्वेरी जो ऐसी स्थान-भाषा पर सेट है जो खुद के अंकों का सेट इस्तेमाल करती है, जैसे कि पर्शियन और ज़्यादातर अरबी भाषाएँ, तो क्वेरी में कोई भी पैरामीटर होने पर समस्या आती है नंबर हैं. ऐसा इसलिए है, क्योंकि संख्या को स्थान-भाषा के अंकों के हिसाब से फ़ॉर्मैट किया गया है, और SQL में ये अंक अमान्य हैं.

इसके बजाय, ASCII फ़ॉर्मैट वाले नंबर सुरक्षित रखने और SQL क्वेरी को मान्य रखने के लिए, आपको का ओवरलोडेड वर्शन String.format() वह पहले पैरामीटर के तौर पर स्थान-भाषा शामिल होती है. स्थान-भाषा आर्ग्युमेंट का इस्तेमाल करें Locale.US.

लेआउट का डुप्लीकेट वर्शन बनाना

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

इमेज 4 में, स्क्रीन के LTR वर्शन के बीच का कंट्रास्ट दिखाया गया है. Settings ऐप्लिकेशन और इसके RTL वर्शन:

नोटिफ़िकेशन क्षेत्र ऊपरी-दाएं कोने के पास दाईं ओर संरेखित है,
           ऐप बार में मेन्यू बटन सबसे ऊपर बाएं कोने के पास होता है,
           स्क्रीन के मुख्य हिस्से में कॉन्टेंट बाईं ओर अलाइन है और दिखता है
           एलटीआर है और &#39;वापस जाएं&#39; बटन सबसे नीचे बाएं कोने के पास है और
           बाईं ओर इशारा करते हैं. सूचना क्षेत्र ऊपरी-बाएं कोने के पास बाईं ओर संरेखित है,
            ऐप बार में मेन्यू बटन, सबसे ऊपर दाएं कोने के पास में होता है
            का मुख्य भाग दाईं ओर अलाइन है और RTL है, और
            &#39;वापस जाएं&#39; बटन सबसे नीचे दाएं कोने के पास है और
            दाईं ओर
चौथी इमेज. सेटिंग स्क्रीन के LTR और RTL के वैरिएंट.

अपने ऐप्लिकेशन में आरटीएल सहायता जोड़ते समय, इन बातों को ध्यान में रखें:

  • आरटीएल टेक्स्ट का डुप्लीकेट वर्शन बनाने की सुविधा सिर्फ़ ऐप्लिकेशन में तब काम करती है, जब इसका इस्तेमाल चल रहे डिवाइसों पर किया जाता है Android 4.2 (एपीआई लेवल 17) या उसके बाद का वर्शन. टेक्स्ट का डुप्लीकेट वर्शन बनाने का तरीका जानने के लिए पुराने डिवाइसों पर ज़्यादा जानने के लिए, सहायता दें देखें.
  • यह जांचने के लिए कि आपका ऐप्लिकेशन, दाएं से बाएं टेक्स्ट में निर्देश देने की सुविधा देता है या नहीं, इस गाइड में बताए गए तरीके से, डेवलपर के लिए सेटिंग और टूल की मदद से जांच करें और लोगों को न्योता भेजें जो आपके ऐप्लिकेशन का इस्तेमाल करने के लिए आरटीएल स्क्रिप्ट का इस्तेमाल करते हैं.

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

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

बिल्ड और मेनिफ़ेस्ट फ़ाइलों में बदलाव करें

अपने ऐप्लिकेशन मॉड्यूल की build.gradle फ़ाइल और ऐप्लिकेशन मेनिफ़ेस्ट फ़ाइल में बदलाव करें इस तरह से:

build.gradle (Module: app)

ग्रूवी

android {
    ...
    defaultConfig {
        targetSdkVersion 17 // Or higher
        ...
    }
}

Kotlin

android {
    ...
    defaultConfig {
        targetSdkVersion(17) // Or higher
        ...
    }
}

AndroidManifest.xml

<manifest ... >
    ...
    <application ...
        android:supportsRtl="true">
    </application>
</manifest>

ध्यान दें: अगर आपका ऐप्लिकेशन Android 4.1.1 (एपीआई लेवल 16) को टारगेट करता है या कम है, तो किसी भी एट्रिब्यूट के साथ android:supportsRtl एट्रिब्यूट को अनदेखा कर दिया जाता है start और end एट्रिब्यूट की वैल्यू, जो इसमें दिखती हैं लेआउट फ़ाइलें भी शामिल हैं. इस मामले में, RTL लेआउट मिररिंग नहीं होती है अपने-आप अपडेट हो जाता है.

मौजूदा रिसॉर्स अपडेट करना

left और right को start में बदलें और end का इस्तेमाल, आपकी मौजूदा लेआउट रिसॉर्स फ़ाइलों में किया है. इससे फ़्रेमवर्क, आपके ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) एलिमेंट को इन चीज़ों के हिसाब से अलाइन करता है उपयोगकर्ता की भाषा सेटिंग होती है.

ध्यान दें: अपने संसाधनों को अपडेट करने से पहले, लेगसी ऐप्लिकेशन के लिए सहायता देना या Android 4.1.1 (एपीआई लेवल 16) और इससे पहले के वर्शन को टारगेट करने वाले ऐप्लिकेशन.

फ़्रेमवर्क की आरटीएल अलाइनमेंट की क्षमताओं का इस्तेमाल करने के लिए, यहां दिए गए एट्रिब्यूट में बदलाव करें ऐसी लेआउट फ़ाइलें जो टेबल 1 में दिखती हैं.

टेबल 1. एट्रिब्यूट इसका इस्तेमाल तब करें, जब आपके ऐप्लिकेशन में एक से ज़्यादा टेक्स्ट वाले दिशा-निर्देश काम करते हों

सिर्फ़ एलटीआर के साथ काम करने वाला एट्रिब्यूट एलटीआर और आरटीएल के साथ काम करने वाला एट्रिब्यूट
android:gravity="left" android:gravity="start"
android:gravity="right" android:gravity="end"
android:layout_gravity="left" android:layout_gravity="start"
android:layout_gravity="right" android:layout_gravity="end"
android:paddingLeft android:paddingStart
android:paddingRight android:paddingEnd
android:drawableLeft android:drawableStart
android:drawableRight android:drawableEnd
android:layout_alignLeft android:layout_alignStart
android:layout_alignRight android:layout_alignEnd
android:layout_marginLeft android:layout_marginStart
android:layout_marginRight android:layout_marginEnd
android:layout_alignParentLeft android:layout_alignParentStart
android:layout_alignParentRight android:layout_alignParentEnd
android:layout_toLeftOf android:layout_toStartOf
android:layout_toRightOf android:layout_toEndOf

दूसरी टेबल में दिखाया गया है कि सिस्टम, SDK टूल का टारगेट वर्शन, चाहे left और right एट्रिब्यूट हो तय की गई है और क्या start और end एट्रिब्यूट तय किया गया है.

टेबल 2. यूज़र इंटरफ़ेस (यूआई) एलिमेंट के अलाइनमेंट के व्यवहार के हिसाब से टारगेट SDK वर्शन और तय किए गए एट्रिब्यूट पर

Android 4.2 को टारगेट करना
(एपीआई लेवल 17) या ज़्यादा?
बायां और दायां परिभाषित किया गया है? शुरू और खत्म होने का समय तय किया गया? नतीजा
हां हां हां बदलाव करते समय, start और end का इस्तेमाल किया गया left और right
हां हां नहीं left और right का इस्तेमाल किया गया है
हां नहीं हां start और end का इस्तेमाल किया गया है
नहीं हां हां left और right का इस्तेमाल किया जा रहा है (start और end को अनदेखा किया जाता है)
नहीं हां नहीं left और right का इस्तेमाल किया गया है
नहीं नहीं हां start और end, left और right

दिशा-निर्देश और भाषा के हिसाब से संसाधन जोड़ें

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

Android 4.2 (एपीआई लेवल 17) और उसके बाद वाले वर्शन में, -ldrtl का इस्तेमाल किया जा सकता है (लेआउट-निर्देश-दाएं-से-बाएं) और -ldltr (लेआउट-निर्देशक बाएं से दाएं) संसाधन क्वालीफ़ायर. पीछे बनाए रखने के लिए मौजूदा संसाधनों के साथ काम करता है, तो Android के पुराने वर्शन संसाधन के भाषा क्वालिफ़ायर का इस्तेमाल करें.

मान लें कि आपको आरटीएल स्क्रिप्ट के साथ काम करने के लिए एक खास लेआउट फ़ाइल जोड़नी है, जैसे कि हीब्रू, ऐरेबिक, और पर्शियन भाषाएँ. ऐसा करने के लिए, आपकी res/ डायरेक्ट्री में layout-ldrtl/ डायरेक्ट्री, इस तरह से है नीचे दिए गए उदाहरण में दिखाया गया है:

res/
    layout/
        main.xml This layout file is loaded by default.
    layout-ldrtl/
        main.xml This layout file is loaded for languages using an
                 RTL text direction, including Arabic, Persian, and Hebrew.

अगर आपको लेआउट का कोई ऐसा वर्शन जोड़ना है जिसे सिर्फ़ ऐरेबिक टेक्स्ट, आपकी डायरेक्ट्री का स्ट्रक्चर इस तरह दिखता है:

res/
    layout/
        main.xml This layout file is loaded by default.
    layout-ar/
        main.xml This layout file is loaded for Arabic text.
    layout-ldrtl/
        main.xml This layout file is loaded only for non-Arabic
                 languages that use an RTL text direction.

ध्यान दें: भाषा के हिसाब से संसाधनों को प्राथमिकता दी जाती है लेआउट-दिशा-निर्देश के लिए खास संसाधन, जिन्हें डिफ़ॉल्ट के मुकाबले प्राथमिकता दी जाती है संसाधन.

इसके साथ काम करने वाले विजेट का इस्तेमाल करना

Android 4.2 (एपीआई लेवल 17) के बाद से, ज़्यादातर फ़्रेमवर्क यूज़र इंटरफ़ेस (यूआई) एलिमेंट, आरटीएल के साथ काम करते हैं टेक्स्ट की दिशा अपने-आप चालू हो जाती है. हालांकि, कई फ़्रेमवर्क एलिमेंट, जैसे कि ViewPager, आरटीएल टेक्स्ट के साथ काम नहीं करता है दिशा-निर्देश.

होम-स्क्रीन विजेट, RTL लेख की दिशा तब तक ही काम करते हैं, जब तक कि संबंधित मेनिफ़ेस्ट फ़ाइलों में एट्रिब्यूट असाइनमेंट शामिल होता है android:supportsRtl="true".

लेगसी ऐप्लिकेशन के लिए सहायता देना

अगर आपका ऐप्लिकेशन Android 4.1.1 (एपीआई लेवल 16) या इससे पहले के वर्शन को टारगेट करता है, तो इसके अलावा left और right विशेषताएं start और end.

यह देखने के लिए कि आपके लेआउट को RTL टेक्स्ट दिशा का इस्तेमाल करने की ज़रूरत है या नहीं, यह लॉजिक:

Kotlin

private fun shouldUseLayoutRtl(): Boolean {
    return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
        View.LAYOUT_DIRECTION_RTL == layoutDirection
    } else {
        false
    }
}

Java

private boolean shouldUseLayoutRtl() {
    if (android.os.Build.VERSION.SDK_INT >=
            android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
        return View.LAYOUT_DIRECTION_RTL == getLayoutDirection();
    } else {
        return false;
    }
}

ध्यान दें: साथ काम करने से जुड़ी समस्याओं से बचने के लिए, 23.0.1 वर्शन का इस्तेमाल करें या उससे ज़्यादा Android SDK टूल बनाने वाले टूल.

डेवलपर के लिए सेटिंग और टूल का इस्तेमाल करके जांच करना

Android 4.4 (एपीआई लेवल 19) या उसके बाद के वर्शन वाले डिवाइसों पर, इस सेटिंग को चालू किया जा सकता है इसकी दिशा में आरटीएल लेआउट की दिशा लागू करें उपयोगकर्ता के डिवाइस पर डेवलपर के लिए सेटिंग और टूल. यह सेटिंग इससे आपको LTR स्क्रिप्ट का इस्तेमाल करने वाले टेक्स्ट, जैसे कि अंग्रेज़ी टेक्स्ट को RTL में देखने की सुविधा मिलती है मोड.

ऐप्लिकेशन का लॉजिक अपडेट करें

इस सेक्शन में, आपके ऐप्लिकेशन के काम करने के तरीके के खास पहलुओं के बारे में बताया गया है अपडेट करें.

प्रॉपर्टी में किए गए बदलाव

आरटीएल से जुड़ी किसी भी प्रॉपर्टी में बदलाव को मैनेज करने के लिए, जैसे कि लेआउट दिशा, लेआउट पैरामीटर, पैडिंग, टेक्स्ट की दिशा, टेक्स्ट अलाइनमेंट, या ड्रॉ करने लायक पोज़िशनिंग करने के लिए— onRtlPropertiesChanged() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है कॉलबैक. यह कॉलबैक आपको मौजूदा लेआउट की दिशा पाने देता है और किसी गतिविधि के View ऑब्जेक्ट को उसी हिसाब से अपडेट करें.

व्यू

अगर ऐसा यूज़र इंटरफ़ेस (यूआई) विजेट बनाया जा रहा है जो सीधे तौर पर किसी गतिविधि की की समीक्षा करने के लिए, लेआउट की दिशा का इस्तेमाल किया जा सकता है. यह कोड स्निपेट इस प्रोसेस को पूरा करने का तरीका बताता है:

Kotlin

val config: Configuration = context.resources.configuration
view.layoutDirection = config.layoutDirection

Java

final Configuration config =
    getContext().getResources().getConfiguration();
view.setLayoutDirection(config.getLayoutDirection());

View क्लास के कई तरीकों के लिए अतिरिक्त ज़रूरी है विचार:

onMeasure()
टेक्स्ट की दिशा के आधार पर, व्यू का माप अलग-अलग हो सकता है.
onLayout()
अगर आपने लेआउट का इस्तेमाल खुद किया है, तो आपको किसी super() आपके onLayout() के वर्शन में और अडैप्टिव आरटीएल स्क्रिप्ट के साथ काम करने के लिए आपका कस्टम लॉजिक.
onDraw()
अगर आप कस्टम व्यू लागू कर रहे हैं या किसी नहीं है, तो आपको RTL स्क्रिप्ट के साथ काम करने के लिए अपना कोड अपडेट करना होगा. इसका इस्तेमाल करें ताकि यह पता लगाया जा सके कि आपका विजेट आरटीएल मोड में है या नहीं:

Kotlin

// On devices running Android 4.1.1 (API level 16) and lower,
// you can call the isLayoutRtl() system method directly.
fun isLayoutRtl(): Boolean = layoutDirection == LAYOUT_DIRECTION_RTL

Java

// On devices running Android 4.1.1 (API level 16) and lower,
// you can call the isLayoutRtl() system method directly.
public boolean isLayoutRtl() {
    return (getLayoutDirection() == LAYOUT_DIRECTION_RTL);
}

ड्रॉएबल

अगर आपके पास कोई ड्रॉबल है, जिसका आरटीएल लेआउट के डुप्लीकेट वर्शन बनाना है, तो पूरा करें डिवाइस पर चल रहे Android के वर्शन के हिसाब से इनमें से कोई एक चरण:

  • Android 4.3 (एपीआई लेवल 18) और इससे पहले के वर्शन वाले डिवाइसों पर, -ldrtl संसाधन फ़ाइलें जोड़ें और तय करें.
  • Android 4.4 (एपीआई लेवल 19) और इसके बाद वाले वर्शन पर, अपने ड्रॉ करने लायक एट्रिब्यूट को परिभाषित करते समय android:autoMirrored="true", इससे सिस्टम आपके लिए RTL लेआउट मिररिंग को मैनेज कर सकता है.

    ध्यान दें: android:autoMirrored एट्रिब्यूट सिर्फ़ ऐसे ड्रॉएबल के लिए काम करता है जिनकी दो-तरफ़ा मिररिंग होती है पूरे ड्रॉबल का ग्राफ़िकल मिररिंग होती है. अगर ड्रॉ करने लायक एकाधिक तत्व शामिल होते हैं, या यदि दिखाई देने वाले आपके ड्रॉ करने योग्य परिवर्तनों को तो आपको खुद ही इसका डुप्लीकेट वर्शन बनाना होगा. कभी भी मुमकिन है, तो किसी बाय-डायरेक्शनल एक्सपर्ट से बात करके पक्का करें कि मिरर किए गए ड्रॉबल ऐप्लिकेशन लोगों को बहुत काम के लगते हैं.

Gravity

अगर आपके ऐप्लिकेशन का लेआउट कोड Gravity.LEFT या Gravity.RIGHT, इन्हें बदलें Gravity.START और के लिए मान Gravity.END.

अगर आपके पास Kotlin या Java कोड है, जो Gravity.LEFT या Gravity.RIGHT प्रॉपर्टी, आप इस बदलाव के साथ काम करने के लिए absoluteGravity को सेट कर सकते हैं, ताकि layoutDirection.

उदाहरण के लिए, अगर इस कोड का इस्तेमाल किया जा रहा है:

Kotlin

when (gravity and Gravity.HORIZONTAL_GRAVITY_MASK) {
    Gravity.LEFT -> {
        // Handle objects that are left-aligned.
    }
    Gravity.RIGHT -> {
        // Handle objects that are right-aligned.
    }
}

Java

switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
    case Gravity.LEFT:
        // Handle objects that are left-aligned.
        break;
    case Gravity.RIGHT:
        // Handle objects that are right-aligned.
        break;
}

इसे निम्न में बदलें:

Kotlin

val absoluteGravity: Int = Gravity.getAbsoluteGravity(gravity, layoutDirection)
when (absoluteGravity and Gravity.HORIZONTAL_GRAVITY_MASK) {
    Gravity.LEFT -> {
        // Handle objects that are left-aligned.
    }
    Gravity.RIGHT -> {
        // Handle objects that are right-aligned.
    }
}

Java

final int layoutDirection = getLayoutDirection();
final int absoluteGravity =
        Gravity.getAbsoluteGravity(gravity, layoutDirection);
switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
    case Gravity.LEFT:
        // Handle objects that are left-aligned.
        break;
    case Gravity.RIGHT:
        // Handle objects that are right-aligned.
        break;
}

इसका मतलब है कि आपके पास अपने मौजूदा कोड को बाईं ओर अलाइन करने और दाईं ओर अलाइन की गई वैल्यू, भले ही start और आपके गुरुत्वाकर्षण मानों के लिए end.

ध्यान दें: गुरुत्व सेटिंग लागू करते समय, Gravity.apply() का ओवरलोडेड वर्शन जिसमें layoutDirection आर्ग्युमेंट.

मार्जिन और पैडिंग

अपने ऐप्लिकेशन में आरटीएल स्क्रिप्ट के साथ काम करने के लिए, मार्जिन और पैडिंग वैल्यू:

  • getMarginStart() का इस्तेमाल करें और के बजाय getMarginEnd() खास दिशा-निर्देश के हिसाब से एट्रिब्यूट leftMargin और rightMargin.
  • setMargins() का इस्तेमाल करते समय, left और right आर्ग्युमेंट, अगर आपके ऐप्लिकेशन को आरटीएल स्क्रिप्ट का पता चलता है.
  • अगर आपके ऐप्लिकेशन में कस्टम पैडिंग लॉजिक शामिल है, तो इसे बदलें setPadding() और setPaddingRelative().

हर ऐप्लिकेशन के हिसाब से, पसंदीदा भाषा चुनने की सुविधा

कई मामलों में, एक से ज़्यादा भाषाएं बोलने वाले उपयोगकर्ता अपने सिस्टम की भाषा को एक भाषा पर सेट करते हैं, जैसे कि अंग्रेज़ी—लेकिन और वे किसी खास ऐप्लिकेशन के लिए दूसरी भाषाएं चुनना चाहते हैं, जैसे कि डच, चाइनीज़ या हिन्दी. मदद के लिए ऐप्लिकेशन इन लोगों को बेहतर अनुभव देते हैं. Android 13 में ये सुविधाएं शामिल की गई हैं ऐसे ऐप्लिकेशन जो कई भाषाओं में काम करते हैं:

  • सिस्टम सेटिंग: एक ऐसी जगह होती है जहां उपयोगकर्ता सभी हर ऐप्लिकेशन के लिए पसंदीदा भाषा सेट की जा सकती है.

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

  • अतिरिक्त एपीआई: ये सार्वजनिक एपीआई, जैसे कि setApplicationLocales() और getApplicationLocales() तरीके LocaleManager, ऐप्लिकेशन को सिस्टम की भाषा से अलग भाषा सेट करने दें रनटाइम.

    जो ऐप्लिकेशन पसंद के मुताबिक इन-ऐप्लिकेशन भाषा पिकर का इस्तेमाल करते हैं वे इन एपीआई का इस्तेमाल करके, लोगों को भले ही वे अपनी भाषा क्यों न चुनें, एक जैसा उपयोगकर्ता अनुभव प्राथमिकताएं. सार्वजनिक एपीआई, बॉयलरप्लेट कोड की मात्रा को कम करने में भी आपकी मदद करते हैं. साथ ही, अगर स्प्लिट APK काम करते हैं, तो वे ऑटो बैकअप का भी समर्थन करते हैं ताकि ऐप्लिकेशन ऐप्लिकेशन-लेवल की उपयोगकर्ता भाषा सेटिंग सेव की जा सके.

    Android के पिछले वर्शन के साथ पुराने सिस्टम के साथ काम करने की सुविधा के लिए, इससे मिलते-जुलते एपीआई भी उपलब्ध हैं AndroidX में. हमारा सुझाव है कि आप इनका इस्तेमाल करें Appcompat 1.6.0-beta01 या उच्च.

    ज़्यादा जानने के लिए, नए नियमों और शर्तों को लागू करना APIs.

यह भी देखें:

अन्य संसाधन

पुराने डिवाइसों के साथ काम करने के बारे में ज़्यादा जानने के लिए, इन संसाधनों को देखें:

ब्लॉग पोस्ट