Android
Android में संसाधनों के साथ स्थानीयकरण
खोज…
मुद्रा
Currency currency = Currency.getInstance("USD");
NumberFormat format = NumberFormat.getCurrencyInstance();
format.setCurrency(currency);
format.format(10.00);
अपने Android एप्लिकेशन में अनुवाद जोड़ना
आपको हर नई भाषा के लिए एक अलग strings.xml
फ़ाइल बनानी होगी।
- Res फ़ोल्डर पर राइट-क्लिक करें
- नया → मान संसाधन फ़ाइल चुनें
- उपलब्ध क्वालीफायर में से एक स्थान का चयन करें
- नेक्स्ट बटन (>>) पर क्लिक करें
- भाषा चुनें
- फ़ाइल का नाम strings.xml
strings.xml
<resources>
<string name="app_name">Testing Application</string>
<string name="hello">Hello World</string>
</resources>
strings.xml (hi)
<resources>
<string name="app_name">परीक्षण आवेदन</string>
<string name="hello">नमस्ते दुनिया</string>
</resources>
भाषा को प्रोग्रामेटिक रूप से सेट करना:
public void setLocale(String locale) // Pass "en","hi", etc.
{
myLocale = new Locale(locale);
// Saving selected locale to session - SharedPreferences.
saveLocale(locale);
// Changing locale.
Locale.setDefault(myLocale);
android.content.res.Configuration config = new android.content.res.Configuration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
config.setLocale(myLocale);
} else {
config.locale = myLocale;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
getBaseContext().createConfigurationContext(config);
} else {
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
}
}
उपरोक्त फ़ंक्शन उन टेक्स्ट फ़ील्ड को बदल देगा, जिन्हें स्ट्रिंग्स . xml से संदर्भित किया गया है। उदाहरण के लिए, मान लें कि आपके पास निम्नलिखित दो पाठ दृश्य हैं:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello"/>
फिर, लोकेल को बदलने के बाद, आईडी app_name
और hello
वाले भाषा स्ट्रिंग को तदनुसार बदला जाएगा।
"रेस" फ़ोल्डर के तहत संसाधन निर्देशिकाओं का प्रकार
जब विभिन्न प्रकार के संसाधनों का स्थानीयकरण आवश्यक होता है, जिनमें से प्रत्येक के पास एंड्रॉइड प्रोजेक्ट संरचना में अपना घर होता है। निम्नलिखित विभिन्न निर्देशिकाएं हैं जिन्हें हम \res
निर्देशिका के अंतर्गत रख सकते हैं। इनमें से प्रत्येक निर्देशिका में रखे गए संसाधन प्रकारों को नीचे दी गई तालिका में समझाया गया है:
निर्देशिका | संसाधन प्रकार |
---|---|
एनिमेटर / | XML फाइलें जो संपत्ति एनिमेशन को परिभाषित करती हैं। |
anim / | XML फाइलें जो ट्विन एनिमेशन को परिभाषित करती हैं। (संपत्ति एनिमेशन को इस निर्देशिका में भी सहेजा जा सकता है, लेकिन संपत्ति के एनिमेशन को दो प्रकारों के बीच अंतर करने के लिए एनिमेटर / निर्देशिका को प्राथमिकता दी जाती है।) |
रंग/ | XML फाइलें जो रंगों की एक राज्य सूची को परिभाषित करती हैं। रंग राज्य सूची संसाधन देखें |
drawable / | "बिटमैप फाइलें (.png, .9.png, .jpg, .gif) या एक्सएमएल फाइलें जो निम्नलिखित ड्रा करने योग्य संसाधन उपप्रकारों में संकलित की जाती हैं: Bitmap files - Nine-Patches (re-sizable bitmaps) - State lists - Shapes - Animation drawables - Other drawables - " |
मिपमैप / | अलग-अलग लॉन्चर आइकन घनत्व के लिए ड्रा करने योग्य फाइलें। लॉन्चर आइकन को mipmap / फ़ोल्डरों के साथ प्रबंधित करने के बारे में अधिक जानकारी के लिए, मैनेजिंग प्रोजेक्ट्स ओवरव्यू देखें। |
लेआउट / | एक्सएमएल फाइलें जो एक यूजर इंटरफेस लेआउट को परिभाषित करती हैं। लेआउट संसाधन देखें। |
मेन्यू/ | एक्सएमएल फाइलें जो एप्लिकेशन मेनू को परिभाषित करती हैं, जैसे कि विकल्प मेनू, संदर्भ मेनू या उप मेनू। मेनू संसाधन देखें। |
कच्चा/ | अपने कच्चे रूप में सहेजने के लिए मनमानी फाइलें। एक कच्चे InputStream के साथ इन संसाधनों को खोलने के लिए, संसाधन ID के साथ Resources.openRawResource () पर कॉल करें, जो R.raw.filename है। |
हालाँकि, यदि आपको मूल फ़ाइल नामों और फ़ाइल पदानुक्रम तक पहुँच की आवश्यकता है, तो आप संपत्ति / निर्देशिका में कुछ संसाधनों को सहेजने पर विचार कर सकते हैं (बजाय / एकड़ / कच्ची /)। संपत्ति में फाइलें / एक संसाधन आईडी नहीं दी गई हैं, इसलिए आप उन्हें केवल एसेटमैन का उपयोग करके पढ़ सकते हैं। | |
मान / | एक्सएमएल फाइलें जिसमें सरल मूल्य होते हैं, जैसे कि तार, पूर्णांक और रंग, साथ ही शैली और थीम |
एक्सएमएल / | संसाधन XML.XXML () कॉल करके रनटाइम पर पढ़ी जा सकने वाली XML फ़ाइलें। विभिन्न XML कॉन्फ़िगरेशन फ़ाइलों को यहां सहेजा जाना चाहिए, जैसे कि खोज योग्य कॉन्फ़िगरेशन। |
"रिस" निर्देशिका के तहत प्रत्येक फ़ोल्डर के लिए कॉन्फ़िगरेशन प्रकार और क्वालीफायर नाम
res
फोल्डर के तहत प्रत्येक संसाधन निर्देशिका (ऊपर उदाहरण में सूचीबद्ध) में प्रत्येक नाम configuration-type
लिए अलग qualifier-values
अलग qualifier-values
साथ प्रत्यय वाली निर्देशिका में निहित संसाधनों के विभिन्न रूप हो सकते हैं।
विभिन्न क्वालिफायर मूल्यों के साथ `` निर्देशिका के रूपांतरों का उदाहरण प्रत्यय है जो अक्सर हमारे एंड्रॉइड प्रोजेक्ट्स में देखा जाता है:
- drawable /
- drawable एन /
- drawable-fr-आरसीए /
- drawable-en-बंदरगाह /
- drawable-en-notouch-12key /
- drawable पोर्ट-ldpi /
- drawable पोर्ट-notouch-12key /
Android संसाधनों के लिए सभी विभिन्न कॉन्फ़िगरेशन प्रकारों और उनके क्वालीफ़ायर मानों की व्यापक सूची:
विन्यास | क्वालिफायर वैल्यूज़ |
---|---|
एमसीसी और एमएनसी | उदाहरण: |
mcc310 | |
mcc310-mnc004 | |
mcc208-mnc00 | |
आदि। | |
भाषा और क्षेत्र | उदाहरण: |
en | |
fr | |
en-रस | |
fr-RFR | |
fr-आरसीए | |
लेआउट दिशा | ldrtl |
ldltr | |
smallestWidth | swdp |
उदाहरण: | |
sw320dp | |
sw600dp | |
sw720dp | |
उपलब्ध चौड़ाई | WDP |
w720dp | |
w1024dp | |
उपलब्ध ऊंचाई | HDP |
h720dp | |
h1024dp | |
स्क्रीन का आकार | छोटा |
साधारण | |
विशाल | |
एक्स बड़े | |
स्क्रीन पहलू | लंबा |
लंबे समय तक नहीं | |
गोल स्क्रीन | गोल |
notround | |
स्क्रीन दिशानिर्देश | बंदरगाह |
भूमि | |
यूआई मोड | गाड़ी |
डेस्क | |
टेलीविजन | |
appliancewatch | |
रात्री स्वरुप | रात |
notnight | |
स्क्रीन पिक्सेल घनत्व (डीपीआई) | ldpi |
mdpi | |
hdpi | |
xhdpi | |
xxhdpi | |
xxxhdpi | |
nodpi | |
tvdpi | |
anydpi | |
टचस्क्रीन प्रकार | स्पर्श न करें |
उंगली | |
कीबोर्ड की उपलब्धता | keysexposed |
keyshidden | |
keyssoft | |
प्राथमिक पाठ इनपुट विधि | nokeys |
qwerty | |
12key | |
नेविगेशन कुंजी उपलब्धता | navexposed |
navhidden | |
प्राथमिक गैर-स्पर्श नेविगेशन विधि | nonav |
dpad | |
ट्रैकबॉल | |
पहिया | |
प्लेटफ़ॉर्म संस्करण (API स्तर) | उदाहरण: |
v3 | |
v4 | |
v7 |
प्रोग्राम के अनुसार Android एप्लिकेशन का स्थान बदलें
उपरोक्त उदाहरणों में आप समझते हैं कि आवेदन के संसाधनों का स्थानीयकरण कैसे किया जाता है। उदाहरण के बाद समझाएं कि एप्लिकेशन को एप्लिकेशन में कैसे बदलना है, डिवाइस से नहीं। केवल एप्लिकेशन लोकेल को बदलने के लिए, आप लोकल उपयोग के नीचे उपयोग कर सकते हैं।
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.preference.PreferenceManager;
import android.view.ContextThemeWrapper;
import java.util.Locale;
/**
* Created by Umesh on 10/10/16.
*/
public class LocaleUtils {
private static Locale mLocale;
public static void setLocale(Locale locale){
mLocale = locale;
if(mLocale != null){
Locale.setDefault(mLocale);
}
}
public static void updateConfiguration(ContextThemeWrapper wrapper){
if(mLocale != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
Configuration configuration = new Configuration();
configuration.setLocale(mLocale);
wrapper.applyOverrideConfiguration(configuration);
}
}
public static void updateConfiguration(Application application, Configuration configuration){
if(mLocale != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1){
Configuration config = new Configuration(configuration);
config.locale = mLocale;
Resources res = application.getBaseContext().getResources();
res.updateConfiguration(configuration, res.getDisplayMetrics());
}
}
public static void updateConfiguration(Context context, String language, String country){
Locale locale = new Locale(language,country);
setLocale(locale);
if(mLocale != null){
Resources res = context.getResources();
Configuration configuration = res.getConfiguration();
configuration.locale = mLocale;
res.updateConfiguration(configuration,res.getDisplayMetrics());
}
}
public static String getPrefLangCode(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getString("lang_code","en");
}
public static void setPrefLangCode(Context context, String mPrefLangCode) {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putString("lang_code",mPrefLangCode);
editor.commit();
}
public static String getPrefCountryCode(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getString("country_code","US");
}
public static void setPrefCountryCode(Context context,String mPrefCountryCode) {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putString("country_code",mPrefCountryCode);
editor.commit();
}
}
अनुप्रयोग वर्ग से, उस उपयोगकर्ता को प्रारंभिक रूप से पसंद करें।
public class LocaleApp extends Application{
@Override
public void onCreate() {
super.onCreate();
LocaleUtils.setLocale(new Locale(LocaleUtils.getPrefLangCode(this), LocaleUtils.getPrefCountryCode(this)));
LocaleUtils.updateConfiguration(this, getResources().getConfiguration());
}
}
आपको आधार गतिविधि बनाने और इस गतिविधि को अन्य सभी गतिविधि तक विस्तारित करने की आवश्यकता है ताकि आप आवेदन का स्थान केवल एक ही स्थान पर बदल सकें:
public abstract class LocalizationActivity extends AppCompatActivity {
public LocalizationActivity() {
LocaleUtils.updateConfiguration(this);
}
// We only override onCreate
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
नोट: हमेशा कंस्ट्रक्टर में लोकेल को इनिशियलाइज़ करें।
अब आप स्थानीयकरण का उपयोग कर सकते हैं।
public class MainActivity extends LocalizationActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
नोट: जब आप प्रोग्राम के लोकल को प्रोग्रामेटिक रूप से बदलते हैं, तो लोकल चेंज के प्रभाव को लेने के लिए अपनी गतिविधि को फिर से शुरू करने की आवश्यकता है। इस समाधान के लिए ठीक से काम करने के लिए और ऐप स्टार्टअप पर साझा प्राथमिकताओं से लोकेल का उपयोग करने के लिए आपको
android:name=".LocaleApp"
। आप मेनिफेस्ट.एक्सएमएल।
कभी-कभी लिंट चेकर रिलीज बिल्ड बनाने के लिए संकेत देता है। इस तरह के मुद्दे को हल करने के लिए नीचे दिए गए विकल्पों का पालन करें।
प्रथम:
यदि आप कुछ स्ट्रिंग्स के लिए अनुवाद को अक्षम करना चाहते हैं, तो डिफ़ॉल्ट स्ट्रिंग स्ट्रिंग के लिए निम्नलिखित विशेषता जोड़ें
<string name="developer" translatable="false">Developer Name</string>
दूसरा:
संसाधन फ़ाइल से सभी अनुपलब्ध अनुवाद को अनदेखा करें निम्नलिखित विशेषता जोड़ें यह आपकी स्ट्रिंग फ़ाइल में उपकरण नामस्थान की अनदेखी विशेषता है, निम्नानुसार है:
<?xml version="1.0" encoding="utf-8"?>
<resources
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="MissingTranslation" >
http://stackoverflow.com/documentation/android/3345/localization-with-resources-in-android#
<!-- your strings here; no need now for the translatable attribute -->
</resources>
तीसरा:
गैर-अनुवाद योग्य स्ट्रिंग को अक्षम करने का दूसरा तरीका
http://tools.android.com/recent/non-translatablestrings
यदि आपके पास बहुत सारे संसाधन हैं, जिनका अनुवाद नहीं किया जाना चाहिए, तो आप उन्हें donottranslate.xml नामक फ़ाइल में रख सकते हैं और लिंट उन सभी को गैर-अनुवाद योग्य संसाधनों पर विचार करेगा।
चौथा:
आप संसाधन फ़ाइल में स्थान भी जोड़ सकते हैं
<resources
xmlns:tools="http://schemas.android.com/tools"
tools:locale="en" tools:ignore="MissingTranslation">
आप एप्लिकेशन / बिल्ड.gradle से लिंट के लिए लापता अनुवाद जांच को भी अक्षम कर सकते हैं
lintOptions {
disable 'MissingTranslation'
}