如何用母语获取语言名称?

时间:2012-05-01 23:49:06

标签: python icu

这是我第一次使用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,而不是语言。

谢谢!

3 个答案:

答案 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时遇到了问题。你有任何澄清的建议吗?