tr8n 3.0.2

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 (751) hide show
  1. data/.project +18 -0
  2. data/Gemfile +34 -0
  3. data/Gemfile.lock +79 -0
  4. data/LICENSE +18 -0
  5. data/README.rdoc +116 -0
  6. data/Rakefile +29 -0
  7. data/VERSION +1 -0
  8. data/app/controllers/application_controller.rb +28 -0
  9. data/app/controllers/tr8n/admin/base_controller.rb +65 -0
  10. data/app/controllers/tr8n/admin/clientsdk_controller.rb +34 -0
  11. data/app/controllers/tr8n/admin/domain_controller.rb +77 -0
  12. data/app/controllers/tr8n/admin/forum_controller.rb +58 -0
  13. data/app/controllers/tr8n/admin/glossary_controller.rb +56 -0
  14. data/app/controllers/tr8n/admin/language_controller.rb +129 -0
  15. data/app/controllers/tr8n/admin/translation_controller.rb +64 -0
  16. data/app/controllers/tr8n/admin/translation_key_controller.rb +157 -0
  17. data/app/controllers/tr8n/admin/translator_controller.rb +119 -0
  18. data/app/controllers/tr8n/api/v1/base_controller.rb +81 -0
  19. data/app/controllers/tr8n/api/v1/language_controller.rb +107 -0
  20. data/app/controllers/tr8n/api/v1/translation_controller.rb +75 -0
  21. data/app/controllers/tr8n/api/v1/translator_controller.rb +34 -0
  22. data/app/controllers/tr8n/awards_controller.rb +43 -0
  23. data/app/controllers/tr8n/base_controller.rb +206 -0
  24. data/app/controllers/tr8n/dashboard_controller.rb +32 -0
  25. data/app/controllers/tr8n/forum_controller.rb +100 -0
  26. data/app/controllers/tr8n/glossary_controller.rb +40 -0
  27. data/app/controllers/tr8n/help_controller.rb +40 -0
  28. data/app/controllers/tr8n/home_controller.rb +51 -0
  29. data/app/controllers/tr8n/language_cases_controller.rb +82 -0
  30. data/app/controllers/tr8n/language_controller.rb +372 -0
  31. data/app/controllers/tr8n/login_controller.rb +86 -0
  32. data/app/controllers/tr8n/phrases_controller.rb +293 -0
  33. data/app/controllers/tr8n/translations_controller.rb +194 -0
  34. data/app/controllers/tr8n/translator_controller.rb +83 -0
  35. data/app/helpers/application_helper.rb +27 -0
  36. data/app/helpers/tr8n/admin/base_helper.rb +84 -0
  37. data/app/helpers/tr8n/base_helper.rb +44 -0
  38. data/app/helpers/tr8n/dashboard_helper.rb +43 -0
  39. data/app/models/tr8n/base_filter.rb +68 -0
  40. data/app/models/tr8n/daily_language_metric.rb +42 -0
  41. data/app/models/tr8n/date_rule.rb +123 -0
  42. data/app/models/tr8n/gender_list_rule.rb +247 -0
  43. data/app/models/tr8n/gender_rule.rb +140 -0
  44. data/app/models/tr8n/glossary.rb +27 -0
  45. data/app/models/tr8n/glossary_filter.rb +33 -0
  46. data/app/models/tr8n/integration/ru/russian_gender_list_rule.rb +60 -0
  47. data/app/models/tr8n/integration/ru/russian_numeric_rule.rb +64 -0
  48. data/app/models/tr8n/ip_location.rb +74 -0
  49. data/app/models/tr8n/ip_location_filter.rb +34 -0
  50. data/app/models/tr8n/language.rb +318 -0
  51. data/app/models/tr8n/language_case.rb +141 -0
  52. data/app/models/tr8n/language_case_filter.rb +30 -0
  53. data/app/models/tr8n/language_case_rule.rb +187 -0
  54. data/app/models/tr8n/language_case_rule_filter.rb +30 -0
  55. data/app/models/tr8n/language_case_value_map.rb +100 -0
  56. data/app/models/tr8n/language_case_value_map_filter.rb +41 -0
  57. data/app/models/tr8n/language_filter.rb +75 -0
  58. data/app/models/tr8n/language_forum_abuse_report.rb +33 -0
  59. data/app/models/tr8n/language_forum_abuse_report_filter.rb +30 -0
  60. data/app/models/tr8n/language_forum_message.rb +46 -0
  61. data/app/models/tr8n/language_forum_message_filter.rb +34 -0
  62. data/app/models/tr8n/language_forum_topic.rb +41 -0
  63. data/app/models/tr8n/language_forum_topic_filter.rb +34 -0
  64. data/app/models/tr8n/language_metric.rb +91 -0
  65. data/app/models/tr8n/language_metric_filter.rb +63 -0
  66. data/app/models/tr8n/language_rule.rb +117 -0
  67. data/app/models/tr8n/language_rule_filter.rb +45 -0
  68. data/app/models/tr8n/language_user.rb +61 -0
  69. data/app/models/tr8n/language_user_filter.rb +34 -0
  70. data/app/models/tr8n/list_rule.rb +118 -0
  71. data/app/models/tr8n/monthly_language_metric.rb +34 -0
  72. data/app/models/tr8n/numeric_rule.rb +175 -0
  73. data/app/models/tr8n/total_language_metric.rb +59 -0
  74. data/app/models/tr8n/translation.rb +299 -0
  75. data/app/models/tr8n/translation_domain.rb +48 -0
  76. data/app/models/tr8n/translation_domain_filter.rb +26 -0
  77. data/app/models/tr8n/translation_filter.rb +34 -0
  78. data/app/models/tr8n/translation_key.rb +625 -0
  79. data/app/models/tr8n/translation_key_comment.rb +37 -0
  80. data/app/models/tr8n/translation_key_comment_filter.rb +30 -0
  81. data/app/models/tr8n/translation_key_filter.rb +45 -0
  82. data/app/models/tr8n/translation_key_lock.rb +59 -0
  83. data/app/models/tr8n/translation_key_lock_filter.rb +30 -0
  84. data/app/models/tr8n/translation_key_source.rb +58 -0
  85. data/app/models/tr8n/translation_key_source_filter.rb +30 -0
  86. data/app/models/tr8n/translation_source.rb +52 -0
  87. data/app/models/tr8n/translation_source_filter.rb +30 -0
  88. data/app/models/tr8n/translation_vote.rb +36 -0
  89. data/app/models/tr8n/translation_vote_filter.rb +34 -0
  90. data/app/models/tr8n/translator.rb +301 -0
  91. data/app/models/tr8n/translator_filter.rb +46 -0
  92. data/app/models/tr8n/translator_following.rb +38 -0
  93. data/app/models/tr8n/translator_following_filter.rb +34 -0
  94. data/app/models/tr8n/translator_log.rb +120 -0
  95. data/app/models/tr8n/translator_log_filter.rb +49 -0
  96. data/app/models/tr8n/translator_metric.rb +83 -0
  97. data/app/models/tr8n/translator_metric_filter.rb +38 -0
  98. data/app/models/tr8n/translator_report.rb +82 -0
  99. data/app/models/tr8n/translator_report_filter.rb +30 -0
  100. data/app/models/tr8n/value_rule.rb +117 -0
  101. data/app/views/layouts/_footer.html.erb +15 -0
  102. data/app/views/layouts/_header.html.erb +12 -0
  103. data/app/views/layouts/_html_head.html.erb +5 -0
  104. data/app/views/layouts/tr8n.html.erb +21 -0
  105. data/app/views/layouts/tr8n_admin.html.erb +33 -0
  106. data/app/views/tr8n/admin/clientsdk/index.html.erb +133 -0
  107. data/app/views/tr8n/admin/clientsdk/lb_samples.html.erb +54 -0
  108. data/app/views/tr8n/admin/common/_footer.html.erb +1 -0
  109. data/app/views/tr8n/admin/common/_header.html.erb +30 -0
  110. data/app/views/tr8n/admin/common/_lightbox_buttons.html.erb +5 -0
  111. data/app/views/tr8n/admin/common/_paginator.html.erb +20 -0
  112. data/app/views/tr8n/admin/domain/_tabs.html.erb +23 -0
  113. data/app/views/tr8n/admin/domain/index.html.erb +33 -0
  114. data/app/views/tr8n/admin/domain/key_sources.rhtml +53 -0
  115. data/app/views/tr8n/admin/domain/lb_caller.html.erb +35 -0
  116. data/app/views/tr8n/admin/domain/sources.html.erb +35 -0
  117. data/app/views/tr8n/admin/forum/_tabs.html.erb +22 -0
  118. data/app/views/tr8n/admin/forum/index.html.erb +34 -0
  119. data/app/views/tr8n/admin/forum/messages.html.erb +33 -0
  120. data/app/views/tr8n/admin/forum/reports.html.erb +50 -0
  121. data/app/views/tr8n/admin/glossary/index.html.erb +22 -0
  122. data/app/views/tr8n/admin/glossary/lb_update.html.erb +26 -0
  123. data/app/views/tr8n/admin/language/_rules.html.erb +22 -0
  124. data/app/views/tr8n/admin/language/_tabs.html.erb +27 -0
  125. data/app/views/tr8n/admin/language/_users.html.erb +40 -0
  126. data/app/views/tr8n/admin/language/case_rules.html.erb +24 -0
  127. data/app/views/tr8n/admin/language/case_values.html.erb +25 -0
  128. data/app/views/tr8n/admin/language/cases.html.erb +24 -0
  129. data/app/views/tr8n/admin/language/charts.html.erb +35 -0
  130. data/app/views/tr8n/admin/language/index.html.erb +99 -0
  131. data/app/views/tr8n/admin/language/lb_update.html.erb +76 -0
  132. data/app/views/tr8n/admin/language/lb_value_map.html.erb +42 -0
  133. data/app/views/tr8n/admin/language/metrics.rhtml +16 -0
  134. data/app/views/tr8n/admin/language/rules.html.erb +24 -0
  135. data/app/views/tr8n/admin/language/users.rhtml +31 -0
  136. data/app/views/tr8n/admin/language/view.html.erb +106 -0
  137. data/app/views/tr8n/admin/translation/_tabs.html.erb +21 -0
  138. data/app/views/tr8n/admin/translation/index.html.erb +75 -0
  139. data/app/views/tr8n/admin/translation/view.html.erb +142 -0
  140. data/app/views/tr8n/admin/translation/votes.rhtml +81 -0
  141. data/app/views/tr8n/admin/translation_key/_tabs.html.erb +22 -0
  142. data/app/views/tr8n/admin/translation_key/comments.html.erb +49 -0
  143. data/app/views/tr8n/admin/translation_key/index.html.erb +79 -0
  144. data/app/views/tr8n/admin/translation_key/lb_merge.html.erb +43 -0
  145. data/app/views/tr8n/admin/translation_key/lb_update.html.erb +44 -0
  146. data/app/views/tr8n/admin/translation_key/locks.html.erb +51 -0
  147. data/app/views/tr8n/admin/translation_key/view.html.erb +192 -0
  148. data/app/views/tr8n/admin/translator/_list.html.erb +51 -0
  149. data/app/views/tr8n/admin/translator/_tabs.html.erb +26 -0
  150. data/app/views/tr8n/admin/translator/following.html.erb +20 -0
  151. data/app/views/tr8n/admin/translator/index.html.erb +77 -0
  152. data/app/views/tr8n/admin/translator/ip_locations.html.erb +9 -0
  153. data/app/views/tr8n/admin/translator/lb_register.html.erb +18 -0
  154. data/app/views/tr8n/admin/translator/log.html.erb +27 -0
  155. data/app/views/tr8n/admin/translator/metrics.html.erb +25 -0
  156. data/app/views/tr8n/admin/translator/reports.html.erb +22 -0
  157. data/app/views/tr8n/admin/translator/view.html.erb +228 -0
  158. data/app/views/tr8n/awards/_list.html.erb +46 -0
  159. data/app/views/tr8n/awards/index.html.erb +42 -0
  160. data/app/views/tr8n/common/_flashes.html.erb +39 -0
  161. data/app/views/tr8n/common/_footer.html.erb +1 -0
  162. data/app/views/tr8n/common/_header.html.erb +5 -0
  163. data/app/views/tr8n/common/_language_selector.html.erb +8 -0
  164. data/app/views/tr8n/common/_language_strip.html.erb +29 -0
  165. data/app/views/tr8n/common/_language_table.html.erb +13 -0
  166. data/app/views/tr8n/common/_paginator.html.erb +8 -0
  167. data/app/views/tr8n/common/_permutations.html.erb +37 -0
  168. data/app/views/tr8n/common/_scripts.html.erb +49 -0
  169. data/app/views/tr8n/common/_splash_screen.html.erb +9 -0
  170. data/app/views/tr8n/common/_splash_screen_legacy.html.erb +4 -0
  171. data/app/views/tr8n/common/_tabs.html.erb +39 -0
  172. data/app/views/tr8n/common/_translation_votes.html.erb +41 -0
  173. data/app/views/tr8n/common/_translator_login.html.erb +11 -0
  174. data/app/views/tr8n/dashboard/_forum.html.erb +25 -0
  175. data/app/views/tr8n/dashboard/_language_metric.html.erb +49 -0
  176. data/app/views/tr8n/dashboard/_statistics.html.erb +35 -0
  177. data/app/views/tr8n/dashboard/_translations.html.erb +24 -0
  178. data/app/views/tr8n/dashboard/_translator_metric.html.erb +68 -0
  179. data/app/views/tr8n/dashboard/_votes.html.erb +76 -0
  180. data/app/views/tr8n/dashboard/index.rhtml +115 -0
  181. data/app/views/tr8n/forum/_message.html.erb +17 -0
  182. data/app/views/tr8n/forum/_messages.html.erb +21 -0
  183. data/app/views/tr8n/forum/_new_message.html.erb +28 -0
  184. data/app/views/tr8n/forum/_new_topic.html.erb +49 -0
  185. data/app/views/tr8n/forum/index.html.erb +84 -0
  186. data/app/views/tr8n/forum/topic.html.erb +36 -0
  187. data/app/views/tr8n/glossary/index.html.erb +42 -0
  188. data/app/views/tr8n/help/_navigation.html.erb +127 -0
  189. data/app/views/tr8n/help/awards.html.erb +13 -0
  190. data/app/views/tr8n/help/basic_information.html.erb +13 -0
  191. data/app/views/tr8n/help/context_rules.html.erb +13 -0
  192. data/app/views/tr8n/help/creating_translations.html.erb +16 -0
  193. data/app/views/tr8n/help/dashboard.html.erb +13 -0
  194. data/app/views/tr8n/help/direction.html.erb +13 -0
  195. data/app/views/tr8n/help/discussions.html.erb +13 -0
  196. data/app/views/tr8n/help/enter_translation.html.erb +13 -0
  197. data/app/views/tr8n/help/fallback_language.html.erb +13 -0
  198. data/app/views/tr8n/help/generate_context_rules.html.erb +17 -0
  199. data/app/views/tr8n/help/index.html.erb +18 -0
  200. data/app/views/tr8n/help/inline_translations.html.erb +28 -0
  201. data/app/views/tr8n/help/language_dashboard.html.erb +21 -0
  202. data/app/views/tr8n/help/language_phrases.html.erb +17 -0
  203. data/app/views/tr8n/help/language_selector.html.erb +13 -0
  204. data/app/views/tr8n/help/language_statistics.html.erb +13 -0
  205. data/app/views/tr8n/help/lb_credits.html.erb +9 -0
  206. data/app/views/tr8n/help/lb_shortcuts.html.erb +26 -0
  207. data/app/views/tr8n/help/manage.html.erb +13 -0
  208. data/app/views/tr8n/help/manage_language.html.erb +13 -0
  209. data/app/views/tr8n/help/native_name.html.erb +13 -0
  210. data/app/views/tr8n/help/original_phrase.html.erb +13 -0
  211. data/app/views/tr8n/help/other_languages.html.erb +15 -0
  212. data/app/views/tr8n/help/other_translatable_resources.html.erb +13 -0
  213. data/app/views/tr8n/help/phrases.html.erb +19 -0
  214. data/app/views/tr8n/help/phrases_with_translations.html.erb +21 -0
  215. data/app/views/tr8n/help/phrases_without_translations.html.erb +15 -0
  216. data/app/views/tr8n/help/prohibited_words.html.erb +13 -0
  217. data/app/views/tr8n/help/rank.html.erb +13 -0
  218. data/app/views/tr8n/help/recent_discussions.html.erb +13 -0
  219. data/app/views/tr8n/help/recent_translation_votes.html.erb +13 -0
  220. data/app/views/tr8n/help/recent_translations.html.erb +13 -0
  221. data/app/views/tr8n/help/site_map.html.erb +17 -0
  222. data/app/views/tr8n/help/site_sections.html.erb +13 -0
  223. data/app/views/tr8n/help/suggested_translation.html.erb +13 -0
  224. data/app/views/tr8n/help/translating_inline.html.erb +30 -0
  225. data/app/views/tr8n/help/translation_context_rules.html.erb +16 -0
  226. data/app/views/tr8n/help/translation_rank.html.erb +17 -0
  227. data/app/views/tr8n/help/translation_tokens.html.erb +13 -0
  228. data/app/views/tr8n/help/translation_tools.html.erb +13 -0
  229. data/app/views/tr8n/help/translations.html.erb +13 -0
  230. data/app/views/tr8n/help/user_rank.html.erb +13 -0
  231. data/app/views/tr8n/help/using_translation_tools.html.erb +13 -0
  232. data/app/views/tr8n/help/voting_on_translations.html.erb +13 -0
  233. data/app/views/tr8n/help/your_dashboard.html.erb +17 -0
  234. data/app/views/tr8n/help/your_languages.html.erb +19 -0
  235. data/app/views/tr8n/help/your_translations.html.erb +17 -0
  236. data/app/views/tr8n/home/credits.html.erb +102 -0
  237. data/app/views/tr8n/home/docs.html.erb +3 -0
  238. data/app/views/tr8n/home/index.html.erb +37 -0
  239. data/app/views/tr8n/home/integration.html.erb +564 -0
  240. data/app/views/tr8n/home/languages.html.erb +7 -0
  241. data/app/views/tr8n/home/license.html.erb +586 -0
  242. data/app/views/tr8n/home/rules.html.erb +668 -0
  243. data/app/views/tr8n/home/tokens.html.erb +324 -0
  244. data/app/views/tr8n/language/_basic_info.html.erb +53 -0
  245. data/app/views/tr8n/language/_edit_language_case_rules.html.erb +51 -0
  246. data/app/views/tr8n/language/_edit_language_cases.html.erb +68 -0
  247. data/app/views/tr8n/language/_edit_rules.html.erb +46 -0
  248. data/app/views/tr8n/language/_grammar.html.erb +84 -0
  249. data/app/views/tr8n/language/_header.html.erb +14 -0
  250. data/app/views/tr8n/language/_language_cases.html.erb +196 -0
  251. data/app/views/tr8n/language/_lists.html.erb +56 -0
  252. data/app/views/tr8n/language/_prohibited_words.html.erb +16 -0
  253. data/app/views/tr8n/language/_translator_dependencies.html.erb +27 -0
  254. data/app/views/tr8n/language/_translator_header.html.erb +19 -0
  255. data/app/views/tr8n/language/_translator_submit.html.erb +141 -0
  256. data/app/views/tr8n/language/_translator_votes.html.erb +27 -0
  257. data/app/views/tr8n/language/index.html.erb +54 -0
  258. data/app/views/tr8n/language/lb_language_case_rule.html.erb +94 -0
  259. data/app/views/tr8n/language/rules/_date_rule.html.erb +3 -0
  260. data/app/views/tr8n/language/rules/_gender_list_rule.html.erb +23 -0
  261. data/app/views/tr8n/language/rules/_gender_rule.html.erb +3 -0
  262. data/app/views/tr8n/language/rules/_list_rule.html.erb +3 -0
  263. data/app/views/tr8n/language/rules/_number_rule.html.erb +24 -0
  264. data/app/views/tr8n/language/rules/_value_rule.html.erb +3 -0
  265. data/app/views/tr8n/language/select.html.erb +72 -0
  266. data/app/views/tr8n/language/table.html.erb +32 -0
  267. data/app/views/tr8n/language/translator.html.erb +18 -0
  268. data/app/views/tr8n/language_cases/_gender_based.html.erb +32 -0
  269. data/app/views/tr8n/language_cases/_gender_neutral.html.erb +25 -0
  270. data/app/views/tr8n/language_cases/_manager_header.html.erb +18 -0
  271. data/app/views/tr8n/language_cases/index.html.erb +54 -0
  272. data/app/views/tr8n/language_cases/manager.html.erb +60 -0
  273. data/app/views/tr8n/login/index.html.erb +33 -0
  274. data/app/views/tr8n/login/register.html.erb +57 -0
  275. data/app/views/tr8n/phrases/_breadcrumb.html.erb +11 -0
  276. data/app/views/tr8n/phrases/_comment.html.erb +17 -0
  277. data/app/views/tr8n/phrases/_comments_module.html.erb +37 -0
  278. data/app/views/tr8n/phrases/_dictionary.rhtml +29 -0
  279. data/app/views/tr8n/phrases/_header.html.erb +24 -0
  280. data/app/views/tr8n/phrases/_new_comment.html.erb +31 -0
  281. data/app/views/tr8n/phrases/_permutations_module.html.erb +30 -0
  282. data/app/views/tr8n/phrases/_tokens.html.erb +122 -0
  283. data/app/views/tr8n/phrases/_toolbar.html.erb +33 -0
  284. data/app/views/tr8n/phrases/_translation_module.html.erb +127 -0
  285. data/app/views/tr8n/phrases/_translations_module.html.erb +70 -0
  286. data/app/views/tr8n/phrases/index.html.erb +90 -0
  287. data/app/views/tr8n/phrases/lb_sources.html.erb +51 -0
  288. data/app/views/tr8n/phrases/map.html.erb +42 -0
  289. data/app/views/tr8n/phrases/view.html.erb +77 -0
  290. data/app/views/tr8n/translations/_list.html.erb +71 -0
  291. data/app/views/tr8n/translations/_original_phrase.html.erb +11 -0
  292. data/app/views/tr8n/translations/_translation.html.erb +80 -0
  293. data/app/views/tr8n/translations/index.html.erb +30 -0
  294. data/app/views/tr8n/translator/_basic_info.html.erb +95 -0
  295. data/app/views/tr8n/translator/_header.html.erb +12 -0
  296. data/app/views/tr8n/translator/_header_key_report.html.erb +12 -0
  297. data/app/views/tr8n/translator/index.html.erb +25 -0
  298. data/app/views/tr8n/translator/lb_report.html.erb +113 -0
  299. data/config.ru +4 -0
  300. data/config/application.rb +65 -0
  301. data/config/boot.rb +6 -0
  302. data/config/database.yml +13 -0
  303. data/config/environment.rb +46 -0
  304. data/config/environments/development.rb +25 -0
  305. data/config/environments/test.rb +35 -0
  306. data/config/routes.rb +47 -0
  307. data/config/tr8n/config.yml +247 -0
  308. data/config/tr8n/data/ip_locations.csv +93460 -0
  309. data/config/tr8n/rules/default_cases.yml +141 -0
  310. data/config/tr8n/rules/default_date_rules.yml +20 -0
  311. data/config/tr8n/rules/default_gender_list_rules.yml +82 -0
  312. data/config/tr8n/rules/default_gender_rules.yml +20 -0
  313. data/config/tr8n/rules/default_list_rules.yml +19 -0
  314. data/config/tr8n/rules/default_numeric_rules.yml +42 -0
  315. data/config/tr8n/rules/default_value_rules.yml +18 -0
  316. data/config/tr8n/site/default_glossary.yml +18 -0
  317. data/config/tr8n/site/default_languages.yml +1591 -0
  318. data/config/tr8n/site/features.yml +111 -0
  319. data/config/tr8n/site/shortcuts.yml +55 -0
  320. data/config/tr8n/site/sitemap.json +42 -0
  321. data/config/tr8n/tokens/data.yml +19 -0
  322. data/config/tr8n/tokens/decorations.yml +16 -0
  323. data/config/will_filter/config.yml +97 -0
  324. data/db/extras/20100511185330_create_test_users.rb +43 -0
  325. data/db/migrate/20090730070119_create_will_filter_tables.rb +19 -0
  326. data/db/migrate/20100405201417_create_tr8n_tables.rb +350 -0
  327. data/db/seeds.rb +7 -0
  328. data/doc/README_FOR_APP +2 -0
  329. data/doc/cheat sheet.docx +0 -0
  330. data/doc/cheat sheet.pdf +0 -0
  331. data/doc/classes.graffle +12555 -0
  332. data/doc/classes.pdf +0 -0
  333. data/doc/client sdk sequence.graffle +2768 -0
  334. data/doc/integration.doc +0 -0
  335. data/doc/integration.docx +0 -0
  336. data/doc/pixel client sdk.graffle +1454 -0
  337. data/lib/application_controller.rb +38 -0
  338. data/lib/application_helper.rb +336 -0
  339. data/lib/core_ext/array.rb +61 -0
  340. data/lib/core_ext/date.rb +76 -0
  341. data/lib/core_ext/fixnum.rb +35 -0
  342. data/lib/core_ext/hash.rb +60 -0
  343. data/lib/core_ext/string.rb +49 -0
  344. data/lib/core_ext/time.rb +83 -0
  345. data/lib/generators/tr8n/templates/create_tr8n_tables.rb +350 -0
  346. data/lib/generators/tr8n/tr8n_generator.rb +49 -0
  347. data/lib/tasks/.gitkeep +0 -0
  348. data/lib/tasks/tr8n_tasks.rake +99 -0
  349. data/lib/tr8n.rb +3 -0
  350. data/lib/tr8n/active_dumper.rb +49 -0
  351. data/lib/tr8n/cache.rb +57 -0
  352. data/lib/tr8n/common_methods.rb +61 -0
  353. data/lib/tr8n/config.rb +719 -0
  354. data/lib/tr8n/controller_methods.rb +112 -0
  355. data/lib/tr8n/dictionary.rb +53 -0
  356. data/lib/tr8n/engine.rb +29 -0
  357. data/lib/tr8n/exception.rb +26 -0
  358. data/lib/tr8n/extender.rb +34 -0
  359. data/lib/tr8n/helper_methods.rb +304 -0
  360. data/lib/tr8n/ip_address.rb +52 -0
  361. data/lib/tr8n/key_registration_exception.rb +26 -0
  362. data/lib/tr8n/keyboard_mapping.rb +174 -0
  363. data/lib/tr8n/logger.rb +60 -0
  364. data/lib/tr8n/site_map.rb +85 -0
  365. data/lib/tr8n/site_map_section.rb +108 -0
  366. data/lib/tr8n/token.rb +438 -0
  367. data/lib/tr8n/token_exception.rb +26 -0
  368. data/lib/tr8n/tokenized_label.rb +141 -0
  369. data/lib/tr8n/tokens/data_token.rb +52 -0
  370. data/lib/tr8n/tokens/decoration_token.rb +124 -0
  371. data/lib/tr8n/tokens/hidden_token.rb +87 -0
  372. data/lib/tr8n/tokens/method_token.rb +60 -0
  373. data/lib/tr8n/tokens/transform_token.rb +131 -0
  374. data/public/404.html +26 -0
  375. data/public/422.html +26 -0
  376. data/public/500.html +26 -0
  377. data/public/favicon.ico +0 -0
  378. data/public/robots.txt +5 -0
  379. data/public/tr8n/images/accept.png +0 -0
  380. data/public/tr8n/images/action_tab_bkgd.gif +0 -0
  381. data/public/tr8n/images/action_tab_white_bkgd.gif +0 -0
  382. data/public/tr8n/images/add.png +0 -0
  383. data/public/tr8n/images/arrow_down.gif +0 -0
  384. data/public/tr8n/images/arrow_down.png +0 -0
  385. data/public/tr8n/images/arrow_down_grey.png +0 -0
  386. data/public/tr8n/images/arrow_right.gif +0 -0
  387. data/public/tr8n/images/arrow_up.png +0 -0
  388. data/public/tr8n/images/arrow_up_grey.png +0 -0
  389. data/public/tr8n/images/bullet_go.png +0 -0
  390. data/public/tr8n/images/buttons.png +0 -0
  391. data/public/tr8n/images/cancel.png +0 -0
  392. data/public/tr8n/images/close.gif +0 -0
  393. data/public/tr8n/images/cross.png +0 -0
  394. data/public/tr8n/images/delete.png +0 -0
  395. data/public/tr8n/images/disk.png +0 -0
  396. data/public/tr8n/images/examples/context_rules_1.png +0 -0
  397. data/public/tr8n/images/examples/context_rules_2.png +0 -0
  398. data/public/tr8n/images/examples/date_rules_1.png +0 -0
  399. data/public/tr8n/images/examples/date_rules_2.png +0 -0
  400. data/public/tr8n/images/examples/date_rules_3.png +0 -0
  401. data/public/tr8n/images/examples/gender_rules_1.png +0 -0
  402. data/public/tr8n/images/examples/gender_rules_2.png +0 -0
  403. data/public/tr8n/images/examples/gender_rules_3.png +0 -0
  404. data/public/tr8n/images/examples/language_manager_1.png +0 -0
  405. data/public/tr8n/images/examples/list_rules_1.png +0 -0
  406. data/public/tr8n/images/examples/list_rules_2.png +0 -0
  407. data/public/tr8n/images/examples/list_rules_3.png +0 -0
  408. data/public/tr8n/images/examples/numeric_rules_1.png +0 -0
  409. data/public/tr8n/images/examples/numeric_rules_2.png +0 -0
  410. data/public/tr8n/images/examples/numeric_rules_3.png +0 -0
  411. data/public/tr8n/images/examples/numeric_rules_4.png +0 -0
  412. data/public/tr8n/images/exclamation.png +0 -0
  413. data/public/tr8n/images/eye.png +0 -0
  414. data/public/tr8n/images/eye_not.png +0 -0
  415. data/public/tr8n/images/facebook/connect_light_medium_long.gif +0 -0
  416. data/public/tr8n/images/field_sprite.gif +0 -0
  417. data/public/tr8n/images/find.png +0 -0
  418. data/public/tr8n/images/flags/.DS_Store +0 -0
  419. data/public/tr8n/images/flags/ab.png +0 -0
  420. data/public/tr8n/images/flags/ach.png +0 -0
  421. data/public/tr8n/images/flags/af.png +0 -0
  422. data/public/tr8n/images/flags/ak.png +0 -0
  423. data/public/tr8n/images/flags/am.png +0 -0
  424. data/public/tr8n/images/flags/an.png +0 -0
  425. data/public/tr8n/images/flags/ar-AE.png +0 -0
  426. data/public/tr8n/images/flags/ar-BH.png +0 -0
  427. data/public/tr8n/images/flags/ar-DZ.png +0 -0
  428. data/public/tr8n/images/flags/ar-EG.png +0 -0
  429. data/public/tr8n/images/flags/ar-IQ.png +0 -0
  430. data/public/tr8n/images/flags/ar-JO.png +0 -0
  431. data/public/tr8n/images/flags/ar-KW.png +0 -0
  432. data/public/tr8n/images/flags/ar-LB.png +0 -0
  433. data/public/tr8n/images/flags/ar-LY.png +0 -0
  434. data/public/tr8n/images/flags/ar-MA.png +0 -0
  435. data/public/tr8n/images/flags/ar-OM.png +0 -0
  436. data/public/tr8n/images/flags/ar-QA.png +0 -0
  437. data/public/tr8n/images/flags/ar-SA.png +0 -0
  438. data/public/tr8n/images/flags/ar-SY.png +0 -0
  439. data/public/tr8n/images/flags/ar-TN.png +0 -0
  440. data/public/tr8n/images/flags/ar-YE.png +0 -0
  441. data/public/tr8n/images/flags/ar.png +0 -0
  442. data/public/tr8n/images/flags/as.png +0 -0
  443. data/public/tr8n/images/flags/ast.png +0 -0
  444. data/public/tr8n/images/flags/ay.png +0 -0
  445. data/public/tr8n/images/flags/az.png +0 -0
  446. data/public/tr8n/images/flags/ba.png +0 -0
  447. data/public/tr8n/images/flags/be.png +0 -0
  448. data/public/tr8n/images/flags/bg.png +0 -0
  449. data/public/tr8n/images/flags/bh.png +0 -0
  450. data/public/tr8n/images/flags/bn.png +0 -0
  451. data/public/tr8n/images/flags/bo.png +0 -0
  452. data/public/tr8n/images/flags/br.png +0 -0
  453. data/public/tr8n/images/flags/bs.png +0 -0
  454. data/public/tr8n/images/flags/ca.png +0 -0
  455. data/public/tr8n/images/flags/cb.png +0 -0
  456. data/public/tr8n/images/flags/ce.png +0 -0
  457. data/public/tr8n/images/flags/ch.png +0 -0
  458. data/public/tr8n/images/flags/ck-US.png +0 -0
  459. data/public/tr8n/images/flags/co.png +0 -0
  460. data/public/tr8n/images/flags/cr.png +0 -0
  461. data/public/tr8n/images/flags/cs.png +0 -0
  462. data/public/tr8n/images/flags/cv.png +0 -0
  463. data/public/tr8n/images/flags/cy.png +0 -0
  464. data/public/tr8n/images/flags/da.png +0 -0
  465. data/public/tr8n/images/flags/de-AT.png +0 -0
  466. data/public/tr8n/images/flags/de-CH.png +0 -0
  467. data/public/tr8n/images/flags/de-DE.png +0 -0
  468. data/public/tr8n/images/flags/de-LI.png +0 -0
  469. data/public/tr8n/images/flags/de-LU.png +0 -0
  470. data/public/tr8n/images/flags/de.png +0 -0
  471. data/public/tr8n/images/flags/el.png +0 -0
  472. data/public/tr8n/images/flags/en-AU.png +0 -0
  473. data/public/tr8n/images/flags/en-BZ.png +0 -0
  474. data/public/tr8n/images/flags/en-CA.png +0 -0
  475. data/public/tr8n/images/flags/en-IE.png +0 -0
  476. data/public/tr8n/images/flags/en-JM.png +0 -0
  477. data/public/tr8n/images/flags/en-NZ.png +0 -0
  478. data/public/tr8n/images/flags/en-PH.png +0 -0
  479. data/public/tr8n/images/flags/en-PI.png +0 -0
  480. data/public/tr8n/images/flags/en-SC.png +0 -0
  481. data/public/tr8n/images/flags/en-UK.png +0 -0
  482. data/public/tr8n/images/flags/en-US.png +0 -0
  483. data/public/tr8n/images/flags/en-ZA.png +0 -0
  484. data/public/tr8n/images/flags/en-ZW.png +0 -0
  485. data/public/tr8n/images/flags/en.png +0 -0
  486. data/public/tr8n/images/flags/eo.png +0 -0
  487. data/public/tr8n/images/flags/es-AR.png +0 -0
  488. data/public/tr8n/images/flags/es-BO.png +0 -0
  489. data/public/tr8n/images/flags/es-CL.png +0 -0
  490. data/public/tr8n/images/flags/es-CO.png +0 -0
  491. data/public/tr8n/images/flags/es-CR.png +0 -0
  492. data/public/tr8n/images/flags/es-DO.png +0 -0
  493. data/public/tr8n/images/flags/es-EC.png +0 -0
  494. data/public/tr8n/images/flags/es-ES.png +0 -0
  495. data/public/tr8n/images/flags/es-GT.png +0 -0
  496. data/public/tr8n/images/flags/es-HN.png +0 -0
  497. data/public/tr8n/images/flags/es-MX.png +0 -0
  498. data/public/tr8n/images/flags/es-NI.png +0 -0
  499. data/public/tr8n/images/flags/es-PA.png +0 -0
  500. data/public/tr8n/images/flags/es-PE.png +0 -0
  501. data/public/tr8n/images/flags/es-PR.png +0 -0
  502. data/public/tr8n/images/flags/es-PY.png +0 -0
  503. data/public/tr8n/images/flags/es-SV.png +0 -0
  504. data/public/tr8n/images/flags/es-UY.png +0 -0
  505. data/public/tr8n/images/flags/es-VE.png +0 -0
  506. data/public/tr8n/images/flags/es.png +0 -0
  507. data/public/tr8n/images/flags/et.png +0 -0
  508. data/public/tr8n/images/flags/eu.png +0 -0
  509. data/public/tr8n/images/flags/fa-IR.png +0 -0
  510. data/public/tr8n/images/flags/fa.png +0 -0
  511. data/public/tr8n/images/flags/fb-LT.png +0 -0
  512. data/public/tr8n/images/flags/fi.png +0 -0
  513. data/public/tr8n/images/flags/fj.png +0 -0
  514. data/public/tr8n/images/flags/fo.png +0 -0
  515. data/public/tr8n/images/flags/fr-BE.png +0 -0
  516. data/public/tr8n/images/flags/fr-CA.png +0 -0
  517. data/public/tr8n/images/flags/fr-CH.png +0 -0
  518. data/public/tr8n/images/flags/fr-FR.png +0 -0
  519. data/public/tr8n/images/flags/fr-LU.png +0 -0
  520. data/public/tr8n/images/flags/fr-MC.png +0 -0
  521. data/public/tr8n/images/flags/fr.png +0 -0
  522. data/public/tr8n/images/flags/fur.png +0 -0
  523. data/public/tr8n/images/flags/fy.png +0 -0
  524. data/public/tr8n/images/flags/ga.png +0 -0
  525. data/public/tr8n/images/flags/gd.png +0 -0
  526. data/public/tr8n/images/flags/gl.png +0 -0
  527. data/public/tr8n/images/flags/gn.png +0 -0
  528. data/public/tr8n/images/flags/gu.png +0 -0
  529. data/public/tr8n/images/flags/gv.png +0 -0
  530. data/public/tr8n/images/flags/ha.png +0 -0
  531. data/public/tr8n/images/flags/haw.png +0 -0
  532. data/public/tr8n/images/flags/he.png +0 -0
  533. data/public/tr8n/images/flags/hi.png +0 -0
  534. data/public/tr8n/images/flags/hr.png +0 -0
  535. data/public/tr8n/images/flags/hsb.png +0 -0
  536. data/public/tr8n/images/flags/ht.png +0 -0
  537. data/public/tr8n/images/flags/hu.png +0 -0
  538. data/public/tr8n/images/flags/hy.png +0 -0
  539. data/public/tr8n/images/flags/ia.png +0 -0
  540. data/public/tr8n/images/flags/id.png +0 -0
  541. data/public/tr8n/images/flags/ie.png +0 -0
  542. data/public/tr8n/images/flags/ig.png +0 -0
  543. data/public/tr8n/images/flags/is.png +0 -0
  544. data/public/tr8n/images/flags/it-CH.png +0 -0
  545. data/public/tr8n/images/flags/it.png +0 -0
  546. data/public/tr8n/images/flags/iu.png +0 -0
  547. data/public/tr8n/images/flags/ja.png +0 -0
  548. data/public/tr8n/images/flags/jw.png +0 -0
  549. data/public/tr8n/images/flags/ka.png +0 -0
  550. data/public/tr8n/images/flags/kk.png +0 -0
  551. data/public/tr8n/images/flags/kl.png +0 -0
  552. data/public/tr8n/images/flags/km.png +0 -0
  553. data/public/tr8n/images/flags/kn.png +0 -0
  554. data/public/tr8n/images/flags/ko-KP.png +0 -0
  555. data/public/tr8n/images/flags/ko-KR.png +0 -0
  556. data/public/tr8n/images/flags/ko.png +0 -0
  557. data/public/tr8n/images/flags/kok.png +0 -0
  558. data/public/tr8n/images/flags/ks.png +0 -0
  559. data/public/tr8n/images/flags/ku.png +0 -0
  560. data/public/tr8n/images/flags/ky.png +0 -0
  561. data/public/tr8n/images/flags/la.png +0 -0
  562. data/public/tr8n/images/flags/lb.png +0 -0
  563. data/public/tr8n/images/flags/lg.png +0 -0
  564. data/public/tr8n/images/flags/li-NL.png +0 -0
  565. data/public/tr8n/images/flags/ln.png +0 -0
  566. data/public/tr8n/images/flags/lo.png +0 -0
  567. data/public/tr8n/images/flags/lt.png +0 -0
  568. data/public/tr8n/images/flags/lv.png +0 -0
  569. data/public/tr8n/images/flags/md.png +0 -0
  570. data/public/tr8n/images/flags/mfe.png +0 -0
  571. data/public/tr8n/images/flags/mg.png +0 -0
  572. data/public/tr8n/images/flags/mh.png +0 -0
  573. data/public/tr8n/images/flags/mi.png +0 -0
  574. data/public/tr8n/images/flags/mk.png +0 -0
  575. data/public/tr8n/images/flags/ml.png +0 -0
  576. data/public/tr8n/images/flags/mn.png +0 -0
  577. data/public/tr8n/images/flags/mo.png +0 -0
  578. data/public/tr8n/images/flags/mr.png +0 -0
  579. data/public/tr8n/images/flags/ms.png +0 -0
  580. data/public/tr8n/images/flags/mt.png +0 -0
  581. data/public/tr8n/images/flags/my.png +0 -0
  582. data/public/tr8n/images/flags/na.png +0 -0
  583. data/public/tr8n/images/flags/nb.png +0 -0
  584. data/public/tr8n/images/flags/nd.png +0 -0
  585. data/public/tr8n/images/flags/ne.png +0 -0
  586. data/public/tr8n/images/flags/ng.png +0 -0
  587. data/public/tr8n/images/flags/nl-NE.png +0 -0
  588. data/public/tr8n/images/flags/nl.png +0 -0
  589. data/public/tr8n/images/flags/nn.png +0 -0
  590. data/public/tr8n/images/flags/no.png +0 -0
  591. data/public/tr8n/images/flags/nr.png +0 -0
  592. data/public/tr8n/images/flags/nso.png +0 -0
  593. data/public/tr8n/images/flags/nv.png +0 -0
  594. data/public/tr8n/images/flags/ny.png +0 -0
  595. data/public/tr8n/images/flags/nyn.png +0 -0
  596. data/public/tr8n/images/flags/oc.png +0 -0
  597. data/public/tr8n/images/flags/om.png +0 -0
  598. data/public/tr8n/images/flags/or.png +0 -0
  599. data/public/tr8n/images/flags/pa-IN.png +0 -0
  600. data/public/tr8n/images/flags/pa-PK.png +0 -0
  601. data/public/tr8n/images/flags/pa.png +0 -0
  602. data/public/tr8n/images/flags/pf.png +0 -0
  603. data/public/tr8n/images/flags/pl.png +0 -0
  604. data/public/tr8n/images/flags/pp.png +0 -0
  605. data/public/tr8n/images/flags/ps.png +0 -0
  606. data/public/tr8n/images/flags/pt-BZ.png +0 -0
  607. data/public/tr8n/images/flags/pt.png +0 -0
  608. data/public/tr8n/images/flags/qu-PE.png +0 -0
  609. data/public/tr8n/images/flags/qu.png +0 -0
  610. data/public/tr8n/images/flags/rj.png +0 -0
  611. data/public/tr8n/images/flags/rm.png +0 -0
  612. data/public/tr8n/images/flags/rn.png +0 -0
  613. data/public/tr8n/images/flags/ro-MD.png +0 -0
  614. data/public/tr8n/images/flags/ro-RO.png +0 -0
  615. data/public/tr8n/images/flags/ro.png +0 -0
  616. data/public/tr8n/images/flags/ru.png +0 -0
  617. data/public/tr8n/images/flags/rw.png +0 -0
  618. data/public/tr8n/images/flags/sa.png +0 -0
  619. data/public/tr8n/images/flags/sc.png +0 -0
  620. data/public/tr8n/images/flags/sd.png +0 -0
  621. data/public/tr8n/images/flags/se-NO.png +0 -0
  622. data/public/tr8n/images/flags/sg.png +0 -0
  623. data/public/tr8n/images/flags/sh.png +0 -0
  624. data/public/tr8n/images/flags/si.png +0 -0
  625. data/public/tr8n/images/flags/sk.png +0 -0
  626. data/public/tr8n/images/flags/sl.png +0 -0
  627. data/public/tr8n/images/flags/sm.png +0 -0
  628. data/public/tr8n/images/flags/sn.png +0 -0
  629. data/public/tr8n/images/flags/so.png +0 -0
  630. data/public/tr8n/images/flags/sq.png +0 -0
  631. data/public/tr8n/images/flags/sr-me.png +0 -0
  632. data/public/tr8n/images/flags/sr.png +0 -0
  633. data/public/tr8n/images/flags/ss.png +0 -0
  634. data/public/tr8n/images/flags/st.png +0 -0
  635. data/public/tr8n/images/flags/su.png +0 -0
  636. data/public/tr8n/images/flags/sv-FI.png +0 -0
  637. data/public/tr8n/images/flags/sv-SE.png +0 -0
  638. data/public/tr8n/images/flags/sv.png +0 -0
  639. data/public/tr8n/images/flags/sw.png +0 -0
  640. data/public/tr8n/images/flags/ta.png +0 -0
  641. data/public/tr8n/images/flags/te.png +0 -0
  642. data/public/tr8n/images/flags/tg.png +0 -0
  643. data/public/tr8n/images/flags/th.png +0 -0
  644. data/public/tr8n/images/flags/ti.png +0 -0
  645. data/public/tr8n/images/flags/tig.png +0 -0
  646. data/public/tr8n/images/flags/tk.png +0 -0
  647. data/public/tr8n/images/flags/tl.png +0 -0
  648. data/public/tr8n/images/flags/tlh.png +0 -0
  649. data/public/tr8n/images/flags/tn.png +0 -0
  650. data/public/tr8n/images/flags/to.png +0 -0
  651. data/public/tr8n/images/flags/tr.png +0 -0
  652. data/public/tr8n/images/flags/ts.png +0 -0
  653. data/public/tr8n/images/flags/tt.png +0 -0
  654. data/public/tr8n/images/flags/tw.png +0 -0
  655. data/public/tr8n/images/flags/ug.png +0 -0
  656. data/public/tr8n/images/flags/uk.png +0 -0
  657. data/public/tr8n/images/flags/ur.png +0 -0
  658. data/public/tr8n/images/flags/uz.png +0 -0
  659. data/public/tr8n/images/flags/ve.png +0 -0
  660. data/public/tr8n/images/flags/vi.png +0 -0
  661. data/public/tr8n/images/flags/vo.png +0 -0
  662. data/public/tr8n/images/flags/wa.png +0 -0
  663. data/public/tr8n/images/flags/wo.png +0 -0
  664. data/public/tr8n/images/flags/xh.png +0 -0
  665. data/public/tr8n/images/flags/yi.png +0 -0
  666. data/public/tr8n/images/flags/yo.png +0 -0
  667. data/public/tr8n/images/flags/zh-CN.png +0 -0
  668. data/public/tr8n/images/flags/zh-HK.png +0 -0
  669. data/public/tr8n/images/flags/zh-SG.png +0 -0
  670. data/public/tr8n/images/flags/zh-TW.png +0 -0
  671. data/public/tr8n/images/flags/zh.png +0 -0
  672. data/public/tr8n/images/flags/zu.png +0 -0
  673. data/public/tr8n/images/globe.gif +0 -0
  674. data/public/tr8n/images/help.png +0 -0
  675. data/public/tr8n/images/help/color_coding.png +0 -0
  676. data/public/tr8n/images/help/language_selector.png +0 -0
  677. data/public/tr8n/images/help/language_selector_default.png +0 -0
  678. data/public/tr8n/images/help/languages_disabled.png +0 -0
  679. data/public/tr8n/images/help/translator.png +0 -0
  680. data/public/tr8n/images/help2.png +0 -0
  681. data/public/tr8n/images/information.png +0 -0
  682. data/public/tr8n/images/keyboard.png +0 -0
  683. data/public/tr8n/images/language_selector_arrow.gif +0 -0
  684. data/public/tr8n/images/left_quote.png +0 -0
  685. data/public/tr8n/images/lightning.png +0 -0
  686. data/public/tr8n/images/loading.gif +0 -0
  687. data/public/tr8n/images/loading2.gif +0 -0
  688. data/public/tr8n/images/loading3.gif +0 -0
  689. data/public/tr8n/images/loading_large.gif +0 -0
  690. data/public/tr8n/images/lock.png +0 -0
  691. data/public/tr8n/images/lock_add.png +0 -0
  692. data/public/tr8n/images/lock_delete.png +0 -0
  693. data/public/tr8n/images/lock_open.png +0 -0
  694. data/public/tr8n/images/medals/bronze.png +0 -0
  695. data/public/tr8n/images/medals/gold.png +0 -0
  696. data/public/tr8n/images/medals/runner.png +0 -0
  697. data/public/tr8n/images/medals/silver.png +0 -0
  698. data/public/tr8n/images/pencil.png +0 -0
  699. data/public/tr8n/images/photo_silhouette.gif +0 -0
  700. data/public/tr8n/images/plus.png +0 -0
  701. data/public/tr8n/images/random.png +0 -0
  702. data/public/tr8n/images/random2.png +0 -0
  703. data/public/tr8n/images/rating_star0.png +0 -0
  704. data/public/tr8n/images/rating_star05.png +0 -0
  705. data/public/tr8n/images/rating_star1.png +0 -0
  706. data/public/tr8n/images/rating_stars.gif +0 -0
  707. data/public/tr8n/images/rating_stars.psd +0 -0
  708. data/public/tr8n/images/reply.png +0 -0
  709. data/public/tr8n/images/right_quote.png +0 -0
  710. data/public/tr8n/images/rotating_world.gif +0 -0
  711. data/public/tr8n/images/script.png +0 -0
  712. data/public/tr8n/images/script_edit.png +0 -0
  713. data/public/tr8n/images/script_gear.png +0 -0
  714. data/public/tr8n/images/site_sprite.gif +0 -0
  715. data/public/tr8n/images/spinner.gif +0 -0
  716. data/public/tr8n/images/star.png +0 -0
  717. data/public/tr8n/images/table_edit.png +0 -0
  718. data/public/tr8n/images/table_gear.png +0 -0
  719. data/public/tr8n/images/table_multiple.png +0 -0
  720. data/public/tr8n/images/thumb_down.png +0 -0
  721. data/public/tr8n/images/thumb_up.png +0 -0
  722. data/public/tr8n/images/toolbar_bg.gif +0 -0
  723. data/public/tr8n/images/top_left_stem.png +0 -0
  724. data/public/tr8n/images/top_right_stem.png +0 -0
  725. data/public/tr8n/images/tr8n_loading.gif +0 -0
  726. data/public/tr8n/images/tr8n_logo.jpg +0 -0
  727. data/public/tr8n/images/tr8n_logo.png +0 -0
  728. data/public/tr8n/images/tr8n_logo2.gif +0 -0
  729. data/public/tr8n/images/tr8n_logo2.png +0 -0
  730. data/public/tr8n/images/tr8n_logo_wiki.png +0 -0
  731. data/public/tr8n/images/tr8n_logo_wiki2.png +0 -0
  732. data/public/tr8n/images/translate_icn.gif +0 -0
  733. data/public/tr8n/images/wizard.png +0 -0
  734. data/public/tr8n/javascripts/jsDraw2D.js +24 -0
  735. data/public/tr8n/javascripts/keyboard_1_36.js +1214 -0
  736. data/public/tr8n/javascripts/keyboard_1_44.js +1735 -0
  737. data/public/tr8n/javascripts/shortcut.js +223 -0
  738. data/public/tr8n/javascripts/tr8n.js +904 -0
  739. data/public/tr8n/javascripts/tr8n_client_sdk.js +1182 -0
  740. data/public/tr8n/javascripts/tr8n_prototype_effects.js +65 -0
  741. data/public/tr8n/stylesheets/components.css +208 -0
  742. data/public/tr8n/stylesheets/keyboard_1_36.css +185 -0
  743. data/public/tr8n/stylesheets/keyboard_1_44.css +268 -0
  744. data/public/tr8n/stylesheets/layout.css +119 -0
  745. data/public/tr8n/stylesheets/tr8n.css +201 -0
  746. data/rails/init.rb +53 -0
  747. data/script/rails +6 -0
  748. data/test/performance/browsing_test.rb +9 -0
  749. data/test/test_helper.rb +13 -0
  750. data/tr8n.gemspec +40 -0
  751. metadata +865 -0
@@ -0,0 +1,119 @@
1
+ #--
2
+ # Copyright (c) 2010-2011 Michael Berkovich
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::Admin::TranslatorController < Tr8n::Admin::BaseController
25
+
26
+ def index
27
+ @translators = Tr8n::Translator.filter(:params => params, :filter => Tr8n::TranslatorFilter)
28
+ end
29
+
30
+ def view
31
+ @translator = Tr8n::Translator.find(params[:translator_id])
32
+ redirect_to(:action => :index) unless @translator
33
+ end
34
+
35
+ def delete
36
+ params[:translators] = [params[:translator_id]] if params[:translator_id]
37
+ if params[:translators]
38
+ params[:translators].each do |translator_id|
39
+ translator = Tr8n::Translator.find_by_id(translator_id)
40
+ translator.destroy if translator
41
+ end
42
+ end
43
+ redirect_to_source
44
+ end
45
+
46
+ def block
47
+ @translator = Tr8n::Translator.find(params[:translator_id])
48
+ @translator.block!(tr8n_current_user, params[:reason])
49
+ redirect_to_source
50
+ end
51
+
52
+ def unblock
53
+ @translator = Tr8n::Translator.find(params[:translator_id])
54
+ @translator.unblock!(tr8n_current_user, params[:reason])
55
+ redirect_to_source
56
+ end
57
+
58
+ def update_level
59
+ @translator = Tr8n::Translator.find(params[:translator_id])
60
+ @translator.update_level!(tr8n_current_user, params[:new_level], params[:reason])
61
+ redirect_to_source
62
+ end
63
+
64
+ def demote
65
+ @translator = Tr8n::Translator.find(params[:translator_id])
66
+ @translator.demote!(tr8n_current_user, params[:reason])
67
+ redirect_to_source
68
+ end
69
+
70
+ def update_stats
71
+ Tr8n::Translator.all.each do |trans|
72
+ trans.update_total_metrics!
73
+ end
74
+
75
+ redirect_to :action => :index
76
+ end
77
+
78
+ def lb_register
79
+ @translator = Tr8n::Translator.new
80
+ render :layout => false
81
+ end
82
+
83
+ def register
84
+ user_class = Tr8n::Config.site_info[:user_info][:class_name]
85
+ user = user_class.constantize.find_by_id(params[:translator][:user_id])
86
+ unless user
87
+ return redirect_to_source
88
+ end
89
+
90
+ translator = Tr8n::Translator.find_by_user_id(user.id)
91
+ if translator
92
+ return redirect_to_source
93
+ end
94
+
95
+ Tr8n::Translator.create(:user_id => params[:translator][:user_id])
96
+ redirect_to_source
97
+ end
98
+
99
+ def following
100
+ @following = Tr8n::TranslatorFollowing.filter(:params => params, :filter => Tr8n::TranslatorFollowingFilter)
101
+ end
102
+
103
+ def reports
104
+ @reports = Tr8n::TranslatorReport.filter(:params => params, :filter => Tr8n::TranslatorReportFilter)
105
+ end
106
+
107
+ def log
108
+ @logs = Tr8n::TranslatorLog.filter(:params => params, :filter => Tr8n::TranslatorLogFilter)
109
+ end
110
+
111
+ def metrics
112
+ @metrics = Tr8n::TranslatorMetric.filter(:params => params, :filter => Tr8n::TranslatorMetricFilter)
113
+ end
114
+
115
+ def ip_locations
116
+ @ip_locations = Tr8n::IpLocation.filter(:params => params, :filter => Tr8n::IpLocationFilter)
117
+ end
118
+
119
+ end
@@ -0,0 +1,81 @@
1
+ #--
2
+ # Copyright (c) 2010-2011 Michael Berkovich
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::Api::V1::BaseController < ApplicationController
25
+
26
+ private
27
+
28
+ def tr8n_current_user
29
+ Tr8n::Config.current_user
30
+ end
31
+ helper_method :tr8n_current_user
32
+
33
+ def tr8n_current_language
34
+ Tr8n::Config.current_language
35
+ end
36
+ helper_method :tr8n_current_language
37
+
38
+ def tr8n_default_language
39
+ Tr8n::Config.default_language
40
+ end
41
+ helper_method :tr8n_default_language
42
+
43
+ def tr8n_current_translator
44
+ Tr8n::Config.current_translator
45
+ end
46
+ helper_method :tr8n_current_translator
47
+
48
+ def tr8n_current_user_is_admin?
49
+ Tr8n::Config.current_user_is_admin?
50
+ end
51
+ helper_method :tr8n_current_user_is_admin?
52
+
53
+ def tr8n_current_user_is_translator?
54
+ Tr8n::Config.current_user_is_translator?
55
+ end
56
+ helper_method :tr8n_current_user_is_translator?
57
+
58
+ def tr8n_current_user_is_manager?
59
+ return false unless Tr8n::Config.current_user_is_translator?
60
+ tr8n_current_translator.manager?
61
+ end
62
+ helper_method :tr8n_current_user_is_manager?
63
+
64
+ def tr8n_current_user_is_guest?
65
+ Tr8n::Config.current_user_is_guest?
66
+ end
67
+ helper_method :tr8n_current_user_is_guest?
68
+
69
+ def sanitize_label(label)
70
+ label.strip
71
+ end
72
+
73
+ def sanitize_api_response(response)
74
+ if Tr8n::Config.api[:response_encoding] == "xml"
75
+ render(:text => response.to_xml)
76
+ else
77
+ render(:text => response.to_json)
78
+ end
79
+ end
80
+
81
+ end
@@ -0,0 +1,107 @@
1
+ #--
2
+ # Copyright (c) 2010-2011 Michael Berkovich
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::Api::V1::LanguageController < Tr8n::Api::V1::BaseController
25
+
26
+ # for ssl access to the translator - using ssl_requirement plugin
27
+ ssl_allowed :translate if respond_to?(:ssl_allowed)
28
+
29
+ # returns a list of all languages
30
+ def index
31
+ return sanitize_api_response({"error" => "Api is disabled"}) unless Tr8n::Config.enable_api?
32
+
33
+ languages = []
34
+ Tr8n::Language.enabled_languages.each do |lang|
35
+ languages << {:locale => lang.locale, :name => lang.full_name}
36
+ end
37
+ sanitize_api_response({:languages => languages})
38
+ end
39
+
40
+ def translate
41
+ return sanitize_api_response({"error" => "Api is disabled"}) unless Tr8n::Config.enable_api?
42
+
43
+ # return sanitize_api_response({"error" => "You must be logged in to use the api"}) if tr8n_current_user_is_guest?
44
+
45
+ language = Tr8n::Language.for(params[:language]) || tr8n_current_language
46
+ source = CGI.unescape(params[:source]) || "API"
47
+
48
+ return sanitize_api_response(translate_phrase(language, params, {:source => source})) if params[:label]
49
+
50
+ # API signature
51
+ # {:source => "", :language => "", :phrases => [{:label => ""}]}
52
+
53
+ # get all phrases for the specified source
54
+ if params[:batch] == "true"
55
+ if params[:sources].blank? and params[:source].blank?
56
+ return sanitize_api_response({"error" => "No source/sources have been provided for the batch request."})
57
+ end
58
+
59
+ source_names = params[:sources] || [params[:source]]
60
+ sources = Tr8n::TranslationSource.find(:all, :conditions => ["source in (?)", source_names])
61
+ source_ids = sources.collect{|source| source.id}
62
+
63
+ if source_ids.empty?
64
+ conditions = ["1=2"]
65
+ else
66
+ conditions = ["(id in (select distinct(translation_key_id) from tr8n_translation_key_sources where translation_source_id in (?)))"]
67
+ conditions << source_ids.uniq
68
+ end
69
+
70
+ translations = []
71
+ Tr8n::TranslationKey.find(:all, :conditions => conditions).each_with_index do |tkey, index|
72
+ trn = tkey.translate(language, {}, {:api => true})
73
+ translations << trn
74
+ end
75
+
76
+ return sanitize_api_response({:phrases => translations})
77
+ elsif params[:phrases]
78
+
79
+ phrases = []
80
+ begin
81
+ phrases = HashWithIndifferentAccess.new({:data => JSON.parse(params[:phrases])})[:data]
82
+ rescue Exception => ex
83
+ return sanitize_api_response({"error" => "Invalid request. JSON parsing failed: #{ex.message}"})
84
+ end
85
+
86
+ translations = []
87
+ phrases.each do |phrase|
88
+ phrase = {:label => phrase} if phrase.is_a?(String)
89
+ translations << translate_phrase(language, phrase, {:source => source})
90
+ end
91
+
92
+ return sanitize_api_response({:phrases => translations})
93
+ end
94
+
95
+ sanitize_api_response({"error" => "Invalid API request. Please read the documentation and try again."})
96
+ rescue Tr8n::KeyRegistrationException => ex
97
+ sanitize_api_response({"error" => ex.message})
98
+ end
99
+
100
+ private
101
+
102
+ def translate_phrase(language, phrase, opts = {})
103
+ return "" if phrase[:label].strip.blank?
104
+ language.translate(phrase[:label], phrase[:description], {}, {:api => true, :source => opts[:source]})
105
+ end
106
+
107
+ end
@@ -0,0 +1,75 @@
1
+ #--
2
+ # Copyright (c) 2010-2011 Michael Berkovich
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::Api::V1::TranslationController < Tr8n::Api::V1::BaseController
25
+
26
+ # returns a list of all languages
27
+ def submit
28
+ return sanitize_api_response({:error => "Api is disabled"}) unless Tr8n::Config.enable_api?
29
+ return sanitize_api_response({:error => "Guest user cannot submit a translation"}) if tr8n_current_user_is_guest?
30
+
31
+ if params[:translation_key]
32
+ translation_key = Tr8n::TranslationKey.find_by_key(params[:translation_key])
33
+ else
34
+ translation_key = Tr8n::TranslationKey.find(params[:translation_key_id])
35
+ end
36
+
37
+ unless request.post?
38
+ return sanitize_api_response({:error => "Please use a translator window for submitting translations"})
39
+ end
40
+
41
+ if params[:translation_id].blank?
42
+ translation = Tr8n::Translation.new(:translation_key => translation_key, :language => tr8n_current_language, :translator => tr8n_current_translator)
43
+ else
44
+ translation = Tr8n::Translation.find(params[:translation_id])
45
+ end
46
+
47
+ translation.label = sanitize_label(params[:label])
48
+
49
+ unless translation.can_be_edited_by?(tr8n_current_translator)
50
+ tr8n_current_translator.tried_to_perform_unauthorized_action!("tried to update translation which is locked or belongs to another translator")
51
+ return sanitize_api_response({:error => "You are not authorized to edit this translation"})
52
+ end
53
+
54
+ if translation.blank?
55
+ tr8n_current_translator.tried_to_perform_unauthorized_action!("tried to submit an empty translation")
56
+ return sanitize_api_response({:error => "Your translation was empty and was not accepted"})
57
+ end
58
+
59
+ unless translation.uniq?
60
+ tr8n_current_translator.tried_to_perform_unauthorized_action!("tried to submit an identical translation")
61
+ return sanitize_api_response({:error => "There already exists such translation for this phrase. Please vote on it instead or suggest an elternative translation."})
62
+ end
63
+
64
+ unless translation.clean?
65
+ tr8n_current_translator.used_abusive_language!
66
+ return sanitize_api_response({:error => "Your translation contains prohibited words and will not be accepted"})
67
+ end
68
+
69
+ translation.save_with_log!(tr8n_current_translator)
70
+ translation.reset_votes!(tr8n_current_translator)
71
+
72
+ sanitize_api_response({:translation_key => translation_key.key, :label => translation.label})
73
+ end
74
+
75
+ end
@@ -0,0 +1,34 @@
1
+ #--
2
+ # Copyright (c) 2010-2011 Michael Berkovich
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::Api::V1::TranslatorController < Tr8n::Api::V1::BaseController
25
+
26
+ # returns a list of all languages
27
+ def index
28
+ return sanitize_api_response({:error => "Api is disabled"}) unless Tr8n::Config.enable_api?
29
+ return sanitize_api_response({:guest => true}) if tr8n_current_user_is_guest?
30
+
31
+ sanitize_api_response({:guest => false, :name => tr8n_current_translator.name})
32
+ end
33
+
34
+ end
@@ -0,0 +1,43 @@
1
+ #--
2
+ # Copyright (c) 2010-2011 Michael Berkovich
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::AwardsController < Tr8n::BaseController
25
+
26
+ before_filter :validate_current_translator
27
+
28
+ def index
29
+ params[:mode] = "all" if tr8n_current_language.default?
30
+
31
+ if params[:mode] == "all"
32
+ @translator_metrics = Tr8n::TranslatorMetric.find(:all, :conditions => ["language_id is null"],
33
+ :order => "total_translations desc, total_votes desc", :limit => 23)
34
+ else
35
+ @translator_metrics = Tr8n::TranslatorMetric.find(:all, :conditions => ["language_id = ?", tr8n_current_language.id],
36
+ :order => "total_translations desc, total_votes desc", :limit => 23)
37
+ end
38
+
39
+ @leaders = @translator_metrics[0..2]
40
+ @runners = (@translator_metrics.size > 3) ? @translator_metrics[3..-1] : []
41
+ end
42
+
43
+ end