fair-gettext 2.0.1 → 2.0.2

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 (366) hide show
  1. data/COPYING +56 -0
  2. data/ChangeLog-1 +2016 -0
  3. data/NEWS-1 +414 -0
  4. data/benchmark/1.93.0.txt +8 -0
  5. data/benchmark/2.0.0.txt +8 -0
  6. data/benchmark/2.0.4.txt +11 -0
  7. data/benchmark/2.1.0.txt +11 -0
  8. data/benchmark/benchmark.rb +68 -0
  9. data/benchmark/test.rb +28 -0
  10. data/data/locale/bg/LC_MESSAGES/rgettext.mo +0 -0
  11. data/data/locale/bs/LC_MESSAGES/rgettext.mo +0 -0
  12. data/data/locale/ca/LC_MESSAGES/rgettext.mo +0 -0
  13. data/data/locale/cs/LC_MESSAGES/rgettext.mo +0 -0
  14. data/data/locale/de/LC_MESSAGES/rgettext.mo +0 -0
  15. data/data/locale/el/LC_MESSAGES/rgettext.mo +0 -0
  16. data/data/locale/eo/LC_MESSAGES/rgettext.mo +0 -0
  17. data/data/locale/es/LC_MESSAGES/rgettext.mo +0 -0
  18. data/data/locale/et/LC_MESSAGES/rgettext.mo +0 -0
  19. data/data/locale/fr/LC_MESSAGES/rgettext.mo +0 -0
  20. data/data/locale/hr/LC_MESSAGES/rgettext.mo +0 -0
  21. data/data/locale/hu/LC_MESSAGES/rgettext.mo +0 -0
  22. data/data/locale/it/LC_MESSAGES/rgettext.mo +0 -0
  23. data/data/locale/ja/LC_MESSAGES/rgettext.mo +0 -0
  24. data/data/locale/ko/LC_MESSAGES/rgettext.mo +0 -0
  25. data/data/locale/lv/LC_MESSAGES/rgettext.mo +0 -0
  26. data/data/locale/nb/LC_MESSAGES/rgettext.mo +0 -0
  27. data/data/locale/nl/LC_MESSAGES/rgettext.mo +0 -0
  28. data/data/locale/pt_BR/LC_MESSAGES/rgettext.mo +0 -0
  29. data/data/locale/ru/LC_MESSAGES/rgettext.mo +0 -0
  30. data/data/locale/sr/LC_MESSAGES/rgettext.mo +0 -0
  31. data/data/locale/sv/LC_MESSAGES/rgettext.mo +0 -0
  32. data/data/locale/ua/LC_MESSAGES/rgettext.mo +0 -0
  33. data/data/locale/vi/LC_MESSAGES/rgettext.mo +0 -0
  34. data/data/locale/zh/LC_MESSAGES/rgettext.mo +0 -0
  35. data/data/locale/zh_TW/LC_MESSAGES/rgettext.mo +0 -0
  36. data/gettext-2.0.0.gem +0 -0
  37. data/gettext.gemspec +2 -3
  38. data/lib/gettext/runtime/class_info.rb +67 -0
  39. data/lib/gettext/runtime/locale_path.rb +122 -0
  40. data/lib/gettext/runtime/mofile.rb +330 -0
  41. data/lib/gettext/runtime/textdomain.rb +177 -0
  42. data/lib/gettext/runtime/textdomain_group.rb +24 -0
  43. data/lib/gettext/runtime/textdomain_manager.rb +211 -0
  44. data/lib/gettext/tools.rb +38 -31
  45. data/lib/gettext/tools/parser/erb.rb +52 -0
  46. data/lib/gettext/tools/parser/glade.rb +98 -0
  47. data/lib/gettext/tools/parser/ruby.rb +226 -0
  48. data/lib/gettext/tools/pomessage.rb +197 -0
  49. data/lib/gettext/tools/poparser.rb +356 -0
  50. data/lib/gettext/tools/rgettext.rb +55 -33
  51. data/replace.rb +8 -0
  52. data/samples/cgi/locale/bg/LC_MESSAGES/helloerb1.mo +0 -0
  53. data/samples/cgi/locale/bg/LC_MESSAGES/helloerb2.mo +0 -0
  54. data/samples/cgi/locale/bg/LC_MESSAGES/hellolib.mo +0 -0
  55. data/samples/cgi/locale/bg/LC_MESSAGES/main.mo +0 -0
  56. data/samples/cgi/locale/bs/LC_MESSAGES/helloerb1.mo +0 -0
  57. data/samples/cgi/locale/bs/LC_MESSAGES/helloerb2.mo +0 -0
  58. data/samples/cgi/locale/bs/LC_MESSAGES/hellolib.mo +0 -0
  59. data/samples/cgi/locale/bs/LC_MESSAGES/main.mo +0 -0
  60. data/samples/cgi/locale/ca/LC_MESSAGES/helloerb1.mo +0 -0
  61. data/samples/cgi/locale/ca/LC_MESSAGES/helloerb2.mo +0 -0
  62. data/samples/cgi/locale/ca/LC_MESSAGES/hellolib.mo +0 -0
  63. data/samples/cgi/locale/ca/LC_MESSAGES/main.mo +0 -0
  64. data/samples/cgi/locale/cs/LC_MESSAGES/helloerb1.mo +0 -0
  65. data/samples/cgi/locale/cs/LC_MESSAGES/helloerb2.mo +0 -0
  66. data/samples/cgi/locale/cs/LC_MESSAGES/hellolib.mo +0 -0
  67. data/samples/cgi/locale/cs/LC_MESSAGES/main.mo +0 -0
  68. data/samples/cgi/locale/de/LC_MESSAGES/helloerb1.mo +0 -0
  69. data/samples/cgi/locale/de/LC_MESSAGES/helloerb2.mo +0 -0
  70. data/samples/cgi/locale/de/LC_MESSAGES/hellolib.mo +0 -0
  71. data/samples/cgi/locale/de/LC_MESSAGES/main.mo +0 -0
  72. data/samples/cgi/locale/el/LC_MESSAGES/helloerb1.mo +0 -0
  73. data/samples/cgi/locale/el/LC_MESSAGES/helloerb2.mo +0 -0
  74. data/samples/cgi/locale/el/LC_MESSAGES/hellolib.mo +0 -0
  75. data/samples/cgi/locale/el/LC_MESSAGES/main.mo +0 -0
  76. data/samples/cgi/locale/eo/LC_MESSAGES/helloerb1.mo +0 -0
  77. data/samples/cgi/locale/eo/LC_MESSAGES/helloerb2.mo +0 -0
  78. data/samples/cgi/locale/eo/LC_MESSAGES/hellolib.mo +0 -0
  79. data/samples/cgi/locale/eo/LC_MESSAGES/main.mo +0 -0
  80. data/samples/cgi/locale/es/LC_MESSAGES/helloerb1.mo +0 -0
  81. data/samples/cgi/locale/es/LC_MESSAGES/helloerb2.mo +0 -0
  82. data/samples/cgi/locale/es/LC_MESSAGES/hellolib.mo +0 -0
  83. data/samples/cgi/locale/es/LC_MESSAGES/main.mo +0 -0
  84. data/samples/cgi/locale/fr/LC_MESSAGES/helloerb1.mo +0 -0
  85. data/samples/cgi/locale/fr/LC_MESSAGES/helloerb2.mo +0 -0
  86. data/samples/cgi/locale/fr/LC_MESSAGES/hellolib.mo +0 -0
  87. data/samples/cgi/locale/fr/LC_MESSAGES/main.mo +0 -0
  88. data/samples/cgi/locale/hr/LC_MESSAGES/helloerb1.mo +0 -0
  89. data/samples/cgi/locale/hr/LC_MESSAGES/helloerb2.mo +0 -0
  90. data/samples/cgi/locale/hr/LC_MESSAGES/hellolib.mo +0 -0
  91. data/samples/cgi/locale/hr/LC_MESSAGES/main.mo +0 -0
  92. data/samples/cgi/locale/hu/LC_MESSAGES/helloerb1.mo +0 -0
  93. data/samples/cgi/locale/hu/LC_MESSAGES/helloerb2.mo +0 -0
  94. data/samples/cgi/locale/hu/LC_MESSAGES/hellolib.mo +0 -0
  95. data/samples/cgi/locale/hu/LC_MESSAGES/main.mo +0 -0
  96. data/samples/cgi/locale/it/LC_MESSAGES/helloerb1.mo +0 -0
  97. data/samples/cgi/locale/it/LC_MESSAGES/helloerb2.mo +0 -0
  98. data/samples/cgi/locale/it/LC_MESSAGES/hellolib.mo +0 -0
  99. data/samples/cgi/locale/it/LC_MESSAGES/main.mo +0 -0
  100. data/samples/cgi/locale/ja/LC_MESSAGES/helloerb1.mo +0 -0
  101. data/samples/cgi/locale/ja/LC_MESSAGES/helloerb2.mo +0 -0
  102. data/samples/cgi/locale/ja/LC_MESSAGES/hellolib.mo +0 -0
  103. data/samples/cgi/locale/ja/LC_MESSAGES/main.mo +0 -0
  104. data/samples/cgi/locale/ko/LC_MESSAGES/helloerb1.mo +0 -0
  105. data/samples/cgi/locale/ko/LC_MESSAGES/helloerb2.mo +0 -0
  106. data/samples/cgi/locale/ko/LC_MESSAGES/hellolib.mo +0 -0
  107. data/samples/cgi/locale/ko/LC_MESSAGES/main.mo +0 -0
  108. data/samples/cgi/locale/lv/LC_MESSAGES/helloerb1.mo +0 -0
  109. data/samples/cgi/locale/lv/LC_MESSAGES/helloerb2.mo +0 -0
  110. data/samples/cgi/locale/lv/LC_MESSAGES/hellolib.mo +0 -0
  111. data/samples/cgi/locale/lv/LC_MESSAGES/main.mo +0 -0
  112. data/samples/cgi/locale/nb/LC_MESSAGES/helloerb1.mo +0 -0
  113. data/samples/cgi/locale/nb/LC_MESSAGES/helloerb2.mo +0 -0
  114. data/samples/cgi/locale/nb/LC_MESSAGES/hellolib.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/hellolib.mo +0 -0
  119. data/samples/cgi/locale/nl/LC_MESSAGES/main.mo +0 -0
  120. data/samples/cgi/locale/pt_BR/LC_MESSAGES/helloerb1.mo +0 -0
  121. data/samples/cgi/locale/pt_BR/LC_MESSAGES/helloerb2.mo +0 -0
  122. data/samples/cgi/locale/pt_BR/LC_MESSAGES/hellolib.mo +0 -0
  123. data/samples/cgi/locale/pt_BR/LC_MESSAGES/main.mo +0 -0
  124. data/samples/cgi/locale/ru/LC_MESSAGES/helloerb1.mo +0 -0
  125. data/samples/cgi/locale/ru/LC_MESSAGES/helloerb2.mo +0 -0
  126. data/samples/cgi/locale/ru/LC_MESSAGES/hellolib.mo +0 -0
  127. data/samples/cgi/locale/ru/LC_MESSAGES/main.mo +0 -0
  128. data/samples/cgi/locale/sr/LC_MESSAGES/helloerb1.mo +0 -0
  129. data/samples/cgi/locale/sr/LC_MESSAGES/helloerb2.mo +0 -0
  130. data/samples/cgi/locale/sr/LC_MESSAGES/hellolib.mo +0 -0
  131. data/samples/cgi/locale/sr/LC_MESSAGES/main.mo +0 -0
  132. data/samples/cgi/locale/ua/LC_MESSAGES/helloerb1.mo +0 -0
  133. data/samples/cgi/locale/ua/LC_MESSAGES/helloerb2.mo +0 -0
  134. data/samples/cgi/locale/ua/LC_MESSAGES/hellolib.mo +0 -0
  135. data/samples/cgi/locale/ua/LC_MESSAGES/main.mo +0 -0
  136. data/samples/cgi/locale/vi/LC_MESSAGES/helloerb1.mo +0 -0
  137. data/samples/cgi/locale/vi/LC_MESSAGES/helloerb2.mo +0 -0
  138. data/samples/cgi/locale/vi/LC_MESSAGES/hellolib.mo +0 -0
  139. data/samples/cgi/locale/vi/LC_MESSAGES/main.mo +0 -0
  140. data/samples/cgi/locale/zh/LC_MESSAGES/helloerb1.mo +0 -0
  141. data/samples/cgi/locale/zh/LC_MESSAGES/helloerb2.mo +0 -0
  142. data/samples/cgi/locale/zh/LC_MESSAGES/hellolib.mo +0 -0
  143. data/samples/cgi/locale/zh/LC_MESSAGES/main.mo +0 -0
  144. data/samples/cgi/locale/zh_TW/LC_MESSAGES/helloerb1.mo +0 -0
  145. data/samples/cgi/locale/zh_TW/LC_MESSAGES/helloerb2.mo +0 -0
  146. data/samples/cgi/locale/zh_TW/LC_MESSAGES/hellolib.mo +0 -0
  147. data/samples/cgi/locale/zh_TW/LC_MESSAGES/main.mo +0 -0
  148. data/samples/cgi/po/bg/#main.po# +84 -0
  149. data/samples/locale/bg/LC_MESSAGES/hello.mo +0 -0
  150. data/samples/locale/bg/LC_MESSAGES/hello2.mo +0 -0
  151. data/samples/locale/bg/LC_MESSAGES/hello_glade2.mo +0 -0
  152. data/samples/locale/bg/LC_MESSAGES/hello_gtk.mo +0 -0
  153. data/samples/locale/bg/LC_MESSAGES/hello_noop.mo +0 -0
  154. data/samples/locale/bg/LC_MESSAGES/hello_plural.mo +0 -0
  155. data/samples/locale/bg/LC_MESSAGES/hello_tk.mo +0 -0
  156. data/samples/locale/bs/LC_MESSAGES/hello.mo +0 -0
  157. data/samples/locale/bs/LC_MESSAGES/hello2.mo +0 -0
  158. data/samples/locale/bs/LC_MESSAGES/hello_glade2.mo +0 -0
  159. data/samples/locale/bs/LC_MESSAGES/hello_gtk.mo +0 -0
  160. data/samples/locale/bs/LC_MESSAGES/hello_noop.mo +0 -0
  161. data/samples/locale/bs/LC_MESSAGES/hello_plural.mo +0 -0
  162. data/samples/locale/bs/LC_MESSAGES/hello_tk.mo +0 -0
  163. data/samples/locale/ca/LC_MESSAGES/hello.mo +0 -0
  164. data/samples/locale/ca/LC_MESSAGES/hello2.mo +0 -0
  165. data/samples/locale/ca/LC_MESSAGES/hello_glade2.mo +0 -0
  166. data/samples/locale/ca/LC_MESSAGES/hello_gtk.mo +0 -0
  167. data/samples/locale/ca/LC_MESSAGES/hello_noop.mo +0 -0
  168. data/samples/locale/ca/LC_MESSAGES/hello_plural.mo +0 -0
  169. data/samples/locale/ca/LC_MESSAGES/hello_tk.mo +0 -0
  170. data/samples/locale/cs/LC_MESSAGES/hello.mo +0 -0
  171. data/samples/locale/cs/LC_MESSAGES/hello2.mo +0 -0
  172. data/samples/locale/cs/LC_MESSAGES/hello_glade2.mo +0 -0
  173. data/samples/locale/cs/LC_MESSAGES/hello_gtk.mo +0 -0
  174. data/samples/locale/cs/LC_MESSAGES/hello_noop.mo +0 -0
  175. data/samples/locale/cs/LC_MESSAGES/hello_plural.mo +0 -0
  176. data/samples/locale/cs/LC_MESSAGES/hello_tk.mo +0 -0
  177. data/samples/locale/de/LC_MESSAGES/hello.mo +0 -0
  178. data/samples/locale/de/LC_MESSAGES/hello2.mo +0 -0
  179. data/samples/locale/de/LC_MESSAGES/hello_glade2.mo +0 -0
  180. data/samples/locale/de/LC_MESSAGES/hello_gtk.mo +0 -0
  181. data/samples/locale/de/LC_MESSAGES/hello_noop.mo +0 -0
  182. data/samples/locale/de/LC_MESSAGES/hello_plural.mo +0 -0
  183. data/samples/locale/de/LC_MESSAGES/hello_tk.mo +0 -0
  184. data/samples/locale/el/LC_MESSAGES/hello.mo +0 -0
  185. data/samples/locale/el/LC_MESSAGES/hello2.mo +0 -0
  186. data/samples/locale/el/LC_MESSAGES/hello_glade2.mo +0 -0
  187. data/samples/locale/el/LC_MESSAGES/hello_gtk.mo +0 -0
  188. data/samples/locale/el/LC_MESSAGES/hello_noop.mo +0 -0
  189. data/samples/locale/el/LC_MESSAGES/hello_plural.mo +0 -0
  190. data/samples/locale/el/LC_MESSAGES/hello_tk.mo +0 -0
  191. data/samples/locale/eo/LC_MESSAGES/hello.mo +0 -0
  192. data/samples/locale/eo/LC_MESSAGES/hello2.mo +0 -0
  193. data/samples/locale/eo/LC_MESSAGES/hello_glade2.mo +0 -0
  194. data/samples/locale/eo/LC_MESSAGES/hello_gtk.mo +0 -0
  195. data/samples/locale/eo/LC_MESSAGES/hello_noop.mo +0 -0
  196. data/samples/locale/eo/LC_MESSAGES/hello_plural.mo +0 -0
  197. data/samples/locale/eo/LC_MESSAGES/hello_tk.mo +0 -0
  198. data/samples/locale/es/LC_MESSAGES/hello.mo +0 -0
  199. data/samples/locale/es/LC_MESSAGES/hello2.mo +0 -0
  200. data/samples/locale/es/LC_MESSAGES/hello_glade2.mo +0 -0
  201. data/samples/locale/es/LC_MESSAGES/hello_gtk.mo +0 -0
  202. data/samples/locale/es/LC_MESSAGES/hello_noop.mo +0 -0
  203. data/samples/locale/es/LC_MESSAGES/hello_plural.mo +0 -0
  204. data/samples/locale/es/LC_MESSAGES/hello_tk.mo +0 -0
  205. data/samples/locale/fr/LC_MESSAGES/hello.mo +0 -0
  206. data/samples/locale/fr/LC_MESSAGES/hello2.mo +0 -0
  207. data/samples/locale/fr/LC_MESSAGES/hello_glade2.mo +0 -0
  208. data/samples/locale/fr/LC_MESSAGES/hello_gtk.mo +0 -0
  209. data/samples/locale/fr/LC_MESSAGES/hello_noop.mo +0 -0
  210. data/samples/locale/fr/LC_MESSAGES/hello_plural.mo +0 -0
  211. data/samples/locale/fr/LC_MESSAGES/hello_tk.mo +0 -0
  212. data/samples/locale/hr/LC_MESSAGES/hello.mo +0 -0
  213. data/samples/locale/hr/LC_MESSAGES/hello2.mo +0 -0
  214. data/samples/locale/hr/LC_MESSAGES/hello_glade2.mo +0 -0
  215. data/samples/locale/hr/LC_MESSAGES/hello_gtk.mo +0 -0
  216. data/samples/locale/hr/LC_MESSAGES/hello_noop.mo +0 -0
  217. data/samples/locale/hr/LC_MESSAGES/hello_plural.mo +0 -0
  218. data/samples/locale/hr/LC_MESSAGES/hello_tk.mo +0 -0
  219. data/samples/locale/hu/LC_MESSAGES/hello.mo +0 -0
  220. data/samples/locale/hu/LC_MESSAGES/hello2.mo +0 -0
  221. data/samples/locale/hu/LC_MESSAGES/hello_glade2.mo +0 -0
  222. data/samples/locale/hu/LC_MESSAGES/hello_gtk.mo +0 -0
  223. data/samples/locale/hu/LC_MESSAGES/hello_noop.mo +0 -0
  224. data/samples/locale/hu/LC_MESSAGES/hello_plural.mo +0 -0
  225. data/samples/locale/hu/LC_MESSAGES/hello_tk.mo +0 -0
  226. data/samples/locale/it/LC_MESSAGES/hello.mo +0 -0
  227. data/samples/locale/it/LC_MESSAGES/hello2.mo +0 -0
  228. data/samples/locale/it/LC_MESSAGES/hello_glade2.mo +0 -0
  229. data/samples/locale/it/LC_MESSAGES/hello_gtk.mo +0 -0
  230. data/samples/locale/it/LC_MESSAGES/hello_noop.mo +0 -0
  231. data/samples/locale/it/LC_MESSAGES/hello_plural.mo +0 -0
  232. data/samples/locale/it/LC_MESSAGES/hello_tk.mo +0 -0
  233. data/samples/locale/ja/LC_MESSAGES/hello.mo +0 -0
  234. data/samples/locale/ja/LC_MESSAGES/hello2.mo +0 -0
  235. data/samples/locale/ja/LC_MESSAGES/hello_glade2.mo +0 -0
  236. data/samples/locale/ja/LC_MESSAGES/hello_gtk.mo +0 -0
  237. data/samples/locale/ja/LC_MESSAGES/hello_noop.mo +0 -0
  238. data/samples/locale/ja/LC_MESSAGES/hello_plural.mo +0 -0
  239. data/samples/locale/ja/LC_MESSAGES/hello_tk.mo +0 -0
  240. data/samples/locale/ko/LC_MESSAGES/hello.mo +0 -0
  241. data/samples/locale/ko/LC_MESSAGES/hello2.mo +0 -0
  242. data/samples/locale/ko/LC_MESSAGES/hello_glade2.mo +0 -0
  243. data/samples/locale/ko/LC_MESSAGES/hello_gtk.mo +0 -0
  244. data/samples/locale/ko/LC_MESSAGES/hello_noop.mo +0 -0
  245. data/samples/locale/ko/LC_MESSAGES/hello_plural.mo +0 -0
  246. data/samples/locale/ko/LC_MESSAGES/hello_tk.mo +0 -0
  247. data/samples/locale/lv/LC_MESSAGES/hello.mo +0 -0
  248. data/samples/locale/lv/LC_MESSAGES/hello2.mo +0 -0
  249. data/samples/locale/lv/LC_MESSAGES/hello_glade2.mo +0 -0
  250. data/samples/locale/lv/LC_MESSAGES/hello_gtk.mo +0 -0
  251. data/samples/locale/lv/LC_MESSAGES/hello_noop.mo +0 -0
  252. data/samples/locale/lv/LC_MESSAGES/hello_plural.mo +0 -0
  253. data/samples/locale/lv/LC_MESSAGES/hello_tk.mo +0 -0
  254. data/samples/locale/nb/LC_MESSAGES/hello.mo +0 -0
  255. data/samples/locale/nb/LC_MESSAGES/hello2.mo +0 -0
  256. data/samples/locale/nb/LC_MESSAGES/hello_glade2.mo +0 -0
  257. data/samples/locale/nb/LC_MESSAGES/hello_gtk.mo +0 -0
  258. data/samples/locale/nb/LC_MESSAGES/hello_noop.mo +0 -0
  259. data/samples/locale/nb/LC_MESSAGES/hello_plural.mo +0 -0
  260. data/samples/locale/nb/LC_MESSAGES/hello_tk.mo +0 -0
  261. data/samples/locale/nl/LC_MESSAGES/hello.mo +0 -0
  262. data/samples/locale/nl/LC_MESSAGES/hello2.mo +0 -0
  263. data/samples/locale/nl/LC_MESSAGES/hello_glade2.mo +0 -0
  264. data/samples/locale/nl/LC_MESSAGES/hello_gtk.mo +0 -0
  265. data/samples/locale/nl/LC_MESSAGES/hello_noop.mo +0 -0
  266. data/samples/locale/nl/LC_MESSAGES/hello_plural.mo +0 -0
  267. data/samples/locale/nl/LC_MESSAGES/hello_tk.mo +0 -0
  268. data/samples/locale/pt_BR/LC_MESSAGES/hello.mo +0 -0
  269. data/samples/locale/pt_BR/LC_MESSAGES/hello2.mo +0 -0
  270. data/samples/locale/pt_BR/LC_MESSAGES/hello_glade2.mo +0 -0
  271. data/samples/locale/pt_BR/LC_MESSAGES/hello_gtk.mo +0 -0
  272. data/samples/locale/pt_BR/LC_MESSAGES/hello_noop.mo +0 -0
  273. data/samples/locale/pt_BR/LC_MESSAGES/hello_plural.mo +0 -0
  274. data/samples/locale/pt_BR/LC_MESSAGES/hello_tk.mo +0 -0
  275. data/samples/locale/ru/LC_MESSAGES/hello.mo +0 -0
  276. data/samples/locale/ru/LC_MESSAGES/hello2.mo +0 -0
  277. data/samples/locale/ru/LC_MESSAGES/hello_glade2.mo +0 -0
  278. data/samples/locale/ru/LC_MESSAGES/hello_gtk.mo +0 -0
  279. data/samples/locale/ru/LC_MESSAGES/hello_noop.mo +0 -0
  280. data/samples/locale/ru/LC_MESSAGES/hello_plural.mo +0 -0
  281. data/samples/locale/ru/LC_MESSAGES/hello_tk.mo +0 -0
  282. data/samples/locale/sr/LC_MESSAGES/hello.mo +0 -0
  283. data/samples/locale/sr/LC_MESSAGES/hello2.mo +0 -0
  284. data/samples/locale/sr/LC_MESSAGES/hello_glade2.mo +0 -0
  285. data/samples/locale/sr/LC_MESSAGES/hello_gtk.mo +0 -0
  286. data/samples/locale/sr/LC_MESSAGES/hello_noop.mo +0 -0
  287. data/samples/locale/sr/LC_MESSAGES/hello_plural.mo +0 -0
  288. data/samples/locale/sr/LC_MESSAGES/hello_tk.mo +0 -0
  289. data/samples/locale/sv/LC_MESSAGES/hello.mo +0 -0
  290. data/samples/locale/sv/LC_MESSAGES/hello2.mo +0 -0
  291. data/samples/locale/sv/LC_MESSAGES/hello_glade2.mo +0 -0
  292. data/samples/locale/sv/LC_MESSAGES/hello_gtk.mo +0 -0
  293. data/samples/locale/sv/LC_MESSAGES/hello_noop.mo +0 -0
  294. data/samples/locale/sv/LC_MESSAGES/hello_plural.mo +0 -0
  295. data/samples/locale/sv/LC_MESSAGES/hello_tk.mo +0 -0
  296. data/samples/locale/ua/LC_MESSAGES/hello.mo +0 -0
  297. data/samples/locale/ua/LC_MESSAGES/hello2.mo +0 -0
  298. data/samples/locale/ua/LC_MESSAGES/hello_glade2.mo +0 -0
  299. data/samples/locale/ua/LC_MESSAGES/hello_gtk.mo +0 -0
  300. data/samples/locale/ua/LC_MESSAGES/hello_noop.mo +0 -0
  301. data/samples/locale/ua/LC_MESSAGES/hello_plural.mo +0 -0
  302. data/samples/locale/ua/LC_MESSAGES/hello_tk.mo +0 -0
  303. data/samples/locale/vi/LC_MESSAGES/hello.mo +0 -0
  304. data/samples/locale/vi/LC_MESSAGES/hello2.mo +0 -0
  305. data/samples/locale/vi/LC_MESSAGES/hello_glade2.mo +0 -0
  306. data/samples/locale/vi/LC_MESSAGES/hello_gtk.mo +0 -0
  307. data/samples/locale/vi/LC_MESSAGES/hello_noop.mo +0 -0
  308. data/samples/locale/vi/LC_MESSAGES/hello_plural.mo +0 -0
  309. data/samples/locale/vi/LC_MESSAGES/hello_tk.mo +0 -0
  310. data/samples/locale/zh/LC_MESSAGES/hello.mo +0 -0
  311. data/samples/locale/zh/LC_MESSAGES/hello2.mo +0 -0
  312. data/samples/locale/zh/LC_MESSAGES/hello_glade2.mo +0 -0
  313. data/samples/locale/zh/LC_MESSAGES/hello_gtk.mo +0 -0
  314. data/samples/locale/zh/LC_MESSAGES/hello_noop.mo +0 -0
  315. data/samples/locale/zh/LC_MESSAGES/hello_plural.mo +0 -0
  316. data/samples/locale/zh/LC_MESSAGES/hello_tk.mo +0 -0
  317. data/samples/locale/zh_TW/LC_MESSAGES/hello.mo +0 -0
  318. data/samples/locale/zh_TW/LC_MESSAGES/hello2.mo +0 -0
  319. data/samples/locale/zh_TW/LC_MESSAGES/hello_glade2.mo +0 -0
  320. data/samples/locale/zh_TW/LC_MESSAGES/hello_gtk.mo +0 -0
  321. data/samples/locale/zh_TW/LC_MESSAGES/hello_noop.mo +0 -0
  322. data/samples/locale/zh_TW/LC_MESSAGES/hello_plural.mo +0 -0
  323. data/samples/locale/zh_TW/LC_MESSAGES/hello_tk.mo +0 -0
  324. data/test.rb +33 -0
  325. data/test/locale/cr/LC_MESSAGES/plural.mo +0 -0
  326. data/test/locale/da/LC_MESSAGES/plural.mo +0 -0
  327. data/test/locale/da/LC_MESSAGES/plural_error.mo +0 -0
  328. data/test/locale/fr/LC_MESSAGES/plural.mo +0 -0
  329. data/test/locale/fr/LC_MESSAGES/plural_error.mo +0 -0
  330. data/test/locale/fr/LC_MESSAGES/test1.mo +0 -0
  331. data/test/locale/fr/LC_MESSAGES/test2.mo +0 -0
  332. data/test/locale/ir/LC_MESSAGES/plural.mo +0 -0
  333. data/test/locale/ja/LC_MESSAGES/npgettext.mo +0 -0
  334. data/test/locale/ja/LC_MESSAGES/nsgettext.mo +0 -0
  335. data/test/locale/ja/LC_MESSAGES/pgettext.mo +0 -0
  336. data/test/locale/ja/LC_MESSAGES/plural.mo +0 -0
  337. data/test/locale/ja/LC_MESSAGES/plural_error.mo +0 -0
  338. data/test/locale/ja/LC_MESSAGES/rubyparser.mo +0 -0
  339. data/test/locale/ja/LC_MESSAGES/sgettext.mo +0 -0
  340. data/test/locale/ja/LC_MESSAGES/test1.mo +0 -0
  341. data/test/locale/ja/LC_MESSAGES/test2.mo +0 -0
  342. data/test/locale/ja/LC_MESSAGES/test3.mo +0 -0
  343. data/test/locale/la/LC_MESSAGES/plural.mo +0 -0
  344. data/test/locale/la/LC_MESSAGES/plural_error.mo +0 -0
  345. data/test/locale/li/LC_MESSAGES/plural.mo +0 -0
  346. data/test/locale/li/LC_MESSAGES/plural_error.mo +0 -0
  347. data/test/locale/po/LC_MESSAGES/plural.mo +0 -0
  348. data/test/locale/sl/LC_MESSAGES/plural.mo +0 -0
  349. data/test/po/ja/test3.po +19 -0
  350. data/test/po/li/plural_error.po +27 -0
  351. data/test/test_locale_path.rb +50 -0
  352. data/test/test_po_generation.rb +20 -0
  353. data/test/test_pomessage.rb +99 -0
  354. data/test/test_textdomain_bind.rb +37 -0
  355. data/test/test_thread.rb +41 -0
  356. data/test/tools/files/app.pot +0 -0
  357. data/test/tools/files/de/app.po +0 -0
  358. data/test/tools/files/en/app.po +0 -0
  359. data/test/tools/files/en/test.po +21 -0
  360. data/test/tools/files/simple_1.po +2 -0
  361. data/test/tools/files/simple_2.po +2 -0
  362. data/test/tools/files/simple_translation.rb +1 -0
  363. data/test/tools/files/version.po +7 -0
  364. data/test/tools/test.pot +21 -0
  365. data/test/tools/test_tools.rb +61 -0
  366. metadata +710 -348
@@ -0,0 +1,52 @@
1
+ =begin
2
+ parser/erb.rb - parser for ERB
3
+
4
+ Copyright (C) 2005-2009 Masao Mutoh
5
+
6
+ You may redistribute it and/or modify it under the same
7
+ license terms as Ruby or LGPL.
8
+ =end
9
+
10
+ require 'erb'
11
+ require 'gettext/tools/parser/ruby'
12
+
13
+ module GetText
14
+ module ErbParser
15
+ extend self
16
+
17
+ @config = {
18
+ :extnames => ['.rhtml', '.erb']
19
+ }
20
+
21
+ # Sets some preferences to parse ERB files.
22
+ # * config: a Hash of the config. It can takes some values below:
23
+ # * :extnames: An Array of target files extension. Default is [".rhtml"].
24
+ def init(config)
25
+ config.each{|k, v|
26
+ @config[k] = v
27
+ }
28
+ end
29
+
30
+ def parse(file, targets = []) # :nodoc:
31
+ src = ERB.new(IO.readlines(file).join).src
32
+ # Remove magic comment prepended by erb in Ruby 1.9.
33
+ src.sub!(/\A#.*?coding[:=].*?\n/, '') if src.respond_to?(:encode)
34
+ erb = src.split(/$/)
35
+ RubyParser.parse_lines(file, erb, targets)
36
+ end
37
+
38
+ def target?(file) # :nodoc:
39
+ @config[:extnames].each do |v|
40
+ return true if File.extname(file) == v
41
+ end
42
+ false
43
+ end
44
+ end
45
+ end
46
+
47
+ if __FILE__ == $0
48
+ # ex) ruby glade.rhtml foo.rhtml bar.rhtml
49
+ ARGV.each do |file|
50
+ p GetText::ErbParser.parse(file)
51
+ end
52
+ end
@@ -0,0 +1,98 @@
1
+ =begin
2
+ parser/glade.rb - parser for Glade-2
3
+
4
+ Copyright (C) 2004,2005 Masao Mutoh
5
+
6
+ You may redistribute it and/or modify it under the same
7
+ license terms as Ruby or LGPL.
8
+ =end
9
+
10
+ require 'cgi'
11
+ require 'gettext'
12
+
13
+ module GetText
14
+ module GladeParser
15
+ extend GetText
16
+ extend self
17
+
18
+ bindtextdomain("rgettext")
19
+
20
+ TARGET1 = /<property.*translatable="yes">(.*)/
21
+ TARGET2 = /(.*)<\/property>/
22
+
23
+ def parse(file, targets = []) # :nodoc:
24
+ lines = IO.readlines(file)
25
+ parse_lines(file, lines, targets)
26
+ end
27
+
28
+ #from ary of lines.
29
+ def parse_lines(file, lines, targets) # :nodoc:
30
+ cnt = 0
31
+ target = false
32
+ line_no = 0
33
+ val = nil
34
+
35
+ loop do
36
+ line = lines.shift
37
+ break unless line
38
+
39
+ cnt += 1
40
+ if TARGET1 =~ line
41
+ line_no = cnt
42
+ val = $1 + "\n"
43
+ target = true
44
+ if TARGET2 =~ $1
45
+ val = $1
46
+ add_target(val, file, line_no, targets)
47
+ val = nil
48
+ target = false
49
+ end
50
+ elsif target
51
+ if TARGET2 =~ line
52
+ val << $1
53
+ add_target(val, file, line_no, targets)
54
+ val = nil
55
+ target = false
56
+ else
57
+ val << line
58
+ end
59
+ end
60
+ end
61
+ targets
62
+ end
63
+
64
+ XML_RE = /<\?xml/
65
+ GLADE_RE = /glade-2.0.dtd/
66
+
67
+ def target?(file) # :nodoc:
68
+ data = IO.readlines(file)
69
+ if XML_RE =~ data[0] and GLADE_RE =~ data[1]
70
+ true
71
+ else
72
+ if File.extname(file) == '.glade'
73
+ raise _("`%{file}' is not glade-2.0 format.") % {:file => file}
74
+ end
75
+ false
76
+ end
77
+ end
78
+
79
+ def add_target(val, file, line_no, targets) # :nodoc:
80
+ return unless val.size > 0
81
+ assoc_data = targets.assoc(val)
82
+ val = CGI.unescapeHTML(val)
83
+ if assoc_data
84
+ targets[targets.index(assoc_data)] = assoc_data << "#{file}:#{line_no}"
85
+ else
86
+ targets << [val.gsub(/\n/, '\n'), "#{file}:#{line_no}"]
87
+ end
88
+ targets
89
+ end
90
+ end
91
+ end
92
+
93
+ if __FILE__ == $0
94
+ # ex) ruby glade.rb foo.glade bar.glade
95
+ ARGV.each do |file|
96
+ p GetText::GladeParser.parse(file)
97
+ end
98
+ end
@@ -0,0 +1,226 @@
1
+ #!/usr/bin/ruby
2
+ =begin
3
+ parser/ruby.rb - parser for ruby script
4
+
5
+ Copyright (C) 2003-2009 Masao Mutoh
6
+ Copyright (C) 2005 speakillof
7
+ Copyright (C) 2001,2002 Yasushi Shoji, Masao Mutoh
8
+
9
+ You may redistribute it and/or modify it under the same
10
+ license terms as Ruby or LGPL.
11
+
12
+ =end
13
+
14
+ require 'irb/ruby-lex.rb'
15
+ require 'stringio'
16
+ require 'gettext/tools/pomessage'
17
+
18
+ module GetText
19
+ class RubyLexX < RubyLex # :nodoc: all
20
+ # Parser#parse resemlbes RubyLex#lex
21
+ def parse
22
+ until ( (tk = token).kind_of?(RubyToken::TkEND_OF_SCRIPT) && !@continue or tk.nil? )
23
+ s = get_readed
24
+ if RubyToken::TkSTRING === tk
25
+ def tk.value
26
+ @value
27
+ end
28
+
29
+ def tk.value=(s)
30
+ @value = s
31
+ end
32
+
33
+ if @here_header
34
+ s = s.sub(/\A.*?\n/, '').sub(/^.*\n\Z/, '')
35
+ else
36
+ begin
37
+ s = eval(s)
38
+ rescue Exception
39
+ # Do nothing.
40
+ end
41
+ end
42
+
43
+ tk.value = s
44
+ end
45
+
46
+ if $DEBUG
47
+ if tk.is_a? TkSTRING
48
+ $stderr.puts("#{tk}: #{tk.value}")
49
+ elsif tk.is_a? TkIDENTIFIER
50
+ $stderr.puts("#{tk}: #{tk.name}")
51
+ else
52
+ $stderr.puts(tk)
53
+ end
54
+ end
55
+
56
+ yield tk
57
+ end
58
+ return nil
59
+ end
60
+
61
+ # Original parser does not keep the content of the comments,
62
+ # so monkey patching this with new token type and extended
63
+ # identify_comment implementation
64
+ RubyToken.def_token :TkCOMMENT_WITH_CONTENT, TkVal
65
+
66
+ def identify_comment
67
+ @ltype = "#"
68
+ get_readed # skip the hash sign itself
69
+
70
+ while ch = getc
71
+ if ch == "\n"
72
+ @ltype = nil
73
+ ungetc
74
+ break
75
+ end
76
+ end
77
+ return Token(TkCOMMENT_WITH_CONTENT, get_readed)
78
+ end
79
+
80
+ end
81
+
82
+ # Extends PoMessage for RubyParser.
83
+ # Implements a sort of state machine to assist the parser.
84
+ module PoMessageForRubyParser
85
+ # Supports parsing by setting attributes by and by.
86
+ def set_current_attribute(str)
87
+ param = @param_type[@param_number]
88
+ raise ParseError, 'no more string parameters expected' unless param
89
+ set_value(param, str)
90
+ end
91
+
92
+ def init_param
93
+ @param_number = 0
94
+ self
95
+ end
96
+
97
+ def advance_to_next_attribute
98
+ @param_number += 1
99
+ end
100
+ end
101
+ class PoMessage
102
+ include PoMessageForRubyParser
103
+ alias :initialize_old :initialize
104
+ def initialize(type)
105
+ initialize_old(type)
106
+ init_param
107
+ end
108
+ end
109
+
110
+ module RubyParser
111
+ extend self
112
+
113
+ ID = ['gettext', '_', 'N_', 'sgettext', 's_']
114
+ PLURAL_ID = ['ngettext', 'n_', 'Nn_', 'ns_', 'nsgettext']
115
+ MSGCTXT_ID = ['pgettext', 'p_']
116
+ MSGCTXT_PLURAL_ID = ['npgettext', 'np_']
117
+
118
+ # (Since 2.1.0) the 2nd parameter is deprecated
119
+ # (and ignored here).
120
+ # And You don't need to keep the pomessages as unique.
121
+
122
+ def parse(path, deprecated = []) # :nodoc:
123
+ lines = IO.readlines(path)
124
+ parse_lines(path, lines, deprecated)
125
+ end
126
+
127
+ def parse_lines(path, lines, deprecated = []) # :nodoc:
128
+ pomessages = deprecated
129
+ file = StringIO.new(lines.join + "\n")
130
+ rl = RubyLexX.new
131
+ rl.set_input(file)
132
+ rl.skip_space = true
133
+ #rl.readed_auto_clean_up = true
134
+
135
+ pomessage = nil
136
+ line_no = nil
137
+ last_comment = ''
138
+ reset_comment = false
139
+ rl.parse do |tk|
140
+ begin
141
+ case tk
142
+ when RubyToken::TkIDENTIFIER, RubyToken::TkCONSTANT
143
+ store_pomessage(pomessages, pomessage, path, line_no, last_comment)
144
+ if ID.include?(tk.name)
145
+ pomessage = PoMessage.new(:normal)
146
+ elsif PLURAL_ID.include?(tk.name)
147
+ pomessage = PoMessage.new(:plural)
148
+ elsif MSGCTXT_ID.include?(tk.name)
149
+ pomessage = PoMessage.new(:msgctxt)
150
+ elsif MSGCTXT_PLURAL_ID.include?(tk.name)
151
+ pomessage = PoMessage.new(:msgctxt_plural)
152
+ else
153
+ pomessage = nil
154
+ end
155
+ line_no = tk.line_no.to_s
156
+ when RubyToken::TkSTRING
157
+ pomessage.set_current_attribute tk.value if pomessage
158
+ when RubyToken::TkPLUS, RubyToken::TkNL
159
+ #do nothing
160
+ when RubyToken::TkCOMMA
161
+ pomessage.advance_to_next_attribute if pomessage
162
+ else
163
+ if store_pomessage(pomessages, pomessage, path, line_no, last_comment)
164
+ pomessage = nil
165
+ end
166
+ end
167
+ rescue
168
+ $stderr.print "\n\nError"
169
+ $stderr.print " parsing #{path}:#{tk.line_no}\n\t #{lines[tk.line_no - 1]}" if tk
170
+ $stderr.print "\n #{$!.inspect} in\n"
171
+ $stderr.print $!.backtrace.join("\n")
172
+ $stderr.print "\n"
173
+ exit 1
174
+ end
175
+
176
+ case tk
177
+ when RubyToken::TkCOMMENT_WITH_CONTENT
178
+ last_comment = "" if reset_comment
179
+ if last_comment.empty?
180
+ # new comment from programmer to translator?
181
+ comment1 = tk.value.lstrip
182
+ if comment1 =~ /^TRANSLATORS\:/
183
+ last_comment = $'
184
+ end
185
+ else
186
+ last_comment += "\n"
187
+ last_comment += tk.value
188
+ end
189
+ reset_comment = false
190
+ when RubyToken::TkNL
191
+ else
192
+ reset_comment = true
193
+ end
194
+ end
195
+ pomessages
196
+ end
197
+
198
+ def target?(file) # :nodoc:
199
+ true # always true, as the default parser.
200
+ end
201
+
202
+ private
203
+ def store_pomessage(pomessages, pomessage, file_name, line_no, last_comment) #:nodoc:
204
+ if pomessage && pomessage.msgid
205
+ pomessage.sources << file_name + ":" + line_no
206
+ pomessage.add_comment(last_comment) unless last_comment.empty?
207
+ pomessages << pomessage
208
+ true
209
+ else
210
+ false
211
+ end
212
+ end
213
+ end
214
+ end
215
+
216
+ if __FILE__ == $0
217
+ require 'pp'
218
+ ARGV.each do |path|
219
+ pp GetText::RubyParser.parse(path)
220
+ end
221
+
222
+ #rl = GetText::RubyLexX.new; rl.set_input(ARGF)
223
+ #rl.parse do |tk|
224
+ #p tk
225
+ #end
226
+ end
@@ -0,0 +1,197 @@
1
+ module GetText
2
+ class ParseError < StandardError
3
+ end
4
+
5
+ # Contains data related to the expression or sentence that
6
+ # is to be translated.
7
+ class PoMessage
8
+ PARAMS = {
9
+ :normal => [:msgid],
10
+ :plural => [:msgid, :msgid_plural],
11
+ :msgctxt => [:msgctxt, :msgid],
12
+ :msgctxt_plural => [:msgctxt, :msgid, :msgid_plural]
13
+ }
14
+
15
+ @@max_line_length = 70
16
+
17
+ # Sets the max line length.
18
+ def self.max_line_length=(len)
19
+ @@max_line_length = len
20
+ end
21
+
22
+ # Gets the max line length.
23
+ def self.max_line_length
24
+ @@max_line_length
25
+ end
26
+
27
+ # Required
28
+ attr_accessor :type # :normal, :plural, :msgctxt, :msgctxt_plural
29
+ attr_accessor :msgid
30
+ # Options
31
+ attr_accessor :msgid_plural
32
+ attr_accessor :msgctxt
33
+ attr_accessor :sources # ["file1:line1", "file2:line2", ...]
34
+ attr_accessor :comment
35
+
36
+ # Create the object. +type+ should be :normal, :plural, :msgctxt or :msgctxt_plural.
37
+ def initialize(type)
38
+ @type = type
39
+ @sources = []
40
+ @param_type = PARAMS[@type]
41
+ end
42
+
43
+ # Support for extracted comments. Explanation s.
44
+ # http://www.gnu.org/software/gettext/manual/gettext.html#Names
45
+ def add_comment(new_comment)
46
+ if (new_comment and ! new_comment.empty?)
47
+ @comment ||= ""
48
+ @comment += new_comment
49
+ end
50
+ to_s
51
+ end
52
+
53
+ # Returns a parameter representation suitable for po-files
54
+ # and other purposes.
55
+ def escaped(param_name)
56
+ orig = self.send param_name
57
+ orig.gsub(/"/, '\"').gsub(/\r/, '')
58
+ end
59
+
60
+ # Checks if the other translation target is mergeable with
61
+ # the current one. Relevant are msgid and translation context (msgctxt).
62
+ def ==(other)
63
+ other.msgid == self.msgid && other.msgctxt == self.msgctxt
64
+ end
65
+
66
+ # Merges two translation targets with the same msgid and returns the merged
67
+ # result. If one is declared as plural and the other not, then the one
68
+ # with the plural wins.
69
+ def merge(other)
70
+ return self unless other
71
+ raise ParseError, "Translation targets do not match: \n" \
72
+ " self: #{self.inspect}\n other: '#{other.inspect}'" unless self == other
73
+ if other.msgid_plural && !self.msgid_plural
74
+ res = other
75
+ unless (res.sources.include? self.sources[0])
76
+ res.sources += self.sources
77
+ res.add_comment(self.comment)
78
+ end
79
+ else
80
+ res = self
81
+ unless (res.sources.include? other.sources[0])
82
+ res.sources += other.sources
83
+ res.add_comment(other.comment)
84
+ end
85
+ end
86
+ res
87
+ end
88
+
89
+ # Output the po message for the po-file.
90
+ def to_po_str
91
+ raise "msgid is nil." unless @msgid
92
+ raise "sources is nil." unless @sources
93
+
94
+ str = ""
95
+ # extracted comments
96
+ if comment
97
+ comment.split("\n").each do |comment_line|
98
+ str << "\n#. #{comment_line.strip}"
99
+ end
100
+ end
101
+
102
+ # references
103
+ curr_pos = @@max_line_length
104
+ sources.each do |e|
105
+ if curr_pos + e.size > @@max_line_length
106
+ str << "\n#:"
107
+ curr_pos = 3
108
+ else
109
+ curr_pos += (e.size + 1)
110
+ end
111
+ str << " " << e
112
+ end
113
+
114
+ # msgctxt, msgid, msgstr
115
+ str << "\nmsgctxt \"" << msgctxt << "\"" if msgctxt?
116
+ str << "\nmsgid \"" << escaped(:msgid) << "\"\n"
117
+ if plural?
118
+ str << "msgid_plural \"" << escaped(:msgid_plural) << "\"\n"
119
+ str << "msgstr[0] \"\"\n"
120
+ str << "msgstr[1] \"\"\n"
121
+ else
122
+ str << "msgstr \"\"\n"
123
+ end
124
+ str
125
+ end
126
+
127
+ # Returns true if the type is kind of msgctxt.
128
+ # And if this is a kind of msgctxt and msgctxt property
129
+ # is nil, then raise an RuntimeException.
130
+ def msgctxt?
131
+ if [:msgctxt, :msgctxt_plural].include? @type
132
+ raise "This PoMessage is a kind of msgctxt but the msgctxt property is nil. msgid: #{msgid}" unless @msgctxt
133
+ true
134
+ end
135
+ end
136
+
137
+ # Returns true if the type is kind of plural.
138
+ # And if this is a kind of plural and msgid_plural property
139
+ # is nil, then raise an RuntimeException.
140
+ def plural?
141
+ if [:plural, :msgctxt_plural].include? @type
142
+ raise "This PoMessage is a kind of plural but the msgid_plural property is nil. msgid: #{msgid}" unless @msgid_plural
143
+ true
144
+ end
145
+ end
146
+
147
+ private
148
+
149
+ # sets or extends the value of a translation target params like msgid,
150
+ # msgctxt etc.
151
+ # param is symbol with the name of param
152
+ # value - new value
153
+ def set_value(param, value)
154
+ send "#{param}=", (send(param) || '') + value.gsub(/\n/, '\n')
155
+ end
156
+
157
+ public
158
+ # For backward comatibility. This doesn't support "comment".
159
+ # ary = [msgid1, "file1:line1", "file2:line"]
160
+ def self.new_from_ary(ary)
161
+ ary = ary.dup
162
+ msgid = ary.shift
163
+ sources = ary
164
+ type = :normal
165
+ msgctxt = nil
166
+ msgid_plural = nil
167
+
168
+ if msgid.include? "\004"
169
+ msgctxt, msgid = msgid.split(/\004/)
170
+ type = :msgctxt
171
+ end
172
+ if msgid.include? "\000"
173
+ ids = msgid.split(/\000/)
174
+ msgid = ids[0]
175
+ msgid_plural = ids[1]
176
+ if type == :msgctxt
177
+ type = :msgctxt_plural
178
+ else
179
+ type = :plural
180
+ end
181
+ end
182
+ ret = self.new(type)
183
+ ret.msgid = msgid
184
+ ret.sources = sources
185
+ ret.msgctxt = msgctxt
186
+ ret.msgid_plural = msgid_plural
187
+ ret
188
+ end
189
+
190
+ def [](number)
191
+ param = @param_type[number]
192
+ raise ParseError, 'no more string parameters expected' unless param
193
+ send param
194
+ end
195
+ end
196
+
197
+ end