Forum: PC-Programmierung Mehrsprachige Textverwaltung


von Chris (Gast)


Lesenswert?

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

von Georg (Gast)


Lesenswert?

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

von Pit (Gast)


Lesenswert?

Für die HilfeID seh ich grade kein Bedarf:

ID | Sprache | Text | Hilfe

von Chris (Gast)


Lesenswert?

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?

von Georg (Gast)


Lesenswert?

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

von Chris (Gast)


Lesenswert?

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?

von Georg (Gast)


Lesenswert?

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

von Eric B. (beric)


Lesenswert?

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

von Georg (Gast)


Lesenswert?

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

von Chris (Gast)


Lesenswert?

@ Georg
Wie würdest du mit deinem Ansatz das mit der Hilfe lösen?

von Georg (Gast)


Lesenswert?

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

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

nur der Vollstaendigkeithalber sollte noch GNU_gettext erwaehnt werden
https://de.wikipedia.org/wiki/GNU_gettext

von Vlad T. (vlad_tepesch)


Lesenswert?

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
von Chris (Gast)


Lesenswert?

@  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?

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

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
von physiker (Gast)


Lesenswert?

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 ;)

von Chris (Gast)


Lesenswert?

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?

von Georg (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.