2017-04-25 3 views
2

Ich versuche, ein Goog-Tutorial über asp.net Lokalisierung zu finden. In der offiziellen Dokumentation sind die Erklärungen über .resx Dateien und ich möchte JSON-Dateien verwenden.Asp.net Core-Lokalisierung mit JSON-Dateien

Wenn jemand eine gute Anleitung haben, wie man schreibt, ist eigene Middleware das zu tun. Haben

Dank

Antwort

5

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/

+0

Können Sie bitte angeben - wie diese Middleware in Startup impement? – Jenan

+0

@Jenan Ich bearbeite gerade meinen Beitrag, um Startkonfiguration hinzuzufügen – OrcusZ

+1

Großartig, geben Sie großen Punkt - ich bekomme perfekte Ergebnisse von Git-Repositories für "JsonStringLocalizerFactory" und etc. Gute Arbeit. – Jenan