অ্যান্ড্রয়েড বর্তমান লোকাল পান, ডিফল্ট নয়


299

আমি কীভাবে অ্যান্ড্রয়েডে ব্যবহারকারীর বর্তমান লোকাল পাব?

আমি ডিফল্টটি পেতে পারি, তবে এটি বর্তমানেরটি সঠিক নাও হতে পারে?

মূলত আমি বর্তমান লোকেলের কাছ থেকে দুটি বর্ণের ভাষার কোড চাই। ডিফল্ট নয়। এমন কিছু নেইLocale.current()


default()এটি একটি নিরাপদ বাজি, কেবল এটি প্রক্রিয়াজাতকরণের জন্য ব্যবহার করবেন না (যেমন ডক্স বলবে)।
এ - সি

@ এ - সি এটি প্রক্রিয়াজাতকরণের জন্য ব্যবহার করবেন?
সিকিউএম

হ্যাঁ, দস্তাবেজগুলি কী বলে দেখুন: কিছু লোকেল ',' দশমিক বিন্দু এবং 'হিসাবে ব্যবহার করবে। ডিজিট গ্রুপিংয়ের জন্য সুতরাং parseInt () এর মতো জিনিসগুলি ব্যর্থ হতে পারে। মনে রাখবেন যে তারা এখনও ব্যবহারের পরামর্শ দিচ্ছেন default(), তবে কোড ভঙ্গ করতে পারে এমন স্টাফের জন্য নয়।
এ - সি

উত্তর:


487

Localeসিস্টেম সম্পত্তি বৈশিষ্ট্যগুলি থেকে আপনার অ্যাপ্লিকেশন প্রক্রিয়াটির জন্য রানটাইমের সময়ে ডিফল্টটি স্থিতিশীলভাবে নির্মিত হয়, সুতরাং যখন অ্যাপ্লিকেশনটি চালু হয়েছিল তখন এটিLocale সেই ডিভাইসে নির্বাচিত প্রতিনিধিত্ব করবে । সাধারণত, এটি ঠিক আছে, তবে এর অর্থ এই নয় যে ব্যবহারকারীরা যদি আপনার অ্যাপ্লিকেশন প্রক্রিয়াটি চলার পরে সেটিংসে সেগুলি পরিবর্তন করে তবে সম্ভবত এর মানটি অবিলম্বে আপডেট হবে না।LocalegetDefaultLocale()

আপনার অ্যাপ্লিকেশনটিতে কোনও কারণে যদি আপনাকে এই জাতীয় ইভেন্টগুলি ফাঁদে ফেলতে হয় তবে আপনি পরিবর্তে Localeউত্স Configurationঅবজেক্ট থেকে উপলব্ধ করার চেষ্টা করতে পারেন

Locale current = getResources().getConfiguration().locale;

আপনার অ্যাপ্লিকেশনটির জন্য এটি প্রয়োজনীয় হলে কোনও মান সেটিংস পরিবর্তনের পরে এই মানটি আরও দ্রুত আপডেট করা হতে পারে।


1
আপনি যখন সিস্টেমে পরিবর্তন করেন তখন কি কেউ পরীক্ষা করে দেখেছিল যে ডিফল্ট লোকাল অ্যাপ্লিকেশনটিতে পরিবর্তিত হয়নি? আমি মনে করি এটি সেই "কনফিগারেশন পরিবর্তনগুলি "
গুলির মধ্যে একটি

11
আমি এটি পরীক্ষা করেছি, লোকেল পরিবর্তন করতে গিয়ে উভয়কেই আউটপুট দিয়েছি; ফলাফল, আউটপুট একই। সুতরাং অবিলম্বে আপডেট হওয়ার সাথে সাথে Locale.getDefault () নিরাপদে ব্যবহার করা যেতে পারে। Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
আলেসিও

58
এটি কনফিগারেশন ক্লাসে locale This field was deprecated in API level 24. Do not set or read this directly. Use getLocales() and setLocales(LocaleList). If only the primary locale is needed, getLocales().get(0) is now the preferred accessor.
অবহেলা

7
কেন তারা এই অদ্ভুত getLocales ()। (পেতে 0) ​​এড়ানোর জন্য একটি getFirstLocale () পদ্ধতি যুক্ত করবেন না?
ব্যবহারকারী 3290180

1
আপনি যদি এপিআই-র পুরানো এবং নতুন সংস্করণগুলি সমর্থন করতে চান তবে কী হবে?
ইভান

179

অ্যান্ড্রয়েড এন (এপি স্তরের 24) আপডেট (কোনও সতর্কতা নেই):

   Locale getCurrentLocale(Context context){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
            return context.getResources().getConfiguration().getLocales().get(0);
        } else{
            //noinspection deprecation
            return context.getResources().getConfiguration().locale;
        }
    }

6
সমর্থন লাইব্রেরিতে যদি অন্যথায় এড়াতে কিছু থাকে?
ফেডেরিকো পঞ্জি

8
@ টার্গেটপি (বিল্ড.ভর্জিশন_সিডিএসএন) আপনার কোডে প্রয়োজন নেই যদি আপনি যদি ও ফলব্যাক কোড অন্তর্ভুক্ত করেন
প্যাট্রিক ফ্যাভ্রে

@ ফেডেরিকোপোনজি কোনও রিসোর্স কমপ্যাট 25-21.1 স্থানীয় অবস্থানের জন্য কোনও পদ্ধতি বলে মনে হচ্ছে না
প্যাট্রিক

2
ব্যবহারকারীর একাধিক ভাষা ইনস্টল থাকলে এটি কাজ করতে পারে না। আপনার ব্যবহার LocaleList.getDefault().get(0);করা উচিত কারণ এটি পছন্দসই ভাষার দ্বারা সাজানো লোকালগুলি ফিরিয়ে দেবে।
কোঁকড়া

21
@ ফেডারিকোপোনজি @ for3st আমি এটি খুঁজে পেয়েছি ConfigurationCompat, যেমনConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
যুবাল

62

আপনি যদি অ্যান্ড্রয়েড সাপোর্ট লাইব্রেরি ব্যবহার করছেন তবে ConfigurationCompatঅবনতি সতর্কতা থেকে মুক্তি পেতে আপনি @ মাকালেলের পদ্ধতির পরিবর্তে ব্যবহার করতে পারেন :

Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);

বা কোটলিনে:

val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0]

7
আপনার যদি কোনও প্রসঙ্গ না থাকে তবে আপনিও করতে পারেনConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
কোয়ান্টিন জি

@QuentinG। হ্যাঁ, তবে এই ক্ষেত্রে অ্যাপ্লিকেশন প্রসঙ্গটি ব্যবহার করা আরও ভাল ।
ম্যাকমাথ

সুতরাং পরিষ্কার হয়ে উঠুন, এটি কি ডিফল্ট লোকালে ফিরে আসবে না তবে ব্যবহারকারী লোকাল পছন্দ করবেন?
সিএসবা তোথ

12

থেকে getDefaultএর ডকুমেন্টেশন:

ব্যবহারকারীর পছন্দসই লোকেল ফেরত দেয়। এটি সেটডিফল্ট (লোকাল) দিয়ে এই প্রক্রিয়াটির জন্য ওভাররাইড করা হতে পারে।

Localeডক্স থেকেও :

ডিফল্ট লোকেল সেই কাজের জন্য উপযুক্ত যা ব্যবহারকারীর কাছে ডেটা উপস্থাপনের সাথে জড়িত।

মনে হচ্ছে আপনার এটি ব্যবহার করা উচিত।


7
এই উত্তরটি ভুল, একটি ডিফল্ট লোকাল পেয়েছে তবে ব্যবহারকারী যদি উড়ে এটি পরিবর্তন করে তবে এটি ভুল দেখায়। পরবর্তী উত্তরটি সঠিক
ব্যবহারকারীর 70317

রাজি, ভুল উত্তর। আমার ক্ষেত্রে, আমি গেটআরসোর্সগুলি () ব্যবহার না করার একটি উপায় খুঁজছিলাম, যার অর্থ আমার একটি প্রসঙ্গ দরকার। আমার সমস্যাটি হেল্পার ক্লাস ছিল যার প্রসঙ্গ নেই, তবে অনুমান করুন আমি এটিকে পাস করব। আপনাকে ডিভনওয়ার্ডের প্রতিক্রিয়া ব্যবহার করতে হবে
মিমি 12

আমার জন্য কাজ। যদি আমি ব্রেকআপপয়েন্ট সেট করি Locale.setDefault(), আমি ডিভাইসটির ভাষা কমপক্ষে অ্যান্ড্রয়েড 5.0-এ ফিরে যাব তখনই এটি ডাকা হবে (এটি আমি যতদূর পরীক্ষা দিয়েছি)
ক্যামবুনকটিয়াস

6

উপরের সমস্ত উত্তর - কাজ করে না। সুতরাং আমি এখানে একটি ফাংশন রাখব যা 4 এবং 9 অ্যান্ড্রয়েডে কাজ করে

private String getCurrentLanguage(){
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
      return LocaleList.getDefault().get(0).getLanguage();
   } else{
      return Locale.getDefault().getLanguage();
   }
}

ডিভাইস স্তরে ব্যবহারকারীর পছন্দসই ভাষার দিকনির্দেশ দেয় এমন কয়েকটি উত্তরের একটি। আপনি LocaleListCompat.getDefault()অ্যান্ড্রয়েডএক্স ব্যবহার করলে আপনিও ব্যবহার করতে পারেন।
স্যাম

1

আমি এটি ব্যবহার করেছি:

String currentLanguage = Locale.getDefault().getDisplayLanguage();
if (currentLanguage.toLowerCase().contains("en")) {
   //do something
}

0

অফিসিয়াল ডকুমেন্টেশন অনুসারে কনফিগারেশনকম্প্যাট সমর্থন লাইব্রেরিতে অবনতিযুক্ত

আপনি ব্যবহার বিবেচনা করতে পারেন

LocaleListCompat.getDefault()[0].toLanguageTag() 0 তম অবস্থান ব্যবহারকারী পছন্দসই লোকেল হবে be

ডিফল্ট লোকেল পেতে 0 তম অবস্থানে থাকতে হবে LocaleListCompat.getAdjustedDefault()


হ্যাঁ কিন্তু এটি androidx ConfigurationCompat সংস্করণ দিয়ে প্রতিস্থাপিত করা হয়েছে করেনি, দেখতে developer.android.com/reference/androidx/core/os/...
DragonLord

ঠিক আছে, সম্ভবত এটি কেবলমাত্র অ্যান্ড্রয়েডেক্স মাইগ্রেশনের কারণে উল্লেখ করা হয়েছে
রক্ষিত সনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.