PHP、Smarty、Gettextを使用したサイトインターフェイスのローカライズ

すべては、既存のサイトにロシア語のローカライズを追加する必要があるという事実から始まりました。 私は数日間このトピックを研究し、複数のレーキがあった後、最終的に作業サイトを得ました。 そして今、多言語ローカライズのレシピを共有したいと思います。

PHP 5.3.3(Linux)/ PHP 5.3.1(Windows)+ Smarty 3.0.7でテストおよびテスト済み。 この場合、既存のサイト用にロシア語版が英語で作成されました。

「どのように機能するか」というトピックに教育プログラムを費やすことはありません( phpclubで利用可能です)が、実装中に遭遇した可能性のある問題の簡単な説明と説明を提供します。



だから

  1. Smarty Gettextプラグインをダウンロードします(0.9.1ではなく、バージョン1.0b1が必要です!): ダウンロードプラグインの詳細を読む(推奨)
  2. そこからblock.t.phpファイルを取得し、 smarty / pluginsディレクトリに配置します
  3. サイトのルートにロケールフォルダーを作成し(別の場所に配置することもできますが、パスをたどるだけです)、その中にruフォルダーを作成します
  4. ruフォルダーにLC_MESSAGESフォルダーを作成します-ここにはロシア語の言語ファイルが保存されます
  5. 次に、すべての* .tplファイルを調べて、次のようにタグ{t}で翻訳する必要があるすべての行を囲む必要があります。



    {t}Members{/t}

    {t 1=$user}Here is your payment for %1{/t}








    Smarty Gettextプラグインのドキュメントでタグ形式{t}を読むことができます

  6. これで、Smarty Gettextプラグインのtsmarty2c.phpユーティリティを使用して、文字列データベースが作成されます。これは他の言語に翻訳する必要があります。 最初は、コマンドラインからユーティリティを実行し、フォルダー/ファイルの名前を渡すことになっていたが、。/ templatesフォルダーで* .tplファイルを探し、その行を解析し、ファイル./locale/langfrases.cに入れる修正バージョンを提供する-tsmarty2c.phps
  7. 言語ファイルを作成するには、クロスプラットフォームの言語ファイルエディターであるPoeditを使用することを勧めします。

    その中に新しいディレクトリを作成する必要があります(File-Createディレクトリ)。タブの「Paths」にロケールフォルダへのパスを示します。このフォルダには既にlangfrases.cファイルが含まれている必要があります(注意-Poeditはパスの最後に余分なスペースが絶対に嫌いです!)。 ディレクトリは、 messages.poという名前でLC_MESSAGESフォルダーに保存する必要があります 。 その後、エディターは文字列を含むファイルの指定されたパスをスキャンし、それらを翻訳することを提案します:







    結果として、ディレクトリをLC_MESSAGESフォルダーに保存した後、ロシア語への行翻訳を含む2つのファイルmessages.momessages.poを取得する必要があります
  8. 改行付きの言語ファイルができたので、それをサイトに接続する必要があります。 英語とロシア語の2つの言語があるとします。 この場合、 en_USru_RU.utf8の 2つのロケールが使用されます 。 PHPで使用するには、次のコードが必要です( ダウンロード )。



     $ lang = 'ru_RU.utf8';
    
     if(!defined( 'LC_MESSAGES'))define( 'LC_MESSAGES'、5);  // Windowsでは、この定数は定義できません
     setlocale(LC_MESSAGES、$ lang);  //ロケールを設定します
        
     if(!isset($ _COOKIE ['lang']))setcookie( 'lang'、$ lang、1640995200);  // Cookieに言語を保存します
     bind_textdomain_codeset( "messages"、 'UTF8');  // messages.moファイルのエンコーディングを設定します
    
     if($ lang == 'ru_RU.utf8'){
         //ロシア語のローカライズファイルを含める
         bindtextdomain( "messages"、 "./locale");
         textdomain( "メッセージ");
     }
    その他{
         //英語を返します
         bindtextdomain( "メッセージ"、 "");
     }
    
その後、ページに入ると、タグ{t}で囲まれた行の代わりに、言語ファイルの翻訳された行が表示されます。 それらが言語ファイルにない場合、変更されていないテキストが表示されます。



発生する可能性のある問題:

数字とその複数形を持つ名詞の偏向の問題は未解決のままでした。

tsmarty2cユーティリティは複数のフォームを処理し、ngettext呼び出しを使用できますが、Poeditは私からのフォームの受け入れを拒否しました。



このトピックがあなたの時間を節約し、より良い、高品質のサイトの作成を促すことを願っています=)



All Articles