2017-07-28 11 views
5

私はデフォルトのPhoenixアプリケーションを持っています。このアプリはpage_controller となり、index.html.eexファイルが読み込まれます。2つ以上のテンプレートをコントローラ内のアクションで切り替えますか?

templates/page/index.html.eexにアクセスするにはviewを使用することがアプリで分かります。

ここでは、フランス語以外のすべての点でindex.html.eexと同じ別のhtmlページを作成したとします。

現在のpage/index.html.eexのフランス語の翻訳を除いて、すべて同じコードを持つ新しいPhoenixアプリケーションを作成したくないので、 ビューまたはコントローラにどのファイルロードする必要があります。

renderがテンプレートを探す場所を変更するためにルータに配置できるプラグはありますか?

+0

フランス語の「index.html.eex」は、同じフォルダ(別のファイル名)に保存されているのですか、別のファイルですか?各コントローラの翻訳ごとに別々のViewモジュールがありますか? – Dogbert

+0

私はテンプレートディレクトリに2つのフォルダを持つことを計画していました。1つはすべての英語テンプレート用で、もう1つはすべてのフランス語テンプレートを含みます – RobStallion

答えて

0

まず、フランス語のページにラベルを使用するためにGettextを使用することをお勧めします。

たとえば、すべてのフランス語のテンプレートは、(ビューのロジックを変更しないために)非常に同じフォルダに置くことができますが、接尾辞などで名前を付けることができます。 "index_fr.html.eex"など、あなたはすべてのテンプレートにこの接尾辞を追加する非常に単純なヘルパー(必ずしもプラグではない)を書くことができます。

でも、Gettextを使用することをお勧めします。テンプレートのソースコードは適切な場所にあり、ほとんどすべてのロジックGettextが処理します。

0

あなたは@ patnowakの答えを選ぶことをお勧めします。 Gettextを使用してください。これは翻訳のために作られたツールであり、十分強力です。

まだ実行したい場合は、定義されている場合はコントローラで関数が定義されているコントローラのrender/3を覚えておいてください。そうでなければ、デフォルトレンダリング機能を実行し、テンプレートを探します。詳細については、docsをお読みください。

だから例えば、これはコントローラです:今

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

、ビューでこれを定義します。

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

また、自動的に割り当てに:langを置くためにプラグを書くことがあります。

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

を参照してください。のドキュメントを参照してください。 0とassign/3と、ヘッダーやボディなどの他の場所から言語を取得するための他の関数もあります。

あなたは考えを得る。プラグでは、fillは:langで割り当てられ、定義されたレンダリング関数内でそれらをフェッチし、適切に動作します。

まだ、Do not do this。 Gettextの使用は適切な方法です。

関連する問題