Skip to main content Help Control Panel

Login   A+   A-

Development «   Languages «   Localization support board «  

Création de fichier *.po avec outils xgettext (fichiers sources yacs) et tutoriaux d'utilisation

avatar
nuxwin
En directe de Caen
Bonjour à tous ;

Ce message s'adresse plus particulièrement à Bernard, auteur de la classe i18n intégrée au projet YACS.
Il y a quelque temps, je t'avais fais part d'un projet dans lequel je souhaitais intégrer ta classe i18n. Tu m'avais donné ton accord par retour courriel.

Ajourd'hui, dans la mesure ou je suis en pleine internationalisation, j'aurais besoin (je sais, je suis un peu fainiant) de connaître les arguements que tu passe à l'outil xgettext pour créer les fichiers *.po à partir des fichiers sources.

Plus particulièrement, j'aimerais si possible que tu m'indique le mot clé que tu utilise dans la mesure ou dans le code source *.php, l'identificateur n'est pas celui communement employé. Est-ce tout simplement un truc du genre --> -ks ?

Je sais que ma question peut paraître conne mais dans le code source, tu fais appel à différentes méthodes de la classe i18n selon qu'il s'agisse de pluriels ou non.

Ps : Si dans le fond de ton grenier ou encore, dans la cage de ton Amster, tu as rangé un petit script maison pour la création des fichiers *.po, je suis bien entendu preneur.

Merci d'avance pour les éclaircissement apportés.

Nuxwin Team

Files

Recipelevel php.zip 1,764 bytes, 89 downloads
Edited by Agnès on Dec. 22 2007
Zoom
unix_build_pot.pl 12,158 bytes, 179 downloads
Edited by Nuxwin on Nov. 4 2007
Zoom

Comments

Bernard
avatar
from nearby-an-airport
Associate
6555 posts
registered on Sep. 12 2003

on Oct. 29 2007


La commande utilisée est :

##xgettext *.php --output=i18n/templates/%MODULE%.pot --default-domain=%MODULE% --keyword=c --keyword=nc:1,2 --keyword=s --keyword=ns:1,2 --language=php ##

Le script qui permet d'extraire les chaînes en ligne de commande sous Windows est disponible dans l'archive de base de YACS, c'est le fichier tools/build_i18n.bat
Nuxwin
avatar
from Caen, devant mon bureau
Member
190 posts
registered on June 9 2006

on Oct. 29 2007


Bonjour ;

Je te remercie pour cette réponse rapide.

Je suis sous linux donc le .bat....

J'avais trouvé la marche à suivre sous poedit mais j'avais omis les arguements (1,2) pour les pluriels et du coup, j'arrivais pas à les extraire.

Encore merci.

Nuxwin Team
Bernard
avatar
from nearby-an-airport
Associate
6555 posts
registered on Sep. 12 2003

inspired from nuxwin on Oct. 29 2007


Nuxwin: Si tu prépares un script shell pour Linux, je connais quelques personnes que ceci pourrait intéresser. Merci d'avance...
Nuxwin
avatar
from Caen, devant mon bureau
Member
190 posts
registered on June 9 2006

inspired from Bernard on Oct. 30 2007


Bernard :

Bonjour ;

Je peux bien faire ça mais je pense que Perl offrerais plus de possibilitées (La vérité c'est que je n'aime pas l'approche bash ).

Pour exemple, je pourrais coder un programme qui opererait récursivement dans l'archive amont de yacs à la recherche de modules. Ce programme extrairait les chaînes, crérait les fichiers *.pot et *.po.

Le programme serait invoqué avec x arguements offrant ainsi plusieurs possibilitées à l'utilisateur.

Bien entendu, il faudrait aussi penser à gérer les exceptions au niveau des noms de certains *.pot qui diffèrent des fichiers sources.

Qu'en pense-tu ?

Si tu as une idée précise de ce que ce programme devrais pouvoir accomplir, n'hésite pas.

Edit : Dans un premier temps, je pense qu'on pourrait axer le codage sur ton .bat. Voici le genre de résultat que l'utilisateur pourrait obtenir en mode debug :

nuxwin@dev:~/Desktop/20071024-yacs-7-10beta24.tgz_FILES/tools$ ./build_pot.pl -v
DEBUG: push_el() sub_name: BuildAll(), msg: Starting...
DEBUG: push_el() sub_name: xgettext(), msg: Starting...
DEBUG: push_el() sub_name: sys_command(), msg: Starting...
DEBUG: push_el() sub_name: sys_command('xgettext *.php --output=i18n/templates/root.pot --default-domain=root --keyword=c --keyword=nc:1,2 --keyword=s --keyword=ns:1,2 --language=php'), msg: Ending...
DEBUG: push_el() sub_name: xgettext(), msg: Ending...
DEBUG: push_el() sub_name: BuildAll(), msg: Ending...
...


J'attends tes idées pour continuer.

Nuxwin Team
Bernard
avatar
from nearby-an-airport
Associate
6555 posts
registered on Sep. 12 2003

on Oct. 30 2007


Et bien, cela m'irait très bien, le propos étant d'avoir, pour les Unixiens, une solution complète d'extraction des chaînes de caractères et de fabrication des .pot et des .po de référence, équivalente à celle utilisée aujourd'hui sous Windows.

Donc une commande qui analyse l'ensemble des scripts et qui, module par module, recrée le contenu des répertoires i18n/templates et aussi i18n/locale/en et i18n/locale/fr.

Idéalement, une deuxième commande pourrait être fabriquée pour rafraichir les .po dans une autre langue. Merci par avance...
Nuxwin
avatar
from Caen, devant mon bureau
Member
190 posts
registered on June 9 2006

on Nov. 1 2007


Bernard :

Bonsoir ;

Je fais suite à notre discussion en te demandant si tu peux arranger ceci (je suis une vrai courge en anglais) :

$0 Ver $VERSION

This script generates all language files for YACS.
See http://www.yetanothercommunitysystem.com
for more information about YACS Project.

Usage: $0 [option] [option] [option]
example : $0 --buildall --locale=fr

-?, -h, --help display this helpscreen and exit

-b=#, --buildall build all language files (*.pot, *.po, *.mo)
Note : For *.po file, update if exist

-G=#, --Genpot=# Generates all *.pot files for one or more
specified modules
ex: --Genpot=actions for one module or
--Genpot=actions-categories for any modules
Note : with ( all ) argv, this option will be generate
*.pot files for all modules

-g=#, --genpo=# Generates all *.po files for one or more specified modules
ex: --genpo=actions (for one module) or
--genpo=actions-categories ( for more modules )
Note: The files *.pot must have been previously created.

-u=#, --updatepo=# Update all *.po files for one or more specified modules
ex : --updatepo=actions for one module or
--updatepo=actions-categories for more modules

-c=#, --compile Compile *.mo file for one or more specified modules
ex: --compile=root ( for one module ) or
--compile=root-actions ( for more modules )
Note: The files *.po must have been previously created.

-l=#, --locale=# build language files for specified locale(s)
ex : --locale=fr ( for one locale ) or
--locale=fr-es for more locales

-d, --debug enable debug mode

General Note : If the --locale option is not set, the default
language selected is English (en).

! ! ! Do not execute this script with mixed options :
(buildall, Genpot, genpo, updatepo, compile). ! ! !


D'avance merci.

Nuxwin Team
Bernard
avatar
from nearby-an-airport
Associate
6555 posts
registered on Sep. 12 2003

inspired from nuxwin on Nov. 1 2007


Pour information, courge se dit squash en anglais

$0 Ver $VERSION

This script generates all language files for YACS.
See http://www.yetanothercommunitysystem.com
for more information about the YACS Project.

Usage: $0 [option] [option] [option]
example: $0 --buildall --locale=fr

-?, -h, --help display this help screen and exit

-b=#, --buildall build all language files (*.pot, *.po, *.mo)
Note: also update *.po files if they exist

-G=#, --Genpot=# Generates all *.pot files for one or more
specified modules
ex: --Genpot=actions for one module or
--Genpot=actions-categories for any modules
Note: with ( all ) argv, this option will generate
*.pot files for all modules

-g=#, --genpo=# Generates all *.po files for specified modules
ex: --genpo=actions (for one module) or
--genpo=actions-categories ( for more modules )
Note: The *.pot files must exist.

-u=#, --updatepo=# Update all *.po files for specified modules
ex : --updatepo=actions for one module or
--updatepo=actions-categories for more modules

-c=#, --compile Compile *.mo file for specified modules
ex: --compile=root ( for one module ) or
--compile=root-actions ( for more modules )
Note: The *.po files must exist.

-l=#, --locale=# build language files for specified locale(s)
ex : --locale=fr ( for one locale ) or
--locale=fr-es for more locales

-d, --debug enable debug mode

General Note : If the --locale option is not set, the default
language selected is English (en).

! ! ! Do not execute this script with mixed options :
(buildall, Genpot, genpo, updatepo, compile). ! ! !


A faire tester et vérifier par NickR, à l'occasion, et un grand merci pour ce boulot. Tu vas faire des heureux chez les Linuxiens...
Nuxwin
avatar
from Caen, devant mon bureau
Member
190 posts
registered on June 9 2006

on Nov. 2 2007


Bonjour ;

Dans le cadre du développement du présent script, je suis entrain de mettre en place certaines règles au niveau du nom des locales que l'utilisateur peut passer à l'option --locale.

Je voulais donc savoir si on devais simplement autoriser la définition ISO 639 soit :

# Set Locales
our $LOCALES = [];

if($opt{locale} =~ /^[a-z]{2}$/) { # According RFC3066 - One locale

@$LOCALES = $opt{locale};

} elsif ($opt{locale} =~ /^[a-z]{2}(-[a-z]{2})*$/) { # According RFC3066 - More locales

@$LOCALES = split /-/, $opt{locale};

} else {
usage("Invalid --locale option");
}


Ou modifier ces règles de façon à accepter la définition ISO 3166-1.

Merci d'avance pour la réponse.

Ps : Merci pour la rectification du helper.

Nuxwin Team
Agnès
avatar
from le Grésivaudan (grenoble-chambéry)
Associate
2007 posts
registered on Feb. 13 2006

on Nov. 2 2007


Nuxwin : J'avoue que je ne comprends pas tout à votre discussion technique mais je peux t'assurer que je suis tout cela avec un grand intérêt. Je fais partie de ceux qui te remercieront bôôôôcoup de cette contribution chinese !
Bernard
avatar
from nearby-an-airport
Associate
6555 posts
registered on Sep. 12 2003

inspired from nuxwin on Nov. 4 2007


Nuxwin: Tu me poses une colle, mais on pourrait au mons démarrer avec la première spécification, qui est aussi un RFC comme signalé dans ton code, et puis voir venir ensuite non ?
Nuxwin
avatar
from Caen, devant mon bureau
Member
190 posts
registered on June 9 2006

inspired from Bernard on Nov. 4 2007


Bernard :

Oui, pas de problème, de toute façon, on pourra toujours modifier la chose si besoin.

Je pense pouvoir fournir une première version ce jour. Par contre, faudra me dire comment je dois la publier.

Merci.

@agnes : Merci pour les encouragements

Nuxwin Team
Nuxwin
avatar
from Caen, devant mon bureau
Member
190 posts
registered on June 9 2006

on Nov. 4 2007


unix_build_pot.pl - v1.00 : Création des fichiers de langue pour le projet YACS

Ci-joint une première version du script à renommer en unix_build_pot.pl. Doit être placé dans le dossier ./tools et un chmod 0750 doit être appliqué dessus pour qu'il puisse être exécuté. A noter que l'utilisateur unix qui l'exécute doit avoir le droit d'écriture dans l'archive Yacs.

UTILISATION :

Ce programme permet aux utilisateurs des systèmes GNU-linux de créer automatiquement tous les fichiers de langues du projets YACS pour une localisation respectant la spécification ISO 639 (e.g. 'en', 'fr', 'ar'...) décrite dans la RFC 3066. A noter que dans l'immédiat, ce programme ne gère pas la spécification ISO 3166-1 (eg. 'en-uk', 'zh-cn' ...).

Ce script peut être exécuté avec ou sans option(s).

Exécuté sans option, ce script contruira les fichiers *.pot (Portable Object Template), *.po (Portable Object) et *.mo (Machine Object) de tous les modules du projet YACS, étant précisé que la localisation selectionnée par défaut est l'anglais.

Comme évoqué ci-avant, le programme peut être invoqué avec une ou des options passées sur la ligne de commandes.

Les options disponibles sont les suivantes :

-?, h, --help Cette option affiche l'aide d'utilisation du script en Anglais

-a, --availablesmod Cette option permet à l'utilisateur de prendre connaissance de la liste des modules disponibles.

-b, --buildall=# Cette option permet à l'utilisateur de spécifier en argument un ou plusieurs modules pour lesquels les fichiers *.pot, *.po et *.mo seront générés. Si pour un module donné, le fichier *.po existe déjà, il sera simplement mis à jour.

Si l'utilisateur passe l'agument ( all ) à cette option, les fichiers seront générés pour l'ensemble des modules disponibles.

-G, --Genpot=# Cette option permet à l'utilisateur de spécifier en argument un ou plusieurs modules pour lesquels les fichiers *.pot seront générés.

Si l'utilisateur passe l'argument ( all ) à cette option, les fichers *.pot seront générés pour l'ensemble des modules disponibles.

A noter que la création des fichier *.pot est indépendante de la localisation.

-g, --genpo=# Cette option permet à l'utilisateur de spécifier en argument un ou plusieurs modules pour lesquels les fichiers *.po seront générés. Si pour un module donné, le fichier *.po existe déjà, il sera simplement mis à jour.

A noter que les fichiers *.pot rattachés au modules spécifiés doivent exister.

-u, --updatepo=# Cette option permet à l'utilisateur de spécifier en argument un ou plusieurs modules pour lesquels les fichiers *.po seront mis à jour.

Si l'utilisateur passe l'argument ( all ) à cette option, la mise à jour sera effectuée pour les fichiers *.po de tous les modules disponibles.

A noter que les fichiers *.po rattachés aux modules spécifiés doivent exister.

-c, --compile=# Cette option permet à l'utilisateur de spécifier en argument un ou plusieurs modules pour lesquels les fichiers *.mo seront générés.

A noter que les fichiers *.po des modules concernés doivent exister.

-l, --locale=# Cette option permet à l'utilisateur de specifier en argument une ou plusieurs localisation. Cette option peut être associée aux options --buildall, --genpo, --updatepo et --compile.

Pour ce qui concerne l'association de cette option avec les options --updatepo et --compile, il s'agit uniquement de préciser la où les localisations pour lesquelles on souhaite soit mettre les fichiers *.po à jour soit créer les fichiers *.mo.

A noter que si l'option --locale n'est pas paramétrée explicitement par l'utilisateur, la localisation selectionnée par défaut sera l'anglais ( en ).

-d, v, --debug, --verbose Active le mode debug

Vous noterez que le mixage des options --availablesmod, --buildall, --Genpot, --genpo, --updatepo et --compile n'est pas permis. Si vous tentez un mixage, une erreur sera retournée par le programme.

Note complémentaire : Ce script à été développé de manière à ce que l'utilisateur final puisse effectuer des actions liées à la localisation de manière dirigée. Si le but est simplement de créer tous les fichiers de langue pour les localisation en et fr, comme le fait déjà le script dédié aux plateformes windows (script ./tools/script build_i18n.bat), l'utilisateur doit simplement exécuter le programme avec les options suivantes :
./unix_build.pot --locale=en-fr
ou
./unix_build.pot --buildall=all --locale=en-fr
Enfin, si le but est simplement de mettre à jour les fichiers *.po pour la localisation fr, comme le fait déjà le script dédié aux plateformes windows (script ./tools/update_i18n.bat), l'utilisateur doit simplement exécuter le programme avec les options suivantes :
./unix_build_pot.pl --updatepo=all --locale=fr


Note de conception : Le présent script est écrit en perl. Il ne requière pas de modules spéficiques supplémentaires que ceux installés avec perl de base.

Le script à été testé sur Debian Etch et devrait normalement fonctionner correctement avec toutes les plateformes Linux.

Note aux développeurs du projet YACS :

Le liste des modules disponibles est incluse en dur dans le code source du programme. Si vous ajoutez ou supprimez un module du projet, il vous suffit d'éditer le tableau listant tous les modules soit la partie suivante du code :

our $MODULES = ["root", "actions", "agents", "articles", "behaviors", "categories", "codes", "collections", "comments", "control", "dates", "decisions", "feeds", "files", "i18n", "images", "letters", "links", "locations", "overlays", "scripts", "sections", "servers", "services", "shared", "skins", "smileys", "tools", "tables", "users", "versions"];


Ne pas hésiter à me faire part de vos remarques (bonnes ou mauvaises)

Nuxwin Team

Fichier joint : unix_build_pot.pl

Last Update : - Nov 05 - 01:27
Agnès
avatar
from le Grésivaudan (grenoble-chambéry)
Associate
2007 posts
registered on Feb. 13 2006

on Nov. 12 2007


Nuxwin : c'est un bien joli travail ! Et la doc ira avec, merci.

On va bientôt pouvoir compléter la doc et faire l'annonce

J'ai pas encore eu le temps de tester ton script, désolée, je suis débordée en ce moment. Mais je promets de le faire bientôt. Nick devrai pouvoir nous en dire plus... plus vite
-----
Agnès
Il n'y a pas de problèmes, que des solutions.
Agnès
avatar
from le Grésivaudan (grenoble-chambéry)
Associate
2007 posts
registered on Feb. 13 2006

inspired from nuxwin on Dec. 20 2007


Nuxwin : J'ai un overlay à localiser en français.

J'ai mis le script dans /tools (extension.pl), et mon overlay dans le répertoire overlays.

Quels sont les prérequis sur ma machine ? Car quand je lance la commande, je récolte un "commande introuvable". J'avais commencé en tapant "unix_build...", puis j'ai vu qu'en fait c'était "unix-build...", enfin, j'ai essayé avec et sans l'extension : même résultat.

La commande que j'ai tapée (en étant dans le répertoire tools) : unix-build-pot.pl --updatepo=overlays --locale=fr

Je suis sous ubuntu 7.04. Il y a des librairies perl installées - mais pas de serveur apache sur ma machine, je pense pas en avoir besoin.

Faut-il vérifier d'autres choses ? (par ex. je me souviens sous windows, il m'a fallu installer gettext (là j'ai gettext et gettext-base d'installés) et rajouter un truc dans PATH pour que ça fonctionne - et là, y'a quelque chose du même genre à faire ? si oui où et comment ?

Mais qu'est-ce que j'ai donc oublié là ?
Agnès
avatar
from le Grésivaudan (grenoble-chambéry)
Associate
2007 posts
registered on Feb. 13 2006

inspired from Agnès on Dec. 20 2007


Nuxwin : 'a y est, j'ai trouvé mes coquilles !

Alors résultat :
  • se fier à la ligne de commande sous linux, plus claire que l'interface graphique (sous gnome au moins) pour faire un chmod digne de ce nom
  • avoir un Tof dans les parages (meeeeerci Tof ) pour se faire expliquer le pourquoi du comment du ./ avant le nom du script Les joies du PATH (quand même plus facile sous linux je trouve).


Encore un peu plus cultivée aujourd'hui
Agnès
avatar
from le Grésivaudan (grenoble-chambéry)
Associate
2007 posts
registered on Feb. 13 2006

inspired from Agnès on Dec. 20 2007


Coucou, encore moi, avec un message qui me déroute :

je tape ./unix-build-pot.pl --Genpot=all et le script me renvoie :
./unix-build-pot.pl --Genpot=all xgettext: Chaîne non-ASCII repérée à overlays/recipelevel.php:31. Veuillez spécifier l'encodage de la source avec l'option « --from-code »..

Qu'est-ce à dire ? L'overlay (celui que j'ai retravaillé) est sur la base de recipe. J'ai rajouté des champs, et pile poil le premier est à la ligne 31. Pour autant, le script est encodé en UTF-8, mais comme tous les autres. Alors pourquoi il râle juste sur le bout de texte que j'ai tapé ? Ce sont des mots, juste des mots (donc des lettres toutes bêtes), entre quote : $label = i18n::s('Level of the recipe');. Pas d'accents et autres trucs bizarres (que j'aurai encodé de toutes manières).

Comment sortir de ça ? une idée, quelqu'un ?

Sinon, c'est quoi la syntaxe de l'option --from-code ?
Agnès
avatar
from le Grésivaudan (grenoble-chambéry)
Associate
2007 posts
registered on Feb. 13 2006

on Dec. 21 2007


Allez, ça finit par fonctionner. Voilà où ce sont situés les problèmes :
  • tout d'abord (merci pour l'info bernard), les sources sont en ASCII et pas UTF-8. Bien que, si j'ai compris ce que j'ai lu de-ci de-là, l'UTF-8 récupère les codes ASCII... (donc du coup, je suis un peu larguée, mais bon), j'ai tenté d'enregistrer mon script en ISO-8859-1 : résultat : que dalle, même message, même punition. J'ai même tenté un copié-collé dans un fichier neuf, avec enregistrement par défaut en ascii : toujours pareil.
  • en désespoir de cause, il s'avère qu'a la ligne du dessus, dans le commentaire, j'avais un caractère accentué que je n'avais pas écrit en ascii (un é). Bingo : ôter cet accent à suffit à résoudre le problème. Donc j'ai enfin mes templates ! (tout ça pour traduire 4 mots, c'est plus de la culture, c'est du gavage vitesse grand V).


Reste à comprendre pourquoi le message d'erreur de xgettext mentionne la ligne 31 si le problème se situe ligne 30...
Nuxwin
avatar
from Caen, devant mon bureau
Member
190 posts
registered on June 9 2006

inspired from Agnès on Dec. 21 2007


Agnès :

bonsoir ;

Je suis désolé, de ne pas t'avoir répondu en tant et en heures mais je viens seulement de prendre connaissance de tes posts.

Bien que tu es réussie à tant sortir, est-ce qu'en définitif ce script fonctionne correctement, pense tu qu'il faut apporter des modifications ?

Pour ce qui concerne le problème concernant le format d'entrée (ACSII), j'avoue que j'ai pas bien compris, tu peux ré-expliquer ?
Agnès
avatar
from le Grésivaudan (grenoble-chambéry)
Associate
2007 posts
registered on Feb. 13 2006

on Dec. 21 2007


Nuxwin : pour le script, voici ce que j'ai fait :
  • j'ai construit, à partir d'une arborescence de la 7.12, tous les templates (--Genpot=all)
  • j'ai demandé la génération des .po en français et anglais (--genpo=all --locale=en-fr) (je voulais en profiter pour corriger certaines coquilles que j'ai pu remarquer, en plus de mon overlay).
Mais quand j'édite overlays.po, impossible de l'enregistrer correctement sous poEdit, il y a des erreurs (missing 'msgstr' section).

En mettant à jour via ton script overlays.po (--updatepo=overlays --locale=en-fr), je récolte ceci sur la console :
...:~/Desktop/712test/tools$ ./unix-build-pot.pl --updatepo=overlays --locale=fr
i18n/locale/fr/overlays.po:26: Section « msgstr » absente
...
i18n/locale/fr/overlays.po:786: Section « msgstr » absente
i18n/locale/fr/overlays.po:813: La première forme du pluriel a un indice non nul
i18n/locale/fr/overlays.po:817: Section « msgstr » absente
i18n/locale/fr/overlays.po:821: Section « msgstr » absente
i18n/locale/fr/overlays.po:825: Section « msgstr » absente
msgmerge: 100 erreurs fatales trouvées


Bref, je comprends pas tout, mais j'ai une cagouille quelque part - et je sais pas du tout d'où ça vient, y compris moi peut-être.

Je te joins le script (à peine) modifié qui me pose problème, si tu veux faire des tests - au moins pour voir si ton script est hors de cause. Je me tournerai alors vers mon espace entre la chaise et le clavier...).

Pour les messages, pas de soucis. Le transfert du domaine de Yetanoz a duré quelques bonnes paires d'heures, et si le contenu était hébergé sur paxer.info - donc j'ai pu poster - les mails n'étaient plus en service le temps du transfert - donc pas d'alerte.

Enfin, pour l'ascii, je comprends pas tout non plus. En fait, j'avais simplement fait une erreur puisque j'avais laissé un caractère accentué sans le coder - le coup de l'erreur entre la chaise et le clavier, classique).
Agnès
avatar
from le Grésivaudan (grenoble-chambéry)
Associate
2007 posts
registered on Feb. 13 2006

inspired from Agnès on Dec. 21 2007


(le fichier n'est pas passé, je retente)

file 709

Tags: po xgettext internationalisation i18n poEdit

Rate this page
Posted by Nuxwin on Oct. 29 2007, edited by Nuxwin on Jan. 2, (popular)