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,49 @@
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
+ require 'rails/generators'
25
+ require 'rails/generators/migration'
26
+
27
+ class Tr8nGenerator < Rails::Generators::Base
28
+ include Rails::Generators::Migration
29
+
30
+ def self.source_root
31
+ @source_root ||= File.expand_path('../templates', __FILE__)
32
+ end
33
+
34
+ # Implement the required interface for Rails::Generators::Migration.
35
+ def self.next_migration_number(dirname)
36
+ if ActiveRecord::Base.timestamped_migrations
37
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
38
+ else
39
+ "%.3d" % (current_migration_number(dirname) + 1)
40
+ end
41
+ end
42
+
43
+ def create_migration_file
44
+ migration_template 'create_tr8n_tables.rb', 'db/migrate/create_tr8n_tables.rb'
45
+ source = File.expand_path('../../../../config/tr8n', __FILE__)
46
+ target = "#{Rails.root}/config"
47
+ system "rsync -ruv #{source} #{target}"
48
+ end
49
+ end
File without changes
@@ -0,0 +1,99 @@
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
+ namespace :tr8n do
25
+ desc "Sync config and db migrations for tr8n plugin."
26
+ task :sync do
27
+ system "rsync -ruv vendor/plugins/tr8n/config/tr8n ./config"
28
+ system "rsync -ruv vendor/plugins/tr8n/db/migrate ./db"
29
+ end
30
+
31
+ desc "Sync db migrations for tr8n plugin."
32
+ task :sync_db do
33
+ system "rsync -ruv vendor/plugins/tr8n/db/migrate ./db"
34
+ end
35
+
36
+ desc "Initializes all of the tables with default data"
37
+ task :init => :environment do
38
+ raise "This action is prohibited in this environment" if ['production', 'stage', 'staging'].include?(Rails.env) and env('force') != 'true'
39
+ Tr8n::Config.reset_all!
40
+ end
41
+
42
+ desc "Resets all metrics"
43
+ task :reset_metrics => :environment do
44
+ Tr8n::LanguageMetric.reset_metrics
45
+ end
46
+
47
+ desc "Calculates metrics"
48
+ task :metrics => :environment do
49
+ Tr8n::LanguageMetric.calculate_language_metrics
50
+ end
51
+
52
+ desc "Initializes default language cases"
53
+ task :language_cases => :environment do
54
+ Tr8n::Language.all.each do |lang|
55
+ lang.reset_language_cases!
56
+ end
57
+ end
58
+
59
+ desc "Creates featured languages"
60
+ task :featured_languages => :environment do
61
+ Tr8n::Config.config[:featured_languages].each_with_index do |locale, index|
62
+ lang = Tr8n::Language.for(locale)
63
+ lang.featured_index = 10000 - (index * 100)
64
+ lang.save
65
+ end
66
+ end
67
+
68
+ # will delete all keys that have not been verified in the last 2 weeks
69
+ task :delete_unverified_keys => :environment do
70
+ date = env('before') || (Date.today - 2.weeks)
71
+
72
+ puts "Running key destruction process..."
73
+ t0 = Time.now
74
+
75
+ puts "All keys not verified after #{date} will be destroyed!"
76
+ unverified_keys = Tr8n::TranslationKey.find(:all, :conditions => ["verified_at is null or verified_at < ?", date])
77
+
78
+ puts "There are #{unverified_keys.size} keys to be destroyed."
79
+ puts "Destroying unverified keys..." if unverified_keys.size > 0
80
+
81
+ destroy_count = 0
82
+ unverified_keys.each do |tkey|
83
+ tkey.destroy
84
+ destroy_count += 1
85
+ puts "Destroyed #{destroy_count} keys..." if destroy_count % 100 == 0
86
+ end
87
+
88
+ t1 = Time.now
89
+
90
+ puts "Destroyed #{destroy_count} keys"
91
+ puts "Destruction process took #{t1-t0} mls"
92
+ end
93
+
94
+ desc 'Update IP to Location table (file=<file|config/tr8n/data/ip_locations.csv>)'
95
+ task :import_ip_locations => :environment do
96
+ Tr8n::IpLocation.import_from_file('config/tr8n/data/ip_locations.csv', :verbose => true)
97
+ end
98
+
99
+ end
@@ -0,0 +1,3 @@
1
+ module Tr8n
2
+ require 'tr8n/engine' if defined?(Rails) && Rails::VERSION::MAJOR == 3
3
+ end
@@ -0,0 +1,49 @@
1
+ #--
2
+ # Copyright (c) 2010-2011 Justin Balthrop
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
+ require File.expand_path(File.dirname(__FILE__) + "/extender")
25
+
26
+ class Tr8n::DumperException < StandardError; end
27
+ module Tr8n::ActiveDumper
28
+ extend Tr8n::Extender
29
+
30
+ module InstanceMethods
31
+ def _dump(ignored)
32
+ data = {:attributes => @attributes, :new_record => @new_record}
33
+ Marshal.dump(data)
34
+ end
35
+ end
36
+
37
+ module ClassMethods
38
+ def _load(str)
39
+ data = Marshal.load(str)
40
+
41
+ raise Tr8n::DumperException, 'invalid format' if not data.kind_of?(Hash) or data.keys.to_set != [:attributes, :new_record].to_set
42
+
43
+ instance = new
44
+ instance.instance_variable_set(:@attributes, data[:attributes])
45
+ instance.instance_variable_set(:@new_record, data[:new_record])
46
+ instance
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,57 @@
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::Cache
25
+ def self.cache
26
+ @cache ||= begin
27
+ if Tr8n::Config.cache_adapter == 'ActiveSupport::Cache'
28
+ store_params = [Tr8n::Config.cache_store].flatten
29
+ store_params[0] = store_params[0].to_sym
30
+ ActiveSupport::Cache.lookup_store(*store_params)
31
+ else
32
+ eval(Tr8n::Config.cache_adapter)
33
+ end
34
+ end
35
+ end
36
+
37
+ def self.enabled?
38
+ Tr8n::Config.enable_caching?
39
+ end
40
+
41
+ def self.versioned_key(key)
42
+ "#{Tr8n::Config.cache_version}_#{key}"
43
+ end
44
+
45
+ def self.fetch(key, options = {})
46
+ return yield unless enabled?
47
+ cache.fetch(versioned_key(key), options) do
48
+ yield
49
+ end
50
+ end
51
+
52
+ def self.delete(key, options = nil)
53
+ return unless enabled?
54
+ cache.delete(versioned_key(key), options)
55
+ end
56
+
57
+ end
@@ -0,0 +1,61 @@
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
+ module Tr8n::CommonMethods
25
+
26
+ # translation functions
27
+ def tr(label, desc = "", tokens = {}, options = {})
28
+ unless desc.nil? or desc.is_a?(String)
29
+ raise Tr8n::Exception.new("The second parameter of the tr function must be a description")
30
+ end
31
+
32
+ begin
33
+ url = request.url
34
+ host = request.env['HTTP_HOST']
35
+ source = "#{controller.class.name.underscore.gsub("_controller", "")}/#{controller.action_name}"
36
+ rescue Exception => ex
37
+ source = self.class.name
38
+ url = nil
39
+ host = 'localhost'
40
+ end
41
+
42
+ options.merge!(:source => source) unless options[:source]
43
+ options.merge!(:caller => caller)
44
+ options.merge!(:url => url)
45
+ options.merge!(:host => host)
46
+
47
+ # pp [source, options[:source], url]
48
+
49
+ unless Tr8n::Config.enabled?
50
+ return Tr8n::TranslationKey.substitute_tokens(label, tokens, options)
51
+ end
52
+
53
+ Tr8n::Config.current_language.translate(label, desc, tokens, options)
54
+ end
55
+
56
+ # for translating labels
57
+ def trl(label, desc = "", tokens = {}, options = {})
58
+ tr(label, desc, tokens, options.merge(:skip_decorations => true))
59
+ end
60
+
61
+ end
@@ -0,0 +1,719 @@
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
+ require 'json'
25
+
26
+ class Tr8n::Config
27
+
28
+ #########################################################
29
+ # Basic Stuff
30
+
31
+ # initializes language, user and translator
32
+ # the variables are kept in a thread safe form throughout the request
33
+ def self.init(locale, site_current_user)
34
+ Thread.current[:tr8n_current_language] = Tr8n::Language.for(locale) || default_language
35
+ Thread.current[:tr8n_current_user] = site_current_user
36
+ Thread.current[:tr8n_current_translator] = Tr8n::Translator.for(site_current_user)
37
+ Thread.current[:tr8n_block_options] = {}
38
+ end
39
+
40
+ def self.current_user
41
+ Thread.current[:tr8n_current_user]
42
+ end
43
+
44
+ def self.current_language
45
+ Thread.current[:tr8n_current_language] ||= default_language
46
+ end
47
+
48
+ def self.current_user_is_translator?
49
+ Thread.current[:tr8n_current_translator] != nil
50
+ end
51
+
52
+ def self.block_options
53
+ Thread.current[:tr8n_block_options] ||= {}
54
+ end
55
+
56
+ # when this method is called, we create the translator record right away
57
+ # and from this point on, will track the user
58
+ # this can happen any time user tries to translate something or enables inline translations
59
+ def self.current_translator
60
+ Thread.current[:tr8n_current_translator] ||= Tr8n::Translator.register
61
+ end
62
+
63
+ def self.default_language
64
+ return Tr8n::Language.new(:locale => default_locale) if disabled?
65
+ @default_language ||= Tr8n::Language.for(default_locale) || Tr8n::Language.new(:locale => default_locale)
66
+ end
67
+
68
+ def self.reset!
69
+ # thread based variables
70
+ Thread.current[:tr8n_current_language] = nil
71
+ Thread.current[:tr8n_current_user] = nil
72
+ Thread.current[:tr8n_current_translator] = nil
73
+ Thread.current[:tr8n_block_options] = nil
74
+ end
75
+
76
+ def self.models
77
+ [
78
+ Tr8n::LanguageRule, Tr8n::LanguageUser, Tr8n::Language, Tr8n::LanguageMetric,
79
+ Tr8n::LanguageCase, Tr8n::LanguageCaseValueMap, Tr8n::LanguageCaseRule,
80
+ Tr8n::TranslationKey, Tr8n::TranslationKeySource, Tr8n::TranslationKeyComment, Tr8n::TranslationKeyLock,
81
+ Tr8n::TranslationSource, Tr8n::TranslationDomain,
82
+ Tr8n::Translation, Tr8n::TranslationVote,
83
+ Tr8n::Translator, Tr8n::TranslatorLog, Tr8n::TranslatorMetric,
84
+ Tr8n::TranslatorFollowing, Tr8n::TranslatorReport,
85
+ Tr8n::LanguageForumTopic, Tr8n::LanguageForumMessage, Tr8n::LanguageForumAbuseReport,
86
+ Tr8n::Glossary, Tr8n::IpLocation
87
+ ]
88
+ end
89
+
90
+ # will clean all tables and initialize default values
91
+ # never ever do it on live !!!
92
+ def self.reset_all!
93
+ puts "Resetting tr8n tables..."
94
+ models.each do |cls|
95
+ puts ">> Resetting #{cls.name}..."
96
+ cls.delete_all
97
+ end
98
+ puts "Done."
99
+
100
+ init_default_languages
101
+ init_glossary
102
+
103
+ puts "Done."
104
+ end
105
+
106
+ def self.init_default_languages
107
+ puts "Initializing default languages..."
108
+ default_languages.each do |locale, info|
109
+ puts ">> Initializing #{info[:english_name]}..."
110
+ lang = Tr8n::Language.find_or_create(locale, info[:english_name])
111
+ info[:right_to_left] = false if info[:right_to_left].nil?
112
+ fallback_key = info.delete(:fallback_key)
113
+ lang.update_attributes(info)
114
+ lang.reset!
115
+ end
116
+ puts "Created #{default_languages.size} languages."
117
+ end
118
+
119
+ def self.init_glossary
120
+ puts "Initializing default glossary..."
121
+ default_glossary.each do |keyword, description|
122
+ Tr8n::Glossary.create(:keyword => keyword, :description => description)
123
+ end
124
+ end
125
+
126
+ def self.root
127
+ Rails.root
128
+ end
129
+
130
+ def self.env
131
+ Rails.env
132
+ end
133
+
134
+ # json support
135
+ def self.load_json(file_path)
136
+ json = JSON.parse(File.read("#{root}#{file_path}"))
137
+ return HashWithIndifferentAccess.new(json) if json.is_a?(Hash)
138
+ map = {"map" => json}
139
+ HashWithIndifferentAccess.new(map)[:map]
140
+ end
141
+
142
+ def self.load_yml(file_path, for_env = env)
143
+ yml = YAML.load_file("#{root}#{file_path}")
144
+ yml = yml[for_env] unless for_env.nil?
145
+ HashWithIndifferentAccess.new(yml)
146
+ end
147
+
148
+ def self.dump_config
149
+ save_to_yaml("config.yaml", config)
150
+ end
151
+
152
+ def self.config
153
+ @config ||= load_yml("/config/tr8n/config.yml")
154
+ end
155
+
156
+ def self.default_languages
157
+ @default_languages ||= load_yml("/config/tr8n/site/default_languages.yml", nil)
158
+ end
159
+
160
+ def self.default_decoration_tokens
161
+ @default_decoration_tokens ||= load_yml("/config/tr8n/tokens/decorations.yml", nil)
162
+ end
163
+
164
+ def self.default_data_tokens
165
+ @default_data_tokens ||= load_yml("/config/tr8n/tokens/data.yml", nil)
166
+ end
167
+
168
+ def self.default_glossary
169
+ @default_glossary ||= load_yml("/config/tr8n/site/default_glossary.yml", nil)
170
+ end
171
+
172
+ def self.features
173
+ @features ||= begin
174
+ defs = load_yml("/config/tr8n/site/features.yml")
175
+ feats = []
176
+ defs[:enabled_features].each do |key|
177
+ defs[key][:key] = key
178
+ feats << defs[key]
179
+ end
180
+ feats
181
+ end
182
+ end
183
+
184
+ def self.enabled?
185
+ config[:enable_tr8n]
186
+ end
187
+
188
+ def self.disabled?
189
+ not enabled?
190
+ end
191
+
192
+ def self.enable_software_keyboard?
193
+ config[:enable_software_keyboard]
194
+ end
195
+
196
+ def self.enable_keyboard_shortcuts?
197
+ config[:enable_keyboard_shortcuts]
198
+ end
199
+
200
+ def self.default_shortcuts
201
+ @default_shortcuts ||= load_yml("/config/tr8n/site/shortcuts.yml", nil)
202
+ end
203
+
204
+ def self.enable_inline_translations?
205
+ config[:enable_inline_translations]
206
+ end
207
+
208
+ def self.enable_language_cases?
209
+ config[:enable_language_cases]
210
+ end
211
+
212
+ def self.enable_key_source_tracking?
213
+ config[:enable_key_source_tracking]
214
+ end
215
+
216
+ def self.enable_key_caller_tracking?
217
+ config[:enable_key_caller_tracking]
218
+ end
219
+
220
+ def self.enable_google_suggestions?
221
+ config[:enable_google_suggestions]
222
+ end
223
+
224
+ def self.enable_glossary_hints?
225
+ config[:enable_glossary_hints]
226
+ end
227
+
228
+ def self.enable_dictionary_lookup?
229
+ config[:enable_dictionary_lookup]
230
+ end
231
+
232
+ def self.enable_language_flags?
233
+ config[:enable_language_flags]
234
+ end
235
+
236
+ def self.enable_language_stats?
237
+ config[:enable_language_stats]
238
+ end
239
+
240
+ def self.open_registration_mode?
241
+ config[:open_registration_mode]
242
+ end
243
+
244
+ def self.enable_fallback_languages?
245
+ config[:enable_fallback_languages]
246
+ end
247
+
248
+ def self.enable_translator_language?
249
+ config[:enable_translator_language]
250
+ end
251
+
252
+ def self.enable_admin_translations?
253
+ config[:enable_admin_translations]
254
+ end
255
+
256
+ def self.enable_admin_inline_mode?
257
+ config[:enable_admin_inline_mode]
258
+ end
259
+
260
+ def self.enable_country_tracking?
261
+ config[:enable_country_tracking]
262
+ end
263
+
264
+ #########################################################
265
+ # Config Sections
266
+ def self.caching
267
+ config[:caching]
268
+ end
269
+
270
+ def self.logger
271
+ config[:logger]
272
+ end
273
+
274
+ def self.site_info
275
+ config[:site_info]
276
+ end
277
+
278
+ def self.rules_engine
279
+ config[:rules_engine]
280
+ end
281
+
282
+ def self.localization
283
+ config[:localization]
284
+ end
285
+
286
+ def self.api
287
+ config[:api]
288
+ end
289
+
290
+ #########################################################
291
+ # Caching
292
+ def self.enable_caching?
293
+ caching[:enabled]
294
+ end
295
+
296
+ def self.cache_adapter
297
+ caching[:adapter]
298
+ end
299
+
300
+ def self.cache_store
301
+ caching[:store]
302
+ end
303
+
304
+ def self.cache_version
305
+ caching[:version]
306
+ end
307
+ #########################################################
308
+
309
+ #########################################################
310
+ # Logger
311
+ def self.enable_logger?
312
+ logger[:enabled]
313
+ end
314
+
315
+ def self.log_path
316
+ logger[:log_path]
317
+ end
318
+
319
+ def self.enable_paranoia_mode?
320
+ logger[:enable_paranoia_mode]
321
+ end
322
+ #########################################################
323
+
324
+ #########################################################
325
+ # Site Info
326
+ def self.site_title
327
+ site_info[:title]
328
+ end
329
+
330
+ def self.splash_screen
331
+ site_info[:splash_screen]
332
+ end
333
+
334
+ def self.default_locale
335
+ return block_options[:default_locale] if block_options[:default_locale]
336
+ site_info[:default_locale]
337
+ end
338
+
339
+ def self.multiple_base_languages?
340
+ 'en-US' == default_locale
341
+ end
342
+
343
+ def self.default_url
344
+ site_info[:default_url]
345
+ end
346
+
347
+ def self.current_locale_method
348
+ site_info[:current_locale_method]
349
+ end
350
+
351
+ def self.enable_tr8n_method
352
+ site_info[:enable_tr8n_method]
353
+ end
354
+
355
+ def self.sitemap_sections
356
+ @sitemap_sections ||= load_json(site_info[:sitemap_path])
357
+ end
358
+
359
+ def self.effects_library_path
360
+ site_info[:effects_library_path]
361
+ end
362
+
363
+ def self.enable_effects?
364
+ site_info[:enable_effects]
365
+ end
366
+
367
+ def self.tr8n_helpers
368
+ return [] unless site_info[:tr8n_helpers]
369
+ @tr8n_helpers ||= site_info[:tr8n_helpers].collect{|helper| helper.to_sym}
370
+ end
371
+
372
+ def self.admin_helpers
373
+ return [] unless site_info[:admin_helpers]
374
+ @admin_helpers ||= site_info[:admin_helpers].collect{|helper| helper.to_sym}
375
+ end
376
+
377
+ def self.skip_before_filters
378
+ return [] unless site_info[:skip_before_filters]
379
+ @skip_before_filters ||= site_info[:skip_before_filters].collect{|filter| filter.to_sym}
380
+ end
381
+
382
+ def self.before_filters
383
+ return [] unless site_info[:before_filters]
384
+ @before_filters ||= site_info[:before_filters].collect{|filter| filter.to_sym}
385
+ end
386
+
387
+ def self.after_filters
388
+ return [] unless site_info[:after_filters]
389
+ @after_filters ||= site_info[:after_filters].collect{|filter| filter.to_sym}
390
+ end
391
+
392
+ #########################################################
393
+ # site user info
394
+ # The following methods could be overloaded in the initializer
395
+ #########################################################
396
+ def self.site_user_info
397
+ site_info[:user_info]
398
+ end
399
+
400
+ def self.current_user_method
401
+ site_user_info[:current_user_method]
402
+ end
403
+
404
+ def self.site_user_info_enabled?
405
+ site_user_info[:enabled].nil? ? true : site_user_info[:enabled]
406
+ end
407
+
408
+ def self.site_user_info_disabled?
409
+ !site_user_info_enabled?
410
+ end
411
+
412
+ def self.user_class_name
413
+ return site_user_info[:class_name] if site_user_info_enabled?
414
+ "Tr8n::Translator"
415
+ end
416
+
417
+ def self.user_class
418
+ user_class_name.constantize
419
+ end
420
+
421
+ def self.user_id(user)
422
+ begin
423
+ user.send(site_user_info[:methods][:id])
424
+ rescue Exception => ex
425
+ Tr8n::Logger.error("Failed to fetch user id: #{ex.to_s}")
426
+ return 0
427
+ end
428
+ end
429
+
430
+ def self.user_name(user)
431
+ begin
432
+ user.send(site_user_info[:methods][:name])
433
+ rescue Exception => ex
434
+ Tr8n::Logger.error("Failed to fetch #{user_class_name} name: #{ex.to_s}")
435
+ return "Unknown user"
436
+ end
437
+ end
438
+
439
+ def self.user_gender(user)
440
+ begin
441
+ user.send(site_user_info[:methods][:gender])
442
+ rescue Exception => ex
443
+ Tr8n::Logger.error("Failed to fetch #{user_class_name} name: #{ex.to_s}")
444
+ return "unknown"
445
+ end
446
+ end
447
+
448
+ def self.user_mugshot(user)
449
+ begin
450
+ user.send(site_user_info[:methods][:mugshot])
451
+ rescue Exception => ex
452
+ Tr8n::Logger.error("Failed to fetch #{user_class_name} image: #{ex.to_s}")
453
+ return silhouette_image
454
+ end
455
+ end
456
+
457
+ def self.user_link(user)
458
+ begin
459
+ user.send(site_user_info[:methods][:link])
460
+ rescue Exception => ex
461
+ Tr8n::Logger.error("Failed to fetch #{user_class_name} link: #{ex.to_s}")
462
+ return "/tr8n"
463
+ end
464
+ end
465
+
466
+ def self.user_locale(user)
467
+ begin
468
+ user.send(site_user_info[:methods][:locale])
469
+ rescue Exception => ex
470
+ Tr8n::Logger.error("Failed to fetch #{user_class_name} locale: #{ex.to_s}")
471
+ return default_locale
472
+ end
473
+ end
474
+
475
+ def self.admin_user?(user = current_user)
476
+ begin
477
+ user.send(site_user_info[:methods][:admin])
478
+ rescue Exception => ex
479
+ Tr8n::Logger.error("Failed to fetch #{user_class_name} admin flag: #{ex.to_s}")
480
+ return false
481
+ end
482
+ end
483
+
484
+ def self.current_user_is_admin?
485
+ admin_user?
486
+ end
487
+
488
+ def self.guest_user?(user = current_user)
489
+ return true unless user
490
+ begin
491
+ user.send(site_user_info[:methods][:guest])
492
+ rescue Exception => ex
493
+ Tr8n::Logger.error("Failed to fetch #{user_class_name} guest flag: #{ex.to_s}")
494
+ return true
495
+ end
496
+ end
497
+
498
+ def self.current_user_is_guest?
499
+ guest_user?
500
+ end
501
+
502
+ def self.silhouette_image
503
+ "/tr8n/images/photo_silhouette.gif"
504
+ end
505
+
506
+ #########################################################
507
+ # rules engine
508
+
509
+ def self.language_rule_classes
510
+ @language_rule_classes ||= rules_engine[:language_rule_classes].collect{|lrc| lrc.constantize}
511
+ end
512
+
513
+ def self.language_rule_dependencies
514
+ @language_rule_dependencies ||= begin
515
+ depts = {}
516
+ language_rule_classes.each do |cls|
517
+ if depts[cls.dependency]
518
+ raise Tr8n::Exception.new("The same dependency key #{cls.dependency} has been registered for multiple rules. This is not allowed.")
519
+ end
520
+ depts[cls.dependency] = cls
521
+ end
522
+ depts
523
+ end
524
+ end
525
+
526
+ def self.universal_language_rules
527
+ @universal_language_rules ||= begin
528
+ urs = []
529
+ language_rule_classes.each do |cls|
530
+ next unless cls.suffixes.is_a?(String)
531
+ urs << cls if cls.suffixes == "*"
532
+ end
533
+ urs
534
+ end
535
+ end
536
+
537
+ def self.language_rule_suffixes
538
+ @language_rule_suffixes ||= begin
539
+ sfx = {}
540
+ language_rule_classes.each do |cls|
541
+ next unless cls.suffixes.is_a?(Array)
542
+ cls.suffixes.each do |suffix|
543
+ if suffix.index("_")
544
+ raise Tr8n::Exception.new("Incorrect rule suffix: #{suffix}. Suffix may not have '_' in it.")
545
+ end
546
+ sfx[suffix] ||= []
547
+ sfx[suffix] << cls
548
+ end
549
+ end
550
+ sfx
551
+ end
552
+ end
553
+
554
+ def self.language_rules_for_suffix(suffix)
555
+ suffix_rules = language_rule_suffixes[suffix] || []
556
+ suffix_rules + universal_language_rules
557
+ end
558
+
559
+ def self.allow_nil_token_values?
560
+ rules_engine[:allow_nil_token_values]
561
+ end
562
+
563
+ def self.data_token_classes
564
+ @data_token_classes ||= rules_engine[:data_token_classes].collect{|tc| tc.constantize}
565
+ end
566
+
567
+ def self.decoration_token_classes
568
+ @decoration_token_classes ||= rules_engine[:decoration_token_classes].collect{|tc| tc.constantize}
569
+ end
570
+
571
+ def self.viewing_user_token_for(label)
572
+ Tr8n::Tokens::DataToken.new(label, "{#{rules_engine[:viewing_user_token]}:gender}")
573
+ end
574
+
575
+ def self.translation_threshold
576
+ rules_engine[:translation_threshold]
577
+ end
578
+
579
+ def self.default_rank_styles
580
+ @default_rank_styles ||= begin
581
+ styles = {}
582
+ rules_engine[:translation_rank_styles].each do |key, value|
583
+ range = Range.new(*(key.to_s.split("..").map{|v| v.to_i}))
584
+ styles[range] = value
585
+ end
586
+ styles
587
+ end
588
+ end
589
+
590
+ # get rules for specified locale, or get default language rules
591
+ def self.load_default_rules(rules_type, locale = default_locale)
592
+ @default_rules ||= {}
593
+ @default_rules[rules_type] ||= load_yml("/config/tr8n/rules/default_#{rules_type}_rules.yml", nil)
594
+ rules_for_locale = @default_rules[rules_type][locale.to_s]
595
+
596
+ return rules_for_locale.values unless rules_for_locale.nil?
597
+ return [] if @default_rules[rules_type][default_locale].nil?
598
+ @default_rules[rules_type][default_locale].values
599
+ end
600
+
601
+ def self.default_gender_rules(locale = default_locale)
602
+ load_default_rules("gender", locale)
603
+ end
604
+
605
+ def self.default_gender_list_rules(locale = default_locale)
606
+ load_default_rules("gender_list", locale)
607
+ end
608
+
609
+ def self.default_list_rules(locale = default_locale)
610
+ load_default_rules("list", locale)
611
+ end
612
+
613
+ def self.default_numeric_rules(locale = default_locale)
614
+ load_default_rules("numeric", locale)
615
+ end
616
+
617
+ def self.default_date_rules(locale = default_locale)
618
+ load_default_rules("date", locale)
619
+ end
620
+
621
+ def self.default_value_rules(locale = default_locale)
622
+ load_default_rules("value", locale)
623
+ end
624
+
625
+ def self.default_cases_for(locale = default_locale)
626
+ @default_cases ||= load_yml("/config/tr8n/rules/default_cases.yml", nil)
627
+ return [] unless @default_cases[locale.to_s]
628
+ @default_cases[locale.to_s].values
629
+ end
630
+
631
+ #########################################################
632
+ # localization
633
+ #########################################################
634
+
635
+ def self.strftime_symbol_to_token(symbol)
636
+ {
637
+ "%a" => "{short_week_day_name}",
638
+ "%A" => "{week_day_name}",
639
+ "%b" => "{short_month_name}",
640
+ "%B" => "{month_name}",
641
+ "%p" => "{am_pm}",
642
+ "%d" => "{days}",
643
+ "%e" => "{day_of_month}",
644
+ "%j" => "{year_days}",
645
+ "%m" => "{months}",
646
+ "%W" => "{week_num}",
647
+ "%w" => "{week_days}",
648
+ "%y" => "{short_years}",
649
+ "%Y" => "{years}",
650
+ "%l" => "{trimed_hour}",
651
+ "%H" => "{full_hours}",
652
+ "%I" => "{short_hours}",
653
+ "%M" => "{minutes}",
654
+ "%S" => "{seconds}",
655
+ "%s" => "{since_epoch}"
656
+ }[symbol]
657
+ end
658
+
659
+ def self.default_day_names
660
+ localization[:default_day_names]
661
+ end
662
+
663
+ def self.default_abbr_day_names
664
+ localization[:default_abbr_day_names]
665
+ end
666
+
667
+ def self.default_month_names
668
+ localization[:default_month_names]
669
+ end
670
+
671
+ def self.default_abbr_month_names
672
+ localization[:default_abbr_month_names]
673
+ end
674
+
675
+ def self.default_date_formats
676
+ localization[:custom_date_formats]
677
+ end
678
+
679
+ #########################################################
680
+ # Translator Roles and Levels
681
+ #########################################################
682
+ def self.translator_roles
683
+ config[:translator_roles]
684
+ end
685
+
686
+ def self.translator_levels
687
+ @translator_levels ||= begin
688
+ levels = HashWithIndifferentAccess.new
689
+ translator_roles.each do |key, val|
690
+ levels[val] = key
691
+ end
692
+ levels
693
+ end
694
+ end
695
+
696
+ def self.manager_level
697
+ 1000
698
+ end
699
+
700
+ def self.admin_level
701
+ 10000
702
+ end
703
+
704
+ def self.default_translation_key_level
705
+ config[:default_translation_key_level] || 0
706
+ end
707
+
708
+ #########################################################
709
+ # API
710
+ #########################################################
711
+ def self.enable_api?
712
+ api[:enabled]
713
+ end
714
+
715
+ def self.enable_client_sdk?
716
+ config[:enable_client_sdk]
717
+ end
718
+
719
+ end