Files
SharepointToolbox-Web/Localization/Strings.resx
T
kawa 6d9c79ad5a Add scheduled reports + app-only cert auth; fix tenant-wide user-access audit
Feature work:
- Certificate (app-only) auth per profile: cert store, context/Graph client
  factories, automated app-registration provisioning (delegated + application
  permissions, admin consent), and a SessionManager seam that resolves the auth
  model per profile.
- Scheduled reports: repositories, hosted service/runner/coordinator, report
  pages, and email delivery (app-only Mail.Send).
- Tenant-wide user-access audit when no site is selected.

Audit fixes:
- Site enumeration: app-only discovery used Graph getAllSites (needs Graph
  Sites.Read.All the cert app lacks) and silently returned empty. Switched to
  the admin-host CSOM TenantSiteEnumerator, matching the scheduler; both auth
  models now share one enumeration path.
- Group expansion: the scan records a SharePoint group as a single principal, so
  user-centric audits found nothing for group-granted access. Resolve group
  membership (shared by audit + scheduler) and attribute it to the target user.
- M365 group claims: the resolver only recognized AAD security groups
  (c:0t.c|). Group-connected/Teams sites grant via the M365 group claim
  (c:0o.c|…|<guid>[_o]); now expanded too, resolving owners for the "_o" claim.
- Provision Directory.Read.All as an application permission so M365/AAD group
  expansion works under the cert identity.

Also: ignore data/appcerts/ (encrypted certificate key material).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 17:55:28 +02:00

1929 lines
104 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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.versions" xml:space="preserve">
<value>Versions</value>
</data>
<data name="versions.tab" xml:space="preserve">
<value>Version cleanup</value>
</data>
<data name="versions.grp.libs" xml:space="preserve">
<value>Libraries</value>
</data>
<data name="versions.grp.policy" xml:space="preserve">
<value>Retention policy</value>
</data>
<data name="versions.btn.pickLibs" xml:space="preserve">
<value>Select libraries...</value>
</data>
<data name="versions.btn.clearLibs" xml:space="preserve">
<value>Reset (all libraries)</value>
</data>
<data name="versions.btn.run" xml:space="preserve">
<value>Delete old versions</value>
</data>
<data name="versions.lbl.keepLast" xml:space="preserve">
<value>Keep last:</value>
</data>
<data name="versions.chk.keepFirst" xml:space="preserve">
<value>Also keep the very first version</value>
</data>
<data name="versions.chk.confirm" xml:space="preserve">
<value>Ask for confirmation before running</value>
</data>
<data name="versions.note" xml:space="preserve">
<value>Only historical versions are removed. The current published version is always kept. The action cannot be undone.</value>
</data>
<data name="versions.libs.all" xml:space="preserve">
<value>All libraries (no filter)</value>
</data>
<data name="versions.libs.count" xml:space="preserve">
<value>{0} library/libraries selected</value>
</data>
<data name="versions.confirm" xml:space="preserve">
<value>Delete historical file versions, keeping the last {0} {1}?
This cannot be undone.</value>
</data>
<data name="versions.confirm.keepFirst" xml:space="preserve">
<value>(plus the first version)</value>
</data>
<data name="versions.err.keepLast" xml:space="preserve">
<value>"Keep last" must be 0 or greater.</value>
</data>
<data name="versions.summary.files" xml:space="preserve">
<value>Files trimmed:</value>
</data>
<data name="versions.summary.deleted" xml:space="preserve">
<value>Versions deleted:</value>
</data>
<data name="versions.summary.freed" xml:space="preserve">
<value>Bytes freed:</value>
</data>
<data name="versions.col.library" xml:space="preserve">
<value>Library</value>
</data>
<data name="versions.col.file" xml:space="preserve">
<value>File</value>
</data>
<data name="versions.col.before" xml:space="preserve">
<value>Before</value>
</data>
<data name="versions.col.deleted" xml:space="preserve">
<value>Deleted</value>
</data>
<data name="versions.col.remaining" xml:space="preserve">
<value>Remaining</value>
</data>
<data name="versions.col.freed" xml:space="preserve">
<value>Freed</value>
</data>
<data name="versions.col.path" xml:space="preserve">
<value>Path</value>
</data>
<data name="versions.col.error" xml:space="preserve">
<value>Error</value>
</data>
<data name="librarypicker.title" xml:space="preserve">
<value>Select libraries</value>
</data>
<data name="librarypicker.loading" xml:space="preserve">
<value>Loading libraries...</value>
</data>
<data name="librarypicker.loaded" xml:space="preserve">
<value>{0} libraries loaded.</value>
</data>
<data name="librarypicker.selectAll" xml:space="preserve">
<value>Select all</value>
</data>
<data name="librarypicker.selectNone" xml:space="preserve">
<value>Select none</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.theme" xml:space="preserve">
<value>Theme</value>
</data>
<data name="settings.theme.system" xml:space="preserve">
<value>Use system setting</value>
</data>
<data name="settings.theme.light" xml:space="preserve">
<value>Light</value>
</data>
<data name="settings.theme.dark" xml:space="preserve">
<value>Dark</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.clientid.hint" xml:space="preserve">
<value>Optional — leave blank to register the app automatically</value>
</data>
<data name="profile.add" xml:space="preserve">
<value>Add</value>
</data>
<data name="profile.save" xml:space="preserve">
<value>Save</value>
</data>
<data name="profile.delete" xml:space="preserve">
<value>Delete</value>
</data>
<data name="profile.add.tooltip" xml:space="preserve">
<value>Create a new profile from the values entered above.</value>
</data>
<data name="profile.save.tooltip" xml:space="preserve">
<value>Save changes to the selected profile.</value>
</data>
<data name="profile.delete.tooltip" xml:space="preserve">
<value>Delete the selected profile.</value>
</data>
<data name="profile.register.warning" xml:space="preserve">
<value>Registering an app may prompt you to sign in up to {0} times. Continue?</value>
</data>
<data name="status.ready" xml:space="preserve">
<value>Ready</value>
</data>
<data name="status.complete" xml:space="preserve">
<value>Complete</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="chk.simplified.mode" xml:space="preserve"><value>Simplified mode</value></data>
<data name="grp.display.opts" xml:space="preserve"><value>Display Options</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.detail.detailed" xml:space="preserve"><value>Detailed (all rows)</value></data>
<data name="rad.detail.simple" xml:space="preserve"><value>Simple (summary only)</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>
<data name="stor.col.kind" xml:space="preserve"><value>Kind</value></data>
<data name="stor.kind.library" xml:space="preserve"><value>Library</value></data>
<data name="stor.kind.hidden" xml:space="preserve"><value>Hidden Library</value></data>
<data name="stor.kind.preservation" xml:space="preserve"><value>Preservation Hold</value></data>
<data name="stor.kind.attachments" xml:space="preserve"><value>List Attachments</value></data>
<data name="stor.kind.recyclebin" xml:space="preserve"><value>Recycle Bin</value></data>
<data name="stor.kind.subsite" xml:space="preserve"><value>Subsite</value></data>
<data name="grp.scan.sources" xml:space="preserve"><value>Scan Sources</value></data>
<data name="grp.report.filter" xml:space="preserve"><value>Show in Report</value></data>
<data name="chk.scan.hidden" xml:space="preserve"><value>Hidden Libraries</value></data>
<data name="chk.scan.preservation" xml:space="preserve"><value>Preservation Hold</value></data>
<data name="chk.scan.attachments" xml:space="preserve"><value>List Attachments</value></data>
<data name="chk.scan.recyclebin" xml:space="preserve"><value>Recycle Bin</value></data>
<data name="chk.show.libraries" xml:space="preserve"><value>Libraries</value></data>
<data name="chk.show.hidden" xml:space="preserve"><value>Hidden Libraries</value></data>
<data name="chk.show.preservation" xml:space="preserve"><value>Preservation Hold</value></data>
<data name="chk.show.attachments" xml:space="preserve"><value>List Attachments</value></data>
<data name="chk.show.recyclebin" xml:space="preserve"><value>Recycle Bin</value></data>
<data name="chk.show.subsites" xml:space="preserve"><value>Subsites</value></data>
<data name="chk.combine.recyclebin" xml:space="preserve"><value>Combine Recycle Bin Stages (show total)</value></data>
<data name="storage.lbl.spo_reported_colon" xml:space="preserve"><value>SPO reported total: </value></data>
<data name="storage.lbl.recyclebin_colon" xml:space="preserve"><value>Recycle Bin: </value></data>
<!-- Phase 3: File Search Tab -->
<data name="grp.search.filters" xml:space="preserve"><value>Search Filters</value></data>
<data name="lbl.detail.level" xml:space="preserve"><value>Detail level:</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="lbl.summary.users" xml:space="preserve"><value>user(s)</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>
<!-- Phase 6: Global Site Selection toolbar -->
<data name="toolbar.selectSites" xml:space="preserve">
<value>Select Sites</value>
</data>
<data name="toolbar.selectSites.tooltip" xml:space="preserve">
<value>Select target sites for all tabs</value>
</data>
<data name="toolbar.selectSites.tooltipDisabled" xml:space="preserve">
<value>Connect to a tenant first</value>
</data>
<data name="toolbar.globalSites.count" xml:space="preserve">
<value>{0} site(s) selected</value>
</data>
<data name="toolbar.globalSites.none" xml:space="preserve">
<value>No sites selected</value>
</data>
<!-- Phase 7: User Access Audit -->
<data name="tab.userAccessAudit" xml:space="preserve">
<value>User Access Audit</value>
</data>
<data name="audit.grp.users" xml:space="preserve">
<value>Select Users</value>
</data>
<data name="audit.grp.sites" xml:space="preserve">
<value>Target Sites</value>
</data>
<data name="audit.grp.options" xml:space="preserve">
<value>Scan Options</value>
</data>
<data name="audit.search.placeholder" xml:space="preserve">
<value>Search users by name or email...</value>
</data>
<data name="audit.users.selected" xml:space="preserve">
<value>{0} user(s) selected</value>
</data>
<data name="audit.btn.run" xml:space="preserve">
<value>Run Audit</value>
</data>
<data name="audit.btn.exportCsv" xml:space="preserve">
<value>Export CSV</value>
</data>
<data name="audit.btn.exportHtml" xml:space="preserve">
<value>Export HTML</value>
</data>
<data name="export.split.label" xml:space="preserve">
<value>Split</value>
</data>
<data name="export.split.single" xml:space="preserve">
<value>Single file</value>
</data>
<data name="export.split.bySite" xml:space="preserve">
<value>By site</value>
</data>
<data name="export.split.byUser" xml:space="preserve">
<value>By user</value>
</data>
<data name="export.html.layout.label" xml:space="preserve">
<value>HTML layout</value>
</data>
<data name="export.html.layout.separate" xml:space="preserve">
<value>Separate files</value>
</data>
<data name="export.html.layout.tabbed" xml:space="preserve">
<value>Single tabbed file</value>
</data>
<data name="audit.summary.total" xml:space="preserve">
<value>Total Accesses</value>
</data>
<data name="audit.summary.sites" xml:space="preserve">
<value>Sites</value>
</data>
<data name="audit.summary.highPriv" xml:space="preserve">
<value>High Privilege</value>
</data>
<data name="audit.toggle.byUser" xml:space="preserve">
<value>By User</value>
</data>
<data name="audit.toggle.bySite" xml:space="preserve">
<value>By Site</value>
</data>
<data name="audit.filter.placeholder" xml:space="preserve">
<value>Filter results...</value>
</data>
<data name="audit.noUsers" xml:space="preserve">
<value>Select at least one user to audit.</value>
</data>
<data name="audit.noSites" xml:space="preserve">
<value>Select at least one site to scan.</value>
</data>
<!-- Phase 9: Storage Visualization Charts -->
<data name="stor.chart.title" xml:space="preserve"><value>Storage by File Type</value></data>
<data name="stor.chart.donut" xml:space="preserve"><value>Donut Chart</value></data>
<data name="stor.chart.bar" xml:space="preserve"><value>Bar Chart</value></data>
<data name="stor.chart.toggle" xml:space="preserve"><value>Chart View:</value></data>
<data name="stor.chart.nodata" xml:space="preserve"><value>Run a storage scan to see file type breakdown.</value></data>
<!-- Phase 12: Logo UI -->
<data name="settings.logo.title" xml:space="preserve"><value>MSP Logo</value></data>
<data name="settings.logo.browse" xml:space="preserve"><value>Import</value></data>
<data name="settings.logo.clear" xml:space="preserve"><value>Clear</value></data>
<data name="settings.logo.nopreview" xml:space="preserve"><value>No logo configured</value></data>
<data name="profile.logo.title" xml:space="preserve"><value>Client Logo</value></data>
<data name="profile.logo.browse" xml:space="preserve"><value>Import</value></data>
<data name="profile.logo.clear" xml:space="preserve"><value>Clear</value></data>
<data name="profile.logo.autopull" xml:space="preserve"><value>Pull from Entra</value></data>
<data name="profile.logo.nopreview" xml:space="preserve"><value>No logo configured</value></data>
<!-- Phase 14: Directory Browse UI -->
<data name="audit.mode.search" xml:space="preserve"><value>Search</value></data>
<data name="audit.mode.browse" xml:space="preserve"><value>Browse Directory</value></data>
<data name="directory.grp.browse" xml:space="preserve"><value>User Directory</value></data>
<data name="directory.btn.load" xml:space="preserve"><value>Load Directory</value></data>
<data name="directory.btn.cancel" xml:space="preserve"><value>Cancel</value></data>
<data name="directory.filter.placeholder" xml:space="preserve"><value>Filter users...</value></data>
<data name="directory.chk.guests" xml:space="preserve"><value>Include guests</value></data>
<data name="directory.status.count" xml:space="preserve"><value>users</value></data>
<data name="directory.hint.doubleclick" xml:space="preserve"><value>Double-click a user to add to audit</value></data>
<data name="directory.col.name" xml:space="preserve"><value>Name</value></data>
<data name="directory.col.upn" xml:space="preserve"><value>Email</value></data>
<data name="directory.col.department" xml:space="preserve"><value>Department</value></data>
<data name="directory.col.jobtitle" xml:space="preserve"><value>Job Title</value></data>
<data name="directory.col.type" xml:space="preserve"><value>Type</value></data>
<!-- Phase 16: Report Consolidation Toggle -->
<data name="audit.grp.export" xml:space="preserve"><value>Export Options</value></data>
<data name="chk.merge.permissions" xml:space="preserve"><value>Merge duplicate permissions</value></data>
<data name="chk.hide.system.group.raw" xml:space="preserve"><value>Hide raw system group names (SharingLinks, Limited Access)</value></data>
<data name="chk.exclude.sharing.links" xml:space="preserve"><value>Exclude sharing links</value></data>
<data name="chk.exclude.system.groups" xml:space="preserve"><value>Exclude system groups (Limited Access)</value></data>
<!-- Phase 19: App Registration & Removal -->
<data name="profile.register" xml:space="preserve"><value>Register App</value></data>
<data name="profile.remove" xml:space="preserve"><value>Remove App</value></data>
<data name="profile.register.checking" xml:space="preserve"><value>Checking permissions...</value></data>
<data name="profile.register.registering" xml:space="preserve"><value>Registering application...</value></data>
<data name="profile.register.success" xml:space="preserve"><value>Application registered successfully</value></data>
<data name="profile.register.failed" xml:space="preserve"><value>Registration failed</value></data>
<data name="profile.register.noperm" xml:space="preserve"><value>Insufficient permissions for automatic registration</value></data>
<data name="profile.remove.removing" xml:space="preserve"><value>Removing application...</value></data>
<data name="profile.remove.success" xml:space="preserve"><value>Application removed successfully</value></data>
<data name="profile.fallback.title" xml:space="preserve"><value>Manual Registration Required</value></data>
<data name="profile.fallback.step1" xml:space="preserve"><value>1. Go to Azure Portal &gt; App registrations &gt; New registration</value></data>
<data name="profile.fallback.step2" xml:space="preserve"><value>2. Name: 'SharePoint Toolbox - {0}', Supported account types: Single tenant</value></data>
<data name="profile.fallback.step3" xml:space="preserve"><value>3. Redirect URI: Public client, https://login.microsoftonline.com/common/oauth2/nativeclient</value></data>
<data name="profile.fallback.step4" xml:space="preserve"><value>4. Under API permissions, add: Microsoft Graph (User.Read, User.Read.All, Group.Read.All, Directory.Read.All) and SharePoint (AllSites.FullControl)</value></data>
<data name="profile.fallback.step5" xml:space="preserve"><value>5. Grant admin consent for all permissions</value></data>
<data name="profile.fallback.step6" xml:space="preserve"><value>6. Copy the Application (client) ID and paste it in the Client ID field above</value></data>
<!-- Phase 18: Auto-Take Ownership -->
<data name="settings.ownership.title" xml:space="preserve"><value>Site Ownership</value></data>
<data name="settings.ownership.auto" xml:space="preserve"><value>Automatically take site collection admin ownership on access denied</value></data>
<data name="settings.ownership.description" xml:space="preserve"><value>When enabled, the app will automatically elevate to site collection admin when a scan encounters an access denied error. Requires Tenant Admin permissions.</value></data>
<data name="permissions.elevated.tooltip" xml:space="preserve"><value>This site was automatically elevated — ownership was taken to complete the scan</value></data>
<!-- Report export localization -->
<data name="report.title.user_access" xml:space="preserve"><value>User Access Audit Report</value></data>
<data name="report.title.user_access_consolidated" xml:space="preserve"><value>User Access Audit Report (Consolidated)</value></data>
<data name="report.title.permissions" xml:space="preserve"><value>SharePoint Permissions Report</value></data>
<data name="report.title.permissions_simplified" xml:space="preserve"><value>SharePoint Permissions Report (Simplified)</value></data>
<data name="report.title.storage" xml:space="preserve"><value>SharePoint Storage Metrics</value></data>
<data name="report.title.duplicates" xml:space="preserve"><value>SharePoint Duplicate Detection Report</value></data>
<data name="report.title.duplicates_short" xml:space="preserve"><value>Duplicate Detection Report</value></data>
<data name="report.title.search" xml:space="preserve"><value>SharePoint File Search Results</value></data>
<data name="report.title.search_short" xml:space="preserve"><value>File Search Results</value></data>
<data name="report.title.versions" xml:space="preserve"><value>SharePoint Version Cleanup Report</value></data>
<data name="report.title.versions_short" xml:space="preserve"><value>Version Cleanup Report</value></data>
<data name="report.stat.total_accesses" xml:space="preserve"><value>Total Accesses</value></data>
<data name="report.stat.users_audited" xml:space="preserve"><value>Users Audited</value></data>
<data name="report.stat.sites_scanned" xml:space="preserve"><value>Sites Scanned</value></data>
<data name="report.stat.high_privilege" xml:space="preserve"><value>High Privilege</value></data>
<data name="report.stat.external_users" xml:space="preserve"><value>External Users</value></data>
<data name="report.stat.total_entries" xml:space="preserve"><value>Total Entries</value></data>
<data name="report.stat.unique_permission_sets" xml:space="preserve"><value>Unique Permission Sets</value></data>
<data name="report.stat.distinct_users_groups" xml:space="preserve"><value>Distinct Users/Groups</value></data>
<data name="report.stat.libraries" xml:space="preserve"><value>Libraries</value></data>
<data name="report.stat.files" xml:space="preserve"><value>Files</value></data>
<data name="report.stat.total_size" xml:space="preserve"><value>Total Size</value></data>
<data name="report.stat.version_size" xml:space="preserve"><value>Version Size</value></data>
<data name="report.badge.guest" xml:space="preserve"><value>Guest</value></data>
<data name="report.badge.direct" xml:space="preserve"><value>Direct</value></data>
<data name="report.badge.group" xml:space="preserve"><value>Group</value></data>
<data name="report.badge.inherited" xml:space="preserve"><value>Inherited</value></data>
<data name="report.badge.unique" xml:space="preserve"><value>Unique</value></data>
<data name="report.view.by_user" xml:space="preserve"><value>By User</value></data>
<data name="report.view.by_site" xml:space="preserve"><value>By Site</value></data>
<data name="report.filter.placeholder_results" xml:space="preserve"><value>Filter results...</value></data>
<data name="report.filter.placeholder_permissions" xml:space="preserve"><value>Filter permissions...</value></data>
<data name="report.filter.placeholder_rows" xml:space="preserve"><value>Filter rows…</value></data>
<data name="report.filter.label" xml:space="preserve"><value>Filter:</value></data>
<data name="report.col.site" xml:space="preserve"><value>Site</value></data>
<data name="report.col.sites" xml:space="preserve"><value>Sites</value></data>
<data name="report.col.object_type" xml:space="preserve"><value>Object Type</value></data>
<data name="report.col.object" xml:space="preserve"><value>Object</value></data>
<data name="report.col.permission_level" xml:space="preserve"><value>Permission Level</value></data>
<data name="report.col.access_type" xml:space="preserve"><value>Access Type</value></data>
<data name="report.col.granted_through" xml:space="preserve"><value>Granted Through</value></data>
<data name="report.col.user" xml:space="preserve"><value>User</value></data>
<data name="report.col.title" xml:space="preserve"><value>Title</value></data>
<data name="report.col.url" xml:space="preserve"><value>URL</value></data>
<data name="report.col.users_groups" xml:space="preserve"><value>Users/Groups</value></data>
<data name="report.col.simplified" xml:space="preserve"><value>Simplified</value></data>
<data name="report.col.risk" xml:space="preserve"><value>Risk</value></data>
<data name="report.col.library_folder" xml:space="preserve"><value>Library / Folder</value></data>
<data name="report.col.last_modified" xml:space="preserve"><value>Last Modified</value></data>
<data name="report.col.name" xml:space="preserve"><value>Name</value></data>
<data name="report.col.library" xml:space="preserve"><value>Library</value></data>
<data name="report.col.path" xml:space="preserve"><value>Path</value></data>
<data name="report.col.size" xml:space="preserve"><value>Size</value></data>
<data name="report.col.created" xml:space="preserve"><value>Created</value></data>
<data name="report.col.modified" xml:space="preserve"><value>Modified</value></data>
<data name="report.col.created_by" xml:space="preserve"><value>Created By</value></data>
<data name="report.col.modified_by" xml:space="preserve"><value>Modified By</value></data>
<data name="report.col.file_name" xml:space="preserve"><value>File Name</value></data>
<data name="report.col.extension" xml:space="preserve"><value>Extension</value></data>
<data name="report.col.file_type" xml:space="preserve"><value>File Type</value></data>
<data name="report.col.file_count" xml:space="preserve"><value>File Count</value></data>
<data name="report.col.error" xml:space="preserve"><value>Error</value></data>
<data name="report.col.timestamp" xml:space="preserve"><value>Timestamp</value></data>
<data name="report.col.number" xml:space="preserve"><value>#</value></data>
<data name="report.col.group" xml:space="preserve"><value>Group</value></data>
<data name="report.col.total_size_mb" xml:space="preserve"><value>Total Size (MB)</value></data>
<data name="report.col.version_size_mb" xml:space="preserve"><value>Version Size (MB)</value></data>
<data name="report.col.size_mb" xml:space="preserve"><value>Size (MB)</value></data>
<data name="report.col.size_bytes" xml:space="preserve"><value>Size (bytes)</value></data>
<data name="report.text.accesses" xml:space="preserve"><value>accesses</value></data>
<data name="report.text.access_es" xml:space="preserve"><value>access(es)</value></data>
<data name="report.text.sites_parens" xml:space="preserve"><value>site(s)</value></data>
<data name="report.text.permissions_parens" xml:space="preserve"><value>permission(s)</value></data>
<data name="report.text.copies" xml:space="preserve"><value>copies</value></data>
<data name="report.text.duplicate_groups_found" xml:space="preserve"><value>duplicate group(s) found.</value></data>
<data name="report.text.results_parens" xml:space="preserve"><value>result(s)</value></data>
<data name="report.text.of" xml:space="preserve"><value>of</value></data>
<data name="report.text.shown" xml:space="preserve"><value>shown</value></data>
<data name="report.text.generated" xml:space="preserve"><value>Generated</value></data>
<data name="report.text.generated_colon" xml:space="preserve"><value>Generated:</value></data>
<data name="report.text.members_unavailable" xml:space="preserve"><value>members unavailable</value></data>
<data name="report.text.empty_group" xml:space="preserve"><value>Empty group</value></data>
<data name="report.text.link" xml:space="preserve"><value>Link</value></data>
<data name="report.text.no_ext" xml:space="preserve"><value>(no ext)</value></data>
<data name="report.text.no_extension" xml:space="preserve"><value>(no extension)</value></data>
<data name="report.text.high_priv" xml:space="preserve"><value>high-priv</value></data>
<data name="report.section.storage_by_file_type" xml:space="preserve"><value>Storage by File Type</value></data>
<data name="report.section.library_details" xml:space="preserve"><value>Library Details</value></data>
<!-- Site picker dialog -->
<data name="sitepicker.title" xml:space="preserve"><value>Select Sites</value></data>
<data name="sitepicker.filter" xml:space="preserve"><value>Filter:</value></data>
<data name="sitepicker.type" xml:space="preserve"><value>Type:</value></data>
<data name="sitepicker.type.all" xml:space="preserve"><value>All</value></data>
<data name="sitepicker.type.team" xml:space="preserve"><value>Team sites (MS Teams)</value></data>
<data name="sitepicker.type.communication" xml:space="preserve"><value>Communication</value></data>
<data name="sitepicker.type.classic" xml:space="preserve"><value>Classic</value></data>
<data name="sitepicker.type.other" xml:space="preserve"><value>Other</value></data>
<data name="sitepicker.size" xml:space="preserve"><value>Size (MB):</value></data>
<data name="sitepicker.size.min" xml:space="preserve"><value>min</value></data>
<data name="sitepicker.size.max" xml:space="preserve"><value>max</value></data>
<data name="sitepicker.col.title" xml:space="preserve"><value>Title</value></data>
<data name="sitepicker.col.url" xml:space="preserve"><value>URL</value></data>
<data name="sitepicker.col.type" xml:space="preserve"><value>Type</value></data>
<data name="sitepicker.col.size" xml:space="preserve"><value>Size</value></data>
<data name="sitepicker.btn.load" xml:space="preserve"><value>Load Sites</value></data>
<data name="sitepicker.btn.selectAll" xml:space="preserve"><value>Select All</value></data>
<data name="sitepicker.btn.deselectAll" xml:space="preserve"><value>Deselect All</value></data>
<data name="sitepicker.btn.ok" xml:space="preserve"><value>OK</value></data>
<data name="sitepicker.btn.cancel" xml:space="preserve"><value>Cancel</value></data>
<data name="sitepicker.status.loading" xml:space="preserve"><value>Loading sites...</value></data>
<data name="sitepicker.status.loaded" xml:space="preserve"><value>{0} sites loaded.</value></data>
<data name="sitepicker.status.shown" xml:space="preserve"><value>{0} / {1} sites shown.</value></data>
<data name="sitepicker.status.error" xml:space="preserve"><value>Error: {0}</value></data>
<data name="sitepicker.kind.teamsite" xml:space="preserve"><value>Team site</value></data>
<data name="sitepicker.kind.communication" xml:space="preserve"><value>Communication</value></data>
<data name="sitepicker.kind.classic" xml:space="preserve"><value>Classic</value></data>
<data name="sitepicker.kind.other" xml:space="preserve"><value>Other</value></data>
<!-- Common UI -->
<data name="common.valid" xml:space="preserve"><value>Valid</value></data>
<data name="common.errors" xml:space="preserve"><value>Errors</value></data>
<data name="common.close" xml:space="preserve"><value>Close</value></data>
<data name="common.new_folder" xml:space="preserve"><value>+ New Folder</value></data>
<data name="common.guest" xml:space="preserve"><value>Guest</value></data>
<!-- InputDialog -->
<data name="input.title" xml:space="preserve"><value>Input</value></data>
<!-- ProfileManagementDialog -->
<data name="profmgmt.title" xml:space="preserve"><value>Manage Profiles</value></data>
<data name="profmgmt.group" xml:space="preserve"><value>Profiles</value></data>
<!-- Duplicates columns -->
<data name="duplicates.col.group" xml:space="preserve"><value>Group</value></data>
<data name="duplicates.col.copies" xml:space="preserve"><value>Copies</value></data>
<!-- Folder structure levels -->
<data name="folderstruct.col.level1" xml:space="preserve"><value>Level 1</value></data>
<data name="folderstruct.col.level2" xml:space="preserve"><value>Level 2</value></data>
<data name="folderstruct.col.level3" xml:space="preserve"><value>Level 3</value></data>
<data name="folderstruct.col.level4" xml:space="preserve"><value>Level 4</value></data>
<!-- Permissions extra columns -->
<data name="perm.col.unique_perms" xml:space="preserve"><value>Unique Perms</value></data>
<data name="perm.col.permission_levels" xml:space="preserve"><value>Permission Levels</value></data>
<data name="perm.col.principal_type" xml:space="preserve"><value>Principal Type</value></data>
<!-- Storage summary labels -->
<data name="storage.lbl.total_size_colon" xml:space="preserve"><value>Total Size: </value></data>
<data name="storage.lbl.version_size_colon" xml:space="preserve"><value>Version Size: </value></data>
<data name="storage.lbl.files_colon" xml:space="preserve"><value>Files: </value></data>
<!-- Templates columns -->
<data name="templates.col.source" xml:space="preserve"><value>Source</value></data>
<data name="templates.col.captured" xml:space="preserve"><value>Captured</value></data>
<!-- Transfer view -->
<data name="transfer.text.files_selected" xml:space="preserve"><value> file(s) selected</value></data>
<data name="transfer.chk.include_source" xml:space="preserve"><value>Include source folder at destination</value></data>
<data name="transfer.chk.include_source.tooltip" xml:space="preserve"><value>When on, recreate the source folder under the destination. When off, drop contents directly into the destination folder.</value></data>
<data name="transfer.chk.copy_contents" xml:space="preserve"><value>Copy folder contents</value></data>
<data name="transfer.chk.copy_contents.tooltip" xml:space="preserve"><value>When on (default), transfer files inside the folder. When off, only the folder is created at the destination.</value></data>
<!-- Shared ViewModel errors and statuses -->
<data name="err.no_tenant" xml:space="preserve"><value>No tenant connected.</value></data>
<data name="err.no_tenant_connected" xml:space="preserve"><value>No tenant selected. Please connect to a tenant first.</value></data>
<data name="err.no_profile_selected" xml:space="preserve"><value>No tenant profile selected. Please connect first.</value></data>
<data name="err.no_sites_selected" xml:space="preserve"><value>Select at least one site from the toolbar.</value></data>
<data name="err.no_users_selected" xml:space="preserve"><value>Add at least one user to audit.</value></data>
<data name="err.no_valid_rows" xml:space="preserve"><value>No valid rows to process. Import a CSV first.</value></data>
<data name="err.template_name_required" xml:space="preserve"><value>Template name is required.</value></data>
<data name="err.site_title_required" xml:space="preserve"><value>New site title is required.</value></data>
<data name="err.site_alias_required" xml:space="preserve"><value>New site alias is required.</value></data>
<data name="err.transfer_source_required" xml:space="preserve"><value>Source site and library must be selected.</value></data>
<data name="err.transfer_dest_required" xml:space="preserve"><value>Destination site and library must be selected.</value></data>
<data name="err.library_title_required" xml:space="preserve"><value>Library title is required.</value></data>
<!-- Templates status -->
<data name="templates.status.capturing" xml:space="preserve"><value>Capturing template...</value></data>
<data name="templates.status.success" xml:space="preserve"><value>Template captured successfully.</value></data>
<data name="templates.status.capture_failed" xml:space="preserve"><value>Capture failed: {0}</value></data>
<data name="templates.status.applying" xml:space="preserve"><value>Applying template...</value></data>
<data name="templates.status.applied" xml:space="preserve"><value>Template applied. Site created at: {0}</value></data>
<data name="templates.status.apply_failed" xml:space="preserve"><value>Apply failed: {0}</value></data>
<!-- UI text -->
<data name="audit.searching" xml:space="preserve"><value>Searching...</value></data>
<!-- Report text -->
<data name="report.text.users_parens" xml:space="preserve"><value>user(s)</value></data>
<data name="report.text.files_unit" xml:space="preserve"><value>files</value></data>
<data name="report.text.sites_unit" xml:space="preserve"><value>sites</value></data>
<data name="report.text.entries_unit" xml:space="preserve"><value>entries</value></data>
<!-- Help / Info button strings -->
<data name="help.perm.simplified.title" xml:space="preserve"><value>Simplified Permissions Mode</value></data>
<data name="help.perm.simplified.body" xml:space="preserve"><value>Groups raw SharePoint permissions into readable labels (Owner, Editor, Contributor, Reader, View-Only) and color-codes rows by risk level. Useful for a quick security overview without permission-level jargon.</value></data>
<data name="help.perm.merge.title" xml:space="preserve"><value>Merge Permissions</value></data>
<data name="help.perm.merge.body" xml:space="preserve"><value>When enabled, multiple permission entries for the same user or group are consolidated into a single row in the export, reducing report size. Disable to see every individual permission assignment separately.</value></data>
<data name="help.perm.hidesys.title" xml:space="preserve"><value>Hide System Groups</value></data>
<data name="help.perm.hidesys.body" xml:space="preserve"><value>Removes automatically-created SharePoint system groups from results (e.g. "Excel Services Viewers", "SharingLinks.*" groups). These groups are managed internally by SharePoint and are typically not relevant for user access audits.</value></data>
<data name="help.perm.excl.sharing.title" xml:space="preserve"><value>Exclude Sharing Links</value></data>
<data name="help.perm.excl.sharing.body" xml:space="preserve"><value>Removes sharing link entries from results and exports (e.g. "Anyone with the link", organisation-wide links). Useful when you only care about direct user and group permissions.</value></data>
<data name="help.perm.excl.system.title" xml:space="preserve"><value>Exclude System Groups (Limited Access)</value></data>
<data name="help.perm.excl.system.body" xml:space="preserve"><value>Removes "Limited Access System Group For Web/List" entries from results and exports. SharePoint creates these automatically when a user has item-level access; they are rarely relevant for user access audits.</value></data>
<data name="help.perm.inherited.title" xml:space="preserve"><value>Include Inherited Permissions</value></data>
<data name="help.perm.inherited.body" xml:space="preserve"><value>By default only objects with unique (broken) permissions are reported. Enable this to also include objects that inherit permissions from a parent, giving a complete picture of who can access every item.</value></data>
<data name="help.perm.splitmode.title" xml:space="preserve"><value>Export Split Mode</value></data>
<data name="help.perm.splitmode.body" xml:space="preserve"><value>Single File: all results are saved in one CSV or HTML file.
Split by Site: creates a separate file for each site collection. Useful when auditing large multi-site tenants to keep individual files manageable.</value></data>
<data name="help.search.title" xml:space="preserve"><value>KQL File Search</value></data>
<data name="help.search.body" xml:space="preserve"><value>Searches files across your SharePoint sites using KQL (Keyword Query Language). The keyword field is optional — leave it empty to return all files matching only the active filters. Combine date range, author, and library filters to narrow results.</value></data>
<data name="help.search.regex.title" xml:space="preserve"><value>Filename Regex Filter</value></data>
<data name="help.search.regex.body" xml:space="preserve"><value>Post-filters results client-side using a .NET regular expression matched against file names. Example: \.pdf$ matches only PDF files. Leave blank to skip this filter. The expression is case-insensitive.</value></data>
<data name="help.versions.policy.title" xml:space="preserve"><value>Version Cleanup Policy</value></data>
<data name="help.versions.policy.body" xml:space="preserve"><value>Permanently deletes old document versions from SharePoint libraries. Only the N most recent versions are kept — older ones are removed permanently and cannot be recovered. Run a preview scan first to see what will be deleted.</value></data>
<data name="help.versions.keepfirst.title" xml:space="preserve"><value>Keep First Version</value></data>
<data name="help.versions.keepfirst.body" xml:space="preserve"><value>Always preserves version 1.0 (the original) of each document, regardless of the "Keep Last N" setting. Useful to maintain an audit trail of a document's initial state.</value></data>
<data name="help.versions.confirm.title" xml:space="preserve"><value>Confirm Before Delete</value></data>
<data name="help.versions.confirm.body" xml:space="preserve"><value>When enabled, a confirmation dialog appears for each file before its versions are deleted. Uncheck for unattended batch processing.</value></data>
<data name="help.dup.criteria.title" xml:space="preserve"><value>Duplicate Matching Criteria</value></data>
<data name="help.dup.criteria.body" xml:space="preserve"><value>Two items are flagged as duplicates when their names match AND all checked additional criteria also match. More criteria checked = fewer groups, but more precise matches. Using name only finds files with the same filename anywhere in the site, regardless of content.</value></data>
<data name="help.transfer.incsource.title" xml:space="preserve"><value>Include Source Folder</value></data>
<data name="help.transfer.incsource.body" xml:space="preserve"><value>When enabled, the source folder itself is recreated at the destination (e.g. transferring "Reports" creates a "Reports/" folder at the target). When disabled, only the contents inside the folder are transferred — useful when merging into an existing destination folder.</value></data>
<data name="help.transfer.copycontent.title" xml:space="preserve"><value>Copy Folder Contents Only</value></data>
<data name="help.transfer.copycontent.body" xml:space="preserve"><value>When enabled, only the files and subfolders inside the selected folder are transferred — the selected folder itself is not recreated at the destination.</value></data>
<data name="help.transfer.conflict.title" xml:space="preserve"><value>File Conflict Policy</value></data>
<data name="help.transfer.conflict.body" xml:space="preserve"><value>Defines what happens when a file with the same name already exists at the destination:
• Skip — leave the existing destination file unchanged.
• Overwrite — replace the destination file with the source file.
• Rename — keep both by appending a number suffix to the transferred file's name.</value></data>
<data name="help.bulkmembers.title" xml:space="preserve"><value>Bulk Add Members — CSV Format</value></data>
<data name="help.bulkmembers.body" xml:space="preserve"><value>The CSV file must contain these columns (headers required, order is flexible):
• GroupName — the exact SharePoint group name
• Email — the user's email address
• Role — Member, Owner, or Visitor
Click "Load Example" to open a pre-filled sample file.</value></data>
<data name="help.bulksites.title" xml:space="preserve"><value>Bulk Create Sites — CSV Format</value></data>
<data name="help.bulksites.body" xml:space="preserve"><value>The CSV file must contain these columns:
• Name — the display name for the new site
• Alias — URL alias (no spaces; becomes part of the site URL)
• Type — TeamSite or CommunicationSite
• Owners — comma-separated list of owner email addresses
Click "Load Example" to open a pre-filled sample file.</value></data>
<data name="help.folderstruct.title" xml:space="preserve"><value>Create Folder Structure — CSV Format</value></data>
<data name="help.folderstruct.body" xml:space="preserve"><value>Creates a folder hierarchy inside a SharePoint library from a CSV file. Each row defines one folder path using up to 4 levels (Level1Level4). Leave deeper level columns empty for shallower paths.
Example row: Contracts | 2024 | Q1 | (empty)
Creates: Library / Contracts / 2024 / Q1</value></data>
<data name="help.templates.capture.title" xml:space="preserve"><value>Capture Site Template</value></data>
<data name="help.templates.capture.body" xml:space="preserve"><value>Saves the currently selected site's structure (libraries, folder hierarchy, permissions, settings, and logo) as a reusable template stored locally on your machine. The source site is not modified in any way.
Select which elements to include using the checkboxes above.</value></data>
<data name="help.templates.apply.title" xml:space="preserve"><value>Apply Template to New Site</value></data>
<data name="help.templates.apply.body" xml:space="preserve"><value>Creates a brand-new SharePoint site and reproduces the structure captured in the selected template — including libraries, folders, permissions, settings, and logo. The source template and original site are not affected.
Provide a display name and URL alias for the new site before clicking Apply.</value></data>
<data name="help.audit.mode.title" xml:space="preserve"><value>Search vs Browse Mode</value></data>
<data name="help.audit.mode.body" xml:space="preserve"><value>Search Mode: type a name or email to find a specific user via Azure AD. Matching users appear in a list — click to select them for the audit.
Browse Mode: loads all users in your tenant directory. Use the filter box to narrow the list, then double-click a row to add the user to the audit.</value></data>
<data name="help.audit.vs.perms.title" xml:space="preserve"><value>User Access Audit vs Permissions Audit</value></data>
<data name="help.audit.vs.perms.body" xml:space="preserve"><value>The Permissions tab scans objects (libraries, folders, items) and shows who has access to each one.
This tab does the reverse: you select one or more users and it finds every object they can access — including access granted via SharePoint groups or Active Directory groups.</value></data>
<data name="help.storage.hidden.title" xml:space="preserve"><value>Hidden Libraries</value></data>
<data name="help.storage.hidden.body" xml:space="preserve"><value>Scans SharePoint libraries hidden from the site's normal navigation (e.g. Site Assets, Style Library, Form Templates). These can consume significant storage and are often overlooked in routine audits.</value></data>
<data name="help.storage.preservation.title" xml:space="preserve"><value>Preservation Hold Library</value></data>
<data name="help.storage.preservation.body" xml:space="preserve"><value>A hidden SharePoint library that stores versions of documents modified or deleted while a Microsoft Purview / Microsoft 365 Compliance retention policy is active. It can grow very large over time without being visible to normal site users.</value></data>
<data name="adminaudit.accessdenied" xml:space="preserve">
<value>Access denied. Admin role required.</value>
</data>
<data name="adminaudit.col.action" xml:space="preserve">
<value>Action</value>
</data>
<data name="adminaudit.col.client" xml:space="preserve">
<value>Client</value>
</data>
<data name="adminaudit.col.details" xml:space="preserve">
<value>Details</value>
</data>
<data name="adminaudit.col.role" xml:space="preserve">
<value>Role</value>
</data>
<data name="adminaudit.filter.action" xml:space="preserve">
<value>Filter by action...</value>
</data>
<data name="adminaudit.filter.client" xml:space="preserve">
<value>Filter by client...</value>
</data>
<data name="adminaudit.filter.user" xml:space="preserve">
<value>Filter by user...</value>
</data>
<data name="adminaudit.loading" xml:space="preserve">
<value>Loading audit log...</value>
</data>
<data name="adminaudit.noentries" xml:space="preserve">
<value>No audit entries found.</value>
</data>
<data name="adminaudit.showing" xml:space="preserve">
<value>Showing {0} of {1} entries</value>
</data>
<data name="adminaudit.subtitle" xml:space="preserve">
<value>All technician and admin actions within the application.</value>
</data>
<data name="adminaudit.title" xml:space="preserve">
<value>Audit Logs</value>
</data>
<data name="audit.btn.auditUsers" xml:space="preserve">
<value>Audit Users</value>
</data>
<data name="audit.btn.auditing" xml:space="preserve">
<value>Auditing…</value>
</data>
<data name="audit.btn.loadUsers" xml:space="preserve">
<value>Load Users</value>
</data>
<data name="audit.btn.loading" xml:space="preserve">
<value>Loading… ({0})</value>
</data>
<data name="audit.btn.selectAll" xml:space="preserve">
<value>Select all ({0})</value>
</data>
<data name="audit.chip.high" xml:space="preserve">
<value>High</value>
</data>
<data name="audit.view.bySite" xml:space="preserve">
<value>By site</value>
</data>
<data name="audit.view.table" xml:space="preserve">
<value>Table</value>
</data>
<data name="audit.bysite.hint" xml:space="preserve">
<value>Sites the selected user(s) can access. Click a site to reveal the permission detail.</value>
</data>
<data name="audit.hint.allSites" xml:space="preserve">
<value>Optional — leave empty to scan every site in the tenant.</value>
</data>
<data name="audit.status.discoveringSites" xml:space="preserve">
<value>Discovering all sites in the tenant…</value>
</data>
<data name="audit.err.discoverFailed" xml:space="preserve">
<value>Could not list tenant sites: {0}</value>
</data>
<data name="audit.scan.sitesScanned" xml:space="preserve">
<value>{0} site(s) scanned</value>
</data>
<data name="audit.scan.sitesDenied" xml:space="preserve">
<value>{0} skipped (no access)</value>
</data>
<data name="audit.scan.sitesFailed" xml:space="preserve">
<value>{0} failed</value>
</data>
<data name="audit.chk.includeInherited" xml:space="preserve">
<value>Include inherited</value>
</data>
<data name="audit.col.permission" xml:space="preserve">
<value>Permission</value>
</data>
<data name="audit.err.noUsersOrEmail" xml:space="preserve">
<value>Select at least one user or enter an email.</value>
</data>
<data name="audit.lbl.additionalEmails" xml:space="preserve">
<value>Additional emails (one per line)</value>
</data>
<data name="audit.lbl.selectedCount" xml:space="preserve">
<value>{0} selected</value>
</data>
<data name="audit.lbl.users" xml:space="preserve">
<value>Users</value>
</data>
<data name="audit.msg.showFirst500Export" xml:space="preserve">
<value>Showing first 500. Export for full results.</value>
</data>
<data name="audit.msg.showFirst500Filter" xml:space="preserve">
<value>Showing first 500. Refine filter to narrow.</value>
</data>
<data name="audit.ph.filterUsers" xml:space="preserve">
<value>Filter by name or email…</value>
</data>
<data name="audit.results.title" xml:space="preserve">
<value>Audit Results</value>
</data>
<data name="audit.status.cancelled" xml:space="preserve">
<value>Cancelled.</value>
</data>
<data name="audit.status.found" xml:space="preserve">
<value>Found {0} access entries.</value>
</data>
<data name="audit.subtitle" xml:space="preserve">
<value>Find all permissions for one or more users across multiple sites.</value>
</data>
<data name="bulkmembers.complete" xml:space="preserve">
<value>Complete: {0} added, {1} failed.</value>
</data>
<data name="bulkmembers.csvlabel" xml:space="preserve">
<value>CSV File (GroupName, GroupUrl, Email, Role)</value>
</data>
<data name="bulkmembers.err.nosite" xml:space="preserve">
<value>Please select a site.</value>
</data>
<data name="bulkmembers.exporterrors" xml:space="preserve">
<value>Export Errors CSV</value>
</data>
<data name="bulkmembers.processed" xml:space="preserve">
<value>Processed: {0} / {1}. Failures: {2}</value>
</data>
<data name="bulkmembers.processing" xml:space="preserve">
<value>Processing…</value>
</data>
<data name="bulkmembers.status" xml:space="preserve">
<value>Status</value>
</data>
<data name="bulkmembers.subtitle" xml:space="preserve">
<value>Add users to SharePoint groups from a CSV file.</value>
</data>
<data name="bulkmembers.validsummary" xml:space="preserve">
<value>{0} valid rows, {1} errors.</value>
</data>
<data name="bulksites.adminurl" xml:space="preserve">
<value>Admin Center URL</value>
</data>
<data name="bulksites.col.status" xml:space="preserve">
<value>Status</value>
</data>
<data name="bulksites.creating" xml:space="preserve">
<value>Creating…</value>
</data>
<data name="bulksites.csvfile.label" xml:space="preserve">
<value>CSV File (Name, Alias, Type, Template, Owners, Members)</value>
</data>
<data name="bulksites.export.errors" xml:space="preserve">
<value>Export Errors CSV</value>
</data>
<data name="bulksites.page.subtitle" xml:space="preserve">
<value>Create multiple SharePoint sites from a CSV file.</value>
</data>
<data name="bulksites.page.title" xml:space="preserve">
<value>Bulk Site Creation</value>
</data>
<data name="bulksites.status.cancelled" xml:space="preserve">
<value>Cancelled.</value>
</data>
<data name="bulksites.status.complete" xml:space="preserve">
<value>Complete: {0} created, {1} failed.</value>
</data>
<data name="bulksites.summary.created" xml:space="preserve">
<value>Created: {0} / {1}. Failures: {2}</value>
</data>
<data name="bulksites.validcount" xml:space="preserve">
<value>{0} valid, {1} errors.</value>
</data>
<data name="changepw.confirm" xml:space="preserve">
<value>Confirm new password</value>
</data>
<data name="changepw.current" xml:space="preserve">
<value>Current password</value>
</data>
<data name="changepw.entra" xml:space="preserve">
<value>Your account signs in with Microsoft (Entra). Manage its password in your Microsoft account.</value>
</data>
<data name="changepw.err.incorrect" xml:space="preserve">
<value>Current password is incorrect.</value>
</data>
<data name="changepw.err.mismatch" xml:space="preserve">
<value>New passwords do not match.</value>
</data>
<data name="changepw.loading" xml:space="preserve">
<value>Loading…</value>
</data>
<data name="changepw.mustsignin" xml:space="preserve">
<value>You must be signed in.</value>
</data>
<data name="changepw.new" xml:space="preserve">
<value>New password</value>
</data>
<data name="changepw.submit" xml:space="preserve">
<value>Change password</value>
</data>
<data name="changepw.success" xml:space="preserve">
<value>Password changed.</value>
</data>
<data name="changepw.title" xml:space="preserve">
<value>Change Password</value>
</data>
<data name="connect.button" xml:space="preserve">
<value>Connect via Microsoft</value>
</data>
<data name="connect.err.noprofile" xml:space="preserve">
<value>No client profile selected.</value>
</data>
<data name="connect.redirect.note" xml:space="preserve">
<value>You will be redirected to Microsoft login. MFA is supported.</value>
</data>
<data name="connect.redirecting" xml:space="preserve">
<value>Redirecting…</value>
</data>
<data name="connect.subtitle.prefix" xml:space="preserve">
<value>Authenticate to access</value>
</data>
<data name="connect.title" xml:space="preserve">
<value>Connect to Microsoft</value>
</data>
<data name="connect.token.note" xml:space="preserve">
<value>Your session token is stored in your browser only — never saved to disk.</value>
</data>
<data name="directory.btn.loadUsers" xml:space="preserve">
<value>Load Users</value>
</data>
<data name="directory.btn.loading" xml:space="preserve">
<value>Loading… ({0} users)</value>
</data>
<data name="directory.filter.byNameEmail" xml:space="preserve">
<value>Filter by name or email…</value>
</data>
<data name="directory.showing500" xml:space="preserve">
<value>Showing first 500 of {0} filtered.</value>
</data>
<data name="directory.status.loaded" xml:space="preserve">
<value>Loaded {0} users.</value>
</data>
<data name="directory.subtitle" xml:space="preserve">
<value>Browse all tenant users via Microsoft Graph.</value>
</data>
<data name="directory.title.users" xml:space="preserve">
<value>Users</value>
</data>
<data name="directory.type.member" xml:space="preserve">
<value>Member</value>
</data>
<data name="duplicates.btn.find" xml:space="preserve">
<value>Find Duplicates</value>
</data>
<data name="duplicates.btn.scanning" xml:space="preserve">
<value>Scanning…</value>
</data>
<data name="duplicates.chk.match_created" xml:space="preserve">
<value>Match created</value>
</data>
<data name="duplicates.chk.match_file_count" xml:space="preserve">
<value>Match file count</value>
</data>
<data name="duplicates.chk.match_folder_count" xml:space="preserve">
<value>Match subfolder count</value>
</data>
<data name="duplicates.chk.match_modified" xml:space="preserve">
<value>Match modified</value>
</data>
<data name="duplicates.chk.match_size" xml:space="preserve">
<value>Match size</value>
</data>
<data name="duplicates.lbl.library_optional" xml:space="preserve">
<value>Library (optional)</value>
</data>
<data name="duplicates.lbl.mode" xml:space="preserve">
<value>Mode</value>
</data>
<data name="duplicates.mode.files" xml:space="preserve">
<value>Files</value>
</data>
<data name="duplicates.mode.folders" xml:space="preserve">
<value>Folders</value>
</data>
<data name="duplicates.page.title" xml:space="preserve">
<value>Duplicate Detection</value>
</data>
<data name="duplicates.results.title" xml:space="preserve">
<value>Duplicate Groups</value>
</data>
<data name="duplicates.results.truncated" xml:space="preserve">
<value>Showing first 100 groups. Export for all.</value>
</data>
<data name="folderstruct.btn.addRoot" xml:space="preserve">
<value>+ Add top-level folder</value>
</data>
<data name="folderstruct.btn.buildVisually" xml:space="preserve">
<value>Build visually</value>
</data>
<data name="folderstruct.btn.creating" xml:space="preserve">
<value>Creating…</value>
</data>
<data name="folderstruct.btn.uploadCsv" xml:space="preserve">
<value>Upload CSV</value>
</data>
<data name="folderstruct.builder.empty" xml:space="preserve">
<value>No folders yet. Add a top-level folder to start.</value>
</data>
<data name="folderstruct.err.selectSite" xml:space="preserve">
<value>Please select a site.</value>
</data>
<data name="folderstruct.lbl.csvFile" xml:space="preserve">
<value>CSV File (Level1, Level2, Level3, Level4)</value>
</data>
<data name="folderstruct.lbl.libraryTitle" xml:space="preserve">
<value>Library Title</value>
</data>
<data name="folderstruct.lbl.source" xml:space="preserve">
<value>Source</value>
</data>
<data name="folderstruct.result" xml:space="preserve">
<value>Created: {0} folders. Failures: {1}</value>
</data>
<data name="folderstruct.rowsSummary" xml:space="preserve">
<value>{0} valid rows, {1} errors.</value>
</data>
<data name="folderstruct.status.complete" xml:space="preserve">
<value>Complete: {0} folders created.</value>
</data>
<data name="folderstruct.subtitle" xml:space="preserve">
<value>Create folder hierarchies in a document library from a CSV template.</value>
</data>
<data name="foldertree.btn.addsub" xml:space="preserve">
<value>+ Sub</value>
</data>
<data name="foldertree.btn.addsub.tooltip" xml:space="preserve">
<value>Add subfolder</value>
</data>
<data name="foldertree.btn.remove.tooltip" xml:space="preserve">
<value>Remove</value>
</data>
<data name="foldertree.ph.name" xml:space="preserve">
<value>Folder name</value>
</data>
<data name="home.connected" xml:space="preserve">
<value>Connected: {0}</value>
</data>
<data name="home.feat.bulkmembers.desc" xml:space="preserve">
<value>Add users to groups via CSV</value>
</data>
<data name="home.feat.bulksites.desc" xml:space="preserve">
<value>Create sites from CSV</value>
</data>
<data name="home.feat.duplicates.desc" xml:space="preserve">
<value>Find duplicate files/folders</value>
</data>
<data name="home.feat.folderstruct.desc" xml:space="preserve">
<value>Create folders from CSV template</value>
</data>
<data name="home.feat.permissions.desc" xml:space="preserve">
<value>Scan site permission assignments</value>
</data>
<data name="home.feat.search.desc" xml:space="preserve">
<value>KQL-based file search</value>
</data>
<data name="home.feat.storage.desc" xml:space="preserve">
<value>Analyze library storage usage</value>
</data>
<data name="home.feat.templates.desc" xml:space="preserve">
<value>Capture and apply site templates</value>
</data>
<data name="home.feat.transfer.desc" xml:space="preserve">
<value>Copy/move files between libraries</value>
</data>
<data name="home.feat.transfer.title" xml:space="preserve">
<value>File Transfer</value>
</data>
<data name="home.feat.useraudit.desc" xml:space="preserve">
<value>Audit user permissions cross-site</value>
</data>
<data name="home.feat.userdir.desc" xml:space="preserve">
<value>Browse tenant users via Graph</value>
</data>
<data name="home.feat.versions.desc" xml:space="preserve">
<value>Delete old file versions</value>
</data>
<data name="home.feat.versions.title" xml:space="preserve">
<value>Version Cleanup</value>
</data>
<data name="home.link.permissions" xml:space="preserve">
<value>Permissions Audit</value>
</data>
<data name="home.link.storage" xml:space="preserve">
<value>Storage Metrics</value>
</data>
<data name="home.tenant" xml:space="preserve">
<value>Tenant:</value>
</data>
<data name="home.welcome" xml:space="preserve">
<value>Welcome</value>
</data>
<data name="home.welcome.body" xml:space="preserve">
<value>Select a tenant profile to start using SharePoint Toolbox.</value>
</data>
<data name="librarypicker.browse" xml:space="preserve">
<value>Browse</value>
</data>
<data name="librarypicker.loadingShort" xml:space="preserve">
<value>Loading…</value>
</data>
<data name="librarypicker.noLibraries" xml:space="preserve">
<value>No document libraries found on this site.</value>
</data>
<data name="librarypicker.selectSiteFirst" xml:space="preserve">
<value>Select a site first.</value>
</data>
<data name="logoupload.err.read" xml:space="preserve">
<value>Could not read image: {0}</value>
</data>
<data name="logoupload.err.toolarge" xml:space="preserve">
<value>File too large ({0} KB). Max {1} KB.</value>
</data>
<data name="logoupload.hint" xml:space="preserve">
<value>PNG, JPEG, SVG or GIF — max {0} KB.</value>
</data>
<data name="logoupload.remove" xml:space="preserve">
<value>Remove</value>
</data>
<data name="mergemode.opt.multipleFiles" xml:space="preserve">
<value>Multiple documents (ZIP)</value>
</data>
<data name="mergemode.opt.singleMerged" xml:space="preserve">
<value>One document, no tabs</value>
</data>
<data name="mergemode.opt.singleTabbed" xml:space="preserve">
<value>One document, tabs (HTML)</value>
</data>
<data name="mergemode.tooltip" xml:space="preserve">
<value>How to bundle reports when multiple sites are scanned</value>
</data>
<data name="nav.auditLogs" xml:space="preserve">
<value>Audit Logs</value>
</data>
<data name="nav.changePassword" xml:space="preserve">
<value>Change Password</value>
</data>
<data name="nav.clear" xml:space="preserve">
<value>Clear</value>
</data>
<data name="nav.clientProfiles" xml:space="preserve">
<value>Client Profiles</value>
</data>
<data name="nav.darkMode" xml:space="preserve">
<value>Dark Mode</value>
</data>
<data name="nav.fileTransfer" xml:space="preserve">
<value>File Transfer</value>
</data>
<data name="nav.home" xml:space="preserve">
<value>Home</value>
</data>
<data name="nav.lightMode" xml:space="preserve">
<value>Light Mode</value>
</data>
<data name="nav.loading" xml:space="preserve">
<value>Loading…</value>
</data>
<data name="nav.logout" xml:space="preserve">
<value>Logout</value>
</data>
<data name="nav.noMatch" xml:space="preserve">
<value>No match</value>
</data>
<data name="nav.reconnect" xml:space="preserve">
<value>Reconnect</value>
</data>
<data name="nav.appIdentity" xml:space="preserve">
<value>app identity</value>
</data>
<data name="nav.searchPlaceholder" xml:space="preserve">
<value>Search…</value>
</data>
<data name="nav.section.admin" xml:space="preserve">
<value>Admin</value>
</data>
<data name="nav.section.audit" xml:space="preserve">
<value>Audit</value>
</data>
<data name="nav.section.bulk" xml:space="preserve">
<value>Bulk</value>
</data>
<data name="nav.section.config" xml:space="preserve">
<value>Config</value>
</data>
<data name="nav.toggleSidebar" xml:space="preserve">
<value>Toggle sidebar</value>
</data>
<data name="nav.userDirectory" xml:space="preserve">
<value>User Directory</value>
</data>
<data name="nav.userManagement" xml:space="preserve">
<value>User Management</value>
</data>
<data name="noprofile.body" xml:space="preserve">
<value>Select or create a tenant profile to get started.</value>
</data>
<data name="noprofile.goto" xml:space="preserve">
<value>Go to Profiles</value>
</data>
<data name="noprofile.heading" xml:space="preserve">
<value>No profile selected</value>
</data>
<data name="notfound.back" xml:space="preserve">
<value>Back to Home</value>
</data>
<data name="notfound.body" xml:space="preserve">
<value>The page you requested doesn't exist or has moved.</value>
</data>
<data name="notfound.heading" xml:space="preserve">
<value>Page not found</value>
</data>
<data name="notfound.pagetitle" xml:space="preserve">
<value>Page not found — SharePoint Toolbox</value>
</data>
<data name="perm.btn.scan" xml:space="preserve">
<value>Scan Sites</value>
</data>
<data name="perm.btn.scanning" xml:space="preserve">
<value>Scanning…</value>
</data>
<data name="perm.col.permission" xml:space="preserve">
<value>Permission</value>
</data>
<data name="perm.col.users" xml:space="preserve">
<value>Users</value>
</data>
<data name="perm.results" xml:space="preserve">
<value>Results</value>
</data>
<data name="perm.status.scan_complete" xml:space="preserve">
<value>Scan complete: {0} entries across {1} site(s).</value>
</data>
<data name="perm.status.scanning_site" xml:space="preserve">
<value>Scanning {0} ({1}/{2})…</value>
</data>
<data name="perm.status.showing_first" xml:space="preserve">
<value>Showing first 500 of {0} rows. Export for full results.</value>
</data>
<data name="perm.title" xml:space="preserve">
<value>Permissions Audit</value>
</data>
<data name="profile.selector.empty" xml:space="preserve">
<value>No profiles configured.</value>
</data>
<data name="profile.selector.manage" xml:space="preserve">
<value>Manage profiles</value>
</data>
<data name="profile.selector.placeholder" xml:space="preserve">
<value>Select a profile</value>
</data>
<data name="profiles.active" xml:space="preserve">
<value>Active</value>
</data>
<data name="profiles.clientid.label" xml:space="preserve">
<value>Client ID:</value>
</data>
<data name="profiles.devicecode.intro.post" xml:space="preserve">
<value>to authorize app creation:</value>
</data>
<data name="profiles.devicecode.intro.pre" xml:space="preserve">
<value>Sign in to the</value>
</data>
<data name="profiles.devicecode.intro.tenant" xml:space="preserve">
<value>client tenant</value>
</data>
<data name="profiles.devicecode.step.approve" xml:space="preserve">
<value>Approve the requested permissions with an admin account.</value>
</data>
<data name="profiles.devicecode.step.code" xml:space="preserve">
<value>Enter code:</value>
</data>
<data name="profiles.devicecode.step.open" xml:space="preserve">
<value>Open</value>
</data>
<data name="profiles.edit" xml:space="preserve">
<value>Edit</value>
</data>
<data name="profiles.empty" xml:space="preserve">
<value>No profiles configured. Create one to get started.</value>
</data>
<data name="profiles.err.clientid_required" xml:space="preserve">
<value>Client ID is required.</value>
</data>
<data name="profiles.err.name_required" xml:space="preserve">
<value>Name is required.</value>
</data>
<data name="profiles.err.tenantid_required" xml:space="preserve">
<value>Tenant ID is required.</value>
</data>
<data name="profiles.err.url_required" xml:space="preserve">
<value>Tenant URL is required.</value>
</data>
<data name="profiles.form.clientid" xml:space="preserve">
<value>Client ID (App Registration)</value>
</data>
<data name="profiles.form.clientid.ph" xml:space="preserve">
<value>Auto-filled after registration, or enter manually</value>
</data>
<data name="profiles.form.edit" xml:space="preserve">
<value>Edit Profile</value>
</data>
<data name="profiles.form.logo" xml:space="preserve">
<value>Client logo (optional)</value>
</data>
<data name="profiles.form.logo.hint" xml:space="preserve">
<value>Shown top-right on exported reports for this client.</value>
</data>
<data name="profiles.form.name" xml:space="preserve">
<value>Profile Name *</value>
</data>
<data name="profiles.form.name.ph" xml:space="preserve">
<value>e.g. Contoso Production</value>
</data>
<data name="profiles.form.new" xml:space="preserve">
<value>New Profile</value>
</data>
<data name="profiles.form.tenantid" xml:space="preserve">
<value>Tenant ID (GUID or domain) *</value>
</data>
<data name="profiles.form.tenantid.ph" xml:space="preserve">
<value>contoso.onmicrosoft.com or GUID</value>
</data>
<data name="profiles.form.url" xml:space="preserve">
<value>Tenant URL *</value>
</data>
<data name="profiles.new" xml:space="preserve">
<value>+ New Profile</value>
</data>
<data name="profiles.reg.cancelled" xml:space="preserve">
<value>Registration cancelled.</value>
</data>
<data name="profiles.reg.creating" xml:space="preserve">
<value>Creating the app registration…</value>
</data>
<data name="profiles.reg.failed" xml:space="preserve">
<value>Registration failed: {0}</value>
</data>
<data name="profiles.reg.registered" xml:space="preserve">
<value>App registered. Review and Save the profile.</value>
</data>
<data name="profiles.reg.propagating" xml:space="preserve">
<value>App registered. Waiting for certificate and consent to propagate…</value>
</data>
<data name="profiles.reg.notready" xml:space="preserve">
<value>App registered, but app-only auth is not ready yet ({0}). It may take a few minutes; Save and use Test connection shortly.</value>
</data>
<data name="profiles.reg.requesting" xml:space="preserve">
<value>Requesting a sign-in code…</value>
</data>
<data name="profiles.reg.waitingsignin" xml:space="preserve">
<value>Waiting for sign-in to complete…</value>
</data>
<data name="profiles.register.btn" xml:space="preserve">
<value>Register in Entra</value>
</data>
<data name="profiles.register.hint" xml:space="preserve">
<value>Click "Register in Entra" to auto-create the app registration in the client tenant. You'll sign in with a client admin account — no secrets, no pre-existing app needed. Or enter an existing public client App Registration ID manually.</value>
</data>
<data name="profiles.register.tooltip.disabled" xml:space="preserve">
<value>Fill Tenant URL, Tenant ID and Profile Name first</value>
</data>
<data name="profiles.register.tooltip.ready" xml:space="preserve">
<value>Register app in client Entra ID (requires an admin who can create app registrations)</value>
</data>
<data name="profiles.register.waiting" xml:space="preserve">
<value>Waiting…</value>
</data>
<data name="profiles.restricted" xml:space="preserve">
<value>Profile management is restricted to Admins. Select a profile below to work on a client.</value>
</data>
<data name="profiles.select" xml:space="preserve">
<value>Select</value>
</data>
<data name="profiles.selected" xml:space="preserve">
<value>Selected</value>
</data>
<data name="profiles.subtitle" xml:space="preserve">
<value>Manage SharePoint tenant connections. Credentials are entered per session — no secrets stored on disk.</value>
</data>
<data name="profiles.tenantid.label" xml:space="preserve">
<value>Tenant ID:</value>
</data>
<data name="profiles.title" xml:space="preserve">
<value>Client Profiles</value>
</data>
<data name="settings.behavior.autoElevate" xml:space="preserve">
<value>Auto-elevate ownership when permission scan is denied</value>
</data>
<data name="settings.logo.description" xml:space="preserve">
<value>Shown top-left on exported HTML reports. The client's logo (top-right) is set per profile.</value>
</data>
<data name="settings.saved" xml:space="preserve">
<value>Settings saved.</value>
</data>
<data name="settings.section.behavior" xml:space="preserve">
<value>Behavior</value>
</data>
<data name="settings.section.branding" xml:space="preserve">
<value>Report Branding</value>
</data>
<data name="settings.section.display" xml:space="preserve">
<value>Display</value>
</data>
<data name="sitepicker.btn.clear" xml:space="preserve">
<value>Clear</value>
</data>
<data name="sitepicker.btn.reload" xml:space="preserve">
<value>Reload sites</value>
</data>
<data name="sitepicker.btn.selectAllCount" xml:space="preserve">
<value>Select all ({0})</value>
</data>
<data name="sitepicker.empty.noMatch" xml:space="preserve">
<value>No sites match the filter.</value>
</data>
<data name="sitepicker.err.noSites" xml:space="preserve">
<value>No sites returned. The account may lack Sites.Read.All.</value>
</data>
<data name="sitepicker.hint.loadMulti" xml:space="preserve">
<value>Click “Load sites” to list the tenants SharePoint sites, then tick the ones to scan.</value>
</data>
<data name="sitepicker.hint.loadSingle" xml:space="preserve">
<value>Click “Load sites” to list the tenants SharePoint sites, then pick one.</value>
</data>
<data name="sitepicker.label.site" xml:space="preserve">
<value>Site</value>
</data>
<data name="sitepicker.label.sites" xml:space="preserve">
<value>Sites</value>
</data>
<data name="sitepicker.ph.filter" xml:space="preserve">
<value>Filter loaded sites by name or URL…</value>
</data>
<data name="sitepicker.status.loadingShort" xml:space="preserve">
<value>Loading…</value>
</data>
<data name="sitepicker.status.selectedCount" xml:space="preserve">
<value>{0} selected</value>
</data>
<data name="srch.col.size.kb" xml:space="preserve">
<value>Size (KB)</value>
</data>
<data name="srch.err.noSites" xml:space="preserve">
<value>Please select at least one site.</value>
</data>
<data name="srch.lbl.extensions" xml:space="preserve">
<value>File Extensions (comma-separated)</value>
</data>
<data name="srch.lbl.library" xml:space="preserve">
<value>Library (optional)</value>
</data>
<data name="srch.options" xml:space="preserve">
<value>Search Options</value>
</data>
<data name="srch.results" xml:space="preserve">
<value>Results</value>
</data>
<data name="srch.status.found" xml:space="preserve">
<value>Found {0} files across {1} site(s).</value>
</data>
<data name="srch.status.searchingSite" xml:space="preserve">
<value>Searching {0} ({1}/{2})…</value>
</data>
<data name="srch.truncated" xml:space="preserve">
<value>Showing first 500 of {0}. Export for full results.</value>
</data>
<data name="stor.badge.libraries_count" xml:space="preserve">
<value>{0} libraries</value>
</data>
<data name="stor.btn.scan_storage" xml:space="preserve">
<value>Scan Storage</value>
</data>
<data name="stor.btn.scanning" xml:space="preserve">
<value>Scanning…</value>
</data>
<data name="stor.chk.include_hidden_libs" xml:space="preserve">
<value>Include hidden libs</value>
</data>
<data name="stor.chk.include_recycle_bin" xml:space="preserve">
<value>Include recycle bin</value>
</data>
<data name="stor.col.total_mb" xml:space="preserve">
<value>Total (MB)</value>
</data>
<data name="stor.col.versions_mb" xml:space="preserve">
<value>Versions (MB)</value>
</data>
<data name="stor.err.select_site" xml:space="preserve">
<value>Please select at least one site.</value>
</data>
<data name="stor.hint.folder_depth" xml:space="preserve">
<value>0 = libraries only. 1+ = drill into subfolders that many levels deep.</value>
</data>
<data name="stor.lbl.folder_scan_depth" xml:space="preserve">
<value>Folder scan depth</value>
</data>
<data name="stor.page.title" xml:space="preserve">
<value>Storage Metrics</value>
</data>
<data name="stor.report.title" xml:space="preserve">
<value>Storage Report</value>
</data>
<data name="stor.status.cancelled" xml:space="preserve">
<value>Cancelled.</value>
</data>
<data name="stor.status.complete_nodes" xml:space="preserve">
<value>Complete: {0} nodes across {1} site(s).</value>
</data>
<data name="stor.status.scanning_site" xml:space="preserve">
<value>Scanning {0} ({1}/{2})…</value>
</data>
<data name="templates.adminurl" xml:space="preserve">
<value>Admin Center URL</value>
</data>
<data name="templates.apply.selectedlabel" xml:space="preserve">
<value>Template:</value>
</data>
<data name="templates.apply.selectprompt" xml:space="preserve">
<value>Select a template from the list below.</value>
</data>
<data name="templates.btn.applying" xml:space="preserve">
<value>Applying…</value>
</data>
<data name="templates.btn.capture" xml:space="preserve">
<value>Capture</value>
</data>
<data name="templates.btn.capturing" xml:space="preserve">
<value>Capturing…</value>
</data>
<data name="templates.btn.use" xml:space="preserve">
<value>Use</value>
</data>
<data name="templates.libraries.suffix" xml:space="preserve">
<value>{0} libraries</value>
</data>
<data name="templates.name.placeholder" xml:space="preserve">
<value>My Template</value>
</data>
<data name="templates.page.subtitle" xml:space="preserve">
<value>Capture site structure and apply to new sites.</value>
</data>
<data name="templates.page.title" xml:space="preserve">
<value>Site Templates</value>
</data>
<data name="templates.status.cancelled" xml:space="preserve">
<value>Cancelled.</value>
</data>
<data name="templates.status.saved" xml:space="preserve">
<value>Template '{0}' saved.</value>
</data>
<data name="templates.status.sitecreated" xml:space="preserve">
<value>Site created: {0}</value>
</data>
<data name="transfer.chk.include_source_short" xml:space="preserve">
<value>Include source folder</value>
</data>
<data name="transfer.conflict.rename.short" xml:space="preserve">
<value>Rename</value>
</data>
<data name="transfer.destfolder.optional" xml:space="preserve">
<value>Destination Folder (optional)</value>
</data>
<data name="transfer.destination" xml:space="preserve">
<value>Destination</value>
</data>
<data name="transfer.err.no_dest_site" xml:space="preserve">
<value>Please select a destination site.</value>
</data>
<data name="transfer.err.no_source_site" xml:space="preserve">
<value>Please select a source site.</value>
</data>
<data name="transfer.page.title" xml:space="preserve">
<value>File Transfer</value>
</data>
<data name="transfer.result.failures" xml:space="preserve">
<value>Failures: {0}</value>
</data>
<data name="transfer.result.transferred" xml:space="preserve">
<value>Transferred: {0} / {1} files.</value>
</data>
<data name="transfer.source" xml:space="preserve">
<value>Source</value>
</data>
<data name="transfer.sourcefolder.optional" xml:space="preserve">
<value>Source Folder (optional)</value>
</data>
<data name="transfer.sourcefolder.placeholder" xml:space="preserve">
<value>SubFolder/Path</value>
</data>
<data name="transfer.status.cancelled" xml:space="preserve">
<value>Cancelled.</value>
</data>
<data name="transfer.status.complete" xml:space="preserve">
<value>Complete: {0} transferred.</value>
</data>
<data name="transfer.transferring" xml:space="preserve">
<value>Transferring…</value>
</data>
<data name="usermgmt.accessdenied" xml:space="preserve">
<value>Access denied. Admin role required.</value>
</data>
<data name="usermgmt.badge.you" xml:space="preserve">
<value>You</value>
</data>
<data name="usermgmt.btn.create" xml:space="preserve">
<value>Create user</value>
</data>
<data name="usermgmt.btn.remove" xml:space="preserve">
<value>Remove</value>
</data>
<data name="usermgmt.btn.resetpw" xml:space="preserve">
<value>Reset password</value>
</data>
<data name="usermgmt.btn.setpw" xml:space="preserve">
<value>Set password</value>
</data>
<data name="usermgmt.col.actions" xml:space="preserve">
<value>Actions</value>
</data>
<data name="usermgmt.col.email" xml:space="preserve">
<value>Email</value>
</data>
<data name="usermgmt.col.lastlogin" xml:space="preserve">
<value>Last Login</value>
</data>
<data name="usermgmt.col.role" xml:space="preserve">
<value>Role</value>
</data>
<data name="usermgmt.col.source" xml:space="preserve">
<value>Source</value>
</data>
<data name="usermgmt.col.user" xml:space="preserve">
<value>User</value>
</data>
<data name="usermgmt.create.title" xml:space="preserve">
<value>Create local user</value>
</data>
<data name="usermgmt.empty" xml:space="preserve">
<value>No users provisioned yet.</value>
</data>
<data name="usermgmt.lastlogin.never" xml:space="preserve">
<value>Never</value>
</data>
<data name="usermgmt.lbl.displayname" xml:space="preserve">
<value>Display name</value>
</data>
<data name="usermgmt.lbl.newpassword" xml:space="preserve">
<value>New password</value>
</data>
<data name="usermgmt.lbl.password" xml:space="preserve">
<value>Password</value>
</data>
<data name="usermgmt.msg.created" xml:space="preserve">
<value>Local user {0} created.</value>
</data>
<data name="usermgmt.msg.error" xml:space="preserve">
<value>Error: {0}</value>
</data>
<data name="usermgmt.msg.pwreset" xml:space="preserve">
<value>Password reset for {0}.</value>
</data>
<data name="usermgmt.msg.removed" xml:space="preserve">
<value>User {0} removed.</value>
</data>
<data name="usermgmt.msg.roleupdated" xml:space="preserve">
<value>Role updated for {0}.</value>
</data>
<data name="usermgmt.reset.title" xml:space="preserve">
<value>Reset password — {0}</value>
</data>
<data name="usermgmt.source.entra" xml:space="preserve">
<value>Entra</value>
</data>
<data name="usermgmt.source.local" xml:space="preserve">
<value>Local</value>
</data>
<data name="usermgmt.subtitle" xml:space="preserve">
<value>Manage technician accounts and roles. Entra users are auto-provisioned on first OIDC login; local users are created here.</value>
</data>
<data name="usermgmt.title" xml:space="preserve">
<value>User Management</value>
</data>
<data name="versions.btn.cleaning" xml:space="preserve">
<value>Cleaning…</value>
</data>
<data name="versions.btn.loadLibs" xml:space="preserve">
<value>Load Libraries</value>
</data>
<data name="versions.btn.loading" xml:space="preserve">
<value>Loading…</value>
</data>
<data name="versions.chk.keepFirstShort" xml:space="preserve">
<value>Keep first version</value>
</data>
<data name="versions.lbl.keepLastN" xml:space="preserve">
<value>Keep last N versions</value>
</data>
<data name="versions.lbl.libsNoneAll" xml:space="preserve">
<value>Libraries (none = all)</value>
</data>
<data name="versions.page.title" xml:space="preserve">
<value>Version Cleanup</value>
</data>
<data name="writeguard.readonly.after" xml:space="preserve">
<value>access (Tech-N0). Contact an Admin to request write access.</value>
</data>
<data name="writeguard.readonly.before" xml:space="preserve">
<value>You have</value>
</data>
<data name="writeguard.readonly.emphasis" xml:space="preserve">
<value>read-only</value>
</data>
<!-- HelpTip explanations: plain-language hints for SharePoint jargon -->
<data name="sitepicker.help.site" xml:space="preserve"><value>A SharePoint site is a container (with its own address) that holds document libraries, lists and permissions — for example a team or project workspace.</value></data>
<data name="help.library" xml:space="preserve"><value>A document library is a SharePoint container for storing files, with version history, metadata and its own permissions — like a smart shared folder.</value></data>
<data name="help.inheritedPerms" xml:space="preserve"><value>Inherited permissions are passed down automatically from the parent site or folder. Include them to see access users get indirectly, not just access set directly here.</value></data>
<data name="help.subsites" xml:space="preserve"><value>Subsites are sites nested under the selected site. Enable to include them in the operation as well.</value></data>
<data name="help.permissionLevel" xml:space="preserve"><value>A permission level is a named bundle of rights (e.g. Full Control, Edit, Read) that defines what a user is allowed to do.</value></data>
<data name="help.grantedThrough" xml:space="preserve"><value>Shows how the access was obtained: granted directly to the user, or via a SharePoint or Microsoft 365 group they belong to.</value></data>
<data name="help.hiddenLibs" xml:space="preserve"><value>Hidden/system libraries are used internally by SharePoint and don't appear in normal navigation. Include them for a complete storage picture.</value></data>
<data name="help.recycleBin" xml:space="preserve"><value>The recycle bin holds deleted items temporarily before final removal. Their size still counts against storage until purged.</value></data>
<data name="help.versionStorage" xml:space="preserve"><value>Space used by older saved versions of files. SharePoint keeps a history of each file, and those copies consume storage.</value></data>
<data name="help.keepVersions" xml:space="preserve"><value>How many of the most recent versions of each file to keep. Older versions beyond this number are deleted to free storage.</value></data>
<data name="help.keepFirst" xml:space="preserve"><value>Also preserve the very first (original) version of each file — useful for audit trails — even when deleting other old versions.</value></data>
<data name="help.spGroup" xml:space="preserve"><value>A SharePoint group is a named collection of users that permissions are assigned to (e.g. Site Owners, Members, Visitors).</value></data>
<data name="help.spRole" xml:space="preserve"><value>The role / permission level given to the user in the group: Owner (full control), Member (edit) or Visitor (read).</value></data>
<data name="help.adminUrl" xml:space="preserve"><value>The SharePoint admin center URL (e.g. https://contoso-admin.sharepoint.com). Required to create or manage sites across the whole tenant.</value></data>
<data name="help.siteType" xml:space="preserve"><value>The site template: a Team site for group collaboration, or a Communication site for broadcasting content to many readers.</value></data>
<data name="help.siteAlias" xml:space="preserve"><value>The short, URL-friendly name for the site, used in its address (e.g. 'marketing' in /sites/marketing) and its Microsoft 365 group.</value></data>
<data name="help.regex" xml:space="preserve"><value>A regular expression: an advanced pattern for matching file names (e.g. ^Invoice.*\.pdf$). Leave blank to match everything.</value></data>
<data name="help.guests" xml:space="preserve"><value>Guests are external users from outside your organization who have been granted access. Enable to include them.</value></data>
<data name="help.accessType" xml:space="preserve"><value>How the user reaches the item: through direct permissions, group membership, or inherited from a parent.</value></data>
<data name="help.upn" xml:space="preserve"><value>User Principal Name — the unique sign-in identifier for the user in Entra ID (Azure AD), usually in email format.</value></data>
<data name="help.userType" xml:space="preserve"><value>Member = an account inside your organization; Guest = an external user invited from another organization.</value></data>
<data name="help.templateCapture" xml:space="preserve"><value>Capturing saves a site's structure (libraries, folders, permission groups) as a reusable template you can later apply to create new sites.</value></data>
<data name="help.permissionGroups" xml:space="preserve"><value>The site's permission groups (Owners, Members, Visitors) and their members, so the same access setup can be recreated.</value></data>
<data name="nav.scheduledReports" xml:space="preserve"><value>Scheduled Reports</value></data>
<data name="nav.reports" xml:space="preserve"><value>Reports</value></data>
</root>