2013-01-22 7 views
5

Für ein eingebettetes System mit GUI verwenden wir unser benutzerdefiniertes Übersetzungssystem. Die Strings werden im Code-ROM eines Mikrocontrollers gespeichert.Gettext ohne Dateisystem

Derzeit haben wir bis zu 10 Sprachen und etwa 400 übersetzte Strings (variiert je nach Produktvariante).

Unser aktuelles System ist ziemlich umständlich und ich glaube, dass Gettext eine bessere Lösung wäre.

Soweit ich verstehe gettext, erfordert es die Verwendung von bindtextdomain, um das Verzeichnis, das die kompilierten Übersetzungsdateien (* .mo) enthält.

Gibt es eine Möglichkeit, stattdessen die Übersetzung aus dem Speicher zu lesen? Das heißt, ich möchte die kompilierten * .mo-Dateien in die Binärdatei einschließen und gettext einrichten, um diese zu verwenden. Alternativ würden die Übersetzungsdaten in einem Daten-EEPROM ohne Dateisystem gespeichert werden.

Oder können Sie ein anderes Übersetzungssystem für den Einsatz in einem Mikrocontroller-System (16 oder 32 Bit, 256 bis 512 KByte ROM) mit einer C-Schnittstelle empfehlen?

Edit: Ich sollte hinzufügen, dass in der Lage, Übersetzungen abgesehen von der Firmware des Mikrocontrollers zu pflegen wäre ein Grund, um zu Gettext wechseln. Die entsprechenden Übersetzungsdaten würden vom Benutzer mit einer Konfigurationssoftware geladen, die wir bereits mit unseren Systemen liefern.

+2

Vielleicht wäre gettext in Ihrem Fall übertrieben? Vielleicht machst du etwas wie [dies] (http://code.google.com/p/bta-meteo-logger/source/browse/C/daemon/lang.h)? –

+0

Sie könnten entweder eine RAM-Disk oberhalb der binären oder falschen Datei-E/A einrichten. –

Antwort

3

Dies ist, was ich tun würde: Ich würde die binäre ". Mo" in konstanten Variablen in den Code aufnehmen. Sie können einen einfachen Konvertierer von einem Binär- in ein Char-Array schreiben und diese ".mo" -Datei in Ihrem Programm kompilieren lassen. Sie hätten ein Array von ".mo" -Dateidaten, jede mit einer anderen Sprache.

Ich würde den libintl-Quellcode modifizieren, um auf eines dieser Arrays zuzugreifen. Überprüfen Sie die Datei loadmsgcat.c, die Funktion _nl_load_domain. Siehe dort, wie es versucht, mmap() zu verwenden (so ist es bereit, alles im Speicher zu haben). Fügen Sie einfach einen Code hinzu, um zu entscheiden, welches Element Ihres Arrays ".mo" basierend auf der gewünschten Sprache verwendet werden soll.

Ich habe das nicht versucht, aber das ist, was ich versuchen würde angesichts Ihrer Situation. Es sieht nicht so schwer aus.