Was ist der beste Weg, I18N in Lookup-Tabellen zu behandeln?

8

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:

  • Fügen Sie für jede Sprache eine andere Nachschlagetabelle hinzu
  • Verwenden Sie eine einzige Nachschlagetabelle mit mehreren Einträgen für dasselbe Land, das entsprechend seiner Sprache gekennzeichnet ist.
  • Löschen Sie alle Nachschlagetabellen und führen Sie alle Suchvorgänge nach Programmcode durch
  • [Irgendeine andere Idee, an die ich nicht gedacht habe?]
Daniel Rikowski 01.09.2009, 18:23
quelle

6 Antworten

8

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.

    
ChssPly76 01.09.2009, 18:30
quelle
3

Disjoint Präsentation von der Programmierung. Verwenden Sie intern IDs für alles; Wenn Sie den Benutzern präsentieren, präsentieren Sie lokalisierte Daten.

    
Paul Sonier 01.09.2009 18:31
quelle
1

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

erstellt

Tabelle 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.

    
Zoidberg 01.09.2009 18:33
quelle
1

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:

  • 1) Verwenden Sie für jede übersetzbare Spalte und jede Sprache zusätzliche Spalten: title_en, title_fr, title_de, content_en, content_fr, content_de, ...
  • 2) serialisieren mehrere Sprachen in einer Spalte.
    Zum Beispiel: title="| EN | Willkommen | FR | Bienvenue | DE | Willkommen"
    Ich mag das nicht besonders, aber was wirklich zählt Hier ist, ob es sich gut in eine bestehende Umgebung integriert, was der Fall war.
  • 3) Manchmal muss die Verbindung zwischen denselben Inhalten in verschiedenen Sprachen nicht streng sein. Ich denke, es ist der Fall der Artikel in Wikipedia - Übersetzungen sind nur Hyperlinks, die von den Autoren manuell gesetzt werden. Als Folge sind diese Links von der Software weniger ausnutzbar, aber was hier zählt, kann durch einen Benutzer durchsucht werden.
vincent 01.09.2009 22:06
quelle
1

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.

    
Robert Rossney 01.09.2009 22:40
quelle
0

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.

    
fbrereto 01.09.2009 19:17
quelle