汎用的な Ruby での GetText と Haml を使った国際化
表示
汎用的な 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 # アルファベット順のソート
注意点と推奨事項
[編集]- UTF-8エンコーディングを使用
- 定期的に翻訳文字列を抽出
- POファイルは手動で編集
- モジュール化されたコードで国際化を管理
- ロケール設定に注意
トラブルシューティング
[編集]- エンコーディングエラー時は、明示的にUTF-8を指定
- 翻訳が適用されない場合は、MOファイルの生成を確認
- GetText.locale の設定を確認
この方法により、RxGettext のコマンドラインツールを使用して、Rubyプロジェクトの国際化を効率的に実現できます。
まとめ
[編集]- GetText は柔軟な国際化ライブラリ
- Haml と組み合わせることで、読みやすいテンプレート作成が可能
- 翻訳ファイルの管理が重要
- ロケールの切り替えが容易
この実装により、Ruby プロジェクトで柔軟な国際化が実現できます。