Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ The format is based on Keep a Changelog and the project follows Semantic Version

### Added

- Added complete Spanish and Portuguese interface translations, selected
automatically from the browser interface language with English as the fallback.
- X-Ray now counts BatteryManager property reads (`charging`, `chargingTime`,
`dischargingTime`, `level`) in addition to `navigator.getBattery`.

Expand Down
2 changes: 1 addition & 1 deletion docs/project-structure.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ src/
├── components/
│ ├── ui/ # shadcn/ui components (@/ui/components/ui/)
│ └── stories/ # Storybook stories for all UI components
├── i18n/ # UI string constants (English only)
├── i18n/ # UI string constants (English, Spanish, Portuguese)
├── logs/ # Extension event log viewer
├── options/ # Main options page (tabs: Rules, Locations, Containers, etc.)
│ ├── components/
Expand Down
64 changes: 59 additions & 5 deletions src/shared/extension-notifications.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,22 @@
"introducedInVersion": "0.9.0",
"delivery": "upgrades-only",
"title": {
"en": "GeoWarp is now {{brand}}"
"en": "GeoWarp is now {{brand}}",
"es": "GeoWarp ahora es {{brand}}",
"pt": "GeoWarp agora é {{brand}}"
},
"message": {
"en": [
"GeoWarp has a new name: {{brand}}. The extension you know is still here, with the same focus on giving you control over the location and browser information websites can see.",
"Thank you for using it and being part of the journey so far. Building this extension has been an extraordinary journey for me, and I’m excited to see what the future brings."
],
"es": [
"GeoWarp tiene un nuevo nombre: {{brand}}. La extensión que conoces sigue aquí y mantiene su propósito: darte el control sobre la ubicación y los datos del navegador que pueden ver los sitios web.",
"Gracias por usarla y por formar parte de este recorrido. Crear esta extensión ha sido una experiencia extraordinaria para mí y me ilusiona descubrir lo que traerá el futuro."
],
"pt": [
"GeoWarp tem um novo nome: {{brand}}. A extensão que você conhece continua aqui, com o mesmo objetivo de dar a você controle sobre a localização e as informações do navegador que os sites podem ver.",
"Agradecemos por usá-la e por fazer parte desta jornada. Criar esta extensão tem sido uma experiência extraordinária para mim, e estou animado para ver o que o futuro reserva."
]
}
},
Expand All @@ -21,12 +31,22 @@
"introducedInVersion": "0.9.0",
"delivery": "upgrades-only",
"title": {
"en": "Notifications are now in the popup"
"en": "Notifications are now in the popup",
"es": "Las notificaciones ya están en la ventana emergente",
"pt": "As notificações agora estão no pop-up"
},
"message": {
"en": [
"{{brand}} now shows important updates and compatibility notices in the popup.",
"Opening a notification marks it as read. It remains available until you dismiss it."
],
"es": [
"{{brand}} ahora muestra las novedades importantes y los avisos de compatibilidad en la ventana emergente.",
"Al abrir una notificación se marca como leída. Permanecerá disponible hasta que la descartes."
],
"pt": [
"{{brand}} agora mostra atualizações importantes e avisos de compatibilidade no pop-up.",
"Ao abrir uma notificação, ela é marcada como lida e permanece disponível até que você a descarte."
]
}
},
Expand All @@ -36,13 +56,25 @@
"introducedInVersion": "0.9.2",
"delivery": "upgrades-only",
"title": {
"en": "Temporal API protection is ready to try"
"en": "Temporal API protection is ready to try",
"es": "Ya puedes probar la protección de la API Temporal",
"pt": "A proteção da API Temporal está pronta para testes"
},
"message": {
"en": [
"{{brand}} can now protect native Temporal calls, covering date, time, locale, and default time-zone behavior alongside the rest of your setup.",
"It’s experimental and off by default. To try it, open Settings → Advanced → Experimental and turn on Temporal API. It only works when your browser already provides Temporal—{{brand}} doesn’t add a polyfill.",
"Want to know more? You can read about the Temporal API on Mozilla Developer Network using the link below."
],
"es": [
"{{brand}} ya puede proteger las llamadas nativas a Temporal y su comportamiento de fecha, hora, configuración regional y zona horaria predeterminada, junto con el resto de tu configuración.",
"Es una función experimental y está desactivada de forma predeterminada. Para probarla, abre Configuración → Avanzado → Experimental y activa la API Temporal. Solo funciona si el navegador ya ofrece Temporal; {{brand}} no añade ningún polyfill.",
"¿Quieres saber más? Usa el siguiente enlace para consultar la documentación de la API Temporal en Mozilla Developer Network."
],
"pt": [
"{{brand}} agora pode proteger chamadas nativas da API Temporal, incluindo o comportamento padrão de data, hora, configuração regional e fuso horário, junto com o restante da sua configuração.",
"O recurso é experimental e vem desativado por padrão. Para testá-lo, abra Configurações → Avançado → Experimental e ative a API Temporal. Ele só funciona quando o navegador já oferece a API Temporal — {{brand}} não instala um polyfill.",
"Quer saber mais? Use o link abaixo para consultar a documentação da API Temporal na Mozilla Developer Network."
]
},
"actionUrl": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal"
Expand All @@ -53,12 +85,22 @@
"introducedInVersion": "0.9.2",
"delivery": "upgrades-only",
"title": {
"en": "{{brand}} is now open source!"
"en": "{{brand}} is now open source!",
"es": "¡{{brand}} ya es de código abierto!",
"pt": "{{brand}} agora é de código aberto!"
},
"message": {
"en": [
"{{brand}} is open source now. The code lives on GitHub under AGPL-3.0-or-later, with the project’s additional terms. Have a look around and see how it all works under the hood.",
"Found a regular bug? Open an issue and tell me what happened. Security or detection problems should still go through GitHub’s private reporting form."
],
"es": [
"{{brand}} ya es de código abierto. El código está disponible en GitHub bajo la licencia AGPL-3.0-or-later y las condiciones adicionales del proyecto. Explóralo para descubrir cómo funciona por dentro.",
"¿Has encontrado un error común? Abre una incidencia y cuéntame qué ha ocurrido. Los problemas de seguridad o detección deben seguir enviándose mediante el formulario privado de GitHub."
],
"pt": [
"{{brand}} agora é de código aberto. O código está disponível no GitHub sob a licença AGPL-3.0-or-later e os termos adicionais do projeto. Explore o repositório para entender como tudo funciona nos bastidores.",
"Encontrou um bug comum? Abra uma issue e conte o que aconteceu. Problemas de segurança ou detecção devem continuar sendo enviados pelo formulário privado do GitHub."
]
},
"actionUrl": "https://github.com/Privacy-Thing/browser-extension"
Expand All @@ -69,13 +111,25 @@
"introducedInVersion": "0.9.3",
"delivery": "all-current-users",
"title": {
"en": "Domain fencing is ready to try"
"en": "Domain fencing is ready to try",
"es": "Ya puedes probar el aislamiento por dominio",
"pt": "O isolamento por domínio está pronto para testes"
},
"message": {
"en": [
"On Chrome and Firefox, Domain fencing gives each site its own stable variation of the generated fingerprint when the Default Rule applies. On Firefox, it also separates identities assigned through containers.",
"The same site and its subdomains share one identity, while unrelated sites receive separate variations. Your chosen regional preset stays unchanged, and manually configured Domain Rules are not fenced.",
"Domain fencing is experimental and off by default. To try it, open Settings → Advanced → Experimental and turn on Domain fencing."
],
"es": [
"En Chrome y Firefox, el aislamiento por dominio asigna a cada sitio una variante estable de la huella digital generada cuando se aplica la Regla predeterminada. En Firefox también separa las identidades asignadas mediante contenedores.",
"Un sitio y sus subdominios comparten una identidad, mientras que los sitios no relacionados reciben variantes distintas. El perfil regional elegido no cambia y las reglas de dominio configuradas manualmente no se aíslan.",
"El aislamiento por dominio es experimental y está desactivado de forma predeterminada. Para probarlo, abre Configuración → Avanzado → Experimental y activa Aislamiento por dominio."
],
"pt": [
"No Chrome e no Firefox, o isolamento por domínio atribui a cada site uma variante estável da impressão digital gerada quando a Regra Padrão se aplica. No Firefox, ele também separa as identidades atribuídas por meio de contêineres.",
"Um site e seus subdomínios compartilham uma identidade, enquanto sites não relacionados recebem variantes distintas. O perfil regional escolhido não muda, e as Regras de Domínio configuradas manualmente não são isoladas.",
"O isolamento por domínio é experimental e vem desativado por padrão. Para testá-lo, abra Configurações → Avançado → Experimental e ative Isolamento por domínio."
]
}
}
Expand Down
22 changes: 22 additions & 0 deletions src/shared/release-notification.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,28 @@ describe("extension notification catalog", () => {
]);
});

it("provides Spanish release notices without falling back to English", () => {
const notification = getReleaseNotice("notification-center-intro", "es-MX");

expect(notification?.title).toBe(
"Las notificaciones ya están en la ventana emergente",
);
expect(notification?.message).toEqual([
"Privacy Thing ahora muestra las novedades importantes y los avisos de compatibilidad en la ventana emergente.",
"Al abrir una notificación se marca como leída. Permanecerá disponible hasta que la descartes.",
]);
});

it("provides Portuguese release notices without falling back to English", () => {
const notification = getReleaseNotice("notification-center-intro", "pt-BR");

expect(notification?.title).toBe("As notificações agora estão no pop-up");
expect(notification?.message).toEqual([
"Privacy Thing agora mostra atualizações importantes e avisos de compatibilidade no pop-up.",
"Ao abrir uma notificação, ela é marcada como lida e permanece disponível até que você a descarte.",
]);
});

it("includes the 0.9.0 rename announcement", () => {
const source = notificationCatalog.notifications.find(
(notification) => notification.id === "privacy-thing-rename",
Expand Down
8 changes: 5 additions & 3 deletions src/ui/i18n/en-sections/advanced.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,11 @@ export const advanced = {

language: {
title: "Language",
description: `More languages are on the way. We’re working on new translations for ${BRAND_DISPLAY_NAME}.`,
option: "English",
soon: "SOON",
description: `${BRAND_DISPLAY_NAME} automatically follows your browser interface language.`,
optionEnglish: "English",
optionSpanish: "Spanish",
optionPortuguese: "Portuguese",
soon: "AUTO",
copyLinkLabel: "language",
},

Expand Down
Loading