ฉันจะรับ Locale ปัจจุบันของผู้ใช้ใน Android ได้อย่างไร
ฉันจะได้รับค่าเริ่มต้น แต่สิ่งนี้อาจไม่ถูกต้องในปัจจุบันหรือไม่
โดยทั่วไปฉันต้องการรหัสภาษาสองตัวอักษรจากสถานที่ปัจจุบัน ไม่ใช่ค่าเริ่มต้น ไม่มีLocale.current()
ฉันจะรับ Locale ปัจจุบันของผู้ใช้ใน Android ได้อย่างไร
ฉันจะได้รับค่าเริ่มต้น แต่สิ่งนี้อาจไม่ถูกต้องในปัจจุบันหรือไม่
โดยทั่วไปฉันต้องการรหัสภาษาสองตัวอักษรจากสถานที่ปัจจุบัน ไม่ใช่ค่าเริ่มต้น ไม่มีLocale.current()
คำตอบ:
เริ่มต้นLocale
มีการก่อสร้างแบบคงที่รันไทม์สำหรับขั้นตอนการสมัครของคุณจากการตั้งค่าคุณสมบัติของระบบจึงจะเป็นตัวแทนLocale
ที่เลือกบนอุปกรณ์นั้นเมื่อโปรแกรมประยุกต์ที่ได้รับการเปิดตัว โดยทั่วไปแล้วนี่เป็นเรื่องปกติ แต่ก็หมายความว่าหากผู้ใช้เปลี่ยนการLocale
ตั้งค่าหลังจากกระบวนการแอปพลิเคชันของคุณทำงานค่าของgetDefaultLocale()
อาจจะไม่ได้รับการอัปเดตทันที
หากคุณต้องการดักจับเหตุการณ์เช่นนี้ด้วยเหตุผลบางอย่างในแอปพลิเคชันของคุณคุณอาจลองรับLocale
ข้อมูลจากConfiguration
วัตถุทรัพยากรเช่น
Locale current = getResources().getConfiguration().locale;
คุณอาจพบว่าค่านี้ได้รับการอัปเดตเร็วขึ้นหลังจากการตั้งค่าเปลี่ยนแปลงหากจำเป็นสำหรับแอปพลิเคชันของคุณ
Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
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.
อัปเดต Android N (Api ระดับ 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;
}
}
LocaleList.getDefault().get(0);
เนื่องจากจะส่งคืน Locales เรียงตามภาษาที่ต้องการ
ConfigurationCompat
ขณะที่ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
หากคุณใช้ห้องสมุดสนับสนุน Android คุณสามารถใช้ConfigurationCompat
วิธีการของ @ Makalele เพื่อกำจัดคำเตือนที่เลิกใช้แล้ว:
Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);
หรือใน Kotlin:
val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0]
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
จากgetDefault
เอกสารของ:
ส่งคืนโลแคลที่ผู้ใช้ต้องการ สิ่งนี้อาจถูกเขียนทับสำหรับกระบวนการนี้ด้วย setDefault (Locale)
รวมทั้งจากLocale
เอกสาร:
สถานที่เริ่มต้นเหมาะสำหรับงานที่เกี่ยวข้องกับการนำเสนอข้อมูลให้กับผู้ใช้
ดูเหมือนว่าคุณควรใช้มัน
Locale.setDefault()
มันจะถูกเรียกเมื่อฉันเปลี่ยนภาษาของอุปกรณ์อย่างน้อยกลับไปเป็น Android 5.0 (เท่าที่ฉันทดสอบ)
คำตอบทั้งหมดข้างต้น - ไม่ทำงาน ดังนั้นฉันจะใส่ที่นี่ฟังก์ชั่นที่ทำงานบน Android 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()
หากคุณใช้ AndroidX
ฉันเคยใช้สิ่งนี้:
String currentLanguage = Locale.getDefault().getDisplayLanguage();
if (currentLanguage.toLowerCase().contains("en")) {
//do something
}
ตามเอกสาร อย่างเป็นทางการConfigurationCompatถูกคัดค้านในห้องสมุดสนับสนุน
คุณสามารถพิจารณาใช้
LocaleListCompat.getDefault()[0].toLanguageTag()
ตำแหน่งที่ 0 จะเป็นภาษาที่ผู้ใช้ต้องการ
หากต้องการรับตำแหน่งเริ่มต้นที่ตำแหน่งที่ 0 จะเป็น
LocaleListCompat.getAdjustedDefault()
default()
เป็นเดิมพันที่ค่อนข้างปลอดภัยเพียงอย่าใช้เพื่อการประมวลผล (เช่นเอกสารพูด)