route_translator 2.0.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/route_translator.rb +11 -50
- data/lib/route_translator/extensions.rb +3 -0
- data/lib/route_translator/extensions/action_controller.rb +11 -0
- data/lib/route_translator/extensions/mapper.rb +52 -0
- data/lib/route_translator/extensions/route_set.rb +13 -0
- data/lib/route_translator/translator.rb +84 -0
- data/lib/route_translator/version.rb +1 -1
- data/test/dummy/app/controllers/dummy_controller.rb +5 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +13 -0
- data/test/dummy/config/boot.rb +0 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/locales/all.yml +9 -0
- data/test/dummy/config/routes.rb +6 -0
- data/test/dummy/dummy_mounted_app.rb +6 -0
- data/test/dummy/script/rails +6 -0
- data/test/integration_test.rb +23 -0
- data/test/locales/routes.yml +2 -6
- data/test/{route_translator_test.rb → routing_test.rb} +110 -193
- data/test/test_helper.rb +65 -49
- metadata +39 -18
- data/lib/route_translator/railtie.rb +0 -23
- data/lib/route_translator/route_set.rb +0 -50
- data/lib/route_translator/route_set/dictionary_management.rb +0 -76
- data/lib/route_translator/route_set/helpers.rb +0 -29
- data/lib/route_translator/route_set/translator.rb +0 -161
- data/lib/route_translator/routes_reloader.rb +0 -32
- data/lib/route_translator/test_request.rb +0 -11
- data/lib/tasks/route_translator.rake +0 -35
data/lib/route_translator.rb
CHANGED
@@ -3,65 +3,26 @@ require 'action_controller'
|
|
3
3
|
require 'action_mailer'
|
4
4
|
require 'action_dispatch'
|
5
5
|
|
6
|
-
require 'route_translator/
|
7
|
-
require 'route_translator/
|
8
|
-
require 'route_translator/railtie' if defined?(Rails::Railtie)
|
6
|
+
require File.expand_path('../route_translator/extensions', __FILE__)
|
7
|
+
require File.expand_path('../route_translator/translator', __FILE__)
|
9
8
|
|
10
9
|
module RouteTranslator
|
11
10
|
|
12
11
|
TRANSLATABLE_SEGMENT = /^([-_a-zA-Z0-9]+)(\()?/.freeze
|
13
|
-
LOCALE_PARAM_KEY = :locale
|
14
|
-
ROUTE_HELPER_CONTAINER = [
|
15
|
-
ActionController::Base,
|
16
|
-
ActionView::Base,
|
17
|
-
ActionMailer::Base,
|
18
|
-
ActionDispatch::Routing::UrlFor
|
19
|
-
].freeze
|
20
12
|
|
21
|
-
Configuration = Struct.new(:force_locale, :generate_unlocalized_routes, :translation_file)
|
13
|
+
Configuration = Struct.new(:force_locale, :generate_unlocalized_routes, :translation_file, :locale_param_key)
|
22
14
|
|
23
|
-
def self.
|
24
|
-
locale.to_s.underscore
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.config
|
15
|
+
def self.config(&block)
|
28
16
|
@config ||= Configuration.new
|
17
|
+
@config.force_locale ||= false
|
18
|
+
@config.generate_unlocalized_routes ||= false
|
19
|
+
@config.locale_param_key ||= :locale
|
20
|
+
yield @config if block
|
21
|
+
@config
|
29
22
|
end
|
30
23
|
|
31
|
-
|
32
|
-
|
33
|
-
module Controller
|
34
|
-
def set_locale_from_url
|
35
|
-
I18n.locale = params[RouteTranslator::LOCALE_PARAM_KEY]
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
module Mapper
|
40
|
-
#yield the block and add all the routes created
|
41
|
-
#in it to the localized_routes array
|
42
|
-
def localized
|
43
|
-
routes_before = @set.routes.map(&:to_s)
|
44
|
-
yield
|
45
|
-
routes_after = @set.routes.map(&:to_s)
|
46
|
-
@set.localized_routes ||= []
|
47
|
-
@set.localized_routes.concat(routes_after - routes_before)
|
48
|
-
@set.localized_routes.uniq!
|
49
|
-
end
|
24
|
+
def self.locale_param_key
|
25
|
+
self.config.locale_param_key
|
50
26
|
end
|
51
27
|
|
52
|
-
ActiveSupport.run_load_hooks(:route_translator, self)
|
53
28
|
end
|
54
|
-
|
55
|
-
# Add locale_suffix to controllers, views and mailers
|
56
|
-
RouteTranslator::ROUTE_HELPER_CONTAINER.each do |klass|
|
57
|
-
klass.class_eval do
|
58
|
-
private
|
59
|
-
def locale_suffix locale
|
60
|
-
RouteTranslator.locale_suffix locale
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
ActionController::Base.send(:include, RouteTranslator::Controller)
|
66
|
-
ActionDispatch::Routing::Mapper.send(:include, RouteTranslator::Mapper)
|
67
|
-
ActionDispatch::Routing::RouteSet.send(:include, RouteTranslator::RouteSet)
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'action_dispatch'
|
2
|
+
|
3
|
+
module ActionDispatch
|
4
|
+
module Routing
|
5
|
+
class Mapper
|
6
|
+
def localized
|
7
|
+
@localized = true
|
8
|
+
yield
|
9
|
+
@localized = false
|
10
|
+
end
|
11
|
+
|
12
|
+
if instance_methods.map(&:to_s).include?('add_route')
|
13
|
+
def add_route(action, options) # :nodoc:
|
14
|
+
path = path_for_action(action, options.delete(:path))
|
15
|
+
|
16
|
+
if action.to_s =~ /^[\w\/]+$/
|
17
|
+
options[:action] ||= action unless action.to_s.include?("/")
|
18
|
+
else
|
19
|
+
action = nil
|
20
|
+
end
|
21
|
+
|
22
|
+
if !options.fetch(:as, true)
|
23
|
+
options.delete(:as)
|
24
|
+
else
|
25
|
+
options[:as] = name_for_action(options[:as], action)
|
26
|
+
end
|
27
|
+
|
28
|
+
mapping = Mapping.new(@set, @scope, path, options)
|
29
|
+
app, conditions, requirements, defaults, as, anchor = mapping.to_route
|
30
|
+
if @localized
|
31
|
+
@set.add_localized_route(app, conditions, requirements, defaults, as, anchor)
|
32
|
+
else
|
33
|
+
@set.add_route(app, conditions, requirements, defaults, as, anchor)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
else
|
37
|
+
module Base
|
38
|
+
def match(path, options=nil)
|
39
|
+
mapping = Mapping.new(@set, @scope, path, options || {})
|
40
|
+
app, conditions, requirements, defaults, as, anchor = mapping.to_route
|
41
|
+
if @localized
|
42
|
+
@set.add_localized_route(app, conditions, requirements, defaults, as, anchor)
|
43
|
+
else
|
44
|
+
@set.add_route(app, conditions, requirements, defaults, as, anchor)
|
45
|
+
end
|
46
|
+
self
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'action_dispatch'
|
2
|
+
|
3
|
+
module ActionDispatch
|
4
|
+
module Routing
|
5
|
+
class RouteSet
|
6
|
+
def add_localized_route(app, conditions = {}, requirements = {}, defaults = {}, as = nil, anchor = true)
|
7
|
+
RouteTranslator::Translator.translations_for(app, conditions, requirements, defaults, as, anchor, self) do |*translated_args|
|
8
|
+
add_route(*translated_args)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module RouteTranslator
|
2
|
+
module Translator
|
3
|
+
# Add standard route helpers for default locale e.g.
|
4
|
+
# I18n.locale = :de
|
5
|
+
# people_path -> people_de_path
|
6
|
+
# I18n.locale = :fr
|
7
|
+
# people_path -> people_fr_path
|
8
|
+
def self.add_untranslated_helpers_to_controllers_and_views(old_name, helper_container)
|
9
|
+
['path', 'url'].each do |suffix|
|
10
|
+
new_helper_name = "#{old_name}_#{suffix}"
|
11
|
+
|
12
|
+
helper_container.__send__(:define_method, new_helper_name) do |*args|
|
13
|
+
locale_suffix = I18n.locale.to_s.underscore
|
14
|
+
if respond_to?("#{old_name}_#{locale_suffix}_#{suffix}")
|
15
|
+
__send__("#{old_name}_#{locale_suffix}_#{suffix}", *args)
|
16
|
+
else
|
17
|
+
__send__("#{old_name}_#{I18n.default_locale.to_s.underscore}_#{suffix}", *args)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.translations_for(app, conditions, requirements, defaults, route_name, anchor, route_set, &block)
|
24
|
+
add_untranslated_helpers_to_controllers_and_views(route_name, route_set.named_routes.module)
|
25
|
+
I18n.available_locales.each do |locale|
|
26
|
+
new_conditions = conditions.dup
|
27
|
+
new_conditions[:path_info] = translate_path(conditions[:path_info], locale)
|
28
|
+
if new_conditions[:required_defaults] && !new_conditions[:required_defaults].include?(RouteTranslator.locale_param_key)
|
29
|
+
new_conditions[:required_defaults] << RouteTranslator.locale_param_key if new_conditions[:required_defaults]
|
30
|
+
end
|
31
|
+
new_defaults = defaults.merge(RouteTranslator.locale_param_key => locale.to_s)
|
32
|
+
new_requirements = requirements.merge(RouteTranslator.locale_param_key => locale.to_s)
|
33
|
+
new_route_name = translate_name(route_name, locale)
|
34
|
+
new_route_name = nil if route_set.named_routes.routes[new_route_name.to_sym] #TODO: Investigate this :(
|
35
|
+
block.call(app, new_conditions, new_requirements, new_defaults, new_route_name, anchor)
|
36
|
+
end
|
37
|
+
block.call(app, conditions, requirements, defaults, route_name, anchor) if RouteTranslator.config.generate_unlocalized_routes
|
38
|
+
end
|
39
|
+
|
40
|
+
# Translates a path and adds the locale prefix.
|
41
|
+
def self.translate_path(path, locale)
|
42
|
+
new_path = path.dup
|
43
|
+
final_optional_segments = new_path.slice!(/(\(.+\))$/)
|
44
|
+
new_path = new_path.split("/").map{|seg| translate_path_segment(seg, locale)}.join('/')
|
45
|
+
|
46
|
+
# Add locale prefix if it's not the default locale,
|
47
|
+
# or forcing locale to all routes,
|
48
|
+
# or already generating actual unlocalized routes
|
49
|
+
if !default_locale?(locale) || RouteTranslator.config.force_locale || RouteTranslator.config.generate_unlocalized_routes
|
50
|
+
new_path = "/#{locale.to_s.downcase}#{new_path}"
|
51
|
+
end
|
52
|
+
|
53
|
+
new_path = "/" if new_path.blank?
|
54
|
+
|
55
|
+
"#{new_path}#{final_optional_segments}"
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.translate_name(n, locale)
|
59
|
+
"#{n}_#{locale.to_s.underscore}" if n.present?
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.default_locale?(locale)
|
63
|
+
I18n.default_locale.to_sym == locale.to_sym
|
64
|
+
end
|
65
|
+
|
66
|
+
# Tries to translate a single path segment. If the path segment
|
67
|
+
# contains sth. like a optional format "people(.:format)", only
|
68
|
+
# "people" will be translated, if there is no translation, the path
|
69
|
+
# segment is blank or begins with a ":" (param key), the segment
|
70
|
+
# is returned untouched
|
71
|
+
def self.translate_path_segment segment, locale
|
72
|
+
return segment if segment.blank? or segment.starts_with?(":")
|
73
|
+
|
74
|
+
match = TRANSLATABLE_SEGMENT.match(segment)[1] rescue nil
|
75
|
+
|
76
|
+
(translate_string(match, locale) || segment)
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.translate_string(str, locale)
|
80
|
+
fallback = I18n.translate(str, :locale => locale, :default => str)
|
81
|
+
I18n.translate("routes.#{str}", :locale => locale, :default => fallback)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "action_controller/railtie"
|
2
|
+
begin
|
3
|
+
require "active_resource/railtie"
|
4
|
+
rescue LoadError
|
5
|
+
end
|
6
|
+
require "route_translator"
|
7
|
+
|
8
|
+
module Dummy
|
9
|
+
class Application < Rails::Application
|
10
|
+
# config.logger = Logger.new(File.new("/dev/null", 'w'))
|
11
|
+
config.active_support.deprecation = :log
|
12
|
+
end
|
13
|
+
end
|
File without changes
|
@@ -0,0 +1,7 @@
|
|
1
|
+
# Be sure to restart your server when you modify this file.
|
2
|
+
|
3
|
+
# Your secret key for verifying the integrity of signed cookies.
|
4
|
+
# If you change this key, all old signed cookies will become invalid!
|
5
|
+
# Make sure the secret is at least 30 characters and all random,
|
6
|
+
# no regular words or you'll be exposed to dictionary attacks.
|
7
|
+
Dummy::Application.config.secret_token = '831d41b30a9e2d662a2d0c6f1f05b5f0b7db5d59446a18686b122e623e10bc5462eb48f9c9245f3e8b00cbe0cf007786482ba7012331de8f1bde93985c4d9686'
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# Be sure to restart your server when you modify this file.
|
2
|
+
|
3
|
+
Dummy::Application.config.session_store :cookie_store, :key => '_dummy_session'
|
4
|
+
|
5
|
+
# Use the database for sessions instead of the cookie-based default,
|
6
|
+
# which shouldn't be used to store highly confidential information
|
7
|
+
# (create the session table with "rails generate session_migration")
|
8
|
+
# Dummy::Application.config.session_store :active_record_store
|
@@ -0,0 +1,6 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
|
+
|
4
|
+
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
5
|
+
require File.expand_path('../../config/boot', __FILE__)
|
6
|
+
require 'rails/commands'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
require 'route_translator'
|
3
|
+
require File.expand_path('../dummy/dummy_mounted_app', __FILE__)
|
4
|
+
require File.expand_path('../dummy/config/environment', __FILE__)
|
5
|
+
|
6
|
+
class_to_inherit = defined?(ActionDispatch::IntegrationTest) ? ActionDispatch::IntegrationTest : ActionController::IntegrationTest
|
7
|
+
class IntegrationTest < class_to_inherit
|
8
|
+
include RouteTranslator::TestHelper
|
9
|
+
|
10
|
+
def test_set_locale_from_params
|
11
|
+
config_default_locale_settings 'en'
|
12
|
+
|
13
|
+
get '/es/dummy'
|
14
|
+
assert_equal 'es', @response.body
|
15
|
+
assert_response :success
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_mounted_apps_work_with_correct_path
|
19
|
+
get 'dummy_mounted_app'
|
20
|
+
assert_equal "Good", @response.body
|
21
|
+
assert_response :success
|
22
|
+
end
|
23
|
+
end
|
data/test/locales/routes.yml
CHANGED
@@ -1,13 +1,5 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'mocha'
|
3
|
-
|
4
|
-
require "rails"
|
5
|
-
require "action_controller/railtie"
|
6
|
-
|
7
|
-
require 'route_translator'
|
8
|
-
require "route_translator/test_request"
|
9
|
-
|
10
1
|
require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
|
2
|
+
require 'route_translator'
|
11
3
|
|
12
4
|
class PeopleController < ActionController::Base; end
|
13
5
|
class ProductsController < ActionController::Base; end
|
@@ -16,60 +8,70 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
16
8
|
include ActionDispatch::Assertions::RoutingAssertions
|
17
9
|
include RouteTranslator::TestHelper
|
18
10
|
|
19
|
-
def config_default_locale_settings(locale)
|
20
|
-
I18n.default_locale = locale
|
21
|
-
end
|
22
|
-
|
23
|
-
def config_force_locale(boolean)
|
24
|
-
RouteTranslator.config.force_locale = boolean
|
25
|
-
end
|
26
|
-
|
27
|
-
def config_generate_unlocalized_routes(boolean)
|
28
|
-
RouteTranslator.config.generate_unlocalized_routes = boolean
|
29
|
-
end
|
30
|
-
|
31
|
-
def config_translation_file (file)
|
32
|
-
RouteTranslator.config.translation_file = file
|
33
|
-
end
|
34
|
-
|
35
11
|
def setup
|
36
|
-
setup_application
|
37
|
-
|
38
|
-
@controller = ActionController::Base.new
|
39
|
-
@view = ActionView::Base.new
|
40
12
|
@routes = ActionDispatch::Routing::RouteSet.new
|
13
|
+
I18n.backend = I18n::Backend::Simple.new
|
14
|
+
I18n.load_path = [ File.expand_path('../locales/routes.yml', __FILE__) ]
|
15
|
+
I18n.reload!
|
41
16
|
end
|
42
17
|
|
43
18
|
def teardown
|
44
19
|
config_force_locale false
|
45
20
|
config_generate_unlocalized_routes false
|
46
21
|
config_default_locale_settings("en")
|
47
|
-
routes_file ""
|
48
|
-
FileUtils.rm_rf "#{tmp_path}/log"
|
49
22
|
end
|
50
23
|
|
51
24
|
def test_unnamed_root_route
|
52
|
-
|
25
|
+
config_default_locale_settings 'en'
|
26
|
+
draw_routes do
|
53
27
|
localized do
|
54
28
|
root :to => 'people#index'
|
55
29
|
end
|
56
30
|
end
|
57
|
-
config_default_locale_settings 'en'
|
58
|
-
@routes.translate_with_dictionary{|t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
|
59
31
|
|
60
32
|
assert_routing '/', :controller => 'people', :action => 'index', :locale => 'en'
|
61
33
|
assert_routing '/es', :controller => 'people', :action => 'index', :locale => 'es'
|
62
34
|
end
|
63
35
|
|
64
|
-
def
|
65
|
-
|
36
|
+
def test_resources
|
37
|
+
config_default_locale_settings 'es'
|
38
|
+
|
39
|
+
draw_routes do
|
66
40
|
localized do
|
67
|
-
|
41
|
+
resources :products
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
assert_routing '/en/products', :controller => 'products', :action => 'index', :locale => 'en'
|
47
|
+
assert_routing '/productos', :controller => 'products', :action => 'index', :locale => 'es'
|
48
|
+
assert_routing({:path => '/productos/1', :method => "GET"}, {:controller => 'products', :action => 'show', :id => '1', :locale => 'es'})
|
49
|
+
assert_routing({:path => '/productos/1', :method => "PUT"}, {:controller => 'products', :action => 'update', :id => '1', :locale => 'es'})
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_resources_with_only
|
53
|
+
config_default_locale_settings 'es'
|
54
|
+
|
55
|
+
draw_routes do
|
56
|
+
localized do
|
57
|
+
resources :products, :only => [:index, :show]
|
68
58
|
end
|
69
59
|
end
|
60
|
+
|
61
|
+
assert_routing '/en/products', :controller => 'products', :action => 'index', :locale => 'en'
|
62
|
+
assert_routing '/productos', :controller => 'products', :action => 'index', :locale => 'es'
|
63
|
+
assert_routing({:path => '/productos/1', :method => "GET"}, {:controller => 'products', :action => 'show', :id => '1', :locale => 'es'})
|
64
|
+
assert_unrecognized_route({:path => '/productos/1', :method => "PUT"}, {:controller => 'products', :action => 'update', :id => '1', :locale => 'es'})
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_unnamed_root_route_without_prefix
|
70
68
|
config_default_locale_settings 'es'
|
71
69
|
|
72
|
-
|
70
|
+
draw_routes do
|
71
|
+
localized do
|
72
|
+
root :to => 'people#index'
|
73
|
+
end
|
74
|
+
end
|
73
75
|
|
74
76
|
assert_routing '/', :controller => 'people', :action => 'index', :locale => 'es'
|
75
77
|
assert_routing '/en', :controller => 'people', :action => 'index', :locale => 'en'
|
@@ -77,55 +79,53 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
77
79
|
end
|
78
80
|
|
79
81
|
def test_unnamed_untranslated_route
|
80
|
-
|
82
|
+
config_default_locale_settings 'en'
|
83
|
+
|
84
|
+
draw_routes do
|
81
85
|
localized do
|
82
|
-
|
86
|
+
get 'foo', :to => 'people#index'
|
83
87
|
end
|
84
88
|
end
|
85
|
-
config_default_locale_settings 'en'
|
86
|
-
@routes.translate_with_dictionary{|t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
|
87
89
|
|
88
90
|
assert_routing '/es/foo', :controller => 'people', :action => 'index', :locale => 'es'
|
89
91
|
assert_routing '/foo', :controller => 'people', :action => 'index', :locale => 'en'
|
90
92
|
end
|
91
93
|
|
92
94
|
def test_unnamed_translated_route_on_default_locale
|
93
|
-
|
94
|
-
|
95
|
+
config_default_locale_settings 'es'
|
96
|
+
|
97
|
+
@routes.draw { get 'people', :to => 'people#index' }
|
98
|
+
draw_routes do
|
95
99
|
localized do
|
96
|
-
|
100
|
+
get 'people', :to => 'people#index'
|
97
101
|
end
|
98
102
|
end
|
99
103
|
|
100
|
-
config_default_locale_settings 'es'
|
101
|
-
|
102
|
-
@routes.translate_with_dictionary{|t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
|
103
104
|
|
104
105
|
assert_routing '/en/people', :controller => 'people', :action => 'index', :locale => 'en'
|
105
106
|
assert_routing '/gente', :controller => 'people', :action => 'index', :locale => 'es'
|
106
107
|
end
|
107
108
|
|
108
109
|
def test_unnamed_translated_route_on_non_default_locale
|
109
|
-
|
110
|
+
config_default_locale_settings 'en'
|
111
|
+
draw_routes do
|
110
112
|
localized do
|
111
|
-
|
113
|
+
get 'people', :to => 'people#index'
|
112
114
|
end
|
113
115
|
end
|
114
|
-
config_default_locale_settings 'en'
|
115
|
-
@routes.translate_with_dictionary{|t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
|
116
116
|
|
117
117
|
assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
|
118
118
|
assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
|
119
119
|
end
|
120
120
|
|
121
121
|
def test_named_translated_route_with_prefix_must_have_locale_as_static_segment
|
122
|
-
|
122
|
+
config_default_locale_settings 'en'
|
123
|
+
|
124
|
+
draw_routes do
|
123
125
|
localized do
|
124
|
-
|
126
|
+
get 'people', :to => 'people#index'
|
125
127
|
end
|
126
128
|
end
|
127
|
-
config_default_locale_settings 'en'
|
128
|
-
@routes.translate_with_dictionary{|t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
|
129
129
|
|
130
130
|
# we check the string representation of the route,
|
131
131
|
# if it stores locale as a dynamic segment it would be represented as: "/:locale/gente"
|
@@ -133,13 +133,12 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
133
133
|
end
|
134
134
|
|
135
135
|
def test_named_empty_route_without_prefix
|
136
|
-
|
136
|
+
config_default_locale_settings 'es'
|
137
|
+
draw_routes do
|
137
138
|
localized do
|
138
139
|
root :to => 'people#index', :as => 'people'
|
139
140
|
end
|
140
141
|
end
|
141
|
-
config_default_locale_settings 'es'
|
142
|
-
@routes.translate_with_dictionary{|t| t['es'] = {}; t['en'] = {'people' => 'gente'}; }
|
143
142
|
|
144
143
|
assert_routing '/en', :controller => 'people', :action => 'index', :locale => 'en'
|
145
144
|
assert_routing '/', :controller => 'people', :action => 'index', :locale => 'es'
|
@@ -147,76 +146,73 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
147
146
|
end
|
148
147
|
|
149
148
|
def test_named_root_route_without_prefix
|
150
|
-
|
149
|
+
config_default_locale_settings 'es'
|
150
|
+
|
151
|
+
draw_routes do
|
151
152
|
localized do
|
152
153
|
root :to => 'people#index'
|
153
154
|
end
|
154
155
|
end
|
155
156
|
|
156
|
-
config_default_locale_settings 'es'
|
157
|
-
|
158
|
-
@routes.translate_from_file(File.expand_path('locales/routes.yml', File.dirname(__FILE__)))
|
159
|
-
|
160
157
|
assert_routing '/', :controller => 'people', :action => 'index', :locale => 'es'
|
161
158
|
assert_routing '/en', :controller => 'people', :action => 'index', :locale => 'en'
|
162
159
|
assert_unrecognized_route '/es', :controller => 'people', :action => 'index', :locale => 'es'
|
163
160
|
end
|
164
161
|
|
165
162
|
def test_named_untranslated_route_without_prefix
|
166
|
-
|
163
|
+
config_default_locale_settings 'es'
|
164
|
+
|
165
|
+
draw_routes do
|
167
166
|
localized do
|
168
|
-
|
167
|
+
get 'foo', :to => 'people#index', :as => 'people'
|
169
168
|
end
|
170
169
|
end
|
171
|
-
config_default_locale_settings 'es'
|
172
|
-
@routes.translate_with_dictionary{ |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
|
173
170
|
|
174
171
|
assert_routing '/en/foo', :controller => 'people', :action => 'index', :locale => 'en'
|
175
172
|
assert_routing '/foo', :controller => 'people', :action => 'index', :locale => 'es'
|
173
|
+
|
176
174
|
assert_helpers_include :people_en, :people_es, :people
|
177
175
|
end
|
178
176
|
|
179
177
|
def test_named_translated_route_on_default_locale_without_prefix
|
180
|
-
|
178
|
+
config_default_locale_settings 'es'
|
179
|
+
|
180
|
+
draw_routes do
|
181
181
|
localized do
|
182
|
-
|
182
|
+
get 'people', :to => 'people#index', :as => 'people'
|
183
183
|
end
|
184
184
|
end
|
185
185
|
|
186
|
-
config_default_locale_settings 'es'
|
187
|
-
|
188
|
-
@routes.translate_with_dictionary{|t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
|
189
|
-
|
190
186
|
assert_routing '/en/people', :controller => 'people', :action => 'index', :locale => 'en'
|
191
187
|
assert_routing 'gente', :controller => 'people', :action => 'index', :locale => 'es'
|
188
|
+
|
189
|
+
|
192
190
|
assert_helpers_include :people_en, :people_es, :people
|
193
191
|
end
|
194
192
|
|
195
193
|
def test_named_translated_route_on_non_default_locale_without_prefix
|
196
|
-
|
194
|
+
draw_routes do
|
197
195
|
localized do
|
198
|
-
|
196
|
+
get 'people', :to => 'people#index', :as => 'people'
|
199
197
|
end
|
200
198
|
end
|
201
199
|
|
202
200
|
config_default_locale_settings 'en'
|
203
201
|
|
204
|
-
@routes.translate_with_dictionary{|t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
|
205
|
-
|
206
202
|
assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
|
207
203
|
assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
|
204
|
+
|
205
|
+
|
208
206
|
assert_helpers_include :people_en, :people_es, :people
|
209
207
|
end
|
210
208
|
|
211
209
|
def test_formatted_root_route
|
212
|
-
|
210
|
+
draw_routes do
|
213
211
|
localized do
|
214
212
|
root :to => 'people#index', :as => 'root'
|
215
213
|
end
|
216
214
|
end
|
217
215
|
|
218
|
-
@routes.translate_with_dictionary{ |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
|
219
|
-
|
220
216
|
if formatted_root_route?
|
221
217
|
assert_equal '/(.:format)', path_string(named_route('root_en'))
|
222
218
|
assert_equal '/es(.:format)', path_string(named_route('root_es'))
|
@@ -226,112 +222,62 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
226
222
|
end
|
227
223
|
end
|
228
224
|
|
229
|
-
def
|
230
|
-
@routes.draw do
|
231
|
-
localized do
|
232
|
-
match 'people', :to => 'people#index', :as => 'people'
|
233
|
-
end
|
234
|
-
end
|
225
|
+
def test_i18n_based_translations_setting_locales
|
235
226
|
config_default_locale_settings 'en'
|
236
227
|
|
237
|
-
|
238
|
-
|
239
|
-
assert_routing '/es/Gente', :controller => 'people', :action => 'index', :locale => 'ES'
|
240
|
-
end
|
241
|
-
|
242
|
-
def test_languages_load_from_file
|
243
|
-
@routes.draw do
|
228
|
+
draw_routes do
|
244
229
|
localized do
|
245
|
-
|
230
|
+
get 'people', :to => 'people#index', :as => 'people'
|
246
231
|
end
|
247
232
|
end
|
248
|
-
config_default_locale_settings 'en'
|
249
|
-
|
250
|
-
@routes.translate_from_file(File.expand_path('locales/routes.yml', File.dirname(__FILE__)))
|
251
233
|
|
252
|
-
assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
|
253
234
|
assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
|
254
|
-
|
255
|
-
end
|
256
|
-
|
257
|
-
def test_languages_load_from_file_without_dictionary_for_default_locale
|
258
|
-
@routes.draw do
|
259
|
-
localized do
|
260
|
-
match 'people', :to => 'people#index', :as => 'people'
|
261
|
-
end
|
262
|
-
end
|
263
|
-
config_default_locale_settings 'fr'
|
264
|
-
|
265
|
-
@routes.translate_from_file(File.expand_path('locales/routes.yml', File.dirname(__FILE__)))
|
235
|
+
assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
|
266
236
|
|
267
|
-
|
268
|
-
|
269
|
-
assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
|
270
|
-
assert_helpers_include :people_fr, :people_en, :people_es, :people
|
237
|
+
|
238
|
+
assert_helpers_include :people_en, :people_es, :people
|
271
239
|
end
|
272
240
|
|
273
|
-
def
|
274
|
-
@routes.draw do
|
275
|
-
localized do
|
276
|
-
match 'people', :to => 'people#index', :as => 'people'
|
277
|
-
end
|
278
|
-
end
|
241
|
+
def test_translations_depend_on_available_locales
|
279
242
|
config_default_locale_settings 'en'
|
280
243
|
|
281
|
-
I18n.
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
|
287
|
-
assert_helpers_include :people_en, :people_es, :people
|
288
|
-
end
|
289
|
-
|
290
|
-
def test_i18n_based_translations_taking_i18n_available_locales
|
291
|
-
@routes.draw do
|
292
|
-
localized do
|
293
|
-
match 'people', :to => 'people#index', :as => 'people'
|
244
|
+
I18n.stub(:available_locales, [:es, :en, :fr]) do
|
245
|
+
draw_routes do
|
246
|
+
localized do
|
247
|
+
get 'people', :to => 'people#index', :as => 'people'
|
248
|
+
end
|
294
249
|
end
|
295
250
|
end
|
296
|
-
config_default_locale_settings 'en'
|
297
|
-
I18n.stubs(:available_locales).at_least_once.returns StubbedI18nBackend.available_locales
|
298
|
-
I18n.backend = StubbedI18nBackend
|
299
|
-
|
300
|
-
@routes.translate_with_i18n
|
301
251
|
|
302
252
|
assert_routing '/fr/people', :controller => 'people', :action => 'index', :locale => 'fr'
|
303
253
|
assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
|
304
254
|
assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
|
255
|
+
|
305
256
|
assert_helpers_include :people_fr, :people_en, :people_es, :people
|
306
257
|
end
|
307
258
|
|
308
259
|
def test_2_localized_blocks
|
309
|
-
|
260
|
+
draw_routes do
|
310
261
|
localized do
|
311
|
-
|
262
|
+
get 'people', :to => 'people#index', :as => 'people'
|
312
263
|
end
|
313
264
|
localized do
|
314
|
-
|
265
|
+
get 'products', :to => 'products#index', :as => 'products'
|
315
266
|
end
|
316
267
|
end
|
317
|
-
config_default_locale_settings 'en'
|
318
|
-
|
319
|
-
@routes.translate_from_file(File.expand_path('locales/routes.yml', File.dirname(__FILE__)))
|
320
268
|
|
321
269
|
assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
|
322
270
|
assert_routing '/es/productos', :controller => 'products', :action => 'index', :locale => 'es'
|
323
271
|
end
|
324
272
|
|
325
273
|
def test_not_localizing_routes_outside_blocks
|
326
|
-
|
274
|
+
config_default_locale_settings 'en'
|
275
|
+
draw_routes do
|
327
276
|
localized do
|
328
|
-
|
277
|
+
get 'people', :to => 'people#index', :as => 'people'
|
329
278
|
end
|
330
|
-
|
279
|
+
get 'products', :to => 'products#index', :as => 'products'
|
331
280
|
end
|
332
|
-
config_default_locale_settings 'en'
|
333
|
-
|
334
|
-
@routes.translate_from_file(File.expand_path('locales/routes.yml', File.dirname(__FILE__)))
|
335
281
|
|
336
282
|
assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
|
337
283
|
assert_routing '/products', :controller => 'products', :action => 'index'
|
@@ -339,75 +285,47 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
339
285
|
end
|
340
286
|
|
341
287
|
def test_force_locale
|
342
|
-
@routes.draw do
|
343
|
-
localized do
|
344
|
-
match 'people', :to => 'people#index', :as => 'people'
|
345
|
-
end
|
346
|
-
end
|
347
|
-
|
348
288
|
config_default_locale_settings 'en'
|
349
289
|
config_force_locale true
|
350
290
|
|
351
|
-
|
291
|
+
draw_routes do
|
292
|
+
localized do
|
293
|
+
get 'people', :to => 'people#index', :as => 'people'
|
294
|
+
end
|
295
|
+
end
|
352
296
|
|
353
297
|
assert_routing '/en/people', :controller => 'people', :action => 'index', :locale => 'en'
|
354
298
|
assert_unrecognized_route '/people', :controller => 'people', :action => 'index'
|
355
299
|
end
|
356
300
|
|
357
301
|
def test_generate_unlocalized_routes
|
358
|
-
@routes.draw do
|
359
|
-
localized do
|
360
|
-
match 'people', :to => 'people#index', :as => 'people'
|
361
|
-
end
|
362
|
-
end
|
363
|
-
|
364
302
|
config_default_locale_settings 'en'
|
365
303
|
config_generate_unlocalized_routes true
|
366
304
|
|
367
|
-
|
305
|
+
draw_routes do
|
306
|
+
localized do
|
307
|
+
get 'people', :to => 'people#index', :as => 'people'
|
308
|
+
end
|
309
|
+
end
|
368
310
|
|
369
311
|
assert_routing '/en/people', :controller => 'people', :action => 'index', :locale => 'en'
|
370
312
|
assert_routing '/people', :controller => 'people', :action => 'index'
|
371
313
|
end
|
372
314
|
|
373
315
|
def test_config_translation_file
|
374
|
-
|
316
|
+
config_default_locale_settings 'es'
|
317
|
+
|
318
|
+
draw_routes do
|
375
319
|
localized do
|
376
320
|
root :to => 'people#index'
|
377
321
|
end
|
378
322
|
end
|
379
323
|
|
380
|
-
config_default_locale_settings 'es'
|
381
|
-
config_translation_file File.expand_path('locales/routes.yml', File.dirname(__FILE__))
|
382
|
-
|
383
|
-
@routes.translate_from_file
|
384
|
-
|
385
324
|
assert_routing '/', :controller => 'people', :action => 'index', :locale => 'es'
|
386
325
|
assert_routing '/en', :controller => 'people', :action => 'index', :locale => 'en'
|
387
326
|
assert_unrecognized_route '/es', :controller => 'people', :action => 'index', :locale => 'es'
|
388
327
|
end
|
389
328
|
|
390
|
-
def test_auto_translate
|
391
|
-
|
392
|
-
routes_file <<-RUBY
|
393
|
-
Rails.application.routes.draw do
|
394
|
-
localized do
|
395
|
-
root :to => 'people#index'
|
396
|
-
end
|
397
|
-
end
|
398
|
-
RUBY
|
399
|
-
|
400
|
-
config_default_locale_settings 'es'
|
401
|
-
config_translation_file File.expand_path('locales/routes.yml', File.dirname(__FILE__))
|
402
|
-
|
403
|
-
app.reload_routes!
|
404
|
-
|
405
|
-
@routes = app.routes
|
406
|
-
|
407
|
-
assert_routing '/', :controller => 'people', :action => 'index', :locale => 'es'
|
408
|
-
assert_routing '/en', :controller => 'people', :action => 'index', :locale => 'en'
|
409
|
-
assert_unrecognized_route '/es', :controller => 'people', :action => 'index', :locale => 'es'
|
410
|
-
end
|
411
329
|
|
412
330
|
def test_action_controller_gets_locale_setter
|
413
331
|
ActionController::Base.instance_methods.include?('set_locale_from_url')
|
@@ -420,5 +338,4 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
420
338
|
def test_action_view_gets_locale_suffix_helper
|
421
339
|
ActionView::Base.instance_methods.include?('locale_suffix')
|
422
340
|
end
|
423
|
-
|
424
341
|
end
|