diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 93b25c2..5577c3a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -13,6 +13,26 @@ permissions:
contents: read
jobs:
+ lint:
+ name: Manifest, language and package checks
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v7
+ - uses: shivammathur/setup-php@v2
+ with:
+ php-version: '8.4'
+ coverage: none
+ - name: XML files are well-formed
+ run: |
+ sudo apt-get install -y -q libxml2-utils > /dev/null
+ find . -name '*.xml' -not -path './.git/*' -print0 | xargs -0 xmllint --noout
+ - name: Language files
+ run: php tests/lint/check-language.php bfstop.xml COM_BFSTOP
+ - name: Release zip contains everything the manifest references
+ run: |
+ ./deploy.sh zip
+ php tests/lint/check-zip.php com_bfstop-*.zip bfstop.xml
+
syntax:
name: Syntax check (PHP ${{ matrix.php }})
runs-on: ubuntu-latest
diff --git a/admin/language/ca-ES/ca-ES.com_bfstop.ini b/admin/language/ca-ES/ca-ES.com_bfstop.ini
index fbce6f7..fae343e 100644
--- a/admin/language/ca-ES/ca-ES.com_bfstop.ini
+++ b/admin/language/ca-ES/ca-ES.com_bfstop.ini
@@ -9,19 +9,18 @@ COM_BFSTOP_HEADING_DURATION="Durada"
COM_BFSTOP_HEADING_STATE="Estat"
COM_BFSTOP_HEADING_USERNAME="Nom d'usuari"
COM_BFSTOP_HEADING_ORIGIN="Origen"
-BLOCKED_UNTIL="Bloquejat fins %s"
-BLOCKED_PERMANENTLY="Bloqueig permanent"
-BLOCK_EXPIRED_AT="Bloqueig finalitzat el %s"
-UNBLOCKED_STATE="Desbloquejat en %s"
-UNBLOCK_SUCCESS="Desbloquejat amb èxit!"
-UNBLOCK_FAILED="El desbloqueig ha fallat."
-UNBLOCK_INVALIDID="Id invàlida: %s."
+COM_BFSTOP_BLOCKED_UNTIL="Bloquejat fins %s"
+COM_BFSTOP_BLOCKED_PERMANENTLY="Bloqueig permanent"
+COM_BFSTOP_BLOCK_EXPIRED_AT="Bloqueig finalitzat el %s"
+COM_BFSTOP_UNBLOCKED_STATE="Desbloquejat en %s"
+COM_BFSTOP_UNBLOCK_SUCCESS="Desbloquejat amb èxit!"
+COM_BFSTOP_UNBLOCK_FAILED="El desbloqueig ha fallat."
COM_BFSTOP_SUBMENU_BLOCKLIST="IPs bloquejades"
COM_BFSTOP_SUBMENU_FAILEDLOGINLIST="Inicis de sessió fallits"
COM_BFSTOP_SUBMENU_SETTINGS="Configuració"
COM_BFSTOP_HEADING_BLOCKLIST="Brute Force Stop: IPs bloquejades"
COM_BFSTOP_HEADING_FAILEDLOGINLIST="Brute Force Stop: Inicis de sessió fallits"
-WARNING_ADMIN_USER_EXISTS="El superadministrador utilitza 'admin', el nom d'usuari per defecte. Aquest és un risc de seguretat;. Atacants saben que existeix aquest nom d'usuari en moltes instal·lacions Joomla!, per la qual cosa s'utilitza amb molta freqüència en molts atacs. Per augmentar la seguretat, es recomana canviar el nom d'usuari per al Superusuari. Mireu també: Preguntes freqüents sobre seguretat i rendiment Joomla!: Per què hauria de canviar immediatament el nom de l'usuari administrador per defecte després d'una nova instal·lació. a>"
+COM_BFSTOP_WARNING_ADMIN_USER_EXISTS="El superadministrador utilitza 'admin', el nom d'usuari per defecte. Aquest és un risc de seguretat;. Atacants saben que existeix aquest nom d'usuari en moltes instal·lacions Joomla!, per la qual cosa s'utilitza amb molta freqüència en molts atacs. Per augmentar la seguretat, es recomana canviar el nom d'usuari per al Superusuari. Mireu també: Preguntes freqüents sobre seguretat i rendiment Joomla!: Per què hauria de canviar immediatament el nom de l'usuari administrador per defecte després d'una nova instal·lació. a>"
COM_BFSTOP_BLOCK_NEW="Afegir"
COM_BFSTOP_BLOCK_EDIT="Editar"
COM_BFSTOP_BLOCK_DETAILS="Detalls"
@@ -29,11 +28,11 @@ COM_BFSTOP_UNBLOCK="Desbloquejar"
COM_BFSTOP_DESC_BLOCK_IPADDRESS="L'adreça IP a bloquejar"
COM_BFSTOP_DESC_BLOCK_CRDATE="L'inici, data i hora, del bloqueig"
COM_BFSTOP_DESC_DURATION="La durada del bloqueig"
-TEST_MAIL_BODY="Aquesta és una notificació de prova per al lloc %s del complement de Joomla! Brute Force Stop (bfstop)."
-TEST_MAIL_SUBJECT="%s: Notificació de prova"
-TEST_NOTIFICATION="Notificació de prova"
-TEST_NOTIFICATION_SUCCESS="L'enviament de la notificació de proves sembla haver tingut èxit. Si us plau, comprova que també vas rebre un correu electrònic a l'adreça abans esmentada"
-TEST_NOTIFICATION_FAILED="L'enviament de la notificació de proves va fallar (%s)! Comprova el teu correu electrònic a la configuració de Joomla!"
+COM_BFSTOP_TEST_MAIL_BODY="Aquesta és una notificació de prova per al lloc %s del complement de Joomla! Brute Force Stop (bfstop)."
+COM_BFSTOP_TEST_MAIL_SUBJECT="%s: Notificació de prova"
+COM_BFSTOP_TEST_NOTIFICATION="Notificació de prova"
+COM_BFSTOP_TEST_NOTIFICATION_SUCCESS="L'enviament de la notificació de proves sembla haver tingut èxit. Si us plau, comprova que també vas rebre un correu electrònic a l'adreça abans esmentada"
+COM_BFSTOP_TEST_NOTIFICATION_FAILED="L'enviament de la notificació de proves va fallar (%s)! Comprova el teu correu electrònic a la configuració de Joomla!"
COM_BFSTOP_SETTINGS_VERSION_FIELDSET_LABEL="Quant a"
COM_BFSTOP_SETTINGS_VERSION_COMPONENT="Versió del component: %s"
COM_BFSTOP_SETTINGS_VERSION_PLUGIN="Versió del connector: %s"
diff --git a/admin/language/de-DE/de-DE.com_bfstop.ini b/admin/language/de-DE/de-DE.com_bfstop.ini
index e592419..fbcddd3 100644
--- a/admin/language/de-DE/de-DE.com_bfstop.ini
+++ b/admin/language/de-DE/de-DE.com_bfstop.ini
@@ -12,13 +12,12 @@ COM_BFSTOP_ATTEMPTS_NOT_TRACKED_HTACCESS="Die Sperre erfolgt derzeit über .htac
COM_BFSTOP_HEADING_USERNAME="Benutzername"
COM_BFSTOP_HEADING_ORIGIN="Ursprung"
COM_BFSTOP_HEADING_NOTES="Notizen"
-BLOCKED_UNTIL="Gesperrt bis %s"
-BLOCKED_PERMANENTLY="Dauerhaft gesperrt"
-BLOCK_EXPIRED_AT="Sperre ausgelaufen (%s)"
-UNBLOCKED_STATE="Entsperrt am %s"
-UNBLOCK_SUCCESS="Erfolgreich entsperrt"
-UNBLOCK_FAILED="Entsperren fehlgeschlagen"
-UNBLOCK_INVALIDID="Ungültige ID(s): %s"
+COM_BFSTOP_BLOCKED_UNTIL="Gesperrt bis %s"
+COM_BFSTOP_BLOCKED_PERMANENTLY="Dauerhaft gesperrt"
+COM_BFSTOP_BLOCK_EXPIRED_AT="Sperre ausgelaufen (%s)"
+COM_BFSTOP_UNBLOCKED_STATE="Entsperrt am %s"
+COM_BFSTOP_UNBLOCK_SUCCESS="Erfolgreich entsperrt"
+COM_BFSTOP_UNBLOCK_FAILED="Entsperren fehlgeschlagen"
COM_BFSTOP_SUBMENU_BLOCKLIST="Gesperrte IPs (Datenbank)"
COM_BFSTOP_SUBMENU_HTACCESS_BLOCKLIST="Gesperrte IPs (.htaccess)"
COM_BFSTOP_SUBMENU_FAILEDLOGINLIST="Fehlgeschlagene Logins"
@@ -43,11 +42,11 @@ COM_BFSTOP_DESC_BLOCK_CRDATE="Der Beginn der Sperre"
COM_BFSTOP_DESC_ALLOWLIST_IPADDRESS="Die IP-Adresse (oder das Subnetz), der der Zugriff auf die Seite immer erlaubt werden soll (dies deaktiviert jegliche Überprüfung oder Sperre durch das Plugin). Ein Subnetz muss in der CIDR-Suffix-Notation angegeben werden, d.h. in der Form /, z.B. 192.168.0.0/24."
COM_BFSTOP_DESC_ALLOWLIST_NOTES="Hier können beliebige Notizen zum Eintrag eingetragen werden (etwa die Zeit zu der der Eintrag erstellt wurde, oder der Benutzer, für den dieser Eintrag erstellt wurde)."
COM_BFSTOP_DESC_DURATION="Die Dauer der Sperre"
-TEST_MAIL_BODY="Dies ist eine Test-Benachrichtigung der Homepage '%s' vom Brute Force Stop (bfstop) Joomla! plugin."
-TEST_MAIL_SUBJECT="%s: Testnachricht"
-TEST_NOTIFICATION="Benachrichtigung testen"
-TEST_NOTIFICATION_SUCCESS="Das Senden der Test-Benachrichtigung scheint erfolgreich gewesen zu sein! Bitte überprüfe auch, ob die Mail tatsächlich angekommen ist!"
-TEST_NOTIFICATION_FAILED="Das Senden der Test-Benachrichtigung ist fehlgeschlagen (%s)! Bitte prüfe Deine eMail-Konfiguration in den Joomla!-Einstellungen bzw. ob Du in den Benachrichtigungs-Einstellungen des bfstop-Plugins eine (korrekte) eMail-Adresse eingetragen und/oder einen Benutzer oder eine Gruppe ausgewählt hast!"
+COM_BFSTOP_TEST_MAIL_BODY="Dies ist eine Test-Benachrichtigung der Homepage '%s' vom Brute Force Stop (bfstop) Joomla! plugin."
+COM_BFSTOP_TEST_MAIL_SUBJECT="%s: Testnachricht"
+COM_BFSTOP_TEST_NOTIFICATION="Benachrichtigung testen"
+COM_BFSTOP_TEST_NOTIFICATION_SUCCESS="Das Senden der Test-Benachrichtigung scheint erfolgreich gewesen zu sein! Bitte überprüfe auch, ob die Mail tatsächlich angekommen ist!"
+COM_BFSTOP_TEST_NOTIFICATION_FAILED="Das Senden der Test-Benachrichtigung ist fehlgeschlagen (%s)! Bitte prüfe Deine eMail-Konfiguration in den Joomla!-Einstellungen bzw. ob Du in den Benachrichtigungs-Einstellungen des bfstop-Plugins eine (korrekte) eMail-Adresse eingetragen und/oder einen Benutzer oder eine Gruppe ausgewählt hast!"
COM_BFSTOP_SETTINGS_VERSION_FIELDSET_LABEL="Über"
COM_BFSTOP_SETTINGS_VERSION_COMPONENT="Komponenten-Version: %s"
COM_BFSTOP_SETTINGS_VERSION_PLUGIN="Plugin-Version: %s"
diff --git a/admin/language/en-GB/en-GB.com_bfstop.ini b/admin/language/en-GB/en-GB.com_bfstop.ini
index 0df91ae..f437d4e 100644
--- a/admin/language/en-GB/en-GB.com_bfstop.ini
+++ b/admin/language/en-GB/en-GB.com_bfstop.ini
@@ -12,13 +12,12 @@ COM_BFSTOP_ATTEMPTS_NOT_TRACKED_HTACCESS="Blocking is currently done via .htacce
COM_BFSTOP_HEADING_USERNAME="Username"
COM_BFSTOP_HEADING_ORIGIN="Origin"
COM_BFSTOP_HEADING_NOTES="Notes"
-BLOCKED_UNTIL="Blocked until %s"
-BLOCKED_PERMANENTLY="Blocked permanently"
-BLOCK_EXPIRED_AT="Block expired at %s"
-UNBLOCKED_STATE="Unblocked at %s"
-UNBLOCK_SUCCESS="Successfully unblocked!"
-UNBLOCK_FAILED="Unblocking has failed."
-UNBLOCK_INVALIDID="Invalid id(s): %s."
+COM_BFSTOP_BLOCKED_UNTIL="Blocked until %s"
+COM_BFSTOP_BLOCKED_PERMANENTLY="Blocked permanently"
+COM_BFSTOP_BLOCK_EXPIRED_AT="Block expired at %s"
+COM_BFSTOP_UNBLOCKED_STATE="Unblocked at %s"
+COM_BFSTOP_UNBLOCK_SUCCESS="Successfully unblocked!"
+COM_BFSTOP_UNBLOCK_FAILED="Unblocking has failed."
COM_BFSTOP_SUBMENU_BLOCKLIST="Blocked IPs (database)"
COM_BFSTOP_SUBMENU_HTACCESS_BLOCKLIST="Blocked IPs (.htaccess)"
COM_BFSTOP_SUBMENU_FAILEDLOGINLIST="Failed Logins"
@@ -43,11 +42,11 @@ COM_BFSTOP_DESC_BLOCK_CRDATE="The start date/time of blocking"
COM_BFSTOP_DESC_ALLOWLIST_IPADDRESS="The IP address (or subnet) for which the access to this site shall always be allowed (this disables all blocks or checks done by the plugin). Subnets are specified in CIDR suffix notation, i.e. in the form /, e.g. '192.168.0.0/24'"
COM_BFSTOP_DESC_ALLOWLIST_NOTES="Enter any note you want to the allow list entry, e.g. the time when it was created, or the user it was created for."
COM_BFSTOP_DESC_DURATION="The duration of the block"
-TEST_MAIL_BODY="This is a test notification for site '%s' from Brute Force Stop (bfstop) Joomla! plugin."
-TEST_MAIL_SUBJECT="%s: BFStop Test Notification"
-TEST_NOTIFICATION="Test Notification"
-TEST_NOTIFICATION_SUCCESS="Sending the test notification seems to have been successful. Please check that you also received an eMail to the abovementioned address!"
-TEST_NOTIFICATION_FAILED="Sending the test notification failed (%s)! Please check your eMail configuration in the Joomla! configuration; also check that you have entered a (correct) email address and/or have chosen a user or group in the plugin configuration."
+COM_BFSTOP_TEST_MAIL_BODY="This is a test notification for site '%s' from Brute Force Stop (bfstop) Joomla! plugin."
+COM_BFSTOP_TEST_MAIL_SUBJECT="%s: BFStop Test Notification"
+COM_BFSTOP_TEST_NOTIFICATION="Test Notification"
+COM_BFSTOP_TEST_NOTIFICATION_SUCCESS="Sending the test notification seems to have been successful. Please check that you also received an eMail to the abovementioned address!"
+COM_BFSTOP_TEST_NOTIFICATION_FAILED="Sending the test notification failed (%s)! Please check your eMail configuration in the Joomla! configuration; also check that you have entered a (correct) email address and/or have chosen a user or group in the plugin configuration."
COM_BFSTOP_SETTINGS_VERSION_FIELDSET_LABEL="About"
COM_BFSTOP_SETTINGS_VERSION_COMPONENT="Component version: %s"
COM_BFSTOP_SETTINGS_VERSION_PLUGIN="Plugin version: %s"
diff --git a/admin/language/es-ES/es-ES.com_bfstop.ini b/admin/language/es-ES/es-ES.com_bfstop.ini
index 38f69c5..55e9fa2 100644
--- a/admin/language/es-ES/es-ES.com_bfstop.ini
+++ b/admin/language/es-ES/es-ES.com_bfstop.ini
@@ -4,13 +4,12 @@ COM_BFSTOP_HEADING_ID="ID"
COM_BFSTOP_HEADING_IPADDRESS="IP-Dirección"
COM_BFSTOP_HEADING_DATE="Fecha"
COM_BFSTOP_HEADING_STATE="Estado"
-BLOCKED_UNTIL="Bloqueado hasta %s"
-BLOCKED_PERMANENTLY="Bloqueo permanente"
-BLOCK_EXPIRED_AT="Bloqueo expiró en %s"
-UNBLOCK_SUCCESS="Desbloqueado satisfactorio!"
-UNBLOCK_FAILED="Desbloquear ha fallado."
-UNBLOCK_INVALIDID="Id(s) no válido: %s."
-UNBLOCKED_STATE="Desbloqueado en %s"
+COM_BFSTOP_BLOCKED_UNTIL="Bloqueado hasta %s"
+COM_BFSTOP_BLOCKED_PERMANENTLY="Bloqueo permanente"
+COM_BFSTOP_BLOCK_EXPIRED_AT="Bloqueo expiró en %s"
+COM_BFSTOP_UNBLOCK_SUCCESS="Desbloqueado satisfactorio!"
+COM_BFSTOP_UNBLOCK_FAILED="Desbloquear ha fallado."
+COM_BFSTOP_UNBLOCKED_STATE="Desbloqueado en %s"
COM_BFSTOP_HEADING_DURATION="Duración"
COM_BFSTOP_HEADING_USERNAME="Username"
COM_BFSTOP_HEADING_ORIGIN="Origen"
@@ -19,7 +18,7 @@ COM_BFSTOP_SUBMENU_FAILEDLOGINLIST="Entradas al sistema Fracasadas"
COM_BFSTOP_SUBMENU_SETTINGS="Ajustes"
COM_BFSTOP_HEADING_BLOCKLIST="Brute Force Stop: Bloqueado IPs"
COM_BFSTOP_HEADING_FAILEDLOGINLIST="Brute Force Stop: Entradas al sistema Fracasadas"
-WARNING_ADMIN_USER_EXISTS="Super-usuario está utilizando el valor predeterminado para el nombre de usuario 'admin'. Este es un riesgo de seguridad, los atacantes saben que este nombre de usuario ya existe en Joomla!-instalación, por lo tanto, se utiliza muy frecuentemente en muchos de los ataques. Para aumentar la seguridad, se recomienda cambiar el nombre de usuario para el superusuario. Ver también: Joomla! Security and Performance FAQ: Why should I immediately change the name of the default admin user after a new install?"
+COM_BFSTOP_WARNING_ADMIN_USER_EXISTS="Super-usuario está utilizando el valor predeterminado para el nombre de usuario 'admin'. Este es un riesgo de seguridad, los atacantes saben que este nombre de usuario ya existe en Joomla!-instalación, por lo tanto, se utiliza muy frecuentemente en muchos de los ataques. Para aumentar la seguridad, se recomienda cambiar el nombre de usuario para el superusuario. Ver también: Joomla! Security and Performance FAQ: Why should I immediately change the name of the default admin user after a new install?"
COM_BFSTOP_BLOCK_NEW="Añadir"
COM_BFSTOP_BLOCK_EDIT="Editar"
COM_BFSTOP_BLOCK_DETAILS="Detalles"
@@ -27,11 +26,11 @@ COM_BFSTOP_UNBLOCK="Desbloquear"
COM_BFSTOP_DESC_BLOCK_IPADDRESS="Las IPs que se deben bloquear"
COM_BFSTOP_DESC_BLOCK_CRDATE="Fecha y hora de inicio de bloqueo"
COM_BFSTOP_DESC_DURATION="Duración del bloqueo"
-TEST_MAIL_BODY="¡Esta es una notificación de prueba para el sitio %s de la Parada de Fuerza Bruta (bfstop) Joomla! plugin."
-TEST_MAIL_SUBJECT="%s: Notificación de Prueba"
-TEST_NOTIFICATION="Notificación de Prueba"
-TEST_NOTIFICATION_SUCCESS="El envío de la notificación de prueba ha tenido éxito. Compruebe que ha recibido un mensaje de correo electrónico a la dirección antes mencionada!"
-TEST_NOTIFICATION_FAILED="El envío de notificación de prueba ha fallado (%s)! Por favor, compruebe la configuración de correo electrónico en el Joomla! configuration!"
+COM_BFSTOP_TEST_MAIL_BODY="¡Esta es una notificación de prueba para el sitio %s de la Parada de Fuerza Bruta (bfstop) Joomla! plugin."
+COM_BFSTOP_TEST_MAIL_SUBJECT="%s: Notificación de Prueba"
+COM_BFSTOP_TEST_NOTIFICATION="Notificación de Prueba"
+COM_BFSTOP_TEST_NOTIFICATION_SUCCESS="El envío de la notificación de prueba ha tenido éxito. Compruebe que ha recibido un mensaje de correo electrónico a la dirección antes mencionada!"
+COM_BFSTOP_TEST_NOTIFICATION_FAILED="El envío de notificación de prueba ha fallado (%s)! Por favor, compruebe la configuración de correo electrónico en el Joomla! configuration!"
COM_BFSTOP_SETTINGS_VERSION_FIELDSET_LABEL="Acerca de"
COM_BFSTOP_SETTINGS_VERSION_COMPONENT="Versión del componente: %s"
COM_BFSTOP_SETTINGS_VERSION_PLUGIN="Versión del plugin: %s"
diff --git a/admin/language/fr-FR/fr-FR.com_bfstop.ini b/admin/language/fr-FR/fr-FR.com_bfstop.ini
index 219d878..dc21700 100644
--- a/admin/language/fr-FR/fr-FR.com_bfstop.ini
+++ b/admin/language/fr-FR/fr-FR.com_bfstop.ini
@@ -7,8 +7,8 @@ COM_BFSTOP_ADMIN="Administration de Brute Force Stop"
COM_BFSTOP_HEADING_ID="ID"
COM_BFSTOP_HEADING_IPADDRESS="Adresse IP"
COM_BFSTOP_HEADING_STATE="Statut"
-UNBLOCK_SUCCESS="Déblocage réalisé!"
-UNBLOCK_FAILED="Echec du déblocage."
+COM_BFSTOP_UNBLOCK_SUCCESS="Déblocage réalisé!"
+COM_BFSTOP_UNBLOCK_FAILED="Echec du déblocage."
; Ajouté à compter de la version 0.9.11
COM_BFSTOP_HEADING_DATE="Date"
COM_BFSTOP_HEADING_DURATION="Durée"
@@ -19,27 +19,26 @@ COM_BFSTOP_SUBMENU_FAILEDLOGINLIST="Connexions échouées"
COM_BFSTOP_SUBMENU_SETTINGS="Configuration"
COM_BFSTOP_HEADING_BLOCKLIST="Brute Force Stop: adresses IP bloquées"
COM_BFSTOP_HEADING_FAILEDLOGINLIST="Brute Force Stop: connexions échouées"
-WARNING_ADMIN_USER_EXISTS="Le profil 'SuperUtilisateur' est attribué à l'utilisateur 'admin'. Cette attribution constitue un risque important en terme de sécurité; les pirates savent que ce nom d'utilisateur est commun et notamment utilisé dans Joomla. Pour améliorer la sécurité, il est vivement recommandé de changer le nom d'utilisateur auquel il est attribué un profil d'administrateur 'SuperUtilisateur'! Consultez également: Joomla! Sécurity et Performance FAQ: Pourquoi changer le nom de l'utilisateur administrateur après une nouvelle installation?"
+COM_BFSTOP_WARNING_ADMIN_USER_EXISTS="Le profil 'SuperUtilisateur' est attribué à l'utilisateur 'admin'. Cette attribution constitue un risque important en terme de sécurité; les pirates savent que ce nom d'utilisateur est commun et notamment utilisé dans Joomla. Pour améliorer la sécurité, il est vivement recommandé de changer le nom d'utilisateur auquel il est attribué un profil d'administrateur 'SuperUtilisateur'! Consultez également: Joomla! Sécurity et Performance FAQ: Pourquoi changer le nom de l'utilisateur administrateur après une nouvelle installation?"
COM_BFSTOP_BLOCK_NEW="Ajouter"
COM_BFSTOP_BLOCK_EDIT="Editer"
COM_BFSTOP_BLOCK_DETAILS="Détails"
COM_BFSTOP_UNBLOCK="Débloquer"
COM_BFSTOP_DESC_DURATION="La durée du blocage"
-TEST_MAIL_BODY="Ceci est un test de notification pour le site %s issu du plugin Joomla Brute Force Stop (bfstop)."
-TEST_MAIL_SUBJECT="%s: Test de notification"
-TEST_NOTIFICATION="Test de notification"
-TEST_NOTIFICATION_SUCCESS="Le test de notification semble s'être déroulé correctement. Néanmoins, veuillez vérifier que vous avez également reçu le courriel de test à l'adresse électronique indiquée ci-dessus."
-TEST_NOTIFICATION_FAILED="Le test de notification a échoué (%s)! Veuillez vérifier la configuration de la messagerie électronique dans l'administration de Joomla.Veuillez vérifier également la validité des adresses électroniques et/ou la sélection d'un (groupe) utilisateur(s) dans le cadre de la configuration du plugin."
-BLOCKED_UNTIL="Bloquée jusqu'à %s"
-BLOCK_EXPIRED_AT="Expiration du blocage le %s"
-UNBLOCK_INVALIDID="Id invalide(s): %s."
-UNBLOCKED_STATE="Débloquée le %s"
+COM_BFSTOP_TEST_MAIL_BODY="Ceci est un test de notification pour le site %s issu du plugin Joomla Brute Force Stop (bfstop)."
+COM_BFSTOP_TEST_MAIL_SUBJECT="%s: Test de notification"
+COM_BFSTOP_TEST_NOTIFICATION="Test de notification"
+COM_BFSTOP_TEST_NOTIFICATION_SUCCESS="Le test de notification semble s'être déroulé correctement. Néanmoins, veuillez vérifier que vous avez également reçu le courriel de test à l'adresse électronique indiquée ci-dessus."
+COM_BFSTOP_TEST_NOTIFICATION_FAILED="Le test de notification a échoué (%s)! Veuillez vérifier la configuration de la messagerie électronique dans l'administration de Joomla.Veuillez vérifier également la validité des adresses électroniques et/ou la sélection d'un (groupe) utilisateur(s) dans le cadre de la configuration du plugin."
+COM_BFSTOP_BLOCKED_UNTIL="Bloquée jusqu'à %s"
+COM_BFSTOP_BLOCK_EXPIRED_AT="Expiration du blocage le %s"
+COM_BFSTOP_UNBLOCKED_STATE="Débloquée le %s"
COM_BFSTOP_SETTINGS_VERSION_FIELDSET_LABEL="À propos"
COM_BFSTOP_SETTINGS_VERSION_COMPONENT="Version du composant : %s"
COM_BFSTOP_SETTINGS_VERSION_PLUGIN="Version du plugin : %s"
COM_BFSTOP_SETTINGS_VERSION_UNKNOWN="inconnue"
; Ajouté à compter de la version 1.0.0
-BLOCKED_PERMANENTLY="Bloquée de façon permanente"
+COM_BFSTOP_BLOCKED_PERMANENTLY="Bloquée de façon permanente"
; Ajouté à compter de la version 1.1.0
COM_BFSTOP_HEADING_IPINFO="Information adresse IP %s"
COM_BFSTOP_SUBMENU_ALLOWLIST="Liste blanche"
diff --git a/admin/language/it-IT/it-IT.com_bfstop.ini b/admin/language/it-IT/it-IT.com_bfstop.ini
index 3d95c17..dc0a7ad 100644
--- a/admin/language/it-IT/it-IT.com_bfstop.ini
+++ b/admin/language/it-IT/it-IT.com_bfstop.ini
@@ -7,19 +7,18 @@ COM_BFSTOP_HEADING_DURATION="Durata"
COM_BFSTOP_HEADING_STATE="Stato"
COM_BFSTOP_HEADING_USERNAME="Nome Utente"
COM_BFSTOP_HEADING_ORIGIN="Origine"
-BLOCKED_UNTIL="Bloccato fino a %s"
-BLOCKED_PERMANENTLY="Bloccato permanentemente"
-BLOCK_EXPIRED_AT="Scadenza blocco il %s"
-UNBLOCKED_STATE="Sbloccato il %s"
-UNBLOCK_SUCCESS="Sbloccato con successo!"
-UNBLOCK_FAILED="Sbloccaggio fallito."
-UNBLOCK_INVALIDID="id invallido(i): %s."
+COM_BFSTOP_BLOCKED_UNTIL="Bloccato fino a %s"
+COM_BFSTOP_BLOCKED_PERMANENTLY="Bloccato permanentemente"
+COM_BFSTOP_BLOCK_EXPIRED_AT="Scadenza blocco il %s"
+COM_BFSTOP_UNBLOCKED_STATE="Sbloccato il %s"
+COM_BFSTOP_UNBLOCK_SUCCESS="Sbloccato con successo!"
+COM_BFSTOP_UNBLOCK_FAILED="Sbloccaggio fallito."
COM_BFSTOP_SUBMENU_BLOCKLIST="IP Bloccati"
COM_BFSTOP_SUBMENU_FAILEDLOGINLIST="Accessi falliti"
COM_BFSTOP_SUBMENU_SETTINGS="Configurazione"
COM_BFSTOP_HEADING_BLOCKLIST="Brute Force Stop: IP Bloccati"
COM_BFSTOP_HEADING_FAILEDLOGINLIST="Brute Force Stop: Accessi Falliti"
-WARNING_ADMIN_USER_EXISTS="Il Superuser sta usando il nome utente 'admin' predefinito. Questo è un rischio per la sicurezza; gli attaccanti sanno che questo nome utente esiste in molte installazioni Joomla!, e viene utilizzato spesso in molti attacchi. Per aumentare la sicurezza si consiglia di modificare il nome utente per il Superuser! Vedi anche:Joomla! Security and Performance FAQ: Why should I immediately change the name of the default admin user after a new install?"
+COM_BFSTOP_WARNING_ADMIN_USER_EXISTS="Il Superuser sta usando il nome utente 'admin' predefinito. Questo è un rischio per la sicurezza; gli attaccanti sanno che questo nome utente esiste in molte installazioni Joomla!, e viene utilizzato spesso in molti attacchi. Per aumentare la sicurezza si consiglia di modificare il nome utente per il Superuser! Vedi anche:Joomla! Security and Performance FAQ: Why should I immediately change the name of the default admin user after a new install?"
COM_BFSTOP_BLOCK_NEW="Aggiungere"
COM_BFSTOP_BLOCK_EDIT="Modifica"
COM_BFSTOP_BLOCK_DETAILS="Dettagli"
@@ -27,11 +26,11 @@ COM_BFSTOP_UNBLOCK="Sblocca"
COM_BFSTOP_DESC_BLOCK_IPADDRESS="L'indirizzo IP da bloccare"
COM_BFSTOP_DESC_BLOCK_CRDATE="La data/ora di inizio del blocco"
COM_BFSTOP_DESC_DURATION="La durata del blocco"
-TEST_MAIL_BODY="Questa è una notifica di prova per il sito '%s' del plugin Brute Force Stop (bfstop) di Joomla!"
-TEST_MAIL_SUBJECT="%s: BFStop Notifica di Prova"
-TEST_NOTIFICATION="Notifica di Prova"
-TEST_NOTIFICATION_SUCCESS="L'invio della notifica di prova sembra aver avuto successo. Si prega di verificare che è anche arrivata una e-mail all'indirizzo indicato sopra!"
-TEST_NOTIFICATION_FAILED="L'invio della notifica di prova è fallito (%s)! Si prega di controllare le Impostazioni Mail nella configurazione di Joomla!; la configurazione di notifica di questo plugin; e l'indirizzo e-mail per l'utente scelto nella configurazione del plugin."
+COM_BFSTOP_TEST_MAIL_BODY="Questa è una notifica di prova per il sito '%s' del plugin Brute Force Stop (bfstop) di Joomla!"
+COM_BFSTOP_TEST_MAIL_SUBJECT="%s: BFStop Notifica di Prova"
+COM_BFSTOP_TEST_NOTIFICATION="Notifica di Prova"
+COM_BFSTOP_TEST_NOTIFICATION_SUCCESS="L'invio della notifica di prova sembra aver avuto successo. Si prega di verificare che è anche arrivata una e-mail all'indirizzo indicato sopra!"
+COM_BFSTOP_TEST_NOTIFICATION_FAILED="L'invio della notifica di prova è fallito (%s)! Si prega di controllare le Impostazioni Mail nella configurazione di Joomla!; la configurazione di notifica di questo plugin; e l'indirizzo e-mail per l'utente scelto nella configurazione del plugin."
COM_BFSTOP_SETTINGS_VERSION_FIELDSET_LABEL="Informazioni"
COM_BFSTOP_SETTINGS_VERSION_COMPONENT="Versione del componente: %s"
COM_BFSTOP_SETTINGS_VERSION_PLUGIN="Versione del plugin: %s"
diff --git a/admin/language/nl-NL/nl-NL.com_bfstop.ini b/admin/language/nl-NL/nl-NL.com_bfstop.ini
index 7aae294..0819703 100644
--- a/admin/language/nl-NL/nl-NL.com_bfstop.ini
+++ b/admin/language/nl-NL/nl-NL.com_bfstop.ini
@@ -7,19 +7,18 @@ COM_BFSTOP_HEADING_DURATION="Tijdsduur"
COM_BFSTOP_HEADING_STATE="Status"
COM_BFSTOP_HEADING_USERNAME="Gebruikersnaam"
COM_BFSTOP_HEADING_ORIGIN="Oorsprong"
-BLOCKED_UNTIL="Geblokkeerd tot %s"
-BLOCKED_PERMANENTLY="Permanent geblokkeerd"
-BLOCK_EXPIRED_AT="Blokkade verloopt op %s"
-UNBLOCKED_STATE="Gedeblokkeerd op %s"
-UNBLOCK_SUCCESS="Met succes gedeblokkeerd!"
-UNBLOCK_FAILED="Deblokkeren is mislukt."
-UNBLOCK_INVALIDID="Ongeldige id(s): %s."
+COM_BFSTOP_BLOCKED_UNTIL="Geblokkeerd tot %s"
+COM_BFSTOP_BLOCKED_PERMANENTLY="Permanent geblokkeerd"
+COM_BFSTOP_BLOCK_EXPIRED_AT="Blokkade verloopt op %s"
+COM_BFSTOP_UNBLOCKED_STATE="Gedeblokkeerd op %s"
+COM_BFSTOP_UNBLOCK_SUCCESS="Met succes gedeblokkeerd!"
+COM_BFSTOP_UNBLOCK_FAILED="Deblokkeren is mislukt."
COM_BFSTOP_SUBMENU_BLOCKLIST="Geblokkeerde IPs"
COM_BFSTOP_SUBMENU_FAILEDLOGINLIST="Mislukte logins"
COM_BFSTOP_SUBMENU_SETTINGS="Instellingen"
COM_BFSTOP_HEADING_BLOCKLIST="Brute Force Stop: Geblokkeerde IPs"
COM_BFSTOP_HEADING_FAILEDLOGINLIST="Brute Force Stop: Mislukte logins"
-WARNING_ADMIN_USER_EXISTS="Superuser gebruikt de default gebruikersnaam 'admin'. Dit is een gevaar voor de veiligheid. Aanvallers weten dat deze gebruikersnaam in vele Joomla-installaties bestaat wordt daarom vaak gebruikt in aanvallen. Om een betere veiligheid te krijgen is het beter de gebruikersnaam van de admin te veranderen of deze te verwijderen (als een andere gebruiker de SuperAdmin rechten heeft). Zie ook: Joomla! Security and Performance FAQ: Why should I immediately change the name of the default admin user after a new install?"
+COM_BFSTOP_WARNING_ADMIN_USER_EXISTS="Superuser gebruikt de default gebruikersnaam 'admin'. Dit is een gevaar voor de veiligheid. Aanvallers weten dat deze gebruikersnaam in vele Joomla-installaties bestaat wordt daarom vaak gebruikt in aanvallen. Om een betere veiligheid te krijgen is het beter de gebruikersnaam van de admin te veranderen of deze te verwijderen (als een andere gebruiker de SuperAdmin rechten heeft). Zie ook: Joomla! Security and Performance FAQ: Why should I immediately change the name of the default admin user after a new install?"
COM_BFSTOP_BLOCK_NEW="Toevoegen"
COM_BFSTOP_BLOCK_EDIT="Wijzigen"
COM_BFSTOP_BLOCK_DETAILS="Details"
@@ -29,11 +28,11 @@ COM_BFSTOP_DESC_BLOCK_CRDATE="De datum/tijd dat de blokkade moet ingaan."
COM_BFSTOP_DESC_ALLOWLIST_IPADDRESS="Het IP adres of subnet die altijd toegang hebben tot deze site. Hier opgevoerde adressen kunnen op geen enkele manier geblokkeerd worden door controles van de plugin. Subnets worden opgegeven in de in CIDR suffix notatie. Bijvoorbeeld in de vorm van een / zoals '192.168.0.0/24'."
;COM_BFSTOP_DESC_ALLOWLIST_NOTES=""
COM_BFSTOP_DESC_DURATION="De duur van de blokkade"
-TEST_MAIL_BODY="Dit is een testbericht via site '%s' van de Brute Force Stop (bfstop) Joomla plugin."
-TEST_MAIL_SUBJECT="%s: BFStop testbericht"
-TEST_NOTIFICATION="Verstuur testbericht"
-TEST_NOTIFICATION_SUCCESS="Het versturen van het testbericht lijkt te zijn geslaagd. Controleer dat u ook een E-mail op bovengenoemde adres(sen) ontvangt!"
-TEST_NOTIFICATION_FAILED="Het versturen van het testbericht is mislukt (%s)! Controleer de configuratie-parameters van de kennisgeving van deze plugin en met name de opgegeven e-mailadres(sen) of gebruikersgroep. Controleer zonodig ook uw e-mailadres in de Joomla configuratie."
+COM_BFSTOP_TEST_MAIL_BODY="Dit is een testbericht via site '%s' van de Brute Force Stop (bfstop) Joomla plugin."
+COM_BFSTOP_TEST_MAIL_SUBJECT="%s: BFStop testbericht"
+COM_BFSTOP_TEST_NOTIFICATION="Verstuur testbericht"
+COM_BFSTOP_TEST_NOTIFICATION_SUCCESS="Het versturen van het testbericht lijkt te zijn geslaagd. Controleer dat u ook een E-mail op bovengenoemde adres(sen) ontvangt!"
+COM_BFSTOP_TEST_NOTIFICATION_FAILED="Het versturen van het testbericht is mislukt (%s)! Controleer de configuratie-parameters van de kennisgeving van deze plugin en met name de opgegeven e-mailadres(sen) of gebruikersgroep. Controleer zonodig ook uw e-mailadres in de Joomla configuratie."
COM_BFSTOP_SETTINGS_VERSION_FIELDSET_LABEL="Over"
COM_BFSTOP_SETTINGS_VERSION_COMPONENT="Componentversie: %s"
COM_BFSTOP_SETTINGS_VERSION_PLUGIN="Pluginversie: %s"
diff --git a/admin/language/ru-RU/ru-RU.com_bfstop.ini b/admin/language/ru-RU/ru-RU.com_bfstop.ini
index 7e479bb..04ebaa4 100644
--- a/admin/language/ru-RU/ru-RU.com_bfstop.ini
+++ b/admin/language/ru-RU/ru-RU.com_bfstop.ini
@@ -7,19 +7,18 @@ COM_BFSTOP_HEADING_DURATION="Длительность"
COM_BFSTOP_HEADING_STATE="Статус"
COM_BFSTOP_HEADING_USERNAME="Имя пользователя"
COM_BFSTOP_HEADING_ORIGIN="Источник"
-BLOCKED_UNTIL="Заблокирован до %s"
-BLOCKED_PERMANENTLY="Заблокирован навсегда"
-BLOCK_EXPIRED_AT="Блокировка истекает в %s"
-UNBLOCKED_STATE="Разблокирован в %s"
-UNBLOCK_SUCCESS="Разблокировка прошла успешно!"
-UNBLOCK_FAILED="Разблокировка не удалась."
-UNBLOCK_INVALIDID="Неправильный id: %s."
+COM_BFSTOP_BLOCKED_UNTIL="Заблокирован до %s"
+COM_BFSTOP_BLOCKED_PERMANENTLY="Заблокирован навсегда"
+COM_BFSTOP_BLOCK_EXPIRED_AT="Блокировка истекает в %s"
+COM_BFSTOP_UNBLOCKED_STATE="Разблокирован в %s"
+COM_BFSTOP_UNBLOCK_SUCCESS="Разблокировка прошла успешно!"
+COM_BFSTOP_UNBLOCK_FAILED="Разблокировка не удалась."
COM_BFSTOP_SUBMENU_BLOCKLIST="Заблокированные IP"
COM_BFSTOP_SUBMENU_FAILEDLOGINLIST="Неудачные попытки входа"
COM_BFSTOP_SUBMENU_SETTINGS="Настройки"
COM_BFSTOP_HEADING_BLOCKLIST="Brute Force Stop: Заблокированные IP"
COM_BFSTOP_HEADING_FAILEDLOGINLIST="Brute Force Stop: Неудачные попытки входа"
-WARNING_ADMIN_USER_EXISTS="Супер администратор использует по умолчанию имя пользователя 'admin'. Это риск для безопасности; хакеры используют это имя пользователя очень часто для взлома. Для повышения безопасности рекомендуется изменить имя пользователя для супер администратора! Смотри также: Joomla! FAQ Безопасность и производительность: Почему я должен немедленно изменить имя пользователя администратора по умолчанию после установки Joomla?"
+COM_BFSTOP_WARNING_ADMIN_USER_EXISTS="Супер администратор использует по умолчанию имя пользователя 'admin'. Это риск для безопасности; хакеры используют это имя пользователя очень часто для взлома. Для повышения безопасности рекомендуется изменить имя пользователя для супер администратора! Смотри также: Joomla! FAQ Безопасность и производительность: Почему я должен немедленно изменить имя пользователя администратора по умолчанию после установки Joomla?"
COM_BFSTOP_BLOCK_NEW="Добавить"
COM_BFSTOP_BLOCK_EDIT="Редактировать"
COM_BFSTOP_BLOCK_DETAILS="Детали"
@@ -27,11 +26,11 @@ COM_BFSTOP_UNBLOCK="Разблокировать"
COM_BFSTOP_DESC_BLOCK_IPADDRESS="Заблокированный IP адрес"
COM_BFSTOP_DESC_BLOCK_CRDATE="Начало блокировки (дата/время)"
COM_BFSTOP_DESC_DURATION="Продолжительность блокировки"
-TEST_MAIL_BODY="Это тестовое сообщение плагина Brute Force Stop (bfstop) отправлено с сайта '%s' "
-TEST_MAIL_SUBJECT="%s: BFStop тестовое сообщение"
-TEST_NOTIFICATION="Тестовое сообщение"
-TEST_NOTIFICATION_SUCCESS="Отправка тестового сообщения произведена успешно. Пожалуйста, проверьте, получили ли вы письмо по вышеуказанному адресу!"
-TEST_NOTIFICATION_FAILED="Ошибка при отправке тестового сообщения (%s)! Пожалуйста, проверьте настройки электронной почты в конфигурации Joomla!, а также настройки отправки емаил сообщений и адрес получателя bfstop плагина."
+COM_BFSTOP_TEST_MAIL_BODY="Это тестовое сообщение плагина Brute Force Stop (bfstop) отправлено с сайта '%s' "
+COM_BFSTOP_TEST_MAIL_SUBJECT="%s: BFStop тестовое сообщение"
+COM_BFSTOP_TEST_NOTIFICATION="Тестовое сообщение"
+COM_BFSTOP_TEST_NOTIFICATION_SUCCESS="Отправка тестового сообщения произведена успешно. Пожалуйста, проверьте, получили ли вы письмо по вышеуказанному адресу!"
+COM_BFSTOP_TEST_NOTIFICATION_FAILED="Ошибка при отправке тестового сообщения (%s)! Пожалуйста, проверьте настройки электронной почты в конфигурации Joomla!, а также настройки отправки емаил сообщений и адрес получателя bfstop плагина."
COM_BFSTOP_SETTINGS_VERSION_FIELDSET_LABEL="О программе"
COM_BFSTOP_SETTINGS_VERSION_COMPONENT="Версия компонента: %s"
COM_BFSTOP_SETTINGS_VERSION_PLUGIN="Версия плагина: %s"
diff --git a/admin/src/Controller/SettingsController.php b/admin/src/Controller/SettingsController.php
index 6238c72..f4b12e7 100644
--- a/admin/src/Controller/SettingsController.php
+++ b/admin/src/Controller/SettingsController.php
@@ -80,16 +80,16 @@ public function testNotify()
}
else
{
- $subject = Text::sprintf('TEST_MAIL_SUBJECT', $notifier->getSiteName());
- $body = Text::sprintf('TEST_MAIL_BODY', $notifier->getSiteName());
+ $subject = Text::sprintf('COM_BFSTOP_TEST_MAIL_SUBJECT', $notifier->getSiteName());
+ $body = Text::sprintf('COM_BFSTOP_TEST_MAIL_BODY', $notifier->getSiteName());
$result = $notifier->sendMail($subject, $body, $notifier->getNotifyAddresses());
}
$success = ($result === true);
// redirect back to settings view:
$this->setRedirect(Route::_('index.php?option=com_bfstop&view=settings', false),
$success
- ? Text::_('TEST_NOTIFICATION_SUCCESS')
- : Text::sprintf('TEST_NOTIFICATION_FAILED', $result),
+ ? Text::_('COM_BFSTOP_TEST_NOTIFICATION_SUCCESS')
+ : Text::sprintf('COM_BFSTOP_TEST_NOTIFICATION_FAILED', $result),
$result
? 'notice'
: 'error'
diff --git a/admin/src/Model/BlocklistModel.php b/admin/src/Model/BlocklistModel.php
index 13aef8c..fe5ac93 100644
--- a/admin/src/Model/BlocklistModel.php
+++ b/admin/src/Model/BlocklistModel.php
@@ -60,11 +60,11 @@ public function unblock($ids, $logger)
{
if (UnblockHelper::unblockDB(Factory::getDbo(), $ids, 0, $logger))
{
- return Text::_("UNBLOCK_SUCCESS");
+ return Text::_("COM_BFSTOP_UNBLOCK_SUCCESS");
}
else
{
- return Text::_("UNBLOCK_FAILED");
+ return Text::_("COM_BFSTOP_UNBLOCK_FAILED");
}
}
diff --git a/admin/src/Model/HtblocklistModel.php b/admin/src/Model/HtblocklistModel.php
index 10cb02d..235ff57 100644
--- a/admin/src/Model/HtblocklistModel.php
+++ b/admin/src/Model/HtblocklistModel.php
@@ -92,11 +92,11 @@ public function unblock($ids, $logger)
{
if (UnblockHelper::unblockHtaccess($ids, $logger))
{
- return Text::_("UNBLOCK_SUCCESS");
+ return Text::_("COM_BFSTOP_UNBLOCK_SUCCESS");
}
else
{
- return Text::_("UNBLOCK_FAILED");
+ return Text::_("COM_BFSTOP_UNBLOCK_FAILED");
}
}
diff --git a/admin/src/View/Blocklist/HtmlView.php b/admin/src/View/Blocklist/HtmlView.php
index 4cc1139..c207ebe 100644
--- a/admin/src/View/Blocklist/HtmlView.php
+++ b/admin/src/View/Blocklist/HtmlView.php
@@ -37,13 +37,13 @@ function getBlockedState($item)
{
if ($item->unblocked != null)
{
- return Text::sprintf('UNBLOCKED_STATE', $item->unblocked);
+ return Text::sprintf('COM_BFSTOP_UNBLOCKED_STATE', $item->unblocked);
}
else
{
if ($item->duration == 0)
{
- return Text::_('BLOCKED_PERMANENTLY');
+ return Text::_('COM_BFSTOP_BLOCKED_PERMANENTLY');
}
else
{
@@ -51,8 +51,8 @@ function getBlockedState($item)
$blockedUntil += $item->duration * 60;
$strDate = date('Y-m-d H:i:s', $blockedUntil);
return ($blockedUntil < time())
- ? Text::sprintf('BLOCK_EXPIRED_AT', $strDate)
- : Text::sprintf('BLOCKED_UNTIL', $strDate);
+ ? Text::sprintf('COM_BFSTOP_BLOCK_EXPIRED_AT', $strDate)
+ : Text::sprintf('COM_BFSTOP_BLOCKED_UNTIL', $strDate);
}
}
}
diff --git a/admin/src/View/Htblocklist/HtmlView.php b/admin/src/View/Htblocklist/HtmlView.php
index 5961ec4..d29bc5d 100644
--- a/admin/src/View/Htblocklist/HtmlView.php
+++ b/admin/src/View/Htblocklist/HtmlView.php
@@ -33,13 +33,13 @@ function getBlockedState($item)
{
if ($item->unblocked != null)
{
- return Text::sprintf('UNBLOCKED_STATE', $item->unblocked);
+ return Text::sprintf('COM_BFSTOP_UNBLOCKED_STATE', $item->unblocked);
}
else
{
if ($item->duration == 0)
{
- return Text::_('BLOCKED_PERMANENTLY');
+ return Text::_('COM_BFSTOP_BLOCKED_PERMANENTLY');
}
else
{
@@ -47,8 +47,8 @@ function getBlockedState($item)
$blockedUntil += $item->duration * 60;
$strDate = date('Y-m-d H:i:s', $blockedUntil);
return ($blockedUntil < time())
- ? Text::sprintf('BLOCK_EXPIRED_AT', $strDate)
- : Text::sprintf('BLOCKED_UNTIL', $strDate);
+ ? Text::sprintf('COM_BFSTOP_BLOCK_EXPIRED_AT', $strDate)
+ : Text::sprintf('COM_BFSTOP_BLOCKED_UNTIL', $strDate);
}
}
}
diff --git a/admin/src/View/Settings/HtmlView.php b/admin/src/View/Settings/HtmlView.php
index 1d67d1b..5db1b79 100644
--- a/admin/src/View/Settings/HtmlView.php
+++ b/admin/src/View/Settings/HtmlView.php
@@ -59,7 +59,7 @@ protected function addToolbar()
}
ToolbarHelper::cancel('settings.cancel');
ToolbarHelper::custom('settings.testNotify', 'preview', '',
- 'TEST_NOTIFICATION', false, false);
+ 'COM_BFSTOP_TEST_NOTIFICATION', false, false);
BfstopToolbarHelper::addOptions();
}
}
diff --git a/site/language/ca-ES/ca-ES.com_bfstop.ini b/site/language/ca-ES/ca-ES.com_bfstop.ini
index c0ce36a..2472977 100644
--- a/site/language/ca-ES/ca-ES.com_bfstop.ini
+++ b/site/language/ca-ES/ca-ES.com_bfstop.ini
@@ -1,6 +1,6 @@
;traducció feta per nouespai 08-06-2013
-UNBLOCKTOKEN_HEADING="Desbloquejar per Token"
-UNBLOCKTOKEN_FAILED="No es pot desbloquejar. El token no era vàlid, ja ha caducat o ha ocorregut un error. Posa't en contacte amb l'administrador del sistema."
-UNBLOCKTOKEN_SUCCESS="S'ha desbloquejat amb èxit la teva adreça IP. Si creus que ja saps les dades del teu compte, pots intentar de nou iniciar la sessió a la Pàgina d'ingrés però seràs bloquejat de nou si introdueixes el teu nom d'usuari o contrasenya incorrectament de nou diverses vegades. També pots utilitzar la funcionalitat de Restablir contrasenya per rebre instruccions per correu electrònic per restablir-la."
-UNBLOCKTOKEN_INVALID="Desbloqueig no vàlid!"
+COM_BFSTOP_UNBLOCKTOKEN_HEADING="Desbloquejar per Token"
+COM_BFSTOP_UNBLOCKTOKEN_FAILED="No es pot desbloquejar. El token no era vàlid, ja ha caducat o ha ocorregut un error. Posa't en contacte amb l'administrador del sistema."
+COM_BFSTOP_UNBLOCKTOKEN_SUCCESS="S'ha desbloquejat amb èxit la teva adreça IP. Si creus que ja saps les dades del teu compte, pots intentar de nou iniciar la sessió a la Pàgina d'ingrés però seràs bloquejat de nou si introdueixes el teu nom d'usuari o contrasenya incorrectament de nou diverses vegades. També pots utilitzar la funcionalitat de Restablir contrasenya per rebre instruccions per correu electrònic per restablir-la."
+COM_BFSTOP_UNBLOCKTOKEN_INVALID="Desbloqueig no vàlid!"
diff --git a/site/language/de-DE/de-DE.com_bfstop.ini b/site/language/de-DE/de-DE.com_bfstop.ini
index 556aaf5..3b7db4f 100644
--- a/site/language/de-DE/de-DE.com_bfstop.ini
+++ b/site/language/de-DE/de-DE.com_bfstop.ini
@@ -1,4 +1,4 @@
-UNBLOCKTOKEN_HEADING="Entsperren via Token"
-UNBLOCKTOKEN_FAILED="Entsperren fehlgeschlagen. Entweder war das angegebene Token ungültig, es ist bereits abgelaufen, oder es ist ein Fehler aufgetreten. Bitte kontaktiere den System-Administrator."
-UNBLOCKTOKEN_SUCCESS="Das Entsperren deiner IP-Adresse war erfolgreich. Wenn du meinst, deine Login-Daten nun wieder zu wissen, dann logge dich über die Login-Seite ein. Du wirst allerdings erneut gesperrt werden, solltest du zu oft einen falschen Benutzernamen/Passwort eingeben. Alternativ kannst du die Funktion zum Passwort zurücksetzen benutzen."
-UNBLOCKTOKEN_INVALID="Ungültiger Aufruf!"
+COM_BFSTOP_UNBLOCKTOKEN_HEADING="Entsperren via Token"
+COM_BFSTOP_UNBLOCKTOKEN_FAILED="Entsperren fehlgeschlagen. Entweder war das angegebene Token ungültig, es ist bereits abgelaufen, oder es ist ein Fehler aufgetreten. Bitte kontaktiere den System-Administrator."
+COM_BFSTOP_UNBLOCKTOKEN_SUCCESS="Das Entsperren deiner IP-Adresse war erfolgreich. Wenn du meinst, deine Login-Daten nun wieder zu wissen, dann logge dich über die Login-Seite ein. Du wirst allerdings erneut gesperrt werden, solltest du zu oft einen falschen Benutzernamen/Passwort eingeben. Alternativ kannst du die Funktion zum Passwort zurücksetzen benutzen."
+COM_BFSTOP_UNBLOCKTOKEN_INVALID="Ungültiger Aufruf!"
diff --git a/site/language/en-GB/en-GB.com_bfstop.ini b/site/language/en-GB/en-GB.com_bfstop.ini
index f06ac71..d99d27f 100644
--- a/site/language/en-GB/en-GB.com_bfstop.ini
+++ b/site/language/en-GB/en-GB.com_bfstop.ini
@@ -1,4 +1,4 @@
-UNBLOCKTOKEN_HEADING="Unblock by Token"
-UNBLOCKTOKEN_FAILED="Could not unblock. Either the token was invalid, it has already expired or an error has occurred. Please contact the system administrator."
-UNBLOCKTOKEN_SUCCESS="Successfully unblocked your IP address. If you think you now know your account data, you can try again to log in on the Login Page. But you will be blocked again if you enter your username/password wrong again multiple times. You can also use the Reset password functionality to have password reset instructions sent to your email address."
-UNBLOCKTOKEN_INVALID="Invalid call!"
+COM_BFSTOP_UNBLOCKTOKEN_HEADING="Unblock by Token"
+COM_BFSTOP_UNBLOCKTOKEN_FAILED="Could not unblock. Either the token was invalid, it has already expired or an error has occurred. Please contact the system administrator."
+COM_BFSTOP_UNBLOCKTOKEN_SUCCESS="Successfully unblocked your IP address. If you think you now know your account data, you can try again to log in on the Login Page. But you will be blocked again if you enter your username/password wrong again multiple times. You can also use the Reset password functionality to have password reset instructions sent to your email address."
+COM_BFSTOP_UNBLOCKTOKEN_INVALID="Invalid call!"
diff --git a/site/language/es-ES/es-ES.com_bfstop.ini b/site/language/es-ES/es-ES.com_bfstop.ini
index e693b3e..4f49573 100644
--- a/site/language/es-ES/es-ES.com_bfstop.ini
+++ b/site/language/es-ES/es-ES.com_bfstop.ini
@@ -1,4 +1,4 @@
-UNBLOCKTOKEN_HEADING="Unblock by Token"
-UNBLOCKTOKEN_FAILED="No puede desbloquear. La señal era inválida, ya ha expirado o ha ocurrido un error. Por favor póngase en contacto con el administrador de sistema."
-UNBLOCKTOKEN_SUCCESS="Su IP ha sido desbloqueado. Si sabe sus datos de cuenta, puede intentar conectarse en Login Page. Pero usted será bloqueado otra vez si entra en su username/password mal múltiples veces. Usted también puede usar el Reset password funcionalidad para la renovación de contraseña enviadas a su dirección de correo electrónico."
-UNBLOCKTOKEN_INVALID="Llamada inválida!"
+COM_BFSTOP_UNBLOCKTOKEN_HEADING="Unblock by Token"
+COM_BFSTOP_UNBLOCKTOKEN_FAILED="No puede desbloquear. La señal era inválida, ya ha expirado o ha ocurrido un error. Por favor póngase en contacto con el administrador de sistema."
+COM_BFSTOP_UNBLOCKTOKEN_SUCCESS="Su IP ha sido desbloqueado. Si sabe sus datos de cuenta, puede intentar conectarse en Login Page. Pero usted será bloqueado otra vez si entra en su username/password mal múltiples veces. Usted también puede usar el Reset password funcionalidad para la renovación de contraseña enviadas a su dirección de correo electrónico."
+COM_BFSTOP_UNBLOCKTOKEN_INVALID="Llamada inválida!"
diff --git a/site/language/fr-FR/fr-FR.com_bfstop.ini b/site/language/fr-FR/fr-FR.com_bfstop.ini
index bb7b961..b58828d 100644
--- a/site/language/fr-FR/fr-FR.com_bfstop.ini
+++ b/site/language/fr-FR/fr-FR.com_bfstop.ini
@@ -2,7 +2,7 @@
; Encodage UTF-8 - No BOM
; fichier de traduction pour ./components/
-UNBLOCKTOKEN_HEADING="Déblocage d'adresse IP"
-UNBLOCKTOKEN_FAILED="Le déblocage n'a pas pu être réalisé. Merci de contacter le Webmestre."
-UNBLOCKTOKEN_SUCCESS="Votre adresse IP a été débloquée. Si vous vous souvenez de vos codes d'accès, vous pouvez désormais vous connecter ici : Connection. Veuillez noter que votre adresse IP sera de nouveau bloquée si vous utilisez plusieurs fois de suite des codes d'accès erronés. Si vous ne vous souvenez plus de votre mot de passe, nous vous rappelons que vous pouvez utiliser l'option de Réinitialisation de votre mot de passe et suivre les instructions qui vous seront transmises à votre adresse électronique."
-UNBLOCKTOKEN_INVALID="Appel invalide!"
+COM_BFSTOP_UNBLOCKTOKEN_HEADING="Déblocage d'adresse IP"
+COM_BFSTOP_UNBLOCKTOKEN_FAILED="Le déblocage n'a pas pu être réalisé. Merci de contacter le Webmestre."
+COM_BFSTOP_UNBLOCKTOKEN_SUCCESS="Votre adresse IP a été débloquée. Si vous vous souvenez de vos codes d'accès, vous pouvez désormais vous connecter ici : Connection. Veuillez noter que votre adresse IP sera de nouveau bloquée si vous utilisez plusieurs fois de suite des codes d'accès erronés. Si vous ne vous souvenez plus de votre mot de passe, nous vous rappelons que vous pouvez utiliser l'option de Réinitialisation de votre mot de passe et suivre les instructions qui vous seront transmises à votre adresse électronique."
+COM_BFSTOP_UNBLOCKTOKEN_INVALID="Appel invalide!"
diff --git a/site/language/it-IT.com_bfstop.ini b/site/language/it-IT.com_bfstop.ini
deleted file mode 100644
index 012d51e..0000000
--- a/site/language/it-IT.com_bfstop.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-UNBLOCKTOKEN_HEADING="Sblocca con codice-Token"
-UNBLOCKTOKEN_FAILED="Impossibile sbloccare. O il token non è valido, è già scaduto o è avvenuto un errore. Si prega di contattare l'amministratore di sistema."
-UNBLOCKTOKEN_SUCCESS="Il tuo IP è stato sbloccato con successo. Se pensi di ricordare i tuoi dati di accesso, puoi provare nuovamente il login sulla pagina di login. Ma se immetterai più volte nome utente / password sbagliati il tuo IP verrà bloccato di nuovo. È inoltre possibile utilizzare la funzione Ripristina password a> per ricevere sul tuo indirizzo email le istruzioni per reimpostare la password."
-UNBLOCKTOKEN_INVALID="Chiamata invalida!"
diff --git a/site/language/it-IT/index.html b/site/language/it-IT/index.html
new file mode 100644
index 0000000..0dc101b
--- /dev/null
+++ b/site/language/it-IT/index.html
@@ -0,0 +1 @@
+
diff --git a/site/language/it-IT/it-IT.com_bfstop.ini b/site/language/it-IT/it-IT.com_bfstop.ini
new file mode 100644
index 0000000..ccdce8e
--- /dev/null
+++ b/site/language/it-IT/it-IT.com_bfstop.ini
@@ -0,0 +1,4 @@
+COM_BFSTOP_UNBLOCKTOKEN_HEADING="Sblocca con codice-Token"
+COM_BFSTOP_UNBLOCKTOKEN_FAILED="Impossibile sbloccare. O il token non è valido, è già scaduto o è avvenuto un errore. Si prega di contattare l'amministratore di sistema."
+COM_BFSTOP_UNBLOCKTOKEN_SUCCESS="Il tuo IP è stato sbloccato con successo. Se pensi di ricordare i tuoi dati di accesso, puoi provare nuovamente il login sulla pagina di login. Ma se immetterai più volte nome utente / password sbagliati il tuo IP verrà bloccato di nuovo. È inoltre possibile utilizzare la funzione Ripristina password a> per ricevere sul tuo indirizzo email le istruzioni per reimpostare la password."
+COM_BFSTOP_UNBLOCKTOKEN_INVALID="Chiamata invalida!"
diff --git a/site/language/nl-NL/nl-NL.com_bfstop.ini b/site/language/nl-NL/nl-NL.com_bfstop.ini
index e3bd055..33c0b31 100644
--- a/site/language/nl-NL/nl-NL.com_bfstop.ini
+++ b/site/language/nl-NL/nl-NL.com_bfstop.ini
@@ -1,4 +1,4 @@
-UNBLOCKTOKEN_HEADING="Blokkering opheffen via een Token"
-UNBLOCKTOKEN_FAILED="Kon niet deblokkeren. Ofwel het token is ongeldig, het al is verlopen of er is een fout opgetreden. Neem contact op met de systeembeheerder."
-UNBLOCKTOKEN_SUCCESS="Uw IP-adres is met succes gedeblokkeerd. Als u denkt uw goede account-gegevens te weten, kunt u opnieuw proberen om in te loggen op de Login Pagina. Maar u zult opnieuw worden geblokkeerd als u uw gebruikersnaam/wachtwoord weer meerdere keren verkeerd ingevoerd worden. U kunt ook de Reset password functionaliteit gebruiken om de wachtwoord reset instructies te versturen naar uw e-mailadres."
-UNBLOCKTOKEN_INVALID="Ongeldige aanroep!"
+COM_BFSTOP_UNBLOCKTOKEN_HEADING="Blokkering opheffen via een Token"
+COM_BFSTOP_UNBLOCKTOKEN_FAILED="Kon niet deblokkeren. Ofwel het token is ongeldig, het al is verlopen of er is een fout opgetreden. Neem contact op met de systeembeheerder."
+COM_BFSTOP_UNBLOCKTOKEN_SUCCESS="Uw IP-adres is met succes gedeblokkeerd. Als u denkt uw goede account-gegevens te weten, kunt u opnieuw proberen om in te loggen op de Login Pagina. Maar u zult opnieuw worden geblokkeerd als u uw gebruikersnaam/wachtwoord weer meerdere keren verkeerd ingevoerd worden. U kunt ook de Reset password functionaliteit gebruiken om de wachtwoord reset instructies te versturen naar uw e-mailadres."
+COM_BFSTOP_UNBLOCKTOKEN_INVALID="Ongeldige aanroep!"
diff --git a/site/language/ru-RU/ru-RU.com_bfstop.ini b/site/language/ru-RU/ru-RU.com_bfstop.ini
index 93db3b1..dfa1752 100644
--- a/site/language/ru-RU/ru-RU.com_bfstop.ini
+++ b/site/language/ru-RU/ru-RU.com_bfstop.ini
@@ -1,4 +1,4 @@
-UNBLOCKTOKEN_HEADING="Разблокировка по токену"
-UNBLOCKTOKEN_FAILED="Разблокировка не удалась. Либо токен был недействительным, либо время его жизни истекло или произошла ошибка. Пожалуйста, свяжитесь с администратором веб-сайта."
-UNBLOCKTOKEN_SUCCESS="Ваш IP адрес успешно разблокирован. Если вы помните данные вашего аккаунта, то сможете войти на сайт обычным способом через страницу авторизации. Но если вы опять введете логин и пароль неправильно несколько раз, то будете заблокированы снова. Вы также можете воспользоваться сбросом пароля."
-UNBLOCKTOKEN_INVALID="Ошибка вызова!"
+COM_BFSTOP_UNBLOCKTOKEN_HEADING="Разблокировка по токену"
+COM_BFSTOP_UNBLOCKTOKEN_FAILED="Разблокировка не удалась. Либо токен был недействительным, либо время его жизни истекло или произошла ошибка. Пожалуйста, свяжитесь с администратором веб-сайта."
+COM_BFSTOP_UNBLOCKTOKEN_SUCCESS="Ваш IP адрес успешно разблокирован. Если вы помните данные вашего аккаунта, то сможете войти на сайт обычным способом через страницу авторизации. Но если вы опять введете логин и пароль неправильно несколько раз, то будете заблокированы снова. Вы также можете воспользоваться сбросом пароля."
+COM_BFSTOP_UNBLOCKTOKEN_INVALID="Ошибка вызова!"
diff --git a/site/src/View/Tokenunblock/HtmlView.php b/site/src/View/Tokenunblock/HtmlView.php
index 074bce5..0110613 100644
--- a/site/src/View/Tokenunblock/HtmlView.php
+++ b/site/src/View/Tokenunblock/HtmlView.php
@@ -42,14 +42,14 @@ function display($tpl = null)
$this->model = $this->getModel();
$unblockSuccess = $this->model->unblock($token, $logger);
$this->message = ($unblockSuccess)
- ? Text::sprintf('UNBLOCKTOKEN_SUCCESS',
+ ? Text::sprintf('COM_BFSTOP_UNBLOCKTOKEN_SUCCESS',
$this->getLoginLink(),
$this->getPasswordResetLink())
- : Text::_('UNBLOCKTOKEN_FAILED');
+ : Text::_('COM_BFSTOP_UNBLOCKTOKEN_FAILED');
}
else
{
- $this->message = Text::_('UNBLOCKTOKEN_INVALID');
+ $this->message = Text::_('COM_BFSTOP_UNBLOCKTOKEN_INVALID');
}
parent::display($tpl);
}
diff --git a/site/tmpl/tokenunblock/default.php b/site/tmpl/tokenunblock/default.php
index 3157cc3..0eb4fe4 100644
--- a/site/tmpl/tokenunblock/default.php
+++ b/site/tmpl/tokenunblock/default.php
@@ -10,5 +10,5 @@
use Joomla\CMS\Language\Text;
?>
-
+
message; ?>
diff --git a/tests/lint/check-language.php b/tests/lint/check-language.php
new file mode 100644
index 0000000..e002888
--- /dev/null
+++ b/tests/lint/check-language.php
@@ -0,0 +1,144 @@
+ [...]
+ *
+ * Errors (exit code 1):
+ * - an .ini file which PHP/Joomla cannot parse
+ * - a key without one of the given prefixes (only if prefixes are given)
+ * - a file whose language tag does not match the folder it is in
+ * - a language file referenced in the manifest which does not exist
+ * Warnings (reported, but exit code 0):
+ * - keys present in en-GB but missing in a translation, or vice versa
+ *
+ * NOTE: this file is kept identical in the bfstop and com_bfstop repositories.
+**/
+
+if ($argc < 2)
+{
+ fwrite(STDERR, "Usage: php {$argv[0]} [...]\n");
+ exit(2);
+}
+
+$manifest = $argv[1];
+$prefixes = array_slice($argv, 2);
+$root = dirname(realpath($manifest));
+$errors = array();
+$warnings = array();
+
+// 1. every language file referenced in the manifest must exist
+$xml = simplexml_load_file($manifest);
+if ($xml === false)
+{
+ fwrite(STDERR, "ERROR: cannot parse manifest $manifest\n");
+ exit(1);
+}
+foreach ($xml->xpath('//languages') as $languages)
+{
+ $folder = (string) $languages['folder'];
+ foreach ($languages->language as $language)
+ {
+ $path = $root.'/'.($folder !== '' ? $folder.'/' : '').(string) $language;
+ if (!is_file($path))
+ {
+ $errors[] = "manifest references missing language file $path";
+ }
+ }
+}
+
+// 2. parse all .ini files, grouped by "|"
+$groups = array();
+$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($root, FilesystemIterator::SKIP_DOTS));
+foreach ($it as $file)
+{
+ $path = $file->getPathname();
+ if ($file->getExtension() !== 'ini' || preg_match('#/(vendor|node_modules|\.git)/#', $path))
+ {
+ continue;
+ }
+ $rel = substr($path, strlen($root) + 1);
+ if (!preg_match('/^([a-z]{2,3}-[A-Z]{2})\.(.+)$/', $file->getFilename(), $m))
+ {
+ $errors[] = "$rel: file name does not start with a language tag";
+ continue;
+ }
+ [, $tag, $base] = $m;
+ if (basename(dirname($path)) !== $tag)
+ {
+ $errors[] = "$rel: file for language $tag is not located in a $tag/ folder (Joomla will never load it)";
+ continue;
+ }
+
+ // Joomla parses language files like this (see LanguageHelper::parseIniFile)
+ $contents = str_replace('"_QQ_"', '\\"', file_get_contents($path));
+ $strings = @parse_ini_string($contents, false, INI_SCANNER_RAW);
+ if ($strings === false)
+ {
+ $err = error_get_last();
+ $errors[] = "$rel: cannot be parsed: ".($err['message'] ?? 'unknown error');
+ continue;
+ }
+ foreach (array_keys($strings) as $key)
+ {
+ $ok = count($prefixes) === 0;
+ foreach ($prefixes as $prefix)
+ {
+ if (str_starts_with($key, $prefix))
+ {
+ $ok = true;
+ break;
+ }
+ }
+ if (!$ok)
+ {
+ $errors[] = "$rel: key '$key' does not start with ".implode(' or ', $prefixes);
+ }
+ }
+ $groups[dirname($path, 2).'|'.$base][$tag] = array('rel' => $rel, 'keys' => array_keys($strings));
+}
+
+// 3. compare translations against en-GB
+foreach ($groups as $group => $langs)
+{
+ if (!isset($langs['en-GB']))
+ {
+ $warnings[] = "no en-GB reference file for group $group";
+ continue;
+ }
+ $reference = $langs['en-GB']['keys'];
+ foreach ($langs as $tag => $info)
+ {
+ if ($tag === 'en-GB')
+ {
+ continue;
+ }
+ $missing = array_diff($reference, $info['keys']);
+ $extra = array_diff($info['keys'], $reference);
+ if ($missing)
+ {
+ $warnings[] = $info['rel'].': '.count($missing).' key(s) missing (en-GB fallback is used): '.implode(', ', $missing);
+ }
+ if ($extra)
+ {
+ $warnings[] = $info['rel'].': '.count($extra).' key(s) not in en-GB (obsolete?): '.implode(', ', $extra);
+ }
+ }
+}
+
+$gha = getenv('GITHUB_ACTIONS') === 'true';
+foreach ($warnings as $w)
+{
+ echo ($gha ? '::warning::' : 'WARNING: ').$w."\n";
+}
+foreach ($errors as $e)
+{
+ echo ($gha ? '::error::' : 'ERROR: ').$e."\n";
+}
+echo count($errors).' error(s), '.count($warnings)." warning(s)\n";
+exit(count($errors) > 0 ? 1 : 0);
diff --git a/tests/lint/check-zip.php b/tests/lint/check-zip.php
new file mode 100644
index 0000000..f76bc38
--- /dev/null
+++ b/tests/lint/check-zip.php
@@ -0,0 +1,86 @@
+
+ *
+ * NOTE: this file is kept identical in the bfstop and com_bfstop repositories.
+**/
+
+if ($argc !== 3)
+{
+ fwrite(STDERR, "Usage: php {$argv[0]} \n");
+ exit(2);
+}
+[, $zipFile, $manifestName] = $argv;
+
+$zip = new ZipArchive();
+if ($zip->open($zipFile) !== true)
+{
+ fwrite(STDERR, "ERROR: cannot open $zipFile\n");
+ exit(1);
+}
+$entries = array();
+for ($i = 0; $i < $zip->numFiles; ++$i)
+{
+ $entries[] = rtrim($zip->getNameIndex($i), '/');
+}
+
+$manifest = $zip->getFromName($manifestName);
+if ($manifest === false)
+{
+ fwrite(STDERR, "ERROR: manifest $manifestName is not at the top level of $zipFile\n");
+ exit(1);
+}
+$xml = simplexml_load_string($manifest);
+
+$expected = array();
+$prefixed = function ($folder, $path) {
+ return ltrim(($folder !== '' ? $folder.'/' : '').$path, '/');
+};
+foreach ($xml->xpath('//files') as $files)
+{
+ $folder = (string) $files['folder'];
+ foreach ($files->children() as $child)
+ {
+ $expected[] = $prefixed($folder, (string) $child);
+ }
+}
+foreach ($xml->xpath('//languages') as $languages)
+{
+ foreach ($languages->language as $language)
+ {
+ $expected[] = $prefixed((string) $languages['folder'], (string) $language);
+ }
+}
+foreach ($xml->xpath('//scriptfile | //install/sql/file | //uninstall/sql/file | //update/schemas/schemapath') as $node)
+{
+ $expected[] = (string) $node;
+}
+
+$errors = 0;
+foreach ($expected as $path)
+{
+ $found = false;
+ foreach ($entries as $entry)
+ {
+ if ($entry === $path || str_starts_with($entry, $path.'/'))
+ {
+ $found = true;
+ break;
+ }
+ }
+ if (!$found)
+ {
+ echo (getenv('GITHUB_ACTIONS') === 'true' ? '::error::' : 'ERROR: ')."$zipFile is missing '$path' (referenced in $manifestName)\n";
+ ++$errors;
+ }
+}
+echo count($expected)." manifest entries checked, $errors missing\n";
+exit($errors > 0 ? 1 : 0);