コンテンツにスキップ

汎用的な Ruby での GetText と Haml を使った国際化

出典: フリー教科書『ウィキブックス(Wikibooks)』

汎用的な Ruby での GetText と Haml を使った国際化の方法を説明します。

GetText のセットアップ

[編集]

まず、必要な gem をインストールします:

gem install gettext
gem install haml

基本的な国際化の実装

[編集]

1. ディレクトリ構造の準備

[編集]
project/
├── locales/
│   ├── ja.po
│   └── en.po
├── templates/
│   └── example.haml
└── i18n.rb

2. 翻訳ファイルの作成

[編集]
locales/ja.po
msgid "Welcome"
msgstr "ようこそ"

msgid "Hello, %{name}"
msgstr "%{name}さん、こんにちは"
locales/en.po`
msgid "Welcome"
msgstr "Welcome"

msgid "Hello, %{name}"
msgstr "Hello, %{name}"

3. Ruby スクリプト (i18n.rb)

[編集]
i18n.rb
require 'gettext'
require 'haml'

module I18nHelper
  extend FastGettext::Translation

  def self.setup_locale(locale = 'ja')
    FastGettext.available_locales = ['ja', 'en']
    FastGettext.default_locale = 'ja'
    FastGettext.locale = locale
  end

  def self.render_template(template_path, locals = {})
    setup_locale(locals[:locale] || 'ja')
    
    template = File.read(template_path)
    haml_engine = Haml::Engine.new(template)
    
    # ローカライズ処理を含むコンテキストでテンプレートをレンダリング
    haml_engine.render(Object.new, locals) do |key|
      _(*Array(key))  # GetText の翻訳メソッド
    end
  end
end

# 使用例
begin
  # テンプレートのレンダリング
  output = I18nHelper.render_template('templates/example.haml', 
    name: '田中',
    locale: 'ja'
  )
  puts output
rescue => e
  puts "エラー: #{e.message}"
end

4. Haml テンプレート (templates/example.haml)

[編集]
templates/example.haml
%html
  %head
    %title= _('Welcome')
  %body
    %h1= _('Hello, %{name}', name: name)
    %p= _('This is a sample internationalization example.')

翻訳文字列の抽出

[編集]
rxgettext templates/*.haml -o locales/messages.pot

実行方法

[編集]
ruby i18n.rb

高度な機能

[編集]

コンテキストベースの翻訳

[編集]
# POファイル
msgctxt "programming"
msgid "Ruby"
msgstr "Ruby言語"

msgctxt "geology"
msgid "Ruby"
msgstr "ルビー(宝石)"

RxGettext

[編集]

RxGettext のコマンドラインツールを使用した国際化の方法を詳細に説明します。

RxGettext コマンドラインツールのセットアップ

[編集]
Gem のインストール
[編集]
gem install gettext
gem install rexec-gettext

プロジェクト構造

[編集]
i18n_project/
├── lib/
│   └── messages.rb
├── locales/
│   ├── ja.po
│   └── en.po
└── main.rb

スクリプト例 (lib/messages.rb)

[編集]
module Messages
  def greet(name)
    "Hello, #{name}!"
  end

  def welcome
    "Welcome to our application!"
  end
end

メインスクリプト (main.rb)

[編集]
require_relative 'lib/messages'
require 'gettext'

include GetText
bindtextdomain('myapp', path: 'locales')

messages = Messages.new
puts _("Welcome to our application!")
puts _("Hello, %{name}!") % { name: 'Ruby Developer' }

翻訳文字列の抽出

[編集]
コマンドラインでの抽出
[編集]
# プロジェクト内で実行
rxgettext -o locales/myapp.pot main.rb lib/**/*.rb

POファイルの作成と編集

[編集]
日本語POファイルの初期化
[編集]
msginit -i locales/myapp.pot -o locales/ja.po -l ja
英語POファイルの初期化
[編集]
msginit -i locales/myapp.pot -o locales/en.po -l en
POファイルの編集例 (locales/ja.po)
[編集]
msgid "Welcome to our application!"
msgstr "アプリケーションへようこそ!"

msgid "Hello, %{name}!"
msgstr "%{name}さん、こんにちは!"

翻訳の適用

[編集]
ロケールの設定
[編集]
# 日本語ロケールの設定
export LANG=ja_JP.UTF-8
export LANGUAGE=ja
または Ruby スクリプト内で
GetText.locale = 'ja'

コマンドラインでの追加操作

[編集]
POファイルの更新
[編集]
# 新しい文字列の抽出と既存の翻訳の保持
rxgettext -o locales/myapp.pot main.rb lib/**/*.rb
msgmerge -U locales/ja.po locales/myapp.pot
MO ファイルの生成
[編集]
# 翻訳ファイルのコンパイル
msgfmt locales/ja.po -o locales/ja/LC_MESSAGES/myapp.mo

高度な使用例

[編集]
複数形のサポート
[編集]
# main.rb
def apple_count(count)
  # 複数形の翻訳
  n_("An apple", "%{count} apples", count) % { count: count }
end
対応する POファイルの例
msgid "An apple"
msgid_plural "%{count} apples"
msgstr[0] "1つのリンゴ"
msgstr[1] "%{count}個のリンゴ"

コマンドラインツールのオプション

[編集]
# 主要なrxgettextのオプション
rxgettext -o output.pot      # 出力ファイルの指定
          -d domain          # テキストドメインの指定
          -p path            # POファイルの出力パス
          --no-location      # ソース位置情報の抑制
          --sort-output      # アルファベット順のソート

注意点と推奨事項

[編集]
  1. UTF-8エンコーディングを使用
  2. 定期的に翻訳文字列を抽出
  3. POファイルは手動で編集
  4. モジュール化されたコードで国際化を管理
  5. ロケール設定に注意

トラブルシューティング

[編集]
  • エンコーディングエラー時は、明示的にUTF-8を指定
  • 翻訳が適用されない場合は、MOファイルの生成を確認
  • GetText.locale の設定を確認

この方法により、RxGettext のコマンドラインツールを使用して、Rubyプロジェクトの国際化を効率的に実現できます。

まとめ

[編集]
  • GetText は柔軟な国際化ライブラリ
  • Haml と組み合わせることで、読みやすいテンプレート作成が可能
  • 翻訳ファイルの管理が重要
  • ロケールの切り替えが容易

この実装により、Ruby プロジェクトで柔軟な国際化が実現できます。