Ich entwickle die Benutzeroberfläche für eine .NET MVC-Anwendung, die in naher Zukunft eine internationale Lokalisierung aller Inhalte erfordert. Ich kenne .NET im Allgemeinen sehr gut, hatte aber noch nie ein Projekt, bei dem ein so starker Fokus auf die internationale Erreichbarkeit gelegt wurde.
Die Projektion erfolgt zunächst in englischer Sprache. Welche Maßnahmen sollte ich an dieser Stelle ergreifen, um die zukünftige Implementierung der Lokalisierung zu vereinfachen?
.net
localization
internationalization
multilingual
Smartcaveman
quelle
quelle
Antworten:
Sie entwickeln eine ASP.Net MVC-Anwendung, oder? Andere Antworten scheinen spezifisch für Desktop-Anwendungen zu sein. Lassen Sie mich gemeinsame Dinge erfassen:
Gebietsschemaerkennung
Es ist sehr wichtig, dass Ihre Anwendung das Gebietsschema des Benutzers korrekt erkennt. In der Desktop-Anwendung enthält CultureInfo.CurrentCulture das bevorzugte Formatierungsgebietsschema (das zum Formatieren von Zahlen, Datumsangaben, Währungen usw. verwendet werden sollte), während CultureInfo.CurrentUICulture das bevorzugte Gebietsschema für die Benutzeroberfläche enthält (das zum Anzeigen lokalisierter Nachrichten verwendet werden sollte). . Für Webanwendungen sollten Sie beide Kulturen auf auto setzen (um das Gebietsschema automatisch aus dem AcceptLanguage-Header zu erkennen), es sei denn, Sie möchten einen ausgefallenen Workflow für die Gebietsschemaerkennung implementieren (dh das Ändern der Sprache bei Bedarf unterstützen).
Veröffentlichen Sie Zeichenfolgen
Alle Zeichenfolgen sollten aus Ressourcen stammen, also aus Resx-Dateien. In der Winforms-App können Sie dies problemlos erreichen, indem Sie die Localizable-Eigenschaft des Formulars auf true setzen. Sie müssten (leider) auch Zeichenfolgen, die von Ihren Modellen stammen, manuell externalisieren. Es ist auch relativ einfach. In Asp.Net müssten Sie alles manuell auslagern ...
Layouts
Sie müssen auf jeden Fall die Erweiterung der Zeichenfolge berücksichtigen. In der Winforms-Welt ist dies über TableLayoutPanel möglich. Dies sollte verwendet werden, um sicherzustellen, dass das Layout automatisch an längeren Text angepasst wird. In der Web-Welt haben Sie ein bisschen Pech. Möglicherweise müssen Sie den CSS-Lokalisierungsmechanismus implementieren - eine Möglichkeit zum Ändern (Überschreiben) von CSS-Definitionen. Dies würde es Lokalisierungsleuten ermöglichen, Stilprobleme bei Bedarf zu ändern. Stellen Sie sicher, dass jedes HTML-Element in der gerenderten Seite eine eindeutige ID hat, damit es präzise ausgerichtet werden kann.
Kulturspezifische Themen
Vermeiden Sie Grafiken, Farben und Sounds, die für die westliche Kultur spezifisch sein könnten. Wenn Sie es wirklich brauchen, geben Sie bitte die Mittel zur Lokalisierung an. Vermeiden Sie richtungsabhängige Grafiken (da dies ein Problem darstellen würde, wenn Sie versuchen, Arabisch oder Hebräisch zu lokalisieren). Nehmen Sie auch nicht an, dass die ganze Welt dieselben Zahlen verwendet (dh nicht für Arabisch).
ToString () und Parse ()
Stellen Sie sicher, dass Sie CultureInfo immer übergeben, wenn Sie ToString () aufrufen, es sei denn, dies wird nicht unterstützt. Auf diese Weise kommentieren Sie Ihre Absichten. Beispiel: Wenn Sie eine Nummer intern verwenden und sie aus irgendeinem Grund in eine Zeichenfolge konvertieren müssen, verwenden Sie:
Für Nummern, die dem Benutzer angezeigt werden sollen:
Gleiches gilt für Parse (), TryParse () und sogar ParseExact () - einige böse Fehler könnten ohne ordnungsgemäße Verwendung von CultureInfo auftreten. Das liegt daran, dass eine arme Seele in Microsoft, die voll guter Absichten ist, entschieden hat, dass es eine gute Idee ist, CultureInfo.CurrentCulture als Standard zu behandeln (es wird verwendet, wenn Sie nichts übergeben) - schließlich, wenn jemand ToString verwendet ( ) er / sie möchte es dem Benutzer anzeigen, oder? Es stellt sich heraus, dass dies nicht immer der Fall ist. Versuchen Sie beispielsweise, die Versionsnummer Ihrer Anwendung in einer Datenbank zu speichern und anschließend in eine Instanz der Versionsklasse zu konvertieren. Viel Glück.
Daten und Zeitzonen
Achten Sie darauf, immer zu speichern und instanziiert Datetime in UTC (verwenden DateTime.UtcNow statt DateTime.Now). Konvertieren Sie es nach der Anzeige in die Ortszeit im lokalen Format:
Wenn Sie E-Mails mit einem Zeitbezug im Hauptteil senden müssen, müssen Sie die Zeitzoneninformationen angeben - einschließlich UTC-Versatz und Liste der Städte:
Zusammengesetzte Nachrichten
Sie wurden bereits gewarnt, keine Zeichenfolgen zu verketten. Stattdessen würden Sie wahrscheinlich String.Format () wie oben gezeigt verwenden. Ich muss jedoch darauf hinweisen, dass Sie die Verwendung von zusammengesetzten Nachrichten auf ein Mindestmaß beschränken sollten. Das liegt nur daran, dass die Grammatikregeln für das Ziel häufig unterschiedlich sind. Daher müssen Übersetzer den Satz möglicherweise nicht nur neu anordnen (dies würde durch die Verwendung von Platzhaltern und String.Format () behoben), sondern den gesamten Satz auf unterschiedliche Weise basierend auf übersetzen was ersetzt wird. Lassen Sie mich einige Beispiele nennen:
Andere Verkettungsprobleme
Die Verkettung ist nicht auf Zeichenfolgen beschränkt. Vermeiden Sie das gemeinsame Anordnen von Steuerelementen, sagen Sie:
Erinnern Sie mich noch einmal in [Textfeld mit Nummer] Tagen.
Dies sollte in etwa wie folgt umgestaltet werden: Erinnere mich in dieser Anzahl von Tagen erneut an: [Textfeld].
Zeichenkodierung und Schriftarten
Speichern und übertragen Sie jeden Text in Unicode (dh in UTF-8). Keine hartcodierten Schriftarten - Möglicherweise muss die Lokalisierung sie ändern, und der Standard-Fallback-Mechanismus für Schriftarten wird deaktiviert (im Fall von Winforms). Denken Sie daran, in den meisten Feldern "seltsame" Zeichen (z. B. Benutzername) zuzulassen.
Prüfung
Sie müssen wahrscheinlich eine sogenannte Pseudo-Übersetzung implementieren, dh Ressourcen für die deutsche Kultur erstellen und Ihre englischen Zeichenfolgen kopieren, indem Sie Präfix und Suffix hinzufügen. Sie können auch Platzhalter umbrechen, um zusammengesetzte Zeichenfolgen leicht zu erkennen. Der Zweck der Pseudoübersetzung besteht darin, Lokalisierungsprobleme wie hartcodierte Zeichenfolgen, Layoutprobleme und die übermäßige Verwendung zusammengesetzter Nachrichten zu erkennen.
quelle
String.Format
so dass es dieses coole Syntax unterstützen könnte:"There {0:was|were} {0} {0:virus|viruses} found."
Jede Sprache kann seine eigenen Regeln laden, so dass Sie könnte"Znaleziono {0} {0:wirusy|wirusów}."
die Quelle auf GitHub ist: github.com/scottrippey/SmartFormat/wiki"{0} {0:plik|pliki|plików}"
. Der Formatierer hat eine polnische Regel, die festlegt, welche der drei Formen verwendet werden sollen, und die Sonderfälle korrekt festlegt. Ich arbeite derzeit daran, weitere Regeln hinzuzufügen, sodass sich dergettext
Artikel als sehr nützlich erweisen wird. Danke.Einige grundlegende Dinge, die Sie berücksichtigen sollten:
Veröffentlichen Sie alle Zeichenfolgenressourcen
Alle Ihre Ressourcen sollten in externen Dateien enthalten sein, die zur Lokalisierung übergeben werden können. Vergessen Sie die Fehlermeldungen nicht, wenn Sie diese auch lokalisieren möchten.
Lassen Sie ausreichend Platz für die Erweiterung der Zeichenfolge
Zeichenfolgen in einigen Sprachen sind in der Regel bis zu 30% länger (z. B. Griechisch). Stellen Sie daher sicher, dass Sie die Benutzeroberfläche so gestalten, dass Zeichenfolgen bei Bedarf erweitert werden können. Hier ist ein ziemlich extremes Beispiel für Französisch:
Ich würde empfehlen, eine Art Pseudoübersetzung als Ausgangspunkt zu verwenden ( http://en.wikipedia.org/wiki/Pseudolocalization ). Oder Sie können Ihre Ressourcen über Google Translate oder Bing übersetzen. Dies gibt Ihnen einen guten Hinweis darauf, wie die tatsächlichen Übersetzungen aussehen werden.
Achten Sie auf Text in Bildern
Wenn Sie Bilder in Ihrer Anwendung verwenden - stellen Sie sicher, dass sie keinen Text enthalten -, kann dies offensichtlich nicht übersetzt werden.
Codieren Sie niemals Pfade zu Windows-Ordnern fest
Natürlich, aber ich habe es in der Vergangenheit gesehen. Beispielsweise wird
C:\Program Files
es auf einigen internationalen Windows-Versionen übersetzt, z. B.C:\Programme
auf einem deutschen Betriebssystem.Vermeiden Sie länderspezifische Begriffe
Wenn Sie zum Beispiel jemanden in einem Formular nach seiner "High School" fragen, hat dies in Westeuropa nur eine geringe Bedeutung.
Vermeiden Sie das Erstellen von Zeichenfolgen durch Verketten von Zeichenfolgen
Das sieht zum Beispiel harmlos aus:
Die Wortreihenfolge für Japanisch wäre jedoch anders, sodass dies möglicherweise keinen Sinn ergibt.
Zeit- / Datumseinstellungen
Stellen Sie immer sicher, dass das Uhrzeit- / Datumsformat aus dem Betriebssystem stammt.
quelle
Besondere Überlegungen für asiatische Sprachen
Neben all den tollen Antworten hier gibt es auch einige Tipps für asiatische Sprachen:
Achten Sie auf unterschiedliche Textlängen
Chinesischer und koreanischer Text sind in der Regel viel kürzer als der entsprechende englische Text (da Sie normalerweise weniger blockartige Zeichen benötigen, um dasselbe zu schreiben), sodass eine Seite auf Chinesisch möglicherweise leer , auf Deutsch jedoch voll gestaut aussieht ... Das müssen Sie tun Einige dynamische Größen hier, um gut auszusehen.
Japanischer Text ist jedoch in der Regel viel länger als der entsprechende englische Text in Bezug auf die Anzahl der Zeichen.
Achten Sie auf das Grundlinienlayout und den "nach oben geschobenen" Look
In der Grundlinie werden normalerweise asiatische Zeichen angeordnet , die keine Unterstriche enthalten (dh den unteren Teil von y, g, q, j usw.) Bei Text handelt es sich nur um asiatische Sprachen (dh keine westlichen Alphabete). Der Text sieht dann so aus, als wäre er nach oben verschoben.
Formatierung von Zahlen und lokalisierten numerischen Einheiten
Behandeln Sie die Zahlenformatierung anders. Verschiedene asiatische Länder haben unterschiedliche Möglichkeiten, Zahlen zu formatieren. Gleiches gilt für Währungen. In Ostasien sind beispielsweise 10.000 (WAN) eine übliche Einheit. In Indien sind 100.000 (Lakhs) üblich.
Lokale Währungen
Die Währungen einiger Länder haben viele Nullen und keinen Dezimalpunkt (z. B. Japan, Indonesien, Italien), während andere bis zu zwei Nachkommastellen haben.
Hüten Sie sich vor unterschiedlichen Wortfolgen
Die Wortreihenfolge ist möglicherweise nicht immer gleich. Verwenden Sie am besten {0}, {1} usw. für die Formatierung von Zeichenfolgen anstelle der hartcodierten Wortreihenfolge, wenn Ihre Zeichenfolge aus einer Kombination verschiedener Daten stammt.
Verwenden Sie eine länderspezifische Sortierung
Die Sortierung ist je nach Sprache und Gebietsschema unterschiedlich - Sie sollten sich immer auf die länderspezifische Sortierung des Betriebssystems verlassen.
Seien Sie sehr vorsichtig mit Zeichen voller Breite / halber Breite
Beachten Sie die Unterschiede zwischen "Zeichen voller Breite" und "Zeichen halber Breite". Klammern, Satzzeichen usw. können Versionen mit "voller Breite" aufweisen, die sich von Standard-ASCII unterscheiden. Wenn Sie anhand dieser Buchstaben suchen oder Zeichenfolgen aufteilen, müssen Sie zuerst alle Symbole mit voller Breite in Entsprechungen mit halber Breite konvertieren.
Ein Punkt ist kein Punkt ... ein Komma ist kein Komma ...
Hüten Sie sich vor Dateneingaben, beispielsweise ist ein Punkt auf Chinesisch kein Punkt ".". Ein Komma ist in voller Breite, nicht ",". Versuchen Sie nicht, nach westlichen Interpunktionszeichen zu suchen, wenn der Benutzer, der die Dateneingabe vornimmt, versehentlich IME in asiatischer Sprache aktiviert.
Telefonnummern
Nehmen Sie bei der Formatierung der Telefonnummer nichts an. Es gibt nicht immer eine Ortsvorwahl usw. und diese kann unterschiedlich formatiert werden. Verwenden Sie normalerweise eine Formatzeichenfolge pro Land.
Gehen Sie nicht davon aus, dass die Leute nur eine Handynummer oder eine Faxnummer usw. haben. In Asien ist dies nicht der Fall.
Adressen - dichter als Sie vielleicht denken
Nehmen Sie für Adressen nichts an . Möglicherweise gibt es nicht immer eine Postleitzahl. Postleitzahlen müssen nicht immer Zahlen sein. Ein Land darf keine Provinzen / Staaten haben. Ein Land kann nur eine große Stadt sein (zB Singapur). In bestimmten asiatischen Ländern ist die kleinste Wohneinheit möglicherweise "Raum X, Einheit Y, Abschnitt Z, Etage A, Block B, Gruppe C, Anwesen D". Im Allgemeinen wird sehr liberal in der Anzahl der Felder und die Anzahl der Zeichen in Adressen erlaubt.
Anreden
Anreden sind nicht nur auf Mr., Mrs. usw. beschränkt. Obwohl Sie wahrscheinlich sicher sind, "M" und "F" für Sex zu verwenden - wir sind noch nicht so seltsam ...
quelle
Einige grundlegende Schritte sind, um sicherzustellen, dass eine Zeichenfolge, die auf dem Bildschirm angezeigt wird, kein Literal in Ihrem Code ist. Wenn Sie Winforms ausführen, verfügt jedes Formular über eine UI-Ressource. Stellen Sie für Dialoge, Berichte usw. sicher, dass Sie die Projektressourcendateien verwenden.
Anstelle von "Hochladen fehlgeschlagen" in Ihrem Code haben Sie möglicherweise so etwas wie Resources.UploadFailed
Auf diese Weise können Sie eine neue Ressourcendatei für jede von Ihnen verwendete Sprache erstellen (und .Net hilft Ihnen dabei.) Und die lokalisierte Zeichenfolge in jeder Datei haben.
BEARBEITEN Ich habe vergessen zu erwähnen, wenn Sie Ihre Benutzeroberfläche tun, stellen Sie sicher, dass Sie nicht nur Dinge drin stopfen. Abhängig von den Sprachen, in die Sie lokalisieren, kann Immobilien ein Problem sein. Ich habe an einem Projekt gearbeitet, bei dem Deutsch und Portugiesisch die 2 größten Straftäter für das Saitenwachstum waren. Wenn wir nicht aufpassen würden, dass die Zeichenfolgen in Englisch in Ordnung sind, würden Französisch und Italienisch in Deutsch in die Luft jagen.
quelle
Ich schlage vor, Sie führen FXCop oder Visual Studio Code Analysis (sie sind ziemlich gleich) auf Ihren Assemblys aus.
Sie sind gut darin, .NET-Code zu erkennen, der nicht die richtigen kulturbezogenen Überladungen verwendet, z . B . : CA1305: Geben Sie IFormatProvider an .
Ich muss hinzufügen, dass diese Tools ebenfalls frustrierend sind, da sie normalerweise Millionen von Problemen in Ihrem Code erkennen. Aber auch wenn Sie nicht jede Regel befolgen, sollten Sie eine Menge lernen.
quelle
Zusätzlich zum spezifischen Laden von Ressourcen stelle ich sicher, dass Sie zunächst mit einer pseudolokalisierten Version testen. Andernfalls werden Sie wahrscheinlich die Stellen nicht bemerken, an denen Internationalisierungsüberlegungen bis zum Ende weggelassen wurden.
quelle
Neben all den anderen hilfreichen Hinweisen fehlen hier einige:
Beachten Sie, dass einige Länder mehr als eine Sprache verwenden. In Kanada würde ein Benutzer beispielsweise erwarten, dass er problemlos zwischen Englisch und Französisch wechseln kann.
Wenn Sie dem Benutzer eine Frage stellen, die eine Antwort mit einem Buchstaben erwartet, dürfen Sie nicht erwarten, dass der Benutzer die Taste "Y" drückt, um Ja zu sagen.
Beachten Sie in gespeicherten Prozessen, dass Datumsangaben in der SQL-Datenbank im USA-Format vorliegen
Durch das Platzieren von Textzeichenfolgen in der Datenbank können Sie später weitere Sprachen hinzufügen, ohne sie erneut bereitstellen zu müssen.
Wenn Sie geschriebene Textdateien zur Übersetzung senden, geben Sie immer eine Beschreibung des Kontexts an, um sicherzustellen, dass der Übersetzer das richtige Wort auswählt. ZB ohne Kontext könnten Sie "Tonhöhe:" in etwas übersetzen, das mit Ton oder einem Ort zu tun hat, an dem Sie Fußball spielen
Adressetiketten müssen immer konvertiert werden. Provinz in Kanada, Bundesstaat in Amerika, Grafschaft in Großbritannien
quelle
Sie müssen berücksichtigen:
Routing für Mehrsprachigkeit
Verschieben Sie alle Hardcode-Zeichenfolgen in die Ressourcendatei
Ein Beispiel für eine Immobilie:
Modell:
Aussicht:
quelle
Hier ist etwas, das in den restlichen Antworten nicht erwähnt wird.
Abhängig von der Komplexität Ihrer Anwendung und ihrer Lokalisierung würde ich dringend empfehlen, einen alternativen Ressourcenanbieter zu implementieren und lokalisierte Ressourcen in einer Datenbank zu halten. Mit dem Standardschema für die ASP.NET-Lokalisierung werden alle Ressourcen in RESX-Dateien gespeichert.
Ziehen Sie als möglichen Anwendungsfall in Betracht, Sprachpakete für Ihre Anwendung bereitzustellen und Sprachen über die Benutzeroberfläche zu importieren und zu exportieren. RESX-Dateien würden hier nicht helfen.
In solchen Szenarien ist ein alternativer Ressourcenanbieter sehr hilfreich. Weitere Informationen zur Implementierung finden Sie hier . Natürlich ist dies ein seltener Fall, der in Unternehmensanwendungen häufiger vorkommt, aber immer noch gültig ist.
quelle
Das Wichtigste ist, den Inhalt in verschiedenen Sprachen zu verwalten. Ich habe selbst einige Web-Sites entwickelt und die Verwaltung der Inhalte in verschiedenen Sprachen ist die größte Herausforderung.
Ich verwende die Datenbank zum Speichern der Ressourcen / Inhalte. Es gibt mir die Flexibilität, jede gewünschte Sprachunterstützung hinzuzufügen. Ich habe die Logik implementiert, auf die englische Sprache zurückzugreifen, wenn eine Ressource in einer bestimmten Sprache nicht gefunden wird.
Sie können später einen Übersetzer verwenden, um den englischen Wert in eine beliebige Sprache zu konvertieren.
quelle
Zusammenfassung der bei der Internationalisierung zu berücksichtigenden Punkte:
Alle Informationen sollten internationalisiert werden. Beachten Sie, dass die Grafiken möglicherweise Informationen enthalten, die wir internationalisieren möchten.
Die Größe der Felder oder Zeichenfolgen hängt von der Sprache ab, da dies zu Problemen führen kann.
Die Reihenfolge der Wörter hängt von der Sprache ab, in der wir uns befinden. Daher ist die Reihenfolge in einer Sprache in einer anderen gleich.
Wir müssen berücksichtigen, dass sich das Datumsformat von einer Sprache in eine andere ändert
quelle
Machen Sie den Türkei-Test :
Wenn Ihre Site / Ihr Programm mit einem türkischen Client gut läuft, können Sie sicher sein, dass es auf den meisten anderen Plattformen läuft.
quelle