Problème:
Premièrement je vous remercie de votre aide et votre tuto sur internationaliser son site avec gettext est bien expliqué, mon system est Windows 10
langue Français. Php 8.1.0
j'ai suivi votre tuto à la lettre, mais une fois la page index est traduite en français, la traduction en espagnol ne marche pas, même si je redémarre, la page ne s'affiche plus en anglais et l'affichage reste en français..
j'aimerais bien que vous me veniez en aide et merci à vous.
Localization.php:


"

error_reporting(E_ALL | E_STRICT);

// define constants
define('PROJECT_DIR', realpath('./'));
define('LOCALE_DIR', PROJECT_DIR .'/locale');
define('DEFAULT_LOCALE', 'es_ES');

require_once('lib/gettext/gettext.inc');

$supported_locales = array('es','es_ES','en','en_US','sr', 'sr_CS', 'de_CH','fr','fr_FR');
$encoding = 'UTF-8';

$locale = (isset($_GET['lang']))? $_GET['lang'] : DEFAULT_LOCALE;

// gettext setup
T_setlocale(LC_MESSAGES, $locale);
// Set the text domain as 'messages'
$domain = 'trad';
bindtextdomain($domain, LOCALE_DIR);
// bind_textdomain_codeset is supported only in PHP 4.2.0+
if (function_exists('bind_textdomain_codeset')) 
  bind_textdomain_codeset($domain, $encoding);
textdomain($domain);

header("Content-type: text/html; charset=$encoding");
?>"

je voudrais traduire la page web ecrite en anglais  par exemple en espagnol, ou en français
**Ce que j'obtiens**

Décrivez vos éventuelles erreurs ou ce que vous obtenez à la place de ce que vous attendez :(
j'obtient une page traduite en français  et reste en français meme si je redémarre le server (wamp)

5 réponses


Salut.

Tu peux faire voir le code qui est censé afficher le texte à traduire stp ?

Sinon regarde le premier commentaire de la doc gettext : https://www.php.net/manual/en/book.gettext.php#122509

lasa
Auteur

Bonjour JoolsMcFly
voila le code que je voulaius traduire:
"<?php
$head = "<title>".("Page d'accueil")."</title>";
?>
<h1><?=
("Bienvenue"); ?></h1>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sollicitudin, libero ut ullamcorper pellentesque, orci neque ullamcorper lacus, ac facilisis metus nunc malesuada dolor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean sed libero eu augue posuere semper quis nec felis. Aliquam et sagittis lectus. Aliquam id velit ligula. Mauris sodales malesuada est eu vulputate. Ut semper risus non urna adipiscing molestie. Curabitur dictum, nisl pharetra pharetra fermentum, elit tellus imperdiet nisi, in tempor ligula lacus congue tellus. Morbi at purus velit. Quisque arcu orci, suscipit ut dictum in, sodales quis turpis. Integer iaculis orci tellus, id vulputate nisi. Donec eu tellus quam. Nunc consectetur tempor eros, et volutpat sapien fringilla in. Cras pretium risus vel eros pulvinar in hendrerit orci tincidunt.
</p>
<p>
Mauris egestas, nibh dapibus sodales semper, enim lectus ornare lorem, in porttitor odio tellus ut nisi. Vivamus suscipit ligula nec felis aliquet luctus. Praesent euismod ultrices rutrum. Aliquam a quam id ipsum dictum cursus. Pellentesque ultrices luctus velit, ut ornare ipsum sagittis sed. Etiam at urna odio. Nam iaculis leo eget erat tincidunt ut auctor lacus sagittis. Pellentesque vel eros quam, fringilla pharetra arcu. Vivamus vulputate leo eu leo blandit vitae tincidunt eros malesuada. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce nibh ante, accumsan nec consectetur sit amet, blandit a nulla. <p> </p>
</p>
<h1><?= _("Derniers commentaires"); ?></h1>

<?php
$count = 10;
    echo sprintf(ngettext("%d Commentaire","%d Commentaires",$count),$count);
?>"

Salut.

Il te manque des _ où tu veux traduire :

<?php
$head = "<title>"._("Page d'accueil")."</title>";
?>
<h1><?= _("Bienvenue"); ?></h1>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sollicitudin, libero ut ullamcorper pellentesque, orci neque ullamcorper lacus, ac facilisis metus nunc malesuada dolor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean sed libero eu augue posuere semper quis nec felis. Aliquam et sagittis lectus. Aliquam id velit ligula. Mauris sodales malesuada est eu vulputate. Ut semper risus non urna adipiscing molestie. Curabitur dictum, nisl pharetra pharetra fermentum, elit tellus imperdiet nisi, in tempor ligula lacus congue tellus. Morbi at purus velit. Quisque arcu orci, suscipit ut dictum in, sodales quis turpis. Integer iaculis orci tellus, id vulputate nisi. Donec eu tellus quam. Nunc consectetur tempor eros, et volutpat sapien fringilla in. Cras pretium risus vel eros pulvinar in hendrerit orci tincidunt.
</p>
<p>
Mauris egestas, nibh dapibus sodales semper, enim lectus ornare lorem, in porttitor odio tellus ut nisi. Vivamus suscipit ligula nec felis aliquet luctus. Praesent euismod ultrices rutrum. Aliquam a quam id ipsum dictum cursus. Pellentesque ultrices luctus velit, ut ornare ipsum sagittis sed. Etiam at urna odio. Nam iaculis leo eget erat tincidunt ut auctor lacus sagittis. Pellentesque vel eros quam, fringilla pharetra arcu. Vivamus vulputate leo eu leo blandit vitae tincidunt eros malesuada. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce nibh ante, accumsan nec consectetur sit amet, blandit a nulla. <p> </p>
</p>
<h1><?= _("Derniers commentaires"); ?></h1>

<?php
$count = 10;
echo sprintf(ngettext("%d Commentaire","%d Commentaires",$count),$count);

Ensuite, as-tu bien mis à jour les .po ? As-tu les locales cibles installées ?

lasa
Auteur

Bonjour JoolsMcFly
d'abord je salue votre patience avec moi,
j'ai ajouté les "_" la ou il faut
et les langues locales "es" et "en" sont bien installées . Mais le problème persiste toujours.
Merci à vous!

Bonjour.

Est-ce que l'ensemble de ton code est celui-ci ?

<?php

error_reporting(E_ALL | E_STRICT);

// define constants
define('PROJECT_DIR', realpath('./'));
define('LOCALE_DIR', PROJECT_DIR .'/locale');
define('DEFAULT_LOCALE', 'es_ES');

require_once('lib/gettext/gettext.inc');

$supported_locales = array('es','es_ES','en','en_US','sr', 'sr_CS', 'de_CH','fr','fr_FR');
$encoding = 'UTF-8';

$locale = (isset($_GET['lang']))? $_GET['lang'] : DEFAULT_LOCALE;

// gettext setup
T_setlocale(LC_MESSAGES, $locale);
// Set the text domain as 'messages'
$domain = 'trad';
bindtextdomain($domain, LOCALE_DIR);
// bind_textdomain_codeset is supported only in PHP 4.2.0+
if (function_exists('bind_textdomain_codeset')) 
  bind_textdomain_codeset($domain, $encoding);
textdomain($domain);

header("Content-type: text/html; charset=$encoding");

$head = "<title>"._("Page d'accueil")."</title>";
?>
<h1><?= _("Bienvenue"); ?></h1>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sollicitudin, libero ut ullamcorper pellentesque, orci neque ullamcorper lacus, ac facilisis metus nunc malesuada dolor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean sed libero eu augue posuere semper quis nec felis. Aliquam et sagittis lectus. Aliquam id velit ligula. Mauris sodales malesuada est eu vulputate. Ut semper risus non urna adipiscing molestie. Curabitur dictum, nisl pharetra pharetra fermentum, elit tellus imperdiet nisi, in tempor ligula lacus congue tellus. Morbi at purus velit. Quisque arcu orci, suscipit ut dictum in, sodales quis turpis. Integer iaculis orci tellus, id vulputate nisi. Donec eu tellus quam. Nunc consectetur tempor eros, et volutpat sapien fringilla in. Cras pretium risus vel eros pulvinar in hendrerit orci tincidunt.
</p>
<p>
Mauris egestas, nibh dapibus sodales semper, enim lectus ornare lorem, in porttitor odio tellus ut nisi. Vivamus suscipit ligula nec felis aliquet luctus. Praesent euismod ultrices rutrum. Aliquam a quam id ipsum dictum cursus. Pellentesque ultrices luctus velit, ut ornare ipsum sagittis sed. Etiam at urna odio. Nam iaculis leo eget erat tincidunt ut auctor lacus sagittis. Pellentesque vel eros quam, fringilla pharetra arcu. Vivamus vulputate leo eu leo blandit vitae tincidunt eros malesuada. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce nibh ante, accumsan nec consectetur sit amet, blandit a nulla. <p> </p>
</p>
<h1><?= _("Derniers commentaires"); ?></h1>

<?php
$count = 10;
echo sprintf(ngettext("%d Commentaire","%d Commentaires",$count),$count);

T_setlocale n'est pas une fonctione officielle. C'est setlocale (pour linux) que tu veux je pense.

D'après un commentaire sur la doc PHP (que je te conseille de bien lire) pour Windows il faut faire

putenv("LC_ALL={$locale}");

au lieu de setlocale.

Est-ce que tu peux ajouter ce code à la fin :

echo "Dossier local: ".LOCALE_DIR."<br>";
if (!is_file(LOCALE_DIR."/$domain.mo")) {
    echo "Fichier de trad .mo non trouvé.<br>";
}
if (!is_file(LOCALE_DIR."/$domain.po")) {
    echo "Fichier de trad .po non trouvé.<br>";
}

et montrer ce que ça affiche ?
Les fichiers .mo et .po sont bien dans le dossier LOCALE_DIR ?

Et tu as bien redémarré apache entre chaque changement ?