Locale::Maketext::Cookbook - 使用 Locale::Maketext 的食譜
這是一個正在進行中的工作。到目前為止進度不大 :-)
改編自 Dan Muey 的建議
在你的主要詞彙中,雜湊鍵和值重疊是很常見的。就像這樣
q{Hello, tell me your name}
=> q{Hello, tell me your name}
寫成這樣會很好
q{Hello, tell me your name} => ''
並神奇地擴充成第一種形式。這種表示方式的優點包括檔案較小、較不容易錯字或貼錯,而且對翻譯者來說很方便,他們可以簡單地複製主要詞彙並輸入翻譯,而不需要先移除值。
這可以透過覆寫類別中的 init
並使用類似這樣的程式碼處理主要詞彙來達成
package My::I18N;
...
sub init {
my $lh = shift; # a newborn handle
$lh->SUPER::init();
inflate_lexicon(\%My::I18N::en::Lexicon);
return;
}
sub inflate_lexicon {
my $lex = shift;
while (my ($k, $v) = each %$lex) {
$v = $k if !defined $v || $v eq '';
}
}
我們在此假設 My::I18N::en
擁有主要詞彙。
此處有一些缺點:在這個 init()
執行後,大小經濟將無法在執行時間維持。但這不應該是關鍵,因為如果你沒有空間,你也不會為主要語言以外的任何其他語言有空間。你也可以使用關聯來執行此操作,在查詢時間擴充套件值,這應當是一個更花費時間的選項。
在 CPAN RT #36136 (https://rt.cpan.org/Ticket/Display.html?id=36136) 之後
Locale::Maketext 的文件建議標準括號方法 numf
受到限制,你必須覆寫它才能獲得更好的結果。它甚至建議使用 Number::Format。
標準 numf
的一個此類缺陷是無法使用特定的小數精度。例如,
$lh->maketext('pi is [numf,_1]', 355/113);
輸出
pi is 3.14159292035398
由於 pi ≈ 355/116 僅精確到小數點後 6 位,因此你會想要說
$lh->maketext('pi is [numf,_1,6]', 355/113);
並得到「pi 是 3.141592」。
一個解決方案可以使用 Number::Format
,如下所示
package Wuu;
use base qw(Locale::Maketext);
use Number::Format;
# can be overridden according to language conventions
sub _numf_params {
return (
-thousands_sep => '.',
-decimal_point => ',',
-decimal_digits => 2,
);
}
# builds a Number::Format
sub _numf_formatter {
my ($lh, $scale) = @_;
my @params = $lh->_numf_params;
if ($scale) { # use explicit scale rather than default
push @params, (-decimal_digits => $scale);
}
return Number::Format->new(@params);
}
sub numf {
my ($lh, $n, $scale) = @_;
# get the (cached) formatter
my $nf = $lh->{__nf}{$scale} ||= $lh->_numf_formatter($scale);
# format the number itself
return $nf->format_number($n);
}
package Wuu::pt;
use base qw(Wuu);
然後
my $lh = Wuu->get_handle('pt');
$lh->maketext('A [numf,_1,3] km de distância', 1550.2222);
將傳回「距離 1.550,222 公里」。
請注意,Locale::Maketext
的標準實用程式方法受到無法彌補的限制,因為它們無法針對不同語言、文化和應用程式中可能對它們提出的所有要求進行調整。因此,只要你的需求超出標準需求,擴充 numf
、quant
和 sprintf
就是很自然的事。