2012年4月25日水曜日

jberkel / android-plugin とEclipse

ScalaでAndroidコードを書きたいなぁ、ということで調べていたら下記のsbtのプラグインがヒットしました。

/ android-plugin

Scala書くときにはEclipseのScala IDEがなかなか使えるし、
Androidのリソースを編集するのにも向いていていいよねー、てことでEclipse用に環境を構築しました。
結果的には、ほとんど下記の方の記事と一緒の設定になりました。

sbteclipse を android-plugin に適用して eclipse で編集する


ちょっと違うのは、私が使ったandroid-pluginが0.6.1だからか、sbteclipse-pluginが2.0.0だからなのか、
Eclipseにインポートした後にしたことは、Build PathのSourceタブにおいて、
  • src/main/res をビルドパスに追加
しただけでした。

逆にしなかったこととしては、
  • src/main/resources、src/test/resources の削除は不要。
  • Librariesタブで、target[scalaバージョン]/classes の追加は不要。
でした。


ひとまず、Eclipse上でエラーが表示されることはなくなりました。

2012年4月15日日曜日

Play Framework 2.0を学ぶ:その2 テンプレートのi18nではまった

Play Framework 2.0(Scala)のテンプレートの国際化ではまったのでメモ。

やりたいこと

テンプレートの文言を外部リソースに切り出したい。
で、言語に対応した文言を表示したい。とりあえず今回は日本語で。


やったこと

Messages and internationalization を参考に、こんな感じで設定。

  1. application.confにて、日本語を使えるように設定。
  2. application.langs="en,ja"
    
    ダブルクオートで囲む必要があるそうな。
  3. conf配下にmessges.jaファイルを作成。
    key=メッセージです!
    
    という形式で登録。
  4. テンプレートを修正し、messagesファイルを参照するよう修正。

    @Mesasges("key")

    という形式で登録。
とここで問題発生。
「メッセージです!」と表示されずに、「key」と表示されてしまいました。

messages.enファイル内でメッセージを定義しても「key」と表示されてしまう始末。

HTTPヘッダーのAccept-Languageにもja、enが含まれているのになー。


解決方法

"play  framework i18n template"で検索したところ、下記を発見。

 i18n error: controller and templates uses different implicit Langs

これによると、
  • Messagesは、implicit paramterとしてLang型の引数(lang)を取る。そのlangは、明示的に指定されない場合、JVMのデフォルトロケールを使う。
  • コントローラ内でMessagesが呼び出される際にimplicit requestが定義してあれば、そのrequestのHTTPヘッダーからAccept-Languageを取得してMessgesの引数langに暗黙的に値を設定してくれる。
  • が、テンプレート内ではスコープ内にlangを見つけられないからJVMデフォルトのロケールが使われるよ。
とのこと。
対応策としては、テンプレートの引数にimplicit parameterとしてLangを付与すれば良い、ということで、viewは下記の通りになります。
(1行目が追加した箇所)


@(implicit lang: Lang)

@Mesasges("key")


こうすると、Messagesの引数に暗黙的にlangの値が渡され、今回の日本語環境の場合はmessages.jaに定義された値を表示します。