รับภาษาปัจจุบันในอุปกรณ์


608

เราจะเลือกภาษาปัจจุบันในอุปกรณ์ Android ได้อย่างไร?


10
คำตอบส่วนใหญ่ที่นี่รับภาษาของแอปพลิเคชัน ระบุว่าคุณสามารถตั้งค่าโลแคลเริ่มต้นของแอปพลิเคชันในรหัสได้คำตอบที่ถูกต้องคือคำตอบที่ Sarpe กำหนด - ซึ่งให้ตำแหน่งของอุปกรณ์ของคุณ
Victor Ionescu

@VictorIonescu ขอบคุณสำหรับความคิดเห็น คำตอบของ Sarpe คือคำตอบที่ถูกต้องในการดึงข้อมูลตำแหน่งที่ตั้งของอุปกรณ์ กรุณาอ้างอิง stackoverflow.com/a/28498119/3762067
Varad Mondkar

คำตอบ:


834

หากคุณต้องการได้รับภาษาที่เลือกในอุปกรณ์ของคุณสิ่งนี้อาจช่วยคุณได้:

Locale.getDefault().getDisplayLanguage();

73
getDisplayLanguage () จะแปลภาษาเป็นภาษาท้องถิ่น หากคุณสนใจที่จะรับรหัส ISO (เช่นสำหรับ if หรือ switch statement) ให้ใช้ 'Locale.getDefault (). getISO3Language ();'
nuala

13
getISO3Language () ส่งคืนสิ่งต่าง ๆ เช่น "deu" สำหรับ Deutschland (ประเทศเยอรมนี) แทน de ...
Tobias

372
คุณสามารถใช้Locale.getDefault().getLanguage();เพื่อรับรหัสภาษาปกติ (เช่น "de", "en")
muscardinus

35
@DeRagan นี่จะไม่ให้ภาษากับอุปกรณ์ของคุณเสมอไป แต่สำหรับแอปของคุณเท่านั้น ตัวอย่างเช่นถ้าผมเรียกLocale.setDefault("ru")และภาษาในการตั้งค่าระบบถูกตั้งค่าเป็นภาษาอังกฤษแล้ววิธีการLocale.getDefault().getLanguage()จะกลับมา"RU"แต่ไม่"en" มีวิธีอื่นในการรับภาษา / ระบบจริงหรือไม่ ผมพบว่าวิธีการแก้ปัญหาไม่ได้รับการบันทึกไว้ที่นี่แต่มีทางออกที่สวยงามมากขึ้น?
Prizoff

47
ฉันชอบLocale.getDefault().toString()ที่จะให้สตริงที่ระบุสถานที่อย่างเต็มที่เช่น "en_US"
Tom

835

ฉันได้ตรวจสอบวิธี Locale บนอุปกรณ์ Android 4.1.2 ของฉันแล้วและผลลัพธ์:

Locale.getDefault().getLanguage()       ---> en      
Locale.getDefault().getISO3Language()   ---> eng 
Locale.getDefault().getCountry()        ---> US 
Locale.getDefault().getISO3Country()    ---> USA 
Locale.getDefault().getDisplayCountry() ---> United States 
Locale.getDefault().getDisplayName()    ---> English (United States) 
Locale.getDefault().toString()          ---> en_US
Locale.getDefault().getDisplayLanguage()---> English
Locale.getDefault().toLanguageTag()     ---> en-US

7
ขอบคุณมากด้วยรายการความเป็นไปได้ คุณกรุณาเพิ่ม "Locale.getDefault (). toString ()" ตามที่แนะนำในความคิดเห็นโดย "Tom"
RenniePet

ฉันสับสน คุณเพิ่งคัดลอกคำตอบจาก DeRagan หรือไม่?
Dieter

1
ขอโทษด้วยกับเรื่องนั้น. มันเป็นความจริงฉันเพิ่มเข้าไปในนั้น ฉันควรจะทิ้งข้อความไว้มันมาจากที่นี่ ฉันทำผิดพลาดพยายามช่วยให้ผู้คนค้นหาคำตอบที่พวกเขาต้องการได้เร็วขึ้น เพราะเห็นได้ชัดว่าคุณคือคำตอบที่ดีกว่า แต่แน่นอนว่าคุณจะไม่มีวันขึ้นไปสู่อันดับต้น ๆ เพราะผู้คนมักจะไม่เห็นบ่อยที่สุด มันไม่เป็นไรถ้าเราเพิ่มเข้าไปในนั้นด้วยโน้ตที่มาจากคำตอบนี้?
Patrick Boos

1
สวัสดีอีกครั้ง. ฉันไม่ชอบวิธีแก้ปัญหานั้น ขณะนี้คำตอบของ DeRagan ปรากฏขึ้นเป็นอันดับแรกและของฉันจะแสดงเป็นอันดับที่สอง สำหรับนักวิจัยไม่ควรตรวจสอบคำตอบที่สองในหน้าคำถาม มันจะดีกว่าถ้า @pinki เปลี่ยนคำตอบที่ยอมรับ แต่ดูเหมือนว่า Pinki จะเห็นเมื่อ 3 เดือนที่แล้ว
trante

1
นอกจากนี้ยังมีสิ่งLocale.getDefault().getDisplayLanguage()ที่จะส่งกลับ"English"
กีฬา

105

สิ่งที่ทำงานให้ฉันคือ:

Resources.getSystem().getConfiguration().locale;

Resources.getSystem() ส่งคืนออบเจกต์ร่วมทรัพยากรระดับโลกที่ให้การเข้าถึงทรัพยากรระบบเท่านั้น (ไม่มีทรัพยากรแอปพลิเคชัน) และไม่ได้กำหนดค่าสำหรับหน้าจอปัจจุบัน (ไม่สามารถใช้หน่วยมิติไม่เปลี่ยนแปลงตามการวางแนว ฯลฯ )

เนื่องจากgetConfiguration.localeขณะนี้เลิกใช้แล้ววิธีที่ต้องการในการรับสถานที่หลักใน Android Nougat คือ:

Resources.getSystem().getConfiguration().getLocales().get(0);

เพื่อรับประกันความเข้ากันได้กับ Android เวอร์ชันก่อนหน้าวิธีแก้ปัญหาที่เป็นไปได้คือการตรวจสอบง่ายๆ:

Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = Resources.getSystem().getConfiguration().getLocales().get(0);
} else {
    //noinspection deprecation
    locale = Resources.getSystem().getConfiguration().locale;
}

ปรับปรุง

เริ่มต้นด้วยไลบรารีการสนับสนุน26.1.0คุณไม่จำเป็นต้องตรวจสอบเวอร์ชั่น Android เนื่องจากมันมีวิธีการที่ใช้งานร่วมกันได้getLocales()อย่างสะดวกสบาย

เพียงโทร:

ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());

6
getConfiguration (). locale เลิกใช้แล้วในขณะนี้ใช้ getConfiguration (). getLocales (). รับ (0) แทน
Eliseo Ocampos

4
นี่คือคำตอบที่ถูกต้องสำหรับคำถามนี้ คำตอบอื่น ๆ ให้ใช้แอพในเครื่องไม่ใช่อุปกรณ์
hofs

6
ฉันไม่ทราบว่ามีสิ่งนี้เกิดขึ้นเมื่อเขียนคำตอบหรือไม่ แต่ห้องสมุดสนับสนุนมีเวอร์ชันที่ใช้งานร่วมกันได้ของรุ่นหลังนี้ไม่จำเป็นต้องเขียนความเข้ากันได้ย้อนหลังด้วยตัวเอง ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear

ดังที่ @Thorbear ชี้ให้เห็นตอนนี้การใช้วิธีการไลบรารีสนับสนุนใหม่getLocalesเป็นวิธีที่จะไป ฉันอัพเดตคำตอบแล้ว
Sarpe

นี่คือคำตอบที่ถูก อื่น ๆ ส่งคืนภาษาของแอปพลิเคชันไม่ใช่ระบบ
Chintan Rathod

44

คุณสามารถ 'แยก' ภาษาจากภาษาปัจจุบัน คุณสามารถแตกโลแคลผ่าน Java API มาตรฐานหรือโดยใช้บริบท Android ตัวอย่างเช่นสองบรรทัดด้านล่างเทียบเท่า:

String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();

10
นี่ไม่เป็นความจริง. พวกเขาแตกต่าง. สิ่งแรกสามารถเปลี่ยนแปลงได้หากผู้ใช้เปลี่ยนโลแคล ที่สองคือที่ติดตั้งไว้ในโทรศัพท์ ไม่เคยเปลี่ยนแปลงไม่ว่าผู้ใช้จะทำอะไร
gregm

16
ความคิดเห็นโดย gregm อาจเป็นเท็จ ดูคำตอบโดย airewyre
jan groth

4
ความคิดเห็นของ @ gregm ผิด ลองใช้ด้วยตัวคุณเองแล้วคุณจะเห็นว่า Locale.getDefault () จะเปลี่ยนเมื่อคุณเปลี่ยนภาษาในการตั้งค่า
Patrick Boos


แม้ว่าความคิดเห็นของ @ gregm ผิด แต่เขาก็ยังถูกต้องทั้งสองบรรทัดไม่จำเป็นต้องส่งคืนสถานที่เดียวกัน เพียงโทรหาLocale.setDefault()สถานที่อื่นก่อนและคุณจะได้รับผลลัพธ์ที่แตกต่างกัน
arekolek

35

เพื่อประหยัดเวลาและ / หรือความสับสนของผู้อื่นฉันต้องการแบ่งปันว่าฉันได้ลองทั้งสองทางเลือกที่เสนอโดย Johan Pelgrim ด้านบนและบนอุปกรณ์ของพวกเขาเทียบเท่า - ไม่ว่าจะเปลี่ยนตำแหน่งเริ่มต้นหรือไม่

ดังนั้นการตั้งค่าเริ่มต้นของอุปกรณ์ของฉันคือภาษาอังกฤษ (United Kindom) และอยู่ในสถานะนี้ตามที่คาดไว้ทั้งสองคำตอบ Strings ใน Johan ให้ผลเหมือนกัน ถ้าฉันเปลี่ยนสถานที่ในการตั้งค่าโทรศัพท์ (พูดกับ italiano (Italia)) และเรียกใช้อีกครั้ง Strings ทั้งสองในคำตอบของ Johan จะให้ locale เป็น italiano (Italia)

ดังนั้นฉันเชื่อว่าโพสต์ต้นฉบับของ Johan นั้นถูกต้องและความคิดเห็นของ gregm นั้นไม่ถูกต้อง



17

คุณสามารถใช้สิ่งนี้

boolean isLang = Locale.getDefault().getLanguage().equals("xx");

เมื่อ "xx" เป็นรหัสภาษาใด ๆ เช่น "en", "fr", "sp", "ar" .... และอื่น ๆ


3
if (Locale.ENGLISH.equals (Locale.getDefault (). getLanguage ())) {... }
Clement Martino

1
@ClementMartino ข้อเสนอแนะของคุณก็โอเคในกรณีของสถานที่ที่กำหนดไว้ล่วงหน้าเช่นภาษาอังกฤษ แต่สำหรับสถานที่อื่น ๆ เช่นภาษาอาหรับเราต้องแยกวิเคราะห์โดยใช้รหัส lang
Simon K. Gerges

8

หากระดับ API เป็น 24 หรือสูงกว่าให้ใช้วิธีLocaleList.getDefault().get(0).getLanguage() อื่นLocale.getDefault.getLanguage()

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

การอ้างอิง: https://developer.android.com/guide/topics/resources/multilingual-support


มันควรจะเป็นคำตอบที่ยอมรับได้ในปี 2020!
Andrii Kovalchuk

6

เพื่อเพิ่มคำตอบของ Johan Pelgrim

context.getResources().getConfiguration().locale
Locale.getDefault()

มีความเท่าเทียมกันเนื่องจากandroid.text.format.DateFormatคลาสใช้ทั้งสองอย่างสลับกันได้เช่น

private static String zeroPad(int inValue, int inMinDigits) {
    return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
}

และ

public static boolean is24HourFormat(Context context) {
    String value = Settings.System.getString(context.getContentResolver(),
            Settings.System.TIME_12_24);

    if (value == null) {
        Locale locale = context.getResources().getConfiguration().locale;

    // ... snip the rest ...
}

5

คุณสามารถลองรับโลแคลจากทรัพยากรระบบได้:

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();

1
นี่คือคำตอบในกรณีที่คุณแทนที่ส่วนใดส่วนหนึ่งของการกำหนดค่า
Takhion

4

คำตอบข้างต้นไม่แยกความแตกต่างระหว่างภาษาจีนแบบง่ายกับภาษาจีนดั้งเดิม Locale.getDefault().toString()งานที่ส่งคืน "zh_CN", "zh_TW", "en_US" และอื่น ๆ

การอ้างอิงถึง: https://developer.android.com/reference/java/util/Locale.html , ISO 639-1 คือ OLD


4

วิธีนี้ใช้ได้ผลสำหรับฉัน สิ่งนี้จะส่งคืนภาษาของอุปกรณ์ Android (ไม่ใช่ภาษาท้องถิ่นของแอป)

String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();

การดำเนินการนี้จะส่งคืน "en" หรือ "de" หรือ "fr" หรือภาษาที่อุปกรณ์ของคุณตั้งไว้


3

คุณสามารถใช้รหัสนี้เพื่อค้นหาคีย์บอร์ดปัจจุบัน

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();

3

มีสองภาษา

ภาษาเริ่มต้นของระบบปฏิบัติการ:

Locale.getDefault().getDisplayLanguage();

ภาษาปัจจุบันของการใช้งาน:

getResources().getConfiguration().locale.getDisplayLanguage();//return string

3
นั่นไม่เป็นความจริงถ้าคุณเปลี่ยนสถานที่เกิดเหตุในแอปของคุณก่อนอื่นให้เปลี่ยนค่าและไม่ใช่ค่าระบบ
ถึงกระ

3

หากคุณเลือกภาษาคุณไม่สามารถพิมพ์ภาษากรีกนี้ได้อาจเป็นประโยชน์

getDisplayLanguage().toString() = English
getLanguage().toString() = en 
getISO3Language().toString() = eng
getDisplayLanguage()) = English
getLanguage() = en
getISO3Language() = eng

ตอนนี้ลองด้วยภาษากรีก

getDisplayLanguage().toString() = Ελληνικά
getLanguage().toString() = el
getISO3Language().toString() = ell
getDisplayLanguage()) = Ελληνικά
getLanguage() = el
getISO3Language() = ell

3

หากคุณต้องการตรวจสอบภาษาปัจจุบันให้ใช้คำตอบของ @Sarpe (@Thorbear):

val language = ConfigurationCompat.getLocales(Resources.getSystem().configuration)?.get(0)?.language
// Check here the language.
val format = if (language == "ru") "d MMMM yyyy г." else "d MMMM yyyy"
val longDateFormat = SimpleDateFormat(format, Locale.getDefault())

DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date())หากคุณต้องการที่จะใช้รูปแบบวันที่ท้องถิ่นของผู้ใช้
CoolMind

1
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
    // your code here
}

2
โปรดเพิ่มรายละเอียดเกี่ยวกับสาเหตุที่คำถามนี้ตอบเพียงแค่ข้อมูลโค้ดจะไม่ช่วยให้ผู้อ่านเข้าใจวิธีการแก้ปัญหา
Wand Maker

Locale.getDefault (). getDisplayName () ให้ภาษาปัจจุบันของอุปกรณ์ของคุณ และเรากำลังตรวจสอบว่าภาษาของอุปกรณ์เป็นภาษาฮินดีหรือไม่ .. หากภาษาของอุปกรณ์ปัจจุบันเป็นภาษาฮินดีให้ทำสิ่งที่คุณต้องการในบล็อก
Pratibha Sarode

1

วิธีที่ถูกต้องในการรับภาษาของอุปกรณ์ของคุณคือ:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    return context.getResources().getConfiguration().getLocales().get(0);
} else {
    return context.getResources().getConfiguration().locale;
}

หวังว่ามันจะช่วย


1
Locale.getDefault().getDisplayLanguage()

จะให้Writtenชื่อคุณแก่ภาษาตัวอย่างเช่นEnglish, Dutch, French

Locale.getDefault().getLanguage()

จะให้language codeตัวอย่างเช่น:en, nl, fr

ทั้งสองวิธีคืนค่าสตริง


1
public class LocalUtils {

    private static final String LANGUAGE_CODE_ENGLISH = "en";


    // returns application language eg: en || fa ...
    public static String getAppLanguage() {
        return Locale.getDefault().getLanguage();
    }

    // returns device language eg: en || fa ...
    public static String getDeviceLanguage() {
        return ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getLanguage();
    }

    public static boolean isDeviceEnglish() {
        return getDeviceLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
    }

    public static boolean isAppEnglish() {
        return getAppLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
    }


}

Log.i("AppLanguage: ",     LocalUtils.getAppLanguage());
Log.i("DeviceLanguage: ",  LocalUtils.getDeviceLanguage());
Log.i("isDeviceEnglish: ", String.valueOf(LocalUtils.isDeviceEnglish()));
Log.i("isAppEnglish: ",    String.valueOf(LocalUtils.isAppEnglish()));

1

ผู้อื่นได้รับคำตอบที่ดีสำหรับภาษาของอุปกรณ์

หากคุณต้องการให้ภาษาแอปวิธีที่ง่ายที่สุดคือการเพิ่มapp_langรหัสลงในstrings.xmlไฟล์ของคุณและระบุภาษาสำหรับแต่ละภาษาด้วย

ด้วยวิธีนี้หากภาษาเริ่มต้นของแอปของคุณแตกต่างจากภาษาของอุปกรณ์คุณสามารถเลือกที่จะส่งเป็นพารามิเตอร์สำหรับบริการของคุณ


ฉันไม่อยากจะเชื่อเลยว่าไม่มีการสนับสนุนกรอบการทำงานเพื่อให้ภาษาแก่คุณที่ AssetManager กำลังใช้งานอยู่ อันที่จริงผู้ช่วยรูปแบบสตริงใน Resources.java ใช้ภาษาเริ่มต้น [0] ดังนั้นหากสตริงจาก AssetManager มาจากภาษาที่ไม่ตรงกับสถานที่เริ่มต้นของอุปกรณ์ (เพราะแอปของคุณไม่รองรับ แต่สนับสนุนเช่น ในรายการ) จากนั้นมีข้อบกพร่อง
dcow

1
public void GetDefaultLanguage( ) {
    try {
        String langue = Locale.getDefault().toString(); //        ---> en_US
        /*
        Log.i("TAG", Locale.getDefault().getLanguage() ); //       ---> en
        Log.i("TAG", Locale.getDefault().getISO3Language()  ); //  ---> eng
        Log.i("TAG", Locale.getDefault().getCountry()  ); //       ---> US
        Log.i("TAG", Locale.getDefault().getISO3Country()  ); //   ---> USA
        Log.i("TAG", Locale.getDefault().getDisplayCountry() ); // ---> United States
        Log.i("TAG", Locale.getDefault().getDisplayName() ); //    ---> English (United States)
        Log.i("TAG", Locale.getDefault().toString()   ); //        ---> en_US
        Log.i("TAG", Locale.getDefault().getDisplayLanguage() ); //---> English 
        */

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            langue = Locale.getDefault().toLanguageTag(); //     ---> en-US
            url_Api = getUrlMicrosoftLearn(langue);
            Log.i("TAG", url_Api );
            Log.i("TAG", langue );
        }else{
            langue = langue.replace("_","-"); //     ---> en-US
            url_Api = getUrlMicrosoftLearn(langue);
            Log.i("TAG", url_Api );
            Log.i("TAG", langue );
        }
    }catch (Exception ex) {
        Log.i("TAG", "Exception:GetDefaultLanguage()", ex);
    }
}

public String getUrlMicrosoftLearn(String langue) {
    return "https://docs.microsoft.com/"+langue+"/learn";
}

มันจะดีกว่าถ้าคุณสามารถเพิ่มคำแนะนำให้กับคำตอบได้มากกว่าการวางโค้ด
Calos

0

ทางออกของฉันเป็นเช่นนี้

@SuppressWarnings("deprecation")
public String getCurrentLocale2() {
    return Resources.getSystem().getConfiguration().locale.getLanguage();
}

@TargetApi(Build.VERSION_CODES.N)
public Locale getCurrentLocale() {
    getResources();
    return Resources.getSystem().getConfiguration().getLocales().get(0);
}

แล้ว

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                Log.e("Locale", getCurrentLocale().getLanguage());
            } else {
                Log.e("Locale", getCurrentLocale2().toString());
            }

แสดง ---> en


0

นี่คือรหัสเพื่อรับประเทศของอุปกรณ์ เข้ากันได้กับ Android ทุกรุ่นแม้กระทั่ง oreo

วิธีแก้ปัญหา: หากผู้ใช้ไม่มีซิมการ์ดมากกว่ารับประเทศเขาจะใช้ระหว่างการตั้งค่าโทรศัพท์หรือการเลือกภาษาปัจจุบัน

public static String getDeviceCountry(Context context) {
    String deviceCountryCode = null;

    final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

        if(tm != null) {
            deviceCountryCode = tm.getNetworkCountryIso();
        }

    if (deviceCountryCode != null && deviceCountryCode.length() <=3) {
        deviceCountryCode = deviceCountryCode.toUpperCase();
    }
    else {
        deviceCountryCode = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getCountry().toUpperCase();
    }

  //  Log.d("countryCode","  : " + deviceCountryCode );
    return deviceCountryCode;
}

-3

หากคุณต้องการทำงานเฉพาะสำหรับผู้ใช้ที่อาศัยอยู่ในอินเดียที่พูดภาษาฮินดีให้ใช้เงื่อนไขด้านล่าง

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
 //Block executed only for the users resides in India who speaks Hindi 
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.