require 'rubygems' require 'bundler' require 'open-uri'
# Rake task for importing country names from Unicode.org's CLDR repository # (www.unicode.org/cldr/data/charts/summary/root.html). # # It parses a HTML file from Unicode.org for given locale and saves the # Rails' I18n hash in the plugin locale
directory # # Don't forget to restart the application when you add new locale to load it into Rails! # # == Example # rake import:locale locale=fr type=territories # # The code is deliberately procedural and simple, so it's easily # understandable by beginners as an introduction to Rake tasks power. # See github.com/joshmh/cldr/tree/master/converter.rb for much more robust solution
namespace :import do
desc "Import locale data (code and name) for various languages from the Unicode.org CLDR archive. Depends on Hpricot gem." task :locale do begin require 'hpricot' rescue LoadError puts "Error: Hpricot library required to use this task (import:locale)" exit end # TODO : Implement locale import chooser from CLDR root via Highline # Setup variables locale = ENV['locale'] type = ENV['type'] unless locale && type puts "\n[!] Usage: rake import:locale locale=fr type=territories\n\n" exit 0 end types = {'territories' => /^namesterritory$/, 'languages' => /^nameslanguage$/} unless types.include? type puts "\n[!] type must be 'territories' or 'languages'\n\n" exit 0 end # ----- Get the CLDR HTML -------------------------------------------------- begin puts "... getting the HTML file for locale '#{locale}'" doc = Hpricot( open("http://www.unicode.org/cldr/data/charts/summary/#{locale}.html") ) rescue => e puts "[!] Invalid locale name '#{locale}'! Not found in CLDR (#{e})" exit 0 end # ----- Parse the HTML with Hpricot ---------------------------------------- puts "... parsing the HTML file" translations = [] doc.search("//tr").each do |row| if row.search("td[@class='n']") && row.search("td[@class='n']").inner_html =~ types[type] && (type != "territories" || row.search("td[@class='g']").inner_html =~ /^[A-Z]{2}$/) && (type != "languages" || row.search("td[@class='g']").inner_html =~ /^[a-zA-Z_]+$/) code = row.search("td[@class='g']").inner_text #code = code[-code.size, 2] name = row.search("td[@class='v']").inner_text translations << { :code => code.to_sym, :name => name.to_s } print " ... #{name}" end end # ----- Prepare the output format ------------------------------------------ output =<<HEAD
{ :#{locale} => {
:#{type} => {
HEAD
translations.each do |translation| output << "\t\t\t:#{translation[:code]} => \"#{translation[:name]}\",\n" end output <<<<TAIL } }
} TAIL
# ----- Write the parsed values into file --------------------------------- puts "\n... writing the output" filename = File.join(Rails.root, 'config', 'locales', "#{type}.#{locale}.rb") File.open(filename, 'w+') { |f| f << output } puts "\n---\nWritten values for the '#{locale}' into file: #{filename}\n" # ------------------------------------------------------------------------------ end
end