9

Ich habe eine lokalisierte MVC-Website mit dem unter this blog by Alex Adamyan gefundenen Code erstellt.ResourceManager wählt bei der Verwendung der benutzerdefinierten Kultur nicht den richtigen Ressourcensatz

Das funktioniert gut, wenn ich eine vorhandene Kultur verwende. Ich versuche jedoch, für Tagalog zu lokalisieren (tl oder tl-PH). Windows nicht diese Kultur in gebaut hat, so habe ich erstellt ein (Ich habe versucht, sowohl tl und tl-PH) gemäß dem folgenden Code:

public static void CreateCustomCultures() 

{ 

    var cultureBuilder = new CultureAndRegionInfoBuilder(
          "tl", CultureAndRegionModifiers.Neutral); 

    cultureBuilder.LoadDataFromCultureInfo(new CultureInfo("en-US")); 
    cultureBuilder.LoadDataFromRegionInfo(new RegionInfo("US")); 
    cultureBuilder.IsMetric = true; 
    cultureBuilder.CultureEnglishName = "Tagalog"; 
    cultureBuilder.CultureNativeName = "Tagalog"; 
    cultureBuilder.RegionEnglishName = "Tagalog"; 
    cultureBuilder.RegionNativeName = "Tagalog"; 
    cultureBuilder.TwoLetterISOLanguageName = "tl"; 
    cultureBuilder.ThreeLetterISORegionName = "PH"; 
    cultureBuilder.Register(); 

    var cultureBuilder2 = new CultureAndRegionInfoBuilder(
          "tl-PH", CultureAndRegionModifiers.None); 

    cultureBuilder2.LoadDataFromCultureInfo(new CultureInfo("en-US")); 
    cultureBuilder2.LoadDataFromRegionInfo(new RegionInfo("US")); 
    cultureBuilder2.IsMetric = true; 
    cultureBuilder2.CultureEnglishName = "Tagalog"; 
    cultureBuilder2.CultureNativeName = "Tagalog"; 
    cultureBuilder2.RegionEnglishName = "Tagalog"; 
    cultureBuilder2.RegionNativeName = "Tagalog"; 
    cultureBuilder2.TwoLetterISOLanguageName = "tl"; 
    cultureBuilder2.ThreeLetterISORegionName = "PH"; 
    cultureBuilder2.Register(); 

} 

ich auch vier Ressourcendateien auf meiner Test-Site in sie habe ~/Ansichten/Home/Ressourcen:

  • Home.aspx.resx;
  • Home.aspx.tl.resx
  • Home.aspx.tl-PH.resx
  • Home.aspx.de.resx

Wenn ich bauen, bekomme ich drei entsprechend benannten Verzeichnisse unter meinem bin-Verzeichnis, jedes mit einer entsprechend benannten DLL.

Also, wenn ich auf meiner Website Homepage http://localhost:1907 gehe ich bekomme die Standard (Englisch) Sprachzeichenfolgen.

Wenn ich auf die deutsche (de) Homepage gehe http://localhost:1907/de bekomme ich die deutsche Version der Seite.

Wenn ich zu den Tagalog-Versionen gehen http://localhost:1907/tl oder http://localhost:1907/tl-PH, bekomme ich die englische Version anstelle der Tagalog-Version.

Ich habe Haltepunkte im Ressourcenabrufcode platziert und bestätigt, dass die Kultur und die Benutzeroberflächenkultur des aktuellen Threads korrekt auf die Tagalog-Kultur festgelegt sind und dass Tagalog die Kultur ist, die an resourceManager.GetString (Schlüssel, Kultur) übergeben wird.

Irgendwelche Gedanken? Habe ich meine Kulturen nicht korrekt erstellt?

+0

cultureBuilder2.LoadDataFromCultureInfo (neue CultureInfo ("en-US")); cultureBuilder2.LoadDataFromRegionInfo (neue RegionInfo ("US")); de-DE? –

+0

@Avatar: Es lädt nur Einstellungen (wie Dezimal- und Gruppierungstrennzeichen und/oder Formate) aus der US-amerikanischen Kultur. Es sollte keine Auswirkungen auf das Laden geeigneter Ressourcen haben ... –

+0

Ich bin mir ziemlich sicher, dass Sie Ihre benutzerdefinierte Kultur korrekt erstellt haben. Die einzige Sorge, die ich habe, ist Ihre drei Buchstaben ISO 3166 Ländercode, der anscheinend nur zwei Buchstaben ist. Es sollte jedoch keine Rolle spielen. –

Antwort

1

Ich denke, Ihre Kulturen sind nie registriert, zumindest einer von ihnen ist nicht.

Der folgende Code löst eine Ausnahme aus, da Sie keine regionalen Werte für eine neutrale Kultur angeben können. Genauso wie Sie kein DateTimeFormatInfo-Objekt für eine neutrale Kultur erstellen können.

var cultureBuilder = new CultureAndRegionInfoBuilder(
         "tl", CultureAndRegionModifiers.Neutral); 

cultureBuilder.LoadDataFromCultureInfo(new CultureInfo("en-US")); 
cultureBuilder.LoadDataFromRegionInfo(new RegionInfo("US")); 
cultureBuilder.IsMetric = true; 
cultureBuilder.CultureEnglishName = "Tagalog"; 
cultureBuilder.CultureNativeName = "Tagalog"; 
cultureBuilder.RegionEnglishName = "Tagalog"; 
cultureBuilder.RegionNativeName = "Tagalog"; 
cultureBuilder.TwoLetterISOLanguageName = "tl"; 
cultureBuilder.ThreeLetterISORegionName = "PH"; 
cultureBuilder.Register(); 

Es sollte so etwas wie dieses

var cultureBuilder = new CultureAndRegionInfoBuilder(
         "tl", CultureAndRegionModifiers.Neutral); 

cultureBuilder.LoadDataFromCultureInfo(new CultureInfo("en-US")); 
cultureBuilder.CultureEnglishName = "Tagalog"; 
cultureBuilder.CultureNativeName = "Tagalog"; 
cultureBuilder.TwoLetterISOLanguageName = "tl"; 
cultureBuilder.Register(); 

Die zweite spezifische Kultur scheint in Ordnung sein.