我猜测rails将所有已解析的翻译yml文件存储在一种数组/哈希中。 有没有办法访问它?
例如,如果我有一个文件:
en:
test_string: "testing this"
warning: "This is just an example
我能做一些像I18n.translations_store [:en] [:test_string]的事吗? 我可以使用YAML :: load解析yml文件,但在我的情况下,我已经将子文件夹中的yml文件拆分为组织,我很确定rails已经解析了所有文件。
答案 0 :(得分:59)
你必须在后端调用私有方法。这是您访问的方式:
translations = I18n.backend.send(:translations)
translations[:en][:test_string] # => "testing this"
答案 1 :(得分:18)
根据8xx8的评论,更简单的版本:
I18n.t(:foo)
I18n.backend.send(:translations)[:en][:test_string]
是
I18n.t(".")[:test_string]
这可以减少必须预加载翻译或指定语言环境。
答案 2 :(得分:3)
如果您正在使用I18n::Fallbacks
,那么您无法使用I18n.t('.')
,因为它只返回内容当前区域设置(例如,' en-GB')任何后备区域设置(例如' en')。为了解决这个问题,你可以迭代回退并使用deep_merge!
来组合它们。
module I18n
class << self
def all
fallbacks[I18n.locale].reverse.reduce({}) do |translations, fallback|
translations.deep_merge!(backend.translate(fallback, '.'))
end
end
end
end
答案 3 :(得分:2)
默认的I18n后端是I18n :: Backend :: Simple,它不会向您公开翻译。 (I18.backend.translations是受保护的方法。)
这通常不是一个好主意,但如果您确实需要此信息并且无法解析该文件,则可以扩展后端类。
class I18n::Backend::Simple
def translations_store
translations
end
end
然后,您可以调用I18n.backend.translations_store
来获取已解析的翻译。您可能不应该依赖此作为长期策略,但它可以为您提供您现在需要的信息。
答案 4 :(得分:1)
如果您在rake任务中执行此操作,请记住包含环境,否则它将不会加载您自己的config/locales/
require "./config/environment.rb" # Do not forget this
namespace :i18n do
desc "Import I18n to I18n_active_record"
task :setup do
I18n.t(:foo)
translations = I18n.backend.send(:translations)
end
end
答案 5 :(得分:0)
对于那些徘徊在这个老问题中的人来说,有一个解决方案不需要调用受保护的方法。更改您的yml
文件,如下所示:
nl: &all
... translations here ...
all:
<<: *all
现在您可以使用I18n.t("all")
简单地提取所有翻译,这有利于在开发模式下自动初始化和重新加载翻译(如果您调用受保护的方法,则不会发生这种情况。)