fix: update package-lock and package.json for ts-node and typescript, add translation audit script and update locales for multiple languages

This commit is contained in:
Sergey Kurdin 2025-06-14 22:15:31 -04:00
parent 944a7ddd94
commit e30d36164a
31 changed files with 500 additions and 11 deletions

271
package-lock.json generated
View File

@ -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",

View File

@ -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"
}

View File

@ -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...

View File

@ -350,3 +350,4 @@ second: segundo
seconds: segundos
show less: mostrar menos
www.site: www.pastebar.app
Size: Tamaño

View File

@ -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

View File

@ -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...

View File

@ -350,3 +350,4 @@ second: seconde
seconds: secondes
show less: afficher moins
www.site: www.pastebar.app
Size: Taille

View File

@ -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}}'

View File

@ -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

View File

@ -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...

View File

@ -349,3 +349,9 @@ second: secondo
seconds: secondi
show less: mostra meno
www.site: www.pastebar.app
Add <b>{{Clipboard}}</b> field to template. This allows you to copy text to the clipboard, and it will be inserted into the template: Aggiungi il campo <b>{{Clipboard}}</b> 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 <b>{{Clipboard}}</b> 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 <b>{{Clipboard}}</b> è 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

View File

@ -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

View File

@ -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

View File

@ -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...: Восстановление...

View File

@ -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 <b>{{Clipboard}}</b> field to template. This allows you to copy text to the clipboard, and it will be inserted into the template: Добавьте поле <b>{{Clipboard}}</b> в шаблон. Это позволит копировать текст в буфер обмена, и он будет вставлен в шаблон
Clear History: Очистить историю
'Copy of ': 'Копия '
Error: Ошибка
Field <b>{{Clipboard}}</b> has been found in the template. This allows you to copy text to the clipboard, and it will be inserted into the template: Поле <b>{{Clipboard}}</b> найдено в шаблоне. Это позволяет копировать текст в буфер обмена, и он будет вставлен в шаблон
Size: Размер
Update Error: Ошибка обновления

View File

@ -84,3 +84,5 @@ WelcomeTour: Давайте начнем с изучения панели ист
WelcomeTourCanSkip: Нажмите <i>Пропустить тур</i> если вы хотите разобраться в его работе сами. Если вам понадобится помощь, вы всегда сможете найти все туры в навигационном меню <strong>Помощь > Туры по приложению</strong>.
WelcomeTourDescription: Пройдите тур по разделу, чтобы узнать о его функциях и возможностях.
You have completed the tour: Вы завершили тур
Next Tour: Следующий тур
TourCanSkip: Тур можно пропустить

View File

@ -37,3 +37,4 @@ Window:
Minimize Window: Свернуть окно
Pin Window: Закрепить окно
UnPin Window: Открепить окно
Help: Помощь

View File

@ -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: нет

View File

@ -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...

View File

@ -349,3 +349,4 @@ second: saniye
seconds: saniyeler
show less: az göster
www.site: www.pastebar.app
Size: Boyut

View File

@ -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

View File

@ -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

View File

@ -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...: Відновлення...

View File

@ -350,3 +350,9 @@ second: секунда
seconds: секунди
show less: показати менше
www.site: www.pastebar.app
Add <b>{{Clipboard}}</b> field to template. This allows you to copy text to the clipboard, and it will be inserted into the template: Додайте поле <b>{{Clipboard}}</b> до шаблону. Це дозволить копіювати текст до буфера обміну, і він буде вставлений у шаблон
Clear History: Очистити історію
'Copy of ': 'Копія '
Field <b>{{Clipboard}}</b> has been found in the template. This allows you to copy text to the clipboard, and it will be inserted into the template: Поле <b>{{Clipboard}}</b> знайдено в шаблоні. Це дозволяє копіювати текст до буфера обміну, і він буде вставлений у шаблон
Size: Розмір
Update Error: Помилка оновлення

View File

@ -84,3 +84,5 @@ WelcomeTour: Давайте почнемо з вивчення панелі іс
WelcomeTourCanSkip: Натисніть <i>Пропустити тур</i>, якщо ви хочете розібратися в його роботі самі. Якщо вам знадобиться допомога, ви завжди зможете знайти всі тури в навігаційному меню <strong>Допомога > Екскурсії додатком</strong>.
WelcomeTourDescription: Пройдіть тур по розділу, щоб дізнатися про його функції та можливості.
You have completed the tour: Ви завершили тур
Next Tour: Наступний тур
TourCanSkip: Тур можна пропустити

View File

@ -37,3 +37,4 @@ Window:
Minimize Window: Згорнути вікно
Pin Window: Закріпити вікно
UnPin Window: Відкріпити вікно
Help: Допомога

View File

@ -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: немає

View File

@ -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...: 恢复中...

View File

@ -350,3 +350,5 @@ second: 秒
seconds:
show less: 显示更少
www.site: www.pastebar.app
Field <b>{{Clipboard}}</b> has been found in the template. This allows you to copy text to the clipboard, and it will be inserted into the template: 在模板中找到字段 <b>{{Clipboard}}</b>。这允许您将文本复制到剪贴板,然后将其插入模板中。
Size: 大小

View File

@ -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:

View File

@ -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<string, any>
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()