translation_center 1.7.2 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
![Alt text](https://raw.github.com/BadrIT/translation_center/master/samples/view_keys.png "View category translations")
|
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
|