Oracle Analytics Cloud：サブジェクト領域の列名を翻訳する

# はじめに
Oracle Analytics Cloud（**OAC**）は、ログインする言語環境に従ってユーザー・インターフェースの言語が切り替わります。

:::note
- [Oracle Analyticsでは、どのような言語がサポートされていますか](https://docs.oracle.com/cd/E83857_01/paas/analytics-cloud/acabi/switch-different-language.html#GUID-2D7CD01A-2BD3-4AED-A6B1-1D19FB3CB1FB__LANG_SUPPORT)
:::

- 日本語環境でログインした際のOAC
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/7509beba-6342-add9-b992-ed9c1f5538f5.png)
- 英語環境でログインした際のOAC
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/4a979a4d-c0cb-1cec-0263-0618ef2faaa6.png)

ユーザー・インターフェースの言語は環境により切り替わりますが、サブジェクト領域やそこに定義されている列名はそうではありません。

そこで、サブジェクト領域とその列名を、日本語環境と英語環境で切り替えて表示するようにします。

# 1. セマンティック・モデルの定義
ブラウザで作成したセマンティック・モデルを改良し、多言語対応していきます。
セマンティック・モデルの作り方についてはこちらを参考にしてください。
- [Oracle Analytics Cloud：ブラウザでリポジトリ作成 1/3 ～接続プールと物理層の作成～](https://qiita.com/tyo38/items/e95b5b4c87ae3ab46669)
- [Oracle Analytics Cloud：ブラウザでリポジトリ作成 2/3 ～論理層の作成～](https://qiita.com/tyo38/items/879de11d7943afff8894)
- [Oracle Analytics Cloud：ブラウザでリポジトリ作成 3/3 ～プレゼンテーション層の作成と発行～](https://qiita.com/tyo38/items/1674b3da692746b0b1fe)
- [Oracle Analytics Cloud Classic： セマンティックモデラー(Semantic Modeler)を試す。セマンティックモデラーとは何をするものか？](https://qiita.com/tni38/items/db435c04603e3ab27f07)
- [Oracle Analytics Cloud Classic： セマンティックモデラー(Semantic Modeler)を試す。物理レイヤーをつくってみる](https://qiita.com/tni38/items/cfc1ddc9711674f30816)
- [Oracle Analytics Cloud Classic：セマンティックモデラー(Semantic Modeler)を試す。論理レイヤーをつくってみる](https://qiita.com/tni38/items/df2d6519a79e9f20aa86)
- [Oracle Analytics Cloud Classic：セマンティックモデラー(Semantic Modeler)を試す。プレゼンテーション・レイヤーをつくってみる](https://qiita.com/tni38/items/644b3ce9a1987e6eceb1)
- [Oracle Analytics Cloud Classic：セマンティックモデラー(Semantic Modeler)を試す。デプロイする](https://qiita.com/tni38/items/8c86ec796ac1937b3c6b)

## 1.1 プレゼンテーション・レイヤーの設定
セマンティック・モデルを開きます。
プレゼンテーション・レイヤーを確認すると、このセマンティック・モデルには「Sales」という名前のサブジェクト領域が定義されているのがわかります。（そういう想定です）
サブジェクト領域をダブルクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/a5ca34c0-c10d-7f68-d6a9-f44204dd642d.png)

「ローカリゼーション」タブに移動し、「変数の生成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/22b54d95-2fab-3668-ce0e-0113226ec376.png)

「名前の変数」と「サブジェクト領域とそのすべての子オブジェクト」を選択し、「生成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/5f2e0dcd-39ab-9a08-b021-4c34a3f720d6.png)

「名前の変数」に自動的に値が入力されました。
これは、「CN_Sales」というセッション変数に格納された値をサブジェクト領域の名称として参照することを意味します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/b9fe9399-177c-e347-cba2-0f36f9c30c33.png)

:::note
[セッション変数](https://docs.oracle.com/cd/E83857_01/paas/analytics-cloud/acmdg/define-session-variables.html#GUID-FD4B3597-E0E0-4C1A-8C26-61A575752637)とは？
セッションごとに生成される変数で、式などから参照することができます。
セッション変数の内容は、セッション開始時に初期化ブロックで定義されます。
:::

サブジェクト領域を右クリックし、表示されたメニューの「文字列の外部化」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/30ece8f1-8f14-985c-66b4-f7bbf1d97485.png)

「外部化」をクリックすると、CSVファイルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/25c99435-d3d9-9f90-b637-f9812e4ff0e1.png)

作成されたCSVファイルをExcelで開いてみました。
B列には変数名、C列には表示名称が格納されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/96f0609a-c951-cb41-c564-fedf25262b85.png)

これを参考に、変数名に対応する表示名称を適切なものに変更します。
さらに、これらを言語別に作成します。

## 1.2 翻訳用データをロード
編集したCSVファイルを元にして作成したのが、こちらのSQLです。
このデータを使用して、サブジェクト領域内の列を翻訳します。

```sql:trans_sa.sql
create table	SALES.LOCALIZATION
(
LANG	varchar2(4),
VAL_NAME	varchar2(60),
VALUE	varchar2(60)
);
insert into SALES.LOCALIZATION values('EN', 'CN_Sales', 'Sales Analytics');
insert into SALES.LOCALIZATION values('JA', 'CN_Sales', '販売分析');
insert into SALES.LOCALIZATION values('EN', 'CN_Sales_PROD', 'Products');
insert into SALES.LOCALIZATION values('EN', 'CN_Sales_PROD_PROD_ID', 'Prod ID');
insert into SALES.LOCALIZATION values('EN', 'CN_Sales_PROD_PROD_NAME', 'Prod Name');
insert into SALES.LOCALIZATION values('EN', 'CN_Sales_PROD_PROD_TYPE', 'Prod Type');
insert into SALES.LOCALIZATION values('EN', 'CN_Sales_PROD_PROD_LOB', 'LOB');
insert into SALES.LOCALIZATION values('EN', 'CN_Sales_PROD_PROD_BRAND', 'Brand');
insert into SALES.LOCALIZATION values('JA', 'CN_Sales_PROD', '製品');
insert into SALES.LOCALIZATION values('JA', 'CN_Sales_PROD_PROD_ID', '製品ID');
insert into SALES.LOCALIZATION values('JA', 'CN_Sales_PROD_PROD_NAME', '製品名');
insert into SALES.LOCALIZATION values('JA', 'CN_Sales_PROD_PROD_TYPE', '製品タイプ');
insert into SALES.LOCALIZATION values('JA', 'CN_Sales_PROD_PROD_LOB', 'LOB');
insert into SALES.LOCALIZATION values('JA', 'CN_Sales_PROD_PROD_BRAND', 'ブランド');
insert into SALES.LOCALIZATION values('EN', 'CN_Sales_SAMPLE_SALES', 'Sales');
insert into SALES.LOCALIZATION values('EN', 'CN_Sales_SAMPLE_SALES_PROD_ID', 'Prod ID');
insert into SALES.LOCALIZATION values('EN', 'CN_Sales_SAMPLE_SALES_ORDER_DAY_DT', 'Order Date');
insert into SALES.LOCALIZATION values('EN', 'CN_Sales_SAMPLE_SALES_REVENUE', 'Revenue');
insert into SALES.LOCALIZATION values('EN', 'CN_Sales_SAMPLE_SALES_UNITS', 'Quantity');
insert into SALES.LOCALIZATION values('JA', 'CN_Sales_SAMPLE_SALES', '販売');
insert into SALES.LOCALIZATION values('JA', 'CN_Sales_SAMPLE_SALES_PROD_ID', '製品ID');
insert into SALES.LOCALIZATION values('JA', 'CN_Sales_SAMPLE_SALES_ORDER_DAY_DT', '販売日');
insert into SALES.LOCALIZATION values('JA', 'CN_Sales_SAMPLE_SALES_REVENUE', '販売金額');
insert into SALES.LOCALIZATION values('JA', 'CN_Sales_SAMPLE_SALES_UNITS', '販売数量');
commit;
```

## 1.3 ローカリゼーション変数を設定
セマンティック・モデラーに戻ります。
「変数」に移動し、初期化ブロックを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/2e3fb165-7b21-2f4f-8f4c-6de1b8d64457.png)

任意の名前を入力し、タイプを「セッション」にして「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/61b45708-6224-358d-5efd-925275822ecd.png)

「問合せの返し」を「変数名と値」にして、「問合せ結果のキャッシュ」を選択しておきます。
SELECT文には、次の文を入力します。
```sql
select val_name, value from sales.localization where lang = upper('VALUEOF(NQ_SESSION.WEBLANGUAGE)') and value is not null
```
先程の翻訳データを検索するための接続プールを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/10387330-32e7-fba8-04a1-933250e313b0.png)

この初期化ブロックは変数名とその値を同時に検索、変数名として検索したデータで自動的にセッション変数を作成し、値をその変数の値として格納します。
よって、個別に変数を定義しません。

「問合せのテスト」の実施結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/94a9a9e8-2c0b-a17e-1c58-db155d6b1938.png)

:::note
変数の値にはNULLは許されていません。
:::

## 1.4 デプロイ
セマンティック・モデルを検査します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/84f9a340-167b-cad6-58cb-6133b1b2af5c.png)

警告が1つ出てしまいましたが、エラーはありません。
警告は初期化ブロックに関するもので
- Localization for Sales初期化ブロック内で変数が定義されていない

というものでしたので、無視してしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/eee424c1-d4b5-e90c-6930-1eed43109ceb.png)

デプロイします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/2f65c496-f47f-d9c1-5ae7-87864ed06425.png)

必要であれば、デプロイを取り消してスナップショットを取得後に再度デプロイしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/586104a5-ff15-4dce-090f-350989221337.png)

しばらく待つとデプロイが完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/3b98c9f3-30ca-5f71-1efb-af86553919c1.png)

# 2. 英語環境と日本語環境でテスト
言語を日本語に設定したブラウザでログインし、サブジェクト領域を使用したワークブックを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/7c526ab4-d4d4-12dc-ac11-1a166b5b8d9d.png)

ユーザー・インターフェースや列名が日本語で表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/7bef0298-20f4-4e1a-b88d-ee9f405ec797.png)

次に、言語を英語に設定したブラウザでログインします。
OACのユーザー・インターフェースが英語になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/0bd9af77-6bb0-8964-7803-65f7550ab3c1.png)

ワークブックを作ってみましたが、列名も英語になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/21e9f2d0-b938-7783-1c40-b05774b42a90.png)

# 3. 他の言語環境でログインしたらどうなる？
試しにスペイン語環境でログインしてみました。

UIはスペイン語になりましたが、サブジェクト領域名や列名は翻訳データを準備していないのでスペイン語になっていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/4316c5c3-9eab-e2f7-5fa0-fdf48f793d32.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/4e34f7e3-81c6-4fcd-d00c-09056aa08c52.png)

セマンティック・モデルで定義した名称がそのまま表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/c6baabc8-3fdc-8136-03ed-a749adeb5da1.png)

# おわりに
今回は、英語環境と日本語環境でサブジェクト領域の列名翻訳をする方法を紹介しました。
同様の手順により、さらに多くの言語環境への対応も可能なので試してみてください。