জাভাতে তার স্ট্রিং প্রতিনিধিত্ব থেকে লোকেল কীভাবে পাবেন?


109

লোকালের পদ্ধতিতে ফিরে আসার সাথে সাথে তার "প্রোগ্রাম্যাটিক নাম" থেকে লোকালের উদাহরণ পাওয়ার কোনও ঝাঁকুনি আছে কি toString()? একটি সুস্পষ্ট এবং কুরুচিপূর্ণ সমাধান স্ট্রিংকে বিশ্লেষণ করবে এবং তারপরে একটি নতুন লোকাল উদাহরণ তৈরি করবে, তবে এর পক্ষে আরও ভাল উপায় / প্রস্তুত সমাধান হতে পারে?

প্রয়োজনটি হ'ল আমি নিজের স্থানীয় লোকাল সহ একটি এসকিউএল ডাটাবেসে কিছু স্থানীয় স্থানীয় নির্দিষ্ট সেটিংস সঞ্চয় করতে চাই, তবে সেখানে সিরিয়ালযুক্ত লোকেল বস্তুগুলি রাখা কুৎসিত হবে। আমি বরং তাদের স্ট্রিং উপস্থাপনাগুলি সংরক্ষণ করব, যা বিশদে যথেষ্ট পর্যাপ্ত বলে মনে হচ্ছে।

উত্তর:


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 কেন টোকনাইজার ব্যবহার করবেন, যদি জাভা আপনাকে প্রস্তুত পদ্ধতি দেয়? যেমন- লোকালে (স্ট্রিং স্ট্রিম) দয়া করে উত্তরের উদাহরণগুলি দেখুন
VdeX

9
আপনার লোকাল.ফোর্স ল্যাঙ্গুয়েজ ট্যাগ (স্ট্রিং)
রায়ান

126

স্ট্রিং থেকে লোকালে ফেরত দেওয়ার পদ্ধতিটি কমন্স-ল্যাং লাইব্রেরিতে বিদ্যমান রয়েছে: LocaleUtils.toLocale(localeAsString)


2
লোকালেটিলস.টোকলোক 'জেড-হানস', 'পিটি-পিটি' ইত্যাদির মতো স্ট্রিং সমর্থন করে না
হান্স ভ্যান ডোডওয়ার্ড

10
আপনার যদি -স্থানীয় অংশগুলির মধ্যে হাইফেন থাকে তবে আপনি আইইটিএফ বিসিপি 47 ট্যাগ নিয়ে কাজ করছেন, আপনি যদি জাভা 7 ব্যবহার করেন তবে আপনি ব্যবহার করতে পারেনLocale.forLanguageTag
জাইমে হাবলুটজেল

59

জাভা 7 থেকে আইইটিএফ ভাষা ট্যাগ ব্যবহার করে কারখানা পদ্ধতি Locale.forLanguageTagএবং উদাহরণ পদ্ধতি রয়েছে ।Locale.toLanguageTag


8
কেবল Locale.forLanguageTagএটিই জোর দিতে চাই যে আইইটিএফ লোকাল স্ট্রিংগুলি (যেমন en-US) কাজ করে এবং আইএসও লোকেল স্ট্রিংগুলির সাথে কাজ করে না (যেমন en_US)
ফ্যাবিয়ান

34
  1. জাভা যথাযথ প্রয়োগের সাথে প্রচুর পরিমাণে জটিলতা এড়ানো যায় provides এটি 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)

আরও পদ্ধতি অন্বেষণ করতে দয়া করে এই স্থানীয় এবং ইউটিএল পরীক্ষা করুন check


1
লোকাল ইউটেলস.টোলোকলে (লোকাল স্ট্রিংগ্রিপোভেশনেশন) কাজটি খুব সুন্দরভাবে করে। এছাড়াও আপনি যদি এই পদ্ধতির বাস্তবায়ন দেখতে পান তবে এটি বেশ বিস্তৃত!
ডিসিশ

15

বিকল্প 1 :

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

বিকল্প 2:

Locale.forLanguageTag("en-US")

দয়া করে নোট করুন বিকল্প 1 ভাষা এবং দেশের মধ্যে "আন্ডারস্কোর" এবং বিকল্প 2 হ'ল "ড্যাশ"।


কলটির জন্য এপিআই স্তর 21 প্রয়োজন (বর্তমান মিনিট 17): java.util.Locale # forLanguageTag
Vlad

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", "ডি_ডিই", "_জিবি", "এন_ ইউএস_উইন", "ডি__পোসিআইএক্স", "জেডএইচ_সিএন_ # হান্স", "zh_TW_ # হ্যান্ট-এক্স-জাভা ", এবং" তম_এইচটি_টি_এইচ # ইউ-নু-থাই "।

গুরুত্বপূর্ণ আপডেট : ডকুমেন্টেশন অনুযায়ী জাভা 7+ এ ব্যবহারের জন্য এটি প্রস্তাবিত নয় :

বিশেষত, ক্লায়েন্টরা যারা ভাষা, দেশ এবং বৈকল্পিক ক্ষেত্রগুলিতে টো স্ট্রিংয়ের আউটপুটকে বিশ্লেষণ করে তা চালিয়ে যেতে পারে (যদিও এটি দৃ strongly়ভাবে নিরুৎসাহিত করা হয়েছে ), যদিও স্ক্রিপ্ট বা এক্সটেনশন উপস্থিত থাকলে বৈকল্পিক ক্ষেত্রটিতে এতে অতিরিক্ত তথ্য থাকবে।

পরিবর্তে লোকাল.ফোর্ন ল্যাঙ্গুয়েজ ট্যাগ এবং লোকালে. টু ল্যাঙ্গুয়েজ ট্যাগ ব্যবহার করুন বা আপনার অবশ্যই প্রয়োজন হলে লোকাল.বিল্ডার।


5
জাভা 7 Locale.forLanguageTagকেবলমাত্র আইইটিএফ এর বিসিপি 47-তে উল্লিখিত এনকোডেড ভাষার ট্যাগগুলির জন্য প্রযোজ্য, একটি হাইফেন ( -) সহ, কোনও আন্ডারস্কোর ( _) Localeএর toStringপদ্ধতির প্রত্যাবর্তনের হিসাবে নয়
জাইমে হাবলুটজেল

1
তুমি ঠিক বলছো. বিদ্যমান লোকাল উপস্থাপনাগুলিকে বিসিপি 47 ফর্ম্যাটে রূপান্তর করার জন্য এখনও কিছু উপায় থাকা দরকার। আমার উদ্দেশ্যটি ছিল যে এগিয়ে যাওয়ার চেষ্টা করা Localeউচিত , সেগুলি তাদের toStringআকারে সংরক্ষণ করা উচিত নয় , তবে তাদের toLanguageTagআকারে, যা Localeআরও সহজে এবং নির্ভুলভাবে ফিরে যেতে পারে।
অ্যান্ডি

এই পদ্ধতিতে এমন অনেকগুলি প্রান্তের মামলা থাকবে না যা সূচককে সীমা ছাড়িয়ে যেতে পারে?
ব্যবহারকারী 2524908

@ ব্যবহারকারী 2524908: আমি এটি মনে করি না, কারণ তিনি সর্বদা অ্যারের দৈর্ঘ্যগুলির অ্যাক্সেসের আগে পরীক্ষা করে যাচ্ছেন testing সমাধানের অনেকগুলি প্রান্তের সমস্যা থাকতে পারে যেখানে এটি সঠিকভাবে কাজ করে না, তবে "সীমা
ছাড়িয়ে সূচকগুলি

9

আপনি যদি আপনার প্রকল্পে বসন্তের কাঠামো ব্যবহার করেন তবে আপনি এটি ব্যবহার করতে পারেন:

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

ডকুমেন্টেশন :

প্রদত্ত স্ট্রিং প্রতিনিধিত্বকে একটি লোকালে পার্স করুন


এর উপর দস্তাবেজগুলি বলে যে এটি বিশেষত বিপরীত Locale#toString()- নিখুঁত! :)
জোকুল

8

প্রচুর উত্তর সহ পুরানো প্রশ্ন, তবে এখানে আরও সমাধান:


জাভা 2 এর উদাহরণটি বেশ ভাল এবং এতে বৈকল্পিক হ্যান্ডলিংও রয়েছে
পল গ্রেগোয়ার

প্রথম ইউআরএল হ'ল আমি যা চেয়েছিলাম .. ধন্যবাদ
কেডি।

3

এটির valueOfজন্য কোনও স্থির পদ্ধতি বলে মনে হচ্ছে না , যা কিছুটা অবাক করার মতো।

একটি বরং কুৎসিত, কিন্তু সহজ, উপায়, আপনার মান সঙ্গে Locale.getAvailableLocales()তাদের toStringমান তুলনা করে পুনরাবৃত্তি হবে ।

খুব সুন্দর নয়, তবে কোনও স্ট্রিং পার্সিংয়ের প্রয়োজন নেই। আপনি Mapলোকালগুলিতে স্ট্রিংগুলির একটি প্রাক-জনবসতি করতে এবং সেই মানচিত্রে আপনার ডাটাবেস স্ট্রিংটি সন্ধান করতে পারেন।


আহ, পুনরাবৃত্তিটি বেশ যুক্তিসঙ্গত সমাধান হতে পারে। প্রকৃতপক্ষে এটি আশ্চর্যজনক যে লোকেলের কাছে এর জন্য কোনও স্থির পদ্ধতি নেই।
জুনাস পুলাক্কা

পূর্বনির্ধারিত Localeদৃষ্টান্তগুলি কেবলমাত্র বৈধ লোকেলের একটি খুব ছোট উপসেট উপস্থাপন করে। এটি কোনওভাবেই সম্পূর্ণ নয়।
বিটা রাইড

3

আপনি এটি অ্যান্ড্রয়েডে ব্যবহার করতে পারেন। আমার জন্য ভাল কাজ করে।

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)কন্সট্রাকটর।

প্রকৃতপক্ষে, ডিসপ্লে ল্যাঙ্গুয়েজের উপর নির্ভর করা বোঝানোর জন্য এটি লোকালের ল্যাঙ্গেজ ব্যবহার করে এটি প্রদর্শিত হয় যা আইসো ভাষা কোডের বিপরীতে এটি স্থানীয়কে নির্ভর করে তোলে।

উদাহরণস্বরূপ, এন লোকেলের কীটি স্ট্যাভেট হবে

en_EN
en_US

এবং তাই ...


1

কারণ আমি সবেমাত্র এটি প্রয়োগ করেছি:

ইন Groovy/ Grailsএটি হবে:

def locale = Locale.getAvailableLocales().find { availableLocale ->
      return availableLocale.toString().equals(searchedLocale)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.