2009-05-16 8 views
6

私はテキストとメッセージをユーザーに送信するためにgettextを使い始めました。 私はエディタとしてpoeditを使用していますが、私は動的なメッセージに苦しんでいます。動的gettextのpoedit回避策

たとえば、エラーの種類を示す変数があるログインのようなものがあります。

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

私がpoeditから自動更新すると、 "page-error-"のように読み込まれます。 私はファイルを持っていますが、自動更新時に私のpoeditにそれらを追加するために可能なすべてのキーを使ってtranslateメソッドにダミー呼び出しを行います。

私はこのような状況は特にありません。 あなたはどうやってそれをやりますか?あなたのアイデア

+0

:に

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

クレジット:あなたは、その後に翻訳することができます

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

:たとえば

。あなたはそれをもっと明確に説明できますか? – farzad

答えて

5

ような何かをしようとしていませ - んエディタ(とgettextツールが)プログラムを実行していない、あなたのソースを読んでいるので、これは、可能ではありません。ダミーコールを保持するか、キーを翻訳ファイルに自分で追加する必要があります。

+0

どのように手動でキーを追加できますか?私は方法を見つけることができませんでした。また、ソースとの同期をとっているときに削除されているキーもありますか? –

+0

ページエラー - %sを追加 – Blaise

2

ため

おかげで、あなたは

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

どのように私は、問題はない問題は、あなたがpoeditでそれらを追加する方法です。 –

0

同じ問題が発生しました。 iはpoeditと同期する場合

例えば、私はPHPで

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

を有し、それはコードで私は(生成)している識別子ではない 'FORM_HEADER_' をピックアップします。

だから私はこの問題に私は、私はPHP

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

UPDATEで以下を実行していることを解決し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ファイルとMOファイルを作成するためにそれを保存(ソースと同期またはすべてが失われません)。

UPDATE 2.

私は今、テキストエディタ(geditの/メモ帳)を使用して、私のマニュアル識別子の別々のファイルを使用します。今、私は2つのファイルがいる:poeditによって生成されたオートは私にはapplication.iniに変換するように構成

_manual.po <言語>と呼ばれる手動edittedファイル>の.po

  • <言語を

    1. と呼ばれます言語ディレクトリのすべてのファイルをスキャンする

      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ファイルから新しいカタログを作成し、手動で追加した文字列の翻訳を開始します。