应用程序android内的语言切换

时间:2013-09-24 13:15:56

标签: android localization sharedpreferences

如何在不必手动设置Android应用内的区域设置的情况下实现语言切换?我知道应用程序将在启动期间根据区域设置加载strings.xml,但我不希望根据系统区域设置进行此选择,而是在“设置”中进行用户指定。

或者,手动设置区域设置是否正常?

2 个答案:

答案 0 :(得分:18)

你可以扩展Application类(你也必须在清单中声明它)并在其中加入类似的内容。

每当您想要更改语言时,您都可以调用

((App)getApplicationContext()).changeLang(lang);

来自您的活动。 R.string.locale_lang只是一个存储在strings.xml中用于共享首选项的键

public class App extends Application {

    private Locale locale = null;

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

    @Override
    public void onCreate() {
        super.onCreate();
        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
        String lang = settings.getString(getString(R.string.locale_lang), "");
        changeLang(lang); 
    }

    public void changeLang(String lang) {
        Configuration config = getBaseContext().getResources().getConfiguration();
        if (!"".equals(lang) && !config.locale.getLanguage().equals(lang)) {

            Editor ed = PreferenceManager.getDefaultSharedPreferences(this).edit();
            ed.putString(getString(R.string.locale_lang), lang);
            ed.commit();

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

    public String getLang(){
        return PreferenceManager.getDefaultSharedPreferences(this).getString(this.getString(R.string.locale_lang), "");
    }



}

答案 1 :(得分:0)

好的。让我们做一个简单的方法。在“布局”文件夹中,执行2个xml布局副本。将其中一个命名为main.xml(您的本地语言),将另一个命名为英语。在values文件夹中,strings.xml文件还包含两种语言的两行文本:<string name="hello">Tere, Maailm!</string>(用于本地语言)和<string name="hello_en">Hello World!</string>(用于英语)。回到xml布局,main.xml包含android:text="@string/hello"作为您的文本,第二个重复的mainen.xml包含所有相同的布局和字符串,只是从中检索英文行的英文版本略有不同strings.xml文件:android:text="@string/hello_en"。并且以编程方式,在需要时设置标题并在每个活动的开头指定要选择的布局,请使用全局变量languageToLoad,该变量已在您的第一个(起始)类中声明并实例化:protected static boolean languageToLoad = true;, 在同一类中,onCreate方法应包含一些单选按钮(您还需要在相应的布局xml中定义和命名它们):`

    // ...
    View radio1 = findViewById(R.id.Et);
    radio1.setOnClickListener(this);
    View radio2 = findViewById(R.id.En);
    radio2.setOnClickListener(this);
    // ...`

然后在课堂上:`

    // ...
    public void onClick(View v1) {
            switch (v1.getId()) {

            case R.id.Et:
                languageToLoad = true;
                break; 

            case R.id.En:
                languageToLoad = false;
                break;

                // ...`

然后在程序中,在不同活动的onCreate方法中:`

    //...
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            if (YourSuperClass.languageToLoad) {
                setContentView(R.layout.youractivity);      // estonian
                setTitle(R.string.youractivity_title);
            } else {
                setContentView(R.layout.youractivityen);        // english
                setTitle(R.string.youractivity_title_en);
            }

            Intent i = getIntent();
            //...`