6

この質問はすでに見てきましたが、liferay-velocityについて話しているので、アクセスできないこの「$portal」オブジェクトにアクセスできるようです。

速度テンプレートでオブジェクトを作成する

具体的には、テンプレート内にロケールオブジェクトを作成して、それを$ dateTool.format呼び出しに渡して、特定の言語で出力を取得しようとしています。

ロケールオブジェクトを作成して事前にテンプレートに渡すことはできません。そのコードはさまざまなテンプレートを呼び出すことができ、それぞれが異なる言語である可能性があるためです。

私はもう試した

#set($localeClass = $portal.getClass().forName("java.util.Locale"))
$localeClass.getName

しかし、それは'$ localeClass.getName'を出力するだけです($ portalが魔法のプリセット変数か何かかどうかはわかりませんでした)。

私も試しました

#set($localeClass = java.util.Locale.class)
$localeClass.getName

しかし、テンプレートを処理しようとすると、ランタイム例外が発生しました。

ClassToolがVelocityに存在するのを見ましたが、それはコードの再帰的実行をサポートしていません。私はのようなものを試すことができると思い$classTool.inspect("java.util.Locale").getType.getConstructor([$classTool.inspect("java.util.String"),$classTool.inspect("java.util.String")]).newInstance(["es","ES"])ます。

私はそれを試してみますが、それまでの間、他の誰かがより良いアイデアを持っているかどうかを確認します。

編集

投稿してから、velocityにはConversionTool(GenericToolの概要ページにリストされていません)があり、呼び出すことができるtoLocale関数があることに気付きました。だから私は使うことができます

$dateTool.format('dd-MMM-yyyy', $date, $conversionTool.toLocale("es_ES"))

しかし、リフレクションを介してこれを達成する方法があったかどうかはまだ興味があります。

4

2 に答える 2

1

あなたはそれを大丈夫にしましたが、あなたはまたはの代わりに使う$localeClass.getName()べき$localeClass.nameです$localeClass.getName。Velocityユーザーガイドのプロパティルックアップルールを参照してください。

これ:

#set($localeClass = $portal.getClass().forName("java.util.Locale"))
$localeClass.getName()

文字列「java.util.Locale」を正しく出力してくれます。

于 2013-02-12T09:36:47.143 に答える
0

私が理解している限り、あなたも使用することができます

$localeUtil.fromLanguageId("es_ES")

Velocityテンプレートでロケールを取得するため。

私に関しては、最近ロケールを取得するためにリフレクションを使用しようとしましたが、成功しませんでした。だから私もそれが可能かどうか興味があります。

于 2012-09-07T19:39:33.377 に答える