使用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文件,你可以使用IMemoryCache或IDistributedMemoryCache来提高性能。
编辑:
在应用程序启动中添加以下行以使用您自己的实现:
services.AddSingleton(); services.AddSingleton(); services.AddLocalization(options => options.ResourcesPath = "Resources");
之后,您可以根据需要配置全球化首选项。
看看这里,我自己没试过,但看起来很有希望。
http://ronaldwildenberg.com/asp-net-core-localization-with-json-resource-files/