From 0b0d8ac82ab15f3e9bbc1d14e5560c6dd192626a Mon Sep 17 00:00:00 2001
From: TheStreamCode
Date: Tue, 22 Sep 2026 19:59:54 +0200
Subject: [PATCH 1/3] feat(i18n): standard textdomain loading, POT template,
SPDX alignment
Wire load_plugin_textdomain('mikesoft-teamvault') on init so WordPress.org
language packs in languages/ are picked up; keep the bundled it/fr/es/de
runtime maps as fallback. Ship languages/mikesoft-teamvault.pot (309 strings)
with regeneration notes and GlotPress handoff in docs/developer/i18n.md.
Align SPDX license strings to GPL-2.0-or-later (plugin header, readme.txt,
README badges/license text); LICENSE text untouched per its no-modification
clause.
---
README.de.md | 2 +-
README.es.md | 2 +-
README.fr.md | 2 +-
README.it.md | 2 +-
README.md | 5 +-
docs/developer/i18n.md | 47 ++
includes/class-mstv-i18n.php | 9 +
languages/mikesoft-teamvault.pot | 1253 ++++++++++++++++++++++++++++++
mikesoft-teamvault.php | 2 +-
readme.txt | 2 +-
10 files changed, 1318 insertions(+), 8 deletions(-)
create mode 100644 docs/developer/i18n.md
create mode 100644 languages/mikesoft-teamvault.pot
diff --git a/README.de.md b/README.de.md
index a531b2b..bb97e11 100644
--- a/README.de.md
+++ b/README.de.md
@@ -4,7 +4,7 @@
[](https://wordpress.org/plugins/mikesoft-teamvault/)
[](https://wordpress.org/plugins/mikesoft-teamvault/)
[](https://www.php.net/)
-[](LICENSE)
+[](LICENSE)
[](https://github.com/sponsors/TheStreamCode)
[English](README.md) · [Italiano](README.it.md) · [Français](README.fr.md) · [Español](README.es.md) · **Deutsch**
diff --git a/README.es.md b/README.es.md
index dc84da6..a39ebe5 100644
--- a/README.es.md
+++ b/README.es.md
@@ -4,7 +4,7 @@
[](https://wordpress.org/plugins/mikesoft-teamvault/)
[](https://wordpress.org/plugins/mikesoft-teamvault/)
[](https://www.php.net/)
-[](LICENSE)
+[](LICENSE)
[](https://github.com/sponsors/TheStreamCode)
[English](README.md) · [Italiano](README.it.md) · [Français](README.fr.md) · **Español** · [Deutsch](README.de.md)
diff --git a/README.fr.md b/README.fr.md
index ee0e873..6066dd9 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -4,7 +4,7 @@
[](https://wordpress.org/plugins/mikesoft-teamvault/)
[](https://wordpress.org/plugins/mikesoft-teamvault/)
[](https://www.php.net/)
-[](LICENSE)
+[](LICENSE)
[](https://github.com/sponsors/TheStreamCode)
[English](README.md) · [Italiano](README.it.md) · **Français** · [Español](README.es.md) · [Deutsch](README.de.md)
diff --git a/README.it.md b/README.it.md
index 09b379d..ad6af82 100644
--- a/README.it.md
+++ b/README.it.md
@@ -4,7 +4,7 @@
[](https://wordpress.org/plugins/mikesoft-teamvault/)
[](https://wordpress.org/plugins/mikesoft-teamvault/)
[](https://www.php.net/)
-[](LICENSE)
+[](LICENSE)
[](https://github.com/sponsors/TheStreamCode)
[English](README.md) · **Italiano** · [Français](README.fr.md) · [Español](README.es.md) · [Deutsch](README.de.md)
diff --git a/README.md b/README.md
index e0a94cd..4706730 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,7 @@
-
+
English · Italiano · Français · Español · Deutsch
@@ -227,10 +227,11 @@ These assets serve different surfaces and should stay aligned to the same brand
## Documentation Map
- [`docs/developer/hooks.md`](docs/developer/hooks.md) - developer hooks and filters
+- [`docs/developer/i18n.md`](docs/developer/i18n.md) - translation workflow (textdomain, POT, GlotPress handoff)
- [`docs/maintainer/local-development.md`](docs/maintainer/local-development.md) - local development workflow
- [`docs/maintainer/release.md`](docs/maintainer/release.md) - WordPress.org release process
- [`docs/maintainer/security-review.md`](docs/maintainer/security-review.md) - latest repository security review and residual risks
## License
-This project is licensed under the [GNU General Public License v2.0](LICENSE), or (at your option) any later version.
+This project is licensed under `GPL-2.0-or-later` — the [GNU General Public License v2.0](LICENSE), or (at your option) any later version.
diff --git a/docs/developer/i18n.md b/docs/developer/i18n.md
new file mode 100644
index 0000000..ec4f546
--- /dev/null
+++ b/docs/developer/i18n.md
@@ -0,0 +1,47 @@
+# Internationalization (i18n)
+
+TeamVault follows the standard WordPress.org translation workflow so
+translators can collaborate in GlotPress instead of editing PHP.
+
+## How it works
+
+- All user-facing strings use the `mikesoft-teamvault` text domain
+ (`__()`, `esc_html__()`, `esc_attr__()`, `esc_html_e()` …).
+- `MSTV_I18n::init()` (runs on `init` via `MSTV_Bootstrap::init_services()`)
+ loads community language packs with the standard call:
+
+ ```php
+ load_plugin_textdomain('mikesoft-teamvault', false, dirname(plugin_basename(__FILE__), 2) . '/languages');
+ ```
+
+ (`__FILE__` is `includes/class-mstv-i18n.php`, hence dirname level 2.)
+- `languages/mikesoft-teamvault.pot` is the translatable-string template
+ shipped for GlotPress import.
+- The hardcoded it/fr/es/de maps in `includes/class-mstv-i18n.php` stay as a
+ **runtime fallback** (via the `gettext` filter) so the bundled interface
+ languages keep working when no language pack is installed. They are not the
+ translation source of truth — GlotPress is.
+
+## Regenerating the POT
+
+Preferred (requires wp-cli):
+
+```sh
+wp i18n make-pot . languages/mikesoft-teamvault.pot --domain=mikesoft-teamvault
+```
+
+The committed POT was produced with an equivalent extractor (same function
+set and `mikesoft-teamvault` domain filter, `#: file:line` references,
+`Plural-Forms: nplurals=2; plural=(n != 1);`) because wp-cli was unavailable;
+re-running `wp i18n make-pot` is welcome to normalize it.
+
+## GlotPress handoff
+
+1. Import the updated `.pot` into the
+ [WordPress.org plugin GlotPress project](https://translate.wordpress.org/projects/wp-plugins/mikesoft-teamvault/)
+ on release.
+2. Approved translations ship automatically as WordPress.org language packs
+ into `wp-content/languages/plugins/` — no bundled `.po`/`.mo` files needed.
+3. Keep the fallback maps in sync only until GlotPress coverage for a locale
+ is complete; the maps must always cover every `mikesoft-teamvault` string
+ (guarded by `tests/PdmI18nCoverageTest.php`).
diff --git a/includes/class-mstv-i18n.php b/includes/class-mstv-i18n.php
index 3069f77..3f2f265 100644
--- a/includes/class-mstv-i18n.php
+++ b/includes/class-mstv-i18n.php
@@ -1263,6 +1263,15 @@ class MSTV_I18n
public function init(): void
{
+ // Standard WordPress.org loading so GlotPress language packs in
+ // languages/ are picked up. Runs on `init` (via MSTV_Bootstrap::init_services).
+ // __FILE__ is includes/class-mstv-i18n.php, hence dirname levels: 2.
+ if (function_exists('load_plugin_textdomain')) {
+ load_plugin_textdomain('mikesoft-teamvault', false, dirname(plugin_basename(__FILE__), 2) . '/languages');
+ }
+
+ // Runtime fallback: in-admin maps below keep the bundled it/fr/es/de
+ // interface working when no language pack is installed (see docs/developer/i18n.md).
add_filter('gettext', [$this, 'filter_gettext'], 20, 3);
}
diff --git a/languages/mikesoft-teamvault.pot b/languages/mikesoft-teamvault.pot
new file mode 100644
index 0000000..1ceb342
--- /dev/null
+++ b/languages/mikesoft-teamvault.pot
@@ -0,0 +1,1253 @@
+# Copyright (C) 2026 Mikesoft
+# This file is distributed under the same license as the Mikesoft TeamVault plugin.
+# SPDX-License-Identifier: GPL-2.0-or-later
+msgid ""
+msgstr ""
+"Project-Id-Version: Mikesoft TeamVault 3.2.6\n"
+"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/mikesoft-teamvault\n"
+"POT-Creation-Date: 2026-09-22T17:57:48Z\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: wp i18n make-pot equivalent (documented in docs/developer/i18n.md)\n"
+"X-Domain: mikesoft-teamvault\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: includes/class-mstv-assets.php:93
+msgid "\"{fileName}\" ({fileSize}) exceeds the maximum allowed size of {maxSize}."
+msgstr ""
+
+#: includes/class-mstv-notifications.php:121
+msgid "[%1$s] TeamVault: %2$d %3$s event(s)"
+msgstr ""
+
+#: includes/class-mstv-storage.php:432 includes/class-mstv-storage.php:505
+msgid "A folder with this name already exists."
+msgstr ""
+
+#: includes/class-mstv-assets.php:236
+msgid "Access denied"
+msgstr ""
+
+#: includes/class-mstv-notifications.php:146
+msgid "access denied"
+msgstr ""
+
+#: includes/class-mstv-notifications.php:83
+msgid "Access denied for %1$s (action: %2$s, folder: %3$s)"
+msgstr ""
+
+#: includes/class-mstv-download.php:32 includes/class-mstv-download.php:52 includes/class-mstv-download.php:71 includes/class-mstv-export.php:126 includes/class-mstv-export.php:155 includes/class-mstv-export.php:42 includes/class-mstv-preview.php:35 includes/class-mstv-preview.php:55 includes/class-mstv-preview.php:74
+msgid "Access denied."
+msgstr ""
+
+#: admin/views/reports-page.php:9
+msgid "Access reports"
+msgstr ""
+
+#: admin/views/logs-page.php:91 admin/views/reports-page.php:34
+msgid "Action"
+msgstr ""
+
+#: admin/views/logs-page.php:43 includes/class-mstv-admin.php:165 includes/class-mstv-admin.php:166
+msgid "Activity Log"
+msgstr ""
+
+#: includes/class-mstv-assets.php:202
+msgid "Add"
+msgstr ""
+
+#: includes/class-mstv-settings.php:246
+msgid "Add your current account to the whitelist before enabling it, otherwise you will lock yourself out."
+msgstr ""
+
+#: includes/class-mstv-helpers.php:183
+msgid "ago"
+msgstr ""
+
+#: includes/class-mstv-assets.php:233
+msgid "All administrators"
+msgstr ""
+
+#: admin/views/settings-page.php:172
+msgid "Allowed extensions"
+msgstr ""
+
+#: includes/class-mstv-assets.php:155
+msgid "An error occurred. Please try again."
+msgstr ""
+
+#: admin/views/logs-page.php:67 admin/views/reports-page.php:41
+msgid "Apply"
+msgstr ""
+
+#: admin/views/reports-page.php:46
+msgid "Apply a filter to see the report."
+msgstr ""
+
+#: includes/class-mstv-assets.php:88
+msgid "Are you sure you want to delete this folder? It must be empty."
+msgstr ""
+
+#: includes/class-mstv-assets.php:87
+msgid "Are you sure you want to delete this item?"
+msgstr ""
+
+#: includes/class-mstv-assets.php:136
+msgid "Ascending"
+msgstr ""
+
+#: admin/views/settings-page.php:323
+msgid "Authorized roles:"
+msgstr ""
+
+#: admin/views/settings-page.php:133
+msgid "Authorized users"
+msgstr ""
+
+#: admin/views/settings-page.php:105
+msgid "Automatic (match WordPress language)"
+msgstr ""
+
+#: includes/class-mstv-assets.php:122
+msgid "Availability"
+msgstr ""
+
+#: includes/class-mstv-assets.php:169
+msgid "Available"
+msgstr ""
+
+#: admin/views/file-manager-page.php:164 includes/class-mstv-assets.php:106
+msgid "Browse files"
+msgstr ""
+
+#: includes/class-mstv-assets.php:116
+msgid "Cancel"
+msgstr ""
+
+#: includes/class-mstv-assets.php:170
+msgid "Capacity"
+msgstr ""
+
+#: includes/class-mstv-assets.php:181
+msgid "Choose one or more folders to include in the ZIP archive."
+msgstr ""
+
+#: admin/views/settings-page.php:103
+msgid "Choose the plugin interface language. Automatic follows the WordPress language."
+msgstr ""
+
+#: admin/views/settings-page.php:263
+msgid "Clean orphaned records"
+msgstr ""
+
+#: admin/views/settings-page.php:48
+msgid "Cleanup completed. Removed %d orphaned file records."
+msgstr ""
+
+#: admin/views/file-manager-page.php:174 admin/views/file-manager-page.php:190 includes/class-mstv-assets.php:118
+msgid "Close"
+msgstr ""
+
+#: includes/class-mstv-assets.php:149
+msgid "Collapse"
+msgstr ""
+
+#: admin/views/settings-page.php:174
+msgid "Comma-separated list of allowed file extensions for upload."
+msgstr ""
+
+#: admin/views/settings-page.php:89
+msgid "Configure the plugin options for private document management."
+msgstr ""
+
+#: includes/class-mstv-assets.php:117
+msgid "Confirm"
+msgstr ""
+
+#: includes/class-mstv-assets.php:146
+msgid "Contains subfolders"
+msgstr ""
+
+#: admin/views/logs-page.php:14
+msgid "Create"
+msgstr ""
+
+#: includes/class-mstv-assets.php:179
+msgid "Create a ZIP archive with the full private document library."
+msgstr ""
+
+#: includes/class-mstv-assets.php:123
+msgid "Created"
+msgstr ""
+
+#: admin/views/settings-page.php:190
+msgid "Current:"
+msgstr ""
+
+#: includes/class-mstv-assets.php:189
+msgid "Custom permissions"
+msgstr ""
+
+#: admin/views/file-manager-page.php:69 admin/views/file-manager-page.php:86 includes/class-mstv-assets.php:134
+msgid "Date"
+msgstr ""
+
+#: admin/views/logs-page.php:89
+msgid "Date/Time"
+msgstr ""
+
+#: admin/views/logs-page.php:11 includes/class-mstv-assets.php:112 includes/class-mstv-assets.php:198
+msgid "Delete"
+msgstr ""
+
+#: includes/class-mstv-notifications.php:144
+msgid "delete"
+msgstr ""
+
+#: admin/views/settings-page.php:292
+msgid "Delete all data on uninstall"
+msgstr ""
+
+#: includes/class-mstv-assets.php:218
+msgid "Delete this group? Members and its folder permissions will be removed."
+msgstr ""
+
+#: includes/class-mstv-notifications.php:72
+msgid "Deleted: %s"
+msgstr ""
+
+#: includes/class-mstv-assets.php:137
+msgid "Descending"
+msgstr ""
+
+#: includes/class-mstv-assets.php:213
+msgid "Description"
+msgstr ""
+
+#: admin/views/logs-page.php:93
+msgid "Details"
+msgstr ""
+
+#: admin/views/logs-page.php:82
+msgid "Document operations will be recorded here."
+msgstr ""
+
+#: admin/views/file-manager-page.php:201 admin/views/logs-page.php:10 admin/views/reports-page.php:38 includes/class-mstv-assets.php:113 includes/class-mstv-assets.php:197
+msgid "Download"
+msgstr ""
+
+#: includes/class-mstv-notifications.php:142
+msgid "download"
+msgstr ""
+
+#: includes/class-mstv-notifications.php:62
+msgid "Downloaded: %s"
+msgstr ""
+
+#: admin/views/file-manager-page.php:162 includes/class-mstv-assets.php:104
+msgid "Drag files here to upload them"
+msgstr ""
+
+#: includes/class-mstv-assets.php:215
+msgid "Edit group"
+msgstr ""
+
+#: admin/views/notifications-page.php:9
+msgid "Email notifications"
+msgstr ""
+
+#: admin/views/settings-page.php:238
+msgid "Enable activity log"
+msgstr ""
+
+#: includes/class-mstv-assets.php:230
+msgid "Enable email notifications"
+msgstr ""
+
+#: admin/views/settings-page.php:220
+msgid "Enable inline PDF preview"
+msgstr ""
+
+#: admin/views/quotas-page.php:18
+msgid "Enable storage quotas"
+msgstr ""
+
+#: admin/views/settings-page.php:106
+msgid "English"
+msgstr ""
+
+#: admin/views/logs-page.php:136 admin/views/logs-page.php:50 admin/views/logs-page.php:52
+msgid "Entries"
+msgstr ""
+
+#: includes/class-mstv-admin.php:428 includes/class-mstv-admin.php:442 includes/class-mstv-admin.php:495 includes/class-mstv-admin.php:581 includes/class-mstv-download.php:114 includes/class-mstv-download.php:133 includes/class-mstv-download.php:33 includes/class-mstv-download.php:42 includes/class-mstv-download.php:53 includes/class-mstv-download.php:64 includes/class-mstv-download.php:72 includes/class-mstv-export.php:110 includes/class-mstv-export.php:127 includes/class-mstv-export.php:135 includes/class-mstv-export.php:145 includes/class-mstv-export.php:156 includes/class-mstv-export.php:181 includes/class-mstv-export.php:196 includes/class-mstv-export.php:424 includes/class-mstv-export.php:43 includes/class-mstv-export.php:434 includes/class-mstv-export.php:453 includes/class-mstv-export.php:51 includes/class-mstv-export.php:61 includes/class-mstv-export.php:86 includes/class-mstv-preview.php:125 includes/class-mstv-preview.php:137 includes/class-mstv-preview.php:156 includes/class-mstv-preview.php:36 includes/class-mstv-preview.php:45 includes/class-mstv-preview.php:56 includes/class-mstv-preview.php:67 includes/class-mstv-preview.php:75 includes/class-mstv-preview.php:89
+msgid "Error"
+msgstr ""
+
+#: includes/class-mstv-assets.php:186
+msgid "Error during export"
+msgstr ""
+
+#: includes/class-mstv-assets.php:103
+msgid "Error while creating the folder."
+msgstr ""
+
+#: includes/class-mstv-export.php:109 includes/class-mstv-export.php:195
+msgid "Error while creating the ZIP file."
+msgstr ""
+
+#: includes/class-mstv-assets.php:95
+msgid "Error while deleting."
+msgstr ""
+
+#: includes/class-mstv-assets.php:99
+msgid "Error while moving the file."
+msgstr ""
+
+#: includes/class-mstv-assets.php:101
+msgid "Error while moving the folder."
+msgstr ""
+
+#: includes/class-mstv-assets.php:97
+msgid "Error while renaming."
+msgstr ""
+
+#: includes/class-mstv-assets.php:90
+msgid "Error while uploading the file."
+msgstr ""
+
+#: includes/class-mstv-assets.php:227 includes/class-mstv-assets.php:231
+msgid "Events"
+msgstr ""
+
+#: includes/class-mstv-assets.php:148
+msgid "Expand"
+msgstr ""
+
+#: admin/views/file-manager-page.php:125 includes/class-mstv-assets.php:176
+msgid "Export"
+msgstr ""
+
+#: includes/class-mstv-assets.php:177
+msgid "Export All"
+msgstr ""
+
+#: includes/class-mstv-assets.php:184
+msgid "Export completed"
+msgstr ""
+
+#: admin/views/reports-page.php:42
+msgid "Export CSV"
+msgstr ""
+
+#: includes/class-mstv-assets.php:178
+msgid "Export Folder"
+msgstr ""
+
+#: includes/class-mstv-assets.php:180
+msgid "Export Selected Folders"
+msgstr ""
+
+#: includes/class-mstv-assets.php:183
+msgid "Exporting..."
+msgstr ""
+
+#: includes/class-mstv-validator.php:222
+msgid "Extension .%1$s is not allowed. Allowed file types: %2$s."
+msgstr ""
+
+#: admin/views/logs-page.php:36 admin/views/reports-page.php:21 includes/class-mstv-assets.php:125
+msgid "File"
+msgstr ""
+
+#: includes/class-mstv-admin.php:111 includes/class-mstv-admin.php:112
+msgid "File Manager"
+msgstr ""
+
+#: includes/class-mstv-assets.php:158
+msgid "File missing from storage"
+msgstr ""
+
+#: includes/class-mstv-assets.php:98
+msgid "File moved successfully."
+msgstr ""
+
+#: includes/class-mstv-download.php:63 includes/class-mstv-preview.php:66
+msgid "File not found in the filesystem."
+msgstr ""
+
+#: includes/class-mstv-admin.php:428 includes/class-mstv-admin.php:442 includes/class-mstv-download.php:41 includes/class-mstv-preview.php:44 includes/class-mstv-rest-controller.php:1051 includes/class-mstv-rest-controller.php:1084 includes/class-mstv-rest-controller.php:1138 includes/class-mstv-storage.php:313 includes/class-mstv-storage.php:366
+msgid "File not found."
+msgstr ""
+
+#: includes/class-mstv-assets.php:89
+msgid "File uploaded successfully."
+msgstr ""
+
+#: admin/views/settings-page.php:168
+msgid "Files"
+msgstr ""
+
+#: includes/class-mstv-assets.php:126
+msgid "files"
+msgstr ""
+
+#: admin/views/file-manager-page.php:60
+msgid "Filter"
+msgstr ""
+
+#: admin/views/logs-page.php:37 admin/views/reports-page.php:22 includes/class-mstv-assets.php:124
+msgid "Folder"
+msgstr ""
+
+#: includes/class-mstv-rest-controller.php:623 includes/class-mstv-storage.php:251
+msgid "Folder already exists."
+msgstr ""
+
+#: includes/class-mstv-assets.php:102
+msgid "Folder created successfully."
+msgstr ""
+
+#: includes/class-mstv-assets.php:100
+msgid "Folder moved successfully."
+msgstr ""
+
+#: includes/class-mstv-export.php:144 includes/class-mstv-rest-controller.php:1184 includes/class-mstv-rest-controller.php:1188 includes/class-mstv-rest-controller.php:1194 includes/class-mstv-rest-controller.php:1198 includes/class-mstv-rest-controller.php:667 includes/class-mstv-rest-controller.php:724 includes/class-mstv-rest-controller.php:769 includes/class-mstv-rest-governance.php:574 includes/class-mstv-storage.php:276 includes/class-mstv-storage.php:403 includes/class-mstv-storage.php:460
+msgid "Folder not found."
+msgstr ""
+
+#: includes/class-mstv-assets.php:190
+msgid "Folder permissions"
+msgstr ""
+
+#: admin/views/file-manager-page.php:44
+msgid "Folders"
+msgstr ""
+
+#: includes/class-mstv-assets.php:127
+msgid "folders"
+msgstr ""
+
+#: includes/class-mstv-validator.php:215
+msgid "For security reasons, .%s files cannot be uploaded."
+msgstr ""
+
+#: admin/views/settings-page.php:254
+msgid "Found %d database records whose files are missing from the private storage directory."
+msgstr ""
+
+#: includes/class-mstv-assets.php:163
+msgid "Free"
+msgstr ""
+
+#: admin/views/settings-page.php:108
+msgid "French"
+msgstr ""
+
+#: admin/views/reports-page.php:26
+msgid "From"
+msgstr ""
+
+#: admin/views/settings-page.php:110
+msgid "German"
+msgstr ""
+
+#: admin/views/notifications-page.php:11
+msgid "Get an email when documents are uploaded, downloaded, or deleted, or when access is denied. Emails are sent to the recipients you choose."
+msgstr ""
+
+#: includes/class-mstv-assets.php:191
+msgid "Grant access to specific users or groups. With no rules, the folder follows the default access (capability and optional whitelist)."
+msgstr ""
+
+#: admin/views/file-manager-page.php:105 includes/class-mstv-assets.php:130
+msgid "Grid view"
+msgstr ""
+
+#: includes/class-mstv-assets.php:194
+msgid "Group"
+msgstr ""
+
+#: admin/views/reports-page.php:18
+msgid "Group by"
+msgstr ""
+
+#: includes/class-mstv-assets.php:219
+msgid "Group deleted."
+msgstr ""
+
+#: includes/class-mstv-assets.php:212
+msgid "Group name"
+msgstr ""
+
+#: includes/class-mstv-rest-governance.php:191 includes/class-mstv-rest-governance.php:239 includes/class-mstv-rest-governance.php:266
+msgid "Group not found."
+msgstr ""
+
+#: includes/class-mstv-assets.php:217
+msgid "Group saved."
+msgstr ""
+
+#: includes/class-mstv-admin.php:129 includes/class-mstv-admin.php:130 includes/class-mstv-assets.php:235
+msgid "Groups"
+msgstr ""
+
+#: includes/class-mstv-assets.php:208
+msgid "Heads up: some folders have rules but the Home (root) folder has none. Any folder without a rule in its parent chain stays accessible to every vault user. Add a rule on Home to restrict the default access."
+msgstr ""
+
+#: admin/views/logs-page.php:44
+msgid "History of operations performed on private documents."
+msgstr ""
+
+#: admin/views/file-manager-page.php:54 includes/class-mstv-assets.php:143
+msgid "Home"
+msgstr ""
+
+#: includes/class-mstv-rest-governance.php:377
+msgid "Home (root)"
+msgstr ""
+
+#: admin/views/settings-page.php:222
+msgid "If enabled, PDFs will be displayed directly in the browser. Some browsers may not support this feature."
+msgstr ""
+
+#: admin/views/settings-page.php:296
+msgid "If enabled, uninstalling the plugin will remove all files, folders, logs and settings. This action is irreversible."
+msgstr ""
+
+#: admin/views/settings-page.php:129
+msgid "If enabled, users still need the plugin capability and must also be present in this list. Include your current account before saving to avoid locking yourself out."
+msgstr ""
+
+#: admin/views/settings-page.php:317
+msgid "Information"
+msgstr ""
+
+#: admin/views/settings-page.php:101 admin/views/settings-page.php:320 admin/views/settings-page.php:97
+msgid "Interface language"
+msgstr ""
+
+#: includes/class-mstv-storage.php:171
+msgid "Invalid destination path."
+msgstr ""
+
+#: includes/class-mstv-validator.php:194
+msgid "Invalid file."
+msgstr ""
+
+#: includes/class-mstv-storage.php:215 includes/class-mstv-storage.php:411
+msgid "Invalid folder name."
+msgstr ""
+
+#: includes/class-mstv-storage.php:236 includes/class-mstv-storage.php:498
+msgid "Invalid folder path."
+msgstr ""
+
+#: includes/class-mstv-admin.php:321 includes/class-mstv-admin.php:387 includes/class-mstv-admin.php:410 includes/class-mstv-admin.php:477 includes/class-mstv-admin.php:500 includes/class-mstv-auth.php:131
+msgid "Invalid security token."
+msgstr ""
+
+#: admin/views/logs-page.php:94
+msgid "IP"
+msgstr ""
+
+#: admin/views/settings-page.php:107
+msgid "Italian"
+msgstr ""
+
+#: includes/class-mstv-assets.php:94
+msgid "Item deleted successfully."
+msgstr ""
+
+#: includes/class-mstv-assets.php:228
+msgid "Last access"
+msgstr ""
+
+#: includes/class-mstv-assets.php:222
+msgid "Limit"
+msgstr ""
+
+#: admin/views/settings-page.php:127
+msgid "Limit access to specific users"
+msgstr ""
+
+#: admin/views/file-manager-page.php:113 includes/class-mstv-assets.php:131
+msgid "List view"
+msgstr ""
+
+#: admin/views/file-manager-page.php:139 admin/views/file-manager-page.php:26 admin/views/groups-page.php:23 admin/views/notifications-page.php:19 admin/views/quotas-page.php:24 includes/class-mstv-assets.php:154
+msgid "Loading..."
+msgstr ""
+
+#: admin/views/settings-page.php:227
+msgid "Log"
+msgstr ""
+
+#: admin/views/settings-page.php:245
+msgid "Maintenance"
+msgstr ""
+
+#: includes/class-mstv-assets.php:199
+msgid "Manage"
+msgstr ""
+
+#: admin/views/settings-page.php:185
+msgid "Maximum file size (bytes)"
+msgstr ""
+
+#: admin/views/settings-page.php:188
+msgid "Maximum size allowed for each file."
+msgstr ""
+
+#: includes/class-mstv-assets.php:211
+msgid "members"
+msgstr ""
+
+#: includes/class-mstv-assets.php:128
+msgid "Missing"
+msgstr ""
+
+#: includes/class-mstv-assets.php:160
+msgid "Missing from storage"
+msgstr ""
+
+#: includes/class-mstv-auth.php:123
+msgid "Missing security token."
+msgstr ""
+
+#: admin/views/logs-page.php:13 includes/class-mstv-assets.php:115
+msgid "Move"
+msgstr ""
+
+#: includes/class-mstv-assets.php:152
+msgid "Move to..."
+msgstr ""
+
+#: admin/views/file-manager-page.php:68 admin/views/file-manager-page.php:85 includes/class-mstv-assets.php:119 includes/class-mstv-assets.php:133
+msgid "Name"
+msgstr ""
+
+#: admin/views/file-manager-page.php:14 includes/class-mstv-assets.php:110 includes/class-mstv-assets.php:151
+msgid "New folder"
+msgstr ""
+
+#: admin/views/groups-page.php:16 includes/class-mstv-assets.php:214
+msgid "New group"
+msgstr ""
+
+#: admin/views/logs-page.php:153 admin/views/logs-page.php:156 includes/class-mstv-assets.php:139
+msgid "Next"
+msgstr ""
+
+#: includes/class-mstv-assets.php:200
+msgid "No explicit rules. Default access applies."
+msgstr ""
+
+#: includes/class-mstv-rest-controller.php:911 includes/class-mstv-validator.php:374
+msgid "No file uploaded."
+msgstr ""
+
+#: includes/class-mstv-assets.php:185
+msgid "No folders available for selective export."
+msgstr ""
+
+#: includes/class-mstv-export.php:60
+msgid "No folders selected for export."
+msgstr ""
+
+#: includes/class-mstv-assets.php:201
+msgid "No groups available"
+msgstr ""
+
+#: includes/class-mstv-assets.php:210
+msgid "No groups yet. Create one to organize document access."
+msgstr ""
+
+#: admin/views/logs-page.php:81
+msgid "No logs available"
+msgstr ""
+
+#: includes/class-mstv-assets.php:221
+msgid "No quotas set. All users have unlimited storage."
+msgstr ""
+
+#: includes/class-mstv-assets.php:156
+msgid "No results found"
+msgstr ""
+
+#: includes/class-mstv-assets.php:147
+msgid "No subfolders"
+msgstr ""
+
+#: admin/views/settings-page.php:162 includes/class-mstv-assets.php:172
+msgid "No users selected"
+msgstr ""
+
+#: includes/class-mstv-assets.php:238
+msgid "Notification settings saved."
+msgstr ""
+
+#: includes/class-mstv-admin.php:147 includes/class-mstv-admin.php:148
+msgid "Notifications"
+msgstr ""
+
+#: admin/views/logs-page.php:136 admin/views/logs-page.php:148 admin/views/logs-page.php:50 includes/class-mstv-assets.php:141
+msgid "of"
+msgstr ""
+
+#: includes/class-mstv-assets.php:144
+msgid "Open"
+msgstr ""
+
+#: admin/views/file-manager-page.php:163 includes/class-mstv-assets.php:105
+msgid "or"
+msgstr ""
+
+#: admin/views/file-manager-page.php:89
+msgid "Order"
+msgstr ""
+
+#: admin/views/groups-page.php:11
+msgid "Organize users into departments or teams, then grant folder access to a whole group at once."
+msgstr ""
+
+#: admin/views/settings-page.php:248
+msgid "Orphaned file records"
+msgstr ""
+
+#: includes/class-mstv-assets.php:168
+msgid "Other usage"
+msgstr ""
+
+#: admin/views/logs-page.php:148 includes/class-mstv-assets.php:140
+msgid "Page"
+msgstr ""
+
+#: includes/class-mstv-storage.php:225 includes/class-mstv-storage.php:478
+msgid "Parent folder not found."
+msgstr ""
+
+#: admin/views/file-manager-page.php:96 admin/views/logs-page.php:59
+msgid "Per page"
+msgstr ""
+
+#: includes/class-mstv-assets.php:188
+msgid "Permissions"
+msgstr ""
+
+#: includes/class-mstv-assets.php:206
+msgid "Permissions updated."
+msgstr ""
+
+#: admin/views/settings-page.php:319
+msgid "Plugin version:"
+msgstr ""
+
+#: admin/views/file-manager-page.php:187 admin/views/reports-page.php:37 admin/views/settings-page.php:209 includes/class-mstv-assets.php:114
+msgid "Preview"
+msgstr ""
+
+#: admin/views/reports-page.php:36
+msgid "Preview and download"
+msgstr ""
+
+#: includes/class-mstv-preview.php:136 includes/class-mstv-preview.php:88
+msgid "Preview is not available for this file type."
+msgstr ""
+
+#: admin/views/logs-page.php:141 admin/views/logs-page.php:144 includes/class-mstv-assets.php:138
+msgid "Previous"
+msgstr ""
+
+#: includes/class-mstv-admin.php:138 includes/class-mstv-admin.php:139
+msgid "Quotas"
+msgstr ""
+
+#: includes/class-mstv-assets.php:225
+msgid "Quotas updated."
+msgstr ""
+
+#: includes/class-mstv-assets.php:232
+msgid "Recipients"
+msgstr ""
+
+#: admin/views/settings-page.php:240
+msgid "Record upload, download, delete and move operations for files."
+msgstr ""
+
+#: admin/views/settings-page.php:62
+msgid "Reindex completed. Restored %1$d folders and %2$d files from storage."
+msgstr ""
+
+#: admin/views/settings-page.php:269 admin/views/settings-page.php:274
+msgid "Reindex storage"
+msgstr ""
+
+#: admin/views/settings-page.php:152 includes/class-mstv-assets.php:175
+msgid "Remove"
+msgstr ""
+
+#: includes/class-mstv-assets.php:204
+msgid "Remove all permission rules for this folder?"
+msgstr ""
+
+#: admin/views/logs-page.php:12 includes/class-mstv-assets.php:111
+msgid "Rename"
+msgstr ""
+
+#: includes/class-mstv-assets.php:96
+msgid "Renamed successfully."
+msgstr ""
+
+#: includes/class-mstv-admin.php:156 includes/class-mstv-admin.php:157
+msgid "Reports"
+msgstr ""
+
+#: admin/views/settings-page.php:322
+msgid "Required capability:"
+msgstr ""
+
+#: includes/class-mstv-assets.php:203
+msgid "Reset"
+msgstr ""
+
+#: admin/views/settings-page.php:270
+msgid "Restore folder and file records that still exist on disk but are missing from the database."
+msgstr ""
+
+#: includes/class-mstv-assets.php:142
+msgid "results"
+msgstr ""
+
+#: includes/class-mstv-assets.php:237
+msgid "Save notifications"
+msgstr ""
+
+#: includes/class-mstv-assets.php:205
+msgid "Save permissions"
+msgstr ""
+
+#: includes/class-mstv-assets.php:224
+msgid "Save quotas"
+msgstr ""
+
+#: admin/views/settings-page.php:302
+msgid "Save Settings"
+msgstr ""
+
+#: admin/views/file-manager-page.php:21 includes/class-mstv-assets.php:109
+msgid "Search files..."
+msgstr ""
+
+#: admin/views/settings-page.php:140 includes/class-mstv-assets.php:171
+msgid "Search users..."
+msgstr ""
+
+#: admin/views/reports-page.php:11
+msgid "See who viewed or downloaded documents, grouped by user, file, or folder. Export the full activity log to CSV for compliance."
+msgstr ""
+
+#: admin/views/file-manager-page.php:150 includes/class-mstv-assets.php:150
+msgid "Select a file or folder to view details"
+msgstr ""
+
+#: includes/class-mstv-settings.php:239
+msgid "Select at least one authorized user before enabling the whitelist."
+msgstr ""
+
+#: includes/class-mstv-assets.php:182
+msgid "Select at least one folder to export."
+msgstr ""
+
+#: includes/class-mstv-assets.php:153
+msgid "Select destination"
+msgstr ""
+
+#: includes/class-mstv-assets.php:129
+msgid "selected"
+msgstr ""
+
+#: admin/views/settings-page.php:193
+msgid "Server limit:"
+msgstr ""
+
+#: admin/views/quotas-page.php:11
+msgid "Set per-user or per-group upload limits on your own storage. Uploads that would exceed a limit are blocked; existing files stay accessible. Administrators are never limited."
+msgstr ""
+
+#: includes/class-mstv-admin.php:120 includes/class-mstv-admin.php:121
+msgid "Settings"
+msgstr ""
+
+#: admin/views/settings-page.php:32
+msgid "Settings saved successfully."
+msgstr ""
+
+#: admin/views/file-manager-page.php:70 admin/views/file-manager-page.php:87 includes/class-mstv-assets.php:120 includes/class-mstv-assets.php:135
+msgid "Size"
+msgstr ""
+
+#: admin/views/settings-page.php:72
+msgid "Skipped %d unsafe or disallowed files."
+msgstr ""
+
+#: includes/class-mstv-assets.php:132
+msgid "Sort by"
+msgstr ""
+
+#: admin/views/settings-page.php:109
+msgid "Spanish"
+msgstr ""
+
+#: includes/class-mstv-assets.php:234
+msgid "Specific users"
+msgstr ""
+
+#: includes/class-mstv-admin.php:47
+msgid "Sponsor"
+msgstr ""
+
+#: admin/views/settings-page.php:327
+msgid "Sponsor TeamVault on GitHub"
+msgstr ""
+
+#: includes/class-mstv-assets.php:145
+msgid "Status"
+msgstr ""
+
+#: admin/views/file-manager-page.php:30 includes/class-mstv-assets.php:161 includes/class-mstv-assets.php:165
+msgid "Storage"
+msgstr ""
+
+#: admin/views/settings-page.php:321
+msgid "Storage directory:"
+msgstr ""
+
+#: admin/views/quotas-page.php:9
+msgid "Storage quotas"
+msgstr ""
+
+#: admin/views/settings-page.php:325
+msgid "Support the project:"
+msgstr ""
+
+#: includes/class-mstv-assets.php:166
+msgid "TeamVault"
+msgstr ""
+
+#: admin/views/groups-page.php:9
+msgid "TeamVault Groups"
+msgstr ""
+
+#: admin/views/settings-page.php:329
+msgid "TeamVault is free and all governance features are included at no cost. Sponsorships keep development going."
+msgstr ""
+
+#: admin/views/settings-page.php:88
+msgid "TeamVault Settings"
+msgstr ""
+
+#: includes/class-mstv-admin.php:65
+msgid "TeamVault stores private files under WordPress uploads. Confirm your web server blocks direct access to the private-documents directory, especially on Nginx."
+msgstr ""
+
+#: includes/class-mstv-validator.php:375
+msgid "Temporary folder is missing."
+msgstr ""
+
+#: includes/class-mstv-validator.php:308
+msgid "The file contains PHP code."
+msgstr ""
+
+#: includes/class-mstv-validator.php:312
+msgid "The file contains PHP scripts."
+msgstr ""
+
+#: includes/class-mstv-validator.php:284 includes/class-mstv-validator.php:292 includes/class-mstv-validator.php:301
+msgid "The file contains potentially dangerous content."
+msgstr ""
+
+#: includes/class-mstv-rest-controller.php:906
+msgid "The file exceeds the maximum allowed size (%s). Please upload a smaller file."
+msgstr ""
+
+#: includes/class-mstv-validator.php:372
+msgid "The file exceeds the maximum size configured in the form."
+msgstr ""
+
+#: includes/class-mstv-validator.php:371
+msgid "The file exceeds the maximum size configured on the server."
+msgstr ""
+
+#: includes/class-mstv-validator.php:211
+msgid "The file has no extension, so its type cannot be verified. Add a valid extension and try again."
+msgstr ""
+
+#: includes/class-mstv-storage.php:376
+msgid "The file is already in the destination folder."
+msgstr ""
+
+#: includes/class-mstv-validator.php:233
+msgid "The file is too large (%1$s). The maximum allowed size is %2$s."
+msgstr ""
+
+#: includes/class-mstv-rest-controller.php:959 includes/class-mstv-validator.php:146
+msgid "The file name cannot be empty."
+msgstr ""
+
+#: includes/class-mstv-validator.php:156
+msgid "The file name contains invalid characters."
+msgstr ""
+
+#: includes/class-mstv-validator.php:206
+msgid "The file name contains multiple extensions, which is not allowed for security reasons."
+msgstr ""
+
+#: includes/class-mstv-validator.php:150
+msgid "The file name is too long (maximum 255 characters)."
+msgstr ""
+
+#: includes/class-mstv-validator.php:373
+msgid "The file was only partially uploaded."
+msgstr ""
+
+#: includes/class-mstv-storage.php:292
+msgid "The folder contains files. Delete the files first."
+msgstr ""
+
+#: includes/class-mstv-storage.php:284
+msgid "The folder contains subfolders. Delete the subfolders first."
+msgstr ""
+
+#: includes/class-mstv-storage.php:468
+msgid "The folder is already in the destination folder."
+msgstr ""
+
+#: includes/class-mstv-validator.php:111
+msgid "The folder name cannot be empty."
+msgstr ""
+
+#: includes/class-mstv-validator.php:121
+msgid "The folder name contains invalid characters."
+msgstr ""
+
+#: includes/class-mstv-validator.php:115
+msgid "The folder name is too long (maximum 255 characters)."
+msgstr ""
+
+#: includes/class-mstv-assets.php:216 includes/class-mstv-rest-governance.php:154 includes/class-mstv-rest-governance.php:201
+msgid "The group name cannot be empty."
+msgstr ""
+
+#: includes/class-mstv-rest-controller.php:1059
+msgid "The name cannot be empty."
+msgstr ""
+
+#: includes/class-mstv-storage.php:425
+msgid "The new name is identical to the current name."
+msgstr ""
+
+#: includes/class-mstv-validator.php:248 includes/class-mstv-validator.php:250
+msgid "This file type is not allowed."
+msgstr ""
+
+#: includes/class-mstv-assets.php:107
+msgid "This folder is empty"
+msgstr ""
+
+#: includes/class-mstv-validator.php:130 includes/class-mstv-validator.php:165
+msgid "This name is reserved by the system."
+msgstr ""
+
+#: includes/class-mstv-assets.php:159
+msgid "This record exists in the database, but the binary file is missing from the private storage directory."
+msgstr ""
+
+#: includes/class-mstv-assets.php:207
+msgid "This user or group is already in the list."
+msgstr ""
+
+#: admin/views/reports-page.php:30
+msgid "To"
+msgstr ""
+
+#: includes/class-mstv-assets.php:164
+msgid "Total"
+msgstr ""
+
+#: includes/class-mstv-assets.php:157
+msgid "Try a different keyword or clear the search."
+msgstr ""
+
+#: admin/views/logs-page.php:92 includes/class-mstv-assets.php:121
+msgid "Type"
+msgstr ""
+
+#: includes/class-mstv-storage.php:259
+msgid "Unable to create the folder."
+msgstr ""
+
+#: includes/class-mstv-export.php:180 includes/class-mstv-export.php:85
+msgid "Unable to create the ZIP file."
+msgstr ""
+
+#: includes/class-mstv-storage.php:321 includes/class-mstv-storage.php:329
+msgid "Unable to delete the files from the filesystem."
+msgstr ""
+
+#: includes/class-mstv-storage.php:300
+msgid "Unable to delete the folder from the filesystem."
+msgstr ""
+
+#: includes/class-mstv-rest-controller.php:916 includes/class-mstv-storage.php:157 includes/class-mstv-storage.php:206 includes/class-mstv-storage.php:83
+msgid "Unable to initialize the storage directory."
+msgstr ""
+
+#: includes/class-mstv-storage.php:384
+msgid "Unable to move the file."
+msgstr ""
+
+#: includes/class-mstv-storage.php:513
+msgid "Unable to move the folder."
+msgstr ""
+
+#: includes/class-mstv-download.php:113 includes/class-mstv-download.php:132 includes/class-mstv-preview.php:124 includes/class-mstv-preview.php:155
+msgid "Unable to read the file."
+msgstr ""
+
+#: includes/class-mstv-export.php:423 includes/class-mstv-export.php:433 includes/class-mstv-export.php:452
+msgid "Unable to read the ZIP file."
+msgstr ""
+
+#: includes/class-mstv-storage.php:440
+msgid "Unable to rename the folder."
+msgstr ""
+
+#: includes/class-mstv-rest-controller.php:156 includes/class-mstv-rest-governance.php:592 includes/class-mstv-storage.php:109
+msgid "Unable to save the changes. Please try again."
+msgstr ""
+
+#: includes/class-mstv-rest-controller.php:970 includes/class-mstv-storage.php:183
+msgid "Unable to save the file."
+msgstr ""
+
+#: includes/class-mstv-validator.php:376
+msgid "Unable to write the file to disk."
+msgstr ""
+
+#: includes/class-mstv-auth.php:64 includes/class-mstv-auth.php:90
+msgid "Unauthorized access. Please log in."
+msgstr ""
+
+#: admin/views/settings-page.php:281
+msgid "Uninstall"
+msgstr ""
+
+#: includes/class-mstv-validator.php:380
+msgid "Unknown upload error."
+msgstr ""
+
+#: admin/views/file-manager-page.php:131 admin/views/logs-page.php:9 includes/class-mstv-assets.php:196
+msgid "Upload"
+msgstr ""
+
+#: includes/class-mstv-notifications.php:140
+msgid "upload"
+msgstr ""
+
+#: includes/class-mstv-quota.php:174
+msgid "Upload blocked: this would exceed the storage quota (%1$s). Already used: %2$s; this file: %3$s."
+msgstr ""
+
+#: includes/class-mstv-assets.php:92
+msgid "Upload cancelled."
+msgstr ""
+
+#: includes/class-mstv-assets.php:108
+msgid "Upload files or create a new folder to get started"
+msgstr ""
+
+#: includes/class-mstv-validator.php:377
+msgid "Upload stopped by a PHP extension."
+msgstr ""
+
+#: includes/class-mstv-notifications.php:52
+msgid "Uploaded: %s"
+msgstr ""
+
+#: includes/class-mstv-assets.php:91
+msgid "Uploading..."
+msgstr ""
+
+#: admin/views/settings-page.php:260
+msgid "Use cleanup after a local migration if the private storage folder was not copied."
+msgstr ""
+
+#: admin/views/settings-page.php:271
+msgid "Use this after an incomplete uninstall or a migration where the storage directory remained available."
+msgstr ""
+
+#: includes/class-mstv-assets.php:162 includes/class-mstv-assets.php:223
+msgid "Used"
+msgstr ""
+
+#: admin/views/file-manager-page.php:35 includes/class-mstv-assets.php:167
+msgid "Used by TeamVault"
+msgstr ""
+
+#: admin/views/logs-page.php:90 admin/views/reports-page.php:20 includes/class-mstv-assets.php:193
+msgid "User"
+msgstr ""
+
+#: includes/class-mstv-assets.php:192
+msgid "User / Group"
+msgstr ""
+
+#: admin/views/settings-page.php:116
+msgid "User Access"
+msgstr ""
+
+#: includes/class-mstv-assets.php:174
+msgid "User is already in the list"
+msgstr ""
+
+#: includes/class-mstv-assets.php:173
+msgid "User not found"
+msgstr ""
+
+#: includes/class-mstv-assets.php:195
+msgid "View"
+msgstr ""
+
+#: admin/views/settings-page.php:295
+msgid "Warning:"
+msgstr ""
+
+#: includes/class-mstv-storage.php:486
+msgid "You cannot move a folder into itself or one of its subfolders."
+msgstr ""
+
+#: includes/class-mstv-admin.php:219 includes/class-mstv-admin.php:229 includes/class-mstv-admin.php:251 includes/class-mstv-admin.php:261 includes/class-mstv-admin.php:271 includes/class-mstv-admin.php:281 includes/class-mstv-admin.php:291 includes/class-mstv-admin.php:316 includes/class-mstv-admin.php:382 includes/class-mstv-admin.php:405 includes/class-mstv-admin.php:472 includes/class-mstv-admin.php:495 includes/class-mstv-admin.php:581
+msgid "You do not have permission to access this page."
+msgstr ""
+
+#: includes/class-mstv-auth.php:72 includes/class-mstv-auth.php:98
+msgid "You do not have permission to access this resource."
+msgstr ""
+
+#: includes/class-mstv-rest-governance.php:580
+msgid "You do not have permission to manage this folder."
+msgstr ""
+
+#: includes/class-mstv-rest-controller.php:75
+msgid "You do not have permission to perform this action."
+msgstr ""
+
+#: includes/class-mstv-export.php:134 includes/class-mstv-export.php:50
+msgid "ZipArchive is not available on this server. Contact the server administrator."
+msgstr ""
diff --git a/mikesoft-teamvault.php b/mikesoft-teamvault.php
index 1f28629..9f09fae 100644
--- a/mikesoft-teamvault.php
+++ b/mikesoft-teamvault.php
@@ -6,7 +6,7 @@
* Version: 3.2.6
* Author: Mikesoft
* Author URI: https://mikesoft.it
- * License: GPL v2 or later
+ * License: GPL-2.0-or-later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
* Text Domain: mikesoft-teamvault
* Domain Path: /languages
diff --git a/readme.txt b/readme.txt
index 62e0f51..c82d7db 100644
--- a/readme.txt
+++ b/readme.txt
@@ -6,7 +6,7 @@ Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 8.0
Stable tag: 3.2.6
-License: GPLv2 or later
+License: GPL-2.0-or-later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Private document workspace for WordPress: protected storage, groups, per-folder permissions, previews, ZIP export, quotas, reports, and notifications.
From f3623496fb7723740b07adcb47f4acf197e57fa6 Mon Sep 17 00:00:00 2001
From: TheStreamCode
Date: Tue, 22 Sep 2026 20:33:41 +0200
Subject: [PATCH 2/3] fix(i18n): drop manual load_plugin_textdomain, bump
Tested up to 7.1
Since WP 4.6, wordpress.org-hosted plugins get GlotPress language packs
auto-loaded from WP_LANG_DIR, so the manual load_plugin_textdomain()
call in MSTV_I18n::init() is unnecessary (Requires at least is 6.0).
Per https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/#plugins-on-wordpress-org
and https://make.wordpress.org/polyglots/handbook/plugin-theme-authors-guide/#once-your-project-is-translated
(community packs take precedence since WP 4.7).
The bundled gettext-filter fallback maps are kept so the it/fr/es/de
admin UI still works when no language pack is installed.
Also fixes the pre-existing Plugin Check error by bumping readme.txt
Tested up to 7.0 -> 7.1, verified against the current stable
(7.1.2) via https://api.wordpress.org/core/version-check/1.7/.
NOTE: owner smoke-test on WP 7.1 is still due.
---
includes/class-mstv-i18n.php | 10 ++++------
readme.txt | 2 +-
2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/includes/class-mstv-i18n.php b/includes/class-mstv-i18n.php
index 3f2f265..5220bf0 100644
--- a/includes/class-mstv-i18n.php
+++ b/includes/class-mstv-i18n.php
@@ -1263,12 +1263,10 @@ class MSTV_I18n
public function init(): void
{
- // Standard WordPress.org loading so GlotPress language packs in
- // languages/ are picked up. Runs on `init` (via MSTV_Bootstrap::init_services).
- // __FILE__ is includes/class-mstv-i18n.php, hence dirname levels: 2.
- if (function_exists('load_plugin_textdomain')) {
- load_plugin_textdomain('mikesoft-teamvault', false, dirname(plugin_basename(__FILE__), 2) . '/languages');
- }
+ // No load_plugin_textdomain() call: this plugin is hosted on
+ // wordpress.org with "Requires at least: 6.0" (well above 4.6), so
+ // WordPress auto-loads GlotPress language packs from WP_LANG_DIR.
+ // See https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/#plugins-on-wordpress-org
// Runtime fallback: in-admin maps below keep the bundled it/fr/es/de
// interface working when no language pack is installed (see docs/developer/i18n.md).
diff --git a/readme.txt b/readme.txt
index c82d7db..b2520ff 100644
--- a/readme.txt
+++ b/readme.txt
@@ -3,7 +3,7 @@ Contributors: thestreamcode
Donate link: https://github.com/sponsors/TheStreamCode
Tags: documents, secure, collaboration, privacy, file-manager
Requires at least: 6.0
-Tested up to: 7.0
+Tested up to: 7.1
Requires PHP: 8.0
Stable tag: 3.2.6
License: GPL-2.0-or-later
From 23f357e5df743993799ef3768c7ed5d1ee6c9220 Mon Sep 17 00:00:00 2001
From: TheStreamCode
Date: Tue, 22 Sep 2026 21:22:55 +0200
Subject: [PATCH 3/3] test: bump TESTED_UP_TO 7.0 -> 7.1 to match readme
PDMReleaseMetadataTest pinned the stale 'Tested up to: 7.0' value that
Plugin Check flags (current stable is 7.1 per version-check API); the
f362349 readme bump to 7.1 broke
test_release_metadata_matches_wordpress_7_release on PHP 8.2/8.3/8.4
(run 35768006906, 1 failure each: pattern /^Tested up to:\s*7\.0\s*$/m
vs actual 'Tested up to: 7.1'). Align the constant with the corrected
readme; no behavior change. Owner smoke-test on WP 7.1 still due.
---
tests/PDMReleaseMetadataTest.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/PDMReleaseMetadataTest.php b/tests/PDMReleaseMetadataTest.php
index fae47d3..e11cdce 100644
--- a/tests/PDMReleaseMetadataTest.php
+++ b/tests/PDMReleaseMetadataTest.php
@@ -8,7 +8,7 @@ final class PDMReleaseMetadataTest extends TestCase
{
private const RELEASE_VERSION = '3.2.6';
private const RELEASE_DATE = '2026-08-08';
- private const TESTED_UP_TO = '7.0';
+ private const TESTED_UP_TO = '7.1';
private const CONTACT_EMAIL = 'teamvault@mikesoft.it';
private const PLUGIN_AUTHOR = 'Mikesoft';