从Perl中的本地语言名称获取语言代码

时间:2016-09-11 16:36:09

标签: perl internationalization

在寻找语言的ISO369代码时,这可以正常使用该语言的英文名称:

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

但它不适用于母语名称:

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

背景:我有几种语言的文字,需要生成HTML hreflang链接。文本总是用其本地语言名称标记(例如,“英语”,“Español”或“Deutsch”)。我不想在查找之前切换(系统)语言,因为我不知道要切换哪种语言。现在我有自己的查找表,例如“英语”=> “en”和“Deutsch”=> “de”,但我想知道是否有一种更简单的方法,不需要我维护那张桌子。

如何从语言的本机名称获取其ISO代码?

2 个答案:

答案 0 :(得分:2)

根据文件, Locales::Language 在cpan上应该让你做到这一点。你试过吗?

编辑:

我通过cpan安装了Locales,这对我来说很好。 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想要什么。 我认为实现这一目标的最简单方法是构建更完整的查找 使用我提到的Locales模块。 在我相当老的机器上,这不需要很长时间:

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);
...

答案 1 :(得分: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";
}

输出

  

Deutsch:de

     

Español:es

     

英语:en