使用json文件的Asp.net核心本地化

我正在努力寻找一个关于asp.net本地化的好教程。 在官方文档中,解释是关于.resx文件,我想使用json文件。

如果有人有一个很好的教程,如何编写中间件来做到这一点。

谢谢

Nuget包

https://www.nuget.org/packages/Askmethat.Aspnet.JsonLocalizer/

经过一些调查,我终于在Asp / Localization GitHub中找到了一个例子。

我在这里为没有打破默认文化提供者的人们提供不想使用平面json的人。

数据:

扁平的json:

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

C#模型:

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

中间件

工厂

这只是为了访问CultureInfo是StringLocalizer。

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

Localizer

从JSON文件获取数据的逻辑

 public class JsonStringLocalizer : IStringLocalizer { List localization = new List(); public JsonStringLocalizer() { //read all json file JsonSerializer serializer = new JsonSerializer(); localization = JsonConvert.DeserializeObject>(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 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

当然,如果你有一个大的json文件,你可以使用IMemoryCacheIDistributedMemoryCache来提高性能。

编辑:

在应用程序启动中添加以下行以使用您自己的实现:

 services.AddSingleton(); services.AddSingleton(); services.AddLocalization(options => options.ResourcesPath = "Resources"); 

之后,您可以根据需要配置全球化首选项。

看看这里,我自己没试过,但看起来很有希望。

http://ronaldwildenberg.com/asp-net-core-localization-with-json-resource-files/