Java 如何将IETF BCP 47语言代码转换为显示字符串?

Java 如何将IETF BCP 47语言代码转换为显示字符串?,java,android,locale,Java,Android,Locale,如何将IETF BCP 47语言代码[例如zh cmn Hant HK]转换为Android(Java)中的显示字符串[例如“中文普通话、繁体(香港特区)” 一些背景。我正在使用从语音到文本的API。我正在调用sendOrderedBroadcast,通过RecognitzerIntent.EXTRA_supported_languages传递接收受支持语言列表的BroadcastReceiver。额外的_支持的_语言作为IETF BCP 47代码而不是Java语言环境代码提供: Androi

如何将IETF BCP 47语言代码[例如zh cmn Hant HK]转换为Android(Java)中的显示字符串[例如“中文普通话、繁体(香港特区)”

一些背景。我正在使用从语音到文本的API。我正在调用sendOrderedBroadcast,通过RecognitzerIntent.EXTRA_supported_languages传递接收受支持语言列表的BroadcastReceiver。额外的_支持的_语言作为IETF BCP 47代码而不是Java语言环境代码提供:


Android为使用IETF BCP 47代码提供了哪些支持?我特别感兴趣的是获得上面示例中所示的显示名称。

Android不支持。总的来说,我不认为你会在ICU之外找到这样的支持

所以你有两个选择:ICU4J或ICU4C

对于ICU4J,您应该带上自己的副本,因为它不在那里

ICU4C出现在Android上(Dalvik中的所有国际化功能都在其上实现)。您可以使用NDK(本机开发工具包)从C/C++模块调用ICU4C,并使用JNI从Java访问本机模块。 但是,尽管默认情况下ICU4C是存在的,但Android并没有公开它,并且强烈反对使用它。更不用说ICU4C数据文件可能会被大量剥离,因此拼写bcp 47代码所需的信息可能不存在


所以最安全的是你自己的ICU4J副本。您可以将其与应用程序一起部署,也可以将该信息作为web服务公开给应用程序使用。

感谢您提供有关ICU4J和ICU4C的提示--我将使用ICU4J。对于希望将IETF BCP 47代码转换为显示字符串的其他人,以下步骤是:1)使用IETF BCP47语言代码调用ULocale.forLanguageTag以获取ULocale对象2)调用ULocale对象上的getDisplayLanguage方法以获取显示字符串。@Theo
ULocale.forLanguage
要求最低api级别24。@viper:这个答案是正确的在API 24问世之前编写。您需要将ICU4J作为库集成到项目中,然后从ICU4J库导入
ULocale
。自API24以来,Android中已经包含了一个版本的
ULocale
,但是如果你想支持旧版本的Android,你仍然需要将ICU4J集成为一个库。谢谢@Theo。我能够使用
Locale.forLanguageTag()
方法将语言代码转换为语言名称。