2014年10月25日土曜日

Sinatraで多言語をサブディレクトリ風に管理

久しぶりの投稿です。

最近、Sinatraで多言語化することがあったので、
どんな感じにやったかの共有です。

元々、sessionに保存された言語情報から同じURLでも言語を切替えて表示してたのですが、
google的に微妙っぽいのでサブディレクトリ風に管理することにしました。
http://hogehoge.com/ => http://hogehoge.com/ja/
で、その場合に、いままでのルーティングを極力変更しないで移行したかったので、
以下の様な記述をbeforeフィルタに追加しました。

  request.path_info =~ /^\/([A-z]{2})\//
  supported_langs = ["ja", "en"]
  if supported_langs.include?($1)
    session[:lang] = request.path_info[1..2].to_sym # /en/aaa => en
    request.path_info = request.path_info[3..-1] # /en/aaa => /aaa
  else
    if session[:lang].nil?
      session[:lang] = r18n.locale.code.downcase # 適当に言語情報取得
    end 

    # 言語に依存しないスクリプト周りやPOST通信などはリダイレクトしない
    if request.get? && request.path_info !~ /^\/(api|js)/
      redirect "/#{session[:lang]}#{request.path_info}"
    end 
  end

ざっくりこんな感じです。