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 is 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);
将返回 "A 1.550,222 km de distância"。
请注意,Locale::Maketext
的标准实用程序方法不可避免地受到限制,因为它们无法满足不同语言、文化和应用程序中对它们的期望。因此,一旦您的需求超过标准方法所能提供的,扩展 numf
、quant
和 sprintf
是很自然的。