fc2ブログ

2024.11 «  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 - - - - » 2025.01
TOP > CATEGORY > 日本語化

TOP | NEXT

Ruby-GetText初体験その6【po ファイルと mo ファイル】 

2007年09月25日 ()

その1【インストールしてみる】
その2【英語のアプリをまず作成】
その3【日本語を使うぞ宣言】
その4【require 'gettext/rails' と init_gettext】
その5【ファイルをUTF-8で日本語書き換え】
その6【po ファイルと mo ファイル】



いよいよ、Ruby-GetText の醍醐味の po ファイルと mo ファイルの作成といきますか!

例によって、本家のサイト様を参考に、必要と思われる箇所だけを抜粋して実行します。

■Rakefile を編集して、新たな rake コマンドを付け加える。
↓の行を Rakefile の末尾に追加して、rake updatepo コマンドと rake updatemo コマンドを追加します。
なお、book_mng_textdomain と指定してあるのは、rails_root/app/controllers/application.rb ファイルの中で、init_gettext の値として book_mng_textdomain を指定したからです。

desc "Update pot/po files."
task :updatepo do
  require 'gettext/utils'
  GetText.update_pofiles("book_mng_textdomain", #テキストドメイン名(init_gettextで使用した名前)
                         Dir.glob("{app,config,components,lib}/**/*.{rb,rhtml}"), #ターゲットとなるファイル
                         "blog 1.0.0" #アプリケーションのバージョン
                         )
end

desc "Create mo-files"
task :makemo do
  require 'gettext/utils'
  GetText.create_mofiles(true, "po", "locale")
end



■rake updateo コマンドを実行して、po/book_mng_textdomain.pot ファイルを生成
この book_mng_textdomain.pot ファイルが、翻訳ファイルの元になります。ただし、このファイルは直接編集しませんが。

# rake updatepo



■po/ja ディレクトリを新規作成
book_mng_textdomain.pot をコピーする先のディレクトリを作ってあげます。ja という名前のディレクトリは、日本語だから ja になります。おフランス語だったら fr になるそうです。

# mkdir po/ja



■po/ja ディレクトリに、po/book_mng_textdomain.pot ファイルを名前を変えてコピー
拡張子が pot から po に変わることに注意しながら、po/ja ディレクトリへファイルをコピーします。

# cp po/book_mng_textdomain.pot po/ja/book_mng_textdomain.po



■po/ja/book_mng_textdomain.pot ファイルを編集
さていよいよ翻訳です。
と言ってもちょこっとだけですね、今回翻訳するのは。
po/ja/book_mng_textdomain.pot の中の以下の箇所を翻訳して差し上げます。

po/ja/book_mng_textdomain.pot
BEFORE

#: app/models/book.rb:-
msgid "book"
msgstr ""

#: app/models/book.rb:-
msgid "Book|Title"
msgstr ""

#: app/models/book.rb:-
msgid "Book|Author name"
msgstr ""

#: app/models/book.rb:-
msgid "Book|Author gender"
msgstr ""

#: app/models/book.rb:-
msgid "Book|Isbn"
msgstr ""

#: app/models/book.rb:-
msgid "Book|Price"
msgstr ""



↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

po/ja/book_mng_textdomain.pot
AFTER

#: app/models/book.rb:-
msgid "book"
msgstr ""

#: app/models/book.rb:-
msgid "Book|Title"
msgstr "タイトル"

#: app/models/book.rb:-
msgid "Book|Author name"
msgstr "著者名"

#: app/models/book.rb:-
msgid "Book|Author gender"
msgstr "著者の性別"

#: app/models/book.rb:-
msgid "Book|Isbn"
msgstr "Isbn"

#: app/models/book.rb:-
msgid "Book|Price"
msgstr "価格"



■mo ファイルを生成
以下のコマンドを実行するだけで、locale/ja/LC_MESSAGES/book_mng_textdomain.mo というファイルが勝手に作成されて完了です!

# rake makemo



■Web サーバ再起動

# script/server


(※再起動しないと、一番最初の"book"がうまく訳されて表示されない・・・ということが起きたため。)


じゃじゃじゃじゃーん。以上で po ファイルと mo ファイルの巻が終わりました。

実は、もっともっと Ruby-GetText で出来ることがあるのですが、あとはマニュアル任せということにいたします。

ではさようならぁ。

[追記 07/11/23 勤労感謝の日]
ディレクトリを作る UNIX コマンドが makedir となっていました。正しくは、mkdir なので書き直しました。orz

【広告】

[2007.09.25(Tue) 00:44] 日本語化Trackback(0) | Comments(0) 見る▼
↑TOPへ

Ruby-GetText初体験その5【ファイルをUTF-8で日本語書き換え】 

2007年09月24日 ()

その1【インストールしてみる】
その2【英語のアプリをまず作成】
その3【日本語を使うぞ宣言】
その4【require 'gettext/rails' と init_gettext】
その5【ファイルをUTF-8で日本語書き換え】
その6【po ファイルと mo ファイル】



前回 Ruby-GetText ライブラリを使いました。

今回は、Ruby-GetText からいきなり一旦離れて、単純に rhtml ファイルを日本語で書き換える地味な作業を行います。

書き換える時は、ファイルの文字コードを UTF-8 に設定することをお忘れなく!

では、早速書き換えます。

app/views/layouts/book_mng.rhtml
BEFORE

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
  <title>BookMng: <%= controller.action_name %></title>
  <%= stylesheet_link_tag 'scaffold' %>
</head>
<body>

<p style="color: green"><%= flash[:notice] %></p>

<%= yield %>

</body>
</html>


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

app/views/layouts/book_mng.rhtml
AFTER

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
  <title>本の管理: <%= controller.action_name %></title>
  <%= stylesheet_link_tag 'scaffold' %>
</head>
<body>

<p style="color: green"><%= flash[:notice] %></p>

<%= yield %>

</body>
</html>







app/views/book_mng/list.rhtml
BEFORE

<h1>Listing books</h1>

<table>
  <tr>
  <% for column in Book.content_columns %>
    <th><%= column.human_name %></th>
  <% end %>
  </tr>

<% for book in @books %>
  <tr>
  <% for column in Book.content_columns %>
    <td><%=h book.send(column.name) %></td>
  <% end %>
    <td><%= link_to 'Show', :action => 'show', :id => book %></td>
    <td><%= link_to 'Edit', :action => 'edit', :id => book %></td>
    <td><%= link_to 'Destroy', { :action => 'destroy', :id => book }, :confirm => 'Are you sure?', :method => :post %></td>
  </tr>
<% end %>
</table>

<%= link_to 'Previous page', { :page => @book_pages.current.previous } if @book_pages.current.previous %>
<%= link_to 'Next page', { :page => @book_pages.current.next } if @book_pages.current.next %>

<br />

<%= link_to 'New book', :action => 'new' %>


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

app/views/book_mng/list.rhtml
AFTER

<h1>本の一覧</h1>

<table>
  <tr>
  <% for column in Book.content_columns %>
    <th><%= column.human_name %></th>
  <% end %>
  </tr>

<% for book in @books %>
  <tr>
  <% for column in Book.content_columns %>
    <td><%=h book.send(column.name) %></td>
  <% end %>
    <td><%= link_to '詳細', :action => 'show', :id => book %></td>
    <td><%= link_to '編集', :action => 'edit', :id => book %></td>
    <td><%= link_to '削除', { :action => 'destroy', :id => book }, :confirm => '本当に削除しますか?', :method => :post %></td>
  </tr>
<% end %>
</table>

<%= link_to '前のページ', { :page => @book_pages.current.previous } if @book_pages.current.previous %>
<%= link_to '次のページ', { :page => @book_pages.current.next } if @book_pages.current.next %>

<br />

<%= link_to '本を追加', :action => 'new' %>







app/views/book_mng/show.rhtml
BEFORE

<% for column in Book.content_columns %>
<p>
  <b><%= column.human_name %>:</b> <%=h @book.send(column.name) %>
</p>
<% end %>

<%= link_to 'Edit', :action => 'edit', :id => @book %> |
<%= link_to 'Back', :action => 'list' %>


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

app/views/book_mng/show.rhtml
AFTER

<% for column in Book.content_columns %>
<p>
  <b><%= column.human_name %>:</b> <%=h @book.send(column.name) %>
</p>
<% end %>

<%= link_to '編集', :action => 'edit', :id => @book %> |
<%= link_to '戻る', :action => 'list' %>







app/views/book_mng/new.rhtml
BEFORE

<h1>New book</h1>

<% form_tag :action => 'create' do %>
  <%= render :partial => 'form' %>
  <%= submit_tag "Create" %>
<% end %>

<%= link_to 'Back', :action => 'list' %>


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

app/views/book_mng/new.rhtml
AFTER

<h1>本の追加</h1>

<% form_tag :action => 'create' do %>
  <%= render :partial => 'form' %>
  <%= submit_tag "追加する" %>
<% end %>

<%= link_to '戻る', :action => 'list' %>







app/views/book_mng/new.rhtml
BEFORE

<h1>Editing book</h1>

<% form_tag :action => 'update', :id => @book do %>
  <%= render :partial => 'form' %>
  <%= submit_tag 'Edit' %>
<% end %>

<%= link_to 'Show', :action => 'show', :id => @book %> |
<%= link_to 'Back', :action => 'list' %>


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

app/views/book_mng/new.rhtml
AFTER

<h1>本の編集</h1>

<% form_tag :action => 'update', :id => @book do %>
  <%= render :partial => 'form' %>
  <%= submit_tag '更新する' %>
<% end %>

<%= link_to '詳細', :action => 'show', :id => @book %> |
<%= link_to '戻る', :action => 'list' %>






app/views/book_mng/_form.rhtml
BEFORE

<%= error_messages_for 'book' %>

<!--[form:book]-->
<p><label for="book_title">Title</label><br/>
<%= text_field 'book', 'title' %></p>

<p><label for="book_author_name">Author name</label><br/>
<%= text_field 'book', 'author_name' %></p>

<p><label for="book_author_gender">Author gender</label><br/>
<%= radio_button 'book', 'author_gender', 'm' %>male<br/>
<%= radio_button 'book', 'author_gender', 'f' %>female<br/></p>

<p><label for="book_isbn">Isbn</label><br/>
<%= text_field 'book', 'isbn' %></p>

<p><label for="book_price">Price</label><br/>
<%= text_field 'book', 'price' %></p>
<!--[eoform:book]-->


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

app/views/book_mng/_form.rhtml
AFTER

<%= error_messages_for 'book' %>

<!--[form:book]-->
<p><label for="book_title">タイトル</label><br/>
<%= text_field 'book', 'title' %></p>

<p><label for="book_author_name">著者名</label><br/>
<%= text_field 'book', 'author_name' %></p>

<p><label for="book_author_gender">著者の性別</label><br/>
<%= radio_button 'book', 'author_gender', 'm' %><br/>
<%= radio_button 'book', 'author_gender', 'f' %><br/></p>

<p><label for="book_isbn">Isbn</label><br/>
<%= text_field 'book', 'isbn' %></p>

<p><label for="book_price">価格</label><br/>
<%= text_field 'book', 'price' %></p>
<!--[eoform:book]-->




うーん、地味だ・・・

これで、大体書き換わりましたね。次回は、Ruby-GetText に戻って、まだ日本語化しきれていない場所を日本語にしていきたいと思います。

【広告】

[2007.09.24(Mon) 13:32] 日本語化Trackback(0) | Comments(0) 見る▼
↑TOPへ

Ruby-GetText初体験その4【require 'gettext/rails' と init_gettext】 

2007年09月23日 ()

その1【インストールしてみる】
その2【英語のアプリをまず作成】
その3【日本語を使うぞ宣言】
その4【require 'gettext/rails' と init_gettext】
その5【ファイルをUTF-8で日本語書き換え】
その6【po ファイルと mo ファイル】



パート4にして本題、いよいよ Ruby-GetText を使います。

Ruby on RailsへRuby-GetTextの適用のページを参考にして、やってみます。

まず、config/environment.rb の一番最後の行で、Ruby-GetText を require します。

require 'gettext/rails'



それから、app/controllers/application.rb に、テキストドメインを指定します。テキストドメインというのは、(多分)多言語化をするのに、コントローラごとに指定する枠のようなもので、同じ英単語をコントローラごとに違う日本語に訳したい、みたいな時のためのもの(だと思います。間違いだったらご指摘お願いします。)

今回は、コントローラごとに同じ英単語を違う日本語で訳したい訳ではないので、テキストドメインは、全コントローラ共通の application.rb に1つだけ指定します。

↓赤字を追加です。
app/controllers/application.rb

class ApplicationController < ActionController::Base
  init_gettext 'book_mng_textdomain' # テキトーに、テキストドメイン名を指定してみた。
  # Pick a unique cookie name to distinguish our session data from others'
  session :session_key => '_MyFirstJapanese_session_id'
end



そして、Web サーバを再起動します。

CTRL + C
# script/server



Web ブラウザで、サイトにアクセスしてみましょう!

http://localhost:3000/book_mng/

すると・・・

変わらない OTL

でもでも、がっかりしない、実は変わった箇所があるのです。

入力画面・編集画面で、わざとエラーを出しましょう。(例えば、Title を空で送信してみる。)

すると、エラーメッセージが、半分日本語で表示されているではありませんか。(↓はその例)

bookに6つのエラーが発生しました。

次の項目を確認してください。

    * Priceは数値で入力してください。
    * Priceを入力してください。
    * Author nameは2文字以上で入力してください。
    * Author nameを入力してください。
    * Titleを入力してください。
    * Author genderを入力してください。



Ruby-GetText を使う前は、↑のエラーメッセージが全部英語でしたので、たった2行書くだけで、これだけ日本語に対応してくれるというのも恐ろしく便利です。

では、次回は、rhtml ファイルを直接いじって、ごくフツーに日本語化していきます。

【広告】

[2007.09.23(Sun) 11:20] 日本語化Trackback(0) | Comments(0) 見る▼
↑TOPへ

Ruby-GetText初体験その3【日本語を使うぞ宣言】 

2007年09月22日 ()

その1【インストールしてみる】
その2【英語のアプリをまず作成】
その3【日本語を使うぞ宣言】
その4【require 'gettext/rails' と init_gettext】
その5【ファイルをUTF-8で日本語書き換え】
その6【po ファイルと mo ファイル】



前回、やっとこさ英語版のアプリが出来たところで、今度は、Rails のソースに、これから日本語を使いますよ、という記述をします。

(まだ、Ruby-GetText を使うよ、という記述はしていませんし、今回のブログエントリでも記述しません。次回に期待!!)

この手順は、前に書いた日本語(UTF-8)を使うための準備と同じです。

というわけで、文字コードは、UTF-8 限定です。Shift_JIS や EUC-JP の場合どうやるかは・・・分かりません。

では、行きます。


1.config/environment.rb に UTF-8 使うよー、日本語ライブラリ使うよー、と記述

ファイルの先頭に書き加えます。

$KCODE = 'u'
require 'jcode'



2.データベース自体を UTF-8 に設定

これは前回やりました。

3.config/database.yml に UTF-8 使うよー、と記述

赤字の部分を書き加えます。インデントは、半角スペースでね!今回書いたのは、development: だけですが、本当は、test: にも production: にも同じく encoding: utf8 を付け加えなければなりません。

development:
  adapter: mysql
  database: MyFirstJapanese_development
  username: root
  password:
  socket: /var/lib/mysql/mysql.sock
  encoding: utf8



4.ブラウザに返すヘッダに UTF-8 使うよー、と記述

今回、scaffold で view ファイルを作りました。どこに head タグがあるかというと、
app/views/layouts/book_mng.rhtml
です。このファイルを書き換えます・・・と思ったら、↓のように、もともと UTF-8 を使用するヘッダが付いていましたので変更なしで済みます。

<head>
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
  <title>BookMng: <%= controller.action_name %></title>
  <%= stylesheet_link_tag 'scaffold' %>
</head>



はい、これで日本語をブラウザに出力したり、DB に書き込んだりしても大丈夫になりました。

次回は、いよいよ Ruby-GetText を require します。

【広告】

[2007.09.22(Sat) 21:31] 日本語化Trackback(1) | Comments(0) 見る▼
↑TOPへ

Ruby-GetText初体験その2【英語のアプリをまず作成】 

2007年09月20日 ()

その1【インストールしてみる】
その2【英語のアプリをまず作成】
その3【日本語を使うぞ宣言】
その4【require 'gettext/rails' と init_gettext】
その5【ファイルをUTF-8で日本語書き換え】
その6【po ファイルと mo ファイル】



何はともあれ、Rails アプリを作らなくては始まりません。

というわけで、今回も楽ちん scaffold を使用してみようと思います。

やろうとしているアプリは、

■アプリ名:MyFirstJapanese
■モデル:Book
 Bookモデルは、その名の通り本を表します。
■コントロール:BookMng
 まあ、この名前は適当です。
■ビュー:
 scaffold を使って、本情報の追加・変更・削除を行います。

というのが目標で、でもこれだったら英語バージョンはすぐ出来てしまいそうですね!

というわけで、さっさと英語バージョンを作ってしまいます。

# rails MyFirstJapanese



これでアプリ作成完了!

アプリのルートディレクトリへ移動します。

# cd MyFirstJapanese



アプリの開発用(_developement)のDBを作成します。今回、日本語文字コードを UTF-8 に想定していますので、その点も考慮します。
テスト用DB(_test)と本番用DB(_production)は面倒くさいから今回は作成しません。

# mysql -u root
mysql# create database MyFirstJapanese_development character set utf8;



では、scaffold を作成します。

# script/generate scaffold Book BookMng
.
.
.
error Before updating scaffolding from new DB schema, try creating a table for your model (Book)


という風にエラーがでました。orz
どうやら、Book モデルを作るのに、DB にテーブルをまだ作成していなかったのが敗因のようです。
なので、さっき作った scaffold を消しに掛かります。

# script/destroy scaffold Book BookMng



つまり、上の 2 つの手順 (script/generate scaffold.... と script/destroy scaffold....) は、やり損です。やらなくてもいいのです。ごめんね。

さて気を取り直して、DB に Book モデルに対応するテーブル、books テーブルを作りましょうっと。テーブル名は複数形なのをお忘れなく。

そのためには、手動で CREATE 文を流してもいいのですが、せっかくなので rake migrate を使います。

で、そのために、まずは migration ファイルを自動生成します。

# script/generate migration new_book_table



このコマンドで出来た db/migrate/001_new_book_table.rb ファイルを編集します。↓の赤字の部分を追加です。

db/migrate/001_new_book_table.rb

class NewBookTable < ActiveRecord::Migration
  def self.up
    create_table "books" do |t|
      t.column "title", :string # 本の名前
      t.column "author_name", :string # 作者の名前
      t.column "author_gender", :char # 作者の性別
      t.column "isbn", :string # ISBN番号
      t.column "price", :integer # 本の価格
    end

  end

  def self.down
    drop_table "books"
  end
end



そしたら、テーブルを DB の中へ作成します。

# rake db:migrate



今度こそ、script/generate scaffold コマンドが成功するはずです。

# script/generate scaffold Book BookMng



よし、これでひとまず最低限のレベルのものができあがりましたので実際に動かして試してみます。

# script/server



そして、ブラウザより

http://localhost:3000/book_mng/

を見てみましょう。

ワーイ、できたできたー。

と、これだけでは面白くないので、まずバリデーション、つまり入力規則チェックをします。↓の赤字の部分を追加です。どんな入力規則チェックかは、↓のコメントを見て察してください。

app/models/book.rb

class Book < ActiveRecord::Base
  # 必須チェック
  validates_presence_of :title
  validates_presence_of :author_name
  validates_presence_of :author_gender
  validates_presence_of :price

  # 長さチェック
  validates_length_of :title, :maximum => 50
  validates_length_of :author_name, :within => 2..40

  # フォーマットチェック
  # 数字-数字-数字-数字 の並びが0個か1個という意味です・・・
  validates_format_of :isbn, :with => /^(([\d]+-){3}[\d]+)?$/
  # 整数チェック
  validates_numericality_of :price, :only_integer => true

end



最後に、gender を male と female のラジオボタンにします。↓の赤字の部分を書き換えました。

app/views/book_mng/_form.rhtml

<%= error_messages_for 'book' %>

<!--[form:book]-->
<p><label for="book_title">Title</label><br/>
<%= text_field 'book', 'title' %></p>

<p><label for="book_author_name">Author name</label><br/>
<%= text_field 'book', 'author_name' %></p>

<p><label for="book_author_gender">Author gender</label><br/>
<%= radio_button 'book', 'author_gender', 'm' %>male<br/>
<%= radio_button 'book', 'author_gender', 'f' %>female<br/>
</p>

<p><label for="book_isbn">Isbn</label><br/>
<%= text_field 'book', 'isbn' %></p>

<p><label for="book_price">Price</label><br/>
<%= text_field 'book', 'price' %></p>
<!--[eoform:book]-->



ワーイ、できたできたー。

これで英語版は完成です。

次回、いよいよ日本語版にしていきます!一人でわくわくしています!

【広告】

[2007.09.20(Thu) 19:53] 日本語化Trackback(0) | Comments(0) 見る▼
↑TOPへ

TOP | NEXT