Mehrere Sprachen in einer ASP.NET MVC-Anwendung?


71

Was ist der beste Weg, um mehrere Sprachen für die Schnittstelle in einer ASP.NET MVC-Anwendung zu unterstützen? Ich habe gesehen, dass Leute Ressourcendateien für andere Anwendungen verwenden. Ist das immer noch der beste Weg?



Mehrsprachige Website ohne Übergabe von Parametern, überprüfen Sie diese mehrsprachige Website in MVC 4 C #
Absender

Antworten:


42

Wenn Sie die Standardansichtsmodule verwenden, funktionieren lokale Ressourcen in den Ansichten. Wenn Sie jedoch Ressourcenzeichenfolgen innerhalb einer Controller-Aktion abrufen müssen, können Sie keine lokalen Ressourcen abrufen und müssen globale Ressourcen verwenden.

Dies ist sinnvoll, wenn Sie darüber nachdenken, da lokale Ressourcen lokal für eine Aspx-Seite sind und Sie im Controller noch nicht einmal Ihre Ansicht ausgewählt haben.


Ja, das ist für Controller sinnvoll. Aber was ist mit View Models? Sie sind (häufig) spezifisch für die Ansicht, und es wäre sinnvoll, auf die Ansichtsressourcen im Ansichtsmodellcode zu verweisen. Ich frage mich, ob es einen Mechanismus gibt, um eine Ressourcendatei für eine Ansicht und ihr Ansichtsmodell lokal zu machen ...
Andy McCluggage

@Haacked, hi, wir haben eine Shopping-Website in asp mvc. Wenn der Benutzer die arabische Sprache auswählt, möchten wir die gesamte Website arabisch machen. Können wir Microsoft Bing Translator oder Microsoft Translator API verwenden oder sollte ich localize.js kaufen , um dies zu erreichen? schnell?
Shaiju T

22

Ich fand diese Ressource sehr hilfreich

Es ist ein Wrapper um HttpContext.Current.GetGlobalResourceString und HttpContext.Current.GetLocalResourceString , mit dem Sie die Ressourcen wie folgt aufrufen können ...

// default global resource
Html.Resource("GlobalResource, ResourceName")

// global resource with optional arguments for formatting
Html.Resource("GlobalResource, ResourceName", "foo", "bar")

// default local resource
Html.Resource("ResourceName")

// local resource with optional arguments for formatting
Html.Resource("ResourceName", "foo", "bar")

Das einzige Problem, das ich gefunden habe, ist, dass Controller keinen Zugriff auf lokale Ressourcenzeichenfolgen haben.


3

Ja, Ressourcen sind immer noch der beste Weg, um mehrere Sprachen in der .NET-Umgebung zu unterstützen. Weil sie leicht zu referenzieren und noch einfacher sind, neue Sprachen hinzuzufügen.

Site.resx
Site.en.resx
Site.en-US.resx
Site.fr.resx
etc...

Sie haben also Recht, die Ressourcendateien weiterhin zu verwenden.


2

Das Orchard-Projekt verwendet eine Verknüpfungsmethode namens "T", um alle In-Page-String-Übersetzungen durchzuführen. Sie sehen also Tags mit einem @T ("A String to Translate").

Ich möchte untersuchen, wie dies hinter den Kulissen umgesetzt wird, und es möglicherweise in zukünftigen Projekten verwenden. Der Kurzname hält den Code sauberer , da es verwendet wird , eine Menge .

Was mir an diesem Ansatz gefällt, ist, dass die ursprüngliche Zeichenfolge (in diesem Fall Englisch) im Code immer noch gut sichtbar ist und keine Suche in einem Ressourcen-Tool oder an einem anderen Ort erforderlich ist, um zu dekodieren, wie die tatsächliche Zeichenfolge hier aussehen soll.

Weitere Informationen finden Sie unter http://orchardproject.net .


Es gibt Fälle, in denen die genau identische Quellzeichenfolge "A String to Translate" je nach dem umgebenden Kontext unterschiedlich übersetzt werden müsste. Dies ist insbesondere bei Einzelwortzeichenfolgen der Fall.
springy76

1

Einige der anderen als Antwort genannten Lösungen funktionieren nicht für die veröffentlichte Version von MVC (sie funktionierten mit früheren Versionen von Alpha / Beta).

Hier ist ein guter Artikel, der eine Möglichkeit beschreibt, eine Lokalisierung zu implementieren, die stark typisiert ist und die Unit-Tests von Controllern und Ansichten nicht unterbricht: Lokalisierungshandbuch für MVC v1


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.