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
data/lib/gettext.rb ADDED
@@ -0,0 +1,263 @@
1
+ gem 'locale', '>=0.9'
2
+ require 'locale'
3
+
4
+ require 'gettext/version'
5
+ require 'gettext/textdomain_manager'
6
+
7
+ module GetText
8
+
9
+ def self.included(mod) #:nodoc:
10
+ mod.extend self
11
+ end
12
+
13
+ module_function
14
+ # bindtextdomain(domainname, options = {})
15
+ #
16
+ # Bind a textdomain(%{path}/%{locale}/LC_MESSAGES/%{domainname}.mo) to
17
+ # your program.
18
+ # Normally, the texdomain scope becomes the class/module(and parent
19
+ # classes/included modules).
20
+ #
21
+ # * domainname: the textdomain name.
22
+ # * options: options as an Hash.
23
+ # * :path - the path to the mo-files. When the value is nil, it will search default paths such as
24
+ # /usr/share/locale, /usr/local/share/locale)
25
+ # * :supported_language_tags - an Array of the supported language tags for this textdomain.
26
+ # * :output_charset - The output charset. Same with GetText.set_output_charset. Usually, L10n
27
+ # library doesn't use this option. Application may use this once.
28
+ # * Returns: the GetText::TextDomainManager.
29
+ #
30
+ def bindtextdomain(domainname, *args)
31
+ if args[0].kind_of? Hash
32
+ options = args[0]
33
+ else
34
+ # for backward compatibility.
35
+ options = {}
36
+ options[:path] = args[0] if args[0]
37
+ options[:output_charset] = args[2] if args[2]
38
+ end
39
+ TextDomainManager.bind_to(self, domainname, options)
40
+ end
41
+
42
+ # Includes GetText module and bind a textdomain to a class.
43
+ # * klass: the target ruby class.
44
+ # * domainname: the textdomain name.
45
+ # * options: options as an Hash. See GetText.bindtextdomain.
46
+ def bindtextdomain_to(klass, domainname, options = {})
47
+ ret = nil
48
+ klass.module_eval {
49
+ include GetText
50
+ ret = bindtextdomain(domainname, options)
51
+ }
52
+ ret
53
+ end
54
+
55
+ def textdomain(domainname) #:nodoc:
56
+ warn "GetText.textdomain is deprecated. Call bindtextdomain instead."
57
+ bindtextdomain(domainname)
58
+ end
59
+
60
+ # call-seq:
61
+ # gettext(msgid)
62
+ # _(msgid)
63
+ #
64
+ # Translates msgid and return the message.
65
+ # This doesn't make a copy of the message.
66
+ #
67
+ # You need to use String#dup if you want to modify the return value
68
+ # with destructive functions.
69
+ #
70
+ # (e.g.1) _("Hello ").dup << "world"
71
+ #
72
+ # But e.g.1 should be rewrite to:
73
+ #
74
+ # (e.g.2) _("Hello %{val}") % {:val => "world"}
75
+ #
76
+ # Because the translator may want to change the position of "world".
77
+ #
78
+ # * msgid: the message id.
79
+ # * Returns: localized text by msgid. If there are not binded mo-file, it will return msgid.
80
+ def gettext(msgid)
81
+ TextDomainManager.get(self).translate_singluar_message(self, msgid)
82
+ end
83
+
84
+ # call-seq:
85
+ # sgettext(msgid, div = '|')
86
+ # s_(msgid, div = '|')
87
+ #
88
+ # Translates msgid, but if there are no localized text,
89
+ # it returns a last part of msgid separeted "div".
90
+ #
91
+ # * msgid: the message id.
92
+ # * div: separator or nil.
93
+ # * Returns: the localized text by msgid. If there are no localized text,
94
+ # it returns a last part of msgid separeted "div".
95
+ # See: http://www.gnu.org/software/gettext/manual/html_mono/gettext.html#SEC151
96
+ def sgettext(msgid, div = "|")
97
+ TextDomainManager.get(self).translate_singluar_message(self, msgid, div)
98
+ end
99
+
100
+ # call-seq:
101
+ # pgettext(msgctxt, msgid)
102
+ # p_(msgctxt, msgid)
103
+ #
104
+ # Translates msgid with msgctxt. This methods is similer with s_().
105
+ # e.g.) p_("File", "New") == s_("File|New")
106
+ # p_("File", "Open") == s_("File|Open")
107
+ #
108
+ # * msgctxt: the message context.
109
+ # * msgid: the message id.
110
+ # * Returns: the localized text by msgid. If there are no localized text,
111
+ # it returns msgid.
112
+ # See: http://www.gnu.org/software/autoconf/manual/gettext/Contexts.html
113
+ def pgettext(msgctxt, msgid)
114
+ TextDomainManager.get(self).translate_singluar_message(self, "#{msgctxt}\004#{msgid}", "\004")
115
+ end
116
+
117
+ # call-seq:
118
+ # ngettext(msgid, msgid_plural, n)
119
+ # ngettext(msgids, n) # msgids = [msgid, msgid_plural]
120
+ # n_(msgid, msgid_plural, n)
121
+ # n_(msgids, n) # msgids = [msgid, msgid_plural]
122
+ #
123
+ # The ngettext is similar to the gettext function as it finds the message catalogs in the same way.
124
+ # But it takes two extra arguments for plural form.
125
+ #
126
+ # * msgid: the singular form.
127
+ # * msgid_plural: the plural form.
128
+ # * n: a number used to determine the plural form.
129
+ # * Returns: the localized text which key is msgid_plural if n is plural(follow plural-rule) or msgid.
130
+ # "plural-rule" is defined in po-file.
131
+ def ngettext(arg1, arg2, arg3 = nil)
132
+ TextDomainManager.get(self).translate_plural_message(self, arg1, arg2, arg3)
133
+ end
134
+
135
+ # call-seq:
136
+ # nsgettext(msgid, msgid_plural, n, div = "|")
137
+ # nsgettext(msgids, n, div = "|") # msgids = [msgid, msgid_plural]
138
+ # n_(msgid, msgid_plural, n, div = "|")
139
+ # n_(msgids, n, div = "|") # msgids = [msgid, msgid_plural]
140
+ #
141
+ # The nsgettext is similar to the ngettext.
142
+ # But if there are no localized text,
143
+ # it returns a last part of msgid separeted "div".
144
+ #
145
+ # * msgid: the singular form with "div". (e.g. "Special|An apple")
146
+ # * msgid_plural: the plural form. (e.g. "%{num} Apples")
147
+ # * n: a number used to determine the plural form.
148
+ # * Returns: the localized text which key is msgid_plural if n is plural(follow plural-rule) or msgid.
149
+ # "plural-rule" is defined in po-file.
150
+ def nsgettext(arg1, arg2, arg3 = "|", arg4 = "|")
151
+ TextDomainManager.get(self).translate_plural_message(self, arg1, arg2, arg3, arg4)
152
+ end
153
+
154
+ # call-seq:
155
+ # npgettext(msgctxt, msgid, msgid_plural, n)
156
+ # npgettext(msgctxt, msgids, n) # msgids = [msgid, msgid_plural]
157
+ # np_(msgctxt, msgid, msgid_plural, n)
158
+ # np_(msgctxt, msgids, n) # msgids = [msgid, msgid_plural]
159
+ #
160
+ # The npgettext is similar to the nsgettext function.
161
+ # e.g.) np_("Special", "An apple", "%{num} Apples", num) == ns_("Special|An apple", "%{num} Apples", num)
162
+ # * msgctxt: the message context.
163
+ # * msgid: the singular form.
164
+ # * msgid_plural: the plural form.
165
+ # * n: a number used to determine the plural form.
166
+ # * Returns: the localized text which key is msgid_plural if n is plural(follow plural-rule) or msgid.
167
+ # "plural-rule" is defined in po-file.
168
+ def npgettext(msgctxt, arg1, arg2 = nil, arg3 = nil)
169
+ if arg1.kind_of?(Array)
170
+ msgid = arg1[0]
171
+ msgid_ctxt = "#{msgctxt}\004#{msgid}"
172
+ msgid_plural = arg1[1]
173
+ opt1 = arg2
174
+ opt2 = arg3
175
+ else
176
+ msgid = arg1
177
+ msgid_ctxt = "#{msgctxt}\004#{msgid}"
178
+ msgid_plural = arg2
179
+ opt1 = arg3
180
+ opt2 = nil
181
+ end
182
+ ret = TextDomainManager.get(self).translate_plural_message(self, msgid_ctxt, msgid_plural, opt1, opt2)
183
+
184
+ if ret == msgid_ctxt
185
+ ret = msgid
186
+ end
187
+ ret
188
+ end
189
+
190
+ # This function does nothing. But it is required in order to recognize the msgid by rgettext.
191
+ # * msgid: the message id.
192
+ # * Returns: msgid.
193
+ def N_(msgid)
194
+ msgid
195
+ end
196
+
197
+ # This is same function as N_ but for ngettext.
198
+ # * msgid: the message id.
199
+ # * msgid_plural: the plural message id.
200
+ # * Returns: msgid.
201
+ def Nn_(msgid, msgid_plural)
202
+ [msgid, msgid_plural]
203
+ end
204
+
205
+ # Sets charset(String) such as "euc-jp", "sjis", "CP932", "utf-8", ...
206
+ # You shouldn't use this in your own Libraries.
207
+ # * charset: an output_charset
208
+ # * Returns: self
209
+ def set_output_charset(charset)
210
+ TextDomainManager.output_charset = charset
211
+ self
212
+ end
213
+
214
+ # Gets the current output_charset which is set using GetText.set_output_charset.
215
+ # * Returns: output_charset.
216
+ def output_charset
217
+ TextDomainManager.output_charset
218
+ end
219
+
220
+ def set_locale(lang)
221
+ Locale.clear
222
+ Locale.current = lang
223
+ end
224
+
225
+ def locale
226
+ Locale.current[0]
227
+ end
228
+
229
+ alias :locale= :set_locale #:nodoc:
230
+ module_function :locale= #:nodoc:
231
+
232
+ alias :_ :gettext #:nodoc:
233
+ module_function :_ #:nodoc:
234
+
235
+ alias :n_ :ngettext #:nodoc:
236
+ module_function :n_ #:nodoc:
237
+
238
+ alias :s_ :sgettext #:nodoc:
239
+ module_function :s_ #:nodoc:
240
+
241
+ alias :ns_ :nsgettext #:nodoc:
242
+ module_function :ns_ #:nodoc:
243
+
244
+ alias :np_ :npgettext #:nodoc:
245
+ module_function :np_ #:nodoc:
246
+
247
+ alias :output_charset= :set_output_charset #:nodoc:
248
+ module_function :output_charset= #:nodoc:
249
+
250
+ unless defined? XX
251
+ # This is the workaround to conflict p_ methods with the xx("double x") library.
252
+ # http://rubyforge.org/projects/codeforpeople/
253
+ alias :p_ :pgettext #:nodoc:
254
+ module_function :p_
255
+ end
256
+
257
+ # for backward compatibility
258
+ alias :set_locale_all :set_locale #:nodoc:
259
+ alias :set_locale_all :set_locale #:nodoc:
260
+ module_function :set_locale_all #:nodoc:
261
+ alias :setlocale :set_locale #:nodoc:
262
+ module_function :setlocale #:nodoc:
263
+ end
@@ -0,0 +1,40 @@
1
+ =begin
2
+ gettext/cgi.rb - GetText for CGI
3
+
4
+ Copyright (C) 2005-2009 Masao Mutoh
5
+
6
+ You may redistribute it and/or modify it under the same
7
+ license terms as Ruby.
8
+
9
+ $Id$
10
+ =end
11
+
12
+ require 'cgi'
13
+ require 'gettext'
14
+
15
+ Locale.init(:driver => :cgi)
16
+
17
+ module GetText
18
+ module_function
19
+
20
+ # Sets a CGI object.
21
+ # * cgi_: CGI object
22
+ # * Returns: self
23
+ def set_cgi(cgi_)
24
+ Locale.set_cgi(cgi_)
25
+ end
26
+
27
+ # Same as GetText.set_cgi.
28
+ # * cgi_: CGI object
29
+ # * Returns: cgi_
30
+ def cgi=(cgi_)
31
+ set_cgi(cgi_)
32
+ cgi_
33
+ end
34
+
35
+ # Gets the CGI object. If it is nil, returns new CGI object.
36
+ # * Returns: the CGI object
37
+ def cgi
38
+ Locale.cgi
39
+ end
40
+ end
@@ -0,0 +1,55 @@
1
+ require 'locale/util/memoizable'
2
+
3
+ module GetText
4
+ module ClassInfo
5
+ include Locale::Util::Memoizable
6
+
7
+ module_function
8
+ # normalize the klass name
9
+ def normalize_class(klass)
10
+ ret = (klass.kind_of? Module) ? klass : klass.class
11
+ if ret.name =~ /^\#<|^$/ or ret == GetText
12
+ ret = Object
13
+ end
14
+ ret
15
+ end
16
+
17
+ # Internal method for related_classes.
18
+ def related_classes_internal(klass, all_classes = [], analyzed_classes = [] )
19
+ ret = []
20
+ klass = normalize_class(klass)
21
+
22
+ return [Object] if [Object, Kernel].include? klass
23
+
24
+ ary = klass.name.split(/::/)
25
+ while(v = ary.shift)
26
+ ret.unshift(((ret.size == 0) ? Object.const_get(v) : ret[0].const_get(v)))
27
+ end
28
+ ret -= analyzed_classes
29
+ if ret.size > 1
30
+ ret += related_classes_internal(ret[1], all_classes, analyzed_classes)
31
+ ret.uniq!
32
+ end
33
+ analyzed_classes << klass unless analyzed_classes.include? klass
34
+ klass.ancestors[1..-1].each do |v|
35
+ ret += related_classes_internal(v, all_classes, analyzed_classes)
36
+ ret.uniq!
37
+ end
38
+
39
+ if all_classes.size > 0
40
+ ((ret - [Kernel]) & all_classes).uniq
41
+ else
42
+ (ret - [Kernel]).uniq
43
+ end
44
+ end
45
+
46
+ # Returns the classes which related to klass
47
+ # (klass's ancestors, included modules and nested modules)
48
+ def related_classes(klass, all_classes = [])
49
+ ret = related_classes_internal(klass, all_classes)
50
+ (ret + [Object]).uniq
51
+ end
52
+ memoize :related_classes
53
+ end
54
+ end
55
+
@@ -0,0 +1,109 @@
1
+ =begin
2
+ iconv.rb - Pseudo Iconv class. Supports Iconv.iconv, Iconv.conv.
3
+
4
+ For Matz Ruby:
5
+ If you don't have iconv but glib2, this library uses glib2 iconv functions.
6
+
7
+ For JRuby:
8
+ Use Java String class to convert strings.
9
+
10
+ Copyright (C) 2004-2007 Masao Mutoh
11
+
12
+ You may redistribute it and/or modify it under the same
13
+ license terms as Ruby.
14
+
15
+ $Id: iconv.rb,v 1.6 2007/11/08 14:21:22 mutoh Exp $
16
+ =end
17
+
18
+ begin
19
+ require 'iconv.so'
20
+ rescue LoadError
21
+ # Pseudo Iconv class
22
+ #
23
+ # Provides Iconv.iconv which uses Ruby/GLib(1) functions. This library also required from 'gettext'.
24
+ # If you require 'gettext/iconv', Iconv.iconv try to call Ruby/GLib function
25
+ # when it doesn't find original Iconv class(iconv.so).
26
+ #
27
+ # (1) Ruby/GLib is a module which is provided from Ruby-GNOME2 Project.
28
+ # You can get binaries for Win32(One-Click Ruby Installer).
29
+ # <URL: http://ruby-gnome2.sourceforge.jp/>
30
+ class Iconv
31
+ module Failure; end
32
+ class InvalidEncoding < ArgumentError; include Failure; end
33
+ class IllegalSequence < ArgumentError; include Failure; end
34
+ class InvalidCharacter < ArgumentError; include Failure; end
35
+
36
+ if RUBY_PLATFORM =~ /java/
37
+ def self.conv(to, from, str)
38
+ raise InvalidCharacter, "the 3rd argument is nil" unless str
39
+ begin
40
+ str = java.lang.String.new(str.unpack("C*").to_java(:byte), from)
41
+ str.getBytes(to).to_ary.pack("C*")
42
+ rescue java.io.UnsupportedEncodingException
43
+ raise InvalidEncoding
44
+ end
45
+ end
46
+ else
47
+ begin
48
+ require 'glib2'
49
+
50
+ def self.check_glib_version?(major, minor, micro) # :nodoc:
51
+ (GLib::BINDING_VERSION[0] > major ||
52
+ (GLib::BINDING_VERSION[0] == major &&
53
+ GLib::BINDING_VERSION[1] > minor) ||
54
+ (GLib::BINDING_VERSION[0] == major &&
55
+ GLib::BINDING_VERSION[1] == minor &&
56
+ GLib::BINDING_VERSION[2] >= micro))
57
+ end
58
+
59
+ if check_glib_version?(0, 11, 0)
60
+ # This is a function equivalent of Iconv.iconv.
61
+ # * to: encoding name for destination
62
+ # * from: encoding name for source
63
+ # * str: strings to be converted
64
+ # * Returns: Returns an Array of converted strings.
65
+ def self.conv(to, from, str)
66
+ begin
67
+ GLib.convert(str, to, from)
68
+ rescue GLib::ConvertError => e
69
+ case e.code
70
+ when GLib::ConvertError::NO_CONVERSION
71
+ raise InvalidEncoding.new(str)
72
+ when GLib::ConvertError::ILLEGAL_SEQUENCE
73
+ raise IllegalSequence.new(str)
74
+ else
75
+ raise InvalidCharacter.new(str)
76
+ end
77
+ end
78
+ end
79
+ else
80
+ def self.conv(to, from, str) # :nodoc:
81
+ begin
82
+ GLib.convert(str, to, from)
83
+ rescue
84
+ raise IllegalSequence.new(str)
85
+ end
86
+ end
87
+ end
88
+ rescue LoadError
89
+ def self.conv(to, from, str) # :nodoc:
90
+ warn "Iconv was not found." if $DEBUG
91
+ str
92
+ end
93
+ end
94
+ end
95
+ def self.iconv(to, from, str)
96
+ conv(to, from, str).split(//)
97
+ end
98
+ end
99
+ end
100
+
101
+ if __FILE__ == $0
102
+ puts Iconv.iconv("EUC-JP", "UTF-8", "ほげ").join
103
+ begin
104
+ puts Iconv.iconv("EUC-JP", "EUC-JP", "ほげ").join
105
+ rescue Iconv::Failure
106
+ puts $!
107
+ puts $!.class
108
+ end
109
+ end