スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

I18n を使った多言語対応②

多言語対応について②。

というわけで、以前の続き。
前記事はこちら

前回はローケルファイルから文字列を読みだして表示させる所までだったが、
フォームから言語を選択し、反映させるまでを紹介する。

まず、en.ymlに合わせてconfig/localsフォルダの中にja.ymlというファイルを作成する。
これを日本語用のローケルファイルとする。以下のように編集する。

ja:
name: "ユーザーの名前"


続いて、config/initializers/i18n.rbを以下のように編集する。

I18n.default_locale = 'en'
LOCALES_DIRECTORY = "#{Rails.root}/config/locales/"
LANGUAGES = {
'English' => 'en',
'日本語' => 'ja'
}


ここではローケルファイル選択するためのハッシュを定義している。

次に、app/views/users/index.html.erbに以下を追加する。

<h1>Listing users</h1>

<% form_tag '', :method => 'get', :class => 'locale' do %>
<%= select_tag 'locale', options_for_select(LANGUAGES, I18n.locale), :onchange => 'this.form.submit()' %>
<%= submit_tag 'submit' %>
<%= javascript_tag "$$('.locale input').each(Element.hide)" %>
<% end %>


<table>
<tr>
<th><%= I18n.t('name') %></th>
</tr>

<% @users.each do |user| %>
<tr>
<td><%= user.name %></td>
<td><%= link_to 'Show', user %></td>
<td><%= link_to 'Edit', edit_user_path(user) %></td>
<td><%= link_to 'Destroy', user, :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
</table>

<br />

<%= link_to 'New User', new_user_path %>

以上は、言語選択のための選択リストを表示し、
先ほどのハッシュを元にI18n.localeを更新し、
選択されるたびに、フォーム送信を行うようにしている。

最後に、アプリケーションコントローラにbefore_filterを追加。

class ApplicationController < ActionController::Base
protect_from_forgery

before_filter :set_locale

protected
def set_locale
session[:locale] = params[:locale] if params[:locale]
I18n.locale = session[:locale] || I18n.default_local
locale_path = "#{LOCALES_DIRECTORY}#{I18n.locale}.yml"

unless I18n.load_path.include? locale_path
I18n.load_path << locale_path
I18n.backend.send(:init_translations)
end
rescue Exception => err
logger.error err
flash.now[:notice] = "#{I18n.locale} translation not available"

I18n.load_path -= [locale_path]
I18n.locale = session[:locale] = I18n.default_locale
end

end

これにより、I18n.localeの値に応じて読み込まれるローカルファイルが変わり、
表示される文字列が切り替わるようになる。

つまり「Name」の部分が、
「English」を選択すると、「User's name are」となって表示され、
「日本語」を選択すると、「ユーザーの名前」と表示される。

新たに言語を増やしたい場合は、
ローケルファイルとハッシュ値を追加するだけ。


スポンサーサイト

NetBeans 7.0 でも Ruby on Rails を使う方法

前々からアナウンスされていたので知ってはいたのだが、
最近リリースされたNetBeans 7.0ではRailsが標準で非対応になってしまった。
しかも、サイトを見てみるとRubyのダウンロードバンドル自体がばっさり非対応となってしまった模様。

覚悟はしていたが、実際この日がくると辛いものがあるね。
RailsIDEの中では無料で使い勝手も良く、プラグインも豊富だったので、この先何を使っていけばいいのやら。。。

っと、悲しみにくれていたら・・・解決策ありました!!

なんと、NetBeans用のRuby on Railsプラグインを維持しようという動きがあり、それをインストールすれば7.0でも引き続きRailsが開発できるらしい!
早速試してみた!!

まずは、NetBeans IDE ダウンロードのページからNetBeans 7.0のダウンロードとインストールを行う。ダウンロードバンドルは何でもいいが、サイズも小さめで使うかもしれないってことでJavaSEにしておいた。

次にプラグインのインストールを行う。
これに関して、以前はBeta版のアップデートセンターを手動で設定する必要があったが、
現時点ではプラグインポータルから提供されているため、以上の手順は必要ない。
以下が詳細手順である。

1.メニューから[ツール]→[プラグイン]を選択
2.[使用可能なプラグイン]タブを選択
3.[カタログを再読み込み]ボタンをクリック
4.[Ruby and Rails]をチェック
5.[インストール]ボタンをクリック
6.[次へ]ボタンをクリック
7.[すべてのライセンス契約条件に同意する]をチェック
8.[インストール]ボタンをクリック

ここまででRailsのプロジェクトが開ける状態になっている。
後は環境に合わせてセットアップ作業を行うだけだが、
自分の場合はRubyプラットフォームの設定を行った。

9.メニューから[ツール]→[Rubyプラットフォーム]を選択
10.プラットフォームを自動検出
11.使用するRubyプラットフォームを設定

この時gemのパスが正しく設定されないかもしれないので、過去記事を参照。


これでNetBeans 7.0でも引き続きRailsの開発ができる!!
ちょこっといじってみた感じ、特に問題はなさそう。
プラグインを提供してくれている関係者の皆様に心から感謝します。本当にありがとうございます!!



I18n を使った多言語対応①

多言語対応について。

ひとつの言語でサイトを作る場合は特に気にしなくてもよいが、
様々な言語に対応するサイトを構築するときに便利なのが I18n モジュールである。

まず適当にプロジェクトを作成し、scaffoldでuserモデルを作成。
$ rails new localization
$ cd localization
$ rails g scaffold user name:string

テーブルを作成し実行する。
$ rake db:migrate
$rails s

実行して適当にuserを追加しindexページにアクセスすると、
「Name」というテキストの下にuserの一覧表が出来上がる。

ここで生成されたファイルを見てみる。
config/localsフォルダの中にen.ymlというファイルが作られている。
実はこれがローケルファイルであり、I18nモジュールを使用する際に参照するファイルである。
これを以下のように編集する。
en:
name: "User's name are"


次に、このローケルファイルを参照するために、config/initializersにi18n.rbというファイルを追加し、
以下のように記述する。
I18n.default_locale = 'en'
LOCALES_DIRECTORY = "#{Rails.root}/config/locales/"

ここではI18nモジュールを使用しデフォルトの言語を1行目で設定し、
2行目で参照するローケルファイルのあるディレクトリを指定している。

最後に、app/views/users/index.html.erbを以下のように編集する。
<h1>Listing users</h1>

<table>
<tr>
<th><%= I18n.t('name') %></th>
</tr>

<% @users.each do |user| %>
<tr>
<td><%= user.name %></td>
<td><%= link_to 'Show', user %></td>
<td><%= link_to 'Edit', edit_user_path(user) %></td>
<td><%= link_to 'Destroy', user, :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
</table>

<br />

<%= link_to 'New User', new_user_path %>

すると、「Name」の部分が「User's name are」となって表示される。

このようにしてI18nモジュールを使用することができる。

これを応用すると多言語対応されたアプリケーションができるってわけ。
具体的なやり方はまた次の機会に書こうと思う。

Rails3 ルーティング ( 基本 )

前回に引き続きルートの話。
今回は基本となるmacthディレクティブについて。
前回のtest_routeプロジェクトを使って説明していく。前回の記事についてはこちら

さて、test_routeプロジェクトを作成直後のルートはこうなっていた。
$ rake routes
(in /Users/yas/NetBeansProjects/test_route)
routes GET /routes(.:format) {:action=>"index", :controller=>"routes"}
POST /routes(.:format) {:action=>"create", :controller=>"routes"}
new_route GET /routes/new(.:format) {:action=>"new", :controller=>"routes"}
edit_route GET /routes/:id/edit(.:format) {:action=>"edit", :controller=>"routes"}
route GET /routes/:id(.:format) {:action=>"show", :controller=>"routes"}
PUT /routes/:id(.:format) {:action=>"update", :controller=>"routes"}
DELETE /routes/:id(.:format) {:action=>"destroy", :controller=>"routes"}


前回はresourcesディレクティブを使ってRESTfulルートの追加を行っていたが、
実際は新しいアクションを追加するタイミングでルートの追加を行うことが多いと思う。
この時使うのが、基本となるmatchディレクティブである。

例えば、routesコントローラに:checkというアクションを追加した場合、
:idを含んだURLに対応したルートを追加するためには以下のようにする。(config/routes.rb)
match 'routes/:id/check', :to => 'routes#check'

なお、:toを省略して以下のようにも書ける。
match 'routes/:id/check' => 'routes#check'

追加後のルートを確認。
$ rake routes
(in /Users/yas/NetBeansProjects/test_route)
routes GET /routes(.:format) {:action=>"index", :controller=>"routes"}
POST /routes(.:format) {:action=>"create", :controller=>"routes"}
new_route GET /routes/new(.:format) {:action=>"new", :controller=>"routes"}
edit_route GET /routes/:id/edit(.:format) {:action=>"edit", :controller=>"routes"}
route GET /routes/:id(.:format) {:action=>"show", :controller=>"routes"}
PUT /routes/:id(.:format) {:action=>"update", :controller=>"routes"}
DELETE /routes/:id(.:format) {:action=>"destroy", :controller=>"routes"}
/routes/:id/check(.:format) {:controller=>"routes", :action=>"check"}

ルートが追加されているのが確認できる。

しかし、追加したルートにはHTTPメソッドが指定されていない。
GETに指定したい場合以下のようにする。
match 'routes/:id/check' => 'routes#check', :via => 'get'

再度ルートの確認。
$ rake routes
(in /Users/yas/NetBeansProjects/test_route)
routes GET /routes(.:format) {:action=>"index", :controller=>"routes"}
POST /routes(.:format) {:action=>"create", :controller=>"routes"}
new_route GET /routes/new(.:format) {:action=>"new", :controller=>"routes"}
edit_route GET /routes/:id/edit(.:format) {:action=>"edit", :controller=>"routes"}
route GET /routes/:id(.:format) {:action=>"show", :controller=>"routes"}
PUT /routes/:id(.:format) {:action=>"update", :controller=>"routes"}
DELETE /routes/:id(.:format) {:action=>"destroy", :controller=>"routes"}
GET /routes/:id/check(.:format) {:controller=>"routes", :action=>"check"}

GETメソッドであることが指定された。

最後に、ルートに名前をつけたい場合は以下のようにする。
match 'routes/:id/check' => 'routes#check', :via => 'get', :as => 'check_route'

$ rake routes
(in /Users/yas/NetBeansProjects/test_route)
routes GET /routes(.:format) {:action=>"index", :controller=>"routes"}
POST /routes(.:format) {:action=>"create", :controller=>"routes"}
new_route GET /routes/new(.:format) {:action=>"new", :controller=>"routes"}
edit_route GET /routes/:id/edit(.:format) {:action=>"edit", :controller=>"routes"}
route GET /routes/:id(.:format) {:action=>"show", :controller=>"routes"}
PUT /routes/:id(.:format) {:action=>"update", :controller=>"routes"}
DELETE /routes/:id(.:format) {:action=>"destroy", :controller=>"routes"}
check_route GET /routes/:id/check(.:format) {:controller=>"routes", :action=>"check"}


このようにして、macthディレクティブを使ったルートの追加ができる。


Rails3 ルーティング ( resources )

Rails3で仕様が変わったルーティングについてメモ程度に書いておく。
今回はRailsの定番、resourcesディレクティブについて。

まずはプロジェクトを作成。
$ rails new test_route
$ cd test_route

ルーティングの確認のためscaffoldを使って適当にアプリケーションを作る。
$ rails g scaffold Route test:string


現在のルーティングを確認する。
$ rake routes
(in /Users/yas/NetBeansProjects/test_route)
routes GET /routes(.:format) {:action=>"index", :controller=>"routes"}
POST /routes(.:format) {:action=>"create", :controller=>"routes"}
new_route GET /routes/new(.:format) {:action=>"new", :controller=>"routes"}
edit_route GET /routes/:id/edit(.:format) {:action=>"edit", :controller=>"routes"}
route GET /routes/:id(.:format) {:action=>"show", :controller=>"routes"}
PUT /routes/:id(.:format) {:action=>"update", :controller=>"routes"}
DELETE /routes/:id(.:format) {:action=>"destroy", :controller=>"routes"}


この時のソースを確認。
config/routes.rbを見てみると、たった一行の記述であることがわかる。
resources :routes
これはresourcesディレクティブであり、
上記のようにRESTfulルートと呼ばれる一連のルートを生成する。これによりアプリケーションは標準的なCRUD操作にアクセスできるのである。

試しにconfig/routes.rbに以下を追加してみる。
resources :routes
resources :tests

ルートの確認をすると、以下のようになる。
$ rake routes
(in /Users/yas/NetBeansProjects/test_route)
routes GET /routes(.:format) {:action=>"index", :controller=>"routes"}
POST /routes(.:format) {:action=>"create", :controller=>"routes"}
new_route GET /routes/new(.:format) {:action=>"new", :controller=>"routes"}
edit_route GET /routes/:id/edit(.:format) {:action=>"edit", :controller=>"routes"}
route GET /routes/:id(.:format) {:action=>"show", :controller=>"routes"}
PUT /routes/:id(.:format) {:action=>"update", :controller=>"routes"}
DELETE /routes/:id(.:format) {:action=>"destroy", :controller=>"routes"}
tests GET /tests(.:format) {:action=>"index", :controller=>"tests"}
POST /tests(.:format) {:action=>"create", :controller=>"tests"}
new_test GET /tests/new(.:format) {:action=>"new", :controller=>"tests"}
edit_test GET /tests/:id/edit(.:format) {:action=>"edit", :controller=>"tests"}
test GET /tests/:id(.:format) {:action=>"show", :controller=>"tests"}
PUT /tests/:id(.:format) {:action=>"update", :controller=>"tests"}
DELETE /tests/:id(.:format) {:action=>"destroy", :controller=>"tests"}


もちろんこのままではコントローラーが無いためアプリケーションとしては動作はしないが、
ルートの追加が簡単にできるので便利。

ちなみに、上の例はこのように書いても良い。
resources :routes, :tests

また、CRUD操作のうち生成するルートの制限を加えることも可能で、
その場合は:only:exceptといったオプションを使う。
例えば、showのみルート生成したい場合は、
resources :tests, :only => 'show'
のようにすると、以下のようにshowのルートのみが生成される。
$ rake routes
(in /Users/yas/NetBeansProjects/test_route)
routes GET /routes(.:format) {:action=>"index", :controller=>"routes"}
POST /routes(.:format) {:action=>"create", :controller=>"routes"}
new_route GET /routes/new(.:format) {:action=>"new", :controller=>"routes"}
edit_route GET /routes/:id/edit(.:format) {:action=>"edit", :controller=>"routes"}
route GET /routes/:id(.:format) {:action=>"show", :controller=>"routes"}
PUT /routes/:id(.:format) {:action=>"update", :controller=>"routes"}
DELETE /routes/:id(.:format) {:action=>"destroy", :controller=>"routes"}
test GET /tests/:id(.:format) {:action=>"show", :controller=>"tests"}
こんな感じ。


フェイスブック 若き天才の野望 (5億人をつなぐソーシャルネットワークはこう生まれた)


検索フォーム
プロフィール

yas

Author:yas
yasと申します。
RailsにてWebアプリケーション開発をしております。

【開発環境】
OS: Mac OSX 10.6
Ruby: 1.9
Rails: 3.0
IDE: NetBeans6.9

最新記事
カテゴリ
月別アーカイブ
RSSリンクの表示
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。