--- 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" --- 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. @C:/Users/SebastienQUEROL/.claude/get-shit-done/workflows/execute-plan.md @C:/Users/SebastienQUEROL/.claude/get-shit-done/templates/summary.md @.planning/PROJECT.md @.planning/phases/02-permissions/02-RESEARCH.md 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 ``` Task 1: Add Phase 2 localization keys to resx files and Designer SharepointToolbox/Localization/Strings.resx SharepointToolbox/Localization/Strings.fr.resx SharepointToolbox/Localization/Strings.Designer.cs 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 `` entries to Strings.resx (English), inside the `` element, after the last existing `` block: ```xml Scan Options Scan Folders Recursive (subsites) Folder depth: Maximum (all levels) Include Inherited Permissions Export Format CSV HTML Generate Report Open Report View Sites Site URL: or select multiple sites: {0} site(s) selected ``` Step 2: Add the same 15 `` 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; ``` dotnet test C:/Users/dev/Documents/projets/Sharepoint/SharepointToolbox.Tests/SharepointToolbox.Tests.csproj --filter "FullyQualifiedName~LocalizationTests" -x 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. - `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 - 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 After completion, create `.planning/phases/02-permissions/02-05-SUMMARY.md`