2014-12-05 2 views
2

다국어 레일 앱을 개발 중이며 각 로케일마다 경로가 달라야합니다. 그것은 나를 위해 이런 식으로 설명하기 어려운, 그래서 예를 들어 사용합니다 : 로케일을 기반으로 한 레일 경로

  • 말이지 가격/EN/:

    • 욕실을/ES/precios

    나는이 대답을 발견 : Rails 4 i18n, how to translate routes where subdomain is used for the locale

    그러므로 내 routes.rb은 다음과 같습니다 : 나는 또한 012을 사용하고

    scope "/:locale" do    
        get "/", to: "pages#index", as: "index" 
        get "/#{I18n.t("pricing")}", :to => "pages#pricing", :as => "pricing" 
    end 
    

    응용 프로그램을로드 할 때 (응용 프로그램 컨트롤러 before_action), 로캘이 변경된 직후/locale 다음의 나머지 URI가 그대로 유지됩니다. 사용자가 더 이상 존재하지 않아 페이지를 다시로드하려고하면 문제가 발생합니다. 다른 로케일 URI를 가진 다른 클릭은 괜찮습니다.

    나는 현재의 URI가 올바른지 아닌지 알아내는 시스템을 생각하고 있지 않다면 거기로 리다이렉트하지만, 이것은 차선책이라고 생각한다. 의견 있으십니까?

    미리 감사드립니다.

  • 답변

    -1

    나는이 문제에 대한 해결책을 원숭이 패치했습니다. 로케일 설정 직후 응용 프로그램 컨트롤러에 before_action confirm_path을 설정하면됩니다.

    def confirm_path 
        current_path = Rails.application.routes.recognize_path(request.env['PATH_INFO']) 
        MyApp::Application.reload_routes! 
        correct_url = url_for(controller: current_path[:controller], action: current_path[:action]) 
        if correct_url != request.original_url 
        redirect_to correct_url, status: 301 
        end 
    end 
    

    나는이 답변을 권장하지 않으며 이상적이지 않다는 것을 알고 있습니다. @dgilperez가 언급 한 것처럼 보석을 대신 사용하십시오. 나는 누군가가 상황에 처해있을 때 당신의 코드를 리팩토링하기에는 너무 늦었을 때를 대비해 게시하고있다.

    1

    생산 사이트 (Qoolife is an example you can check)에서 잠시 동안이 정확한 목적을 위해 rails-translate-routes 보석을 사용해 왔습니다.

    I18n을 번역 백엔드로 사용하는 경우 제대로 작동합니다. 프로젝트에서 gettext도 사용하는 경우 my fork of the gem을 확인하십시오. 또는 route_translator 보석을 살펴볼 수도 있습니다. 그 중 어떤으로

    이 코드는 매우 유사합니다 :

    # config/routes.rb 
    ActionDispatch::Routing::Translator.translate_from_file('config/locales/routes.yml') 
    
    # config/locales/routes.yml 
    en: 
        routes: 
        # you can leave empty locales, for example the default one 
    es: 
        routes: 
        pricing: precios 
    

    그런 다음 당신은 당신의 locale 경로 제약 조건을 사용하여 하위 도메인에서 또는 ApplicationController에 설정해야합니다. 이 부분이 논의되는 곳인 this issue을보십시오.

    +0

    불행히도 이상적인 해결책이 아니므로 보석이 필요하고 전체 구조를 재 작업해야합니다. 이상적으로 사용자가 다른 로케일을 클릭하면'reload_routes!'가 호출되어야합니다. 이것에 대한 해킹을 제안 해 주시겠습니까? 감사합니다 – kellins

    +0

    나는 * 해킹 *에 잘 테스트 된 보석을 사용하는 것을 선호합니다. 사실 "재 작업"이 아닌 "리팩터링"이라고 생각하는 것이 매우 행복 할 것입니다 ... 또한 사용자가 리소스에 접근 할 때마다''reload_routes! ''를 호출하면 좋지 않을 것입니다. 그 방법을 사용하면, 또한 "재 작업"을해야합니다. 대신 네가 보석을 고려해 보라고 권하고 싶다. – dgilperez

    +0

    또한 하위 도메인 대신 경로에 로케일을 포함하는 것으로 가장하는 것으로 나타났습니다. 보석과 함께 상자에서 작동해야합니다. – dgilperez

    관련 문제