2016-09-11 4 views
2

にネイティブ言語名から言語コードを取得し、これは、言語の英語名で正常に動作します:言語のISO369コードを探しているときにはPerl

perl -MLocale::Language -e 'print language2code("German"), "\n";' 
de 

しかし、それはネイティブ言語名では動作しません。 :

perl -MLocale::Language -e 'print language2code("Deutsch"), "\n";' 

は背景:私はいくつかの言語のテキストを持っており、HTML hreflangリンクを生成する必要があります。テキストには常に母国語の名前(「英語」、「スペイン語」、「ドイツ語」など)が表示されます。どの言語を切り替えるべきかわからないので、私は検索の前に(システム)言語を切り替えたくない。今は「英語」=>「en」と「Deutsch」=>「de」などの独自のルックアップテーブルがありますが、そのテーブルを維持する必要がない簡単な方法があるかどうかは疑問でした。

どのようにして言語のネイティブ名からISOコードを取得できますか?

答えて

2

ドキュメントによると、cpanの Locales::Language によると、そうすることができます。あなたはそれを試しましたか?

編集:

私は私のためにうまく働いたCPAN経由でロケールをインストールしました。その後 cpan Locales

:再び

use Locales; 
my $locale = Locale->new('de_DE'); 

warn $locale->get_code_from_language("Deutsch"); # de 
warn $locale->get_code_from_language("Englisch"); # en 

編集:

明確化した後、私は今、OPが望んでいるものを知っています。 これを達成する最も簡単な方法は、私が言及したロケールモジュールを使用して、より完全な検索 を作成することだと思います。私はむしろ古いマシン上で は、それが長い間、まったくかかりません。

my %locale_lookup 
for my $code ($locale->get_language_codes){ 

    my $locale = Locales->new($code) // next; # ignore codes w/o locale 
    $locale_lookup{$locale->get_language_from_code} = $locale; 

} 

... 
my $locale = $locale_lookup{$tag}; # e.g. "Deutsch" 
my $code = $locale->get_code_from_language($tag); 
... 
+0

エンあなたはそれを使用する方法の例を含める必要があります。可能なすべての言語のうち – simbabque

+0

?私はあなたの質問を間違えたと思います。 – bytepusher

+0

ドキュメントを少し見て、何らかの「すべて」の方法を見つけました。 – bytepusher

0

は、ここで私は、@ bytepusherの回答に基づいて、単に完全を期すため、になってしまったものです。 @bytepusherへのすべての信用。

use strict; 
use warnings; 
use Locales; # install with cpan install Locales, not just cpan install Locales::Language 
# Or, with UTF8: 
# use utf8; 
# use Locales unicode => 1; 

sub code_for { 
    my ($lang) = @_; 

    foreach my $lcode (Locales::->new()->get_language_codes()) { 
     my $loc = Locales->new($lcode); 
     next unless($loc); 
     my $code = $loc->get_code_from_language($lang); 
     return $code if ($code); 
    } 
    return undef; 
} 


foreach my $lang (qw(Deutsch Español English)) { 
    print "$lang: ", code_for($lang), "\n"; 
} 

出力

ドイツ:デ

日本語Español:

英語をES:

+1

私は参照を一度だけ構築することをお勧めします。 それをcode_forで使用します。 変数を使用してビルドメソッド(Moose)または のルックアップ属性を使用すると、code_forまたはBEGINブロックをチェックインして遅延を埋めることができます。 – bytepusher

関連する問題