115

我希望我的应用程序支持西班牙语、葡萄牙语和英语三种语言。并提供在应用程序中选择语言的选项。我已经做了

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

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

我有 imageView 来选择语言。单击它时打开菜单,其中包含选项英语、西班牙语、葡萄牙语。

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

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

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

它工作,但它有一些问题。

问题:-

1)当语言选择时,由语言选择的图像的屏幕不会改变,但其他屏幕是更改的。

2)根据手机的语言环境更改应用程序的方向后恢复语言。

4

8 回答 8

182

这是网页的摘录: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); 
    finish();
    startActivity(refresh); 
} 

确保您导入了以下软件包:

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"

于 2012-10-18T11:55:46.860 回答
11

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

创建您自己的CustomContextWrapper扩展类ContextWrapper并使用它来更改整个应用程序的区域设置。 这是一个 GIST的用法。

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

@Override
protected void attachBaseContext(Context newBase) {
    // fetch from shared preference also save the same when applying. Default here is en = English
    String language = MyPreferenceUtil.getInstance().getString("saved_locale", "en");
    super.attachBaseContext(MyContextWrapper.wrap(newBase, language));
}
于 2017-09-03T15:01:44.390 回答
7

以上所有@Uday 的代码都很完美,但只缺少一件事(build.gradle 中的默认配置)

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); 
finish();
startActivity(refresh); 

}

我的不工作只是因为配置文件(build.gradle)中没有提到语言

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

之后,所有语言开始运行

于 2018-10-01T09:50:45.237 回答
6

您应该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
}
于 2013-10-29T21:08:20.983 回答
4

使用上下文扩展的 Kotlin 解决方案

fun Context.applyNewLocale(locale: Locale): Context {
    val config = this.resources.configuration
    val sysLocale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        config.locales.get(0)
    } else {
        //Legacy
        config.locale
    }
    if (sysLocale.language != locale.language) {
        Locale.setDefault(locale)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            config.setLocale(locale)
        } else {
            //Legacy
            config.locale = locale
        }
        resources.updateConfiguration(config, resources.displayMetrics)
    }
    return this
}

用法

override fun attachBaseContext(newBase: Context?) {
    super.attachBaseContext(newBase?.applyNewLocale(Locale("es", "MX")))
}
于 2020-09-16T15:13:55.047 回答
3

Udhay 的示例代码运行良好。除了 Sofiane Hassaini 和 Chirag SolankI 的问题,对于重入来说,它不起作用。在 super.onCreate(savedInstanceState); 之前,我尝试调用 Udhay 的代码而不重启 onCreate() 中的活动。然后就OK了!只有一个小问题,菜单字符串仍然没有更改为设置的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();
    } 
于 2017-09-28T19:58:26.507 回答
3

那些得到版本问题的人试试这个代码..

public static void switchLocal(Context context, String lcode, Activity activity) {
        if (lcode.equalsIgnoreCase(""))
            return;
        Resources resources = context.getResources();
        Locale locale = new Locale(lcode);
        Locale.setDefault(locale);
        android.content.res.Configuration config = new 
        android.content.res.Configuration();
        config.locale = locale;
        resources.updateConfiguration(config, resources.getDisplayMetrics());
        //restart base activity 
        activity.finish();
        activity.startActivity(activity.getIntent());
    }
于 2019-02-23T11:55:06.650 回答
0
    Locale locale = new Locale(langCode);
    Locale.setDefault(locale);
    Configuration configuration = context.getResources().getConfiguration();
    configuration.locale = locale;
    configuration.setLayoutDirection(locale); // for RTL changes
    preferences.setLocalePref(langCode);
    context.getResources().updateConfiguration(configuration, context.getResources().getDisplayMetrics());

这里,langCode是所需的语言代码。您可以将语言代码保存为 sharedPreferences 中的字符串。你可以super.onCreate(savedInstanceState)onCreate.

于 2021-02-18T12:31:22.823 回答