Gettext-Unterstützung in OCaml

9

Ich möchte, dass i18n in meinem OCaml-Code funktioniert (Textnachrichten werden in die bevorzugte Sprache des Benutzers übersetzt). Die meisten übersetzbaren Strings sind das erste nicht markierte Argument für eine kleine Gruppe von Funktionen. z.B.

  • Textausgabe: print "Feed '%s':" new_feed
  • Fehler: raise_safe "Local feed file '%s' does not exist" path
  • Protokollierung: log_warning ~ex "Error checking signature for %s" feed

Im GUI-Code sollten auch Strings in ~label arguments extrahiert werden.

Gibt es eine Möglichkeit, diese Strings automatisch zu extrahieren? Um die Dinge interessanter zu machen, verwende ich auch einige Syntax-Erweiterungen (z. B. Lwt).

Ich sehe, es gibt ein ocaml-gettext-Paket, aber:

  • Es scheint nur einen festen Satz von Funktionen zu unterstützen ( f_ , s_ , usw.).
  • OPAM sagt nichts verwendet es .
  • Es konnte nicht installiert werden (musste $NAME zuerst deaktiviert werden), dann konnte auch die Deinstallation nicht durchgeführt werden, was auch darauf hindeutet, dass es nicht stark genutzt wird.

Was benutzen die Leute eigentlich / empfehlen sie?

    
Thomas Leonard 04.10.2014, 10:58
quelle

1 Antwort

2

Dies ist ein Problem, das ich in meinem Benzin Projekt, einem Anwendungs-Toolkit, angehen möchte.

Eine Antwort aus der Zukunft

In den Beispielen gibt es ein überentwickeltes Wordcount -Programm. das dient als Anwendungsfall für die Bibliothek. Die Funktion Component.Message.cannot_open verwendet ihre Format-Zeichenfolge als Schlüssel in einer internationalisierten Nachrichten-Datenbank:

%Vor%

Der sink ist ein globaler Status der Softwarekomponente, zu der er gehört. Er ist an eine Datenbank mit internationalisierten Nachrichten gebunden, in der eine Übersetzung nachgeschlagen und zur Vorbereitung der eigentlichen Nachricht verwendet wird.

Wie im Beispiel vorgeschlagen, unterstützt diese Funktion Formatierungsangaben, ähnlich wie printf , wir können beispielsweise ${FILENAME:+20s} schreiben.

Korrekturen für die Gegenwart

Derzeit ist keine tatsächliche Datenbanksuche implementiert. Die Funktion send ist im Funktor Generic_message.Sink.Make definiert, parametrisiert durch ein Modul Database . Die aktuelle Implementierung von wordcount verwendet die folgende Implementierung der Datenbank:

%Vor%

Es ist jedoch möglich, diese Definition durch eine tatsächliche Datenbanksuche zu ersetzen, die sich im Rückstand befindet.

Organisation von Nachrichten

Meiner Meinung nach sollte die Internationalisierung von Nachrichten durch Softwarekomponenten - die größte organisatorische Einheit unterhalb der gesamten Anwendung - erreicht werden, und Bibliotheken oder ähnliche Einrichtungen sollten standardmäßige konstante Sum-Typen verwenden, um Fehler zu melden.

    
quelle