lib/translate/keys.rb in translate-rails3-0.1.1 vs lib/translate/keys.rb in translate-rails3-0.1.2

- old
+ new

@@ -3,21 +3,21 @@ class Translate::Keys # Allows keys extracted from lookups in files to be cached def self.files @@files ||= Translate::Keys.new.files end - + # Allows flushing of the files cache def self.files=(files) @@files = files end - + def files @files ||= extract_files - end + end alias_method :to_hash, :files - + def keys files.keys end alias_method :to_a, :keys @@ -42,11 +42,11 @@ end files.reject { |key, file| self.class.contains_key?(yaml_keys, key) } end def self.translated_locales - I18n.available_locales.reject { |locale| [:root, I18n.default_locale.to_sym].include?(locale) } + I18n.available_locales.reject { |locale| [:root, I18n.default_locale.to_sym].include?(locale) } end # Checks if a nested hash contains the keys in dot separated I18n key. # # Example: @@ -69,23 +69,23 @@ return false if keys.empty? !keys.inject(HashWithIndifferentAccess.new(hash)) do |memo, key| memo.is_a?(Hash) ? memo.try(:[], key) : nil end.nil? end - + # Convert something like: - # + # # { # :pressrelease => { # :label => { # :one => "Pressmeddelande" # } # } # } - # + # # to: - # + # # {'pressrelease.label.one' => "Pressmeddelande"} # def self.to_shallow_hash(hash) hash.inject({}) do |shallow_hash, (key, value)| if value.is_a?(Hash) @@ -96,25 +96,25 @@ shallow_hash[key.to_s] = value end shallow_hash end end - + # Convert something like: - # + # # {'pressrelease.label.one' => "Pressmeddelande"} - # + # # to: - # + # # { # :pressrelease => { # :label => { # :one => "Pressmeddelande" # } # } # } - def self.to_deep_hash(hash) + def self.to_deep_hash(hash) hash.inject({}) do |deep_hash, (key, value)| keys = key.to_s.split('.').reverse leaf_key = keys.shift key_hash = keys.inject({leaf_key.to_sym => value}) { |hash, key| {key.to_sym => hash} } deep_merge!(deep_hash, key_hash) @@ -126,14 +126,47 @@ def self.deep_merge!(hash1, hash2) merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 } hash1.merge!(hash2, &merger) end + # Convert something like: + # + # {'0' => "elem 1", '1' => "elem 2"} + # + # to: + # + # ["elem 1", "elem 2"] + # + def self.arraylize(input_hash) + input_hash.inject([]) do |constructed_array, (key, value)| + constructed_array << value + constructed_array + end + end + private def extract_files files_to_scan.inject(HashWithIndifferentAccess.new) do |files, file| - IO.read(file).scan(i18n_lookup_pattern).flatten.map(&:to_sym).each do |key| + keys = IO.read(file) + if keys.respond_to? "encode" + keys = keys.encode("UTF-8").force_encoding("UTF-8") + end + error_count = 0 + begin + encoded_keys = keys.scan(i18n_lookup_pattern) + rescue => e + unless error_count > 1 + if keys.respond_to? 'encode!' + keys.encode!('utf-8', 'utf-8', :invalid => :replace) + end + error_count += 1 + retry + else + puts "cannot fix: #{e} on : #{file}" + end + end + encoded_keys.flatten.map(&:to_sym).each do |key| files[key] ||= [] path = Pathname.new(File.expand_path(file)).relative_path_from(Pathname.new(Rails.root)).to_s files[key] << path if !files[key].include?(path) end files