Files
Dev 1a2cc13224 feat(04-07): add Phase 4 localization, shared dialogs, and example CSV resources
- Add 80+ Phase 4 EN/FR localization keys to Strings.resx and Strings.fr.resx (tabs, transfer, bulkmembers, bulksites, folderstruct, templates, bulk-shared, folderbrowser)
- Add ResourceManager property accessors for all new keys to Strings.Designer.cs
- Create ConfirmBulkOperationDialog (XAML + code-behind) with Proceed/Cancel buttons
- Create FolderBrowserDialog (XAML + code-behind) with lazy-loading TreeView of SharePoint libraries/folders
- Bundle bulk_add_members.csv, bulk_create_sites.csv, folder_structure.csv as EmbeddedResource in csproj
2026-04-03 10:13:39 +02:00

308 lines
19 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="app.title" xml:space="preserve">
<value>SharePoint Toolbox</value>
</data>
<data name="toolbar.connect" xml:space="preserve">
<value>Connect</value>
</data>
<data name="toolbar.manage" xml:space="preserve">
<value>Manage Profiles...</value>
</data>
<data name="toolbar.clear" xml:space="preserve">
<value>Clear Session</value>
</data>
<data name="tab.permissions" xml:space="preserve">
<value>Permissions</value>
</data>
<data name="tab.storage" xml:space="preserve">
<value>Storage</value>
</data>
<data name="tab.search" xml:space="preserve">
<value>File Search</value>
</data>
<data name="tab.duplicates" xml:space="preserve">
<value>Duplicates</value>
</data>
<data name="tab.templates" xml:space="preserve">
<value>Templates</value>
</data>
<data name="tab.bulk" xml:space="preserve">
<value>Bulk Operations</value>
</data>
<data name="tab.structure" xml:space="preserve">
<value>Folder Structure</value>
</data>
<data name="tab.settings" xml:space="preserve">
<value>Settings</value>
</data>
<data name="tab.comingsoon" xml:space="preserve">
<value>Coming soon</value>
</data>
<data name="btn.cancel" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="settings.language" xml:space="preserve">
<value>Language</value>
</data>
<data name="settings.lang.en" xml:space="preserve">
<value>English</value>
</data>
<data name="settings.lang.fr" xml:space="preserve">
<value>French</value>
</data>
<data name="settings.folder" xml:space="preserve">
<value>Data output folder</value>
</data>
<data name="settings.browse" xml:space="preserve">
<value>Browse...</value>
</data>
<data name="profile.name" xml:space="preserve">
<value>Profile name</value>
</data>
<data name="profile.url" xml:space="preserve">
<value>Tenant URL</value>
</data>
<data name="profile.clientid" xml:space="preserve">
<value>Client ID</value>
</data>
<data name="profile.add" xml:space="preserve">
<value>Add</value>
</data>
<data name="profile.rename" xml:space="preserve">
<value>Rename</value>
</data>
<data name="profile.delete" xml:space="preserve">
<value>Delete</value>
</data>
<data name="status.ready" xml:space="preserve">
<value>Ready</value>
</data>
<data name="status.cancelled" xml:space="preserve">
<value>Operation cancelled</value>
</data>
<data name="err.auth.failed" xml:space="preserve">
<value>Authentication failed. Check tenant URL and Client ID.</value>
</data>
<data name="err.generic" xml:space="preserve">
<value>An error occurred. See log for details.</value>
</data>
<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>
<!-- Phase 3: Storage Tab -->
<data name="chk.per.lib" xml:space="preserve"><value>Per-Library Breakdown</value></data>
<data name="chk.subsites" xml:space="preserve"><value>Include Subsites</value></data>
<data name="stor.note" xml:space="preserve"><value>Note: deeper folder scans on large sites may take several minutes.</value></data>
<data name="btn.gen.storage" xml:space="preserve"><value>Generate Metrics</value></data>
<data name="btn.open.storage" xml:space="preserve"><value>Open Report</value></data>
<data name="stor.col.library" xml:space="preserve"><value>Library</value></data>
<data name="stor.col.site" xml:space="preserve"><value>Site</value></data>
<data name="stor.col.files" xml:space="preserve"><value>Files</value></data>
<data name="stor.col.size" xml:space="preserve"><value>Total Size</value></data>
<data name="stor.col.versions" xml:space="preserve"><value>Version Size</value></data>
<data name="stor.col.lastmod" xml:space="preserve"><value>Last Modified</value></data>
<data name="stor.col.share" xml:space="preserve"><value>Share of Total</value></data>
<data name="stor.rad.csv" xml:space="preserve"><value>CSV</value></data>
<data name="stor.rad.html" xml:space="preserve"><value>HTML</value></data>
<!-- Phase 3: File Search Tab -->
<data name="grp.search.filters" xml:space="preserve"><value>Search Filters</value></data>
<data name="lbl.extensions" xml:space="preserve"><value>Extension(s):</value></data>
<data name="ph.extensions" xml:space="preserve"><value>docx pdf xlsx</value></data>
<data name="lbl.regex" xml:space="preserve"><value>Name / Regex:</value></data>
<data name="ph.regex" xml:space="preserve"><value>Ex: report.* or \.bak$</value></data>
<data name="chk.created.after" xml:space="preserve"><value>Created after:</value></data>
<data name="chk.created.before" xml:space="preserve"><value>Created before:</value></data>
<data name="chk.modified.after" xml:space="preserve"><value>Modified after:</value></data>
<data name="chk.modified.before" xml:space="preserve"><value>Modified before:</value></data>
<data name="lbl.created.by" xml:space="preserve"><value>Created by:</value></data>
<data name="ph.created.by" xml:space="preserve"><value>First Last or email</value></data>
<data name="lbl.modified.by" xml:space="preserve"><value>Modified by:</value></data>
<data name="ph.modified.by" xml:space="preserve"><value>First Last or email</value></data>
<data name="lbl.library" xml:space="preserve"><value>Library:</value></data>
<data name="ph.library" xml:space="preserve"><value>Optional relative path e.g. Shared Documents</value></data>
<data name="lbl.max.results" xml:space="preserve"><value>Max results:</value></data>
<data name="lbl.site.url" xml:space="preserve"><value>Site URL:</value></data>
<data name="ph.site.url" xml:space="preserve"><value>https://tenant.sharepoint.com/sites/MySite</value></data>
<data name="btn.run.search" xml:space="preserve"><value>Run Search</value></data>
<data name="btn.open.search" xml:space="preserve"><value>Open Results</value></data>
<data name="srch.col.name" xml:space="preserve"><value>File Name</value></data>
<data name="srch.col.ext" xml:space="preserve"><value>Extension</value></data>
<data name="srch.col.created" xml:space="preserve"><value>Created</value></data>
<data name="srch.col.modified" xml:space="preserve"><value>Modified</value></data>
<data name="srch.col.author" xml:space="preserve"><value>Created By</value></data>
<data name="srch.col.modby" xml:space="preserve"><value>Modified By</value></data>
<data name="srch.col.size" xml:space="preserve"><value>Size</value></data>
<data name="srch.col.path" xml:space="preserve"><value>Path</value></data>
<data name="srch.rad.csv" xml:space="preserve"><value>CSV</value></data>
<data name="srch.rad.html" xml:space="preserve"><value>HTML</value></data>
<!-- Phase 3: Duplicates Tab -->
<data name="grp.dup.type" xml:space="preserve"><value>Duplicate Type</value></data>
<data name="rad.dup.files" xml:space="preserve"><value>Duplicate files</value></data>
<data name="rad.dup.folders" xml:space="preserve"><value>Duplicate folders</value></data>
<data name="grp.dup.criteria" xml:space="preserve"><value>Comparison Criteria</value></data>
<data name="lbl.dup.note" xml:space="preserve"><value>Name is always the primary criterion. Check additional criteria:</value></data>
<data name="chk.dup.size" xml:space="preserve"><value>Same size</value></data>
<data name="chk.dup.created" xml:space="preserve"><value>Same creation date</value></data>
<data name="chk.dup.modified" xml:space="preserve"><value>Same modification date</value></data>
<data name="chk.dup.subfolders" xml:space="preserve"><value>Same subfolder count</value></data>
<data name="chk.dup.filecount" xml:space="preserve"><value>Same file count</value></data>
<data name="chk.include.subsites" xml:space="preserve"><value>Include subsites</value></data>
<data name="ph.dup.lib" xml:space="preserve"><value>All (leave empty)</value></data>
<data name="btn.run.scan" xml:space="preserve"><value>Run Scan</value></data>
<data name="btn.open.results" xml:space="preserve"><value>Open Results</value></data>
<!-- Phase 4: Tab headers -->
<data name="tab.transfer" xml:space="preserve"><value>Transfer</value></data>
<data name="tab.bulkMembers" xml:space="preserve"><value>Bulk Members</value></data>
<data name="tab.bulkSites" xml:space="preserve"><value>Bulk Sites</value></data>
<data name="tab.folderStructure" xml:space="preserve"><value>Folder Structure</value></data>
<!-- Phase 4: Transfer tab -->
<data name="transfer.sourcesite" xml:space="preserve"><value>Source Site</value></data>
<data name="transfer.destsite" xml:space="preserve"><value>Destination Site</value></data>
<data name="transfer.sourcelibrary" xml:space="preserve"><value>Source Library</value></data>
<data name="transfer.destlibrary" xml:space="preserve"><value>Destination Library</value></data>
<data name="transfer.sourcefolder" xml:space="preserve"><value>Source Folder</value></data>
<data name="transfer.destfolder" xml:space="preserve"><value>Destination Folder</value></data>
<data name="transfer.mode" xml:space="preserve"><value>Transfer Mode</value></data>
<data name="transfer.mode.copy" xml:space="preserve"><value>Copy</value></data>
<data name="transfer.mode.move" xml:space="preserve"><value>Move</value></data>
<data name="transfer.conflict" xml:space="preserve"><value>Conflict Policy</value></data>
<data name="transfer.conflict.skip" xml:space="preserve"><value>Skip</value></data>
<data name="transfer.conflict.overwrite" xml:space="preserve"><value>Overwrite</value></data>
<data name="transfer.conflict.rename" xml:space="preserve"><value>Rename (append suffix)</value></data>
<data name="transfer.browse" xml:space="preserve"><value>Browse...</value></data>
<data name="transfer.start" xml:space="preserve"><value>Start Transfer</value></data>
<data name="transfer.nofiles" xml:space="preserve"><value>No files found to transfer.</value></data>
<!-- Phase 4: Bulk Members tab -->
<data name="bulkmembers.import" xml:space="preserve"><value>Import CSV</value></data>
<data name="bulkmembers.example" xml:space="preserve"><value>Load Example</value></data>
<data name="bulkmembers.execute" xml:space="preserve"><value>Add Members</value></data>
<data name="bulkmembers.preview" xml:space="preserve"><value>Preview ({0} rows, {1} valid, {2} invalid)</value></data>
<data name="bulkmembers.groupname" xml:space="preserve"><value>Group Name</value></data>
<data name="bulkmembers.groupurl" xml:space="preserve"><value>Group URL</value></data>
<data name="bulkmembers.email" xml:space="preserve"><value>Email</value></data>
<data name="bulkmembers.role" xml:space="preserve"><value>Role</value></data>
<!-- Phase 4: Bulk Sites tab -->
<data name="bulksites.import" xml:space="preserve"><value>Import CSV</value></data>
<data name="bulksites.example" xml:space="preserve"><value>Load Example</value></data>
<data name="bulksites.execute" xml:space="preserve"><value>Create Sites</value></data>
<data name="bulksites.preview" xml:space="preserve"><value>Preview ({0} rows, {1} valid, {2} invalid)</value></data>
<data name="bulksites.name" xml:space="preserve"><value>Name</value></data>
<data name="bulksites.alias" xml:space="preserve"><value>Alias</value></data>
<data name="bulksites.type" xml:space="preserve"><value>Type</value></data>
<data name="bulksites.owners" xml:space="preserve"><value>Owners</value></data>
<data name="bulksites.members" xml:space="preserve"><value>Members</value></data>
<!-- Phase 4: Folder Structure tab -->
<data name="folderstruct.import" xml:space="preserve"><value>Import CSV</value></data>
<data name="folderstruct.example" xml:space="preserve"><value>Load Example</value></data>
<data name="folderstruct.execute" xml:space="preserve"><value>Create Folders</value></data>
<data name="folderstruct.preview" xml:space="preserve"><value>Preview ({0} folders to create)</value></data>
<data name="folderstruct.library" xml:space="preserve"><value>Target Library</value></data>
<data name="folderstruct.siteurl" xml:space="preserve"><value>Site URL</value></data>
<!-- Phase 4: Templates tab -->
<data name="templates.list" xml:space="preserve"><value>Saved Templates</value></data>
<data name="templates.capture" xml:space="preserve"><value>Capture Template</value></data>
<data name="templates.apply" xml:space="preserve"><value>Apply Template</value></data>
<data name="templates.rename" xml:space="preserve"><value>Rename</value></data>
<data name="templates.delete" xml:space="preserve"><value>Delete</value></data>
<data name="templates.siteurl" xml:space="preserve"><value>Source Site URL</value></data>
<data name="templates.name" xml:space="preserve"><value>Template Name</value></data>
<data name="templates.newtitle" xml:space="preserve"><value>New Site Title</value></data>
<data name="templates.newalias" xml:space="preserve"><value>New Site Alias</value></data>
<data name="templates.options" xml:space="preserve"><value>Capture Options</value></data>
<data name="templates.opt.libraries" xml:space="preserve"><value>Libraries</value></data>
<data name="templates.opt.folders" xml:space="preserve"><value>Folders</value></data>
<data name="templates.opt.permissions" xml:space="preserve"><value>Permission Groups</value></data>
<data name="templates.opt.logo" xml:space="preserve"><value>Site Logo</value></data>
<data name="templates.opt.settings" xml:space="preserve"><value>Site Settings</value></data>
<data name="templates.empty" xml:space="preserve"><value>No templates saved yet.</value></data>
<!-- Phase 4: Shared bulk operation strings -->
<data name="bulk.confirm.title" xml:space="preserve"><value>Confirm Operation</value></data>
<data name="bulk.confirm.proceed" xml:space="preserve"><value>Proceed</value></data>
<data name="bulk.confirm.cancel" xml:space="preserve"><value>Cancel</value></data>
<data name="bulk.confirm.message" xml:space="preserve"><value>{0} — Proceed?</value></data>
<data name="bulk.result.success" xml:space="preserve"><value>Completed: {0} succeeded, {1} failed</value></data>
<data name="bulk.result.allfailed" xml:space="preserve"><value>All {0} items failed.</value></data>
<data name="bulk.result.allsuccess" xml:space="preserve"><value>All {0} items completed successfully.</value></data>
<data name="bulk.exportfailed" xml:space="preserve"><value>Export Failed Items</value></data>
<data name="bulk.retryfailed" xml:space="preserve"><value>Retry Failed</value></data>
<data name="bulk.validation.invalid" xml:space="preserve"><value>{0} rows have validation errors. Fix and re-import.</value></data>
<data name="bulk.csvimport.title" xml:space="preserve"><value>Select CSV File</value></data>
<data name="bulk.csvimport.filter" xml:space="preserve"><value>CSV Files (*.csv)|*.csv</value></data>
<!-- Phase 4: Folder browser dialog -->
<data name="folderbrowser.title" xml:space="preserve"><value>Select Folder</value></data>
<data name="folderbrowser.loading" xml:space="preserve"><value>Loading folder tree...</value></data>
<data name="folderbrowser.select" xml:space="preserve"><value>Select</value></data>
<data name="folderbrowser.cancel" xml:space="preserve"><value>Cancel</value></data>
</root>