tohokuaikiのチラシの裏

技術的ネタとか。

Confluenceのプラグイン開発におけるJavaScriptの国際化

transformerのススメ

本当の方法であれば、propertiesファイルをJavaScriptに変更してくれるらしい。

その方法として、1つの言語ファイル(***.properties)をVerlocityテンプレートの中で使えるようにしたり、JavaScriptで使えたり、soyテンプレートで使えるようにしたりできる。

この2つのドキュメントはかぶってるんだけど、この辺りを見るとそんな感じである。
Web Resource Transformer Module - Atlassian Developers
Web Resource Transformer Plugin Module - Atlassian Developers

このtransform機能は発展するらしく、
Stateless web-resource transforms and conditions - Atlassian Developers
とかなるらしい。JIRA7とかConfluence6で。

ということで、これをAJS.I18nで使おうと。
AUI Documentation
というドキュメントを読んでみたりした。

使えねー。^^

ところが、これが全く動かない。どう見ても動かない。調べると、同じことやってる人がいた。
AJS.I18n.getText issue - Atlassian Answers

で、ウルリッヒさんが「それ動かないし、Atlassianのドキュメントも変だよね」ってことでJavaScriptのinitに

AJS.I18n.get('com.example.confluence.plugin.fooPlugin');

ってやってRESTで後付するしかないみたいだよって。。。。

んーあ。。。
ロードタイミングによっては日本語使えないじゃないか・・・・。と思ったら

AJS.I18n.get(pluginKey, successCallback, errorCallback)

なので、コールバック使ってねってことか。。。うーん。。。。Atlassianさんなんとかしてくれ。

2015.06.22 追記 ・・・AJS.I18nって・・・そういうことだったのか。

AUIのAJS.I18n.getText()が新しくなってたので読んでみたのだけど、やっぱりわからない。。。なんで新しくJavaでClassを作るんだ?
AJS.i18n | AUI Documentation

で、もう一度このページを読んでみた。。。。
How to use AJS.I18n? - Atlassian Answers
ら。、、。。

AJS.I18n.getText() requires pre-processing on the server side. It does not do any magic on the client side :)

あれ???

単にJavaScriptを吐き出す際に、プリプロセッシングしてるだけ・・・・だと・・・・・?

atlassian-plugin.xmlでtransformationを入れたjsをConfluenceが吐いたJavaScriptのコード見てみた。。。

if (!confirm(AJS.I18n.getText("hogehoge.i18n.key")))

って書いたところが、

if (!confirm("日本語の内容"))

になってる!!!

つまり、web-resourceモジュールで

      <transformation extension="js">
          <transformer key="jsI18n" />
      </transformation>

を入れておくと、JavaScriptを吐き出す際にAJS.I18n.getTextの文字列をスキャンして変換を掛けてくれるようなのだ。。。

こんな単純な仕組みだったなんて。。。

なんということだ。。。