Gros boulot effectué hier sur la gestion des traductions.
Celles spécifiques aux plugins livrés avec Dotclear, dont les libellés traduits sont tous regroupés dans les fichiers locales/xx/plugins.po — il n’est donc pas nécessaire d’utiliser l’outil po_update.sh en ce qui les concerne.
Du côté des thèmes, les libellés « publics » sont regroupés, ainsi que ceux présents dans les jeux de template dans le fichier locales/xx/public.po. Pour les besoins spécifiques côté public j’ai ajouté un fichier _public.pot qui permet d’ajouter des libellés personnalisés à traduire.
À noter que les libellés utilisés pour le fichier de configuration des thèmes, soit _config.php, est placé dans un fichier locales/xx/admin.po à charger spécifiquement en début du fichier de configuration avec un simple :
l10n::set(dirname(__FILE__) . '/locales/' . $_lang . '/admin');
Tandis que le reste est placé dans le fichier locales/xx/main.po.
À part le fichier admin.po des thèmes, tous les autres fichiers de traduction sont chargés automatiquement, il n’est donc pas nécessaire de s’en préoccuper.
Pour résumer en ce qui concerne les fichiers de traductions (.po, .pot) :
- Fichiers « template » (locales/_pot/_*.pot) — cœur de Dotclear et thèmes (les plugins intégrés n’ont pas de fichiers de traduction .po)
- _public.pot : ajout spécifique pour la partie publique, à gérer à la mano
- date.pot : n’a pas de raison d’évoluer
- main.pot : tous les libellés d’administration
- plugins.pot : tous les libellés des plugins
- public.pot : tous les libellés public (jeux de template + contenu de _public.pot[1])
- Fichiers traductions (locales/xx/*.po)
- date.po
- main.po : uniquement chargé côté administration
- admin.po : pour les thèmes seulement et chargés par le fichier __config.php du thème (voir ci-dessus)
- plugins.po
- public.po : uniquement chargé côté public (blog)
Les fichier d’aide (locales/xx/help/*.html) peuvent être présents partout, donc dans le cœur de Dotclear, côté plugins et côté thèmes.
Pour les plugins et thèmes tiers, la structure est la même à la différence qu’il peut bien évidemment y avoir des traductions côté plugins. Leur chargement est automatique pour les plugins (via le fichier resources.php) et pour les thèmes, toujours géré par le fichier resources.php mais dont il faut assurer le chargement dans le fichier __config.php du thème avec un :
/ Load contextual help
if (file_exists(dirname(__FILE__) . '/locales/' . $_lang . '/resources.php')) {
require dirname(__FILE__) . '/locales/' . $_lang . '/resources.php';
}
Par ailleurs, côté plugins et thèmes tiers, seul le fichier main.po est chargé automatiquement, côté administration ou côté public, c’est indifférent. Les autres éventuels fichiers de traductions doivent être chargés explicitement (voir ci-dessus l’exemple pour le fichier admin.po).
Mise à jour
Pour « mettre à jour » les fichiers template (.pot) et les fichiers de traductions d’une langue, côté Dotclear il suffit, une fois placé dans lé répertoire principal de Dotclear de lancer :
./build-tools/po_update.sh <code-langue>
Pour les thèmes intégrés de Dotclear :
./build-tools/po_update.sh <code-langue> themes/<répertoire-du-theme>
Pour un plugin tiers (toujours à partir du répertoire principal de Dotclear) — À ne pas faire pour les plugins livrés avec Dotclear :
./build-tools/po_update.sh <code-langue> plugins/<répertoire-du-plugin>
Ou (pour les plugins placés ailleurs) :
./build-tools/po_update.sh <code-langue> <chemin-des-plugins-tiers>/<répertoire-du-plugin>
Pour un thème tiers (toujours à partir du répertoire principal de Dotclear) :
./build-tools/po_update.sh <code-langue> themes/<répertoire-du-theme>
Ou (pour les thèmes placés ailleurs) :
./build-tools/po_update.sh <code-langue> <chemin-des-thèmes-tiers>/<répertoire-du-thème>
À noter que si l’arborescence nécessaire n’existe pas au moment de la mise à jour, celle-ci est créée.
Voilà la liste des 32 langues livrées en standard par Dotclear (avec les codes à utiliser) :
- bn : Bengali
- ca : Catalan
- cz : Tchèque
- da : Danois
- de : Allemand
- el : Grec
- en : Englais
- eo : Esperanto
- es : Espagnol
- es-ar : Espagnol (Argentine)
- eu : Basque
- fi : Finnois
- fr : Français
- hu : Hongrois
- it : Italien
- ja : Japonais
- ko : Coréen
- lb : Luxembourgeois
- lt : Lithuanien
- nl : Hollandais
- oc : Occitan
- pl : Polonais
- pt : Portuguais
- pt-br : Portuguais (Brésil)
- ro : Roumain
- ru : Russe
- sr : Serbe
- sv : Suédois
- te : Telugu
- tr : Turc
- uk : Ukrainien
- zh-cn : Chinois
Au passage j’ai découvert que la syntaxe PHP Nowdoc n’est pas reconnue par xgettext (l’outil qui extrait les chaines à traduire des fichiers sources), comme par exemple :
$res = <<<'TPLFM_TOP'
<?php
if ($_ctx->posts !== null && $core->media) {
$_ctx->featured = new ArrayObject($core->media->getPostMedia($_ctx->posts->post_id,null,"featured"));
foreach ($_ctx->featured as $featured_i => $featured_f) :
$GLOBALS['featured_i'] = $featured_i;
$GLOBALS['featured_f'] = $featured_f;
$_ctx->file_url = $featured_f->file_url; // for Flash/HTML5 Players
?>
TPLFM_TOP;
$res .= $content;
$res .= <<<'TPLFM_END'
<?php
endforeach;
$_ctx->featured = null;
unset($featured_i,$featured_f,$_ctx->featured_url);
}
?>
TPLFM_END;
Il faut le convertir en (en gros échapper les caractères $) :
$res = <<<TPLFM_TOP
<?php
if (\$_ctx->posts !== null && \$core->media) {
\$_ctx->featured = new ArrayObject(\$core->media->getPostMedia(\$_ctx->posts->post_id,null,"featured"));
foreach (\$_ctx->featured as \$featured_i => \$featured_f) :
\$GLOBALS['featured_i'] = \$featured_i;
\$GLOBALS['featured_f'] = \$featured_f;
\$_ctx->file_url = \$featured_f->file_url; // for Flash/HTML5 Players
?>
TPLFM_TOP;
$res .= $content;
$res .= <<<TPLFM_END
<?php
endforeach;
\$_ctx->featured = null;
unset(\$featured_i,\$featured_f,\$_ctx->featured_url);
}
?>
TPLFM_END;
Note
[1] Si un des libellés présents dans ce fichier est déjà présent côté template, il n’y sera pas dupliqué.
1 De Bernard -
Question subsidiaire: si j’ai bien compris le fichier
_public.pot
est intégré à la version Dc.D’où: dans le cas d’une mise à jour “automatique”, cela va-t-il poser pb si on le modifie ?
2 De Franck -
Oui il fait partie des fichiers « officiels » de Dotclear. Par ailleurs, le modifier sur une installation existante n’a pas beaucoup de sens, sauf à vouloir proposer des modifications via une
sur le dépôt.Les fichiers .pot ne servent qu’à préparer le terrain pour générer (ou mettre à jour) les fichiers .po.
3 De Tomek -
Et puis on peut faire des traductions dans le thème pour éviter de toucher aux fichiers du core : https://tips.dotaddict.org/fiche/Aj…
4 De Franck -
En effet mais en faisant ça tu te prives de la gestion automatisée avec po_update.sh.
Autant laisser faire et conserver un main.po pour la partie publique du thème, sachant qu’il n’y aura pas de doublons avec ce qui existe déjà côté cœur de Dotclear (public.po en particulier).