Moderne Übersetzungsbibliotheken?



  • Eine Übersetzung kann unterschiedlich sein je nachdem was eingesetzt wird. Sogar im Englischen schon.

    "This is a {0}"
    Wenn {0} "file" oder "folder" ist passt das, aber wenn es "enumeration" sein kann, dann ist das "a" falsch.

    Das ist nur ein kleines deutliches Beispiel. Das es extremer ist in viele anderen Sprachen kann sich jeder denken.
    Wir haben viel mit solchen Übersetzungsqualitäten zu kämpfen, vor allem wo bei uns so gut wie alles Automatisiert abläuft und wir aus Kostengründen aus ein translation memory vor übersetzen.

    Um die Qualität zu erhöhen und Fehler vor zu beugen haben wir Regeln aufgestellt wie Strings definiert werden müssen. Das Dokument umfasst mehrere Seiten.

    (Als Übersetzer haben wir mehrere LSPs unter Vertrag.)



  • Also ich hab auch noch ein wenig recherchiert, aber ausser GNU gettext scheint es nichts zu geben als Alternative, das wirklich frei verfügbar ist.
    Stichwörter für google waren:
    gettext replacement c++
    translation library c++
    modern translation c++

    Die Ergebnisse waren sehr unbefriedigend :D.
    Nicht dass mir gettext nicht gefällt, im Gegenteil.
    Ich bin nur erstaunt darüber, wie wenig es dazu gibt.

    Warum ich das mache?
    Nunja, ich hab darüber nachgedacht, was ich in meine Library dafür einbaue.
    Und wird wohl mein eigener gettext-reader sein, weil gettext selber mit meiner zLib Lizenz kollidiert.

    Vielleicht mal noch auf Stackoverflow nen thread aufmachen :D.



  • Wir haben alle Texte übersetzen lassen, und zwar mitsamt den Formatzeichen (%s, %d, ...) und die kommen in ein Textfile. Wird zu Programmstart dann in eine Hashtabelle geladen.
    Alle Strings im Programm werden mit der Übersetzungsfunktion geklammert, und für die statischen Texte auf den Formularen haben wir eine Komponente, welche auf die gleiche Hashtabelle zugreift.

    Die Übersetzung ist auf diese Weise absolut problemlos über die Bühne gegangen.
    Klar gibts dann noch eine Überarbeitung, da es an ein paar Stellen zu komischen Satz Kontrukten kam. Aber das empfand ich als absolut leichtesten Teil der Internationalisierung.
    Viel schwieriger waren da schon irgendwelche komischen Codepage Konvertierungen zwischen unzähligen Systemen die da dran hängen... Datenbank, mobile Geräte, Schnittstellen zu anderen Programmen über Textfiles, ... das ist der wahre Krampf beim Übersetzen.



  • Glutamat schrieb:

    Wir haben alle Texte übersetzen lassen, und zwar mitsamt den Formatzeichen (%s, %d, ...) und die kommen in ein Textfile. Wird zu Programmstart dann in eine Hashtabelle geladen.

    Wenn man alles selber macht, klappt sowas auch wunderbar - aber aus eigener Erfahrung kann ich dir sagen, daß man da besser keinen Außenstehenden dranlassen sollte 😃
    Ich hab' für eine Anwendung die deutschen Texte zusammengestellt, stellenweise auch mit Formatzeichen, die übrigen Sprachen hat sich der Auftraggeber von anderen geholt. Und hinterher kamen dann die Beschwerden ala "Warum wird bei der Fehlermeldung in Russisch nicht das Plandatum genannt?" - der Übersetzer hatte die Formatkennungen unter den Tisch fallen lassen.



  • hustbaer schrieb:

    In anderen Projekten werden zwei verschiedene Strings gemacht, mit unterschiedlicher ID. "YouHavePurchased1Item" und "YouHavePurchasedNItems". (Die Unterscheidung muss dabei das aufrufende Programm machen)
    Wenn zwei oder mehr Zahlen im gleichen Satz vorkommen, müssten wir entsprechend 2^N Varianten machen.

    Wenn ich das richtige sehe, verbaust du dir aber damit komplett die Möglichkeit, in Sprachen wie die polnische zu lokalisieren. Da bekommen "1 Objekt", "2 Objekte" und "5 Objekte" jeweils unterschiedliche Deklinationen, nicht nur "Objekt" und "Objekte" wie im Deutschen.

    Bei Sprachen ohne Singular/Plural geht es zwar, aber da hat der Übersetzer bei euch dann mehr Arbeit, weil er jeden Satz zwei Mal unter unterschiedlichen IDs einfügen muss.

    Gerade das mit den vielen polnischen Pluralformen habe ich schon selbst erlebt. Daher meine Frage zu Singular/Plural. Die Annahme, dass es nur die zwei Formen Singular/Plural gibt, ist eben auch sehr deutsch- oder englisch-zentriert.



  • Kann mir vorstellen das Thai, Griechisch usw auch diese Probleme haben können. Es gibt viele Sprachen und viele grammatikalische Unterschiede.

    (Wir übersetzen in 29 Sprachen, English USA zählt als eigenständige Sprache und das Originale ist das "Entwickler Englisch" welches beim Kunden nie angezeigt wird.)



  • Wir machen es per IDs ala IDS_MSG_QUERYSTOPPROGRESS mit %s als Textersatz, direkt in sprintf rein 😕 was ziemlich umstaendlich ist. Fuer die Uebersetzung ists dafuer recht leicht... Ist von 1994 die Codebasis...

    Was mich aber wirklich interessiert ist eine Loesung fuer das Mehrzahl-Problem. Wenn ein Text von 2 Variablen abhaengt und diese je Einzahl/Mehrzahl haben, dann fuehrt das zu enormen Problemen. Gibt es da vielleicht irgendein System dass einen guten Ansatz fuer das Problem hat?



  • Christoph schrieb:

    Da bekommen "1 Objekt", "2 Objekte" und "5 Objekte" jeweils unterschiedliche Deklinationen, nicht nur "Objekt" und "Objekte" wie im Deutschen.

    Wobei es ja durchaus Szenarien gibt, wo eine fehlerhafte Übersetzung wie "1 Dateien ausgewählt" noch OK ist. Das ist halt leicht unschön aber nicht immer ein kritischer Defekt. Und vermutlich oft besser, als gar keine Übersetzung in diese Sprache anzubieten.



  • Christoph schrieb:

    hustbaer schrieb:

    In anderen Projekten werden zwei verschiedene Strings gemacht, mit unterschiedlicher ID. "YouHavePurchased1Item" und "YouHavePurchasedNItems". (Die Unterscheidung muss dabei das aufrufende Programm machen)
    Wenn zwei oder mehr Zahlen im gleichen Satz vorkommen, müssten wir entsprechend 2^N Varianten machen.

    Wenn ich das richtige sehe, verbaust du dir aber damit komplett die Möglichkeit, in Sprachen wie die polnische zu lokalisieren. Da bekommen "1 Objekt", "2 Objekte" und "5 Objekte" jeweils unterschiedliche Deklinationen, nicht nur "Objekt" und "Objekte" wie im Deutschen.

    Ja, das siehst du richtig.

    Bei Sprachen ohne Singular/Plural geht es zwar, aber da hat der Übersetzer bei euch dann mehr Arbeit, weil er jeden Satz zwei Mal unter unterschiedlichen IDs einfügen muss.

    Gerade das mit den vielen polnischen Pluralformen habe ich schon selbst erlebt. Daher meine Frage zu Singular/Plural. Die Annahme, dass es nur die zwei Formen Singular/Plural gibt, ist eben auch sehr deutsch- oder englisch-zentriert.

    Aber wie macht man es sonst?
    Dann muss der Übersetzer ja pro ID mehrere Texte eintragen können, und diese mit bestimmten Bedingungen verknüpfen ...?

    Also sowas wie

    <translation id="foo" condition="foo == 1 && bar == 1">blah {foo} blah {bar}...</translation>
    <translation id="foo" condition="foo == 1 && bar > 1 && bar < 5">blah {foo} blah {bar}...</translation>
    <translation id="foo" condition="foo == 1 && bar >= 5">blah {foo} blah {bar}...</translation>
    <translation id="foo" condition="foo > 1 && foo < 5 && bar == 1">blah {foo} blah {bar}...</translation>
    ...
    <!-- fallback -->
    <translation id="foo">blah {foo} blah {bar}...</translation>
    

    Bei der (schlechten) Qualität unserer Übersetzungen frage ich mich wirklich, ob die Übersetzer damit nicht hoffnungslos überfordert wären.
    Mit einem grafischen Editor für die Bedingungen ginge es VIELLEICHT noch.
    Wobei es sicher auch bessere Übersetzungbüros gibt.

    Gibt es für so ein System (das mehrere Übersetzungen pro ID erlaubt) irgendeinen Standard (oder mehrere)?



  • hustbaer schrieb:

    Christoph schrieb:

    Gerade das mit den vielen polnischen Pluralformen habe ich schon selbst erlebt. Daher meine Frage zu Singular/Plural. Die Annahme, dass es nur die zwei Formen Singular/Plural gibt, ist eben auch sehr deutsch- oder englisch-zentriert.

    Aber wie macht man es sonst?
    Dann muss der Übersetzer ja pro ID mehrere Texte eintragen können, und diese mit bestimmten Bedingungen verknüpfen ...?
    [...]
    Gibt es für so ein System (das mehrere Übersetzungen pro ID erlaubt) irgendeinen Standard (oder mehrere)?

    Ich kenn nur gettext. Dort funktioniert das so, dass die Datei mit den übersetzten Strings, d.h. die po-Datei, selber definieren kann wie die Plural-Formen selektiert werden.

    In der po-Datei steht dann ganz oben zum Beispiel sowas, wenn es um polnisch geht:

    "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
    

    Diesen Ausdruck muss der Übersetzer aber nicht selber erfinden. Für praktisch jede Sprache kann man die passende Zeile einfach aus einer Liste kopieren.

    Eine übersetzte Nachricht in der po-Datei sieht dann so aus:

    msgid "%d stroke."
    msgid_plural "%d strokes."
    msgstr[0] "%d kreska."
    msgstr[1] "%d kreski."
    msgstr[2] "%d kresek."
    

    Im Programm-Code kann man dann ngettext("%d stroke.", "%d strokes.", number_of_strokes) aufrufen, um den übersetzten Text zu bekommen. Abhängig von number_of_strokes wird jeweils die passende Pluralform aus den 3 möglichen Formen ausgewählt. Die zwei message-ids sind notwendig, damit in der C-locale, in der Übersetzungen ignoriert werden, auch irgendwas sinnvolles herauskommt.

    gettext kann normalerweise aus dem Quelltext ein Template für die po-Dateien erzeugen, das ist dann eine pot-Datei. Da steht dann sowas drin:

    msgid "%d stroke."
    msgid_plural "%d strokes."
    msgstr[0] ""
    msgstr[1] ""
    

    Damit kann der Übersetzer schwer übersehen, dass an der Stelle Pluralformen benötigt werden. Für polnisch muss er aber eben wissen, dass er msgstr[2] manuell hinzufügen muss.

    Dieses Verfahren von gettext funktioniert aber halt gar nicht mehr, wenn man mehr als ein Objekt korrekt zählen möchte im String.

    edit: Was noch dazukommt ist, dass "0" im Deutschen als Plural zählt und nicht als Singular. Man sagt "0 Dateien" und nicht "0 Datei". In anderen Sprachen wird "0" als Singular gezählt, d.h. genauso wie "1". Das passiert auch in Sprachen, die nur Singular/Plural unterscheiden. Das heißt selbst wenn es nur die beiden Formen Singular/Plural gibt, ist eine Unterscheidung der Art if(n == 1) singular(); else plural(); nicht richtig.

    edit2: Die Doku von gettext hat einen guten Artikel über das Thema, mit vielen Beispielen:
    http://www.gnu.org/s/hello/manual/gettext/Plural-forms.html


Anmelden zum Antworten