【问题标题】:Android localization from external XML来自外部 XML 的 Android 本地化
【发布时间】:2012-12-04 23:21:45
【问题描述】:

是否可以在运行时使用从服务接收的 XML 来翻译 android 应用程序? 如果可能的话,请有人指出我正确的方向。

谢谢。

【问题讨论】:

  • 我相当肯定答案是否定的。原因是“自动”语言选择依赖于作为资源一部分的不同本地化“字符串”文件。无法在运行时更新资源文件。
  • @Squonk 除非我错过了理解,否则这是不正确的。我只是在我的应用程序中做到了。有一个屏幕可以选择西班牙语或英语,并允许用户根据选择更改使用哪个字符串文件。不通过服务接收 XML,因为它确实需要使用 strings.xml,但可以在运行时更改
  • @codeMagic :我并不是说不能在运行时更改语言选择——这就是本地化“字符串”文件的意义所在。 OP(在问题的标题中)正在询问是否可以使用“外部 XML”来做到这一点......这就是我试图提出的观点。
  • @codeMagic :没问题。我所说的“在运行时更新资源文件”的意思是资源被放置在/res 目录中,并且在编译时是“内置”的。因此,无法在运行时添加新的资源文件。
  • +1 进行澄清。我希望我们仍然可以成为朋友:P

标签: android xml web-services localization


【解决方案1】:

警告

我所阅读的所有内容都表明,让您的应用更改语言不是一个好主意,因为 Android 框架不支持它并且可能会导致问题。

话虽如此,我已经在我的应用程序中完成了它,虽然它有点痛苦,但它似乎到目前为止还有效。如果您想这样做,我就是这样做的。您需要为每种语言创建一个单独的 strings.xml 文件。 strings.xmlvalues 文件夹中作为您的默认值,然后可能在 strings.xml 中设置为西班牙语字符串的 values-es 文件夹。我使用以下代码根据用户选择的RadioButton 更改配置设置

final Configuration LANG_CONFIG = ChooseLocale.this.getResources().getConfiguration();
Locale newLocale = new Locale("English");
curLang = ChooseLocale.this.getLanguage();
if ((curLang.equals("English")) || (curLang.equalsIgnoreCase("Ingles")))
{
    newLocale = new Locale("en_US");
}
else
{
    newLocale = new Locale("es");
}
Toast.makeText(getApplicationContext(), newLangToast + " " + curLang , Toast.LENGTH_SHORT).show();
Configuration config = getBaseContext().getResources().getConfiguration();
Locale.setDefault(newLocale);
config.locale = newLocale;
getBaseContext().getResources().updateConfiguration(config, 
        getBaseContext().getResources().getDisplayMetrics());

SharedPreferences.Editor editor = langPref.edit();
editor.putString(LANG_PREF, curLang);
editor.commit();

这一行是最重要的更新配置

getBaseContext().getResources().updateConfiguration(config, 
        getBaseContext().getResources().getDisplayMetrics());

我从我的getLanguage() 函数中获取语言环境,可以根据需要进行处理。我还必须添加

@Override
public void onConfigurationChanged(Configuration newConfig) {
    newConfig = Globals.getUserLanguage(this);
    super.onConfigurationChanged(newConfig);

到每个允许改变方向的活动,并将其添加到我的onCreate()

final SharedPreferences langPref = getSharedPreferences (LANG_PREF, 0);
if (Globals.langConfig != null)
    this.onConfigurationChanged(Globals.langConfig);

我还在清单中允许改变方向的每个活动中添加了android:configChanges="orientation|locale"

Android Docs on localization

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2018-12-27
    相关资源
    最近更新 更多