我想找到一个关于asp.net本地化的goog教程。 在官方文档中,解释是关于.resx文件,我不想使用json文件。Asp.net核心本地化与json文件
如果有人有一个很好的教程如何写自己的中间件来做到这一点。
感谢
我想找到一个关于asp.net本地化的goog教程。 在官方文档中,解释是关于.resx文件,我不想使用json文件。Asp.net核心本地化与json文件
如果有人有一个很好的教程如何写自己的中间件来做到这一点。
感谢
一些调查后,我终于找到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文件,你可以使用IMemoryCache或IDistributedMemoryCache以提高性能。
编辑:
在应用程序启动时添加此行用自己的实现:
services.AddSingleton<IStringLocalizerFactory, JsonStringLocalizerFactory>();
services.AddSingleton<IStringLocalizer, JsonStringLocalizer>();
services.AddLocalization(options => options.ResourcesPath = "Resources");
之后,你可以配置为你想你的全球化的喜好。
编辑2:
这里包的链接: https://www.nuget.org/packages/Askmethat.Aspnet.JsonLocalizer/
看一看这里,我没有尝试自己,但它看起来很有希望。
http://ronaldwildenberg.com/asp-net-core-localization-with-json-resource-files/
你能请注明 - 如何impement这个中间件中启动? – Jenan
@Jenan我只是编辑我的帖子,以添加启动配置 – OrcusZ
伟大的,你给很好的观点 - 我从“JsonStringLocalizerFactory”等git respositories得到完美的结果。 – Jenan