2009-05-16 6 views
6

나는 사용자에게 보내는 텍스트와 메시지를 번역하기 위해 gettext를 사용하기 시작했습니다. 저는 poedit를 편집기로 사용하고 있지만 동적 메시지에 어려움을 겪고 있습니다.동적 인 gettext에 대한 poedit 해결 방법

예를 들어 나는 오류 유형을 알려주는 변수가있는 로그인과 같은 것들이 있습니다.

$this->translate('page-error-' . $error); 

poedit에서 자동 업데이트 할 때 "page-error-"처럼 읽습니다. 내가하는 일은 자동 업데이트 할 때 모든 poedit에 추가 할 수있는 가능한 모든 키가있는 translate 메서드에 더미 호출을 배치하는 파일입니다.

나는 특히 이런 상황을 좋아하지 않습니다. 어떻게할까요? 당신의 아이디어

+0

내가 문제를 이해하지 못했습니다 :

$translated_role = _('role_' . $role); 

크레딧에. 더 명확하게 설명해 주시겠습니까? – farzad

답변

5

뭔가를하려고 아니요 - 편집기 (그리고 gettext 도구) 프로그램을 실행하지 않고, 당신의 소스를 읽기 때문에이 불가능합니다 . 더미 호출을 유지하거나 변환 파일에 직접 키를 추가해야합니다.

+0

어떻게 수동으로 키를 추가 할 수 있습니까? 나는 길을 찾을 수 없었다. 또한 소스와 동기화 할 때 제거되는 키가 있습니까? –

+0

페이지 추가 - % s 개 추가 – Blaise

2

에 대한

덕분에 당신은

$this->translate(sprintf('page-error-%s', $error)); 
+3

어떻게 나는 dinamic 열쇠를 문제가되지 않습니다, 문제는 poedit에 그들을 추가하는 방법입니다. –

0

같은 문제가 발생했습니다. 내가 픽업 것 'FORM_HEADER_'코드의 난 (생성) 가지고 식별자하지 않은 poedit와 동기화 할 때, 예를 들면

난 PHP

//Gives FORM_HEADER_ADD or FORM_HEADER_EDIT 
echo $this->translate('FORM_HEADER_' . strtoupper($this->data)); 

있다.

그래서 내가 수행하여이 UPDATE PHP

echo ($this->data === 'add') ? $this->translate('FORM_HEADER_ADD') : $this->translate('FORM_HEADER_EDIT'); 

다음과 같은 것을 내주는 Poedit 전체 식별자는 내가 해결 문제를 해결했다!

계속이 문제를 조사했습니다. 그리고 나는 근원지에서 수입을 포기했다. 이것은 내가 더 나은 해결책을 찾을 때까지 계속하는 것입니다.

  1. 가능한 한 많은 정적 식별자를 사용하고 사용하십시오.
  2. 소스와 동기화 미번역 (동적) 식별자

    protected function _initMyTranslate(){ 
    
        $date = new Zend_Date(); 
        $fileName = sprintf('/../logs/translation_%1$s.log', $date->toString('dd-MM')); 
    
        $writer = new Zend_Log_Writer_Stream(APPLICATION_PATH . $fileName); 
        $log = new Zend_Log($writer); 
    
        // get the translate resource from the ini file and fire it up 
        $resource = $this->getPluginResource('translate'); 
        $translate = $resource->getTranslate(); 
    
        // add the log to the translate 
        $translate->setOptions(
          array(
           'log'    => $log, 
           'logUntranslated' => true 
          ) 
         ); 
    
        // return the translate to get it in the registry and so on 
        return $translate; 
    } 
    
  3. 사용 Poedit를 기록 가능 및 발견 된 문자열을 번역.

  4. 테스트/디버깅 단계에서 번역되지 않은 문자열에 대한 로그를 확인하십시오.
  5. 번역되지 않은 문자열을 .po 파일에 추가하십시오.

    msgid "IDENTIFIER" 
    msgstr "TRANSLATION STRING" 
    
  6. 열기 PO 파일 및 모 파일 (원본과 동기화 또는 전부가 손실하지 마십시오) 작성에 저장합니다.

2.

지금 내 수동 식별자에 대한 별도의 파일을 사용하는 텍스트 편집기 (gedit를/메모장)를 사용하여 UPDATE. 지금은 두 개의 파일이 있습니다 poedit에 의해 생성

  1. 자동 < 언어라는를 >와 .po
  2. 수동으로 편집 해 파일이라고 < 언어 > _manual.po

난 구성 내 application.ini에서 번역 언어 디렉토리의 모든 파일을 검색합니다.

resources.translate.adapter = gettext 
resources.translate.content = APPLICATION_PATH "/../library/languages/" 
resources.translate.locale = auto ;use en to force english or nl for dutch..etc 
resources.translate.scan = directory 
resources.translate.options.disableNotices = false 

poedit에서 다른 언어로 파일 -> POT 파일의 새 카탈로그를 작성하고 수동으로 추가 한 문자열의 번역을 시작하십시오.

0

제한된 수의 오류가있는 경우 if (false) 조건 내에 더미 코드를 추가 할 수 있습니다.이 코드의 유일한 목적은 PoEdit에서 번역을 선택하는 것입니다. 예를 들어

:

if (false) { 
    _('role_visitor'); 
    _('role_hiker_reader'); 
    _('role_hiker'); 
    _('role_translator'); 
    _('role_proofreader'); 
    _('role_moderator'); 
    _('role_moderator_2'); 
    _('role_moderator_3'); 
    _('role_admin'); 
} 

과 그런 다음 번역 할 수 있습니다 : http://eng.marksw.com/2012/12/05/how-to-expose-dynamic-translatable-text-to-translation-tools-like-poedit/