Rails如何自动提取表单标签并生成对应i18n多语言配置键
完全可以实现,目前最贴合需求的方案就是用你提到的i18n-tasks gem本身,它原生支持提取表单label对应的i18n键,不需要额外找其他工具:
方案1:使用i18n-tasks(推荐)
最新版i18n-tasks已经内置了Rails表单辅助方法的扫描规则,可以自动识别form_for绑定的模型,提取f.label调用对应的属性,生成符合Rails规范的i18n键,操作步骤如下:
- 安装最新版
i18n-tasks,在Gemfile中添加如下配置后执行bundle install:
gem 'i18n-tasks', '~> 1.0', group: [:development, :test]
- 执行
i18n-tasks config生成默认配置文件config/i18n-tasks.yml,默认配置已经支持扫描f.label等表单调用,如果你希望生成activerecord.attributes路径的键而不是helpers.label路径的,只需要在配置中添加:
rails_form_helper_uses_activerecord_attributes: true
- 执行
i18n-tasks add-missing,工具会自动扫描所有视图模板中的label调用,把缺失的翻译键批量添加到对应语言的yml配置文件中,默认会用属性名作为占位值,你直接修改成对应翻译即可。
方案2:自定义Rake任务(适合不想引入额外gem的场景)
如果你不想用第三方gem,也可以自己写一个简单的Rake任务遍历所有视图模板提取label键,示例代码如下:
在lib/tasks/extract_form_labels.rake中添加:
namespace :i18n do desc "Extract all form label i18n keys to locale files" task extract_form_labels: :environment do # 遍历所有ERB模板,可自行扩展支持Haml/Slim template_files = Dir.glob(Rails.root.join('app/views/**/*.erb')) label_keys = [] template_files.each do |file| content = File.read(file) # 匹配form_for绑定的模型名和f.label调用的属性,可根据自己的代码风格调整正则 content.scan(/form_for @(\w+).*?f.label :(\w+)/m).each do |model, attr| # 生成helpers.label路径的键,需要生成activerecord路径的可自行修改 label_keys << "helpers.label.#{model}.#{attr}" end end # 去重后输出到yml文件,也可以直接写入现有的locale文件 output = { 'en' => label_keys.inject({}) { |h, k| h.deep_merge(k.split('.').reverse.inject(v = '') { |val, key| { key => val } }) } } File.write(Rails.root.join('config/locales/extracted_labels.en.yml'), output.to_yaml) puts "Extracted #{label_keys.uniq.count} label keys to config/locales/extracted_labels.en.yml" end end
执行rake i18n:extract_form_labels即可自动提取所有label键生成对应的配置文件。
注意事项
- 两种方案都会自动跳过显式指定了文本的label调用(比如
f.label :title, '自定义标题'),因为这类label已经硬编码了文本,不需要走i18n翻译 - 嵌套属性的label调用也可以正常识别,会自动生成对应层级的i18n键
内容的提问来源于stack exchange,提问作者JohnRDOrazio
相关产品推荐
相关产品推荐

