All checks were successful
Release zip package / release (push) Successful in 10s
Archive 5 phases (36 plans) to milestones/v1.0-phases/. Archive roadmap, requirements, and audit to milestones/. Evolve PROJECT.md with shipped state and validated requirements. Collapse ROADMAP.md to one-line milestone summary. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
172 lines
9.3 KiB
Markdown
172 lines
9.3 KiB
Markdown
---
|
|
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>
|