Rspec 测试区域设置是否具有相同的键

Rspec test if locales have the same keys

在这里回答我自己的问题,因为我认为这可能对很多人有用。

我如何才能 rspec 验证区域设置是否具有相同的键以便没有遗漏任何翻译?

这对我来说适用于 2 个语言环境,但可以简单地适应更多语言环境。

我们将 I18n 数据转换为平面数组,如 ['key'、'key.key'、'key.other_key'],现在我们可以检查两个数组是否包含相同的内容。

def print_tr(data, prefix = '')
  if data.kind_of?(Hash)
    results = data.map { |key, value| print_tr(value, prefix.empty? ? key : "#{prefix}.#{key}") }
    return results.flatten
  else
    return prefix
  end
end

RSpec.describe 'i18n' do
  it 'has same keys in both locales' do
    all_en = print_tr(I18n.t('.', locale: :en)).map(&:to_s).sort
    all_ja = print_tr(I18n.t('.', locale: :ja)).map(&:to_s).sort
    all_same = all_en == all_ja
    expect(all_same).to be_truthy
    unless all_same
      p 'Translations missing in ja'
      p all_en - all_ja
    end
  end
end

改编自此处的答案