Add a test to check the validity of the translations
authorTom Hughes <tom@compton.nu>
Sun, 4 Mar 2012 14:24:21 +0000 (14:24 +0000)
committerTom Hughes <tom@compton.nu>
Sun, 4 Mar 2012 14:24:21 +0000 (14:24 +0000)
test/unit/i18n_test.rb [new file with mode: 0644]

diff --git a/test/unit/i18n_test.rb b/test/unit/i18n_test.rb
new file mode 100644 (file)
index 0000000..73f8934
--- /dev/null
@@ -0,0 +1,71 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class I18nTest < ActiveSupport::TestCase
+  I18n.available_locales.each do |locale|
+    define_method("test_#{locale.to_s.underscore}".to_sym) do
+      plural_keys = plural_keys(locale)
+
+      translation_keys.each do |key|
+        variables = []
+
+        default_value = I18n.t(key, :locale => I18n.default_locale)
+
+        if default_value.is_a?(Hash)
+          variables.push("count")
+
+          default_value.each do |subkey,subvalue|
+            subvalue.scan(/%\{(\w+)\}/) do
+              variables.push($1)
+            end
+          end
+        else
+          default_value.scan(/%\{(\w+)\}/) do
+            variables.push($1)
+          end
+        end
+
+        value = I18n.t(key, :locale => locale, :fallback => true)
+
+        if value.is_a?(Hash)
+          value.each do |subkey,subvalue|
+#            assert plural_keys.include?(subkey), "#{key}.#{subkey} is not a valid plural key"
+
+            subvalue.scan(/%\{(\w+)\}/) do
+              assert variables.include?($1), "#{key}.#{subkey} uses unknown interpolation variable #{$1}"
+            end
+          end
+        else
+          assert value.is_a?(String), "#{key} is not a string"
+
+          value.scan(/%\{(\w+)\}/) do
+            assert variables.include?($1), "#{key} uses unknown interpolation variable #{$1}"
+          end
+        end
+      end
+    end
+  end
+private
+  def translation_keys(scope = nil)
+    plural_keys = plural_keys(I18n.default_locale)
+
+    I18n.t(scope || ".", :locale => I18n.default_locale).map do |key,value|
+      scoped_key = scope ? "#{scope}.#{key}" : key
+
+      if value.kind_of?(Hash)
+        if value.keys - plural_keys == []
+          scoped_key
+        else
+          translation_keys(scoped_key)
+        end
+      elsif value.kind_of?(String)
+        scoped_key
+      end
+    end.flatten
+  end
+
+  def plural_keys(locale)
+    I18n.t("i18n.plural.keys", :locale => locale, :raise => true) + [ :zero ]
+  rescue I18n::MissingTranslationData
+    [ :zero, :one, :other ]
+  end
+end