为了账号安全,请及时绑定邮箱和手机立即绑定

如何从Android中的不同语言环境获取字符串?

如何从Android中的不同语言环境获取字符串?

心有法竹 2019-09-24 15:32:30
因此,无论设备/应用程序当前的语言环境设置如何,我都希望在多个语言环境中获取String的值。我应该怎么做?基本上我需要的是功能getString(int id, String locale)而不是功能getString(int id)我该怎么办?谢谢
查看完整描述

3 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

注意如果您的最低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。如果您恰巧在从右到左和从左到右的语言环境之间切换,这将正确更新配置的布局方向。(布局方向在17中介绍。)


创建新Configuration对象没有任何意义(如@Nulano在评论中建议的那样),因为调用updateConfiguration将更改通过调用获得的原始配置res.getConfiguration()。


getString(int id, String locale)如果您要为某个语言环境加载多个字符串资源,我会毫不犹豫地将其捆绑为一个方法。更改语言环境(使用任何一种方法)都要求框架进行大量重新绑定所有资源的工作。最好一次更新区域设置,检索所需的所有内容,然后再设置区域设置。


编辑(感谢@Mygod):


如果您的最低API级别为17+,则有更好的方法,如另一个线程上的此答案所示。例如,您可以创建多个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从此方法返回的本地化对象中检索所需的资源即可。检索资源后,无需重置任何内容。


查看完整回答
反对 回复 2019-09-24
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

值得尝试,但是我不认为这就是为什么Android感到“困惑”的根源(如您所说)。查看Resources构造函数的源代码,您将看到创建这样的新Resources对象会更改流程资产(显然是单例)中的内容。一旦我意识到需要重新设置一切,我就不必费心寻找确切的原因。构造新Resources对象的另一种方法(也许更清洁)是resources.updateConfiguration(conf, null)在更改区域设置后调用

查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 2371 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信