Internazionalizzazione con i18ndude
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
Come prerequisito naturalmente abbiamo 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
e cambiamo coerentemente la variabile DOMAIN, mettendo per esempio il nome del proprio progetto. E'importante rendere eseguibile lo script con un:
$ 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) ed 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 è quindi 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 ""
...
ed 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