这是我第一次使用ICU API,而且我很难找到一些我认为非常简单的东西:用本地语言获取给定的语言环境/语言名称 / em>(而不是英文)
示例:
fr -> Français
en -> English
pt_BR -> Português Brasileiro, or "Português (Brasil)"
es_ES -> Español Iberico, or "Español (España)"
作为参考,在babel
中,我可以使用任何语言获取给定的区域设置名称,本机是默认语言:
>>> import babel
>>> locale = babel.Locale.parse('pt_BR')
>>> locale.get_display_name()
português (Brasil)
>>> locale.get_display_name('fr')
portugais (Brésil)
>>> locale.get_display_name('en')
Portuguese (Brazil)
那么,如何在ICU中做同样的事情呢? python中的例子非常受欢迎,因为我使用PyICU,但Java / C / C ++也很好,因为我的问题在于API,而不是语言。
谢谢!
答案 0 :(得分:3)
我刚刚发现:最好的方法是getDisplayName()
,但是,我必须传递一个Locale实例,而不是传递一个字符串作为参数!
完整的代码如下:
>>> import icu
>>> locale = icu.Locale("pt_BR")
>>> print icu.getDisplayName()
u'portuguese (Brazil)'
>>> print icu.getDisplayName(locale)
u'portugu\xeas (Brasil)'
因此,与babel不同,默认情况下,Locale方法返回用户当前语言环境中的名称。我必须传递实例本身才能用母语获取名称。所以如果你想要你的语言(在我的例子中,英语)中的名字很容易,但是如果我想用法语,例如,我将不得不创建一个新的'fr_FR'的Locale实例。奇怪的API,但仍然......
答案 1 :(得分:2)
有一个函数getDisplayLanguage
,它可以选择另一个区域设置的名称。我不知道C-api如何转换为Python,但相关的C文档是here。
浏览PyICU-docs,似乎是这样的:
locale = Locale("pt_BR")
name = locale.getDisplayLanguage("en")
查看wrapper source,似乎getDisplayLanguage
采用零,一或两元组。那么getDisplayLanguage(("en",))
呢?我不熟悉PyICU代码库,所以我猜这里。
答案 2 :(得分:2)
#include <unicode/locid.h>
#include <unicode/ustream.h>
#include <iostream>
int main()
{
Locale l("pt_BR");
UnicodeString result;
std::cout << l.getDisplayName(l, result) << std::endl;
}
☛português (Brasil)
我很抱歉您在使用ICU API时遇到了问题。你有任何澄清的建议吗?