【问题标题】:Localization of application manually手动本地化应用程序
【发布时间】:2015-08-28 13:07:18
【问题描述】:

一项任务包括以下内容:需要为用户提供更改应用程序界面语言的可能性(ru、en、uk,以及默认情况下将选择 en)。为了实现这个功能,它已经完成了:

1) 创建了资源文件夹:values、values - uk、values - ru、values - en,其中包含内容翻译的文件 strings.xml。

2) 通过 Spinner 取出并写在 SharedPreferences 语言 id 中。

3) 在应用程序开始时使用 onCreate 本地化:

SharedPreferences preferences = context.getSharedPreferences(Constants.APP_PREFERENCES, Context.MODE_PRIVATE);
String lang = preferences.getString(Constants.LANGUAGE, "default");
  if (lang.equals("default")) {
    lang=context.getResources().getConfiguration().locale.getCountry();
  }
  Locale locale = new Locale(lang);
  Locale.setDefault(locale);
  Configuration config = new Configuration();
  config.locale = locale;
  Log.i("Lang change", "Locale=" + locale);
  context.getResources().updateConfiguration(config,
  context.getResources().getDisplayMetrics());

几乎所有的人都会提出申请,但不是全部。即,在某些地方(在某些对话和 BaseAdapters 中,NavigationDrawer)会准确地提取系统语言的本地化。例如,在乌克兰语本地化的设备上,默认为英语,并且在应用程序中选择了俄语,然后在应用程序中的较高指示位置的总体中,除了基本的俄语之外,还会提取乌克兰语内容。

在onConfigurationChanged()中突破处理:

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

并从 manifest.xml android 中的每个活动中清除:configChanges = "locale"。

没有帮助。

可能有什么问题?

【问题讨论】:

标签: android localization locale


【解决方案1】:

我在您的代码中找不到问题。但这是我更改应用程序语言的方法。也许它可以帮助您。它工作正常;

//get sharedPreferences
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    //get default local for first initialization
    String defaultLanguage = this.getResources().getConfiguration().locale.getLanguage();
    Configuration configuration = new Configuration();
    //check language preference everytime onCreate of all activities, if there is no choise set default language
    Locale newLocaleLanguage = new Locale(sharedPreferences.getString("newLanguagePref",defaultLanguage));
    //finally setdefault language/locale according to newLocaleLanguage.
    Locale.setDefault(newLocaleLanguage);
    configuration.locale = newLocaleLanguage;
    getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics());

您应该将此代码写入 onCreate 方法中的所有活动。您应该在设置页面上使用newLanguagePref 标记写入您的sharedPreferences。

【讨论】: