Tada-aa!
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…):
Beh, io ho concluso, contento e soddisfatto di aver vinto anche questa scommessa: PAGARE! 😀
Risorse
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? 😀
Magari! Così mi rinfreschi la memoria! 😀
grazie mille!
questo tutorial mi è stato molto utile 😀
tutorial molto chiaro e semplice
🙂