好的,我知道标题听起来很疯狂:)
这就是我想要的。我的应用程序已本地化为设备用户,但我发送回服务器的信息需要全部为英文。我的默认应用语言环境英语。
例如,我有数组:
我有本地化数组:
当俄罗斯用户看到列表并选择几个项目时 - 我需要获得相应的英文版本。
我想我的答案归结为如何做getString()并传递locale? 或者如何在特定区域设置中获取Array?
答案 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