我正在启动一个项目,并计划使用en.yml文件保持字符串分离。我保持由控制器和动作组织的字符串,即:
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 :(得分:1)
不是原始问题的答案,但可能是另一种选择?
为什么不只是为:new_title
,:edit_title
等翻译,然后明确地调用它们?
通过操作执行操作可能不正确,正如您所遇到的问题所证明的那样。你不是在寻找基于行动的翻译,而是通过模板。甚至那可能是情境性的。此外,是否会有update
或create
的模板翻译?可能不是,因为他们不渲染模板(你的问题)。
另外,如果您以后想要一个表单在另一个页面上创建记录,该怎么办?例如。由帖子控制器处理的“帖子”页面上的“新评论”表格。事情可能变得毛茸茸。
通过为您知道存在的密钥提供翻译并明确地调用它们,您似乎可以获得更多控制权。
# 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
此外,您可能已经知道这一点,但标签助手已经使用模型翻译进行了i18n烘焙,这可能有助于避免重复定义。这些也将是生成错误中用于属性名称的翻译。 E.g。
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