
フォームのラベルはどこから出るか(sys_documentation)
ServiceNow のフォームを開くと、項目には「Caller」「Priority」といったラベルが付き、ラベルにマウスを乗せると説明(ツールチップ)が出て、項目によっては横の「i」アイコンからヘルプが開きます。これらの表示文言が、どこから出ているのかを追うと、たどり着くのが 項目ドキュメント(sys_documentation) というテーブルです。
フィールドの「型」や「参照先」を決める定義本体は sys_dictionary が持っていますが、画面に見せる文言(ラベル・複数形・ヒント・ヘルプ)は別のテーブルに、言語ごとに分けて保存されています。この記事では PDI(Zurich / OOTB)で sys_documentation を実際に開き、その構造と「定義と表示文言を分ける」設計を確認します。
この記事で分かること
項目のラベル・複数形・ヒント・ヘルプが sys_documentation に入っていること
1行の単位が name(テーブル)+ element(フィールド)+ language(言語) であること
同じ項目でも言語ごとに別レコードを持ち、ユーザー言語で表示が切り替わること
定義本体の sys_dictionary と、表示文言の sys_documentation の役割分担
フォームのラベル・ツールチップ・「i」ヘルプが、どのフィールドから出ているか
この記事の内容は ServiceNow の PDI(Personal Developer Instance)Zurich(ズーリッヒ)リリースの OOTB(初期設定・英語パックのみ稼働)で確認した個人メモです。本番環境や追加の言語パックを入れた環境では、件数・言語分布・設定の内容が異なる場合があります。

項目ドキュメント(sys_documentation)とは
sys_documentation は、フィールド(と、テーブル自身)の表示文言を言語別に保存するテーブルです。ラベルだけでなく、複数形・ツールチップ・ヘルプ・ヘルプのリンク先まで、画面に出る文言をまとめて持っています。
ポイントは、定義と表示文言を分けていることです。フィールドが「参照型で、参照先は sys_user で、桁は32」といった定義は sys_dictionary が持ち、「画面では Caller と表示し、ホバーすると説明を出す」という表示文言は sys_documentation が持ちます。

冒頭の実画面は、incident テーブルの caller_id の項目ドキュメント1件です。Table に incident、Element に caller_id、Label に Caller、Hint に「Person who reported or is affected by this incident」、Language に en が入っています。フォームの「Caller」というラベルと、その説明文の出どころが、まさにこの1レコードです。
PDI(Zurich / OOTB)の sys_documentation には、143,855 件ものレコードが入っていました。フィールドの数だけ文言があるので、桁が大きくなります。固有フィールドは次のとおりです。

1行の単位は「テーブル+フィールド+言語」
sys_documentation の1行は、name(テーブル)・element(フィールド)・language(言語)の3つで決まります。同じ項目でも、言語ごとに別のレコードを持つのが肝です。

実機で、同じ element が言語別に並ぶ様子を引いてみます。あるフィールド user_email は、en では「User Email」、fr では「E-mail de l'utilisateur」と、言語ごとに別の行になっていました。

つまり、ある項目を日本語でも表示したいときは、同じ name・element で language=ja の行を1件足すだけです。元の英語行を書き換えるのではなく、言語ごとに行を積んでいきます。表示時には、ユーザーの言語設定に合う language の行が選ばれて画面に出ます。
なお、element が空の行は「テーブル自身」の文言です。incident では label=Incident・plural=Incidents が入っており、これがフォームのタイトルやリスト見出しの「Incident / Incidents」の出どころになっています。
incident のフィールド文言を実機で見る
incident テーブルに絞ると、sys_documentation は 33 行(すべて language=en) でした。この PDI は英語パックのみが稼働しているため、ja や fr の行はありません(incident では 0 件)。

代表的な項目の label と hint は次のとおりです。

ここで label・hint・help・url の使い分けが見えてきます。
label … フォームやリストに出る項目の見出し(例:Caller)。
hint … ラベルにホバーしたときのツールチップ(例:Person who reported...)。incident では 33 行中 18 行に入っていました。
help / url … 「i」アイコンから開く長めのヘルプ本文と、そのリンク先。incident OOTB では help(本文の直書き)は使われておらず、priority だけが url にヘルプのリンクを持っていました。
priority の項目ドキュメントを開くと、url に CSHelp:Prioritize-Incidents というヘルプURLが設定されています。これが「i」アイコンから公式手順へ飛ばす設定例です。

定義(sys_dictionary)との役割分担
同じ caller_id を、定義側の sys_dictionary でも開いてみます。

sys_dictionary 側には、Type=Reference・参照先=sys_user・桁=32 といった「どんなフィールドか」が入っています。一方の sys_documentation 側には「Caller」というラベルとヒントが入っていました。定義は1つ、表示文言は言語の数だけ、という分担です。

この分離のおかげで、フィールドの型や参照先はそのままに、表示文言だけを言語ごとに差し替えられます。フォームを開いたとき、ServiceNow はユーザーの言語に合う sys_documentation の行を引き、ラベル・ツールチップ・ヘルプを組み立てて表示します。

なお、Dictionary フォームの「Column label」を編集すると現在言語の表示文言が変わりますが、その編集が sys_documentation のどの行にどう書き込まれるかの厳密な挙動や、ランタイムでの言語フォールバックの順序は、今回の検証範囲外です。
まとめ
項目のラベル・複数形・ヒント・ヘルプは、定義本体の sys_dictionary ではなく sys_documentation が持つ。
1行の単位は name(テーブル)+ element(フィールド)+ language(言語)。同じ項目でも言語ごとに別レコードで、ユーザー言語に合わせて表示が切り替わる。
element が空の行はテーブル自身の単数/複数名(incident なら Incident / Incidents)。
label=見出し・hint=ツールチップ・help/url=「i」ヘルプという使い分け。incident OOTB では hint が主役で、priority だけ url にヘルプリンクを持っていた。
sys_dictionary が「どんなフィールドか(型・参照先・桁)」、sys_documentation が「画面でどう見せるか(言語別の文言)」を担当する。
ServiceNow の多言語(翻訳)は対象の種類ごとにテーブルが分かれています。メッセージやレコードの値の翻訳は 多言語・翻訳は種類ごとに別テーブル(sys_translated_text) でまとめており、この記事の sys_documentation(項目のラベル)はその続きにあたります。フィールドの土台である テーブルとフィールド(sys_db_object / sys_dictionary) と、値の選択肢を持つ 選択肢(sys_choice) も合わせて読むと、「定義・表示文言・選択肢」がどう分かれているかが見通せます。