14

コントローラ/プロジェクトでYii翻訳メッセージを収集および生成するために利用できるスクリプトまたはその他の方法があるかどうかを知りたいです

例えば。コントローラに次のコードがある場合

Yii::t('blog', 'Your name');
Yii::t('category', 'Category name');

メッセージディレクトリに上記の文字列を含むblog.phpおよびcategory.phpとして英語の翻訳メッセージファイルを生成する必要があります。誰かが方法を知っているなら私に知らせてください。ありがとう

4

3 に答える 3

21

車輪の再発明をする必要はありません。そのために使用できますyiic(フレームワークフォルダーに移動して入力すると、yiic help messageその使用法について必要なすべての情報が得られます)。便宜上、ここに貼り付けます。

使用法yiicメッセージパス/to/ config / file

説明このコマンドは、指定されたソースファイルで変換されるメッセージを検索し、メッセージソースとしてPHP配列にコンパイルします。

パラメーター*config-file:必須、構成ファイルのパス。例はframework/messages/config.phpにあります。

ファイルはどこにでも配置でき、名前と値のペアの配列を返す有効なPHPスクリプトである必要があります。名前と値の各ペアは、構成オプションを表します。

次のオプションを使用できます。

  • sourcePath:文字列、すべてのソースファイルのルートディレクトリ。
  • messagePath:文字列、メッセージの翻訳を含むルートディレクトリ。
  • 言語:配列、抽出されたメッセージを翻訳する必要のある言語コードのリスト。たとえば、array('zh_cn'、'en_au')。
  • fileTypes:配列、ファイル拡張子のリスト('php'、'xml'など)。このリストに拡張子名が含まれているファイルのみが処理されます。空の場合、すべてのファイルが処理されます。
  • 除外:配列、ディレクトリとファイルの除外のリスト。各除外は、名前またはパスのいずれかになります。ファイルまたはディレクトリの名前またはパスが除外と一致する場合、それはコピーされません。たとえば、「。svn」を除外すると、「。svn」という名前のすべてのファイルとディレクトリが除外されます。また、「/ a / b」を除外すると、ファイルまたはディレクトリ「sourcePath / a/b」が除外されます。
  • 翻訳者:メッセージを翻訳するための関数の名前。デフォルトは「Yii::t」です。これは、翻訳するメッセージを見つけるためのマークとして使用されます。
  • 上書き:メッセージファイルをマージされたメッセージで上書きする必要がある場合。
  • removeOld:メッセージの翻訳が不要になった場合、メッセージは「@@」マークのペアで囲まれるのではなく、削除されます。

サンプルの設定ファイルを変更(および移動)する必要があります。これですべての設定が完了しました。必ずフルパスを使用してください(つまりC:\path\to\project、Windowsまたは/var/www/your/project* nix)

于 2012-06-28T10:23:07.160 に答える
3

開始方法を入力して、独自のスクリプトを作成することができます。私は今のところこれが私にとって良いと思いました:)

コンポーネントcomponents/Translation.phpを作成します

public function missing($messageEvent) {        
    Yii::log(
        "'".$messageEvent->message."' => '',",
        'translation',
        $messageEvent->category.'.'.$messageEvent->language
    );
}

}

構成ファイルconfig/main.phpを編集します

'components' => array(
      //...
      'log' => array(
            array(
                'class'=>'CFileLogRoute',
                'levels'=>'translation',
                'logFile'=>'translations.log',
            ),
            //...                
      ),

       'messages' => array(
            //'class' => 'CDbMessageSource',
            'onMissingTranslation' => array('Translation', 'missing'),
            //'sourceMessageTable' => 'source_message',
            //'translatedMessageTable' => 'message'
       ),
)

結果

最終的translation.phpにログファイルディレクトリにファイルが作成され、ファイルの内容は次のようになります。

 2012/06/28 09:45:00 [translation] [Site.lv] 'MyStringInSource' => '',
 ....

構成によって異なります。そのため、パーツをコピー'MyStringInSource' => '',して、対応する翻訳ファイルに入れることができます。

これらを翻訳するまで、翻訳が欠落しているtranslation.logファイルが(繰り返し)大きくなるため、これは開発プロセスで役立ちます。

それがあなたにアイデアを与えることを願っています。

于 2012-06-28T07:07:26.860 に答える
1

grepそれは仕事と正規表現のように聞こえます。これを検索:

Yii::t\s*\(\s*('(?:[^']|(?<=\\)')*'|"(?:[^"]|(?<=\\)")*")\s*,\s*('(?:[^']|(?<=\\)')*'|"(?:[^"]|(?<=\\)")*")\s*\)

上記は残念ながら読めないので、少し分解します。

Yii::t\s*\(\s*##PATTERN##\s*,\s*##PATTERN##\s*\)

これは明らかにYii::t、空白を考慮に入れるように注意するという呼びかけと一致します。秘伝のタレは##PATTERN##、2回繰り返されます。##PATTERN##

('(?:[^']|(?<=\\)')*'|"(?:[^"]|(?<=\\)")*")

上記は、(一重引用符で囲まれた'([^']|(?<=\\)')*'文字列)または"([^"]|(?<=\\)")*"(二重引用符で囲まれた文字列)のいずれかに一致します。非キャプチャグループ(?:)は、関心のない中間結果を無視するために使用されています。

この正規表現と照合した後、キャプチャグループ#1は翻訳ファイル名(eg 'blog')を保持し、グループ#2は文字列名(eg 'Your name')を保持します。

于 2012-06-28T08:04:51.677 に答える