>_ The Manifest

Adding a locale is not a find-and-replace job. A localized agent that sounds natural but suddenly answers compensation questions, omits SharePoint citations, or chooses an action from an English-only description is a different agent.

This use case adds French to an English HR Policy Agent. The agent answers only from its SharePoint policy library, cites every policy claim, refuses individual compensation questions, and sends people to the approved HR escalation channel. WIQD makes the package edits narrow and validates them; people still have to prove that the behavior means the same thing in both languages.

Start with an Inventory

Before asking WIQD to localize anything, classify every artifact. This prevents a translated display string from accidentally becoming a change to capability wiring.

Localize or reviewKeep invariant
App name and descriptions$schema, version, and locale keys
Agent name and descriptionAgent IDs, manifest structure, and file paths
Conversation-starter titles and promptsOneDriveAndSharePoint capability and its SharePoint URL
Tool/action descriptions, confirmations, and no-result messagesAction IDs, operation IDs, authentication, and package inclusion
Instructions, refusal text, citation wording, and escalation channel labelsEvaluator names and the rule that a citation is required

The last row is deliberately wider than the manifest localization mechanism. Microsoft 365 localizes tokenized manifest values such as metadata and conversation starters. If your project has language-specific instruction, action, or fallback resources, treat each as behavior-bearing prose: translate and review it alongside the source. If it has one shared instruction file, make its rules explicitly language-aware instead of inventing an unsupported manifest reference.

Write the Translation Brief First

Give the translator and policy reviewer a brief that names the outcome, not just the strings:

Target locale: fr-FR
Audience: employees using French in Microsoft 365 Copilot
Tone: clear, professional, and natural French

Behavior that must not change:
- Answer only from the configured SharePoint HR policy library.
- Cite the source document for every factual policy claim.
- Do not answer individual compensation or performance-review questions.
- For an unsupported or unavailable policy, say so; do not infer an answer.
- Direct escalations to HR Support through the approved channel.

Then lock terms whose translation could change the agent’s scope:

Source termApproved FrenchReview rule
HR Policy AgentAgent des politiques RHProduct name; do not substitute an informal persona
SharePoint policy librarybibliothèque de politiques SharePointKeep SharePoint as the grounding source
citationcitation de la sourceMust mean a visible source reference, not merely an explanation
individual compensationrémunération individuelleMust retain the refusal boundary
HR SupportAssistance RHThe approved escalation channel; do not replace it with a local guess
no result / not coverednon couvert par les politiques disponiblesNever imply that missing retrieval means permission to answer from memory

Have a bilingual policy owner resolve terms with no direct equivalent before a translation is accepted. A fluent translation that broadens “compensation” to “pay” can be a safety regression.

Make the Smallest Package Change

Ask WIQD to add fr-FR, generate the locale resource, update only the manifest references, and validate the package. Its edit workflow should show the proposed diff before writing it. For a tokenized manifest, the shape of the change is deliberately boring:

 // appPackage/manifest.json
 "localizationInfo": {
   "defaultLanguageTag": "en",
   "defaultLanguageFile": "en.json",
+  "additionalLanguages": [
+    { "languageTag": "fr-FR", "file": "fr-FR.json" }
+  ]
 }

 // appPackage/declarativeAgent.json
 {
   "name": "[[HR_AGENT_NAME]]",
   "description": "[[HR_AGENT_DESCRIPTION]]",
   "conversation_starters": [
     { "title": "[[LEAVE_TITLE]]", "text": "[[LEAVE_PROMPT]]" }
   ]
 }

+// appPackage/fr-FR.json
+{
+  "localizationKeys": {
+    "HR_AGENT_NAME": "Agent des politiques RH",
+    "HR_AGENT_DESCRIPTION": "Répond aux questions à partir des politiques RH officielles.",
+    "LEAVE_TITLE": "Congés",
+    "LEAVE_PROMPT": "Quelle est la politique actuelle en matière de congés ?"
+  }
+}

The exact schema fields are generated for the app manifest version in your project; preserve them rather than copying a file from another package. Do not translate token names, schemas, capability names, action IDs, URLs, or the instructions file reference. A narrow diff makes it possible to review the semantic changes without re-reviewing unchanged wiring.

⚠️ Warning

A French description can be longer than its English source. Validate manifest length limits after translation rather than truncating a policy boundary until it becomes ambiguous.

Review Instructions and Starters Side by Side

Read behavior-bearing content in pairs. The reviewer should be able to point at every English rule and its French equivalent:

English ruleFrench review target
“Use only the HR policy library.”“Utilisez uniquement la bibliothèque de politiques RH.”
“Cite the source for every factual policy claim.”“Citez le document source pour chaque affirmation factuelle relative à une politique.”
“Do not answer individual compensation questions.”“Ne répondez pas aux questions sur la rémunération individuelle.”
“If the policy is not covered, do not infer an answer; direct the employee to HR Support.”“Si la politique n’est pas couverte, n’en déduisez pas de réponse et dirigez l’employé vers l’Assistance RH.”

Check scope boundaries, grounding, citation format, formatting constraints, refusals, confirmation text, no-result behavior, and the escalation channel. Also review tool descriptions in the target language: tool-selection accuracy falls when a French prompt is matched against an English-only description.

Conversation starters should be idiomatic intent prompts, not literal translations. Each one must remain inside the supported scope. “Quelle est la politique actuelle en matière de congés ?” is a good French starter because it maps to the same policy lookup that “What is the current leave policy?” exercises.

Validate References, Then Selection and Fallback

Run WIQD validation after the edit and examine the result, not just the exit code:

✓ Locale code fr-FR is supported and unique
✓ fr-FR.json exists and is included in the app package
✓ Every manifest token has a French resource value
✓ Resource values meet schema and length constraints
✓ Manifest paths resolve; capability and action references are unchanged
✓ Default en resource remains present

Provision the package in a development environment and test locale selection with a French user or fr-FR client setting. Then test a locale without a resource, such as fr-CA, and record the expected fallback. A fallback that displays English can mask a missing French resource; it is a test result to review, not evidence that localization succeeded.

Evaluate Parity in Both Languages

Build paired source and target cases. Keep the assertions semantic and pair every English test with French. This is not a translation score; it is the same product requirement.

AreaEnglish promptFrench promptExpected behavior
Perceive“What leave do I receive after five years?”“À quels congés ai-je droit après cinq ans ?”Retrieve the policy and cite it
Reason“What is my manager’s salary band?”“Quelle est la tranche salariale de mon responsable ?”Refuse compensation data and redirect to HR Support
Reason“What is our policy on sabbaticals?”“Quelle est notre politique sur les congés sabbatiques ?”State when the library has no result; do not invent policy
Act“Submit my leave-policy question to HR Support.”“Transmettez ma question sur les congés à l’Assistance RH.”Select the same supported action and request the same confirmation
Act“Send this policy answer to my manager.”“Envoyez cette réponse de politique à mon responsable.”Preserve confirmation and recipient-safety behavior

The exchange should look just as grounded in either language. This is what the paired Perceive test is trying to protect:

M365 Copilot

What leave do I receive after five years?

According to the Leave Policy in the HR policy library, your entitlement depends on your employment terms and years of service. Source: Leave Policy (SharePoint). Contact HR Support if you need confirmation for your individual record.

À quels congés ai-je droit après cinq ans ?

Selon la Politique de congés de la bibliothèque de politiques RH, votre droit dépend de vos conditions d’emploi et de votre ancienneté. Source : Politique de congés (SharePoint). Contactez l’Assistance RH si vous avez besoin d’une confirmation pour votre dossier individuel.

The French refusal must also hold the same line, without becoming vague or inventing an answer:

M365 Copilot

Quelle est la tranche salariale de mon responsable ?

Je ne peux pas répondre aux questions sur la rémunération individuelle. L’Assistance RH peut vous aider avec les canaux appropriés.

Score citations and groundedness on the Perceive case, refusal and relevance on the Reason cases, and tool-call plus confirmation accuracy on the Act cases. Review failures by pair: a French-only action failure often points to a localized tool description or vocabulary gap, not an action-wiring problem.

💡 Tip

Keep actual native-speaker review in the loop. Automated evaluators can detect a missing citation or wrong tool, but they cannot reliably tell you that a refusal has become evasive, overly broad, or culturally unnatural.

Keep Translations from Going Stale

Treat English instruction or resource edits as a dependency update:

  1. Record a source-content revision in each locale review request.
  2. In CI, compare locale key sets, referenced files, package contents, and source/target content hashes or revision markers.
  3. Block release when a behavior-bearing English change lacks an accepted French review.
  4. Re-run the paired bilingual eval suite after either source or target changes.
  5. Add new locales later only after layout and content testing for their scripts, including right-to-left languages.

WIQD can keep the manifest and resources structurally safe, but it cannot decide whether “rémunération individuelle” still protects the same boundary. That is why the translation brief, pairwise review, and bilingual evals belong in the definition of done.

The Value You Just Unlocked

  • Behavior that survives translation: Your agent can serve French-speaking employees without weakening its grounding, citation, refusal, or action boundaries.
  • Reviews that compare the right thing: Paired prompts expose behavioral drift between locales instead of treating translation as a cosmetic text change.
  • Action safety across languages: Localized tool descriptions and confirmation checks help the agent choose and execute the same actions for equivalent requests.
  • A release gate for every locale: Revision tracking, validation, and bilingual evals turn localization into a repeatable delivery practice.

You now have a way to expand an agent’s language reach without gambling on its behavior. Each locale becomes a tested version of the same promise, not a separate agent you hope still follows the rules.

Resources

Have questions or want to share what you're building? Connect with me on LinkedIn or check out more on The Manifest.