我们经常在应用程序中偶然发现未翻译的模型属性.它们通常是因为某个属性被重命名或类似的东西而来.
当Model.human_attribute_name :field找不到翻译时让I18n引发错误会非常有帮助.有没有办法实现这个目标?
更新:
似乎还有其他一些问题.这是我的I18n设置:
I18n.enforce_available_locales = false
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
config.i18n.default_locale = 'de-CH'
config.i18n.available_locales = ['de', 'de-CH', 'en']
config.i18n.locale = 'de-CH'
config.i18n.fallbacks = {'de-CH' => 'de', 'en-GB' => 'en'}
Run Code Online (Sandbox Code Playgroud)
我无法设置,fallbacks = false因为我想要缺少de-CH优雅委托的翻译de,这通常似乎工作正常.但对于我的状态机属性human_to_state方法,它似乎不起作用.这是导致问题的视图代码:
= f.input :state_event, collection: f.object.state_transitions,
label_method: :human_to_name # This causes the problem!
Run Code Online (Sandbox Code Playgroud)
这在视图中打印为"状态事件",当我添加以下I18n键时,它成功转换为"状态":
de:mongoid:attributes:activity:state_event:Status
所以真的是一个漏译,但确实的I18n不以任何方式抱怨.我还尝试使用自定义异常处理程序捕获异常,但似乎没有引发:
I18n.exception_handler = lambda do |exception, locale, key, options|
binding.pry # This is never reached! …Run Code Online (Sandbox Code Playgroud) 在 Rails 中,我试图本地化日期:
2.1.1 :005 > Date.today
=> Mon, 14 Apr 2014
2.1.1 :006 > I18n.localize(Date.today)
=> "14/04/2014"
2.1.1 :007 >
Run Code Online (Sandbox Code Playgroud)
第二个输出不是第一个的正确翻译!
你能帮助我吗 ?
在我的测试中我使用了I18n#t很多。有没有办法让这个方法可用而不用前缀I18n(因为它在视图中是可能的)?
de:
date:
abbr_day_names:
- So
- Mo
- Di
- Mi
- Do
- Fr
- Sa
Run Code Online (Sandbox Code Playgroud)
但是尝试输出指南中描述的那天不起作用,似乎它format:在本地区中寻找a 也是如此?
I18n.locale = :de
l(Date.current, format: :abbr_day_names)
Run Code Online (Sandbox Code Playgroud)
"I18n :: MissingTranslationData:翻译缺失:de.date.formats.abbr_day_names"
目前,我有一些语言环境子目录,这些子目录已在配置中正确设置
config/application.rb
config.i18n.load_path += Dir["#{Rails.root.to_s}/config/locales/**/*.{rb,yml}"]
Run Code Online (Sandbox Code Playgroud)
我已经有2个语言环境文件,并且可以轻松获得翻译:
config/locales/admin/dashboard.en.yml
en:
dashboard:
title: Dashboard
config/locales/admin/dashboard.fr.yml
fr:
dashboard:
title: Tableau de bord
irb(main):014:0> I18n.locale = :en
=> :en
irb(main):015:0> I18n.t("dashboard.title")
=> "Dashboard"
irb(main):016:0> I18n.locale = :fr
=> :fr
irb(main):017:0> I18n.t("dashboard.title")
=> "Tableau de bord"
Run Code Online (Sandbox Code Playgroud)
现在,我在SAME子目录“ locales / admin”中添加了两个其他语言环境文件(与以前的文件非常相似...)。
# =============
config/locales/admin/sheet.en.yml
en:
sheet:
title: Sheet
config/locales/admin/sheet.fr.yml
fr:
sheet:
title: Table
Run Code Online (Sandbox Code Playgroud)
我重新启动服务器...并尝试成功获得新添加的翻译
irb(main):010:0> I18n.locale = :en
=> :en
irb(main):011:0> I18n.t("sheet.title")
=> "translation missing: en.sheet.title"
irb(main):012:0> I18n.locale = :fr
=> :fr
irb(main):013:0> I18n.t("sheet.title")
=> "translation missing: …Run Code Online (Sandbox Code Playgroud) 我有几个相关但又不同的 AR 模型,其中包含表示同一条数据的属性。当我为这些属性设置翻译时,我目前将它们设置为...
en:
activerecord:
attributes:
model_a:
assigned_date: "Assigned to worker"
model_b:
assigned_date: "Assigned to worker"
[ ... ]
Run Code Online (Sandbox Code Playgroud)
有没有办法以某种通配符方式定义一次这种翻译?
我认为最有意义的方法...
en:
activerecord:
attributes:
assigned_date: "Assigned to worker"
model_a:
[ model-specific translations here ]
Run Code Online (Sandbox Code Playgroud)
不起作用,因为 AR 显然正在寻找下层的模型名称 attributes
在我的语言环境控制台中,我可以通过I18n gem获得以下语言环境
> I18n.available_locales
=> [:en, :de, :es, :ja, :"pt-BR", :"zh-CN", :"zh-HK", :"zh-TW"]
Run Code Online (Sandbox Code Playgroud)
我尝试使用localize特定日期格式的英语-
> I18n.with_locale("en") { I18n.l(Time.zone.now, format: "%B, %Y") }
=> "April, 2016"
Run Code Online (Sandbox Code Playgroud)
哪个很棒。然后我用西班牙语和日语尝试相同的方法-
> I18n.with_locale("es") { I18n.l(Time.zone.now, format: "%B, %Y") }
=> "s, 2016"
> I18n.with_locale("ja") { I18n.l(Time.zone.now, format: "%B, %Y") }
=> "s, 2016"
Run Code Online (Sandbox Code Playgroud)
看来月份名称正在被翻译为"s"。
Rails I18n gem 绝对为上述语言环境定义了月份名称。该#localize方法是否甚至利用了这些方法,还是试图从其他地方提取?
谢谢!
我有以下 select_tag 并希望翻译标签。我正在使用 Rails 国际化 (I18n) API
现在,这段代码可以在我需要翻译选项标签时使用。
<%= select_tag "object",
"<option value=address>Address</option>
<option value=Orden>Orden</option>".html_safe %>
Run Code Online (Sandbox Code Playgroud)
我试过了:
<%= select_tag "object",
"<option value=address><%= t('address').capitalize %></option>
<option value=Orden>Orden</option>".html_safe %>
Run Code Online (Sandbox Code Playgroud)
但我收到语法错误。我也试过:
<%= select_tag "object",
"<option value=address> t('address').capitalize </option>
<option value=Orden>Orden</option>".html_safe %>
Run Code Online (Sandbox Code Playgroud)
最后一个不会翻译,只是把字符串 't('address').capitalize'
有什么建议吗?
ruby-on-rails internationalization rails-i18n ruby-on-rails-4
所以我的应用程序中有一个翻译文件,如下所示:
en:
activemodel:
attributes:
post:
title: Title
message: Message
tag: Tag
user:
name: Name
email: Email
Run Code Online (Sandbox Code Playgroud)
我想获得所有可用关键字符串的列表,因此对于本示例,我将获得以下内容:
'activemodel.attributes.post.title'
'activemodel.attributes.post.message'
'activemodel.attributes.post.tag'
'activemodel.attributes.user.name'
'activemodel.attributes.user.email'
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用 获得所有翻译的哈希值I18n.backend.send(:translations)[:en],但我不确定如何获得每条路径。
任何帮助都会非常感谢!
我想在我的应用程序中翻译和复数一个属性名称。
所以,对于我的 api_key 属性,我有翻译“Clef API”。
我将属性名称复数化Mymodel.human_attribute_name(:api_key).pluralize(2)并得到结果:"Clef APIs"
但是在法语中,“Clef API”的复数形式是“Clefs API”
所以我试图在我的 YML 中给出复数翻译,但它不起作用,我仍然得到了“One”的翻译,在末尾带有一个“s”。
fr.yml :
activerecord:
attributes:
mymodel:
api_key:
one: "Clef API"
other: "Clefs API"
Run Code Online (Sandbox Code Playgroud)
我可以Mymodel.human_attribute_name(:api_key).pluralize(2)回去"Clefs API"吗?
如果没有,我如何翻译和复数我的属性名称?