如何在我的应用程序中动态更改Maketext词典?

时间:2012-11-15 12:29:08

标签: perl internationalization catalyst

我通过Locale::Maketext(或更具体地说是CatalystX::I18N::Model::Maketext)使我的网站成为多语言。

我的maketext类在编译时通过从数据库加载它来将词典加载到包var%Lexicon中。

我想在我的应用程序中为词典添加管理界面,但我无法找到重新加载词典的方法。我为每个语言环境类添加了一个方法来刷新%Lexicon哈希,它在dev中运行良好,但是当在分叉服务器(Starman)上运行时,它当然只在该服务器进程中重新加载包var。

然后我想也许我可以将词典放在缓存中,这可能会在需要时过期。但是,Locale :: Maketext中的%Lexicon哈希在运行时开始时填充,我无法弄清楚如何在每次请求时从缓存中填充它。

我最近的想法是覆盖部分Locale :: Maketext,但我正在寻找任何聪明的想法:)

1 个答案:

答案 0 :(得分:0)

如果您愿意接受某些请求的轻微性能影响,则可以在每次调用maketext()时检查该文件的md5sum。

例如:

package MyMakeText;

use strict;
use warnings;

use Digest::MD5;

my @PO_FILES = ('exaple.po');
my %FILE_TO_DIGEST;

my $LOCALIZER;

sub maketext {

    if (files_have_changed() || !$LOCALIZER) {
        $LOCALIZER = get_handle();
    }

    return $LOCALIZER->maketext(@_);
}

sub files_have_changed {
    my $files_have_changed = 0;

    for my $po_file (@PO_FILES) {
        open(my $fh, '<', $po_file) or die $!;
        my $md5sum = Digest::MD5->new->addfile($fh)->hexdigest;
        close($fh);

        if (!exists $FILE_TO_DIGEST{$po_file} || $FILE_TO_DIGEST{$po_file} ne $md5sum) {
            $FILE_TO_DIGEST{$po_file} = $md5sum;
            $files_have_changed = 1;
        }
    }

    return $files_have_changed;
}

注意这是部分伪代码,因为我不知道你当前是如何构建Locale :: MakeText对象的,所以我把它留给你填写get_handle()。但我认为您可以看到如何将您的呼叫包裹到maketext()以包括检查是否有任何文件已更改其内容。

.po文件通常非常小,最近更改的文件通常位于Linux磁盘缓存中,所以尽管磁盘上有明显的读取,但我希望这个文件非常快。