Hallo,
ich bin noch recht neu in der Welt der Datenbanken und bräuchte ein
wenig Hilfe.
Ich möchte Texte in verschiedenen Sprachen verwalten. Dazu gibt es in
manchen Fällen auch noch Hilfen zu den Texten, welche ebenfalls
sprachabhängig sind. Weiters können die Texte auch noch Platzhalter
enthalten, welche wenn möglich auch über die Datenbank befüllt werden
sollen -> auch sprachabhängig.
Mir geht's in erster Linie mal um die möglichen Strukturen der DB.
Wäre da schon echt dankbar für ein bisschen Hilfe. Mein Ansatz wäre der
folgende:
SprachID | Sprache
------------------
1 | DE
2 | EN
HilfeID | SprachID | Hilfetext
-------------------------------------
1 | 1 | HilfeBeispielText
TextID | SprachID | HilfeID | Text | Hilfetext
-------------------------------------------------------------
456 | 1 | 1 | Beispieltext | HilfeBeispielText
Wie ich mit Platzhaltern umgehen soll weiß ich noch gar nicht...
Bin ich mit dem ganzen Aufbau am richtigen Weg oder führt das so zu
nichts?
Mit besten Grüßen
Chris
Chris schrieb:> Bin ich mit dem ganzen Aufbau am richtigen Weg oder führt das so zu> nichts?
Das mit der SprachID ist ok, aber besser wäre es eine verständliche
Bezeichnung wie DE, EN, FR usw. zu nehmen. Viel krasser ist das bei der
HilfsID, denn wenn in deinen Texten bezug genommen wird auf 1,2,3 wird
das extrem unübersichtlich und fehleranfällig, auch da sollte etwas
verständliches gewählt werden.
Ich habe das mal bei mehrsprachiger Software so gelöst, dass der
Schlüssel der Standardtext war, egal ob deutsch oder englisch, je
nachdem wie man bevorzugt arbeitet, und unter diesem Schlüssel waren in
der Datenbank Übersetzungen in Französisch, Spanisch, Russisch usw.
enthalten. Grosser Vorteil: ich konnte die gesamte Datenbank an ein
Übersetzungsbüro geben mit der Aufgabe, überall eine zusätzliche Sprache
einzufügen.
Beim Compilieren ersetzt dann ein Präprozessor automatisch alle Texte
durch die einer gewählten Sprache.
Georg
Gut, dass heißt also die HilfeID kann komplett wegfallen, da der
Hilfe-Text seine Dazugehörigkeit durch die Sprache findet.
Das mit der Standartsprache ist auch eine gute Idee. Das heißt der
Aufbau ähnlich wie oben nur das der Text mit als Schlüssel gilt oder?
Etwa so:
SprachID | Text | Hilfetext
-------------------------------------------------------------
DE | Beispieltext | HilfeBeispielText
^^^^^^^^^^^^^^^^^^^^^^^^^^
Schlüssel
Somit müsste auch nicht jeder Text eine eindeutige ID bekommen da der
Schlüssel zusammengesetzt ist und im Zusammenhang mit der Sprache
eindeutig wird.
Hast du dann jede weitere Sprache in eine extra Tabelle gegeben oder
eine für alle?
Ich denke eine extra Tabelle ist besser aufgrund von Erweiterungen usw.
aber was meint ihr?
Und wie soll ich mit Platzhaltern in Texten umgehen?
Chris schrieb:> Hast du dann jede weitere Sprache in eine extra Tabelle gegeben oder> eine für alle?
Alles zusammen - sonst wäre das Outsourcing an ein professionelles
Übersetzungsbüro nicht möglich gewesen. Ich habe dazu ein Textformat
benutzt, damit kann jeder ohne Zusatzsoftware umgehen, und den Inhalt
nach Änderungen mit einem eigenen Programm indiziert (nach G). Beispiel:
1
{%G ' Soll / Ist d Soll / Ist L'}
2
{%% ml 78}
3
{%F ' cons./ act.d cons./ act.L'}
4
{%I ' nom. / att.d nom. / att.L'}
5
{%E ' nom. / act.d nom. / act.L'}
6
{%S ' Boer / Aer d Boer / aer L'}
7
{%R ' æßã./ óßéñ.ã æßã./ óßéñ.ãê'}
8
9
{%G ' Soll / Ist Radius Soll / Ist Breite '}
10
{%% ml 78}
11
{%F ' cons./ act. rayon cons./ act.largeur'}
12
{%I ' nom. / att.raggio nom. / att.largh. '}
13
{%E ' nom. / act.radius nom. / act. width '}
14
{%S ' Boer / Aer radie boer / aer bredd '}
15
{%R ' æßã./óßéñ. ïßãçòð æßã./óßéñ. ÷çïçìß '}
16
17
{%G ' Sollwerte X Sollwerte Y'}
18
{%% ml 78}
19
{%F ' val.cons. X val.cons. Y'}
20
{%I ' valo. nom. X valo.nom. Y'}
21
{%E ' nom.values X nom.values Y'}
22
{%S' Boervaerd. X Boervaerd. Y'}
23
{%R ' æßã.æìßö. Ô æßã.æìßö. Y'}
wie man hier Russisch schreibt weiss ich jetzt nicht, ist auch nicht so
wichtig.
Georg
Das sieht auf den ersten Blick ja ganz gut aus, aber hast du so nicht
einen riesen Aufwand wenn dann mal eine Sprache dazu kommt?
Das müsste man dann für Hilfe zu Texten und "Platzhalter" auch extra
machen oder?
Chris schrieb:> hast du so nicht> einen riesen Aufwand wenn dann mal eine Sprache dazu kommt?
Wieso? Für Ukrainisch fügt das Übersetzungsbüro überall einen Eintrag
mit %U dazu und schickt die Textdatei zurück.
Ein Problem sind eher Software-Änderungen und Erweiterungen, da muss ich
halt das Ganze wieder zum Übersetzen geben - aber nur, wenn eine
Maschine z.B. nach Russland verkauft wird. Ein Fallback ist natürlich
nötig: z.B. wird Englisch verwendet, wenn kein russischer Eintrag
gefunden wird, und ist kein Englisch da (kommt nicht vor, weil ich das
selber eintrage), dann Deutsch.
Georg
Georg schrieb:> Für Ukrainisch fügt das Übersetzungsbüro überall einen Eintrag> mit %U dazu und schickt die Textdatei zurück.
Und wenn dann noch %U-ngarisch als Sprache dazu kommt? Oder %E-spanol
(%S-panisch), %P-ortugisisch, %P-olnisch und %P-akistani?
Das Büro würde ich eher eine Excel-Tabelle schicken...
Eric B. schrieb:> Und wenn dann noch %U-ngarisch als Sprache dazu kommt?
Ist es völlig ausserhalb deiner Vorstellungskraft, auch 2 Buchstaben zu
verwenden? Oder 3? Und glaubst du, dann müsste man die Software von
Grund auf umschreiben? Has du überhaupt schon mal IRGENDWAS
programmiert?
Einfach nur lächerlich.
Georg
Chris schrieb:> Wie würdest du mit deinem Ansatz das mit der Hilfe lösen?
Was ich mache ist Strings austauschen, genau gesagt String Konstanten.
Wozu die dienen ist egal, ich habe das für die Texte auf Bildschirm oder
Drucker benutzt. Das funktioniert für alles, was sich als 'xyz'
schreiben lässt (oder meinetwegen auch als "xyz", wenn man etwa Basic
mag). Mein Präprozessor tauscht die Stringkonstanten vor dem Compilieren
aus, da steht also nacher statt < printf ("Eingabe drücken") > eben <
printf ("Press Enter") >, der Compiler weiss davon garnichts. Es ist
auch egal, wenn daraus statt eines Programms eine Hilfe erzeugt wird,
ich weiss ja nicht was genau du unter Hilfe verstehst. Für ganze
HTML-Seiten war das nicht konzipiert (die gabs damals noch garnicht).
Das war auch nicht dafür vorgesehen, mehrere Sprachen zur Laufzeit
auswählen zu können. Die Datenbank müsste man dazu wahrscheinlich nicht
ändern, nur die Art und Weise wie sie in die Software übernommen wird.
Dann fügt der Präprozessor nicht nur eine, sondern alle Varianten ein,
oder man benutzt die Datenbank direkt im Programm.
Der Vollständigkeit halber: es gibt auch einige Open-Source-Programme
zur Lokalisierung.
Im übrigen kann man natürlich auch eine SQL-Datenbank benutzen, es ist
dann bloss nicht so einfach externe Übersetzer zu beschäftigen. Die
Textdatenbank für eine Werkzeugmaschine ins Internet zu stellen finde
ich keine so gute Idee.
Georg
Chris schrieb:> SprachID | Sprache> ------------------> 1 | DE> 2 | EN>> HilfeID | SprachID | Hilfetext> -------------------------------------> 1 | 1 | HilfeBeispielText>> TextID | SprachID | HilfeID | Text | Hilfetext> -------------------------------------------------------------> 456 | 1 | 1 | Beispieltext | HilfeBeispielText
das pass mit dem Hilfetext nicht, der hat nix an den texten verloren,
wenn es eine 1-n-Beziehung ist.
Ids, die Referenzen auf andere Tabellen sind, würde ich mit FK
kennzeichnen sind
SprachID | Sprache
------------------
1 | DE
2 | EN
HilfeID | TextFK | SprachFK | Hilfetext
----------------------------------------------
1 | 456 | 1 | HilfeBeispielText
2 | 456 | 2 | HelpExampleText
TextID | SprachFK | Text
----------------------------------
456 | 1 | Beispieltext
man könnte auch überlegen, ob texte und hilfetexte denn überhaupt so
unterschiedlich sind, oder ob man nicht beide in eine Tabelle packt.
Dann kann man auch Baumstrukturen erzeugen.
Optional könnte man noch eine Typ-Spalte erzeugen
SprachID | Sprache
------------------
1 | DE
2 | EN
TextID | SprachFK | RefTextFK | Text
-------------------------------------------------
456 | 1 | NULL | Beispieltext
1 | 1 | 456 | HilfeBeispielText
2 | 2 | 456 | HelpExampleText
@ Vlad Tepesch:
Das sind echt super Tipps!
Und das Problem mit Platzhaltern könnte man doch auch einfach mit der
Typ-Spalte lösen oder?
Man könnte dann einfach den "Platzhalter" an einer bestimmten Position
einsetzen lassen oder?
Ehrlich? Warum selber machen? Neu ist das Problem nicht und fast jede
Plattform hat dafür bereits eine etablierte Lösung. Such mal für deine
Plattform nach den Stichworten "internationalization" und
"localization". Die Begriffe werden auch gerne zu I18N und L10N
abgekürzt.
Mit "internationalization" bezeichnet man übrigens das Vorbereiten einer
Software für mehrere Sprachen, mit "localization" die eigentliche
Anpassung an eine bestimmte Sprache oder einen Satz von Sprachen, also
das Übersetzen.
Da es hier das Forum PC-Programmierung ist:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd318661%28v=vs.85%29.aspxhttp://www.linuxjournal.com/article/6176https://docs.oracle.com/javase/tutorial/i18n/
Hannes J. schrieb:> Ehrlich? Warum selber machen? Neu ist das Problem nicht und fast jede> Plattform hat dafür bereits eine etablierte Lösung. Such mal für deine> Plattform nach den Stichworten "internationalization" und> "localization". Die Begriffe werden auch gerne zu I18N und L10N> abgekürzt.
Dem würde ich mich auch anschliessen: Warum das Rad neu erfinden? Und
trivial ist die Aufgabe auch nicht. Es fängt mit sowas wie Datum,
Uhrzeit, Währung an, geht über Pluralformen hin zu völlig
unterschiedlichen Satzstrukturen in denen (übertrieben gesagt) alles von
allem abhängen kann. Interessant sind z.B. folgende Texte:
http://doc.qt.io/qt-5/internationalization.htmlhttp://doc.qt.io/qt-5/i18n-plural-rules.htmlhttps://news.ycombinator.com/item?id=8890935
Das geht hin bis zu semantischen Darstellungen:
http://www.grammaticalframework.org/
Aber für Perfektion bräuchte man vermutlich starke KI ;)
Mein Problem ist, die Software existiert bereits großteils.
Auch die Texte existieren teilweise bereits übersetzt.
Ist es da nicht am einfachsten das mit einer relationalen DB zu
verwalten, ohne gleich die ganze Software ändern zu müssen?
Chris schrieb:> ohne gleich die ganze Software ändern zu müssen?
Was hilft dir das? Die ganze Sprachverwaltung ist doch nur sinnvoll,
wenn im Build-Prozess die richtigen Texte vollautomatisch ausgewählt
werden. Dazu brauche ich nicht mal einen Mausklick, es steht im
Makefile, dass vor dem Kompilieren aus dem mit deutschen Texten
geschriebenen Programm eines mit französischen oder was auch immer
Texten erzeugt wird.
Wie du diesen automatischen Austausch organisieren willst, ohne an
vorhandener Software etwas zu ändern, möchte ich sehen.
Das Prinzip ist bei Softwarenetwicklung und auch sonst allgemeingültig:
man steckt einmal Arbeit rein, damit man sich in Zukunft nicht mehr
darum kümmern muss. Beim 3. oder 4. Übersetzungslauf hat sich das schon
gelohnt.
Georg