目錄

名稱

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 的標準實用程式方法受到無法彌補的限制,因為它們無法針對不同語言、文化和應用程式中可能對它們提出的所有要求進行調整。因此,只要你的需求超出標準需求,擴充 numfquantsprintf 就是很自然的事。