route_translator 3.2.3 → 3.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/route_translator.rb +21 -9
- data/lib/route_translator/extensions/action_controller.rb +23 -1
- data/lib/route_translator/host.rb +29 -0
- data/lib/route_translator/translator.rb +36 -20
- data/lib/route_translator/version.rb +1 -1
- data/test/dummy/config/initializers/route_translator.rb +4 -0
- data/test/dummy/config/locales/all.yml +5 -2
- data/test/dummy/config/routes.rb +3 -0
- data/test/host_test.rb +99 -0
- data/test/integration_test.rb +42 -4
- data/test/routing_test.rb +27 -9
- data/test/test_helper.rb +6 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d1c42a43f7afa3aa88301f402d64e0fbe60ebdf
|
4
|
+
data.tar.gz: c873187b33ca3327f482276c780b30e6999e246b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93d3bb5f6ff06529a3d986a90574925d353e4882c472ca3254c405cd4c3736ac9737ae7fb933066b1e7cecd720d6eca211908d311ee2d6e471b774a39a2296e5
|
7
|
+
data.tar.gz: aa225c315b5a2afe93ec29e3a80253d840a5191f9031575933ca67231985522b162d0709601a76c68c31959c7e411ea53571bae65b44acbe53f6eb6dc760cb2f
|
data/lib/route_translator.rb
CHANGED
@@ -5,26 +5,38 @@ require 'action_dispatch'
|
|
5
5
|
|
6
6
|
require File.expand_path('../route_translator/extensions', __FILE__)
|
7
7
|
require File.expand_path('../route_translator/translator', __FILE__)
|
8
|
+
require File.expand_path('../route_translator/host', __FILE__)
|
8
9
|
|
9
10
|
module RouteTranslator
|
11
|
+
extend RouteTranslator::Host
|
10
12
|
|
11
13
|
TRANSLATABLE_SEGMENT = /^([-_a-zA-Z0-9]+)(\()?/.freeze
|
12
14
|
|
13
|
-
Configuration = Struct.new(:force_locale, :hide_locale,
|
15
|
+
Configuration = Struct.new(:force_locale, :hide_locale,
|
16
|
+
:generate_unlocalized_routes, :locale_param_key,
|
17
|
+
:generate_unnamed_unlocalized_routes,
|
18
|
+
:host_locales)
|
14
19
|
|
15
20
|
def self.config(&block)
|
16
|
-
@config
|
17
|
-
@config.force_locale
|
18
|
-
@config.hide_locale
|
19
|
-
@config.generate_unlocalized_routes
|
20
|
-
@config.locale_param_key
|
21
|
+
@config ||= Configuration.new
|
22
|
+
@config.force_locale ||= false
|
23
|
+
@config.hide_locale ||= false
|
24
|
+
@config.generate_unlocalized_routes ||= false
|
25
|
+
@config.locale_param_key ||= :locale
|
21
26
|
@config.generate_unnamed_unlocalized_routes ||= false
|
27
|
+
@config.host_locales ||= {}.with_indifferent_access
|
22
28
|
yield @config if block
|
29
|
+
resolve_config_conflicts
|
23
30
|
@config
|
24
31
|
end
|
25
32
|
|
26
|
-
def self.
|
27
|
-
|
33
|
+
def self.resolve_config_conflicts
|
34
|
+
if @config.host_locales.present?
|
35
|
+
@config.generate_unlocalized_routes = false
|
36
|
+
@config.generate_unnamed_unlocalized_routes = false
|
37
|
+
@config.force_locale = false
|
38
|
+
@config.hide_locale = false
|
39
|
+
@config.host_locales = @config.host_locales.with_indifferent_access
|
40
|
+
end
|
28
41
|
end
|
29
|
-
|
30
42
|
end
|
@@ -5,7 +5,29 @@ module ActionController
|
|
5
5
|
around_filter :set_locale_from_url
|
6
6
|
|
7
7
|
def set_locale_from_url(&block)
|
8
|
-
I18n.with_locale
|
8
|
+
with_host_locale { I18n.with_locale(params[RouteTranslator.locale_param_key], &block) }
|
9
9
|
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def with_host_locale(&block)
|
14
|
+
host_locale = RouteTranslator::Host.locale_from_host(request.host)
|
15
|
+
begin
|
16
|
+
if host_locale
|
17
|
+
original_default = I18n.default_locale
|
18
|
+
original_locale = I18n.locale
|
19
|
+
|
20
|
+
I18n.default_locale = host_locale
|
21
|
+
I18n.locale = host_locale
|
22
|
+
end
|
23
|
+
|
24
|
+
yield
|
25
|
+
|
26
|
+
ensure
|
27
|
+
I18n.default_locale = original_default if host_locale
|
28
|
+
I18n.locale = original_locale if host_locale
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
10
32
|
end
|
11
33
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module RouteTranslator
|
2
|
+
module Host
|
3
|
+
def self.locale_from_host(host)
|
4
|
+
matches = RouteTranslator.config.host_locales.detect {|key, locale| host =~ regex_for(key) }
|
5
|
+
matched_locale = if matches && host_match = matches.first
|
6
|
+
locale = RouteTranslator.config.host_locales[host_match].to_sym
|
7
|
+
locale if I18n.available_locales.include?(locale)
|
8
|
+
end
|
9
|
+
matched_locale || I18n.default_locale
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.regex_for(host_string)
|
13
|
+
escaped = Regexp.escape(host_string).gsub('\*', '.*?').gsub('\.', '\.?')
|
14
|
+
Regexp.new("^#{escaped}$", Regexp::IGNORECASE)
|
15
|
+
end
|
16
|
+
|
17
|
+
def native_locale?(locale)
|
18
|
+
!!locale.to_s.match(/native_/)
|
19
|
+
end
|
20
|
+
|
21
|
+
def native_locales
|
22
|
+
config.host_locales.values.map {|locale| :"native_#{locale}" }
|
23
|
+
end
|
24
|
+
|
25
|
+
def locale_param_key
|
26
|
+
self.config.locale_param_key
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -12,32 +12,35 @@ module RouteTranslator
|
|
12
12
|
helper_list.push(new_helper_name.to_sym) unless helper_list.include?(new_helper_name.to_sym)
|
13
13
|
|
14
14
|
helper_container.__send__(:define_method, new_helper_name) do |*args|
|
15
|
-
locale_suffix
|
16
|
-
|
15
|
+
locale_suffix = I18n.locale.to_s.underscore
|
16
|
+
default_locale_suffix = I18n.default_locale.to_s.underscore
|
17
|
+
args_hash = args.select {|arg| arg.is_a?(Hash) }.first
|
18
|
+
args_locale_suffix = args_hash[:locale].to_s.underscore if args_hash.present?
|
19
|
+
if RouteTranslator.config.host_locales.present?
|
20
|
+
if args.blank? || args_locale_suffix == default_locale_suffix
|
21
|
+
__send__("#{old_name}_native_#{default_locale_suffix}_#{suffix}", *args)
|
22
|
+
elsif args_locale_suffix
|
23
|
+
__send__("#{old_name}_#{args_locale_suffix}_#{suffix}", *args)
|
24
|
+
end
|
25
|
+
elsif respond_to?("#{old_name}_#{locale_suffix}_#{suffix}")
|
17
26
|
__send__("#{old_name}_#{locale_suffix}_#{suffix}", *args)
|
18
27
|
else
|
19
28
|
__send__("#{old_name}_#{I18n.default_locale.to_s.underscore}_#{suffix}", *args)
|
20
29
|
end
|
21
30
|
end
|
22
|
-
|
23
31
|
end
|
24
32
|
end
|
25
33
|
|
26
34
|
def self.translations_for(app, conditions, requirements, defaults, route_name, anchor, route_set, &block)
|
27
35
|
add_untranslated_helpers_to_controllers_and_views(route_name, route_set.named_routes.module, route_set.named_routes.helpers)
|
28
|
-
|
29
|
-
# problems with wildcards when default locale is omitted in paths. The
|
30
|
-
# default routes will catch all paths like wildcard if it is translated first
|
31
|
-
available_locales = I18n.available_locales.dup
|
32
|
-
available_locales.delete I18n.default_locale
|
33
|
-
available_locales.push I18n.default_locale
|
36
|
+
|
34
37
|
available_locales.each do |locale|
|
35
38
|
new_conditions = conditions.dup
|
36
39
|
new_conditions[:path_info] = translate_path(conditions[:path_info], locale)
|
37
40
|
if new_conditions[:required_defaults] && !new_conditions[:required_defaults].include?(RouteTranslator.locale_param_key)
|
38
41
|
new_conditions[:required_defaults] << RouteTranslator.locale_param_key if new_conditions[:required_defaults]
|
39
42
|
end
|
40
|
-
new_defaults = defaults.merge(RouteTranslator.locale_param_key => locale.to_s)
|
43
|
+
new_defaults = defaults.merge(RouteTranslator.locale_param_key => locale.to_s.gsub('native_', ''))
|
41
44
|
new_requirements = requirements.merge(RouteTranslator.locale_param_key => locale.to_s)
|
42
45
|
new_route_name = translate_name(route_name, locale)
|
43
46
|
new_route_name = nil if new_route_name && route_set.named_routes.routes[new_route_name.to_sym] #TODO: Investigate this :(
|
@@ -50,20 +53,24 @@ module RouteTranslator
|
|
50
53
|
end
|
51
54
|
end
|
52
55
|
|
56
|
+
private
|
57
|
+
def self.available_locales
|
58
|
+
available_locales = I18n.available_locales.dup
|
59
|
+
available_locales.push *RouteTranslator.native_locales if RouteTranslator.native_locales.present?
|
60
|
+
# Make sure the default locale is translated in last place to avoid
|
61
|
+
# problems with wildcards when default locale is omitted in paths. The
|
62
|
+
# default routes will catch all paths like wildcard if it is translated first.
|
63
|
+
available_locales.push(available_locales.delete(I18n.default_locale))
|
64
|
+
end
|
65
|
+
|
53
66
|
# Translates a path and adds the locale prefix.
|
54
67
|
def self.translate_path(path, locale)
|
55
68
|
new_path = path.dup
|
56
69
|
final_optional_segments = new_path.slice!(/(\([^\/]+\))$/)
|
57
70
|
translated_segments = new_path.split(/\/|\./).map{ |seg| translate_path_segment(seg, locale) }.select{ |seg| !seg.blank? }
|
58
71
|
|
59
|
-
|
60
|
-
|
61
|
-
# or forcing locale to all routes,
|
62
|
-
# or already generating actual unlocalized routes
|
63
|
-
if !RouteTranslator.config.hide_locale && (!default_locale?(locale) || RouteTranslator.config.force_locale || RouteTranslator.config.generate_unlocalized_routes || RouteTranslator.config.generate_unnamed_unlocalized_routes)
|
64
|
-
if !locale_param_present?(new_path)
|
65
|
-
translated_segments.unshift locale.to_s.downcase
|
66
|
-
end
|
72
|
+
if display_locale?(locale) && !locale_param_present?(new_path)
|
73
|
+
translated_segments.unshift(locale.to_s.downcase)
|
67
74
|
end
|
68
75
|
|
69
76
|
joined_segments = translated_segments.inject do |memo, segment|
|
@@ -74,6 +81,14 @@ module RouteTranslator
|
|
74
81
|
"/#{joined_segments}#{final_optional_segments}".gsub(/\/\(\//, '(/')
|
75
82
|
end
|
76
83
|
|
84
|
+
def self.display_locale?(locale)
|
85
|
+
!RouteTranslator.config.hide_locale && !RouteTranslator.native_locale?(locale) &&
|
86
|
+
(!default_locale?(locale) ||
|
87
|
+
RouteTranslator.config.force_locale ||
|
88
|
+
RouteTranslator.config.generate_unlocalized_routes ||
|
89
|
+
RouteTranslator.config.generate_unnamed_unlocalized_routes)
|
90
|
+
end
|
91
|
+
|
77
92
|
def self.translate_name(n, locale)
|
78
93
|
"#{n}_#{locale.to_s.underscore}" if n.present?
|
79
94
|
end
|
@@ -87,7 +102,7 @@ module RouteTranslator
|
|
87
102
|
# "people" will be translated, if there is no translation, the path
|
88
103
|
# segment is blank, begins with a ":" (param key) or "*" (wildcard),
|
89
104
|
# the segment is returned untouched
|
90
|
-
def self.translate_path_segment
|
105
|
+
def self.translate_path_segment(segment, locale)
|
91
106
|
return segment if segment.blank? or segment.starts_with?(":") or segment.starts_with?("(") or segment.starts_with?("*")
|
92
107
|
|
93
108
|
appended_part = segment.slice!(/(\()$/)
|
@@ -97,7 +112,8 @@ module RouteTranslator
|
|
97
112
|
end
|
98
113
|
|
99
114
|
def self.translate_string(str, locale)
|
100
|
-
|
115
|
+
locale = "#{locale}".gsub('native_', '')
|
116
|
+
res = I18n.translate(str, :scope => :routes, :locale => locale, :default => str)
|
101
117
|
URI.escape(res)
|
102
118
|
end
|
103
119
|
|
data/test/dummy/config/routes.rb
CHANGED
data/test/host_test.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
|
3
|
+
|
4
|
+
class TestHostsFromLocale < MiniTest::Unit::TestCase
|
5
|
+
include RouteTranslator::TestHelper
|
6
|
+
def setup
|
7
|
+
I18n.backend = I18n::Backend::Simple.new
|
8
|
+
I18n.load_path = [ File.expand_path('../locales/routes.yml', __FILE__) ]
|
9
|
+
I18n.reload!
|
10
|
+
|
11
|
+
config_host_locales({
|
12
|
+
'*.something.es' => :es,
|
13
|
+
'*.ru.subdomain.domain.*' => :ru,
|
14
|
+
'russia.something.net' => :ru,
|
15
|
+
'*.com' => :en
|
16
|
+
})
|
17
|
+
end
|
18
|
+
|
19
|
+
def teardown
|
20
|
+
config_host_locales({})
|
21
|
+
I18n.default_locale = :en
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_wildcard_at_beginning_matches
|
25
|
+
assert_equal :en, RouteTranslator::Host.locale_from_host('something.com')
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_wildcard_at_beginning_with_subdomain_matches
|
29
|
+
assert_equal :en, RouteTranslator::Host.locale_from_host('www.domain.com')
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_wildcard_at_beginning_without_subdomain_matches
|
33
|
+
assert_equal :en, RouteTranslator::Host.locale_from_host('domain.com')
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_wildcard_at_end_with_subdomain_matches
|
37
|
+
assert_equal :es, RouteTranslator::Host.locale_from_host('www.something.es')
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_wildcard_at_end_without_subdomain_matches
|
41
|
+
assert_equal :es, RouteTranslator::Host.locale_from_host('something.es')
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_no_wildcard_matches
|
45
|
+
assert_equal :ru, RouteTranslator::Host.locale_from_host('russia.something.net')
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_multiple_wildcard_matches
|
49
|
+
assert_equal :ru, RouteTranslator::Host.locale_from_host('www.ru.subdomain.domain.biz')
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_case_is_ignored
|
53
|
+
assert_equal :es, RouteTranslator::Host.locale_from_host('www.SoMeThInG.ES')
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_precedence_if_more_than_one_match
|
57
|
+
config_host_locales({ 'russia.*' => :ru, '*.com' => :en })
|
58
|
+
assert_equal :ru, RouteTranslator::Host.locale_from_host('russia.com')
|
59
|
+
|
60
|
+
config_host_locales({ '*.com' => :en, 'russia.*' => :ru })
|
61
|
+
assert_equal :en, RouteTranslator::Host.locale_from_host('russia.com')
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_default_locale_if_no_matches
|
65
|
+
assert_equal I18n.default_locale, RouteTranslator::Host.locale_from_host('nomatches.co.uk')
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_readme_examples_work
|
69
|
+
config_host_locales(
|
70
|
+
{
|
71
|
+
'*.es' => :es, # matches ['domain.es', 'subdomain.domain.es', 'www.long.string.of.subdomains.es'] etc.
|
72
|
+
'ru.wikipedia.*' => :ru, # matches ['ru.wikipedia.org', 'ru.wikipedia.net', 'ru.wikipedia.com'] etc.
|
73
|
+
'*.subdomain.domain.*' => :ru, # matches ['subdomain.domain.org', 'www.subdomain.domain.net'] etc.
|
74
|
+
'news.bbc.co.uk' => :en, # matches ['news.bbc.co.uk'] only
|
75
|
+
}
|
76
|
+
)
|
77
|
+
|
78
|
+
examples_1 = ['domain.es', 'subdomain.domain.es', 'www.long.string.of.subdomains.es']
|
79
|
+
examples_2 = ['ru.wikipedia.org', 'ru.wikipedia.net', 'ru.wikipedia.com']
|
80
|
+
examples_3 = ['subdomain.domain.org', 'www.subdomain.domain.net']
|
81
|
+
examples_4 = ['news.bbc.co.uk']
|
82
|
+
|
83
|
+
examples_1.each do |domain|
|
84
|
+
assert_equal :es, RouteTranslator::Host.locale_from_host(domain)
|
85
|
+
end
|
86
|
+
|
87
|
+
examples_2.each do |domain|
|
88
|
+
assert_equal :ru, RouteTranslator::Host.locale_from_host(domain)
|
89
|
+
end
|
90
|
+
|
91
|
+
examples_3.each do |domain|
|
92
|
+
assert_equal :ru, RouteTranslator::Host.locale_from_host(domain)
|
93
|
+
end
|
94
|
+
|
95
|
+
examples_4.each do |domain|
|
96
|
+
assert_equal :en, RouteTranslator::Host.locale_from_host(domain)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/test/integration_test.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
+
#encoding: utf-8
|
1
2
|
require File.expand_path('../test_helper', __FILE__)
|
2
|
-
|
3
|
+
|
3
4
|
require File.expand_path('../dummy/dummy_mounted_app', __FILE__)
|
4
5
|
require File.expand_path('../dummy/config/environment', __FILE__)
|
5
6
|
|
@@ -20,13 +21,50 @@ class IntegrationTest < class_to_inherit
|
|
20
21
|
assert_equal "Good", @response.body
|
21
22
|
assert_response :success
|
22
23
|
end
|
23
|
-
|
24
|
+
|
24
25
|
def test_i18n_locale_thread_safe
|
25
26
|
config_default_locale_settings 'en'
|
26
|
-
|
27
27
|
get '/es/dummy'
|
28
28
|
assert_equal 'es', @response.body
|
29
|
-
|
29
|
+
|
30
30
|
assert_equal :en, I18n.locale
|
31
31
|
end
|
32
|
+
|
33
|
+
def test_host_locales
|
34
|
+
## root of es com
|
35
|
+
host! 'www.testapp.es'
|
36
|
+
get '/'
|
37
|
+
assert_equal 'es', @response.body
|
38
|
+
assert_response :success
|
39
|
+
|
40
|
+
## native es route on es com
|
41
|
+
host! 'www.testapp.es'
|
42
|
+
get '/dummy'
|
43
|
+
assert_equal 'es', @response.body
|
44
|
+
assert_response :success
|
45
|
+
|
46
|
+
## ru route on es com
|
47
|
+
host! 'www.testapp.es'
|
48
|
+
get URI.escape('/ru/манекен')
|
49
|
+
assert_equal 'ru', @response.body
|
50
|
+
assert_response :success
|
51
|
+
|
52
|
+
## root of ru com
|
53
|
+
host! 'ru.testapp.com'
|
54
|
+
get '/'
|
55
|
+
assert_equal 'ru', @response.body
|
56
|
+
assert_response :success
|
57
|
+
|
58
|
+
## native ru route on ru com
|
59
|
+
host! 'ru.testapp.com'
|
60
|
+
get URI.escape('/манекен')
|
61
|
+
assert_equal 'ru', @response.body
|
62
|
+
assert_response :success
|
63
|
+
|
64
|
+
## es route on ru com
|
65
|
+
host! 'ru.testapp.com'
|
66
|
+
get '/es/dummy'
|
67
|
+
assert_equal 'es', @response.body
|
68
|
+
assert_response :success
|
69
|
+
end
|
32
70
|
end
|
data/test/routing_test.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
#encoding: utf-8
|
2
2
|
require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
|
3
|
-
require 'route_translator'
|
4
3
|
|
5
4
|
class PeopleController < ActionController::Base; end
|
6
5
|
class ProductsController < ActionController::Base; end
|
@@ -22,6 +21,7 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
22
21
|
config_generate_unlocalized_routes false
|
23
22
|
config_default_locale_settings("en")
|
24
23
|
config_generate_unnamed_unlocalized_routes false
|
24
|
+
config_host_locales({})
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_unnamed_root_route
|
@@ -95,7 +95,6 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
-
|
99
98
|
assert_routing '/en/products', :controller => 'products', :action => 'index', :locale => 'en'
|
100
99
|
assert_routing '/productos', :controller => 'products', :action => 'index', :locale => 'es'
|
101
100
|
assert_routing({:path => '/productos/1', :method => "GET"}, {:controller => 'products', :action => 'show', :id => '1', :locale => 'es'})
|
@@ -431,7 +430,7 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
431
430
|
# The dynamic route maps to the current locale
|
432
431
|
assert_equal '/es/gente', @routes.url_helpers.people_path
|
433
432
|
end
|
434
|
-
|
433
|
+
|
435
434
|
def test_blank_localized_routes
|
436
435
|
I18n.locale = 'en'
|
437
436
|
config_default_locale_settings 'en'
|
@@ -441,11 +440,11 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
441
440
|
get 'people/blank', :to => 'people#index', :as => 'people'
|
442
441
|
end
|
443
442
|
end
|
444
|
-
|
443
|
+
|
445
444
|
I18n.locale = 'en'
|
446
445
|
assert_routing '/people/blank', :controller => 'people', :action => 'index', :locale => 'en'
|
447
446
|
assert_equal '/people/blank', @routes.url_helpers.people_en_path
|
448
|
-
|
447
|
+
|
449
448
|
I18n.locale = 'es'
|
450
449
|
assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
|
451
450
|
assert_equal '/es/gente', @routes.url_helpers.people_es_path
|
@@ -481,6 +480,25 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
481
480
|
assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
|
482
481
|
end
|
483
482
|
|
483
|
+
def test_host_locales
|
484
|
+
config_host_locales({ '*.es' => 'es', '*.com' => 'en' })
|
485
|
+
|
486
|
+
draw_routes do
|
487
|
+
localized do
|
488
|
+
resources :people
|
489
|
+
end
|
490
|
+
root :to => 'people#index'
|
491
|
+
end
|
492
|
+
|
493
|
+
assert_recognizes({:controller => 'people', :action => 'index', :locale => 'es'}, { :path => 'http://testapp.es/gente', :method => :get })
|
494
|
+
assert_recognizes({:controller => 'people', :action => 'index', :locale => 'es'}, { :path => 'http://testapp.es/es/gente', :method => :get })
|
495
|
+
assert_recognizes({:controller => 'people', :action => 'index'}, { :path => 'http://testapp.es/', :method => :get })
|
496
|
+
|
497
|
+
assert_recognizes({:controller => 'people', :action => 'index', :locale => 'en'}, { :path => 'http://testapp.com/people', :method => :get })
|
498
|
+
assert_recognizes({:controller => 'people', :action => 'index'}, { :path => 'http://testapp.com/', :method => :get })
|
499
|
+
end
|
500
|
+
|
501
|
+
|
484
502
|
def test_action_controller_gets_locale_setter
|
485
503
|
ActionController::Base.instance_methods.include?('set_locale_from_url')
|
486
504
|
end
|
@@ -504,7 +522,8 @@ class ProductsControllerTest < ActionController::TestCase
|
|
504
522
|
I18n.load_path = [ File.expand_path('../locales/routes.yml', __FILE__) ]
|
505
523
|
I18n.reload!
|
506
524
|
|
507
|
-
config_default_locale_settings '
|
525
|
+
config_default_locale_settings 'es'
|
526
|
+
config_host_locales({:es => 'es'})
|
508
527
|
|
509
528
|
draw_routes do
|
510
529
|
localized do
|
@@ -519,12 +538,12 @@ class ProductsControllerTest < ActionController::TestCase
|
|
519
538
|
config_generate_unlocalized_routes false
|
520
539
|
config_default_locale_settings("en")
|
521
540
|
config_generate_unnamed_unlocalized_routes false
|
541
|
+
config_host_locales({})
|
522
542
|
end
|
523
543
|
|
524
544
|
def test_url_helpers_are_included
|
525
|
-
|
526
545
|
#doing it this way because assert_nothing_raised doesn't work on all rails versions
|
527
|
-
%w(product_path product_url product_es_path product_es_url).each do |method|
|
546
|
+
%w(product_path product_url product_es_path product_es_url product_native_es_path product_native_es_url).each do |method|
|
528
547
|
begin
|
529
548
|
send(method)
|
530
549
|
rescue Exception => e
|
@@ -533,4 +552,3 @@ class ProductsControllerTest < ActionController::TestCase
|
|
533
552
|
end
|
534
553
|
end
|
535
554
|
end
|
536
|
-
|
data/test/test_helper.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
1
3
|
require 'test/unit'
|
2
4
|
require 'minitest/mock'
|
3
5
|
require 'minitest/unit'
|
@@ -57,6 +59,10 @@ module RouteTranslator
|
|
57
59
|
RouteTranslator.config.generate_unnamed_unlocalized_routes = boolean
|
58
60
|
end
|
59
61
|
|
62
|
+
def config_host_locales(hash)
|
63
|
+
RouteTranslator.config.host_locales = hash.with_indifferent_access
|
64
|
+
end
|
65
|
+
|
60
66
|
def path_string(route)
|
61
67
|
path = route.respond_to?(:path) ? route.path : route.to_s.split(' ')[1]
|
62
68
|
path.respond_to?(:spec) ? path.spec.to_s : path.to_s
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: route_translator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.2.
|
4
|
+
version: 3.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Raul Murciano
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-07-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: minitest
|
@@ -65,6 +65,7 @@ files:
|
|
65
65
|
- lib/route_translator/extensions/action_controller.rb
|
66
66
|
- lib/route_translator/extensions/mapper.rb
|
67
67
|
- lib/route_translator/extensions/route_set.rb
|
68
|
+
- lib/route_translator/host.rb
|
68
69
|
- lib/route_translator/translator.rb
|
69
70
|
- lib/route_translator/version.rb
|
70
71
|
- test/dummy/app/controllers/dummy_controller.rb
|
@@ -72,12 +73,14 @@ files:
|
|
72
73
|
- test/dummy/config/application.rb
|
73
74
|
- test/dummy/config/boot.rb
|
74
75
|
- test/dummy/config/environment.rb
|
76
|
+
- test/dummy/config/initializers/route_translator.rb
|
75
77
|
- test/dummy/config/initializers/secret_token.rb
|
76
78
|
- test/dummy/config/initializers/session_store.rb
|
77
79
|
- test/dummy/config/locales/all.yml
|
78
80
|
- test/dummy/config/routes.rb
|
79
81
|
- test/dummy/dummy_mounted_app.rb
|
80
82
|
- test/dummy/script/rails
|
83
|
+
- test/host_test.rb
|
81
84
|
- test/integration_test.rb
|
82
85
|
- test/locales/routes.yml
|
83
86
|
- test/routing_test.rb
|
@@ -111,12 +114,14 @@ test_files:
|
|
111
114
|
- test/dummy/config/application.rb
|
112
115
|
- test/dummy/config/boot.rb
|
113
116
|
- test/dummy/config/environment.rb
|
117
|
+
- test/dummy/config/initializers/route_translator.rb
|
114
118
|
- test/dummy/config/initializers/secret_token.rb
|
115
119
|
- test/dummy/config/initializers/session_store.rb
|
116
120
|
- test/dummy/config/locales/all.yml
|
117
121
|
- test/dummy/config/routes.rb
|
118
122
|
- test/dummy/dummy_mounted_app.rb
|
119
123
|
- test/dummy/script/rails
|
124
|
+
- test/host_test.rb
|
120
125
|
- test/integration_test.rb
|
121
126
|
- test/locales/routes.yml
|
122
127
|
- test/routing_test.rb
|