grosser-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 (406) hide show
  1. data/ChangeLog +2014 -0
  2. data/README.rdoc +172 -0
  3. data/Rakefile +192 -0
  4. data/bin/rgettext +24 -0
  5. data/bin/rmsgfmt +24 -0
  6. data/bin/rmsgmerge +24 -0
  7. data/gettext.gemspec +39 -0
  8. data/lib/gettext.rb +263 -0
  9. data/lib/gettext/cgi.rb +40 -0
  10. data/lib/gettext/class_info.rb +55 -0
  11. data/lib/gettext/core_ext/iconv.rb +109 -0
  12. data/lib/gettext/core_ext/string.rb +63 -0
  13. data/lib/gettext/mofile.rb +320 -0
  14. data/lib/gettext/parser/erb.rb +50 -0
  15. data/lib/gettext/parser/glade.rb +99 -0
  16. data/lib/gettext/parser/ruby.rb +170 -0
  17. data/lib/gettext/poparser.rb +332 -0
  18. data/lib/gettext/textdomain.rb +225 -0
  19. data/lib/gettext/textdomain_manager.rb +218 -0
  20. data/lib/gettext/tools.rb +177 -0
  21. data/lib/gettext/tools/rgettext.rb +275 -0
  22. data/lib/gettext/tools/rmsgfmt.rb +84 -0
  23. data/lib/gettext/tools/rmsgmerge.rb +505 -0
  24. data/lib/gettext/utils.rb +39 -0
  25. data/lib/gettext/version.rb +12 -0
  26. data/po/bg/rgettext.po +150 -0
  27. data/po/bs/rgettext.po +151 -0
  28. data/po/ca/rgettext.po +149 -0
  29. data/po/cs/rgettext.po +152 -0
  30. data/po/de/#rails.po# +175 -0
  31. data/po/de/rgettext.po +157 -0
  32. data/po/el/rgettext.po +148 -0
  33. data/po/eo/rgettext.po +149 -0
  34. data/po/es/rgettext.po +150 -0
  35. data/po/et/rgettext.po +147 -0
  36. data/po/fr/rgettext.po +153 -0
  37. data/po/hr/rgettext.po +151 -0
  38. data/po/hu/rgettext.po +149 -0
  39. data/po/it/rgettext.po +150 -0
  40. data/po/ja/rails.po.old +150 -0
  41. data/po/ja/rgettext.po +149 -0
  42. data/po/ko/rgettext.po +149 -0
  43. data/po/lv/rgettext.po +150 -0
  44. data/po/nb/rgettext.po +151 -0
  45. data/po/nl/rgettext.po +150 -0
  46. data/po/pt_BR/rgettext.po +152 -0
  47. data/po/rgettext.pot +141 -0
  48. data/po/ru/rgettext.po +151 -0
  49. data/po/sr/rgettext.po +150 -0
  50. data/po/sv/rgettext.po +143 -0
  51. data/po/ua/rgettext.po +155 -0
  52. data/po/vi/rgettext.po +148 -0
  53. data/po/zh/rgettext.po +149 -0
  54. data/po/zh_TW/rgettext.po +148 -0
  55. data/samples/README +16 -0
  56. data/samples/cgi/README +43 -0
  57. data/samples/cgi/Rakefile +27 -0
  58. data/samples/cgi/cookie.cgi +64 -0
  59. data/samples/cgi/gettext.css +116 -0
  60. data/samples/cgi/helloerb.rhtml +28 -0
  61. data/samples/cgi/helloerb1.cgi +58 -0
  62. data/samples/cgi/helloerb2.cgi +51 -0
  63. data/samples/cgi/hellolib.rb +20 -0
  64. data/samples/cgi/http.rb +51 -0
  65. data/samples/cgi/index.cgi +111 -0
  66. data/samples/cgi/other.rhtml +20 -0
  67. data/samples/cgi/po/bg/helloerb1.po +59 -0
  68. data/samples/cgi/po/bg/helloerb2.po +51 -0
  69. data/samples/cgi/po/bg/hellolib.po +23 -0
  70. data/samples/cgi/po/bg/main.po +83 -0
  71. data/samples/cgi/po/bs/helloerb1.po +59 -0
  72. data/samples/cgi/po/bs/helloerb2.po +51 -0
  73. data/samples/cgi/po/bs/hellolib.po +23 -0
  74. data/samples/cgi/po/bs/main.po +83 -0
  75. data/samples/cgi/po/ca/helloerb1.po +59 -0
  76. data/samples/cgi/po/ca/helloerb2.po +51 -0
  77. data/samples/cgi/po/ca/hellolib.po +23 -0
  78. data/samples/cgi/po/ca/main.po +83 -0
  79. data/samples/cgi/po/cs/helloerb1.po +61 -0
  80. data/samples/cgi/po/cs/helloerb2.po +52 -0
  81. data/samples/cgi/po/cs/hellolib.po +25 -0
  82. data/samples/cgi/po/cs/main.po +85 -0
  83. data/samples/cgi/po/de/helloerb1.po +61 -0
  84. data/samples/cgi/po/de/helloerb2.po +52 -0
  85. data/samples/cgi/po/de/hellolib.po +24 -0
  86. data/samples/cgi/po/de/main.po +86 -0
  87. data/samples/cgi/po/el/helloerb1.po +60 -0
  88. data/samples/cgi/po/el/helloerb2.po +51 -0
  89. data/samples/cgi/po/el/hellolib.po +23 -0
  90. data/samples/cgi/po/el/main.po +84 -0
  91. data/samples/cgi/po/eo/helloerb1.po +60 -0
  92. data/samples/cgi/po/eo/helloerb2.po +52 -0
  93. data/samples/cgi/po/eo/hellolib.po +24 -0
  94. data/samples/cgi/po/eo/main.po +84 -0
  95. data/samples/cgi/po/es/helloerb1.po +59 -0
  96. data/samples/cgi/po/es/helloerb2.po +50 -0
  97. data/samples/cgi/po/es/hellolib.po +22 -0
  98. data/samples/cgi/po/es/main.po +83 -0
  99. data/samples/cgi/po/fr/helloerb1.po +59 -0
  100. data/samples/cgi/po/fr/helloerb2.po +51 -0
  101. data/samples/cgi/po/fr/hellolib.po +22 -0
  102. data/samples/cgi/po/fr/main.po +85 -0
  103. data/samples/cgi/po/helloerb1.pot +60 -0
  104. data/samples/cgi/po/helloerb2.pot +52 -0
  105. data/samples/cgi/po/hellolib.pot +24 -0
  106. data/samples/cgi/po/hr/helloerb1.po +59 -0
  107. data/samples/cgi/po/hr/helloerb2.po +51 -0
  108. data/samples/cgi/po/hr/hellolib.po +23 -0
  109. data/samples/cgi/po/hr/main.po +83 -0
  110. data/samples/cgi/po/hu/helloerb1.po +59 -0
  111. data/samples/cgi/po/hu/helloerb2.po +51 -0
  112. data/samples/cgi/po/hu/hellolib.po +23 -0
  113. data/samples/cgi/po/hu/main.po +82 -0
  114. data/samples/cgi/po/it/helloerb1.po +60 -0
  115. data/samples/cgi/po/it/helloerb2.po +52 -0
  116. data/samples/cgi/po/it/hellolib.po +24 -0
  117. data/samples/cgi/po/it/main.po +84 -0
  118. data/samples/cgi/po/ja/helloerb1.po +60 -0
  119. data/samples/cgi/po/ja/helloerb2.po +52 -0
  120. data/samples/cgi/po/ja/hellolib.po +24 -0
  121. data/samples/cgi/po/ja/main.po +85 -0
  122. data/samples/cgi/po/ko/helloerb1.po +59 -0
  123. data/samples/cgi/po/ko/helloerb2.po +51 -0
  124. data/samples/cgi/po/ko/hellolib.po +23 -0
  125. data/samples/cgi/po/ko/main.po +84 -0
  126. data/samples/cgi/po/lv/helloerb1.po +65 -0
  127. data/samples/cgi/po/lv/helloerb2.po +52 -0
  128. data/samples/cgi/po/lv/hellolib.po +24 -0
  129. data/samples/cgi/po/lv/main.po +77 -0
  130. data/samples/cgi/po/main.pot +80 -0
  131. data/samples/cgi/po/nb/helloerb1.po +60 -0
  132. data/samples/cgi/po/nb/helloerb2.po +52 -0
  133. data/samples/cgi/po/nb/hellolib.po +24 -0
  134. data/samples/cgi/po/nb/main.po +84 -0
  135. data/samples/cgi/po/nl/helloerb1.po +61 -0
  136. data/samples/cgi/po/nl/helloerb2.po +52 -0
  137. data/samples/cgi/po/nl/hellolib.po +24 -0
  138. data/samples/cgi/po/nl/main.po +86 -0
  139. data/samples/cgi/po/pt_BR/helloerb1.po +59 -0
  140. data/samples/cgi/po/pt_BR/helloerb2.po +51 -0
  141. data/samples/cgi/po/pt_BR/hellolib.po +23 -0
  142. data/samples/cgi/po/pt_BR/main.po +84 -0
  143. data/samples/cgi/po/ru/helloerb1.po +58 -0
  144. data/samples/cgi/po/ru/helloerb2.po +50 -0
  145. data/samples/cgi/po/ru/hellolib.po +22 -0
  146. data/samples/cgi/po/ru/main.po +82 -0
  147. data/samples/cgi/po/sr/helloerb1.po +60 -0
  148. data/samples/cgi/po/sr/helloerb2.po +52 -0
  149. data/samples/cgi/po/sr/hellolib.po +24 -0
  150. data/samples/cgi/po/sr/main.po +80 -0
  151. data/samples/cgi/po/ua/helloerb1.po +62 -0
  152. data/samples/cgi/po/ua/helloerb2.po +54 -0
  153. data/samples/cgi/po/ua/hellolib.po +26 -0
  154. data/samples/cgi/po/ua/main.po +84 -0
  155. data/samples/cgi/po/vi/helloerb1.po +65 -0
  156. data/samples/cgi/po/vi/helloerb2.po +52 -0
  157. data/samples/cgi/po/vi/hellolib.po +24 -0
  158. data/samples/cgi/po/vi/main.po +77 -0
  159. data/samples/cgi/po/zh/helloerb1.po +60 -0
  160. data/samples/cgi/po/zh/helloerb2.po +52 -0
  161. data/samples/cgi/po/zh/hellolib.po +24 -0
  162. data/samples/cgi/po/zh/main.po +80 -0
  163. data/samples/cgi/po/zh_TW/helloerb1.po +67 -0
  164. data/samples/cgi/po/zh_TW/helloerb2.po +54 -0
  165. data/samples/cgi/po/zh_TW/hellolib.po +26 -0
  166. data/samples/cgi/po/zh_TW/main.po +79 -0
  167. data/samples/hello.rb +36 -0
  168. data/samples/hello2.rb +23 -0
  169. data/samples/hello_glade2.glade +70 -0
  170. data/samples/hello_glade2.rb +25 -0
  171. data/samples/hello_gtk2.rb +27 -0
  172. data/samples/hello_noop.rb +31 -0
  173. data/samples/hello_plural.rb +26 -0
  174. data/samples/hello_tk.rb +19 -0
  175. data/samples/makemo.rb +4 -0
  176. data/samples/po/bg/hello.po +24 -0
  177. data/samples/po/bg/hello2.po +31 -0
  178. data/samples/po/bg/hello_glade2.po +31 -0
  179. data/samples/po/bg/hello_gtk.po +23 -0
  180. data/samples/po/bg/hello_noop.po +27 -0
  181. data/samples/po/bg/hello_plural.po +25 -0
  182. data/samples/po/bg/hello_tk.po +23 -0
  183. data/samples/po/bs/hello.po +23 -0
  184. data/samples/po/bs/hello2.po +31 -0
  185. data/samples/po/bs/hello_glade2.po +31 -0
  186. data/samples/po/bs/hello_gtk.po +23 -0
  187. data/samples/po/bs/hello_noop.po +27 -0
  188. data/samples/po/bs/hello_plural.po +26 -0
  189. data/samples/po/bs/hello_tk.po +23 -0
  190. data/samples/po/ca/hello.po +23 -0
  191. data/samples/po/ca/hello2.po +31 -0
  192. data/samples/po/ca/hello_glade2.po +31 -0
  193. data/samples/po/ca/hello_gtk.po +23 -0
  194. data/samples/po/ca/hello_noop.po +27 -0
  195. data/samples/po/ca/hello_plural.po +25 -0
  196. data/samples/po/ca/hello_tk.po +23 -0
  197. data/samples/po/cs/hello.po +23 -0
  198. data/samples/po/cs/hello2.po +31 -0
  199. data/samples/po/cs/hello_glade2.po +37 -0
  200. data/samples/po/cs/hello_gtk.po +23 -0
  201. data/samples/po/cs/hello_noop.po +27 -0
  202. data/samples/po/cs/hello_plural.po +26 -0
  203. data/samples/po/cs/hello_tk.po +23 -0
  204. data/samples/po/de/hello.po +20 -0
  205. data/samples/po/de/hello2.po +28 -0
  206. data/samples/po/de/hello_glade2.po +27 -0
  207. data/samples/po/de/hello_gtk.po +20 -0
  208. data/samples/po/de/hello_noop.po +24 -0
  209. data/samples/po/de/hello_plural.po +25 -0
  210. data/samples/po/de/hello_tk.po +20 -0
  211. data/samples/po/el/hello.po +23 -0
  212. data/samples/po/el/hello2.po +31 -0
  213. data/samples/po/el/hello_glade2.po +31 -0
  214. data/samples/po/el/hello_gtk.po +22 -0
  215. data/samples/po/el/hello_noop.po +27 -0
  216. data/samples/po/el/hello_plural.po +25 -0
  217. data/samples/po/el/hello_tk.po +23 -0
  218. data/samples/po/eo/hello.po +23 -0
  219. data/samples/po/eo/hello2.po +31 -0
  220. data/samples/po/eo/hello_glade2.po +32 -0
  221. data/samples/po/eo/hello_gtk.po +23 -0
  222. data/samples/po/eo/hello_noop.po +27 -0
  223. data/samples/po/eo/hello_plural.po +26 -0
  224. data/samples/po/eo/hello_tk.po +24 -0
  225. data/samples/po/es/hello.po +21 -0
  226. data/samples/po/es/hello2.po +28 -0
  227. data/samples/po/es/hello_glade2.po +28 -0
  228. data/samples/po/es/hello_gtk.po +20 -0
  229. data/samples/po/es/hello_noop.po +24 -0
  230. data/samples/po/es/hello_plural.po +23 -0
  231. data/samples/po/es/hello_tk.po +20 -0
  232. data/samples/po/fr/hello.po +18 -0
  233. data/samples/po/fr/hello2.po +26 -0
  234. data/samples/po/fr/hello_glade2.po +27 -0
  235. data/samples/po/fr/hello_gtk.po +18 -0
  236. data/samples/po/fr/hello_noop.po +22 -0
  237. data/samples/po/fr/hello_plural.po +21 -0
  238. data/samples/po/fr/hello_tk.po +18 -0
  239. data/samples/po/hello.pot +23 -0
  240. data/samples/po/hello2.pot +31 -0
  241. data/samples/po/hello_glade2.pot +32 -0
  242. data/samples/po/hello_gtk.pot +23 -0
  243. data/samples/po/hello_noop.pot +27 -0
  244. data/samples/po/hello_plural.pot +26 -0
  245. data/samples/po/hello_tk.pot +24 -0
  246. data/samples/po/hr/hello.po +23 -0
  247. data/samples/po/hr/hello2.po +31 -0
  248. data/samples/po/hr/hello_glade2.po +31 -0
  249. data/samples/po/hr/hello_gtk.po +23 -0
  250. data/samples/po/hr/hello_noop.po +27 -0
  251. data/samples/po/hr/hello_plural.po +26 -0
  252. data/samples/po/hr/hello_tk.po +23 -0
  253. data/samples/po/hu/hello.po +22 -0
  254. data/samples/po/hu/hello2.po +30 -0
  255. data/samples/po/hu/hello_glade2.po +31 -0
  256. data/samples/po/hu/hello_gtk.po +22 -0
  257. data/samples/po/hu/hello_noop.po +26 -0
  258. data/samples/po/hu/hello_plural.po +25 -0
  259. data/samples/po/hu/hello_tk.po +23 -0
  260. data/samples/po/it/hello.po +20 -0
  261. data/samples/po/it/hello2.po +28 -0
  262. data/samples/po/it/hello_glade2.po +28 -0
  263. data/samples/po/it/hello_gtk.po +21 -0
  264. data/samples/po/it/hello_noop.po +24 -0
  265. data/samples/po/it/hello_plural.po +23 -0
  266. data/samples/po/it/hello_tk.po +21 -0
  267. data/samples/po/ja/hello.po +20 -0
  268. data/samples/po/ja/hello2.po +28 -0
  269. data/samples/po/ja/hello_glade2.po +26 -0
  270. data/samples/po/ja/hello_gtk.po +19 -0
  271. data/samples/po/ja/hello_noop.po +23 -0
  272. data/samples/po/ja/hello_plural.po +21 -0
  273. data/samples/po/ja/hello_tk.po +19 -0
  274. data/samples/po/ko/hello.po +18 -0
  275. data/samples/po/ko/hello2.po +26 -0
  276. data/samples/po/ko/hello_glade2.po +29 -0
  277. data/samples/po/ko/hello_gtk.po +18 -0
  278. data/samples/po/ko/hello_noop.po +22 -0
  279. data/samples/po/ko/hello_plural.po +25 -0
  280. data/samples/po/ko/hello_tk.po +19 -0
  281. data/samples/po/lv/hello.po +24 -0
  282. data/samples/po/lv/hello2.po +32 -0
  283. data/samples/po/lv/hello_glade2.po +38 -0
  284. data/samples/po/lv/hello_gtk.po +24 -0
  285. data/samples/po/lv/hello_noop.po +28 -0
  286. data/samples/po/lv/hello_plural.po +26 -0
  287. data/samples/po/lv/hello_tk.po +24 -0
  288. data/samples/po/nb/hello.po +23 -0
  289. data/samples/po/nb/hello2.po +31 -0
  290. data/samples/po/nb/hello_glade2.po +31 -0
  291. data/samples/po/nb/hello_gtk.po +23 -0
  292. data/samples/po/nb/hello_noop.po +27 -0
  293. data/samples/po/nb/hello_plural.po +26 -0
  294. data/samples/po/nb/hello_tk.po +24 -0
  295. data/samples/po/nl/hello.po +24 -0
  296. data/samples/po/nl/hello2.po +32 -0
  297. data/samples/po/nl/hello_glade2.po +31 -0
  298. data/samples/po/nl/hello_gtk.po +24 -0
  299. data/samples/po/nl/hello_noop.po +28 -0
  300. data/samples/po/nl/hello_plural.po +25 -0
  301. data/samples/po/nl/hello_tk.po +24 -0
  302. data/samples/po/pt_BR/hello.po +21 -0
  303. data/samples/po/pt_BR/hello2.po +29 -0
  304. data/samples/po/pt_BR/hello_glade2.po +29 -0
  305. data/samples/po/pt_BR/hello_gtk.po +21 -0
  306. data/samples/po/pt_BR/hello_noop.po +25 -0
  307. data/samples/po/pt_BR/hello_plural.po +23 -0
  308. data/samples/po/pt_BR/hello_tk.po +21 -0
  309. data/samples/po/ru/hello.po +22 -0
  310. data/samples/po/ru/hello2.po +30 -0
  311. data/samples/po/ru/hello_glade2.po +30 -0
  312. data/samples/po/ru/hello_gtk.po +22 -0
  313. data/samples/po/ru/hello_noop.po +26 -0
  314. data/samples/po/ru/hello_plural.po +28 -0
  315. data/samples/po/ru/hello_tk.po +22 -0
  316. data/samples/po/sr/hello.po +22 -0
  317. data/samples/po/sr/hello2.po +30 -0
  318. data/samples/po/sr/hello_glade2.po +32 -0
  319. data/samples/po/sr/hello_gtk.po +22 -0
  320. data/samples/po/sr/hello_noop.po +26 -0
  321. data/samples/po/sr/hello_plural.po +26 -0
  322. data/samples/po/sr/hello_tk.po +24 -0
  323. data/samples/po/sv/hello.po +20 -0
  324. data/samples/po/sv/hello2.po +28 -0
  325. data/samples/po/sv/hello_glade2.po +28 -0
  326. data/samples/po/sv/hello_gtk.po +20 -0
  327. data/samples/po/sv/hello_noop.po +24 -0
  328. data/samples/po/sv/hello_plural.po +23 -0
  329. data/samples/po/sv/hello_tk.po +20 -0
  330. data/samples/po/test.rb +11 -0
  331. data/samples/po/ua/hello.po +22 -0
  332. data/samples/po/ua/hello2.po +30 -0
  333. data/samples/po/ua/hello_glade2.po +34 -0
  334. data/samples/po/ua/hello_gtk.po +22 -0
  335. data/samples/po/ua/hello_noop.po +26 -0
  336. data/samples/po/ua/hello_plural.po +29 -0
  337. data/samples/po/ua/hello_tk.po +26 -0
  338. data/samples/po/vi/hello.po +23 -0
  339. data/samples/po/vi/hello2.po +31 -0
  340. data/samples/po/vi/hello_glade2.po +38 -0
  341. data/samples/po/vi/hello_gtk.po +23 -0
  342. data/samples/po/vi/hello_noop.po +27 -0
  343. data/samples/po/vi/hello_plural.po +26 -0
  344. data/samples/po/vi/hello_tk.po +24 -0
  345. data/samples/po/zh/hello.po +23 -0
  346. data/samples/po/zh/hello2.po +31 -0
  347. data/samples/po/zh/hello_glade2.po +31 -0
  348. data/samples/po/zh/hello_gtk.po +23 -0
  349. data/samples/po/zh/hello_noop.po +27 -0
  350. data/samples/po/zh/hello_plural.po +25 -0
  351. data/samples/po/zh/hello_tk.po +23 -0
  352. data/samples/po/zh_TW/hello.po +26 -0
  353. data/samples/po/zh_TW/hello2.po +34 -0
  354. data/samples/po/zh_TW/hello_glade2.po +40 -0
  355. data/samples/po/zh_TW/hello_gtk.po +25 -0
  356. data/samples/po/zh_TW/hello_noop.po +30 -0
  357. data/samples/po/zh_TW/hello_plural.po +28 -0
  358. data/samples/po/zh_TW/hello_tk.po +26 -0
  359. data/src/poparser.ry +198 -0
  360. data/test/README +1 -0
  361. data/test/Rakefile +19 -0
  362. data/test/po/cr/plural.po +23 -0
  363. data/test/po/da/plural.po +22 -0
  364. data/test/po/da/plural_error.po +21 -0
  365. data/test/po/fr/plural.po +28 -0
  366. data/test/po/fr/plural_error.po +20 -0
  367. data/test/po/fr/test1.po +23 -0
  368. data/test/po/fr/test2.po +19 -0
  369. data/test/po/fr/test6.po +23 -0
  370. data/test/po/ir/plural.po +23 -0
  371. data/test/po/ja/npgettext.po +46 -0
  372. data/test/po/ja/nsgettext.po +65 -0
  373. data/test/po/ja/pgettext.po +41 -0
  374. data/test/po/ja/plural.po +28 -0
  375. data/test/po/ja/plural_error.po +20 -0
  376. data/test/po/ja/rubyparser.po +43 -0
  377. data/test/po/ja/sgettext.po +47 -0
  378. data/test/po/ja/test1.po +23 -0
  379. data/test/po/ja/test2.po +19 -0
  380. data/test/po/ja/test6.po +23 -0
  381. data/test/po/la/plural.po +23 -0
  382. data/test/po/la/plural_error.po +21 -0
  383. data/test/po/li/plural.po +23 -0
  384. data/test/po/po/plural.po +23 -0
  385. data/test/po/sl/plural.po +24 -0
  386. data/test/test_class_info.rb +80 -0
  387. data/test/test_gettext.rb +274 -0
  388. data/test/test_parser.rb +113 -0
  389. data/test/test_string.rb +14 -0
  390. data/test/test_textdomain.rb +25 -0
  391. data/test/test_textdomain_multi.rb +69 -0
  392. data/test/test_textdomain_toplevel.rb +42 -0
  393. data/test/testlib/N_.rb +66 -0
  394. data/test/testlib/erb.rhtml +15 -0
  395. data/test/testlib/erb.rxml +16 -0
  396. data/test/testlib/gettext.rb +96 -0
  397. data/test/testlib/gladeparser.glade +183 -0
  398. data/test/testlib/helper.rb +11 -0
  399. data/test/testlib/multi_textdomain.rb +119 -0
  400. data/test/testlib/ngettext.rb +74 -0
  401. data/test/testlib/npgettext.rb +31 -0
  402. data/test/testlib/nsgettext.rb +42 -0
  403. data/test/testlib/pgettext.rb +31 -0
  404. data/test/testlib/sgettext.rb +46 -0
  405. data/test/testlib/simple.rb +14 -0
  406. metadata +509 -0
@@ -0,0 +1,63 @@
1
+ #! /usr/bin/ruby
2
+ =begin
3
+ string.rb - Extension for String.
4
+
5
+ Copyright (C) 2005,2006 Masao Mutoh
6
+
7
+ You may redistribute it and/or modify it under the same
8
+ license terms as Ruby.
9
+ =end
10
+
11
+ if RUBY_VERSION < "1.9.0"
12
+
13
+ # Extension for String class. This feature is included in Ruby 1.9 or later.
14
+ #
15
+ # String#% method which accept "named argument". The translator can know
16
+ # the meaning of the msgids using "named argument" instead of %s/%d style.
17
+ class String
18
+ alias :_old_format_m :% # :nodoc:
19
+
20
+ # call-seq:
21
+ # %(arg)
22
+ # %(hash)
23
+ #
24
+ # Format - Uses str as a format specification, and returns the result of applying it to arg.
25
+ # If the format specification contains more than one substitution, then arg must be
26
+ # an Array containing the values to be substituted. See Kernel::sprintf for details of the
27
+ # format string. This is the default behavior of the String class.
28
+ # * arg: an Array or other class except Hash.
29
+ # * Returns: formatted String
30
+ #
31
+ # (e.g.) "%s, %s" % ["Masao", "Mutoh"]
32
+ #
33
+ # Also you can use a Hash as the "named argument". This is recommanded way for Ruby-GetText
34
+ # because the translators can understand the meanings of the msgids easily.
35
+ # * hash: {:key1 => value1, :key2 => value2, ... }
36
+ # * Returns: formatted String
37
+ #
38
+ # (e.g.) "%{firstname}, %{familyname}" % {:firstname => "Masao", :familyname => "Mutoh"}
39
+ def %(args)
40
+ if args.kind_of?(Hash)
41
+ ret = dup
42
+ args.each {|key, value|
43
+ ret.gsub!(/\%\{#{key}\}/, value.to_s)
44
+ }
45
+ ret
46
+ else
47
+ ret = gsub(/%\{/, '%%{')
48
+ begin
49
+ ret._old_format_m(args)
50
+ rescue ArgumentError => e
51
+ if $DEBUG
52
+ $stderr.puts " The string:#{ret}"
53
+ $stderr.puts " args:#{args.inspect}"
54
+ puts e.backtrace
55
+ else
56
+ raise ArgumentError, e.message
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ end
@@ -0,0 +1,320 @@
1
+ =begin
2
+ mofile.rb - A simple class for operating GNU MO file.
3
+
4
+ Copyright (C) 2003-2008 Masao Mutoh
5
+ Copyright (C) 2002 Masahiro Sakai, Masao Mutoh
6
+ Copyright (C) 2001 Masahiro Sakai
7
+
8
+ Masahiro Sakai <s01397ms at sfc.keio.ac.jp>
9
+ Masao Mutoh <mutoh at highway.ne.jp>
10
+
11
+ You can redistribute this file and/or modify it under the same term
12
+ of Ruby. License of Ruby is included with Ruby distribution in
13
+ the file "README".
14
+
15
+ $Id: mo.rb,v 1.10 2008/06/17 16:40:52 mutoh Exp $
16
+ =end
17
+
18
+ require 'gettext/core_ext/iconv'
19
+ require 'stringio'
20
+
21
+ class MOFile < Hash
22
+ class InvalidFormat < RuntimeError; end;
23
+
24
+ attr_reader :filename
25
+
26
+ Header = Struct.new(:magic,
27
+ :revision,
28
+ :nstrings,
29
+ :orig_table_offset,
30
+ :translated_table_offset,
31
+ :hash_table_size,
32
+ :hash_table_offset)
33
+
34
+ # The following are only used in .mo files
35
+ # with minor revision >= 1.
36
+ class HeaderRev1 < Header
37
+ attr_accessor :n_sysdep_segments,
38
+ :sysdep_segments_offset,
39
+ :n_sysdep_strings,
40
+ :orig_sysdep_tab_offset,
41
+ :trans_sysdep_tab_offset
42
+ end
43
+
44
+ MAGIC_BIG_ENDIAN = "\x95\x04\x12\xde"
45
+ MAGIC_LITTLE_ENDIAN = "\xde\x12\x04\x95"
46
+
47
+ def self.open(arg = nil, output_charset = nil)
48
+ result = self.new(output_charset)
49
+ result.load(arg)
50
+ end
51
+
52
+ def initialize(output_charset = nil)
53
+ @filename = nil
54
+ @last_modified = nil
55
+ @little_endian = true
56
+ @output_charset = output_charset
57
+ super()
58
+ end
59
+
60
+ def update!
61
+ if FileTest.exist?(@filename)
62
+ st = File.stat(@filename)
63
+ load(@filename) unless (@last_modified == [st.ctime, st.mtime])
64
+ else
65
+ warn "#{@filename} was lost." if $DEBUG
66
+ clear
67
+ end
68
+ self
69
+ end
70
+
71
+ def load(arg)
72
+ if arg.kind_of? String
73
+ begin
74
+ st = File.stat(arg)
75
+ @last_modified = [st.ctime, st.mtime]
76
+ rescue Exception
77
+ end
78
+ load_from_file(arg)
79
+ else
80
+ load_from_stream(arg)
81
+ end
82
+ @filename = arg
83
+ self
84
+ end
85
+
86
+ def load_from_stream(io)
87
+ magic = io.read(4)
88
+ case magic
89
+ when MAGIC_BIG_ENDIAN
90
+ @little_endian = false
91
+ when MAGIC_LITTLE_ENDIAN
92
+ @little_endian = true
93
+ else
94
+ raise InvalidFormat.new(sprintf("Unknown signature %s", magic.dump))
95
+ end
96
+
97
+ endian_type6 = @little_endian ? 'V6' : 'N6'
98
+ endian_type_astr = @little_endian ? 'V*' : 'N*'
99
+
100
+ header = HeaderRev1.new(magic, *(io.read(4 * 6).unpack(endian_type6)))
101
+
102
+ if header.revision == 1
103
+ # FIXME: It doesn't support sysdep correctly.
104
+ header.n_sysdep_segments = io.read(4).unpack(endian_type6)
105
+ header.sysdep_segments_offset = io.read(4).unpack(endian_type6)
106
+ header.n_sysdep_strings = io.read(4).unpack(endian_type6)
107
+ header.orig_sysdep_tab_offset = io.read(4).unpack(endian_type6)
108
+ header.trans_sysdep_tab_offset = io.read(4).unpack(endian_type6)
109
+ elsif header.revision > 1
110
+ raise InvalidFormat.new(sprintf("file format revision %d isn't supported", header.revision))
111
+ end
112
+ io.pos = header.orig_table_offset
113
+ orig_table_data = io.read((4 * 2) * header.nstrings).unpack(endian_type_astr)
114
+
115
+ io.pos = header.translated_table_offset
116
+ trans_table_data = io.read((4 * 2) * header.nstrings).unpack(endian_type_astr)
117
+
118
+ original_strings = Array.new(header.nstrings)
119
+ for i in 0...header.nstrings
120
+ io.pos = orig_table_data[i * 2 + 1]
121
+ original_strings[i] = io.read(orig_table_data[i * 2 + 0])
122
+ end
123
+
124
+ clear
125
+ for i in 0...header.nstrings
126
+ io.pos = trans_table_data[i * 2 + 1]
127
+ str = io.read(trans_table_data[i * 2 + 0])
128
+
129
+ if (! original_strings[i]) || original_strings[i] == ""
130
+ if str
131
+ @charset = nil
132
+ @nplurals = nil
133
+ @plural = nil
134
+ str.each_line{|line|
135
+ if /^Content-Type:/i =~ line and /charset=((?:\w|-)+)/i =~ line
136
+ @charset = $1
137
+ elsif /^Plural-Forms:\s*nplurals\s*\=\s*(\d*);\s*plural\s*\=\s*([^;]*)\n?/ =~ line
138
+ @nplurals = $1
139
+ @plural = $2
140
+ end
141
+ break if @charset and @nplurals
142
+ }
143
+ @nplurals = "1" unless @nplurals
144
+ @plural = "0" unless @plural
145
+ end
146
+ else
147
+ if @output_charset
148
+ begin
149
+ str = Iconv.conv(@output_charset, @charset, str) if @charset
150
+ rescue Iconv::Failure
151
+ if $DEBUG
152
+ warn "@charset = ", @charset
153
+ warn"@output_charset = ", @output_charset
154
+ warn "msgid = ", original_strings[i]
155
+ warn "msgstr = ", str
156
+ end
157
+ end
158
+ end
159
+ end
160
+ self[original_strings[i]] = str.freeze
161
+ end
162
+ self
163
+ end
164
+
165
+ # From gettext-0.12.1/gettext-tools/lib/hash.c
166
+ def prime?(candidate)
167
+ divn = 3
168
+ sq = divn * divn
169
+
170
+ while (sq < candidate && candidate % divn != 0)
171
+ divn += 1
172
+ sq += 4 * divn
173
+ divn += 1
174
+ end
175
+ candidate % divn != 0
176
+ end
177
+
178
+ # From gettext-0.12.1/gettext-tools/lib/hash.c
179
+ def next_prime(seed)
180
+ seed |= 1
181
+ while (! prime?(seed))
182
+ seed += 2
183
+ end
184
+ seed
185
+ end
186
+
187
+ # From gettext-0.12.1/gettext-runtime/intl/hash-string.h
188
+ # Defines the so called `hashpjw' function by P.J. Weinberger
189
+ # [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
190
+ # 1986, 1987 Bell Telephone Laboratories, Inc.]
191
+ HASHWORDBITS = 32
192
+ def hash_string(str)
193
+ hval = 0
194
+ i = 0
195
+ str.each_byte do |b|
196
+ break if b == '\0'
197
+ hval <<= 4
198
+ hval += b.to_i
199
+ g = hval & (0xf << (HASHWORDBITS - 4))
200
+ if (g != 0)
201
+ hval ^= g >> (HASHWORDBITS - 8)
202
+ hval ^= g
203
+ end
204
+ end
205
+ hval
206
+ end
207
+
208
+ def save_to_stream(io)
209
+ #Save data as little endian format.
210
+ header_size = 4 * 7
211
+ table_size = 4 * 2 * size
212
+
213
+ hash_table_size = next_prime((size * 4) / 3)
214
+ hash_table_size = 3 if hash_table_size <= 2
215
+ header = Header.new(
216
+ MAGIC_LITTLE_ENDIAN, # magic
217
+ 0, # revision
218
+ size, # nstrings
219
+ header_size, # orig_table_offset
220
+ header_size + table_size, # translated_table_offset
221
+ hash_table_size, # hash_table_size
222
+ header_size + table_size * 2 # hash_table_offset
223
+ )
224
+ io.write(header.to_a.pack('a4V*'))
225
+
226
+ ary = to_a
227
+ ary.sort!{|a, b| a[0] <=> b[0]} # sort by original string
228
+
229
+ pos = header.hash_table_size * 4 + header.hash_table_offset
230
+
231
+ orig_table_data = Array.new()
232
+ ary.each{|item, _|
233
+ orig_table_data.push(item.size)
234
+ orig_table_data.push(pos)
235
+ pos += item.size + 1 # +1 is <NUL>
236
+ }
237
+ io.write(orig_table_data.pack('V*'))
238
+
239
+ trans_table_data = Array.new()
240
+ ary.each{|_, item|
241
+ trans_table_data.push(item.size)
242
+ trans_table_data.push(pos)
243
+ pos += item.size + 1 # +1 is <NUL>
244
+ }
245
+ io.write(trans_table_data.pack('V*'))
246
+
247
+ hash_tab = Array.new(hash_table_size)
248
+ j = 0
249
+ ary[0...size].each {|key, _|
250
+ hash_val = hash_string(key)
251
+ idx = hash_val % hash_table_size
252
+ if hash_tab[idx] != nil
253
+ incr = 1 + (hash_val % (hash_table_size - 2))
254
+ begin
255
+ if (idx >= hash_table_size - incr)
256
+ idx -= hash_table_size - incr
257
+ else
258
+ idx += incr
259
+ end
260
+ end until (hash_tab[idx] == nil)
261
+ end
262
+ hash_tab[idx] = j + 1
263
+ j += 1
264
+ }
265
+ hash_tab.collect!{|i| i ? i : 0}
266
+
267
+ io.write(hash_tab.pack('V*'))
268
+
269
+ ary.each{|item, _| io.write(item); io.write("\0") }
270
+ ary.each{|_, item| io.write(item); io.write("\0") }
271
+
272
+ self
273
+ end
274
+
275
+ def load_from_file(filename)
276
+ @filename = filename
277
+ begin
278
+ File.open(filename, 'rb'){|f| load_from_stream(f)}
279
+ rescue => e
280
+ e.set_backtrace("File: #{@filename}")
281
+ raise e
282
+ end
283
+ end
284
+
285
+ def save_to_file(filename)
286
+ File.open(filename, 'wb'){|f| save_to_stream(f)}
287
+ end
288
+
289
+ def set_comment(msgid_or_sym, comment)
290
+ #Do nothing
291
+ end
292
+
293
+
294
+ attr_accessor :little_endian, :path, :last_modified
295
+ attr_reader :charset, :nplurals, :plural
296
+ end
297
+
298
+
299
+ # Test
300
+
301
+ if $0 == __FILE__
302
+ if (ARGV.include? "-h") or (ARGV.include? "--help")
303
+ STDERR.puts("mo.rb [filename.mo ...]")
304
+ exit
305
+ end
306
+
307
+ ARGV.each{ |item|
308
+ mo = MOFile.open(item)
309
+ puts "------------------------------------------------------------------"
310
+ puts "charset = \"#{mo.charset}\""
311
+ puts "nplurals = \"#{mo.nplurals}\""
312
+ puts "plural = \"#{mo.plural}\""
313
+ puts "------------------------------------------------------------------"
314
+ mo.each do |key, value|
315
+ puts "original message = #{key.inspect}"
316
+ puts "translated message = #{value.inspect}"
317
+ puts "--------------------------------------------------------------------"
318
+ end
319
+ }
320
+ end
@@ -0,0 +1,50 @@
1
+ =begin
2
+ parser/erb.rb - parser for ERB
3
+
4
+ Copyright (C) 2005 Masao Mutoh
5
+
6
+ You may redistribute it and/or modify it under the same
7
+ license terms as Ruby.
8
+
9
+ $Id: erb.rb,v 1.5 2007/08/01 01:39:14 mutoh Exp $
10
+ =end
11
+
12
+ require 'erb'
13
+ require 'gettext/parser/ruby.rb'
14
+
15
+ module GetText
16
+ module ErbParser
17
+ @config = {
18
+ :extnames => ['.rhtml', '.erb']
19
+ }
20
+
21
+ module_function
22
+ # Sets some preferences to parse ERB files.
23
+ # * config: a Hash of the config. It can takes some values below:
24
+ # * :extnames: An Array of target files extension. Default is [".rhtml"].
25
+ def init(config)
26
+ config.each{|k, v|
27
+ @config[k] = v
28
+ }
29
+ end
30
+
31
+ def parse(file, targets = []) # :nodoc:
32
+ erb = ERB.new(IO.readlines(file).join).src.split(/$/)
33
+ RubyParser.parse_lines(file, erb, targets)
34
+ end
35
+
36
+ def target?(file) # :nodoc:
37
+ @config[:extnames].each do |v|
38
+ return true if File.extname(file) == v
39
+ end
40
+ false
41
+ end
42
+ end
43
+ end
44
+
45
+ if __FILE__ == $0
46
+ # ex) ruby glade.rhtml foo.rhtml bar.rhtml
47
+ ARGV.each do |file|
48
+ p GetText::ErbParser.parse(file)
49
+ end
50
+ end
@@ -0,0 +1,99 @@
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
+ bindtextdomain("rgettext")
19
+
20
+ TARGET1 = /<property.*translatable="yes">(.*)/
21
+ TARGET2 = /(.*)<\/property>/
22
+
23
+ module_function
24
+ def parse(file, targets = []) # :nodoc:
25
+ lines = IO.readlines(file)
26
+ parse_lines(file, lines, targets)
27
+ end
28
+
29
+ #from ary of lines.
30
+ def parse_lines(file, lines, targets) # :nodoc:
31
+ cnt = 0
32
+ target = false
33
+ line_no = 0
34
+ val = nil
35
+
36
+ loop do
37
+ line = lines.shift
38
+ break unless line
39
+
40
+ cnt += 1
41
+ if TARGET1 =~ line
42
+ line_no = cnt
43
+ val = $1 + "\n"
44
+ target = true
45
+ if TARGET2 =~ $1
46
+ val = $1
47
+ add_target(val, file, line_no, targets)
48
+ val = nil
49
+ target = false
50
+ end
51
+ elsif target
52
+ if TARGET2 =~ line
53
+ val << $1
54
+ add_target(val, file, line_no, targets)
55
+ val = nil
56
+ target = false
57
+ else
58
+ val << line
59
+ end
60
+ end
61
+ end
62
+ targets
63
+ end
64
+
65
+ XML_RE = /<\?xml/
66
+ GLADE_RE = /glade-2.0.dtd/
67
+
68
+ def target?(file) # :nodoc:
69
+ data = IO.readlines(file)
70
+ if XML_RE =~ data[0] and GLADE_RE =~ data[1]
71
+ true
72
+ else
73
+ if File.extname(file) == '.glade'
74
+ raise _("`%{file}' is not glade-2.0 format.") % {:file => file}
75
+ end
76
+ false
77
+ end
78
+ end
79
+
80
+ def add_target(val, file, line_no, targets) # :nodoc:
81
+ return unless val.size > 0
82
+ assoc_data = targets.assoc(val)
83
+ val = CGI.unescapeHTML(val)
84
+ if assoc_data
85
+ targets[targets.index(assoc_data)] = assoc_data << "#{file}:#{line_no}"
86
+ else
87
+ targets << [val.gsub(/\n/, '\n'), "#{file}:#{line_no}"]
88
+ end
89
+ targets
90
+ end
91
+ end
92
+ end
93
+
94
+ if __FILE__ == $0
95
+ # ex) ruby glade.rb foo.glade bar.glade
96
+ ARGV.each do |file|
97
+ p GetText::GladeParser.parse(file)
98
+ end
99
+ end