Android:以编程方式更改语言

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10701882/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 04:40:54  来源:igfitidea点击:

Android: Change language programmatically

androidbuttonlocaleonclicklistener

提问by Paulius Vindzigelskis

I have 3 buttons to change language. So I need to make method, where I could set listeners to buttons which could change language everytime they are pressed. I tried this https://stackoverflow.com/a/2900144/1088229but this way it changes locale only once and seems that this doesn't work any more (if i click again, it doesn't even respond). So I added changeLanguageListener()in end of listener, so listener is refreshed.

我有 3 个按钮来更改语言。所以我需要制作方法,在那里我可以将侦听器设置为每次按下时都可以更改语言的按钮。我试过这个https://stackoverflow.com/a/2900144/1088229但这样它只更改了一次语言环境,似乎这不再起作用(如果我再次单击,它甚至没有响应)。所以我changeLanguageListener()在监听器的末尾添加了,所以监听器被刷新了。

So is it ok, how i solved it or there is another way?

那么可以吗,我是如何解决的,还是有其他方法?

private void changeLanguageListener() {
    final Button butEn = (Button) findViewById(R.id.button_language_en);
    final Button butLt = (Button) findViewById(R.id.button_language_lt);
    final Button butRu = (Button) findViewById(R.id.button_language_ru);
    OnClickListener listener = new OnClickListener() {

        public void onClick(View v) {
            Button but = (Button) v;
            Resources res = getResources();
            String current = res.getConfiguration().locale.getCountry();
            Log.i("Current", current);
            String localeString = new String(current);
            if (but.equals(butEn)) {
                localeString = "en";
            } else if (but.equals(butLt)) {
                localeString = "lt";
            } else if (but.equals(butRu)) {
                localeString = "ru";
            }
            Log.i("Clicked", localeString);

            if (!current.equalsIgnoreCase(localeString) && localeString.length() > 0) {
                // Change locale settings in the app.
                DisplayMetrics dm = res.getDisplayMetrics();
                android.content.res.Configuration conf = res.getConfiguration();
                conf.locale = new Locale(localeString.toLowerCase());
                res.updateConfiguration(conf, dm);  
                //refresh menu
                setGridView();
                //added this line to get refreshed listener
                changeLanguageListener();
            }               
        }
    };
    butEn.setOnClickListener(listener);
    butLt.setOnClickListener(listener);
    butRu.setOnClickListener(listener);
}

采纳答案by Paulius Vindzigelskis

So, because of only two activities (two menu modes) where i let to change locale, I just restart Activity right after locale change, so everything is refreshed. Didn't find any other better solution

因此,由于我只允许更改语言环境的两个活动(两种菜单模式),我只是在语言环境更改后立即重新启动 Activity,因此所有内容都会刷新。没有找到其他更好的解决方案

回答by Ramkailash

Resources res = context.getResources();
// Change locale settings in the app.

DisplayMetrics dm = res.getDisplayMetrics();

android.content.res.Configuration conf = res.getConfiguration();

conf.locale = new Locale(language_code.toLowerCase());
res.updateConfiguration(conf, dm);

If you have language specific content - you can change that base on the setting.## Heading ##

如果您有特定于语言的内容 - 您可以根据设置更改该内容。## 标题 ##

回答by Moss

I would not recommend to change the language within your application. A better solution would be a button that opens the systems locale settings. You can use the following intent for this.

我不建议在您的应用程序中更改语言。更好的解决方案是打开系统区域设置的按钮。您可以为此使用以下意图。

startActivityForResult(new Intent(android.provider.Settings.ACTION_LOCALE, 0);

For more info about the locale settings: http://developer.android.com/reference/android/provider/Settings.html#ACTION_LOCALE_SETTINGS

有关区域设置的更多信息:http: //developer.android.com/reference/android/provider/Settings.html#ACTION_LOCALE_SETTINGS