2011-03-10 56 views
14

如果你按照I18N Rails Guide,所有生成的鏈接都包含locale參數(localhost/en/about,localhost/fr/about)。這是因爲我們使用的方法default_url_options總是添加的語言環境參數:如何避免在生成的URL中添加默認的語言環境?

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

是否有可能從生成的URL刪除區域設置參數時的語言環境是未知或默認的?

我需要什麼:

  • 地點未知:mysite/about
  • 區域en:mysite/about(而不是localhost/en/about
  • 區域fr:mysite/fr/about

我試圖只設置如果它不是默認的locale,但結果是生成的鏈接永遠不會包含區域設置參數...

我想這樣的一個

def default_url_options(options={}) 
    if I18n.locale == :fr 
    { :locale => I18n.locale } 
    else 
    { :locale => nil } 
    end 
end 

全碼的東西:

ApplicationController.rb:

before_filter :set_locale 
def set_locale 
    I18n.locale = params[:locale] 
end 

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

的routes.rb

scope "(:locale)", :locale => /en|fr/ do 
    match 'about' => 'static_pages#about', :via => :get 
    match 'contact' => 'static_pages#contact', :via => :get 
    match '/' => 'search#index', :as => :search 
end 

root :to => 'search#index' 
+0

如果你不想通過URL來傳遞它,你應該考慮將其存儲在會話或餅乾。 – apneadiving 2011-03-10 20:30:45

+0

當前的語言環境是默認設置時,我不想在URL中傳遞它。如果這不是默認設置,則可以在url中使用它。 – Tom 2011-03-11 07:31:18

回答

7

好吧,我明白好多了。事實上,你幾乎做到了。

你只需要在Ruby中一個非常有用的操作:||

如果第一個值存在,它的使用,否則第二個參數被考慮在內。

def set_locale 
    I18n.locale = params[:locale] || :en 
end 
+0

它的工作原理!我認爲如果不支持區域設置,那麼將nil或其他設置設置爲I18n.locale將被忽略,否則nil將被重置爲默認區域設置。顯然,情況並非如此。非常感謝您的回答! – Tom 2011-03-11 14:43:34

-2

我知道這確實不是你的問題,但...

我更喜歡另一種方式爲internationalisations:從域名

設置語言環境例如:mysite.com/about,mysite.fr/about

對我來說這是最好的方法,但是你需要購買所有的d omains。

+4

是的,我們希望避免購買所有域名。 – Tom 2011-03-11 14:43:02

+2

不要將語言和區域設置與國家混淆。 – molf 2013-04-24 08:46:29

21

選擇的答案是完全正確的,並提供您需要重定向的URL沒有一個區域,以默認的語言環境的一切,但我想要做的東西多一點,並想我會與大家分享。

我想,以避免在所有使用默認的語言環境,也就是說

  • mysite.com/en/page應該是一樣的
  • mysite.com/page

,距離觀看時,所有鏈接默認的語言環境不應該包含語言環境,這意味着mysite.com應該有不包含缺省語言環境(en)的鏈接。取而代之的mysite.com鏈接到

  • mysite.com/en/page應該通過以下編輯鏈接到
  • mysite.com/page

我實現這default_url_options

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

您必須配置定義config.i18n.default_locale/application.rb這個工作。您還可以通過config.i18n.fallbacks = [ :en ]爲不受支持的語言環境指定回退,其中該數組是備用語言的優先級排序列表。

+0

您不認爲您會從Google的角度重複內容(相同的內容存在於兩個不同的位置)嗎? – Tom 2012-03-26 11:33:58

1

軌道4 + https://github.com/svenfuchs/routing-filter

def set_locale 
    I18n.locale = params[:locale] || I18n.default_locale 
end 

def default_url_options(options = {}) 
    (I18n.locale.to_sym.eql?(I18n.default_locale.to_sym) ? {} : {locale: I18n.locale}).merge options 
end 
相關問題