Android,不同的语言

时间:2018-09-10 08:21:53

标签: android localization

是否可以使用通过单击一些按钮中选择的语言制作Android应用程序?例如,如果我在应用程序的开头有四个按钮,且文本为:“ english”,“ german”,“ italiano”,“español”,则当我单击按钮“ german”时,我想在应用程序中使用德语。我知道我必须对字符串使用不同的文件夹(values-de为德语),但是我不知道如何以及在何处更改使用默认文件夹作为值的默认设置。 预先感谢!

2 个答案:

答案 0 :(得分:0)

您需要在每个类中覆盖 attachBaseContext 方法。并将所选的语言环境代码传递给super方法。以下代码在Kotlin中使用

 override fun attachBaseContext(newBase: Context) {
    val lang = SharedPref.getPrefVal<String>(newBase, Constants.SELECTED_LANG_CODE)
    super.attachBaseContext(MyContextWrapper.wrap(newBase, lang))
}

MyContextWrapper 类可支持所有版本的语言更改

public class MyContextWrapper extends ContextWrapper {

public MyContextWrapper(Context base) {
    super(base);
}

@SuppressWarnings("deprecation")
public static ContextWrapper wrap(Context context, String language) {
    Configuration config = context.getResources().getConfiguration();
    Locale sysLocale = null;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        sysLocale = getSystemLocale(config);
    } else {
        sysLocale = getSystemLocaleLegacy(config);
    }
    if (!language.equals("") && !sysLocale.getLanguage().equals(language)) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            setSystemLocale(config, locale);
        } else {
            setSystemLocaleLegacy(config, locale);
        }

    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        context = context.createConfigurationContext(config);
    } else {
        context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
    }
    return new MyContextWrapper(context);
}

@SuppressWarnings("deprecation")
public static Locale getSystemLocaleLegacy(Configuration config) {
    return config.locale;
}

@TargetApi(Build.VERSION_CODES.N)
public static Locale getSystemLocale(Configuration config) {
    return config.getLocales().get(0);
}

@SuppressWarnings("deprecation")
public static void setSystemLocaleLegacy(Configuration config, Locale locale) {
    config.locale = locale;
}

@TargetApi(Build.VERSION_CODES.N)
public static void setSystemLocale(Configuration config, Locale locale) {
    config.setLocale(locale);
}
}

并在使用onClick方法设置语言时使用:

 try {                           
     attachBaseContext(MyContextWrapper.wrap(applicationContext, lang_code))
     } catch (e: Exception) {
     }

让我知道您是否需要任何帮助来了解代码结构

答案 1 :(得分:0)

尝试以下代码。

要更改语言,我做了一个功能,您必须传递语言代码和上下文。

language =“ zh-cn”根据您的要求设置语言(英语en,法语fr,西班牙语sp和Other Languages)的上下文通过您的活动/片段上下文

    public static boolean setLangRecreate(String language, Context context) {
try {
    Configuration config = context.getResources().getConfiguration();
    Locale locale = new Locale(language);
    Locale.setDefault(locale);
    config.locale = locale;
    context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
    // recreate();
    ((Activity) context).finish();
    ((Activity) context).overridePendingTransition(0, 0);
    ((Activity) context).startActivity(((Activity) context).getIntent());
    ((Activity) context).overridePendingTransition(0, 0);
    return true;
} catch (Exception e) {
    e.printStackTrace();
}
return false;}