Internazionalizzazione con i18ndude
medio
Scopo
Questa guida vuole introdurre il tool i18ndude.
Con questo strumento sarà possibile generare automaticamente e gestire i file po utilizzati in Plone per internazionalizzarne l'interfaccia.
i18ndude ora riesce ad elaborare:
- page template;
- file ZCML;
- moduli Python.
Mostreremo quindi come automatizzare completamente la creazione di questi file po.
Prerequisiti
Il prerequisito fondamentale, ovviamente, è avere i18ndude. Installarlo è tanto facile quanto digitare:
# easy_install i18ndude
Passo passo
Supponiamo di aver sviluppato un package per Plone e di volerlo internazionalizzare.
NB: ho detto package e non prodotto, quindi niente più cartelle i18n!
Script creazione automatica
Mettiamo nella "root" del nostro package (per root intendo redomino.contact/redomino/contact, ovvero da dove parte il codice scritto da noi) un file chiamato i18n.sh contenente il seguente codice:
#!/bin/sh
DOMAIN='redomino.contact'
i18ndude rebuild-pot --pot locales/${DOMAIN}.pot --create ${DOMAIN} .
i18ndude sync --pot locales/${DOMAIN}.pot locales/*/LC_MESSAGES/${DOMAIN}.po
# Compile po files
for lang in $(find locales -mindepth 1 -maxdepth 1 -type d); do
if test -d $lang/LC_MESSAGES; then
msgfmt -o $lang/LC_MESSAGES/${DOMAIN}.mo $lang/LC_MESSAGES/${DOMAIN}.po
fi
done
Cambiamo quindi coerentemente la variabile DOMAIN, mettendo per esempio il nome del proprio progetto. E'importante rendere eseguibile lo script con:
$ chmod u+x i18n.sh
Creazione struttura file po
Creiamo una cartella chiamata locales avente la seguente struttura, sempre in redomino.contact/redomino/contact:
locales/ |-- de | `-- LC_MESSAGES | `-- redomino.contact.po |-- en | `-- LC_MESSAGES | `-- redomino.contact.po `-- fr `-- LC_MESSAGES `-- redomino.contact.po
Dentro locales bisogna creare tante cartelle quante sono le lingue da gestire (in questo caso tedesco, inglese e francese), e all'interno di ogni cartella LC_MESSAGES un file, anche vuoto, chiamato con il dominio da tradurre (qui redomino.contact).
Modifica configure.zcml
Modifica il configure.zcml in redomino.contact/redomino/contact in modo tale da registrare la cartella locales aggiungendo le parti evidenziate in grassetto:
<configure xmlns="http://namespaces.zope.org/zope" xmlns:five="http://namespaces.zope.org/five" xmlns:genericsetup="http://namespaces.zope.org/genericsetup" xmlns:i18n="http://namespaces.zope.org/i18n" i18n_domain="redomino.contact"> <five:registerPackage package="." initialize=".initialize" /> <i18n:registerTranslations directory="locales" /> ....
Lancio dello script
A questo punto siamo pronti per procedere.
Lanciamo lo script i18n.sh nel seguente modo:
redomino.contact$ ./i18ns.sh
e vediamo cosa succede.
Il risultato è il seguente, all'interno della cartella locales:
locales/ |-- de | `-- LC_MESSAGES | |-- redomino.contact.mo | `-- redomino.contact.po |-- en | `-- LC_MESSAGES | |-- redomino.contact.mo | `-- redomino.contact.po |-- fr | `-- LC_MESSAGES | |-- redomino.contact.mo | `-- redomino.contact.po `-- redomino.contact.pot
Lo script basato su i18ndude analizza tutte le page template trovate, file ZCML e moduli Python alla ricerca di elementi da tradurre. Crea, se non esiste già, e aggiorna un file redomino.contact.pot contenente tutte le voci da tradurre; inoltre sincronizza tutti i vari file po delle varie lingue con il pot (quindi non sovrascrive ogni volta i file ma effettua un merging ogni volta). Inoltre, essendo un package e non un prodotto, compila i file po generati creando dei file con estensione *.mo.
Non rimane altro che assegnare le traduzioni manualmente alle singole voci, ma il grosso del lavoro è fatto!
Ecco per esempio il contenuto di locales/en/LC_MESSAGES/redomino.contact.po appena generato:
# --- PLEASE EDIT THE LINES BELOW CORRECTLY --- # SOME DESCRIPTIVE TITLE. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2008-09-22 12:11+0000\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" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" "Language-Code: en\n" "Language-Name: English\n" "Preferred-Encodings: utf-8 latin1\n" "Domain: DOMAIN\n" #. Default: "Form contatti" #: ./browser/form.py:115 msgid "contact_form_name" msgstr "" ...
Per editarlo impostanto il dominio corretto, la lingua e le traduzioni delle etichette:
# --- PLEASE EDIT THE LINES BELOW CORRECTLY --- # SOME DESCRIPTIVE TITLE. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2008-09-22 12:11+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n" "Last-Translator: Davide Moro <davide.moro@redomino.com>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" "Language-Code: en\n" "Language-Name: English\n" "Preferred-Encodings: utf-8 latin1\n" "Domain: redomino.contact\n" #. Default: "Form contatti" #: ./browser/form.py:115 msgid "contact_form_name" msgstr "Contact form" ...
Ulteriori lanci di i18n.sh non solo non sovrascrivono gli elementi editati a mano, ma permettono di rimanere costantemente aggiornati nel caso venissero aggiunti in futuro altri elementi privi di traduzione nel codice Python o nei template. Tutte le versioni rimarranno sempre sincronizzate con il file pot principale!
Ulteriori informazioni
Versione testate:
- i18ndude 3.0b4

i18ndude
Prerequisiti
Il prerequisito fondamentale, ovviamente, è avere i18ndude. Installarlo è tanto facile quanto digitare:
# easy_install i18ndude
======
purtroppo non è ne facile ne indicato, infatti si rischia di scaricare mezzo zope nel proprio python di sistema e far danni, arrivando a un punto morto perché le dipendenze non sono ovviamente soddisfatte e quindi non si ottiene nulla :)