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(フル版と最小版の両方) |
| 確認用URL | ui_locales と(外部テナントなら)mkt を付けた検証 URL |
| スクリーンショット | overrides 有り/無しでの画面比較({0} の出方が分かるもの) |

コメント