在寻找语言的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代码?
答案 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