2017-04-25 149 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