experteer-gettext 2.0.4

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 (424) hide show
  1. data/COPYING +55 -0
  2. data/ChangeLog +57 -0
  3. data/ChangeLog-1 +2016 -0
  4. data/NEWS-1 +414 -0
  5. data/README.rdoc +251 -0
  6. data/Rakefile +260 -0
  7. data/VERSION +2 -0
  8. data/bin/rgettext +24 -0
  9. data/bin/rmsgfmt +24 -0
  10. data/bin/rmsgmerge +24 -0
  11. data/gettext.gemspec +494 -0
  12. data/lib/gettext/cgi.rb +39 -0
  13. data/lib/gettext/class_info.rb +67 -0
  14. data/lib/gettext/core_ext/iconv.rb +112 -0
  15. data/lib/gettext/core_ext/string.rb +84 -0
  16. data/lib/gettext/locale_path.rb +123 -0
  17. data/lib/gettext/mofile.rb +330 -0
  18. data/lib/gettext/parser/erb.rb +54 -0
  19. data/lib/gettext/parser/glade.rb +100 -0
  20. data/lib/gettext/parser/ruby.rb +193 -0
  21. data/lib/gettext/poparser.rb +355 -0
  22. data/lib/gettext/textdomain.rb +179 -0
  23. data/lib/gettext/textdomain_group.rb +24 -0
  24. data/lib/gettext/textdomain_manager.rb +212 -0
  25. data/lib/gettext/tools/rgettext.rb +236 -0
  26. data/lib/gettext/tools/rmsgfmt.rb +84 -0
  27. data/lib/gettext/tools/rmsgmerge.rb +498 -0
  28. data/lib/gettext/tools.rb +195 -0
  29. data/lib/gettext/translation_target.rb +93 -0
  30. data/lib/gettext/utils.rb +37 -0
  31. data/lib/gettext/version.rb +12 -0
  32. data/lib/gettext.rb +312 -0
  33. data/po/bg/rgettext.po +130 -0
  34. data/po/bs/rgettext.po +131 -0
  35. data/po/ca/rgettext.po +129 -0
  36. data/po/cs/rgettext.po +132 -0
  37. data/po/de/rgettext.po +137 -0
  38. data/po/el/rgettext.po +128 -0
  39. data/po/eo/rgettext.po +129 -0
  40. data/po/es/rgettext.po +130 -0
  41. data/po/et/rgettext.po +127 -0
  42. data/po/fr/rgettext.po +133 -0
  43. data/po/hr/rgettext.po +131 -0
  44. data/po/hu/rgettext.po +129 -0
  45. data/po/it/rgettext.po +130 -0
  46. data/po/ja/rgettext.po +129 -0
  47. data/po/ko/rgettext.po +129 -0
  48. data/po/lv/rgettext.po +130 -0
  49. data/po/nb/rgettext.po +131 -0
  50. data/po/nl/rgettext.po +130 -0
  51. data/po/pt_BR/rgettext.po +132 -0
  52. data/po/rgettext.pot +121 -0
  53. data/po/ru/rgettext.po +131 -0
  54. data/po/sr/rgettext.po +130 -0
  55. data/po/sv/rgettext.po +123 -0
  56. data/po/ua/rgettext.po +134 -0
  57. data/po/vi/rgettext.po +128 -0
  58. data/po/zh/rgettext.po +129 -0
  59. data/po/zh_TW/rgettext.po +128 -0
  60. data/samples/README +16 -0
  61. data/samples/cgi/README +43 -0
  62. data/samples/cgi/Rakefile +27 -0
  63. data/samples/cgi/cookie.cgi +64 -0
  64. data/samples/cgi/gettext.css +116 -0
  65. data/samples/cgi/helloerb.rhtml +28 -0
  66. data/samples/cgi/helloerb1.cgi +58 -0
  67. data/samples/cgi/helloerb2.cgi +51 -0
  68. data/samples/cgi/hellolib.rb +20 -0
  69. data/samples/cgi/http.rb +51 -0
  70. data/samples/cgi/index.cgi +111 -0
  71. data/samples/cgi/other.rhtml +20 -0
  72. data/samples/cgi/po/bg/helloerb1.po +59 -0
  73. data/samples/cgi/po/bg/helloerb2.po +51 -0
  74. data/samples/cgi/po/bg/hellolib.po +23 -0
  75. data/samples/cgi/po/bg/main.po +83 -0
  76. data/samples/cgi/po/bs/helloerb1.po +59 -0
  77. data/samples/cgi/po/bs/helloerb2.po +51 -0
  78. data/samples/cgi/po/bs/hellolib.po +23 -0
  79. data/samples/cgi/po/bs/main.po +83 -0
  80. data/samples/cgi/po/ca/helloerb1.po +59 -0
  81. data/samples/cgi/po/ca/helloerb2.po +51 -0
  82. data/samples/cgi/po/ca/hellolib.po +23 -0
  83. data/samples/cgi/po/ca/main.po +83 -0
  84. data/samples/cgi/po/cs/helloerb1.po +61 -0
  85. data/samples/cgi/po/cs/helloerb2.po +52 -0
  86. data/samples/cgi/po/cs/hellolib.po +25 -0
  87. data/samples/cgi/po/cs/main.po +85 -0
  88. data/samples/cgi/po/de/helloerb1.po +61 -0
  89. data/samples/cgi/po/de/helloerb2.po +52 -0
  90. data/samples/cgi/po/de/hellolib.po +24 -0
  91. data/samples/cgi/po/de/main.po +86 -0
  92. data/samples/cgi/po/el/helloerb1.po +60 -0
  93. data/samples/cgi/po/el/helloerb2.po +51 -0
  94. data/samples/cgi/po/el/hellolib.po +23 -0
  95. data/samples/cgi/po/el/main.po +84 -0
  96. data/samples/cgi/po/eo/helloerb1.po +60 -0
  97. data/samples/cgi/po/eo/helloerb2.po +52 -0
  98. data/samples/cgi/po/eo/hellolib.po +24 -0
  99. data/samples/cgi/po/eo/main.po +84 -0
  100. data/samples/cgi/po/es/helloerb1.po +59 -0
  101. data/samples/cgi/po/es/helloerb2.po +50 -0
  102. data/samples/cgi/po/es/hellolib.po +22 -0
  103. data/samples/cgi/po/es/main.po +83 -0
  104. data/samples/cgi/po/fr/helloerb1.po +59 -0
  105. data/samples/cgi/po/fr/helloerb2.po +51 -0
  106. data/samples/cgi/po/fr/hellolib.po +22 -0
  107. data/samples/cgi/po/fr/main.po +85 -0
  108. data/samples/cgi/po/helloerb1.pot +60 -0
  109. data/samples/cgi/po/helloerb2.pot +52 -0
  110. data/samples/cgi/po/hellolib.pot +24 -0
  111. data/samples/cgi/po/hr/helloerb1.po +59 -0
  112. data/samples/cgi/po/hr/helloerb2.po +51 -0
  113. data/samples/cgi/po/hr/hellolib.po +23 -0
  114. data/samples/cgi/po/hr/main.po +83 -0
  115. data/samples/cgi/po/hu/helloerb1.po +59 -0
  116. data/samples/cgi/po/hu/helloerb2.po +51 -0
  117. data/samples/cgi/po/hu/hellolib.po +23 -0
  118. data/samples/cgi/po/hu/main.po +82 -0
  119. data/samples/cgi/po/it/helloerb1.po +60 -0
  120. data/samples/cgi/po/it/helloerb2.po +52 -0
  121. data/samples/cgi/po/it/hellolib.po +24 -0
  122. data/samples/cgi/po/it/main.po +84 -0
  123. data/samples/cgi/po/ja/helloerb1.po +60 -0
  124. data/samples/cgi/po/ja/helloerb2.po +52 -0
  125. data/samples/cgi/po/ja/hellolib.po +24 -0
  126. data/samples/cgi/po/ja/main.po +85 -0
  127. data/samples/cgi/po/ko/helloerb1.po +59 -0
  128. data/samples/cgi/po/ko/helloerb2.po +51 -0
  129. data/samples/cgi/po/ko/hellolib.po +23 -0
  130. data/samples/cgi/po/ko/main.po +84 -0
  131. data/samples/cgi/po/lv/helloerb1.po +65 -0
  132. data/samples/cgi/po/lv/helloerb2.po +52 -0
  133. data/samples/cgi/po/lv/hellolib.po +24 -0
  134. data/samples/cgi/po/lv/main.po +77 -0
  135. data/samples/cgi/po/main.pot +80 -0
  136. data/samples/cgi/po/nb/helloerb1.po +60 -0
  137. data/samples/cgi/po/nb/helloerb2.po +52 -0
  138. data/samples/cgi/po/nb/hellolib.po +24 -0
  139. data/samples/cgi/po/nb/main.po +84 -0
  140. data/samples/cgi/po/nl/helloerb1.po +61 -0
  141. data/samples/cgi/po/nl/helloerb2.po +52 -0
  142. data/samples/cgi/po/nl/hellolib.po +24 -0
  143. data/samples/cgi/po/nl/main.po +86 -0
  144. data/samples/cgi/po/pt_BR/helloerb1.po +59 -0
  145. data/samples/cgi/po/pt_BR/helloerb2.po +51 -0
  146. data/samples/cgi/po/pt_BR/hellolib.po +23 -0
  147. data/samples/cgi/po/pt_BR/main.po +84 -0
  148. data/samples/cgi/po/ru/helloerb1.po +58 -0
  149. data/samples/cgi/po/ru/helloerb2.po +50 -0
  150. data/samples/cgi/po/ru/hellolib.po +22 -0
  151. data/samples/cgi/po/ru/main.po +82 -0
  152. data/samples/cgi/po/sr/helloerb1.po +60 -0
  153. data/samples/cgi/po/sr/helloerb2.po +52 -0
  154. data/samples/cgi/po/sr/hellolib.po +24 -0
  155. data/samples/cgi/po/sr/main.po +80 -0
  156. data/samples/cgi/po/ua/helloerb1.po +62 -0
  157. data/samples/cgi/po/ua/helloerb2.po +54 -0
  158. data/samples/cgi/po/ua/hellolib.po +26 -0
  159. data/samples/cgi/po/ua/main.po +84 -0
  160. data/samples/cgi/po/vi/helloerb1.po +65 -0
  161. data/samples/cgi/po/vi/helloerb2.po +52 -0
  162. data/samples/cgi/po/vi/hellolib.po +24 -0
  163. data/samples/cgi/po/vi/main.po +77 -0
  164. data/samples/cgi/po/zh/helloerb1.po +60 -0
  165. data/samples/cgi/po/zh/helloerb2.po +52 -0
  166. data/samples/cgi/po/zh/hellolib.po +24 -0
  167. data/samples/cgi/po/zh/main.po +80 -0
  168. data/samples/cgi/po/zh_TW/helloerb1.po +67 -0
  169. data/samples/cgi/po/zh_TW/helloerb2.po +54 -0
  170. data/samples/cgi/po/zh_TW/hellolib.po +26 -0
  171. data/samples/cgi/po/zh_TW/main.po +79 -0
  172. data/samples/hello.rb +36 -0
  173. data/samples/hello2.rb +23 -0
  174. data/samples/hello_glade2.glade +70 -0
  175. data/samples/hello_glade2.rb +25 -0
  176. data/samples/hello_gtk2.rb +27 -0
  177. data/samples/hello_noop.rb +31 -0
  178. data/samples/hello_plural.rb +26 -0
  179. data/samples/hello_tk.rb +19 -0
  180. data/samples/makemo.rb +4 -0
  181. data/samples/po/bg/hello.po +24 -0
  182. data/samples/po/bg/hello2.po +31 -0
  183. data/samples/po/bg/hello_glade2.po +31 -0
  184. data/samples/po/bg/hello_gtk.po +23 -0
  185. data/samples/po/bg/hello_noop.po +27 -0
  186. data/samples/po/bg/hello_plural.po +25 -0
  187. data/samples/po/bg/hello_tk.po +23 -0
  188. data/samples/po/bs/hello.po +23 -0
  189. data/samples/po/bs/hello2.po +31 -0
  190. data/samples/po/bs/hello_glade2.po +31 -0
  191. data/samples/po/bs/hello_gtk.po +23 -0
  192. data/samples/po/bs/hello_noop.po +27 -0
  193. data/samples/po/bs/hello_plural.po +26 -0
  194. data/samples/po/bs/hello_tk.po +23 -0
  195. data/samples/po/ca/hello.po +23 -0
  196. data/samples/po/ca/hello2.po +31 -0
  197. data/samples/po/ca/hello_glade2.po +31 -0
  198. data/samples/po/ca/hello_gtk.po +23 -0
  199. data/samples/po/ca/hello_noop.po +27 -0
  200. data/samples/po/ca/hello_plural.po +25 -0
  201. data/samples/po/ca/hello_tk.po +23 -0
  202. data/samples/po/cs/hello.po +23 -0
  203. data/samples/po/cs/hello2.po +31 -0
  204. data/samples/po/cs/hello_glade2.po +37 -0
  205. data/samples/po/cs/hello_gtk.po +23 -0
  206. data/samples/po/cs/hello_noop.po +27 -0
  207. data/samples/po/cs/hello_plural.po +26 -0
  208. data/samples/po/cs/hello_tk.po +23 -0
  209. data/samples/po/de/hello.po +20 -0
  210. data/samples/po/de/hello2.po +28 -0
  211. data/samples/po/de/hello_glade2.po +27 -0
  212. data/samples/po/de/hello_gtk.po +20 -0
  213. data/samples/po/de/hello_noop.po +24 -0
  214. data/samples/po/de/hello_plural.po +25 -0
  215. data/samples/po/de/hello_tk.po +20 -0
  216. data/samples/po/el/hello.po +23 -0
  217. data/samples/po/el/hello2.po +31 -0
  218. data/samples/po/el/hello_glade2.po +31 -0
  219. data/samples/po/el/hello_gtk.po +22 -0
  220. data/samples/po/el/hello_noop.po +27 -0
  221. data/samples/po/el/hello_plural.po +25 -0
  222. data/samples/po/el/hello_tk.po +23 -0
  223. data/samples/po/eo/hello.po +23 -0
  224. data/samples/po/eo/hello2.po +31 -0
  225. data/samples/po/eo/hello_glade2.po +32 -0
  226. data/samples/po/eo/hello_gtk.po +23 -0
  227. data/samples/po/eo/hello_noop.po +27 -0
  228. data/samples/po/eo/hello_plural.po +26 -0
  229. data/samples/po/eo/hello_tk.po +24 -0
  230. data/samples/po/es/hello.po +21 -0
  231. data/samples/po/es/hello2.po +28 -0
  232. data/samples/po/es/hello_glade2.po +28 -0
  233. data/samples/po/es/hello_gtk.po +20 -0
  234. data/samples/po/es/hello_noop.po +24 -0
  235. data/samples/po/es/hello_plural.po +23 -0
  236. data/samples/po/es/hello_tk.po +20 -0
  237. data/samples/po/fr/hello.po +18 -0
  238. data/samples/po/fr/hello2.po +26 -0
  239. data/samples/po/fr/hello_glade2.po +27 -0
  240. data/samples/po/fr/hello_gtk.po +18 -0
  241. data/samples/po/fr/hello_noop.po +22 -0
  242. data/samples/po/fr/hello_plural.po +21 -0
  243. data/samples/po/fr/hello_tk.po +18 -0
  244. data/samples/po/hello.pot +23 -0
  245. data/samples/po/hello2.pot +31 -0
  246. data/samples/po/hello_glade2.pot +32 -0
  247. data/samples/po/hello_gtk.pot +23 -0
  248. data/samples/po/hello_noop.pot +27 -0
  249. data/samples/po/hello_plural.pot +26 -0
  250. data/samples/po/hello_tk.pot +24 -0
  251. data/samples/po/hr/hello.po +23 -0
  252. data/samples/po/hr/hello2.po +31 -0
  253. data/samples/po/hr/hello_glade2.po +31 -0
  254. data/samples/po/hr/hello_gtk.po +23 -0
  255. data/samples/po/hr/hello_noop.po +27 -0
  256. data/samples/po/hr/hello_plural.po +26 -0
  257. data/samples/po/hr/hello_tk.po +23 -0
  258. data/samples/po/hu/hello.po +22 -0
  259. data/samples/po/hu/hello2.po +30 -0
  260. data/samples/po/hu/hello_glade2.po +31 -0
  261. data/samples/po/hu/hello_gtk.po +22 -0
  262. data/samples/po/hu/hello_noop.po +26 -0
  263. data/samples/po/hu/hello_plural.po +25 -0
  264. data/samples/po/hu/hello_tk.po +23 -0
  265. data/samples/po/it/hello.po +20 -0
  266. data/samples/po/it/hello2.po +28 -0
  267. data/samples/po/it/hello_glade2.po +28 -0
  268. data/samples/po/it/hello_gtk.po +21 -0
  269. data/samples/po/it/hello_noop.po +24 -0
  270. data/samples/po/it/hello_plural.po +23 -0
  271. data/samples/po/it/hello_tk.po +21 -0
  272. data/samples/po/ja/hello.po +20 -0
  273. data/samples/po/ja/hello2.po +28 -0
  274. data/samples/po/ja/hello_glade2.po +26 -0
  275. data/samples/po/ja/hello_gtk.po +19 -0
  276. data/samples/po/ja/hello_noop.po +23 -0
  277. data/samples/po/ja/hello_plural.po +21 -0
  278. data/samples/po/ja/hello_tk.po +19 -0
  279. data/samples/po/ko/hello.po +18 -0
  280. data/samples/po/ko/hello2.po +26 -0
  281. data/samples/po/ko/hello_glade2.po +29 -0
  282. data/samples/po/ko/hello_gtk.po +18 -0
  283. data/samples/po/ko/hello_noop.po +22 -0
  284. data/samples/po/ko/hello_plural.po +25 -0
  285. data/samples/po/ko/hello_tk.po +19 -0
  286. data/samples/po/lv/hello.po +24 -0
  287. data/samples/po/lv/hello2.po +32 -0
  288. data/samples/po/lv/hello_glade2.po +38 -0
  289. data/samples/po/lv/hello_gtk.po +24 -0
  290. data/samples/po/lv/hello_noop.po +28 -0
  291. data/samples/po/lv/hello_plural.po +26 -0
  292. data/samples/po/lv/hello_tk.po +24 -0
  293. data/samples/po/nb/hello.po +23 -0
  294. data/samples/po/nb/hello2.po +31 -0
  295. data/samples/po/nb/hello_glade2.po +31 -0
  296. data/samples/po/nb/hello_gtk.po +23 -0
  297. data/samples/po/nb/hello_noop.po +27 -0
  298. data/samples/po/nb/hello_plural.po +26 -0
  299. data/samples/po/nb/hello_tk.po +24 -0
  300. data/samples/po/nl/hello.po +24 -0
  301. data/samples/po/nl/hello2.po +32 -0
  302. data/samples/po/nl/hello_glade2.po +31 -0
  303. data/samples/po/nl/hello_gtk.po +24 -0
  304. data/samples/po/nl/hello_noop.po +28 -0
  305. data/samples/po/nl/hello_plural.po +25 -0
  306. data/samples/po/nl/hello_tk.po +24 -0
  307. data/samples/po/pt_BR/hello.po +21 -0
  308. data/samples/po/pt_BR/hello2.po +29 -0
  309. data/samples/po/pt_BR/hello_glade2.po +29 -0
  310. data/samples/po/pt_BR/hello_gtk.po +21 -0
  311. data/samples/po/pt_BR/hello_noop.po +25 -0
  312. data/samples/po/pt_BR/hello_plural.po +23 -0
  313. data/samples/po/pt_BR/hello_tk.po +21 -0
  314. data/samples/po/ru/hello.po +22 -0
  315. data/samples/po/ru/hello2.po +30 -0
  316. data/samples/po/ru/hello_glade2.po +30 -0
  317. data/samples/po/ru/hello_gtk.po +22 -0
  318. data/samples/po/ru/hello_noop.po +26 -0
  319. data/samples/po/ru/hello_plural.po +28 -0
  320. data/samples/po/ru/hello_tk.po +22 -0
  321. data/samples/po/sr/hello.po +22 -0
  322. data/samples/po/sr/hello2.po +30 -0
  323. data/samples/po/sr/hello_glade2.po +32 -0
  324. data/samples/po/sr/hello_gtk.po +22 -0
  325. data/samples/po/sr/hello_noop.po +26 -0
  326. data/samples/po/sr/hello_plural.po +26 -0
  327. data/samples/po/sr/hello_tk.po +24 -0
  328. data/samples/po/sv/hello.po +20 -0
  329. data/samples/po/sv/hello2.po +28 -0
  330. data/samples/po/sv/hello_glade2.po +28 -0
  331. data/samples/po/sv/hello_gtk.po +20 -0
  332. data/samples/po/sv/hello_noop.po +24 -0
  333. data/samples/po/sv/hello_plural.po +23 -0
  334. data/samples/po/sv/hello_tk.po +20 -0
  335. data/samples/po/test.rb +11 -0
  336. data/samples/po/ua/hello.po +22 -0
  337. data/samples/po/ua/hello2.po +30 -0
  338. data/samples/po/ua/hello_glade2.po +34 -0
  339. data/samples/po/ua/hello_gtk.po +22 -0
  340. data/samples/po/ua/hello_noop.po +26 -0
  341. data/samples/po/ua/hello_plural.po +29 -0
  342. data/samples/po/ua/hello_tk.po +26 -0
  343. data/samples/po/vi/hello.po +23 -0
  344. data/samples/po/vi/hello2.po +31 -0
  345. data/samples/po/vi/hello_glade2.po +38 -0
  346. data/samples/po/vi/hello_gtk.po +23 -0
  347. data/samples/po/vi/hello_noop.po +27 -0
  348. data/samples/po/vi/hello_plural.po +26 -0
  349. data/samples/po/vi/hello_tk.po +24 -0
  350. data/samples/po/zh/hello.po +23 -0
  351. data/samples/po/zh/hello2.po +31 -0
  352. data/samples/po/zh/hello_glade2.po +31 -0
  353. data/samples/po/zh/hello_gtk.po +23 -0
  354. data/samples/po/zh/hello_noop.po +27 -0
  355. data/samples/po/zh/hello_plural.po +25 -0
  356. data/samples/po/zh/hello_tk.po +23 -0
  357. data/samples/po/zh_TW/hello.po +26 -0
  358. data/samples/po/zh_TW/hello2.po +34 -0
  359. data/samples/po/zh_TW/hello_glade2.po +40 -0
  360. data/samples/po/zh_TW/hello_gtk.po +25 -0
  361. data/samples/po/zh_TW/hello_noop.po +30 -0
  362. data/samples/po/zh_TW/hello_plural.po +28 -0
  363. data/samples/po/zh_TW/hello_tk.po +26 -0
  364. data/test/README +1 -0
  365. data/test/Rakefile +17 -0
  366. data/test/po/cr/plural.po +23 -0
  367. data/test/po/da/plural.po +22 -0
  368. data/test/po/da/plural_error.po +22 -0
  369. data/test/po/fr/plural.po +28 -0
  370. data/test/po/fr/plural_error.po +20 -0
  371. data/test/po/fr/test1.po +23 -0
  372. data/test/po/fr/test2.po +19 -0
  373. data/test/po/ir/plural.po +23 -0
  374. data/test/po/ja/npgettext.po +46 -0
  375. data/test/po/ja/nsgettext.po +65 -0
  376. data/test/po/ja/pgettext.po +41 -0
  377. data/test/po/ja/plural.po +28 -0
  378. data/test/po/ja/plural_error.po +20 -0
  379. data/test/po/ja/rubyparser.po +43 -0
  380. data/test/po/ja/sgettext.po +47 -0
  381. data/test/po/ja/test1.po +23 -0
  382. data/test/po/ja/test2.po +19 -0
  383. data/test/po/ja/test3.po +19 -0
  384. data/test/po/la/plural.po +23 -0
  385. data/test/po/la/plural_error.po +21 -0
  386. data/test/po/li/plural.po +23 -0
  387. data/test/po/li/plural_error.po +27 -0
  388. data/test/po/po/plural.po +23 -0
  389. data/test/po/sl/plural.po +24 -0
  390. data/test/test_class_info.rb +83 -0
  391. data/test/test_gettext.rb +311 -0
  392. data/test/test_locale_path.rb +50 -0
  393. data/test/test_parser.rb +157 -0
  394. data/test/test_po_generation.rb +20 -0
  395. data/test/test_string.rb +65 -0
  396. data/test/test_textdomain_bind.rb +37 -0
  397. data/test/test_textdomain_multi.rb +80 -0
  398. data/test/test_textdomain_toplevel.rb +42 -0
  399. data/test/test_thread.rb +41 -0
  400. data/test/test_translation_target.rb +29 -0
  401. data/test/testlib/N_.rb +66 -0
  402. data/test/testlib/erb.rhtml +15 -0
  403. data/test/testlib/erb.rxml +16 -0
  404. data/test/testlib/gettext.rb +113 -0
  405. data/test/testlib/gladeparser.glade +183 -0
  406. data/test/testlib/helper.rb +11 -0
  407. data/test/testlib/multi_textdomain.rb +131 -0
  408. data/test/testlib/ngettext.rb +79 -0
  409. data/test/testlib/npgettext.rb +31 -0
  410. data/test/testlib/nsgettext.rb +42 -0
  411. data/test/testlib/pgettext.rb +36 -0
  412. data/test/testlib/sgettext.rb +46 -0
  413. data/test/testlib/simple.rb +14 -0
  414. data/test/tools/files/app.pot +0 -0
  415. data/test/tools/files/de/app.po +0 -0
  416. data/test/tools/files/en/app.po +0 -0
  417. data/test/tools/files/en/test.po +21 -0
  418. data/test/tools/files/simple_1.po +2 -0
  419. data/test/tools/files/simple_2.po +2 -0
  420. data/test/tools/files/simple_translation.rb +1 -0
  421. data/test/tools/files/version.po +7 -0
  422. data/test/tools/test.pot +21 -0
  423. data/test/tools/test_tools.rb +61 -0
  424. metadata +510 -0
@@ -0,0 +1,100 @@
1
+ =begin
2
+ parser/glade.rb - parser for Glade-2
3
+
4
+ Copyright (C) 2004,2005 Masao Mutoh
5
+
6
+ You may redistribute it and/or modify it under the same
7
+ license terms as Ruby.
8
+
9
+ $Id: glade.rb,v 1.5 2006/06/11 15:36:20 mutoh Exp $
10
+ =end
11
+
12
+ require 'cgi'
13
+ require 'gettext'
14
+
15
+ module GetText
16
+ module GladeParser
17
+ extend GetText
18
+ extend self
19
+
20
+ bindtextdomain("rgettext")
21
+
22
+ TARGET1 = /<property.*translatable="yes">(.*)/
23
+ TARGET2 = /(.*)<\/property>/
24
+
25
+ def parse(file, targets = []) # :nodoc:
26
+ lines = IO.readlines(file)
27
+ parse_lines(file, lines, targets)
28
+ end
29
+
30
+ #from ary of lines.
31
+ def parse_lines(file, lines, targets) # :nodoc:
32
+ cnt = 0
33
+ target = false
34
+ line_no = 0
35
+ val = nil
36
+
37
+ loop do
38
+ line = lines.shift
39
+ break unless line
40
+
41
+ cnt += 1
42
+ if TARGET1 =~ line
43
+ line_no = cnt
44
+ val = $1 + "\n"
45
+ target = true
46
+ if TARGET2 =~ $1
47
+ val = $1
48
+ add_target(val, file, line_no, targets)
49
+ val = nil
50
+ target = false
51
+ end
52
+ elsif target
53
+ if TARGET2 =~ line
54
+ val << $1
55
+ add_target(val, file, line_no, targets)
56
+ val = nil
57
+ target = false
58
+ else
59
+ val << line
60
+ end
61
+ end
62
+ end
63
+ targets
64
+ end
65
+
66
+ XML_RE = /<\?xml/
67
+ GLADE_RE = /glade-2.0.dtd/
68
+
69
+ def target?(file) # :nodoc:
70
+ data = IO.readlines(file)
71
+ if XML_RE =~ data[0] and GLADE_RE =~ data[1]
72
+ true
73
+ else
74
+ if File.extname(file) == '.glade'
75
+ raise _("`%{file}' is not glade-2.0 format.") % {:file => file}
76
+ end
77
+ false
78
+ end
79
+ end
80
+
81
+ def add_target(val, file, line_no, targets) # :nodoc:
82
+ return unless val.size > 0
83
+ assoc_data = targets.assoc(val)
84
+ val = CGI.unescapeHTML(val)
85
+ if assoc_data
86
+ targets[targets.index(assoc_data)] = assoc_data << "#{file}:#{line_no}"
87
+ else
88
+ targets << [val.gsub(/\n/, '\n'), "#{file}:#{line_no}"]
89
+ end
90
+ targets
91
+ end
92
+ end
93
+ end
94
+
95
+ if __FILE__ == $0
96
+ # ex) ruby glade.rb foo.glade bar.glade
97
+ ARGV.each do |file|
98
+ p GetText::GladeParser.parse(file)
99
+ end
100
+ end
@@ -0,0 +1,193 @@
1
+ #!/usr/bin/ruby
2
+ =begin
3
+ parser/ruby.rb - parser for ruby script
4
+
5
+ Copyright (C) 2003-2005 Masao Mutoh
6
+ Copyright (C) 2005 speakillof
7
+ Copyright (C) 2001,2002 Yasushi Shoji, Masao Mutoh
8
+
9
+ You may redistribute it and/or modify it under the same
10
+ license terms as Ruby.
11
+
12
+ $Id: ruby.rb,v 1.13 2008/12/01 14:30:30 mutoh Exp $
13
+ =end
14
+
15
+ require 'irb/ruby-lex.rb'
16
+ require 'stringio'
17
+ require 'gettext/translation_target.rb'
18
+
19
+ class RubyLexX < RubyLex # :nodoc: all
20
+ # Parser#parse resemlbes RubyLex#lex
21
+ def parse
22
+ until ( (tk = token).kind_of?(RubyToken::TkEND_OF_SCRIPT) && !@continue or tk.nil? )
23
+ s = get_readed
24
+ if RubyToken::TkSTRING === tk
25
+ def tk.value
26
+ @value
27
+ end
28
+
29
+ def tk.value=(s)
30
+ @value = s
31
+ end
32
+
33
+ if @here_header
34
+ s = s.sub(/\A.*?\n/, '').sub(/^.*\n\Z/, '')
35
+ else
36
+ begin
37
+ s = eval(s)
38
+ rescue Exception
39
+ # Do nothing.
40
+ end
41
+ end
42
+
43
+ tk.value = s
44
+ end
45
+
46
+ if $DEBUG
47
+ if tk.is_a? TkSTRING
48
+ $stderr.puts("#{tk}: #{tk.value}")
49
+ elsif tk.is_a? TkIDENTIFIER
50
+ $stderr.puts("#{tk}: #{tk.name}")
51
+ else
52
+ $stderr.puts(tk)
53
+ end
54
+ end
55
+
56
+ yield tk
57
+ end
58
+ return nil
59
+ end
60
+
61
+ # Original parser does not keep the content of the comments,
62
+ # so monkey patching this with new token type and extended
63
+ # identify_comment implementation
64
+ RubyToken.def_token :TkCOMMENT_WITH_CONTENT, TkVal
65
+
66
+ def identify_comment
67
+ @ltype = "#"
68
+ get_readed # skip the hash sign itself
69
+
70
+ while ch = getc
71
+ if ch == "\n"
72
+ @ltype = nil
73
+ ungetc
74
+ break
75
+ end
76
+ end
77
+ return Token(TkCOMMENT_WITH_CONTENT, get_readed)
78
+ end
79
+
80
+ end
81
+
82
+ module GetText
83
+ module RubyParser
84
+ extend self
85
+
86
+ ID = ['gettext', '_', 'N_', 'sgettext', 's_']
87
+ PLURAL_ID = ['ngettext', 'n_', 'Nn_', 'ns_', 'nsgettext']
88
+ MSGCTXT_ID = ['pgettext', 'p_']
89
+ MSGCTXT_PLURAL_ID = ['npgettext', 'np_']
90
+
91
+ def parse(file, targets = []) # :nodoc:
92
+ lines = IO.readlines(file)
93
+ parse_lines(file, lines, targets)
94
+ end
95
+
96
+ def parse_lines(file_name, lines, targets) # :nodoc:
97
+ file = StringIO.new(lines.join + "\n")
98
+ rl = RubyLexX.new
99
+ rl.set_input(file)
100
+ rl.skip_space = true
101
+ #rl.readed_auto_clean_up = true
102
+
103
+ target = nil
104
+ line_no = nil
105
+ last_extracted_comment = ''
106
+ reset_extracted_comment = false
107
+ rl.parse do |tk|
108
+ begin
109
+ case tk
110
+ when RubyToken::TkIDENTIFIER, RubyToken::TkCONSTANT
111
+ if ID.include?(tk.name)
112
+ target = TranslationTarget.new(:normal)
113
+ elsif PLURAL_ID.include?(tk.name)
114
+ target = TranslationTarget.new(:plural)
115
+ elsif MSGCTXT_ID.include?(tk.name)
116
+ target = TranslationTarget.new(:msgctxt)
117
+ elsif MSGCTXT_PLURAL_ID.include?(tk.name)
118
+ target = TranslationTarget.new(:msgctxt_plural)
119
+ else
120
+ target = nil
121
+ end
122
+ line_no = tk.line_no.to_s
123
+ when RubyToken::TkSTRING
124
+ target.set_current_attribute tk.value if target
125
+ when RubyToken::TkPLUS, RubyToken::TkNL
126
+ #do nothing
127
+ when RubyToken::TkCOMMA
128
+ target.advance_to_next_attribute if target
129
+ else
130
+ if target && target.msgid
131
+ existing=targets.find {|t| t.matches?(target)}
132
+ existing=targets.index(existing) if existing
133
+ if existing
134
+ target = targets[existing].merge(target)
135
+ targets[existing] = target
136
+ else
137
+ targets << target
138
+ end
139
+ target.occurrences << file_name + ":" + line_no
140
+ target.add_extracted_comment last_extracted_comment unless last_extracted_comment.empty?
141
+ target = nil
142
+ end
143
+ end
144
+ rescue
145
+ $stderr.print "\n\nError"
146
+ $stderr.print " parsing #{file_name}:#{tk.line_no}\n\t #{lines[tk.line_no - 1]}" if tk
147
+ $stderr.print "\n #{$!.inspect} in\n"
148
+ $stderr.print $!.backtrace.join("\n")
149
+ $stderr.print "\n"
150
+ exit 1
151
+ end
152
+
153
+ case tk
154
+ when RubyToken::TkCOMMENT_WITH_CONTENT
155
+ last_extracted_comment = "" if reset_extracted_comment
156
+ if last_extracted_comment.empty?
157
+ # new comment from programmer to translator?
158
+ comment1 = tk.value.lstrip
159
+ if comment1 =~ /^TRANSLATORS\:/
160
+ last_extracted_comment += $'
161
+ end
162
+ else
163
+ last_extracted_comment += "\n"
164
+ last_extracted_comment += tk.value
165
+ end
166
+ reset_extracted_comment = false
167
+ when RubyToken::TkNL
168
+ else
169
+ reset_extracted_comment = true
170
+ end
171
+ end
172
+ targets
173
+ end
174
+
175
+ def target?(file) # :nodoc:
176
+ true # always true, as default parser.
177
+ end
178
+ end
179
+ end
180
+
181
+
182
+
183
+ if __FILE__ == $0
184
+ require 'pp'
185
+ ARGV.each do |file|
186
+ pp GetText::RubyParser.parse(file)
187
+ end
188
+
189
+ #rl = RubyLexX.new; rl.set_input(ARGF)
190
+ #rl.parse do |tk|
191
+ #p tk
192
+ #end
193
+ end
@@ -0,0 +1,355 @@
1
+ =begin
2
+ poparser.rb - Generate a .mo
3
+
4
+ Copyright (C) 2003-2009 Masao Mutoh <mutomasa at gmail.com>
5
+
6
+ You may redistribute it and/or modify it under the same
7
+ license terms as Ruby.
8
+ =end
9
+
10
+ #
11
+ # DO NOT MODIFY!!!!
12
+ # This file is automatically generated by Racc 1.4.6
13
+ # from Racc grammer file "".
14
+ #
15
+
16
+ require 'racc/parser.rb'
17
+ module GetText
18
+ class PoParser < Racc::Parser
19
+
20
+ module_eval(<<'...end poparser.ry/module_eval...', 'poparser.ry', 108)
21
+ include GetText
22
+ GetText.bindtextdomain("rgettext")
23
+
24
+ def unescape(orig)
25
+ ret = orig.gsub(/\\n/, "\n")
26
+ ret.gsub!(/\\t/, "\t")
27
+ ret.gsub!(/\\r/, "\r")
28
+ ret.gsub!(/\\"/, "\"")
29
+ ret
30
+ end
31
+
32
+ def parse(str, data, ignore_fuzzy = true)
33
+ @comments = []
34
+ @data = data
35
+ @fuzzy = false
36
+ @msgctxt = ""
37
+ $ignore_fuzzy = ignore_fuzzy
38
+
39
+ str.strip!
40
+ @q = []
41
+ until str.empty? do
42
+ case str
43
+ when /\A\s+/
44
+ str = $'
45
+ when /\Amsgctxt/
46
+ @q.push [:MSGCTXT, $&]
47
+ str = $'
48
+ when /\Amsgid_plural/
49
+ @q.push [:MSGID_PLURAL, $&]
50
+ str = $'
51
+ when /\Amsgid/
52
+ @q.push [:MSGID, $&]
53
+ str = $'
54
+ when /\Amsgstr/
55
+ @q.push [:MSGSTR, $&]
56
+ str = $'
57
+ when /\A\[(\d+)\]/
58
+ @q.push [:PLURAL_NUM, $1]
59
+ str = $'
60
+ when /\A\#~(.*)/
61
+ $stderr.print _("Warning: obsolete msgid exists.\n")
62
+ $stderr.print " #{$&}\n"
63
+ @q.push [:COMMENT, $&]
64
+ str = $'
65
+ when /\A\#(.*)/
66
+ @q.push [:COMMENT, $&]
67
+ str = $'
68
+ when /\A\"(.*)\"/
69
+ @q.push [:STRING, $1]
70
+ str = $'
71
+ else
72
+ #c = str[0,1]
73
+ #@q.push [:STRING, c]
74
+ str = str[1..-1]
75
+ end
76
+ end
77
+ @q.push [false, '$end']
78
+ if $DEBUG
79
+ @q.each do |a,b|
80
+ puts "[#{a}, #{b}]"
81
+ end
82
+ end
83
+ @yydebug = true if $DEBUG
84
+ do_parse
85
+
86
+ if @comments.size > 0
87
+ @data.set_comment(:last, @comments.join("\n"))
88
+ end
89
+ @data
90
+ end
91
+
92
+ def next_token
93
+ @q.shift
94
+ end
95
+
96
+ def on_message(msgid, msgstr)
97
+ if msgstr.size > 0
98
+ @data[msgid] = msgstr
99
+ @data.set_comment(msgid, @comments.join("\n"))
100
+ end
101
+ @comments.clear
102
+ @msgctxt = ""
103
+ end
104
+
105
+ def on_comment(comment)
106
+ @fuzzy = true if (/fuzzy/ =~ comment)
107
+ @comments << comment
108
+ end
109
+
110
+ def parse_file(po_file, data, ignore_fuzzy = true)
111
+ args = [ po_file ]
112
+ # In Ruby 1.9, we must detect proper encoding of a PO file.
113
+ if String.instance_methods.include?(:encode)
114
+ encoding = detect_file_encoding(po_file)
115
+ args << "r:#{encoding}"
116
+ end
117
+ parse(File.open(*args) {|io| io.read }, data, ignore_fuzzy)
118
+ end
119
+
120
+ def detect_file_encoding(po_file)
121
+ open(po_file, :encoding => 'ASCII-8BIT') do |input|
122
+ input.lines.each do |line|
123
+ return Encoding.find($1) if %r["Content-Type:.*\scharset=(.*)\\n"] =~ line
124
+ end
125
+ end
126
+ Encoding.default_external
127
+ end
128
+ private :detect_file_encoding
129
+ ...end poparser.ry/module_eval...
130
+ ##### State transition tables begin ###
131
+
132
+ racc_action_table = [
133
+ 3, 13, 5, 7, 9, 15, 16, 17, 20, 17,
134
+ 13, 17, 13, 13, 11, 17, 23, 20, 13, 17 ]
135
+
136
+ racc_action_check = [
137
+ 1, 16, 1, 1, 1, 12, 12, 12, 18, 18,
138
+ 7, 14, 15, 9, 3, 19, 20, 21, 23, 25 ]
139
+
140
+ racc_action_pointer = [
141
+ nil, 0, nil, 14, nil, nil, nil, 3, nil, 6,
142
+ nil, nil, 0, nil, 4, 5, -6, nil, 2, 8,
143
+ 8, 11, nil, 11, nil, 12 ]
144
+
145
+ racc_action_default = [
146
+ -1, -16, -2, -16, -3, -13, -4, -16, -6, -16,
147
+ -7, 26, -16, -15, -5, -16, -16, -14, -16, -8,
148
+ -16, -9, -11, -16, -10, -12 ]
149
+
150
+ racc_goto_table = [
151
+ 12, 22, 14, 4, 24, 6, 2, 8, 18, 19,
152
+ 10, 21, 1, nil, nil, nil, 25 ]
153
+
154
+ racc_goto_check = [
155
+ 5, 9, 5, 3, 9, 4, 2, 6, 5, 5,
156
+ 7, 8, 1, nil, nil, nil, 5 ]
157
+
158
+ racc_goto_pointer = [
159
+ nil, 12, 5, 2, 4, -7, 6, 9, -7, -17 ]
160
+
161
+ racc_goto_default = [
162
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil ]
163
+
164
+ racc_reduce_table = [
165
+ 0, 0, :racc_error,
166
+ 0, 10, :_reduce_none,
167
+ 2, 10, :_reduce_none,
168
+ 2, 10, :_reduce_none,
169
+ 2, 10, :_reduce_none,
170
+ 2, 12, :_reduce_5,
171
+ 1, 13, :_reduce_none,
172
+ 1, 13, :_reduce_none,
173
+ 4, 15, :_reduce_8,
174
+ 5, 16, :_reduce_9,
175
+ 2, 17, :_reduce_10,
176
+ 1, 17, :_reduce_none,
177
+ 3, 18, :_reduce_12,
178
+ 1, 11, :_reduce_13,
179
+ 2, 14, :_reduce_14,
180
+ 1, 14, :_reduce_15 ]
181
+
182
+ racc_reduce_n = 16
183
+
184
+ racc_shift_n = 26
185
+
186
+ racc_token_table = {
187
+ false => 0,
188
+ :error => 1,
189
+ :COMMENT => 2,
190
+ :MSGID => 3,
191
+ :MSGCTXT => 4,
192
+ :MSGID_PLURAL => 5,
193
+ :MSGSTR => 6,
194
+ :STRING => 7,
195
+ :PLURAL_NUM => 8 }
196
+
197
+ racc_nt_base = 9
198
+
199
+ racc_use_result_var = true
200
+
201
+ Racc_arg = [
202
+ racc_action_table,
203
+ racc_action_check,
204
+ racc_action_default,
205
+ racc_action_pointer,
206
+ racc_goto_table,
207
+ racc_goto_check,
208
+ racc_goto_default,
209
+ racc_goto_pointer,
210
+ racc_nt_base,
211
+ racc_reduce_table,
212
+ racc_token_table,
213
+ racc_shift_n,
214
+ racc_reduce_n,
215
+ racc_use_result_var ]
216
+
217
+ Racc_token_to_s_table = [
218
+ "$end",
219
+ "error",
220
+ "COMMENT",
221
+ "MSGID",
222
+ "MSGCTXT",
223
+ "MSGID_PLURAL",
224
+ "MSGSTR",
225
+ "STRING",
226
+ "PLURAL_NUM",
227
+ "$start",
228
+ "msgfmt",
229
+ "comment",
230
+ "msgctxt",
231
+ "message",
232
+ "string_list",
233
+ "single_message",
234
+ "plural_message",
235
+ "msgstr_plural",
236
+ "msgstr_plural_line" ]
237
+
238
+ Racc_debug_parser = true
239
+
240
+ ##### State transition tables end #####
241
+
242
+ # reduce 0 omitted
243
+
244
+ # reduce 1 omitted
245
+
246
+ # reduce 2 omitted
247
+
248
+ # reduce 3 omitted
249
+
250
+ # reduce 4 omitted
251
+
252
+ module_eval(<<'.,.,', 'poparser.ry', 23)
253
+ def _reduce_5(val, _values, result)
254
+ @msgctxt = unescape(val[1]) + "\004"
255
+
256
+ result
257
+ end
258
+ .,.,
259
+
260
+ # reduce 6 omitted
261
+
262
+ # reduce 7 omitted
263
+
264
+ module_eval(<<'.,.,', 'poparser.ry', 35)
265
+ def _reduce_8(val, _values, result)
266
+ if @fuzzy and $ignore_fuzzy
267
+ if val[1] != ""
268
+ $stderr.print _("Warning: fuzzy message was ignored.\n")
269
+ $stderr.print " msgid '#{val[1]}'\n"
270
+ else
271
+ on_message('', unescape(val[3]))
272
+ end
273
+ @fuzzy = false
274
+ else
275
+ on_message(@msgctxt + unescape(val[1]), unescape(val[3]))
276
+ end
277
+ result = ""
278
+
279
+ result
280
+ end
281
+ .,.,
282
+
283
+ module_eval(<<'.,.,', 'poparser.ry', 52)
284
+ def _reduce_9(val, _values, result)
285
+ if @fuzzy and $ignore_fuzzy
286
+ if val[1] != ""
287
+ $stderr.print _("Warning: fuzzy message was ignored.\n")
288
+ $stderr.print "msgid = '#{val[1]}\n"
289
+ else
290
+ on_message('', unescape(val[3]))
291
+ end
292
+ @fuzzy = false
293
+ else
294
+ on_message(@msgctxt + unescape(val[1]) + "\000" + unescape(val[3]), unescape(val[4]))
295
+ end
296
+ result = ""
297
+
298
+ result
299
+ end
300
+ .,.,
301
+
302
+ module_eval(<<'.,.,', 'poparser.ry', 70)
303
+ def _reduce_10(val, _values, result)
304
+ if val[0].size > 0
305
+ result = val[0] + "\000" + val[1]
306
+ else
307
+ result = ""
308
+ end
309
+
310
+ result
311
+ end
312
+ .,.,
313
+
314
+ # reduce 11 omitted
315
+
316
+ module_eval(<<'.,.,', 'poparser.ry', 82)
317
+ def _reduce_12(val, _values, result)
318
+ result = val[2]
319
+
320
+ result
321
+ end
322
+ .,.,
323
+
324
+ module_eval(<<'.,.,', 'poparser.ry', 89)
325
+ def _reduce_13(val, _values, result)
326
+ on_comment(val[0])
327
+
328
+ result
329
+ end
330
+ .,.,
331
+
332
+ module_eval(<<'.,.,', 'poparser.ry', 97)
333
+ def _reduce_14(val, _values, result)
334
+ result = val.delete_if{|item| item == ""}.join
335
+
336
+ result
337
+ end
338
+ .,.,
339
+
340
+ module_eval(<<'.,.,', 'poparser.ry', 101)
341
+ def _reduce_15(val, _values, result)
342
+ result = val[0]
343
+
344
+ result
345
+ end
346
+ .,.,
347
+
348
+ def _reduce_none(val, _values, result)
349
+ val[0]
350
+ end
351
+
352
+ end # class PoParser
353
+ end # module GetText
354
+
355
+