我通过Locale::Maketext(或更具体地说是CatalystX::I18N::Model::Maketext)使我的网站成为多语言。
我的maketext类在编译时通过从数据库加载它来将词典加载到包var%Lexicon中。
我想在我的应用程序中为词典添加管理界面,但我无法找到重新加载词典的方法。我为每个语言环境类添加了一个方法来刷新%Lexicon哈希,它在dev中运行良好,但是当在分叉服务器(Starman)上运行时,它当然只在该服务器进程中重新加载包var。
然后我想也许我可以将词典放在缓存中,这可能会在需要时过期。但是,Locale :: Maketext中的%Lexicon哈希在运行时开始时填充,我无法弄清楚如何在每次请求时从缓存中填充它。
我最近的想法是覆盖部分Locale :: Maketext,但我正在寻找任何聪明的想法:)
答案 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磁盘缓存中,所以尽管磁盘上有明显的读取,但我希望这个文件非常快。