Document Actions

Internazionalizzazione con i18ndude
medio

Questa guida mostra come utilizzare il tool i18ndude per generare e gestire automaticamente i file po utilizzati per i'internazionalizzazione.

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
by Davide Moro last modified 2008-12-04 10:44
 

Supporto

Qualcosa non è chiaro?
Chiedi!

Ottieni velocemente un
aiuto mirato, gratis!

help

 

Segui le icone

 

Livelli di difficoltà

livello avanzato Solo configuratori e sviluppatori
livello medio Per chi ha già familiarità
livello base Per tutti!

 

I video

video

Il documento è supportato da un video!