Nhận ngôn ngữ hiện tại trong thiết bị


609

Làm cách nào để có được ngôn ngữ hiện tại được chọn trong thiết bị Android?


10
Phần lớn các câu trả lời ở đây có được ngôn ngữ của ứng dụng. Cho rằng bạn có thể đặt ngôn ngữ mặc định của ứng dụng theo mã, câu trả lời đúng là câu trả lời do Sarpe đưa ra - cung cấp cho bạn ngôn ngữ của thiết bị.
Victor Ionescu

@VictorIonescu cảm ơn bạn đã bình luận. Câu trả lời của Sarpe là câu trả lời đúng cho địa điểm lấy thiết bị. Hãy tham khảo nó. stackoverflow.com/a/28498119/3762067
Varad Mondkar

Câu trả lời:


834

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();

73
getDisplayL Language () sẽ bản địa hóa ngôn ngữ. Nếu bạn quan tâm đến việc chỉ nhận mã ISO (ví dụ: nếu hoặc chuyển đổi câu lệnh), hãy sử dụng 'Locale.getDefault (). GetISO3L Language ();'
Nuala

13
getISO3L Language () trả lại những thứ như "deu" cho tiếng Đức (Đức) thay vì ...
Tobias

372
Bạn có thể sử dụng Locale.getDefault().getLanguage();để lấy mã ngôn ngữ thông thường (ví dụ: "de", "en").
muscardinus

35
@DeRagan, Điều này sẽ không luôn cung cấp cho bạn ngôn ngữ cho thiết bị của bạn, nhưng chỉ dành cho ứng dụng của bạn. Ví dụ: nếu tôi gọi 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?
Giải thưởng

47
Tôi thích Locale.getDefault().toString()cung cấp một chuỗi xác định đầy đủ miền địa phương, ví dụ: "en_US".
Tom

837

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

7
Cảm ơn, tốt đẹp với một danh sách các khả năng. Bạn có thể vui lòng thêm "Locale.getDefault (). ToString ()", như được đề xuất trong một nhận xét của "Tom".
RenniePet

Tôi bối rối. Bạn vừa sao chép câu trả lời từ DeRagan?
ăn kiêng

1
Xin lỗi vì điều đó. Đúng là tôi đã thêm nó vào đó. Tôi nên để lại một ghi chú nó đến từ đây. Tôi đã phạm sai lầm khi cố gắng giúp mọi người tìm ra câu trả lời họ cần nhanh hơn. Bởi vì rõ ràng của bạn là câu trả lời tốt hơn. Nhưng tất nhiên là của bạn sẽ không bao giờ lên đến đỉnh, bởi vì mọi người không nhìn thấy nó thường xuyên như là đỉnh. Có ổn không nếu chúng ta thêm nó vào đó với một lưu ý rằng nó đến từ câu trả lời này?
Patrick Boos

1
Xin chào lần nữa. Tôi không thích giải pháp đó. Hiện tại câu trả lời của DeRagan được hiển thị ở vị trí đầu tiên và của tôi được hiển thị dưới dạng thứ hai. Đối với một nhà nghiên cứu, không quá khó để kiểm tra câu trả lời thứ hai trong trang câu hỏi. Sẽ tốt hơn nếu @pinki thay đổi câu trả lời được chấp nhận. Nhưng có vẻ như Pinki nhìn thấy lần cuối 3 tháng trước.
trante

1
đó cũng là sự Locale.getDefault().getDisplayLanguage()trở lại"English"
thể thao

106

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.0bạ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());

6
getConfiguration (). locale hiện không được dùng nữa, hãy sử dụng getConfiguration (). getLocales (). get (0) thay vào đó
Eliseo Ocampos

4
Đây là câu trả lời chính xác cho câu hỏi này. câu trả lời khác có được địa phương của ứng dụng, không phải thiết bị.
hofs

6
Tôi không biết điều này có tồn tại khi câu trả lời được viết hay không, nhưng thư viện hỗ trợ có các phiên bản tương thích ngược về điều này, bạn không cần phải tự viết tương thích ngược. ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear

Như @Thorbear đã chỉ ra, bây giờ sử dụng phương thức thư viện hỗ trợ mới getLocaleslà cách để đi. Tôi đã cập nhật câu trả lời của mình.
Sarpe

Đây là câu trả lời đúng. Những người khác trả lại ngôn ngữ của ứng dụng không phải của hệ thống.
Chintan Rathod

44

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();

10
Đây không phải là sự thật. Họ khác nhau. Đầu tiên có thể thay đổi nếu người dùng chuyển đổi Địa điểm. Thứ hai là cái được cài đặt sẵn trên điện thoại. Nó không bao giờ thay đổi cho dù người dùng làm gì.
gregm

16
Nhận xét của gregm có thể là sai. Xem câu trả lời của airewyre.
jan groth

4
Nhận xét của @ gregm là sai. Chỉ cần tự mình thử và bạn sẽ thấy, Locale.getDefault () sẽ thay đổi khi bạn thay đổi ngôn ngữ trong cài đặt.
Patrick Boos


Mặc dù nhận xét của @ gregm là sai, nhưng anh ta vẫn đúng hai dòng đó không cần trả về cùng một miền. Chỉ cần gọi 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.
arekolek

35

Để 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.



17

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.


3
if (Locale.ENGlish.equals (Locale.getDefault (). getL Language ())) {...}
Clement Martino

1
@ClementMartino đề xuất của bạn là ổn trong trường hợp Địa điểm được xác định trước như TIẾNG VIỆT, nhưng đối với các địa phương khác như tiếng Ả Rập, chúng tôi phải phân tích cú pháp bằng mã lang
Simon K. Gerges

8

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


Nó sẽ là một câu trả lời chấp nhận được vào năm 2020!
Andrii Kovalchuk

6

Để 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.DateFormatlớ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);
}

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

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();

1
Đây là câu trả lời trong trường hợp bạn đã ghi đè bất kỳ phần nào của cấu hình
Takhion 14/07/2015


4

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.


3

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();

3

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

3
Điều đó không đúng, nếu bạn thay đổi ngôn ngữ trong ứng dụng của mình ngay cả lần đầu tiên cung cấp cho bạn giá trị thay đổi và không phải giá trị hệ thống
Tới Kra

3

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

3

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())

Nếu bạn muốn áp dụng định dạng ngày địa phương của người dùng, hãy sử dụng DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date()).
CoolMind

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

2
Vui lòng thêm một số chi tiết về lý do tại sao điều này trả lời câu hỏi - chỉ đoạn mã sẽ không giúp người đọc hiểu được giải pháp
Wand Maker

Locale.getDefault (). GetDisplayName () cung cấp ngôn ngữ hiện tại của thiết bị của bạn. và chúng tôi đang kiểm tra xem ngôn ngữ Thiết bị có phải là tiếng Hindi hay không .. Nếu ngôn ngữ Thiết bị hiện tại là tiếng Hindi, thì hãy làm những gì bạn muốn trong khối.
Pratibha Sarode

1

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.


1
Locale.getDefault().getDisplayLanguage()

sẽ cho bạn Writtentê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


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

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_langkhóa vào strings.xmltệ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.


Tôi không thể tin rằng không có hỗ trợ khung để cung cấp cho bạn ngôn ngữ mà AssetManager hiện đang sử dụng. Trên thực tế, các trình trợ giúp định dạng Chuỗi trong Resources.java sử dụng ngôn ngữ mặc định [0] vì vậy nếu chuỗi từ AssetManager đến từ một miền không khớp với miền địa phương mặc định của thiết bị (vì ứng dụng của bạn không hỗ trợ nó nhưng hỗ trợ ví dụ tiếp theo trong danh sách) thì có một lỗi.
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";
}

Sẽ tốt hơn nếu bạn có thể thêm nhiều hướng dẫn vào câu trả lời, thay vì chỉ dán mã.
Calos

0

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


0

Đâ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;
}

-3

Nếu bạn muốn thực hiện nhiệm vụ cụ thể cho người dùng cư trú ở Ấn Độ, người nói tiếng Hindi, hãy sử dụng bên dưới nếu có điều kiện

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
 //Block executed only for the users resides in India who speaks Hindi 
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.