Entra External ID ユーザーフロー言語カスタマイズで{0}(テナント名)が置換されない原因と回避策(overrides JSON)

Microsoft Entra External ID のユーザーフローで言語カスタマイズ(overrides JSON)を適用した後、既定テキストに含まれる {0} がテナント名などに置換されず、そのまま表示される事象が報告されています。この記事では、発生パターンの整理と、翻訳を残したまま {0} の置換を復活させるための現実的な回避策をまとめます。

目次

現象:ユーザーフローの画面で {0} がそのまま表示される

代表的には、サインイン画面の説明文に含まれる {0} が置換されずに表示されます。たとえばフランス語で次のような既定文字列がある場合、本来は「{0}」部分にテナント名(またはブランド名/アプリ名に相当する表示)が入る想定ですが、適用後に {0} のまま残ることがあります。

項目内容
発生箇所の例SignIn_Description / SignUp_Description / Attribute_Generic_ConfirmationLabel など、{0} を含む既定テキスト
見え方「… accéder à {0}」のように、置換されるはずの部分がそのまま表示される
発生トリガーカスタム属性(拡張属性)の翻訳を入れるために overrides(JSON) をアップロードした直後から発生するケースがある
切り分け結果overrides を外すと {0} は置換されるが、カスタム属性の翻訳も消える

Microsoft Q&A でも同様の報告があり、特に「overrides を入れた途端に、既存のプレースホルダー({0} など)が解決されなくなる」という声が挙がっています。

まず確認:あなたのテナント種別で「JSONの形式」が違う

Microsoft Entra External ID の言語カスタマイズは、テナント種別(外部テナント / ワークフォーステナント)で手順や JSON の形が変わります。ここを取り違えると、「想定どおりに置換されない/上書きの影響範囲が読めない」状態になりやすいので、最初に押さえておくと安全です。

観点外部テナント(Customers / CIAM)ワークフォーステナント(B2B collaboration user flows)
主な対象顧客向けサインアップ/サインイン体験組織のワークフォーステナントでの B2B コラボレーション系ユーザーフロー
JSON の形式キーと文字列の 単純なマップ(例:"SignIn_Description": "...")LocalizedStrings 配列+各要素に Override を持つ形式
ドキュメント例「Sign up and sign in」を展開して Download defaults/overrides「Attribute collection page」を展開して Download defaults/overrides
重要な注意点Company branding と User flows の双方が 同じ JSON を更新し、最後の変更が優先されるOverride を true にしない項目は「無視される」と説明されている

外部テナントのドキュメントには、ダウンロードされる JSON に SignIn_Description や SignUp_Description、カスタム属性キー(Attribute_extension_...)が同居する例が明記されています。

{0} プレースホルダーの役割

{0} は「実行時に差し込まれる値」を表すプレースホルダーです。具体的に何が入るかは文字列キーによって異なりますが、典型的には次のような用途です。

キー例{0} の意味ユーザーへの見え方の例
SignIn_Descriptionテナント名/ブランド名/アプリ名に相当する表示「{0} にアクセスするためにサインイン」
SignUp_Description同上(サインアップ向け)「{0} にアクセスするためにサインアップ」
Attribute_Generic_ConfirmationLabel確認対象の属性名(パスワード等)「{0} をもう一度入力」

外部テナント向けの例として、SignIn_Description や Attribute_Generic_ConfirmationLabel に {0} が含まれているサンプルが提示されています。

なぜ overrides 適用後に {0} が置換されなくなるのか

Microsoft Q&A の一次回答では「埋め込まれる側の文字列(テナント名)が対象言語で読めない/入力が不足すると {0} のままになる可能性がある」という説明がされています。

ただ、質問者や追記コメントでは「overrides を入れた途端に既存テキストのプレースホルダーが一斉に解決されなくなる」という現象が示されており、単純な“テナント名の言語問題”だけでは説明しにくい面があります。

実務で遭遇しやすい原因(または挙動上の落とし穴)を、起こり方ベースで整理すると次の通りです。

原因候補ありがちな状態起こる症状回避の方向性
overrides 側の値が「静的な文字列」として扱われ、置換処理が走らないダウンロードした JSON をほぼそのまま再アップロード({0} を含むキーも同梱){0} がテナント名に変わらない(文字列がそのまま出る){0} を含むキーを overrides から外し、既定リソースに任せる
Company branding と User flows の編集競合どちらでもテキストを触った(最後に触った方が勝つ)意図しない内容が出る/戻したはずなのに戻らない変更経路を一本化(User flows か Branding のどちらか)
対象ページ/対象言語の取り違え、または反映確認の不足ui_locales や mkt が想定と違う翻訳が当たったり当たらなかったりするURL パラメータ固定で検証、Configured の overrides を再ダウンロードして確認
機能側の不具合/制限(プレビュー品質含む)最小化しても再現する特定キーだけ置換しない等の不安定さ再現手順を添えて Microsoft サポートへ

最優先で試す回避策:overrides(JSON) を「最小構成」にする

この事象に対して、現場で効きやすいのは overrides を“必要最小限”に寄せるやり方です。ポイントは、{0} を含む既定キー(SignIn_Description 等)を overrides 側で保持しないことです。サービス側の既定リソースに任せることで、置換処理が有効な経路に戻る可能性が高いです。

外部テナントの場合:キー=文字列の JSON を「必要なキーだけ」に絞る

外部テナントの言語カスタマイズは、サンプル上も "SignIn_Description": "..." のような単純な JSON です。ここで カスタム属性(拡張属性)のキーだけを残し、{0} を含むキーはファイルから削除する、という考え方で回避します。

手順は次の通りです。

  • ユーザーフロー → Languages → 対象言語 → 「Sign up and sign in」を展開し、Download defaults(または Download overrides)で JSON を取得する。
  • 取得した JSON から、カスタム属性に対応するキー(例:Attribute_extension_..._Shoesize のようなもの)を探す。
  • 新しい JSON ファイルを作り、カスタム属性キーだけを残して保存する(既定キーは入れない)。
  • 作成した最小 JSON をアップロードし、Configured 側から Download overrides で内容を確認する。
  • 検証時は URL に ui_locales と mkt を付けて、確実に対象言語で表示する(例:ui_locales=fr-FR&mkt=fr-FR)。

最小 JSON の例(サンプルの拡張属性キーは架空です。必ず 自分の Download defaults に出てきたキーをそのまま使ってください)。

{
  "Attribute_extension_a235ca9a0a7c4d33bd69e07bed81c8b1_Shoesize": "Pointure"
}

この形にする狙いは明確で、{0} を含む既定キー(SignIn_Description など)を overrides 側に載せないことで、既定側の動的置換に戻すことです。外部テナントのサンプルには {0} を含むキーが多数あるため、「全部入り」をそのままアップロードし続けると影響範囲が広がりやすい点に注意してください。

もし最小化した JSON がアップロードで弾かれる(必須キーが足りない等)場合は、次の「次善策」を検討します。

  • {0} を 実値に置換した固定文言にしてしまう(例:テナント名をフランス語テキストに直書き)。動的ではなくなりますが、表示崩れは止められます。
  • 影響が大きいキーだけ削って「半分最小化」を作り、アップロード可否と {0} の挙動を探る(例:SignIn_Description/SignUp_Description/Attribute_Generic_ConfirmationLabel だけを外す)。

ワークフォーステナントの場合:Override=true を付けるのは「変更したい項目だけ」

ワークフォーステナント(B2B collaboration user flows)側のドキュメントでは、JSON の各エントリに Override があり、Override を true にしないエントリは無視される、という運用が前提になっています。

したがって、次の方針が安定します。

  • 翻訳したい(表示名を変えたい)エントリだけ Override: true にする。
  • 既定で問題なく動いている UI 文字列(特にプレースホルダーを含むもの)を、むやみに Override: true にしない。
  • カスタム属性の翻訳は、ドキュメントにある ElementType: ClaimType 形式で最小追加する。

拡張属性(カスタムユーザー属性)の表示名を翻訳する例は、次の形式で示されています。

{
  "LocalizedStrings": [
    {
      "ElementType": "ClaimType",
      "ElementId": "extension_YourCustomAttributeName",
      "StringId": "DisplayName",
      "Override": true,
      "Value": "(フランス語の表示名)"
    }
  ]
}

ここでも基本方針は同じで、既定で動的置換が走る領域は“触らない”、触る必要があるのは 自分で作ったカスタム属性に限定する、という運用に寄せます。

「最小化しても直らない」場合に確認するチェックリスト

{0} が残る問題は、原因が 1 つとは限りません。次のチェックを上から潰すと、切り分けが早いです。

チェック項目見る場所/やり方期待する状態
対象言語で表示できているかURL に ui_locales(必要なら mkt)を付与して固定常に対象言語(fr-FR 等)で表示される
本当に適用されている overrides は何かLanguages の Configured タブから Download overrides で取得サーバー側に保存されている内容が手元のファイルと一致する
Company branding 側で同じ言語を触っていないかCompany branding の Browser language customizations を確認「どちらで編集したか」が一意になっている(競合しない)
キャッシュ/反映遅延プライベートウィンドウで確認、URL にダミークエリを付与(例:&v=20251227)古い HTML/JS が残っていない
最小ファイルで再現するかカスタム属性キーのみの JSON(外部テナント)/Override=true を付けた最少要素(ワークフォース)最小で直るなら「ファイル肥大化による副作用」が濃厚

実務でのおすすめ運用:翻訳ファイルを“増やさない”ための設計

今回のように「たった 1 つのカスタム属性を翻訳したいだけなのに、既定 UI の挙動まで巻き込んで壊れる」問題は、翻訳ファイルの運用が肥大化すると起きやすくなります。そこで、運用面では次の方針が効きます。

  • 差分管理を前提にする:ダウンロードした JSON をそのまま“翻訳マスタ”にしない。必要なキーだけを抽出した「差分ファイル」を別管理し、アップロード用に使う。
  • プレースホルダーキーは “触らない” ルール化:SignIn_Description など {0} を含むキーは原則として overrides に含めない(含めるなら固定文字列にする、と運用で決める)。
  • カスタム属性のキー命名を把握:外部テナントでは Attribute_extension_...、ワークフォースでは extension_... という形で出るため、まず Download defaults 側に出たキーを正として扱う。
  • 編集経路を一本化:外部テナントは Company branding と User flows の双方が同じ JSON を触り、最新が優先されるため、チームで「どちらで管理するか」を決める。

それでも解決しない場合:不具合/制限として扱い、サポートに渡す情報

Q&A でも「overrides をアップロードすると既存プレースホルダーが解決されない」という報告があり、環境によっては機能側の不具合や制限(プレビュー品質を含む)の可能性があります。

この場合、サポート問い合わせ時に「再現性が高い最小セット」を渡せると解決が早まります。

渡すと良い情報具体例
テナント種別外部テナント(Customers)か、ワークフォーステナント(B2B collaboration user flows)か
ユーザーフロー名/種類Sign up and sign in / Sign in など、どのフローか
対象言語fr-FR など(必ずロケールまで)
再現手順「Download defaults → カスタム属性キーのみ残した最小 JSON を Upload → {0} が残る」など
ファイルアップロードした overrides JSON(フル版と最小版の両方)
確認用URLui_locales と(外部テナントなら)mkt を付けた検証 URL
スクリーンショットoverrides 有り/無しでの画面比較({0} の出方が分かるもの)

参考リンク

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次