Làm cách nào để có được ngôn ngữ hiện tại được chọn trong thiết bị Android?
Làm cách nào để có được ngôn ngữ hiện tại được chọn trong thiết bị Android?
Câu trả lời:
Nếu bạn muốn có ngôn ngữ đã chọn của thiết bị của mình, điều này có thể giúp bạn:
Locale.getDefault().getDisplayLanguage();
Locale.getDefault().getLanguage();
để lấy mã ngôn ngữ thông thường (ví dụ: "de", "en").
Locale.setDefault("ru")
và ngôn ngữ trong cài đặt hệ thống được đặt thành tiếng Anh, thì phương thức Locale.getDefault().getLanguage()
sẽ trả về "ru" , nhưng không phải là "en" . Có một phương pháp khác để có được ngôn ngữ / ngôn ngữ HỆ THỐNG thực sự? Tôi tìm thấy không có tài liệu giải pháp ở đây , nhưng có giải pháp thanh lịch hơn?
Locale.getDefault().toString()
cung cấp một chuỗi xác định đầy đủ miền địa phương, ví dụ: "en_US".
Tôi đã kiểm tra các phương thức Ngôn ngữ trên thiết bị Android 4.1.2 của mình và kết quả:
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()
trở lại"English"
Những gì làm việc cho tôi là:
Resources.getSystem().getConfiguration().locale;
Resources.getSystem()
trả về một đối tượng Tài nguyên được chia sẻ toàn cầu chỉ cung cấp quyền truy cập vào tài nguyên hệ thống (không có tài nguyên ứng dụng) và không được định cấu hình cho màn hình hiện tại (không thể sử dụng đơn vị thứ nguyên, không thay đổi dựa trên định hướng, v.v.).
Bởi vì getConfiguration.locale
hiện đã bị từ chối, cách ưa thích để có được ngôn ngữ chính trong Android Nougat là:
Resources.getSystem().getConfiguration().getLocales().get(0);
Để đảm bảo khả năng tương thích với các phiên bản Android trước, một giải pháp khả thi sẽ là một kiểm tra đơn giản:
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;
}
Cập nhật
Bắt đầu với thư viện hỗ trợ, 26.1.0
bạn không cần kiểm tra phiên bản Android vì nó cung cấp một phương thức thuận tiện tương thích ngược getLocales()
.
Chỉ cần gọi:
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
getLocales
là cách để đi. Tôi đã cập nhật câu trả lời của mình.
Bạn có thể 'trích xuất' ngôn ngữ từ ngôn ngữ hiện tại. Bạn có thể trích xuất ngôn ngữ thông qua API Java tiêu chuẩn hoặc bằng cách sử dụng Ngữ cảnh Android. Chẳng hạn, hai dòng dưới đây là tương đương:
String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
Locale.setDefault()
với một số địa phương khác trước và bạn sẽ nhận được kết quả khác nhau.
Để tiết kiệm thời gian và / hoặc nhầm lẫn cho người khác, tôi muốn chia sẻ rằng tôi đã thử hai phương án do Johan Pelgrim đề xuất ở trên và trên thiết bị của tôi, chúng tương đương nhau - cho dù vị trí mặc định có bị thay đổi hay không.
Vì vậy, cài đặt mặc định của thiết bị của tôi là tiếng Anh (United Kindom) và ở trạng thái như mong đợi, cả hai chuỗi trong câu trả lời của Johan đều cho kết quả tương tự. Nếu sau đó tôi thay đổi ngôn ngữ trong cài đặt điện thoại (nói với tiếng ý (Italia)) và chạy lại thì cả hai chuỗi trong câu trả lời của Johan đều cho miền địa phương là tiếng ý (Italia).
Vì vậy, tôi tin rằng bài viết gốc của Johan là chính xác và nhận xét của gregm là không chính xác.
Như được mô tả trong tài liệu tham khảo Locale cách tốt nhất để có được ngôn ngữ là:
Locale.getDefault().getLanguage()
phương thức này trả về chuỗi có id ngôn ngữ theo tiêu chuẩn ISO 639-1
Bạn có thể sử dụng cái này
boolean isLang = Locale.getDefault().getLanguage().equals("xx");
khi "xx" là bất kỳ mã ngôn ngữ nào như "en", "fr", "sp", "ar" .... v.v.
nếu cấp API từ 24 trở lên, hãy sử dụng sử dụng LocaleList.getDefault().get(0).getLanguage()
khácLocale.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();
}
}
tham khảo: https://developer.android.com/guide/topics/resource/mult Languages-support
Để thêm vào câu trả lời của Johan Pelgrim
context.getResources().getConfiguration().locale
Locale.getDefault()
là tương đương vì android.text.format.DateFormat
lớp sử dụng cả hai thay thế cho nhau, ví dụ
private static String zeroPad(int inValue, int inMinDigits) {
return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
}
và
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 ...
}
Bạn có thể thử lấy ngôn ngữ từ tài nguyên hệ thống:
PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();
Câu trả lời ở trên không phân biệt giữa tiếng Trung đơn giản và tiếng Trung truyền thống.
Locale.getDefault().toString()
hoạt động trả về "zh_CN", "zh_TW", "en_US" và v.v.
Tham khảo: https://developer.android.com/reference/java/util/Locale.html , ISO 639-1 là OLD.
Giải pháp này đã làm việc cho tôi. Điều này sẽ trả về cho bạn ngôn ngữ của thiết bị Android (không phải ngôn ngữ địa phương của ứng dụng)
String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();
Điều này sẽ trả về "en" hoặc "de" hoặc "fr" hoặc bất cứ ngôn ngữ thiết bị nào của bạn được đặt thành.
Bạn có thể sử dụng mã này để tìm ra bàn phím hiện tại
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();
Có hai ngôn ngữ.
Ngôn ngữ mặc định của HĐH:
Locale.getDefault().getDisplayLanguage();
Ngôn ngữ hiện tại của Ứng dụng:
getResources().getConfiguration().locale.getDisplayLanguage();//return string
Nếu bạn chọn một ngôn ngữ bạn không thể gõ tiếng Hy Lạp này có thể hữu ích.
getDisplayLanguage().toString() = English
getLanguage().toString() = en
getISO3Language().toString() = eng
getDisplayLanguage()) = English
getLanguage() = en
getISO3Language() = eng
Bây giờ hãy thử nó với tiếng Hy Lạp
getDisplayLanguage().toString() = Ελληνικά
getLanguage().toString() = el
getISO3Language().toString() = ell
getDisplayLanguage()) = Ελληνικά
getLanguage() = el
getISO3Language() = ell
Nếu bạn muốn kiểm tra ngôn ngữ hiện tại, hãy sử dụng câu trả lời của @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
}
Cách chính xác để có được ngôn ngữ của thiết bị của bạn là như sau:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return context.getResources().getConfiguration().getLocales().get(0);
} else {
return context.getResources().getConfiguration().locale;
}
Hy vọng nó giúp.
Locale.getDefault().getDisplayLanguage()
sẽ cho bạn Written
tên của Ngôn ngữ, ví dụ,English, Dutch, French
Locale.getDefault().getLanguage()
sẽ cho bạn language code
, ví dụ:en, nl, fr
Cả hai phương thức đều trả về String
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()));
Những người khác đã đưa ra câu trả lời tốt cho ngôn ngữ thiết bị,
nếu bạn muốn ngôn ngữ ứng dụng là cách dễ nhất để làm điều đó bằng cách thêm một app_lang
khóa vào strings.xml
tệp của bạn và chỉ định lang cho từng lang.
Theo cách đó, nếu ngôn ngữ mặc định của ứng dụng của bạn khác với ngôn ngữ thiết bị, bạn có thể chọn gửi đó làm tham số cho các dịch vụ của mình.
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";
}
Giải pháp của tôi là như thế này
@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);
}
và sau đó
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Log.e("Locale", getCurrentLocale().getLanguage());
} else {
Log.e("Locale", getCurrentLocale2().toString());
}
hiển thị ---> vi
Đây là mã để có được quốc gia thiết bị. Tương thích với tất cả các phiên bản Android ngay cả oreo.
Giải pháp: nếu người dùng không có thẻ sim hơn lấy quốc gia, anh ta sẽ được sử dụng trong khi cài đặt điện thoại hoặc chọn ngôn ngữ hiện tại.
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;
}