Skip to content

Instantly share code, notes, and snippets.

@kron4eg
Forked from ptzn/translations.rake
Created January 22, 2010 07:39
Show Gist options
  • Save kron4eg/283574 to your computer and use it in GitHub Desktop.
Save kron4eg/283574 to your computer and use it in GitHub Desktop.
namespace :translations do
desc "Show available locales"
task :available => :environment do
puts "Available locales: #{I18n.available_locales.join(', ')}"
end
desc "Show missed translations depending on default language environment (:#{I18n.default_locale} by default). You can change it providing LOCALE argument"
task :missed => :environment do
locale = ENV['LOCALE'] || I18n.default_locale
puts "Using :#{locale} as default locale"
i18n_backend = I18n.backend
i18n_backend.send(:init_translations) unless i18n_backend.initialized?
translations = i18n_backend.send(:translations)
main_translation = translations.delete(locale.to_sym)
translations.each do |key, value|
print "Checking :#{key} translations:"
diff = find_keys_diff(main_translation, value)
if diff.empty?
puts " is up to date"
else
puts " here is list of missed translation keys"
puts "\t" + merge_diff(diff).sort.join("\n\t")
end
end
end
private
def find_keys_diff(master, in_hash)
master.inject([]) do |result, value|
key = value.first
if !in_hash.has_key?(key)
result << key.to_s
elsif value.last.is_a?(Hash)
diff = find_keys_diff(master[key], in_hash[key])
result << { key.to_s => diff } unless diff.empty?
end
result
end
end
def merge_diff(diff, prefix = "")
prefix << "." unless prefix.blank?
diff.inject([]) do |result, value|
if value.is_a?(Hash)
result += merge_diff(value.first.last, prefix + value.first.first)
else
result << "#{prefix}#{value}"
end
result
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment