Il giro del mondo in pochi minuti con PyGTK, Glade e gettext!

Tada-aa!

Un pitone multilingua

Ci credereste se vi dicessi che il pitone qui sopra sa parlare tutte le lingue del mondo? No? Se siete così sicuri delle vostre conoscenze fino a scommetterci sopra una somma più che discreta oppure se, con i miei precedenti articoli, sono riuscito a farvi innamorare di Python, allora non potete non leggere il resto!

Ricordo a tutti i miei lettori che questo, come tutti i miei articoli, è solo una piccola raccolta di miei appunti personali: appena terminata la lettura, se l’argomento stimola il vostro interesse, vi consiglio caldamente di approfondire i vari aspetti qui trattati nella documentazione del linguaggio.

Insomma, questa non è altro che una mini guida all’utilizzo di Python + GTK + Glade + gettext. Ed è proprio grazie a gettext che il mio amico della foto riesce ad esprimersi in qualsiasi lingua conosciuta (preparate i soldi…)!

Ma andiamo al sodo: abbiamo sviluppato un’applicazione in Python, abbiamo provveduto a costruire un’interfaccia con Glade e infine abbiamo bindato il tutto grazie a PyGTK, ora manca solo una cosa: internazionalizzarla. Come esempio pratico utilizzerò il mio autenticatore per GNOME.

Come prima cosa bisogna esportare le stringhe da mettere a disposizione del traduttore, ed è qui che viene in nostro aiuto xgettext. Questo simpatico comando consente di estrarre le stringhe da file sorgenti e supporta innumerevoli linguaggi di programmazione (C/C++, Python, Java, PHP e Glade formano solo una piccola selezione di essi), e senza neanche dover specificare in quale linguaggio sono scritti i nostri sorgenti: fa tutto da solo!

xgettext riconosce le stringhe presenti all’interno del codice e le raccoglie in un file .po, pronto per essere utilizzato come modello per le traduzioni, la sua sintassi è simile alla seguente:


xgettext modulo1.py modulo2.py interfaccia.glade > modello.pot

L’utility riconosce i linguaggi utilizzati nei singoli sorgenti e li esporta in un unico file, modello.pot, specificato alla fine della riga. Nota importante: gli elementi dell’interfaccia preparata con Glade devono essere impostati come «Translatable» all’interno del designer, altrimenti xgettext non esporterà nulla!

Una volta pronte le traduzioni andranno compilate, e qui posso consigliarvi un metodo piuttosto veloce, che consiste nell’utilizzare poEdit, il quale, oltre a salvare la traduzione nel formato .po la converte anche nel formato compilato .mo.

Finito? Mannò, dobbiamo ancora trovare il modo di caricare la traduzione del sistema a tempo di esecuzione!

Datemi il tempo di pensarci un po’ su… Trovato! 😀 Come al solito, i commenti sono embedded:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os, gtk, gtk.glade
import gettext, locale

# Questo attributo memorizza il percorso dei nostri file .mo,
# i quali dovranno essere organizzati in un percorso del tipo:
# po/LINGUA/LC_MESSAGGES
# Per quanto riguarda la traduzione italiana della mia
# applicazione, per esempio, ho salvato il file .mo in:
# po/it_IT/LC_MESSAGES
local_path = os.path.realpath(os.path.dirname(sys.argv[0])) + '/po'

# Configura la localizzazione per la categoria scelta: con LC_ALL
# le prendo tutte!  L'altro parametro lo lasciamo vuoto,
# in questo modo verrà caricata la lingua di sistema
locale.setlocale(locale.LC_ALL, '')

# Configura le traduzioni e le binda al codice
for module in gtk.glade, gettext:
        module.bindtextdomain('gtk-rm3wifi-authenticator', local_path)
        module.textdomain('gtk-rm3wifi-authenticator')

# Ridefinisce _, in questo modo si potranno importare le
# traduzioni con una sintassi più breve.
import __builtin__
__builtin__._ = gettext.gettext

######### ......

Ecco fatto! Per caricare le traduzioni in tempo reale, tutte le stringhe presenti nel codice andranno modificate come nel seguente esempio:

# prima...
stringa = 'Stringa di prova'
# dopo!
stringa = _('Stringa di prova')

# prima...
print 'Ciao %s' % utente
# dopo!
print _('Ciao %s') % utente

# prima...
amici = ['Gwaihir',
        'BugMaN',
        'l3on',
        'guglielf',
        'totopalma']
# dopo!
amici = [_('Gwaihir'),
        _('BugMaN'),
        _('l3on'),
        _('guglielf'),
        _('totopalma')]

Ecco uno screenshot della mia applicazione in lingua inglese (il titolo della finestra in realtà è Preferences, questa schermata risale a qualche giorno fa):

Ed eccola italianizzata (il titolo della finestra non si vede, ma è Preferenze…):

GTK Roma3 WiFi Authenticator in Italiano

Beh, io ho concluso, contento e soddisfatto di aver vinto anche questa scommessa: PAGARE! 😀

Risorse

Facebook Twitter Linkedin Plusone Pinterest Email

3 pensieri su “Il giro del mondo in pochi minuti con PyGTK, Glade e gettext!

  1. poEdit?!?! Ma per piacere! Che traduttore sei!?!?

    Emacs rulez!

    😀

    PS: ma se metto un sito porno come website per i commenti va bene lo stesso? 😀

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *