localized_country_select 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ .DS_Store
2
+ */.DS_Store
3
+ rdoc
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 [name of plugin creator]
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,59 @@
1
+ = LocalizedCountrySelect
2
+
3
+ Rails plugin to provide support for localized <tt><select></tt> menu with country names and for
4
+ storing country information as country _code_ (eg. 'es'), not _name_ (eg. 'Spain'), in the database.
5
+
6
+ Uses the Rails internationalization framework (I18n, http://rails-i18n.org) for translating the names of countries.
7
+ Requires Rails 2.2 (released November 21st, 2008) or later versions.
8
+ Country names are loaded from hashes in plugin directory, according to <tt>I18n.locale</tt> value.
9
+
10
+ You can easily translate country codes in your application like this:
11
+
12
+ <%= I18n.t @user.country, :scope => 'countries' %>
13
+
14
+ Comes with a Rake task <tt>rake import:country_select 'de'</tt> for importing country names
15
+ from Unicode.org's CLDR repository (http://www.unicode.org/cldr/data/charts/summary/root.html)
16
+ Don't forget to restart the application when you add new locale.
17
+
18
+ ActionView helper code is adapted from Rails' default +country_select+ plugin (previously in core).
19
+ See http://github.com/rails/country_select/tree/master/lib/country_select.rb
20
+
21
+ == Examples
22
+
23
+ Show the complete country name:
24
+
25
+ <%= country_select(:user, :country, {}, :include_blank => 'Please choose...') %>
26
+
27
+ will become:
28
+
29
+ <select name="user[country]" id="user_country">
30
+ <option value="">Please choose...</option>
31
+ <option disabled="disabled" value="">-------------</option>
32
+ <option value="AF">Afghanistan</option>
33
+ ...
34
+ <option value="ZW">Zimbabwe</option>
35
+ </select>
36
+
37
+
38
+ Show only the country codes:
39
+
40
+ <%= country_select(:user, :country, {:description => :abbreviated}, :include_blank => 'Please choose...') %>
41
+
42
+ will become:
43
+
44
+ <select name="user[country]" id="user_country">
45
+ <option value="">Please choose...</option>
46
+ <option disabled="disabled" value="">-------------</option>
47
+ <option value="AF">AF</option>
48
+ ...
49
+ <option value="ZW">ZW</option>
50
+ </select>
51
+ for the <tt>en</tt> locale.
52
+
53
+ == Other resources
54
+
55
+ * http://github.com/rails/country_select (Default Rails plugin)
56
+ * http://github.com/russ/country_code_select (Stores country code, not name)
57
+
58
+
59
+ Copyright (c) 2008 Karel Minarik (www.karmi.cz), released under the MIT license
@@ -0,0 +1,41 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ load File.join(File.dirname(__FILE__), 'lib', 'tasks', 'localized_country_select_tasks.rake')
6
+
7
+ desc 'Default: run unit tests.'
8
+ task :default => :test
9
+
10
+ desc 'Test the localized_country_select plugin.'
11
+ Rake::TestTask.new(:test) do |t|
12
+ t.libs << 'lib'
13
+ t.pattern = 'test/**/*_test.rb'
14
+ t.verbose = true
15
+ end
16
+
17
+ desc 'Generate documentation for the localized_country_select plugin.'
18
+ Rake::RDocTask.new(:rdoc) do |rdoc|
19
+ rdoc.rdoc_dir = 'rdoc'
20
+ rdoc.title = 'LocalizedCountrySelect'
21
+ rdoc.options << '--line-numbers' << '--inline-source'
22
+ rdoc.rdoc_files.include('README.rdoc')
23
+ rdoc.rdoc_files.include('lib/**/*.rb')
24
+ end
25
+
26
+ #
27
+ # Jeweler
28
+ #
29
+ begin
30
+ require 'jeweler'
31
+ Jeweler::Tasks.new do |gemspec|
32
+ gemspec.name = "localized_country_select"
33
+ gemspec.summary = "Localized country select list"
34
+ gemspec.description = "Where are you from ?"
35
+ gemspec.email = "damien.mathieu@lim.eu"
36
+ gemspec.homepage = "http://github.com/LIMSAS/localized_country_select"
37
+ gemspec.authors = ["LIM SAS", "Damien MATHIEU", "Julien SANCHEZ", "Hervé GAUCHER"]
38
+ end
39
+ rescue LoadError
40
+ puts "Jeweler not available. Install it with: gem install jeweler"
41
+ end
data/init.rb ADDED
@@ -0,0 +1,5 @@
1
+ # Require the plugin code
2
+ require 'localized_country_select'
3
+
4
+ # Load locales for countries from +locale+ directory into Rails
5
+ I18n.load_path += Dir[ File.join(File.dirname(__FILE__), 'locale', '*.{rb,yml}') ]
@@ -0,0 +1,4 @@
1
+ # Show the README text file
2
+ puts "\n\n"
3
+ puts IO.read(File.join(File.dirname(__FILE__), 'README.rdoc'))
4
+ puts "\n"
@@ -0,0 +1,106 @@
1
+ # = LocalizedCountrySelect
2
+ #
3
+ # View helper for displaying select list with countries:
4
+ #
5
+ # country_select(:user, :country)
6
+ #
7
+ # Works just like the default Rails' +country_select+ plugin, but stores countries as
8
+ # country *codes*, not *names*, in the database.
9
+ #
10
+ # You can easily translate country codes in your application like this:
11
+ # <%= I18n.t @user.country, :scope => 'countries' %>
12
+ #
13
+ # Uses the Rails internationalization framework (I18n) for translating the names of countries.
14
+ #
15
+ # Use Rake task <tt>rake import:country_select 'de'</tt> for importing country names
16
+ # from Unicode.org's CLDR repository (http://www.unicode.org/cldr/data/charts/summary/root.html)
17
+ #
18
+ # Code adapted from Rails' default +country_select+ plugin (previously in core)
19
+ # See http://github.com/rails/country_select/tree/master/lib/country_select.rb
20
+ #
21
+ module LocalizedCountrySelect
22
+ class << self
23
+ # Returns array with codes and localized country names (according to <tt>I18n.locale</tt>)
24
+ # for <tt><option></tt> tags
25
+ def localized_countries_array(options={})
26
+ if(options[:description]==:abbreviated)
27
+ I18n.translate(:countries).map { |key, value| [key.to_s.upcase] }.
28
+ sort_by { |country| country.first }
29
+ else
30
+ I18n.translate(:countries).map { |key, value| [value, key.to_s.upcase] }.
31
+ sort_by { |country| country.first }
32
+ end
33
+ end
34
+ # Return array with codes and localized country names for array of country codes passed as argument
35
+ # == Example
36
+ # priority_countries_array([:TW, :CN])
37
+ # # => [ ['Taiwan', 'TW'], ['China', 'CN'] ]
38
+ def priority_countries_array(country_codes=[],options={})
39
+ if(options[:description]==:abbreviated)
40
+ country_codes.map { |code| [code.to_s.upcase] }
41
+ else
42
+ countries = I18n.translate(:countries)
43
+ country_codes.map { |code| [countries[code.to_s.upcase.to_sym], code.to_s.upcase] }
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ module ActionView
50
+ module Helpers
51
+
52
+ module FormOptionsHelper
53
+
54
+ # Return select and option tags for the given object and method, using +localized_country_options_for_select+
55
+ # to generate the list of option tags. Uses <b>country code</b>, not name as option +value+.
56
+ # Country codes listed as an array of symbols in +priority_countries+ argument will be listed first
57
+ # TODO : Implement pseudo-named args with a hash, not the "somebody said PHP?" multiple args sillines
58
+ def country_select(object, method, priority_countries = nil, options = {}, html_options = {})
59
+ InstanceTag.new(object, method, self, options.delete(:object)).
60
+ to_localized_country_select_tag(priority_countries, options, html_options)
61
+ end
62
+
63
+ # Return "named" select and option tags according to given arguments.
64
+ # Use +selected_value+ for setting initial value
65
+ # It behaves likes older object-binded brother +localized_country_select+ otherwise
66
+ # TODO : Implement pseudo-named args with a hash, not the "somebody said PHP?" multiple args sillines
67
+ def country_select_tag(name, selected_value = nil, priority_countries = nil, html_options = {})
68
+ select_tag name.to_sym, country_options_for_select(selected_value, priority_countries), html_options.stringify_keys
69
+ end
70
+
71
+ # Returns a string of option tags for countries according to locale. Supply the country code in upper-case ('US', 'DE')
72
+ # as +selected+ to have it marked as the selected option tag.
73
+ # Country codes listed as an array of symbols in +priority_countries+ argument will be listed first
74
+ def country_options_for_select(selected = nil, priority_countries = nil,options={})
75
+ country_options = ""
76
+ if priority_countries
77
+ country_options += options_for_select(LocalizedCountrySelect::priority_countries_array(priority_countries,options), selected)
78
+ country_options += "<option value=\"\" disabled=\"disabled\">-------------</option>\n"
79
+ end
80
+ return country_options + options_for_select(LocalizedCountrySelect::localized_countries_array(options), selected)
81
+ end
82
+
83
+ end
84
+
85
+ class InstanceTag
86
+ def to_localized_country_select_tag(priority_countries, options, html_options)
87
+ html_options = html_options.stringify_keys
88
+ add_default_name_and_id(html_options)
89
+ value = value(object)
90
+ content_tag("select",
91
+ add_options(
92
+ country_options_for_select(value, priority_countries,options),
93
+ options, value
94
+ ), html_options
95
+ )
96
+ end
97
+ end
98
+
99
+ class FormBuilder
100
+ def country_select(method, priority_countries = nil, options = {}, html_options = {})
101
+ @template.country_select(@object_name, method, priority_countries, options.merge(:object => @object), html_options)
102
+ end
103
+ end
104
+
105
+ end
106
+ end
@@ -0,0 +1,91 @@
1
+ require 'rubygems'
2
+ require 'open-uri'
3
+
4
+ # Rake task for importing country names from Unicode.org's CLDR repository
5
+ # (http://www.unicode.org/cldr/data/charts/summary/root.html).
6
+ #
7
+ # It parses a HTML file from Unicode.org for given locale and saves the
8
+ # Rails' I18n hash in the plugin +locale+ directory
9
+ #
10
+ # Don't forget to restart the application when you add new locale to load it into Rails!
11
+ #
12
+ # == Example
13
+ # rake import:country_select LOCALE=de
14
+ #
15
+ # The code is deliberately procedural and simple, so it's easily
16
+ # understandable by beginners as an introduction to Rake tasks power.
17
+ # See http://github.com/joshmh/cldr/tree/master/converter.rb for much more robust solution
18
+
19
+ namespace :import do
20
+
21
+ desc "Import country codes and names for various languages from the Unicode.org CLDR archive. Depends on Hpricot gem."
22
+ task :country_select do
23
+ begin
24
+ require 'hpricot'
25
+ rescue LoadError
26
+ puts "Error: Hpricot library required to use this task (import:country_select)"
27
+ exit
28
+ end
29
+
30
+ # TODO : Implement locale import chooser from CLDR root via Highline
31
+
32
+ # Setup variables
33
+ locale = ENV['LOCALE']
34
+ unless locale
35
+ puts "\n[!] Usage: rake import:country_select LOCALE=de\n\n"
36
+ exit 0
37
+ end
38
+
39
+ # ----- Get the CLDR HTML --------------------------------------------------
40
+ begin
41
+ puts "... getting the HTML file for locale '#{locale}'"
42
+ doc = Hpricot( open("http://www.unicode.org/cldr/data/charts/summary/#{locale}.html") )
43
+ rescue => e
44
+ puts "[!] Invalid locale name '#{locale}'! Not found in CLDR (#{e})"
45
+ exit 0
46
+ end
47
+
48
+
49
+ # ----- Parse the HTML with Hpricot ----------------------------------------
50
+ puts "... parsing the HTML file"
51
+ countries = []
52
+ doc.search("//tr").each do |row|
53
+ if row.search("td[@class='n']") &&
54
+ row.search("td[@class='n']").inner_html =~ /^namesterritory$/ &&
55
+ row.search("td[@class='g']").inner_html =~ /^[A-Z]{2}/
56
+ code = row.search("td[@class='g']").inner_text
57
+ code = code[-code.size, 2]
58
+ name = row.search("td[@class='v']").inner_text
59
+ countries << { :code => code.to_sym, :name => name.to_s }
60
+ print " ... #{name}"
61
+ end
62
+ end
63
+
64
+
65
+ # ----- Prepare the output format ------------------------------------------
66
+ output =<<HEAD
67
+ { :#{locale} => {
68
+
69
+ :countries => {
70
+ HEAD
71
+ countries.each do |country|
72
+ output << "\t\t\t:#{country[:code]} => \"#{country[:name]}\",\n"
73
+ end
74
+ output <<<<TAIL
75
+ }
76
+
77
+ }
78
+ }
79
+ TAIL
80
+
81
+
82
+ # ----- Write the parsed values into file ---------------------------------
83
+ puts "\n... writing the output"
84
+ filename = File.join(File.dirname(__FILE__), '..', '..', 'locale', "#{locale}.rb")
85
+ filename += '.NEW' if File.exists?(filename) # Append 'NEW' if file exists
86
+ File.open(filename, 'w+') { |f| f << output }
87
+ puts "\n---\nWritten values for the '#{locale}' into file: #{filename}\n"
88
+ # ------------------------------------------------------------------------------
89
+ end
90
+
91
+ end
@@ -0,0 +1,250 @@
1
+ { :en => {
2
+
3
+ :countries => {
4
+ :AD => "Andorra",
5
+ :AE => "United Arab Emirates",
6
+ :AF => "Afghanistan",
7
+ :AG => "Antigua and Barbuda",
8
+ :AI => "Anguilla",
9
+ :AL => "Albania",
10
+ :AM => "Armenia",
11
+ :AN => "Netherlands Antilles",
12
+ :AO => "Angola",
13
+ :AQ => "Antarctica",
14
+ :AR => "Argentina",
15
+ :AS => "American Samoa",
16
+ :AT => "Austria",
17
+ :AU => "Australia",
18
+ :AW => "Aruba",
19
+ :AX => "Aland Islands",
20
+ :AZ => "Azerbaijan",
21
+ :BA => "Bosnia and Herzegovina",
22
+ :BB => "Barbados",
23
+ :BD => "Bangladesh",
24
+ :BE => "Belgium",
25
+ :BF => "Burkina Faso",
26
+ :BG => "Bulgaria",
27
+ :BH => "Bahrain",
28
+ :BI => "Burundi",
29
+ :BJ => "Benin",
30
+ :BL => "Saint Barthélemy",
31
+ :BM => "Bermuda",
32
+ :BN => "Brunei",
33
+ :BO => "Bolivia",
34
+ :BR => "Brazil",
35
+ :BS => "Bahamas",
36
+ :BT => "Bhutan",
37
+ :BV => "Bouvet Island",
38
+ :BW => "Botswana",
39
+ :BY => "Belarus",
40
+ :BZ => "Belize",
41
+ :CA => "Canada",
42
+ :CC => "Cocos Islands",
43
+ :CD => "Congo - Kinshasa",
44
+ :CF => "Central African Republic",
45
+ :CG => "Congo - Brazzaville",
46
+ :CH => "Switzerland",
47
+ :CI => "Cote d'Ivoire",
48
+ :CK => "Cook Islands",
49
+ :CL => "Chile",
50
+ :CM => "Cameroon",
51
+ :CN => "China",
52
+ :CO => "Colombia",
53
+ :CR => "Costa Rica",
54
+ :CU => "Cuba",
55
+ :CV => "Cape Verde",
56
+ :CX => "Christmas Island",
57
+ :CY => "Cyprus",
58
+ :CZ => "Czech Republic",
59
+ :DE => "Germany",
60
+ :DJ => "Djibouti",
61
+ :DK => "Denmark",
62
+ :DM => "Dominica",
63
+ :DO => "Dominican Republic",
64
+ :DZ => "Algeria",
65
+ :EC => "Ecuador",
66
+ :EE => "Estonia",
67
+ :EG => "Egypt",
68
+ :EH => "Western Sahara",
69
+ :ER => "Eritrea",
70
+ :ES => "Spain",
71
+ :ET => "Ethiopia",
72
+ :FI => "Finland",
73
+ :FJ => "Fiji",
74
+ :FK => "Falkland Islands",
75
+ :FM => "Micronesia",
76
+ :FO => "Faroe Islands",
77
+ :FR => "France",
78
+ :GA => "Gabon",
79
+ :GB => "United Kingdom",
80
+ :GD => "Grenada",
81
+ :GE => "Georgia",
82
+ :GF => "French Guiana",
83
+ :GG => "Guernsey",
84
+ :GH => "Ghana",
85
+ :GI => "Gibraltar",
86
+ :GL => "Greenland",
87
+ :GM => "Gambia",
88
+ :GN => "Guinea",
89
+ :GP => "Guadeloupe",
90
+ :GQ => "Equatorial Guinea",
91
+ :GR => "Greece",
92
+ :GS => "South Georgia and the South Sandwich Islands",
93
+ :GT => "Guatemala",
94
+ :GU => "Guam",
95
+ :GW => "Guinea-Bissau",
96
+ :GY => "Guyana",
97
+ :HK => "Hong Kong",
98
+ :HM => "Heard Island and McDonald Islands",
99
+ :HN => "Honduras",
100
+ :HR => "Croatia",
101
+ :HT => "Haiti",
102
+ :HU => "Hungary",
103
+ :ID => "Indonesia",
104
+ :IE => "Ireland",
105
+ :IL => "Israel",
106
+ :IM => "Isle of Man",
107
+ :IN => "India",
108
+ :IQ => "Iraq",
109
+ :IR => "Iran",
110
+ :IS => "Iceland",
111
+ :IT => "Italy",
112
+ :JE => "Jersey",
113
+ :JM => "Jamaica",
114
+ :JO => "Jordan",
115
+ :JP => "Japan",
116
+ :KE => "Kenya",
117
+ :KG => "Kyrgyzstan",
118
+ :KH => "Cambodia",
119
+ :KI => "Kiribati",
120
+ :KM => "Comoros",
121
+ :KN => "Saint Kitts and Nevis",
122
+ :KP => "North Korea",
123
+ :KR => "South Korea",
124
+ :KW => "Kuwait",
125
+ :KY => "Cayman Islands",
126
+ :KZ => "Kazakhstan",
127
+ :LA => "Laos",
128
+ :LB => "Lebanon",
129
+ :LC => "Saint Lucia",
130
+ :LI => "Liechtenstein",
131
+ :LK => "Sri Lanka",
132
+ :LR => "Liberia",
133
+ :LS => "Lesotho",
134
+ :LT => "Lithuania",
135
+ :LU => "Luxembourg",
136
+ :LV => "Latvia",
137
+ :LY => "Libya",
138
+ :MA => "Morocco",
139
+ :MC => "Monaco",
140
+ :MD => "Moldova",
141
+ :ME => "Montenegro",
142
+ :MF => "Saint Martin",
143
+ :MG => "Madagascar",
144
+ :MH => "Marshall Islands",
145
+ :MK => "Macedonia",
146
+ :ML => "Mali",
147
+ :MM => "Myanmar",
148
+ :MN => "Mongolia",
149
+ :MO => "Macao",
150
+ :MP => "Northern Mariana Islands",
151
+ :MQ => "Martinique",
152
+ :MR => "Mauritania",
153
+ :MS => "Montserrat",
154
+ :MT => "Malta",
155
+ :MU => "Mauritius",
156
+ :MV => "Maldives",
157
+ :MW => "Malawi",
158
+ :MX => "Mexico",
159
+ :MY => "Malaysia",
160
+ :MZ => "Mozambique",
161
+ :NA => "Namibia",
162
+ :NC => "New Caledonia",
163
+ :NE => "Niger",
164
+ :NF => "Norfolk Island",
165
+ :NG => "Nigeria",
166
+ :NI => "Nicaragua",
167
+ :NL => "Netherlands",
168
+ :NO => "Norway",
169
+ :NP => "Nepal",
170
+ :NR => "Nauru",
171
+ :NU => "Niue",
172
+ :NZ => "New Zealand",
173
+ :OM => "Oman",
174
+ :PA => "Panama",
175
+ :PE => "Peru",
176
+ :PF => "French Polynesia",
177
+ :PG => "Papua New Guinea",
178
+ :PH => "Philippines",
179
+ :PK => "Pakistan",
180
+ :PL => "Poland",
181
+ :PM => "Saint Pierre and Miquelon",
182
+ :PN => "Pitcairn",
183
+ :PR => "Puerto Rico",
184
+ :PS => "Palestinian Territory",
185
+ :PT => "Portugal",
186
+ :PW => "Palau",
187
+ :PY => "Paraguay",
188
+ :QA => "Qatar",
189
+ :RE => "Reunion",
190
+ :RO => "Romania",
191
+ :RS => "Serbia",
192
+ :RU => "Russia",
193
+ :RW => "Rwanda",
194
+ :SA => "Saudi Arabia",
195
+ :SB => "Solomon Islands",
196
+ :SC => "Seychelles",
197
+ :SD => "Sudan",
198
+ :SE => "Sweden",
199
+ :SG => "Singapore",
200
+ :SH => "Saint Helena",
201
+ :SI => "Slovenia",
202
+ :SJ => "Svalbard and Jan Mayen",
203
+ :SK => "Slovakia",
204
+ :SL => "Sierra Leone",
205
+ :SM => "San Marino",
206
+ :SN => "Senegal",
207
+ :SO => "Somalia",
208
+ :SR => "Suriname",
209
+ :ST => "Sao Tome and Principe",
210
+ :SV => "El Salvador",
211
+ :SY => "Syria",
212
+ :SZ => "Swaziland",
213
+ :TC => "Turks and Caicos Islands",
214
+ :TD => "Chad",
215
+ :TF => "French Southern Territories",
216
+ :TG => "Togo",
217
+ :TH => "Thailand",
218
+ :TJ => "Tajikistan",
219
+ :TK => "Tokelau",
220
+ :TL => "East Timor",
221
+ :TM => "Turkmenistan",
222
+ :TN => "Tunisia",
223
+ :TO => "Tonga",
224
+ :TR => "Turkey",
225
+ :TT => "Trinidad and Tobago",
226
+ :TV => "Tuvalu",
227
+ :TW => "Taiwan",
228
+ :TZ => "Tanzania",
229
+ :UA => "Ukraine",
230
+ :UG => "Uganda",
231
+ :US => "United States",
232
+ :UY => "Uruguay",
233
+ :UZ => "Uzbekistan",
234
+ :VA => "Vatican",
235
+ :VC => "Saint Vincent and the Grenadines",
236
+ :VE => "Venezuela",
237
+ :VG => "British Virgin Islands",
238
+ :VI => "U.S. Virgin Islands",
239
+ :VN => "Vietnam",
240
+ :VU => "Vanuatu",
241
+ :WS => "Samoa",
242
+ :YE => "Yemen",
243
+ :YT => "Mayotte",
244
+ :ZA => "South Africa",
245
+ :ZM => "Zambia",
246
+ :ZW => "Zimbabwe",
247
+ }
248
+
249
+ }
250
+ }
@@ -0,0 +1,250 @@
1
+ { :ru => {
2
+
3
+ :countries => {
4
+ :AD => "Андорра",
5
+ :AE => "Объединенные Арабские Эмираты",
6
+ :AF => "Афганистан",
7
+ :AG => "Антигуа и Барбуда",
8
+ :AI => "Ангилья",
9
+ :AL => "Албания",
10
+ :AM => "Армения",
11
+ :AN => "Нидерландские Антильские о-ва",
12
+ :AO => "Ангола",
13
+ :AQ => "Антарктида",
14
+ :AR => "Аргентина",
15
+ :AS => "Американское Самоа",
16
+ :AT => "Австрия",
17
+ :AU => "Австралия",
18
+ :AW => "Аруба",
19
+ :AX => "Аландские о-ва",
20
+ :AZ => "Азербайджан",
21
+ :BA => "Босния и Герцеговина",
22
+ :BB => "Барбадос",
23
+ :BD => "Бангладеш",
24
+ :BE => "Бельгия",
25
+ :BF => "Буркина Фасо",
26
+ :BG => "Болгария",
27
+ :BH => "Бахрейн",
28
+ :BI => "Бурунди",
29
+ :BJ => "Бенин",
30
+ :BL => "Остров Святого Бартоломея",
31
+ :BM => "Бермудские о-ва",
32
+ :BN => "Бруней Даруссалам",
33
+ :BO => "Боливия",
34
+ :BR => "Бразилия",
35
+ :BS => "Багамские о-ва",
36
+ :BT => "Бутан",
37
+ :BV => "Остров Буве",
38
+ :BW => "Ботсвана",
39
+ :BY => "Беларусь",
40
+ :BZ => "Белиз",
41
+ :CA => "Канада",
42
+ :CC => "Кокосовые о-ва",
43
+ :CD => "Демократическая Республика Конго",
44
+ :CF => "Центральноафриканская Республика",
45
+ :CG => "Конго",
46
+ :CH => "Швейцария",
47
+ :CI => "Кот д’Ивуар",
48
+ :CK => "Острова Кука",
49
+ :CL => "Чили",
50
+ :CM => "Камерун",
51
+ :CN => "Китай",
52
+ :CO => "Колумбия",
53
+ :CR => "Коста-Рика",
54
+ :CU => "Куба",
55
+ :CV => "Острова Зеленого Мыса",
56
+ :CX => "Остров Рождества",
57
+ :CY => "Кипр",
58
+ :CZ => "Чехия",
59
+ :DE => "Германия",
60
+ :DJ => "Джибути",
61
+ :DK => "Дания",
62
+ :DM => "Доминика",
63
+ :DO => "Доминиканская Республика",
64
+ :DZ => "Алжир",
65
+ :EC => "Эквадор",
66
+ :EE => "Эстония",
67
+ :EG => "Египет",
68
+ :EH => "Западная Сахара",
69
+ :ER => "Эритрея",
70
+ :ES => "Испания",
71
+ :ET => "Эфиопия",
72
+ :FI => "Финляндия",
73
+ :FJ => "Фиджи",
74
+ :FK => "Фолклендские о-ва",
75
+ :FM => "Федеративные Штаты Микронезии",
76
+ :FO => "Фарерские о-ва",
77
+ :FR => "Франция",
78
+ :GA => "Габон",
79
+ :GB => "Великобритания",
80
+ :GD => "Гренада",
81
+ :GE => "Грузия",
82
+ :GF => "Французская Гвиана",
83
+ :GG => "Гернси",
84
+ :GH => "Гана",
85
+ :GI => "Гибралтар",
86
+ :GL => "Гренландия",
87
+ :GM => "Гамбия",
88
+ :GN => "Гвинея",
89
+ :GP => "Гваделупа",
90
+ :GQ => "Экваториальная Гвинея",
91
+ :GR => "Греция",
92
+ :GS => "Южная Джорджия и Южные Сандвичевы Острова",
93
+ :GT => "Гватемала",
94
+ :GU => "Гуам",
95
+ :GW => "Гвинея-Бисау",
96
+ :GY => "Гайана",
97
+ :HK => "Гонконг",
98
+ :HM => "Острова Херд и Макдональд",
99
+ :HN => "Гондурас",
100
+ :HR => "Хорватия",
101
+ :HT => "Гаити",
102
+ :HU => "Венгрия",
103
+ :ID => "Индонезия",
104
+ :IE => "Ирландия",
105
+ :IL => "Израиль",
106
+ :IM => "Остров Мэн",
107
+ :IN => "Индия",
108
+ :IQ => "Ирак",
109
+ :IR => "Иран",
110
+ :IS => "Исландия",
111
+ :IT => "Италия",
112
+ :JE => "Джерси",
113
+ :JM => "Ямайка",
114
+ :JO => "Иордания",
115
+ :JP => "Япония",
116
+ :KE => "Кения",
117
+ :KG => "Киргизия",
118
+ :KH => "Камбоджа",
119
+ :KI => "Кирибати",
120
+ :KM => "Коморские о-ва",
121
+ :KN => "Сент-Киттс и Невис",
122
+ :KP => "Северная Корея",
123
+ :KR => "Республика Корея",
124
+ :KW => "Кувейт",
125
+ :KY => "Каймановы острова",
126
+ :KZ => "Казахстан",
127
+ :LA => "Лаос",
128
+ :LB => "Ливан",
129
+ :LC => "Сент-Люсия",
130
+ :LI => "Лихтенштейн",
131
+ :LK => "Шри-Ланка",
132
+ :LR => "Либерия",
133
+ :LS => "Лесото",
134
+ :LT => "Литва",
135
+ :LU => "Люксембург",
136
+ :LV => "Латвия",
137
+ :LY => "Ливия",
138
+ :MA => "Марокко",
139
+ :MC => "Монако",
140
+ :MD => "Молдова",
141
+ :ME => "Черногория",
142
+ :MF => "Остров Святого Мартина",
143
+ :MG => "Мадагаскар",
144
+ :MH => "Маршалловы о-ва",
145
+ :MK => "Македония",
146
+ :ML => "Мали",
147
+ :MM => "Мьянма",
148
+ :MN => "Монголия",
149
+ :MO => "Макао",
150
+ :MP => "Северные Марианские о-ва",
151
+ :MQ => "Мартиника",
152
+ :MR => "Мавритания",
153
+ :MS => "Монтсеррат",
154
+ :MT => "Мальта",
155
+ :MU => "Маврикий",
156
+ :MV => "Мальдивские о-ва",
157
+ :MW => "Малави",
158
+ :MX => "Мексика",
159
+ :MY => "Малайзия",
160
+ :MZ => "Мозамбик",
161
+ :NA => "Намибия",
162
+ :NC => "Новая Каледония",
163
+ :NE => "Нигер",
164
+ :NF => "Остров Норфолк",
165
+ :NG => "Нигерия",
166
+ :NI => "Никарагуа",
167
+ :NL => "Нидерланды",
168
+ :NO => "Норвегия",
169
+ :NP => "Непал",
170
+ :NR => "Науру",
171
+ :NU => "Ниуе",
172
+ :NZ => "Новая Зеландия",
173
+ :OM => "Оман",
174
+ :PA => "Панама",
175
+ :PE => "Перу",
176
+ :PF => "Французская Полинезия",
177
+ :PG => "Папуа – Новая Гвинея",
178
+ :PH => "Филиппины",
179
+ :PK => "Пакистан",
180
+ :PL => "Польша",
181
+ :PM => "Сен-Пьер и Микелон",
182
+ :PN => "Питкэрн",
183
+ :PR => "Пуэрто-Рико",
184
+ :PS => "Палестинские территории",
185
+ :PT => "Португалия",
186
+ :PW => "Палау",
187
+ :PY => "Парагвай",
188
+ :QA => "Катар",
189
+ :RE => "Реюньон",
190
+ :RO => "Румыния",
191
+ :RS => "Сербия",
192
+ :RU => "Россия",
193
+ :RW => "Руанда",
194
+ :SA => "Саудовская Аравия",
195
+ :SB => "Соломоновы о-ва",
196
+ :SC => "Сейшельские о-ва",
197
+ :SD => "Судан",
198
+ :SE => "Швеция",
199
+ :SG => "Сингапур",
200
+ :SH => "Остров Святой Елены",
201
+ :SI => "Словения",
202
+ :SJ => "Свальбард и Ян-Майен",
203
+ :SK => "Словакия",
204
+ :SL => "Сьерра-Леоне",
205
+ :SM => "Сан-Марино",
206
+ :SN => "Сенегал",
207
+ :SO => "Сомали",
208
+ :SR => "Суринам",
209
+ :ST => "Сан-Томе и Принсипи",
210
+ :SV => "Сальвадор",
211
+ :SY => "Сирия",
212
+ :SZ => "Свазиленд",
213
+ :TC => "Острова Тёркс и Кайкос",
214
+ :TD => "Чад",
215
+ :TF => "Французские Южные Территории",
216
+ :TG => "Того",
217
+ :TH => "Таиланд",
218
+ :TJ => "Таджикистан",
219
+ :TK => "Токелау",
220
+ :TL => "Восточный Тимор",
221
+ :TM => "Туркменистан",
222
+ :TN => "Тунис",
223
+ :TO => "Тонга",
224
+ :TR => "Турция",
225
+ :TT => "Тринидад и Тобаго",
226
+ :TV => "Тувалу",
227
+ :TW => "Тайвань",
228
+ :TZ => "Танзания",
229
+ :UA => "Украина",
230
+ :UG => "Уганда",
231
+ :US => "США",
232
+ :UY => "Уругвай",
233
+ :UZ => "Узбекистан",
234
+ :VA => "Ватикан",
235
+ :VC => "Сент-Винсент и Гренадины",
236
+ :VE => "Венесуэла",
237
+ :VG => "Британские Виргинские о-ва",
238
+ :VI => "Виргинские о-ва (США)",
239
+ :VN => "Вьетнам",
240
+ :VU => "Вануату",
241
+ :WS => "Самоа",
242
+ :YE => "Йемен",
243
+ :YT => "Майотта",
244
+ :ZA => "ЮАР",
245
+ :ZM => "Замбия",
246
+ :ZW => "Зимбабве",
247
+ }
248
+
249
+ }
250
+ }
@@ -0,0 +1,117 @@
1
+ # coding: utf-8
2
+ $KCODE = 'u'
3
+
4
+ require 'test/unit'
5
+
6
+ require 'rubygems'
7
+ require 'active_support'
8
+ require 'action_controller'
9
+ # require 'action_controller/test_process'
10
+ require 'action_view'
11
+ require 'action_view/helpers'
12
+ require 'action_view/helpers/tag_helper'
13
+ require 'i18n'
14
+
15
+ begin
16
+ require 'redgreen'
17
+ rescue LoadError
18
+ puts "[!] Install redgreen gem for better test output ($ sudo gem install redgreen)"
19
+ end unless ENV["TM_FILEPATH"]
20
+
21
+ require 'localized_country_select'
22
+
23
+ class LocalizedCountrySelectTest < Test::Unit::TestCase
24
+
25
+ include ActionView::Helpers::TagHelper
26
+ include ActionView::Helpers::FormOptionsHelper
27
+ include ActionView::Helpers::FormTagHelper
28
+
29
+ def test_action_view_should_include_helper_for_object
30
+ assert ActionView::Helpers::FormBuilder.instance_methods.include?('country_select') # WTF not working with 1.9
31
+ assert ActionView::Helpers::FormOptionsHelper.instance_methods.include?('country_select')
32
+ end
33
+
34
+ def test_action_view_should_include_helper_tag
35
+ assert ActionView::Helpers::FormOptionsHelper.instance_methods.include?('country_select_tag') # WTF not working with 1.9
36
+ end
37
+
38
+ def test_should_return_select_tag_with_proper_name_for_object
39
+ # puts country_select(:user, :country)
40
+ assert country_select(:user, :country) =~
41
+ Regexp.new(Regexp.escape('<select id="user_country" name="user[country]">')),
42
+ "Should have proper name for object"
43
+ end
44
+
45
+ def test_should_return_select_tag_with_proper_name
46
+ # puts country_select_tag( "competition_submission[data][citizenship]", nil)
47
+ assert country_select_tag( "competition_submission[data][citizenship]", nil) =~
48
+ Regexp.new(
49
+ Regexp.escape('<select id="competition_submission_data_citizenship" name="competition_submission[data][citizenship]">') ),
50
+ "Should have proper name"
51
+ end
52
+
53
+ def test_should_return_option_tags
54
+ assert country_select(:user, :country) =~ Regexp.new(Regexp.escape('<option value="ES">Spain</option>'))
55
+ end
56
+
57
+ def test_should_return_localized_option_tags
58
+ I18n.locale = 'ru'
59
+ assert country_select(:user, :country) =~ Regexp.new(Regexp.escape('<option value="ES">Испания</option>'))
60
+ end
61
+
62
+ def test_should_return_priority_countries_first
63
+ assert country_options_for_select(nil, [:ES, :CZ]) =~ Regexp.new(
64
+ Regexp.escape("<option value=\"ES\">Spain</option>\n<option value=\"CZ\">Czech Republic</option><option value=\"\" disabled=\"disabled\">-------------</option>\n<option value=\"AF\">Afghanistan</option>\n"))
65
+ end
66
+
67
+ def test_i18n_should_know_about_countries
68
+ assert_equal 'Spain', I18n.t('ES', :scope => 'countries')
69
+ I18n.locale = 'ru'
70
+ assert_equal 'Испания', I18n.t('ES', :scope => 'countries')
71
+ end
72
+
73
+ def test_localized_countries_array_returns_correctly
74
+ assert_nothing_raised { LocalizedCountrySelect::localized_countries_array() }
75
+ # puts LocalizedCountrySelect::localized_countries_array.inspect
76
+ I18n.locale = 'en'
77
+ assert_equal 243, LocalizedCountrySelect::localized_countries_array.size
78
+ assert_equal 'Afghanistan', LocalizedCountrySelect::localized_countries_array.first[0]
79
+ I18n.locale = 'ru'
80
+ assert_equal 243, LocalizedCountrySelect::localized_countries_array.size
81
+ assert_equal 'Австралия', LocalizedCountrySelect::localized_countries_array.first[0]
82
+ end
83
+
84
+ def test_priority_countries_returns_correctly_and_in_correct_order
85
+ assert_nothing_raised { LocalizedCountrySelect::priority_countries_array([:TW, :CN]) }
86
+ I18n.locale = 'en'
87
+ assert_equal [ ['Taiwan', 'TW'], ['China', 'CN'] ], LocalizedCountrySelect::priority_countries_array([:TW, :CN])
88
+ end
89
+
90
+ def test_priority_countries_allows_passing_either_symbol_or_string
91
+ I18n.locale = 'en'
92
+ assert_equal [ ['United States', 'US'], ['Canada', 'CA'] ], LocalizedCountrySelect::priority_countries_array(['US', 'CA'])
93
+ end
94
+
95
+ def test_priority_countries_allows_passing_upcase_or_lowercase
96
+ I18n.locale = 'en'
97
+ assert_equal [ ['United States', 'US'], ['Canada', 'CA'] ], LocalizedCountrySelect::priority_countries_array(['us', 'ca'])
98
+ assert_equal [ ['United States', 'US'], ['Canada', 'CA'] ], LocalizedCountrySelect::priority_countries_array([:us, :ca])
99
+ end
100
+
101
+ def test_should_list_countries_with_accented_names_in_correct_order
102
+ I18n.locale = 'ru'
103
+ assert_match Regexp.new(Regexp.escape(%Q{<option value="BT">Бутан</option>\n<option value="VU">Вануату</option>})), country_select(:user, :country)
104
+ end
105
+
106
+ # private
107
+
108
+ def setup
109
+ ['ru', 'en'].each do |locale|
110
+ # I18n.load_translations( File.join(File.dirname(__FILE__), '..', 'locale', "#{locale}.rb") ) # <-- Old style! :)
111
+ I18n.load_path += Dir[ File.join(File.dirname(__FILE__), '..', 'locale', "#{locale}.rb") ]
112
+ end
113
+ # I18n.locale = I18n.default_locale
114
+ I18n.locale = 'en'
115
+ end
116
+
117
+ end
@@ -0,0 +1 @@
1
+ # Uninstall hook code here
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: localized_country_select
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - LIM SAS
14
+ - Damien MATHIEU
15
+ - Julien SANCHEZ
16
+ - "Herv\xC3\xA9 GAUCHER"
17
+ autorequire:
18
+ bindir: bin
19
+ cert_chain: []
20
+
21
+ date: 2010-07-21 00:00:00 +02:00
22
+ default_executable:
23
+ dependencies: []
24
+
25
+ description: Where are you from ?
26
+ email: damien.mathieu@lim.eu
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README.rdoc
33
+ files:
34
+ - .gitignore
35
+ - MIT-LICENSE
36
+ - README.rdoc
37
+ - Rakefile
38
+ - init.rb
39
+ - install.rb
40
+ - lib/localized_country_select.rb
41
+ - lib/tasks/localized_country_select_tasks.rake
42
+ - locale/en.rb
43
+ - locale/ru.rb
44
+ - test/localized_country_select_test.rb
45
+ - uninstall.rb
46
+ has_rdoc: true
47
+ homepage: http://github.com/LIMSAS/localized_country_select
48
+ licenses: []
49
+
50
+ post_install_message:
51
+ rdoc_options:
52
+ - --charset=UTF-8
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ hash: 3
61
+ segments:
62
+ - 0
63
+ version: "0"
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ hash: 3
70
+ segments:
71
+ - 0
72
+ version: "0"
73
+ requirements: []
74
+
75
+ rubyforge_project:
76
+ rubygems_version: 1.3.7
77
+ signing_key:
78
+ specification_version: 3
79
+ summary: Localized country select list
80
+ test_files:
81
+ - test/localized_country_select_test.rb