I18n 如何在视图中获取翻译后的模型名称

I18n how to get translated model name in views

我在页面中有一个 header,我想在其中显示如下内容:

'Aanpassen bewoner' 'Aanpassen gebruiker'

'Aanpassen' 是编辑的荷兰语。 'bewoner'、'gebruiker' 翻译成 class 高级用户的名字。

我已经翻译了文件中的活动记录 classes:

nl:
  activerecord:
    models:
      user:
        one: 'Gebruiker'

有没有办法在视图中(或在助手 class 中)编写一次 header,以便它采用当前正在显示的模型并显示翻译?理想情况下,我只有一行代码,我可以在所有 classes 的所有编辑视图中使用(当然只要它们被翻译)。

你可以尝试从当前的控制器名称猜测当前的型号(我认为这是最难的部分)然后你可以尝试I18n它。下面的助手就是这样做的:

# application_helper.rb
def translated_model_name(model = controller_name)
  model_class = model.to_s.singularize.camelize
  Object.const_defined?(model_class) ? model_class.constantize.model_name.human : model.to_s
end

助手尝试猜测模型名称,然后使用 model_name.human 方法进行翻译(参见 docs)。它可以通过这种方式在您的模板中使用:

# e.g. in users/index.html.erb
<%= translated_model_name %>
# => prints translation for the :user model

# whereas in seniors/show.html.erb
<%= translated_model_name %>
# => prints translation for the :senior model

如果无法从控制器名称中自动猜出模型名称,您可以使用辅助程序的参数覆盖它:

# e.g. in some_non_model_path/index.html.erb
<%= translated_model_name(:user) %>
# => prints translation for the :user model

对此使用#underscore。请参阅词形变化模块。所以在控制器中,

underscore(your_object.model.to_s)

会将 YourTerrificModel 转换为 your_terrific_model。翻译:

I18n::t("activerecord.model.#{underscore(your_object.model.to_s)}", count: 1)

将为您提供 class 的翻译名称。计数 > 1 或计数 == 0 将为您提供其他形式。