translation_center 1.7.2 → 2.0.1
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 +38 -2
- data/Rakefile +8 -13
- data/app/assets/javascripts/translation_center/application.js +1 -1
- data/app/assets/stylesheets/translation_center/application.css +1 -1
- data/app/assets/stylesheets/translation_center/translation_keys.css +3 -1
- data/app/controllers/translation_center/application_controller.rb +2 -2
- data/app/controllers/translation_center/translation_keys_controller.rb +4 -4
- data/app/models/translation_center/activity_query.rb +2 -3
- data/app/models/translation_center/category.rb +7 -2
- data/app/models/translation_center/translation.rb +54 -32
- data/app/models/translation_center/translation_key.rb +29 -18
- data/app/views/layouts/translation_center/application.html.haml +0 -2
- data/app/views/translation_center/translation_keys/_translation_keys.html.haml +3 -1
- data/app/views/translation_center/translations/_show.html.haml +3 -3
- data/config/routes.rb +3 -3
- data/db/development.sqlite3 +0 -0
- data/{test/dummy/db/migrate/20130410082611_devise_create_users.rb → db/migrate/20130410082600_devise_create_users.rb} +0 -0
- data/{test/dummy/db/migrate/20130410082701_create_articles.rb → db/migrate/20130410082601_create_articles.rb} +0 -0
- data/{test/dummy/db/migrate/20130410084711234392_create_translation_center_categories.rb → db/migrate/20130410084602_create_translation_center_categories.rb} +0 -0
- data/{test/dummy/db/migrate/20130410084711235054_create_translation_center_translation_keys.rb → db/migrate/20130410084603_create_translation_center_translation_keys.rb} +0 -0
- data/{test/dummy/db/migrate/20130410084711235601_create_translation_center_translations.rb → db/migrate/20130410084604_create_translation_center_translations.rb} +0 -0
- data/{test/dummy/db/migrate/20130410084711_acts_as_votable_migration.rb → db/migrate/20130410084605_acts_as_votable_migration.rb} +1 -0
- data/{test/dummy/db/migrate/20130410084711235602_install_audited.rb → db/migrate/20130410084606_install_audited.rb} +0 -0
- data/{test/dummy/db/migrate/20130410113111070575_add_de_status_translation_center_translation_keys.rb → db/migrate/20130410113607_add_de_status_translation_center_translation_keys.rb} +0 -0
- data/{test/dummy/db/migrate/20130417134539377014_add_ar_status_translation_center_translation_keys.rb → db/migrate/20130417134608_add_ar_status_translation_center_translation_keys.rb} +0 -0
- data/{test/dummy/db/migrate/20130506103956_fix_translation_user_relation.rb → db/migrate/20130506103609_fix_translation_user_relation.rb} +0 -0
- data/{test/dummy/db/migrate/20130801102022_add_indicies.rb → db/migrate/20130801102610_add_indicies.rb} +0 -0
- data/{test/dummy/db → db}/schema.rb +13 -13
- data/{test/dummy/public/favicon.ico → db/test.sqlite3} +0 -0
- data/lib/generators/translation_center/add_lang/add_lang_generator.rb +5 -2
- data/lib/generators/translation_center/install/install_generator.rb +4 -4
- data/lib/translation_center/acts_as_translator.rb +1 -1
- data/lib/translation_center/engine.rb +7 -0
- data/lib/translation_center/translation_helpers.rb +1 -1
- data/lib/translation_center/translations_transfer.rb +6 -5
- data/lib/translation_center/version.rb +1 -1
- data/spec/controllers/categories_controller_spec.rb +47 -0
- data/spec/controllers/center_controller_spec.rb +77 -0
- data/spec/controllers/translation_keys_controller_spec.rb +87 -0
- data/spec/controllers/translations_controller_spec.rb +70 -0
- data/{test → spec}/dummy/README.rdoc +0 -0
- data/{test → spec}/dummy/Rakefile +0 -0
- data/{test → spec}/dummy/app/assets/javascripts/application.js +0 -1
- data/{test → spec}/dummy/app/assets/stylesheets/application.css +0 -1
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/{test → spec}/dummy/app/helpers/application_helper.rb +0 -0
- data/{test → spec}/dummy/app/models/user.rb +2 -5
- data/{test → spec}/dummy/app/views/layouts/application.html.erb +0 -1
- data/{test → spec}/dummy/config.ru +0 -0
- data/{test → spec}/dummy/config/application.rb +10 -5
- data/{test → spec}/dummy/config/boot.rb +0 -0
- data/spec/dummy/config/database.yml +25 -0
- data/{test → spec}/dummy/config/environment.rb +2 -0
- data/{test → spec}/dummy/config/environments/development.rb +0 -0
- data/{test → spec}/dummy/config/environments/production.rb +0 -0
- data/{test → spec}/dummy/config/environments/test.rb +2 -2
- data/{test → spec}/dummy/config/initializers/backtrace_silencers.rb +0 -0
- data/{test → spec}/dummy/config/initializers/devise.rb +3 -1
- data/{test → spec}/dummy/config/initializers/inflections.rb +0 -0
- data/{test → spec}/dummy/config/initializers/mime_types.rb +0 -0
- data/{test → spec}/dummy/config/initializers/secret_token.rb +1 -1
- data/{test → spec}/dummy/config/initializers/session_store.rb +1 -1
- data/{test → spec}/dummy/config/initializers/wrap_parameters.rb +1 -1
- data/{test → spec}/dummy/config/locales/devise.en.yml +0 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +7 -0
- data/{test → spec}/dummy/config/translation_center.yml +23 -6
- data/spec/dummy/db/migrate/20130410082611_devise_create_users.translation_center.rb +46 -0
- data/spec/dummy/db/migrate/20130410082701_create_articles.translation_center.rb +10 -0
- data/spec/dummy/db/migrate/20130410084702_create_translation_center_categories.translation_center.rb +9 -0
- data/spec/dummy/db/migrate/20130410084703_create_translation_center_translation_keys.translation_center.rb +14 -0
- data/spec/dummy/db/migrate/20130410084704_create_translation_center_translations.translation_center.rb +13 -0
- data/spec/dummy/db/migrate/20130410084711_acts_as_votable_migration.translation_center.rb +24 -0
- data/spec/dummy/db/migrate/20130410084712_install_audited.translation_center.rb +28 -0
- data/spec/dummy/db/migrate/20130410113113_add_de_status_translation_center_translation_keys.translation_center.rb +5 -0
- data/spec/dummy/db/migrate/20130417134534_add_ar_status_translation_center_translation_keys.rb +5 -0
- data/spec/dummy/db/migrate/20130506103956_fix_translation_user_relation.translation_center.rb +12 -0
- data/spec/dummy/db/migrate/20130801102021_add_indicies.translation_center.rb +8 -0
- data/spec/dummy/db/schema.rb +111 -0
- data/{test → spec}/dummy/public/404.html +0 -0
- data/{test → spec}/dummy/public/422.html +0 -0
- data/{test → spec}/dummy/public/500.html +0 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/{test → spec}/dummy/script/rails +0 -0
- data/spec/factories/category_factory.rb +5 -0
- data/spec/factories/translation_factory.rb +8 -0
- data/spec/factories/translation_key_factory.rb +5 -0
- data/spec/factories/user_factory.rb +6 -0
- data/spec/factories/vote_factory.rb +13 -0
- data/spec/lib/generators/translation_center/add_lang/add_lang_generator_spec.rb +26 -0
- data/spec/models/translation_center/category_spec.rb +39 -0
- data/spec/models/translation_center/translation_key_spec.rb +145 -0
- data/spec/models/translation_center/translation_spec.rb +117 -0
- data/spec/schema.rb +112 -0
- data/spec/spec_helper.rb +52 -0
- data/spec/support/devise.rb +3 -0
- metadata +360 -208
- data/test/dummy/app/assets/images/translation_center_logo.png +0 -0
- data/test/dummy/app/assets/javascripts/articles.js +0 -2
- data/test/dummy/app/assets/stylesheets/articles.css +0 -4
- data/test/dummy/app/assets/stylesheets/scaffold.css +0 -56
- data/test/dummy/app/controllers/application_controller.rb +0 -6
- data/test/dummy/app/controllers/articles_controller.rb +0 -85
- data/test/dummy/app/helpers/articles_helper.rb +0 -2
- data/test/dummy/app/models/article.rb +0 -7
- data/test/dummy/app/views/articles/_form.html.haml +0 -16
- data/test/dummy/app/views/articles/edit.html.haml +0 -7
- data/test/dummy/app/views/articles/index.html.haml +0 -32
- data/test/dummy/app/views/articles/new.html.haml +0 -5
- data/test/dummy/app/views/articles/show.html.haml +0 -14
- data/test/dummy/config/database.yml +0 -42
- data/test/dummy/config/locales/ar.yml +0 -6
- data/test/dummy/config/locales/de.yml +0 -2
- data/test/dummy/config/locales/en.yml +0 -361
- data/test/dummy/config/routes.rb +0 -10
- data/test/dummy/spec/spec_helper.rb +0 -38
- data/test/dummy/test/fixtures/articles.yml +0 -9
- data/test/dummy/test/fixtures/posts.yml +0 -9
- data/test/dummy/test/fixtures/users.yml +0 -11
- data/test/dummy/test/functional/articles_controller_test.rb +0 -49
- data/test/dummy/test/functional/posts_controller_test.rb +0 -49
- data/test/dummy/test/unit/article_test.rb +0 -7
- data/test/dummy/test/unit/helpers/articles_helper_test.rb +0 -4
- data/test/dummy/test/unit/helpers/posts_helper_test.rb +0 -4
- data/test/dummy/test/unit/post_test.rb +0 -7
- data/test/dummy/test/unit/user_test.rb +0 -7
- data/test/fixtures/translation_center/categories.yml +0 -7
- data/test/fixtures/translation_center/translation_keys.yml +0 -11
- data/test/fixtures/translation_center/translations.yml +0 -15
- data/test/functional/translation_center/categories_controller_test.rb +0 -51
- data/test/functional/translation_center/center_controller_test.rb +0 -9
- data/test/functional/translation_center/translation_keys_controller_test.rb +0 -51
- data/test/functional/translation_center/translations_controller_test.rb +0 -51
- data/test/integration/navigation_test.rb +0 -10
- data/test/test_helper.rb +0 -15
- data/test/translation_center_test.rb +0 -7
- data/test/unit/helpers/translation_center/categories_helper_test.rb +0 -6
- data/test/unit/helpers/translation_center/center_helper_test.rb +0 -6
- data/test/unit/helpers/translation_center/translation_keys_helper_test.rb +0 -6
- data/test/unit/helpers/translation_center/translations_helper_test.rb +0 -6
- data/test/unit/translation_center/category_test.rb +0 -9
- data/test/unit/translation_center/translation_key_test.rb +0 -9
- data/test/unit/translation_center/translation_test.rb +0 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 73cc7ca99fab28be936e25cb27ca191d73ea67cf
|
|
4
|
+
data.tar.gz: 6ddc9259b02e7c53a6b7d30a66be2026d4f544a2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6af06086f8b3dc23bbbe7658d041a4d27ce52dc1675032f1cb6808dcb4e7b28b9f0f02917963a5235d9287e0a2dc8331384c3e81322dc03beeea153abc58f598
|
|
7
|
+
data.tar.gz: ad2d4fa823c7713718b38aa8acc06f5ec542be5b61438dea8f2b953e90db4ed5556d1ec51379775760ce336cad668e13a20dcd2ffd5630665f71aecea2cd1c97
|
data/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
## Introduction
|
|
7
7
|
|
|
8
|
-
Translation Center is a multi lingual web engine for Rails
|
|
8
|
+
Translation Center is a multi lingual web engine for Rails apps. It builds a translation center community with translators and admins from your system users.
|
|
9
9
|
|
|
10
10
|

|
|
11
11
|
|
|
@@ -36,7 +36,7 @@ Manage all app translations; collect stats, accept, add, edit, remove translatio
|
|
|
36
36
|
|
|
37
37
|
## Getting started
|
|
38
38
|
|
|
39
|
-
TranslationCenter works with Rails
|
|
39
|
+
TranslationCenter works with Rails 4.x onwards. You can add it to your Gemfile with:
|
|
40
40
|
|
|
41
41
|
```ruby
|
|
42
42
|
gem 'translation_center'
|
|
@@ -106,6 +106,37 @@ def can_admin_translations?
|
|
|
106
106
|
self.email == 'admin@tc.com'
|
|
107
107
|
end
|
|
108
108
|
```
|
|
109
|
+
## Rails 3
|
|
110
|
+
If you are Using rails 3 you can revert back to tag 1.7.2
|
|
111
|
+
|
|
112
|
+
## MongoDB Support
|
|
113
|
+
* Create a SQL database so your app connects to both MongoDB and this new SQL database.
|
|
114
|
+
* Create a new SQL table (ex: translator_users) that will be considered as translator user and has a foreign key for your MongoDB user (ex: mongo_user_id)
|
|
115
|
+
* Add `acts_as_translator` to your ActiverRecord user (ex: TranslatorUser) model not Mogno User
|
|
116
|
+
* Update translation_center.yml to the translator model name if needed
|
|
117
|
+
```ruby
|
|
118
|
+
tranlator_type: 'TranslatorUser'
|
|
119
|
+
```
|
|
120
|
+
* You also need to add these methods in an initializer in case Devise is not existing in Mongo, for example `translation_authentication.rb` :
|
|
121
|
+
```ruby
|
|
122
|
+
module TranslationCenter
|
|
123
|
+
class ApplicationController < ActionController::Base
|
|
124
|
+
|
|
125
|
+
# current_user is needed in views
|
|
126
|
+
helper_method :current_user
|
|
127
|
+
|
|
128
|
+
def authenticate_user!
|
|
129
|
+
# redirect to login if user not signed in
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def current_user
|
|
133
|
+
# write code that returns the current ActiveRecord user in session
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
```
|
|
139
|
+
in the current_user method make sure that you return the ActiveRecord user not the Mongo user because that's what we will use in translation center engine.
|
|
109
140
|
|
|
110
141
|
## How to use
|
|
111
142
|
|
|
@@ -285,6 +316,11 @@ http://www.youtube.com/watch?v=BTy6ZI31JmU
|
|
|
285
316
|
|
|
286
317
|
Translation Center is maintained and developed by [BadrIT](http://badrit.com/)
|
|
287
318
|
|
|
319
|
+
## Contributing
|
|
320
|
+
|
|
321
|
+
We hope that you will consider contributing to Translation Center.
|
|
322
|
+
You will usually want to write tests for your changes. To run the test suite, go into Translation Center's top-level directory and run "bundle install" and then "rspec spec"
|
|
323
|
+
|
|
288
324
|
## Support
|
|
289
325
|
|
|
290
326
|
Help us make this engine better by submitting any bugs or enhancments in the issues page for this project.
|
data/Rakefile
CHANGED
|
@@ -12,6 +12,7 @@ rescue LoadError
|
|
|
12
12
|
RDoc::Task = Rake::RDocTask
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
+
desc 'Generating documentation'
|
|
15
16
|
RDoc::Task.new(:rdoc) do |rdoc|
|
|
16
17
|
rdoc.rdoc_dir = 'rdoc'
|
|
17
18
|
rdoc.title = 'TranslationCenter'
|
|
@@ -20,21 +21,15 @@ RDoc::Task.new(:rdoc) do |rdoc|
|
|
|
20
21
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
21
22
|
end
|
|
22
23
|
|
|
23
|
-
APP_RAKEFILE = File.expand_path("../
|
|
24
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
|
24
25
|
load 'rails/tasks/engine.rake'
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
28
27
|
Bundler::GemHelper.install_tasks
|
|
28
|
+
Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
t.libs << 'lib'
|
|
34
|
-
t.libs << 'test'
|
|
35
|
-
t.pattern = 'test/**/*_test.rb'
|
|
36
|
-
t.verbose = false
|
|
37
|
-
end
|
|
38
|
-
|
|
30
|
+
desc 'RSpec tests'
|
|
31
|
+
require 'rspec/core'
|
|
32
|
+
require 'rspec/core/rake_task'
|
|
39
33
|
|
|
40
|
-
|
|
34
|
+
RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
|
|
35
|
+
task :default => :spec
|
|
@@ -12,7 +12,7 @@ module TranslationCenter
|
|
|
12
12
|
|
|
13
13
|
render "translation_center/errors/exception"
|
|
14
14
|
end
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
# defaults
|
|
@@ -24,7 +24,7 @@ module TranslationCenter
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
protected
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
def can_admin?
|
|
29
29
|
current_user.can_admin_translations?
|
|
30
30
|
end
|
|
@@ -11,14 +11,14 @@ module TranslationCenter
|
|
|
11
11
|
@key_before_status = @translation_key.status(session[:lang_to])
|
|
12
12
|
respond_to do |format|
|
|
13
13
|
# only admin can edit accepted translations
|
|
14
|
-
if (current_user.can_admin_translations? || !@translation.accepted?) && !params[:value].strip.blank?
|
|
14
|
+
if (current_user.can_admin_translations? || !@translation.accepted?) && !params[:value].to_s.strip.blank?
|
|
15
15
|
# use yaml.load to handle arrays
|
|
16
|
-
@translation.
|
|
16
|
+
@translation.update(value: YAML.load(params[:value].strip), status: 'pending')
|
|
17
17
|
# translation added by admin is considered the accepted one as it is trusted
|
|
18
18
|
@translation.accept if current_user.can_admin_translations? && CONFIG['accept_admin_translations']
|
|
19
19
|
format.json {render json: { value: @translation.value, status: @translation.key.status(@translation.lang), key_before_status: @key_before_status } }
|
|
20
20
|
else
|
|
21
|
-
render nothing: true
|
|
21
|
+
format.any {render nothing: true}
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
24
|
end
|
|
@@ -42,7 +42,7 @@ module TranslationCenter
|
|
|
42
42
|
# PUT /translation_keys/1
|
|
43
43
|
# PUT /translation_keys/1.json
|
|
44
44
|
def update
|
|
45
|
-
params[:value].strip!
|
|
45
|
+
params[:value].to_s.strip!
|
|
46
46
|
@old_value = @translation_key.category.name
|
|
47
47
|
respond_to do |format|
|
|
48
48
|
if !params[:value].blank? && @translation_key.update_attribute(:name, params[:value])
|
|
@@ -18,7 +18,7 @@ module TranslationCenter
|
|
|
18
18
|
|
|
19
19
|
# retuns and ActiveRecord Relation of Audit(s) that matches this search criteria
|
|
20
20
|
def activities
|
|
21
|
-
query = Audited::Adapters::ActiveRecord::Audit.where(auditable_id: translation_ids).
|
|
21
|
+
query = Audited::Adapters::ActiveRecord::Audit.where(auditable_id: translation_ids).all
|
|
22
22
|
query = query.where("DATE(created_at) <= DATE(?)", created_at_lteq) unless created_at_lteq.blank?
|
|
23
23
|
query = query.where("DATE(created_at) >= DATE(?)", created_at_gteq) unless created_at_gteq.blank?
|
|
24
24
|
query.order('created_at DESC')
|
|
@@ -28,7 +28,7 @@ module TranslationCenter
|
|
|
28
28
|
|
|
29
29
|
# return translation ids that matches this search criteria
|
|
30
30
|
def translation_ids
|
|
31
|
-
query = Translation.
|
|
31
|
+
query = Translation.all
|
|
32
32
|
query = query.where(lang: lang) unless lang.blank?
|
|
33
33
|
query = query.joins(:translation_key).where("translation_center_translation_keys.name LIKE ?", "%#{translation_key_name}%") unless translation_key_name.blank?
|
|
34
34
|
|
|
@@ -41,6 +41,5 @@ module TranslationCenter
|
|
|
41
41
|
|
|
42
42
|
query.map(&:id)
|
|
43
43
|
end
|
|
44
|
-
|
|
45
44
|
end
|
|
46
45
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module TranslationCenter
|
|
2
2
|
class Category < ActiveRecord::Base
|
|
3
|
-
attr_accessible :name
|
|
3
|
+
# attr_accessible :name
|
|
4
4
|
has_many :translation_keys, dependent: :destroy
|
|
5
5
|
|
|
6
6
|
alias_method :keys, :translation_keys
|
|
@@ -10,7 +10,7 @@ module TranslationCenter
|
|
|
10
10
|
|
|
11
11
|
# gets how much complete translation of category is in a certain language
|
|
12
12
|
def complete_percentage_in(lang)
|
|
13
|
-
if self.keys.
|
|
13
|
+
if self.keys.blank?
|
|
14
14
|
100
|
|
15
15
|
else
|
|
16
16
|
accepted_keys = accepted_keys(lang)
|
|
@@ -43,5 +43,10 @@ module TranslationCenter
|
|
|
43
43
|
self.name.titleize
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def category_params
|
|
49
|
+
params.require(:category).permit(:name)
|
|
50
|
+
end
|
|
46
51
|
end
|
|
47
52
|
end
|
|
@@ -1,84 +1,100 @@
|
|
|
1
1
|
module TranslationCenter
|
|
2
2
|
class Translation < ActiveRecord::Base
|
|
3
3
|
|
|
4
|
-
attr_accessible :value, :lang, :translation_key_id, :user_id, :status
|
|
4
|
+
# attr_accessible :value, :lang, :translation_key_id, :user_id, :status
|
|
5
5
|
# serialize as we could store arrays
|
|
6
|
-
serialize :value
|
|
7
|
-
|
|
8
6
|
CHANGES_PER_PAGE = 5
|
|
9
7
|
NUMBER_PER_PAGE = 15
|
|
10
8
|
|
|
9
|
+
# Statuses
|
|
10
|
+
ACCEPTED = "accepted"
|
|
11
|
+
PENDING = "pending"
|
|
12
|
+
|
|
13
|
+
# Relations
|
|
11
14
|
belongs_to :translation_key
|
|
12
15
|
belongs_to :translator, polymorphic: true
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
acts_as_votable
|
|
16
|
-
audited
|
|
17
|
-
|
|
18
|
-
# validations
|
|
17
|
+
# Validations
|
|
19
18
|
validates :translation_key_id, :lang, :status, :value, presence: true
|
|
20
19
|
validate :one_translation_per_lang_per_key, on: :create
|
|
21
20
|
|
|
22
|
-
#
|
|
23
|
-
|
|
21
|
+
# Scopes
|
|
22
|
+
# Returns accepted transations
|
|
23
|
+
scope :accepted, -> { where(status: ACCEPTED) }
|
|
24
24
|
|
|
25
|
-
#
|
|
26
|
-
scope :in,
|
|
25
|
+
# Returns translations in a certain language
|
|
26
|
+
scope :in, ->(lang) { where(lang: lang.to_s.strip) }
|
|
27
27
|
|
|
28
|
-
#
|
|
29
|
-
scope :sorted_by_votes,
|
|
28
|
+
# Sorts translations by number of votes
|
|
29
|
+
scope :sorted_by_votes, -> do
|
|
30
|
+
where('votable_type IS NULL OR votable_type = ?', 'TranslationCenter::Translation')
|
|
31
|
+
.select('translation_center_translations.*, count(votes.id) as votes_count')
|
|
32
|
+
.joins('LEFT OUTER JOIN votes on votes.votable_id = translation_center_translations.id')
|
|
33
|
+
.group('translation_center_translations.id')
|
|
34
|
+
.order('votes_count desc')
|
|
35
|
+
end
|
|
30
36
|
|
|
37
|
+
# Callbacks
|
|
31
38
|
after_save :update_key_status
|
|
32
39
|
after_destroy :notify_key
|
|
33
40
|
|
|
41
|
+
alias_method :key, :translation_key
|
|
42
|
+
acts_as_votable
|
|
43
|
+
audited
|
|
44
|
+
|
|
45
|
+
# Serialize as we could store arrays
|
|
46
|
+
serialize :value
|
|
47
|
+
|
|
34
48
|
# called after save to update the key status
|
|
35
49
|
def update_key_status
|
|
36
|
-
self.key.update_status
|
|
50
|
+
self.key.update_status(self.lang)
|
|
37
51
|
end
|
|
38
52
|
|
|
39
53
|
# called before destory to update the key status
|
|
40
54
|
def notify_key
|
|
41
|
-
self.key.update_status
|
|
42
|
-
self.audits.
|
|
55
|
+
self.key.update_status(self.lang)
|
|
56
|
+
self.audits.destroy
|
|
43
57
|
end
|
|
44
58
|
|
|
45
59
|
# returns true if the status of the translation is accepted
|
|
46
60
|
def accepted?
|
|
47
|
-
self.status ==
|
|
61
|
+
self.status == ACCEPTED
|
|
48
62
|
end
|
|
49
63
|
|
|
50
64
|
# returns true if the status of the translation is pending
|
|
51
65
|
def pending?
|
|
52
|
-
self.status ==
|
|
66
|
+
self.status == PENDING
|
|
53
67
|
end
|
|
54
68
|
|
|
55
|
-
#
|
|
69
|
+
# Accept translation by changing its status and if there is an accepting translation
|
|
56
70
|
# make it pending
|
|
57
71
|
def accept
|
|
58
|
-
#
|
|
72
|
+
# If translation is accepted do nothing
|
|
59
73
|
unless self.accepted?
|
|
60
|
-
self.translation_key.accepted_translation_in(self.lang)
|
|
74
|
+
self.translation_key.accepted_translation_in(self.lang)
|
|
75
|
+
.try(:update_attribute, :status, TranslationKey::PENDING)
|
|
76
|
+
|
|
61
77
|
# reload the translation key as it has changed
|
|
62
78
|
self.translation_key.reload
|
|
63
|
-
self.update_attribute(:status,
|
|
79
|
+
self.update_attribute(:status, ACCEPTED)
|
|
64
80
|
end
|
|
65
|
-
|
|
66
81
|
end
|
|
67
82
|
|
|
68
83
|
# unaccept a translation
|
|
69
84
|
def unaccept
|
|
70
|
-
self.update_attribute(:status,
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
# gets recent changes on translations
|
|
74
|
-
# TODO: remove this method as it is not being used elsewhere
|
|
75
|
-
def self.recent_changes
|
|
76
|
-
Audited::Adapters::ActiveRecord::Audit.where('auditable_type = ?', 'TranslationCenter::Translation').search(params).relation.reorder('created_at DESC')
|
|
85
|
+
self.update_attribute(:status, PENDING)
|
|
77
86
|
end
|
|
78
87
|
|
|
79
88
|
# make sure user has one translation per key per lang
|
|
80
89
|
def one_translation_per_lang_per_key
|
|
81
|
-
|
|
90
|
+
translation_exists = Translation.exists?(
|
|
91
|
+
lang: self.lang,
|
|
92
|
+
translator_id: self.translator.id,
|
|
93
|
+
translator_type: self.translator.class.name,
|
|
94
|
+
translation_key_id: self.key.id
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
unless translation_exists
|
|
82
98
|
true
|
|
83
99
|
else
|
|
84
100
|
false
|
|
@@ -86,5 +102,11 @@ module TranslationCenter
|
|
|
86
102
|
end
|
|
87
103
|
end
|
|
88
104
|
|
|
105
|
+
private
|
|
106
|
+
|
|
107
|
+
def translation_params
|
|
108
|
+
params.require(:translation).permit(:value, :lang, :translation_key_id, :user_id, :status)
|
|
109
|
+
end
|
|
110
|
+
|
|
89
111
|
end
|
|
90
112
|
end
|
|
@@ -1,47 +1,52 @@
|
|
|
1
1
|
module TranslationCenter
|
|
2
2
|
|
|
3
3
|
class TranslationKey < ActiveRecord::Base
|
|
4
|
-
|
|
4
|
+
# Constants
|
|
5
|
+
ACCEPTED = "accepted"
|
|
6
|
+
PENDING = "pending"
|
|
7
|
+
TRANSLATED = "translated"
|
|
8
|
+
UNTRANSLATED = "untranslated"
|
|
9
|
+
PER_PAGE = 7
|
|
10
|
+
|
|
11
|
+
# Relations
|
|
12
|
+
# attr_accessible :name, :last_accessed, :category_id
|
|
5
13
|
belongs_to :category
|
|
6
14
|
has_many :translations, dependent: :destroy
|
|
7
15
|
|
|
8
|
-
#
|
|
16
|
+
# Validations
|
|
9
17
|
validates :name, uniqueness: true
|
|
10
18
|
validates :name, presence: true
|
|
11
19
|
|
|
12
20
|
# called after key is created or updated
|
|
13
21
|
before_save :add_category
|
|
14
22
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
scope :
|
|
18
|
-
scope :pending, lambda { |lang| where("#{lang.to_s}_status" => 'pending') }
|
|
19
|
-
scope :untranslated, lambda { |lang| where("#{lang.to_s}_status" => 'untranslated') }
|
|
20
|
-
|
|
23
|
+
scope :translated, ->(lang) { where("#{lang.to_s}_status" => TRANSLATED) }
|
|
24
|
+
scope :pending, ->(lang) { where("#{lang.to_s}_status" => PENDING) }
|
|
25
|
+
scope :untranslated, ->(lang) { where("#{lang.to_s}_status" => UNTRANSLATED) }
|
|
21
26
|
|
|
22
27
|
# add a category of this translation key
|
|
23
28
|
def add_category
|
|
24
29
|
category_name = self.name.to_s.split('.').first
|
|
25
30
|
# if one word then add to general category
|
|
26
31
|
category_name = self.name.to_s.split('.').size == 1 ? 'general' : self.name.to_s.split('.').first
|
|
27
|
-
self.category = TranslationCenter::Category.
|
|
32
|
+
self.category = TranslationCenter::Category.where(name: category_name).first_or_create
|
|
28
33
|
self.last_accessed = Time.now
|
|
29
34
|
end
|
|
30
35
|
|
|
31
36
|
# updates the status of the translation key depending on the translations
|
|
32
37
|
def update_status(lang)
|
|
33
38
|
if self.translations.in(lang).blank?
|
|
34
|
-
self.update_attribute("#{lang}_status",
|
|
39
|
+
self.update_attribute("#{lang}_status", UNTRANSLATED)
|
|
35
40
|
elsif !self.translations.in(lang).accepted.blank?
|
|
36
|
-
self.update_attribute("#{lang}_status",
|
|
41
|
+
self.update_attribute("#{lang}_status", TRANSLATED)
|
|
37
42
|
else
|
|
38
|
-
self.update_attribute("#{lang}_status",
|
|
43
|
+
self.update_attribute("#{lang}_status", PENDING)
|
|
39
44
|
end
|
|
40
45
|
end
|
|
41
46
|
|
|
42
47
|
# returns true if the key is translated (has accepted translation) in this lang
|
|
43
48
|
def accepted_in?(lang)
|
|
44
|
-
self.send("#{lang}_status") ==
|
|
49
|
+
self.send("#{lang}_status") == TRANSLATED
|
|
45
50
|
end
|
|
46
51
|
alias_method :translated_in?, :accepted_in?
|
|
47
52
|
|
|
@@ -52,7 +57,7 @@ module TranslationCenter
|
|
|
52
57
|
|
|
53
58
|
# returns true if the translation key is untranslated (has no translations) in the language
|
|
54
59
|
def no_translations_in?(lang)
|
|
55
|
-
self.send("#{lang}_status") ==
|
|
60
|
+
self.send("#{lang}_status") == UNTRANSLATED
|
|
56
61
|
end
|
|
57
62
|
alias_method :untranslated_in?, :no_translations_in?
|
|
58
63
|
|
|
@@ -63,17 +68,17 @@ module TranslationCenter
|
|
|
63
68
|
|
|
64
69
|
# returns true if the key is pending (has translations but none is accepted)
|
|
65
70
|
def pending_in?(lang)
|
|
66
|
-
self.send("#{lang}_status") ==
|
|
71
|
+
self.send("#{lang}_status") == PENDING
|
|
67
72
|
end
|
|
68
73
|
|
|
69
74
|
# returns the status of the key in a language
|
|
70
75
|
def status(lang)
|
|
71
76
|
if accepted_in?(lang)
|
|
72
|
-
|
|
77
|
+
TRANSLATED
|
|
73
78
|
elsif pending_in?(lang)
|
|
74
|
-
|
|
79
|
+
PENDING
|
|
75
80
|
else
|
|
76
|
-
|
|
81
|
+
UNTRANSLATED
|
|
77
82
|
end
|
|
78
83
|
end
|
|
79
84
|
|
|
@@ -162,6 +167,12 @@ module TranslationCenter
|
|
|
162
167
|
end
|
|
163
168
|
|
|
164
169
|
private
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def translation_key_params
|
|
173
|
+
params.require(:translation_key).permit(:name, :last_accessed, :category_id)
|
|
174
|
+
end
|
|
175
|
+
|
|
165
176
|
def add_to_hash_rec(all_translations, levels, lang)
|
|
166
177
|
current_level = levels.first
|
|
167
178
|
# if we are at the bottom level just return the translation
|