--- /dev/null
+require 'open-uri'
+require 'rexml/document'
+gem 'activesupport', '> 2.2'
+require 'activesupport'
+
+module I18nData
+ # fetches data online from debian svn
+ module LiveDataProvider
+ extend ActiveSupport::Memoizable
+ extend self
+
+ XML_CODES = {
+ :countries => 'http://svn.debian.org/viewsvn/*checkout*/pkg-isocodes/trunk/iso-codes/iso_3166/iso_3166.xml',
+ :languages => 'http://svn.debian.org/viewsvn/*checkout*/pkg-isocodes/trunk/iso-codes/iso_639/iso_639.xml'
+ }
+ TRANSLATIONS = {
+ :languages => 'http://svn.debian.org/viewsvn/*checkout*/pkg-isocodes/trunk/iso-codes/iso_639/',
+ :countries => 'http://svn.debian.org/viewsvn/*checkout*/pkg-isocodes/trunk/iso-codes/iso_3166/'
+ }
+
+ def codes(type,language_code)
+ language_code = language_code.upcase
+ if language_code == 'EN'
+ send("english_#{type}")
+ else
+ translated(type,language_code)
+ end
+ end
+
+ private
+
+ def translate(type,language,to_language_code)
+ translated = translations(type,to_language_code)[language]
+ translated.to_s.empty? ? nil : translated
+ end
+
+ def translated(type,language_code)
+ translations = {}
+ send("english_#{type}").each do |code,name|
+ translation = translate(type,name,language_code)
+ translations[code] = translation ? translation : name
+ end
+ translations
+ end
+ memoize :translated
+
+ def translations(type,language_code)
+ begin
+ data = open(TRANSLATIONS[type]+"#{language_code.downcase}.po").readlines
+ rescue
+ raise NoTranslationAvailable.new("for #{type} and language code = #{language_code}")
+ end
+
+ po_to_hash(data)
+ end
+ memoize :translations
+
+ def english_languages
+ codes = {}
+ xml(:languages).elements.each('*/iso_639_entry') do |entry|
+ name = entry.attributes['name'].to_s.gsub("'","\\'")
+ code = entry.attributes['iso_639_1_code'].to_s.upcase
+ next if code.empty? or name.empty?
+ codes[code]=name
+ end
+ codes
+ end
+ memoize :english_languages
+
+ def english_countries
+ codes = {}
+ xml(:countries).elements.each('*/iso_3166_entry') do |entry|
+ name = entry.attributes['name'].to_s.gsub("'","\\'")
+ code = entry.attributes['alpha_2_code'].to_s.upcase
+ codes[code]=name
+ end
+ codes
+ end
+ memoize :english_countries
+
+ def po_to_hash(data)
+ names = data.select{|l| l =~ /^msgid/}.map{|line| line.match(/^msgid "(.*?)"/)[1]}
+ translations = data.select{|l| l =~ /^msgstr/}.map{|line| line.match(/^msgstr "(.*?)"/)[1]}
+
+ translated = {}
+ names.each_with_index do |name,index|
+ translated[name]=translations[index]
+ end
+ translated
+ end
+
+ def xml(type)
+ xml = open(XML_CODES[type]).read
+ REXML::Document.new(xml)
+ end
+ end
+end
\ No newline at end of file