Je causais il y a quelques jours d’un problème que j’avais avec la construction des fichiers de traduction ; et je soupçonnais en particulier un problème avec xgettext. Après quelques tests ce matin, j’ai trouvé ce qui empêche xgettext de correctement trouver les chaînes à traduire dans un fichier en particulier.
Ce fichier comporte, quelques lignes avant le début des chaînes à traduire, un code qui utilise une syntaxe heredoc pour définir une chaîne de caractères :
$css = <<<EOT
body {
color: #000;
background: #f9f9f9;
margin: 0;
padding: 2px;
border: none;
$rtl
}
code {
color: #666;
font-weight: bold;
}
body > p:first-child {
margin-top: 0;
}
EOT;
$js = [
'dialog_url' => 'popup.php',
'iframe_css' => $css,
'base_url' => $GLOBALS['core']->blog->host,
'switcher_visual_title' => __('visual'),
'switcher_source_title' => __('source'),
…
Or, depuis PHP 7.3, l’identifiant de fin de la syntaxe heredoc peut être ailleurs que sur la première colonne et je pense que xgettext n’apprécie pas du tout cette possibilité :
L’identifiant de fin peut être indenté par des espaces ou tabulations, au quel cas l’indentation sera retirée de toutes les lignes dans la chaîne de caractères doc. Antérieur à PHP 7.3.0, l’identifiant de fin doit commencer à la première colonne de la ligne.
J’ai donc refait un test en mettant cet identifiant (EOT
) en 1re colonne et bingo, ça refonctionne \o/
Un ticket a été ouvert récemment à ce sujet sur le bugtracker du projet GNU gettext, on verra si c’est suivi d’effet…