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
Für die HilfeID seh ich grade kein Bedarf: ID | Sprache | Text | Hilfe
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
nur der Vollstaendigkeithalber sollte noch GNU_gettext erwaehnt werden https://de.wikipedia.org/wiki/GNU_gettext
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
:
Bearbeitet durch User
@ 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.aspx http://www.linuxjournal.com/article/6176 https://docs.oracle.com/javase/tutorial/i18n/
:
Bearbeitet durch User
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.html http://doc.qt.io/qt-5/i18n-plural-rules.html https://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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.