运行时语言改变Android

时间:2011-03-09 05:04:50

标签: android localization

  

可能重复:
  Change language programatically in Android

我可以根据例如更改应用程序语言运行时吗通过使用Android本地化支持(不是某些自己的/第三方解决方案)在菜单中进行用户选择?

非常感谢

1 个答案:

答案 0 :(得分:5)

我在应用程序中按下按钮实现了语言切换。这在Android中并不简单,但可以做到。有两个主要问题: 1)更改区域设置不会更改系统配置 - 系统区域设置。例如,在您的应用中将语言更改为法语并不会改变您的设备设置的事实,例如英语。因此,在您的应用程序中的任何其他配置更改 - 方向,键盘隐藏等,应用程序的区域设置将返回到系统区域设置。 2)另一个问题是,更改应用程序中的区域设置不会刷新UI,也不会重绘视图。这使得在运行时很难切换。刷新/重新加载必须手动完成,这意味着必须有一个方法刷新每个具有本地化文本/消息/值的视图。

因此,首先您需要定义本地化资源:value,value-en,value-fr等。然后,这将是按下按钮按下的代码。

private Locale myLocale;

private void onFR_langClicked(View v){
    myLocale = new Locale("fr");
    // set the new locale
    Locale.setDefault(myLocale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());

    // refresh UI - get values from localized resources
    ((RadioButton) findViewById(R.id.butn1)).setText(R.string.butn1);
    ((RadioButton) findViewById(R.id.butn2)).setText(R.string.butn2);
    spin.setPromptId(R.string.line_spinner_prompt);
    ...
}

最好将两个步骤分开,一个是切换调用UI刷新的语言环境。

然后您还需要处理配置更改,并确保语言保持您的意图。谷歌建议不要自己处理配置更改。清单必须包含每个活动的内容:

<activity
android:name=". ..."
android:configChanges="locale|orientation|keyboardHidden" >

允许您定义自己的更改处理程序:

@Override
public void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);
    if (myLocale != null){
        newConfig.locale = myLocale;
        Locale.setDefault(myLocale);
        getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics());
    }
}

希望这会有所帮助。希望你理解这个原则。