2010-09-29 51 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