【问题标题】:List Rails I18n strings with full keys列出具有完整键的 Rails I18n 字符串
【发布时间】:2013-08-19 09:17:37
【问题描述】:

我希望能够为一个语言环境生成所有 I18n 键和值的完整列表,包括完整键。换句话说,如果我有这些文件:

config/locales/en.yml

en:
  greeting:
    polite: "Good evening"
    informal: "What's up?"

config/locales/second.en.yml

en:
  farewell:
    polite: "Goodbye"
    informal: "Later"

我想要以下输出:

greeting.polite: "Good evening"
greeting.informal: "What's up?"
farewell.polite: "Goodbye"
farewell.informal: "Later"

我该怎么做?

【问题讨论】:

    标签: ruby-on-rails internationalization yaml


    【解决方案1】:

    一旦加载到内存中,它就只是一个大哈希,您可以按照您想要的任何方式对其进行格式化。要访问它,您可以这样做:

    I18n.backend.send(:translations)[:en]
    

    获取可用翻译列表(由您创建或可能由插件和 gems 创建)

    I18n.available_locales
    

    【讨论】:

      【解决方案2】:

      Nick Gorbikoff 的回答是一个开始,但没有发出问题中描述的我想要的输出。我最终编写了自己的脚本get_translations 来完成它,如下所示。

      #!/usr/bin/env ruby
      
      require 'pp'
      require './config/environment.rb'
      
      def print_translations(prefix, x)
        if x.is_a? Hash
          if (not prefix.empty?)
              prefix += "."
          end
          x.each {|key, value|
            print_translations(prefix + key.to_s, value)
          }
        else
            print prefix + ": "
            PP.singleline_pp x
            puts ""
        end
      end
      
      I18n.translate(:foo)
      translations_hash = I18n.backend.send(:translations)
      print_translations("", translations_hash)
      

      【讨论】:

      • 对不起,我没有时间给你完整的代码,所以我只是给你一个指针。还有一件事:查看 awesome_print - 它比 PrettyPrint gem 恕我直言要好得多。它实际上被 pry 和 irbtools 用于控制台中的格式化输出。
      • @NickGorbikoff 没问题,我确实很欣赏这个提示,它对这个问题很有帮助。我得去看看 awesome_print。
      【解决方案3】:

      这是一个可用于实现所需输出的方法的工作版本

      def print_tr(data,prefix="")
        if data.kind_of?(Hash)
          data.each do |key,value|
            print_tr(value, prefix.empty? ? key : "#{prefix}.#{key}")
          end
        else
          puts "#{prefix}: #{data}"
        end
      end
      

      用法:

      $ data = YAML.load_file('config/locales/second.en.yml')
      $ print_tr(data)
      =>
      
      en.farewell.polite: "Goodbye"
      en.farewell.informal: "Later"
      

      【讨论】:

        猜你喜欢
        • 2012-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-19
        • 2010-11-04
        • 2013-02-23
        • 2015-12-21
        相关资源
        最近更新 更多