内容

名称

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 的标准实用程序方法不可避免地受到限制,因为它们无法满足不同语言、文化和应用程序中对它们的期望。因此,一旦您的需求超过标准方法所能提供的,扩展 numfquantsprintf 是很自然的。