Welcome to the Cookbook

loading...

4.8.2 L'internationalisation dans CakePHP

Le texte original de cette section a changé depuis qu'il a été traduit. Aidez-nous à corriger cette différence. Vous pouvez :

Plus d'information à propos des traductions

Utiliser des données locales dans votre application est simple. La première étape consiste à préciser à CakePHP quelle langue l'application doit utiliser pour délivrer le contenu. Cela peut-être fait, entre-autres, en détectant les sous-domaines (en.exemple.com ou fra.exemple.com) ou en récupérant l'agent utilisateur du navigateur.

C'est mieux de faire le changement de langue dans le contrôleur :

$this->L10n = new L10n();
$this->L10n->get("fra");
  1. $this->L10n = new L10n();
  2. $this->L10n->get("fra");

Vous pourriez avoir envie de placer ce code dans le beforeFilter pour que chaque action du contrôleur soit affichée dans la langue correcte ou bien vous pourriez vouloir le placer dans une action qui manipule l'authentification ou le changement de langue par défaut.

L'affichage localisé d'un contenu se fait en utilisant la fonction pratique __(). Cette fonction est disponible globalement, mais elle sera probablement mieux utilisée dans vos vues. Le premier paramètre de la fonction est le msgid défini dans les fichiers .po. Le contenu localisé est par défaut affiché (par un echo), mais un second paramètre optionnel entraîne à la place, le retour de la valeur (utile pour le surlignement ou les liens utilisant le TextHelper par exemple). Le court exemple ci-dessous montre comment afficher du contenu local en utilisant la fonction __(). Le rendu exact dépend de la locale qui a été sélectionnée en utilisant la classe L10n et de la définition active de la configuration.

<?php __("achat"); ?>
  1. <?php __("achat"); ?>

Souvenez-vous d'utiliser le paramètre d'échappement des différentes méthodes du helper si vous envisagez d'utiliser les données localisées comme une partie d'un appel de méthode du helper. Remarquez l'usage du second paramètre de __() pour retourner la donnée au lieu de la rendre par un echo () :

<?php
echo $form->error(
    'Carte.numeroCarte',
    __("erreurNumeroCarte", true),
    array('escape' => false)
);
?>
  1. <?php
  2. echo $form->error(
  3. 'Carte.numeroCarte',
  4. __("erreurNumeroCarte", true),
  5. array('escape' => false)
  6. );
  7. ?>

Si vous aimeriez avoir tous vos messages d'erreurs traduits par défaut, une solution simple serait d'ajouter le code suivant dans votre app_model.php :

function invalidate($field, $value = true) {
	return parent::invalidate($field, __($value, true));
}
  1. function invalidate($field, $value = true) {
  2. return parent::invalidate($field, __($value, true));
  3. }