tr8n 3.0.5 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. data/.gitignore +17 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +12 -6
  4. data/Gemfile.lock +143 -60
  5. data/MIT-LICENSE +20 -0
  6. data/Rakefile +39 -22
  7. data/{lib/tasks → app/assets/images/tr8n}/.gitkeep +0 -0
  8. data/{public/tr8n/images → app/assets/images/tr8n}/accept.png +0 -0
  9. data/{public/tr8n/images → app/assets/images/tr8n}/action_tab_bkgd.gif +0 -0
  10. data/{public/tr8n/images → app/assets/images/tr8n}/action_tab_white_bkgd.gif +0 -0
  11. data/{public/tr8n/images → app/assets/images/tr8n}/add.png +0 -0
  12. data/{public/tr8n/images → app/assets/images/tr8n}/arrow_down.gif +0 -0
  13. data/{public/tr8n/images → app/assets/images/tr8n}/arrow_down.png +0 -0
  14. data/{public/tr8n/images → app/assets/images/tr8n}/arrow_down_grey.png +0 -0
  15. data/{public/tr8n/images → app/assets/images/tr8n}/arrow_right.gif +0 -0
  16. data/{public/tr8n/images → app/assets/images/tr8n}/arrow_up.png +0 -0
  17. data/{public/tr8n/images → app/assets/images/tr8n}/arrow_up_grey.png +0 -0
  18. data/{public/tr8n/images → app/assets/images/tr8n}/bullet_go.png +0 -0
  19. data/{public/tr8n/images → app/assets/images/tr8n}/buttons.png +0 -0
  20. data/{public/tr8n/images → app/assets/images/tr8n}/cancel.png +0 -0
  21. data/app/assets/images/tr8n/checkmark.png +0 -0
  22. data/{public/tr8n/images → app/assets/images/tr8n}/close.gif +0 -0
  23. data/{public/tr8n/images → app/assets/images/tr8n}/cross.png +0 -0
  24. data/{public/tr8n/images → app/assets/images/tr8n}/delete.png +0 -0
  25. data/{public/tr8n/images → app/assets/images/tr8n}/disk.png +0 -0
  26. data/app/assets/images/tr8n/error.png +0 -0
  27. data/{public/tr8n/images → app/assets/images/tr8n}/examples/context_rules_1.png +0 -0
  28. data/{public/tr8n/images → app/assets/images/tr8n}/examples/context_rules_2.png +0 -0
  29. data/{public/tr8n/images → app/assets/images/tr8n}/examples/date_rules_1.png +0 -0
  30. data/{public/tr8n/images → app/assets/images/tr8n}/examples/date_rules_2.png +0 -0
  31. data/{public/tr8n/images → app/assets/images/tr8n}/examples/date_rules_3.png +0 -0
  32. data/{public/tr8n/images → app/assets/images/tr8n}/examples/gender_rules_1.png +0 -0
  33. data/{public/tr8n/images → app/assets/images/tr8n}/examples/gender_rules_2.png +0 -0
  34. data/{public/tr8n/images → app/assets/images/tr8n}/examples/gender_rules_3.png +0 -0
  35. data/{public/tr8n/images → app/assets/images/tr8n}/examples/language_manager_1.png +0 -0
  36. data/{public/tr8n/images → app/assets/images/tr8n}/examples/list_rules_1.png +0 -0
  37. data/{public/tr8n/images → app/assets/images/tr8n}/examples/list_rules_2.png +0 -0
  38. data/{public/tr8n/images → app/assets/images/tr8n}/examples/list_rules_3.png +0 -0
  39. data/{public/tr8n/images → app/assets/images/tr8n}/examples/numeric_rules_1.png +0 -0
  40. data/{public/tr8n/images → app/assets/images/tr8n}/examples/numeric_rules_2.png +0 -0
  41. data/{public/tr8n/images → app/assets/images/tr8n}/examples/numeric_rules_3.png +0 -0
  42. data/{public/tr8n/images → app/assets/images/tr8n}/examples/numeric_rules_4.png +0 -0
  43. data/{public/tr8n/images → app/assets/images/tr8n}/exclamation.png +0 -0
  44. data/{public/tr8n/images → app/assets/images/tr8n}/eye.png +0 -0
  45. data/{public/tr8n/images → app/assets/images/tr8n}/eye_not.png +0 -0
  46. data/{public/tr8n/images → app/assets/images/tr8n}/facebook/connect_light_medium_long.gif +0 -0
  47. data/{public/tr8n/images → app/assets/images/tr8n}/field_sprite.gif +0 -0
  48. data/{public/tr8n/images → app/assets/images/tr8n}/find.png +0 -0
  49. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ab.png +0 -0
  50. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ach.png +0 -0
  51. data/{public/tr8n/images → app/assets/images/tr8n}/flags/af.png +0 -0
  52. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ak.png +0 -0
  53. data/{public/tr8n/images → app/assets/images/tr8n}/flags/am.png +0 -0
  54. data/{public/tr8n/images → app/assets/images/tr8n}/flags/an.png +0 -0
  55. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-AE.png +0 -0
  56. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-BH.png +0 -0
  57. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-DZ.png +0 -0
  58. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-EG.png +0 -0
  59. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-IQ.png +0 -0
  60. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-JO.png +0 -0
  61. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-KW.png +0 -0
  62. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-LB.png +0 -0
  63. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-LY.png +0 -0
  64. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-MA.png +0 -0
  65. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-OM.png +0 -0
  66. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-QA.png +0 -0
  67. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-SA.png +0 -0
  68. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-SY.png +0 -0
  69. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-TN.png +0 -0
  70. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-YE.png +0 -0
  71. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar.png +0 -0
  72. data/{public/tr8n/images → app/assets/images/tr8n}/flags/as.png +0 -0
  73. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ast.png +0 -0
  74. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ay.png +0 -0
  75. data/{public/tr8n/images → app/assets/images/tr8n}/flags/az.png +0 -0
  76. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ba.png +0 -0
  77. data/{public/tr8n/images → app/assets/images/tr8n}/flags/be.png +0 -0
  78. data/{public/tr8n/images → app/assets/images/tr8n}/flags/bg.png +0 -0
  79. data/{public/tr8n/images → app/assets/images/tr8n}/flags/bh.png +0 -0
  80. data/{public/tr8n/images → app/assets/images/tr8n}/flags/bn.png +0 -0
  81. data/{public/tr8n/images → app/assets/images/tr8n}/flags/bo.png +0 -0
  82. data/{public/tr8n/images → app/assets/images/tr8n}/flags/br.png +0 -0
  83. data/{public/tr8n/images → app/assets/images/tr8n}/flags/bs.png +0 -0
  84. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ca.png +0 -0
  85. data/{public/tr8n/images → app/assets/images/tr8n}/flags/cb.png +0 -0
  86. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ce.png +0 -0
  87. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ch.png +0 -0
  88. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ck-US.png +0 -0
  89. data/{public/tr8n/images → app/assets/images/tr8n}/flags/co.png +0 -0
  90. data/{public/tr8n/images → app/assets/images/tr8n}/flags/cr.png +0 -0
  91. data/{public/tr8n/images → app/assets/images/tr8n}/flags/cs.png +0 -0
  92. data/{public/tr8n/images → app/assets/images/tr8n}/flags/cv.png +0 -0
  93. data/{public/tr8n/images → app/assets/images/tr8n}/flags/cy.png +0 -0
  94. data/{public/tr8n/images → app/assets/images/tr8n}/flags/da.png +0 -0
  95. data/{public/tr8n/images → app/assets/images/tr8n}/flags/de-AT.png +0 -0
  96. data/{public/tr8n/images → app/assets/images/tr8n}/flags/de-CH.png +0 -0
  97. data/{public/tr8n/images → app/assets/images/tr8n}/flags/de-DE.png +0 -0
  98. data/{public/tr8n/images → app/assets/images/tr8n}/flags/de-LI.png +0 -0
  99. data/{public/tr8n/images → app/assets/images/tr8n}/flags/de-LU.png +0 -0
  100. data/{public/tr8n/images → app/assets/images/tr8n}/flags/de.png +0 -0
  101. data/{public/tr8n/images → app/assets/images/tr8n}/flags/el.png +0 -0
  102. data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-AU.png +0 -0
  103. data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-BZ.png +0 -0
  104. data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-CA.png +0 -0
  105. data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-IE.png +0 -0
  106. data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-JM.png +0 -0
  107. data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-NZ.png +0 -0
  108. data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-PH.png +0 -0
  109. data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-PI.png +0 -0
  110. data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-SC.png +0 -0
  111. data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-UK.png +0 -0
  112. data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-US.png +0 -0
  113. data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-ZA.png +0 -0
  114. data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-ZW.png +0 -0
  115. data/{public/tr8n/images → app/assets/images/tr8n}/flags/en.png +0 -0
  116. data/{public/tr8n/images → app/assets/images/tr8n}/flags/eo.png +0 -0
  117. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-AR.png +0 -0
  118. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-BO.png +0 -0
  119. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-CL.png +0 -0
  120. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-CO.png +0 -0
  121. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-CR.png +0 -0
  122. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-DO.png +0 -0
  123. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-EC.png +0 -0
  124. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-ES.png +0 -0
  125. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-GT.png +0 -0
  126. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-HN.png +0 -0
  127. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-MX.png +0 -0
  128. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-NI.png +0 -0
  129. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-PA.png +0 -0
  130. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-PE.png +0 -0
  131. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-PR.png +0 -0
  132. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-PY.png +0 -0
  133. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-SV.png +0 -0
  134. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-UY.png +0 -0
  135. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-VE.png +0 -0
  136. data/{public/tr8n/images → app/assets/images/tr8n}/flags/es.png +0 -0
  137. data/{public/tr8n/images → app/assets/images/tr8n}/flags/et.png +0 -0
  138. data/{public/tr8n/images → app/assets/images/tr8n}/flags/eu.png +0 -0
  139. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fa-IR.png +0 -0
  140. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fa.png +0 -0
  141. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fb-LT.png +0 -0
  142. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fi.png +0 -0
  143. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fj.png +0 -0
  144. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fo.png +0 -0
  145. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fr-BE.png +0 -0
  146. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fr-CA.png +0 -0
  147. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fr-CH.png +0 -0
  148. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fr-FR.png +0 -0
  149. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fr-LU.png +0 -0
  150. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fr-MC.png +0 -0
  151. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fr.png +0 -0
  152. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fur.png +0 -0
  153. data/{public/tr8n/images → app/assets/images/tr8n}/flags/fy.png +0 -0
  154. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ga.png +0 -0
  155. data/{public/tr8n/images → app/assets/images/tr8n}/flags/gd.png +0 -0
  156. data/{public/tr8n/images → app/assets/images/tr8n}/flags/gl.png +0 -0
  157. data/{public/tr8n/images → app/assets/images/tr8n}/flags/gn.png +0 -0
  158. data/{public/tr8n/images → app/assets/images/tr8n}/flags/gu.png +0 -0
  159. data/{public/tr8n/images → app/assets/images/tr8n}/flags/gv.png +0 -0
  160. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ha.png +0 -0
  161. data/{public/tr8n/images → app/assets/images/tr8n}/flags/haw.png +0 -0
  162. data/{public/tr8n/images → app/assets/images/tr8n}/flags/he.png +0 -0
  163. data/{public/tr8n/images → app/assets/images/tr8n}/flags/hi.png +0 -0
  164. data/{public/tr8n/images → app/assets/images/tr8n}/flags/hr.png +0 -0
  165. data/{public/tr8n/images → app/assets/images/tr8n}/flags/hsb.png +0 -0
  166. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ht.png +0 -0
  167. data/{public/tr8n/images → app/assets/images/tr8n}/flags/hu.png +0 -0
  168. data/{public/tr8n/images → app/assets/images/tr8n}/flags/hy.png +0 -0
  169. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ia.png +0 -0
  170. data/{public/tr8n/images → app/assets/images/tr8n}/flags/id.png +0 -0
  171. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ie.png +0 -0
  172. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ig.png +0 -0
  173. data/{public/tr8n/images → app/assets/images/tr8n}/flags/is.png +0 -0
  174. data/{public/tr8n/images → app/assets/images/tr8n}/flags/it-CH.png +0 -0
  175. data/{public/tr8n/images → app/assets/images/tr8n}/flags/it.png +0 -0
  176. data/{public/tr8n/images → app/assets/images/tr8n}/flags/iu.png +0 -0
  177. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ja.png +0 -0
  178. data/{public/tr8n/images → app/assets/images/tr8n}/flags/jw.png +0 -0
  179. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ka.png +0 -0
  180. data/{public/tr8n/images → app/assets/images/tr8n}/flags/kk.png +0 -0
  181. data/{public/tr8n/images → app/assets/images/tr8n}/flags/kl.png +0 -0
  182. data/{public/tr8n/images → app/assets/images/tr8n}/flags/km.png +0 -0
  183. data/{public/tr8n/images → app/assets/images/tr8n}/flags/kn.png +0 -0
  184. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ko-KP.png +0 -0
  185. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ko-KR.png +0 -0
  186. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ko.png +0 -0
  187. data/{public/tr8n/images → app/assets/images/tr8n}/flags/kok.png +0 -0
  188. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ks.png +0 -0
  189. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ku.png +0 -0
  190. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ky.png +0 -0
  191. data/{public/tr8n/images → app/assets/images/tr8n}/flags/la.png +0 -0
  192. data/{public/tr8n/images → app/assets/images/tr8n}/flags/lb.png +0 -0
  193. data/{public/tr8n/images → app/assets/images/tr8n}/flags/lg.png +0 -0
  194. data/{public/tr8n/images → app/assets/images/tr8n}/flags/li-NL.png +0 -0
  195. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ln.png +0 -0
  196. data/{public/tr8n/images → app/assets/images/tr8n}/flags/lo.png +0 -0
  197. data/{public/tr8n/images → app/assets/images/tr8n}/flags/lt.png +0 -0
  198. data/{public/tr8n/images → app/assets/images/tr8n}/flags/lv.png +0 -0
  199. data/{public/tr8n/images → app/assets/images/tr8n}/flags/md.png +0 -0
  200. data/{public/tr8n/images → app/assets/images/tr8n}/flags/mfe.png +0 -0
  201. data/{public/tr8n/images → app/assets/images/tr8n}/flags/mg.png +0 -0
  202. data/{public/tr8n/images → app/assets/images/tr8n}/flags/mh.png +0 -0
  203. data/{public/tr8n/images → app/assets/images/tr8n}/flags/mi.png +0 -0
  204. data/{public/tr8n/images → app/assets/images/tr8n}/flags/mk.png +0 -0
  205. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ml.png +0 -0
  206. data/{public/tr8n/images → app/assets/images/tr8n}/flags/mn.png +0 -0
  207. data/{public/tr8n/images → app/assets/images/tr8n}/flags/mo.png +0 -0
  208. data/{public/tr8n/images → app/assets/images/tr8n}/flags/mr.png +0 -0
  209. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ms.png +0 -0
  210. data/{public/tr8n/images → app/assets/images/tr8n}/flags/mt.png +0 -0
  211. data/{public/tr8n/images → app/assets/images/tr8n}/flags/my.png +0 -0
  212. data/{public/tr8n/images → app/assets/images/tr8n}/flags/na.png +0 -0
  213. data/{public/tr8n/images → app/assets/images/tr8n}/flags/nb.png +0 -0
  214. data/{public/tr8n/images → app/assets/images/tr8n}/flags/nd.png +0 -0
  215. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ne.png +0 -0
  216. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ng.png +0 -0
  217. data/{public/tr8n/images → app/assets/images/tr8n}/flags/nl-NE.png +0 -0
  218. data/{public/tr8n/images → app/assets/images/tr8n}/flags/nl.png +0 -0
  219. data/{public/tr8n/images → app/assets/images/tr8n}/flags/nn.png +0 -0
  220. data/{public/tr8n/images → app/assets/images/tr8n}/flags/no.png +0 -0
  221. data/{public/tr8n/images → app/assets/images/tr8n}/flags/nr.png +0 -0
  222. data/{public/tr8n/images → app/assets/images/tr8n}/flags/nso.png +0 -0
  223. data/{public/tr8n/images → app/assets/images/tr8n}/flags/nv.png +0 -0
  224. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ny.png +0 -0
  225. data/{public/tr8n/images → app/assets/images/tr8n}/flags/nyn.png +0 -0
  226. data/{public/tr8n/images → app/assets/images/tr8n}/flags/oc.png +0 -0
  227. data/{public/tr8n/images → app/assets/images/tr8n}/flags/om.png +0 -0
  228. data/{public/tr8n/images → app/assets/images/tr8n}/flags/or.png +0 -0
  229. data/{public/tr8n/images → app/assets/images/tr8n}/flags/pa-IN.png +0 -0
  230. data/{public/tr8n/images → app/assets/images/tr8n}/flags/pa-PK.png +0 -0
  231. data/{public/tr8n/images → app/assets/images/tr8n}/flags/pa.png +0 -0
  232. data/{public/tr8n/images → app/assets/images/tr8n}/flags/pf.png +0 -0
  233. data/{public/tr8n/images → app/assets/images/tr8n}/flags/pl.png +0 -0
  234. data/{public/tr8n/images → app/assets/images/tr8n}/flags/pp.png +0 -0
  235. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ps.png +0 -0
  236. data/{public/tr8n/images → app/assets/images/tr8n}/flags/pt-BZ.png +0 -0
  237. data/{public/tr8n/images → app/assets/images/tr8n}/flags/pt.png +0 -0
  238. data/{public/tr8n/images → app/assets/images/tr8n}/flags/qu-PE.png +0 -0
  239. data/{public/tr8n/images → app/assets/images/tr8n}/flags/qu.png +0 -0
  240. data/{public/tr8n/images → app/assets/images/tr8n}/flags/rj.png +0 -0
  241. data/{public/tr8n/images → app/assets/images/tr8n}/flags/rm.png +0 -0
  242. data/{public/tr8n/images → app/assets/images/tr8n}/flags/rn.png +0 -0
  243. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ro-MD.png +0 -0
  244. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ro-RO.png +0 -0
  245. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ro.png +0 -0
  246. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ru.png +0 -0
  247. data/{public/tr8n/images → app/assets/images/tr8n}/flags/rw.png +0 -0
  248. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sa.png +0 -0
  249. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sc.png +0 -0
  250. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sd.png +0 -0
  251. data/{public/tr8n/images → app/assets/images/tr8n}/flags/se-NO.png +0 -0
  252. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sg.png +0 -0
  253. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sh.png +0 -0
  254. data/{public/tr8n/images → app/assets/images/tr8n}/flags/si.png +0 -0
  255. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sk.png +0 -0
  256. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sl.png +0 -0
  257. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sm.png +0 -0
  258. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sn.png +0 -0
  259. data/{public/tr8n/images → app/assets/images/tr8n}/flags/so.png +0 -0
  260. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sq.png +0 -0
  261. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sr-me.png +0 -0
  262. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sr.png +0 -0
  263. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ss.png +0 -0
  264. data/{public/tr8n/images → app/assets/images/tr8n}/flags/st.png +0 -0
  265. data/{public/tr8n/images → app/assets/images/tr8n}/flags/su.png +0 -0
  266. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sv-FI.png +0 -0
  267. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sv-SE.png +0 -0
  268. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sv.png +0 -0
  269. data/{public/tr8n/images → app/assets/images/tr8n}/flags/sw.png +0 -0
  270. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ta.png +0 -0
  271. data/{public/tr8n/images → app/assets/images/tr8n}/flags/te.png +0 -0
  272. data/{public/tr8n/images → app/assets/images/tr8n}/flags/tg.png +0 -0
  273. data/{public/tr8n/images → app/assets/images/tr8n}/flags/th.png +0 -0
  274. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ti.png +0 -0
  275. data/{public/tr8n/images → app/assets/images/tr8n}/flags/tig.png +0 -0
  276. data/{public/tr8n/images → app/assets/images/tr8n}/flags/tk.png +0 -0
  277. data/{public/tr8n/images → app/assets/images/tr8n}/flags/tl.png +0 -0
  278. data/{public/tr8n/images → app/assets/images/tr8n}/flags/tlh.png +0 -0
  279. data/{public/tr8n/images → app/assets/images/tr8n}/flags/tn.png +0 -0
  280. data/{public/tr8n/images → app/assets/images/tr8n}/flags/to.png +0 -0
  281. data/{public/tr8n/images → app/assets/images/tr8n}/flags/tr.png +0 -0
  282. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ts.png +0 -0
  283. data/{public/tr8n/images → app/assets/images/tr8n}/flags/tt.png +0 -0
  284. data/{public/tr8n/images → app/assets/images/tr8n}/flags/tw.png +0 -0
  285. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ug.png +0 -0
  286. data/{public/tr8n/images → app/assets/images/tr8n}/flags/uk.png +0 -0
  287. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ur.png +0 -0
  288. data/{public/tr8n/images → app/assets/images/tr8n}/flags/uz.png +0 -0
  289. data/{public/tr8n/images → app/assets/images/tr8n}/flags/ve.png +0 -0
  290. data/{public/tr8n/images → app/assets/images/tr8n}/flags/vi.png +0 -0
  291. data/{public/tr8n/images → app/assets/images/tr8n}/flags/vo.png +0 -0
  292. data/{public/tr8n/images → app/assets/images/tr8n}/flags/wa.png +0 -0
  293. data/{public/tr8n/images → app/assets/images/tr8n}/flags/wo.png +0 -0
  294. data/{public/tr8n/images → app/assets/images/tr8n}/flags/xh.png +0 -0
  295. data/{public/tr8n/images → app/assets/images/tr8n}/flags/yi.png +0 -0
  296. data/{public/tr8n/images → app/assets/images/tr8n}/flags/yo.png +0 -0
  297. data/{public/tr8n/images → app/assets/images/tr8n}/flags/zh-CN.png +0 -0
  298. data/{public/tr8n/images → app/assets/images/tr8n}/flags/zh-HK.png +0 -0
  299. data/{public/tr8n/images → app/assets/images/tr8n}/flags/zh-SG.png +0 -0
  300. data/{public/tr8n/images → app/assets/images/tr8n}/flags/zh-TW.png +0 -0
  301. data/{public/tr8n/images → app/assets/images/tr8n}/flags/zh.png +0 -0
  302. data/{public/tr8n/images → app/assets/images/tr8n}/flags/zu.png +0 -0
  303. data/{public/tr8n/images → app/assets/images/tr8n}/globe.gif +0 -0
  304. data/{public/tr8n/images → app/assets/images/tr8n}/help.png +0 -0
  305. data/{public/tr8n/images → app/assets/images/tr8n}/help/color_coding.png +0 -0
  306. data/app/assets/images/tr8n/help/cousin.png +0 -0
  307. data/app/assets/images/tr8n/help/half-cousin.png +0 -0
  308. data/app/assets/images/tr8n/help/hindu_family_tree.jpg +0 -0
  309. data/{public/tr8n/images → app/assets/images/tr8n}/help/language_selector.png +0 -0
  310. data/{public/tr8n/images → app/assets/images/tr8n}/help/language_selector_default.png +0 -0
  311. data/app/assets/images/tr8n/help/language_selector_v2.png +0 -0
  312. data/{public/tr8n/images → app/assets/images/tr8n}/help/languages_disabled.png +0 -0
  313. data/app/assets/images/tr8n/help/path.png +0 -0
  314. data/{public/tr8n/images → app/assets/images/tr8n}/help/translator.png +0 -0
  315. data/{public/tr8n/images → app/assets/images/tr8n}/help2.png +0 -0
  316. data/{public/tr8n/images → app/assets/images/tr8n}/information.png +0 -0
  317. data/{public/tr8n/images → app/assets/images/tr8n}/keyboard.png +0 -0
  318. data/{public/tr8n/images → app/assets/images/tr8n}/language_selector_arrow.gif +0 -0
  319. data/{public/tr8n/images → app/assets/images/tr8n}/left_quote.png +0 -0
  320. data/{public/tr8n/images → app/assets/images/tr8n}/lightning.png +0 -0
  321. data/{public/tr8n/images → app/assets/images/tr8n}/loading.gif +0 -0
  322. data/{public/tr8n/images → app/assets/images/tr8n}/loading2.gif +0 -0
  323. data/{public/tr8n/images → app/assets/images/tr8n}/loading3.gif +0 -0
  324. data/{public/tr8n/images → app/assets/images/tr8n}/loading_large.gif +0 -0
  325. data/{public/tr8n/images → app/assets/images/tr8n}/lock.png +0 -0
  326. data/{public/tr8n/images → app/assets/images/tr8n}/lock_add.png +0 -0
  327. data/{public/tr8n/images → app/assets/images/tr8n}/lock_delete.png +0 -0
  328. data/{public/tr8n/images → app/assets/images/tr8n}/lock_open.png +0 -0
  329. data/{public/tr8n/images → app/assets/images/tr8n}/medals/bronze.png +0 -0
  330. data/{public/tr8n/images → app/assets/images/tr8n}/medals/gold.png +0 -0
  331. data/{public/tr8n/images → app/assets/images/tr8n}/medals/runner.png +0 -0
  332. data/{public/tr8n/images → app/assets/images/tr8n}/medals/silver.png +0 -0
  333. data/{public/tr8n/images → app/assets/images/tr8n}/pencil.png +0 -0
  334. data/{public/tr8n/images → app/assets/images/tr8n}/photo_silhouette.gif +0 -0
  335. data/{public/tr8n/images → app/assets/images/tr8n}/plus.png +0 -0
  336. data/{public/tr8n/images → app/assets/images/tr8n}/random.png +0 -0
  337. data/{public/tr8n/images → app/assets/images/tr8n}/random2.png +0 -0
  338. data/{public/tr8n/images → app/assets/images/tr8n}/rating_star0.png +0 -0
  339. data/{public/tr8n/images → app/assets/images/tr8n}/rating_star05.png +0 -0
  340. data/{public/tr8n/images → app/assets/images/tr8n}/rating_star1.png +0 -0
  341. data/{public/tr8n/images → app/assets/images/tr8n}/rating_stars.gif +0 -0
  342. data/{public/tr8n/images → app/assets/images/tr8n}/rating_stars.psd +0 -0
  343. data/{public/tr8n/images → app/assets/images/tr8n}/reply.png +0 -0
  344. data/{public/tr8n/images → app/assets/images/tr8n}/right_quote.png +0 -0
  345. data/{public/tr8n/images → app/assets/images/tr8n}/rotating_world.gif +0 -0
  346. data/{public/tr8n/images → app/assets/images/tr8n}/script.png +0 -0
  347. data/{public/tr8n/images → app/assets/images/tr8n}/script_edit.png +0 -0
  348. data/{public/tr8n/images → app/assets/images/tr8n}/script_gear.png +0 -0
  349. data/{public/tr8n/images → app/assets/images/tr8n}/site_sprite.gif +0 -0
  350. data/{public/tr8n/images → app/assets/images/tr8n}/spinner.gif +0 -0
  351. data/{public/tr8n/images → app/assets/images/tr8n}/star.png +0 -0
  352. data/{public/tr8n/images → app/assets/images/tr8n}/table_edit.png +0 -0
  353. data/{public/tr8n/images → app/assets/images/tr8n}/table_gear.png +0 -0
  354. data/{public/tr8n/images → app/assets/images/tr8n}/table_multiple.png +0 -0
  355. data/{public/tr8n/images → app/assets/images/tr8n}/thumb_down.png +0 -0
  356. data/{public/tr8n/images → app/assets/images/tr8n}/thumb_up.png +0 -0
  357. data/{public/tr8n/images → app/assets/images/tr8n}/toolbar_bg.gif +0 -0
  358. data/{public/tr8n/images → app/assets/images/tr8n}/top_left_stem.png +0 -0
  359. data/{public/tr8n/images → app/assets/images/tr8n}/top_right_stem.png +0 -0
  360. data/{public/tr8n/images → app/assets/images/tr8n}/tr8n_loading.gif +0 -0
  361. data/{public/tr8n/images → app/assets/images/tr8n}/tr8n_logo.jpg +0 -0
  362. data/{public/tr8n/images → app/assets/images/tr8n}/tr8n_logo.png +0 -0
  363. data/{public/tr8n/images → app/assets/images/tr8n}/tr8n_logo2.gif +0 -0
  364. data/{public/tr8n/images → app/assets/images/tr8n}/tr8n_logo2.png +0 -0
  365. data/{public/tr8n/images → app/assets/images/tr8n}/tr8n_logo_wiki.png +0 -0
  366. data/{public/tr8n/images → app/assets/images/tr8n}/tr8n_logo_wiki2.png +0 -0
  367. data/{public/tr8n/images → app/assets/images/tr8n}/translate_icn.gif +0 -0
  368. data/app/assets/images/tr8n/warning.png +0 -0
  369. data/{public/tr8n/images → app/assets/images/tr8n}/wizard.png +0 -0
  370. data/app/assets/javascripts/tr8n/application.js +7 -0
  371. data/{public/tr8n/javascripts → app/assets/javascripts/tr8n}/jsDraw2D.js +0 -0
  372. data/{public/tr8n/javascripts → app/assets/javascripts/tr8n}/keyboard_1_36.js +1 -1
  373. data/{public/tr8n/javascripts → app/assets/javascripts/tr8n}/keyboard_1_44.js +0 -0
  374. data/{public/tr8n/javascripts → app/assets/javascripts/tr8n}/shortcut.js +0 -0
  375. data/{public/tr8n/javascripts → app/assets/javascripts/tr8n}/tr8n.js +18 -30
  376. data/{public/tr8n/javascripts → app/assets/javascripts/tr8n}/tr8n_client_sdk.js +0 -0
  377. data/{public/tr8n/javascripts → app/assets/javascripts/tr8n}/tr8n_prototype_effects.js +1 -1
  378. data/app/assets/stylesheets/tr8n/application.css +6 -0
  379. data/{public/tr8n/stylesheets → app/assets/stylesheets/tr8n}/keyboard_1_36.css +0 -0
  380. data/{public/tr8n/stylesheets → app/assets/stylesheets/tr8n}/keyboard_1_44.css +0 -0
  381. data/{public/tr8n/stylesheets/tr8n.css → app/assets/stylesheets/tr8n/tr8n.css.scss} +272 -37
  382. data/app/controllers/{application_controller.rb → tr8n/application_controller.rb} +3 -4
  383. data/app/controllers/tr8n/awards_controller.rb +2 -4
  384. data/app/controllers/tr8n/dashboard_controller.rb +6 -5
  385. data/app/controllers/tr8n/forum_controller.rb +2 -2
  386. data/app/controllers/tr8n/glossary_controller.rb +3 -9
  387. data/app/controllers/tr8n/home_controller.rb +1 -1
  388. data/app/controllers/tr8n/language_controller.rb +276 -270
  389. data/app/controllers/tr8n/phrases_controller.rb +9 -19
  390. data/app/controllers/tr8n/translations_controller.rb +1 -2
  391. data/app/helpers/tr8n/admin/base_helper.rb +1 -1
  392. data/app/helpers/{application_helper.rb → tr8n/application_helper.rb} +3 -2
  393. data/app/helpers/tr8n/base_helper.rb +5 -1
  394. data/app/models/tr8n/language.rb +1 -0
  395. data/app/models/tr8n/language_case_filter.rb +1 -1
  396. data/app/models/tr8n/language_case_rule_filter.rb +1 -1
  397. data/app/models/tr8n/language_case_value_map_filter.rb +4 -0
  398. data/app/models/tr8n/language_forum_abuse_report_filter.rb +4 -0
  399. data/app/models/tr8n/language_forum_message_filter.rb +4 -0
  400. data/app/models/tr8n/language_forum_topic_filter.rb +4 -0
  401. data/app/models/tr8n/language_metric.rb +1 -1
  402. data/app/models/tr8n/language_metric_filter.rb +4 -0
  403. data/app/models/tr8n/language_rule_filter.rb +7 -3
  404. data/app/models/tr8n/language_user_filter.rb +4 -4
  405. data/app/models/tr8n/translation.rb +12 -33
  406. data/app/models/tr8n/translation_filter.rb +4 -4
  407. data/app/models/tr8n/translation_key.rb +32 -55
  408. data/app/models/tr8n/translation_key_comment_filter.rb +1 -1
  409. data/app/models/tr8n/translation_key_lock_filter.rb +1 -1
  410. data/app/models/tr8n/translation_key_source_filter.rb +1 -1
  411. data/app/models/tr8n/translation_source_filter.rb +1 -1
  412. data/app/models/tr8n/translation_vote_filter.rb +4 -4
  413. data/app/models/tr8n/translator_filter.rb +4 -0
  414. data/app/models/tr8n/translator_following_filter.rb +4 -4
  415. data/app/models/tr8n/translator_log_filter.rb +4 -4
  416. data/app/models/tr8n/translator_metric_filter.rb +4 -4
  417. data/app/models/tr8n/translator_report_filter.rb +1 -1
  418. data/app/views/layouts/tr8n/application.html.erb +14 -0
  419. data/app/views/tr8n/admin/clientsdk/lb_samples.html.erb +31 -29
  420. data/app/views/tr8n/admin/common/_lightbox_buttons.html.erb +1 -1
  421. data/app/views/tr8n/admin/domain/index.html.erb +1 -1
  422. data/app/views/tr8n/admin/domain/{key_sources.rhtml → key_sources.html.erb} +1 -1
  423. data/app/views/tr8n/admin/domain/lb_caller.html.erb +39 -35
  424. data/app/views/tr8n/admin/domain/sources.html.erb +1 -1
  425. data/app/views/tr8n/admin/glossary/lb_update.html.erb +33 -26
  426. data/app/views/tr8n/admin/language/index.html.erb +3 -3
  427. data/app/views/tr8n/admin/language/lb_update.html.erb +86 -76
  428. data/app/views/tr8n/admin/language/lb_value_map.html.erb +45 -41
  429. data/app/views/tr8n/admin/language/{metrics.rhtml → metrics.html.erb} +0 -0
  430. data/app/views/tr8n/admin/language/{users.rhtml → users.html.erb} +0 -0
  431. data/app/views/tr8n/admin/translation/{votes.rhtml → votes.html.erb} +0 -0
  432. data/app/views/tr8n/admin/translation_key/comments.html.erb +1 -1
  433. data/app/views/tr8n/admin/translation_key/index.html.erb +1 -1
  434. data/app/views/tr8n/admin/translation_key/lb_merge.html.erb +15 -3
  435. data/app/views/tr8n/admin/translation_key/lb_update.html.erb +54 -44
  436. data/app/views/tr8n/admin/translation_key/locks.html.erb +1 -1
  437. data/app/views/tr8n/admin/translator/lb_register.html.erb +27 -18
  438. data/app/views/tr8n/awards/_list.html.erb +11 -11
  439. data/app/views/tr8n/awards/index.html.erb +1 -1
  440. data/app/views/tr8n/common/_flashes.html.erb +58 -16
  441. data/app/views/tr8n/common/_language_selector.html.erb +10 -6
  442. data/app/views/tr8n/common/_paginator.html.erb +8 -2
  443. data/app/views/tr8n/common/_scripts.html.erb +6 -5
  444. data/app/views/tr8n/common/_splash_screen.html.erb +2 -2
  445. data/app/views/tr8n/common/_translation_votes.html.erb +5 -5
  446. data/app/views/tr8n/dashboard/_forum.html.erb +13 -11
  447. data/app/views/tr8n/dashboard/_language_metric.html.erb +1 -1
  448. data/app/views/tr8n/dashboard/_translations.html.erb +1 -10
  449. data/app/views/tr8n/dashboard/_translator_metric.html.erb +1 -1
  450. data/app/views/tr8n/dashboard/_votes.html.erb +4 -13
  451. data/app/views/tr8n/dashboard/{index.rhtml → index.html.erb} +3 -3
  452. data/app/views/tr8n/forum/_messages.html.erb +2 -9
  453. data/app/views/tr8n/forum/_new_message.html.erb +1 -1
  454. data/app/views/tr8n/forum/_new_topic.html.erb +1 -1
  455. data/app/views/tr8n/forum/index.html.erb +3 -10
  456. data/app/views/tr8n/forum/topic.html.erb +2 -2
  457. data/app/views/tr8n/glossary/index.html.erb +2 -2
  458. data/app/views/tr8n/help/_footer.html.erb +4 -0
  459. data/app/views/tr8n/help/_header.html.erb +106 -0
  460. data/app/views/tr8n/help/_navigation.html.erb +80 -116
  461. data/app/views/tr8n/help/advanced_tools.html.erb +13 -0
  462. data/app/views/tr8n/help/awards.html.erb +8 -8
  463. data/app/views/tr8n/help/creating_translations.html.erb +19 -9
  464. data/app/views/tr8n/help/dashboard.html.erb +34 -7
  465. data/app/views/tr8n/help/discussions.html.erb +8 -8
  466. data/app/views/tr8n/help/help.html.erb +14 -0
  467. data/app/views/tr8n/help/index.html.erb +15 -10
  468. data/app/views/tr8n/help/inline_translator.html.erb +59 -0
  469. data/app/views/tr8n/help/language_selector.html.erb +46 -6
  470. data/app/views/tr8n/help/management.html.erb +42 -0
  471. data/app/views/tr8n/help/phrases.html.erb +12 -13
  472. data/app/views/tr8n/help/{translation_rank.html.erb → ranks.html.erb} +20 -10
  473. data/app/views/tr8n/help/relationships.html.erb +14 -0
  474. data/app/views/tr8n/help/site_map.html.erb +18 -11
  475. data/app/views/tr8n/help/translations.html.erb +8 -8
  476. data/app/views/tr8n/help/voting_on_translations.html.erb +8 -8
  477. data/app/views/tr8n/home/credits.html.erb +1 -2
  478. data/app/views/tr8n/home/index.html.erb +43 -31
  479. data/app/views/tr8n/language/_basic_info.html.erb +1 -1
  480. data/app/views/tr8n/language/_edit_language_case_rules.html.erb +7 -7
  481. data/app/views/tr8n/language/_edit_language_cases.html.erb +2 -2
  482. data/app/views/tr8n/language/_edit_rules.html.erb +2 -2
  483. data/app/views/tr8n/language/_grammar.html.erb +1 -1
  484. data/app/views/tr8n/language/_header.html.erb +3 -3
  485. data/app/views/tr8n/language/_language_cases.html.erb +2 -2
  486. data/app/views/tr8n/language/_lists.html.erb +3 -3
  487. data/app/views/tr8n/language/_prohibited_words.html.erb +1 -1
  488. data/app/views/tr8n/language/_select.html.erb +106 -0
  489. data/app/views/tr8n/language/_translator_header.html.erb +2 -2
  490. data/app/views/tr8n/language/_translator_submit.html.erb +2 -2
  491. data/app/views/tr8n/language/lb_language_case_rule.html.erb +45 -39
  492. data/app/views/tr8n/language/select.html.erb +3 -3
  493. data/app/views/tr8n/language/translator.html.erb +2 -2
  494. data/app/views/tr8n/phrases/_breadcrumb.html.erb +1 -1
  495. data/app/views/tr8n/phrases/_comments_module.html.erb +19 -26
  496. data/app/views/tr8n/phrases/{_dictionary.rhtml → _dictionary.html.erb} +0 -0
  497. data/app/views/tr8n/phrases/_header.html.erb +5 -5
  498. data/app/views/tr8n/phrases/_new_comment.html.erb +1 -1
  499. data/app/views/tr8n/phrases/_permutations_module.html.erb +2 -2
  500. data/app/views/tr8n/phrases/_tokens.html.erb +1 -1
  501. data/app/views/tr8n/phrases/_toolbar.html.erb +10 -10
  502. data/app/views/tr8n/phrases/_translation_module.html.erb +4 -4
  503. data/app/views/tr8n/phrases/_translations_module.html.erb +2 -2
  504. data/app/views/tr8n/phrases/index.html.erb +4 -4
  505. data/app/views/tr8n/phrases/lb_sources.html.erb +8 -12
  506. data/app/views/tr8n/phrases/map.html.erb +1 -1
  507. data/app/views/tr8n/translations/_translation.html.erb +10 -10
  508. data/app/views/tr8n/translations/index.html.erb +2 -2
  509. data/app/views/tr8n/translator/_basic_info.html.erb +1 -1
  510. data/app/views/tr8n/translator/_header.html.erb +3 -3
  511. data/app/views/tr8n/translator/_header_key_report.html.erb +1 -1
  512. data/app/views/tr8n/translator/lb_report.html.erb +82 -73
  513. data/config/routes.rb +8 -8
  514. data/lib/tasks/tr8n_tasks.rake +0 -11
  515. data/lib/tr8n.rb +3 -1
  516. data/lib/tr8n/active_dumper.rb +19 -17
  517. data/lib/tr8n/cache.rb +27 -25
  518. data/lib/tr8n/config.rb +558 -556
  519. data/lib/tr8n/dictionary.rb +21 -19
  520. data/lib/tr8n/engine.rb +24 -25
  521. data/lib/tr8n/exception.rb +4 -2
  522. data/lib/tr8n/extender.rb +11 -9
  523. data/lib/tr8n/extensions/action_controller_extension.rb +158 -0
  524. data/lib/tr8n/extensions/action_view_extension.rb +395 -0
  525. data/lib/{core_ext/array.rb → tr8n/extensions/array_extension.rb} +0 -0
  526. data/lib/{core_ext/date.rb → tr8n/extensions/date_extension.rb} +0 -0
  527. data/lib/{core_ext/fixnum.rb → tr8n/extensions/fixnum_extension.rb} +0 -0
  528. data/lib/{core_ext/hash.rb → tr8n/extensions/hash_extension.rb} +0 -0
  529. data/lib/{core_ext/string.rb → tr8n/extensions/string_extension.rb} +0 -0
  530. data/lib/{core_ext/time.rb → tr8n/extensions/time_extension.rb} +0 -0
  531. data/lib/tr8n/ip_address.rb +26 -24
  532. data/lib/tr8n/key_registration_exception.rb +3 -1
  533. data/lib/tr8n/keyboard_mapping.rb +147 -145
  534. data/lib/tr8n/logger.rb +30 -28
  535. data/lib/{application_controller.rb → tr8n/railtie.rb} +28 -10
  536. data/lib/tr8n/site_map.rb +48 -46
  537. data/lib/tr8n/site_map_section.rb +69 -67
  538. data/lib/tr8n/token.rb +330 -328
  539. data/lib/tr8n/token_exception.rb +3 -2
  540. data/lib/tr8n/tokenized_label.rb +90 -88
  541. data/lib/tr8n/version.rb +3 -0
  542. data/script/rails +3 -3
  543. data/test/dummy/.sass-cache/32be4db30d38349a3a6e662df9bb5599dc8033b9/actions.css.scssc +0 -0
  544. data/test/dummy/.sass-cache/32be4db30d38349a3a6e662df9bb5599dc8033b9/buttons.css.scssc +0 -0
  545. data/test/dummy/.sass-cache/32be4db30d38349a3a6e662df9bb5599dc8033b9/calendar.css.scssc +0 -0
  546. data/test/dummy/.sass-cache/32be4db30d38349a3a6e662df9bb5599dc8033b9/exporter.css.scssc +0 -0
  547. data/test/dummy/.sass-cache/32be4db30d38349a3a6e662df9bb5599dc8033b9/filter.css.scssc +0 -0
  548. data/test/dummy/.sass-cache/32be4db30d38349a3a6e662df9bb5599dc8033b9/results.css.scssc +0 -0
  549. data/test/dummy/.sass-cache/3d45bab40fcae805deb2750a9342f5b355a9f2bf/components.css.scssc +0 -0
  550. data/test/dummy/.sass-cache/3d45bab40fcae805deb2750a9342f5b355a9f2bf/layout.css.scssc +0 -0
  551. data/test/dummy/.sass-cache/50f723c1dd802042d0091035528d53e6d5bc5b50/tr8n.css.scssc +0 -0
  552. data/test/dummy/.sass-cache/bce64928c8e2edcba72a647a44f05af1ff119c5d/actions.css.scssc +0 -0
  553. data/test/dummy/.sass-cache/bce64928c8e2edcba72a647a44f05af1ff119c5d/buttons.css.scssc +0 -0
  554. data/test/dummy/.sass-cache/bce64928c8e2edcba72a647a44f05af1ff119c5d/calendar.css.scssc +0 -0
  555. data/test/dummy/.sass-cache/bce64928c8e2edcba72a647a44f05af1ff119c5d/exporter.css.scssc +0 -0
  556. data/test/dummy/.sass-cache/bce64928c8e2edcba72a647a44f05af1ff119c5d/filter.css.scssc +0 -0
  557. data/test/dummy/.sass-cache/bce64928c8e2edcba72a647a44f05af1ff119c5d/results.css.scssc +0 -0
  558. data/test/dummy/Rakefile +7 -0
  559. data/test/dummy/app/assets/javascripts/application.js +7 -0
  560. data/test/dummy/app/assets/stylesheets/admin.css +200 -0
  561. data/test/dummy/app/assets/stylesheets/application.css +47 -0
  562. data/{public/tr8n/stylesheets/components.css → test/dummy/app/assets/stylesheets/components.css.scss} +5 -2
  563. data/test/dummy/app/assets/stylesheets/keyboard.css +147 -0
  564. data/{public/tr8n/stylesheets/layout.css → test/dummy/app/assets/stylesheets/layout.css.scss} +27 -3
  565. data/test/dummy/app/controllers/admin/admins_controller.rb +7 -0
  566. data/test/dummy/app/controllers/admin/base_controller.rb +12 -0
  567. data/test/dummy/app/controllers/admin/users_controller.rb +19 -0
  568. data/test/dummy/app/controllers/application_controller.rb +26 -0
  569. data/test/dummy/app/controllers/demo_controller.rb +7 -0
  570. data/test/dummy/app/controllers/login_controller.rb +58 -0
  571. data/test/dummy/app/helpers/application_helper.rb +9 -0
  572. data/test/dummy/app/helpers/home_helper.rb +2 -0
  573. data/{public/favicon.ico → test/dummy/app/mailers/.gitkeep} +0 -0
  574. data/test/dummy/app/models/.gitkeep +0 -0
  575. data/test/dummy/app/models/admin.rb +4 -0
  576. data/test/dummy/app/models/admin_filter.rb +9 -0
  577. data/test/dummy/app/models/user.rb +31 -0
  578. data/test/dummy/app/views/admin/admins/index.html.erb +7 -0
  579. data/test/dummy/app/views/admin/users/index.html.erb +10 -0
  580. data/test/dummy/app/views/demo/index.rhtml +108 -0
  581. data/test/dummy/app/views/demo/tokens.rhtml +35 -0
  582. data/test/dummy/app/views/layouts/_flashes.html.erb +86 -0
  583. data/test/dummy/app/views/layouts/_footer.html.erb +17 -0
  584. data/test/dummy/app/views/layouts/_header.html.erb +23 -0
  585. data/test/dummy/app/views/layouts/admin.html.erb +94 -0
  586. data/test/dummy/app/views/layouts/application.html.erb +25 -0
  587. data/test/dummy/app/views/login/index.html.erb +32 -0
  588. data/test/dummy/app/views/login/register.html.erb +61 -0
  589. data/{config.ru → test/dummy/config.ru} +1 -1
  590. data/test/dummy/config/application.rb +47 -0
  591. data/test/dummy/config/boot.rb +10 -0
  592. data/test/dummy/config/database.yml +25 -0
  593. data/test/dummy/config/environment.rb +5 -0
  594. data/{config → test/dummy/config}/environments/development.rb +8 -3
  595. data/test/dummy/config/environments/production.rb +60 -0
  596. data/{config → test/dummy/config}/environments/test.rb +9 -2
  597. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  598. data/test/dummy/config/initializers/inflections.rb +10 -0
  599. data/test/dummy/config/initializers/mime_types.rb +5 -0
  600. data/test/dummy/config/initializers/secret_token.rb +7 -0
  601. data/test/dummy/config/initializers/session_store.rb +8 -0
  602. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  603. data/test/dummy/config/locales/en.yml +5 -0
  604. data/test/dummy/config/routes.rb +16 -0
  605. data/test/dummy/config/tr8n/config.yml +247 -0
  606. data/test/dummy/config/tr8n/data/ip_locations.csv +93460 -0
  607. data/test/dummy/config/tr8n/rules/default_cases.yml +141 -0
  608. data/test/dummy/config/tr8n/rules/default_date_rules.yml +20 -0
  609. data/test/dummy/config/tr8n/rules/default_gender_list_rules.yml +82 -0
  610. data/test/dummy/config/tr8n/rules/default_gender_rules.yml +20 -0
  611. data/test/dummy/config/tr8n/rules/default_list_rules.yml +19 -0
  612. data/test/dummy/config/tr8n/rules/default_numeric_rules.yml +42 -0
  613. data/test/dummy/config/tr8n/rules/default_value_rules.yml +18 -0
  614. data/test/dummy/config/tr8n/site/default_glossary.yml +18 -0
  615. data/test/dummy/config/tr8n/site/default_languages.yml +1591 -0
  616. data/test/dummy/config/tr8n/site/features.yml +111 -0
  617. data/test/dummy/config/tr8n/site/shortcuts.yml +55 -0
  618. data/test/dummy/config/tr8n/site/sitemap.json +42 -0
  619. data/test/dummy/config/tr8n/tokens/data.yml +19 -0
  620. data/test/dummy/config/tr8n/tokens/decorations.yml +16 -0
  621. data/{config → test/dummy/config}/will_filter/config.yml +0 -0
  622. data/test/dummy/db/migrate/20101207014543_create_users.rb +23 -0
  623. data/test/dummy/db/migrate/20110113223509_create_admins.rb +15 -0
  624. data/test/dummy/db/migrate/20110930041143_create_will_filter_filters.rb +15 -0
  625. data/test/dummy/db/migrate/20110930041150_create_tr8n_tables.rb +350 -0
  626. data/test/dummy/db/schema.rb +398 -0
  627. data/test/dummy/lib/assets/.gitkeep +0 -0
  628. data/test/dummy/log/.gitkeep +0 -0
  629. data/{public → test/dummy/public}/404.html +0 -0
  630. data/{public → test/dummy/public}/422.html +0 -0
  631. data/{public → test/dummy/public}/500.html +0 -0
  632. data/test/dummy/public/favicon.ico +0 -0
  633. data/test/dummy/script/rails +6 -0
  634. data/test/dummy/test/functional/home_controller_test.rb +9 -0
  635. data/test/dummy/test/unit/helpers/home_helper_test.rb +4 -0
  636. data/test/integration/navigation_test.rb +10 -0
  637. data/test/test_helper.rb +7 -10
  638. data/test/tr8n_test.rb +7 -0
  639. data/tr8n.gemspec +33 -34
  640. metadata +772 -536
  641. data/.project +0 -18
  642. data/LICENSE +0 -18
  643. data/VERSION +0 -1
  644. data/app/views/tr8n/help/basic_information.html.erb +0 -13
  645. data/app/views/tr8n/help/context_rules.html.erb +0 -13
  646. data/app/views/tr8n/help/direction.html.erb +0 -13
  647. data/app/views/tr8n/help/enter_translation.html.erb +0 -13
  648. data/app/views/tr8n/help/fallback_language.html.erb +0 -13
  649. data/app/views/tr8n/help/generate_context_rules.html.erb +0 -17
  650. data/app/views/tr8n/help/inline_translations.html.erb +0 -28
  651. data/app/views/tr8n/help/language_dashboard.html.erb +0 -21
  652. data/app/views/tr8n/help/language_phrases.html.erb +0 -17
  653. data/app/views/tr8n/help/language_statistics.html.erb +0 -13
  654. data/app/views/tr8n/help/manage.html.erb +0 -13
  655. data/app/views/tr8n/help/manage_language.html.erb +0 -13
  656. data/app/views/tr8n/help/native_name.html.erb +0 -13
  657. data/app/views/tr8n/help/original_phrase.html.erb +0 -13
  658. data/app/views/tr8n/help/other_languages.html.erb +0 -15
  659. data/app/views/tr8n/help/other_translatable_resources.html.erb +0 -13
  660. data/app/views/tr8n/help/phrases_with_translations.html.erb +0 -21
  661. data/app/views/tr8n/help/phrases_without_translations.html.erb +0 -15
  662. data/app/views/tr8n/help/prohibited_words.html.erb +0 -13
  663. data/app/views/tr8n/help/rank.html.erb +0 -13
  664. data/app/views/tr8n/help/recent_discussions.html.erb +0 -13
  665. data/app/views/tr8n/help/recent_translation_votes.html.erb +0 -13
  666. data/app/views/tr8n/help/recent_translations.html.erb +0 -13
  667. data/app/views/tr8n/help/site_sections.html.erb +0 -13
  668. data/app/views/tr8n/help/suggested_translation.html.erb +0 -13
  669. data/app/views/tr8n/help/translating_inline.html.erb +0 -30
  670. data/app/views/tr8n/help/translation_context_rules.html.erb +0 -16
  671. data/app/views/tr8n/help/translation_tokens.html.erb +0 -13
  672. data/app/views/tr8n/help/translation_tools.html.erb +0 -13
  673. data/app/views/tr8n/help/user_rank.html.erb +0 -13
  674. data/app/views/tr8n/help/using_translation_tools.html.erb +0 -13
  675. data/app/views/tr8n/help/your_dashboard.html.erb +0 -17
  676. data/app/views/tr8n/help/your_languages.html.erb +0 -19
  677. data/app/views/tr8n/help/your_translations.html.erb +0 -17
  678. data/config/application.rb +0 -65
  679. data/config/boot.rb +0 -6
  680. data/config/database.yml +0 -13
  681. data/config/environment.rb +0 -46
  682. data/db/extras/20100511185330_create_test_users.rb +0 -43
  683. data/db/migrate/20090730070119_create_will_filter_tables.rb +0 -19
  684. data/db/seeds.rb +0 -7
  685. data/lib/application_helper.rb +0 -390
  686. data/lib/tr8n/controller_methods.rb +0 -156
  687. data/public/robots.txt +0 -5
  688. data/public/tr8n/images/flags/.DS_Store +0 -0
  689. data/rails/init.rb +0 -53
  690. data/test/performance/browsing_test.rb +0 -9
@@ -24,30 +24,32 @@
24
24
  require 'rexml/document'
25
25
  require 'net/http'
26
26
 
27
- class Tr8n::Dictionary
27
+ module Tr8n
28
+ class Dictionary
28
29
 
29
- def self.load_definitions_for(words)
30
- words = [words] unless words.is_a?(Array)
30
+ def self.load_definitions_for(words)
31
+ words = [words] unless words.is_a?(Array)
31
32
 
32
- definitions = {}
33
+ definitions = {}
33
34
 
34
- words.each do |word|
35
- Net::HTTP.start("services.aonaware.com") do |http|
36
- response = http.get("/DictService/DictService.asmx/Define?word=#{word}")
35
+ words.each do |word|
36
+ Net::HTTP.start("services.aonaware.com") do |http|
37
+ response = http.get("/DictService/DictService.asmx/Define?word=#{word}")
37
38
 
38
- doc = REXML::Document.new(response.body)
39
- doc.elements.each('WordDefinition/Definitions/Definition') do |d|
40
- word = d.elements["Word"].text.downcase
41
- source = d.elements["Dictionary"].elements["Name"].text
42
- definition = d.elements["WordDefinition"].text
39
+ doc = REXML::Document.new(response.body)
40
+ doc.elements.each('WordDefinition/Definitions/Definition') do |d|
41
+ word = d.elements["Word"].text.downcase
42
+ source = d.elements["Dictionary"].elements["Name"].text
43
+ definition = d.elements["WordDefinition"].text
43
44
 
44
- definitions[word] ||= []
45
- definitions[word] << {:source => source, :definition => definition}
46
- end
47
- end
45
+ definitions[word] ||= []
46
+ definitions[word] << {:source => source, :definition => definition}
47
+ end
48
+ end
49
+ end
50
+
51
+ definitions
48
52
  end
49
53
 
50
- definitions
51
54
  end
52
-
53
- end
55
+ end
data/lib/tr8n/engine.rb CHANGED
@@ -1,29 +1,28 @@
1
- require 'pp'
2
- require 'will_filter'
3
- require 'tr8n'
4
- require 'rails'
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
+ #++
5
23
 
6
- module Tr8n
24
+ module Tr8n
7
25
  class Engine < Rails::Engine
8
- config.autoload_paths << File.expand_path("../../lib", __FILE__)
9
- config.autoload_paths << File.expand_path("../../lib/core_ext/**", __FILE__)
10
- config.autoload_paths << File.expand_path("../../lib/tr8n", __FILE__)
11
- config.autoload_paths << File.expand_path("../../lib/tr8n/tokens", __FILE__)
12
- config.autoload_paths << File.expand_path("../../app/models/tr8n", __FILE__)
13
-
14
- [
15
- "../../lib/core_ext/**",
16
- "../../lib/tr8n",
17
- "../../lib/tr8n/tokens",
18
- "../../lib"
19
- ].each do |dir|
20
- Dir[File.expand_path("#{File.dirname(__FILE__)}/#{dir}/*.rb")].sort.each do |file|
21
- require_or_load file
22
- end
23
- end
24
-
25
- initializer "static assets" do |app|
26
- app.middleware.insert_before(::ActionDispatch::Static, ::ActionDispatch::Static, "#{root}/public")
27
- end
26
+ isolate_namespace Tr8n
28
27
  end
29
28
  end
@@ -21,6 +21,8 @@
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
- class Tr8n::Exception < StandardError
24
+ module Tr8n
25
+ class Exception < StandardError
25
26
 
26
- end
27
+ end
28
+ end
data/lib/tr8n/extender.rb CHANGED
@@ -21,14 +21,16 @@
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
- module Tr8n::Extender
25
- def extended(mod)
26
- mod.send(:extend, self::ClassMethods)
27
- mod.send(:include, self::InstanceMethods)
28
- end
24
+ module Tr8n
25
+ module Extender
26
+ def extended(mod)
27
+ mod.send(:extend, self::ClassMethods)
28
+ mod.send(:include, self::InstanceMethods)
29
+ end
29
30
 
30
- def included(mod)
31
- mod.send(:extend, self::ClassMethods)
32
- mod.send(:include, self::InstanceMethods)
31
+ def included(mod)
32
+ mod.send(:extend, self::ClassMethods)
33
+ mod.send(:include, self::InstanceMethods)
34
+ end
33
35
  end
34
- end
36
+ end
@@ -0,0 +1,158 @@
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
25
+ module ActionControllerExtension
26
+ def self.included(base)
27
+ base.send(:include, InstanceMethods)
28
+ base.before_filter :init_tr8n
29
+ end
30
+
31
+ module InstanceMethods
32
+ ######################################################################
33
+ # Author: Iain Hecker
34
+ # reference: http://github.com/iain/http_accept_language
35
+ ######################################################################
36
+ def tr8n_browser_accepted_locales
37
+ @accepted_languages ||= request.env['HTTP_ACCEPT_LANGUAGE'].split(/\s*,\s*/).collect do |l|
38
+ l += ';q=1.0' unless l =~ /;q=\d+\.\d+$/
39
+ l.split(';q=')
40
+ end.sort do |x,y|
41
+ raise Tr8n::Exception.new("Not correctly formatted") unless x.first =~ /^[a-z\-]+$/i
42
+ y.last.to_f <=> x.last.to_f
43
+ end.collect do |l|
44
+ l.first.downcase.gsub(/-[a-z]+$/i) { |x| x.upcase }
45
+ end
46
+ rescue
47
+ []
48
+ end
49
+
50
+ def tr8n_user_preffered_locale
51
+ tr8n_browser_accepted_locales.each do |locale|
52
+ lang = Tr8n::Language.for(locale)
53
+ return locale if lang and lang.enabled?
54
+ end
55
+ Tr8n::Config.default_locale
56
+ end
57
+
58
+ def tr8n_request_remote_ip
59
+ @remote_ip ||= if request.env['HTTP_X_FORWARDED_FOR']
60
+ request.env['HTTP_X_FORWARDED_FOR'].split(',').first
61
+ else
62
+ request.remote_ip
63
+ end
64
+ end
65
+
66
+ def init_tr8n
67
+ tr8n_current_locale = nil
68
+ begin
69
+ tr8n_current_locale = eval(Tr8n::Config.current_locale_method)
70
+ rescue
71
+ # fallback to the default session based locale implementation
72
+ # choose the first language from the accepted languages header
73
+ session[:locale] = tr8n_user_preffered_locale unless session[:locale]
74
+ session[:locale] = params[:locale] if params[:locale]
75
+ tr8n_current_locale = session[:locale]
76
+ end
77
+
78
+ tr8n_current_user = nil
79
+ if Tr8n::Config.site_user_info_enabled?
80
+ begin
81
+ tr8n_current_user = eval(Tr8n::Config.current_user_method)
82
+ tr8n_current_user = nil if tr8n_current_user.class.name != Tr8n::Config.user_class_name
83
+ rescue
84
+ tr8n_current_user = Tr8n::Translator.new
85
+ Tr8n::Logger.error("Site user integration is enabled, but #{Tr8n::Config.current_user_method} method is not defined")
86
+ end
87
+ else
88
+ tr8n_current_user = Tr8n::Translator.find_by_id(session[:tr8n_translator_id]) if session[:tr8n_translator_id]
89
+ tr8n_current_user = Tr8n::Translator.new unless tr8n_current_user
90
+ end
91
+
92
+ # initialize request thread variables
93
+ Tr8n::Config.init(tr8n_current_locale, tr8n_current_user)
94
+
95
+ # track user's last ip address
96
+ if Tr8n::Config.enable_country_tracking? and Tr8n::Config.current_user_is_translator?
97
+ Tr8n::Config.current_translator.update_last_ip(tr8n_request_remote_ip)
98
+ end
99
+ end
100
+
101
+ ############################################################
102
+ # There are two ways to call the tr method
103
+ #
104
+ # tr(label, desc = "", tokens = {}, options = {})
105
+ # or
106
+ # tr(label, {:desc => "", tokens => {}, ...})
107
+ ############################################################
108
+ def tr(label, desc = "", tokens = {}, options = {})
109
+ if desc.is_a?(Hash)
110
+ options = desc
111
+ tokens = options[:tokens] || {}
112
+ desc = options[:desc] || ""
113
+ end
114
+
115
+ begin
116
+ url = request.url
117
+ host = request.env['HTTP_HOST']
118
+ source = "#{controller.class.name.underscore.gsub("_controller", "")}/#{controller.action_name}"
119
+ rescue
120
+ source = self.class.name
121
+ url = nil
122
+ host = 'localhost'
123
+ end
124
+
125
+ options.merge!(:source => source) unless options[:source]
126
+ options.merge!(:caller => caller)
127
+ options.merge!(:url => url)
128
+ options.merge!(:host => host)
129
+
130
+ unless Tr8n::Config.enabled?
131
+ return Tr8n::TranslationKey.substitute_tokens(label, tokens, options)
132
+ end
133
+
134
+ Tr8n::Config.current_language.translate(label, desc, tokens, options)
135
+ end
136
+
137
+ # for translating labels
138
+ def trl(label, desc = "", tokens = {}, options = {})
139
+ tr(label, desc, tokens, options.merge(:skip_decorations => true))
140
+ end
141
+
142
+ # flash notice
143
+ def trfn(label, desc = "", tokens = {}, options = {})
144
+ flash[:trfn] = tr(label, desc, tokens, options)
145
+ end
146
+
147
+ # flash error
148
+ def trfe(label, desc = "", tokens = {}, options = {})
149
+ flash[:trfe] = tr(label, desc, tokens, options)
150
+ end
151
+
152
+ # flash error
153
+ def trfw(label, desc = "", tokens = {}, options = {})
154
+ flash[:trfw] = tr(label, desc, tokens, options)
155
+ end
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,395 @@
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
25
+ module ActionViewExtension
26
+ extend ActiveSupport::Concern
27
+ module InstanceMethods
28
+
29
+ # generates translations json for client sdk
30
+ def tr8n_translations_js_tag(opts = {})
31
+ html = []
32
+ html << "<script>"
33
+
34
+ var_name = opts[:id] || :tr8n_translations
35
+
36
+ source_names = opts[:sources] || [opts[:source]]
37
+ sources = Tr8n::TranslationSource.find(:all, :conditions => ["source in (?)", source_names])
38
+ source_ids = sources.collect{|source| source.id}
39
+
40
+ if source_ids.empty?
41
+ conditions = ["1=2"]
42
+ else
43
+ conditions = ["(id in (select distinct(translation_key_id) from tr8n_translation_key_sources where translation_source_id in (?)))"]
44
+ conditions << source_ids.uniq
45
+ end
46
+
47
+ translations = []
48
+ Tr8n::TranslationKey.find(:all, :conditions => conditions).each_with_index do |tkey, index|
49
+ trn = tkey.translate(Tr8n::Config.current_language, {}, {:api => true})
50
+ translations << trn
51
+ end
52
+
53
+ html << "var #{var_name} = #{translations.to_json};"
54
+
55
+ html << "</script>"
56
+ html.join('').html_safe
57
+ end
58
+
59
+ # translation functions
60
+ def tr(label, desc = "", tokens = {}, options = {})
61
+ if desc.is_a?(Hash)
62
+ options = desc
63
+ tokens = options[:tokens] || {}
64
+ desc = options[:context] || ""
65
+ end
66
+
67
+ begin
68
+ url = request.url
69
+ host = request.env['HTTP_HOST']
70
+ source = "#{controller.class.name.underscore.gsub("_controller", "")}/#{controller.action_name}"
71
+ rescue
72
+ source = self.class.name
73
+ url = nil
74
+ host = 'localhost'
75
+ end
76
+
77
+ options.merge!(:source => source) unless options[:source]
78
+ options.merge!(:caller => caller)
79
+ options.merge!(:url => url)
80
+ options.merge!(:host => host)
81
+
82
+ unless Tr8n::Config.enabled?
83
+ return Tr8n::TranslationKey.substitute_tokens(label, tokens, options)
84
+ end
85
+
86
+ Tr8n::Config.current_language.translate(label, desc, tokens, options)
87
+ end
88
+
89
+ # for translating labels
90
+ def trl(label, desc = "", tokens = {}, options = {})
91
+ tr(label, desc, tokens, options.merge(:skip_decorations => true))
92
+ end
93
+
94
+ def tr8n_options_for_select(options, selected = nil, description = nil, lang = Tr8n::Config.current_language)
95
+ options_for_select(options.tro(description), selected)
96
+ end
97
+
98
+ def tr8n_phrases_link_tag(search = "", phrase_type = :without, phrase_status = :any)
99
+ return unless Tr8n::Config.enabled?
100
+ return if Tr8n::Config.current_language.default?
101
+ return unless Tr8n::Config.open_registration_mode? or Tr8n::Config.current_user_is_translator?
102
+ return unless Tr8n::Config.current_translator.enable_inline_translations?
103
+
104
+ link_to(image_tag("tr8n/translate_icn.gif", :style => "vertical-align:middle; border: 0px;", :title => search),
105
+ :controller => "/tr8n/phrases", :action => :index,
106
+ :search => search, :phrase_type => phrase_type, :phrase_status => phrase_status).html_safe
107
+ end
108
+
109
+ def tr8n_dir_attribute_tag
110
+ "dir='<%=Tr8n::Config.current_language.dir%>'".html_safe
111
+ end
112
+
113
+ def tr8n_splash_screen_tag
114
+ html = "<div id='tr8n_splash_screen' style='display:none'>"
115
+ html << (render :partial => Tr8n::Config.splash_screen)
116
+ html << "</div>"
117
+ html.html_safe
118
+ end
119
+
120
+ def tr8n_language_flag_tag(lang = Tr8n::Config.current_language, opts = {})
121
+ return "" unless Tr8n::Config.enable_language_flags?
122
+ html = image_tag("tr8n/flags/#{lang.flag}.png", :style => "vertical-align:middle;", :title => lang.native_name)
123
+ html << "&nbsp;".html_safe
124
+ html.html_safe
125
+ end
126
+
127
+ def tr8n_language_name_tag(lang = Tr8n::Config.current_language, opts = {})
128
+ show_flag = opts[:flag].nil? ? true : opts[:flag]
129
+ name_type = opts[:name].nil? ? :full : opts[:name] # :full, :native, :english, :locale
130
+ linked = opts[:linked].nil? ? true : opts[:linked]
131
+
132
+ html = "<span style='white-space: nowrap'>"
133
+ html << tr8n_language_flag_tag(lang, opts) if show_flag
134
+
135
+ name = case name_type
136
+ when :native then lang.native_name
137
+ when :english then lang.english_name
138
+ when :locale then lang.locale
139
+ else lang.full_name
140
+ end
141
+
142
+ if linked
143
+ html << link_to(name.html_safe, :controller => "/tr8n/language",
144
+ :action => :switch, :language_action => :switch_language,
145
+ :locale => lang.locale,
146
+ :source_url => opts[:source_url])
147
+ else
148
+ html << name
149
+ end
150
+
151
+ html << "</span>"
152
+ html.html_safe
153
+ end
154
+
155
+ def tr8n_language_selector_tag(opts = {})
156
+ opts[:lightbox] ||= false
157
+ opts[:style] ||= "color:#1166bb;"
158
+ opts[:show_arrow] ||= true
159
+ opts[:arrow_style] ||= "font-size:8px;"
160
+ render(:partial => '/tr8n/common/language_selector', :locals => {:opts => opts})
161
+ end
162
+
163
+ def tr8n_language_strip_tag(opts = {})
164
+ opts[:flag] = opts[:flag].nil? ? false : opts[:flag]
165
+ opts[:name] = opts[:name].nil? ? :native : opts[:name]
166
+ opts[:linked] = opts[:linked].nil? ? true : opts[:linked]
167
+ opts[:javascript] = opts[:javascript].nil? ? false : opts[:javascript]
168
+
169
+ render(:partial => '/tr8n/common/language_strip', :locals => {:opts => opts})
170
+ end
171
+
172
+ def tr8n_language_table_tag(opts = {})
173
+ opts[:cols] = opts[:cols].nil? ? 4 : opts[:cols]
174
+ opts[:col_size] = opts[:col_size].nil? ? "300px" : opts[:col_size]
175
+ render(:partial => '/tr8n/common/language_table', :locals => {:opts => opts.merge(:name => :english)})
176
+ end
177
+
178
+ def tr8n_translator_login_tag(opts = {})
179
+ opts[:class] ||= 'tr8n_right_horiz_list'
180
+ render(:partial => '/tr8n/common/translator_login', :locals => {:opts => opts})
181
+ end
182
+
183
+ def tr8n_flashes_tag(opts = {})
184
+ render(:partial => '/tr8n/common/flashes', :locals => {:opts => opts})
185
+ end
186
+
187
+ def tr8n_scripts_tag(opts = {})
188
+ render(:partial => '/tr8n/common/scripts', :locals => {:opts => opts})
189
+ end
190
+
191
+ def tr8n_client_sdk_scripts_tag(opts = {})
192
+ opts[:default_source] ||= "application"
193
+ opts[:scheduler_interval] ||= 5000
194
+
195
+ opts[:enable_inline_translations] = (Tr8n::Config.current_user_is_translator? and Tr8n::Config.current_translator.enable_inline_translations? and (not Tr8n::Config.current_language.default?))
196
+ opts[:default_decorations] = Tr8n::Config.default_decoration_tokens
197
+ opts[:default_tokens] = Tr8n::Config.default_data_tokens
198
+ opts[:rules] = {
199
+ :number => Tr8n::Config.rules_engine[:numeric_rule], :gender => Tr8n::Config.rules_engine[:gender_rule],
200
+ :list => Tr8n::Config.rules_engine[:gender_list_rule], :date => Tr8n::Config.rules_engine[:date_rule]
201
+ }
202
+
203
+ html = [javascript_include_tag("/tr8n/javascripts/tr8n_client_sdk.js")]
204
+ html << "<script>"
205
+ html << "function initializeTr8nProxy() {"
206
+ html << " tr8nProxy = new Tr8n.Proxy(#{opts.to_json});"
207
+ # html << " Tr8n.Utils.addEvent(window, 'load', function() {"
208
+ # html << " tr8nProxy = new Tr8n.Proxy(#{opts.to_json});"
209
+ # html << " });"
210
+ html << "}"
211
+ html << "initializeTr8nProxy();"
212
+ html << "</script>"
213
+ html.join("\n").html_safe
214
+ end
215
+
216
+ def tr8n_translator_rank_tag(translator, rank = nil)
217
+ return "" unless translator
218
+
219
+ rank ||= translator.rank || 0
220
+
221
+ html = "<span dir='ltr'>"
222
+ 1.upto(5) do |i|
223
+ if rank > i * 20 - 10 and rank < i * 20
224
+ html << image_tag("tr8n/rating_star05.png")
225
+ elsif rank < i * 20 - 10
226
+ html << image_tag("tr8n/rating_star0.png")
227
+ else
228
+ html << image_tag("tr8n/rating_star1.png")
229
+ end
230
+ end
231
+ html << "</span>"
232
+ html.html_safe
233
+ end
234
+
235
+ def tr8n_help_icon_tag(filename = "index")
236
+ link_to(image_tag("tr8n/help.png", :style => "border:0px; vertical-align:middle;", :title => trl("Help")), {:controller => "/tr8n/help", :action => filename}, :target => "_new").html_safe
237
+ end
238
+
239
+ def tr8n_help_link(text, opts = {})
240
+ filename = opts[:filename].nil? ? text.downcase.gsub(' ', '_') : opts[:filename]
241
+ classname = "tr8n_selected" if filename == controller.action_name
242
+ link_to(text, { :controller => "/tr8n/help", :action => filename }, :class => classname).html_safe
243
+ end
244
+
245
+ def tr8n_spinner_tag(id = "spinner", label = nil, cls='spinner')
246
+ html = "<div id='#{id}' class='#{cls}' style='display:none'>"
247
+ html << image_tag("tr8n/spinner.gif", :style => "vertical-align:middle;")
248
+ html << " #{trl(label)}" if label
249
+ html << "</div>"
250
+ html.html_safe
251
+ end
252
+
253
+ def tr8n_toggler_tag(content_id, label = "", open = true)
254
+ html = "<span id='#{content_id}_open' "
255
+ html << "style='display:none'" unless open
256
+ html << ">"
257
+ html << link_to_function("#{image_tag("tr8n/arrow_down.gif", :style=>'text-align:center; vertical-align:middle')} #{label}".html_safe, "Tr8n.Effects.hide('#{content_id}_open'); Tr8n.Effects.show('#{content_id}_closed'); Tr8n.Effects.blindUp('#{content_id}');", :style=> "text-decoration:none")
258
+ html << "</span>"
259
+ html << "<span id='#{content_id}_closed' "
260
+ html << "style='display:none'" if open
261
+ html << ">"
262
+ html << link_to_function("#{image_tag("tr8n/arrow_right.gif", :style=>'text-align:center; vertical-align:middle')} #{label}".html_safe, "Tr8n.Effects.show('#{content_id}_open'); Tr8n.Effects.hide('#{content_id}_closed'); Tr8n.Effects.blindDown('#{content_id}');", :style=> "text-decoration:none")
263
+ html << "</span>"
264
+ html.html_safe
265
+ end
266
+
267
+ def tr8n_sitemap(sections, splitters, options = {})
268
+ html = ""
269
+ html << "<table style='width:100%'>"
270
+ html << "<tr>"
271
+ splitters.each do |splitter|
272
+ html << "<td style='vertical-align:top; width:" << (100 / splitters.size).to_s << "%;'>"
273
+ html << generate_sitemap(sections[splitter.first..splitter.last], options)
274
+ html << "</td>"
275
+ end
276
+ html << "</tr>"
277
+ html << "</table>"
278
+ html.html_safe
279
+ end
280
+
281
+ def tr8n_breadcrumb_tag(source = nil, opts = {})
282
+ source ||= "#{controller.class.name.underscore.gsub("_controller", "")}/#{controller.action_name}"
283
+ section = Tr8n::SiteMap.section_for_source(source)
284
+ return "" unless section
285
+ opts[:separator] ||= " >> "
286
+ opts[:min_elements] ||= 1
287
+ opts[:skip_root] ||= opts[:skip_root].nil? ? false : opts[:skip_root]
288
+
289
+ links = section.parents.collect{|node| link_to(node.title(params), node.link(params))}
290
+ return "" if links.size <= opts[:min_elements]
291
+
292
+ links.delete(links.first) if opts[:skip_root]
293
+ links.unshift(link_to(opts[:root].first, opts[:root].last)) if opts[:root]
294
+
295
+ html = "<div id='tr8n_breadcrumb' class='tr8n_breadcrumb'>"
296
+ html << links.join(opts[:separator])
297
+ html << '</div>'
298
+ html.html_safe
299
+ end
300
+
301
+ def tr8n_user_tag(translator, options = {})
302
+ return "Deleted Translator" unless translator
303
+
304
+ if options[:linked]
305
+ link_to(translator.name, translator.link).html_safe
306
+ else
307
+ translator.name
308
+ end
309
+ end
310
+
311
+ def tr8n_user_mugshot_tag(translator, options = {})
312
+ if translator and !translator.mugshot.blank?
313
+ img_url = translator.mugshot
314
+ else
315
+ img_url = Tr8n::Config.silhouette_image
316
+ end
317
+
318
+ img_tag = "<img src='#{img_url}' style='width:48px'>".html_safe
319
+
320
+ if translator and options[:linked]
321
+ link_to(img_tag, translator.link).html_safe
322
+ else
323
+ img_tag.html_safe
324
+ end
325
+ end
326
+
327
+ def tr8n_will_paginate(collection = nil, options = {})
328
+ will_paginate(collection, options.merge(:previous_label => tr("&laquo; Previous", "Previous entries in a list", {}, options),
329
+ :next_label => tr("Next &raquo;", "Next entries in a list", {}, options))).html_safe
330
+ end
331
+
332
+ def tr8n_page_entries_info(collection, options = {})
333
+ entry_name = options[:entry_name] || (collection.empty? ? 'entry' : collection.first.class.name.underscore.sub('_', ' '))
334
+
335
+ if collection.total_pages < 2
336
+ case collection.size
337
+ when 0
338
+ tr("None found", "Paginator no entries message", {}, options)
339
+ when 1
340
+ tr("Displaying [bold: 1] #{entry_name}", "Paginator one page message", {}, options)
341
+ else
342
+ tr("Displaying [bold: all {count}] #{entry_name.pluralize}", "Paginator all entries message", {:count => collection.size}, options)
343
+ end
344
+ else
345
+ tr("Displaying #{entry_name.pluralize} [bold: {start_num} - {end_num}] of [bold: {total_count}] in total",
346
+ "Paginator custom message", {
347
+ :start_num => collection.offset + 1,
348
+ :end_num => collection.offset + collection.length,
349
+ :total_count => collection.total_entries
350
+ }, options
351
+ )
352
+ end
353
+ end
354
+
355
+ def tr8n_select_month(date, options = {}, html_options = {})
356
+ month_names = options[:use_short_month] ? Tr8n::Config.default_abbr_month_names : Tr8n::Config.default_month_names
357
+ select_month(date, options.merge(
358
+ :use_month_names => month_names.collect{|month_name| Tr8n::Language.translate(month_name, options[:description] || "Month name")}
359
+ ), html_options)
360
+ end
361
+
362
+ def tr8n_with_options_tag(opts, &block)
363
+ Thread.current[:tr8n_block_options] = opts
364
+ if block_given?
365
+ ret = capture(&block)
366
+ end
367
+ Thread.current[:tr8n_block_options] = {}
368
+ ret
369
+ end
370
+
371
+ def tr8n_button_tag(label, function, opts = {})
372
+ link_to_function("<span>#{label}</span>".html_safe, function, :class => "tr8n_grey_button tr8n_pcb")
373
+ end
374
+
375
+ private
376
+
377
+ def generate_sitemap(sections, options = {})
378
+ html = "<ul class='section_list'>"
379
+ sections.each do |section|
380
+ html << "<li class='section_list_item'>"
381
+ html << "<a href='/tr8n/phrases/index?section_key=#{section.key}'>" << tr(section.label, section.description) << "</a>"
382
+ html << "<a href='" << section.data[:link] << "' target='_new'><img src='/assets/tr8n/bullet_go.png' style='border:0px; vertical-align:middle'></a>" if section.data[:link]
383
+
384
+ if section.children.size > 0
385
+ html << generate_sitemap(section.children, options)
386
+ end
387
+ html << "</li>"
388
+ end
389
+ html << "</ul>"
390
+ html.html_safe
391
+ end
392
+
393
+ end
394
+ end
395
+ end