lit 0.3.3 → 0.4.0.pre.alpha
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 +4 -4
- data/README.md +40 -6
- data/app/assets/javascripts/lit/lit_frontend.js +20 -12
- data/app/assets/stylesheets/lit/application.css +3 -0
- data/app/controllers/lit/api/v1/base_controller.rb +1 -1
- data/app/controllers/lit/api/v1/locales_controller.rb +1 -1
- data/app/controllers/lit/api/v1/localization_keys_controller.rb +12 -4
- data/app/controllers/lit/api/v1/localizations_controller.rb +25 -9
- data/app/controllers/lit/application_controller.rb +11 -8
- data/app/controllers/lit/concerns/request_info_store.rb +1 -0
- data/app/controllers/lit/incomming_localizations_controller.rb +22 -15
- data/app/controllers/lit/locales_controller.rb +1 -1
- data/app/controllers/lit/localization_keys_controller.rb +44 -18
- data/app/controllers/lit/localizations_controller.rb +16 -11
- data/app/controllers/lit/sources_controller.rb +9 -13
- data/app/helpers/lit/frontend_helper.rb +28 -16
- data/app/helpers/lit/localizations_helper.rb +2 -1
- data/app/jobs/lit/synchronize_source_job.rb +1 -1
- data/app/models/lit/incomming_localization.rb +71 -41
- data/app/models/lit/locale.rb +11 -13
- data/app/models/lit/localization.rb +26 -24
- data/app/models/lit/localization_key.rb +46 -55
- data/app/models/lit/source.rb +17 -74
- data/app/queries/localization_key_search_query.rb +80 -0
- data/app/services/remote_interactor_service.rb +45 -0
- data/app/services/synchronize_source_service.rb +63 -0
- data/app/views/kaminari/lit/_gap.html.erb +1 -1
- data/app/views/layouts/lit/_navigation.html.erb +1 -1
- data/app/views/lit/dashboard/index.html.erb +2 -2
- data/app/views/lit/incomming_localizations/index.html.erb +10 -6
- data/app/views/lit/localization_keys/_localization_row.html.erb +1 -1
- data/app/views/lit/localization_keys/_localizations_list.html.erb +84 -0
- data/app/views/lit/localization_keys/_sidebar.html.erb +66 -0
- data/app/views/lit/localization_keys/change_completed.js.erb +2 -0
- data/app/views/lit/localization_keys/index.html.erb +3 -121
- data/app/views/lit/localization_keys/not_translated.html.erb +9 -0
- data/app/views/lit/localization_keys/restore_deleted.js.erb +1 -0
- data/app/views/lit/localization_keys/visited_again.html.erb +9 -0
- data/app/views/lit/localizations/_previous_versions_rows.html.erb +2 -2
- data/app/views/lit/localizations/change_completed.js.erb +2 -0
- data/app/views/lit/localizations/update.js.erb +2 -0
- data/app/views/lit/sources/_form.html.erb +1 -1
- data/app/views/lit/sources/index.html.erb +1 -1
- data/config/routes.rb +5 -0
- data/db/migrate/20181017123839_lit_add_is_deleted_to_localization_keys.rb +8 -0
- data/db/migrate/20181018075955_lit_add_localization_key_is_deleted_to_localization_keys.rb +8 -0
- data/db/migrate/20181030111522_lit_add_is_visited_again_to_localization_keys.rb +8 -0
- data/lib/generators/lit/install/templates/initializer.rb +5 -1
- data/lib/lit.rb +1 -0
- data/lib/lit/adapters/redis_storage.rb +1 -1
- data/lib/lit/cache.rb +32 -54
- data/lib/lit/export.rb +80 -0
- data/lib/lit/i18n_backend.rb +12 -9
- data/lib/lit/import.rb +179 -0
- data/lib/lit/loader.rb +2 -0
- data/lib/lit/version.rb +1 -1
- data/lib/tasks/lit_tasks.rake +78 -13
- metadata +21 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6bcba84c0fc5b731bbbbd07f38d7a263f1778869
|
4
|
+
data.tar.gz: 105fcbf83b9b7df7f19eee1a33dc60802ff0703e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9aeaae0bb50a36db06603cbe05323d12ac63ee6635acf76f8b70db0dbef5db694f063fabac4eb1416724c121b46d1cee1cc434ae988d59472e7528a8ec24f301
|
7
|
+
data.tar.gz: 277a1d97c1737886c8b5a0536336515f1bbc58dab0c0d4385b5f11dbd956136aafc0d1f040def8cf8ea0866bd5cfb5aaaff9eabc70b2b4e5d693777721ca6b86
|
data/README.md
CHANGED
@@ -16,7 +16,7 @@ Highly inspired by Copycopter by thoughtbot.
|
|
16
16
|
3. Versioning translations - you can always check, how value did look like in past
|
17
17
|
4. Possibility to synchronize translations between environments or apps
|
18
18
|
5. Easy to install - works as an engine, comes with simple generator
|
19
|
-
6. You can always export all translations to plain old YAML file
|
19
|
+
6. You can always export all translations to plain old YAML file which can then be imported elsewhere. Translations can also be exported to (and then imported from) a CSV file so that e.g. a third party can easily edit translations for you using any spreadsheet editor, without access to your website's Lit panel.
|
20
20
|
7. Has build in wysiwyg editor ([jQuery TE](http://jqueryte.com/))
|
21
21
|
8. Translating apps directly in frontend (see bellow)
|
22
22
|
9. (On request) stores paths where translation keys were called
|
@@ -50,26 +50,60 @@ gem 'lit'
|
|
50
50
|
You may want to take a look at generated initializer in `config/initializers/lit.rb` and change some default configuration options.
|
51
51
|
|
52
52
|
### So... again - what is it and how to use it?
|
53
|
-
*Lit* is Rails engine - it runs in it's own namespace, by default it's
|
53
|
+
*Lit* is Rails engine - it runs in it's own namespace, by default it's available under `/lit`. It provides UI for managing translations of your app.
|
54
54
|
|
55
|
-
Once you call `I18n.t()` function from your views, *Lit* is asked whether it has or not proper value for it. If translation is present in database and is available for *Lit*, it's served back. If it does not
|
55
|
+
Once you call `I18n.t()` function from your views, *Lit* is asked whether it has or not proper value for it. If translation is present in database and is available for *Lit*, it's served back. If it does not exist, record is automatically created in database with initial value provided in `default` option key. If `default` key is not present, value `nil` is saved to database. When app is starting, *Lit* will preload all keys from your local `config/locale/*.yml` files - this is why app startup may take a while.
|
56
56
|
|
57
57
|
To optimize translation key lookup, *Lit* can use different cache engines. For production with many workers `redis` is suggested, for local development `hash` will be fine (`hash` is stored in memory, so if you have many workers and will update translation value in backend, only one worker will have proper translation in it's cache - db will be updated anyway).
|
58
58
|
|
59
59
|
Keys ending with `_html` have auto wysiwyg support.
|
60
60
|
|
61
|
-
|
61
|
+
### Import and export
|
62
62
|
|
63
|
+
#### Export
|
64
|
+
|
65
|
+
Translations can be exported using the `lit:export` rake task:
|
63
66
|
```bash
|
64
67
|
$ rake lit:export
|
65
68
|
```
|
66
69
|
|
67
|
-
|
70
|
+
The task exports to YAML format by default, which can be overridden by setting the `FORMAT` environment variable to `csv`.
|
71
|
+
As well as this, by default, it exports all of your application's locales; using the `LOCALES` environment variable you can limit it to specific locales.
|
72
|
+
Using `OUTPUT` environment variable you can specify the output file (defaults to `config/locales/lit.yml` or `.csv`).
|
73
|
+
|
74
|
+
For example:
|
75
|
+
```bash
|
76
|
+
$ rake lit:export FORMAT=csv LOCALES=en,pl OUTPUT=export.csv
|
77
|
+
```
|
78
|
+
...will only export the `en` and `pl` locales, producing CSV output to `export.csv` in the current folder.
|
79
|
+
|
80
|
+
Using the task `lit:export_splitted` does the same as `lit:export` but splits the locales by their name (`config/locales/en.yml`, etc).
|
81
|
+
|
82
|
+
#### Import
|
83
|
+
|
84
|
+
Translation import is handled using the `lit:import` task, where imported file name should be specified in the `FILE` envionment variable:
|
85
|
+
```bash
|
86
|
+
$ rake lit:import FILE=stuff.csv
|
87
|
+
```
|
88
|
+
|
89
|
+
Optionally, `LOCALES` and `SKIP_NIL` environment variables can be used to select specific locales to import from a multi-locale CSV file and to prevent nil values from being set as translated values for localizations, respectively.
|
90
|
+
The following call:
|
91
|
+
```bash
|
92
|
+
$ rake lit:import FILE=stuff.csv LOCALES=en,pl SKIP_NIL=1
|
93
|
+
```
|
94
|
+
...will only load `en` and `pl` locales from the file, skipping nil values.
|
68
95
|
|
96
|
+
Additionally, there is the `lit:warm_up_keys` task (temporarily aliased as `lit:raw_import` for compatibility) which serves a different purpose: rather than for actual import of translations, it is intended to pre-load into database translations from a specific locale's YAML file **when the application is first deployed to a server and not all translation keys are present in the database yet**. This task also takes the `SKIP_NIL` option in a similar way as the import task.
|
69
97
|
```bash
|
70
|
-
$
|
98
|
+
$ rake lit:warm_up_keys FILES=config/locales/en.yml LOCALES=en
|
71
99
|
```
|
100
|
+
In this case, when the `config/locales/en.yml` contains a translation for `foo` which doesn't have a key in the DB yet, it will be created, but if it already exists in the DB with a translation, it won't be overridden.
|
101
|
+
|
102
|
+
#### Deleted keys
|
103
|
+
|
104
|
+
Keys marked as deleted (i.e. still existing but deleted from the Lit UI) are *not* exported. In order to make these keys exported again, you need to restore them from the "Deleted and visited again" view.
|
72
105
|
|
106
|
+
Deleted keys whose translations are encountered during import are restored automatically.
|
73
107
|
|
74
108
|
### 0.2 -> 0.3 upgrade guide
|
75
109
|
|
@@ -7,15 +7,22 @@
|
|
7
7
|
replaceWithForm, submitForm, removeLitForm;
|
8
8
|
|
9
9
|
buildLocalizationForm = function(e){
|
10
|
+
e.stopPropagation();
|
11
|
+
|
10
12
|
var $this = $(this);
|
13
|
+
|
14
|
+
if($this.is(':focus'))
|
15
|
+
return false;
|
16
|
+
|
11
17
|
var meta = $('meta[name="lit-url-base"]');
|
12
|
-
|
18
|
+
|
19
|
+
if(meta.length > 0)
|
13
20
|
getLocalizationPath($this, meta);
|
14
|
-
|
15
|
-
|
16
|
-
|
21
|
+
else
|
22
|
+
console.error('cannot find lit base url');
|
23
|
+
|
17
24
|
return false;
|
18
|
-
}
|
25
|
+
};
|
19
26
|
|
20
27
|
getLocalizationPath = function(elem, metaElem) {
|
21
28
|
$.getJSON(metaElem.attr('value'),
|
@@ -38,8 +45,9 @@
|
|
38
45
|
replaceWithForm = function(elem, value, update_path){
|
39
46
|
removeLitForm();
|
40
47
|
var $this = $(elem);
|
41
|
-
$this.attr('
|
42
|
-
|
48
|
+
$this.attr('contenteditable', true);
|
49
|
+
if(value)
|
50
|
+
$this.html(value);
|
43
51
|
$this.focus();
|
44
52
|
$this.on('blur', function(){
|
45
53
|
submitForm($this, $this.html(), update_path);
|
@@ -59,15 +67,15 @@
|
|
59
67
|
console.log('saved ' + elem.data('key'));
|
60
68
|
},
|
61
69
|
error: function(){
|
62
|
-
console.
|
63
|
-
alert('
|
70
|
+
console.error('cannot save ' + elem.data('key'));
|
71
|
+
alert('cannot save ' + elem.data('key'));
|
64
72
|
}
|
65
73
|
});
|
66
74
|
};
|
67
75
|
|
68
76
|
removeLitForm = function(){
|
69
77
|
$('#litForm').remove();
|
70
|
-
}
|
78
|
+
};
|
71
79
|
|
72
80
|
$(document).ready(function(){
|
73
81
|
$('<div id="lit_button_wrapper" />').appendTo('body');
|
@@ -75,14 +83,14 @@
|
|
75
83
|
$btn.on('click', function(){
|
76
84
|
removeLitForm();
|
77
85
|
if($btn.hasClass('lit-highlight-enabled')){
|
78
|
-
$('.lit-key-generic').removeClass('lit-key-highlight').off('click.
|
86
|
+
$('.lit-key-generic').removeClass('lit-key-highlight').off('click.lit');
|
79
87
|
$btn.removeClass('lit-highlight-enabled');
|
80
88
|
$('.lit-key-generic').each(function(_, elem){
|
81
89
|
$elem = $(elem);
|
82
90
|
$elem.attr('title', $elem.data('old-title') || '');
|
83
91
|
});
|
84
92
|
}else{
|
85
|
-
$('.lit-key-generic').addClass('lit-key-highlight').on('click.
|
93
|
+
$('.lit-key-generic').addClass('lit-key-highlight').on('click.lit', buildLocalizationForm);
|
86
94
|
$btn.addClass('lit-highlight-enabled');
|
87
95
|
$('.lit-key-generic').each(function(_, elem){
|
88
96
|
$elem = $(elem);
|
@@ -3,13 +3,21 @@ require_dependency 'lit/api/v1/base_controller'
|
|
3
3
|
module Lit
|
4
4
|
class Api::V1::LocalizationKeysController < Api::V1::BaseController
|
5
5
|
def index
|
6
|
-
@localization_keys =
|
6
|
+
@localization_keys = fetch_localization_keys
|
7
|
+
render json: @localization_keys.as_json(
|
8
|
+
root: false, only: %i[id localization_key is_deleted]
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def fetch_localization_keys
|
7
15
|
if params[:after].present?
|
8
|
-
|
16
|
+
after_date = Time.parse(params[:after])
|
17
|
+
LocalizationKey.after(after_date).to_a
|
9
18
|
else
|
10
|
-
|
19
|
+
LocalizationKey.all
|
11
20
|
end
|
12
|
-
render json: @localization_keys.as_json(root: false, only: [:id, :localization_key])
|
13
21
|
end
|
14
22
|
end
|
15
23
|
end
|
@@ -1,18 +1,34 @@
|
|
1
1
|
module Lit
|
2
2
|
class Api::V1::LocalizationsController < Api::V1::BaseController
|
3
3
|
def index
|
4
|
-
@localizations =
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
@localizations = fetch_localizations
|
5
|
+
render json: @localizations.as_json(
|
6
|
+
root: false,
|
7
|
+
only: %i[id localization_key_id locale_id],
|
8
|
+
methods: %i[
|
9
|
+
value localization_key_str locale_str
|
10
|
+
localization_key_is_deleted
|
11
|
+
]
|
12
|
+
)
|
11
13
|
end
|
12
14
|
|
13
15
|
def last_change
|
14
|
-
@localization = Localization.order(
|
15
|
-
render json: @localization.as_json(
|
16
|
+
@localization = Localization.order(updated_at: :desc).first
|
17
|
+
render json: @localization.as_json(
|
18
|
+
root: false, only: [], methods: [:last_change]
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def fetch_localizations
|
25
|
+
if params[:after].present?
|
26
|
+
after_date = Time.parse("#{params[:after]} #{Time.zone.name}")
|
27
|
+
.in_time_zone
|
28
|
+
Localization.after(after_date).to_a
|
29
|
+
else
|
30
|
+
Localization.all
|
31
|
+
end
|
16
32
|
end
|
17
33
|
end
|
18
34
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Lit
|
2
2
|
class ApplicationController < ActionController::Base
|
3
3
|
unless respond_to?(:before_action)
|
4
|
-
|
5
|
-
|
4
|
+
alias before_action before_filter
|
5
|
+
alias after_action after_filter
|
6
6
|
end
|
7
7
|
before_action :authenticate
|
8
8
|
before_action :stop_hits_counter
|
@@ -24,16 +24,19 @@ module Lit
|
|
24
24
|
Lit.init.cache.restore_hits_counter
|
25
25
|
end
|
26
26
|
|
27
|
-
def redirect_to_back_or_default(fallback_location:
|
27
|
+
def redirect_to_back_or_default(fallback_location: nil)
|
28
|
+
fallback_location ||= lit.localization_keys_path
|
28
29
|
if respond_to?(:redirect_back)
|
29
30
|
redirect_back fallback_location: fallback_location
|
31
|
+
elsif referer.present? && referer != request.env['REQUEST_URI']
|
32
|
+
redirect_to :back
|
30
33
|
else
|
31
|
-
|
32
|
-
redirect_to :back
|
33
|
-
else
|
34
|
-
redirect_to fallback_location
|
35
|
-
end
|
34
|
+
redirect_to fallback_location
|
36
35
|
end
|
37
36
|
end
|
37
|
+
|
38
|
+
def referer
|
39
|
+
request.referer
|
40
|
+
end
|
38
41
|
end
|
39
42
|
end
|
@@ -2,37 +2,32 @@ require_dependency 'lit/application_controller'
|
|
2
2
|
|
3
3
|
module Lit
|
4
4
|
class IncommingLocalizationsController < ApplicationController
|
5
|
-
before_action :
|
5
|
+
before_action :find_source_and_incomming_localizations
|
6
|
+
before_action :find_icomming_localization, only: %i[accept destroy]
|
6
7
|
|
7
|
-
def index
|
8
|
-
@incomming_localizations = @source.incomming_localizations
|
9
|
-
end
|
8
|
+
def index; end
|
10
9
|
|
11
10
|
def accept
|
12
|
-
@incomming_localization = @source.incomming_localizations.find(params[:id].to_i)
|
13
11
|
@incomming_localization.accept
|
14
|
-
Lit.init.cache.refresh_key @incomming_localization.full_key
|
15
12
|
respond_to do |format|
|
16
|
-
format.html {
|
13
|
+
format.html { finish_request }
|
17
14
|
format.js
|
18
15
|
end
|
19
16
|
end
|
20
17
|
|
21
18
|
def accept_all
|
22
|
-
|
23
|
-
|
24
|
-
Lit.init.cache.refresh_key li.full_key
|
19
|
+
ActiveRecord::Base.transaction do
|
20
|
+
@incomming_localizations.each(&:accept)
|
25
21
|
end
|
26
|
-
|
22
|
+
finish_request
|
27
23
|
end
|
28
24
|
|
29
25
|
def reject_all
|
30
|
-
@
|
31
|
-
|
26
|
+
@incomming_localizations.destroy_all
|
27
|
+
finish_request
|
32
28
|
end
|
33
29
|
|
34
30
|
def destroy
|
35
|
-
@incomming_localization = @source.incomming_localizations.find(params[:id].to_i)
|
36
31
|
@incomming_localization.destroy
|
37
32
|
respond_to do |format|
|
38
33
|
format.html { redirect_to source_incomming_localizations_path(@source) }
|
@@ -42,8 +37,20 @@ module Lit
|
|
42
37
|
|
43
38
|
private
|
44
39
|
|
45
|
-
def
|
40
|
+
def find_icomming_localization
|
41
|
+
@incomming_localization = @source.incomming_localizations
|
42
|
+
.find(params[:id].to_i)
|
43
|
+
end
|
44
|
+
|
45
|
+
def find_source_and_incomming_localizations
|
46
46
|
@source = Source.find(params[:source_id].to_i)
|
47
|
+
@incomming_localizations = @source.incomming_localizations
|
48
|
+
end
|
49
|
+
|
50
|
+
def finish_request
|
51
|
+
redirect_to_back_or_default(
|
52
|
+
fallback_location: source_incomming_localizations_path(@source)
|
53
|
+
)
|
47
54
|
end
|
48
55
|
end
|
49
56
|
end
|
@@ -1,14 +1,28 @@
|
|
1
1
|
module Lit
|
2
2
|
class LocalizationKeysController < ::Lit::ApplicationController
|
3
|
-
before_action :
|
3
|
+
before_action :find_localization_scope,
|
4
|
+
except: %i[destroy find_localization]
|
5
|
+
before_action :find_localization_key,
|
6
|
+
only: %i[star destroy change_completed restore_deleted]
|
4
7
|
|
5
8
|
def index
|
6
9
|
get_localization_keys
|
7
10
|
end
|
8
11
|
|
12
|
+
def not_translated
|
13
|
+
@scope = @scope.not_completed
|
14
|
+
get_localization_keys
|
15
|
+
end
|
16
|
+
|
17
|
+
def visited_again
|
18
|
+
@scope = @scope.unscope(where: :is_deleted).not_active.visited_again
|
19
|
+
get_localization_keys
|
20
|
+
end
|
21
|
+
|
9
22
|
def find_localization
|
10
|
-
localization_key = Lit::LocalizationKey.
|
11
|
-
|
23
|
+
localization_key = Lit::LocalizationKey.find_by!(
|
24
|
+
localization_key: params[:key]
|
25
|
+
)
|
12
26
|
locale = Lit::Locale.find_by!(locale: params[:locale])
|
13
27
|
localization = localization_key.localizations.find_by(locale_id: locale)
|
14
28
|
render json: {
|
@@ -19,7 +33,7 @@ module Lit
|
|
19
33
|
def starred
|
20
34
|
@scope = @scope.where(is_starred: true)
|
21
35
|
|
22
|
-
if defined?(Kaminari) &&
|
36
|
+
if defined?(Kaminari) &&
|
23
37
|
@scope.respond_to?(Kaminari.config.page_method_name)
|
24
38
|
@scope = @scope.send(Kaminari.config.page_method_name, params[:page])
|
25
39
|
end
|
@@ -28,31 +42,41 @@ module Lit
|
|
28
42
|
end
|
29
43
|
|
30
44
|
def star
|
31
|
-
@localization_key
|
32
|
-
@localization_key.is_starred = !@localization_key.is_starred?
|
45
|
+
@localization_key.toggle :is_starred
|
33
46
|
@localization_key.save
|
34
47
|
respond_to :js
|
35
48
|
end
|
36
49
|
|
50
|
+
def change_completed
|
51
|
+
@localization_key.change_all_completed
|
52
|
+
respond_to :js
|
53
|
+
end
|
54
|
+
|
55
|
+
def restore_deleted
|
56
|
+
@localization_key.restore
|
57
|
+
respond_to :js
|
58
|
+
end
|
59
|
+
|
37
60
|
def destroy
|
38
|
-
@localization_key
|
39
|
-
@localization_key.destroy
|
40
|
-
I18n.backend.available_locales.each do |l|
|
41
|
-
Lit.init.cache.delete_key "#{l}.#{@localization_key.localization_key}"
|
42
|
-
end
|
61
|
+
@localization_key.soft_destroy
|
43
62
|
respond_to :js
|
44
63
|
end
|
45
64
|
|
46
65
|
private
|
47
66
|
|
48
|
-
def
|
67
|
+
def find_localization_key
|
68
|
+
@localization_key = LocalizationKey.find params[:id].to_i
|
69
|
+
end
|
70
|
+
|
71
|
+
def find_localization_scope
|
49
72
|
@search_options = if params.respond_to?(:permit)
|
50
73
|
params.permit(*valid_keys)
|
51
74
|
else
|
52
75
|
params.slice(*valid_keys)
|
53
76
|
end
|
54
|
-
@
|
55
|
-
|
77
|
+
@scope = LocalizationKey.distinct.active
|
78
|
+
.preload(localizations: :locale)
|
79
|
+
.search(@search_options)
|
56
80
|
end
|
57
81
|
|
58
82
|
def get_localization_keys
|
@@ -70,7 +94,7 @@ module Lit
|
|
70
94
|
end
|
71
95
|
|
72
96
|
def valid_keys
|
73
|
-
%w
|
97
|
+
%w[key key_prefix order]
|
74
98
|
end
|
75
99
|
|
76
100
|
def grouped_localizations
|
@@ -105,13 +129,15 @@ module Lit
|
|
105
129
|
end
|
106
130
|
helper_method :localization_for
|
107
131
|
|
108
|
-
def
|
132
|
+
def versions?(localization)
|
109
133
|
@_versions ||= begin
|
110
134
|
ids = grouped_localizations.values.map(&:values).flatten.map(&:id)
|
111
|
-
Lit::Localization.where(id: ids).joins(:versions).group(
|
135
|
+
Lit::Localization.active.where(id: ids).joins(:versions).group(
|
136
|
+
"#{Lit::Localization.quoted_table_name}.id"
|
137
|
+
).count
|
112
138
|
end
|
113
139
|
@_versions[localization.id].to_i > 0
|
114
140
|
end
|
115
|
-
helper_method :
|
141
|
+
helper_method :versions?
|
116
142
|
end
|
117
143
|
end
|