我想找到一個關於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