2012-05-01 28 views
4

これは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で同じことをするには?私はPyICUを使っているので、Pythonの例が大歓迎ですが、Java/C/C++も問題です。問題はAPIであり、言語ではないからです。

ありがとうございます!

答えて

3

私はちょうど見つけました!

完全なコードは次のようになります:

>>> import icu 
>>> locale = icu.Locale("pt_BR") 
>>> print icu.getDisplayName() 
u'portuguese (Brazil)' 
>>> print icu.getDisplayName(locale) 
u'portugu\xeas (Brasil)' 

ので、ユーザーの現在のロケールで、デフォルトの戻り名でバベル、ロケールの方法とは異なり。ネイティブ言語で名前を取得するには、インスタンス自体を渡す必要があります。だから、の名前をあなたの言語(私の場合は英語)にしたい場合は簡単ですが、たとえばフランス語が欲しければ、私は 'fr_FR'の新しいLocaleインスタンスを作成する必要があります。奇妙なAPIが、それでも...

+0

正しくない。既定のロケールが英語なので、おそらくこの現象が表示されます。はい、ネイティブ言語で名前を取得するには、インスタンス自体を渡す必要があります。デフォルトのロケールを使用するICUの関数は、そのまま記述されています。 –

+0

ありがとう@ StevenR.Loomis、これを反映する答えを修正しました – MestreLion

2

オプションで別のロケールの名前をとる関数getDisplayLanguageがあります。私はC-apiがどのようにPythonに変換するのか分かりませんが、関連するCのドキュメントはhereです。

PyICU-ドキュメント上でチラチラ

、それはのようなもののようだ:getDisplayLanguageはゼロを取るかのように

wrapper sourceを見てみると
locale = Locale("pt_BR") 
name = locale.getDisplayLanguage("en") 

、それは、1つまたは2つのタプル、そうです。 はどうですか?私はPyICUコードベースに精通していないので、私はここで推測しています。代わりに、引数として文字列を渡すので、私は合格しなければならない...ロケールインスタンスを、最良の方法はgetDisplayName()ですが、:

+0

locale.getDisplayLanguage()はあなたのコードを使って文字列引数を受け付けません 'icu.InvalidArgsError' – MestreLion

+0

さらに調査して、最新の補遺を確認してください。 – Skurmedel

+0

まだエラーはありません... PyICUは文字列を1タプルに変換するほどスマートなので、 'en'と( 'en')の両方で同じエラーが発生しています: 'icu.InvalidArgsError :(、 'getDisplayLanguage'、( 'en'、)) '。とにかく、お試しいただきありがとうございます。私が本当に努力して貴重な研究論文を投稿していただき、ありがとうございます。 – MestreLion

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とのトラブルがあったごめんなさい。明確化の提案はありますか?

+0

あなたのコードを正しく理解していれば、私の答えとまったく同じ前提でしたが、C++では:Localeインスタンスを作成し、ロケール自体を渡すgetDisplayNameメソッドを使用しましたパラメータとして使用します。 – MestreLion

+0

あなたの答えは十分明確だったので心配しないでください。このAPIの解決策であると思われる 'x.y(x)'のような構造を見るのは変です。 – MestreLion

+0

ありがとう。それを '4.add(4)'のように考えてください - 主語と目的は同じです。 "私は自分と話す"(実際にはない)。私たちは便利な関数 'l.ownName()'を追加することができました。 –