tolk 3.1.0 → 3.2.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
  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