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
@@ -21,18 +21,36 @@
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
- module Tr8n
25
- module ApplicationController
26
- extend ActiveSupport::Concern
24
+ require 'rails'
25
+ require 'pp'
27
26
 
28
- included do
29
- before_filter :init_tr8n
27
+ [
28
+ ".",
29
+ "./tokens"
30
+ ].each do |dir|
31
+ Dir[File.expand_path("#{File.dirname(__FILE__)}/#{dir}/*.rb")].sort.each do |file|
32
+ require(file)
30
33
  end
34
+ end
35
+
36
+ require File.join(File.dirname(__FILE__), 'extensions/array_extension')
37
+ require File.join(File.dirname(__FILE__), 'extensions/date_extension')
38
+ require File.join(File.dirname(__FILE__), 'extensions/fixnum_extension')
39
+ require File.join(File.dirname(__FILE__), 'extensions/hash_extension')
40
+ require File.join(File.dirname(__FILE__), 'extensions/string_extension')
41
+ require File.join(File.dirname(__FILE__), 'extensions/time_extension')
42
+ require File.join(File.dirname(__FILE__), 'extensions/action_view_extension')
43
+ require File.join(File.dirname(__FILE__), 'extensions/action_controller_extension')
31
44
 
32
- module InstanceMethods
33
- include Tr8n::ControllerMethods
45
+ module Tr8n
46
+ class Railtie < ::Rails::Railtie #:nodoc:
47
+ initializer 'tr8n' do |app|
48
+ ActiveSupport.on_load(:action_view) do
49
+ ::ActionView::Base.send :include, Tr8n::ActionViewExtension
50
+ end
51
+ ActiveSupport.on_load(:action_controller) do
52
+ include Tr8n::ActionControllerExtension
53
+ end
34
54
  end
35
55
  end
36
- end
37
-
38
- ::ActionController::Base.send :include, Tr8n::ApplicationController
56
+ end
data/lib/tr8n/site_map.rb CHANGED
@@ -21,65 +21,67 @@
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
- class Tr8n::SiteMap
24
+ module Tr8n
25
+ class SiteMap
25
26
 
26
- def self.roots
27
- @roots ||= begin
28
- roots = []
29
- Tr8n::Config.sitemap_sections.each do |root_section|
30
- root_node = Tr8n::SiteMapSection.new(root_section)
31
- generate_sitemap_sections(root_section[:sections], root_node)
32
- roots << root_node
27
+ def self.roots
28
+ @roots ||= begin
29
+ roots = []
30
+ Tr8n::Config.sitemap_sections.each do |root_section|
31
+ root_node = Tr8n::SiteMapSection.new(root_section)
32
+ generate_sitemap_sections(root_section[:sections], root_node)
33
+ roots << root_node
34
+ end
35
+ roots
33
36
  end
34
- roots
35
37
  end
36
- end
37
38
 
38
- def self.section_for_source(source)
39
- sections = []
40
- roots.each do |root|
41
- find_sections_by_source(root, source, sections)
42
- end
43
- sections.empty? ? nil : sections.first
44
- end
39
+ def self.section_for_source(source)
40
+ sections = []
41
+ roots.each do |root|
42
+ find_sections_by_source(root, source, sections)
43
+ end
44
+ sections.empty? ? nil : sections.first
45
+ end
45
46
 
46
- def self.section_for_key(key)
47
- sections = []
48
- roots.each do |root|
49
- find_sections_by_key(root, key, sections)
47
+ def self.section_for_key(key)
48
+ sections = []
49
+ roots.each do |root|
50
+ find_sections_by_key(root, key, sections)
51
+ end
52
+ sections.empty? ? nil : sections.first
50
53
  end
51
- sections.empty? ? nil : sections.first
52
- end
53
54
 
54
- def self.to_s
55
- roots.each do |root|
56
- pp root.to_hash
55
+ def self.to_s
56
+ roots.each do |root|
57
+ pp root.to_hash
58
+ end
57
59
  end
58
- end
59
60
 
60
- private
61
+ private
61
62
 
62
- def self.generate_sitemap_sections(sub_sections, parent)
63
- return if sub_sections.blank? or sub_sections.empty?
64
- sub_sections.each do |sub_section|
65
- node = Tr8n::SiteMapSection.new(sub_section, parent)
66
- generate_sitemap_sections(sub_section[:sections], node)
67
- end
68
- end
63
+ def self.generate_sitemap_sections(sub_sections, parent)
64
+ return if sub_sections.blank? or sub_sections.empty?
65
+ sub_sections.each do |sub_section|
66
+ node = Tr8n::SiteMapSection.new(sub_section, parent)
67
+ generate_sitemap_sections(sub_section[:sections], node)
68
+ end
69
+ end
69
70
 
70
- def self.find_sections_by_source(node, source, sections)
71
- sections << node if node.source == source
72
- node.children.each do |child|
73
- find_sections_by_source(child, source, sections)
71
+ def self.find_sections_by_source(node, source, sections)
72
+ sections << node if node.source == source
73
+ node.children.each do |child|
74
+ find_sections_by_source(child, source, sections)
75
+ end
76
+ nil
74
77
  end
75
- nil
76
- end
77
78
 
78
- def self.find_sections_by_key(node, key, sections)
79
- sections << node if node.key == key
80
- node.children.each do |child|
81
- find_sections_by_key(child, key, sections)
79
+ def self.find_sections_by_key(node, key, sections)
80
+ sections << node if node.key == key
81
+ node.children.each do |child|
82
+ find_sections_by_key(child, key, sections)
83
+ end
82
84
  end
83
- end
84
85
 
86
+ end
85
87
  end
@@ -21,88 +21,90 @@
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
- class Tr8n::SiteMapSection
25
- attr_accessor :key, :parent, :data
24
+ module Tr8n
25
+ class SiteMapSection
26
+ attr_accessor :key, :parent, :data
26
27
 
27
- def initialize(section_data = {}, parent_section = nil)
28
- @data = section_data
29
- @parent = parent_section
30
- @key = Tr8n::TranslationKey.generate_key(data[:label], data[:description])
31
- @parent.children << self if @parent
32
- end
28
+ def initialize(section_data = {}, parent_section = nil)
29
+ @data = section_data
30
+ @parent = parent_section
31
+ @key = Tr8n::TranslationKey.generate_key(data[:label], data[:description])
32
+ @parent.children << self if @parent
33
+ end
33
34
 
34
- def enabled?
35
- return true if data[:enabled] == nil
36
- data[:enabled]
37
- end
35
+ def enabled?
36
+ return true if data[:enabled] == nil
37
+ data[:enabled]
38
+ end
38
39
 
39
- def children
40
- @children ||= []
41
- end
40
+ def children
41
+ @children ||= []
42
+ end
42
43
 
43
- def sources
44
- data[:sources]
45
- end
44
+ def sources
45
+ data[:sources]
46
+ end
46
47
 
47
- def source
48
- return "" if sources.blank? or sources.empty?
49
- sources.first
50
- end
48
+ def source
49
+ return "" if sources.blank? or sources.empty?
50
+ sources.first
51
+ end
51
52
 
52
- def label
53
- data[:label] || ''
54
- end
53
+ def label
54
+ data[:label] || ''
55
+ end
55
56
 
56
- def description
57
- data[:description] || ''
58
- end
57
+ def description
58
+ data[:description] || ''
59
+ end
59
60
 
60
- def link(params)
61
- return data[:link] if data[:link]
62
- return "/" unless source
63
- lnk = "/#{source}" unless source.first == '/'
64
- return "#{lnk}?#{object[:param]}=#{params[object[:param]]}" if object
65
- lnk
66
- end
61
+ def link(params)
62
+ return data[:link] if data[:link]
63
+ return "/" unless source
64
+ lnk = "/#{source}" unless source.first == '/'
65
+ return "#{lnk}?#{object[:param]}=#{params[object[:param]]}" if object
66
+ lnk
67
+ end
67
68
 
68
- def object
69
- data[:object]
70
- end
69
+ def object
70
+ data[:object]
71
+ end
71
72
 
72
- def title(params = {})
73
- if object
74
- cls = object[:class].constantize.find(params[object[:param]])
75
- return ERB::Util.html_escape(cls.send(object[:method]))
73
+ def title(params = {})
74
+ if object
75
+ cls = object[:class].constantize.find(params[object[:param]])
76
+ return ERB::Util.html_escape(cls.send(object[:method]))
77
+ end
78
+ # has to be smart about the objects
79
+ label.translate(description)
76
80
  end
77
- # has to be smart about the objects
78
- label.translate(description)
79
- end
80
81
 
81
- def to_s
82
- label
83
- end
82
+ def to_s
83
+ label
84
+ end
84
85
 
85
- def parents
86
- @parents ||= begin
87
- path = [self]
88
- node = self.parent
89
- while node
90
- path << node
91
- node = node.parent
86
+ def parents
87
+ @parents ||= begin
88
+ path = [self]
89
+ node = self.parent
90
+ while node
91
+ path << node
92
+ node = node.parent
93
+ end
94
+ path.reverse
92
95
  end
93
- path.reverse
94
96
  end
95
- end
96
97
 
97
- def to_hash(deep=true)
98
- hash = {
99
- :label => label,
100
- :description => description,
101
- :sources => sources
102
- }
103
- hash[:sources] = sources if sources
104
- hash[:sections] = children.collect{|child| child.to_hash} if deep
105
- hash
106
- end
98
+ def to_hash(deep=true)
99
+ hash = {
100
+ :label => label,
101
+ :description => description,
102
+ :sources => sources
103
+ }
104
+ hash[:sources] = sources if sources
105
+ hash[:sections] = children.collect{|child| child.to_hash} if deep
106
+ hash
107
+ end
107
108
 
109
+ end
108
110
  end
data/lib/tr8n/token.rb CHANGED
@@ -21,418 +21,420 @@
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
- class Tr8n::Token
25
- def self.register_data_tokens(label)
26
- tokens = []
27
- Tr8n::Config.data_token_classes.each do |token_class|
28
- tokens << token_class.parse(label)
29
- end
24
+ module Tr8n
25
+ class Token
26
+ def self.register_data_tokens(label)
27
+ tokens = []
28
+ Tr8n::Config.data_token_classes.each do |token_class|
29
+ tokens << token_class.parse(label)
30
+ end
30
31
 
31
- tokens.flatten
32
- end
32
+ tokens.flatten
33
+ end
33
34
 
34
- def self.register_decoration_tokens(label)
35
- tokens = []
36
- Tr8n::Config.decoration_token_classes.each do |token_class|
37
- tokens << token_class.parse(label)
35
+ def self.register_decoration_tokens(label)
36
+ tokens = []
37
+ Tr8n::Config.decoration_token_classes.each do |token_class|
38
+ tokens << token_class.parse(label)
39
+ end
40
+ tokens.flatten
38
41
  end
39
- tokens.flatten
40
- end
41
42
 
42
- def self.expression
43
- raise Tr8n::TokenException.new("This method must be implemented in the extending class")
44
- end
43
+ def self.expression
44
+ raise Tr8n::TokenException.new("This method must be implemented in the extending class")
45
+ end
45
46
 
46
- def self.parse(label)
47
- tokens = []
48
- label.scan(expression).uniq.each do |token_array|
49
- tokens << self.new(label, token_array.first)
47
+ def self.parse(label)
48
+ tokens = []
49
+ label.scan(expression).uniq.each do |token_array|
50
+ tokens << self.new(label, token_array.first)
51
+ end
52
+ tokens
50
53
  end
51
- tokens
52
- end
53
54
 
54
- def initialize(label, token)
55
- @label = label
56
- @full_name = token
57
- end
55
+ def initialize(label, token)
56
+ @label = label
57
+ @full_name = token
58
+ end
58
59
 
59
- def original_label
60
- @label
61
- end
60
+ def original_label
61
+ @label
62
+ end
62
63
 
63
- def full_name
64
- @full_name
65
- end
64
+ def full_name
65
+ @full_name
66
+ end
66
67
 
67
- def declared_name
68
- @declared_name ||= full_name.gsub(/[{}\[\]]/, '')
69
- end
68
+ def declared_name
69
+ @declared_name ||= full_name.gsub(/[{}\[\]]/, '')
70
+ end
70
71
 
71
- def name
72
- @name ||= declared_name.split(':').first.strip
73
- end
72
+ def name
73
+ @name ||= declared_name.split(':').first.strip
74
+ end
74
75
 
75
- def permutable_name
76
- @permutable_name ||= name.split(".").first
77
- end
76
+ def permutable_name
77
+ @permutable_name ||= name.split(".").first
78
+ end
78
79
 
79
- def suffix
80
- @suffix ||= name.split('_').last
81
- end
80
+ def suffix
81
+ @suffix ||= name.split('_').last
82
+ end
82
83
 
83
- # used for the UI substitution
84
- def sanitized_name
85
- "{#{name}}"
86
- end
84
+ # used for the UI substitution
85
+ def sanitized_name
86
+ "{#{name}}"
87
+ end
87
88
 
88
- def name_key
89
- name.to_sym
90
- end
89
+ def name_key
90
+ name.to_sym
91
+ end
91
92
 
92
- def pipeless_name
93
- @pipeless_name ||= declared_name.split('|').first
94
- end
93
+ def pipeless_name
94
+ @pipeless_name ||= declared_name.split('|').first
95
+ end
95
96
 
96
- def case_key
97
- return nil unless declared_name.index('::')
97
+ def case_key
98
+ return nil unless declared_name.index('::')
98
99
 
99
- @case_key ||= begin
100
- cases = declared_name.scan(/((::[\w]+)+)/).flatten.uniq
101
- if cases.any?
102
- cases.last.gsub("::", "")
103
- else
104
- nil
100
+ @case_key ||= begin
101
+ cases = declared_name.scan(/((::[\w]+)+)/).flatten.uniq
102
+ if cases.any?
103
+ cases.last.gsub("::", "")
104
+ else
105
+ nil
106
+ end
105
107
  end
106
108
  end
107
- end
108
109
 
109
- def supports_cases?
110
- true
111
- end
110
+ def supports_cases?
111
+ true
112
+ end
112
113
 
113
- def has_case_key?
114
- not case_key.blank?
115
- end
114
+ def has_case_key?
115
+ not case_key.blank?
116
+ end
116
117
 
117
- def caseless_name
118
- @caseless_name ||= begin
119
- if has_case_key?
120
- pipeless_name.gsub("::#{case_key}", "")
121
- else
122
- pipeless_name
118
+ def caseless_name
119
+ @caseless_name ||= begin
120
+ if has_case_key?
121
+ pipeless_name.gsub("::#{case_key}", "")
122
+ else
123
+ pipeless_name
124
+ end
123
125
  end
124
126
  end
125
- end
126
127
 
127
- def name_with_case
128
- return name unless has_case_key?
129
- "#{name}::#{case_key}"
130
- end
128
+ def name_with_case
129
+ return name unless has_case_key?
130
+ "#{name}::#{case_key}"
131
+ end
131
132
 
132
- # used by the translator submit dialog
133
- def name_for_case(case_key)
134
- "#{name}::#{case_key}"
135
- end
133
+ # used by the translator submit dialog
134
+ def name_for_case(case_key)
135
+ "#{name}::#{case_key}"
136
+ end
136
137
 
137
- # used by the translator submit dialog
138
- def sanitized_name_for_case(case_key)
139
- "{#{name_for_case(case_key)}}"
140
- end
138
+ # used by the translator submit dialog
139
+ def sanitized_name_for_case(case_key)
140
+ "{#{name_for_case(case_key)}}"
141
+ end
141
142
 
142
- def type
143
- return nil unless caseless_name.index(':')
144
- @type ||= begin
145
- parts = caseless_name.split(':')
146
- if parts.size == 1 # provided : without a type
147
- nil
148
- else
149
- parts.last
143
+ def type
144
+ return nil unless caseless_name.index(':')
145
+ @type ||= begin
146
+ parts = caseless_name.split(':')
147
+ if parts.size == 1 # provided : without a type
148
+ nil
149
+ else
150
+ parts.last
151
+ end
150
152
  end
151
153
  end
152
- end
153
154
 
154
- def has_type?
155
- not type.blank?
156
- end
155
+ def has_type?
156
+ not type.blank?
157
+ end
157
158
 
158
- def language_rules
159
- @language_rules ||= begin
160
- if has_type? # if token has a type - force that type and nothing else
161
- rule = Tr8n::Config.language_rule_dependencies[type]
162
- unless rule
163
- raise Tr8n::TokenException.new("Unknown dependency type for #{full_name} token")
159
+ def language_rules
160
+ @language_rules ||= begin
161
+ if has_type? # if token has a type - force that type and nothing else
162
+ rule = Tr8n::Config.language_rule_dependencies[type]
163
+ unless rule
164
+ raise Tr8n::TokenException.new("Unknown dependency type for #{full_name} token")
165
+ end
166
+ [rule]
167
+ else # find all language rules for the suffix
168
+ [] + Tr8n::Config.language_rules_for_suffix(suffix)
164
169
  end
165
- [rule]
166
- else # find all language rules for the suffix
167
- [] + Tr8n::Config.language_rules_for_suffix(suffix)
168
170
  end
169
171
  end
170
- end
171
172
 
172
- def dependency_rules
173
- @dependency_rules ||= language_rules.select{|rule| rule.transformable?}
174
- end
173
+ def dependency_rules
174
+ @dependency_rules ||= language_rules.select{|rule| rule.transformable?}
175
+ end
175
176
 
176
- def dependencies
177
- return nil unless dependant?
178
- @dependencies ||= language_rules.collect{|rule| rule.dependency}
179
- end
177
+ def dependencies
178
+ return nil unless dependant?
179
+ @dependencies ||= language_rules.collect{|rule| rule.dependency}
180
+ end
180
181
 
181
- def dependency
182
- return nil unless dependant?
183
- @dependency ||= language_rule.dependency
184
- end
182
+ def dependency
183
+ return nil unless dependant?
184
+ @dependency ||= language_rule.dependency
185
+ end
185
186
 
186
- # used for transform tokens - be aware that if you have multiple rules on a token - the first one will be selected
187
- def language_rule
188
- @language_rule ||= dependency_rules.first
189
- end
187
+ # used for transform tokens - be aware that if you have multiple rules on a token - the first one will be selected
188
+ def language_rule
189
+ @language_rule ||= dependency_rules.first
190
+ end
190
191
 
191
- def dependant?
192
- not dependency_rules.empty?
193
- end
192
+ def dependant?
193
+ not dependency_rules.empty?
194
+ end
194
195
 
195
- def sanitize_token_value(object, value, options, language)
196
- value = "#{value.to_s}" unless value.is_a?(String)
196
+ def sanitize_token_value(object, value, options, language)
197
+ value = "#{value.to_s}" unless value.is_a?(String)
198
+
199
+ unless Tr8n::Config.block_options[:skip_html_escaping]
200
+ if options[:sanitize_values] and not value.html_safe?
201
+ value = ERB::Util.html_escape(value)
202
+ end
203
+ end
197
204
 
198
- unless Tr8n::Config.block_options[:skip_html_escaping]
199
- if options[:sanitize_values] and not value.html_safe?
200
- value = ERB::Util.html_escape(value)
205
+ if has_case_key?
206
+ value = apply_case(object, value, options, language)
201
207
  end
202
- end
203
208
 
204
- if has_case_key?
205
- value = apply_case(object, value, options, language)
209
+ value
206
210
  end
207
-
208
- value
209
- end
210
211
 
211
- def decoration?
212
- false
213
- end
212
+ def decoration?
213
+ false
214
+ end
214
215
 
215
- ##############################################################################
216
- #
217
- # gets the value based on various evaluation methods
218
- #
219
- # examples:
220
- #
221
- # tr("Hello {user}", "", {:user => [current_user, current_user.name]}}
222
- # tr("Hello {user}", "", {:user => [current_user, "{$0} {$1}", "param1"]}}
223
- # tr("Hello {user}", "", {:user => [current_user, :name]}}
224
- # tr("Hello {user}", "", {:user => [current_user, :method_name, "param1"]}}
225
- # tr("Hello {user}", "", {:user => [current_user, lambda{|user| user.name}]}}
226
- # tr("Hello {user}", "", {:user => [current_user, lambda{|user, param1| user.name}, "param1"]}}
227
- #
228
- ##############################################################################
229
- def evaluate_token_method_array(object, method_array, options, language)
230
- # if single object in the array return string value of the object
231
- if method_array.size == 1
232
- return sanitize_token_value(object, object.to_s, options, language)
233
- end
216
+ ##############################################################################
217
+ #
218
+ # gets the value based on various evaluation methods
219
+ #
220
+ # examples:
221
+ #
222
+ # tr("Hello {user}", "", {:user => [current_user, current_user.name]}}
223
+ # tr("Hello {user}", "", {:user => [current_user, "{$0} {$1}", "param1"]}}
224
+ # tr("Hello {user}", "", {:user => [current_user, :name]}}
225
+ # tr("Hello {user}", "", {:user => [current_user, :method_name, "param1"]}}
226
+ # tr("Hello {user}", "", {:user => [current_user, lambda{|user| user.name}]}}
227
+ # tr("Hello {user}", "", {:user => [current_user, lambda{|user, param1| user.name}, "param1"]}}
228
+ #
229
+ ##############################################################################
230
+ def evaluate_token_method_array(object, method_array, options, language)
231
+ # if single object in the array return string value of the object
232
+ if method_array.size == 1
233
+ return sanitize_token_value(object, object.to_s, options, language)
234
+ end
234
235
 
235
- # second params identifies the method to be used with the object
236
- method = method_array.second
237
- params = method_array[2..-1]
238
- params_with_object = [object] + params
239
-
240
- # if the second param is a string, substitute all of the numeric params,
241
- # with the original object and all the following params
242
- if method.is_a?(String)
243
- parametrized_value = method.clone
244
- if parametrized_value.index("{$")
245
- params_with_object.each_with_index do |val, i|
246
- parametrized_value.gsub!("{$#{i}}", sanitize_token_value(object, val, options.merge(:skip_decorations => true), language))
236
+ # second params identifies the method to be used with the object
237
+ method = method_array.second
238
+ params = method_array[2..-1]
239
+ params_with_object = [object] + params
240
+
241
+ # if the second param is a string, substitute all of the numeric params,
242
+ # with the original object and all the following params
243
+ if method.is_a?(String)
244
+ parametrized_value = method.clone
245
+ if parametrized_value.index("{$")
246
+ params_with_object.each_with_index do |val, i|
247
+ parametrized_value.gsub!("{$#{i}}", sanitize_token_value(object, val, options.merge(:skip_decorations => true), language))
248
+ end
247
249
  end
250
+ return sanitize_token_value(object, parametrized_value, options, language)
248
251
  end
249
- return sanitize_token_value(object, parametrized_value, options, language)
250
- end
251
252
 
252
- # if second param is symbol, invoke the method on the object with the remaining values
253
- if method.is_a?(Symbol)
254
- return sanitize_token_value(object, object.send(method, *params), options.merge(:sanitize_values => true), language)
255
- end
253
+ # if second param is symbol, invoke the method on the object with the remaining values
254
+ if method.is_a?(Symbol)
255
+ return sanitize_token_value(object, object.send(method, *params), options.merge(:sanitize_values => true), language)
256
+ end
256
257
 
257
- # if second param is lambda, call lambda with the remaining values
258
- if method.is_a?(Proc)
259
- return sanitize_token_value(object, method.call(*params_with_object), options, language)
260
- end
258
+ # if second param is lambda, call lambda with the remaining values
259
+ if method.is_a?(Proc)
260
+ return sanitize_token_value(object, method.call(*params_with_object), options, language)
261
+ end
261
262
 
262
- raise Tr8n::TokenException.new("Invalid array second token value: #{full_name} in #{original_label}")
263
- end
263
+ raise Tr8n::TokenException.new("Invalid array second token value: #{full_name} in #{original_label}")
264
+ end
264
265
 
265
- ##############################################################################
266
- #
267
- # tr("Hello {user_list}!", "", {:user_list => [[user1, user2, user3], :name]}}
268
- #
269
- # first element is an array, the rest of the elements are similar to the
270
- # regular tokens lambda, symbol, string, with parameters that follow
271
- #
272
- # if you want to pass options, then make the second parameter an array as well
273
- # tr("{user_list} joined Geni", "",
274
- # {:user_list => [[user1, user2, user3],
275
- # [:name], # this can be any of the value methods
276
- # { :expandable => true,
277
- # :to_sentence => true,
278
- # :limit => 4,
279
- # :separator => ',',
280
- # :translate_items => false,
281
- # :minimizable => true
282
- # }
283
- # ]
284
- # ]})
285
- #
286
- # acceptable params: expandable,
287
- # to_sentence,
288
- # limit,
289
- # separator,
290
- # translate_items,
291
- # minimizable
292
- #
293
- ##############################################################################
294
- def token_array_value(token_value, options, language)
295
- objects = token_value.first
266
+ ##############################################################################
267
+ #
268
+ # tr("Hello {user_list}!", "", {:user_list => [[user1, user2, user3], :name]}}
269
+ #
270
+ # first element is an array, the rest of the elements are similar to the
271
+ # regular tokens lambda, symbol, string, with parameters that follow
272
+ #
273
+ # if you want to pass options, then make the second parameter an array as well
274
+ # tr("{user_list} joined Geni", "",
275
+ # {:user_list => [[user1, user2, user3],
276
+ # [:name], # this can be any of the value methods
277
+ # { :expandable => true,
278
+ # :to_sentence => true,
279
+ # :limit => 4,
280
+ # :separator => ',',
281
+ # :translate_items => false,
282
+ # :minimizable => true
283
+ # }
284
+ # ]
285
+ # ]})
286
+ #
287
+ # acceptable params: expandable,
288
+ # to_sentence,
289
+ # limit,
290
+ # separator,
291
+ # translate_items,
292
+ # minimizable
293
+ #
294
+ ##############################################################################
295
+ def token_array_value(token_value, options, language)
296
+ objects = token_value.first
296
297
 
297
- objects = objects.collect do |obj|
298
- if token_value.second.is_a?(Array)
299
- evaluate_token_method_array(obj, [obj] + token_value.second, options, language)
300
- else
301
- evaluate_token_method_array(obj, token_value, options, language)
298
+ objects = objects.collect do |obj|
299
+ if token_value.second.is_a?(Array)
300
+ evaluate_token_method_array(obj, [obj] + token_value.second, options, language)
301
+ else
302
+ evaluate_token_method_array(obj, token_value, options, language)
303
+ end
302
304
  end
303
- end
304
305
 
305
- list_options = {
306
- :translate_items => false,
307
- :expandable => true,
308
- :minimizable => true,
309
- :to_sentence => true,
310
- :limit => 4,
311
- :separator => ", "
312
- }
306
+ list_options = {
307
+ :translate_items => false,
308
+ :expandable => true,
309
+ :minimizable => true,
310
+ :to_sentence => true,
311
+ :limit => 4,
312
+ :separator => ", "
313
+ }
313
314
 
314
- if token_value.second.is_a?(Array) and token_value.size == 3
315
- list_options.merge!(token_value.last)
316
- end
315
+ if token_value.second.is_a?(Array) and token_value.size == 3
316
+ list_options.merge!(token_value.last)
317
+ end
317
318
 
318
- objects = objects.collect{|obj| obj.translate("List element", {}, options)} if list_options[:translate_items]
319
+ objects = objects.collect{|obj| obj.translate("List element", {}, options)} if list_options[:translate_items]
319
320
 
320
- # if there is only one element in the array, use it and get out
321
- return objects.first if objects.size == 1
321
+ # if there is only one element in the array, use it and get out
322
+ return objects.first if objects.size == 1
322
323
 
323
- list_options[:expandable] = false if options[:skip_decorations]
324
+ list_options[:expandable] = false if options[:skip_decorations]
324
325
 
325
- return objects.join(list_options[:separator]) unless list_options[:to_sentence]
326
+ return objects.join(list_options[:separator]) unless list_options[:to_sentence]
326
327
 
327
- if objects.size <= list_options[:limit]
328
- return "#{objects[0..-2].join(list_options[:separator])} #{"and".translate("List elements joiner", {}, options)} #{objects.last}"
329
- end
328
+ if objects.size <= list_options[:limit]
329
+ return "#{objects[0..-2].join(list_options[:separator])} #{"and".translate("List elements joiner", {}, options)} #{objects.last}"
330
+ end
330
331
 
331
- display_ary = objects[0..(list_options[:limit]-1)]
332
- remaining_ary = objects[list_options[:limit]..-1]
333
- result = "#{display_ary.join(list_options[:separator])}"
332
+ display_ary = objects[0..(list_options[:limit]-1)]
333
+ remaining_ary = objects[list_options[:limit]..-1]
334
+ result = "#{display_ary.join(list_options[:separator])}"
334
335
 
335
- unless list_options[:expandable]
336
- result << " " << "and".translate("List elements joiner", {}, options) << " "
337
- result << "{num} {_others}".translate("List elements joiner",
338
- {:num => remaining_ary.size, :_others => "other".pluralize_for(remaining_ary.size)}, options)
339
- return result
340
- end
336
+ unless list_options[:expandable]
337
+ result << " " << "and".translate("List elements joiner", {}, options) << " "
338
+ result << "{num} {_others}".translate("List elements joiner",
339
+ {:num => remaining_ary.size, :_others => "other".pluralize_for(remaining_ary.size)}, options)
340
+ return result
341
+ end
341
342
 
342
- uniq_id = Tr8n::TranslationKey.generate_key(original_label, objects.join(","))
343
- result << "<span id=\"tr8n_other_link_#{uniq_id}\">" << " " << "and".translate("List elements joiner", {}, options) << " "
344
- result << "<a href='#' onClick=\"Tr8n.Effects.hide('tr8n_other_link_#{uniq_id}'); Tr8n.Effects.show('tr8n_other_elements_#{uniq_id}'); return false;\">"
345
- result << "{num|| other}".translate("List elements joiner", {:num => remaining_ary.size}, options)
346
- result << "</a></span>"
347
- result << "<span id=\"tr8n_other_elements_#{uniq_id}\" style='display:none'>" << list_options[:separator]
348
- result << "#{remaining_ary[0..-2].join(list_options[:separator])} #{"and".translate("List elements joiner", {}, options)} #{remaining_ary.last}"
349
-
350
- if list_options[:minimizable]
351
- result << "<a href='#' style='font-size:smaller;white-space:nowrap' onClick=\"Tr8n.Effects.show('tr8n_other_link_#{uniq_id}'); Tr8n.Effects.hide('tr8n_other_elements_#{uniq_id}'); return false;\"> "
352
- result << "&laquo; less".translate("List elements joiner", {}, options)
353
- result << "</a>"
354
- end
343
+ uniq_id = Tr8n::TranslationKey.generate_key(original_label, objects.join(","))
344
+ result << "<span id=\"tr8n_other_link_#{uniq_id}\">" << " " << "and".translate("List elements joiner", {}, options) << " "
345
+ result << "<a href='#' onClick=\"Tr8n.Effects.hide('tr8n_other_link_#{uniq_id}'); Tr8n.Effects.show('tr8n_other_elements_#{uniq_id}'); return false;\">"
346
+ result << "{num|| other}".translate("List elements joiner", {:num => remaining_ary.size}, options)
347
+ result << "</a></span>"
348
+ result << "<span id=\"tr8n_other_elements_#{uniq_id}\" style='display:none'>" << list_options[:separator]
349
+ result << "#{remaining_ary[0..-2].join(list_options[:separator])} #{"and".translate("List elements joiner", {}, options)} #{remaining_ary.last}"
350
+
351
+ if list_options[:minimizable]
352
+ result << "<a href='#' style='font-size:smaller;white-space:nowrap' onClick=\"Tr8n.Effects.show('tr8n_other_link_#{uniq_id}'); Tr8n.Effects.hide('tr8n_other_elements_#{uniq_id}'); return false;\"> "
353
+ result << "&laquo; less".translate("List elements joiner", {}, options)
354
+ result << "</a>"
355
+ end
355
356
 
356
- result << "</span>"
357
- end
357
+ result << "</span>"
358
+ end
358
359
 
359
- # evaluate all possible methods for the token value and return sanitized result
360
- def token_value(object, options, language)
361
- # token is an array
362
- if object.is_a?(Array)
363
- # if you provided an array, it better have some values
364
- if object.empty?
365
- return raise Tr8n::TokenException.new("Invalid array value for a token: #{full_name}")
366
- end
360
+ # evaluate all possible methods for the token value and return sanitized result
361
+ def token_value(object, options, language)
362
+ # token is an array
363
+ if object.is_a?(Array)
364
+ # if you provided an array, it better have some values
365
+ if object.empty?
366
+ return raise Tr8n::TokenException.new("Invalid array value for a token: #{full_name}")
367
+ end
367
368
 
368
- # if the first value of an array is an array handle it here
369
- if object.first.kind_of?(Enumerable)
370
- return token_array_value(object, options, language)
369
+ # if the first value of an array is an array handle it here
370
+ if object.first.kind_of?(Enumerable)
371
+ return token_array_value(object, options, language)
372
+ end
373
+
374
+ # if the first item in the array is an object, process it
375
+ return evaluate_token_method_array(object.first, object, options, language)
371
376
  end
372
377
 
373
- # if the first item in the array is an object, process it
374
- return evaluate_token_method_array(object.first, object, options, language)
378
+ # simple token
379
+ sanitize_token_value(object, object.to_s, options, language)
375
380
  end
376
381
 
377
- # simple token
378
- sanitize_token_value(object, object.to_s, options, language)
379
- end
380
-
381
- def allowed_in_translation?
382
- true
383
- end
382
+ def allowed_in_translation?
383
+ true
384
+ end
384
385
 
385
- ##############################################################################
386
- #
387
- # chooses the appropriate case for the token value. case is identified with ::
388
- #
389
- # examples:
390
- #
391
- # tr("Hello {user::nom}", "", :user => current_user)
392
- # tr("{actor} gave {target::dat} a present", "", :actor => user1, :target => user2)
393
- # tr("This is {user::pos} toy", "", :user => current_user)
394
- #
395
- ##############################################################################
396
- def apply_case(object, value, options, language)
397
- return value unless Tr8n::Config.enable_language_cases?
398
- lcase = language.case_for(case_key)
399
- return value unless lcase
400
- lcase.apply(object, value, options)
401
- end
386
+ ##############################################################################
387
+ #
388
+ # chooses the appropriate case for the token value. case is identified with ::
389
+ #
390
+ # examples:
391
+ #
392
+ # tr("Hello {user::nom}", "", :user => current_user)
393
+ # tr("{actor} gave {target::dat} a present", "", :actor => user1, :target => user2)
394
+ # tr("This is {user::pos} toy", "", :user => current_user)
395
+ #
396
+ ##############################################################################
397
+ def apply_case(object, value, options, language)
398
+ return value unless Tr8n::Config.enable_language_cases?
399
+ lcase = language.case_for(case_key)
400
+ return value unless lcase
401
+ lcase.apply(object, value, options)
402
+ end
402
403
 
403
- def substitute(label, values = {}, options = {}, language = Tr8n::Config.current_language)
404
+ def substitute(label, values = {}, options = {}, language = Tr8n::Config.current_language)
404
405
 
405
- # get the object from the values
406
- object = values[name_key]
406
+ # get the object from the values
407
+ object = values[name_key]
407
408
 
408
- # see if the token is a default html token
409
- object = Tr8n::Config.default_data_tokens[name_key] if object.nil?
409
+ # see if the token is a default html token
410
+ object = Tr8n::Config.default_data_tokens[name_key] if object.nil?
410
411
 
411
- if object.nil? and not values.key?(name_key)
412
- raise Tr8n::TokenException.new("Missing value for a token: #{full_name}")
413
- end
412
+ if object.nil? and not values.key?(name_key)
413
+ raise Tr8n::TokenException.new("Missing value for a token: #{full_name}")
414
+ end
414
415
 
415
- if object.nil? and not Tr8n::Config.allow_nil_token_values?
416
- raise Tr8n::TokenException.new("Token value is nil for a token: #{full_name}")
417
- end
416
+ if object.nil? and not Tr8n::Config.allow_nil_token_values?
417
+ raise Tr8n::TokenException.new("Token value is nil for a token: #{full_name}")
418
+ end
418
419
 
419
- object = object.to_s if object.nil?
420
+ object = object.to_s if object.nil?
420
421
 
421
- value = token_value(object, options, language)
422
- label.gsub(full_name, value)
423
- end
422
+ value = token_value(object, options, language)
423
+ label.gsub(full_name, value)
424
+ end
424
425
 
425
- # return sanitized form
426
- def prepare_label_for_translator(label)
427
- label.gsub(full_name, sanitized_name)
428
- end
426
+ # return sanitized form
427
+ def prepare_label_for_translator(label)
428
+ label.gsub(full_name, sanitized_name)
429
+ end
429
430
 
430
- # return tokenless form
431
- def prepare_label_for_suggestion(label, index)
432
- label.gsub(full_name, "(#{index})")
433
- end
431
+ # return tokenless form
432
+ def prepare_label_for_suggestion(label, index)
433
+ label.gsub(full_name, "(#{index})")
434
+ end
434
435
 
435
- def to_s
436
- full_name
436
+ def to_s
437
+ full_name
438
+ end
437
439
  end
438
440
  end