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
@@ -1,17 +1,40 @@
1
- # encoding: utf-8
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) 2010 masone (Christian Felder) <ema@rh-productions.ch>
6
+ # Copyright (C) 2009 Masao Mutoh
7
+ # Copyright (C) 2009 Vladimir Dobriakov <vladimir@geekq.net>
8
+ #
9
+ # License: Ruby's or LGPL
10
+ #
11
+ # This library is free software: you can redistribute it and/or modify
12
+ # it under the terms of the GNU Lesser General Public License as published by
13
+ # the Free Software Foundation, either version 3 of the License, or
14
+ # (at your option) any later version.
15
+ #
16
+ # This library is distributed in the hope that it will be useful,
17
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ # GNU Lesser General Public License for more details.
20
+ #
21
+ # You should have received a copy of the GNU Lesser General Public License
22
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
2
23
 
3
- require 'testlib/helper.rb'
4
24
  require 'gettext'
5
- require 'gettext/tools/rgettext.rb'
6
- require 'stringio'
25
+ require 'gettext/tools/xgettext.rb'
7
26
 
8
27
  class TestPoGeneration < Test::Unit::TestCase
9
28
  def test_extracted_comments
10
- GetText::RGetText.run(
11
- File.join(File.dirname(__FILE__), 'testlib/gettext.rb'),
12
- out = StringIO.new)
13
- res = out.string
14
-
29
+ input_file = File.join(File.dirname(__FILE__), 'fixtures/_.rb')
30
+ res = ""
31
+ Dir.mktmpdir do |dir|
32
+ Dir.chdir(dir) do
33
+ out = "comments.pot"
34
+ GetText::Tools::XGetText.run(input_file, "-o", out)
35
+ res = File.read(out)
36
+ end
37
+ end
15
38
  # Use following to debug the content of the
16
39
  # created file: File.open('/tmp/test.po', 'w').write(res)
17
40
 
@@ -1,6 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'testlib/helper.rb'
4
3
  require 'gettext/tools/parser/ruby'
5
4
 
6
5
  # Most functionality of PoMessage is thoroughly tested together
@@ -98,4 +97,22 @@ class TestPoMessage < Test::Unit::TestCase
98
97
  po.sources = ["file1:1", "file2:10"]
99
98
  assert_raise(RuntimeError){ po.to_po_str }
100
99
  end
100
+
101
+ class TestEscape < self
102
+ def setup
103
+ @message = GetText::PoMessage.new(:normal)
104
+ end
105
+
106
+ def test_backslash
107
+ @message.msgid = "You should escape '\\' as '\\\\'."
108
+ assert_equal("You should escape '\\\\' as '\\\\\\\\'.",
109
+ @message.escaped(:msgid))
110
+ end
111
+
112
+ def test_new_line
113
+ @message.msgid = "First\nSecond\nThird"
114
+ assert_equal("First\\nSecond\\nThird",
115
+ @message.escaped(:msgid))
116
+ end
117
+ end
101
118
  end
@@ -0,0 +1,117 @@
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
+ #
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/tools/poparser"
22
+
23
+ class TestPoParser < Test::Unit::TestCase
24
+ def test_msgstr_not_existing
25
+ po_file = create_po_file(<<-EOP)
26
+ msgid "Hello"
27
+ msgstr ""
28
+ EOP
29
+ messages = parse_po_file(po_file)
30
+
31
+ assert_equal("", messages["Hello"])
32
+ end
33
+
34
+ private
35
+ def create_po_file(content)
36
+ po_file = Tempfile.new("hello.po")
37
+ po_file.print(content)
38
+ po_file.close
39
+ po_file
40
+ end
41
+
42
+ def parse_po_file(po_file)
43
+ parser = GetText::PoParser.new
44
+ parser.parse_file(po_file.path, MoFile.new)
45
+ end
46
+
47
+ class FuzzyTest < self
48
+ def setup
49
+ @po = <<-EOP
50
+ #, fuzzy
51
+ msgid "Hello"
52
+ msgstr "Bonjour"
53
+ EOP
54
+ @po_file = Tempfile.new("hello.po")
55
+ @po_file.print(@po)
56
+ @po_file.close
57
+ end
58
+
59
+ class IgnoreTest < self
60
+ def test_report_warning
61
+ mock($stderr).print("Warning: fuzzy message was ignored.\n")
62
+ mock($stderr).print(" #{@po_file.path}: msgid 'Hello'\n")
63
+ messages = parse do |parser|
64
+ parser.ignore_fuzzy = true
65
+ parser.report_warning = true
66
+ end
67
+ assert_nil(messages["Hello"])
68
+ end
69
+
70
+ def test_not_report_warning
71
+ dont_allow($stderr).print("Warning: fuzzy message was ignored.\n")
72
+ dont_allow($stderr).print(" #{@po_file.path}: msgid 'Hello'\n")
73
+ messages = parse do |parser|
74
+ parser.ignore_fuzzy = true
75
+ parser.report_warning = false
76
+ end
77
+ assert_nil(messages["Hello"])
78
+ end
79
+ end
80
+
81
+ class NotIgnore < self
82
+ def test_report_warning
83
+ mock($stderr).print("Warning: fuzzy message was used.\n")
84
+ mock($stderr).print(" #{@po_file.path}: msgid 'Hello'\n")
85
+ messages = parse do |parser|
86
+ parser.ignore_fuzzy = false
87
+ parser.report_warning = true
88
+ end
89
+ assert_equal("Bonjour", messages["Hello"])
90
+ end
91
+
92
+ def test_not_report_warning
93
+ dont_allow($stderr).print("Warning: fuzzy message was used.\n")
94
+ dont_allow($stderr).print(" #{@po_file.path}: msgid 'Hello'\n")
95
+ messages = parse do |parser|
96
+ parser.ignore_fuzzy = false
97
+ parser.report_warning = false
98
+ end
99
+ assert_equal("Bonjour", messages["Hello"])
100
+ end
101
+ end
102
+
103
+ private
104
+ def parse
105
+ parser = GetText::PoParser.new
106
+ class << parser
107
+ def _(message_id)
108
+ message_id
109
+ end
110
+ end
111
+ messages = MoFile.new
112
+ yield parser
113
+ parser.parse_file(@po_file.path, messages)
114
+ messages
115
+ end
116
+ end
117
+ end
data/test/test_string.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'testlib/helper.rb'
4
-
5
3
  class TestGetTextString < Test::Unit::TestCase
6
4
  class TestFormat < self
7
5
  def test_basic
@@ -1,7 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'testlib/helper.rb'
4
-
5
3
  class Foo
6
4
  end
7
5
 
@@ -1,7 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'testlib/helper.rb'
4
- require 'testlib/multi_textdomain.rb'
3
+ require 'fixtures/multi_textdomain.rb'
5
4
 
6
5
  class TestGetTextMulti < Test::Unit::TestCase
7
6
  include MultiTextDomain
@@ -1,6 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'testlib/helper.rb'
4
3
  include GetText
5
4
 
6
5
  bindtextdomain("test1", :path => "locale")
data/test/test_thread.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'testlib/helper.rb'
4
3
  require 'thread'
5
4
 
6
5
  class TestThread < Test::Unit::TestCase
@@ -0,0 +1,351 @@
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/tools/msginit"
22
+
23
+ class TestToolsMsgInit < Test::Unit::TestCase
24
+ def setup
25
+ @msginit = GetText::Tools::MsgInit.new
26
+ stub(@msginit).read_translator_full_name {translator_full_name}
27
+ stub(@msginit).read_translator_mail {translator_mail}
28
+
29
+ Locale.current = "ja_JP.UTF-8"
30
+ @pot_create_date = "2012-08-24 11:35+0900"
31
+ @po_revision_date = Time.now.strftime("%Y-%m-%d %H:%M%z")
32
+ end
33
+
34
+ def test_all_options
35
+ Dir.mktmpdir do |dir|
36
+ pot_file_path = File.join(dir, "test.pot")
37
+ create_pot_file(pot_file_path)
38
+ po_file_path = File.join(dir, "test.po")
39
+ locale = "en"
40
+ language = locale
41
+
42
+ @msginit.run("--input", pot_file_path,
43
+ "--output", po_file_path,
44
+ "--locale", locale)
45
+
46
+ actual_po_header = normalize_po_header(po_file_path)
47
+ expected_po_header = po_header(locale, language)
48
+ assert_equal(expected_po_header, actual_po_header)
49
+ end
50
+ end
51
+
52
+ def test_locale_including_language
53
+ Dir.mktmpdir do |dir|
54
+ Dir.chdir(dir) do
55
+ create_pot_file("test.pot")
56
+ locale = "en"
57
+ language = locale
58
+ po_file_path = "#{locale}.po"
59
+
60
+ @msginit.run("--locale", locale)
61
+
62
+ actual_po_header = normalize_po_header(po_file_path)
63
+ expected_po_header = po_header(locale, language)
64
+ assert_equal(expected_po_header, actual_po_header)
65
+ end
66
+ end
67
+ end
68
+
69
+ def test_locale_including_language_and_region
70
+ Dir.mktmpdir do |dir|
71
+ Dir.chdir(dir) do
72
+ create_pot_file("test.pot")
73
+ locale = "en_US"
74
+ language = "en"
75
+ po_file_path = "#{locale}.po"
76
+
77
+ @msginit.run("--locale", locale)
78
+
79
+ actual_po_header = normalize_po_header(po_file_path)
80
+ expected_po_header = po_header(locale, language)
81
+ assert_equal(expected_po_header, actual_po_header)
82
+ end
83
+ end
84
+ end
85
+
86
+ def test_locale_including_language_and_region_with_charset
87
+ Dir.mktmpdir do |dir|
88
+ Dir.chdir(dir) do
89
+ create_pot_file("test.pot")
90
+ locale = "en_US"
91
+ language = "en"
92
+ charset = "UTF-8"
93
+ po_file_path = "en_US.po"
94
+
95
+ @msginit.run("--locale", "#{locale}.#{charset}")
96
+
97
+ actual_po_header = normalize_po_header(po_file_path)
98
+ expected_po_header = po_header(locale, language)
99
+ assert_equal(expected_po_header, actual_po_header)
100
+ end
101
+ end
102
+ end
103
+
104
+ def test_pot_file_and_po_file
105
+ Dir.mktmpdir do |dir|
106
+ pot_file_path = File.join(dir, "test.pot")
107
+ create_pot_file(pot_file_path)
108
+ locale = current_locale
109
+ language = current_language
110
+ po_file_path = File.join(dir, "test.po")
111
+
112
+ @msginit.run("--input", pot_file_path, "--output", po_file_path)
113
+
114
+ actual_po_header = normalize_po_header(po_file_path)
115
+ expected_po_header = po_header(locale, language)
116
+ assert_equal(expected_po_header, actual_po_header)
117
+ end
118
+ end
119
+
120
+ def test_pot_file
121
+ Dir.mktmpdir do |dir|
122
+ Dir.chdir(dir) do
123
+ pot_file_path = "test.pot"
124
+ create_pot_file(pot_file_path)
125
+ locale = current_locale
126
+ language = current_language
127
+ po_file_path = "#{locale}.po"
128
+
129
+ @msginit.run("--input", pot_file_path)
130
+
131
+ actual_po_header = normalize_po_header(po_file_path)
132
+ expected_po_header = po_header(locale, language)
133
+ assert_equal(expected_po_header, actual_po_header)
134
+ end
135
+ end
136
+ end
137
+
138
+ def test_no_options
139
+ Dir.mktmpdir do |dir|
140
+ Dir.chdir(dir) do
141
+ create_pot_file("test.pot")
142
+ locale = current_locale
143
+ language = current_language
144
+ po_file_path = "#{locale}.po"
145
+
146
+ @msginit.run
147
+
148
+ actual_po_header = normalize_po_header(po_file_path)
149
+ expected_po_header = po_header(locale, language)
150
+ assert_equal(expected_po_header, actual_po_header)
151
+ end
152
+ end
153
+ end
154
+
155
+ def test_no_translator
156
+ stub(@msginit).read_translator_full_name {nil}
157
+ stub(@msginit).read_translator_mail {nil}
158
+
159
+ Dir.mktmpdir do |dir|
160
+ Dir.chdir(dir) do
161
+ create_pot_file("test.pot")
162
+ locale = current_locale
163
+ language = current_language
164
+ po_file_path = "#{locale}.po"
165
+
166
+ @msginit.run
167
+
168
+ actual_po_header = normalize_po_header(po_file_path)
169
+ expected_po_header = no_translator_po_header(locale, language)
170
+ assert_equal(expected_po_header, actual_po_header)
171
+ end
172
+ end
173
+ end
174
+
175
+ def test_no_translator_full_name
176
+ stub(@msginit).read_translator_full_name {nil}
177
+
178
+ Dir.mktmpdir do |dir|
179
+ Dir.chdir(dir) do
180
+ create_pot_file("test.pot")
181
+ locale = current_locale
182
+ language = current_language
183
+ po_file_path = "#{locale}.po"
184
+
185
+ @msginit.run
186
+
187
+ actual_po_header = normalize_po_header(po_file_path)
188
+ expected_po_header = no_translator_po_header(locale, language)
189
+ assert_equal(expected_po_header, actual_po_header)
190
+ end
191
+ end
192
+ end
193
+
194
+ def test_no_translator_mail
195
+ stub(@msginit).read_translator_mail {nil}
196
+
197
+ Dir.mktmpdir do |dir|
198
+ Dir.chdir(dir) do
199
+ create_pot_file("test.pot")
200
+ locale = current_locale
201
+ language = current_language
202
+ po_file_path = "#{locale}.po"
203
+
204
+ @msginit.run
205
+
206
+ actual_po_header = normalize_po_header(po_file_path)
207
+ expected_po_header = no_translator_po_header(locale, language)
208
+ assert_equal(expected_po_header, actual_po_header)
209
+ end
210
+ end
211
+ end
212
+
213
+ def test_package_name_specified_in_project_id_version
214
+ Dir.mktmpdir do |dir|
215
+ Dir.chdir(dir) do
216
+ pot_file_name = "test.pot"
217
+ options = {:package_name => "test-package"}
218
+ pot_file = create_pot_file(pot_file_name, options)
219
+ locale = current_locale
220
+ language = current_language
221
+ po_file_path = "#{locale}.po"
222
+
223
+ @msginit.run("--input", pot_file_name)
224
+
225
+ expected_po_header = po_header(locale, language, options)
226
+ actual_po_header = normalize_po_header(po_file_path)
227
+
228
+ assert_equal(expected_po_header, actual_po_header)
229
+ end
230
+ end
231
+ end
232
+
233
+ private
234
+ def current_locale
235
+ Locale.current.to_simple.to_s
236
+ end
237
+
238
+ def current_language
239
+ Locale.current.language
240
+ end
241
+
242
+ def translator_full_name
243
+ "me"
244
+ end
245
+
246
+ def translator_mail
247
+ "me@example.com"
248
+ end
249
+
250
+ def create_pot_file(path, options=nil)
251
+ options ||= {}
252
+ File.open(path, "w") do |pot_file|
253
+ pot_file.puts(pot_header(options))
254
+ end
255
+ end
256
+
257
+ def pot_header(options)
258
+ package_name = options[:package_name] || default_package_name
259
+ <<EOF
260
+ # SOME DESCRIPTIVE TITLE.
261
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
262
+ # This file is distributed under the same license as the PACKAGE package.
263
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
264
+ #
265
+ #, fuzzy
266
+ msgid ""
267
+ msgstr ""
268
+ "Project-Id-Version: #{package_name} VERSION\\n"
269
+ "POT-Creation-Date: #{@pot_create_date}\\n"
270
+ "PO-Revision-Date: #{@pot_create_date}\\n"
271
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n"
272
+ "Language: \\n"
273
+ "Language-Team: LANGUAGE <LL@li.org>\\n"
274
+ "MIME-Version: 1.0\\n"
275
+ "Content-Type: text/plain; charset=UTF-8\\n"
276
+ "Content-Transfer-Encoding: 8bit\\n"
277
+ "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"
278
+ EOF
279
+ end
280
+
281
+ def normalize_po_header(po_file_path)
282
+ po_file = ""
283
+ File.open(po_file_path) do |file|
284
+ po_file = file.read
285
+ end
286
+
287
+ po_file = po_file.gsub(/#{Regexp.escape(@pot_create_date)}/,
288
+ "XXXX-XX-XX XX:XX+XXXX")
289
+ po_file = po_file.gsub(/#{Regexp.escape(@po_revision_date)}/,
290
+ "YYYY-YY-YY YY:YY+YYYY")
291
+ po_file.gsub(/#{Time.now.year}/, "YEAR")
292
+ end
293
+
294
+ def po_header(locale, language, options=nil)
295
+ options ||= {}
296
+ package_name = options[:package_name] || default_package_name
297
+ full_name = translator_full_name
298
+ mail = translator_mail
299
+ language_name = Locale::Info.get_language(language).name
300
+ plural_forms = @msginit.send(:plural_forms, language)
301
+
302
+ <<EOF
303
+ # #{language_name} translations for #{package_name} package.
304
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
305
+ # This file is distributed under the same license as the PACKAGE package.
306
+ # #{full_name} <#{mail}>, YEAR.
307
+ #
308
+ msgid ""
309
+ msgstr ""
310
+ "Project-Id-Version: #{package_name} VERSION\\n"
311
+ "POT-Creation-Date: XXXX-XX-XX XX:XX+XXXX\\n"
312
+ "PO-Revision-Date: YYYY-YY-YY YY:YY+YYYY\\n"
313
+ "Last-Translator: #{full_name} <#{mail}>\\n"
314
+ "Language: #{locale}\\n"
315
+ "Language-Team: #{language_name}\\n"
316
+ "MIME-Version: 1.0\\n"
317
+ "Content-Type: text/plain; charset=UTF-8\\n"
318
+ "Content-Transfer-Encoding: 8bit\\n"
319
+ "Plural-Forms: #{plural_forms}\\n"
320
+ EOF
321
+ end
322
+
323
+ def default_package_name
324
+ "PACKAGE"
325
+ end
326
+
327
+ def no_translator_po_header(locale, language)
328
+ language_name = Locale::Info.get_language(language).name
329
+ plural_forms = @msginit.send(:plural_forms, language)
330
+
331
+ <<EOF
332
+ # #{language_name} translations for PACKAGE package.
333
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
334
+ # This file is distributed under the same license as the PACKAGE package.
335
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
336
+ #
337
+ msgid ""
338
+ msgstr ""
339
+ "Project-Id-Version: PACKAGE VERSION\\n"
340
+ "POT-Creation-Date: XXXX-XX-XX XX:XX+XXXX\\n"
341
+ "PO-Revision-Date: YYYY-YY-YY YY:YY+YYYY\\n"
342
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n"
343
+ "Language: #{locale}\\n"
344
+ "Language-Team: #{language_name}\\n"
345
+ "MIME-Version: 1.0\\n"
346
+ "Content-Type: text/plain; charset=UTF-8\\n"
347
+ "Content-Transfer-Encoding: 8bit\\n"
348
+ "Plural-Forms: #{plural_forms}\\n"
349
+ EOF
350
+ end
351
+ end