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
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/.rvmrc
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
rvm 1.9.2@tr8n --create
|
|
1
|
+
rvm use 1.9.2@tr8n --create
|
data/.watchr
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
def run_spec(file)
|
|
2
|
+
unless File.exist?(file)
|
|
3
|
+
puts "#{file} does not exist"
|
|
4
|
+
return
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
puts "Running #{file}"
|
|
8
|
+
system "bundle exec rspec #{file}"
|
|
9
|
+
puts
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
watch("spec/.*/*_spec.rb") do |match|
|
|
13
|
+
run_spec match[0]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
watch("app/(.*/.*).rb") do |match|
|
|
17
|
+
run_spec %{spec/#{match[1]}_spec.rb}
|
|
18
|
+
end
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
tr8n (3.
|
|
4
|
+
tr8n (3.2.0)
|
|
5
5
|
coffee-script
|
|
6
6
|
kaminari
|
|
7
7
|
rails (>= 3.1.0)
|
|
@@ -40,7 +40,7 @@ GEM
|
|
|
40
40
|
activesupport (= 3.1.0)
|
|
41
41
|
activesupport (3.1.0)
|
|
42
42
|
multi_json (~> 1.0)
|
|
43
|
-
arel (2.2.
|
|
43
|
+
arel (2.2.3)
|
|
44
44
|
bcrypt-ruby (3.0.1)
|
|
45
45
|
builder (3.0.0)
|
|
46
46
|
capybara (1.1.1)
|
|
@@ -56,11 +56,11 @@ GEM
|
|
|
56
56
|
coffee-script (2.2.0)
|
|
57
57
|
coffee-script-source
|
|
58
58
|
execjs
|
|
59
|
-
coffee-script-source (1.
|
|
59
|
+
coffee-script-source (1.2.0)
|
|
60
60
|
database_cleaner (0.6.7)
|
|
61
61
|
diff-lcs (1.1.3)
|
|
62
62
|
erubis (2.7.0)
|
|
63
|
-
execjs (1.
|
|
63
|
+
execjs (1.3.0)
|
|
64
64
|
multi_json (~> 1.0)
|
|
65
65
|
factory_girl (2.1.2)
|
|
66
66
|
activesupport
|
|
@@ -68,9 +68,11 @@ GEM
|
|
|
68
68
|
hike (1.2.1)
|
|
69
69
|
i18n (0.6.0)
|
|
70
70
|
json_pure (1.6.1)
|
|
71
|
-
kaminari (0.
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
kaminari (0.13.0)
|
|
72
|
+
actionpack (>= 3.0.0)
|
|
73
|
+
activesupport (>= 3.0.0)
|
|
74
|
+
railties (>= 3.0.0)
|
|
75
|
+
mail (2.3.3)
|
|
74
76
|
i18n (>= 0.4.0)
|
|
75
77
|
mime-types (~> 1.16)
|
|
76
78
|
treetop (~> 1.4.8)
|
|
@@ -129,7 +131,7 @@ GEM
|
|
|
129
131
|
ruby_parser (2.0.6)
|
|
130
132
|
sexp_processor (~> 3.0)
|
|
131
133
|
rubyzip (0.9.4)
|
|
132
|
-
sass (3.1.
|
|
134
|
+
sass (3.1.15)
|
|
133
135
|
selenium-webdriver (2.7.0)
|
|
134
136
|
childprocess (>= 0.2.1)
|
|
135
137
|
ffi (>= 1.0.7)
|
|
@@ -137,6 +139,7 @@ GEM
|
|
|
137
139
|
rubyzip
|
|
138
140
|
sexp_processor (3.0.7)
|
|
139
141
|
slop (2.1.0)
|
|
142
|
+
spork (0.9.0)
|
|
140
143
|
sprockets (2.0.1)
|
|
141
144
|
hike (~> 1.2)
|
|
142
145
|
rack (~> 1.0)
|
|
@@ -150,7 +153,8 @@ GEM
|
|
|
150
153
|
treetop (1.4.10)
|
|
151
154
|
polyglot
|
|
152
155
|
polyglot (>= 0.3.1)
|
|
153
|
-
tzinfo (0.3.
|
|
156
|
+
tzinfo (0.3.32)
|
|
157
|
+
watchr (0.7)
|
|
154
158
|
will_filter (3.1.3)
|
|
155
159
|
coffee-script
|
|
156
160
|
kaminari
|
|
@@ -171,7 +175,9 @@ DEPENDENCIES
|
|
|
171
175
|
pry
|
|
172
176
|
rr
|
|
173
177
|
rspec
|
|
174
|
-
rspec-rails
|
|
178
|
+
rspec-rails (>= 2.1.0)
|
|
179
|
+
spork
|
|
175
180
|
sqlite3
|
|
176
181
|
steak
|
|
177
182
|
tr8n!
|
|
183
|
+
watchr
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -735,6 +735,7 @@ Tr8n.Utils = {
|
|
|
735
735
|
}
|
|
736
736
|
|
|
737
737
|
request.open(options.method, url, true);
|
|
738
|
+
request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
|
738
739
|
request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
|
|
739
740
|
request.setRequestHeader('Accept', 'text/javascript, text/html, application/xml, text/xml, */*');
|
|
740
741
|
request.send(options.parameters);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/****************************************************************************
|
|
2
|
-
Copyright (c) 2010-
|
|
2
|
+
Copyright (c) 2010-2012 Michael Berkovich
|
|
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
|
|
@@ -45,33 +45,47 @@ var Tr8n = Tr8n || {
|
|
|
45
45
|
****************************************************************************/
|
|
46
46
|
|
|
47
47
|
Tr8n.Proxy = function(options) {
|
|
48
|
-
|
|
48
|
+
var self = this;
|
|
49
49
|
this.options = options;
|
|
50
|
-
|
|
50
|
+
this.options['url'] = this.options['url'] || '/tr8n/api/v1/language/translate';
|
|
51
51
|
this.options['scheduler_interval'] = this.options['scheduler_interval'] || 20000;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
this.logger_enabled = false;
|
|
53
|
+
this.missing_translations_locked = false;
|
|
54
|
+
this.inline_translations_enabled = this.options['enable_inline_translations'];
|
|
55
|
+
this.logger = new Tr8n.Proxy.Logger({
|
|
56
56
|
'proxy': self,
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
'element_id': options['logger_element_id'] || 'tr8n_debugger'
|
|
58
|
+
});
|
|
59
59
|
|
|
60
60
|
this.language = new Tr8n.Proxy.Language({
|
|
61
61
|
'proxy': self
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
this.initTranslations();
|
|
65
|
+
this.runScheduledTasks();
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
Tr8n.Proxy.prototype = {
|
|
69
69
|
log: function(msg) {
|
|
70
70
|
this.logger.debug(msg);
|
|
71
71
|
},
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
72
|
+
logSettings: function() {
|
|
73
|
+
this.logger.clear();
|
|
74
|
+
this.logger.logObject(this.options);
|
|
75
|
+
},
|
|
76
|
+
logTranslations: function() {
|
|
77
|
+
this.logger.clear();
|
|
78
|
+
this.translations = this.translations || {};
|
|
79
|
+
this.logger.logObject(this.translations);
|
|
80
|
+
},
|
|
81
|
+
logMissingTranslations: function() {
|
|
82
|
+
this.logger.clear();
|
|
83
|
+
this.missing_translation_keys = this.missing_translation_keys || {};
|
|
84
|
+
this.logger.logObject(this.missing_translation_keys);
|
|
85
|
+
},
|
|
86
|
+
disableLogger: function() {
|
|
87
|
+
this.logger_enabled = false;
|
|
88
|
+
},
|
|
75
89
|
enableLogger: function() {
|
|
76
90
|
this.logger_enabled = true;
|
|
77
91
|
},
|
|
@@ -81,75 +95,95 @@ Tr8n.Proxy.prototype = {
|
|
|
81
95
|
error: function(msg) {
|
|
82
96
|
this.logger.error(msg);
|
|
83
97
|
},
|
|
84
|
-
|
|
98
|
+
translate: function(label, description, tokens, options) {
|
|
99
|
+
if (!label) return "";
|
|
100
|
+
description = description || "";
|
|
101
|
+
tokens = tokens || {};
|
|
102
|
+
options = options || {};
|
|
85
103
|
return this.language.translate(label, description, tokens, options);
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
104
|
+
},
|
|
105
|
+
tr: function(label, description, tokens, options) {
|
|
106
|
+
return this.translate(label, description, tokens, options);
|
|
107
|
+
},
|
|
108
|
+
trl: function(label, description, tokens, options) {
|
|
109
|
+
options = options || {};
|
|
110
|
+
options['skip_decorations'] = true;
|
|
111
|
+
return this.translate(label, description, tokens, options);
|
|
112
|
+
},
|
|
90
113
|
getTranslations: function() {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
},
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
114
|
+
this.translations = this.translations || {};
|
|
115
|
+
return this.translations;
|
|
116
|
+
},
|
|
117
|
+
getDecorationFor: function(decoration_name) {
|
|
118
|
+
if (!this.options['default_decorations'])
|
|
119
|
+
return null;
|
|
120
|
+
return this.options['default_decorations'][decoration_name];
|
|
121
|
+
},
|
|
122
|
+
getLanguageRuleForType: function(rule_type) {
|
|
123
|
+
// modify this section to add more rules
|
|
124
|
+
if (rule_type == 'number') return 'Tr8n.Proxy.NumericRule';
|
|
102
125
|
if (rule_type == 'gender') return 'Tr8n.Proxy.GenderRule';
|
|
103
126
|
if (rule_type == 'date') return 'Tr8n.Proxy.DateRule';
|
|
104
127
|
if (rule_type == 'list') return 'Tr8n.Proxy.ListRule';
|
|
105
128
|
if (rule_type == 'gender_list') return 'Tr8n.Proxy.GenderListRule';
|
|
106
|
-
return null;
|
|
107
|
-
|
|
129
|
+
return null;
|
|
130
|
+
},
|
|
108
131
|
getLanguageRuleForTokenSuffix: function(token_suffix) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
132
|
+
if (!this.options['rules']) return null;
|
|
133
|
+
|
|
134
|
+
for (rule_type in this.options['rules']) {
|
|
135
|
+
var suffixes = this.options['rules'][rule_type]['token_suffixes'];
|
|
136
|
+
if (!suffixes) continue;
|
|
137
|
+
|
|
115
138
|
if (Tr8n.Proxy.Utils.indexOf(suffixes, token_suffix) != -1 )
|
|
116
|
-
|
|
117
|
-
|
|
139
|
+
return this.getLanguageRuleForType(rule_type);
|
|
140
|
+
}
|
|
118
141
|
return null;
|
|
119
142
|
},
|
|
120
|
-
|
|
121
|
-
|
|
143
|
+
|
|
144
|
+
registerTranslationKeys: function(translations) {
|
|
122
145
|
this.log("Found " + translations.length + " registered phrases");
|
|
123
146
|
for (i = 0; i < translations.length; i++) {
|
|
124
|
-
|
|
147
|
+
var translation_key = translations[i];
|
|
125
148
|
this.log("Registering " + translation_key['key']);
|
|
126
149
|
this.translations[translation_key['key']] = translation_key;
|
|
127
150
|
}
|
|
128
|
-
|
|
151
|
+
},
|
|
152
|
+
|
|
129
153
|
initTranslations: function(forced) {
|
|
130
154
|
if (!forced && this.translations) return;
|
|
155
|
+
|
|
156
|
+
this.translations = {};
|
|
157
|
+
|
|
158
|
+
// Check for page variable to load translations from, if variable was provided
|
|
159
|
+
if (this.options['translations_cache_id']) {
|
|
160
|
+
this.log("Registering page translations from translations cache...");
|
|
161
|
+
this.updateTranslations(eval(this.options['translations_cache_id']));
|
|
162
|
+
}
|
|
131
163
|
|
|
132
164
|
var self = this;
|
|
133
|
-
self.translations = {};
|
|
134
165
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
this.
|
|
138
|
-
|
|
166
|
+
// Optionally, fetch translations from the server
|
|
167
|
+
if (this.options['fetch_translations_on_init']) {
|
|
168
|
+
this.log("Fetching translations from the server...");
|
|
169
|
+
Tr8n.Proxy.Utils.ajax(this.options['url'], {
|
|
170
|
+
method: 'get',
|
|
171
|
+
parameters: {'batch': true, 'source': self.options['default_source']},
|
|
172
|
+
onSuccess: function(response) {
|
|
173
|
+
self.log("Received response from the server");
|
|
174
|
+
self.log(response.responseText);
|
|
175
|
+
self.updateTranslations(eval("[" + response.responseText + "]")[0]['phrases']);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
139
178
|
}
|
|
179
|
+
},
|
|
140
180
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
onSuccess: function(response) {
|
|
146
|
-
self.log("Received response from the server");
|
|
147
|
-
self.log(response.responseText);
|
|
148
|
-
self.registerTranslationKeys(eval("[" + response.responseText + "]")[0]['phrases']);
|
|
149
|
-
}
|
|
150
|
-
});
|
|
181
|
+
updateTranslations: function(new_translations) {
|
|
182
|
+
this.translations = this.translations || {};
|
|
183
|
+
this.log("Updating page translations...");
|
|
184
|
+
this.registerTranslationKeys(new_translations);
|
|
151
185
|
},
|
|
152
|
-
|
|
186
|
+
|
|
153
187
|
registerMissingTranslationKey: function(translation_key, token_values, options) {
|
|
154
188
|
this.missing_translation_keys = this.missing_translation_keys || {};
|
|
155
189
|
if (!this.missing_translation_keys[translation_key.key]) {
|
|
@@ -158,30 +192,30 @@ Tr8n.Proxy.prototype = {
|
|
|
158
192
|
}
|
|
159
193
|
},
|
|
160
194
|
submitMissingTranslationKeys: function() {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
195
|
+
if (this.missing_translations_locked) {
|
|
196
|
+
this.log('Missing translations are being processed, postponding registration task.');
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
|
|
166
200
|
this.missing_translation_keys = this.missing_translation_keys || {};
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
201
|
+
|
|
202
|
+
var phrases = "[";
|
|
203
|
+
for (var key in this.missing_translation_keys) {
|
|
204
|
+
var translation_key = this.missing_translation_keys[key].translation_key;
|
|
205
|
+
if (translation_key == null) continue;
|
|
206
|
+
if (phrases!="[") phrases = phrases + ",";
|
|
173
207
|
phrases = phrases + "{";
|
|
174
|
-
|
|
208
|
+
phrases = phrases + '"label":"' + translation_key.label + '", ';
|
|
175
209
|
phrases = phrases + '"description":"' + translation_key.description + '"';
|
|
176
210
|
phrases = phrases + "}";
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
211
|
+
}
|
|
212
|
+
phrases = phrases + "]";
|
|
213
|
+
|
|
180
214
|
if (phrases == '[]') {
|
|
181
215
|
// this.log('No missing translation keys to submit...');
|
|
182
216
|
return;
|
|
183
217
|
}
|
|
184
|
-
|
|
218
|
+
|
|
185
219
|
var self = this;
|
|
186
220
|
this.debug('Submitting missing translation keys: ' + phrases);
|
|
187
221
|
Tr8n.Proxy.Utils.ajax(this.options['url'], {
|
|
@@ -190,42 +224,42 @@ Tr8n.Proxy.prototype = {
|
|
|
190
224
|
onSuccess: function(response) {
|
|
191
225
|
self.log("Received response from the server");
|
|
192
226
|
self.log(response.responseText);
|
|
193
|
-
|
|
227
|
+
self.updateMissingTranslationKeys(eval("[" + response.responseText + "]")[0]['phrases']);
|
|
194
228
|
}
|
|
195
229
|
});
|
|
196
230
|
},
|
|
197
231
|
updateMissingTranslationKeys: function(translations) {
|
|
198
|
-
|
|
232
|
+
this.missing_translations_locked = true;
|
|
199
233
|
this.log("Received " + translations.length + " registered phrases...");
|
|
200
234
|
for (i = 0; i < translations.length; i++) {
|
|
201
235
|
var translation_key_data = translations[i];
|
|
202
|
-
|
|
236
|
+
|
|
203
237
|
this.log("Registering new key " + translation_key_data.key);
|
|
204
238
|
this.translations[translation_key_data.key] = translation_key_data;
|
|
205
239
|
var missing_key_data = this.missing_translation_keys[translation_key_data.key];
|
|
206
240
|
var tr8nElement = Tr8n.element(translation_key_data.key);
|
|
207
241
|
|
|
208
242
|
if (tr8nElement && missing_key_data.translation_key) {
|
|
209
|
-
|
|
243
|
+
tr8nElement.innerHTML = missing_key_data.translation_key.translate(this.language, missing_key_data.token_values, {skip_decorations:true});
|
|
210
244
|
tr8nElement.setAttribute('translation_key_id', translation_key_data['id']);
|
|
211
245
|
if (this.inline_translations_enabled) {
|
|
212
|
-
|
|
213
|
-
|
|
246
|
+
tr8nElement.className = 'tr8n_translatable tr8n_not_translated';
|
|
247
|
+
}
|
|
214
248
|
}
|
|
215
249
|
|
|
216
250
|
delete this.missing_translation_keys[missing_key_data.translation_key.key];
|
|
217
251
|
}
|
|
218
|
-
|
|
219
|
-
},
|
|
252
|
+
this.missing_translations_locked = false;
|
|
253
|
+
},
|
|
220
254
|
runScheduledTasks: function() {
|
|
221
255
|
var self = this;
|
|
222
|
-
|
|
256
|
+
|
|
223
257
|
// this.log("Running scheduled tasks...");
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
258
|
+
this.submitMissingTranslationKeys();
|
|
259
|
+
|
|
260
|
+
window.setTimeout(function() {
|
|
261
|
+
self.runScheduledTasks();
|
|
262
|
+
}, this.options['scheduler_interval']);
|
|
229
263
|
},
|
|
230
264
|
}
|
|
231
265
|
|
|
@@ -241,11 +275,11 @@ Tr8n.Proxy.Language.prototype = {
|
|
|
241
275
|
getProxy: function() {
|
|
242
276
|
return this.options['proxy'];
|
|
243
277
|
},
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
278
|
+
getLogger: function() {
|
|
279
|
+
return this.getProxy().logger;
|
|
280
|
+
},
|
|
247
281
|
translate: function(label, description, tokens, options) {
|
|
248
|
-
|
|
282
|
+
return (new Tr8n.Proxy.TranslationKey(label, description, {'proxy': this.getProxy()}).translate(this, tokens, options));
|
|
249
283
|
}
|
|
250
284
|
}
|
|
251
285
|
|
|
@@ -267,51 +301,51 @@ Tr8n.Proxy.TranslationKey.prototype = {
|
|
|
267
301
|
getLogger: function() {
|
|
268
302
|
return this.getProxy().logger;
|
|
269
303
|
},
|
|
270
|
-
|
|
271
|
-
|
|
304
|
+
findFirstAcceptableTranslation: function(translations, token_values) {
|
|
305
|
+
// check for a single translation case - no context rules
|
|
272
306
|
if (translations['label']!=null) {
|
|
273
307
|
this.getLogger().debug('Found a single translation: ' + translations['label']);
|
|
274
308
|
return translations;
|
|
275
309
|
}
|
|
276
310
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
311
|
+
translations = translations['labels'];
|
|
312
|
+
if (!translations) {
|
|
313
|
+
this.getLogger().error("Translations are in a weird form...");
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
282
316
|
|
|
283
317
|
this.getLogger().debug('Found translations: ' + translations.length);
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
318
|
+
for (var i=0; i<translations.length; i++) {
|
|
319
|
+
this.getLogger().debug("Checking context rules for:" + translations[i]['label']);
|
|
320
|
+
|
|
321
|
+
if (!translations[i]['context']) {
|
|
288
322
|
this.getLogger().debug("Translation has no context, using it by default");
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
323
|
+
return translations[i];
|
|
324
|
+
}
|
|
325
|
+
var valid_context = true;
|
|
326
|
+
|
|
327
|
+
for (var token in translations[i]['context']) {
|
|
328
|
+
if (!valid_context) continue;
|
|
329
|
+
var token_context = translations[i]['context'][token];
|
|
330
|
+
var rule_name = this.getProxy().getLanguageRuleForType(token_context['type']);
|
|
297
331
|
this.getLogger().debug("Evaluating rule: " + rule_name);
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
332
|
+
var options = {'proxy': this.getProxy()};
|
|
333
|
+
var rule = eval("new " + rule_name + "(token_context, options)");
|
|
334
|
+
valid_context = valid_context && rule.evaluate(token, token_values);
|
|
335
|
+
}
|
|
336
|
+
|
|
303
337
|
if (valid_context) {
|
|
304
338
|
this.getLogger().debug("Found valid translation: " + translations[i].label);
|
|
305
|
-
|
|
306
|
-
|
|
339
|
+
return translations[i];
|
|
340
|
+
} else {
|
|
307
341
|
this.getLogger().debug("The rules were not matched for: " + translations[i].label);
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
311
345
|
this.getLogger().debug('No acceptable ranslations found');
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
346
|
+
return null;
|
|
347
|
+
},
|
|
348
|
+
|
|
315
349
|
translate: function(language, token_values, options) {
|
|
316
350
|
if (!this.label) {
|
|
317
351
|
this.getLogger().error('Label must always be provided for the translate method');
|
|
@@ -320,95 +354,95 @@ Tr8n.Proxy.TranslationKey.prototype = {
|
|
|
320
354
|
|
|
321
355
|
var translations = this.getProxy().getTranslations();
|
|
322
356
|
var translation_key = translations[this.key];
|
|
323
|
-
|
|
357
|
+
|
|
324
358
|
if (translation_key) {
|
|
325
359
|
this.getLogger().debug("Found translations, evaluating rules...");
|
|
326
|
-
|
|
360
|
+
|
|
327
361
|
this.id = translation_key.id;
|
|
328
|
-
|
|
362
|
+
this.original = translation_key.original;
|
|
329
363
|
var translation = this.findFirstAcceptableTranslation(translation_key, token_values);
|
|
330
364
|
|
|
331
365
|
if (translation) {
|
|
332
366
|
this.getLogger().debug("Found a valid match: " + translation.label);
|
|
333
|
-
|
|
334
|
-
|
|
367
|
+
return this.substituteTokens(translation['label'], token_values, options);
|
|
368
|
+
} else {
|
|
335
369
|
this.getLogger().debug("No valid match found, using default language");
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
370
|
+
return this.substituteTokens(this.label, token_values, options);
|
|
371
|
+
}
|
|
372
|
+
|
|
339
373
|
} else {
|
|
340
|
-
this.getLogger().debug("Translation not found, using default language");
|
|
341
|
-
|
|
374
|
+
this.getLogger().debug("Translation not found, using default language");
|
|
375
|
+
}
|
|
342
376
|
|
|
343
377
|
this.getProxy().registerMissingTranslationKey(this, token_values, options);
|
|
344
378
|
this.getLogger().debug('No translation found. Using default...');
|
|
345
379
|
return this.substituteTokens(this.label, token_values, options);
|
|
346
380
|
},
|
|
347
|
-
|
|
381
|
+
|
|
348
382
|
generateKey: function() {
|
|
349
383
|
this.key = this.label + ";;;";
|
|
350
|
-
|
|
351
|
-
|
|
384
|
+
if (this.description) this.key = this.key + this.description;
|
|
385
|
+
|
|
352
386
|
this.getLogger().debug('Preparing label signature: ' + this.key);
|
|
353
387
|
this.key = MD5(this.key);
|
|
354
388
|
this.getLogger().debug('Label signature: ' + this.key);
|
|
355
|
-
|
|
389
|
+
},
|
|
356
390
|
|
|
357
391
|
registerDataTokens: function(label) {
|
|
358
392
|
this.data_tokens = [];
|
|
359
|
-
|
|
393
|
+
this.data_tokens = this.data_tokens.concat(Tr8n.Proxy.DataToken.parse(label, {'key': this, 'proxy':this.getProxy()}));
|
|
360
394
|
this.data_tokens = this.data_tokens.concat(Tr8n.Proxy.TransformToken.parse(label, {'key': this, 'proxy':this.getProxy()}));
|
|
361
395
|
},
|
|
362
396
|
|
|
363
|
-
|
|
397
|
+
registerDecorationTokens: function(label) {
|
|
364
398
|
this.decoration_tokens = [];
|
|
365
399
|
this.decoration_tokens = this.decoration_tokens.concat(Tr8n.Proxy.DecorationToken.parse(label, {'key': this, 'proxy':this.getProxy()}));
|
|
366
400
|
},
|
|
367
401
|
|
|
368
402
|
substituteTokens: function(label, token_values, options) {
|
|
369
403
|
this.registerDataTokens(label);
|
|
370
|
-
|
|
404
|
+
if (!this.data_tokens) return this.decorateLabel(label, options);
|
|
371
405
|
for (var i = 0; i < this.data_tokens.length; i++) {
|
|
372
|
-
|
|
373
|
-
|
|
406
|
+
label = this.data_tokens[i].substitute(label, token_values || {});
|
|
407
|
+
}
|
|
374
408
|
|
|
375
409
|
this.registerDecorationTokens(label);
|
|
376
410
|
if (!this.decoration_tokens) return label;
|
|
377
411
|
for (var i = 0; i < this.decoration_tokens.length; i++) {
|
|
378
412
|
label = this.decoration_tokens[i].substitute(label, token_values || {});
|
|
379
413
|
}
|
|
380
|
-
|
|
381
|
-
|
|
414
|
+
|
|
415
|
+
return this.decorateLabel(label, options);
|
|
382
416
|
},
|
|
383
|
-
|
|
417
|
+
|
|
384
418
|
decorateLabel: function(label, options){
|
|
385
|
-
|
|
386
|
-
|
|
419
|
+
options = options || {};
|
|
420
|
+
if (options['skip_decorations'])
|
|
387
421
|
return label;
|
|
388
|
-
|
|
422
|
+
|
|
389
423
|
html = [];
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
424
|
+
html.push("<tr8n ");
|
|
425
|
+
|
|
426
|
+
if (this.id)
|
|
427
|
+
html.push(" translation_key_id='" + this.id + "' ");
|
|
428
|
+
|
|
395
429
|
if (this.key)
|
|
396
430
|
html.push(" id='" + this.key + "' ");
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
431
|
+
|
|
432
|
+
var klasses = ['tr8n_translatable'];
|
|
433
|
+
|
|
434
|
+
if (this.original)
|
|
435
|
+
klasses.push('tr8n_not_translated');
|
|
436
|
+
else
|
|
403
437
|
klasses.push('tr8n_translated');
|
|
404
438
|
|
|
405
|
-
|
|
439
|
+
if (this.getProxy().inline_translations_enabled && this.id)
|
|
406
440
|
html.push(" class='" + klasses.join(' ') + "'");
|
|
407
|
-
|
|
441
|
+
|
|
408
442
|
html.push(">");
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
443
|
+
html.push(label);
|
|
444
|
+
html.push("</tr8n>");
|
|
445
|
+
return html.join("");
|
|
412
446
|
}
|
|
413
447
|
}
|
|
414
448
|
|
|
@@ -425,27 +459,27 @@ Tr8n.Proxy.LanguageRule.prototype = {
|
|
|
425
459
|
getLogger: function() {
|
|
426
460
|
return this.getProxy().logger;
|
|
427
461
|
},
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
462
|
+
getTokenValue: function(token_name, token_values) {
|
|
463
|
+
var object = token_values[token_name];
|
|
464
|
+
if (object == null) {
|
|
431
465
|
this.getLogger().error("Invalid token value for token: " + token_name);
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
return object;
|
|
469
|
+
},
|
|
470
|
+
getDefinitionDescription: function() {
|
|
437
471
|
var result = [];
|
|
438
472
|
for (var key in this.definition)
|
|
439
473
|
result.push(key + ": '" + this.definition[key] + "'");
|
|
440
|
-
return "{" + result.join(", ") + "}";
|
|
441
|
-
|
|
474
|
+
return "{" + result.join(", ") + "}";
|
|
475
|
+
},
|
|
442
476
|
sanitizeArrayValue: function(value) {
|
|
443
477
|
var results = [];
|
|
444
478
|
var arr = value.split(',');
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
479
|
+
for (var index = 0; index < arr.length; index++) {
|
|
480
|
+
results.push(Tr8n.Proxy.Utils.trim(arr[index]));
|
|
481
|
+
}
|
|
482
|
+
return results;
|
|
449
483
|
}
|
|
450
484
|
}
|
|
451
485
|
|
|
@@ -454,7 +488,7 @@ Tr8n.Proxy.LanguageRule.prototype = {
|
|
|
454
488
|
****************************************************************************/
|
|
455
489
|
|
|
456
490
|
Tr8n.Proxy.NumericRule = function(definition, options) {
|
|
457
|
-
|
|
491
|
+
this.definition = definition;
|
|
458
492
|
this.options = options;
|
|
459
493
|
}
|
|
460
494
|
|
|
@@ -465,36 +499,36 @@ Tr8n.Proxy.NumericRule.prototype = new Tr8n.Proxy.LanguageRule();
|
|
|
465
499
|
// {count | message, messages}
|
|
466
500
|
// {count | person, people}
|
|
467
501
|
Tr8n.Proxy.NumericRule.transform = function(count, values) {
|
|
468
|
-
|
|
469
|
-
|
|
502
|
+
if (count == 1) return values[0];
|
|
503
|
+
return values[1];
|
|
470
504
|
}
|
|
471
505
|
|
|
472
506
|
Tr8n.Proxy.NumericRule.prototype.evaluate = function(token_name, token_values){
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
507
|
+
// "count":{"value1":"2,3,4","operator":"and","type":"number","multipart":true,"part2":"does_not_end_in","value2":"12,13,14","part1":"ends_in"}
|
|
508
|
+
|
|
509
|
+
var object = this.getTokenValue(token_name, token_values);
|
|
510
|
+
if (object == null) return false;
|
|
477
511
|
|
|
478
|
-
|
|
512
|
+
var token_value = null;
|
|
479
513
|
if (typeof object == 'string' || typeof object == 'number') {
|
|
480
514
|
token_value = "" + object;
|
|
481
|
-
|
|
515
|
+
} else if (typeof object == 'object' && object['subject']) {
|
|
482
516
|
token_value = "" + object['subject'];
|
|
483
|
-
|
|
517
|
+
} else {
|
|
484
518
|
this.getLogger().error("Invalid token value for numeric token: " + token_name);
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
519
|
+
return false;
|
|
520
|
+
}
|
|
521
|
+
|
|
488
522
|
this.getLogger().debug("Rule value: '" + token_value + "' for definition: " + this.getDefinitionDescription());
|
|
489
|
-
|
|
523
|
+
|
|
490
524
|
var result1 = this.evaluatePartialRule(token_value, this.definition['part1'], this.sanitizeArrayValue(this.definition['value1']));
|
|
491
|
-
|
|
525
|
+
if (this.definition['multipart'] == 'false' || this.definition['multipart'] == false || this.definition['multipart'] == null) return result1;
|
|
492
526
|
this.getLogger().debug("Part 1: " + result1 + " Processing part 2...");
|
|
493
527
|
|
|
494
528
|
var result2 = this.evaluatePartialRule(token_value, this.definition['part2'], this.sanitizeArrayValue(this.definition['value2']));
|
|
495
529
|
this.getLogger().debug("Part 2: " + result2 + " Completing evaluation...");
|
|
496
|
-
|
|
497
|
-
|
|
530
|
+
|
|
531
|
+
if (this.definition['operator'] == "or") return (result1 || result2);
|
|
498
532
|
return (result1 && result2);
|
|
499
533
|
}
|
|
500
534
|
|
|
@@ -509,9 +543,9 @@ Tr8n.Proxy.NumericRule.prototype.evaluatePartialRule = function(token_value, nam
|
|
|
509
543
|
return false;
|
|
510
544
|
}
|
|
511
545
|
if (name == 'ends_in') {
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
546
|
+
for(var i=0; i<values.length; i++) {
|
|
547
|
+
if (token_value.match(values[i] + "$")) return true;
|
|
548
|
+
}
|
|
515
549
|
return false;
|
|
516
550
|
}
|
|
517
551
|
if (name == 'does_not_end_in') {
|
|
@@ -520,7 +554,7 @@ Tr8n.Proxy.NumericRule.prototype.evaluatePartialRule = function(token_value, nam
|
|
|
520
554
|
}
|
|
521
555
|
return true;
|
|
522
556
|
}
|
|
523
|
-
|
|
557
|
+
return false;
|
|
524
558
|
}
|
|
525
559
|
|
|
526
560
|
|
|
@@ -541,7 +575,7 @@ Tr8n.Proxy.GenderRule.prototype = new Tr8n.Proxy.LanguageRule();
|
|
|
541
575
|
// {user | he, she, he/she}
|
|
542
576
|
Tr8n.Proxy.GenderRule.transform = function(object, values) {
|
|
543
577
|
if (values.length == 1) return values[0];
|
|
544
|
-
|
|
578
|
+
|
|
545
579
|
if (typeof object == 'string') {
|
|
546
580
|
if (object == 'male') return values[0];
|
|
547
581
|
if (object == 'female') return values[1];
|
|
@@ -559,37 +593,37 @@ Tr8n.Proxy.GenderRule.prototype.evaluate = function(token_name, token_values) {
|
|
|
559
593
|
var object = this.getTokenValue(token_name, token_values);
|
|
560
594
|
if (!object) return false;
|
|
561
595
|
|
|
562
|
-
|
|
563
|
-
|
|
596
|
+
var gender = "";
|
|
597
|
+
|
|
564
598
|
if (typeof object != 'object') {
|
|
565
599
|
this.getLogger().error("Invalid token value for gender based token: " + token_name + ". Token value must be an object.");
|
|
566
|
-
|
|
600
|
+
return false;
|
|
567
601
|
}
|
|
568
602
|
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
603
|
+
if (!object['subject']) {
|
|
604
|
+
this.getLogger().error("Invalid token subject for gender based token: " + token_name + ". Token value must contain a subject. Subject can be a string or an object with a gender.");
|
|
605
|
+
return false;
|
|
606
|
+
}
|
|
607
|
+
|
|
574
608
|
if (typeof object['subject'] == 'string') {
|
|
575
|
-
|
|
609
|
+
gender = object['subject'];
|
|
576
610
|
} else if (typeof object['subject'] == 'object') {
|
|
577
611
|
gender = object['subject']['gender'];
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
612
|
+
if (!gender) {
|
|
613
|
+
this.getLogger().error("Cannot determine gender for token subject: " + token_name);
|
|
614
|
+
return false;
|
|
615
|
+
}
|
|
616
|
+
} else {
|
|
583
617
|
this.getLogger().error("Invalid token subject for gender based token: " + token_name + ". Subject does not have a gender.");
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
618
|
+
return false;
|
|
619
|
+
}
|
|
620
|
+
|
|
587
621
|
if (this.definition['operator'] == "is") {
|
|
588
|
-
|
|
589
|
-
|
|
622
|
+
return (gender == this.definition['value']);
|
|
623
|
+
} else if (this.definition['operator'] == "is_not") {
|
|
590
624
|
return (gender != this.definition['value']);
|
|
591
|
-
|
|
592
|
-
|
|
625
|
+
}
|
|
626
|
+
|
|
593
627
|
return false;
|
|
594
628
|
}
|
|
595
629
|
|
|
@@ -624,7 +658,7 @@ Tr8n.Proxy.GenderListRule = function(definition, options) {
|
|
|
624
658
|
Tr8n.Proxy.GenderListRule.prototype = new Tr8n.Proxy.LanguageRule();
|
|
625
659
|
|
|
626
660
|
Tr8n.Proxy.GenderListRule.transform = function(object, values) {
|
|
627
|
-
|
|
661
|
+
return "";
|
|
628
662
|
}
|
|
629
663
|
|
|
630
664
|
Tr8n.Proxy.GenderListRule.prototype.evaluate = function(token, token_values) {
|
|
@@ -663,94 +697,94 @@ Tr8n.Proxy.Token.prototype = {
|
|
|
663
697
|
getLogger: function() {
|
|
664
698
|
return this.getProxy().logger;
|
|
665
699
|
},
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
700
|
+
getExpression: function() {
|
|
701
|
+
// must be implemented by the extending class
|
|
702
|
+
return null;
|
|
703
|
+
},
|
|
670
704
|
register: function(label, options) {
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
705
|
+
if (this.getExpression() == null)
|
|
706
|
+
alert("Token expression must be provided");
|
|
707
|
+
|
|
708
|
+
var tokens = label.match(this.getExpression());
|
|
709
|
+
if (!tokens) return [];
|
|
710
|
+
|
|
711
|
+
var objects = [];
|
|
712
|
+
var uniq = {};
|
|
713
|
+
for(i=0; i<tokens.length; i++) {
|
|
714
|
+
if (uniq[tokens[i]]) continue;
|
|
681
715
|
options['proxy'].debug("Registering data token: " + tokens[i]);
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
716
|
+
objects.push(new Tr8n.Proxy.TransformToken(label, tokens[i], options));
|
|
717
|
+
uniq[tokens[i]] = true;
|
|
718
|
+
}
|
|
719
|
+
return objects;
|
|
720
|
+
},
|
|
687
721
|
getFullName: function() {
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
722
|
+
return this.full_name;
|
|
723
|
+
},
|
|
724
|
+
getDeclaredName: function() {
|
|
725
|
+
if (!this.declared_name) {
|
|
726
|
+
this.declared_name = this.getFullName().replace(/[{}\[\]]/g, '');
|
|
727
|
+
}
|
|
728
|
+
return this.declared_name;
|
|
729
|
+
},
|
|
730
|
+
getName: function() {
|
|
731
|
+
if (!this.name) {
|
|
732
|
+
this.name = Tr8n.Proxy.Utils.trim(this.getDeclaredName().split(':')[0]);
|
|
733
|
+
}
|
|
734
|
+
return this.name;
|
|
735
|
+
},
|
|
702
736
|
getLanguageRule: function() {
|
|
703
|
-
|
|
704
|
-
|
|
737
|
+
|
|
738
|
+
return null;
|
|
705
739
|
},
|
|
706
740
|
substitute: function(label, token_values) {
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
741
|
+
var value = token_values[this.getName()];
|
|
742
|
+
|
|
743
|
+
if (value == null) {
|
|
744
|
+
this.getLogger().error("Value for token: " + this.getFullName() + " was not provided");
|
|
745
|
+
return label;
|
|
746
|
+
}
|
|
713
747
|
|
|
714
748
|
return Tr8n.Proxy.Utils.replaceAll(label, this.getFullName(), this.getTokenValue(value));
|
|
715
749
|
},
|
|
716
|
-
|
|
717
|
-
|
|
750
|
+
getTokenValue: function(token_value) {
|
|
751
|
+
if (typeof token_value == 'string') return token_value;
|
|
718
752
|
if (typeof token_value == 'number') return token_value;
|
|
719
753
|
return token_value['value'];
|
|
720
|
-
|
|
754
|
+
},
|
|
721
755
|
getTokenObject: function(token_value) {
|
|
722
756
|
if (typeof token_value == 'string') return token_value;
|
|
723
757
|
if (typeof token_value == 'number') return token_value;
|
|
724
758
|
return token_value['subject'];
|
|
725
|
-
|
|
726
|
-
|
|
759
|
+
},
|
|
760
|
+
getType: function() {
|
|
727
761
|
if (this.getDeclaredName().indexOf(':') == -1)
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
762
|
+
return null;
|
|
763
|
+
|
|
764
|
+
if (!this.type) {
|
|
765
|
+
this.type = this.getDeclaredName().split('|')[0].split(':');
|
|
766
|
+
this.type = this.type[this.type.length - 1];
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
return this.type;
|
|
770
|
+
},
|
|
771
|
+
getSuffix: function() {
|
|
772
|
+
if (!this.suffix) {
|
|
773
|
+
this.suffix = this.getName().split('_');
|
|
774
|
+
this.suffix = this.suffix[this.suffix.length - 1];
|
|
775
|
+
}
|
|
742
776
|
return this.suffix;
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
777
|
+
},
|
|
778
|
+
getLanguageRule: function() {
|
|
779
|
+
if (!this.language_rule) {
|
|
780
|
+
if (this.getType()) {
|
|
781
|
+
this.language_rule = this.getProxy().getLanguageRuleForType(this.getType());
|
|
782
|
+
} else {
|
|
783
|
+
this.language_rule = this.getProxy().getLanguageRuleForTokenSuffix(this.getSuffix());
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
return this.language_rule;
|
|
787
|
+
}
|
|
754
788
|
}
|
|
755
789
|
|
|
756
790
|
/****************************************************************************
|
|
@@ -766,18 +800,18 @@ Tr8n.Proxy.DataToken = function(label, token, options) {
|
|
|
766
800
|
Tr8n.Proxy.DataToken.prototype = new Tr8n.Proxy.Token();
|
|
767
801
|
|
|
768
802
|
Tr8n.Proxy.DataToken.parse = function(label, options) {
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
803
|
+
var tokens = label.match(/(\{[^_][\w]+(:[\w]+)?\})/g);
|
|
804
|
+
if (!tokens) return [];
|
|
805
|
+
|
|
806
|
+
var objects = [];
|
|
807
|
+
var uniq = {};
|
|
808
|
+
for(i=0; i<tokens.length; i++) {
|
|
809
|
+
if (uniq[tokens[i]]) continue;
|
|
776
810
|
options['proxy'].debug("Registering data token: " + tokens[i]);
|
|
777
|
-
|
|
811
|
+
objects.push(new Tr8n.Proxy.DataToken(label, tokens[i], options));
|
|
778
812
|
uniq[tokens[i]] = true;
|
|
779
|
-
|
|
780
|
-
|
|
813
|
+
}
|
|
814
|
+
return objects;
|
|
781
815
|
}
|
|
782
816
|
|
|
783
817
|
/****************************************************************************
|
|
@@ -816,12 +850,12 @@ Tr8n.Proxy.TransformToken.prototype.getName = function() {
|
|
|
816
850
|
|
|
817
851
|
Tr8n.Proxy.TransformToken.prototype.getPipedParams = function() {
|
|
818
852
|
if (!this.piped_params) {
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
853
|
+
var temp = this.getDeclaredName().split('|');
|
|
854
|
+
temp = temp[temp.length - 1].split(",");
|
|
855
|
+
this.piped_params = [];
|
|
856
|
+
for (i=0; i<temp.length; i++) {
|
|
857
|
+
this.piped_params.push(Tr8n.Proxy.Utils.trim(temp[i]));
|
|
858
|
+
}
|
|
825
859
|
}
|
|
826
860
|
return this.piped_params;
|
|
827
861
|
}
|
|
@@ -833,39 +867,39 @@ Tr8n.Proxy.TransformToken.prototype.substitute = function(label, token_values) {
|
|
|
833
867
|
return label;
|
|
834
868
|
}
|
|
835
869
|
|
|
836
|
-
|
|
870
|
+
var token_object = this.getTokenObject(object);
|
|
837
871
|
this.getLogger().debug("Registered " + this.getPipedParams().length + " piped params");
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
872
|
+
|
|
873
|
+
var lang_rule_name = this.getLanguageRule();
|
|
874
|
+
|
|
875
|
+
if (!lang_rule_name) {
|
|
842
876
|
this.getLogger().error("Rule type cannot be determined for the transform token: " + this.getFullName());
|
|
843
877
|
return label;
|
|
844
|
-
|
|
878
|
+
} else {
|
|
845
879
|
this.getLogger().debug("Transform token uses rule: " + lang_rule_name);
|
|
846
|
-
|
|
880
|
+
}
|
|
847
881
|
|
|
848
882
|
var transform_value = eval(lang_rule_name).transform(token_object, this.getPipedParams());
|
|
849
883
|
this.getLogger().debug("Registered transform value: " + transform_value);
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
884
|
+
|
|
885
|
+
// for double pipes - show the actual value as well
|
|
886
|
+
if (this.isAllowedInTranslation()) {
|
|
853
887
|
var token_value = this.getTokenValue(object);
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
888
|
+
transform_value = token_value + " " + transform_value;
|
|
889
|
+
}
|
|
890
|
+
|
|
857
891
|
return Tr8n.Proxy.Utils.replaceAll(label, this.getFullName(), transform_value);
|
|
858
892
|
}
|
|
859
893
|
|
|
860
894
|
Tr8n.Proxy.TransformToken.prototype.getPipedSeparator = function() {
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
895
|
+
if (!this.piped_separator) {
|
|
896
|
+
this.piped_separator = (this.getFullName().indexOf("||") != -1 ? "||" : "|");
|
|
897
|
+
}
|
|
898
|
+
return this.piped_separator;
|
|
865
899
|
}
|
|
866
900
|
|
|
867
901
|
Tr8n.Proxy.TransformToken.prototype.isAllowedInTranslation = function(){
|
|
868
|
-
|
|
902
|
+
return this.getPipedSeparator() == "||";
|
|
869
903
|
}
|
|
870
904
|
|
|
871
905
|
/****************************************************************************
|
|
@@ -897,17 +931,17 @@ Tr8n.Proxy.DecorationToken.parse = function(label, options) {
|
|
|
897
931
|
|
|
898
932
|
Tr8n.Proxy.DecorationToken.prototype.getDecoratedValue = function() {
|
|
899
933
|
if (!this.decorated_value) {
|
|
900
|
-
|
|
901
|
-
|
|
934
|
+
var value = this.getFullName().replace(/[\]]/g, '');
|
|
935
|
+
value = value.substring(value.indexOf(':') + 1, value.length);
|
|
902
936
|
this.decorated_value = Tr8n.Proxy.Utils.trim(value);
|
|
903
|
-
|
|
937
|
+
}
|
|
904
938
|
return this.decorated_value;
|
|
905
939
|
}
|
|
906
940
|
|
|
907
941
|
Tr8n.Proxy.DecorationToken.prototype.substitute = function(label, token_values) {
|
|
908
942
|
var object = token_values[this.getName()];
|
|
909
|
-
|
|
910
|
-
|
|
943
|
+
var decoration = object;
|
|
944
|
+
|
|
911
945
|
if (!object || typeof object == 'object') {
|
|
912
946
|
// look for the default decoration
|
|
913
947
|
decoration = this.getProxy().getDecorationFor(this.getName());
|
|
@@ -917,18 +951,18 @@ Tr8n.Proxy.DecorationToken.prototype.substitute = function(label, token_values)
|
|
|
917
951
|
}
|
|
918
952
|
|
|
919
953
|
decoration = Tr8n.Proxy.Utils.replaceAll(decoration, '{$0}', this.getDecoratedValue());
|
|
920
|
-
|
|
921
|
-
|
|
954
|
+
if (object) {
|
|
955
|
+
for (var key in object) {
|
|
922
956
|
decoration = Tr8n.Proxy.Utils.replaceAll(decoration, '{$' + key + '}', object[key]);
|
|
923
|
-
|
|
924
|
-
|
|
957
|
+
}
|
|
958
|
+
}
|
|
925
959
|
} else if (typeof object == 'string') {
|
|
926
|
-
|
|
927
|
-
|
|
960
|
+
decoration = Tr8n.Proxy.Utils.replaceAll(decoration, '{$0}', this.getDecoratedValue());
|
|
961
|
+
} else {
|
|
928
962
|
this.getLogger().error("Unknown type of decoration token " + this.getFullName());
|
|
929
963
|
return label;
|
|
930
|
-
|
|
931
|
-
|
|
964
|
+
}
|
|
965
|
+
|
|
932
966
|
return Tr8n.Proxy.Utils.replaceAll(label, this.getFullName(), decoration);
|
|
933
967
|
}
|
|
934
968
|
|
|
@@ -938,65 +972,227 @@ Tr8n.Proxy.DecorationToken.prototype.substitute = function(label, token_values)
|
|
|
938
972
|
|
|
939
973
|
Tr8n.Proxy.Logger = function(options) {
|
|
940
974
|
this.options = options;
|
|
975
|
+
this.object_keys = [];
|
|
941
976
|
}
|
|
942
977
|
|
|
943
978
|
Tr8n.Proxy.Logger.prototype = {
|
|
979
|
+
clear: function() {
|
|
980
|
+
if (!this.options['proxy'].logger_enabled) return;
|
|
981
|
+
if (!this.options['element_id']) return;
|
|
982
|
+
if (!Tr8n.Proxy.Utils.element(this.options['element_id'])) return;
|
|
983
|
+
Tr8n.element(this.options['element_id']).innerHTML = "";
|
|
984
|
+
},
|
|
985
|
+
append: function(msg) {
|
|
986
|
+
if (!this.options['proxy'].logger_enabled) return;
|
|
987
|
+
if (!this.options['element_id']) return;
|
|
988
|
+
if (!Tr8n.Proxy.Utils.element(this.options['element_id'])) return;
|
|
989
|
+
|
|
990
|
+
var str = msg + "<br>" + Tr8n.Proxy.Utils.element(this.options['element_id']).innerHTML;
|
|
991
|
+
Tr8n.element(this.options['element_id']).innerHTML = str;
|
|
992
|
+
},
|
|
944
993
|
log: function(msg) {
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
str = "<span style='color:#ccc;'>" + (now.toLocaleDateString() + " " + now.toLocaleTimeString()) + "</span>: " + msg + "<br>" + str;
|
|
951
|
-
Tr8n.Proxy.Utils.element(this.options['element_id']).innerHTML = str;
|
|
952
|
-
},
|
|
994
|
+
if (!this.options['proxy'].logger_enabled) return;
|
|
995
|
+
var now = new Date();
|
|
996
|
+
var str = "<span style='color:#ccc;'>" + (now.toLocaleDateString() + " " + now.toLocaleTimeString()) + "</span>: " + msg;
|
|
997
|
+
this.append(str);
|
|
998
|
+
},
|
|
953
999
|
debug: function(msg) {
|
|
954
1000
|
this.log("<span style='color:grey'>" + msg + "</span>");
|
|
955
1001
|
},
|
|
956
1002
|
error: function(msg) {
|
|
957
|
-
|
|
1003
|
+
this.log("<span style='color:red'>" + msg + "</span>");
|
|
1004
|
+
},
|
|
1005
|
+
S4: function() {
|
|
1006
|
+
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
|
|
1007
|
+
},
|
|
1008
|
+
guid: function() {
|
|
1009
|
+
return (this.S4()+this.S4()+"-"+this.S4()+"-"+this.S4()+"-"+this.S4()+"-"+this.S4()+this.S4()+this.S4());
|
|
1010
|
+
},
|
|
1011
|
+
escapeHTML: function(str) {
|
|
1012
|
+
return( str.replace(/&/g,'&').replace(/>/g,'>').replace(/</g,'<').replace(/"/g,'"'));
|
|
1013
|
+
},
|
|
1014
|
+
showObject: function (obj_key, flag) {
|
|
1015
|
+
if (flag) {
|
|
1016
|
+
Tr8n.Proxy.Utils.hide("no_object_" + obj_key);
|
|
1017
|
+
Tr8n.Proxy.Utils.show("object_" + obj_key);
|
|
1018
|
+
Tr8n.element("expander_" + obj_key).innerHTML = "<img src='/assets/tr8n/minus_node.png'>";
|
|
1019
|
+
} else {
|
|
1020
|
+
Tr8n.Proxy.Utils.hide("object_" + obj_key);
|
|
1021
|
+
Tr8n.Proxy.Utils.show("no_object_" + obj_key);
|
|
1022
|
+
Tr8n.element("expander_" + obj_key).innerHTML = "<img src='/assets/tr8n/plus_node.png'>";
|
|
1023
|
+
}
|
|
1024
|
+
},
|
|
1025
|
+
toggleNode: function(obj_key) {
|
|
1026
|
+
this.showObject(obj_key, (Tr8n.element("object_" + obj_key).style.display == 'none'));
|
|
1027
|
+
},
|
|
1028
|
+
expandAllNodes: function() {
|
|
1029
|
+
for (var i=0; i<this.object_keys.length; i++) {
|
|
1030
|
+
this.showObject(this.object_keys[i], true);
|
|
1031
|
+
}
|
|
1032
|
+
},
|
|
1033
|
+
collapseAllNodes: function() {
|
|
1034
|
+
for (var i=0; i<this.object_keys.length; i++) {
|
|
1035
|
+
this.showObject(this.object_keys[i], false);
|
|
1036
|
+
}
|
|
1037
|
+
},
|
|
1038
|
+
logObject: function(data) {
|
|
1039
|
+
this.object_keys = [];
|
|
1040
|
+
html = []
|
|
1041
|
+
html.push("<div style='float:right;padding-right:10px;'>");
|
|
1042
|
+
html.push("<span style='padding:2px;' onClick=\"tr8nProxy.logger.expandAllNodes()\"><img src='/assets/tr8n/plus_node.png'></span>");
|
|
1043
|
+
html.push("<span style='padding:2px;' onClick=\"tr8nProxy.logger.collapseAllNodes()\"><img src='/assets/tr8n/minus_node.png'></span>");
|
|
1044
|
+
html.push("</div>");
|
|
1045
|
+
|
|
1046
|
+
var results = data;
|
|
1047
|
+
if (typeof results == 'string') {
|
|
1048
|
+
try {
|
|
1049
|
+
results = eval("[" + results + "]")[0];
|
|
1050
|
+
}
|
|
1051
|
+
catch (err) {
|
|
1052
|
+
this.push(results);
|
|
1053
|
+
return;
|
|
1054
|
+
}
|
|
1055
|
+
}
|
|
1056
|
+
if (typeof results == 'object') {
|
|
1057
|
+
html.push(this.formatObject(results, 1));
|
|
1058
|
+
} else {
|
|
1059
|
+
html.push(results);
|
|
1060
|
+
}
|
|
1061
|
+
this.append(html.join(""));
|
|
1062
|
+
},
|
|
1063
|
+
formatObject: function(obj, level) {
|
|
1064
|
+
if (obj == null) return "{<br>}";
|
|
1065
|
+
|
|
1066
|
+
var html = [];
|
|
1067
|
+
var obj_key = this.guid();
|
|
1068
|
+
html.push("<span class='tr8n_logger_expander' id='expander_" + obj_key + "' onClick=\"tr8nProxy.logger.toggleNode('" + obj_key + "')\"><img src='/assets/tr8n/minus_node.png'></span> <span style='display:none' id='no_object_" + obj_key + "'>{...}</span> <span id='object_" + obj_key + "'>{");
|
|
1069
|
+
this.object_keys.push(obj_key);
|
|
1070
|
+
|
|
1071
|
+
var keys = Object.keys(obj).sort();
|
|
1072
|
+
|
|
1073
|
+
for (var i=0; i<keys.length; i++) {
|
|
1074
|
+
key = keys[i];
|
|
1075
|
+
if (this.isObject(obj[key])) {
|
|
1076
|
+
if (this.isArray(obj[key])) {
|
|
1077
|
+
html.push(this.createSpacer(level) + "<span class='tr8n_logger_obj_key'>" + key + ":</span>" + this.formatArray(obj[key], level + 1) + ",");
|
|
1078
|
+
} else {
|
|
1079
|
+
html.push(this.createSpacer(level) + "<span class='tr8n_logger_obj_key'>" + key + ":</span>" + this.formatObject(obj[key], level + 1) + ",");
|
|
1080
|
+
}
|
|
1081
|
+
} else {
|
|
1082
|
+
html.push(this.createSpacer(level) + this.formatProperty(key, obj[key]) + ",");
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
html.push(this.createSpacer(level-1) + "}</span>");
|
|
1086
|
+
return html.join("<br>");
|
|
1087
|
+
},
|
|
1088
|
+
formatArray: function(arr, level) {
|
|
1089
|
+
if (arr == null) return "[<br>]";
|
|
1090
|
+
|
|
1091
|
+
var html = [];
|
|
1092
|
+
var obj_key = this.guid();
|
|
1093
|
+
html.push("<span class='tr8n_logger_expander' id='expander_" + obj_key + "' onClick=\"tr8nProxy.logger.toggleNode('" + obj_key + "')\"><img src='/assets/tr8n/minus_node.png'></span> <span style='display:none' id='no_object_" + obj_key + "'>[...]</span> <span id='object_" + obj_key + "'>[");
|
|
1094
|
+
this.object_keys.push(obj_key);
|
|
1095
|
+
|
|
1096
|
+
for (var i=0; i<arr.length; i++) {
|
|
1097
|
+
if (this.isObject(arr[i])) {
|
|
1098
|
+
if (this.isArray(arr[i])) {
|
|
1099
|
+
html.push(this.createSpacer(level) + this.formatArray(arr[i], level + 1) + ",");
|
|
1100
|
+
} else {
|
|
1101
|
+
html.push(this.createSpacer(level) + this.formatObject(arr[i], level + 1) + ",");
|
|
1102
|
+
}
|
|
1103
|
+
} else {
|
|
1104
|
+
html.push(this.createSpacer(level) + this.formatProperty(null, arr[i]) + ",");
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
html.push(this.createSpacer(level-1) + "]</span>");
|
|
1108
|
+
return html.join("<br>");
|
|
1109
|
+
},
|
|
1110
|
+
formatProperty: function(key, value) {
|
|
1111
|
+
if (value == null) return "<span class='tr8n_logger_obj_key'>" + key + ":</span><span class='obj_value_null'>null</span>";
|
|
1112
|
+
|
|
1113
|
+
var cls = "tr8n_logger_obj_value_" + (typeof value);
|
|
1114
|
+
var value_span = "";
|
|
1115
|
+
|
|
1116
|
+
if (this.isString(value))
|
|
1117
|
+
value_span = "<span class='" + cls + "'>\"" + this.escapeHTML(value) + "\"</span>";
|
|
1118
|
+
else
|
|
1119
|
+
value_span = "<span class='" + cls + "'>" + value + "</span>";
|
|
1120
|
+
|
|
1121
|
+
if (key == null)
|
|
1122
|
+
return value_span;
|
|
1123
|
+
|
|
1124
|
+
return "<span class='tr8n_logger_obj_key'>" + key + ":</span>" + value_span;
|
|
1125
|
+
},
|
|
1126
|
+
createSpacer: function(level) {
|
|
1127
|
+
return "<img src='/assets/tr8n/pixel.gif' style='height:1px;width:" + (level * 20) + "px;'>";
|
|
1128
|
+
},
|
|
1129
|
+
isArray: function(obj) {
|
|
1130
|
+
if (obj == null) return false;
|
|
1131
|
+
return !(obj.constructor.toString().indexOf("Array") == -1);
|
|
1132
|
+
},
|
|
1133
|
+
isObject: function(obj) {
|
|
1134
|
+
if (obj == null) return false;
|
|
1135
|
+
return (typeof obj == 'object');
|
|
1136
|
+
},
|
|
1137
|
+
isString: function(obj) {
|
|
1138
|
+
return (typeof obj == 'string');
|
|
1139
|
+
},
|
|
1140
|
+
isURL: function(str) {
|
|
1141
|
+
str = "" + str;
|
|
1142
|
+
return (str.indexOf("http://") != -1) || (str.indexOf("https://") != -1);
|
|
958
1143
|
}
|
|
959
1144
|
}
|
|
960
1145
|
|
|
1146
|
+
|
|
1147
|
+
|
|
961
1148
|
/****************************************************************************
|
|
962
1149
|
**** Tr8n Proxy Utils
|
|
963
1150
|
****************************************************************************/
|
|
964
1151
|
|
|
965
1152
|
Tr8n.Proxy.Utils = {
|
|
966
|
-
|
|
1153
|
+
|
|
967
1154
|
element:function(element_id) {
|
|
968
1155
|
if (typeof element_id == 'string') return document.getElementById(element_id);
|
|
969
1156
|
return element_id;
|
|
970
1157
|
},
|
|
971
1158
|
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
},
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1159
|
+
hide: function(element_id) {
|
|
1160
|
+
Tr8n.element(element_id).style.display = "none";
|
|
1161
|
+
},
|
|
1162
|
+
|
|
1163
|
+
show: function(element_id) {
|
|
1164
|
+
var style = (Tr8n.element(element_id).tagName == "SPAN") ? "inline" : "block";
|
|
1165
|
+
Tr8n.element(element_id).style.display = style;
|
|
1166
|
+
},
|
|
1167
|
+
|
|
1168
|
+
indexOf: function(array, item, i) {
|
|
1169
|
+
i || (i = 0);
|
|
1170
|
+
var length = array.length;
|
|
1171
|
+
if (i < 0) i = length + i;
|
|
1172
|
+
for (; i < length; i++)
|
|
1173
|
+
if (array[i] === item) return i;
|
|
1174
|
+
return -1;
|
|
1175
|
+
},
|
|
1176
|
+
|
|
1177
|
+
replaceAll: function(label, key, value) {
|
|
1178
|
+
while (label.indexOf(key) != -1) {
|
|
1179
|
+
label = label.replace(key, value);
|
|
1180
|
+
}
|
|
1181
|
+
return label;
|
|
1182
|
+
},
|
|
1183
|
+
|
|
1184
|
+
trim: function(string) {
|
|
1185
|
+
return string.replace(/^\s+|\s+$/g,"");
|
|
1186
|
+
},
|
|
1187
|
+
|
|
1188
|
+
ltrim: function(string) {
|
|
1189
|
+
return string.replace(/^\s+/,"");
|
|
1190
|
+
},
|
|
1191
|
+
|
|
1192
|
+
rtrim: function(string) {
|
|
1193
|
+
return string.replace(/\s+$/,"");
|
|
1194
|
+
},
|
|
1195
|
+
|
|
1000
1196
|
addEvent: function(elm, evType, fn, useCapture) {
|
|
1001
1197
|
useCapture = useCapture || false;
|
|
1002
1198
|
if (elm.addEventListener) {
|
|
@@ -1064,47 +1260,7 @@ Tr8n.Proxy.Utils = {
|
|
|
1064
1260
|
request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
|
|
1065
1261
|
request.setRequestHeader('Accept', 'text/javascript, text/html, application/xml, text/xml, */*');
|
|
1066
1262
|
request.send(options.parameters);
|
|
1067
|
-
}
|
|
1068
|
-
}
|
|
1069
|
-
|
|
1070
|
-
/****************************************************************************
|
|
1071
|
-
**** Tr8n Proxy Initialization
|
|
1072
|
-
****************************************************************************/
|
|
1073
|
-
var tr8nProxy;
|
|
1074
|
-
|
|
1075
|
-
//
|
|
1076
|
-
// the following should be done by the tr8n_client_sdk_scripts_tag
|
|
1077
|
-
//
|
|
1078
|
-
|
|
1079
|
-
//function initializeTr8nClientSDK(source, debugger) {
|
|
1080
|
-
// tr8nProxy = tr8nProxy || new Tr8n.Proxy({
|
|
1081
|
-
// "default_source": source,
|
|
1082
|
-
// "debugger_element_id": debugger,
|
|
1083
|
-
// "default_decorations": {"bold": "<strong>{$0}</strong>", "italic": "<i>{$0}</i>", "link": "<a href='{$href}'>{$0}</a>"},
|
|
1084
|
-
// "rules": {"number":{"token_suffixes":["count", "num"]},
|
|
1085
|
-
// "gender":{"token_suffixes":["user", "profile", "actor", "target"]},
|
|
1086
|
-
// "list":{"token_suffixes":["list"]}, "date":{"token_suffixes":["date"]}
|
|
1087
|
-
// }
|
|
1088
|
-
// });
|
|
1089
|
-
//}
|
|
1090
|
-
|
|
1091
|
-
// global javascript method
|
|
1092
|
-
function reloadTranslations() {
|
|
1093
|
-
tr8nProxy.initTranslations(true);
|
|
1094
|
-
}
|
|
1095
|
-
|
|
1096
|
-
// global javascript method - can be used after initialization
|
|
1097
|
-
function tr(label, description, tokens, options) {
|
|
1098
|
-
// tr8nProxy.logger.log("Translating: " + label);
|
|
1099
|
-
return tr8nProxy.translate(label, description || '', tokens || {}, options || {});
|
|
1100
|
-
}
|
|
1101
|
-
|
|
1102
|
-
// global javascript method - can be used after initialization
|
|
1103
|
-
function trl(label, description, tokens, options) {
|
|
1104
|
-
// tr8nProxy.logger.log("Translating: " + label);
|
|
1105
|
-
options = options || {};
|
|
1106
|
-
options['skip_decorations'] = true;
|
|
1107
|
-
return tr8nProxy.translate(label, description || '', tokens || {}, options);
|
|
1263
|
+
}
|
|
1108
1264
|
}
|
|
1109
1265
|
|
|
1110
1266
|
/****************************************************************************
|
|
@@ -1313,4 +1469,4 @@ var MD5 = function (string) {
|
|
|
1313
1469
|
var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
|
|
1314
1470
|
|
|
1315
1471
|
return temp.toLowerCase();
|
|
1316
|
-
}
|
|
1472
|
+
}
|