5

Tôi cảm thấy như tôi đang thiếu một cái gì đó thực sự đơn giản và tôi tiếp tục quay bánh xe của tôi về vấn đề này.Quốc tế hóa các trang tĩnh với Rails

Tôi hiện đang quốc tế hóa hoạt động trong suốt ứng dụng của mình. Các bản dịch hoạt động và các tuyến hoạt động hoàn hảo. Ít nhất, hầu hết trang web hoạt động ngoại trừ các tuyến đường đến hai trang tĩnh của tôi, các trang "Giới thiệu" và "Câu hỏi thường gặp" của tôi.

Mỗi liên kết khác trong toàn bộ ứng dụng trỏ đến tuyến đường được bản địa hóa thích hợp. Ví dụ: nếu tôi chọn "tiếng Pháp" làm ngôn ngữ của tôi, các liên kết sẽ trỏ đến "(/:locale)/controller(.:format) thích hợp". Tuy nhiên, bất chấp những thay đổi tôi thực hiện trong suốt ứng dụng, liên kết của tôi cho "Giới thiệu" và "Câu hỏi thường gặp" từ chối trỏ đến "../fr/static/about" và luôn trỏ đến "/ static/about".

Để làm cho những vấn đề xa lạ hơn, khi tôi chạy các tuyến đường rake tôi thấy: "các trang GET (/:locale)/static/:permalink(.:format) # show {: locale =>/en | fr /}"

và khi tôi nhập thủ công "../fr/static/about" trang sẽ dịch hoàn hảo.

Tuyến My file:

devise_for :users 

scope "(:locale)", :locale => /en|fr/ do 
    get 'static/:permalink', :controller => 'pages', :action => 'show' 

    resources :places, only: [:index, :show, :destroy] 
    resources :homes, only: [:index, :show] 

    match '/:locale' => 'places#index' 
    get '/'=>'places#index',:as=>"root" 
end 

ApplicationController của tôi:

before_filter :set_locale 

def set_locale 
    I18n.locale=params[:locale]||I18n.default_locale 
end 
def default_url_options(options={}) 
    logger.debug "default_url_options is passed options: #{options.inspect}\n" 
    { :locale => I18n.locale } 
end 

và Trang My Bộ điều khiển:

class PagesController < ApplicationController 
    before_filter :validate_page 
    PAGES = ['about_us', 'faq'] 

    def show  
    render params[:permalink] 
    end 

def validate_page 
    redirect_to :status => 404 unless PAGES.include?(params[:permalink]) 
end 
end 

Tôi sẽ rất biết ơn sự giúp đỡ nào ... đó là chỉ là một trong những ngày đó.

Chỉnh sửa: Cảm ơn Terry vì đã chạy bộ để đưa vào chế độ xem.

<div class="container-fluid nav-collapse"> 
    <ul class="nav"> 
     <li class="dropdown"> 
     <a href="#" class="dropdown-toggle" data-toggle="dropdown"><%= t(:'navbar.about') %><b class="caret"></b></a> 
      <ul class="dropdown-menu"> 
      <li><%=link_to t(:'navbar.about_us'), "/static/about_us"%></li> 
      <li><%=link_to t(:'navbar.faq'),  "/static/faq"%></li> 
      <li><%=link_to t(:'navbar.blog'),  '#' %></li> 
      </ul> 
     </li> 
+0

Chế độ xem hiển thị liên kết như thế nào? –

Trả lời

3

Bạn nên đặt tên cho con đường của bạn bằng cách "là":

scope "(:locale)", :locale => /en|fr/ do 
    get 'static/:permalink', to: 'pages#show', as: :static 

Và sau đó theo quan điểm xây dựng liên kết với những người giúp đỡ định tuyến (ROUTE_NAME _path):

<li><%=link_to t('navbar.about_us'), static_path(permalink: "about_us") %></li> 

helper này tự động thêm ngôn ngữ hiện tại vào đường dẫn.

Để lấy danh sách tất cả các tuyến có tên sử dụng các tuyến đường rake lệnh điều khiển.

Chúc may mắn!

+0

Điều này thật hoàn hảo - cảm ơn rất nhiều cho câu trả lời! Rất tiếc, đã mất quá nhiều thời gian để phê duyệt, chỉ cần tham gia để thử thay đổi chiều nay. – Gavin

1

Thú vị. Kết thúc giải quyết vấn đề này bằng cách sử dụng url_for trong giao diện:

<div class="container-fluid nav-collapse"> 
<ul class="nav"> 
    <li class="dropdown"> 
    <a href="#" class="dropdown-toggle" data-toggle="dropdown"><%= t(:'navbar.about') %><b class="caret"></b></a> 
     <ul class="dropdown-menu"> 
     <li><%=link_to t(:'navbar.about_us'), url_for('static/about_us')%></li> 
     <li><%=link_to t(:'navbar.faq'),  url_for('static/faq')%></li> 
     <li><%=link_to t(:'navbar.blog'),  '#' %></li> 
     </ul> 
    </li> 

Cá nhân tôi đã không bao giờ sử dụng url_for, vì vậy tôi không chắc chắn nếu điều này là giải pháp duyên dáng nhất, tuy nhiên tôi rất hạnh phúc vì nó hoạt động!

Chỉnh sửa: Thực tế quay lại mã, điều này tạo ra kết quả thực sự không tốt. Nó hoạt động từ root_url và hầu hết các đường dẫn khác, tuy nhiên nếu đường dẫn hiện tại là/fr/static/about_us hoặc/fr/static/faq thì các dòng trên thực sự được gọi là "/ fr/static/static/about_us" hoặc "/ fr/static/static/faq "- được chỉnh sửa với:

<ul class="dropdown-menu"> 
      <% if request.fullpath == '/fr/static/about_us' or request.fullpath == '/fr/static/faq' %> 
      <li><%=link_to t(:'navbar.about_us'), url_for('/fr/static/about_us')%></li> 
      <li><%=link_to t(:'navbar.faq'),  url_for('/fr/static/faq')%></li> 
      <li><%=link_to t(:'navbar.blog'),  '#' %></li> 
      <% elsif request.fullpath == '/en/static/about_us' or request.fullpath == '/en/static/faq' %> 
      <li><%=link_to t(:'navbar.about_us'), url_for('/en/static/about_us')%></li> 
      <li><%=link_to t(:'navbar.faq'),  url_for('/en/static/faq')%></li> 
      <li><%=link_to t(:'navbar.blog'),  '#' %></li> 
      <% elsif request.fullpath == '/static/about_us' or request.fullpath == '/static/faq' %> 
      <li><%=link_to t(:'navbar.about_us'), url_for('/en/static/about_us')%></li> 
      <li><%=link_to t(:'navbar.faq'),  url_for('/en/static/faq')%></li> 
      <li><%=link_to t(:'navbar.blog'),  '#' %></li> 
      <% else %> 
      <li><%=link_to t(:'navbar.about_us'), url_for('static/about_us')%></li> 
      <li><%=link_to t(:'navbar.faq'),  url_for('static/faq')%></li> 
      <li><%=link_to t(:'navbar.blog'),  '#' %></li> 
      <%end%> 
      </ul> 

Chuyển sang một vấn đề khác ngay bây giờ, nhưng nếu có cách nào làm việc này thoải mái hơn. Có lẽ sẽ kiểm tra lại vấn đề này vào đầu tuần tới.

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