如何在Rails中列出所有可用的区域设置键?

时间:2016-06-15 18:06:03

标签: ruby-on-rails ruby ruby-on-rails-4 rails-i18n

我的语言环境文件因一堆嵌套键而变得笨拙。有没有办法从单个语言环境文件中获取所有可用语言环境键或所有语言环境键的列表?

例如。

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']

是否有Rails(I18n)助手来执行此操作? 另一种方法是迭代解析的YAML。

3 个答案:

答案 0 :(得分: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 :(得分: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'

答案 2 :(得分:0)

要获取一系列可用的语言环境:

I18n.available_locales

我建议避免将多个语言环境放在一个YAML文件中。如果出于某些与处理相关的原因而需要这样做,则可以随时将文件串联起来,例如使用Bash:

cat *.my_app/config/locales/*.yml >> locales.yml

cat *.my_app/config/locales/*.yml | command_that_takes_stdin -