37

Web アプリの多言語サポートを開発しています。gettextライブラリでDjango のヘルパーを使用しています。重要な HTML マークアップを含む文をどのように処理するかという問題を除いて、すべてが驚くほど簡単でした。簡単な例を次に示します。

Please <a href="/login/">log in</a> to continue.

私が考えることができるアプローチは次のとおりです。

  1. 文全体が含まれるようにリンクを変更します。この場合、変更が良いアイデアであるかどうかに関係なく、このソリューションの問題は、理想的には 2 つが独立している場合に、UI が i18n のニーズに依存するようになることです。

  2. 上記の文字列全体を翻訳用にマークします (書式設定を含む)。翻訳文字列には、HTML も直接含まれます。これに関する問題は、HTML フォーマットを変更するには、すべての翻訳を変更する必要があることです。

  3. 複数の翻訳を密結合し、文字列補間を使用してそれらを結合します。たとえば、"Please %s to continue" と "log in" というフレーズは、翻訳用に別々にマークしてから組み合わせることができます。「ログイン」はローカライズされ、HREF でラップされ、翻訳されたフレーズに挿入されます。これにより、リンク先を示すために %s が翻訳されたままになります。このアプローチはコードを複雑にし、翻訳文字列の独立性を壊します。

他のオプションはありますか?他の人はこの問題をどのように解決しましたか?

4

6 に答える 6

19

解決策2はあなたが望むものです。HTML マークアップを埋め込んだ文全体を送信します。

理由:

  1. 主要な翻訳ツールである Trados は、翻訳者による不注意による破損からマークアップを保護できます。
  2. Trados は、タグの内容が変更された場合でも、以前に表示されたテキストを自動翻訳することもできます (ただし、タグの数と文内での位置は同じです)。少なくとも、翻訳者はかなりの割引をしてくれます。
  3. スタイリングはロケール固有です。場合によっては、太字は中国語や日本語では不適切であり、イタリック体は東アジアの言語ではあまり使用されません。翻訳者は、スタイルを保持するか削除するかを自由に選択できる必要があります。
  4. 語順は言語固有です。上記の文を断片に分割する場合、英語とフランス語では機能する可能性がありますが、中国語または日本語では、連結すると語順が正しくありません。このため、文の断片ではなく、文全体を外部化することが最善の i18n プラクティスです。
于 2008-11-21T17:58:57.147 に答える
12

2、ねじれの可能性があります。

次のように、文字列全体をローカライズできます。

loginLink=Please <a href="/login">log in</a> to continue

ただし、ツールとローカリゼーション グループによっては、次のようなことを好む場合があります。

// tokens in this string add html links
loginLink=Please {0}log in{1} to continue

それが私の好みの方法です。特定の文字を無視するローカリゼーション ツールがある場合は、別の置換パターンを使用できます。例えば

loginLink=Please %startlink%log in%endlink% to continue

次に、jsp、サーブレット、または使用している言語に相当するもので置換を実行します...

于 2008-11-07T23:51:27.993 に答える
7

免責事項: 私自身、ソフトウェアの国際化の経験はありません。

  1. いずれにせよ、これは良いことではないと思います - 結合が多すぎるだけです...</li>
  2. 翻訳が必要な部分をまばらに書式設定し続ける限り、これは問題ありません。翻訳者が特別な単語を重要視できるようにする (リンクを作成するか、おそらく<strong />強調を使用することにより) ことは良い考えのように思えますが、(X)HTML を使用したこれらの翻訳は、他の場所では簡単に使用できない可能性があります。
  3. これは私には不必要な作業のように思えます...</li>

私だったら、2 番目のアプローチを使用すると思いますが、URI を書式設定パラメーターに入れ、これらすべての翻訳を変更しなくてもこれを変更できるようにします。

Please <a href="%s">log in</a> to continue.

このアプローチを使用する場合、翻訳者に (X)HTML の基本的な知識を教える必要があるかもしれないことを覚えておく必要があります。これにより、翻訳者はマークアップを台無しにせず、記述したテキストから何を期待できるかを理解できます。 . とにかく、この追加の知識は、より良いセマンティック マークアップにつながる可能性があります。なぜなら、前述のように、テキストを翻訳し、(X)HTML で注釈を付けて、ローカルの文体を反映させることができるからです。

于 2008-11-07T22:54:04.723 に答える
3

何をするにしても、文全体を 1 つの文字列として保持します。正しく翻訳するには、文全体を理解する必要があります。

すべての単語をすべての言語に翻訳する必要はありません。たとえば、ノルウェー語では「please」を使用しません ( 「værså snill」は文字通り「be so kind」と言うことができますが、コマンドとして使用すると強引に聞こえます)。ノルウェー語は次のようになります。

  • "Logg inn for å fortsette" lit.: "Log in to continue" または
  • "Fortsett ved å logge inn" lit.: "Continue to login" など

たとえば、架空のデモ言語では、順序を完全に変更できるようにする必要があります。

  • "Für kontinuer Loggen bitte ins" (もしそれが本当なら) 点灯: "続行するにはログインしてください"

一部の言語では、この文の (ほとんどの) を 1 つの単語で表すことさえできます...

解決策 1 または「続行するには %{startlink}log in%{endlink} してください」という方法をお勧めします。これにより、翻訳者は文全体をより自然なリンクにすることができ、完全に再構成することができます。

于 2008-11-12T13:18:23.900 に答える
1

興味深い質問です。すぐにこの問題が発生します。トリッキーなことは何もせずに、2で行くと思います。HTML マークアップは単純で、URL はすぐには移動しません。また、何か変更があれば django.po に新しいエントリが作成されるため、翻訳を確認する機会が得られます (例: スクリプトは後で空の翻訳をチェックする必要がありますmakemessages) 。 .

したがって、テンプレートでは:

{% load i18n %}
{% trans 'hello <a href="/">world</a>' %}

...そして、python manage.py makemessagesdjango.poに入った後

#: templates/out.html:3
msgid "hello <a href=\"/\">world</a>"
msgstr ""

必要に応じて変更します

#: templates/out.html:3
msgid "hello <a href=\"/\">world</a>"
msgstr "bonjour <a href=\"/\">monde</a>"

...そして、私が遭遇する単純だが頻繁に発生するケースでは、これ以上問題を起こす価値はありません。ここでの他の解決策は非常にスマートに思えますが、マークアップの問題に対する解決策がより多くのマークアップであるとは思いません。さらに、テンプレート内で混乱を招くようなものは避けたいと考えています。

あなたのテンプレートはしばらくするとかなり安定するはずですが、他にどんなトラブルが予想されるかはわかりません。コンテンツが何度も変更される場合、そのコンテンツの場所はテンプレート内ではなく、モデル内にある可能性があります。

編集:ドキュメントでチェックアウトしたところです。翻訳内に変数が必要な場合は、blocktrans.

于 2008-11-09T21:48:47.803 に答える
0
  1. 意味がありません。「ログイン」をどのように翻訳しますか?
  2. 多くの翻訳者が HTML の経験を持っているとは思いません (HTML を認識しない通常の翻訳者は安価です)。
  3. オプション 3 を使用するか、「%slog in%s で続行してください」を使用し、%s をリンクの一部に置き換えます。
于 2008-11-08T21:17:20.957 に答える