6

私の友人は現在、J2EEとStrutsを使用してWebアプリケーションを構築しており、いくつかの言語でページを表示できるように準備する予定です。

多言語サイトをサポートする最善の方法は、ページのすべての文字列を格納するプロパティファイルを使用することであると言われました。

welcome.english = "Welcome!"
welcome.spanish = "¡Bienvenido!"
...

この解決策は問題ありませんが、サイトにニュースなど(ブログ)が表示された場合はどうなりますか?つまり、静的ではなく、頻繁に更新されるコンテンツ...サイトを維持する人々は、サポートされている各言語ですべての新しいエントリを作成し、エントリの各バージョンをデータベースに保存する必要があります。アプリケーションは、ユーザーが選択した言語のエントリのみをロードします。

この種の実装をサポートするデータベースをどのように設計しますか?

ありがとう。

4

5 に答える 5

13

警告: 私は Java ハッカーではないので、YMMV ですが...

「プロパティ」のリストを使用する際の問題は、多くの規律が必要なことです。ユーザーに出力する必要がある文字列を追加するたびに、プロパティ ファイルを開く必要があります。その文字列 (またはそれにほぼ相当するもの) が既にファイルにあるかどうかを確認してから、新しいプロパティを追加します。そうでない場合。これに加えて、プロパティ ファイルを外部の翻訳チームに渡して処理させる場合は、プロパティ ファイルがかなり人間が読み取り可能/編集可能であることを期待する必要があります。

データベース ベースのアプローチは、すべてのデータベース ベースのコンテンツに役立ちます。理想的には、コンテンツの断片とその翻訳を簡単に結び付けられるようにしたいと考えています。データベース外のもの (エラーメッセージなど)出力したいすべての場所で、実際に落ちるだけです。

私たちが見つけたかなり古い技術の 1 つは、gettext を使用することです。Gettext またはいくつかのバリアントは、ほとんどの言語とプラットフォームで利用できるようです。基本的な前提は、次のような特別な関数呼び出しで出力をラップすることです。

echo _("Please do not press this button again");

次に、ソース コードに対して gettext ツールを実行すると、そのようにラップされたすべてのインスタンスが「po」ファイルに抽出されます。これには、次のようなエントリが含まれます。

#: myfolder/my.source:239
msgid "Please do not press this button again"
msgstr ""

また、適切な場所に翻訳を追加できます。

#: myfolder/my.source:239
msgid "Please do not press this button again"
msgstr "s’il vous plaît ne pas appuyer sur le bouton ci-dessous à nouveau"

その後 gettext ツールを実行すると、単純に po ファイルが更新されます。ソースから po ファイルを抽出する必要さえありません。サイトを翻訳する必要があることがわかっている場合は、すべての出力で上記の形式 (下線付きの関数) を使用できます。po ファイルを指定しないと、引用符で囲んだものが返されます。gettext はロケールで動作するように設計されているため、ユーザーのロケールを使用して適切な po ファイルを取得します。これにより、新しい翻訳を簡単に追加できます。

Gettext の長所

  • コーディング中に邪魔になりません
  • 翻訳の追加が非常に簡単
  • POファイルは、スピードのためにコンパイルすることができます
  • ほとんどの言語/プラットフォームで利用可能なライブラリがあります
  • 翻訳を処理するための優れたクロスプラットフォーム ツールがあります。翻訳チームがpoEditなどのツールを使用して翻訳プロジェクトを管理しやすくすることは実際に可能です。

Gettext 短所

  • サイトの「家具」のニーズを解決しますが、通常は、データベース主導のコンテンツにはデータベース ベースのアプローチが必要です。

gettext の詳細については、このウィキペディアのページを参照してください

于 2008-09-03T09:50:03.723 に答える
6

以前にデータベースを設計した方法は、NewsID (int)、NewsPubDate (datetime)、NewsAuthor (varchar/int) などの基本情報を含むニュース テーブルを作成し、次にこれらの列を持つリンク テーブル NewsText を作成することです: NewsID(int) )、NewsText(テキスト)、NewsLanguageID(int)。最後に、LanguageID(int) と LanguageName(varchar) を持つ Language-table があります。

次に、ユーザーにニュースページを表示したい場合は、次のようにします。

SELECT NewsText FROM News INNER JOIN NewsText ON News.NewsID = NewsText.NewsID
WHERE NewsText.NewsLanguageID = <<Session["UserLanguageID"]>>

そのセッションビットは、ユーザーが初めてログインまたはサイトに入ったときにユーザーの言語を保存するローカル変数です。

于 2008-09-02T14:01:01.867 に答える
2

Java Web アプリケーションは、Java 標準タグ ライブラリを使用して国際化をサポートします。

あなたは本当に2つの問題を抱えています。静的コンテンツと動的コンテンツ。

静的コンテンツの場合はjstlを使用できます。これを実現するために、Java ResourceBundleを使用します。このサイトの助けを借りて、 Databased に裏打ちされたバンドルを動作させることができました。

2 つ目の問題は動的コンテンツです。この問題を解決するには、ユーザーのロケールに基づいてさまざまな翻訳を取得できるように、データを保存する必要があります。(ロケールには国と言語が含まれます)。

些細なことではありませんが、前もって少し計画を立てればできることです。

于 2008-09-08T20:58:42.793 に答える
1

JSP を使用している場合はタグ ライブラリで問題ありませんが、FreeMarkerなどのテンプレート ベースのテクノロジを使用して I18N を実現することもできます。

于 2008-09-16T02:23:58.660 に答える
1

@アーロン

それが私たちがそれを適用するものです。私たちのアプリはすべて PHP ですが、gettext には長い伝統があります。

良いJava実装があるようです

于 2008-09-03T22:02:47.083 に答える