OutSystemsでは、ロケール(言語と地域のセット)をセッションごとに設定するAction(SetCurrentLocale)と設定値を取得するFunction(GetCurrentLocale)が標準提供されています。
Traditional Web Appではこれらを使って実行中アプリケーションのロケールを操作し、翻訳テキストを表示する機能があります。
(なお、翻訳テキストは開発中に設定しておく)
Reactive Web Appでは、この翻訳テキストを表示する公式の機能がありません(現時点。代わりに翻訳テキストを表示するためのForgeコンポーネントがある)。
とはいえ、SetCurrentLocale/GetCurrentLocaleを実行させることはできるので、試してみました。
参考資料
多言語機能の使い方
OutSystemsのTraditional Webで多言語化対応する
OutSystemsのReactive Web Appで多言語化対応する
公式ドキュメント
Localeの解説:多言語Webアプリケーション
SetCurrentLocale Action
GetCurrentLocale Function
サンプル
Forgeコンポーネント:https://www.outsystems.com/forge/component-overview/7086/housesoftsamplereactive
LocaleTest Screenを参照してください。
環境
Personal Environment(Version 11.9.0 (Build 16900))
Service Studio(Version 11.8.8)
APIの仕様を確認
SetCurrentLocaleはSystemモジュールのActionであるため、使うためには参照が必要。
パラメータは新たに設定するロケール1つだけ。
パラメータに設定するロケールはRFC 1766形式のもの、とドキュメントに書いてあります。
ja-JPとか、en-USみたいな形式です。使える値のリストは、Traditional Web App形式のモジュールで、Multilingual Localesを右クリック→Add Locale...で確認できます。
GetCurrentLocaleはBuilt-in Functionであるため、特に参照は必要なく使えます。しかもFunctionなのでExpressionなどで直接使えます。
GetCurrentLocaleのドキュメントでは、使用可能場所が、「サーバー側ロジック」「クライアント側ロジック」共に「可」となっています。このため、Client ActionでもServer Actionでも利用できるということに。
テスト用画面の実装
画面上にClient Actionで実行したGetCurrentLocale()の結果と、Server Actionで実行したGetCurrentLocale()の結果を並べて表示。
「設定(ja)」ボタンをクリックすると、SetCurrentLocaleにロケール「ja」を渡して実行し、表示を更新する仕組み。NewLine()はなんとなく気になったので同時に検証していました。
①Client ActionでのGetCurrentLocale()実行
画面のローカル変数を画面①のExpressionに紐付けておく。画面のOnReadyとロケール変更後にAssignの値の部分で「GetCurrentLocale()」を実行してローカル変数に保存。
Functionなので、Assignの中で直接実行できます。また、EncodeHtmlは画面に出力するので動作確認中につけたものです。この場合、GetCurrentLocaleの結果は特定の値の範囲に限られるので不要ですね。
②Server ActionでのGetCurrentLocale()実行
サーバー側で実行結果を確認したいので、Server ActionというよりData Actionで実装してみました(楽なので)。
上のスクリーンショットでいうと、RunOnServerというActionです。
Data Actionの出力変数GetCurrentLocaleResultOnServerにGetCurrentLocale()の結果を設定します。
③ボタンクリックでSetCurrentLocale()実行
ChangeLocaleServer:呼び出したServer Actionで「SetCurrentLocale」にロケールを渡して実行する。SetCurrentLocaleはクライアント側で実行できないので、Server Actionを呼び出している
Refresh:②のData Actionを再実行
Assign:①の計算を再実行
結果
初期状態:
何故か、Client ActionでのGetCurrentLocaleは空文字列を返していますね。サーバー側は「en-US」です。これがPersonal Environmentのデフォルト値でしょうね。
ロケール変更後:
初期状態と全く変わりません。念の為、デバッグ実行して、サーバー側でSetCurrentLocaleの前後でGetCurrentLocaleを実行して確認しましたが、ちゃんと変わっていました。であるにも関わらず、GetCurrentLocaleをUIから再実行すると全く最初と同じ実行結果。さらにいうと、③のボタンを再クリックしたら、初期状態と同じ値でした。
というわけで、Reactive Web Appでは、SetCurrentLocaleしても、Localeは想定通りには変わってくれませんでした。
ちなみに、ForgeのMultilingual を使うときは、独自のActionでロケールを管理しているため、そちらは正しく動作します。