====== Introduzione a Gettex in C ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **// 29/04/2023 - 12:01 //** // // [[https://www.gnu.org/software/gettext/|GNU Gettex]] è un sistema di localizzazione dei messaggi contenuti nei nostri programmi. L'utilizzo di base è semplice, qui lo vedremo in azione con un helloworld scritto in C. Link utili: [[http://fedoraproject.org/wiki/How_to_do_I18N_through_gettext|How_to_do_I18N_through_gettext]] ===== Il codice ===== #include //per gettex #include //per gettex #include #define _(String) gettext (String) //per gettex int main() { setlocale(LC_ALL,""); bindtextdomain("helloworld","/usr/share/locale"); textdomain("helloworld"); printf(_("Hello World\n")); //notare usiamo _("mia stringa") sulla printf return 0; } **Dove helloworld è il nome del file .mo senza l'estenzione (helloworld.mo).** Il suddetto file helloworld.mo sara' in questo caso contennuto dentro la cartella **/usr/share/locale/it_IT/LC_MESSAGES/** specificata nella funzione //bindtextdomain//. Procediamo adesso nell'estrarre tutte le stringhe nel mio codice che necessitano di essere tradotte(in questo caso 1). Creiamo una cartella di nome "po" ,metteremo lì la nostra traduzione . xgettext -d helloworld -o po/helloworld.pot -k_ -s helloworld.c bene abbiamo creato il nostro template con le stringhe da tradurre , prese grazie alla macro ''_()'' sul codice. Eccolo qui: # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-21 12:35+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: helloworld.c:15 #, c-format msgid "Hello World\n" msgstr "Ciao Mondo\n" Editiamo secondo le nostre esigenze. Io ho tradotto la stringa "Hello World" e aggiunto il supporto al set di caratteri con la codifica UTF-8. Dunque adesso creiamo la cartella "it" e copiamo il nostro file .pot lì ma con estenzione .po: cp helloworld.pot it/helloworld.po **oppure** possiamo generare il file .po anche tramite il seguente comando **(entrambi i modi per generare il file .po sono corretti)**. msginit -l it_IT -o helloworld.po -i helloworld.pot A questo punto generiamo finalmente il file **mo** con dentro la traduzione pronta all'uso e copiamolo nella giusta posizione: msgfmt helloworld.po -o helloworld.mo cp helloworld.mo /usr/share/locale/it/LC_MESSAGES/ Notare che copiamo il file dentro la cartella it. \\ \\ Compiliamo il sorgente: gcc -o helloworld helloworld.c Adesso eseguendo il programma dovrebbe visualizzarsi la traduzione. Per fare degli esperimenti potremmo provare a cambiare la lingua della sessione del terminale per visualizzare i cambiamenti nella traduzione. Avendo soltato installata la traduzione italiana non appena cambiamo la lingua si dovrebbe visualizzare la stringa di default che nel nostro caso è "Hello world". Per esempio : export LANGUAGE=fr_FR.UTF-8 ./hello world