CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[MVC] Site multilingue

Fire_Storm
Fire_Storm
Niveau 10
07 août 2012 à 20:12:43

Hello world !

Autre petit soucis sur lequel je butte un peu (enfin pas vraiment un soucis mais j'aimerais connaitre pour vous la meilleure façon de gérer ça).

Je suis en train de me créer mon petit site, et je comptais aussi pour le boulot développer un genre de petit CMS tout simple (page de présentation, des articles, une galerie, une page contact bref rien de plus classique).

Afin d'éviter le problème je prévois déjà qu'il pourra être multilingue (système en 2 tables, ça me permet de rajouter autant de langues que je veux).

Le système fonctionne, j'ai fait mes managers sans soucis (un seul manager pour gérer les 2 tables, bah oui l'une ne va pas sans l'autre donc pour moi ça fait partie du même objet).

Par contre là où j'ai un problème, enfin si on peut appeller ça problème c'est lorsque je dois déterminer la langue, je suis à chaque fois obliger de taper mon if:

if(!empty($request->getData('languageID'))
{
$languageID = htmlspecialchars($request->getData('languageID');

}
else
{
$languageID = 'fr';
}

Pareil dans mon template (bah oui faut bien déterminer la langue pour construire les bons chemin du menu (/fr/contact, /en/contact, /fr/blog ou /en/blog etc etc, le tout étant éviemment indique comme ceci dans le système de routage: /([a-z]{2}/blog/([0-9]+) ).

Et je dois répéter ce if à chaque action que je fais (car je ne crois pas que je puisse, avec le système utilisé, utiliser une variable du template principal dans une vue (vu que j'ai déjà fait cette verif au tout début de mon template), y compris dans le template principal (car quand la route est mauvaise il ne charge aucune action spéciale, donc le code déterminant la langue tombe à l'eau).

Bref en soi c'est pas un soucis, mais je sais pas y a une certaine redondance du code qui me gêne (en gros faut répeter ce if partout quoi) donc avec ce genre d'architecture (MVC) comment gérez vous la détection de la langue a utiliser ? (le seul moyen que j'ai trouvé pour ne pas redevoir taper la même condition partout, c'est une variable de session, qui elle donc peut être appelée un peu partout mais là encore je ne trouve pas ça très propre (oui je sais moi et mon tic de la "propreté" du code xP Mais que voulez vous, si je suis bordelique dans la vie, dans mon code j'aime que ça soit bien rangé xP)).

Merci d'avance.

deepblue
deepblue
Niveau 16
07 août 2012 à 20:55:07

Première chose : quand tu génère un lien, passe par une fonction pour abstraire la génération. Typiquement, tu feras un truc comme ça (je simplifie) :

function get_link($path)
{
return str_replace('{culture}', fonction_qui_donne_la_culture(), $path);
}

<a href="<?=get_link(sprintf('/{culture}/foo/%s', $obj->getBar())); ?>">Foo</a>

Je t'invite (une nouvelle fois) à regarder comment on gère les route dans Symfony (1 ou 2, c'est similaire), surtout dans les vues.

Pour déterminer quelle est la langue de l'utilisateurs, tu fais une fonction qui s'exécute avant l'action de ton contrôleur (un pre execute en sommes). Cette méthode pourra placer quelques part (une session, un attribut de ton contrôleur, etc.), la culture de l'utilisateur (qui provient de l'url, d'un cookie, d'une session, etc.).

Donc l'idée générale c'est de t'en foutre de la culture du user quand tu fais un lien car c'est gérée par un petite couche d'abstraction.

Fire_Storm
Fire_Storm
Niveau 10
07 août 2012 à 21:15:16

Encore une fois je j'utilise pas symfony. ^^

Le système de routage la c est simplement un fichier XML qui indique l URL, le module, l action et les variables de l URL.

deepblue
deepblue
Niveau 16
07 août 2012 à 21:18:35

Certes, mais tu peux t'en inspirer :o))

En tout cas, ce que je te raconte reste vrai :-)

Fire_Storm
Fire_Storm
Niveau 10
07 août 2012 à 21:46:27

Donc ok je dois placer ma fonction avant mes actions.

Mais qui doit s'occuper de ça ? ^^ Le router ? Le backcontroller ? L'application ?

(en gros si tu veux le modèle utilisé c'est (oui je sais je vais me faire fouetter... xD) celui utilisé sur le SDZ dans la partie objet, tout à la fin (et à vrai dire je ne sais pas si ce modèle là est correct ou pas en fait).

Fire_Storm
Fire_Storm
Niveau 10
07 août 2012 à 22:14:30

Bon ben après quelques tutos, je pense donc savoir où je dois stocker ma "culture"; dans la session de l'utilisateur (que j'ai renommé en classe Session car pour moi c'est bien la SESSION que l'on gère et non l'utilisateur lui même).

Et je viens de voir qu'il avait prévu une méthode setAttribute($attr, $value)

Reste à déterminer où appeler la méthode et donc faire ma petite condition.

deepblue
deepblue
Niveau 16
07 août 2012 à 22:57:47

Fait qqchose du genre : http://wall.deblan.fr/x148/php/1/

deepblue
deepblue
Niveau 16
07 août 2012 à 23:05:50

btw, j'ai foutu une méthode getUser dans User, elle est à virer...

deepblue
deepblue
Niveau 16
07 août 2012 à 23:46:05

Et j'me suis loupé sur le $service de Container :-d

L'idée c'est d'oublier le concept de singleton et de déléguer ce type d'objet à un container. Ça permet de construire facilement les objets dans le cas d'injection de dépendance et de centraliser les services et l'écriture est simple et cohérente dans un projet complet. C'est globalement l'idée de celui de Symfony 2 et c'est vraiment bien conçu (je ne parle pas de mon code ultra simplifié).

Fire_Storm
Fire_Storm
Niveau 10
08 août 2012 à 00:20:57

Oula euh ... faut que j'analyse tout ça... xD

Fire_Storm
Fire_Storm
Niveau 10
09 août 2012 à 12:06:20

Ben en fait c'était tout con... xD

Comme tu l'as dit deepblue c'est ma classe de Session d'utilisateur qui doit se charger de stocker cette données, ensuite je fais ma condition dans mon FrontendApplication:

if($this->httpRequest->getExists('languageID'))

{
$this->session->setAttribute('languageID', $this->httpRequest->getExists('languageID'));
}
else
{
$this->session->setAttribute('languageID', 'fr');
}

et puis dans l'action y a plus qu'a récupérer ça et la transformer en variable que je passe à ma vue:

$languageID = $this->app->getSession()->getAttribute('languageID
');

$this->page->addVar('languageID', $languageID);

Et là miracle, je peux faire un echo $languageID où j'ai envie sans devoir me tracasser de vérifier celle ci. ^^

deepblue
deepblue
Niveau 16
09 août 2012 à 15:45:32

Même si l'infos est stockée dans une session, la notion de langue est rattachée à l'utilisateur.

Fire_Storm
Fire_Storm
Niveau 10
09 août 2012 à 15:55:35

Comme dit j ai renommé la classe (car ayant une autre classe user ben ça foirait).

Session dans le sens session de l utilisateur et non variable de session.

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment