如何获取当前Android应用程序显示的语言(区域设置)?

时间:2011-12-31 20:44:31

标签: android localization locale

如何获知当前Android应用用于向用户显示文本的语言(语言环境)?

我知道我可以使用Locale.getDefault()来获取默认的操作系统区域设置。但它可能与应用程序用于显示文本和其他资源的区域设置不同,如果app不支持此区域设置。


我需要确定应用程序显示的语言(语言环境),因此应用程序可以将语言传递给服务器,因此它可以本地化返回的结果。

5 个答案:

答案 0 :(得分:44)

我自己的解决方案是添加到strings.xml键值对locale=<locale code>,因此context.getResources().getString(R.string.locale)将返回特定于已使用区域设置的区域设置代码。

答案 1 :(得分:31)

这是您的应用配置,因此您可以使用:

getResources().getConfiguration().locale

这与

不同
Locale.getDefault()

并显示应用使用的区域设置可能不同。

它可能有所不同,因为开发人员可以通过更新应用配置来更改它, 检查:Resources.updateConfiguration

答案 2 :(得分:5)

以下代码适用于我:

@TargetApi(Build.VERSION_CODES.M)
private String getCurrentDefaultLocaleStr(Context context) {
    Locale locale = context.getResources().getConfiguration().locale;
    return locale.getDefault().toString();
}

注意:在Build.VERSION_CODES.N上获取区域设置的方式略有变化。对于N及以上,代码应该类似于下面的代码块;但是,我只是在上面的代码块中为M及以下做它,它也适用于N及以上。

    // Build.VERSION_CODES.N
    Locale locale = context.getResources().getConfiguration().getLocales().get(0);

我得到了以下支持的国家语言:

English:             en 
Traditional Chinese: zh_TW_#Hant 
Simplified Chinese:  zh_CN_#Hans
Spanish:             es_ES
French:              fr_FR
Japanese:            ja_JP
German:              de_DE

有一个方法列表以不同的格式提供相同的区域设置信息:

  

locale.getDefault()getCountry();
  。locale.getDefault()getISO3Language();
  。locale.getDefault()getISO3Country();
  。locale.getDefault()getDisplayCountry();
  。locale.getDefault()getDisplayName();
  。locale.getDefault()getDisplayLanguage();
  。locale.getDefault()使用getLanguage();
  。locale.getDefault()的toString();

答案 3 :(得分:1)

您可以使用以下代码。 例如,下面给出的函数可以放在扩展Application类的类中。

public class MyApplication extends Application {
    ...
    public static String APP_LANG;
    private Context ctx = getBaseContext();
    private Resources res = ctx.getResources();
    public SharedPreferences settingPrefs;
    ...

    public void restoreAppLanguage(){
    /**
    *Use this method to store the app language with other preferences.
    *This makes it possible to use the language set before, at any time, whenever 
    *the app will started.
    */
        settingPrefs = getSharedPreferences("ConfigData", MODE_PRIVATE);
        String lang = settingPrefs.getString("AppLanguage", "");
        if(!settingPrefs.getAll().isEmpty() && lang.length() == 2){
            Locale myLocale;
            myLocale = new Locale(lang);
            Locale.setDefault(myLocale);
            Configuration config = new Configuration();
            config.locale = myLocale;
            res.updateConfiguration( config, res.getDisplayMetrics() );
        }
    }

    public void storeAppLanguage(int lang) {
    /**
    *Store app language on demand
    */
        settingPrefs = getSharedPreferences("ConfigData", MODE_PRIVATE);
        Editor ed = settingPrefs.edit();

        Locale myLocale;
        myLocale = new Locale(lang);
        Locale.setDefault(myLocale);
        Configuration config = new Configuration();
        config.locale = myLocale;
        res.updateConfiguration( config, res.getDisplayMetrics() );
        ed.putString("AppLanguage", lang);

        ed.commit();
    }

    public void setAppLanguage(String lang){
    /**
    *Use this method together with getAppLanguage() to set and then restore
    *language, whereever you need, for example, the specifically localized
    *resources.
    */
        Locale myLocale;
        myLocale = new Locale(lang);
        Locale.setDefault(myLocale);
        Configuration config = new Configuration();
        config.locale = myLocale;
        res.updateConfiguration( config, res.getDisplayMetrics() );
    }

    public void getAppLanguage(){
    /**
    *Use this method to obtain the current app language name
    */
        settingPrefs = getSharedPreferences("ConfigData",MODE_PRIVATE);
        String lang = settingPrefs.getString("AppLanguage", "");
        if(!settingPrefs.getAll().isEmpty() && lang.length() == 2){
            APP_LANG = lang;
        }
        else APP_LANG = Locale.getDefault().getLanguage();
    }
}

然后在主代码中我们可以写的任何地方:

public class MainActivity extends ActionBarActivity {
    ...
    MyApplication app;
    ... 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        app = (MyApplication)getApplicationContext();
        ...
        if(settingPrefs.getAll().isEmpty()){
            //Create language preference if it is not
            app.storeAppLanguage(Locale.getDefault().getLanguage());
        }

        //Restore previously used language
        app.restoreAppLanguage();
        ...
    }
    ...
    void SomethingToDo(){
        String lang = "en"; //"fr", "de", "es", "it", "ru" etc.
        ...
        app.getAppLanguage();
        app.setAppLanguage(lang);
        ...
        //do anything
        ...
        app.setAppLanguage(app.APP_LANG);
    }
    ...
}

在您的情况下,您很快就可以使用getAppLanguage(),然后检查公共变量APP_LANG以获取当前使用的语言。

答案 4 :(得分:0)

 public boolean CheckLocale(Context context, String app_language) {
        Locale myLocale = new Locale(app_language);
        Resources res = context.getResources();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        if(res.getConfiguration().locale==myLocale)
            return true;
        else 

         return false;

    }

使用此方法。