首页 文章

当用户选择语言时如何更改app的语言?

提问于
浏览
82

我希望我的应用程序支持三种语言西班牙语,葡萄牙语和英语 . 并选择在app中选择语言 . 我已经做了

1)3个可绘制的文件夹drawable-es,drawable-pt,drawable .

2)3个值文件夹值-es,values-pt,values . 根据语言更改String.xml值 .

我有imageView来选择语言 . 当点击它打开菜单包括选项英语,西班牙语,葡萄牙语 .

我通过此代码在选项选择中在应用程序内设置Locale

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.en:
             Locale locale = new Locale("en"); 
             Locale.setDefault(locale);
             Configuration config = new Configuration();
             config.locale = locale;
             getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
             Toast.makeText(this, "Locale in English !", Toast.LENGTH_LONG).show();
             break;

        case R.id.pt:
             Locale locale2 = new Locale("pt"); 
             Locale.setDefault(locale2);
             Configuration config2 = new Configuration();
             config2.locale = locale2;
             getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics());

             Toast.makeText(this, "Locale in Portugal !", Toast.LENGTH_LONG).show();
             break;

        case R.id.es:
             Locale locale3 = new Locale("es"); 
             Locale.setDefault(locale3);
             Configuration config3 = new Configuration();
             config3.locale = locale3;
             getBaseContext().getResources().updateConfiguration(config3, getBaseContext().getResources().getDisplayMetrics());

             Toast.makeText(this, "Locale in Spain !", Toast.LENGTH_LONG).show();
             break;


    }
         return super.onOptionsItemSelected(item);
}

我已在宣言中声明 - android:configChanges="locale"

它有用,但它有一些问题 .

问题:-

1)选择语言时,包含语言选择图像的画面不会改变,但其他画面也会改变 .

2)定向更改后应用程序根据手机的区域恢复语言 .

5 回答

  • 1

    这是网页的摘录:http://android.programmerguru.com/android-localization-at-runtime/

    当用户从语言列表中选择应用程序时,更改应用程序的语言很简单 . 有一个像下面这样的方法接受语言环境作为字符串(如英语的“en”,印地语的“hi”),配置应用程序的语言环境并刷新当前活动以反映语言的变化 . 在您再次手动更改之前,不会更改您应用的区域设置 .

    public void setLocale(String lang) { 
        Locale myLocale = new Locale(lang); 
        Resources res = getResources(); 
        DisplayMetrics dm = res.getDisplayMetrics(); 
        Configuration conf = res.getConfiguration(); 
        conf.locale = myLocale; 
        res.updateConfiguration(conf, dm); 
        Intent refresh = new Intent(this, AndroidLocalize.class); 
        startActivity(refresh); 
        finish();
    }
    

    确保导入以下包:

    import java.util.Locale; 
    import android.os.Bundle; 
    import android.app.Activity; 
    import android.content.Intent; 
    import android.content.res.Configuration; 
    import android.content.res.Resources; 
    import android.util.DisplayMetrics;
    

    在清单中添加活动 android:configChanges="locale|orientation"

  • 0

    您应该从清单中删除 android:configChanges="locale" ,这将导致重新加载活动,或者覆盖 onConfigurationChanged 方法:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
        // your code here, you can use newConfig.locale if you need to check the language
        // or just re-set all the labels to desired string resource
    }
    
  • 5

    好的解决方案在这里解释得很好但这还有一个 .

    创建自己的 CustomContextWrapper 类,扩展 ContextWrapper 并使用它来更改整个应用程序的Locale设置 . Here is a GIST用法 .

    然后使用保存的区域设置标识符调用 CustomContextWrapper ,例如 'hi' 用于活动生命周期方法 attachBaseContext 中的印地语 . 用法在这里:

    @Override
    protected void attachBaseContext(Context newBase) {
    //fetch from shared preference also save to the same when applying. default here is en = English
        String language = MyPreferenceUtil.getInstance().getString("saved_locale", "en");
        super.attachBaseContext(SnapContextWrapper.wrap(newBase, language));
    }
    
  • 147

    Udhay的示例代码运行良好 . 除了Sofiane Hassaini和Chirag SolankI的问题,重新入场,它不起作用 . 我尝试调用Udhay的代码,而不是在super.onCreate(savedInstanceState);之前重启onCreate()中的活动 . 那就没事了!只有一点问题,菜单字符串仍未更改为设置的Locale .

    public void setLocale(String lang) { //call this in onCreate()
         Locale myLocale = new Locale(lang); 
         Resources res = getResources(); 
         DisplayMetrics dm = res.getDisplayMetrics(); 
         Configuration conf = res.getConfiguration(); 
         conf.locale = myLocale; 
         res.updateConfiguration(conf, dm); 
         //Intent refresh = new Intent(this, AndroidLocalize.class); 
         //startActivity(refresh); 
         //finish();
    }
    
  • 1

    所有上面的代码都是完美的,但只有一个缺少我的工作只是因为配置文件中没有提到语言

    defaultConfig {
    
        resConfigs "en", "hi", "kn"
    
    }
    

    之后,所有语言都开始运行

相关问题