2016-05-09 5 views
0

私はRailsチュートリアルサンプルアプリケーションで国際化を実装しようとしています。ログインしたときにurlからログインし、ログインしたときにユーザープロフィールを国際化するには?

各ユーザーのロケール属性と、myurl.com/enmyurl.com/esのようなURLローカライズを管理することができました。ポイントは、両方のメソッドを組み合わせて、ユーザーがログアウトしたときにURLパラメータとアプリケーションを国際化する方法です。そうでない場合は、自分の好みを使用します。

私はこれまでのところ、これを持っています。この時点で、利用者の嗜好は、URLのparamが上書きされますが、ユーザーはes言語を選択し、コンテンツがスペイン語で表示されているmyapp.com/enに移動した場合。マイビューのコードはこのように見える私は、ユーザーがログインしている場合はURLがそのPARAMを持っていたい。

# application_controller.rb 
class ApplicationController < ActionController::Base 
    include SessionsHelper 
    before_action :set_locale 

    def default_url_options(options = {}) 
    {locale: I18n.locale}.merge options 
    end 

    def set_locale 
    I18n.locale = (current_user&.locale) || params[:locale] || I18n.default_locale 
    end 
end 

# users_controller.rb 
def change_locale 
    user = current_user 
    user.locale = params[:locale] 
    user.save 
    redirect_to request.referer 
end 

# routes.rb 

post 'international/:locale' => 'users#change_locale', as: 'international' 
scope "(:locale)", locale: /en|es/ do 
    # All my routes 
end 
get '/:locale' => 'static_pages#home' # Fix the home route 

# _footer.html.erb 
... 
<li> 
    <%= link_to t('spanish'), international_path(locale: :es), :method => :post %> 
</li> 
<li> 
    <%= link_to t('english'), international_path(locale: :en), :method => :post %> 
</li> 
... 

I18n.available_locales出力

[:en, :"da-DK", :"en-GB", :he, :"en-NZ", :"en-au-ocker", :uk, :"en-CA", :ja, :"en-BORK", :"zh-CN", :ru, :de, :"en-AU", :"de-AT", :pl, :"ca-CAT", :fr, :"fi-FI", :vi, :"en-UG", :nl, :"en-SG", :nep, :pt, :ko, :es, :sv, :ca, :"de-CH", :"zh-TW", :sk, :"en-IND", :it, :"en-US", :"pt-BR", :fa, :"nb-NO"] 

(今のところ唯一の2つのリンクがあります)

<li> 
    <%= link_to "Español", international_path(locale: :es), :metho d => :post %> 
</li> 
<li> 
    <%= link_to "English", international_path(locale: :en), :method  => :post %> 
</li> 

PryRplのデバッグ: 私がログインしている:私は手動でURLを記述する場合、それは常に私が書くどのURLにもかかわらず、ユーザー保存された言語に行きます。それはユーザー県に格納された新しい言語をロードするので、ユーザの嗜好が変更された:それは常に私がログインしていると私は、明示的なビューのロケールリンク(上記の1)をクリックして、ユーザの嗜好(:enまたは:es) を表示します。 私がログインしていないとき:URLパラメータを使用します。

+0

あなたはset_locale機能にbinding.pryまたは同様のデバッガを入れて設定されている内容を確認することができますか?これはいくつかの問題であり、あなたが投稿したものからは分かりません。これは純粋なレールアプリケーションですか?あなたのビューはどのように見えますか? I18n.available_localesの出力は何ですか? –

+0

質問が更新されました。あなたはbinding.pryについて教えてくれますか?なぜ私の問題に関する情報を提供するためにそれを使うことができるのですか?ありがとうございました。てこデバッグについてruby_newbie –

+0

http://pryrepl.org/ –

答えて

0

は、溶液中に同僚に感謝を発見しました。

def set_locale 
    # Change current_user&.locale to enable ruby <2.3 compatibility 
    I18n.locale = (current_user.locale if current_user) || params[:locale] || I18n.default_locale 
    redirect_to locale: I18n.locale if request.get? && params[:locale] != I18n.locale.to_s 
end 

誰かがより良い解決策を知っている場合は、回答を投稿してください。

関連する問題