2 require 'rexml/document'
3 gem 'activesupport', '> 2.2'
4 require 'activesupport'
7 # fetches data online from debian svn
8 module LiveDataProvider
9 extend ActiveSupport::Memoizable
13 :countries => 'http://svn.debian.org/viewsvn/*checkout*/pkg-isocodes/trunk/iso-codes/iso_3166/iso_3166.xml',
14 :languages => 'http://svn.debian.org/viewsvn/*checkout*/pkg-isocodes/trunk/iso-codes/iso_639/iso_639.xml'
17 :languages => 'http://svn.debian.org/viewsvn/*checkout*/pkg-isocodes/trunk/iso-codes/iso_639/',
18 :countries => 'http://svn.debian.org/viewsvn/*checkout*/pkg-isocodes/trunk/iso-codes/iso_3166/'
21 def codes(type,language_code)
22 language_code = language_code.upcase
23 if language_code == 'EN'
24 send("english_#{type}")
26 translated(type,language_code)
32 def translate(type,language,to_language_code)
33 translated = translations(type,to_language_code)[language]
34 translated.to_s.empty? ? nil : translated
37 def translated(type,language_code)
39 send("english_#{type}").each do |code,name|
40 translation = translate(type,name,language_code)
41 translations[code] = translation ? translation : name
47 def translations(type,language_code)
49 data = open(TRANSLATIONS[type]+"#{language_code.downcase}.po").readlines
51 raise NoTranslationAvailable.new("for #{type} and language code = #{language_code}")
60 xml(:languages).elements.each('*/iso_639_entry') do |entry|
61 name = entry.attributes['name'].to_s.gsub("'","\\'")
62 code = entry.attributes['iso_639_1_code'].to_s.upcase
63 next if code.empty? or name.empty?
68 memoize :english_languages
72 xml(:countries).elements.each('*/iso_3166_entry') do |entry|
73 name = entry.attributes['name'].to_s.gsub("'","\\'")
74 code = entry.attributes['alpha_2_code'].to_s.upcase
79 memoize :english_countries
82 names = data.select{|l| l =~ /^msgid/}.map{|line| line.match(/^msgid "(.*?)"/)[1]}
83 translations = data.select{|l| l =~ /^msgstr/}.map{|line| line.match(/^msgstr "(.*?)"/)[1]}
86 names.each_with_index do |name,index|
87 translated[name]=translations[index]
93 xml = open(XML_CODES[type]).read
94 REXML::Document.new(xml)