fair-gettext 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) hide show
  1. data/ChangeLog +78 -0
  2. data/README.rdoc +245 -0
  3. data/Rakefile +234 -0
  4. data/bin/rgettext +23 -0
  5. data/bin/rmsgfmt +22 -0
  6. data/bin/rmsgmerge +22 -0
  7. data/gettext.gemspec +40 -0
  8. data/lib/gettext/cgi.rb +37 -0
  9. data/lib/gettext/core_ext/iconv.rb +110 -0
  10. data/lib/gettext/core_ext/string.rb +84 -0
  11. data/lib/gettext/parser/erb.rb +3 -0
  12. data/lib/gettext/parser/glade.rb +3 -0
  13. data/lib/gettext/parser/ruby.rb +172 -0
  14. data/lib/gettext/tools/rgettext.rb +248 -0
  15. data/lib/gettext/tools/rmsgfmt.rb +84 -0
  16. data/lib/gettext/tools/rmsgmerge.rb +498 -0
  17. data/lib/gettext/tools.rb +202 -0
  18. data/lib/gettext/utils.rb +37 -0
  19. data/lib/gettext/version.rb +12 -0
  20. data/lib/gettext.rb +310 -0
  21. data/po/bg/rgettext.po +134 -0
  22. data/po/bs/rgettext.po +135 -0
  23. data/po/ca/rgettext.po +133 -0
  24. data/po/cs/rgettext.po +136 -0
  25. data/po/de/rgettext.po +141 -0
  26. data/po/el/rgettext.po +132 -0
  27. data/po/eo/rgettext.po +133 -0
  28. data/po/es/rgettext.po +134 -0
  29. data/po/et/rgettext.po +131 -0
  30. data/po/fr/rgettext.po +137 -0
  31. data/po/hr/rgettext.po +135 -0
  32. data/po/hu/rgettext.po +133 -0
  33. data/po/it/rgettext.po +134 -0
  34. data/po/ja/rgettext.po +134 -0
  35. data/po/ko/rgettext.po +133 -0
  36. data/po/lv/rgettext.po +134 -0
  37. data/po/nb/rgettext.po +135 -0
  38. data/po/nl/rgettext.po +134 -0
  39. data/po/pt_BR/rgettext.po +136 -0
  40. data/po/rgettext.pot +125 -0
  41. data/po/ru/rgettext.po +135 -0
  42. data/po/sr/rgettext.po +134 -0
  43. data/po/sv/rgettext.po +127 -0
  44. data/po/ua/rgettext.po +138 -0
  45. data/po/vi/rgettext.po +132 -0
  46. data/po/zh/rgettext.po +133 -0
  47. data/po/zh_TW/rgettext.po +132 -0
  48. data/samples/README +16 -0
  49. data/samples/cgi/README +43 -0
  50. data/samples/cgi/Rakefile +27 -0
  51. data/samples/cgi/cookie.cgi +64 -0
  52. data/samples/cgi/gettext.css +116 -0
  53. data/samples/cgi/helloerb.rhtml +28 -0
  54. data/samples/cgi/helloerb1.cgi +58 -0
  55. data/samples/cgi/helloerb2.cgi +51 -0
  56. data/samples/cgi/hellolib.rb +18 -0
  57. data/samples/cgi/http.rb +49 -0
  58. data/samples/cgi/index.cgi +111 -0
  59. data/samples/cgi/other.rhtml +20 -0
  60. data/samples/cgi/po/bg/helloerb1.po +59 -0
  61. data/samples/cgi/po/bg/helloerb2.po +51 -0
  62. data/samples/cgi/po/bg/hellolib.po +23 -0
  63. data/samples/cgi/po/bg/main.po +83 -0
  64. data/samples/cgi/po/bs/helloerb1.po +59 -0
  65. data/samples/cgi/po/bs/helloerb2.po +51 -0
  66. data/samples/cgi/po/bs/hellolib.po +23 -0
  67. data/samples/cgi/po/bs/main.po +83 -0
  68. data/samples/cgi/po/ca/helloerb1.po +59 -0
  69. data/samples/cgi/po/ca/helloerb2.po +51 -0
  70. data/samples/cgi/po/ca/hellolib.po +23 -0
  71. data/samples/cgi/po/ca/main.po +83 -0
  72. data/samples/cgi/po/cs/helloerb1.po +61 -0
  73. data/samples/cgi/po/cs/helloerb2.po +52 -0
  74. data/samples/cgi/po/cs/hellolib.po +25 -0
  75. data/samples/cgi/po/cs/main.po +85 -0
  76. data/samples/cgi/po/de/helloerb1.po +61 -0
  77. data/samples/cgi/po/de/helloerb2.po +52 -0
  78. data/samples/cgi/po/de/hellolib.po +24 -0
  79. data/samples/cgi/po/de/main.po +86 -0
  80. data/samples/cgi/po/el/helloerb1.po +60 -0
  81. data/samples/cgi/po/el/helloerb2.po +51 -0
  82. data/samples/cgi/po/el/hellolib.po +23 -0
  83. data/samples/cgi/po/el/main.po +84 -0
  84. data/samples/cgi/po/eo/helloerb1.po +60 -0
  85. data/samples/cgi/po/eo/helloerb2.po +52 -0
  86. data/samples/cgi/po/eo/hellolib.po +24 -0
  87. data/samples/cgi/po/eo/main.po +84 -0
  88. data/samples/cgi/po/es/helloerb1.po +59 -0
  89. data/samples/cgi/po/es/helloerb2.po +50 -0
  90. data/samples/cgi/po/es/hellolib.po +22 -0
  91. data/samples/cgi/po/es/main.po +83 -0
  92. data/samples/cgi/po/fr/helloerb1.po +59 -0
  93. data/samples/cgi/po/fr/helloerb2.po +51 -0
  94. data/samples/cgi/po/fr/hellolib.po +22 -0
  95. data/samples/cgi/po/fr/main.po +85 -0
  96. data/samples/cgi/po/helloerb1.pot +60 -0
  97. data/samples/cgi/po/helloerb2.pot +52 -0
  98. data/samples/cgi/po/hellolib.pot +24 -0
  99. data/samples/cgi/po/hr/helloerb1.po +59 -0
  100. data/samples/cgi/po/hr/helloerb2.po +51 -0
  101. data/samples/cgi/po/hr/hellolib.po +23 -0
  102. data/samples/cgi/po/hr/main.po +83 -0
  103. data/samples/cgi/po/hu/helloerb1.po +59 -0
  104. data/samples/cgi/po/hu/helloerb2.po +51 -0
  105. data/samples/cgi/po/hu/hellolib.po +23 -0
  106. data/samples/cgi/po/hu/main.po +82 -0
  107. data/samples/cgi/po/it/helloerb1.po +60 -0
  108. data/samples/cgi/po/it/helloerb2.po +52 -0
  109. data/samples/cgi/po/it/hellolib.po +24 -0
  110. data/samples/cgi/po/it/main.po +84 -0
  111. data/samples/cgi/po/ja/helloerb1.po +60 -0
  112. data/samples/cgi/po/ja/helloerb2.po +52 -0
  113. data/samples/cgi/po/ja/hellolib.po +24 -0
  114. data/samples/cgi/po/ja/main.po +85 -0
  115. data/samples/cgi/po/ko/helloerb1.po +59 -0
  116. data/samples/cgi/po/ko/helloerb2.po +51 -0
  117. data/samples/cgi/po/ko/hellolib.po +23 -0
  118. data/samples/cgi/po/ko/main.po +84 -0
  119. data/samples/cgi/po/lv/helloerb1.po +65 -0
  120. data/samples/cgi/po/lv/helloerb2.po +52 -0
  121. data/samples/cgi/po/lv/hellolib.po +24 -0
  122. data/samples/cgi/po/lv/main.po +77 -0
  123. data/samples/cgi/po/main.pot +80 -0
  124. data/samples/cgi/po/nb/helloerb1.po +60 -0
  125. data/samples/cgi/po/nb/helloerb2.po +52 -0
  126. data/samples/cgi/po/nb/hellolib.po +24 -0
  127. data/samples/cgi/po/nb/main.po +84 -0
  128. data/samples/cgi/po/nl/helloerb1.po +61 -0
  129. data/samples/cgi/po/nl/helloerb2.po +52 -0
  130. data/samples/cgi/po/nl/hellolib.po +24 -0
  131. data/samples/cgi/po/nl/main.po +86 -0
  132. data/samples/cgi/po/pt_BR/helloerb1.po +59 -0
  133. data/samples/cgi/po/pt_BR/helloerb2.po +51 -0
  134. data/samples/cgi/po/pt_BR/hellolib.po +23 -0
  135. data/samples/cgi/po/pt_BR/main.po +84 -0
  136. data/samples/cgi/po/ru/helloerb1.po +58 -0
  137. data/samples/cgi/po/ru/helloerb2.po +50 -0
  138. data/samples/cgi/po/ru/hellolib.po +22 -0
  139. data/samples/cgi/po/ru/main.po +82 -0
  140. data/samples/cgi/po/sr/helloerb1.po +60 -0
  141. data/samples/cgi/po/sr/helloerb2.po +52 -0
  142. data/samples/cgi/po/sr/hellolib.po +24 -0
  143. data/samples/cgi/po/sr/main.po +80 -0
  144. data/samples/cgi/po/ua/helloerb1.po +62 -0
  145. data/samples/cgi/po/ua/helloerb2.po +54 -0
  146. data/samples/cgi/po/ua/hellolib.po +26 -0
  147. data/samples/cgi/po/ua/main.po +84 -0
  148. data/samples/cgi/po/vi/helloerb1.po +65 -0
  149. data/samples/cgi/po/vi/helloerb2.po +52 -0
  150. data/samples/cgi/po/vi/hellolib.po +24 -0
  151. data/samples/cgi/po/vi/main.po +77 -0
  152. data/samples/cgi/po/zh/helloerb1.po +60 -0
  153. data/samples/cgi/po/zh/helloerb2.po +52 -0
  154. data/samples/cgi/po/zh/hellolib.po +24 -0
  155. data/samples/cgi/po/zh/main.po +80 -0
  156. data/samples/cgi/po/zh_TW/helloerb1.po +67 -0
  157. data/samples/cgi/po/zh_TW/helloerb2.po +54 -0
  158. data/samples/cgi/po/zh_TW/hellolib.po +26 -0
  159. data/samples/cgi/po/zh_TW/main.po +79 -0
  160. data/samples/hello.rb +36 -0
  161. data/samples/hello2.rb +23 -0
  162. data/samples/hello_glade2.glade +70 -0
  163. data/samples/hello_glade2.rb +25 -0
  164. data/samples/hello_gtk2.rb +27 -0
  165. data/samples/hello_noop.rb +31 -0
  166. data/samples/hello_plural.rb +26 -0
  167. data/samples/hello_tk.rb +19 -0
  168. data/samples/makemo.rb +4 -0
  169. data/samples/po/bg/hello.po +24 -0
  170. data/samples/po/bg/hello2.po +31 -0
  171. data/samples/po/bg/hello_glade2.po +31 -0
  172. data/samples/po/bg/hello_gtk.po +23 -0
  173. data/samples/po/bg/hello_noop.po +27 -0
  174. data/samples/po/bg/hello_plural.po +25 -0
  175. data/samples/po/bg/hello_tk.po +23 -0
  176. data/samples/po/bs/hello.po +23 -0
  177. data/samples/po/bs/hello2.po +31 -0
  178. data/samples/po/bs/hello_glade2.po +31 -0
  179. data/samples/po/bs/hello_gtk.po +23 -0
  180. data/samples/po/bs/hello_noop.po +27 -0
  181. data/samples/po/bs/hello_plural.po +26 -0
  182. data/samples/po/bs/hello_tk.po +23 -0
  183. data/samples/po/ca/hello.po +23 -0
  184. data/samples/po/ca/hello2.po +31 -0
  185. data/samples/po/ca/hello_glade2.po +31 -0
  186. data/samples/po/ca/hello_gtk.po +23 -0
  187. data/samples/po/ca/hello_noop.po +27 -0
  188. data/samples/po/ca/hello_plural.po +25 -0
  189. data/samples/po/ca/hello_tk.po +23 -0
  190. data/samples/po/cs/hello.po +23 -0
  191. data/samples/po/cs/hello2.po +31 -0
  192. data/samples/po/cs/hello_glade2.po +37 -0
  193. data/samples/po/cs/hello_gtk.po +23 -0
  194. data/samples/po/cs/hello_noop.po +27 -0
  195. data/samples/po/cs/hello_plural.po +26 -0
  196. data/samples/po/cs/hello_tk.po +23 -0
  197. data/samples/po/de/hello.po +20 -0
  198. data/samples/po/de/hello2.po +28 -0
  199. data/samples/po/de/hello_glade2.po +27 -0
  200. data/samples/po/de/hello_gtk.po +20 -0
  201. data/samples/po/de/hello_noop.po +24 -0
  202. data/samples/po/de/hello_plural.po +25 -0
  203. data/samples/po/de/hello_tk.po +20 -0
  204. data/samples/po/el/hello.po +23 -0
  205. data/samples/po/el/hello2.po +31 -0
  206. data/samples/po/el/hello_glade2.po +31 -0
  207. data/samples/po/el/hello_gtk.po +22 -0
  208. data/samples/po/el/hello_noop.po +27 -0
  209. data/samples/po/el/hello_plural.po +25 -0
  210. data/samples/po/el/hello_tk.po +23 -0
  211. data/samples/po/eo/hello.po +23 -0
  212. data/samples/po/eo/hello2.po +31 -0
  213. data/samples/po/eo/hello_glade2.po +32 -0
  214. data/samples/po/eo/hello_gtk.po +23 -0
  215. data/samples/po/eo/hello_noop.po +27 -0
  216. data/samples/po/eo/hello_plural.po +26 -0
  217. data/samples/po/eo/hello_tk.po +24 -0
  218. data/samples/po/es/hello.po +21 -0
  219. data/samples/po/es/hello2.po +28 -0
  220. data/samples/po/es/hello_glade2.po +28 -0
  221. data/samples/po/es/hello_gtk.po +20 -0
  222. data/samples/po/es/hello_noop.po +24 -0
  223. data/samples/po/es/hello_plural.po +23 -0
  224. data/samples/po/es/hello_tk.po +20 -0
  225. data/samples/po/fr/hello.po +18 -0
  226. data/samples/po/fr/hello2.po +26 -0
  227. data/samples/po/fr/hello_glade2.po +27 -0
  228. data/samples/po/fr/hello_gtk.po +18 -0
  229. data/samples/po/fr/hello_noop.po +22 -0
  230. data/samples/po/fr/hello_plural.po +21 -0
  231. data/samples/po/fr/hello_tk.po +18 -0
  232. data/samples/po/hello.pot +23 -0
  233. data/samples/po/hello2.pot +31 -0
  234. data/samples/po/hello_glade2.pot +32 -0
  235. data/samples/po/hello_gtk.pot +23 -0
  236. data/samples/po/hello_noop.pot +27 -0
  237. data/samples/po/hello_plural.pot +26 -0
  238. data/samples/po/hello_tk.pot +24 -0
  239. data/samples/po/hr/hello.po +23 -0
  240. data/samples/po/hr/hello2.po +31 -0
  241. data/samples/po/hr/hello_glade2.po +31 -0
  242. data/samples/po/hr/hello_gtk.po +23 -0
  243. data/samples/po/hr/hello_noop.po +27 -0
  244. data/samples/po/hr/hello_plural.po +26 -0
  245. data/samples/po/hr/hello_tk.po +23 -0
  246. data/samples/po/hu/hello.po +22 -0
  247. data/samples/po/hu/hello2.po +30 -0
  248. data/samples/po/hu/hello_glade2.po +31 -0
  249. data/samples/po/hu/hello_gtk.po +22 -0
  250. data/samples/po/hu/hello_noop.po +26 -0
  251. data/samples/po/hu/hello_plural.po +25 -0
  252. data/samples/po/hu/hello_tk.po +23 -0
  253. data/samples/po/it/hello.po +20 -0
  254. data/samples/po/it/hello2.po +28 -0
  255. data/samples/po/it/hello_glade2.po +28 -0
  256. data/samples/po/it/hello_gtk.po +21 -0
  257. data/samples/po/it/hello_noop.po +24 -0
  258. data/samples/po/it/hello_plural.po +23 -0
  259. data/samples/po/it/hello_tk.po +21 -0
  260. data/samples/po/ja/hello.po +20 -0
  261. data/samples/po/ja/hello2.po +28 -0
  262. data/samples/po/ja/hello_glade2.po +26 -0
  263. data/samples/po/ja/hello_gtk.po +19 -0
  264. data/samples/po/ja/hello_noop.po +23 -0
  265. data/samples/po/ja/hello_plural.po +21 -0
  266. data/samples/po/ja/hello_tk.po +19 -0
  267. data/samples/po/ko/hello.po +18 -0
  268. data/samples/po/ko/hello2.po +26 -0
  269. data/samples/po/ko/hello_glade2.po +29 -0
  270. data/samples/po/ko/hello_gtk.po +18 -0
  271. data/samples/po/ko/hello_noop.po +22 -0
  272. data/samples/po/ko/hello_plural.po +25 -0
  273. data/samples/po/ko/hello_tk.po +19 -0
  274. data/samples/po/lv/hello.po +24 -0
  275. data/samples/po/lv/hello2.po +32 -0
  276. data/samples/po/lv/hello_glade2.po +38 -0
  277. data/samples/po/lv/hello_gtk.po +24 -0
  278. data/samples/po/lv/hello_noop.po +28 -0
  279. data/samples/po/lv/hello_plural.po +26 -0
  280. data/samples/po/lv/hello_tk.po +24 -0
  281. data/samples/po/nb/hello.po +23 -0
  282. data/samples/po/nb/hello2.po +31 -0
  283. data/samples/po/nb/hello_glade2.po +31 -0
  284. data/samples/po/nb/hello_gtk.po +23 -0
  285. data/samples/po/nb/hello_noop.po +27 -0
  286. data/samples/po/nb/hello_plural.po +26 -0
  287. data/samples/po/nb/hello_tk.po +24 -0
  288. data/samples/po/nl/hello.po +24 -0
  289. data/samples/po/nl/hello2.po +32 -0
  290. data/samples/po/nl/hello_glade2.po +31 -0
  291. data/samples/po/nl/hello_gtk.po +24 -0
  292. data/samples/po/nl/hello_noop.po +28 -0
  293. data/samples/po/nl/hello_plural.po +25 -0
  294. data/samples/po/nl/hello_tk.po +24 -0
  295. data/samples/po/pt_BR/hello.po +21 -0
  296. data/samples/po/pt_BR/hello2.po +29 -0
  297. data/samples/po/pt_BR/hello_glade2.po +29 -0
  298. data/samples/po/pt_BR/hello_gtk.po +21 -0
  299. data/samples/po/pt_BR/hello_noop.po +25 -0
  300. data/samples/po/pt_BR/hello_plural.po +23 -0
  301. data/samples/po/pt_BR/hello_tk.po +21 -0
  302. data/samples/po/ru/hello.po +22 -0
  303. data/samples/po/ru/hello2.po +30 -0
  304. data/samples/po/ru/hello_glade2.po +30 -0
  305. data/samples/po/ru/hello_gtk.po +22 -0
  306. data/samples/po/ru/hello_noop.po +26 -0
  307. data/samples/po/ru/hello_plural.po +28 -0
  308. data/samples/po/ru/hello_tk.po +22 -0
  309. data/samples/po/sr/hello.po +22 -0
  310. data/samples/po/sr/hello2.po +30 -0
  311. data/samples/po/sr/hello_glade2.po +32 -0
  312. data/samples/po/sr/hello_gtk.po +22 -0
  313. data/samples/po/sr/hello_noop.po +26 -0
  314. data/samples/po/sr/hello_plural.po +26 -0
  315. data/samples/po/sr/hello_tk.po +24 -0
  316. data/samples/po/sv/hello.po +20 -0
  317. data/samples/po/sv/hello2.po +28 -0
  318. data/samples/po/sv/hello_glade2.po +28 -0
  319. data/samples/po/sv/hello_gtk.po +20 -0
  320. data/samples/po/sv/hello_noop.po +24 -0
  321. data/samples/po/sv/hello_plural.po +23 -0
  322. data/samples/po/sv/hello_tk.po +20 -0
  323. data/samples/po/test.rb +11 -0
  324. data/samples/po/ua/hello.po +22 -0
  325. data/samples/po/ua/hello2.po +30 -0
  326. data/samples/po/ua/hello_glade2.po +34 -0
  327. data/samples/po/ua/hello_gtk.po +22 -0
  328. data/samples/po/ua/hello_noop.po +26 -0
  329. data/samples/po/ua/hello_plural.po +29 -0
  330. data/samples/po/ua/hello_tk.po +26 -0
  331. data/samples/po/vi/hello.po +23 -0
  332. data/samples/po/vi/hello2.po +31 -0
  333. data/samples/po/vi/hello_glade2.po +38 -0
  334. data/samples/po/vi/hello_gtk.po +23 -0
  335. data/samples/po/vi/hello_noop.po +27 -0
  336. data/samples/po/vi/hello_plural.po +26 -0
  337. data/samples/po/vi/hello_tk.po +24 -0
  338. data/samples/po/zh/hello.po +23 -0
  339. data/samples/po/zh/hello2.po +31 -0
  340. data/samples/po/zh/hello_glade2.po +31 -0
  341. data/samples/po/zh/hello_gtk.po +23 -0
  342. data/samples/po/zh/hello_noop.po +27 -0
  343. data/samples/po/zh/hello_plural.po +25 -0
  344. data/samples/po/zh/hello_tk.po +23 -0
  345. data/samples/po/zh_TW/hello.po +26 -0
  346. data/samples/po/zh_TW/hello2.po +34 -0
  347. data/samples/po/zh_TW/hello_glade2.po +40 -0
  348. data/samples/po/zh_TW/hello_gtk.po +25 -0
  349. data/samples/po/zh_TW/hello_noop.po +30 -0
  350. data/samples/po/zh_TW/hello_plural.po +28 -0
  351. data/samples/po/zh_TW/hello_tk.po +26 -0
  352. data/src/poparser.ry +217 -0
  353. data/test/README +1 -0
  354. data/test/Rakefile +17 -0
  355. data/test/po/cr/plural.po +23 -0
  356. data/test/po/da/plural.po +22 -0
  357. data/test/po/da/plural_error.po +22 -0
  358. data/test/po/fr/plural.po +28 -0
  359. data/test/po/fr/plural_error.po +20 -0
  360. data/test/po/fr/test1.po +23 -0
  361. data/test/po/fr/test2.po +19 -0
  362. data/test/po/ir/plural.po +23 -0
  363. data/test/po/ja/npgettext.po +46 -0
  364. data/test/po/ja/nsgettext.po +65 -0
  365. data/test/po/ja/pgettext.po +41 -0
  366. data/test/po/ja/plural.po +28 -0
  367. data/test/po/ja/plural_error.po +20 -0
  368. data/test/po/ja/rubyparser.po +43 -0
  369. data/test/po/ja/sgettext.po +47 -0
  370. data/test/po/ja/test1.po +23 -0
  371. data/test/po/ja/test2.po +19 -0
  372. data/test/po/la/plural.po +23 -0
  373. data/test/po/la/plural_error.po +21 -0
  374. data/test/po/li/plural.po +23 -0
  375. data/test/po/po/plural.po +23 -0
  376. data/test/po/sl/plural.po +24 -0
  377. data/test/test_class_info.rb +83 -0
  378. data/test/test_gettext.rb +311 -0
  379. data/test/test_parser.rb +158 -0
  380. data/test/test_string.rb +65 -0
  381. data/test/test_textdomain_multi.rb +80 -0
  382. data/test/test_textdomain_toplevel.rb +42 -0
  383. data/test/testlib/N_.rb +66 -0
  384. data/test/testlib/erb.rhtml +15 -0
  385. data/test/testlib/erb.rxml +16 -0
  386. data/test/testlib/gettext.rb +113 -0
  387. data/test/testlib/gladeparser.glade +183 -0
  388. data/test/testlib/helper.rb +11 -0
  389. data/test/testlib/multi_textdomain.rb +131 -0
  390. data/test/testlib/ngettext.rb +79 -0
  391. data/test/testlib/npgettext.rb +31 -0
  392. data/test/testlib/nsgettext.rb +42 -0
  393. data/test/testlib/pgettext.rb +36 -0
  394. data/test/testlib/sgettext.rb +46 -0
  395. data/test/testlib/simple.rb +14 -0
  396. metadata +496 -0
@@ -0,0 +1,158 @@
1
+ require 'testlib/helper.rb'
2
+ require 'gettext/tools/parser/ruby'
3
+ require 'gettext/tools/parser/glade'
4
+ require 'gettext/tools/parser/erb'
5
+
6
+ require 'gettext/tools/rgettext'
7
+
8
+ class TestGetTextParser < Test::Unit::TestCase
9
+ def test_ruby
10
+ @ary = GetText::RGetText.parse('testlib/gettext.rb')
11
+
12
+ assert_target 'aaa', ['testlib/gettext.rb:8']
13
+ assert_target 'aaa\n', ['testlib/gettext.rb:12']
14
+ assert_target 'bbb\nccc', ['testlib/gettext.rb:16']
15
+ assert_target 'bbb\nccc\nddd\n', ['testlib/gettext.rb:20']
16
+ assert_target 'eee', ['testlib/gettext.rb:27', 'testlib/gettext.rb:31']
17
+ assert_target 'fff', ['testlib/gettext.rb:31']
18
+ assert_target 'ggghhhiii', ['testlib/gettext.rb:35']
19
+ assert_target 'a"b"c"', ['testlib/gettext.rb:41']
20
+ assert_target 'd"e"f"', ['testlib/gettext.rb:45']
21
+ assert_target 'jjj', ['testlib/gettext.rb:49']
22
+ assert_target 'kkk', ['testlib/gettext.rb:50']
23
+ assert_target 'lllmmm', ['testlib/gettext.rb:54']
24
+ assert_target 'nnn\nooo', ['testlib/gettext.rb:62']
25
+ assert_target "\#", ['testlib/gettext.rb:66', 'testlib/gettext.rb:70']
26
+ assert_target "\\taaa", ['testlib/gettext.rb:74']
27
+ assert_target "Here document1\\nHere document2\\n", ['testlib/gettext.rb:78']
28
+ assert_target "Francois Pinard", ['testlib/gettext.rb:97'] do |t|
29
+ assert_match /proper name/, t.comment
30
+ assert_match /Pronunciation/, t.comment
31
+ end
32
+ assert_target "self explaining", ['testlib/gettext.rb:102'] do |t|
33
+ assert_nil t.comment
34
+ end
35
+ # TODO: assert_target "in_quote", ['testlib/gettext.rb:96']
36
+ end
37
+
38
+ def test_ruby_N
39
+ @ary = GetText::RGetText.parse('testlib/N_.rb')
40
+
41
+ assert_target 'aaa', ['testlib/N_.rb:8']
42
+ assert_target 'aaa\n', ['testlib/N_.rb:12']
43
+ assert_target 'bbb\nccc', ['testlib/N_.rb:16']
44
+ assert_target 'bbb\nccc\nddd\n', ['testlib/N_.rb:20']
45
+ assert_target 'eee', ['testlib/N_.rb:27', 'testlib/N_.rb:31']
46
+ assert_target 'fff', ['testlib/N_.rb:31']
47
+ assert_target 'ggghhhiii', ['testlib/N_.rb:35']
48
+ assert_target 'a"b"c"', ['testlib/N_.rb:41']
49
+ assert_target 'd"e"f"', ['testlib/N_.rb:45']
50
+ assert_target 'jjj', ['testlib/N_.rb:49']
51
+ assert_target 'kkk', ['testlib/N_.rb:50']
52
+ assert_target 'lllmmm', ['testlib/N_.rb:54']
53
+ assert_target 'nnn\nooo', ['testlib/N_.rb:62']
54
+ end
55
+
56
+ def test_ruby_n
57
+ @ary = GetText::RGetText.parse('testlib/ngettext.rb')
58
+ assert_plural_target "aaa", "aaa2", ['testlib/ngettext.rb:8']
59
+ assert_plural_target "bbb\\n", "ccc2\\nccc2", ['testlib/ngettext.rb:12']
60
+ assert_plural_target "ddd\\nddd", "ddd2\\nddd2", ['testlib/ngettext.rb:16']
61
+ assert_plural_target "eee\\neee\\n", "eee2\\neee2\\n", ['testlib/ngettext.rb:21']
62
+ assert_plural_target "ddd\\neee\\n", "ddd\\neee2", ['testlib/ngettext.rb:27']
63
+ assert_plural_target "fff", "fff2", ['testlib/ngettext.rb:34', 'testlib/ngettext.rb:38']
64
+ assert_plural_target "ggg", "ggg2", ['testlib/ngettext.rb:38']
65
+ assert_plural_target "ggghhhiii", "jjjkkklll", ['testlib/ngettext.rb:42']
66
+ assert_plural_target "a\"b\"c\"", "a\"b\"c\"2", ['testlib/ngettext.rb:51']
67
+ assert_plural_target "mmmmmm", "mmm2mmm2", ['testlib/ngettext.rb:59']
68
+ assert_plural_target "nnn", "nnn2", ['testlib/ngettext.rb:60']
69
+ assert_plural_target "comment", "comments", ['testlib/ngettext.rb:76'] do |t|
70
+ assert_equal "please provide translations for all \n the plural forms!", t.comment
71
+ end
72
+ end
73
+
74
+ def test_ruby_p
75
+ @ary = GetText::RGetText.parse('testlib/pgettext.rb')
76
+ assert_target_in_context "AAA", "BBB", ["testlib/pgettext.rb:8", "testlib/pgettext.rb:12"]
77
+ assert_target_in_context "AAA|BBB", "CCC", ["testlib/pgettext.rb:16"]
78
+ assert_target_in_context "AAA", "CCC", ["testlib/pgettext.rb:20"]
79
+ assert_target_in_context "CCC", "BBB", ["testlib/pgettext.rb:24"]
80
+ assert_target_in_context "program", "name", ['testlib/pgettext.rb:34'] do |t|
81
+ assert_equal "please translate 'name' in the context of 'program'.\n Hint: the translation should NOT contain the translation of 'program'.", t.comment
82
+ end
83
+ end
84
+
85
+ def test_glade
86
+ # Old style (~2.0.4)
87
+ ary = GetText::GladeParser.parse('testlib/gladeparser.glade')
88
+
89
+ assert_equal(['window1', 'testlib/gladeparser.glade:8'], ary[0])
90
+ assert_equal(['normal text', 'testlib/gladeparser.glade:29'], ary[1])
91
+ assert_equal(['1st line\n2nd line\n3rd line', 'testlib/gladeparser.glade:50'], ary[2])
92
+ assert_equal(['<span color="red" weight="bold" size="large">markup </span>', 'testlib/gladeparser.glade:73'], ary[3])
93
+ assert_equal(['<span color="red">1st line markup </span>\n<span color="blue">2nd line markup</span>', 'testlib/gladeparser.glade:94'], ary[4])
94
+ assert_equal(['<span>&quot;markup&quot; with &lt;escaped strings&gt;</span>', 'testlib/gladeparser.glade:116'], ary[5])
95
+ assert_equal(['duplicated', 'testlib/gladeparser.glade:137', 'testlib/gladeparser.glade:158'], ary[6])
96
+ end
97
+
98
+ def testlib_erb
99
+ @ary = GetText::ErbParser.parse('testlib/erb.rhtml')
100
+
101
+ assert_target 'aaa', ['testlib/erb.rhtml:8']
102
+ assert_target 'aaa\n', ['testlib/erb.rhtml:11']
103
+ assert_target 'bbb', ['testlib/erb.rhtml:12']
104
+ assert_plural_target "ccc1", "ccc2", ['testlib/erb.rhtml:13']
105
+ end
106
+
107
+ def test_rgettext_parse
108
+ GetText::ErbParser.init(:extnames => ['.rhtml', '.rxml'])
109
+ @ary = GetText::RGetText.parse(['testlib/erb.rhtml'])
110
+ assert_target 'aaa', ['testlib/erb.rhtml:8']
111
+ assert_target 'aaa\n', ['testlib/erb.rhtml:11']
112
+ assert_target 'bbb', ['testlib/erb.rhtml:12']
113
+ assert_plural_target "ccc1", "ccc2", ['testlib/erb.rhtml:13']
114
+
115
+ @ary = GetText::RGetText.parse(['testlib/erb.rxml'])
116
+ assert_target 'aaa', ['testlib/erb.rxml:9']
117
+ assert_target 'aaa\n', ['testlib/erb.rxml:12']
118
+ assert_target 'bbb', ['testlib/erb.rxml:13']
119
+ assert_plural_target "ccc1", "ccc2", ['testlib/erb.rxml:14']
120
+
121
+ @ary = GetText::RGetText.parse(['testlib/ngettext.rb'])
122
+ assert_plural_target "ooo", "ppp", ['testlib/ngettext.rb:64', 'testlib/ngettext.rb:65']
123
+ assert_plural_target "qqq", "rrr", ['testlib/ngettext.rb:69', 'testlib/ngettext.rb:70']
124
+ end
125
+
126
+ private
127
+
128
+ def assert_target(msgid, sources = nil)
129
+ t = @ary.detect {|elem| elem.msgid == msgid}
130
+ if t
131
+ if sources
132
+ assert_equal sources.sort, t.sources.sort, 'Translation target sources do not match.'
133
+ end
134
+ yield t if block_given?
135
+ else
136
+ flunk "Expected a translation target with id '#{msgid}'. Not found."
137
+ end
138
+ end
139
+
140
+ def assert_plural_target(msgid, plural, sources = nil)
141
+ assert_target msgid, sources do |t|
142
+ assert_equal plural, t.msgid_plural, 'Expected plural form'
143
+ yield t if block_given?
144
+ end
145
+ end
146
+
147
+ def assert_target_in_context(msgctxt, msgid, sources = nil)
148
+ t = @ary.detect {|elem| elem.msgid == msgid && elem.msgctxt == msgctxt}
149
+ if t
150
+ if sources
151
+ assert_equal sources.sort, t.sources.sort, 'Translation target sources do not match.'
152
+ end
153
+ yield t if block_given?
154
+ else
155
+ flunk "Expected a translation target with id '#{msgid}' and context '#{msgctxt}'. Not found."
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,65 @@
1
+ require 'testlib/helper.rb'
2
+
3
+ class TestGetTextString < Test::Unit::TestCase
4
+ def test_sprintf
5
+ assert_equal("foo is a number", "%{msg} is a number" % {:msg => "foo"})
6
+ assert_equal("bar is a number", "%s is a number" % ["bar"])
7
+ assert_equal("bar is a number", "%s is a number" % "bar")
8
+ assert_equal("1, test", "%{num}, %{record}" % {:num => 1, :record => "test"})
9
+ assert_equal("test, 1", "%{record}, %{num}" % {:num => 1, :record => "test"})
10
+ assert_equal("1, test", "%d, %s" % [1, "test"])
11
+ assert_equal("test, 1", "%2$s, %1$d" % [1, "test"])
12
+ assert_raise(ArgumentError) { "%-%" % [1] }
13
+ end
14
+
15
+ def test_sprintf_placeholder_include_non_english
16
+ assert_equal("a", "%{foo+foo}" % {"foo+foo".to_sym => "a"})
17
+ assert_equal("a", "%{foo.foo}" % {"foo.foo".to_sym => "a"})
18
+ assert_equal("a }", "%{foo+foo} }" % {"foo+foo".to_sym => "a"})
19
+ assert_equal("a { b }", "%{foo+foo} { %{bar bar-} }" % {"foo+foo".to_sym => "a", "bar bar-".to_sym => "b"})
20
+ end
21
+
22
+ def test_percent
23
+ assert_equal("% 1", "%% %<num>d" % {:num => 1.0})
24
+ assert_equal("%{num} %<num>d", "%%{num} %%<num>d" % {:num => 1})
25
+ end
26
+
27
+ def test_sprintf_percent_in_replacement
28
+ assert_equal("%<not_translated>s", "%{msg}" % { :msg => '%<not_translated>s', :not_translated => 'should not happen' })
29
+ end
30
+
31
+ def test_sprintf_lack_argument
32
+ assert_equal("%{num}, test", "%{num}, %{record}" % {:record => "test"})
33
+ assert_equal("%{record}", "%{record}" % {:num => 1})
34
+ end
35
+
36
+ def test_no_placeholder
37
+ assert_equal("aaa", "aaa" % {:num => 1})
38
+ assert_equal("bbb", "bbb" % [1])
39
+ end
40
+
41
+ def test_sprintf_ruby19_style
42
+ assert_equal("1", "%<num>d" % {:num => 1})
43
+ assert_equal("0b1", "%<num>#b" % {:num => 1})
44
+ assert_equal("foo", "%<msg>s" % {:msg => "foo"})
45
+ assert_equal("1.000000", "%<num>f" % {:num => 1.0})
46
+ assert_equal(" 1", "%<num>3.0f" % {:num => 1.0})
47
+ assert_equal("100.00", "%<num>2.2f" % {:num => 100.0})
48
+ assert_equal("0x64", "%<num>#x" % {:num => 100.0})
49
+ assert_equal("a", "%<foo.foo>s" % {"foo.foo".to_sym => "a"})
50
+ assert_raise(ArgumentError) { "%<num>,d" % {:num => 100} }
51
+ assert_raise(ArgumentError) { "%<num>/d" % {:num => 100} }
52
+ end
53
+
54
+ def test_sprintf_old_style
55
+ assert_equal("foo 1.000000", "%s %f" % ["foo", 1.0])
56
+ end
57
+
58
+ def test_sprintf_mix
59
+ assert_equal("foo 1.000000", "%{name} %<num>f" % {:name => "foo", :num => 1.0})
60
+ assert_equal("%{name} 1.000000", "%{name} %f" % [1.0])
61
+ assert_equal("%{name} 1.000000", "%{name} %f" % [1.0, 2.0])
62
+ end
63
+
64
+
65
+ end
@@ -0,0 +1,80 @@
1
+ require 'testlib/helper.rb'
2
+ require 'testlib/multi_textdomain.rb'
3
+
4
+ class TestGetTextMulti < Test::Unit::TestCase
5
+
6
+ def setup
7
+ GetText.locale = "ja"
8
+ end
9
+
10
+ def test_two_domains_in_a_class
11
+
12
+ test = C11.new
13
+ assert_equal("japanese", test.test) # Use test1.po
14
+ assert_equal("JAPANESE", test.test2) # Use test2.po
15
+
16
+ test = C12.new
17
+ assert_equal("japanese", test.test) # Use test1.po
18
+ assert_equal("JAPANESE", test.test2) # Use test2.po
19
+ end
20
+
21
+ def test_inheritance
22
+ # inheritance. only parent has a textdomain and it's methods
23
+ test = C21.new
24
+ assert_equal("japanese", test.test) # Use C11's po(test1.po)
25
+ assert_equal("JAPANESE", test.test2) # Use C11's po(test2.po)
26
+
27
+ test = C22.new
28
+ assert_equal("japanese", test.test) # Use C11's po(test1.po)
29
+ assert_equal("JAPANESE", test.test2) # Use C11's po(test2.po)
30
+ end
31
+
32
+ def test_module_and_sub_modules
33
+ # module
34
+ assert_equal("japanese", M1.test)
35
+
36
+ # sub-module. only an included module has a textdomain and it's methods
37
+ assert_equal("japanese", M1::M1M1.test) # Same method with M1.
38
+ assert_equal("LANGUAGE", M1::M1M1.test2) # No influence from ancestors.
39
+
40
+ # sub-class (class bindtextdomain).
41
+ test = M1::M1C1.new
42
+ assert_equal("japanese", test.test) # Use test1.po
43
+ assert_equal("JAPANESE", test.test2) # Use test2.po
44
+
45
+ # sub-class (instance bindtextdomain).
46
+ test = M1::M1C2.new
47
+ assert_equal("japanese", test.test) # Use test1.po
48
+ assert_equal("JAPANESE", test.test2) # Use test2.po
49
+ end
50
+
51
+ def test_eval
52
+ test = C2.new
53
+ assert_equal("japanese", test.test) # Use test1.po
54
+ end
55
+
56
+ def test_as_class_methods
57
+ test = C3.new
58
+ assert_equal("japanese", test.test) # Use test1.po
59
+ assert_equal("japanese", C3.test) # Use test1.po
60
+ end
61
+
62
+ def test_simple_inheritance
63
+ test = C4.new
64
+ assert_equal("japanese", test.test) # Use C3's test1.po
65
+ assert_equal("japanese", C4.test) # Use C3's test1.po
66
+ assert_equal("JAPANESE", test.test2) # Use C4's test2.po
67
+ assert_equal("no data", test.test3) # No po file.
68
+ end
69
+
70
+ def test_same_msgid_but_different_textdomain
71
+ test1 = C12.new # test1 domain
72
+ test2 = C51.new # test3 domain
73
+ test3 = C52.new # test3 domain but inherited C11.
74
+
75
+ assert_equal("japanese", test1.test) # Use text1 message
76
+ assert_equal("JAPANESE", test2.test) # Use text3 message
77
+ assert_equal("JAPANESE", test3.test) # Use text3 message
78
+ end
79
+
80
+ end
@@ -0,0 +1,42 @@
1
+ require 'testlib/helper.rb'
2
+ include GetText
3
+
4
+ bindtextdomain("test1", :path => "locale")
5
+ module M1
6
+ module_function
7
+ def module_function
8
+ _("language")
9
+ end
10
+ end
11
+
12
+ class C1
13
+ def instance_method
14
+ _("language")
15
+ end
16
+ def self.class_method
17
+ _("language")
18
+ end
19
+ end
20
+
21
+ def toplevel_method
22
+ _("language")
23
+ end
24
+
25
+ class TestGetText < Test::Unit::TestCase
26
+ include GetText
27
+
28
+ def test_toplevel
29
+ GetText.locale = "ja"
30
+ assert_equal("japanese", toplevel_method)
31
+ assert_equal("japanese", M1.module_function)
32
+ assert_equal("japanese", C1.class_method)
33
+ assert_equal("japanese", C1.new.instance_method)
34
+
35
+ GetText::TextDomainManager.clear_all_textdomains
36
+ GetText.bindtextdomain("test1", :path => "locale")
37
+ assert_equal("japanese", toplevel_method)
38
+ assert_equal("japanese", M1.module_function)
39
+ assert_equal("japanese", C1.class_method)
40
+ assert_equal("japanese", C1.new.instance_method)
41
+ end
42
+ end
@@ -0,0 +1,66 @@
1
+ require 'gettext'
2
+ include GetText
3
+
4
+ class TestRubyParser_N
5
+ bindtextdomain("testN_rubyparser", :path => "locale")
6
+
7
+ def testN_1
8
+ N_("aaa")
9
+ end
10
+
11
+ def testN_2
12
+ N_("aaa\n")
13
+ end
14
+
15
+ def testN_3
16
+ N_("bbb\nccc")
17
+ end
18
+
19
+ def testN_4
20
+ N_("bbb
21
+ ccc
22
+ ddd
23
+ ")
24
+ end
25
+
26
+ def testN_5
27
+ N_("eee")
28
+ end
29
+
30
+ def testN_6
31
+ N_("eee") + "foo" + N_("fff")
32
+ end
33
+
34
+ def testN_7
35
+ N_("ggg"\
36
+ "hhh"\
37
+ "iii")
38
+ end
39
+
40
+ def testN_8
41
+ N_('a"b"c"')
42
+ end
43
+
44
+ def testN_9
45
+ N_("d\"e\"f\"")
46
+ end
47
+
48
+ def testN_10
49
+ N_("jjj") +
50
+ N_("kkk")
51
+ end
52
+
53
+ def testN_11
54
+ N_("lll" + "mmm")
55
+ end
56
+
57
+ def testN_12
58
+ puts N_(msg), "ppp" #Ignored
59
+ end
60
+
61
+ def testN_13
62
+ N_("nnn\n" +
63
+ "ooo")
64
+ end
65
+ end
66
+
@@ -0,0 +1,15 @@
1
+ <%
2
+ require 'gettext'
3
+ include GetText
4
+ bindtextdomain("helloerb", :path => "locale")
5
+ %>
6
+ <html>
7
+ <head>
8
+ <title><%= _("aaa") %></title>
9
+ </head>
10
+ <body>
11
+ <h1><%= _("aaa\n") %></h1>
12
+ <p><%= N_("bbb") %></p>
13
+ <p><%= n_("ccc1", "ccc2", 1) %></p>
14
+ </body>
15
+ </html>
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <%
3
+ require 'gettext'
4
+ include GetText
5
+ bindtextdomain("helloerb", :path => "locale")
6
+ %>
7
+ <html>
8
+ <head>
9
+ <title><%= _("aaa") %></title>
10
+ </head>
11
+ <body>
12
+ <h1><%= _("aaa\n") %></h1>
13
+ <p><%= N_("bbb") %></p>
14
+ <p><%= n_("ccc1", "ccc2", 1) %></p>
15
+ </body>
16
+ </html>
@@ -0,0 +1,113 @@
1
+ require 'gettext'
2
+ include GetText
3
+
4
+ class TestRubyParser
5
+ bindtextdomain("rubyparser", :path => "locale")
6
+
7
+ def test_1
8
+ _("aaa")
9
+ end
10
+
11
+ def test_2
12
+ _("aaa\n")
13
+ end
14
+
15
+ def test_3
16
+ _("bbb\nccc")
17
+ end
18
+
19
+ def test_4
20
+ _("bbb
21
+ ccc
22
+ ddd
23
+ ")
24
+ end
25
+
26
+ def test_5
27
+ _("eee")
28
+ end
29
+
30
+ def test_6
31
+ _("eee") + "foo" + _("fff")
32
+ end
33
+
34
+ def test_7
35
+ _("ggg"\
36
+ "hhh"\
37
+ "iii")
38
+ end
39
+
40
+ def test_8
41
+ _('a"b"c"')
42
+ end
43
+
44
+ def test_9
45
+ _("d\"e\"f\"")
46
+ end
47
+
48
+ def test_10
49
+ _("jjj") +
50
+ _("kkk")
51
+ end
52
+
53
+ def test_11
54
+ _("lll" + "mmm")
55
+ end
56
+
57
+ def test_12
58
+ puts _(msg), "ppp" #Ignored
59
+ end
60
+
61
+ def test_13
62
+ _("nnn\n" +
63
+ "ooo")
64
+ end
65
+ def test_14
66
+ _("\#")
67
+ end
68
+
69
+ def test_15
70
+ _('#')
71
+ end
72
+
73
+ def test_16
74
+ _('\taaa')
75
+ end
76
+
77
+ def test_17
78
+ ret = _(<<EOF
79
+ Here document1
80
+ Here document2
81
+ EOF
82
+ )
83
+ end
84
+
85
+ def test_18
86
+ "<div>#{_('in_quote')}</div>"
87
+ end
88
+
89
+ def about
90
+ puts (
91
+ # TRANSLATORS: This is a proper name. See the gettext
92
+ # manual, section Names. Note this is actually a non-ASCII
93
+ # name: The first name is (with Unicode escapes)
94
+ # "Fran\u00e7ois" or (with HTML entities) "Fran&ccedil;ois".
95
+ # Pronunciation is like "fraa-swa pee-nar".
96
+ # This is an example from GNU gettext documentation.
97
+ _("Francois Pinard"))
98
+
99
+ puts (
100
+ # This comment should not be extracted because it does
101
+ # not start with 'TRANSLATORS:'
102
+ _('self explaining'))
103
+ end
104
+
105
+ end
106
+
107
+ module ActionController
108
+ class Base
109
+ end
110
+ end
111
+ class ApplicationController < ActionController::Base
112
+ "#{Time.now.strftime('%m/%d')}"
113
+ end