Ruby on rails 提取Rails应用程序中所有未翻译的键

Ruby on rails 提取Rails应用程序中所有未翻译的键,ruby-on-rails,ruby-on-rails-4,internationalization,Ruby On Rails,Ruby On Rails 4,Internationalization,我有一个需要国际化的应用程序。 目前,几乎所有字符串都使用t('.whatever')分配给翻译键 我想确保在我们发布密钥之前,所有密钥都被翻译成某种语言。在开发/测试环境中,我可以启用config.action\u view.raise\u on\u missing\u translations=true 但是测试中没有包括一些部分,比如designe,以及一些使用gem生成的其他部分,并且没有授权人在发布之前对所有页面进行测试 我更喜欢一种解决方案,提取所有键并将它们添加到locales/x

我有一个需要国际化的应用程序。 目前,几乎所有字符串都使用
t('.whatever')
分配给翻译键

我想确保在我们发布密钥之前,所有密钥都被翻译成某种语言。在开发/测试环境中,我可以启用
config.action\u view.raise\u on\u missing\u translations=true

但是测试中没有包括一些部分,比如
designe
,以及一些使用gem生成的其他部分,并且没有授权人在发布之前对所有页面进行测试

我更喜欢一种解决方案,提取所有键并将它们添加到
locales/xxx.yml
,最好使用一些逻辑来排序和添加缺少的键

我查看了以下不符合我要求的宝石/项目:

  • -完全搞乱了我的区域设置:(
  • 未显示默认语言缺少的翻译键
其他信息


我们的钥匙是英语,我们的默认语言是
:de
,但我们需要将所有内容翻译成
[:de,:en,:fr,:it]

以下是我的做法:

首先,确定哪个语言环境是参考/完整语言环境,比如说它是
:de

然后启动rails控制台(或创建rake任务),并按如下方式初始化I18n后端:

I18n.backend.send(:init_translations)

I18n.backend.send(:翻译)

允许您访问所有地区的所有翻译,例如

{
  en: {
    hello: 'Hello World'
  },
  de: {
    hello: 'Hallo Welt'
  }
}
现在选择您的参考语言环境,即
I18n.backend.send(:translations)[:de]
,然后迭代
:de
散列中的所有翻译键,并使用
I18n.backend.exists?(语言环境,翻译键)

例如:

I18n.backend.exists?(:en,[:errors,:messages,:invobable\u phone])
I18n.backend.exists?(:en,'errors.messages.invobable_phone')


如果密钥不存在,我会将其添加到散列中,并使用存根(如“####TRANSLATION MISSING####””,最后将散列作为YAML文件写入磁盘。

您还可以使用
YAML compare
(我制作的工具)找到丢失的密钥

你可以在

然后将其用作:

yaml-compare config/locales/de.yml config.locales/en.yml de en

谢谢,这对我很有帮助!FWIW:
send
在最近的rails版本中不再需要了。你可以直接调用
translations
。作为奖励,如果你使用
do\u init:true
调用translations,那么就不需要额外的
init\u translations
调用。你看了吗?你可以使用他们的RSpec测试来确定e确保所有密钥在发布前都翻译成您的所有语言。