2017-07-28 79 views
5

Mam domyślną aplikację Phoenix. Ta aplikacja będzie miała page_controller , która załaduje plik index.html.eex.Przełącz między co najmniej 2 szablonami za pomocą akcji w kontrolerach?

Aplikacja będzie znała numer view, aby uzyskać dostęp do templates/page/index.html.eex.

Powiedzmy, że utworzyłeś inną stronę HTML, która jest identyczna z index.html.eex pod każdym względem, z wyjątkiem tego, że jest w języku francuskim.

Ponieważ nie chcemy tworzyć zupełnie nowej aplikacji Phoenix, która będzie miała ten sam kod, z wyjątkiem francuskiego tłumaczenia bieżącego page/index.html.eex, czy istnieje sposób, aby powiedzieć widok lub kontroler, który plik musi być załadowany.

Czy istnieje wtyczka, którą można umieścić w routerze, aby zmienić miejsce, w którym render będzie szukać szablonów?

+0

Czy francuski "index.html.eex" jest przechowywany w tym samym folderze (z inną nazwą) lub osobnym? Czy masz osobny moduł Widok dla każdego tłumaczenia dla każdego kontrolera? – Dogbert

+0

Planowałem mieć 2 foldery w katalogu szablonów.Jeden dla wszystkich angielskich szablonów i drugi, który będzie zawierał wszystkie francuskie szablony – RobStallion

Odpowiedz

0

Przede wszystkim sugeruję używanie Gettext do używania etykiet na stronach francuskich.

Na przykład możesz wszystkie francuskie szablony przechowywać w tych samych folderach (aby nie zmieniać logiki widoku), ale aby nadać im nazwy z sufiksem np. "index_fr.html.eex" itd., a następnie możesz napisać całkiem prostą helperkę (niekoniecznie wtyczkę), która doda do wszystkich twoich szablonów ten sufiks.

Mimo to, polecam użyć Gettext - kod źródłowy szablonu jest tylko na miejscu i prawie wszystkie logiki obsługi Gettext dla Ciebie.

0

Proponuję wybrać odpowiedź @ patnowaka. Użyj Gettext, to narzędzie do tłumaczenia i jest wystarczająco potężne.

Jeśli nadal chcesz to zrobić, zapamiętaj render/3 w wywołaniach kontrolera render/2 funkcje zdefiniowane w widokach, jeśli są zdefiniowane. Jeśli nie, uruchamia domyślną funkcję renderowania i szuka szablonu. Przeczytaj docs, aby uzyskać więcej informacji.

Tak na przykład, jest to kontroler:

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

Teraz określić to w widoku:

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

Można również napisać wtyczkę automatycznie umieścić :lang do cesjonariuszy:

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

Poszukaj Plug.Conn, aby zobaczyć dokumentację fetch_query_params/1 i assign/3, a także inne funkcje do pobierania języka z innych miejsc, takich jak nagłówki lub treści.

Wpadłeś na pomysł. W wtyczce wypełnij przypisania przy pomocy :lang, pobierz je wewnątrz zdefiniowanej funkcji renderowania i wykonaj odpowiednie czynności.

Nadal, Nie rób tego. Używanie Gettext jest właściwym sposobem.