Acts as authenticated 体験記 その4【日本語化をしてみる】
その1【取り敢えずインストール】
その2【必要ファイルを自動生成】
その3【画面表示を見てみる】
その4【日本語化をしてみる】
その5【ログイン許可・不許可】
その6【まとめ】
今回は、今あるログイン機能の日本語化をしてみたいと思います。
と、日本語化をする前に、たぶんこうすれば日本語化できるんじゃあないかな、という目処は立っています。
まず、Rails の日本語環境を整える。
そして、Ruby-GetText を使う。
てな具合かな、と思います。
それでは、まず Rails の日本語環境を整える、ですが、こちらのエントリーを参考にというかそのまんまの手順をやります。
と、いうことで、この手順は省略。
そして、次に、Ruby-GetText を使います。
この手順はべつのエントリーに書いてありましたので、そちらを参考に、Ruby-GetText を require したり app/controllers/application.rb に init_gettext を指定したりします。
init_gettext の後ろには、テキストドメイン名というものを指定しますが、今回はテキトーに 'my_log_auth_textdomain' と指定しました。
そして、Web サーバを再起動です。
アハアハ、http://localhost:3000/account/signup エラーメッセージが日本語化されました。

そしたら、今回はコントローラとビューを良く言えばすぐ多言語に対応できるローカライズ方法、悪く言えばまどろっこしい方法である、_('xxxxxxxxxxxxxxxxxx') の形式に書き換えて、po ファイル mo ファイルの準備をします。うまくいくかな?
app/controllers/account_controller.rb
class AccountController < ApplicationController
# say something nice, you goof! something sweet.
def index
redirect_to(:action => 'signup') unless logged_in? || User.count > 0
end
def login
return unless request.post?
self.current_user = User.authenticate(params[:login], params[:password])
if logged_in?
if params[:remember_me] == "1"
self.current_user.remember_me
cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
end
redirect_back_or_default(:controller => '/account', :action => 'index')
flash[:notice] = "Logged in successfully"
end
end
def signup
@user = User.new(params[:user])
return unless request.post?
@user.save!
self.current_user = @user
redirect_back_or_default(:controller => '/account', :action => 'index')
flash[:notice] = "Thanks for signing up!"
rescue ActiveRecord::RecordInvalid
render :action => 'signup'
end
def logout
self.current_user.forget_me if logged_in?
cookies.delete :auth_token
reset_session
flash[:notice] = "You have been logged out."
redirect_back_or_default(:controller => '/account', :action => 'index')
end
end
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
class AccountController < ApplicationController
# say something nice, you goof! something sweet.
def index
redirect_to(:action => 'signup') unless logged_in? || User.count > 0
end
def login
return unless request.post?
self.current_user = User.authenticate(params[:login], params[:password])
if logged_in?
if params[:remember_me] == "1"
self.current_user.remember_me
cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
end
redirect_back_or_default(:controller => '/account', :action => 'index')
flash[:notice] = _("Logged in successfully")
end
end
def signup
@user = User.new(params[:user])
return unless request.post?
@user.save!
self.current_user = @user
redirect_back_or_default(:controller => '/account', :action => 'index')
flash[:notice] = _("Thanks for signing up!")
rescue ActiveRecord::RecordInvalid
render :action => 'signup'
end
def logout
self.current_user.forget_me if logged_in?
cookies.delete :auth_token
reset_session
flash[:notice] = _("You have been logged out.")
redirect_back_or_default(:controller => '/account', :action => 'index')
end
end
app/views/account/signup.rhtml
<%= error_messages_for :user %>
<% form_for :user do |f| -%>
<p><label for="login">Login</label><br/>
<%= f.text_field :login %></p>
<p><label for="email">Email</label><br/>
<%= f.text_field :email %></p>
<p><label for="password">Password</label><br/>
<%= f.password_field :password %></p>
<p><label for="password_confirmation">Confirm Password</label><br/>
<%= f.password_field :password_confirmation %></p>
<p><%= submit_tag 'Sign up' %></p>
<% end -%>
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
<%= error_messages_for :user %>
<% form_for :user do |f| -%>
<p><label for="login">_('Login')</label><br/>
<%= f.text_field :login %></p>
<p><label for="email">_('Email')</label><br/>
<%= f.text_field :email %></p>
<p><label for="password">_('Password')</label><br/>
<%= f.password_field :password %></p>
<p><label for="password_confirmation">_('Confirm Password')</label><br/>
<%= f.password_field :password_confirmation %></p>
<p><%= submit_tag _('Sign up') %></p>
<% end -%>
app/views/account/login.rhtml
<% form_tag do -%>
<p><label for="login">Login</label><br/>
<%= text_field_tag 'login' %></p>
<p><label for="password">Password</label><br/>
<%= password_field_tag 'password' %></p>
<!-- Uncomment this if you want this functionality
<p><label for="remember_me">Remember me:</label>
<%= check_box_tag 'remember_me' %></p>
-->
<p><%= submit_tag 'Log in' %></p>
<% end -%>
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
<% form_tag do -%>
<p><label for="login">_('Login')</label><br/>
<%= text_field_tag 'login' %></p>
<p><label for="password">_('Password')</label><br/>
<%= password_field_tag 'password' %></p>
<!-- Uncomment this if you want this functionality
<p><label for="remember_me">_('Remember me'):</label>
<%= check_box_tag 'remember_me' %></p>
-->
<p><%= submit_tag _('Log in') %></p>
<% end -%>
lib/authenticated_system.rb から抜粋
def login_from_cookie
return unless cookies[:auth_token] && !logged_in?
user = User.find_by_remember_token(cookies[:auth_token])
if user && user.remember_token?
user.remember_me
self.current_user = user
cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
flash[:notice] = "Logged in successfully"
end
end
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
def login_from_cookie
return unless cookies[:auth_token] && !logged_in?
user = User.find_by_remember_token(cookies[:auth_token])
if user && user.remember_token?
user.remember_me
self.current_user = user
cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
flash[:notice] = _("Logged in successfully")
end
end
と、ここまで揃ったところで、Rakefile に 自作 rake コマンドを追加しなくちゃです。ここら辺は、こちらのエントリーを参考にしました。
テキストドメイン名は、上の方で勝手に命名した my_log_auth_textdomain を使用するということに特に注意しないとな、と。
以下を Rakefile に追加します。
Rakefile
desc "Update pot/po files."
task :updatepo do
require 'gettext/utils'
GetText.update_pofiles("my_log_auth_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 updatepo
# mkdir po/ja
# cp po/my_log_auth_textdomain.pot po/ja/my_log_auth_textdomain.po
毎回ひっかかりそうになるのですが、この最後のコマンド、pot という拡張子のファイルを po という拡張子に変えつつのコピーです。
そして、私の大好きな(嘘50%)翻訳作業です。
po/ja/my_log_auth_textdomain.po
#: app/controllers/account_controller.rb:17 lib/authenticated_system.rb:108
msgid "Logged in successfully"
msgstr ""
#: app/controllers/account_controller.rb:27
msgid "Thanks for signing up!"
msgstr ""
#: app/controllers/account_controller.rb:36
msgid "You have been logged out."
msgstr ""
#: app/models/user.rb:-
msgid "user"
msgstr ""
#: app/models/user.rb:-
msgid "User|Login"
msgstr ""
#: app/models/user.rb:-
msgid "User|Email"
msgstr ""
#: app/models/user.rb:-
msgid "User|Crypted password"
msgstr ""
#: app/models/user.rb:-
msgid "User|Salt"
msgstr ""
#: app/models/user.rb:-
msgid "User|Created at"
msgstr ""
#: app/models/user.rb:-
msgid "User|Updated at"
msgstr ""
#: app/models/user.rb:-
msgid "User|Remember token"
msgstr ""
#: app/models/user.rb:-
msgid "User|Remember token expires at"
msgstr ""
#: app/views/account/signup.rhtml:15
msgid "Sign up"
msgstr ""
#: app/views/account/login.rhtml:13
msgid "Log in"
msgstr ""
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#: app/controllers/account_controller.rb:17 lib/authenticated_system.rb:108
msgid "Logged in successfully"
msgstr "ログインできました"
#: app/controllers/account_controller.rb:27
msgid "Thanks for signing up!"
msgstr "ご登録ありがとうございます!"
#: app/controllers/account_controller.rb:36
msgid "You have been logged out."
msgstr "ログアウトしました"
#: app/models/user.rb:-
msgid "user"
msgstr "ユーザ"
#: app/models/user.rb:-
msgid "User|Login"
msgstr "ログインID"
#: app/models/user.rb:-
msgid "User|Email"
msgstr "メールアドレス"
#: app/models/user.rb:-
msgid "User|Crypted password"
msgstr "暗号化されたパスワード"
#: app/models/user.rb:-
msgid "User|Salt"
msgstr "塩(嘘でーす)"
#: app/models/user.rb:-
msgid "User|Created at"
msgstr "作成日"
#: app/models/user.rb:-
msgid "User|Updated at"
msgstr "更新日"
#: app/models/user.rb:-
msgid "User|Remember token"
msgstr "ログイン記憶用トークン"
#: app/models/user.rb:-
msgid "User|Remember token expires at"
msgstr "ログイン記憶用トークン期限"
#: app/views/account/signup.rhtml:15
msgid "Sign up"
msgstr "ユーザ登録"
#: app/views/account/login.rhtml:13
msgid "Log in"
msgstr "ログイン"
へぇー、全く同じメッセージは、まとめて1回の翻訳で済むのか。便利便利。
この po ファイルをバイナリ化してツカエルようにします。
# rake makemo
それで画面を確認すると・・・
あああああああああああああ オッパッピーーーーー
view ファイルがうまく行かなかった。_('Login') や _('Password') と、モロ表示されてもうた。
モロ表示されて失敗、の画面↓

ので rhtml を書き直す、からの再挑戦です。
app/views/account/login.rhtml
<% form_tag do -%>
<p><label for="login">_('Login')</label><br/>
<%= text_field_tag 'login' %></p>
<p><label for="password">_('Password')</label><br/>
<%= password_field_tag 'password' %></p>
<!-- Uncomment this if you want this functionality
<p><label for="remember_me">_('Remember me'):</label>
<%= check_box_tag 'remember_me' %></p>
-->
<p><%= submit_tag _('Log in') %></p>
<% end -%>
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
<% form_tag do -%>
<p><label for="login"><%= _('Login') %></label><br/>
<%= text_field_tag 'login' %></p>
<p><label for="password"><%= _('Password') %></label><br/>
<%= password_field_tag 'password' %></p>
<!-- Uncomment this if you want this functionality
<p><label for="remember_me">_('Remember me'):</label>
<%= check_box_tag 'remember_me' %></p>
-->
<p><%= submit_tag _('Log in') %></p>
<% end -%>
app/views/account/signup.rhtml
<%= error_messages_for :user %>
<% form_for :user do |f| -%>
<p><label for="login">_('Login')</label><br/>
<%= f.text_field :login %></p>
<p><label for="email">_('Email')</label><br/>
<%= f.text_field :email %></p>
<p><label for="password">_('Password')</label><br/>
<%= f.password_field :password %></p>
<p><label for="password_confirmation">_('Confirm Password')</label><br/>
<%= f.password_field :password_confirmation %></p>
<p><%= submit_tag _('Sign up') %></p>
<% end -%>
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
<%= error_messages_for :user %>
<% form_for :user do |f| -%>
<p><label for="login"><%= _('Login') %></label><br/>
<%= f.text_field :login %></p>
<p><label for="email"><%= _('Email') %></label><br/>
<%= f.text_field :email %></p>
<p><label for="password"><%= _('Password') %></label><br/>
<%= f.password_field :password %></p>
<p><label for="password_confirmation"><%= _('Confirm Password') %></label><br/>
<%= f.password_field :password_confirmation %></p>
<p><%= submit_tag _('Sign up') %></p>
<% end -%>
# rake updatepo
と打つと、なななんと、po/my_log_auth_textdomain.pot はもとより、po/ja/my_log_auth_textdomain.po ファイルまで更新してくれました。pot ファイルの更新を po に自動的に判定してくださるなんて感謝です。
さて大好きな(嘘50%)翻訳作業と行きます。
po/ja/my_log_auth_textdomain.po
#: app/views/account/signup.rhtml:3 app/views/account/login.rhtml:2
#, fuzzy
msgid "Login"
msgstr "ログイン"
#: app/views/account/signup.rhtml:6
#, fuzzy
msgid "Email"
msgstr "メールアドレス"
#: app/views/account/signup.rhtml:9 app/views/account/login.rhtml:5
msgid "Password"
msgstr ""
#: app/views/account/signup.rhtml:12
msgid "Confirm Password"
msgstr ""
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#: app/views/account/signup.rhtml:3 app/views/account/login.rhtml:2
#, fuzzy
msgid "Login"
msgstr "ログイン"
#: app/views/account/signup.rhtml:6
#, fuzzy
msgid "Email"
msgstr "メールアドレス"
#: app/views/account/signup.rhtml:9 app/views/account/login.rhtml:5
msgid "Password"
msgstr "パスワード"
#: app/views/account/signup.rhtml:12
msgid "Confirm Password"
msgstr "確認用に同じパスワードをもう一回"
fuzzy があるとうまく反映されないので、fuzzy の行は消します。(なぜ fuzzy が付いたかは不明・・・)
# rake makemo
コマンドを打って画面を再確認・・・・
再確認中・・・
・・・
万事OK!
かと思ったら、まだ不完全でした。
もー、ずるずると、このエントリーは続くなあ。
account/signup の時にエラーメッセージを表示させると、まだ英語のままのカラム名が・・・

これどーするの、と思ったら、本家のサイトに N_('XXXXXX') を使うよーって載ってましたので試します。
app/models/user.rb に N_('XXXXXXXX') を追加
class User < ActiveRecord::Base
# Virtual attribute for the unencrypted password
attr_accessor :password
N_("User|Password")
N_("User|Password confirmation")
validates_presence_of :login, :email
# rake updatepo
po/ja/my_log_auth_textdomain.po
#: app/models/user.rb:6
#, fuzzy
msgid "User|Password"
msgstr "パスワード"
#: app/models/user.rb:7
msgid "User|Password confirmation"
msgstr ""
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#: app/models/user.rb:6
msgid "User|Password"
msgstr "パスワード"
#: app/models/user.rb:7
msgid "User|Password confirmation"
msgstr "確認用のパスワード"
# rake makemo
そして、再度確認。
やったー、デキター。
それにしても今回のエントリは、多分今までの中で最長と思われます。ここまで読んでくださった方ありがとうございました。
次回は、ログインしていなくては表示できないページと、ログインしていなくても表示できるページはどうやって区別して設定するか、なんてやろうかと思います。
【広告】