---
phase: 02-permissions
plan: 05
type: execute
wave: 1
depends_on:
  - 02-01
files_modified:
  - SharepointToolbox/Localization/Strings.resx
  - SharepointToolbox/Localization/Strings.fr.resx
  - SharepointToolbox/Localization/Strings.Designer.cs
autonomous: true
requirements:
  - PERM-01
  - PERM-02
  - PERM-04
  - PERM-05
  - PERM-06

must_haves:
  truths:
    - "All Phase 2 UI string keys exist in Strings.resx with English values"
    - "All Phase 2 UI string keys exist in Strings.fr.resx with French values (no English fallback — all keys translated)"
    - "Strings.Designer.cs contains a static property for each new key"
    - "Application still builds and existing localization tests pass"
  artifacts:
    - path: "SharepointToolbox/Localization/Strings.resx"
      provides: "English strings for Phase 2 UI"
      contains: "grp.scan.opts"
    - path: "SharepointToolbox/Localization/Strings.fr.resx"
      provides: "French translations for Phase 2 UI"
      contains: "grp.scan.opts"
    - path: "SharepointToolbox/Localization/Strings.Designer.cs"
      provides: "Static C# accessors for all string keys"
  key_links:
    - from: "PermissionsView.xaml"
      to: "Strings.Designer.cs"
      via: "TranslationSource binding"
      pattern: "TranslationSource"
---

<objective>
Add all Phase 2 localization keys (EN + FR) to the existing resx files and update Strings.Designer.cs. This plan runs in Wave 1 parallel to Plans 02 and 03 because it only touches localization files.

Purpose: Phase 2 UI views reference localization keys. All keys must exist before the Views and ViewModels can bind to them.
Output: Updated Strings.resx, Strings.fr.resx, Strings.Designer.cs with 15 new keys.
</objective>

<execution_context>
@C:/Users/SebastienQUEROL/.claude/get-shit-done/workflows/execute-plan.md
@C:/Users/SebastienQUEROL/.claude/get-shit-done/templates/summary.md
</execution_context>

<context>
@.planning/PROJECT.md
@.planning/phases/02-permissions/02-RESEARCH.md

<interfaces>
<!-- Localization key naming convention from Phase 1 -->
<!-- Keys use dot.notation: prefix.noun or prefix.verb.noun -->
<!-- Values in Strings.resx are English; Strings.fr.resx are French -->
<!-- Strings.Designer.cs is maintained manually (ResXFileCodeGenerator is VS-only) -->
<!-- Example existing key: btn.login="Log In" / btn.connexion="Se connecter" -->

Phase 2 keys to add (from PS reference lines 2751-2761):
```
Key                    English Value                          French Value
----                   ----------------                       ---------------
grp.scan.opts          Scan Options                           Options d'analyse
chk.scan.folders       Scan Folders                           Analyser les dossiers
chk.recursive          Recursive (subsites)                   Récursif (sous-sites)
lbl.folder.depth       Folder depth:                          Profondeur des dossiers :
chk.max.depth          Maximum (all levels)                   Maximum (tous les niveaux)
chk.inherited.perms    Include Inherited Permissions          Inclure les permissions héritées
grp.export.fmt         Export Format                          Format d'export
rad.csv.perms          CSV                                    CSV
rad.html.perms         HTML                                   HTML
btn.gen.perms          Generate Report                        Générer le rapport
btn.open.perms         Open Report                            Ouvrir le rapport
btn.view.sites         View Sites                             Voir les sites
perm.site.url          Site URL:                              URL du site :
perm.or.select         or select multiple sites:              ou sélectionnez plusieurs sites :
perm.sites.selected    {0} site(s) selected                   {0} site(s) sélectionné(s)
```

Strings.Designer.cs pattern (existing):
```csharp
// Each key becomes a static property:
public static string grp_scan_opts => ResourceManager.GetString("grp.scan.opts", resourceCulture) ?? string.Empty;
// Note: dots in key names become underscores in C# property names
```
</interfaces>
</context>

<tasks>

<task type="auto">
  <name>Task 1: Add Phase 2 localization keys to resx files and Designer</name>
  <files>
    SharepointToolbox/Localization/Strings.resx
    SharepointToolbox/Localization/Strings.fr.resx
    SharepointToolbox/Localization/Strings.Designer.cs
  </files>
  <action>
    IMPORTANT: These are XML files — read each file first before modifying to understand the existing structure and avoid breaking it.

    Step 1: Add the following 15 `<data>` entries to Strings.resx (English), inside the `<root>` element, after the last existing `<data>` block:
    ```xml
    <data name="grp.scan.opts" xml:space="preserve"><value>Scan Options</value></data>
    <data name="chk.scan.folders" xml:space="preserve"><value>Scan Folders</value></data>
    <data name="chk.recursive" xml:space="preserve"><value>Recursive (subsites)</value></data>
    <data name="lbl.folder.depth" xml:space="preserve"><value>Folder depth:</value></data>
    <data name="chk.max.depth" xml:space="preserve"><value>Maximum (all levels)</value></data>
    <data name="chk.inherited.perms" xml:space="preserve"><value>Include Inherited Permissions</value></data>
    <data name="grp.export.fmt" xml:space="preserve"><value>Export Format</value></data>
    <data name="rad.csv.perms" xml:space="preserve"><value>CSV</value></data>
    <data name="rad.html.perms" xml:space="preserve"><value>HTML</value></data>
    <data name="btn.gen.perms" xml:space="preserve"><value>Generate Report</value></data>
    <data name="btn.open.perms" xml:space="preserve"><value>Open Report</value></data>
    <data name="btn.view.sites" xml:space="preserve"><value>View Sites</value></data>
    <data name="perm.site.url" xml:space="preserve"><value>Site URL:</value></data>
    <data name="perm.or.select" xml:space="preserve"><value>or select multiple sites:</value></data>
    <data name="perm.sites.selected" xml:space="preserve"><value>{0} site(s) selected</value></data>
    ```

    Step 2: Add the same 15 `<data>` entries to Strings.fr.resx (French) with the French values from the table above. All values must be genuine French — no copying English values.

    Step 3: Add 15 static properties to Strings.Designer.cs, following the exact pattern of existing properties. Dots in key names become underscores:
    ```csharp
    public static string grp_scan_opts => ResourceManager.GetString("grp.scan.opts", resourceCulture) ?? string.Empty;
    public static string chk_scan_folders => ResourceManager.GetString("chk.scan.folders", resourceCulture) ?? string.Empty;
    public static string chk_recursive => ResourceManager.GetString("chk.recursive", resourceCulture) ?? string.Empty;
    public static string lbl_folder_depth => ResourceManager.GetString("lbl.folder.depth", resourceCulture) ?? string.Empty;
    public static string chk_max_depth => ResourceManager.GetString("chk.max.depth", resourceCulture) ?? string.Empty;
    public static string chk_inherited_perms => ResourceManager.GetString("chk.inherited.perms", resourceCulture) ?? string.Empty;
    public static string grp_export_fmt => ResourceManager.GetString("grp.export.fmt", resourceCulture) ?? string.Empty;
    public static string rad_csv_perms => ResourceManager.GetString("rad.csv.perms", resourceCulture) ?? string.Empty;
    public static string rad_html_perms => ResourceManager.GetString("rad.html.perms", resourceCulture) ?? string.Empty;
    public static string btn_gen_perms => ResourceManager.GetString("btn.gen.perms", resourceCulture) ?? string.Empty;
    public static string btn_open_perms => ResourceManager.GetString("btn.open.perms", resourceCulture) ?? string.Empty;
    public static string btn_view_sites => ResourceManager.GetString("btn.view.sites", resourceCulture) ?? string.Empty;
    public static string perm_site_url => ResourceManager.GetString("perm.site.url", resourceCulture) ?? string.Empty;
    public static string perm_or_select => ResourceManager.GetString("perm.or.select", resourceCulture) ?? string.Empty;
    public static string perm_sites_selected => ResourceManager.GetString("perm.sites.selected", resourceCulture) ?? string.Empty;
    ```
  </action>
  <verify>
    <automated>dotnet test C:/Users/dev/Documents/projets/Sharepoint/SharepointToolbox.Tests/SharepointToolbox.Tests.csproj --filter "FullyQualifiedName~LocalizationTests" -x</automated>
  </verify>
  <done>Existing LocalizationTests pass. `dotnet build SharepointToolbox.slnx` succeeds. All 15 keys exist in both resx files with correct translations. Strings.Designer.cs has 15 new static properties.</done>
</task>

</tasks>

<verification>
- `dotnet build C:/Users/dev/Documents/projets/Sharepoint/SharepointToolbox.slnx` → 0 errors
- `dotnet test --filter "FullyQualifiedName~LocalizationTests"` → all pass
- Strings.resx and Strings.fr.resx contain the key `grp.scan.opts` (grep verifiable)
- Strings.fr.resx value for `chk.recursive` is "Récursif (sous-sites)" not English
</verification>

<success_criteria>
- All 15 Phase 2 localization keys present in EN and FR resx with genuine translations (no English fallback in FR)
- Strings.Designer.cs has 15 corresponding static properties
- No existing localization tests broken
- Keys are accessible via `TranslationSource.Instance["grp.scan.opts"]` at runtime
</success_criteria>

<output>
After completion, create `.planning/phases/02-permissions/02-05-SUMMARY.md`
</output>
