namespace :i18n do
desc "Find and create db translation" task :missing_keys => :environment do def collect_keys(scope, translations) full_keys = [] translations.to_a.each do |key, translations| new_scope = scope.dup << key if translations.is_a?(Hash) full_keys += collect_keys(new_scope, translations) else full_keys << new_scope.join('.') end end return full_keys end # Make sure we've loaded the translations #I18n.backend.send(:init_translations) I18n.backend.load_translations #puts "#{I18n.available_locales.size} #{I18n.available_locales.size == 1 ? 'locale' : 'locales'} available: #{I18n.available_locales.to_sentence}" # Get all keys from all locales all_keys = I18n.backend.backends[0].send(:translations).collect do |check_locale, translations| collect_keys([], translations).sort end.flatten.uniq puts "#{all_keys.size} #{all_keys.size == 1 ? 'unique key' : 'unique keys'} found." missing_keys = {} all_keys.each do |key| [:de, :en].each do |locale| I18n.locale = locale t = Translation.find_by_key_and_locale(key,locale.to_s) if t if t.value.blank? begin a = I18n.translate(key, :raise => true) t.value = a t.save rescue I18n::MissingTranslationData #noop end end else begin I18n.translate(key, :raise => true) Translation.create(:key => key, :value => I18n.translate(key), :locale => locale ) rescue I18n::MissingTranslationData Translation.create(:key => key, :locale => locale ) end end end end puts "#{missing_keys.size} #{missing_keys.size == 1 ? 'key is missing' : 'keys are missing'} from one or more locales:" # missing_keys.keys.sort.each do |key| # puts "'#{key}': Missing from #{missing_keys[key].join(', ')}" # end end
end