7

MVC パターンを開始位置として使用して、多言語 Web アプリケーションを構築しています。アプリケーションには、ユーザーが操作する多数のフォームがあり、これらのフォームの多くには、データベース テーブル (たとえば、「Province」) からルックアップを行うフィールドがあります。

これらのリストのオプションをユーザーの言語で画面に表示する必要がある場合は、いくつかの方法があります。

  1. モデルで。 モデルにクエリを実行するとき、結果を返す言語を指定できます。これにより、モデルのデータが変更されることなく表示されるあらゆる場所で翻訳を使用できるようになります。ただし、これは、私の例の Province モデル (および他のすべてのアプリケーション モデル) が言語翻訳を行う方法を知る必要があることも意味します。
  2. コントローラーで。 通常どおりコントローラ アクションでモデルをクエリし、アクションを完了する前に結果を渡すことができる「Translator」オブジェクトを作成できます。これは、各コントローラー アクションが同じ変換コードを複製し、DRY 原則に違反する可能性があることを意味します。
  3. ビューで。アプリケーションのプレゼンテーションは一般にビューに存在すると予想され、ユーザーの言語はシステムのビジネス ロジックに影響を与えないため、言語の翻訳がここに属しているという議論がなされる可能性があります。特に、ページには翻訳が必要な静的コンテンツも含まれる可能性があることを考慮してください。これの欠点は、特に新しい変換コードに対処する必要があるフロントエンド デザイナーにとって、ビューが多少複雑になることです。

テキスト翻訳が Web アプリケーションの MCV パターンに属する場所について、受け入れられているベスト プラクティスはありますか? ページの読み込み時ではなく、AJAX 呼び出しを介して選択リスト オプションを読み込む場合、これはまったく変わりますか?

助けてくれてありがとう!

4

5 に答える 5

5

それを処理するのに最適な場所はビューです。質問はデータベースからの動的データのみを参照しますが、ビュー内の静的情報も処理する必要があります。両方を同じ場所で処理するのが最適です。複数の言語を処理するためのMVCの一般的な方法は、リソース文字列、言語ごとの個別のビュー、または両方の組み合わせです。データベースからの情報については、リソース文字列が適切に機能します。リスト内のオプションのトークンをデータベースに保存すると(そのトークンは英語の翻訳である可能性があります)、ビューは指定された国/ロケールのリソースから適切な翻訳を取得します。このブログ投稿には、このアプローチに関する詳細な説明があります。

于 2012-04-10T19:02:07.447 に答える
1

UI の一部を翻訳する必要がある場合は、リソース ファイルを読み取り、そのリソースの翻訳済み文字列を出力するヘルパー メソッドを作成します。例えば

@Translate("NewUserHeading")

したがって、UI に関しては、UI でこれを処理することは理にかなっています。

ある時点で変換しようとしているデータが Flash クライアントまたはモバイル アプリで表示される可能性がある場合、そのデータはサーバーによって変換されるべきであり、MVC アプリケーションとは無関係であるべきです。

于 2012-04-11T09:35:33.320 に答える
0

ビューには、リソース ファイルの文字列が表示されるだけです。ロケールの正しいリソース ファイルを含めると、それが可能になります。Web アプリケーションでは、多くの場合、strings.en-us.js、strings.pt-br.js など、ロケールごとに UI 文字列を定義する単一言語の JS ファイルです。

一部の文字列はサーバーから動的に取得されます。コントローラーはそれを知る必要はありません。モデルはローカライズされた文字列を取得するだけで、データ要求の一部として返されます。

つまり、ビュー (静的な場合) またはモデル (動的な場合) のいずれかにあります。コントローラーは、データをビューからモデルに、モデルからビューに変換するだけです

于 2012-06-14T19:28:33.387 に答える
0

正直なところ、データベースとのやり取りはすべてモデルで処理する必要があり、それがモデルで処理される唯一のものです。コントローラーで処理する必要があるデータの解釈/整理。この翻訳がどこから来たのか、そしてそれがどのように機能して本当に確かな答えを与えるのかについて、より多くの情報が必要になると思います.

于 2012-04-10T15:53:42.097 に答える