Erstellen einer String-Übersetzungsdatenbank für mehrere (interne) Projekte


9

In unserem Unternehmen haben wir eine vorhandene MS-SQL-Übersetzungstabelle, in der folgende Zeichenfolgen gespeichert sind:

Id |     Key     | Language | Value 
 1 | hello-world |  nl-BE   | Hallo Wereld
 2 | hello-world |  en-GB   | Hello World

Es gibt 3 Sprachen im System und ich gehe davon aus, dass dies in Zukunft auf maximal 10 Sprachen anwachsen wird

Diese Tabelle wird von mehreren sehr unterschiedlichen Projekten gelesen (etwa 60 Projekte, hauptsächlich Websites / Webanwendungen und einige Webdienste), die jeweils eine Datenbankverbindung zur Übersetzungsdatenbank öffnen und die Übersetzungen zwischenspeichern

Das Feedback der Front-End-Entwickler lautet, dass unsere Benutzeroberfläche zum Eingeben oder Ändern von Übersetzungen den größten Nachteil hat, dass sie nicht wissen können, welches Projekt welche Zeichenfolgen verwendet.

Manchmal ändern sie Zeichenfolgen, ohne zu wissen, dass sie damit 7 Projekte brechen.

Jetzt müssen sie nur noch so etwas eingeben this.Translate("Hello World")und das System kümmert sich um den Rest.

Ich könnte sie natürlich zu so etwas zwingen, this.Translate("Hello World","AwesomeApplication1")aber das scheint ziemlich viel Umgestaltung in den vielen, vielen Projekten zu erfordern.

Wie würden Sie diese Lösung bereitstellen? Wie würden Sie als Entwickler den "Projektnamen" für die Übersetzung angeben? Wie würden Sie dies in der Datenbank speichern?

Wichtiger Hinweis: Die Wiederverwendung von Übersetzungen ist der springende Punkt der zentralisierten Datenbank

1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1
5|hello-world|nl-BE|Hallo Wereld!|MyAwesomeApplicatoin2

ist nicht wirklich eine erwünschte Option.

Ich würde so etwas bevorzugen wie:

1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1,MyAwesomeApplicatoin2

oder ein Fremdschlüsseläquivalent zum einfachen Einfügen der Namen in die Tabelle.

AKTUALISIEREN

Aufgrund des Ratschlags zur Normalisierung der Datenbank habe ich mir bisher Folgendes ausgedacht:

//this allows me to distinquish if translations where added by developer or by translator

UPDATE2: edmx anstelle von Text hinzugefügt. Wenn Leute interessiert sind, könnte ich das WCF-Projekt unterbinden, in das ich dieses Konzept einpacke, damit andere Leute es testen und verwenden können.


Ty zur Normalisierung. stimmte q und a. Ich glaube, ein Spring Java Github würde helfen.
Tgkprog

Antworten:


5

Vorbemerkung Nr. 1: Sie sagen uns nicht, wie die Übersetzungen im Moment gepflegt werden

Vorbemerkung Nr. 2: Ihre Datenbank ist nicht normalisiert. Unabhängig von der Lösung, die Sie wählen, normalisieren Sie zuerst Ihre Datenbank . Sie haben später schreckliche Wartungsprobleme, wenn Sie dies jetzt nicht tun

Das würde ich tun.

  1. Schreiben Sie Ihren Übersetzungsaufruf so um, dass er eine Programm-ID zurück zum Server überträgt

  2. Der Back-End-Übersetzer fügt die Zeichenfolge in die Datenbanktabelle ein, falls sie noch nicht vorhanden ist, und markiert sie mit der Programm-ID

  3. Wenn die Zeichenfolge bereits vorhanden ist, wird sie nur aktualisiert, wenn die Programm-ID mit der ursprünglichen Programm-ID übereinstimmt, mit der die Zeichenfolge erstellt wurde. Wenn nicht, geben Sie eine Konfliktbenachrichtigung zurück.

Variationen:

  • Sie können anstelle einer Programm-ID eine Entwickler-ID / Übersetzer-ID verwenden. Ich halte das für besser, weil es Leute gibt, die eine Fremdsprache beherrschen, und solche, die glauben, sie zu kennen. Nur die erste Gruppe hat Änderungsrechte.

  • Möglicherweise möchten Sie die IDs aller Programme speichern, die die Zeichenfolge in der Datenbank verwenden, damit Sie wissen, welche Programme in Konflikt stehen.

  • Sie könnten dieses "Eigentums" -Denken auf jede einzelne Sprache ausweiten: Eine Person kann Englisch, die andere Niederländisch.

  • Sobald Ihre Datenbank normalisiert ist, fügen Sie Build-Komplexität wie "Programm A ist in den Sprachen 1,2,3; B ist in 3 und 5" hinzu.

Ich schlage außerdem vor, dass Sie ein separates Programm zur Pflege von Übersetzungen schreiben, das Ihnen fehlende Übersetzungen usw. anzeigt. Ich habe dies einmal mit 2-stufiger Berechtigung durchgeführt: Jede Übersetzung muss von einer zweiten Person (normalerweise einem Muttersprachler) überprüft werden.


1
Ich habe meine Frage basierend auf Ihren Ideen aktualisiert
Mvision

5

Da sie auf ein 'this' verweisen ... können Sie 'this' den Projektnamen einmal zuweisen (z. B. über den Konstruktor), und die Schnittstelle zu den Übersetzungsfunktionen würde sich für die Codierer nicht ändern. Unter der Haube wird lediglich der Projektname zur Datenbankabfrage hinzugefügt. Alternativ können Sie "dies" bereitstellen, um den Projektnamen selbst zu kennen. Es wird wirklich davon abhängen, wie Sie Ihre Klassen strukturiert haben.

Für die Speicherung können Sie Folgendes tun:

1 ! hello-world ! nl-EN ! Hello World  ! *
2 ! hello-world ! nl-EN ! Howdy, World ! CowboyApp
3 ! hello-world ! nl-EN ! Arrgh        ! PirateApp

Verwenden Sie einen Platzhalter, um eine allgemeine Übersetzung auf alle Apps anzuwenden, jedoch den spezifischen App-Namen, wenn Sie eine Übersetzung für eine bestimmte App überschreiben möchten. Dadurch werden die Duplikate auf ein Minimum reduziert.

Um zu sehen, welches Programm welche Übersetzungen verwendet, wissen Sie dies jetzt. Wenn Sie diese Informationen nicht manuell abrufen möchten, können Sie die Übersetzungsanforderungen protokollieren.


Die Idee, es in die 'this'-Klasse zu verschieben, scheint mir gut zu sein. Ich denke, ich werde den Projektnamen in die Datei web / app.config verschieben und von dort aus lesen. Denken Sie, dass die Idee mit Platzhaltern / Projektnamen auf etwa 4000 Übersetzungen skalierbar ist?
Mvision

3
Als Erweiterung könnte der Datenbank oder der DBAL ein Trigger hinzugefügt werden, der die Spalte "Abonnierte Programme" aktualisiert, wenn ein übersetztes Wort gelesen wird.

Wie konnte der Datenbank-Trigger jemals den Projektnamen kennen? (Wir verwenden Entity Framework 4)
Mvision

@Mvision Ich verstehe nicht, warum nicht - Volumen sollte kein großes Problem sein. Wenn viele der app-spezifischen Übersetzungen einfach den App-Namen einfügen, können Sie Konstanten verwenden, um auch Dups zu reduzieren.
Großmeister

nvm habe ich falsch verstanden. Ja, ein Auslöser könnte es tun und würde die Dinge beschleunigen, verglichen mit dem Überprüfen und Aktualisieren dieses
Materials

1

Wenn alle Ihre Projekte in C # geschrieben sind und alle Übersetzeraufrufe so aussehen

this.Translate("hello-world")

Wenn "Hallo-Welt" der Schlüssel in Ihrer Übersetzungstabelle ist, sollte es nicht zu schwierig sein, einen kleinen Quellcode-Scanner mit regulären Ausdrücken zu schreiben, um alle Übersetzeraufrufe zu finden und den Schlüsselwörtern die entsprechenden Projektnamen zuzuweisen. Auf diese Weise müssen Sie keine Ihrer vorhandenen Code- oder Übersetzerschnittstellen ändern.

Abhängig von der tatsächlichen Struktur Ihres Programms kann es alternativ einfacher sein, diese Informationen aus dem IL-Code Ihrer Assemblys zu extrahieren. Ich habe vor einiger Zeit etwas sehr Ähnliches gemacht, auch zu Übersetzungszwecken, und diesen Beispielcode verwendet , um Assemblys zu analysieren.


Ich mochte diese Art von Lösung. Es würde jedoch erfordern, dass alle 60 Projekte (einige nicht einmal meine) vollständig getestet werden, bevor mit diesem neuen System die Produktion aufgenommen wird. Die vorgeschlagene Lösung, um den Projektnamen in den aufrufenden Code zu verschieben, funktioniert einwandfrei und verursacht viel weniger Ärger, trotzdem danke!
Mvision

1
@ Vision: Ich denke das Gegenteil ist der Fall. Wenn Sie den Projektnamen für die Übersetzungen zur Laufzeit festlegen, müssen Sie sicherstellen, dass jede Webseite mit jeder Übersetzung für alle Ihre 60 Projekte einmal aufgerufen werden muss, um sicherzustellen, dass Sie alle protokolliert haben. Durch statisches Scannen der Quelle oder der Assemblys erhalten Sie jedoch eine vollständige Liste, ohne dass Tests erforderlich sind oder das gesamte System ausgeführt wird.
Doc Brown
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.