fc2ブログ

2023.08 «  - - - - - 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 » 2023.10
TOP > Acts as authenticated 体験記 その4【日本語化をしてみる】

 ← Acts as authenticated 体験記 その5【ログイン許可・不許可】 | TOP | Acts as authenticated 体験記 その3【画面表示を見てみる】

Acts as authenticated 体験記 その4【日本語化をしてみる】 

2007年11月23日 ()
注:今回は、こうすれば出来ますよ!と順序立てて書いたものではなく、指向を変えて、私はこのように実験しました、というまさに恥ずかしい部分まで見せる生のドキュメンタリー体験記を書きます。ですので、まどろっこしいハズ!ご了承ください。


その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




そして、再度確認。

やったー、デキター。


それにしても今回のエントリは、多分今までの中で最長と思われます。ここまで読んでくださった方ありがとうございました。

次回は、ログインしていなくては表示できないページと、ログインしていなくても表示できるページはどうやって区別して設定するか、なんてやろうかと思います。

【広告】

[2007.11.23(Fri) 03:31] generator/pluginTrackback(0) | Comments(0)
↑TOPへ

 ← Acts as authenticated 体験記 その5【ログイン許可・不許可】 | TOP | Acts as authenticated 体験記 その3【画面表示を見てみる】

COMMENT

COMMENT POST















管理者にだけ表示

 ← Acts as authenticated 体験記 その5【ログイン許可・不許可】 | TOP | Acts as authenticated 体験記 その3【画面表示を見てみる】