2011-09-11 24 views
0

我开始一个项目,并计划使用en.yml文件保持字符串分离。我保持由控制器和行动,即组织的字符串:Rails - 如何在调用“render”时确定原始控制器和操作?

en: 
    users: 
    new: 
     title:      "Sign up" 
     email_label:     "E-mail address:" 
     password_label:    "Password:" 
     password_confirmation_label: "Password confirmation:" 
     submit:      "Sign up" 

我希望写的作品在哪里它正在从这样我可以只是调用s("email_label")而不是t("users.new.email_label")称为方法:

def s(str, locals{}) 
    t("#{params[:controller]}.#{params[:action]}.#{str}", locals) 
end 

这对于用户/新页面非常有用,但是在处理“创建”操作时,如果它失败,它会在内部调用render 'new'。重新呈现的页面然后将在'users.create'中而不是'users.new'中查找字符串。

有没有办法解决这个问题,而不覆盖params [:action]的值,或者在每个视图的顶部手动设置变量?

在此先感谢

+0

如果您希望通过控制器/操作来确定您的CSS范围,则会出现同样的烦恼。我希望有人有一个答案! – cailinanne

回答

1

不是答案原来的问题,但也许是一个选择吗?

为什么不只是有:new_title:edit_title,等等,则显式调用他们的翻译?

这样做可能是不正确的,正如您遇到的问题所证明的那样。你不是在寻找基于行动的翻译,而是真的通过模板。即使这可能是情境。另外,是否还会有模板翻译为updatecreate?可能不会,因为他们不呈现模板(您的问题)。

另外,如果你以后想要一个表单在不同的页面上创建记录呢?例如。由帖子控制器处理的“帖子”页面上的“新评论”表格。事情会变得毛茸茸的。

看起来您可以通过为您知道存在的密钥提供翻译并明确调用它们来获得更多控制权。

# translations 
en: 
    users: 
    new_title: Sign Up 
    edit_title: Edit User 
    index_title: Users 

# new.html.erb (and so on) 
<%= title s(:new_title) %> 
... 

# controller helper method 
def s(key, locals = {}) 
    I18n.t key, locals.merge(:scope => controller_name) 
end 

此外,您可能已经知道这一点,但标签佣工在使用模式转换,这可能有助于避免重复定义国际化出炉。这些也将是用于生成错误中的属性名称的翻译。例如。

en: 
    attributes: 
    # globally defined attribute translations 
    password: Password 

    activerecord: 
    attributes: 
     user: 
     # per model overrides 
     password: User Password 

# The label helpers then use these (this label would translate to "User Password") 
= form_for(@user) do |f| 
    = f.label :password 

根据记录是否持久存在,还有按钮助手的动态翻译。取决于您如何处理注册,这可能会或可能不会干净利落地开箱即用。如果你的注册只是创建用户,它应该。

en: 
    helpers: 
    user: 
     create: "Sign Up Now!" 
     update: "Update User!" 

# This label would translate to "Sign Up Now!" 
= form_for(User.new) do |f| 
    = f.submit 
相关问题