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.
Antworten:
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.
Schreiben Sie Ihren Übersetzungsaufruf so um, dass er eine Programm-ID zurück zum Server überträgt
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
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.
quelle
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:
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.
quelle
Wenn alle Ihre Projekte in C # geschrieben sind und alle Übersetzeraufrufe so aussehen
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.
quelle