自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
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つのメソッドがある。_("")の使い方としては前者が正解で後者が間違い。なぜか。

  • say_helloの方はsay_helloが呼び出された時点でのロケールで翻訳表示される。
  • say_hello_worldは、スクリプトが読み込まれたときの環境のロケールで表示される。
  • 通常の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の基本的なお作法だという風に覚えてしまうと良いと思う。


    July 08, 2008 [長年日記]

    [Ruby] Ruby-GetText-Package x Rails-2.1.0

    一通りは終わった模様。

    あとは、validator周りの追加分の翻訳に対応して、msgctxt対応、それから気づいたところをちょこちょこっと追加・拡張された部分に対応してリリースかなぁ。

    Ruby-GetText-PackageのCVS版で試してみてもらえると助かります。

    バグレポート&パッチ歓迎です。


    July 24, 2008 [長年日記]

    [Rails] Rails上で使うJavascriptのローカライゼーション

    ってみなさんどうやってるのでしょうか。

    こうやると良いよ、みたいなのってあります?


    July 26, 2008 [長年日記]

    [Ruby] Ruby-GetText-Package ラトビア語リソース

    ラトビア語のリソースファイルを追加しました。

    ラトビア共和国は、バルト海に面する北東ヨーロッパの国で、第一次世界大戦後の1918年に独立。その後1940年にソビエト連邦に併合。旧ソ連、バルト三国を構成する共和国の一つ。1991年にソ連から独立を回復したとのこと。1991年というと、ついこの前の出来事じゃんとか思ってしまう自分(苦笑)。

    ラトビア語リソース