translate_routes_rails_2_3 0.0.2

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/ChangeLog ADDED
@@ -0,0 +1,22 @@
1
+ -- 0.98
2
+ Accepted patch from hoelmer: Updated rake task to use I18n yaml format.
3
+ -- 0.97
4
+ Accepted patch from Aitor Garay-Romero: root routes with prefix now doesn't set the locale parameter.
5
+
6
+ -- rails2.2 branch -> master
7
+
8
+ -- branch rails2.2 v0.9 (Oct 27th 2008)
9
+ * Developed after Rails2.2rc1 release, with i18n support. Beta, not backward compatible with Rails < 2.2
10
+
11
+ -- 0.96.1 (Aug 5th 2008)
12
+ * Fixed by Mathieu Fosse: helpers didn't worked as expected when locale_param_key is undefined
13
+
14
+ -- 0.96 (Jun 10th 2008)
15
+ * Added update_yaml task, suggested by Francesc Esplugas
16
+
17
+ -- 0.95 (Jan 21st 2008)
18
+ * Still beta version
19
+ * Added yaml files support for dictionaries
20
+
21
+ -- 0.9 (Dec 27th 2007)
22
+ * Beta version
data/README.markdown ADDED
@@ -0,0 +1,103 @@
1
+ TranslateRoutes
2
+ ===============
3
+
4
+ This branch works with Rails 2.3.x, you can find branches for Rails [2.1.x](http://github.com/raul/translate_routes/tree/rails2.1) and [2.2.x](http://github.com/raul/translate_routes/tree/rails2.2)
5
+
6
+ This Rails plugin provides a simple way to translate your URLs to any number of languages, even on a fully working application.
7
+
8
+ It works fine with all kind of routing definitions, including RESTful and named routes.
9
+ **Your current code will remain untouched**: your current routing code, helpers and links will be translated transparently - even in your tests.
10
+ (Un)installing it is a very clean and simple process, so why don't you give it a chance? ;)
11
+
12
+ This version works only with Rails 2.3.x. You can find all available versions in [the wiki](http://wiki.github.com/raul/translate_routes).
13
+
14
+ Sample application
15
+ ------------------
16
+ There is a [sample application](http://github.com/raul/translate_routes_demo/tree/master) which can be very useful to see how to integrate this plugin on your Rails application. The application itself includes all the required steps: 3 lines, an optional filter and a yaml translations file were used.
17
+
18
+
19
+ Quick start
20
+ -----------
21
+
22
+ Let's start with a tiny example. Of course you need to define your routes first, e.g:
23
+
24
+ ActionController::Routing::Routes.draw do |map|
25
+ map.contact 'contact', :controller => 'contact', :action => 'index'
26
+ end
27
+
28
+ 1) Download the plugin to your app's `/vendor/plugins` directory.
29
+
30
+ 2) Write your translations on a standard YAML file (e.g: i18n-routes.yml), including the locales and it translations pairs:
31
+
32
+ es:
33
+ contact: contacto
34
+
35
+
36
+ 3) Append a line to your routes.rb file to activate the translations. If you loaded the translations file with
37
+ your other I18n translations files, the line will be:
38
+
39
+ ActionController::Routing::Translator.i18n('es')
40
+
41
+ and if you want to keep the file separated (e.g: config/i18n-routes.yml), the line to append is:
42
+
43
+ ActionController::Routing::Translator.translate_from_file('config','i18n-routes.yml')
44
+
45
+ You can see it working by executing `rake routes` on the shell:
46
+
47
+
48
+ contact_es_es_path /es-ES/contacto {:locale=>"es", :controller=>"contact", :action=>"index"}
49
+ contact_en_us_path /contact {:locale=>"'en'", :controller=>"contact", :action=>"index"}
50
+
51
+
52
+ As we can see, a new spanish route has been setted up and a `locale` parameter has been added to the routes.
53
+
54
+ 4) Include this filter in your ApplicationController:
55
+
56
+ before_filter :set_locale_from_url
57
+
58
+ Now your application recognizes the different routes and sets the `I18n.locale` value on your controllers,
59
+ but what about the routes generation? As you can see on the previous `rake routes` execution, the
60
+ `contact_es_es_path` and `contact_en_us_path` routing helpers have been generated and are
61
+ available in your controllers and views. Additionally, a `contact_path` helper has been generated, which
62
+ generates the routes according to the current request's locale. This way your link
63
+
64
+ This means that if you use named routes **you don't need to modify your application links** because the routing helpers are automatically adapted to the current locale.
65
+
66
+ 5) Hey, but what about my tests?
67
+
68
+ Of course, your functional and integration testing involves some requests.
69
+ The plugin includes some code to add a default locale parameter so they can remain untouched.
70
+ Append it to your `test_helper` and it will be applied.
71
+
72
+ Documentation
73
+ -------------
74
+ You can find additional information in [the translate_routes' wiki](http://wiki.github.com/raul/translate_routes).
75
+
76
+ Questions, suggestions, bug reports...
77
+ --------------------------------------
78
+ Feedback, questions and comments will be always welcome at raul@murciano.net
79
+
80
+ Credits
81
+ -------
82
+ * Main development:
83
+ * Raul Murciano <http://raul.murciano.net> - code
84
+ * Domestika INTERNET S.L <http://domestika.org> - incredible support, really nice people to work with!
85
+
86
+ * Contributors:
87
+ * [Aitor Garay-Romero](http://github.com/aitorgr)
88
+ * [Christian Hølmer](http://github.com/hoelmer)
89
+ * Nico Ritsche
90
+ * [Cedric Darricau](http://github.com/devsigner)
91
+
92
+ Rails routing resources
93
+ -----------------------
94
+ * David Black's 'Rails Routing' ebook rocks! - 'Ruby for Rails' too, BTW.
95
+ * Obie Fernandez's 'The Rails Way' - the definitive RoR reference, great work Obie!
96
+ * As a part of the impressive Rails Guides set there is an [awesome document about rails routing](http://guides.rails.info/routing_outside_in.html) by Mike Gunderloy:
97
+
98
+
99
+ License
100
+ -------
101
+ Copyright (c) 2007 Released under the MIT license (see MIT-LICENSE)
102
+ Raul Murciano <http://raul.murciano.net>
103
+ Domestika INTERNET S.L. <http://domestika.org>
@@ -0,0 +1,219 @@
1
+ # Author: Raul Murciano [http://raul.murciano.net] for Domestika [http://domestika.org]
2
+ # Copyright (c) 2007, Released under the MIT license (see MIT-LICENSE)
3
+
4
+ module ActionController
5
+
6
+ module Routing
7
+
8
+ module Translator
9
+
10
+ mattr_accessor :prefix_on_default_locale
11
+ @@prefix_on_default_locale = false
12
+
13
+ mattr_accessor :locale_param_key
14
+ @@locale_param_key = :locale # set to :locale for params[:locale]
15
+
16
+ mattr_accessor :original_routes, :original_named_routes, :original_names, :dictionaries
17
+
18
+ def self.translate
19
+ init_dictionaries
20
+ yield @@dictionaries
21
+ @using_i18n = false
22
+ Translator.translate_current_routes
23
+ end
24
+
25
+ def self.translate_from_file(*path)
26
+ init_dictionaries
27
+ path = %w(locales routes.yml) if path.blank?
28
+ file_path = File.join(RAILS_ROOT, path)
29
+ yaml = YAML.load_file(file_path)
30
+ yaml.each_pair{ |k,v| @@dictionaries[k.to_s] = v || {} }
31
+ @using_i18n = false
32
+ Translator.translate_current_routes
33
+ end
34
+
35
+ def self.i18n(*locales)
36
+ init_dictionaries
37
+ locales = I18n.available_locales if locales.blank? && I18n.respond_to?(:available_locales)
38
+ locales.each{ |locale| @@dictionaries[locale] = {} }
39
+ @using_i18n = true
40
+ Translator.translate_current_routes
41
+ end
42
+
43
+ private
44
+
45
+ def self.default_locale
46
+ I18n.default_locale.to_s
47
+ end
48
+
49
+ def self.init_dictionaries
50
+ @@dictionaries = { default_locale => {} }
51
+ end
52
+
53
+ def self.available_locales
54
+ @@dictionaries.keys.map(&:to_s).uniq
55
+ end
56
+
57
+ def self.original_static_segments
58
+ static_segments = []
59
+ (@@original_routes || Routes.routes).each do |r|
60
+ r.segments.select do |s|
61
+ static_segments << s.value if s.instance_of?(ActionController::Routing::StaticSegment)
62
+ end
63
+ end
64
+ static_segments.uniq.sort
65
+ end
66
+
67
+ # code shared by translation and application helpers,
68
+ # it generates a suffix code for a given locale: en-US -> en_us
69
+ def self.locale_suffix_code
70
+ 'locale.to_s.underscore'
71
+ end
72
+
73
+ class_eval <<-FOO
74
+ def self.locale_suffix(locale)
75
+ #{self.locale_suffix_code}
76
+ end
77
+ FOO
78
+ def self.translate_current_routes
79
+
80
+ RAILS_DEFAULT_LOGGER.info "Translating routes (default locale: #{default_locale})" if defined? RAILS_DEFAULT_LOGGER
81
+
82
+ @@original_routes = Routes.routes.dup # Array [routeA, routeB, ...]
83
+ @@original_named_routes = Routes.named_routes.routes.dup # Hash {:name => :route}
84
+ @@original_names = @@original_named_routes.keys
85
+
86
+ Routes.clear!
87
+ new_routes = []
88
+ new_named_routes = {}
89
+
90
+ @@original_routes.each do |old_route|
91
+
92
+ old_name = @@original_named_routes.index(old_route)
93
+ # process and add the translated ones
94
+ trans_routes, trans_named_routes = translate_route(old_route, old_name)
95
+
96
+ if old_name
97
+ new_named_routes.merge! trans_named_routes
98
+ end
99
+
100
+ new_routes.concat(trans_routes)
101
+
102
+ end
103
+
104
+ Routes.routes = new_routes
105
+ new_named_routes.each { |name, r| Routes.named_routes.add name, r }
106
+
107
+ @@original_names.each{ |old_name| add_untranslated_helpers_to_controllers_and_views(old_name) }
108
+ end
109
+
110
+ # The untranslated helper (root_path instead root_en_path) redirects according to the current locale
111
+ def self.add_untranslated_helpers_to_controllers_and_views(old_name)
112
+
113
+ ['path', 'url'].each do |suffix|
114
+ new_helper_name = "#{old_name}_#{suffix}"
115
+ def_new_helper = <<-DEF_NEW_HELPER
116
+ def #{new_helper_name}(*args)
117
+ send("#{old_name}_\#{locale_suffix(I18n.locale)}_#{suffix}", *args)
118
+ end
119
+ DEF_NEW_HELPER
120
+
121
+ [ActionController::Base, ActionView::Base, ActionMailer::Base].each { |d| d.module_eval(def_new_helper) }
122
+ ActionController::Routing::Routes.named_routes.helpers << new_helper_name.to_sym
123
+ end
124
+ end
125
+
126
+ def self.add_prefix?(lang)
127
+ @@prefix_on_default_locale || lang != default_locale
128
+ end
129
+
130
+ def self.translate_static_segment(segment, locale)
131
+ if @using_i18n
132
+ tmp = I18n.locale
133
+ I18n.locale = locale
134
+ value = I18n.t segment.value, :default => segment.value.dup
135
+ I18n.locale = tmp
136
+ else
137
+ value = @@dictionaries[locale][segment.value] || segment.value.dup
138
+ end
139
+ StaticSegment.new(value, :raw => segment.raw, :optional => segment.optional?)
140
+ end
141
+
142
+ def self.locale_segments(orig, locale)
143
+ segments = []
144
+
145
+ if add_prefix?(locale) # initial prefix i.e: /en-US
146
+ divider = DividerSegment.new(orig.segments.first.value, :optional => false) # divider ('/')
147
+ static = StaticSegment.new(locale, :optional => false) # static ('en-US')
148
+ segments += [divider, static]
149
+ end
150
+
151
+ orig.segments.each do |s|
152
+ if s.instance_of?(StaticSegment)
153
+ new_segment = translate_static_segment(s, locale)
154
+ else
155
+ new_segment = s.dup # just reference the original
156
+ end
157
+ segments << new_segment
158
+ end
159
+ segments
160
+ end
161
+
162
+ def self.locale_requirements(orig, locale)
163
+ orig.requirements.merge(@@locale_param_key => locale)
164
+ end
165
+
166
+ def self.translate_route_by_locale(orig, locale, orig_name=nil)
167
+ segments = locale_segments(orig, locale)
168
+ requirements = locale_requirements(orig, locale)
169
+ conditions = orig.conditions
170
+
171
+ Route.new(segments, requirements, conditions).freeze
172
+ end
173
+
174
+ def self.root_route?(route)
175
+ route.segments.length == 1
176
+ end
177
+
178
+ def self.translate_route(route, route_name = nil)
179
+ new_routes = []
180
+ new_named_routes = {}
181
+
182
+ if root_route?(route) && prefix_on_default_locale
183
+ # add the root route "as is" in addition to the translated versions
184
+ new_routes << route
185
+ new_named_routes[route_name] = route
186
+ end
187
+
188
+ available_locales.each do |locale|
189
+ translated = translate_route_by_locale(route, locale, route_name)
190
+ new_routes << translated
191
+ locale_suffix = locale_suffix(locale)
192
+ new_named_routes["#{route_name}_#{locale_suffix}".to_sym] = translated if route_name
193
+ end
194
+ [new_routes, new_named_routes]
195
+ end
196
+
197
+ end
198
+
199
+ end
200
+ end
201
+
202
+ # Add set_locale_from_url to controllers
203
+ ActionController::Base.class_eval do
204
+ private
205
+ def set_locale_from_url
206
+ I18n.locale = params[ActionController::Routing::Translator.locale_param_key]
207
+ default_url_options({ActionController::Routing::Translator => I18n.locale })
208
+ end
209
+ end
210
+
211
+ # Add locale_suffix to controllers, views and mailers
212
+ [ActionController::Base, ActionView::Base, ActionMailer::Base].map do |klass|
213
+ klass.class_eval do
214
+ private
215
+ def locale_suffix(locale)
216
+ eval ActionController::Routing::Translator.locale_suffix_code
217
+ end
218
+ end
219
+ end
@@ -0,0 +1,23 @@
1
+ # monkeypatch I18n to get the available locales
2
+ # (not strictly needed to use translate_routes, but recommended anyway)
3
+ module I18n
4
+ class << self
5
+ def available_locales
6
+ backend.available_locales
7
+ end
8
+ end
9
+
10
+ module Backend
11
+ class Simple
12
+ def available_locales
13
+ init_translations unless initialized?
14
+ translations.keys
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ # load translation files from RAILS_ROOT/locales
21
+ [:rb, :yml].each do |format|
22
+ I18n.load_path = Dir[File.join(RAILS_ROOT, 'locales', '*.{rb,yml}') ]
23
+ end
@@ -0,0 +1,33 @@
1
+ # Author: Raul Murciano [http://raul.murciano.net] for Domestika [http://domestika.org]
2
+ # Copyright (c) 2007, Released under the MIT license (see MIT-LICENSE)
3
+
4
+ require 'test_help'
5
+
6
+ # Include default lang on your test requests (test requests doesn't support default_url_options):
7
+ ActionController::TestProcess.class_eval do
8
+ unless method_defined?(:process_without_default_language)
9
+ def process_with_default_language(action, parameters = nil, session = nil, flash = nil, http_method = 'GET')
10
+ lang_pair = {:locale, I18n.default_locale.to_s}
11
+ parameters = lang_pair.merge(parameters) rescue lang_pair
12
+ process_without_default_language(action, parameters, session, flash, http_method)
13
+ end
14
+
15
+ alias :process_without_default_language :process
16
+ alias :process :process_with_default_language
17
+ end
18
+ end
19
+
20
+ # Add untranslated helper for named routes to integration tests
21
+ ActionController::Integration::Session.class_eval do
22
+ ['path', 'url'].each do |suffix|
23
+ ActionController::Routing::Translator.original_names.each do |old_name|
24
+ new_helper_name = "#{old_name}_#{suffix}"
25
+ def_new_helper = <<-DEF_NEW_HELPER
26
+ def #{new_helper_name}(*args)
27
+ send("#{old_name}_#{ActionController::Routing::Translator.locale_suffix(I18n.default_locale)}_#{suffix}", *args)
28
+ end
29
+ DEF_NEW_HELPER
30
+ eval def_new_helper
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,323 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+
4
+ %w(actionpack activesupport actionmailer).each{ |gem_lib| gem gem_lib, '2.3.10' }
5
+ %w(activesupport actionpack actionmailer action_controller).each{ |lib| require lib }
6
+
7
+ plugin_root = File.join(File.dirname(__FILE__), '..')
8
+ require "#{plugin_root}/lib/translate_routes"
9
+ RAILS_ROOT = plugin_root
10
+
11
+ class PeopleController < ActionController::Base; end
12
+
13
+ class TranslateRoutesTest < ActionController::TestCase
14
+
15
+ include ActionController::Assertions::RoutingAssertions
16
+
17
+ def setup
18
+ @controller = ActionController::Base.new
19
+ @view = ActionView::Base.new
20
+ ActionController::Routing::Routes.clear!
21
+ end
22
+
23
+
24
+ # Unnamed routes with prefix on default locale:
25
+
26
+ def test_unnamed_empty_route_with_prefix
27
+ ActionController::Routing::Routes.draw { |map| map.connect '', :controller => 'people', :action => 'index' }
28
+ config_default_locale_settings('en', true)
29
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
30
+
31
+ assert_routing '/es', :controller => 'people', :action => 'index', :locale => 'es'
32
+ assert_routing '/en', :controller => 'people', :action => 'index', :locale => 'en'
33
+ end
34
+
35
+ def test_unnamed_root_route_with_prefix
36
+ ActionController::Routing::Routes.draw { |map| map.connect '/', :controller => 'people', :action => 'index'}
37
+ config_default_locale_settings('es', true)
38
+ ActionController::Routing::Translator.translate_from_file 'test', 'locales', 'routes.yml'
39
+
40
+ assert_routing '/', :controller => 'people', :action => 'index'
41
+ assert_routing '/es', :controller => 'people', :action => 'index', :locale => 'es'
42
+ assert_routing '/en', :controller => 'people', :action => 'index', :locale => 'en'
43
+ end
44
+
45
+ def test_unnamed_untranslated_route_with_prefix
46
+ ActionController::Routing::Routes.draw { |map| map.connect 'foo', :controller => 'people', :action => 'index' }
47
+ config_default_locale_settings('en', true)
48
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
49
+
50
+ assert_routing '/es/foo', :controller => 'people', :action => 'index', :locale => 'es'
51
+ assert_routing '/en/foo', :controller => 'people', :action => 'index', :locale => 'en'
52
+ end
53
+
54
+ def test_unnamed_translated_route_on_default_locale_with_prefix
55
+ ActionController::Routing::Routes.draw { |map| map.people 'people', :controller => 'people', :action => 'index'}
56
+ config_default_locale_settings('es', true)
57
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
58
+
59
+ assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
60
+ end
61
+
62
+ def test_unnamed_translated_route_on_non_default_locale_with_prefix
63
+ ActionController::Routing::Routes.draw { |map| map.connect 'people', :controller => 'people', :action => 'index' }
64
+ config_default_locale_settings('en', true)
65
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
66
+
67
+ assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
68
+ assert_routing '/en/people', :controller => 'people', :action => 'index', :locale => 'en'
69
+ end
70
+
71
+
72
+ # Unnamed routes without prefix on default locale:
73
+
74
+ def test_unnamed_empty_route_without_prefix
75
+ ActionController::Routing::Routes.draw { |map| map.connect '', :controller => 'people', :action => 'index' }
76
+ config_default_locale_settings('en', false)
77
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
78
+
79
+ assert_routing '/es', :controller => 'people', :action => 'index', :locale => 'es'
80
+ assert_routing '/', :controller => 'people', :action => 'index', :locale => 'en'
81
+ end
82
+
83
+ def test_unnamed_root_route_without_prefix
84
+ ActionController::Routing::Routes.draw { |map| map.connect '/', :controller => 'people', :action => 'index'}
85
+ config_default_locale_settings('es', false)
86
+ ActionController::Routing::Translator.translate_from_file 'test', 'locales', 'routes.yml'
87
+
88
+ assert_routing '/', :controller => 'people', :action => 'index', :locale => 'es'
89
+ assert_routing '/en', :controller => 'people', :action => 'index', :locale => 'en'
90
+ assert_unrecognized_route '/es', :controller => 'people', :action => 'index', :locale => 'es'
91
+ end
92
+
93
+ def test_unnamed_untranslated_route_without_prefix
94
+ ActionController::Routing::Routes.draw { |map| map.connect 'foo', :controller => 'people', :action => 'index'}
95
+ config_default_locale_settings('en', false)
96
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
97
+
98
+ assert_routing '/es/foo', :controller => 'people', :action => 'index', :locale => 'es'
99
+ assert_routing '/foo', :controller => 'people', :action => 'index', :locale => 'en'
100
+ end
101
+
102
+ def test_unnamed_translated_route_on_default_locale_without_prefix
103
+ ActionController::Routing::Routes.draw { |map| map.people 'people', :controller => 'people', :action => 'index'}
104
+ config_default_locale_settings('es', false)
105
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
106
+
107
+ assert_routing '/en/people', :controller => 'people', :action => 'index', :locale => 'en'
108
+ assert_routing 'gente', :controller => 'people', :action => 'index', :locale => 'es'
109
+ end
110
+
111
+ def test_unnamed_translated_route_on_non_default_locale_without_prefix
112
+ ActionController::Routing::Routes.draw { |map| map.people 'people', :controller => 'people', :action => 'index'}
113
+ config_default_locale_settings('en', false)
114
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
115
+
116
+ assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
117
+ assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
118
+ end
119
+
120
+
121
+ # Named routes with prefix on default locale:
122
+
123
+ def test_named_empty_route_with_prefix
124
+ ActionController::Routing::Routes.draw { |map| map.people '', :controller => 'people', :action => 'index' }
125
+ config_default_locale_settings('en', true)
126
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
127
+
128
+ assert_routing '/es', :controller => 'people', :action => 'index', :locale => 'es'
129
+ assert_routing '/en', :controller => 'people', :action => 'index', :locale => 'en'
130
+ assert_helpers_include :people_en, :people_es, :people
131
+ end
132
+
133
+ def test_named_root_route_with_prefix
134
+ ActionController::Routing::Routes.draw { |map| map.root :controller => 'people', :action => 'index'}
135
+ config_default_locale_settings('es', true)
136
+ ActionController::Routing::Translator.translate_from_file 'test', 'locales', 'routes.yml'
137
+
138
+ assert_routing '/', :controller => 'people', :action => 'index'
139
+ assert_routing '/es', :controller => 'people', :action => 'index', :locale => 'es'
140
+ assert_routing '/en', :controller => 'people', :action => 'index', :locale => 'en'
141
+ end
142
+
143
+ def test_named_untranslated_route_with_prefix
144
+ ActionController::Routing::Routes.draw { |map| map.people 'foo', :controller => 'people', :action => 'index'}
145
+ config_default_locale_settings('en', true)
146
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
147
+
148
+ assert_routing '/es/foo', :controller => 'people', :action => 'index', :locale => 'es'
149
+ assert_routing '/en/foo', :controller => 'people', :action => 'index', :locale => 'en'
150
+ assert_helpers_include :people_en, :people_es, :people
151
+ end
152
+
153
+ def test_named_translated_route_on_default_locale_with_prefix
154
+ ActionController::Routing::Routes.draw { |map| map.people 'people', :controller => 'people', :action => 'index'}
155
+ config_default_locale_settings('es', true)
156
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
157
+
158
+ assert_routing '/en/people', :controller => 'people', :action => 'index', :locale => 'en'
159
+ assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
160
+ assert_helpers_include :people_en, :people_es, :people
161
+ end
162
+
163
+ def test_named_translated_route_on_non_default_locale_with_prefix
164
+ ActionController::Routing::Routes.draw { |map| map.people 'people', :controller => 'people', :action => 'index' }
165
+ config_default_locale_settings('en', true)
166
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
167
+
168
+ assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
169
+ assert_routing '/en/people', :controller => 'people', :action => 'index', :locale => 'en'
170
+ assert_helpers_include :people_en, :people_es, :people
171
+ end
172
+
173
+ # Named routes without prefix on default locale:
174
+
175
+ def test_named_empty_route_without_prefix
176
+ ActionController::Routing::Routes.draw { |map| map.people '', :controller => 'people', :action => 'index'}
177
+ config_default_locale_settings('es', false)
178
+ ActionController::Routing::Translator.translate { |t| t['es'] = {}; t['en'] = {'people' => 'gente'}; }
179
+
180
+ assert_routing '/en', :controller => 'people', :action => 'index', :locale => 'en'
181
+ assert_routing '/', :controller => 'people', :action => 'index', :locale => 'es'
182
+ assert_routing '', :controller => 'people', :action => 'index', :locale => 'es'
183
+ end
184
+
185
+ def test_named_root_route_without_prefix
186
+ ActionController::Routing::Routes.draw { |map| map.root :controller => 'people', :action => 'index'}
187
+ config_default_locale_settings('es', false)
188
+ ActionController::Routing::Translator.translate_from_file 'test', 'locales', 'routes.yml'
189
+
190
+ assert_routing '/', :controller => 'people', :action => 'index', :locale => 'es'
191
+ assert_routing '/en', :controller => 'people', :action => 'index', :locale => 'en'
192
+ assert_unrecognized_route '/es', :controller => 'people', :action => 'index', :locale => 'es'
193
+ end
194
+
195
+ def test_named_untranslated_route_without_prefix
196
+ ActionController::Routing::Routes.draw { |map| map.people 'foo', :controller => 'people', :action => 'index'}
197
+ config_default_locale_settings('es', false)
198
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
199
+
200
+ assert_routing '/en/foo', :controller => 'people', :action => 'index', :locale => 'en'
201
+ assert_routing 'foo', :controller => 'people', :action => 'index', :locale => 'es'
202
+ assert_helpers_include :people_en, :people_es, :people
203
+ end
204
+
205
+ def test_named_translated_route_on_default_locale_without_prefix
206
+ ActionController::Routing::Routes.draw { |map| map.people 'people', :controller => 'people', :action => 'index'}
207
+ config_default_locale_settings('es', false)
208
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
209
+
210
+ assert_routing '/en/people', :controller => 'people', :action => 'index', :locale => 'en'
211
+ assert_routing 'gente', :controller => 'people', :action => 'index', :locale => 'es'
212
+ assert_helpers_include :people_en, :people_es, :people
213
+ end
214
+
215
+ def test_named_translated_route_on_non_default_locale_without_prefix
216
+ ActionController::Routing::Routes.draw { |map| map.people 'people', :controller => 'people', :action => 'index'}
217
+ config_default_locale_settings('en', false)
218
+ ActionController::Routing::Translator.translate { |t| t['en'] = {}; t['es'] = {'people' => 'gente'} }
219
+
220
+ assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
221
+ assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
222
+ assert_helpers_include :people_en, :people_es, :people
223
+ end
224
+
225
+ def test_languages_load_from_file
226
+ ActionController::Routing::Routes.draw { |map| map.people 'people', :controller => 'people', :action => 'index'}
227
+ config_default_locale_settings('en', false)
228
+ ActionController::Routing::Translator.translate_from_file 'test', 'locales', 'routes.yml'
229
+
230
+ assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
231
+ assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
232
+ assert_helpers_include :people_en, :people_es, :people
233
+ end
234
+
235
+ def test_languages_load_from_file_without_dictionary_for_default_locale
236
+ ActionController::Routing::Routes.draw { |map| map.people 'people', :controller => 'people', :action => 'index'}
237
+ config_default_locale_settings('fr', false)
238
+ ActionController::Routing::Translator.translate_from_file 'test', 'locales', 'routes.yml'
239
+
240
+ assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'fr'
241
+ assert_routing '/en/people', :controller => 'people', :action => 'index', :locale => 'en'
242
+ assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
243
+ assert_helpers_include :people_fr, :people_en, :people_es, :people
244
+ end
245
+
246
+ def test_i18n_based_translations_setting_locales
247
+ ActionController::Routing::Routes.draw { |map| map.people 'people', :controller => 'people', :action => 'index'}
248
+ config_default_locale_settings('en', false)
249
+ I18n.backend = StubbedI18nBackend
250
+ ActionController::Routing::Translator.i18n('es')
251
+
252
+ assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
253
+ assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
254
+ assert_helpers_include :people_en, :people_es, :people
255
+ end
256
+
257
+ def test_i18n_based_translations_taking_i18n_available_locales
258
+ ActionController::Routing::Routes.draw { |map| map.people 'people', :controller => 'people', :action => 'index'}
259
+ config_default_locale_settings('en', false)
260
+ I18n.stubs(:available_locales).at_least_once.returns StubbedI18nBackend.available_locales
261
+ I18n.backend = StubbedI18nBackend
262
+ ActionController::Routing::Translator.i18n
263
+
264
+ assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
265
+ assert_routing '/fr/people', :controller => 'people', :action => 'index', :locale => 'fr'
266
+ assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
267
+ assert_helpers_include :people_fr, :people_en, :people_es, :people
268
+ end
269
+
270
+ def test_action_controller_gets_locale_setter
271
+ ActionController::Base.instance_methods.include?('set_locale_from_url')
272
+ end
273
+
274
+ def test_action_controller_gets_locale_suffix_helper
275
+ ActionController::Base.instance_methods.include?('locale_suffix')
276
+ end
277
+
278
+ def test_action_view_gets_locale_suffix_helper
279
+ ActionView::Base.instance_methods.include?('locale_suffix')
280
+ end
281
+
282
+ private
283
+
284
+ def assert_helpers_include(*helpers)
285
+ helpers.each do |helper|
286
+ ['_url', '_path'].each do |suffix|
287
+ [@controller, @view].each { |obj| assert_respond_to obj, "#{helper}#{suffix}".to_sym }
288
+ end
289
+ end
290
+ end
291
+
292
+ def assert_unrecognized_route(route_path, options)
293
+ assert_raise ActionController::RoutingError do
294
+ assert_routing route_path, options
295
+ end
296
+ end
297
+
298
+ def config_default_locale_settings(locale, with_prefix)
299
+ I18n.default_locale = locale
300
+ ActionController::Routing::Translator.prefix_on_default_locale = with_prefix
301
+ end
302
+
303
+ class StubbedI18nBackend
304
+
305
+
306
+ @@translations = {
307
+ 'es' => { 'people' => 'gente'},
308
+ 'fr' => {} # empty on purpose to test behaviour on incompleteness scenarios
309
+ }
310
+
311
+ def self.translate(locale, key, options)
312
+ @@translations[locale.to_s][key] || options[:default]
313
+ rescue
314
+ options[:default]
315
+ end
316
+
317
+ def self.available_locales
318
+ @@translations.keys
319
+ end
320
+
321
+ end
322
+
323
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: translate_routes_rails_2_3
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 2
10
+ version: 0.0.2
11
+ platform: ruby
12
+ authors:
13
+ - Raul Murciano
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-02-14 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: Translates the Rails routes of your application into the languages defined in your locale files
23
+ email: raul@murciano.net
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files:
29
+ - ChangeLog
30
+ - README.markdown
31
+ files:
32
+ - lib/translate_routes.rb
33
+ - lib/translate_routes_i18n_available_locales.rb
34
+ - lib/translate_routes_test_helper.rb
35
+ - ChangeLog
36
+ - README.markdown
37
+ - test/translate_routes_test.rb
38
+ has_rdoc: true
39
+ homepage: http://github.com/raul/translate_routes
40
+ licenses: []
41
+
42
+ post_install_message:
43
+ rdoc_options:
44
+ - --charset=UTF-8
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ hash: 3
53
+ segments:
54
+ - 0
55
+ version: "0"
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 3
62
+ segments:
63
+ - 0
64
+ version: "0"
65
+ requirements: []
66
+
67
+ rubyforge_project:
68
+ rubygems_version: 1.4.2
69
+ signing_key:
70
+ specification_version: 3
71
+ summary: Translate your Rails routes in a simple manner (Rails2.3 branch)
72
+ test_files:
73
+ - test/translate_routes_test.rb