在Android首选项中设置应用程序语言

时间:2011-06-20 15:54:03

标签: android localization locale

我希望根据用户偏好设置应用程序语言,但到目前为止我的工作方式并不理想。

我已经设置了默认值:strings.xml以及带有span.xml的values-es,里面是西班牙语。我有一个菜单选项,它将用户带到一个Preference活动,在那里他可以选择语言。

以下是代码的一些摘录:

public class Preference extends PreferenceActivity implements
        OnSharedPreferenceChangeListener {
......
// Set up a listener whenever a key changes 
        getPreferenceScreen().getSharedPreferences()
                .registerOnSharedPreferenceChangeListener(this);


...}
//(......)

//and here I have the listener so when the language pref changes value the locale gets changed.
    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        if (key.equals("listPref2")) {
            String idioma = sharedPreferences.getString("listPref2", "catala");
            if ("castella".equals(idioma)) {
                idioma = "es_ES";

                Locale locale = new Locale(idioma);
                Locale.setDefault(locale);
                Configuration config = new Configuration();
                config.locale = locale;
                getApplicationContext().getResources().updateConfiguration(config,
                        getBaseContext().getResources().getDisplayMetrics());
            }
        }
    }

因此,当我更改它的语言时,但是当我稍后回来或重新启动模拟器时,语言将返回到默认语言环境en_US,并且应用程序语言将再次更改为默认语言。我该怎么做才能解决这个问题?

我知道我可以获得这个偏好(我可以从我的所有活动中访问),然后每次设置语言环境但我发现它有点重,是不是有办法在更强优雅的方式

我想做的是,如果用户设置语言,那么当他2天后回来时,他不必再次更改语言。

有什么想法吗?

2 个答案:

答案 0 :(得分:11)

好吧,它可以帮助某人。我已将以下内容添加到主要活动清单中:

android:configChanges="locale"

然后,当用户选择偏好时,我已经放置了一个确认按钮,然后此按钮将您带到主要活动,这就是为什么lnagages被重置。

我有一个静态类,我有这段代码来改变语言环境:

public static void updateLanguage(Context context, String idioma) {
    if (!"".equals(idioma)) {
        if ("castella".equals(idioma)) {
            idioma = "es_ES";
        } else if ("catala".equals(idioma)) {
            idioma = "ca_ES";
        }
        Locale locale = new Locale(idioma);
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        context.getResources().updateConfiguration(config, null);
    }
}

在每次活动结束时,我喜欢其中的20个,我之前称之为:

setContentView(R.layout.list_event);

使用这些方法旋转屏幕时,活动不会改变语言 这是一个帮助我的博客的链接: http://adrianvintu.com/blogengine/post/Force-Locale-on-Android.aspx

答案 1 :(得分:1)

我认为您需要在MainActivity onCreate方法中设置区域设置。与onSharedPreferenceChanged方法设置时相同。