Rails 5.1.4 | I18N:带空格的模型属性翻译异常问题
问题分析与解决
这不是Bug,是你不小心触发了重复翻译逻辑导致的问题,我给你拆解下其中的缘由:
问题根源
你写的代码<%= t(User.human_attribute_name("phone_number")) %>其实做了两次翻译相关的操作:
- 首先
User.human_attribute_name("phone_number")会自动读取你en.yml里activerecord.attributes.user.phone_number的配置,直接返回你设置的"Phone number"。 - 接着你把这个返回的字符串传给了
t()方法,t()会尝试去查找键为"Phone number"的翻译项,但你的配置里根本没有这个键,所以就弹出了那个translation_missing的提示框。
而当你把翻译改成单单词"Phonenumber"时,human_attribute_name返回"Phonenumber",此时t("Phonenumber")因为找不到对应翻译,会触发Rails的默认兜底逻辑——直接返回原字符串,所以看起来正常,但这其实是巧合,并非正确用法。
正确的两种写法
你只需要二选一就行:
- 直接用
human_attribute_name(这个方法本身就是用来获取模型属性人性化名称的,已经内置了翻译逻辑):<%= User.human_attribute_name("phone_number") %> - 或者直接用
t()传入完整的翻译键:<%= t("activerecord.attributes.user.phone_number") %>
这两种写法都能正确渲染出"Phone number",不会再出现翻译缺失的提示。
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

