lit 0.2.6 → 0.3.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 +5 -13
- data/README.md +93 -12
- data/Rakefile +1 -0
- data/app/assets/javascripts/lit/application.js +1 -2
- data/app/assets/javascripts/lit/{bootstrap.js.coffee → backend/bootstrap.js.coffee} +0 -0
- data/app/assets/javascripts/lit/{dashboard.js → backend/dashboard.js} +0 -0
- data/app/assets/javascripts/lit/{jquery-te-1.4.0.min.js → backend/jquery-te-1.4.0.min.js} +0 -0
- data/app/assets/javascripts/lit/{localizations.js.coffee → backend/localizations.js.coffee} +2 -0
- data/app/assets/javascripts/lit/backend/sources.js.coffee +24 -0
- data/app/assets/javascripts/lit/lit_frontend.js +103 -0
- data/app/assets/javascripts/lit/mousetrap.js +1044 -0
- data/app/assets/stylesheets/lit/application.css +7 -1
- data/app/assets/stylesheets/lit/{jquery-te-1.4.0.css.scss → backend/jquery-te-1.4.0.css.scss} +0 -0
- data/app/assets/stylesheets/lit/lit_frontend.css +86 -0
- data/app/controllers/lit/api/v1/base_controller.rb +1 -1
- data/app/controllers/lit/application_controller.rb +7 -3
- data/app/controllers/lit/concerns/request_info_store.rb +16 -0
- data/app/controllers/lit/concerns/request_keys_store.rb +16 -0
- data/app/controllers/lit/incomming_localizations_controller.rb +2 -2
- data/app/controllers/lit/locales_controller.rb +1 -1
- data/app/controllers/lit/localization_keys_controller.rb +22 -9
- data/app/controllers/lit/localizations_controller.rb +19 -6
- data/app/controllers/lit/sources_controller.rb +11 -1
- data/app/helpers/lit/frontend_helper.rb +71 -0
- data/app/helpers/lit/localization_keys_helper.rb +5 -0
- data/app/helpers/lit/sources_helper.rb +3 -0
- data/app/jobs/lit/synchronize_source_job.rb +11 -0
- data/app/models/lit/localization.rb +17 -10
- data/app/models/lit/localization_key.rb +6 -2
- data/app/models/lit/source.rb +4 -3
- data/app/views/layouts/lit/application.html.erb +6 -6
- data/app/views/lit/incomming_localizations/index.html.erb +22 -17
- data/app/views/lit/localization_keys/_localization_row.html.erb +1 -1
- data/app/views/lit/localization_keys/index.html.erb +27 -8
- data/app/views/lit/localizations/_form.html.erb +5 -5
- data/app/views/lit/localizations/_previous_versions_rows.html.erb +1 -1
- data/app/views/lit/localizations/edit.js.erb +2 -2
- data/app/views/lit/localizations/previous_versions.js.erb +1 -1
- data/app/views/lit/localizations/update.js.erb +2 -2
- data/config/routes.rb +12 -12
- data/db/migrate/20180101010101_lit_create_lit_locales.rb +16 -0
- data/db/migrate/20180101010102_lit_create_lit_localization_keys.rb +18 -0
- data/db/migrate/20180101010103_lit_create_lit_localizations.rb +24 -0
- data/db/migrate/20180101010104_lit_add_is_completed_and_is_starred_to_localization_keys.rb +17 -0
- data/db/migrate/20180101010105_lit_add_is_hidden_to_locales.rb +12 -0
- data/db/migrate/20180101010106_lit_create_lit_localization_versions.rb +20 -0
- data/db/migrate/20180101010107_lit_create_lit_sources.rb +19 -0
- data/db/migrate/20180101010108_lit_create_lit_incomming_localizations.rb +34 -0
- data/db/migrate/20180101010109_lit_add_sync_complete_to_lit_sources.rb +12 -0
- data/lib/generators/lit/install/templates/initializer.rb +17 -6
- data/lib/generators/lit/install_generator.rb +0 -7
- data/lib/lit.rb +15 -8
- data/lib/lit/adapters/hash_storage.rb +4 -0
- data/lib/lit/adapters/redis_storage.rb +9 -3
- data/lib/lit/cache.rb +126 -70
- data/lib/lit/engine.rb +20 -1
- data/lib/lit/i18n_backend.rb +66 -26
- data/lib/lit/version.rb +1 -1
- data/lib/tasks/lit_tasks.rake +21 -3
- metadata +67 -43
- data/app/assets/stylesheets/lit/dashboard.css +0 -4
- data/config/database.yml +0 -8
- data/db/migrate/20121103144612_create_lit_locales.rb +0 -9
- data/db/migrate/20121103174049_create_lit_localization_keys.rb +0 -10
- data/db/migrate/20121103182106_create_lit_localizations.rb +0 -15
- data/db/migrate/20121225112100_add_is_completed_and_is_starred_to_localization_keys.rb +0 -6
- data/db/migrate/20130511111904_add_is_hidden_to_locales.rb +0 -5
- data/db/migrate/20130921071304_create_lit_localization_versions.rb +0 -11
- data/db/migrate/20130923162141_create_lit_sources.rb +0 -12
- data/db/migrate/20130924151910_create_lit_incomming_localizations.rb +0 -21
@@ -8,7 +8,7 @@
|
|
8
8
|
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
9
9
|
* compiled file, but it's generally better to create a new file per style scope.
|
10
10
|
*
|
11
|
-
*= require './jquery-te-1.4.0.css'
|
11
|
+
*= require './backend/jquery-te-1.4.0.css'
|
12
12
|
*= require_self
|
13
13
|
*/
|
14
14
|
.detail_wrapper{
|
@@ -51,3 +51,9 @@ padding: 5px 7px;
|
|
51
51
|
.localization_row em{
|
52
52
|
color: #bbb;
|
53
53
|
}
|
54
|
+
.loading {
|
55
|
+
display: inline;
|
56
|
+
}
|
57
|
+
.loaded {
|
58
|
+
display: none;
|
59
|
+
}
|
data/app/assets/stylesheets/lit/{jquery-te-1.4.0.css.scss → backend/jquery-te-1.4.0.css.scss}
RENAMED
File without changes
|
@@ -0,0 +1,86 @@
|
|
1
|
+
.lit-key-generic {
|
2
|
+
}
|
3
|
+
.lit-key-highlight{
|
4
|
+
text-decoration: underline wavy red !important;
|
5
|
+
}
|
6
|
+
#lit_button_wrapper{
|
7
|
+
position: fixed;
|
8
|
+
bottom: 20px;
|
9
|
+
right: 20px;
|
10
|
+
z-index: 100;
|
11
|
+
background-color: red;
|
12
|
+
border-radius: 4px;
|
13
|
+
display: block;
|
14
|
+
padding: 5px;
|
15
|
+
cursor: pointer;
|
16
|
+
color: white;
|
17
|
+
}
|
18
|
+
#lit_button_wrapper.lit-highlight-enabled{
|
19
|
+
background-color: lightgreen;
|
20
|
+
}
|
21
|
+
#lit_textarea{
|
22
|
+
position: absolute;
|
23
|
+
padding: 0 0 1px 0;
|
24
|
+
margin: 0 0 0 0;
|
25
|
+
border: 0;
|
26
|
+
border-bottom: 1px solid red;
|
27
|
+
|
28
|
+
}
|
29
|
+
.lit-translations-info.collapsed {
|
30
|
+
position: fixed;
|
31
|
+
bottom: 60px;
|
32
|
+
right: 20px;
|
33
|
+
z-index: 100;
|
34
|
+
background-color: green;
|
35
|
+
border-radius: 4px;
|
36
|
+
display: block;
|
37
|
+
padding: 5px;
|
38
|
+
cursor: pointer;
|
39
|
+
color: white;
|
40
|
+
}
|
41
|
+
.lit-translations-info.expanded{
|
42
|
+
position: absolute;
|
43
|
+
display: block;
|
44
|
+
width: 80%;
|
45
|
+
overflow: auto;
|
46
|
+
height: 80%;
|
47
|
+
right: 10%;
|
48
|
+
left: 10%;
|
49
|
+
top: 10%;
|
50
|
+
background-color: rgba(240, 240, 240, 0.9);
|
51
|
+
border: 1px solid black;
|
52
|
+
z-index: 90;
|
53
|
+
}
|
54
|
+
|
55
|
+
.lit-translations-info.collapsed span.lit-open-button{
|
56
|
+
display: block;
|
57
|
+
}
|
58
|
+
.lit-translations-info.expanded span.lit-open-button{
|
59
|
+
display: none;
|
60
|
+
}
|
61
|
+
.lit-translations-info.collapsed span.lit-close-button{
|
62
|
+
display: none;
|
63
|
+
}
|
64
|
+
.lit-translations-info.expanded span.lit-close-button{
|
65
|
+
display: block;
|
66
|
+
position: fixed;
|
67
|
+
right: 10%;
|
68
|
+
border: 2px solid black;
|
69
|
+
font-size: 12pt;
|
70
|
+
font-weight: bold;
|
71
|
+
background-color: white;
|
72
|
+
padding: 10px 10px 5px;
|
73
|
+
}
|
74
|
+
.lit-translations-info.collapsed ul.lit-translations-list{
|
75
|
+
display: none;
|
76
|
+
}
|
77
|
+
.lit-translations-info.expanded ul.lit-translations-list{
|
78
|
+
}
|
79
|
+
|
80
|
+
.lit-translations-info.expanded ul.lit-translations-list li{
|
81
|
+
margin: 5px;
|
82
|
+
}
|
83
|
+
|
84
|
+
.lit-translations-info.expanded #lit_textarea{
|
85
|
+
padding: 2px;
|
86
|
+
}
|
@@ -1,8 +1,12 @@
|
|
1
1
|
module Lit
|
2
2
|
class ApplicationController < ActionController::Base
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
unless respond_to?(:before_action)
|
4
|
+
alias_method :before_action, :before_filter
|
5
|
+
alias_method :after_action, :after_filter
|
6
|
+
end
|
7
|
+
before_action :authenticate
|
8
|
+
before_action :stop_hits_counter
|
9
|
+
after_action :restore_hits_counter
|
6
10
|
|
7
11
|
private
|
8
12
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Lit
|
2
|
+
module Concerns
|
3
|
+
module RequestInfoStore
|
4
|
+
extend ::ActiveSupport::Concern
|
5
|
+
included do
|
6
|
+
before_action :store_request_path
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def store_request_path
|
12
|
+
Thread.current[:lit_current_request_path] = request&.path
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Lit
|
2
|
+
module Concerns
|
3
|
+
module RequestKeysStore
|
4
|
+
extend ::ActiveSupport::Concern
|
5
|
+
included do
|
6
|
+
before_action :init_request_keys
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def init_request_keys
|
12
|
+
Thread.current[:lit_request_keys] = {}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -2,10 +2,10 @@ require_dependency 'lit/application_controller'
|
|
2
2
|
|
3
3
|
module Lit
|
4
4
|
class IncommingLocalizationsController < ApplicationController
|
5
|
-
|
5
|
+
before_action :find_source
|
6
6
|
|
7
7
|
def index
|
8
|
-
@incomming_localizations = @source.incomming_localizations
|
8
|
+
@incomming_localizations = @source.incomming_localizations
|
9
9
|
end
|
10
10
|
|
11
11
|
def accept
|
@@ -1,15 +1,26 @@
|
|
1
1
|
module Lit
|
2
2
|
class LocalizationKeysController < ::Lit::ApplicationController
|
3
|
-
|
3
|
+
before_action :get_localization_scope, except: [:destroy, :find_localization]
|
4
4
|
|
5
5
|
def index
|
6
6
|
get_localization_keys
|
7
7
|
end
|
8
8
|
|
9
|
+
def find_localization
|
10
|
+
localization_key = Lit::LocalizationKey. \
|
11
|
+
find_by!(localization_key: params[:key])
|
12
|
+
locale = Lit::Locale.find_by!(locale: params[:locale])
|
13
|
+
localization = localization_key.localizations.find_by(locale_id: locale)
|
14
|
+
render json: {
|
15
|
+
path: localization_key_localization_path(localization_key, localization)
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
9
19
|
def starred
|
10
20
|
@scope = @scope.where(is_starred: true)
|
11
21
|
|
12
|
-
if defined?(Kaminari)
|
22
|
+
if defined?(Kaminari) && \
|
23
|
+
@scope.respond_to?(Kaminari.config.page_method_name)
|
13
24
|
@scope = @scope.send(Kaminari.config.page_method_name, params[:page])
|
14
25
|
end
|
15
26
|
get_localization_keys
|
@@ -18,7 +29,7 @@ module Lit
|
|
18
29
|
|
19
30
|
def star
|
20
31
|
@localization_key = LocalizationKey.find params[:id].to_i
|
21
|
-
@localization_key.is_starred =
|
32
|
+
@localization_key.is_starred = !@localization_key.is_starred?
|
22
33
|
@localization_key.save
|
23
34
|
respond_to :js
|
24
35
|
end
|
@@ -35,14 +46,18 @@ module Lit
|
|
35
46
|
private
|
36
47
|
|
37
48
|
def get_localization_scope
|
38
|
-
@search_options = params.
|
49
|
+
@search_options = if params.respond_to?(:permit)
|
50
|
+
params.permit(*valid_keys)
|
51
|
+
else
|
52
|
+
params.slice(*valid_keys)
|
53
|
+
end
|
39
54
|
@search_options[:include_completed] = '1' if @search_options.empty?
|
40
|
-
@scope = LocalizationKey.
|
55
|
+
@scope = LocalizationKey.distinct.preload(localizations: :locale).search(@search_options)
|
41
56
|
end
|
42
57
|
|
43
58
|
def get_localization_keys
|
44
59
|
key_parts = @search_options[:key_prefix].to_s.split('.').length
|
45
|
-
@prefixes = @scope.reorder(nil).
|
60
|
+
@prefixes = @scope.reorder(nil).distinct.pluck(:localization_key).map { |lk| lk.split('.').shift(key_parts + 1).join('.') }.uniq.sort
|
46
61
|
if @search_options[:key_prefix].present?
|
47
62
|
parts = @search_options[:key_prefix].split('.')
|
48
63
|
@parent_prefix = parts[0, parts.length - 1].join('.')
|
@@ -50,7 +65,7 @@ module Lit
|
|
50
65
|
if defined?(Kaminari) and @scope.respond_to?(Kaminari.config.page_method_name)
|
51
66
|
@localization_keys = @scope.send(Kaminari.config.page_method_name, params[:page])
|
52
67
|
else
|
53
|
-
@localization_keys = @scope
|
68
|
+
@localization_keys = @scope
|
54
69
|
end
|
55
70
|
end
|
56
71
|
|
@@ -88,7 +103,6 @@ module Lit
|
|
88
103
|
ret
|
89
104
|
end
|
90
105
|
end
|
91
|
-
|
92
106
|
helper_method :localization_for
|
93
107
|
|
94
108
|
def has_versions?(localization)
|
@@ -98,7 +112,6 @@ module Lit
|
|
98
112
|
end
|
99
113
|
@_versions[localization.id].to_i > 0
|
100
114
|
end
|
101
|
-
|
102
115
|
helper_method :has_versions?
|
103
116
|
end
|
104
117
|
end
|
@@ -1,19 +1,31 @@
|
|
1
1
|
module Lit
|
2
2
|
class LocalizationsController < ::Lit::ApplicationController
|
3
|
-
|
4
|
-
|
3
|
+
before_action :find_localization_key
|
4
|
+
before_action :find_localization
|
5
|
+
|
6
|
+
def show
|
7
|
+
render json: { value: @localization.get_value }
|
8
|
+
end
|
5
9
|
|
6
10
|
def edit
|
7
11
|
@localization.translated_value = @localization.get_value
|
8
|
-
respond_to
|
12
|
+
respond_to do |format|
|
13
|
+
format.js
|
14
|
+
end
|
9
15
|
end
|
10
16
|
|
11
17
|
def update
|
12
18
|
if @localization.update_attributes(clear_params)
|
19
|
+
@localization.update_column :is_changed, true
|
13
20
|
Lit.init.cache.update_cache @localization.full_key, @localization.get_value
|
14
21
|
end
|
15
22
|
@localization.reload
|
16
|
-
respond_to
|
23
|
+
respond_to do |f|
|
24
|
+
f.js
|
25
|
+
f.json do
|
26
|
+
render json: { value: @localization.get_value }
|
27
|
+
end
|
28
|
+
end
|
17
29
|
end
|
18
30
|
|
19
31
|
def previous_versions
|
@@ -24,7 +36,8 @@ module Lit
|
|
24
36
|
private
|
25
37
|
|
26
38
|
def find_localization_key
|
27
|
-
@localization_key = Lit::LocalizationKey.
|
39
|
+
@localization_key = Lit::LocalizationKey. \
|
40
|
+
find(params[:localization_key_id])
|
28
41
|
end
|
29
42
|
|
30
43
|
def find_localization
|
@@ -32,7 +45,7 @@ module Lit
|
|
32
45
|
end
|
33
46
|
|
34
47
|
def clear_params
|
35
|
-
if
|
48
|
+
if params.respond_to?(:permit)
|
36
49
|
# allow translated_value to be an array
|
37
50
|
if @localization.value.is_a?(Array)
|
38
51
|
params.require(:localization).permit(:locale_id, translated_value: [])
|
@@ -20,7 +20,12 @@ module Lit
|
|
20
20
|
|
21
21
|
def synchronize
|
22
22
|
@source = Source.find(params[:id])
|
23
|
-
@source.
|
23
|
+
@source.update_column(:sync_complete, false)
|
24
|
+
if defined?(ActiveJob)
|
25
|
+
SynchronizeSourceJob.perform_later(@source)
|
26
|
+
else
|
27
|
+
@source.synchronize
|
28
|
+
end
|
24
29
|
redirect_to lit.source_incomming_localizations_path(@source)
|
25
30
|
end
|
26
31
|
|
@@ -54,6 +59,11 @@ module Lit
|
|
54
59
|
redirect_to sources_url
|
55
60
|
end
|
56
61
|
|
62
|
+
def sync_complete
|
63
|
+
@source = Source.find(params[:id])
|
64
|
+
render json: { sync_complete: @source.sync_complete }
|
65
|
+
end
|
66
|
+
|
57
67
|
private
|
58
68
|
|
59
69
|
def clear_params
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Lit
|
2
|
+
module FrontendHelper
|
3
|
+
include ActionView::Helpers::TranslationHelper
|
4
|
+
module TranslationKeyWrapper
|
5
|
+
def translate(key, options = {})
|
6
|
+
options = options.with_indifferent_access
|
7
|
+
key = scope_key_by_partial(key)
|
8
|
+
ret = super(key, options)
|
9
|
+
if !options[:skip_lit] && lit_authorized?
|
10
|
+
ret = get_translateable_span(key, ret)
|
11
|
+
end
|
12
|
+
ret
|
13
|
+
end
|
14
|
+
|
15
|
+
def t(key, options = {})
|
16
|
+
translate(key, options)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
prepend Lit::FrontendHelper::TranslationKeyWrapper
|
20
|
+
|
21
|
+
def javascript_lit_tag
|
22
|
+
javascript_include_tag 'lit/lit_frontend'
|
23
|
+
end
|
24
|
+
|
25
|
+
def stylesheet_lit_tag
|
26
|
+
stylesheet_link_tag 'lit/lit_frontend'
|
27
|
+
end
|
28
|
+
|
29
|
+
def lit_frontend_assets
|
30
|
+
return unless lit_authorized?
|
31
|
+
meta = content_tag :meta,
|
32
|
+
'',
|
33
|
+
value: lit.find_localization_localization_keys_path,
|
34
|
+
name: 'lit-url-base'
|
35
|
+
safe_join([javascript_lit_tag, stylesheet_lit_tag, meta])
|
36
|
+
end
|
37
|
+
|
38
|
+
def lit_translations_info
|
39
|
+
return if Thread.current[:lit_request_keys].nil?
|
40
|
+
return unless lit_authorized?
|
41
|
+
content_tag :div, class: 'lit-translations-info collapsed' do
|
42
|
+
concat content_tag :span, 'Show translations', class: 'lit-open-button'
|
43
|
+
concat content_tag :span, 'X', class: 'lit-close-button'
|
44
|
+
concat(content_tag(:ul, class: 'lit-translations-list') do
|
45
|
+
Lit.init.cache.request_keys.each do |k, v|
|
46
|
+
concat(content_tag(:li) do
|
47
|
+
concat content_tag :code, "#{k}:"
|
48
|
+
concat get_translateable_span(k, v, alternative_text: '[empty]')
|
49
|
+
end)
|
50
|
+
end
|
51
|
+
end)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def lit_authorized?
|
56
|
+
if Lit.authentication_verification.present?
|
57
|
+
send(Lit.authentication_verification)
|
58
|
+
else
|
59
|
+
true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_translateable_span(key, localization, alternative_text: nil)
|
64
|
+
content_tag :span,
|
65
|
+
class: 'lit-key-generic',
|
66
|
+
data: { key: key, locale: I18n.locale } do
|
67
|
+
localization.blank? ? alternative_text : localization
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|