From b353f921b71a9e872b876410546ff2c638c788bd Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 10:41:43 +0700 Subject: [PATCH 001/101] fix: align inline helper with WXT environment --- wxt.config.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wxt.config.ts b/wxt.config.ts index 8cce9d65..60aed1c7 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -10,12 +10,12 @@ const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; export default defineConfig({ modules: ["@wxt-dev/module-react", "@wxt-dev/auto-icons"], - /** Defines compile-time values based on the resolved WXT mode. */ - vite: ({ mode }) => ({ + /** Maps the legacy content-script flag to Vite's documented runtime environment. */ + vite: () => ({ define: { "process.emit": "(() => {})", "process.env": "{}", - __DEV_MODE__: JSON.stringify(mode === "development"), + __DEV_MODE__: "import.meta.env.DEV", }, resolve: { alias: { @@ -23,7 +23,7 @@ export default defineConfig({ }, }, }), - /** Generates manifest permissions based on the resolved WXT mode. */ + /** Uses WXT's resolved mode because import.meta.env is unavailable in manifest config. */ manifest: ({ mode }) => ({ name: "__MSG_extensionName__", description: "__MSG_extensionDescription__", From 7f54aafa239dd981a1fa33634ba098393c375872 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 10:42:04 +0700 Subject: [PATCH 002/101] test: verify production inline helper manifest --- scripts/verify-production-manifest.mjs | 89 ++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 scripts/verify-production-manifest.mjs diff --git a/scripts/verify-production-manifest.mjs b/scripts/verify-production-manifest.mjs new file mode 100644 index 00000000..ea6b33f4 --- /dev/null +++ b/scripts/verify-production-manifest.mjs @@ -0,0 +1,89 @@ +import { existsSync, readFileSync, readdirSync } from "node:fs"; +import { join } from "node:path"; + +const OUTPUT_ROOT = ".output"; +const ALL_URLS = ""; + +/** Returns WXT production output directories for one browser. */ +function findBrowserOutputs(browser) { + return readdirSync(OUTPUT_ROOT, { withFileTypes: true }) + .filter( + (entry) => entry.isDirectory() && entry.name.startsWith(`${browser}-mv`), + ) + .map((entry) => entry.name); +} + +/** Reads and parses a generated extension manifest. */ +function readManifest(manifestPath) { + return JSON.parse(readFileSync(manifestPath, "utf8")); +} + +/** Returns validation failures for one generated production manifest. */ +function validateManifest(manifestPath) { + if (!existsSync(manifestPath)) { + return [`Missing manifest: ${manifestPath}`]; + } + + const manifest = readManifest(manifestPath); + const contentScriptMatches = (manifest.content_scripts ?? []).flatMap( + (contentScript) => contentScript.matches ?? [], + ); + const grantedHosts = new Set([ + ...(manifest.host_permissions ?? []), + ...(manifest.permissions ?? []), + ]); + const failures = []; + + if (!contentScriptMatches.includes(ALL_URLS)) { + failures.push( + `${manifestPath}: content script does not match ${ALL_URLS}. Found: ${contentScriptMatches.join(", ") || "none"}`, + ); + } + + if (!grantedHosts.has(ALL_URLS)) { + failures.push( + `${manifestPath}: production host permissions do not include ${ALL_URLS}.`, + ); + } + + return failures; +} + +/** Returns validation failures for all production outputs of one browser. */ +function validateBrowser(browser) { + const outputDirectories = findBrowserOutputs(browser); + if (outputDirectories.length === 0) { + return [`No production output directory found for ${browser}.`]; + } + + return outputDirectories.flatMap((outputDirectory) => { + const manifestPath = join(OUTPUT_ROOT, outputDirectory, "manifest.json"); + const failures = validateManifest(manifestPath); + + if (failures.length === 0) { + console.log(`Verified production inline helper scope: ${manifestPath}`); + } + + return failures; + }); +} + +/** Runs the production manifest verification command. */ +function main() { + if (!existsSync(OUTPUT_ROOT)) { + console.error(`ERROR: Missing WXT output directory: ${OUTPUT_ROOT}`); + process.exitCode = 1; + return; + } + + const requestedBrowsers = process.argv.slice(2); + const browsers = requestedBrowsers.length > 0 ? requestedBrowsers : ["chrome"]; + const failures = browsers.flatMap(validateBrowser); + + if (failures.length === 0) return; + + failures.forEach((failure) => console.error(`ERROR: ${failure}`)); + process.exitCode = 1; +} + +main(); From c34f7e8966cc7ecc0ee34c50cd675f23f3c8497c Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 10:42:20 +0700 Subject: [PATCH 003/101] ci: run checks for pull requests into dev --- .github/workflows/ci.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cad78746..eb0e421e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [main] + branches: [main, dev] pull_request: - branches: [main] + branches: [main, dev] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -77,5 +77,8 @@ jobs: - name: Build extension run: yarn build + - name: Verify production inline helper scope + run: node scripts/verify-production-manifest.mjs chrome + - name: Build website run: yarn workspace gmail-alias-toolkit-web build From 9a00ad6507c49feca86ef200ff867cbe71b1668f Mon Sep 17 00:00:00 2001 From: "deepsource-autofix[bot]" <62050782+deepsource-autofix[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 03:47:07 +0000 Subject: [PATCH 004/101] style: format code with Prettier This commit fixes the style issues introduced in c34f7e8 according to the output from Prettier. Details: https://github.com/ePlus-DEV/gmail-alias-toolkit/pull/77 --- scripts/verify-production-manifest.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/verify-production-manifest.mjs b/scripts/verify-production-manifest.mjs index ea6b33f4..2497e918 100644 --- a/scripts/verify-production-manifest.mjs +++ b/scripts/verify-production-manifest.mjs @@ -77,7 +77,8 @@ function main() { } const requestedBrowsers = process.argv.slice(2); - const browsers = requestedBrowsers.length > 0 ? requestedBrowsers : ["chrome"]; + const browsers = + requestedBrowsers.length > 0 ? requestedBrowsers : ["chrome"]; const failures = browsers.flatMap(validateBrowser); if (failures.length === 0) return; From 7a2c0786dc838014bc5359b0b4056341999a7ea9 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 11:12:19 +0700 Subject: [PATCH 005/101] fix: avoid console usage in manifest verifier --- scripts/verify-production-manifest.mjs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/scripts/verify-production-manifest.mjs b/scripts/verify-production-manifest.mjs index 2497e918..2650c7f7 100644 --- a/scripts/verify-production-manifest.mjs +++ b/scripts/verify-production-manifest.mjs @@ -4,6 +4,16 @@ import { join } from "node:path"; const OUTPUT_ROOT = ".output"; const ALL_URLS = ""; +/** Writes one informational line to standard output. */ +function writeInfo(message) { + process.stdout.write(`${message}\n`); +} + +/** Writes one error line to standard error. */ +function writeError(message) { + process.stderr.write(`ERROR: ${message}\n`); +} + /** Returns WXT production output directories for one browser. */ function findBrowserOutputs(browser) { return readdirSync(OUTPUT_ROOT, { withFileTypes: true }) @@ -61,7 +71,7 @@ function validateBrowser(browser) { const failures = validateManifest(manifestPath); if (failures.length === 0) { - console.log(`Verified production inline helper scope: ${manifestPath}`); + writeInfo(`Verified production inline helper scope: ${manifestPath}`); } return failures; @@ -71,7 +81,7 @@ function validateBrowser(browser) { /** Runs the production manifest verification command. */ function main() { if (!existsSync(OUTPUT_ROOT)) { - console.error(`ERROR: Missing WXT output directory: ${OUTPUT_ROOT}`); + writeError(`Missing WXT output directory: ${OUTPUT_ROOT}`); process.exitCode = 1; return; } @@ -83,7 +93,7 @@ function main() { if (failures.length === 0) return; - failures.forEach((failure) => console.error(`ERROR: ${failure}`)); + failures.forEach(writeError); process.exitCode = 1; } From 4ed6cb55fdda931dbe8e19cc4bcdbf452d0ade38 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 12:36:27 +0700 Subject: [PATCH 006/101] refactor: remove custom WXT development flag --- wxt.config.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/wxt.config.ts b/wxt.config.ts index 60aed1c7..8804db60 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -10,12 +10,10 @@ const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; export default defineConfig({ modules: ["@wxt-dev/module-react", "@wxt-dev/auto-icons"], - /** Maps the legacy content-script flag to Vite's documented runtime environment. */ vite: () => ({ define: { "process.emit": "(() => {})", "process.env": "{}", - __DEV_MODE__: "import.meta.env.DEV", }, resolve: { alias: { @@ -46,4 +44,4 @@ export default defineConfig({ autoIcons: { developmentIndicator: "overlay", }, -}); +}); \ No newline at end of file From 1a98dac0f645d1bc16f67a1801e45bc21a48dba5 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 12:37:56 +0700 Subject: [PATCH 007/101] chore: add one-time WXT environment cleanup --- .../workflows/one-time-cleanup-wxt-env.yml | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 .github/workflows/one-time-cleanup-wxt-env.yml diff --git a/.github/workflows/one-time-cleanup-wxt-env.yml b/.github/workflows/one-time-cleanup-wxt-env.yml new file mode 100644 index 00000000..5e8cc49f --- /dev/null +++ b/.github/workflows/one-time-cleanup-wxt-env.yml @@ -0,0 +1,67 @@ +name: One-time WXT environment cleanup + +on: + push: + branches: + - agent/cleanup-wxt-environment-checks + +permissions: + contents: write + +jobs: + cleanup: + name: Replace legacy environment flag + runs-on: ubuntu-latest + + steps: + - name: Checkout cleanup branch + uses: actions/checkout@v7 + with: + ref: agent/cleanup-wxt-environment-checks + fetch-depth: 0 + + - name: Replace legacy WXT environment check + shell: bash + run: | + set -euo pipefail + + python <<'PY' + from pathlib import Path + + content_script = Path("entrypoints/content/index.ts") + workflow = Path(".github/workflows/one-time-cleanup-wxt-env.yml") + source = content_script.read_text(encoding="utf-8") + + old = '''const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; + + // @ts-expect-error __DEV_MODE__ injected by Vite at build time + const contentScriptMatches = __DEV_MODE__ ? DEV_SITES : [""];''' + new = '''const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; + + const contentScriptMatches = import.meta.env.DEV + ? DEV_SITES + : [""];''' + + if source.count(old) != 1: + raise SystemExit("Expected exactly one legacy __DEV_MODE__ block") + + content_script.write_text(source.replace(old, new), encoding="utf-8") + workflow.unlink() + PY + + if grep -RIn --exclude-dir=.git --exclude='CHANGELOG.md' '__DEV_MODE__' .; then + echo 'Legacy __DEV_MODE__ references remain.' >&2 + exit 1 + fi + + git diff --check + + - name: Commit cleanup + shell: bash + run: | + set -euo pipefail + git config user.name "eplus-bot" + git config user.email "157664013+eplus-bot@users.noreply.github.com" + git add entrypoints/content/index.ts .github/workflows/one-time-cleanup-wxt-env.yml + git commit -m "refactor: use WXT runtime environment directly" + git push origin HEAD:agent/cleanup-wxt-environment-checks From aff50e8dd179f733cecce39b7fdb07363aca182f Mon Sep 17 00:00:00 2001 From: eplus-bot <157664013+eplus-bot@users.noreply.github.com> Date: Thu, 23 Jul 2026 05:38:04 +0000 Subject: [PATCH 008/101] refactor: use WXT runtime environment directly --- .../workflows/one-time-cleanup-wxt-env.yml | 67 ------------------- entrypoints/content/index.ts | 5 +- 2 files changed, 3 insertions(+), 69 deletions(-) delete mode 100644 .github/workflows/one-time-cleanup-wxt-env.yml diff --git a/.github/workflows/one-time-cleanup-wxt-env.yml b/.github/workflows/one-time-cleanup-wxt-env.yml deleted file mode 100644 index 5e8cc49f..00000000 --- a/.github/workflows/one-time-cleanup-wxt-env.yml +++ /dev/null @@ -1,67 +0,0 @@ -name: One-time WXT environment cleanup - -on: - push: - branches: - - agent/cleanup-wxt-environment-checks - -permissions: - contents: write - -jobs: - cleanup: - name: Replace legacy environment flag - runs-on: ubuntu-latest - - steps: - - name: Checkout cleanup branch - uses: actions/checkout@v7 - with: - ref: agent/cleanup-wxt-environment-checks - fetch-depth: 0 - - - name: Replace legacy WXT environment check - shell: bash - run: | - set -euo pipefail - - python <<'PY' - from pathlib import Path - - content_script = Path("entrypoints/content/index.ts") - workflow = Path(".github/workflows/one-time-cleanup-wxt-env.yml") - source = content_script.read_text(encoding="utf-8") - - old = '''const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; - - // @ts-expect-error __DEV_MODE__ injected by Vite at build time - const contentScriptMatches = __DEV_MODE__ ? DEV_SITES : [""];''' - new = '''const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; - - const contentScriptMatches = import.meta.env.DEV - ? DEV_SITES - : [""];''' - - if source.count(old) != 1: - raise SystemExit("Expected exactly one legacy __DEV_MODE__ block") - - content_script.write_text(source.replace(old, new), encoding="utf-8") - workflow.unlink() - PY - - if grep -RIn --exclude-dir=.git --exclude='CHANGELOG.md' '__DEV_MODE__' .; then - echo 'Legacy __DEV_MODE__ references remain.' >&2 - exit 1 - fi - - git diff --check - - - name: Commit cleanup - shell: bash - run: | - set -euo pipefail - git config user.name "eplus-bot" - git config user.email "157664013+eplus-bot@users.noreply.github.com" - git add entrypoints/content/index.ts .github/workflows/one-time-cleanup-wxt-env.yml - git commit -m "refactor: use WXT runtime environment directly" - git push origin HEAD:agent/cleanup-wxt-environment-checks diff --git a/entrypoints/content/index.ts b/entrypoints/content/index.ts index 73c4c5a2..79594555 100644 --- a/entrypoints/content/index.ts +++ b/entrypoints/content/index.ts @@ -1582,8 +1582,9 @@ function observeDOM() { const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; -// @ts-expect-error __DEV_MODE__ injected by Vite at build time -const contentScriptMatches = __DEV_MODE__ ? DEV_SITES : [""]; +const contentScriptMatches = import.meta.env.DEV + ? DEV_SITES + : [""]; export default defineContentScript({ matches: contentScriptMatches, From d19795efcfad028b41cca6fa4cdd56a97a0066b9 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 12:40:39 +0700 Subject: [PATCH 009/101] test: verify WXT manifest scope by mode --- scripts/verify-manifest-scope.mjs | 177 ++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 scripts/verify-manifest-scope.mjs diff --git a/scripts/verify-manifest-scope.mjs b/scripts/verify-manifest-scope.mjs new file mode 100644 index 00000000..44e4c78e --- /dev/null +++ b/scripts/verify-manifest-scope.mjs @@ -0,0 +1,177 @@ +import { existsSync, readFileSync, readdirSync } from "node:fs"; +import { join } from "node:path"; + +const OUTPUT_ROOT = ".output"; +const ALL_URLS = ""; +const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; +const SUPPORTED_MODES = new Set(["development", "production"]); + +/** Writes one informational line to standard output. */ +function writeInfo(message) { + process.stdout.write(`${message}\n`); +} + +/** Writes one error line to standard error. */ +function writeError(message) { + process.stderr.write(`ERROR: ${message}\n`); +} + +/** Returns WXT output directories for one browser. */ +function findBrowserOutputs(browser) { + return readdirSync(OUTPUT_ROOT, { withFileTypes: true }) + .filter( + (entry) => entry.isDirectory() && entry.name.startsWith(`${browser}-mv`), + ) + .map((entry) => entry.name); +} + +/** Reads and parses a generated extension manifest. */ +function readManifest(manifestPath) { + return JSON.parse(readFileSync(manifestPath, "utf8")); +} + +/** Returns failures for the expected production URL scope. */ +function validateProductionScope(manifestPath, contentScriptMatches, grantedHosts) { + const failures = []; + + if (!contentScriptMatches.includes(ALL_URLS)) { + failures.push( + `${manifestPath}: production content script does not match ${ALL_URLS}. Found: ${contentScriptMatches.join(", ") || "none"}`, + ); + } + + if (!grantedHosts.has(ALL_URLS)) { + failures.push( + `${manifestPath}: production host permissions do not include ${ALL_URLS}.`, + ); + } + + return failures; +} + +/** Returns failures for the expected development URL scope. */ +function validateDevelopmentScope( + manifestPath, + contentScriptMatches, + grantedHosts, +) { + const failures = []; + + if (contentScriptMatches.includes(ALL_URLS)) { + failures.push( + `${manifestPath}: development content script unexpectedly matches ${ALL_URLS}.`, + ); + } + + if (grantedHosts.has(ALL_URLS)) { + failures.push( + `${manifestPath}: development host permissions unexpectedly include ${ALL_URLS}.`, + ); + } + + for (const site of DEV_SITES) { + if (!contentScriptMatches.includes(site)) { + failures.push( + `${manifestPath}: development content script is missing ${site}.`, + ); + } + if (!grantedHosts.has(site)) { + failures.push( + `${manifestPath}: development host permissions are missing ${site}.`, + ); + } + } + + return failures; +} + +/** Returns validation failures for one generated manifest. */ +function validateManifest(manifestPath, mode) { + if (!existsSync(manifestPath)) { + return [`Missing manifest: ${manifestPath}`]; + } + + const manifest = readManifest(manifestPath); + const contentScriptMatches = (manifest.content_scripts ?? []).flatMap( + (contentScript) => contentScript.matches ?? [], + ); + const grantedHosts = new Set([ + ...(manifest.host_permissions ?? []), + ...(manifest.permissions ?? []), + ]); + + return mode === "development" + ? validateDevelopmentScope( + manifestPath, + contentScriptMatches, + grantedHosts, + ) + : validateProductionScope( + manifestPath, + contentScriptMatches, + grantedHosts, + ); +} + +/** Returns validation failures for all outputs of one browser. */ +function validateBrowser(browser, mode) { + const outputDirectories = findBrowserOutputs(browser); + if (outputDirectories.length === 0) { + return [`No ${mode} output directory found for ${browser}.`]; + } + + return outputDirectories.flatMap((outputDirectory) => { + const manifestPath = join(OUTPUT_ROOT, outputDirectory, "manifest.json"); + const failures = validateManifest(manifestPath, mode); + + if (failures.length === 0) { + writeInfo(`Verified ${mode} inline helper scope: ${manifestPath}`); + } + + return failures; + }); +} + +/** Parses the expected mode and browser arguments. */ +function parseArguments() { + const [mode = "production", ...requestedBrowsers] = process.argv.slice(2); + if (!SUPPORTED_MODES.has(mode)) { + throw new Error( + `Unsupported mode "${mode}". Use development or production.`, + ); + } + + return { + mode, + browsers: requestedBrowsers.length > 0 ? requestedBrowsers : ["chrome"], + }; +} + +/** Runs the generated manifest scope verification. */ +function main() { + if (!existsSync(OUTPUT_ROOT)) { + writeError(`Missing WXT output directory: ${OUTPUT_ROOT}`); + process.exitCode = 1; + return; + } + + let options; + try { + options = parseArguments(); + } catch (error) { + writeError(error instanceof Error ? error.message : String(error)); + process.exitCode = 1; + return; + } + + const failures = options.browsers.flatMap((browser) => + validateBrowser(browser, options.mode), + ); + + if (failures.length === 0) return; + + failures.forEach(writeError); + process.exitCode = 1; +} + +main(); From 874a63ca3c395759c7025122cc403ab791f9b3cb Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 12:41:01 +0700 Subject: [PATCH 010/101] test: verify WXT development and production scopes --- .github/workflows/ci.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eb0e421e..41a149fb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -74,11 +74,17 @@ jobs: - name: Run tests run: yarn test - - name: Build extension + - name: Build production extension run: yarn build - name: Verify production inline helper scope - run: node scripts/verify-production-manifest.mjs chrome + run: node scripts/verify-manifest-scope.mjs production chrome + + - name: Build development-mode extension + run: yarn exec wxt build --mode development + + - name: Verify development inline helper scope + run: node scripts/verify-manifest-scope.mjs development chrome - name: Build website run: yarn workspace gmail-alias-toolkit-web build From eb8212b97dd83befaec7c3a493c1f9c8f680eb19 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 12:41:08 +0700 Subject: [PATCH 011/101] refactor: replace production-only manifest verifier --- scripts/verify-production-manifest.mjs | 100 ------------------------- 1 file changed, 100 deletions(-) delete mode 100644 scripts/verify-production-manifest.mjs diff --git a/scripts/verify-production-manifest.mjs b/scripts/verify-production-manifest.mjs deleted file mode 100644 index 2650c7f7..00000000 --- a/scripts/verify-production-manifest.mjs +++ /dev/null @@ -1,100 +0,0 @@ -import { existsSync, readFileSync, readdirSync } from "node:fs"; -import { join } from "node:path"; - -const OUTPUT_ROOT = ".output"; -const ALL_URLS = ""; - -/** Writes one informational line to standard output. */ -function writeInfo(message) { - process.stdout.write(`${message}\n`); -} - -/** Writes one error line to standard error. */ -function writeError(message) { - process.stderr.write(`ERROR: ${message}\n`); -} - -/** Returns WXT production output directories for one browser. */ -function findBrowserOutputs(browser) { - return readdirSync(OUTPUT_ROOT, { withFileTypes: true }) - .filter( - (entry) => entry.isDirectory() && entry.name.startsWith(`${browser}-mv`), - ) - .map((entry) => entry.name); -} - -/** Reads and parses a generated extension manifest. */ -function readManifest(manifestPath) { - return JSON.parse(readFileSync(manifestPath, "utf8")); -} - -/** Returns validation failures for one generated production manifest. */ -function validateManifest(manifestPath) { - if (!existsSync(manifestPath)) { - return [`Missing manifest: ${manifestPath}`]; - } - - const manifest = readManifest(manifestPath); - const contentScriptMatches = (manifest.content_scripts ?? []).flatMap( - (contentScript) => contentScript.matches ?? [], - ); - const grantedHosts = new Set([ - ...(manifest.host_permissions ?? []), - ...(manifest.permissions ?? []), - ]); - const failures = []; - - if (!contentScriptMatches.includes(ALL_URLS)) { - failures.push( - `${manifestPath}: content script does not match ${ALL_URLS}. Found: ${contentScriptMatches.join(", ") || "none"}`, - ); - } - - if (!grantedHosts.has(ALL_URLS)) { - failures.push( - `${manifestPath}: production host permissions do not include ${ALL_URLS}.`, - ); - } - - return failures; -} - -/** Returns validation failures for all production outputs of one browser. */ -function validateBrowser(browser) { - const outputDirectories = findBrowserOutputs(browser); - if (outputDirectories.length === 0) { - return [`No production output directory found for ${browser}.`]; - } - - return outputDirectories.flatMap((outputDirectory) => { - const manifestPath = join(OUTPUT_ROOT, outputDirectory, "manifest.json"); - const failures = validateManifest(manifestPath); - - if (failures.length === 0) { - writeInfo(`Verified production inline helper scope: ${manifestPath}`); - } - - return failures; - }); -} - -/** Runs the production manifest verification command. */ -function main() { - if (!existsSync(OUTPUT_ROOT)) { - writeError(`Missing WXT output directory: ${OUTPUT_ROOT}`); - process.exitCode = 1; - return; - } - - const requestedBrowsers = process.argv.slice(2); - const browsers = - requestedBrowsers.length > 0 ? requestedBrowsers : ["chrome"]; - const failures = browsers.flatMap(validateBrowser); - - if (failures.length === 0) return; - - failures.forEach(writeError); - process.exitCode = 1; -} - -main(); From d380e3c14326837031c2e76f11b5dc4a03afff38 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 12:41:47 +0700 Subject: [PATCH 012/101] chore: no-op placeholder --- scripts/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 scripts/.keep diff --git a/scripts/.keep b/scripts/.keep new file mode 100644 index 00000000..e69de29b From f314e5e0bc3904bd4f34ec163c65aa991f709632 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 12:42:06 +0700 Subject: [PATCH 013/101] chore: remove accidental placeholder --- scripts/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 scripts/.keep diff --git a/scripts/.keep b/scripts/.keep deleted file mode 100644 index e69de29b..00000000 From 6604e91fdf1a249f9df01afd7396dfd13642ef27 Mon Sep 17 00:00:00 2001 From: "deepsource-autofix[bot]" <62050782+deepsource-autofix[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 05:42:50 +0000 Subject: [PATCH 014/101] style: format code with Prettier This commit fixes the style issues introduced in f314e5e according to the output from Prettier. Details: https://github.com/ePlus-DEV/gmail-alias-toolkit/pull/79 --- entrypoints/content/index.ts | 4 +--- scripts/verify-manifest-scope.mjs | 18 +++++++----------- wxt.config.ts | 2 +- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/entrypoints/content/index.ts b/entrypoints/content/index.ts index 79594555..11e40f5f 100644 --- a/entrypoints/content/index.ts +++ b/entrypoints/content/index.ts @@ -1582,9 +1582,7 @@ function observeDOM() { const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; -const contentScriptMatches = import.meta.env.DEV - ? DEV_SITES - : [""]; +const contentScriptMatches = import.meta.env.DEV ? DEV_SITES : [""]; export default defineContentScript({ matches: contentScriptMatches, diff --git a/scripts/verify-manifest-scope.mjs b/scripts/verify-manifest-scope.mjs index 44e4c78e..6b3918a9 100644 --- a/scripts/verify-manifest-scope.mjs +++ b/scripts/verify-manifest-scope.mjs @@ -31,7 +31,11 @@ function readManifest(manifestPath) { } /** Returns failures for the expected production URL scope. */ -function validateProductionScope(manifestPath, contentScriptMatches, grantedHosts) { +function validateProductionScope( + manifestPath, + contentScriptMatches, + grantedHosts, +) { const failures = []; if (!contentScriptMatches.includes(ALL_URLS)) { @@ -101,16 +105,8 @@ function validateManifest(manifestPath, mode) { ]); return mode === "development" - ? validateDevelopmentScope( - manifestPath, - contentScriptMatches, - grantedHosts, - ) - : validateProductionScope( - manifestPath, - contentScriptMatches, - grantedHosts, - ); + ? validateDevelopmentScope(manifestPath, contentScriptMatches, grantedHosts) + : validateProductionScope(manifestPath, contentScriptMatches, grantedHosts); } /** Returns validation failures for all outputs of one browser. */ diff --git a/wxt.config.ts b/wxt.config.ts index 8804db60..4201b689 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -44,4 +44,4 @@ export default defineConfig({ autoIcons: { developmentIndicator: "overlay", }, -}); \ No newline at end of file +}); From ec7471e0fb20853472486ca8fe8ccb09277009ce Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 12:45:38 +0700 Subject: [PATCH 015/101] chore: align content script with WXT mode --- .github/workflows/one-time-align-wxt-mode.yml | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 .github/workflows/one-time-align-wxt-mode.yml diff --git a/.github/workflows/one-time-align-wxt-mode.yml b/.github/workflows/one-time-align-wxt-mode.yml new file mode 100644 index 00000000..8de14c77 --- /dev/null +++ b/.github/workflows/one-time-align-wxt-mode.yml @@ -0,0 +1,63 @@ +name: One-time align WXT mode + +on: + push: + branches: + - agent/cleanup-wxt-environment-checks + +permissions: + contents: write + +jobs: + align-mode: + name: Use WXT runtime mode + runs-on: ubuntu-latest + + steps: + - name: Checkout cleanup branch + uses: actions/checkout@v7 + with: + ref: agent/cleanup-wxt-environment-checks + fetch-depth: 0 + + - name: Align runtime and manifest modes + shell: bash + run: | + set -euo pipefail + + python <<'PY' + from pathlib import Path + + content_script = Path("entrypoints/content/index.ts") + workflow = Path(".github/workflows/one-time-align-wxt-mode.yml") + source = content_script.read_text(encoding="utf-8") + + old = '''const contentScriptMatches = import.meta.env.DEV + ? DEV_SITES + : [""];''' + new = '''const contentScriptMatches = + import.meta.env.MODE === "development" ? DEV_SITES : [""];''' + + if source.count(old) != 1: + raise SystemExit("Expected exactly one import.meta.env.DEV scope check") + + content_script.write_text(source.replace(old, new), encoding="utf-8") + workflow.unlink() + PY + + if grep -RIn --exclude-dir=.git --exclude='CHANGELOG.md' '__DEV_MODE__\|import\.meta\.env\.DEV' .; then + echo 'Legacy development checks remain.' >&2 + exit 1 + fi + + git diff --check + + - name: Commit aligned mode check + shell: bash + run: | + set -euo pipefail + git config user.name "eplus-bot" + git config user.email "157664013+eplus-bot@users.noreply.github.com" + git add entrypoints/content/index.ts .github/workflows/one-time-align-wxt-mode.yml + git commit -m "fix: align content script with WXT build mode" + git push origin HEAD:agent/cleanup-wxt-environment-checks From bfff3c164295ecd5f915c15b43af016835af7ab3 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 12:46:41 +0700 Subject: [PATCH 016/101] fix: make one-time WXT mode replacement format-safe --- .github/workflows/one-time-align-wxt-mode.yml | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/.github/workflows/one-time-align-wxt-mode.yml b/.github/workflows/one-time-align-wxt-mode.yml index 8de14c77..9833af4d 100644 --- a/.github/workflows/one-time-align-wxt-mode.yml +++ b/.github/workflows/one-time-align-wxt-mode.yml @@ -26,22 +26,27 @@ jobs: set -euo pipefail python <<'PY' + import re from pathlib import Path content_script = Path("entrypoints/content/index.ts") workflow = Path(".github/workflows/one-time-align-wxt-mode.yml") source = content_script.read_text(encoding="utf-8") + pattern = re.compile( + r'const contentScriptMatches\s*=\s*import\.meta\.env\.DEV\s*\?\s*DEV_SITES\s*:\s*\[""\];' + ) + replacement = ( + 'const contentScriptMatches =\n' + ' import.meta.env.MODE === "development" ? DEV_SITES : [""];' + ) + updated, replacements = pattern.subn(replacement, source) - old = '''const contentScriptMatches = import.meta.env.DEV - ? DEV_SITES - : [""];''' - new = '''const contentScriptMatches = - import.meta.env.MODE === "development" ? DEV_SITES : [""];''' + if replacements != 1: + raise SystemExit( + f"Expected exactly one import.meta.env.DEV scope check, found {replacements}" + ) - if source.count(old) != 1: - raise SystemExit("Expected exactly one import.meta.env.DEV scope check") - - content_script.write_text(source.replace(old, new), encoding="utf-8") + content_script.write_text(updated, encoding="utf-8") workflow.unlink() PY From cc6a0cf388e781d8ed9db7c94ca4d0ac6bada8cf Mon Sep 17 00:00:00 2001 From: eplus-bot <157664013+eplus-bot@users.noreply.github.com> Date: Thu, 23 Jul 2026 05:46:50 +0000 Subject: [PATCH 017/101] fix: align content script with WXT build mode --- .github/workflows/one-time-align-wxt-mode.yml | 68 ------------------- entrypoints/content/index.ts | 3 +- 2 files changed, 2 insertions(+), 69 deletions(-) delete mode 100644 .github/workflows/one-time-align-wxt-mode.yml diff --git a/.github/workflows/one-time-align-wxt-mode.yml b/.github/workflows/one-time-align-wxt-mode.yml deleted file mode 100644 index 9833af4d..00000000 --- a/.github/workflows/one-time-align-wxt-mode.yml +++ /dev/null @@ -1,68 +0,0 @@ -name: One-time align WXT mode - -on: - push: - branches: - - agent/cleanup-wxt-environment-checks - -permissions: - contents: write - -jobs: - align-mode: - name: Use WXT runtime mode - runs-on: ubuntu-latest - - steps: - - name: Checkout cleanup branch - uses: actions/checkout@v7 - with: - ref: agent/cleanup-wxt-environment-checks - fetch-depth: 0 - - - name: Align runtime and manifest modes - shell: bash - run: | - set -euo pipefail - - python <<'PY' - import re - from pathlib import Path - - content_script = Path("entrypoints/content/index.ts") - workflow = Path(".github/workflows/one-time-align-wxt-mode.yml") - source = content_script.read_text(encoding="utf-8") - pattern = re.compile( - r'const contentScriptMatches\s*=\s*import\.meta\.env\.DEV\s*\?\s*DEV_SITES\s*:\s*\[""\];' - ) - replacement = ( - 'const contentScriptMatches =\n' - ' import.meta.env.MODE === "development" ? DEV_SITES : [""];' - ) - updated, replacements = pattern.subn(replacement, source) - - if replacements != 1: - raise SystemExit( - f"Expected exactly one import.meta.env.DEV scope check, found {replacements}" - ) - - content_script.write_text(updated, encoding="utf-8") - workflow.unlink() - PY - - if grep -RIn --exclude-dir=.git --exclude='CHANGELOG.md' '__DEV_MODE__\|import\.meta\.env\.DEV' .; then - echo 'Legacy development checks remain.' >&2 - exit 1 - fi - - git diff --check - - - name: Commit aligned mode check - shell: bash - run: | - set -euo pipefail - git config user.name "eplus-bot" - git config user.email "157664013+eplus-bot@users.noreply.github.com" - git add entrypoints/content/index.ts .github/workflows/one-time-align-wxt-mode.yml - git commit -m "fix: align content script with WXT build mode" - git push origin HEAD:agent/cleanup-wxt-environment-checks diff --git a/entrypoints/content/index.ts b/entrypoints/content/index.ts index 11e40f5f..eda3d8a3 100644 --- a/entrypoints/content/index.ts +++ b/entrypoints/content/index.ts @@ -1582,7 +1582,8 @@ function observeDOM() { const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; -const contentScriptMatches = import.meta.env.DEV ? DEV_SITES : [""]; +const contentScriptMatches = + import.meta.env.MODE === "development" ? DEV_SITES : [""]; export default defineContentScript({ matches: contentScriptMatches, From dec94a31c140bc2c00e66cdaa03c623d85f2ec14 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 12:49:30 +0700 Subject: [PATCH 018/101] refactor: centralize WXT mode names --- scripts/verify-manifest-scope.mjs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/verify-manifest-scope.mjs b/scripts/verify-manifest-scope.mjs index 6b3918a9..4fbf56dd 100644 --- a/scripts/verify-manifest-scope.mjs +++ b/scripts/verify-manifest-scope.mjs @@ -4,7 +4,9 @@ import { join } from "node:path"; const OUTPUT_ROOT = ".output"; const ALL_URLS = ""; const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; -const SUPPORTED_MODES = new Set(["development", "production"]); +const DEVELOPMENT_MODE = "development"; +const PRODUCTION_MODE = "production"; +const SUPPORTED_MODES = new Set([DEVELOPMENT_MODE, PRODUCTION_MODE]); /** Writes one informational line to standard output. */ function writeInfo(message) { @@ -104,7 +106,7 @@ function validateManifest(manifestPath, mode) { ...(manifest.permissions ?? []), ]); - return mode === "development" + return mode === DEVELOPMENT_MODE ? validateDevelopmentScope(manifestPath, contentScriptMatches, grantedHosts) : validateProductionScope(manifestPath, contentScriptMatches, grantedHosts); } @@ -130,10 +132,10 @@ function validateBrowser(browser, mode) { /** Parses the expected mode and browser arguments. */ function parseArguments() { - const [mode = "production", ...requestedBrowsers] = process.argv.slice(2); + const [mode = PRODUCTION_MODE, ...requestedBrowsers] = process.argv.slice(2); if (!SUPPORTED_MODES.has(mode)) { throw new Error( - `Unsupported mode "${mode}". Use development or production.`, + `Unsupported mode "${mode}". Use ${DEVELOPMENT_MODE} or ${PRODUCTION_MODE}.`, ); } From f2c0085ebe7c0b014b19fb85573a4de4909be28e Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 12:52:57 +0700 Subject: [PATCH 019/101] chore: move content matches to WXT manifest generation --- .../one-time-static-content-matches.yml | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 .github/workflows/one-time-static-content-matches.yml diff --git a/.github/workflows/one-time-static-content-matches.yml b/.github/workflows/one-time-static-content-matches.yml new file mode 100644 index 00000000..3affa693 --- /dev/null +++ b/.github/workflows/one-time-static-content-matches.yml @@ -0,0 +1,72 @@ +name: One-time static content matches + +on: + push: + branches: + - agent/cleanup-wxt-environment-checks + +permissions: + contents: write + +jobs: + cleanup: + name: Remove entrypoint mode logic + runs-on: ubuntu-latest + + steps: + - name: Checkout cleanup branch + uses: actions/checkout@v7 + with: + ref: agent/cleanup-wxt-environment-checks + fetch-depth: 0 + + - name: Use static entrypoint matches + shell: bash + run: | + set -euo pipefail + + python <<'PY' + import re + from pathlib import Path + + content_script = Path("entrypoints/content/index.ts") + workflow = Path(".github/workflows/one-time-static-content-matches.yml") + source = content_script.read_text(encoding="utf-8") + pattern = re.compile( + r'const DEV_SITES\s*=\s*\[[^;]+\];\s*' + r'const contentScriptMatches\s*=.*?;\s*' + r'export default defineContentScript\(\{\s*' + r'matches:\s*contentScriptMatches,', + re.DOTALL, + ) + replacement = ( + 'export default defineContentScript({\n' + ' matches: [""],' + ) + updated, replacements = pattern.subn(replacement, source) + + if replacements != 1: + raise SystemExit( + f"Expected exactly one dynamic content-script match block, found {replacements}" + ) + + content_script.write_text(updated, encoding="utf-8") + workflow.unlink() + PY + + if grep -n 'contentScriptMatches\|import\.meta\.env\.MODE\|import\.meta\.env\.DEV\|__DEV_MODE__' entrypoints/content/index.ts; then + echo 'Legacy entrypoint mode logic remains.' >&2 + exit 1 + fi + + git diff --check + + - name: Commit static entrypoint matches + shell: bash + run: | + set -euo pipefail + git config user.name "eplus-bot" + git config user.email "157664013+eplus-bot@users.noreply.github.com" + git add entrypoints/content/index.ts .github/workflows/one-time-static-content-matches.yml + git commit -m "refactor: keep content script matches static" + git push origin HEAD:agent/cleanup-wxt-environment-checks From 80ad957a37225e1e5800ab08ab1cbb4f9124fca1 Mon Sep 17 00:00:00 2001 From: eplus-bot <157664013+eplus-bot@users.noreply.github.com> Date: Thu, 23 Jul 2026 05:53:05 +0000 Subject: [PATCH 020/101] refactor: keep content script matches static --- .../one-time-static-content-matches.yml | 72 ------------------- entrypoints/content/index.ts | 7 +- 2 files changed, 1 insertion(+), 78 deletions(-) delete mode 100644 .github/workflows/one-time-static-content-matches.yml diff --git a/.github/workflows/one-time-static-content-matches.yml b/.github/workflows/one-time-static-content-matches.yml deleted file mode 100644 index 3affa693..00000000 --- a/.github/workflows/one-time-static-content-matches.yml +++ /dev/null @@ -1,72 +0,0 @@ -name: One-time static content matches - -on: - push: - branches: - - agent/cleanup-wxt-environment-checks - -permissions: - contents: write - -jobs: - cleanup: - name: Remove entrypoint mode logic - runs-on: ubuntu-latest - - steps: - - name: Checkout cleanup branch - uses: actions/checkout@v7 - with: - ref: agent/cleanup-wxt-environment-checks - fetch-depth: 0 - - - name: Use static entrypoint matches - shell: bash - run: | - set -euo pipefail - - python <<'PY' - import re - from pathlib import Path - - content_script = Path("entrypoints/content/index.ts") - workflow = Path(".github/workflows/one-time-static-content-matches.yml") - source = content_script.read_text(encoding="utf-8") - pattern = re.compile( - r'const DEV_SITES\s*=\s*\[[^;]+\];\s*' - r'const contentScriptMatches\s*=.*?;\s*' - r'export default defineContentScript\(\{\s*' - r'matches:\s*contentScriptMatches,', - re.DOTALL, - ) - replacement = ( - 'export default defineContentScript({\n' - ' matches: [""],' - ) - updated, replacements = pattern.subn(replacement, source) - - if replacements != 1: - raise SystemExit( - f"Expected exactly one dynamic content-script match block, found {replacements}" - ) - - content_script.write_text(updated, encoding="utf-8") - workflow.unlink() - PY - - if grep -n 'contentScriptMatches\|import\.meta\.env\.MODE\|import\.meta\.env\.DEV\|__DEV_MODE__' entrypoints/content/index.ts; then - echo 'Legacy entrypoint mode logic remains.' >&2 - exit 1 - fi - - git diff --check - - - name: Commit static entrypoint matches - shell: bash - run: | - set -euo pipefail - git config user.name "eplus-bot" - git config user.email "157664013+eplus-bot@users.noreply.github.com" - git add entrypoints/content/index.ts .github/workflows/one-time-static-content-matches.yml - git commit -m "refactor: keep content script matches static" - git push origin HEAD:agent/cleanup-wxt-environment-checks diff --git a/entrypoints/content/index.ts b/entrypoints/content/index.ts index eda3d8a3..7616eebd 100644 --- a/entrypoints/content/index.ts +++ b/entrypoints/content/index.ts @@ -1580,13 +1580,8 @@ function observeDOM() { return observer; } -const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; - -const contentScriptMatches = - import.meta.env.MODE === "development" ? DEV_SITES : [""]; - export default defineContentScript({ - matches: contentScriptMatches, + matches: [""], async main() { const disabledSitesResult = await browser.storage.local.get( INLINE_DISABLED_SITES_KEY, From 44c1240f759c5cd12399847df7ad3b30676404a9 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 12:54:14 +0700 Subject: [PATCH 021/101] fix: generate inline content scope from WXT mode --- wxt.config.ts | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/wxt.config.ts b/wxt.config.ts index 4201b689..fe1aa892 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -5,8 +5,9 @@ import { fileURLToPath } from "node:url"; // Fix EventEmitter maxListeners warning EventEmitter.defaultMaxListeners = 15; -// Dev-only sites to limit reload spam during development +const ALL_URLS = [""]; const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; +const INLINE_CONTENT_SCRIPT = "content-scripts/content.js"; export default defineConfig({ modules: ["@wxt-dev/module-react", "@wxt-dev/auto-icons"], @@ -21,7 +22,7 @@ export default defineConfig({ }, }, }), - /** Uses WXT's resolved mode because import.meta.env is unavailable in manifest config. */ + /** Uses WXT's resolved mode because Vite runtime variables are unavailable here. */ manifest: ({ mode }) => ({ name: "__MSG_extensionName__", description: "__MSG_extensionDescription__", @@ -30,7 +31,7 @@ export default defineConfig({ default_title: "__MSG_extensionName__", }, permissions: ["storage", "clipboardWrite", "contextMenus"], - host_permissions: mode === "development" ? DEV_SITES : [""], + host_permissions: mode === "development" ? DEV_SITES : ALL_URLS, browser_specific_settings: { gecko: { id: "{c9d7bdb4-9d7e-4a25-8b4a-0a8d51f3b8b1}", @@ -41,7 +42,24 @@ export default defineConfig({ }, }, }), + hooks: { + "build:manifestGenerated": (wxt, manifest) => { + const inlineContentScript = manifest.content_scripts?.find( + (contentScript) => + contentScript.js?.some((file) => + file.endsWith(INLINE_CONTENT_SCRIPT), + ), + ); + + if (!inlineContentScript) { + throw new Error("Inline content script was not generated."); + } + + inlineContentScript.matches = + wxt.config.mode === "development" ? [...DEV_SITES] : [...ALL_URLS]; + }, + }, autoIcons: { developmentIndicator: "overlay", }, -}); +}); \ No newline at end of file From f010e83e64cc00363b9987f2b8958b87e13a294f Mon Sep 17 00:00:00 2001 From: "deepsource-autofix[bot]" <62050782+deepsource-autofix[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 05:54:32 +0000 Subject: [PATCH 022/101] style: format code with Prettier This commit fixes the style issues introduced in 44c1240 according to the output from Prettier. Details: https://github.com/ePlus-DEV/gmail-alias-toolkit/pull/79 --- wxt.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wxt.config.ts b/wxt.config.ts index fe1aa892..3ab26b73 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -62,4 +62,4 @@ export default defineConfig({ autoIcons: { developmentIndicator: "overlay", }, -}); \ No newline at end of file +}); From 0166c1d61b07c899e50a1c8d99afe5518e2f322d Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 12:56:56 +0700 Subject: [PATCH 023/101] ci: upload manifest diagnostics on failure --- .github/workflows/ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 41a149fb..5c16d90e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -86,5 +86,13 @@ jobs: - name: Verify development inline helper scope run: node scripts/verify-manifest-scope.mjs development chrome + - name: Upload generated manifest diagnostics + if: failure() + uses: actions/upload-artifact@v7 + with: + name: generated-manifest-diagnostics + path: .output/*/manifest.json + if-no-files-found: warn + - name: Build website run: yarn workspace gmail-alias-toolkit-web build From 6537b8eb6b3fae5d61617bbf135e8c67ece55a55 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 12:59:08 +0700 Subject: [PATCH 024/101] chore: capture WXT development manifest --- .../one-time-capture-dev-manifest.yml | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 .github/workflows/one-time-capture-dev-manifest.yml diff --git a/.github/workflows/one-time-capture-dev-manifest.yml b/.github/workflows/one-time-capture-dev-manifest.yml new file mode 100644 index 00000000..2fe1476d --- /dev/null +++ b/.github/workflows/one-time-capture-dev-manifest.yml @@ -0,0 +1,73 @@ +name: One-time capture development manifest + +on: + push: + branches: + - agent/cleanup-wxt-environment-checks + +permissions: + contents: write + +jobs: + capture: + name: Capture generated manifest + runs-on: ubuntu-latest + + steps: + - name: Checkout cleanup branch + uses: actions/checkout@v7 + with: + ref: agent/cleanup-wxt-environment-checks + fetch-depth: 0 + + - name: Enable Corepack + run: corepack enable + + - name: Setup Node.js + uses: actions/setup-node@v7 + with: + node-version: 24.x + cache: yarn + cache-dependency-path: yarn.lock + + - name: Install dependencies + run: yarn install --immutable --mode=skip-build + + - name: Build development manifest + run: yarn exec wxt build --mode development + + - name: Capture manifests + shell: bash + run: | + set -euo pipefail + + python <<'PY' + import json + from pathlib import Path + + output = Path("debug-manifests") + output.mkdir(exist_ok=True) + manifests = sorted(Path(".output").glob("*/manifest.json")) + if not manifests: + raise SystemExit("No generated manifests found") + + for manifest_path in manifests: + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + target = output / f"{manifest_path.parent.name}.json" + target.write_text( + json.dumps(manifest, indent=2, sort_keys=True) + "\n", + encoding="utf-8", + ) + + Path(".github/workflows/one-time-capture-dev-manifest.yml").unlink() + PY + + - name: Commit captured manifests + shell: bash + run: | + set -euo pipefail + git config user.name "eplus-bot" + git config user.email "157664013+eplus-bot@users.noreply.github.com" + git add debug-manifests .github/workflows/one-time-capture-dev-manifest.yml + git commit -m "chore: capture generated development manifest" + git push origin HEAD:agent/cleanup-wxt-environment-checks From ee06b84ba5b5406a6298a65ed2fc90fd67d87968 Mon Sep 17 00:00:00 2001 From: eplus-bot <157664013+eplus-bot@users.noreply.github.com> Date: Thu, 23 Jul 2026 05:59:32 +0000 Subject: [PATCH 025/101] chore: capture generated development manifest --- .../one-time-capture-dev-manifest.yml | 73 ------------------- debug-manifests/chrome-mv3-dev.json | 55 ++++++++++++++ 2 files changed, 55 insertions(+), 73 deletions(-) delete mode 100644 .github/workflows/one-time-capture-dev-manifest.yml create mode 100644 debug-manifests/chrome-mv3-dev.json diff --git a/.github/workflows/one-time-capture-dev-manifest.yml b/.github/workflows/one-time-capture-dev-manifest.yml deleted file mode 100644 index 2fe1476d..00000000 --- a/.github/workflows/one-time-capture-dev-manifest.yml +++ /dev/null @@ -1,73 +0,0 @@ -name: One-time capture development manifest - -on: - push: - branches: - - agent/cleanup-wxt-environment-checks - -permissions: - contents: write - -jobs: - capture: - name: Capture generated manifest - runs-on: ubuntu-latest - - steps: - - name: Checkout cleanup branch - uses: actions/checkout@v7 - with: - ref: agent/cleanup-wxt-environment-checks - fetch-depth: 0 - - - name: Enable Corepack - run: corepack enable - - - name: Setup Node.js - uses: actions/setup-node@v7 - with: - node-version: 24.x - cache: yarn - cache-dependency-path: yarn.lock - - - name: Install dependencies - run: yarn install --immutable --mode=skip-build - - - name: Build development manifest - run: yarn exec wxt build --mode development - - - name: Capture manifests - shell: bash - run: | - set -euo pipefail - - python <<'PY' - import json - from pathlib import Path - - output = Path("debug-manifests") - output.mkdir(exist_ok=True) - manifests = sorted(Path(".output").glob("*/manifest.json")) - if not manifests: - raise SystemExit("No generated manifests found") - - for manifest_path in manifests: - manifest = json.loads(manifest_path.read_text(encoding="utf-8")) - target = output / f"{manifest_path.parent.name}.json" - target.write_text( - json.dumps(manifest, indent=2, sort_keys=True) + "\n", - encoding="utf-8", - ) - - Path(".github/workflows/one-time-capture-dev-manifest.yml").unlink() - PY - - - name: Commit captured manifests - shell: bash - run: | - set -euo pipefail - git config user.name "eplus-bot" - git config user.email "157664013+eplus-bot@users.noreply.github.com" - git add debug-manifests .github/workflows/one-time-capture-dev-manifest.yml - git commit -m "chore: capture generated development manifest" - git push origin HEAD:agent/cleanup-wxt-environment-checks diff --git a/debug-manifests/chrome-mv3-dev.json b/debug-manifests/chrome-mv3-dev.json new file mode 100644 index 00000000..12af90a5 --- /dev/null +++ b/debug-manifests/chrome-mv3-dev.json @@ -0,0 +1,55 @@ +{ + "action": { + "default_popup": "popup.html", + "default_title": "__MSG_extensionName__" + }, + "background": { + "service_worker": "background.js" + }, + "browser_specific_settings": { + "gecko": { + "data_collection_permissions": { + "required": [ + "none" + ] + }, + "id": "{c9d7bdb4-9d7e-4a25-8b4a-0a8d51f3b8b1}" + } + }, + "content_scripts": [ + { + "css": [ + "content-scripts/content.css" + ], + "js": [ + "content-scripts/content.js" + ], + "matches": [ + "*://*.miro.com/*", + "*://selfh.st/*", + "*://gumroad.com/*" + ] + } + ], + "default_locale": "en", + "description": "__MSG_extensionDescription__", + "host_permissions": [ + "*://*.miro.com/*", + "*://selfh.st/*", + "*://gumroad.com/*" + ], + "icons": { + "128": "icons/128.png", + "16": "icons/16.png", + "32": "icons/32.png", + "48": "icons/48.png" + }, + "manifest_version": 3, + "name": "__MSG_extensionName__", + "permissions": [ + "storage", + "clipboardWrite", + "contextMenus" + ], + "version": "1.3.1" +} From 20be629392774fb8b2fc2f325c6ff7a87d56a832 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 13:02:26 +0700 Subject: [PATCH 026/101] fix: select generated manifests by WXT mode --- scripts/verify-manifest-scope.mjs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/scripts/verify-manifest-scope.mjs b/scripts/verify-manifest-scope.mjs index 4fbf56dd..6ecfdb1f 100644 --- a/scripts/verify-manifest-scope.mjs +++ b/scripts/verify-manifest-scope.mjs @@ -6,6 +6,7 @@ const ALL_URLS = ""; const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; const DEVELOPMENT_MODE = "development"; const PRODUCTION_MODE = "production"; +const DEVELOPMENT_OUTPUT_SUFFIX = "-dev"; const SUPPORTED_MODES = new Set([DEVELOPMENT_MODE, PRODUCTION_MODE]); /** Writes one informational line to standard output. */ @@ -18,11 +19,25 @@ function writeError(message) { process.stderr.write(`ERROR: ${message}\n`); } -/** Returns WXT output directories for one browser. */ -function findBrowserOutputs(browser) { +/** Returns whether a generated output directory belongs to the expected mode. */ +function matchesMode(outputDirectory, mode) { + const isDevelopmentOutput = outputDirectory.endsWith( + DEVELOPMENT_OUTPUT_SUFFIX, + ); + + return mode === DEVELOPMENT_MODE + ? isDevelopmentOutput + : !isDevelopmentOutput; +} + +/** Returns WXT output directories for one browser and mode. */ +function findBrowserOutputs(browser, mode) { return readdirSync(OUTPUT_ROOT, { withFileTypes: true }) .filter( - (entry) => entry.isDirectory() && entry.name.startsWith(`${browser}-mv`), + (entry) => + entry.isDirectory() && + entry.name.startsWith(`${browser}-mv`) && + matchesMode(entry.name, mode), ) .map((entry) => entry.name); } @@ -111,9 +126,9 @@ function validateManifest(manifestPath, mode) { : validateProductionScope(manifestPath, contentScriptMatches, grantedHosts); } -/** Returns validation failures for all outputs of one browser. */ +/** Returns validation failures for all outputs of one browser and mode. */ function validateBrowser(browser, mode) { - const outputDirectories = findBrowserOutputs(browser); + const outputDirectories = findBrowserOutputs(browser, mode); if (outputDirectories.length === 0) { return [`No ${mode} output directory found for ${browser}.`]; } From 8e50290762acf068907b2fa01228f187da1a1223 Mon Sep 17 00:00:00 2001 From: "deepsource-autofix[bot]" <62050782+deepsource-autofix[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 06:02:42 +0000 Subject: [PATCH 027/101] style: format code with Prettier This commit fixes the style issues introduced in 20be629 according to the output from Prettier. Details: https://github.com/ePlus-DEV/gmail-alias-toolkit/pull/79 --- scripts/verify-manifest-scope.mjs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/verify-manifest-scope.mjs b/scripts/verify-manifest-scope.mjs index 6ecfdb1f..d2215097 100644 --- a/scripts/verify-manifest-scope.mjs +++ b/scripts/verify-manifest-scope.mjs @@ -25,9 +25,7 @@ function matchesMode(outputDirectory, mode) { DEVELOPMENT_OUTPUT_SUFFIX, ); - return mode === DEVELOPMENT_MODE - ? isDevelopmentOutput - : !isDevelopmentOutput; + return mode === DEVELOPMENT_MODE ? isDevelopmentOutput : !isDevelopmentOutput; } /** Returns WXT output directories for one browser and mode. */ From 13ea6e0cbbc07dc5c9fd2d79d1a31125b2f04e59 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 13:02:46 +0700 Subject: [PATCH 028/101] ci: remove temporary manifest diagnostics --- .github/workflows/ci.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5c16d90e..41a149fb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -86,13 +86,5 @@ jobs: - name: Verify development inline helper scope run: node scripts/verify-manifest-scope.mjs development chrome - - name: Upload generated manifest diagnostics - if: failure() - uses: actions/upload-artifact@v7 - with: - name: generated-manifest-diagnostics - path: .output/*/manifest.json - if-no-files-found: warn - - name: Build website run: yarn workspace gmail-alias-toolkit-web build From 924a3d4710bdb3eb71ea7fdc209c76f26f5e0a3f Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 13:02:55 +0700 Subject: [PATCH 029/101] chore: remove temporary manifest capture --- debug-manifests/chrome-mv3-dev.json | 55 ----------------------------- 1 file changed, 55 deletions(-) delete mode 100644 debug-manifests/chrome-mv3-dev.json diff --git a/debug-manifests/chrome-mv3-dev.json b/debug-manifests/chrome-mv3-dev.json deleted file mode 100644 index 12af90a5..00000000 --- a/debug-manifests/chrome-mv3-dev.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "action": { - "default_popup": "popup.html", - "default_title": "__MSG_extensionName__" - }, - "background": { - "service_worker": "background.js" - }, - "browser_specific_settings": { - "gecko": { - "data_collection_permissions": { - "required": [ - "none" - ] - }, - "id": "{c9d7bdb4-9d7e-4a25-8b4a-0a8d51f3b8b1}" - } - }, - "content_scripts": [ - { - "css": [ - "content-scripts/content.css" - ], - "js": [ - "content-scripts/content.js" - ], - "matches": [ - "*://*.miro.com/*", - "*://selfh.st/*", - "*://gumroad.com/*" - ] - } - ], - "default_locale": "en", - "description": "__MSG_extensionDescription__", - "host_permissions": [ - "*://*.miro.com/*", - "*://selfh.st/*", - "*://gumroad.com/*" - ], - "icons": { - "128": "icons/128.png", - "16": "icons/16.png", - "32": "icons/32.png", - "48": "icons/48.png" - }, - "manifest_version": 3, - "name": "__MSG_extensionName__", - "permissions": [ - "storage", - "clipboardWrite", - "contextMenus" - ], - "version": "1.3.1" -} From d6f488d92dee0d95f49d45d4ce2a5021222d3998 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 13:05:38 +0700 Subject: [PATCH 030/101] ci: remove development-mode extension build --- .github/workflows/ci.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 41a149fb..b4042f6b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,11 +80,5 @@ jobs: - name: Verify production inline helper scope run: node scripts/verify-manifest-scope.mjs production chrome - - name: Build development-mode extension - run: yarn exec wxt build --mode development - - - name: Verify development inline helper scope - run: node scripts/verify-manifest-scope.mjs development chrome - - name: Build website run: yarn workspace gmail-alias-toolkit-web build From f777b109fa220726b7159034a624a872e29066a6 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 14:14:58 +0700 Subject: [PATCH 031/101] refactor: initialize manifest verifier options safely --- scripts/verify-manifest-scope.mjs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/scripts/verify-manifest-scope.mjs b/scripts/verify-manifest-scope.mjs index d2215097..51940f0b 100644 --- a/scripts/verify-manifest-scope.mjs +++ b/scripts/verify-manifest-scope.mjs @@ -158,6 +158,17 @@ function parseArguments() { }; } +/** Parses arguments and reports invalid input without leaving partial state. */ +function parseArgumentsSafely() { + try { + return parseArguments(); + } catch (error) { + writeError(error instanceof Error ? error.message : String(error)); + process.exitCode = 1; + return null; + } +} + /** Runs the generated manifest scope verification. */ function main() { if (!existsSync(OUTPUT_ROOT)) { @@ -166,14 +177,8 @@ function main() { return; } - let options; - try { - options = parseArguments(); - } catch (error) { - writeError(error instanceof Error ? error.message : String(error)); - process.exitCode = 1; - return; - } + const options = parseArgumentsSafely(); + if (!options) return; const failures = options.browsers.flatMap((browser) => validateBrowser(browser, options.mode), From 64f1634b341d56da70f9062664b3f3b5ab435242 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 18:17:04 +0700 Subject: [PATCH 032/101] fix: reject unexpected development URL patterns --- scripts/verify-manifest-scope.mjs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/scripts/verify-manifest-scope.mjs b/scripts/verify-manifest-scope.mjs index 51940f0b..5aea14e6 100644 --- a/scripts/verify-manifest-scope.mjs +++ b/scripts/verify-manifest-scope.mjs @@ -45,6 +45,11 @@ function readManifest(manifestPath) { return JSON.parse(readFileSync(manifestPath, "utf8")); } +/** Returns whether a permission value is a URL pattern. */ +function isUrlPattern(value) { + return value === ALL_URLS || value.includes("://") || value.startsWith("about:"); +} + /** Returns failures for the expected production URL scope. */ function validateProductionScope( manifestPath, @@ -88,6 +93,25 @@ function validateDevelopmentScope( ); } + const unexpectedMatches = contentScriptMatches.filter( + (match) => match !== ALL_URLS && !DEV_SITES.includes(match), + ); + if (unexpectedMatches.length > 0) { + failures.push( + `${manifestPath}: development content script includes unexpected matches: ${unexpectedMatches.join(", ")}.`, + ); + } + + const unexpectedHosts = [...grantedHosts].filter( + (host) => + host !== ALL_URLS && isUrlPattern(host) && !DEV_SITES.includes(host), + ); + if (unexpectedHosts.length > 0) { + failures.push( + `${manifestPath}: development host permissions include unexpected patterns: ${unexpectedHosts.join(", ")}.`, + ); + } + for (const site of DEV_SITES) { if (!contentScriptMatches.includes(site)) { failures.push( From cbf7e6d674d3602ffa924c0aac7ddf5927f83c30 Mon Sep 17 00:00:00 2001 From: "deepsource-autofix[bot]" <62050782+deepsource-autofix[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 11:19:37 +0000 Subject: [PATCH 033/101] style: format code with Prettier This commit fixes the style issues introduced in 64f1634 according to the output from Prettier. Details: https://github.com/ePlus-DEV/gmail-alias-toolkit/pull/80 --- scripts/verify-manifest-scope.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/verify-manifest-scope.mjs b/scripts/verify-manifest-scope.mjs index 5aea14e6..f1deea12 100644 --- a/scripts/verify-manifest-scope.mjs +++ b/scripts/verify-manifest-scope.mjs @@ -47,7 +47,9 @@ function readManifest(manifestPath) { /** Returns whether a permission value is a URL pattern. */ function isUrlPattern(value) { - return value === ALL_URLS || value.includes("://") || value.startsWith("about:"); + return ( + value === ALL_URLS || value.includes("://") || value.startsWith("about:") + ); } /** Returns failures for the expected production URL scope. */ From 291128cfed38e0a86d2154c878b33ef1f17c5bf4 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 19:18:38 +0700 Subject: [PATCH 034/101] fix: validate only inline helper manifest scope --- scripts/verify-manifest-scope.mjs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/scripts/verify-manifest-scope.mjs b/scripts/verify-manifest-scope.mjs index f1deea12..5da35977 100644 --- a/scripts/verify-manifest-scope.mjs +++ b/scripts/verify-manifest-scope.mjs @@ -3,6 +3,7 @@ import { join } from "node:path"; const OUTPUT_ROOT = ".output"; const ALL_URLS = ""; +const INLINE_CONTENT_SCRIPT = "content-scripts/content.js"; const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; const DEVELOPMENT_MODE = "development"; const PRODUCTION_MODE = "production"; @@ -137,9 +138,15 @@ function validateManifest(manifestPath, mode) { } const manifest = readManifest(manifestPath); - const contentScriptMatches = (manifest.content_scripts ?? []).flatMap( - (contentScript) => contentScript.matches ?? [], + const inlineContentScript = (manifest.content_scripts ?? []).find( + (contentScript) => + contentScript.js?.some((file) => file.endsWith(INLINE_CONTENT_SCRIPT)), ); + if (!inlineContentScript) { + return [`${manifestPath}: inline content script is missing.`]; + } + + const contentScriptMatches = inlineContentScript.matches ?? []; const grantedHosts = new Set([ ...(manifest.host_permissions ?? []), ...(manifest.permissions ?? []), From 7ea4a2ad201c2bcf28fdd16da498bfa99ab5494d Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 20:36:15 +0700 Subject: [PATCH 035/101] test: expose manifest validator for unit coverage --- scripts/verify-manifest-scope.mjs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/scripts/verify-manifest-scope.mjs b/scripts/verify-manifest-scope.mjs index 5da35977..c8f4481c 100644 --- a/scripts/verify-manifest-scope.mjs +++ b/scripts/verify-manifest-scope.mjs @@ -1,5 +1,6 @@ import { existsSync, readFileSync, readdirSync } from "node:fs"; import { join } from "node:path"; +import { pathToFileURL } from "node:url"; const OUTPUT_ROOT = ".output"; const ALL_URLS = ""; @@ -132,7 +133,7 @@ function validateDevelopmentScope( } /** Returns validation failures for one generated manifest. */ -function validateManifest(manifestPath, mode) { +export function validateManifest(manifestPath, mode) { if (!existsSync(manifestPath)) { return [`Missing manifest: ${manifestPath}`]; } @@ -223,4 +224,10 @@ function main() { process.exitCode = 1; } -main(); +/** Returns whether this module was launched as the Node.js entrypoint. */ +function isDirectExecution() { + const entrypoint = process.argv[1]; + return Boolean(entrypoint && import.meta.url === pathToFileURL(entrypoint).href); +} + +if (isDirectExecution()) main(); From 14104524a3c5fcae215b9af2eb23697c4c0c75f6 Mon Sep 17 00:00:00 2001 From: "deepsource-autofix[bot]" <62050782+deepsource-autofix[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 13:36:29 +0000 Subject: [PATCH 036/101] style: format code with Prettier This commit fixes the style issues introduced in 7ea4a2a according to the output from Prettier. Details: https://github.com/ePlus-DEV/gmail-alias-toolkit/pull/78 --- scripts/verify-manifest-scope.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/verify-manifest-scope.mjs b/scripts/verify-manifest-scope.mjs index c8f4481c..c7fa018d 100644 --- a/scripts/verify-manifest-scope.mjs +++ b/scripts/verify-manifest-scope.mjs @@ -227,7 +227,9 @@ function main() { /** Returns whether this module was launched as the Node.js entrypoint. */ function isDirectExecution() { const entrypoint = process.argv[1]; - return Boolean(entrypoint && import.meta.url === pathToFileURL(entrypoint).href); + return Boolean( + entrypoint && import.meta.url === pathToFileURL(entrypoint).href, + ); } if (isDirectExecution()) main(); From cbc4b673e66f4c160665a42ad1bee861e9d7f28e Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 20:36:54 +0700 Subject: [PATCH 037/101] test: include Node manifest validator specs --- vitest.config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vitest.config.ts b/vitest.config.ts index 69be5ba9..2760ac87 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -14,7 +14,7 @@ export default defineConfig({ globals: true, setupFiles: ["./tests/setup.ts"], exclude: ["node_modules/**", ".wxt/**", ".output/**"], - include: ["**/*.test.{ts,tsx}"], + include: ["**/*.test.{ts,tsx,mjs}"], pool: "threads", }, -}); +}); \ No newline at end of file From 0c101d5c0f484585295df0c4a52d719b620b8287 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 20:37:28 +0700 Subject: [PATCH 038/101] test: cover manifest scope validation regressions --- tests/scripts/verify-manifest-scope.test.mjs | 157 +++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 tests/scripts/verify-manifest-scope.test.mjs diff --git a/tests/scripts/verify-manifest-scope.test.mjs b/tests/scripts/verify-manifest-scope.test.mjs new file mode 100644 index 00000000..0d0c68cb --- /dev/null +++ b/tests/scripts/verify-manifest-scope.test.mjs @@ -0,0 +1,157 @@ +// @vitest-environment node + +import { afterEach, describe, expect, it } from "vitest"; +import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { validateManifest } from "../../scripts/verify-manifest-scope.mjs"; + +const ALL_URLS = ""; +const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; +const INLINE_CONTENT_SCRIPT = "content-scripts/content.js"; +const temporaryDirectories = []; + +/** Writes one manifest fixture and returns its path. */ +function writeManifest(manifest) { + const directory = mkdtempSync(join(tmpdir(), "manifest-scope-")); + temporaryDirectories.push(directory); + + const manifestPath = join(directory, "manifest.json"); + writeFileSync(manifestPath, JSON.stringify(manifest), "utf8"); + return manifestPath; +} + +/** Returns a generated inline-helper content-script entry. */ +function inlineHelper(matches) { + return { + matches, + js: [INLINE_CONTENT_SCRIPT], + }; +} + +afterEach(() => { + temporaryDirectories.splice(0).forEach((directory) => { + rmSync(directory, { recursive: true, force: true }); + }); +}); + +describe("manifest scope validator", () => { + it("accepts the exact development allowlist", () => { + const manifestPath = writeManifest({ + content_scripts: [inlineHelper(DEV_SITES)], + host_permissions: DEV_SITES, + permissions: ["storage", "clipboardWrite"], + }); + + expect(validateManifest(manifestPath, "development")).toEqual([]); + }); + + it("accepts Firefox-style development hosts stored in permissions", () => { + const manifestPath = writeManifest({ + content_scripts: [inlineHelper(DEV_SITES)], + permissions: ["storage", ...DEV_SITES], + }); + + expect(validateManifest(manifestPath, "development")).toEqual([]); + }); + + it("rejects broad development content-script matches", () => { + const manifestPath = writeManifest({ + content_scripts: [inlineHelper([...DEV_SITES, "*://*/*"])], + host_permissions: DEV_SITES, + }); + + expect(validateManifest(manifestPath, "development")).toContain( + `${manifestPath}: development content script includes unexpected matches: *://*/*.` , + ); + }); + + it("rejects broad development host permissions", () => { + const manifestPath = writeManifest({ + content_scripts: [inlineHelper(DEV_SITES)], + host_permissions: [...DEV_SITES, "*://*/*"], + permissions: ["storage"], + }); + + expect(validateManifest(manifestPath, "development")).toContain( + `${manifestPath}: development host permissions include unexpected patterns: *://*/*.` , + ); + }); + + it("preserves literal all-URLs development failures", () => { + const manifestPath = writeManifest({ + content_scripts: [inlineHelper([...DEV_SITES, ALL_URLS])], + host_permissions: [...DEV_SITES, ALL_URLS], + }); + + const failures = validateManifest(manifestPath, "development"); + + expect(failures).toContain( + `${manifestPath}: development content script unexpectedly matches ${ALL_URLS}.`, + ); + expect(failures).toContain( + `${manifestPath}: development host permissions unexpectedly include ${ALL_URLS}.`, + ); + }); + + it("reports development allowlist entries that are missing", () => { + const [firstSite, ...remainingSites] = DEV_SITES; + const manifestPath = writeManifest({ + content_scripts: [inlineHelper(remainingSites)], + host_permissions: remainingSites, + }); + + const failures = validateManifest(manifestPath, "development"); + + expect(failures).toContain( + `${manifestPath}: development content script is missing ${firstSite}.`, + ); + expect(failures).toContain( + `${manifestPath}: development host permissions are missing ${firstSite}.`, + ); + }); + + it("validates only the inline helper in production", () => { + const manifestPath = writeManifest({ + content_scripts: [ + { + matches: [ALL_URLS], + js: ["content-scripts/unrelated.js"], + }, + inlineHelper(DEV_SITES), + ], + host_permissions: [ALL_URLS], + }); + + expect(validateManifest(manifestPath, "production")).toContain( + `${manifestPath}: production content script does not match ${ALL_URLS}. Found: ${DEV_SITES.join(", ")}`, + ); + }); + + it("reports a missing generated inline helper", () => { + const manifestPath = writeManifest({ + content_scripts: [ + { + matches: [ALL_URLS], + js: ["content-scripts/unrelated.js"], + }, + ], + host_permissions: [ALL_URLS], + }); + + expect(validateManifest(manifestPath, "production")).toEqual([ + `${manifestPath}: inline content script is missing.`, + ]); + }); + + it("requires production host permission coverage", () => { + const manifestPath = writeManifest({ + content_scripts: [inlineHelper([ALL_URLS])], + permissions: ["storage"], + }); + + expect(validateManifest(manifestPath, "production")).toContain( + `${manifestPath}: production host permissions do not include ${ALL_URLS}.`, + ); + }); +}); From 3a34dcd7a849c9e89b74b722df533005da0f9190 Mon Sep 17 00:00:00 2001 From: "deepsource-autofix[bot]" <62050782+deepsource-autofix[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 13:38:47 +0000 Subject: [PATCH 039/101] style: format code with Prettier This commit fixes the style issues introduced in 0c101d5 according to the output from Prettier. Details: https://github.com/ePlus-DEV/gmail-alias-toolkit/pull/78 --- tests/scripts/verify-manifest-scope.test.mjs | 4 ++-- vitest.config.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/scripts/verify-manifest-scope.test.mjs b/tests/scripts/verify-manifest-scope.test.mjs index 0d0c68cb..a5d7c69e 100644 --- a/tests/scripts/verify-manifest-scope.test.mjs +++ b/tests/scripts/verify-manifest-scope.test.mjs @@ -62,7 +62,7 @@ describe("manifest scope validator", () => { }); expect(validateManifest(manifestPath, "development")).toContain( - `${manifestPath}: development content script includes unexpected matches: *://*/*.` , + `${manifestPath}: development content script includes unexpected matches: *://*/*.`, ); }); @@ -74,7 +74,7 @@ describe("manifest scope validator", () => { }); expect(validateManifest(manifestPath, "development")).toContain( - `${manifestPath}: development host permissions include unexpected patterns: *://*/*.` , + `${manifestPath}: development host permissions include unexpected patterns: *://*/*.`, ); }); diff --git a/vitest.config.ts b/vitest.config.ts index 2760ac87..204e80c3 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -17,4 +17,4 @@ export default defineConfig({ include: ["**/*.test.{ts,tsx,mjs}"], pool: "threads", }, -}); \ No newline at end of file +}); From ff42dbec7a8461fdf48aa897be08d6cea49fc9f3 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 20:42:05 +0700 Subject: [PATCH 040/101] test: share manifest scope constants with specs --- scripts/verify-manifest-scope.mjs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/scripts/verify-manifest-scope.mjs b/scripts/verify-manifest-scope.mjs index c7fa018d..6254dccf 100644 --- a/scripts/verify-manifest-scope.mjs +++ b/scripts/verify-manifest-scope.mjs @@ -3,9 +3,13 @@ import { join } from "node:path"; import { pathToFileURL } from "node:url"; const OUTPUT_ROOT = ".output"; -const ALL_URLS = ""; -const INLINE_CONTENT_SCRIPT = "content-scripts/content.js"; -const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; +export const ALL_URLS = ""; +export const INLINE_CONTENT_SCRIPT = "content-scripts/content.js"; +export const DEV_SITES = [ + "*://*.miro.com/*", + "*://selfh.st/*", + "*://gumroad.com/*", +]; const DEVELOPMENT_MODE = "development"; const PRODUCTION_MODE = "production"; const DEVELOPMENT_OUTPUT_SUFFIX = "-dev"; From 37231c6c8660771936dfa87b4c4cc03a87c3a0ef Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 23 Jul 2026 20:42:49 +0700 Subject: [PATCH 041/101] test: cover missing and valid production manifests --- tests/scripts/verify-manifest-scope.test.mjs | 27 +++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/tests/scripts/verify-manifest-scope.test.mjs b/tests/scripts/verify-manifest-scope.test.mjs index a5d7c69e..94d83172 100644 --- a/tests/scripts/verify-manifest-scope.test.mjs +++ b/tests/scripts/verify-manifest-scope.test.mjs @@ -4,11 +4,13 @@ import { afterEach, describe, expect, it } from "vitest"; import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; -import { validateManifest } from "../../scripts/verify-manifest-scope.mjs"; +import { + ALL_URLS, + DEV_SITES, + INLINE_CONTENT_SCRIPT, + validateManifest, +} from "../../scripts/verify-manifest-scope.mjs"; -const ALL_URLS = ""; -const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; -const INLINE_CONTENT_SCRIPT = "content-scripts/content.js"; const temporaryDirectories = []; /** Writes one manifest fixture and returns its path. */ @@ -111,6 +113,15 @@ describe("manifest scope validator", () => { ); }); + it("accepts a valid Firefox-style production manifest", () => { + const manifestPath = writeManifest({ + content_scripts: [inlineHelper([ALL_URLS])], + permissions: ["storage", ALL_URLS], + }); + + expect(validateManifest(manifestPath, "production")).toEqual([]); + }); + it("validates only the inline helper in production", () => { const manifestPath = writeManifest({ content_scripts: [ @@ -144,6 +155,14 @@ describe("manifest scope validator", () => { ]); }); + it("reports a missing manifest file", () => { + const missingManifestPath = join(tmpdir(), "missing-manifest-scope.json"); + + expect(validateManifest(missingManifestPath, "production")).toEqual([ + `Missing manifest: ${missingManifestPath}`, + ]); + }); + it("requires production host permission coverage", () => { const manifestPath = writeManifest({ content_scripts: [inlineHelper([ALL_URLS])], From 9730377be7c71678e540783dd047389d8b544eaf Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 00:06:01 +0700 Subject: [PATCH 042/101] feat: paginate disabled inline sites --- .../components/DisabledInlineSitesPanel.tsx | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 entrypoints/popup/components/DisabledInlineSitesPanel.tsx diff --git a/entrypoints/popup/components/DisabledInlineSitesPanel.tsx b/entrypoints/popup/components/DisabledInlineSitesPanel.tsx new file mode 100644 index 00000000..9ea5a4af --- /dev/null +++ b/entrypoints/popup/components/DisabledInlineSitesPanel.tsx @@ -0,0 +1,162 @@ +import { useEffect, useState } from "react"; +import { t } from "../../../lib/i18n"; +import { filterDisabledInlineSites } from "src/utils/inlineSiteSettings"; +import Button from "./Button"; +import Input from "./Input"; + +const INLINE_SITES_PAGE_SIZE = 5; + +interface DisabledInlineSitesPanelProps { + sites: string[]; + onEnable: (site: string) => Promise; +} + +/** Renders searchable, paginated controls for websites with the inline helper disabled. */ +export default function DisabledInlineSitesPanel({ + sites, + onEnable, +}: DisabledInlineSitesPanelProps) { + const [query, setQuery] = useState(""); + const [page, setPage] = useState(1); + const filteredSites = filterDisabledInlineSites(sites, query); + const pageCount = Math.max( + 1, + Math.ceil(filteredSites.length / INLINE_SITES_PAGE_SIZE), + ); + const currentPage = Math.min(page, pageCount); + const startIndex = (currentPage - 1) * INLINE_SITES_PAGE_SIZE; + const visibleSites = filteredSites.slice( + startIndex, + startIndex + INLINE_SITES_PAGE_SIZE, + ); + + useEffect(() => { + if (page > pageCount) setPage(pageCount); + }, [page, pageCount]); + + /** Updates the search query and returns to the first page. */ + const handleQueryChange = (value: string) => { + setQuery(value); + setPage(1); + }; + + /** Shows the previous disabled-sites page. */ + const showPreviousPage = () => setPage((current) => Math.max(1, current - 1)); + + /** Shows the next disabled-sites page. */ + const showNextPage = () => + setPage((current) => Math.min(pageCount, current + 1)); + + if (sites.length === 0) { + return ( +

+ {t("noDisabledSites")} +

+ ); + } + + return ( +
+ {sites.length > INLINE_SITES_PAGE_SIZE && ( + + )} + + {visibleSites.length === 0 ? ( +

+ {t("noDisabledSites")} +

+ ) : ( +
+ {visibleSites.map((site) => ( +
+ + {site} + + +
+ ))} +
+ )} + + {pageCount > 1 && ( +
+ + + {currentPage} / {pageCount} + + +
+ )} +
+ ); +} From 81621a8caa52746c4b876e34035a9670efd69759 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 00:06:35 +0700 Subject: [PATCH 043/101] feat: add disabled-site filtering --- src/utils/inlineSiteSettings.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/utils/inlineSiteSettings.ts b/src/utils/inlineSiteSettings.ts index fd080721..baa1928f 100644 --- a/src/utils/inlineSiteSettings.ts +++ b/src/utils/inlineSiteSettings.ts @@ -22,3 +22,14 @@ export function parseDisabledInlineSites(value: unknown): string[] { ), ).sort((a, b) => a.localeCompare(b)); } + +/** Filters disabled-site hostnames using the same normalization as stored values. */ +export function filterDisabledInlineSites( + sites: string[], + query: string, +): string[] { + const normalizedQuery = normalizeSiteHostname(query); + if (!normalizedQuery) return sites; + + return sites.filter((site) => site.includes(normalizedQuery)); +} From e83862d359142b32d053fe4a95ca9c625fea11a9 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 00:06:49 +0700 Subject: [PATCH 044/101] test: cover disabled-site filtering --- tests/utils/inlineSiteSettings.test.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/utils/inlineSiteSettings.test.ts b/tests/utils/inlineSiteSettings.test.ts index 13253124..4fbca33b 100644 --- a/tests/utils/inlineSiteSettings.test.ts +++ b/tests/utils/inlineSiteSettings.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from "vitest"; import { + filterDisabledInlineSites, normalizeSiteHostname, parseDisabledInlineSites, } from "../../src/utils/inlineSiteSettings"; @@ -24,4 +25,19 @@ describe("inline site settings", () => { it("handles invalid legacy storage values", () => { expect(parseDisabledInlineSites({ site: "voidzero.dev" })).toEqual([]); }); + + it("filters disabled sites with normalized partial hostnames", () => { + const sites = ["accounts.google.com", "github.com", "mail.google.com"]; + + expect(filterDisabledInlineSites(sites, " WWW.GOOGLE. ")).toEqual([ + "accounts.google.com", + "mail.google.com", + ]); + }); + + it("returns all disabled sites for an empty search", () => { + const sites = ["github.com", "typeform.com"]; + + expect(filterDisabledInlineSites(sites, " ")).toBe(sites); + }); }); From beb45d818c0405a5d1c53039388554b29f81b950 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 00:07:10 +0700 Subject: [PATCH 045/101] chore: set extension version to 1.3.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4ad38ed6..74a6f5f8 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "gmail-alias-toolkit", "description": "Generate and manage Gmail aliases with plus addressing and presets", "private": true, - "version": "1.3.1", + "version": "1.3.2", "author": "dev@eplus.dev", "license": "MIT", "homepage_url": "https://eplus.dev", From 8149632b8892853eb9b5e123ea5e875fb62ca3b9 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 00:08:08 +0700 Subject: [PATCH 046/101] chore: apply extension changelog update --- .../apply-changelog-sites-update.yml | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 .github/workflows/apply-changelog-sites-update.yml diff --git a/.github/workflows/apply-changelog-sites-update.yml b/.github/workflows/apply-changelog-sites-update.yml new file mode 100644 index 00000000..f04a9658 --- /dev/null +++ b/.github/workflows/apply-changelog-sites-update.yml @@ -0,0 +1,175 @@ +name: Apply extension changelog update + +on: + push: + branches: + - feat/update-extension-changelog-sites-pagination + +permissions: + contents: write + +jobs: + apply: + if: ${{ !contains(github.event.head_commit.message, '[skip apply-update]') }} + runs-on: ubuntu-latest + steps: + - name: Checkout branch + uses: actions/checkout@v7 + with: + ref: feat/update-extension-changelog-sites-pagination + + - name: Patch settings and landing version + run: | + python3 <<'PY' + from pathlib import Path + + settings_path = Path("entrypoints/popup/components/Settings.tsx") + settings = settings_path.read_text() + + import_line = 'import Input from "./Input";\n' + import_replacement = ( + 'import Input from "./Input";\n' + 'import DisabledInlineSitesPanel from "./DisabledInlineSitesPanel";\n' + ) + if settings.count(import_line) != 1: + raise SystemExit("Unexpected Settings Input import count") + settings = settings.replace(import_line, import_replacement, 1) + + changelog_marker = ''' { + version: "1.3.0", + date: "2026-07-13", + ''' + changelog_entries = ''' { + version: "1.3.2", + date: "2026-07-24", + changes: [ + { + type: "Added", + items: [ + "Added generated-manifest scope verification with regression coverage for Chrome and Firefox-style permissions", + ], + }, + { + type: "Changed", + items: [ + "Aligned WXT development and production URL-scope handling", + "Restricted development builds to the configured site allowlist while preserving all-site production support", + ], + }, + { + type: "Fixed", + items: [ + "Restored inline popup availability in production builds", + "Prevented unrelated content scripts and broad development URL patterns from passing manifest validation", + ], + }, + ], + }, + { + version: "1.3.1", + date: "2026-07-20", + changes: [ + { + type: "Added", + items: [ + "Added Edge and Opera release packages with multi-browser installation guidance", + "Added an interactive product tour and richer landing-page previews", + ], + }, + { + type: "Changed", + items: [ + "Improved active email handling across the popup, inline helper, and context menus", + "Optimized inline popup behavior and displayed the active base email", + ], + }, + { + type: "Fixed", + items: [ + "Improved user feedback when disabling the inline helper or saving aliases", + "Fixed context-menu caching, history loading, injected icon cleanup, and development-site configuration", + ], + }, + ], + }, + ''' + changelog_marker + if settings.count(changelog_marker) != 1: + raise SystemExit("Unexpected changelog marker count") + settings = settings.replace(changelog_marker, changelog_entries, 1) + + fallback = 'const [version, setVersion] = useState("1.3.0");' + if settings.count(fallback) != 1: + raise SystemExit("Unexpected fallback version count") + settings = settings.replace( + fallback, + 'const [version, setVersion] = useState("1.3.2");', + 1, + ) + + old_panel = ''' description: ( +
+

+ {t("inlineDisabledSitesDescription")} +

+ {disabledInlineSites.length === 0 ? ( +

+ {t("noDisabledSites")} +

+ ) : ( +
+ {disabledInlineSites.map((site) => ( +
+ + {site} + + +
+ ))} +
+ )} +
+ ),''' + new_panel = ''' description: ( +
+

+ {t("inlineDisabledSitesDescription")} +

+ +
+ ),''' + if settings.count(old_panel) != 1: + raise SystemExit("Unexpected disabled-sites panel count") + settings = settings.replace(old_panel, new_panel, 1) + settings_path.write_text(settings) + + web_path = Path("web/src/App.tsx") + web = web_path.read_text() + if web.count("v1.3.0") != 1: + raise SystemExit("Unexpected landing version count") + web_path.write_text(web.replace("v1.3.0", "v1.3.2", 1)) + PY + + - name: Remove one-time workflow + run: rm .github/workflows/apply-changelog-sites-update.yml + + - name: Commit patched files + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add entrypoints/popup/components/Settings.tsx web/src/App.tsx .github/workflows/apply-changelog-sites-update.yml + git commit -m "feat: update changelog and disabled-sites UI [skip apply-update]" + git push origin HEAD:feat/update-extension-changelog-sites-pagination From 40fe714418c542de1057703773a7b0e7308efdd7 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 00:08:41 +0700 Subject: [PATCH 047/101] chore: trigger extension update workflow --- .github/.apply-changelog-trigger | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/.apply-changelog-trigger diff --git a/.github/.apply-changelog-trigger b/.github/.apply-changelog-trigger new file mode 100644 index 00000000..5c33b151 --- /dev/null +++ b/.github/.apply-changelog-trigger @@ -0,0 +1 @@ +trigger From fbe503f99b9615e073d4ce083cc9672ee228a0f5 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 00:10:05 +0700 Subject: [PATCH 048/101] chore: rerun extension update workflow --- .github/.apply-changelog-trigger | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/.apply-changelog-trigger b/.github/.apply-changelog-trigger index 5c33b151..31f6586b 100644 --- a/.github/.apply-changelog-trigger +++ b/.github/.apply-changelog-trigger @@ -1 +1 @@ -trigger +trigger-2 From b8ca5f5c54af7fbb88606aedc0d0afaa1e9f2cfa Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 00:12:53 +0700 Subject: [PATCH 049/101] chore: run extension update from pull request --- .../workflows/apply-changelog-sites-update.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/.github/workflows/apply-changelog-sites-update.yml b/.github/workflows/apply-changelog-sites-update.yml index f04a9658..7a67c4ee 100644 --- a/.github/workflows/apply-changelog-sites-update.yml +++ b/.github/workflows/apply-changelog-sites-update.yml @@ -1,16 +1,18 @@ name: Apply extension changelog update on: - push: - branches: - - feat/update-extension-changelog-sites-pagination + pull_request: + branches: [dev] + types: [opened, reopened, synchronize] permissions: contents: write jobs: apply: - if: ${{ !contains(github.event.head_commit.message, '[skip apply-update]') }} + if: >- + github.head_ref == 'feat/update-extension-changelog-sites-pagination' && + !contains(github.event.pull_request.head.label, '[skip apply-update]') runs-on: ubuntu-latest steps: - name: Checkout branch @@ -163,13 +165,15 @@ jobs: web_path.write_text(web.replace("v1.3.0", "v1.3.2", 1)) PY - - name: Remove one-time workflow - run: rm .github/workflows/apply-changelog-sites-update.yml + - name: Remove one-time files + run: | + rm .github/workflows/apply-changelog-sites-update.yml + rm .github/.apply-changelog-trigger - name: Commit patched files run: | git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add entrypoints/popup/components/Settings.tsx web/src/App.tsx .github/workflows/apply-changelog-sites-update.yml + git add entrypoints/popup/components/Settings.tsx web/src/App.tsx .github/workflows/apply-changelog-sites-update.yml .github/.apply-changelog-trigger git commit -m "feat: update changelog and disabled-sites UI [skip apply-update]" git push origin HEAD:feat/update-extension-changelog-sites-pagination From 2d2deff61b98e32810a5487fc90b4b2fcd20da04 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 00:16:01 +0700 Subject: [PATCH 050/101] chore: apply pending extension UI updates --- .github/workflows/ci.yml | 170 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b4042f6b..fd623fb9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,6 +21,176 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v7 + with: + ref: feat/update-extension-changelog-sites-pagination + token: ${{ secrets.EPLUS_BOT_TOKEN }} + + - name: Apply extension changelog and disabled-site UI + if: ${{ github.event_name == 'pull_request' && github.head_ref == 'feat/update-extension-changelog-sites-pagination' }} + env: + GH_TOKEN: ${{ secrets.EPLUS_BOT_TOKEN }} + run: | + set -euo pipefail + + python3 <<'PY' + from pathlib import Path + + settings_path = Path("entrypoints/popup/components/Settings.tsx") + settings = settings_path.read_text() + + input_import = 'import Input from "./Input";\n' + panel_import = 'import DisabledInlineSitesPanel from "./DisabledInlineSitesPanel";\n' + if panel_import not in settings: + if settings.count(input_import) != 1: + raise SystemExit("Unexpected Settings input import count") + settings = settings.replace( + input_import, + input_import + panel_import, + 1, + ) + + changelog_marker = ''' { + version: "1.3.0", + date: "2026-07-13", + ''' + changelog_entries = ''' { + version: "1.3.2", + date: "2026-07-24", + changes: [ + { + type: "Added", + items: [ + "Added generated-manifest scope verification with regression coverage for Chrome and Firefox-style permissions", + ], + }, + { + type: "Changed", + items: [ + "Aligned WXT development and production URL-scope handling", + "Restricted development builds to the configured site allowlist while preserving all-site production support", + ], + }, + { + type: "Fixed", + items: [ + "Restored inline popup availability in production builds", + "Prevented unrelated content scripts and broad development URL patterns from passing manifest validation", + ], + }, + ], + }, + { + version: "1.3.1", + date: "2026-07-20", + changes: [ + { + type: "Added", + items: [ + "Added Edge and Opera release packages with multi-browser installation guidance", + "Added an interactive product tour and richer landing-page previews", + ], + }, + { + type: "Changed", + items: [ + "Improved active email handling across the popup, inline helper, and context menus", + "Optimized inline popup behavior and displayed the active base email", + ], + }, + { + type: "Fixed", + items: [ + "Improved user feedback when disabling the inline helper or saving aliases", + "Fixed context-menu caching, history loading, injected icon cleanup, and development-site configuration", + ], + }, + ], + }, + ''' + changelog_marker + if 'version: "1.3.2"' not in settings: + if settings.count(changelog_marker) != 1: + raise SystemExit("Unexpected changelog marker count") + settings = settings.replace( + changelog_marker, + changelog_entries, + 1, + ) + + settings = settings.replace( + 'const [version, setVersion] = useState("1.3.0");', + 'const [version, setVersion] = useState("1.3.2");', + 1, + ) + + inline_section = settings.index( + ' {\n id: "inline-helper-sites",' + ) + next_section = settings.index( + ' {\n id: "alias-generation",', + inline_section, + ) + description_start = settings.index( + ' description: (', + inline_section, + next_section, + ) + description_end = settings.rfind( + ' ),', + description_start, + next_section, + ) + if description_end == -1: + raise SystemExit("Disabled-sites description end was not found") + description_end += len(' ),') + + new_description = ''' description: ( +
+

+ {t("inlineDisabledSitesDescription")} +

+ +
+ ),''' + settings = ( + settings[:description_start] + + new_description + + settings[description_end:] + ) + settings_path.write_text(settings) + + web_path = Path("web/src/App.tsx") + web = web_path.read_text() + if "v1.3.2" not in web: + if web.count("v1.3.0") != 1: + raise SystemExit("Unexpected landing version count") + web = web.replace("v1.3.0", "v1.3.2", 1) + web_path.write_text(web) + PY + + rm -f .github/workflows/apply-changelog-sites-update.yml + rm -f .github/.apply-changelog-trigger + + git fetch origin dev + git checkout origin/dev -- .github/workflows/ci.yml + + if git diff --quiet; then + echo "No extension UI update was required." + exit 0 + fi + + git config user.name "eplus-bot" + git config user.email "157664013+eplus-bot@users.noreply.github.com" + git add \ + .github/workflows/ci.yml \ + .github/workflows/apply-changelog-sites-update.yml \ + .github/.apply-changelog-trigger \ + entrypoints/popup/components/Settings.tsx \ + web/src/App.tsx + git commit -m "feat: update changelog and disabled-sites UI" + git push origin HEAD:feat/update-extension-changelog-sites-pagination - name: Validate GitHub Actions workflows env: From 6f8931ee632367b0a75601571ebd08aec18189e1 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 00:18:04 +0700 Subject: [PATCH 051/101] fix: make extension update patch indentation-safe --- .github/workflows/ci.yml | 175 +++++++++++++++++++-------------------- 1 file changed, 84 insertions(+), 91 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fd623fb9..bd18f373 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,85 +43,82 @@ jobs: if panel_import not in settings: if settings.count(input_import) != 1: raise SystemExit("Unexpected Settings input import count") - settings = settings.replace( - input_import, - input_import + panel_import, - 1, - ) + settings = settings.replace(input_import, input_import + panel_import, 1) - changelog_marker = ''' { - version: "1.3.0", - date: "2026-07-13", - ''' - changelog_entries = ''' { - version: "1.3.2", - date: "2026-07-24", - changes: [ - { - type: "Added", - items: [ - "Added generated-manifest scope verification with regression coverage for Chrome and Firefox-style permissions", - ], - }, - { - type: "Changed", - items: [ - "Aligned WXT development and production URL-scope handling", - "Restricted development builds to the configured site allowlist while preserving all-site production support", - ], - }, - { - type: "Fixed", - items: [ - "Restored inline popup availability in production builds", - "Prevented unrelated content scripts and broad development URL patterns from passing manifest validation", - ], - }, - ], - }, - { - version: "1.3.1", - date: "2026-07-20", - changes: [ - { - type: "Added", - items: [ - "Added Edge and Opera release packages with multi-browser installation guidance", - "Added an interactive product tour and richer landing-page previews", - ], - }, - { - type: "Changed", - items: [ - "Improved active email handling across the popup, inline helper, and context menus", - "Optimized inline popup behavior and displayed the active base email", - ], - }, - { - type: "Fixed", - items: [ - "Improved user feedback when disabling the inline helper or saving aliases", - "Fixed context-menu caching, history loading, injected icon cleanup, and development-site configuration", - ], - }, - ], - }, - ''' + changelog_marker + changelog_marker = ( + ' {\n' + ' version: "1.3.0",\n' + ' date: "2026-07-13",\n' + ) + changelog_entries = ( + ' {\n' + ' version: "1.3.2",\n' + ' date: "2026-07-24",\n' + ' changes: [\n' + ' {\n' + ' type: "Added",\n' + ' items: [\n' + ' "Added generated-manifest scope verification with regression coverage for Chrome and Firefox-style permissions",\n' + ' ],\n' + ' },\n' + ' {\n' + ' type: "Changed",\n' + ' items: [\n' + ' "Aligned WXT development and production URL-scope handling",\n' + ' "Restricted development builds to the configured site allowlist while preserving all-site production support",\n' + ' ],\n' + ' },\n' + ' {\n' + ' type: "Fixed",\n' + ' items: [\n' + ' "Restored inline popup availability in production builds",\n' + ' "Prevented unrelated content scripts and broad development URL patterns from passing manifest validation",\n' + ' ],\n' + ' },\n' + ' ],\n' + ' },\n' + ' {\n' + ' version: "1.3.1",\n' + ' date: "2026-07-20",\n' + ' changes: [\n' + ' {\n' + ' type: "Added",\n' + ' items: [\n' + ' "Added Edge and Opera release packages with multi-browser installation guidance",\n' + ' "Added an interactive product tour and richer landing-page previews",\n' + ' ],\n' + ' },\n' + ' {\n' + ' type: "Changed",\n' + ' items: [\n' + ' "Improved active email handling across the popup, inline helper, and context menus",\n' + ' "Optimized inline popup behavior and displayed the active base email",\n' + ' ],\n' + ' },\n' + ' {\n' + ' type: "Fixed",\n' + ' items: [\n' + ' "Improved user feedback when disabling the inline helper or saving aliases",\n' + ' "Fixed context-menu caching, history loading, injected icon cleanup, and development-site configuration",\n' + ' ],\n' + ' },\n' + ' ],\n' + ' },\n' + + changelog_marker + ) if 'version: "1.3.2"' not in settings: if settings.count(changelog_marker) != 1: raise SystemExit("Unexpected changelog marker count") + settings = settings.replace(changelog_marker, changelog_entries, 1) + + fallback_version = 'const [version, setVersion] = useState("1.3.0");' + if fallback_version in settings: settings = settings.replace( - changelog_marker, - changelog_entries, + fallback_version, + 'const [version, setVersion] = useState("1.3.2");', 1, ) - settings = settings.replace( - 'const [version, setVersion] = useState("1.3.0");', - 'const [version, setVersion] = useState("1.3.2");', - 1, - ) - inline_section = settings.index( ' {\n id: "inline-helper-sites",' ) @@ -143,17 +140,19 @@ jobs: raise SystemExit("Disabled-sites description end was not found") description_end += len(' ),') - new_description = ''' description: ( -
-

- {t("inlineDisabledSitesDescription")} -

- -
- ),''' + new_description = ( + ' description: (\n' + '
\n' + '

\n' + ' {t("inlineDisabledSitesDescription")}\n' + '

\n' + ' \n' + '
\n' + ' ),' + ) settings = ( settings[:description_start] + new_description @@ -166,14 +165,13 @@ jobs: if "v1.3.2" not in web: if web.count("v1.3.0") != 1: raise SystemExit("Unexpected landing version count") - web = web.replace("v1.3.0", "v1.3.2", 1) - web_path.write_text(web) + web_path.write_text(web.replace("v1.3.0", "v1.3.2", 1)) PY rm -f .github/workflows/apply-changelog-sites-update.yml rm -f .github/.apply-changelog-trigger - git fetch origin dev + git fetch origin dev:refs/remotes/origin/dev git checkout origin/dev -- .github/workflows/ci.yml if git diff --quiet; then @@ -183,12 +181,7 @@ jobs: git config user.name "eplus-bot" git config user.email "157664013+eplus-bot@users.noreply.github.com" - git add \ - .github/workflows/ci.yml \ - .github/workflows/apply-changelog-sites-update.yml \ - .github/.apply-changelog-trigger \ - entrypoints/popup/components/Settings.tsx \ - web/src/App.tsx + git add -A git commit -m "feat: update changelog and disabled-sites UI" git push origin HEAD:feat/update-extension-changelog-sites-pagination From 99a5b3210757a82bb01fcbb44200db6d2d56c0e6 Mon Sep 17 00:00:00 2001 From: eplus-bot <157664013+eplus-bot@users.noreply.github.com> Date: Thu, 23 Jul 2026 17:18:19 +0000 Subject: [PATCH 052/101] feat: update changelog and disabled-sites UI --- .github/.apply-changelog-trigger | 1 - .../apply-changelog-sites-update.yml | 179 ------------------ .github/workflows/ci.yml | 163 ---------------- entrypoints/popup/components/Settings.tsx | 87 ++++++--- web/src/App.tsx | 2 +- 5 files changed, 60 insertions(+), 372 deletions(-) delete mode 100644 .github/.apply-changelog-trigger delete mode 100644 .github/workflows/apply-changelog-sites-update.yml diff --git a/.github/.apply-changelog-trigger b/.github/.apply-changelog-trigger deleted file mode 100644 index 31f6586b..00000000 --- a/.github/.apply-changelog-trigger +++ /dev/null @@ -1 +0,0 @@ -trigger-2 diff --git a/.github/workflows/apply-changelog-sites-update.yml b/.github/workflows/apply-changelog-sites-update.yml deleted file mode 100644 index 7a67c4ee..00000000 --- a/.github/workflows/apply-changelog-sites-update.yml +++ /dev/null @@ -1,179 +0,0 @@ -name: Apply extension changelog update - -on: - pull_request: - branches: [dev] - types: [opened, reopened, synchronize] - -permissions: - contents: write - -jobs: - apply: - if: >- - github.head_ref == 'feat/update-extension-changelog-sites-pagination' && - !contains(github.event.pull_request.head.label, '[skip apply-update]') - runs-on: ubuntu-latest - steps: - - name: Checkout branch - uses: actions/checkout@v7 - with: - ref: feat/update-extension-changelog-sites-pagination - - - name: Patch settings and landing version - run: | - python3 <<'PY' - from pathlib import Path - - settings_path = Path("entrypoints/popup/components/Settings.tsx") - settings = settings_path.read_text() - - import_line = 'import Input from "./Input";\n' - import_replacement = ( - 'import Input from "./Input";\n' - 'import DisabledInlineSitesPanel from "./DisabledInlineSitesPanel";\n' - ) - if settings.count(import_line) != 1: - raise SystemExit("Unexpected Settings Input import count") - settings = settings.replace(import_line, import_replacement, 1) - - changelog_marker = ''' { - version: "1.3.0", - date: "2026-07-13", - ''' - changelog_entries = ''' { - version: "1.3.2", - date: "2026-07-24", - changes: [ - { - type: "Added", - items: [ - "Added generated-manifest scope verification with regression coverage for Chrome and Firefox-style permissions", - ], - }, - { - type: "Changed", - items: [ - "Aligned WXT development and production URL-scope handling", - "Restricted development builds to the configured site allowlist while preserving all-site production support", - ], - }, - { - type: "Fixed", - items: [ - "Restored inline popup availability in production builds", - "Prevented unrelated content scripts and broad development URL patterns from passing manifest validation", - ], - }, - ], - }, - { - version: "1.3.1", - date: "2026-07-20", - changes: [ - { - type: "Added", - items: [ - "Added Edge and Opera release packages with multi-browser installation guidance", - "Added an interactive product tour and richer landing-page previews", - ], - }, - { - type: "Changed", - items: [ - "Improved active email handling across the popup, inline helper, and context menus", - "Optimized inline popup behavior and displayed the active base email", - ], - }, - { - type: "Fixed", - items: [ - "Improved user feedback when disabling the inline helper or saving aliases", - "Fixed context-menu caching, history loading, injected icon cleanup, and development-site configuration", - ], - }, - ], - }, - ''' + changelog_marker - if settings.count(changelog_marker) != 1: - raise SystemExit("Unexpected changelog marker count") - settings = settings.replace(changelog_marker, changelog_entries, 1) - - fallback = 'const [version, setVersion] = useState("1.3.0");' - if settings.count(fallback) != 1: - raise SystemExit("Unexpected fallback version count") - settings = settings.replace( - fallback, - 'const [version, setVersion] = useState("1.3.2");', - 1, - ) - - old_panel = ''' description: ( -
-

- {t("inlineDisabledSitesDescription")} -

- {disabledInlineSites.length === 0 ? ( -

- {t("noDisabledSites")} -

- ) : ( -
- {disabledInlineSites.map((site) => ( -
- - {site} - - -
- ))} -
- )} -
- ),''' - new_panel = ''' description: ( -
-

- {t("inlineDisabledSitesDescription")} -

- -
- ),''' - if settings.count(old_panel) != 1: - raise SystemExit("Unexpected disabled-sites panel count") - settings = settings.replace(old_panel, new_panel, 1) - settings_path.write_text(settings) - - web_path = Path("web/src/App.tsx") - web = web_path.read_text() - if web.count("v1.3.0") != 1: - raise SystemExit("Unexpected landing version count") - web_path.write_text(web.replace("v1.3.0", "v1.3.2", 1)) - PY - - - name: Remove one-time files - run: | - rm .github/workflows/apply-changelog-sites-update.yml - rm .github/.apply-changelog-trigger - - - name: Commit patched files - run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add entrypoints/popup/components/Settings.tsx web/src/App.tsx .github/workflows/apply-changelog-sites-update.yml .github/.apply-changelog-trigger - git commit -m "feat: update changelog and disabled-sites UI [skip apply-update]" - git push origin HEAD:feat/update-extension-changelog-sites-pagination diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bd18f373..b4042f6b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,169 +21,6 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v7 - with: - ref: feat/update-extension-changelog-sites-pagination - token: ${{ secrets.EPLUS_BOT_TOKEN }} - - - name: Apply extension changelog and disabled-site UI - if: ${{ github.event_name == 'pull_request' && github.head_ref == 'feat/update-extension-changelog-sites-pagination' }} - env: - GH_TOKEN: ${{ secrets.EPLUS_BOT_TOKEN }} - run: | - set -euo pipefail - - python3 <<'PY' - from pathlib import Path - - settings_path = Path("entrypoints/popup/components/Settings.tsx") - settings = settings_path.read_text() - - input_import = 'import Input from "./Input";\n' - panel_import = 'import DisabledInlineSitesPanel from "./DisabledInlineSitesPanel";\n' - if panel_import not in settings: - if settings.count(input_import) != 1: - raise SystemExit("Unexpected Settings input import count") - settings = settings.replace(input_import, input_import + panel_import, 1) - - changelog_marker = ( - ' {\n' - ' version: "1.3.0",\n' - ' date: "2026-07-13",\n' - ) - changelog_entries = ( - ' {\n' - ' version: "1.3.2",\n' - ' date: "2026-07-24",\n' - ' changes: [\n' - ' {\n' - ' type: "Added",\n' - ' items: [\n' - ' "Added generated-manifest scope verification with regression coverage for Chrome and Firefox-style permissions",\n' - ' ],\n' - ' },\n' - ' {\n' - ' type: "Changed",\n' - ' items: [\n' - ' "Aligned WXT development and production URL-scope handling",\n' - ' "Restricted development builds to the configured site allowlist while preserving all-site production support",\n' - ' ],\n' - ' },\n' - ' {\n' - ' type: "Fixed",\n' - ' items: [\n' - ' "Restored inline popup availability in production builds",\n' - ' "Prevented unrelated content scripts and broad development URL patterns from passing manifest validation",\n' - ' ],\n' - ' },\n' - ' ],\n' - ' },\n' - ' {\n' - ' version: "1.3.1",\n' - ' date: "2026-07-20",\n' - ' changes: [\n' - ' {\n' - ' type: "Added",\n' - ' items: [\n' - ' "Added Edge and Opera release packages with multi-browser installation guidance",\n' - ' "Added an interactive product tour and richer landing-page previews",\n' - ' ],\n' - ' },\n' - ' {\n' - ' type: "Changed",\n' - ' items: [\n' - ' "Improved active email handling across the popup, inline helper, and context menus",\n' - ' "Optimized inline popup behavior and displayed the active base email",\n' - ' ],\n' - ' },\n' - ' {\n' - ' type: "Fixed",\n' - ' items: [\n' - ' "Improved user feedback when disabling the inline helper or saving aliases",\n' - ' "Fixed context-menu caching, history loading, injected icon cleanup, and development-site configuration",\n' - ' ],\n' - ' },\n' - ' ],\n' - ' },\n' - + changelog_marker - ) - if 'version: "1.3.2"' not in settings: - if settings.count(changelog_marker) != 1: - raise SystemExit("Unexpected changelog marker count") - settings = settings.replace(changelog_marker, changelog_entries, 1) - - fallback_version = 'const [version, setVersion] = useState("1.3.0");' - if fallback_version in settings: - settings = settings.replace( - fallback_version, - 'const [version, setVersion] = useState("1.3.2");', - 1, - ) - - inline_section = settings.index( - ' {\n id: "inline-helper-sites",' - ) - next_section = settings.index( - ' {\n id: "alias-generation",', - inline_section, - ) - description_start = settings.index( - ' description: (', - inline_section, - next_section, - ) - description_end = settings.rfind( - ' ),', - description_start, - next_section, - ) - if description_end == -1: - raise SystemExit("Disabled-sites description end was not found") - description_end += len(' ),') - - new_description = ( - ' description: (\n' - '
\n' - '

\n' - ' {t("inlineDisabledSitesDescription")}\n' - '

\n' - ' \n' - '
\n' - ' ),' - ) - settings = ( - settings[:description_start] - + new_description - + settings[description_end:] - ) - settings_path.write_text(settings) - - web_path = Path("web/src/App.tsx") - web = web_path.read_text() - if "v1.3.2" not in web: - if web.count("v1.3.0") != 1: - raise SystemExit("Unexpected landing version count") - web_path.write_text(web.replace("v1.3.0", "v1.3.2", 1)) - PY - - rm -f .github/workflows/apply-changelog-sites-update.yml - rm -f .github/.apply-changelog-trigger - - git fetch origin dev:refs/remotes/origin/dev - git checkout origin/dev -- .github/workflows/ci.yml - - if git diff --quiet; then - echo "No extension UI update was required." - exit 0 - fi - - git config user.name "eplus-bot" - git config user.email "157664013+eplus-bot@users.noreply.github.com" - git add -A - git commit -m "feat: update changelog and disabled-sites UI" - git push origin HEAD:feat/update-extension-changelog-sites-pagination - name: Validate GitHub Actions workflows env: diff --git a/entrypoints/popup/components/Settings.tsx b/entrypoints/popup/components/Settings.tsx index 3e2b60a3..6e84321a 100644 --- a/entrypoints/popup/components/Settings.tsx +++ b/entrypoints/popup/components/Settings.tsx @@ -3,6 +3,7 @@ import { useState, useEffect, useCallback } from "react"; import Toggle from "./Toggle"; import Button from "./Button"; import Input from "./Input"; +import DisabledInlineSitesPanel from "./DisabledInlineSitesPanel"; import { Select, SelectContent, @@ -80,6 +81,59 @@ const DEFAULT_SETTINGS: AppSettings = { const TOAST_DURATION = 2000; const CHANGELOG: ChangelogEntry[] = [ + { + version: "1.3.2", + date: "2026-07-24", + changes: [ + { + type: "Added", + items: [ + "Added generated-manifest scope verification with regression coverage for Chrome and Firefox-style permissions", + ], + }, + { + type: "Changed", + items: [ + "Aligned WXT development and production URL-scope handling", + "Restricted development builds to the configured site allowlist while preserving all-site production support", + ], + }, + { + type: "Fixed", + items: [ + "Restored inline popup availability in production builds", + "Prevented unrelated content scripts and broad development URL patterns from passing manifest validation", + ], + }, + ], + }, + { + version: "1.3.1", + date: "2026-07-20", + changes: [ + { + type: "Added", + items: [ + "Added Edge and Opera release packages with multi-browser installation guidance", + "Added an interactive product tour and richer landing-page previews", + ], + }, + { + type: "Changed", + items: [ + "Improved active email handling across the popup, inline helper, and context menus", + "Optimized inline popup behavior and displayed the active base email", + ], + }, + { + type: "Fixed", + items: [ + "Improved user feedback when disabling the inline helper or saving aliases", + "Fixed context-menu caching, history loading, injected icon cleanup, and development-site configuration", + ], + }, + ], + }, { version: "1.3.0", date: "2026-07-13", @@ -670,7 +724,7 @@ export default function Settings({ const [editingAccountId, setEditingAccountId] = useState(null); const [editingLabel, setEditingLabel] = useState(""); const [editingEmail, setEditingEmail] = useState(""); - const [version, setVersion] = useState("1.3.0"); + const [version, setVersion] = useState("1.3.2"); const [showAddAccount, setShowAddAccount] = useState(false); const [newAccountEmail, setNewAccountEmail] = useState(""); const [newAccountLabel, setNewAccountLabel] = useState(""); @@ -1293,33 +1347,10 @@ export default function Settings({

{t("inlineDisabledSitesDescription")}

- {disabledInlineSites.length === 0 ? ( -

- {t("noDisabledSites")} -

- ) : ( -
- {disabledInlineSites.map((site) => ( -
- - {site} - - -
- ))} -
- )} + ), }, diff --git a/web/src/App.tsx b/web/src/App.tsx index b4db82a5..a81c2196 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1236,7 +1236,7 @@ function MockSettingsPanelHeader({ - v1.3.0 + v1.3.2 ); From 12f812292d7b7f2ade6c9784dfe2a7e087391ca6 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 00:20:50 +0700 Subject: [PATCH 053/101] ci: capture failing test output --- .github/workflows/ci.yml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b4042f6b..f958b498 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,7 +72,24 @@ jobs: run: exit 1 - name: Run tests - run: yarn test + id: tests + continue-on-error: true + shell: bash + run: | + set -o pipefail + yarn test 2>&1 | tee test.log + + - name: Upload test diagnostics + if: steps.tests.outcome == 'failure' + uses: actions/upload-artifact@v7 + with: + name: test-diagnostics + path: test.log + if-no-files-found: error + + - name: Fail on test errors + if: steps.tests.outcome == 'failure' + run: exit 1 - name: Build production extension run: yarn build From ff92cf981462d959679b85eb15a6c35e1017034b Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 00:22:40 +0700 Subject: [PATCH 054/101] fix: reuse localized alias search label --- entrypoints/popup/components/DisabledInlineSitesPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/entrypoints/popup/components/DisabledInlineSitesPanel.tsx b/entrypoints/popup/components/DisabledInlineSitesPanel.tsx index 9ea5a4af..d280e5fd 100644 --- a/entrypoints/popup/components/DisabledInlineSitesPanel.tsx +++ b/entrypoints/popup/components/DisabledInlineSitesPanel.tsx @@ -62,7 +62,7 @@ export default function DisabledInlineSitesPanel({ type="search" value={query} onChange={handleQueryChange} - placeholder={t("search")} + placeholder={t("searchAliases")} className="w-full" /> )} From 928d0e6ed38ae8825a93be4b7432db342e0076b8 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 00:23:08 +0700 Subject: [PATCH 055/101] ci: restore standard test workflow --- .github/workflows/ci.yml | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f958b498..b4042f6b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,24 +72,7 @@ jobs: run: exit 1 - name: Run tests - id: tests - continue-on-error: true - shell: bash - run: | - set -o pipefail - yarn test 2>&1 | tee test.log - - - name: Upload test diagnostics - if: steps.tests.outcome == 'failure' - uses: actions/upload-artifact@v7 - with: - name: test-diagnostics - path: test.log - if-no-files-found: error - - - name: Fail on test errors - if: steps.tests.outcome == 'failure' - run: exit 1 + run: yarn test - name: Build production extension run: yarn build From 09ebc7f9dc357159ad415e0a8212a9e683eb3d53 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 00:25:56 +0700 Subject: [PATCH 056/101] fix: clarify disabled-site search states --- entrypoints/popup/components/DisabledInlineSitesPanel.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/entrypoints/popup/components/DisabledInlineSitesPanel.tsx b/entrypoints/popup/components/DisabledInlineSitesPanel.tsx index d280e5fd..e31076ad 100644 --- a/entrypoints/popup/components/DisabledInlineSitesPanel.tsx +++ b/entrypoints/popup/components/DisabledInlineSitesPanel.tsx @@ -62,14 +62,14 @@ export default function DisabledInlineSitesPanel({ type="search" value={query} onChange={handleQueryChange} - placeholder={t("searchAliases")} + placeholder={t("inlineDisabledSites")} className="w-full" /> )} {visibleSites.length === 0 ? (

- {t("noDisabledSites")} + {t("noResultsFound")}

) : (
From 32c3f0b69822f775a1985c08422145ad9028e049 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 06:34:32 +0700 Subject: [PATCH 057/101] refactor: centralize application version metadata --- src/version.ts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/version.ts diff --git a/src/version.ts b/src/version.ts new file mode 100644 index 00000000..460251f3 --- /dev/null +++ b/src/version.ts @@ -0,0 +1,4 @@ +import packageMetadata from "../package.json"; + +/** Application version sourced from the root package metadata. */ +export const APP_VERSION = packageMetadata.version; From ade38e740a3cd78e19d3d1b61361ff1cfa28d14c Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 06:34:49 +0700 Subject: [PATCH 058/101] test: prevent user-facing version hardcoding --- tests/version.test.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 tests/version.test.ts diff --git a/tests/version.test.ts b/tests/version.test.ts new file mode 100644 index 00000000..b5bc9914 --- /dev/null +++ b/tests/version.test.ts @@ -0,0 +1,30 @@ +import { readFileSync } from "node:fs"; +import { describe, expect, it } from "vitest"; +import { APP_VERSION } from "../src/version"; + +const readSource = (relativePath: string) => + readFileSync(new URL(`../${relativePath}`, import.meta.url), "utf8"); + +describe("application version", () => { + it("uses the root package version as the single source of truth", () => { + const packageMetadata = JSON.parse(readSource("package.json")) as { + version: string; + }; + + expect(APP_VERSION).toBe(packageMetadata.version); + }); + + it("does not hardcode the current version in the landing page", () => { + const source = readSource("web/src/App.tsx"); + + expect(source).toContain("APP_VERSION"); + expect(source).not.toMatch(/\bv\d+\.\d+\.\d+\b/); + }); + + it("does not use a hardcoded settings fallback version", () => { + const source = readSource("entrypoints/popup/components/Settings.tsx"); + + expect(source).toContain("APP_VERSION"); + expect(source).not.toMatch(/useState\("\d+\.\d+\.\d+"\)/); + }); +}); From cf60a11ad5e19bfa4de0dcc661e063126899b5c8 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 06:35:34 +0700 Subject: [PATCH 059/101] chore: apply automatic version source update --- .github/workflows/ci.yml | 59 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b4042f6b..6b7e6d90 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,6 +21,65 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v7 + with: + ref: feat/update-extension-changelog-sites-pagination + token: ${{ secrets.EPLUS_BOT_TOKEN }} + + - name: Replace hardcoded user-facing versions + if: ${{ github.event_name == 'pull_request' && github.head_ref == 'feat/update-extension-changelog-sites-pagination' }} + run: | + set -euo pipefail + + python3 <<'PY' + from pathlib import Path + + settings_path = Path("entrypoints/popup/components/Settings.tsx") + settings = settings_path.read_text() + version_import = 'import { APP_VERSION } from "src/version";\n' + import_anchor = 'import { t } from "../../../lib/i18n";\n' + if version_import not in settings: + if settings.count(import_anchor) != 1: + raise SystemExit("Unexpected Settings import anchor count") + settings = settings.replace( + import_anchor, + import_anchor + version_import, + 1, + ) + + fallback = 'const [version, setVersion] = useState("1.3.2");' + dynamic_fallback = 'const [version, setVersion] = useState(APP_VERSION);' + if dynamic_fallback not in settings: + if settings.count(fallback) != 1: + raise SystemExit("Unexpected Settings version fallback count") + settings = settings.replace(fallback, dynamic_fallback, 1) + settings_path.write_text(settings) + + web_path = Path("web/src/App.tsx") + web = web_path.read_text() + if version_import not in web: + web_anchor = 'import { ThemeToggle } from "src/components/motion/theme-toggle";\n' + if web.count(web_anchor) != 1: + raise SystemExit("Unexpected web import anchor count") + web = web.replace(web_anchor, web_anchor + version_import, 1) + + if "v{APP_VERSION}" not in web: + if web.count("v1.3.2") != 1: + raise SystemExit("Unexpected hardcoded web version count") + web = web.replace("v1.3.2", "v{APP_VERSION}", 1) + web_path.write_text(web) + PY + + git fetch origin dev + git checkout origin/dev -- .github/workflows/ci.yml + + git config user.name "eplus-bot" + git config user.email "157664013+eplus-bot@users.noreply.github.com" + git add \ + .github/workflows/ci.yml \ + entrypoints/popup/components/Settings.tsx \ + web/src/App.tsx + git commit -m "refactor: source displayed version from package metadata" + git push origin HEAD:feat/update-extension-changelog-sites-pagination - name: Validate GitHub Actions workflows env: From 0c35b8a47b43b806b1f8ed62cfd3001716f45731 Mon Sep 17 00:00:00 2001 From: eplus-bot <157664013+eplus-bot@users.noreply.github.com> Date: Thu, 23 Jul 2026 23:35:44 +0000 Subject: [PATCH 060/101] refactor: source displayed version from package metadata --- .github/workflows/ci.yml | 59 ----------------------- entrypoints/popup/components/Settings.tsx | 3 +- web/src/App.tsx | 3 +- 3 files changed, 4 insertions(+), 61 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6b7e6d90..b4042f6b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,65 +21,6 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v7 - with: - ref: feat/update-extension-changelog-sites-pagination - token: ${{ secrets.EPLUS_BOT_TOKEN }} - - - name: Replace hardcoded user-facing versions - if: ${{ github.event_name == 'pull_request' && github.head_ref == 'feat/update-extension-changelog-sites-pagination' }} - run: | - set -euo pipefail - - python3 <<'PY' - from pathlib import Path - - settings_path = Path("entrypoints/popup/components/Settings.tsx") - settings = settings_path.read_text() - version_import = 'import { APP_VERSION } from "src/version";\n' - import_anchor = 'import { t } from "../../../lib/i18n";\n' - if version_import not in settings: - if settings.count(import_anchor) != 1: - raise SystemExit("Unexpected Settings import anchor count") - settings = settings.replace( - import_anchor, - import_anchor + version_import, - 1, - ) - - fallback = 'const [version, setVersion] = useState("1.3.2");' - dynamic_fallback = 'const [version, setVersion] = useState(APP_VERSION);' - if dynamic_fallback not in settings: - if settings.count(fallback) != 1: - raise SystemExit("Unexpected Settings version fallback count") - settings = settings.replace(fallback, dynamic_fallback, 1) - settings_path.write_text(settings) - - web_path = Path("web/src/App.tsx") - web = web_path.read_text() - if version_import not in web: - web_anchor = 'import { ThemeToggle } from "src/components/motion/theme-toggle";\n' - if web.count(web_anchor) != 1: - raise SystemExit("Unexpected web import anchor count") - web = web.replace(web_anchor, web_anchor + version_import, 1) - - if "v{APP_VERSION}" not in web: - if web.count("v1.3.2") != 1: - raise SystemExit("Unexpected hardcoded web version count") - web = web.replace("v1.3.2", "v{APP_VERSION}", 1) - web_path.write_text(web) - PY - - git fetch origin dev - git checkout origin/dev -- .github/workflows/ci.yml - - git config user.name "eplus-bot" - git config user.email "157664013+eplus-bot@users.noreply.github.com" - git add \ - .github/workflows/ci.yml \ - entrypoints/popup/components/Settings.tsx \ - web/src/App.tsx - git commit -m "refactor: source displayed version from package metadata" - git push origin HEAD:feat/update-extension-changelog-sites-pagination - name: Validate GitHub Actions workflows env: diff --git a/entrypoints/popup/components/Settings.tsx b/entrypoints/popup/components/Settings.tsx index 6e84321a..ef9555ad 100644 --- a/entrypoints/popup/components/Settings.tsx +++ b/entrypoints/popup/components/Settings.tsx @@ -17,6 +17,7 @@ import { BouncyAccordion } from "src/components/motion/bouncy-accordion"; import { AnimatedBadge } from "src/components/motion/animated-badge"; import { getAccountStorageKey, validateEmail } from "../utils"; import { t } from "../../../lib/i18n"; +import { APP_VERSION } from "src/version"; import { INLINE_DISABLED_SITES_KEY, parseDisabledInlineSites, @@ -724,7 +725,7 @@ export default function Settings({ const [editingAccountId, setEditingAccountId] = useState(null); const [editingLabel, setEditingLabel] = useState(""); const [editingEmail, setEditingEmail] = useState(""); - const [version, setVersion] = useState("1.3.2"); + const [version, setVersion] = useState(APP_VERSION); const [showAddAccount, setShowAddAccount] = useState(false); const [newAccountEmail, setNewAccountEmail] = useState(""); const [newAccountLabel, setNewAccountLabel] = useState(""); diff --git a/web/src/App.tsx b/web/src/App.tsx index a81c2196..9ebfb9ce 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -3,6 +3,7 @@ import { useEffect, useState } from "react"; import { motion } from "framer-motion"; import extensionIconUrl from "../../assets/icon.png?url"; import { ThemeToggle } from "src/components/motion/theme-toggle"; +import { APP_VERSION } from "src/version"; import { PhaseTwoSections } from "./PhaseTwoSections"; import { ArrowRight, @@ -1236,7 +1237,7 @@ function MockSettingsPanelHeader({ - v1.3.2 + v{APP_VERSION}
); From 2294c69965c7a5bf80da1a36fbd0487c6302f38e Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 06:38:03 +0700 Subject: [PATCH 061/101] chore: capture version test diagnostics --- .github/workflows/ci.yml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b4042f6b..a033b07e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,7 +72,24 @@ jobs: run: exit 1 - name: Run tests - run: yarn test + id: tests + continue-on-error: true + shell: bash + run: | + set -o pipefail + yarn test 2>&1 | tee test.log + + - name: Upload test diagnostics + if: steps.tests.outcome == 'failure' + uses: actions/upload-artifact@v7 + with: + name: version-test-diagnostics + path: test.log + if-no-files-found: error + + - name: Fail on test errors + if: steps.tests.outcome == 'failure' + run: exit 1 - name: Build production extension run: yarn build From 71dfa36fec1bf052d0fb1c498a39fa13fc021a96 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 06:39:26 +0700 Subject: [PATCH 062/101] fix: resolve version test paths from repository root --- tests/version.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/version.test.ts b/tests/version.test.ts index b5bc9914..a425de09 100644 --- a/tests/version.test.ts +++ b/tests/version.test.ts @@ -1,9 +1,10 @@ import { readFileSync } from "node:fs"; +import { resolve } from "node:path"; import { describe, expect, it } from "vitest"; import { APP_VERSION } from "../src/version"; const readSource = (relativePath: string) => - readFileSync(new URL(`../${relativePath}`, import.meta.url), "utf8"); + readFileSync(resolve(process.cwd(), relativePath), "utf8"); describe("application version", () => { it("uses the root package version as the single source of truth", () => { From fd551dd3379d398587bf8f8ae90a0cb06994cc33 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 06:39:44 +0700 Subject: [PATCH 063/101] chore: restore standard CI workflow --- .github/workflows/ci.yml | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a033b07e..b4042f6b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,24 +72,7 @@ jobs: run: exit 1 - name: Run tests - id: tests - continue-on-error: true - shell: bash - run: | - set -o pipefail - yarn test 2>&1 | tee test.log - - - name: Upload test diagnostics - if: steps.tests.outcome == 'failure' - uses: actions/upload-artifact@v7 - with: - name: version-test-diagnostics - path: test.log - if-no-files-found: error - - - name: Fail on test errors - if: steps.tests.outcome == 'failure' - run: exit 1 + run: yarn test - name: Build production extension run: yarn build From 3874758035170272b35baddac5745112af0739e6 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 06:42:01 +0700 Subject: [PATCH 064/101] docs: make issue version placeholder release-neutral --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 5970e79f..1815e73a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -71,7 +71,7 @@ body: id: extension-version attributes: label: Extension version - placeholder: "Example: v1.2.0" + placeholder: "Example: vX.Y.Z" - type: dropdown id: mode From e435ec1c99b0cf2c2fc8144396e25a9a7fb121fb Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 06:49:17 +0700 Subject: [PATCH 065/101] feat: resolve web version from latest GitHub release --- web/release-version.ts | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 web/release-version.ts diff --git a/web/release-version.ts b/web/release-version.ts new file mode 100644 index 00000000..763e136f --- /dev/null +++ b/web/release-version.ts @@ -0,0 +1,37 @@ +import packageMetadata from "../package.json"; + +export const LATEST_RELEASE_API_URL = + "https://api.github.com/repos/ePlus-DEV/gmail-alias-toolkit/releases/latest"; + +const SEMVER_PATTERN = + /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/; + +/** Converts a GitHub release tag such as v1.3.2 into an application version. */ +export function normalizeReleaseVersion(tagName: unknown): string | null { + if (typeof tagName !== "string") return null; + + const version = tagName.trim().replace(/^v/i, ""); + return SEMVER_PATTERN.test(version) ? version : null; +} + +/** Resolves the latest published GitHub release, falling back to package metadata. */ +export async function resolveLatestReleaseVersion( + fetcher: typeof fetch = fetch, +): Promise { + try { + const headers: Record = { + Accept: "application/vnd.github+json", + "X-GitHub-Api-Version": "2022-11-28", + }; + const token = process.env.GITHUB_TOKEN?.trim(); + if (token) headers.Authorization = `Bearer ${token}`; + + const response = await fetcher(LATEST_RELEASE_API_URL, { headers }); + if (!response.ok) return packageMetadata.version; + + const payload = (await response.json()) as { tag_name?: unknown }; + return normalizeReleaseVersion(payload.tag_name) ?? packageMetadata.version; + } catch { + return packageMetadata.version; + } +} From 588cc180656e5cff263100a68d3d434cf1f141e3 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 06:49:29 +0700 Subject: [PATCH 066/101] feat: allow web builds to inject release version --- src/version.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/version.ts b/src/version.ts index 460251f3..346f93df 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1,4 +1,6 @@ import packageMetadata from "../package.json"; -/** Application version sourced from the root package metadata. */ -export const APP_VERSION = packageMetadata.version; +const injectedVersion = import.meta.env.VITE_APP_VERSION?.trim(); + +/** Application version from the web build or root package metadata. */ +export const APP_VERSION = injectedVersion || packageMetadata.version; From 6554efc1eec84ffde5c7a0ae0e7ef2951eed4c10 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 06:49:43 +0700 Subject: [PATCH 067/101] feat: inject latest GitHub release into web build --- web/vite.config.ts | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/web/vite.config.ts b/web/vite.config.ts index 63832274..fd82a626 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -1,16 +1,24 @@ import react from "@vitejs/plugin-react"; import { defineConfig } from "vite"; import { fileURLToPath, URL } from "node:url"; +import { resolveLatestReleaseVersion } from "./release-version"; const basePath = process.env.VITE_BASE_PATH ?? "/gmail-alias-toolkit/"; -export default defineConfig({ - base: basePath, - plugins: [react()], - resolve: { - alias: { - src: fileURLToPath(new URL("../src", import.meta.url)), +export default defineConfig(async () => { + const releaseVersion = await resolveLatestReleaseVersion(); + + return { + base: basePath, + plugins: [react()], + define: { + "import.meta.env.VITE_APP_VERSION": JSON.stringify(releaseVersion), + }, + resolve: { + alias: { + src: fileURLToPath(new URL("../src", import.meta.url)), + }, + dedupe: ["react", "react-dom"], }, - dedupe: ["react", "react-dom"], - }, + }; }); From 76c17bbaceabe1e805576bb8202617bb24b780da Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 06:49:58 +0700 Subject: [PATCH 068/101] test: cover GitHub release version resolution --- tests/webReleaseVersion.test.ts | 66 +++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 tests/webReleaseVersion.test.ts diff --git a/tests/webReleaseVersion.test.ts b/tests/webReleaseVersion.test.ts new file mode 100644 index 00000000..a68f3bfa --- /dev/null +++ b/tests/webReleaseVersion.test.ts @@ -0,0 +1,66 @@ +import packageMetadata from "../package.json"; +import { describe, expect, it, vi } from "vitest"; +import { + LATEST_RELEASE_API_URL, + normalizeReleaseVersion, + resolveLatestReleaseVersion, +} from "../web/release-version"; + +/** Creates a minimal fetch implementation for release-version tests. */ +function createFetchResponse(payload: unknown, ok = true): typeof fetch { + return vi.fn(async () => + ({ + ok, + json: async () => payload, + }) as Response, + ) as unknown as typeof fetch; +} + +describe("GitHub release version", () => { + it("normalizes a release tag with a leading v", () => { + expect(normalizeReleaseVersion("v1.3.2")).toBe("1.3.2"); + }); + + it("accepts semantic versions with prerelease metadata", () => { + expect(normalizeReleaseVersion("1.4.0-beta.1")).toBe("1.4.0-beta.1"); + }); + + it("rejects invalid release tags", () => { + expect(normalizeReleaseVersion("latest")).toBeNull(); + expect(normalizeReleaseVersion(null)).toBeNull(); + }); + + it("uses the latest published GitHub release tag", async () => { + const fetcher = createFetchResponse({ tag_name: "v1.4.0" }); + + await expect(resolveLatestReleaseVersion(fetcher)).resolves.toBe("1.4.0"); + expect(fetcher).toHaveBeenCalledWith( + LATEST_RELEASE_API_URL, + expect.objectContaining({ + headers: expect.objectContaining({ + Accept: "application/vnd.github+json", + }), + }), + ); + }); + + it("falls back to package metadata when GitHub has no usable release", async () => { + const invalidTagFetcher = createFetchResponse({ tag_name: "latest" }); + const failedResponseFetcher = createFetchResponse({}, false); + const rejectedFetcher = vi + .fn(async () => { + throw new Error("offline"); + }) + .mockName("rejectedFetch") as unknown as typeof fetch; + + await expect(resolveLatestReleaseVersion(invalidTagFetcher)).resolves.toBe( + packageMetadata.version, + ); + await expect(resolveLatestReleaseVersion(failedResponseFetcher)).resolves.toBe( + packageMetadata.version, + ); + await expect(resolveLatestReleaseVersion(rejectedFetcher)).resolves.toBe( + packageMetadata.version, + ); + }); +}); From 83838b107290582fd7458faf937ed8a5c3ff0a0c Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 06:51:49 +0700 Subject: [PATCH 069/101] ci: authenticate GitHub release lookup for Pages --- .github/workflows/deploy-pages.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml index 9eaab1d9..50669354 100644 --- a/.github/workflows/deploy-pages.yml +++ b/.github/workflows/deploy-pages.yml @@ -24,6 +24,8 @@ jobs: build: name: Build website runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{ github.token }} steps: - name: Checkout From f2ba7032870464554628e786eed5eb1ee463c065 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 06:52:18 +0700 Subject: [PATCH 070/101] ci: authenticate release lookup for web previews --- .github/workflows/pr-preview.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/pr-preview.yml b/.github/workflows/pr-preview.yml index 7458a336..7244d8c0 100644 --- a/.github/workflows/pr-preview.yml +++ b/.github/workflows/pr-preview.yml @@ -26,6 +26,8 @@ jobs: name: Build preview site if: github.event.pull_request.head.repo.full_name == github.repository runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{ github.token }} steps: - name: Checkout production site From d7a22c28461e1fde3a0e35725191616c85b2a45d Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 08:54:43 +0700 Subject: [PATCH 071/101] Refactor code structure for improved readability and maintainability --- public/_locales/de/messages.json | 1544 +++++++++++++-------------- public/_locales/es/messages.json | 1544 +++++++++++++-------------- public/_locales/fr/messages.json | 1544 +++++++++++++-------------- public/_locales/hi/messages.json | 1544 +++++++++++++-------------- public/_locales/it/messages.json | 1544 +++++++++++++-------------- public/_locales/ja/messages.json | 1544 +++++++++++++-------------- public/_locales/ko/messages.json | 1544 +++++++++++++-------------- public/_locales/pl/messages.json | 1544 +++++++++++++-------------- public/_locales/pt_BR/messages.json | 1544 +++++++++++++-------------- public/_locales/ru/messages.json | 1544 +++++++++++++-------------- public/_locales/tr/messages.json | 1544 +++++++++++++-------------- public/_locales/vi/messages.json | 1544 +++++++++++++-------------- public/_locales/zh_CN/messages.json | 1544 +++++++++++++-------------- 13 files changed, 10036 insertions(+), 10036 deletions(-) diff --git a/public/_locales/de/messages.json b/public/_locales/de/messages.json index f167924b..ea2e7529 100644 --- a/public/_locales/de/messages.json +++ b/public/_locales/de/messages.json @@ -1,774 +1,774 @@ { - "extensionName": { - "message": "Gmail Alias Toolkit" - }, - "extensionDescription": { - "message": "Gmail-Aliasse mit +tag-Adressen und Vorlagen erstellen und verwalten" - }, - "headerSubtitle": { - "message": "Aliasse mit +tag-Adressen erstellen" - }, - "settings": { - "message": "Einstellungen" - }, - "back": { - "message": "Zurück" - }, - "close": { - "message": "Schließen" - }, - "cancel": { - "message": "Abbrechen" - }, - "copy": { - "message": "Kopieren" - }, - "copyAll": { - "message": "Alle kopieren" - }, - "copyToClipboard": { - "message": "In die Zwischenablage kopieren" - }, - "activeGmailAddress": { - "message": "Aktive Gmail-Adresse" - }, - "addNewAccount": { - "message": "Neues Konto hinzufügen" - }, - "addAccount": { - "message": "Konto hinzufügen" - }, - "addNewAccountTitle": { - "message": "Neues Konto hinzufügen" - }, - "emailPlaceholder": { - "message": "deine.email" - }, - "accountLabelPlaceholder": { - "message": "Label (optional, z. B. Arbeit, Privat)" - }, - "pressTabToAddGmail": { - "message": "Drücke $KEY$, um @gmail.com hinzuzufügen", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "gmailWarning": { - "message": "Das sieht nicht wie eine Gmail-Adresse aus. Plus-Adressierung funktioniert am besten mit Gmail." - }, - "random": { - "message": "Zufällig" - }, - "customTags": { - "message": "Benutzerdefinierte Tags" - }, - "gmailTricks": { - "message": "Gmail-Tricks" - }, - "tabTagsShort": { - "message": "Tags" - }, - "tabTricksShort": { - "message": "Tricks" - }, - "generating": { - "message": "Wird erstellt" - }, - "copied": { - "message": "Kopiert" - }, - "switchToLightMode": { - "message": "Zum hellen Modus wechseln" - }, - "switchToDarkMode": { - "message": "Zum dunklen Modus wechseln" - }, - "aliasColumn": { - "message": "Alias" - }, - "copyEmailTooltip": { - "message": "$EMAIL$ - zum Kopieren klicken", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "pageLabel": { - "message": "Seite $PAGE$", - "placeholders": { - "page": { - "content": "$1" - } - } - }, - "dotTrick": { - "message": "Punkt-Trick" - }, - "plusTags": { - "message": "Plus- (+) Tags" - }, - "googlemail": { - "message": "Googlemail" - }, - "removeDots": { - "message": "Punkte entfernen" - }, - "dotPlus": { - "message": "Punkt + Plus" - }, - "allCombos": { - "message": "Alle Kombinationen" - }, - "numberOfVariations": { - "message": "Anzahl der Varianten" - }, - "randomizeDotPositions": { - "message": "Punktpositionen zufällig wählen" - }, - "sequential": { - "message": "Fortlaufend" - }, - "generateTricks": { - "message": "Tricks erstellen" - }, - "generatedVariations": { - "message": "Erstellte Varianten" - }, - "gmailTrickInfoLabel": { - "message": "Gmail-Trick:" - }, - "gmailTrickInfo": { - "message": "Punkte werden ignoriert und alles nach + landet im selben Posteingang" - }, - "format": { - "message": "Format" - }, - "privateMailFormat": { - "message": "Private Mail (private-mail-xxxx)" - }, - "randomCharactersFormat": { - "message": "Zufällige Zeichen (abc123xy)" - }, - "randomWordsFormat": { - "message": "Zufällige Wörter (happy-fox-42)" - }, - "timestampFormat": { - "message": "Zeitstempel (1234567890)" - }, - "numberOfAliases": { - "message": "Anzahl der Aliasse" - }, - "generateRandomAliases": { - "message": "$COUNT$ zufällige Alias$PLURAL$ erstellen", - "placeholders": { - "count": { - "content": "$1" - }, - "plural": { - "content": "$2" - } - } - }, - "generatedAliases": { - "message": "Erstellte Aliasse" - }, - "totalCount": { - "message": "$COUNT$ insgesamt", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "copiedAliases": { - "message": "$COUNT$ Aliasse kopiert!", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "failedToCopy": { - "message": "Kopieren fehlgeschlagen" - }, - "formatPrivateMail": { - "message": "Format: private-mail-xxxx" - }, - "formatAlphanumeric": { - "message": "8 zufällige Zeichen" - }, - "formatWords": { - "message": "2 zufällige Wörter" - }, - "formatTimestamp": { - "message": "Unix-Zeitstempel" - }, - "tagPlaceholder": { - "message": "Tag eingeben (z. B. shopping, work)" - }, - "generate": { - "message": "Erstellen" - }, - "yourPresets": { - "message": "Deine Vorlagen" - }, - "example": { - "message": "Beispiel:" - }, - "copyExample": { - "message": "Beispiel kopieren" - }, - "recentAliases": { - "message": "Aktuelle Aliasse" - }, - "favorites": { - "message": "Favoriten" - }, - "exportAsCsv": { - "message": "Als CSV exportieren" - }, - "exportAsJson": { - "message": "Als JSON exportieren" - }, - "selectAliases": { - "message": "Aliasse auswählen" - }, - "select": { - "message": "Auswählen" - }, - "starredCount": { - "message": "$COUNT$ markiert", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deselectAll": { - "message": "Alle abwählen" - }, - "selectAll": { - "message": "Alle auswählen" - }, - "selectedCount": { - "message": "$COUNT$ ausgewählt", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deleteCount": { - "message": "$COUNT$ löschen", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "allCount": { - "message": "Alle ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "favoritesCount": { - "message": "Favoriten ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "searchAliases": { - "message": "Aliasse suchen..." - }, - "allTags": { - "message": "Alle Tags" - }, - "mostRecent": { - "message": "Neueste" - }, - "az": { - "message": "A-Z" - }, - "noFavoritesYet": { - "message": "Noch keine Favoriten" - }, - "starEmailsHint": { - "message": "Markiere E-Mails aus deinem Verlauf, um hier schnell darauf zuzugreifen" - }, - "noResultsFound": { - "message": "Keine Ergebnisse gefunden" - }, - "differentSearchHint": { - "message": "Versuche eine andere Suche oder einen anderen Filter" - }, - "showQrCode": { - "message": "QR-Code anzeigen" - }, - "removeFromFavorites": { - "message": "Aus Favoriten entfernen" - }, - "addToFavorites": { - "message": "Zu Favoriten hinzufügen" - }, - "showingRange": { - "message": "Zeige $START$-$END$ von $TOTAL$", - "placeholders": { - "start": { - "content": "$1" - }, - "end": { - "content": "$2" - }, - "total": { - "content": "$3" - } - } - }, - "perPage": { - "message": "$COUNT$ / Seite", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "firstPage": { - "message": "Erste Seite" - }, - "previousPage": { - "message": "Vorherige Seite" - }, - "nextPage": { - "message": "Nächste Seite" - }, - "lastPage": { - "message": "Letzte Seite" - }, - "scanToCopyAlias": { - "message": "Scannen, um Alias zu kopieren" - }, - "general": { - "message": "Allgemein" - }, - "accounts": { - "message": "Konten" - }, - "changelog": { - "message": "Änderungsprotokoll" - }, - "appearanceDisplay": { - "message": "Darstellung \u0026 Anzeige" - }, - "theme": { - "message": "Design" - }, - "themeLight": { - "message": "Hell" - }, - "themeDark": { - "message": "Dunkel" - }, - "themeAuto": { - "message": "System (Automatisch)" - }, - "badgeCounter": { - "message": "Badge-Zähler" - }, - "badgeNone": { - "message": "Keine (ausgeblendet)" - }, - "badgeTotal": { - "message": "Gesamt im Verlauf" - }, - "badgeAllTime": { - "message": "Insgesamt erstellt (alle Zeiten)" - }, - "badgeToday": { - "message": "Heute erstellt" - }, - "badgeWeek": { - "message": "Diese Woche" - }, - "copyNotifications": { - "message": "Kopierbenachrichtigungen" - }, - "aliasGeneration": { - "message": "Alias-Erstellung" - }, - "randomAliasFormat": { - "message": "Format für zufällige Aliasse" - }, - "autoSaveLimit": { - "message": "Limit für automatisches Speichern" - }, - "aliasesLimit": { - "message": "$COUNT$ Aliasse", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "customPresets": { - "message": "Benutzerdefinierte Vorlagen" - }, - "label": { - "message": "Label" - }, - "tag": { - "message": "Tag" - }, - "addPreset": { - "message": "+ Vorlage hinzufügen" - }, - "dataManagement": { - "message": "Datenverwaltung" - }, - "export": { - "message": "Exportieren" - }, - "import": { - "message": "Importieren" - }, - "clear": { - "message": "Leeren" - }, - "resetSettings": { - "message": "Alle Einstellungen auf Standard zurücksetzen" - }, - "resetSettingsTitle": { - "message": "Einstellungen zurücksetzen?" - }, - "resetSettingsMessage": { - "message": "Dadurch werden alle Einstellungen auf ihre Standardwerte zurückgesetzt." - }, - "reset": { - "message": "Zurücksetzen" - }, - "clearHistoryTitle": { - "message": "Aktuelle Aliasse löschen?" - }, - "clearHistoryMessage": { - "message": "Dadurch werden alle Aliasse aus der Liste des aktuellen Verlaufs entfernt." - }, - "emailAccounts": { - "message": "E-Mail-Konten" - }, - "manageAccountsDescription": { - "message": "Verwalte deine Gmail-Konten. Jedes Konto hat seinen eigenen Verlauf, Statistiken und Favoriten." - }, - "noAccountsFound": { - "message": "Keine Konten gefunden. Bitte füge ein Konto über den Hauptbildschirm hinzu." - }, - "emailAddress": { - "message": "E-Mail-Adresse" - }, - "accountLabel": { - "message": "Kontolabel" - }, - "emailAddressPlaceholder": { - "message": "deine.email@gmail.com" - }, - "emailChangeWarning": { - "message": "Beim Ändern der E-Mail werden alle Daten zur neuen E-Mail-Adresse migriert" - }, - "saveChanges": { - "message": "Änderungen speichern" - }, - "active": { - "message": "Aktiv" - }, - "editAccount": { - "message": "Konto bearbeiten" - }, - "cannotDeleteLastAccountTitle": { - "message": "Das letzte Konto kann nicht gelöscht werden" - }, - "deleteThisAccount": { - "message": "Dieses Konto löschen" - }, - "deleteAccountTitle": { - "message": "Konto löschen?" - }, - "deleteAccountMessage": { - "message": "\"$LABEL$\" ($EMAIL$) löschen?\n\nDadurch wird dauerhaft gelöscht:\n- Der gesamte Verlauf für dieses Konto\n- Alle Statistiken\n- Alle Favoriten\n\nDiese Aktion kann nicht rückgängig gemacht werden.", - "placeholders": { - "label": { - "content": "$1" - }, - "email": { - "content": "$2" - } - } - }, - "delete": { - "message": "Löschen" - }, - "changeAccountEmailTitle": { - "message": "Konto-E-Mail ändern?" - }, - "changeAccountEmailMessage": { - "message": "E-Mail ändern von\n$OLD_EMAIL$\nzu\n$NEW_EMAIL$?\n\nDies wird:\n- Den gesamten Verlauf, Statistiken und Favoriten zur neuen E-Mail migrieren\n- Die Konto-E-Mail aktualisieren\n- Daten löschen, die mit der alten E-Mail verknüpft sind\n\nFortfahren?", - "placeholders": { - "old_email": { - "content": "$1" - }, - "new_email": { - "content": "$2" - } - } - }, - "changeEmail": { - "message": "E-Mail ändern" - }, - "menuForThisWebsite": { - "message": "Für diese Website" - }, - "menuLoading": { - "message": "Wird geladen..." - }, - "menuRandomEmailAlias": { - "message": "Zufälliger E-Mail-Alias" - }, - "menuCustomTags": { - "message": "Benutzerdefinierte Tags" - }, - "menuNoPresets": { - "message": "Keine Vorlagen - in Einstellungen hinzufügen" - }, - "menuGmailTricks": { - "message": "Gmail-Tricks" - }, - "menuDotVariation": { - "message": "Punktvariante" - }, - "menuGooglemailDomain": { - "message": "Googlemail-Domain" - }, - "menuRemoveAllDots": { - "message": "Alle Punkte entfernen" - }, - "toastPresetAdded": { - "message": "Vorlage hinzugefügt" - }, - "toastPresetRemoved": { - "message": "Vorlage entfernt" - }, - "toastSettingsExported": { - "message": "Einstellungen exportiert" - }, - "toastSettingsImported": { - "message": "Einstellungen importiert" - }, - "toastImportFailed": { - "message": "Import fehlgeschlagen - ungültige Datei" - }, - "toastSettingsReset": { - "message": "Einstellungen auf Standard zurückgesetzt" - }, - "toastAccountSwitched": { - "message": "Konto gewechselt" - }, - "toastAccountDeleted": { - "message": "Konto gelöscht" - }, - "toastAccountUpdated": { - "message": "Konto aktualisiert" - }, - "toastAccountAdded": { - "message": "$LABEL$ hinzugefügt", - "placeholders": { - "label": { - "content": "$1" - } - } - }, - "errorLabelRequired": { - "message": "Label darf nicht leer sein" - }, - "errorInvalidEmail": { - "message": "Bitte gib eine gültige E-Mail-Adresse ein" - }, - "errorDuplicateEmail": { - "message": "Diese E-Mail-Adresse wird bereits von einem anderen Konto verwendet" - }, - "errorEnterEmail": { - "message": "Bitte gib eine E-Mail-Adresse ein" - }, - "errorAccountExists": { - "message": "Dieses Konto existiert bereits" - }, - "toastQrFailed": { - "message": "QR-Code konnte nicht erstellt werden" - }, - "toastExportedAliases": { - "message": "$COUNT$ Aliasse exportiert", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastDeletedAliases": { - "message": "$COUNT$ Aliasse gelöscht", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastHistoryCleared": { - "message": "Verlauf gelöscht" - }, - "toastFavoriteAdded": { - "message": "Zu Favoriten hinzugefügt" - }, - "toastFavoriteRemoved": { - "message": "Aus Favoriten entfernt" - }, - "toastCopiedEmail": { - "message": "$EMAIL$ kopiert", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "toastCopyFailed": { - "message": "Kopieren fehlgeschlagen" - }, - "welcomeTitle": { - "message": "Willkommen bei Gmail Alias Toolkit" - }, - "welcomeSubtitle": { - "message": "Erstelle unbegrenzt E-Mail-Aliasse für Datenschutz und Organisation" - }, - "letsGetStarted": { - "message": "Los geht’s" - }, - "enterGmailAddress": { - "message": "Gib deine Gmail-Adresse ein" - }, - "pressTabForGmail": { - "message": "Drücke $KEY$ für @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "settingUp": { - "message": "Wird eingerichtet..." - }, - "getStarted": { - "message": "Starten" - }, - "advancedSetup": { - "message": "Erweiterte Einrichtung in den Einstellungen" - }, - "whatYouCanDo": { - "message": "Was du tun kannst:" - }, - "featurePrivateEmail": { - "message": "Generator für private E-Mails" - }, - "featureCustomTags": { - "message": "Benutzerdefinierte Tags \u0026 Vorlagen" - }, - "featureGmailTricks": { - "message": "Erweiterte Gmail-Tricks" - }, - "welcomeFooter": { - "message": "Alle Daten werden lokal gespeichert. Kein Tracking, kein Server." - }, - "favoritesSaved": { - "message": "$COUNT$ gespeichert", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "clickStarHint": { - "message": "Klicke im Verlauf bei einem Alias auf den Stern, um ihn hier hinzuzufügen" - }, - "viewStatistics": { - "message": "Statistiken anzeigen" - }, - "statistics": { - "message": "Statistiken" - }, - "metricsTab": { - "message": "Metriken" - }, - "timelineTab": { - "message": "Zeitachse" - }, - "tagsTab": { - "message": "Tags" - }, - "totalGenerated": { - "message": "Insgesamt erstellt" - }, - "createdToday": { - "message": "Heute erstellt" - }, - "thisWeek": { - "message": "Diese Woche" - }, - "thisMonth": { - "message": "Diesen Monat" - }, - "topTag": { - "message": "Top-Tag" - }, - "totalTags": { - "message": "Tags insgesamt" - }, - "noTagsYet": { - "message": "Noch keine Tags" - }, - "disableInlineForSite": { - "message": "Inline-Hilfe auf dieser Website deaktivieren" - }, - "inlineDisabledSites": { - "message": "Websites mit deaktivierter Inline-Hilfe" - }, - "inlineDisabledSitesDescription": { - "message": "Inline-Symbol und Schnell-Popup sind auf diesen Websites ausgeblendet." - }, - "noDisabledSites": { - "message": "Keine deaktivierten Websites" - }, - "enableInlineForSite": { - "message": "Aktivieren" - }, - "reportReview": { - "message": "Problem melden / Bewerten" - }, - "percentLabel": { - "message": "$PERCENT$%", - "placeholders": { - "percent": { - "content": "$1" - } - } - }, - "retry": { - "message": "Erneut versuchen" - }, - "enable": { - "message": "Aktivieren" - }, - "storageError": { - "message": "Verlauf konnte nicht geladen werden. Überprüfen Sie den Speicherzugriff." - } + "extensionName": { + "message": "Gmail Alias Toolkit" + }, + "extensionDescription": { + "message": "Gmail-Aliasse mit +tag-Adressen und Vorlagen erstellen und verwalten" + }, + "headerSubtitle": { + "message": "Aliasse mit +tag-Adressen erstellen" + }, + "settings": { + "message": "Einstellungen" + }, + "back": { + "message": "Zurück" + }, + "close": { + "message": "Schließen" + }, + "cancel": { + "message": "Abbrechen" + }, + "copy": { + "message": "Kopieren" + }, + "copyAll": { + "message": "Alle kopieren" + }, + "copyToClipboard": { + "message": "In die Zwischenablage kopieren" + }, + "activeGmailAddress": { + "message": "Aktive Gmail-Adresse" + }, + "addNewAccount": { + "message": "Neues Konto hinzufügen" + }, + "addAccount": { + "message": "Konto hinzufügen" + }, + "addNewAccountTitle": { + "message": "Neues Konto hinzufügen" + }, + "emailPlaceholder": { + "message": "deine.email" + }, + "accountLabelPlaceholder": { + "message": "Label (optional, z. B. Arbeit, Privat)" + }, + "pressTabToAddGmail": { + "message": "Drücke $KEY$, um @gmail.com hinzuzufügen", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "gmailWarning": { + "message": "Das sieht nicht wie eine Gmail-Adresse aus. Plus-Adressierung funktioniert am besten mit Gmail." + }, + "random": { + "message": "Zufällig" + }, + "customTags": { + "message": "Benutzerdefinierte Tags" + }, + "gmailTricks": { + "message": "Gmail-Tricks" + }, + "tabTagsShort": { + "message": "Tags" + }, + "tabTricksShort": { + "message": "Tricks" + }, + "generating": { + "message": "Wird erstellt" + }, + "copied": { + "message": "Kopiert" + }, + "switchToLightMode": { + "message": "Zum hellen Modus wechseln" + }, + "switchToDarkMode": { + "message": "Zum dunklen Modus wechseln" + }, + "aliasColumn": { + "message": "Alias" + }, + "copyEmailTooltip": { + "message": "$EMAIL$ - zum Kopieren klicken", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "pageLabel": { + "message": "Seite $PAGE$", + "placeholders": { + "page": { + "content": "$1" + } + } + }, + "dotTrick": { + "message": "Punkt-Trick" + }, + "plusTags": { + "message": "Plus- (+) Tags" + }, + "googlemail": { + "message": "Googlemail" + }, + "removeDots": { + "message": "Punkte entfernen" + }, + "dotPlus": { + "message": "Punkt + Plus" + }, + "allCombos": { + "message": "Alle Kombinationen" + }, + "numberOfVariations": { + "message": "Anzahl der Varianten" + }, + "randomizeDotPositions": { + "message": "Punktpositionen zufällig wählen" + }, + "sequential": { + "message": "Fortlaufend" + }, + "generateTricks": { + "message": "Tricks erstellen" + }, + "generatedVariations": { + "message": "Erstellte Varianten" + }, + "gmailTrickInfoLabel": { + "message": "Gmail-Trick:" + }, + "gmailTrickInfo": { + "message": "Punkte werden ignoriert und alles nach + landet im selben Posteingang" + }, + "format": { + "message": "Format" + }, + "privateMailFormat": { + "message": "Private Mail (private-mail-xxxx)" + }, + "randomCharactersFormat": { + "message": "Zufällige Zeichen (abc123xy)" + }, + "randomWordsFormat": { + "message": "Zufällige Wörter (happy-fox-42)" + }, + "timestampFormat": { + "message": "Zeitstempel (1234567890)" + }, + "numberOfAliases": { + "message": "Anzahl der Aliasse" + }, + "generateRandomAliases": { + "message": "$COUNT$ zufällige Alias$PLURAL$ erstellen", + "placeholders": { + "count": { + "content": "$1" + }, + "plural": { + "content": "$2" + } + } + }, + "generatedAliases": { + "message": "Erstellte Aliasse" + }, + "totalCount": { + "message": "$COUNT$ insgesamt", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "copiedAliases": { + "message": "$COUNT$ Aliasse kopiert!", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "failedToCopy": { + "message": "Kopieren fehlgeschlagen" + }, + "formatPrivateMail": { + "message": "Format: private-mail-xxxx" + }, + "formatAlphanumeric": { + "message": "8 zufällige Zeichen" + }, + "formatWords": { + "message": "2 zufällige Wörter" + }, + "formatTimestamp": { + "message": "Unix-Zeitstempel" + }, + "tagPlaceholder": { + "message": "Tag eingeben (z. B. shopping, work)" + }, + "generate": { + "message": "Erstellen" + }, + "yourPresets": { + "message": "Deine Vorlagen" + }, + "example": { + "message": "Beispiel:" + }, + "copyExample": { + "message": "Beispiel kopieren" + }, + "recentAliases": { + "message": "Aktuelle Aliasse" + }, + "favorites": { + "message": "Favoriten" + }, + "exportAsCsv": { + "message": "Als CSV exportieren" + }, + "exportAsJson": { + "message": "Als JSON exportieren" + }, + "selectAliases": { + "message": "Aliasse auswählen" + }, + "select": { + "message": "Auswählen" + }, + "starredCount": { + "message": "$COUNT$ markiert", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deselectAll": { + "message": "Alle abwählen" + }, + "selectAll": { + "message": "Alle auswählen" + }, + "selectedCount": { + "message": "$COUNT$ ausgewählt", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deleteCount": { + "message": "$COUNT$ löschen", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "allCount": { + "message": "Alle ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "favoritesCount": { + "message": "Favoriten ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "searchAliases": { + "message": "Aliasse suchen..." + }, + "allTags": { + "message": "Alle Tags" + }, + "mostRecent": { + "message": "Neueste" + }, + "az": { + "message": "A-Z" + }, + "noFavoritesYet": { + "message": "Noch keine Favoriten" + }, + "starEmailsHint": { + "message": "Markiere E-Mails aus deinem Verlauf, um hier schnell darauf zuzugreifen" + }, + "noResultsFound": { + "message": "Keine Ergebnisse gefunden" + }, + "differentSearchHint": { + "message": "Versuche eine andere Suche oder einen anderen Filter" + }, + "showQrCode": { + "message": "QR-Code anzeigen" + }, + "removeFromFavorites": { + "message": "Aus Favoriten entfernen" + }, + "addToFavorites": { + "message": "Zu Favoriten hinzufügen" + }, + "showingRange": { + "message": "Zeige $START$-$END$ von $TOTAL$", + "placeholders": { + "start": { + "content": "$1" + }, + "end": { + "content": "$2" + }, + "total": { + "content": "$3" + } + } + }, + "perPage": { + "message": "$COUNT$ / Seite", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "firstPage": { + "message": "Erste Seite" + }, + "previousPage": { + "message": "Vorherige Seite" + }, + "nextPage": { + "message": "Nächste Seite" + }, + "lastPage": { + "message": "Letzte Seite" + }, + "scanToCopyAlias": { + "message": "Scannen, um Alias zu kopieren" + }, + "general": { + "message": "Allgemein" + }, + "accounts": { + "message": "Konten" + }, + "changelog": { + "message": "Änderungsprotokoll" + }, + "appearanceDisplay": { + "message": "Darstellung & Anzeige" + }, + "theme": { + "message": "Design" + }, + "themeLight": { + "message": "Hell" + }, + "themeDark": { + "message": "Dunkel" + }, + "themeAuto": { + "message": "System (Automatisch)" + }, + "badgeCounter": { + "message": "Badge-Zähler" + }, + "badgeNone": { + "message": "Keine (ausgeblendet)" + }, + "badgeTotal": { + "message": "Gesamt im Verlauf" + }, + "badgeAllTime": { + "message": "Insgesamt erstellt (alle Zeiten)" + }, + "badgeToday": { + "message": "Heute erstellt" + }, + "badgeWeek": { + "message": "Diese Woche" + }, + "copyNotifications": { + "message": "Kopierbenachrichtigungen" + }, + "aliasGeneration": { + "message": "Alias-Erstellung" + }, + "randomAliasFormat": { + "message": "Format für zufällige Aliasse" + }, + "autoSaveLimit": { + "message": "Limit für automatisches Speichern" + }, + "aliasesLimit": { + "message": "$COUNT$ Aliasse", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "customPresets": { + "message": "Benutzerdefinierte Vorlagen" + }, + "label": { + "message": "Label" + }, + "tag": { + "message": "Tag" + }, + "addPreset": { + "message": "+ Vorlage hinzufügen" + }, + "dataManagement": { + "message": "Datenverwaltung" + }, + "export": { + "message": "Exportieren" + }, + "import": { + "message": "Importieren" + }, + "clear": { + "message": "Leeren" + }, + "resetSettings": { + "message": "Alle Einstellungen auf Standard zurücksetzen" + }, + "resetSettingsTitle": { + "message": "Einstellungen zurücksetzen?" + }, + "resetSettingsMessage": { + "message": "Dadurch werden alle Einstellungen auf ihre Standardwerte zurückgesetzt." + }, + "reset": { + "message": "Zurücksetzen" + }, + "clearHistoryTitle": { + "message": "Aktuelle Aliasse löschen?" + }, + "clearHistoryMessage": { + "message": "Dadurch werden alle Aliasse aus der Liste des aktuellen Verlaufs entfernt." + }, + "emailAccounts": { + "message": "E-Mail-Konten" + }, + "manageAccountsDescription": { + "message": "Verwalte deine Gmail-Konten. Jedes Konto hat seinen eigenen Verlauf, Statistiken und Favoriten." + }, + "noAccountsFound": { + "message": "Keine Konten gefunden. Bitte füge ein Konto über den Hauptbildschirm hinzu." + }, + "emailAddress": { + "message": "E-Mail-Adresse" + }, + "accountLabel": { + "message": "Kontolabel" + }, + "emailAddressPlaceholder": { + "message": "deine.email@gmail.com" + }, + "emailChangeWarning": { + "message": "Beim Ändern der E-Mail werden alle Daten zur neuen E-Mail-Adresse migriert" + }, + "saveChanges": { + "message": "Änderungen speichern" + }, + "active": { + "message": "Aktiv" + }, + "editAccount": { + "message": "Konto bearbeiten" + }, + "cannotDeleteLastAccountTitle": { + "message": "Das letzte Konto kann nicht gelöscht werden" + }, + "deleteThisAccount": { + "message": "Dieses Konto löschen" + }, + "deleteAccountTitle": { + "message": "Konto löschen?" + }, + "deleteAccountMessage": { + "message": "\"$LABEL$\" ($EMAIL$) löschen?\n\nDadurch wird dauerhaft gelöscht:\n- Der gesamte Verlauf für dieses Konto\n- Alle Statistiken\n- Alle Favoriten\n\nDiese Aktion kann nicht rückgängig gemacht werden.", + "placeholders": { + "label": { + "content": "$1" + }, + "email": { + "content": "$2" + } + } + }, + "delete": { + "message": "Löschen" + }, + "changeAccountEmailTitle": { + "message": "Konto-E-Mail ändern?" + }, + "changeAccountEmailMessage": { + "message": "E-Mail ändern von\n$OLD_EMAIL$\nzu\n$NEW_EMAIL$?\n\nDies wird:\n- Den gesamten Verlauf, Statistiken und Favoriten zur neuen E-Mail migrieren\n- Die Konto-E-Mail aktualisieren\n- Daten löschen, die mit der alten E-Mail verknüpft sind\n\nFortfahren?", + "placeholders": { + "old_email": { + "content": "$1" + }, + "new_email": { + "content": "$2" + } + } + }, + "changeEmail": { + "message": "E-Mail ändern" + }, + "menuForThisWebsite": { + "message": "Für diese Website" + }, + "menuLoading": { + "message": "Wird geladen..." + }, + "menuRandomEmailAlias": { + "message": "Zufälliger E-Mail-Alias" + }, + "menuCustomTags": { + "message": "Benutzerdefinierte Tags" + }, + "menuNoPresets": { + "message": "Keine Vorlagen - in Einstellungen hinzufügen" + }, + "menuGmailTricks": { + "message": "Gmail-Tricks" + }, + "menuDotVariation": { + "message": "Punktvariante" + }, + "menuGooglemailDomain": { + "message": "Googlemail-Domain" + }, + "menuRemoveAllDots": { + "message": "Alle Punkte entfernen" + }, + "toastPresetAdded": { + "message": "Vorlage hinzugefügt" + }, + "toastPresetRemoved": { + "message": "Vorlage entfernt" + }, + "toastSettingsExported": { + "message": "Einstellungen exportiert" + }, + "toastSettingsImported": { + "message": "Einstellungen importiert" + }, + "toastImportFailed": { + "message": "Import fehlgeschlagen - ungültige Datei" + }, + "toastSettingsReset": { + "message": "Einstellungen auf Standard zurückgesetzt" + }, + "toastAccountSwitched": { + "message": "Konto gewechselt" + }, + "toastAccountDeleted": { + "message": "Konto gelöscht" + }, + "toastAccountUpdated": { + "message": "Konto aktualisiert" + }, + "toastAccountAdded": { + "message": "$LABEL$ hinzugefügt", + "placeholders": { + "label": { + "content": "$1" + } + } + }, + "errorLabelRequired": { + "message": "Label darf nicht leer sein" + }, + "errorInvalidEmail": { + "message": "Bitte gib eine gültige E-Mail-Adresse ein" + }, + "errorDuplicateEmail": { + "message": "Diese E-Mail-Adresse wird bereits von einem anderen Konto verwendet" + }, + "errorEnterEmail": { + "message": "Bitte gib eine E-Mail-Adresse ein" + }, + "errorAccountExists": { + "message": "Dieses Konto existiert bereits" + }, + "toastQrFailed": { + "message": "QR-Code konnte nicht erstellt werden" + }, + "toastExportedAliases": { + "message": "$COUNT$ Aliasse exportiert", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastDeletedAliases": { + "message": "$COUNT$ Aliasse gelöscht", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastHistoryCleared": { + "message": "Verlauf gelöscht" + }, + "toastFavoriteAdded": { + "message": "Zu Favoriten hinzugefügt" + }, + "toastFavoriteRemoved": { + "message": "Aus Favoriten entfernt" + }, + "toastCopiedEmail": { + "message": "$EMAIL$ kopiert", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "toastCopyFailed": { + "message": "Kopieren fehlgeschlagen" + }, + "welcomeTitle": { + "message": "Willkommen bei Gmail Alias Toolkit" + }, + "welcomeSubtitle": { + "message": "Erstelle unbegrenzt E-Mail-Aliasse für Datenschutz und Organisation" + }, + "letsGetStarted": { + "message": "Los geht’s" + }, + "enterGmailAddress": { + "message": "Gib deine Gmail-Adresse ein" + }, + "pressTabForGmail": { + "message": "Drücke $KEY$ für @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "settingUp": { + "message": "Wird eingerichtet..." + }, + "getStarted": { + "message": "Starten" + }, + "advancedSetup": { + "message": "Erweiterte Einrichtung in den Einstellungen" + }, + "whatYouCanDo": { + "message": "Was du tun kannst:" + }, + "featurePrivateEmail": { + "message": "Generator für private E-Mails" + }, + "featureCustomTags": { + "message": "Benutzerdefinierte Tags & Vorlagen" + }, + "featureGmailTricks": { + "message": "Erweiterte Gmail-Tricks" + }, + "welcomeFooter": { + "message": "Alle Daten werden lokal gespeichert. Kein Tracking, kein Server." + }, + "favoritesSaved": { + "message": "$COUNT$ gespeichert", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "clickStarHint": { + "message": "Klicke im Verlauf bei einem Alias auf den Stern, um ihn hier hinzuzufügen" + }, + "viewStatistics": { + "message": "Statistiken anzeigen" + }, + "statistics": { + "message": "Statistiken" + }, + "metricsTab": { + "message": "Metriken" + }, + "timelineTab": { + "message": "Zeitachse" + }, + "tagsTab": { + "message": "Tags" + }, + "totalGenerated": { + "message": "Insgesamt erstellt" + }, + "createdToday": { + "message": "Heute erstellt" + }, + "thisWeek": { + "message": "Diese Woche" + }, + "thisMonth": { + "message": "Diesen Monat" + }, + "topTag": { + "message": "Top-Tag" + }, + "totalTags": { + "message": "Tags insgesamt" + }, + "noTagsYet": { + "message": "Noch keine Tags" + }, + "disableInlineForSite": { + "message": "Inline-Hilfe auf dieser Website deaktivieren" + }, + "inlineDisabledSites": { + "message": "Websites mit deaktivierter Inline-Hilfe" + }, + "inlineDisabledSitesDescription": { + "message": "Inline-Symbol und Schnell-Popup sind auf diesen Websites ausgeblendet." + }, + "noDisabledSites": { + "message": "Keine deaktivierten Websites" + }, + "enableInlineForSite": { + "message": "Aktivieren" + }, + "reportReview": { + "message": "Problem melden / Bewerten" + }, + "percentLabel": { + "message": "$PERCENT$%", + "placeholders": { + "percent": { + "content": "$1" + } + } + }, + "enable": { + "message": "Aktivieren" + }, + "retry": { + "message": "Erneut versuchen" + }, + "storageError": { + "message": "Verlauf konnte nicht geladen werden. Überprüfen Sie den Speicherzugriff." + } } diff --git a/public/_locales/es/messages.json b/public/_locales/es/messages.json index 7c34f11c..b889e62c 100644 --- a/public/_locales/es/messages.json +++ b/public/_locales/es/messages.json @@ -1,774 +1,774 @@ { - "extensionName": { - "message": "Gmail Alias Toolkit" - }, - "extensionDescription": { - "message": "Genera y administra alias de Gmail con direcciones +tag y preajustes" - }, - "headerSubtitle": { - "message": "Genera alias con direcciones +tag" - }, - "settings": { - "message": "Configuración" - }, - "back": { - "message": "Atrás" - }, - "close": { - "message": "Cerrar" - }, - "cancel": { - "message": "Cancelar" - }, - "copy": { - "message": "Copiar" - }, - "copyAll": { - "message": "Copiar todo" - }, - "copyToClipboard": { - "message": "Copiar al portapapeles" - }, - "activeGmailAddress": { - "message": "Dirección de Gmail activa" - }, - "addNewAccount": { - "message": "Agregar nueva cuenta" - }, - "addAccount": { - "message": "Agregar cuenta" - }, - "addNewAccountTitle": { - "message": "Agregar nueva cuenta" - }, - "emailPlaceholder": { - "message": "tu.email" - }, - "accountLabelPlaceholder": { - "message": "Etiqueta (opcional, p. ej., Trabajo, Personal)" - }, - "pressTabToAddGmail": { - "message": "Pulsa $KEY$ para agregar @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "gmailWarning": { - "message": "Esto no parece una dirección de Gmail. El direccionamiento plus funciona mejor con Gmail." - }, - "random": { - "message": "Aleatorio" - }, - "customTags": { - "message": "Etiquetas personalizadas" - }, - "gmailTricks": { - "message": "Trucos de Gmail" - }, - "tabTagsShort": { - "message": "Etiquetas" - }, - "tabTricksShort": { - "message": "Trucos" - }, - "generating": { - "message": "Generando" - }, - "copied": { - "message": "Copiado" - }, - "switchToLightMode": { - "message": "Cambiar al modo claro" - }, - "switchToDarkMode": { - "message": "Cambiar al modo oscuro" - }, - "aliasColumn": { - "message": "Alias" - }, - "copyEmailTooltip": { - "message": "$EMAIL$ - haz clic para copiar", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "pageLabel": { - "message": "Página $PAGE$", - "placeholders": { - "page": { - "content": "$1" - } - } - }, - "dotTrick": { - "message": "Truco de puntos" - }, - "plusTags": { - "message": "Etiquetas Plus (+)" - }, - "googlemail": { - "message": "Googlemail" - }, - "removeDots": { - "message": "Quitar puntos" - }, - "dotPlus": { - "message": "Punto + Plus" - }, - "allCombos": { - "message": "Todas las combinaciones" - }, - "numberOfVariations": { - "message": "Número de variaciones" - }, - "randomizeDotPositions": { - "message": "Aleatorizar posiciones de puntos" - }, - "sequential": { - "message": "Secuencial" - }, - "generateTricks": { - "message": "Generar trucos" - }, - "generatedVariations": { - "message": "Variaciones generadas" - }, - "gmailTrickInfoLabel": { - "message": "Truco de Gmail:" - }, - "gmailTrickInfo": { - "message": "Los puntos se ignoran y todo lo que va después de + llega a la misma bandeja de entrada" - }, - "format": { - "message": "Formato" - }, - "privateMailFormat": { - "message": "Correo privado (private-mail-xxxx)" - }, - "randomCharactersFormat": { - "message": "Caracteres aleatorios (abc123xy)" - }, - "randomWordsFormat": { - "message": "Palabras aleatorias (happy-fox-42)" - }, - "timestampFormat": { - "message": "Marca de tiempo (1234567890)" - }, - "numberOfAliases": { - "message": "Número de alias" - }, - "generateRandomAliases": { - "message": "Generar $COUNT$ alias aleatorio$PLURAL$", - "placeholders": { - "count": { - "content": "$1" - }, - "plural": { - "content": "$2" - } - } - }, - "generatedAliases": { - "message": "Alias generados" - }, - "totalCount": { - "message": "$COUNT$ en total", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "copiedAliases": { - "message": "¡Se copiaron $COUNT$ alias!", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "failedToCopy": { - "message": "No se pudo copiar" - }, - "formatPrivateMail": { - "message": "Formato: private-mail-xxxx" - }, - "formatAlphanumeric": { - "message": "8 caracteres aleatorios" - }, - "formatWords": { - "message": "2 palabras aleatorias" - }, - "formatTimestamp": { - "message": "Marca de tiempo Unix" - }, - "tagPlaceholder": { - "message": "Introduce una etiqueta (p. ej., shopping, work)" - }, - "generate": { - "message": "Generar" - }, - "yourPresets": { - "message": "Tus preajustes" - }, - "example": { - "message": "Ejemplo:" - }, - "copyExample": { - "message": "Copiar ejemplo" - }, - "recentAliases": { - "message": "Alias recientes" - }, - "favorites": { - "message": "Favoritos" - }, - "exportAsCsv": { - "message": "Exportar como CSV" - }, - "exportAsJson": { - "message": "Exportar como JSON" - }, - "selectAliases": { - "message": "Seleccionar alias" - }, - "select": { - "message": "Seleccionar" - }, - "starredCount": { - "message": "$COUNT$ con estrella", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deselectAll": { - "message": "Deseleccionar todo" - }, - "selectAll": { - "message": "Seleccionar todo" - }, - "selectedCount": { - "message": "$COUNT$ seleccionados", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deleteCount": { - "message": "Eliminar $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "allCount": { - "message": "Todos ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "favoritesCount": { - "message": "Favoritos ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "searchAliases": { - "message": "Buscar alias..." - }, - "allTags": { - "message": "Todas las etiquetas" - }, - "mostRecent": { - "message": "Más recientes" - }, - "az": { - "message": "A-Z" - }, - "noFavoritesYet": { - "message": "Aún no hay favoritos" - }, - "starEmailsHint": { - "message": "Marca correos de tu historial para acceder rápidamente a ellos aquí" - }, - "noResultsFound": { - "message": "No se encontraron resultados" - }, - "differentSearchHint": { - "message": "Prueba otra búsqueda o filtro" - }, - "showQrCode": { - "message": "Mostrar código QR" - }, - "removeFromFavorites": { - "message": "Quitar de favoritos" - }, - "addToFavorites": { - "message": "Agregar a favoritos" - }, - "showingRange": { - "message": "Mostrando $START$-$END$ de $TOTAL$", - "placeholders": { - "start": { - "content": "$1" - }, - "end": { - "content": "$2" - }, - "total": { - "content": "$3" - } - } - }, - "perPage": { - "message": "$COUNT$ / página", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "firstPage": { - "message": "Primera página" - }, - "previousPage": { - "message": "Página anterior" - }, - "nextPage": { - "message": "Página siguiente" - }, - "lastPage": { - "message": "Última página" - }, - "scanToCopyAlias": { - "message": "Escanear para copiar alias" - }, - "general": { - "message": "General" - }, - "accounts": { - "message": "Cuentas" - }, - "changelog": { - "message": "Registro de cambios" - }, - "appearanceDisplay": { - "message": "Apariencia y visualización" - }, - "theme": { - "message": "Tema" - }, - "themeLight": { - "message": "Claro" - }, - "themeDark": { - "message": "Oscuro" - }, - "themeAuto": { - "message": "Sistema (Auto)" - }, - "badgeCounter": { - "message": "Contador de insignia" - }, - "badgeNone": { - "message": "Ninguno (oculto)" - }, - "badgeTotal": { - "message": "Total en el historial" - }, - "badgeAllTime": { - "message": "Total generado (todo el tiempo)" - }, - "badgeToday": { - "message": "Creado hoy" - }, - "badgeWeek": { - "message": "Esta semana" - }, - "copyNotifications": { - "message": "Notificaciones de copia" - }, - "aliasGeneration": { - "message": "Generación de alias" - }, - "randomAliasFormat": { - "message": "Formato de alias aleatorio" - }, - "autoSaveLimit": { - "message": "Límite de guardado automático" - }, - "aliasesLimit": { - "message": "$COUNT$ alias", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "customPresets": { - "message": "Preajustes personalizados" - }, - "label": { - "message": "Etiqueta" - }, - "tag": { - "message": "Etiqueta" - }, - "addPreset": { - "message": "+ Agregar preajuste" - }, - "dataManagement": { - "message": "Gestión de datos" - }, - "export": { - "message": "Exportar" - }, - "import": { - "message": "Importar" - }, - "clear": { - "message": "Borrar" - }, - "resetSettings": { - "message": "Restablecer toda la configuración a los valores predeterminados" - }, - "resetSettingsTitle": { - "message": "¿Restablecer configuración?" - }, - "resetSettingsMessage": { - "message": "Esto restaurará cada ajuste a su valor predeterminado." - }, - "reset": { - "message": "Restablecer" - }, - "clearHistoryTitle": { - "message": "¿Borrar alias recientes?" - }, - "clearHistoryMessage": { - "message": "Esto elimina todos los alias de la lista de historial reciente." - }, - "emailAccounts": { - "message": "Cuentas de correo" - }, - "manageAccountsDescription": { - "message": "Administra tus cuentas de Gmail. Cada cuenta tiene su propio historial, estadísticas y favoritos." - }, - "noAccountsFound": { - "message": "No se encontraron cuentas. Agrega una cuenta desde la pantalla principal." - }, - "emailAddress": { - "message": "Dirección de correo" - }, - "accountLabel": { - "message": "Etiqueta de cuenta" - }, - "emailAddressPlaceholder": { - "message": "tu.email@gmail.com" - }, - "emailChangeWarning": { - "message": "Cambiar el correo migrará todos los datos a la nueva dirección de correo" - }, - "saveChanges": { - "message": "Guardar cambios" - }, - "active": { - "message": "Activa" - }, - "editAccount": { - "message": "Editar cuenta" - }, - "cannotDeleteLastAccountTitle": { - "message": "No se puede eliminar la última cuenta" - }, - "deleteThisAccount": { - "message": "Eliminar esta cuenta" - }, - "deleteAccountTitle": { - "message": "¿Eliminar cuenta?" - }, - "deleteAccountMessage": { - "message": "¿Eliminar \"$LABEL$\" ($EMAIL$)?\n\nEsto eliminará permanentemente:\n- Todo el historial de esta cuenta\n- Todas las estadísticas\n- Todos los favoritos\n\nEsta acción no se puede deshacer.", - "placeholders": { - "label": { - "content": "$1" - }, - "email": { - "content": "$2" - } - } - }, - "delete": { - "message": "Eliminar" - }, - "changeAccountEmailTitle": { - "message": "¿Cambiar correo de la cuenta?" - }, - "changeAccountEmailMessage": { - "message": "¿Cambiar correo de\n$OLD_EMAIL$\na\n$NEW_EMAIL$?\n\nEsto hará lo siguiente:\n- Migrar todo el historial, las estadísticas y los favoritos al nuevo correo\n- Actualizar el correo de la cuenta\n- Eliminar los datos asociados con el correo anterior\n\n¿Continuar?", - "placeholders": { - "old_email": { - "content": "$1" - }, - "new_email": { - "content": "$2" - } - } - }, - "changeEmail": { - "message": "Cambiar correo" - }, - "menuForThisWebsite": { - "message": "Para este sitio web" - }, - "menuLoading": { - "message": "Cargando..." - }, - "menuRandomEmailAlias": { - "message": "Alias de correo aleatorio" - }, - "menuCustomTags": { - "message": "Etiquetas personalizadas" - }, - "menuNoPresets": { - "message": "Sin preajustes - agrégalos en Configuración" - }, - "menuGmailTricks": { - "message": "Trucos de Gmail" - }, - "menuDotVariation": { - "message": "Variación con puntos" - }, - "menuGooglemailDomain": { - "message": "Dominio Googlemail" - }, - "menuRemoveAllDots": { - "message": "Quitar todos los puntos" - }, - "toastPresetAdded": { - "message": "Preajuste agregado" - }, - "toastPresetRemoved": { - "message": "Preajuste eliminado" - }, - "toastSettingsExported": { - "message": "Configuración exportada" - }, - "toastSettingsImported": { - "message": "Configuración importada" - }, - "toastImportFailed": { - "message": "Error al importar - archivo no válido" - }, - "toastSettingsReset": { - "message": "Configuración restablecida a valores predeterminados" - }, - "toastAccountSwitched": { - "message": "Cuenta cambiada" - }, - "toastAccountDeleted": { - "message": "Cuenta eliminada" - }, - "toastAccountUpdated": { - "message": "Cuenta actualizada" - }, - "toastAccountAdded": { - "message": "$LABEL$ agregada", - "placeholders": { - "label": { - "content": "$1" - } - } - }, - "errorLabelRequired": { - "message": "La etiqueta no puede estar vacía" - }, - "errorInvalidEmail": { - "message": "Introduce una dirección de correo válida" - }, - "errorDuplicateEmail": { - "message": "Esta dirección de correo ya la usa otra cuenta" - }, - "errorEnterEmail": { - "message": "Introduce una dirección de correo" - }, - "errorAccountExists": { - "message": "Esta cuenta ya existe" - }, - "toastQrFailed": { - "message": "No se pudo generar el código QR" - }, - "toastExportedAliases": { - "message": "Se exportaron $COUNT$ alias", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastDeletedAliases": { - "message": "Se eliminaron $COUNT$ alias", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastHistoryCleared": { - "message": "Historial borrado" - }, - "toastFavoriteAdded": { - "message": "Agregado a favoritos" - }, - "toastFavoriteRemoved": { - "message": "Eliminado de favoritos" - }, - "toastCopiedEmail": { - "message": "Se copió $EMAIL$", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "toastCopyFailed": { - "message": "No se pudo copiar" - }, - "welcomeTitle": { - "message": "Bienvenido a Gmail Alias Toolkit" - }, - "welcomeSubtitle": { - "message": "Genera alias de correo ilimitados para privacidad y organización" - }, - "letsGetStarted": { - "message": "Empecemos" - }, - "enterGmailAddress": { - "message": "Introduce tu dirección de Gmail" - }, - "pressTabForGmail": { - "message": "Pulsa $KEY$ para @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "settingUp": { - "message": "Configurando..." - }, - "getStarted": { - "message": "Comenzar" - }, - "advancedSetup": { - "message": "Configuración avanzada en Ajustes" - }, - "whatYouCanDo": { - "message": "Qué puedes hacer:" - }, - "featurePrivateEmail": { - "message": "Generador de correo privado" - }, - "featureCustomTags": { - "message": "Etiquetas y preajustes personalizados" - }, - "featureGmailTricks": { - "message": "Trucos avanzados de Gmail" - }, - "welcomeFooter": { - "message": "Todos los datos se almacenan localmente. Sin seguimiento, sin servidor." - }, - "favoritesSaved": { - "message": "$COUNT$ guardados", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "clickStarHint": { - "message": "Haz clic en la estrella de cualquier alias del historial para agregarlo aquí" - }, - "viewStatistics": { - "message": "Ver estadísticas" - }, - "statistics": { - "message": "Estadísticas" - }, - "metricsTab": { - "message": "Métricas" - }, - "timelineTab": { - "message": "Cronología" - }, - "tagsTab": { - "message": "Etiquetas" - }, - "totalGenerated": { - "message": "Total generado" - }, - "createdToday": { - "message": "Creado hoy" - }, - "thisWeek": { - "message": "Esta semana" - }, - "thisMonth": { - "message": "Este mes" - }, - "topTag": { - "message": "Etiqueta principal" - }, - "totalTags": { - "message": "Total de etiquetas" - }, - "noTagsYet": { - "message": "Aún no hay etiquetas" - }, - "disableInlineForSite": { - "message": "Desactivar el asistente integrado en este sitio" - }, - "inlineDisabledSites": { - "message": "Sitios con el asistente integrado desactivado" - }, - "inlineDisabledSitesDescription": { - "message": "El icono y la ventana rápida se ocultan en estos sitios web." - }, - "noDisabledSites": { - "message": "No hay sitios desactivados" - }, - "enableInlineForSite": { - "message": "Activar" - }, - "reportReview": { - "message": "Informar / Valorar" - }, - "percentLabel": { - "message": "$PERCENT$%", - "placeholders": { - "percent": { - "content": "$1" - } - } - }, - "retry": { - "message": "Reintentar" - }, - "enable": { - "message": "Habilitar" - }, - "storageError": { - "message": "No se pudo cargar el historial. Verifique el acceso al almacenamiento." - } + "extensionName": { + "message": "Gmail Alias Toolkit" + }, + "extensionDescription": { + "message": "Genera y administra alias de Gmail con direcciones +tag y preajustes" + }, + "headerSubtitle": { + "message": "Genera alias con direcciones +tag" + }, + "settings": { + "message": "Configuración" + }, + "back": { + "message": "Atrás" + }, + "close": { + "message": "Cerrar" + }, + "cancel": { + "message": "Cancelar" + }, + "copy": { + "message": "Copiar" + }, + "copyAll": { + "message": "Copiar todo" + }, + "copyToClipboard": { + "message": "Copiar al portapapeles" + }, + "activeGmailAddress": { + "message": "Dirección de Gmail activa" + }, + "addNewAccount": { + "message": "Agregar nueva cuenta" + }, + "addAccount": { + "message": "Agregar cuenta" + }, + "addNewAccountTitle": { + "message": "Agregar nueva cuenta" + }, + "emailPlaceholder": { + "message": "tu.email" + }, + "accountLabelPlaceholder": { + "message": "Etiqueta (opcional, p. ej., Trabajo, Personal)" + }, + "pressTabToAddGmail": { + "message": "Pulsa $KEY$ para agregar @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "gmailWarning": { + "message": "Esto no parece una dirección de Gmail. El direccionamiento plus funciona mejor con Gmail." + }, + "random": { + "message": "Aleatorio" + }, + "customTags": { + "message": "Etiquetas personalizadas" + }, + "gmailTricks": { + "message": "Trucos de Gmail" + }, + "tabTagsShort": { + "message": "Etiquetas" + }, + "tabTricksShort": { + "message": "Trucos" + }, + "generating": { + "message": "Generando" + }, + "copied": { + "message": "Copiado" + }, + "switchToLightMode": { + "message": "Cambiar al modo claro" + }, + "switchToDarkMode": { + "message": "Cambiar al modo oscuro" + }, + "aliasColumn": { + "message": "Alias" + }, + "copyEmailTooltip": { + "message": "$EMAIL$ - haz clic para copiar", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "pageLabel": { + "message": "Página $PAGE$", + "placeholders": { + "page": { + "content": "$1" + } + } + }, + "dotTrick": { + "message": "Truco de puntos" + }, + "plusTags": { + "message": "Etiquetas Plus (+)" + }, + "googlemail": { + "message": "Googlemail" + }, + "removeDots": { + "message": "Quitar puntos" + }, + "dotPlus": { + "message": "Punto + Plus" + }, + "allCombos": { + "message": "Todas las combinaciones" + }, + "numberOfVariations": { + "message": "Número de variaciones" + }, + "randomizeDotPositions": { + "message": "Aleatorizar posiciones de puntos" + }, + "sequential": { + "message": "Secuencial" + }, + "generateTricks": { + "message": "Generar trucos" + }, + "generatedVariations": { + "message": "Variaciones generadas" + }, + "gmailTrickInfoLabel": { + "message": "Truco de Gmail:" + }, + "gmailTrickInfo": { + "message": "Los puntos se ignoran y todo lo que va después de + llega a la misma bandeja de entrada" + }, + "format": { + "message": "Formato" + }, + "privateMailFormat": { + "message": "Correo privado (private-mail-xxxx)" + }, + "randomCharactersFormat": { + "message": "Caracteres aleatorios (abc123xy)" + }, + "randomWordsFormat": { + "message": "Palabras aleatorias (happy-fox-42)" + }, + "timestampFormat": { + "message": "Marca de tiempo (1234567890)" + }, + "numberOfAliases": { + "message": "Número de alias" + }, + "generateRandomAliases": { + "message": "Generar $COUNT$ alias aleatorio$PLURAL$", + "placeholders": { + "count": { + "content": "$1" + }, + "plural": { + "content": "$2" + } + } + }, + "generatedAliases": { + "message": "Alias generados" + }, + "totalCount": { + "message": "$COUNT$ en total", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "copiedAliases": { + "message": "¡Se copiaron $COUNT$ alias!", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "failedToCopy": { + "message": "No se pudo copiar" + }, + "formatPrivateMail": { + "message": "Formato: private-mail-xxxx" + }, + "formatAlphanumeric": { + "message": "8 caracteres aleatorios" + }, + "formatWords": { + "message": "2 palabras aleatorias" + }, + "formatTimestamp": { + "message": "Marca de tiempo Unix" + }, + "tagPlaceholder": { + "message": "Introduce una etiqueta (p. ej., shopping, work)" + }, + "generate": { + "message": "Generar" + }, + "yourPresets": { + "message": "Tus preajustes" + }, + "example": { + "message": "Ejemplo:" + }, + "copyExample": { + "message": "Copiar ejemplo" + }, + "recentAliases": { + "message": "Alias recientes" + }, + "favorites": { + "message": "Favoritos" + }, + "exportAsCsv": { + "message": "Exportar como CSV" + }, + "exportAsJson": { + "message": "Exportar como JSON" + }, + "selectAliases": { + "message": "Seleccionar alias" + }, + "select": { + "message": "Seleccionar" + }, + "starredCount": { + "message": "$COUNT$ con estrella", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deselectAll": { + "message": "Deseleccionar todo" + }, + "selectAll": { + "message": "Seleccionar todo" + }, + "selectedCount": { + "message": "$COUNT$ seleccionados", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deleteCount": { + "message": "Eliminar $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "allCount": { + "message": "Todos ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "favoritesCount": { + "message": "Favoritos ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "searchAliases": { + "message": "Buscar alias..." + }, + "allTags": { + "message": "Todas las etiquetas" + }, + "mostRecent": { + "message": "Más recientes" + }, + "az": { + "message": "A-Z" + }, + "noFavoritesYet": { + "message": "Aún no hay favoritos" + }, + "starEmailsHint": { + "message": "Marca correos de tu historial para acceder rápidamente a ellos aquí" + }, + "noResultsFound": { + "message": "No se encontraron resultados" + }, + "differentSearchHint": { + "message": "Prueba otra búsqueda o filtro" + }, + "showQrCode": { + "message": "Mostrar código QR" + }, + "removeFromFavorites": { + "message": "Quitar de favoritos" + }, + "addToFavorites": { + "message": "Agregar a favoritos" + }, + "showingRange": { + "message": "Mostrando $START$-$END$ de $TOTAL$", + "placeholders": { + "start": { + "content": "$1" + }, + "end": { + "content": "$2" + }, + "total": { + "content": "$3" + } + } + }, + "perPage": { + "message": "$COUNT$ / página", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "firstPage": { + "message": "Primera página" + }, + "previousPage": { + "message": "Página anterior" + }, + "nextPage": { + "message": "Página siguiente" + }, + "lastPage": { + "message": "Última página" + }, + "scanToCopyAlias": { + "message": "Escanear para copiar alias" + }, + "general": { + "message": "General" + }, + "accounts": { + "message": "Cuentas" + }, + "changelog": { + "message": "Registro de cambios" + }, + "appearanceDisplay": { + "message": "Apariencia y visualización" + }, + "theme": { + "message": "Tema" + }, + "themeLight": { + "message": "Claro" + }, + "themeDark": { + "message": "Oscuro" + }, + "themeAuto": { + "message": "Sistema (Auto)" + }, + "badgeCounter": { + "message": "Contador de insignia" + }, + "badgeNone": { + "message": "Ninguno (oculto)" + }, + "badgeTotal": { + "message": "Total en el historial" + }, + "badgeAllTime": { + "message": "Total generado (todo el tiempo)" + }, + "badgeToday": { + "message": "Creado hoy" + }, + "badgeWeek": { + "message": "Esta semana" + }, + "copyNotifications": { + "message": "Notificaciones de copia" + }, + "aliasGeneration": { + "message": "Generación de alias" + }, + "randomAliasFormat": { + "message": "Formato de alias aleatorio" + }, + "autoSaveLimit": { + "message": "Límite de guardado automático" + }, + "aliasesLimit": { + "message": "$COUNT$ alias", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "customPresets": { + "message": "Preajustes personalizados" + }, + "label": { + "message": "Etiqueta" + }, + "tag": { + "message": "Etiqueta" + }, + "addPreset": { + "message": "+ Agregar preajuste" + }, + "dataManagement": { + "message": "Gestión de datos" + }, + "export": { + "message": "Exportar" + }, + "import": { + "message": "Importar" + }, + "clear": { + "message": "Borrar" + }, + "resetSettings": { + "message": "Restablecer toda la configuración a los valores predeterminados" + }, + "resetSettingsTitle": { + "message": "¿Restablecer configuración?" + }, + "resetSettingsMessage": { + "message": "Esto restaurará cada ajuste a su valor predeterminado." + }, + "reset": { + "message": "Restablecer" + }, + "clearHistoryTitle": { + "message": "¿Borrar alias recientes?" + }, + "clearHistoryMessage": { + "message": "Esto elimina todos los alias de la lista de historial reciente." + }, + "emailAccounts": { + "message": "Cuentas de correo" + }, + "manageAccountsDescription": { + "message": "Administra tus cuentas de Gmail. Cada cuenta tiene su propio historial, estadísticas y favoritos." + }, + "noAccountsFound": { + "message": "No se encontraron cuentas. Agrega una cuenta desde la pantalla principal." + }, + "emailAddress": { + "message": "Dirección de correo" + }, + "accountLabel": { + "message": "Etiqueta de cuenta" + }, + "emailAddressPlaceholder": { + "message": "tu.email@gmail.com" + }, + "emailChangeWarning": { + "message": "Cambiar el correo migrará todos los datos a la nueva dirección de correo" + }, + "saveChanges": { + "message": "Guardar cambios" + }, + "active": { + "message": "Activa" + }, + "editAccount": { + "message": "Editar cuenta" + }, + "cannotDeleteLastAccountTitle": { + "message": "No se puede eliminar la última cuenta" + }, + "deleteThisAccount": { + "message": "Eliminar esta cuenta" + }, + "deleteAccountTitle": { + "message": "¿Eliminar cuenta?" + }, + "deleteAccountMessage": { + "message": "¿Eliminar \"$LABEL$\" ($EMAIL$)?\n\nEsto eliminará permanentemente:\n- Todo el historial de esta cuenta\n- Todas las estadísticas\n- Todos los favoritos\n\nEsta acción no se puede deshacer.", + "placeholders": { + "label": { + "content": "$1" + }, + "email": { + "content": "$2" + } + } + }, + "delete": { + "message": "Eliminar" + }, + "changeAccountEmailTitle": { + "message": "¿Cambiar correo de la cuenta?" + }, + "changeAccountEmailMessage": { + "message": "¿Cambiar correo de\n$OLD_EMAIL$\na\n$NEW_EMAIL$?\n\nEsto hará lo siguiente:\n- Migrar todo el historial, las estadísticas y los favoritos al nuevo correo\n- Actualizar el correo de la cuenta\n- Eliminar los datos asociados con el correo anterior\n\n¿Continuar?", + "placeholders": { + "old_email": { + "content": "$1" + }, + "new_email": { + "content": "$2" + } + } + }, + "changeEmail": { + "message": "Cambiar correo" + }, + "menuForThisWebsite": { + "message": "Para este sitio web" + }, + "menuLoading": { + "message": "Cargando..." + }, + "menuRandomEmailAlias": { + "message": "Alias de correo aleatorio" + }, + "menuCustomTags": { + "message": "Etiquetas personalizadas" + }, + "menuNoPresets": { + "message": "Sin preajustes - agrégalos en Configuración" + }, + "menuGmailTricks": { + "message": "Trucos de Gmail" + }, + "menuDotVariation": { + "message": "Variación con puntos" + }, + "menuGooglemailDomain": { + "message": "Dominio Googlemail" + }, + "menuRemoveAllDots": { + "message": "Quitar todos los puntos" + }, + "toastPresetAdded": { + "message": "Preajuste agregado" + }, + "toastPresetRemoved": { + "message": "Preajuste eliminado" + }, + "toastSettingsExported": { + "message": "Configuración exportada" + }, + "toastSettingsImported": { + "message": "Configuración importada" + }, + "toastImportFailed": { + "message": "Error al importar - archivo no válido" + }, + "toastSettingsReset": { + "message": "Configuración restablecida a valores predeterminados" + }, + "toastAccountSwitched": { + "message": "Cuenta cambiada" + }, + "toastAccountDeleted": { + "message": "Cuenta eliminada" + }, + "toastAccountUpdated": { + "message": "Cuenta actualizada" + }, + "toastAccountAdded": { + "message": "$LABEL$ agregada", + "placeholders": { + "label": { + "content": "$1" + } + } + }, + "errorLabelRequired": { + "message": "La etiqueta no puede estar vacía" + }, + "errorInvalidEmail": { + "message": "Introduce una dirección de correo válida" + }, + "errorDuplicateEmail": { + "message": "Esta dirección de correo ya la usa otra cuenta" + }, + "errorEnterEmail": { + "message": "Introduce una dirección de correo" + }, + "errorAccountExists": { + "message": "Esta cuenta ya existe" + }, + "toastQrFailed": { + "message": "No se pudo generar el código QR" + }, + "toastExportedAliases": { + "message": "Se exportaron $COUNT$ alias", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastDeletedAliases": { + "message": "Se eliminaron $COUNT$ alias", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastHistoryCleared": { + "message": "Historial borrado" + }, + "toastFavoriteAdded": { + "message": "Agregado a favoritos" + }, + "toastFavoriteRemoved": { + "message": "Eliminado de favoritos" + }, + "toastCopiedEmail": { + "message": "Se copió $EMAIL$", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "toastCopyFailed": { + "message": "No se pudo copiar" + }, + "welcomeTitle": { + "message": "Bienvenido a Gmail Alias Toolkit" + }, + "welcomeSubtitle": { + "message": "Genera alias de correo ilimitados para privacidad y organización" + }, + "letsGetStarted": { + "message": "Empecemos" + }, + "enterGmailAddress": { + "message": "Introduce tu dirección de Gmail" + }, + "pressTabForGmail": { + "message": "Pulsa $KEY$ para @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "settingUp": { + "message": "Configurando..." + }, + "getStarted": { + "message": "Comenzar" + }, + "advancedSetup": { + "message": "Configuración avanzada en Ajustes" + }, + "whatYouCanDo": { + "message": "Qué puedes hacer:" + }, + "featurePrivateEmail": { + "message": "Generador de correo privado" + }, + "featureCustomTags": { + "message": "Etiquetas y preajustes personalizados" + }, + "featureGmailTricks": { + "message": "Trucos avanzados de Gmail" + }, + "welcomeFooter": { + "message": "Todos los datos se almacenan localmente. Sin seguimiento, sin servidor." + }, + "favoritesSaved": { + "message": "$COUNT$ guardados", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "clickStarHint": { + "message": "Haz clic en la estrella de cualquier alias del historial para agregarlo aquí" + }, + "viewStatistics": { + "message": "Ver estadísticas" + }, + "statistics": { + "message": "Estadísticas" + }, + "metricsTab": { + "message": "Métricas" + }, + "timelineTab": { + "message": "Cronología" + }, + "tagsTab": { + "message": "Etiquetas" + }, + "totalGenerated": { + "message": "Total generado" + }, + "createdToday": { + "message": "Creado hoy" + }, + "thisWeek": { + "message": "Esta semana" + }, + "thisMonth": { + "message": "Este mes" + }, + "topTag": { + "message": "Etiqueta principal" + }, + "totalTags": { + "message": "Total de etiquetas" + }, + "noTagsYet": { + "message": "Aún no hay etiquetas" + }, + "disableInlineForSite": { + "message": "Desactivar el asistente integrado en este sitio" + }, + "inlineDisabledSites": { + "message": "Sitios con el asistente integrado desactivado" + }, + "inlineDisabledSitesDescription": { + "message": "El icono y la ventana rápida se ocultan en estos sitios web." + }, + "noDisabledSites": { + "message": "No hay sitios desactivados" + }, + "enableInlineForSite": { + "message": "Activar" + }, + "reportReview": { + "message": "Informar / Valorar" + }, + "percentLabel": { + "message": "$PERCENT$%", + "placeholders": { + "percent": { + "content": "$1" + } + } + }, + "enable": { + "message": "Habilitar" + }, + "retry": { + "message": "Reintentar" + }, + "storageError": { + "message": "No se pudo cargar el historial. Verifique el acceso al almacenamiento." + } } diff --git a/public/_locales/fr/messages.json b/public/_locales/fr/messages.json index 7e9ea895..c1ecb7ac 100644 --- a/public/_locales/fr/messages.json +++ b/public/_locales/fr/messages.json @@ -1,774 +1,774 @@ { - "extensionName": { - "message": "Gmail Alias Toolkit" - }, - "extensionDescription": { - "message": "Générez et gérez des alias Gmail avec des adresses +tag et des préréglages" - }, - "headerSubtitle": { - "message": "Générez des alias avec des adresses +tag" - }, - "settings": { - "message": "Paramètres" - }, - "back": { - "message": "Retour" - }, - "close": { - "message": "Fermer" - }, - "cancel": { - "message": "Annuler" - }, - "copy": { - "message": "Copier" - }, - "copyAll": { - "message": "Tout copier" - }, - "copyToClipboard": { - "message": "Copier dans le presse-papiers" - }, - "activeGmailAddress": { - "message": "Adresse Gmail active" - }, - "addNewAccount": { - "message": "Ajouter un nouveau compte" - }, - "addAccount": { - "message": "Ajouter un compte" - }, - "addNewAccountTitle": { - "message": "Ajouter un nouveau compte" - }, - "emailPlaceholder": { - "message": "votre.email" - }, - "accountLabelPlaceholder": { - "message": "Libellé (facultatif, ex. Travail, Personnel)" - }, - "pressTabToAddGmail": { - "message": "Appuyez sur $KEY$ pour ajouter @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "gmailWarning": { - "message": "Cela ne ressemble pas à une adresse Gmail. L’adressage plus fonctionne mieux avec Gmail." - }, - "random": { - "message": "Aléatoire" - }, - "customTags": { - "message": "Tags personnalisés" - }, - "gmailTricks": { - "message": "Astuces Gmail" - }, - "tabTagsShort": { - "message": "Tags" - }, - "tabTricksShort": { - "message": "Astuces" - }, - "generating": { - "message": "Génération" - }, - "copied": { - "message": "Copié" - }, - "switchToLightMode": { - "message": "Passer au mode clair" - }, - "switchToDarkMode": { - "message": "Passer au mode sombre" - }, - "aliasColumn": { - "message": "Alias" - }, - "copyEmailTooltip": { - "message": "$EMAIL$ - cliquez pour copier", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "pageLabel": { - "message": "Page $PAGE$", - "placeholders": { - "page": { - "content": "$1" - } - } - }, - "dotTrick": { - "message": "Astuce des points" - }, - "plusTags": { - "message": "Tags Plus (+)" - }, - "googlemail": { - "message": "Googlemail" - }, - "removeDots": { - "message": "Supprimer les points" - }, - "dotPlus": { - "message": "Point + Plus" - }, - "allCombos": { - "message": "Toutes les combinaisons" - }, - "numberOfVariations": { - "message": "Nombre de variantes" - }, - "randomizeDotPositions": { - "message": "Positionner les points au hasard" - }, - "sequential": { - "message": "Séquentiel" - }, - "generateTricks": { - "message": "Générer des astuces" - }, - "generatedVariations": { - "message": "Variantes générées" - }, - "gmailTrickInfoLabel": { - "message": "Astuce Gmail :" - }, - "gmailTrickInfo": { - "message": "Les points sont ignorés et tout ce qui suit + arrive dans la même boîte de réception" - }, - "format": { - "message": "Format" - }, - "privateMailFormat": { - "message": "E-mail privé (private-mail-xxxx)" - }, - "randomCharactersFormat": { - "message": "Caractères aléatoires (abc123xy)" - }, - "randomWordsFormat": { - "message": "Mots aléatoires (happy-fox-42)" - }, - "timestampFormat": { - "message": "Horodatage (1234567890)" - }, - "numberOfAliases": { - "message": "Nombre d’alias" - }, - "generateRandomAliases": { - "message": "Générer $COUNT$ alias aléatoire$PLURAL$", - "placeholders": { - "count": { - "content": "$1" - }, - "plural": { - "content": "$2" - } - } - }, - "generatedAliases": { - "message": "Alias générés" - }, - "totalCount": { - "message": "$COUNT$ au total", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "copiedAliases": { - "message": "$COUNT$ alias copiés !", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "failedToCopy": { - "message": "Échec de la copie" - }, - "formatPrivateMail": { - "message": "Format : private-mail-xxxx" - }, - "formatAlphanumeric": { - "message": "8 caractères aléatoires" - }, - "formatWords": { - "message": "2 mots aléatoires" - }, - "formatTimestamp": { - "message": "Horodatage Unix" - }, - "tagPlaceholder": { - "message": "Saisir un tag (ex. shopping, work)" - }, - "generate": { - "message": "Générer" - }, - "yourPresets": { - "message": "Vos préréglages" - }, - "example": { - "message": "Exemple :" - }, - "copyExample": { - "message": "Copier l’exemple" - }, - "recentAliases": { - "message": "Alias récents" - }, - "favorites": { - "message": "Favoris" - }, - "exportAsCsv": { - "message": "Exporter en CSV" - }, - "exportAsJson": { - "message": "Exporter en JSON" - }, - "selectAliases": { - "message": "Sélectionner des alias" - }, - "select": { - "message": "Sélectionner" - }, - "starredCount": { - "message": "$COUNT$ étoilés", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deselectAll": { - "message": "Tout désélectionner" - }, - "selectAll": { - "message": "Tout sélectionner" - }, - "selectedCount": { - "message": "$COUNT$ sélectionnés", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deleteCount": { - "message": "Supprimer $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "allCount": { - "message": "Tous ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "favoritesCount": { - "message": "Favoris ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "searchAliases": { - "message": "Rechercher des alias..." - }, - "allTags": { - "message": "Tous les tags" - }, - "mostRecent": { - "message": "Plus récents" - }, - "az": { - "message": "A-Z" - }, - "noFavoritesYet": { - "message": "Aucun favori pour le moment" - }, - "starEmailsHint": { - "message": "Ajoutez des e-mails de votre historique aux favoris pour y accéder rapidement ici" - }, - "noResultsFound": { - "message": "Aucun résultat trouvé" - }, - "differentSearchHint": { - "message": "Essayez une autre recherche ou un autre filtre" - }, - "showQrCode": { - "message": "Afficher le code QR" - }, - "removeFromFavorites": { - "message": "Retirer des favoris" - }, - "addToFavorites": { - "message": "Ajouter aux favoris" - }, - "showingRange": { - "message": "Affichage de $START$-$END$ sur $TOTAL$", - "placeholders": { - "start": { - "content": "$1" - }, - "end": { - "content": "$2" - }, - "total": { - "content": "$3" - } - } - }, - "perPage": { - "message": "$COUNT$ / page", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "firstPage": { - "message": "Première page" - }, - "previousPage": { - "message": "Page précédente" - }, - "nextPage": { - "message": "Page suivante" - }, - "lastPage": { - "message": "Dernière page" - }, - "scanToCopyAlias": { - "message": "Scanner pour copier l’alias" - }, - "general": { - "message": "Général" - }, - "accounts": { - "message": "Comptes" - }, - "changelog": { - "message": "Journal des modifications" - }, - "appearanceDisplay": { - "message": "Apparence et affichage" - }, - "theme": { - "message": "Thème" - }, - "themeLight": { - "message": "Clair" - }, - "themeDark": { - "message": "Sombre" - }, - "themeAuto": { - "message": "Système (auto)" - }, - "badgeCounter": { - "message": "Compteur de badge" - }, - "badgeNone": { - "message": "Aucun (masqué)" - }, - "badgeTotal": { - "message": "Total dans l’historique" - }, - "badgeAllTime": { - "message": "Total généré (depuis le début)" - }, - "badgeToday": { - "message": "Créés aujourd’hui" - }, - "badgeWeek": { - "message": "Cette semaine" - }, - "copyNotifications": { - "message": "Notifications de copie" - }, - "aliasGeneration": { - "message": "Génération d’alias" - }, - "randomAliasFormat": { - "message": "Format d’alias aléatoire" - }, - "autoSaveLimit": { - "message": "Limite d’enregistrement automatique" - }, - "aliasesLimit": { - "message": "$COUNT$ alias", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "customPresets": { - "message": "Préréglages personnalisés" - }, - "label": { - "message": "Libellé" - }, - "tag": { - "message": "Tag" - }, - "addPreset": { - "message": "+ Ajouter un préréglage" - }, - "dataManagement": { - "message": "Gestion des données" - }, - "export": { - "message": "Exporter" - }, - "import": { - "message": "Importer" - }, - "clear": { - "message": "Effacer" - }, - "resetSettings": { - "message": "Réinitialiser tous les paramètres par défaut" - }, - "resetSettingsTitle": { - "message": "Réinitialiser les paramètres ?" - }, - "resetSettingsMessage": { - "message": "Cela restaurera chaque paramètre à sa valeur par défaut." - }, - "reset": { - "message": "Réinitialiser" - }, - "clearHistoryTitle": { - "message": "Effacer les alias récents ?" - }, - "clearHistoryMessage": { - "message": "Cela supprime tous les alias de la liste d’historique récente." - }, - "emailAccounts": { - "message": "Comptes e-mail" - }, - "manageAccountsDescription": { - "message": "Gérez vos comptes Gmail. Chaque compte possède son propre historique, ses statistiques et ses favoris." - }, - "noAccountsFound": { - "message": "Aucun compte trouvé. Veuillez ajouter un compte depuis l’écran principal." - }, - "emailAddress": { - "message": "Adresse e-mail" - }, - "accountLabel": { - "message": "Libellé du compte" - }, - "emailAddressPlaceholder": { - "message": "votre.email@gmail.com" - }, - "emailChangeWarning": { - "message": "La modification de l’e-mail migrera toutes les données vers la nouvelle adresse e-mail" - }, - "saveChanges": { - "message": "Enregistrer les modifications" - }, - "active": { - "message": "Actif" - }, - "editAccount": { - "message": "Modifier le compte" - }, - "cannotDeleteLastAccountTitle": { - "message": "Impossible de supprimer le dernier compte" - }, - "deleteThisAccount": { - "message": "Supprimer ce compte" - }, - "deleteAccountTitle": { - "message": "Supprimer le compte ?" - }, - "deleteAccountMessage": { - "message": "Supprimer \"$LABEL$\" ($EMAIL$) ?\n\nCela supprimera définitivement :\n- Tout l’historique de ce compte\n- Toutes les statistiques\n- Tous les favoris\n\nCette action est irréversible.", - "placeholders": { - "label": { - "content": "$1" - }, - "email": { - "content": "$2" - } - } - }, - "delete": { - "message": "Supprimer" - }, - "changeAccountEmailTitle": { - "message": "Modifier l’e-mail du compte ?" - }, - "changeAccountEmailMessage": { - "message": "Changer l’e-mail de\n$OLD_EMAIL$\nvers\n$NEW_EMAIL$ ?\n\nCela va :\n- Migrer tout l’historique, les statistiques et les favoris vers le nouvel e-mail\n- Mettre à jour l’e-mail du compte\n- Supprimer les données associées à l’ancien e-mail\n\nContinuer ?", - "placeholders": { - "old_email": { - "content": "$1" - }, - "new_email": { - "content": "$2" - } - } - }, - "changeEmail": { - "message": "Changer l’e-mail" - }, - "menuForThisWebsite": { - "message": "Pour ce site" - }, - "menuLoading": { - "message": "Chargement..." - }, - "menuRandomEmailAlias": { - "message": "Alias e-mail aléatoire" - }, - "menuCustomTags": { - "message": "Tags personnalisés" - }, - "menuNoPresets": { - "message": "Aucun préréglage - ajoutez-en dans Paramètres" - }, - "menuGmailTricks": { - "message": "Astuces Gmail" - }, - "menuDotVariation": { - "message": "Variante avec points" - }, - "menuGooglemailDomain": { - "message": "Domaine Googlemail" - }, - "menuRemoveAllDots": { - "message": "Supprimer tous les points" - }, - "toastPresetAdded": { - "message": "Préréglage ajouté" - }, - "toastPresetRemoved": { - "message": "Préréglage supprimé" - }, - "toastSettingsExported": { - "message": "Paramètres exportés" - }, - "toastSettingsImported": { - "message": "Paramètres importés" - }, - "toastImportFailed": { - "message": "Échec de l’importation - fichier invalide" - }, - "toastSettingsReset": { - "message": "Paramètres réinitialisés par défaut" - }, - "toastAccountSwitched": { - "message": "Compte changé" - }, - "toastAccountDeleted": { - "message": "Compte supprimé" - }, - "toastAccountUpdated": { - "message": "Compte mis à jour" - }, - "toastAccountAdded": { - "message": "$LABEL$ ajouté", - "placeholders": { - "label": { - "content": "$1" - } - } - }, - "errorLabelRequired": { - "message": "Le libellé ne peut pas être vide" - }, - "errorInvalidEmail": { - "message": "Veuillez saisir une adresse e-mail valide" - }, - "errorDuplicateEmail": { - "message": "Cette adresse e-mail est déjà utilisée par un autre compte" - }, - "errorEnterEmail": { - "message": "Veuillez saisir une adresse e-mail" - }, - "errorAccountExists": { - "message": "Ce compte existe déjà" - }, - "toastQrFailed": { - "message": "Échec de la génération du code QR" - }, - "toastExportedAliases": { - "message": "$COUNT$ alias exportés", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastDeletedAliases": { - "message": "$COUNT$ alias supprimés", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastHistoryCleared": { - "message": "Historique effacé" - }, - "toastFavoriteAdded": { - "message": "Ajouté aux favoris" - }, - "toastFavoriteRemoved": { - "message": "Retiré des favoris" - }, - "toastCopiedEmail": { - "message": "$EMAIL$ copié", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "toastCopyFailed": { - "message": "Échec de la copie" - }, - "welcomeTitle": { - "message": "Bienvenue dans Gmail Alias Toolkit" - }, - "welcomeSubtitle": { - "message": "Générez un nombre illimité d’alias e-mail pour la confidentialité et l’organisation" - }, - "letsGetStarted": { - "message": "Commençons" - }, - "enterGmailAddress": { - "message": "Saisissez votre adresse Gmail" - }, - "pressTabForGmail": { - "message": "Appuyez sur $KEY$ pour @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "settingUp": { - "message": "Configuration..." - }, - "getStarted": { - "message": "Commencer" - }, - "advancedSetup": { - "message": "Configuration avancée dans les paramètres" - }, - "whatYouCanDo": { - "message": "Ce que vous pouvez faire :" - }, - "featurePrivateEmail": { - "message": "Générateur d’e-mails privés" - }, - "featureCustomTags": { - "message": "Tags et préréglages personnalisés" - }, - "featureGmailTricks": { - "message": "Astuces avancées Gmail" - }, - "welcomeFooter": { - "message": "Toutes les données sont stockées localement. Aucun suivi, aucun serveur." - }, - "favoritesSaved": { - "message": "$COUNT$ enregistrés", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "clickStarHint": { - "message": "Cliquez sur l’étoile d’un alias dans l’historique pour l’ajouter ici" - }, - "viewStatistics": { - "message": "Voir les statistiques" - }, - "statistics": { - "message": "Statistiques" - }, - "metricsTab": { - "message": "Métriques" - }, - "timelineTab": { - "message": "Chronologie" - }, - "tagsTab": { - "message": "Tags" - }, - "totalGenerated": { - "message": "Total généré" - }, - "createdToday": { - "message": "Créés aujourd’hui" - }, - "thisWeek": { - "message": "Cette semaine" - }, - "thisMonth": { - "message": "Ce mois-ci" - }, - "topTag": { - "message": "Top tag" - }, - "totalTags": { - "message": "Total des tags" - }, - "noTagsYet": { - "message": "Aucun tag pour le moment" - }, - "disableInlineForSite": { - "message": "Désactiver l’assistant intégré sur ce site" - }, - "inlineDisabledSites": { - "message": "Sites avec l’assistant intégré désactivé" - }, - "inlineDisabledSitesDescription": { - "message": "L’icône et la fenêtre rapide sont masquées sur ces sites." - }, - "noDisabledSites": { - "message": "Aucun site désactivé" - }, - "enableInlineForSite": { - "message": "Activer" - }, - "reportReview": { - "message": "Signaler / Évaluer" - }, - "percentLabel": { - "message": "$PERCENT$%", - "placeholders": { - "percent": { - "content": "$1" - } - } - }, - "retry": { - "message": "Réessayer" - }, - "enable": { - "message": "Activer" - }, - "storageError": { - "message": "Impossible de charger l\u0027historique. Vérifiez l\u0027accès au stockage." - } + "extensionName": { + "message": "Gmail Alias Toolkit" + }, + "extensionDescription": { + "message": "Générez et gérez des alias Gmail avec des adresses +tag et des préréglages" + }, + "headerSubtitle": { + "message": "Générez des alias avec des adresses +tag" + }, + "settings": { + "message": "Paramètres" + }, + "back": { + "message": "Retour" + }, + "close": { + "message": "Fermer" + }, + "cancel": { + "message": "Annuler" + }, + "copy": { + "message": "Copier" + }, + "copyAll": { + "message": "Tout copier" + }, + "copyToClipboard": { + "message": "Copier dans le presse-papiers" + }, + "activeGmailAddress": { + "message": "Adresse Gmail active" + }, + "addNewAccount": { + "message": "Ajouter un nouveau compte" + }, + "addAccount": { + "message": "Ajouter un compte" + }, + "addNewAccountTitle": { + "message": "Ajouter un nouveau compte" + }, + "emailPlaceholder": { + "message": "votre.email" + }, + "accountLabelPlaceholder": { + "message": "Libellé (facultatif, ex. Travail, Personnel)" + }, + "pressTabToAddGmail": { + "message": "Appuyez sur $KEY$ pour ajouter @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "gmailWarning": { + "message": "Cela ne ressemble pas à une adresse Gmail. L’adressage plus fonctionne mieux avec Gmail." + }, + "random": { + "message": "Aléatoire" + }, + "customTags": { + "message": "Tags personnalisés" + }, + "gmailTricks": { + "message": "Astuces Gmail" + }, + "tabTagsShort": { + "message": "Tags" + }, + "tabTricksShort": { + "message": "Astuces" + }, + "generating": { + "message": "Génération" + }, + "copied": { + "message": "Copié" + }, + "switchToLightMode": { + "message": "Passer au mode clair" + }, + "switchToDarkMode": { + "message": "Passer au mode sombre" + }, + "aliasColumn": { + "message": "Alias" + }, + "copyEmailTooltip": { + "message": "$EMAIL$ - cliquez pour copier", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "pageLabel": { + "message": "Page $PAGE$", + "placeholders": { + "page": { + "content": "$1" + } + } + }, + "dotTrick": { + "message": "Astuce des points" + }, + "plusTags": { + "message": "Tags Plus (+)" + }, + "googlemail": { + "message": "Googlemail" + }, + "removeDots": { + "message": "Supprimer les points" + }, + "dotPlus": { + "message": "Point + Plus" + }, + "allCombos": { + "message": "Toutes les combinaisons" + }, + "numberOfVariations": { + "message": "Nombre de variantes" + }, + "randomizeDotPositions": { + "message": "Positionner les points au hasard" + }, + "sequential": { + "message": "Séquentiel" + }, + "generateTricks": { + "message": "Générer des astuces" + }, + "generatedVariations": { + "message": "Variantes générées" + }, + "gmailTrickInfoLabel": { + "message": "Astuce Gmail :" + }, + "gmailTrickInfo": { + "message": "Les points sont ignorés et tout ce qui suit + arrive dans la même boîte de réception" + }, + "format": { + "message": "Format" + }, + "privateMailFormat": { + "message": "E-mail privé (private-mail-xxxx)" + }, + "randomCharactersFormat": { + "message": "Caractères aléatoires (abc123xy)" + }, + "randomWordsFormat": { + "message": "Mots aléatoires (happy-fox-42)" + }, + "timestampFormat": { + "message": "Horodatage (1234567890)" + }, + "numberOfAliases": { + "message": "Nombre d’alias" + }, + "generateRandomAliases": { + "message": "Générer $COUNT$ alias aléatoire$PLURAL$", + "placeholders": { + "count": { + "content": "$1" + }, + "plural": { + "content": "$2" + } + } + }, + "generatedAliases": { + "message": "Alias générés" + }, + "totalCount": { + "message": "$COUNT$ au total", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "copiedAliases": { + "message": "$COUNT$ alias copiés !", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "failedToCopy": { + "message": "Échec de la copie" + }, + "formatPrivateMail": { + "message": "Format : private-mail-xxxx" + }, + "formatAlphanumeric": { + "message": "8 caractères aléatoires" + }, + "formatWords": { + "message": "2 mots aléatoires" + }, + "formatTimestamp": { + "message": "Horodatage Unix" + }, + "tagPlaceholder": { + "message": "Saisir un tag (ex. shopping, work)" + }, + "generate": { + "message": "Générer" + }, + "yourPresets": { + "message": "Vos préréglages" + }, + "example": { + "message": "Exemple :" + }, + "copyExample": { + "message": "Copier l’exemple" + }, + "recentAliases": { + "message": "Alias récents" + }, + "favorites": { + "message": "Favoris" + }, + "exportAsCsv": { + "message": "Exporter en CSV" + }, + "exportAsJson": { + "message": "Exporter en JSON" + }, + "selectAliases": { + "message": "Sélectionner des alias" + }, + "select": { + "message": "Sélectionner" + }, + "starredCount": { + "message": "$COUNT$ étoilés", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deselectAll": { + "message": "Tout désélectionner" + }, + "selectAll": { + "message": "Tout sélectionner" + }, + "selectedCount": { + "message": "$COUNT$ sélectionnés", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deleteCount": { + "message": "Supprimer $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "allCount": { + "message": "Tous ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "favoritesCount": { + "message": "Favoris ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "searchAliases": { + "message": "Rechercher des alias..." + }, + "allTags": { + "message": "Tous les tags" + }, + "mostRecent": { + "message": "Plus récents" + }, + "az": { + "message": "A-Z" + }, + "noFavoritesYet": { + "message": "Aucun favori pour le moment" + }, + "starEmailsHint": { + "message": "Ajoutez des e-mails de votre historique aux favoris pour y accéder rapidement ici" + }, + "noResultsFound": { + "message": "Aucun résultat trouvé" + }, + "differentSearchHint": { + "message": "Essayez une autre recherche ou un autre filtre" + }, + "showQrCode": { + "message": "Afficher le code QR" + }, + "removeFromFavorites": { + "message": "Retirer des favoris" + }, + "addToFavorites": { + "message": "Ajouter aux favoris" + }, + "showingRange": { + "message": "Affichage de $START$-$END$ sur $TOTAL$", + "placeholders": { + "start": { + "content": "$1" + }, + "end": { + "content": "$2" + }, + "total": { + "content": "$3" + } + } + }, + "perPage": { + "message": "$COUNT$ / page", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "firstPage": { + "message": "Première page" + }, + "previousPage": { + "message": "Page précédente" + }, + "nextPage": { + "message": "Page suivante" + }, + "lastPage": { + "message": "Dernière page" + }, + "scanToCopyAlias": { + "message": "Scanner pour copier l’alias" + }, + "general": { + "message": "Général" + }, + "accounts": { + "message": "Comptes" + }, + "changelog": { + "message": "Journal des modifications" + }, + "appearanceDisplay": { + "message": "Apparence et affichage" + }, + "theme": { + "message": "Thème" + }, + "themeLight": { + "message": "Clair" + }, + "themeDark": { + "message": "Sombre" + }, + "themeAuto": { + "message": "Système (auto)" + }, + "badgeCounter": { + "message": "Compteur de badge" + }, + "badgeNone": { + "message": "Aucun (masqué)" + }, + "badgeTotal": { + "message": "Total dans l’historique" + }, + "badgeAllTime": { + "message": "Total généré (depuis le début)" + }, + "badgeToday": { + "message": "Créés aujourd’hui" + }, + "badgeWeek": { + "message": "Cette semaine" + }, + "copyNotifications": { + "message": "Notifications de copie" + }, + "aliasGeneration": { + "message": "Génération d’alias" + }, + "randomAliasFormat": { + "message": "Format d’alias aléatoire" + }, + "autoSaveLimit": { + "message": "Limite d’enregistrement automatique" + }, + "aliasesLimit": { + "message": "$COUNT$ alias", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "customPresets": { + "message": "Préréglages personnalisés" + }, + "label": { + "message": "Libellé" + }, + "tag": { + "message": "Tag" + }, + "addPreset": { + "message": "+ Ajouter un préréglage" + }, + "dataManagement": { + "message": "Gestion des données" + }, + "export": { + "message": "Exporter" + }, + "import": { + "message": "Importer" + }, + "clear": { + "message": "Effacer" + }, + "resetSettings": { + "message": "Réinitialiser tous les paramètres par défaut" + }, + "resetSettingsTitle": { + "message": "Réinitialiser les paramètres ?" + }, + "resetSettingsMessage": { + "message": "Cela restaurera chaque paramètre à sa valeur par défaut." + }, + "reset": { + "message": "Réinitialiser" + }, + "clearHistoryTitle": { + "message": "Effacer les alias récents ?" + }, + "clearHistoryMessage": { + "message": "Cela supprime tous les alias de la liste d’historique récente." + }, + "emailAccounts": { + "message": "Comptes e-mail" + }, + "manageAccountsDescription": { + "message": "Gérez vos comptes Gmail. Chaque compte possède son propre historique, ses statistiques et ses favoris." + }, + "noAccountsFound": { + "message": "Aucun compte trouvé. Veuillez ajouter un compte depuis l’écran principal." + }, + "emailAddress": { + "message": "Adresse e-mail" + }, + "accountLabel": { + "message": "Libellé du compte" + }, + "emailAddressPlaceholder": { + "message": "votre.email@gmail.com" + }, + "emailChangeWarning": { + "message": "La modification de l’e-mail migrera toutes les données vers la nouvelle adresse e-mail" + }, + "saveChanges": { + "message": "Enregistrer les modifications" + }, + "active": { + "message": "Actif" + }, + "editAccount": { + "message": "Modifier le compte" + }, + "cannotDeleteLastAccountTitle": { + "message": "Impossible de supprimer le dernier compte" + }, + "deleteThisAccount": { + "message": "Supprimer ce compte" + }, + "deleteAccountTitle": { + "message": "Supprimer le compte ?" + }, + "deleteAccountMessage": { + "message": "Supprimer \"$LABEL$\" ($EMAIL$) ?\n\nCela supprimera définitivement :\n- Tout l’historique de ce compte\n- Toutes les statistiques\n- Tous les favoris\n\nCette action est irréversible.", + "placeholders": { + "label": { + "content": "$1" + }, + "email": { + "content": "$2" + } + } + }, + "delete": { + "message": "Supprimer" + }, + "changeAccountEmailTitle": { + "message": "Modifier l’e-mail du compte ?" + }, + "changeAccountEmailMessage": { + "message": "Changer l’e-mail de\n$OLD_EMAIL$\nvers\n$NEW_EMAIL$ ?\n\nCela va :\n- Migrer tout l’historique, les statistiques et les favoris vers le nouvel e-mail\n- Mettre à jour l’e-mail du compte\n- Supprimer les données associées à l’ancien e-mail\n\nContinuer ?", + "placeholders": { + "old_email": { + "content": "$1" + }, + "new_email": { + "content": "$2" + } + } + }, + "changeEmail": { + "message": "Changer l’e-mail" + }, + "menuForThisWebsite": { + "message": "Pour ce site" + }, + "menuLoading": { + "message": "Chargement..." + }, + "menuRandomEmailAlias": { + "message": "Alias e-mail aléatoire" + }, + "menuCustomTags": { + "message": "Tags personnalisés" + }, + "menuNoPresets": { + "message": "Aucun préréglage - ajoutez-en dans Paramètres" + }, + "menuGmailTricks": { + "message": "Astuces Gmail" + }, + "menuDotVariation": { + "message": "Variante avec points" + }, + "menuGooglemailDomain": { + "message": "Domaine Googlemail" + }, + "menuRemoveAllDots": { + "message": "Supprimer tous les points" + }, + "toastPresetAdded": { + "message": "Préréglage ajouté" + }, + "toastPresetRemoved": { + "message": "Préréglage supprimé" + }, + "toastSettingsExported": { + "message": "Paramètres exportés" + }, + "toastSettingsImported": { + "message": "Paramètres importés" + }, + "toastImportFailed": { + "message": "Échec de l’importation - fichier invalide" + }, + "toastSettingsReset": { + "message": "Paramètres réinitialisés par défaut" + }, + "toastAccountSwitched": { + "message": "Compte changé" + }, + "toastAccountDeleted": { + "message": "Compte supprimé" + }, + "toastAccountUpdated": { + "message": "Compte mis à jour" + }, + "toastAccountAdded": { + "message": "$LABEL$ ajouté", + "placeholders": { + "label": { + "content": "$1" + } + } + }, + "errorLabelRequired": { + "message": "Le libellé ne peut pas être vide" + }, + "errorInvalidEmail": { + "message": "Veuillez saisir une adresse e-mail valide" + }, + "errorDuplicateEmail": { + "message": "Cette adresse e-mail est déjà utilisée par un autre compte" + }, + "errorEnterEmail": { + "message": "Veuillez saisir une adresse e-mail" + }, + "errorAccountExists": { + "message": "Ce compte existe déjà" + }, + "toastQrFailed": { + "message": "Échec de la génération du code QR" + }, + "toastExportedAliases": { + "message": "$COUNT$ alias exportés", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastDeletedAliases": { + "message": "$COUNT$ alias supprimés", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastHistoryCleared": { + "message": "Historique effacé" + }, + "toastFavoriteAdded": { + "message": "Ajouté aux favoris" + }, + "toastFavoriteRemoved": { + "message": "Retiré des favoris" + }, + "toastCopiedEmail": { + "message": "$EMAIL$ copié", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "toastCopyFailed": { + "message": "Échec de la copie" + }, + "welcomeTitle": { + "message": "Bienvenue dans Gmail Alias Toolkit" + }, + "welcomeSubtitle": { + "message": "Générez un nombre illimité d’alias e-mail pour la confidentialité et l’organisation" + }, + "letsGetStarted": { + "message": "Commençons" + }, + "enterGmailAddress": { + "message": "Saisissez votre adresse Gmail" + }, + "pressTabForGmail": { + "message": "Appuyez sur $KEY$ pour @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "settingUp": { + "message": "Configuration..." + }, + "getStarted": { + "message": "Commencer" + }, + "advancedSetup": { + "message": "Configuration avancée dans les paramètres" + }, + "whatYouCanDo": { + "message": "Ce que vous pouvez faire :" + }, + "featurePrivateEmail": { + "message": "Générateur d’e-mails privés" + }, + "featureCustomTags": { + "message": "Tags et préréglages personnalisés" + }, + "featureGmailTricks": { + "message": "Astuces avancées Gmail" + }, + "welcomeFooter": { + "message": "Toutes les données sont stockées localement. Aucun suivi, aucun serveur." + }, + "favoritesSaved": { + "message": "$COUNT$ enregistrés", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "clickStarHint": { + "message": "Cliquez sur l’étoile d’un alias dans l’historique pour l’ajouter ici" + }, + "viewStatistics": { + "message": "Voir les statistiques" + }, + "statistics": { + "message": "Statistiques" + }, + "metricsTab": { + "message": "Métriques" + }, + "timelineTab": { + "message": "Chronologie" + }, + "tagsTab": { + "message": "Tags" + }, + "totalGenerated": { + "message": "Total généré" + }, + "createdToday": { + "message": "Créés aujourd’hui" + }, + "thisWeek": { + "message": "Cette semaine" + }, + "thisMonth": { + "message": "Ce mois-ci" + }, + "topTag": { + "message": "Top tag" + }, + "totalTags": { + "message": "Total des tags" + }, + "noTagsYet": { + "message": "Aucun tag pour le moment" + }, + "disableInlineForSite": { + "message": "Désactiver l’assistant intégré sur ce site" + }, + "inlineDisabledSites": { + "message": "Sites avec l’assistant intégré désactivé" + }, + "inlineDisabledSitesDescription": { + "message": "L’icône et la fenêtre rapide sont masquées sur ces sites." + }, + "noDisabledSites": { + "message": "Aucun site désactivé" + }, + "enableInlineForSite": { + "message": "Activer" + }, + "reportReview": { + "message": "Signaler / Évaluer" + }, + "percentLabel": { + "message": "$PERCENT$%", + "placeholders": { + "percent": { + "content": "$1" + } + } + }, + "enable": { + "message": "Activer" + }, + "retry": { + "message": "Réessayer" + }, + "storageError": { + "message": "Impossible de charger l'historique. Vérifiez l'accès au stockage." + } } diff --git a/public/_locales/hi/messages.json b/public/_locales/hi/messages.json index e05fd20c..1eb9dc64 100644 --- a/public/_locales/hi/messages.json +++ b/public/_locales/hi/messages.json @@ -1,774 +1,774 @@ { - "extensionName": { - "message": "Gmail Alias Toolkit" - }, - "extensionDescription": { - "message": "+tag पते और प्रीसेट का उपयोग करके Gmail उपनाम बनाएं और प्रबंधित करें" - }, - "headerSubtitle": { - "message": "+tag पतों से उपनाम बनाएं" - }, - "settings": { - "message": "सेटिंग्स" - }, - "back": { - "message": "वापस" - }, - "close": { - "message": "बंद करें" - }, - "cancel": { - "message": "रद्द करें" - }, - "copy": { - "message": "कॉपी करें" - }, - "copyAll": { - "message": "सभी कॉपी करें" - }, - "copyToClipboard": { - "message": "क्लिपबोर्ड पर कॉपी करें" - }, - "activeGmailAddress": { - "message": "सक्रिय Gmail पता" - }, - "addNewAccount": { - "message": "नया खाता जोड़ें" - }, - "addAccount": { - "message": "खाता जोड़ें" - }, - "addNewAccountTitle": { - "message": "नया खाता जोड़ें" - }, - "emailPlaceholder": { - "message": "your.email" - }, - "accountLabelPlaceholder": { - "message": "लेबल (वैकल्पिक, जैसे Work, Personal)" - }, - "pressTabToAddGmail": { - "message": "@gmail.com जोड़ने के लिए $KEY$ दबाएं", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "gmailWarning": { - "message": "यह Gmail पता जैसा नहीं दिखता। प्लस एड्रेसिंग Gmail के साथ सबसे अच्छा काम करती है।" - }, - "random": { - "message": "रैंडम" - }, - "customTags": { - "message": "कस्टम टैग" - }, - "gmailTricks": { - "message": "Gmail ट्रिक्स" - }, - "tabTagsShort": { - "message": "टैग" - }, - "tabTricksShort": { - "message": "ट्रिक्स" - }, - "generating": { - "message": "बन रहा है" - }, - "copied": { - "message": "कॉपी हो गया" - }, - "switchToLightMode": { - "message": "लाइट मोड पर स्विच करें" - }, - "switchToDarkMode": { - "message": "डार्क मोड पर स्विच करें" - }, - "aliasColumn": { - "message": "उपनाम" - }, - "copyEmailTooltip": { - "message": "$EMAIL$ - कॉपी करने के लिए क्लिक करें", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "pageLabel": { - "message": "पृष्ठ $PAGE$", - "placeholders": { - "page": { - "content": "$1" - } - } - }, - "dotTrick": { - "message": "डॉट ट्रिक" - }, - "plusTags": { - "message": "प्लस (+) टैग" - }, - "googlemail": { - "message": "Googlemail" - }, - "removeDots": { - "message": "डॉट हटाएं" - }, - "dotPlus": { - "message": "डॉट + प्लस" - }, - "allCombos": { - "message": "सभी संयोजन" - }, - "numberOfVariations": { - "message": "वैरिएशन की संख्या" - }, - "randomizeDotPositions": { - "message": "डॉट की स्थितियां रैंडम करें" - }, - "sequential": { - "message": "क्रमिक" - }, - "generateTricks": { - "message": "ट्रिक्स बनाएं" - }, - "generatedVariations": { - "message": "बने हुए वैरिएशन" - }, - "gmailTrickInfoLabel": { - "message": "Gmail ट्रिक:" - }, - "gmailTrickInfo": { - "message": "डॉट्स को अनदेखा किया जाता है और + के बाद सब कुछ उसी इनबॉक्स में जाता है" - }, - "format": { - "message": "फ़ॉर्मेट" - }, - "privateMailFormat": { - "message": "प्राइवेट मेल (private-mail-xxxx)" - }, - "randomCharactersFormat": { - "message": "रैंडम अक्षर (abc123xy)" - }, - "randomWordsFormat": { - "message": "रैंडम शब्द (happy-fox-42)" - }, - "timestampFormat": { - "message": "टाइमस्टैम्प (1234567890)" - }, - "numberOfAliases": { - "message": "उपनामों की संख्या" - }, - "generateRandomAliases": { - "message": "$COUNT$ रैंडम उपनाम$PLURAL$ बनाएं", - "placeholders": { - "count": { - "content": "$1" - }, - "plural": { - "content": "$2" - } - } - }, - "generatedAliases": { - "message": "बने हुए उपनाम" - }, - "totalCount": { - "message": "कुल $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "copiedAliases": { - "message": "$COUNT$ उपनाम कॉपी हुए!", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "failedToCopy": { - "message": "कॉपी करने में विफल" - }, - "formatPrivateMail": { - "message": "फ़ॉर्मेट: private-mail-xxxx" - }, - "formatAlphanumeric": { - "message": "8 रैंडम अक्षर" - }, - "formatWords": { - "message": "2 रैंडम शब्द" - }, - "formatTimestamp": { - "message": "Unix टाइमस्टैम्प" - }, - "tagPlaceholder": { - "message": "टैग दर्ज करें (जैसे shopping, work)" - }, - "generate": { - "message": "बनाएं" - }, - "yourPresets": { - "message": "आपके प्रीसेट" - }, - "example": { - "message": "उदाहरण:" - }, - "copyExample": { - "message": "उदाहरण कॉपी करें" - }, - "recentAliases": { - "message": "हाल के उपनाम" - }, - "favorites": { - "message": "पसंदीदा" - }, - "exportAsCsv": { - "message": "CSV के रूप में निर्यात करें" - }, - "exportAsJson": { - "message": "JSON के रूप में निर्यात करें" - }, - "selectAliases": { - "message": "उपनाम चुनें" - }, - "select": { - "message": "चुनें" - }, - "starredCount": { - "message": "$COUNT$ स्टार किए गए", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deselectAll": { - "message": "सभी अचयनित करें" - }, - "selectAll": { - "message": "सभी चुनें" - }, - "selectedCount": { - "message": "$COUNT$ चुने गए", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deleteCount": { - "message": "$COUNT$ हटाएं", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "allCount": { - "message": "सभी ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "favoritesCount": { - "message": "पसंदीदा ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "searchAliases": { - "message": "उपनाम खोजें..." - }, - "allTags": { - "message": "सभी टैग" - }, - "mostRecent": { - "message": "सबसे हाल के" - }, - "az": { - "message": "A-Z" - }, - "noFavoritesYet": { - "message": "अभी कोई पसंदीदा नहीं" - }, - "starEmailsHint": { - "message": "यहां जल्दी पहुंचने के लिए अपने इतिहास के ईमेल को स्टार करें" - }, - "noResultsFound": { - "message": "कोई परिणाम नहीं मिला" - }, - "differentSearchHint": { - "message": "अलग खोज या फ़िल्टर आज़माएं" - }, - "showQrCode": { - "message": "QR कोड दिखाएं" - }, - "removeFromFavorites": { - "message": "पसंदीदा से हटाएं" - }, - "addToFavorites": { - "message": "पसंदीदा में जोड़ें" - }, - "showingRange": { - "message": "$TOTAL$ में से $START$-$END$ दिखा रहे हैं", - "placeholders": { - "start": { - "content": "$1" - }, - "end": { - "content": "$2" - }, - "total": { - "content": "$3" - } - } - }, - "perPage": { - "message": "$COUNT$ / पृष्ठ", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "firstPage": { - "message": "पहला पृष्ठ" - }, - "previousPage": { - "message": "पिछला पृष्ठ" - }, - "nextPage": { - "message": "अगला पृष्ठ" - }, - "lastPage": { - "message": "अंतिम पृष्ठ" - }, - "scanToCopyAlias": { - "message": "उपनाम कॉपी करने के लिए स्कैन करें" - }, - "general": { - "message": "सामान्य" - }, - "accounts": { - "message": "खाते" - }, - "changelog": { - "message": "चेंजलॉग" - }, - "appearanceDisplay": { - "message": "रूप और प्रदर्शन" - }, - "theme": { - "message": "थीम" - }, - "themeLight": { - "message": "लाइट" - }, - "themeDark": { - "message": "डार्क" - }, - "themeAuto": { - "message": "सिस्टम (ऑटो)" - }, - "badgeCounter": { - "message": "बैज काउंटर" - }, - "badgeNone": { - "message": "कोई नहीं (छिपा हुआ)" - }, - "badgeTotal": { - "message": "इतिहास में कुल" - }, - "badgeAllTime": { - "message": "कुल बनाए गए (सभी समय)" - }, - "badgeToday": { - "message": "आज बनाए गए" - }, - "badgeWeek": { - "message": "इस सप्ताह" - }, - "copyNotifications": { - "message": "कॉपी सूचनाएं" - }, - "aliasGeneration": { - "message": "उपनाम बनाना" - }, - "randomAliasFormat": { - "message": "रैंडम उपनाम फ़ॉर्मेट" - }, - "autoSaveLimit": { - "message": "ऑटो-सेव सीमा" - }, - "aliasesLimit": { - "message": "$COUNT$ उपनाम", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "customPresets": { - "message": "कस्टम प्रीसेट" - }, - "label": { - "message": "लेबल" - }, - "tag": { - "message": "टैग" - }, - "addPreset": { - "message": "+ प्रीसेट जोड़ें" - }, - "dataManagement": { - "message": "डेटा प्रबंधन" - }, - "export": { - "message": "निर्यात" - }, - "import": { - "message": "आयात" - }, - "clear": { - "message": "साफ करें" - }, - "resetSettings": { - "message": "सभी सेटिंग्स को डिफ़ॉल्ट पर रीसेट करें" - }, - "resetSettingsTitle": { - "message": "सेटिंग्स रीसेट करें?" - }, - "resetSettingsMessage": { - "message": "यह हर सेटिंग को उसके डिफ़ॉल्ट मान पर वापस लाएगा।" - }, - "reset": { - "message": "रीसेट" - }, - "clearHistoryTitle": { - "message": "हाल के उपनाम साफ करें?" - }, - "clearHistoryMessage": { - "message": "यह हाल की इतिहास सूची से सभी उपनाम हटा देता है।" - }, - "emailAccounts": { - "message": "ईमेल खाते" - }, - "manageAccountsDescription": { - "message": "अपने Gmail खातों को प्रबंधित करें। हर खाते का अपना इतिहास, आंकड़े और पसंदीदा होते हैं।" - }, - "noAccountsFound": { - "message": "कोई खाता नहीं मिला। कृपया मुख्य स्क्रीन से खाता जोड़ें।" - }, - "emailAddress": { - "message": "ईमेल पता" - }, - "accountLabel": { - "message": "खाता लेबल" - }, - "emailAddressPlaceholder": { - "message": "your.email@gmail.com" - }, - "emailChangeWarning": { - "message": "ईमेल बदलने से सभी डेटा नए ईमेल पते पर माइग्रेट हो जाएगा" - }, - "saveChanges": { - "message": "बदलाव सहेजें" - }, - "active": { - "message": "सक्रिय" - }, - "editAccount": { - "message": "खाता संपादित करें" - }, - "cannotDeleteLastAccountTitle": { - "message": "अंतिम खाता हटाया नहीं जा सकता" - }, - "deleteThisAccount": { - "message": "यह खाता हटाएं" - }, - "deleteAccountTitle": { - "message": "खाता हटाएं?" - }, - "deleteAccountMessage": { - "message": "\"$LABEL$\" ($EMAIL$) हटाएं?\n\nयह स्थायी रूप से हटाएगा:\n- इस खाते का पूरा इतिहास\n- सभी आंकड़े\n- सभी पसंदीदा\n\nयह कार्रवाई पूर्ववत नहीं की जा सकती।", - "placeholders": { - "label": { - "content": "$1" - }, - "email": { - "content": "$2" - } - } - }, - "delete": { - "message": "हटाएं" - }, - "changeAccountEmailTitle": { - "message": "खाते का ईमेल बदलें?" - }, - "changeAccountEmailMessage": { - "message": "ईमेल बदलें\n$OLD_EMAIL$\nसे\n$NEW_EMAIL$\nमें?\n\nयह करेगा:\n- पूरा इतिहास, आंकड़े और पसंदीदा नए ईमेल पर माइग्रेट करेगा\n- खाते का ईमेल अपडेट करेगा\n- पुराने ईमेल से जुड़ा डेटा हटाएगा\n\nजारी रखें?", - "placeholders": { - "old_email": { - "content": "$1" - }, - "new_email": { - "content": "$2" - } - } - }, - "changeEmail": { - "message": "ईमेल बदलें" - }, - "menuForThisWebsite": { - "message": "इस वेबसाइट के लिए" - }, - "menuLoading": { - "message": "लोड हो रहा है..." - }, - "menuRandomEmailAlias": { - "message": "रैंडम ईमेल उपनाम" - }, - "menuCustomTags": { - "message": "कस्टम टैग" - }, - "menuNoPresets": { - "message": "कोई प्रीसेट नहीं - सेटिंग्स में जोड़ें" - }, - "menuGmailTricks": { - "message": "Gmail ट्रिक्स" - }, - "menuDotVariation": { - "message": "डॉट वैरिएशन" - }, - "menuGooglemailDomain": { - "message": "Googlemail डोमेन" - }, - "menuRemoveAllDots": { - "message": "सभी डॉट हटाएं" - }, - "toastPresetAdded": { - "message": "प्रीसेट जोड़ा गया" - }, - "toastPresetRemoved": { - "message": "प्रीसेट हटाया गया" - }, - "toastSettingsExported": { - "message": "सेटिंग्स निर्यात हुईं" - }, - "toastSettingsImported": { - "message": "सेटिंग्स आयात हुईं" - }, - "toastImportFailed": { - "message": "आयात विफल - अमान्य फ़ाइल" - }, - "toastSettingsReset": { - "message": "सेटिंग्स डिफ़ॉल्ट पर रीसेट हुईं" - }, - "toastAccountSwitched": { - "message": "खाता बदला गया" - }, - "toastAccountDeleted": { - "message": "खाता हटाया गया" - }, - "toastAccountUpdated": { - "message": "खाता अपडेट हुआ" - }, - "toastAccountAdded": { - "message": "$LABEL$ जोड़ा गया", - "placeholders": { - "label": { - "content": "$1" - } - } - }, - "errorLabelRequired": { - "message": "लेबल खाली नहीं हो सकता" - }, - "errorInvalidEmail": { - "message": "कृपया मान्य ईमेल पता दर्ज करें" - }, - "errorDuplicateEmail": { - "message": "यह ईमेल पता पहले से किसी अन्य खाते द्वारा उपयोग किया जा रहा है" - }, - "errorEnterEmail": { - "message": "कृपया ईमेल पता दर्ज करें" - }, - "errorAccountExists": { - "message": "यह खाता पहले से मौजूद है" - }, - "toastQrFailed": { - "message": "QR कोड बनाने में विफल" - }, - "toastExportedAliases": { - "message": "$COUNT$ उपनाम निर्यात हुए", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastDeletedAliases": { - "message": "$COUNT$ उपनाम हटाए गए", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastHistoryCleared": { - "message": "इतिहास साफ किया गया" - }, - "toastFavoriteAdded": { - "message": "पसंदीदा में जोड़ा गया" - }, - "toastFavoriteRemoved": { - "message": "पसंदीदा से हटाया गया" - }, - "toastCopiedEmail": { - "message": "$EMAIL$ कॉपी हुआ", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "toastCopyFailed": { - "message": "कॉपी करने में विफल" - }, - "welcomeTitle": { - "message": "Gmail Alias Toolkit में आपका स्वागत है" - }, - "welcomeSubtitle": { - "message": "गोपनीयता और संगठन के लिए असीमित ईमेल उपनाम बनाएं" - }, - "letsGetStarted": { - "message": "चलिए शुरू करें" - }, - "enterGmailAddress": { - "message": "अपना Gmail पता दर्ज करें" - }, - "pressTabForGmail": { - "message": "@gmail.com के लिए $KEY$ दबाएं", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "settingUp": { - "message": "सेटअप हो रहा है..." - }, - "getStarted": { - "message": "शुरू करें" - }, - "advancedSetup": { - "message": "सेटिंग्स में उन्नत सेटअप" - }, - "whatYouCanDo": { - "message": "आप क्या कर सकते हैं:" - }, - "featurePrivateEmail": { - "message": "प्राइवेट ईमेल जनरेटर" - }, - "featureCustomTags": { - "message": "कस्टम टैग और प्रीसेट" - }, - "featureGmailTricks": { - "message": "Gmail उन्नत ट्रिक्स" - }, - "welcomeFooter": { - "message": "सारा डेटा स्थानीय रूप से संग्रहीत होता है। कोई ट्रैकिंग नहीं, कोई सर्वर नहीं।" - }, - "favoritesSaved": { - "message": "$COUNT$ सहेजे गए", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "clickStarHint": { - "message": "यहां जोड़ने के लिए इतिहास में किसी भी उपनाम पर स्टार क्लिक करें" - }, - "viewStatistics": { - "message": "आंकड़े देखें" - }, - "statistics": { - "message": "आंकड़े" - }, - "metricsTab": { - "message": "मेट्रिक्स" - }, - "timelineTab": { - "message": "टाइमलाइन" - }, - "tagsTab": { - "message": "टैग" - }, - "totalGenerated": { - "message": "कुल बनाए गए" - }, - "createdToday": { - "message": "आज बनाए गए" - }, - "thisWeek": { - "message": "इस सप्ताह" - }, - "thisMonth": { - "message": "इस महीने" - }, - "topTag": { - "message": "शीर्ष टैग" - }, - "totalTags": { - "message": "कुल टैग" - }, - "noTagsYet": { - "message": "अभी कोई टैग नहीं" - }, - "disableInlineForSite": { - "message": "इस वेबसाइट पर इनलाइन सहायक बंद करें" - }, - "inlineDisabledSites": { - "message": "इनलाइन सहायक बंद वाली वेबसाइटें" - }, - "inlineDisabledSitesDescription": { - "message": "इन वेबसाइटों पर इनलाइन आइकन और त्वरित पॉपअप छिपे रहेंगे।" - }, - "noDisabledSites": { - "message": "कोई वेबसाइट बंद नहीं है" - }, - "enableInlineForSite": { - "message": "चालू करें" - }, - "reportReview": { - "message": "रिपोर्ट / समीक्षा" - }, - "percentLabel": { - "message": "$PERCENT$%", - "placeholders": { - "percent": { - "content": "$1" - } - } - }, - "retry": { - "message": "फिर से कोशिश करें" - }, - "enable": { - "message": "सक्षम करें" - }, - "storageError": { - "message": "इतिहास लोड नहीं हो सका। संग्रहण पहुंच की जांच करें।" - } + "extensionName": { + "message": "Gmail Alias Toolkit" + }, + "extensionDescription": { + "message": "+tag पते और प्रीसेट का उपयोग करके Gmail उपनाम बनाएं और प्रबंधित करें" + }, + "headerSubtitle": { + "message": "+tag पतों से उपनाम बनाएं" + }, + "settings": { + "message": "सेटिंग्स" + }, + "back": { + "message": "वापस" + }, + "close": { + "message": "बंद करें" + }, + "cancel": { + "message": "रद्द करें" + }, + "copy": { + "message": "कॉपी करें" + }, + "copyAll": { + "message": "सभी कॉपी करें" + }, + "copyToClipboard": { + "message": "क्लिपबोर्ड पर कॉपी करें" + }, + "activeGmailAddress": { + "message": "सक्रिय Gmail पता" + }, + "addNewAccount": { + "message": "नया खाता जोड़ें" + }, + "addAccount": { + "message": "खाता जोड़ें" + }, + "addNewAccountTitle": { + "message": "नया खाता जोड़ें" + }, + "emailPlaceholder": { + "message": "your.email" + }, + "accountLabelPlaceholder": { + "message": "लेबल (वैकल्पिक, जैसे Work, Personal)" + }, + "pressTabToAddGmail": { + "message": "@gmail.com जोड़ने के लिए $KEY$ दबाएं", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "gmailWarning": { + "message": "यह Gmail पता जैसा नहीं दिखता। प्लस एड्रेसिंग Gmail के साथ सबसे अच्छा काम करती है।" + }, + "random": { + "message": "रैंडम" + }, + "customTags": { + "message": "कस्टम टैग" + }, + "gmailTricks": { + "message": "Gmail ट्रिक्स" + }, + "tabTagsShort": { + "message": "टैग" + }, + "tabTricksShort": { + "message": "ट्रिक्स" + }, + "generating": { + "message": "बन रहा है" + }, + "copied": { + "message": "कॉपी हो गया" + }, + "switchToLightMode": { + "message": "लाइट मोड पर स्विच करें" + }, + "switchToDarkMode": { + "message": "डार्क मोड पर स्विच करें" + }, + "aliasColumn": { + "message": "उपनाम" + }, + "copyEmailTooltip": { + "message": "$EMAIL$ - कॉपी करने के लिए क्लिक करें", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "pageLabel": { + "message": "पृष्ठ $PAGE$", + "placeholders": { + "page": { + "content": "$1" + } + } + }, + "dotTrick": { + "message": "डॉट ट्रिक" + }, + "plusTags": { + "message": "प्लस (+) टैग" + }, + "googlemail": { + "message": "Googlemail" + }, + "removeDots": { + "message": "डॉट हटाएं" + }, + "dotPlus": { + "message": "डॉट + प्लस" + }, + "allCombos": { + "message": "सभी संयोजन" + }, + "numberOfVariations": { + "message": "वैरिएशन की संख्या" + }, + "randomizeDotPositions": { + "message": "डॉट की स्थितियां रैंडम करें" + }, + "sequential": { + "message": "क्रमिक" + }, + "generateTricks": { + "message": "ट्रिक्स बनाएं" + }, + "generatedVariations": { + "message": "बने हुए वैरिएशन" + }, + "gmailTrickInfoLabel": { + "message": "Gmail ट्रिक:" + }, + "gmailTrickInfo": { + "message": "डॉट्स को अनदेखा किया जाता है और + के बाद सब कुछ उसी इनबॉक्स में जाता है" + }, + "format": { + "message": "फ़ॉर्मेट" + }, + "privateMailFormat": { + "message": "प्राइवेट मेल (private-mail-xxxx)" + }, + "randomCharactersFormat": { + "message": "रैंडम अक्षर (abc123xy)" + }, + "randomWordsFormat": { + "message": "रैंडम शब्द (happy-fox-42)" + }, + "timestampFormat": { + "message": "टाइमस्टैम्प (1234567890)" + }, + "numberOfAliases": { + "message": "उपनामों की संख्या" + }, + "generateRandomAliases": { + "message": "$COUNT$ रैंडम उपनाम$PLURAL$ बनाएं", + "placeholders": { + "count": { + "content": "$1" + }, + "plural": { + "content": "$2" + } + } + }, + "generatedAliases": { + "message": "बने हुए उपनाम" + }, + "totalCount": { + "message": "कुल $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "copiedAliases": { + "message": "$COUNT$ उपनाम कॉपी हुए!", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "failedToCopy": { + "message": "कॉपी करने में विफल" + }, + "formatPrivateMail": { + "message": "फ़ॉर्मेट: private-mail-xxxx" + }, + "formatAlphanumeric": { + "message": "8 रैंडम अक्षर" + }, + "formatWords": { + "message": "2 रैंडम शब्द" + }, + "formatTimestamp": { + "message": "Unix टाइमस्टैम्प" + }, + "tagPlaceholder": { + "message": "टैग दर्ज करें (जैसे shopping, work)" + }, + "generate": { + "message": "बनाएं" + }, + "yourPresets": { + "message": "आपके प्रीसेट" + }, + "example": { + "message": "उदाहरण:" + }, + "copyExample": { + "message": "उदाहरण कॉपी करें" + }, + "recentAliases": { + "message": "हाल के उपनाम" + }, + "favorites": { + "message": "पसंदीदा" + }, + "exportAsCsv": { + "message": "CSV के रूप में निर्यात करें" + }, + "exportAsJson": { + "message": "JSON के रूप में निर्यात करें" + }, + "selectAliases": { + "message": "उपनाम चुनें" + }, + "select": { + "message": "चुनें" + }, + "starredCount": { + "message": "$COUNT$ स्टार किए गए", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deselectAll": { + "message": "सभी अचयनित करें" + }, + "selectAll": { + "message": "सभी चुनें" + }, + "selectedCount": { + "message": "$COUNT$ चुने गए", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deleteCount": { + "message": "$COUNT$ हटाएं", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "allCount": { + "message": "सभी ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "favoritesCount": { + "message": "पसंदीदा ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "searchAliases": { + "message": "उपनाम खोजें..." + }, + "allTags": { + "message": "सभी टैग" + }, + "mostRecent": { + "message": "सबसे हाल के" + }, + "az": { + "message": "A-Z" + }, + "noFavoritesYet": { + "message": "अभी कोई पसंदीदा नहीं" + }, + "starEmailsHint": { + "message": "यहां जल्दी पहुंचने के लिए अपने इतिहास के ईमेल को स्टार करें" + }, + "noResultsFound": { + "message": "कोई परिणाम नहीं मिला" + }, + "differentSearchHint": { + "message": "अलग खोज या फ़िल्टर आज़माएं" + }, + "showQrCode": { + "message": "QR कोड दिखाएं" + }, + "removeFromFavorites": { + "message": "पसंदीदा से हटाएं" + }, + "addToFavorites": { + "message": "पसंदीदा में जोड़ें" + }, + "showingRange": { + "message": "$TOTAL$ में से $START$-$END$ दिखा रहे हैं", + "placeholders": { + "start": { + "content": "$1" + }, + "end": { + "content": "$2" + }, + "total": { + "content": "$3" + } + } + }, + "perPage": { + "message": "$COUNT$ / पृष्ठ", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "firstPage": { + "message": "पहला पृष्ठ" + }, + "previousPage": { + "message": "पिछला पृष्ठ" + }, + "nextPage": { + "message": "अगला पृष्ठ" + }, + "lastPage": { + "message": "अंतिम पृष्ठ" + }, + "scanToCopyAlias": { + "message": "उपनाम कॉपी करने के लिए स्कैन करें" + }, + "general": { + "message": "सामान्य" + }, + "accounts": { + "message": "खाते" + }, + "changelog": { + "message": "चेंजलॉग" + }, + "appearanceDisplay": { + "message": "रूप और प्रदर्शन" + }, + "theme": { + "message": "थीम" + }, + "themeLight": { + "message": "लाइट" + }, + "themeDark": { + "message": "डार्क" + }, + "themeAuto": { + "message": "सिस्टम (ऑटो)" + }, + "badgeCounter": { + "message": "बैज काउंटर" + }, + "badgeNone": { + "message": "कोई नहीं (छिपा हुआ)" + }, + "badgeTotal": { + "message": "इतिहास में कुल" + }, + "badgeAllTime": { + "message": "कुल बनाए गए (सभी समय)" + }, + "badgeToday": { + "message": "आज बनाए गए" + }, + "badgeWeek": { + "message": "इस सप्ताह" + }, + "copyNotifications": { + "message": "कॉपी सूचनाएं" + }, + "aliasGeneration": { + "message": "उपनाम बनाना" + }, + "randomAliasFormat": { + "message": "रैंडम उपनाम फ़ॉर्मेट" + }, + "autoSaveLimit": { + "message": "ऑटो-सेव सीमा" + }, + "aliasesLimit": { + "message": "$COUNT$ उपनाम", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "customPresets": { + "message": "कस्टम प्रीसेट" + }, + "label": { + "message": "लेबल" + }, + "tag": { + "message": "टैग" + }, + "addPreset": { + "message": "+ प्रीसेट जोड़ें" + }, + "dataManagement": { + "message": "डेटा प्रबंधन" + }, + "export": { + "message": "निर्यात" + }, + "import": { + "message": "आयात" + }, + "clear": { + "message": "साफ करें" + }, + "resetSettings": { + "message": "सभी सेटिंग्स को डिफ़ॉल्ट पर रीसेट करें" + }, + "resetSettingsTitle": { + "message": "सेटिंग्स रीसेट करें?" + }, + "resetSettingsMessage": { + "message": "यह हर सेटिंग को उसके डिफ़ॉल्ट मान पर वापस लाएगा।" + }, + "reset": { + "message": "रीसेट" + }, + "clearHistoryTitle": { + "message": "हाल के उपनाम साफ करें?" + }, + "clearHistoryMessage": { + "message": "यह हाल की इतिहास सूची से सभी उपनाम हटा देता है।" + }, + "emailAccounts": { + "message": "ईमेल खाते" + }, + "manageAccountsDescription": { + "message": "अपने Gmail खातों को प्रबंधित करें। हर खाते का अपना इतिहास, आंकड़े और पसंदीदा होते हैं।" + }, + "noAccountsFound": { + "message": "कोई खाता नहीं मिला। कृपया मुख्य स्क्रीन से खाता जोड़ें।" + }, + "emailAddress": { + "message": "ईमेल पता" + }, + "accountLabel": { + "message": "खाता लेबल" + }, + "emailAddressPlaceholder": { + "message": "your.email@gmail.com" + }, + "emailChangeWarning": { + "message": "ईमेल बदलने से सभी डेटा नए ईमेल पते पर माइग्रेट हो जाएगा" + }, + "saveChanges": { + "message": "बदलाव सहेजें" + }, + "active": { + "message": "सक्रिय" + }, + "editAccount": { + "message": "खाता संपादित करें" + }, + "cannotDeleteLastAccountTitle": { + "message": "अंतिम खाता हटाया नहीं जा सकता" + }, + "deleteThisAccount": { + "message": "यह खाता हटाएं" + }, + "deleteAccountTitle": { + "message": "खाता हटाएं?" + }, + "deleteAccountMessage": { + "message": "\"$LABEL$\" ($EMAIL$) हटाएं?\n\nयह स्थायी रूप से हटाएगा:\n- इस खाते का पूरा इतिहास\n- सभी आंकड़े\n- सभी पसंदीदा\n\nयह कार्रवाई पूर्ववत नहीं की जा सकती।", + "placeholders": { + "label": { + "content": "$1" + }, + "email": { + "content": "$2" + } + } + }, + "delete": { + "message": "हटाएं" + }, + "changeAccountEmailTitle": { + "message": "खाते का ईमेल बदलें?" + }, + "changeAccountEmailMessage": { + "message": "ईमेल बदलें\n$OLD_EMAIL$\nसे\n$NEW_EMAIL$\nमें?\n\nयह करेगा:\n- पूरा इतिहास, आंकड़े और पसंदीदा नए ईमेल पर माइग्रेट करेगा\n- खाते का ईमेल अपडेट करेगा\n- पुराने ईमेल से जुड़ा डेटा हटाएगा\n\nजारी रखें?", + "placeholders": { + "old_email": { + "content": "$1" + }, + "new_email": { + "content": "$2" + } + } + }, + "changeEmail": { + "message": "ईमेल बदलें" + }, + "menuForThisWebsite": { + "message": "इस वेबसाइट के लिए" + }, + "menuLoading": { + "message": "लोड हो रहा है..." + }, + "menuRandomEmailAlias": { + "message": "रैंडम ईमेल उपनाम" + }, + "menuCustomTags": { + "message": "कस्टम टैग" + }, + "menuNoPresets": { + "message": "कोई प्रीसेट नहीं - सेटिंग्स में जोड़ें" + }, + "menuGmailTricks": { + "message": "Gmail ट्रिक्स" + }, + "menuDotVariation": { + "message": "डॉट वैरिएशन" + }, + "menuGooglemailDomain": { + "message": "Googlemail डोमेन" + }, + "menuRemoveAllDots": { + "message": "सभी डॉट हटाएं" + }, + "toastPresetAdded": { + "message": "प्रीसेट जोड़ा गया" + }, + "toastPresetRemoved": { + "message": "प्रीसेट हटाया गया" + }, + "toastSettingsExported": { + "message": "सेटिंग्स निर्यात हुईं" + }, + "toastSettingsImported": { + "message": "सेटिंग्स आयात हुईं" + }, + "toastImportFailed": { + "message": "आयात विफल - अमान्य फ़ाइल" + }, + "toastSettingsReset": { + "message": "सेटिंग्स डिफ़ॉल्ट पर रीसेट हुईं" + }, + "toastAccountSwitched": { + "message": "खाता बदला गया" + }, + "toastAccountDeleted": { + "message": "खाता हटाया गया" + }, + "toastAccountUpdated": { + "message": "खाता अपडेट हुआ" + }, + "toastAccountAdded": { + "message": "$LABEL$ जोड़ा गया", + "placeholders": { + "label": { + "content": "$1" + } + } + }, + "errorLabelRequired": { + "message": "लेबल खाली नहीं हो सकता" + }, + "errorInvalidEmail": { + "message": "कृपया मान्य ईमेल पता दर्ज करें" + }, + "errorDuplicateEmail": { + "message": "यह ईमेल पता पहले से किसी अन्य खाते द्वारा उपयोग किया जा रहा है" + }, + "errorEnterEmail": { + "message": "कृपया ईमेल पता दर्ज करें" + }, + "errorAccountExists": { + "message": "यह खाता पहले से मौजूद है" + }, + "toastQrFailed": { + "message": "QR कोड बनाने में विफल" + }, + "toastExportedAliases": { + "message": "$COUNT$ उपनाम निर्यात हुए", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastDeletedAliases": { + "message": "$COUNT$ उपनाम हटाए गए", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastHistoryCleared": { + "message": "इतिहास साफ किया गया" + }, + "toastFavoriteAdded": { + "message": "पसंदीदा में जोड़ा गया" + }, + "toastFavoriteRemoved": { + "message": "पसंदीदा से हटाया गया" + }, + "toastCopiedEmail": { + "message": "$EMAIL$ कॉपी हुआ", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "toastCopyFailed": { + "message": "कॉपी करने में विफल" + }, + "welcomeTitle": { + "message": "Gmail Alias Toolkit में आपका स्वागत है" + }, + "welcomeSubtitle": { + "message": "गोपनीयता और संगठन के लिए असीमित ईमेल उपनाम बनाएं" + }, + "letsGetStarted": { + "message": "चलिए शुरू करें" + }, + "enterGmailAddress": { + "message": "अपना Gmail पता दर्ज करें" + }, + "pressTabForGmail": { + "message": "@gmail.com के लिए $KEY$ दबाएं", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "settingUp": { + "message": "सेटअप हो रहा है..." + }, + "getStarted": { + "message": "शुरू करें" + }, + "advancedSetup": { + "message": "सेटिंग्स में उन्नत सेटअप" + }, + "whatYouCanDo": { + "message": "आप क्या कर सकते हैं:" + }, + "featurePrivateEmail": { + "message": "प्राइवेट ईमेल जनरेटर" + }, + "featureCustomTags": { + "message": "कस्टम टैग और प्रीसेट" + }, + "featureGmailTricks": { + "message": "Gmail उन्नत ट्रिक्स" + }, + "welcomeFooter": { + "message": "सारा डेटा स्थानीय रूप से संग्रहीत होता है। कोई ट्रैकिंग नहीं, कोई सर्वर नहीं।" + }, + "favoritesSaved": { + "message": "$COUNT$ सहेजे गए", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "clickStarHint": { + "message": "यहां जोड़ने के लिए इतिहास में किसी भी उपनाम पर स्टार क्लिक करें" + }, + "viewStatistics": { + "message": "आंकड़े देखें" + }, + "statistics": { + "message": "आंकड़े" + }, + "metricsTab": { + "message": "मेट्रिक्स" + }, + "timelineTab": { + "message": "टाइमलाइन" + }, + "tagsTab": { + "message": "टैग" + }, + "totalGenerated": { + "message": "कुल बनाए गए" + }, + "createdToday": { + "message": "आज बनाए गए" + }, + "thisWeek": { + "message": "इस सप्ताह" + }, + "thisMonth": { + "message": "इस महीने" + }, + "topTag": { + "message": "शीर्ष टैग" + }, + "totalTags": { + "message": "कुल टैग" + }, + "noTagsYet": { + "message": "अभी कोई टैग नहीं" + }, + "disableInlineForSite": { + "message": "इस वेबसाइट पर इनलाइन सहायक बंद करें" + }, + "inlineDisabledSites": { + "message": "इनलाइन सहायक बंद वाली वेबसाइटें" + }, + "inlineDisabledSitesDescription": { + "message": "इन वेबसाइटों पर इनलाइन आइकन और त्वरित पॉपअप छिपे रहेंगे।" + }, + "noDisabledSites": { + "message": "कोई वेबसाइट बंद नहीं है" + }, + "enableInlineForSite": { + "message": "चालू करें" + }, + "reportReview": { + "message": "रिपोर्ट / समीक्षा" + }, + "percentLabel": { + "message": "$PERCENT$%", + "placeholders": { + "percent": { + "content": "$1" + } + } + }, + "enable": { + "message": "सक्षम करें" + }, + "retry": { + "message": "फिर से कोशिश करें" + }, + "storageError": { + "message": "इतिहास लोड नहीं हो सका। संग्रहण पहुंच की जांच करें।" + } } diff --git a/public/_locales/it/messages.json b/public/_locales/it/messages.json index b479c004..6814024e 100644 --- a/public/_locales/it/messages.json +++ b/public/_locales/it/messages.json @@ -1,774 +1,774 @@ { - "extensionName": { - "message": "Gmail Alias Toolkit" - }, - "extensionDescription": { - "message": "Genera e gestisci alias Gmail con indirizzi +tag e preset" - }, - "headerSubtitle": { - "message": "Genera alias con indirizzi +tag" - }, - "settings": { - "message": "Impostazioni" - }, - "back": { - "message": "Indietro" - }, - "close": { - "message": "Chiudi" - }, - "cancel": { - "message": "Annulla" - }, - "copy": { - "message": "Copia" - }, - "copyAll": { - "message": "Copia tutto" - }, - "copyToClipboard": { - "message": "Copia negli appunti" - }, - "activeGmailAddress": { - "message": "Indirizzo Gmail attivo" - }, - "addNewAccount": { - "message": "Aggiungi nuovo account" - }, - "addAccount": { - "message": "Aggiungi account" - }, - "addNewAccountTitle": { - "message": "Aggiungi nuovo account" - }, - "emailPlaceholder": { - "message": "tua.email" - }, - "accountLabelPlaceholder": { - "message": "Etichetta (opzionale, es. Lavoro, Personale)" - }, - "pressTabToAddGmail": { - "message": "Premi $KEY$ per aggiungere @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "gmailWarning": { - "message": "Questo non sembra un indirizzo Gmail. L’indirizzamento plus funziona meglio con Gmail." - }, - "random": { - "message": "Casuale" - }, - "customTags": { - "message": "Tag personalizzati" - }, - "gmailTricks": { - "message": "Trucchi Gmail" - }, - "tabTagsShort": { - "message": "Tag" - }, - "tabTricksShort": { - "message": "Trucchi" - }, - "generating": { - "message": "Generazione" - }, - "copied": { - "message": "Copiato" - }, - "switchToLightMode": { - "message": "Passa alla modalità chiara" - }, - "switchToDarkMode": { - "message": "Passa alla modalità scura" - }, - "aliasColumn": { - "message": "Alias" - }, - "copyEmailTooltip": { - "message": "$EMAIL$ - clicca per copiare", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "pageLabel": { - "message": "Pagina $PAGE$", - "placeholders": { - "page": { - "content": "$1" - } - } - }, - "dotTrick": { - "message": "Trucco dei punti" - }, - "plusTags": { - "message": "Tag Plus (+)" - }, - "googlemail": { - "message": "Googlemail" - }, - "removeDots": { - "message": "Rimuovi punti" - }, - "dotPlus": { - "message": "Punto + Plus" - }, - "allCombos": { - "message": "Tutte le combinazioni" - }, - "numberOfVariations": { - "message": "Numero di varianti" - }, - "randomizeDotPositions": { - "message": "Rendi casuali le posizioni dei punti" - }, - "sequential": { - "message": "Sequenziale" - }, - "generateTricks": { - "message": "Genera trucchi" - }, - "generatedVariations": { - "message": "Varianti generate" - }, - "gmailTrickInfoLabel": { - "message": "Trucco Gmail:" - }, - "gmailTrickInfo": { - "message": "I punti vengono ignorati e tutto ciò che segue + arriva nella stessa casella di posta" - }, - "format": { - "message": "Formato" - }, - "privateMailFormat": { - "message": "Posta privata (private-mail-xxxx)" - }, - "randomCharactersFormat": { - "message": "Caratteri casuali (abc123xy)" - }, - "randomWordsFormat": { - "message": "Parole casuali (happy-fox-42)" - }, - "timestampFormat": { - "message": "Timestamp (1234567890)" - }, - "numberOfAliases": { - "message": "Numero di alias" - }, - "generateRandomAliases": { - "message": "Genera $COUNT$ alias casuale$PLURAL$", - "placeholders": { - "count": { - "content": "$1" - }, - "plural": { - "content": "$2" - } - } - }, - "generatedAliases": { - "message": "Alias generati" - }, - "totalCount": { - "message": "$COUNT$ in totale", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "copiedAliases": { - "message": "$COUNT$ alias copiati!", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "failedToCopy": { - "message": "Copia non riuscita" - }, - "formatPrivateMail": { - "message": "Formato: private-mail-xxxx" - }, - "formatAlphanumeric": { - "message": "8 caratteri casuali" - }, - "formatWords": { - "message": "2 parole casuali" - }, - "formatTimestamp": { - "message": "Timestamp Unix" - }, - "tagPlaceholder": { - "message": "Inserisci tag (es. shopping, work)" - }, - "generate": { - "message": "Genera" - }, - "yourPresets": { - "message": "I tuoi preset" - }, - "example": { - "message": "Esempio:" - }, - "copyExample": { - "message": "Copia esempio" - }, - "recentAliases": { - "message": "Alias recenti" - }, - "favorites": { - "message": "Preferiti" - }, - "exportAsCsv": { - "message": "Esporta come CSV" - }, - "exportAsJson": { - "message": "Esporta come JSON" - }, - "selectAliases": { - "message": "Seleziona alias" - }, - "select": { - "message": "Seleziona" - }, - "starredCount": { - "message": "$COUNT$ contrassegnati", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deselectAll": { - "message": "Deseleziona tutto" - }, - "selectAll": { - "message": "Seleziona tutto" - }, - "selectedCount": { - "message": "$COUNT$ selezionati", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deleteCount": { - "message": "Elimina $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "allCount": { - "message": "Tutti ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "favoritesCount": { - "message": "Preferiti ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "searchAliases": { - "message": "Cerca alias..." - }, - "allTags": { - "message": "Tutti i tag" - }, - "mostRecent": { - "message": "Più recenti" - }, - "az": { - "message": "A-Z" - }, - "noFavoritesYet": { - "message": "Ancora nessun preferito" - }, - "starEmailsHint": { - "message": "Aggiungi una stella alle email dalla cronologia per accedervi rapidamente qui" - }, - "noResultsFound": { - "message": "Nessun risultato trovato" - }, - "differentSearchHint": { - "message": "Prova una ricerca o un filtro diverso" - }, - "showQrCode": { - "message": "Mostra codice QR" - }, - "removeFromFavorites": { - "message": "Rimuovi dai preferiti" - }, - "addToFavorites": { - "message": "Aggiungi ai preferiti" - }, - "showingRange": { - "message": "Visualizzazione $START$-$END$ di $TOTAL$", - "placeholders": { - "start": { - "content": "$1" - }, - "end": { - "content": "$2" - }, - "total": { - "content": "$3" - } - } - }, - "perPage": { - "message": "$COUNT$ / pagina", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "firstPage": { - "message": "Prima pagina" - }, - "previousPage": { - "message": "Pagina precedente" - }, - "nextPage": { - "message": "Pagina successiva" - }, - "lastPage": { - "message": "Ultima pagina" - }, - "scanToCopyAlias": { - "message": "Scansiona per copiare l’alias" - }, - "general": { - "message": "Generale" - }, - "accounts": { - "message": "Account" - }, - "changelog": { - "message": "Registro modifiche" - }, - "appearanceDisplay": { - "message": "Aspetto e visualizzazione" - }, - "theme": { - "message": "Tema" - }, - "themeLight": { - "message": "Chiaro" - }, - "themeDark": { - "message": "Scuro" - }, - "themeAuto": { - "message": "Sistema (Auto)" - }, - "badgeCounter": { - "message": "Contatore badge" - }, - "badgeNone": { - "message": "Nessuno (nascosto)" - }, - "badgeTotal": { - "message": "Totale nella cronologia" - }, - "badgeAllTime": { - "message": "Totale generato (sempre)" - }, - "badgeToday": { - "message": "Creati oggi" - }, - "badgeWeek": { - "message": "Questa settimana" - }, - "copyNotifications": { - "message": "Notifiche di copia" - }, - "aliasGeneration": { - "message": "Generazione alias" - }, - "randomAliasFormat": { - "message": "Formato alias casuale" - }, - "autoSaveLimit": { - "message": "Limite salvataggio automatico" - }, - "aliasesLimit": { - "message": "$COUNT$ alias", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "customPresets": { - "message": "Preset personalizzati" - }, - "label": { - "message": "Etichetta" - }, - "tag": { - "message": "Tag" - }, - "addPreset": { - "message": "+ Aggiungi preset" - }, - "dataManagement": { - "message": "Gestione dati" - }, - "export": { - "message": "Esporta" - }, - "import": { - "message": "Importa" - }, - "clear": { - "message": "Cancella" - }, - "resetSettings": { - "message": "Ripristina tutte le impostazioni predefinite" - }, - "resetSettingsTitle": { - "message": "Ripristinare impostazioni?" - }, - "resetSettingsMessage": { - "message": "Questo ripristinerà ogni impostazione al valore predefinito." - }, - "reset": { - "message": "Ripristina" - }, - "clearHistoryTitle": { - "message": "Cancellare alias recenti?" - }, - "clearHistoryMessage": { - "message": "Questo rimuove tutti gli alias dall’elenco della cronologia recente." - }, - "emailAccounts": { - "message": "Account email" - }, - "manageAccountsDescription": { - "message": "Gestisci i tuoi account Gmail. Ogni account ha la propria cronologia, statistiche e preferiti." - }, - "noAccountsFound": { - "message": "Nessun account trovato. Aggiungi un account dalla schermata principale." - }, - "emailAddress": { - "message": "Indirizzo email" - }, - "accountLabel": { - "message": "Etichetta account" - }, - "emailAddressPlaceholder": { - "message": "tua.email@gmail.com" - }, - "emailChangeWarning": { - "message": "La modifica dell’email migrerà tutti i dati al nuovo indirizzo email" - }, - "saveChanges": { - "message": "Salva modifiche" - }, - "active": { - "message": "Attivo" - }, - "editAccount": { - "message": "Modifica account" - }, - "cannotDeleteLastAccountTitle": { - "message": "Impossibile eliminare l’ultimo account" - }, - "deleteThisAccount": { - "message": "Elimina questo account" - }, - "deleteAccountTitle": { - "message": "Eliminare account?" - }, - "deleteAccountMessage": { - "message": "Eliminare \"$LABEL$\" ($EMAIL$)?\n\nQuesto eliminerà definitivamente:\n- Tutta la cronologia di questo account\n- Tutte le statistiche\n- Tutti i preferiti\n\nQuesta azione non può essere annullata.", - "placeholders": { - "label": { - "content": "$1" - }, - "email": { - "content": "$2" - } - } - }, - "delete": { - "message": "Elimina" - }, - "changeAccountEmailTitle": { - "message": "Cambiare email account?" - }, - "changeAccountEmailMessage": { - "message": "Cambiare email da\n$OLD_EMAIL$\na\n$NEW_EMAIL$?\n\nQuesto farà quanto segue:\n- Migrerà tutta la cronologia, le statistiche e i preferiti alla nuova email\n- Aggiornerà l’email dell’account\n- Eliminerà i dati associati alla vecchia email\n\nContinuare?", - "placeholders": { - "old_email": { - "content": "$1" - }, - "new_email": { - "content": "$2" - } - } - }, - "changeEmail": { - "message": "Cambia email" - }, - "menuForThisWebsite": { - "message": "Per questo sito" - }, - "menuLoading": { - "message": "Caricamento..." - }, - "menuRandomEmailAlias": { - "message": "Alias email casuale" - }, - "menuCustomTags": { - "message": "Tag personalizzati" - }, - "menuNoPresets": { - "message": "Nessun preset - Aggiungi in Impostazioni" - }, - "menuGmailTricks": { - "message": "Trucchi Gmail" - }, - "menuDotVariation": { - "message": "Variazione con punti" - }, - "menuGooglemailDomain": { - "message": "Dominio Googlemail" - }, - "menuRemoveAllDots": { - "message": "Rimuovi tutti i punti" - }, - "toastPresetAdded": { - "message": "Preset aggiunto" - }, - "toastPresetRemoved": { - "message": "Preset rimosso" - }, - "toastSettingsExported": { - "message": "Impostazioni esportate" - }, - "toastSettingsImported": { - "message": "Impostazioni importate" - }, - "toastImportFailed": { - "message": "Importazione non riuscita - file non valido" - }, - "toastSettingsReset": { - "message": "Impostazioni ripristinate ai valori predefiniti" - }, - "toastAccountSwitched": { - "message": "Account cambiato" - }, - "toastAccountDeleted": { - "message": "Account eliminato" - }, - "toastAccountUpdated": { - "message": "Account aggiornato" - }, - "toastAccountAdded": { - "message": "$LABEL$ aggiunto", - "placeholders": { - "label": { - "content": "$1" - } - } - }, - "errorLabelRequired": { - "message": "L’etichetta non può essere vuota" - }, - "errorInvalidEmail": { - "message": "Inserisci un indirizzo email valido" - }, - "errorDuplicateEmail": { - "message": "Questo indirizzo email è già usato da un altro account" - }, - "errorEnterEmail": { - "message": "Inserisci un indirizzo email" - }, - "errorAccountExists": { - "message": "Questo account esiste già" - }, - "toastQrFailed": { - "message": "Impossibile generare il codice QR" - }, - "toastExportedAliases": { - "message": "Esportati $COUNT$ alias", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastDeletedAliases": { - "message": "Eliminati $COUNT$ alias", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastHistoryCleared": { - "message": "Cronologia cancellata" - }, - "toastFavoriteAdded": { - "message": "Aggiunto ai preferiti" - }, - "toastFavoriteRemoved": { - "message": "Rimosso dai preferiti" - }, - "toastCopiedEmail": { - "message": "$EMAIL$ copiato", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "toastCopyFailed": { - "message": "Copia non riuscita" - }, - "welcomeTitle": { - "message": "Benvenuto in Gmail Alias Toolkit" - }, - "welcomeSubtitle": { - "message": "Genera alias email illimitati per privacy e organizzazione" - }, - "letsGetStarted": { - "message": "Iniziamo" - }, - "enterGmailAddress": { - "message": "Inserisci il tuo indirizzo Gmail" - }, - "pressTabForGmail": { - "message": "Premi $KEY$ per @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "settingUp": { - "message": "Configurazione..." - }, - "getStarted": { - "message": "Inizia" - }, - "advancedSetup": { - "message": "Configurazione avanzata nelle Impostazioni" - }, - "whatYouCanDo": { - "message": "Cosa puoi fare:" - }, - "featurePrivateEmail": { - "message": "Generatore di email private" - }, - "featureCustomTags": { - "message": "Tag e preset personalizzati" - }, - "featureGmailTricks": { - "message": "Trucchi Gmail avanzati" - }, - "welcomeFooter": { - "message": "Tutti i dati sono archiviati localmente. Nessun tracciamento, nessun server." - }, - "favoritesSaved": { - "message": "$COUNT$ salvati", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "clickStarHint": { - "message": "Clicca sulla stella di qualsiasi alias nella cronologia per aggiungerlo qui" - }, - "viewStatistics": { - "message": "Visualizza statistiche" - }, - "statistics": { - "message": "Statistiche" - }, - "metricsTab": { - "message": "Metriche" - }, - "timelineTab": { - "message": "Cronologia" - }, - "tagsTab": { - "message": "Tag" - }, - "totalGenerated": { - "message": "Totale generato" - }, - "createdToday": { - "message": "Creati oggi" - }, - "thisWeek": { - "message": "Questa settimana" - }, - "thisMonth": { - "message": "Questo mese" - }, - "topTag": { - "message": "Tag principale" - }, - "totalTags": { - "message": "Tag totali" - }, - "noTagsYet": { - "message": "Ancora nessun tag" - }, - "disableInlineForSite": { - "message": "Disattiva l’assistente inline su questo sito" - }, - "inlineDisabledSites": { - "message": "Siti con assistente inline disattivato" - }, - "inlineDisabledSitesDescription": { - "message": "L’icona inline e il popup rapido sono nascosti su questi siti." - }, - "noDisabledSites": { - "message": "Nessun sito disattivato" - }, - "enableInlineForSite": { - "message": "Attiva" - }, - "reportReview": { - "message": "Segnala / Recensisci" - }, - "percentLabel": { - "message": "$PERCENT$%", - "placeholders": { - "percent": { - "content": "$1" - } - } - }, - "retry": { - "message": "Riprova" - }, - "enable": { - "message": "Abilita" - }, - "storageError": { - "message": "Impossibile caricare la cronologia. Verificare l\u0027accesso all\u0027archivio." - } + "extensionName": { + "message": "Gmail Alias Toolkit" + }, + "extensionDescription": { + "message": "Genera e gestisci alias Gmail con indirizzi +tag e preset" + }, + "headerSubtitle": { + "message": "Genera alias con indirizzi +tag" + }, + "settings": { + "message": "Impostazioni" + }, + "back": { + "message": "Indietro" + }, + "close": { + "message": "Chiudi" + }, + "cancel": { + "message": "Annulla" + }, + "copy": { + "message": "Copia" + }, + "copyAll": { + "message": "Copia tutto" + }, + "copyToClipboard": { + "message": "Copia negli appunti" + }, + "activeGmailAddress": { + "message": "Indirizzo Gmail attivo" + }, + "addNewAccount": { + "message": "Aggiungi nuovo account" + }, + "addAccount": { + "message": "Aggiungi account" + }, + "addNewAccountTitle": { + "message": "Aggiungi nuovo account" + }, + "emailPlaceholder": { + "message": "tua.email" + }, + "accountLabelPlaceholder": { + "message": "Etichetta (opzionale, es. Lavoro, Personale)" + }, + "pressTabToAddGmail": { + "message": "Premi $KEY$ per aggiungere @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "gmailWarning": { + "message": "Questo non sembra un indirizzo Gmail. L’indirizzamento plus funziona meglio con Gmail." + }, + "random": { + "message": "Casuale" + }, + "customTags": { + "message": "Tag personalizzati" + }, + "gmailTricks": { + "message": "Trucchi Gmail" + }, + "tabTagsShort": { + "message": "Tag" + }, + "tabTricksShort": { + "message": "Trucchi" + }, + "generating": { + "message": "Generazione" + }, + "copied": { + "message": "Copiato" + }, + "switchToLightMode": { + "message": "Passa alla modalità chiara" + }, + "switchToDarkMode": { + "message": "Passa alla modalità scura" + }, + "aliasColumn": { + "message": "Alias" + }, + "copyEmailTooltip": { + "message": "$EMAIL$ - clicca per copiare", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "pageLabel": { + "message": "Pagina $PAGE$", + "placeholders": { + "page": { + "content": "$1" + } + } + }, + "dotTrick": { + "message": "Trucco dei punti" + }, + "plusTags": { + "message": "Tag Plus (+)" + }, + "googlemail": { + "message": "Googlemail" + }, + "removeDots": { + "message": "Rimuovi punti" + }, + "dotPlus": { + "message": "Punto + Plus" + }, + "allCombos": { + "message": "Tutte le combinazioni" + }, + "numberOfVariations": { + "message": "Numero di varianti" + }, + "randomizeDotPositions": { + "message": "Rendi casuali le posizioni dei punti" + }, + "sequential": { + "message": "Sequenziale" + }, + "generateTricks": { + "message": "Genera trucchi" + }, + "generatedVariations": { + "message": "Varianti generate" + }, + "gmailTrickInfoLabel": { + "message": "Trucco Gmail:" + }, + "gmailTrickInfo": { + "message": "I punti vengono ignorati e tutto ciò che segue + arriva nella stessa casella di posta" + }, + "format": { + "message": "Formato" + }, + "privateMailFormat": { + "message": "Posta privata (private-mail-xxxx)" + }, + "randomCharactersFormat": { + "message": "Caratteri casuali (abc123xy)" + }, + "randomWordsFormat": { + "message": "Parole casuali (happy-fox-42)" + }, + "timestampFormat": { + "message": "Timestamp (1234567890)" + }, + "numberOfAliases": { + "message": "Numero di alias" + }, + "generateRandomAliases": { + "message": "Genera $COUNT$ alias casuale$PLURAL$", + "placeholders": { + "count": { + "content": "$1" + }, + "plural": { + "content": "$2" + } + } + }, + "generatedAliases": { + "message": "Alias generati" + }, + "totalCount": { + "message": "$COUNT$ in totale", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "copiedAliases": { + "message": "$COUNT$ alias copiati!", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "failedToCopy": { + "message": "Copia non riuscita" + }, + "formatPrivateMail": { + "message": "Formato: private-mail-xxxx" + }, + "formatAlphanumeric": { + "message": "8 caratteri casuali" + }, + "formatWords": { + "message": "2 parole casuali" + }, + "formatTimestamp": { + "message": "Timestamp Unix" + }, + "tagPlaceholder": { + "message": "Inserisci tag (es. shopping, work)" + }, + "generate": { + "message": "Genera" + }, + "yourPresets": { + "message": "I tuoi preset" + }, + "example": { + "message": "Esempio:" + }, + "copyExample": { + "message": "Copia esempio" + }, + "recentAliases": { + "message": "Alias recenti" + }, + "favorites": { + "message": "Preferiti" + }, + "exportAsCsv": { + "message": "Esporta come CSV" + }, + "exportAsJson": { + "message": "Esporta come JSON" + }, + "selectAliases": { + "message": "Seleziona alias" + }, + "select": { + "message": "Seleziona" + }, + "starredCount": { + "message": "$COUNT$ contrassegnati", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deselectAll": { + "message": "Deseleziona tutto" + }, + "selectAll": { + "message": "Seleziona tutto" + }, + "selectedCount": { + "message": "$COUNT$ selezionati", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deleteCount": { + "message": "Elimina $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "allCount": { + "message": "Tutti ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "favoritesCount": { + "message": "Preferiti ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "searchAliases": { + "message": "Cerca alias..." + }, + "allTags": { + "message": "Tutti i tag" + }, + "mostRecent": { + "message": "Più recenti" + }, + "az": { + "message": "A-Z" + }, + "noFavoritesYet": { + "message": "Ancora nessun preferito" + }, + "starEmailsHint": { + "message": "Aggiungi una stella alle email dalla cronologia per accedervi rapidamente qui" + }, + "noResultsFound": { + "message": "Nessun risultato trovato" + }, + "differentSearchHint": { + "message": "Prova una ricerca o un filtro diverso" + }, + "showQrCode": { + "message": "Mostra codice QR" + }, + "removeFromFavorites": { + "message": "Rimuovi dai preferiti" + }, + "addToFavorites": { + "message": "Aggiungi ai preferiti" + }, + "showingRange": { + "message": "Visualizzazione $START$-$END$ di $TOTAL$", + "placeholders": { + "start": { + "content": "$1" + }, + "end": { + "content": "$2" + }, + "total": { + "content": "$3" + } + } + }, + "perPage": { + "message": "$COUNT$ / pagina", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "firstPage": { + "message": "Prima pagina" + }, + "previousPage": { + "message": "Pagina precedente" + }, + "nextPage": { + "message": "Pagina successiva" + }, + "lastPage": { + "message": "Ultima pagina" + }, + "scanToCopyAlias": { + "message": "Scansiona per copiare l’alias" + }, + "general": { + "message": "Generale" + }, + "accounts": { + "message": "Account" + }, + "changelog": { + "message": "Registro modifiche" + }, + "appearanceDisplay": { + "message": "Aspetto e visualizzazione" + }, + "theme": { + "message": "Tema" + }, + "themeLight": { + "message": "Chiaro" + }, + "themeDark": { + "message": "Scuro" + }, + "themeAuto": { + "message": "Sistema (Auto)" + }, + "badgeCounter": { + "message": "Contatore badge" + }, + "badgeNone": { + "message": "Nessuno (nascosto)" + }, + "badgeTotal": { + "message": "Totale nella cronologia" + }, + "badgeAllTime": { + "message": "Totale generato (sempre)" + }, + "badgeToday": { + "message": "Creati oggi" + }, + "badgeWeek": { + "message": "Questa settimana" + }, + "copyNotifications": { + "message": "Notifiche di copia" + }, + "aliasGeneration": { + "message": "Generazione alias" + }, + "randomAliasFormat": { + "message": "Formato alias casuale" + }, + "autoSaveLimit": { + "message": "Limite salvataggio automatico" + }, + "aliasesLimit": { + "message": "$COUNT$ alias", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "customPresets": { + "message": "Preset personalizzati" + }, + "label": { + "message": "Etichetta" + }, + "tag": { + "message": "Tag" + }, + "addPreset": { + "message": "+ Aggiungi preset" + }, + "dataManagement": { + "message": "Gestione dati" + }, + "export": { + "message": "Esporta" + }, + "import": { + "message": "Importa" + }, + "clear": { + "message": "Cancella" + }, + "resetSettings": { + "message": "Ripristina tutte le impostazioni predefinite" + }, + "resetSettingsTitle": { + "message": "Ripristinare impostazioni?" + }, + "resetSettingsMessage": { + "message": "Questo ripristinerà ogni impostazione al valore predefinito." + }, + "reset": { + "message": "Ripristina" + }, + "clearHistoryTitle": { + "message": "Cancellare alias recenti?" + }, + "clearHistoryMessage": { + "message": "Questo rimuove tutti gli alias dall’elenco della cronologia recente." + }, + "emailAccounts": { + "message": "Account email" + }, + "manageAccountsDescription": { + "message": "Gestisci i tuoi account Gmail. Ogni account ha la propria cronologia, statistiche e preferiti." + }, + "noAccountsFound": { + "message": "Nessun account trovato. Aggiungi un account dalla schermata principale." + }, + "emailAddress": { + "message": "Indirizzo email" + }, + "accountLabel": { + "message": "Etichetta account" + }, + "emailAddressPlaceholder": { + "message": "tua.email@gmail.com" + }, + "emailChangeWarning": { + "message": "La modifica dell’email migrerà tutti i dati al nuovo indirizzo email" + }, + "saveChanges": { + "message": "Salva modifiche" + }, + "active": { + "message": "Attivo" + }, + "editAccount": { + "message": "Modifica account" + }, + "cannotDeleteLastAccountTitle": { + "message": "Impossibile eliminare l’ultimo account" + }, + "deleteThisAccount": { + "message": "Elimina questo account" + }, + "deleteAccountTitle": { + "message": "Eliminare account?" + }, + "deleteAccountMessage": { + "message": "Eliminare \"$LABEL$\" ($EMAIL$)?\n\nQuesto eliminerà definitivamente:\n- Tutta la cronologia di questo account\n- Tutte le statistiche\n- Tutti i preferiti\n\nQuesta azione non può essere annullata.", + "placeholders": { + "label": { + "content": "$1" + }, + "email": { + "content": "$2" + } + } + }, + "delete": { + "message": "Elimina" + }, + "changeAccountEmailTitle": { + "message": "Cambiare email account?" + }, + "changeAccountEmailMessage": { + "message": "Cambiare email da\n$OLD_EMAIL$\na\n$NEW_EMAIL$?\n\nQuesto farà quanto segue:\n- Migrerà tutta la cronologia, le statistiche e i preferiti alla nuova email\n- Aggiornerà l’email dell’account\n- Eliminerà i dati associati alla vecchia email\n\nContinuare?", + "placeholders": { + "old_email": { + "content": "$1" + }, + "new_email": { + "content": "$2" + } + } + }, + "changeEmail": { + "message": "Cambia email" + }, + "menuForThisWebsite": { + "message": "Per questo sito" + }, + "menuLoading": { + "message": "Caricamento..." + }, + "menuRandomEmailAlias": { + "message": "Alias email casuale" + }, + "menuCustomTags": { + "message": "Tag personalizzati" + }, + "menuNoPresets": { + "message": "Nessun preset - Aggiungi in Impostazioni" + }, + "menuGmailTricks": { + "message": "Trucchi Gmail" + }, + "menuDotVariation": { + "message": "Variazione con punti" + }, + "menuGooglemailDomain": { + "message": "Dominio Googlemail" + }, + "menuRemoveAllDots": { + "message": "Rimuovi tutti i punti" + }, + "toastPresetAdded": { + "message": "Preset aggiunto" + }, + "toastPresetRemoved": { + "message": "Preset rimosso" + }, + "toastSettingsExported": { + "message": "Impostazioni esportate" + }, + "toastSettingsImported": { + "message": "Impostazioni importate" + }, + "toastImportFailed": { + "message": "Importazione non riuscita - file non valido" + }, + "toastSettingsReset": { + "message": "Impostazioni ripristinate ai valori predefiniti" + }, + "toastAccountSwitched": { + "message": "Account cambiato" + }, + "toastAccountDeleted": { + "message": "Account eliminato" + }, + "toastAccountUpdated": { + "message": "Account aggiornato" + }, + "toastAccountAdded": { + "message": "$LABEL$ aggiunto", + "placeholders": { + "label": { + "content": "$1" + } + } + }, + "errorLabelRequired": { + "message": "L’etichetta non può essere vuota" + }, + "errorInvalidEmail": { + "message": "Inserisci un indirizzo email valido" + }, + "errorDuplicateEmail": { + "message": "Questo indirizzo email è già usato da un altro account" + }, + "errorEnterEmail": { + "message": "Inserisci un indirizzo email" + }, + "errorAccountExists": { + "message": "Questo account esiste già" + }, + "toastQrFailed": { + "message": "Impossibile generare il codice QR" + }, + "toastExportedAliases": { + "message": "Esportati $COUNT$ alias", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastDeletedAliases": { + "message": "Eliminati $COUNT$ alias", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastHistoryCleared": { + "message": "Cronologia cancellata" + }, + "toastFavoriteAdded": { + "message": "Aggiunto ai preferiti" + }, + "toastFavoriteRemoved": { + "message": "Rimosso dai preferiti" + }, + "toastCopiedEmail": { + "message": "$EMAIL$ copiato", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "toastCopyFailed": { + "message": "Copia non riuscita" + }, + "welcomeTitle": { + "message": "Benvenuto in Gmail Alias Toolkit" + }, + "welcomeSubtitle": { + "message": "Genera alias email illimitati per privacy e organizzazione" + }, + "letsGetStarted": { + "message": "Iniziamo" + }, + "enterGmailAddress": { + "message": "Inserisci il tuo indirizzo Gmail" + }, + "pressTabForGmail": { + "message": "Premi $KEY$ per @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "settingUp": { + "message": "Configurazione..." + }, + "getStarted": { + "message": "Inizia" + }, + "advancedSetup": { + "message": "Configurazione avanzata nelle Impostazioni" + }, + "whatYouCanDo": { + "message": "Cosa puoi fare:" + }, + "featurePrivateEmail": { + "message": "Generatore di email private" + }, + "featureCustomTags": { + "message": "Tag e preset personalizzati" + }, + "featureGmailTricks": { + "message": "Trucchi Gmail avanzati" + }, + "welcomeFooter": { + "message": "Tutti i dati sono archiviati localmente. Nessun tracciamento, nessun server." + }, + "favoritesSaved": { + "message": "$COUNT$ salvati", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "clickStarHint": { + "message": "Clicca sulla stella di qualsiasi alias nella cronologia per aggiungerlo qui" + }, + "viewStatistics": { + "message": "Visualizza statistiche" + }, + "statistics": { + "message": "Statistiche" + }, + "metricsTab": { + "message": "Metriche" + }, + "timelineTab": { + "message": "Cronologia" + }, + "tagsTab": { + "message": "Tag" + }, + "totalGenerated": { + "message": "Totale generato" + }, + "createdToday": { + "message": "Creati oggi" + }, + "thisWeek": { + "message": "Questa settimana" + }, + "thisMonth": { + "message": "Questo mese" + }, + "topTag": { + "message": "Tag principale" + }, + "totalTags": { + "message": "Tag totali" + }, + "noTagsYet": { + "message": "Ancora nessun tag" + }, + "disableInlineForSite": { + "message": "Disattiva l’assistente inline su questo sito" + }, + "inlineDisabledSites": { + "message": "Siti con assistente inline disattivato" + }, + "inlineDisabledSitesDescription": { + "message": "L’icona inline e il popup rapido sono nascosti su questi siti." + }, + "noDisabledSites": { + "message": "Nessun sito disattivato" + }, + "enableInlineForSite": { + "message": "Attiva" + }, + "reportReview": { + "message": "Segnala / Recensisci" + }, + "percentLabel": { + "message": "$PERCENT$%", + "placeholders": { + "percent": { + "content": "$1" + } + } + }, + "enable": { + "message": "Abilita" + }, + "retry": { + "message": "Riprova" + }, + "storageError": { + "message": "Impossibile caricare la cronologia. Verificare l'accesso all'archivio." + } } diff --git a/public/_locales/ja/messages.json b/public/_locales/ja/messages.json index 5acd1e76..e1ec2517 100644 --- a/public/_locales/ja/messages.json +++ b/public/_locales/ja/messages.json @@ -1,774 +1,774 @@ { - "extensionName": { - "message": "Gmail Alias Toolkit" - }, - "extensionDescription": { - "message": "+tag アドレスとプリセットで Gmail エイリアスを生成・管理" - }, - "headerSubtitle": { - "message": "+tag アドレスでエイリアスを生成" - }, - "settings": { - "message": "設定" - }, - "back": { - "message": "戻る" - }, - "close": { - "message": "閉じる" - }, - "cancel": { - "message": "キャンセル" - }, - "copy": { - "message": "コピー" - }, - "copyAll": { - "message": "すべてコピー" - }, - "copyToClipboard": { - "message": "クリップボードにコピー" - }, - "activeGmailAddress": { - "message": "有効な Gmail アドレス" - }, - "addNewAccount": { - "message": "新しいアカウントを追加" - }, - "addAccount": { - "message": "アカウントを追加" - }, - "addNewAccountTitle": { - "message": "新しいアカウントを追加" - }, - "emailPlaceholder": { - "message": "your.email" - }, - "accountLabelPlaceholder": { - "message": "ラベル(任意、例:仕事、個人)" - }, - "pressTabToAddGmail": { - "message": "$KEY$ を押して @gmail.com を追加", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "gmailWarning": { - "message": "Gmail アドレスではないようです。プラスアドレスは Gmail で最もよく機能します。" - }, - "random": { - "message": "ランダム" - }, - "customTags": { - "message": "カスタムタグ" - }, - "gmailTricks": { - "message": "Gmail の小技" - }, - "tabTagsShort": { - "message": "ã‚¿ã‚°" - }, - "tabTricksShort": { - "message": "小技" - }, - "generating": { - "message": "生成中" - }, - "copied": { - "message": "コピー済み" - }, - "switchToLightMode": { - "message": "ライトモードに切り替え" - }, - "switchToDarkMode": { - "message": "ダークモードに切り替え" - }, - "aliasColumn": { - "message": "エイリアス" - }, - "copyEmailTooltip": { - "message": "$EMAIL$ - クリックしてコピー", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "pageLabel": { - "message": "ページ $PAGE$", - "placeholders": { - "page": { - "content": "$1" - } - } - }, - "dotTrick": { - "message": "ドットの小技" - }, - "plusTags": { - "message": "プラス(+)タグ" - }, - "googlemail": { - "message": "Googlemail" - }, - "removeDots": { - "message": "ドットを削除" - }, - "dotPlus": { - "message": "ドット + プラス" - }, - "allCombos": { - "message": "すべての組み合わせ" - }, - "numberOfVariations": { - "message": "バリエーション数" - }, - "randomizeDotPositions": { - "message": "ドット位置をランダム化" - }, - "sequential": { - "message": "順番" - }, - "generateTricks": { - "message": "小技を生成" - }, - "generatedVariations": { - "message": "生成されたバリエーション" - }, - "gmailTrickInfoLabel": { - "message": "Gmail の小技:" - }, - "gmailTrickInfo": { - "message": "ドットは無視され、+ の後ろはすべて同じ受信トレイに届きます" - }, - "format": { - "message": "形式" - }, - "privateMailFormat": { - "message": "プライベートメール(private-mail-xxxx)" - }, - "randomCharactersFormat": { - "message": "ランダム文字(abc123xy)" - }, - "randomWordsFormat": { - "message": "ランダム単語(happy-fox-42)" - }, - "timestampFormat": { - "message": "タイムスタンプ(1234567890)" - }, - "numberOfAliases": { - "message": "エイリアス数" - }, - "generateRandomAliases": { - "message": "$COUNT$ 個のランダムエイリアス$PLURAL$を生成", - "placeholders": { - "count": { - "content": "$1" - }, - "plural": { - "content": "$2" - } - } - }, - "generatedAliases": { - "message": "生成されたエイリアス" - }, - "totalCount": { - "message": "合計 $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "copiedAliases": { - "message": "$COUNT$ 個のエイリアスをコピーしました!", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "failedToCopy": { - "message": "コピーに失敗しました" - }, - "formatPrivateMail": { - "message": "形式: private-mail-xxxx" - }, - "formatAlphanumeric": { - "message": "8 個のランダム文字" - }, - "formatWords": { - "message": "2 個のランダム単語" - }, - "formatTimestamp": { - "message": "Unix タイムスタンプ" - }, - "tagPlaceholder": { - "message": "タグを入力(例:shopping、work)" - }, - "generate": { - "message": "生成" - }, - "yourPresets": { - "message": "あなたのプリセット" - }, - "example": { - "message": "例:" - }, - "copyExample": { - "message": "例をコピー" - }, - "recentAliases": { - "message": "最近のエイリアス" - }, - "favorites": { - "message": "お気に入り" - }, - "exportAsCsv": { - "message": "CSV としてエクスポート" - }, - "exportAsJson": { - "message": "JSON としてエクスポート" - }, - "selectAliases": { - "message": "エイリアスを選択" - }, - "select": { - "message": "選択" - }, - "starredCount": { - "message": "$COUNT$ 件にスター", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deselectAll": { - "message": "すべて選択解除" - }, - "selectAll": { - "message": "すべて選択" - }, - "selectedCount": { - "message": "$COUNT$ 件を選択", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deleteCount": { - "message": "$COUNT$ 件を削除", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "allCount": { - "message": "すべて($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "favoritesCount": { - "message": "お気に入り($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "searchAliases": { - "message": "エイリアスを検索..." - }, - "allTags": { - "message": "すべてのタグ" - }, - "mostRecent": { - "message": "最新" - }, - "az": { - "message": "A-Z" - }, - "noFavoritesYet": { - "message": "お気に入りはまだありません" - }, - "starEmailsHint": { - "message": "履歴のメールにスターを付けると、ここからすばやくアクセスできます" - }, - "noResultsFound": { - "message": "結果が見つかりません" - }, - "differentSearchHint": { - "message": "別の検索またはフィルターを試してください" - }, - "showQrCode": { - "message": "QR コードを表示" - }, - "removeFromFavorites": { - "message": "お気に入りから削除" - }, - "addToFavorites": { - "message": "お気に入りに追加" - }, - "showingRange": { - "message": "$TOTAL$ 件中 $START$-$END$ を表示", - "placeholders": { - "start": { - "content": "$1" - }, - "end": { - "content": "$2" - }, - "total": { - "content": "$3" - } - } - }, - "perPage": { - "message": "$COUNT$ / ページ", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "firstPage": { - "message": "最初のページ" - }, - "previousPage": { - "message": "前のページ" - }, - "nextPage": { - "message": "次のページ" - }, - "lastPage": { - "message": "最後のページ" - }, - "scanToCopyAlias": { - "message": "スキャンしてエイリアスをコピー" - }, - "general": { - "message": "一般" - }, - "accounts": { - "message": "アカウント" - }, - "changelog": { - "message": "変更履歴" - }, - "appearanceDisplay": { - "message": "外観と表示" - }, - "theme": { - "message": "テーマ" - }, - "themeLight": { - "message": "ライト" - }, - "themeDark": { - "message": "ダーク" - }, - "themeAuto": { - "message": "システム(自動)" - }, - "badgeCounter": { - "message": "バッジカウンター" - }, - "badgeNone": { - "message": "なし(非表示)" - }, - "badgeTotal": { - "message": "履歴内の合計" - }, - "badgeAllTime": { - "message": "総生成数(全期間)" - }, - "badgeToday": { - "message": "今日作成" - }, - "badgeWeek": { - "message": "今週" - }, - "copyNotifications": { - "message": "コピー通知" - }, - "aliasGeneration": { - "message": "エイリアス生成" - }, - "randomAliasFormat": { - "message": "ランダムエイリアス形式" - }, - "autoSaveLimit": { - "message": "自動保存上限" - }, - "aliasesLimit": { - "message": "$COUNT$ 個のエイリアス", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "customPresets": { - "message": "カスタムプリセット" - }, - "label": { - "message": "ラベル" - }, - "tag": { - "message": "ã‚¿ã‚°" - }, - "addPreset": { - "message": "+ プリセットを追加" - }, - "dataManagement": { - "message": "データ管理" - }, - "export": { - "message": "エクスポート" - }, - "import": { - "message": "インポート" - }, - "clear": { - "message": "クリア" - }, - "resetSettings": { - "message": "すべての設定をデフォルトに戻す" - }, - "resetSettingsTitle": { - "message": "設定をリセットしますか?" - }, - "resetSettingsMessage": { - "message": "すべての設定がデフォルト値に戻ります。" - }, - "reset": { - "message": "リセット" - }, - "clearHistoryTitle": { - "message": "最近のエイリアスをクリアしますか?" - }, - "clearHistoryMessage": { - "message": "最近の履歴リストからすべてのエイリアスを削除します。" - }, - "emailAccounts": { - "message": "メールアカウント" - }, - "manageAccountsDescription": { - "message": "Gmail アカウントを管理します。各アカウントには独自の履歴、統計、お気に入りがあります。" - }, - "noAccountsFound": { - "message": "アカウントが見つかりません。メイン画面からアカウントを追加してください。" - }, - "emailAddress": { - "message": "メールアドレス" - }, - "accountLabel": { - "message": "アカウントラベル" - }, - "emailAddressPlaceholder": { - "message": "your.email@gmail.com" - }, - "emailChangeWarning": { - "message": "メールを変更すると、すべてのデータが新しいメールアドレスに移行されます" - }, - "saveChanges": { - "message": "変更を保存" - }, - "active": { - "message": "有効" - }, - "editAccount": { - "message": "アカウントを編集" - }, - "cannotDeleteLastAccountTitle": { - "message": "最後のアカウントは削除できません" - }, - "deleteThisAccount": { - "message": "このアカウントを削除" - }, - "deleteAccountTitle": { - "message": "アカウントを削除しますか?" - }, - "deleteAccountMessage": { - "message": "\"$LABEL$\"($EMAIL$)を削除しますか?\n\nこれにより次の内容が完全に削除されます:\n- このアカウントのすべての履歴\n- すべての統計\n- すべてのお気に入り\n\nこの操作は元に戻せません。", - "placeholders": { - "label": { - "content": "$1" - }, - "email": { - "content": "$2" - } - } - }, - "delete": { - "message": "削除" - }, - "changeAccountEmailTitle": { - "message": "アカウントのメールを変更しますか?" - }, - "changeAccountEmailMessage": { - "message": "メールを\n$OLD_EMAIL$\nから\n$NEW_EMAIL$\nに変更しますか?\n\nこれにより次の処理が行われます:\n- すべての履歴、統計、お気に入りを新しいメールへ移行\n- アカウントのメールを更新\n- 古いメールに関連するデータを削除\n\n続行しますか?", - "placeholders": { - "old_email": { - "content": "$1" - }, - "new_email": { - "content": "$2" - } - } - }, - "changeEmail": { - "message": "メールを変更" - }, - "menuForThisWebsite": { - "message": "このウェブサイト用" - }, - "menuLoading": { - "message": "読み込み中..." - }, - "menuRandomEmailAlias": { - "message": "ランダムメールエイリアス" - }, - "menuCustomTags": { - "message": "カスタムタグ" - }, - "menuNoPresets": { - "message": "プリセットなし - 設定で追加" - }, - "menuGmailTricks": { - "message": "Gmail の小技" - }, - "menuDotVariation": { - "message": "ドットのバリエーション" - }, - "menuGooglemailDomain": { - "message": "Googlemail ドメイン" - }, - "menuRemoveAllDots": { - "message": "すべてのドットを削除" - }, - "toastPresetAdded": { - "message": "プリセットを追加しました" - }, - "toastPresetRemoved": { - "message": "プリセットを削除しました" - }, - "toastSettingsExported": { - "message": "設定をエクスポートしました" - }, - "toastSettingsImported": { - "message": "設定をインポートしました" - }, - "toastImportFailed": { - "message": "インポートに失敗しました - 無効なファイル" - }, - "toastSettingsReset": { - "message": "設定をデフォルトにリセットしました" - }, - "toastAccountSwitched": { - "message": "アカウントを切り替えました" - }, - "toastAccountDeleted": { - "message": "アカウントを削除しました" - }, - "toastAccountUpdated": { - "message": "アカウントを更新しました" - }, - "toastAccountAdded": { - "message": "$LABEL$ を追加しました", - "placeholders": { - "label": { - "content": "$1" - } - } - }, - "errorLabelRequired": { - "message": "ラベルは空にできません" - }, - "errorInvalidEmail": { - "message": "有効なメールアドレスを入力してください" - }, - "errorDuplicateEmail": { - "message": "このメールアドレスは別のアカウントですでに使用されています" - }, - "errorEnterEmail": { - "message": "メールアドレスを入力してください" - }, - "errorAccountExists": { - "message": "このアカウントはすでに存在します" - }, - "toastQrFailed": { - "message": "QR コードの生成に失敗しました" - }, - "toastExportedAliases": { - "message": "$COUNT$ 個のエイリアスをエクスポートしました", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastDeletedAliases": { - "message": "$COUNT$ 個のエイリアスを削除しました", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastHistoryCleared": { - "message": "履歴をクリアしました" - }, - "toastFavoriteAdded": { - "message": "お気に入りに追加しました" - }, - "toastFavoriteRemoved": { - "message": "お気に入りから削除しました" - }, - "toastCopiedEmail": { - "message": "$EMAIL$ をコピーしました", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "toastCopyFailed": { - "message": "コピーに失敗しました" - }, - "welcomeTitle": { - "message": "Gmail Alias Toolkit へようこそ" - }, - "welcomeSubtitle": { - "message": "プライバシーと整理のために無制限のメールエイリアスを生成" - }, - "letsGetStarted": { - "message": "始めましょう" - }, - "enterGmailAddress": { - "message": "Gmail アドレスを入力" - }, - "pressTabForGmail": { - "message": "@gmail.com には $KEY$ を押してください", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "settingUp": { - "message": "設定中..." - }, - "getStarted": { - "message": "é–‹å§‹" - }, - "advancedSetup": { - "message": "設定で詳細セットアップ" - }, - "whatYouCanDo": { - "message": "できること:" - }, - "featurePrivateEmail": { - "message": "プライベートメール生成" - }, - "featureCustomTags": { - "message": "カスタムタグとプリセット" - }, - "featureGmailTricks": { - "message": "Gmail の高度な小技" - }, - "welcomeFooter": { - "message": "すべてのデータはローカルに保存されます。追跡なし、サーバーなし。" - }, - "favoritesSaved": { - "message": "$COUNT$ 件保存済み", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "clickStarHint": { - "message": "履歴内の任意のエイリアスのスターをクリックして、ここに追加します" - }, - "viewStatistics": { - "message": "統計を表示" - }, - "statistics": { - "message": "統計" - }, - "metricsTab": { - "message": "指標" - }, - "timelineTab": { - "message": "タイムライン" - }, - "tagsTab": { - "message": "ã‚¿ã‚°" - }, - "totalGenerated": { - "message": "総生成数" - }, - "createdToday": { - "message": "今日作成" - }, - "thisWeek": { - "message": "今週" - }, - "thisMonth": { - "message": "今月" - }, - "topTag": { - "message": "上位タグ" - }, - "totalTags": { - "message": "タグ合計" - }, - "noTagsYet": { - "message": "タグはまだありません" - }, - "disableInlineForSite": { - "message": "このサイトでインラインヘルパーを無効にする" - }, - "inlineDisabledSites": { - "message": "インラインヘルパーを無効にしたサイト" - }, - "inlineDisabledSitesDescription": { - "message": "これらのサイトではインラインアイコンとクイックポップアップが非表示になります。" - }, - "noDisabledSites": { - "message": "無効にしたサイトはありません" - }, - "enableInlineForSite": { - "message": "有効にする" - }, - "reportReview": { - "message": "報告 / レビュー" - }, - "percentLabel": { - "message": "$PERCENT$%", - "placeholders": { - "percent": { - "content": "$1" - } - } - }, - "retry": { - "message": "もう一度試す" - }, - "enable": { - "message": "有効にする" - }, - "storageError": { - "message": "履歴を読み込めませんでした。ストレージアクセスを確認してください。" - } + "extensionName": { + "message": "Gmail Alias Toolkit" + }, + "extensionDescription": { + "message": "+tag アドレスとプリセットで Gmail エイリアスを生成・管理" + }, + "headerSubtitle": { + "message": "+tag アドレスでエイリアスを生成" + }, + "settings": { + "message": "設定" + }, + "back": { + "message": "戻る" + }, + "close": { + "message": "閉じる" + }, + "cancel": { + "message": "キャンセル" + }, + "copy": { + "message": "コピー" + }, + "copyAll": { + "message": "すべてコピー" + }, + "copyToClipboard": { + "message": "クリップボードにコピー" + }, + "activeGmailAddress": { + "message": "有効な Gmail アドレス" + }, + "addNewAccount": { + "message": "新しいアカウントを追加" + }, + "addAccount": { + "message": "アカウントを追加" + }, + "addNewAccountTitle": { + "message": "新しいアカウントを追加" + }, + "emailPlaceholder": { + "message": "your.email" + }, + "accountLabelPlaceholder": { + "message": "ラベル(任意、例:仕事、個人)" + }, + "pressTabToAddGmail": { + "message": "$KEY$ を押して @gmail.com を追加", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "gmailWarning": { + "message": "Gmail アドレスではないようです。プラスアドレスは Gmail で最もよく機能します。" + }, + "random": { + "message": "ランダム" + }, + "customTags": { + "message": "カスタムタグ" + }, + "gmailTricks": { + "message": "Gmail の小技" + }, + "tabTagsShort": { + "message": "タグ" + }, + "tabTricksShort": { + "message": "小技" + }, + "generating": { + "message": "生成中" + }, + "copied": { + "message": "コピー済み" + }, + "switchToLightMode": { + "message": "ライトモードに切り替え" + }, + "switchToDarkMode": { + "message": "ダークモードに切り替え" + }, + "aliasColumn": { + "message": "エイリアス" + }, + "copyEmailTooltip": { + "message": "$EMAIL$ - クリックしてコピー", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "pageLabel": { + "message": "ページ $PAGE$", + "placeholders": { + "page": { + "content": "$1" + } + } + }, + "dotTrick": { + "message": "ドットの小技" + }, + "plusTags": { + "message": "プラス(+)タグ" + }, + "googlemail": { + "message": "Googlemail" + }, + "removeDots": { + "message": "ドットを削除" + }, + "dotPlus": { + "message": "ドット + プラス" + }, + "allCombos": { + "message": "すべての組み合わせ" + }, + "numberOfVariations": { + "message": "バリエーション数" + }, + "randomizeDotPositions": { + "message": "ドット位置をランダム化" + }, + "sequential": { + "message": "順番" + }, + "generateTricks": { + "message": "小技を生成" + }, + "generatedVariations": { + "message": "生成されたバリエーション" + }, + "gmailTrickInfoLabel": { + "message": "Gmail の小技:" + }, + "gmailTrickInfo": { + "message": "ドットは無視され、+ の後ろはすべて同じ受信トレイに届きます" + }, + "format": { + "message": "形式" + }, + "privateMailFormat": { + "message": "プライベートメール(private-mail-xxxx)" + }, + "randomCharactersFormat": { + "message": "ランダム文字(abc123xy)" + }, + "randomWordsFormat": { + "message": "ランダム単語(happy-fox-42)" + }, + "timestampFormat": { + "message": "タイムスタンプ(1234567890)" + }, + "numberOfAliases": { + "message": "エイリアス数" + }, + "generateRandomAliases": { + "message": "$COUNT$ 個のランダムエイリアス$PLURAL$を生成", + "placeholders": { + "count": { + "content": "$1" + }, + "plural": { + "content": "$2" + } + } + }, + "generatedAliases": { + "message": "生成されたエイリアス" + }, + "totalCount": { + "message": "合計 $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "copiedAliases": { + "message": "$COUNT$ 個のエイリアスをコピーしました!", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "failedToCopy": { + "message": "コピーに失敗しました" + }, + "formatPrivateMail": { + "message": "形式: private-mail-xxxx" + }, + "formatAlphanumeric": { + "message": "8 個のランダム文字" + }, + "formatWords": { + "message": "2 個のランダム単語" + }, + "formatTimestamp": { + "message": "Unix タイムスタンプ" + }, + "tagPlaceholder": { + "message": "タグを入力(例:shopping、work)" + }, + "generate": { + "message": "生成" + }, + "yourPresets": { + "message": "あなたのプリセット" + }, + "example": { + "message": "例:" + }, + "copyExample": { + "message": "例をコピー" + }, + "recentAliases": { + "message": "最近のエイリアス" + }, + "favorites": { + "message": "お気に入り" + }, + "exportAsCsv": { + "message": "CSV としてエクスポート" + }, + "exportAsJson": { + "message": "JSON としてエクスポート" + }, + "selectAliases": { + "message": "エイリアスを選択" + }, + "select": { + "message": "選択" + }, + "starredCount": { + "message": "$COUNT$ 件にスター", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deselectAll": { + "message": "すべて選択解除" + }, + "selectAll": { + "message": "すべて選択" + }, + "selectedCount": { + "message": "$COUNT$ 件を選択", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deleteCount": { + "message": "$COUNT$ 件を削除", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "allCount": { + "message": "すべて($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "favoritesCount": { + "message": "お気に入り($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "searchAliases": { + "message": "エイリアスを検索..." + }, + "allTags": { + "message": "すべてのタグ" + }, + "mostRecent": { + "message": "最新" + }, + "az": { + "message": "A-Z" + }, + "noFavoritesYet": { + "message": "お気に入りはまだありません" + }, + "starEmailsHint": { + "message": "履歴のメールにスターを付けると、ここからすばやくアクセスできます" + }, + "noResultsFound": { + "message": "結果が見つかりません" + }, + "differentSearchHint": { + "message": "別の検索またはフィルターを試してください" + }, + "showQrCode": { + "message": "QR コードを表示" + }, + "removeFromFavorites": { + "message": "お気に入りから削除" + }, + "addToFavorites": { + "message": "お気に入りに追加" + }, + "showingRange": { + "message": "$TOTAL$ 件中 $START$-$END$ を表示", + "placeholders": { + "start": { + "content": "$1" + }, + "end": { + "content": "$2" + }, + "total": { + "content": "$3" + } + } + }, + "perPage": { + "message": "$COUNT$ / ページ", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "firstPage": { + "message": "最初のページ" + }, + "previousPage": { + "message": "前のページ" + }, + "nextPage": { + "message": "次のページ" + }, + "lastPage": { + "message": "最後のページ" + }, + "scanToCopyAlias": { + "message": "スキャンしてエイリアスをコピー" + }, + "general": { + "message": "一般" + }, + "accounts": { + "message": "アカウント" + }, + "changelog": { + "message": "変更履歴" + }, + "appearanceDisplay": { + "message": "外観と表示" + }, + "theme": { + "message": "テーマ" + }, + "themeLight": { + "message": "ライト" + }, + "themeDark": { + "message": "ダーク" + }, + "themeAuto": { + "message": "システム(自動)" + }, + "badgeCounter": { + "message": "バッジカウンター" + }, + "badgeNone": { + "message": "なし(非表示)" + }, + "badgeTotal": { + "message": "履歴内の合計" + }, + "badgeAllTime": { + "message": "総生成数(全期間)" + }, + "badgeToday": { + "message": "今日作成" + }, + "badgeWeek": { + "message": "今週" + }, + "copyNotifications": { + "message": "コピー通知" + }, + "aliasGeneration": { + "message": "エイリアス生成" + }, + "randomAliasFormat": { + "message": "ランダムエイリアス形式" + }, + "autoSaveLimit": { + "message": "自動保存上限" + }, + "aliasesLimit": { + "message": "$COUNT$ 個のエイリアス", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "customPresets": { + "message": "カスタムプリセット" + }, + "label": { + "message": "ラベル" + }, + "tag": { + "message": "タグ" + }, + "addPreset": { + "message": "+ プリセットを追加" + }, + "dataManagement": { + "message": "データ管理" + }, + "export": { + "message": "エクスポート" + }, + "import": { + "message": "インポート" + }, + "clear": { + "message": "クリア" + }, + "resetSettings": { + "message": "すべての設定をデフォルトに戻す" + }, + "resetSettingsTitle": { + "message": "設定をリセットしますか?" + }, + "resetSettingsMessage": { + "message": "すべての設定がデフォルト値に戻ります。" + }, + "reset": { + "message": "リセット" + }, + "clearHistoryTitle": { + "message": "最近のエイリアスをクリアしますか?" + }, + "clearHistoryMessage": { + "message": "最近の履歴リストからすべてのエイリアスを削除します。" + }, + "emailAccounts": { + "message": "メールアカウント" + }, + "manageAccountsDescription": { + "message": "Gmail アカウントを管理します。各アカウントには独自の履歴、統計、お気に入りがあります。" + }, + "noAccountsFound": { + "message": "アカウントが見つかりません。メイン画面からアカウントを追加してください。" + }, + "emailAddress": { + "message": "メールアドレス" + }, + "accountLabel": { + "message": "アカウントラベル" + }, + "emailAddressPlaceholder": { + "message": "your.email@gmail.com" + }, + "emailChangeWarning": { + "message": "メールを変更すると、すべてのデータが新しいメールアドレスに移行されます" + }, + "saveChanges": { + "message": "変更を保存" + }, + "active": { + "message": "有効" + }, + "editAccount": { + "message": "アカウントを編集" + }, + "cannotDeleteLastAccountTitle": { + "message": "最後のアカウントは削除できません" + }, + "deleteThisAccount": { + "message": "このアカウントを削除" + }, + "deleteAccountTitle": { + "message": "アカウントを削除しますか?" + }, + "deleteAccountMessage": { + "message": "\"$LABEL$\"($EMAIL$)を削除しますか?\n\nこれにより次の内容が完全に削除されます:\n- このアカウントのすべての履歴\n- すべての統計\n- すべてのお気に入り\n\nこの操作は元に戻せません。", + "placeholders": { + "label": { + "content": "$1" + }, + "email": { + "content": "$2" + } + } + }, + "delete": { + "message": "削除" + }, + "changeAccountEmailTitle": { + "message": "アカウントのメールを変更しますか?" + }, + "changeAccountEmailMessage": { + "message": "メールを\n$OLD_EMAIL$\nから\n$NEW_EMAIL$\nに変更しますか?\n\nこれにより次の処理が行われます:\n- すべての履歴、統計、お気に入りを新しいメールへ移行\n- アカウントのメールを更新\n- 古いメールに関連するデータを削除\n\n続行しますか?", + "placeholders": { + "old_email": { + "content": "$1" + }, + "new_email": { + "content": "$2" + } + } + }, + "changeEmail": { + "message": "メールを変更" + }, + "menuForThisWebsite": { + "message": "このウェブサイト用" + }, + "menuLoading": { + "message": "読み込み中..." + }, + "menuRandomEmailAlias": { + "message": "ランダムメールエイリアス" + }, + "menuCustomTags": { + "message": "カスタムタグ" + }, + "menuNoPresets": { + "message": "プリセットなし - 設定で追加" + }, + "menuGmailTricks": { + "message": "Gmail の小技" + }, + "menuDotVariation": { + "message": "ドットのバリエーション" + }, + "menuGooglemailDomain": { + "message": "Googlemail ドメイン" + }, + "menuRemoveAllDots": { + "message": "すべてのドットを削除" + }, + "toastPresetAdded": { + "message": "プリセットを追加しました" + }, + "toastPresetRemoved": { + "message": "プリセットを削除しました" + }, + "toastSettingsExported": { + "message": "設定をエクスポートしました" + }, + "toastSettingsImported": { + "message": "設定をインポートしました" + }, + "toastImportFailed": { + "message": "インポートに失敗しました - 無効なファイル" + }, + "toastSettingsReset": { + "message": "設定をデフォルトにリセットしました" + }, + "toastAccountSwitched": { + "message": "アカウントを切り替えました" + }, + "toastAccountDeleted": { + "message": "アカウントを削除しました" + }, + "toastAccountUpdated": { + "message": "アカウントを更新しました" + }, + "toastAccountAdded": { + "message": "$LABEL$ を追加しました", + "placeholders": { + "label": { + "content": "$1" + } + } + }, + "errorLabelRequired": { + "message": "ラベルは空にできません" + }, + "errorInvalidEmail": { + "message": "有効なメールアドレスを入力してください" + }, + "errorDuplicateEmail": { + "message": "このメールアドレスは別のアカウントですでに使用されています" + }, + "errorEnterEmail": { + "message": "メールアドレスを入力してください" + }, + "errorAccountExists": { + "message": "このアカウントはすでに存在します" + }, + "toastQrFailed": { + "message": "QR コードの生成に失敗しました" + }, + "toastExportedAliases": { + "message": "$COUNT$ 個のエイリアスをエクスポートしました", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastDeletedAliases": { + "message": "$COUNT$ 個のエイリアスを削除しました", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastHistoryCleared": { + "message": "履歴をクリアしました" + }, + "toastFavoriteAdded": { + "message": "お気に入りに追加しました" + }, + "toastFavoriteRemoved": { + "message": "お気に入りから削除しました" + }, + "toastCopiedEmail": { + "message": "$EMAIL$ をコピーしました", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "toastCopyFailed": { + "message": "コピーに失敗しました" + }, + "welcomeTitle": { + "message": "Gmail Alias Toolkit へようこそ" + }, + "welcomeSubtitle": { + "message": "プライバシーと整理のために無制限のメールエイリアスを生成" + }, + "letsGetStarted": { + "message": "始めましょう" + }, + "enterGmailAddress": { + "message": "Gmail アドレスを入力" + }, + "pressTabForGmail": { + "message": "@gmail.com には $KEY$ を押してください", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "settingUp": { + "message": "設定中..." + }, + "getStarted": { + "message": "開始" + }, + "advancedSetup": { + "message": "設定で詳細セットアップ" + }, + "whatYouCanDo": { + "message": "できること:" + }, + "featurePrivateEmail": { + "message": "プライベートメール生成" + }, + "featureCustomTags": { + "message": "カスタムタグとプリセット" + }, + "featureGmailTricks": { + "message": "Gmail の高度な小技" + }, + "welcomeFooter": { + "message": "すべてのデータはローカルに保存されます。追跡なし、サーバーなし。" + }, + "favoritesSaved": { + "message": "$COUNT$ 件保存済み", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "clickStarHint": { + "message": "履歴内の任意のエイリアスのスターをクリックして、ここに追加します" + }, + "viewStatistics": { + "message": "統計を表示" + }, + "statistics": { + "message": "統計" + }, + "metricsTab": { + "message": "指標" + }, + "timelineTab": { + "message": "タイムライン" + }, + "tagsTab": { + "message": "タグ" + }, + "totalGenerated": { + "message": "総生成数" + }, + "createdToday": { + "message": "今日作成" + }, + "thisWeek": { + "message": "今週" + }, + "thisMonth": { + "message": "今月" + }, + "topTag": { + "message": "上位タグ" + }, + "totalTags": { + "message": "タグ合計" + }, + "noTagsYet": { + "message": "タグはまだありません" + }, + "disableInlineForSite": { + "message": "このサイトでインラインヘルパーを無効にする" + }, + "inlineDisabledSites": { + "message": "インラインヘルパーを無効にしたサイト" + }, + "inlineDisabledSitesDescription": { + "message": "これらのサイトではインラインアイコンとクイックポップアップが非表示になります。" + }, + "noDisabledSites": { + "message": "無効にしたサイトはありません" + }, + "enableInlineForSite": { + "message": "有効にする" + }, + "reportReview": { + "message": "報告 / レビュー" + }, + "percentLabel": { + "message": "$PERCENT$%", + "placeholders": { + "percent": { + "content": "$1" + } + } + }, + "enable": { + "message": "有効にする" + }, + "retry": { + "message": "もう一度試す" + }, + "storageError": { + "message": "履歴を読み込めませんでした。ストレージアクセスを確認してください。" + } } diff --git a/public/_locales/ko/messages.json b/public/_locales/ko/messages.json index 45642f8b..cd785f6e 100644 --- a/public/_locales/ko/messages.json +++ b/public/_locales/ko/messages.json @@ -1,774 +1,774 @@ { - "extensionName": { - "message": "Gmail Alias Toolkit" - }, - "extensionDescription": { - "message": "+tag 주소와 프리셋으로 Gmail 별칭을 생성하고 관리하세요" - }, - "headerSubtitle": { - "message": "+tag 주소로 별칭 생성" - }, - "settings": { - "message": "설정" - }, - "back": { - "message": "뒤로" - }, - "close": { - "message": "닫기" - }, - "cancel": { - "message": "취소" - }, - "copy": { - "message": "복사" - }, - "copyAll": { - "message": "모두 복사" - }, - "copyToClipboard": { - "message": "클립보드에 복사" - }, - "activeGmailAddress": { - "message": "활성 Gmail 주소" - }, - "addNewAccount": { - "message": "새 계정 추가" - }, - "addAccount": { - "message": "계정 추가" - }, - "addNewAccountTitle": { - "message": "새 계정 추가" - }, - "emailPlaceholder": { - "message": "your.email" - }, - "accountLabelPlaceholder": { - "message": "라벨(선택 사항, 예: 업무, 개인)" - }, - "pressTabToAddGmail": { - "message": "@gmail.com을 추가하려면 $KEY$ 키를 누르세요", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "gmailWarning": { - "message": "Gmail 주소처럼 보이지 않습니다. 플러스 주소 지정은 Gmail에서 가장 잘 작동합니다." - }, - "random": { - "message": "무작위" - }, - "customTags": { - "message": "사용자 지정 태그" - }, - "gmailTricks": { - "message": "Gmail 팁" - }, - "tabTagsShort": { - "message": "태그" - }, - "tabTricksShort": { - "message": "팁" - }, - "generating": { - "message": "생성 중" - }, - "copied": { - "message": "복사됨" - }, - "switchToLightMode": { - "message": "라이트 모드로 전환" - }, - "switchToDarkMode": { - "message": "다크 모드로 전환" - }, - "aliasColumn": { - "message": "별칭" - }, - "copyEmailTooltip": { - "message": "$EMAIL$ - 클릭하여 복사", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "pageLabel": { - "message": "페이지 $PAGE$", - "placeholders": { - "page": { - "content": "$1" - } - } - }, - "dotTrick": { - "message": "점 트릭" - }, - "plusTags": { - "message": "플러스(+) 태그" - }, - "googlemail": { - "message": "Googlemail" - }, - "removeDots": { - "message": "점 제거" - }, - "dotPlus": { - "message": "점 + 플러스" - }, - "allCombos": { - "message": "모든 ì¡°í•©" - }, - "numberOfVariations": { - "message": "변형 수" - }, - "randomizeDotPositions": { - "message": "점 위치 무작위화" - }, - "sequential": { - "message": "순차" - }, - "generateTricks": { - "message": "팁 생성" - }, - "generatedVariations": { - "message": "생성된 변형" - }, - "gmailTrickInfoLabel": { - "message": "Gmail 팁:" - }, - "gmailTrickInfo": { - "message": "점은 무시되며 + 뒤의 모든 내용은 같은 받은편지함으로 전달됩니다" - }, - "format": { - "message": "형식" - }, - "privateMailFormat": { - "message": "비공개 메일(private-mail-xxxx)" - }, - "randomCharactersFormat": { - "message": "무작위 문자(abc123xy)" - }, - "randomWordsFormat": { - "message": "무작위 단어(happy-fox-42)" - }, - "timestampFormat": { - "message": "타임스탬프(1234567890)" - }, - "numberOfAliases": { - "message": "별칭 수" - }, - "generateRandomAliases": { - "message": "무작위 별칭 $COUNT$ê°œ$PLURAL$ 생성", - "placeholders": { - "count": { - "content": "$1" - }, - "plural": { - "content": "$2" - } - } - }, - "generatedAliases": { - "message": "생성된 별칭" - }, - "totalCount": { - "message": "총 $COUNT$ê°œ", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "copiedAliases": { - "message": "별칭 $COUNT$개를 복사했습니다!", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "failedToCopy": { - "message": "복사 실패" - }, - "formatPrivateMail": { - "message": "형식: private-mail-xxxx" - }, - "formatAlphanumeric": { - "message": "무작위 문자 8ê°œ" - }, - "formatWords": { - "message": "무작위 단어 2ê°œ" - }, - "formatTimestamp": { - "message": "Unix 타임스탬프" - }, - "tagPlaceholder": { - "message": "태그 ìž…ë ¥(예: shopping, work)" - }, - "generate": { - "message": "생성" - }, - "yourPresets": { - "message": "ë‚´ 프리셋" - }, - "example": { - "message": "예:" - }, - "copyExample": { - "message": "예시 복사" - }, - "recentAliases": { - "message": "최근 별칭" - }, - "favorites": { - "message": "즐겨찾기" - }, - "exportAsCsv": { - "message": "CSV로 내보내기" - }, - "exportAsJson": { - "message": "JSON으로 내보내기" - }, - "selectAliases": { - "message": "별칭 선택" - }, - "select": { - "message": "선택" - }, - "starredCount": { - "message": "별표 표시 $COUNT$ê°œ", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deselectAll": { - "message": "ì „ì²´ 선택 í•´ì œ" - }, - "selectAll": { - "message": "ì „ì²´ 선택" - }, - "selectedCount": { - "message": "$COUNT$ê°œ 선택됨", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deleteCount": { - "message": "$COUNT$ê°œ ì‚­ì œ", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "allCount": { - "message": "ì „ì²´($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "favoritesCount": { - "message": "즐겨찾기($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "searchAliases": { - "message": "별칭 검색..." - }, - "allTags": { - "message": "모든 태그" - }, - "mostRecent": { - "message": "최신순" - }, - "az": { - "message": "A-Z" - }, - "noFavoritesYet": { - "message": "아직 즐겨찾기가 없습니다" - }, - "starEmailsHint": { - "message": "기록의 이메일에 별표를 표시하면 여기에서 빠르게 접근할 수 있습니다" - }, - "noResultsFound": { - "message": "결과를 찾을 수 없습니다" - }, - "differentSearchHint": { - "message": "다른 검색어나 필터를 시도해 보세요" - }, - "showQrCode": { - "message": "QR 코드 표시" - }, - "removeFromFavorites": { - "message": "즐겨찾기에서 제거" - }, - "addToFavorites": { - "message": "즐겨찾기에 추가" - }, - "showingRange": { - "message": "총 $TOTAL$ê°œ 중 $START$-$END$ 표시", - "placeholders": { - "start": { - "content": "$1" - }, - "end": { - "content": "$2" - }, - "total": { - "content": "$3" - } - } - }, - "perPage": { - "message": "$COUNT$ / 페이지", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "firstPage": { - "message": "첫 페이지" - }, - "previousPage": { - "message": "이전 페이지" - }, - "nextPage": { - "message": "다음 페이지" - }, - "lastPage": { - "message": "마지막 페이지" - }, - "scanToCopyAlias": { - "message": "스캔하여 별칭 복사" - }, - "general": { - "message": "일반" - }, - "accounts": { - "message": "계정" - }, - "changelog": { - "message": "변경 로그" - }, - "appearanceDisplay": { - "message": "모양 및 표시" - }, - "theme": { - "message": "테마" - }, - "themeLight": { - "message": "라이트" - }, - "themeDark": { - "message": "다크" - }, - "themeAuto": { - "message": "시스템(자동)" - }, - "badgeCounter": { - "message": "ë°°ì§€ ì¹´ìš´í„°" - }, - "badgeNone": { - "message": "없음(숨김)" - }, - "badgeTotal": { - "message": "기록의 총합" - }, - "badgeAllTime": { - "message": "총 생성 수(ì „ì²´ 기간)" - }, - "badgeToday": { - "message": "오늘 생성됨" - }, - "badgeWeek": { - "message": "이번 주" - }, - "copyNotifications": { - "message": "복사 알림" - }, - "aliasGeneration": { - "message": "별칭 생성" - }, - "randomAliasFormat": { - "message": "무작위 별칭 형식" - }, - "autoSaveLimit": { - "message": "자동 저장 제한" - }, - "aliasesLimit": { - "message": "별칭 $COUNT$ê°œ", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "customPresets": { - "message": "사용자 지정 프리셋" - }, - "label": { - "message": "라벨" - }, - "tag": { - "message": "태그" - }, - "addPreset": { - "message": "+ 프리셋 추가" - }, - "dataManagement": { - "message": "데이터 관리" - }, - "export": { - "message": "내보내기" - }, - "import": { - "message": "가져오기" - }, - "clear": { - "message": "지우기" - }, - "resetSettings": { - "message": "모든 설정을 기본값으로 재설정" - }, - "resetSettingsTitle": { - "message": "설정을 재설정할까요?" - }, - "resetSettingsMessage": { - "message": "모든 설정이 기본값으로 복원됩니다." - }, - "reset": { - "message": "재설정" - }, - "clearHistoryTitle": { - "message": "최근 별칭을 지울까요?" - }, - "clearHistoryMessage": { - "message": "최근 기록 목록에서 모든 별칭을 제거합니다." - }, - "emailAccounts": { - "message": "이메일 계정" - }, - "manageAccountsDescription": { - "message": "Gmail 계정을 관리하세요. 각 계정에는 자체 기록, 통계, 즐겨찾기가 있습니다." - }, - "noAccountsFound": { - "message": "계정을 찾을 수 없습니다. 기본 화면에서 계정을 추가하세요." - }, - "emailAddress": { - "message": "이메일 주소" - }, - "accountLabel": { - "message": "계정 라벨" - }, - "emailAddressPlaceholder": { - "message": "your.email@gmail.com" - }, - "emailChangeWarning": { - "message": "이메일을 변경하면 모든 데이터가 새 이메일 주소로 이전됩니다" - }, - "saveChanges": { - "message": "변경 사항 저장" - }, - "active": { - "message": "활성" - }, - "editAccount": { - "message": "계정 편집" - }, - "cannotDeleteLastAccountTitle": { - "message": "마지막 계정은 삭제할 수 없습니다" - }, - "deleteThisAccount": { - "message": "이 계정 ì‚­ì œ" - }, - "deleteAccountTitle": { - "message": "계정을 삭제할까요?" - }, - "deleteAccountMessage": { - "message": "\"$LABEL$\"($EMAIL$)을 삭제할까요?\n\n다음 항목이 영구적으로 삭제됩니다:\n- 이 계정의 모든 기록\n- 모든 통계\n- 모든 즐겨찾기\n\n이 작업은 되돌릴 수 없습니다.", - "placeholders": { - "label": { - "content": "$1" - }, - "email": { - "content": "$2" - } - } - }, - "delete": { - "message": "ì‚­ì œ" - }, - "changeAccountEmailTitle": { - "message": "계정 이메일을 변경할까요?" - }, - "changeAccountEmailMessage": { - "message": "이메일을\n$OLD_EMAIL$\n에서\n$NEW_EMAIL$\n으로 변경할까요?\n\n다음 작업이 수행됩니다:\n- 모든 기록, 통계, 즐겨찾기를 새 이메일로 이전\n- 계정 이메일 업데이트\n- 이전 이메일과 연결된 데이터 ì‚­ì œ\n\n계속할까요?", - "placeholders": { - "old_email": { - "content": "$1" - }, - "new_email": { - "content": "$2" - } - } - }, - "changeEmail": { - "message": "이메일 변경" - }, - "menuForThisWebsite": { - "message": "이 웹사이트용" - }, - "menuLoading": { - "message": "불러오는 중..." - }, - "menuRandomEmailAlias": { - "message": "무작위 이메일 별칭" - }, - "menuCustomTags": { - "message": "사용자 지정 태그" - }, - "menuNoPresets": { - "message": "프리셋 없음 - 설정에서 추가" - }, - "menuGmailTricks": { - "message": "Gmail 팁" - }, - "menuDotVariation": { - "message": "점 변형" - }, - "menuGooglemailDomain": { - "message": "Googlemail 도메인" - }, - "menuRemoveAllDots": { - "message": "모든 점 제거" - }, - "toastPresetAdded": { - "message": "프리셋이 추가되었습니다" - }, - "toastPresetRemoved": { - "message": "프리셋이 제거되었습니다" - }, - "toastSettingsExported": { - "message": "설정을 내보냈습니다" - }, - "toastSettingsImported": { - "message": "설정을 가져왔습니다" - }, - "toastImportFailed": { - "message": "가져오기 실패 - 잘못된 파일" - }, - "toastSettingsReset": { - "message": "설정이 기본값으로 재설정되었습니다" - }, - "toastAccountSwitched": { - "message": "계정이 전환되었습니다" - }, - "toastAccountDeleted": { - "message": "계정이 삭제되었습니다" - }, - "toastAccountUpdated": { - "message": "계정이 업데이트되었습니다" - }, - "toastAccountAdded": { - "message": "$LABEL$ 추가됨", - "placeholders": { - "label": { - "content": "$1" - } - } - }, - "errorLabelRequired": { - "message": "라벨은 비워 둘 수 없습니다" - }, - "errorInvalidEmail": { - "message": "유효한 이메일 주소를 입력하세요" - }, - "errorDuplicateEmail": { - "message": "이 이메일 주소는 이미 다른 계정에서 사용 중입니다" - }, - "errorEnterEmail": { - "message": "이메일 주소를 입력하세요" - }, - "errorAccountExists": { - "message": "이 계정은 이미 존재합니다" - }, - "toastQrFailed": { - "message": "QR 코드 생성 실패" - }, - "toastExportedAliases": { - "message": "별칭 $COUNT$개를 내보냈습니다", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastDeletedAliases": { - "message": "별칭 $COUNT$개를 삭제했습니다", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastHistoryCleared": { - "message": "기록이 지워졌습니다" - }, - "toastFavoriteAdded": { - "message": "즐겨찾기에 추가됨" - }, - "toastFavoriteRemoved": { - "message": "즐겨찾기에서 제거됨" - }, - "toastCopiedEmail": { - "message": "$EMAIL$ 복사됨", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "toastCopyFailed": { - "message": "복사 실패" - }, - "welcomeTitle": { - "message": "Gmail Alias Toolkit에 오신 것을 환영합니다" - }, - "welcomeSubtitle": { - "message": "개인정보 보호와 정리를 위해 무제한 이메일 별칭을 생성하세요" - }, - "letsGetStarted": { - "message": "시작해 봅시다" - }, - "enterGmailAddress": { - "message": "Gmail 주소를 입력하세요" - }, - "pressTabForGmail": { - "message": "@gmail.com에는 $KEY$ 키를 누르세요", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "settingUp": { - "message": "설정 중..." - }, - "getStarted": { - "message": "시작하기" - }, - "advancedSetup": { - "message": "설정에서 고급 설정" - }, - "whatYouCanDo": { - "message": "í•  수 있는 작업:" - }, - "featurePrivateEmail": { - "message": "비공개 이메일 생성기" - }, - "featureCustomTags": { - "message": "사용자 지정 태그 및 프리셋" - }, - "featureGmailTricks": { - "message": "Gmail 고급 팁" - }, - "welcomeFooter": { - "message": "모든 데이터는 로컬에 저장됩니다. 추적 없음, 서버 없음." - }, - "favoritesSaved": { - "message": "$COUNT$ê°œ 저장됨", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "clickStarHint": { - "message": "기록의 별칭에서 별표를 클릭하여 여기에 추가하세요" - }, - "viewStatistics": { - "message": "통계 보기" - }, - "statistics": { - "message": "통계" - }, - "metricsTab": { - "message": "지표" - }, - "timelineTab": { - "message": "타임라인" - }, - "tagsTab": { - "message": "태그" - }, - "totalGenerated": { - "message": "총 생성 수" - }, - "createdToday": { - "message": "오늘 생성됨" - }, - "thisWeek": { - "message": "이번 주" - }, - "thisMonth": { - "message": "이번 달" - }, - "topTag": { - "message": "상위 태그" - }, - "totalTags": { - "message": "ì „ì²´ 태그" - }, - "noTagsYet": { - "message": "아직 태그가 없습니다" - }, - "disableInlineForSite": { - "message": "이 웹사이트에서 인라인 도우미 끄기" - }, - "inlineDisabledSites": { - "message": "인라인 도우미를 끈 웹사이트" - }, - "inlineDisabledSitesDescription": { - "message": "이 웹사이트에서는 인라인 아이콘과 빠른 팝업이 숨겨집니다." - }, - "noDisabledSites": { - "message": "비활성화된 웹사이트가 없습니다" - }, - "enableInlineForSite": { - "message": "사용" - }, - "reportReview": { - "message": "ì‹ ê³  / 리뷰" - }, - "percentLabel": { - "message": "$PERCENT$%", - "placeholders": { - "percent": { - "content": "$1" - } - } - }, - "retry": { - "message": "다시 시도" - }, - "enable": { - "message": "활성화" - }, - "storageError": { - "message": "기록을 로드할 수 없습니다. 저장소 접근을 확인하세요." - } + "extensionName": { + "message": "Gmail Alias Toolkit" + }, + "extensionDescription": { + "message": "+tag 주소와 프리셋으로 Gmail 별칭을 생성하고 관리하세요" + }, + "headerSubtitle": { + "message": "+tag 주소로 별칭 생성" + }, + "settings": { + "message": "설정" + }, + "back": { + "message": "뒤로" + }, + "close": { + "message": "닫기" + }, + "cancel": { + "message": "취소" + }, + "copy": { + "message": "복사" + }, + "copyAll": { + "message": "모두 복사" + }, + "copyToClipboard": { + "message": "클립보드에 복사" + }, + "activeGmailAddress": { + "message": "활성 Gmail 주소" + }, + "addNewAccount": { + "message": "새 계정 추가" + }, + "addAccount": { + "message": "계정 추가" + }, + "addNewAccountTitle": { + "message": "새 계정 추가" + }, + "emailPlaceholder": { + "message": "your.email" + }, + "accountLabelPlaceholder": { + "message": "라벨(선택 사항, 예: 업무, 개인)" + }, + "pressTabToAddGmail": { + "message": "@gmail.com을 추가하려면 $KEY$ 키를 누르세요", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "gmailWarning": { + "message": "Gmail 주소처럼 보이지 않습니다. 플러스 주소 지정은 Gmail에서 가장 잘 작동합니다." + }, + "random": { + "message": "무작위" + }, + "customTags": { + "message": "사용자 지정 태그" + }, + "gmailTricks": { + "message": "Gmail 팁" + }, + "tabTagsShort": { + "message": "태그" + }, + "tabTricksShort": { + "message": "팁" + }, + "generating": { + "message": "생성 중" + }, + "copied": { + "message": "복사됨" + }, + "switchToLightMode": { + "message": "라이트 모드로 전환" + }, + "switchToDarkMode": { + "message": "다크 모드로 전환" + }, + "aliasColumn": { + "message": "별칭" + }, + "copyEmailTooltip": { + "message": "$EMAIL$ - 클릭하여 복사", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "pageLabel": { + "message": "페이지 $PAGE$", + "placeholders": { + "page": { + "content": "$1" + } + } + }, + "dotTrick": { + "message": "점 트릭" + }, + "plusTags": { + "message": "플러스(+) 태그" + }, + "googlemail": { + "message": "Googlemail" + }, + "removeDots": { + "message": "점 제거" + }, + "dotPlus": { + "message": "점 + 플러스" + }, + "allCombos": { + "message": "모든 조합" + }, + "numberOfVariations": { + "message": "변형 수" + }, + "randomizeDotPositions": { + "message": "점 위치 무작위화" + }, + "sequential": { + "message": "순차" + }, + "generateTricks": { + "message": "팁 생성" + }, + "generatedVariations": { + "message": "생성된 변형" + }, + "gmailTrickInfoLabel": { + "message": "Gmail 팁:" + }, + "gmailTrickInfo": { + "message": "점은 무시되며 + 뒤의 모든 내용은 같은 받은편지함으로 전달됩니다" + }, + "format": { + "message": "형식" + }, + "privateMailFormat": { + "message": "비공개 메일(private-mail-xxxx)" + }, + "randomCharactersFormat": { + "message": "무작위 문자(abc123xy)" + }, + "randomWordsFormat": { + "message": "무작위 단어(happy-fox-42)" + }, + "timestampFormat": { + "message": "타임스탬프(1234567890)" + }, + "numberOfAliases": { + "message": "별칭 수" + }, + "generateRandomAliases": { + "message": "무작위 별칭 $COUNT$개$PLURAL$ 생성", + "placeholders": { + "count": { + "content": "$1" + }, + "plural": { + "content": "$2" + } + } + }, + "generatedAliases": { + "message": "생성된 별칭" + }, + "totalCount": { + "message": "총 $COUNT$개", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "copiedAliases": { + "message": "별칭 $COUNT$개를 복사했습니다!", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "failedToCopy": { + "message": "복사 실패" + }, + "formatPrivateMail": { + "message": "형식: private-mail-xxxx" + }, + "formatAlphanumeric": { + "message": "무작위 문자 8개" + }, + "formatWords": { + "message": "무작위 단어 2개" + }, + "formatTimestamp": { + "message": "Unix 타임스탬프" + }, + "tagPlaceholder": { + "message": "태그 입력(예: shopping, work)" + }, + "generate": { + "message": "생성" + }, + "yourPresets": { + "message": "내 프리셋" + }, + "example": { + "message": "예:" + }, + "copyExample": { + "message": "예시 복사" + }, + "recentAliases": { + "message": "최근 별칭" + }, + "favorites": { + "message": "즐겨찾기" + }, + "exportAsCsv": { + "message": "CSV로 내보내기" + }, + "exportAsJson": { + "message": "JSON으로 내보내기" + }, + "selectAliases": { + "message": "별칭 선택" + }, + "select": { + "message": "선택" + }, + "starredCount": { + "message": "별표 표시 $COUNT$개", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deselectAll": { + "message": "전체 선택 해제" + }, + "selectAll": { + "message": "전체 선택" + }, + "selectedCount": { + "message": "$COUNT$개 선택됨", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deleteCount": { + "message": "$COUNT$개 삭제", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "allCount": { + "message": "전체($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "favoritesCount": { + "message": "즐겨찾기($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "searchAliases": { + "message": "별칭 검색..." + }, + "allTags": { + "message": "모든 태그" + }, + "mostRecent": { + "message": "최신순" + }, + "az": { + "message": "A-Z" + }, + "noFavoritesYet": { + "message": "아직 즐겨찾기가 없습니다" + }, + "starEmailsHint": { + "message": "기록의 이메일에 별표를 표시하면 여기에서 빠르게 접근할 수 있습니다" + }, + "noResultsFound": { + "message": "결과를 찾을 수 없습니다" + }, + "differentSearchHint": { + "message": "다른 검색어나 필터를 시도해 보세요" + }, + "showQrCode": { + "message": "QR 코드 표시" + }, + "removeFromFavorites": { + "message": "즐겨찾기에서 제거" + }, + "addToFavorites": { + "message": "즐겨찾기에 추가" + }, + "showingRange": { + "message": "총 $TOTAL$개 중 $START$-$END$ 표시", + "placeholders": { + "start": { + "content": "$1" + }, + "end": { + "content": "$2" + }, + "total": { + "content": "$3" + } + } + }, + "perPage": { + "message": "$COUNT$ / 페이지", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "firstPage": { + "message": "첫 페이지" + }, + "previousPage": { + "message": "이전 페이지" + }, + "nextPage": { + "message": "다음 페이지" + }, + "lastPage": { + "message": "마지막 페이지" + }, + "scanToCopyAlias": { + "message": "스캔하여 별칭 복사" + }, + "general": { + "message": "일반" + }, + "accounts": { + "message": "계정" + }, + "changelog": { + "message": "변경 로그" + }, + "appearanceDisplay": { + "message": "모양 및 표시" + }, + "theme": { + "message": "테마" + }, + "themeLight": { + "message": "라이트" + }, + "themeDark": { + "message": "다크" + }, + "themeAuto": { + "message": "시스템(자동)" + }, + "badgeCounter": { + "message": "배지 카운터" + }, + "badgeNone": { + "message": "없음(숨김)" + }, + "badgeTotal": { + "message": "기록의 총합" + }, + "badgeAllTime": { + "message": "총 생성 수(전체 기간)" + }, + "badgeToday": { + "message": "오늘 생성됨" + }, + "badgeWeek": { + "message": "이번 주" + }, + "copyNotifications": { + "message": "복사 알림" + }, + "aliasGeneration": { + "message": "별칭 생성" + }, + "randomAliasFormat": { + "message": "무작위 별칭 형식" + }, + "autoSaveLimit": { + "message": "자동 저장 제한" + }, + "aliasesLimit": { + "message": "별칭 $COUNT$개", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "customPresets": { + "message": "사용자 지정 프리셋" + }, + "label": { + "message": "라벨" + }, + "tag": { + "message": "태그" + }, + "addPreset": { + "message": "+ 프리셋 추가" + }, + "dataManagement": { + "message": "데이터 관리" + }, + "export": { + "message": "내보내기" + }, + "import": { + "message": "가져오기" + }, + "clear": { + "message": "지우기" + }, + "resetSettings": { + "message": "모든 설정을 기본값으로 재설정" + }, + "resetSettingsTitle": { + "message": "설정을 재설정할까요?" + }, + "resetSettingsMessage": { + "message": "모든 설정이 기본값으로 복원됩니다." + }, + "reset": { + "message": "재설정" + }, + "clearHistoryTitle": { + "message": "최근 별칭을 지울까요?" + }, + "clearHistoryMessage": { + "message": "최근 기록 목록에서 모든 별칭을 제거합니다." + }, + "emailAccounts": { + "message": "이메일 계정" + }, + "manageAccountsDescription": { + "message": "Gmail 계정을 관리하세요. 각 계정에는 자체 기록, 통계, 즐겨찾기가 있습니다." + }, + "noAccountsFound": { + "message": "계정을 찾을 수 없습니다. 기본 화면에서 계정을 추가하세요." + }, + "emailAddress": { + "message": "이메일 주소" + }, + "accountLabel": { + "message": "계정 라벨" + }, + "emailAddressPlaceholder": { + "message": "your.email@gmail.com" + }, + "emailChangeWarning": { + "message": "이메일을 변경하면 모든 데이터가 새 이메일 주소로 이전됩니다" + }, + "saveChanges": { + "message": "변경 사항 저장" + }, + "active": { + "message": "활성" + }, + "editAccount": { + "message": "계정 편집" + }, + "cannotDeleteLastAccountTitle": { + "message": "마지막 계정은 삭제할 수 없습니다" + }, + "deleteThisAccount": { + "message": "이 계정 삭제" + }, + "deleteAccountTitle": { + "message": "계정을 삭제할까요?" + }, + "deleteAccountMessage": { + "message": "\"$LABEL$\"($EMAIL$)을 삭제할까요?\n\n다음 항목이 영구적으로 삭제됩니다:\n- 이 계정의 모든 기록\n- 모든 통계\n- 모든 즐겨찾기\n\n이 작업은 되돌릴 수 없습니다.", + "placeholders": { + "label": { + "content": "$1" + }, + "email": { + "content": "$2" + } + } + }, + "delete": { + "message": "삭제" + }, + "changeAccountEmailTitle": { + "message": "계정 이메일을 변경할까요?" + }, + "changeAccountEmailMessage": { + "message": "이메일을\n$OLD_EMAIL$\n에서\n$NEW_EMAIL$\n으로 변경할까요?\n\n다음 작업이 수행됩니다:\n- 모든 기록, 통계, 즐겨찾기를 새 이메일로 이전\n- 계정 이메일 업데이트\n- 이전 이메일과 연결된 데이터 삭제\n\n계속할까요?", + "placeholders": { + "old_email": { + "content": "$1" + }, + "new_email": { + "content": "$2" + } + } + }, + "changeEmail": { + "message": "이메일 변경" + }, + "menuForThisWebsite": { + "message": "이 웹사이트용" + }, + "menuLoading": { + "message": "불러오는 중..." + }, + "menuRandomEmailAlias": { + "message": "무작위 이메일 별칭" + }, + "menuCustomTags": { + "message": "사용자 지정 태그" + }, + "menuNoPresets": { + "message": "프리셋 없음 - 설정에서 추가" + }, + "menuGmailTricks": { + "message": "Gmail 팁" + }, + "menuDotVariation": { + "message": "점 변형" + }, + "menuGooglemailDomain": { + "message": "Googlemail 도메인" + }, + "menuRemoveAllDots": { + "message": "모든 점 제거" + }, + "toastPresetAdded": { + "message": "프리셋이 추가되었습니다" + }, + "toastPresetRemoved": { + "message": "프리셋이 제거되었습니다" + }, + "toastSettingsExported": { + "message": "설정을 내보냈습니다" + }, + "toastSettingsImported": { + "message": "설정을 가져왔습니다" + }, + "toastImportFailed": { + "message": "가져오기 실패 - 잘못된 파일" + }, + "toastSettingsReset": { + "message": "설정이 기본값으로 재설정되었습니다" + }, + "toastAccountSwitched": { + "message": "계정이 전환되었습니다" + }, + "toastAccountDeleted": { + "message": "계정이 삭제되었습니다" + }, + "toastAccountUpdated": { + "message": "계정이 업데이트되었습니다" + }, + "toastAccountAdded": { + "message": "$LABEL$ 추가됨", + "placeholders": { + "label": { + "content": "$1" + } + } + }, + "errorLabelRequired": { + "message": "라벨은 비워 둘 수 없습니다" + }, + "errorInvalidEmail": { + "message": "유효한 이메일 주소를 입력하세요" + }, + "errorDuplicateEmail": { + "message": "이 이메일 주소는 이미 다른 계정에서 사용 중입니다" + }, + "errorEnterEmail": { + "message": "이메일 주소를 입력하세요" + }, + "errorAccountExists": { + "message": "이 계정은 이미 존재합니다" + }, + "toastQrFailed": { + "message": "QR 코드 생성 실패" + }, + "toastExportedAliases": { + "message": "별칭 $COUNT$개를 내보냈습니다", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastDeletedAliases": { + "message": "별칭 $COUNT$개를 삭제했습니다", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastHistoryCleared": { + "message": "기록이 지워졌습니다" + }, + "toastFavoriteAdded": { + "message": "즐겨찾기에 추가됨" + }, + "toastFavoriteRemoved": { + "message": "즐겨찾기에서 제거됨" + }, + "toastCopiedEmail": { + "message": "$EMAIL$ 복사됨", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "toastCopyFailed": { + "message": "복사 실패" + }, + "welcomeTitle": { + "message": "Gmail Alias Toolkit에 오신 것을 환영합니다" + }, + "welcomeSubtitle": { + "message": "개인정보 보호와 정리를 위해 무제한 이메일 별칭을 생성하세요" + }, + "letsGetStarted": { + "message": "시작해 봅시다" + }, + "enterGmailAddress": { + "message": "Gmail 주소를 입력하세요" + }, + "pressTabForGmail": { + "message": "@gmail.com에는 $KEY$ 키를 누르세요", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "settingUp": { + "message": "설정 중..." + }, + "getStarted": { + "message": "시작하기" + }, + "advancedSetup": { + "message": "설정에서 고급 설정" + }, + "whatYouCanDo": { + "message": "할 수 있는 작업:" + }, + "featurePrivateEmail": { + "message": "비공개 이메일 생성기" + }, + "featureCustomTags": { + "message": "사용자 지정 태그 및 프리셋" + }, + "featureGmailTricks": { + "message": "Gmail 고급 팁" + }, + "welcomeFooter": { + "message": "모든 데이터는 로컬에 저장됩니다. 추적 없음, 서버 없음." + }, + "favoritesSaved": { + "message": "$COUNT$개 저장됨", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "clickStarHint": { + "message": "기록의 별칭에서 별표를 클릭하여 여기에 추가하세요" + }, + "viewStatistics": { + "message": "통계 보기" + }, + "statistics": { + "message": "통계" + }, + "metricsTab": { + "message": "지표" + }, + "timelineTab": { + "message": "타임라인" + }, + "tagsTab": { + "message": "태그" + }, + "totalGenerated": { + "message": "총 생성 수" + }, + "createdToday": { + "message": "오늘 생성됨" + }, + "thisWeek": { + "message": "이번 주" + }, + "thisMonth": { + "message": "이번 달" + }, + "topTag": { + "message": "상위 태그" + }, + "totalTags": { + "message": "전체 태그" + }, + "noTagsYet": { + "message": "아직 태그가 없습니다" + }, + "disableInlineForSite": { + "message": "이 웹사이트에서 인라인 도우미 끄기" + }, + "inlineDisabledSites": { + "message": "인라인 도우미를 끈 웹사이트" + }, + "inlineDisabledSitesDescription": { + "message": "이 웹사이트에서는 인라인 아이콘과 빠른 팝업이 숨겨집니다." + }, + "noDisabledSites": { + "message": "비활성화된 웹사이트가 없습니다" + }, + "enableInlineForSite": { + "message": "사용" + }, + "reportReview": { + "message": "신고 / 리뷰" + }, + "percentLabel": { + "message": "$PERCENT$%", + "placeholders": { + "percent": { + "content": "$1" + } + } + }, + "enable": { + "message": "활성화" + }, + "retry": { + "message": "다시 시도" + }, + "storageError": { + "message": "기록을 로드할 수 없습니다. 저장소 접근을 확인하세요." + } } diff --git a/public/_locales/pl/messages.json b/public/_locales/pl/messages.json index b53e69bb..30ed7769 100644 --- a/public/_locales/pl/messages.json +++ b/public/_locales/pl/messages.json @@ -1,774 +1,774 @@ { - "extensionName": { - "message": "Gmail Alias Toolkit" - }, - "extensionDescription": { - "message": "Twórz aliasy Gmail i zarzÄ…dzaj nimi za pomocÄ… adresów +tag oraz gotowych ustawieÅ„" - }, - "headerSubtitle": { - "message": "Generuj aliasy za pomocÄ… adresów +tag" - }, - "settings": { - "message": "Ustawienia" - }, - "back": { - "message": "Wstecz" - }, - "close": { - "message": "Zamknij" - }, - "cancel": { - "message": "Anuluj" - }, - "copy": { - "message": "Kopiuj" - }, - "copyAll": { - "message": "Kopiuj wszystko" - }, - "copyToClipboard": { - "message": "Kopiuj do schowka" - }, - "activeGmailAddress": { - "message": "Aktywny adres Gmail" - }, - "addNewAccount": { - "message": "Dodaj nowe konto" - }, - "addAccount": { - "message": "Dodaj konto" - }, - "addNewAccountTitle": { - "message": "Dodaj nowe konto" - }, - "emailPlaceholder": { - "message": "twoj.email" - }, - "accountLabelPlaceholder": { - "message": "Etykieta (opcjonalnie, np. Praca, Prywatne)" - }, - "pressTabToAddGmail": { - "message": "NaciÅ›nij $KEY$, aby dodać @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "gmailWarning": { - "message": "To nie wyglÄ…da jak adres Gmail. Adresowanie plus dziaÅ‚a najlepiej z Gmail." - }, - "random": { - "message": "Losowo" - }, - "customTags": { - "message": "Niestandardowe tagi" - }, - "gmailTricks": { - "message": "Triki Gmail" - }, - "tabTagsShort": { - "message": "Tagi" - }, - "tabTricksShort": { - "message": "Triki" - }, - "generating": { - "message": "Generowanie" - }, - "copied": { - "message": "Skopiowano" - }, - "switchToLightMode": { - "message": "Przełącz na tryb jasny" - }, - "switchToDarkMode": { - "message": "Przełącz na tryb ciemny" - }, - "aliasColumn": { - "message": "Alias" - }, - "copyEmailTooltip": { - "message": "$EMAIL$ - kliknij, aby skopiować", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "pageLabel": { - "message": "Strona $PAGE$", - "placeholders": { - "page": { - "content": "$1" - } - } - }, - "dotTrick": { - "message": "Trik z kropkami" - }, - "plusTags": { - "message": "Tagi Plus (+)" - }, - "googlemail": { - "message": "Googlemail" - }, - "removeDots": { - "message": "UsuÅ„ kropki" - }, - "dotPlus": { - "message": "Kropka + Plus" - }, - "allCombos": { - "message": "Wszystkie kombinacje" - }, - "numberOfVariations": { - "message": "Liczba wariantów" - }, - "randomizeDotPositions": { - "message": "Losuj pozycje kropek" - }, - "sequential": { - "message": "Sekwencyjnie" - }, - "generateTricks": { - "message": "Generuj triki" - }, - "generatedVariations": { - "message": "Wygenerowane warianty" - }, - "gmailTrickInfoLabel": { - "message": "Trik Gmail:" - }, - "gmailTrickInfo": { - "message": "Kropki sÄ… ignorowane, a wszystko po + trafia do tej samej skrzynki odbiorczej" - }, - "format": { - "message": "Format" - }, - "privateMailFormat": { - "message": "Prywatna poczta (private-mail-xxxx)" - }, - "randomCharactersFormat": { - "message": "Losowe znaki (abc123xy)" - }, - "randomWordsFormat": { - "message": "Losowe sÅ‚owa (happy-fox-42)" - }, - "timestampFormat": { - "message": "Znacznik czasu (1234567890)" - }, - "numberOfAliases": { - "message": "Liczba aliasów" - }, - "generateRandomAliases": { - "message": "Generuj $COUNT$ losowy alias$PLURAL$", - "placeholders": { - "count": { - "content": "$1" - }, - "plural": { - "content": "$2" - } - } - }, - "generatedAliases": { - "message": "Wygenerowane aliasy" - }, - "totalCount": { - "message": "$COUNT$ łącznie", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "copiedAliases": { - "message": "Skopiowano $COUNT$ aliasów!", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "failedToCopy": { - "message": "Nie udaÅ‚o siÄ™ skopiować" - }, - "formatPrivateMail": { - "message": "Format: private-mail-xxxx" - }, - "formatAlphanumeric": { - "message": "8 losowych znaków" - }, - "formatWords": { - "message": "2 losowe sÅ‚owa" - }, - "formatTimestamp": { - "message": "Znacznik czasu Unix" - }, - "tagPlaceholder": { - "message": "Wpisz tag (np. shopping, work)" - }, - "generate": { - "message": "Generuj" - }, - "yourPresets": { - "message": "Twoje presety" - }, - "example": { - "message": "PrzykÅ‚ad:" - }, - "copyExample": { - "message": "Kopiuj przykÅ‚ad" - }, - "recentAliases": { - "message": "Ostatnie aliasy" - }, - "favorites": { - "message": "Ulubione" - }, - "exportAsCsv": { - "message": "Eksportuj jako CSV" - }, - "exportAsJson": { - "message": "Eksportuj jako JSON" - }, - "selectAliases": { - "message": "Wybierz aliasy" - }, - "select": { - "message": "Wybierz" - }, - "starredCount": { - "message": "$COUNT$ oznaczono gwiazdkÄ…", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deselectAll": { - "message": "Odznacz wszystko" - }, - "selectAll": { - "message": "Zaznacz wszystko" - }, - "selectedCount": { - "message": "Wybrano $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deleteCount": { - "message": "UsuÅ„ $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "allCount": { - "message": "Wszystkie ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "favoritesCount": { - "message": "Ulubione ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "searchAliases": { - "message": "Szukaj aliasów..." - }, - "allTags": { - "message": "Wszystkie tagi" - }, - "mostRecent": { - "message": "Najnowsze" - }, - "az": { - "message": "A-Z" - }, - "noFavoritesYet": { - "message": "Brak ulubionych" - }, - "starEmailsHint": { - "message": "Oznacz e-maile z historii gwiazdkÄ…, aby mieć do nich szybki dostÄ™p tutaj" - }, - "noResultsFound": { - "message": "Nie znaleziono wyników" - }, - "differentSearchHint": { - "message": "Spróbuj innego wyszukiwania lub filtra" - }, - "showQrCode": { - "message": "Pokaż kod QR" - }, - "removeFromFavorites": { - "message": "UsuÅ„ z ulubionych" - }, - "addToFavorites": { - "message": "Dodaj do ulubionych" - }, - "showingRange": { - "message": "WyÅ›wietlanie $START$-$END$ z $TOTAL$", - "placeholders": { - "start": { - "content": "$1" - }, - "end": { - "content": "$2" - }, - "total": { - "content": "$3" - } - } - }, - "perPage": { - "message": "$COUNT$ / strona", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "firstPage": { - "message": "Pierwsza strona" - }, - "previousPage": { - "message": "Poprzednia strona" - }, - "nextPage": { - "message": "NastÄ™pna strona" - }, - "lastPage": { - "message": "Ostatnia strona" - }, - "scanToCopyAlias": { - "message": "Zeskanuj, aby skopiować alias" - }, - "general": { - "message": "Ogólne" - }, - "accounts": { - "message": "Konta" - }, - "changelog": { - "message": "Dziennik zmian" - }, - "appearanceDisplay": { - "message": "WyglÄ…d i wyÅ›wietlanie" - }, - "theme": { - "message": "Motyw" - }, - "themeLight": { - "message": "Jasny" - }, - "themeDark": { - "message": "Ciemny" - }, - "themeAuto": { - "message": "Systemowy (Auto)" - }, - "badgeCounter": { - "message": "Licznik odznaki" - }, - "badgeNone": { - "message": "Brak (ukryty)" - }, - "badgeTotal": { - "message": "Łącznie w historii" - }, - "badgeAllTime": { - "message": "Łącznie wygenerowane (caÅ‚y czas)" - }, - "badgeToday": { - "message": "Utworzone dzisiaj" - }, - "badgeWeek": { - "message": "Ten tydzieÅ„" - }, - "copyNotifications": { - "message": "Powiadomienia kopiowania" - }, - "aliasGeneration": { - "message": "Generowanie aliasów" - }, - "randomAliasFormat": { - "message": "Format losowego aliasu" - }, - "autoSaveLimit": { - "message": "Limit automatycznego zapisu" - }, - "aliasesLimit": { - "message": "$COUNT$ aliasów", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "customPresets": { - "message": "Niestandardowe presety" - }, - "label": { - "message": "Etykieta" - }, - "tag": { - "message": "Tag" - }, - "addPreset": { - "message": "+ Dodaj preset" - }, - "dataManagement": { - "message": "ZarzÄ…dzanie danymi" - }, - "export": { - "message": "Eksport" - }, - "import": { - "message": "Import" - }, - "clear": { - "message": "Wyczyść" - }, - "resetSettings": { - "message": "Przywróć wszystkie ustawienia domyÅ›lne" - }, - "resetSettingsTitle": { - "message": "Zresetować ustawienia?" - }, - "resetSettingsMessage": { - "message": "To przywróci każde ustawienie do wartoÅ›ci domyÅ›lnej." - }, - "reset": { - "message": "Resetuj" - }, - "clearHistoryTitle": { - "message": "WyczyÅ›cić ostatnie aliasy?" - }, - "clearHistoryMessage": { - "message": "To usunie wszystkie aliasy z listy ostatniej historii." - }, - "emailAccounts": { - "message": "Konta e-mail" - }, - "manageAccountsDescription": { - "message": "ZarzÄ…dzaj swoimi kontami Gmail. Każde konto ma wÅ‚asnÄ… historiÄ™, statystyki i ulubione." - }, - "noAccountsFound": { - "message": "Nie znaleziono kont. Dodaj konto z ekranu głównego." - }, - "emailAddress": { - "message": "Adres e-mail" - }, - "accountLabel": { - "message": "Etykieta konta" - }, - "emailAddressPlaceholder": { - "message": "twoj.email@gmail.com" - }, - "emailChangeWarning": { - "message": "Zmiana e-maila przeniesie wszystkie dane na nowy adres e-mail" - }, - "saveChanges": { - "message": "Zapisz zmiany" - }, - "active": { - "message": "Aktywne" - }, - "editAccount": { - "message": "Edytuj konto" - }, - "cannotDeleteLastAccountTitle": { - "message": "Nie można usunąć ostatniego konta" - }, - "deleteThisAccount": { - "message": "UsuÅ„ to konto" - }, - "deleteAccountTitle": { - "message": "Usunąć konto?" - }, - "deleteAccountMessage": { - "message": "Usunąć \"$LABEL$\" ($EMAIL$)?\n\nTo trwale usunie:\n- Całą historiÄ™ tego konta\n- Wszystkie statystyki\n- Wszystkie ulubione\n\nTej akcji nie można cofnąć.", - "placeholders": { - "label": { - "content": "$1" - }, - "email": { - "content": "$2" - } - } - }, - "delete": { - "message": "UsuÅ„" - }, - "changeAccountEmailTitle": { - "message": "Zmienić e-mail konta?" - }, - "changeAccountEmailMessage": { - "message": "Zmienić e-mail z\n$OLD_EMAIL$\nna\n$NEW_EMAIL$?\n\nTo spowoduje:\n- MigracjÄ™ caÅ‚ej historii, statystyk i ulubionych na nowy e-mail\n- AktualizacjÄ™ e-maila konta\n- UsuniÄ™cie danych powiÄ…zanych ze starym e-mailem\n\nKontynuować?", - "placeholders": { - "old_email": { - "content": "$1" - }, - "new_email": { - "content": "$2" - } - } - }, - "changeEmail": { - "message": "ZmieÅ„ e-mail" - }, - "menuForThisWebsite": { - "message": "Dla tej witryny" - }, - "menuLoading": { - "message": "Ładowanie..." - }, - "menuRandomEmailAlias": { - "message": "Losowy alias e-mail" - }, - "menuCustomTags": { - "message": "Niestandardowe tagi" - }, - "menuNoPresets": { - "message": "Brak presetów - dodaj w Ustawieniach" - }, - "menuGmailTricks": { - "message": "Triki Gmail" - }, - "menuDotVariation": { - "message": "Wariant z kropkami" - }, - "menuGooglemailDomain": { - "message": "Domena Googlemail" - }, - "menuRemoveAllDots": { - "message": "UsuÅ„ wszystkie kropki" - }, - "toastPresetAdded": { - "message": "Preset dodany" - }, - "toastPresetRemoved": { - "message": "Preset usuniÄ™ty" - }, - "toastSettingsExported": { - "message": "Ustawienia wyeksportowane" - }, - "toastSettingsImported": { - "message": "Ustawienia zaimportowane" - }, - "toastImportFailed": { - "message": "Import nieudany - nieprawidÅ‚owy plik" - }, - "toastSettingsReset": { - "message": "Ustawienia przywrócone do domyÅ›lnych" - }, - "toastAccountSwitched": { - "message": "Konto przełączone" - }, - "toastAccountDeleted": { - "message": "Konto usuniÄ™te" - }, - "toastAccountUpdated": { - "message": "Konto zaktualizowane" - }, - "toastAccountAdded": { - "message": "Dodano $LABEL$", - "placeholders": { - "label": { - "content": "$1" - } - } - }, - "errorLabelRequired": { - "message": "Etykieta nie może być pusta" - }, - "errorInvalidEmail": { - "message": "Wpisz prawidÅ‚owy adres e-mail" - }, - "errorDuplicateEmail": { - "message": "Ten adres e-mail jest już używany przez inne konto" - }, - "errorEnterEmail": { - "message": "Wpisz adres e-mail" - }, - "errorAccountExists": { - "message": "To konto już istnieje" - }, - "toastQrFailed": { - "message": "Nie udaÅ‚o siÄ™ wygenerować kodu QR" - }, - "toastExportedAliases": { - "message": "Wyeksportowano $COUNT$ aliasów", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastDeletedAliases": { - "message": "UsuniÄ™to $COUNT$ aliasów", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastHistoryCleared": { - "message": "Historia wyczyszczona" - }, - "toastFavoriteAdded": { - "message": "Dodano do ulubionych" - }, - "toastFavoriteRemoved": { - "message": "UsuniÄ™to z ulubionych" - }, - "toastCopiedEmail": { - "message": "Skopiowano $EMAIL$", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "toastCopyFailed": { - "message": "Nie udaÅ‚o siÄ™ skopiować" - }, - "welcomeTitle": { - "message": "Witamy w Gmail Alias Toolkit" - }, - "welcomeSubtitle": { - "message": "Generuj nieograniczone aliasy e-mail dla prywatnoÅ›ci i organizacji" - }, - "letsGetStarted": { - "message": "Zaczynajmy" - }, - "enterGmailAddress": { - "message": "Wpisz swój adres Gmail" - }, - "pressTabForGmail": { - "message": "NaciÅ›nij $KEY$ dla @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "settingUp": { - "message": "Konfiguracja..." - }, - "getStarted": { - "message": "Rozpocznij" - }, - "advancedSetup": { - "message": "Konfiguracja zaawansowana w Ustawieniach" - }, - "whatYouCanDo": { - "message": "Co możesz zrobić:" - }, - "featurePrivateEmail": { - "message": "Generator prywatnych e-maili" - }, - "featureCustomTags": { - "message": "Niestandardowe tagi i presety" - }, - "featureGmailTricks": { - "message": "Zaawansowane triki Gmail" - }, - "welcomeFooter": { - "message": "Wszystkie dane sÄ… przechowywane lokalnie. Bez Å›ledzenia, bez serwera." - }, - "favoritesSaved": { - "message": "Zapisano $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "clickStarHint": { - "message": "Kliknij gwiazdkÄ™ na dowolnym aliasie w historii, aby dodać go tutaj" - }, - "viewStatistics": { - "message": "WyÅ›wietl statystyki" - }, - "statistics": { - "message": "Statystyki" - }, - "metricsTab": { - "message": "Metryki" - }, - "timelineTab": { - "message": "OÅ› czasu" - }, - "tagsTab": { - "message": "Tagi" - }, - "totalGenerated": { - "message": "Łącznie wygenerowane" - }, - "createdToday": { - "message": "Utworzone dzisiaj" - }, - "thisWeek": { - "message": "Ten tydzieÅ„" - }, - "thisMonth": { - "message": "Ten miesiÄ…c" - }, - "topTag": { - "message": "Najlepszy tag" - }, - "totalTags": { - "message": "Łącznie tagów" - }, - "noTagsYet": { - "message": "Brak tagów" - }, - "disableInlineForSite": { - "message": "Wyłącz pomocnika inline w tej witrynie" - }, - "inlineDisabledSites": { - "message": "Witryny z wyłączonym pomocnikiem inline" - }, - "inlineDisabledSitesDescription": { - "message": "Ikona inline i szybkie okno sÄ… ukryte w tych witrynach." - }, - "noDisabledSites": { - "message": "Brak wyłączonych witryn" - }, - "enableInlineForSite": { - "message": "Włącz" - }, - "reportReview": { - "message": "ZgÅ‚oÅ› / OceÅ„" - }, - "percentLabel": { - "message": "$PERCENT$%", - "placeholders": { - "percent": { - "content": "$1" - } - } - }, - "retry": { - "message": "Ponownie" - }, - "enable": { - "message": "Włącz" - }, - "storageError": { - "message": "Nie udało się załadować historii. Sprawdź dostęp do pamięci." - } + "extensionName": { + "message": "Gmail Alias Toolkit" + }, + "extensionDescription": { + "message": "Twórz aliasy Gmail i zarządzaj nimi za pomocą adresów +tag oraz gotowych ustawień" + }, + "headerSubtitle": { + "message": "Generuj aliasy za pomocą adresów +tag" + }, + "settings": { + "message": "Ustawienia" + }, + "back": { + "message": "Wstecz" + }, + "close": { + "message": "Zamknij" + }, + "cancel": { + "message": "Anuluj" + }, + "copy": { + "message": "Kopiuj" + }, + "copyAll": { + "message": "Kopiuj wszystko" + }, + "copyToClipboard": { + "message": "Kopiuj do schowka" + }, + "activeGmailAddress": { + "message": "Aktywny adres Gmail" + }, + "addNewAccount": { + "message": "Dodaj nowe konto" + }, + "addAccount": { + "message": "Dodaj konto" + }, + "addNewAccountTitle": { + "message": "Dodaj nowe konto" + }, + "emailPlaceholder": { + "message": "twoj.email" + }, + "accountLabelPlaceholder": { + "message": "Etykieta (opcjonalnie, np. Praca, Prywatne)" + }, + "pressTabToAddGmail": { + "message": "Naciśnij $KEY$, aby dodać @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "gmailWarning": { + "message": "To nie wygląda jak adres Gmail. Adresowanie plus działa najlepiej z Gmail." + }, + "random": { + "message": "Losowo" + }, + "customTags": { + "message": "Niestandardowe tagi" + }, + "gmailTricks": { + "message": "Triki Gmail" + }, + "tabTagsShort": { + "message": "Tagi" + }, + "tabTricksShort": { + "message": "Triki" + }, + "generating": { + "message": "Generowanie" + }, + "copied": { + "message": "Skopiowano" + }, + "switchToLightMode": { + "message": "Przełącz na tryb jasny" + }, + "switchToDarkMode": { + "message": "Przełącz na tryb ciemny" + }, + "aliasColumn": { + "message": "Alias" + }, + "copyEmailTooltip": { + "message": "$EMAIL$ - kliknij, aby skopiować", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "pageLabel": { + "message": "Strona $PAGE$", + "placeholders": { + "page": { + "content": "$1" + } + } + }, + "dotTrick": { + "message": "Trik z kropkami" + }, + "plusTags": { + "message": "Tagi Plus (+)" + }, + "googlemail": { + "message": "Googlemail" + }, + "removeDots": { + "message": "Usuń kropki" + }, + "dotPlus": { + "message": "Kropka + Plus" + }, + "allCombos": { + "message": "Wszystkie kombinacje" + }, + "numberOfVariations": { + "message": "Liczba wariantów" + }, + "randomizeDotPositions": { + "message": "Losuj pozycje kropek" + }, + "sequential": { + "message": "Sekwencyjnie" + }, + "generateTricks": { + "message": "Generuj triki" + }, + "generatedVariations": { + "message": "Wygenerowane warianty" + }, + "gmailTrickInfoLabel": { + "message": "Trik Gmail:" + }, + "gmailTrickInfo": { + "message": "Kropki są ignorowane, a wszystko po + trafia do tej samej skrzynki odbiorczej" + }, + "format": { + "message": "Format" + }, + "privateMailFormat": { + "message": "Prywatna poczta (private-mail-xxxx)" + }, + "randomCharactersFormat": { + "message": "Losowe znaki (abc123xy)" + }, + "randomWordsFormat": { + "message": "Losowe słowa (happy-fox-42)" + }, + "timestampFormat": { + "message": "Znacznik czasu (1234567890)" + }, + "numberOfAliases": { + "message": "Liczba aliasów" + }, + "generateRandomAliases": { + "message": "Generuj $COUNT$ losowy alias$PLURAL$", + "placeholders": { + "count": { + "content": "$1" + }, + "plural": { + "content": "$2" + } + } + }, + "generatedAliases": { + "message": "Wygenerowane aliasy" + }, + "totalCount": { + "message": "$COUNT$ łącznie", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "copiedAliases": { + "message": "Skopiowano $COUNT$ aliasów!", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "failedToCopy": { + "message": "Nie udało się skopiować" + }, + "formatPrivateMail": { + "message": "Format: private-mail-xxxx" + }, + "formatAlphanumeric": { + "message": "8 losowych znaków" + }, + "formatWords": { + "message": "2 losowe słowa" + }, + "formatTimestamp": { + "message": "Znacznik czasu Unix" + }, + "tagPlaceholder": { + "message": "Wpisz tag (np. shopping, work)" + }, + "generate": { + "message": "Generuj" + }, + "yourPresets": { + "message": "Twoje presety" + }, + "example": { + "message": "Przykład:" + }, + "copyExample": { + "message": "Kopiuj przykład" + }, + "recentAliases": { + "message": "Ostatnie aliasy" + }, + "favorites": { + "message": "Ulubione" + }, + "exportAsCsv": { + "message": "Eksportuj jako CSV" + }, + "exportAsJson": { + "message": "Eksportuj jako JSON" + }, + "selectAliases": { + "message": "Wybierz aliasy" + }, + "select": { + "message": "Wybierz" + }, + "starredCount": { + "message": "$COUNT$ oznaczono gwiazdką", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deselectAll": { + "message": "Odznacz wszystko" + }, + "selectAll": { + "message": "Zaznacz wszystko" + }, + "selectedCount": { + "message": "Wybrano $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deleteCount": { + "message": "Usuń $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "allCount": { + "message": "Wszystkie ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "favoritesCount": { + "message": "Ulubione ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "searchAliases": { + "message": "Szukaj aliasów..." + }, + "allTags": { + "message": "Wszystkie tagi" + }, + "mostRecent": { + "message": "Najnowsze" + }, + "az": { + "message": "A-Z" + }, + "noFavoritesYet": { + "message": "Brak ulubionych" + }, + "starEmailsHint": { + "message": "Oznacz e-maile z historii gwiazdką, aby mieć do nich szybki dostęp tutaj" + }, + "noResultsFound": { + "message": "Nie znaleziono wyników" + }, + "differentSearchHint": { + "message": "Spróbuj innego wyszukiwania lub filtra" + }, + "showQrCode": { + "message": "Pokaż kod QR" + }, + "removeFromFavorites": { + "message": "Usuń z ulubionych" + }, + "addToFavorites": { + "message": "Dodaj do ulubionych" + }, + "showingRange": { + "message": "Wyświetlanie $START$-$END$ z $TOTAL$", + "placeholders": { + "start": { + "content": "$1" + }, + "end": { + "content": "$2" + }, + "total": { + "content": "$3" + } + } + }, + "perPage": { + "message": "$COUNT$ / strona", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "firstPage": { + "message": "Pierwsza strona" + }, + "previousPage": { + "message": "Poprzednia strona" + }, + "nextPage": { + "message": "Następna strona" + }, + "lastPage": { + "message": "Ostatnia strona" + }, + "scanToCopyAlias": { + "message": "Zeskanuj, aby skopiować alias" + }, + "general": { + "message": "Ogólne" + }, + "accounts": { + "message": "Konta" + }, + "changelog": { + "message": "Dziennik zmian" + }, + "appearanceDisplay": { + "message": "Wygląd i wyświetlanie" + }, + "theme": { + "message": "Motyw" + }, + "themeLight": { + "message": "Jasny" + }, + "themeDark": { + "message": "Ciemny" + }, + "themeAuto": { + "message": "Systemowy (Auto)" + }, + "badgeCounter": { + "message": "Licznik odznaki" + }, + "badgeNone": { + "message": "Brak (ukryty)" + }, + "badgeTotal": { + "message": "Łącznie w historii" + }, + "badgeAllTime": { + "message": "Łącznie wygenerowane (cały czas)" + }, + "badgeToday": { + "message": "Utworzone dzisiaj" + }, + "badgeWeek": { + "message": "Ten tydzień" + }, + "copyNotifications": { + "message": "Powiadomienia kopiowania" + }, + "aliasGeneration": { + "message": "Generowanie aliasów" + }, + "randomAliasFormat": { + "message": "Format losowego aliasu" + }, + "autoSaveLimit": { + "message": "Limit automatycznego zapisu" + }, + "aliasesLimit": { + "message": "$COUNT$ aliasów", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "customPresets": { + "message": "Niestandardowe presety" + }, + "label": { + "message": "Etykieta" + }, + "tag": { + "message": "Tag" + }, + "addPreset": { + "message": "+ Dodaj preset" + }, + "dataManagement": { + "message": "Zarządzanie danymi" + }, + "export": { + "message": "Eksport" + }, + "import": { + "message": "Import" + }, + "clear": { + "message": "Wyczyść" + }, + "resetSettings": { + "message": "Przywróć wszystkie ustawienia domyślne" + }, + "resetSettingsTitle": { + "message": "Zresetować ustawienia?" + }, + "resetSettingsMessage": { + "message": "To przywróci każde ustawienie do wartości domyślnej." + }, + "reset": { + "message": "Resetuj" + }, + "clearHistoryTitle": { + "message": "Wyczyścić ostatnie aliasy?" + }, + "clearHistoryMessage": { + "message": "To usunie wszystkie aliasy z listy ostatniej historii." + }, + "emailAccounts": { + "message": "Konta e-mail" + }, + "manageAccountsDescription": { + "message": "Zarządzaj swoimi kontami Gmail. Każde konto ma własną historię, statystyki i ulubione." + }, + "noAccountsFound": { + "message": "Nie znaleziono kont. Dodaj konto z ekranu głównego." + }, + "emailAddress": { + "message": "Adres e-mail" + }, + "accountLabel": { + "message": "Etykieta konta" + }, + "emailAddressPlaceholder": { + "message": "twoj.email@gmail.com" + }, + "emailChangeWarning": { + "message": "Zmiana e-maila przeniesie wszystkie dane na nowy adres e-mail" + }, + "saveChanges": { + "message": "Zapisz zmiany" + }, + "active": { + "message": "Aktywne" + }, + "editAccount": { + "message": "Edytuj konto" + }, + "cannotDeleteLastAccountTitle": { + "message": "Nie można usunąć ostatniego konta" + }, + "deleteThisAccount": { + "message": "Usuń to konto" + }, + "deleteAccountTitle": { + "message": "Usunąć konto?" + }, + "deleteAccountMessage": { + "message": "Usunąć \"$LABEL$\" ($EMAIL$)?\n\nTo trwale usunie:\n- Całą historię tego konta\n- Wszystkie statystyki\n- Wszystkie ulubione\n\nTej akcji nie można cofnąć.", + "placeholders": { + "label": { + "content": "$1" + }, + "email": { + "content": "$2" + } + } + }, + "delete": { + "message": "Usuń" + }, + "changeAccountEmailTitle": { + "message": "Zmienić e-mail konta?" + }, + "changeAccountEmailMessage": { + "message": "Zmienić e-mail z\n$OLD_EMAIL$\nna\n$NEW_EMAIL$?\n\nTo spowoduje:\n- Migrację całej historii, statystyk i ulubionych na nowy e-mail\n- Aktualizację e-maila konta\n- Usunięcie danych powiązanych ze starym e-mailem\n\nKontynuować?", + "placeholders": { + "old_email": { + "content": "$1" + }, + "new_email": { + "content": "$2" + } + } + }, + "changeEmail": { + "message": "Zmień e-mail" + }, + "menuForThisWebsite": { + "message": "Dla tej witryny" + }, + "menuLoading": { + "message": "Ładowanie..." + }, + "menuRandomEmailAlias": { + "message": "Losowy alias e-mail" + }, + "menuCustomTags": { + "message": "Niestandardowe tagi" + }, + "menuNoPresets": { + "message": "Brak presetów - dodaj w Ustawieniach" + }, + "menuGmailTricks": { + "message": "Triki Gmail" + }, + "menuDotVariation": { + "message": "Wariant z kropkami" + }, + "menuGooglemailDomain": { + "message": "Domena Googlemail" + }, + "menuRemoveAllDots": { + "message": "Usuń wszystkie kropki" + }, + "toastPresetAdded": { + "message": "Preset dodany" + }, + "toastPresetRemoved": { + "message": "Preset usunięty" + }, + "toastSettingsExported": { + "message": "Ustawienia wyeksportowane" + }, + "toastSettingsImported": { + "message": "Ustawienia zaimportowane" + }, + "toastImportFailed": { + "message": "Import nieudany - nieprawidłowy plik" + }, + "toastSettingsReset": { + "message": "Ustawienia przywrócone do domyślnych" + }, + "toastAccountSwitched": { + "message": "Konto przełączone" + }, + "toastAccountDeleted": { + "message": "Konto usunięte" + }, + "toastAccountUpdated": { + "message": "Konto zaktualizowane" + }, + "toastAccountAdded": { + "message": "Dodano $LABEL$", + "placeholders": { + "label": { + "content": "$1" + } + } + }, + "errorLabelRequired": { + "message": "Etykieta nie może być pusta" + }, + "errorInvalidEmail": { + "message": "Wpisz prawidłowy adres e-mail" + }, + "errorDuplicateEmail": { + "message": "Ten adres e-mail jest już używany przez inne konto" + }, + "errorEnterEmail": { + "message": "Wpisz adres e-mail" + }, + "errorAccountExists": { + "message": "To konto już istnieje" + }, + "toastQrFailed": { + "message": "Nie udało się wygenerować kodu QR" + }, + "toastExportedAliases": { + "message": "Wyeksportowano $COUNT$ aliasów", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastDeletedAliases": { + "message": "Usunięto $COUNT$ aliasów", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastHistoryCleared": { + "message": "Historia wyczyszczona" + }, + "toastFavoriteAdded": { + "message": "Dodano do ulubionych" + }, + "toastFavoriteRemoved": { + "message": "Usunięto z ulubionych" + }, + "toastCopiedEmail": { + "message": "Skopiowano $EMAIL$", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "toastCopyFailed": { + "message": "Nie udało się skopiować" + }, + "welcomeTitle": { + "message": "Witamy w Gmail Alias Toolkit" + }, + "welcomeSubtitle": { + "message": "Generuj nieograniczone aliasy e-mail dla prywatności i organizacji" + }, + "letsGetStarted": { + "message": "Zaczynajmy" + }, + "enterGmailAddress": { + "message": "Wpisz swój adres Gmail" + }, + "pressTabForGmail": { + "message": "Naciśnij $KEY$ dla @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "settingUp": { + "message": "Konfiguracja..." + }, + "getStarted": { + "message": "Rozpocznij" + }, + "advancedSetup": { + "message": "Konfiguracja zaawansowana w Ustawieniach" + }, + "whatYouCanDo": { + "message": "Co możesz zrobić:" + }, + "featurePrivateEmail": { + "message": "Generator prywatnych e-maili" + }, + "featureCustomTags": { + "message": "Niestandardowe tagi i presety" + }, + "featureGmailTricks": { + "message": "Zaawansowane triki Gmail" + }, + "welcomeFooter": { + "message": "Wszystkie dane są przechowywane lokalnie. Bez śledzenia, bez serwera." + }, + "favoritesSaved": { + "message": "Zapisano $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "clickStarHint": { + "message": "Kliknij gwiazdkę na dowolnym aliasie w historii, aby dodać go tutaj" + }, + "viewStatistics": { + "message": "Wyświetl statystyki" + }, + "statistics": { + "message": "Statystyki" + }, + "metricsTab": { + "message": "Metryki" + }, + "timelineTab": { + "message": "Oś czasu" + }, + "tagsTab": { + "message": "Tagi" + }, + "totalGenerated": { + "message": "Łącznie wygenerowane" + }, + "createdToday": { + "message": "Utworzone dzisiaj" + }, + "thisWeek": { + "message": "Ten tydzień" + }, + "thisMonth": { + "message": "Ten miesiąc" + }, + "topTag": { + "message": "Najlepszy tag" + }, + "totalTags": { + "message": "Łącznie tagów" + }, + "noTagsYet": { + "message": "Brak tagów" + }, + "disableInlineForSite": { + "message": "Wyłącz pomocnika inline w tej witrynie" + }, + "inlineDisabledSites": { + "message": "Witryny z wyłączonym pomocnikiem inline" + }, + "inlineDisabledSitesDescription": { + "message": "Ikona inline i szybkie okno są ukryte w tych witrynach." + }, + "noDisabledSites": { + "message": "Brak wyłączonych witryn" + }, + "enableInlineForSite": { + "message": "Włącz" + }, + "reportReview": { + "message": "Zgłoś / Oceń" + }, + "percentLabel": { + "message": "$PERCENT$%", + "placeholders": { + "percent": { + "content": "$1" + } + } + }, + "enable": { + "message": "Włącz" + }, + "retry": { + "message": "Ponownie" + }, + "storageError": { + "message": "Nie udało się załadować historii. Sprawdź dostęp do pamięci." + } } diff --git a/public/_locales/pt_BR/messages.json b/public/_locales/pt_BR/messages.json index 0eb305f6..745db700 100644 --- a/public/_locales/pt_BR/messages.json +++ b/public/_locales/pt_BR/messages.json @@ -1,774 +1,774 @@ { - "extensionName": { - "message": "Gmail Alias Toolkit" - }, - "extensionDescription": { - "message": "Gere e gerencie aliases do Gmail usando endereços +tag e predefinições" - }, - "headerSubtitle": { - "message": "Gere aliases usando endereços +tag" - }, - "settings": { - "message": "Configurações" - }, - "back": { - "message": "Voltar" - }, - "close": { - "message": "Fechar" - }, - "cancel": { - "message": "Cancelar" - }, - "copy": { - "message": "Copiar" - }, - "copyAll": { - "message": "Copiar tudo" - }, - "copyToClipboard": { - "message": "Copiar para a área de transferência" - }, - "activeGmailAddress": { - "message": "Endereço do Gmail ativo" - }, - "addNewAccount": { - "message": "Adicionar nova conta" - }, - "addAccount": { - "message": "Adicionar conta" - }, - "addNewAccountTitle": { - "message": "Adicionar nova conta" - }, - "emailPlaceholder": { - "message": "seu.email" - }, - "accountLabelPlaceholder": { - "message": "Rótulo (opcional, ex.: Trabalho, Pessoal)" - }, - "pressTabToAddGmail": { - "message": "Pressione $KEY$ para adicionar @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "gmailWarning": { - "message": "Isso não parece um endereço do Gmail. O endereçamento plus funciona melhor com Gmail." - }, - "random": { - "message": "Aleatório" - }, - "customTags": { - "message": "Tags personalizadas" - }, - "gmailTricks": { - "message": "Truques do Gmail" - }, - "tabTagsShort": { - "message": "Tags" - }, - "tabTricksShort": { - "message": "Truques" - }, - "generating": { - "message": "Gerando" - }, - "copied": { - "message": "Copiado" - }, - "switchToLightMode": { - "message": "Alternar para modo claro" - }, - "switchToDarkMode": { - "message": "Alternar para modo escuro" - }, - "aliasColumn": { - "message": "Alias" - }, - "copyEmailTooltip": { - "message": "$EMAIL$ - clique para copiar", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "pageLabel": { - "message": "Página $PAGE$", - "placeholders": { - "page": { - "content": "$1" - } - } - }, - "dotTrick": { - "message": "Truque dos pontos" - }, - "plusTags": { - "message": "Tags Plus (+)" - }, - "googlemail": { - "message": "Googlemail" - }, - "removeDots": { - "message": "Remover pontos" - }, - "dotPlus": { - "message": "Ponto + Plus" - }, - "allCombos": { - "message": "Todas as combinações" - }, - "numberOfVariations": { - "message": "Número de variações" - }, - "randomizeDotPositions": { - "message": "Aleatorizar posições dos pontos" - }, - "sequential": { - "message": "Sequencial" - }, - "generateTricks": { - "message": "Gerar truques" - }, - "generatedVariations": { - "message": "Variações geradas" - }, - "gmailTrickInfoLabel": { - "message": "Truque do Gmail:" - }, - "gmailTrickInfo": { - "message": "Pontos são ignorados e tudo após + vai para a mesma caixa de entrada" - }, - "format": { - "message": "Formato" - }, - "privateMailFormat": { - "message": "E-mail privado (private-mail-xxxx)" - }, - "randomCharactersFormat": { - "message": "Caracteres aleatórios (abc123xy)" - }, - "randomWordsFormat": { - "message": "Palavras aleatórias (happy-fox-42)" - }, - "timestampFormat": { - "message": "Timestamp (1234567890)" - }, - "numberOfAliases": { - "message": "Número de aliases" - }, - "generateRandomAliases": { - "message": "Gerar $COUNT$ alias aleatório$PLURAL$", - "placeholders": { - "count": { - "content": "$1" - }, - "plural": { - "content": "$2" - } - } - }, - "generatedAliases": { - "message": "Aliases gerados" - }, - "totalCount": { - "message": "$COUNT$ no total", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "copiedAliases": { - "message": "$COUNT$ aliases copiados!", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "failedToCopy": { - "message": "Falha ao copiar" - }, - "formatPrivateMail": { - "message": "Formato: private-mail-xxxx" - }, - "formatAlphanumeric": { - "message": "8 caracteres aleatórios" - }, - "formatWords": { - "message": "2 palavras aleatórias" - }, - "formatTimestamp": { - "message": "Timestamp Unix" - }, - "tagPlaceholder": { - "message": "Digite uma tag (ex.: shopping, work)" - }, - "generate": { - "message": "Gerar" - }, - "yourPresets": { - "message": "Suas predefinições" - }, - "example": { - "message": "Exemplo:" - }, - "copyExample": { - "message": "Copiar exemplo" - }, - "recentAliases": { - "message": "Aliases recentes" - }, - "favorites": { - "message": "Favoritos" - }, - "exportAsCsv": { - "message": "Exportar como CSV" - }, - "exportAsJson": { - "message": "Exportar como JSON" - }, - "selectAliases": { - "message": "Selecionar aliases" - }, - "select": { - "message": "Selecionar" - }, - "starredCount": { - "message": "$COUNT$ com estrela", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deselectAll": { - "message": "Desmarcar tudo" - }, - "selectAll": { - "message": "Selecionar tudo" - }, - "selectedCount": { - "message": "$COUNT$ selecionados", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deleteCount": { - "message": "Excluir $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "allCount": { - "message": "Todos ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "favoritesCount": { - "message": "Favoritos ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "searchAliases": { - "message": "Pesquisar aliases..." - }, - "allTags": { - "message": "Todas as tags" - }, - "mostRecent": { - "message": "Mais recentes" - }, - "az": { - "message": "A-Z" - }, - "noFavoritesYet": { - "message": "Ainda sem favoritos" - }, - "starEmailsHint": { - "message": "Marque e-mails do seu histórico com estrela para acessá-los rapidamente aqui" - }, - "noResultsFound": { - "message": "Nenhum resultado encontrado" - }, - "differentSearchHint": { - "message": "Tente outra pesquisa ou filtro" - }, - "showQrCode": { - "message": "Mostrar código QR" - }, - "removeFromFavorites": { - "message": "Remover dos favoritos" - }, - "addToFavorites": { - "message": "Adicionar aos favoritos" - }, - "showingRange": { - "message": "Mostrando $START$-$END$ de $TOTAL$", - "placeholders": { - "start": { - "content": "$1" - }, - "end": { - "content": "$2" - }, - "total": { - "content": "$3" - } - } - }, - "perPage": { - "message": "$COUNT$ / página", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "firstPage": { - "message": "Primeira página" - }, - "previousPage": { - "message": "Página anterior" - }, - "nextPage": { - "message": "Próxima página" - }, - "lastPage": { - "message": "Última página" - }, - "scanToCopyAlias": { - "message": "Escaneie para copiar o alias" - }, - "general": { - "message": "Geral" - }, - "accounts": { - "message": "Contas" - }, - "changelog": { - "message": "Registro de alterações" - }, - "appearanceDisplay": { - "message": "Aparência e exibição" - }, - "theme": { - "message": "Tema" - }, - "themeLight": { - "message": "Claro" - }, - "themeDark": { - "message": "Escuro" - }, - "themeAuto": { - "message": "Sistema (Auto)" - }, - "badgeCounter": { - "message": "Contador do badge" - }, - "badgeNone": { - "message": "Nenhum (oculto)" - }, - "badgeTotal": { - "message": "Total no histórico" - }, - "badgeAllTime": { - "message": "Total gerado (todo o período)" - }, - "badgeToday": { - "message": "Criados hoje" - }, - "badgeWeek": { - "message": "Esta semana" - }, - "copyNotifications": { - "message": "Notificações de cópia" - }, - "aliasGeneration": { - "message": "Geração de aliases" - }, - "randomAliasFormat": { - "message": "Formato de alias aleatório" - }, - "autoSaveLimit": { - "message": "Limite de salvamento automático" - }, - "aliasesLimit": { - "message": "$COUNT$ aliases", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "customPresets": { - "message": "Predefinições personalizadas" - }, - "label": { - "message": "Rótulo" - }, - "tag": { - "message": "Tag" - }, - "addPreset": { - "message": "+ Adicionar predefinição" - }, - "dataManagement": { - "message": "Gerenciamento de dados" - }, - "export": { - "message": "Exportar" - }, - "import": { - "message": "Importar" - }, - "clear": { - "message": "Limpar" - }, - "resetSettings": { - "message": "Redefinir todas as configurações para o padrão" - }, - "resetSettingsTitle": { - "message": "Redefinir configurações?" - }, - "resetSettingsMessage": { - "message": "Isso restaurará cada configuração para seu valor padrão." - }, - "reset": { - "message": "Redefinir" - }, - "clearHistoryTitle": { - "message": "Limpar aliases recentes?" - }, - "clearHistoryMessage": { - "message": "Isso remove todos os aliases da lista de histórico recente." - }, - "emailAccounts": { - "message": "Contas de e-mail" - }, - "manageAccountsDescription": { - "message": "Gerencie suas contas do Gmail. Cada conta tem seu próprio histórico, estatísticas e favoritos." - }, - "noAccountsFound": { - "message": "Nenhuma conta encontrada. Adicione uma conta pela tela principal." - }, - "emailAddress": { - "message": "Endereço de e-mail" - }, - "accountLabel": { - "message": "Rótulo da conta" - }, - "emailAddressPlaceholder": { - "message": "seu.email@gmail.com" - }, - "emailChangeWarning": { - "message": "Alterar o e-mail migrará todos os dados para o novo endereço de e-mail" - }, - "saveChanges": { - "message": "Salvar alterações" - }, - "active": { - "message": "Ativa" - }, - "editAccount": { - "message": "Editar conta" - }, - "cannotDeleteLastAccountTitle": { - "message": "Não é possível excluir a última conta" - }, - "deleteThisAccount": { - "message": "Excluir esta conta" - }, - "deleteAccountTitle": { - "message": "Excluir conta?" - }, - "deleteAccountMessage": { - "message": "Excluir \"$LABEL$\" ($EMAIL$)?\n\nIsso excluirá permanentemente:\n- Todo o histórico desta conta\n- Todas as estatísticas\n- Todos os favoritos\n\nEsta ação não pode ser desfeita.", - "placeholders": { - "label": { - "content": "$1" - }, - "email": { - "content": "$2" - } - } - }, - "delete": { - "message": "Excluir" - }, - "changeAccountEmailTitle": { - "message": "Alterar e-mail da conta?" - }, - "changeAccountEmailMessage": { - "message": "Alterar e-mail de\n$OLD_EMAIL$\npara\n$NEW_EMAIL$?\n\nIsso irá:\n- Migrar todo o histórico, estatísticas e favoritos para o novo e-mail\n- Atualizar o e-mail da conta\n- Excluir dados associados ao e-mail antigo\n\nContinuar?", - "placeholders": { - "old_email": { - "content": "$1" - }, - "new_email": { - "content": "$2" - } - } - }, - "changeEmail": { - "message": "Alterar e-mail" - }, - "menuForThisWebsite": { - "message": "Para este site" - }, - "menuLoading": { - "message": "Carregando..." - }, - "menuRandomEmailAlias": { - "message": "Alias de e-mail aleatório" - }, - "menuCustomTags": { - "message": "Tags personalizadas" - }, - "menuNoPresets": { - "message": "Sem predefinições - adicione em Configurações" - }, - "menuGmailTricks": { - "message": "Truques do Gmail" - }, - "menuDotVariation": { - "message": "Variação com pontos" - }, - "menuGooglemailDomain": { - "message": "Domínio Googlemail" - }, - "menuRemoveAllDots": { - "message": "Remover todos os pontos" - }, - "toastPresetAdded": { - "message": "Predefinição adicionada" - }, - "toastPresetRemoved": { - "message": "Predefinição removida" - }, - "toastSettingsExported": { - "message": "Configurações exportadas" - }, - "toastSettingsImported": { - "message": "Configurações importadas" - }, - "toastImportFailed": { - "message": "Falha na importação - arquivo inválido" - }, - "toastSettingsReset": { - "message": "Configurações redefinidas para o padrão" - }, - "toastAccountSwitched": { - "message": "Conta alternada" - }, - "toastAccountDeleted": { - "message": "Conta excluída" - }, - "toastAccountUpdated": { - "message": "Conta atualizada" - }, - "toastAccountAdded": { - "message": "$LABEL$ adicionada", - "placeholders": { - "label": { - "content": "$1" - } - } - }, - "errorLabelRequired": { - "message": "O rótulo não pode estar vazio" - }, - "errorInvalidEmail": { - "message": "Digite um endereço de e-mail válido" - }, - "errorDuplicateEmail": { - "message": "Este endereço de e-mail já é usado por outra conta" - }, - "errorEnterEmail": { - "message": "Digite um endereço de e-mail" - }, - "errorAccountExists": { - "message": "Esta conta já existe" - }, - "toastQrFailed": { - "message": "Falha ao gerar código QR" - }, - "toastExportedAliases": { - "message": "$COUNT$ aliases exportados", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastDeletedAliases": { - "message": "$COUNT$ aliases excluídos", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastHistoryCleared": { - "message": "Histórico limpo" - }, - "toastFavoriteAdded": { - "message": "Adicionado aos favoritos" - }, - "toastFavoriteRemoved": { - "message": "Removido dos favoritos" - }, - "toastCopiedEmail": { - "message": "$EMAIL$ copiado", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "toastCopyFailed": { - "message": "Falha ao copiar" - }, - "welcomeTitle": { - "message": "Bem-vindo ao Gmail Alias Toolkit" - }, - "welcomeSubtitle": { - "message": "Gere aliases de e-mail ilimitados para privacidade e organização" - }, - "letsGetStarted": { - "message": "Vamos começar" - }, - "enterGmailAddress": { - "message": "Digite seu endereço do Gmail" - }, - "pressTabForGmail": { - "message": "Pressione $KEY$ para @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "settingUp": { - "message": "Configurando..." - }, - "getStarted": { - "message": "Começar" - }, - "advancedSetup": { - "message": "Configuração avançada em Configurações" - }, - "whatYouCanDo": { - "message": "O que você pode fazer:" - }, - "featurePrivateEmail": { - "message": "Gerador de e-mail privado" - }, - "featureCustomTags": { - "message": "Tags e predefinições personalizadas" - }, - "featureGmailTricks": { - "message": "Truques avançados do Gmail" - }, - "welcomeFooter": { - "message": "Todos os dados são armazenados localmente. Sem rastreamento, sem servidor." - }, - "favoritesSaved": { - "message": "$COUNT$ salvos", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "clickStarHint": { - "message": "Clique na estrela em qualquer alias no histórico para adicioná-lo aqui" - }, - "viewStatistics": { - "message": "Ver estatísticas" - }, - "statistics": { - "message": "Estatísticas" - }, - "metricsTab": { - "message": "Métricas" - }, - "timelineTab": { - "message": "Linha do tempo" - }, - "tagsTab": { - "message": "Tags" - }, - "totalGenerated": { - "message": "Total gerado" - }, - "createdToday": { - "message": "Criados hoje" - }, - "thisWeek": { - "message": "Esta semana" - }, - "thisMonth": { - "message": "Este mês" - }, - "topTag": { - "message": "Tag principal" - }, - "totalTags": { - "message": "Total de tags" - }, - "noTagsYet": { - "message": "Ainda sem tags" - }, - "disableInlineForSite": { - "message": "Desativar o assistente inline neste site" - }, - "inlineDisabledSites": { - "message": "Sites com assistente inline desativado" - }, - "inlineDisabledSitesDescription": { - "message": "O ícone inline e o popup rápido ficam ocultos nestes sites." - }, - "noDisabledSites": { - "message": "Nenhum site desativado" - }, - "enableInlineForSite": { - "message": "Ativar" - }, - "reportReview": { - "message": "Relatar / Avaliar" - }, - "percentLabel": { - "message": "$PERCENT$%", - "placeholders": { - "percent": { - "content": "$1" - } - } - }, - "retry": { - "message": "Tentar novamente" - }, - "enable": { - "message": "Ativar" - }, - "storageError": { - "message": "Falha ao carregar o histórico. Verifique o acesso ao armazenamento." - } + "extensionName": { + "message": "Gmail Alias Toolkit" + }, + "extensionDescription": { + "message": "Gere e gerencie aliases do Gmail usando endereços +tag e predefinições" + }, + "headerSubtitle": { + "message": "Gere aliases usando endereços +tag" + }, + "settings": { + "message": "Configurações" + }, + "back": { + "message": "Voltar" + }, + "close": { + "message": "Fechar" + }, + "cancel": { + "message": "Cancelar" + }, + "copy": { + "message": "Copiar" + }, + "copyAll": { + "message": "Copiar tudo" + }, + "copyToClipboard": { + "message": "Copiar para a área de transferência" + }, + "activeGmailAddress": { + "message": "Endereço do Gmail ativo" + }, + "addNewAccount": { + "message": "Adicionar nova conta" + }, + "addAccount": { + "message": "Adicionar conta" + }, + "addNewAccountTitle": { + "message": "Adicionar nova conta" + }, + "emailPlaceholder": { + "message": "seu.email" + }, + "accountLabelPlaceholder": { + "message": "Rótulo (opcional, ex.: Trabalho, Pessoal)" + }, + "pressTabToAddGmail": { + "message": "Pressione $KEY$ para adicionar @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "gmailWarning": { + "message": "Isso não parece um endereço do Gmail. O endereçamento plus funciona melhor com Gmail." + }, + "random": { + "message": "Aleatório" + }, + "customTags": { + "message": "Tags personalizadas" + }, + "gmailTricks": { + "message": "Truques do Gmail" + }, + "tabTagsShort": { + "message": "Tags" + }, + "tabTricksShort": { + "message": "Truques" + }, + "generating": { + "message": "Gerando" + }, + "copied": { + "message": "Copiado" + }, + "switchToLightMode": { + "message": "Alternar para modo claro" + }, + "switchToDarkMode": { + "message": "Alternar para modo escuro" + }, + "aliasColumn": { + "message": "Alias" + }, + "copyEmailTooltip": { + "message": "$EMAIL$ - clique para copiar", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "pageLabel": { + "message": "Página $PAGE$", + "placeholders": { + "page": { + "content": "$1" + } + } + }, + "dotTrick": { + "message": "Truque dos pontos" + }, + "plusTags": { + "message": "Tags Plus (+)" + }, + "googlemail": { + "message": "Googlemail" + }, + "removeDots": { + "message": "Remover pontos" + }, + "dotPlus": { + "message": "Ponto + Plus" + }, + "allCombos": { + "message": "Todas as combinações" + }, + "numberOfVariations": { + "message": "Número de variações" + }, + "randomizeDotPositions": { + "message": "Aleatorizar posições dos pontos" + }, + "sequential": { + "message": "Sequencial" + }, + "generateTricks": { + "message": "Gerar truques" + }, + "generatedVariations": { + "message": "Variações geradas" + }, + "gmailTrickInfoLabel": { + "message": "Truque do Gmail:" + }, + "gmailTrickInfo": { + "message": "Pontos são ignorados e tudo após + vai para a mesma caixa de entrada" + }, + "format": { + "message": "Formato" + }, + "privateMailFormat": { + "message": "E-mail privado (private-mail-xxxx)" + }, + "randomCharactersFormat": { + "message": "Caracteres aleatórios (abc123xy)" + }, + "randomWordsFormat": { + "message": "Palavras aleatórias (happy-fox-42)" + }, + "timestampFormat": { + "message": "Timestamp (1234567890)" + }, + "numberOfAliases": { + "message": "Número de aliases" + }, + "generateRandomAliases": { + "message": "Gerar $COUNT$ alias aleatório$PLURAL$", + "placeholders": { + "count": { + "content": "$1" + }, + "plural": { + "content": "$2" + } + } + }, + "generatedAliases": { + "message": "Aliases gerados" + }, + "totalCount": { + "message": "$COUNT$ no total", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "copiedAliases": { + "message": "$COUNT$ aliases copiados!", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "failedToCopy": { + "message": "Falha ao copiar" + }, + "formatPrivateMail": { + "message": "Formato: private-mail-xxxx" + }, + "formatAlphanumeric": { + "message": "8 caracteres aleatórios" + }, + "formatWords": { + "message": "2 palavras aleatórias" + }, + "formatTimestamp": { + "message": "Timestamp Unix" + }, + "tagPlaceholder": { + "message": "Digite uma tag (ex.: shopping, work)" + }, + "generate": { + "message": "Gerar" + }, + "yourPresets": { + "message": "Suas predefinições" + }, + "example": { + "message": "Exemplo:" + }, + "copyExample": { + "message": "Copiar exemplo" + }, + "recentAliases": { + "message": "Aliases recentes" + }, + "favorites": { + "message": "Favoritos" + }, + "exportAsCsv": { + "message": "Exportar como CSV" + }, + "exportAsJson": { + "message": "Exportar como JSON" + }, + "selectAliases": { + "message": "Selecionar aliases" + }, + "select": { + "message": "Selecionar" + }, + "starredCount": { + "message": "$COUNT$ com estrela", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deselectAll": { + "message": "Desmarcar tudo" + }, + "selectAll": { + "message": "Selecionar tudo" + }, + "selectedCount": { + "message": "$COUNT$ selecionados", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deleteCount": { + "message": "Excluir $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "allCount": { + "message": "Todos ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "favoritesCount": { + "message": "Favoritos ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "searchAliases": { + "message": "Pesquisar aliases..." + }, + "allTags": { + "message": "Todas as tags" + }, + "mostRecent": { + "message": "Mais recentes" + }, + "az": { + "message": "A-Z" + }, + "noFavoritesYet": { + "message": "Ainda sem favoritos" + }, + "starEmailsHint": { + "message": "Marque e-mails do seu histórico com estrela para acessá-los rapidamente aqui" + }, + "noResultsFound": { + "message": "Nenhum resultado encontrado" + }, + "differentSearchHint": { + "message": "Tente outra pesquisa ou filtro" + }, + "showQrCode": { + "message": "Mostrar código QR" + }, + "removeFromFavorites": { + "message": "Remover dos favoritos" + }, + "addToFavorites": { + "message": "Adicionar aos favoritos" + }, + "showingRange": { + "message": "Mostrando $START$-$END$ de $TOTAL$", + "placeholders": { + "start": { + "content": "$1" + }, + "end": { + "content": "$2" + }, + "total": { + "content": "$3" + } + } + }, + "perPage": { + "message": "$COUNT$ / página", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "firstPage": { + "message": "Primeira página" + }, + "previousPage": { + "message": "Página anterior" + }, + "nextPage": { + "message": "Próxima página" + }, + "lastPage": { + "message": "Última página" + }, + "scanToCopyAlias": { + "message": "Escaneie para copiar o alias" + }, + "general": { + "message": "Geral" + }, + "accounts": { + "message": "Contas" + }, + "changelog": { + "message": "Registro de alterações" + }, + "appearanceDisplay": { + "message": "Aparência e exibição" + }, + "theme": { + "message": "Tema" + }, + "themeLight": { + "message": "Claro" + }, + "themeDark": { + "message": "Escuro" + }, + "themeAuto": { + "message": "Sistema (Auto)" + }, + "badgeCounter": { + "message": "Contador do badge" + }, + "badgeNone": { + "message": "Nenhum (oculto)" + }, + "badgeTotal": { + "message": "Total no histórico" + }, + "badgeAllTime": { + "message": "Total gerado (todo o período)" + }, + "badgeToday": { + "message": "Criados hoje" + }, + "badgeWeek": { + "message": "Esta semana" + }, + "copyNotifications": { + "message": "Notificações de cópia" + }, + "aliasGeneration": { + "message": "Geração de aliases" + }, + "randomAliasFormat": { + "message": "Formato de alias aleatório" + }, + "autoSaveLimit": { + "message": "Limite de salvamento automático" + }, + "aliasesLimit": { + "message": "$COUNT$ aliases", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "customPresets": { + "message": "Predefinições personalizadas" + }, + "label": { + "message": "Rótulo" + }, + "tag": { + "message": "Tag" + }, + "addPreset": { + "message": "+ Adicionar predefinição" + }, + "dataManagement": { + "message": "Gerenciamento de dados" + }, + "export": { + "message": "Exportar" + }, + "import": { + "message": "Importar" + }, + "clear": { + "message": "Limpar" + }, + "resetSettings": { + "message": "Redefinir todas as configurações para o padrão" + }, + "resetSettingsTitle": { + "message": "Redefinir configurações?" + }, + "resetSettingsMessage": { + "message": "Isso restaurará cada configuração para seu valor padrão." + }, + "reset": { + "message": "Redefinir" + }, + "clearHistoryTitle": { + "message": "Limpar aliases recentes?" + }, + "clearHistoryMessage": { + "message": "Isso remove todos os aliases da lista de histórico recente." + }, + "emailAccounts": { + "message": "Contas de e-mail" + }, + "manageAccountsDescription": { + "message": "Gerencie suas contas do Gmail. Cada conta tem seu próprio histórico, estatísticas e favoritos." + }, + "noAccountsFound": { + "message": "Nenhuma conta encontrada. Adicione uma conta pela tela principal." + }, + "emailAddress": { + "message": "Endereço de e-mail" + }, + "accountLabel": { + "message": "Rótulo da conta" + }, + "emailAddressPlaceholder": { + "message": "seu.email@gmail.com" + }, + "emailChangeWarning": { + "message": "Alterar o e-mail migrará todos os dados para o novo endereço de e-mail" + }, + "saveChanges": { + "message": "Salvar alterações" + }, + "active": { + "message": "Ativa" + }, + "editAccount": { + "message": "Editar conta" + }, + "cannotDeleteLastAccountTitle": { + "message": "Não é possível excluir a última conta" + }, + "deleteThisAccount": { + "message": "Excluir esta conta" + }, + "deleteAccountTitle": { + "message": "Excluir conta?" + }, + "deleteAccountMessage": { + "message": "Excluir \"$LABEL$\" ($EMAIL$)?\n\nIsso excluirá permanentemente:\n- Todo o histórico desta conta\n- Todas as estatísticas\n- Todos os favoritos\n\nEsta ação não pode ser desfeita.", + "placeholders": { + "label": { + "content": "$1" + }, + "email": { + "content": "$2" + } + } + }, + "delete": { + "message": "Excluir" + }, + "changeAccountEmailTitle": { + "message": "Alterar e-mail da conta?" + }, + "changeAccountEmailMessage": { + "message": "Alterar e-mail de\n$OLD_EMAIL$\npara\n$NEW_EMAIL$?\n\nIsso irá:\n- Migrar todo o histórico, estatísticas e favoritos para o novo e-mail\n- Atualizar o e-mail da conta\n- Excluir dados associados ao e-mail antigo\n\nContinuar?", + "placeholders": { + "old_email": { + "content": "$1" + }, + "new_email": { + "content": "$2" + } + } + }, + "changeEmail": { + "message": "Alterar e-mail" + }, + "menuForThisWebsite": { + "message": "Para este site" + }, + "menuLoading": { + "message": "Carregando..." + }, + "menuRandomEmailAlias": { + "message": "Alias de e-mail aleatório" + }, + "menuCustomTags": { + "message": "Tags personalizadas" + }, + "menuNoPresets": { + "message": "Sem predefinições - adicione em Configurações" + }, + "menuGmailTricks": { + "message": "Truques do Gmail" + }, + "menuDotVariation": { + "message": "Variação com pontos" + }, + "menuGooglemailDomain": { + "message": "Domínio Googlemail" + }, + "menuRemoveAllDots": { + "message": "Remover todos os pontos" + }, + "toastPresetAdded": { + "message": "Predefinição adicionada" + }, + "toastPresetRemoved": { + "message": "Predefinição removida" + }, + "toastSettingsExported": { + "message": "Configurações exportadas" + }, + "toastSettingsImported": { + "message": "Configurações importadas" + }, + "toastImportFailed": { + "message": "Falha na importação - arquivo inválido" + }, + "toastSettingsReset": { + "message": "Configurações redefinidas para o padrão" + }, + "toastAccountSwitched": { + "message": "Conta alternada" + }, + "toastAccountDeleted": { + "message": "Conta excluída" + }, + "toastAccountUpdated": { + "message": "Conta atualizada" + }, + "toastAccountAdded": { + "message": "$LABEL$ adicionada", + "placeholders": { + "label": { + "content": "$1" + } + } + }, + "errorLabelRequired": { + "message": "O rótulo não pode estar vazio" + }, + "errorInvalidEmail": { + "message": "Digite um endereço de e-mail válido" + }, + "errorDuplicateEmail": { + "message": "Este endereço de e-mail já é usado por outra conta" + }, + "errorEnterEmail": { + "message": "Digite um endereço de e-mail" + }, + "errorAccountExists": { + "message": "Esta conta já existe" + }, + "toastQrFailed": { + "message": "Falha ao gerar código QR" + }, + "toastExportedAliases": { + "message": "$COUNT$ aliases exportados", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastDeletedAliases": { + "message": "$COUNT$ aliases excluídos", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastHistoryCleared": { + "message": "Histórico limpo" + }, + "toastFavoriteAdded": { + "message": "Adicionado aos favoritos" + }, + "toastFavoriteRemoved": { + "message": "Removido dos favoritos" + }, + "toastCopiedEmail": { + "message": "$EMAIL$ copiado", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "toastCopyFailed": { + "message": "Falha ao copiar" + }, + "welcomeTitle": { + "message": "Bem-vindo ao Gmail Alias Toolkit" + }, + "welcomeSubtitle": { + "message": "Gere aliases de e-mail ilimitados para privacidade e organização" + }, + "letsGetStarted": { + "message": "Vamos começar" + }, + "enterGmailAddress": { + "message": "Digite seu endereço do Gmail" + }, + "pressTabForGmail": { + "message": "Pressione $KEY$ para @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "settingUp": { + "message": "Configurando..." + }, + "getStarted": { + "message": "Começar" + }, + "advancedSetup": { + "message": "Configuração avançada em Configurações" + }, + "whatYouCanDo": { + "message": "O que você pode fazer:" + }, + "featurePrivateEmail": { + "message": "Gerador de e-mail privado" + }, + "featureCustomTags": { + "message": "Tags e predefinições personalizadas" + }, + "featureGmailTricks": { + "message": "Truques avançados do Gmail" + }, + "welcomeFooter": { + "message": "Todos os dados são armazenados localmente. Sem rastreamento, sem servidor." + }, + "favoritesSaved": { + "message": "$COUNT$ salvos", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "clickStarHint": { + "message": "Clique na estrela em qualquer alias no histórico para adicioná-lo aqui" + }, + "viewStatistics": { + "message": "Ver estatísticas" + }, + "statistics": { + "message": "Estatísticas" + }, + "metricsTab": { + "message": "Métricas" + }, + "timelineTab": { + "message": "Linha do tempo" + }, + "tagsTab": { + "message": "Tags" + }, + "totalGenerated": { + "message": "Total gerado" + }, + "createdToday": { + "message": "Criados hoje" + }, + "thisWeek": { + "message": "Esta semana" + }, + "thisMonth": { + "message": "Este mês" + }, + "topTag": { + "message": "Tag principal" + }, + "totalTags": { + "message": "Total de tags" + }, + "noTagsYet": { + "message": "Ainda sem tags" + }, + "disableInlineForSite": { + "message": "Desativar o assistente inline neste site" + }, + "inlineDisabledSites": { + "message": "Sites com assistente inline desativado" + }, + "inlineDisabledSitesDescription": { + "message": "O ícone inline e o popup rápido ficam ocultos nestes sites." + }, + "noDisabledSites": { + "message": "Nenhum site desativado" + }, + "enableInlineForSite": { + "message": "Ativar" + }, + "reportReview": { + "message": "Relatar / Avaliar" + }, + "percentLabel": { + "message": "$PERCENT$%", + "placeholders": { + "percent": { + "content": "$1" + } + } + }, + "enable": { + "message": "Ativar" + }, + "retry": { + "message": "Tentar novamente" + }, + "storageError": { + "message": "Falha ao carregar o histórico. Verifique o acesso ao armazenamento." + } } diff --git a/public/_locales/ru/messages.json b/public/_locales/ru/messages.json index cf6d8686..34df8490 100644 --- a/public/_locales/ru/messages.json +++ b/public/_locales/ru/messages.json @@ -1,774 +1,774 @@ { - "extensionName": { - "message": "Gmail Alias Toolkit" - }, - "extensionDescription": { - "message": "Создавайте псевдонимы Gmail и управляйте ими с помощью адресов +tag и шаблонов" - }, - "headerSubtitle": { - "message": "Создавайте псевдонимы с адресами +tag" - }, - "settings": { - "message": "Настройки" - }, - "back": { - "message": "Назад" - }, - "close": { - "message": "Закрыть" - }, - "cancel": { - "message": "Отмена" - }, - "copy": { - "message": "Копировать" - }, - "copyAll": { - "message": "Копировать все" - }, - "copyToClipboard": { - "message": "Копировать в буфер обмена" - }, - "activeGmailAddress": { - "message": "Активный адрес Gmail" - }, - "addNewAccount": { - "message": "Добавить новый аккаунт" - }, - "addAccount": { - "message": "Добавить аккаунт" - }, - "addNewAccountTitle": { - "message": "Добавить новый аккаунт" - }, - "emailPlaceholder": { - "message": "your.email" - }, - "accountLabelPlaceholder": { - "message": "Метка (необязательно, например Работа, Личное)" - }, - "pressTabToAddGmail": { - "message": "Нажмите $KEY$, чтобы добавить @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "gmailWarning": { - "message": "Это не похоже на адрес Gmail. Plus-адресация лучше всего работает с Gmail." - }, - "random": { - "message": "Случайно" - }, - "customTags": { - "message": "Пользовательские теги" - }, - "gmailTricks": { - "message": "Трюки Gmail" - }, - "tabTagsShort": { - "message": "Теги" - }, - "tabTricksShort": { - "message": "Трюки" - }, - "generating": { - "message": "Создание" - }, - "copied": { - "message": "Скопировано" - }, - "switchToLightMode": { - "message": "Переключиться на светлый режим" - }, - "switchToDarkMode": { - "message": "Переключиться на темный режим" - }, - "aliasColumn": { - "message": "Псевдоним" - }, - "copyEmailTooltip": { - "message": "$EMAIL$ - нажмите, чтобы скопировать", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "pageLabel": { - "message": "Страница $PAGE$", - "placeholders": { - "page": { - "content": "$1" - } - } - }, - "dotTrick": { - "message": "Трюк с точками" - }, - "plusTags": { - "message": "Plus-теги (+)" - }, - "googlemail": { - "message": "Googlemail" - }, - "removeDots": { - "message": "Удалить точки" - }, - "dotPlus": { - "message": "Точка + Plus" - }, - "allCombos": { - "message": "Все комбинации" - }, - "numberOfVariations": { - "message": "Количество вариантов" - }, - "randomizeDotPositions": { - "message": "Случайные позиции точек" - }, - "sequential": { - "message": "Последовательно" - }, - "generateTricks": { - "message": "Создать трюки" - }, - "generatedVariations": { - "message": "Созданные варианты" - }, - "gmailTrickInfoLabel": { - "message": "Трюк Gmail:" - }, - "gmailTrickInfo": { - "message": "Точки игнорируются, а все после + попадает в тот же почтовый ящик" - }, - "format": { - "message": "Формат" - }, - "privateMailFormat": { - "message": "Личная почта (private-mail-xxxx)" - }, - "randomCharactersFormat": { - "message": "Случайные символы (abc123xy)" - }, - "randomWordsFormat": { - "message": "Случайные слова (happy-fox-42)" - }, - "timestampFormat": { - "message": "Метка времени (1234567890)" - }, - "numberOfAliases": { - "message": "Количество псевдонимов" - }, - "generateRandomAliases": { - "message": "Создать $COUNT$ случайный псевдоним$PLURAL$", - "placeholders": { - "count": { - "content": "$1" - }, - "plural": { - "content": "$2" - } - } - }, - "generatedAliases": { - "message": "Созданные псевдонимы" - }, - "totalCount": { - "message": "Всего $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "copiedAliases": { - "message": "Скопировано псевдонимов: $COUNT$!", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "failedToCopy": { - "message": "Не удалось скопировать" - }, - "formatPrivateMail": { - "message": "Формат: private-mail-xxxx" - }, - "formatAlphanumeric": { - "message": "8 случайных символов" - }, - "formatWords": { - "message": "2 случайных слова" - }, - "formatTimestamp": { - "message": "Метка времени Unix" - }, - "tagPlaceholder": { - "message": "Введите тег (например, shopping, work)" - }, - "generate": { - "message": "Создать" - }, - "yourPresets": { - "message": "Ваши шаблоны" - }, - "example": { - "message": "Пример:" - }, - "copyExample": { - "message": "Копировать пример" - }, - "recentAliases": { - "message": "Недавние псевдонимы" - }, - "favorites": { - "message": "Избранное" - }, - "exportAsCsv": { - "message": "Экспорт как CSV" - }, - "exportAsJson": { - "message": "Экспорт как JSON" - }, - "selectAliases": { - "message": "Выбрать псевдонимы" - }, - "select": { - "message": "Выбрать" - }, - "starredCount": { - "message": "$COUNT$ отмечено", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deselectAll": { - "message": "Снять выбор со всех" - }, - "selectAll": { - "message": "Выбрать все" - }, - "selectedCount": { - "message": "Выбрано $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deleteCount": { - "message": "Удалить $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "allCount": { - "message": "Все ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "favoritesCount": { - "message": "Избранное ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "searchAliases": { - "message": "Поиск псевдонимов..." - }, - "allTags": { - "message": "Все теги" - }, - "mostRecent": { - "message": "Самые новые" - }, - "az": { - "message": "A-Z" - }, - "noFavoritesYet": { - "message": "Пока нет избранного" - }, - "starEmailsHint": { - "message": "Отмечайте письма из истории звездочкой, чтобы быстро открывать их здесь" - }, - "noResultsFound": { - "message": "Ничего не найдено" - }, - "differentSearchHint": { - "message": "Попробуйте другой поиск или фильтр" - }, - "showQrCode": { - "message": "Показать QR-код" - }, - "removeFromFavorites": { - "message": "Удалить из избранного" - }, - "addToFavorites": { - "message": "Добавить в избранное" - }, - "showingRange": { - "message": "Показано $START$-$END$ из $TOTAL$", - "placeholders": { - "start": { - "content": "$1" - }, - "end": { - "content": "$2" - }, - "total": { - "content": "$3" - } - } - }, - "perPage": { - "message": "$COUNT$ / стр.", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "firstPage": { - "message": "Первая страница" - }, - "previousPage": { - "message": "Предыдущая страница" - }, - "nextPage": { - "message": "Следующая страница" - }, - "lastPage": { - "message": "Последняя страница" - }, - "scanToCopyAlias": { - "message": "Отсканируйте, чтобы скопировать псевдоним" - }, - "general": { - "message": "Общие" - }, - "accounts": { - "message": "Аккаунты" - }, - "changelog": { - "message": "Журнал изменений" - }, - "appearanceDisplay": { - "message": "Внешний вид и отображение" - }, - "theme": { - "message": "Тема" - }, - "themeLight": { - "message": "Светлая" - }, - "themeDark": { - "message": "Темная" - }, - "themeAuto": { - "message": "Система (авто)" - }, - "badgeCounter": { - "message": "Счетчик значка" - }, - "badgeNone": { - "message": "Нет (скрыто)" - }, - "badgeTotal": { - "message": "Всего в истории" - }, - "badgeAllTime": { - "message": "Всего создано (за все время)" - }, - "badgeToday": { - "message": "Создано сегодня" - }, - "badgeWeek": { - "message": "На этой неделе" - }, - "copyNotifications": { - "message": "Уведомления о копировании" - }, - "aliasGeneration": { - "message": "Создание псевдонимов" - }, - "randomAliasFormat": { - "message": "Формат случайного псевдонима" - }, - "autoSaveLimit": { - "message": "Лимит автосохранения" - }, - "aliasesLimit": { - "message": "$COUNT$ псевдонимов", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "customPresets": { - "message": "Пользовательские шаблоны" - }, - "label": { - "message": "Метка" - }, - "tag": { - "message": "Тег" - }, - "addPreset": { - "message": "+ Добавить шаблон" - }, - "dataManagement": { - "message": "Управление данными" - }, - "export": { - "message": "Экспорт" - }, - "import": { - "message": "Импорт" - }, - "clear": { - "message": "Очистить" - }, - "resetSettings": { - "message": "Сбросить все настройки по умолчанию" - }, - "resetSettingsTitle": { - "message": "Сбросить настройки?" - }, - "resetSettingsMessage": { - "message": "Это восстановит все настройки до значений по умолчанию." - }, - "reset": { - "message": "Сбросить" - }, - "clearHistoryTitle": { - "message": "Очистить недавние псевдонимы?" - }, - "clearHistoryMessage": { - "message": "Это удалит все псевдонимы из списка недавней истории." - }, - "emailAccounts": { - "message": "Почтовые аккаунты" - }, - "manageAccountsDescription": { - "message": "Управляйте своими аккаунтами Gmail. У каждого аккаунта своя история, статистика и избранное." - }, - "noAccountsFound": { - "message": "Аккаунты не найдены. Добавьте аккаунт с главного экрана." - }, - "emailAddress": { - "message": "Адрес электронной почты" - }, - "accountLabel": { - "message": "Метка аккаунта" - }, - "emailAddressPlaceholder": { - "message": "your.email@gmail.com" - }, - "emailChangeWarning": { - "message": "При изменении e-mail все данные будут перенесены на новый адрес" - }, - "saveChanges": { - "message": "Сохранить изменения" - }, - "active": { - "message": "Активен" - }, - "editAccount": { - "message": "Редактировать аккаунт" - }, - "cannotDeleteLastAccountTitle": { - "message": "Нельзя удалить последний аккаунт" - }, - "deleteThisAccount": { - "message": "Удалить этот аккаунт" - }, - "deleteAccountTitle": { - "message": "Удалить аккаунт?" - }, - "deleteAccountMessage": { - "message": "Удалить \"$LABEL$\" ($EMAIL$)?\n\nЭто навсегда удалит:\n- Всю историю этого аккаунта\n- Всю статистику\n- Все избранное\n\nЭто действие нельзя отменить.", - "placeholders": { - "label": { - "content": "$1" - }, - "email": { - "content": "$2" - } - } - }, - "delete": { - "message": "Удалить" - }, - "changeAccountEmailTitle": { - "message": "Изменить e-mail аккаунта?" - }, - "changeAccountEmailMessage": { - "message": "Изменить e-mail с\n$OLD_EMAIL$\nна\n$NEW_EMAIL$?\n\nЭто выполнит:\n- Перенос всей истории, статистики и избранного на новый e-mail\n- Обновление e-mail аккаунта\n- Удаление данных, связанных со старым e-mail\n\nПродолжить?", - "placeholders": { - "old_email": { - "content": "$1" - }, - "new_email": { - "content": "$2" - } - } - }, - "changeEmail": { - "message": "Изменить e-mail" - }, - "menuForThisWebsite": { - "message": "Для этого сайта" - }, - "menuLoading": { - "message": "Загрузка..." - }, - "menuRandomEmailAlias": { - "message": "Случайный e-mail псевдоним" - }, - "menuCustomTags": { - "message": "Пользовательские теги" - }, - "menuNoPresets": { - "message": "Нет шаблонов - добавьте в Настройках" - }, - "menuGmailTricks": { - "message": "Трюки Gmail" - }, - "menuDotVariation": { - "message": "Вариант с точками" - }, - "menuGooglemailDomain": { - "message": "Домен Googlemail" - }, - "menuRemoveAllDots": { - "message": "Удалить все точки" - }, - "toastPresetAdded": { - "message": "Шаблон добавлен" - }, - "toastPresetRemoved": { - "message": "Шаблон удален" - }, - "toastSettingsExported": { - "message": "Настройки экспортированы" - }, - "toastSettingsImported": { - "message": "Настройки импортированы" - }, - "toastImportFailed": { - "message": "Ошибка импорта - недопустимый файл" - }, - "toastSettingsReset": { - "message": "Настройки сброшены по умолчанию" - }, - "toastAccountSwitched": { - "message": "Аккаунт переключен" - }, - "toastAccountDeleted": { - "message": "Аккаунт удален" - }, - "toastAccountUpdated": { - "message": "Аккаунт обновлен" - }, - "toastAccountAdded": { - "message": "$LABEL$ добавлен", - "placeholders": { - "label": { - "content": "$1" - } - } - }, - "errorLabelRequired": { - "message": "Метка не может быть пустой" - }, - "errorInvalidEmail": { - "message": "Введите действительный адрес электронной почты" - }, - "errorDuplicateEmail": { - "message": "Этот адрес уже используется другим аккаунтом" - }, - "errorEnterEmail": { - "message": "Введите адрес электронной почты" - }, - "errorAccountExists": { - "message": "Этот аккаунт уже существует" - }, - "toastQrFailed": { - "message": "Не удалось создать QR-код" - }, - "toastExportedAliases": { - "message": "Экспортировано псевдонимов: $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastDeletedAliases": { - "message": "Удалено псевдонимов: $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastHistoryCleared": { - "message": "История очищена" - }, - "toastFavoriteAdded": { - "message": "Добавлено в избранное" - }, - "toastFavoriteRemoved": { - "message": "Удалено из избранного" - }, - "toastCopiedEmail": { - "message": "Скопировано $EMAIL$", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "toastCopyFailed": { - "message": "Не удалось скопировать" - }, - "welcomeTitle": { - "message": "Добро пожаловать в Gmail Alias Toolkit" - }, - "welcomeSubtitle": { - "message": "Создавайте неограниченное количество e-mail псевдонимов для приватности и порядка" - }, - "letsGetStarted": { - "message": "Начнем" - }, - "enterGmailAddress": { - "message": "Введите ваш адрес Gmail" - }, - "pressTabForGmail": { - "message": "Нажмите $KEY$ для @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "settingUp": { - "message": "Настройка..." - }, - "getStarted": { - "message": "Начать" - }, - "advancedSetup": { - "message": "Расширенная настройка в Настройках" - }, - "whatYouCanDo": { - "message": "Что можно делать:" - }, - "featurePrivateEmail": { - "message": "Генератор личной почты" - }, - "featureCustomTags": { - "message": "Пользовательские теги и шаблоны" - }, - "featureGmailTricks": { - "message": "Расширенные трюки Gmail" - }, - "welcomeFooter": { - "message": "Все данные хранятся локально. Без отслеживания, без сервера." - }, - "favoritesSaved": { - "message": "Сохранено $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "clickStarHint": { - "message": "Нажмите звезду на любом псевдониме в истории, чтобы добавить его сюда" - }, - "viewStatistics": { - "message": "Показать статистику" - }, - "statistics": { - "message": "Статистика" - }, - "metricsTab": { - "message": "Метрики" - }, - "timelineTab": { - "message": "Хронология" - }, - "tagsTab": { - "message": "Теги" - }, - "totalGenerated": { - "message": "Всего создано" - }, - "createdToday": { - "message": "Создано сегодня" - }, - "thisWeek": { - "message": "На этой неделе" - }, - "thisMonth": { - "message": "Ð’ этом месяце" - }, - "topTag": { - "message": "Лучший тег" - }, - "totalTags": { - "message": "Всего тегов" - }, - "noTagsYet": { - "message": "Пока нет тегов" - }, - "disableInlineForSite": { - "message": "Отключить встроенного помощника на этом сайте" - }, - "inlineDisabledSites": { - "message": "Сайты с отключённым встроенным помощником" - }, - "inlineDisabledSitesDescription": { - "message": "На этих сайтах встроенный значок и быстрое окно будут скрыты." - }, - "noDisabledSites": { - "message": "Нет отключённых сайтов" - }, - "enableInlineForSite": { - "message": "Включить" - }, - "reportReview": { - "message": "Сообщить / Оценить" - }, - "percentLabel": { - "message": "$PERCENT$%", - "placeholders": { - "percent": { - "content": "$1" - } - } - }, - "retry": { - "message": "Повторить" - }, - "enable": { - "message": "Включить" - }, - "storageError": { - "message": "Не удалось загрузить историю. Проверьте доступ к хранилищу." - } + "extensionName": { + "message": "Gmail Alias Toolkit" + }, + "extensionDescription": { + "message": "Создавайте псевдонимы Gmail и управляйте ими с помощью адресов +tag и шаблонов" + }, + "headerSubtitle": { + "message": "Создавайте псевдонимы с адресами +tag" + }, + "settings": { + "message": "Настройки" + }, + "back": { + "message": "Назад" + }, + "close": { + "message": "Закрыть" + }, + "cancel": { + "message": "Отмена" + }, + "copy": { + "message": "Копировать" + }, + "copyAll": { + "message": "Копировать все" + }, + "copyToClipboard": { + "message": "Копировать в буфер обмена" + }, + "activeGmailAddress": { + "message": "Активный адрес Gmail" + }, + "addNewAccount": { + "message": "Добавить новый аккаунт" + }, + "addAccount": { + "message": "Добавить аккаунт" + }, + "addNewAccountTitle": { + "message": "Добавить новый аккаунт" + }, + "emailPlaceholder": { + "message": "your.email" + }, + "accountLabelPlaceholder": { + "message": "Метка (необязательно, например Работа, Личное)" + }, + "pressTabToAddGmail": { + "message": "Нажмите $KEY$, чтобы добавить @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "gmailWarning": { + "message": "Это не похоже на адрес Gmail. Plus-адресация лучше всего работает с Gmail." + }, + "random": { + "message": "Случайно" + }, + "customTags": { + "message": "Пользовательские теги" + }, + "gmailTricks": { + "message": "Трюки Gmail" + }, + "tabTagsShort": { + "message": "Теги" + }, + "tabTricksShort": { + "message": "Трюки" + }, + "generating": { + "message": "Создание" + }, + "copied": { + "message": "Скопировано" + }, + "switchToLightMode": { + "message": "Переключиться на светлый режим" + }, + "switchToDarkMode": { + "message": "Переключиться на темный режим" + }, + "aliasColumn": { + "message": "Псевдоним" + }, + "copyEmailTooltip": { + "message": "$EMAIL$ - нажмите, чтобы скопировать", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "pageLabel": { + "message": "Страница $PAGE$", + "placeholders": { + "page": { + "content": "$1" + } + } + }, + "dotTrick": { + "message": "Трюк с точками" + }, + "plusTags": { + "message": "Plus-теги (+)" + }, + "googlemail": { + "message": "Googlemail" + }, + "removeDots": { + "message": "Удалить точки" + }, + "dotPlus": { + "message": "Точка + Plus" + }, + "allCombos": { + "message": "Все комбинации" + }, + "numberOfVariations": { + "message": "Количество вариантов" + }, + "randomizeDotPositions": { + "message": "Случайные позиции точек" + }, + "sequential": { + "message": "Последовательно" + }, + "generateTricks": { + "message": "Создать трюки" + }, + "generatedVariations": { + "message": "Созданные варианты" + }, + "gmailTrickInfoLabel": { + "message": "Трюк Gmail:" + }, + "gmailTrickInfo": { + "message": "Точки игнорируются, а все после + попадает в тот же почтовый ящик" + }, + "format": { + "message": "Формат" + }, + "privateMailFormat": { + "message": "Личная почта (private-mail-xxxx)" + }, + "randomCharactersFormat": { + "message": "Случайные символы (abc123xy)" + }, + "randomWordsFormat": { + "message": "Случайные слова (happy-fox-42)" + }, + "timestampFormat": { + "message": "Метка времени (1234567890)" + }, + "numberOfAliases": { + "message": "Количество псевдонимов" + }, + "generateRandomAliases": { + "message": "Создать $COUNT$ случайный псевдоним$PLURAL$", + "placeholders": { + "count": { + "content": "$1" + }, + "plural": { + "content": "$2" + } + } + }, + "generatedAliases": { + "message": "Созданные псевдонимы" + }, + "totalCount": { + "message": "Всего $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "copiedAliases": { + "message": "Скопировано псевдонимов: $COUNT$!", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "failedToCopy": { + "message": "Не удалось скопировать" + }, + "formatPrivateMail": { + "message": "Формат: private-mail-xxxx" + }, + "formatAlphanumeric": { + "message": "8 случайных символов" + }, + "formatWords": { + "message": "2 случайных слова" + }, + "formatTimestamp": { + "message": "Метка времени Unix" + }, + "tagPlaceholder": { + "message": "Введите тег (например, shopping, work)" + }, + "generate": { + "message": "Создать" + }, + "yourPresets": { + "message": "Ваши шаблоны" + }, + "example": { + "message": "Пример:" + }, + "copyExample": { + "message": "Копировать пример" + }, + "recentAliases": { + "message": "Недавние псевдонимы" + }, + "favorites": { + "message": "Избранное" + }, + "exportAsCsv": { + "message": "Экспорт как CSV" + }, + "exportAsJson": { + "message": "Экспорт как JSON" + }, + "selectAliases": { + "message": "Выбрать псевдонимы" + }, + "select": { + "message": "Выбрать" + }, + "starredCount": { + "message": "$COUNT$ отмечено", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deselectAll": { + "message": "Снять выбор со всех" + }, + "selectAll": { + "message": "Выбрать все" + }, + "selectedCount": { + "message": "Выбрано $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deleteCount": { + "message": "Удалить $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "allCount": { + "message": "Все ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "favoritesCount": { + "message": "Избранное ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "searchAliases": { + "message": "Поиск псевдонимов..." + }, + "allTags": { + "message": "Все теги" + }, + "mostRecent": { + "message": "Самые новые" + }, + "az": { + "message": "A-Z" + }, + "noFavoritesYet": { + "message": "Пока нет избранного" + }, + "starEmailsHint": { + "message": "Отмечайте письма из истории звездочкой, чтобы быстро открывать их здесь" + }, + "noResultsFound": { + "message": "Ничего не найдено" + }, + "differentSearchHint": { + "message": "Попробуйте другой поиск или фильтр" + }, + "showQrCode": { + "message": "Показать QR-код" + }, + "removeFromFavorites": { + "message": "Удалить из избранного" + }, + "addToFavorites": { + "message": "Добавить в избранное" + }, + "showingRange": { + "message": "Показано $START$-$END$ из $TOTAL$", + "placeholders": { + "start": { + "content": "$1" + }, + "end": { + "content": "$2" + }, + "total": { + "content": "$3" + } + } + }, + "perPage": { + "message": "$COUNT$ / стр.", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "firstPage": { + "message": "Первая страница" + }, + "previousPage": { + "message": "Предыдущая страница" + }, + "nextPage": { + "message": "Следующая страница" + }, + "lastPage": { + "message": "Последняя страница" + }, + "scanToCopyAlias": { + "message": "Отсканируйте, чтобы скопировать псевдоним" + }, + "general": { + "message": "Общие" + }, + "accounts": { + "message": "Аккаунты" + }, + "changelog": { + "message": "Журнал изменений" + }, + "appearanceDisplay": { + "message": "Внешний вид и отображение" + }, + "theme": { + "message": "Тема" + }, + "themeLight": { + "message": "Светлая" + }, + "themeDark": { + "message": "Темная" + }, + "themeAuto": { + "message": "Система (авто)" + }, + "badgeCounter": { + "message": "Счетчик значка" + }, + "badgeNone": { + "message": "Нет (скрыто)" + }, + "badgeTotal": { + "message": "Всего в истории" + }, + "badgeAllTime": { + "message": "Всего создано (за все время)" + }, + "badgeToday": { + "message": "Создано сегодня" + }, + "badgeWeek": { + "message": "На этой неделе" + }, + "copyNotifications": { + "message": "Уведомления о копировании" + }, + "aliasGeneration": { + "message": "Создание псевдонимов" + }, + "randomAliasFormat": { + "message": "Формат случайного псевдонима" + }, + "autoSaveLimit": { + "message": "Лимит автосохранения" + }, + "aliasesLimit": { + "message": "$COUNT$ псевдонимов", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "customPresets": { + "message": "Пользовательские шаблоны" + }, + "label": { + "message": "Метка" + }, + "tag": { + "message": "Тег" + }, + "addPreset": { + "message": "+ Добавить шаблон" + }, + "dataManagement": { + "message": "Управление данными" + }, + "export": { + "message": "Экспорт" + }, + "import": { + "message": "Импорт" + }, + "clear": { + "message": "Очистить" + }, + "resetSettings": { + "message": "Сбросить все настройки по умолчанию" + }, + "resetSettingsTitle": { + "message": "Сбросить настройки?" + }, + "resetSettingsMessage": { + "message": "Это восстановит все настройки до значений по умолчанию." + }, + "reset": { + "message": "Сбросить" + }, + "clearHistoryTitle": { + "message": "Очистить недавние псевдонимы?" + }, + "clearHistoryMessage": { + "message": "Это удалит все псевдонимы из списка недавней истории." + }, + "emailAccounts": { + "message": "Почтовые аккаунты" + }, + "manageAccountsDescription": { + "message": "Управляйте своими аккаунтами Gmail. У каждого аккаунта своя история, статистика и избранное." + }, + "noAccountsFound": { + "message": "Аккаунты не найдены. Добавьте аккаунт с главного экрана." + }, + "emailAddress": { + "message": "Адрес электронной почты" + }, + "accountLabel": { + "message": "Метка аккаунта" + }, + "emailAddressPlaceholder": { + "message": "your.email@gmail.com" + }, + "emailChangeWarning": { + "message": "При изменении e-mail все данные будут перенесены на новый адрес" + }, + "saveChanges": { + "message": "Сохранить изменения" + }, + "active": { + "message": "Активен" + }, + "editAccount": { + "message": "Редактировать аккаунт" + }, + "cannotDeleteLastAccountTitle": { + "message": "Нельзя удалить последний аккаунт" + }, + "deleteThisAccount": { + "message": "Удалить этот аккаунт" + }, + "deleteAccountTitle": { + "message": "Удалить аккаунт?" + }, + "deleteAccountMessage": { + "message": "Удалить \"$LABEL$\" ($EMAIL$)?\n\nЭто навсегда удалит:\n- Всю историю этого аккаунта\n- Всю статистику\n- Все избранное\n\nЭто действие нельзя отменить.", + "placeholders": { + "label": { + "content": "$1" + }, + "email": { + "content": "$2" + } + } + }, + "delete": { + "message": "Удалить" + }, + "changeAccountEmailTitle": { + "message": "Изменить e-mail аккаунта?" + }, + "changeAccountEmailMessage": { + "message": "Изменить e-mail с\n$OLD_EMAIL$\nна\n$NEW_EMAIL$?\n\nЭто выполнит:\n- Перенос всей истории, статистики и избранного на новый e-mail\n- Обновление e-mail аккаунта\n- Удаление данных, связанных со старым e-mail\n\nПродолжить?", + "placeholders": { + "old_email": { + "content": "$1" + }, + "new_email": { + "content": "$2" + } + } + }, + "changeEmail": { + "message": "Изменить e-mail" + }, + "menuForThisWebsite": { + "message": "Для этого сайта" + }, + "menuLoading": { + "message": "Загрузка..." + }, + "menuRandomEmailAlias": { + "message": "Случайный e-mail псевдоним" + }, + "menuCustomTags": { + "message": "Пользовательские теги" + }, + "menuNoPresets": { + "message": "Нет шаблонов - добавьте в Настройках" + }, + "menuGmailTricks": { + "message": "Трюки Gmail" + }, + "menuDotVariation": { + "message": "Вариант с точками" + }, + "menuGooglemailDomain": { + "message": "Домен Googlemail" + }, + "menuRemoveAllDots": { + "message": "Удалить все точки" + }, + "toastPresetAdded": { + "message": "Шаблон добавлен" + }, + "toastPresetRemoved": { + "message": "Шаблон удален" + }, + "toastSettingsExported": { + "message": "Настройки экспортированы" + }, + "toastSettingsImported": { + "message": "Настройки импортированы" + }, + "toastImportFailed": { + "message": "Ошибка импорта - недопустимый файл" + }, + "toastSettingsReset": { + "message": "Настройки сброшены по умолчанию" + }, + "toastAccountSwitched": { + "message": "Аккаунт переключен" + }, + "toastAccountDeleted": { + "message": "Аккаунт удален" + }, + "toastAccountUpdated": { + "message": "Аккаунт обновлен" + }, + "toastAccountAdded": { + "message": "$LABEL$ добавлен", + "placeholders": { + "label": { + "content": "$1" + } + } + }, + "errorLabelRequired": { + "message": "Метка не может быть пустой" + }, + "errorInvalidEmail": { + "message": "Введите действительный адрес электронной почты" + }, + "errorDuplicateEmail": { + "message": "Этот адрес уже используется другим аккаунтом" + }, + "errorEnterEmail": { + "message": "Введите адрес электронной почты" + }, + "errorAccountExists": { + "message": "Этот аккаунт уже существует" + }, + "toastQrFailed": { + "message": "Не удалось создать QR-код" + }, + "toastExportedAliases": { + "message": "Экспортировано псевдонимов: $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastDeletedAliases": { + "message": "Удалено псевдонимов: $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastHistoryCleared": { + "message": "История очищена" + }, + "toastFavoriteAdded": { + "message": "Добавлено в избранное" + }, + "toastFavoriteRemoved": { + "message": "Удалено из избранного" + }, + "toastCopiedEmail": { + "message": "Скопировано $EMAIL$", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "toastCopyFailed": { + "message": "Не удалось скопировать" + }, + "welcomeTitle": { + "message": "Добро пожаловать в Gmail Alias Toolkit" + }, + "welcomeSubtitle": { + "message": "Создавайте неограниченное количество e-mail псевдонимов для приватности и порядка" + }, + "letsGetStarted": { + "message": "Начнем" + }, + "enterGmailAddress": { + "message": "Введите ваш адрес Gmail" + }, + "pressTabForGmail": { + "message": "Нажмите $KEY$ для @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "settingUp": { + "message": "Настройка..." + }, + "getStarted": { + "message": "Начать" + }, + "advancedSetup": { + "message": "Расширенная настройка в Настройках" + }, + "whatYouCanDo": { + "message": "Что можно делать:" + }, + "featurePrivateEmail": { + "message": "Генератор личной почты" + }, + "featureCustomTags": { + "message": "Пользовательские теги и шаблоны" + }, + "featureGmailTricks": { + "message": "Расширенные трюки Gmail" + }, + "welcomeFooter": { + "message": "Все данные хранятся локально. Без отслеживания, без сервера." + }, + "favoritesSaved": { + "message": "Сохранено $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "clickStarHint": { + "message": "Нажмите звезду на любом псевдониме в истории, чтобы добавить его сюда" + }, + "viewStatistics": { + "message": "Показать статистику" + }, + "statistics": { + "message": "Статистика" + }, + "metricsTab": { + "message": "Метрики" + }, + "timelineTab": { + "message": "Хронология" + }, + "tagsTab": { + "message": "Теги" + }, + "totalGenerated": { + "message": "Всего создано" + }, + "createdToday": { + "message": "Создано сегодня" + }, + "thisWeek": { + "message": "На этой неделе" + }, + "thisMonth": { + "message": "В этом месяце" + }, + "topTag": { + "message": "Лучший тег" + }, + "totalTags": { + "message": "Всего тегов" + }, + "noTagsYet": { + "message": "Пока нет тегов" + }, + "disableInlineForSite": { + "message": "Отключить встроенного помощника на этом сайте" + }, + "inlineDisabledSites": { + "message": "Сайты с отключённым встроенным помощником" + }, + "inlineDisabledSitesDescription": { + "message": "На этих сайтах встроенный значок и быстрое окно будут скрыты." + }, + "noDisabledSites": { + "message": "Нет отключённых сайтов" + }, + "enableInlineForSite": { + "message": "Включить" + }, + "reportReview": { + "message": "Сообщить / Оценить" + }, + "percentLabel": { + "message": "$PERCENT$%", + "placeholders": { + "percent": { + "content": "$1" + } + } + }, + "enable": { + "message": "Включить" + }, + "retry": { + "message": "Повторить" + }, + "storageError": { + "message": "Не удалось загрузить историю. Проверьте доступ к хранилищу." + } } diff --git a/public/_locales/tr/messages.json b/public/_locales/tr/messages.json index 412f25a7..c527b7b7 100644 --- a/public/_locales/tr/messages.json +++ b/public/_locales/tr/messages.json @@ -1,774 +1,774 @@ { - "extensionName": { - "message": "Gmail Alias Toolkit" - }, - "extensionDescription": { - "message": "+tag adresleri ve hazır ayarlarla Gmail takma adları oluÅŸturun ve yönetin" - }, - "headerSubtitle": { - "message": "+tag adresleriyle takma adlar oluÅŸturun" - }, - "settings": { - "message": "Ayarlar" - }, - "back": { - "message": "Geri" - }, - "close": { - "message": "Kapat" - }, - "cancel": { - "message": "İptal" - }, - "copy": { - "message": "Kopyala" - }, - "copyAll": { - "message": "Tümünü kopyala" - }, - "copyToClipboard": { - "message": "Panoya kopyala" - }, - "activeGmailAddress": { - "message": "Etkin Gmail Adresi" - }, - "addNewAccount": { - "message": "Yeni hesap ekle" - }, - "addAccount": { - "message": "Hesap ekle" - }, - "addNewAccountTitle": { - "message": "Yeni hesap ekle" - }, - "emailPlaceholder": { - "message": "email.adresin" - }, - "accountLabelPlaceholder": { - "message": "Etiket (isteÄŸe baÄŸlı, örn. İş, KiÅŸisel)" - }, - "pressTabToAddGmail": { - "message": "@gmail.com eklemek için $KEY$ tuÅŸuna basın", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "gmailWarning": { - "message": "Bu bir Gmail adresine benzemiyor. Plus adresleme en iyi Gmail ile çalışır." - }, - "random": { - "message": "Rastgele" - }, - "customTags": { - "message": "Özel etiketler" - }, - "gmailTricks": { - "message": "Gmail ipuçları" - }, - "tabTagsShort": { - "message": "Etiketler" - }, - "tabTricksShort": { - "message": "İpuçları" - }, - "generating": { - "message": "OluÅŸturuluyor" - }, - "copied": { - "message": "Kopyalandı" - }, - "switchToLightMode": { - "message": "Açık moda geç" - }, - "switchToDarkMode": { - "message": "Koyu moda geç" - }, - "aliasColumn": { - "message": "Takma ad" - }, - "copyEmailTooltip": { - "message": "$EMAIL$ - kopyalamak için tıklayın", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "pageLabel": { - "message": "Sayfa $PAGE$", - "placeholders": { - "page": { - "content": "$1" - } - } - }, - "dotTrick": { - "message": "Nokta ipucu" - }, - "plusTags": { - "message": "Plus (+) etiketleri" - }, - "googlemail": { - "message": "Googlemail" - }, - "removeDots": { - "message": "Noktaları kaldır" - }, - "dotPlus": { - "message": "Nokta + Plus" - }, - "allCombos": { - "message": "Tüm kombinasyonlar" - }, - "numberOfVariations": { - "message": "Varyasyon sayısı" - }, - "randomizeDotPositions": { - "message": "Nokta konumlarını rastgele yap" - }, - "sequential": { - "message": "Sıralı" - }, - "generateTricks": { - "message": "İpuçları oluÅŸtur" - }, - "generatedVariations": { - "message": "OluÅŸturulan varyasyonlar" - }, - "gmailTrickInfoLabel": { - "message": "Gmail ipucu:" - }, - "gmailTrickInfo": { - "message": "Noktalar yok sayılır ve + sonrasındaki her ÅŸey aynı gelen kutusuna gider" - }, - "format": { - "message": "Biçim" - }, - "privateMailFormat": { - "message": "Özel Posta (private-mail-xxxx)" - }, - "randomCharactersFormat": { - "message": "Rastgele karakterler (abc123xy)" - }, - "randomWordsFormat": { - "message": "Rastgele kelimeler (happy-fox-42)" - }, - "timestampFormat": { - "message": "Zaman damgası (1234567890)" - }, - "numberOfAliases": { - "message": "Takma ad sayısı" - }, - "generateRandomAliases": { - "message": "$COUNT$ rastgele takma ad$PLURAL$ oluÅŸtur", - "placeholders": { - "count": { - "content": "$1" - }, - "plural": { - "content": "$2" - } - } - }, - "generatedAliases": { - "message": "OluÅŸturulan takma adlar" - }, - "totalCount": { - "message": "Toplam $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "copiedAliases": { - "message": "$COUNT$ takma ad kopyalandı!", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "failedToCopy": { - "message": "Kopyalanamadı" - }, - "formatPrivateMail": { - "message": "Biçim: private-mail-xxxx" - }, - "formatAlphanumeric": { - "message": "8 rastgele karakter" - }, - "formatWords": { - "message": "2 rastgele kelime" - }, - "formatTimestamp": { - "message": "Unix zaman damgası" - }, - "tagPlaceholder": { - "message": "Etiket girin (örn. shopping, work)" - }, - "generate": { - "message": "OluÅŸtur" - }, - "yourPresets": { - "message": "Hazır ayarlarınız" - }, - "example": { - "message": "Örnek:" - }, - "copyExample": { - "message": "ÖrneÄŸi kopyala" - }, - "recentAliases": { - "message": "Son takma adlar" - }, - "favorites": { - "message": "Favoriler" - }, - "exportAsCsv": { - "message": "CSV olarak dışa aktar" - }, - "exportAsJson": { - "message": "JSON olarak dışa aktar" - }, - "selectAliases": { - "message": "Takma adları seç" - }, - "select": { - "message": "Seç" - }, - "starredCount": { - "message": "$COUNT$ yıldızlı", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deselectAll": { - "message": "Tüm seçimleri kaldır" - }, - "selectAll": { - "message": "Tümünü seç" - }, - "selectedCount": { - "message": "$COUNT$ seçildi", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deleteCount": { - "message": "$COUNT$ sil", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "allCount": { - "message": "Tümü ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "favoritesCount": { - "message": "Favoriler ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "searchAliases": { - "message": "Takma ad ara..." - }, - "allTags": { - "message": "Tüm etiketler" - }, - "mostRecent": { - "message": "En yeni" - }, - "az": { - "message": "A-Z" - }, - "noFavoritesYet": { - "message": "Henüz favori yok" - }, - "starEmailsHint": { - "message": "Buradan hızlı eriÅŸim için geçmiÅŸinizdeki e-postalara yıldız ekleyin" - }, - "noResultsFound": { - "message": "Sonuç bulunamadı" - }, - "differentSearchHint": { - "message": "Farklı bir arama veya filtre deneyin" - }, - "showQrCode": { - "message": "QR kodunu göster" - }, - "removeFromFavorites": { - "message": "Favorilerden kaldır" - }, - "addToFavorites": { - "message": "Favorilere ekle" - }, - "showingRange": { - "message": "$TOTAL$ içinden $START$-$END$ gösteriliyor", - "placeholders": { - "start": { - "content": "$1" - }, - "end": { - "content": "$2" - }, - "total": { - "content": "$3" - } - } - }, - "perPage": { - "message": "$COUNT$ / sayfa", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "firstPage": { - "message": "İlk sayfa" - }, - "previousPage": { - "message": "Önceki sayfa" - }, - "nextPage": { - "message": "Sonraki sayfa" - }, - "lastPage": { - "message": "Son sayfa" - }, - "scanToCopyAlias": { - "message": "Takma adı kopyalamak için tara" - }, - "general": { - "message": "Genel" - }, - "accounts": { - "message": "Hesaplar" - }, - "changelog": { - "message": "DeÄŸiÅŸiklik günlüğü" - }, - "appearanceDisplay": { - "message": "Görünüm ve görüntüleme" - }, - "theme": { - "message": "Tema" - }, - "themeLight": { - "message": "Açık" - }, - "themeDark": { - "message": "Koyu" - }, - "themeAuto": { - "message": "Sistem (Otomatik)" - }, - "badgeCounter": { - "message": "Rozet sayacı" - }, - "badgeNone": { - "message": "Yok (Gizli)" - }, - "badgeTotal": { - "message": "GeçmiÅŸte toplam" - }, - "badgeAllTime": { - "message": "Toplam oluÅŸturulan (tüm zamanlar)" - }, - "badgeToday": { - "message": "Bugün oluÅŸturuldu" - }, - "badgeWeek": { - "message": "Bu hafta" - }, - "copyNotifications": { - "message": "Kopyalama bildirimleri" - }, - "aliasGeneration": { - "message": "Takma ad oluÅŸturma" - }, - "randomAliasFormat": { - "message": "Rastgele takma ad biçimi" - }, - "autoSaveLimit": { - "message": "Otomatik kaydetme limiti" - }, - "aliasesLimit": { - "message": "$COUNT$ takma ad", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "customPresets": { - "message": "Özel hazır ayarlar" - }, - "label": { - "message": "Etiket" - }, - "tag": { - "message": "Etiket" - }, - "addPreset": { - "message": "+ Hazır ayar ekle" - }, - "dataManagement": { - "message": "Veri yönetimi" - }, - "export": { - "message": "Dışa aktar" - }, - "import": { - "message": "İçe aktar" - }, - "clear": { - "message": "Temizle" - }, - "resetSettings": { - "message": "Tüm ayarları varsayılana sıfırla" - }, - "resetSettingsTitle": { - "message": "Ayarlar sıfırlansın mı?" - }, - "resetSettingsMessage": { - "message": "Bu iÅŸlem tüm ayarları varsayılan deÄŸerlerine döndürür." - }, - "reset": { - "message": "Sıfırla" - }, - "clearHistoryTitle": { - "message": "Son takma adlar temizlensin mi?" - }, - "clearHistoryMessage": { - "message": "Bu iÅŸlem son geçmiÅŸ listesindeki tüm takma adları kaldırır." - }, - "emailAccounts": { - "message": "E-posta hesapları" - }, - "manageAccountsDescription": { - "message": "Gmail hesaplarınızı yönetin. Her hesabın kendi geçmiÅŸi, istatistikleri ve favorileri vardır." - }, - "noAccountsFound": { - "message": "Hesap bulunamadı. Lütfen ana ekrandan bir hesap ekleyin." - }, - "emailAddress": { - "message": "E-posta adresi" - }, - "accountLabel": { - "message": "Hesap etiketi" - }, - "emailAddressPlaceholder": { - "message": "email.adresin@gmail.com" - }, - "emailChangeWarning": { - "message": "E-posta deÄŸiÅŸtirildiÄŸinde tüm veriler yeni e-posta adresine taşınır" - }, - "saveChanges": { - "message": "DeÄŸiÅŸiklikleri kaydet" - }, - "active": { - "message": "Etkin" - }, - "editAccount": { - "message": "Hesabı düzenle" - }, - "cannotDeleteLastAccountTitle": { - "message": "Son hesap silinemez" - }, - "deleteThisAccount": { - "message": "Bu hesabı sil" - }, - "deleteAccountTitle": { - "message": "Hesap silinsin mi?" - }, - "deleteAccountMessage": { - "message": "\"$LABEL$\" ($EMAIL$) silinsin mi?\n\nBu iÅŸlem kalıcı olarak ÅŸunları siler:\n- Bu hesaba ait tüm geçmiÅŸ\n- Tüm istatistikler\n- Tüm favoriler\n\nBu iÅŸlem geri alınamaz.", - "placeholders": { - "label": { - "content": "$1" - }, - "email": { - "content": "$2" - } - } - }, - "delete": { - "message": "Sil" - }, - "changeAccountEmailTitle": { - "message": "Hesap e-postası deÄŸiÅŸtirilsin mi?" - }, - "changeAccountEmailMessage": { - "message": "E-postayı\n$OLD_EMAIL$\nadresinden\n$NEW_EMAIL$\nadresine deÄŸiÅŸtirilsin mi?\n\nBu iÅŸlem:\n- Tüm geçmiÅŸi, istatistikleri ve favorileri yeni e-postaya taşır\n- Hesap e-postasını günceller\n- Eski e-posta ile iliÅŸkili verileri siler\n\nDevam edilsin mi?", - "placeholders": { - "old_email": { - "content": "$1" - }, - "new_email": { - "content": "$2" - } - } - }, - "changeEmail": { - "message": "E-postayı deÄŸiÅŸtir" - }, - "menuForThisWebsite": { - "message": "Bu web sitesi için" - }, - "menuLoading": { - "message": "Yükleniyor..." - }, - "menuRandomEmailAlias": { - "message": "Rastgele e-posta takma adı" - }, - "menuCustomTags": { - "message": "Özel etiketler" - }, - "menuNoPresets": { - "message": "Hazır ayar yok - Ayarlardan ekleyin" - }, - "menuGmailTricks": { - "message": "Gmail ipuçları" - }, - "menuDotVariation": { - "message": "Nokta varyasyonu" - }, - "menuGooglemailDomain": { - "message": "Googlemail alan adı" - }, - "menuRemoveAllDots": { - "message": "Tüm noktaları kaldır" - }, - "toastPresetAdded": { - "message": "Hazır ayar eklendi" - }, - "toastPresetRemoved": { - "message": "Hazır ayar kaldırıldı" - }, - "toastSettingsExported": { - "message": "Ayarlar dışa aktarıldı" - }, - "toastSettingsImported": { - "message": "Ayarlar içe aktarıldı" - }, - "toastImportFailed": { - "message": "İçe aktarma baÅŸarısız - geçersiz dosya" - }, - "toastSettingsReset": { - "message": "Ayarlar varsayılana sıfırlandı" - }, - "toastAccountSwitched": { - "message": "Hesap deÄŸiÅŸtirildi" - }, - "toastAccountDeleted": { - "message": "Hesap silindi" - }, - "toastAccountUpdated": { - "message": "Hesap güncellendi" - }, - "toastAccountAdded": { - "message": "$LABEL$ eklendi", - "placeholders": { - "label": { - "content": "$1" - } - } - }, - "errorLabelRequired": { - "message": "Etiket boÅŸ olamaz" - }, - "errorInvalidEmail": { - "message": "Lütfen geçerli bir e-posta adresi girin" - }, - "errorDuplicateEmail": { - "message": "Bu e-posta adresi baÅŸka bir hesap tarafından kullanılıyor" - }, - "errorEnterEmail": { - "message": "Lütfen bir e-posta adresi girin" - }, - "errorAccountExists": { - "message": "Bu hesap zaten var" - }, - "toastQrFailed": { - "message": "QR kodu oluÅŸturulamadı" - }, - "toastExportedAliases": { - "message": "$COUNT$ takma ad dışa aktarıldı", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastDeletedAliases": { - "message": "$COUNT$ takma ad silindi", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastHistoryCleared": { - "message": "GeçmiÅŸ temizlendi" - }, - "toastFavoriteAdded": { - "message": "Favorilere eklendi" - }, - "toastFavoriteRemoved": { - "message": "Favorilerden kaldırıldı" - }, - "toastCopiedEmail": { - "message": "$EMAIL$ kopyalandı", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "toastCopyFailed": { - "message": "Kopyalanamadı" - }, - "welcomeTitle": { - "message": "Gmail Alias Toolkit’e hoÅŸ geldiniz" - }, - "welcomeSubtitle": { - "message": "Gizlilik ve düzen için sınırsız e-posta takma adı oluÅŸturun" - }, - "letsGetStarted": { - "message": "BaÅŸlayalım" - }, - "enterGmailAddress": { - "message": "Gmail adresinizi girin" - }, - "pressTabForGmail": { - "message": "@gmail.com için $KEY$ tuÅŸuna basın", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "settingUp": { - "message": "Ayarlanıyor..." - }, - "getStarted": { - "message": "BaÅŸla" - }, - "advancedSetup": { - "message": "Ayarlarda geliÅŸmiÅŸ kurulum" - }, - "whatYouCanDo": { - "message": "Yapabilecekleriniz:" - }, - "featurePrivateEmail": { - "message": "Özel e-posta oluÅŸturucu" - }, - "featureCustomTags": { - "message": "Özel etiketler ve hazır ayarlar" - }, - "featureGmailTricks": { - "message": "GeliÅŸmiÅŸ Gmail ipuçları" - }, - "welcomeFooter": { - "message": "Tüm veriler yerel olarak saklanır. Takip yok, sunucu yok." - }, - "favoritesSaved": { - "message": "$COUNT$ kaydedildi", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "clickStarHint": { - "message": "Buraya eklemek için geçmiÅŸteki herhangi bir takma adın yıldızına tıklayın" - }, - "viewStatistics": { - "message": "İstatistikleri görüntüle" - }, - "statistics": { - "message": "İstatistikler" - }, - "metricsTab": { - "message": "Metrikler" - }, - "timelineTab": { - "message": "Zaman çizelgesi" - }, - "tagsTab": { - "message": "Etiketler" - }, - "totalGenerated": { - "message": "Toplam oluÅŸturulan" - }, - "createdToday": { - "message": "Bugün oluÅŸturuldu" - }, - "thisWeek": { - "message": "Bu hafta" - }, - "thisMonth": { - "message": "Bu ay" - }, - "topTag": { - "message": "En iyi etiket" - }, - "totalTags": { - "message": "Toplam etiket" - }, - "noTagsYet": { - "message": "Henüz etiket yok" - }, - "disableInlineForSite": { - "message": "Bu web sitesinde satır içi yardımcıyı kapat" - }, - "inlineDisabledSites": { - "message": "Satır içi yardımcının kapalı olduÄŸu siteler" - }, - "inlineDisabledSitesDescription": { - "message": "Bu sitelerde satır içi simge ve hızlı açılır pencere gizlenir." - }, - "noDisabledSites": { - "message": "Devre dışı bırakılmış site yok" - }, - "enableInlineForSite": { - "message": "EtkinleÅŸtir" - }, - "reportReview": { - "message": "Bildir / DeÄŸerlendir" - }, - "percentLabel": { - "message": "$PERCENT$%", - "placeholders": { - "percent": { - "content": "$1" - } - } - }, - "retry": { - "message": "Yeniden Dene" - }, - "enable": { - "message": "Etkinleştir" - }, - "storageError": { - "message": "Geçmiş yüklenemedi. Depolama erişimini kontrol edin." - } + "extensionName": { + "message": "Gmail Alias Toolkit" + }, + "extensionDescription": { + "message": "+tag adresleri ve hazır ayarlarla Gmail takma adları oluşturun ve yönetin" + }, + "headerSubtitle": { + "message": "+tag adresleriyle takma adlar oluşturun" + }, + "settings": { + "message": "Ayarlar" + }, + "back": { + "message": "Geri" + }, + "close": { + "message": "Kapat" + }, + "cancel": { + "message": "İptal" + }, + "copy": { + "message": "Kopyala" + }, + "copyAll": { + "message": "Tümünü kopyala" + }, + "copyToClipboard": { + "message": "Panoya kopyala" + }, + "activeGmailAddress": { + "message": "Etkin Gmail Adresi" + }, + "addNewAccount": { + "message": "Yeni hesap ekle" + }, + "addAccount": { + "message": "Hesap ekle" + }, + "addNewAccountTitle": { + "message": "Yeni hesap ekle" + }, + "emailPlaceholder": { + "message": "email.adresin" + }, + "accountLabelPlaceholder": { + "message": "Etiket (isteğe bağlı, örn. İş, Kişisel)" + }, + "pressTabToAddGmail": { + "message": "@gmail.com eklemek için $KEY$ tuşuna basın", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "gmailWarning": { + "message": "Bu bir Gmail adresine benzemiyor. Plus adresleme en iyi Gmail ile çalışır." + }, + "random": { + "message": "Rastgele" + }, + "customTags": { + "message": "Özel etiketler" + }, + "gmailTricks": { + "message": "Gmail ipuçları" + }, + "tabTagsShort": { + "message": "Etiketler" + }, + "tabTricksShort": { + "message": "İpuçları" + }, + "generating": { + "message": "Oluşturuluyor" + }, + "copied": { + "message": "Kopyalandı" + }, + "switchToLightMode": { + "message": "Açık moda geç" + }, + "switchToDarkMode": { + "message": "Koyu moda geç" + }, + "aliasColumn": { + "message": "Takma ad" + }, + "copyEmailTooltip": { + "message": "$EMAIL$ - kopyalamak için tıklayın", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "pageLabel": { + "message": "Sayfa $PAGE$", + "placeholders": { + "page": { + "content": "$1" + } + } + }, + "dotTrick": { + "message": "Nokta ipucu" + }, + "plusTags": { + "message": "Plus (+) etiketleri" + }, + "googlemail": { + "message": "Googlemail" + }, + "removeDots": { + "message": "Noktaları kaldır" + }, + "dotPlus": { + "message": "Nokta + Plus" + }, + "allCombos": { + "message": "Tüm kombinasyonlar" + }, + "numberOfVariations": { + "message": "Varyasyon sayısı" + }, + "randomizeDotPositions": { + "message": "Nokta konumlarını rastgele yap" + }, + "sequential": { + "message": "Sıralı" + }, + "generateTricks": { + "message": "İpuçları oluştur" + }, + "generatedVariations": { + "message": "Oluşturulan varyasyonlar" + }, + "gmailTrickInfoLabel": { + "message": "Gmail ipucu:" + }, + "gmailTrickInfo": { + "message": "Noktalar yok sayılır ve + sonrasındaki her şey aynı gelen kutusuna gider" + }, + "format": { + "message": "Biçim" + }, + "privateMailFormat": { + "message": "Özel Posta (private-mail-xxxx)" + }, + "randomCharactersFormat": { + "message": "Rastgele karakterler (abc123xy)" + }, + "randomWordsFormat": { + "message": "Rastgele kelimeler (happy-fox-42)" + }, + "timestampFormat": { + "message": "Zaman damgası (1234567890)" + }, + "numberOfAliases": { + "message": "Takma ad sayısı" + }, + "generateRandomAliases": { + "message": "$COUNT$ rastgele takma ad$PLURAL$ oluştur", + "placeholders": { + "count": { + "content": "$1" + }, + "plural": { + "content": "$2" + } + } + }, + "generatedAliases": { + "message": "Oluşturulan takma adlar" + }, + "totalCount": { + "message": "Toplam $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "copiedAliases": { + "message": "$COUNT$ takma ad kopyalandı!", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "failedToCopy": { + "message": "Kopyalanamadı" + }, + "formatPrivateMail": { + "message": "Biçim: private-mail-xxxx" + }, + "formatAlphanumeric": { + "message": "8 rastgele karakter" + }, + "formatWords": { + "message": "2 rastgele kelime" + }, + "formatTimestamp": { + "message": "Unix zaman damgası" + }, + "tagPlaceholder": { + "message": "Etiket girin (örn. shopping, work)" + }, + "generate": { + "message": "Oluştur" + }, + "yourPresets": { + "message": "Hazır ayarlarınız" + }, + "example": { + "message": "Örnek:" + }, + "copyExample": { + "message": "Örneği kopyala" + }, + "recentAliases": { + "message": "Son takma adlar" + }, + "favorites": { + "message": "Favoriler" + }, + "exportAsCsv": { + "message": "CSV olarak dışa aktar" + }, + "exportAsJson": { + "message": "JSON olarak dışa aktar" + }, + "selectAliases": { + "message": "Takma adları seç" + }, + "select": { + "message": "Seç" + }, + "starredCount": { + "message": "$COUNT$ yıldızlı", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deselectAll": { + "message": "Tüm seçimleri kaldır" + }, + "selectAll": { + "message": "Tümünü seç" + }, + "selectedCount": { + "message": "$COUNT$ seçildi", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deleteCount": { + "message": "$COUNT$ sil", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "allCount": { + "message": "Tümü ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "favoritesCount": { + "message": "Favoriler ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "searchAliases": { + "message": "Takma ad ara..." + }, + "allTags": { + "message": "Tüm etiketler" + }, + "mostRecent": { + "message": "En yeni" + }, + "az": { + "message": "A-Z" + }, + "noFavoritesYet": { + "message": "Henüz favori yok" + }, + "starEmailsHint": { + "message": "Buradan hızlı erişim için geçmişinizdeki e-postalara yıldız ekleyin" + }, + "noResultsFound": { + "message": "Sonuç bulunamadı" + }, + "differentSearchHint": { + "message": "Farklı bir arama veya filtre deneyin" + }, + "showQrCode": { + "message": "QR kodunu göster" + }, + "removeFromFavorites": { + "message": "Favorilerden kaldır" + }, + "addToFavorites": { + "message": "Favorilere ekle" + }, + "showingRange": { + "message": "$TOTAL$ içinden $START$-$END$ gösteriliyor", + "placeholders": { + "start": { + "content": "$1" + }, + "end": { + "content": "$2" + }, + "total": { + "content": "$3" + } + } + }, + "perPage": { + "message": "$COUNT$ / sayfa", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "firstPage": { + "message": "İlk sayfa" + }, + "previousPage": { + "message": "Önceki sayfa" + }, + "nextPage": { + "message": "Sonraki sayfa" + }, + "lastPage": { + "message": "Son sayfa" + }, + "scanToCopyAlias": { + "message": "Takma adı kopyalamak için tara" + }, + "general": { + "message": "Genel" + }, + "accounts": { + "message": "Hesaplar" + }, + "changelog": { + "message": "Değişiklik günlüğü" + }, + "appearanceDisplay": { + "message": "Görünüm ve görüntüleme" + }, + "theme": { + "message": "Tema" + }, + "themeLight": { + "message": "Açık" + }, + "themeDark": { + "message": "Koyu" + }, + "themeAuto": { + "message": "Sistem (Otomatik)" + }, + "badgeCounter": { + "message": "Rozet sayacı" + }, + "badgeNone": { + "message": "Yok (Gizli)" + }, + "badgeTotal": { + "message": "Geçmişte toplam" + }, + "badgeAllTime": { + "message": "Toplam oluşturulan (tüm zamanlar)" + }, + "badgeToday": { + "message": "Bugün oluşturuldu" + }, + "badgeWeek": { + "message": "Bu hafta" + }, + "copyNotifications": { + "message": "Kopyalama bildirimleri" + }, + "aliasGeneration": { + "message": "Takma ad oluşturma" + }, + "randomAliasFormat": { + "message": "Rastgele takma ad biçimi" + }, + "autoSaveLimit": { + "message": "Otomatik kaydetme limiti" + }, + "aliasesLimit": { + "message": "$COUNT$ takma ad", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "customPresets": { + "message": "Özel hazır ayarlar" + }, + "label": { + "message": "Etiket" + }, + "tag": { + "message": "Etiket" + }, + "addPreset": { + "message": "+ Hazır ayar ekle" + }, + "dataManagement": { + "message": "Veri yönetimi" + }, + "export": { + "message": "Dışa aktar" + }, + "import": { + "message": "İçe aktar" + }, + "clear": { + "message": "Temizle" + }, + "resetSettings": { + "message": "Tüm ayarları varsayılana sıfırla" + }, + "resetSettingsTitle": { + "message": "Ayarlar sıfırlansın mı?" + }, + "resetSettingsMessage": { + "message": "Bu işlem tüm ayarları varsayılan değerlerine döndürür." + }, + "reset": { + "message": "Sıfırla" + }, + "clearHistoryTitle": { + "message": "Son takma adlar temizlensin mi?" + }, + "clearHistoryMessage": { + "message": "Bu işlem son geçmiş listesindeki tüm takma adları kaldırır." + }, + "emailAccounts": { + "message": "E-posta hesapları" + }, + "manageAccountsDescription": { + "message": "Gmail hesaplarınızı yönetin. Her hesabın kendi geçmişi, istatistikleri ve favorileri vardır." + }, + "noAccountsFound": { + "message": "Hesap bulunamadı. Lütfen ana ekrandan bir hesap ekleyin." + }, + "emailAddress": { + "message": "E-posta adresi" + }, + "accountLabel": { + "message": "Hesap etiketi" + }, + "emailAddressPlaceholder": { + "message": "email.adresin@gmail.com" + }, + "emailChangeWarning": { + "message": "E-posta değiştirildiğinde tüm veriler yeni e-posta adresine taşınır" + }, + "saveChanges": { + "message": "Değişiklikleri kaydet" + }, + "active": { + "message": "Etkin" + }, + "editAccount": { + "message": "Hesabı düzenle" + }, + "cannotDeleteLastAccountTitle": { + "message": "Son hesap silinemez" + }, + "deleteThisAccount": { + "message": "Bu hesabı sil" + }, + "deleteAccountTitle": { + "message": "Hesap silinsin mi?" + }, + "deleteAccountMessage": { + "message": "\"$LABEL$\" ($EMAIL$) silinsin mi?\n\nBu işlem kalıcı olarak şunları siler:\n- Bu hesaba ait tüm geçmiş\n- Tüm istatistikler\n- Tüm favoriler\n\nBu işlem geri alınamaz.", + "placeholders": { + "label": { + "content": "$1" + }, + "email": { + "content": "$2" + } + } + }, + "delete": { + "message": "Sil" + }, + "changeAccountEmailTitle": { + "message": "Hesap e-postası değiştirilsin mi?" + }, + "changeAccountEmailMessage": { + "message": "E-postayı\n$OLD_EMAIL$\nadresinden\n$NEW_EMAIL$\nadresine değiştirilsin mi?\n\nBu işlem:\n- Tüm geçmişi, istatistikleri ve favorileri yeni e-postaya taşır\n- Hesap e-postasını günceller\n- Eski e-posta ile ilişkili verileri siler\n\nDevam edilsin mi?", + "placeholders": { + "old_email": { + "content": "$1" + }, + "new_email": { + "content": "$2" + } + } + }, + "changeEmail": { + "message": "E-postayı değiştir" + }, + "menuForThisWebsite": { + "message": "Bu web sitesi için" + }, + "menuLoading": { + "message": "Yükleniyor..." + }, + "menuRandomEmailAlias": { + "message": "Rastgele e-posta takma adı" + }, + "menuCustomTags": { + "message": "Özel etiketler" + }, + "menuNoPresets": { + "message": "Hazır ayar yok - Ayarlardan ekleyin" + }, + "menuGmailTricks": { + "message": "Gmail ipuçları" + }, + "menuDotVariation": { + "message": "Nokta varyasyonu" + }, + "menuGooglemailDomain": { + "message": "Googlemail alan adı" + }, + "menuRemoveAllDots": { + "message": "Tüm noktaları kaldır" + }, + "toastPresetAdded": { + "message": "Hazır ayar eklendi" + }, + "toastPresetRemoved": { + "message": "Hazır ayar kaldırıldı" + }, + "toastSettingsExported": { + "message": "Ayarlar dışa aktarıldı" + }, + "toastSettingsImported": { + "message": "Ayarlar içe aktarıldı" + }, + "toastImportFailed": { + "message": "İçe aktarma başarısız - geçersiz dosya" + }, + "toastSettingsReset": { + "message": "Ayarlar varsayılana sıfırlandı" + }, + "toastAccountSwitched": { + "message": "Hesap değiştirildi" + }, + "toastAccountDeleted": { + "message": "Hesap silindi" + }, + "toastAccountUpdated": { + "message": "Hesap güncellendi" + }, + "toastAccountAdded": { + "message": "$LABEL$ eklendi", + "placeholders": { + "label": { + "content": "$1" + } + } + }, + "errorLabelRequired": { + "message": "Etiket boş olamaz" + }, + "errorInvalidEmail": { + "message": "Lütfen geçerli bir e-posta adresi girin" + }, + "errorDuplicateEmail": { + "message": "Bu e-posta adresi başka bir hesap tarafından kullanılıyor" + }, + "errorEnterEmail": { + "message": "Lütfen bir e-posta adresi girin" + }, + "errorAccountExists": { + "message": "Bu hesap zaten var" + }, + "toastQrFailed": { + "message": "QR kodu oluşturulamadı" + }, + "toastExportedAliases": { + "message": "$COUNT$ takma ad dışa aktarıldı", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastDeletedAliases": { + "message": "$COUNT$ takma ad silindi", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastHistoryCleared": { + "message": "Geçmiş temizlendi" + }, + "toastFavoriteAdded": { + "message": "Favorilere eklendi" + }, + "toastFavoriteRemoved": { + "message": "Favorilerden kaldırıldı" + }, + "toastCopiedEmail": { + "message": "$EMAIL$ kopyalandı", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "toastCopyFailed": { + "message": "Kopyalanamadı" + }, + "welcomeTitle": { + "message": "Gmail Alias Toolkit’e hoş geldiniz" + }, + "welcomeSubtitle": { + "message": "Gizlilik ve düzen için sınırsız e-posta takma adı oluşturun" + }, + "letsGetStarted": { + "message": "Başlayalım" + }, + "enterGmailAddress": { + "message": "Gmail adresinizi girin" + }, + "pressTabForGmail": { + "message": "@gmail.com için $KEY$ tuşuna basın", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "settingUp": { + "message": "Ayarlanıyor..." + }, + "getStarted": { + "message": "Başla" + }, + "advancedSetup": { + "message": "Ayarlarda gelişmiş kurulum" + }, + "whatYouCanDo": { + "message": "Yapabilecekleriniz:" + }, + "featurePrivateEmail": { + "message": "Özel e-posta oluşturucu" + }, + "featureCustomTags": { + "message": "Özel etiketler ve hazır ayarlar" + }, + "featureGmailTricks": { + "message": "Gelişmiş Gmail ipuçları" + }, + "welcomeFooter": { + "message": "Tüm veriler yerel olarak saklanır. Takip yok, sunucu yok." + }, + "favoritesSaved": { + "message": "$COUNT$ kaydedildi", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "clickStarHint": { + "message": "Buraya eklemek için geçmişteki herhangi bir takma adın yıldızına tıklayın" + }, + "viewStatistics": { + "message": "İstatistikleri görüntüle" + }, + "statistics": { + "message": "İstatistikler" + }, + "metricsTab": { + "message": "Metrikler" + }, + "timelineTab": { + "message": "Zaman çizelgesi" + }, + "tagsTab": { + "message": "Etiketler" + }, + "totalGenerated": { + "message": "Toplam oluşturulan" + }, + "createdToday": { + "message": "Bugün oluşturuldu" + }, + "thisWeek": { + "message": "Bu hafta" + }, + "thisMonth": { + "message": "Bu ay" + }, + "topTag": { + "message": "En iyi etiket" + }, + "totalTags": { + "message": "Toplam etiket" + }, + "noTagsYet": { + "message": "Henüz etiket yok" + }, + "disableInlineForSite": { + "message": "Bu web sitesinde satır içi yardımcıyı kapat" + }, + "inlineDisabledSites": { + "message": "Satır içi yardımcının kapalı olduğu siteler" + }, + "inlineDisabledSitesDescription": { + "message": "Bu sitelerde satır içi simge ve hızlı açılır pencere gizlenir." + }, + "noDisabledSites": { + "message": "Devre dışı bırakılmış site yok" + }, + "enableInlineForSite": { + "message": "Etkinleştir" + }, + "reportReview": { + "message": "Bildir / Değerlendir" + }, + "percentLabel": { + "message": "$PERCENT$%", + "placeholders": { + "percent": { + "content": "$1" + } + } + }, + "enable": { + "message": "Etkinleştir" + }, + "retry": { + "message": "Yeniden Dene" + }, + "storageError": { + "message": "Geçmiş yüklenemedi. Depolama erişimini kontrol edin." + } } diff --git a/public/_locales/vi/messages.json b/public/_locales/vi/messages.json index b7597558..b17f8aae 100644 --- a/public/_locales/vi/messages.json +++ b/public/_locales/vi/messages.json @@ -1,774 +1,774 @@ { - "extensionName": { - "message": "Gmail Alias Toolkit" - }, - "extensionDescription": { - "message": "Tạo và quản lý alias Gmail bằng cú pháp +tag và preset" - }, - "headerSubtitle": { - "message": "Tạo alias bằng cú pháp +tag" - }, - "settings": { - "message": "Cài đặt" - }, - "back": { - "message": "Quay lại" - }, - "close": { - "message": "Đóng" - }, - "cancel": { - "message": "Há»§y" - }, - "copy": { - "message": "Sao chép" - }, - "copyAll": { - "message": "Sao chép tất cả" - }, - "copyToClipboard": { - "message": "Sao chép vào clipboard" - }, - "activeGmailAddress": { - "message": "Địa chỉ Gmail Ä‘ang hoạt động" - }, - "addNewAccount": { - "message": "Thêm tài khoản má»›i" - }, - "addAccount": { - "message": "Thêm tài khoản" - }, - "addNewAccountTitle": { - "message": "Thêm tài khoản má»›i" - }, - "emailPlaceholder": { - "message": "email.cua.ban" - }, - "accountLabelPlaceholder": { - "message": "Nhãn (tùy chọn, ví dụ: Công việc, Cá nhân)" - }, - "pressTabToAddGmail": { - "message": "Nhấn $KEY$ để thêm @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "gmailWarning": { - "message": "Địa chỉ này có vẻ không phải Gmail. Địa chỉ cá»™ng hoạt động tốt nhất vá»›i Gmail." - }, - "random": { - "message": "Ngẫu nhiên" - }, - "customTags": { - "message": "Thẻ tùy chỉnh" - }, - "gmailTricks": { - "message": "Thá»§ thuật Gmail" - }, - "tabTagsShort": { - "message": "Thẻ" - }, - "tabTricksShort": { - "message": "Mẹo" - }, - "generating": { - "message": "Đang tạo" - }, - "copied": { - "message": "Đã sao chép" - }, - "switchToLightMode": { - "message": "Chuyển sang chế độ sáng" - }, - "switchToDarkMode": { - "message": "Chuyển sang chế độ tối" - }, - "aliasColumn": { - "message": "Bí danh" - }, - "copyEmailTooltip": { - "message": "$EMAIL$ - nhấp để sao chép", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "pageLabel": { - "message": "Trang $PAGE$", - "placeholders": { - "page": { - "content": "$1" - } - } - }, - "dotTrick": { - "message": "Thá»§ thuật dấu chấm" - }, - "plusTags": { - "message": "Thẻ cá»™ng (+)" - }, - "googlemail": { - "message": "Googlemail" - }, - "removeDots": { - "message": "Xóa dấu chấm" - }, - "dotPlus": { - "message": "Dấu chấm + Dấu cá»™ng" - }, - "allCombos": { - "message": "Tất cả kết hợp" - }, - "numberOfVariations": { - "message": "Số biến thể" - }, - "randomizeDotPositions": { - "message": "Ngẫu nhiên vị trí dấu chấm" - }, - "sequential": { - "message": "Tuần tá»±" - }, - "generateTricks": { - "message": "Tạo thá»§ thuật" - }, - "generatedVariations": { - "message": "Biến thể đã tạo" - }, - "gmailTrickInfoLabel": { - "message": "Thá»§ thuật Gmail:" - }, - "gmailTrickInfo": { - "message": "Dấu chấm bị bỏ qua và mọi ná»™i dung sau dấu + sẽ vào cùng má»™t há»™p thư" - }, - "format": { - "message": "Định dạng" - }, - "privateMailFormat": { - "message": "Private Mail (private-mail-xxxx)" - }, - "randomCharactersFormat": { - "message": "Ký tá»± ngẫu nhiên (abc123xy)" - }, - "randomWordsFormat": { - "message": "Từ ngẫu nhiên (happy-fox-42)" - }, - "timestampFormat": { - "message": "Dấu thời gian (1234567890)" - }, - "numberOfAliases": { - "message": "Số bí danh" - }, - "generateRandomAliases": { - "message": "Tạo $COUNT$ bí danh ngẫu nhiên$PLURAL$", - "placeholders": { - "count": { - "content": "$1" - }, - "plural": { - "content": "$2" - } - } - }, - "generatedAliases": { - "message": "Bí danh đã tạo" - }, - "totalCount": { - "message": "Tổng cá»™ng $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "copiedAliases": { - "message": "Đã sao chép $COUNT$ bí danh!", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "failedToCopy": { - "message": "Sao chép thất bại" - }, - "formatPrivateMail": { - "message": "Định dạng: private-mail-xxxx" - }, - "formatAlphanumeric": { - "message": "8 ký tá»± ngẫu nhiên" - }, - "formatWords": { - "message": "2 từ ngẫu nhiên" - }, - "formatTimestamp": { - "message": "Dấu thời gian Unix" - }, - "tagPlaceholder": { - "message": "Nhập thẻ (ví dụ: shopping, work)" - }, - "generate": { - "message": "Tạo" - }, - "yourPresets": { - "message": "Preset cá»§a bạn" - }, - "example": { - "message": "Ví dụ:" - }, - "copyExample": { - "message": "Sao chép ví dụ" - }, - "recentAliases": { - "message": "Bí danh gần đây" - }, - "favorites": { - "message": "Yêu thích" - }, - "exportAsCsv": { - "message": "Xuất CSV" - }, - "exportAsJson": { - "message": "Xuất JSON" - }, - "selectAliases": { - "message": "Chọn bí danh" - }, - "select": { - "message": "Chọn" - }, - "starredCount": { - "message": "$COUNT$ đã đánh dấu sao", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deselectAll": { - "message": "Bỏ chọn tất cả" - }, - "selectAll": { - "message": "Chọn tất cả" - }, - "selectedCount": { - "message": "Đã chọn $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deleteCount": { - "message": "Xóa $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "allCount": { - "message": "Tất cả ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "favoritesCount": { - "message": "Yêu thích ($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "searchAliases": { - "message": "Tìm bí danh..." - }, - "allTags": { - "message": "Tất cả thẻ" - }, - "mostRecent": { - "message": "Má»›i nhất" - }, - "az": { - "message": "A-Z" - }, - "noFavoritesYet": { - "message": "Chưa có mục yêu thích" - }, - "starEmailsHint": { - "message": "Đánh dấu sao email từ lịch sá»­ để truy cập nhanh tại đây" - }, - "noResultsFound": { - "message": "Không tìm thấy kết quả" - }, - "differentSearchHint": { - "message": "Thá»­ tìm kiếm hoặc bá»™ lọc khác" - }, - "showQrCode": { - "message": "Hiển thị mã QR" - }, - "removeFromFavorites": { - "message": "Xóa khỏi yêu thích" - }, - "addToFavorites": { - "message": "Thêm vào yêu thích" - }, - "showingRange": { - "message": "Hiển thị $START$-$END$ trên $TOTAL$", - "placeholders": { - "start": { - "content": "$1" - }, - "end": { - "content": "$2" - }, - "total": { - "content": "$3" - } - } - }, - "perPage": { - "message": "$COUNT$ / trang", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "firstPage": { - "message": "Trang đầu" - }, - "previousPage": { - "message": "Trang trước" - }, - "nextPage": { - "message": "Trang tiếp" - }, - "lastPage": { - "message": "Trang cuối" - }, - "scanToCopyAlias": { - "message": "Quét để sao chép bí danh" - }, - "general": { - "message": "Chung" - }, - "accounts": { - "message": "Tài khoản" - }, - "changelog": { - "message": "Nhật ký thay đổi" - }, - "appearanceDisplay": { - "message": "Giao diện \u0026 hiển thị" - }, - "theme": { - "message": "Chá»§ đề" - }, - "themeLight": { - "message": "Sáng" - }, - "themeDark": { - "message": "Tối" - }, - "themeAuto": { - "message": "Hệ thống (Tá»± động)" - }, - "badgeCounter": { - "message": "Bá»™ đếm huy hiệu" - }, - "badgeNone": { - "message": "Không (Ẩn)" - }, - "badgeTotal": { - "message": "Tổng trong lịch sá»­" - }, - "badgeAllTime": { - "message": "Tổng đã tạo (Tất cả thời gian)" - }, - "badgeToday": { - "message": "Tạo hôm nay" - }, - "badgeWeek": { - "message": "Tuần này" - }, - "copyNotifications": { - "message": "Thông báo sao chép" - }, - "aliasGeneration": { - "message": "Tạo bí danh" - }, - "randomAliasFormat": { - "message": "Định dạng bí danh ngẫu nhiên" - }, - "autoSaveLimit": { - "message": "Giá»›i hạn tá»± động lưu" - }, - "aliasesLimit": { - "message": "$COUNT$ bí danh", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "customPresets": { - "message": "Preset tùy chỉnh" - }, - "label": { - "message": "Nhãn" - }, - "tag": { - "message": "Thẻ" - }, - "addPreset": { - "message": "+ Thêm preset" - }, - "dataManagement": { - "message": "Quản lý dữ liệu" - }, - "export": { - "message": "Xuất" - }, - "import": { - "message": "Nhập" - }, - "clear": { - "message": "Xóa" - }, - "resetSettings": { - "message": "Đặt lại tất cả cài đặt về mặc định" - }, - "resetSettingsTitle": { - "message": "Đặt lại cài đặt?" - }, - "resetSettingsMessage": { - "message": "Thao tác này sẽ khôi phục mọi cài đặt về giá trị mặc định." - }, - "reset": { - "message": "Đặt lại" - }, - "clearHistoryTitle": { - "message": "Xóa bí danh gần đây?" - }, - "clearHistoryMessage": { - "message": "Thao tác này xóa tất cả bí danh khỏi danh sách lịch sá»­ gần đây." - }, - "emailAccounts": { - "message": "Tài khoản email" - }, - "manageAccountsDescription": { - "message": "Quản lý các tài khoản Gmail cá»§a bạn. Má»—i tài khoản có lịch sá»­, thống kê và mục yêu thích riêng." - }, - "noAccountsFound": { - "message": "Không tìm thấy tài khoản. Vui lòng thêm tài khoản từ màn hình chính." - }, - "emailAddress": { - "message": "Địa chỉ email" - }, - "accountLabel": { - "message": "Nhãn tài khoản" - }, - "emailAddressPlaceholder": { - "message": "email.cua.ban@gmail.com" - }, - "emailChangeWarning": { - "message": "Thay đổi email sẽ di chuyển toàn bá»™ dữ liệu sang địa chỉ email má»›i" - }, - "saveChanges": { - "message": "Lưu thay đổi" - }, - "active": { - "message": "Đang hoạt động" - }, - "editAccount": { - "message": "Sá»­a tài khoản" - }, - "cannotDeleteLastAccountTitle": { - "message": "Không thể xóa tài khoản cuối cùng" - }, - "deleteThisAccount": { - "message": "Xóa tài khoản này" - }, - "deleteAccountTitle": { - "message": "Xóa tài khoản?" - }, - "deleteAccountMessage": { - "message": "Xóa \"$LABEL$\" ($EMAIL$)?\n\nThao tác này sẽ xóa vÄ©nh viá»…n:\n- Toàn bá»™ lịch sá»­ cá»§a tài khoản này\n- Toàn bá»™ thống kê\n- Toàn bá»™ mục yêu thích\n\nKhông thể hoàn tác thao tác này.", - "placeholders": { - "label": { - "content": "$1" - }, - "email": { - "content": "$2" - } - } - }, - "delete": { - "message": "Xóa" - }, - "changeAccountEmailTitle": { - "message": "Thay đổi email tài khoản?" - }, - "changeAccountEmailMessage": { - "message": "Thay đổi email từ\n$OLD_EMAIL$\nthành\n$NEW_EMAIL$?\n\nThao tác này sẽ:\n- Di chuyển toàn bá»™ lịch sá»­, thống kê và mục yêu thích sang email má»›i\n- Cập nhật email tài khoản\n- Xóa dữ liệu liên quan đến email cÅ©\n\nTiếp tục?", - "placeholders": { - "old_email": { - "content": "$1" - }, - "new_email": { - "content": "$2" - } - } - }, - "changeEmail": { - "message": "Thay đổi email" - }, - "menuForThisWebsite": { - "message": "Cho trang web này" - }, - "menuLoading": { - "message": "Đang tải..." - }, - "menuRandomEmailAlias": { - "message": "Bí danh email ngẫu nhiên" - }, - "menuCustomTags": { - "message": "Thẻ tùy chỉnh" - }, - "menuNoPresets": { - "message": "Chưa có preset - Thêm trong Cài đặt" - }, - "menuGmailTricks": { - "message": "Thá»§ thuật Gmail" - }, - "menuDotVariation": { - "message": "Biến thể dấu chấm" - }, - "menuGooglemailDomain": { - "message": "Tên miền Googlemail" - }, - "menuRemoveAllDots": { - "message": "Xóa tất cả dấu chấm" - }, - "toastPresetAdded": { - "message": "Đã thêm preset" - }, - "toastPresetRemoved": { - "message": "Đã xóa preset" - }, - "toastSettingsExported": { - "message": "Đã xuất cài đặt" - }, - "toastSettingsImported": { - "message": "Đã nhập cài đặt" - }, - "toastImportFailed": { - "message": "Nhập thất bại - tệp không hợp lệ" - }, - "toastSettingsReset": { - "message": "Cài đặt đã được đặt về mặc định" - }, - "toastAccountSwitched": { - "message": "Đã chuyển tài khoản" - }, - "toastAccountDeleted": { - "message": "Đã xóa tài khoản" - }, - "toastAccountUpdated": { - "message": "Đã cập nhật tài khoản" - }, - "toastAccountAdded": { - "message": "Đã thêm $LABEL$", - "placeholders": { - "label": { - "content": "$1" - } - } - }, - "errorLabelRequired": { - "message": "Nhãn không được để trống" - }, - "errorInvalidEmail": { - "message": "Vui lòng nhập địa chỉ email hợp lệ" - }, - "errorDuplicateEmail": { - "message": "Địa chỉ email này đã được tài khoản khác sá»­ dụng" - }, - "errorEnterEmail": { - "message": "Vui lòng nhập địa chỉ email" - }, - "errorAccountExists": { - "message": "Tài khoản này đã tồn tại" - }, - "toastQrFailed": { - "message": "Tạo mã QR thất bại" - }, - "toastExportedAliases": { - "message": "Đã xuất $COUNT$ bí danh", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastDeletedAliases": { - "message": "Đã xóa $COUNT$ bí danh", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastHistoryCleared": { - "message": "Đã xóa lịch sá»­" - }, - "toastFavoriteAdded": { - "message": "Đã thêm vào yêu thích" - }, - "toastFavoriteRemoved": { - "message": "Đã xóa khỏi yêu thích" - }, - "toastCopiedEmail": { - "message": "Đã sao chép $EMAIL$", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "toastCopyFailed": { - "message": "Sao chép thất bại" - }, - "welcomeTitle": { - "message": "Chào mừng đến vá»›i Gmail Alias Toolkit" - }, - "welcomeSubtitle": { - "message": "Tạo bí danh email không giá»›i hạn để bảo vệ riêng tư và sắp xếp tốt hÆ¡n" - }, - "letsGetStarted": { - "message": "Bắt đầu thôi" - }, - "enterGmailAddress": { - "message": "Nhập địa chỉ Gmail cá»§a bạn" - }, - "pressTabForGmail": { - "message": "Nhấn $KEY$ để thêm @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "settingUp": { - "message": "Đang thiết lập..." - }, - "getStarted": { - "message": "Bắt đầu" - }, - "advancedSetup": { - "message": "Thiết lập nâng cao trong Cài đặt" - }, - "whatYouCanDo": { - "message": "Bạn có thể làm gì:" - }, - "featurePrivateEmail": { - "message": "Trình tạo email riêng tư" - }, - "featureCustomTags": { - "message": "Thẻ \u0026 preset tùy chỉnh" - }, - "featureGmailTricks": { - "message": "Thá»§ thuật Gmail nâng cao" - }, - "welcomeFooter": { - "message": "Tất cả dữ liệu được lưu cục bá»™. Không theo dõi, không máy chá»§." - }, - "favoritesSaved": { - "message": "Đã lưu $COUNT$", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "clickStarHint": { - "message": "Nhấp vào sao trên bất kỳ bí danh nào trong lịch sá»­ để thêm vào đây" - }, - "viewStatistics": { - "message": "Xem thống kê" - }, - "statistics": { - "message": "Thống kê" - }, - "metricsTab": { - "message": "Chỉ số" - }, - "timelineTab": { - "message": "Dòng thời gian" - }, - "tagsTab": { - "message": "Thẻ" - }, - "totalGenerated": { - "message": "Tổng đã tạo" - }, - "createdToday": { - "message": "Tạo hôm nay" - }, - "thisWeek": { - "message": "Tuần này" - }, - "thisMonth": { - "message": "Tháng này" - }, - "topTag": { - "message": "Thẻ hàng đầu" - }, - "totalTags": { - "message": "Tổng số thẻ" - }, - "noTagsYet": { - "message": "Chưa có thẻ" - }, - "disableInlineForSite": { - "message": "Tắt trợ lý nhanh trên website này" - }, - "inlineDisabledSites": { - "message": "Website đã tắt trợ lý nhanh" - }, - "inlineDisabledSitesDescription": { - "message": "Biểu tượng và popup thao tác nhanh sẽ bị ẩn trên các website này." - }, - "noDisabledSites": { - "message": "Chưa tắt trên website nào" - }, - "enableInlineForSite": { - "message": "Bật lại" - }, - "reportReview": { - "message": "Báo lá»—i / Đánh giá" - }, - "percentLabel": { - "message": "$PERCENT$%", - "placeholders": { - "percent": { - "content": "$1" - } - } - }, - "retry": { - "message": "Thử lại" - }, - "enable": { - "message": "Kích hoạt" - }, - "storageError": { - "message": "Không thể tải lịch sử. Kiểm tra quyền truy cập bộ nhớ." - } + "extensionName": { + "message": "Gmail Alias Toolkit" + }, + "extensionDescription": { + "message": "Tạo và quản lý alias Gmail bằng cú pháp +tag và preset" + }, + "headerSubtitle": { + "message": "Tạo alias bằng cú pháp +tag" + }, + "settings": { + "message": "Cài đặt" + }, + "back": { + "message": "Quay lại" + }, + "close": { + "message": "Đóng" + }, + "cancel": { + "message": "Hủy" + }, + "copy": { + "message": "Sao chép" + }, + "copyAll": { + "message": "Sao chép tất cả" + }, + "copyToClipboard": { + "message": "Sao chép vào clipboard" + }, + "activeGmailAddress": { + "message": "Địa chỉ Gmail đang hoạt động" + }, + "addNewAccount": { + "message": "Thêm tài khoản mới" + }, + "addAccount": { + "message": "Thêm tài khoản" + }, + "addNewAccountTitle": { + "message": "Thêm tài khoản mới" + }, + "emailPlaceholder": { + "message": "email.cua.ban" + }, + "accountLabelPlaceholder": { + "message": "Nhãn (tùy chọn, ví dụ: Công việc, Cá nhân)" + }, + "pressTabToAddGmail": { + "message": "Nhấn $KEY$ để thêm @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "gmailWarning": { + "message": "Địa chỉ này có vẻ không phải Gmail. Địa chỉ cộng hoạt động tốt nhất với Gmail." + }, + "random": { + "message": "Ngẫu nhiên" + }, + "customTags": { + "message": "Thẻ tùy chỉnh" + }, + "gmailTricks": { + "message": "Thủ thuật Gmail" + }, + "tabTagsShort": { + "message": "Thẻ" + }, + "tabTricksShort": { + "message": "Mẹo" + }, + "generating": { + "message": "Đang tạo" + }, + "copied": { + "message": "Đã sao chép" + }, + "switchToLightMode": { + "message": "Chuyển sang chế độ sáng" + }, + "switchToDarkMode": { + "message": "Chuyển sang chế độ tối" + }, + "aliasColumn": { + "message": "Bí danh" + }, + "copyEmailTooltip": { + "message": "$EMAIL$ - nhấp để sao chép", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "pageLabel": { + "message": "Trang $PAGE$", + "placeholders": { + "page": { + "content": "$1" + } + } + }, + "dotTrick": { + "message": "Thủ thuật dấu chấm" + }, + "plusTags": { + "message": "Thẻ cộng (+)" + }, + "googlemail": { + "message": "Googlemail" + }, + "removeDots": { + "message": "Xóa dấu chấm" + }, + "dotPlus": { + "message": "Dấu chấm + Dấu cộng" + }, + "allCombos": { + "message": "Tất cả kết hợp" + }, + "numberOfVariations": { + "message": "Số biến thể" + }, + "randomizeDotPositions": { + "message": "Ngẫu nhiên vị trí dấu chấm" + }, + "sequential": { + "message": "Tuần tự" + }, + "generateTricks": { + "message": "Tạo thủ thuật" + }, + "generatedVariations": { + "message": "Biến thể đã tạo" + }, + "gmailTrickInfoLabel": { + "message": "Thủ thuật Gmail:" + }, + "gmailTrickInfo": { + "message": "Dấu chấm bị bỏ qua và mọi nội dung sau dấu + sẽ vào cùng một hộp thư" + }, + "format": { + "message": "Định dạng" + }, + "privateMailFormat": { + "message": "Private Mail (private-mail-xxxx)" + }, + "randomCharactersFormat": { + "message": "Ký tự ngẫu nhiên (abc123xy)" + }, + "randomWordsFormat": { + "message": "Từ ngẫu nhiên (happy-fox-42)" + }, + "timestampFormat": { + "message": "Dấu thời gian (1234567890)" + }, + "numberOfAliases": { + "message": "Số bí danh" + }, + "generateRandomAliases": { + "message": "Tạo $COUNT$ bí danh ngẫu nhiên$PLURAL$", + "placeholders": { + "count": { + "content": "$1" + }, + "plural": { + "content": "$2" + } + } + }, + "generatedAliases": { + "message": "Bí danh đã tạo" + }, + "totalCount": { + "message": "Tổng cộng $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "copiedAliases": { + "message": "Đã sao chép $COUNT$ bí danh!", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "failedToCopy": { + "message": "Sao chép thất bại" + }, + "formatPrivateMail": { + "message": "Định dạng: private-mail-xxxx" + }, + "formatAlphanumeric": { + "message": "8 ký tự ngẫu nhiên" + }, + "formatWords": { + "message": "2 từ ngẫu nhiên" + }, + "formatTimestamp": { + "message": "Dấu thời gian Unix" + }, + "tagPlaceholder": { + "message": "Nhập thẻ (ví dụ: shopping, work)" + }, + "generate": { + "message": "Tạo" + }, + "yourPresets": { + "message": "Preset của bạn" + }, + "example": { + "message": "Ví dụ:" + }, + "copyExample": { + "message": "Sao chép ví dụ" + }, + "recentAliases": { + "message": "Bí danh gần đây" + }, + "favorites": { + "message": "Yêu thích" + }, + "exportAsCsv": { + "message": "Xuất CSV" + }, + "exportAsJson": { + "message": "Xuất JSON" + }, + "selectAliases": { + "message": "Chọn bí danh" + }, + "select": { + "message": "Chọn" + }, + "starredCount": { + "message": "$COUNT$ đã đánh dấu sao", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deselectAll": { + "message": "Bỏ chọn tất cả" + }, + "selectAll": { + "message": "Chọn tất cả" + }, + "selectedCount": { + "message": "Đã chọn $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deleteCount": { + "message": "Xóa $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "allCount": { + "message": "Tất cả ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "favoritesCount": { + "message": "Yêu thích ($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "searchAliases": { + "message": "Tìm bí danh..." + }, + "allTags": { + "message": "Tất cả thẻ" + }, + "mostRecent": { + "message": "Mới nhất" + }, + "az": { + "message": "A-Z" + }, + "noFavoritesYet": { + "message": "Chưa có mục yêu thích" + }, + "starEmailsHint": { + "message": "Đánh dấu sao email từ lịch sử để truy cập nhanh tại đây" + }, + "noResultsFound": { + "message": "Không tìm thấy kết quả" + }, + "differentSearchHint": { + "message": "Thử tìm kiếm hoặc bộ lọc khác" + }, + "showQrCode": { + "message": "Hiển thị mã QR" + }, + "removeFromFavorites": { + "message": "Xóa khỏi yêu thích" + }, + "addToFavorites": { + "message": "Thêm vào yêu thích" + }, + "showingRange": { + "message": "Hiển thị $START$-$END$ trên $TOTAL$", + "placeholders": { + "start": { + "content": "$1" + }, + "end": { + "content": "$2" + }, + "total": { + "content": "$3" + } + } + }, + "perPage": { + "message": "$COUNT$ / trang", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "firstPage": { + "message": "Trang đầu" + }, + "previousPage": { + "message": "Trang trước" + }, + "nextPage": { + "message": "Trang tiếp" + }, + "lastPage": { + "message": "Trang cuối" + }, + "scanToCopyAlias": { + "message": "Quét để sao chép bí danh" + }, + "general": { + "message": "Chung" + }, + "accounts": { + "message": "Tài khoản" + }, + "changelog": { + "message": "Nhật ký thay đổi" + }, + "appearanceDisplay": { + "message": "Giao diện & hiển thị" + }, + "theme": { + "message": "Chủ đề" + }, + "themeLight": { + "message": "Sáng" + }, + "themeDark": { + "message": "Tối" + }, + "themeAuto": { + "message": "Hệ thống (Tự động)" + }, + "badgeCounter": { + "message": "Bộ đếm huy hiệu" + }, + "badgeNone": { + "message": "Không (Ẩn)" + }, + "badgeTotal": { + "message": "Tổng trong lịch sử" + }, + "badgeAllTime": { + "message": "Tổng đã tạo (Tất cả thời gian)" + }, + "badgeToday": { + "message": "Tạo hôm nay" + }, + "badgeWeek": { + "message": "Tuần này" + }, + "copyNotifications": { + "message": "Thông báo sao chép" + }, + "aliasGeneration": { + "message": "Tạo bí danh" + }, + "randomAliasFormat": { + "message": "Định dạng bí danh ngẫu nhiên" + }, + "autoSaveLimit": { + "message": "Giới hạn tự động lưu" + }, + "aliasesLimit": { + "message": "$COUNT$ bí danh", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "customPresets": { + "message": "Preset tùy chỉnh" + }, + "label": { + "message": "Nhãn" + }, + "tag": { + "message": "Thẻ" + }, + "addPreset": { + "message": "+ Thêm preset" + }, + "dataManagement": { + "message": "Quản lý dữ liệu" + }, + "export": { + "message": "Xuất" + }, + "import": { + "message": "Nhập" + }, + "clear": { + "message": "Xóa" + }, + "resetSettings": { + "message": "Đặt lại tất cả cài đặt về mặc định" + }, + "resetSettingsTitle": { + "message": "Đặt lại cài đặt?" + }, + "resetSettingsMessage": { + "message": "Thao tác này sẽ khôi phục mọi cài đặt về giá trị mặc định." + }, + "reset": { + "message": "Đặt lại" + }, + "clearHistoryTitle": { + "message": "Xóa bí danh gần đây?" + }, + "clearHistoryMessage": { + "message": "Thao tác này xóa tất cả bí danh khỏi danh sách lịch sử gần đây." + }, + "emailAccounts": { + "message": "Tài khoản email" + }, + "manageAccountsDescription": { + "message": "Quản lý các tài khoản Gmail của bạn. Mỗi tài khoản có lịch sử, thống kê và mục yêu thích riêng." + }, + "noAccountsFound": { + "message": "Không tìm thấy tài khoản. Vui lòng thêm tài khoản từ màn hình chính." + }, + "emailAddress": { + "message": "Địa chỉ email" + }, + "accountLabel": { + "message": "Nhãn tài khoản" + }, + "emailAddressPlaceholder": { + "message": "email.cua.ban@gmail.com" + }, + "emailChangeWarning": { + "message": "Thay đổi email sẽ di chuyển toàn bộ dữ liệu sang địa chỉ email mới" + }, + "saveChanges": { + "message": "Lưu thay đổi" + }, + "active": { + "message": "Đang hoạt động" + }, + "editAccount": { + "message": "Sửa tài khoản" + }, + "cannotDeleteLastAccountTitle": { + "message": "Không thể xóa tài khoản cuối cùng" + }, + "deleteThisAccount": { + "message": "Xóa tài khoản này" + }, + "deleteAccountTitle": { + "message": "Xóa tài khoản?" + }, + "deleteAccountMessage": { + "message": "Xóa \"$LABEL$\" ($EMAIL$)?\n\nThao tác này sẽ xóa vĩnh viễn:\n- Toàn bộ lịch sử của tài khoản này\n- Toàn bộ thống kê\n- Toàn bộ mục yêu thích\n\nKhông thể hoàn tác thao tác này.", + "placeholders": { + "label": { + "content": "$1" + }, + "email": { + "content": "$2" + } + } + }, + "delete": { + "message": "Xóa" + }, + "changeAccountEmailTitle": { + "message": "Thay đổi email tài khoản?" + }, + "changeAccountEmailMessage": { + "message": "Thay đổi email từ\n$OLD_EMAIL$\nthành\n$NEW_EMAIL$?\n\nThao tác này sẽ:\n- Di chuyển toàn bộ lịch sử, thống kê và mục yêu thích sang email mới\n- Cập nhật email tài khoản\n- Xóa dữ liệu liên quan đến email cũ\n\nTiếp tục?", + "placeholders": { + "old_email": { + "content": "$1" + }, + "new_email": { + "content": "$2" + } + } + }, + "changeEmail": { + "message": "Thay đổi email" + }, + "menuForThisWebsite": { + "message": "Cho trang web này" + }, + "menuLoading": { + "message": "Đang tải..." + }, + "menuRandomEmailAlias": { + "message": "Bí danh email ngẫu nhiên" + }, + "menuCustomTags": { + "message": "Thẻ tùy chỉnh" + }, + "menuNoPresets": { + "message": "Chưa có preset - Thêm trong Cài đặt" + }, + "menuGmailTricks": { + "message": "Thủ thuật Gmail" + }, + "menuDotVariation": { + "message": "Biến thể dấu chấm" + }, + "menuGooglemailDomain": { + "message": "Tên miền Googlemail" + }, + "menuRemoveAllDots": { + "message": "Xóa tất cả dấu chấm" + }, + "toastPresetAdded": { + "message": "Đã thêm preset" + }, + "toastPresetRemoved": { + "message": "Đã xóa preset" + }, + "toastSettingsExported": { + "message": "Đã xuất cài đặt" + }, + "toastSettingsImported": { + "message": "Đã nhập cài đặt" + }, + "toastImportFailed": { + "message": "Nhập thất bại - tệp không hợp lệ" + }, + "toastSettingsReset": { + "message": "Cài đặt đã được đặt về mặc định" + }, + "toastAccountSwitched": { + "message": "Đã chuyển tài khoản" + }, + "toastAccountDeleted": { + "message": "Đã xóa tài khoản" + }, + "toastAccountUpdated": { + "message": "Đã cập nhật tài khoản" + }, + "toastAccountAdded": { + "message": "Đã thêm $LABEL$", + "placeholders": { + "label": { + "content": "$1" + } + } + }, + "errorLabelRequired": { + "message": "Nhãn không được để trống" + }, + "errorInvalidEmail": { + "message": "Vui lòng nhập địa chỉ email hợp lệ" + }, + "errorDuplicateEmail": { + "message": "Địa chỉ email này đã được tài khoản khác sử dụng" + }, + "errorEnterEmail": { + "message": "Vui lòng nhập địa chỉ email" + }, + "errorAccountExists": { + "message": "Tài khoản này đã tồn tại" + }, + "toastQrFailed": { + "message": "Tạo mã QR thất bại" + }, + "toastExportedAliases": { + "message": "Đã xuất $COUNT$ bí danh", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastDeletedAliases": { + "message": "Đã xóa $COUNT$ bí danh", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastHistoryCleared": { + "message": "Đã xóa lịch sử" + }, + "toastFavoriteAdded": { + "message": "Đã thêm vào yêu thích" + }, + "toastFavoriteRemoved": { + "message": "Đã xóa khỏi yêu thích" + }, + "toastCopiedEmail": { + "message": "Đã sao chép $EMAIL$", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "toastCopyFailed": { + "message": "Sao chép thất bại" + }, + "welcomeTitle": { + "message": "Chào mừng đến với Gmail Alias Toolkit" + }, + "welcomeSubtitle": { + "message": "Tạo bí danh email không giới hạn để bảo vệ riêng tư và sắp xếp tốt hơn" + }, + "letsGetStarted": { + "message": "Bắt đầu thôi" + }, + "enterGmailAddress": { + "message": "Nhập địa chỉ Gmail của bạn" + }, + "pressTabForGmail": { + "message": "Nhấn $KEY$ để thêm @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "settingUp": { + "message": "Đang thiết lập..." + }, + "getStarted": { + "message": "Bắt đầu" + }, + "advancedSetup": { + "message": "Thiết lập nâng cao trong Cài đặt" + }, + "whatYouCanDo": { + "message": "Bạn có thể làm gì:" + }, + "featurePrivateEmail": { + "message": "Trình tạo email riêng tư" + }, + "featureCustomTags": { + "message": "Thẻ & preset tùy chỉnh" + }, + "featureGmailTricks": { + "message": "Thủ thuật Gmail nâng cao" + }, + "welcomeFooter": { + "message": "Tất cả dữ liệu được lưu cục bộ. Không theo dõi, không máy chủ." + }, + "favoritesSaved": { + "message": "Đã lưu $COUNT$", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "clickStarHint": { + "message": "Nhấp vào sao trên bất kỳ bí danh nào trong lịch sử để thêm vào đây" + }, + "viewStatistics": { + "message": "Xem thống kê" + }, + "statistics": { + "message": "Thống kê" + }, + "metricsTab": { + "message": "Chỉ số" + }, + "timelineTab": { + "message": "Dòng thời gian" + }, + "tagsTab": { + "message": "Thẻ" + }, + "totalGenerated": { + "message": "Tổng đã tạo" + }, + "createdToday": { + "message": "Tạo hôm nay" + }, + "thisWeek": { + "message": "Tuần này" + }, + "thisMonth": { + "message": "Tháng này" + }, + "topTag": { + "message": "Thẻ hàng đầu" + }, + "totalTags": { + "message": "Tổng số thẻ" + }, + "noTagsYet": { + "message": "Chưa có thẻ" + }, + "disableInlineForSite": { + "message": "Tắt trợ lý nhanh trên website này" + }, + "inlineDisabledSites": { + "message": "Website đã tắt trợ lý nhanh" + }, + "inlineDisabledSitesDescription": { + "message": "Biểu tượng và popup thao tác nhanh sẽ bị ẩn trên các website này." + }, + "noDisabledSites": { + "message": "Chưa tắt trên website nào" + }, + "enableInlineForSite": { + "message": "Bật lại" + }, + "reportReview": { + "message": "Báo lỗi / Đánh giá" + }, + "percentLabel": { + "message": "$PERCENT$%", + "placeholders": { + "percent": { + "content": "$1" + } + } + }, + "enable": { + "message": "Kích hoạt" + }, + "retry": { + "message": "Thử lại" + }, + "storageError": { + "message": "Không thể tải lịch sử. Kiểm tra quyền truy cập bộ nhớ." + } } diff --git a/public/_locales/zh_CN/messages.json b/public/_locales/zh_CN/messages.json index 219266a3..f8cdb90b 100644 --- a/public/_locales/zh_CN/messages.json +++ b/public/_locales/zh_CN/messages.json @@ -1,774 +1,774 @@ { - "extensionName": { - "message": "Gmail Alias Toolkit" - }, - "extensionDescription": { - "message": "使用 +tag 地址和预设生成并管理 Gmail 别名" - }, - "headerSubtitle": { - "message": "使用 +tag 地址生成别名" - }, - "settings": { - "message": "设置" - }, - "back": { - "message": "返回" - }, - "close": { - "message": "关闭" - }, - "cancel": { - "message": "取消" - }, - "copy": { - "message": "复制" - }, - "copyAll": { - "message": "全部复制" - }, - "copyToClipboard": { - "message": "复制到剪贴板" - }, - "activeGmailAddress": { - "message": "当前 Gmail 地址" - }, - "addNewAccount": { - "message": "添加新账号" - }, - "addAccount": { - "message": "添加账号" - }, - "addNewAccountTitle": { - "message": "添加新账号" - }, - "emailPlaceholder": { - "message": "your.email" - }, - "accountLabelPlaceholder": { - "message": "标签(可选,例如:工作、个人)" - }, - "pressTabToAddGmail": { - "message": "按 $KEY$ 添加 @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "gmailWarning": { - "message": "这看起来不像 Gmail 地址。加号地址最适合 Gmail 使用。" - }, - "random": { - "message": "随机" - }, - "customTags": { - "message": "自定义标签" - }, - "gmailTricks": { - "message": "Gmail 技巧" - }, - "tabTagsShort": { - "message": "标签" - }, - "tabTricksShort": { - "message": "技巧" - }, - "generating": { - "message": "正在生成" - }, - "copied": { - "message": "已复制" - }, - "switchToLightMode": { - "message": "切换到浅色模式" - }, - "switchToDarkMode": { - "message": "切换到深色模式" - }, - "aliasColumn": { - "message": "别名" - }, - "copyEmailTooltip": { - "message": "$EMAIL$ - 点击复制", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "pageLabel": { - "message": "第 $PAGE$ 页", - "placeholders": { - "page": { - "content": "$1" - } - } - }, - "dotTrick": { - "message": "点号技巧" - }, - "plusTags": { - "message": "加号(+)标签" - }, - "googlemail": { - "message": "Googlemail" - }, - "removeDots": { - "message": "移除点号" - }, - "dotPlus": { - "message": "点号 + 加号" - }, - "allCombos": { - "message": "所有组合" - }, - "numberOfVariations": { - "message": "变体数量" - }, - "randomizeDotPositions": { - "message": "随机点号位置" - }, - "sequential": { - "message": "顺序" - }, - "generateTricks": { - "message": "生成技巧" - }, - "generatedVariations": { - "message": "已生成变体" - }, - "gmailTrickInfoLabel": { - "message": "Gmail 技巧:" - }, - "gmailTrickInfo": { - "message": "点号会被忽略,+ 之后的所有内容都会进入同一个收件箱" - }, - "format": { - "message": "格式" - }, - "privateMailFormat": { - "message": "私人邮件(private-mail-xxxx)" - }, - "randomCharactersFormat": { - "message": "随机字符(abc123xy)" - }, - "randomWordsFormat": { - "message": "随机单词(happy-fox-42)" - }, - "timestampFormat": { - "message": "时间戳(1234567890)" - }, - "numberOfAliases": { - "message": "别名数量" - }, - "generateRandomAliases": { - "message": "生成 $COUNT$ 个随机别名$PLURAL$", - "placeholders": { - "count": { - "content": "$1" - }, - "plural": { - "content": "$2" - } - } - }, - "generatedAliases": { - "message": "已生成别名" - }, - "totalCount": { - "message": "å…± $COUNT$ 个", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "copiedAliases": { - "message": "已复制 $COUNT$ 个别名!", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "failedToCopy": { - "message": "复制失败" - }, - "formatPrivateMail": { - "message": "格式:private-mail-xxxx" - }, - "formatAlphanumeric": { - "message": "8 个随机字符" - }, - "formatWords": { - "message": "2 个随机单词" - }, - "formatTimestamp": { - "message": "Unix 时间戳" - }, - "tagPlaceholder": { - "message": "输入标签(例如:shopping、work)" - }, - "generate": { - "message": "生成" - }, - "yourPresets": { - "message": "你的预设" - }, - "example": { - "message": "示例:" - }, - "copyExample": { - "message": "复制示例" - }, - "recentAliases": { - "message": "最近别名" - }, - "favorites": { - "message": "收藏" - }, - "exportAsCsv": { - "message": "导出为 CSV" - }, - "exportAsJson": { - "message": "导出为 JSON" - }, - "selectAliases": { - "message": "选择别名" - }, - "select": { - "message": "选择" - }, - "starredCount": { - "message": "已加星 $COUNT$ 个", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deselectAll": { - "message": "取消全选" - }, - "selectAll": { - "message": "全选" - }, - "selectedCount": { - "message": "已选择 $COUNT$ 个", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "deleteCount": { - "message": "删除 $COUNT$ 个", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "allCount": { - "message": "全部($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "favoritesCount": { - "message": "收藏($COUNT$)", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "searchAliases": { - "message": "搜索别名..." - }, - "allTags": { - "message": "所有标签" - }, - "mostRecent": { - "message": "最近" - }, - "az": { - "message": "A-Z" - }, - "noFavoritesYet": { - "message": "还没有收藏" - }, - "starEmailsHint": { - "message": "为历史记录中的邮件加星,方便在这里快速访问" - }, - "noResultsFound": { - "message": "未找到结果" - }, - "differentSearchHint": { - "message": "尝试其他搜索或筛选条件" - }, - "showQrCode": { - "message": "显示二维码" - }, - "removeFromFavorites": { - "message": "从收藏中移除" - }, - "addToFavorites": { - "message": "添加到收藏" - }, - "showingRange": { - "message": "显示 $START$-$END$,共 $TOTAL$ 个", - "placeholders": { - "start": { - "content": "$1" - }, - "end": { - "content": "$2" - }, - "total": { - "content": "$3" - } - } - }, - "perPage": { - "message": "$COUNT$ / 页", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "firstPage": { - "message": "第一页" - }, - "previousPage": { - "message": "上一页" - }, - "nextPage": { - "message": "下一页" - }, - "lastPage": { - "message": "最后一页" - }, - "scanToCopyAlias": { - "message": "扫描以复制别名" - }, - "general": { - "message": "通用" - }, - "accounts": { - "message": "账号" - }, - "changelog": { - "message": "更新日志" - }, - "appearanceDisplay": { - "message": "外观与显示" - }, - "theme": { - "message": "主题" - }, - "themeLight": { - "message": "浅色" - }, - "themeDark": { - "message": "深色" - }, - "themeAuto": { - "message": "系统(自动)" - }, - "badgeCounter": { - "message": "徽章计数器" - }, - "badgeNone": { - "message": "无(隐藏)" - }, - "badgeTotal": { - "message": "历史总数" - }, - "badgeAllTime": { - "message": "总生成数(全部时间)" - }, - "badgeToday": { - "message": "今天创建" - }, - "badgeWeek": { - "message": "本周" - }, - "copyNotifications": { - "message": "复制通知" - }, - "aliasGeneration": { - "message": "别名生成" - }, - "randomAliasFormat": { - "message": "随机别名格式" - }, - "autoSaveLimit": { - "message": "自动保存限制" - }, - "aliasesLimit": { - "message": "$COUNT$ 个别名", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "customPresets": { - "message": "自定义预设" - }, - "label": { - "message": "标签" - }, - "tag": { - "message": "标签" - }, - "addPreset": { - "message": "+ 添加预设" - }, - "dataManagement": { - "message": "数据管理" - }, - "export": { - "message": "导出" - }, - "import": { - "message": "导入" - }, - "clear": { - "message": "清除" - }, - "resetSettings": { - "message": "将所有设置重置为默认值" - }, - "resetSettingsTitle": { - "message": "重置设置?" - }, - "resetSettingsMessage": { - "message": "这会将每项设置恢复为默认值。" - }, - "reset": { - "message": "重置" - }, - "clearHistoryTitle": { - "message": "清除最近别名?" - }, - "clearHistoryMessage": { - "message": "这会从最近历史列表中移除所有别名。" - }, - "emailAccounts": { - "message": "邮箱账号" - }, - "manageAccountsDescription": { - "message": "管理你的 Gmail 账号。每个账号都有自己的历史、统计和收藏。" - }, - "noAccountsFound": { - "message": "未找到账号。请从主屏幕添加账号。" - }, - "emailAddress": { - "message": "邮箱地址" - }, - "accountLabel": { - "message": "账号标签" - }, - "emailAddressPlaceholder": { - "message": "your.email@gmail.com" - }, - "emailChangeWarning": { - "message": "更改邮箱会将所有数据迁移到新的邮箱地址" - }, - "saveChanges": { - "message": "保存更改" - }, - "active": { - "message": "当前" - }, - "editAccount": { - "message": "编辑账号" - }, - "cannotDeleteLastAccountTitle": { - "message": "无法删除最后一个账号" - }, - "deleteThisAccount": { - "message": "删除此账号" - }, - "deleteAccountTitle": { - "message": "删除账号?" - }, - "deleteAccountMessage": { - "message": "删除“$LABEL$”($EMAIL$)?\n\n这将永久删除:\n- 此账号的所有历史记录\n- 所有统计数据\n- 所有收藏\n\n此操作无法撤销。", - "placeholders": { - "label": { - "content": "$1" - }, - "email": { - "content": "$2" - } - } - }, - "delete": { - "message": "删除" - }, - "changeAccountEmailTitle": { - "message": "更改账号邮箱?" - }, - "changeAccountEmailMessage": { - "message": "将邮箱从\n$OLD_EMAIL$\n更改为\n$NEW_EMAIL$?\n\n这将:\n- 将所有历史、统计和收藏迁移到新邮箱\n- 更新账号邮箱\n- 删除与旧邮箱关联的数据\n\n继续?", - "placeholders": { - "old_email": { - "content": "$1" - }, - "new_email": { - "content": "$2" - } - } - }, - "changeEmail": { - "message": "更改邮箱" - }, - "menuForThisWebsite": { - "message": "用于此网站" - }, - "menuLoading": { - "message": "正在加载..." - }, - "menuRandomEmailAlias": { - "message": "随机邮箱别名" - }, - "menuCustomTags": { - "message": "自定义标签" - }, - "menuNoPresets": { - "message": "没有预设 - 在设置中添加" - }, - "menuGmailTricks": { - "message": "Gmail 技巧" - }, - "menuDotVariation": { - "message": "点号变体" - }, - "menuGooglemailDomain": { - "message": "Googlemail 域名" - }, - "menuRemoveAllDots": { - "message": "移除所有点号" - }, - "toastPresetAdded": { - "message": "预设已添加" - }, - "toastPresetRemoved": { - "message": "预设已移除" - }, - "toastSettingsExported": { - "message": "设置已导出" - }, - "toastSettingsImported": { - "message": "设置已导入" - }, - "toastImportFailed": { - "message": "导入失败 - 文件无效" - }, - "toastSettingsReset": { - "message": "设置已重置为默认值" - }, - "toastAccountSwitched": { - "message": "账号已切换" - }, - "toastAccountDeleted": { - "message": "账号已删除" - }, - "toastAccountUpdated": { - "message": "账号已更新" - }, - "toastAccountAdded": { - "message": "$LABEL$ 已添加", - "placeholders": { - "label": { - "content": "$1" - } - } - }, - "errorLabelRequired": { - "message": "标签不能为空" - }, - "errorInvalidEmail": { - "message": "请输入有效的邮箱地址" - }, - "errorDuplicateEmail": { - "message": "此邮箱地址已被另一个账号使用" - }, - "errorEnterEmail": { - "message": "请输入邮箱地址" - }, - "errorAccountExists": { - "message": "此账号已存在" - }, - "toastQrFailed": { - "message": "二维码生成失败" - }, - "toastExportedAliases": { - "message": "已导出 $COUNT$ 个别名", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastDeletedAliases": { - "message": "已删除 $COUNT$ 个别名", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "toastHistoryCleared": { - "message": "历史已清除" - }, - "toastFavoriteAdded": { - "message": "已添加到收藏" - }, - "toastFavoriteRemoved": { - "message": "已从收藏移除" - }, - "toastCopiedEmail": { - "message": "已复制 $EMAIL$", - "placeholders": { - "email": { - "content": "$1" - } - } - }, - "toastCopyFailed": { - "message": "复制失败" - }, - "welcomeTitle": { - "message": "欢迎使用 Gmail Alias Toolkit" - }, - "welcomeSubtitle": { - "message": "生成无限邮箱别名,保护隐私并便于整理" - }, - "letsGetStarted": { - "message": "开始吧" - }, - "enterGmailAddress": { - "message": "输入你的 Gmail 地址" - }, - "pressTabForGmail": { - "message": "按 $KEY$ 输入 @gmail.com", - "placeholders": { - "key": { - "content": "$1" - } - } - }, - "settingUp": { - "message": "正在设置..." - }, - "getStarted": { - "message": "开始使用" - }, - "advancedSetup": { - "message": "在设置中进行高级配置" - }, - "whatYouCanDo": { - "message": "你可以做什么:" - }, - "featurePrivateEmail": { - "message": "私人邮箱生成器" - }, - "featureCustomTags": { - "message": "自定义标签和预设" - }, - "featureGmailTricks": { - "message": "Gmail 高级技巧" - }, - "welcomeFooter": { - "message": "所有数据都存储在本地。无跟踪,无服务器。" - }, - "favoritesSaved": { - "message": "已保存 $COUNT$ 个", - "placeholders": { - "count": { - "content": "$1" - } - } - }, - "clickStarHint": { - "message": "点击历史中任意别名的星标,即可添加到这里" - }, - "viewStatistics": { - "message": "查看统计" - }, - "statistics": { - "message": "统计" - }, - "metricsTab": { - "message": "指标" - }, - "timelineTab": { - "message": "时间线" - }, - "tagsTab": { - "message": "标签" - }, - "totalGenerated": { - "message": "总生成数" - }, - "createdToday": { - "message": "今天创建" - }, - "thisWeek": { - "message": "本周" - }, - "thisMonth": { - "message": "本月" - }, - "topTag": { - "message": "热门标签" - }, - "totalTags": { - "message": "标签总数" - }, - "noTagsYet": { - "message": "还没有标签" - }, - "disableInlineForSite": { - "message": "在此网站上关闭内联助手" - }, - "inlineDisabledSites": { - "message": "已关闭内联助手的网站" - }, - "inlineDisabledSitesDescription": { - "message": "在这些网站上将隐藏内联图标和快捷弹窗。" - }, - "noDisabledSites": { - "message": "没有已关闭的网站" - }, - "enableInlineForSite": { - "message": "启用" - }, - "reportReview": { - "message": "报告 / 评价" - }, - "percentLabel": { - "message": "$PERCENT$%", - "placeholders": { - "percent": { - "content": "$1" - } - } - }, - "retry": { - "message": "重试" - }, - "enable": { - "message": "启用" - }, - "storageError": { - "message": "无法加载历史记录。请检查存储访问权限。" - } + "extensionName": { + "message": "Gmail Alias Toolkit" + }, + "extensionDescription": { + "message": "使用 +tag 地址和预设生成并管理 Gmail 别名" + }, + "headerSubtitle": { + "message": "使用 +tag 地址生成别名" + }, + "settings": { + "message": "设置" + }, + "back": { + "message": "返回" + }, + "close": { + "message": "关闭" + }, + "cancel": { + "message": "取消" + }, + "copy": { + "message": "复制" + }, + "copyAll": { + "message": "全部复制" + }, + "copyToClipboard": { + "message": "复制到剪贴板" + }, + "activeGmailAddress": { + "message": "当前 Gmail 地址" + }, + "addNewAccount": { + "message": "添加新账号" + }, + "addAccount": { + "message": "添加账号" + }, + "addNewAccountTitle": { + "message": "添加新账号" + }, + "emailPlaceholder": { + "message": "your.email" + }, + "accountLabelPlaceholder": { + "message": "标签(可选,例如:工作、个人)" + }, + "pressTabToAddGmail": { + "message": "按 $KEY$ 添加 @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "gmailWarning": { + "message": "这看起来不像 Gmail 地址。加号地址最适合 Gmail 使用。" + }, + "random": { + "message": "随机" + }, + "customTags": { + "message": "自定义标签" + }, + "gmailTricks": { + "message": "Gmail 技巧" + }, + "tabTagsShort": { + "message": "标签" + }, + "tabTricksShort": { + "message": "技巧" + }, + "generating": { + "message": "正在生成" + }, + "copied": { + "message": "已复制" + }, + "switchToLightMode": { + "message": "切换到浅色模式" + }, + "switchToDarkMode": { + "message": "切换到深色模式" + }, + "aliasColumn": { + "message": "别名" + }, + "copyEmailTooltip": { + "message": "$EMAIL$ - 点击复制", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "pageLabel": { + "message": "第 $PAGE$ 页", + "placeholders": { + "page": { + "content": "$1" + } + } + }, + "dotTrick": { + "message": "点号技巧" + }, + "plusTags": { + "message": "加号(+)标签" + }, + "googlemail": { + "message": "Googlemail" + }, + "removeDots": { + "message": "移除点号" + }, + "dotPlus": { + "message": "点号 + 加号" + }, + "allCombos": { + "message": "所有组合" + }, + "numberOfVariations": { + "message": "变体数量" + }, + "randomizeDotPositions": { + "message": "随机点号位置" + }, + "sequential": { + "message": "顺序" + }, + "generateTricks": { + "message": "生成技巧" + }, + "generatedVariations": { + "message": "已生成变体" + }, + "gmailTrickInfoLabel": { + "message": "Gmail 技巧:" + }, + "gmailTrickInfo": { + "message": "点号会被忽略,+ 之后的所有内容都会进入同一个收件箱" + }, + "format": { + "message": "格式" + }, + "privateMailFormat": { + "message": "私人邮件(private-mail-xxxx)" + }, + "randomCharactersFormat": { + "message": "随机字符(abc123xy)" + }, + "randomWordsFormat": { + "message": "随机单词(happy-fox-42)" + }, + "timestampFormat": { + "message": "时间戳(1234567890)" + }, + "numberOfAliases": { + "message": "别名数量" + }, + "generateRandomAliases": { + "message": "生成 $COUNT$ 个随机别名$PLURAL$", + "placeholders": { + "count": { + "content": "$1" + }, + "plural": { + "content": "$2" + } + } + }, + "generatedAliases": { + "message": "已生成别名" + }, + "totalCount": { + "message": "共 $COUNT$ 个", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "copiedAliases": { + "message": "已复制 $COUNT$ 个别名!", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "failedToCopy": { + "message": "复制失败" + }, + "formatPrivateMail": { + "message": "格式:private-mail-xxxx" + }, + "formatAlphanumeric": { + "message": "8 个随机字符" + }, + "formatWords": { + "message": "2 个随机单词" + }, + "formatTimestamp": { + "message": "Unix 时间戳" + }, + "tagPlaceholder": { + "message": "输入标签(例如:shopping、work)" + }, + "generate": { + "message": "生成" + }, + "yourPresets": { + "message": "你的预设" + }, + "example": { + "message": "示例:" + }, + "copyExample": { + "message": "复制示例" + }, + "recentAliases": { + "message": "最近别名" + }, + "favorites": { + "message": "收藏" + }, + "exportAsCsv": { + "message": "导出为 CSV" + }, + "exportAsJson": { + "message": "导出为 JSON" + }, + "selectAliases": { + "message": "选择别名" + }, + "select": { + "message": "选择" + }, + "starredCount": { + "message": "已加星 $COUNT$ 个", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deselectAll": { + "message": "取消全选" + }, + "selectAll": { + "message": "全选" + }, + "selectedCount": { + "message": "已选择 $COUNT$ 个", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "deleteCount": { + "message": "删除 $COUNT$ 个", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "allCount": { + "message": "全部($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "favoritesCount": { + "message": "收藏($COUNT$)", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "searchAliases": { + "message": "搜索别名..." + }, + "allTags": { + "message": "所有标签" + }, + "mostRecent": { + "message": "最近" + }, + "az": { + "message": "A-Z" + }, + "noFavoritesYet": { + "message": "还没有收藏" + }, + "starEmailsHint": { + "message": "为历史记录中的邮件加星,方便在这里快速访问" + }, + "noResultsFound": { + "message": "未找到结果" + }, + "differentSearchHint": { + "message": "尝试其他搜索或筛选条件" + }, + "showQrCode": { + "message": "显示二维码" + }, + "removeFromFavorites": { + "message": "从收藏中移除" + }, + "addToFavorites": { + "message": "添加到收藏" + }, + "showingRange": { + "message": "显示 $START$-$END$,共 $TOTAL$ 个", + "placeholders": { + "start": { + "content": "$1" + }, + "end": { + "content": "$2" + }, + "total": { + "content": "$3" + } + } + }, + "perPage": { + "message": "$COUNT$ / 页", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "firstPage": { + "message": "第一页" + }, + "previousPage": { + "message": "上一页" + }, + "nextPage": { + "message": "下一页" + }, + "lastPage": { + "message": "最后一页" + }, + "scanToCopyAlias": { + "message": "扫描以复制别名" + }, + "general": { + "message": "通用" + }, + "accounts": { + "message": "账号" + }, + "changelog": { + "message": "更新日志" + }, + "appearanceDisplay": { + "message": "外观与显示" + }, + "theme": { + "message": "主题" + }, + "themeLight": { + "message": "浅色" + }, + "themeDark": { + "message": "深色" + }, + "themeAuto": { + "message": "系统(自动)" + }, + "badgeCounter": { + "message": "徽章计数器" + }, + "badgeNone": { + "message": "无(隐藏)" + }, + "badgeTotal": { + "message": "历史总数" + }, + "badgeAllTime": { + "message": "总生成数(全部时间)" + }, + "badgeToday": { + "message": "今天创建" + }, + "badgeWeek": { + "message": "本周" + }, + "copyNotifications": { + "message": "复制通知" + }, + "aliasGeneration": { + "message": "别名生成" + }, + "randomAliasFormat": { + "message": "随机别名格式" + }, + "autoSaveLimit": { + "message": "自动保存限制" + }, + "aliasesLimit": { + "message": "$COUNT$ 个别名", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "customPresets": { + "message": "自定义预设" + }, + "label": { + "message": "标签" + }, + "tag": { + "message": "标签" + }, + "addPreset": { + "message": "+ 添加预设" + }, + "dataManagement": { + "message": "数据管理" + }, + "export": { + "message": "导出" + }, + "import": { + "message": "导入" + }, + "clear": { + "message": "清除" + }, + "resetSettings": { + "message": "将所有设置重置为默认值" + }, + "resetSettingsTitle": { + "message": "重置设置?" + }, + "resetSettingsMessage": { + "message": "这会将每项设置恢复为默认值。" + }, + "reset": { + "message": "重置" + }, + "clearHistoryTitle": { + "message": "清除最近别名?" + }, + "clearHistoryMessage": { + "message": "这会从最近历史列表中移除所有别名。" + }, + "emailAccounts": { + "message": "邮箱账号" + }, + "manageAccountsDescription": { + "message": "管理你的 Gmail 账号。每个账号都有自己的历史、统计和收藏。" + }, + "noAccountsFound": { + "message": "未找到账号。请从主屏幕添加账号。" + }, + "emailAddress": { + "message": "邮箱地址" + }, + "accountLabel": { + "message": "账号标签" + }, + "emailAddressPlaceholder": { + "message": "your.email@gmail.com" + }, + "emailChangeWarning": { + "message": "更改邮箱会将所有数据迁移到新的邮箱地址" + }, + "saveChanges": { + "message": "保存更改" + }, + "active": { + "message": "当前" + }, + "editAccount": { + "message": "编辑账号" + }, + "cannotDeleteLastAccountTitle": { + "message": "无法删除最后一个账号" + }, + "deleteThisAccount": { + "message": "删除此账号" + }, + "deleteAccountTitle": { + "message": "删除账号?" + }, + "deleteAccountMessage": { + "message": "删除“$LABEL$”($EMAIL$)?\n\n这将永久删除:\n- 此账号的所有历史记录\n- 所有统计数据\n- 所有收藏\n\n此操作无法撤销。", + "placeholders": { + "label": { + "content": "$1" + }, + "email": { + "content": "$2" + } + } + }, + "delete": { + "message": "删除" + }, + "changeAccountEmailTitle": { + "message": "更改账号邮箱?" + }, + "changeAccountEmailMessage": { + "message": "将邮箱从\n$OLD_EMAIL$\n更改为\n$NEW_EMAIL$?\n\n这将:\n- 将所有历史、统计和收藏迁移到新邮箱\n- 更新账号邮箱\n- 删除与旧邮箱关联的数据\n\n继续?", + "placeholders": { + "old_email": { + "content": "$1" + }, + "new_email": { + "content": "$2" + } + } + }, + "changeEmail": { + "message": "更改邮箱" + }, + "menuForThisWebsite": { + "message": "用于此网站" + }, + "menuLoading": { + "message": "正在加载..." + }, + "menuRandomEmailAlias": { + "message": "随机邮箱别名" + }, + "menuCustomTags": { + "message": "自定义标签" + }, + "menuNoPresets": { + "message": "没有预设 - 在设置中添加" + }, + "menuGmailTricks": { + "message": "Gmail 技巧" + }, + "menuDotVariation": { + "message": "点号变体" + }, + "menuGooglemailDomain": { + "message": "Googlemail 域名" + }, + "menuRemoveAllDots": { + "message": "移除所有点号" + }, + "toastPresetAdded": { + "message": "预设已添加" + }, + "toastPresetRemoved": { + "message": "预设已移除" + }, + "toastSettingsExported": { + "message": "设置已导出" + }, + "toastSettingsImported": { + "message": "设置已导入" + }, + "toastImportFailed": { + "message": "导入失败 - 文件无效" + }, + "toastSettingsReset": { + "message": "设置已重置为默认值" + }, + "toastAccountSwitched": { + "message": "账号已切换" + }, + "toastAccountDeleted": { + "message": "账号已删除" + }, + "toastAccountUpdated": { + "message": "账号已更新" + }, + "toastAccountAdded": { + "message": "$LABEL$ 已添加", + "placeholders": { + "label": { + "content": "$1" + } + } + }, + "errorLabelRequired": { + "message": "标签不能为空" + }, + "errorInvalidEmail": { + "message": "请输入有效的邮箱地址" + }, + "errorDuplicateEmail": { + "message": "此邮箱地址已被另一个账号使用" + }, + "errorEnterEmail": { + "message": "请输入邮箱地址" + }, + "errorAccountExists": { + "message": "此账号已存在" + }, + "toastQrFailed": { + "message": "二维码生成失败" + }, + "toastExportedAliases": { + "message": "已导出 $COUNT$ 个别名", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastDeletedAliases": { + "message": "已删除 $COUNT$ 个别名", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "toastHistoryCleared": { + "message": "历史已清除" + }, + "toastFavoriteAdded": { + "message": "已添加到收藏" + }, + "toastFavoriteRemoved": { + "message": "已从收藏移除" + }, + "toastCopiedEmail": { + "message": "已复制 $EMAIL$", + "placeholders": { + "email": { + "content": "$1" + } + } + }, + "toastCopyFailed": { + "message": "复制失败" + }, + "welcomeTitle": { + "message": "欢迎使用 Gmail Alias Toolkit" + }, + "welcomeSubtitle": { + "message": "生成无限邮箱别名,保护隐私并便于整理" + }, + "letsGetStarted": { + "message": "开始吧" + }, + "enterGmailAddress": { + "message": "输入你的 Gmail 地址" + }, + "pressTabForGmail": { + "message": "按 $KEY$ 输入 @gmail.com", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "settingUp": { + "message": "正在设置..." + }, + "getStarted": { + "message": "开始使用" + }, + "advancedSetup": { + "message": "在设置中进行高级配置" + }, + "whatYouCanDo": { + "message": "你可以做什么:" + }, + "featurePrivateEmail": { + "message": "私人邮箱生成器" + }, + "featureCustomTags": { + "message": "自定义标签和预设" + }, + "featureGmailTricks": { + "message": "Gmail 高级技巧" + }, + "welcomeFooter": { + "message": "所有数据都存储在本地。无跟踪,无服务器。" + }, + "favoritesSaved": { + "message": "已保存 $COUNT$ 个", + "placeholders": { + "count": { + "content": "$1" + } + } + }, + "clickStarHint": { + "message": "点击历史中任意别名的星标,即可添加到这里" + }, + "viewStatistics": { + "message": "查看统计" + }, + "statistics": { + "message": "统计" + }, + "metricsTab": { + "message": "指标" + }, + "timelineTab": { + "message": "时间线" + }, + "tagsTab": { + "message": "标签" + }, + "totalGenerated": { + "message": "总生成数" + }, + "createdToday": { + "message": "今天创建" + }, + "thisWeek": { + "message": "本周" + }, + "thisMonth": { + "message": "本月" + }, + "topTag": { + "message": "热门标签" + }, + "totalTags": { + "message": "标签总数" + }, + "noTagsYet": { + "message": "还没有标签" + }, + "disableInlineForSite": { + "message": "在此网站上关闭内联助手" + }, + "inlineDisabledSites": { + "message": "已关闭内联助手的网站" + }, + "inlineDisabledSitesDescription": { + "message": "在这些网站上将隐藏内联图标和快捷弹窗。" + }, + "noDisabledSites": { + "message": "没有已关闭的网站" + }, + "enableInlineForSite": { + "message": "启用" + }, + "reportReview": { + "message": "报告 / 评价" + }, + "percentLabel": { + "message": "$PERCENT$%", + "placeholders": { + "percent": { + "content": "$1" + } + } + }, + "enable": { + "message": "启用" + }, + "retry": { + "message": "重试" + }, + "storageError": { + "message": "无法加载历史记录。请检查存储访问权限。" + } } From 94eff46fb06fb9a8ed96512d9c5a8f003aa2172d Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 09:06:23 +0700 Subject: [PATCH 072/101] feat: enhance development manifest validation and add test for runtime-registered content script --- scripts/verify-manifest-scope.mjs | 16 ++++++++++------ tests/scripts/verify-manifest-scope.test.mjs | 9 +++++++++ wxt.config.ts | 17 +++++++---------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/scripts/verify-manifest-scope.mjs b/scripts/verify-manifest-scope.mjs index 6254dccf..7bbf1cc4 100644 --- a/scripts/verify-manifest-scope.mjs +++ b/scripts/verify-manifest-scope.mjs @@ -13,6 +13,7 @@ export const DEV_SITES = [ const DEVELOPMENT_MODE = "development"; const PRODUCTION_MODE = "production"; const DEVELOPMENT_OUTPUT_SUFFIX = "-dev"; +const DEVELOPMENT_RUNTIME_HOSTS = new Set(["http://localhost/*"]); const SUPPORTED_MODES = new Set([DEVELOPMENT_MODE, PRODUCTION_MODE]); /** Writes one informational line to standard output. */ @@ -89,7 +90,7 @@ function validateDevelopmentScope( ) { const failures = []; - if (contentScriptMatches.includes(ALL_URLS)) { + if (contentScriptMatches?.includes(ALL_URLS)) { failures.push( `${manifestPath}: development content script unexpectedly matches ${ALL_URLS}.`, ); @@ -101,7 +102,7 @@ function validateDevelopmentScope( ); } - const unexpectedMatches = contentScriptMatches.filter( + const unexpectedMatches = (contentScriptMatches ?? []).filter( (match) => match !== ALL_URLS && !DEV_SITES.includes(match), ); if (unexpectedMatches.length > 0) { @@ -112,7 +113,10 @@ function validateDevelopmentScope( const unexpectedHosts = [...grantedHosts].filter( (host) => - host !== ALL_URLS && isUrlPattern(host) && !DEV_SITES.includes(host), + host !== ALL_URLS && + isUrlPattern(host) && + !DEVELOPMENT_RUNTIME_HOSTS.has(host) && + !DEV_SITES.includes(host), ); if (unexpectedHosts.length > 0) { failures.push( @@ -121,7 +125,7 @@ function validateDevelopmentScope( } for (const site of DEV_SITES) { - if (!contentScriptMatches.includes(site)) { + if (contentScriptMatches && !contentScriptMatches.includes(site)) { failures.push( `${manifestPath}: development content script is missing ${site}.`, ); @@ -147,11 +151,11 @@ export function validateManifest(manifestPath, mode) { (contentScript) => contentScript.js?.some((file) => file.endsWith(INLINE_CONTENT_SCRIPT)), ); - if (!inlineContentScript) { + if (!inlineContentScript && mode === PRODUCTION_MODE) { return [`${manifestPath}: inline content script is missing.`]; } - const contentScriptMatches = inlineContentScript.matches ?? []; + const contentScriptMatches = inlineContentScript?.matches; const grantedHosts = new Set([ ...(manifest.host_permissions ?? []), ...(manifest.permissions ?? []), diff --git a/tests/scripts/verify-manifest-scope.test.mjs b/tests/scripts/verify-manifest-scope.test.mjs index 94d83172..5df293e8 100644 --- a/tests/scripts/verify-manifest-scope.test.mjs +++ b/tests/scripts/verify-manifest-scope.test.mjs @@ -38,6 +38,15 @@ afterEach(() => { }); describe("manifest scope validator", () => { + it("accepts WXT's runtime-registered development content script", () => { + const manifestPath = writeManifest({ + host_permissions: [...DEV_SITES, "http://localhost/*"], + permissions: ["storage", "scripting"], + }); + + expect(validateManifest(manifestPath, "development")).toEqual([]); + }); + it("accepts the exact development allowlist", () => { const manifestPath = writeManifest({ content_scripts: [inlineHelper(DEV_SITES)], diff --git a/wxt.config.ts b/wxt.config.ts index 3ab26b73..3563091e 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -7,7 +7,6 @@ EventEmitter.defaultMaxListeners = 15; const ALL_URLS = [""]; const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; -const INLINE_CONTENT_SCRIPT = "content-scripts/content.js"; export default defineConfig({ modules: ["@wxt-dev/module-react", "@wxt-dev/auto-icons"], @@ -43,19 +42,17 @@ export default defineConfig({ }, }), hooks: { - "build:manifestGenerated": (wxt, manifest) => { - const inlineContentScript = manifest.content_scripts?.find( - (contentScript) => - contentScript.js?.some((file) => - file.endsWith(INLINE_CONTENT_SCRIPT), - ), + "entrypoints:resolved": (wxt, entrypoints) => { + const inlineContentScript = entrypoints.find( + (entrypoint) => + entrypoint.type === "content-script" && entrypoint.name === "content", ); - if (!inlineContentScript) { - throw new Error("Inline content script was not generated."); + if (inlineContentScript?.type !== "content-script") { + throw new Error("Inline content script entrypoint was not resolved."); } - inlineContentScript.matches = + inlineContentScript.options.matches = wxt.config.mode === "development" ? [...DEV_SITES] : [...ALL_URLS]; }, }, From f2e96830b77eb8ecad2acfef39a1911bcd50e5cd Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 13:05:25 +0700 Subject: [PATCH 073/101] feat: add environment configuration for inline helper and enhance manifest validation --- .env.example | 15 +++++++ CONTRIBUTING.md | 11 +++++ scripts/inline-dev-matches.d.mts | 6 +++ scripts/inline-dev-matches.mjs | 23 ++++++++++ scripts/verify-manifest-scope.mjs | 29 +++++++----- tests/scripts/verify-manifest-scope.test.mjs | 32 ++++++++++++- wxt.config.ts | 47 +++++++++++--------- 7 files changed, 130 insertions(+), 33 deletions(-) create mode 100644 .env.example create mode 100644 scripts/inline-dev-matches.d.mts create mode 100644 scripts/inline-dev-matches.mjs diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..ed85c695 --- /dev/null +++ b/.env.example @@ -0,0 +1,15 @@ +# Extra URL match patterns for the inline helper in development builds. +# Separate multiple patterns with commas or whitespace. +WXT_INLINE_DEV_MATCHES=http://localhost/*,http://127.0.0.1/* + +# Release build configuration for Chrome and Firefox extensions. These values are used by the build scripts to package and submit the extensions to their respective stores. Fill in the appropriate values for your extension. +CHROME_EXTENSION_ID= +CHROME_CLIENT_ID= +CHROME_CLIENT_SECRET= +CHROME_REFRESH_TOKEN= +CHROME_PUBLISH_TARGET="default" +CHROME_SKIP_SUBMIT_REVIEW=false +FIREFOX_EXTENSION_ID= +FIREFOX_JWT_ISSUER= +FIREFOX_JWT_SECRET= +FIREFOX_CHANNEL="listed" \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c188e3ce..9ede1a8c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,6 +45,17 @@ Run the Firefox development build: yarn dev:firefox ``` +To test the inline helper on additional local or remote sites, copy +`.env.example` to `.env.development.local` and set comma- or whitespace-separated +match patterns: + +```dotenv +WXT_INLINE_DEV_MATCHES=http://localhost/*,http://127.0.0.1/* +``` + +These patterns are added to the default development sites. Restart the +development server after changing the value. + ## Build Build for Chrome: diff --git a/scripts/inline-dev-matches.d.mts b/scripts/inline-dev-matches.d.mts new file mode 100644 index 00000000..12a9867c --- /dev/null +++ b/scripts/inline-dev-matches.d.mts @@ -0,0 +1,6 @@ +export const DEFAULT_INLINE_DEV_MATCHES: string[]; +export function parseInlineDevMatches(value?: string): string[]; +export function resolveInlineDevMatches( + mode: string, + envDir?: string, +): string[]; diff --git a/scripts/inline-dev-matches.mjs b/scripts/inline-dev-matches.mjs new file mode 100644 index 00000000..75641d4e --- /dev/null +++ b/scripts/inline-dev-matches.mjs @@ -0,0 +1,23 @@ +import { loadEnv } from "vite"; + +export const DEFAULT_INLINE_DEV_MATCHES = [ + "*://*.miro.com/*", + "*://selfh.st/*", + "*://gumroad.com/*", +]; + +/** Adds comma- or whitespace-separated development match patterns. */ +export function parseInlineDevMatches(value) { + const extraMatches = (value ?? "") + .split(/[\s,]+/) + .map((match) => match.trim()) + .filter(Boolean); + + return [...new Set([...DEFAULT_INLINE_DEV_MATCHES, ...extraMatches])]; +} + +/** Loads inline-helper development matches from WXT's mode-specific env files. */ +export function resolveInlineDevMatches(mode, envDir = process.cwd()) { + const env = loadEnv(mode, envDir, "WXT_"); + return parseInlineDevMatches(env.WXT_INLINE_DEV_MATCHES); +} diff --git a/scripts/verify-manifest-scope.mjs b/scripts/verify-manifest-scope.mjs index 7bbf1cc4..f0c57470 100644 --- a/scripts/verify-manifest-scope.mjs +++ b/scripts/verify-manifest-scope.mjs @@ -1,19 +1,15 @@ import { existsSync, readFileSync, readdirSync } from "node:fs"; import { join } from "node:path"; import { pathToFileURL } from "node:url"; +import { resolveInlineDevMatches } from "./inline-dev-matches.mjs"; const OUTPUT_ROOT = ".output"; export const ALL_URLS = ""; export const INLINE_CONTENT_SCRIPT = "content-scripts/content.js"; -export const DEV_SITES = [ - "*://*.miro.com/*", - "*://selfh.st/*", - "*://gumroad.com/*", -]; +export const DEV_SITES = resolveInlineDevMatches("development"); const DEVELOPMENT_MODE = "development"; const PRODUCTION_MODE = "production"; const DEVELOPMENT_OUTPUT_SUFFIX = "-dev"; -const DEVELOPMENT_RUNTIME_HOSTS = new Set(["http://localhost/*"]); const SUPPORTED_MODES = new Set([DEVELOPMENT_MODE, PRODUCTION_MODE]); /** Writes one informational line to standard output. */ @@ -87,6 +83,7 @@ function validateDevelopmentScope( manifestPath, contentScriptMatches, grantedHosts, + expectedDevSites, ) { const failures = []; @@ -103,7 +100,7 @@ function validateDevelopmentScope( } const unexpectedMatches = (contentScriptMatches ?? []).filter( - (match) => match !== ALL_URLS && !DEV_SITES.includes(match), + (match) => match !== ALL_URLS && !expectedDevSites.includes(match), ); if (unexpectedMatches.length > 0) { failures.push( @@ -115,8 +112,7 @@ function validateDevelopmentScope( (host) => host !== ALL_URLS && isUrlPattern(host) && - !DEVELOPMENT_RUNTIME_HOSTS.has(host) && - !DEV_SITES.includes(host), + !expectedDevSites.includes(host), ); if (unexpectedHosts.length > 0) { failures.push( @@ -124,7 +120,7 @@ function validateDevelopmentScope( ); } - for (const site of DEV_SITES) { + for (const site of expectedDevSites) { if (contentScriptMatches && !contentScriptMatches.includes(site)) { failures.push( `${manifestPath}: development content script is missing ${site}.`, @@ -141,7 +137,11 @@ function validateDevelopmentScope( } /** Returns validation failures for one generated manifest. */ -export function validateManifest(manifestPath, mode) { +export function validateManifest( + manifestPath, + mode, + expectedDevSites = DEV_SITES, +) { if (!existsSync(manifestPath)) { return [`Missing manifest: ${manifestPath}`]; } @@ -162,7 +162,12 @@ export function validateManifest(manifestPath, mode) { ]); return mode === DEVELOPMENT_MODE - ? validateDevelopmentScope(manifestPath, contentScriptMatches, grantedHosts) + ? validateDevelopmentScope( + manifestPath, + contentScriptMatches, + grantedHosts, + expectedDevSites, + ) : validateProductionScope(manifestPath, contentScriptMatches, grantedHosts); } diff --git a/tests/scripts/verify-manifest-scope.test.mjs b/tests/scripts/verify-manifest-scope.test.mjs index 5df293e8..af1acf20 100644 --- a/tests/scripts/verify-manifest-scope.test.mjs +++ b/tests/scripts/verify-manifest-scope.test.mjs @@ -10,6 +10,10 @@ import { INLINE_CONTENT_SCRIPT, validateManifest, } from "../../scripts/verify-manifest-scope.mjs"; +import { + DEFAULT_INLINE_DEV_MATCHES, + parseInlineDevMatches, +} from "../../scripts/inline-dev-matches.mjs"; const temporaryDirectories = []; @@ -40,13 +44,39 @@ afterEach(() => { describe("manifest scope validator", () => { it("accepts WXT's runtime-registered development content script", () => { const manifestPath = writeManifest({ - host_permissions: [...DEV_SITES, "http://localhost/*"], + host_permissions: DEV_SITES, permissions: ["storage", "scripting"], }); expect(validateManifest(manifestPath, "development")).toEqual([]); }); + it("requires env-configured pages to receive the inline helper", () => { + const configuredDevSites = parseInlineDevMatches("http://localhost/*"); + const manifestPath = writeManifest({ + content_scripts: [inlineHelper(DEFAULT_INLINE_DEV_MATCHES)], + host_permissions: configuredDevSites, + }); + + expect( + validateManifest(manifestPath, "development", configuredDevSites), + ).toContain( + `${manifestPath}: development content script is missing http://localhost/*.`, + ); + }); + + it("parses and deduplicates env-configured development matches", () => { + expect( + parseInlineDevMatches( + "http://localhost/*, http://127.0.0.1/* http://localhost/*", + ), + ).toEqual([ + ...DEFAULT_INLINE_DEV_MATCHES, + "http://localhost/*", + "http://127.0.0.1/*", + ]); + }); + it("accepts the exact development allowlist", () => { const manifestPath = writeManifest({ content_scripts: [inlineHelper(DEV_SITES)], diff --git a/wxt.config.ts b/wxt.config.ts index 3563091e..3dc953e4 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -1,12 +1,12 @@ import { defineConfig } from "wxt"; import { EventEmitter } from "events"; import { fileURLToPath } from "node:url"; +import { resolveInlineDevMatches } from "./scripts/inline-dev-matches.mjs"; // Fix EventEmitter maxListeners warning EventEmitter.defaultMaxListeners = 15; const ALL_URLS = [""]; -const DEV_SITES = ["*://*.miro.com/*", "*://selfh.st/*", "*://gumroad.com/*"]; export default defineConfig({ modules: ["@wxt-dev/module-react", "@wxt-dev/auto-icons"], @@ -21,26 +21,31 @@ export default defineConfig({ }, }, }), - /** Uses WXT's resolved mode because Vite runtime variables are unavailable here. */ - manifest: ({ mode }) => ({ - name: "__MSG_extensionName__", - description: "__MSG_extensionDescription__", - default_locale: "en", - action: { - default_title: "__MSG_extensionName__", - }, - permissions: ["storage", "clipboardWrite", "contextMenus"], - host_permissions: mode === "development" ? DEV_SITES : ALL_URLS, - browser_specific_settings: { - gecko: { - id: "{c9d7bdb4-9d7e-4a25-8b4a-0a8d51f3b8b1}", - // @ts-ignore - WXT doesn't support this field yet - data_collection_permissions: { - required: ["none"], + /** Resolves mode-specific env matches for both host permissions and injection. */ + manifest: ({ mode }) => { + const developmentMatches = resolveInlineDevMatches(mode); + + return { + name: "__MSG_extensionName__", + description: "__MSG_extensionDescription__", + default_locale: "en", + action: { + default_title: "__MSG_extensionName__", + }, + permissions: ["storage", "clipboardWrite", "contextMenus"], + host_permissions: + mode === "development" ? developmentMatches : ALL_URLS, + browser_specific_settings: { + gecko: { + id: "{c9d7bdb4-9d7e-4a25-8b4a-0a8d51f3b8b1}", + // @ts-ignore - WXT doesn't support this field yet + data_collection_permissions: { + required: ["none"], + }, }, }, - }, - }), + }; + }, hooks: { "entrypoints:resolved": (wxt, entrypoints) => { const inlineContentScript = entrypoints.find( @@ -53,7 +58,9 @@ export default defineConfig({ } inlineContentScript.options.matches = - wxt.config.mode === "development" ? [...DEV_SITES] : [...ALL_URLS]; + wxt.config.mode === "development" + ? resolveInlineDevMatches(wxt.config.mode) + : [...ALL_URLS]; }, }, autoIcons: { From 67c4ec5eac9ef4e2858abca3460720891e88401c Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 13:12:55 +0700 Subject: [PATCH 074/101] feat: update inline helper match patterns and improve URL handling in content script --- .env.example | 23 +++++++++++++++++++---- CONTRIBUTING.md | 6 ++++-- entrypoints/content/index.ts | 35 ++++++++++++++++++++++++++++++----- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/.env.example b/.env.example index ed85c695..4b8c1d76 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,21 @@ -# Extra URL match patterns for the inline helper in development builds. -# Separate multiple patterns with commas or whitespace. -WXT_INLINE_DEV_MATCHES=http://localhost/*,http://127.0.0.1/* +# Extra Chrome match patterns for the inline helper in development builds. +# +# Required format: scheme://host/path +# - Use *:// to match both HTTP and HTTPS. +# - Use *. before a domain to include the root domain and its subdomains. +# - End with /* to match every path on the site. +# - Separate multiple patterns with commas or whitespace. +# +# Valid: +# *://*.w3schools.com/* +# https://example.com/* +# http://localhost/* +# http://127.0.0.1/* +# +# Invalid: +# https://www.w3schools.com/ (missing * after the final slash) +# www.w3schools.com (missing scheme and path) +WXT_INLINE_DEV_MATCHES=http://localhost/*,http://127.0.0.1/*,*://*.w3schools.com/* # Release build configuration for Chrome and Firefox extensions. These values are used by the build scripts to package and submit the extensions to their respective stores. Fill in the appropriate values for your extension. CHROME_EXTENSION_ID= @@ -12,4 +27,4 @@ CHROME_SKIP_SUBMIT_REVIEW=false FIREFOX_EXTENSION_ID= FIREFOX_JWT_ISSUER= FIREFOX_JWT_SECRET= -FIREFOX_CHANNEL="listed" \ No newline at end of file +FIREFOX_CHANNEL="listed" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9ede1a8c..1f814d47 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,11 +50,13 @@ To test the inline helper on additional local or remote sites, copy match patterns: ```dotenv -WXT_INLINE_DEV_MATCHES=http://localhost/*,http://127.0.0.1/* +WXT_INLINE_DEV_MATCHES=http://localhost/*,http://127.0.0.1/*,*://*.w3schools.com/* ``` These patterns are added to the default development sites. Restart the -development server after changing the value. +development server after changing the value. Each entry must use Chrome's +`scheme://host/path` match-pattern format; use `*://*.example.com/*` for a +domain and all its subdomains. ## Build diff --git a/entrypoints/content/index.ts b/entrypoints/content/index.ts index 7616eebd..a178b211 100644 --- a/entrypoints/content/index.ts +++ b/entrypoints/content/index.ts @@ -39,9 +39,31 @@ interface EmailInputElement extends HTMLInputElement { let inlineDisabledForCurrentSite = false; +/** Resolves a usable website URL inside regular and about:blank/srcdoc frames. */ +function currentPageUrl(): string { + const ancestorOrigins = window.location.ancestorOrigins + ? Array.from(window.location.ancestorOrigins) + : []; + const candidates = [ + window.location.href, + document.referrer, + ...ancestorOrigins.reverse(), + ]; + + return ( + candidates.find((candidate) => normalizeHostname(candidate) !== null) || + window.location.href + ); +} + /** Gets the normalized hostname for the current site. */ -const currentSiteHostname = () => - normalizeSiteHostname(window.location.hostname); +function currentSiteHostname(): string { + try { + return normalizeSiteHostname(new URL(currentPageUrl()).hostname); + } catch { + return normalizeSiteHostname(window.location.hostname); + } +} /** Removes all inline helper icons and popups from the page. */ function removeInlineHelpers() { @@ -120,7 +142,8 @@ function resolveActiveEmail(accountData: StoredAccountData): string { /** Fetch suggestion data for current page. */ async function fetchSuggestions(): Promise { - const normalized = normalizeHostname(window.location.href); + const pageUrl = currentPageUrl(); + const normalized = normalizeHostname(pageUrl); if (!normalized) return null; let email: string | null = null; @@ -136,8 +159,8 @@ async function fetchSuggestions(): Promise { } const [previousResult, suggestionsResult] = await Promise.allSettled([ - getPreviousAliasForWebsite(email, window.location.href), - generateSuggestionsForWebsite(email, window.location.href), + getPreviousAliasForWebsite(email, pageUrl), + generateSuggestionsForWebsite(email, pageUrl), ]); return { @@ -1582,6 +1605,8 @@ function observeDOM() { export default defineContentScript({ matches: [""], + allFrames: true, + matchAboutBlank: true, async main() { const disabledSitesResult = await browser.storage.local.get( INLINE_DISABLED_SITES_KEY, From 9584a321d0ab8dec775704cb93259e9fdccebec3 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 14:14:09 +0700 Subject: [PATCH 075/101] ci: apply CodeRabbit fixes for PR 78 --- .../workflows/apply-coderabbit-pr78-fixes.yml | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 .github/workflows/apply-coderabbit-pr78-fixes.yml diff --git a/.github/workflows/apply-coderabbit-pr78-fixes.yml b/.github/workflows/apply-coderabbit-pr78-fixes.yml new file mode 100644 index 00000000..3f605655 --- /dev/null +++ b/.github/workflows/apply-coderabbit-pr78-fixes.yml @@ -0,0 +1,146 @@ +name: Apply CodeRabbit PR 78 fixes + +on: + push: + branches: [dev] + paths: + - ".github/workflows/apply-coderabbit-pr78-fixes.yml" + +permissions: + contents: read + +jobs: + apply: + runs-on: ubuntu-latest + steps: + - name: Verify bot token + env: + EPLUS_BOT_TOKEN: ${{ secrets.EPLUS_BOT_TOKEN }} + run: | + set -euo pipefail + test -n "${EPLUS_BOT_TOKEN:-}" + test "$(GH_TOKEN="$EPLUS_BOT_TOKEN" gh api user --jq .login)" = "eplus-bot" + + - name: Checkout dev + uses: actions/checkout@v7 + with: + ref: dev + fetch-depth: 0 + token: ${{ secrets.EPLUS_BOT_TOKEN }} + + - name: Patch CodeRabbit findings + run: | + set -euo pipefail + python <<'PY' + from pathlib import Path + + preview = Path(".github/workflows/pr-preview.yml") + text = preview.read_text() + old = ''' runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{ github.token }} + + steps: + ''' + # Keep the expression literal instead of letting this workflow interpolate it. + token_expression = "$" + "{{ github.token }}" + old = old.replace("${{ github.token }}", token_expression) + new = ''' runs-on: ubuntu-latest + + steps: + ''' + if old not in text: + raise SystemExit("Expected job-level GITHUB_TOKEN block was not found") + text = text.replace(old, new, 1) + + old = ''' - name: Build production site + working-directory: main-site + run: | + ''' + new = f''' - name: Build production site + working-directory: main-site + env: + GITHUB_TOKEN: {token_expression} + run: | + ''' + if old not in text: + raise SystemExit("Expected production build step was not found") + preview.write_text(text.replace(old, new, 1)) + + content = Path("entrypoints/content/index.ts") + text = content.read_text() + old = '''export default defineContentScript({ + matches: [""], + allFrames: true, + matchAboutBlank: true, + ''' + new = '''export default defineContentScript({ + matches: [""], + // Keep the helper in the top document so third-party embedded frames + // cannot receive alias suggestions or extension UI. + ''' + if old not in text: + raise SystemExit("Expected all-frame content-script configuration was not found") + content.write_text(text.replace(old, new, 1)) + + release = Path("web/release-version.ts") + text = release.read_text() + old = '''export const LATEST_RELEASE_API_URL = + "https://api.github.com/repos/ePlus-DEV/gmail-alias-toolkit/releases/latest"; + + const SEMVER_PATTERN = + ''' + new = '''export const LATEST_RELEASE_API_URL = + "https://api.github.com/repos/ePlus-DEV/gmail-alias-toolkit/releases/latest"; + export const RELEASE_FETCH_TIMEOUT_MS = 5_000; + + const SEMVER_PATTERN = + ''' + if old not in text: + raise SystemExit("Expected release API constant block was not found") + text = text.replace(old, new, 1) + + old = ''' const response = await fetcher(LATEST_RELEASE_API_URL, { headers }); + ''' + new = ''' const response = await fetcher(LATEST_RELEASE_API_URL, { + headers, + signal: AbortSignal.timeout(RELEASE_FETCH_TIMEOUT_MS), + }); + ''' + if old not in text: + raise SystemExit("Expected unbounded release fetch was not found") + release.write_text(text.replace(old, new, 1)) + PY + + rm .github/workflows/apply-coderabbit-pr78-fixes.yml + + - name: Enable Corepack + run: corepack enable + + - name: Setup Node.js + uses: actions/setup-node@v7 + with: + node-version: 24.x + cache: yarn + + - name: Validate changes + run: | + set -euo pipefail + yarn install --immutable --mode=skip-build + yarn exec wxt prepare + yarn compile + yarn test + yarn build + yarn workspace gmail-alias-toolkit-web build + + - name: Commit fixes + env: + EPLUS_BOT_TOKEN: ${{ secrets.EPLUS_BOT_TOKEN }} + run: | + set -euo pipefail + git config user.name "eplus-bot" + git config user.email "157664013+eplus-bot@users.noreply.github.com" + git add .github/workflows/pr-preview.yml entrypoints/content/index.ts web/release-version.ts + git add -u .github/workflows/apply-coderabbit-pr78-fixes.yml + git commit -m "fix: address CodeRabbit release findings" + git push origin HEAD:dev From 1801a5f5bb58693f4cd4b1a83f2f9804ee30de99 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 14:18:58 +0700 Subject: [PATCH 076/101] ci: finalize CodeRabbit fixes for PR 78 --- .github/workflows/ci.yml | 100 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b4042f6b..ce80cc7f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,6 +21,95 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v7 + with: + fetch-depth: 0 + token: ${{ secrets.EPLUS_BOT_TOKEN }} + + - name: Apply PR 78 CodeRabbit fixes + if: github.event_name == 'pull_request' && github.event.pull_request.number == 78 + run: | + set -euo pipefail + python <<'PY' + from pathlib import Path + + preview = Path(".github/workflows/pr-preview.yml") + text = preview.read_text() + token_expression = "$" + "{{ github.token }}" + old = f''' runs-on: ubuntu-latest + env: + GITHUB_TOKEN: {token_expression} + + steps: + ''' + new = ''' runs-on: ubuntu-latest + + steps: + ''' + if old not in text: + raise SystemExit("Expected job-level GITHUB_TOKEN block was not found") + text = text.replace(old, new, 1) + + old = ''' - name: Build production site + working-directory: main-site + run: | + ''' + new = f''' - name: Build production site + working-directory: main-site + env: + GITHUB_TOKEN: {token_expression} + run: | + ''' + if old not in text: + raise SystemExit("Expected production build step was not found") + preview.write_text(text.replace(old, new, 1)) + + content = Path("entrypoints/content/index.ts") + text = content.read_text() + old = '''export default defineContentScript({ + matches: [""], + allFrames: true, + matchAboutBlank: true, + ''' + new = '''export default defineContentScript({ + matches: [""], + // Keep the helper in the top document so third-party embedded frames + // cannot receive alias suggestions or extension UI. + ''' + if old not in text: + raise SystemExit("Expected all-frame content-script configuration was not found") + content.write_text(text.replace(old, new, 1)) + + release = Path("web/release-version.ts") + text = release.read_text() + old = '''export const LATEST_RELEASE_API_URL = + "https://api.github.com/repos/ePlus-DEV/gmail-alias-toolkit/releases/latest"; + + const SEMVER_PATTERN = + ''' + new = '''export const LATEST_RELEASE_API_URL = + "https://api.github.com/repos/ePlus-DEV/gmail-alias-toolkit/releases/latest"; + export const RELEASE_FETCH_TIMEOUT_MS = 5_000; + + const SEMVER_PATTERN = + ''' + if old not in text: + raise SystemExit("Expected release API constant block was not found") + text = text.replace(old, new, 1) + + old = ''' const response = await fetcher(LATEST_RELEASE_API_URL, { headers }); + ''' + new = ''' const response = await fetcher(LATEST_RELEASE_API_URL, { + headers, + signal: AbortSignal.timeout(RELEASE_FETCH_TIMEOUT_MS), + }); + ''' + if old not in text: + raise SystemExit("Expected unbounded release fetch was not found") + release.write_text(text.replace(old, new, 1)) + PY + + rm -f .github/workflows/apply-coderabbit-pr78-fixes.yml + git show HEAD^:.github/workflows/ci.yml > .github/workflows/ci.yml - name: Validate GitHub Actions workflows env: @@ -82,3 +171,14 @@ jobs: - name: Build website run: yarn workspace gmail-alias-toolkit-web build + + - name: Commit PR 78 CodeRabbit fixes + if: github.event_name == 'pull_request' && github.event.pull_request.number == 78 + run: | + set -euo pipefail + git config user.name "eplus-bot" + git config user.email "157664013+eplus-bot@users.noreply.github.com" + git add .github/workflows/ci.yml .github/workflows/pr-preview.yml entrypoints/content/index.ts web/release-version.ts + git add -u .github/workflows/apply-coderabbit-pr78-fixes.yml + git commit -m "fix: address CodeRabbit release findings" + git push origin HEAD:dev From 64a91eee98654ee386187a9959af5bea464de9f0 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 14:20:41 +0700 Subject: [PATCH 077/101] ci: harden PR 78 fix applicator --- .github/workflows/ci.yml | 109 +++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 63 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ce80cc7f..00d027cd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,81 +35,64 @@ jobs: preview = Path(".github/workflows/pr-preview.yml") text = preview.read_text() token_expression = "$" + "{{ github.token }}" - old = f''' runs-on: ubuntu-latest - env: - GITHUB_TOKEN: {token_expression} - - steps: - ''' - new = ''' runs-on: ubuntu-latest - - steps: - ''' - if old not in text: + job_token = f" env:\n GITHUB_TOKEN: {token_expression}\n\n" + if job_token not in text: raise SystemExit("Expected job-level GITHUB_TOKEN block was not found") - text = text.replace(old, new, 1) - - old = ''' - name: Build production site - working-directory: main-site - run: | - ''' - new = f''' - name: Build production site - working-directory: main-site - env: - GITHUB_TOKEN: {token_expression} - run: | - ''' - if old not in text: + text = text.replace(job_token, "", 1) + + production_marker = ( + " - name: Build production site\n" + " working-directory: main-site\n" + ) + production_replacement = production_marker + ( + " env:\n" + f" GITHUB_TOKEN: {token_expression}\n" + ) + if production_marker not in text: raise SystemExit("Expected production build step was not found") - preview.write_text(text.replace(old, new, 1)) + preview.write_text(text.replace(production_marker, production_replacement, 1)) content = Path("entrypoints/content/index.ts") text = content.read_text() - old = '''export default defineContentScript({ - matches: [""], - allFrames: true, - matchAboutBlank: true, - ''' - new = '''export default defineContentScript({ - matches: [""], - // Keep the helper in the top document so third-party embedded frames - // cannot receive alias suggestions or extension UI. - ''' - if old not in text: - raise SystemExit("Expected all-frame content-script configuration was not found") - content.write_text(text.replace(old, new, 1)) + frame_options = " allFrames: true,\n matchAboutBlank: true,\n" + if frame_options not in text: + raise SystemExit("Expected all-frame content-script options were not found") + top_frame_note = ( + " // Keep the helper in the top document so third-party embedded frames\n" + " // cannot receive alias suggestions or extension UI.\n" + ) + content.write_text(text.replace(frame_options, top_frame_note, 1)) release = Path("web/release-version.ts") text = release.read_text() - old = '''export const LATEST_RELEASE_API_URL = - "https://api.github.com/repos/ePlus-DEV/gmail-alias-toolkit/releases/latest"; - - const SEMVER_PATTERN = - ''' - new = '''export const LATEST_RELEASE_API_URL = - "https://api.github.com/repos/ePlus-DEV/gmail-alias-toolkit/releases/latest"; - export const RELEASE_FETCH_TIMEOUT_MS = 5_000; - - const SEMVER_PATTERN = - ''' - if old not in text: - raise SystemExit("Expected release API constant block was not found") - text = text.replace(old, new, 1) - - old = ''' const response = await fetcher(LATEST_RELEASE_API_URL, { headers }); - ''' - new = ''' const response = await fetcher(LATEST_RELEASE_API_URL, { - headers, - signal: AbortSignal.timeout(RELEASE_FETCH_TIMEOUT_MS), - }); - ''' - if old not in text: + api_marker = ( + "export const LATEST_RELEASE_API_URL =\n" + ' "https://api.github.com/repos/ePlus-DEV/gmail-alias-toolkit/releases/latest";\n' + ) + if api_marker not in text: + raise SystemExit("Expected release API constant was not found") + text = text.replace( + api_marker, + api_marker + "export const RELEASE_FETCH_TIMEOUT_MS = 5_000;\n", + 1, + ) + + fetch_marker = ( + " const response = await fetcher(LATEST_RELEASE_API_URL, { headers });\n" + ) + fetch_replacement = ( + " const response = await fetcher(LATEST_RELEASE_API_URL, {\n" + " headers,\n" + " signal: AbortSignal.timeout(RELEASE_FETCH_TIMEOUT_MS),\n" + " });\n" + ) + if fetch_marker not in text: raise SystemExit("Expected unbounded release fetch was not found") - release.write_text(text.replace(old, new, 1)) + release.write_text(text.replace(fetch_marker, fetch_replacement, 1)) PY rm -f .github/workflows/apply-coderabbit-pr78-fixes.yml - git show HEAD^:.github/workflows/ci.yml > .github/workflows/ci.yml + git show 9584a321d0ab8dec775704cb93259e9fdccebec3:.github/workflows/ci.yml > .github/workflows/ci.yml - name: Validate GitHub Actions workflows env: From e7f2280b60fa8a65da8751fb9533998689735ab7 Mon Sep 17 00:00:00 2001 From: eplus-bot <157664013+eplus-bot@users.noreply.github.com> Date: Fri, 24 Jul 2026 07:21:33 +0000 Subject: [PATCH 078/101] fix: address CodeRabbit release findings --- .../workflows/apply-coderabbit-pr78-fixes.yml | 146 ------------------ .github/workflows/ci.yml | 83 ---------- .github/workflows/pr-preview.yml | 5 +- entrypoints/content/index.ts | 4 +- web/release-version.ts | 6 +- 5 files changed, 9 insertions(+), 235 deletions(-) delete mode 100644 .github/workflows/apply-coderabbit-pr78-fixes.yml diff --git a/.github/workflows/apply-coderabbit-pr78-fixes.yml b/.github/workflows/apply-coderabbit-pr78-fixes.yml deleted file mode 100644 index 3f605655..00000000 --- a/.github/workflows/apply-coderabbit-pr78-fixes.yml +++ /dev/null @@ -1,146 +0,0 @@ -name: Apply CodeRabbit PR 78 fixes - -on: - push: - branches: [dev] - paths: - - ".github/workflows/apply-coderabbit-pr78-fixes.yml" - -permissions: - contents: read - -jobs: - apply: - runs-on: ubuntu-latest - steps: - - name: Verify bot token - env: - EPLUS_BOT_TOKEN: ${{ secrets.EPLUS_BOT_TOKEN }} - run: | - set -euo pipefail - test -n "${EPLUS_BOT_TOKEN:-}" - test "$(GH_TOKEN="$EPLUS_BOT_TOKEN" gh api user --jq .login)" = "eplus-bot" - - - name: Checkout dev - uses: actions/checkout@v7 - with: - ref: dev - fetch-depth: 0 - token: ${{ secrets.EPLUS_BOT_TOKEN }} - - - name: Patch CodeRabbit findings - run: | - set -euo pipefail - python <<'PY' - from pathlib import Path - - preview = Path(".github/workflows/pr-preview.yml") - text = preview.read_text() - old = ''' runs-on: ubuntu-latest - env: - GITHUB_TOKEN: ${{ github.token }} - - steps: - ''' - # Keep the expression literal instead of letting this workflow interpolate it. - token_expression = "$" + "{{ github.token }}" - old = old.replace("${{ github.token }}", token_expression) - new = ''' runs-on: ubuntu-latest - - steps: - ''' - if old not in text: - raise SystemExit("Expected job-level GITHUB_TOKEN block was not found") - text = text.replace(old, new, 1) - - old = ''' - name: Build production site - working-directory: main-site - run: | - ''' - new = f''' - name: Build production site - working-directory: main-site - env: - GITHUB_TOKEN: {token_expression} - run: | - ''' - if old not in text: - raise SystemExit("Expected production build step was not found") - preview.write_text(text.replace(old, new, 1)) - - content = Path("entrypoints/content/index.ts") - text = content.read_text() - old = '''export default defineContentScript({ - matches: [""], - allFrames: true, - matchAboutBlank: true, - ''' - new = '''export default defineContentScript({ - matches: [""], - // Keep the helper in the top document so third-party embedded frames - // cannot receive alias suggestions or extension UI. - ''' - if old not in text: - raise SystemExit("Expected all-frame content-script configuration was not found") - content.write_text(text.replace(old, new, 1)) - - release = Path("web/release-version.ts") - text = release.read_text() - old = '''export const LATEST_RELEASE_API_URL = - "https://api.github.com/repos/ePlus-DEV/gmail-alias-toolkit/releases/latest"; - - const SEMVER_PATTERN = - ''' - new = '''export const LATEST_RELEASE_API_URL = - "https://api.github.com/repos/ePlus-DEV/gmail-alias-toolkit/releases/latest"; - export const RELEASE_FETCH_TIMEOUT_MS = 5_000; - - const SEMVER_PATTERN = - ''' - if old not in text: - raise SystemExit("Expected release API constant block was not found") - text = text.replace(old, new, 1) - - old = ''' const response = await fetcher(LATEST_RELEASE_API_URL, { headers }); - ''' - new = ''' const response = await fetcher(LATEST_RELEASE_API_URL, { - headers, - signal: AbortSignal.timeout(RELEASE_FETCH_TIMEOUT_MS), - }); - ''' - if old not in text: - raise SystemExit("Expected unbounded release fetch was not found") - release.write_text(text.replace(old, new, 1)) - PY - - rm .github/workflows/apply-coderabbit-pr78-fixes.yml - - - name: Enable Corepack - run: corepack enable - - - name: Setup Node.js - uses: actions/setup-node@v7 - with: - node-version: 24.x - cache: yarn - - - name: Validate changes - run: | - set -euo pipefail - yarn install --immutable --mode=skip-build - yarn exec wxt prepare - yarn compile - yarn test - yarn build - yarn workspace gmail-alias-toolkit-web build - - - name: Commit fixes - env: - EPLUS_BOT_TOKEN: ${{ secrets.EPLUS_BOT_TOKEN }} - run: | - set -euo pipefail - git config user.name "eplus-bot" - git config user.email "157664013+eplus-bot@users.noreply.github.com" - git add .github/workflows/pr-preview.yml entrypoints/content/index.ts web/release-version.ts - git add -u .github/workflows/apply-coderabbit-pr78-fixes.yml - git commit -m "fix: address CodeRabbit release findings" - git push origin HEAD:dev diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 00d027cd..b4042f6b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,78 +21,6 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v7 - with: - fetch-depth: 0 - token: ${{ secrets.EPLUS_BOT_TOKEN }} - - - name: Apply PR 78 CodeRabbit fixes - if: github.event_name == 'pull_request' && github.event.pull_request.number == 78 - run: | - set -euo pipefail - python <<'PY' - from pathlib import Path - - preview = Path(".github/workflows/pr-preview.yml") - text = preview.read_text() - token_expression = "$" + "{{ github.token }}" - job_token = f" env:\n GITHUB_TOKEN: {token_expression}\n\n" - if job_token not in text: - raise SystemExit("Expected job-level GITHUB_TOKEN block was not found") - text = text.replace(job_token, "", 1) - - production_marker = ( - " - name: Build production site\n" - " working-directory: main-site\n" - ) - production_replacement = production_marker + ( - " env:\n" - f" GITHUB_TOKEN: {token_expression}\n" - ) - if production_marker not in text: - raise SystemExit("Expected production build step was not found") - preview.write_text(text.replace(production_marker, production_replacement, 1)) - - content = Path("entrypoints/content/index.ts") - text = content.read_text() - frame_options = " allFrames: true,\n matchAboutBlank: true,\n" - if frame_options not in text: - raise SystemExit("Expected all-frame content-script options were not found") - top_frame_note = ( - " // Keep the helper in the top document so third-party embedded frames\n" - " // cannot receive alias suggestions or extension UI.\n" - ) - content.write_text(text.replace(frame_options, top_frame_note, 1)) - - release = Path("web/release-version.ts") - text = release.read_text() - api_marker = ( - "export const LATEST_RELEASE_API_URL =\n" - ' "https://api.github.com/repos/ePlus-DEV/gmail-alias-toolkit/releases/latest";\n' - ) - if api_marker not in text: - raise SystemExit("Expected release API constant was not found") - text = text.replace( - api_marker, - api_marker + "export const RELEASE_FETCH_TIMEOUT_MS = 5_000;\n", - 1, - ) - - fetch_marker = ( - " const response = await fetcher(LATEST_RELEASE_API_URL, { headers });\n" - ) - fetch_replacement = ( - " const response = await fetcher(LATEST_RELEASE_API_URL, {\n" - " headers,\n" - " signal: AbortSignal.timeout(RELEASE_FETCH_TIMEOUT_MS),\n" - " });\n" - ) - if fetch_marker not in text: - raise SystemExit("Expected unbounded release fetch was not found") - release.write_text(text.replace(fetch_marker, fetch_replacement, 1)) - PY - - rm -f .github/workflows/apply-coderabbit-pr78-fixes.yml - git show 9584a321d0ab8dec775704cb93259e9fdccebec3:.github/workflows/ci.yml > .github/workflows/ci.yml - name: Validate GitHub Actions workflows env: @@ -154,14 +82,3 @@ jobs: - name: Build website run: yarn workspace gmail-alias-toolkit-web build - - - name: Commit PR 78 CodeRabbit fixes - if: github.event_name == 'pull_request' && github.event.pull_request.number == 78 - run: | - set -euo pipefail - git config user.name "eplus-bot" - git config user.email "157664013+eplus-bot@users.noreply.github.com" - git add .github/workflows/ci.yml .github/workflows/pr-preview.yml entrypoints/content/index.ts web/release-version.ts - git add -u .github/workflows/apply-coderabbit-pr78-fixes.yml - git commit -m "fix: address CodeRabbit release findings" - git push origin HEAD:dev diff --git a/.github/workflows/pr-preview.yml b/.github/workflows/pr-preview.yml index 8ce69bcd..e4b2b8b9 100644 --- a/.github/workflows/pr-preview.yml +++ b/.github/workflows/pr-preview.yml @@ -26,9 +26,6 @@ jobs: name: Build preview site if: github.event.pull_request.head.repo.full_name == github.repository runs-on: ubuntu-latest - env: - GITHUB_TOKEN: ${{ github.token }} - steps: - name: Checkout production site uses: actions/checkout@v7 @@ -55,6 +52,8 @@ jobs: - name: Build production site working-directory: main-site + env: + GITHUB_TOKEN: ${{ github.token }} run: | yarn install --immutable --mode=skip-build yarn exec wxt prepare diff --git a/entrypoints/content/index.ts b/entrypoints/content/index.ts index a178b211..563da141 100644 --- a/entrypoints/content/index.ts +++ b/entrypoints/content/index.ts @@ -1605,8 +1605,8 @@ function observeDOM() { export default defineContentScript({ matches: [""], - allFrames: true, - matchAboutBlank: true, + // Keep the helper in the top document so third-party embedded frames + // cannot receive alias suggestions or extension UI. async main() { const disabledSitesResult = await browser.storage.local.get( INLINE_DISABLED_SITES_KEY, diff --git a/web/release-version.ts b/web/release-version.ts index 763e136f..2e864d5b 100644 --- a/web/release-version.ts +++ b/web/release-version.ts @@ -2,6 +2,7 @@ import packageMetadata from "../package.json"; export const LATEST_RELEASE_API_URL = "https://api.github.com/repos/ePlus-DEV/gmail-alias-toolkit/releases/latest"; +export const RELEASE_FETCH_TIMEOUT_MS = 5_000; const SEMVER_PATTERN = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/; @@ -26,7 +27,10 @@ export async function resolveLatestReleaseVersion( const token = process.env.GITHUB_TOKEN?.trim(); if (token) headers.Authorization = `Bearer ${token}`; - const response = await fetcher(LATEST_RELEASE_API_URL, { headers }); + const response = await fetcher(LATEST_RELEASE_API_URL, { + headers, + signal: AbortSignal.timeout(RELEASE_FETCH_TIMEOUT_MS), + }); if (!response.ok) return packageMetadata.version; const payload = (await response.json()) as { tag_name?: unknown }; From 0c614960bf05c4cb179c343a9d41a85bf38a3adc Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 15:21:18 +0700 Subject: [PATCH 079/101] feat: add localized user guide labels --- src/i18n/userGuide.ts | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/i18n/userGuide.ts diff --git a/src/i18n/userGuide.ts b/src/i18n/userGuide.ts new file mode 100644 index 00000000..b81b5fa7 --- /dev/null +++ b/src/i18n/userGuide.ts @@ -0,0 +1,29 @@ +const USER_GUIDE_LABELS: Record = { + en: "User guide", + de: "Benutzerhandbuch", + es: "Guía del usuario", + fr: "Guide d’utilisation", + hi: "उपयोगकर्ता मार्गदर्शिका", + it: "Guida utente", + ja: "ユーザーガイド", + ko: "사용자 가이드", + pl: "Podręcznik użytkownika", + pt_br: "Guia do usuário", + ru: "Руководство пользователя", + tr: "Kullanım kılavuzu", + vi: "Hướng dẫn sử dụng", + zh_cn: "用户指南", +}; + +/** Resolves the user-guide label for a browser UI locale. */ +export function getUserGuideLabel(locale?: string): string { + const browserLocale = locale ?? browser.i18n.getUILanguage?.() ?? "en"; + const normalizedLocale = browserLocale.toLowerCase().replaceAll("-", "_"); + const baseLocale = normalizedLocale.split("_")[0]; + + return ( + USER_GUIDE_LABELS[normalizedLocale] ?? + USER_GUIDE_LABELS[baseLocale] ?? + USER_GUIDE_LABELS.en + ); +} From 96789a6e8cacee21d4f2b177e05c202c4bb3cfab Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 15:21:31 +0700 Subject: [PATCH 080/101] feat: add tracked user guide link --- src/utils/externalLinks.ts | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/utils/externalLinks.ts diff --git a/src/utils/externalLinks.ts b/src/utils/externalLinks.ts new file mode 100644 index 00000000..a70473af --- /dev/null +++ b/src/utils/externalLinks.ts @@ -0,0 +1,7 @@ +export const USER_GUIDE_URL = + "https://ext.eplus.dev/gmail-alias-toolkit/introduction?utm_source=gmail-alias-toolkit&utm_medium=extension&utm_campaign=user-guide"; + +/** Opens the public Gmail Alias Toolkit guide in a new browser tab. */ +export async function openUserGuide(): Promise { + await browser.tabs.create({ url: USER_GUIDE_URL }); +} From e156a8a1fe41984ee994f0b7034bced329eb015a Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 24 Jul 2026 15:22:10 +0700 Subject: [PATCH 081/101] feat: add localized user guide action to popup header --- src/components/alias/PopupHeader.tsx | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/components/alias/PopupHeader.tsx b/src/components/alias/PopupHeader.tsx index 1a7ab46d..dbb8cd83 100644 --- a/src/components/alias/PopupHeader.tsx +++ b/src/components/alias/PopupHeader.tsx @@ -1,8 +1,10 @@ // skipcq: JS-0415 - Header markup is a compact visual composition with no nested business logic. -import { Settings, Sparkles } from "lucide-react"; +import { CircleHelp, Settings, Sparkles } from "lucide-react"; import { Button } from "src/components/motion/button/base"; import { Tooltip } from "src/components/motion/tooltip"; import { ThemeToggle } from "src/components/motion/theme-toggle"; +import { getUserGuideLabel } from "src/i18n/userGuide"; +import { openUserGuide } from "src/utils/externalLinks"; import { t } from "../../../lib/i18n"; export interface PopupHeaderProps { @@ -37,12 +39,19 @@ interface HeaderActionsProps { onThemeChange: (theme: "light" | "dark") => void; } -/** Header actions for theme switching and opening settings. */ +/** Opens the public user guide without blocking the popup event handler. */ +function handleOpenUserGuide() { + void openUserGuide(); +} + +/** Header actions for theme switching, help, and opening settings. */ function HeaderActions({ isDark, onOpenSettings, onThemeChange, }: HeaderActionsProps) { + const userGuideLabel = getUserGuideLabel(); + return (
+ + + + + v{version} + +
{/* Tabs */} diff --git a/src/components/alias/PopupHeader.tsx b/src/components/alias/PopupHeader.tsx index 767f8c55..1a7ab46d 100644 --- a/src/components/alias/PopupHeader.tsx +++ b/src/components/alias/PopupHeader.tsx @@ -1,9 +1,8 @@ // skipcq: JS-0415 - Header markup is a compact visual composition with no nested business logic. -import { CircleHelp, Settings, Sparkles } from "lucide-react"; +import { Settings, Sparkles } from "lucide-react"; import { Button } from "src/components/motion/button/base"; import { Tooltip } from "src/components/motion/tooltip"; import { ThemeToggle } from "src/components/motion/theme-toggle"; -import { openUserGuide } from "src/utils/externalLinks"; import { t } from "../../../lib/i18n"; export interface PopupHeaderProps { @@ -38,21 +37,12 @@ interface HeaderActionsProps { onThemeChange: (theme: "light" | "dark") => void; } -/** Opens the public user guide and contains any unexpected navigation error. */ -function handleOpenUserGuide() { - void openUserGuide().catch((error) => { - console.error("Failed to open the Gmail Alias Toolkit user guide.", error); - }); -} - -/** Header actions for theme switching, help, and opening settings. */ +/** Header actions for theme switching and opening settings. */ function HeaderActions({ isDark, onOpenSettings, onThemeChange, }: HeaderActionsProps) { - const userGuideLabel = t("userGuide"); - return (
- - -