[ServiceNow] Reference Fieldに表示されるDisplay ValueをUserの選択言語で切り替える

# はじめに

FormのReference fieldに表示される値は、Reference先のTableのDisplay fieldの値になります。Table定義で、特定のFieldがDisplay指定されていれば、そのField、あるいは、どのFieldもDisplay指定されていなければ、nameやu_nameフィールドがDisplay valueになります。

ここでは、英語以外のLanguage pluginがインストールされ、ユーザーがPreferred Languageを選択できる環境において、ユーザーが選択しているLanguageに合わせて、Reference fieldの表示する値も、その言語の値に自動的に切り替える方法をCompany tableを例に紹介します。

:::note info
[参照] Display valueの設定方法とDisplayされるfieldの優先順位
https://docs.servicenow.com/bundle/vancouver-platform-administration/page/administer/field-administration/task/t_SelectTheDisplayValue.html
:::

# Table定義設定

まず、CompanyテーブのOOTBであるNameフィールドは、会社の英語名を入力する前提で、日本語名を入力するためのString fieldと英語名と日本語の両方を情報として保持するためのTranslated Text fieldを、次のように追加します。ここで、ポイントはTranslated Text fieldをDisplayに指定しておくことです。

* Name in Japanese (日本語名) Field
![NameInJapanseField.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/39c8491d-638e-596e-2f4e-7092c55c962a.png)

* Display Name (表示名) Field
![NameInJapanseField.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/06e9d10e-e41d-4c1a-303a-8e5a7441acdf.png)

# Business Rule設定

次に、Nameフィールド（英語名）やName in Japanese（日本語名）フィールドが入力されたときに、Translated Text fieldに転記したり、Translated Text tableに対訳となる日本語名の値をもつレコードを追加・変更したりするBusiness Ruleを作成します。

1つ目のBusiness Ruleは、Before Insert/Updateで、Nameの値は、Display Nameに単純転記します。安全のため、Name in Japaneseが空だった場合は、Nameを転記して、英語名と日本語名を同一にします。

![SyncName.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/5700421a-5f77-daab-6a2a-77dfe36c691b.png)

![SyncNameScript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/27c09e7f-6766-afc2-e1f8-b08273f1ac47.png)

```JavaScript:Script
(function executeRule(current, previous /*null when async*/ ) {

    // Add your code here
    current.u_display_name = current.name;
    if (!current.u_name_in_japanese) {
        current.u_name_in_japanese = current.name;
    }

})(current, previous);
```

2つ目のBusiness Ruleは、After Insert/Updateで、Name in Japaneseの入力値を、Translated Text tableに保持させます。値が初めて登録された場合と、既存の値が変更された場合の両方に対応させます。

![RegisterJaName.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/2079d0fb-93bd-f369-8652-3c5b927c88ff.png)

![RegisterJaNameScript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/30d764ea-3b78-ecf0-3fec-89c4596f2485.png)

```JavaScript:Script
(function executeRule(current, previous /*null when async*/ ) {

    // Add your code here
    var tableName = current.getTableName();
    var diplayField = "u_display_name";
    var translationLang = "ja";
    var translatedValue = current.u_name_in_japanese;

    var grTX = new GlideRecord("sys_translated_text");
    grTX.addQuery("tablename", tableName);
    grTX.addQuery("fieldname", diplayField);
    grTX.addQuery("documentkey", current.sys_id);
    grTX.addQuery("language", translationLang);

    grTX.query();

    if (grTX.next()) {
        grTX.value = translatedValue;
        grTX.update();
    } else {
        grTX.initialize();
        grTX.tablename = tableName;
        grTX.fieldname = diplayField;
        grTX.documentkey = current.sys_id;
        grTX.language = translationLang;
        grTX.value = translatedValue;
        grTX.insert();
    }
})(current, previous);
```

# 結果の確認

事前に、Nameフィールド（英語名）やName in Japanese（日本語名）フィールドが入力されたCompanyレコードをいくつか用意します。

![CompanyList.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/2c760e15-231a-e3e9-0915-5c2a27c1e70a.png)

Abel Tuterを、そのうちのひとつに所属させます。英語環境だと、次のように見えます。Comapany fieldに会社の英語名が表示されてます。

![AbelTuterEn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/6cc43452-07cd-0e40-81d9-da7a94b53fc9.png)

日本語環境に切り替えると、Company fieldの値も日本語名に切り替わりました。

![AbelTuterJa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/9e53a75f-6ac4-ff35-898c-b232a3a0d178.png)

ついでに、中国語（簡体字）環境に切り替えると、Translated Text tableには中国語名の対訳が保持されていないため、代替として英語名が表示され、空になるようなことはありません。

![AbelTuterZh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/ac8fa963-dc0b-82b0-3cb1-9d595b55d96d.png)

なお、この表示切り替えは、Reference fieldの値を選択するList viewや、List typeのReference fieldの値を選択するSluchbucketでも有効です。ただし、List viewは、事前にDisplay Nameが表示されるようにList Layoutを変更して下さい。
日本語環境のSluchbucketの表示だけ、以下に示します。日本語以外の環境であれば、Sluchbucketの左右の選択区画に会社の英語名が表示されます。

![SluchbucketJa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/9846a802-9cd0-da07-5535-00267f84e3cc.png)