lit 0.2.4 → 0.2.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.
- checksums.yaml +7 -0
- data/README.md +17 -0
- data/Rakefile +1 -4
- data/app/controllers/lit/api/v1/base_controller.rb +5 -5
- data/app/controllers/lit/api/v1/locales_controller.rb +2 -2
- data/app/controllers/lit/api/v1/localization_keys_controller.rb +2 -3
- data/app/controllers/lit/api/v1/localizations_controller.rb +2 -2
- data/app/controllers/lit/application_controller.rb +12 -11
- data/app/controllers/lit/dashboard_controller.rb +1 -1
- data/app/controllers/lit/incomming_localizations_controller.rb +13 -6
- data/app/controllers/lit/locales_controller.rb +5 -5
- data/app/controllers/lit/localization_keys_controller.rb +57 -57
- data/app/controllers/lit/localizations_controller.rb +16 -15
- data/app/controllers/lit/sources_controller.rb +13 -12
- data/app/helpers/lit/application_helper.rb +0 -1
- data/app/helpers/lit/localizations_helper.rb +1 -1
- data/app/models/lit/incomming_localization.rb +29 -26
- data/app/models/lit/locale.rb +21 -11
- data/app/models/lit/localization.rb +27 -26
- data/app/models/lit/localization_key.rb +19 -20
- data/app/models/lit/localization_version.rb +1 -1
- data/app/models/lit/source.rb +51 -47
- data/app/views/lit/incomming_localizations/accept.js.erb +2 -0
- data/app/views/lit/incomming_localizations/destroy.js.erb +1 -0
- data/app/views/lit/incomming_localizations/index.html.erb +5 -5
- data/app/views/lit/localization_keys/index.html.erb +1 -1
- data/app/views/lit/localizations/_form.html.erb +1 -1
- data/app/views/lit/localizations/_previous_versions_rows.html.erb +2 -2
- data/app/views/lit/sources/index.html.erb +4 -1
- data/lib/generators/lit/install_generator.rb +16 -16
- data/lib/lit.rb +13 -8
- data/lib/lit/adapters/hash_storage.rb +1 -1
- data/lib/lit/adapters/redis_storage.rb +30 -22
- data/lib/lit/cache.rb +128 -125
- data/lib/lit/engine.rb +1 -2
- data/lib/lit/i18n_backend.rb +59 -12
- data/lib/lit/loader.rb +1 -2
- data/lib/lit/railtie.rb +5 -5
- data/lib/lit/version.rb +1 -1
- data/lib/tasks/lit_tasks.rake +3 -3
- metadata +38 -32
@@ -0,0 +1 @@
|
|
1
|
+
$('table.incomming-localizations-table tr[data-id="<%= @incomming_localization.id %>"]').remove();
|
@@ -10,20 +10,20 @@
|
|
10
10
|
</span>
|
11
11
|
</div>
|
12
12
|
|
13
|
-
<table class="table table-bordered table-striped">
|
13
|
+
<table class="table table-bordered table-striped incomming-localizations-table">
|
14
14
|
<tr>
|
15
15
|
<th>Current value</th>
|
16
16
|
<th>Imported value</th>
|
17
17
|
<th width="200px"></th>
|
18
18
|
</tr>
|
19
19
|
<% @incomming_localizations.each do |il| %>
|
20
|
-
<tr>
|
20
|
+
<tr data-id="<%= il.id %>">
|
21
21
|
<td colspan="3">
|
22
22
|
<%= image_tag "lit/famfamfam_flags/#{il.locale_str[0,2]}.png" %>
|
23
23
|
<strong><%= il.full_key %></strong>
|
24
24
|
</td>
|
25
25
|
</tr>
|
26
|
-
<tr>
|
26
|
+
<tr data-id="<%= il.id %>">
|
27
27
|
<td>
|
28
28
|
<% if il.localization %>
|
29
29
|
<%= render :partial=>"/lit/localization_keys/localization_row", :locals=>{:localization=>il.localization.get_value} %>
|
@@ -33,11 +33,11 @@
|
|
33
33
|
<%= render :partial=>"/lit/localization_keys/localization_row", :locals=>{:localization=>il.get_value} %>
|
34
34
|
</td>
|
35
35
|
<td>
|
36
|
-
<%= link_to accept_source_incomming_localization_path(@source, il), :class=>"btn btn-success btn-sm" do %>
|
36
|
+
<%= link_to accept_source_incomming_localization_path(@source, il), :class=>"btn btn-success btn-sm", :remote=>true do %>
|
37
37
|
<%= draw_icon "check", :class=>"icon-white" %>
|
38
38
|
<%= t('lit.common.accept', :default=>"Accept") %>
|
39
39
|
<% end %>
|
40
|
-
<%= link_to source_incomming_localization_path(@source, il), :class=>"btn btn-danger btn-sm", :method=>:delete, :data=>{:confirm=>t('lit.common.you_sure', :default=>"Are you sure?")} do %>
|
40
|
+
<%= link_to source_incomming_localization_path(@source, il), :class=>"btn btn-danger btn-sm", :remote=>true, :method=>:delete, :data=>{:confirm=>t('lit.common.you_sure', :default=>"Are you sure?")} do %>
|
41
41
|
<%= draw_icon "times", :class=>"icon-white" %>
|
42
42
|
<%= t('lit.common.reject', :default=>"Reject") %>
|
43
43
|
<% end %>
|
@@ -88,7 +88,7 @@
|
|
88
88
|
<li class="nav-header">Narrow with prefix</li>
|
89
89
|
<% if @search_options[:key_prefix].present? %>
|
90
90
|
<li>
|
91
|
-
<%= link_to url_for(@search_options.merge(:key_prefix
|
91
|
+
<%= link_to url_for(@search_options.merge(:key_prefix=>@parent_prefix.present? ? @parent_prefix : nil)), :title=>(@parent_prefix.present? ? @parent_prefix : 'show all') do %>
|
92
92
|
<%= draw_icon('chevron-left') %>
|
93
93
|
<%= @parent_prefix.present? ? @parent_prefix.split('.').last : 'show all' %>
|
94
94
|
<% end %>
|
@@ -18,6 +18,6 @@
|
|
18
18
|
<% end %>
|
19
19
|
|
20
20
|
<button class="btn btn-primary btn-sm" type="submit"><%= t('lit.common.update', :default=>"Update") %></button>
|
21
|
-
<button class="btn btn-default btn-sm"><%= t('lit.common.cancel', :default=>'Cancel') %></button>
|
21
|
+
<button class="btn btn-default btn-sm cancel" type="reset"><%= t('lit.common.cancel', :default=>'Cancel') %></button>
|
22
22
|
<% end %>
|
23
23
|
|
@@ -2,14 +2,14 @@
|
|
2
2
|
<table class="table table-condensed">
|
3
3
|
<tr>
|
4
4
|
<th><%= t('lit.common.previous_versions') %></th>
|
5
|
-
<th width="25%"><%= t('lit.common.
|
5
|
+
<th width="25%"><%= t('lit.common.changed_at') %></th>
|
6
6
|
</tr>
|
7
7
|
<% @versions.each do |v| %>
|
8
8
|
<tr>
|
9
9
|
<td>
|
10
10
|
<%= render :partial=>"/lit/localization_keys/localization_row", :locals=>{:localization=>v.translated_value} %>
|
11
11
|
</td>
|
12
|
-
<td><%= v.created_at %></td>
|
12
|
+
<td><%= I18n.l v.created_at, format: :long %></td>
|
13
13
|
</tr>
|
14
14
|
<% end %>
|
15
15
|
</table>
|
@@ -5,7 +5,7 @@
|
|
5
5
|
<th>Identifier</th>
|
6
6
|
<th>Last synchronization</th>
|
7
7
|
<th>Last change (remote)</th>
|
8
|
-
<th width="
|
8
|
+
<th width="95px"></th>
|
9
9
|
</tr>
|
10
10
|
|
11
11
|
<% @sources.each do |source| %>
|
@@ -14,6 +14,9 @@
|
|
14
14
|
<td><%= source.last_updated_at.to_s(:db) unless source.last_updated_at.nil? %></td>
|
15
15
|
<td><%= source.get_last_change %></td>
|
16
16
|
<td>
|
17
|
+
<%= link_to lit.source_incomming_localizations_path(source), :title=>t('lit.common.browse_incomming', :default=>"Browse incomming localizations") do %>
|
18
|
+
<%= draw_icon 'search' %>
|
19
|
+
<% end %>
|
17
20
|
<%= link_to lit.synchronize_source_path(source), :title=>t('lit.common.synchronize', :default=>"Synchronize") do %>
|
18
21
|
<%= draw_icon 'refresh' %>
|
19
22
|
<% end %>
|
@@ -2,39 +2,39 @@ require 'rails/generators'
|
|
2
2
|
module Lit
|
3
3
|
module Generators
|
4
4
|
class InstallGenerator < ::Rails::Generators::Base
|
5
|
-
class_option
|
6
|
-
class_option
|
7
|
-
class_option
|
5
|
+
class_option 'key-value-engine', type: :string
|
6
|
+
class_option 'authentication-function', type: :string
|
7
|
+
class_option 'no-migrate', type: :boolean
|
8
8
|
|
9
|
-
source_root File.expand_path(
|
9
|
+
source_root File.expand_path('../install/templates', __FILE__)
|
10
10
|
|
11
|
-
desc
|
11
|
+
desc 'Automates Lit installation'
|
12
12
|
|
13
13
|
def copy_migrations
|
14
|
-
puts
|
14
|
+
puts 'Copying Lit migrations...'
|
15
15
|
Dir.chdir(::Rails.root) do
|
16
16
|
`rake lit:install:migrations`
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
def set_authentication_function
|
21
|
-
@authentication_function = options[
|
21
|
+
@authentication_function = options['authentication-function'].presence ||
|
22
22
|
ask("What's the authentication function, ie. :authenticate_user! :").presence ||
|
23
23
|
nil
|
24
24
|
end
|
25
25
|
|
26
26
|
def set_key_value_engine
|
27
|
-
@key_value_engine = options[
|
27
|
+
@key_value_engine = options['key-value-engine'].presence ||
|
28
28
|
ask("What's the key value engine? ([hash] OR redis):").presence ||
|
29
29
|
:hash
|
30
30
|
end
|
31
31
|
|
32
32
|
def add_redis_dependency
|
33
33
|
if @key_value_engine == 'redis'
|
34
|
-
puts
|
34
|
+
puts 'Adding redis dependency'
|
35
35
|
gem 'redis'
|
36
36
|
Bundler.with_clean_env do
|
37
|
-
run
|
37
|
+
run 'bundle install'
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
@@ -45,17 +45,17 @@ module Lit
|
|
45
45
|
|
46
46
|
def add_lit_initializer
|
47
47
|
path = "#{::Rails.root}/config/initializers/lit.rb"
|
48
|
-
if File.
|
49
|
-
puts
|
48
|
+
if File.exist?(path)
|
49
|
+
puts 'Skipping config/initializers/lit.rb creation, file already exists!'
|
50
50
|
else
|
51
|
-
puts
|
52
|
-
template
|
51
|
+
puts 'Adding lit initializer (config/initializers/lit.rb)...'
|
52
|
+
template 'initializer.rb', path
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
56
|
def run_migrations
|
57
|
-
unless options[
|
58
|
-
puts
|
57
|
+
unless options['no-migrate']
|
58
|
+
puts 'Running rake db:migrate'
|
59
59
|
`rake db:migrate`
|
60
60
|
end
|
61
61
|
end
|
data/lib/lit.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'lit/engine'
|
2
2
|
require 'lit/loader'
|
3
3
|
|
4
4
|
module Lit
|
@@ -6,6 +6,7 @@ module Lit
|
|
6
6
|
mattr_accessor :key_value_engine
|
7
7
|
mattr_accessor :storage_options
|
8
8
|
mattr_accessor :humanize_key
|
9
|
+
mattr_accessor :ignored_keys
|
9
10
|
mattr_accessor :fallback
|
10
11
|
mattr_accessor :api_enabled
|
11
12
|
mattr_accessor :api_key
|
@@ -16,10 +17,16 @@ module Lit
|
|
16
17
|
attr_accessor :loader
|
17
18
|
end
|
18
19
|
def self.init
|
19
|
-
@@table_exists ||=
|
20
|
-
if
|
20
|
+
@@table_exists ||= check_if_table_exists
|
21
|
+
if loader.nil? && @@table_exists
|
21
22
|
self.loader ||= Loader.new
|
22
23
|
Lit.humanize_key = false if Lit.humanize_key.nil?
|
24
|
+
Lit.fallback = true if Lit.fallback.nil?
|
25
|
+
if Lit.ignored_keys.is_a?(String)
|
26
|
+
keys = Lit.ignored_keys.split(',').map(&:strip)
|
27
|
+
Lit.ignored_keys = keys
|
28
|
+
end
|
29
|
+
Lit.ignored_keys = [] unless Lit.ignored_keys.is_a?(Array)
|
23
30
|
# if loading all translations on start, migrations have to be already
|
24
31
|
# performed, fails on first deploy
|
25
32
|
# self.loader.cache.load_all_translations
|
@@ -29,11 +36,9 @@ module Lit
|
|
29
36
|
end
|
30
37
|
|
31
38
|
def self.check_if_table_exists
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
false
|
36
|
-
end
|
39
|
+
Lit::Locale.table_exists?
|
40
|
+
rescue
|
41
|
+
false
|
37
42
|
end
|
38
43
|
|
39
44
|
def self.get_key_value_engine
|
@@ -2,9 +2,14 @@ require 'redis'
|
|
2
2
|
module Lit
|
3
3
|
extend self
|
4
4
|
def redis
|
5
|
-
$redis = Redis.new(url:
|
5
|
+
$redis = Redis.new(url: determine_redis_provider) unless $redis
|
6
6
|
$redis
|
7
7
|
end
|
8
|
+
|
9
|
+
def determine_redis_provider
|
10
|
+
ENV[ENV['REDIS_PROVIDER'] || 'REDIS_URL']
|
11
|
+
end
|
12
|
+
|
8
13
|
class RedisStorage
|
9
14
|
def initialize
|
10
15
|
Lit.redis
|
@@ -21,16 +26,15 @@ module Lit
|
|
21
26
|
end
|
22
27
|
|
23
28
|
def []=(k, v)
|
24
|
-
|
25
29
|
delete(k)
|
26
30
|
if v.is_a?(Array)
|
27
|
-
Lit.redis.set(_prefixed_key_for_array(k),
|
31
|
+
Lit.redis.set(_prefixed_key_for_array(k), '1')
|
28
32
|
v.each do |ve|
|
29
33
|
Lit.redis.rpush(_prefixed_key(k), ve.to_s)
|
30
34
|
end
|
31
35
|
elsif v.nil?
|
32
|
-
Lit.redis.set(_prefixed_key_for_nil(k),
|
33
|
-
Lit.redis.set(_prefixed_key(k),
|
36
|
+
Lit.redis.set(_prefixed_key_for_nil(k), '1')
|
37
|
+
Lit.redis.set(_prefixed_key(k), '')
|
34
38
|
else
|
35
39
|
Lit.redis.set(_prefixed_key(k), v)
|
36
40
|
end
|
@@ -43,11 +47,11 @@ module Lit
|
|
43
47
|
end
|
44
48
|
|
45
49
|
def clear
|
46
|
-
Lit.redis.del(
|
50
|
+
Lit.redis.del(keys) if keys.length > 0
|
47
51
|
end
|
48
52
|
|
49
53
|
def keys
|
50
|
-
Lit.redis.keys(_prefixed_key+
|
54
|
+
Lit.redis.keys(_prefixed_key + '*')
|
51
55
|
end
|
52
56
|
|
53
57
|
def has_key?(key)
|
@@ -65,21 +69,25 @@ module Lit
|
|
65
69
|
end
|
66
70
|
|
67
71
|
private
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
prefix
|
74
|
-
end
|
75
|
-
def _prefixed_key(key="")
|
76
|
-
_prefix+key.to_s
|
77
|
-
end
|
78
|
-
def _prefixed_key_for_array(key="")
|
79
|
-
_prefix+"array_flags:"+key.to_s
|
80
|
-
end
|
81
|
-
def _prefixed_key_for_nil(key="")
|
82
|
-
_prefix+"nil_flags:"+key.to_s
|
72
|
+
|
73
|
+
def _prefix
|
74
|
+
prefix = 'lit:'
|
75
|
+
if Lit.storage_options.is_a?(Hash)
|
76
|
+
prefix += "#{Lit.storage_options[:prefix]}:" if Lit.storage_options.key?(:prefix)
|
83
77
|
end
|
78
|
+
prefix
|
79
|
+
end
|
80
|
+
|
81
|
+
def _prefixed_key(key = '')
|
82
|
+
_prefix + key.to_s
|
83
|
+
end
|
84
|
+
|
85
|
+
def _prefixed_key_for_array(key = '')
|
86
|
+
_prefix + 'array_flags:' + key.to_s
|
87
|
+
end
|
88
|
+
|
89
|
+
def _prefixed_key_for_nil(key = '')
|
90
|
+
_prefix + 'nil_flags:' + key.to_s
|
91
|
+
end
|
84
92
|
end
|
85
93
|
end
|
data/lib/lit/cache.rb
CHANGED
@@ -18,16 +18,14 @@ end
|
|
18
18
|
|
19
19
|
module Lit
|
20
20
|
class Cache
|
21
|
-
|
22
21
|
def initialize
|
23
|
-
@localizations = Lit.get_key_value_engine
|
24
22
|
@hits_counter = Lit.get_key_value_engine
|
25
23
|
@hits_counter_working = true
|
26
24
|
end
|
27
25
|
|
28
26
|
def [](key)
|
29
27
|
update_hits_count(key)
|
30
|
-
ret =
|
28
|
+
ret = localizations[key]
|
31
29
|
ret
|
32
30
|
end
|
33
31
|
|
@@ -40,28 +38,28 @@ module Lit
|
|
40
38
|
end
|
41
39
|
|
42
40
|
def has_key?(key)
|
43
|
-
|
41
|
+
localizations.has_key?(key)
|
44
42
|
end
|
45
43
|
|
46
44
|
def sync
|
47
|
-
|
45
|
+
localizations.clear
|
48
46
|
end
|
49
47
|
|
50
48
|
def keys
|
51
|
-
|
49
|
+
localizations.keys
|
52
50
|
end
|
53
51
|
|
54
|
-
def update_locale(key, value, force_array=false)
|
52
|
+
def update_locale(key, value, force_array = false)
|
55
53
|
key = key.to_s
|
56
54
|
locale_key, key_without_locale = split_key(key)
|
57
55
|
locale = find_locale(locale_key)
|
58
56
|
localization = find_localization(locale, key_without_locale, value, force_array, true)
|
59
|
-
|
57
|
+
localizations[key] = localization.get_value if localization
|
60
58
|
end
|
61
59
|
|
62
60
|
def update_cache(key, value)
|
63
61
|
key = key.to_s
|
64
|
-
|
62
|
+
localizations[key] = value
|
65
63
|
end
|
66
64
|
|
67
65
|
def delete_locale(key)
|
@@ -74,11 +72,11 @@ module Lit
|
|
74
72
|
def load_all_translations
|
75
73
|
first = Localization.order('id ASC').first
|
76
74
|
last = Localization.order('id DESC').first
|
77
|
-
if
|
78
|
-
|
75
|
+
if !first || !last || (!localizations.has_key?(first.full_key) ||
|
76
|
+
!localizations.has_key?(last.full_key))
|
79
77
|
|
80
78
|
Localization.includes([:locale, :localization_key]).find_each do |l|
|
81
|
-
|
79
|
+
localizations[l.full_key] = l.get_value
|
82
80
|
end
|
83
81
|
end
|
84
82
|
end
|
@@ -88,23 +86,21 @@ module Lit
|
|
88
86
|
locale_key, key_without_locale = split_key(key)
|
89
87
|
locale = find_locale(locale_key)
|
90
88
|
localization = find_localization(locale, key_without_locale)
|
91
|
-
|
89
|
+
localizations[key] = localization.get_value if localization
|
92
90
|
end
|
93
91
|
|
94
92
|
def delete_key(key)
|
95
93
|
key = key.to_s
|
96
|
-
|
94
|
+
localizations.delete(key)
|
97
95
|
key_without_locale = split_key(key).last
|
98
|
-
|
96
|
+
localization_keys.delete(key_without_locale)
|
99
97
|
I18n.backend.reload!
|
100
98
|
end
|
101
99
|
|
102
100
|
def reset
|
103
101
|
@locale_cache = {}
|
104
|
-
|
105
|
-
|
106
|
-
@localization_keys = Lit.get_key_value_engine
|
107
|
-
@localization_keys.clear
|
102
|
+
localizations.clear
|
103
|
+
localization_keys.clear
|
108
104
|
load_all_translations
|
109
105
|
end
|
110
106
|
|
@@ -114,13 +110,12 @@ module Lit
|
|
114
110
|
locale_key = locale_key.to_s
|
115
111
|
@locale_cache ||= {}
|
116
112
|
unless @locale_cache.has_key?(locale_key)
|
117
|
-
locale = Lit::Locale.where(:
|
113
|
+
locale = Lit::Locale.where(locale: locale_key).first_or_create!
|
118
114
|
@locale_cache[locale_key] = locale
|
119
115
|
end
|
120
116
|
@locale_cache[locale_key]
|
121
117
|
end
|
122
118
|
|
123
|
-
|
124
119
|
# this comes directly from copycopter.
|
125
120
|
def export
|
126
121
|
reset
|
@@ -140,27 +135,27 @@ module Lit
|
|
140
135
|
|
141
136
|
def nested_string_keys_to_hash(db_localizations)
|
142
137
|
# http://subtech.g.hatena.ne.jp/cho45/20061122
|
143
|
-
deep_proc =
|
144
|
-
if s.
|
138
|
+
deep_proc = proc do |_k, s, o|
|
139
|
+
if s.is_a?(Hash) && o.is_a?(Hash)
|
145
140
|
next s.merge(o, &deep_proc)
|
146
141
|
end
|
147
142
|
next o
|
148
|
-
|
143
|
+
end
|
149
144
|
keys = {}
|
150
|
-
db_localizations.sort.each do |k,v|
|
145
|
+
db_localizations.sort.each do |k, v|
|
151
146
|
key_parts = k.to_s.split('.')
|
152
|
-
converted = key_parts.reverse.
|
147
|
+
converted = key_parts.reverse.reduce(v) { |a, n| { n => a } }
|
153
148
|
keys.merge!(converted, &deep_proc)
|
154
149
|
end
|
155
150
|
keys
|
156
151
|
end
|
157
152
|
|
158
153
|
def get_global_hits_counter(key)
|
159
|
-
@hits_counter['global_hits_counter.'+key]
|
154
|
+
@hits_counter['global_hits_counter.' + key]
|
160
155
|
end
|
161
156
|
|
162
157
|
def get_hits_counter(key)
|
163
|
-
@hits_counter['hits_counter.'+key]
|
158
|
+
@hits_counter['hits_counter.' + key]
|
164
159
|
end
|
165
160
|
|
166
161
|
def stop_hits_counter
|
@@ -173,122 +168,130 @@ module Lit
|
|
173
168
|
|
174
169
|
private
|
175
170
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
171
|
+
def localizations
|
172
|
+
@localizations ||= Lit.get_key_value_engine
|
173
|
+
end
|
174
|
+
|
175
|
+
def localization_keys
|
176
|
+
@localization_keys ||= Lit.get_key_value_engine
|
177
|
+
end
|
178
|
+
|
179
|
+
def find_localization(locale, key_without_locale, value = nil, force_array = false, update_value = false)
|
180
|
+
unless value.is_a?(Hash)
|
181
|
+
localization_key = find_localization_key(key_without_locale)
|
182
|
+
localization = Lit::Localization.where(locale_id: locale.id).
|
183
|
+
where(localization_key_id: localization_key.id).first_or_initialize
|
184
|
+
if update_value || localization.new_record?
|
185
|
+
if value.is_a?(Array)
|
186
|
+
unless force_array
|
187
|
+
new_value = nil
|
188
|
+
value_clone = value.dup
|
189
|
+
while (v = value_clone.shift) && v.present?
|
190
|
+
pv = parse_value(v, locale)
|
191
|
+
new_value = pv unless pv.nil?
|
191
192
|
end
|
192
|
-
|
193
|
-
value = parse_value(value, locale) unless value.nil?
|
193
|
+
value = new_value
|
194
194
|
end
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
195
|
+
else
|
196
|
+
value = parse_value(value, locale) unless value.nil?
|
197
|
+
end
|
198
|
+
if value.nil?
|
199
|
+
if Lit.fallback
|
200
|
+
@locale_cache.keys.each do |lc|
|
201
|
+
if lc != locale.locale
|
202
|
+
nk = "#{lc}.#{key_without_locale}"
|
203
|
+
v = localizations[nk]
|
204
|
+
value = v if v.present? && value.nil?
|
203
205
|
end
|
204
206
|
end
|
205
|
-
if value.nil? && Lit.humanize_key
|
206
|
-
value = key_without_locale.split('.').last.humanize
|
207
|
-
end
|
208
207
|
end
|
209
|
-
|
208
|
+
if value.nil? && Lit.humanize_key
|
209
|
+
value = key_without_locale.split('.').last.humanize
|
210
|
+
end
|
210
211
|
end
|
211
|
-
|
212
|
-
else
|
213
|
-
nil
|
212
|
+
localization.update_default_value(value)
|
214
213
|
end
|
214
|
+
return localization
|
215
|
+
else
|
216
|
+
nil
|
215
217
|
end
|
218
|
+
end
|
216
219
|
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
220
|
+
def find_localization_for_delete(locale, key_without_locale)
|
221
|
+
localization_key = find_localization_key_for_delete(key_without_locale)
|
222
|
+
return nil unless localization_key
|
223
|
+
Lit::Localization.where(locale_id: locale.id).
|
224
|
+
where(localization_key_id: localization_key.id).first
|
225
|
+
end
|
223
226
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
|
-
## checks parameter type and returns value basing on it
|
234
|
-
## symbols are beeing looked up in db
|
235
|
-
## string are returned directly
|
236
|
-
## procs are beeing called (once)
|
237
|
-
## hashes are converted do string (for now)
|
238
|
-
def parse_value(v, locale)
|
239
|
-
new_value = nil
|
240
|
-
case v
|
241
|
-
when Symbol then
|
242
|
-
lk = Lit::LocalizationKey.where(:localization_key=>v.to_s).first
|
243
|
-
if lk
|
244
|
-
loca = Lit::Localization.where(:locale_id=>locale.id).
|
245
|
-
where(:localization_key_id=>lk.id).first
|
246
|
-
new_value = loca.get_value if loca and loca.get_value.present?
|
247
|
-
end
|
248
|
-
when String then
|
249
|
-
new_value = v
|
250
|
-
when Hash then
|
251
|
-
new_value = nil
|
252
|
-
when Proc then
|
253
|
-
new_value = nil # was v.call - requires more love
|
254
|
-
else
|
255
|
-
new_value = v.to_s
|
256
|
-
end
|
257
|
-
new_value
|
227
|
+
def delete_localization(locale, key_without_locale)
|
228
|
+
localization = find_localization_for_delete(locale, key_without_locale)
|
229
|
+
if localization
|
230
|
+
localizations.delete("#{locale.locale}.#{key_without_locale}")
|
231
|
+
localization_keys.delete(key_without_locale)
|
232
|
+
localization.destroy # or localization.default_value = nil; localization.save!
|
258
233
|
end
|
234
|
+
end
|
259
235
|
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
236
|
+
## checks parameter type and returns value basing on it
|
237
|
+
## symbols are beeing looked up in db
|
238
|
+
## string are returned directly
|
239
|
+
## procs are beeing called (once)
|
240
|
+
## hashes are converted do string (for now)
|
241
|
+
def parse_value(v, locale)
|
242
|
+
new_value = nil
|
243
|
+
case v
|
244
|
+
when Symbol then
|
245
|
+
lk = Lit::LocalizationKey.where(localization_key: v.to_s).first
|
246
|
+
if lk
|
247
|
+
loca = Lit::Localization.where(locale_id: locale.id).
|
248
|
+
where(localization_key_id: lk.id).first
|
249
|
+
new_value = loca.get_value if loca && loca.get_value.present?
|
250
|
+
end
|
251
|
+
when String then
|
252
|
+
new_value = v
|
253
|
+
when Hash then
|
254
|
+
new_value = nil
|
255
|
+
when Proc then
|
256
|
+
new_value = nil # was v.call - requires more love
|
264
257
|
else
|
265
|
-
|
266
|
-
end
|
258
|
+
new_value = v.to_s
|
267
259
|
end
|
260
|
+
new_value
|
261
|
+
end
|
268
262
|
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
263
|
+
def find_localization_key(key_without_locale)
|
264
|
+
unless localization_keys.has_key?(key_without_locale)
|
265
|
+
find_or_create_localization_key(key_without_locale)
|
266
|
+
else
|
267
|
+
Lit::LocalizationKey.find_by_id(localization_keys[key_without_locale]) || find_or_create_localization_key(key_without_locale)
|
273
268
|
end
|
269
|
+
end
|
274
270
|
|
275
|
-
|
276
|
-
|
277
|
-
|
271
|
+
def find_localization_key_for_delete(key_without_locale)
|
272
|
+
lk = Lit::LocalizationKey.find_by_id(localization_keys[key_without_locale]) if localization_keys.has_key?(key_without_locale)
|
273
|
+
lk || Lit::LocalizationKey.where(localization_key: key_without_locale).first
|
274
|
+
end
|
278
275
|
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
localization_key
|
283
|
-
end
|
276
|
+
def split_key(key)
|
277
|
+
Lit::Cache.split_key(key)
|
278
|
+
end
|
284
279
|
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
end
|
291
|
-
end
|
280
|
+
def find_or_create_localization_key(key_without_locale)
|
281
|
+
localization_key = Lit::LocalizationKey.where(localization_key: key_without_locale).first_or_create!
|
282
|
+
localization_keys[key_without_locale] = localization_key.id
|
283
|
+
localization_key
|
284
|
+
end
|
292
285
|
|
286
|
+
def update_hits_count(key)
|
287
|
+
if @hits_counter_working
|
288
|
+
key_without_locale = split_key(key).last
|
289
|
+
@hits_counter.incr('hits_counter.' + key)
|
290
|
+
@hits_counter.incr('global_hits_counter.' + key_without_locale)
|
291
|
+
end
|
292
|
+
end
|
293
|
+
def self.split_key(key)
|
294
|
+
key.split('.', 2)
|
295
|
+
end
|
293
296
|
end
|
294
297
|
end
|