tr8n 3.2.0 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. data/Gemfile.lock +3 -1
  2. data/app/assets/javascripts/tr8n/tr8n-compiled.js +336 -0
  3. data/app/assets/stylesheets/tr8n/admin.css.scss +23 -0
  4. data/app/assets/stylesheets/tr8n/components.css.scss +23 -0
  5. data/app/assets/stylesheets/tr8n/keyboard_1_49.css +271 -0
  6. data/app/assets/stylesheets/tr8n/layout.css.scss +23 -0
  7. data/app/assets/stylesheets/tr8n/tr8n.css.scss +1 -1
  8. data/app/controllers/tr8n/api/v1/base_controller.rb +6 -0
  9. data/app/controllers/tr8n/api/v1/language_controller.rb +7 -10
  10. data/app/controllers/tr8n/api/v1/translation_controller.rb +0 -1
  11. data/app/javascript/compile.rb +37 -0
  12. data/app/javascript/compile.sh +1 -0
  13. data/app/javascript/compressors/google/COPYING +202 -0
  14. data/app/javascript/compressors/google/README +292 -0
  15. data/app/javascript/compressors/google/compiler.jar +0 -0
  16. data/app/javascript/config.yml +66 -0
  17. data/app/javascript/src/base.js +35 -0
  18. data/app/javascript/src/effects.js +67 -0
  19. data/app/javascript/src/ext/inflector.js +309 -0
  20. data/app/{assets/javascripts/tr8n → javascript/src/ext}/jsDraw2D.js +0 -0
  21. data/app/{assets/javascripts/tr8n → javascript/src/ext}/keyboard_1_36.js +0 -0
  22. data/app/{assets/javascripts/tr8n → javascript/src/ext}/keyboard_1_44.js +0 -0
  23. data/app/javascript/src/ext/keyboard_1_49.js +1796 -0
  24. data/app/javascript/src/ext/md5.js +209 -0
  25. data/app/{assets/javascripts/tr8n → javascript/src/ext}/shortcut.js +0 -0
  26. data/app/javascript/src/init.js +47 -0
  27. data/app/javascript/src/language.js +38 -0
  28. data/app/javascript/src/logger.js +203 -0
  29. data/app/{assets/javascripts/tr8n/tr8n_prototype_effects.js → javascript/src/prototype/effects.js} +5 -5
  30. data/app/javascript/src/proxy.js +254 -0
  31. data/app/javascript/src/rules/date_rule.js +37 -0
  32. data/app/javascript/src/rules/gender_list_rule.js +37 -0
  33. data/app/javascript/src/rules/gender_rule.js +87 -0
  34. data/app/javascript/src/rules/language_rule.js +55 -0
  35. data/app/javascript/src/rules/list_rule.js +37 -0
  36. data/app/javascript/src/rules/numeric_rule.js +95 -0
  37. data/app/javascript/src/tml/label.js +60 -0
  38. data/app/javascript/src/tml/token.js +107 -0
  39. data/app/javascript/src/tokens/data_token.js +45 -0
  40. data/app/javascript/src/tokens/decoration_token.js +82 -0
  41. data/app/javascript/src/tokens/token.js +121 -0
  42. data/app/javascript/src/tokens/transform_token.js +106 -0
  43. data/app/javascript/src/translation_key.js +183 -0
  44. data/app/javascript/src/ui/language_case_manager.js +155 -0
  45. data/app/javascript/src/ui/language_selector.js +126 -0
  46. data/app/javascript/src/ui/lightbox.js +72 -0
  47. data/app/javascript/src/ui/translator.js +257 -0
  48. data/app/javascript/src/utils.js +286 -0
  49. data/app/models/tr8n/language_case.rb +27 -16
  50. data/app/models/tr8n/language_case_rule.rb +24 -7
  51. data/app/models/tr8n/translation_key.rb +23 -21
  52. data/app/views/tr8n/common/_scripts.html.erb +8 -10
  53. data/app/views/tr8n/language_cases/_manager_header.html.erb +3 -3
  54. data/app/views/tr8n/language_cases/manager.html.erb +2 -2
  55. data/app/views/tr8n/translations/_original_phrase.html.erb +1 -1
  56. data/lib/tr8n/extensions/action_view_extension.rb +8 -1
  57. data/lib/tr8n/keyboard_mapping.rb +101 -0
  58. data/lib/tr8n/token.rb +1 -2
  59. data/lib/tr8n/version.rb +1 -1
  60. data/spec/models/tr8n/gender_rule_spec.rb +6 -6
  61. data/spec/models/tr8n/language_case_rule_spec.rb +219 -1
  62. data/spec/models/tr8n/language_case_spec.rb +51 -1
  63. data/spec/models/tr8n/translation_key_spec.rb +256 -0
  64. data/tr8n.gemspec +2 -1
  65. metadata +129 -47
  66. data/app/assets/javascripts/tr8n/tr8n.js +0 -905
  67. data/app/assets/javascripts/tr8n/tr8n_client_sdk.js +0 -1472
@@ -32,14 +32,32 @@ class Tr8n::LanguageCase < ActiveRecord::Base
32
32
 
33
33
  serialize :definition
34
34
 
35
+ def self.cache_key(locale, keyword)
36
+ "language_case_#{locale}_#{keyword}"
37
+ end
38
+
39
+ def cache_key
40
+ self.class.cache_key(language.locale, keyword)
41
+ end
42
+
43
+ def self.by_keyword(keyword, language = Tr8n::Config.current_language)
44
+ Tr8n::Cache.fetch(cache_key(language.locale, keyword)) do
45
+ where(:language_id => language.id, :keyword => keyword).first
46
+ end
47
+ end
48
+
35
49
  def self.by_id(case_id)
36
50
  Tr8n::Cache.fetch("language_case_#{case_id}") do
37
51
  find_by_id(case_id)
38
52
  end
39
53
  end
40
-
41
- def self.by_language(language)
42
- find(:all, :conditions => ["language_id = ?", language.id])
54
+
55
+ def add_rule(definition, opts = {})
56
+ opts[:position] ||= language_case_rules.count
57
+ opts[:translator] ||= Tr8n::Config.current_translator
58
+ Tr8n::LanguageCaseRule.create(:language_case => self, :language => language,
59
+ :translator => opts[:translator], :position => opts[:position],
60
+ :definition => definition)
43
61
  end
44
62
 
45
63
  def rules
@@ -70,7 +88,10 @@ class Tr8n::LanguageCase < ActiveRecord::Base
70
88
  destroy
71
89
  end
72
90
 
73
- def apply(object, value, options)
91
+ def apply(object, value, options = {})
92
+ value = value.to_s
93
+ # pp value
94
+
74
95
  html_tag_expression = /<\/?[^>]*>/
75
96
  html_tokens = value.scan(html_tag_expression).uniq
76
97
  sanitized_value = value.gsub(html_tag_expression, "")
@@ -86,18 +107,15 @@ class Tr8n::LanguageCase < ActiveRecord::Base
86
107
  value = value.gsub(html_token, "{$#{index}}")
87
108
  end
88
109
 
89
- # pp words
110
+ # pp words
90
111
  words.each do |word|
91
112
  lcvm = Tr8n::LanguageCaseValueMap.by_language_and_keyword(language, word)
92
113
 
93
114
  if lcvm
94
- # first see if there is an exception for the value
95
115
  map_case_value = lcvm.value_for(object, keyword)
96
116
  case_value = map_case_value unless map_case_value.blank?
97
117
  else
98
- # try evaluating the rules
99
- case_rule = evaluate_rules(object, word)
100
- # pp case_rule, word
118
+ case_rule = rules.detect{|rule| rule.evaluate(object, word)}
101
119
  case_value = case_rule.apply(word) if case_rule
102
120
  end
103
121
 
@@ -112,13 +130,6 @@ class Tr8n::LanguageCase < ActiveRecord::Base
112
130
  value
113
131
  end
114
132
 
115
- def evaluate_rules(object, value)
116
- rules.each do |rule|
117
- return rule if rule.evaluate(object, value)
118
- end
119
- nil
120
- end
121
-
122
133
  def decorate_language_case(case_map_key, case_value, case_rule, options = {})
123
134
  return case_value if options[:skip_decorations]
124
135
  return case_value if language.default?
@@ -29,13 +29,26 @@ class Tr8n::LanguageCaseRule < ActiveRecord::Base
29
29
  belongs_to :translator, :class_name => "Tr8n::Translator"
30
30
 
31
31
  serialize :definition
32
-
32
+
33
+ def definition
34
+ @indifferent_def ||= HashWithIndifferentAccess.new(super)
35
+ end
36
+
37
+ def self.cache_key(id)
38
+ "language_case_rule_#{id}"
39
+ end
40
+
41
+ def cache_key
42
+ self.class.cache_key(id)
43
+ end
44
+
45
+ # TODO: what is this for?
33
46
  def self.by_id(id)
34
- Tr8n::Cache.fetch("language_case_rule_#{id}") do
47
+ Tr8n::Cache.fetch(cache_key(id)) do
35
48
  find_by_id(id)
36
49
  end
37
50
  end
38
-
51
+
39
52
  def self.gender_options
40
53
  [["not applicable", "none"], ["unknown", "unknown"], ["male", "male"], ["female", "female"]]
41
54
  end
@@ -60,7 +73,9 @@ class Tr8n::LanguageCaseRule < ActiveRecord::Base
60
73
  end
61
74
 
62
75
  def evaluate(object, value)
63
- if definition["gender"] != "none"
76
+ value = value.to_s
77
+
78
+ if ["male", "female", "unknown", "neutral"].include?(definition["gender"])
64
79
  object_gender = Tr8n::GenderRule.gender_token_value(object)
65
80
  return false if definition["gender"] == "male" and object_gender != Tr8n::GenderRule.gender_object_value_for("male")
66
81
  return false if definition["gender"] == "female" and object_gender != Tr8n::GenderRule.gender_object_value_for("female")
@@ -74,12 +89,12 @@ class Tr8n::LanguageCaseRule < ActiveRecord::Base
74
89
  return false if definition["operator"] == "or" and !(result1 or result2)
75
90
  end
76
91
 
77
- return result1
92
+ result1
78
93
  end
79
94
 
80
95
  def evaluate_part(token_value, index)
81
96
  values = sanitize_values(definition["value#{index}"])
82
-
97
+
83
98
  case definition["part#{index}"]
84
99
  when "starts_with"
85
100
  values.each do |value|
@@ -111,6 +126,8 @@ class Tr8n::LanguageCaseRule < ActiveRecord::Base
111
126
  end
112
127
 
113
128
  def apply(value)
129
+ value = value.to_s
130
+
114
131
  values = sanitize_values(definition["value1"])
115
132
  regex = values.join('|')
116
133
  case definition["operation"]
@@ -156,7 +173,7 @@ class Tr8n::LanguageCaseRule < ActiveRecord::Base
156
173
  desc << " token value"
157
174
  desc << describe_part(1)
158
175
 
159
- if definition["multipart"] == "true"
176
+ if ["true", true].include?(definition["multipart"])
160
177
  desc << " " << definition["operator"]
161
178
  desc << describe_part(2)
162
179
  end
@@ -57,7 +57,7 @@ class Tr8n::TranslationKey < ActiveRecord::Base
57
57
  existing_key = where(:key => key).first
58
58
 
59
59
  unless existing_key
60
- if options[:api] and (not Tr8n::Config.api[:allow_key_registration])
60
+ if options[:api]==:translate and (not Tr8n::Config.api[:allow_key_registration])
61
61
  raise Tr8n::KeyRegistrationException.new("Key registration through API is disabled!")
62
62
  end
63
63
  end
@@ -92,7 +92,7 @@ class Tr8n::TranslationKey < ActiveRecord::Base
92
92
  end
93
93
 
94
94
  # for backwards compatibility only - new keys will be marked as such
95
- def self.mark_as_admin(tkey, options)
95
+ def self.mark_as_admin(tkey, options = {})
96
96
  return if options[:skip_block_options]
97
97
  return unless Tr8n::Config.block_options[:admin]
98
98
  return if tkey.admin?
@@ -100,7 +100,7 @@ class Tr8n::TranslationKey < ActiveRecord::Base
100
100
  end
101
101
 
102
102
  # for backwards compatibility only - if locale is provided update it in the key
103
- def self.update_default_locale(tkey, options)
103
+ def self.update_default_locale(tkey, options = {})
104
104
  return if options[:skip_block_options]
105
105
  return unless tkey.locale.blank?
106
106
  key_locale = Tr8n::Config.block_options[:default_locale] || Tr8n::Config.default_locale
@@ -109,34 +109,36 @@ class Tr8n::TranslationKey < ActiveRecord::Base
109
109
 
110
110
  # creates associations between the translation keys and sources
111
111
  # used for the site map and javascript support
112
- def self.track_source(translation_key, options)
112
+ def self.track_source(translation_key, options = {})
113
113
 
114
- # key source tracking or client sdk must be enabled for this to work
115
- return unless Tr8n::Config.enable_key_source_tracking? or Tr8n::Config.enable_client_sdk?
114
+ # key source tracking must be enabled or request must come from an API (JavaScript) to get it registered with a source
115
+ if Tr8n::Config.enable_key_source_tracking? or options[:api] == :translate
116
116
 
117
- # source can be passed into an individual key, or as a block or fall back on the controller/action
118
- source = options[:source] || Tr8n::Config.block_options[:source] || Tr8n::Config.current_source
117
+ # source can be passed into an individual key, or as a block or fall back on the controller/action
118
+ source = options[:source] || Tr8n::Config.block_options[:source] || Tr8n::Config.current_source
119
119
 
120
- # should never be blank
121
- return if source.blank?
120
+ # should never be blank
121
+ return if source.blank?
122
122
 
123
- # each page or component is identified by a translation source
124
- translation_source = Tr8n::TranslationSource.find_or_create(source, options[:url])
123
+ # each page or component is identified by a translation source
124
+ translation_source = Tr8n::TranslationSource.find_or_create(source, options[:url])
125
125
 
126
- # each key is associated with one or more sources
127
- translation_key_source = Tr8n::TranslationKeySource.find_or_create(translation_key, translation_source)
126
+ # each key is associated with one or more sources
127
+ translation_key_source = Tr8n::TranslationKeySource.find_or_create(translation_key, translation_source)
128
+
129
+ end
128
130
 
129
131
  # for debugging purposes only - this will track the actual location of the key in the source
130
- return unless Tr8n::Config.enable_key_caller_tracking?
131
- options[:caller] ||= caller
132
- options[:caller_key] = options[:caller].is_a?(Array) ? options[:caller].join(", ") : options[:caller].to_s
133
- options[:caller_key] = generate_key(options[:caller_key])
134
- translation_key_source.update_details!(options)
132
+ if Tr8n::Config.enable_key_caller_tracking?
133
+ options[:caller] ||= caller
134
+ options[:caller_key] = options[:caller].is_a?(Array) ? options[:caller].join(", ") : options[:caller].to_s
135
+ options[:caller_key] = generate_key(options[:caller_key])
136
+ translation_key_source.update_details!(options)
137
+ end
138
+
135
139
  end
136
140
 
137
141
  def self.generate_key(label, desc = "")
138
- # TODO: there is something iffy going on with the strings from the hash
139
- # without the extra ~ = the strings are not seen in the sqlite database - wtf?
140
142
  "#{Digest::MD5.hexdigest("#{label};;;#{desc}")}~"[0..-2]
141
143
  end
142
144
 
@@ -2,8 +2,15 @@
2
2
 
3
3
  <%= tr8n_splash_screen_tag %>
4
4
 
5
+ <% if Tr8n::Config.enable_software_keyboard? %>
6
+ <script>
7
+ VKI_default_layout = "<%=Tr8n::KeyboardMapping.current_1_49%>";
8
+ </script>
9
+ <%=stylesheet_link_tag("tr8n/keyboard_1_49.css") -%>
10
+ <% end %>
11
+
5
12
  <%=stylesheet_link_tag("tr8n/tr8n.css") -%>
6
- <%=javascript_include_tag("tr8n/tr8n.js") -%>
13
+ <%=javascript_include_tag("tr8n/tr8n-compiled.js", :charset => "UTF-8") -%>
7
14
 
8
15
  <script type="text/javascript">
9
16
  initializeTr8n();
@@ -24,16 +31,7 @@
24
31
  </script>
25
32
  <% end %>
26
33
 
27
- <% if Tr8n::Config.enable_software_keyboard? %>
28
- <script>
29
- VKI_default_layout = "<%=Tr8n::KeyboardMapping.current_1_36%>";
30
- </script>
31
- <%=javascript_include_tag("tr8n/keyboard_1_36.js", :charset => "UTF-8") -%>
32
- <%=stylesheet_link_tag("tr8n/keyboard_1_36.css") -%>
33
- <% end %>
34
-
35
34
  <% if Tr8n::Config.enable_keyboard_shortcuts? %>
36
- <%=javascript_include_tag("tr8n/shortcut.js", :charset => "UTF-8") -%>
37
35
  <script type="text/javascript">
38
36
  <% Tr8n::Config.default_shortcuts.each do |key, data| %>
39
37
  shortcut.add("<%=key%>", function() {
@@ -1,16 +1,16 @@
1
1
  <div class="original_text">
2
2
  <div class="supplemental">
3
3
  <% if @map.id %>
4
- <%=link_to_function(image_tag("/tr8n/images/exclamation.png", :title=>trla("Report these language case values")), "tr8nLanguageCaseManager.reportCaseMap('#{@map.id}')")%>
4
+ <%=link_to_function(image_tag("tr8n/exclamation.png", :title=>trla("Report these language case values")), "tr8nLanguageCaseManager.reportCaseMap('#{@map.id}')")%>
5
5
  <% end %>
6
6
  <%= tr8n_help_icon_tag %>
7
7
  </div>
8
8
 
9
9
  <div class="quiet small"><%=trl("Original Word")%></div>
10
10
  <div class="quote">
11
- <%=image_tag("/tr8n/images/left_quote.png") %>
11
+ <%=image_tag("tr8n/left_quote.png") %>
12
12
  <%=@map.keyword %>
13
- <%=image_tag("/tr8n/images/right_quote.png") %>
13
+ <%=image_tag("tr8n/right_quote.png") %>
14
14
  </div>
15
15
  </div>
16
16
 
@@ -2,12 +2,12 @@
2
2
 
3
3
  <% if params[:stem_type] %>
4
4
  <% left_right = params[:stem_type].index("right") ? "right" : "left" %>
5
- <%=image_tag("/tr8n/images/top_left_stem.png", :class => "stem #{params[:stem_type]}", :style => "#{left_right}:#{params[:stem_offset]}px")%>
5
+ <%=image_tag("tr8n/top_left_stem.png", :class => "stem #{params[:stem_type]}", :style => "#{left_right}:#{params[:stem_offset]}px")%>
6
6
  <% end %>
7
7
 
8
8
  <div class="hd">
9
9
  <div class="supplemental">
10
- <%=link_to_function(image_tag("/tr8n/images/close.gif", :title=>trl("Close")), "tr8nLanguageCaseManager.hide()")%>
10
+ <%=link_to_function(image_tag("tr8n/close.gif", :title=>trl("Close")), "tr8nLanguageCaseManager.hide()")%>
11
11
  </div>
12
12
  <%= tr8n_language_flag_tag(tr8n_current_language) %>
13
13
  <%= trla("{language} Language Cases", nil, :language => tr8n_current_language.native_name) %>
@@ -1,7 +1,7 @@
1
1
  <% color = translation.key.locked? ? "#ECFFEF" : "#FDFDDF" %>
2
2
  <div style="font-size: 11px; color: grey; margin-top:5px; margin-bottom:5px; padding:3px; background:<%=color%>; border:1px dotted #ccc;">
3
3
  <% if translation.key.locked? %>
4
- <div style="float:right"><%=image_tag("/tr8n/images/lock.png", :style=>"width:12px", :title => trla("This phrase is locked"))%></div>
4
+ <div style="float:right"><%=image_tag("tr8n/lock.png", :style=>"width:12px", :title => trla("This phrase is locked"))%></div>
5
5
  <% end %>
6
6
 
7
7
  <%=tra("Original Phrase:", "Translation section header")%> <%=link_to(translation.key.sanitized_label, :controller => "/tr8n/phrases", :action => :view, :locale => translation.language.locale, :translation_key_id => translation.key.id) %>
@@ -89,7 +89,8 @@ module Tr8n
89
89
 
90
90
  client_var_name = opts[:client_var_name] || :tr8nProxy
91
91
 
92
- html = [javascript_include_tag("tr8n/tr8n_client_sdk.js")]
92
+ html = []
93
+ # html << [javascript_include_tag("tr8n/tr8n_client_sdk.js")]
93
94
  html << "<script>"
94
95
  html << " var #{client_var_name} = new Tr8n.Proxy(#{opts.to_json});"
95
96
  html << " function reloadTranslations() { "
@@ -101,6 +102,12 @@ module Tr8n
101
102
  html << " function trl(label, description, tokens, options) { "
102
103
  html << " return #{client_var_name}.trl(label, description, tokens, options); "
103
104
  html << " } "
105
+
106
+ # TODO: check if TML is enabled
107
+ html << " Tr8n.Utils.addEvent(window, 'load', function() { "
108
+ html << " #{client_var_name}.initTml(); "
109
+ html << " }) "
110
+
104
111
  html << "</script>"
105
112
  html.join("\n").html_safe
106
113
  end
@@ -172,5 +172,106 @@ module Tr8n
172
172
 
173
173
  return "US International"
174
174
  end
175
+
176
+ def self.current_1_49
177
+ [
178
+ {:key => '\u0627\u0644\u0639\u0631\u0628\u064a\u0629', :name => 'Arabic', :locale => ''},
179
+ {:key => '\u0985\u09b8\u09ae\u09c0\u09df\u09be', :name => 'Assamese', :locale => ''},
180
+ {:key => '\u0410\u0437\u04d9\u0440\u0431\u0430\u0458\u04b9\u0430\u043d\u04b9\u0430', :name => 'Azerbaijani Cyrillic', :locale => ''},
181
+ {:key => 'Az\u0259rbaycanca', :name => 'Azerbaijani Latin', :locale => ''},
182
+ {:key => '\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f', :name => 'Belarusian', :locale => ''},
183
+ {:key => 'Belgische / Belge', :name => 'Belgian', :locale => ''},
184
+ {:key => '\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438 \u0424\u043e\u043d\u0435\u0442\u0438\u0447\u0435\u043d', :name => 'Bulgarian Phonetic', :locale => ''},
185
+ {:key => '\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438', :name => 'Bulgarian BDS', :locale => ''},
186
+ {:key => '\u09ac\u09be\u0982\u09b2\u09be', :name => 'Bengali', :locale => ''},
187
+ {:key => 'Bosanski', :name => 'Bosnian', :locale => ''},
188
+ {:key => 'Canadienne-fran\u00e7aise', :name => 'Canadian French', :locale => ''},
189
+ {:key => '\u010cesky', :name => 'Czech', :locale => ''},
190
+ {:key => 'Dansk', :name => 'Danish', :locale => ''},
191
+ {:key => 'Deutsch', :name => 'German', :locale => ''},
192
+ {:key => 'Dingbats', :name => 'Dingbats', :locale => ''},
193
+ {:key => '\u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0', :name => 'Divehi', :locale => ''},
194
+ {:key => 'Dvorak', :name => 'Dvorak', :locale => ''},
195
+ {:key => '\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac', :name => 'Greek', :locale => ''},
196
+ {:key => 'Eesti', :name => 'Estonian', :locale => ''},
197
+ {:key => 'Espa\u00f1ol', :name => 'Spanish', :locale => ''},
198
+ {:key => '\u062f\u0631\u06cc', :name => 'Dari', :locale => ''},
199
+ {:key => '\u0641\u0627\u0631\u0633\u06cc', :name => 'Farsi', :locale => ''},
200
+ {:key => 'F\u00f8royskt', :name => 'Faeroese', :locale => ''},
201
+ {:key => 'Fran\u00e7ais', :name => 'French', :locale => ''},
202
+ {:key => 'Gaeilge', :name => 'Irish / Gaelic', :locale => ''},
203
+ {:key => '\u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0', :name => 'Gujarati', :locale => ''},
204
+ {:key => '\u05e2\u05d1\u05e8\u05d9\u05ea', :name => 'Hebrew', :locale => ''},
205
+ {:key => '\u0926\u0947\u0935\u0928\u093e\u0917\u0930\u0940', :name => 'Devanagari', :locale => ''},
206
+ {:key => '\u0939\u093f\u0902\u0926\u0940', :name => 'Hindi', :locale => ''},
207
+ {:key => 'Hrvatski', :name => 'Croatian', :locale => ''},
208
+ {:key => '\u0540\u0561\u0575\u0565\u0580\u0565\u0576 \u0561\u0580\u0565\u0582\u0574\u0578\u0582\u057f\u0584', :name => 'Western Armenian', :locale => ''},
209
+ {:key => '\u0540\u0561\u0575\u0565\u0580\u0565\u0576 \u0561\u0580\u0565\u0582\u0565\u056c\u0584', :name => 'Eastern Armenian', :locale => ''},
210
+ {:key => '\u00cdslenska', :name => 'Icelandic', :locale => ''},
211
+ {:key => 'Italiano', :name => 'Italian', :locale => ''},
212
+ {:key => '\u65e5\u672c\u8a9e', :name => 'Japanese Hiragana/Katakana', :locale => ''},
213
+ {:key => '\u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8', :name => 'Georgian', :locale => ''},
214
+ {:key => '\u049a\u0430\u0437\u0430\u049b\u0448\u0430', :name => 'Kazakh', :locale => ''},
215
+ {:key => '\u1797\u17b6\u179f\u17b6\u1781\u17d2\u1798\u17c2\u179a', :name => 'Khmer', :locale => ''},
216
+ {:key => '\u0c95\u0ca8\u0ccd\u0ca8\u0ca1', :name => 'Kannada', :locale => ''},
217
+ {:key => '\ud55c\uad6d\uc5b4', :name => 'Korean', :locale => ''},
218
+ {:key => 'Kurd\u00ee', :name => 'Kurdish', :locale => ''},
219
+ {:key => '\u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430', :name => 'Kyrgyz', :locale => ''},
220
+ {:key => 'Latvie\u0161u', :name => 'Latvian', :locale => ''},
221
+ {:key => 'Lietuvi\u0173', :name => 'Lithuanian', :locale => ''},
222
+ {:key => 'Magyar', :name => 'Hungarian', :locale => ''},
223
+ {:key => 'Malti', :name => 'Maltese 48', :locale => ''},
224
+ {:key => '\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438', :name => 'Macedonian Cyrillic', :locale => ''},
225
+ {:key => '\u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02', :name => 'Malayalam', :locale => ''},
226
+ {:key => 'Misc. Symbols', :name => 'Misc. Symbols', :locale => ''},
227
+ {:key => '\u041c\u043e\u043d\u0433\u043e\u043b', :name => 'Mongolian Cyrillic', :locale => ''},
228
+ {:key => '\u092e\u0930\u093e\u0920\u0940', :name => 'Marathi', :locale => ''},
229
+ {:key => '\u1019\u103c\u1014\u103a\u1019\u102c\u1018\u102c\u101e\u102c', :name => 'Burmese', :locale => ''},
230
+ {:key => 'Nederlands', :name => 'Dutch', :locale => ''},
231
+ {:key => 'Norsk', :name => 'Norwegian', :locale => ''},
232
+ {:key => '\u067e\u069a\u062a\u0648', :name => 'Pashto', :locale => ''},
233
+ {:key => '\u0a2a\u0a70\u0a1c\u0a3e\u0a2c\u0a40', :name => 'Punjabi (Gurmukhi)', :locale => ''},
234
+ {:key => '\u62fc\u97f3 (Pinyin)', :name => 'Pinyin', :locale => ''},
235
+ {:key => 'Polski', :name => 'Polish (214)', :locale => ''},
236
+ {:key => 'Polski Programisty', :name => 'Polish Programmers', :locale => ''},
237
+ {:key => 'Portugu\u00eas Brasileiro', :name => 'Portuguese (Brazil)', :locale => ''},
238
+ {:key => 'Portugu\u00eas', :name => 'Portuguese', :locale => ''},
239
+ {:key => 'Rom\u00e2n\u0103', :name => 'Romanian', :locale => ''},
240
+ {:key => '\u0420\u0443\u0441\u0441\u043a\u0438\u0439', :name => 'Russian', :locale => ''},
241
+ {:key => 'Schweizerdeutsch', :name => 'Swiss German', :locale => ''},
242
+ {:key => 'Shqip', :name => 'Albanian', :locale => ''},
243
+ {:key => 'Sloven\u010dina', :name => 'Slovak', :locale => ''},
244
+ {:key => 'Sloven\u0161\u010dina', :name => 'Slovenian', :locale => ''},
245
+ {:key => '\u0441\u0440\u043f\u0441\u043a\u0438', :name => 'Serbian Cyrillic', :locale => ''},
246
+ {:key => 'Srpski', :name => 'Serbian Latin', :locale => ''},
247
+ {:key => 'Suomi', :name => 'Finnish', :locale => ''},
248
+ {:key => 'Svenska', :name => 'Swedish', :locale => ''},
249
+ {:key => 'Swiss Fran\u00e7ais', :name => 'Swiss French', :locale => ''},
250
+ {:key => '\u0723\u0718\u072a\u071d\u071d\u0710', :name => 'Syriac', :locale => ''},
251
+ {:key => '\u0ba4\u0bae\u0bbf\u0bb4\u0bcd', :name => 'Tamil', :locale => ''},
252
+ {:key => '\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41', :name => 'Telugu', :locale => ''},
253
+ {:key => 'Ti\u1ebfng Vi\u1ec7t', :name => 'Vietnamese', :locale => ''},
254
+ {:key => '\u0e44\u0e17\u0e22 Kedmanee', :name => 'Thai Kedmane', :locale => ''},
255
+ {:key => '\u0e44\u0e17\u0e22 Pattachote', :name => 'Thai Pattachote', :locale => ''},
256
+ {:key => '\u0422\u0430\u0442\u0430\u0440\u0447\u0430', :name => 'Tatar', :locale => ''},
257
+ {:key => 'T\u00fcrk\u00e7e F', :name => 'Turkish F', :locale => ''},
258
+ {:key => 'T\u00fcrk\u00e7e Q', :name => 'Turkish Q', :locale => ''},
259
+ {:key => '\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430', :name => 'Ukrainian', :locale => ''},
260
+ {:key => 'United Kingdom', :name => 'United Kingdom', :locale => ''},
261
+ {:key => '\u0627\u0631\u062f\u0648', :name => 'Urdu', :locale => ''},
262
+ {:key => '\u0627\u0631\u062f\u0648 Phonetic', :name => 'Urdu Phonetic', :locale => ''},
263
+ {:key => 'US Standard', :name => 'US Standard', :locale => ''},
264
+ {:key => 'US International', :name => 'US International', :locale => ''},
265
+ {:key => '\u040e\u0437\u0431\u0435\u043a\u0447\u0430', :name => 'Uzbek Cyrillic', :locale => ''},
266
+ {:key => '\u05d9\u05d9\u05b4\u05d3\u05d9\u05e9', :name => 'Yiddish', :locale => ''},
267
+ {:key => '\u05d9\u05d9\u05b4\u05d3\u05d9\u05e9 \u05dc\u05e2\u05d1\u05d8', :name => 'Yiddish (Yidish Lebt)', :locale => ''},
268
+ {:key => '\u4e2d\u6587\u6ce8\u97f3\u7b26\u53f7', :name => 'Chinese Bopomofo IME', :locale => ''},
269
+ {:key => '\u4e2d\u6587\u4ed3\u9889\u8f93\u5165\u6cd5', :name => 'Chinese Cangjie IME', :locale => ''}
270
+ ].each do |kb|
271
+ return kb[:key] if kb[:name].index(Tr8n::Config.current_language.english_name.split(" ").first)
272
+ end
273
+
274
+ return "US International"
275
+ end
175
276
  end
176
277
  end
@@ -201,7 +201,7 @@ module Tr8n
201
201
  value = ERB::Util.html_escape(value)
202
202
  end
203
203
  end
204
-
204
+
205
205
  if has_case_key?
206
206
  value = apply_case(object, value, options, language)
207
207
  end
@@ -402,7 +402,6 @@ module Tr8n
402
402
  end
403
403
 
404
404
  def substitute(label, values = {}, options = {}, language = Tr8n::Config.current_language)
405
-
406
405
  # get the object from the values
407
406
  object = values[name_key]
408
407