2017-07-28 1 views
5

J'ai une application Phoenix par défaut. Cette application aura un page_controller qui va charger un fichier index.html.eex. L'application saura utiliser le code view pour accéder à templates/page/index.html.eex.Basculer entre deux ou plusieurs modèles avec une action dans les contrôleurs?

Dites maintenant que vous avez créé une autre page html qui est identique à index.html.eex dans tous les sens sauf en français.

Comme nous ne voulons pas créer une toute nouvelle application Phoenix qui aura tout le même code, à l'exception étant la traduction française du page/index.html.eex actuelle, est-il un moyen de dire la vue ou le contrôleur quel fichier doit être chargé.

Y a-t-il une prise qui peut être placée dans le routeur pour modifier où render cherchera ses modèles?

+0

Le fichier 'index.html.eex' français est-il stocké dans le même dossier (avec un nom de fichier différent) ou séparé? Avez-vous un module View séparé pour chaque traduction pour chaque contrôleur? – Dogbert

+0

Je prévoyais d'avoir 2 dossiers dans le répertoire des modèles.Un pour tous les modèles anglais et l'autre qui contiendra tous les modèles français – RobStallion

Répondre

0

Tout d'abord je vous suggère d'utiliser Gettext pour utiliser des étiquettes pour les pages en français. Par exemple, vous pouvez conserver tous les modèles français dans les mêmes dossiers (pour ne pas modifier la logique d'affichage), mais pour les nommer avec un suffixe, par exemple. "index_fr.html.eex" etc. et alors vous pouvez écrire une aide assez simple (pas nécessairement une prise) qui ajoutera à tous vos templates ce suffixe.

Cependant, je vous recommande d'utiliser Gettext - le code source du template est seulement en place et presque toute la logique Gettext se charge pour vous.

0

Je vous suggère de choisir la réponse de @ patnowak. Utilisez Gettext, c'est l'outil fait pour la traduction et est assez puissant.

Si vous voulez toujours le faire, rappelez-vous render/3 dans les fonctions de contrôleur render/2 définies dans les vues, si elles sont définies. Sinon, il exécute la fonction de rendu par défaut et recherche le modèle. Lisez docs pour plus d'informations.

Ainsi, par exemple, cela est le contrôleur:

def index(conn, params) do 
    # defined assigns as you wish 
    render(conn, "index.html", assigns) 
end 

Maintenant, définir ce dans la vue:

def render("index.html, assigns) do 
    case assigns[:lang] do 
    "fr" -> render("index_fr.html", assigns) 
    _others -> render("index_en.html", assigns) 
    end 
end 

Vous pouvez également écrire un bouchon pour mettre automatiquement :lang dans cessionnaires:

def lang_plug(conn, opts) do 
    conn 
    |> fetch_query_params() 
    |> (fn cn -> assign(cn, :lang, cn.query_params[:lang] || "en").() 
end 

Regardez Plug.Conn pour voir les documents de fetch_query_params/1 et assign/3, et aussi d'autres fonctions pour récupérer la langue d'autres endroits comme les en-têtes ou le corps.

Vous avez l'idée. Dans la fiche, remplissez les affectations avec :lang, récupérez-les dans votre fonction de rendu définie et agissez correctement.

Toujours, Ne le faites pas. Utiliser Gettext est la bonne façon.