feat: domains, transports, logs, quarantine, spam filter, i18n + UX fixes

Features added:
- Admin > Domains: add domains to Mailcow servers, auto-generate DKIM,
  display full DNS record set (MX, SPF, DMARC, DKIM, autoconfig CNAMEs)
  with one-click copy per record
- Admin > Transports: manage sender-dependent relay hosts (add/delete)
- Admin > Logs: view Postfix, Dovecot, Rspamd, Ratelimit, API and other
  server logs in a dark scrollable panel
- My Account: per-domain Quarantine panel — view score, sender, subject,
  date; permanently delete quarantined messages
- My Account: per-mailbox Spam Filter slider (1–15 threshold) saved via API
- My Account: Aliases & Forwarders (alias creation doubles as forwarder
  to any external address)

UX fixes:
- Quota 0 now displays ∞ (unlimited) in both admin and account views
- Admin mailbox action buttons replaced with Dashicon icon buttons
  (lock, chart-bar, trash) with title tooltips

i18n:
- load_plugin_textdomain registered on init hook
- All user-facing PHP strings wrapped in __() / esc_html__()
- Translated strings array passed to account JS via wp_localize_script
- woocow-es_ES.po/.mo — Spanish translation
- woocow-ro_RO.po/.mo — Romanian translation (with correct plural forms)
- English remains the fallback

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-27 08:38:52 +01:00
parent 1ea2ed7e74
commit 1c5b58f238
11 changed files with 1252 additions and 14 deletions

BIN
languages/woocow-es_ES.mo Normal file

Binary file not shown.

135
languages/woocow-es_ES.po Normal file
View File

@@ -0,0 +1,135 @@
# Spanish translation for WooCow
# Copyright (C) 2025 WooCow
msgid ""
msgstr ""
"Project-Id-Version: WooCow 1.0.0\n"
"PO-Revision-Date: 2025-01-01 00:00+0000\n"
"Language: es_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Text-Domain: woocow\n"
#: woocow.php:37
msgid "WooCow requires WooCommerce to be installed and active."
msgstr "WooCow requiere que WooCommerce esté instalado y activo."
#: includes/class-woocow-account.php:51
#: includes/class-woocow-pw-sync.php:30
msgid "Email Hosting"
msgstr "Alojamiento de correo electrónico"
#: includes/class-woocow-account.php:100
msgid "Please log in to manage your email hosting."
msgstr "Por favor, inicia sesión para gestionar tu alojamiento de correo electrónico."
#: includes/class-woocow-account.php:108
msgid "You have no email domains assigned yet. Please contact support."
msgstr "Aún no tienes dominios de correo electrónico asignados. Por favor, contacta con soporte."
#: includes/class-woocow-account.php:68
#: includes/class-woocow-account.php:126
msgid "Load Mailboxes"
msgstr "Cargar buzones"
#: includes/class-woocow-account.php:69
msgid "Refresh"
msgstr "Actualizar"
#: includes/class-woocow-account.php:70
msgid "Loading…"
msgstr "Cargando…"
#: includes/class-woocow-account.php:71
msgid "No mailboxes yet. Create one below."
msgstr "Aún no hay buzones. Crea uno a continuación."
#: includes/class-woocow-account.php:72
msgid "Change Password"
msgstr "Cambiar contraseña"
#: includes/class-woocow-account.php:73
msgid "Aliases & Forwarders"
msgstr "Alias y reenvíos"
#: includes/class-woocow-account.php:74
msgid "Spam Filter"
msgstr "Filtro de spam"
#: includes/class-woocow-account.php:75
msgid "Webmail"
msgstr "Correo web"
#: includes/class-woocow-account.php:76
msgid "Add Alias / Forwarder"
msgstr "Añadir alias / reenvío"
#: includes/class-woocow-account.php:77
msgid "No aliases for this domain yet."
msgstr "Aún no hay alias para este dominio."
#: includes/class-woocow-account.php:78
msgid "Add Mailbox"
msgstr "Añadir buzón"
#: includes/class-woocow-account.php:79
msgid "Create Mailbox"
msgstr "Crear buzón"
#: includes/class-woocow-account.php:80
msgid "Cancel"
msgstr "Cancelar"
#: includes/class-woocow-account.php:81
msgid "Save"
msgstr "Guardar"
#: includes/class-woocow-account.php:82
msgid "Delete"
msgstr "Eliminar"
#: includes/class-woocow-account.php:83
#: includes/class-woocow-account.php:127
msgid "Quarantine"
msgstr "Cuarentena"
#: includes/class-woocow-account.php:84
msgid "No quarantined messages for this domain."
msgstr "No hay mensajes en cuarentena para este dominio."
#: includes/class-woocow-account.php:85
msgid "To release a message to your inbox, use the link in your quarantine notification email or via Webmail."
msgstr "Para liberar un mensaje a tu bandeja de entrada, usa el enlace en el correo electrónico de notificación de cuarentena o a través del correo web."
#: includes/class-woocow-account.php:86
msgid "Permanently delete this quarantined message?"
msgstr "¿Eliminar permanentemente este mensaje en cuarentena?"
#: includes/class-woocow-account.php:87
msgid "Spam Filter Threshold"
msgstr "Umbral del filtro de spam"
#: includes/class-woocow-account.php:88
msgid "Lower = stricter. Default is 5. Emails above this score go to spam/quarantine."
msgstr "Menor = más estricto. El valor predeterminado es 5. Los correos con una puntuación superior van a spam/cuarentena."
#: includes/class-woocow-account.php:89
msgid "Update Password"
msgstr "Actualizar contraseña"
#: includes/class-woocow-account.php:90
msgid "Passwords do not match or are empty."
msgstr "Las contraseñas no coinciden o están vacías."
#: includes/class-woocow-account.php:91
msgid "Unlimited"
msgstr "Ilimitado"
#: includes/class-woocow-pw-sync.php:33
msgid "Also update password for all my email mailboxes (only applies when changing password above)"
msgstr "También actualizar la contraseña para todos mis buzones de correo electrónico (solo aplica al cambiar la contraseña arriba)"
#: includes/class-woocow-account.php:124
msgid "Open Webmail"
msgstr "Abrir correo web"

BIN
languages/woocow-ro_RO.mo Normal file

Binary file not shown.

135
languages/woocow-ro_RO.po Normal file
View File

@@ -0,0 +1,135 @@
# Romanian translation for WooCow
# Copyright (C) 2025 WooCow
msgid ""
msgstr ""
"Project-Id-Version: WooCow 1.0.0\n"
"PO-Revision-Date: 2025-01-01 00:00+0000\n"
"Language: ro_RO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n"
"X-Text-Domain: woocow\n"
#: woocow.php:37
msgid "WooCow requires WooCommerce to be installed and active."
msgstr "WooCow necesită ca WooCommerce să fie instalat și activ."
#: includes/class-woocow-account.php:51
#: includes/class-woocow-pw-sync.php:30
msgid "Email Hosting"
msgstr "Găzduire email"
#: includes/class-woocow-account.php:100
msgid "Please log in to manage your email hosting."
msgstr "Te rugăm să te autentifici pentru a gestiona găzduirea de email."
#: includes/class-woocow-account.php:108
msgid "You have no email domains assigned yet. Please contact support."
msgstr "Nu ai niciun domeniu de email atribuit încă. Te rugăm să contactezi suportul."
#: includes/class-woocow-account.php:68
#: includes/class-woocow-account.php:126
msgid "Load Mailboxes"
msgstr "Încarcă cutiile poștale"
#: includes/class-woocow-account.php:69
msgid "Refresh"
msgstr "Reîmprospătează"
#: includes/class-woocow-account.php:70
msgid "Loading…"
msgstr "Se încarcă…"
#: includes/class-woocow-account.php:71
msgid "No mailboxes yet. Create one below."
msgstr "Nicio cutie poștală încă. Creează una mai jos."
#: includes/class-woocow-account.php:72
msgid "Change Password"
msgstr "Schimbă parola"
#: includes/class-woocow-account.php:73
msgid "Aliases & Forwarders"
msgstr "Aliasuri și redirecționări"
#: includes/class-woocow-account.php:74
msgid "Spam Filter"
msgstr "Filtru spam"
#: includes/class-woocow-account.php:75
msgid "Webmail"
msgstr "Webmail"
#: includes/class-woocow-account.php:76
msgid "Add Alias / Forwarder"
msgstr "Adaugă alias / redirecționare"
#: includes/class-woocow-account.php:77
msgid "No aliases for this domain yet."
msgstr "Niciun alias pentru acest domeniu încă."
#: includes/class-woocow-account.php:78
msgid "Add Mailbox"
msgstr "Adaugă cutie poștală"
#: includes/class-woocow-account.php:79
msgid "Create Mailbox"
msgstr "Creează cutie poștală"
#: includes/class-woocow-account.php:80
msgid "Cancel"
msgstr "Anulează"
#: includes/class-woocow-account.php:81
msgid "Save"
msgstr "Salvează"
#: includes/class-woocow-account.php:82
msgid "Delete"
msgstr "Șterge"
#: includes/class-woocow-account.php:83
#: includes/class-woocow-account.php:127
msgid "Quarantine"
msgstr "Carantină"
#: includes/class-woocow-account.php:84
msgid "No quarantined messages for this domain."
msgstr "Niciun mesaj în carantină pentru acest domeniu."
#: includes/class-woocow-account.php:85
msgid "To release a message to your inbox, use the link in your quarantine notification email or via Webmail."
msgstr "Pentru a elibera un mesaj în căsuța de intrare, folosește linkul din emailul de notificare privind carantina sau prin Webmail."
#: includes/class-woocow-account.php:86
msgid "Permanently delete this quarantined message?"
msgstr "Ștergi definitiv acest mesaj din carantină?"
#: includes/class-woocow-account.php:87
msgid "Spam Filter Threshold"
msgstr "Prag filtru spam"
#: includes/class-woocow-account.php:88
msgid "Lower = stricter. Default is 5. Emails above this score go to spam/quarantine."
msgstr "Mai mic = mai strict. Implicit este 5. Emailurile cu un scor mai mare ajung în spam/carantină."
#: includes/class-woocow-account.php:89
msgid "Update Password"
msgstr "Actualizează parola"
#: includes/class-woocow-account.php:90
msgid "Passwords do not match or are empty."
msgstr "Parolele nu se potrivesc sau sunt goale."
#: includes/class-woocow-account.php:91
msgid "Unlimited"
msgstr "Nelimitat"
#: includes/class-woocow-pw-sync.php:33
msgid "Also update password for all my email mailboxes (only applies when changing password above)"
msgstr "Actualizează și parola pentru toate cutiile mele poștale de email (se aplică doar la schimbarea parolei de mai sus)"
#: includes/class-woocow-account.php:124
msgid "Open Webmail"
msgstr "Deschide Webmail"