如何从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