2009-09-09 73 views
2

我使用的I18n internationnalization插件,但它不是翻譯1個資料片:驗證.rb驗證方法中的Rails I18n不起作用?

在我的控制器之一,我有一個驗證方法是這樣的:

# Verify user is authenticated 
    verify :only => [ :destroy, :create, :update, :new, :comment ], 
    :session => :user_id, 
    :add_flash => { :error => I18n.t(:'Exceptions.not_logged_in') }, 
    :redirect_to => { :controller => 'main' , :action => 'index' } 

但是,使用I18n.t( :'Exceptions.not_logged_in')總是顯示default_locale,在這個例子中是english。

我在我的Application_Controller中設置了一個設置語言環境的before_filter。

任何人都可以幫助我理解,並幫助我找到解決方法嗎?

謝謝!

PS:我嘗試添加一個電話都沒有成功這個驗證方法之前set_locale(在我的控制器)

回答

-1

我想可能有一些做與I18n.t調用中只運行一次當文件最初加載在應用程序啓動。你可以嘗試用Proc或lambda包裝它,也可以用一個單獨的方法。例如像這樣:

:add_flash => lambda { { :error => I18n.t(:'Exceptions.not_logged_in') } } 

不知道這是否可行,但它可能會讓你更接近。

+0

好主意,但它似乎拒絕在那裏有一個Proc。錯誤消息是「沒有marshal_dump是爲類Proc定義的」 – user62605

0

把呼叫到I18n.t在括號

add_flash => { :error => (I18n.t(:'Exceptions.not_logged_in')) }, 
4

由於verify是稱爲在類定義級別的一類方法中,作爲所述控制器被裝載其參數,包括I18n.t呼叫,進行評價。爲了使I18n.t正常工作,需要在每次執行相關控制器操作時對其進行評估。 verify無法做到這一點。

相反,我建議你過濾器之前使用:

before_filter :verify_session, :only => [:destroy, :create, :update, :new, :comment] 

def verify_session 
    unless session[:user_id] 
    flash[:error] = I18n.t('Exceptions.not_logged_in') 
    redirect_to :controller => 'main', :action => 'index' 
    end 
end 

另外,還要注意verify已被棄用,移動到Rails 3的插件,而之前的過濾器繼續工作。

1

翻譯是在錯誤的地方;該消息的翻譯版本嚴格地是用戶界面問題,所以翻譯應該在用戶界面級別發生。該FlashHash應該只包含某種錯誤條件標識符,用戶界面代碼應處理轉換,要什麼人能理解:

verify :only => [ :destroy, :create, :update, :new, :comment ], 
    :session => :user_id, 
    :add_flash => { :error => 'Exceptions.not_logged_in' }, 
    :redirect_to => { :controller => 'main' , :action => 'index' } 

然後,後來在一些ERB或什麼:

<% if flash[:error] %> 
    <p class="error"><%= I18n.t(flash[:error]) %></p> 
<% end %> 

這種方法還可以很容易地一路推錯誤ID爲REST客戶端或JavaScript前端,而不強迫他們處理分析不斷變化的錯誤信息:

if((flash.error || '') == 'Exceptions.not_logged_in') 
    sammy.setLocation('#/sign_in'); 

我不能成爲升級後錯誤處理代碼被破壞的唯一人員,因爲有人更改錯誤消息,並且沒有提供任何旨在被軟件而不是人類使用的錯誤機制。

+0

我想投票贊成,但顯然是因爲我認爲我以前投票過這個,它不會讓我這樣做,除非你先編輯一下。 – Behrang

+0

好吧,現在我能夠投票給你。但我記得前幾天我想投票給你,我錯誤地按下了投票按鈕,然後很快地按下了投票按鈕,它工作並解散了我的投票。但是當我試圖投票時,它並沒有讓我這樣做。等了幾天,沒有任何改變。所以可能是一個SO錯誤。 – Behrang

+0

@Behrang:是的,聽起來有些東西在SO的腸子裏有一半被卡住了。我現在將把我的「讓它投票」編輯。 –