ドメインクラスのコメント情報から、i18nのmessages_xx.propertiesに追記する。
Grails 1.2から実装された、i18nでのクラス名プロパティ名対応は、スカッフォルド時の強い味方です。
おさらい。
i18nの messages.propertieに以下のように記述できるようになりました。これらの設定をおこなうとデフォルトのエラーメッセージにも定義した内容で表示されます。i18m-templateプラグインとほぼ同等です。
book.label = ラベル book.title.label = ラベルの名称
※ついでですが、まだ報告をあげていない、最新版の messages_ja.propertie は、以下に置いてあります。
http://gist.github.com/258601
Grails 1.3.0でしか、テストしていませんが、ドメインクラスのコメント情報から、i18nのmessages_xx.propertiesに、ラベルを追記するスクリプトを書いてみました。結構グダグダなコードですが、どうにか使えるっぽい。
使い方
ターゲットgenerate-i18n-labels に、引数は、自分のLang、日本語は'ja'をあたえて実行。 'ja'の場合は、messages_ja.propertiesに追記。引数を渡さなければ、messages.propertiesに追記されます
grails generate-i18n-labels ja
例えば、こんな感じのドメインクラス。
クラスのコメントに関しては、@labelが書いてあった場合は、@labelの後ろの文字列が優先されます。@labelが無い場合は、コメントがそのまま入ります。
/** * ブック用ドメイン * @label 書籍 */ class Book { /** タイトル */ String title /** 著者 */ String author /** 出版元 */ String publisher /** ISBN */ String isbn /** コメント */ String comment static constraints = { } }
コマンドを実行すると、messages_ja.propertiesに以下の情報が追記されます。
book.label=書籍 book.author.label=著者 book.comment.label=コメント book.isbn.label=ISBN book.publisher.label=出版元 book.title.label=タイトル
インストール方法
ソースはここに置いてあります。
http://gist.github.com/402921
軽く試すのであれば、ファイル名 GenerateI18nLabels.groovy で、PROJECT_HOME/scriptsにスクリプトをコピーして実行。いつも使うのであれば、USER_HOME/.grails/scripts にスクリプトを置いておけばいつでも実行出来ます。
これ書いてての記録
意外と悩んだ結果GroovyDoc関連はGroovyのソースコードのテストみて簡単にわかった。
ってのと、eachFileRecurseってしらんかった :-)
以下が今回書いたスクリプトのGroovyDocToolの辺り
import org.codehaus.groovy.tools.groovydoc.GroovyDocTool import org.codehaus.groovy.groovydoc.GroovyRootDoc import static groovy.io.FileType.* //... 省略 ...// File domainDir = new File('grails-app','domain') // ドメインクラスのディレクトリ List srcFiles =[] String domainSrcPath = domainDir.absolutePath+'/' //ソースディレクトリ以下のパッケージからのソースへのパスを収集 domainDir.eachFileRecurse FILES,{ srcFiles<<(it.absolutePath - domainSrcPath) } //ソースディレクトリでGroovyDocToolインスタンス生成。 def docTool = new GroovyDocTool([domainSrcPath] as String[]) //ソースファイルを指定。 docTool.add(srcFiles) //GroovyRootDocをGroovyDocToolから取得 GroovyRootDoc root = docTool.getRootDoc() //GroovyRootDocから、クラスを取得。 def classes = root.classes() //... 省略 ...//
GroovyDocTool関連、意外とわかりやすかった、もっと深いかと思った。。。:-)