2013-08-25 190 views
17

私は今すぐ新しいアプリケーションを作成しています。多言語MVC 4アプリケーション

多言語対応のアプリケーションを作成する方法を説明しているいくつかのガイドを見てきましたが、使用する魔女1つを理解できません。

一部のチュートリアルは古いもので、古くなっているかどうかわかりません。 http://www.chambaud.com/2013/02/27/localization-in-asp-net-mvc-4/ https://github.com/turquoiseowl/i18n

http://geekswithblogs.net/shaunxu/archive/2012/09/04/localization-in-asp.net-mvc-ndash-upgraded.aspx http://www.hanselman.com/blog/GlobalizationInternationalizationAndLocalizationInASPNETMVC3JavaScriptAndJQueryPart1.aspx

http://www.codeproject.com/Articles/352583/Localization-in-ASP-NET-MVC-with-Griffin-MvcContri

は、私は、彼らがデシベルまたはリソースファイル内のいずれかの言語データを格納する2つの方法が、あることがわかりました。 プロ/コンサは何ですか? 別の方法がありますか?

は、これは私が欲しいものです:

  1. 簡単に維持する(/削除/変更を加える)
  2. 完全な言語サポート。 (ビュー、通貨、時刻/日付、jquery、注釈など)
  3. 言語を変更することができます。
  4. 言語を自動検出します。
  5. 将来的に安全です。

どのような方法がこれを行うのですか? 2013年のベストプラクティスである良いチュートリアルがありますか?

答えて

1

私はdbに基づいて自分自身でアプローチしていますが、大規模なアプリケーションには適していない可能性があります。

多言語にする必要があるタイトルとテキストを保持するためのテーブル/エンティティを作成します。

私はビューをレンダリングしたい時はいつでもそう、最初に私がDBから適切な翻訳を取得し、モデルとしてビューに渡す:

var t = dbCtx.Translations.Find(langID); 
// ... 
return View(t); 

とビューで、私は次のようなコンテンツをレンダリング:

<tr> 
    <td>@Html.DisplayFor(m => m.WelcomeMessage)</td> 
    <td>@Url.Action(Model.EnterSite, "Index", "Home")</td> 
</tr> 

適切な回答を得るには、いくつかの方法があります。セッションを使用することができます:

Session["Lang"] = "en"; 
// ... 
var lang = (string)Session["Lang"] ?? "en"; 

またはクエリ文字列、またはそれらの組み合わせで渡します。あなたは以下の通り決定する必要があり、自動検出言語については、

a)は、ユーザIPから検出し、彼/彼女の地理位置を推測し、ために適切な言語を設定)ブラウザ

Bからの検出彼/彼女

0

私は同じニーズのためにあなたと同じソースを見てきましたが、あなたが言うように、1つの好ましい解決策を見つけることは非常に困難です。

しかし、私はあなたがあなたの質問にリンクされているマイケル・Chambaudにより溶液で行くことにしました。この理由は実装が簡単で、私が望んでいたURLを私に与えました。私はまだ100%確実ではないので...将来的には簡単に置き換えることができます。 additonで

これに私はjQueryの使用するクライアント側の書式設定のためにグローバル化。

あなたが決めたものを解決聞くのは本当に興味深いものになるだろうか?

1

私はちょっとこの質問はまっすぐな答えを持っていないという感じを持っています。フォーマットするには、CultureUICulture、つまり英国英語では「en-GB」、米国英語では「en-US」のようなものを使用してください(違いはあります)。 .Netはすべてそれを中心に構築されているので、実際には考えずにローカルの書式設定を使用することができます。

また、より多くの詳細については、System.Globalization名前空間をチェックアウトする必要があります: http://msdn.microsoft.com/en-us/library/system.globalization%28v=vs.110%29.aspx

文化は、その後、少なくとも私たちの会社に方針が、クエリ文字列から例外なく常に持っている、から来るべきだったためのよう。その理由は、IPのローカリゼーションを使用すると、スペインのユーザーが日本のスペインのサイトを見て、その後日本のバージョンに切り替えると、間違っているとは限りませんが、それは直接のスペイン語のリンクか何かであるというクライアント。つまり、クエリ文字列で文化が定義されていない場合、IPを使用してユーザーが望む言語を推測することは悪い考えではなく、実際にお客様のニーズに依存していると言えます。

翻訳を取得していたためとして、それは本当にリソースとDBの両方が彼らの浮き沈みを持って、依存しています。したがって、DBの主な点は、アプリケーション間の共有が容易で、何らかの理由でフレーズを更新する必要がある場合は、DBエントリを1つずつ更新することができますが、これも障害である可能性があります。いくつかのフレーズは二重の意味を持ち、同じ文章が英語で使用されていますが、他の言語では全く違った形で翻訳できます。 DBのもう一つの大きな問題は、ある程度(実装に依存します)、VSのフレーズのインテリジェンスが緩いことです。当然の

リソースが適切な知性を持っていますが、彼らはあなたが使用しているWebアプリケーションにかなり静的で、あなたも正確に真実ではない...アプリケーション間でリソースを共有することはできませんが、多かれ少なかれ、あなたがすることはできません。静的性質はプラスですが、すべてのリソースがアプリケーションに含まれており、外部効果が影響を与えないことがわかっているためです。

実際には、実際にはプロジェクトに依存しています。あなたは単に自分の長所と短所を持って自分のために決めなければならない。しかし、それがまったく役に立ったら、私は自分の会社に物事がどのようにあるのかを伝えることができます。さまざまなWebアプリケーションで同じフレーズを共有するいくつかのアプリケーションを作成します。以前はDBに入れていましたが、翻訳は並行して行われていました。クライアントがあるアプリでスペイン語の方が良い翻訳を依頼されましたが、それは他の翻訳者にはそれほど意味がありませんでした。それはあなたが考えるかもしれない以上に起こった。その後、リソースに移行しましたが、1つのアプリの翻訳が更新されたときに、他のアプリを更新することを誰も覚えておらず、実際には3つの異なるアプリが3つの異なる方法で同じ用語を翻訳していました。結局、すべての翻訳を一度に変更できるということは、私たちにとってもっと意味があったので、外部の影響がそれに影響する可能性があるという事実により、DBに戻ることに決めました。

一般に、他にも賛否両論がありますが、上記に比べるとかなり無関係です。あなたは本当にどのように翻訳を使用しているのか尋ねる必要があります。一般的な編集(上記の点を除く)に関しては、より多くのアプローチが同様に機能します。両方のアプローチで簡単に翻訳を変更、編集、拡張することができます。

DBとDB呼び出しがうまく設計されていないと、新しい言語を追加するのが簡単になります。単純にリソースファイルをコピーし、名前にカルチャ拡張を追加してリソースを翻訳に追加しますもう一度、DBデザインに完全に落ちたので、DBを設計するときに留意すべきことがあり、DBに翻訳を保持することについてはまったく言及していません。

翻訳を共有する必要がある場合、DBには明らかな利点がありますが、リソースは使いやすく、維持管理も拡張も容易です(.NETに組み込まれています)。だから、もし私が推薦された方法はリソースを使うことだと言わなければならないが、DBはそれを持っているし、それは本当にプロジェクトに依存する。

12

私はwritten a blog postは、多言語asp.net MVCアプリケーションの以下の側面をconveringました:

データベース:私は2つの部分、1含有する非翻訳可能なフィールドの翻訳を必要とする他の含むフィールドでテーブルを分割。

URLルート:私は通常、よく索引付けされたMLサイトを取得する方法でURLに文化を保持します。

routes.MapRoute(
    name: "ML", 
    url: "{lang}/{controller}/{action}/{id}", 
    defaults: new { lang = "en-CA", controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

ベースコントローラークラスから、{lang}パラメーターをコントローラーで使用できるようにすることができます。すべての詳細については、ブログの記事を参照してください。

データの照会:あなたのリポジトリまたはデータベースコンテキストにCultureを渡すだけです。アイデアは、翻訳用に分離した2つのテーブルをマージするビューモデルを作成することです。

public ActionResult Index(string id) 
{ 
    var vm = pages.Get(id, Language); // Language is the {lang} from the route 
    return View(vm); 
} 

あなたの閲覧数:一般的な2文字の言語コード、EXでファイル.NETのリソースを使用してください。HomePage.en.resx、HomePage.fr.resx。ロケールEN * -US *、EN * -CA *あなたのリソースファイルは、ほとんどがおそらく英語、米国、カナダで同じになります通貨、日付、数値などをフォーマットするために有用である、など

画像: imagename-en.png、imagename-fr.pngのような形式を使用してください。あなたのビューから拡張メソッドを介して利用{LANG}ルートのパラメータを作成し、このようなあなたの画像を表示:

<img src="/content/logos/[email protected]()" /> 

ます。また、サポート言語のための完全な別のフォルダを有することができます。例:/content/en/imagename.png、/content/fr/imagename.png。

JavaScript::私は通常、Lang-en.js、Lang-fr.jsという名前のLanguagePacksおよびJSファイルを作成します。JavaScriptのモジュール

から
<script type="text/javascript" src="/content/js/languagepacks/[email protected](this.CurrentLanguage()).js"></script> 

正しい言語ファイルをロード

、あなたのビューに

// lang-en.js 
var Lang = { 
    globalDateFormat = 'mm-dd-yy'; 
    greeting: 'Hello' 
}; 

:アイデアは、あなたが他のすべてのJSファイル上で使用することができます「静的」クラスを作成することです

// UI Module 
var UI = function() { 

    function notify() { 
    alert(Lang.greeting); 
    } 
    return { 
    notify: notify 
    } 
}; 

多言語Webアプリケーションを行う方法はありません。リソースを使用してテキストを翻訳すると、実行時にすばやくスワップできます。あなたは、翻訳者などに渡すことができるものを開くことができる複数のエディタを持っています。

あなたはブログ投稿を確認して、私がこれを行う方法の詳細な例を得ることができます。