1

現在、ロケール (/en、/fr など) を必要とするルーティングがあります。ある時点で、routes.rb で以下のすべてのステートメントを使用しました。

scope "/:locale", locale: /#{I18n.available_locales.join("|")}/ do

scope "/:locale", defaults: { :locale => "en" } do

scope "/:locale" do

ルートにロケールが含まれていない場合、次のようにすると、英語版の Web サイトを指すことがわかります。ただし、ページが表示されると、希望どおりにロケールが設定されません。ロケール ロジックをクリックしてフランス語版に移動すると、最初のリンクにフランス語版のページが表示され、リンクに /fr が含まれます。ただし、フランス語のページで別のリンクをクリックすると、ロケールがリンクから除外されて英語に戻ります。

scope "(/:locale)", defaults: { :locale => "en" } do

ユーザーがフラグの画像またはテキストをクリックしてロケールを変更できるアプリケーションのロケール リンクのコードを次に示します。

<%= link_to_unless_current image_tag("english.jpg", alt: "#{t :english}"), locale: "en" %> <%= link_to_unless_current "#{t :english}", locale: "en" %>
<%= link_to_unless_current image_tag("french.jpg", alt: "#{t :french}"), locale: "fr" %> <%= link_to_unless_current "#{t :french}", locale: "fr" %>

私がやりたいことは、Web サイトがローカライズされる前に誰かがリンクを保存した場合に、500 システム エラーが発生しないようにすることです。たとえば、http://mywebsite.com/videoがある場合、Web サイトの英語版が表示され、ロケールが「en」に設定されます。

これがapplication_controller.rbにあるコードです。

  before_filter :set_locale

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

  private
    def set_locale
      I18n.locale = (params[:locale] if params[:locale].present?) || cookies[:locale] || 'en'
      cookies[:locale] = I18n.locale if cookies[:locale] != I18n.locale.to_s
    end

この特定の問題については、routing-filter gem を使用する以外に何も見つかりません。私はこの宝石を使用していましたが、Rails 4 用の宝石の製品版が登場するまで、このルーティングの問題を解決する以外に選択肢はありません。

どんな助けでも大歓迎です。

4

1 に答える 1

1

あなたの質問はややこしいと思います...だから私の答えはあなたのコードのいくつかの部分を参照します。おそらく、問題を解決するのに十分なコンテキストが得られます。

  1. ロケールに 3 つのルートを使用しないでください

1 つのルートで十分です。国際化のガイドをお読みください。

レガシーURLをサポートしたいので、オプションのアプローチを使用する必要があると思います:

scope "(/:locale)" {}

  1. config.default_localeオプションを使用する

構成では、ローカリゼーションのフォールバックを構成できます。

  1. 混ぜないdefault_url_optionscookies

ロケールを追跡するために Cookie を使用している場合は、default_url_options.

URL が必要な場合domain.com/en/somethingは、その逆を行います。Cookie の使用を避け、どこでも URL を使用し、従来の URL からアクセスするユーザーをリダイレクトします。

于 2013-10-21T12:57:43.133 に答える