diff --git a/CHANGELOG.md b/CHANGELOG.md
index bda4ba2..3a56123 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,10 @@ The format is based on Keep a Changelog and the project follows Semantic Version
- The interface language can be chosen in Settings. Automatic still follows the
browser language. Popup, sidebar, and Settings update without a reload.
+- Language choices show the English name and the name from the active translation.
+ The English interface keeps English names only.
+- Accent colors, protection labels, and X-Ray labels follow the active interface
+ language. Long About link labels stay inside their buttons.
- Experimental: every subframe in a tab now uses the top-frame runtime snapshot
(locale, timezone, fingerprint, geolocation) so iframe and worker realms do
not diverge from the page. Per-tab header rules apply to all requests in that
diff --git a/src/ui/i18n/en-sections/options.ts b/src/ui/i18n/en-sections/options.ts
index ec2d14b..5f6360f 100644
--- a/src/ui/i18n/en-sections/options.ts
+++ b/src/ui/i18n/en-sections/options.ts
@@ -28,6 +28,8 @@ export const optionsPage = {
description: `Choose which browser protections ${BRAND_DISPLAY_NAME} uses by default. More specific settings can override individual protections, while Trusted Sites can disable them for matching sites.`,
disabledNote: `Browser protections are off everywhere. Turn them back on to choose what ${BRAND_DISPLAY_NAME} should spoof by default.`,
copyLinkLabel: "browser protections",
+ interceptsApis: (count: number) =>
+ `Intercepts ${count} browser ${count === 1 ? "API" : "APIs"}`,
items: {
geolocation: {
label: "Geolocation",
diff --git a/src/ui/i18n/es-sections/options.ts b/src/ui/i18n/es-sections/options.ts
index 2ecad92..b670cc9 100644
--- a/src/ui/i18n/es-sections/options.ts
+++ b/src/ui/i18n/es-sections/options.ts
@@ -28,6 +28,8 @@ export const optionsPage = {
description: `Elige qué protecciones del navegador usa ${BRAND_DISPLAY_NAME} de forma predeterminada. Las opciones más específicas pueden sustituir protecciones concretas, mientras que Sitios de confianza puede desactivarlas en los sitios coincidentes.`,
disabledNote: `Las protecciones del navegador están desactivadas en todas partes. Vuelve a activarlas para elegir qué ${BRAND_DISPLAY_NAME} debería simular por defecto.`,
copyLinkLabel: "protecciones del navegador",
+ interceptsApis: (count: number) =>
+ `Intercepta ${count} ${count === 1 ? "API del navegador" : "APIs del navegador"}`,
items: {
geolocation: {
label: "Geolocalización",
diff --git a/src/ui/i18n/pt-sections/options.ts b/src/ui/i18n/pt-sections/options.ts
index 214c0fd..815211f 100644
--- a/src/ui/i18n/pt-sections/options.ts
+++ b/src/ui/i18n/pt-sections/options.ts
@@ -28,6 +28,8 @@ export const optionsPage = {
description: `Escolha quais proteções do navegador o ${BRAND_DISPLAY_NAME} usa por padrão. Configurações mais específicas podem substituir proteções individuais, enquanto Sites Confiáveis podem desativá-las para sites correspondentes.`,
disabledNote: `As proteções do navegador estão desativadas em todos os lugares. Ative-as novamente para escolher o que o ${BRAND_DISPLAY_NAME} deve simular por padrão.`,
copyLinkLabel: "proteções do navegador",
+ interceptsApis: (count: number) =>
+ `Intercepta ${count} ${count === 1 ? "API do navegador" : "APIs do navegador"}`,
items: {
geolocation: {
label: "Geolocalização",
diff --git a/src/ui/i18n/ru-sections/options.ts b/src/ui/i18n/ru-sections/options.ts
index 74b366b..56f8640 100644
--- a/src/ui/i18n/ru-sections/options.ts
+++ b/src/ui/i18n/ru-sections/options.ts
@@ -29,6 +29,7 @@ export const optionsPage = {
description: `Выберите, какие средства защиты браузера ${BRAND_DISPLAY_NAME} использует по умолчанию. Более конкретные настройки могут переопределять отдельные средства защиты, а «Доверенные сайты» могут отключать их для соответствующих сайтов.`,
disabledNote: `Защита браузера на всех сайтах отключена. Включите её, чтобы настроить подмену данных по умолчанию.`,
copyLinkLabel: "защита браузера",
+ interceptsApis: (count: number) => `Перехватывает ${count} API браузера`,
items: {
geolocation: {
label: "Геолокация",
diff --git a/src/ui/i18n/uk-sections/options.ts b/src/ui/i18n/uk-sections/options.ts
index f3ea280..09ecf0c 100644
--- a/src/ui/i18n/uk-sections/options.ts
+++ b/src/ui/i18n/uk-sections/options.ts
@@ -29,6 +29,7 @@ export const optionsPage = {
description: `Виберіть, який захист браузера ${BRAND_DISPLAY_NAME} використовує за замовчуванням. Конкретніші налаштування можуть перевизначити окремі механізми захисту, тоді як довірені сайти можуть вимкнути їх для відповідних сайтів.`,
disabledNote: `Захист браузера скрізь вимкнено. Увімкніть його, щоб налаштувати підміну даних за замовчуванням.`,
copyLinkLabel: "механізми захисту браузера",
+ interceptsApis: (count: number) => `Перехоплює ${count} API браузера`,
items: {
geolocation: {
label: "Геолокація",
diff --git a/src/ui/options/components/onboarding/WelcomeWizard.tsx b/src/ui/options/components/onboarding/WelcomeWizard.tsx
index 190baa9..0178fb3 100644
--- a/src/ui/options/components/onboarding/WelcomeWizard.tsx
+++ b/src/ui/options/components/onboarding/WelcomeWizard.tsx
@@ -27,7 +27,7 @@ import { PAGE_ANCHORS } from "@/ui/options/navigation";
import { useSettings } from "@/ui/options/state/SettingsContext";
import { sendMessageOrThrow } from "@/ui/shared/runtime-messaging";
import { getThemeAccentTokens } from "@/ui/shared/theme";
-import { THEME_ACCENT_OPTIONS } from "@/ui/shared/theme-accent-options";
+import { getThemeAccentOptions } from "@/ui/shared/theme-accent-options";
import { useTheme } from "@/ui/shared/ThemeProvider";
const DEFAULT_PRESET_IDS = [
@@ -371,18 +371,20 @@ const setWizardContrast = async (
await theme.setHighContrast(checked);
};
-const getAccentView = (theme: Theme) => ({
- color: `hsl(${getThemeAccentTokens(theme.accentPreset, theme.theme, theme.highContrast).primary})`,
- label:
- THEME_ACCENT_OPTIONS.find((option) => option.preset === theme.accentPreset)
- ?.label ??
- THEME_ACCENT_OPTIONS[0]?.label ??
- theme.accentPreset,
- options: THEME_ACCENT_OPTIONS.map((option) => ({
- ...option,
- color: `hsl(${getThemeAccentTokens(option.preset, theme.theme, theme.highContrast).primary})`,
- })),
-});
+const getAccentView = (theme: Theme) => {
+ const accentOptions = getThemeAccentOptions();
+ return {
+ color: `hsl(${getThemeAccentTokens(theme.accentPreset, theme.theme, theme.highContrast).primary})`,
+ label:
+ accentOptions.find((option) => option.preset === theme.accentPreset)?.label ??
+ accentOptions[0]?.label ??
+ theme.accentPreset,
+ options: accentOptions.map((option) => ({
+ ...option,
+ color: `hsl(${getThemeAccentTokens(option.preset, theme.theme, theme.highContrast).primary})`,
+ })),
+ };
+};
export const WelcomeWizard = ({ onComplete }: { onComplete: () => void }) => {
const settings = useSettings();
diff --git a/src/ui/options/components/tabs/AboutTab.tsx b/src/ui/options/components/tabs/AboutTab.tsx
index fa0a694..73c586d 100644
--- a/src/ui/options/components/tabs/AboutTab.tsx
+++ b/src/ui/options/components/tabs/AboutTab.tsx
@@ -479,14 +479,14 @@ const AboutSidebar = () => {