====== 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