Gettext:メッセージIDを英語のテキストにすることをお勧めしますか?

StackOverflow https://stackoverflow.com/questions/216478

質問

PHP Webサイトをさまざまな言語に翻訳する準備が整いました。PHPでのgettextサポートは今後の方法のように見えます。

表示されるすべてのチュートリアルでは、メッセージIDとして英語のテキストを使用することをお勧めします。つまり、

gettext("こんにちは!")

しかし、それは本当に良いアイデアですか?マーケティング担当者がテキストを「こんにちは、こんにちは」と変更したいとしましょう。次に、その文字列(実際にはメッセージID)が変更されたため、すべての言語ファイルを更新する必要はありませんか?

" hello.message"などの汎用IDと英語の翻訳ファイルを用意する方が良いですか?

役に立ちましたか?

解決

" welcome_back_1 "などの意味のあるIDを使用しています" ようこそ、%1 "など。「ベース」として常に英語を使用しています。言語なので、特定の言語にメッセージIDがない最悪のシナリオでは、英語にフォールバックします。

英語が変わるとIDも変わるので、実際の英語のフレーズをメッセージIDとして使用するのは好きではありません。自動化されたツールを使用する場合、これはあまり影響を与えないかもしれませんが、気になります。単純なコード(msg3975など)を使用するのは好きではありません。何の意味もないので、コメントを散らかさない限り、コードを読むのは難しいです。

他のヒント

すごい、誰も英語をキーとして使うことを主張していないことに驚いています。私はいくつかのソフトウェアプロジェクトでこのスタイルを使用しましたが、私見ではかなりうまくいきました。コードの読みやすさは優れており、英語の文字列を変更すると、メッセージを再翻訳のために考慮する必要があることが明らかになります(これは良いことです)。

スペルを修正する場合や、翻訳をまったく必要としない他の変更を行う場合は、リソースファイル内のその文字列のIDを更新するだけです。

とはいえ、私は現在、この方法でI18Nを新しいプロジェクトに進めるかどうかを評価しているので、なぜそれが良いアイデアではないのかについていくつかの考えを聞くのは良いことです。

私はリチャード・ハリソンが「唯一の方法」だと言っている答えに強く反対します。親愛なる質問者、「唯一の方法」は「唯一の方法」であるため、それが唯一の方法であるという答えを信頼しないでください。存在しません。

ここに、リチャーズのアプローチよりもIMHOにいくつかの利点がある別の方法があります:

  • オリジナルとして英語の文字列のプロトタイプバージョンを使用することから始めます。
  • これらの原始文字列を表示せず、英語の翻訳ファイルを作成します
  • プロトストリングを最初の翻訳にコピーします

利点:

  • 読み取り可能なコード
  • コード内のテキストは、ビューに表示されるものと同一でない場合、非常に近いです
  • 英語のテキストを変更する場合は、原始文字列ではなく翻訳を変更します
  • 同じものを2回翻訳したい場合は、わずかに異なるプロトタイプ文字列を記述するか、「これとそのバージョン」を追加するだけで、完全に読み取り可能なコードがまだあります

IDが英語である理由は、何らかの理由で翻訳が失敗した場合にIDが返されるようにするためです-現在の言語とトークンの翻訳が利用できない、またはその他のエラー。 もちろん、開発者がドキュメントの担当者ではなく、元の英語のテキストを書いていることを前提としています。

英語のテキストが変更された場合、おそらく他の翻訳も更新する必要がありますか?

実際には、英語のテキストではなく純粋なIDも使用しますが、英語にデフォルト設定するには多くの追加作業が必要になることを意味します。

一言でこれをしないでください。

英語の同じ語句は、多くの場合、複数の意味を持ち、それぞれが異なる翻訳を意味します。

文字列のニーモニックIDを定義し、英語を別の言語として扱います。

コード内のID番号はコードの可読性にとって悪夢であると他のポスターに同意します。

元ローカリゼーションエンジニア

考慮すべきことがたくさんあり、答えはそれほど簡単ではありません。

平易な英語の使用

長所

  • コードの記述と読み取りが簡単
  • ほとんどの場合、コードで翻訳関数を実行しなくても機能します

短所

  • 関与するプログラマーも優れたコピーライターでなければなりません:)
  • 最初に実行する必要のある言語が他の言語である場合でも、正確で正確なテキストを完全に英語で書く必要があります(つまり、チェコ語でプロジェクトを開始し、後でENにローカライズしています) 。
  • 多くの場合、コンテキストを使用する必要があります。 begginigから失敗した場合、後で追加するのは大変です。説明するには:英語では、1つの単語にさまざまな意味を持たせることができます-そして、コンテキストを使用してそれらを区別する必要があります-そして、それは必ずしもそれほど簡単ではありません(順序=並べ替え順序、または購入順序である可能性があります)。
  • 後のプロセスで英語を修正するのは非常に困難です。ソース文字列を修正すると、多くの場合、すでに翻訳されたフレーズが失われます。英語を訂正したからといって、3つの異なる言語への翻訳を緩めるのは非常にイライラします。

キーの使用

長所

  • 英語でもローカライズプラットフォーム機能を使用できます。つまり素敵なCrowdinプラットフォームを使用しています。翻訳管理には、多くの便利なツール(または完全なワークフロー)があります。異なる翻訳、翻訳履歴、用語集(翻訳/言語の一貫性を保つのに役立ちます)、校正、承認などの投票。よりスムーズに。

  • 校正などのために英語のテキストを送信する方がはるかに簡単です。通常、コピーライターにコードを直接変更させるのは良い考えではありません:)

短所

  • より複雑なプロジェクトのセットアップ。
  • %d、%sなどを使用するのが難しい

すでに自分の質問に答えていませんか? :)

明らかに、アプリケーションの国際化をサポートする場合は、すべての言語実装を同じように扱う必要があります。文字列を変更する必要があると誰かが判断した場合、すべての言語ファイルで同様の変更を行います。チェックイン付きのメタデータは、すべての言語ファイルを同じ変更でグループ化する必要があります。 「デフォルト」の場合言語の扱いが異なるため、保守が難しくなります。

1日の終わりには、翻訳者は座って、すべての言語のテキストを変更できるようにする必要があります(つまり、意味が一致するように)、すでに自分の仕事をしたプログラマーを関与させる必要はありません。

これにより、適切な答えは、 gettext の修正バージョンを使用して、このような文字列を配置することであるように感じます

_(id, backup_text, context)

_('ABOUT_ME', 'About Me', 'HOMEPAGE')

コンテキストはオプションです

なぜこんな感じ? 他の場所で繰り返される可能性のある英語のテキストではなく、一意のIDを使用してシステム内のテキストを識別する必要があるためです。

また、矛盾を減らすために、コード内の同じ場所にバックアップ、ID、およびコンテキストを保持する必要があります。

IDも読み取り可能である必要があります。これにより、同義語と重複使用の問題が発生します(IDとしても)。このようにIDにプレフィックスを付けることができます" HOMEPAGE_ABOUT_ME"または" MAIL_LETTER&quot ;、ただし

  1. 最初にこれを行うのを忘れてしまい、後で変更するのは問題です
  2. システムがIDとコンテキストの両方でグループ化できるようにより柔軟になりました

これがコンテキスト変数も最後に追加した理由です

バックアップテキストはほとんど何でもかまいません。「[ABOUT_ME @ HOMEPAGEテキストの読み込みに失敗しました。example@ example.com]に連絡してください」

" poedit"のような現在のgettext編集プログラムでは動作しませんが、" t()"のような翻訳用のカスタム変数名を定義できると思います。先頭にアンダースコアなし。

gettextもコンテキストをサポートしていることは知っていますが、ドキュメント化や普及はあまりされていません。

PS優れた拡張可能なコードを適用するための最適な変数の順序がわからないため、提案を歓迎します。

私は、あなたが(ほとんどのneverの値に対して)何かのキーとしてフリーテキストを使いたくないと言っているところまで行きます。たとえば、SOがクエリタイトルをこのページのキーとして使用したとします。誰かがそれにリンクし、タイトルが編集されると、リンクは無効になります。

すべてのリンクを更新する責任もあることを除いて、あなたの問題は似ています...

Douglas Leederが言っているように、おそらくあなたがやりたいのは英語をデフォルト(バックアップ)言語として使用することですが、英語と他の言語を混ぜて使用するインターフェースは非常に紛らわしいです(しかし、やや面白い)。

上記の考慮事項に加えて、「キー」が必要な場合が多くあります。 (msgid)ソーステキスト(英語)とは異なります。たとえば、HTMLビューでは、[アンカー]タグの宛先とラベルがユーザーのロケールに依存する[yyyy]と言いたい場合があります。例えば。ソーシャルネットワークへのリンクである可能性があり、米国ではFacebookになりますが、中国ではWeiboになります。そのため、MsgIdはsocialSiteUrlやsocialSiteLabelのようなものになります。

ミックスを使用しています。

競合/変更/奇妙な意味を持つとは思わない基本的な文字列については、キーを英語と同じにします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top