जावा में अपने स्ट्रिंग प्रतिनिधित्व से लोकेल कैसे प्राप्त करें?


109

क्या लोकेल की विधि से अपने "प्रोग्राम नाम" से लोकेल उदाहरण प्राप्त करने का एक अच्छा तरीका है toString()? एक स्पष्ट और बदसूरत समाधान स्ट्रिंग को पार्स कर रहा होगा और फिर उसी के अनुसार एक नया लोकेल उदाहरण का निर्माण होगा, लेकिन शायद इसके लिए एक बेहतर तरीका / तैयार समाधान है?

जरूरत यह है कि मैं SQL डेटाबेस में कुछ लोकेल विशिष्ट सेटिंग्स को स्टोर करना चाहता हूं, जिसमें खुद लोकेल भी शामिल है, लेकिन यह स्थानीयकृत ऑब्जेक्ट्स को अनुक्रमित करने के लिए बदसूरत होगा। मैं उनके स्ट्रिंग अभ्यावेदन को संग्रहीत करूंगा, जो कि विस्तार से काफी पर्याप्त प्रतीत होगा।

जवाबों:


34

देखें Locale.getLanguage(), Locale.getCountry()... के बजाय डेटाबेस में इस संयोजन स्टोर "programatic name"...
जब आप लोकेल वापस निर्माण करना चाहते हैं, का उपयोग करेंpublic Locale(String language, String country)

यहाँ एक नमूना कोड है :)

// May contain simple syntax error, I don't have java right now to test..
// but this is a bigger picture for your algo...
public String localeToString(Locale l) {
    return l.getLanguage() + "," + l.getCountry();
}

public Locale stringToLocale(String s) {
    StringTokenizer tempStringTokenizer = new StringTokenizer(s,",");
    if(tempStringTokenizer.hasMoreTokens())
    String l = tempStringTokenizer.nextElement();
    if(tempStringTokenizer.hasMoreTokens())
    String c = tempStringTokenizer.nextElement();
    return new Locale(l,c);
}

3
यह भी संकलन नहीं होगा।
एड्रियन

1
@raj टोकेनाइज़र का उपयोग क्यों करें, यदि जावा आपको तैयार तरीके देता है? उदा। टोकाले (स्ट्रिंग str)। कृपया उत्तर में उदाहरण देखें
VdeX

9
आपको Locale.forLanguageTag (String)
Rian

126

विधि जो स्ट्रिंग से लोकेल लौटाती है वह कॉमन्स-लैंग लाइब्रेरी में मौजूद है: LocaleUtils.toLocale(localeAsString)


2
LocaleUtils.toLocale 'zh-Hans', 'pt-PT', इत्यादि जैसे स्ट्रिंग्स का समर्थन नहीं करता है
हंस वैन डोडेवार्ड

10
यदि आपके पास -लोकेल भागों के बीच एक हाइफ़न है जो आप IETF BCP 47 टैग के साथ काम कर रहे हैं, यदि आप जावा 7 का उपयोग कर रहे हैं तो आप उपयोग कर सकते हैंLocale.forLanguageTag
Jaime Hablutzel

59

जावा 7 के बाद से IETF भाषा टैग का उपयोग करके कारखाना विधि Locale.forLanguageTagऔर उदाहरण विधि है ।Locale.toLanguageTag


8
बस इस बात पर जोर देना चाहते हैं कि Locale.forLanguageTagIETF लोकेल स्ट्रिंग्स (यानी en-US) काम करता है और आईएसओ लोकेल स्ट्रिंग्स (यानी en_US)
Fabian

34
  1. जावा उचित कार्यान्वयन के साथ बहुत सी चीजें प्रदान करता है बहुत जटिलता से बचा जा सकता है। यह ms_MY देता है ।

    String key = "ms-MY";
    Locale locale = new Locale.Builder().setLanguageTag(key).build();
  2. अपाचे कॉमन्स को LocaleUtilsएक स्ट्रिंग प्रतिनिधित्व को पार्स करने में मदद करनी है। इससे en_US वापस आ जाएगा

    String str = "en-US";
    Locale locale =  LocaleUtils.toLocale(str);
    System.out.println(locale.toString());
  3. आप लोकल कंस्ट्रक्टर का भी इस्तेमाल कर सकते हैं।

    // Construct a locale from a language code.(eg: en)
    new Locale(String language)
    // Construct a locale from language and country.(eg: en and US)
    new Locale(String language, String country)
    // Construct a locale from language, country and variant.
    new Locale(String language, String country, String variant)

अधिक विधियों का पता लगाने के लिए कृपया इस लोकेल युटिल्स और इस लोकेल की जाँच करें ।


1
LocaleUtils.toLocale (localeStringRepresentation) बड़े करीने से काम करता है। यदि आप इस पद्धति के कार्यान्वयन को देखते हैं, तो यह काफी व्यापक है!
डिश

15

विकल्प 1 :

org.apache.commons.lang3.LocaleUtils.toLocale("en_US")

विकल्प 2 :

Locale.forLanguageTag("en-US")

कृपया ध्यान दें कि विकल्प 1 भाषा और देश के बीच "अंडरस्कोर" है, और विकल्प 2 "डैश" है।


कॉल के लिए एपीआई स्तर 21 (वर्तमान मिनट 17 है) की आवश्यकता है: java.util.Locale # forLanguageTag
व्लाद

12

यह उत्तर थोड़ा देर से हो सकता है, लेकिन यह पता चला है कि स्ट्रिंग को पार्स करना उतना बदसूरत नहीं है जितना ओपी ने माना था। मैंने इसे काफी सरल और संक्षिप्त पाया:

public static Locale fromString(String locale) {
    String parts[] = locale.split("_", -1);
    if (parts.length == 1) return new Locale(parts[0]);
    else if (parts.length == 2
            || (parts.length == 3 && parts[2].startsWith("#")))
        return new Locale(parts[0], parts[1]);
    else return new Locale(parts[0], parts[1], parts[2]);
}

मैंने इसको (जावा 7 पर) लोकेल.टोस्ट्रिंग () प्रलेखन: "en", "de_DE", "_GB", "en_US_WIN", "de__POSIX", "zh_CN_ # हंस", "zh_TW__" में दिए गए सभी उदाहरणों के साथ परीक्षण किया। # हंट-एक्स-जावा ", और" th_TH_TH_ # u-nu-थाई "।

महत्वपूर्ण अद्यतन : यह प्रलेखन के अनुसार जावा 7+ में उपयोग के लिए अनुशंसित नहीं है :

विशेष रूप से, क्लाइंट जो भाषा, देश, और वैरिएंट फ़ील्ड में आउटपुट को पार्स करते हैं (हालांकि यह दृढ़ता से हतोत्साहित किया जाता है ), हालांकि स्क्रिप्ट या एक्सटेंशन मौजूद होने पर वेरिएंट फ़ील्ड में अतिरिक्त जानकारी होगी।

इसके बजाय Locale.forLanguageTag और Locale.toLanguageTag का उपयोग करें, या यदि आप अवश्य करें, तो Locale.Blilder।


5
जावा 7 Locale.forLanguageTagकेवल लैंग्वेज टैग्स के लिए लागू होता है, जो कि IETF के BCP 47 में संकेतित है, एक हाइफ़न ( -) के साथ, अंडरस्कोर ( _) नहीं है जैसा कि Locale' toStringमेथड
Jaime Hablutzel

1
आप सही हे। मौजूदा लोकेल अभ्यावेदन को BCP47 प्रारूप में बदलने के लिए अभी भी किसी तरह की आवश्यकता है। मेरा इरादा यह सुझाव देना था कि आगे बढ़ते हुए, Localeउनके toStringरूप में संग्रहीत नहीं किया जाना चाहिए , लेकिन उनके toLanguageTagरूप में, जो कि Localeअधिक आसानी से और सटीक रूप से वापस परिवर्तनीय है।
andy

क्या इस पद्धति में बहुत से किनारे मामले नहीं होंगे जो सूचकांक को सीमा से बाहर कर सकते हैं?
user2524908

@ user2524908: मुझे ऐसा नहीं लगता, क्योंकि वह हमेशा अपने तत्वों तक पहुंचने से पहले सरणी की लंबाई का परीक्षण कर रहा है। समाधान में कई किनारे मामले हो सकते हैं जहां यह ठीक से काम नहीं करता है, लेकिन "सीमा से बाहर नहीं"
मेस्टेलियन

9

यदि आप अपने प्रोजेक्ट में स्प्रिंग फ्रेमवर्क का उपयोग कर रहे हैं, तो आप भी उपयोग कर सकते हैं:

org.springframework.util.StringUtils.parseLocaleString("en_US");

प्रलेखन :

दिए गए स्ट्रिंग प्रतिनिधित्व को लोकेल में पार्स करें


इस पर डॉक्स कहते हैं कि यह विशेष रूप से उलटा है Locale#toString()- एकदम सही! :)
jocull

8

पुराने सवालों के जवाब के साथ बहुत कुछ है, लेकिन यहाँ अधिक समाधान है:


Java2 का उदाहरण बहुत अच्छा है और इसमें वियरेबल हैंडलिंग भी शामिल है
पॉल ग्रेगोइरे

पहला URL सब मैं चाहता था .. धन्यवाद
केडी।

3

इसके लिए कोई स्थैतिक valueOfतरीका प्रतीत नहीं होता है , जो थोड़ा आश्चर्यजनक है।

एक बल्कि बदसूरत, लेकिन सरल, तरीका, अपने मूल्य के साथ Locale.getAvailableLocales()उनके toStringमूल्यों की तुलना करना, इसे पुनरावृत्त करना होगा ।

बहुत अच्छा नहीं है, लेकिन कोई स्ट्रिंग की आवश्यकता नहीं है। आप Mapस्ट्रिंग्स के स्थानीय लोगों को प्री-पॉप्युलेट कर सकते हैं और उस मैप में अपने डेटाबेस स्ट्रिंग को देख सकते हैं।


आह, पुनरावृत्ति काफी एक उचित समाधान हो सकता है। वास्तव में यह आश्चर्य की बात है कि लोकेल के पास इसके लिए एक स्थिर तरीका नहीं है।
जूनास पुलका

पूर्वनिर्धारित Localeउदाहरण केवल वैध स्थानों के एक बहुत ही सूक्ष्म उपसमूह का प्रतिनिधित्व करते हैं। यह किसी भी तरह से पूर्ण नहीं है।
BetaRide

3

आप इसे Android पर उपयोग कर सकते हैं। मेरे लिए ठीक काम करता है।

private static final Pattern localeMatcher = Pattern.compile
        ("^([^_]*)(_([^_]*)(_#(.*))?)?$");

public static Locale parseLocale(String value) {
    Matcher matcher = localeMatcher.matcher(value.replace('-', '_'));
    return matcher.find()
            ? TextUtils.isEmpty(matcher.group(5))
                ? TextUtils.isEmpty(matcher.group(3))
                    ? TextUtils.isEmpty(matcher.group(1))
                        ? null
                        : new Locale(matcher.group(1))
                    : new Locale(matcher.group(1), matcher.group(3))
                : new Locale(matcher.group(1), matcher.group(3),
                             matcher.group(5))
            : null;
}

1

ठीक है, मैं कुंजी के रूप में एक स्ट्रिंग संघनन Locale.getISO3Language(), getISO3Country()और getVariant () के बजाय संग्रहीत करूंगा, जो मुझे बाद के इंस्टॉलर के लिए अनुमति देगा Locale(String language, String country, String variant)

वास्तव में, DisplayLanguage का भरोसा करने का अर्थ है इसे प्रदर्शित करने के लिए लोकेल के लैंगेज का उपयोग करना, जो इसे स्थानीय भाषा पर निर्भर करता है, जो कि आईएसओ भाषा कोड के विपरीत है।

एक उदाहरण के रूप में, एन लोकेल कुंजी के रूप में यादगार होगा

en_EN
en_US

और इसी तरह ...


1

क्योंकि मैंने अभी इसे लागू किया है:

इसमें Groovy/ Grailsयह होगा:

def locale = Locale.getAvailableLocales().find { availableLocale ->
      return availableLocale.toString().equals(searchedLocale)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.