Nach einigen Untersuchungen, ich schließlich ein Beispiel, in Asp/Lokalisierung GitHub finden.
Ich biete hier für Leute, die eine flache JSON verwenden möchten, ohne Standardkulturanbieter zu brechen.
Daten:
Die Wohnung json:
[
{
"Key": "Hello",
"LocalizedValue" : {
"fr-FR": "Bonjour",
"en-US": "Hello"
}
}
]
Das C# Modell:
class JsonLocalization
{
public string Key { get; set; }
public Dictionary<string, string> LocalizedValue = new Dictionary<string, string>();
}
Die Middleware
Die Fabrik
Dies ist nur Zugriff auf die Culture haben, ist die StringLocalizer.
public class JsonStringLocalizerFactory : IStringLocalizerFactory
{
public IStringLocalizer Create(Type resourceSource)
{
return new JsonStringLocalizer();
}
public IStringLocalizer Create(string baseName, string location)
{
return new JsonStringLocalizer();
}
}
Der Localizer
Die Logik der Daten aus der JSON-Datei
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];
}
}
Mit dieser Lösung können Sie zu erhalten, sind die Grund IStringLocalizer in Ihrer verwenden Ansichten und Controller.
Natürlich, wenn Sie eine große JSON-Datei haben, können Sie IMemoryCache oder IDistributedMemoryCache verwenden, um Leistung zu verbessern.
EDIT:
Bei der Anwendung Startup diese Zeilen fügen Sie Ihre eigene Implementierung zu verwenden:
services.AddSingleton<IStringLocalizerFactory, JsonStringLocalizerFactory>();
services.AddSingleton<IStringLocalizer, JsonStringLocalizer>();
services.AddLocalization(options => options.ResourcesPath = "Resources");
Danach können Sie konfigurieren können, wie Sie Ihre Globalisierung Vorlieben möchten.
EDIT 2:
Hier der Link des Pakets: https://www.nuget.org/packages/Askmethat.Aspnet.JsonLocalizer/
Können Sie bitte angeben - wie diese Middleware in Startup impement? – Jenan
@Jenan Ich bearbeite gerade meinen Beitrag, um Startkonfiguration hinzuzufügen – OrcusZ
Großartig, geben Sie großen Punkt - ich bekomme perfekte Ergebnisse von Git-Repositories für "JsonStringLocalizerFactory" und etc. Gute Arbeit. – Jenan