Как использовать другую локаль в качестве локали по умолчанию для языков?
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)
Это будет означать:
- Любой, чей телефон настроен именно на Испанский, увидит Испанский текст
- Любой, у кого установлен телефон на любой другой диалект испанского, увидит мексиканский текст на испанском.
- Любой, у кого телефон настроен на любой другой язык, увидит текст на английском языке.