rails_language_select 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e573a02dfca9b2091c67e81269a54459f85671df
4
+ data.tar.gz: 74c01c33ba5958aee0814ca0c45cfd0b8942811f
5
+ SHA512:
6
+ metadata.gz: a205f2d09eeeb25d175bc19b9f618c796cdc1fe799084f237d3b7197e910b6d28fe7a22aaea1861cfbe38e061e430fd3685751b7041e2f57423856523f96af8c
7
+ data.tar.gz: 2224944b8a00af6b55726c1c943237815f6c22d58e594c1e4cf9c4e144ce2ded10e7cad16aec0d15ae2dc2c139e22768299508516d3d434330cda164c7548938
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ *.sqlite
3
+ .bundle
4
+ pkg/*
5
+ .ruby-version
6
+ vendor/bundle
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --require spec_helper
3
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ platforms :rbx do
6
+ gem 'racc'
7
+ gem 'rubysl', '~> 2.0'
8
+ gem 'psych'
9
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,292 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rails_language_select (0.1.0)
5
+ i18n_data (~> 0.7.0)
6
+ sort_alphabetical (~> 1.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ actionpack (3.2.22.5)
12
+ activemodel (= 3.2.22.5)
13
+ activesupport (= 3.2.22.5)
14
+ builder (~> 3.0.0)
15
+ erubis (~> 2.7.0)
16
+ journey (~> 1.0.4)
17
+ rack (~> 1.4.5)
18
+ rack-cache (~> 1.2)
19
+ rack-test (~> 0.6.1)
20
+ sprockets (~> 2.2.1)
21
+ activemodel (3.2.22.5)
22
+ activesupport (= 3.2.22.5)
23
+ builder (~> 3.0.0)
24
+ activesupport (3.2.22.5)
25
+ i18n (~> 0.6, >= 0.6.4)
26
+ multi_json (~> 1.0)
27
+ builder (3.0.4)
28
+ coderay (1.1.1)
29
+ diff-lcs (1.3)
30
+ erubis (2.7.0)
31
+ ffi2-generators (0.1.1)
32
+ hike (1.2.3)
33
+ i18n (0.8.1)
34
+ i18n_data (0.7.0)
35
+ journey (1.0.4)
36
+ method_source (0.8.2)
37
+ multi_json (1.12.1)
38
+ pry (0.10.4)
39
+ coderay (~> 1.1.0)
40
+ method_source (~> 0.8.1)
41
+ slop (~> 3.4)
42
+ psych (2.2.2)
43
+ racc (1.4.14)
44
+ rack (1.4.7)
45
+ rack-cache (1.7.0)
46
+ rack (>= 0.4)
47
+ rack-test (0.6.3)
48
+ rack (>= 1.0)
49
+ rake (12.0.0)
50
+ rspec (3.5.0)
51
+ rspec-core (~> 3.5.0)
52
+ rspec-expectations (~> 3.5.0)
53
+ rspec-mocks (~> 3.5.0)
54
+ rspec-core (3.5.4)
55
+ rspec-support (~> 3.5.0)
56
+ rspec-expectations (3.5.0)
57
+ diff-lcs (>= 1.2.0, < 2.0)
58
+ rspec-support (~> 3.5.0)
59
+ rspec-mocks (3.5.0)
60
+ diff-lcs (>= 1.2.0, < 2.0)
61
+ rspec-support (~> 3.5.0)
62
+ rspec-support (3.5.0)
63
+ rubysl (2.2.0)
64
+ rubysl-abbrev (~> 2.0)
65
+ rubysl-base64 (~> 2.0)
66
+ rubysl-benchmark (~> 2.0)
67
+ rubysl-bigdecimal (~> 2.0)
68
+ rubysl-cgi (~> 2.0)
69
+ rubysl-cgi-session (~> 2.0)
70
+ rubysl-cmath (~> 2.0)
71
+ rubysl-complex (~> 2.0)
72
+ rubysl-continuation (~> 2.0)
73
+ rubysl-coverage (~> 2.0)
74
+ rubysl-csv (~> 2.0)
75
+ rubysl-curses (~> 2.0)
76
+ rubysl-date (~> 2.0)
77
+ rubysl-delegate (~> 2.0)
78
+ rubysl-digest (~> 2.0)
79
+ rubysl-drb (~> 2.0)
80
+ rubysl-e2mmap (~> 2.0)
81
+ rubysl-english (~> 2.0)
82
+ rubysl-enumerator (~> 2.0)
83
+ rubysl-erb (~> 2.0)
84
+ rubysl-etc (~> 2.0)
85
+ rubysl-expect (~> 2.0)
86
+ rubysl-fcntl (~> 2.0)
87
+ rubysl-fiber (~> 2.0)
88
+ rubysl-fileutils (~> 2.0)
89
+ rubysl-find (~> 2.0)
90
+ rubysl-forwardable (~> 2.0)
91
+ rubysl-getoptlong (~> 2.0)
92
+ rubysl-gserver (~> 2.0)
93
+ rubysl-io-console (~> 2.0)
94
+ rubysl-io-nonblock (~> 2.0)
95
+ rubysl-io-wait (~> 2.0)
96
+ rubysl-ipaddr (~> 2.0)
97
+ rubysl-irb (~> 2.1)
98
+ rubysl-logger (~> 2.0)
99
+ rubysl-mathn (~> 2.0)
100
+ rubysl-matrix (~> 2.0)
101
+ rubysl-mkmf (~> 2.0)
102
+ rubysl-monitor (~> 2.0)
103
+ rubysl-mutex_m (~> 2.0)
104
+ rubysl-net-ftp (~> 2.0)
105
+ rubysl-net-http (~> 2.0)
106
+ rubysl-net-imap (~> 2.0)
107
+ rubysl-net-pop (~> 2.0)
108
+ rubysl-net-protocol (~> 2.0)
109
+ rubysl-net-smtp (~> 2.0)
110
+ rubysl-net-telnet (~> 2.0)
111
+ rubysl-nkf (~> 2.0)
112
+ rubysl-observer (~> 2.0)
113
+ rubysl-open-uri (~> 2.0)
114
+ rubysl-open3 (~> 2.0)
115
+ rubysl-openssl (~> 2.0)
116
+ rubysl-optparse (~> 2.0)
117
+ rubysl-ostruct (~> 2.0)
118
+ rubysl-pathname (~> 2.0)
119
+ rubysl-prettyprint (~> 2.0)
120
+ rubysl-prime (~> 2.0)
121
+ rubysl-profile (~> 2.0)
122
+ rubysl-profiler (~> 2.0)
123
+ rubysl-pstore (~> 2.0)
124
+ rubysl-pty (~> 2.0)
125
+ rubysl-rational (~> 2.0)
126
+ rubysl-resolv (~> 2.0)
127
+ rubysl-rexml (~> 2.0)
128
+ rubysl-rinda (~> 2.0)
129
+ rubysl-rss (~> 2.0)
130
+ rubysl-scanf (~> 2.0)
131
+ rubysl-securerandom (~> 2.0)
132
+ rubysl-set (~> 2.0)
133
+ rubysl-shellwords (~> 2.0)
134
+ rubysl-singleton (~> 2.0)
135
+ rubysl-socket (~> 2.0)
136
+ rubysl-stringio (~> 2.0)
137
+ rubysl-strscan (~> 2.0)
138
+ rubysl-sync (~> 2.0)
139
+ rubysl-syslog (~> 2.0)
140
+ rubysl-tempfile (~> 2.0)
141
+ rubysl-thread (~> 2.0)
142
+ rubysl-thwait (~> 2.0)
143
+ rubysl-time (~> 2.0)
144
+ rubysl-timeout (~> 2.0)
145
+ rubysl-tmpdir (~> 2.0)
146
+ rubysl-tsort (~> 2.0)
147
+ rubysl-un (~> 2.0)
148
+ rubysl-unicode_normalize (~> 2.0)
149
+ rubysl-uri (~> 2.0)
150
+ rubysl-weakref (~> 2.0)
151
+ rubysl-webrick (~> 2.0)
152
+ rubysl-xmlrpc (~> 2.0)
153
+ rubysl-yaml (~> 2.0)
154
+ rubysl-zlib (~> 2.0)
155
+ rubysl-abbrev (2.0.4)
156
+ rubysl-base64 (2.0.0)
157
+ rubysl-benchmark (2.0.1)
158
+ rubysl-bigdecimal (2.0.2)
159
+ rubysl-cgi (2.0.1)
160
+ rubysl-cgi-session (2.1.0)
161
+ rubysl-cmath (2.0.0)
162
+ rubysl-complex (2.0.0)
163
+ rubysl-continuation (2.0.0)
164
+ rubysl-coverage (2.1)
165
+ rubysl-csv (2.0.2)
166
+ rubysl-english (~> 2.0)
167
+ rubysl-curses (2.0.1)
168
+ rubysl-date (2.0.9)
169
+ rubysl-delegate (2.0.1)
170
+ rubysl-digest (2.0.8)
171
+ rubysl-drb (2.0.1)
172
+ rubysl-e2mmap (2.0.0)
173
+ rubysl-english (2.0.0)
174
+ rubysl-enumerator (2.0.0)
175
+ rubysl-erb (2.0.2)
176
+ rubysl-etc (2.0.3)
177
+ ffi2-generators (~> 0.1)
178
+ rubysl-expect (2.0.0)
179
+ rubysl-fcntl (2.0.4)
180
+ ffi2-generators (~> 0.1)
181
+ rubysl-fiber (2.0.0)
182
+ rubysl-fileutils (2.0.3)
183
+ rubysl-find (2.0.1)
184
+ rubysl-forwardable (2.0.1)
185
+ rubysl-getoptlong (2.0.0)
186
+ rubysl-gserver (2.0.0)
187
+ rubysl-socket (~> 2.0)
188
+ rubysl-thread (~> 2.0)
189
+ rubysl-io-console (2.0.0)
190
+ rubysl-io-nonblock (2.0.0)
191
+ rubysl-io-wait (2.0.0)
192
+ rubysl-ipaddr (2.0.0)
193
+ rubysl-irb (2.1.1)
194
+ rubysl-e2mmap (~> 2.0)
195
+ rubysl-mathn (~> 2.0)
196
+ rubysl-thread (~> 2.0)
197
+ rubysl-logger (2.1.0)
198
+ rubysl-mathn (2.0.0)
199
+ rubysl-matrix (2.1.0)
200
+ rubysl-e2mmap (~> 2.0)
201
+ rubysl-mkmf (2.1)
202
+ rubysl-fileutils (~> 2.0)
203
+ rubysl-shellwords (~> 2.0)
204
+ rubysl-monitor (2.0.0)
205
+ rubysl-mutex_m (2.0.0)
206
+ rubysl-net-ftp (2.0.1)
207
+ rubysl-net-http (2.0.4)
208
+ rubysl-cgi (~> 2.0)
209
+ rubysl-erb (~> 2.0)
210
+ rubysl-singleton (~> 2.0)
211
+ rubysl-net-imap (2.0.1)
212
+ rubysl-net-pop (2.0.1)
213
+ rubysl-net-protocol (2.0.1)
214
+ rubysl-net-smtp (2.0.1)
215
+ rubysl-net-telnet (2.0.0)
216
+ rubysl-nkf (2.0.1)
217
+ rubysl-observer (2.0.0)
218
+ rubysl-open-uri (2.0.0)
219
+ rubysl-open3 (2.0.0)
220
+ rubysl-openssl (2.9)
221
+ rubysl-optparse (2.0.1)
222
+ rubysl-shellwords (~> 2.0)
223
+ rubysl-ostruct (2.1.0)
224
+ rubysl-pathname (2.3)
225
+ rubysl-prettyprint (2.0.3)
226
+ rubysl-prime (2.0.1)
227
+ rubysl-profile (2.0.0)
228
+ rubysl-profiler (2.1)
229
+ rubysl-pstore (2.0.0)
230
+ rubysl-pty (2.0.3)
231
+ rubysl-rational (2.0.1)
232
+ rubysl-resolv (2.1.2)
233
+ rubysl-rexml (2.0.4)
234
+ rubysl-rinda (2.0.1)
235
+ rubysl-rss (2.0.0)
236
+ rubysl-scanf (2.0.0)
237
+ rubysl-securerandom (2.0.0)
238
+ rubysl-set (2.0.1)
239
+ rubysl-shellwords (2.0.0)
240
+ rubysl-singleton (2.0.0)
241
+ rubysl-socket (2.2.1)
242
+ rubysl-fcntl (~> 2.0)
243
+ rubysl-stringio (2.1.0)
244
+ rubysl-strscan (2.0.0)
245
+ rubysl-sync (2.0.0)
246
+ rubysl-syslog (2.1.0)
247
+ ffi2-generators (~> 0.1)
248
+ rubysl-tempfile (2.0.1)
249
+ rubysl-thread (2.0.3)
250
+ rubysl-thwait (2.0.0)
251
+ rubysl-time (2.0.3)
252
+ rubysl-timeout (2.0.0)
253
+ rubysl-tmpdir (2.0.1)
254
+ rubysl-tsort (2.0.1)
255
+ rubysl-un (2.0.0)
256
+ rubysl-fileutils (~> 2.0)
257
+ rubysl-optparse (~> 2.0)
258
+ rubysl-unicode_normalize (2.0)
259
+ rubysl-uri (2.0.0)
260
+ rubysl-weakref (2.0.0)
261
+ rubysl-webrick (2.0.0)
262
+ rubysl-xmlrpc (2.0.0)
263
+ rubysl-yaml (2.1.0)
264
+ rubysl-zlib (2.0.1)
265
+ slop (3.6.0)
266
+ sort_alphabetical (1.1.0)
267
+ unicode_utils (>= 1.2.2)
268
+ sprockets (2.2.3)
269
+ hike (~> 1.2)
270
+ multi_json (~> 1.0)
271
+ rack (~> 1.0)
272
+ tilt (~> 1.1, != 1.3.0)
273
+ tilt (1.4.1)
274
+ unicode_utils (1.4.0)
275
+ wwtd (1.3.0)
276
+
277
+ PLATFORMS
278
+ ruby
279
+
280
+ DEPENDENCIES
281
+ actionpack (~> 3)
282
+ pry (~> 0)
283
+ psych
284
+ racc
285
+ rails_language_select!
286
+ rake
287
+ rspec (~> 3)
288
+ rubysl (~> 2.0)
289
+ wwtd
290
+
291
+ BUNDLED WITH
292
+ 1.14.3
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2017 Kaspars Jaudzems
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.
data/README.md ADDED
@@ -0,0 +1,96 @@
1
+ # Rails Language Select
2
+
3
+ Provides a simple helper to get a localised `<select>` of languages using the ISO 369 standard.
4
+
5
+ Based on the code of https://github.com/stefanpenner/country_select
6
+
7
+ Uses language data from https://github.com/grosser/i18n_data
8
+
9
+ ## Installation
10
+
11
+ Install as a gem using
12
+
13
+ ```shell
14
+ gem install rails_language_select
15
+ ```
16
+ Or put the following in your Gemfile
17
+
18
+ ```ruby
19
+ gem 'rails_language_select'
20
+ ```
21
+
22
+ ## Usage
23
+
24
+ Simple use supplying model and attribute as parameters:
25
+
26
+ ```ruby
27
+ language_select("user", "language")
28
+ ```
29
+
30
+ Supplying priority countries to be placed at the top of the list:
31
+
32
+ ```ruby
33
+ language_select("user", "language", priority_countries: ["EN", "FR", "DE"])
34
+ ```
35
+
36
+ Supplying only certain languages:
37
+
38
+ ```ruby
39
+ language_select("user", "language", only: ["EN", "FR", "DR"])
40
+ ```
41
+
42
+ Discarding certain languages:
43
+
44
+ ```ruby
45
+ language_select("user", "language", except: ["EN", "FR", "DE"])
46
+ ```
47
+
48
+ Pre-selecting a particular language:
49
+
50
+ ```ruby
51
+ language_select("user", "language", selected: "EN")
52
+ ```
53
+
54
+ Using existing `select` options:
55
+ ```ruby
56
+ language_select("user", "language", include_blank: true)
57
+ language_select("user", "language", { include_blank: 'Select a language' }, { class: 'language-select-box' })
58
+ ```
59
+
60
+ Supplying additional html options:
61
+
62
+ ```ruby
63
+ language_select("user", "language", { priority_languages: ["EN", "FR"], selected: "EN" }, { class: 'form-control', data: { attribute: "value" } })
64
+ ```
65
+
66
+ ### Using a custom formatter
67
+
68
+ You can override the default formatter, or define a new custom formatter which will receive `language` (localised language name) and `code`
69
+ ```ruby
70
+ # config/initializers/language_select.rb
71
+ LanguageSelect::FORMATS[:default] = lambda do |language, code|
72
+ [language, code.downcase] # use lower case code instead of upper case
73
+ end
74
+ LanguageSelect::FORMATS[:with_code] = lambda do |language, code|
75
+ "#{language} (#{code})"
76
+ end
77
+ ```
78
+
79
+ ```ruby
80
+ language_select("user", "language", format: :with_code)
81
+ ```
82
+
83
+ #### Getting the Language Name from the I18nData gem
84
+
85
+ ```ruby
86
+ class User < ActiveRecord::Base
87
+
88
+ # Assuming language_select is used with User attribute `language_code`
89
+ # This will attempt to translate the language name and use the default
90
+ # (usually English) name if no translation is available
91
+ def language_name
92
+ I18nData.languages(I18n.locale.to_s)[language_code]
93
+ end
94
+
95
+ end
96
+ ```
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ require 'i18n_data'
4
+ require 'sort_alphabetical'
5
+
6
+ require 'rails_language_select/version'
7
+ require 'rails_language_select/formats'
8
+ require 'rails_language_select/tag_helper'
9
+
10
+ if defined?(ActionView::Helpers::Tags::Base)
11
+ require 'rails_language_select/language_select_helper'
12
+ else
13
+ require 'rails_language_select/rails3/language_select_helper'
14
+ end
@@ -0,0 +1,7 @@
1
+ module LanguageSelect
2
+ FORMATS = {}
3
+
4
+ FORMATS[:default] = lambda do |language, code|
5
+ language
6
+ end
7
+ end
@@ -0,0 +1,38 @@
1
+ module ActionView
2
+ module Helpers
3
+ class FormBuilder
4
+ def language_select(method, priority_or_options = {}, options = {}, html_options = {})
5
+ if Hash === priority_or_options
6
+ html_options = options
7
+ options = priority_or_options
8
+ else
9
+ options[:priority_languages] = priority_or_options
10
+ end
11
+
12
+ @template.language_select(@object_name, method, objectify_options(options), @default_options.merge(html_options))
13
+ end
14
+ end
15
+
16
+ module FormOptionsHelper
17
+ def language_select(object, method, options = {}, html_options = {})
18
+ Tags::LanguageSelect.new(object, method, self, options, html_options).render
19
+ end
20
+ end
21
+
22
+ module Tags
23
+ class LanguageSelect < Base
24
+ include ::LanguageSelect::TagHelper
25
+
26
+ def initialize(object_name, method_name, template_object, options, html_options)
27
+ @html_options = html_options
28
+
29
+ super(object_name, method_name, template_object, options)
30
+ end
31
+
32
+ def render
33
+ select_content_tag(language_option_tags, @options, @html_options)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ module ActionView
2
+ module Helpers
3
+ class FormBuilder
4
+ def language_select(method, priority_or_options = {}, options = {}, html_options = {})
5
+ if Hash === priority_or_options
6
+ html_options = options
7
+ options = priority_or_options
8
+ else
9
+ options[:priority_languages] = priority_or_options
10
+ end
11
+
12
+ @template.language_select(@object_name, method, objectify_options(options), @default_options.merge(html_options))
13
+ end
14
+ end
15
+
16
+ module FormOptionsHelper
17
+ def language_select(object, method, options = {}, html_options = {})
18
+ LanguageSelect.new(object, method, self, options.delete(:object)).render(options, html_options)
19
+ end
20
+ end
21
+
22
+ class LanguageSelect < InstanceTag
23
+ include ::LanguageSelect::TagHelper
24
+
25
+ def render(options, html_options)
26
+ @options = options
27
+ @html_options = html_options
28
+
29
+ if self.respond_to?(:select_content_tag)
30
+ select_content_tag(language_option_tags, @options, @html_options)
31
+ else
32
+ html_options = @html_options.stringify_keys
33
+ add_default_name_and_id(html_options)
34
+ content_tag(:select, add_options(language_option_tags, options, value(object)), html_options)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,101 @@
1
+ module LanguageSelect
2
+ class LanguageNotFoundError < StandardError;end
3
+ module TagHelper
4
+ def language_option_tags
5
+ option_tags_options = {
6
+ :selected => @options.fetch(:selected) { value(@object) },
7
+ :disabled => @options[:disabled]
8
+ }
9
+
10
+ if priority_languages.present?
11
+ priority_languages_options = language_options_for(priority_languages, false)
12
+
13
+ option_tags = options_for_select(priority_languages_options, option_tags_options)
14
+ option_tags += html_safe_newline + options_for_select([priority_languages_divider], disabled: priority_languages_divider)
15
+
16
+ option_tags_options[:selected] = [option_tags_options[:selected]] unless option_tags_options[:selected].kind_of?(Array)
17
+ option_tags_options[:selected].delete_if{|selected| priority_languages_options.map(&:second).include?(selected)}
18
+
19
+ option_tags += html_safe_newline + options_for_select(language_options, option_tags_options)
20
+ else
21
+ option_tags = options_for_select(language_options, option_tags_options)
22
+ end
23
+ end
24
+
25
+ private
26
+ def locale
27
+ @options[:locale]
28
+ end
29
+
30
+ def priority_languages
31
+ @options[:priority_languages]
32
+ end
33
+
34
+ def priority_languages_divider
35
+ @options[:priority_languages_divider] || "-"*15
36
+ end
37
+
38
+ def only_language_codes
39
+ @options[:only]
40
+ end
41
+
42
+ def except_language_codes
43
+ @options[:except]
44
+ end
45
+
46
+ def format
47
+ @options[:format] || :default
48
+ end
49
+
50
+ def language_options
51
+ language_options_for(all_language_codes, true)
52
+ end
53
+
54
+ def all_language_codes
55
+ codes = I18nData.languages.keys
56
+
57
+ if only_language_codes.present?
58
+ codes & only_language_codes.map{|code| code.to_s.upcase}
59
+ elsif except_language_codes.present?
60
+ codes - except_language_codes.map{|code| code.to_s.upcase}
61
+ else
62
+ codes
63
+ end
64
+ end
65
+
66
+ def language_options_for(language_codes, sorted=true)
67
+ I18n.with_locale(locale) do
68
+ language_list = language_codes.map do |code_or_name|
69
+ if language = I18nData.languages(I18n.locale.to_s)[code_or_name.to_s.upcase]
70
+ code = code_or_name
71
+ elsif code = I18nData.language_code(code_or_name)
72
+ language = code_or_name
73
+ end
74
+
75
+ unless language.present?
76
+ msg = "Could not find Language with string '#{code_or_name}'"
77
+ raise LanguageNotFoundError.new(msg)
78
+ end
79
+
80
+ formatted_language = ::LanguageSelect::FORMATS[format].call(language, code)
81
+
82
+ if formatted_language.is_a?(Array)
83
+ formatted_language
84
+ else
85
+ [formatted_language, code]
86
+ end
87
+ end
88
+
89
+ if sorted
90
+ language_list.sort_alphabetical
91
+ else
92
+ language_list
93
+ end
94
+ end
95
+ end
96
+
97
+ def html_safe_newline
98
+ "\n".html_safe
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,3 @@
1
+ module LanguageSelect
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'rails_language_select/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "rails_language_select"
7
+ s.version = LanguageSelect::VERSION
8
+ s.licenses = ["MIT"]
9
+ s.authors = ["Kaspars Jaudzems"]
10
+ s.email = ["kasparsj@gmail.com"]
11
+ s.homepage = ""
12
+ s.summary = ""
13
+ s.description = ""
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ['lib']
19
+
20
+ s.required_ruby_version = '>= 2'
21
+
22
+ s.add_development_dependency 'actionpack', '~> 3'
23
+ s.add_development_dependency 'pry', '~> 0'
24
+ s.add_development_dependency 'rake'
25
+ s.add_development_dependency 'rspec', '~> 3'
26
+ s.add_development_dependency 'wwtd'
27
+
28
+ s.add_dependency 'i18n_data', '~> 0.7.0'
29
+ s.add_dependency 'sort_alphabetical', '~> 1.0'
30
+ end
@@ -0,0 +1,205 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ require 'action_view'
6
+ require 'rails_language_select'
7
+
8
+ describe "RailsLanguageSelect" do
9
+ include ActionView::Helpers::TagHelper
10
+ include ActionView::Helpers::FormOptionsHelper
11
+
12
+ before do
13
+ I18n.available_locales = [:en]
14
+ I18n.locale = :en
15
+ end
16
+
17
+ class Walrus
18
+ attr_accessor :language_code
19
+ end
20
+
21
+ let(:walrus) { Walrus.new }
22
+ let!(:template) { ActionView::Base.new }
23
+
24
+ let(:builder) do
25
+ if defined?(ActionView::Helpers::Tags::Base)
26
+ ActionView::Helpers::FormBuilder.new(:walrus, walrus, template, {})
27
+ else
28
+ ActionView::Helpers::FormBuilder.new(:walrus, walrus, template, {}, Proc.new { })
29
+ end
30
+ end
31
+
32
+ let(:select_tag) do
33
+ <<-EOS.chomp.strip
34
+ <select id="walrus_language_code" name="walrus[language_code]">
35
+ EOS
36
+ end
37
+
38
+ it "selects the value of language_code" do
39
+ tag = options_for_select([['English', 'EN']], 'EN')
40
+
41
+ walrus.language_code = 'EN'
42
+ t = builder.language_select(:language_code)
43
+ expect(t).to include(tag)
44
+ end
45
+
46
+ it "uses the locale specified by I18n.locale" do
47
+ I18n.available_locales = [:en, :es]
48
+
49
+ tag = options_for_select([['Inglés', 'EN']], 'EN')
50
+
51
+ walrus.language_code = 'EN'
52
+ original_locale = I18n.locale
53
+ begin
54
+ I18n.locale = :es
55
+ t = builder.language_select(:language_code)
56
+ expect(t).to include(tag)
57
+ ensure
58
+ I18n.locale = original_locale
59
+ end
60
+ end
61
+
62
+ it "accepts a locale option" do
63
+ I18n.available_locales = [:fr]
64
+
65
+ tag = options_for_select([['anglais', 'EN']], 'EN')
66
+
67
+ walrus.language_code = 'EN'
68
+ t = builder.language_select(:language_code, locale: :fr)
69
+ expect(t).to include(tag)
70
+ end
71
+
72
+ it "accepts priority languages" do
73
+ tag = options_for_select(
74
+ [
75
+ ['Latvian','LV'],
76
+ ['English','EN'],
77
+ ['Danish', 'DA'],
78
+ ['-'*15,'-'*15]
79
+ ],
80
+ selected: 'EN',
81
+ disabled: '-'*15
82
+ )
83
+
84
+ walrus.language_code = 'EN'
85
+ t = builder.language_select(:language_code, priority_languages: ['LV','EN','DA'])
86
+ expect(t).to include(tag)
87
+ end
88
+
89
+ describe "when selected options is not an array" do
90
+ it "selects only the first matching option" do
91
+ tag = options_for_select([["English", "EN"],["Uruguay", "UY"]], "EN")
92
+ walrus.language_code = 'EN'
93
+ t = builder.language_select(:language_code, priority_languages: ['LV','EN'])
94
+ expect(t).to_not include(tag)
95
+ end
96
+ end
97
+
98
+ describe "when selected options is an array" do
99
+ it "selects all options but only once" do
100
+ walrus.language_code = 'en'
101
+ t = builder.language_select(:language_code, {priority_languages: ['LV','EN','ES'], selected: ['ZU', 'EN']}, multiple: true)
102
+ expect(t.scan(options_for_select([["English", "EN"]], "EN")).length).to be(1)
103
+ expect(t.scan(options_for_select([["Zulu", "ZU"]], "ZU")).length).to be(1)
104
+ end
105
+ end
106
+
107
+ it "displays only the chosen languages" do
108
+ options = [["Danish", "DA"],["German", "DE"]]
109
+ tag = builder.select(:language_code, options)
110
+ walrus.language_code = 'en'
111
+ t = builder.language_select(:language_code, only: ['DA','DE'])
112
+ expect(t).to eql(tag)
113
+ end
114
+
115
+ it "discards some languages" do
116
+ tag = options_for_select([["English", "EN"]])
117
+ walrus.language_code = 'de'
118
+ t = builder.language_select(:language_code, except: ['EN'])
119
+ expect(t).to_not include(tag)
120
+ end
121
+
122
+ context "using old 1.x syntax" do
123
+ it "accepts priority languages" do
124
+ tag = options_for_select(
125
+ [
126
+ ['Latvian','LV'],
127
+ ['English','EN'],
128
+ ['Danish', 'DA'],
129
+ ['-'*15,'-'*15]
130
+ ],
131
+ selected: 'EN',
132
+ disabled: '-'*15
133
+ )
134
+
135
+ walrus.language_code = 'EN'
136
+ t = builder.language_select(:language_code, ['LV','EN','DA'])
137
+ expect(t).to include(tag)
138
+ end
139
+
140
+ it "selects only the first matching option" do
141
+ tag = options_for_select([["English", "EN"],["Uruguay", "UY"]], "EN")
142
+ walrus.language_code = 'EN'
143
+ t = builder.language_select(:language_code, ['LV','EN'])
144
+ expect(t).to_not include(tag)
145
+ end
146
+
147
+ it "supports the language names as provided by default in Formtastic" do
148
+ tag = options_for_select([
149
+ ["Dzongkha", "DZ"],
150
+ ["Spanish", "ES"],
151
+ ["Danish", "DA"],
152
+ ["English", "EN"]
153
+ ])
154
+ language_names = ["Dzongkha", "Spanish", "Danish", "English"]
155
+ t = builder.language_select(:language_code, language_names)
156
+ expect(t).to include(tag)
157
+ end
158
+
159
+ it "raises an error when a language code or name is not found" do
160
+ language_names = [
161
+ "English",
162
+ "Spanish",
163
+ "Danish",
164
+ "Freedonia"
165
+ ]
166
+ error_msg = "Could not find Language with string 'Freedonia'"
167
+
168
+ expect do
169
+ builder.language_select(:language_code, language_names)
170
+ end.to raise_error(LanguageSelect::LanguageNotFoundError, error_msg)
171
+ end
172
+
173
+ it "supports the select prompt" do
174
+ tag = '<option value="">Select your language</option>'
175
+ t = builder.language_select(:language_code, prompt: 'Select your language')
176
+ expect(t).to include(tag)
177
+ end
178
+
179
+ it "supports the include_blank option" do
180
+ tag = '<option value=""></option>'
181
+ t = builder.language_select(:language_code, include_blank: true)
182
+ expect(t).to include(tag)
183
+ end
184
+ end
185
+
186
+ it 'sorts unicode' do
187
+ tag = builder.language_select(:language_code, only: ['BG', 'CA', 'CH', 'ZU'])
188
+ order = tag.scan(/value="(\w{2})"/).map { |o| o[0] }
189
+ expect(order).to eq(['BG', 'CA', 'CH', 'ZU'])
190
+ end
191
+
192
+ describe "custom formats" do
193
+ it "accepts a custom formatter" do
194
+ ::LanguageSelect::FORMATS[:with_code] = lambda do |language, code|
195
+ "#{language} (#{code})"
196
+ end
197
+
198
+ tag = options_for_select([['English (EN)', 'EN']], 'EN')
199
+
200
+ walrus.language_code = 'EN'
201
+ t = builder.language_select(:language_code, format: :with_code)
202
+ expect(t).to include(tag)
203
+ end
204
+ end
205
+ end
@@ -0,0 +1,98 @@
1
+ require 'pry'
2
+
3
+ # This file was generated by the `rspec --init` command. Conventionally, all
4
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
5
+ # The generated `.rspec` file contains `--require spec_helper` which will cause this
6
+ # file to always be loaded, without a need to explicitly require it in any files.
7
+ #
8
+ # Given that it is always loaded, you are encouraged to keep this file as
9
+ # light-weight as possible. Requiring heavyweight dependencies from this file
10
+ # will add to the boot time of your test suite on EVERY test run, even for an
11
+ # individual file that may not need all of that loaded. Instead, consider making
12
+ # a separate helper file that requires the additional dependencies and performs
13
+ # the additional setup, and require it from the spec files that actually need it.
14
+ #
15
+ # The `.rspec` file also contains a few flags that are not defaults but that
16
+ # users commonly want.
17
+ #
18
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
19
+ RSpec.configure do |config|
20
+ # rspec-expectations config goes here. You can use an alternate
21
+ # assertion/expectation library such as wrong or the stdlib/minitest
22
+ # assertions if you prefer.
23
+ config.expect_with :rspec do |expectations|
24
+ # This option will default to `true` in RSpec 4. It makes the `description`
25
+ # and `failure_message` of custom matchers include text for helper methods
26
+ # defined using `chain`, e.g.:
27
+ # be_bigger_than(2).and_smaller_than(4).description
28
+ # # => "be bigger than 2 and smaller than 4"
29
+ # ...rather than:
30
+ # # => "be bigger than 2"
31
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
32
+ end
33
+
34
+ # rspec-mocks config goes here. You can use an alternate test double
35
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
36
+ config.mock_with :rspec do |mocks|
37
+ # Prevents you from mocking or stubbing a method that does not exist on
38
+ # a real object. This is generally recommended, and will default to
39
+ # `true` in RSpec 4.
40
+ mocks.verify_partial_doubles = true
41
+ end
42
+
43
+ # The settings below are suggested to provide a good initial experience
44
+ # with RSpec, but feel free to customize to your heart's content.
45
+ #=begin
46
+ # These two settings work together to allow you to limit a spec run
47
+ # to individual examples or groups you care about by tagging them with
48
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
49
+ # get run.
50
+ config.filter_run :focus
51
+ config.run_all_when_everything_filtered = true
52
+
53
+ # Limits the available syntax to the non-monkey patched syntax that is recommended.
54
+ # For more details, see:
55
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
56
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
57
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
58
+ #config.disable_monkey_patching!
59
+
60
+ # This setting enables warnings. It's recommended, but in some cases may
61
+ # be too noisy due to issues in dependencies.
62
+ #config.warnings = true
63
+
64
+ # Many RSpec users commonly either run the entire suite or an individual
65
+ # file, and it's useful to allow more verbose output when running an
66
+ # individual spec file.
67
+ if config.files_to_run.one?
68
+ # Use the documentation formatter for detailed output,
69
+ # unless a formatter has already been configured
70
+ # (e.g. via a command-line flag).
71
+ config.default_formatter = 'doc'
72
+ end
73
+
74
+ # Print the 10 slowest examples and example groups at the
75
+ # end of the spec run, to help surface which specs are running
76
+ # particularly slow.
77
+ #config.profile_examples = 10
78
+
79
+ # Run specs in random order to surface order dependencies. If you find an
80
+ # order dependency and want to debug it, you can fix the order by providing
81
+ # the seed, which is printed after each run.
82
+ # --seed 1234
83
+ config.order = :random
84
+
85
+ # Seed global randomization in this process using the `--seed` CLI option.
86
+ # Setting this allows you to use `--seed` to deterministically reproduce
87
+ # test failures related to randomization by passing the same `--seed` value
88
+ # as the one that triggered the failure.
89
+ Kernel.srand config.seed
90
+ #=end
91
+
92
+ # non-default settings
93
+ config.raise_errors_for_deprecations!
94
+
95
+ config.before do
96
+ I18n.config.enforce_available_locales = false
97
+ end
98
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails_language_select
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kaspars Jaudzems
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-02-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: actionpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: wwtd
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: i18n_data
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.7.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.7.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: sort_alphabetical
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.0'
111
+ description: ''
112
+ email:
113
+ - kasparsj@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".rspec"
120
+ - Gemfile
121
+ - Gemfile.lock
122
+ - MIT-LICENSE
123
+ - README.md
124
+ - lib/rails_language_select.rb
125
+ - lib/rails_language_select/formats.rb
126
+ - lib/rails_language_select/language_select_helper.rb
127
+ - lib/rails_language_select/rails3/language_select_helper.rb
128
+ - lib/rails_language_select/tag_helper.rb
129
+ - lib/rails_language_select/version.rb
130
+ - rails_language_select.gemspec
131
+ - spec/rails_language_select_spec.rb
132
+ - spec/spec_helper.rb
133
+ homepage: ''
134
+ licenses:
135
+ - MIT
136
+ metadata: {}
137
+ post_install_message:
138
+ rdoc_options: []
139
+ require_paths:
140
+ - lib
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '2'
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ requirements: []
152
+ rubyforge_project:
153
+ rubygems_version: 2.5.1
154
+ signing_key:
155
+ specification_version: 4
156
+ summary: ''
157
+ test_files:
158
+ - spec/rails_language_select_spec.rb
159
+ - spec/spec_helper.rb