[OutSystems]Reactive Web AppでのSetCurrentLocaleは意味をなさない

OutSystemsでは、ロケール（言語と地域のセット）をセッションごとに設定するAction（SetCurrentLocale）と設定値を取得するFunction（GetCurrentLocale）が標準提供されています。
Traditional Web Appではこれらを使って実行中アプリケーションのロケールを操作し、翻訳テキストを表示する機能があります。
（なお、翻訳テキストは開発中に設定しておく）

Reactive Web Appでは、この翻訳テキストを表示する公式の機能がありません（現時点。代わりに翻訳テキストを表示するためのForgeコンポーネントがある）。
とはいえ、SetCurrentLocale/GetCurrentLocaleを実行させることはできるので、試してみました。

# 参考資料
## 多言語機能の使い方
[OutSystemsのTraditional Webで多言語化対応する](https://qiita.com/jyunji_watanabe/items/d807e2ac761f70829b75)
[OutSystemsのReactive Web Appで多言語化対応する](https://qiita.com/jyunji_watanabe/items/9c666e7883fa73e0a11f)

## 公式ドキュメント
Localeの解説：[多言語Webアプリケーション](https://success.outsystems.com/ja-jp/Documentation/11/Developing_an_Application/Design_UI/Translating_the_app_UI/Multilingual_Web_Applications)
[SetCurrentLocale Action](https://success.outsystems.com/ja-jp/Documentation/11/Reference/OutSystems_APIs/System_Actions#SetCurrentLocale)
[GetCurrentLocale Function](https://success.outsystems.com/ja-jp/Documentation/11/Reference/OutSystems_Language/Logic/Built-in_Functions/Environment#GetCurrentLocale)

# サンプル
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()はなんとなく気になったので同時に検証していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a3133b8a-cd73-0dfd-8291-c5f61f5b5c53.png)

## ①Client ActionでのGetCurrentLocale()実行
画面のローカル変数を画面①のExpressionに紐付けておく。画面のOnReadyとロケール変更後にAssignの値の部分で「GetCurrentLocale()」を実行してローカル変数に保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/13945c59-8125-2e39-06d0-0648126e7137.png)

Functionなので、Assignの中で直接実行できます。また、EncodeHtmlは画面に出力するので動作確認中につけたものです。この場合、GetCurrentLocaleの結果は特定の値の範囲に限られるので不要ですね。

## ②Server ActionでのGetCurrentLocale()実行
サーバー側で実行結果を確認したいので、Server ActionというよりData Actionで実装してみました（楽なので）。
上のスクリーンショットでいうと、RunOnServerというActionです。
Data Actionの出力変数GetCurrentLocaleResultOnServerにGetCurrentLocale()の結果を設定します。

## ③ボタンクリックでSetCurrentLocale()実行
ボタンクリック時のActionは以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/65ec5130-26f0-8b66-7926-81152aa090f1.png)

ChangeLocaleServer：呼び出したServer Actionで「SetCurrentLocale」にロケールを渡して実行する。SetCurrentLocaleはクライアント側で実行できないので、Server Actionを呼び出している
Refresh：②のData Actionを再実行
Assign：①の計算を再実行

# 結果
初期状態：
何故か、Client ActionでのGetCurrentLocaleは空文字列を返していますね。サーバー側は「en-US」です。これがPersonal Environmentのデフォルト値でしょうね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/0c45a79e-ef07-f5a1-4e4d-1a364e9abac1.png)

ロケール変更後：
初期状態と全く変わりません。念の為、デバッグ実行して、サーバー側でSetCurrentLocaleの前後でGetCurrentLocaleを実行して確認しましたが、ちゃんと変わっていました。であるにも関わらず、GetCurrentLocaleをUIから再実行すると全く最初と同じ実行結果。さらにいうと、③のボタンを再クリックしたら、初期状態と同じ値でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/8510d709-8a0e-3a38-7125-ff5130e3b973.png)

というわけで、Reactive Web Appでは、SetCurrentLocaleしても、Localeは想定通りには変わってくれませんでした。
ちなみに、ForgeのMultilingual を使うときは、独自のActionでロケールを管理しているため、そちらは正しく動作します。