获取设备中的当前语言

时间:2010-11-18 06:49:18

标签: android localization

我们如何才能在Android设备中选择当前语言?

25 个答案:

答案 0 :(得分:785)

如果您想获得设备的选定语言,这可能会对您有所帮助:

Locale.getDefault().getDisplayLanguage();

答案 1 :(得分:712)

我已经检查了Android 4.1.2设备上的Locale方法,结果是:

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

答案 2 :(得分:79)

对我有用的是:

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

Resource.getSystem()返回一个全局共享的Resources对象,它只提供对系统资源的访问(没有应用程序资源),并且没有为当前屏幕配置(不能使用维度单位,不会根据方向更改等) )。

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

答案 3 :(得分:43)

您可以从当前区域设置中“提取”该语言。您可以通过标准Java API或使用Android Context来提取语言环境。例如,下面两行是等价的:

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

答案 4 :(得分:34)

为了节省他人的时间和/或混淆,我想分享一下,我尝试了Johan Pelgrim提出的两个替代方案,在我的设备上他们是等效的 - 无论默认位置是否改变。

所以我的设备的默认设置是英语(United Kindom),并且按照预期的状态,Johan的答案中的两个字符串都会给出相同的结果。如果我然后更改手机设置中的区域设置(比如意大利语(意大利语))并重新运行,则Johan的答案中的两个字符串都会将语言环境设置为italiano(Italia)。

因此,我认为Johan的原始帖子是正确的,而gregm的评论是不正确的。

答案 5 :(得分:17)

Locale reference所述,获得语言的最佳方式是:

Locale.getDefault().getLanguage()

此方法返回符合ISO 639-1 standart

的语言ID字符串

答案 6 :(得分:14)

您可以使用此

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

当“xx”是任何语言代码,如“en”,“fr”,“sp”,“ar”....等等

答案 7 :(得分:6)

添加到Johan Pelgrim's answer

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 ...
}

答案 8 :(得分:5)

您可以尝试从系统资源中获取区域设置:

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

答案 9 :(得分:4)

有两种语言。

操作系统的默认语言:

Locale.getDefault().getDisplayLanguage();

应用程序的当前语言:

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

答案 10 :(得分:3)

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";
}

答案 11 :(得分:3)

如果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

答案 12 :(得分:3)

上面的答案不区分简单的中文和繁体中文。 Locale.getDefault().toString()可以返回“zh_CN”,“zh_TW”,“en_US”等。

参考:https://developer.android.com/reference/java/util/Locale.html,ISO 639-1是旧的。

答案 13 :(得分:3)

您可以使用此代码查找键盘电流

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

答案 14 :(得分:2)

如果您选择的语言无法输入希腊语可能会有所帮助。

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

答案 15 :(得分:1)

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

答案 16 :(得分:1)

获取设备语言的正确方法如下:

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

希望它有所帮助。

答案 17 :(得分:1)

Locale.getDefault().getDisplayLanguage()

将为您提供Written的语言名称,例如English, Dutch, French

Locale.getDefault().getLanguage()

会给您language code,例如:en, nl, fr

两个方法都返回String

答案 18 :(得分: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()));

答案 19 :(得分:1)

此解决方案对我有用。这将返回您的android设备的语言(而不是应用程序的本地语言)

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

这将返回“ en”或“ de”或“ fr”或您的设备语言设置的任何内容。

答案 20 :(得分: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());
            }

显示---&gt;烯

答案 21 :(得分:0)

这是获取设备国家/地区的代码。与所有版本的android甚至oreo兼容。

解决方案:如果用户没有SIM卡,而无法获得手机设置或当前语言选择时所使用的国家/地区的信息。

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

答案 22 :(得分:0)

如果要检查当前语言,请使用@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())

答案 23 :(得分:0)

其他人对设备语言给出了很好的答案,

如果您希望使用 app 语言,最简单的方法是在strings.xml文件中添加一个ActionResult键,然后指定每个语言的语言也是如此。

这样,如果您的应用的默认语言与设备语言不同,则可以选择将其发送为服务的参数。

答案 24 :(得分:-3)

如果你想为那些说印地语的印度居住的用户做特定的任务,那么在条件下使用以下

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
 //Block executed only for the users resides in India who speaks Hindi 
}