【发布时间】:2017-09-22 18:39:19
【问题描述】:
我正在努力寻找一个关于 asp.net 本地化的好教程。 在官方文档中,解释是关于.resx文件,我想使用json文件。
如果有人有关于如何编写中间件的好教程。
谢谢
【问题讨论】:
标签: c# asp.net json asp.net-core localization
我正在努力寻找一个关于 asp.net 本地化的好教程。 在官方文档中,解释是关于.resx文件,我想使用json文件。
如果有人有关于如何编写中间件的好教程。
谢谢
【问题讨论】:
标签: c# asp.net json asp.net-core localization
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<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];
}
}
通过这个解决方案,您可以在 Views 和 Controllers 中使用基本的 IStringLocalizer。
当然,如果你有一个大的 json 文件,你可以使用 IMemoryCache 或 IDistributedMemoryCache 来提高性能。
编辑:
在应用程序启动中添加此行以使用您自己的实现:
services.AddSingleton<IStringLocalizerFactory, JsonStringLocalizerFactory>();
services.AddSingleton<IStringLocalizer, JsonStringLocalizer>();
services.AddLocalization(options => options.ResourcesPath = "Resources");
之后,您可以根据自己的全球化偏好进行配置。
【讨论】:
看看这里,我自己没试过,但看起来很有希望。
http://ronaldwildenberg.com/asp-net-core-localization-with-json-resource-files/
【讨论】: