Barra laterale

programmazione:c:introduzione_a_gettex

Introduzione a Gettex in C

Autore: Fabio Di Matteo
Ultima revisione: 29/04/2023 - 12:01

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: How_to_do_I18N_through_gettext

Il codice

#include<libintl.h> //per gettex
#include<locale.h>	//per gettex
 
#include<stdio.h>
 
#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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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

programmazione/c/introduzione_a_gettex.txt · Ultima modifica: 29/04/2023 - 12:06 da Fabio Di Matteo