fair-gettext 2.0.1 → 2.0.2

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