เราจะเลือกภาษาปัจจุบันในอุปกรณ์ Android ได้อย่างไร?
เราจะเลือกภาษาปัจจุบันในอุปกรณ์ Android ได้อย่างไร?
คำตอบ:
หากคุณต้องการได้รับภาษาที่เลือกในอุปกรณ์ของคุณสิ่งนี้อาจช่วยคุณได้:
Locale.getDefault().getDisplayLanguage();
Locale.getDefault().getLanguage();
เพื่อรับรหัสภาษาปกติ (เช่น "de", "en")
Locale.setDefault("ru")
และภาษาในการตั้งค่าระบบถูกตั้งค่าเป็นภาษาอังกฤษแล้ววิธีการLocale.getDefault().getLanguage()
จะกลับมา"RU"แต่ไม่"en" มีวิธีอื่นในการรับภาษา / ระบบจริงหรือไม่ ผมพบว่าวิธีการแก้ปัญหาไม่ได้รับการบันทึกไว้ที่นี่แต่มีทางออกที่สวยงามมากขึ้น?
Locale.getDefault().toString()
ที่จะให้สตริงที่ระบุสถานที่อย่างเต็มที่เช่น "en_US"
ฉันได้ตรวจสอบวิธี 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
Locale.getDefault().getDisplayLanguage()
ที่จะส่งกลับ"English"
สิ่งที่ทำงานให้ฉันคือ:
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());
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
getLocales
เป็นวิธีที่จะไป ฉันอัพเดตคำตอบแล้ว
คุณสามารถ 'แยก' ภาษาจากภาษาปัจจุบัน คุณสามารถแตกโลแคลผ่าน Java API มาตรฐานหรือโดยใช้บริบท Android ตัวอย่างเช่นสองบรรทัดด้านล่างเทียบเท่า:
String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
Locale.setDefault()
สถานที่อื่นก่อนและคุณจะได้รับผลลัพธ์ที่แตกต่างกัน
เพื่อประหยัดเวลาและ / หรือความสับสนของผู้อื่นฉันต้องการแบ่งปันว่าฉันได้ลองทั้งสองทางเลือกที่เสนอโดย Johan Pelgrim ด้านบนและบนอุปกรณ์ของพวกเขาเทียบเท่า - ไม่ว่าจะเปลี่ยนตำแหน่งเริ่มต้นหรือไม่
ดังนั้นการตั้งค่าเริ่มต้นของอุปกรณ์ของฉันคือภาษาอังกฤษ (United Kindom) และอยู่ในสถานะนี้ตามที่คาดไว้ทั้งสองคำตอบ Strings ใน Johan ให้ผลเหมือนกัน ถ้าฉันเปลี่ยนสถานที่ในการตั้งค่าโทรศัพท์ (พูดกับ italiano (Italia)) และเรียกใช้อีกครั้ง Strings ทั้งสองในคำตอบของ Johan จะให้ locale เป็น italiano (Italia)
ดังนั้นฉันเชื่อว่าโพสต์ต้นฉบับของ Johan นั้นถูกต้องและความคิดเห็นของ gregm นั้นไม่ถูกต้อง
ตามที่อธิบายไว้ในการอ้างอิง Localeวิธีที่ดีที่สุดในการรับภาษาคือ:
Locale.getDefault().getLanguage()
เมธอดนี้ส่งคืนสตริงด้วย id ภาษาตามมาตรฐาน ISO 639-1
คุณสามารถใช้สิ่งนี้
boolean isLang = Locale.getDefault().getLanguage().equals("xx");
เมื่อ "xx" เป็นรหัสภาษาใด ๆ เช่น "en", "fr", "sp", "ar" .... และอื่น ๆ
หากระดับ 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
เพื่อเพิ่มคำตอบของ 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 ...
}
คุณสามารถลองรับโลแคลจากทรัพยากรระบบได้:
PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();
คำตอบข้างต้นไม่แยกความแตกต่างระหว่างภาษาจีนแบบง่ายกับภาษาจีนดั้งเดิม
Locale.getDefault().toString()
งานที่ส่งคืน "zh_CN", "zh_TW", "en_US" และอื่น ๆ
การอ้างอิงถึง: https://developer.android.com/reference/java/util/Locale.html , ISO 639-1 คือ OLD
วิธีนี้ใช้ได้ผลสำหรับฉัน สิ่งนี้จะส่งคืนภาษาของอุปกรณ์ Android (ไม่ใช่ภาษาท้องถิ่นของแอป)
String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();
การดำเนินการนี้จะส่งคืน "en" หรือ "de" หรือ "fr" หรือภาษาที่อุปกรณ์ของคุณตั้งไว้
คุณสามารถใช้รหัสนี้เพื่อค้นหาคีย์บอร์ดปัจจุบัน
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();
มีสองภาษา
ภาษาเริ่มต้นของระบบปฏิบัติการ:
Locale.getDefault().getDisplayLanguage();
ภาษาปัจจุบันของการใช้งาน:
getResources().getConfiguration().locale.getDisplayLanguage();//return string
หากคุณเลือกภาษาคุณไม่สามารถพิมพ์ภาษากรีกนี้ได้อาจเป็นประโยชน์
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
หากคุณต้องการตรวจสอบภาษาปัจจุบันให้ใช้คำตอบของ @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())
หากคุณต้องการที่จะใช้รูปแบบวันที่ท้องถิ่นของผู้ใช้
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
// your code here
}
วิธีที่ถูกต้องในการรับภาษาของอุปกรณ์ของคุณคือ:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return context.getResources().getConfiguration().getLocales().get(0);
} else {
return context.getResources().getConfiguration().locale;
}
หวังว่ามันจะช่วย
Locale.getDefault().getDisplayLanguage()
จะให้Written
ชื่อคุณแก่ภาษาตัวอย่างเช่นEnglish, Dutch, French
Locale.getDefault().getLanguage()
จะให้language code
ตัวอย่างเช่น:en, nl, fr
ทั้งสองวิธีคืนค่าสตริง
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()));
ผู้อื่นได้รับคำตอบที่ดีสำหรับภาษาของอุปกรณ์
หากคุณต้องการให้ภาษาแอปวิธีที่ง่ายที่สุดคือการเพิ่มapp_lang
รหัสลงในstrings.xml
ไฟล์ของคุณและระบุภาษาสำหรับแต่ละภาษาด้วย
ด้วยวิธีนี้หากภาษาเริ่มต้นของแอปของคุณแตกต่างจากภาษาของอุปกรณ์คุณสามารถเลือกที่จะส่งเป็นพารามิเตอร์สำหรับบริการของคุณ
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";
}
ทางออกของฉันเป็นเช่นนี้
@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
นี่คือรหัสเพื่อรับประเทศของอุปกรณ์ เข้ากันได้กับ 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;
}
หากคุณต้องการทำงานเฉพาะสำหรับผู้ใช้ที่อาศัยอยู่ในอินเดียที่พูดภาษาฮินดีให้ใช้เงื่อนไขด้านล่าง
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
//Block executed only for the users resides in India who speaks Hindi
}