如何在 rails 上将翻译 table 转换为 ruby 中的 YAML 翻译文件

How to turn a translations table into YAML translation files in ruby on rails

我的应用目前正在使用 gem i18n-active_record 进行翻译,将它们存储在 table translations 中,其中有超过 5000 条记录。

为了提高性能,我想将翻译移动到 YAML 文件,例如en.ymlar.yml.

我试过 File.open(Rails.root+'config/locales/en.yml', 'w') {|f| f.write translation.to_yaml } 但生成的输出如下:

    raw_attributes:
    id: 1
    locale: en
    key: footer.new_car_make
    value: New %{title} Cars
    interpolations: 
    is_proc: 0
    created_at: &4 2012-08-15 06:25:59.000000000 Z
    updated_at: &5 2012-08-15 06:25:59.000000000 Z

有什么简单的方法可以进行转换吗?

你可以尝试这样的事情(我没有任何数据库支持 Rails 翻译来尝试这个)

def assign(parts, value, data)
  key, *rest = parts
  if rest.empty?
    data[key] = value
  else
    data[key] ||= {}
    assign(rest, value, data[key])
  end
end

translations = {}
Translation.all.each do |translation|
  path = [translation.locale] + translation.key.split(".")
  assign(path, translation.value, translations)
end

File.write("translations.yml", translations.to_yaml)

当然,您可以修改为仅导出单个语言环境或特定键的翻译(通过将 all 更改为 where 查询)。

代码的工作原理如下:

它迭代所有的翻译,并用所有的翻译构建一个散列。 en 翻译的键 footer.new_car_make 将以嵌套哈希结束,例如:

{
  "en" => {
    "footer" => {
      "new_car_make" => "Whatever text you have in the DB"
    }
  }
}

然后将此散列保存为文件中的 YAML 格式。

调用 assign 方法时使用表示为数组 (['en', 'footer', 'new_car_make']) 的完整键(它也包含语言环境)并解构为头部(数组中的第一个值)和其余(剩余部分)。 如果剩下的部分为空,说明我们已经到了最后一个元素,可以赋值了,否则我们加一个嵌套的hash,递归。

您可以在控制台中尝试此操作(只需复制粘贴即可)。如前所述,这可能 运行 开箱即用,如果您遇到问题,请告诉我。