6

这是我第一次使用 ICU API,我很难找到一些我认为非常简单的东西:以母语(而不是英语)获取给定的语言环境/语言名称

例子:

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,而不是语言。

谢谢!

4

3 回答 3

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 方法默认返回用户当前语言环境中的名称。我必须通过实例本身以获取本地语言的名称。因此,如果您想要使用您的语言(在我的情况下是英语)的名称,这很容易,但是如果我想要使用法语,例如,我将不得不创建一个新的 Locale 实例“fr_FR”。奇怪的API,但仍然......

于 2012-05-02T00:32:00.020 回答
2

有一个 function getDisplayLanguage,它可以选择使用另一个语言环境的名称。我不知道 C-api 如何转换为 Python,但相关的 C 文档在这里


浏览 PyICU-docs,它似乎是这样的:

locale = Locale("pt_BR")
name = locale.getDisplayLanguage("en")

查看包装器 source,似乎getDisplayLanguage需要一个零、一或二元组。怎么样getDisplayLanguage(("en",))?我不熟悉 PyICU 代码库,所以我在这里猜测。

于 2012-05-01T23:55:00.443 回答
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 时遇到了问题。你有什么澄清的建议吗?

于 2012-07-25T20:33:32.597 回答