route_translator 5.0.6 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2e5491f7135951007ef950f929f41ce035e327e5
4
- data.tar.gz: c92a06d7f82220a625e9efca1efce38630429759
3
+ metadata.gz: db2eb895765c0bc6d9331fb86fa65f36ad1e2f11
4
+ data.tar.gz: 34389bc82a4bed4c1b7fac7e4588710ca4316cac
5
5
  SHA512:
6
- metadata.gz: 0a67bc52ece0fa4a69c7d4b5ccb0407b92104f53182fb0e87a5a143f9fb2c9753772ae763ae1e9f49e756214c91da93f769845022cba850fe2be50dae5f749e2
7
- data.tar.gz: c06d96a8c9a72f6dab4b6258ee0062f774ca31a4bc24cedab06ba8346ff5afc61e697ac62915b7ab33e6015478753b0d1532ddeeee5cb4c020fb0394cbc70965
6
+ metadata.gz: da58eb381c0ec9f894e5b54457ea3b172902fe778c4d52ceacc708a7a410192552bffc2bc4a3a28ab55963635e82f9cc5df212ede87d2c254411763c40bc7460
7
+ data.tar.gz: f29622f458c5781277d3835c396f325b13973aec2f5c49496fb23a4bef29b64ce10041301a997f55bfc345c8ccf01887f59720c6bb8ef624de7c225a6bbc0e7e
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.1.0 (2017-01-24)
4
+
5
+ * Add: Translate controllers with namespaces (#120)
6
+ * Update development dependencies
7
+
3
8
  ## 5.0.6 (2017-01-17)
4
9
 
5
10
  * Test against Ruby 2.4.0
data/README.md CHANGED
@@ -327,6 +327,38 @@ If `host_locales` option is set, the following options will be forced (even if y
327
327
  This is to avoid odd behaviour brought about by route conflicts and because `host_locales` forces and hides the host-locale dynamically.
328
328
 
329
329
 
330
+ ### Translations for similar routes with different namespaces
331
+
332
+ If you have routes that (partially) share names in one locale, but must be translated differently in another locale, for example:
333
+
334
+ ```ruby
335
+ get 'people/favourites', to: 'people/products#favourites'
336
+ get 'favourites', to: 'products#favourites'
337
+ ```
338
+
339
+ Then it is possible to provide different translations for common parts of those routes by
340
+ scoping translations by a controller's namespace:
341
+
342
+ ```yml
343
+ es:
344
+ routes:
345
+ favourites: favoritos
346
+ controllers:
347
+ people:
348
+ products:
349
+ favourites: fans
350
+ ```
351
+
352
+ Routes will be translated as in:
353
+
354
+ ```
355
+ people_products_favourites_es GET /people/products/fans(.:format) people/products#favourites {:locale=>"es"}
356
+ products_favourites_es GET /products/favoritos(.:format) products#favourites {:locale=>"es"}
357
+ ```
358
+
359
+ The gem will lookup translations under `controllers` scope first and then lookup translations under `routes` scope.
360
+
361
+
330
362
 
331
363
  ## Testing
332
364
  Testing your controllers with routes-translator is easy, just add a locale parameter for your localized routes. Otherwise, an ActionController::UrlGenerationError will raise.
@@ -4,7 +4,9 @@ module ActionDispatch
4
4
  module Routing
5
5
  class RouteSet
6
6
  def add_localized_route(mapping, path_ast, name, anchor, scope, path, controller, default_action, to, via, formatted, options_constraints, options)
7
- RouteTranslator::Translator.translations_for(self, path, name, options_constraints, options) do |translated_name, translated_path, translated_options_constraints, translated_options|
7
+ route = RouteTranslator::Route.new(self, path, name, options_constraints, options, mapping)
8
+
9
+ RouteTranslator::Translator.translations_for(route) do |translated_name, translated_path, translated_options_constraints, translated_options|
8
10
  translated_path_ast = ::ActionDispatch::Journey::Parser.parse(translated_path)
9
11
  translated_mapping = ::ActionDispatch::Routing::Mapper::Mapping.build(scope, self, translated_path_ast, controller, default_action, to, via, formatted, translated_options_constraints, anchor, translated_options)
10
12
 
@@ -0,0 +1,23 @@
1
+ module RouteTranslator
2
+ class Route
3
+ attr_reader :route_set, :path, :name, :options_constraints, :options, :mapping
4
+
5
+ def initialize(route_set, path, name, options_constraints, options, mapping)
6
+ @route_set = route_set
7
+ @path = path
8
+ @name = name
9
+ @options_constraints = options_constraints
10
+ @options = options
11
+ @mapping = mapping
12
+ end
13
+
14
+ def scope
15
+ @scope ||=
16
+ if mapping.defaults[:controller]
17
+ [:routes, :controllers].concat mapping.defaults[:controller].split('/').map(&:to_sym)
18
+ else
19
+ [:routes, :controllers]
20
+ end
21
+ end
22
+ end
23
+ end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require File.expand_path('../translator/route_helpers', __FILE__)
4
4
  require File.expand_path('../translator/path', __FILE__)
5
+ require File.expand_path('../route', __FILE__)
5
6
 
6
7
  module RouteTranslator
7
8
  module Translator
@@ -39,8 +40,8 @@ module RouteTranslator
39
40
  translated_options_constraints
40
41
  end
41
42
 
42
- def translate_path(path, locale)
43
- RouteTranslator::Translator::Path.translate(path, locale)
43
+ def translate_path(path, locale, scope)
44
+ RouteTranslator::Translator::Path.translate(path, locale, scope)
44
45
  rescue I18n::MissingTranslationData => e
45
46
  raise e unless RouteTranslator.config.disable_fallback
46
47
  end
@@ -58,16 +59,16 @@ module RouteTranslator
58
59
  locales.push I18n.default_locale
59
60
  end
60
61
 
61
- def translations_for(route_set, path, name, options_constraints, options)
62
- RouteTranslator::Translator::RouteHelpers.add name, route_set.named_routes
62
+ def translations_for(route)
63
+ RouteTranslator::Translator::RouteHelpers.add route.name, route.route_set.named_routes
63
64
 
64
65
  available_locales.each do |locale|
65
- translated_path = translate_path(path, locale)
66
+ translated_path = translate_path(route.path, locale, route.scope)
66
67
  next unless translated_path
67
68
 
68
- translated_name = translate_name(name, locale, route_set.named_routes.names)
69
- translated_options_constraints = translate_options_constraints(options_constraints, locale)
70
- translated_options = translate_options(options, locale)
69
+ translated_name = translate_name(route.name, locale, route.route_set.named_routes.names)
70
+ translated_options_constraints = translate_options_constraints(route.options_constraints, locale)
71
+ translated_options = translate_options(route.options, locale)
71
72
 
72
73
  yield translated_name, translated_path, translated_options_constraints, translated_options
73
74
  end
@@ -38,11 +38,11 @@ module RouteTranslator
38
38
  module_function
39
39
 
40
40
  # Translates a path and adds the locale prefix.
41
- def translate(path, locale)
41
+ def translate(path, locale, scope)
42
42
  new_path = path.dup
43
43
  final_optional_segments = new_path.slice!(%r{(\([^\/]+\))$})
44
44
  translated_segments = new_path.split('/').map do |seg|
45
- seg.split('.').map { |phrase| Segment.translate(phrase, locale) }.join('.')
45
+ seg.split('.').map { |phrase| Segment.translate(phrase, locale, scope) }.join('.')
46
46
  end
47
47
  translated_segments.reject!(&:empty?)
48
48
 
@@ -5,16 +5,29 @@ module RouteTranslator
5
5
  class << self
6
6
  private
7
7
 
8
- def translate_string(str, locale)
9
- locale = locale.to_s.gsub('native_', '')
10
- opts = { scope: :routes, locale: locale }
8
+ def fallback_options(str, locale)
11
9
  if RouteTranslator.config.disable_fallback && locale.to_s != I18n.default_locale.to_s
12
- opts[:fallback] = true
10
+ { scope: :routes, fallback: true }
11
+ else
12
+ { scope: :routes, default: str }
13
+ end
14
+ end
15
+
16
+ def translate_resource(str, locale, opts)
17
+ handler = proc { |exception| exception }
18
+
19
+ if I18n.translate(str, opts.merge(exception_handler: handler)).is_a?(I18n::MissingTranslation)
20
+ I18n.translate(str, opts.merge(fallback_options(str, locale)))
13
21
  else
14
- opts[:default] = str
22
+ I18n.translate(str, opts)
15
23
  end
16
- res = I18n.translate(str, opts)
17
- URI.escape(res)
24
+ end
25
+
26
+ def translate_string(str, locale, scope)
27
+ locale = locale.to_s.gsub('native_', '')
28
+ translated_resource = translate_resource(str, locale, scope: scope, locale: locale)
29
+
30
+ URI.escape translated_resource
18
31
  end
19
32
  end
20
33
 
@@ -26,16 +39,16 @@ module RouteTranslator
26
39
  # "people(.:format)", only "people" will be translated.
27
40
  # If there is no translation, the path segment is blank, begins with a
28
41
  # ":" (param key) or "*" (wildcard), the segment is returned untouched.
29
- def translate(segment, locale)
42
+ def translate(segment, locale, scope)
30
43
  return segment if segment.empty?
31
44
  named_param, hyphenized = segment.split('-'.freeze, 2) if segment.starts_with?(':'.freeze)
32
- return "#{named_param}-#{translate(hyphenized.dup, locale)}" if hyphenized
45
+ return "#{named_param}-#{translate(hyphenized.dup, locale, scope)}" if hyphenized
33
46
  return segment if segment.starts_with?('('.freeze) || segment.starts_with?('*'.freeze) || segment.include?(':'.freeze)
34
47
 
35
48
  appended_part = segment.slice!(/(\()$/)
36
49
  match = TRANSLATABLE_SEGMENT.match(segment)[1] if TRANSLATABLE_SEGMENT.match(segment)
37
50
 
38
- (translate_string(match, locale) || segment) + appended_part.to_s
51
+ (translate_string(match, locale, scope) || segment) + appended_part.to_s
39
52
  end
40
53
  end
41
54
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module RouteTranslator
3
- VERSION = '5.0.6'.freeze
3
+ VERSION = '5.1.0'.freeze
4
4
  end
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: 5.0.6
4
+ version: 5.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Geremia Taglialatela
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-01-17 00:00:00.000000000 Z
13
+ date: 2017-01-24 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -74,34 +74,28 @@ dependencies:
74
74
  requirements:
75
75
  - - "~>"
76
76
  - !ruby/object:Gem::Version
77
- version: 0.8.18
77
+ version: 0.8.19
78
78
  type: :development
79
79
  prerelease: false
80
80
  version_requirements: !ruby/object:Gem::Requirement
81
81
  requirements:
82
82
  - - "~>"
83
83
  - !ruby/object:Gem::Version
84
- version: 0.8.18
84
+ version: 0.8.19
85
85
  - !ruby/object:Gem::Dependency
86
86
  name: minitest
87
87
  requirement: !ruby/object:Gem::Requirement
88
88
  requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- version: 4.7.5
92
- - - "<"
89
+ - - "~>"
93
90
  - !ruby/object:Gem::Version
94
- version: 6.0.0
91
+ version: '5.10'
95
92
  type: :development
96
93
  prerelease: false
97
94
  version_requirements: !ruby/object:Gem::Requirement
98
95
  requirements:
99
- - - ">="
100
- - !ruby/object:Gem::Version
101
- version: 4.7.5
102
- - - "<"
96
+ - - "~>"
103
97
  - !ruby/object:Gem::Version
104
- version: 6.0.0
98
+ version: '5.10'
105
99
  - !ruby/object:Gem::Dependency
106
100
  name: rails
107
101
  requirement: !ruby/object:Gem::Requirement
@@ -136,14 +130,14 @@ dependencies:
136
130
  requirements:
137
131
  - - "~>"
138
132
  - !ruby/object:Gem::Version
139
- version: 0.47.0
133
+ version: 0.47.1
140
134
  type: :development
141
135
  prerelease: false
142
136
  version_requirements: !ruby/object:Gem::Requirement
143
137
  requirements:
144
138
  - - "~>"
145
139
  - !ruby/object:Gem::Version
146
- version: 0.47.0
140
+ version: 0.47.1
147
141
  - !ruby/object:Gem::Dependency
148
142
  name: simplecov
149
143
  requirement: !ruby/object:Gem::Requirement
@@ -176,6 +170,7 @@ files:
176
170
  - lib/route_translator/extensions/mapper.rb
177
171
  - lib/route_translator/extensions/route_set.rb
178
172
  - lib/route_translator/host.rb
173
+ - lib/route_translator/route.rb
179
174
  - lib/route_translator/translator.rb
180
175
  - lib/route_translator/translator/path.rb
181
176
  - lib/route_translator/translator/path/segment.rb
@@ -201,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
201
196
  version: '0'
202
197
  requirements: []
203
198
  rubyforge_project:
204
- rubygems_version: 2.6.8
199
+ rubygems_version: 2.6.9
205
200
  signing_key:
206
201
  specification_version: 4
207
202
  summary: Translate your Rails routes in a simple manner