diff --git a/package-lock.json b/package-lock.json index b1c5cb79..adcd92a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -168,7 +168,8 @@ "tailwind-merge": "^2.0.0", "tailwindcss": "^3.3.5", "taze": "^0.12.2", - "typescript": "^5.3.2", + "ts-node": "^10.9.2", + "typescript": "^5.8.3", "vite": "^6.0.6", "vite-plugin-tauri": "^4.0.0" } @@ -2657,6 +2658,28 @@ "node": ">=0.1.90" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@dnd-kit/accessibility": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz", @@ -7281,6 +7304,30 @@ "node": ">=10.13.0" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", @@ -7792,6 +7839,18 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -9187,6 +9246,12 @@ "node": ">=10" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/crelt": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", @@ -9679,6 +9744,15 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -12120,6 +12194,12 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/make-fetch-happen": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", @@ -16099,6 +16179,55 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -16235,9 +16364,9 @@ } }, "node_modules/typescript": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", - "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -16533,6 +16662,12 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -17015,6 +17150,15 @@ "node": ">=12" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/youtube-player": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/youtube-player/-/youtube-player-5.5.2.tgz", @@ -19762,6 +19906,27 @@ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "optional": true }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, "@dnd-kit/accessibility": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz", @@ -22532,6 +22697,30 @@ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, + "@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "@tufjs/canonical-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", @@ -22984,6 +23173,15 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" }, + "acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "requires": { + "acorn": "^8.11.0" + } + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -24001,6 +24199,12 @@ "yaml": "^1.10.0" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "crelt": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", @@ -24336,6 +24540,12 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -26143,6 +26353,12 @@ } } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "make-fetch-happen": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", @@ -29470,6 +29686,35 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, + "ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + } + } + }, "tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -29583,9 +29828,9 @@ } }, "typescript": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", - "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true }, "uc.micro": { @@ -29764,6 +30009,12 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==" }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -30092,6 +30343,12 @@ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, "youtube-player": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/youtube-player/-/youtube-player-5.5.2.tgz", diff --git a/package.json b/package.json index b6ea5beb..bc3c1af3 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "preview": "vite preview", "changeset": "changeset", "version:sync": "node scripts/sync-version.js", - "version": "changeset version && npm run version:sync" + "version": "changeset version && npm run version:sync", + "translation-audit": "ts-node scripts/translation-audit.ts" }, "dependencies": { "@codastic/react-positioning-portal": "^0.7.0", @@ -177,12 +178,13 @@ "postcss": "^8.4.31", "prettier": "^3.1.0", "prettier-plugin-tailwindcss": "^0.5.7", - "rimraf": "^5.0.5", "react-compiler-runtime": "^19.0.0-beta-b2e8e9c-20241220", + "rimraf": "^5.0.5", "tailwind-merge": "^2.0.0", "tailwindcss": "^3.3.5", "taze": "^0.12.2", - "typescript": "^5.3.2", + "ts-node": "^10.9.2", + "typescript": "^5.8.3", "vite": "^6.0.6", "vite-plugin-tauri": "^4.0.0" } diff --git a/packages/pastebar-app-ui/src/locales/lang/esES/backuprestore.yaml b/packages/pastebar-app-ui/src/locales/lang/esES/backuprestore.yaml index b68eb8cb..4be946bc 100644 --- a/packages/pastebar-app-ui/src/locales/lang/esES/backuprestore.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/esES/backuprestore.yaml @@ -41,3 +41,6 @@ Loading backups...: Cargando copias de seguridad... will be permanently deleted.: será eliminado permanentemente. This action cannot be undone. All current data will be replaced with the backup data.: Esta acción no se puede deshacer. Todos los datos actuales serán reemplazados con los datos de la copia de seguridad. Restoring a backup will automatically restart the application.: Restaurar una copia de seguridad reiniciará automáticamente la aplicación. +Backup on Restore: Copia de seguridad al restaurar +Restore from {{filename}}? This will replace all current data.: ¿Restaurar desde {{filename}}? Esto reemplazará todos los datos actuales. +Restoring...: Restaurando... diff --git a/packages/pastebar-app-ui/src/locales/lang/esES/common.yaml b/packages/pastebar-app-ui/src/locales/lang/esES/common.yaml index 97daef6a..29496726 100644 --- a/packages/pastebar-app-ui/src/locales/lang/esES/common.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/esES/common.yaml @@ -350,3 +350,4 @@ second: segundo seconds: segundos show less: mostrar menos www.site: www.pastebar.app +Size: Tamaño diff --git a/packages/pastebar-app-ui/src/locales/lang/esES/settings.yaml b/packages/pastebar-app-ui/src/locales/lang/esES/settings.yaml index 9d88de02..1387b6bb 100644 --- a/packages/pastebar-app-ui/src/locales/lang/esES/settings.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/esES/settings.yaml @@ -206,3 +206,7 @@ An error occurred during directory processing.: Ocurrió un error durante el pro An error occurred during directory selection or setup.: Ocurrió un error durante la selección o configuración del directorio. Disable Image Capture: Deshabilitar Captura de Imágenes Disable capturing and storing images from clipboard: Deshabilitar la captura y almacenamiento de imágenes del portapapeles +Custom Database Location: Ubicación de base de datos personalizada +Selected new data folder: Carpeta de datos seleccionada +Set a recovery password to easily reset your lock screen passcode if forgotten. Your password will be securely stored in your device's OS storage.: Establece una contraseña de recuperación para restablecer fácilmente tu código de pantalla bloqueada si lo olvidas. Tu contraseña se almacenará de forma segura en el almacenamiento del sistema operativo de tu dispositivo. +none: ninguna diff --git a/packages/pastebar-app-ui/src/locales/lang/fr/backuprestore.yaml b/packages/pastebar-app-ui/src/locales/lang/fr/backuprestore.yaml index e63d98cf..d4a2df07 100644 --- a/packages/pastebar-app-ui/src/locales/lang/fr/backuprestore.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/fr/backuprestore.yaml @@ -41,3 +41,6 @@ Loading backups...: Chargement des sauvegardes... will be permanently deleted.: sera définitivement supprimé. This action cannot be undone. All current data will be replaced with the backup data.: Cette action ne peut pas être annulée. Toutes les données actuelles seront remplacées par les données de sauvegarde. Restoring a backup will automatically restart the application.: La restauration d'une sauvegarde redémarrera automatiquement l'application. +Backup on Restore: Sauvegarde lors de la restauration +Restore from {{filename}}? This will replace all current data.: Restaurer depuis {{filename}} ? Cela remplacera toutes les données actuelles. +Restoring...: Restauration en cours... diff --git a/packages/pastebar-app-ui/src/locales/lang/fr/common.yaml b/packages/pastebar-app-ui/src/locales/lang/fr/common.yaml index 1982032d..e95d5af1 100644 --- a/packages/pastebar-app-ui/src/locales/lang/fr/common.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/fr/common.yaml @@ -350,3 +350,4 @@ second: seconde seconds: secondes show less: afficher moins www.site: www.pastebar.app +Size: Taille diff --git a/packages/pastebar-app-ui/src/locales/lang/fr/dashboard.yaml b/packages/pastebar-app-ui/src/locales/lang/fr/dashboard.yaml index 56d6cfad..f596ec91 100644 --- a/packages/pastebar-app-ui/src/locales/lang/fr/dashboard.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/fr/dashboard.yaml @@ -244,3 +244,20 @@ Unsaved subtitle: Sous-titre non enregistré Unsaved title: Titre non enregistré Update Link Card: Mettre à jour la carte de lien Use double curly brackets for {{field name}}. Use {{clipboard}} to add current clipboard value.: Utilisez des doubles accolades pour {{nom du champ}}. Utilisez {{clipboard}} pour ajouter la valeur actuelle du presse-papier +Value: Valeur +Values: Valeurs +Vertical Split: Division verticale +We need to open a new window where you can drag & drop file, path or application.: Nous devons ouvrir une nouvelle fenêtre où vous pouvez glisser-déposer un fichier, un chemin ou une application. +Web Link or Email might not be valid: Le lien Web ou l'e-mail pourrait ne pas être valide +Web or Email link is valid: Le lien Web ou l'e-mail est valide +Website URL: URL du site Web +Website URL is valid: L'URL du site Web est valide +Website URL might not be valid: L'URL du site Web pourrait ne pas être valide +Wrap output using {{output}} placeholder: Envelopper la sortie en utilisant l'espace réservé {{output}} +You have no rules added: Vous n'avez ajouté aucune règle +You'll need to clear this board of all clips and subboards before it can be deleted.: Vous devrez vider ce tableau de tous les clips et sous-tableaux avant de pouvoir le supprimer. +You'll need to clear this tab of all boards before it can be deleted.: Vous devrez vider cet onglet de tous les tableaux avant de pouvoir le supprimer. +filled template: modèle rempli +new clips: nouveaux clips +template: modèle +'{{type}} Field': 'Champ {{type}}' diff --git a/packages/pastebar-app-ui/src/locales/lang/fr/settings.yaml b/packages/pastebar-app-ui/src/locales/lang/fr/settings.yaml index 94a6737a..f2bbc015 100644 --- a/packages/pastebar-app-ui/src/locales/lang/fr/settings.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/fr/settings.yaml @@ -207,3 +207,6 @@ An error occurred during directory processing.: Une erreur s'est produite lors d An error occurred during directory selection or setup.: Une erreur s'est produite lors de la sélection ou configuration du répertoire. Disable Image Capture: Désactiver la Capture d'Images Disable capturing and storing images from clipboard: Désactiver la capture et le stockage d'images depuis le presse-papiers +Custom Database Location: Emplacement personnalisé de la base de données +Selected new data folder: Nouveau dossier de données sélectionné pour modification +none: aucun diff --git a/packages/pastebar-app-ui/src/locales/lang/it/backuprestore.yaml b/packages/pastebar-app-ui/src/locales/lang/it/backuprestore.yaml index f0066eef..cd9cb258 100644 --- a/packages/pastebar-app-ui/src/locales/lang/it/backuprestore.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/it/backuprestore.yaml @@ -41,3 +41,6 @@ Loading backups...: Caricamento backup... will be permanently deleted.: sarà eliminato permanentemente. This action cannot be undone. All current data will be replaced with the backup data.: Questa azione non può essere annullata. Tutti i dati attuali saranno sostituiti con i dati del backup. Restoring a backup will automatically restart the application.: Il ripristino di un backup riavvierà automaticamente l'applicazione. +Backup on Restore: Backup al ripristino +Restore from {{filename}}? This will replace all current data.: Ripristinare da {{filename}}? Ciò sostituirà tutti i dati correnti. +Restoring...: Ripristino in corso... diff --git a/packages/pastebar-app-ui/src/locales/lang/it/common.yaml b/packages/pastebar-app-ui/src/locales/lang/it/common.yaml index 7609304f..26ec1527 100644 --- a/packages/pastebar-app-ui/src/locales/lang/it/common.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/it/common.yaml @@ -349,3 +349,9 @@ second: secondo seconds: secondi show less: mostra meno www.site: www.pastebar.app +Add {{Clipboard}} field to template. This allows you to copy text to the clipboard, and it will be inserted into the template: Aggiungi il campo {{Clipboard}} al modello. Questo ti permette di copiare il testo negli appunti e sarà inserito nel modello +Clear History: Cancella Cronologia +'Copy of ': 'Copia di ' +Field {{Clipboard}} has been found in the template. This allows you to copy text to the clipboard, and it will be inserted into the template: Il campo {{Clipboard}} è stato trovato nel modello. Questo ti permette di copiare il testo negli appunti e sarà inserito nel modello +Size: Dimensione +Update Error: Errore di Aggiornamento diff --git a/packages/pastebar-app-ui/src/locales/lang/it/dashboard.yaml b/packages/pastebar-app-ui/src/locales/lang/it/dashboard.yaml index 844c6640..cefe2dbd 100644 --- a/packages/pastebar-app-ui/src/locales/lang/it/dashboard.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/it/dashboard.yaml @@ -285,3 +285,4 @@ template: modello '{{count}} fields not found in the template._other': '{{count}} campi non trovati nel modello.' '{{type}} Field': 'Campo {{type}}' '{{type}} field': 'campo {{type}}' +Press: Press diff --git a/packages/pastebar-app-ui/src/locales/lang/it/settings.yaml b/packages/pastebar-app-ui/src/locales/lang/it/settings.yaml index d141148b..cd9fd993 100644 --- a/packages/pastebar-app-ui/src/locales/lang/it/settings.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/it/settings.yaml @@ -206,3 +206,6 @@ An error occurred during directory processing.: Si è verificato un errore duran An error occurred during directory selection or setup.: Si è verificato un errore durante la selezione o configurazione della directory. Disable Image Capture: Disabilita Cattura Immagini Disable capturing and storing images from clipboard: Disabilita la cattura e memorizzazione di immagini dagli appunti +Custom Database Location: Posizione Database Personalizzata +Selected new data folder: Nuova cartella dati selezionata per il cambio +none: nessuno diff --git a/packages/pastebar-app-ui/src/locales/lang/ru/backuprestore.yaml b/packages/pastebar-app-ui/src/locales/lang/ru/backuprestore.yaml index 0270637e..2e5f7a27 100644 --- a/packages/pastebar-app-ui/src/locales/lang/ru/backuprestore.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/ru/backuprestore.yaml @@ -41,3 +41,6 @@ Loading backups...: Загрузка резервных копий... will be permanently deleted.: будет удалена навсегда. This action cannot be undone. All current data will be replaced with the backup data.: Это действие нельзя отменить. Все текущие данные будут заменены данными из резервной копии. Restoring a backup will automatically restart the application.: Восстановление резервной копии автоматически перезапустит приложение. +Backup on Restore: Резервное копирование при восстановлении +Restore from {{filename}}? This will replace all current data.: Восстановить из файла {{filename}}? Это заменит все текущие данные. +Restoring...: Восстановление... diff --git a/packages/pastebar-app-ui/src/locales/lang/ru/common.yaml b/packages/pastebar-app-ui/src/locales/lang/ru/common.yaml index d8e8187c..60b13f2f 100644 --- a/packages/pastebar-app-ui/src/locales/lang/ru/common.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/ru/common.yaml @@ -96,7 +96,6 @@ Enter Passcode: Введите код доступа Enter Password: Введите пароль Enter Recovery Password: Введите пароль восстановления Enter passcode or password to unlock: Введите код доступа или пароль для разблокировки -Error: Error Errors: Error loading link: Ошибка загрузки ссылки Cant save file: Невозможно сохранить файл @@ -351,3 +350,10 @@ second: секунда seconds: секунды show less: показать меньше www.site: www.pastebar.ru +Add {{Clipboard}} field to template. This allows you to copy text to the clipboard, and it will be inserted into the template: Добавьте поле {{Clipboard}} в шаблон. Это позволит копировать текст в буфер обмена, и он будет вставлен в шаблон +Clear History: Очистить историю +'Copy of ': 'Копия ' +Error: Ошибка +Field {{Clipboard}} has been found in the template. This allows you to copy text to the clipboard, and it will be inserted into the template: Поле {{Clipboard}} найдено в шаблоне. Это позволяет копировать текст в буфер обмена, и он будет вставлен в шаблон +Size: Размер +Update Error: Ошибка обновления diff --git a/packages/pastebar-app-ui/src/locales/lang/ru/help.yaml b/packages/pastebar-app-ui/src/locales/lang/ru/help.yaml index fdd29672..18a6c6df 100644 --- a/packages/pastebar-app-ui/src/locales/lang/ru/help.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/ru/help.yaml @@ -84,3 +84,5 @@ WelcomeTour: Давайте начнем с изучения панели ист WelcomeTourCanSkip: Нажмите Пропустить тур если вы хотите разобраться в его работе сами. Если вам понадобится помощь, вы всегда сможете найти все туры в навигационном меню Помощь > Туры по приложению. WelcomeTourDescription: Пройдите тур по разделу, чтобы узнать о его функциях и возможностях. You have completed the tour: Вы завершили тур +Next Tour: Следующий тур +TourCanSkip: Тур можно пропустить diff --git a/packages/pastebar-app-ui/src/locales/lang/ru/navbar.yaml b/packages/pastebar-app-ui/src/locales/lang/ru/navbar.yaml index 2591b7ec..05960310 100644 --- a/packages/pastebar-app-ui/src/locales/lang/ru/navbar.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/ru/navbar.yaml @@ -37,3 +37,4 @@ Window: Minimize Window: Свернуть окно Pin Window: Закрепить окно UnPin Window: Открепить окно +Help: Помощь diff --git a/packages/pastebar-app-ui/src/locales/lang/ru/settings.yaml b/packages/pastebar-app-ui/src/locales/lang/ru/settings.yaml index b1acd72c..e92c32a7 100644 --- a/packages/pastebar-app-ui/src/locales/lang/ru/settings.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/ru/settings.yaml @@ -191,3 +191,10 @@ An error occurred during directory processing.: Произошла ошибка An error occurred during directory selection or setup.: Произошла ошибка при выборе или настройке директории. Disable Image Capture: Отключить Захват Изображений Disable capturing and storing images from clipboard: Отключить захват и сохранение изображений из буфера обмена +Custom Database Location: Пользовательское расположение базы данных +Minimize Window: Свернуть окно +Passcode verification is locked.: Проверка кода доступа заблокирована. +Pin Window: Закрепить окно +Selected new data folder: Выбранная новая папка данных для изменения +UnPin Window: Открепить окно +none: нет diff --git a/packages/pastebar-app-ui/src/locales/lang/tr/backuprestore.yaml b/packages/pastebar-app-ui/src/locales/lang/tr/backuprestore.yaml index 66836b25..d43ca9f0 100644 --- a/packages/pastebar-app-ui/src/locales/lang/tr/backuprestore.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/tr/backuprestore.yaml @@ -41,3 +41,5 @@ Loading backups...: Yedekler yükleniyor... will be permanently deleted.: kalıcı olarak silinecek. This action cannot be undone. All current data will be replaced with the backup data.: Bu eylem geri alınamaz. Mevcut tüm veriler yedek verileriyle değiştirilecek. Restoring a backup will automatically restart the application.: Bir yedeği geri yüklemek uygulamayı otomatik olarak yeniden başlatacak. +Backup on Restore: Geri Yüklemede Yedekle +Restoring...: Geri yükleniyor... diff --git a/packages/pastebar-app-ui/src/locales/lang/tr/common.yaml b/packages/pastebar-app-ui/src/locales/lang/tr/common.yaml index b5b22100..c6d90248 100644 --- a/packages/pastebar-app-ui/src/locales/lang/tr/common.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/tr/common.yaml @@ -349,3 +349,4 @@ second: saniye seconds: saniyeler show less: az göster www.site: www.pastebar.app +Size: Boyut diff --git a/packages/pastebar-app-ui/src/locales/lang/tr/dashboard.yaml b/packages/pastebar-app-ui/src/locales/lang/tr/dashboard.yaml index efbdf36b..0825695b 100644 --- a/packages/pastebar-app-ui/src/locales/lang/tr/dashboard.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/tr/dashboard.yaml @@ -265,3 +265,4 @@ template: şablon '{{count}} fields not found in the template._other': '{{count}} şablonda alanlar bulunamadı.' '{{type}} Field': '{{type}} Alan' '{{type}} field': '{{type}} alan' +HTML: HTML diff --git a/packages/pastebar-app-ui/src/locales/lang/tr/settings.yaml b/packages/pastebar-app-ui/src/locales/lang/tr/settings.yaml index 9e30ec77..2be0ff12 100644 --- a/packages/pastebar-app-ui/src/locales/lang/tr/settings.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/tr/settings.yaml @@ -207,3 +207,6 @@ An error occurred during directory processing.: Dizin işleme sırasında bir ha An error occurred during directory selection or setup.: Dizin seçimi veya kurulumu sırasında bir hata oluştu. Disable Image Capture: Görüntü Yakalamayı Devre Dışı Bırak Disable capturing and storing images from clipboard: Panodan görüntü yakalama ve depolamayı devre dışı bırak +Custom Database Location: Özel Veritabanı Konumu +Selected new data folder: Değişiklik için seçili yeni veri klasörü +none: hiçbiri diff --git a/packages/pastebar-app-ui/src/locales/lang/uk/backuprestore.yaml b/packages/pastebar-app-ui/src/locales/lang/uk/backuprestore.yaml index fb361d17..b096a329 100644 --- a/packages/pastebar-app-ui/src/locales/lang/uk/backuprestore.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/uk/backuprestore.yaml @@ -41,3 +41,6 @@ Loading backups...: Завантаження резервних копій... will be permanently deleted.: буде видалено назавжди. This action cannot be undone. All current data will be replaced with the backup data.: Цю дію неможливо скасувати. Всі поточні дані будуть замінені даними з резервної копії. Restoring a backup will automatically restart the application.: Відновлення резервної копії автоматично перезапустить додаток. +Backup on Restore: Резервне копіювання при відновленні +Restore from {{filename}}? This will replace all current data.: Відновити з файлу {{filename}}? Це замінить усі поточні дані. +Restoring...: Відновлення... diff --git a/packages/pastebar-app-ui/src/locales/lang/uk/common.yaml b/packages/pastebar-app-ui/src/locales/lang/uk/common.yaml index 96dbf24c..a98d4899 100644 --- a/packages/pastebar-app-ui/src/locales/lang/uk/common.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/uk/common.yaml @@ -350,3 +350,9 @@ second: секунда seconds: секунди show less: показати менше www.site: www.pastebar.app +Add {{Clipboard}} field to template. This allows you to copy text to the clipboard, and it will be inserted into the template: Додайте поле {{Clipboard}} до шаблону. Це дозволить копіювати текст до буфера обміну, і він буде вставлений у шаблон +Clear History: Очистити історію +'Copy of ': 'Копія ' +Field {{Clipboard}} has been found in the template. This allows you to copy text to the clipboard, and it will be inserted into the template: Поле {{Clipboard}} знайдено в шаблоні. Це дозволяє копіювати текст до буфера обміну, і він буде вставлений у шаблон +Size: Розмір +Update Error: Помилка оновлення diff --git a/packages/pastebar-app-ui/src/locales/lang/uk/help.yaml b/packages/pastebar-app-ui/src/locales/lang/uk/help.yaml index 93682e38..fa983531 100644 --- a/packages/pastebar-app-ui/src/locales/lang/uk/help.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/uk/help.yaml @@ -84,3 +84,5 @@ WelcomeTour: Давайте почнемо з вивчення панелі іс WelcomeTourCanSkip: Натисніть Пропустити тур, якщо ви хочете розібратися в його роботі самі. Якщо вам знадобиться допомога, ви завжди зможете знайти всі тури в навігаційному меню Допомога > Екскурсії додатком. WelcomeTourDescription: Пройдіть тур по розділу, щоб дізнатися про його функції та можливості. You have completed the tour: Ви завершили тур +Next Tour: Наступний тур +TourCanSkip: Тур можна пропустити diff --git a/packages/pastebar-app-ui/src/locales/lang/uk/navbar.yaml b/packages/pastebar-app-ui/src/locales/lang/uk/navbar.yaml index d940596d..c98a2333 100644 --- a/packages/pastebar-app-ui/src/locales/lang/uk/navbar.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/uk/navbar.yaml @@ -37,3 +37,4 @@ Window: Minimize Window: Згорнути вікно Pin Window: Закріпити вікно UnPin Window: Відкріпити вікно +Help: Допомога diff --git a/packages/pastebar-app-ui/src/locales/lang/uk/settings.yaml b/packages/pastebar-app-ui/src/locales/lang/uk/settings.yaml index 9ed061e5..74631986 100644 --- a/packages/pastebar-app-ui/src/locales/lang/uk/settings.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/uk/settings.yaml @@ -191,3 +191,10 @@ An error occurred during directory processing.: Сталася помилка п An error occurred during directory selection or setup.: Сталася помилка під час вибору або налаштування директорії. Disable Image Capture: Вимкнути Захоплення Зображень Disable capturing and storing images from clipboard: Вимкнути захоплення та збереження зображень з буферу обміну +Custom Database Location: Користувацьке розташування бази даних +Minimize Window: Згорнути вікно +Passcode verification is locked.: Перевірка коду доступу заблокована. +Pin Window: Закріпити вікно +Selected new data folder: Вибрана нова папка даних для зміни +UnPin Window: Відкріпити вікно +none: немає diff --git a/packages/pastebar-app-ui/src/locales/lang/zhCN/backuprestore.yaml b/packages/pastebar-app-ui/src/locales/lang/zhCN/backuprestore.yaml index 7ce7679b..b4bacf3b 100644 --- a/packages/pastebar-app-ui/src/locales/lang/zhCN/backuprestore.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/zhCN/backuprestore.yaml @@ -41,3 +41,6 @@ Loading backups...: 正在加载备份... will be permanently deleted.: 将被永久删除。 This action cannot be undone. All current data will be replaced with the backup data.: 此操作无法撤销。所有当前数据将被备份数据替换。 Restoring a backup will automatically restart the application.: 恢复备份将自动重启应用程序。 +Backup on Restore: 恢复时备份 +Restore from {{filename}}? This will replace all current data.: 从 {{filename}} 恢复?这将替换所有当前数据。 +Restoring...: 恢复中... diff --git a/packages/pastebar-app-ui/src/locales/lang/zhCN/common.yaml b/packages/pastebar-app-ui/src/locales/lang/zhCN/common.yaml index 593fef8f..30a1d613 100644 --- a/packages/pastebar-app-ui/src/locales/lang/zhCN/common.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/zhCN/common.yaml @@ -350,3 +350,5 @@ second: 秒 seconds: 秒 show less: 显示更少 www.site: www.pastebar.app +Field {{Clipboard}} has been found in the template. This allows you to copy text to the clipboard, and it will be inserted into the template: 在模板中找到字段 {{Clipboard}}。这允许您将文本复制到剪贴板,然后将其插入模板中。 +Size: 大小 diff --git a/packages/pastebar-app-ui/src/locales/lang/zhCN/settings.yaml b/packages/pastebar-app-ui/src/locales/lang/zhCN/settings.yaml index c529455e..617974c7 100644 --- a/packages/pastebar-app-ui/src/locales/lang/zhCN/settings.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/zhCN/settings.yaml @@ -207,3 +207,6 @@ An error occurred during directory processing.: 目录处理期间发生错误 An error occurred during directory selection or setup.: 目录选择或设置期间发生错误。 Disable Image Capture: 禁用图像捕获 Disable capturing and storing images from clipboard: 禁用从剪贴板捕获和存储图像 +Custom Database Location: 自定义数据库位置 +Selected new data folder: 选定的新数据文件夹用于更改 +none: 无 diff --git a/scripts/translation-audit.ts b/scripts/translation-audit.ts new file mode 100644 index 00000000..e517d31b --- /dev/null +++ b/scripts/translation-audit.ts @@ -0,0 +1,132 @@ +// translation-audit.ts +// Script to audit missing translation keys in non-English YAML files +// Usage: Run with `ts-node` or compile to JS and run with `node` + +import fs from 'fs' +import path from 'path' +import yaml from 'js-yaml' + +// Recursively scan a directory for files with given extensions +function scanFiles(dir: string, exts: string[], fileList: string[] = []): string[] { + const entries = fs.readdirSync(dir, { withFileTypes: true }) + for (const entry of entries) { + const fullPath = path.join(dir, entry.name) + if (entry.isDirectory()) { + scanFiles(fullPath, exts, fileList) + } else if (exts.some(ext => entry.name.endsWith(ext))) { + fileList.push(fullPath) + } + } + return fileList +} + +// Check if a translation key is used in any of the code files +function isKeyUsedInCode(key: string, codeFiles: string[]): boolean { + // Accept both dot and bracket notation, e.g. t('common.key') or t("common.key") + const keyPattern = new RegExp(key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')) + for (const file of codeFiles) { + const content = fs.readFileSync(file, 'utf-8') + if (keyPattern.test(content)) { + return true + } + } + return false +} + +// Helper to flatten nested objects into dot notation keys +type AnyObject = Record +function flattenKeys(obj: AnyObject, prefix = ''): string[] { + let keys: string[] = [] + for (const key in obj) { + if (!Object.prototype.hasOwnProperty.call(obj, key)) continue + const value = obj[key] + const newKey = prefix ? `${prefix}.${key}` : key + if (typeof value === 'object' && value !== null) { + keys = keys.concat(flattenKeys(value, newKey)) + } else { + keys.push(newKey) + } + } + return keys +} + +// Load supported languages from languges.ts (extract code from LANGUAGES array) +function loadSupportedLanguages(filePath: string): string[] { + const content = fs.readFileSync(filePath, 'utf-8') + // Match LANGUAGES array of objects and extract code values + const codeRegex = /code:\s*['"]([\w]+)['"]/g + const codes: string[] = [] + let match + while ((match = codeRegex.exec(content)) !== null) { + codes.push(match[1]) + } + if (codes.length === 0) throw new Error('No language codes found in LANGUAGES') + return codes +} + +// Main audit function +async function auditTranslations() { + const baseDir = path.resolve(__dirname, '../packages/pastebar-app-ui/src/locales/lang') + const enDir = path.join(baseDir, 'en') + const langFile = path.join(baseDir, '../languges.ts') + const report: string[] = [] + // Scan all code files in src (ts, tsx, js, jsx, vue, svelte) + const codeDir = path.resolve(__dirname, '../packages/pastebar-app-ui/src') + const codeFiles = scanFiles(codeDir, ['.ts', '.tsx', '.js', '.jsx', '.vue', '.svelte']) + + // 1. Load supported languages + let languages: string[] = [] + try { + languages = loadSupportedLanguages(langFile).filter(l => l !== 'en') + report.push(`Loaded supported languages: ${languages.join(', ')}`) + } catch (e) { + report.push(`Error loading supported languages: ${e}`) + return fs.writeFileSync('translation-audit-report.txt', report.join('\n')) + } + + // 2. List English YAML files + const enFiles = fs.readdirSync(enDir).filter(f => f.endsWith('.yaml')) + for (const enFile of enFiles) { + const enPath = path.join(enDir, enFile) + let enKeys: string[] = [] + let enParseError = '' + try { + const enData = yaml.load(fs.readFileSync(enPath, 'utf-8')) as AnyObject + enKeys = flattenKeys(enData) + } catch (e) { + enParseError = String(e) + report.push(`\n[${enFile}] English file parse error: ${enParseError}`) + continue + } + report.push(`\n[${enFile}]`) + for (const lang of languages) { + const langPath = path.join(baseDir, lang, enFile) + if (!fs.existsSync(langPath)) { + report.push(` [${lang}] MISSING FILE: All ${enKeys.length} keys missing.`) + continue + } + try { + const langData = yaml.load(fs.readFileSync(langPath, 'utf-8')) as AnyObject + const langKeys = flattenKeys(langData) + const missing = enKeys.filter(k => !langKeys.includes(k)) + if (missing.length > 0) { + report.push(` [${lang}] Missing keys (${missing.length}):`) + for (const key of missing) { + const used = isKeyUsedInCode(key, codeFiles) + report.push(` ${key} ${used ? '[USED in code]' : '[NOT USED in code]'}`) + } + } else { + report.push(` [${lang}] All keys present.`) + } + } catch (e) { + report.push( + ` [${lang}] PARSE ERROR: ${e} (All ${enKeys.length} keys considered missing)` + ) + } + } + } + fs.writeFileSync('translation-audit-report.txt', report.join('\n')) + console.log('Translation audit complete. See translation-audit-report.txt') +} + +auditTranslations()