tr8n 3.0.5 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
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