]> git.openstreetmap.org Git - rails.git/blob - vendor/plugins/i18n_data/lib/i18n_data/live_data_provider.rb
Added localized language names with plugin from http://github.com/grosser/i18n_data...
[rails.git] / vendor / plugins / i18n_data / lib / i18n_data / live_data_provider.rb
1 require 'open-uri'
2 require 'rexml/document'
3 gem 'activesupport', '> 2.2'
4 require 'activesupport'
5
6 module I18nData
7   # fetches data online from debian svn
8   module LiveDataProvider
9     extend ActiveSupport::Memoizable
10     extend self
11     
12     XML_CODES = {
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'
15     }
16     TRANSLATIONS = {
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/'
19     }
20
21     def codes(type,language_code)
22       language_code = language_code.upcase
23       if language_code == 'EN'
24         send("english_#{type}")
25       else
26         translated(type,language_code)
27       end
28     end
29
30   private
31
32     def translate(type,language,to_language_code)
33       translated = translations(type,to_language_code)[language]
34       translated.to_s.empty? ? nil : translated
35     end
36
37     def translated(type,language_code)
38       translations = {}
39       send("english_#{type}").each do |code,name|
40         translation = translate(type,name,language_code)
41         translations[code] = translation ? translation : name
42       end
43       translations
44     end
45     memoize :translated
46
47     def translations(type,language_code)
48       begin
49         data = open(TRANSLATIONS[type]+"#{language_code.downcase}.po").readlines
50       rescue
51         raise NoTranslationAvailable.new("for #{type} and language code = #{language_code}")
52       end
53
54       po_to_hash(data)
55     end
56     memoize :translations
57
58     def english_languages
59       codes = {}
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?
64         codes[code]=name
65       end
66       codes
67     end
68     memoize :english_languages
69
70     def english_countries
71       codes = {}
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
75         codes[code]=name
76       end
77       codes
78     end
79     memoize :english_countries
80
81     def po_to_hash(data)
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]}
84
85       translated = {}
86       names.each_with_index do |name,index|
87         translated[name]=translations[index]
88       end
89       translated
90     end
91
92     def xml(type)
93       xml = open(XML_CODES[type]).read
94       REXML::Document.new(xml)
95     end
96   end
97 end