Rails 应用程序中 javascript 字符串的国际化

Internationalization of javascript strings in a Rails application

我有一个 rails 应用程序,它在 assets / javascripts 文件中有一些字符串,我该如何国际化这些字符串?注意:我不能使用rails I18n,因为我不能给这些javascript文件加上.erb扩展名,所以我不能在它们上面使用ruby代码.

实现此目的的一种方法是编写一个简单的 rails 任务,生成包含翻译的 JavaScript 文件。

namespace :translations do
  desc "Create a JavaScript File containing translations"
  task :generate => :environment do
    locale = ARGV[1] || I18n.default_locale
    keys = ['hello', 'goodbye'] # ...
    I18n.with_locale(locale) do
      data = Hash[keys, keys.map { |k| I18n.t!(k) }]
    end
    begin
      f = File.open(Rails.root.join('app/assets/javascript/translations.js') , 'w')
      f.write("export default #{data.to_json}")
    ensure
      f.close
    end
  end
end

这将创建一个如下所示的 ES6 模块:

export default {
  hello: 'Ola',
  goodbye: 'Tchau'
}

然后在需要的地方导入:

import Translations from 'translations';

如果您不使用 Webpack,您可以对 Sprockets 使用相同的方法,但它并没有真正理解这一点,因为它将处理 ERB 文件,这是一个更简单的解决方案。您也可以使用 Webpack 的 ERB 加载程序来执行此操作。

有一个 gem i18n-js 可以做到这一点。您可以将您的字符串添加到其中一个翻译 yml 文件中,并以与在 Rails 端完全相同的方式访问它们。