Was ist in einer mehrsprachigen Anwendung mit Nachschlagetabellen die beste Art, Übersetzungen zu verarbeiten?
Zum Beispiel sollte ein US-Nutzer für eine Länder-Nachschlagetabelle englische Ländernamen sehen, da ein Deutscher deutsche Namen sehen sollte. Aber ihre IDs sollten immer gleich sein.
Ich kann mir Folgendes vorstellen:
Die große Frage ist hier - können Übersetzungen von Endbenutzern verändert werden?
Wenn die Antwort "NEIN" lautet, sind Ressourcenbündel leichter und schneller zu verwenden als Tabellen. Anstelle des tatsächlichen Textes enthalten Ihre Tabellen den Ressourcenschlüssel (oder Sie könnten den Primärschlüssel für diesen Zweck verwenden, wenn dieser Text nicht numerisch ist) und das entsprechende Ressourcenbündel enthält die Übersetzung.
Wenn die Antwort "JA" ist, müssen Sie Übersetzungen in der Datenbank speichern. Ich habe jedoch herausgefunden, dass der einfachste Ansatz in diesem Szenario darin besteht, die obige Ressourcenbündelfunktionalität in der Datenbank nachzuahmen - z. eine einzelne Tabelle mit den Spalten "locale", "resource key" und "resource value" haben, die alle anderen Tabellen verwenden, um den tatsächlichen lokalisierten Text nachzuschlagen.
Disjoint Präsentation von der Programmierung. Verwenden Sie intern IDs für alles; Wenn Sie den Benutzern präsentieren, präsentieren Sie lokalisierte Daten.
Ich habe einmal eine mehrsprachige Anwendung gemacht. Alles musste mehrsprachig sein, einschließlich der eingegebenen Inhalte, und es musste auch einfach sein, eine Übersetzung zu diesem Inhalt zu erstellen.
Nun, wenn es nur für statischen Text am meisten empfohlen wird, empfehlen wir dazu, Ressourcen-XML-Dateien zu verwenden. Ich glaube, dies wird durch das .NET Framework sehr gut unterstützt.
Wenn es dynamisch sein muss, dann habe ich eine Tabellenstruktur von
erstelltTabelle ResourceStrings resourceId GUId PK cultureCode Zeichenfolge PK Text Zeichenfolge
Das hat mir erlaubt, auch den Kulturcode zu lesen. Wenn also jemand einen Kulturcode von en-us hätte, könnte ich eine Abfrage machen, wo ich
gemacht habe %Vor%Auf diese Weise würde der längste Kulturcode zuerst zurückkommen und der spezifischste sein. Jetzt würde ich das NUR empfehlen, wenn Sie Benutzern erlauben, Text einzugeben und es zu übersetzen. Ich brauchte das, weil der Inhalt mehrsprachig sein musste und die Anwendung selbst.
In meinem aktuellen Projekt (ein benutzerdefiniertes CMS in django geschrieben) basiert unsere Lösung für I18N-Modelle auf diesem Beispiel-Snippet: Ссылка , die ich erweitert habe, um besser in Templates verwendbar und in die Administrationsoberfläche integriert zu werden.
Grundsätzlich hat jede Art von Inhalt zwei Tabellen: eine mit den allgemeinen Feldern (wie die Kategorie der Artikel) und eine mit übersetzbarem Inhalt (Titel, Körper, Slug - eindeutiges Etikett, das in der URL verwendet wird - usw.). Offensichtlich gibt es eine Ony-to-Many-Beziehung zwischen dem gemeinsamen Modell und dem Übersetzungsmodell. Hier ist das Beispiel, das der Autor gibt:
%Vor%Ich denke, dass auf diese Weise das Datenbanklayout dem Konzept des Inhalts mit gemeinsamen Attributen und übersetzbaren Feldern sehr nahe kommt.
Aber dann ist der knifflige Teil, in Ihrem Code DRY zu bleiben, oder Sie werden jedes Mal, wenn Sie mit übersetzbarem Inhalt fertig werden müssen, mit einem Durcheinander von Textplatten enden. Glücklicherweise war Pythons Flexibilität eine große Hilfe.
Wenn Ihre Programmiersprache und Umgebung ähnliche Tricks nicht zulässt (wie dynamische Erstellung von Unterklassen, Pythons Metaklassen ) - irgendeine Art von Vererbung, etc.), ich denke, diese Art von Datenbank-Layout wird mehr ein Fluch als ein Segen sein.
Behalten Sie also das YAGNI-Prinzip im Hinterkopf. Wenn Sie Übersetzungen in Ihre Modelle mit weniger Komplikationen benötigen, habe ich andere effektive Möglichkeiten gesehen, die gut sind, solange Sie sich die begrenzte Flexibilität und die mangelnde konzeptionelle Integrität dieser Alternativen leisten können:
Hier ist eine Möglichkeit, dies auf Datenbankebene zu tun.
Als ich das tun musste, habe ich jede Codetabelle in zwei Tabellen aufgeteilt. Einer enthielt kulturinvariante Daten: die interne ID des Codes, den Code selbst, wenn der Code kulturinvariant war, und möglicherweise andere Spalten (wie das Sortieren / Gruppieren von Kategorien). Der andere enthielt kulturspezifische Daten: Beschreibungen, ggf. kulturspezifische Codes usw.
(Kulturspezifische Codes sind ein Hornissennest; kickt es nicht, wenn es nicht nötig ist. Es kann ein wenig schwierig sein, die Idee zu verstehen, dass US
und EU
gleich sind Code in verschiedenen Sprachen, aber es gibt Länder, in denen es politisch nicht schmackhaft sein kann, dass die französischsprachigen Benutzer US
als Abkürzung für États-Unis
verwenden. Nun, ein Land.)
Wenn Sie eine culture-invariante Codetabelle verwenden, können Sie Fremdschlüssel-Constraints zwischen ihr und Haupttabellen, die sie verwenden, einrichten. Das Erstellen kulturspezifischer Abfragen ist ziemlich einfach:
%Vor% Beachten Sie, dass Sie, wenn Ihre Codes kulturspezifisch sind, nicht einmal FooCodeData
in diese Abfrage einfügen müssen, indem Sie stattdessen s.Code
auswählen.
Beachten Sie auch eine inhärente Schwäche dieses Ansatzes, wie die LEFT JOIN
und ISNULL
in dieser Abfrage zeigen: Sie können keine Einschränkung erstellen, um sicherzustellen, dass für jede Code / Kultur-Kombination eine kulturspezifische Zeile existiert. Dafür steht LookupFailure
: Es wird die kulturspezifische Nachricht angezeigt, die angibt, dass der kulturspezifische Code-Datensatz für einen bestimmten Code nicht eingegeben wurde.
Sehen Sie sich die Adobe-Quellbibliotheken " xstring
Datenstrukturen und Algorithmen. Die Lokalisierung dort wird mit einer ID für die Zeichenkette sowie einem Kontext behandelt, der die Lokalisierung detailliert. Lokalisierungstabellen können in XML gespeichert werden und Zeichenfolgen werden zur Laufzeit basierend auf dem Laufzeitkontext (Sprache, Land, Plattform usw.) lokalisiert. Obwohl der Code selbst funktioniert, würde ich ihn nicht als Produktionsqualität betrachten. Trotzdem sind die Konzepte solide.
Tags und Links database-design internationalization