自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。
Ruby言語やLinuxのネタが多いです。
July 07, 2008 [おもひで]
■ N_()の使いかた(再)
いまだにN_()の使い方やN_()と_()の違いについての質問が絶えないのでもう一度整理してみる。
まず、以下のようなコード。
class Hello
bindtextdomain("hello")
HELLO_WORLD = _("Hello world")
def say_hello
_("Hello!")
end
def say_hello_world
HELLO_WORLD
end
end
say_helloとsay_hello_world、2つのメソッドがある。_("")の使い方としては前者が正解で後者が間違い。なぜか。
通常のCUI/GUIアプリだと1回起動してしまえば全ての同じシステム上のロケールを使うことになるだろうからほとんど気にしないでも良いかもしれないが、RailsのようなWebアプリだとリクエストごとにクライアントのロケールが異なるため、say_hello_worldの方法だと意図しない動作になってしまう。
では、どのように書くと良いかというと、N_()を使って以下のように記述する。
class Hello
bindtextdomain("hello")
HELLO_WORLD = N_("Hello world")
def say_hello
_("Hello!")
end
def say_hello_world
_(HELLO_WORLD)
end
end
N_()は実は何もしないメソッド。rgettext(poファイル抽出時)にそれが翻訳対象文字列であることを伝えるためのメソッドで、実際の翻訳はsay_hello_world内の_()で行っている。
まとめると、_()はインスタンス化後に使用するもの、N_()はクラスレベルで使用し、実際に使うときに_()で使用するもの、というのがRuby-GetTextの基本的なお作法だという風に覚えてしまうと良いと思う。
[ツッコミを入れる]
