2013-01-22 16 views
5

Per un sistema embedded con GUI, stiamo usando il nostro sistema di traduzione personalizzato. Le stringhe sono memorizzate nel codice ROM di un microcontrollore.Gettext senza un filesystem

Attualmente abbiamo fino a 10 lingue e circa 400 stringhe tradotte (varia a seconda della variante del prodotto).

Il nostro sistema attuale è piuttosto ingombrante e credo che gettext sarebbe una soluzione migliore.

Per quanto ho capito gettext, richiede l'utilizzo di bindtextdomain per impostare la directory contenente i file di traduzione compilati (* .mo).

C'è un modo per leggere la traduzione dalla memoria? Vorrei inserire i file * .mo compilati nel binario e impostare gettext per usarli. In alternativa, i dati di traduzione verrebbero archiviati in una EEPROM di dati senza un filesystem.

Oppure si può consigliare un sistema di traduzione diverso da utilizzare in un sistema di microcontrollori (16 o 32 bit, da 256 a 512 kbyte ROM) con un'interfaccia C?

Edit: Devo aggiungere che essere in grado di gestire le traduzioni oltre al firmware del microcontrollore sarebbe un motivo per passare a gettext. I dati di traduzione appropriati verrebbero caricati dall'utente con un software di configurazione che già forniamo con i nostri sistemi.

+2

Forse gettext sarebbe eccessivo nel tuo caso? Forse farai qualcosa come [questo] (http://code.google.com/p/bta-meteo-logger/source/browse/C/daemon/lang.h)? –

+0

È possibile configurare un disco RAM sopra l'I/O file binario o falso. –

risposta

3

Questo è quello che vorrei fare: includerei il ".mo" binario in variabili costanti nel codice. Puoi scrivere un semplice convertitore da binario in un array di caratteri e avere il file ".mo" compilato all'interno del tuo programma. Avresti una serie di dati di file ".mo", ognuno con una lingua diversa.

Vorrei modificare libintl codice sorgente per accedere a uno di quegli array. Controlla il file loadmsgcat.c, la funzione _nl_load_domain. Vedi lì come cerca di usare mmap() (quindi è pronto per avere tutto in memoria). Basta aggiungere un codice per decidere quale elemento della matrice ".mo" utilizzare in base alla lingua richiesta.

Non ho provato questo, ma questo è quello che vorrei provare data la vostra situazione. Non sembra troppo difficile.