2012-11-15 5 views
3

Locale::Maketext (또는 더 구체적으로는 CatalystX::I18N::Model::Maketext)을 통해 웹 사이트를 여러 언어로 번역했습니다.응용 프로그램에서 어떻게 동적으로 Maketext 어휘를 변경할 수 있습니까?

maketext 클래스는 데이터베이스에서로드하여 컴파일시 var % Lexicon 패키지에 어휘집을로드합니다.

내 앱에서 어휘집에 대한 관리 인터페이스를 추가하고 싶었지만 어휘집을 다시로드하는 방법을 알 수 없습니다. dev에 잘 작동하는 % Lexicon 해시를 새로 고치기 위해 각 로케일 클래스에 메소드를 추가했지만 포크 서버 (Starman)에서 실행 중일 때는 해당 서버 프로세스에서 패키지 var 만 다시로드합니다.

필자는 어휘집을 캐시에 넣을 수 있다고 생각했는데, 필요할 때 만료 될 수있었습니다. 그러나 Locale :: Maketext의 % Lexicon 해시는 런타임 시작시 채워지므로 모든 요청시 캐시에서 채우는 방법을 알아낼 수 없습니다.

내 최신 생각은 로케일 :: Maketext의 일부를 대체했지만, 난 어떤 스마트 아이디어 : 당신이 어떤 요청에 대해 약간의 성능 저하를 받아야하고자하는 경우

+1

나는 또한 묶인 해시를 생각하고 있지만 성능이 떨어지는 것처럼 보입니다. – cubabit

답변

0

당신이의 md5sum을 확인할 수 있습니다 찾고 있어요 파일을 maketext()에 각 호출 할 때마다. 예를 들어

: 나는 당신이 현재 로케일 :: MakeText 객체를 구축하는 방법을 알고하지 않는 한이

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; 
} 

참고 부분적으로 의사 코드, 그래서 채우기 위해 당신에게 그것을 떠 났어요 get_handle(). 하지만 전화를 maketext()으로 바꿔서 파일 내용이 변경되었는지 확인하는 방법을 알 수있을 것 같습니다.

.po 파일은 일반적으로 매우 작으며 일반적으로 최근에 변경된 파일은 일반적으로 Linux 디스크 캐시에 저장됩니다. 따라서 디스크에서 모든 명백한 읽기에도 불구하고 매우 빠르게 수행 될 것으로 예상됩니다.

관련 문제