tr8n 3.1.8 → 3.2.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.
- data/.gitignore +2 -1
- data/.rspec +1 -0
- data/.rvmrc +1 -1
- data/.watchr +18 -0
- data/Gemfile.lock +16 -10
- data/app/assets/images/tr8n/minus_node.png +0 -0
- data/app/assets/images/tr8n/pixel.gif +0 -0
- data/app/assets/images/tr8n/plus_node.png +0 -0
- data/app/assets/javascripts/tr8n/tr8n.js +1 -0
- data/app/assets/javascripts/tr8n/tr8n_client_sdk.js +581 -425
- data/app/assets/stylesheets/tr8n/layout.css.scss +1 -1
- data/app/assets/stylesheets/tr8n/tr8n.css.scss +20 -0
- data/app/controllers/tr8n/admin/base_controller.rb +4 -1
- data/app/controllers/tr8n/admin/clientsdk_controller.rb +1 -1
- data/app/controllers/tr8n/admin/metrics_controller.rb +30 -0
- data/app/controllers/tr8n/api/v1/base_controller.rb +12 -0
- data/app/controllers/tr8n/api/v1/language_controller.rb +7 -5
- data/app/controllers/tr8n/awards_controller.rb +1 -1
- data/app/controllers/tr8n/base_controller.rb +12 -6
- data/app/controllers/tr8n/dashboard_controller.rb +1 -1
- data/app/controllers/tr8n/forum_controller.rb +1 -1
- data/app/controllers/tr8n/glossary_controller.rb +1 -1
- data/app/controllers/tr8n/help_controller.rb +1 -1
- data/app/controllers/tr8n/phrases_controller.rb +1 -1
- data/app/controllers/tr8n/translator_controller.rb +8 -0
- data/app/helpers/tr8n/admin/base_helper.rb +1 -1
- data/app/helpers/tr8n/base_helper.rb +1 -1
- data/app/helpers/tr8n/dashboard_helper.rb +1 -1
- data/app/models/tr8n/base_filter.rb +1 -1
- data/app/models/tr8n/daily_language_metric.rb +1 -1
- data/app/models/tr8n/date_rule.rb +1 -1
- data/app/models/tr8n/gender_list_rule.rb +1 -1
- data/app/models/tr8n/gender_rule.rb +1 -1
- data/app/models/tr8n/glossary.rb +1 -1
- data/app/models/tr8n/glossary_filter.rb +1 -1
- data/app/models/tr8n/integration/ru/russian_gender_list_rule.rb +1 -1
- data/app/models/tr8n/integration/ru/russian_numeric_rule.rb +1 -1
- data/app/models/tr8n/ip_location.rb +1 -1
- data/app/models/tr8n/ip_location_filter.rb +1 -1
- data/app/models/tr8n/language.rb +19 -7
- data/app/models/tr8n/language_case.rb +1 -1
- data/app/models/tr8n/language_case_filter.rb +1 -1
- data/app/models/tr8n/language_case_rule.rb +1 -1
- data/app/models/tr8n/language_case_rule_filter.rb +1 -1
- data/app/models/tr8n/language_case_value_map.rb +1 -1
- data/app/models/tr8n/language_case_value_map_filter.rb +1 -1
- data/app/models/tr8n/language_filter.rb +1 -1
- data/app/models/tr8n/language_forum_abuse_report.rb +1 -1
- data/app/models/tr8n/language_forum_abuse_report_filter.rb +1 -1
- data/app/models/tr8n/language_forum_message.rb +1 -1
- data/app/models/tr8n/language_forum_message_filter.rb +1 -1
- data/app/models/tr8n/language_forum_topic.rb +1 -1
- data/app/models/tr8n/language_forum_topic_filter.rb +1 -1
- data/app/models/tr8n/language_metric.rb +1 -1
- data/app/models/tr8n/language_metric_filter.rb +1 -1
- data/app/models/tr8n/language_rule.rb +1 -1
- data/app/models/tr8n/language_rule_filter.rb +1 -1
- data/app/models/tr8n/language_user.rb +1 -1
- data/app/models/tr8n/language_user_filter.rb +1 -1
- data/app/models/tr8n/list_rule.rb +1 -1
- data/app/models/tr8n/monthly_language_metric.rb +1 -1
- data/app/models/tr8n/numeric_rule.rb +35 -28
- data/app/models/tr8n/sync_log.rb +1 -1
- data/app/models/tr8n/sync_log_filter.rb +1 -1
- data/app/models/tr8n/total_language_metric.rb +1 -1
- data/app/models/tr8n/translation.rb +4 -3
- data/app/models/tr8n/translation_domain.rb +11 -3
- data/app/models/tr8n/translation_domain_filter.rb +1 -1
- data/app/models/tr8n/translation_filter.rb +1 -1
- data/app/models/tr8n/translation_key.rb +73 -36
- data/app/models/tr8n/translation_key_comment.rb +1 -1
- data/app/models/tr8n/translation_key_comment_filter.rb +1 -1
- data/app/models/tr8n/translation_key_filter.rb +1 -1
- data/app/models/tr8n/translation_key_lock.rb +1 -1
- data/app/models/tr8n/translation_key_lock_filter.rb +1 -1
- data/app/models/tr8n/translation_key_source.rb +16 -5
- data/app/models/tr8n/translation_key_source_filter.rb +1 -1
- data/app/models/tr8n/translation_source.rb +12 -4
- data/app/models/tr8n/translation_source_filter.rb +1 -1
- data/app/models/tr8n/translation_source_language.rb +1 -1
- data/app/models/tr8n/translation_vote.rb +1 -1
- data/app/models/tr8n/translation_vote_filter.rb +1 -1
- data/app/models/tr8n/translator.rb +21 -5
- data/app/models/tr8n/translator_filter.rb +1 -1
- data/app/models/tr8n/translator_following.rb +1 -1
- data/app/models/tr8n/translator_following_filter.rb +1 -1
- data/app/models/tr8n/translator_log.rb +3 -3
- data/app/models/tr8n/translator_log_filter.rb +1 -1
- data/app/models/tr8n/translator_metric.rb +1 -1
- data/app/models/tr8n/translator_metric_filter.rb +1 -1
- data/app/models/tr8n/translator_report.rb +1 -1
- data/app/models/tr8n/translator_report_filter.rb +1 -1
- data/app/models/tr8n/value_rule.rb +1 -1
- data/app/views/tr8n/admin/clientsdk/index.html.erb +29 -29
- data/app/views/tr8n/admin/clientsdk/lb_samples.html.erb +1 -1
- data/app/views/tr8n/admin/metrics/_tabs.html.erb +22 -0
- data/app/views/tr8n/admin/metrics/index.html.erb +60 -0
- data/app/views/tr8n/common/_header.html.erb +3 -1
- data/app/views/tr8n/common/_language_selector.html.erb +4 -2
- data/app/views/tr8n/common/_scripts.html.erb +5 -0
- data/app/views/tr8n/common/_terms_of_service.html.erb +53 -0
- data/app/views/tr8n/help/credits.html.erb +4 -0
- data/app/views/tr8n/language/_select.html.erb +5 -1
- data/app/views/tr8n/translator/registration.html.erb +21 -0
- data/config/routes.rb +3 -1
- data/doc/classes.graffle +356 -7194
- data/lib/generators/tr8n/templates/config/tr8n/config.yml +9 -1
- data/lib/generators/tr8n/templates/config/tr8n/site/shortcuts.yml +1 -1
- data/lib/generators/tr8n/templates/config/tr8n/tokens/decorations.yml +4 -1
- data/lib/generators/tr8n/tr8n_generator.rb +1 -1
- data/lib/tasks/tr8n.rake +1 -1
- data/lib/tr8n.rb +23 -0
- data/lib/tr8n/active_dumper.rb +1 -1
- data/lib/tr8n/cache.rb +1 -8
- data/lib/tr8n/cache_adapters/memcached.rb +1 -1
- data/lib/tr8n/config.rb +37 -1
- data/lib/tr8n/dictionary.rb +1 -1
- data/lib/tr8n/engine.rb +4 -1
- data/lib/tr8n/exception.rb +1 -1
- data/lib/tr8n/extender.rb +1 -1
- data/lib/tr8n/extensions/action_controller_extension.rb +5 -4
- data/lib/tr8n/extensions/action_view_extension.rb +71 -20
- data/lib/tr8n/extensions/array_extension.rb +14 -1
- data/lib/tr8n/extensions/date_extension.rb +1 -1
- data/lib/tr8n/extensions/fixnum_extension.rb +1 -1
- data/lib/tr8n/extensions/hash_extension.rb +1 -1
- data/lib/tr8n/extensions/string_extension.rb +1 -1
- data/lib/tr8n/extensions/time_extension.rb +1 -1
- data/lib/tr8n/ip_address.rb +1 -1
- data/lib/tr8n/key_registration_exception.rb +1 -1
- data/lib/tr8n/keyboard_mapping.rb +1 -1
- data/lib/tr8n/logger.rb +1 -1
- data/lib/tr8n/railtie.rb +1 -1
- data/lib/tr8n/site_map.rb +1 -1
- data/lib/tr8n/site_map_section.rb +1 -1
- data/lib/tr8n/token.rb +1 -1
- data/lib/tr8n/token_exception.rb +1 -1
- data/lib/tr8n/tokenized_label.rb +2 -12
- data/lib/tr8n/tokens/data_token.rb +1 -1
- data/lib/tr8n/tokens/decoration_token.rb +1 -1
- data/lib/tr8n/tokens/hidden_token.rb +1 -1
- data/lib/tr8n/tokens/method_token.rb +1 -1
- data/lib/tr8n/tokens/transform_token.rb +1 -1
- data/lib/tr8n/version.rb +25 -1
- data/local/tr8n_server/app/models/user.rb +1 -0
- data/local/tr8n_server/config/environments/test.rb +1 -1
- data/local/tr8n_server/config/tr8n/config.yml +45 -39
- data/local/tr8n_server/config/tr8n/site/shortcuts.yml +1 -1
- data/local/tr8n_server/db/schema.rb +2 -0
- data/spec/controllers/awards_controller_spec.rb +22 -0
- data/spec/controllers/base_controller_spec.rb +6 -0
- data/spec/controllers/dashboard_controller_spec.rb +23 -0
- data/spec/controllers/forum_controller_spec.rb +23 -0
- data/spec/controllers/glossary_controller_spec.rb +22 -0
- data/spec/controllers/help_controller_spec.rb +22 -0
- data/spec/controllers/language_cases_controller_spec.rb +13 -0
- data/spec/controllers/language_controller_spec.rb +10 -0
- data/spec/controllers/phrases_controller_spec.rb +22 -0
- data/spec/controllers/translations_controller_spec.rb +23 -0
- data/spec/controllers/translator_controller_spec.rb +22 -0
- data/spec/lib/tokenized_label_spec.rb +42 -0
- data/spec/lib/tokens/data_token_spec.rb +49 -0
- data/spec/lib/tokens/decoration_token_spec.rb +49 -0
- data/spec/lib/tokens/hidden_token_spec.rb +53 -0
- data/spec/lib/tokens/method_token_spec.rb +61 -0
- data/spec/lib/tokens/transform_token_spec.rb +51 -0
- data/spec/models/tr8n/daily_language_metric_spec.rb +5 -0
- data/spec/models/tr8n/date_rule_spec.rb +5 -0
- data/spec/models/tr8n/gender_list_rule_spec.rb +5 -0
- data/spec/models/tr8n/gender_rule_spec.rb +141 -0
- data/spec/models/tr8n/glossary_spec.rb +5 -0
- data/spec/models/tr8n/ip_location_spec.rb +5 -0
- data/spec/models/tr8n/language_case_rule_spec.rb +5 -0
- data/spec/models/tr8n/language_case_spec.rb +5 -0
- data/spec/models/tr8n/language_case_value_map_spec.rb +5 -0
- data/spec/models/tr8n/language_forum_abuse_report_spec.rb +5 -0
- data/spec/models/tr8n/language_forum_message_spec.rb +5 -0
- data/spec/models/tr8n/language_forum_topic_spec.rb +5 -0
- data/spec/models/tr8n/language_metric_spec.rb +5 -0
- data/spec/models/tr8n/language_rule_spec.rb +5 -0
- data/spec/models/tr8n/language_spec.rb +79 -0
- data/spec/models/tr8n/language_user_spec.rb +5 -0
- data/spec/models/tr8n/list_rule_spec.rb +5 -0
- data/spec/models/tr8n/monthly_language_metric_spec.rb +5 -0
- data/spec/models/tr8n/numeric_rule_spec.rb +162 -0
- data/spec/models/tr8n/sync_log_spec.rb +5 -0
- data/spec/models/tr8n/total_language_metric_spec.rb +5 -0
- data/spec/models/tr8n/translation_domain_spec.rb +5 -0
- data/spec/models/tr8n/translation_key_comment_spec.rb +5 -0
- data/spec/models/tr8n/translation_key_lock_spec.rb +5 -0
- data/spec/models/tr8n/translation_key_source_spec.rb +5 -0
- data/spec/models/tr8n/translation_key_spec.rb +118 -0
- data/spec/models/tr8n/translation_source_language_spec.rb +5 -0
- data/spec/models/tr8n/translation_source_spec.rb +5 -0
- data/spec/models/tr8n/translation_spec.rb +5 -0
- data/spec/models/tr8n/translation_vote_spec.rb +5 -0
- data/spec/models/tr8n/translator_following_spec.rb +5 -0
- data/spec/models/tr8n/translator_log_spec.rb +5 -0
- data/spec/models/tr8n/translator_metric_spec.rb +5 -0
- data/spec/models/tr8n/translator_report_spec.rb +5 -0
- data/spec/models/tr8n/translator_spec.rb +140 -0
- data/spec/spec_helper.rb +26 -27
- data/tr8n.gemspec +3 -1
- metadata +173 -50
- data/local/tr8n_server/db/migrate/20110930041150_create_tr8n_tables.rb +0 -372
- data/spec/fake_app.rb +0 -50
- data/spec/lib/data_token_spec.rb +0 -26
- data/spec/lib/transform_token_spec.rb +0 -22
- data/spec/models/translation_key_spec.rb +0 -63
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2010-
|
|
2
|
+
# Copyright (c) 2010-2012 Michael Berkovich, tr8n.net
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
5
|
# a copy of this software and associated documentation files (the
|
|
@@ -52,8 +52,13 @@ class Tr8n::NumericRule < Tr8n::LanguageRule
|
|
|
52
52
|
token.send(Tr8n::Config.rules_engine[:numeric_rule][:object_method])
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
-
def
|
|
56
|
-
|
|
55
|
+
def self.sanitize_values(values)
|
|
56
|
+
return [] unless values
|
|
57
|
+
values.split(",").collect{|val| val.strip}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def self.humanize_values(values)
|
|
61
|
+
sanitize_values(values).join(", ")
|
|
57
62
|
end
|
|
58
63
|
|
|
59
64
|
# FORM: [object, singular, plural]
|
|
@@ -89,30 +94,7 @@ class Tr8n::NumericRule < Tr8n::LanguageRule
|
|
|
89
94
|
args[0].pluralize
|
|
90
95
|
end
|
|
91
96
|
|
|
92
|
-
def
|
|
93
|
-
token_value = number_token_value(token)
|
|
94
|
-
return false unless token_value
|
|
95
|
-
|
|
96
|
-
result1 = evaluate_partial_rule(token_value.to_s, definition[:part1].to_sym, sanitize_values(definition[:value1]))
|
|
97
|
-
return result1 unless definition[:multipart].to_s == "true"
|
|
98
|
-
|
|
99
|
-
result2 = evaluate_partial_rule(token_value.to_s, definition[:part2].to_sym, sanitize_values(definition[:value2]))
|
|
100
|
-
return (result1 or result2) if definition[:operator] == "or"
|
|
101
|
-
return (result1 and result2)
|
|
102
|
-
|
|
103
|
-
false
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def sanitize_values(values)
|
|
107
|
-
return [] unless values
|
|
108
|
-
values.split(",").collect{|val| val.strip}
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
def humanize_values(values)
|
|
112
|
-
sanitize_values(values).join(", ")
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
def evaluate_partial_rule(token_value, name, values)
|
|
97
|
+
def self.evaluate_rule_fragment(token_value, name, values)
|
|
116
98
|
if name == :is
|
|
117
99
|
return true if values.include?(token_value)
|
|
118
100
|
return false
|
|
@@ -140,6 +122,32 @@ class Tr8n::NumericRule < Tr8n::LanguageRule
|
|
|
140
122
|
false
|
|
141
123
|
end
|
|
142
124
|
|
|
125
|
+
def evaluate(token)
|
|
126
|
+
token_value = number_token_value(token)
|
|
127
|
+
return false unless token_value
|
|
128
|
+
|
|
129
|
+
result1 = self.class.evaluate_rule_fragment(token_value.to_s, definition[:part1].to_sym, sanitize_values(definition[:value1]))
|
|
130
|
+
return result1 unless definition[:multipart].to_s == "true"
|
|
131
|
+
|
|
132
|
+
result2 = self.class.evaluate_rule_fragment(token_value.to_s, definition[:part2].to_sym, sanitize_values(definition[:value2]))
|
|
133
|
+
return (result1 or result2) if definition[:operator] == "or"
|
|
134
|
+
return (result1 and result2)
|
|
135
|
+
|
|
136
|
+
false
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def number_token_value(token)
|
|
140
|
+
self.class.number_token_value(token)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def sanitize_values(values)
|
|
144
|
+
self.class.sanitize_values(values)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def humanize_values(values)
|
|
148
|
+
self.class.humanize_values(values)
|
|
149
|
+
end
|
|
150
|
+
|
|
143
151
|
def to_hash
|
|
144
152
|
{ :type => self.class.dependency,
|
|
145
153
|
:multipart => definition[:multipart], :operator => definition[:operator],
|
|
@@ -148,7 +156,6 @@ class Tr8n::NumericRule < Tr8n::LanguageRule
|
|
|
148
156
|
}
|
|
149
157
|
end
|
|
150
158
|
|
|
151
|
-
|
|
152
159
|
# used to describe a context of a given translation
|
|
153
160
|
def description
|
|
154
161
|
rule_desc = describe_partial_rule(definition[:part1].to_sym, definition[:value1])
|
data/app/models/tr8n/sync_log.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2010-
|
|
2
|
+
# Copyright (c) 2010-2012 Michael Berkovich, tr8n.net
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
5
|
# a copy of this software and associated documentation files (the
|
|
@@ -307,7 +307,8 @@ class Tr8n::Translation < ActiveRecord::Base
|
|
|
307
307
|
results = self.where("language_id = ?", language.id)
|
|
308
308
|
|
|
309
309
|
# ensure that only allowed translations are visible
|
|
310
|
-
|
|
310
|
+
allowed_level = Tr8n::Config.current_user_is_translator? ? Tr8n::Config.current_translator.level : 0
|
|
311
|
+
results = results.where("translation_key_id in (select id from tr8n_translation_keys where level <= ?)", allowed_level)
|
|
311
312
|
|
|
312
313
|
results = results.where("label like ?", "%#{params[:search]}%") unless params[:search].blank?
|
|
313
314
|
|
|
@@ -320,7 +321,7 @@ class Tr8n::Translation < ActiveRecord::Base
|
|
|
320
321
|
end
|
|
321
322
|
|
|
322
323
|
if params[:submitted_by] == "me"
|
|
323
|
-
results = results.where("translator_id = ?", Tr8n::Config.current_translator.id)
|
|
324
|
+
results = results.where("translator_id = ?", Tr8n::Config.current_user_is_translator? ? Tr8n::Config.current_translator.id : 0)
|
|
324
325
|
end
|
|
325
326
|
|
|
326
327
|
if params[:submitted_on] == "today"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2010-
|
|
2
|
+
# Copyright (c) 2010-2012 Michael Berkovich, tr8n.net
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
5
|
# a copy of this software and associated documentation files (the
|
|
@@ -34,15 +34,23 @@ class Tr8n::TranslationDomain < ActiveRecord::Base
|
|
|
34
34
|
alias :key_sources :translation_key_sources
|
|
35
35
|
alias :keys :translation_keys
|
|
36
36
|
|
|
37
|
+
def self.cache_key(domain_name)
|
|
38
|
+
"translation_domain_#{domain_name}"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def cache_key
|
|
42
|
+
self.class.cache_key(name)
|
|
43
|
+
end
|
|
44
|
+
|
|
37
45
|
def self.find_or_create(url = nil)
|
|
38
46
|
domain_name = URI.parse(url || 'localhost').host || 'localhost'
|
|
39
|
-
Tr8n::Cache.fetch(
|
|
47
|
+
Tr8n::Cache.fetch(cache_key(domain_name)) do
|
|
40
48
|
find_by_name(domain_name) || create(:name => domain_name)
|
|
41
49
|
end
|
|
42
50
|
end
|
|
43
51
|
|
|
44
52
|
def clear_cache
|
|
45
|
-
Tr8n::Cache.delete(
|
|
53
|
+
Tr8n::Cache.delete(cache_key)
|
|
46
54
|
end
|
|
47
55
|
|
|
48
56
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2010-
|
|
2
|
+
# Copyright (c) 2010-2012 Michael Berkovich, tr8n.net
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
5
|
# a copy of this software and associated documentation files (the
|
|
@@ -41,10 +41,19 @@ class Tr8n::TranslationKey < ActiveRecord::Base
|
|
|
41
41
|
alias :domains :translation_domains
|
|
42
42
|
alias :comments :translation_key_comments
|
|
43
43
|
|
|
44
|
+
|
|
45
|
+
def self.cache_key(key_hash)
|
|
46
|
+
"translation_key_#{key_hash}"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def cache_key
|
|
50
|
+
self.class.cache_key(key)
|
|
51
|
+
end
|
|
52
|
+
|
|
44
53
|
def self.find_or_create(label, desc = "", options = {})
|
|
45
54
|
key = generate_key(label, desc).to_s
|
|
46
55
|
|
|
47
|
-
tkey = Tr8n::Cache.fetch(
|
|
56
|
+
tkey = Tr8n::Cache.fetch(cache_key(key)) do
|
|
48
57
|
existing_key = where(:key => key).first
|
|
49
58
|
|
|
50
59
|
unless existing_key
|
|
@@ -61,31 +70,23 @@ class Tr8n::TranslationKey < ActiveRecord::Base
|
|
|
61
70
|
end
|
|
62
71
|
locale = options[:locale] || Tr8n::Config.block_options[:default_locale] || Tr8n::Config.default_locale
|
|
63
72
|
|
|
64
|
-
existing_key ||=
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
:admin => Tr8n::Config.block_options[:admin])
|
|
71
|
-
|
|
72
|
-
unless options[:source].blank?
|
|
73
|
-
# at the time of creation - mark the first source of the key
|
|
74
|
-
Tr8n::TranslationKeySource.find_or_create(new_tkey, Tr8n::TranslationSource.find_or_create(options[:source], options[:url]))
|
|
75
|
-
end
|
|
76
|
-
new_tkey
|
|
77
|
-
end
|
|
73
|
+
existing_key ||= create(:key => key.to_s,
|
|
74
|
+
:label => label,
|
|
75
|
+
:description => desc,
|
|
76
|
+
:locale => locale,
|
|
77
|
+
:level => level,
|
|
78
|
+
:admin => Tr8n::Config.block_options[:admin])
|
|
78
79
|
|
|
79
80
|
# for backwards compatibility only
|
|
80
81
|
mark_as_admin(existing_key, options)
|
|
81
82
|
update_default_locale(existing_key, options)
|
|
82
83
|
|
|
83
84
|
# mark each key as verified - but only if caching is enabled
|
|
85
|
+
# verification is used to cleanup unused keys
|
|
84
86
|
existing_key.update_attributes(:verified_at => Time.now) if Tr8n::Config.enable_caching?
|
|
85
87
|
existing_key
|
|
86
88
|
end
|
|
87
89
|
|
|
88
|
-
# for detailed tracking of all sources and caller stack - only needed for debugging - expensive
|
|
89
90
|
track_source(tkey, options)
|
|
90
91
|
tkey
|
|
91
92
|
end
|
|
@@ -106,20 +107,31 @@ class Tr8n::TranslationKey < ActiveRecord::Base
|
|
|
106
107
|
tkey.update_attributes(:locale => key_locale)
|
|
107
108
|
end
|
|
108
109
|
|
|
109
|
-
#
|
|
110
|
-
#
|
|
111
|
-
|
|
112
|
-
def self.track_source(tkey, options)
|
|
113
|
-
# return unless Tr8n::Config.enable_key_source_tracking?
|
|
114
|
-
# return if options[:source].blank?
|
|
110
|
+
# creates associations between the translation keys and sources
|
|
111
|
+
# used for the site map and javascript support
|
|
112
|
+
def self.track_source(translation_key, options)
|
|
115
113
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
114
|
+
# key source tracking or client sdk must be enabled for this to work
|
|
115
|
+
return unless Tr8n::Config.enable_key_source_tracking? or Tr8n::Config.enable_client_sdk?
|
|
116
|
+
|
|
117
|
+
# source can be passed into an individual key, or as a block or fall back on the controller/action
|
|
118
|
+
source = options[:source] || Tr8n::Config.block_options[:source] || Tr8n::Config.current_source
|
|
119
|
+
|
|
120
|
+
# should never be blank
|
|
121
|
+
return if source.blank?
|
|
122
|
+
|
|
123
|
+
# each page or component is identified by a translation source
|
|
124
|
+
translation_source = Tr8n::TranslationSource.find_or_create(source, options[:url])
|
|
125
|
+
|
|
126
|
+
# each key is associated with one or more sources
|
|
127
|
+
translation_key_source = Tr8n::TranslationKeySource.find_or_create(translation_key, translation_source)
|
|
128
|
+
|
|
129
|
+
# for debugging purposes only - this will track the actual location of the key in the source
|
|
130
|
+
return unless Tr8n::Config.enable_key_caller_tracking?
|
|
119
131
|
options[:caller] ||= caller
|
|
120
132
|
options[:caller_key] = options[:caller].is_a?(Array) ? options[:caller].join(", ") : options[:caller].to_s
|
|
121
133
|
options[:caller_key] = generate_key(options[:caller_key])
|
|
122
|
-
|
|
134
|
+
translation_key_source.update_details!(options)
|
|
123
135
|
end
|
|
124
136
|
|
|
125
137
|
def self.generate_key(label, desc = "")
|
|
@@ -130,7 +142,7 @@ class Tr8n::TranslationKey < ActiveRecord::Base
|
|
|
130
142
|
|
|
131
143
|
def reset_key!
|
|
132
144
|
# remove old key from cache
|
|
133
|
-
Tr8n::Cache.delete(
|
|
145
|
+
Tr8n::Cache.delete(cache_key)
|
|
134
146
|
self.update_attributes(:key => self.class.generate_key(label, description))
|
|
135
147
|
end
|
|
136
148
|
|
|
@@ -213,11 +225,14 @@ class Tr8n::TranslationKey < ActiveRecord::Base
|
|
|
213
225
|
not locked?(language)
|
|
214
226
|
end
|
|
215
227
|
|
|
216
|
-
def followed?(translator =
|
|
228
|
+
def followed?(translator = nil)
|
|
229
|
+
translator ||= (Tr8n::Config.current_user_is_translator? ? Tr8n::Config.current_translator : nil)
|
|
230
|
+
return false unless translator
|
|
217
231
|
Tr8n::TranslatorFollowing.following_for(translator, self)
|
|
218
232
|
end
|
|
219
233
|
|
|
220
234
|
def add_translation(label, rules = nil, language = Tr8n::Config.current_language, translator = Tr8n::Config.current_translator)
|
|
235
|
+
raise Tr8n::Exception.new("The translator is blocked and cannot submit translations") if translator.blocked?
|
|
221
236
|
raise Tr8n::Exception.new("The sentence contains dirty words") unless language.clean_sentence?(label)
|
|
222
237
|
translation = Tr8n::Translation.create(:translation_key => self, :language => language, :translator => translator, :label => label, :rules => rules)
|
|
223
238
|
translation.vote!(translator, 1)
|
|
@@ -441,7 +456,7 @@ class Tr8n::TranslationKey < ActiveRecord::Base
|
|
|
441
456
|
def default_decoration(language = Tr8n::Config.current_language, options = {})
|
|
442
457
|
return label if Tr8n::Config.current_user_is_guest?
|
|
443
458
|
return label unless Tr8n::Config.current_user_is_translator?
|
|
444
|
-
return label unless
|
|
459
|
+
return label unless can_be_translated?
|
|
445
460
|
return label if locked?(language)
|
|
446
461
|
|
|
447
462
|
classes = ['tr8n_translatable']
|
|
@@ -463,8 +478,23 @@ class Tr8n::TranslationKey < ActiveRecord::Base
|
|
|
463
478
|
super
|
|
464
479
|
end
|
|
465
480
|
|
|
466
|
-
def
|
|
467
|
-
|
|
481
|
+
def can_be_translated?(translator = nil)
|
|
482
|
+
return false if locked?
|
|
483
|
+
translator ||= (Tr8n::Config.current_user_is_translator? ? Tr8n::Config.current_translator : nil)
|
|
484
|
+
translator_level = translator ? translator.level : 0
|
|
485
|
+
translator_level >= level
|
|
486
|
+
end
|
|
487
|
+
|
|
488
|
+
def can_be_locked?(translator = nil)
|
|
489
|
+
translator ||= (Tr8n::Config.current_user_is_translator? ? Tr8n::Config.current_translator : nil)
|
|
490
|
+
return false unless translator
|
|
491
|
+
translator.admin? or translator.manager?
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
def can_be_unlocked?(translator = nil)
|
|
495
|
+
translator ||= (Tr8n::Config.current_user_is_translator? ? Tr8n::Config.current_translator : nil)
|
|
496
|
+
return false unless translator
|
|
497
|
+
translator.admin? or translator.manager?
|
|
468
498
|
end
|
|
469
499
|
|
|
470
500
|
def decorate_translation(language, translated_label, translated = true, options = {})
|
|
@@ -472,7 +502,7 @@ class Tr8n::TranslationKey < ActiveRecord::Base
|
|
|
472
502
|
return translated_label if Tr8n::Config.current_user_is_guest?
|
|
473
503
|
return translated_label unless Tr8n::Config.current_user_is_translator?
|
|
474
504
|
return translated_label unless Tr8n::Config.current_translator.enable_inline_translations?
|
|
475
|
-
return translated_label unless
|
|
505
|
+
return translated_label unless can_be_translated?
|
|
476
506
|
return translated_label if locked?(language)
|
|
477
507
|
return translated_label if self.language == language
|
|
478
508
|
|
|
@@ -522,8 +552,15 @@ class Tr8n::TranslationKey < ActiveRecord::Base
|
|
|
522
552
|
end
|
|
523
553
|
end
|
|
524
554
|
|
|
555
|
+
def touch_sources
|
|
556
|
+
sources.each do |source|
|
|
557
|
+
source.touch
|
|
558
|
+
end
|
|
559
|
+
end
|
|
560
|
+
|
|
525
561
|
def clear_cache
|
|
526
|
-
Tr8n::Cache.delete(
|
|
562
|
+
Tr8n::Cache.delete(cache_key)
|
|
563
|
+
touch_sources
|
|
527
564
|
end
|
|
528
565
|
|
|
529
566
|
###############################################################
|
|
@@ -643,7 +680,7 @@ class Tr8n::TranslationKey < ActiveRecord::Base
|
|
|
643
680
|
end
|
|
644
681
|
|
|
645
682
|
def self.for_params(params)
|
|
646
|
-
results = self.where("tr8n_translation_keys.locale <> ? and (level is null or level <= ?)", Tr8n::Config.current_language.locale, Tr8n::Config.current_translator.level)
|
|
683
|
+
results = self.where("tr8n_translation_keys.locale <> ? and (level is null or level <= ?)", Tr8n::Config.current_language.locale, Tr8n::Config.current_user_is_translator? ? Tr8n::Config.current_translator.level : 0)
|
|
647
684
|
|
|
648
685
|
if Tr8n::Config.enable_caching?
|
|
649
686
|
results = results.where("verified_at is not null")
|
|
@@ -669,7 +706,7 @@ class Tr8n::TranslationKey < ActiveRecord::Base
|
|
|
669
706
|
elsif params[:phrase_type] == "without"
|
|
670
707
|
results = results.where("tr8n_translation_keys.id not in (select tr8n_translations.translation_key_id from tr8n_translations where tr8n_translations.language_id = ?)", Tr8n::Config.current_language.id)
|
|
671
708
|
|
|
672
|
-
elsif params[:phrase_type] == "followed"
|
|
709
|
+
elsif params[:phrase_type] == "followed" and Tr8n::Config.current_user_is_translator?
|
|
673
710
|
results = results.where("tr8n_translation_keys.id in (select tr8n_translator_following.object_id from tr8n_translator_following where tr8n_translator_following.translator_id = ? and tr8n_translator_following.object_type = ?)", Tr8n::Config.current_translator.id, 'Tr8n::TranslationKey')
|
|
674
711
|
end
|
|
675
712
|
|