multi_formal_i18n_tenancy 0.0.4 → 0.0.5

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.
@@ -6,7 +6,7 @@ class MultiFormalI18nTenancy::Backend < I18n::Backend::Simple
6
6
  TENANT_LOCALE_PATTERN = /tenants$/
7
7
 
8
8
  attr_accessor :filenames
9
-
9
+
10
10
  # Accepts a list of paths to translation files. Loads translations from
11
11
  # plain Ruby (*.rb) or YAML files (*.yml). See #load_rb and #load_yml
12
12
  # for details.
@@ -15,66 +15,7 @@ class MultiFormalI18nTenancy::Backend < I18n::Backend::Simple
15
15
 
16
16
  @filenames = filenames.flatten
17
17
 
18
- [
19
- # locale file groups order (ancestor chain)
20
- #
21
- # a) de > de_formal > your_enterprise_name_de > your_enterprise_name_de_formal
22
- # b) de > your_enterprise_name_de
23
-
24
- # de
25
- ->(f) { !f.match(FORMAL_FILENAME_PATTERN) && !f.match(TENANT_FILENAME_PATTERN) },
26
- # de > your_enterprise_name_de
27
- ->(f) { !f.match(FORMAL_FILENAME_PATTERN) && f.match(TENANT_FILENAME_PATTERN) },
28
- # de > de_formal
29
- ->(f) { f.match(FORMAL_FILENAME_PATTERN) && !f.match(TENANT_FILENAME_PATTERN) },
30
- # de > de_formal > your_enterprise_name_de > your_enterprise_name_de_formal
31
- ->(f) { f.match(FORMAL_FILENAME_PATTERN) && f.match(TENANT_FILENAME_PATTERN) }
32
- ].each do |filename_filter|
33
- filenames.flatten.select{|f| filename_filter.call(f) }.each { |filename| load_file(filename) }
34
- end
35
-
36
- @filenames = [] # free memory
37
- end
38
-
39
- # Stores translations for the given locale in memory.
40
- # This uses a deep merge for the translations hash, so existing
41
- # translations will be overwritten by new ones only at the deepest
42
- # level of the hash.
43
- def store_translations(locale, data, options = {})
44
- locale = locale.to_sym
45
-
46
- # the has_key check assures that the inheritance will be performed for the first locale file
47
- if (locale.to_s.match(FORMAL_LOCALE_PATTERN) || tenant_from_locale?(locale)) && !translations.has_key?(locale)
48
- # inherit keys from base locale file
49
- base_locale = locale.to_s
50
- tenant = tenant_from_locale?(locale)
51
-
52
- if tenant && locale.to_s.match(FORMAL_LOCALE_PATTERN)
53
- # de > de_formal
54
- base_locale = locale.to_s.gsub(/^#{tenant}_/, '')
55
- translations[locale] = (translations[base_locale.to_sym] || {}).clone
56
-
57
- # de_formal > your_enterprise_name_de
58
- base_locale = locale.to_s.gsub(FORMAL_LOCALE_PATTERN, '')
59
- base_translations = (translations[base_locale.to_sym] || {}).clone.deep_symbolize_keys
60
-
61
- translations[locale] = base_translations.deep_merge(translations[locale])
62
- elsif tenant
63
- base_locale.gsub!(/^#{tenant}_/, '')
64
- else
65
- base_locale.gsub!(FORMAL_LOCALE_PATTERN, '')
66
- end
67
-
68
- unless tenant && locale.to_s.match(FORMAL_LOCALE_PATTERN)
69
- translations[locale] = (translations[base_locale.to_sym] || {}).clone
70
- end
71
- else
72
- translations[locale] ||= {}
73
- end
74
-
75
- data = data.deep_symbolize_keys
76
-
77
- translations[locale].deep_merge!(data)
18
+ @filenames.each { |filename| load_file(filename) }
78
19
  end
79
20
 
80
21
  def available_locale(options = {})
@@ -117,7 +58,64 @@ class MultiFormalI18nTenancy::Backend < I18n::Backend::Simple
117
58
  deepest_available_locale || I18n.default_locale
118
59
  end
119
60
 
120
- #private
61
+ protected
62
+
63
+ # Looks up a translation from the translations hash. Returns nil if
64
+ # eiher key is nil, or locale, scope or key do not exist as a key in the
65
+ # nested translations hash. Splits keys or scopes containing dots
66
+ # into multiple keys, i.e. <tt>currency.format</tt> is regarded the same as
67
+ # <tt>%w(currency format)</tt>.
68
+ def lookup(locale, key, scope = [], options = {})
69
+ init_translations unless initialized?
70
+
71
+ # only formal address: [:de, :de_formal]
72
+ # only multi tenancy: [:de, :tenant_name_de]
73
+ # formal address & multi tenancy: [:de, :tenant_name_de, :de_formal, :tenant_name_de_formal]
74
+
75
+ locales = []
76
+
77
+ base_locale = locale.to_s.gsub(FORMAL_LOCALE_PATTERN, '')
78
+
79
+ tenant = tenant_from_locale?(locale)
80
+ base_locale.gsub!(/^#{tenant}_/, '') if tenant
81
+
82
+ locales << base_locale.to_sym
83
+
84
+ if locale.to_s.match(FORMAL_LOCALE_PATTERN) && tenant && locale.to_s.match(/^#{tenant}_/)
85
+ locales << locale.to_s.gsub(FORMAL_LOCALE_PATTERN, '').to_sym
86
+ locales << locale.to_s.gsub(/^#{tenant}_/, '').to_sym
87
+ end
88
+
89
+ locales << locale unless locales.include?(locale)
90
+
91
+ entry, last_entry = nil, nil
92
+
93
+ locales.each do |locale|
94
+ keys = I18n.normalize_keys(locale, key, scope, options[:separator])
95
+
96
+ entry = keys.inject(translations) do |result, _key|
97
+ _key = _key.to_sym
98
+
99
+ unless result.is_a?(Hash) && result.has_key?(_key)
100
+ nil
101
+ else
102
+ result = result[_key]
103
+ result = resolve(locale, _key, result, options.merge(:scope => nil)) if result.is_a?(Symbol)
104
+ result
105
+ end
106
+ end
107
+
108
+ if entry.nil?
109
+ entry = last_entry
110
+ else
111
+ last_entry = entry
112
+ end
113
+ end
114
+
115
+ entry
116
+ end
117
+
118
+ private
121
119
 
122
120
  def tenant_from_locale?(locale)
123
121
  tenant = locale.to_s.gsub(FORMAL_LOCALE_PATTERN, '').split('_')
@@ -131,16 +129,4 @@ class MultiFormalI18nTenancy::Backend < I18n::Backend::Simple
131
129
 
132
130
  tenant && @filenames.select{|f| f.match("/tenants/#{tenant}/")}.any? ? tenant : nil
133
131
  end
134
-
135
- def delete_right_key_if_left_has_key(left_hash, right_hash)
136
- right_hash.each do |key,value|
137
- next unless left_hash.has_key?(key)
138
-
139
- if value.is_a?(Hash)
140
- delete_right_key_if_left_has_key(left_hash[key], value)
141
- else
142
- right_hash.delete(key) if left_hash.has_key?(key)
143
- end
144
- end
145
- end
146
132
  end
@@ -1,3 +1,3 @@
1
1
  module MultiFormalI18nTenancy
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -11,7 +11,7 @@ describe MultiFormalI18nTenancy::Backend do
11
11
  I18n.locale = I18n.default_locale
12
12
  end
13
13
 
14
- describe '#load_translations' do
14
+ describe '#lookup' do
15
15
  include_context :all_locale_file_constellations
16
16
 
17
17
  before :all do
@@ -193,25 +193,4 @@ describe MultiFormalI18nTenancy::Backend do
193
193
  end
194
194
  end
195
195
  end
196
- =begin
197
- describe '#delete_right_key_if_left_key' do
198
- include_context :all_locale_file_constellations
199
-
200
- it 'principally works' do
201
- I18n.backend = MultiFormalI18nTenancy::Backend.new
202
-
203
- left_hash = { key_1: 'value 1', key_2: { key_2_1: 'value 2.1' }}
204
- right_hash = { key_1: 'value 2', key_2: { key_2_1: 'value 2.1 a', key_2_2: 'value 2.2' } }
205
-
206
- #I18n.backend.delete_right_key_if_left_key(left_hash, right_hash)
207
-
208
- #left_hash.deep_merge!(right_hash)
209
- left_hash = right_hash.deep_merge(left_hash)
210
-
211
- left_hash[:key_1].should == 'value 1'
212
- left_hash[:key_2][:key_2_1].should == 'value 2.1'
213
- left_hash[:key_2][:key_2_2].should == 'value 2.2'
214
- end
215
- end
216
- =end
217
196
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multi_formal_i18n_tenancy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-15 00:00:00.000000000 Z
12
+ date: 2012-07-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &70348032887440 !ruby/object:Gem::Requirement
16
+ requirement: &70201387898160 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70348032887440
24
+ version_requirements: *70201387898160
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &70348032885840 !ruby/object:Gem::Requirement
27
+ requirement: &70201387896560 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,9 +32,10 @@ dependencies:
32
32
  version: 2.11.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70348032885840
36
- description: Your formal locales will inherit translations from their base locale
37
- and locales stored in an enterprise folder can override base + formal translations
35
+ version_requirements: *70201387896560
36
+ description: ! 'Your locales about polite form of address will inherit translations
37
+ from their base locale and locales stored in a tenant directory can override base
38
+ + formal translations '
38
39
  email:
39
40
  - gawlista@googlemail.com
40
41
  executables: []
@@ -62,7 +63,7 @@ files:
62
63
  - spec/spec_helper.rb
63
64
  - spec/support/deferred_garbage_collection.rb
64
65
  - spec/support/shared_contexts/all_locale_file_constellations.rb
65
- homepage: http://applicat.github.com/multi_formal_i18n_tenancy
66
+ homepage: http://github.com/Applicat/multi_formal_i18n_tenancy
66
67
  licenses: []
67
68
  post_install_message:
68
69
  rdoc_options: []
@@ -76,7 +77,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
76
77
  version: '0'
77
78
  segments:
78
79
  - 0
79
- hash: -2510370042609232382
80
+ hash: 3959917024077130504
80
81
  required_rubygems_version: !ruby/object:Gem::Requirement
81
82
  none: false
82
83
  requirements:
@@ -85,14 +86,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
86
  version: '0'
86
87
  segments:
87
88
  - 0
88
- hash: -2510370042609232382
89
+ hash: 3959917024077130504
89
90
  requirements: []
90
91
  rubyforge_project:
91
92
  rubygems_version: 1.8.17
92
93
  signing_key:
93
94
  specification_version: 3
94
- summary: Your formal locales will inherit translations from their base locale and
95
- locales stored in an enterprise folder can override base + formal translations
95
+ summary: Your locales about polite form of address will inherit translations from
96
+ their base locale and locales stored in a tenant directory can override base + formal
97
+ translations
96
98
  test_files:
97
99
  - spec/fixtures/de.yml
98
100
  - spec/fixtures/de_formal.yml