2016-06-15 7 views
0

私のロケールファイルは、ネストされたキーの束で扱いにくくなっています。使用可能なすべてのロケールキー、またはすべてのロケールキーを単一のロケールファイルから取得する方法はありますか?利用可能なすべてのロケールキーをRailsに表示するには?

たとえば、

en: 
    car: 
    honda: 
      civic: 
       name: 'Civic' 
       description: 'Entry Level Sedan' 
    ferrari: 
      la_ferrari: 
       name: 'La Ferrari' 
       description: 'Supercar' 

このロケールは、この場合には、これを行うためのレール(国際化)ヘルパーは

['en.car.honda.civic.name', 'en.car.honda.civic.description', 
'en.ferrari.la_ferrari.name', 'en.car.ferrari.la_ferrari.name.description'] 

ありますされ、キーのリストを返す必要がありますか? もう1つの方法は、解析されたYAMLを反復することです。

答えて

2

これは私がこの問題に対処しなければならなかったときに私が書いたスクリプトです。私にとって素晴らしい仕事

#! /usr/bin/env ruby 

require 'yaml' 

filename = if ARGV.length == 1 
    ARGV[0] 
elsif ARGV.length == 0 
    "/path/to/project/config/locales/new.yml" 
end 

unless filename 
    puts "Usage: flat_print.rb filename" 
    exit(1) 
end 

hash = YAML.load_file(filename) 
hash = hash[hash.keys.first] 

def recurse(obj, current_path = [], &block) 
    if obj.is_a?(String) 
    path = current_path.join('.') 
    yield [path, obj] 
    elsif obj.is_a?(Hash) 
    obj.each do |k, v| 
     recurse(v, current_path + [k], &block) 
    end 
    end 
end 

recurse(hash) do |path, value| 
    puts path 
end 
1

私はこれがユニークな正しい解決策であるとは思わないが、このコードは私のために働く。

# config/initializers/i18n.rb 
module I18n 
    class << self 
    def get_keys(hsh = nil, parent = nil, ary = []) 
     hsh = YAML.load_file("config/locales/en.yml") unless hsh 
     keys = hsh.keys 
     keys.each do |key| 
     if hsh.fetch(key).is_a?(Hash) 
      get_keys(hsh.fetch(key), "#{parent}.#{key}", ary) 
     else 
      keys.each do |another| 
      ary << "#{parent}.#{another}"[1..-1] 
      end 
     end 
     end 
     ary.uniq 
    end 
    end 
end 

結果

[14] pry(main)> I18n.get_keys 
=> ["en.car.honda.civic.name", "en.car.honda.civic.description", "en.car.ferrari.la_ferrari.name", "en.car.ferrari.la_ferrari.description", "en.car.suzuki.escudo.name", "en.car.suzuki.escudo.description"] 

マイen.yml

en: 
    car: 
    honda: 
     civic: 
     name: 'Civic' 
     description: 'Entry Level Sedan' 
    ferrari: 
     la_ferrari: 
     name: 'La Ferrari' 
     description: 'Supercar' 
    suzuki: 
     escudo: 
     name: 'Escudo' 
     description: 'SUV' 
関連する問題