2017-04-25 5 views
2

私はasp.netローカリゼーションに関するgoogチュートリアルを探しています。 公式ドキュメントでは、説明は.resxファイルであり、jsonファイルを使用することはできません。Asp.net jsonファイルのコアローカライズ

誰かが良いチュートリアルを書いている場合は、それを行うための独自のミドルウェアです。

おかげ

答えて

5

は、いくつかの調査の後、私は最終的にASP /ローカリゼーションのGitHubの例を見つけます。

私はここで、既定のカルチャープロバイダーを壊さずにフラットjsonを使用することを望んでいない人々に提供します。

データ:

平坦JSON:

[ 
    { 
    "Key": "Hello", 
    "LocalizedValue" : { 
     "fr-FR": "Bonjour", 
     "en-US": "Hello" 
    } 
    } 
] 

C#のモデル:

class JsonLocalization 
    { 
     public string Key { get; set; } 
     public Dictionary<string, string> LocalizedValue = new Dictionary<string, string>(); 

    } 

ミドルウェア

工場

これはただのCultureInfoへのアクセス権を持っていることですがStringLocalizerです。

public class JsonStringLocalizerFactory : IStringLocalizerFactory 
    { 
     public IStringLocalizer Create(Type resourceSource) 
     { 
      return new JsonStringLocalizer(); 
     } 

     public IStringLocalizer Create(string baseName, string location) 
     { 
      return new JsonStringLocalizer(); 
     } 
    } 

ローカライザー

あなたが基本的なIStringLocalizerを使用することができます。このソリューションによりJSONファイル

public class JsonStringLocalizer : IStringLocalizer 
{ 
    List<JsonLocalization> localization = new List<JsonLocalization>(); 
    public JsonStringLocalizer() 
    { 
     //read all json file 
     JsonSerializer serializer = new JsonSerializer(); 
     localization = JsonConvert.DeserializeObject<List<JsonLocalization>>(File.ReadAllText(@"localization.json")); 

    } 


    public LocalizedString this[string name] 
    { 
     get 
     { 
      var value = GetString(name); 
      return new LocalizedString(name, value ?? name, resourceNotFound: value == null); 
     } 
    } 

    public LocalizedString this[string name, params object[] arguments] 
    { 
     get 
     { 
      var format = GetString(name); 
      var value = string.Format(format ?? name, arguments); 
      return new LocalizedString(name, value, resourceNotFound: format == null); 
     } 
    } 

    public IEnumerable<LocalizedString> GetAllStrings(bool includeParentCultures) 
    { 
     return localization.Where(l => l.LocalizedValue.Keys.Any(lv => lv == CultureInfo.CurrentCulture.Name)).Select(l => new LocalizedString(l.Key, l.LocalizedValue[CultureInfo.CurrentCulture.Name], true)); 
    } 

    public IStringLocalizer WithCulture(CultureInfo culture) 
    { 
     return new JsonStringLocalizer(); 
    } 

    private string GetString(string name) 
    { 
     var query = localization.Where(l => l.LocalizedValue.Keys.Any(lv => lv == CultureInfo.CurrentCulture.Name)); 
     var value = query.FirstOrDefault(l => l.Key == name); 
     return value.LocalizedValue[CultureInfo.CurrentCulture.Name]; 
    } 
} 

からデータを取得するためのロジックあなたViewsおよびコントローラ。もちろん

あなたは大きなJSONファイルを持っている場合は、パフォーマンスを向上させるためにIMemoryCacheまたはIDistributedMemoryCacheを使用することができます。

EDIT:あなたは、グローバリゼーションの好みをしたいとあなたが設定することができた後

services.AddSingleton<IStringLocalizerFactory, JsonStringLocalizerFactory>(); 
services.AddSingleton<IStringLocalizer, JsonStringLocalizer>(); 
services.AddLocalization(options => options.ResourcesPath = "Resources"); 

:スタートアップは独自の実装を使用するには、この行を追加したアプリケーションで

EDIT 2:ここ

パッケージのリンク: https://www.nuget.org/packages/Askmethat.Aspnet.JsonLocalizer/

+0

が指定してくださいすることができ - スタートアップで、このミドルウェアをimpementか? – Jenan

+0

@Jenan私はスタートアップコンフィギュレーション – OrcusZ

+1

グレートを追加するために私のポストを編集し、あなたは偉大なポイントを与える - 私は「JsonStringLocalizerFactory」となど良い仕事のためのgit respositoriesから完璧な結果を得ます。 – Jenan