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

掲示板を作ってみる・その12【ruby-gettext で日本語化】 

2008年08月12日 ()


掲示板を作ってみる・その1【何を作るの?】
掲示板を作ってみる・その2【モデルを作る パート1】
掲示板を作ってみる・その3【モデルを作る パート2】
掲示板を作ってみる・その4【ルーティングを考える】
掲示板を作ってみる・その5【コントローラを生成】
掲示板を作ってみる・その6【ヘルパを作る】
掲示板を作ってみる・その7【スレッド用コントローラを編集】
掲示板を作ってみる・その8【レス用コントローラを編集】
掲示板を作ってみる・その9【レイアウトファイルとスタイルシートファイルを作成】
掲示板を作ってみる・その10【スレッド用のビューファイルを作成】
掲示板を作ってみる・その11【レス用のビューファイルを作成】
掲示板を作ってみる・その12【ruby-gettext で日本語化】




ruby-gettext でエラーメッセージとかを日本語にしちゃいましょう。

まずは、インストール

# gem install gettext



インストール済みの人は、更新してみるのも吉

# gem update gettext



config/environment.rb の一番最初の行に

require 'jcode'




同じファイルの Rails::Initializer.run do |config| の end の直前に



  config.gem 'gettext', :lib => 'gettext/rails'
end



を書きます。

さらに、
app/controllers/application.rb の end の前に



  init_gettext 'bbs'
end



この 'bbs' という文字を、次に編集する Rakefile の GetText.update_profiles の引数に指定します。

Rakefile の最後に以下を付け足します。

desc "Update pot/po files."
task :updatepo do
  require 'gettext/utils'
  GetText.update_pofiles("bbs",
                         Dir.glob("{app,config,components,lib}/**/*.{rb,erb,rjs}"),
                         "blog 1.0.1"
                         )
end

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



そいでもって rake コマンドで日本語化用ファイルを生成します。

# rake updatepo
# mkdir po/ja
# cp po/bbs.pot po/ja/bbs.po



po/ja/bbs.po の内容を編集して翻訳していきます。




#: app/models/post.rb:-
msgid "post"
msgstr "書き込み"

#: app/models/post.rb:-
msgid "Post|Topic"
msgstr "タイトル"

#: app/models/post.rb:-
msgid "Post|Res no"
msgstr "レス番号"

#: app/models/post.rb:-
msgid "Post|Name"
msgstr "名前"

#: app/models/post.rb:-
msgid "Post|Email"
msgstr "メールアドレス"

#: app/models/post.rb:-
msgid "Post|Content"
msgstr "内容"

#: app/models/post.rb:-
msgid "Post|Ip address"
msgstr "IPアドレス"

#: app/models/post.rb:-
msgid "Post|Created at"
msgstr "書き込み日時"

#: app/models/post.rb:-
msgid "Post|Updated at"
msgstr "更新日時"

#: app/models/topic.rb:-
msgid "topic"
msgstr "スレッド"

#: app/models/topic.rb:-
msgid "Topic|Title"
msgstr "スレタイ"

#: app/models/topic.rb:-
msgid "Topic|Age time"
msgstr "age日時"

#: app/models/topic.rb:-
msgid "Topic|Created at"
msgstr "作成日付"

#: app/models/topic.rb:-
msgid "Topic|Updated at"
msgstr "更新日付"



最後に翻訳したファイルを反映させます。

# rake makemo



そして public/index.html ファイルを消します。

これで掲示板っぽいのができたはずです。結構長かったー。

サーバ立ち上げてブラウザからアクセスしてみよう!

# script/server
### http://あなた様のIPアドレス:3000/topic/list/



ちなみにこちらのようなサイトができあがるはずだと思います。

フィナーレ ~さよならするのはつらいけど~ スクールメイトさん達よろしくー!


【広告】

[2008.08.12(Tue) 11:25] 掲示板アプリTrackback(0) | Comments(0) 見る▼
↑TOPへ

掲示板を作ってみる・その11【レス用のビューファイルを作成】 

2008年08月11日 ()

掲示板を作ってみる・その1【何を作るの?】
掲示板を作ってみる・その2【モデルを作る パート1】
掲示板を作ってみる・その3【モデルを作る パート2】
掲示板を作ってみる・その4【ルーティングを考える】
掲示板を作ってみる・その5【コントローラを生成】
掲示板を作ってみる・その6【ヘルパを作る】
掲示板を作ってみる・その7【スレッド用コントローラを編集】
掲示板を作ってみる・その8【レス用コントローラを編集】
掲示板を作ってみる・その9【レイアウトファイルとスタイルシートファイルを作成】
掲示板を作ってみる・その10【スレッド用のビューファイルを作成】
掲示板を作ってみる・その11【レス用のビューファイルを作成】
掲示板を作ってみる・その12【ruby-gettext で日本語化】




レス用に view ファイルを作ります。

ボンボンと2つ立て続けに作ります。

app/views/post/list.html.erb

<%= link_to '掲示板に戻る', :controller => 'topic', :action => 'list' %>
<%= link_to '全部', :range => nil %>
<%= link_to '1-', :range => '-100' %>
<%= link_to '最新50', :range => 'l50' %>
<br>

<hr style="border-width: 0pt; background-color: rgb(136, 136, 136); color: rgb(136, 136, 136); height: 1px; position: relative; top
: -0.4em;">
<div style="margin: -0.5em 0pt 0pt; color: red; font-size: larger; font-weight: normal;">
<%= h(@topic.title) %>
</div>
<br>

<dl>
<% @posts.each do |p| %>
<dt>
<%= h(p.res_no) %> :
<% unless p.email.blank? %>
<%= mail_to p.email, '<b>' + h(p.name) + '</b>' %>
<% else %>
<font color="green"><b>
<%= h(p.name) %>
</b></font>
<% end %>
:
<%= h(date_format(p.created_at)) %>
ID:<%= h(generate_id(p.ip_address, p.created_at)) %><br>
</dt>
<dd>
<%= add_link_to_content(p.content, p.topic.id) %><br>
<br>
</dd>
<% end %>

<% if @topic_max_res_no >= MAX_POSTS %>
<dt>
このスレッドは1000を超えました。<br>
もう書けないので、新しいスレッドを立ててくださいです。。。<br>
</dt>
<% end %>
</dl>
<hr>
<center>
<%= link_to '新着レスの表示', :range => (@res_no_next-1).to_s + 'n-' %><br>
</center>
<hr>
<%= link_to '掲示板に戻る', :controller => 'topic', :action => 'list' %>
<%= link_to '全部', :range => nil %>
<%= link_to '前100', :range => '-' + @res_no_prev.to_s %>
<%= link_to '次100', :range => @res_no_next.to_s + '-' %>
<%= link_to '最新50', :range => 'l50' %>
<br>

<% if @topic_max_res_no < MAX_POSTS %>
<% form_for :post, :url => {:action => 'confirm'} do |f| %>
<%= f.submit '書き込む' %>
名前:<%= f.text_field :name, {:size => 19} %>
E-mail(省略可):<%= f.text_field :email, {:size => 19} %><br>
<%= f.text_area :content, {:rows => 5, :cols => 70, :wrap => "off"} %>
<%= f.hidden_field :topic_id, {:value => @topic.id} %>
<% end %>
<% end %>




app/views/post/confirm.html.erb

<%= error_messages_for :post %>
書き込み
<br>
<% form_for :post, :url => {:action => 'create'} do |f| %>
名前:<%= h(@post.name) %><br>
E-mail:<%= h(@post.email) %><br>
<pre>内容:<%= h(@post.content) %>
</pre>
<br>
投稿確認<br>
・自分の投稿の責任は自分で取れよ<br>
・でも著作権は放棄しろ<br>
<br>
<%= f.submit '上記全てを承諾して書き込む' %><br>
<%= f.hidden_field :name, {:value => @post.name} %>
<%= f.hidden_field :email, {:value => @post.email} %>
<%= f.hidden_field :content, {:value => @post.content} %>
<%= f.hidden_field :topic_id, {:value => @post.topic_id} %>
<% end %>
<br>
変更する場合は戻るボタンで戻って書き直して下さい。




list.html.erb
一個一個バラして見ていけば、特にそんなに難しいこともやっている訳でもないので楽勝っすね。

confirm.html.erb
scaffold したときは、こういった確認画面って表示されないような気がしたので、ちょっと参考にしていただいたら光栄です。hidden_field の :value を HTML エスケープしてはいけない(Rails がエスケープしてくれる)というルールとかがあって、頭がこんがらがりそうです。


おしまい。次回へ続く


【広告】

[2008.08.11(Mon) 11:25] 掲示板アプリTrackback(0) | Comments(0) 見る▼
↑TOPへ

掲示板を作ってみる・その10【スレッド用のビューファイルを作成】 

2008年08月10日 ()

掲示板を作ってみる・その1【何を作るの?】
掲示板を作ってみる・その2【モデルを作る パート1】
掲示板を作ってみる・その3【モデルを作る パート2】
掲示板を作ってみる・その4【ルーティングを考える】
掲示板を作ってみる・その5【コントローラを生成】
掲示板を作ってみる・その6【ヘルパを作る】
掲示板を作ってみる・その7【スレッド用コントローラを編集】
掲示板を作ってみる・その8【レス用コントローラを編集】
掲示板を作ってみる・その9【レイアウトファイルとスタイルシートファイルを作成】
掲示板を作ってみる・その10【スレッド用のビューファイルを作成】
掲示板を作ってみる・その11【レス用のビューファイルを作成】
掲示板を作ってみる・その12【ruby-gettext で日本語化】




スレッド用に view ファイルを作ります。

でもでもその前に、エラーが起きたときに、Rails はエラーが起きたコントローラ(テキストボックスとか)の周りを親切にも div ダグで囲んでくれます。
しかし、div タグだと勝手に改行されてもうて画面レイアウトがおかしくなるので、div タグで囲んでもらう代わりに、span タグで囲んでもらうようにします。

config/environment.rb の一番最後の行に

ActionView::Base.field_error_proc = Proc.new do |html_tag, instance_tag|
  "<span class='fieldWithErrors'>#{html_tag}</span>"
end



を加えます。

では、スレッド用のビューファイルをざくざくと作成していきましょう。

app/views/topic/list.html.erb

<%= error_messages_for :topic, :post %>
<% if flash[:msg] %>
<%= h(flash[:msg]) %><br />
<% end %>

<table align="center" bgcolor="#ccffcc" border="1" cellpadding="3" cellspacing="7" width="95%"><tbody><tr><td><font size="2">
<%
  if @topics.size > 0
    cnt = 1
    @topics.each do |t|
%>
<%= link_to h("#{cnt}: #{t.title} (#{t.posts.count.to_s})"), {:controller => 'post', :action => 'list', :id => t.id} %>
<%
      cnt += 1
    end
  else
%>
まだスレッドを立てていません。
<%
  end
%>
</font></td></tr>

<tr><td>
<% form_for :topic, :url => {:action => 'create'} do |f| %>
  タイトル: <%= f.text_field :title, {:size => 40} %>
  <%= f.submit '新規スレッド作成' %><br />
  <% fields_for :post do |p| %>
    名前: <%= p.text_field :name, {:size => 19} %>
    E-mail: <%= p.text_field :email, {:size => 19} %><br>
    <span style="vertical-align:top;">内容:</span>
    <%= p.text_area :content, {:rows => 5, :cols => 60, :wrap => 'OFF'} %>
  <% end %>
<% end %>
</td></tr></tbody></table>



難しいところは・・・ link_to の最初の引数を HTMLエスケープしなくてはならないつーところだけかな?質問・意見があったらコメント欄へ書いてください。

おしまい。次回へ続く


【広告】

[2008.08.10(Sun) 11:24] 掲示板アプリTrackback(0) | Comments(0) 見る▼
↑TOPへ

掲示板を作ってみる・その9【レイアウトファイルとスタイルシートファイルを作成】 

2008年08月09日 ()

掲示板を作ってみる・その1【何を作るの?】
掲示板を作ってみる・その2【モデルを作る パート1】
掲示板を作ってみる・その3【モデルを作る パート2】
掲示板を作ってみる・その4【ルーティングを考える】
掲示板を作ってみる・その5【コントローラを生成】
掲示板を作ってみる・その6【ヘルパを作る】
掲示板を作ってみる・その7【スレッド用コントローラを編集】
掲示板を作ってみる・その8【レス用コントローラを編集】
掲示板を作ってみる・その9【レイアウトファイルとスタイルシートファイルを作成】
掲示板を作ってみる・その10【スレッド用のビューファイルを作成】
掲示板を作ってみる・その11【レス用のビューファイルを作成】
掲示板を作ってみる・その12【ruby-gettext で日本語化】




いよいよ HTML 関係のフロントエンド作成です。

まずは、レイアウトファイルを作成しちゃいます。

レイアウトファイルっていうのは各画面共通の HTML で何度も書くとめんどくさいよ、という部分を切り出したものです。

app/views/layouts/default.html.erb

<html>
<head>
<title>
<%= @html_title || 'マイッチング長谷川' %>
</title>
<%= stylesheet_link_tag 's1' %>
</head>
<body alink="red" bgcolor="#efefef" text="black" vlink="#660099" link="blue">
  <%= yield %>
</body>
</html>



yield ってところに、view ファイルがポコっとはまって表示されるイメージです。

でもただレイアウトファイルを作成しても何も起きません。コントローラファイルの中で、私はこのレイアウトファイルを使うのよ!という宣言をしなくてはならないのです。

今回は、全てのコントローラに共通した処理を書く app/controllers/application.rb ファイルに、↑で作成した default レイアウトファイルを宣言します。

app/controllers/application.rb

class ApplicationController < ActionController::Base
  layout "default"





豆知識:↑で"default"ではなく:defaultと書いてしまうと、コントローラ内の default メソッドの戻り値と同じ名前のレイアウトファイルを探そうとします。くわばらくわばら。


それからスタイルシートファイルも定義していまいます。エラーメッセージを表示する所でちょっとカスタマイズするためのスタイルシートです。

public/stylesheets/s1.css

div#errorExplanation h2 {display:none;}
div#errorExplanation p {display:none;}
div#errorExplanation ul {list-style-type:none;}
div#errorExplanation li {color:#ff0000;}
pre {font-family:sans-serif;}




おしまい。次回へ続く


【広告】

[2008.08.09(Sat) 11:24] 掲示板アプリTrackback(0) | Comments(0) 見る▼
↑TOPへ

掲示板を作ってみる・その8【レス用コントローラを編集】 

2008年08月08日 ()

掲示板を作ってみる・その1【何を作るの?】
掲示板を作ってみる・その2【モデルを作る パート1】
掲示板を作ってみる・その3【モデルを作る パート2】
掲示板を作ってみる・その4【ルーティングを考える】
掲示板を作ってみる・その5【コントローラを生成】
掲示板を作ってみる・その6【ヘルパを作る】
掲示板を作ってみる・その7【スレッド用コントローラを編集】
掲示板を作ってみる・その8【レス用コントローラを編集】
掲示板を作ってみる・その9【レイアウトファイルとスタイルシートファイルを作成】
掲示板を作ってみる・その10【スレッド用のビューファイルを作成】
掲示板を作ってみる・その11【レス用のビューファイルを作成】
掲示板を作ってみる・その12【ruby-gettext で日本語化】




レス用コントローラを編集するまえに、定数定義をしておきます。それは1スレッドに、レスは最大いくつ書き込めるか、です。

config/environment.rb のファイルの本当に一番最後の行に

MAX_POSTS = 1000


と書きます。

それでは、レス用コントローラを編集しましょう。list メソッドがかなり長く、読み解くには相当な忍耐力がいりそうです。

app/controllers/post_controller.rb

class PostController < ApplicationController
  def list
    post_range = PostHelper::PostRange.new(params[:range])
    @topic = Topic.find(params[:topic_id])
    total_post = @topic.posts.count

    sql_arr = []
    sql = '(1 = 1'

    unless post_range.first.blank?
      unless post_range.from_last?
        sql += ' AND res_no >= ?'
        sql_arr << post_range.first
      end
    end

    unless post_range.last.blank?
      unless post_range.from_last?
        sql += ' AND res_no <= ?'
        sql_arr << post_range.last
      else
        sql += ' AND res_no >= ? - ? + 1'
        sql_arr << total_post << post_range.last
      end
    end

    if post_range.include_first?
      sql += ' OR res_no = 1'
    end

    sql += ')'

    sql_arr.unshift sql

    res_no_min = @topic.posts.minimum('res_no', :conditions => sql_arr)
    res_no_max = @topic.posts.maximum('res_no', :conditions => sql_arr)

    if res_no_min.blank?
      @res_no_prev = 1
    elsif res_no_min - 1 < 1
      @res_no_prev = 1
    else
      @res_no_prev = res_no_min - 1
    end

    if res_no_max.blank?
      @res_no_next = 1
    else
      @res_no_next = res_no_max + 1
    end

    @posts = @topic.posts.find(:all, :conditions => sql_arr)
    @topic_max_res_no = @topic.posts.maximum('res_no')
    @html_title = @topic.title
  end

  def confirm
    @post = Post.new(params[:post])
    @html_title = 'レス作成確認'
  end

  def create
    @post = Post.new(params[:post])
    @topic = Topic.find(params[:post][:topic_id])
    Post.transaction do
      @topic.age_time = Time.now unless @post.email == 'sage'
      @topic.save!

      @post.res_no = Post.my_topic(params[:post][:topic_id]).maximum(:res_no) + 1
      @post.ip_address = request.remote_ip
      @post.save!
    end
    redirect_to :action => 'list', :id => @topic.id
  rescue
    @html_title = 'ERROR'
    render :action => 'confirm'
  end
end



・list メソッド
どうしても SQL を 1 から組み立てる形式になってしまいました。ここが今回のアプリの一番の課題で、もっとエレガントにできないかな?と思います。

・confirm メソッド
確認画面を表示するためのメソッドで、特に難しいところはなしですね。

・create メソッド
レス書き込み用です。メルアドが sage だったらそのスレッドは、下げ進行。メルアドがそれ以外だったらスレッドをアゲます。
ということをするので、ただ単にレスだけ DB に挿入という訳ではなく、レスが属するスレッドの更新(アゲ日時の更新)も行います。

説明また粗くてスマソ。

おしまい。次回へ続く


【広告】

[2008.08.08(Fri) 11:23] 掲示板アプリTrackback(0) | Comments(0) 見る▼
↑TOPへ

TOP | NEXT