如何在 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.yml
和 ar.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,递归。
您可以在控制台中尝试此操作(只需复制粘贴即可)。如前所述,这可能 运行 开箱即用,如果您遇到问题,请告诉我。
我的应用目前正在使用 gem i18n-active_record
进行翻译,将它们存储在 table translations
中,其中有超过 5000 条记录。
为了提高性能,我想将翻译移动到 YAML 文件,例如en.yml
和 ar.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,递归。
您可以在控制台中尝试此操作(只需复制粘贴即可)。如前所述,这可能 运行 开箱即用,如果您遇到问题,请告诉我。