1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-11-03

はじめに

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を例に紹介します。

Table定義設定

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

  • Name in Japanese (日本語名) Field
    NameInJapanseField.png

  • Display Name (表示名) Field
    NameInJapanseField.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

SyncNameScript.png

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

RegisterJaNameScript.png

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

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

AbelTuterEn.png

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

AbelTuterJa.png

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

AbelTuterZh.png

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

SluchbucketJa.png

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?