tolk 3.1.0 → 3.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b753e133065f79384722a0bc6bebc2c1f7813b883416edd21f6c77865781aa49
4
- data.tar.gz: 9fb51fd436c27206dd90c1d4fe07ab79a02e5abb7d3dfb0ce95df7f447f562a9
3
+ metadata.gz: b8f6680d4fdb375f50c14ea1725d32cf73c395b3825578f9e2f25b1ce6e593d7
4
+ data.tar.gz: b07c28ea6939450e7f46947d894db437b65142684994d47e6dfa8527356b4cae
5
5
  SHA512:
6
- metadata.gz: 0dd502da4768842fb90b22c4429a274527da26429383bc8778c525cd6bdaa4b2f98dd0fa1a16c143e84a7a07dae38bf5a34d0a495e51a9220f032728160be8ca
7
- data.tar.gz: cf90e11178f701c1526dec760bf6717b341bbd1754deba6ccffed62d9c8059fe6c24d95ff060a1bb043ea2a0a350fe106e99ab52309855b5921ab342d421ad7d
6
+ metadata.gz: '0980d8b70e512963c7be3ca8af3c5519b482370a8e5510f00606e6f93e066218583f19627f02df641dffba02476f1ed185ba63f2986e66a7c278c7bd744f607d'
7
+ data.tar.gz: c329d8a59897919e8a652c314115514d3f532cd6b23067e911f76651fcc5121ffe9eba4034923ab4504c8ee8ad0900f043f20ec1a5240938e2da7d2f5663b412
@@ -30,6 +30,9 @@ module Tolk
30
30
  # in the same context than the rest of your app
31
31
  attr_accessor :base_controller
32
32
 
33
+ # Ignore specific keys
34
+ attr_accessor :ignore_keys
35
+
33
36
  def reset
34
37
  @exclude_gems_token = false
35
38
 
@@ -89,6 +92,8 @@ module Tolk
89
92
  @yaml_line_width = Psych::Handler::OPTIONS.line_width # Psych::Handler::DumperOptions uses 0 as "default" for unset
90
93
 
91
94
  @base_controller = 'ActionController::Base'
95
+
96
+ @ignore_keys = []
92
97
  end
93
98
  end
94
99
 
@@ -24,27 +24,27 @@ module Tolk
24
24
  data = locale.read_locale_file
25
25
  return unless data
26
26
 
27
- phrases = Tolk::Phrase.all
27
+ phrases_by_key = Tolk::Phrase.all.index_by(&:key)
28
+ translated_phrase_ids = Set.new(locale.translations.pluck(:phrase_id))
28
29
  count = 0
29
30
 
30
31
  data.each do |key, value|
31
- phrase = phrases.detect {|p| p.key == key}
32
-
33
- if phrase
34
- translation = locale.translations.new(:text => value, :phrase => phrase)
35
- if translation.save
36
- count = count + 1
37
- elsif translation.errors[:variables].present?
38
- puts "[WARN] Key '#{key}' from '#{locale_name}.yml' could not be saved: #{translation.errors[:variables].first}"
39
- end
40
- else
32
+ phrase = phrases_by_key[key]
33
+ unless phrase
41
34
  puts "[ERROR] Key '#{key}' was found in '#{locale_name}.yml' but #{Tolk::Locale.primary_language_name} translation is missing"
35
+ next
36
+ end
37
+ next if translated_phrase_ids.include?(phrase.id)
38
+ translation = locale.translations.new(:text => value, :phrase => phrase)
39
+ if translation.save
40
+ count = count + 1
41
+ elsif translation.errors[:variables].present?
42
+ puts "[WARN] Key '#{key}' from '#{locale_name}.yml' could not be saved: #{translation.errors[:variables].first}"
42
43
  end
43
44
  end
44
45
 
45
46
  puts "[INFO] Imported #{count} keys from #{locale_name}.yml"
46
47
  end
47
-
48
48
  end
49
49
 
50
50
  def read_locale_file
@@ -30,7 +30,8 @@ module Tolk
30
30
  I18n.backend.send :init_translations unless I18n.backend.initialized? # force load
31
31
  end
32
32
  translations = flat_hash(I18n.backend.send(:translations)[primary_locale.name.to_sym])
33
- filter_out_i18n_keys(translations.merge(read_primary_locale_file))
33
+ filtered = filter_out_i18n_keys(translations.merge(read_primary_locale_file))
34
+ filter_out_ignored_keys(filtered)
34
35
  end
35
36
 
36
37
  def read_primary_locale_file
@@ -62,30 +63,44 @@ module Tolk
62
63
  primary_locale = self.primary_locale
63
64
 
64
65
  # Handle deleted phrases
65
- translations.present? ? Tolk::Phrase.where(["tolk_phrases.key NOT IN (?)", translations.keys]).destroy_all : Tolk::Phrase.destroy_all
66
+ Tolk::Phrase.where.not(:key => translations.keys).destroy_all
66
67
 
67
- phrases = Tolk::Phrase.all
68
+ phrases_by_key = Tolk::Phrase.all.index_by(&:key)
69
+ primary_translation_by_phrase_id = primary_locale.translations.index_by(&:phrase_id)
68
70
 
69
71
  translations.each do |key, value|
70
72
  next if value.is_a?(Proc)
71
73
  # Create phrase and primary translation if missing
72
- existing_phrase = phrases.detect {|p| p.key == key} || Tolk::Phrase.create!(:key => key)
73
- translation = existing_phrase.translations.primary || primary_locale.translations.build(:phrase_id => existing_phrase.id)
74
+ phrase = phrases_by_key[key] || Tolk::Phrase.create!(:key => key)
75
+ translation = primary_translation_by_phrase_id[phrase.id]
76
+ translation ||= primary_locale.translations.build(:phrase => phrase)
74
77
  translation.text = value
75
78
 
76
79
  if translation.changed? && !translation.new_record?
77
80
  # Set the primary updated flag if the primary translation has changed and it is not a new record.
78
- existing_phrase.translations.where(Tolk::Translation.arel_table[:locale_id].not_eq(primary_locale.id)).update_all({ :primary_updated => true })
81
+ phrase.translations.where.not(:locale_id => primary_locale.id).update_all({ :primary_updated => true })
79
82
  end
80
83
 
81
84
  translation.primary = true
82
- translation.save!
85
+ translation.save! if translation.changed?
83
86
  end
84
87
  end
85
88
 
86
89
  def filter_out_i18n_keys(flat_hash)
87
90
  flat_hash.reject { |key, value| key.starts_with? "i18n" }
88
91
  end
92
+
93
+ def filter_out_ignored_keys(flat_hash)
94
+ ignored = Tolk.config.ignore_keys
95
+
96
+ return flat_hash unless ignored.any?
97
+
98
+ ignored_escaped = ignored.map { |key| Regexp.escape(key) }
99
+
100
+ regexp = Regexp.new(/\A#{ignored_escaped.join('|')}/)
101
+
102
+ flat_hash.reject { |key, _| regexp === key }
103
+ end
89
104
  end
90
105
  end
91
106
  end
@@ -1,3 +1,3 @@
1
1
  module Tolk
2
- VERSION = "3.1.0"
2
+ VERSION = "3.2.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tolk
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2018-09-12 00:00:00.000000000 Z
15
+ date: 2019-03-25 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rails
@@ -74,16 +74,16 @@ dependencies:
74
74
  name: sqlite3
75
75
  requirement: !ruby/object:Gem::Requirement
76
76
  requirements:
77
- - - ">="
77
+ - - '='
78
78
  - !ruby/object:Gem::Version
79
- version: '0'
79
+ version: 1.3.13
80
80
  type: :development
81
81
  prerelease: false
82
82
  version_requirements: !ruby/object:Gem::Requirement
83
83
  requirements:
84
- - - ">="
84
+ - - '='
85
85
  - !ruby/object:Gem::Version
86
- version: '0'
86
+ version: 1.3.13
87
87
  - !ruby/object:Gem::Dependency
88
88
  name: mocha
89
89
  requirement: !ruby/object:Gem::Requirement
@@ -197,8 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
197
197
  - !ruby/object:Gem::Version
198
198
  version: '0'
199
199
  requirements: []
200
- rubyforge_project:
201
- rubygems_version: 2.7.7
200
+ rubygems_version: 3.0.3
202
201
  signing_key:
203
202
  specification_version: 4
204
203
  summary: Rails engine providing web interface for managing i18n yaml files