diff --git a/Makefile b/Makefile index 051b602..d978709 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ XPI_FILE := LinkLog-$(EXTENSION_VERSION).xpi XPI_UNSIGNED_DIR := XPI/unsigned XPI_SIGNED_DIR := XPI/signed XPI_OUTPUT := $(XPI_UNSIGNED_DIR)/$(XPI_FILE) -EXTENSION_FILES := manifest.json logo.svg icon-16.png icon-32.png icon-48.png icon-96.png options.css options.html options.js popup.css popup.html popup.js l10n.js _locales/en-US/messages.json +EXTENSION_FILES := manifest.json logo.svg icon-16.png icon-32.png icon-48.png icon-96.png options.css options.html options.js popup.css popup.html popup.js l10n.js _locales/en-US/messages.json _locales/es/messages.json _locales/de/messages.json _locales/fr/messages.json _locales/nl/messages.json EXTENSION_SOURCES := $(addprefix webextension/,$(EXTENSION_FILES)) XPI_VALIDATOR := scripts/release/validate_xpi.py diff --git a/VIBE/CHAT_LOG.md b/VIBE/CHAT_LOG.md index 7315aa5..b5bb1b8 100644 --- a/VIBE/CHAT_LOG.md +++ b/VIBE/CHAT_LOG.md @@ -240,6 +240,12 @@ Localize the firefox plugin. ### Assistant outcome Added Firefox `browser.i18n` support with an `en-US` message catalog, localized popup and settings page labels and runtime messages, localized manifest metadata, and included the localization resources in XPI packaging and validation. +### User +Create a Spanish, German, French and Dutch locale. + +### Assistant outcome +Added complete Spanish (`es`), German (`de`), French (`fr`), and Dutch (`nl`) Firefox locale catalogs and updated XPI packaging and validation to include all four locales. + ### User Show the avatar with each entry on the home page. On the specific // page don't show the avatar and user name with each entry diff --git a/VIBE/PROMPTS.md b/VIBE/PROMPTS.md index 25caeac..540423c 100644 --- a/VIBE/PROMPTS.md +++ b/VIBE/PROMPTS.md @@ -126,6 +126,7 @@ 117. Continue to log interactions to the VIBE directory. 118. On the home page, when clicking on the avatar or the user, show the profile information. 119. Localize the firefox plugin. +120. Create a spanish, german, french and dutch locale. ## Future entries diff --git a/XPI/unsigned/LinkLog-0.1.0.xpi b/XPI/unsigned/LinkLog-0.1.0.xpi index d004638..0fe8b22 100644 Binary files a/XPI/unsigned/LinkLog-0.1.0.xpi and b/XPI/unsigned/LinkLog-0.1.0.xpi differ diff --git a/scripts/release/validate_xpi.py b/scripts/release/validate_xpi.py index 170e7e1..0f85f95 100644 --- a/scripts/release/validate_xpi.py +++ b/scripts/release/validate_xpi.py @@ -22,6 +22,10 @@ REQUIRED_FILES = { 'popup.js', 'l10n.js', '_locales/en-US/messages.json', + '_locales/es/messages.json', + '_locales/de/messages.json', + '_locales/fr/messages.json', + '_locales/nl/messages.json', } diff --git a/webextension/_locales/de/messages.json b/webextension/_locales/de/messages.json new file mode 100644 index 0000000..79ff2d9 --- /dev/null +++ b/webextension/_locales/de/messages.json @@ -0,0 +1,45 @@ +{ + "extensionName": {"message": "LinkLog"}, + "extensionDescription": {"message": "Webseiten-Links erfassen und an LinkLog senden."}, + "settingsTitle": {"message": "LinkLog-Einstellungen"}, + "titleLabel": {"message": "Titel"}, + "urlLabel": {"message": "URL"}, + "commentLabel": {"message": "Kommentar"}, + "commentPlaceholder": {"message": "Dein Kommentar"}, + "tagsLabel": {"message": "Tags"}, + "loadingTags": {"message": "Tags werden geladen..."}, + "newTagsPlaceholder": {"message": "#neuer-tag, #anderer-tag"}, + "saveLink": {"message": "Link speichern"}, + "settings": {"message": "Einstellungen"}, + "signOut": {"message": "Abmelden"}, + "backendUrlLabel": {"message": "Backend-URL"}, + "usernameLabel": {"message": "Benutzername"}, + "usernamePlaceholder": {"message": "alice"}, + "passwordLabel": {"message": "Passwort"}, + "saveAndLogIn": {"message": "Speichern und anmelden"}, + "thisPlugin": {"message": "Dieses Add-on"}, + "pluginDescription": {"message": "Dieses Add-on protokolliert Links auf einem LinkLog-Server, der sie auf einer Website und je nach Konfiguration der Add-ons möglicherweise auch in einem Fediverse-Dienst oder an anderen Orten veröffentlicht."}, + "accountRequirement": {"message": "Nutzer dieses Add-ons benötigen ein Konto auf einem LinkLog-Server"}, + "privacy": {"message": "Datenschutz"}, + "privacyDescription": {"message": "Dieses Add-on respektiert deine Privatsphäre und erhebt keine personenbezogenen Daten über das hinaus, was zum Protokollieren von Links auf deinem LinkLog-Server erforderlich ist."}, + "storedData": {"message": "Die URL, nach einem bestmöglichen Versuch, Tracking-Parameter zu entfernen, der Seitentitel, ein möglicher Kommentar und der Besuchszeitpunkt werden auf dem Server gespeichert und zusammen mit dem dort registrierten Nutzerprofil veröffentlicht."}, + "backendHeading": {"message": "LinkLog-Backend"}, + "backendDescription": {"message": "Die Backend-URL gehört zu einer selbst gehosteten LinkLog-Anwendung. Ihr"}, + "backendSource": {"message": "Quellcode ist im Repository verfügbar."}, + "copyright": {"message": "Copyright © 2026 Olaf Kolkman"}, + "repository": {"message": "Repository"}, + "signInToSelectTags": {"message": "Melde dich an, um vorhandene Tags auszuwählen."}, + "loadTagsFailed": {"message": "Vorhandene Tags konnten nicht geladen werden."}, + "submitting": {"message": "Wird gesendet..."}, + "configureAndLogIn": {"message": "Konfiguriere die Backend-URL und melde dich zuerst an."}, + "sessionExpired": {"message": "Sitzung abgelaufen. Authentifiziere dich in den Einstellungen erneut."}, + "submissionFailed": {"message": "Senden fehlgeschlagen"}, + "linkSaved": {"message": "Link erfolgreich gespeichert"}, + "submissionFailedConnection": {"message": "Senden fehlgeschlagen. Überprüfe die Verbindung zum Backend."}, + "loggedInAt": {"message": "$USERNAME$ ist bei $BACKEND$ angemeldet", "placeholders": {"username": {"content": "$1"}, "backend": {"content": "$2"}}}, + "fillAllFields": {"message": "Fülle alle Felder aus"}, + "loginFailed": {"message": "Anmeldung fehlgeschlagen"}, + "loggedInSuccessfully": {"message": "Erfolgreich angemeldet"}, + "unableToLogIn": {"message": "Anmeldung nicht möglich. Überprüfe Backend-URL und Zugangsdaten."}, + "signedOut": {"message": "Abgemeldet"} +} diff --git a/webextension/_locales/es/messages.json b/webextension/_locales/es/messages.json new file mode 100644 index 0000000..85cbc90 --- /dev/null +++ b/webextension/_locales/es/messages.json @@ -0,0 +1,45 @@ +{ + "extensionName": {"message": "LinkLog"}, + "extensionDescription": {"message": "Captura y envía enlaces de páginas a LinkLog."}, + "settingsTitle": {"message": "Configuración de LinkLog"}, + "titleLabel": {"message": "Título"}, + "urlLabel": {"message": "URL"}, + "commentLabel": {"message": "Comentario"}, + "commentPlaceholder": {"message": "Tu comentario"}, + "tagsLabel": {"message": "Etiquetas"}, + "loadingTags": {"message": "Cargando etiquetas..."}, + "newTagsPlaceholder": {"message": "#nueva-etiqueta, #otra-etiqueta"}, + "saveLink": {"message": "Guardar enlace"}, + "settings": {"message": "Configuración"}, + "signOut": {"message": "Cerrar sesión"}, + "backendUrlLabel": {"message": "URL del servidor"}, + "usernameLabel": {"message": "Nombre de usuario"}, + "usernamePlaceholder": {"message": "alice"}, + "passwordLabel": {"message": "Contraseña"}, + "saveAndLogIn": {"message": "Guardar e iniciar sesión"}, + "thisPlugin": {"message": "Este complemento"}, + "pluginDescription": {"message": "Este complemento registra enlaces en un servidor LinkLog, que los publicará en un sitio web y posiblemente en un servicio fediverso u otros destinos, según los complementos configurados."}, + "accountRequirement": {"message": "Los usuarios de este complemento necesitan una cuenta en un servidor LinkLog"}, + "privacy": {"message": "Privacidad"}, + "privacyDescription": {"message": "Este complemento respeta tu privacidad y no recopila datos personales más allá de lo necesario para registrar enlaces en tu servidor LinkLog."}, + "storedData": {"message": "La URL, tras intentar eliminar los parámetros de seguimiento, el título de la página, un posible comentario y la hora de visita se guardarán en el servidor y se harán públicos junto con el perfil del usuario registrado en el servidor."}, + "backendHeading": {"message": "Servidor LinkLog"}, + "backendDescription": {"message": "La URL del servidor es una aplicación LinkLog autoalojada. Consulta su"}, + "backendSource": {"message": "para ver el código fuente."}, + "copyright": {"message": "Copyright © 2026 Olaf Kolkman"}, + "repository": {"message": "Repositorio"}, + "signInToSelectTags": {"message": "Inicia sesión para seleccionar etiquetas existentes."}, + "loadTagsFailed": {"message": "No se pudieron cargar las etiquetas existentes."}, + "submitting": {"message": "Enviando..."}, + "configureAndLogIn": {"message": "Configura la URL del servidor e inicia sesión primero."}, + "sessionExpired": {"message": "La sesión ha caducado. Vuelve a autenticarte en la configuración."}, + "submissionFailed": {"message": "Error al enviar"}, + "linkSaved": {"message": "Enlace guardado correctamente"}, + "submissionFailedConnection": {"message": "Error al enviar. Comprueba la conexión con el servidor."}, + "loggedInAt": {"message": "$USERNAME$ ha iniciado sesión en $BACKEND$", "placeholders": {"username": {"content": "$1"}, "backend": {"content": "$2"}}}, + "fillAllFields": {"message": "Rellena todos los campos"}, + "loginFailed": {"message": "Error de inicio de sesión"}, + "loggedInSuccessfully": {"message": "Sesión iniciada correctamente"}, + "unableToLogIn": {"message": "No se pudo iniciar sesión. Comprueba la URL y las credenciales."}, + "signedOut": {"message": "Sesión cerrada"} +} diff --git a/webextension/_locales/fr/messages.json b/webextension/_locales/fr/messages.json new file mode 100644 index 0000000..d833e4c --- /dev/null +++ b/webextension/_locales/fr/messages.json @@ -0,0 +1,45 @@ +{ + "extensionName": {"message": "LinkLog"}, + "extensionDescription": {"message": "Capturer et envoyer des liens de pages à LinkLog."}, + "settingsTitle": {"message": "Paramètres de LinkLog"}, + "titleLabel": {"message": "Titre"}, + "urlLabel": {"message": "URL"}, + "commentLabel": {"message": "Commentaire"}, + "commentPlaceholder": {"message": "Votre commentaire"}, + "tagsLabel": {"message": "Étiquettes"}, + "loadingTags": {"message": "Chargement des étiquettes..."}, + "newTagsPlaceholder": {"message": "#nouvelle-étiquette, #autre-étiquette"}, + "saveLink": {"message": "Enregistrer le lien"}, + "settings": {"message": "Paramètres"}, + "signOut": {"message": "Se déconnecter"}, + "backendUrlLabel": {"message": "URL du serveur"}, + "usernameLabel": {"message": "Nom d’utilisateur"}, + "usernamePlaceholder": {"message": "alice"}, + "passwordLabel": {"message": "Mot de passe"}, + "saveAndLogIn": {"message": "Enregistrer et se connecter"}, + "thisPlugin": {"message": "Cette extension"}, + "pluginDescription": {"message": "Cette extension enregistre les liens sur un serveur LinkLog, qui les publiera sur un site web et éventuellement sur un service du fédivers ou ailleurs, selon les extensions configurées."}, + "accountRequirement": {"message": "Les utilisateurs de cette extension doivent avoir un compte sur un serveur LinkLog"}, + "privacy": {"message": "Confidentialité"}, + "privacyDescription": {"message": "Cette extension respecte votre vie privée et ne recueille aucune donnée personnelle au-delà de ce qui est nécessaire pour enregistrer des liens sur votre serveur LinkLog."}, + "storedData": {"message": "L’URL, après une tentative de suppression des paramètres de suivi, le titre de la page, un éventuel commentaire et l’heure de la visite seront enregistrés sur le serveur et rendus publics avec le profil de l’utilisateur qui y est inscrit."}, + "backendHeading": {"message": "Serveur LinkLog"}, + "backendDescription": {"message": "L’URL du serveur correspond à une application LinkLog auto-hébergée. Consultez son"}, + "backendSource": {"message": "pour voir le code source."}, + "copyright": {"message": "Copyright © 2026 Olaf Kolkman"}, + "repository": {"message": "Dépôt"}, + "signInToSelectTags": {"message": "Connectez-vous pour sélectionner des étiquettes existantes."}, + "loadTagsFailed": {"message": "Impossible de charger les étiquettes existantes."}, + "submitting": {"message": "Envoi..."}, + "configureAndLogIn": {"message": "Configurez l’URL du serveur et connectez-vous d’abord."}, + "sessionExpired": {"message": "Session expirée. Reconnectez-vous dans les paramètres."}, + "submissionFailed": {"message": "Échec de l’envoi"}, + "linkSaved": {"message": "Lien enregistré"}, + "submissionFailedConnection": {"message": "Échec de l’envoi. Vérifiez la connexion au serveur."}, + "loggedInAt": {"message": "$USERNAME$ est connecté à $BACKEND$", "placeholders": {"username": {"content": "$1"}, "backend": {"content": "$2"}}}, + "fillAllFields": {"message": "Veuillez remplir tous les champs"}, + "loginFailed": {"message": "Échec de la connexion"}, + "loggedInSuccessfully": {"message": "Connexion réussie"}, + "unableToLogIn": {"message": "Connexion impossible. Vérifiez l’URL du serveur et vos identifiants."}, + "signedOut": {"message": "Déconnecté"} +} diff --git a/webextension/_locales/nl/messages.json b/webextension/_locales/nl/messages.json new file mode 100644 index 0000000..9217e63 --- /dev/null +++ b/webextension/_locales/nl/messages.json @@ -0,0 +1,45 @@ +{ + "extensionName": {"message": "LinkLog"}, + "extensionDescription": {"message": "Paginakoppelingen vastleggen en naar LinkLog verzenden."}, + "settingsTitle": {"message": "LinkLog-instellingen"}, + "titleLabel": {"message": "Titel"}, + "urlLabel": {"message": "URL"}, + "commentLabel": {"message": "Opmerking"}, + "commentPlaceholder": {"message": "Je opmerking"}, + "tagsLabel": {"message": "Tags"}, + "loadingTags": {"message": "Tags worden geladen..."}, + "newTagsPlaceholder": {"message": "#nieuwe-tag, #andere-tag"}, + "saveLink": {"message": "Koppeling opslaan"}, + "settings": {"message": "Instellingen"}, + "signOut": {"message": "Uitloggen"}, + "backendUrlLabel": {"message": "Backend-URL"}, + "usernameLabel": {"message": "Gebruikersnaam"}, + "usernamePlaceholder": {"message": "alice"}, + "passwordLabel": {"message": "Wachtwoord"}, + "saveAndLogIn": {"message": "Opslaan en inloggen"}, + "thisPlugin": {"message": "Deze plug-in"}, + "pluginDescription": {"message": "Deze plug-in legt koppelingen vast op een LinkLog-server, die ze publiceert op een website en mogelijk op een fediverse-dienst of andere locaties, afhankelijk van de geconfigureerde plug-ins."}, + "accountRequirement": {"message": "Gebruikers van deze plug-in hebben een account op een LinkLog-server nodig"}, + "privacy": {"message": "Privacy"}, + "privacyDescription": {"message": "Deze plug-in respecteert je privacy en verzamelt geen persoonsgegevens buiten wat nodig is om koppelingen op je LinkLog-server vast te leggen."}, + "storedData": {"message": "De URL, na een poging om trackingparameters te verwijderen, de paginatitel, een eventuele opmerking en het tijdstip van bezoek worden op de backendserver opgeslagen en samen met het profiel van de geregistreerde gebruiker openbaar gemaakt."}, + "backendHeading": {"message": "LinkLog-backend"}, + "backendDescription": {"message": "De backend-URL is een zelfgehoste LinkLog-toepassing. Bekijk de"}, + "backendSource": {"message": "voor de broncode."}, + "copyright": {"message": "Copyright © 2026 Olaf Kolkman"}, + "repository": {"message": "Repository"}, + "signInToSelectTags": {"message": "Log in om bestaande tags te selecteren."}, + "loadTagsFailed": {"message": "Bestaande tags konden niet worden geladen."}, + "submitting": {"message": "Verzenden..."}, + "configureAndLogIn": {"message": "Configureer de backend-URL en log eerst in."}, + "sessionExpired": {"message": "Sessie verlopen. Verifieer opnieuw in de instellingen."}, + "submissionFailed": {"message": "Verzenden mislukt"}, + "linkSaved": {"message": "Koppeling opgeslagen"}, + "submissionFailedConnection": {"message": "Verzenden mislukt. Controleer de verbinding met de backend."}, + "loggedInAt": {"message": "$USERNAME$ is ingelogd op $BACKEND$", "placeholders": {"username": {"content": "$1"}, "backend": {"content": "$2"}}}, + "fillAllFields": {"message": "Vul alle velden in"}, + "loginFailed": {"message": "Inloggen mislukt"}, + "loggedInSuccessfully": {"message": "Succesvol ingelogd"}, + "unableToLogIn": {"message": "Inloggen mislukt. Controleer de backend-URL en inloggegevens."}, + "signedOut": {"message": "Uitgelogd"} +}