ホームページ >バックエンド開発 >PHPチュートリアル >共有ホスティングのGetText翻訳の管理
コアポイント
多くの企業は、最終的にターゲット市場をグローバルに変えます。この目標は、会社のウェブサイトを1つ以上の言語に翻訳する必要性をもたらします。大企業で働いていなくても、地元の市場と英語のグローバル市場をターゲットにするために、母国語で新しいサービスを立ち上げる必要があるかもしれません(あなたがネイティブ英語話者ではないと仮定します)。開発者として、テキストを翻訳することは私たちの責任ではなく、翻訳をサポートするためにウェブサイトを準備することです。 PHPでは、最も人気のある方法はgetTextを使用することです。これは、アプリケーションからの翻訳の分離を可能にするため、プロセスの並列化を可能にするため、素晴らしいアプローチです。問題は、Apacheが翻訳をキャッシュすることです。したがって、エンジンを再起動できない限り、翻訳ファイルの更新は表示されません。この事実は、共有ホスティングに取り組んでおり、管理者の特権を持っていない場合、特に迷惑です。この記事では、この問題を詳細に説明し、この問題を回避するために見つけた解決策を説明します。
メモ:
環境環境
PHPで翻訳を使用する方法はたくさんあります。私が思い出すことができる最も簡単な方法は、翻訳されたすべての文字列を含む連想配列を持っていて、キーを使用して正しい文字列を取得することです。ご想像のとおり、このソリューションはスケーラブルではなく、非常に小さなプロジェクト(5行以下のコード)に取り組んでいる場合を除き、このソリューションの使用を避ける必要があります。深刻な翻訳には、getTextを使用できます。このアプローチにより、各ターゲット言語の異なるファイルを作成することができます。これにより、ビジネスロジック、プレゼンテーションレイヤー、翻訳の分離を維持するのに役立ちます(プレゼンテーションレイヤーへのアドオンと考えることができます)。 GetTextを使用すると、Webサイトの特定の機能を処理すると、翻訳者がPoEDITなどのソフトウェアを使用して翻訳できるため、プロセスを並列化できます。
翻訳は、固定構造のパスに保存する必要があります。まず、好みに応じて名前が付けられたルートフォルダー(「言語」など)があります。その中には、ターゲット言語ごとにフォルダーを作成する必要があります。その名前は、ISO 3166標準に準拠する必要があります。したがって、イタリア語の翻訳の有効な名前は、「IT_IT」(イタリアのイタリア語)、「IT_CH」(イタリアのスイス)、「EN_US」(アメリカ英語)などです。言語コードを備えたフォルダーには、翻訳ファイルを保存する「LC_MESSAGES」というフォルダーが必要です。
PoEDITは、Webサイトのソースコードを分析し、ソフトウェアで設定した1つ以上のパターンに基づいて翻訳する文字列を抽出します。ソフトウェア(または同等の)がバイナリ.MOファイルにコンパイルする拡張子(ポータブルオブジェクト)を使用して、単一のファイルに文字列を保存します。後者は、PHPのgetText()関数で関心のある形式です。 .moファイルは、以前に作成した「lc_messages」ディレクトリに配置する必要があるファイルです。
getText()を使用したサンプルコードは次のとおりです(コードがコメントされているため、その機能をすばやく理解できます):
<code class="language-php"><?php // 包含翻译文件的根文件夹的名称 $translationsPath = 'languages'; // 要翻译到的语言 $language = 'it_IT'; // 翻译文件的名称(在gettext中称为域) $domain = 'audero'; // 指示此会话将使用哪种语言 putenv("LANG=" . $language); setlocale(LC_ALL, $language); // 设置当前域的路径 bindtextdomain($domain, $translationsPath); // 指定字符编码 bind_textdomain_codeset($domain, 'UTF-8'); // 选择域 textdomain($domain); // 调用gettext()函数(它有一个名为_()的别名) echo gettext("HELLO_WORLD"); // 等效于echo _("HELLO_WORLD"); ?></code>
ページに前のコードを保存してブラウザにロードした後、getText()が翻訳ファイルを見つけた場合、画面に作成した翻訳が表示されます。
これまでのところ、すべてがうまくいきました。悪いニュースは、翻訳がロードされると、Apacheはそれをキャッシュするということです。したがって、エンジンを再起動できない限り、翻訳ファイルの更新は表示されません。共有ホスティングに取り組んでおり、管理者の特権がない場合、これは特に迷惑です。この問題を解決する方法は? Auderoの共有GetTextが救助に来ます!
audero共有gettext
Audero Shared getTextは、PHPライブラリ(実際にはクラスにすぎませんが、夢を見ましょう)です。これにより、ApacheがキャッシュされているgetText()関数を介してロードされた翻訳の問題をバイパスできます。このライブラリは、シンプルで効果的なアプローチを採用するため、常に最新の翻訳を使用します。 Audero Shared GetTextには、名前空間を使用し、前のセクションで説明されている構造があるため、PHP 5.3以上が必要です。 2つの主な方法があります:updatetranslation()とdeleteoldTranslation()。前者は図書館の中核であり、この手法を実装する方法でもあります。しかし、このテクニックは何ですか?詳細については、そのコードを見てみましょう。それを完全に理解するために、クラスのコンストラクターが、翻訳される言語、および翻訳されたファイルの名前(ドメイン)を保存するためのパスを受け入れることを強調する価値があります。
<code class="language-php"><?php // 包含翻译文件的根文件夹的名称 $translationsPath = 'languages'; // 要翻译到的语言 $language = 'it_IT'; // 翻译文件的名称(在gettext中称为域) $domain = 'audero'; // 指示此会话将使用哪种语言 putenv("LANG=" . $language); setlocale(LC_ALL, $language); // 设置当前域的路径 bindtextdomain($domain, $translationsPath); // 指定字符编码 bind_textdomain_codeset($domain, 'UTF-8'); // 选择域 textdomain($domain); // 调用gettext()函数(它有一个名为_()的别名) echo gettext("HELLO_WORLD"); // 等效于echo _("HELLO_WORLD"); ?></code>
この方法が最初に行う必要があるのは、元のバイナリ変換ファイル(.moファイル)が存在するかどうかをテストすることです。存在しない場合、メソッドは例外をスローします。次に、コンストラクターに提供されたパラメーターとファイルの最後の変更されたタイムスタンプに基づいて、翻訳されたファイルへのフルパスを計算します。その後、以前に計算されたタイムスタンプと元のドメインを連結する新しい文字列を作成します。完了したら、翻訳ファイルのミラー化されたコピーを作成するトリックです。そのような名前を持つファイルがすでに存在する場合、クラスはこのコピーを避けるのに十分賢いです。最後に、bindTextDomain()、bind_textdomain_codeset()、およびtextdomain()で使用される新しい名前を返します。そうすることで、Apacheは翻訳が元の翻訳とは何の関係もないようであるため、キャッシュの問題を避けることがわかります。私が言ったように、シンプルで効果的です!
「great aurelio!」、あなたは考えていましたが、「私のフォルダーはこれらのコピーで膨らんでいます。」これが、deleoldTranslations()を作成した理由です。最後の翻訳フォルダーを除くすべてのミラーコピーを削除します。
Auderoが共有するGetTextとそれがあなたのために何ができるかを学んだので、それを取得する方法を見てみましょう。
Audero共有GetTextのインストール作曲家を通じて「Audero Shared getText」を取得でき、次の行をComposer.jsonに追加できます。
その後、インストールコマンドを実行して依存関係を解析してダウンロードします。
<code class="language-php">/** * 创建翻译文件的镜像副本 * * @return string 创建的翻译文件的名称(在gettext中称为域) * * @throws \Exception 如果找不到翻译文件 */ public function updateTranslation() { if (!self::translationExists()) { throw new \Exception('在给定路径中找不到翻译文件。'); } $originalTranslationPath = $this->getTranslationPath(); $lastAccess = filemtime($originalTranslationPath); $newTranslationPath = str_replace(self::FILE_EXTENSION, $lastAccess . self::FILE_EXTENSION, $originalTranslationPath); if(!file_exists($newTranslationPath)) { copy($originalTranslationPath, $newTranslationPath); } return $this->domain . $lastAccess; }</code>Composerは、プロジェクトのベンダー/Auderoディレクトリにライブラリをインストールします。
Composerを使用したくない場合(本当にすべきです)、次のコマンドを実行して、Gitを使用してAudero共有GetTextを取得できます。
<code class="language-json">"require": { "audero/audero-shared-gettext": "1.0.*" }</code>
最後に持っているオプションは、リポジトリにアクセスしてアーカイブとしてダウンロードすることです。
Audero Shared getTextの使用方法<code class="language-bash">php composer.phar install</code>
Composerを使用してAuderoの共有GetTextを取得しているとします。これは、クラスを動的にロードするためにオートローダーに頼ることができます。次に、ShareDgetTexインスタンスを作成し、必要なメソッドを呼び出す必要があります。次の例に示すように、上記の方法のいずれかを使用できます。
結論この記事では、Audero Shared getTextを紹介します。これは、ApacheによってキャッシュされているgetText()関数を介してロードされた翻訳の問題をバイパスできる簡単なライブラリ(まあ...クラス)を紹介します。 Audero Shared GetTextには、名前空間を使用するため、少なくともPHP 5.3(しばらくリリースされています)が必要なため、広範な互換性があります。リポジトリに含まれるデモとファイルを自由に使用してください。問題が見つかった場合は、プルリクエストと質問を送信してください。 CC BY-NC 4.0ライセンスの下でAudero Shared GetTextをリリースしたため、自由に使用できます。
この問題に遭遇しましたか?どのように解決しましたか?恥ずかしがり屋にならないで、コメントにソリューションを投稿してください!
(以下はFAQの部分であり、元のテキストに基づいて擬似オリジナルであり、元のテキストは留意されています) 共有ホスティングでのGetText翻訳の管理
FAQ(FAQ)
共有ホスティングにgetTextをインストールする方法は?なぜ私のgetText翻訳が機能しないのですか?
getText翻訳をデバッグする方法は?
WordPressでgetTextを使用できますか?
getText翻訳を更新する方法は?
なぜ「パッケージphp-getTextが見つからない」エラーを取得するのですか?
getText関数を使用して、PHPでgetTextを使用できます。この関数は、文字列を引数として取得し、翻訳された文字列を返します。この関数を使用する前に、setlocale関数を使用してロケール関数を設定し、bindTextDomain関数を使用して.moファイルへのパスを指定する必要があります。
はい、ubuntuでgetTextを使用できます。 sudo apt-get install getTextコマンドを使用してインストールできます。インストール後、ターミナルのgetTextコマンドを使用して、.poおよび.moファイルを処理できます。
PoEDITなどのツールを使用して.poおよび.moファイルを作成できます。このツールを使用すると、.poファイルを作成および編集し、.moファイルに自動的にコンパイルできます。テキストエディターを使用して手動で.poファイルを作成することもできますが、PoEDITやMSGFMTなどのツールが.MOファイルにコンパイルする必要があります。
.poファイルは、元の文字列とその変換を含むプレーンテキストファイルです。任意のテキストエディターを使用して開いて編集できます。一方、.moファイルは、.poファイルから生成されたバイナリファイルです。それらは、実行時に翻訳を取得するためにgetTextによって使用されます。
以上が共有ホスティングのGetText翻訳の管理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。