如何从Android的不同语言环境中获取string?
所以我想在几个语言环境中获取一个string的值,而不pipe设备/应用程序的当前区域设置如何。 我该怎么做?
基本上我需要的是一个函数getString(int id, String locale)
而不是getString(int id)
我怎么能这样做?
谢谢
注意如果您的最小API是17+,直接回答这个答案的底部。 否则,请继续阅读…
如果你有不同的语言环境的res文件夹,你可以这样做:
Configuration conf = getResources().getConfiguration(); conf.locale = new Locale("pl"); DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); Resources resources = new Resources(getAssets(), metrics, conf); String str = resources.getString(id);
或者,您可以使用@jyotiprakash指向的方法重新开始活动。
注意像这样调用Resources
构造函数会改变Android内部的东西。 你将不得不调用你的原始地点的构造函数,让事情恢复原样。
编辑从一个特定的区域设置检索资源略有不同(而且更清洁)的配方是:
Resources res = getResources(); Configuration conf = res.getConfiguration(); Locale savedLocale = conf.locale; conf.locale = desiredLocale; // whatever you want here res.updateConfiguration(conf, null); // second arg null means don't change // retrieve resources from desired locale String str = res.getString(id); // restore original locale conf.locale = savedLocale; res.updateConfiguration(conf, null);
从API级别17开始,应该使用conf.setLocale()
而不是直接设置conf.locale
。 这将正确更新configuration的布局方向,如果您碰巧在从右到左和从左到右的区域设置之间切换。 (布局方向在17年推出)
创build一个新的Configuration
对象是没有任何意义的(因为@Nulano在评论中提到),因为调用updateConfiguration
将改变通过调用res.getConfiguration()
获得的原始configuration。
如果你要加载一个语言环境的几个string资源,我会毫不犹豫地将它们捆绑到一个getString(int id, String locale)
方法中。 更改语言环境(使用任一配方)要求框架执行大量重新绑定所有资源的工作。 一次更新区域设置,检索所需的所有内容,然后设置区域设置会更好。
编辑 (感谢@Mygod):
如果您的最低API级别为17+,则有更好的方法,如另一个线程中的答案所示。 例如,您可以创build多个Resource
对象,每个Resource
对象用于您需要的每个语言环境:
@NonNull Resources getLocalizedResources(Context context, Locale desiredLocale) { Configuration conf = context.getResources().getConfiguration(); conf = new Configuration(conf); conf.setLocale(desiredLocale); Context localizedContext = context.createConfigurationContext(conf); return localizedContext.getResources(); }
然后从本方法返回的本地化Resource
对象中获取你喜欢的Resource
。 一旦你找回资源,就不需要重置任何东西。
这里是Ted Hopp描述的方法的组合版本。 这样,代码适用于任何Android版本:
public static String getLocaleStringResource(Locale requestedLocale, int resourceId, Context context) { String result; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { // use latest api Configuration config = new Configuration(context.getResources().getConfiguration()); config.setLocale(requestedLocale); result = context.createConfigurationContext(config).getText(resourceId).toString(); } else { // support older android versions Resources resources = context.getResources(); Configuration conf = resources.getConfiguration(); Locale savedLocale = conf.locale; conf.locale = requestedLocale; resources.updateConfiguration(conf, null); // retrieve resources from desired locale result = resources.getString(resourceId); // restore original locale conf.locale = savedLocale; resources.updateConfiguration(conf, null); } return result; }
用法示例:
String englishName = getLocaleStringResource(new Locale("en"), id, R.string.name);
注意
正如原来的答案中所述,将上述代码的多个调用replace为单个configuration更改和多个resources.getString()调用可能会更有效。
你在找什么叫做ResourceBundle类。 这是链接:
Google文档ResourceBundle