【问题标题】:How to list all available locale keys in Rails?如何在 Rails 中列出所有可用的语言环境键?
【发布时间】:2016-06-15 18:06:02
【问题描述】:

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

例如。

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。

【问题讨论】:

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


    【解决方案1】:

    获取可用语言环境数组:

    I18n.available_locales
    

    我建议避免将多个语言环境放在一个 YAML 文件中。如果您出于某些与处理相关的原因需要这样做,您可以随时将文件与例如您的 *NIX shell 连接起来:

    ...到一个文件

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

    ...或其他进程

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

        我不会假装这是一个唯一正确的解决方案,但这段代码对我有用。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-07
          • 1970-01-01
          相关资源
          最近更新 更多