2017-07-28 22 views
5

Tôi có ứng dụng Phoenix mặc định. Ứng dụng này sẽ có một số page_controller sẽ tải tệp index.html.eex.Chuyển đổi giữa 2 hoặc nhiều mẫu với một hành động trong bộ điều khiển?

Ứng dụng sẽ biết sử dụng view để truy cập templates/page/index.html.eex.

Bây giờ, bạn đã tạo một trang html khác giống hệt với index.html.eex theo mọi cách ngoại trừ bằng tiếng Pháp.

Vì chúng tôi không muốn tạo một ứng dụng Phoenix hoàn toàn mới có cùng mã, ngoại trừ bản dịch tiếng Pháp của page/index.html.eex hiện tại, có cách nào để cho biết chế độ xem hoặc bộ điều khiển cần được tải.

Có một phích cắm có thể được đặt trong bộ định tuyến để thay đổi vị trí render sẽ tìm mẫu của nó không?

+0

Pháp 'index.html.eex' được lưu trữ trong cùng một thư mục (có tên tệp khác) hay một tệp riêng biệt? Bạn có mô-đun Xem riêng biệt cho mỗi bản dịch cho mỗi bộ điều khiển không? – Dogbert

+0

Tôi dự định có 2 thư mục trong thư mục mẫu.Một cho tất cả các mẫu tiếng Anh và mẫu còn lại chứa tất cả các mẫu tiếng Pháp – RobStallion

Trả lời

0

Trước hết, tôi khuyên bạn nên sử dụng Gettext để sử dụng nhãn cho các trang tiếng Pháp.

Ví dụ bạn có thể tất cả các mẫu tiếng Pháp giữ trong cùng một thư mục (không thay đổi logic cho chế độ xem), nhưng để đặt tên chúng với hậu tố ví dụ. "index_fr.html.eex" vv và sau đó bạn có thể viết helper khá đơn giản (không nhất thiết phải là một plug) mà sẽ thêm vào tất cả các mẫu của bạn hậu tố này.

Tuy nhiên, tôi khuyên bạn nên sử dụng mã nguồn của Gettext - mẫu chỉ có tại chỗ và hầu như tất cả logic Gettext xử lý cho bạn.

0

Tôi đề nghị bạn chọn câu trả lời của @ patnowak. Sử dụng Gettext, đó là công cụ làm cho dịch thuật và đủ mạnh.

Nếu bạn vẫn muốn làm điều đó, hãy nhớ render/3 trong các cuộc gọi điều khiển render/2 chức năng được xác định trong chế độ xem, nếu được xác định. Nếu không, nó chạy chức năng hiển thị mặc định và tìm mẫu. Đọc docs để biết thêm thông tin.

Vì vậy, ví dụ, đây là bộ điều khiển:

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

Bây giờ, định nghĩa này trong giao diện:

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

Bạn cũng có thể viết một plug để tự động đưa :lang vào chuyển nhượng:

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

Nhìn Plug.Conn để xem tài liệu của fetch_query_params/1assign/3 cũng như các chức năng khác để tìm nạp ngôn ngữ từ các địa điểm khác như tiêu đề hoặc phần thân.

Bạn hiểu ý tưởng. Trong trình cắm, hãy gán các chỉ định với :lang, tìm nạp chúng bên trong hàm render được xác định của bạn và hành động phù hợp.

Tuy nhiên, Đừng làm điều này. Sử dụng Gettext là cách thích hợp.

Các vấn đề liên quan