Monkey patch I18n::JS to ensure translations are in a fixed order
authorTom Hughes <tom@compton.nu>
Fri, 31 Aug 2012 10:51:58 +0000 (11:51 +0100)
committerTom Hughes <tom@compton.nu>
Fri, 31 Aug 2012 10:51:58 +0000 (11:51 +0100)
Without this the result of converting the hash to JSON can vary
which causes different hashes for the result JS asset.

This is only an issue with ruby 1.8 as ruby 1.9 hashes behave like
the ActiveSupport::OrderedHash and enumerate in insertion order.

config/initializers/i18n.rb

index 036de52d16d11fcb9051f1c515e97ed3a7cf82f9..de44126b05942afd07f6bd44fe92c54c95ed2c81 100644 (file)
@@ -16,6 +16,32 @@ module I18n
       end
     end
   end
+
+  module JS
+    class << self
+      def make_ordered(unordered)
+        ordered = ActiveSupport::OrderedHash.new
+
+        unordered.keys.sort { |a,b| a.to_s <=> b.to_s }.each do |key|
+          value = unordered[key]
+
+          if value.is_a?(Hash)
+            ordered[key] = make_ordered(value)
+          else
+            ordered[key] = value
+          end
+        end
+
+        ordered
+      end
+
+      def filtered_translations_with_order
+        make_ordered(filtered_translations_without_order)
+      end
+
+      alias_method_chain :filtered_translations, :order
+    end
+  end
 end
 
 I18n::Backend::Simple.include(I18n::Backend::PluralizationFallback)