gettext 2.2.1 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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