2010-09-29 55 views
29

我猜rails导轨存储所有解析的翻译yml文件中的一种数组/散列。 有没有办法访问它?如何检索从Rails的所有翻译YML文件I18n

举例来说,如果我有一个文件:

en: 
    test_string: "testing this" 
    warning: "This is just an example 

我可以做这样的事情,I18n.translations_store [:EN] [:test_string]? 我可以使用YAML :: load来解析yml文件,但在我的情况下,我已经将子文件夹中的yml文件拆分为组织,并且我非常确定rails已经解析了它们。

回答

53

你必须在后端调用一个私有方法。这就是你如何获得访问:

translations = I18n.backend.send(:translations) 
translations[:en][:test_string] # => "testing this" 
+22

请注意,如果后端没有初始化,那么'translations'将为空,即如果您还没有将其用于其他任何事情。如果你打开一个新的控制台并尝试加载翻译,你会看到这个。你可以通过'I18n.t(:foo)来解决它。 translations = I18n.backend.send(:translations)'(即使你没有'foo'翻译)。我确定有更好的方法。 – 2011-03-14 13:55:40

+0

谢谢你,@亨利克恩,你救了我的一天。 – lifecoder 2013-04-08 12:12:17

+10

非常感谢。如果后端尚未初始化并且哈希为空,则可以通过以下方式对其进行初始化:'I18n.backend.send(:init_translations)除非I18n.backend.initialized' – Robin 2013-09-25 20:14:33

2

默认的I18n后端是I18n :: Backend :: Simple,它不会将翻译公开给您。 (I18.backend.translations是一种受保护的方法。)

这通常不是一个好主意,但如果您确实需要此信息并且无法解析文件,则可以扩展后端类。

class I18n::Backend::Simple 
    def translations_store 
    translations 
    end 
end 

然后,您可以拨打I18n.backend.translations_store来获得解析的翻译。你可能不应该依赖这个作为长期战略,但它会让你获得你现在需要的信息。

0

对于这个老问题的人来说,有一个解决方案,不需要调用保护方法。更改您的yml文件,如下所示:

nl: &all 

    ... translations here ... 

    all: 
    <<: *all 

现在你可以使用I18n.t("all"),其中有自动初始化和发展模式重装翻译(的东西,如果你调用保护不发生利益简单地提取所有的翻译每8xx8的评论方法)

15

为,一个简单的版本:

I18n.t(:foo) 
I18n.backend.send(:translations)[:en][:test_string] 

I18n.t(".")[:test_string] 

这可以减轻必须预加载翻译或指定语言环境。

+0

这对我来说是最好的解决方案''I18n.t(“。”)'。谢谢。 – jordelver 2016-07-01 11:09:43

0

如果你在一个rake任务这样做,记得要包括环境,否则如果使用I18n::Fallbacks可惜你不会加载自己的语言环境这下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 
2

生活” t使用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