Gestion des traductions

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é.

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/14564

Haut de page