2017-04-25 142 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(); 
     } 
    } 

航向

從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]; 
    } 
} 

獲取數據有了這個解決方案,您可以使用基本IStringLocalizer中的邏輯您Views and 個控制器

當然,如果你有一個大的JSON文件,你可以使用IMemoryCacheIDistributedMemoryCache以提高性能。

編輯:

在應用程序啓動時添加此行用自己的實現:

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

之後,你可以配置爲你想你的全球化的喜好。

編輯2:

這裏包的鏈接: https://www.nuget.org/packages/Askmethat.Aspnet.JsonLocalizer/

+0

你能請註明 - 如何impement這個中間件中啓動? – Jenan

+0

@Jenan我只是編輯我的帖子,以添加啓動配置 – OrcusZ

+1

偉大的,你給很好的觀點 - 我從「JsonStringLocalizerFactory」等git respositories得到完美的結果。 – Jenan