2009-09-09 66 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的肠子里有一半被卡住了。我现在将把我的“让它投票”编辑。 –