Moderne Übersetzungsbibliotheken?



  • Christoph schrieb:

    hustbaer schrieb:

    Scorcher24 schrieb:

    I
    Was benutzt ihr denn so?
    Eigene Implementationen?

    Eine SQLite Datenbank.

    Wie löst du damit das Problem der Pluralformen?

    Manche Sprachen haben ja mehr Pluralformen als die deutsche Sprache, deswegen reicht eine Unterscheidung zwischen "Singular" und "Plural" nicht aus.

    Macht ihr das so ähnliche wie gettext, dass einer String-ID mehrere Varianten zugeordnet werden können, und die Lokalisierung selbst die richtige Variante abhängig von einer Variablen ermittelt (also nicht der Code des Programms versucht Singular/Plural zu unterscheiden)?
    Was passiert, wenn mehr als eine Zahl im String korrekt gezählt werden soll (das ist mit gettext nämlich nicht unbedingt so einfach)?

    Wir lösen das, indem wir ganze Format-Strings lokalisieren. Kommt eine Zahl darin vor, wird bei den meisten Projekten die "Ding(e)" Form gewählt. Finde ich ziemlich schäbig, aber naja. 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. Ist mir aber bisher noch nicht passiert - dazu sind die Texte in unseren Programmen zu einfach.

    Käme das öfter vor, müsste man sich dazu was schlaues überlegen.

    Wobei man dann schnell ein Problem mit den Übersetzern bekommt. Die nämlich - nach meiner Erfahrung - ziemliche DAUs sind. Die schaffen es z.T. nichtmal ein Excel File auszufüllen ohne es dabei kaputt zu machen, oder die Hinweise/Kommentare zu lesen die beim Text dabeistehen.

    Vielleicht gibt es spezialisierte Firmen, die entsprechend geschultes Personal für Übersetzungen verwenden, aber die Erfahrungen die ich bisher mit Übersetzern hatte waren nicht sehr gut.



  • Ethon schrieb:

    Wie wäre es einfach mit sscanf und entsprechend angepassten Formatstrings? 😉

    Für Übersetzungen sind Formatstrings in der Regel meist unbrauchbar, da der Satzaufbau sich in den verschiedenen Sprachen teilweise gravierend unterscheidet, und ein Wort in einer Sprache teilweise 2 Worte an unterschiedlichen Stellen in einer anderen Sprachen darstellt (Ich habe einmal Beispiele zu solchen Problemsätzen gesehen, ich glaube es war eine Gegenüberstellung von Deutsch und Französisch).



  • 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