使用特定语言环境中的字符串从默认语言环境中获取字符串

时间:2011-06-29 19:34:40

标签: android localization

好的,我知道标题听起来很疯狂:)

这就是我想要的。我的应用程序已本地化为设备用户,但我发送回服务器的信息需要全部为英文。我的默认应用语言环境英语。

例如,我有数组:

  • 苹果
  • 橙子
  • 桃子

我有本地化数组:

  • Яблоки
  • Апельсины
  • Персики

当俄罗斯用户看到列表并选择几个项目时 - 我需要获得相应的英文版本。

我想我的答案归结为如何做getString()并传递locale? 或者如何在特定区域设置中获取Array?

8 个答案:

答案 0 :(得分:24)

即使设备上的默认语言环境不同,下面的代码也会检索波兰语的本地化字符串:

Configuration conf = getResources().getConfiguration();
conf.locale = new Locale("pl");
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Resources resources = new Resources(getAssets(), metrics, conf);
/* get localized string */
String str = resources.getString(R.string.hello);

我希望这也适用于像array这样的其他资源类型,所以将“pl”替换为“en”就足够了......

答案 1 :(得分:2)

如果您使用JB 2.2.x或更高版本(基本上是API> = 17),您可以使用createConfigurationContext来执行:

public String translate(Locale locale, int resId) {  
    Configuration config = new Configuration(context.getResources().getConfiguration()); 
    config.setLocale(locale);   
    return context.createConfigurationContext(config).getText(resId);
}

答案 2 :(得分:1)

您必须通过其他内容识别元素,例如ID,甚至是英文名称。

无法获取给定本地化字符串的原始字符串。其中一个原因是字符串的本地化不是传递函数,但还有许多其他原因导致这不是一个好的方向。

答案 3 :(得分:1)

如果您的设备没有强制使用的语言环境,则此“强制”本地化将无效。

无法证明这“就像这样”,但刚才我正在努力解决这个问题,我迫使资源在语言环境/语言中没有安装在设备上(在Android 2.3.3上),并且仍然从values-en(英语)资源中获取字符串。

在其他设备上,使用您正在强制的区域设置(但不必设置为当前区域设置),您将获得正确的资源。

答案 4 :(得分:1)

这个没有副作用:API17和更高

{{1}}

答案 5 :(得分:0)

我相信,这是一种安全的方式(不涉及当前配置):

Configuration conf = new Configuration();
conf.setToDefaults();   // That will set conf.locale to null (current locale)
// We don't want current locale, so modify it
conf.locale = new Locale("");   // Or conf.locale = Locale.ROOT for API 9+
                                // or conf.setLocale(Locale.ROOT) for API 14+
// Since we need only strings, we can safely set metrics to null
Resources rsrcDflt = new Resources(getAssets(), null, conf);
String apples = srcDflt.getString(R.string.apples); // Got it at last!

答案 6 :(得分:0)

我遇到了与ListPreference相同的问题,它保存了“州名”和“身体图”的偏好。 ListPreference从保存在本地化“值”文件夹中的数组中获取其值和条目。 列表值相同(英语)但条目已本地化(英语和希伯来语)。

我终于使用了以下代码:

public void OnSharedPreferenceChanged (SharedPreferences sharedPreferences, String key)
{
    SharedPreferences.Editor editor = sharedPreferences.edit();
    Preference pref = settings.findPreference(key);
    pref.setSummary(sharedPreferences.getString(key, ""));

    if (key.equalsIgnoreCase(PREF_STATE) 
        || key.equalsIgnoreCase(PREF_BODY_FIGURE))
    {
        editor.putString(key, ((ListPreference) pref).getValue());
        editor.commit();
    }
}

这样,首选项总是向用户显示本地化字符串(作为摘要),但将英文字符串保存在最终发送到服务器的首选项内存中。

答案 7 :(得分:0)

我结合了处理所有Android版本所需的两种方法。 See my answer here