tr8n 3.0.5 → 3.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.rvmrc +1 -0
- data/Gemfile +12 -6
- data/Gemfile.lock +143 -60
- data/MIT-LICENSE +20 -0
- data/Rakefile +39 -22
- data/{lib/tasks → app/assets/images/tr8n}/.gitkeep +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/accept.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/action_tab_bkgd.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/action_tab_white_bkgd.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/add.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/arrow_down.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/arrow_down.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/arrow_down_grey.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/arrow_right.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/arrow_up.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/arrow_up_grey.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/bullet_go.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/buttons.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/cancel.png +0 -0
- data/app/assets/images/tr8n/checkmark.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/close.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/cross.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/delete.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/disk.png +0 -0
- data/app/assets/images/tr8n/error.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/context_rules_1.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/context_rules_2.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/date_rules_1.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/date_rules_2.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/date_rules_3.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/gender_rules_1.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/gender_rules_2.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/gender_rules_3.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/language_manager_1.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/list_rules_1.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/list_rules_2.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/list_rules_3.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/numeric_rules_1.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/numeric_rules_2.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/numeric_rules_3.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/examples/numeric_rules_4.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/exclamation.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/eye.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/eye_not.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/facebook/connect_light_medium_long.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/field_sprite.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/find.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ab.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ach.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/af.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ak.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/am.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/an.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-AE.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-BH.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-DZ.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-EG.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-IQ.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-JO.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-KW.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-LB.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-LY.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-MA.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-OM.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-QA.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-SA.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-SY.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-TN.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar-YE.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ar.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/as.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ast.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ay.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/az.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ba.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/be.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/bg.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/bh.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/bn.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/bo.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/br.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/bs.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ca.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/cb.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ce.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ch.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ck-US.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/co.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/cr.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/cs.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/cv.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/cy.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/da.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/de-AT.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/de-CH.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/de-DE.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/de-LI.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/de-LU.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/de.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/el.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-AU.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-BZ.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-CA.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-IE.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-JM.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-NZ.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-PH.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-PI.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-SC.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-UK.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-US.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-ZA.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/en-ZW.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/en.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/eo.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-AR.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-BO.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-CL.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-CO.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-CR.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-DO.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-EC.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-ES.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-GT.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-HN.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-MX.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-NI.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-PA.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-PE.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-PR.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-PY.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-SV.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-UY.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es-VE.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/es.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/et.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/eu.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fa-IR.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fa.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fb-LT.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fi.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fj.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fo.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fr-BE.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fr-CA.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fr-CH.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fr-FR.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fr-LU.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fr-MC.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fr.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fur.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/fy.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ga.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/gd.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/gl.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/gn.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/gu.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/gv.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ha.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/haw.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/he.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/hi.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/hr.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/hsb.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ht.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/hu.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/hy.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ia.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/id.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ie.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ig.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/is.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/it-CH.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/it.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/iu.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ja.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/jw.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ka.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/kk.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/kl.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/km.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/kn.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ko-KP.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ko-KR.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ko.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/kok.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ks.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ku.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ky.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/la.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/lb.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/lg.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/li-NL.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ln.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/lo.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/lt.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/lv.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/md.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/mfe.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/mg.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/mh.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/mi.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/mk.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ml.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/mn.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/mo.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/mr.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ms.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/mt.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/my.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/na.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/nb.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/nd.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ne.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ng.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/nl-NE.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/nl.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/nn.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/no.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/nr.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/nso.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/nv.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ny.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/nyn.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/oc.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/om.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/or.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/pa-IN.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/pa-PK.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/pa.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/pf.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/pl.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/pp.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ps.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/pt-BZ.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/pt.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/qu-PE.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/qu.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/rj.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/rm.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/rn.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ro-MD.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ro-RO.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ro.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ru.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/rw.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sa.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sc.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sd.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/se-NO.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sg.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sh.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/si.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sk.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sl.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sm.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sn.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/so.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sq.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sr-me.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sr.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ss.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/st.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/su.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sv-FI.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sv-SE.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sv.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/sw.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ta.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/te.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/tg.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/th.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ti.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/tig.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/tk.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/tl.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/tlh.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/tn.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/to.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/tr.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ts.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/tt.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/tw.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ug.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/uk.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ur.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/uz.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/ve.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/vi.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/vo.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/wa.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/wo.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/xh.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/yi.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/yo.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/zh-CN.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/zh-HK.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/zh-SG.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/zh-TW.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/zh.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/flags/zu.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/globe.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/help.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/help/color_coding.png +0 -0
- data/app/assets/images/tr8n/help/cousin.png +0 -0
- data/app/assets/images/tr8n/help/half-cousin.png +0 -0
- data/app/assets/images/tr8n/help/hindu_family_tree.jpg +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/help/language_selector.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/help/language_selector_default.png +0 -0
- data/app/assets/images/tr8n/help/language_selector_v2.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/help/languages_disabled.png +0 -0
- data/app/assets/images/tr8n/help/path.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/help/translator.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/help2.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/information.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/keyboard.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/language_selector_arrow.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/left_quote.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/lightning.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/loading.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/loading2.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/loading3.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/loading_large.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/lock.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/lock_add.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/lock_delete.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/lock_open.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/medals/bronze.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/medals/gold.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/medals/runner.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/medals/silver.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/pencil.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/photo_silhouette.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/plus.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/random.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/random2.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/rating_star0.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/rating_star05.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/rating_star1.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/rating_stars.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/rating_stars.psd +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/reply.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/right_quote.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/rotating_world.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/script.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/script_edit.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/script_gear.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/site_sprite.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/spinner.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/star.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/table_edit.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/table_gear.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/table_multiple.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/thumb_down.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/thumb_up.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/toolbar_bg.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/top_left_stem.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/top_right_stem.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/tr8n_loading.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/tr8n_logo.jpg +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/tr8n_logo.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/tr8n_logo2.gif +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/tr8n_logo2.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/tr8n_logo_wiki.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/tr8n_logo_wiki2.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/translate_icn.gif +0 -0
- data/app/assets/images/tr8n/warning.png +0 -0
- data/{public/tr8n/images → app/assets/images/tr8n}/wizard.png +0 -0
- data/app/assets/javascripts/tr8n/application.js +7 -0
- data/{public/tr8n/javascripts → app/assets/javascripts/tr8n}/jsDraw2D.js +0 -0
- data/{public/tr8n/javascripts → app/assets/javascripts/tr8n}/keyboard_1_36.js +1 -1
- data/{public/tr8n/javascripts → app/assets/javascripts/tr8n}/keyboard_1_44.js +0 -0
- data/{public/tr8n/javascripts → app/assets/javascripts/tr8n}/shortcut.js +0 -0
- data/{public/tr8n/javascripts → app/assets/javascripts/tr8n}/tr8n.js +18 -30
- data/{public/tr8n/javascripts → app/assets/javascripts/tr8n}/tr8n_client_sdk.js +0 -0
- data/{public/tr8n/javascripts → app/assets/javascripts/tr8n}/tr8n_prototype_effects.js +1 -1
- data/app/assets/stylesheets/tr8n/application.css +6 -0
- data/{public/tr8n/stylesheets → app/assets/stylesheets/tr8n}/keyboard_1_36.css +0 -0
- data/{public/tr8n/stylesheets → app/assets/stylesheets/tr8n}/keyboard_1_44.css +0 -0
- data/{public/tr8n/stylesheets/tr8n.css → app/assets/stylesheets/tr8n/tr8n.css.scss} +272 -37
- data/app/controllers/{application_controller.rb → tr8n/application_controller.rb} +3 -4
- data/app/controllers/tr8n/awards_controller.rb +2 -4
- data/app/controllers/tr8n/dashboard_controller.rb +6 -5
- data/app/controllers/tr8n/forum_controller.rb +2 -2
- data/app/controllers/tr8n/glossary_controller.rb +3 -9
- data/app/controllers/tr8n/home_controller.rb +1 -1
- data/app/controllers/tr8n/language_controller.rb +276 -270
- data/app/controllers/tr8n/phrases_controller.rb +9 -19
- data/app/controllers/tr8n/translations_controller.rb +1 -2
- data/app/helpers/tr8n/admin/base_helper.rb +1 -1
- data/app/helpers/{application_helper.rb → tr8n/application_helper.rb} +3 -2
- data/app/helpers/tr8n/base_helper.rb +5 -1
- data/app/models/tr8n/language.rb +1 -0
- data/app/models/tr8n/language_case_filter.rb +1 -1
- data/app/models/tr8n/language_case_rule_filter.rb +1 -1
- data/app/models/tr8n/language_case_value_map_filter.rb +4 -0
- data/app/models/tr8n/language_forum_abuse_report_filter.rb +4 -0
- data/app/models/tr8n/language_forum_message_filter.rb +4 -0
- data/app/models/tr8n/language_forum_topic_filter.rb +4 -0
- data/app/models/tr8n/language_metric.rb +1 -1
- data/app/models/tr8n/language_metric_filter.rb +4 -0
- data/app/models/tr8n/language_rule_filter.rb +7 -3
- data/app/models/tr8n/language_user_filter.rb +4 -4
- data/app/models/tr8n/translation.rb +12 -33
- data/app/models/tr8n/translation_filter.rb +4 -4
- data/app/models/tr8n/translation_key.rb +32 -55
- data/app/models/tr8n/translation_key_comment_filter.rb +1 -1
- data/app/models/tr8n/translation_key_lock_filter.rb +1 -1
- data/app/models/tr8n/translation_key_source_filter.rb +1 -1
- data/app/models/tr8n/translation_source_filter.rb +1 -1
- data/app/models/tr8n/translation_vote_filter.rb +4 -4
- data/app/models/tr8n/translator_filter.rb +4 -0
- data/app/models/tr8n/translator_following_filter.rb +4 -4
- data/app/models/tr8n/translator_log_filter.rb +4 -4
- data/app/models/tr8n/translator_metric_filter.rb +4 -4
- data/app/models/tr8n/translator_report_filter.rb +1 -1
- data/app/views/layouts/tr8n/application.html.erb +14 -0
- data/app/views/tr8n/admin/clientsdk/lb_samples.html.erb +31 -29
- data/app/views/tr8n/admin/common/_lightbox_buttons.html.erb +1 -1
- data/app/views/tr8n/admin/domain/index.html.erb +1 -1
- data/app/views/tr8n/admin/domain/{key_sources.rhtml → key_sources.html.erb} +1 -1
- data/app/views/tr8n/admin/domain/lb_caller.html.erb +39 -35
- data/app/views/tr8n/admin/domain/sources.html.erb +1 -1
- data/app/views/tr8n/admin/glossary/lb_update.html.erb +33 -26
- data/app/views/tr8n/admin/language/index.html.erb +3 -3
- data/app/views/tr8n/admin/language/lb_update.html.erb +86 -76
- data/app/views/tr8n/admin/language/lb_value_map.html.erb +45 -41
- data/app/views/tr8n/admin/language/{metrics.rhtml → metrics.html.erb} +0 -0
- data/app/views/tr8n/admin/language/{users.rhtml → users.html.erb} +0 -0
- data/app/views/tr8n/admin/translation/{votes.rhtml → votes.html.erb} +0 -0
- data/app/views/tr8n/admin/translation_key/comments.html.erb +1 -1
- data/app/views/tr8n/admin/translation_key/index.html.erb +1 -1
- data/app/views/tr8n/admin/translation_key/lb_merge.html.erb +15 -3
- data/app/views/tr8n/admin/translation_key/lb_update.html.erb +54 -44
- data/app/views/tr8n/admin/translation_key/locks.html.erb +1 -1
- data/app/views/tr8n/admin/translator/lb_register.html.erb +27 -18
- data/app/views/tr8n/awards/_list.html.erb +11 -11
- data/app/views/tr8n/awards/index.html.erb +1 -1
- data/app/views/tr8n/common/_flashes.html.erb +58 -16
- data/app/views/tr8n/common/_language_selector.html.erb +10 -6
- data/app/views/tr8n/common/_paginator.html.erb +8 -2
- data/app/views/tr8n/common/_scripts.html.erb +6 -5
- data/app/views/tr8n/common/_splash_screen.html.erb +2 -2
- data/app/views/tr8n/common/_translation_votes.html.erb +5 -5
- data/app/views/tr8n/dashboard/_forum.html.erb +13 -11
- data/app/views/tr8n/dashboard/_language_metric.html.erb +1 -1
- data/app/views/tr8n/dashboard/_translations.html.erb +1 -10
- data/app/views/tr8n/dashboard/_translator_metric.html.erb +1 -1
- data/app/views/tr8n/dashboard/_votes.html.erb +4 -13
- data/app/views/tr8n/dashboard/{index.rhtml → index.html.erb} +3 -3
- data/app/views/tr8n/forum/_messages.html.erb +2 -9
- data/app/views/tr8n/forum/_new_message.html.erb +1 -1
- data/app/views/tr8n/forum/_new_topic.html.erb +1 -1
- data/app/views/tr8n/forum/index.html.erb +3 -10
- data/app/views/tr8n/forum/topic.html.erb +2 -2
- data/app/views/tr8n/glossary/index.html.erb +2 -2
- data/app/views/tr8n/help/_footer.html.erb +4 -0
- data/app/views/tr8n/help/_header.html.erb +106 -0
- data/app/views/tr8n/help/_navigation.html.erb +80 -116
- data/app/views/tr8n/help/advanced_tools.html.erb +13 -0
- data/app/views/tr8n/help/awards.html.erb +8 -8
- data/app/views/tr8n/help/creating_translations.html.erb +19 -9
- data/app/views/tr8n/help/dashboard.html.erb +34 -7
- data/app/views/tr8n/help/discussions.html.erb +8 -8
- data/app/views/tr8n/help/help.html.erb +14 -0
- data/app/views/tr8n/help/index.html.erb +15 -10
- data/app/views/tr8n/help/inline_translator.html.erb +59 -0
- data/app/views/tr8n/help/language_selector.html.erb +46 -6
- data/app/views/tr8n/help/management.html.erb +42 -0
- data/app/views/tr8n/help/phrases.html.erb +12 -13
- data/app/views/tr8n/help/{translation_rank.html.erb → ranks.html.erb} +20 -10
- data/app/views/tr8n/help/relationships.html.erb +14 -0
- data/app/views/tr8n/help/site_map.html.erb +18 -11
- data/app/views/tr8n/help/translations.html.erb +8 -8
- data/app/views/tr8n/help/voting_on_translations.html.erb +8 -8
- data/app/views/tr8n/home/credits.html.erb +1 -2
- data/app/views/tr8n/home/index.html.erb +43 -31
- data/app/views/tr8n/language/_basic_info.html.erb +1 -1
- data/app/views/tr8n/language/_edit_language_case_rules.html.erb +7 -7
- data/app/views/tr8n/language/_edit_language_cases.html.erb +2 -2
- data/app/views/tr8n/language/_edit_rules.html.erb +2 -2
- data/app/views/tr8n/language/_grammar.html.erb +1 -1
- data/app/views/tr8n/language/_header.html.erb +3 -3
- data/app/views/tr8n/language/_language_cases.html.erb +2 -2
- data/app/views/tr8n/language/_lists.html.erb +3 -3
- data/app/views/tr8n/language/_prohibited_words.html.erb +1 -1
- data/app/views/tr8n/language/_select.html.erb +106 -0
- data/app/views/tr8n/language/_translator_header.html.erb +2 -2
- data/app/views/tr8n/language/_translator_submit.html.erb +2 -2
- data/app/views/tr8n/language/lb_language_case_rule.html.erb +45 -39
- data/app/views/tr8n/language/select.html.erb +3 -3
- data/app/views/tr8n/language/translator.html.erb +2 -2
- data/app/views/tr8n/phrases/_breadcrumb.html.erb +1 -1
- data/app/views/tr8n/phrases/_comments_module.html.erb +19 -26
- data/app/views/tr8n/phrases/{_dictionary.rhtml → _dictionary.html.erb} +0 -0
- data/app/views/tr8n/phrases/_header.html.erb +5 -5
- data/app/views/tr8n/phrases/_new_comment.html.erb +1 -1
- data/app/views/tr8n/phrases/_permutations_module.html.erb +2 -2
- data/app/views/tr8n/phrases/_tokens.html.erb +1 -1
- data/app/views/tr8n/phrases/_toolbar.html.erb +10 -10
- data/app/views/tr8n/phrases/_translation_module.html.erb +4 -4
- data/app/views/tr8n/phrases/_translations_module.html.erb +2 -2
- data/app/views/tr8n/phrases/index.html.erb +4 -4
- data/app/views/tr8n/phrases/lb_sources.html.erb +8 -12
- data/app/views/tr8n/phrases/map.html.erb +1 -1
- data/app/views/tr8n/translations/_translation.html.erb +10 -10
- data/app/views/tr8n/translations/index.html.erb +2 -2
- data/app/views/tr8n/translator/_basic_info.html.erb +1 -1
- data/app/views/tr8n/translator/_header.html.erb +3 -3
- data/app/views/tr8n/translator/_header_key_report.html.erb +1 -1
- data/app/views/tr8n/translator/lb_report.html.erb +82 -73
- data/config/routes.rb +8 -8
- data/lib/tasks/tr8n_tasks.rake +0 -11
- data/lib/tr8n.rb +3 -1
- data/lib/tr8n/active_dumper.rb +19 -17
- data/lib/tr8n/cache.rb +27 -25
- data/lib/tr8n/config.rb +558 -556
- data/lib/tr8n/dictionary.rb +21 -19
- data/lib/tr8n/engine.rb +24 -25
- data/lib/tr8n/exception.rb +4 -2
- data/lib/tr8n/extender.rb +11 -9
- data/lib/tr8n/extensions/action_controller_extension.rb +158 -0
- data/lib/tr8n/extensions/action_view_extension.rb +395 -0
- data/lib/{core_ext/array.rb → tr8n/extensions/array_extension.rb} +0 -0
- data/lib/{core_ext/date.rb → tr8n/extensions/date_extension.rb} +0 -0
- data/lib/{core_ext/fixnum.rb → tr8n/extensions/fixnum_extension.rb} +0 -0
- data/lib/{core_ext/hash.rb → tr8n/extensions/hash_extension.rb} +0 -0
- data/lib/{core_ext/string.rb → tr8n/extensions/string_extension.rb} +0 -0
- data/lib/{core_ext/time.rb → tr8n/extensions/time_extension.rb} +0 -0
- data/lib/tr8n/ip_address.rb +26 -24
- data/lib/tr8n/key_registration_exception.rb +3 -1
- data/lib/tr8n/keyboard_mapping.rb +147 -145
- data/lib/tr8n/logger.rb +30 -28
- data/lib/{application_controller.rb → tr8n/railtie.rb} +28 -10
- data/lib/tr8n/site_map.rb +48 -46
- data/lib/tr8n/site_map_section.rb +69 -67
- data/lib/tr8n/token.rb +330 -328
- data/lib/tr8n/token_exception.rb +3 -2
- data/lib/tr8n/tokenized_label.rb +90 -88
- data/lib/tr8n/version.rb +3 -0
- data/script/rails +3 -3
- data/test/dummy/.sass-cache/32be4db30d38349a3a6e662df9bb5599dc8033b9/actions.css.scssc +0 -0
- data/test/dummy/.sass-cache/32be4db30d38349a3a6e662df9bb5599dc8033b9/buttons.css.scssc +0 -0
- data/test/dummy/.sass-cache/32be4db30d38349a3a6e662df9bb5599dc8033b9/calendar.css.scssc +0 -0
- data/test/dummy/.sass-cache/32be4db30d38349a3a6e662df9bb5599dc8033b9/exporter.css.scssc +0 -0
- data/test/dummy/.sass-cache/32be4db30d38349a3a6e662df9bb5599dc8033b9/filter.css.scssc +0 -0
- data/test/dummy/.sass-cache/32be4db30d38349a3a6e662df9bb5599dc8033b9/results.css.scssc +0 -0
- data/test/dummy/.sass-cache/3d45bab40fcae805deb2750a9342f5b355a9f2bf/components.css.scssc +0 -0
- data/test/dummy/.sass-cache/3d45bab40fcae805deb2750a9342f5b355a9f2bf/layout.css.scssc +0 -0
- data/test/dummy/.sass-cache/50f723c1dd802042d0091035528d53e6d5bc5b50/tr8n.css.scssc +0 -0
- data/test/dummy/.sass-cache/bce64928c8e2edcba72a647a44f05af1ff119c5d/actions.css.scssc +0 -0
- data/test/dummy/.sass-cache/bce64928c8e2edcba72a647a44f05af1ff119c5d/buttons.css.scssc +0 -0
- data/test/dummy/.sass-cache/bce64928c8e2edcba72a647a44f05af1ff119c5d/calendar.css.scssc +0 -0
- data/test/dummy/.sass-cache/bce64928c8e2edcba72a647a44f05af1ff119c5d/exporter.css.scssc +0 -0
- data/test/dummy/.sass-cache/bce64928c8e2edcba72a647a44f05af1ff119c5d/filter.css.scssc +0 -0
- data/test/dummy/.sass-cache/bce64928c8e2edcba72a647a44f05af1ff119c5d/results.css.scssc +0 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +7 -0
- data/test/dummy/app/assets/stylesheets/admin.css +200 -0
- data/test/dummy/app/assets/stylesheets/application.css +47 -0
- data/{public/tr8n/stylesheets/components.css → test/dummy/app/assets/stylesheets/components.css.scss} +5 -2
- data/test/dummy/app/assets/stylesheets/keyboard.css +147 -0
- data/{public/tr8n/stylesheets/layout.css → test/dummy/app/assets/stylesheets/layout.css.scss} +27 -3
- data/test/dummy/app/controllers/admin/admins_controller.rb +7 -0
- data/test/dummy/app/controllers/admin/base_controller.rb +12 -0
- data/test/dummy/app/controllers/admin/users_controller.rb +19 -0
- data/test/dummy/app/controllers/application_controller.rb +26 -0
- data/test/dummy/app/controllers/demo_controller.rb +7 -0
- data/test/dummy/app/controllers/login_controller.rb +58 -0
- data/test/dummy/app/helpers/application_helper.rb +9 -0
- data/test/dummy/app/helpers/home_helper.rb +2 -0
- data/{public/favicon.ico → test/dummy/app/mailers/.gitkeep} +0 -0
- data/test/dummy/app/models/.gitkeep +0 -0
- data/test/dummy/app/models/admin.rb +4 -0
- data/test/dummy/app/models/admin_filter.rb +9 -0
- data/test/dummy/app/models/user.rb +31 -0
- data/test/dummy/app/views/admin/admins/index.html.erb +7 -0
- data/test/dummy/app/views/admin/users/index.html.erb +10 -0
- data/test/dummy/app/views/demo/index.rhtml +108 -0
- data/test/dummy/app/views/demo/tokens.rhtml +35 -0
- data/test/dummy/app/views/layouts/_flashes.html.erb +86 -0
- data/test/dummy/app/views/layouts/_footer.html.erb +17 -0
- data/test/dummy/app/views/layouts/_header.html.erb +23 -0
- data/test/dummy/app/views/layouts/admin.html.erb +94 -0
- data/test/dummy/app/views/layouts/application.html.erb +25 -0
- data/test/dummy/app/views/login/index.html.erb +32 -0
- data/test/dummy/app/views/login/register.html.erb +61 -0
- data/{config.ru → test/dummy/config.ru} +1 -1
- data/test/dummy/config/application.rb +47 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/{config → test/dummy/config}/environments/development.rb +8 -3
- data/test/dummy/config/environments/production.rb +60 -0
- data/{config → test/dummy/config}/environments/test.rb +9 -2
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +16 -0
- data/test/dummy/config/tr8n/config.yml +247 -0
- data/test/dummy/config/tr8n/data/ip_locations.csv +93460 -0
- data/test/dummy/config/tr8n/rules/default_cases.yml +141 -0
- data/test/dummy/config/tr8n/rules/default_date_rules.yml +20 -0
- data/test/dummy/config/tr8n/rules/default_gender_list_rules.yml +82 -0
- data/test/dummy/config/tr8n/rules/default_gender_rules.yml +20 -0
- data/test/dummy/config/tr8n/rules/default_list_rules.yml +19 -0
- data/test/dummy/config/tr8n/rules/default_numeric_rules.yml +42 -0
- data/test/dummy/config/tr8n/rules/default_value_rules.yml +18 -0
- data/test/dummy/config/tr8n/site/default_glossary.yml +18 -0
- data/test/dummy/config/tr8n/site/default_languages.yml +1591 -0
- data/test/dummy/config/tr8n/site/features.yml +111 -0
- data/test/dummy/config/tr8n/site/shortcuts.yml +55 -0
- data/test/dummy/config/tr8n/site/sitemap.json +42 -0
- data/test/dummy/config/tr8n/tokens/data.yml +19 -0
- data/test/dummy/config/tr8n/tokens/decorations.yml +16 -0
- data/{config → test/dummy/config}/will_filter/config.yml +0 -0
- data/test/dummy/db/migrate/20101207014543_create_users.rb +23 -0
- data/test/dummy/db/migrate/20110113223509_create_admins.rb +15 -0
- data/test/dummy/db/migrate/20110930041143_create_will_filter_filters.rb +15 -0
- data/test/dummy/db/migrate/20110930041150_create_tr8n_tables.rb +350 -0
- data/test/dummy/db/schema.rb +398 -0
- data/test/dummy/lib/assets/.gitkeep +0 -0
- data/test/dummy/log/.gitkeep +0 -0
- data/{public → test/dummy/public}/404.html +0 -0
- data/{public → test/dummy/public}/422.html +0 -0
- data/{public → test/dummy/public}/500.html +0 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/test/functional/home_controller_test.rb +9 -0
- data/test/dummy/test/unit/helpers/home_helper_test.rb +4 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/test_helper.rb +7 -10
- data/test/tr8n_test.rb +7 -0
- data/tr8n.gemspec +33 -34
- metadata +772 -536
- data/.project +0 -18
- data/LICENSE +0 -18
- data/VERSION +0 -1
- data/app/views/tr8n/help/basic_information.html.erb +0 -13
- data/app/views/tr8n/help/context_rules.html.erb +0 -13
- data/app/views/tr8n/help/direction.html.erb +0 -13
- data/app/views/tr8n/help/enter_translation.html.erb +0 -13
- data/app/views/tr8n/help/fallback_language.html.erb +0 -13
- data/app/views/tr8n/help/generate_context_rules.html.erb +0 -17
- data/app/views/tr8n/help/inline_translations.html.erb +0 -28
- data/app/views/tr8n/help/language_dashboard.html.erb +0 -21
- data/app/views/tr8n/help/language_phrases.html.erb +0 -17
- data/app/views/tr8n/help/language_statistics.html.erb +0 -13
- data/app/views/tr8n/help/manage.html.erb +0 -13
- data/app/views/tr8n/help/manage_language.html.erb +0 -13
- data/app/views/tr8n/help/native_name.html.erb +0 -13
- data/app/views/tr8n/help/original_phrase.html.erb +0 -13
- data/app/views/tr8n/help/other_languages.html.erb +0 -15
- data/app/views/tr8n/help/other_translatable_resources.html.erb +0 -13
- data/app/views/tr8n/help/phrases_with_translations.html.erb +0 -21
- data/app/views/tr8n/help/phrases_without_translations.html.erb +0 -15
- data/app/views/tr8n/help/prohibited_words.html.erb +0 -13
- data/app/views/tr8n/help/rank.html.erb +0 -13
- data/app/views/tr8n/help/recent_discussions.html.erb +0 -13
- data/app/views/tr8n/help/recent_translation_votes.html.erb +0 -13
- data/app/views/tr8n/help/recent_translations.html.erb +0 -13
- data/app/views/tr8n/help/site_sections.html.erb +0 -13
- data/app/views/tr8n/help/suggested_translation.html.erb +0 -13
- data/app/views/tr8n/help/translating_inline.html.erb +0 -30
- data/app/views/tr8n/help/translation_context_rules.html.erb +0 -16
- data/app/views/tr8n/help/translation_tokens.html.erb +0 -13
- data/app/views/tr8n/help/translation_tools.html.erb +0 -13
- data/app/views/tr8n/help/user_rank.html.erb +0 -13
- data/app/views/tr8n/help/using_translation_tools.html.erb +0 -13
- data/app/views/tr8n/help/your_dashboard.html.erb +0 -17
- data/app/views/tr8n/help/your_languages.html.erb +0 -19
- data/app/views/tr8n/help/your_translations.html.erb +0 -17
- data/config/application.rb +0 -65
- data/config/boot.rb +0 -6
- data/config/database.yml +0 -13
- data/config/environment.rb +0 -46
- data/db/extras/20100511185330_create_test_users.rb +0 -43
- data/db/migrate/20090730070119_create_will_filter_tables.rb +0 -19
- data/db/seeds.rb +0 -7
- data/lib/application_helper.rb +0 -390
- data/lib/tr8n/controller_methods.rb +0 -156
- data/public/robots.txt +0 -5
- data/public/tr8n/images/flags/.DS_Store +0 -0
- data/rails/init.rb +0 -53
- 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
|
-
|
25
|
-
|
26
|
-
extend ActiveSupport::Concern
|
24
|
+
require 'rails'
|
25
|
+
require 'pp'
|
27
26
|
|
28
|
-
|
29
|
-
|
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
|
-
|
33
|
-
|
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
|
-
|
24
|
+
module Tr8n
|
25
|
+
class SiteMap
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
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
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
55
|
-
|
56
|
-
|
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
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
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
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
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
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
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
|
-
|
25
|
-
|
24
|
+
module Tr8n
|
25
|
+
class SiteMapSection
|
26
|
+
attr_accessor :key, :parent, :data
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
def enabled?
|
36
|
+
return true if data[:enabled] == nil
|
37
|
+
data[:enabled]
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
40
|
+
def children
|
41
|
+
@children ||= []
|
42
|
+
end
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
44
|
+
def sources
|
45
|
+
data[:sources]
|
46
|
+
end
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
48
|
+
def source
|
49
|
+
return "" if sources.blank? or sources.empty?
|
50
|
+
sources.first
|
51
|
+
end
|
51
52
|
|
52
|
-
|
53
|
-
|
54
|
-
|
53
|
+
def label
|
54
|
+
data[:label] || ''
|
55
|
+
end
|
55
56
|
|
56
|
-
|
57
|
-
|
58
|
-
|
57
|
+
def description
|
58
|
+
data[:description] || ''
|
59
|
+
end
|
59
60
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
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
|
-
|
69
|
-
|
70
|
-
|
69
|
+
def object
|
70
|
+
data[:object]
|
71
|
+
end
|
71
72
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
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
|
-
|
82
|
-
|
83
|
-
|
82
|
+
def to_s
|
83
|
+
label
|
84
|
+
end
|
84
85
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
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
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
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
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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
|
-
|
32
|
-
|
32
|
+
tokens.flatten
|
33
|
+
end
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
-
|
43
|
-
|
44
|
-
|
43
|
+
def self.expression
|
44
|
+
raise Tr8n::TokenException.new("This method must be implemented in the extending class")
|
45
|
+
end
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
def initialize(label, token)
|
56
|
+
@label = label
|
57
|
+
@full_name = token
|
58
|
+
end
|
58
59
|
|
59
|
-
|
60
|
-
|
61
|
-
|
60
|
+
def original_label
|
61
|
+
@label
|
62
|
+
end
|
62
63
|
|
63
|
-
|
64
|
-
|
65
|
-
|
64
|
+
def full_name
|
65
|
+
@full_name
|
66
|
+
end
|
66
67
|
|
67
|
-
|
68
|
-
|
69
|
-
|
68
|
+
def declared_name
|
69
|
+
@declared_name ||= full_name.gsub(/[{}\[\]]/, '')
|
70
|
+
end
|
70
71
|
|
71
|
-
|
72
|
-
|
73
|
-
|
72
|
+
def name
|
73
|
+
@name ||= declared_name.split(':').first.strip
|
74
|
+
end
|
74
75
|
|
75
|
-
|
76
|
-
|
77
|
-
|
76
|
+
def permutable_name
|
77
|
+
@permutable_name ||= name.split(".").first
|
78
|
+
end
|
78
79
|
|
79
|
-
|
80
|
-
|
81
|
-
|
80
|
+
def suffix
|
81
|
+
@suffix ||= name.split('_').last
|
82
|
+
end
|
82
83
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
84
|
+
# used for the UI substitution
|
85
|
+
def sanitized_name
|
86
|
+
"{#{name}}"
|
87
|
+
end
|
87
88
|
|
88
|
-
|
89
|
-
|
90
|
-
|
89
|
+
def name_key
|
90
|
+
name.to_sym
|
91
|
+
end
|
91
92
|
|
92
|
-
|
93
|
-
|
94
|
-
|
93
|
+
def pipeless_name
|
94
|
+
@pipeless_name ||= declared_name.split('|').first
|
95
|
+
end
|
95
96
|
|
96
|
-
|
97
|
-
|
97
|
+
def case_key
|
98
|
+
return nil unless declared_name.index('::')
|
98
99
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
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
|
-
|
110
|
-
|
111
|
-
|
110
|
+
def supports_cases?
|
111
|
+
true
|
112
|
+
end
|
112
113
|
|
113
|
-
|
114
|
-
|
115
|
-
|
114
|
+
def has_case_key?
|
115
|
+
not case_key.blank?
|
116
|
+
end
|
116
117
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
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
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
128
|
+
def name_with_case
|
129
|
+
return name unless has_case_key?
|
130
|
+
"#{name}::#{case_key}"
|
131
|
+
end
|
131
132
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
133
|
+
# used by the translator submit dialog
|
134
|
+
def name_for_case(case_key)
|
135
|
+
"#{name}::#{case_key}"
|
136
|
+
end
|
136
137
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
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
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
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
|
-
|
155
|
-
|
156
|
-
|
155
|
+
def has_type?
|
156
|
+
not type.blank?
|
157
|
+
end
|
157
158
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
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
|
-
|
173
|
-
|
174
|
-
|
173
|
+
def dependency_rules
|
174
|
+
@dependency_rules ||= language_rules.select{|rule| rule.transformable?}
|
175
|
+
end
|
175
176
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
177
|
+
def dependencies
|
178
|
+
return nil unless dependant?
|
179
|
+
@dependencies ||= language_rules.collect{|rule| rule.dependency}
|
180
|
+
end
|
180
181
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
182
|
+
def dependency
|
183
|
+
return nil unless dependant?
|
184
|
+
@dependency ||= language_rule.dependency
|
185
|
+
end
|
185
186
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
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
|
-
|
192
|
-
|
193
|
-
|
192
|
+
def dependant?
|
193
|
+
not dependency_rules.empty?
|
194
|
+
end
|
194
195
|
|
195
|
-
|
196
|
-
|
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
|
-
|
199
|
-
|
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
|
-
|
205
|
-
value = apply_case(object, value, options, language)
|
209
|
+
value
|
206
210
|
end
|
207
|
-
|
208
|
-
value
|
209
|
-
end
|
210
211
|
|
211
|
-
|
212
|
-
|
213
|
-
|
212
|
+
def decoration?
|
213
|
+
false
|
214
|
+
end
|
214
215
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
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
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
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
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
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
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
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
|
-
|
263
|
-
|
263
|
+
raise Tr8n::TokenException.new("Invalid array second token value: #{full_name} in #{original_label}")
|
264
|
+
end
|
264
265
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
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
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
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
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
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
|
-
|
315
|
-
|
316
|
-
|
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
|
-
|
319
|
+
objects = objects.collect{|obj| obj.translate("List element", {}, options)} if list_options[:translate_items]
|
319
320
|
|
320
|
-
|
321
|
-
|
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
|
-
|
324
|
+
list_options[:expandable] = false if options[:skip_decorations]
|
324
325
|
|
325
|
-
|
326
|
+
return objects.join(list_options[:separator]) unless list_options[:to_sentence]
|
326
327
|
|
327
|
-
|
328
|
-
|
329
|
-
|
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
|
-
|
332
|
-
|
333
|
-
|
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
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
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
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
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 << "« less".translate("List elements joiner", {}, options)
|
354
|
+
result << "</a>"
|
355
|
+
end
|
355
356
|
|
356
|
-
|
357
|
-
|
357
|
+
result << "</span>"
|
358
|
+
end
|
358
359
|
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
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
|
-
|
369
|
-
|
370
|
-
|
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
|
-
#
|
374
|
-
|
378
|
+
# simple token
|
379
|
+
sanitize_token_value(object, object.to_s, options, language)
|
375
380
|
end
|
376
381
|
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
def allowed_in_translation?
|
382
|
-
true
|
383
|
-
end
|
382
|
+
def allowed_in_translation?
|
383
|
+
true
|
384
|
+
end
|
384
385
|
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
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
|
-
|
404
|
+
def substitute(label, values = {}, options = {}, language = Tr8n::Config.current_language)
|
404
405
|
|
405
|
-
|
406
|
-
|
406
|
+
# get the object from the values
|
407
|
+
object = values[name_key]
|
407
408
|
|
408
|
-
|
409
|
-
|
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
|
-
|
412
|
-
|
413
|
-
|
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
|
-
|
416
|
-
|
417
|
-
|
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
|
-
|
420
|
+
object = object.to_s if object.nil?
|
420
421
|
|
421
|
-
|
422
|
-
|
423
|
-
|
422
|
+
value = token_value(object, options, language)
|
423
|
+
label.gsub(full_name, value)
|
424
|
+
end
|
424
425
|
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
426
|
+
# return sanitized form
|
427
|
+
def prepare_label_for_translator(label)
|
428
|
+
label.gsub(full_name, sanitized_name)
|
429
|
+
end
|
429
430
|
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
431
|
+
# return tokenless form
|
432
|
+
def prepare_label_for_suggestion(label, index)
|
433
|
+
label.gsub(full_name, "(#{index})")
|
434
|
+
end
|
434
435
|
|
435
|
-
|
436
|
-
|
436
|
+
def to_s
|
437
|
+
full_name
|
438
|
+
end
|
437
439
|
end
|
438
440
|
end
|