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/lib/gettext/tools.rb CHANGED
@@ -1,23 +1,34 @@
1
- # encoding: utf-8
2
-
3
- =begin
4
- tools.rb - Utility functions
5
-
6
- Copyright (C) 2005-2008 Masao Mutoh
7
-
8
- You may redistribute it and/or modify it under the same
9
- license terms as Ruby or LGPL.
10
- =end
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
4
+ # Copyright (C) 2005-2008 Masao Mutoh
5
+ #
6
+ # License: Ruby's or LGPL
7
+ #
8
+ # This library is free software: you can redistribute it and/or modify
9
+ # it under the terms of the GNU Lesser General Public License as published by
10
+ # the Free Software Foundation, either version 3 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # This library is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU Lesser General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU Lesser General Public License
19
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
11
20
 
12
21
  require 'rbconfig'
13
22
  if /mingw|mswin|mswin32/ =~ RUBY_PLATFORM
14
23
  ENV['PATH'] = %w(bin lib).collect{|dir|
15
- "#{Config::CONFIG["prefix"]}\\lib\\GTK\\#{dir};"
24
+ "#{::RbConfig::CONFIG["prefix"]}\\lib\\GTK\\#{dir};"
16
25
  }.join('') + ENV['PATH']
17
26
  end
18
27
 
19
- require 'gettext/tools/rgettext'
20
- require 'gettext/tools/rmsgfmt'
28
+ require 'gettext/tools/xgettext'
29
+ require 'gettext/tools/msgfmt'
30
+ require 'gettext/tools/msginit'
31
+ require 'gettext/tools/msgmerge'
21
32
  require 'gettext/runtime/mofile'
22
33
  require 'fileutils'
23
34
 
@@ -45,7 +56,7 @@ module GetText
45
56
  # but extracted comments and file positions will be discarded.
46
57
  #
47
58
  # The ref.pot file is the last created PO file with up-to-date source references but
48
- # old translations, or a PO Template file (generally created by rgettext);
59
+ # old translations, or a PO Template file (generally created by rxgettext);
49
60
  # any translations or comments in the file will be discarded, however dot
50
61
  # comments and file positions will be preserved. Where an exact match
51
62
  # cannot be found, fuzzy matching is used to produce better results.
@@ -95,21 +106,23 @@ module GetText
95
106
  mo_file = mo_file_from_po_file(po_file,options)
96
107
  $stderr.print %Q[#{po_file} -> #{mo_file} ... ] if options[:verbose]
97
108
  FileUtils.mkdir_p(File.dirname(mo_file))
98
- rmsgfmt(po_file, mo_file)
109
+ Tools::MsgFmt.run(po_file, "-o", mo_file)
99
110
  $stderr.puts "Done." if options[:verbose]
100
111
  end
101
112
  end
102
113
 
103
114
 
104
- # At first, this creates the #{po_root}/#{domainname}.pot file using GetText.rgettext.
105
- # In the second step, this updates(merges) the #{po_root}/#{domainname}.pot and all of the
106
- # #{po_root}/#{lang}/#{domainname}.po files under "po_root" using "msgmerge".
115
+ # At first, this creates the #{po_root}/#{domainname}.pot file using
116
+ # GetText::XGetText.run. In the second step, this updates(merges)
117
+ # the #{po_root}/#{domainname}.pot and all of the
118
+ # #{po_root}/#{lang}/#{domainname}.po files under "po_root" using
119
+ # "msgmerge".
107
120
  #
108
121
  # *Note* "msgmerge" tool is included in GNU GetText. So you need to install GNU GetText.
109
122
  #
110
123
  # See <HOWTO maintain po/mo files(http://www.yotabanana.com/hiki/ruby-gettext-howto-manage.html)> for more detals.
111
124
  # * domainname: the textdomain name.
112
- # * targetfiles: An Array of target files, that should be parsed for messages (See GetText.rgettext for more details).
125
+ # * targetfiles: An Array of target files, that should be parsed for messages (See GetText::XGetText.run for more details).
113
126
  # * app_version: the application information which appears "Project-Id-Version: #{app_version}" in the pot/po-files.
114
127
  # * options: a hash with following possible settings
115
128
  # :lang - update files only for one language - the language specified by this option
@@ -125,7 +138,7 @@ module GetText
125
138
 
126
139
  #write found messages to tmp.pot
127
140
  temp_pot = "tmp.pot"
128
- rgettext(files, temp_pot)
141
+ Tools::XGetText.run("-o", temp_pot, *files)
129
142
 
130
143
  #merge tmp.pot and existing pot
131
144
  po_root = options.delete(:po_root) || "po"
@@ -191,7 +204,3 @@ module GetText
191
204
  File.join(mo_dir, "#{textdomain}.mo")
192
205
  end
193
206
  end
194
-
195
- if __FILE__ == $0
196
- GetText.update_pofiles("foo", ARGV, "foo 1.1.0")
197
- end
@@ -0,0 +1,104 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
4
+ # Copyright (C) 2012 Haruka Yoshihara <yoshihara@clear-code.com>
5
+ # Copyright (C) 2003-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 "optparse"
23
+ require "fileutils"
24
+ require "gettext"
25
+ require "gettext/tools/poparser"
26
+
27
+ module GetText
28
+ module Tools
29
+ class MsgFmt #:nodoc:
30
+ # Create a mo-file from a target file(po-file).
31
+ # You must specify a path of a target file in arguments.
32
+ # If a path of a mo-file is not specified in arguments, a mo-file is
33
+ # created as "messages.mo" in the current directory.
34
+ # @param [Array<String>] arguments arguments for rmsgfmt.
35
+ # @return [void]
36
+ class << self
37
+ def run(*arguments)
38
+ new.run(*arguments)
39
+ end
40
+ end
41
+
42
+ include GetText
43
+
44
+ bindtextdomain("rgettext")
45
+
46
+ def initialize
47
+ @input_file = nil
48
+ @output_file = nil
49
+ end
50
+
51
+ def run(*options) # :nodoc:
52
+ initialize_arguments(*options)
53
+
54
+ parser = PoParser.new
55
+ data = MoFile.new
56
+
57
+ parser.parse_file(@input_file, data)
58
+ data.save_to_file(@output_file)
59
+ end
60
+
61
+ def initialize_arguments(*options) # :nodoc:
62
+ input_file, output_file = parse_commandline_options(*options)
63
+
64
+ if input_file.nil?
65
+ raise(ArgumentError, _("no input files specified."))
66
+ end
67
+
68
+ if output_file.nil?
69
+ output_file = "messages.mo"
70
+ end
71
+
72
+ @input_file = input_file
73
+ @output_file = output_file
74
+ end
75
+
76
+ def parse_commandline_options(*options)
77
+ output_file = nil
78
+
79
+ parser = OptionParser.new
80
+ parser.banner = _("Usage: %s input.po [-o output.mo]" % $0)
81
+ parser.separator("")
82
+ description = _("Generate binary message catalog from textual " +
83
+ "translation description.")
84
+ parser.separator(description)
85
+ parser.separator("")
86
+ parser.separator(_("Specific options:"))
87
+
88
+ parser.on("-o", "--output=FILE",
89
+ _("write output to specified file")) do |out|
90
+ output_file = out
91
+ end
92
+
93
+ parser.on_tail("--version", _("display version information and exit")) do
94
+ puts(VERSION)
95
+ exit(true)
96
+ end
97
+ parser.parse!(options)
98
+
99
+ input_file = options[0]
100
+ [input_file, output_file]
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,363 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2012 Haruka Yoshihara <yoshihara@clear-code.com>
4
+ # Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
5
+ #
6
+ # License: Ruby's or LGPL
7
+ #
8
+ # This library is free software: you can redistribute it and/or modify
9
+ # it under the terms of the GNU Lesser General Public License as published by
10
+ # the Free Software Foundation, either version 3 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # This library is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU Lesser General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU Lesser General Public License
19
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
20
+
21
+ require "gettext"
22
+ require "gettext/tools/poparser"
23
+ require "gettext/tools/msgmerge"
24
+ require "locale/info"
25
+ require "optparse"
26
+
27
+ module GetText
28
+ module Tools
29
+ class MsgInit
30
+ class Error < StandardError
31
+ end
32
+
33
+ class ArgumentError < Error
34
+ end
35
+
36
+ class ValidationError < Error
37
+ end
38
+
39
+ class << self
40
+ # Create a new .po file from initializing .pot file with user's
41
+ # environment and input.
42
+ # @param [Array<String>] arguments arguments for rmsginit.
43
+ # @return [void]
44
+ def run(*arguments)
45
+ new.run(*arguments)
46
+ end
47
+ end
48
+
49
+ include GetText
50
+
51
+ bindtextdomain("rgettext")
52
+
53
+ def initialize #:nodoc:
54
+ @input_file = nil
55
+ @output_file = nil
56
+ @locale = nil
57
+ @language = nil
58
+ @entry = nil
59
+ @comment = nil
60
+ @translator = nil
61
+ end
62
+
63
+ # Create .po file from .pot file, user's inputs and metadata.
64
+ # @param [Array] arguments the list of arguments for rmsginit
65
+ def run(*arguments)
66
+ parse_arguments(*arguments)
67
+ validate
68
+
69
+ parser = PoParser.new
70
+ parser.ignore_fuzzy = false
71
+ pot = parser.parse_file(@input_file,
72
+ GetText::Tools::MsgMerge::PoData.new)
73
+ po = replace_pot_header(pot)
74
+
75
+ File.open(@output_file, "w") do |f|
76
+ f.puts(po.generate_po)
77
+ end
78
+ end
79
+
80
+ private
81
+ VERSION = GetText::VERSION
82
+
83
+ def parse_arguments(*arguments) #:nodoc:
84
+ parser = OptionParser.new
85
+ description = _("Create a new .po file from initializing .pot " +
86
+ "file with user's environment and input.")
87
+ parser.separator(description)
88
+ parser.separator("")
89
+ parser.separator(_("Specific options:"))
90
+
91
+ input_description = _("Use INPUT as a .pot file. If INPUT is not " +
92
+ "specified, INPUT is a .pot file existing " +
93
+ "the current directory.")
94
+ parser.on("-i", "--input=FILE", input_description) do |input|
95
+ @input_file = input
96
+ end
97
+
98
+ output_description = _("Use OUTPUT as a created .po file. If OUTPUT " +
99
+ "is not specified, OUTPUT depend on LOCALE " +
100
+ "or the current locale on your environment.")
101
+ parser.on("-o", "--output=OUTPUT", output_description) do |output|
102
+ @output_file = output
103
+ end
104
+
105
+ locale_description = _("Use LOCALE as target locale. If LOCALE is " +
106
+ "not specified, LOCALE is the current " +
107
+ "locale on your environment.")
108
+ parser.on("-l", "--locale=LOCALE", locale_description) do |loc|
109
+ @locale = loc
110
+ end
111
+
112
+ parser.on("-h", "--help", _("Dispray this help and exit")) do
113
+ puts(parser.help)
114
+ exit(true)
115
+ end
116
+
117
+ version_description = _("Display version and exit")
118
+ parser.on_tail("-v", "--version", version_description) do
119
+ puts(VERSION)
120
+ exit(true)
121
+ end
122
+
123
+ begin
124
+ parser.parse!(arguments)
125
+ rescue OptionParser::ParseError
126
+ raise(ArgumentError, $!.message)
127
+ end
128
+ end
129
+
130
+ def validate
131
+ if @input_file.nil?
132
+ @input_file = Dir.glob("./*.pot").first
133
+ if @input_file.nil?
134
+ raise(ValidationError,
135
+ _(".pot file does not exist in the current directory."))
136
+ end
137
+ else
138
+ unless File.exist?(@input_file)
139
+ raise(ValidationError,
140
+ _("file #{@input_file} does not exist."))
141
+ end
142
+ end
143
+
144
+ if @locale.nil?
145
+ language_tag = Locale.current
146
+ else
147
+ language_tag = Locale::Tag.parse(@locale)
148
+ end
149
+
150
+ unless valid_locale?(language_tag)
151
+ raise(ValidationError,
152
+ _("Locale '#{language_tag}' is invalid. " +
153
+ "Please check if your specified locale is usable."))
154
+ end
155
+ @locale = language_tag.to_simple.to_s
156
+ @language = language_tag.language
157
+
158
+ @output_file ||= "#{@locale}.po"
159
+ if File.exist?(@output_file)
160
+ raise(ValidationError,
161
+ _("file #{@output_file} has already existed."))
162
+ end
163
+ end
164
+
165
+ def valid_locale?(language_tag)
166
+ return false if language_tag.instance_of?(Locale::Tag::Irregular)
167
+
168
+ Locale::Info.language_code?(language_tag.language)
169
+ end
170
+
171
+ def replace_pot_header(pot) #:nodoc:
172
+ @entry = pot[""]
173
+ @comment = pot.comment("")
174
+ @translator = translator_info
175
+
176
+ replace_entry
177
+ replace_comment
178
+
179
+ pot[""] = @entry.chomp
180
+ pot.set_comment("", @comment)
181
+ pot
182
+ end
183
+
184
+ def translator_info
185
+ full_name = translator_full_name
186
+ mail = translator_mail
187
+ if not full_name.nil? and not mail.nil?
188
+ "#{full_name} <#{mail}>"
189
+ else
190
+ nil
191
+ end
192
+ end
193
+
194
+ def translator_full_name
195
+ read_translator_full_name
196
+ end
197
+
198
+ def read_translator_full_name #:nodoc:
199
+ prompt(_("Please enter your full name"), guess_full_name)
200
+ end
201
+
202
+ def guess_full_name
203
+ ENV["USERNAME"]
204
+ end
205
+
206
+ def translator_mail
207
+ read_translator_mail
208
+ end
209
+
210
+ def read_translator_mail #:nodoc:
211
+ prompt(_("Please enter your email address"), guess_mail)
212
+ end
213
+
214
+ def guess_mail
215
+ ENV["EMAIL"]
216
+ end
217
+
218
+ def prompt(message, default)
219
+ print(message)
220
+ print(" [#{default}]") if default
221
+ print(": ")
222
+
223
+ user_input = $stdin.gets.chomp
224
+ if user_input.empty?
225
+ default
226
+ else
227
+ user_input
228
+ end
229
+ end
230
+
231
+ def replace_entry
232
+ replace_last_translator
233
+ replace_pot_revision_date
234
+ replace_language
235
+ replace_plural_forms
236
+ end
237
+
238
+ def replace_comment
239
+ replace_description
240
+ replace_first_author
241
+ replace_copyright_year
242
+ @comment = @comment.gsub(/#, fuzzy/, "")
243
+ end
244
+
245
+ EMAIL = "EMAIL@ADDRESS"
246
+ FIRST_AUTHOR_KEY = /^(\s*#\s*) FIRST AUTHOR <#{EMAIL}>, (\d+\.)$/
247
+
248
+ def replace_last_translator #:nodoc:
249
+ unless @translator.nil?
250
+ @entry = @entry.gsub(LAST_TRANSLATOR_KEY, "\\1 #{@translator}")
251
+ end
252
+ end
253
+
254
+ POT_REVISION_DATE_KEY = /^(PO-Revision-Date:).+/
255
+
256
+ def replace_pot_revision_date #:nodoc:
257
+ date = Time.now
258
+ revision_date = date.strftime("%Y-%m-%d %H:%M%z")
259
+
260
+ @entry = @entry.gsub(POT_REVISION_DATE_KEY,
261
+ "\\1 #{revision_date}")
262
+ end
263
+
264
+ LANGUAGE_KEY = /^(Language:).+/
265
+ LANGUAGE_TEAM_KEY = /^(Language-Team:).+/
266
+
267
+ def replace_language #:nodoc:
268
+ language_name = Locale::Info.get_language(@language).name
269
+ @entry = @entry.gsub(LANGUAGE_KEY, "\\1 #{@locale}")
270
+ @entry = @entry.gsub(LANGUAGE_TEAM_KEY, "\\1 #{language_name}")
271
+ end
272
+
273
+ PLURAL_FORMS =
274
+ /^(Plural-Forms:) nplurals=INTEGER; plural=EXPRESSION;$/
275
+
276
+ def replace_plural_forms #:nodoc:
277
+ @entry = @entry.gsub(PLURAL_FORMS, "\\1 #{plural_forms(@language)}")
278
+ end
279
+
280
+ def plural_forms(language) #:nodoc:
281
+ case language
282
+ when "ja", "vi", "ko"
283
+ nplural = "1"
284
+ plural_expression = "0"
285
+ when "en", "de", "nl", "sv", "da", "no", "fo", "es", "pt",
286
+ "it", "bg", "el", "fi", "et", "he", "eo", "hu", "tr"
287
+ nplural = "2"
288
+ plural_expression = "n != 1"
289
+ when "pt_BR", "fr"
290
+ nplural = "2"
291
+ plural_expression = "n>1"
292
+ when "lv"
293
+ nplural = "3"
294
+ plural_expression = "n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2"
295
+ when "ga"
296
+ nplural = "3"
297
+ plural_expression = "n==1 ? 0 : n==2 ? 1 : 2"
298
+ when "ro"
299
+ nplural = "3"
300
+ plural_expression = "n==1 ? 0 : " +
301
+ "(n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2"
302
+ when "lt"
303
+ nplural = "3"
304
+ plural_expression = "n%10==1 && n%100!=11 ? 0 : " +
305
+ "n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2"
306
+ when "ru", "uk", "sr", "hr"
307
+ nplural = "3"
308
+ plural_expression = "n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +
309
+ "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2"
310
+ when "cs", "sk"
311
+ nplural = "3"
312
+ plural_expression = "(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2"
313
+ when "pl"
314
+ nplural = "3"
315
+ plural_expression = "n==1 ? 0 : n%10>=2 && " +
316
+ "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2"
317
+ when "sl"
318
+ nplural = "4"
319
+ plural_expression = "n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 " +
320
+ "|| n%100==4 ? 2 : 3"
321
+ else
322
+ nplural = nil
323
+ plural_expression = nil
324
+ end
325
+
326
+ "nplurals=#{nplural}; plural=#{plural_expression};"
327
+ end
328
+
329
+ DESCRIPTION_TITLE = /^(\s*#\s*) SOME DESCRIPTIVE TITLE\.$/
330
+
331
+ def replace_description #:nodoc:
332
+ language_name = Locale::Info.get_language(@language).name
333
+ package_name = ""
334
+ @entry.gsub(/Project-Id-Version: (.+?) .+/) do
335
+ package_name = $1
336
+ end
337
+ description = "#{language_name} translations " +
338
+ "for #{package_name} package."
339
+ @comment = @comment.gsub(DESCRIPTION_TITLE, "\\1 #{description}")
340
+ end
341
+
342
+ YEAR_KEY = /^(\s*#\s* FIRST AUTHOR <#{EMAIL}>,) YEAR\.$/
343
+ LAST_TRANSLATOR_KEY = /^(Last-Translator:) FULL NAME <#{EMAIL}>$/
344
+
345
+ def replace_first_author #:nodoc:
346
+ year = Time.now.year
347
+
348
+ @comment = @comment.gsub(YEAR_KEY, "\\1 #{year}.")
349
+ unless @translator.nil?
350
+ @comment = @comment.gsub(FIRST_AUTHOR_KEY,
351
+ "\\1 #{@translator}, \\2")
352
+ end
353
+ end
354
+
355
+ COPYRIGHT_KEY = /(\s*#\s* Copyright \(C\)) YEAR (THE PACKAGE'S COPYRIGHT HOLDER)$/
356
+ def replace_copyright_year #:nodoc:
357
+ date = Time.now
358
+
359
+ @comment = @comment.gsub(COPYRIGHT_KEY, "\\1 #{date.year} \\2")
360
+ end
361
+ end
362
+ end
363
+ end