grosser-gettext 2.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.
- data/ChangeLog +2014 -0
- data/README.rdoc +172 -0
- data/Rakefile +192 -0
- data/bin/rgettext +24 -0
- data/bin/rmsgfmt +24 -0
- data/bin/rmsgmerge +24 -0
- data/gettext.gemspec +39 -0
- data/lib/gettext.rb +263 -0
- data/lib/gettext/cgi.rb +40 -0
- data/lib/gettext/class_info.rb +55 -0
- data/lib/gettext/core_ext/iconv.rb +109 -0
- data/lib/gettext/core_ext/string.rb +63 -0
- data/lib/gettext/mofile.rb +320 -0
- data/lib/gettext/parser/erb.rb +50 -0
- data/lib/gettext/parser/glade.rb +99 -0
- data/lib/gettext/parser/ruby.rb +170 -0
- data/lib/gettext/poparser.rb +332 -0
- data/lib/gettext/textdomain.rb +225 -0
- data/lib/gettext/textdomain_manager.rb +218 -0
- data/lib/gettext/tools.rb +177 -0
- data/lib/gettext/tools/rgettext.rb +275 -0
- data/lib/gettext/tools/rmsgfmt.rb +84 -0
- data/lib/gettext/tools/rmsgmerge.rb +505 -0
- data/lib/gettext/utils.rb +39 -0
- data/lib/gettext/version.rb +12 -0
- data/po/bg/rgettext.po +150 -0
- data/po/bs/rgettext.po +151 -0
- data/po/ca/rgettext.po +149 -0
- data/po/cs/rgettext.po +152 -0
- data/po/de/#rails.po# +175 -0
- data/po/de/rgettext.po +157 -0
- data/po/el/rgettext.po +148 -0
- data/po/eo/rgettext.po +149 -0
- data/po/es/rgettext.po +150 -0
- data/po/et/rgettext.po +147 -0
- data/po/fr/rgettext.po +153 -0
- data/po/hr/rgettext.po +151 -0
- data/po/hu/rgettext.po +149 -0
- data/po/it/rgettext.po +150 -0
- data/po/ja/rails.po.old +150 -0
- data/po/ja/rgettext.po +149 -0
- data/po/ko/rgettext.po +149 -0
- data/po/lv/rgettext.po +150 -0
- data/po/nb/rgettext.po +151 -0
- data/po/nl/rgettext.po +150 -0
- data/po/pt_BR/rgettext.po +152 -0
- data/po/rgettext.pot +141 -0
- data/po/ru/rgettext.po +151 -0
- data/po/sr/rgettext.po +150 -0
- data/po/sv/rgettext.po +143 -0
- data/po/ua/rgettext.po +155 -0
- data/po/vi/rgettext.po +148 -0
- data/po/zh/rgettext.po +149 -0
- data/po/zh_TW/rgettext.po +148 -0
- data/samples/README +16 -0
- data/samples/cgi/README +43 -0
- data/samples/cgi/Rakefile +27 -0
- data/samples/cgi/cookie.cgi +64 -0
- data/samples/cgi/gettext.css +116 -0
- data/samples/cgi/helloerb.rhtml +28 -0
- data/samples/cgi/helloerb1.cgi +58 -0
- data/samples/cgi/helloerb2.cgi +51 -0
- data/samples/cgi/hellolib.rb +20 -0
- data/samples/cgi/http.rb +51 -0
- data/samples/cgi/index.cgi +111 -0
- data/samples/cgi/other.rhtml +20 -0
- data/samples/cgi/po/bg/helloerb1.po +59 -0
- data/samples/cgi/po/bg/helloerb2.po +51 -0
- data/samples/cgi/po/bg/hellolib.po +23 -0
- data/samples/cgi/po/bg/main.po +83 -0
- data/samples/cgi/po/bs/helloerb1.po +59 -0
- data/samples/cgi/po/bs/helloerb2.po +51 -0
- data/samples/cgi/po/bs/hellolib.po +23 -0
- data/samples/cgi/po/bs/main.po +83 -0
- data/samples/cgi/po/ca/helloerb1.po +59 -0
- data/samples/cgi/po/ca/helloerb2.po +51 -0
- data/samples/cgi/po/ca/hellolib.po +23 -0
- data/samples/cgi/po/ca/main.po +83 -0
- data/samples/cgi/po/cs/helloerb1.po +61 -0
- data/samples/cgi/po/cs/helloerb2.po +52 -0
- data/samples/cgi/po/cs/hellolib.po +25 -0
- data/samples/cgi/po/cs/main.po +85 -0
- data/samples/cgi/po/de/helloerb1.po +61 -0
- data/samples/cgi/po/de/helloerb2.po +52 -0
- data/samples/cgi/po/de/hellolib.po +24 -0
- data/samples/cgi/po/de/main.po +86 -0
- data/samples/cgi/po/el/helloerb1.po +60 -0
- data/samples/cgi/po/el/helloerb2.po +51 -0
- data/samples/cgi/po/el/hellolib.po +23 -0
- data/samples/cgi/po/el/main.po +84 -0
- data/samples/cgi/po/eo/helloerb1.po +60 -0
- data/samples/cgi/po/eo/helloerb2.po +52 -0
- data/samples/cgi/po/eo/hellolib.po +24 -0
- data/samples/cgi/po/eo/main.po +84 -0
- data/samples/cgi/po/es/helloerb1.po +59 -0
- data/samples/cgi/po/es/helloerb2.po +50 -0
- data/samples/cgi/po/es/hellolib.po +22 -0
- data/samples/cgi/po/es/main.po +83 -0
- data/samples/cgi/po/fr/helloerb1.po +59 -0
- data/samples/cgi/po/fr/helloerb2.po +51 -0
- data/samples/cgi/po/fr/hellolib.po +22 -0
- data/samples/cgi/po/fr/main.po +85 -0
- data/samples/cgi/po/helloerb1.pot +60 -0
- data/samples/cgi/po/helloerb2.pot +52 -0
- data/samples/cgi/po/hellolib.pot +24 -0
- data/samples/cgi/po/hr/helloerb1.po +59 -0
- data/samples/cgi/po/hr/helloerb2.po +51 -0
- data/samples/cgi/po/hr/hellolib.po +23 -0
- data/samples/cgi/po/hr/main.po +83 -0
- data/samples/cgi/po/hu/helloerb1.po +59 -0
- data/samples/cgi/po/hu/helloerb2.po +51 -0
- data/samples/cgi/po/hu/hellolib.po +23 -0
- data/samples/cgi/po/hu/main.po +82 -0
- data/samples/cgi/po/it/helloerb1.po +60 -0
- data/samples/cgi/po/it/helloerb2.po +52 -0
- data/samples/cgi/po/it/hellolib.po +24 -0
- data/samples/cgi/po/it/main.po +84 -0
- data/samples/cgi/po/ja/helloerb1.po +60 -0
- data/samples/cgi/po/ja/helloerb2.po +52 -0
- data/samples/cgi/po/ja/hellolib.po +24 -0
- data/samples/cgi/po/ja/main.po +85 -0
- data/samples/cgi/po/ko/helloerb1.po +59 -0
- data/samples/cgi/po/ko/helloerb2.po +51 -0
- data/samples/cgi/po/ko/hellolib.po +23 -0
- data/samples/cgi/po/ko/main.po +84 -0
- data/samples/cgi/po/lv/helloerb1.po +65 -0
- data/samples/cgi/po/lv/helloerb2.po +52 -0
- data/samples/cgi/po/lv/hellolib.po +24 -0
- data/samples/cgi/po/lv/main.po +77 -0
- data/samples/cgi/po/main.pot +80 -0
- data/samples/cgi/po/nb/helloerb1.po +60 -0
- data/samples/cgi/po/nb/helloerb2.po +52 -0
- data/samples/cgi/po/nb/hellolib.po +24 -0
- data/samples/cgi/po/nb/main.po +84 -0
- data/samples/cgi/po/nl/helloerb1.po +61 -0
- data/samples/cgi/po/nl/helloerb2.po +52 -0
- data/samples/cgi/po/nl/hellolib.po +24 -0
- data/samples/cgi/po/nl/main.po +86 -0
- data/samples/cgi/po/pt_BR/helloerb1.po +59 -0
- data/samples/cgi/po/pt_BR/helloerb2.po +51 -0
- data/samples/cgi/po/pt_BR/hellolib.po +23 -0
- data/samples/cgi/po/pt_BR/main.po +84 -0
- data/samples/cgi/po/ru/helloerb1.po +58 -0
- data/samples/cgi/po/ru/helloerb2.po +50 -0
- data/samples/cgi/po/ru/hellolib.po +22 -0
- data/samples/cgi/po/ru/main.po +82 -0
- data/samples/cgi/po/sr/helloerb1.po +60 -0
- data/samples/cgi/po/sr/helloerb2.po +52 -0
- data/samples/cgi/po/sr/hellolib.po +24 -0
- data/samples/cgi/po/sr/main.po +80 -0
- data/samples/cgi/po/ua/helloerb1.po +62 -0
- data/samples/cgi/po/ua/helloerb2.po +54 -0
- data/samples/cgi/po/ua/hellolib.po +26 -0
- data/samples/cgi/po/ua/main.po +84 -0
- data/samples/cgi/po/vi/helloerb1.po +65 -0
- data/samples/cgi/po/vi/helloerb2.po +52 -0
- data/samples/cgi/po/vi/hellolib.po +24 -0
- data/samples/cgi/po/vi/main.po +77 -0
- data/samples/cgi/po/zh/helloerb1.po +60 -0
- data/samples/cgi/po/zh/helloerb2.po +52 -0
- data/samples/cgi/po/zh/hellolib.po +24 -0
- data/samples/cgi/po/zh/main.po +80 -0
- data/samples/cgi/po/zh_TW/helloerb1.po +67 -0
- data/samples/cgi/po/zh_TW/helloerb2.po +54 -0
- data/samples/cgi/po/zh_TW/hellolib.po +26 -0
- data/samples/cgi/po/zh_TW/main.po +79 -0
- data/samples/hello.rb +36 -0
- data/samples/hello2.rb +23 -0
- data/samples/hello_glade2.glade +70 -0
- data/samples/hello_glade2.rb +25 -0
- data/samples/hello_gtk2.rb +27 -0
- data/samples/hello_noop.rb +31 -0
- data/samples/hello_plural.rb +26 -0
- data/samples/hello_tk.rb +19 -0
- data/samples/makemo.rb +4 -0
- data/samples/po/bg/hello.po +24 -0
- data/samples/po/bg/hello2.po +31 -0
- data/samples/po/bg/hello_glade2.po +31 -0
- data/samples/po/bg/hello_gtk.po +23 -0
- data/samples/po/bg/hello_noop.po +27 -0
- data/samples/po/bg/hello_plural.po +25 -0
- data/samples/po/bg/hello_tk.po +23 -0
- data/samples/po/bs/hello.po +23 -0
- data/samples/po/bs/hello2.po +31 -0
- data/samples/po/bs/hello_glade2.po +31 -0
- data/samples/po/bs/hello_gtk.po +23 -0
- data/samples/po/bs/hello_noop.po +27 -0
- data/samples/po/bs/hello_plural.po +26 -0
- data/samples/po/bs/hello_tk.po +23 -0
- data/samples/po/ca/hello.po +23 -0
- data/samples/po/ca/hello2.po +31 -0
- data/samples/po/ca/hello_glade2.po +31 -0
- data/samples/po/ca/hello_gtk.po +23 -0
- data/samples/po/ca/hello_noop.po +27 -0
- data/samples/po/ca/hello_plural.po +25 -0
- data/samples/po/ca/hello_tk.po +23 -0
- data/samples/po/cs/hello.po +23 -0
- data/samples/po/cs/hello2.po +31 -0
- data/samples/po/cs/hello_glade2.po +37 -0
- data/samples/po/cs/hello_gtk.po +23 -0
- data/samples/po/cs/hello_noop.po +27 -0
- data/samples/po/cs/hello_plural.po +26 -0
- data/samples/po/cs/hello_tk.po +23 -0
- data/samples/po/de/hello.po +20 -0
- data/samples/po/de/hello2.po +28 -0
- data/samples/po/de/hello_glade2.po +27 -0
- data/samples/po/de/hello_gtk.po +20 -0
- data/samples/po/de/hello_noop.po +24 -0
- data/samples/po/de/hello_plural.po +25 -0
- data/samples/po/de/hello_tk.po +20 -0
- data/samples/po/el/hello.po +23 -0
- data/samples/po/el/hello2.po +31 -0
- data/samples/po/el/hello_glade2.po +31 -0
- data/samples/po/el/hello_gtk.po +22 -0
- data/samples/po/el/hello_noop.po +27 -0
- data/samples/po/el/hello_plural.po +25 -0
- data/samples/po/el/hello_tk.po +23 -0
- data/samples/po/eo/hello.po +23 -0
- data/samples/po/eo/hello2.po +31 -0
- data/samples/po/eo/hello_glade2.po +32 -0
- data/samples/po/eo/hello_gtk.po +23 -0
- data/samples/po/eo/hello_noop.po +27 -0
- data/samples/po/eo/hello_plural.po +26 -0
- data/samples/po/eo/hello_tk.po +24 -0
- data/samples/po/es/hello.po +21 -0
- data/samples/po/es/hello2.po +28 -0
- data/samples/po/es/hello_glade2.po +28 -0
- data/samples/po/es/hello_gtk.po +20 -0
- data/samples/po/es/hello_noop.po +24 -0
- data/samples/po/es/hello_plural.po +23 -0
- data/samples/po/es/hello_tk.po +20 -0
- data/samples/po/fr/hello.po +18 -0
- data/samples/po/fr/hello2.po +26 -0
- data/samples/po/fr/hello_glade2.po +27 -0
- data/samples/po/fr/hello_gtk.po +18 -0
- data/samples/po/fr/hello_noop.po +22 -0
- data/samples/po/fr/hello_plural.po +21 -0
- data/samples/po/fr/hello_tk.po +18 -0
- data/samples/po/hello.pot +23 -0
- data/samples/po/hello2.pot +31 -0
- data/samples/po/hello_glade2.pot +32 -0
- data/samples/po/hello_gtk.pot +23 -0
- data/samples/po/hello_noop.pot +27 -0
- data/samples/po/hello_plural.pot +26 -0
- data/samples/po/hello_tk.pot +24 -0
- data/samples/po/hr/hello.po +23 -0
- data/samples/po/hr/hello2.po +31 -0
- data/samples/po/hr/hello_glade2.po +31 -0
- data/samples/po/hr/hello_gtk.po +23 -0
- data/samples/po/hr/hello_noop.po +27 -0
- data/samples/po/hr/hello_plural.po +26 -0
- data/samples/po/hr/hello_tk.po +23 -0
- data/samples/po/hu/hello.po +22 -0
- data/samples/po/hu/hello2.po +30 -0
- data/samples/po/hu/hello_glade2.po +31 -0
- data/samples/po/hu/hello_gtk.po +22 -0
- data/samples/po/hu/hello_noop.po +26 -0
- data/samples/po/hu/hello_plural.po +25 -0
- data/samples/po/hu/hello_tk.po +23 -0
- data/samples/po/it/hello.po +20 -0
- data/samples/po/it/hello2.po +28 -0
- data/samples/po/it/hello_glade2.po +28 -0
- data/samples/po/it/hello_gtk.po +21 -0
- data/samples/po/it/hello_noop.po +24 -0
- data/samples/po/it/hello_plural.po +23 -0
- data/samples/po/it/hello_tk.po +21 -0
- data/samples/po/ja/hello.po +20 -0
- data/samples/po/ja/hello2.po +28 -0
- data/samples/po/ja/hello_glade2.po +26 -0
- data/samples/po/ja/hello_gtk.po +19 -0
- data/samples/po/ja/hello_noop.po +23 -0
- data/samples/po/ja/hello_plural.po +21 -0
- data/samples/po/ja/hello_tk.po +19 -0
- data/samples/po/ko/hello.po +18 -0
- data/samples/po/ko/hello2.po +26 -0
- data/samples/po/ko/hello_glade2.po +29 -0
- data/samples/po/ko/hello_gtk.po +18 -0
- data/samples/po/ko/hello_noop.po +22 -0
- data/samples/po/ko/hello_plural.po +25 -0
- data/samples/po/ko/hello_tk.po +19 -0
- data/samples/po/lv/hello.po +24 -0
- data/samples/po/lv/hello2.po +32 -0
- data/samples/po/lv/hello_glade2.po +38 -0
- data/samples/po/lv/hello_gtk.po +24 -0
- data/samples/po/lv/hello_noop.po +28 -0
- data/samples/po/lv/hello_plural.po +26 -0
- data/samples/po/lv/hello_tk.po +24 -0
- data/samples/po/nb/hello.po +23 -0
- data/samples/po/nb/hello2.po +31 -0
- data/samples/po/nb/hello_glade2.po +31 -0
- data/samples/po/nb/hello_gtk.po +23 -0
- data/samples/po/nb/hello_noop.po +27 -0
- data/samples/po/nb/hello_plural.po +26 -0
- data/samples/po/nb/hello_tk.po +24 -0
- data/samples/po/nl/hello.po +24 -0
- data/samples/po/nl/hello2.po +32 -0
- data/samples/po/nl/hello_glade2.po +31 -0
- data/samples/po/nl/hello_gtk.po +24 -0
- data/samples/po/nl/hello_noop.po +28 -0
- data/samples/po/nl/hello_plural.po +25 -0
- data/samples/po/nl/hello_tk.po +24 -0
- data/samples/po/pt_BR/hello.po +21 -0
- data/samples/po/pt_BR/hello2.po +29 -0
- data/samples/po/pt_BR/hello_glade2.po +29 -0
- data/samples/po/pt_BR/hello_gtk.po +21 -0
- data/samples/po/pt_BR/hello_noop.po +25 -0
- data/samples/po/pt_BR/hello_plural.po +23 -0
- data/samples/po/pt_BR/hello_tk.po +21 -0
- data/samples/po/ru/hello.po +22 -0
- data/samples/po/ru/hello2.po +30 -0
- data/samples/po/ru/hello_glade2.po +30 -0
- data/samples/po/ru/hello_gtk.po +22 -0
- data/samples/po/ru/hello_noop.po +26 -0
- data/samples/po/ru/hello_plural.po +28 -0
- data/samples/po/ru/hello_tk.po +22 -0
- data/samples/po/sr/hello.po +22 -0
- data/samples/po/sr/hello2.po +30 -0
- data/samples/po/sr/hello_glade2.po +32 -0
- data/samples/po/sr/hello_gtk.po +22 -0
- data/samples/po/sr/hello_noop.po +26 -0
- data/samples/po/sr/hello_plural.po +26 -0
- data/samples/po/sr/hello_tk.po +24 -0
- data/samples/po/sv/hello.po +20 -0
- data/samples/po/sv/hello2.po +28 -0
- data/samples/po/sv/hello_glade2.po +28 -0
- data/samples/po/sv/hello_gtk.po +20 -0
- data/samples/po/sv/hello_noop.po +24 -0
- data/samples/po/sv/hello_plural.po +23 -0
- data/samples/po/sv/hello_tk.po +20 -0
- data/samples/po/test.rb +11 -0
- data/samples/po/ua/hello.po +22 -0
- data/samples/po/ua/hello2.po +30 -0
- data/samples/po/ua/hello_glade2.po +34 -0
- data/samples/po/ua/hello_gtk.po +22 -0
- data/samples/po/ua/hello_noop.po +26 -0
- data/samples/po/ua/hello_plural.po +29 -0
- data/samples/po/ua/hello_tk.po +26 -0
- data/samples/po/vi/hello.po +23 -0
- data/samples/po/vi/hello2.po +31 -0
- data/samples/po/vi/hello_glade2.po +38 -0
- data/samples/po/vi/hello_gtk.po +23 -0
- data/samples/po/vi/hello_noop.po +27 -0
- data/samples/po/vi/hello_plural.po +26 -0
- data/samples/po/vi/hello_tk.po +24 -0
- data/samples/po/zh/hello.po +23 -0
- data/samples/po/zh/hello2.po +31 -0
- data/samples/po/zh/hello_glade2.po +31 -0
- data/samples/po/zh/hello_gtk.po +23 -0
- data/samples/po/zh/hello_noop.po +27 -0
- data/samples/po/zh/hello_plural.po +25 -0
- data/samples/po/zh/hello_tk.po +23 -0
- data/samples/po/zh_TW/hello.po +26 -0
- data/samples/po/zh_TW/hello2.po +34 -0
- data/samples/po/zh_TW/hello_glade2.po +40 -0
- data/samples/po/zh_TW/hello_gtk.po +25 -0
- data/samples/po/zh_TW/hello_noop.po +30 -0
- data/samples/po/zh_TW/hello_plural.po +28 -0
- data/samples/po/zh_TW/hello_tk.po +26 -0
- data/src/poparser.ry +198 -0
- data/test/README +1 -0
- data/test/Rakefile +19 -0
- data/test/po/cr/plural.po +23 -0
- data/test/po/da/plural.po +22 -0
- data/test/po/da/plural_error.po +21 -0
- data/test/po/fr/plural.po +28 -0
- data/test/po/fr/plural_error.po +20 -0
- data/test/po/fr/test1.po +23 -0
- data/test/po/fr/test2.po +19 -0
- data/test/po/fr/test6.po +23 -0
- data/test/po/ir/plural.po +23 -0
- data/test/po/ja/npgettext.po +46 -0
- data/test/po/ja/nsgettext.po +65 -0
- data/test/po/ja/pgettext.po +41 -0
- data/test/po/ja/plural.po +28 -0
- data/test/po/ja/plural_error.po +20 -0
- data/test/po/ja/rubyparser.po +43 -0
- data/test/po/ja/sgettext.po +47 -0
- data/test/po/ja/test1.po +23 -0
- data/test/po/ja/test2.po +19 -0
- data/test/po/ja/test6.po +23 -0
- data/test/po/la/plural.po +23 -0
- data/test/po/la/plural_error.po +21 -0
- data/test/po/li/plural.po +23 -0
- data/test/po/po/plural.po +23 -0
- data/test/po/sl/plural.po +24 -0
- data/test/test_class_info.rb +80 -0
- data/test/test_gettext.rb +274 -0
- data/test/test_parser.rb +113 -0
- data/test/test_string.rb +14 -0
- data/test/test_textdomain.rb +25 -0
- data/test/test_textdomain_multi.rb +69 -0
- data/test/test_textdomain_toplevel.rb +42 -0
- data/test/testlib/N_.rb +66 -0
- data/test/testlib/erb.rhtml +15 -0
- data/test/testlib/erb.rxml +16 -0
- data/test/testlib/gettext.rb +96 -0
- data/test/testlib/gladeparser.glade +183 -0
- data/test/testlib/helper.rb +11 -0
- data/test/testlib/multi_textdomain.rb +119 -0
- data/test/testlib/ngettext.rb +74 -0
- data/test/testlib/npgettext.rb +31 -0
- data/test/testlib/nsgettext.rb +42 -0
- data/test/testlib/pgettext.rb +31 -0
- data/test/testlib/sgettext.rb +46 -0
- data/test/testlib/simple.rb +14 -0
- metadata +509 -0
data/lib/gettext.rb
ADDED
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
gem 'locale', '>=0.9'
|
|
2
|
+
require 'locale'
|
|
3
|
+
|
|
4
|
+
require 'gettext/version'
|
|
5
|
+
require 'gettext/textdomain_manager'
|
|
6
|
+
|
|
7
|
+
module GetText
|
|
8
|
+
|
|
9
|
+
def self.included(mod) #:nodoc:
|
|
10
|
+
mod.extend self
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module_function
|
|
14
|
+
# bindtextdomain(domainname, options = {})
|
|
15
|
+
#
|
|
16
|
+
# Bind a textdomain(%{path}/%{locale}/LC_MESSAGES/%{domainname}.mo) to
|
|
17
|
+
# your program.
|
|
18
|
+
# Normally, the texdomain scope becomes the class/module(and parent
|
|
19
|
+
# classes/included modules).
|
|
20
|
+
#
|
|
21
|
+
# * domainname: the textdomain name.
|
|
22
|
+
# * options: options as an Hash.
|
|
23
|
+
# * :path - the path to the mo-files. When the value is nil, it will search default paths such as
|
|
24
|
+
# /usr/share/locale, /usr/local/share/locale)
|
|
25
|
+
# * :supported_language_tags - an Array of the supported language tags for this textdomain.
|
|
26
|
+
# * :output_charset - The output charset. Same with GetText.set_output_charset. Usually, L10n
|
|
27
|
+
# library doesn't use this option. Application may use this once.
|
|
28
|
+
# * Returns: the GetText::TextDomainManager.
|
|
29
|
+
#
|
|
30
|
+
def bindtextdomain(domainname, *args)
|
|
31
|
+
if args[0].kind_of? Hash
|
|
32
|
+
options = args[0]
|
|
33
|
+
else
|
|
34
|
+
# for backward compatibility.
|
|
35
|
+
options = {}
|
|
36
|
+
options[:path] = args[0] if args[0]
|
|
37
|
+
options[:output_charset] = args[2] if args[2]
|
|
38
|
+
end
|
|
39
|
+
TextDomainManager.bind_to(self, domainname, options)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Includes GetText module and bind a textdomain to a class.
|
|
43
|
+
# * klass: the target ruby class.
|
|
44
|
+
# * domainname: the textdomain name.
|
|
45
|
+
# * options: options as an Hash. See GetText.bindtextdomain.
|
|
46
|
+
def bindtextdomain_to(klass, domainname, options = {})
|
|
47
|
+
ret = nil
|
|
48
|
+
klass.module_eval {
|
|
49
|
+
include GetText
|
|
50
|
+
ret = bindtextdomain(domainname, options)
|
|
51
|
+
}
|
|
52
|
+
ret
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def textdomain(domainname) #:nodoc:
|
|
56
|
+
warn "GetText.textdomain is deprecated. Call bindtextdomain instead."
|
|
57
|
+
bindtextdomain(domainname)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# call-seq:
|
|
61
|
+
# gettext(msgid)
|
|
62
|
+
# _(msgid)
|
|
63
|
+
#
|
|
64
|
+
# Translates msgid and return the message.
|
|
65
|
+
# This doesn't make a copy of the message.
|
|
66
|
+
#
|
|
67
|
+
# You need to use String#dup if you want to modify the return value
|
|
68
|
+
# with destructive functions.
|
|
69
|
+
#
|
|
70
|
+
# (e.g.1) _("Hello ").dup << "world"
|
|
71
|
+
#
|
|
72
|
+
# But e.g.1 should be rewrite to:
|
|
73
|
+
#
|
|
74
|
+
# (e.g.2) _("Hello %{val}") % {:val => "world"}
|
|
75
|
+
#
|
|
76
|
+
# Because the translator may want to change the position of "world".
|
|
77
|
+
#
|
|
78
|
+
# * msgid: the message id.
|
|
79
|
+
# * Returns: localized text by msgid. If there are not binded mo-file, it will return msgid.
|
|
80
|
+
def gettext(msgid)
|
|
81
|
+
TextDomainManager.get(self).translate_singluar_message(self, msgid)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# call-seq:
|
|
85
|
+
# sgettext(msgid, div = '|')
|
|
86
|
+
# s_(msgid, div = '|')
|
|
87
|
+
#
|
|
88
|
+
# Translates msgid, but if there are no localized text,
|
|
89
|
+
# it returns a last part of msgid separeted "div".
|
|
90
|
+
#
|
|
91
|
+
# * msgid: the message id.
|
|
92
|
+
# * div: separator or nil.
|
|
93
|
+
# * Returns: the localized text by msgid. If there are no localized text,
|
|
94
|
+
# it returns a last part of msgid separeted "div".
|
|
95
|
+
# See: http://www.gnu.org/software/gettext/manual/html_mono/gettext.html#SEC151
|
|
96
|
+
def sgettext(msgid, div = "|")
|
|
97
|
+
TextDomainManager.get(self).translate_singluar_message(self, msgid, div)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# call-seq:
|
|
101
|
+
# pgettext(msgctxt, msgid)
|
|
102
|
+
# p_(msgctxt, msgid)
|
|
103
|
+
#
|
|
104
|
+
# Translates msgid with msgctxt. This methods is similer with s_().
|
|
105
|
+
# e.g.) p_("File", "New") == s_("File|New")
|
|
106
|
+
# p_("File", "Open") == s_("File|Open")
|
|
107
|
+
#
|
|
108
|
+
# * msgctxt: the message context.
|
|
109
|
+
# * msgid: the message id.
|
|
110
|
+
# * Returns: the localized text by msgid. If there are no localized text,
|
|
111
|
+
# it returns msgid.
|
|
112
|
+
# See: http://www.gnu.org/software/autoconf/manual/gettext/Contexts.html
|
|
113
|
+
def pgettext(msgctxt, msgid)
|
|
114
|
+
TextDomainManager.get(self).translate_singluar_message(self, "#{msgctxt}\004#{msgid}", "\004")
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# call-seq:
|
|
118
|
+
# ngettext(msgid, msgid_plural, n)
|
|
119
|
+
# ngettext(msgids, n) # msgids = [msgid, msgid_plural]
|
|
120
|
+
# n_(msgid, msgid_plural, n)
|
|
121
|
+
# n_(msgids, n) # msgids = [msgid, msgid_plural]
|
|
122
|
+
#
|
|
123
|
+
# The ngettext is similar to the gettext function as it finds the message catalogs in the same way.
|
|
124
|
+
# But it takes two extra arguments for plural form.
|
|
125
|
+
#
|
|
126
|
+
# * msgid: the singular form.
|
|
127
|
+
# * msgid_plural: the plural form.
|
|
128
|
+
# * n: a number used to determine the plural form.
|
|
129
|
+
# * Returns: the localized text which key is msgid_plural if n is plural(follow plural-rule) or msgid.
|
|
130
|
+
# "plural-rule" is defined in po-file.
|
|
131
|
+
def ngettext(arg1, arg2, arg3 = nil)
|
|
132
|
+
TextDomainManager.get(self).translate_plural_message(self, arg1, arg2, arg3)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# call-seq:
|
|
136
|
+
# nsgettext(msgid, msgid_plural, n, div = "|")
|
|
137
|
+
# nsgettext(msgids, n, div = "|") # msgids = [msgid, msgid_plural]
|
|
138
|
+
# n_(msgid, msgid_plural, n, div = "|")
|
|
139
|
+
# n_(msgids, n, div = "|") # msgids = [msgid, msgid_plural]
|
|
140
|
+
#
|
|
141
|
+
# The nsgettext is similar to the ngettext.
|
|
142
|
+
# But if there are no localized text,
|
|
143
|
+
# it returns a last part of msgid separeted "div".
|
|
144
|
+
#
|
|
145
|
+
# * msgid: the singular form with "div". (e.g. "Special|An apple")
|
|
146
|
+
# * msgid_plural: the plural form. (e.g. "%{num} Apples")
|
|
147
|
+
# * n: a number used to determine the plural form.
|
|
148
|
+
# * Returns: the localized text which key is msgid_plural if n is plural(follow plural-rule) or msgid.
|
|
149
|
+
# "plural-rule" is defined in po-file.
|
|
150
|
+
def nsgettext(arg1, arg2, arg3 = "|", arg4 = "|")
|
|
151
|
+
TextDomainManager.get(self).translate_plural_message(self, arg1, arg2, arg3, arg4)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# call-seq:
|
|
155
|
+
# npgettext(msgctxt, msgid, msgid_plural, n)
|
|
156
|
+
# npgettext(msgctxt, msgids, n) # msgids = [msgid, msgid_plural]
|
|
157
|
+
# np_(msgctxt, msgid, msgid_plural, n)
|
|
158
|
+
# np_(msgctxt, msgids, n) # msgids = [msgid, msgid_plural]
|
|
159
|
+
#
|
|
160
|
+
# The npgettext is similar to the nsgettext function.
|
|
161
|
+
# e.g.) np_("Special", "An apple", "%{num} Apples", num) == ns_("Special|An apple", "%{num} Apples", num)
|
|
162
|
+
# * msgctxt: the message context.
|
|
163
|
+
# * msgid: the singular form.
|
|
164
|
+
# * msgid_plural: the plural form.
|
|
165
|
+
# * n: a number used to determine the plural form.
|
|
166
|
+
# * Returns: the localized text which key is msgid_plural if n is plural(follow plural-rule) or msgid.
|
|
167
|
+
# "plural-rule" is defined in po-file.
|
|
168
|
+
def npgettext(msgctxt, arg1, arg2 = nil, arg3 = nil)
|
|
169
|
+
if arg1.kind_of?(Array)
|
|
170
|
+
msgid = arg1[0]
|
|
171
|
+
msgid_ctxt = "#{msgctxt}\004#{msgid}"
|
|
172
|
+
msgid_plural = arg1[1]
|
|
173
|
+
opt1 = arg2
|
|
174
|
+
opt2 = arg3
|
|
175
|
+
else
|
|
176
|
+
msgid = arg1
|
|
177
|
+
msgid_ctxt = "#{msgctxt}\004#{msgid}"
|
|
178
|
+
msgid_plural = arg2
|
|
179
|
+
opt1 = arg3
|
|
180
|
+
opt2 = nil
|
|
181
|
+
end
|
|
182
|
+
ret = TextDomainManager.get(self).translate_plural_message(self, msgid_ctxt, msgid_plural, opt1, opt2)
|
|
183
|
+
|
|
184
|
+
if ret == msgid_ctxt
|
|
185
|
+
ret = msgid
|
|
186
|
+
end
|
|
187
|
+
ret
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# This function does nothing. But it is required in order to recognize the msgid by rgettext.
|
|
191
|
+
# * msgid: the message id.
|
|
192
|
+
# * Returns: msgid.
|
|
193
|
+
def N_(msgid)
|
|
194
|
+
msgid
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# This is same function as N_ but for ngettext.
|
|
198
|
+
# * msgid: the message id.
|
|
199
|
+
# * msgid_plural: the plural message id.
|
|
200
|
+
# * Returns: msgid.
|
|
201
|
+
def Nn_(msgid, msgid_plural)
|
|
202
|
+
[msgid, msgid_plural]
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# Sets charset(String) such as "euc-jp", "sjis", "CP932", "utf-8", ...
|
|
206
|
+
# You shouldn't use this in your own Libraries.
|
|
207
|
+
# * charset: an output_charset
|
|
208
|
+
# * Returns: self
|
|
209
|
+
def set_output_charset(charset)
|
|
210
|
+
TextDomainManager.output_charset = charset
|
|
211
|
+
self
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# Gets the current output_charset which is set using GetText.set_output_charset.
|
|
215
|
+
# * Returns: output_charset.
|
|
216
|
+
def output_charset
|
|
217
|
+
TextDomainManager.output_charset
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def set_locale(lang)
|
|
221
|
+
Locale.clear
|
|
222
|
+
Locale.current = lang
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def locale
|
|
226
|
+
Locale.current[0]
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
alias :locale= :set_locale #:nodoc:
|
|
230
|
+
module_function :locale= #:nodoc:
|
|
231
|
+
|
|
232
|
+
alias :_ :gettext #:nodoc:
|
|
233
|
+
module_function :_ #:nodoc:
|
|
234
|
+
|
|
235
|
+
alias :n_ :ngettext #:nodoc:
|
|
236
|
+
module_function :n_ #:nodoc:
|
|
237
|
+
|
|
238
|
+
alias :s_ :sgettext #:nodoc:
|
|
239
|
+
module_function :s_ #:nodoc:
|
|
240
|
+
|
|
241
|
+
alias :ns_ :nsgettext #:nodoc:
|
|
242
|
+
module_function :ns_ #:nodoc:
|
|
243
|
+
|
|
244
|
+
alias :np_ :npgettext #:nodoc:
|
|
245
|
+
module_function :np_ #:nodoc:
|
|
246
|
+
|
|
247
|
+
alias :output_charset= :set_output_charset #:nodoc:
|
|
248
|
+
module_function :output_charset= #:nodoc:
|
|
249
|
+
|
|
250
|
+
unless defined? XX
|
|
251
|
+
# This is the workaround to conflict p_ methods with the xx("double x") library.
|
|
252
|
+
# http://rubyforge.org/projects/codeforpeople/
|
|
253
|
+
alias :p_ :pgettext #:nodoc:
|
|
254
|
+
module_function :p_
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
# for backward compatibility
|
|
258
|
+
alias :set_locale_all :set_locale #:nodoc:
|
|
259
|
+
alias :set_locale_all :set_locale #:nodoc:
|
|
260
|
+
module_function :set_locale_all #:nodoc:
|
|
261
|
+
alias :setlocale :set_locale #:nodoc:
|
|
262
|
+
module_function :setlocale #:nodoc:
|
|
263
|
+
end
|
data/lib/gettext/cgi.rb
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
gettext/cgi.rb - GetText for CGI
|
|
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.
|
|
8
|
+
|
|
9
|
+
$Id$
|
|
10
|
+
=end
|
|
11
|
+
|
|
12
|
+
require 'cgi'
|
|
13
|
+
require 'gettext'
|
|
14
|
+
|
|
15
|
+
Locale.init(:driver => :cgi)
|
|
16
|
+
|
|
17
|
+
module GetText
|
|
18
|
+
module_function
|
|
19
|
+
|
|
20
|
+
# Sets a CGI object.
|
|
21
|
+
# * cgi_: CGI object
|
|
22
|
+
# * Returns: self
|
|
23
|
+
def set_cgi(cgi_)
|
|
24
|
+
Locale.set_cgi(cgi_)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Same as GetText.set_cgi.
|
|
28
|
+
# * cgi_: CGI object
|
|
29
|
+
# * Returns: cgi_
|
|
30
|
+
def cgi=(cgi_)
|
|
31
|
+
set_cgi(cgi_)
|
|
32
|
+
cgi_
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Gets the CGI object. If it is nil, returns new CGI object.
|
|
36
|
+
# * Returns: the CGI object
|
|
37
|
+
def cgi
|
|
38
|
+
Locale.cgi
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'locale/util/memoizable'
|
|
2
|
+
|
|
3
|
+
module GetText
|
|
4
|
+
module ClassInfo
|
|
5
|
+
include Locale::Util::Memoizable
|
|
6
|
+
|
|
7
|
+
module_function
|
|
8
|
+
# normalize the klass name
|
|
9
|
+
def normalize_class(klass)
|
|
10
|
+
ret = (klass.kind_of? Module) ? klass : klass.class
|
|
11
|
+
if ret.name =~ /^\#<|^$/ or ret == GetText
|
|
12
|
+
ret = Object
|
|
13
|
+
end
|
|
14
|
+
ret
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Internal method for related_classes.
|
|
18
|
+
def related_classes_internal(klass, all_classes = [], analyzed_classes = [] )
|
|
19
|
+
ret = []
|
|
20
|
+
klass = normalize_class(klass)
|
|
21
|
+
|
|
22
|
+
return [Object] if [Object, Kernel].include? klass
|
|
23
|
+
|
|
24
|
+
ary = klass.name.split(/::/)
|
|
25
|
+
while(v = ary.shift)
|
|
26
|
+
ret.unshift(((ret.size == 0) ? Object.const_get(v) : ret[0].const_get(v)))
|
|
27
|
+
end
|
|
28
|
+
ret -= analyzed_classes
|
|
29
|
+
if ret.size > 1
|
|
30
|
+
ret += related_classes_internal(ret[1], all_classes, analyzed_classes)
|
|
31
|
+
ret.uniq!
|
|
32
|
+
end
|
|
33
|
+
analyzed_classes << klass unless analyzed_classes.include? klass
|
|
34
|
+
klass.ancestors[1..-1].each do |v|
|
|
35
|
+
ret += related_classes_internal(v, all_classes, analyzed_classes)
|
|
36
|
+
ret.uniq!
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
if all_classes.size > 0
|
|
40
|
+
((ret - [Kernel]) & all_classes).uniq
|
|
41
|
+
else
|
|
42
|
+
(ret - [Kernel]).uniq
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Returns the classes which related to klass
|
|
47
|
+
# (klass's ancestors, included modules and nested modules)
|
|
48
|
+
def related_classes(klass, all_classes = [])
|
|
49
|
+
ret = related_classes_internal(klass, all_classes)
|
|
50
|
+
(ret + [Object]).uniq
|
|
51
|
+
end
|
|
52
|
+
memoize :related_classes
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
iconv.rb - Pseudo Iconv class. Supports Iconv.iconv, Iconv.conv.
|
|
3
|
+
|
|
4
|
+
For Matz Ruby:
|
|
5
|
+
If you don't have iconv but glib2, this library uses glib2 iconv functions.
|
|
6
|
+
|
|
7
|
+
For JRuby:
|
|
8
|
+
Use Java String class to convert strings.
|
|
9
|
+
|
|
10
|
+
Copyright (C) 2004-2007 Masao Mutoh
|
|
11
|
+
|
|
12
|
+
You may redistribute it and/or modify it under the same
|
|
13
|
+
license terms as Ruby.
|
|
14
|
+
|
|
15
|
+
$Id: iconv.rb,v 1.6 2007/11/08 14:21:22 mutoh Exp $
|
|
16
|
+
=end
|
|
17
|
+
|
|
18
|
+
begin
|
|
19
|
+
require 'iconv.so'
|
|
20
|
+
rescue LoadError
|
|
21
|
+
# Pseudo Iconv class
|
|
22
|
+
#
|
|
23
|
+
# Provides Iconv.iconv which uses Ruby/GLib(1) functions. This library also required from 'gettext'.
|
|
24
|
+
# If you require 'gettext/iconv', Iconv.iconv try to call Ruby/GLib function
|
|
25
|
+
# when it doesn't find original Iconv class(iconv.so).
|
|
26
|
+
#
|
|
27
|
+
# (1) Ruby/GLib is a module which is provided from Ruby-GNOME2 Project.
|
|
28
|
+
# You can get binaries for Win32(One-Click Ruby Installer).
|
|
29
|
+
# <URL: http://ruby-gnome2.sourceforge.jp/>
|
|
30
|
+
class Iconv
|
|
31
|
+
module Failure; end
|
|
32
|
+
class InvalidEncoding < ArgumentError; include Failure; end
|
|
33
|
+
class IllegalSequence < ArgumentError; include Failure; end
|
|
34
|
+
class InvalidCharacter < ArgumentError; include Failure; end
|
|
35
|
+
|
|
36
|
+
if RUBY_PLATFORM =~ /java/
|
|
37
|
+
def self.conv(to, from, str)
|
|
38
|
+
raise InvalidCharacter, "the 3rd argument is nil" unless str
|
|
39
|
+
begin
|
|
40
|
+
str = java.lang.String.new(str.unpack("C*").to_java(:byte), from)
|
|
41
|
+
str.getBytes(to).to_ary.pack("C*")
|
|
42
|
+
rescue java.io.UnsupportedEncodingException
|
|
43
|
+
raise InvalidEncoding
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
else
|
|
47
|
+
begin
|
|
48
|
+
require 'glib2'
|
|
49
|
+
|
|
50
|
+
def self.check_glib_version?(major, minor, micro) # :nodoc:
|
|
51
|
+
(GLib::BINDING_VERSION[0] > major ||
|
|
52
|
+
(GLib::BINDING_VERSION[0] == major &&
|
|
53
|
+
GLib::BINDING_VERSION[1] > minor) ||
|
|
54
|
+
(GLib::BINDING_VERSION[0] == major &&
|
|
55
|
+
GLib::BINDING_VERSION[1] == minor &&
|
|
56
|
+
GLib::BINDING_VERSION[2] >= micro))
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
if check_glib_version?(0, 11, 0)
|
|
60
|
+
# This is a function equivalent of Iconv.iconv.
|
|
61
|
+
# * to: encoding name for destination
|
|
62
|
+
# * from: encoding name for source
|
|
63
|
+
# * str: strings to be converted
|
|
64
|
+
# * Returns: Returns an Array of converted strings.
|
|
65
|
+
def self.conv(to, from, str)
|
|
66
|
+
begin
|
|
67
|
+
GLib.convert(str, to, from)
|
|
68
|
+
rescue GLib::ConvertError => e
|
|
69
|
+
case e.code
|
|
70
|
+
when GLib::ConvertError::NO_CONVERSION
|
|
71
|
+
raise InvalidEncoding.new(str)
|
|
72
|
+
when GLib::ConvertError::ILLEGAL_SEQUENCE
|
|
73
|
+
raise IllegalSequence.new(str)
|
|
74
|
+
else
|
|
75
|
+
raise InvalidCharacter.new(str)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
else
|
|
80
|
+
def self.conv(to, from, str) # :nodoc:
|
|
81
|
+
begin
|
|
82
|
+
GLib.convert(str, to, from)
|
|
83
|
+
rescue
|
|
84
|
+
raise IllegalSequence.new(str)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
rescue LoadError
|
|
89
|
+
def self.conv(to, from, str) # :nodoc:
|
|
90
|
+
warn "Iconv was not found." if $DEBUG
|
|
91
|
+
str
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
def self.iconv(to, from, str)
|
|
96
|
+
conv(to, from, str).split(//)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
if __FILE__ == $0
|
|
102
|
+
puts Iconv.iconv("EUC-JP", "UTF-8", "ほげ").join
|
|
103
|
+
begin
|
|
104
|
+
puts Iconv.iconv("EUC-JP", "EUC-JP", "ほげ").join
|
|
105
|
+
rescue Iconv::Failure
|
|
106
|
+
puts $!
|
|
107
|
+
puts $!.class
|
|
108
|
+
end
|
|
109
|
+
end
|