tr8n 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
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,668 @@
1
+ <%= tr8n_with_options_tag(:default_locale => 'en-US', :admin => true) do %>
2
+
3
+ <style>
4
+ h2 {
5
+ font-weight: bold;
6
+ }
7
+ h3 {
8
+ padding-top: 10px;
9
+ }
10
+ .snippet {
11
+ border: 1px solid #ccc;
12
+ margin-top:10px;
13
+ margin-bottom:10px;
14
+ padding:10px;
15
+ background-color: #f8f8ff;
16
+ }
17
+ .snippet2 {
18
+ border: 1px solid #ccc;
19
+ margin-top:10px;
20
+ margin-bottom:10px;
21
+ padding:10px;
22
+ background-color: #fff8f8;
23
+ }
24
+ .try_it {
25
+ font-style:italic;
26
+ }
27
+ .toc {
28
+ margin-left:20px;
29
+ margin-bottom:20px;
30
+ list-style-type:upper-roman;
31
+ }
32
+ .toc li div {
33
+ border-bottom:1px dotted #ccc;
34
+ font-size:16px;
35
+ }
36
+ .toc1 {
37
+ margin-left:20px;
38
+ list-style-type:lower-roman;
39
+ }
40
+ </style>
41
+ <div style="text-align:center; margin:15px;">
42
+ <%=image_tag("/tr8n/images/tr8n_logo.png", :style => "height:120px;")%>
43
+ </div>
44
+
45
+ <h2 class="underscore content_hd">
46
+ <%=tr("Tr8n Rules Engine Configuration")%>
47
+ </h2>
48
+
49
+ <div class="content_bd">
50
+ <h2><%=tr("Table of Content") %></h2>
51
+ <p>
52
+ <ul class='toc'>
53
+ <li><div><a href="#introduction"><%=tr("Introduction") %></a></div>
54
+ </li>
55
+ <li><div><a href="#context_rules"><%=tr("Language Context Rules") %></a></div>
56
+ <ul class='toc1'>
57
+ <li><div><a href="#numeric_rules"><%=tr("Numeric Rules") %></a></li>
58
+ <li><div><a href="#gender_rules"><%=tr("Gender Rules") %></a></li>
59
+ <li><div><a href="#list_rules"><%=tr("List Rules") %></a></li>
60
+ <li><div><a href="#date_rules"><%=tr("Date Rules") %></a></li>
61
+ <li><div><a href="#value_rules"><%=tr("Value Rules") %></a></li>
62
+ </ul>
63
+ </li>
64
+ <li><div><a href="#context_rules"><%=tr("Language Case Rules") %></a></div></li>
65
+ </ul>
66
+ </p>
67
+
68
+ <a name="introduction">&nbsp;</a>
69
+ <h2><%=tr("Introduction") %></h2>
70
+ <p>
71
+ Tr8n translation engine is a rails engine plugin that provides a framework
72
+ for crowd-source translations and management of any internationalized text
73
+ throughout any rails based application. The power of the engine comes from
74
+ its simple and friendly user interface that allows site users to rapidly
75
+ translate the site into hundreds of languages. The flexible and robust rules
76
+ engine that powers Tr8n allows for any combinations of language specific
77
+ rules in any translatable sentence. Users themselves can provide information
78
+ on what sentences depend on gender rules, number rules or other types of rules
79
+ supported by the engine. The language specific rules can be registered and
80
+ managed for any language in the advanced user interface.
81
+ </p>
82
+
83
+ <p>
84
+ There are two types of rules supported by Tr8n:
85
+ <div style="padding-left:20px; padding-bottom:10px;">
86
+ <ul style="list-style-type:square">
87
+ <li>Language context rules that define the context for translations.</li>
88
+ <li>Language case rules that evaluate and modify token values.</li>
89
+ </ul>
90
+ </div>
91
+ </p>
92
+
93
+ <p>
94
+ This document provides details on how to configure rules for various languages and shows examples on how those rules are used by the translators.
95
+ </p>
96
+
97
+ <a name="context_rules">&nbsp;</a>
98
+ <h2>Language Context Rules</h2>
99
+ <p>
100
+ Language context rules are used to define a context for any translation of the original phrase. The easiest way to understand it is to start with a simple example.
101
+
102
+ <div class="snippet">
103
+ tr("You have {count||message}", "Inbox count label", :count => 5)
104
+ </div>
105
+
106
+ <i>Note: In the above example, we used a transform token to make it easy to evaluate the numeric rule for the base language (which is English in our case). More on it later.<br><br>
107
+ </i>
108
+
109
+ In many languages the translated word "messages" depends on the value of the token {count}.
110
+ In languages, like English, there are only two context rules that are necessary to correctly translate the above phrase:
111
+ <br><br>
112
+ <div style="padding-left:20px; padding-bottom:10px;">
113
+ <ul style="list-style-type:square">
114
+ <li>Rule 1: {count} is 1</li>
115
+ <li>Rule 2: {count} is not 1</li>
116
+ </ul>
117
+ </div>
118
+
119
+ When a translator opens the translation window for the above phrase, he/she can indicate that the phrase translations depend on the context rules (based on some tokens) and
120
+ provide the translation for each of the rule:<br>
121
+ <div class="snippet">
122
+ "You have 1 message!"<br>
123
+ Context: count is 1<br><br>
124
+
125
+ "You have 2 messages!"<br>
126
+ Context: count is not 1<br>
127
+ </div>
128
+
129
+ But this is not the case with other language. For instant, many of the Slavic languages, like Russian, has 3 or more rules for number based tokens.
130
+
131
+ Lets use the following code and try translating it using Russian language:
132
+ <div class="snippet">
133
+ &lt;% 0.upto(5) do |i| %><br><br>
134
+ &nbsp;&nbsp;&nbsp;&nbsp; &lt;%= tr("You have {count||message}", "Inbox count label", :count => i) %><br><br>
135
+ &lt;% end %><br>
136
+ </div>
137
+
138
+ <br>
139
+ Now follow the steps below and try translating the following block:
140
+
141
+ <div class="snippet2">
142
+ <% 0.upto(5) do |i| %>
143
+ <%= tr("You have {count||message}", "Inbox count label", :count => i) %><br>
144
+ <% end %>
145
+ </div>
146
+
147
+ <div style="padding-left:20px; padding-bottom:10px;">
148
+ <ul style="list-style-type:decimal;">
149
+ <li>Make sure you are a registered user and have logged into the site</li>
150
+ <li>Choose a language other than English</li>
151
+ <li>Press Ctrl+Shift+I to enable the inline translations or choose that options from the language selector.</li>
152
+ <li>Right-mouse-click on any one of the highlighted rows above to open the translator window</li>
153
+ <li>Click on the "generate context rules for this phrase" link:<br><br>
154
+ <%=image_tag("/tr8n/images/examples/numeric_rules_1.png")%><br><br>
155
+ </li>
156
+ <li>Check the number dependency checkbox in the count token row:<br><br>
157
+ <%=image_tag("/tr8n/images/examples/numeric_rules_2.png")%><br><br>
158
+ </li>
159
+ <li>Click "Continue..." button to see the translation option for each context rule available for the language:<br><br>
160
+ <%=image_tag("/tr8n/images/examples/numeric_rules_3.png", :style => "width:800px; border:1px solid #ccc;")%><br><br>
161
+ </li>
162
+ </ul>
163
+ </div>
164
+
165
+ Based on the language you chose, you will get a list of pre-generated default translations for each context rule for the given phrase.
166
+ In the above example, we chose the Russian language, which like some Slavic languages, has three rules for number dependent tokens.
167
+ <br><br>
168
+ If you followed the instructions above and chose Russian language, you should see the above block looking something like this:<br><br>
169
+ <%=image_tag("/tr8n/images/examples/numeric_rules_4.png", :style => "width:800px;")%><br><br>
170
+
171
+ Good job! By this point you pretty much have an idea of how the rules engine works.<br><br>
172
+
173
+ Lets take a look now at the various rules that Tr8n rules engine comes with.
174
+ </p>
175
+
176
+ <a name="numeric_rules">&nbsp;</a>
177
+ <h3>Numeric Rules</h3>
178
+ <p>
179
+ The example above was using the numeric rules dependency. It showed how the translators deal with the rules when they translate the sentence,
180
+ but what it didn't show was the following:
181
+
182
+ <ul style="padding-left:20px; list-style-type:square;">
183
+ <li>Where did Tr8n get the 3 rules defined for Russian language?</li>
184
+ <li>How on Earth did Tr8n know that the {count} token was dependant on numeric rules?</li>
185
+ <li>How does it evaluate the rules at Runtime to get the appropritate translation for the given phrase?</li>
186
+ </ul>
187
+ <br><br>
188
+
189
+ Let's start from the beginning. Tr8n engine has three modes: user facing functions, language manager functions and administrative functions.
190
+ User facing function showed everything that we've done during the translation process in the above example. Language manager function is what we are going to look at right now.
191
+ Admin facing functions is what only site administrators can see. We will look into it later.
192
+ <br><br>
193
+
194
+ If you are a language manager for any particular language, then you have access to the following interface of that language:<br><br>
195
+ <%=image_tag("/tr8n/images/examples/language_manager_1.png", :style => "width:800px; border:1px solid #ccc;")%><br><br>
196
+
197
+ There are a few different tools that language managers can use to change each language behavior. In our case, let's concentrate on the Context Rules section.<br><br>
198
+
199
+ <%=image_tag("/tr8n/images/examples/context_rules_1.png", :style => "width:800px; border:1px solid #ccc;")%><br><br>
200
+
201
+ If you click on the edit button on the top right corner, you will enter the edit mode of the context rules:<br><br>
202
+ <%=image_tag("/tr8n/images/examples/context_rules_2.png", :style => "width:800px; border:1px solid #ccc;")%><br><br>
203
+
204
+ In that screen language managers can change rule definitions for each rule type. As it was mentioned earlier, in English language the rules would simply be:
205
+
206
+ <div style="padding-left:20px; padding-bottom:10px;">
207
+ <ul style="list-style-type:square">
208
+ <li>is 1</li>
209
+ <li>is not 1</li>
210
+ </ul>
211
+ </div>
212
+
213
+ <strong>Number Rule Definition</strong><br><br>
214
+ <div style="padding-left:20px; padding-bottom:10px;">
215
+ <ul style="list-style-type:square">
216
+ <li>Number rule can be simple or complex. You can use "more" and "less" links to use the double conditions for any rule line.</li>
217
+ <li>The first operation options are: "is", "is not", "ends in", "does not end in"</li>
218
+ <li>The linking operator options are: "and", "or"</li>
219
+ <li>The last operation options are: "is", "is not", "ends in", "does not end in"</li>
220
+ </ul>
221
+ </div>
222
+
223
+ We have answered the first question of where Tr8n got the rules. Now let's look at how Tr8n knew about the token-rule dependency. <br><br>
224
+
225
+ <strong>Number Rule Configuration</strong><br><br>
226
+
227
+ Tr8n Rules engine itself does not know and really care about what rules it has and what it should do with them. The rules of Tr8n can be extended, modified, added and removed by the developers.
228
+ Take a look at the Rule Engine section in the <strong>config/tr8n/config.yml</strong> file:
229
+
230
+ <div class="snippet" style="font-size:11px;">
231
+ <pre>
232
+ #############################################################################
233
+ # Rules Engine Settings
234
+ #############################################################################
235
+ rules_engine:
236
+ <strong>language_rule_classes: [Tr8n::NumericRule, Tr8n::GenderRule, Tr8n::GenderListRule, Tr8n::DateRule, Tr8n::ValueRule]</strong>
237
+ data_token_classes: [Tr8n::Tokens::DataToken, Tr8n::Tokens::HiddenToken, Tr8n::Tokens::MethodToken, Tr8n::Tokens::TransformToken]
238
+ decoration_token_classes: [Tr8n::Tokens::DecorationToken]
239
+ allow_nil_token_values: true
240
+ <strong>numeric_rule:
241
+ token_suffixes: [count, num, age, hours, minutes, years, seconds]
242
+ object_method: to_i
243
+ </strong>gender_rule:
244
+ token_suffixes: [user, profile, actor, target, partner, parent, child, sibling, manager]
245
+ object_method: gender
246
+ method_values:
247
+ female: female
248
+ male: male
249
+ neutral: neutral
250
+ unknown: unknown
251
+ gender_list_rule:
252
+ object_method: size
253
+ token_suffixes: [list]
254
+ date_rule:
255
+ token_suffixes: [date]
256
+ object_method: to_date
257
+ value_rule:
258
+ token_suffixes: *
259
+ object_method: to_s
260
+ </pre>
261
+ </div>
262
+
263
+ The most important parts of the file that are applicable to the Number Rule are in bold. When Tr8n boots up for the first time, it looks at the list of rule classes under the
264
+ language_rule_classes key and loads the classes it needs. Each Rule class extends the basic Tr8n::LanguageRule class, which provides the basic rule behavior.
265
+ The rule configuration options and UI are provided by the rules themselves. So it is fairly easy to add a new rule to the engine.
266
+ <br><br>
267
+
268
+ Since Tr8n comes with the 6 default rules, I have added sections in the rules_engine config section where these rules can be configured. Each rule may need some ability to be customized for
269
+ the site where Tr8n will be used.
270
+ <br><br>
271
+
272
+ <strong>Number Rule</strong> is implemented by the <strong>Tr8n::NumericRule</strong> class and uses the <strong>numeric_rule</strong> section of the rules_engine configuration.
273
+ <br><br>
274
+
275
+ <div style="padding-left:20px; padding-bottom:10px;">
276
+ <ul style="list-style-type:square">
277
+ <li><strong>token_suffixes</strong> indicates the set of token names that have numerical values and can be translated using numeric context rule</li>
278
+ <li><strong>object_method</strong> indicates the method that must be applied on the token object in order to get its numerical value</li>
279
+ </ul>
280
+ </div>
281
+
282
+ This means that any of the following tokens will give user an option to translate the phrase based on the numeric value of the token: {count}, {num}, {message_num}, {user_count}, etc...
283
+
284
+ Notice that in our above example we used a simple number for the token value. It worked great because, in Ruby, the numbers are objects that respond to to_i method as well:
285
+
286
+ <div class="snippet">
287
+ tr("You have {count||message}", "Inbox count label", :count => 5)
288
+ </div>
289
+
290
+ But the value of the {count} could have been a string or any other object, as long as it implemented the to_i method. If your site has other conventions, you can easily change the
291
+ numeric_rule definition and everything would still work.
292
+
293
+ </p>
294
+
295
+ <a name="gender_rules">&nbsp;</a>
296
+ <h3>Gender Rules</h3>
297
+ <p>
298
+ Consider the following example:
299
+
300
+ <div class="snippet">
301
+ tr("Dear {user},", "Reference to a user in a heading of an email", :user => [current_user, :name])<br><br>
302
+ tr("{user} updated {user| his, her} profile.", "Newsfeed story heading", :user => [some_user, :name])<br><br>
303
+ tr("{user| Added On:}", "Label for when the user was added to the site", :user => some_user)<br><br>
304
+ </div>
305
+
306
+ All of the above examples have dependency on the gender of the {user} token. Each sentence will have 2 or 3 translations based on the rule definition of the language the phrase is translated to.
307
+
308
+ <br><br>
309
+ Change your language, enable inline translations and try translating the following sentences yourself:
310
+ <div class="snippet2">
311
+ <%= tr("Dear {user},", "Reference to a user in a heading of an email", :user => [Tr8n::Config.current_user, :name]) %>
312
+ <br><br>
313
+ <%= tr("{user} updated {user| his, her} profile.", "Newsfeed story heading", :user => [Tr8n::Config.current_user, :name]) %>
314
+ <br><br>
315
+ <%= tr("{user| Added On:}", "Label for when the user was added to the site", :user => Tr8n::Config.current_user) %>
316
+ </div>
317
+
318
+
319
+ Let's take the second example and look at what it would be translated to in Russian:
320
+ <br><br>
321
+ <%=image_tag("/tr8n/images/examples/gender_rules_1.png", :style =>"vertical-align:top; padding-right:15px;")%>
322
+ <%=image_tag("/tr8n/images/examples/gender_rules_2.png", :style =>"vertical-align:top")%><br><br>
323
+
324
+ Translating the above sentece into Russian will require setting up a dependency on the {user} token. Russian language was configured to have 3 rules to hande male, female and unknown gender cases.<br><br>
325
+ <%=image_tag("/tr8n/images/examples/gender_rules_3.png", :style => "width:800px; border:1px solid #ccc;")%><br><br>
326
+
327
+ Some languages can treat unknown genders as male genders. The gender rules for that language can simply state:
328
+ <div style="padding-left:20px; padding-bottom:10px;">
329
+ <ul style="list-style-type:square">
330
+ <li>user is a female</li>
331
+ <li>user is not a female</li>
332
+ </ul>
333
+ </div>
334
+
335
+ <br>
336
+ <strong>Gender Rule Definition</strong><br><br>
337
+ <div style="padding-left:20px; padding-bottom:10px;">
338
+ <ul style="list-style-type:square">
339
+ <li>A rule consists of 2 parts: operator and gender.</li>
340
+ <li>The operator options are: "is", "is not"</li>
341
+ <li>The gender options are: "a male", "a female", "neutral", "unknown"</li>
342
+ </ul>
343
+ </div>
344
+
345
+ <br>
346
+ <strong>Gender Rule Configuration</strong><br>
347
+ <div class="snippet" style="font-size:11px;">
348
+ <pre>
349
+ rules_engine:
350
+ ...
351
+ <strong>gender_rule:
352
+ token_suffixes: [user, profile, actor, target, partner, parent, child, sibling, manager]
353
+ object_method: gender
354
+ method_values:
355
+ female: female
356
+ male: male
357
+ neutral: neutral
358
+ unknown: unknown</strong>
359
+ ...
360
+ </pre>
361
+ </div>
362
+
363
+ <strong>Gender Rule</strong> is implemented by the <strong>Tr8n::GenderRule</strong> class and uses the <strong>gender_rule</strong> section of the rules_engine configuration.
364
+ <br><br>
365
+ <div style="padding-left:20px; padding-bottom:10px;">
366
+ <ul style="list-style-type:square">
367
+ <li><strong>token_suffixes</strong> indicates the set of token names that can be translated using gender context rule</li>
368
+ <li><strong>object_method</strong> indicates the method that must be applied on the token object in order to get its gender value</li>
369
+ <li><strong>method_values</strong> maps the return values from the object_method that would tell the rule if it met the evaluation criteria</li>
370
+ </ul>
371
+ </div>
372
+ </p>
373
+
374
+ <a name="list_rules">&nbsp;</a>
375
+ <h3>List Rules</h3>
376
+ <p>
377
+ Consider the following examples:
378
+
379
+ <div class="snippet">
380
+ user1 = User.new(:name => "Michael", :gender => 'male')<br>
381
+ user2 = User.new(:name => "Amos", :gender => 'male')<br>
382
+ user3 = User.new(:name => "Tina", :gender => 'female')<br>
383
+ users = [user1, user2, user3]<br><br>
384
+
385
+ tr("{user_list} updated {user_list| his profile, her profile, their profiles}.", "Newsfeed story title", :user_list => [users, :name])<br><br>
386
+ tr("{user_list} updated {user_list| his profile, her profile, their profiles}.", "Newsfeed story title", :user_list => [[user1], :name])<br><br>
387
+ tr("{user_list|| likes, like} this post.", "Newsfeed story title", :user_list => [users, :name])<br><br>
388
+ tr("{user_list|| likes, like} this post.", "Newsfeed story title", :user_list => [[user1], :name])<br><br>
389
+ </div>
390
+
391
+ <br>
392
+ Change your language, enable inline translations and try translating the following sentences yourself:
393
+ <div class="snippet2">
394
+ <%
395
+ user1 = Tr8n::Translator.new(:name => "Michael", :gender => 'male')
396
+ user2 = Tr8n::Translator.new(:name => "Amos", :gender => 'male')
397
+ user3 = Tr8n::Translator.new(:name => "Tina", :gender => 'female')
398
+ users = [user1, user2, user3]
399
+ %>
400
+ <%= tr("{user_list} updated {user_list| his profile, her profile, their profiles}.", "Newsfeed story title", :user_list => [users, :name]) %><br><br>
401
+ <%= tr("{user_list} updated {user_list| his profile, her profile, their profiles}.", "Newsfeed story title", :user_list => [[user1], :name]) %><br><br>
402
+
403
+ <%= tr("{user_list|| likes, like} this post.", "Newsfeed story title", :user_list => [users, :name]) %><br><br>
404
+ <%= tr("{user_list|| likes, like} this post.", "Newsfeed story title", :user_list => [[user1], :name]) %><br><br>
405
+ </div>
406
+
407
+ <br>
408
+ As you can tell, there is something interesting going on here. Overall, there is nothing new. We are just using the transform tokens. The above examples only registered two
409
+ phrases in the system. But they are very powerful. List tokens have special notations and we are going to look at them in a little bit.
410
+
411
+ Let's take the first example and look at what it would be translated to in Russian:
412
+ <br><br>
413
+ <%=image_tag("/tr8n/images/examples/list_rules_1.png", :style =>"vertical-align:top; padding-right:15px;")%>
414
+ <%=image_tag("/tr8n/images/examples/list_rules_2.png", :style =>"vertical-align:top")%><br><br>
415
+
416
+ Translating the above sentece into Russian will require setting up a dependency on the {user_list} token.
417
+ Russian language was configured to have 4 rules to hande male, female, unknown gender cases for a single element in the list and one rule for plural case.<br><br>
418
+ <%=image_tag("/tr8n/images/examples/list_rules_3.png", :style => "width:800px; border:1px solid #ccc;")%><br><br>
419
+
420
+ Some languages, like Hebrew, can specify the genders for the plural cases as well:
421
+ <div style="padding-left:20px; padding-bottom:10px;">
422
+ <ul style="list-style-type:square">
423
+ <li>user_list contains at least 2 elements that are all male</li>
424
+ <li>user_list contains at least 2 elements that are all female</li>
425
+ <li>user_list contains at least 2 elements that are of mixed gender</li>
426
+ </ul>
427
+ </div>
428
+
429
+ <br>
430
+ <strong>List Rule Definition</strong><br><br>
431
+ <div style="padding-left:20px; padding-bottom:10px;">
432
+ <ul style="list-style-type:square">
433
+ <li>List rule can be simple or complex. You can use "more" and "less" links to use the double conditions for any rule line.</li>
434
+ <li>First operator options: "contains"</li>
435
+ <li>First operator values: "one element", "at least 2 elements"</li>
436
+ <li>Second operator options: "that is", "that is not", "that are", "that are not"</li>
437
+ <li>Second operator values: "male", "female", "unknown", "neutral", "all male", "all female", "of mixed gender"</li>
438
+ </ul>
439
+ </div>
440
+
441
+ <br>
442
+ <strong>List Rule Configuration</strong><br>
443
+ <div class="snippet" style="font-size:11px;">
444
+ <pre>
445
+ rules_engine:
446
+ ...
447
+ <strong>gender_list_rule:
448
+ object_method: size
449
+ token_suffixes: [list]</strong>
450
+ ...
451
+ </pre>
452
+ </div>
453
+
454
+ <strong>List Rule</strong> is implemented by the <strong>Tr8n::GenderListRule</strong> class and uses the <strong>gender_list_rule</strong> section of the rules_engine configuration.
455
+ It is important to note that the list rule works together with the gender rule to use the gender method configurations.
456
+ <br><br>
457
+ <div style="padding-left:20px; padding-bottom:10px;">
458
+ <ul style="list-style-type:square">
459
+ <li><strong>token_suffixes</strong> indicates the set of token names that can be translated using gender context rule</li>
460
+ <li><strong>object_method</strong> indicates the method that must be applied on the token object in order to get its gender value</li>
461
+ </ul>
462
+ </div>
463
+
464
+
465
+ <br>
466
+ <strong>List View Options</strong><br><br>
467
+
468
+ When a token contains a collection of values instead of a single value (wether it needs to be rule dependent or not) it has some nice extra features in terms of how it can be
469
+ presented to the user.
470
+ <div class="snippet" style="font-size:11px;">
471
+ <pre>
472
+ ##############################################################################
473
+ #
474
+ # tr("Hello {user_list}!", "Example fragment", {:user_list => [[user1, user2, user3], :name]}}
475
+ #
476
+ # first element is an array, the rest of the elements are similar to the
477
+ # regular tokens lambda, symbol, string, with parameters that follow
478
+ #
479
+ # if you want to pass options, then make the second parameter an array as well
480
+ #
481
+ # tr("{user_list} joined Geni", "",
482
+ # {:user_list => [[user1, user2, user3],
483
+ # [:name], # this can be any of the value methods
484
+ # { :expandable => true,
485
+ # :to_sentence => true,
486
+ # :limit => 4,
487
+ # :separator => ',',
488
+ # :translate_items => false,
489
+ # :minimizable => true
490
+ # }
491
+ # ]
492
+ # ]})
493
+ #
494
+ ##############################################################################
495
+ </pre>
496
+ </div>
497
+
498
+ As you can see from the definition above, if you make the second parameter of the tr function an array as well, you can provide a third parameter
499
+ that would indicate how to display the array values. Let's try the following example:
500
+
501
+ <div class="snippet">
502
+ users = 1.upto(10).collect{|i| User.new(:name => "User #{i}", :gender => 'male')}<br><br>
503
+ tr("{users} joined the site!", "Newsfeed story header", :users => [users, :name])
504
+ </div>
505
+
506
+ <br>
507
+ The above example uses the second parameter as method symbol, which indicates that default display params will be used, resulting in:
508
+ <div class="snippet2">
509
+ <% users = 1.upto(10).collect{|i| Tr8n::Translator.new(:name => "User #{i}", :gender => 'male')} %>
510
+ <%= tr("{users} joined the site!", "Newsfeed story header", :users => [users, :name]) %>
511
+ </div>
512
+
513
+ Notice that the expandable flag was set to true, limit was set to 4, etc... resulting in display of 4 names with an expandable link to display the rest of the names
514
+
515
+ Lets try changing the parameters to display limit 3 and try again:
516
+
517
+ <div class="snippet">
518
+ users = 11.upto(15).collect{|i| User.new(:name => "User #{i}", :gender => 'male')}<br><br>
519
+ tr("{users} joined the site!", "Newsfeed story header", :users => [users, [:name], {:limit => 3}])
520
+ </div>
521
+
522
+ <div class="snippet2">
523
+ <% users = 11.upto(15).collect{|i| Tr8n::Translator.new(:name => "User #{i}", :gender => 'male')} %>
524
+ <%= tr("{users} joined the site!", "Newsfeed story header", :users => [users, [:name], {:limit => 3}]) %>
525
+ </div>
526
+
527
+ Notice that the above two examples use the same translation key. You got the idea! You can try changinging other parameters and see what happens.
528
+ </p>
529
+
530
+
531
+ <a name="date_rules">&nbsp;</a>
532
+ <h3>Date Rules</h3>
533
+ <p>
534
+ Date Rule is a very simple rule. It is used to evaluate the default as well as the translated phrases using the date object. For instance:
535
+
536
+ <div class="snippet">
537
+ tr("{user} {birth_date| celebrated, celebrates, will celebrate} {user|his,her} birthday on {birth_date}!", "Birthday notification", :user => current_user, :birth_date => Date.today)
538
+ </div>
539
+
540
+ This looks a little cryptic at first because it actually compresses three sentences and a bunch of translations into a simple phrase. Let's take a closer look:
541
+
542
+ <div style="padding-left:20px; padding-bottom:10px;">
543
+ <ul style="list-style-type:square">
544
+ <li><strong>token_suffixes</strong> indicates the set of token names that have numerical values and can be translated using numeric context rule</li>
545
+ <li><strong>object_method</strong> indicates the method that must be applied on the token object in order to get its numerical value</li>
546
+ </ul>
547
+ </div>
548
+
549
+ Let's try the following variations:
550
+
551
+ <div class="snippet">
552
+ tr("{user} {birth_date| celebrated, celebrates, will celebrate} {user|his,her} birthday on {birth_date}!",
553
+ "Birthday notification", :user => current_user, :birth_date => [Date.today - 1.day, :strftime, "%D"]) <br><br>
554
+
555
+ tr("{user} {birth_date| celebrated, celebrates, will celebrate} {user|his,her} birthday on {birth_date}!",
556
+ "Birthday notification", :user => current_user, :birth_date => [Date.today, :strftime, "%D"]) <br><br>
557
+
558
+ tr("{user} {birth_date| celebrated, celebrates, will celebrate} {user|his,her} birthday on {birth_date}!",
559
+ "Birthday notification", :user => current_user, :birth_date => [Date.today + 1.day, :strftime, "%D"]) <br><br>
560
+ </div>
561
+
562
+ Change your language, enable inline translations and try translating the following sentence:
563
+ <div class="snippet2">
564
+ <%= tr("{user} {birth_date| celebrated, celebrates, will celebrate} {user|his,her} birthday on {birth_date}!", "Birthday notification", :user => Tr8n::Config.current_user, :birth_date => [Date.today - 1.day, :strftime, "%D"]) %>
565
+ <br><br>
566
+ <%= tr("{user} {birth_date| celebrated, celebrates, will celebrate} {user|his,her} birthday on {birth_date}!", "Birthday notification", :user => Tr8n::Config.current_user, :birth_date => [Date.today, :strftime, "%D"]) %>
567
+ <br><br>
568
+ <%= tr("{user} {birth_date| celebrated, celebrates, will celebrate} {user|his,her} birthday on {birth_date}!", "Birthday notification", :user => Tr8n::Config.current_user, :birth_date => [Date.today + 1.day, :strftime, "%D"]) %>
569
+ </div>
570
+
571
+ All those variations have only created a single translation key in the default language. But transling them into other languages is a whole different story.
572
+ <br><br>
573
+ <%=image_tag("/tr8n/images/examples/date_rules_1.png", :style =>"vertical-align:top; padding-right:15px;")%>
574
+ <%=image_tag("/tr8n/images/examples/date_rules_2.png", :style =>"vertical-align:top")%><br><br>
575
+
576
+ Translating the above sentece into Russian will require setting up a dependency on the {user} token, as well as {date} token. Both of the tokens have 3 rules
577
+ and will result in the total of 9 translations.<br><br>
578
+ <%=image_tag("/tr8n/images/examples/date_rules_3.png", :style => "width:800px; border:1px solid #ccc;")%><br><br>
579
+
580
+ <br>
581
+ <strong>Date Rule Definition</strong><br><br>
582
+ <div style="padding-left:20px; padding-bottom:10px;">
583
+ <ul style="list-style-type:square">
584
+ <li>A rule consists of 2 parts: operator and timeframe.</li>
585
+ <li>The operator options are: "is in the", "is not in the"</li>
586
+ <li>The timeframe options are: "past", "present", "future"</li>
587
+ </ul>
588
+ </div>
589
+
590
+ <br>
591
+ <strong>Date Rule Configuration</strong><br><br>
592
+ <div class="snippet" style="font-size:11px;">
593
+ <pre>
594
+ rules_engine:
595
+ ...
596
+ <strong>date_rule:
597
+ token_suffixes: [date]
598
+ object_method: to_date
599
+ </strong>
600
+ ...
601
+ </pre>
602
+ </div>
603
+
604
+ <br>
605
+ <strong>Date Rule</strong> is implemented by the <strong>Tr8n::DateRule</strong> class and uses the <strong>date_rule</strong> section of the rules_engine configuration.
606
+ <br><br>
607
+ <div style="padding-left:20px; padding-bottom:10px;">
608
+ <ul style="list-style-type:square">
609
+ <li><strong>token_suffixes</strong> indicates the set of token names that have date values and can be translated using date context rule</li>
610
+ <li><strong>object_method</strong> indicates the method that must be applied on the token object in order to get its date value</li>
611
+ </ul>
612
+ </div>
613
+
614
+ </p>
615
+
616
+ <a name="value_rules">&nbsp;</a>
617
+ <h3>Value Rules</h3>
618
+ <p>
619
+ Value rules are used for contextual translations of phrases where other parts of the phrase depends on the value of the token. Those rules are usually used in
620
+ combintation with the Language Case Rules, which will be described in the later sections.
621
+
622
+ <br><br>
623
+ <strong>Value Rule Definition</strong><br><br>
624
+ <div style="padding-left:20px; padding-bottom:10px;">
625
+ <ul style="list-style-type:square">
626
+ <li>A rule consists of 2 parts: operator and value.</li>
627
+ <li>The operator options are: "is", "is not", "starts with", "does not start with", "ends in", "does not end in"</li>
628
+ <li>The value can be anything provided by the language manager</li>
629
+ </ul>
630
+ </div>
631
+
632
+ <br>
633
+ <strong>Value Rule Configuration</strong><br><br>
634
+ <div class="snippet" style="font-size:11px;">
635
+ <pre>
636
+ rules_engine:
637
+ ...
638
+ <strong>value_rule:
639
+ token_suffixes: *
640
+ object_method: to_s
641
+ </strong>
642
+ ...
643
+ </pre>
644
+ </div>
645
+
646
+ <br>
647
+ <strong>Value Rule</strong> is implemented by the <strong>Tr8n::ValueRule</strong> class and uses the <strong>value_rule</strong> section of the rules_engine configuration.
648
+ <br><br>
649
+ <div style="padding-left:20px; padding-bottom:10px;">
650
+ <ul style="list-style-type:square">
651
+ <li><strong>token_suffixes</strong> indicates that it can be applied to any token</li>
652
+ <li><strong>object_method</strong> indicates the method that must be applied on the token object in order to get its date value</li>
653
+ </ul>
654
+ </div>
655
+
656
+ </p>
657
+
658
+ <a name="language_cases">&nbsp;</a>
659
+ <h2>Language Case Rules</h2>
660
+ <p>
661
+ A language case is an inflection or use of a noun (or pronoun) to show its relation to other words in the sentence. In some languages, like Russian, the form of a token {actor} will changed based on where and how the token is used in a sentence. For instance, in '{target} received a gift from {actor}', {actor} token will be in the genitive form of the language.
662
+
663
+ <br><br>
664
+ Work in progress, please be patient...
665
+ </p>
666
+
667
+ </div>
668
+ <% end %>