如何使用其他语言环境作为语言的默认语言环境?

时间:2018-09-04 17:33:37

标签: android android-resources

Android当前使用西班牙作为Español的默认语言环境,但是我说我想拥有另一个语言环境,例如墨西哥,以便将Español的默认语言环境解析为,我有办法吗?

我的意思是,说某人有西班牙文(西班牙)的字符串和西班牙文(墨西哥)的字符串,他们将西班牙的字符串放在值-es中,将墨西哥的字符串放在values-es-rMX中,所以其他语言环境将默认为values-es,即西班牙字符串。我想让其他语言环境默认为墨西哥语言环境,并让西班牙字符串解析为Español(西班牙)。

我已经尝试过将Español(墨西哥)用作Values-es,并在Español(西班牙)中使用values-es-rES,但这是行不通的。

2 个答案:

答案 0 :(得分:0)

文件-_App.java

public class App extends Application {
public void onCreate(){
    super.onCreate();

    LocaleUtils.setLocale(new Locale("iw"));
    LocaleUtils.updateConfig(this, 
getBaseContext().getResources().getConfiguration());
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    LocaleUtils.updateConfig(this, newConfig);
}
}

onfile-_BaseActivity.java

public class BaseActivity extends AppCompatActivity {
public BaseActivity() {
    LocaleUtils.updateConfig(this);
}
}

在文件LocaleUtils.java

import android.app.Application;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.view.ContextThemeWrapper;

import java.util.Locale;

public class LocaleUtils {

public static final String LAN_SPANISH      = "es";
public static final String LAN_PORTUGUESE   = "pt";
public static final String LAN_ENGLISH      = "en";

private static Locale sLocale;

public static void setLocale(Locale locale) {
    sLocale = locale;
    if(sLocale != null) {
        Locale.setDefault(sLocale);
    }
}

public static void updateConfig(ContextThemeWrapper wrapper) {
    if(sLocale != null && Build.VERSION.SDK_INT >= 
Build.VERSION_CODES.JELLY_BEAN_MR1) {
        Configuration configuration = new Configuration();
        configuration.setLocale(sLocale);
        wrapper.applyOverrideConfiguration(configuration);
    }
}

public static void updateConfig(Application app, Configuration configuration) {
    if(sLocale != null && Build.VERSION.SDK_INT < 
Build.VERSION_CODES.JELLY_BEAN_MR1) {
        //Wrapping the configuration to avoid Activity endless loop
        Configuration config = new Configuration(configuration);
        config.locale = sLocale;
        Resources res = app.getBaseContext().getResources();
        res.updateConfiguration(config, res.getDisplayMetrics());
    }
}
}

您可以参考此链接以更好地理解,以及应该在应用程序click here fore more details

上的哪些事件上调用代码

答案 1 :(得分:0)

  

我已经尝试过将Español(墨西哥)用作Values-es,并在Español(西班牙)中使用values-es-rES,但这是行不通的。

我不确定您尝试了什么使您这么说,但通常来说应该有效。

通常,资源框架将始终尝试选择最特定的规则进行匹配,但是如果找不到匹配项,则将退回到越来越多的通用规则。 API 24+(read more here)的语言环境还存在一些问题,但一般模式仍然适用。

您选择作为“默认”的语言和方言完全取决于您;没什么可说的,您不必在res/values/strings.xml文件中放入英文文本。只要您对没有人看到这些默认字符串的特定匹配感到满意,就可以在其中输入所需的任何语言。

因此,您可以这样设计资源目录:

res/
    values/
        strings.xml (English text here)
    values-es/
        strings.xml (Mexican Spanish text here)
    values-es-rES/
        strings.xml (Spain Spanish text here)

这意味着:

  • 任何人将手机设置为完全西班牙西班牙语会看到西班牙西班牙语文本
  • 将手机设置为西班牙语的其他方言的任何人都会看到墨西哥西班牙语文本
  • 任何将手机设置为其他语言的人都可以看到英文文本