Skip to content
Ruby-GetText-Package is a Localization(L10n) library and tools which modeled after GNU gettext package.
Find file
Latest commit 11b8c15 @masone masone committed with Masao Mutoh running code cleaner, adding magic comments
Failed to load latest commit information.
bin * Remove $Id$.
lib running code cleaner, adding magic comments
po * Move "po/ua" to "po/uk" for Ukrainan translations. [Bug#28277] by G…
samples running code cleaner, adding magic comments
src Show po-file name when fuzzy msgid is found.
.gitignore Merge the changes by grosser.
COPYING Update license information(explicit to use ruby's or LGPL).
ChangeLog Update ChangeLog.
ChangeLog-1 Add 2.0.0 changelog.
NEWS-1 Add old NEWS as NEWS-1.
README.rdoc * Move "po/ua" to "po/uk" for Ukrainan translations. [Bug#28277] by G…
Rakefile Updated locale version dependency.
gettext.gemspec running code cleaner, adding magic comments


gettext - Ruby-GetText-Package

Ruby-GetText-Package is a Localization(L10n) library and tool which is modeled after the GNU gettext package.

This library translates original messages to localized messages using client-side locale information(environment variable or CGI variable).

The tools for developers support creating, useing, and modifying localized message files(message catalogs).

((Rails)) Rails support has been removed. Rails / ActiveRecord specific code now lives in locale_rails, gettext_rails and gettext_activerecord.



  • Translate singular/plural messages with simple APIs(similar to GNU gettext)

  • Thread safety. Message resources are shared from all threads, but returns translated messages of the current thread's locale.

  • Tools to find message IDs

    • Extract message IDs to po-files using rgettext from

      • ruby scripts

      • glade-2 XML file(.glade)

      • ERB file(.rhtml, .erb)

      • Anything (with your own parsers)

      • The po-files are compatible to GNU gettext.

    • rmsgfmt creates a mo-file from a po-file. The mo-file is compatible to GNU gettext(msgfmt).

    • Using rgettext/rmsgfmt as Rake tasks

  • textdomain's scope is adapt to ruby class/module mechanism.

    • A class/module can have plural textdomains.

    • a message is looked up in its class/module and ancestors.

  • CGI support (gettext/cgi)

    • Locale is retrieved from client informations using Ruby-Locale. (HTTP_ACCEPT_LANGUAGE, HTTP_ACCEPT_CHARSET, QUERY_STRING(lang), Cookies(lang)).

  • String%() is extended to use named argument such as %{foo}" %{:foo => 1}. Notes that Ruby-1.9.x supports this format by itself.



  • Uninstall old gettext if exists. (You need to do this when updating 1.93.0 -> 2.0.1)

    (sudo/su on POSIX system)
    gem uninstall gettext
  • gem

    #from rubyforge 
    (sudo/su on POSIX system)
    gem install gettext
  • download tar-ball

    # De-Compress archive and enter its top directory.
    (sudo/su on POSIX system)
    ruby setup.rb

You can also install files in your favorite directory by supplying setup.rb some options. Try ruby setup.rb --help.



  • _: Basic translation method Translates the message.


The gettext methods comes in 3 combinable flavors

  • n: Pluralized Returns singular or plural form, depending on how many you have.

    n_("Apple", "%{num} Apples", 3)
    n_(["Apple", "%{num} Apples"], 3)
  • p: context aware A context is a prefix to your translation, usefull when one word has different meanings, depending on its context.

    p_("Printer","Open") <=> p_("File","Open")
    is the same as s_("Printer|Open")  <=> s_("File|Open")
  • s: without context If a translation could not be found, return the msgid without context.

    s_("Printer|Open") => "Öffnen" #translation found
    s_("Printer|Open") => "Open"   #translation not found
  • combinations

    np_("Fruit", "Apple", "%{num} Apples", 3)
    ns_("Fruit|Apple","%{num} Apples", 3)
    np_(["Fruit","Apple","%{num} Apples"], 3)
    ns_(["Fruit|Apple","%{num} Apples"], 3)
  • N_, Nn_: Makes dynamic translation messages readable for the gettext parser. _(fruit) cannot be understood by the gettext parser. To help the parser find all your translations, you can add fruit = N_("Apple") which does not translate, but tells the parser: “Apple” needs translation.

    fruit = N_("Apple")   # same as fruit = "Apple"
    _(fruit)              # does a normal translation
    fruits = Nn_("Apple", "%{num} Apples")
    n_(fruits, 3)

Bind textdomains to the classes.

A textdomain has a translation file in each language. A module/class can have multi textdomains. This means the libraries/applications can have their own textdomains.

class Foo
  include GetText
  bindtextdomain "your_app_domain_name"

class Book
  include GetText
  bindtextdomain "general"
  bindtextdomain "book"


If you need to set the locale by yourself, then use:

GetText.locale = "en_US" # translate into english from now on
GetText.locale # => en_US


include GetText
set_locale "en_US"

For more details and options, have a look at the samples folder or consult the tutorial.


This program is licenced under the same licence as Ruby(See COPYING) or LGPL(Lesser General Public License:

  • mofile.rb

    • Copyright (C) 2001-2009 Masao Mutoh <mutoh at>

    • Copyright (C) 2001,2002 Masahiro Sakai <s01397ms at>

  • gettext.rb

    • Copyright (C) 2001-2009 Masao Mutoh <mutoh at>

    • Copyright (C) 2001,2002 Masahiro Sakai <s01397ms at>

  • rgettext

    • Copyright (C) 2001-2009 Masao Mutoh <mutoh at>

    • Copyright (C) 2001,2002 Yasushi Shoji <yashi at>

  • setup.rb

    • Copyright (C) 2000-2005 Minero Aoki <aamine at>

    • This file is released under LGPL. See the top of the install.rb.

  • Others

    • Copyright (C) 2001-2009 Masao Mutoh <mutoh at>


  • Bosnian(bs) - Sanjin Sehic <saserr at>

  • Bulgarian(bg) - Sava Chankov <sava.chankov at>

  • Catalan(ca) - Ramon Salvadó <rsalvado at>

  • Chinese(Simplified)(zh_CN)

    • Yang Bob < at> (current)

    • Yingfeng <blogyingfeng at>

  • Chinese(Traditional)(zh_TW)

    • Yang Bob < at> (current)

    • LIN CHUNG-YI <xmarsh at>

  • Croatian(hr) - Sanjin Sehic <saserr at>

  • Czech(cs) - Karel Miarka <kajism at>

  • Dutch(nl) - Menno Jonkers <ruby-gettext at>

  • Esperanto(eo) - Malte Milatz <malte at>

  • Estonian(et) - Erkki Eilonen <erkki at>

  • French(fr)

    • Vincent Isambart <vincent.isambart at> (current)

    • David Sulc <davidsulc at>

    • Laurent Sansonetti <laurent.sansonetti at>

  • German(de)

    • Patrick Lenz <patrick at> (current)

    • Detlef Reichl <detlef.reichl at>

    • Sven Herzberg <herzi at>

    • Sascha Ebach <se at>

  • Greek(el) - Vassilis Rizopoulos <damphyr at>

  • Hungarian(hu) - Tamás Tompa <tompata at>

  • Italian(it)

    • Marco Lazzeri <marco.lazzeri at>

    • Gabriele Renzi <surrender_it at>

  • Japanese(ja) - Masao Mutoh <mutomasa at>

  • Korean(ko) - Gyoung-Yoon Noh <nohmad at>

  • Latvian(lv) - Aivars Akots <aivars.akots at>

  • Norwegian(nb) - Runar Ingebrigtsen <runar at>

  • Portuguese(Brazil)(pt_BR)

    • Antonio S. de A. Terceiro <terceiro at> (current)

    • Joao Pedrosa <joaopedrosa at>

  • Russian(ru) - Yuri Kozlov <kozlov.y at>

  • Serbian(sr) - Slobodan Paunović“ <slobodan.paunovic at>

  • Spanish(es)

    • David Espada <davinci at> (current)

    • David Moreno Garza <damog at>

  • Swedish(sv) - Nikolai Weibull <mailing-lists.ruby-talk at>

  • Ukrainian(uk) - Alex Rootoff <rootoff at>

  • Vietnamese(vi) - Ngoc Dao Thanh <ngocdaothanh at>

Status of translations

  • Bosnian(bs) - 1.90.0 (old)

  • Bulgarian(bg) - 2.0.1

  • Catalan(ca) - 2.0.1

  • Croatian(hr) - 1.90.0 (old)

  • Chinese(zh_CN) - 2.0.1

  • Chinese(zh_TW) - 2.0.1

  • Czech(cs) - 1.9.0 (old)

  • Dutch(nl) - 1.90.0 (old)

  • English(default) - 2.1.0

  • Esperanto(eo) - 2.0.1

  • Estonian(et) - 2.0.1

  • French(fr) - 2.0.1

  • German(de) - 2.0.1

  • Greek(el) - 2.0.1

  • Hungarian(hu) - 2.0.1

  • Italian(it) - 1.6.0 (old)

  • Japanese(ja) - 2.1.0

  • Korean(ko) - 1.9.0 (old)

  • Latvian(lv) - 2.0.1

  • Norwegian(nb) - 2.0.1

  • Portuguese(Brazil)(pt_BR) - 2.0.1

  • Russian(ru) - 2.0.1

  • Serbian(sr) - 2.0.1

  • Spanish(es) - 2.0.1

  • Swedish(sv) - 0.8.0 (too much old)

  • Ukrainian(uk) - 2.0.1

  • Vietnamese(vi) - 2.0.1


Masao Mutoh <mutomasa at>

Something went wrong with that request. Please try again.