5 Stimmen

Ersetzungen für gettext

Wir verwenden gettext für Übersetzungen in unserem Produkt, haben aber viele Probleme damit gehabt:

  • Eine Sprache kann nur verwendet werden, wenn das System sie unterstützt.

Wenn wir unter Solaris 9 Sparc die Umgebung auf verschiedene englische Sprachumgebungen zurücksetzen, wird die Meldung trotzdem nicht übersetzt, wenn der Rechner nicht über die entsprechende Sprachumgebung verfügt. Die Übersetzungsdatei ist vorhanden, aber wir können nicht auf sie zugreifen.

  • Nutzt die Umgebung, um die Sprache zu erarbeiten

Dies führt zu Problemen bei Servern, die Nachrichten in verschiedene Sprachen übersetzen wollen. Theoretisch könnte dies ein völlig thread-sicherer, parallelisierbarer Vorgang sein - aber gettext bedeutet, dass wir eine globale Sperre für die Übersetzung haben müssen.

  • Standardsprache kann nicht eingestellt werden

Damit meine ich nicht den Text im Code. Wir verwenden MsgIDs im Code. Ich möchte also eine Ausweichübersetzung angeben können, die verwendet wird, wenn die aktuelle Umgebungssprache nicht verfügbar ist. Aber gettext lässt das nicht zu - ich muss es erst versuchen und dann die Umgebung zurücksetzen, bevor es eine andere Übersetzung anzeigt. (Die Verwendung von MsgIDs war nicht meine Wahl - ich wollte den gettext-Standards folgen und Englisch als IDs verwenden, aber ich wurde überstimmt, und es wäre eine Menge Arbeit, das jetzt zu ändern)

  • Die Kodierung, die zurückgegeben wird, variiert zwischen UTF-8 und der aktuellen lokalen Kodierung.

Ich meine nicht die .po-Dateien - die sind alle in UTF-8 (ärgerlich, dass msgfmt nicht mit BOM umgehen kann, aber egal). Ich meine die Ausgabe von gettext, ngettext usw., die unter AIX und HPUX in UTF-8 sind (unabhängig von der lokalen/Terminal-Kodierung), aber unter Solaris/Linux/FreeBSD in lokaler Kodierung, obwohl das vielleicht an iconv-Problemen liegt?

Auf jeden Fall wäre es schön, keinen speziellen Code für verschiedene Plattformen haben zu müssen - ich werde nachforschen müssen, ob ich eine bind_textdomain_codeset(domain,codepage); um gegen dieses Problem anzugehen.


Kennt jemand eine Open-Source-Übersetzungsbibliothek, die eine nützlichere Schnittstelle bietet?

5voto

Éric Malenfant Punkte 13670

Wir verwenden ICU-Ressourcenbündel und sind ziemlich zufrieden damit. Die ICU-Schnittstelle ist nicht "modern", aber sie ist leistungsfähig, die zugrunde liegenden Prinzipien sind solide, und die Ressourcenpaketierung (mit dem genrb-Tool) ist ziemlich flexibel. Seine Nachrichtenformatierung Fähigkeiten sind ebenfalls gut.

Zu Ihren spezifischen Bemerkungen:

Eine Sprache kann nur verwendet werden, wenn das System sie unterstützt.

Das verstehe ich nicht. Das mag daran liegen, dass die einzige "Erfahrung", die ich mit gettext habe, darin besteht, seine Dokumentation zu lesen.

Nutzt die Umgebung, um die Sprache zu erarbeiten

Die ICU-Schnittstelle nimmt eine Schauplatz als Eingabe, so dass Sie die vollständige Kontrolle haben. Es hat auch ein Konzept der "Standard-Locale", wenn es für Sie bequemer ist.

Standardsprache kann nicht eingestellt werden

Die Intensivstation hat ein ausgeklügeltes Ausweichmechanismus mit einem "Standard"-Bündel

Die Kodierung, die zurückgegeben wird, variiert zwischen UTF-8 und der aktuellen lokalen Kodierung.

Zeichenfolge ResourceBundle s (andere Datentypen sind ebenfalls möglich) werden immer als UnicodeString die intern in UTF-16 kodiert ist. UTF-32 mit UnicodeString ist ziemlich einfach, da seine Schnittstelle mehrere Methoden zur Manipulation auf Codepoint-Ebene bereitstellt. Für andere Kodierungen, Code-Umwandlung ist möglich.

4voto

Artyom Punkte 29856

1. Eine Sprache kann nur verwendet werden, wenn das System sie unterstützt.

Falsch. Sie können die Sprache manuell angeben. Umgebungsvariable LANGUAGE verwenden

int main()
{
      setlocale(LC_ALL,"");
      setenv("LANGUAGE","foo");
}

Das funktioniert auch, wenn das Gebietsschema nicht existiert (haben Sie schon einmal die Sprache foo gesehen?)

2. Nutzt die Umgebung, um die Sprache zu erarbeiten

Wo ist das Problem? Dies gibt dem Benutzer mehr Kontrolle.

3. Kann keine Standardsprache einstellen

Falsch, siehe oben.

4. Die Kodierung, die zurückgegeben wird, variiert zwischen UTF-8 und der aktuellen lokalen Kodierung.

Falsch, siehe bind_textdomain_codeset(domain,codepage);

Meine klare Empfehlung: Bleiben Sie bei gettext. Es ist eines der am meisten unterstützten und besten Tools überhaupt. Übersetzer werden dankbar sein, ein normales und nützliches Tool zu verwenden.

Es gibt noch einen weiteren wichtigen Punkt: die großartige Unterstützung von Pluralformen, die in nicht-gettextbasierten Tools ziemlich schlecht unterstützt wird.


Es gibt nur 1 Einschränkung von gettext - Sie können nicht mehr als eine Sprache pro Prozess verwenden. Es ist nicht thread-sicher, die Sprache zu wechseln. Glücklicherweise sprechen die meisten Programme, die mit Menschen zu tun haben, in einer Sprache.

Dies kann nur für Dienste mit mehreren Threads eine Einschränkung darstellen.

EDIT: Aber auch das ist nicht ein echtes Problem . Ich hatte einmal eine thread-sichere gettext-Version für mein Projekt implementiert. Siehe http://art-blog.no-ip.info/cppcms/blog/post/16 auf der Grundlage mo Dateien lesen.

1voto

Steven R. Loomis Punkte 4580

Sie können ICU-Ressourcenbündel für die Übersetzung auch in das und aus dem XML-basierten XLIFF-Format konvertieren.

0voto

Die Sprachumschaltung im Google Chrome-Browser ist sehr gut gelöst. Es ist möglich, zwischen den Sprachen zu wechseln, während das Programm läuft. Ich weiß nicht, welches System sie verwenden, aber es könnte eine Untersuchung wert sein, da es sich um einen Open-Source-Browser handelt.

0voto

Lars D Punkte 8302

Eine Sprache kann nur verwendet werden, wenn das System sie unterstützt.

Das hat nichts mit GNU gettext zu tun - denn das übernimmt nur den Übersetzungsteil. Aber es stimmt, wenn das System nicht in der Lage ist, chinesische Schriftzeichen anzuzeigen, dann wird es Probleme mit China geben.

Nutzt die Umgebung, um die Sprache zu erarbeiten

Das ist eine gute Wahl, aber Sie können die Sprache jederzeit selbst einstellen und die Umgebung außer Kraft setzen. Auf diese Weise können Sie jede beliebige Sprache verwenden, je nach Ihrer Wahl.

Standardsprache kann nicht eingestellt werden

Das ist falsch - die Standardsprache ist immer die eingebaute Sprache, und wenn Sie eine andere Sprache haben möchten, wechseln Sie einfach zu dieser Sprache. Es kann einfach nicht einfacher sein als eine Zeile Code.

Die Kodierung, die zurückgegeben wird, variiert zwischen UTF-8 und der aktuellen lokalen Kodierung.

Wenn Sie in der Lage sind, ein Internationalisierungswerkzeug zu wählen, dann können Sie auch wählen, welche Zeichenkodierung Sie für Ihre Texte verwenden möchten. Einige Projekte verwenden utf-8 für alle Sprachen (meine Präferenz), andere verwenden die Locale-Kodierung.

Kennt jemand eine Open-Source-Übersetzungsbibliothek, die eine nützlichere Schnittstelle bietet?

Nein, sorry - ich sehe kein Problem mit GNU gettext :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X