2016-06-15 16 views
0

Meine Locale-Datei wurde mit einer Reihe von verschachtelten Schlüsseln unhandlich. Gibt es eine Möglichkeit, eine Liste aller verfügbaren Ländereinstellungsschlüssel oder aller Ländereinstellungsschlüssel aus einer einzelnen Ländereinstellungsdatei zu erhalten?Wie listet man alle verfügbaren Gebietsschemata in Rails auf?

Für z.

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

Diese locale sollte die Liste der Schlüssel zurückgeben, die in diesem Fall ist

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

Gibt es eine Rails (I18n) Helfer dies zu tun? Die andere Möglichkeit besteht darin, über die analysierte YAML zu iterieren.

Antwort

2

Dies ist ein Skript, das ich geschrieben habe, wenn ich mit diesem zu tun hatte. Super für mich.

#! /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

Ich behaupte nicht, dass dies eine uniqe richtige Lösung ist, aber dieser Code funktioniert für mich.

# 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 

Ergebnis

[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"] 

Mein 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' 
Verwandte Themen