Bonjour, je ne sais pas si cela vous pause aussi un problème, mais un fois mon code terminer je me retrouve avec du texte (message) qui se balade d'un peu partout. Le controller avec tous ses setFlash, le model avec les validates et biensure la vue (là c'est plutôt normal) ... Je me demandais si quelqu'un avait une idée sympa à proposé pour placer tous les messages du controller et du model au même endroit histoire qu'un designer puisse les gérés tout seul. J'avais mes habitude avant sous Joomla où ce problème étais réglé avec l'internasionalisation, une solution existe telle sur cake?
Bonjour,
Peut-être avec un fichier de conf avec un tableau :
<?php
$messages['ControllerName']['actionName']['messageTitle'] = 'coucou';
Dans ton setFlash du controller tu utilises la variable.
Bon courage
Bonjour.
L'internalisation existe également avec CakePHP, avec le Behavior Translate qui permet d'enregistrer les données des tables dans différentes langues en base de données ou/et avec les fichiers textes (.po) dans le dossier Locale.
Concernant la traduction des messages flash et des messages de validation, ils doivent quand même se trouver dans leurs secteurs respectifs (Session::setFlash() » Controllers, Messages d'erreurs de validation » Models), mais leur traduction est disponible dans les fichiers .po du dossier Locale.
Pour les messages flash du controller, rien ne t'empèche de mettre des messages généralistes du genre :
// dans le controller :
$this->Session->setFlash(__d('controlleurs', '%s delete !', 'Post'), 'notif', ['type' => 'success']);
// dans un fichier **.po** nommé **controlleurs** *(selon l'exemple ci-dessus)*
msgid "%s delete !"
msgstr "%s supprimé !"
De toute façon, le designer est censé travailler sur l'aspect graphique d'un site, et non sur les messages ou contenus écrit sur celui-ci.
Si le but de ta demande concerne principalement la possibilité de faire traduire ton site dans différentes langues, le Behavior Translate et les fichiers .po des locales, ce sera amplement suffisant, étant donné qu'une fois que tu as écrit la majorité du contenu textuel de ton site, tu génères un fichier de locale avec CakePHP et tu le transmet au/aux contributeur(s) concernés par la traduction.
Il te suffira par la suite de réinjecter le/les fichiers dans les locales correspondantes dans le dossier Locale est s'est terminé.
Ou alors, tu fais tout simplement un système pour qu'ils puissent télécharger/déposer les fichiers eux même sans forcément passer par toi.
Tout a fait d'accord avec Lartak pour les fichier .po et le gettext très pratique pour l'internationalisation, mais dans mon cas je cherche à desengorger les controllers et les models de le texte, l'idée de 'connected' et pas si mal que ca et repondrait suremement plus à mon problème ou des fichiers define comme sur Joomla. Pour ce qui est de 'le designer est censé travailler sur l'aspect graphique d'un site, et non sur les messages ou contenus...' A mon avis pour un message flash de type 'Votre compte a été correctement activé, vous pouvez dès à présent acceder à votre espace membre' sur un template responsive en 600px ca prend un peu de place et je me vois mal commencer avec des '<span class='hidden-phone'>Votre compte a été correctement activé, vous pouvez dès à présent acceder à votre espace membre</span><span class='visible-phone'>Compte activé</span>' dans mon controller ca serais la cata
Bon pris sur l'idée de Joomla:
dans le boostrap
Configure::config('locale', new IniReader(APP.'Locale/fr-FR/'));// Charge le dossier Locale
function ___($read) { return Configure::read($read); }// Fonction d'internationalisation maison
dans le controller
Configure::load('nom_du_fichier_de_traduction','locale');// Charge le dossier
fichier de traduction .ini:
[nom_du_controller]
msg = 'mon petit message sortie de nul part :p'
et maintenant
$this->Session->setFlash(___('nom_du_controller.msg'));
Plutôt fonctionnel reste à parlé de la rapidité du parser ini
ou des fichiers define comme sur Joomla
Les define('', ''); sont prévus pour définir des constantes et non des chaines de caratères pour des messages.
Ce que tu peux faire à la rigueur, c'est définir tes messages dans un fichier de ton dossier Config par exemple avec une variable $config et tu inclues ce fichier dans ton fichier bootstrap.php.
Exemple :
// fichier : messages.php
$config = [
'Messages' => [
'Success' => [
'activation' => 'Votre compte a été correctement activé, vous pouvez dès à présent acceder à votre espace membre',
'connexion' => 'Vous êtes à présent connecté',
/* etc ... */
],
'Error' => [
/* etc ... */
]
]
];
// fichier : bootstrap.php
Configure::load('messages');
// depuis un controller
public function login() {
/* code */
$this->Session->setFlash(Configure::read(Messages.Success.connexion));
}
De cette manière, le fichier messages.php peut être modifié par une tierce personne, sans qu'il n'ait à toucher au code php des controlleurs.
Tu préfères comme-ça ?
oui tester et c'est pas mal du tout je suis passé juste par le parser IniReader plutot que par $config pour des raisons de lisibilité ensuite petite modification de ma fonction raccourci
function ___($position, ...$args) {
return vsprintf(Configure::read($position),$args);
}
Juste attention la compatibilité de ce type de déclaration d'argument je crois que c'est php 5.6 pour pas dire de betise.
En tout cas ce système marche à merveille mes controllers et mes models sont déja plus claire et ne contienne plus de texte