J'ai commencé par me dire qu'effectivement ton hack est "
vraiment vilain".
J'ai une application internationalisée, qui date un peu, et ne m'a posé aucun problèmes. Puis j'ai pris la peine d'aller y re-regarder de plus près et me suis rendu compte que, dans la culture de l'utilisateur, je ne stockais que la langue. Ainsi, les traductions et la base fonctionnent, pas les champs sensibles à la cultures, mais, sur cette application, je n'en utilisais pas.
J'ai donc cherché sur internet et dans le code, j'en arrive à la réponse suivante, il y a un bug dans l'objet sfDoctrineRecord de symfony. En effet, la méthode listenToChangeCultureEvent() est à l'écoute d'un événement de changement de culture pour l'utilisateur et l'enregistre dans l'objet record. Seul problème, cette méthode prend tous le contenu du champ culture, sans chercher à en extraire la partie langue et l'objet sfDoctrineRecord, l'utilise, tel quel, pour rechercher la langue dans le tableau des traductions.
Dons, il y a plusieurs solutions :
- tous mettre en langue, sans prendre la culture en compte.
- garder la langue et la culture et modifier le code de l'objet sfDoctrineRecord pour en sortir la langue
- garder ton hack (à la hussard) (mais qui va faire du code redondant)
- Modifier le sfUser, la partie du code qui va générer l'événement, capturé par sfDoctrineRecord pour qu'il ne prennent que la langue et pas le doublon.
J'ai utilisé la 1. J'utiliserais bien la 2 dans ma prochaine application. Je n'aime pas la redondance qu'implique la 3. J'ai un peu peur pour la 4, rien ne dit que d'autre objets utilisent le même événement pour, eux, récupérer la culture (je pense aux widget avec un i18n. Mais je n'ai pas creusé dans ces codes là.
Si tu pars sur la deux, on peut creuser la modification à prendre en compte. Et la poster comme modification proposée sur le site de symfony.
Partager