2017-08-01 7 views
1

私はASP.NET Core(.NETCoreApp 1.1)Webアプリケーションをいくつかのビュー(部分的に共有されているものを含む)とローカライズが必要なコントローラで作成しています。ユニークなJSONリソースからのASP.NETコアのローカライゼーション

制約がローカライズ文字列は次の構造(限り、それは1つのファイルに残っているように変更することができます)は、単一のJSONファイル内にあるということです。だから私は、私は必要なものを推測

{ 
    "HELLO": { 
    "en": "Hello!", 
    "fr": "Bonjour !" 
    } 
} 

をこのユニークなファイルにアクセスするためのローカリゼーションは、_localizer["HELLO"]のような私のコントローラとビューで使用できるIStringLocalizerIViewLocalizerのオブジェクトを提供していますが、それは明らかにデフォルトのパターンではありません。

これに問題を追加するには、デフォルトでブラウザから優先言語を自動的に検出するか、/ en/Home/Indexや/ fr/Homeなどのルート値として明示的に言語を指定する必要もあります/ Indexだけでなく、/ Home/Indexも参照してください。

私はASP.NETコアにとって非常に新しく、ドキュメンテーションやさまざまなサンプルを実現していても、私が必要としているものを使っても、実稼働環境で使用できる信頼できるものを実装することはできませんでした。私が見つけたものには何かがないか、何とか時代遅れになっています。

これらのことを理解している誰かが私にこれを行う方法を示すことができたら、感謝しています!

編集:私はルートから何かを得る方法を見つけたと思います。ここに私がやったことです:

マイルートテンプレートがtemplate: "{lang?}/{controller=Home}/{action=Index}/{id?}")であり、ここで私は、コントローラからLANGを取得するために使用するコードは次のとおりです。

string lang = this.RouteData.Values["lang"] as string; 
if (lang == null) 
{ 
    string userLangs = HttpContext.Request.Headers["Accept-Language"].ToString(); 
    lang = userLangs.Split(',').FirstOrDefault(); 
} 

答えて

1

JSONファイルを使用してに関しては、私はこのコードを取ったhere 1つのファイルを使用するように変更しました。 LocalizerUtilクラスでは、ExpandPathIteratorは単に "Resources \ Localization"を返します。その非常に原油ですが、私は各言語ごとに1つのjsonファイルを持つことができます。 1つのファイル内でネストされた言語は行いませんが、それをさらに修正することができると確信しています。

言語の選択肢をクッキーに格納し、ユーザーがドロップダウンで言語をスワップすることができるようになりました。

Startup.cs

// Add localization 
services.AddJsonLocalization(opts => { opts.ResourcesPath = "Resources"; }); 

// Add framework services. 
services.AddMvc().AddViewLocalization().AddDataAnnotationsLocalization(); 

services.Configure<RequestLocalizationOptions>(options => 
     { 
      var supportedCultures = new List<CultureInfo> 
      { 
       new CultureInfo("en"), 
       new CultureInfo("fr"), 
      }; 

      options.DefaultRequestCulture = new RequestCulture("en"); 
      // Formatting numbers, dates, etc. 
      options.SupportedCultures = supportedCultures; 
      // UI strings that we have localized. 
      options.SupportedUICultures = supportedCultures; 
     }); 

そして言語スイッチャーの作業を取得するためにthisthisブログ記事の組み合わせを使用。あなたがブログの投稿でそれに触れるURLスキームを使用したい場合。

+0

ありがとうございました。それは私が恐れていた答えです...私は私が必要とするものを達成することができなくても、最後の2日間それと闘ってきました。私は明日、もう一度やってみよう、多分私はある種の出生時を持つだろう。 – albator1932

+1

@ albator1932 https://stackoverflow.com/a/44782669/909809フラットファイルを使用すると便利です。フラットファイルのルートに行くつもりだったので、すべての単語が互いに隣り合っているので、すべてが同期しているように見えますが、サンプルが不足していますので、今は複数のファイルを整理しました。 –

+0

ああ、私はこれを逃したとは思わない、私はすぐにそれを試してみましょう。私が何かを働かせたら、私は完全な実例を分かち合い、これを作ることがどれほど難しいのか信じられません。 – albator1932

関連する問題