weeler 2.0.0 → 2.1.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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/.travis.yml +1 -2
  4. data/CHANGELOG.md +16 -0
  5. data/Gemfile +0 -7
  6. data/app/assets/javascripts/weeler/init.js +0 -2
  7. data/app/assets/stylesheets/weeler/style.css.scss +7 -1
  8. data/app/controllers/weeler/seo_items_controller.rb +3 -2
  9. data/app/controllers/weeler/settings_controller.rb +27 -9
  10. data/app/controllers/weeler/static_sections_controller.rb +2 -2
  11. data/app/controllers/weeler/translations_controller.rb +4 -18
  12. data/app/models/setting.rb +7 -0
  13. data/app/views/weeler/base/_footer.html.haml +1 -1
  14. data/app/views/weeler/settings/_form.html.haml +16 -0
  15. data/app/views/weeler/settings/index.html.haml +5 -8
  16. data/app/views/weeler/static_sections/show.html.haml +5 -1
  17. data/app/views/weeler/translations/_form.html.haml +5 -2
  18. data/app/views/weeler/translations/index.html.haml +0 -10
  19. data/lib/generators/weeler/templates/assets/javascripts/weeler/app/index.js +3 -1
  20. data/lib/generators/weeler/templates/assets/stylesheets/weeler/app/index.css +1 -1
  21. data/lib/i18n/backend/weeler/exporter.rb +32 -14
  22. data/lib/i18n/backend/weeler/importer.rb +59 -57
  23. data/lib/i18n/backend/weeler.rb +14 -25
  24. data/lib/weeler/action_dispatch/routing/mapper.rb +1 -2
  25. data/lib/weeler/action_view/helpers/translation_helper.rb +2 -2
  26. data/lib/weeler/version.rb +1 -1
  27. data/lib/weeler.rb +6 -1
  28. data/spec/.DS_Store +0 -0
  29. data/spec/controllers/translations_controller_spec.rb +1 -1
  30. data/spec/dummy/.ruby-version +1 -1
  31. data/spec/dummy/config/environment.rb +1 -1
  32. data/spec/dummy/db/schema.rb +3 -3
  33. data/spec/fixtures/test_2020_format.xlsx +0 -0
  34. data/spec/weeler/i18n/backend/weeler/exporter_spec.rb +6 -0
  35. data/spec/weeler/i18n/backend/weeler/importer_spec.rb +17 -6
  36. data/spec/weeler/i18n/backend/weeler_spec.rb +51 -66
  37. data/weeler.gemspec +4 -5
  38. metadata +22 -37
  39. data/app/models/settings.rb +0 -2
  40. data/app/views/weeler/translations/usage_stats.html.haml +0 -34
  41. data/lib/generators/weeler/templates/migrations/create_weeler_translation_stats.rb +0 -11
  42. data/lib/i18n/backend/weeler/usage_logger.rb +0 -35
  43. data/spec/weeler/i18n/backend/weeler/usage_logger_spec.rb +0 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f2174e5387e4473742f03bcb7d8676524c0909bf8ad711bb4a61b722c1d75834
4
- data.tar.gz: 3c4250a6a160bf9cb62da039fc29e8d372d968ad05e02400ee1162bad4f61327
3
+ metadata.gz: 2f37d5cc03594a9eda22d9528e3821d41ccf9f002c27260c0f616f65c3271b72
4
+ data.tar.gz: b84422009a10baa4deef98ef4f6daf0b65296840e3a3abdf3a08898f93a43385
5
5
  SHA512:
6
- metadata.gz: '05382816c8433c45a716d23bccf68821c1d7872fb464ed353b291e0873e90cd6a5ee2be5a011112ed7674be33c205772de5849b3d72c095e626ebd924ee0b5d3'
7
- data.tar.gz: 8ad0ed75b237f4bf39bbc47eaa4189100f9f6db5ee02342cf81fcbe8eafd52f70feeba24cb2ce45026f61f42f939eea66f231a88a72a882b3a18e840017eda82
6
+ metadata.gz: e8c6b2f40223ac6bea1e9a3a40344f122381699a21ad10370bffc783903fce720167d7ea57606ef9b7cc02eb84a81d3bb6fb6264062e304e1e4ad7aed3b60b70
7
+ data.tar.gz: ac5ae80ae00751bfb09c92ac5dcf94789d846d9980b146373619f17f33dc8680902d8a27cd6d6471ee9bc2ea8b5c68eed868e5019d81fe78b69936a46845be13
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.0.2
data/.travis.yml CHANGED
@@ -7,8 +7,7 @@ sudo: false
7
7
  before_script:
8
8
  - psql -c 'create database travis_ci_test;' -U postgres
9
9
  rvm:
10
- - "2.6.0"
11
- - "2.7.0"
10
+ - "3.0.1"
12
11
  # uncomment this line if your project needs to run something other than `rake`:
13
12
  script:
14
13
  - RAILS_ENV=test bundle exec rake db:migrate --trace
data/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ ## 2.1.0
2
+
3
+ ### Features & Enhancements
4
+
5
+ * Support from Ruby 3.0.0
6
+
7
+ ### Bug Fixes
8
+
9
+ * Importer fixed
10
+
11
+ ## 2.0.1
12
+
13
+ ### Features & Enhancements
14
+
15
+ * Optimized translation import and export (avoiding n+1 queries)
16
+
1
17
  ## 2.0.0
2
18
 
3
19
  ### Features & Enhancements
data/Gemfile CHANGED
@@ -3,12 +3,5 @@ source 'https://rubygems.org'
3
3
  gem 'globalize', github: 'globalize/globalize'
4
4
  gem 'rails-controller-testing'
5
5
 
6
- # platform :jruby do
7
- # github 'jruby/activerecord-jdbc-adapter', branch: 'rails-5' do
8
- # gem 'activerecord-jdbc-adapter'
9
- # gem 'activerecord-jdbcpostgresql-adapter'
10
- # end
11
- # end
12
-
13
6
  # Specify your gem's dependencies in weeler.gemspec
14
7
  gemspec
@@ -1,8 +1,6 @@
1
1
  //= require jquery
2
- //= require jquery.turbolinks
3
2
  //= require jquery-ui
4
3
  //= require jquery_ujs
5
- //= require turbolinks
6
4
  //= require ./vendor/moment
7
5
  //= require_tree ./vendor
8
6
  //= require_tree ./lib
@@ -78,4 +78,10 @@ span.weeler_version{
78
78
  vertical-align: super;
79
79
  font-size:10px;
80
80
  color:#C2C2C2;
81
- }
81
+ }
82
+
83
+ .sidebar-nav {
84
+ .nav > li > a:hover, .nav > li > a:focus, .nav > li > a.active {
85
+ background-color: #ddd;
86
+ }
87
+ }
@@ -17,8 +17,9 @@ module Weeler
17
17
  translation.value = value
18
18
  translation.save
19
19
  end
20
- Settings.i18n_updated_at = Time.now
20
+ Setting.i18n_updated_at = Time.now
21
+
21
22
  redirect_to({action: :edit, id: params[:id]}, {flash: {success: "Section updated."}})
22
23
  end
23
24
  end
24
- end
25
+ end
@@ -1,21 +1,39 @@
1
1
  class Weeler::SettingsController < Weeler::ConfigurationController
2
+ HIDDEN_SETTINGS_KEYS = %w[i18n_updated_at].freeze
3
+
2
4
  def index
3
- # to get all items for render list
4
- @settings = Settings.unscoped
5
+ @settings = Setting.all.order(:id).where.not(var: HIDDEN_SETTINGS_KEYS)
6
+ end
7
+
8
+ def create
9
+ @setting = Setting.new(create_setting_params)
10
+
11
+ if @setting.save
12
+ redirect_to weeler_settings_path, flash: { success: 'Setting created.' }
13
+ else
14
+ flash.now[:error] = 'Errors on creating.'
15
+ render :index
16
+ end
5
17
  end
6
18
 
7
19
  def update
8
- @setting = Settings.unscoped.find(params[:id])
9
- if @setting.update(setting_params)
10
- redirect_to weeler_settings_path, flash: {success: "Setting updated."}
20
+ @setting = Setting.find(params[:id])
21
+
22
+ if @setting.update(update_setting_params)
23
+ redirect_to weeler_settings_path, flash: { success: 'Setting updated.' }
11
24
  else
12
- flash.now[:error] = "Errors in updating."
25
+ flash.now[:error] = 'Errors on updating.'
13
26
  render :index
14
27
  end
15
28
  end
16
- protected
17
- def setting_params
18
- params.require(:settings).permit([:value])
29
+
30
+ protected
31
+
32
+ def create_setting_params
33
+ params.require(:setting).permit(:var, :value)
19
34
  end
20
35
 
36
+ def update_setting_params
37
+ params.require(:setting).permit(:value)
38
+ end
21
39
  end
@@ -12,8 +12,8 @@ module Weeler
12
12
  translation.value = value
13
13
  translation.save
14
14
  end
15
- Settings.i18n_updated_at = Time.now
16
- redirect_to({action: :show, id: params[:id]}, {flash: {success: "Section updated."}})
15
+ Setting.i18n_updated_at = Time.current
16
+ redirect_to({ action: :show, id: params[:id] }, { flash: { success: "Section updated." } })
17
17
  end
18
18
  end
19
19
  end
@@ -19,7 +19,7 @@ module Weeler
19
19
  @translation = I18n::Backend::Weeler::Translation.new(translation_params)
20
20
 
21
21
  if @translation.save
22
- Settings.i18n_updated_at = Time.now
22
+ Setting.i18n_updated_at = Time.now
23
23
  redirect_to ({ action: :edit, id: @translation }), flash: { success: "Translation saved." }
24
24
  else
25
25
  flash.now[:error] = "Errors in saving."
@@ -31,7 +31,7 @@ module Weeler
31
31
  @translation = I18n::Backend::Weeler::Translation.find(params[:id])
32
32
 
33
33
  if @translation.update(translation_params)
34
- Settings.i18n_updated_at = Time.now
34
+ Setting.i18n_updated_at = Time.now
35
35
 
36
36
  redirect_to ({ action: :edit, id: @translation }), flash: { success: "Translation updated." }
37
37
  else
@@ -44,24 +44,11 @@ module Weeler
44
44
  @translation = I18n::Backend::Weeler::Translation.find(params[:id])
45
45
  @translation.destroy
46
46
 
47
- Settings.i18n_updated_at = Time.now
47
+ Setting.i18n_updated_at = Time.now
48
48
 
49
49
  redirect_to ({ action: :index }), flash: {success: "Translation succesfully removed."}
50
50
  end
51
51
 
52
- def usage_stats
53
- @used_keys = []
54
- if Settings.log_key_usage == 'dump'
55
- I18n::Backend::Weeler::TranslationStat.all.each do |translation_stat|
56
- @used_keys << [translation_stat.key, translation_stat.usage_count]
57
- end
58
- else
59
- Weeler.i18n_cache.instance_variable_get(:@data).keys.each do |key|
60
- @used_keys << [key, Weeler.i18n_cache.read(key)] if key.start_with?('usage_stats')
61
- end
62
- end
63
- end
64
-
65
52
  def export
66
53
  respond_to do |format|
67
54
  format.xlsx do
@@ -76,7 +63,7 @@ module Weeler
76
63
  if params[:file].present?
77
64
  I18n::Backend::Weeler::Translation.import params[:file]
78
65
 
79
- Settings.i18n_updated_at = Time.now
66
+ Setting.i18n_updated_at = Time.now
80
67
 
81
68
  redirect_to ({ action: :index }), flash: {success: "Translations succesfully imported."}
82
69
  else
@@ -108,6 +95,5 @@ module Weeler
108
95
  translations = translations.lookup(params[:group]) if params[:group].present?
109
96
  translations
110
97
  end
111
-
112
98
  end
113
99
  end
@@ -0,0 +1,7 @@
1
+ class Setting < RailsSettings::Base
2
+ field :i18n_updated_at, type: :string
3
+
4
+ Weeler.settings_fields.each do |field_options|
5
+ field field_options[:name], **field_options.except(:name)
6
+ end
7
+ end
@@ -1,2 +1,2 @@
1
1
  %footer
2
- %p © Weby 2014
2
+ %p © Weby 2021
@@ -0,0 +1,16 @@
1
+ = form_for [:weeler, item], html: {class: "form-vertical", role: "form"} do |f|
2
+ - if item.new_record?
3
+ = f.hidden_field :var
4
+
5
+ .form-group
6
+ %label.col-lg-4.col-md-4.control-label
7
+ = "#{item.var.humanize.capitalize}:"
8
+ .col-lg-6.col-md-6
9
+ - type = item.class.get_field(item.var)[:type]
10
+ - if type == :boolean
11
+ = f.check_box :value, class: "form-check-input"
12
+ - else
13
+ = f.text_field :value, class: "form-control"
14
+
15
+ .col-lg-2.col-md-2
16
+ = f.submit "Save", class: "btn btn-primary"
@@ -9,11 +9,8 @@
9
9
  %div{class: "col-lg-8 col-md-8"}
10
10
  - @settings.each do |item|
11
11
  %div{style: "min-height: 50px;"}
12
- = form_for [:weeler, item], html: {class: "form-vertical", role: "form"} do |f|
13
- .form-group
14
- %label.col-lg-4.col-md-4.control-label
15
- = "#{item.var.humanize.capitalize}:"
16
- .col-lg-6.col-md-6
17
- = f.text_field :value, value: item.value, class: "form-control"
18
- .col-lg-2.col-md-2
19
- = f.submit "Save", class: "btn btn-primary"
12
+ = render 'form', item: item
13
+ - Setting.keys.each do |key|
14
+ - if !Setting.all.map(&:var).include?(key)
15
+ %div{style: "min-height: 50px;"}
16
+ = render 'form', item: Setting.new(var: key)
@@ -17,8 +17,12 @@
17
17
  .form-group
18
18
  = label_tag key, key.to_s.split('.').last.humanize, class: "col-lg-2 col-md-2 control-label"
19
19
  %div{class: "col-lg-10 col-md-10"}
20
+
20
21
  - if translation.html?
21
- = text_area_tag "translations[#{translation.id}]", translation.value, class: 'form-control redactor'
22
+ - if ::Weeler.use_rails_rich_text_editor
23
+ = rich_text_area_tag "translations[#{translation.id}]", translation.value
24
+ - else
25
+ = text_area_tag "translations[#{translation.id}]", translation.value, class: 'form-control html'
22
26
  - else
23
27
  = text_area_tag "translations[#{translation.id}]", translation.value, class: 'form-control'
24
28
 
@@ -10,8 +10,11 @@
10
10
  .form-group
11
11
  %label.col-lg-2.col-md-2.control-label Value
12
12
  .col-lg-10.col-md-10
13
- %textarea.form-control{class: "#{'redactor' if translation.html?}", name: 'i18n_backend_weeler_translation[value]', id: 'i18n_backend_weeler_translation_value'}
14
- = translation.value
13
+ - if ::Weeler.use_rails_rich_text_editor && translation.html?
14
+ = rich_text_area_tag 'i18n_backend_weeler_translation[value]', translation.value
15
+ - else
16
+ %textarea.form-control{class: "#{'html' if translation.html?}", name: 'i18n_backend_weeler_translation[value]', id: 'i18n_backend_weeler_translation_value'}
17
+ = translation.value
15
18
  %h4 Info
16
19
  .form-group
17
20
  %label.col-lg-2.col-md-2.control-label Variables
@@ -10,15 +10,6 @@
10
10
  = link_to 'Show translations', weeler_translations_path(show_translation_keys: false)
11
11
  - else
12
12
  = link_to 'Show translation keys', weeler_translations_path(show_translation_keys: true)
13
- %h1 Stats
14
- %p.lead.text-muted
15
- - if Settings.log_key_usage == 'true'
16
- = 'Translation usage stat gathering is ON'
17
- - else
18
- = 'Translation usage stat gathering is OFF'
19
- %p.lead.text-muted
20
- = link_to 'Go to Stats', {action: :usage_stats}
21
-
22
13
  .row
23
14
  .col-xs-12
24
15
  %nav.navbar.navbar-default{ role: "navigation" }
@@ -39,7 +30,6 @@
39
30
  %li
40
31
  %a{href: weeler_translations_path(group: params[:group], filtered_locale: locale)}= locale.capitalize
41
32
 
42
-
43
33
  / key group lookup
44
34
  %ul.nav.navbar-nav.navbar-left
45
35
  %li.dropdown
@@ -1,2 +1,4 @@
1
1
  // Here you can implement your JS code
2
- // For example //= require redactor-rails
2
+ // //= require activestorage
3
+ // //= require trix/dist/trix
4
+ // //= require @rails/actiontext/app/javascript/actiontext/index
@@ -1,4 +1,4 @@
1
1
  /*
2
2
  Here you can implement your css code
3
- // For example *= require redactor-rails
3
+ @import "trix/dist/trix"; // For example
4
4
  */
@@ -25,7 +25,6 @@ module I18n
25
25
  extend ActiveSupport::Concern
26
26
 
27
27
  module ClassMethods
28
-
29
28
  # Prepare xlsx package from current scope
30
29
  # Stores all translations in translations worksheet.
31
30
  def as_xlsx_package
@@ -42,33 +41,52 @@ module I18n
42
41
 
43
42
  included_keys = []
44
43
 
45
- self.current_scope.each do |translation|
46
- unless included_keys.include? translation.key
47
- sheet.add_row(Translation.translation_row_by_key_and_locales(translation.key, locales), types: types)
48
- included_keys << translation.key
49
- end
44
+ tranlsations_by_locales = Translation.where(locale: locales).group_by(&:locale)
45
+
46
+ current_scope.each do |translation|
47
+ next if included_keys.include?(translation.key)
48
+
49
+ row = Translation.translation_row_by_key_and_locales(tranlsations_by_locales, translation.key, locales)
50
+ sheet.add_row(row, types: types)
51
+ included_keys << translation.key
50
52
  end
51
- return package
53
+
54
+ package
52
55
  end
53
56
 
54
- def title_row locales
57
+ def title_row(locales)
55
58
  row = [ 'Key' ]
56
59
  locales.each do |locale|
57
60
  row.push(locale.capitalize)
58
61
  end
62
+
63
+ row.push('Created at')
64
+ row.push('Updated at')
65
+
59
66
  row
60
67
  end
61
68
 
62
- def translation_row_by_key_and_locales key, locales
63
- row = [ key ]
69
+ def translation_row_by_key_and_locales(tranlsations_by_locales, key, locales)
70
+ row = [key]
71
+ created_ats = []
72
+ updated_ats = []
73
+
64
74
  locales.each do |locale|
65
- result = Translation.locale(locale).lookup(key).load
66
- if result.first.present?
67
- row.push(result.first.value)
75
+ translation = tranlsations_by_locales[locale.to_s]&.find { |t| t.key == key }
76
+
77
+ if translation.present?
78
+ created_ats.push(translation.created_at)
79
+ updated_ats.push(translation.updated_at)
80
+
81
+ row.push(translation.value)
68
82
  else
69
- row.push("")
83
+ row.push('')
70
84
  end
71
85
  end
86
+
87
+ row.push(created_ats.min)
88
+ row.push(updated_ats.max)
89
+
72
90
  row
73
91
  end
74
92
  end
@@ -5,7 +5,7 @@
5
5
  #
6
6
  # if params[:file].present?
7
7
  # I18n::Backend::Weeler::Translation.import params[:file]
8
- # Settings.i18n_updated_at = Time.now
8
+ # Setting.i18n_updated_at = Time.now
9
9
  # end
10
10
 
11
11
  begin
@@ -17,82 +17,84 @@ end
17
17
  module I18n
18
18
  module Backend
19
19
  class Weeler
20
-
21
20
  module Importer
22
21
  extend ActiveSupport::Concern
23
22
 
24
23
  module ClassMethods
25
-
26
24
  # Loads file and iterates each sheet and row.
27
- def import file
28
- xls = open_spreadsheet file
29
- xls.each_with_pagename do |name, sheet|
25
+ def import(file)
26
+ xls = open_spreadsheet(file)
30
27
 
31
- # Lookup locales
32
- locales = locales_from_xlsx_sheet_row(sheet.row(1))
28
+ first_row = xls.first
29
+ locales = locales_from_xlsx_sheet_row(first_row)
30
+ tranlsations_by_locales = Translation.where(locale: locales).group_by(&:locale)
33
31
 
34
- # Lookup values
35
- (2..sheet.last_row).each do |row_no|
36
- store_translations_from_xlsx_row(sheet.row(row_no), locales)
37
- end # rows
32
+ xls.each_with_index do |row, index|
33
+ next if index.zero?
38
34
 
39
- end # sheets
40
-
41
- end # import
35
+ store_translations_from_xlsx_row(tranlsations_by_locales, row, locales)
36
+ end
37
+ end
42
38
 
43
39
  private
44
40
 
45
- # Open csv, xls, xlsx or ods file and read content
46
- def open_spreadsheet(file)
47
- case File.extname(file.original_filename)
48
- when ".csv" then Roo::Csv.new(file.path, file_warning: :ignore)
49
- when ".xls" then Roo::Excel.new(file.path, file_warning: :ignore)
50
- when ".xlsx" then Roo::Excelx.new(file.path, file_warning: :ignore)
51
- when ".ods" then Roo::OpenOffice.new(file.path, file_warning: :ignore)
52
- else raise "Unknown file type: #{file.original_filename}"
53
- end
41
+ # Open csv, xls, xlsx or ods file and read content
42
+ def open_spreadsheet(file)
43
+ case File.extname(file.original_filename)
44
+ when ".csv" then Roo::CSV.new(file.path, file_warning: :ignore)
45
+ when ".xls" then Roo::Excel.new(file.path, file_warning: :ignore)
46
+ when ".xlsx" then Roo::Excelx.new(file.path, file_warning: :ignore)
47
+ when ".ods" then Roo::OpenOffice.new(file.path, file_warning: :ignore)
48
+ else raise "Unknown file type: #{file.original_filename}"
54
49
  end
50
+ end
55
51
 
56
- # Lookup locales and sequence for loading
57
- def locales_from_xlsx_sheet_row row
58
- locales = []
59
- row.each_with_index do |cell, i|
60
- if i > 0
61
- locales.push(cell.downcase)
62
- end
63
- end
64
- locales
65
- end
52
+ # Lookup locales and sequence for loading
53
+ def locales_from_xlsx_sheet_row(row)
54
+ locales = []
55
+ row.each_with_index do |cell, i|
56
+ next unless i.positive?
66
57
 
67
- # Iterate each cell in row and store translation by locale
68
- def store_translations_from_xlsx_row row, locales
69
- locale = nil
70
- key = nil
71
- value = nil
72
-
73
- row.each_with_index do |cell, i|
74
- if i == 0
75
- key = cell
76
- else
77
- locale = locales[ i - 1 ]
78
- store_translation_from_xlsx_cell locale, key, cell
79
- end
80
- end
58
+ locale = cell.downcase
59
+
60
+ # check if legal local
61
+ next if locale.size != 2
62
+
63
+ locales.push(cell.downcase)
81
64
  end
65
+ locales
66
+ end
82
67
 
83
- # Store locale if locale and key present
84
- def store_translation_from_xlsx_cell locale, key, cell
85
- value = cell.nil? ? '' : cell
68
+ # Iterate each cell in row and store translation by locale
69
+ def store_translations_from_xlsx_row(tranlsations_by_locales, row, locales)
70
+ locale = nil
71
+ key = nil
86
72
 
87
- if locale.present? && key.present?
88
- translation = Translation.find_or_initialize_by locale: locale, key: key
89
- if translation.value != value
90
- translation.value = value
91
- translation.save
92
- end
73
+ row.each_with_index do |cell, i|
74
+ if i.zero?
75
+ key = cell
76
+ else
77
+ locale = locales[i - 1]
78
+
79
+ store_translation_from_xlsx_cell(tranlsations_by_locales[locale.to_s], locale, key, cell) if locale.present?
93
80
  end
94
81
  end
82
+ end
83
+
84
+ # Store locale if locale and key present
85
+ def store_translation_from_xlsx_cell(locale_translations, locale, key, cell)
86
+ value = cell.nil? ? '' : cell
87
+
88
+ return if locale.blank? || key.blank?
89
+
90
+ translation = locale_translations&.find { |t| t.key == key }
91
+
92
+ return if translation.present? && translation.value == value
95
93
 
94
+ translation ||= Translation.new(locale: locale, key: key)
95
+ translation.value = value
96
+ translation.save
97
+ end
96
98
  end
97
99
  end
98
100
 
@@ -4,8 +4,6 @@ require 'i18n/backend/weeler/dedupe'
4
4
  require 'i18n/backend/weeler/html_checker'
5
5
  require 'i18n/backend/weeler/exporter'
6
6
  require 'i18n/backend/weeler/importer'
7
- require 'i18n/backend/weeler/usage_logger'
8
- require 'i18n/backend/weeler/translation_stat'
9
7
  require 'i18n/backend/weeler/lock'
10
8
 
11
9
  module I18n
@@ -31,8 +29,6 @@ module I18n
31
29
  autoload :Translation, 'i18n/backend/weeler/translation'
32
30
  autoload :Exporter, 'i18n/backend/weeler/exporter'
33
31
  autoload :Importer, 'i18n/backend/weeler/importer'
34
- autoload :UsageLogger, 'i18n/backend/weeler/usage_logger'
35
- autoload :TranslationStat, 'i18n/backend/weeler/translation_stat'
36
32
  autoload :Lock, 'i18n/backend/weeler/lock'
37
33
 
38
34
  module Implementation
@@ -52,12 +48,16 @@ module I18n
52
48
  Translation.all.each do |translation|
53
49
  # Load in cache unless value is nil or it is blank and empty
54
50
  # translation acts like missing
55
- if !(translation.value.nil? || (::Weeler.empty_translation_acts_like_missing && translation.value.blank?))
56
- i18n_cache.write [translation.locale, translation.key], translation
57
- end
51
+ next if translation.value.nil? || (::Weeler.empty_translation_acts_like_missing && translation.value.blank?)
52
+
53
+ i18n_cache.write [translation.locale, translation.key], translation
58
54
  end
59
55
 
60
- i18n_cache.write('UPDATED_AT', Settings.i18n_updated_at) if ActiveRecord::Base.connection.data_source_exists?('settings')
56
+ i18n_cache.write('UPDATED_AT', Setting.i18n_updated_at) if ActiveRecord::Base.connection.data_source_exists?('settings')
57
+ end
58
+
59
+ def available_locales
60
+ I18n::Backend::Weeler::Translation.distinct.pluck(:locale).compact.map(&:to_sym)
61
61
  end
62
62
 
63
63
  protected
@@ -70,26 +70,15 @@ module I18n
70
70
 
71
71
  private
72
72
 
73
- def lookup_in_cache locale, key, scope = [], options = {}
73
+ def lookup_in_cache(locale, key, scope = [], options = {})
74
74
  # reload cache if cache timestamp differs from last translations update
75
- reload_cache if ((!ActiveRecord::Base.connection.data_source_exists?('settings')) || i18n_cache.read('UPDATED_AT') != Settings.i18n_updated_at)
76
-
77
- # log locale/key usage for statistics
78
- if Settings.log_key_usage == 'true'
79
- i18n_cache.delete([:dump_usage_stats, Process.pid])
80
- log_key_usage(locale, key)
81
- end
82
-
83
- if Settings.log_key_usage == 'dump'
84
- dump_key_usage
85
- end
75
+ reload_cache if ((!ActiveRecord::Base.connection.data_source_exists?('settings')) || i18n_cache.read('UPDATED_AT') != Setting.i18n_updated_at)
86
76
 
87
77
  return nil if i18n_cache.read([:missing, [locale, key]])
88
78
 
89
79
  keys = expand_keys key
90
80
 
91
81
  keys.reverse.each do |check_key|
92
-
93
82
  result = i18n_cache.read([locale, check_key])
94
83
 
95
84
  return result.value unless result.blank?
@@ -145,10 +134,12 @@ module I18n
145
134
 
146
135
  keys = options[:count] ? PLURAL_KEYS.map { |k| [singular_key, k].join(FLATTEN_SEPARATOR) } : [singular_key]
147
136
 
148
-
149
137
  keys.each do |key|
150
- translation = Weeler::Translation.find_or_initialize_by locale: locale.to_s, key: key
138
+ translation = Weeler::Translation.find_or_initialize_by(locale: locale.to_s, key: key)
151
139
  translation.interpolations = interpolations
140
+
141
+
142
+
152
143
  fallback_value = fallback_backend_translation locale, key
153
144
  if fallback_value.present?
154
145
  translation.value = fallback_value
@@ -162,7 +153,6 @@ module I18n
162
153
  return_value
163
154
  end
164
155
 
165
-
166
156
  def fallback_backend_translation locale, key
167
157
  if I18n.backend.backends.size > 1
168
158
  alternative_backend = I18n.backend.backends[1]
@@ -171,7 +161,6 @@ module I18n
171
161
  nil
172
162
  end
173
163
  end
174
-
175
164
  end
176
165
 
177
166
  include Implementation