tr8n 3.1.5 → 3.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. data/.gitignore +5 -1
  2. data/.rvmrc +1 -1
  3. data/Gemfile.lock +5 -5
  4. data/README.rdoc +36 -17
  5. data/app/assets/javascripts/tr8n/tr8n.js +31 -19
  6. data/app/controllers/tr8n/help_controller.rb +12 -2
  7. data/app/models/tr8n/language.rb +7 -3
  8. data/app/models/tr8n/translation.rb +11 -8
  9. data/app/models/tr8n/translation_domain.rb +1 -1
  10. data/app/models/tr8n/translation_key.rb +29 -13
  11. data/app/models/tr8n/translation_key_source.rb +0 -1
  12. data/app/models/tr8n/translation_source.rb +5 -5
  13. data/app/models/tr8n/translation_source_language.rb +39 -0
  14. data/app/models/tr8n/translator.rb +2 -11
  15. data/app/views/tr8n/common/_language_strip.html.erb +1 -1
  16. data/app/views/tr8n/common/_scripts.html.erb +3 -4
  17. data/app/views/tr8n/help/lb_shortcuts.html.erb +23 -22
  18. data/app/views/tr8n/help/lb_stats.html.erb +63 -0
  19. data/bin/tr8n.rb +24 -0
  20. data/db/migrate/20100405201417_create_tr8n_tables.rb +1 -1
  21. data/db/migrate/20111003194443_create_tr8n_sync_tables.rb +23 -0
  22. data/db/migrate/20111011013640_add_remote_id_to_tr8n_translators.rb +23 -0
  23. data/db/migrate/20111026230545_create_tr8n_translation_source_languages.rb +34 -0
  24. data/{config → lib/generators/tr8n/templates/config}/tr8n/config.yml +18 -14
  25. data/{config → lib/generators/tr8n/templates/config}/tr8n/data/ip_locations.csv +0 -0
  26. data/{config → lib/generators/tr8n/templates/config}/tr8n/rules/default_date_rules.yml +0 -0
  27. data/{config → lib/generators/tr8n/templates/config}/tr8n/rules/default_gender_list_rules.yml +0 -0
  28. data/{config → lib/generators/tr8n/templates/config}/tr8n/rules/default_gender_rules.yml +0 -0
  29. data/{config → lib/generators/tr8n/templates/config}/tr8n/rules/default_language_cases.yml +0 -0
  30. data/{config → lib/generators/tr8n/templates/config}/tr8n/rules/default_list_rules.yml +0 -0
  31. data/{config → lib/generators/tr8n/templates/config}/tr8n/rules/default_numeric_rules.yml +0 -0
  32. data/{config → lib/generators/tr8n/templates/config}/tr8n/rules/default_value_rules.yml +0 -0
  33. data/{config → lib/generators/tr8n/templates/config}/tr8n/site/default_glossary.yml +0 -0
  34. data/{config → lib/generators/tr8n/templates/config}/tr8n/site/default_languages.yml +0 -0
  35. data/{config → lib/generators/tr8n/templates/config}/tr8n/site/features.yml +1 -6
  36. data/{config → lib/generators/tr8n/templates/config}/tr8n/site/shortcuts.yml +4 -0
  37. data/{config → lib/generators/tr8n/templates/config}/tr8n/site/sitemap.json +0 -0
  38. data/{config → lib/generators/tr8n/templates/config}/tr8n/tokens/data.yml +0 -0
  39. data/{config → lib/generators/tr8n/templates/config}/tr8n/tokens/decorations.yml +0 -0
  40. data/lib/generators/tr8n/templates/db/create_tr8n_tables.rb +77 -55
  41. data/lib/generators/tr8n/tr8n_generator.rb +1 -1
  42. data/lib/tr8n/cache.rb +109 -8
  43. data/lib/tr8n/config.rb +14 -4
  44. data/lib/tr8n/extensions/action_controller_extension.rb +36 -38
  45. data/lib/tr8n/extensions/action_view_extension.rb +3 -17
  46. data/lib/tr8n/extensions/date_extension.rb +0 -1
  47. data/lib/tr8n/extensions/hash_extension.rb +66 -0
  48. data/lib/tr8n/extensions/string_extension.rb +1 -1
  49. data/lib/tr8n/extensions/time_extension.rb +0 -1
  50. data/lib/tr8n/version.rb +1 -1
  51. data/local/tr8n_server/app/views/layouts/_footer.html.erb +1 -1
  52. data/local/tr8n_server/config/tr8n/config.yml +18 -14
  53. data/local/tr8n_server/config/tr8n/site/features.yml +1 -6
  54. data/local/tr8n_server/config/tr8n/site/shortcuts.yml +4 -0
  55. data/local/tr8n_server/db/migrate/20110930041150_create_tr8n_tables.rb +78 -56
  56. data/local/tr8n_server/db/schema.rb +10 -1
  57. metadata +56 -61
  58. data/app/views/tr8n/help/lb_credits.html.erb +0 -9
  59. data/local/tr8n_server/app/views/layouts/tr8n.html.erb +0 -51
  60. data/local/tr8n_server/app/views/layouts/tr8n_admin.html.erb +0 -61
  61. data/local/tr8n_server/db/migrate/20111003194443_create_tr8n_sync_tables.rb +0 -22
  62. data/local/tr8n_server/db/migrate/20111011013640_add_remote_id_to_tr8n_translators.rb +0 -5
data/.gitignore CHANGED
@@ -13,4 +13,8 @@ log/*
13
13
  .dotest*
14
14
  Thumbs.db
15
15
  .tmp*
16
- local/
16
+ tmp/
17
+ local/tr8n_server/db/*.sqlite3
18
+ local/tr8n_server/log/*.log
19
+ local/tr8n_server/tmp/
20
+ local/tr8n_server/.sass-cache/
data/.rvmrc CHANGED
@@ -1 +1 @@
1
- rvm 1.9.2 --create
1
+ rvm 1.9.2@tr8n --create
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tr8n (3.1.5)
4
+ tr8n (3.1.6)
5
5
  coffee-script
6
6
  kaminari
7
7
  rails (>= 3.1.0)
@@ -56,7 +56,7 @@ GEM
56
56
  coffee-script (2.2.0)
57
57
  coffee-script-source
58
58
  execjs
59
- coffee-script-source (1.1.2)
59
+ coffee-script-source (1.1.3)
60
60
  database_cleaner (0.6.7)
61
61
  diff-lcs (1.1.3)
62
62
  erubis (2.7.0)
@@ -80,7 +80,7 @@ GEM
80
80
  mime-types (1.16)
81
81
  multi_json (1.0.3)
82
82
  nokogiri (1.5.0)
83
- polyglot (0.3.2)
83
+ polyglot (0.3.3)
84
84
  pry (0.9.6.2)
85
85
  coderay (~> 0.9.8)
86
86
  method_source (~> 0.6.5)
@@ -129,7 +129,7 @@ GEM
129
129
  ruby_parser (2.0.6)
130
130
  sexp_processor (~> 3.0)
131
131
  rubyzip (0.9.4)
132
- sass (3.1.8)
132
+ sass (3.1.10)
133
133
  selenium-webdriver (2.7.0)
134
134
  childprocess (>= 0.2.1)
135
135
  ffi (>= 1.0.7)
@@ -150,7 +150,7 @@ GEM
150
150
  treetop (1.4.10)
151
151
  polyglot
152
152
  polyglot (>= 0.3.1)
153
- tzinfo (0.3.30)
153
+ tzinfo (0.3.31)
154
154
  will_filter (3.1.3)
155
155
  coffee-script
156
156
  kaminari
data/README.rdoc CHANGED
@@ -8,6 +8,8 @@ The language specific context and case rules can be registered and managed for a
8
8
  provides a set of powerful administration tools that allow admins to manage any aspect of the engine; enabling and disabling its features
9
9
  and monitoring translation progress.
10
10
 
11
+ http://img507.imageshack.us/img507/2876/tr8nlogo.png
12
+
11
13
  The Tr8n engine itself is based on a very robust and flexible pluggable architecture where rule types and the syntax of the "tr" tokens
12
14
  can be configured or extended for any application deployment.
13
15
 
@@ -21,21 +23,34 @@ You can visit their web sites and see how it is being used. If your company is u
21
23
 
22
24
  = Documentation
23
25
 
24
- Tr8n Translation Engine Integration Guide
26
+ Configuration Guide
27
+
28
+ https://github.com/berk/tr8n/wiki/4.-Configuration-Instructions
29
+
30
+ Integration Guide
31
+
32
+ https://github.com/berk/tr8n/wiki/5.-Integration-Instructions
33
+
34
+ Label Internationalization
35
+
36
+ https://github.com/berk/tr8n/wiki/6.-Tr8n-Syntax
25
37
 
26
- http://wiki.tr8n.org/index.php?title=Tr8n_Translation_Engine_Integration_Guide
38
+ Rules Engine
27
39
 
28
- Tr8n Label Internationalization
40
+ https://github.com/berk/tr8n/wiki/7.-Tr8n-Rules-Engine
29
41
 
30
- http://wiki.tr8n.org/index.php?title=Tr8n_Label_Internationalization
42
+ Language Context Rules
31
43
 
32
- Tr8n Rules Engine Configuration Guide
44
+ https://github.com/berk/tr8n/wiki/7.1-Language-Context-Rules
33
45
 
34
- http://wiki.tr8n.org/index.php?title=Tr8n_Rules_Engine_Configuration_Guide
46
+ Language Case Rules
35
47
 
36
- Tr8n Supported Languages
48
+ https://github.com/berk/tr8n/wiki/7.2-Language-Case-Rules
49
+
50
+ Supported Languages
51
+
52
+ https://github.com/berk/tr8n/wiki/9.-Supported-Languages
37
53
 
38
- http://wiki.tr8n.org/index.php?title=Tr8n_Languages
39
54
 
40
55
  = Installation Instructions
41
56
 
@@ -92,35 +107,35 @@ Below are a few screenshots of what Tr8n looks like:
92
107
 
93
108
  == Tr8n Language Selector (in a lightbox)
94
109
 
95
- http://wiki.tr8n.org/images/e/e8/Tr8n1.png
110
+ http://img853.imageshack.us/img853/6784/tr8n1.png
96
111
 
97
112
  == Tr8n Translation Interface
98
113
 
99
- http://wiki.tr8n.org/images/4/4d/Tr8n2.png
114
+ http://img140.imageshack.us/img140/1272/tr8n2.png
100
115
 
101
116
  == Tr8n Translation Votes Interface
102
117
 
103
- http://wiki.tr8n.org/images/c/ce/Tr8n3.png
118
+ http://img854.imageshack.us/img854/1341/tr8n3.png
104
119
 
105
120
  == Tr8n Language Selector (as a dropdown)
106
121
 
107
- http://wiki.tr8n.org/images/6/64/Tr8n4.png
122
+ http://img233.imageshack.us/img233/3973/tr8n4.png
108
123
 
109
124
  == Tr8n Translation Interface (with a keyboard)
110
125
 
111
- http://wiki.tr8n.org/images/4/47/Tr8n6.png
126
+ http://img717.imageshack.us/img717/9392/tr8n6.png
112
127
 
113
128
  == Tr8n Translation Tools
114
129
 
115
- http://wiki.tr8n.org/images/0/02/Tr8n8.png
130
+ http://img824.imageshack.us/img824/2263/tr8n8.png
116
131
 
117
132
  == Tr8n Translator Dashboard
118
133
 
119
- http://wiki.tr8n.org/images/7/7c/Tr8n5.png
134
+ http://img337.imageshack.us/img337/3180/tr8n5.png
120
135
 
121
136
  == Tr8n Translation Admin Tools
122
137
 
123
- http://wiki.tr8n.org/images/4/44/Tr8n7.png
138
+ http://img225.imageshack.us/img225/3599/tr8n7.png
124
139
 
125
140
 
126
141
  = External Links
@@ -138,12 +153,16 @@ Geni Goes Global With 20 New Languages And A Crowdsourced Translation Tool
138
153
 
139
154
  http://tcrn.ch/f1VLnj
140
155
 
141
-
142
156
  Quora Discussion - What is the best way to deal with internationlization of text on a large social site?
143
157
 
144
158
  http://bit.ly/hUU6R9
145
159
 
146
160
 
161
+ LinkedIn Discussion
162
+
163
+ http://www.linkedin.com/groups/Internationalizing-your-application-using-Tr8n-4090552?gid=4090552
164
+
165
+
147
166
  RailsCasts - If you would like to see a RailsCasts episode on how to get Tr8n configured and running, please visit the RailsCasts suggestion page and vote it up. Thank you!
148
167
 
149
168
  http://bit.ly/gz7lFw
@@ -94,6 +94,7 @@ Tr8n.Translator = function(options) {
94
94
  var self = this;
95
95
  this.options = options;
96
96
  this.translation_key_id = null;
97
+ this.suggestion_tokens = null;
97
98
 
98
99
  this.container = document.createElement('div');
99
100
  this.container.className = 'tr8n_translator';
@@ -291,20 +292,35 @@ Tr8n.Translator.prototype = {
291
292
  });
292
293
  },
293
294
 
294
- suggestTranslation: function(translation_key_id, original, tokens, from_lang, to_lang) {
295
- google.language.translate(original, from_lang, to_lang, function(result) {
296
- if (!result.error) {
297
- var suggestion = result.translation;
298
- tokens = tokens.split(",");
299
- for (var i=0; i<tokens.length; i++) {
300
- suggestion = Tr8n.Utils.replaceAll(suggestion, "(" + i + ")", tokens[i]);
301
- }
302
- Tr8n.element("tr8n_translation_suggestion_" + translation_key_id).innerHTML = suggestion;
303
- Tr8n.element("tr8n_google_suggestion_container_" + translation_key_id).style.display = "block";
304
- var suggestion_section = Tr8n.element('tr8n_google_suggestion_section');
305
- if (suggestion_section) suggestion_section.style.display = "block";
295
+ processSuggestedTranslation: function(response) {
296
+ if (response == null ||response.data == null || response.data.translations==null || response.data.translations.length == 0)
297
+ return;
298
+ var suggestion = response.data.translations[0].translatedText;
299
+ if (this.suggestion_tokens) {
300
+ var tokens = this.suggestion_tokens.split(",");
301
+ this.suggestion_tokens = null;
302
+ for (var i=0; i<tokens.length; i++) {
303
+ suggestion = Tr8n.Utils.replaceAll(suggestion, "(" + i + ")", tokens[i]);
306
304
  }
307
- });
305
+ }
306
+ Tr8n.element("tr8n_translation_suggestion_" + this.translation_key_id).innerHTML = suggestion;
307
+ Tr8n.element("tr8n_google_suggestion_container_" + this.translation_key_id).style.display = "block";
308
+ var suggestion_section = Tr8n.element('tr8n_google_suggestion_section');
309
+ if (suggestion_section) suggestion_section.style.display = "block";
310
+ },
311
+
312
+ suggestTranslation: function(translation_key_id, original, tokens, from_lang, to_lang) {
313
+ if (Tr8n.google_api_key == null) return;
314
+
315
+ this.suggestion_tokens = tokens;
316
+ this.translation_key_id = translation_key_id;
317
+ var new_script = document.createElement('script');
318
+ new_script.type = 'text/javascript';
319
+ var source_text = escape(original);
320
+ var api_source = 'https://www.googleapis.com/language/translate/v2?key=' + Tr8n.google_api_key;
321
+ var source = api_source + '&source=' + from_lang + '&target=' + to_lang + '&callback=tr8nTranslator.processSuggestedTranslation&q=' + source_text;
322
+ new_script.src = source;
323
+ document.getElementsByTagName('head')[0].appendChild(new_script);
308
324
  }
309
325
 
310
326
  }
@@ -851,9 +867,9 @@ Tr8n.Utils = {
851
867
  tr8nLightbox.show('/tr8n/help/lb_shortcuts', {width:400, height:480});
852
868
  },
853
869
 
854
- displayCredits: function() {
870
+ displayStatistics: function() {
855
871
  if (tr8nLightbox)
856
- tr8nLightbox.show('/tr8n/help/lb_credits', {width:420, height:250});
872
+ tr8nLightbox.show('/tr8n/help/lb_stats', {width:420, height:400});
857
873
  }
858
874
 
859
875
  }
@@ -886,7 +902,3 @@ function initializeTr8n() {
886
902
 
887
903
  Tr8n.Utils.addEvent(window, 'load', setup);
888
904
  }
889
-
890
- function initializeTr8nGoogleSuggestions() {
891
- google.load("language", "1");
892
- }
@@ -23,7 +23,9 @@
23
23
 
24
24
  class Tr8n::HelpController < Tr8n::BaseController
25
25
 
26
- before_filter :validate_current_translator
26
+ before_filter :validate_current_translator, :except => [:lb_shortcuts, :lb_stats, :credits, :license]
27
+ before_filter :validate_guest_user, :except => [:lb_shortcuts, :lb_stats, :credits, :license]
28
+ before_filter :validate_current_user, :except => [:lb_shortcuts, :lb_stats, :credits, :license]
27
29
 
28
30
  def index
29
31
 
@@ -33,8 +35,16 @@ class Tr8n::HelpController < Tr8n::BaseController
33
35
  render :layout => false
34
36
  end
35
37
 
36
- def lb_credits
38
+ def lb_stats
37
39
  render :layout => false
38
40
  end
41
+
42
+ def credits
43
+
44
+ end
39
45
 
46
+ def license
47
+
48
+ end
49
+
40
50
  end
@@ -24,8 +24,8 @@
24
24
  class Tr8n::Language < ActiveRecord::Base
25
25
  set_table_name :tr8n_languages
26
26
 
27
- after_save :clear_cache
28
- after_destroy :clear_cache
27
+ after_save :update_cache
28
+ after_destroy :update_cache
29
29
 
30
30
  belongs_to :fallback_language, :class_name => 'Tr8n::Language', :foreign_key => :fallback_language_id
31
31
 
@@ -303,7 +303,11 @@ class Tr8n::Language < ActiveRecord::Base
303
303
  true
304
304
  end
305
305
 
306
- def clear_cache
306
+ def translations_changed!
307
+ # TODO: handle change event - count translations, update total metrics
308
+ end
309
+
310
+ def update_cache
307
311
  Tr8n::Cache.delete("language_#{locale}")
308
312
  Tr8n::Cache.delete("featured_languages")
309
313
  Tr8n::Cache.delete("enabled_languages")
@@ -23,8 +23,8 @@
23
23
 
24
24
  class Tr8n::Translation < ActiveRecord::Base
25
25
  set_table_name :tr8n_translations
26
- after_save :clear_cache
27
- after_destroy :clear_cache
26
+ after_save :update_cache
27
+ after_destroy :update_cache
28
28
 
29
29
  belongs_to :language, :class_name => "Tr8n::Language"
30
30
  belongs_to :translation_key, :class_name => "Tr8n::TranslationKey"
@@ -86,11 +86,14 @@ class Tr8n::Translation < ActiveRecord::Base
86
86
 
87
87
  # populate language rules from the internal rules hash
88
88
  def rules
89
- return nil if super.nil? or super.empty?
90
-
89
+ super_rules = super
90
+ return nil if super_rules == nil
91
+ return nil unless super_rules.class.name == 'Array'
92
+ return nil if super_rules.size == 0
93
+
91
94
  @loaded_rules ||= begin
92
95
  rulz = []
93
- super.each do |rule|
96
+ super_rules.each do |rule|
94
97
  [rule[:rule_id]].flatten.each do |rule_id|
95
98
  language_rule = Tr8n::LanguageRule.by_id(rule_id)
96
99
  rulz << rule.merge({:rule => language_rule}) if language_rule
@@ -248,9 +251,9 @@ class Tr8n::Translation < ActiveRecord::Base
248
251
  destroy
249
252
  end
250
253
 
251
- def clear_cache
252
- Tr8n::Cache.delete("translations_#{language.locale}_#{translation_key.key}")
253
- translation_key.update_translation_count!
254
+ def update_cache
255
+ language.translations_changed!
256
+ translation_key.translations_changed!(language)
254
257
  end
255
258
 
256
259
  ###############################################################
@@ -34,7 +34,7 @@ class Tr8n::TranslationDomain < ActiveRecord::Base
34
34
  alias :key_sources :translation_key_sources
35
35
  alias :keys :translation_keys
36
36
 
37
- def self.find_or_create(url)
37
+ def self.find_or_create(url = nil)
38
38
  domain_name = URI.parse(url || 'localhost').host || 'localhost'
39
39
  Tr8n::Cache.fetch("translation_domain_#{domain_name}") do
40
40
  find_by_name(domain_name) || create(:name => domain_name)
@@ -109,12 +109,12 @@ class Tr8n::TranslationKey < ActiveRecord::Base
109
109
  # primarely used for the site map and only needs to be enabled
110
110
  # for a short period of time on a single machine
111
111
  def self.track_source(tkey, options)
112
- return unless Tr8n::Config.enable_key_source_tracking?
113
- return if options[:source].blank?
112
+ # return unless Tr8n::Config.enable_key_source_tracking?
113
+ # return if options[:source].blank?
114
+
115
+ key_source = Tr8n::Cache.cache_key_source(tkey, options[:source] || Tr8n::Config.block_options[:source])
114
116
 
115
- key_source = Tr8n::TranslationKeySource.find_or_create(tkey, Tr8n::TranslationSource.find_or_create(options[:source], options[:url]))
116
117
  return unless Tr8n::Config.enable_key_caller_tracking?
117
-
118
118
  options[:caller] ||= caller
119
119
  options[:caller_key] = options[:caller].is_a?(Array) ? options[:caller].join(", ") : options[:caller].to_s
120
120
  options[:caller_key] = generate_key(options[:caller_key])
@@ -236,10 +236,18 @@ class Tr8n::TranslationKey < ActiveRecord::Base
236
236
  def inline_translations_for(language)
237
237
  translations_for(language, -50)
238
238
  end
239
+
240
+ def translations_cache_key(language)
241
+ "translations_#{language.locale}_#{key}"
242
+ end
243
+
244
+ def clear_translations_cache_for_language(language = Tr8n::Config.current_language)
245
+ Tr8n::Cache.delete(translations_cache_key(language))
246
+ end
239
247
 
240
248
  # returns only the translations that meet the minimum rank
241
- def valid_translations_for(language)
242
- Tr8n::Cache.fetch("translations_#{language.locale}_#{key}") do
249
+ def valid_translations_for_language(language = Tr8n::Config.current_language)
250
+ Tr8n::Cache.fetch(translations_cache_key(language)) do
243
251
  translations_for(language, Tr8n::Config.translation_threshold)
244
252
  end
245
253
  end
@@ -333,7 +341,7 @@ class Tr8n::TranslationKey < ActiveRecord::Base
333
341
 
334
342
  def find_first_valid_translation(language, token_values)
335
343
  # find the first translation in the order of the rank that matches the rules
336
- valid_translations_for(language).each do |translation|
344
+ valid_translations_for_language(language).each do |translation|
337
345
  return translation if translation.matches_rules?(token_values)
338
346
  end
339
347
 
@@ -372,7 +380,7 @@ class Tr8n::TranslationKey < ActiveRecord::Base
372
380
  end
373
381
 
374
382
  def translate(language = Tr8n::Config.current_language, token_values = {}, options = {})
375
- return find_all_valid_translations(valid_translations_for(language)) if options[:api]
383
+ return find_all_valid_translations(valid_translations_for_language(language)) if options[:api]
376
384
 
377
385
  if Tr8n::Config.disabled? or language.default?
378
386
  return substitute_tokens(label, token_values, options.merge(:fallback => false), language).html_safe
@@ -436,7 +444,7 @@ class Tr8n::TranslationKey < ActiveRecord::Base
436
444
 
437
445
  classes = ['tr8n_translatable']
438
446
 
439
- if valid_translations_for(language).any?
447
+ if valid_translations_for_language(language).any?
440
448
  classes << 'tr8n_translated'
441
449
  else
442
450
  classes << 'tr8n_not_translated'
@@ -486,6 +494,18 @@ class Tr8n::TranslationKey < ActiveRecord::Base
486
494
  update_attributes(:verified_at => time)
487
495
  end
488
496
 
497
+ def translations_changed!(language = Tr8n::Config.current_language)
498
+ clear_translations_cache_for_language(language)
499
+
500
+ # update timestamp and clear cache
501
+ update_translation_count!
502
+
503
+ # notify all language sources that translation has changed
504
+ sources.each do |source|
505
+ Tr8n::TranslationSourceLanguage.touch(source, language)
506
+ end
507
+ end
508
+
489
509
  def update_translation_count!
490
510
  update_attributes(:translation_count => Tr8n::Translation.count(:conditions => ["translation_key_id = ?", self.id]))
491
511
  end
@@ -504,10 +524,6 @@ class Tr8n::TranslationKey < ActiveRecord::Base
504
524
  Tr8n::Cache.delete("translation_key_#{key}")
505
525
  end
506
526
 
507
- def add_translation(label, rules = nil, lang = Tr8n::Config.current_language, translator = Tr8n::Config.current_translator)
508
- Tr8n::Translation.create(:translation_key => self, :label => label, :language => lang, :translator => translator)
509
- end
510
-
511
527
  def to_api_hash
512
528
  {
513
529
  :key => self.key,
@@ -23,7 +23,6 @@
23
23
 
24
24
  class Tr8n::TranslationKeySource < ActiveRecord::Base
25
25
  set_table_name :tr8n_translation_key_sources
26
- after_save :clear_cache
27
26
  after_destroy :clear_cache
28
27
 
29
28
  belongs_to :translation_source, :class_name => "Tr8n::TranslationSource"
@@ -23,19 +23,19 @@
23
23
 
24
24
  class Tr8n::TranslationSource < ActiveRecord::Base
25
25
  set_table_name :tr8n_translation_sources
26
- after_save :clear_cache
27
26
  after_destroy :clear_cache
28
27
 
29
- belongs_to :translation_domain, :class_name => "Tr8n::TranslationDomain"
28
+ belongs_to :translation_domain, :class_name => "Tr8n::TranslationDomain"
30
29
 
31
- has_many :translation_key_sources, :class_name => "Tr8n::TranslationKeySource", :dependent => :destroy
32
- has_many :translation_keys, :class_name => "Tr8n::TranslationKey", :through => :translation_key_sources
30
+ has_many :translation_key_sources, :class_name => "Tr8n::TranslationKeySource", :dependent => :destroy
31
+ has_many :translation_keys, :class_name => "Tr8n::TranslationKey", :through => :translation_key_sources
32
+ has_many :translation_source_languages, :class_name => "Tr8n::TranslationSourceLanguage"
33
33
 
34
34
  alias :domain :translation_domain
35
35
  alias :sources :translation_key_sources
36
36
  alias :keys :translation_keys
37
37
 
38
- def self.find_or_create(source, url)
38
+ def self.find_or_create(source, url = nil)
39
39
  translation_domain = Tr8n::TranslationDomain.find_or_create(url)
40
40
  Tr8n::Cache.fetch("translation_source_#{translation_domain.id}_#{source}") do
41
41
  translation_source = where("source = ? and translation_domain_id = ?", source, translation_domain.id).first
@@ -0,0 +1,39 @@
1
+ #--
2
+ # Copyright (c) 2010-2011 Michael Berkovich, tr8n.net
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ class Tr8n::TranslationSourceLanguage < ActiveRecord::Base
25
+ set_table_name :tr8n_translation_source_languages
26
+
27
+ belongs_to :translation_source, :class_name => "Tr8n::TranslationSource"
28
+ belongs_to :language, :class_name => "Tr8n::Language"
29
+
30
+ def self.find_or_create(translation_source, language = Tr8n::Config.current_language)
31
+ source_lang = where("translation_source_id = ? and language_id = ?", translation_source.id, language.id).first
32
+ source_lang ||= create(:translation_source => translation_source, :language => language)
33
+ end
34
+
35
+ def self.touch(translation_source, language = Tr8n::Config.current_language)
36
+ find_or_create(translation_source, language).touch
37
+ end
38
+
39
+ end
@@ -23,8 +23,6 @@
23
23
 
24
24
  class Tr8n::Translator < ActiveRecord::Base
25
25
  set_table_name :tr8n_translators
26
- after_save :clear_cache
27
- after_destroy :clear_cache
28
26
 
29
27
  belongs_to :user, :class_name => Tr8n::Config.user_class_name, :foreign_key => :user_id
30
28
 
@@ -46,10 +44,7 @@ class Tr8n::Translator < ActiveRecord::Base
46
44
  return nil unless user and user.id
47
45
  return nil if Tr8n::Config.guest_user?(user)
48
46
  return user if user.is_a?(Tr8n::Translator)
49
-
50
- Tr8n::Cache.fetch("translator_for_#{user.id}") do
51
- find_by_user_id(user.id)
52
- end
47
+ find_by_user_id(user.id)
53
48
  end
54
49
 
55
50
  def self.find_or_create(user)
@@ -123,7 +118,7 @@ class Tr8n::Translator < ActiveRecord::Base
123
118
 
124
119
  def switched_language!(language)
125
120
  lu = Tr8n::LanguageUser.create_or_touch(user || self, language)
126
- lu.update_attributes(:translator => self) unless lu.translator
121
+ lu.update_attributes(:translator_id => self.id) unless lu.translator
127
122
  Tr8n::TranslatorLog.log(self, :switched_language, language.id)
128
123
  end
129
124
 
@@ -305,10 +300,6 @@ class Tr8n::Translator < ActiveRecord::Base
305
300
  # update_attributes(:last_ip => new_ip, :country_code => (ipl? ? ipl.ctry : nil))
306
301
  end
307
302
 
308
- def clear_cache
309
- Tr8n::Cache.delete("translator_for_#{user_id}")
310
- end
311
-
312
303
  def to_s
313
304
  name
314
305
  end
@@ -22,7 +22,7 @@
22
22
  </span>
23
23
  </span>
24
24
  <% else %>
25
- <%=link_to("&raquo;".html_safe, :controller => "/tr8n/language", :action => :table) %>
25
+ <%=link_to("&raquo;".html_safe, "/tr8n/language/table") %>
26
26
  <% end %>
27
27
  <% end %>
28
28
  </div>
@@ -13,11 +13,10 @@
13
13
  <%=javascript_include_tag(Tr8n::Config.effects_library_path) -%>
14
14
  <% end %>
15
15
 
16
- <% if Tr8n::Config.enable_google_suggestions? and Tr8n::Config.current_user_is_translator? %>
17
- <script type="text/javascript" src="<%=request.ssl? ? 'https' : 'http' %>://www.google.com/jsapi"></script>
16
+ <% if Tr8n::Config.enable_google_suggestions? and Tr8n::Config.current_user_is_translator? %>
18
17
  <script type="text/javascript">
19
- initializeTr8nGoogleSuggestions();
20
- </script>
18
+ Tr8n.google_api_key = "<%=Tr8n::Config.google_api_key %>";
19
+ </script>
21
20
  <% end %>
22
21
 
23
22
  <% if Tr8n::Config.enable_software_keyboard? %>
@@ -1,26 +1,27 @@
1
- <div style="text-align:center; margin-bottom:25px;">
2
- <h2><%=trl("Tr8n Translation Engine Shortcuts", "Help shortcuts title")%></h2>
3
-
4
- <div style="overflow:auto;max-height:450px;">
5
- <table style="width:100%" celppading="0px" cellspacing="0px">
6
- <tr>
7
- <td style="font-size:12px; font-weight:bold; padding:5px; border-bottom:1px solid #ccc; text-align:left;">Keys</td>
8
- <td style="font-size:12px; font-weight:bold; padding:5px; border-bottom:1px solid #ccc; text-align:left;">Description</td>
9
- </tr>
1
+ <div class="inner">
2
+ <div class="hd">
3
+ <span style="float:right;">
4
+ <%=link_to_function(image_tag("tr8n/close.gif"), "tr8nLightbox.hide();")%>
5
+ </span>
6
+ <%=trl("Tr8n Translation Engine Shortcuts")%>
7
+ </div>
8
+
9
+ <div class="bd" style="background-color:white;">
10
+ <div style="overflow:auto;max-height:450px;">
11
+ <table style="width:100%" celppading="0px" cellspacing="0px">
12
+ <tr>
13
+ <td style="font-size:12px; font-weight:bold; padding:5px; border-bottom:1px solid #ccc; text-align:left;"><%=trl("Key", "Shortcut key combination")%></td>
14
+ <td style="font-size:12px; font-weight:bold; padding:5px; border-bottom:1px solid #ccc; text-align:left;"><%=trl("Description", "Shortcut key description")%></td>
15
+ </tr>
10
16
 
11
- <% Tr8n::Config.default_shortcuts.keys.sort.each do |key| %>
12
- <tr>
13
- <td style="font-size:10px; padding:5px;border-bottom:1px dotted #ccc; text-align:left;"><%=key%></td>
14
- <td style="font-size:10px; padding:5px;border-bottom:1px dotted #ccc; text-align:left;"><%=Tr8n::Config.default_shortcuts[key][:description]%></td>
15
- </tr>
16
- <% end %>
17
+ <% Tr8n::Config.default_shortcuts.keys.sort.each do |key| %>
18
+ <tr>
19
+ <td style="font-size:10px; padding:5px;border-bottom:1px dotted #ccc; text-align:left;"><%=key%></td>
20
+ <td style="font-size:10px; padding:5px;border-bottom:1px dotted #ccc; text-align:left;"><%=Tr8n::Config.default_shortcuts[key][:description]%></td>
21
+ </tr>
22
+ <% end %>
17
23
 
18
- </table>
24
+ </table>
25
+ </div>
19
26
  </div>
20
27
  </div>
21
-
22
- <div class="buttons_container" style="text-align:center;">
23
- <button type="submit" class="translator_btn translator_submit_btn" onClick="tr8nLightbox.hide(); return false;">
24
- <span><%=trl("Close", "Lightbox close button")%></span>
25
- </button>
26
- </div>