gettext 2.2.1 → 2.3.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 (500) hide show
  1. data/COPYING +2 -1
  2. data/README.rdoc +9 -9
  3. data/Rakefile +94 -149
  4. data/bin/rmsgfmt +23 -20
  5. data/bin/rmsginit +29 -0
  6. data/bin/rmsgmerge +22 -20
  7. data/bin/rxgettext +24 -0
  8. data/doc/text/news.md +60 -0
  9. data/gettext.gemspec +7 -4
  10. data/lib/gettext.rb +3 -3
  11. data/lib/gettext/core_ext/string.rb +2 -1
  12. data/lib/gettext/runtime/locale_path.rb +6 -4
  13. data/lib/gettext/runtime/textdomain.rb +14 -8
  14. data/lib/gettext/runtime/textdomain_manager.rb +3 -3
  15. data/lib/gettext/task.rb +203 -0
  16. data/lib/gettext/tools.rb +33 -24
  17. data/lib/gettext/tools/msgfmt.rb +104 -0
  18. data/lib/gettext/tools/msginit.rb +363 -0
  19. data/lib/gettext/tools/msgmerge.rb +510 -0
  20. data/lib/gettext/tools/parser/ruby.rb +12 -17
  21. data/lib/gettext/tools/pomessage.rb +37 -4
  22. data/lib/gettext/tools/poparser.rb +27 -24
  23. data/lib/gettext/tools/xgettext.rb +327 -0
  24. data/lib/gettext/version.rb +2 -2
  25. data/po/bg/rgettext.po +2 -2
  26. data/po/bs/rgettext.po +2 -2
  27. data/po/ca/rgettext.po +2 -2
  28. data/po/cs/rgettext.po +2 -2
  29. data/po/de/gettext.po +668 -0
  30. data/po/de/gettext.po.bak +589 -0
  31. data/po/de/rgettext.po +2 -2
  32. data/po/el/gettext.po +571 -0
  33. data/po/el/rgettext.po +2 -2
  34. data/po/eo/rgettext.po +2 -2
  35. data/po/es/rgettext.po +2 -2
  36. data/po/et/rgettext.po +2 -2
  37. data/po/fr/gettext.po +589 -0
  38. data/po/fr/rgettext.po +2 -2
  39. data/po/gettext.pot +638 -0
  40. data/po/gettext.pot~ +638 -0
  41. data/po/hr/rgettext.po +2 -2
  42. data/po/hu/rgettext.po +2 -2
  43. data/po/it/gettext.po +589 -0
  44. data/po/it/rgettext.po +2 -2
  45. data/po/ja/gettext.po +591 -0
  46. data/po/ja/rgettext.po +112 -69
  47. data/po/ko/rgettext.po +2 -2
  48. data/po/lv/rgettext.po +2 -2
  49. data/po/nb/rgettext.po +2 -2
  50. data/po/nl/rgettext.po +2 -2
  51. data/po/pt_BR/rgettext.po +2 -2
  52. data/po/ru/rgettext.po +2 -2
  53. data/po/sr/rgettext.po +2 -2
  54. data/po/sv/rgettext.po +2 -2
  55. data/po/uk/gettext.po +571 -0
  56. data/po/uk/rgettext.po +2 -2
  57. data/po/vi/rgettext.po +2 -2
  58. data/po/zh/rgettext.po +2 -2
  59. data/po/zh_TW/rgettext.po +2 -2
  60. data/samples/README +2 -4
  61. data/samples/cgi/README +1 -1
  62. data/samples/cgi/cookie.cgi +1 -1
  63. data/samples/cgi/gettext.css +1 -1
  64. data/samples/cgi/helloerb.rhtml +1 -1
  65. data/samples/cgi/hellolib.rb +1 -1
  66. data/samples/cgi/http.rb +2 -2
  67. data/samples/cgi/index.cgi +1 -1
  68. data/samples/cgi/locale/bg/LC_MESSAGES/helloerb1.mo +0 -0
  69. data/samples/cgi/locale/bg/LC_MESSAGES/helloerb2.mo +0 -0
  70. data/samples/cgi/locale/bg/LC_MESSAGES/main.mo +0 -0
  71. data/samples/cgi/locale/bs/LC_MESSAGES/helloerb1.mo +0 -0
  72. data/samples/cgi/locale/bs/LC_MESSAGES/helloerb2.mo +0 -0
  73. data/samples/cgi/locale/bs/LC_MESSAGES/main.mo +0 -0
  74. data/samples/cgi/locale/ca/LC_MESSAGES/helloerb1.mo +0 -0
  75. data/samples/cgi/locale/ca/LC_MESSAGES/helloerb2.mo +0 -0
  76. data/samples/cgi/locale/ca/LC_MESSAGES/main.mo +0 -0
  77. data/samples/cgi/locale/cs/LC_MESSAGES/helloerb1.mo +0 -0
  78. data/samples/cgi/locale/cs/LC_MESSAGES/helloerb2.mo +0 -0
  79. data/samples/cgi/locale/cs/LC_MESSAGES/main.mo +0 -0
  80. data/samples/cgi/locale/de/LC_MESSAGES/helloerb1.mo +0 -0
  81. data/samples/cgi/locale/de/LC_MESSAGES/helloerb2.mo +0 -0
  82. data/samples/cgi/locale/de/LC_MESSAGES/main.mo +0 -0
  83. data/samples/cgi/locale/el/LC_MESSAGES/helloerb1.mo +0 -0
  84. data/samples/cgi/locale/el/LC_MESSAGES/helloerb2.mo +0 -0
  85. data/samples/cgi/locale/el/LC_MESSAGES/main.mo +0 -0
  86. data/samples/cgi/locale/eo/LC_MESSAGES/helloerb1.mo +0 -0
  87. data/samples/cgi/locale/eo/LC_MESSAGES/helloerb2.mo +0 -0
  88. data/samples/cgi/locale/eo/LC_MESSAGES/main.mo +0 -0
  89. data/samples/cgi/locale/es/LC_MESSAGES/helloerb1.mo +0 -0
  90. data/samples/cgi/locale/es/LC_MESSAGES/helloerb2.mo +0 -0
  91. data/samples/cgi/locale/es/LC_MESSAGES/main.mo +0 -0
  92. data/samples/cgi/locale/fr/LC_MESSAGES/helloerb1.mo +0 -0
  93. data/samples/cgi/locale/fr/LC_MESSAGES/helloerb2.mo +0 -0
  94. data/samples/cgi/locale/fr/LC_MESSAGES/main.mo +0 -0
  95. data/samples/cgi/locale/hr/LC_MESSAGES/helloerb1.mo +0 -0
  96. data/samples/cgi/locale/hr/LC_MESSAGES/helloerb2.mo +0 -0
  97. data/samples/cgi/locale/hr/LC_MESSAGES/main.mo +0 -0
  98. data/samples/cgi/locale/hu/LC_MESSAGES/helloerb1.mo +0 -0
  99. data/samples/cgi/locale/hu/LC_MESSAGES/helloerb2.mo +0 -0
  100. data/samples/cgi/locale/hu/LC_MESSAGES/main.mo +0 -0
  101. data/samples/cgi/locale/it/LC_MESSAGES/helloerb1.mo +0 -0
  102. data/samples/cgi/locale/it/LC_MESSAGES/helloerb2.mo +0 -0
  103. data/samples/cgi/locale/it/LC_MESSAGES/main.mo +0 -0
  104. data/samples/cgi/locale/ja/LC_MESSAGES/helloerb1.mo +0 -0
  105. data/samples/cgi/locale/ja/LC_MESSAGES/helloerb2.mo +0 -0
  106. data/samples/cgi/locale/ja/LC_MESSAGES/main.mo +0 -0
  107. data/samples/cgi/locale/ko/LC_MESSAGES/helloerb1.mo +0 -0
  108. data/samples/cgi/locale/ko/LC_MESSAGES/helloerb2.mo +0 -0
  109. data/samples/cgi/locale/ko/LC_MESSAGES/main.mo +0 -0
  110. data/samples/cgi/locale/lv/LC_MESSAGES/helloerb1.mo +0 -0
  111. data/samples/cgi/locale/lv/LC_MESSAGES/helloerb2.mo +0 -0
  112. data/samples/cgi/locale/lv/LC_MESSAGES/main.mo +0 -0
  113. data/samples/cgi/locale/nb/LC_MESSAGES/helloerb1.mo +0 -0
  114. data/samples/cgi/locale/nb/LC_MESSAGES/helloerb2.mo +0 -0
  115. data/samples/cgi/locale/nb/LC_MESSAGES/main.mo +0 -0
  116. data/samples/cgi/locale/nl/LC_MESSAGES/helloerb1.mo +0 -0
  117. data/samples/cgi/locale/nl/LC_MESSAGES/helloerb2.mo +0 -0
  118. data/samples/cgi/locale/nl/LC_MESSAGES/main.mo +0 -0
  119. data/samples/cgi/locale/pt_BR/LC_MESSAGES/helloerb1.mo +0 -0
  120. data/samples/cgi/locale/pt_BR/LC_MESSAGES/helloerb2.mo +0 -0
  121. data/samples/cgi/locale/pt_BR/LC_MESSAGES/main.mo +0 -0
  122. data/samples/cgi/locale/ru/LC_MESSAGES/helloerb1.mo +0 -0
  123. data/samples/cgi/locale/ru/LC_MESSAGES/helloerb2.mo +0 -0
  124. data/samples/cgi/locale/ru/LC_MESSAGES/main.mo +0 -0
  125. data/samples/cgi/locale/sr/LC_MESSAGES/helloerb1.mo +0 -0
  126. data/samples/cgi/locale/sr/LC_MESSAGES/helloerb2.mo +0 -0
  127. data/samples/cgi/locale/sr/LC_MESSAGES/main.mo +0 -0
  128. data/samples/cgi/locale/uk/LC_MESSAGES/helloerb1.mo +0 -0
  129. data/samples/cgi/locale/uk/LC_MESSAGES/helloerb2.mo +0 -0
  130. data/samples/cgi/locale/uk/LC_MESSAGES/main.mo +0 -0
  131. data/samples/cgi/locale/vi/LC_MESSAGES/helloerb1.mo +0 -0
  132. data/samples/cgi/locale/vi/LC_MESSAGES/helloerb2.mo +0 -0
  133. data/samples/cgi/locale/vi/LC_MESSAGES/main.mo +0 -0
  134. data/samples/cgi/locale/zh/LC_MESSAGES/helloerb1.mo +0 -0
  135. data/samples/cgi/locale/zh/LC_MESSAGES/helloerb2.mo +0 -0
  136. data/samples/cgi/locale/zh/LC_MESSAGES/main.mo +0 -0
  137. data/samples/cgi/locale/zh_TW/LC_MESSAGES/helloerb1.mo +0 -0
  138. data/samples/cgi/locale/zh_TW/LC_MESSAGES/helloerb2.mo +0 -0
  139. data/samples/cgi/locale/zh_TW/LC_MESSAGES/main.mo +0 -0
  140. data/samples/cgi/other.rhtml +1 -1
  141. data/samples/cgi/po/bg/helloerb1.po +4 -4
  142. data/samples/cgi/po/bg/helloerb2.po +4 -4
  143. data/samples/cgi/po/bg/hellolib.po +2 -2
  144. data/samples/cgi/po/bg/main.po +4 -4
  145. data/samples/cgi/po/bs/helloerb1.po +3 -3
  146. data/samples/cgi/po/bs/helloerb2.po +3 -3
  147. data/samples/cgi/po/bs/hellolib.po +2 -2
  148. data/samples/cgi/po/bs/main.po +3 -3
  149. data/samples/cgi/po/ca/helloerb1.po +4 -4
  150. data/samples/cgi/po/ca/helloerb2.po +4 -4
  151. data/samples/cgi/po/ca/hellolib.po +2 -2
  152. data/samples/cgi/po/ca/main.po +4 -4
  153. data/samples/cgi/po/cs/helloerb1.po +4 -4
  154. data/samples/cgi/po/cs/helloerb2.po +4 -4
  155. data/samples/cgi/po/cs/hellolib.po +2 -2
  156. data/samples/cgi/po/cs/main.po +4 -4
  157. data/samples/cgi/po/de/helloerb1.po +3 -3
  158. data/samples/cgi/po/de/helloerb2.po +3 -3
  159. data/samples/cgi/po/de/hellolib.po +2 -2
  160. data/samples/cgi/po/de/main.po +3 -3
  161. data/samples/cgi/po/el/helloerb1.po +3 -3
  162. data/samples/cgi/po/el/helloerb2.po +3 -3
  163. data/samples/cgi/po/el/hellolib.po +2 -2
  164. data/samples/cgi/po/el/main.po +3 -3
  165. data/samples/cgi/po/eo/helloerb1.po +3 -3
  166. data/samples/cgi/po/eo/helloerb2.po +3 -3
  167. data/samples/cgi/po/eo/hellolib.po +2 -2
  168. data/samples/cgi/po/eo/main.po +3 -3
  169. data/samples/cgi/po/es/helloerb1.po +4 -4
  170. data/samples/cgi/po/es/helloerb2.po +4 -4
  171. data/samples/cgi/po/es/hellolib.po +2 -2
  172. data/samples/cgi/po/es/main.po +4 -4
  173. data/samples/cgi/po/fr/helloerb1.po +4 -4
  174. data/samples/cgi/po/fr/helloerb2.po +4 -4
  175. data/samples/cgi/po/fr/hellolib.po +2 -2
  176. data/samples/cgi/po/fr/main.po +4 -4
  177. data/samples/cgi/po/hr/helloerb1.po +3 -3
  178. data/samples/cgi/po/hr/helloerb2.po +3 -3
  179. data/samples/cgi/po/hr/hellolib.po +2 -2
  180. data/samples/cgi/po/hr/main.po +3 -3
  181. data/samples/cgi/po/hu/helloerb1.po +4 -4
  182. data/samples/cgi/po/hu/helloerb2.po +4 -4
  183. data/samples/cgi/po/hu/hellolib.po +2 -2
  184. data/samples/cgi/po/hu/main.po +4 -4
  185. data/samples/cgi/po/it/helloerb1.po +3 -3
  186. data/samples/cgi/po/it/helloerb2.po +3 -3
  187. data/samples/cgi/po/it/hellolib.po +2 -2
  188. data/samples/cgi/po/it/main.po +3 -3
  189. data/samples/cgi/po/ja/helloerb1.po +4 -4
  190. data/samples/cgi/po/ja/helloerb2.po +4 -4
  191. data/samples/cgi/po/ja/hellolib.po +2 -2
  192. data/samples/cgi/po/ja/main.po +3 -3
  193. data/samples/cgi/po/ko/helloerb1.po +3 -3
  194. data/samples/cgi/po/ko/helloerb2.po +3 -3
  195. data/samples/cgi/po/ko/hellolib.po +2 -2
  196. data/samples/cgi/po/ko/main.po +3 -3
  197. data/samples/cgi/po/lv/helloerb1.po +4 -4
  198. data/samples/cgi/po/lv/helloerb2.po +4 -4
  199. data/samples/cgi/po/lv/hellolib.po +2 -2
  200. data/samples/cgi/po/lv/main.po +4 -4
  201. data/samples/cgi/po/nb/helloerb1.po +3 -3
  202. data/samples/cgi/po/nb/helloerb2.po +3 -3
  203. data/samples/cgi/po/nb/hellolib.po +2 -2
  204. data/samples/cgi/po/nb/main.po +3 -3
  205. data/samples/cgi/po/nl/helloerb1.po +4 -4
  206. data/samples/cgi/po/nl/helloerb2.po +4 -4
  207. data/samples/cgi/po/nl/hellolib.po +2 -2
  208. data/samples/cgi/po/nl/main.po +4 -4
  209. data/samples/cgi/po/pt_BR/helloerb1.po +4 -4
  210. data/samples/cgi/po/pt_BR/helloerb2.po +4 -4
  211. data/samples/cgi/po/pt_BR/hellolib.po +2 -2
  212. data/samples/cgi/po/pt_BR/main.po +4 -4
  213. data/samples/cgi/po/ru/helloerb1.po +4 -4
  214. data/samples/cgi/po/ru/helloerb2.po +4 -4
  215. data/samples/cgi/po/ru/hellolib.po +2 -2
  216. data/samples/cgi/po/ru/main.po +4 -4
  217. data/samples/cgi/po/sr/helloerb1.po +4 -4
  218. data/samples/cgi/po/sr/helloerb2.po +4 -4
  219. data/samples/cgi/po/sr/hellolib.po +2 -2
  220. data/samples/cgi/po/sr/main.po +4 -4
  221. data/samples/cgi/po/uk/helloerb1.po +4 -4
  222. data/samples/cgi/po/uk/helloerb2.po +4 -4
  223. data/samples/cgi/po/uk/hellolib.po +2 -2
  224. data/samples/cgi/po/uk/main.po +4 -4
  225. data/samples/cgi/po/vi/helloerb1.po +3 -3
  226. data/samples/cgi/po/vi/helloerb2.po +3 -3
  227. data/samples/cgi/po/vi/hellolib.po +2 -2
  228. data/samples/cgi/po/vi/main.po +3 -3
  229. data/samples/cgi/po/zh/helloerb1.po +4 -4
  230. data/samples/cgi/po/zh/helloerb2.po +4 -4
  231. data/samples/cgi/po/zh/hellolib.po +2 -2
  232. data/samples/cgi/po/zh/main.po +4 -4
  233. data/samples/cgi/po/zh_TW/helloerb1.po +4 -4
  234. data/samples/cgi/po/zh_TW/helloerb2.po +4 -4
  235. data/samples/cgi/po/zh_TW/hellolib.po +2 -2
  236. data/samples/cgi/po/zh_TW/main.po +4 -4
  237. data/samples/hello.rb +1 -1
  238. data/samples/hello2.rb +1 -1
  239. data/samples/hello_glade2.rb +1 -1
  240. data/samples/hello_gtk2.rb +2 -2
  241. data/samples/hello_noop.rb +1 -1
  242. data/samples/hello_plural.rb +1 -1
  243. data/samples/hello_tk.rb +1 -1
  244. data/samples/locale/bg/LC_MESSAGES/hello_gtk2.mo +0 -0
  245. data/samples/locale/bs/LC_MESSAGES/hello_gtk2.mo +0 -0
  246. data/samples/locale/ca/LC_MESSAGES/hello_gtk2.mo +0 -0
  247. data/samples/locale/cs/LC_MESSAGES/hello_gtk2.mo +0 -0
  248. data/samples/locale/de/LC_MESSAGES/hello_gtk2.mo +0 -0
  249. data/samples/locale/el/LC_MESSAGES/hello_gtk2.mo +0 -0
  250. data/samples/locale/eo/LC_MESSAGES/hello_gtk2.mo +0 -0
  251. data/samples/locale/es/LC_MESSAGES/hello_gtk2.mo +0 -0
  252. data/samples/locale/fr/LC_MESSAGES/hello_gtk2.mo +0 -0
  253. data/samples/locale/hr/LC_MESSAGES/hello_gtk2.mo +0 -0
  254. data/samples/locale/hu/LC_MESSAGES/hello_gtk2.mo +0 -0
  255. data/samples/locale/it/LC_MESSAGES/hello_gtk2.mo +0 -0
  256. data/samples/locale/ja/LC_MESSAGES/hello_gtk2.mo +0 -0
  257. data/samples/locale/ko/LC_MESSAGES/hello_gtk2.mo +0 -0
  258. data/samples/locale/lv/LC_MESSAGES/hello_gtk2.mo +0 -0
  259. data/samples/locale/nb/LC_MESSAGES/hello_gtk2.mo +0 -0
  260. data/samples/locale/nl/LC_MESSAGES/hello_gtk2.mo +0 -0
  261. data/samples/locale/pt_BR/LC_MESSAGES/hello_gtk2.mo +0 -0
  262. data/samples/locale/ru/LC_MESSAGES/hello_gtk2.mo +0 -0
  263. data/samples/locale/sr/LC_MESSAGES/hello_gtk2.mo +0 -0
  264. data/samples/locale/sv/LC_MESSAGES/hello_gtk2.mo +0 -0
  265. data/samples/locale/uk/LC_MESSAGES/hello_gtk2.mo +0 -0
  266. data/samples/locale/vi/LC_MESSAGES/hello_gtk2.mo +0 -0
  267. data/samples/locale/zh/LC_MESSAGES/hello_gtk2.mo +0 -0
  268. data/samples/locale/zh_TW/LC_MESSAGES/hello_gtk2.mo +0 -0
  269. data/samples/po/bg/hello.po +2 -2
  270. data/samples/po/bg/hello2.po +1 -1
  271. data/samples/po/bg/hello_glade2.po +1 -1
  272. data/samples/po/bg/{hello_gtk.po → hello_gtk2.po} +1 -1
  273. data/samples/po/bg/hello_noop.po +1 -1
  274. data/samples/po/bg/hello_plural.po +1 -1
  275. data/samples/po/bg/hello_tk.po +1 -1
  276. data/samples/po/bs/hello.po +2 -2
  277. data/samples/po/bs/hello2.po +1 -1
  278. data/samples/po/bs/hello_glade2.po +1 -1
  279. data/samples/po/bs/{hello_gtk.po → hello_gtk2.po} +1 -1
  280. data/samples/po/bs/hello_noop.po +1 -1
  281. data/samples/po/bs/hello_plural.po +1 -1
  282. data/samples/po/bs/hello_tk.po +1 -1
  283. data/samples/po/ca/hello.po +2 -2
  284. data/samples/po/ca/hello2.po +1 -1
  285. data/samples/po/ca/hello_glade2.po +1 -1
  286. data/samples/po/ca/{hello_gtk.po → hello_gtk2.po} +1 -1
  287. data/samples/po/ca/hello_noop.po +1 -1
  288. data/samples/po/ca/hello_plural.po +1 -1
  289. data/samples/po/ca/hello_tk.po +1 -1
  290. data/samples/po/cs/hello.po +1 -1
  291. data/samples/po/cs/hello_glade2.po +1 -1
  292. data/samples/po/cs/{hello_gtk.po → hello_gtk2.po} +0 -0
  293. data/samples/po/cs/hello_plural.po +1 -1
  294. data/samples/po/de/hello.po +1 -1
  295. data/samples/po/de/{hello_gtk.po → hello_gtk2.po} +0 -0
  296. data/samples/po/de/hello_plural.po +1 -1
  297. data/samples/po/el/hello.po +2 -2
  298. data/samples/po/el/hello2.po +1 -1
  299. data/samples/po/el/hello_glade2.po +1 -1
  300. data/samples/po/el/{hello_gtk.po → hello_gtk2.po} +1 -1
  301. data/samples/po/el/hello_noop.po +1 -1
  302. data/samples/po/el/hello_plural.po +1 -1
  303. data/samples/po/el/hello_tk.po +1 -1
  304. data/samples/po/eo/hello.po +2 -2
  305. data/samples/po/eo/hello2.po +1 -1
  306. data/samples/po/eo/hello_glade2.po +1 -1
  307. data/samples/po/eo/{hello_gtk.po → hello_gtk2.po} +1 -1
  308. data/samples/po/eo/hello_noop.po +1 -1
  309. data/samples/po/eo/hello_plural.po +1 -1
  310. data/samples/po/eo/hello_tk.po +1 -1
  311. data/samples/po/es/{hello_gtk.po → hello_gtk2.po} +0 -0
  312. data/samples/po/fr/{hello_gtk.po → hello_gtk2.po} +0 -0
  313. data/samples/po/hello.pot +13 -13
  314. data/samples/po/hello2.pot +17 -17
  315. data/samples/po/hello_glade2.pot +12 -13
  316. data/{test/pot/backslash.pot → samples/po/hello_gtk2.pot} +8 -6
  317. data/samples/po/hello_noop.pot +13 -13
  318. data/samples/po/hello_plural.pot +14 -15
  319. data/samples/po/hello_tk.pot +9 -10
  320. data/samples/po/hr/hello.po +2 -2
  321. data/samples/po/hr/hello2.po +1 -1
  322. data/samples/po/hr/hello_glade2.po +1 -1
  323. data/samples/po/hr/{hello_gtk.po → hello_gtk2.po} +1 -1
  324. data/samples/po/hr/hello_noop.po +1 -1
  325. data/samples/po/hr/hello_plural.po +1 -1
  326. data/samples/po/hr/hello_tk.po +1 -1
  327. data/samples/po/hu/hello.po +2 -2
  328. data/samples/po/hu/hello2.po +1 -1
  329. data/samples/po/hu/hello_glade2.po +1 -1
  330. data/samples/po/hu/{hello_gtk.po → hello_gtk2.po} +1 -1
  331. data/samples/po/hu/hello_noop.po +1 -1
  332. data/samples/po/hu/hello_plural.po +1 -1
  333. data/samples/po/hu/hello_tk.po +1 -1
  334. data/samples/po/it/hello.po +1 -1
  335. data/samples/po/it/{hello_gtk.po → hello_gtk2.po} +0 -0
  336. data/samples/po/ja/{hello_gtk.po → hello_gtk2.po} +0 -0
  337. data/samples/po/ko/{hello_gtk.po → hello_gtk2.po} +0 -0
  338. data/samples/po/ko/hello_plural.po +1 -1
  339. data/samples/po/lv/hello.po +2 -2
  340. data/samples/po/lv/hello2.po +1 -1
  341. data/samples/po/lv/hello_glade2.po +1 -1
  342. data/samples/po/lv/{hello_gtk.po → hello_gtk2.po} +1 -1
  343. data/samples/po/lv/hello_noop.po +1 -1
  344. data/samples/po/lv/hello_plural.po +1 -1
  345. data/samples/po/lv/hello_tk.po +1 -1
  346. data/samples/po/nb/hello.po +2 -2
  347. data/samples/po/nb/hello2.po +1 -1
  348. data/samples/po/nb/hello_glade2.po +1 -1
  349. data/samples/po/nb/{hello_gtk.po → hello_gtk2.po} +1 -1
  350. data/samples/po/nb/hello_noop.po +1 -1
  351. data/samples/po/nb/hello_plural.po +1 -1
  352. data/samples/po/nb/hello_tk.po +1 -1
  353. data/samples/po/nl/hello.po +2 -2
  354. data/samples/po/nl/hello2.po +1 -1
  355. data/samples/po/nl/hello_glade2.po +1 -1
  356. data/samples/po/nl/{hello_gtk.po → hello_gtk2.po} +1 -1
  357. data/samples/po/nl/hello_noop.po +1 -1
  358. data/samples/po/nl/hello_plural.po +1 -1
  359. data/samples/po/nl/hello_tk.po +1 -1
  360. data/samples/po/pt_BR/{hello_gtk.po → hello_gtk2.po} +0 -0
  361. data/samples/po/ru/hello.po +2 -2
  362. data/samples/po/ru/hello2.po +1 -1
  363. data/samples/po/ru/hello_glade2.po +1 -1
  364. data/samples/po/ru/{hello_gtk.po → hello_gtk2.po} +1 -1
  365. data/samples/po/ru/hello_noop.po +1 -1
  366. data/samples/po/ru/hello_plural.po +1 -1
  367. data/samples/po/ru/hello_tk.po +1 -1
  368. data/samples/po/sr/hello.po +2 -2
  369. data/samples/po/sr/hello2.po +1 -1
  370. data/samples/po/sr/hello_glade2.po +1 -1
  371. data/samples/po/sr/{hello_gtk.po → hello_gtk2.po} +1 -1
  372. data/samples/po/sr/hello_noop.po +1 -1
  373. data/samples/po/sr/hello_plural.po +1 -1
  374. data/samples/po/sr/hello_tk.po +1 -1
  375. data/samples/po/sv/{hello_gtk.po → hello_gtk2.po} +0 -0
  376. data/samples/po/uk/hello.po +2 -2
  377. data/samples/po/uk/hello2.po +1 -1
  378. data/samples/po/uk/hello_glade2.po +1 -1
  379. data/samples/po/uk/{hello_gtk.po → hello_gtk2.po} +1 -1
  380. data/samples/po/uk/hello_noop.po +1 -1
  381. data/samples/po/uk/hello_plural.po +1 -1
  382. data/samples/po/uk/hello_tk.po +1 -1
  383. data/samples/po/vi/hello.po +2 -2
  384. data/samples/po/vi/hello2.po +1 -1
  385. data/samples/po/vi/hello_glade2.po +1 -1
  386. data/samples/po/vi/{hello_gtk.po → hello_gtk2.po} +1 -1
  387. data/samples/po/vi/hello_noop.po +1 -1
  388. data/samples/po/vi/hello_plural.po +1 -1
  389. data/samples/po/vi/hello_tk.po +1 -1
  390. data/samples/po/zh/hello.po +2 -2
  391. data/samples/po/zh/hello2.po +1 -1
  392. data/samples/po/zh/hello_glade2.po +1 -1
  393. data/samples/po/zh/{hello_gtk.po → hello_gtk2.po} +1 -1
  394. data/samples/po/zh/hello_noop.po +1 -1
  395. data/samples/po/zh/hello_plural.po +1 -1
  396. data/samples/po/zh/hello_tk.po +1 -1
  397. data/samples/po/zh_TW/hello.po +2 -2
  398. data/samples/po/zh_TW/hello2.po +1 -1
  399. data/samples/po/zh_TW/hello_glade2.po +1 -1
  400. data/samples/po/zh_TW/{hello_gtk.po → hello_gtk2.po} +1 -1
  401. data/samples/po/zh_TW/hello_noop.po +1 -1
  402. data/samples/po/zh_TW/hello_plural.po +1 -1
  403. data/samples/po/zh_TW/hello_tk.po +1 -1
  404. data/src/poparser.ry +18 -14
  405. data/test/{testlib → fixtures}/N_.rb +0 -0
  406. data/test/{testlib/gettext.rb → fixtures/_.rb} +27 -1
  407. data/test/fixtures/_/one_line.rb +32 -0
  408. data/test/fixtures/backslash.rb +29 -0
  409. data/test/{testlib → fixtures}/erb.rhtml +0 -0
  410. data/test/{testlib → fixtures}/erb.rxml +0 -0
  411. data/test/{testlib → fixtures}/gladeparser.glade +0 -0
  412. data/test/{testlib → fixtures}/multi_textdomain.rb +0 -0
  413. data/test/{testlib/ngettext.rb → fixtures/n_.rb} +20 -1
  414. data/test/{testlib → fixtures}/non_ascii.rb +0 -0
  415. data/test/fixtures/np_.rb +51 -0
  416. data/test/{testlib/nsgettext.rb → fixtures/ns_.rb} +20 -2
  417. data/test/fixtures/ns_/custom.rb +32 -0
  418. data/test/fixtures/p_.rb +57 -0
  419. data/test/fixtures/s_.rb +66 -0
  420. data/test/fixtures/s_/custom.rb +32 -0
  421. data/test/{testlib → fixtures}/simple.rb +0 -0
  422. data/test/gettext-test-utils.rb +44 -0
  423. data/test/locale/ja/LC_MESSAGES/_.mo +0 -0
  424. data/test/locale/ja/LC_MESSAGES/backslash.mo +0 -0
  425. data/test/locale/ja/LC_MESSAGES/np_.mo +0 -0
  426. data/test/locale/ja/LC_MESSAGES/ns_.mo +0 -0
  427. data/test/locale/ja/LC_MESSAGES/p_.mo +0 -0
  428. data/test/locale/ja/LC_MESSAGES/s_.mo +0 -0
  429. data/test/parser/test_ruby.rb +121 -0
  430. data/test/po/_.pot +109 -0
  431. data/test/{pot/sgettext.pot → po/backslash.pot} +10 -4
  432. data/test/po/ja/_.po +114 -0
  433. data/test/po/ja/backslash.po +3 -3
  434. data/test/po/ja/non_ascii.po +1 -1
  435. data/test/po/ja/{npgettext.po → np_.po} +6 -6
  436. data/test/po/ja/{nsgettext.po → ns_.po} +16 -10
  437. data/test/po/ja/{pgettext.po → p_.po} +5 -5
  438. data/test/po/ja/{sgettext.po → s_.po} +0 -0
  439. data/test/{pot → po}/non_ascii.pot +7 -5
  440. data/test/{pot/npgettext.pot → po/np_.pot} +10 -9
  441. data/test/{pot/nsgettext.pot → po/ns_.pot} +20 -12
  442. data/test/{pot/pgettext.pot → po/p_.pot} +12 -10
  443. data/test/po/s_.pot +55 -0
  444. data/test/run-test.rb +5 -0
  445. data/test/test_class_info.rb +0 -1
  446. data/test/test_gettext.rb +49 -12
  447. data/test/test_locale_path.rb +1 -4
  448. data/test/test_mofile.rb +0 -1
  449. data/test/test_parser.rb +119 -88
  450. data/test/test_po_generation.rb +32 -9
  451. data/test/{test_pomessage.rb → test_po_message.rb} +18 -1
  452. data/test/test_po_parser.rb +117 -0
  453. data/test/test_string.rb +0 -2
  454. data/test/test_textdomain_bind.rb +0 -2
  455. data/test/test_textdomain_multi.rb +1 -2
  456. data/test/test_textdomain_toplevel.rb +0 -1
  457. data/test/test_thread.rb +0 -1
  458. data/test/tools/test_msginit.rb +351 -0
  459. data/test/tools/test_msgmerge.rb +202 -0
  460. data/test/tools/test_tools.rb +0 -2
  461. data/test/tools/test_xgettext.rb +154 -0
  462. metadata +822 -753
  463. data/bin/rgettext +0 -23
  464. data/data/locale/bg/LC_MESSAGES/rgettext.mo +0 -0
  465. data/data/locale/bs/LC_MESSAGES/rgettext.mo +0 -0
  466. data/data/locale/ca/LC_MESSAGES/rgettext.mo +0 -0
  467. data/data/locale/cs/LC_MESSAGES/rgettext.mo +0 -0
  468. data/data/locale/de/LC_MESSAGES/rgettext.mo +0 -0
  469. data/data/locale/el/LC_MESSAGES/rgettext.mo +0 -0
  470. data/data/locale/eo/LC_MESSAGES/rgettext.mo +0 -0
  471. data/data/locale/es/LC_MESSAGES/rgettext.mo +0 -0
  472. data/data/locale/et/LC_MESSAGES/rgettext.mo +0 -0
  473. data/data/locale/fr/LC_MESSAGES/rgettext.mo +0 -0
  474. data/data/locale/hr/LC_MESSAGES/rgettext.mo +0 -0
  475. data/data/locale/hu/LC_MESSAGES/rgettext.mo +0 -0
  476. data/data/locale/it/LC_MESSAGES/rgettext.mo +0 -0
  477. data/data/locale/ja/LC_MESSAGES/rgettext.mo +0 -0
  478. data/data/locale/ko/LC_MESSAGES/rgettext.mo +0 -0
  479. data/data/locale/lv/LC_MESSAGES/rgettext.mo +0 -0
  480. data/data/locale/nb/LC_MESSAGES/rgettext.mo +0 -0
  481. data/data/locale/nl/LC_MESSAGES/rgettext.mo +0 -0
  482. data/data/locale/pt_BR/LC_MESSAGES/rgettext.mo +0 -0
  483. data/data/locale/ru/LC_MESSAGES/rgettext.mo +0 -0
  484. data/data/locale/sr/LC_MESSAGES/rgettext.mo +0 -0
  485. data/data/locale/sv/LC_MESSAGES/rgettext.mo +0 -0
  486. data/data/locale/uk/LC_MESSAGES/rgettext.mo +0 -0
  487. data/data/locale/vi/LC_MESSAGES/rgettext.mo +0 -0
  488. data/data/locale/zh/LC_MESSAGES/rgettext.mo +0 -0
  489. data/data/locale/zh_TW/LC_MESSAGES/rgettext.mo +0 -0
  490. data/lib/gettext/tools/rgettext.rb +0 -251
  491. data/lib/gettext/tools/rmsgfmt.rb +0 -86
  492. data/lib/gettext/tools/rmsgmerge.rb +0 -500
  493. data/samples/makemo.rb +0 -6
  494. data/samples/po/hello_gtk.pot +0 -23
  495. data/samples/po/test.rb +0 -13
  496. data/test/testlib/backslash.rb +0 -12
  497. data/test/testlib/helper.rb +0 -13
  498. data/test/testlib/npgettext.rb +0 -33
  499. data/test/testlib/pgettext.rb +0 -38
  500. data/test/testlib/sgettext.rb +0 -48
data/bin/rxgettext ADDED
@@ -0,0 +1,24 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ # Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
5
+ # Copyright (C) 2005-2009 Masao Mutoh
6
+ #
7
+ # License: Ruby's or LGPL
8
+ #
9
+ # This library is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU Lesser General Public License as published by
11
+ # the Free Software Foundation, either version 3 of the License, or
12
+ # (at your option) any later version.
13
+ #
14
+ # This library is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # GNU Lesser General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU Lesser General Public License
20
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
21
+
22
+ require "gettext/tools/xgettext"
23
+
24
+ GetText::Tools::XGetText.run(*ARGV)
data/doc/text/news.md CHANGED
@@ -1,4 +1,64 @@
1
1
  # News
2
+ ## <a id="2-3-0">2.3.0</a>: 2012-08-28
3
+
4
+ Various improvements, changes and fixes release.
5
+
6
+ ### Improvements
7
+
8
+ * Improved TextDomain#translate\_singluar\_message performance.
9
+ [Base idea is provided by @angelf]
10
+ * Added msginit command.
11
+ * [xgettext] Added command line options for package name, version,
12
+ copyright holder and msgid bugs address.[Github#8]
13
+ [Reported by Francesco Poli (wintermute) and 375gnu, and patch by 375gnu]
14
+ * [xgettext] Supported s\_ and ns\_ with parameter.
15
+ * [poparser] Reported warnings when fuzzy message is used.
16
+ [Reported by Michael Grosser]
17
+ * Used %{...} to check the availability of String#% with hash and
18
+ raise Error if this syntax isn't supported.
19
+ * Searched mo files under LC_MESSAGES/ directory.
20
+ * Updated documents for tools.
21
+
22
+ ### Changes
23
+
24
+ * Renamed the package name from "Ruby-GetText-Package" to "gettext".
25
+ * Renamed RGetText to XGetText, RMsgMerge to MsgMerge, RMsgFmt to MsgFmt.
26
+ * Renamed rgettext to rxgettext, rmsgmerge to msgmerge, rmsgfmt to msgfmt.
27
+ * Defined tools(XGetText, MsgMerge, MsgFmt) as Class under GetText::Tools
28
+ module.
29
+ * Removed shortcuts for tools in GetText module.
30
+ Please use GetText::Tools:XXX.run instead of GetText.xxx.
31
+ * Changed API of tools.
32
+ e.g.) Before: GetText.rsmgfmt(targetfile, output\_path)
33
+ Now: GetText::Tools::MsgFmt.run(targetfile, "-o", output\_path)
34
+ * [xgettext] Used relative path for source path.
35
+ This path appears in generated pot file.
36
+ * [xgettext] Returned the pot header instead of "" as the translation of
37
+ "" msgid.
38
+ * [poparser] Treated not translated msgid when parsing po file.
39
+ A translation of no translated msgid is msgid itself even now.
40
+ * [xgettext] Removed descriptions of ruby in information by "-v" option.
41
+
42
+ ### Fixes
43
+
44
+ * Included msgctxt when generating .po file. [Patch by 3dd13]
45
+ * Fixed a typo in msgmerge. [Patch by Yves-Eric Martin]
46
+ * [msgmerge] Followed PoParser API change.
47
+ * [ruby-parser] Reseted the last comment when po message is stored.[Github#6]
48
+ [Reported by 375gnu and Francesco Poli (wintermute), and Patch by 375gnu]
49
+ * [ruby-parser] Processed RubyToken::TkDSTRING too.[Github#6]
50
+ [Reported by 375gnu and Francesco Poli (wintermute), and Patch by 375gnu]
51
+ * [msgmerge] Fixed not to add fuzzy to header message.
52
+ * [msgmerge] Escaped backslash and "\n".
53
+
54
+ ### Thanks
55
+
56
+ * @angelf
57
+ * Francesco Poli (wintermute)
58
+ * 375gnu
59
+ * Michael Grosser
60
+ * 3dd13
61
+ * Yves-Eric Martin
2
62
 
3
63
  ## <a id="2-2-0">2.2.0</a>: 2012-03-11
4
64
 
data/gettext.gemspec CHANGED
@@ -7,11 +7,11 @@ require "gettext/version"
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "gettext"
9
9
  s.version = GetText::VERSION
10
- s.summary = 'Ruby-GetText-Package is a libary and tools to localize messages.'
10
+ s.summary = 'Gettext is a pure Ruby libary and tools to localize messages.'
11
11
  s.description = <<-EOD
12
- Ruby-GetText-Package is a GNU GetText-like program for Ruby.
13
- The catalog file(po-file) is same format with GNU GetText.
14
- So you can use GNU GetText tools for maintaining.
12
+ Gettext is a GNU gettext-like program for Ruby.
13
+ The catalog file(po-file) is same format with GNU gettext.
14
+ So you can use GNU gettext tools for maintaining.
15
15
  EOD
16
16
  s.authors = ["Kouhei Sutou", "Masao Mutoh"]
17
17
  s.email = ["kou@clear-code.com", "mutomasa at gmail.com"]
@@ -28,8 +28,11 @@ So you can use GNU GetText tools for maintaining.
28
28
  end
29
29
 
30
30
  s.add_runtime_dependency("locale")
31
+ s.add_development_dependency("rake")
31
32
  s.add_development_dependency("racc")
32
33
  s.add_development_dependency("yard")
34
+ s.add_development_dependency("redcarpet")
33
35
  s.add_development_dependency("test-unit")
34
36
  s.add_development_dependency("test-unit-notify")
37
+ s.add_development_dependency("test-unit-rr")
35
38
  end
data/lib/gettext.rb CHANGED
@@ -127,7 +127,7 @@ module GetText
127
127
  # * msgid: the message id.
128
128
  # * Returns: localized text by msgid. If there are not binded mo-file, it will return msgid.
129
129
  def gettext(msgid)
130
- TextDomainManager.translate_singluar_message(self, msgid)
130
+ TextDomainManager.translate_singular_message(self, msgid)
131
131
  end
132
132
 
133
133
  # call-seq:
@@ -144,7 +144,7 @@ module GetText
144
144
  # <tt>Movie|Location -> Location</tt>
145
145
  # See: http://www.gnu.org/software/gettext/manual/html_mono/gettext.html#SEC151
146
146
  def sgettext(msgid, seperator = "|")
147
- TextDomainManager.translate_singluar_message(self, msgid, seperator)
147
+ TextDomainManager.translate_singular_message(self, msgid, seperator)
148
148
  end
149
149
 
150
150
  # call-seq:
@@ -161,7 +161,7 @@ module GetText
161
161
  # it returns msgid.
162
162
  # See: http://www.gnu.org/software/autoconf/manual/gettext/Contexts.html
163
163
  def pgettext(msgctxt, msgid)
164
- TextDomainManager.translate_singluar_message(self, "#{msgctxt}\004#{msgid}", "\004")
164
+ TextDomainManager.translate_singular_message(self, "#{msgctxt}\004#{msgid}", "\004")
165
165
  end
166
166
 
167
167
  # call-seq:
@@ -21,7 +21,8 @@ class String
21
21
  end
22
22
 
23
23
  begin
24
- "%<key>" % {:key => "value"}
24
+ formatted = "%{key}" % {:key => "value"}
25
+ raise ArgumentError if formatted != "value"
25
26
  rescue ArgumentError
26
27
  alias :_old_format_m :% # :nodoc:
27
28
 
@@ -56,9 +56,11 @@ module GetText
56
56
  load_path.map!{|v| v.match(/(.*?)(\/lib)*?$/); $1}
57
57
  load_path.each {|path|
58
58
  default_path_rules += [
59
- "#{path}/data/locale/%{lang}/LC_MESSAGES/%{name}.mo",
60
- "#{path}/data/locale/%{lang}/%{name}.mo",
61
- "#{path}/locale/%{lang}/%{name}.mo"]
59
+ "#{path}/data/locale/%{lang}/LC_MESSAGES/%{name}.mo",
60
+ "#{path}/data/locale/%{lang}/%{name}.mo",
61
+ "#{path}/locale/%{lang}/LC_MESSAGES/%{name}.mo",
62
+ "#{path}/locale/%{lang}/%{name}.mo",
63
+ ]
62
64
  }
63
65
  # paths existed only.
64
66
  default_path_rules = default_path_rules.select{|path|
@@ -85,7 +87,7 @@ module GetText
85
87
  @locale_paths = {}
86
88
  path_rules.each do |rule|
87
89
  this_path_rules = rule % {:lang => "([^\/]+)", :name => name}
88
- Dir.glob(rule %{:lang => "*", :name => name}).each do |path|
90
+ Dir.glob(rule % {:lang => "*", :name => name}).each do |path|
89
91
  if /#{this_path_rules}/ =~ path
90
92
  @locale_paths[$1] = path.untaint unless @locale_paths[$1]
91
93
  end
@@ -67,8 +67,8 @@ module GetText
67
67
  # * lang: Locale::Tag::Simple's subclass.
68
68
  # * msgid: the original message.
69
69
  # * Returns: the translated string or nil.
70
- def translate_singluar_message(lang, msgid)
71
- return "" if msgid == "" or msgid.nil?
70
+ def translate_singular_message(lang, msgid)
71
+ return "" if msgid.nil?
72
72
 
73
73
  lang_key = lang.to_s
74
74
 
@@ -85,14 +85,19 @@ module GetText
85
85
  end
86
86
 
87
87
  msgstr = mofile[msgid]
88
- if msgstr and (msgstr.size > 0)
89
- msgstr
88
+ if not msgstr.nil?
89
+ if msgstr.empty?
90
+ nil
91
+ else
92
+ msgstr
93
+ end
90
94
  elsif msgid.include?("\000")
91
- # Check "aaa\000bbb" and show warning but return the singluar part.
95
+ # Check "aaa\000bbb" and show warning but return the singular part.
92
96
  ret = nil
93
97
  msgid_single = msgid.split("\000")[0]
98
+ msgid_single_prefix_re = /^#{Regexp.quote(msgid_single)}\000/
94
99
  mofile.each{|key, val|
95
- if key =~ /^#{Regexp.quote(msgid_single)}\000/
100
+ if key =~ msgid_single_prefix_re
96
101
  # Usually, this is not caused to make po-files from rgettext.
97
102
  warn %Q[Warning: n_("#{msgid_single}", "#{msgid.split("\000")[1]}") and n_("#{key.gsub(/\000/, '", "')}") are duplicated.]
98
103
  ret = val
@@ -102,8 +107,9 @@ module GetText
102
107
  ret
103
108
  else
104
109
  ret = nil
110
+ msgid_prefix_re = /^#{Regexp.quote(msgid)}\000/
105
111
  mofile.each{|key, val|
106
- if key =~ /^#{Regexp.quote(msgid)}\000/
112
+ if key =~ msgid_prefix_re
107
113
  ret = val.split("\000")[0]
108
114
  break
109
115
  end
@@ -122,7 +128,7 @@ module GetText
122
128
  # * Returns: the translated string as an Array ([[msgstr1, msgstr2, ...], cond]) or nil.
123
129
  def translate_plural_message(lang, msgid, msgid_plural) #:nodoc:
124
130
  key = msgid + "\000" + msgid_plural
125
- msg = translate_singluar_message(lang, key)
131
+ msg = translate_singular_message(lang, key)
126
132
  ret = nil
127
133
  if ! msg
128
134
  ret = nil
@@ -95,14 +95,14 @@ module GetText
95
95
  # * div: separator or nil.
96
96
  # * Returns: the localized text by msgid. If there are no localized text,
97
97
  # it returns a last part of msgid separeted "div".
98
- def translate_singluar_message(klass, msgid, div = nil)
98
+ def translate_singular_message(klass, msgid, div = nil)
99
99
  klass = ClassInfo.normalize_class(klass)
100
100
  key = [Locale.current, klass, msgid, div].hash
101
101
  msg = @@singular_message_cache[key]
102
102
  return msg if msg and @@cached
103
103
  # Find messages from related classes.
104
104
  each_textdomains(klass) do |textdomain, lang|
105
- msg = textdomain.translate_singluar_message(lang, msgid)
105
+ msg = textdomain.translate_singular_message(lang, msgid)
106
106
  break if msg
107
107
  end
108
108
 
@@ -116,7 +116,7 @@ module GetText
116
116
  @@singular_message_cache[key] = msg
117
117
  end
118
118
 
119
- # This function is similar to the get_singluar_message function
119
+ # This function is similar to the get_singular_message function
120
120
  # as it finds the message catalogs in the same way.
121
121
  # But it takes two extra arguments for plural form.
122
122
  # The msgid parameter must contain the singular form of the string to be converted.
@@ -0,0 +1,203 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
4
+ #
5
+ # License: Ruby's or LGPL
6
+ #
7
+ # This library is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # This library is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
+
20
+ require "gettext/tools"
21
+
22
+ module GetText
23
+ class Task
24
+ include GetText
25
+ include Rake::DSL
26
+
27
+ attr_accessor :locales, :po_base_directory, :mo_base_directory, :domain
28
+ attr_accessor :namespace_prefix, :files
29
+ def initialize(spec)
30
+ @spec = spec
31
+ @locales = []
32
+ @po_base_directory = "po"
33
+ @mo_base_directory = "."
34
+ @files = target_files
35
+ @domain = @spec.name
36
+ @namespace_prefix = nil
37
+ yield(self) if block_given?
38
+ @locales = detect_locales if @locales.empty?
39
+ raise("must set locales: #{inspect}") if @locales.empty?
40
+ define
41
+ end
42
+
43
+ private
44
+ def define
45
+ define_file_tasks
46
+ if namespace_prefix
47
+ namespace_recursive namespace_prefix do
48
+ define_named_tasks
49
+ end
50
+ else
51
+ define_named_tasks
52
+ end
53
+ end
54
+
55
+ def define_file_tasks
56
+ unless files.empty?
57
+ pot_dependencies = files.dup
58
+ unless File.exist?(po_base_directory)
59
+ directory po_base_directory
60
+ pot_dependencies << po_base_directory
61
+ end
62
+ file pot_file => pot_dependencies do
63
+ GetText::Tools::XGetText.run("--package-name", @spec.name,
64
+ "--package-version", @spec.version.to_s,
65
+ "--output", pot_file,
66
+ *files)
67
+ end
68
+ end
69
+
70
+ locales.each do |locale|
71
+ _po_file = po_file(locale)
72
+ unless files.empty?
73
+ po_dependencies = [pot_file]
74
+ _po_directory = po_directory(locale)
75
+ unless File.exist?(_po_directory)
76
+ directory _po_directory
77
+ po_dependencies << _po_directory
78
+ end
79
+ file _po_file => po_dependencies do
80
+ if File.exist?(_po_file)
81
+ GetText::Tools::MsgMerge.run(po_file(locale), pot_file,
82
+ "--output", _po_file)
83
+ else
84
+ GetText::Tools::MsgInit.run("--input", pot_file,
85
+ "--output", _po_file,
86
+ "--locale", locale.to_s)
87
+ end
88
+ end
89
+ end
90
+
91
+ mo_dependencies = [_po_file]
92
+ _mo_directory = mo_directory(locale)
93
+ unless File.exist?(_mo_directory)
94
+ directory _mo_directory
95
+ mo_dependencies << _mo_directory
96
+ end
97
+ _mo_file = mo_file(locale)
98
+ file _mo_file => mo_dependencies do
99
+ GetText::Tools::MsgFmt.run(_po_file, "--output", _mo_file)
100
+ end
101
+ end
102
+ end
103
+
104
+ def define_named_tasks
105
+ namespace :gettext do
106
+ namespace :pot do
107
+ desc "Create #{pot_file}"
108
+ task :create => pot_file
109
+ end
110
+
111
+ namespace :po do
112
+ update_tasks = []
113
+ @locales.each do |locale|
114
+ namespace locale do
115
+ desc "Update #{po_file(locale)}"
116
+ task :update => po_file(locale)
117
+ update_tasks << (current_scope + ["update"]).join(":")
118
+ end
119
+ end
120
+
121
+ desc "Update *.po"
122
+ task :update => update_tasks
123
+ end
124
+
125
+ namespace :mo do
126
+ update_tasks = []
127
+ @locales.each do |locale|
128
+ namespace locale do
129
+ desc "Update #{mo_file(locale)}"
130
+ task :update => mo_file(locale)
131
+ update_tasks << (current_scope + ["update"]).join(":")
132
+ end
133
+ end
134
+
135
+ desc "Update *.mo"
136
+ task :update => update_tasks
137
+ end
138
+ end
139
+
140
+ desc "Update *.mo"
141
+ task :gettext => (current_scope + ["gettext", "mo", "update"]).join(":")
142
+ end
143
+
144
+ def pot_file
145
+ File.join(po_base_directory, "#{domain}.pot")
146
+ end
147
+
148
+ def po_directory(locale)
149
+ File.join(po_base_directory, locale.to_s)
150
+ end
151
+
152
+ def po_file(locale)
153
+ File.join(po_directory(locale), "#{domain}.po")
154
+ end
155
+
156
+ def mo_directory(locale)
157
+ File.join(mo_base_directory, "locale", locale.to_s, "LC_MESSAGES")
158
+ end
159
+
160
+ def mo_file(locale)
161
+ File.join(mo_directory(locale), "#{domain}.mo")
162
+ end
163
+
164
+ def target_files
165
+ files = @spec.files.find_all do |file|
166
+ /\.(?:rb|erb|glade)/i =~ File.extname(file)
167
+ end
168
+ files += @spec.executables.collect do |executable|
169
+ "bin/#{executable}"
170
+ end
171
+ files
172
+ end
173
+
174
+ def detect_locales
175
+ locales = []
176
+ return locales unless File.exist?(po_base_directory)
177
+
178
+ Dir.open(po_base_directory) do |dir|
179
+ dir.each do |entry|
180
+ next unless /\A[a-z]{2}(?:_[A-Z]{2})?\z/ =~ entry
181
+ next unless File.directory?(File.join(dir.path, entry))
182
+ locales << entry
183
+ end
184
+ end
185
+ locales
186
+ end
187
+
188
+ def current_scope
189
+ Rake.application.current_scope
190
+ end
191
+
192
+ def namespace_recursive(namespace_spec, &block)
193
+ first, rest = namespace_spec.split(/:/, 2)
194
+ namespace first do
195
+ if rest.nil?
196
+ block.call
197
+ else
198
+ namespace_recursive(rest, &block)
199
+ end
200
+ end
201
+ end
202
+ end
203
+ end