gettext 1.0.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 (384) hide show
  1. data/COPYING +55 -0
  2. data/COPYING.ja +51 -0
  3. data/ChangeLog +492 -0
  4. data/NEWS +99 -0
  5. data/README +112 -0
  6. data/README.ja +115 -0
  7. data/Rakefile +170 -0
  8. data/bin/rgettext +22 -0
  9. data/bin/rmsgfmt +22 -0
  10. data/data/locale/de/LC_MESSAGES/rgettext.mo +0 -0
  11. data/data/locale/de/LC_MESSAGES/rmsgfmt.mo +0 -0
  12. data/data/locale/es/LC_MESSAGES/rgettext.mo +0 -0
  13. data/data/locale/es/LC_MESSAGES/rmsgfmt.mo +0 -0
  14. data/data/locale/fr/LC_MESSAGES/rgettext.mo +0 -0
  15. data/data/locale/fr/LC_MESSAGES/rmsgfmt.mo +0 -0
  16. data/data/locale/it/LC_MESSAGES/rgettext.mo +0 -0
  17. data/data/locale/it/LC_MESSAGES/rmsgfmt.mo +0 -0
  18. data/data/locale/ja/LC_MESSAGES/rgettext.mo +0 -0
  19. data/data/locale/ja/LC_MESSAGES/rmsgfmt.mo +0 -0
  20. data/data/locale/ko/LC_MESSAGES/rgettext.mo +0 -0
  21. data/data/locale/ko/LC_MESSAGES/rmsgfmt.mo +0 -0
  22. data/data/locale/pt_BR/LC_MESSAGES/rgettext.mo +0 -0
  23. data/data/locale/pt_BR/LC_MESSAGES/rmsgfmt.mo +0 -0
  24. data/data/locale/sv/LC_MESSAGES/rgettext.mo +0 -0
  25. data/data/locale/sv/LC_MESSAGES/rmsgfmt.mo +0 -0
  26. data/ext/gettext/gettext/MANIFEST +3 -0
  27. data/ext/gettext/gettext/_locale.c +86 -0
  28. data/ext/gettext/gettext/extconf.rb +20 -0
  29. data/lib/gettext.rb +127 -0
  30. data/lib/gettext/cgi.rb +83 -0
  31. data/lib/gettext/container.rb +30 -0
  32. data/lib/gettext/erb.rb +28 -0
  33. data/lib/gettext/iconv.rb +80 -0
  34. data/lib/gettext/locale.rb +71 -0
  35. data/lib/gettext/locale_default.rb +35 -0
  36. data/lib/gettext/locale_table_win32.rb +192 -0
  37. data/lib/gettext/locale_win32.rb +35 -0
  38. data/lib/gettext/mo.rb +262 -0
  39. data/lib/gettext/parser/erb.rb +34 -0
  40. data/lib/gettext/parser/glade.rb +98 -0
  41. data/lib/gettext/parser/ruby.rb +211 -0
  42. data/lib/gettext/rails.rb +40 -0
  43. data/lib/gettext/rgettext.rb +181 -0
  44. data/lib/gettext/rmsgfmt.rb +363 -0
  45. data/lib/gettext/textdomain.rb +168 -0
  46. data/lib/gettext/version.rb +12 -0
  47. data/po/de/rgettext.po +49 -0
  48. data/po/de/rmsgfmt.po +45 -0
  49. data/po/es/rgettext.po +47 -0
  50. data/po/es/rmsgfmt.po +43 -0
  51. data/po/fr/rgettext.po +47 -0
  52. data/po/fr/rmsgfmt.po +43 -0
  53. data/po/it/rgettext.po +47 -0
  54. data/po/it/rmsgfmt.po +44 -0
  55. data/po/ja/rgettext.po +49 -0
  56. data/po/ja/rmsgfmt.po +43 -0
  57. data/po/ko/rgettext.po +46 -0
  58. data/po/ko/rmsgfmt.po +40 -0
  59. data/po/pt_BR/rgettext.po +47 -0
  60. data/po/pt_BR/rmsgfmt.po +42 -0
  61. data/po/rgettext.pot +45 -0
  62. data/po/rmsgfmt.pot +40 -0
  63. data/po/sv/rgettext.po +48 -0
  64. data/po/sv/rmsgfmt.po +43 -0
  65. data/post-setup.rb +12 -0
  66. data/pre-setup.rb +12 -0
  67. data/samples/README +20 -0
  68. data/samples/cgi/README +43 -0
  69. data/samples/cgi/Rakefile +9 -0
  70. data/samples/cgi/cookie.cgi +57 -0
  71. data/samples/cgi/gettext.css +116 -0
  72. data/samples/cgi/helloerb.rhtml +27 -0
  73. data/samples/cgi/helloerb1.cgi +47 -0
  74. data/samples/cgi/helloerb2.cgi +41 -0
  75. data/samples/cgi/hellolib.rb +21 -0
  76. data/samples/cgi/http.rb +54 -0
  77. data/samples/cgi/index.cgi +104 -0
  78. data/samples/cgi/locale/de/LC_MESSAGES/helloerb1.mo +0 -0
  79. data/samples/cgi/locale/de/LC_MESSAGES/helloerb2.mo +0 -0
  80. data/samples/cgi/locale/de/LC_MESSAGES/hellolib.mo +0 -0
  81. data/samples/cgi/locale/de/LC_MESSAGES/main.mo +0 -0
  82. data/samples/cgi/locale/es/LC_MESSAGES/helloerb1.mo +0 -0
  83. data/samples/cgi/locale/es/LC_MESSAGES/helloerb2.mo +0 -0
  84. data/samples/cgi/locale/es/LC_MESSAGES/hellolib.mo +0 -0
  85. data/samples/cgi/locale/es/LC_MESSAGES/main.mo +0 -0
  86. data/samples/cgi/locale/fr/LC_MESSAGES/helloerb1.mo +0 -0
  87. data/samples/cgi/locale/fr/LC_MESSAGES/helloerb2.mo +0 -0
  88. data/samples/cgi/locale/fr/LC_MESSAGES/hellolib.mo +0 -0
  89. data/samples/cgi/locale/fr/LC_MESSAGES/main.mo +0 -0
  90. data/samples/cgi/locale/it/LC_MESSAGES/helloerb1.mo +0 -0
  91. data/samples/cgi/locale/it/LC_MESSAGES/helloerb2.mo +0 -0
  92. data/samples/cgi/locale/it/LC_MESSAGES/hellolib.mo +0 -0
  93. data/samples/cgi/locale/it/LC_MESSAGES/main.mo +0 -0
  94. data/samples/cgi/locale/ja/LC_MESSAGES/helloerb1.mo +0 -0
  95. data/samples/cgi/locale/ja/LC_MESSAGES/helloerb2.mo +0 -0
  96. data/samples/cgi/locale/ja/LC_MESSAGES/hellolib.mo +0 -0
  97. data/samples/cgi/locale/ja/LC_MESSAGES/main.mo +0 -0
  98. data/samples/cgi/locale/ko/LC_MESSAGES/helloerb1.mo +0 -0
  99. data/samples/cgi/locale/ko/LC_MESSAGES/helloerb2.mo +0 -0
  100. data/samples/cgi/locale/ko/LC_MESSAGES/hellolib.mo +0 -0
  101. data/samples/cgi/locale/ko/LC_MESSAGES/main.mo +0 -0
  102. data/samples/cgi/other.rhtml +20 -0
  103. data/samples/cgi/po/de/helloerb1.po +60 -0
  104. data/samples/cgi/po/de/helloerb2.po +52 -0
  105. data/samples/cgi/po/de/hellolib.po +23 -0
  106. data/samples/cgi/po/de/main.po +76 -0
  107. data/samples/cgi/po/es/helloerb1.po +59 -0
  108. data/samples/cgi/po/es/helloerb2.po +50 -0
  109. data/samples/cgi/po/es/hellolib.po +22 -0
  110. data/samples/cgi/po/es/main.po +74 -0
  111. data/samples/cgi/po/fr/helloerb1.po +59 -0
  112. data/samples/cgi/po/fr/helloerb2.po +51 -0
  113. data/samples/cgi/po/fr/hellolib.po +22 -0
  114. data/samples/cgi/po/fr/main.po +75 -0
  115. data/samples/cgi/po/helloerb1.pot +60 -0
  116. data/samples/cgi/po/helloerb2.pot +52 -0
  117. data/samples/cgi/po/hellolib.pot +23 -0
  118. data/samples/cgi/po/it/helloerb1.po +61 -0
  119. data/samples/cgi/po/it/helloerb2.po +52 -0
  120. data/samples/cgi/po/it/hellolib.po +24 -0
  121. data/samples/cgi/po/it/main.po +76 -0
  122. data/samples/cgi/po/ja/helloerb1.po +59 -0
  123. data/samples/cgi/po/ja/helloerb2.po +52 -0
  124. data/samples/cgi/po/ja/hellolib.po +23 -0
  125. data/samples/cgi/po/ja/main.po +76 -0
  126. data/samples/cgi/po/ko/helloerb1.po +58 -0
  127. data/samples/cgi/po/ko/helloerb2.po +52 -0
  128. data/samples/cgi/po/ko/hellolib.po +22 -0
  129. data/samples/cgi/po/ko/main.po +74 -0
  130. data/samples/cgi/po/main.pot +76 -0
  131. data/samples/cgi/ruby.bat +4 -0
  132. data/samples/hello.rb +12 -0
  133. data/samples/hello2.rb +15 -0
  134. data/samples/hello_noop.rb +18 -0
  135. data/samples/hello_plural.rb +15 -0
  136. data/samples/hello_textdomain.rb +12 -0
  137. data/samples/helloglade2.glade +70 -0
  138. data/samples/helloglade2.rb +24 -0
  139. data/samples/hellogtk.rb +26 -0
  140. data/samples/hellogtk2.rb +28 -0
  141. data/samples/hellotk.rb +18 -0
  142. data/samples/locale/de/LC_MESSAGES/hello.mo +0 -0
  143. data/samples/locale/de/LC_MESSAGES/hello2.mo +0 -0
  144. data/samples/locale/de/LC_MESSAGES/hello_noop.mo +0 -0
  145. data/samples/locale/de/LC_MESSAGES/hello_plural.mo +0 -0
  146. data/samples/locale/de/LC_MESSAGES/helloglade2.mo +0 -0
  147. data/samples/locale/de/LC_MESSAGES/hellogtk.mo +0 -0
  148. data/samples/locale/de/LC_MESSAGES/hellotk.mo +0 -0
  149. data/samples/locale/es/LC_MESSAGES/hello.mo +0 -0
  150. data/samples/locale/es/LC_MESSAGES/hello2.mo +0 -0
  151. data/samples/locale/es/LC_MESSAGES/hello_noop.mo +0 -0
  152. data/samples/locale/es/LC_MESSAGES/hello_plural.mo +0 -0
  153. data/samples/locale/es/LC_MESSAGES/helloglade2.mo +0 -0
  154. data/samples/locale/es/LC_MESSAGES/hellogtk.mo +0 -0
  155. data/samples/locale/es/LC_MESSAGES/hellotk.mo +0 -0
  156. data/samples/locale/fr/LC_MESSAGES/hello.mo +0 -0
  157. data/samples/locale/fr/LC_MESSAGES/hello2.mo +0 -0
  158. data/samples/locale/fr/LC_MESSAGES/hello_noop.mo +0 -0
  159. data/samples/locale/fr/LC_MESSAGES/hello_plural.mo +0 -0
  160. data/samples/locale/fr/LC_MESSAGES/helloglade2.mo +0 -0
  161. data/samples/locale/fr/LC_MESSAGES/hellogtk.mo +0 -0
  162. data/samples/locale/fr/LC_MESSAGES/hellotk.mo +0 -0
  163. data/samples/locale/it/LC_MESSAGES/hello.mo +0 -0
  164. data/samples/locale/it/LC_MESSAGES/hello2.mo +0 -0
  165. data/samples/locale/it/LC_MESSAGES/hello_noop.mo +0 -0
  166. data/samples/locale/it/LC_MESSAGES/hello_plural.mo +0 -0
  167. data/samples/locale/it/LC_MESSAGES/helloglade2.mo +0 -0
  168. data/samples/locale/it/LC_MESSAGES/hellogtk.mo +0 -0
  169. data/samples/locale/it/LC_MESSAGES/hellotk.mo +0 -0
  170. data/samples/locale/ja/LC_MESSAGES/hello.mo +0 -0
  171. data/samples/locale/ja/LC_MESSAGES/hello2.mo +0 -0
  172. data/samples/locale/ja/LC_MESSAGES/hello_noop.mo +0 -0
  173. data/samples/locale/ja/LC_MESSAGES/hello_plural.mo +0 -0
  174. data/samples/locale/ja/LC_MESSAGES/helloglade2.mo +0 -0
  175. data/samples/locale/ja/LC_MESSAGES/hellogtk.mo +0 -0
  176. data/samples/locale/ja/LC_MESSAGES/hellotk.mo +0 -0
  177. data/samples/locale/ko/LC_MESSAGES/hello.mo +0 -0
  178. data/samples/locale/ko/LC_MESSAGES/hello2.mo +0 -0
  179. data/samples/locale/ko/LC_MESSAGES/hello_noop.mo +0 -0
  180. data/samples/locale/ko/LC_MESSAGES/hello_plural.mo +0 -0
  181. data/samples/locale/ko/LC_MESSAGES/helloglade2.mo +0 -0
  182. data/samples/locale/ko/LC_MESSAGES/hellogtk.mo +0 -0
  183. data/samples/locale/ko/LC_MESSAGES/hellotk.mo +0 -0
  184. data/samples/locale/pt_BR/LC_MESSAGES/hello.mo +0 -0
  185. data/samples/locale/pt_BR/LC_MESSAGES/hello2.mo +0 -0
  186. data/samples/locale/pt_BR/LC_MESSAGES/hello_noop.mo +0 -0
  187. data/samples/locale/pt_BR/LC_MESSAGES/hello_plural.mo +0 -0
  188. data/samples/locale/pt_BR/LC_MESSAGES/helloglade2.mo +0 -0
  189. data/samples/locale/pt_BR/LC_MESSAGES/hellogtk.mo +0 -0
  190. data/samples/locale/pt_BR/LC_MESSAGES/hellotk.mo +0 -0
  191. data/samples/locale/sv/LC_MESSAGES/hello.mo +0 -0
  192. data/samples/locale/sv/LC_MESSAGES/hello2.mo +0 -0
  193. data/samples/locale/sv/LC_MESSAGES/hello_noop.mo +0 -0
  194. data/samples/locale/sv/LC_MESSAGES/hello_plural.mo +0 -0
  195. data/samples/locale/sv/LC_MESSAGES/helloglade2.mo +0 -0
  196. data/samples/locale/sv/LC_MESSAGES/hellogtk.mo +0 -0
  197. data/samples/locale/sv/LC_MESSAGES/hellotk.mo +0 -0
  198. data/samples/makemo.rb +3 -0
  199. data/samples/po/de/hello.po +20 -0
  200. data/samples/po/de/hello2.po +28 -0
  201. data/samples/po/de/hello_noop.po +24 -0
  202. data/samples/po/de/hello_plural.po +22 -0
  203. data/samples/po/de/helloglade2.po +27 -0
  204. data/samples/po/de/hellogtk.po +20 -0
  205. data/samples/po/de/hellotk.po +20 -0
  206. data/samples/po/es/hello.po +21 -0
  207. data/samples/po/es/hello2.po +28 -0
  208. data/samples/po/es/hello_noop.po +24 -0
  209. data/samples/po/es/hello_plural.po +23 -0
  210. data/samples/po/es/helloglade2.po +28 -0
  211. data/samples/po/es/hellogtk.po +20 -0
  212. data/samples/po/es/hellotk.po +20 -0
  213. data/samples/po/fr/hello.po +18 -0
  214. data/samples/po/fr/hello2.po +26 -0
  215. data/samples/po/fr/hello_noop.po +22 -0
  216. data/samples/po/fr/hello_plural.po +21 -0
  217. data/samples/po/fr/helloglade2.po +27 -0
  218. data/samples/po/fr/hellogtk.po +18 -0
  219. data/samples/po/fr/hellotk.po +18 -0
  220. data/samples/po/hello.pot +20 -0
  221. data/samples/po/hello2.pot +28 -0
  222. data/samples/po/hello_noop.pot +24 -0
  223. data/samples/po/hello_plural.pot +22 -0
  224. data/samples/po/helloglade2.pot +27 -0
  225. data/samples/po/hellogtk.pot +20 -0
  226. data/samples/po/hellotk.pot +20 -0
  227. data/samples/po/it/hello.po +20 -0
  228. data/samples/po/it/hello2.po +28 -0
  229. data/samples/po/it/hello_noop.po +24 -0
  230. data/samples/po/it/hello_plural.po +24 -0
  231. data/samples/po/it/helloglade2.po +28 -0
  232. data/samples/po/it/hellogtk.po +21 -0
  233. data/samples/po/it/hellotk.po +21 -0
  234. data/samples/po/ja/hello.po +20 -0
  235. data/samples/po/ja/hello2.po +28 -0
  236. data/samples/po/ja/hello_noop.po +23 -0
  237. data/samples/po/ja/hello_plural.po +22 -0
  238. data/samples/po/ja/helloglade2.po +26 -0
  239. data/samples/po/ja/hellogtk.po +19 -0
  240. data/samples/po/ja/hellotk.po +19 -0
  241. data/samples/po/ko/hello.po +19 -0
  242. data/samples/po/ko/hello2.po +27 -0
  243. data/samples/po/ko/hello_noop.po +23 -0
  244. data/samples/po/ko/hello_plural.po +23 -0
  245. data/samples/po/ko/helloglade2.po +29 -0
  246. data/samples/po/ko/hellogtk.po +19 -0
  247. data/samples/po/ko/hellotk.po +20 -0
  248. data/samples/po/pt_BR/hello.po +20 -0
  249. data/samples/po/pt_BR/hello2.po +28 -0
  250. data/samples/po/pt_BR/hello_noop.po +24 -0
  251. data/samples/po/pt_BR/hello_plural.po +23 -0
  252. data/samples/po/pt_BR/helloglade2.po +28 -0
  253. data/samples/po/pt_BR/hellogtk.po +20 -0
  254. data/samples/po/pt_BR/hellotk.po +20 -0
  255. data/samples/po/sv/hello.po +20 -0
  256. data/samples/po/sv/hello2.po +28 -0
  257. data/samples/po/sv/hello_noop.po +24 -0
  258. data/samples/po/sv/hello_plural.po +23 -0
  259. data/samples/po/sv/helloglade2.po +28 -0
  260. data/samples/po/sv/hellogtk.po +20 -0
  261. data/samples/po/sv/hellotk.po +20 -0
  262. data/samples/rails/README +79 -0
  263. data/samples/rails/Rakefile +212 -0
  264. data/samples/rails/app/controllers/application.rb +37 -0
  265. data/samples/rails/app/controllers/blog_controller.rb +62 -0
  266. data/samples/rails/app/helpers/application_helper.rb +3 -0
  267. data/samples/rails/app/helpers/blog_helper.rb +61 -0
  268. data/samples/rails/app/models/article.rb +2 -0
  269. data/samples/rails/app/views/blog/_form.rhtml +25 -0
  270. data/samples/rails/app/views/blog/edit.rhtml +22 -0
  271. data/samples/rails/app/views/blog/list.rhtml +30 -0
  272. data/samples/rails/app/views/blog/new.rhtml +21 -0
  273. data/samples/rails/app/views/blog/show.rhtml +18 -0
  274. data/samples/rails/app/views/layouts/blog.rhtml +36 -0
  275. data/samples/rails/config/database.yml +32 -0
  276. data/samples/rails/config/environment.rb +88 -0
  277. data/samples/rails/config/environments/development.rb +14 -0
  278. data/samples/rails/config/environments/production.rb +8 -0
  279. data/samples/rails/config/environments/test.rb +17 -0
  280. data/samples/rails/config/routes.rb +19 -0
  281. data/samples/rails/db/mysql.sql +8 -0
  282. data/samples/rails/db/postgresql.sql +7 -0
  283. data/samples/rails/locale/de/LC_MESSAGES/blog.mo +0 -0
  284. data/samples/rails/locale/de/LC_MESSAGES/lang_helper.mo +0 -0
  285. data/samples/rails/locale/es/LC_MESSAGES/blog.mo +0 -0
  286. data/samples/rails/locale/es/LC_MESSAGES/lang_helper.mo +0 -0
  287. data/samples/rails/locale/fr/LC_MESSAGES/blog.mo +0 -0
  288. data/samples/rails/locale/fr/LC_MESSAGES/lang_helper.mo +0 -0
  289. data/samples/rails/locale/ja/LC_MESSAGES/blog.mo +0 -0
  290. data/samples/rails/locale/ja/LC_MESSAGES/lang_helper.mo +0 -0
  291. data/samples/rails/locale/ko/LC_MESSAGES/blog.mo +0 -0
  292. data/samples/rails/locale/ko/LC_MESSAGES/lang_helper.mo +0 -0
  293. data/samples/rails/po/blog.pot +90 -0
  294. data/samples/rails/po/de/blog.po +91 -0
  295. data/samples/rails/po/de/lang_helper.po +28 -0
  296. data/samples/rails/po/es/blog.po +90 -0
  297. data/samples/rails/po/es/lang_helper.po +28 -0
  298. data/samples/rails/po/fr/blog.po +89 -0
  299. data/samples/rails/po/fr/lang_helper.po +27 -0
  300. data/samples/rails/po/ja/blog.po +89 -0
  301. data/samples/rails/po/ja/lang_helper.po +28 -0
  302. data/samples/rails/po/ko/blog.po +87 -0
  303. data/samples/rails/po/ko/lang_helper.po +26 -0
  304. data/samples/rails/po/lang_helper.pot +28 -0
  305. data/samples/rails/public/404.html +8 -0
  306. data/samples/rails/public/500.html +8 -0
  307. data/samples/rails/public/dispatch.cgi +10 -0
  308. data/samples/rails/public/dispatch.fcgi +24 -0
  309. data/samples/rails/public/dispatch.rb +10 -0
  310. data/samples/rails/public/favicon.ico +0 -0
  311. data/samples/rails/public/index.html +78 -0
  312. data/samples/rails/public/javascripts/controls.js +446 -0
  313. data/samples/rails/public/javascripts/dragdrop.js +537 -0
  314. data/samples/rails/public/javascripts/effects.js +612 -0
  315. data/samples/rails/public/javascripts/prototype.js +1038 -0
  316. data/samples/rails/public/stylesheets/blog.css +132 -0
  317. data/samples/rails/public/stylesheets/scaffold.css +74 -0
  318. data/samples/rails/script/benchmarker +19 -0
  319. data/samples/rails/script/breakpointer +4 -0
  320. data/samples/rails/script/console +23 -0
  321. data/samples/rails/script/destroy +7 -0
  322. data/samples/rails/script/generate +7 -0
  323. data/samples/rails/script/profiler +34 -0
  324. data/samples/rails/script/runner +29 -0
  325. data/samples/rails/script/server +49 -0
  326. data/samples/rails/test/fixtures/articles.yml +5 -0
  327. data/samples/rails/test/functional/blog_controller_test.rb +88 -0
  328. data/samples/rails/test/test_helper.rb +26 -0
  329. data/samples/rails/test/unit/article_test.rb +14 -0
  330. data/samples/rails/vendor/lang_helper.rb +49 -0
  331. data/setup.rb +1360 -0
  332. data/src/rmsgfmt.ry +233 -0
  333. data/test/README +10 -0
  334. data/test/gettext_runner.rb +18 -0
  335. data/test/gettext_test.rb +202 -0
  336. data/test/gettext_test_parser.rb +80 -0
  337. data/test/locale/cr/LC_MESSAGES/plural.mo +0 -0
  338. data/test/locale/da/LC_MESSAGES/plural.mo +0 -0
  339. data/test/locale/da/LC_MESSAGES/plural_error.mo +0 -0
  340. data/test/locale/fr/LC_MESSAGES/plural.mo +0 -0
  341. data/test/locale/fr/LC_MESSAGES/plural_error.mo +0 -0
  342. data/test/locale/fr/LC_MESSAGES/test1.mo +0 -0
  343. data/test/locale/fr/LC_MESSAGES/test2.mo +0 -0
  344. data/test/locale/ir/LC_MESSAGES/plural.mo +0 -0
  345. data/test/locale/ja/LC_MESSAGES/plural.mo +0 -0
  346. data/test/locale/ja/LC_MESSAGES/plural_error.mo +0 -0
  347. data/test/locale/ja/LC_MESSAGES/test1.mo +0 -0
  348. data/test/locale/ja/LC_MESSAGES/test2.mo +0 -0
  349. data/test/locale/ja/LC_MESSAGES/test_rubyparser.mo +0 -0
  350. data/test/locale/ja/LC_MESSAGES/test_sgettext.mo +0 -0
  351. data/test/locale/la/LC_MESSAGES/plural.mo +0 -0
  352. data/test/locale/li/LC_MESSAGES/plural.mo +0 -0
  353. data/test/locale/po/LC_MESSAGES/plural.mo +0 -0
  354. data/test/locale/sl/LC_MESSAGES/plural.mo +0 -0
  355. data/test/po/cr/plural.po +23 -0
  356. data/test/po/da/plural.po +22 -0
  357. data/test/po/da/plural_error.po +20 -0
  358. data/test/po/fr/plural.po +22 -0
  359. data/test/po/fr/plural_error.po +19 -0
  360. data/test/po/fr/test1.po +23 -0
  361. data/test/po/fr/test2.po +19 -0
  362. data/test/po/ir/plural.po +23 -0
  363. data/test/po/ja/plural.po +22 -0
  364. data/test/po/ja/plural_error.po +20 -0
  365. data/test/po/ja/test1.po +23 -0
  366. data/test/po/ja/test2.po +19 -0
  367. data/test/po/ja/test_rubyparser.po +43 -0
  368. data/test/po/ja/test_sgettext.po +47 -0
  369. data/test/po/la/plural.po +23 -0
  370. data/test/po/li/plural.po +23 -0
  371. data/test/po/po/plural.po +23 -0
  372. data/test/po/sl/plural.po +24 -0
  373. data/test/test.sh +7 -0
  374. data/test/test_erb.rhtml +15 -0
  375. data/test/test_gladeparser.glade +183 -0
  376. data/test/test_rubyparser.rb +77 -0
  377. data/test/test_rubyparser_N.rb +66 -0
  378. data/test/test_rubyparser_n.rb +64 -0
  379. data/test/test_sgettext.rb +48 -0
  380. data/test/testlib1.rb +20 -0
  381. data/test/testlib2.rb +11 -0
  382. data/test/testlib3.rb +12 -0
  383. data/test/testlib4.rb +11 -0
  384. metadata +580 -0
@@ -0,0 +1,80 @@
1
+ =begin
2
+ iconv.rb - Pseudo Iconv module
3
+
4
+ If you don't have iconv but glib2, this library behaves
5
+ as Iconv.iconv.
6
+
7
+ Copyright (C) 2004 Masao Mutoh <mutoh@highway.ne.jp>
8
+
9
+ You may redistribute it and/or modify it under the same
10
+ license terms as Ruby.
11
+
12
+ $Id: iconv.rb,v 1.1.1.1 2005/08/13 02:38:09 mutoh Exp $
13
+ =end
14
+ begin
15
+ require 'iconv.so'
16
+ rescue LoadError
17
+ begin
18
+ require 'glib2'
19
+ module Iconv
20
+ module Failure; end
21
+ class InvalidEncoding < ArgumentError; include Failure; end
22
+ class IllegalSequence < ArgumentError; include Failure; end
23
+ class InvalidCharacter < ArgumentError; include Failure; end
24
+
25
+ def check_glib_version?(major, minor, micro)
26
+ (GLib::BINDING_VERSION[0] > major ||
27
+ (GLib::BINDING_VERSION[0] == major &&
28
+ GLib::BINDING_VERSION[1] > minor) ||
29
+ (GLib::BINDING_VERSION[0] == major &&
30
+ GLib::BINDING_VERSION[1] == minor &&
31
+ GLib::BINDING_VERSION[2] >= micro))
32
+ end
33
+ module_function :check_glib_version?
34
+
35
+ if check_glib_version?(0, 11, 0)
36
+ def iconv(to, from, str)
37
+ begin
38
+ GLib.convert(str, to, from).split(//)
39
+ rescue GLib::ConvertError => e
40
+ case e.code
41
+ when GLib::ConvertError::NO_CONVERSION
42
+ raise InvalidEncoding.new(str)
43
+ when GLib::ConvertError::ILLEGAL_SEQUENCE
44
+ raise IllegalSequence.new(str)
45
+ else
46
+ raise InvalidCharacter.new(str)
47
+ end
48
+ end
49
+ end
50
+ else
51
+ def iconv(to, from, str)
52
+ begin
53
+ GLib.convert(str, to, from).split(//)
54
+ rescue
55
+ raise IllegalSequence.new(str)
56
+ end
57
+ end
58
+ end
59
+ module_function :iconv
60
+ end
61
+ rescue LoadError
62
+ module Iconv
63
+ module_function
64
+ def iconv(to, from, str)
65
+ warn "Iconv was not found." if $DEBUG
66
+ str.split(//)
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ if __FILE__ == $0
73
+ puts Iconv.iconv("EUC-JP", "UTF-8", "ほげ").join
74
+ begin
75
+ puts Iconv.iconv("EUC-JP", "EUC-JP", "ほげ").join
76
+ rescue Iconv::Failure
77
+ puts $!
78
+ puts $!.class
79
+ end
80
+ end
@@ -0,0 +1,71 @@
1
+ =begin
2
+ locale.rb - Locale module
3
+
4
+ Copyright (C) 2002-2005 Masao Mutoh
5
+
6
+ You may redistribute it and/or modify it under the same
7
+ license terms as Ruby.
8
+
9
+ $Id: locale.rb,v 1.3 2005/08/22 16:56:33 mutoh Exp $
10
+ =end
11
+
12
+ begin
13
+ require 'gettext/_locale'
14
+ rescue LoadError
15
+ # For rubygems
16
+ begin
17
+ require '_locale'
18
+ rescue LoadError
19
+ # This is used for installation process(from rake only)
20
+ module Locale
21
+ CTYPE = 0
22
+ NUMERIC = 1
23
+ TIME = 2
24
+ COLLATE = 3
25
+ MONETARY = 4
26
+ MESSAGES = 5
27
+ ALL = 6
28
+
29
+ module_function
30
+ def codeset; "UTF-8"; end
31
+ def set(lc, val); "C"; end
32
+ def __locale_id; [0x00, 0x00]; end
33
+ end
34
+ end
35
+ end
36
+
37
+ if /cygwin|mingw|mswin32|bccwin32/ =~ RUBY_PLATFORM
38
+ require 'gettext/locale_win32'
39
+ else
40
+ require 'gettext/locale_default'
41
+ end
42
+
43
+ module Locale
44
+ def get
45
+ ret = __get
46
+ return ret if ret
47
+
48
+ ret = nil
49
+ ["LC_ALL", "LC_MESSAGES", "LANG"].each do |env|
50
+ ret = ENV[env]
51
+ break if ret
52
+ end
53
+
54
+ ret = "C" unless ret
55
+ ret
56
+ end
57
+
58
+ alias :setlocale :set
59
+ alias :charset :codeset
60
+
61
+ module_function :get, :setlocale, :charset
62
+ end
63
+
64
+ if __FILE__ == $0
65
+ p Locale.set(Locale::CTYPE, "")
66
+ p Locale.set(Locale::CTYPE, nil)
67
+ p Locale.set(Locale::CTYPE, "ja_JP.eucJP")
68
+ p Locale.set(Locale::MESSAGES, nil)
69
+ p Locale.get
70
+ p Locale.codeset
71
+ end
@@ -0,0 +1,35 @@
1
+ =begin
2
+ locale_default.rb - Locale module for Default OS(Unix).
3
+
4
+ Copyright (C) 2002-2005 Masao Mutoh <mutoh@highway.ne.jp>
5
+
6
+ You may redistribute it and/or modify it under the same
7
+ license terms as Ruby.
8
+
9
+ $Id: locale_default.rb,v 1.2 2005/08/20 17:05:34 mutoh Exp $
10
+ =end
11
+
12
+ module Locale
13
+ @@locale_initialized = false
14
+ alias :__set :set
15
+ def __get(lctype = Locale::CTYPE)
16
+ # Initialize CTYPE first lazily.
17
+ # This isn't called when 'gettext/cgi' is required.
18
+ unless @@locale_initialized
19
+ Locale.set(lctype, "")
20
+ @@locale_initialized = true
21
+ end
22
+ set(lctype, nil)
23
+ end
24
+
25
+ def set(lctype, loc)
26
+ ret = __set(lctype, loc)
27
+ if loc and ! @@locale_initialized
28
+ @@locale_initialized = true
29
+ end
30
+ ret
31
+ end
32
+
33
+ module_function :__get, :set, :__set
34
+ end
35
+
@@ -0,0 +1,192 @@
1
+ =begin
2
+ locale_table_win32.rb - Locale table for win32
3
+
4
+ Copyright (C) 2002,2003 Masao Mutoh <mutoh@highway.ne.jp>
5
+
6
+ You may redistribute it and/or modify it under the same
7
+ license terms as Ruby.
8
+
9
+ $Id: locale_table_win32.rb,v 1.1.1.1 2005/08/13 02:38:09 mutoh Exp $
10
+ =end
11
+
12
+ module Locale
13
+ LocaleTable = [
14
+ [0x00, "C"],
15
+ [0x01, "ar",
16
+ [[0x01, "ar_SA"],
17
+ [0x02, "ar_IQ"],
18
+ [0x03, "ar_EG"],
19
+ [0x04, "ar_LY"],
20
+ [0x05, "ar_DZ"],
21
+ [0x06, "ar_MA"],
22
+ [0x07, "ar_TN"],
23
+ [0x08, "ar_OM"],
24
+ [0x09, "ar_YE"],
25
+ [0x0a, "ar_SY"],
26
+ [0x0b, "ar_JO"],
27
+ [0x0c, "ar_LB"],
28
+ [0x0d, "ar_KW"],
29
+ [0x0e, "ar_AE"],
30
+ [0x0f, "ar_BH"],
31
+ [0x10, "ar_QA"]]
32
+ ],
33
+ [0x02, "bg_BG"],
34
+ [0x03, "ca_ES"],
35
+ [0x04, "zh",
36
+ [[0x01, "zh_TW"],
37
+ [0x02, "zh_CN"],
38
+ [0x03, "zh_HK"],
39
+ [0x04, "zh_SG"],
40
+ [0x05, "zh_MO"]]
41
+ ],
42
+ [0x05, "cs_CZ"],
43
+ [0x06, "da_DK"],
44
+ [0x07, "de",
45
+ [[0x01, "de_DE"],
46
+ [0x02, "de_CH"],
47
+ [0x03, "de_AT"],
48
+ [0x04, "de_LU"],
49
+ [0x05, "de_LI"]]
50
+ ],
51
+ [0x08, "el_GR"],
52
+ [0x09, "en",
53
+ [[0x01, "en_US"],
54
+ [0x02, "en_GB"],
55
+ [0x03, "en_AU"],
56
+ [0x04, "en_CA"],
57
+ [0x05, "en_NZ"],
58
+ [0x06, "en_IE"],
59
+ [0x07, "en_ZA"],
60
+ [0x08, "en_JM"],
61
+ [0x09, "en_GD"],
62
+ [0x0a, "en_BZ"],
63
+ [0x0b, "en_TT"],
64
+ [0x0c, "en_PH"],
65
+ [0x0d, "en_ZW"]]
66
+ ],
67
+ [0x0a, "es",
68
+ [[0x01, "es_ES"],
69
+ [0x02, "es_MX"],
70
+ [0x03, "es_ES@modern"],
71
+ [0x04, "es_GT"],
72
+ [0x05, "es_CR"],
73
+ [0x06, "es_PA"],
74
+ [0x07, "es_DO"],
75
+ [0x08, "es_VE"],
76
+ [0x09, "es_CO"],
77
+ [0x0a, "es_PE"],
78
+ [0x0b, "es_AR"],
79
+ [0x0c, "es_EC"],
80
+ [0x0d, "es_CL"],
81
+ [0x0e, "es_UY"],
82
+ [0x0f, "es_PY"],
83
+ [0x10, "es_BO"],
84
+ [0x11, "es_SV"],
85
+ [0x12, "es_HN"],
86
+ [0x13, "es_NI"],
87
+ [0x14, "es_PR"]]
88
+ ],
89
+ [0x0b, "fi_FI"],
90
+ [0x0c, "fr",
91
+ [[0x01, "fr_FR"],
92
+ [0x02, "fr_BE"],
93
+ [0x03, "fr_CA"],
94
+ [0x04, "fr_CH"],
95
+ [0x05, "fr_LU"],
96
+ [0x06, "fr_MC"]]
97
+ ],
98
+ [0x0d, "he_IL"],
99
+ [0x0e, "hu_HU"],
100
+ [0x0f, "is_IS"],
101
+ [0x10, "it",
102
+ [[0x01, "it_IT"],
103
+ [0x02, "it_CH"]]
104
+ ],
105
+ [0x11, "ja_JP"],
106
+ [0x12, "ko_KR"],
107
+ [0x13, "nl",
108
+ [[0x01, "nl_NL"],
109
+ [0x02, "nl_BE"]]
110
+ ],
111
+ [0x14, "no",
112
+ [[0x01, "no_NO"],
113
+ [0x02, "nn_NO"]]
114
+ ],
115
+ [0x15, "pl_PL"],
116
+ [0x16, "pt",
117
+ [[0x01, "pt_PT"],
118
+ [0x02, "pt_BR"]]
119
+ ],
120
+ [0x18, "ro_RO"],
121
+ [0x19, "ru"],
122
+ [0x1a, "hr_HR",
123
+ [[0x02, "sr_YU"],
124
+ [0x03, "sr_YU@cyrillic"]]
125
+ ],
126
+ [0x1b, "sk_SK"],
127
+ [0x1c, "sq_AL"],
128
+ [0x1d, "sv",
129
+ [[0x01, "sv_SE"],
130
+ [0x02, "sv_FI"]]
131
+ ],
132
+ [0x1e, "th_TH"],
133
+ [0x1f, "tr_TR"],
134
+ [0x20, "ur",
135
+ [[0x01, "ur_PK"],
136
+ [0x02, "ur_IN"]]
137
+ ],
138
+ [0x21, "id_ID"],
139
+ [0x22, "uk_UA"],
140
+ [0x23, "be_BY"],
141
+ [0x24, "sl_SI"],
142
+ [0x25, "et_EE"],
143
+ [0x26, "lv_LV"],
144
+ [0x27, "lt_LT"],
145
+ [0x29, "fa_IR"],
146
+ [0x2a, "vi_VN"],
147
+ [0x2b, "hy_AM"],
148
+ [0x2c, "az",
149
+ [[0x01, "az_AZ@cyrillic"],
150
+ [0x02, "az_AZ@latin"]]
151
+ ],
152
+ [0x2d, "eu"],
153
+ [0x2e, "wen_DE"],
154
+ [0x2f, "mk_MK"],
155
+ [0x36, "af_ZA"],
156
+ [0x37, "ka_GE"],
157
+ [0x38, "fo_FO"],
158
+ [0x39, "hi_IN"],
159
+ [0x3e, "ms",
160
+ [[0x01, "ms_MY"],
161
+ [0x02, "ms_BN"]]
162
+ ],
163
+ [0x3f, "kk_KZ"],
164
+ [0x41, "sw"],
165
+ [0x43, "uz",
166
+ [[0x01, "ux_UZ@latin"],
167
+ [0x02, "uz_UZ@cyrillic"]]
168
+ ],
169
+ [0x44, "tt"],
170
+ [0x45, "bn_IN"],
171
+ [0x46, "pa_IN"],
172
+ [0x47, "gu_IN"],
173
+ [0x48, "or_IN"],
174
+ [0x49, "ta"],
175
+ [0x4a, "te_IN"],
176
+ [0x4b, "kn_IN"],
177
+ [0x4c, "ml_IN"],
178
+ [0x4d, "as_IN"],
179
+ [0x4e, "mr_IN"],
180
+ [0x4f, "sa_IN"],
181
+ [0x57, "kok_IN"],
182
+ [0x58, "mni_IN"],
183
+ [0x59, "sd"],
184
+ [0x60, "ks",
185
+ [[0x01, "ks_PK"],
186
+ [0x02, "ks_IN"]]
187
+ ],
188
+ [0x61, "ne",
189
+ [[0x01, "ne_NP"],
190
+ [0x02, "ne_IN"]]
191
+ ]]
192
+ end
@@ -0,0 +1,35 @@
1
+ =begin
2
+ locale_win32.rb - Locale module for win32.
3
+
4
+ Copyright (C) 2002,2003 Masao Mutoh <mutoh@highway.ne.jp>
5
+
6
+ You may redistribute it and/or modify it under the same
7
+ license terms as Ruby.
8
+
9
+ $Id: locale_win32.rb,v 1.2 2005/08/20 17:05:34 mutoh Exp $
10
+ =end
11
+
12
+ require 'gettext/locale_table_win32'
13
+
14
+ module Locale
15
+ def __get
16
+ pri_id, sub_id = __locale_id
17
+ lang = LocaleTable.assoc(pri_id)
18
+ if lang.size == 3
19
+ lang = lang[2].assoc(sub_id)
20
+ end
21
+ lang ? lang[1] : nil
22
+ end
23
+
24
+ unless defined? CTYPE
25
+ CTYPE = 0
26
+ NUMERIC = 1
27
+ TIME = 2
28
+ COLLATE = 3
29
+ MONETARY = 4
30
+ MESSAGES = 5
31
+ ALL = 6
32
+ end
33
+ module_function :__get
34
+ end
35
+
data/lib/gettext/mo.rb ADDED
@@ -0,0 +1,262 @@
1
+ =begin
2
+ mo.rb - A simple class for operating GNU MO file.
3
+
4
+ Copyright (C) 2003-2005 Masao Mutoh
5
+ Copyright (C) 2002 Masahiro Sakai, Masao Mutoh
6
+ Copyright (C) 2001 Masahiro Sakai
7
+
8
+ Masahiro Sakai <s01397ms@sfc.keio.ac.jp>
9
+ Masao Mutoh <mutoh@highway.ne.jp>
10
+
11
+ You can redistribute this file and/or modify it under the same term
12
+ of Ruby. License of Ruby is included with Ruby distribution in
13
+ the file "README".
14
+
15
+ $Id: mo.rb,v 1.1.1.1 2005/08/13 02:38:09 mutoh Exp $
16
+ =end
17
+
18
+ require 'gettext/iconv'
19
+
20
+ class MOFile < Hash
21
+ class InvalidFormat < RuntimeError; end;
22
+
23
+ Header = Struct.new(:magic,
24
+ :revision,
25
+ :nstrings,
26
+ :orig_table_offset,
27
+ :translated_table_offset,
28
+ :hash_table_size,
29
+ :hash_table_offset)
30
+
31
+ MAGIC_BIG_ENDIAN = "\x95\x04\x12\xde"
32
+ MAGIC_LITTLE_ENDIAN = "\xde\x12\x04\x95"
33
+
34
+ def self.open(arg = nil, output_charset = nil)
35
+ result = self.new(output_charset)
36
+ case arg
37
+ when String
38
+ result.load_from_file(arg)
39
+ when IO
40
+ result.load_from_stream(arg)
41
+ end
42
+ result
43
+ end
44
+
45
+ def initialize(output_charset = nil)
46
+ @little_endian = true
47
+ @output_charset = output_charset
48
+ super()
49
+ end
50
+
51
+ def load_from_stream(io)
52
+ magic = io.read(4)
53
+ case magic
54
+ when MAGIC_BIG_ENDIAN
55
+ @little_endian = false
56
+ when MAGIC_LITTLE_ENDIAN
57
+ @little_endian = true
58
+ else
59
+ raise InvalidFormat.new(sprintf("Unknown signature %s", magic.dump))
60
+ end
61
+
62
+ header = Header.new(magic, *(io.read(4 * 6).unpack(@little_endian ? 'V6' : 'N6')))
63
+ raise InvalidFormat.new(sprintf("file format revision %d isn't supported", header.revision)) if header.revision > 0
64
+
65
+ io.pos = header.orig_table_offset
66
+ orig_table_data = io.read((4 * 2) * header.nstrings).unpack(@little_endian ? 'V*' : 'N*')
67
+
68
+ io.pos = header.translated_table_offset
69
+ trans_table_data = io.read((4 * 2) * header.nstrings).unpack(@little_endian ? 'V*' : 'N*')
70
+
71
+ original_strings = Array.new(header.nstrings)
72
+ for i in 0...header.nstrings
73
+ io.pos = orig_table_data[i * 2 + 1]
74
+ original_strings[i] = io.read(orig_table_data[i * 2 + 0])
75
+ end
76
+
77
+ clear
78
+ for i in 0...header.nstrings
79
+ io.pos = trans_table_data[i * 2 + 1]
80
+ str = io.read(trans_table_data[i * 2 + 0])
81
+
82
+ if original_strings[i] == ""
83
+ if str
84
+ @charset = nil
85
+ @nplurals = nil
86
+ @plural = nil
87
+ str.each_line{|line|
88
+ if /^Content-Type:/i =~ line and /charset=((?:\w|-)+)/i =~ line
89
+ @charset = $1
90
+ elsif /^Plural-Forms:\s*nplurals\s*\=\s*(\d*);\s*plural\s*\=\s*([^;]*)\n?/ =~ line
91
+ @nplurals = $1
92
+ @plural = $2
93
+ end
94
+ break if @charset and @nplurals
95
+ }
96
+ @nplurals = "1" unless @nplurals
97
+ @plural = "0" unless @plural
98
+ end
99
+ else
100
+ if @output_charset
101
+ begin
102
+ str = Iconv.iconv(@output_charset, @charset, str).join if @charset
103
+ rescue Iconv::Failure
104
+ if $DEBUG
105
+ $stderr.print "@charset = ", @charset, "\n"
106
+ $stderr.print "@output_charset = ", @output_charset, "\n"
107
+ $stderr.print "msgid = ", original_strings[i], "\n"
108
+ $stderr.print "msgstr = ", str, "\n"
109
+ end
110
+ end
111
+ end
112
+ end
113
+ self[original_strings[i]] = str
114
+ end
115
+ self
116
+ end
117
+
118
+ # From gettext-0.12.1/gettext-tools/lib/hash.c
119
+ def prime?(candidate)
120
+ divn = 3
121
+ sq = divn * divn
122
+
123
+ while (sq < candidate && candidate % divn != 0)
124
+ divn += 1
125
+ sq += 4 * divn
126
+ divn += 1
127
+ end
128
+ candidate % divn != 0
129
+ end
130
+
131
+ # From gettext-0.12.1/gettext-tools/lib/hash.c
132
+ def next_prime(seed)
133
+ seed |= 1
134
+ while (! prime?(seed))
135
+ seed += 2
136
+ end
137
+ seed
138
+ end
139
+
140
+ # From gettext-0.12.1/gettext-runtime/intl/hash-string.h
141
+ # Defines the so called `hashpjw' function by P.J. Weinberger
142
+ # [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
143
+ # 1986, 1987 Bell Telephone Laboratories, Inc.]
144
+ HASHWORDBITS = 32
145
+ def hash_string(str)
146
+ hval = 0
147
+ i = 0
148
+ str.each_byte do |b|
149
+ break if b == '\0'
150
+ hval <<= 4
151
+ hval += b.to_i
152
+ g = hval & (0xf << (HASHWORDBITS - 4))
153
+ if (g != 0)
154
+ hval ^= g >> (HASHWORDBITS - 8)
155
+ hval ^= g
156
+ end
157
+ end
158
+ hval
159
+ end
160
+
161
+ def save_to_stream(io)
162
+ #Save data as little endian format.
163
+ header_size = 4 * 7
164
+ table_size = 4 * 2 * size
165
+
166
+ hash_table_size = next_prime((size * 4) / 3)
167
+ hash_table_size = 3 if hash_table_size <= 2
168
+ header = Header.new(
169
+ MAGIC_LITTLE_ENDIAN, # magic
170
+ 0, # revision
171
+ size, # nstrings
172
+ header_size, # orig_table_offset
173
+ header_size + table_size, # translated_table_offset
174
+ hash_table_size, # hash_table_size
175
+ header_size + table_size * 2 # hash_table_offset
176
+ )
177
+ io.write(header.to_a.pack('a4V*'))
178
+
179
+ ary = to_a
180
+ ary.sort!{|a, b| a[0] <=> b[0]} # sort by original string
181
+
182
+ pos = header.hash_table_size * 4 + header.hash_table_offset
183
+
184
+ orig_table_data = Array.new()
185
+ ary.each{|item, _|
186
+ orig_table_data.push(item.size)
187
+ orig_table_data.push(pos)
188
+ pos += item.size + 1 # +1 is <NUL>
189
+ }
190
+ io.write(orig_table_data.pack('V*'))
191
+
192
+ trans_table_data = Array.new()
193
+ ary.each{|_, item|
194
+ trans_table_data.push(item.size)
195
+ trans_table_data.push(pos)
196
+ pos += item.size + 1 # +1 is <NUL>
197
+ }
198
+ io.write(trans_table_data.pack('V*'))
199
+
200
+ hash_tab = Array.new(hash_table_size)
201
+ j = 0
202
+ ary[0...size].each {|key, _|
203
+ hash_val = hash_string(key)
204
+ idx = hash_val % hash_table_size
205
+ if hash_tab[idx] != nil
206
+ incr = 1 + (hash_val % (hash_table_size - 2))
207
+ begin
208
+ if (idx >= hash_table_size - incr)
209
+ idx -= hash_table_size - incr
210
+ else
211
+ idx += incr
212
+ end
213
+ end until (hash_tab[idx] == nil)
214
+ end
215
+ hash_tab[idx] = j + 1
216
+ j += 1
217
+ }
218
+ hash_tab.collect!{|i| i ? i : 0}
219
+
220
+ io.write(hash_tab.pack('V*'))
221
+
222
+ ary.each{|item, _| io.write(item); io.write("\0") }
223
+ ary.each{|_, item| io.write(item); io.write("\0") }
224
+
225
+ self
226
+ end
227
+
228
+ def load_from_file(filename)
229
+ File.open(filename, 'rb'){|f| load_from_stream(f)}
230
+ end
231
+
232
+ def save_to_file(filename)
233
+ File.open(filename, 'wb'){|f| save_to_stream(f)}
234
+ end
235
+
236
+ attr_accessor :little_endian
237
+ attr_reader :charset, :nplurals, :plural
238
+ end
239
+
240
+
241
+ # Test
242
+
243
+ if $0 == __FILE__
244
+ if (ARGV.include? "-h") or (ARGV.include? "--help")
245
+ STDERR.puts("mo.rb [filename.mo ...]")
246
+ exit
247
+ end
248
+
249
+ ARGV.each{ |item|
250
+ mo = MOFile.open(item)
251
+ puts "------------------------------------------------------------------"
252
+ puts "charset = \"#{mo.charset}\""
253
+ puts "nplurals = \"#{mo.nplurals}\""
254
+ puts "plural = \"#{mo.plural}\""
255
+ puts "------------------------------------------------------------------"
256
+ mo.each do |key, value|
257
+ puts "original message = \"#{key}\""
258
+ puts "translated message = \"#{value}\""
259
+ puts "--------------------------------------------------------------------"
260
+ end
261
+ }
262
+ end