Как использовать другую локаль в качестве локали по умолчанию для языков?

Android в настоящее время использует Испанию в качестве локали по умолчанию для Español, но, скажем, я хочу иметь другую локаль, такую ​​как Мексика, для локали по умолчанию, которую нужно разрешить для Español, есть ли способ сделать это?

Я имею в виду, скажем, что у кого-то есть строки для Español (Испания) и строки для Español (Мексика), они поместили бы испанские в значения-папки, а мексиканские в значения-es-rMX, так что другие локали будут по умолчанию значения-es, которые являются строками Испании. Я хочу, чтобы он был таким, чтобы в других регионах по умолчанию использовался мексиканский язык, а строки в Испании разрешались в Испании (Испания).

Я пытался использовать Español (Мексика) в качестве значений и Español (Испания) в значениях, но это не работает.

2 ответа

Файл - _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());
    }
}
}

Вы можете обратиться к этой ссылке, чтобы лучше понять, и на каких событиях вы должны вызывать свои коды в приложении, нажмите здесь для получения более подробной информации.

Я пытался использовать Español (Мексика) в качестве значений и Español (Испания) в значениях, но это не работает.

Я не уверен, что вы пытались заставить вас сказать это, но в целом это должно сработать.

В целом структура ресурсов всегда будет пытаться выбрать наиболее специфичные правила для сопоставления, но будет использовать все более общие правила, если не сможет найти соответствие. В API 24+ есть еще одна проблема для локалей ( подробнее читайте здесь), но общая схема все еще сохраняется.

Языки и диалекты, выбранные вами по умолчанию, полностью зависят от вас; ничего не говорит, что вы должны поместить английский текст в вашем 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)

Это будет означать:

  • Любой, чей телефон настроен именно на Испанский, увидит Испанский текст
  • Любой, у кого установлен телефон на любой другой диалект испанского, увидит мексиканский текст на испанском.
  • Любой, у кого телефон настроен на любой другой язык, увидит текст на английском языке.
Другие вопросы по тегам