diff --git a/.env.example b/.env.example index b1e36839..ad199da0 100644 --- a/.env.example +++ b/.env.example @@ -16,9 +16,9 @@ PUB_VERTD_URL=https://vertd.vert.sh PUB_DISABLE_ALL_EXTERNAL_REQUESTS=false # Set to true to disable blocking video conversions of an uploaded file when repeated failures -# occur within an hour. Useful for local deployments where secure context (HTTPS) may not be -# available - required for calculating file hashes of videos to block temporarily. -PUB_DISABLE_FAILURE_BLOCKS=false +# occur within an hour. Setting to false is only recommended for production deployments where +# secure context (HTTPS) is available, which is required for calculating file hashes of videos to block temporarily. +PUB_DISABLE_FAILURE_BLOCKS=true # Stripe donation settings # Please keep these values the same, they support VERT's development! diff --git a/.prettierignore b/.prettierignore index ab78a95d..fe2d62fb 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,3 +2,5 @@ package-lock.json pnpm-lock.yaml yarn.lock + +src/lib/paraglide diff --git a/.prettierrc b/.prettierrc index f371e21a..cf47e6ad 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,5 +3,5 @@ "tabWidth": 4, "singleQuote": false, "plugins": ["prettier-plugin-svelte"], - "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] + "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] } diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 116d6852..629f0948 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,5 +1,3 @@ { - "recommendations": [ - "inlang.vs-code-extension" - ] -} \ No newline at end of file + "recommendations": ["inlang.vs-code-extension"] +} diff --git a/README.md b/README.md index 5c81b73b..9c879c94 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ VERT is built in Svelte and TypeScript. - Conversion settings - User-friendly interface built with Svelte -\* Non-local video conversion is available with our official instance, but the [daemon](https://github.com/VERT-sh/vertd) is easily self-hostable to maintain privacy and fully local functionality. +\* Local video conversion in-browser is supported, but some conversion may require server-side processing. Server video conversion is available with our official instance, but the [daemon](https://github.com/VERT-sh/vertd) is easily self-hostable to maintain privacy and fully local functionality. ## Documentation diff --git a/bun.lock b/bun.lock index 5ca5720d..b690c283 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 1, "workspaces": { "": { "name": "vert", @@ -7,64 +8,73 @@ "@bjorn3/browser_wasi_shim": "^0.4.2", "@ffmpeg/ffmpeg": "^0.12.15", "@ffmpeg/util": "^0.12.2", - "@fontsource/azeret-mono": "^5.2.11", - "@fontsource/lexend": "^5.2.11", - "@fontsource/radio-canada-big": "^5.2.7", + "@fontsource/azeret-mono": "^5.3.0", + "@fontsource/lexend": "^5.3.0", + "@fontsource/radio-canada-big": "^5.3.0", "@imagemagick/magick-wasm": "^0.0.43", - "@stripe/stripe-js": "^8.5.2", + "@lucide/svelte": "^1.42.0", + "@mediabunny/ac3": "^1.55.7", + "@mediabunny/flac-encoder": "^1.55.7", + "@mediabunny/mp3-encoder": "^1.55.7", + "@stripe/stripe-js": "^9.15.0", + "@types/node": "^22.20.2", "byte-data": "^19.0.1", "client-zip": "^2.5.0", "clsx": "^2.1.1", - "fflate": "^0.8.2", - "lucide-svelte": "^0.554.0", - "music-metadata": "^11.10.3", - "overlayscrollbars": "^2.12.0", + "dicom.ts": "^1.3.0", + "fflate": "^0.8.3", + "file-type": "^22.0.2", + "mediabunny": "^1.55.7", + "music-metadata": "^11.15.0", + "overlayscrollbars": "^2.16.0", "overlayscrollbars-svelte": "^0.5.5", - "p-queue": "^9.0.1", + "p-queue": "^9.3.3", + "qoa-format": "^1.0.1", "riff-file": "^1.0.3", - "sanitize-html": "^2.17.0", - "svelte-stripe": "^1.4.0", + "sanitize-html": "^2.17.7", + "svelte-stripe": "^2.0.0", "vert-wasm": "^0.0.2", - "vite-plugin-wasm": "^3.5.0", + "vite-plugin-wasm": "^3.6.0", }, "devDependencies": { - "@inlang/paraglide-js": "^2.5.0", - "@poppanator/sveltekit-svg": "^5.0.1", + "@inlang/paraglide-js": "^2.25.0", + "@poppanator/sveltekit-svg": "^7.0.1", "@sveltejs/adapter-static": "^3.0.10", - "@sveltejs/kit": "^2.49.0", + "@sveltejs/kit": "^2.70.3", "@sveltejs/vite-plugin-svelte": "^4.0.4", "@types/eslint": "^9.6.1", - "@types/sanitize-html": "^2.16.0", - "autoprefixer": "^10.4.22", + "@types/sanitize-html": "^2.16.1", + "autoprefixer": "^10.5.5", "css-select": "5.1.0", - "eslint": "^9.39.1", + "eslint": "^9.39.5", "eslint-config-prettier": "^10.1.8", "eslint-plugin-svelte": "^2.46.1", "globals": "^15.15.0", - "prettier": "^3.6.2", - "prettier-plugin-svelte": "^3.4.0", + "prettier": "^3.9.6", + "prettier-plugin-svelte": "^3.5.2", "prettier-plugin-tailwindcss": "^0.6.14", - "sass": "^1.94.2", - "svelte": "^5.43.14", - "svelte-check": "^4.3.4", - "tailwindcss": "^3.4.18", + "sass": "^1.104.0", + "svelte": "^5.57.0", + "svelte-check": "^4.7.6", + "tailwindcss": "^3.4.19", "typescript": "^5.9.3", - "typescript-eslint": "^8.47.0", + "typescript-eslint": "^8.69.0", "vite": "^5.4.21", "vite-plugin-top-level-await": "^1.6.0", }, }, }, "trustedDependencies": [ + "esbuild", "@swc/core", "@parcel/watcher", ], "packages": { - "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + "@alloc/quick-lru": ["@alloc/quick-lru@5.3.0", "", {}, "sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA=="], "@bjorn3/browser_wasi_shim": ["@bjorn3/browser_wasi_shim@0.4.2", "", {}, "sha512-/iHkCVUG3VbcbmEHn5iIUpIrh7a7WPiwZ3sHy4HZKZzBdSadwdddYDZAII2zBvQYV0Lfi8naZngPCN7WPHI/hA=="], - "@borewit/text-codec": ["@borewit/text-codec@0.2.0", "", {}, "sha512-X999CKBxGwX8wW+4gFibsbiNdwqmdQEXmUejIWaIqdrHBgS5ARIOOeyiQbHjP9G58xVEPcuvP6VwwH3A0OFTOA=="], + "@borewit/text-codec": ["@borewit/text-codec@0.2.2", "", {}, "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ=="], "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], @@ -112,19 +122,19 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.10.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg=="], - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.7", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.3.2", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw=="], - "@eslint/js": ["@eslint/js@9.39.1", "", {}, "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw=="], + "@eslint/js": ["@eslint/js@9.39.5", "", {}, "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A=="], "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], @@ -136,15 +146,17 @@ "@ffmpeg/util": ["@ffmpeg/util@0.12.2", "", {}, "sha512-ouyoW+4JB7WxjeZ2y6KpRvB+dLp7Cp4ro8z0HIVpZVCM7AwFlHa0c4R8Y/a4M3wMqATpYKhC7lSFHQ0T11MEDw=="], - "@fontsource/azeret-mono": ["@fontsource/azeret-mono@5.2.11", "", {}, "sha512-DlufUsIj1AK6Z/26X/1bZj4SFsfuE6Cb1wYToGX3HoxTYrNzN0TUQ3Yv8bJ3kmvO3vOTCgOjFV81OJe2FERrUg=="], + "@fontsource/azeret-mono": ["@fontsource/azeret-mono@5.3.0", "", {}, "sha512-Ag/+gN67fUry7i1yLlTnk16Rr1nnTQI2YefA/G7tYcCSr/+TC/ayMrE8Km7O0OKRgI/B5Mfel46Gq9IGY50Uaw=="], - "@fontsource/lexend": ["@fontsource/lexend@5.2.11", "", {}, "sha512-bShbQr2g2sWl7GJNyIxdllZST1faVbebXN6H7AEEDCRms/g4orDLxWnmTVodOtiErdZVUJURq4jpafZ34nIkTw=="], + "@fontsource/lexend": ["@fontsource/lexend@5.3.0", "", {}, "sha512-4igbsooynC6xwfagkAW6eo9JMrw8ALFGkWn1YChYmYchufMJSPgWihD+cy5ruX5YX/gDk/gllcl1Oj7q6KUZmw=="], - "@fontsource/radio-canada-big": ["@fontsource/radio-canada-big@5.2.7", "", {}, "sha512-FbFwPzj/PsWA9s0/V5Zol4GlfECeFHYby9f6UkX5+vG7IL40SXQff0SpzlR5984gXQ77NXlOffV7gmtC9g1nvw=="], + "@fontsource/radio-canada-big": ["@fontsource/radio-canada-big@5.3.0", "", {}, "sha512-430NJzaW63rCaAbjQPRNG5z19PehjlKk+UyEzSfFjsw6HgzzkCBzlyPW9R0+gjwwY3Puo5uazRuM4P+BY9b6FA=="], - "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="], - "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + "@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="], + + "@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="], "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], @@ -152,13 +164,11 @@ "@imagemagick/magick-wasm": ["@imagemagick/magick-wasm@0.0.43", "", {}, "sha512-+Wlr3eEl4JlqLwrhAHBlf4VDzOWiFa8L2hYl7mOMXCgq896KghEnh3Go35nuZJMfmE6lX2waBZdr+u9FVluJLA=="], - "@inlang/paraglide-js": ["@inlang/paraglide-js@2.5.0", "", { "dependencies": { "@inlang/recommend-sherlock": "0.2.1", "@inlang/sdk": "2.4.9", "commander": "11.1.0", "consola": "3.4.0", "json5": "2.2.3", "unplugin": "^2.1.2", "urlpattern-polyfill": "^10.0.0" }, "bin": { "paraglide-js": "bin/run.js" } }, "sha512-FnycOM6j0GYd/n97NCDyXJiHnyPYGPgufL640eZWs+rTIRrOgDVz/o77iWRYFZK84REOcmSDi0N6PbbY8NT8+A=="], + "@inlang/paraglide-js": ["@inlang/paraglide-js@2.25.0", "", { "dependencies": { "@inlang/recommend-sherlock": "^0.2.1", "@inlang/sdk": "^3.0.1", "commander": "11.1.0", "consola": "3.4.0", "jiti": "^2.7.0", "json5": "2.2.3", "unplugin": "^2.1.2", "urlpattern-polyfill": "^10.0.0", "valibot": "^1.4.2" }, "peerDependencies": { "typescript": ">=5.6", "vite": ">=5.0.0" }, "optionalPeers": ["typescript", "vite"], "bin": { "paraglide-js": "bin/run.js" } }, "sha512-a3Gw3md1S3WyJK1rFAP/FwDCsFKnu1b98rJ3k5bUl6nc3cmbglaSYpuK9qq9aLLlUlZhuCtB/Pb1LeKDUaLycg=="], "@inlang/recommend-sherlock": ["@inlang/recommend-sherlock@0.2.1", "", { "dependencies": { "comment-json": "^4.2.3" } }, "sha512-ckv8HvHy/iTqaVAEKrr+gnl+p3XFNwe5D2+6w6wJk2ORV2XkcRkKOJ/XsTUJbPSiyi4PI+p+T3bqbmNx/rDUlg=="], - "@inlang/sdk": ["@inlang/sdk@2.4.9", "", { "dependencies": { "@lix-js/sdk": "0.4.7", "@sinclair/typebox": "^0.31.17", "kysely": "^0.27.4", "sqlite-wasm-kysely": "0.3.0", "uuid": "^10.0.0" } }, "sha512-cvz/C1rF5WBxzHbEoiBoI6Sz6q6M+TdxfWkEGBYTD77opY8i8WN01prUWXEM87GPF4SZcyIySez9U0Ccm12oFQ=="], - - "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + "@inlang/sdk": ["@inlang/sdk@3.0.3", "", { "dependencies": { "@lix-js/sdk": "0.12.3", "@sinclair/typebox": "^0.31.17", "kysely": "^0.28.12", "uuid": "^14.0.0" } }, "sha512-11aQcOw58oAcCtIOJ17XhQxfxaiGsg6XJi7coMul8wNJiW+Rzv2OfJU42NLwSuWXUNSASjegp5Z3uklTkY5GJw=="], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], @@ -166,13 +176,29 @@ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.6.0", "", {}, "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@lix-js/sdk": ["@lix-js/sdk@0.12.3", "", { "dependencies": { "fflate": "^0.8.3" }, "optionalDependencies": { "@lix-js/sdk-darwin-arm64": "0.12.3", "@lix-js/sdk-linux-arm64": "0.12.3", "@lix-js/sdk-linux-x64": "0.12.3", "@lix-js/sdk-win32-x64": "0.12.3" } }, "sha512-T2194yoZsM2S9kyRmI8UtEJL0fgXYAkeY9jZ/PVyC0K78/wmBvrqOSt9SdvgYxM5qnZ57re3NLOjVlV+X5hWxQ=="], + + "@lix-js/sdk-darwin-arm64": ["@lix-js/sdk-darwin-arm64@0.12.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-YeMJyYGk+QwvQe8O4AAcBMgfNm68IjAGDvuvZHr1U1rIb3GC2kYFStajqf4mT4BGc+cN65/P/2kkqEo+Igu/sA=="], + + "@lix-js/sdk-linux-arm64": ["@lix-js/sdk-linux-arm64@0.12.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-jtmfNg6jLW61l1QvsU3W184l3hGtYUyPGzZrQyekk0vsMF1hxsP++7ONEGNI19PE7ldwSnGCB8Q6OzRKX87abQ=="], + + "@lix-js/sdk-linux-x64": ["@lix-js/sdk-linux-x64@0.12.3", "", { "os": "linux", "cpu": "x64" }, "sha512-PiQL4h1FJXbxnZx/PgenI5grgpFtYlS/ZtPtTYh638YHVu+6J0cqGY/pLVqP8CKv1dWAKsZ2YgftLd+1j2+WKA=="], + + "@lix-js/sdk-win32-x64": ["@lix-js/sdk-win32-x64@0.12.3", "", { "os": "win32", "cpu": "x64" }, "sha512-hnxMI7kPS4ngXs0ZVnOve5CmtC4+vaNIyNDi/yWU0rSvxj7mqw/1RCegTrCB7LjxlX4DG+eg9HruXurk9NDjGg=="], + + "@lucide/svelte": ["@lucide/svelte@1.42.0", "", { "peerDependencies": { "svelte": "^5" } }, "sha512-9vOi3EdzJht5aD7F5OraoxrK2GyyL1Y+kVXEtIg4+IAdKmDBrwYK2d/x7akC89uA+cvkfjcw+IuzH0vfd/TuzA=="], + + "@mediabunny/ac3": ["@mediabunny/ac3@1.55.7", "", { "peerDependencies": { "mediabunny": "^1.0.0" } }, "sha512-HZDafm+IJxxP6Fk2yuK8a99CA3nUjHuqiOz0vKat7h/snsEqs8Y13yVmX5+4orlyA3ICbYitG3owiNxEzzoevA=="], - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.30", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q=="], + "@mediabunny/flac-encoder": ["@mediabunny/flac-encoder@1.55.7", "", { "peerDependencies": { "mediabunny": "^1.0.0" } }, "sha512-UmA2D23EuhYMG+/88tetapRAgipE50syyceGLeuLjFjGnvqCidWmyV2t7OVaj8UgzRvjmggZchg8GXYyluugZg=="], - "@lix-js/sdk": ["@lix-js/sdk@0.4.7", "", { "dependencies": { "@lix-js/server-protocol-schema": "0.1.1", "dedent": "1.5.1", "human-id": "^4.1.1", "js-sha256": "^0.11.0", "kysely": "^0.27.4", "sqlite-wasm-kysely": "0.3.0", "uuid": "^10.0.0" } }, "sha512-pRbW+joG12L0ULfMiWYosIW0plmW4AsUdiPCp+Z8rAsElJ+wJ6in58zhD3UwUcd4BNcpldEGjg6PdA7e0RgsDQ=="], + "@mediabunny/mp3-encoder": ["@mediabunny/mp3-encoder@1.55.7", "", { "peerDependencies": { "mediabunny": "^1.0.0" } }, "sha512-cJH2bSmxbaAb/ANEVCG1pajsTGLq/LH2PwNibWkvA1te+LpkDF2sBLWoqDmHBsv3DU3s+wO54jig1enKHHkVwQ=="], - "@lix-js/server-protocol-schema": ["@lix-js/server-protocol-schema@0.1.1", "", {}, "sha512-jBeALB6prAbtr5q4vTuxnRZZv1M2rKe8iNqRQhFJ4Tv7150unEa0vKyz0hs8Gl3fUGsWaNJBh3J8++fpbrpRBQ=="], + "@napi-rs/lzma-linux-x64-gnu": ["@napi-rs/lzma-linux-x64-gnu@1.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ=="], "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], @@ -180,175 +206,191 @@ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], + "@parcel/watcher": ["@parcel/watcher@2.6.0", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.4" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.6.0", "@parcel/watcher-darwin-arm64": "2.6.0", "@parcel/watcher-darwin-x64": "2.6.0", "@parcel/watcher-freebsd-x64": "2.6.0", "@parcel/watcher-linux-arm-glibc": "2.6.0", "@parcel/watcher-linux-arm-musl": "2.6.0", "@parcel/watcher-linux-arm64-glibc": "2.6.0", "@parcel/watcher-linux-arm64-musl": "2.6.0", "@parcel/watcher-linux-x64-glibc": "2.6.0", "@parcel/watcher-linux-x64-musl": "2.6.0", "@parcel/watcher-win32-arm64": "2.6.0", "@parcel/watcher-win32-x64": "2.6.0" } }, "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w=="], - "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.6.0", "", { "os": "android", "cpu": "arm64" }, "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA=="], - "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw=="], + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.6.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw=="], - "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg=="], + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.6.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw=="], - "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ=="], + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.6.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ=="], - "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA=="], + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg=="], - "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q=="], + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw=="], - "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w=="], + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g=="], - "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg=="], + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA=="], - "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A=="], + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A=="], - "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg=="], + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw=="], - "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw=="], + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.6.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ=="], - "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ=="], - - "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="], - - "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.6.0", "", { "os": "win32", "cpu": "x64" }, "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A=="], "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], - "@poppanator/sveltekit-svg": ["@poppanator/sveltekit-svg@5.0.1", "", { "dependencies": { "@rollup/pluginutils": "5.1.4", "svgo": "^3.2.0" }, "peerDependencies": { "svelte": ">=5.x", "vite": ">=5.x || >= 6.x" } }, "sha512-eCOm9Wb1eO9N5N49JNokxgbUZN79QV/fe02cRrrWbDbcAOvGoIFU0YKDZEluIaFTP2zOtOxMeCSSobM4foMShA=="], + "@poppanator/sveltekit-svg": ["@poppanator/sveltekit-svg@7.0.1", "", { "dependencies": { "@rollup/pluginutils": "5.3.0", "svgo": "^4.0.1" }, "peerDependencies": { "svelte": ">=5.x", "vite": ">= 6 || >= 7 || >= 8" } }, "sha512-dj0AQPxssbyQ/gwJccLbegyek6sA8SWcW2lNp5gI0mLQCw4giz0OE6IGmlaAP0SAitpWU3V3ssCQu9Z+8U3Rkg=="], "@rollup/plugin-virtual": ["@rollup/plugin-virtual@3.0.2", "", { "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A=="], - "@rollup/pluginutils": ["@rollup/pluginutils@5.1.4", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ=="], + "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.63.1", "", { "os": "android", "cpu": "arm" }, "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.63.1", "", { "os": "android", "cpu": "arm64" }, "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.63.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.50.0", "", { "os": "android", "cpu": "arm" }, "sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.63.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.50.0", "", { "os": "android", "cpu": "arm64" }, "sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.63.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.50.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.63.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.50.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.63.1", "", { "os": "linux", "cpu": "arm" }, "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.50.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.63.1", "", { "os": "linux", "cpu": "arm" }, "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.50.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.63.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.50.0", "", { "os": "linux", "cpu": "arm" }, "sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.63.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.50.0", "", { "os": "linux", "cpu": "arm" }, "sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg=="], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.50.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g=="], + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.50.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.63.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA=="], - "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.50.0", "", { "os": "linux", "cpu": "none" }, "sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ=="], + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.63.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA=="], - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.50.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.50.0", "", { "os": "linux", "cpu": "none" }, "sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.50.0", "", { "os": "linux", "cpu": "none" }, "sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.63.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.50.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.63.1", "", { "os": "linux", "cpu": "x64" }, "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.50.0", "", { "os": "linux", "cpu": "x64" }, "sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.63.1", "", { "os": "linux", "cpu": "x64" }, "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.50.0", "", { "os": "linux", "cpu": "x64" }, "sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw=="], + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.63.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA=="], - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.50.0", "", { "os": "none", "cpu": "arm64" }, "sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q=="], + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.63.1", "", { "os": "none", "cpu": "arm64" }, "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.50.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.63.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.50.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.63.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.50.0", "", { "os": "win32", "cpu": "x64" }, "sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg=="], + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.63.1", "", { "os": "win32", "cpu": "x64" }, "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg=="], - "@sinclair/typebox": ["@sinclair/typebox@0.31.28", "", {}, "sha512-/s55Jujywdw/Jpan+vsy6JZs1z2ZTGxTmbZTPiuSL2wz9mfzA2gN1zzaqmvfi4pq+uOt7Du85fkiwv5ymW84aQ=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.63.1", "", { "os": "win32", "cpu": "x64" }, "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w=="], - "@sqlite.org/sqlite-wasm": ["@sqlite.org/sqlite-wasm@3.48.0-build4", "", { "bin": { "sqlite-wasm": "bin/index.js" } }, "sha512-hI6twvUkzOmyGZhQMza1gpfqErZxXRw6JEsiVjUbo7tFanVD+8Oil0Ih3l2nGzHdxPI41zFmfUQG7GHqhciKZQ=="], + "@sinclair/typebox": ["@sinclair/typebox@0.31.30", "", {}, "sha512-MGsM7bVmHg3sUKCphlu3SGQ+T+5JTbygZWYArfKQCW5anJeACHeqLhcnf+R7XlCWZ+QR3C8JTBx3kCKJTN69ow=="], - "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - "@stripe/stripe-js": ["@stripe/stripe-js@8.5.2", "", {}, "sha512-Y4FZjOCYS5kf9dhSEQNUXo4oYc8sgwq2LK9hValXaykl/VfTkiwFb2WbyqnI3EFjNwoxm0KSmyMhz3Wji4My3Q=="], + "@stripe/stripe-js": ["@stripe/stripe-js@9.15.0", "", {}, "sha512-0ySfsYH9XzfEspNS6MXMU2cjGsxNXWDQT9JxS43nOAatj6jDEP0fLBm2BanfblzU/GL/kDjFFcKmGInHmrASeg=="], - "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.5", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ=="], + "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.13", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ=="], "@sveltejs/adapter-static": ["@sveltejs/adapter-static@3.0.10", "", { "peerDependencies": { "@sveltejs/kit": "^2.0.0" } }, "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew=="], - "@sveltejs/kit": ["@sveltejs/kit@2.49.0", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.3.2", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["@opentelemetry/api"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-oH8tXw7EZnie8FdOWYrF7Yn4IKrqTFHhXvl8YxXxbKwTMcD/5NNCryUSEXRk2ZR4ojnub0P8rNrsVGHXWqIDtA=="], + "@sveltejs/kit": ["@sveltejs/kit@2.70.3", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.9", "@types/cookie": "^0.6.0", "acorn": "^8.16.0", "cookie": "^0.6.0", "devalue": "^5.8.1", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3 || ^6.0.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" }, "optionalPeers": ["@opentelemetry/api", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-UDvEYuZqAMbfB/oXIoqKvbKcb7YczK5zYrzmsGV1zRJk03jntwp8dXiYoIJotxAndsKvcPFtx9H1GRSKFdSHgg=="], + + "@sveltejs/load-config": ["@sveltejs/load-config@0.2.3", "", {}, "sha512-VT3qmUb8pRV2QrZjd8iAmtg8lf4W0TIjZbvXtz5MKei/q96teWZgGJyyidJzOjzZzvdq616eSRVeMYIQChUTAQ=="], "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@4.0.4", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^3.0.0-next.0||^3.0.0", "debug": "^4.3.7", "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.12", "vitefu": "^1.0.3" }, "peerDependencies": { "svelte": "^5.0.0-next.96 || ^5.0.0", "vite": "^5.0.0" } }, "sha512-0ba1RQ/PHen5FGpdSrW7Y3fAMQjrXantECALeOiOdBdzR5+5vPP6HVZRLmZaQL+W8m++o+haIAKq5qT+MiZ7VA=="], "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@3.0.1", "", { "dependencies": { "debug": "^4.3.7" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^4.0.0-next.0||^4.0.0", "svelte": "^5.0.0-next.96 || ^5.0.0", "vite": "^5.0.0" } }, "sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ=="], - "@swc/core": ["@swc/core@1.13.5", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.24" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.13.5", "@swc/core-darwin-x64": "1.13.5", "@swc/core-linux-arm-gnueabihf": "1.13.5", "@swc/core-linux-arm64-gnu": "1.13.5", "@swc/core-linux-arm64-musl": "1.13.5", "@swc/core-linux-x64-gnu": "1.13.5", "@swc/core-linux-x64-musl": "1.13.5", "@swc/core-win32-arm64-msvc": "1.13.5", "@swc/core-win32-ia32-msvc": "1.13.5", "@swc/core-win32-x64-msvc": "1.13.5" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ=="], + "@swc/core": ["@swc/core@1.16.2", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.28" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.16.2", "@swc/core-darwin-x64": "1.16.2", "@swc/core-linux-arm-gnueabihf": "1.16.2", "@swc/core-linux-arm64-gnu": "1.16.2", "@swc/core-linux-arm64-musl": "1.16.2", "@swc/core-linux-ppc64-gnu": "1.16.2", "@swc/core-linux-s390x-gnu": "1.16.2", "@swc/core-linux-x64-gnu": "1.16.2", "@swc/core-linux-x64-musl": "1.16.2", "@swc/core-win32-arm64-msvc": "1.16.2", "@swc/core-win32-ia32-msvc": "1.16.2", "@swc/core-win32-x64-msvc": "1.16.2" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-95I4kiSMeveI/Mhi+tE4fiWcWLUMfzfKrk0jtr8LRMqHgOgq+xHS+zExkDqoO4b5OeeuXHMWVdD5MeP3X6sULw=="], + + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.16.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-i/j0HNbnn79qnTVPicvay92Nark8fW8NQqn1e2mGERjUXNpBV0+SwQxlRpk2zBhn6laJ8PDI6Kn1nHZhnz3LCA=="], - "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.13.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ=="], + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.16.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-HrwqHyEyHVXO3qTk8EkNK7/b6sOZSEoNh+pot6RdE5x0LbNqfo8LtJUvi3UTXr+5ja/o5HbJdW80eCXo+NjbiA=="], - "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.13.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng=="], + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.16.2", "", { "os": "linux", "cpu": "arm" }, "sha512-MdXi83Z/gGp1LIrg+h7HKxiul/z/Bty/ZJSvYAFqDl9zteC1XLSAZdScquKtXPp50rdyXqritTDCqQBhwVfZKA=="], - "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.13.5", "", { "os": "linux", "cpu": "arm" }, "sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ=="], + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.16.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-/jcTmK6Ktz3owM3YtiKvjofV6p3VpHnYzTIrOGwDIOsDigRAAVuZ8east33wYO/7UTdKYFlyHNnJNT0WJqOA3Q=="], - "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.13.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw=="], + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.16.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-4gFarKaFnlJTSlJYKmMhV4u+3YE4uYfiydpBoYjmgQhCf9lAieOq+WilZaK9vVSHeqLuQpTEiGULZqAdsRX5Dw=="], - "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.13.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ=="], + "@swc/core-linux-ppc64-gnu": ["@swc/core-linux-ppc64-gnu@1.16.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-syqSLGd6KlZ1PciNzs6bIUlhOuFztZufebOHaERjc4N4SqNZxyqYd4I+jj/EfOYnpe0kNjccn9HJLN1p5dz3+w=="], - "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.13.5", "", { "os": "linux", "cpu": "x64" }, "sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA=="], + "@swc/core-linux-s390x-gnu": ["@swc/core-linux-s390x-gnu@1.16.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-ZBBLK+ewGyXLzWeMS7wbKtWBdnif6etn7xvPY/iOfbdsjX/+bgkp1pQt2lWF2wlu2hXYZuhJ/tHZE/QR8/apzg=="], - "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.13.5", "", { "os": "linux", "cpu": "x64" }, "sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q=="], + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.16.2", "", { "os": "linux", "cpu": "x64" }, "sha512-LyHJgxCA4Tje0ysBMbEb0tt/ie8kgUKoFE3JAKFhpevmTmhYEoC0H9s47WuDsqiFckF1ITUguZIXJG6K5e0dvg=="], - "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.13.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw=="], + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.16.2", "", { "os": "linux", "cpu": "x64" }, "sha512-PghXJlVM1cgtLfNUR1vxFo1z+PDRAe8cWAJlZZ7spmeiN7BospGXg/MHUg7oNSgwSX7Zo//YKv9P5yD9apsFJQ=="], - "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.13.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw=="], + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.16.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-StTOSefYBxemvNYYUI3UmO1a8y+hSPjjfHogC2TEHL+Z1PlEBim/XtLas5rS04jAzT9RrNmbtX911SZ42H9jSQ=="], - "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.13.5", "", { "os": "win32", "cpu": "x64" }, "sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q=="], + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.16.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-fycER209DYIzsibpTMC+chND05OfOjgztWL9U8OE6/uUlsOUZH3eh98isBLEnOymYUhlJLEt5++W1+KL/FOh5Q=="], + + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.16.2", "", { "os": "win32", "cpu": "x64" }, "sha512-cSd1z6ivSrJPVr+moVwOHWjeKy6TpO4/Shwcv5KCrKYXCccxwh4pRy1C3fDioNx2PF1jPZWHKZjtXt+Be9VbaQ=="], "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], - "@swc/types": ["@swc/types@0.1.24", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-tjTMh3V4vAORHtdTprLlfoMptu1WfTZG9Rsca6yOKyNYsRr+MUXutKmliB17orgSZk5DpnDxs8GUdd/qwYxOng=="], + "@swc/types": ["@swc/types@0.1.28", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw=="], + + "@swc/wasm": ["@swc/wasm@1.16.2", "", {}, "sha512-X7Y8nRO6YrDx/2Q3ERTVpRDtxuuw+zlzMxa7VYIHt8P1S0hBT9CYit5b85BwdwGoLtOe3zpLvRSFVyXSCdW9rQ=="], - "@swc/wasm": ["@swc/wasm@1.13.5", "", {}, "sha512-ZBZcxieydxNwgEU9eFAXGMaDb1Xoh+ZkZcUQ27LNJzc2lPSByoL6CSVqnYiaVo+n9JgqbYyHlMq+i7z0wRNTfA=="], + "@thi.ng/bitstream": ["@thi.ng/bitstream@2.4.55", "", { "dependencies": { "@thi.ng/errors": "^2.6.17" } }, "sha512-9Oj7k8SrPZ/T+ke7nivbNnoTm+fnICzz8jbgN/+JdpeohfplVW64rSiTqgbhzq8BakFa3yxeFjxeFlFZ+2gFYg=="], + + "@thi.ng/errors": ["@thi.ng/errors@2.6.17", "", {}, "sha512-momw7wo3EXes1wa6Smckr+l4BaJi/h+E67R3furYOBjQpciie1OgoTa43PXPb1POsuWxynkEF8OCnQgreE8twg=="], "@tokenizer/inflate": ["@tokenizer/inflate@0.4.1", "", { "dependencies": { "debug": "^4.4.3", "token-types": "^6.1.1" } }, "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA=="], "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], - "@trysound/sax": ["@trysound/sax@0.2.0", "", {}, "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="], - "@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="], + "@types/dom-mediacapture-transform": ["@types/dom-mediacapture-transform@0.1.12", "", { "dependencies": { "@types/dom-webcodecs": "*" } }, "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw=="], + + "@types/dom-webcodecs": ["@types/dom-webcodecs@0.1.13", "", {}, "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ=="], + "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="], - "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/sanitize-html": ["@types/sanitize-html@2.16.0", "", { "dependencies": { "htmlparser2": "^8.0.0" } }, "sha512-l6rX1MUXje5ztPT0cAFtUayXF06DqPhRyfVXareEN5gGCFaP/iwsxIyKODr9XDhfxPpN6vXUFNfo5kZMXCxBtw=="], + "@types/node": ["@types/node@22.20.2", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-xlvWf4Vs9n1PEVYwP1n4vvG07M6y8WgvJ2t0vbrWTmijsIHp1cS+uJ2kMIRdY3nHZK0nCYKrPeD171+SzF4/zw=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.47.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.47.0", "@typescript-eslint/type-utils": "8.47.0", "@typescript-eslint/utils": "8.47.0", "@typescript-eslint/visitor-keys": "8.47.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.47.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA=="], + "@types/sanitize-html": ["@types/sanitize-html@2.16.1", "", { "dependencies": { "htmlparser2": "^10.1" } }, "sha512-n9wjs8bCOTyN/ynwD8s/nTcTreIHB1vf31vhLMGqUPNHaweKC4/fAl4Dj+hUlCTKYgm4P3k83fmiFfzkZ6sgMA=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.47.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.47.0", "@typescript-eslint/types": "8.47.0", "@typescript-eslint/typescript-estree": "8.47.0", "@typescript-eslint/visitor-keys": "8.47.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.69.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.69.0", "@typescript-eslint/type-utils": "8.69.0", "@typescript-eslint/utils": "8.69.0", "@typescript-eslint/visitor-keys": "8.69.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.69.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.47.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.47.0", "@typescript-eslint/types": "^8.47.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.69.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.69.0", "@typescript-eslint/types": "8.69.0", "@typescript-eslint/typescript-estree": "8.69.0", "@typescript-eslint/visitor-keys": "8.69.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.47.0", "", { "dependencies": { "@typescript-eslint/types": "8.47.0", "@typescript-eslint/visitor-keys": "8.47.0" } }, "sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.69.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.69.0", "@typescript-eslint/types": "^8.69.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.47.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.69.0", "", { "dependencies": { "@typescript-eslint/types": "8.69.0", "@typescript-eslint/visitor-keys": "8.69.0" } }, "sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.47.0", "", { "dependencies": { "@typescript-eslint/types": "8.47.0", "@typescript-eslint/typescript-estree": "8.47.0", "@typescript-eslint/utils": "8.47.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.69.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.47.0", "", {}, "sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.69.0", "", { "dependencies": { "@typescript-eslint/types": "8.69.0", "@typescript-eslint/typescript-estree": "8.69.0", "@typescript-eslint/utils": "8.69.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.47.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.47.0", "@typescript-eslint/tsconfig-utils": "8.47.0", "@typescript-eslint/types": "8.47.0", "@typescript-eslint/visitor-keys": "8.47.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.69.0", "", {}, "sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.47.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.47.0", "@typescript-eslint/types": "8.47.0", "@typescript-eslint/typescript-estree": "8.47.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.69.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.69.0", "@typescript-eslint/tsconfig-utils": "8.69.0", "@typescript-eslint/types": "8.69.0", "@typescript-eslint/visitor-keys": "8.69.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.47.0", "", { "dependencies": { "@typescript-eslint/types": "8.47.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.69.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.69.0", "@typescript-eslint/types": "8.69.0", "@typescript-eslint/typescript-estree": "8.69.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw=="], - "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.69.0", "", { "dependencies": { "@typescript-eslint/types": "8.69.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w=="], - "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + "@wearemothership/dicom-character-set": ["@wearemothership/dicom-character-set@1.0.4-opt.1", "", {}, "sha512-stqhnpawYHY2UZKj4RHTF71ab3q3z8S1SO9ToQKjsHQwowUdFVo6YFea93psFux3yqNbRlQjwoCdPjHcD0YQzw=="], - "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], - "ansi-regex": ["ansi-regex@6.2.0", "", {}, "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg=="], + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -360,27 +402,27 @@ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + "aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="], "array-timsort": ["array-timsort@1.0.3", "", {}, "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ=="], - "autoprefixer": ["autoprefixer@10.4.22", "", { "dependencies": { "browserslist": "^4.27.0", "caniuse-lite": "^1.0.30001754", "fraction.js": "^5.3.4", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg=="], + "autoprefixer": ["autoprefixer@10.5.5", "", { "dependencies": { "browserslist": "^4.28.9", "caniuse-lite": "^1.0.30001810", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-uiRYvQYe/nNSzBJ7OUnd2/TZVsAdob3blml44teEpee9Cc1f4rGZFewO+JT3Wo8mgFOSzNqes4FHZn/Qz8WOuw=="], "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.8.29", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.21", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ=="], "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], - "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "browserslist": ["browserslist@4.28.0", "", { "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", "electron-to-chromium": "^1.5.249", "node-releases": "^2.0.27", "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" } }, "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ=="], + "browserslist": ["browserslist@4.28.9", "", { "dependencies": { "baseline-browser-mapping": "^2.11.20", "caniuse-lite": "^1.0.30001810", "electron-to-chromium": "^1.5.420", "node-releases": "^2.0.54", "update-browserslist-db": "^1.3.2" }, "bin": { "browserslist": "cli.js" } }, "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg=="], "byte-data": ["byte-data@19.0.1", "", {}, "sha512-xRvkTvO28wr0+0rErSETHD8Cw+P444Az3/jkTezaMw5R+TTW8ZNXuvPZf9/ZhnSRRvlMnJsVhc+ecYvOMy/MQQ=="], @@ -388,11 +430,13 @@ "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], - "caniuse-lite": ["caniuse-lite@1.0.30001756", "", {}, "sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A=="], + "caniuse-lite": ["caniuse-lite@1.0.30001810", "", {}, "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + "charenc": ["charenc@0.0.2", "", {}, "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="], + + "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], "client-zip": ["client-zip@2.5.0", "", {}, "sha512-ydG4nDZesbFurnNq0VVCp/yyomIBh+X/1fZPI/P24zbnG4dtC4tQAfI5uQsomigsUMeiRO2wiTPizLWQh+IAyQ=="], @@ -404,23 +448,23 @@ "commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], - "comment-json": ["comment-json@4.2.5", "", { "dependencies": { "array-timsort": "^1.0.3", "core-util-is": "^1.0.3", "esprima": "^4.0.1", "has-own-prop": "^2.0.0", "repeat-string": "^1.6.1" } }, "sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw=="], + "comment-json": ["comment-json@4.6.2", "", { "dependencies": { "array-timsort": "^1.0.3", "esprima": "^4.0.1" } }, "sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w=="], "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], "consola": ["consola@3.4.0", "", {}, "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA=="], - "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + "content-type": ["content-type@2.1.0", "", {}, "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag=="], "cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="], - "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + "crypt": ["crypt@0.0.2", "", {}, "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="], + "css-select": ["css-select@5.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg=="], - "css-tree": ["css-tree@2.3.1", "", { "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" } }, "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw=="], + "css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], @@ -428,17 +472,19 @@ "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], - "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + "dayjs": ["dayjs@1.11.23", "", {}, "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ=="], - "dedent": ["dedent@1.5.1", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg=="], + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], - "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], - "devalue": ["devalue@5.3.2", "", {}, "sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw=="], + "devalue": ["devalue@5.9.2", "", {}, "sha512-po4PAY5c53tw5XMocSnf8A/5OHhbbUftpr93aEN6BBoAdntUmK7vu7wOATqvt7cXO7m1Cl4gMVn6p7n6n4mj0w=="], + + "dicom.ts": ["dicom.ts@1.3.0", "", { "dependencies": { "@wearemothership/dicom-character-set": "^1.0.4-opt.1", "jpeg-lossless-decoder-js": "^2.1.2", "pako": "^2.1.0", "sha1": "^1.1.1", "twgl.js": "^5.5.4" } }, "sha512-BmUlKUQlk1nWg5viBOl2PDBSdr5qh/2JBov3+akKhlwSzLZ/Xz8G9SLxUG3TJHVYGWn7vJVNou7EIY+S1vRDmQ=="], "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], @@ -452,15 +498,13 @@ "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], - "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], - - "electron-to-chromium": ["electron-to-chromium@1.5.256", "", {}, "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ=="], - - "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "electron-to-chromium": ["electron-to-chromium@1.5.422", "", {}, "sha512-UvA/32XqrLDdZSn7Jllo1AYNcWji/G0d5M0GTViE7KoGBiMunw3a34Sb2KO4ZZyrSEhqsxFoVhWWJshdyfKqJA=="], "endianness": ["endianness@8.0.2", "", {}, "sha512-IU+77+jJ7lpw2qZ3NUuqBZFy3GuioNgXUdsL1L9tooDNTaw0TgOnwNuc+8Ns+haDaTifK97QLzmOANJtI/rGvw=="], - "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], "esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], @@ -468,7 +512,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.1", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g=="], + "eslint": ["eslint@9.39.5", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.6", "@eslint/js": "9.39.5", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw=="], "eslint-compat-utils": ["eslint-compat-utils@0.5.1", "", { "dependencies": { "semver": "^7.5.4" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q=="], @@ -486,9 +530,9 @@ "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], - "esrap": ["esrap@2.1.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA=="], + "esrap": ["esrap@2.3.7", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, "peerDependencies": { "@typescript-eslint/types": "^8.2.0" }, "optionalPeers": ["@typescript-eslint/types"] }, "sha512-n2nf7fZR3c9yXf0BPEuHuXqT+KW0SJVj4cN5FMEkpCZ3scLjOQWpiccyCxVzCC2q1wubTghuEGzngJY/7Ah0Ow=="], "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], @@ -498,7 +542,7 @@ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], @@ -508,15 +552,15 @@ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], - "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + "fastq": ["fastq@1.20.3", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw=="], "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], + "fflate": ["fflate@0.8.3", "", {}, "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA=="], "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], - "file-type": ["file-type@21.1.1", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.4.0" } }, "sha512-ifJXo8zUqbQ/bLbl9sFoqHNTNWbnPY1COImFfM6CCy7z+E+jC1eY9YfOKkx0fckIg+VljAy2/87T61fp0+eEkg=="], + "file-type": ["file-type@22.0.2", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.5", "token-types": "^6.1.2", "uint8array-extras": "^1.5.0" } }, "sha512-0H8TsCUGBLx+V5adH3EY52hTAcyLKbV1D4gq5cIOJ6DnQAHeV9Z2Hhuc5CoBX4YmvB2oL+JIC84z0qO7JsCoNw=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], @@ -524,9 +568,7 @@ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], - "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], - - "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + "flatted": ["flatted@3.4.4", "", {}, "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q=="], "fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="], @@ -534,23 +576,15 @@ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], - "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], - "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-own-prop": ["has-own-prop@2.0.0", "", {}, "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ=="], - - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], - - "htmlparser2": ["htmlparser2@8.0.2", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA=="], + "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], - "human-id": ["human-id@4.1.1", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg=="], + "htmlparser2": ["htmlparser2@10.1.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "entities": "^7.0.1" } }, "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ=="], "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], @@ -558,7 +592,7 @@ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - "immutable": ["immutable@5.1.3", "", {}, "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg=="], + "immutable": ["immutable@5.1.9", "", {}, "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg=="], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], @@ -566,29 +600,25 @@ "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], - "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + "is-core-module": ["is-core-module@2.16.2", "", { "dependencies": { "hasown": "^2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], - "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - "is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="], + "is-plain-object": ["is-plain-object@5.1.0", "", {}, "sha512-bUi/yjmtKYcRVUtWRGr0UA6xEFh2I6zWUwMrUXB3s7bmYCaZ8a+0ZsTRkrawh/mzlSD1Y0Ph8bp/U+TvBpWDNw=="], "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], - - "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], - "js-sha256": ["js-sha256@0.11.1", "", {}, "sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg=="], + "jpeg-lossless-decoder-js": ["jpeg-lossless-decoder-js@2.1.2", "", { "optionalDependencies": { "@rollup/rollup-linux-x64-gnu": "4.13.0" } }, "sha512-fYf/plymnuKwVw+s8gJ8O/BPw8y8OLaN11MBvEcT05kuy3m45o7BEC4J0JbxMNUYyO+MdK/I/jq0q1gkVYZm2Q=="], - "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + "js-yaml": ["js-yaml@4.3.2", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA=="], "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], @@ -604,7 +634,9 @@ "known-css-properties": ["known-css-properties@0.35.0", "", {}, "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A=="], - "kysely": ["kysely@0.27.6", "", {}, "sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ=="], + "kysely": ["kysely@0.28.17", "", {}, "sha512-nbD8lB9EB3wNdMhOCdx5Li8DxnLbvKByylRLcJ1h+4SkrowVeECAyZlyiKMThF7xFdRz0jSQ2MoJr+wXux2y0Q=="], + + "launder": ["launder@1.7.1", "", { "dependencies": { "dayjs": "^1.11.7" } }, "sha512-mU6WRz5EusL9ZZuiZ5SO4Y6C0P9PAUR9iwdb6bzj4KDihm28DiHFw+/yk9DBH4f+Pv1wuzQ4e2jV3oQ7mkIqvw=="], "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], @@ -618,23 +650,19 @@ "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], - "lucide-svelte": ["lucide-svelte@0.554.0", "", { "peerDependencies": { "svelte": "^3 || ^4 || ^5.0.0-next.42" } }, "sha512-LLcpHi3SuKup0nVD1kKqo8FDZnjXJp48uST26GGh8Jcyrxqk5gmgpnvKmHsHox674UL3cPS1DCul/wFL7ybGqg=="], + "mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], - "magic-string": ["magic-string@0.30.18", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ=="], + "media-typer": ["media-typer@2.0.0", "", {}, "sha512-kOy3OxT2HH39N70UnKgu4NWDZjLOz8W/mfyvniHjRH/DrL3f2pOfvWQ4p60offbbtDAnXWp0v9LfMIqMec269Q=="], - "mdn-data": ["mdn-data@2.0.30", "", {}, "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="], - - "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + "mediabunny": ["mediabunny@1.55.7", "", { "dependencies": { "@types/dom-mediacapture-transform": "^0.1.11", "@types/dom-webcodecs": "0.1.13" } }, "sha512-Sb/vI8frRiDPbPUwl3hz0n69NSe9yt4Nydcv5yxi8Rdgk0BgnujEGjZqE+uCTehFbafcqIu6gDAok8ln98dcqg=="], "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], - "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], @@ -642,22 +670,20 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "music-metadata": ["music-metadata@11.10.3", "", { "dependencies": { "@borewit/text-codec": "^0.2.0", "@tokenizer/token": "^0.3.0", "content-type": "^1.0.5", "debug": "^4.4.3", "file-type": "^21.1.1", "media-typer": "^1.1.0", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.5.0" } }, "sha512-j0g/x4cNNZW6I5gdcPAY+GFkJY9WHTpkFDMBJKQLxJQyvSfQbXm57fTE3haGFFuOzCgtsTd4Plwc49Sn9RacDQ=="], + "music-metadata": ["music-metadata@11.15.0", "", { "dependencies": { "@borewit/text-codec": "^0.2.2", "@tokenizer/token": "^0.3.0", "content-type": "^2.1.0", "debug": "^4.4.3", "file-type": "^21.3.4", "media-typer": "^2.0.0", "strtok3": "^10.3.5", "token-types": "^6.1.2", "uint8array-extras": "^1.5.0", "win-guid": "^0.2.1" } }, "sha512-TN+kO1/oOc8UzDW5N3vSDncBcv9WyNnQQe/NFMcFWq6G1+zVeYUkGvkYpQ/S8wb8vKtUD7i78dIaY0cv+cmPRA=="], "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "nanoid": ["nanoid@3.3.18", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], - "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], + "node-releases": ["node-releases@2.0.54", "", {}, "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ=="], "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], - "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="], - "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], @@ -666,7 +692,7 @@ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - "overlayscrollbars": ["overlayscrollbars@2.12.0", "", {}, "sha512-mWJ5MOkcZ/ljHwfLw8+bN0V9ziGCoNoqULcp994j5DTGNQvnkWKWkA7rnO29Kyew5AoHxUnJ4Ndqfcl0HSQjXg=="], + "overlayscrollbars": ["overlayscrollbars@2.16.0", "", {}, "sha512-N03oje/q7j93D0aLZtoCdsDSYLmhheSsv8H7oSLE7HhdV9P/bmCURtLV/KbPye7P/bpfyt/obSfDpGUYoJ0OWg=="], "overlayscrollbars-svelte": ["overlayscrollbars-svelte@0.5.5", "", { "peerDependencies": { "overlayscrollbars": "^2.0.0", "svelte": "^5.0.0" } }, "sha512-+dRW3YZSvFbKi5vDCpnUOHuoPLLSdu0BUVVMYZdmfVghu7XkafDRebG2y91/ImPqj6YDAUsz1rcWVYhCJSS/pQ=="], @@ -674,11 +700,11 @@ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], - "p-queue": ["p-queue@9.0.1", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^7.0.0" } }, "sha512-RhBdVhSwJb7Ocn3e8ULk4NMwBEuOxe+1zcgphUy9c2e5aR/xbEsdVXxHJ3lynw6Qiqu7OINEyHlZkiblEpaq7w=="], + "p-queue": ["p-queue@9.3.3", "", { "dependencies": { "eventemitter3": "^5.0.4", "p-timeout": "^7.0.0" } }, "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA=="], "p-timeout": ["p-timeout@7.0.1", "", {}, "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg=="], - "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + "pako": ["pako@2.2.0", "", {}, "sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w=="], "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], @@ -690,21 +716,17 @@ "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - - "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], - "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + "postcss": ["postcss@8.5.28", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A=="], "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="], - "postcss-js": ["postcss-js@4.0.1", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw=="], + "postcss-js": ["postcss-js@4.1.0", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw=="], "postcss-load-config": ["postcss-load-config@3.1.4", "", { "dependencies": { "lilconfig": "^2.0.5", "yaml": "^1.10.2" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg=="], @@ -714,29 +736,29 @@ "postcss-scss": ["postcss-scss@4.0.9", "", { "peerDependencies": { "postcss": "^8.4.29" } }, "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A=="], - "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + "postcss-selector-parser": ["postcss-selector-parser@6.1.4", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ=="], "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], + "prettier": ["prettier@3.9.6", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g=="], - "prettier-plugin-svelte": ["prettier-plugin-svelte@3.4.0", "", { "peerDependencies": { "prettier": "^3.0.0", "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" } }, "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ=="], + "prettier-plugin-svelte": ["prettier-plugin-svelte@3.5.2", "", { "peerDependencies": { "prettier": "^3.0.0", "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" } }, "sha512-ItFouLvzSFE3ulNl4DKoWM3BGcbDCNVpIyy/Y3F2gC3aNiGLxtFUdffVqO5Z5hhYG+DFT5KULWaxmeFFpdbvaQ=="], "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.6.14", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-hermes": "*", "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-hermes", "@prettier/plugin-oxc", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order", "prettier-plugin-svelte"] }, "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg=="], "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + "qoa-format": ["qoa-format@1.0.1", "", { "dependencies": { "@thi.ng/bitstream": "^2.2.12" } }, "sha512-dMB0Z6XQjdpz/Cw4Rf6RiBpQvUSPCfYlQMWvmuWlWkAT7nDQD29cVZ1SwDUB6DYJSitHENwbt90lqfI+7bvMcw=="], - "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + "read-cache": ["read-cache@1.0.2", "", {}, "sha512-/peqiBB/n07gQGLsWaHho3WfvUyRscw0gYTsEFMhrIe/nWLkYaf5SbKYjGYqtRV3aPwykJgF2VEMo1ac4bnsGA=="], - "repeat-string": ["repeat-string@1.6.1", "", {}, "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="], + "readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="], - "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + "resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], @@ -744,87 +766,85 @@ "riff-file": ["riff-file@1.0.3", "", { "dependencies": { "byte-data": "^18.0.3" } }, "sha512-Vv8wwGr0BCks7VMI3Lv0houZee4DaHFjjTT0LMhMJKio2YmLncLeIVpK63ydSverngNk8XQPU3fbeP3bWgSIig=="], - "rollup": ["rollup@4.50.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.50.0", "@rollup/rollup-android-arm64": "4.50.0", "@rollup/rollup-darwin-arm64": "4.50.0", "@rollup/rollup-darwin-x64": "4.50.0", "@rollup/rollup-freebsd-arm64": "4.50.0", "@rollup/rollup-freebsd-x64": "4.50.0", "@rollup/rollup-linux-arm-gnueabihf": "4.50.0", "@rollup/rollup-linux-arm-musleabihf": "4.50.0", "@rollup/rollup-linux-arm64-gnu": "4.50.0", "@rollup/rollup-linux-arm64-musl": "4.50.0", "@rollup/rollup-linux-loongarch64-gnu": "4.50.0", "@rollup/rollup-linux-ppc64-gnu": "4.50.0", "@rollup/rollup-linux-riscv64-gnu": "4.50.0", "@rollup/rollup-linux-riscv64-musl": "4.50.0", "@rollup/rollup-linux-s390x-gnu": "4.50.0", "@rollup/rollup-linux-x64-gnu": "4.50.0", "@rollup/rollup-linux-x64-musl": "4.50.0", "@rollup/rollup-openharmony-arm64": "4.50.0", "@rollup/rollup-win32-arm64-msvc": "4.50.0", "@rollup/rollup-win32-ia32-msvc": "4.50.0", "@rollup/rollup-win32-x64-msvc": "4.50.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw=="], + "rollup": ["rollup@4.63.1", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", "@rollup/rollup-android-arm-eabi": "4.63.1", "@rollup/rollup-android-arm64": "4.63.1", "@rollup/rollup-darwin-arm64": "4.63.1", "@rollup/rollup-darwin-x64": "4.63.1", "@rollup/rollup-freebsd-arm64": "4.63.1", "@rollup/rollup-freebsd-x64": "4.63.1", "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", "@rollup/rollup-linux-arm-musleabihf": "4.63.1", "@rollup/rollup-linux-arm64-gnu": "4.63.1", "@rollup/rollup-linux-arm64-musl": "4.63.1", "@rollup/rollup-linux-loong64-gnu": "4.63.1", "@rollup/rollup-linux-loong64-musl": "4.63.1", "@rollup/rollup-linux-ppc64-gnu": "4.63.1", "@rollup/rollup-linux-ppc64-musl": "4.63.1", "@rollup/rollup-linux-riscv64-gnu": "4.63.1", "@rollup/rollup-linux-riscv64-musl": "4.63.1", "@rollup/rollup-linux-s390x-gnu": "4.63.1", "@rollup/rollup-linux-x64-gnu": "4.63.1", "@rollup/rollup-linux-x64-musl": "4.63.1", "@rollup/rollup-openbsd-x64": "4.63.1", "@rollup/rollup-openharmony-arm64": "4.63.1", "@rollup/rollup-win32-arm64-msvc": "4.63.1", "@rollup/rollup-win32-ia32-msvc": "4.63.1", "@rollup/rollup-win32-x64-gnu": "4.63.1", "@rollup/rollup-win32-x64-msvc": "4.63.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg=="], "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], - "sanitize-html": ["sanitize-html@2.17.0", "", { "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", "htmlparser2": "^8.0.0", "is-plain-object": "^5.0.0", "parse-srcset": "^1.0.2", "postcss": "^8.3.11" } }, "sha512-dLAADUSS8rBwhaevT12yCezvioCA+bmUTPH/u57xKPT8d++voeYE6HeluA/bPbQ15TwDBG2ii+QZIEmYx8VdxA=="], + "sanitize-html": ["sanitize-html@2.17.7", "", { "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", "htmlparser2": "^12.0.0", "is-plain-object": "^5.0.0", "launder": "^1.7.1", "parse-srcset": "^1.0.2", "postcss": "^8.3.11" } }, "sha512-PGtEkc9cbnedU3s9TmzDbpsZ8w086g/0Q8k8/oIO1NLNU3i5k9yn835CrjJSajp1KMmkisbO1qPXxNKO3welAg=="], - "sass": ["sass@1.94.2", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A=="], + "sass": ["sass@1.104.0", "", { "dependencies": { "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-btHMApW2bgolvClhRW8AlQJzgI9lUB3pPSofBQQT+E46GWvf9o0TVQ13SYv5riWZVFyPN+JNz3TKW9XhBlc10w=="], - "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "sax": ["sax@1.6.1", "", {}, "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q=="], - "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], + "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + + "set-cookie-parser": ["set-cookie-parser@3.1.2", "", {}, "sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw=="], + + "sha1": ["sha1@1.1.1", "", { "dependencies": { "charenc": ">= 0.0.1", "crypt": ">= 0.0.1" } }, "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - - "sirv": ["sirv@3.0.1", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A=="], + "sirv": ["sirv@3.0.2", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - "sqlite-wasm-kysely": ["sqlite-wasm-kysely@0.3.0", "", { "dependencies": { "@sqlite.org/sqlite-wasm": "^3.48.0-build2" }, "peerDependencies": { "kysely": "*" } }, "sha512-TzjBNv7KwRw6E3pdKdlRyZiTmUIE0UttT/Sl56MVwVARl/u5gp978KepazCJZewFUnlWHz9i3NQd4kOtP/Afdg=="], - - "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], - - "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], - - "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - "strtok3": ["strtok3@10.3.4", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg=="], + "strtok3": ["strtok3@10.3.5", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA=="], - "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], + "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="], "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - "svelte": ["svelte@5.43.14", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", "esrap": "^2.1.0", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-pHeUrp1A5S6RGaXhJB7PtYjL1VVjbVrJ2EfuAoPu9/1LeoMaJa/pcdCsCSb0gS4eUHAHnhCbUDxORZyvGK6kOQ=="], + "svelte": ["svelte@5.57.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.10", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.8.1", "esm-env": "^1.2.1", "esrap": "^2.2.12", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-NdbDn7fl4be1ViUG0oq/lvG6OZy3oENolV2ONjiqqsfVoeAfzaQAKUcEX3MrQod/Bebv1PgwET9rfXhgn9s4Kg=="], - "svelte-check": ["svelte-check@4.3.4", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-DVWvxhBrDsd+0hHWKfjP99lsSXASeOhHJYyuKOFYJcP7ThfSCKgjVarE8XfuMWpS5JV3AlDf+iK1YGGo2TACdw=="], + "svelte-check": ["svelte-check@4.7.6", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "@sveltejs/load-config": "^0.2.3", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.0.0 || ^6.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-t2scM//ZuVbSY/T2w6FSBw1v9s2NEmh/g+sy1lqtosW5ylBV5AF4wFb1Ts9Kf3MbfPDUDJDZ9L436YT0SPTdvw=="], "svelte-eslint-parser": ["svelte-eslint-parser@0.43.0", "", { "dependencies": { "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "postcss": "^8.4.39", "postcss-scss": "^4.0.9" }, "peerDependencies": { "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["svelte"] }, "sha512-GpU52uPKKcVnh8tKN5P4UZpJ/fUDndmq7wfsvoVXsyP+aY0anol7Yqo01fyrlaWGMFfm4av5DyrjlaXdLRJvGA=="], - "svelte-stripe": ["svelte-stripe@1.4.0", "", { "peerDependencies": { "@stripe/stripe-js": "^3 || ^4", "svelte": "^3 || ^4 || ^5" } }, "sha512-RUSui4IszIBXhGt3mT3pLJX17OJ34A0O+LAcZLooWVYQCAv95umVXoRB6WmjMabj3jOoJ8c3KHGufaJLRlIzRg=="], + "svelte-stripe": ["svelte-stripe@2.0.0", "", { "peerDependencies": { "@stripe/stripe-js": ">=5", "svelte": "^5" } }, "sha512-fKIufgE7Gd40j9PJh3RcQnL15XrKpJ544nWiv8CJmIzZwoF5lJjVRC0MJg6RVqJd1BEz+N9Ip731O12x2Y0PJg=="], - "svgo": ["svgo@3.3.2", "", { "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", "css-tree": "^2.3.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.0.0" }, "bin": "./bin/svgo" }, "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw=="], + "svgo": ["svgo@4.1.0", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^6.0.0", "css-tree": "^3.0.1", "css-what": "^7.0.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "1.6.1" }, "bin": { "svgo": "bin/svgo.js" } }, "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q=="], - "tailwindcss": ["tailwindcss@3.4.18", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ=="], + "tailwindcss": ["tailwindcss@3.4.19", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ=="], "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - "token-types": ["token-types@6.1.1", "", { "dependencies": { "@borewit/text-codec": "^0.1.0", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ=="], + "token-types": ["token-types@6.1.2", "", { "dependencies": { "@borewit/text-codec": "^0.2.1", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww=="], "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], - "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], + "twgl.js": ["twgl.js@5.5.4", "", {}, "sha512-6kFOmijOpmblTN9CCwOTCxK4lPg7rCyQjLuub6EMOlEp89Ex6yUcsMjsmH7andNPL2NE3XmHdqHeP5gVKKPhxw=="], + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "typescript-eslint": ["typescript-eslint@8.47.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.47.0", "@typescript-eslint/parser": "8.47.0", "@typescript-eslint/typescript-estree": "8.47.0", "@typescript-eslint/utils": "8.47.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q=="], + "typescript-eslint": ["typescript-eslint@8.69.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.69.0", "@typescript-eslint/parser": "8.69.0", "@typescript-eslint/typescript-estree": "8.69.0", "@typescript-eslint/utils": "8.69.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA=="], "uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="], - "unplugin": ["unplugin@2.3.10", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw=="], + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], - "update-browserslist-db": ["update-browserslist-db@1.1.4", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A=="], + "update-browserslist-db": ["update-browserslist-db@1.3.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw=="], "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], @@ -836,122 +856,108 @@ "uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], + "valibot": ["valibot@1.4.2", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg=="], + "vert-wasm": ["vert-wasm@0.0.2", "", {}, "sha512-QCkhkATZkWp3OPpIrlcLVd5S4DQXeDEWIPI1eV+Ku+sUVoCM4s9DQbNKtnJ8s4leMW3AD4E7cY/gXB/9TsI3WA=="], "vite": ["vite@5.4.21", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw=="], "vite-plugin-top-level-await": ["vite-plugin-top-level-await@1.6.0", "", { "dependencies": { "@rollup/plugin-virtual": "^3.0.2", "@swc/core": "^1.12.14", "@swc/wasm": "^1.12.14", "uuid": "10.0.0" }, "peerDependencies": { "vite": ">=2.8" } }, "sha512-bNhUreLamTIkoulCR9aDXbTbhLk6n1YE8NJUTTxl5RYskNRtzOR0ASzSjBVRtNdjIfngDXo11qOsybGLNsrdww=="], - "vite-plugin-wasm": ["vite-plugin-wasm@3.5.0", "", { "peerDependencies": { "vite": "^2 || ^3 || ^4 || ^5 || ^6 || ^7" } }, "sha512-X5VWgCnqiQEGb+omhlBVsvTfxikKtoOgAzQ95+BZ8gQ+VfMHIjSHr0wyvXFQCa0eKQ0fKyaL0kWcEnYqBac4lQ=="], + "vite-plugin-wasm": ["vite-plugin-wasm@3.6.0", "", { "peerDependencies": { "vite": "^2 || ^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "sha512-mL/QPziiIA4RAA6DkaZZzOstdwbW5jO4Vz7Zenj0wieKWBlNvIvX5L5ljum9lcUX0ShNfBgCNLKTjNkRVVqcsw=="], - "vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="], + "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - - "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + "win-guid": ["win-guid@0.2.1", "", {}, "sha512-gEIQU4mkgl2OPeoNrWflcJFJ3Ae2BPd4eCsHHA/XikslkIVms/nHhvnvzIZV7VLmBvtFlDOzLt9rrZT+n6D67A=="], - "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + "yaml": ["yaml@1.10.3", "", {}, "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA=="], "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "zimmerframe": ["zimmerframe@1.1.2", "", {}, "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w=="], + "zimmerframe": ["zimmerframe@1.1.5", "", {}, "sha512-msJxIvYDYcoNL+PJsu+7qmpDWsYmAxTY+2TNYXXF0hzBzBk0BMecOqDOG/EckUoKCuKwObfbugIl8QpqHDXeFA=="], "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "@eslint/config-array/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], - - "@tokenizer/inflate/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - - "@typescript-eslint/parser/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "@inlang/sdk/uuid": ["uuid@14.0.2", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ=="], - "@typescript-eslint/project-service/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "@types/dom-mediacapture-transform/@types/dom-webcodecs": ["@types/dom-webcodecs@0.1.19", "", {}, "sha512-+yFUIDUaASFz0vQpWBErPxun/Lb+F0TdrlTsj50gm7K797YzEx2TmV6fEiwciHyFNghlZYPgQXH5qRcwMHcJFQ=="], - "@typescript-eslint/type-utils/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.8", "", {}, "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q=="], - "@typescript-eslint/typescript-estree/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], - "eslint/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - - "eslint-plugin-svelte/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], + "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "jpeg-lossless-decoder-js/@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.13.0", "", { "os": "linux", "cpu": "x64" }, "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA=="], - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - "music-metadata/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "music-metadata/file-type": ["file-type@21.3.4", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.4.0" } }, "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g=="], "postcss-load-config/lilconfig": ["lilconfig@2.1.0", "", {}, "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="], "riff-file/byte-data": ["byte-data@18.1.1", "", { "dependencies": { "endianness": "^8.0.2", "ieee754-buffer": "^2.0.0", "utf8-buffer": "^1.0.0" } }, "sha512-Kv/B0r7adgnCcrs/y703sac2XFLdHW5kPfis1j8+Ij/hmEcWhBKf+1pNTv+vsNqXb207Uiyri8bpnogNxR/4Lg=="], - "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "sanitize-html/htmlparser2": ["htmlparser2@12.0.0", "", { "dependencies": { "domelementtype": "^3.0.0", "domhandler": "^6.0.0", "domutils": "^4.0.2", "entities": "^8.0.0" } }, "sha512-Tz7u1i95/g2x2jz81+x0FBVhBhY5aRTvD3tXXdFaljuNdzDLJ8UGNRrTcj2cgQvAg3iW/h77Fz15nLW0L0CrZw=="], "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], + "svelte-check/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + "svelte-eslint-parser/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], "svelte-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], "svelte-eslint-parser/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], - "svgo/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + "svgo/css-select": ["css-select@6.0.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^7.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "nth-check": "^2.1.1" } }, "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw=="], - "tailwindcss/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + "svgo/css-what": ["css-what@7.0.0", "", {}, "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ=="], - "tailwindcss/postcss-load-config": ["postcss-load-config@4.0.2", "", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="], + "tailwindcss/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], - "token-types/@borewit/text-codec": ["@borewit/text-codec@0.1.1", "", {}, "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA=="], + "tailwindcss/jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + "tailwindcss/postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], - "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], - "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "sanitize-html/htmlparser2/domelementtype": ["domelementtype@3.0.0", "", {}, "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg=="], - "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], + "sanitize-html/htmlparser2/domhandler": ["domhandler@6.0.1", "", { "dependencies": { "domelementtype": "^3.0.0" } }, "sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg=="], - "eslint-plugin-svelte/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + "sanitize-html/htmlparser2/domutils": ["domutils@4.0.2", "", { "dependencies": { "dom-serializer": "^3.0.0", "domelementtype": "^3.0.0", "domhandler": "^6.0.0" } }, "sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA=="], - "glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "sanitize-html/htmlparser2/entities": ["entities@8.0.0", "", {}, "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA=="], - "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "svelte-check/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], "tailwindcss/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "tailwindcss/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - "tailwindcss/postcss-load-config/yaml": ["yaml@2.8.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw=="], - - "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "sanitize-html/htmlparser2/domutils/dom-serializer": ["dom-serializer@3.1.1", "", { "dependencies": { "domelementtype": "^3.0.0", "domhandler": "^6.0.0", "entities": "^8.0.0" } }, "sha512-4MEa38/QexBob6gFNwu+EGdWvhJ1OKuNwdYY3Y3NyeWDQfnGeDYQUDfIRzWu5B5gsv03so2Uxd28YC6zrsx3Lw=="], - "tailwindcss/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "tailwindcss/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], } } diff --git a/docker-compose.yml b/docker-compose.yml index 89472f13..d943c882 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,17 +1,18 @@ services: - vert: - container_name: vert - image: ghcr.io/vert-sh/vert:latest - build: - context: . - args: - PUB_HOSTNAME: ${PUB_HOSTNAME:-localhost:5173} - PUB_PLAUSIBLE_URL: ${PUB_PLAUSIBLE_URL:-} - PUB_ENV: ${PUB_ENV:-production} - PUB_DISABLE_ALL_EXTERNAL_REQUESTS: ${PUB_DISABLE_ALL_EXTERNAL_REQUESTS:-false} - PUB_VERTD_URL: ${PUB_VERTD_URL:-} - PUB_DONATION_URL: ${PUB_DONATION_URL:-https://donations.vert.sh} - PUB_STRIPE_KEY: ${PUB_STRIPE_KEY:-pk_live_51TlrPaFTPjkhEGBSu5Kwy5jJQYxcX5yUUHXiH5g7Xzvb0NKzDqbooc126HjlW35uUkfAgQN2ruEoCuyQynoxpKaA00ojFgQ116} - restart: unless-stopped - ports: - - ${PORT:-3000}:80 + vert: + container_name: vert + image: ghcr.io/vert-sh/vert:latest + build: + context: . + args: + PUB_HOSTNAME: ${PUB_HOSTNAME:-localhost:5173} + PUB_PLAUSIBLE_URL: ${PUB_PLAUSIBLE_URL:-} + PUB_ENV: ${PUB_ENV:-production} + PUB_DISABLE_ALL_EXTERNAL_REQUESTS: ${PUB_DISABLE_ALL_EXTERNAL_REQUESTS:-false} + PUB_VERTD_URL: ${PUB_VERTD_URL:-https://vertd.vert.sh} + PUB_DONATION_URL: ${PUB_DONATION_URL:-https://donations.vert.sh} + PUB_STRIPE_KEY: ${PUB_STRIPE_KEY:-pk_live_51TlrPaFTPjkhEGBSu5Kwy5jJQYxcX5yUUHXiH5g7Xzvb0NKzDqbooc126HjlW35uUkfAgQN2ruEoCuyQynoxpKaA00ojFgQ116} + PUB_DISABLE_FAILURE_BLOCKS: ${PUB_DISABLE_FAILURE_BLOCKS:-false} + restart: unless-stopped + ports: + - ${PORT:-3000}:80 diff --git a/docs/FAQ.md b/docs/FAQ.md index c7887ac8..e5d6ed15 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -34,4 +34,5 @@ Yes! If you would prefer VERT to not make any requests to external services (vid The only external request VERT will make with this option is to `cdn.jsdelivr.net`, which is used to download FFmpeg's WebAssembly build. ### What libraries does VERT use? -VERT uses FFmpeg for audio and video conversion, imagemagick for images and Pandoc for documents. A big thanks to them for maintaining such excellent libraries for so many years. \ No newline at end of file + +VERT uses FFmpeg for audio and video conversion, imagemagick for images and Pandoc for documents. A big thanks to them for maintaining such excellent libraries for so many years. diff --git a/docs/GETTING_STARTED.md b/docs/GETTING_STARTED.md index df9be324..41ec457a 100644 --- a/docs/GETTING_STARTED.md +++ b/docs/GETTING_STARTED.md @@ -11,17 +11,20 @@ This file covers how to get started with VERT. ### Prerequisites Make sure you have the following installed: + - [Bun](https://bun.sh/) ### Installation First, clone the repository: + ```sh git clone https://github.com/VERT-sh/VERT cd VERT/ ``` Install dependencies: + ```sh bun i ``` @@ -42,4 +45,4 @@ This will build the site to the `build` folder. You should then use a web server ### Using Docker -Check the dedicated [Docker](./DOCKER.md) page. \ No newline at end of file +Check the dedicated [Docker](./DOCKER.md) page. diff --git a/docs/VIDEO_CONVERSION.md b/docs/VIDEO_CONVERSION.md index 10f601f3..20f148f1 100644 --- a/docs/VIDEO_CONVERSION.md +++ b/docs/VIDEO_CONVERSION.md @@ -2,9 +2,9 @@ This file covers how video conversion works when using VERT. -On VERT, video uploads to a server for processing by default. This is because video conversion is hard to do in a browser as it uses a lot of resources, and will end up running very slowly (if it even works at all). +On VERT, video processing is done locally in your browser whenever possible using [Mediabunny](https://mediabunny.dev). However, some conversions may require server-side processing if it's unsupported or too slow to do it in the browser for some reason. -Our answer to this is [`vertd`](https://github.com/VERT-sh/vertd), which is a simple FFmpeg wrapper built in Rust. If you don't understand all that technical jargon, it basically allows you to convert videos using the full capacity of your computer, which results in much faster conversion. It runs on your computer (or a server somewhere, if you know what you're doing), and the VERT web interface reaches out to it in order to convert your videos. +Server-side processing is done through [`vertd`](https://github.com/VERT-sh/vertd), which is a simple FFmpeg wrapper built in Rust. If you don't understand all that technical jargon, it basically allows you to convert videos using the full capacity of your computer, which results in more conversions supported and being much faster. It runs on your computer (or a server somewhere, if you know what you're doing), and the VERT web interface reaches out to it in order to convert your videos, if it requests for it. We host an official instance of [`vertd`](https://github.com/VERT-sh/vertd) so you do not have to host it yourself for convenience, but considering you're here, you probably want to host it for yourself. Essentially: diff --git a/eslint.config.js b/eslint.config.js index a5265658..20da35c8 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,33 +1,40 @@ -import prettier from 'eslint-config-prettier'; -import js from '@eslint/js'; -import svelte from 'eslint-plugin-svelte'; -import globals from 'globals'; -import ts from 'typescript-eslint'; +import prettier from "eslint-config-prettier"; +import js from "@eslint/js"; +import svelte from "eslint-plugin-svelte"; +import globals from "globals"; +import ts from "typescript-eslint"; export default ts.config( js.configs.recommended, ...ts.configs.recommended, - ...svelte.configs['flat/recommended'], + ...svelte.configs["flat/recommended"], prettier, - ...svelte.configs['flat/prettier'], + ...svelte.configs["flat/prettier"], { languageOptions: { globals: { ...globals.browser, - ...globals.node - } - } + ...globals.node, + }, + }, }, { - files: ['**/*.svelte'], + files: ["**/*.svelte"], languageOptions: { parserOptions: { - parser: ts.parser - } - } + parser: ts.parser, + }, + }, }, { - ignores: ['build/', '.svelte-kit/', 'dist/'] - } + ignores: ["build/", ".svelte-kit/", "dist/", "src/lib/paraglide/"], + }, + { + files: ["**/*.ts", "**/*.svelte.ts", "**/*.svelte"], + rules: { + "svelte/no-at-html-tags": "off", + "svelte/valid-compile": "off", + }, + }, ); diff --git a/messages/ba.json b/messages/ba.json index 4570fbcd..bf88ca36 100644 --- a/messages/ba.json +++ b/messages/ba.json @@ -1,322 +1,352 @@ { - "$schema": "https://inlang.com/schema/inlang-message-format", - "navbar": { - "upload": "Učitaj", - "convert": "Konvertuj", - "settings": "Postavke", - "about": "O nama", - "toggle_theme": "Promijeni temu" - }, - "footer": { - "copyright": "© {year} VERT.", - "source_code": "Izvorni kod", - "discord_server": "Discord server", - "privacy_policy": "Politika privatnosti" - }, - "upload": { - "title": "Konverter datoteka koji ćete voljeti.", - "subtitle": "Sva obrada slika, zvuka i dokumenata obavlja se na vašem uređaju. Video zapisi se konvertuju na našim izuzetno brzim serverima. Bez ograničenja veličine, bez reklama i potpuno otvorenog koda.", - "uploader": { - "text": "Prevucite ili kliknite da {action}", - "convert": "konvertujete" - }, - "cards": { - "title": "VERT podržava...", - "images": "Slike", - "audio": "Audio", - "documents": "Dokumente", - "video": "Video", - "video_server_processing": "Server podržava", - "local_supported": "Lokalno podržano", - "status": { - "text": "Status: {status}", - "ready": "spreman", - "not_ready": "nije spreman", - "not_initialized": "nije inicijaliziran", - "downloading": "preuzimam...", - "initializing": "inicijaliziram...", - "unknown": "nepoznat status" - }, - "supported_formats": "Podržani formati:" - }, - "tooltip": { - "partial_support": "Ovaj format može biti konvertovan samo kao {direction}.", - "direction_input": "ulazni (iz)", - "direction_output": "izlazni (u)", - "video_server_processing": "Video se podrazumijevano otprema na server radi obrade, ovdje možete naučiti kako to postaviti lokalno." - } - }, - "convert": { - "archive_file": { - "extract": "Raspakuj arhivu", - "extracting": "Otkrivena arhiva: {filename}", - "extracted": "Izvučeno {extract_count} datoteka iz {filename}. {ignore_count} stavki je ignorisano.", - "detected": "Otkrivene {type} datoteke u {filename}.", - "audio": "audio", - "video": "video", - "doc": "dokument", - "image": "slika", - "extract_error": "Greška pri raspakivanju {filename}: {error}" - }, - "large_file_warning": "Zbog ograničenja preglednika/uređaja, konverzija videa u audio je onemogućena za ovu datoteku jer je veća od {limit}GB. Preporučujemo Firefox ili Safari za datoteke ove veličine jer imaju manje ograničenja.", - "external_warning": { - "title": "Upozorenje o vanjskom serveru", - "text": "Ako odaberete konverziju u video format, te datoteke će biti otpremljene na vanjski server. Želite li nastaviti?", - "yes": "Da", - "no": "Ne" - }, - "panel": { - "convert_all": "Konvertuj sve", - "download_all": "Preuzmi sve kao .zip", - "remove_all": "Ukloni sve datoteke", - "set_all_to": "Postavi sve na", - "na": "N/A" - }, - "dropdown": { - "audio": "Audio", - "video": "Video", - "doc": "Dokument", - "image": "Slika", - "placeholder": "Pretraži format", - "no_formats": "Nema dostupnih formata", - "no_results": "Nema rezultata koji odgovaraju pretrazi" - }, - "tooltips": { - "unknown_file": "Nepoznat tip datoteke", - "audio_file": "Audio datoteka", - "video_file": "Video datoteka", - "document_file": "Dokument", - "image_file": "Slika", - "convert_file": "Konvertuj ovu datoteku", - "download_file": "Preuzmi ovu datoteku" - }, - "errors": { - "cant_convert": "Ne možemo konvertovati ovu datoteku.", - "vertd_server": "šta to radiš..? treba da pokreneš vertd server!", - "vertd_generic_view": "Prikaži detalje greške", - "vertd_generic_body": "Došlo je do greške prilikom pokušaja konverzije videa. Želite li poslati svoj video programerima da pomognete u rješavanju problema? Samo će vaš video biti poslan. Nikakvi identifikatori neće biti otpremljeni.", - "vertd_generic_title": "Greška pri konverziji videa", - "vertd_generic_yes": "Pošalji video", - "vertd_generic_no": "Ne šalji", - "vertd_failed_to_keep": "Neuspjelo čuvanje videa na serveru: {error}", - "vertd_details": "Prikaži detalje greške", - "vertd_details_body": "Ako pritisnete pošalji, vaš video će također biti priložen uz log greške koji se uvijek automatski šalje nama na pregled. Sljedeće informacije su log koji automatski dobijamo:", - "vertd_details_footer": "Ove informacije se koriste isključivo za rješavanje problema i nikada neće biti dijeljene. Pogledajte našu [privacy_link]politiku privatnosti[/privacy_link] za više detalja.", - "vertd_details_job_id": "ID zadatka: {jobId}", - "vertd_details_from": "Iz formata: {from}", - "vertd_details_to": "U format: {to}", - "vertd_details_error_message": "Poruka greške: [view_link]Pogledaj log[/view_link]", - "vertd_details_close": "Zatvori", - "vertd_ratelimit": "Vaš video '{filename}' nije uspio biti konvertovan nekoliko puta. Kako bismo spriječili preopterećenje servera, dalji pokušaji konverzije za ovu datoteku su privremeno blokirani.", - "unsupported_format": "Podržane su samo slike, video, audio i dokumenti", - "format_output_only": "Ovaj format se trenutno može koristiti samo kao izlaz, ne kao ulaz.", - "vertd_not_found": "Nije moguće pronaći vertd instancu za pokretanje konverzije videa. Da li je URL ispravno postavljen?", - "worker_downloading": "{type} konverter se trenutno inicijalizira, molimo sačekajte.", - "worker_error": "{type} konverter je imao grešku tokom inicijalizacije, pokušajte kasnije ponovo.", - "worker_timeout": "{type} konverteru treba duže nego očekivano da se inicijalizira, molimo sačekajte još malo ili osvježite stranicu.", - "audio": "audio", - "doc": "dokument", - "image": "slika" - } - }, - "settings": { - "title": "Postavke", - "errors": { - "save_failed": "Neuspješno spremanje postavki!" - }, - "appearance": { - "title": "Izgled", - "brightness_theme": "Tema osvjetljenja", - "brightness_description": "Želite li blještavi dan ili tihu, usamljenu noć?", - "light": "Svijetla", - "dark": "Tamna", - "effect_settings": "Efekti", - "effect_description": "Želite li zanimljive efekte ili mirnije iskustvo?", - "enable": "Uključi", - "disable": "Isključi" - }, - "conversion": { - "title": "Konverzija", - "advanced_settings": "Napredne postavke", - "filename_format": "Format imena datoteke", - "filename_description": "Ovo određuje ime datoteke pri preuzimanju, bez ekstenzije. Možete koristiti sljedeće šablone: %name% originalno ime, %extension% originalna ekstenzija, %date% datum konverzije.", - "placeholder": "VERT_%name%", - "default_format": "Podrazumijevani format konverzije", - "default_format_enable": "Uključi", - "default_format_disable": "Isključi", - "default_format_description": "Ovo mijenja podrazumijevani format koji se odabere kada učitate datoteku ovog tipa.", - "default_format_image": "Slike", - "default_format_video": "Video", - "default_format_audio": "Audio", - "default_format_document": "Dokumenti", - "metadata": "Metadata", - "metadata_description": "Određuje da li se podaci (EXIF, info o pjesmi itd.) čuvaju u konvertovanim datotekama.", - "keep": "Zadrži", - "remove": "Ukloni", - "quality": "Kvalitet konverzije", - "quality_description": "Mijenja podrazumijevani kvalitet izlazne datoteke. Veće vrijednosti znače duže vrijeme konverzije i veću veličinu.", - "quality_video": "Mijenja izlazni kvalitet videa.", - "quality_audio": "Audio (kbps)", - "quality_images": "Slika (%)", - "rate": "Sample rate (Hz)" - }, - "vertd": { - "title": "Konverzija videa", - "status": "status:", - "loading": "učitavam...", - "available": "dostupan, commit id {commitId}", - "unavailable": "nedostupan (da li je URL tačan?)", - "description": "vertd je serverski omotač za FFmpeg, omogućava brzo konvertovanje videa koristeći vaš GPU putem VERT web interfejsa.", - "hosting_info": "Imamo javnu instancu radi praktičnosti, ali možete lako hostati svoju. Preuzmite server [vertd_link]ovdje[/vertd_link].", - "instance": "Instanca", - "url_placeholder": "Primjer: http://localhost:24153", - "conversion_speed": "Brzina konverzije", - "speed_description": "Opisuje odnos između brzine i kvaliteta. Brže = niži kvalitet ali kraće vrijeme.", - "speeds": { - "very_slow": "Vrlo sporo", - "slower": "Sporije", - "slow": "Sporo", - "medium": "Srednje", - "fast": "Brzo", - "ultra_fast": "Ultra brzo" - }, - "auto_instance": "Auto (preporučeno)", - "eu_instance": "Falkenstein, Njemačka", - "us_instance": "Washington, SAD", - "custom_instance": "Prilagođeno" - }, - "privacy": { - "title": "Privatnost i podaci", - "plausible_title": "Plausible analitika", - "plausible_description": "Koristimo [plausible_link]Plausible[/plausible_link], alat fokusiran na privatnost. Podaci su potpuno anonimni i agregirani. Analitiku možete vidjeti [analytics_link]ovdje[/analytics_link] i isključiti ispod.", - "opt_in": "Uključi", - "opt_out": "Isključi", - "cache_title": "Upravljanje cacheom", - "cache_description": "Konverter se kešira u vašem pregledniku radi boljih performansi.", - "refresh_cache": "Osvježi cache", - "clear_cache": "Obriši cache", - "files_cached": "{size} ({count} datoteka)", - "loading_cache": "Učitavam...", - "total_size": "Ukupna veličina", - "files_cached_label": "Keširane datoteke", - "cache_cleared": "Cache uspješno obrisan!", - "cache_clear_error": "Neuspješno brisanje cachea.", - "site_data_title": "Upravljanje podacima stranice", - "site_data_description": "Obriši sve podatke stranice uključujući postavke i cache i resetuj VERT.", - "clear_all_data": "Obriši sve podatke", - "clear_all_data_confirm_title": "Obrisati sve podatke stranice?", - "clear_all_data_confirm": "Resetovat će sve postavke i cache i osvježiti stranicu. Ova akcija je nepovratna.", - "clear_all_data_cancel": "Otkaži", - "all_data_cleared": "Svi podaci obrisani! Osvježavam stranicu...", - "all_data_clear_error": "Neuspješno brisanje svih podataka." - }, - "language": { - "title": "Jezik", - "description": "Odaberite željeni jezik VERT interfejsa." - } - }, - "about": { - "title": "O nama", - "why": { - "title": "Zašto VERT?", - "description": "Konverteri datoteka su nas uvijek razočaravali. Ružni su, puni reklama i, najvažnije, spori. Odlučili smo to riješiti jednom zauvijek.

Sve ne-video datoteke se obrađuju lokalno, što znači da nema slanja datoteka na server — i mi nikad ne vidimo vaše podatke.

Video se otprema na naš brzi RTX 4000 Ada server. Vaši video snimci ostaju tamo sat vremena ako ih ne konvertujete. Ako ih konvertujete, ostaju sat ili dok ih preuzmete, nakon čega se brišu." - }, - "sponsors": { - "title": "Sponzori", - "description": "Želite nas podržati? Kontaktirajte nekog od developera na [discord_link]Discordu[/discord_link] ili pošaljite email na", - "email_copied": "Email kopiran!" - }, - "resources": { - "title": "Resursi", - "discord": "Discord", - "source": "Izvor", - "email": "Email" - }, - "donate": { - "title": "Donirajte VERT-u", - "description": "Vaša podrška pomaže da nastavimo razvijati i unapređivati VERT.", - "one_time": "Jednokratno", - "monthly": "Mjesečno", - "custom": "Prilagođeno", - "pay_now": "Plati sada", - "donate_amount": "Doniraj ${amount} USD", - "thank_you": "Hvala na donaciji!", - "payment_failed": "Plaćanje nije uspjelo: {message}{period}. Novac nije skinut s vašeg računa.", - "donation_error": "Došlo je do greške pri obradi donacije. Pokušajte ponovo kasnije.", - "payment_error": "Greška pri dohvaćanju podataka o plaćanju. Pokušajte ponovo.", - "donation_notice_official": "Donacije ovdje idu za zvaničnu VERT instancu (vert.sh) i pomažu razvoj projekta.", - "donation_notice_unofficial": "Donacije ovdje idu operateru ove VERT instance. Ako želite podržati zvanične developere, posjetite [official_link]vert.sh[/official_link]." - }, - "credits": { - "title": "Zasluge", - "contact_team": "Ako želite kontaktirati razvojni tim, koristite email iz kartice \"Resursi\".", - "notable_contributors": "Istaknuti doprinosioci", - "notable_description": "Želimo zahvaliti ovim osobama na velikim doprinosima VERT-u.", - "github_contributors": "GitHub doprinosioci", - "github_description": "Veliko hvala svima! [github_link]Želite pomoći i vi?[/github_link]", - "no_contributors": "Izgleda da još niko nije doprinio... [contribute_link]budite prvi![/contribute_link]", - "libraries": "Biblioteke", - "libraries_description": "Veliko hvala FFmpeg-u (audio, video), ImageMagick-u (slike) i Pandoc-u (dokumenti). VERT se na njima temelji.", - "roles": { - "lead_developer": "Glavni developer; backend konverzije, UI implementacija", - "developer": "Developer; UI implementacija", - "designer": "Dizajner; UX, brending, marketing", - "docker_ci": "Održavanje Docker & CI podrške", - "former_cofounder": "Bivši suosnivač i dizajner" - } - }, - "errors": { - "github_contributors": "Greška pri dohvaćanju GitHub doprinosilaca" - } - }, - "workers": { - "errors": { - "general": "Greška pri konverziji {file}: {message}", - "cancel": "Greška pri otkazivanju konverzije za {file}: {message}", - "magick": "Greška u Magick workeru, konverzija slika možda neće raditi ispravno.", - "ffmpeg": "Greška pri učitavanju FFmpeg-a, neke funkcije možda neće raditi.", - "pandoc": "Greška pri učitavanju Pandoc workera, dokumenti možda neće biti konvertovani.", - "no_audio": "Nije pronađen audio zapis.", - "invalid_rate": "Nevažeća sample rate vrijednost: {rate}Hz", - "file_too_large": "Ova datoteka prelazi {limit}GB ograničenje preglednika/uređaja. Pokušajte u Firefoxu ili Safariju." - } - }, - "privacy": { - "title": "Politika privatnosti", - "summary": { - "title": "Sažetak", - "description": "VERT-ova politika privatnosti je vrlo jednostavna: ne prikupljamo niti pohranjujemo ikakve podatke o vama. Ne koristimo kolačiće ni trackere, analitika je potpuno privatna, a konverzije (osim videa) rade lokalno. Video se briše nakon preuzimanja ili nakon sat vremena, osim ako nam ne date dozvolu da ga čuvamo radi rješavanja problema. Koristimo Coolify za hosting i Plausible za anonimnu analitiku. Stripe obrađuje donacije i može prikupiti podatke za prevenciju prevara.

Ovo vrijedi za zvaničnu instancu [vert_link]vert.sh[/vert_link]; treće strane mogu raditi drugačije." - }, - "conversions": { - "title": "Konverzije", - "description": "Većina konverzija (slike, dokumenti, audio) se obavlja lokalno putem WebAssembly alata (ImageMagick, Pandoc, FFmpeg). Vaše datoteke ne napuštaju uređaj.

Video konverzije se obavljaju na našim serverima jer zahtijevaju više snage. Video se briše nakon preuzimanja ili sat vremena, osim ako nam eksplicitno ne dozvolite duže čuvanje radi otklanjanja grešaka." - }, - "donations": { - "title": "Donacije", - "description": "Koristimo Stripe na stranici [about_link]o nama[/about_link] za donacije. Stripe može prikupiti određene informacije radi prevencije prevara, opisano u [stripe_link]njihovoj dokumentaciji[/stripe_link]. Eksterni zahtjevi se šalju tek nakon vašeg klika." - }, - "conversion_errors": { - "title": "Greške pri konverziji", - "description": "Kada konverzija videa ne uspije, možemo prikupiti anonimne informacije radi dijagnostike:", - "list_job_id": "ID zadatka (anonimizirano ime datoteke)", - "list_format_from": "Format iz kojeg se konvertuje", - "list_format_to": "Format u koji se konvertuje", - "list_stderr": "FFmpeg stderr (poruka greške)", - "list_video": "Stvarni video zapis (samo uz vašu dozvolu)", - "footer": "Ove informacije se koriste samo za dijagnostiku. Sam video se prikuplja samo uz vašu dozvolu." - }, - "analytics": { - "title": "Analitika", - "description": "Koristimo vlastitu Plausible instancu za potpuno anonimnu analitiku. Plausible ne koristi kolačiće i usklađen je sa svim glavnim zakonima o privatnosti. Možete isključiti analitiku u sekciji \"Privatnost i podaci\" u [settings_link]postavkama[/settings_link] i pročitati više [plausible_link]ovdje[/plausible_link]." - }, - "local_storage": { - "title": "Lokalno skladištenje", - "description": "Vaše postavke se čuvaju u local storage-u preglednika, a lista GitHub doprinosilaca u session storage-u. Nijedan lični podatak se ne skladišti.

WebAssembly alati (FFmpeg, ImageMagick, Pandoc) se također čuvaju lokalno. Možete ih vidjeti ili obrisati u sekciji \"Privatnost i podaci\" u [settings_link]postavkama[/settings_link]." - }, - "contact": { - "title": "Kontakt", - "description": "Za pitanja, pišite nam na: [email_link]hello@vert.sh[/email_link]. Ako koristite treću stranu, kontaktirajte njihovog hostera." - }, - "last_updated": "Posljednje ažuriranje: 2025-10-29" - } + "$schema": "https://inlang.com/schema/inlang-message-format", + "navbar": { + "upload": "Učitaj", + "convert": "Konvertuj", + "settings": "Postavke", + "about": "O nama", + "toggle_theme": "Promijeni temu" + }, + "footer": { + "copyright": "© {year} VERT.", + "source_code": "Izvorni kod", + "discord_server": "Discord server", + "privacy_policy": "Politika privatnosti" + }, + "upload": { + "title": "Konverter datoteka koji ćete voljeti.", + "subtitle": "Sva obrada slika, zvuka i dokumenata obavlja se na vašem uređaju. Video zapisi se konvertuju na našim izuzetno brzim serverima. Bez ograničenja veličine, bez reklama i potpuno otvorenog koda.", + "uploader": { + "text": "Prevucite ili kliknite da {action}", + "convert": "konvertujete" + }, + "cards": { + "title": "VERT podržava...", + "images": "Slike", + "audio": "Audio", + "documents": "Dokumente", + "video": "Video", + "video_server_processing": "Server podržava", + "local_supported": "Lokalno podržano", + "status": { + "text": "Status: {status}", + "ready": "spreman", + "not_ready": "nije spreman", + "not_initialized": "nije inicijaliziran", + "downloading": "preuzimam...", + "initializing": "inicijaliziram...", + "unknown": "nepoznat status" + }, + "supported_formats": "Podržani formati:" + }, + "tooltip": { + "partial_support": "Ovaj format može biti konvertovan samo kao {direction}.", + "direction_input": "ulazni (iz)", + "direction_output": "izlazni (u)", + "video_server_processing": "Video se podrazumijevano otprema na server radi obrade, ovdje možete naučiti kako to postaviti lokalno." + } + }, + "convert": { + "archive_file": { + "extract": "Raspakuj arhivu", + "extracting": "Otkrivena arhiva: {filename}", + "extracted": "Izvučeno {extract_count} datoteka iz {filename}. {ignore_count} stavki je ignorisano.", + "detected": "Otkrivene {type} datoteke u {filename}.", + "audio": "audio", + "video": "video", + "doc": "dokument", + "image": "slika", + "extract_error": "Greška pri raspakivanju {filename}: {error}" + }, + "large_file_warning": "Zbog ograničenja preglednika/uređaja, konverzija videa u audio je onemogućena za ovu datoteku jer je veća od {limit}GB. Preporučujemo Firefox ili Safari za datoteke ove veličine jer imaju manje ograničenja.", + "external_warning": { + "title": "Upozorenje o vanjskom serveru", + "text": "Ako odaberete konverziju u video format, te datoteke će biti otpremljene na vanjski server. Želite li nastaviti?", + "yes": "Da", + "no": "Ne" + }, + "panel": { + "convert_all": "Konvertuj sve", + "download_all": "Preuzmi sve kao .zip", + "remove_all": "Ukloni sve datoteke", + "set_all_to": "Postavi sve na", + "na": "N/A" + }, + "dropdown": { + "audio": "Audio", + "video": "Video", + "doc": "Dokument", + "image": "Slika", + "placeholder": "Pretraži format", + "no_formats": "Nema dostupnih formata", + "no_results": "Nema rezultata koji odgovaraju pretrazi" + }, + "tooltips": { + "unknown_file": "Nepoznat tip datoteke", + "audio_file": "Audio datoteka", + "video_file": "Video datoteka", + "document_file": "Dokument", + "image_file": "Slika", + "convert_file": "Konvertuj ovu datoteku", + "download_file": "Preuzmi ovu datoteku" + }, + "errors": { + "cant_convert": "Ne možemo konvertovati ovu datoteku.", + "unsupported_format": "Podržane su samo slike, video, audio i dokumenti", + "format_output_only": "Ovaj format se trenutno može koristiti samo kao izlaz, ne kao ulaz.", + "worker_downloading": "{type} konverter se trenutno inicijalizira, molimo sačekajte.", + "worker_error": "{type} konverter je imao grešku tokom inicijalizacije, pokušajte kasnije ponovo.", + "worker_timeout": "{type} konverteru treba duže nego očekivano da se inicijalizira, molimo sačekajte još malo ili osvježite stranicu.", + "audio": "audio", + "doc": "dokument", + "image": "slika", + "vertd": { + "server": "šta to radiš..? treba da pokreneš vertd server!", + "details": { + "view": "Prikaži detalje greške", + "body": "Ako pritisnete pošalji, vaš video će također biti priložen uz log greške koji se uvijek automatski šalje nama na pregled. Sljedeće informacije su log koji automatski dobijamo:", + "footer": "Ove informacije se koriste isključivo za rješavanje problema i nikada neće biti dijeljene. Pogledajte našu [privacy_link]politiku privatnosti[/privacy_link] za više detalja.", + "job_id": "ID zadatka: {jobId}", + "from": "Iz formata: {from}", + "to": "U format: {to}", + "error_message": "Poruka greške: [view_link]Pogledaj log[/view_link]", + "close": "Zatvori" + }, + "generic": { + "view": "Prikaži detalje greške", + "body": "Došlo je do greške prilikom pokušaja konverzije videa. Želite li poslati svoj video programerima da pomognete u rješavanju problema? Samo će vaš video biti poslan. Nikakvi identifikatori neće biti otpremljeni.", + "title": "Greška pri konverziji videa", + "yes": "Pošalji video", + "no": "Ne šalji" + }, + "failed_to_keep": "Neuspjelo čuvanje videa na serveru: {error}", + "ratelimit": "Vaš video '{filename}' nije uspio biti konvertovan nekoliko puta. Kako bismo spriječili preopterećenje servera, dalji pokušaji konverzije za ovu datoteku su privremeno blokirani.", + "not_found": "Nije moguće pronaći vertd instancu za pokretanje konverzije videa. Da li je URL ispravno postavljen?" + } + } + }, + "settings": { + "title": "Postavke", + "errors": { + "save_failed": "Neuspješno spremanje postavki!" + }, + "appearance": { + "title": "Izgled", + "light": "Svijetla", + "dark": "Tamna", + "enable": "Uključi", + "disable": "Isključi", + "brightness": { + "theme": "Tema osvjetljenja", + "description": "Želite li blještavi dan ili tihu, usamljenu noć?" + }, + "effect": { + "settings": "Efekti", + "description": "Želite li zanimljive efekte ili mirnije iskustvo?" + }, + "language": { + "title": "Jezik", + "description": "Odaberite željeni jezik VERT interfejsa." + } + }, + "conversion": { + "title": "Konverzija", + "advanced_settings": "Napredne postavke", + "default_format": { + "image": "Slike", + "audio": "Audio", + "document": "Dokumenti", + "enable": "Uključi", + "disable": "Isključi", + "label": "Podrazumijevani format konverzije", + "description": "Ovo mijenja podrazumijevani format koji se odabere kada učitate datoteku ovog tipa.", + "video": "Video" + }, + "metadata": { + "label": "Metadata", + "description": "Određuje da li se podaci (EXIF, info o pjesmi itd.) čuvaju u konvertovanim datotekama.", + "keep": "Zadrži", + "remove": "Ukloni" + }, + "quality": { + "label": "Kvalitet konverzije", + "description": "Mijenja podrazumijevani kvalitet izlazne datoteke. Veće vrijednosti znače duže vrijeme konverzije i veću veličinu.", + "video": "Mijenja izlazni kvalitet videa.", + "audio": "Audio (kbps)", + "images": "Slika (%)" + }, + "rate": "Sample rate (Hz)", + "filename": { + "format": "Format imena datoteke", + "description": "Ovo određuje ime datoteke pri preuzimanju, bez ekstenzije. Možete koristiti sljedeće šablone: %name% originalno ime, %extension% originalna ekstenzija, %date% datum konverzije.", + "placeholder": "VERT_%name%" + } + }, + "vertd": { + "title": "Konverzija videa", + "status": "status:", + "loading": "učitavam...", + "available": "dostupan, commit id {commitId}", + "unavailable": "nedostupan (da li je URL tačan?)", + "description": { + "main": "vertd je serverski omotač za FFmpeg, omogućava brzo konvertovanje videa koristeći vaš GPU putem VERT web interfejsa.", + "info": "Imamo javnu instancu radi praktičnosti, ali možete lako hostati svoju. Preuzmite server [vertd_link]ovdje[/vertd_link]." + }, + "instance": { + "custom": "Prilagođeno", + "label": "Instanca", + "url_placeholder": "Primjer: http://localhost:24153", + "auto": "Auto (preporučeno)", + "eu": "Falkenstein, Njemačka", + "us": "Washington, SAD" + }, + "conversion_speed": { + "speeds": { + "very_slow": "Vrlo sporo", + "slower": "Sporije", + "slow": "Sporo", + "medium": "Srednje", + "fast": "Brzo", + "ultra_fast": "Ultra brzo" + }, + "label": "Brzina konverzije", + "description": "Opisuje odnos između brzine i kvaliteta. Brže = niži kvalitet ali kraće vrijeme." + } + }, + "privacy": { + "title": "Privatnost i podaci", + "plausible": { + "title": "Plausible analitika", + "description": "Koristimo [plausible_link]Plausible[/plausible_link], alat fokusiran na privatnost. Podaci su potpuno anonimni i agregirani. Analitiku možete vidjeti [analytics_link]ovdje[/analytics_link] i isključiti ispod.", + "opt_in": "Uključi", + "opt_out": "Isključi" + }, + "cache": { + "title": "Upravljanje cacheom", + "description": "Konverter se kešira u vašem pregledniku radi boljih performansi.", + "refresh_cache": "Osvježi cache", + "clear_cache": "Obriši cache", + "files_cached": "{size} ({count} datoteka)", + "loading_cache": "Učitavam...", + "total_size": "Ukupna veličina", + "files_cached_label": "Keširane datoteke", + "cache_cleared": "Cache uspješno obrisan!", + "cache_clear_error": "Neuspješno brisanje cachea." + }, + "site_data": { + "title": "Upravljanje podacima stranice", + "description": "Obriši sve podatke stranice uključujući postavke i cache i resetuj VERT.", + "clear_all_data": "Obriši sve podatke", + "clear_all_data_confirm_title": "Obrisati sve podatke stranice?", + "clear_all_data_confirm": "Resetovat će sve postavke i cache i osvježiti stranicu. Ova akcija je nepovratna.", + "clear_all_data_cancel": "Otkaži", + "all_data_cleared": "Svi podaci obrisani! Osvježavam stranicu...", + "all_data_clear_error": "Neuspješno brisanje svih podataka." + } + } + }, + "about": { + "title": "O nama", + "why": { + "title": "Zašto VERT?", + "description": "Konverteri datoteka su nas uvijek razočaravali. Ružni su, puni reklama i, najvažnije, spori. Odlučili smo to riješiti jednom zauvijek.

Sve ne-video datoteke se obrađuju lokalno, što znači da nema slanja datoteka na server — i mi nikad ne vidimo vaše podatke.

Video se otprema na naš brzi RTX 4000 Ada server. Vaši video snimci ostaju tamo sat vremena ako ih ne konvertujete. Ako ih konvertujete, ostaju sat ili dok ih preuzmete, nakon čega se brišu." + }, + "sponsors": { + "title": "Sponzori", + "description": "Želite nas podržati? Kontaktirajte nekog od developera na [discord_link]Discordu[/discord_link] ili pošaljite email na", + "email_copied": "Email kopiran!" + }, + "resources": { + "title": "Resursi", + "discord": "Discord", + "source": "Izvor", + "email": "Email" + }, + "donate": { + "title": "Donirajte VERT-u", + "description": "Vaša podrška pomaže da nastavimo razvijati i unapređivati VERT.", + "one_time": "Jednokratno", + "monthly": "Mjesečno", + "custom": "Prilagođeno", + "pay_now": "Plati sada", + "donate_amount": "Doniraj ${amount} USD", + "thank_you": "Hvala na donaciji!", + "payment_failed": "Plaćanje nije uspjelo: {message}{period}. Novac nije skinut s vašeg računa.", + "donation_error": "Došlo je do greške pri obradi donacije. Pokušajte ponovo kasnije.", + "payment_error": "Greška pri dohvaćanju podataka o plaćanju. Pokušajte ponovo.", + "donation_notice_official": "Donacije ovdje idu za zvaničnu VERT instancu (vert.sh) i pomažu razvoj projekta.", + "donation_notice_unofficial": "Donacije ovdje idu operateru ove VERT instance. Ako želite podržati zvanične developere, posjetite [official_link]vert.sh[/official_link]." + }, + "credits": { + "title": "Zasluge", + "contact_team": "Ako želite kontaktirati razvojni tim, koristite email iz kartice \"Resursi\".", + "notable_contributors": "Istaknuti doprinosioci", + "notable_description": "Želimo zahvaliti ovim osobama na velikim doprinosima VERT-u.", + "github_contributors": "GitHub doprinosioci", + "github_description": "Veliko hvala svima! [github_link]Želite pomoći i vi?[/github_link]", + "no_contributors": "Izgleda da još niko nije doprinio... [contribute_link]budite prvi![/contribute_link]", + "libraries": "Biblioteke", + "libraries_description": "Veliko hvala FFmpeg-u (audio, video), ImageMagick-u (slike) i Pandoc-u (dokumenti). VERT se na njima temelji.", + "roles": { + "lead_developer": "Glavni developer; backend konverzije, UI implementacija", + "developer": "Developer; UI implementacija", + "designer": "Dizajner; UX, brending, marketing", + "docker_ci": "Održavanje Docker & CI podrške", + "former_cofounder": "Bivši suosnivač i dizajner" + } + }, + "errors": { + "github_contributors": "Greška pri dohvaćanju GitHub doprinosilaca" + } + }, + "workers": { + "errors": { + "general": "Greška pri konverziji {file}: {message}", + "cancel": "Greška pri otkazivanju konverzije za {file}: {message}", + "magick": "Greška u Magick workeru, konverzija slika možda neće raditi ispravno.", + "ffmpeg": "Greška pri učitavanju FFmpeg-a, neke funkcije možda neće raditi.", + "pandoc": "Greška pri učitavanju Pandoc workera, dokumenti možda neće biti konvertovani.", + "no_audio": "Nije pronađen audio zapis.", + "invalid_rate": "Nevažeća sample rate vrijednost: {rate}Hz", + "file_too_large": "Ova datoteka prelazi {limit}GB ograničenje preglednika/uređaja. Pokušajte u Firefoxu ili Safariju." + } + }, + "privacy": { + "title": "Politika privatnosti", + "summary": { + "title": "Sažetak", + "description": "VERT-ova politika privatnosti je vrlo jednostavna: ne prikupljamo niti pohranjujemo ikakve podatke o vama. Ne koristimo kolačiće ni trackere, analitika je potpuno privatna, a konverzije (osim videa) rade lokalno. Video se briše nakon preuzimanja ili nakon sat vremena, osim ako nam ne date dozvolu da ga čuvamo radi rješavanja problema. Koristimo Coolify za hosting i Plausible za anonimnu analitiku. Stripe obrađuje donacije i može prikupiti podatke za prevenciju prevara.

Ovo vrijedi za zvaničnu instancu [vert_link]vert.sh[/vert_link]; treće strane mogu raditi drugačije." + }, + "conversions": { + "title": "Konverzije", + "description": "Većina konverzija (slike, dokumenti, audio) se obavlja lokalno putem WebAssembly alata (ImageMagick, Pandoc, FFmpeg). Vaše datoteke ne napuštaju uređaj.

Video konverzije se obavljaju na našim serverima jer zahtijevaju više snage. Video se briše nakon preuzimanja ili sat vremena, osim ako nam eksplicitno ne dozvolite duže čuvanje radi otklanjanja grešaka." + }, + "donations": { + "title": "Donacije", + "description": "Koristimo Stripe na stranici [about_link]o nama[/about_link] za donacije. Stripe može prikupiti određene informacije radi prevencije prevara, opisano u [stripe_link]njihovoj dokumentaciji[/stripe_link]. Eksterni zahtjevi se šalju tek nakon vašeg klika." + }, + "conversion_errors": { + "title": "Greške pri konverziji", + "description": "Kada konverzija videa ne uspije, možemo prikupiti anonimne informacije radi dijagnostike:", + "list_job_id": "ID zadatka (anonimizirano ime datoteke)", + "list_format_from": "Format iz kojeg se konvertuje", + "list_format_to": "Format u koji se konvertuje", + "list_stderr": "FFmpeg stderr (poruka greške)", + "list_video": "Stvarni video zapis (samo uz vašu dozvolu)", + "footer": "Ove informacije se koriste samo za dijagnostiku. Sam video se prikuplja samo uz vašu dozvolu." + }, + "analytics": { + "title": "Analitika", + "description": "Koristimo vlastitu Plausible instancu za potpuno anonimnu analitiku. Plausible ne koristi kolačiće i usklađen je sa svim glavnim zakonima o privatnosti. Možete isključiti analitiku u sekciji \"Privatnost i podaci\" u [settings_link]postavkama[/settings_link] i pročitati više [plausible_link]ovdje[/plausible_link]." + }, + "local_storage": { + "title": "Lokalno skladištenje", + "description": "Vaše postavke se čuvaju u local storage-u preglednika, a lista GitHub doprinosilaca u session storage-u. Nijedan lični podatak se ne skladišti.

WebAssembly alati (FFmpeg, ImageMagick, Pandoc) se također čuvaju lokalno. Možete ih vidjeti ili obrisati u sekciji \"Privatnost i podaci\" u [settings_link]postavkama[/settings_link]." + }, + "contact": { + "title": "Kontakt", + "description": "Za pitanja, pišite nam na: [email_link]hello@vert.sh[/email_link]. Ako koristite treću stranu, kontaktirajte njihovog hostera." + }, + "last_updated": "Posljednje ažuriranje: 2025-10-29" + } } diff --git a/messages/cs.json b/messages/cs.json new file mode 100644 index 00000000..a0664d6c --- /dev/null +++ b/messages/cs.json @@ -0,0 +1,355 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + "navbar": { + "upload": "Nahrát", + "convert": "Konvertovat", + "settings": "Nastavení", + "about": "O aplikaci", + "toggle_theme": "Přepnout vzhled" + }, + "footer": { + "copyright": "© {year} VERT.", + "source_code": "Zdrojový kód", + "discord_server": "Discord server", + "privacy_policy": "Zásady ochrany osobních údajů" + }, + "upload": { + "title": "Konvertor souborů, který si zamilujete.", + "subtitle": "Veškeré zpracování obrázků, audia a dokumentů probíhá na vašem zařízení. Videa jsou konvertována na našich bleskově rychlých serverech. Žádné omezení velikosti souborů, bez reklam a kompletně open-source.", + "uploader": { + "text": "Přetáhněte soubor nebo klikněte pro {action}", + "convert": "konvertování" + }, + "cards": { + "title": "VERT podporuje...", + "images": "Obrázky", + "audio": "Audio", + "documents": "Dokumenty", + "video": "Video", + "video_server_processing": "Podporováno na serveru", + "local_supported": "Lokálně podporováno", + "status": { + "text": "Stav: {status}", + "ready": "připraveno", + "not_ready": "není připraveno", + "not_initialized": "nespuštěno", + "downloading": "stahování...", + "initializing": "spouštění...", + "unknown": "neznámý stav" + }, + "supported_formats": "Podporované formáty:" + }, + "tooltip": { + "partial_support": "Tento formát lze konvertovat pouze jako {direction}.", + "direction_input": "vstup (z)", + "direction_output": "výstup (do)", + "video_server_processing": "Video se standardně nahrává na server ke zpracování. Zjistěte, jak to nastavit lokálně zde." + } + }, + "convert": { + "archive_file": { + "extract": "Rozbalit archiv", + "extracting": "Detekován archiv: {filename}", + "extracted": "Rozbaleno {extract_count} souborů z {filename}. {ignore_count} položek bylo ignorováno.", + "detected": "Detekovány {type} soubory v {filename}.", + "audio": "audio", + "video": "video", + "doc": "dokument", + "image": "obrázek", + "extract_error": "Chyba při rozbalování {filename}: {error}" + }, + "large_file_warning": "Kvůli omezením prohlížeče/zařízení je konverze videa na audio pro tento soubor zakázána, protože je větší než {limit} GB. Doporučujeme použít Firefox nebo Safari pro soubory této velikosti, které mají méně omezení.", + "external_warning": { + "title": "Upozornění na externí server", + "text": "Pokud se rozhodnete konvertovat do video formátu, tyto soubory budou nahrány na externí server ke konverzi. Chcete pokračovat?", + "yes": "Ano", + "no": "Ne" + }, + "panel": { + "convert_all": "Konvertovat vše", + "download_all": "Stáhnout vše jako .zip", + "remove_all": "Odebrat všechny soubory", + "set_all_to": "Nastavit vše na", + "na": "Nedostupné" + }, + "dropdown": { + "audio": "Audio", + "video": "Video", + "doc": "Dokument", + "image": "Obrázek", + "placeholder": "Hledat formát", + "no_formats": "Žádné formáty k dispozici", + "no_results": "Žádné formáty neodpovídají vašemu hledání" + }, + "tooltips": { + "unknown_file": "Neznámý typ souboru", + "audio_file": "Audio soubor", + "video_file": "Video soubor", + "document_file": "Dokument", + "image_file": "Obrázek", + "convert_file": "Konvertovat tento soubor", + "download_file": "Stáhnout tento soubor" + }, + "errors": { + "cant_convert": "Tento soubor nelze konvertovat.", + "unsupported_format": "Podporovány jsou pouze soubory obrázků, videa, audia a dokumentů", + "format_output_only": "Tento formát lze v současné době použít pouze jako výstup (konvertovat do), nikoli jako vstup.", + "worker_downloading": "Konvertor {type} se právě inicializuje, počkejte prosím chvíli.", + "worker_error": "Konvertor {type} měl při inicializaci chybu, zkuste to prosím později.", + "worker_timeout": "Inicializace konvertoru {type} trvá déle než obvykle, počkejte prosím ještě chvíli nebo obnovte stránku.", + "audio": "audia", + "doc": "dokumentů", + "image": "obrázků", + "vertd": { + "server": "co to děláte...? měli byste spustit vertd server!", + "details": { + "view": "Zobrazit podrobnosti chyby", + "body": "Pokud stisknete odeslat, vaše video bude také připojeno spolu s protokolem chyb, který je nám vždy hlášen ke kontrole. Následující informace jsou protokol, který automaticky obdržíme:", + "footer": "Tyto informace budou použity pouze pro účely řešení problémů a nebudou nikdy sdíleny. Prohlédněte si naše [privacy_link]zásady ochrany osobních údajů[/privacy_link] pro více informací.", + "job_id": "ID úlohy: {jobId}", + "from": "Z formátu: {from}", + "to": "Do formátu: {to}", + "error_message": "Chybová zpráva: [view_link]Zobrazit protokol chyb[/view_link]", + "close": "Zavřít" + }, + "generic": { + "view": "Zobrazit podrobnosti chyby", + "body": "Při pokusu o konverzi vašeho videa došlo k chybě. Chcete odeslat toto video vývojářům, abyste pomohli opravit tuto chybu? Bude odeslán pouze váš video soubor. Žádné identifikátory nebudou nahrány.", + "title": "Chyba při konverzi videa", + "yes": "Odeslat video", + "no": "Neposílat" + }, + "failed_to_keep": "Selhalo uchování videa na serveru: {error}", + "ratelimit": "Vaše video '{filename}' se nepodařilo konvertovat několikrát. Aby nedošlo k přetížení serveru, další pokusy o konverzi tohoto souboru byly dočasně zablokovány. Zkuste to prosím později.", + "not_found": "Nelze najít instanci vertd pro zahájení konverze videa. Jste si jisti, že je URL instance nastavena správně?" + } + } + }, + "settings": { + "title": "Nastavení", + "errors": { + "save_failed": "Selhalo uložení nastavení!" + }, + "appearance": { + "title": "Vzhled", + "light": "Světlý", + "dark": "Tmavý", + "enable": "Zapnout", + "disable": "Vypnout", + "brightness": { + "theme": "Barevný motiv", + "description": "Chcete slunečný blesk, nebo tiché osamělé noci?" + }, + "effect": { + "settings": "Nastavení efektů", + "description": "Chcete efektní efekty, nebo statičtější prostředí?" + }, + "language": { + "title": "Jazyk", + "description": "Vyberte preferovaný jazyk pro rozhraní VERT." + } + }, + "conversion": { + "title": "Konverze", + "advanced_settings": "Pokročilá nastavení", + "default_format": { + "image": "Obrázky", + "audio": "Audio", + "document": "Dokumenty", + "enable": "Zapnout", + "disable": "Vypnout", + "label": "Výchozí formát konverze", + "description": "Toto změní výchozí formát vybraný při nahrání souboru tohoto typu.", + "video": "Videa" + }, + "metadata": { + "label": "Metadata souboru", + "description": "Toto mění, zda budou metadata (EXIF, informace o skladbě atd.) z původního souboru zachována v konvertovaných souborech.", + "keep": "Zachovat", + "remove": "Odebrat" + }, + "quality": { + "label": "Kvalita konverze", + "description": "Toto mění výchozí výstupní kvalitu konvertovaných souborů (v jejich kategorii). Vyšší hodnoty mohou vést k delšímu času konverze a větší velikosti souboru.", + "video": "Toto mění výchozí výstupní kvalitu konvertovaných video souborů. Vyšší hodnoty mohou vést k delšímu času konverze a větší velikosti souboru.", + "audio": "Audio (kbps)", + "images": "Obrázek (%)" + }, + "rate": "Vzorkovací frekvence (Hz)", + "filename": { + "format": "Formát názvu souboru", + "description": "Toto určí název souboru při stažení, bez přípony souboru. Do formátu můžete vložit následující šablony, které budou nahrazeny příslušnými informacemi: %name% pro původní název souboru, %extension% pro původní příponu souboru a %date% pro datum, kdy byl soubor konvertován.", + "placeholder": "VERT_%name%" + } + }, + "vertd": { + "title": "Konverze videa", + "status": "stav:", + "loading": "načítání...", + "available": "dostupné, commit id {commitId}", + "unavailable": "nedostupné (je URL správná?)", + "description": { + "main": "Projekt vertd je serverový obal pro FFmpeg. To vám umožňuje konvertovat videa prostřednictvím pohodlného webového rozhraní VERT a zároveň využívat sílu vašeho GPU, abyste to udělali co nejrychleji.", + "info": "Pro vaše pohodlí hostujeme veřejnou instanci, ale pokud víte, co děláte, je docela snadné si ji hostovat sami na vašem PC nebo serveru. Serverové binárky si můžete stáhnout [vertd_link]zde[/vertd_link] - proces nastavení bude v budoucnu jednodušší, takže zůstaňte naladěni!" + }, + "instance": { + "custom": "Vlastní", + "label": "Instance", + "url_placeholder": "Příklad: http://localhost:24153", + "auto": "Automaticky (doporučeno)", + "eu": "Falkenstein, Německo", + "us": "Washington, USA" + }, + "conversion_speed": { + "speeds": { + "very_slow": "Velmi pomalá", + "slower": "Pomalejší", + "slow": "Pomalá", + "medium": "Střední", + "fast": "Rychlá", + "ultra_fast": "Ultra rychlá" + }, + "label": "Rychlost konverze", + "description": "Toto popisuje kompromis mezi rychlostí a kvalitou. Vyšší rychlosti povedou k nižší kvalitě, ale práci udělají rychleji." + } + }, + "privacy": { + "title": "Soukromí a data", + "plausible": { + "title": "Plausible analytika", + "description": "Používáme [plausible_link]Plausible[/plausible_link], nástroj pro analytiku zaměřený na ochranu soukromí, ke shromažďování zcela anonymních statistik. Všechna data jsou anonymizována a agregována a nikdy nejsou odesílány nebo ukládány žádné identifikovatelné informace. Analytiku můžete zobrazit [analytics_link]zde[/analytics_link] a níže se můžete rozhodnout odhlásit.", + "opt_in": "Souhlasím", + "opt_out": "Odhlásit se" + }, + "cache": { + "title": "Správa mezipaměti", + "description": "Ukládáme soubory konvertoru do mezipaměti vašeho prohlížeče, abyste je nemuseli stahovat pokaždé znovu, což zlepšuje výkon a snižuje využití dat.", + "refresh_cache": "Obnovit mezipaměť", + "clear_cache": "Vymazat mezipaměť", + "files_cached": "{size} ({count} souborů)", + "loading_cache": "Načítání...", + "total_size": "Celková velikost", + "files_cached_label": "Souborů v mezipaměti", + "cache_cleared": "Mezipaměť byla úspěšně vymazána!", + "cache_clear_error": "Selhalo vymazání mezipaměti." + }, + "site_data": { + "title": "Správa dat webu", + "description": "Vymažte všechna data webu včetně nastavení a souborů v mezipaměti, resetujte VERT do výchozího stavu a znovu načtěte stránku.", + "clear_all_data": "Vymazat všechna data webu", + "clear_all_data_confirm_title": "Vymazat všechna data webu?", + "clear_all_data_confirm": "Toto resetuje všechna nastavení a mezipaměť a poté znovu načte stránku. Tuto akci nelze vrátit zpět.", + "clear_all_data_cancel": "Zrušit", + "all_data_cleared": "Všechna data webu byla vymazána! Načítání stránky...", + "all_data_clear_error": "Selhalo vymazání všech dat webu." + } + } + }, + "about": { + "title": "O aplikaci", + "why": { + "title": "Proč VERT?", + "description": "Konvertory souborů nás vždy zklamaly. Jsou ošklivé, plné reklam a především; pomalé. Rozhodli jsme se tento problém vyřešit jednou provždy vytvořením alternativy, která řeší všechny tyto problémy a ještě víc.

Všechny ne-video soubory jsou konvertovány kompletně na vašem zařízení; to znamená, že není žádné zpoždění mezi odesláním a přijetím souborů ze serveru a my nikdy nemůžeme špehovat soubory, které konvertujete.

Video soubory jsou nahrány na náš bleskově rychlý server s RTX 4000 Ada. Vaše videa tam zůstanou hodinu, pokud je nekonvertujete. Pokud soubor konvertujete, video zůstane na serveru hodinu nebo dokud nebude staženo. Poté bude soubor z našeho serveru smazán." + }, + "sponsors": { + "title": "Sponzoři", + "description": "Chcete nás podpořit? Kontaktujte vývojáře na [discord_link]Discord[/discord_link] serveru nebo pošlete e-mail na", + "email_copied": "E-mail zkopírován do schránky!" + }, + "resources": { + "title": "Zdroje", + "discord": "Discord", + "source": "Zdrojový kód", + "email": "E-mail" + }, + "donate": { + "title": "Přispějte projektu VERT", + "description": "S vaší podporou můžeme pokračovat v údržbě a vylepšování VERT.", + "one_time": "Jednorázově", + "monthly": "Měsíčně", + "custom": "Vlastní částka", + "pay_now": "Zaplatit nyní", + "donate_amount": "Přispět ${amount} USD", + "thank_you": "Děkujeme za váš příspěvek!", + "payment_failed": "Platba selhala: {message}{period} Nebyli jste účtováni.", + "donation_error": "Při zpracování vašeho příspěvku došlo k chybě. Zkuste to prosím později.", + "payment_error": "Chyba při načítání platebních údajů. Zkuste to prosím později.", + "donation_notice_official": "Vaše příspěvky zde jdou oficiální instanci VERT (vert.sh) a pomáhají podporovat vývoj projektu.", + "donation_notice_unofficial": "Vaše příspěvky zde jdou provozovateli této instance VERT. Pokud chcete podpořit oficiální vývojáře VERT, navštivte prosím místo toho [official_link]vert.sh[/official_link]." + }, + "credits": { + "title": "Tvůrci", + "contact_team": "Pokud byste chtěli kontaktovat vývojový tým, použijte prosím e-mail uvedený na kartě \"Zdroje\".", + "notable_contributors": "Významní přispěvatelé", + "notable_description": "Chtěli bychom poděkovat těmto lidem za jejich významný přínos projektu VERT.", + "github_contributors": "Přispěvatelé na GitHubu", + "github_description": "Velké díky všem těmto lidem za pomoc! [github_link]Chcete pomoci také?[/github_link]", + "no_contributors": "Zdá se, že zatím nikdo nepřispěl... [contribute_link]buďte první, kdo přispěje![/contribute_link]", + "libraries": "Knihovny", + "libraries_description": "Velké díky FFmpeg (audio, video), ImageMagick (obrázky) a Pandoc (dokumenty) za udržování tak vynikajících knihoven po tolik let. VERT na nich spoléhá, aby vám mohl poskytovat vaše konverze.", + "roles": { + "lead_developer": "Vedoucí vývojář; backend konverze, implementace UI", + "developer": "Vývojář; implementace UI", + "designer": "Designer; UX, branding, marketing", + "docker_ci": "Údržba podpory Docker a CI", + "former_cofounder": "Bývalý spoluzakladatel a designer" + } + }, + "errors": { + "github_contributors": "Chyba při načítání přispěvatelů z GitHubu" + } + }, + "workers": { + "errors": { + "general": "Chyba při konverzi {file}: {message}", + "cancel": "Chyba při zrušení konverze {file}: {message}", + "magick": "Chyba v Magick workeru, konverze obrázků nemusí fungovat podle očekávání.", + "ffmpeg": "Chyba při načítání FFmpeg, některé funkce nemusí fungovat podle očekávání.", + "pandoc": "Chyba při načítání Pandoc workeru, konverze dokumentů nemusí fungovat podle očekávání.", + "no_audio": "Nebyl nalezen žádný audio stream.", + "invalid_rate": "Byla zadána neplatná vzorkovací frekvence: {rate}Hz", + "file_too_large": "Tento soubor překračuje limit prohlížeče/zařízení {limit} GB. Zkuste Firefox nebo Safari pro konverzi tohoto velkého souboru, které obvykle mají vyšší limity." + } + }, + "privacy": { + "title": "Zásady ochrany osobních údajů", + "summary": { + "title": "Shrnutí", + "description": "Zásady ochrany osobních údajů VERT jsou velmi jednoduché: vůbec neshromažďujeme ani neukládáme žádná data o vás. Nepoužíváme cookies ani sledovací nástroje, analytika je zcela soukromá a všechny konverze (kromě videí) probíhají lokálně ve vašem prohlížeči. Videa jsou smazána po stažení nebo po hodině, pokud nám výslovně nedáte svolení k jejich uložení; budou použita pouze pro účely řešení problémů. VERT samostatně hostuje instanci Coolify pro hostování webové stránky a vertd (pro konverzi videa) a instanci Plausible pro zcela anonymní a agregovanou analytiku. K zpracování příspěvků používáme Stripe, který může shromažďovat některá data používaná pro prevenci podvodů.

Poznámka: toto se může vztahovat pouze na oficiální instanci VERT na [vert_link]vert.sh[/vert_link]; instance třetích stran mohou s vašimi daty zacházet odlišně." + }, + "conversions": { + "title": "Konverze", + "description": "Většina konverzí (obrázky, dokumenty, audio) probíhá zcela lokálně na vašem zařízení pomocí WebAssembly verzí příslušných nástrojů (např. ImageMagick, Pandoc, FFmpeg). To znamená, že vaše soubory nikdy neopustí vaše zařízení a my k nim nikdy nebudeme mít přístup.

Konverze videí se provádějí na našich serverech, protože vyžadují větší výpočetní výkon a v prohlížeči je zatím nelze provádět velmi rychle. Videa, která konvertujete pomocí VERT, jsou smazána po stažení nebo po jedné hodině, pokud nám výslovně nedáte svolení k jejich uložení na delší dobu čistě pro účely řešení problémů." + }, + "donations": { + "title": "Příspěvky", + "description": "Na stránce [about_link]o aplikaci[/about_link] používáme Stripe ke shromažďování příspěvků. Stripe může shromažďovat určité informace o platbě a zařízení pro prevenci podvodů, jak je popsáno v [stripe_link]jejich dokumentaci o pokročilé detekci podvodů[/stripe_link]. Externí síťové požadavky na Stripe jsou odloženy a jsou provedeny až poté, co kliknete na tlačítko k platbě." + }, + "conversion_errors": { + "title": "Chyby konverze", + "description": "Když se konverze videa nezdaří, můžeme shromažďovat některá anonymní data, která nám pomohou diagnostikovat problém. Tato data mohou zahrnovat:", + "list_job_id": "ID úlohy, což je anonymizovaný název souboru", + "list_format_from": "Formát, ze kterého jste konvertovali", + "list_format_to": "Formát, do kterého jste konvertovali", + "list_stderr": "Výstup FFmpeg stderr z vaší úlohy (chybová zpráva)", + "list_video": "Skutečný video soubor (pokud je uděleno výslovné svolení)", + "footer": "Tyto informace jsou používány pouze pro účely diagnostiky problémů s konverzí. Skutečný video soubor bude shromážděn pouze tehdy, pokud nám k tomu udělíte svolení, kde bude použit pouze pro řešení problémů." + }, + "analytics": { + "title": "Analytika", + "description": "Samostatně hostujeme instanci Plausible pro zcela anonymní a agregovanou analytiku. Plausible nepoužívá cookies a dodržuje všechny hlavní předpisy o ochraně osobních údajů (GDPR/CCPA/PECR). Z analytiky se můžete odhlásit v sekci \"Soukromí a data\" v [settings_link]nastavení[/settings_link] a přečíst si více o postupech ochrany soukromí Plausible [plausible_link]zde[/plausible_link]." + }, + "local_storage": { + "title": "Lokální úložiště", + "description": "Používáme lokální úložiště vašeho prohlížeče k uložení vašich nastavení a úložiště relace vašeho prohlížeče k dočasnému uložení seznamu přispěvatelů z GitHubu pro sekci \"O aplikaci\", abychom snížili opakované požadavky na GitHub API. Žádná osobní data nejsou ukládána ani přenášena.

WebAssembly verze konverzních nástrojů, které používáme (FFmpeg, ImageMagick, Pandoc), jsou také uloženy lokálně ve vašem prohlížeči při první návštěvě webové stránky, takže je nemusíte stahovat při každé návštěvě. Žádná osobní data nejsou ukládána ani přenášena. Tato data můžete kdykoli zobrazit nebo smazat v sekci \"Soukromí a data\" v [settings_link]nastavení[/settings_link]." + }, + "contact": { + "title": "Kontakt", + "description": "Pro dotazy nám napište e-mail na: [email_link]hello@vert.sh[/email_link]. Pokud používáte instanci VERT třetí strany, kontaktujte prosím místo toho hostitele této instance." + }, + "last_updated": "Naposledy aktualizováno: 29. 10. 2025" + }, + "toast": { + "insecure_context": "Navštěvujete VERT v nezabezpečeném kontextu (např. přístup přes HTTP místo HTTPS). Některé funkce nemusí fungovat podle očekávání." + } +} diff --git a/messages/de.json b/messages/de.json index 0bb26378..0e4fe4b8 100644 --- a/messages/de.json +++ b/messages/de.json @@ -92,31 +92,37 @@ }, "errors": { "cant_convert": "Wir können diese Datei nicht konvertieren.", - "vertd_server": "Was machst du da..? Du solltest den vertd-Server ausführen!", - "vertd_generic_view": "Fehlerdetails anzeigen", - "vertd_generic_body": "Ein Fehler ist aufgetreten, während versucht wurde, dein Video zu konvertieren. Möchtest du dieses Video an die Entwickler senden, um bei der Behebung dieses Fehlers zu helfen? Nur die Videodatei wird gesendet. Es werden keine Identifikatoren hochgeladen.", - "vertd_generic_title": "Videokonvertierungsfehler", - "vertd_generic_yes": "Video senden", - "vertd_generic_no": "Nicht senden", - "vertd_failed_to_keep": "Das Video konnte nicht auf dem Server behalten werden: {error}", - "vertd_details": "Fehlerdetails anzeigen", - "vertd_details_body": "Wenn du auf Senden drückst, wird dein Video ebenfalls angehängt, zusammen mit dem Fehlerprotokoll, das uns immer zur Überprüfung gemeldet wird. Die folgenden Informationen sind das Protokoll, das wir automatisch erhalten:", - "vertd_details_footer": "Diese Informationen werden nur zur Fehlerbehebung verwendet und niemals weitergegeben. Sieh dir unsere [privacy_link]Datenschutzerklärung[/privacy_link] für weitere Details an.", - "vertd_details_job_id": "Job-ID: {jobId}", - "vertd_details_from": "Von Format: {from}", - "vertd_details_to": "Zu Format: {to}", - "vertd_details_error_message": "Fehlermeldung: [view_link]Fehlerprotokolle anzeigen[/view_link]", - "vertd_details_close": "Schließen", - "vertd_ratelimit": "Dein Video, '{filename}', konnte mehrmals nicht konvertiert werden. Um eine Überlastung des Servers zu vermeiden, wurden weitere Konvertierungsversuche für diese Datei vorübergehend blockiert. Bitte versuche es später erneut.", "unsupported_format": "Es werden nur Bild-, Video-, Audio- und Dokumentdateien unterstützt.", "format_output_only": "Dieses Format kann derzeit nur als Ausgabe (konvertiert zu), nicht als Eingabe verwendet werden.", - "vertd_not_found": "Konnte die vertd-Instanz nicht finden, um die Videokonvertierung zu starten. Bist du sicher, dass die Instanz-URL korrekt eingestellt ist?", "worker_downloading": "Der {type}-Konverter wird gerade initialisiert, bitte warte einen Moment.", "worker_error": "Beim Initialisieren des {type}-Konverters ist ein Fehler aufgetreten, bitte versuche es später erneut.", "worker_timeout": "Die Initialisierung des {type}-Konverters dauert länger als erwartet, bitte warte noch einen Moment oder lade die Seite neu.", "audio": "Audio", "doc": "Dokument", - "image": "Bild" + "image": "Bild", + "vertd": { + "server": "Was machst du da..? Du solltest den vertd-Server ausführen!", + "details": { + "view": "Fehlerdetails anzeigen", + "body": "Wenn du auf Senden drückst, wird dein Video ebenfalls angehängt, zusammen mit dem Fehlerprotokoll, das uns immer zur Überprüfung gemeldet wird. Die folgenden Informationen sind das Protokoll, das wir automatisch erhalten:", + "footer": "Diese Informationen werden nur zur Fehlerbehebung verwendet und niemals weitergegeben. Sieh dir unsere [privacy_link]Datenschutzerklärung[/privacy_link] für weitere Details an.", + "job_id": "Job-ID: {jobId}", + "from": "Von Format: {from}", + "to": "Zu Format: {to}", + "error_message": "Fehlermeldung: [view_link]Fehlerprotokolle anzeigen[/view_link]", + "close": "Schließen" + }, + "generic": { + "view": "Fehlerdetails anzeigen", + "body": "Ein Fehler ist aufgetreten, während versucht wurde, dein Video zu konvertieren. Möchtest du dieses Video an die Entwickler senden, um bei der Behebung dieses Fehlers zu helfen? Nur die Videodatei wird gesendet. Es werden keine Identifikatoren hochgeladen.", + "title": "Videokonvertierungsfehler", + "yes": "Video senden", + "no": "Nicht senden" + }, + "failed_to_keep": "Das Video konnte nicht auf dem Server behalten werden: {error}", + "ratelimit": "Dein Video, '{filename}', konnte mehrmals nicht konvertiert werden. Um eine Überlastung des Servers zu vermeiden, wurden weitere Konvertierungsversuche für diese Datei vorübergehend blockiert. Bitte versuche es später erneut.", + "not_found": "Konnte die vertd-Instanz nicht finden, um die Videokonvertierung zu starten. Bist du sicher, dass die Instanz-URL korrekt eingestellt ist?" + } } }, "settings": { @@ -126,39 +132,55 @@ }, "appearance": { "title": "Erscheinungsbild", - "brightness_theme": "Farbschema", - "brightness_description": "Möchtest du einen sonnigen Blendeffekt oder eine ruhige, einsame Nacht?", "light": "Hell", "dark": "Dunkel", - "effect_settings": "Effekteinstellungen", - "effect_description": "Möchtest du schicke Effekte oder eine eher statische Erfahrung?", "enable": "Animiert", - "disable": "Statisch" + "disable": "Statisch", + "brightness": { + "theme": "Farbschema", + "description": "Möchtest du einen sonnigen Blendeffekt oder eine ruhige, einsame Nacht?" + }, + "effect": { + "settings": "Effekteinstellungen", + "description": "Möchtest du schicke Effekte oder eine eher statische Erfahrung?" + }, + "language": { + "title": "Sprache", + "description": "Wähle deine bevorzugte Sprache für die VERT-Benutzeroberfläche." + } }, "conversion": { "title": "Konvertierung", "advanced_settings": "Erweiterte Einstellungen", - "filename_format": "Dateinamensformat", - "filename_description": "Dies bestimmt den Namen der Datei beim Herunterladen, ohne die Dateiendung. Du kannst folgende Platzhalter verwenden: %name% für den ursprünglichen Dateinamen, %extension% für die ursprüngliche Dateiendung und %date% für das Datum der Konvertierung.", - "placeholder": "VERT_%name%", - "default_format": "Standard-Format", - "default_format_enable": "Aktivieren", - "default_format_disable": "Deaktivieren", - "default_format_description": "Dies ändert das Format, das standardmäßig ausgewählt wird, wenn du eine Datei dieses Typs hochlädst.", - "default_format_image": "Bilder", - "default_format_video": "Videos", - "default_format_audio": "Audio", - "default_format_document": "Dokumente", - "metadata": "Metadaten", - "metadata_description": "Dies legt fest, ob Metadaten (EXIF, Song-Infos etc.) der Originaldatei in den konvertierten Dateien erhalten bleiben.", - "keep": "Behalten", - "remove": "Entfernen", - "quality": "Qualität", - "quality_description": "Dies ändert die Standard-Qualität der konvertierten Dateien. Höhere Werte können zu längeren Konvertierungszeiten und größeren Dateien führen.", - "quality_video": "Dies ändert die Standard-Qualität der konvertierten Videodateien. Höhere Werte können zu längeren Konvertierungszeiten und größeren Dateien führen.", - "quality_audio": "Audio (kbps)", - "quality_images": "Bild (%)", - "rate": "Abtastrate (Hz)" + "default_format": { + "image": "Bilder", + "audio": "Audio", + "document": "Dokumente", + "enable": "Aktivieren", + "disable": "Deaktivieren", + "label": "Standard-Format", + "description": "Dies ändert das Format, das standardmäßig ausgewählt wird, wenn du eine Datei dieses Typs hochlädst.", + "video": "Videos" + }, + "metadata": { + "label": "Metadaten", + "description": "Dies legt fest, ob Metadaten (EXIF, Song-Infos etc.) der Originaldatei in den konvertierten Dateien erhalten bleiben.", + "keep": "Behalten", + "remove": "Entfernen" + }, + "quality": { + "label": "Qualität", + "description": "Dies ändert die Standard-Qualität der konvertierten Dateien. Höhere Werte können zu längeren Konvertierungszeiten und größeren Dateien führen.", + "video": "Dies ändert die Standard-Qualität der konvertierten Videodateien. Höhere Werte können zu längeren Konvertierungszeiten und größeren Dateien führen.", + "audio": "Audio (kbps)", + "images": "Bild (%)" + }, + "rate": "Abtastrate (Hz)", + "filename": { + "format": "Dateinamensformat", + "description": "Dies bestimmt den Namen der Datei beim Herunterladen, ohne die Dateiendung. Du kannst folgende Platzhalter verwenden: %name% für den ursprünglichen Dateinamen, %extension% für die ursprüngliche Dateiendung und %date% für das Datum der Konvertierung.", + "placeholder": "VERT_%name%" + } }, "vertd": { "title": "Videokonvertierung", @@ -166,53 +188,61 @@ "loading": "lädt...", "available": "verfügbar, Commit-ID {commitId}", "unavailable": "nicht verfügbar (ist die URL korrekt?)", - "description": "Das Projekt vertd ist ein Server-Wrapper für FFmpeg. Dies ermöglicht es dir, Videos bequem über die Weboberfläche von VERT zu konvertieren und dabei die Leistung deiner GPU für maximale Geschwindigkeit zu nutzen.", - "hosting_info": "Wir hosten eine öffentliche Instanz für deine Bequemlichkeit, aber es ist einfach, eine eigene auf deinem PC oder Server zu hosten, wenn du weißt, was du tust. Du kannst die Server-Binärdateien [vertd_link]hier[/vertd_link] herunterladen – der Einrichtungsprozess wird in Zukunft noch einfacher!", - "instance": "Instanz", - "url_placeholder": "Beispiel: http://localhost:24153", - "conversion_speed": "Konvertierungsgeschwindigkeit", - "speed_description": "Dies beschreibt den Kompromiss zwischen Geschwindigkeit und Qualität. Schnellere Einstellungen führen zu geringerer Qualität, erledigen die Aufgabe aber schneller.", - "speeds": { - "very_slow": "Sehr langsam", - "slower": "Langsamer", - "slow": "Langsam", - "medium": "Mittel", - "fast": "Schnell", - "ultra_fast": "Ultraschnell" + "description": { + "main": "Das Projekt vertd ist ein Server-Wrapper für FFmpeg. Dies ermöglicht es dir, Videos bequem über die Weboberfläche von VERT zu konvertieren und dabei die Leistung deiner GPU für maximale Geschwindigkeit zu nutzen.", + "info": "Wir hosten eine öffentliche Instanz für deine Bequemlichkeit, aber es ist einfach, eine eigene auf deinem PC oder Server zu hosten, wenn du weißt, was du tust. Du kannst die Server-Binärdateien [vertd_link]hier[/vertd_link] herunterladen – der Einrichtungsprozess wird in Zukunft noch einfacher!" + }, + "instance": { + "custom": "Benutzerdefiniert", + "label": "Instanz", + "url_placeholder": "Beispiel: http://localhost:24153", + "auto": "Automatisch (empfohlen)", + "eu": "Falkenstein, Deutschland", + "us": "Washington, USA" }, - "auto_instance": "Automatisch (empfohlen)", - "eu_instance": "Falkenstein, Deutschland", - "us_instance": "Washington, USA", - "custom_instance": "Benutzerdefiniert" + "conversion_speed": { + "speeds": { + "very_slow": "Sehr langsam", + "slower": "Langsamer", + "slow": "Langsam", + "medium": "Mittel", + "fast": "Schnell", + "ultra_fast": "Ultraschnell" + }, + "label": "Konvertierungsgeschwindigkeit", + "description": "Dies beschreibt den Kompromiss zwischen Geschwindigkeit und Qualität. Schnellere Einstellungen führen zu geringerer Qualität, erledigen die Aufgabe aber schneller." + } }, "privacy": { "title": "Datenschutz & Daten", - "plausible_title": "Plausible Analytics", - "plausible_description": "Wir verwenden [plausible_link]Plausible[/plausible_link], ein datenschutzorientiertes Analysetool, um vollständig anonyme Statistiken zu sammeln. Alle Daten werden anonymisiert und aggregiert; es werden niemals identifizierbare Informationen gesendet oder gespeichert. Du kannst die Analysen [analytics_link]hier[/analytics_link] einsehen und dich unten abmelden.", - "opt_in": "Einwilligen", - "opt_out": "Ablehnen", - "cache_title": "Cache-Verwaltung", - "cache_description": "Wir speichern die Konverter-Dateien in deinem Browser-Cache, damit du sie nicht jedes Mal neu herunterladen musst. Das verbessert die Leistung und spart Datenvolumen.", - "refresh_cache": "Cache aktualisieren", - "clear_cache": "Cache leeren", - "files_cached": "{size} ({count} Dateien)", - "loading_cache": "Lädt...", - "total_size": "Gesamtgröße", - "files_cached_label": "Gecachte Dateien", - "cache_cleared": "Cache erfolgreich geleert!", - "cache_clear_error": "Fehler beim Leeren des Caches.", - "site_data_title": "Seitendaten-Verwaltung", - "site_data_description": "Lösche alle Seitendaten einschließlich Einstellungen und gecachten Dateien, um VERT auf den Standardzustand zurückzusetzen und die Seite neu zu laden.", - "clear_all_data": "Alle Seitendaten löschen", - "clear_all_data_confirm_title": "Alle Seitendaten löschen?", - "clear_all_data_confirm": "Dies setzt alle Einstellungen und den Cache zurück und lädt die Seite neu. Diese Aktion kann nicht rückgängig gemacht werden.", - "clear_all_data_cancel": "Abbrechen", - "all_data_cleared": "Alle Daten gelöscht! Seite wird neu geladen...", - "all_data_clear_error": "Fehler beim Löschen der Seitendaten." - }, - "language": { - "title": "Sprache", - "description": "Wähle deine bevorzugte Sprache für die VERT-Benutzeroberfläche." + "plausible": { + "title": "Plausible Analytics", + "description": "Wir verwenden [plausible_link]Plausible[/plausible_link], ein datenschutzorientiertes Analysetool, um vollständig anonyme Statistiken zu sammeln. Alle Daten werden anonymisiert und aggregiert; es werden niemals identifizierbare Informationen gesendet oder gespeichert. Du kannst die Analysen [analytics_link]hier[/analytics_link] einsehen und dich unten abmelden.", + "opt_in": "Einwilligen", + "opt_out": "Ablehnen" + }, + "cache": { + "title": "Cache-Verwaltung", + "description": "Wir speichern die Konverter-Dateien in deinem Browser-Cache, damit du sie nicht jedes Mal neu herunterladen musst. Das verbessert die Leistung und spart Datenvolumen.", + "refresh_cache": "Cache aktualisieren", + "clear_cache": "Cache leeren", + "files_cached": "{size} ({count} Dateien)", + "loading_cache": "Lädt...", + "total_size": "Gesamtgröße", + "files_cached_label": "Gecachte Dateien", + "cache_cleared": "Cache erfolgreich geleert!", + "cache_clear_error": "Fehler beim Leeren des Caches." + }, + "site_data": { + "title": "Seitendaten-Verwaltung", + "description": "Lösche alle Seitendaten einschließlich Einstellungen und gecachten Dateien, um VERT auf den Standardzustand zurückzusetzen und die Seite neu zu laden.", + "clear_all_data": "Alle Seitendaten löschen", + "clear_all_data_confirm_title": "Alle Seitendaten löschen?", + "clear_all_data_confirm": "Dies setzt alle Einstellungen und den Cache zurück und lädt die Seite neu. Diese Aktion kann nicht rückgängig gemacht werden.", + "clear_all_data_cancel": "Abbrechen", + "all_data_cleared": "Alle Daten gelöscht! Seite wird neu geladen...", + "all_data_clear_error": "Fehler beim Löschen der Seitendaten." + } } }, "about": { diff --git a/messages/el.json b/messages/el.json index 49cc484f..b06a4f68 100644 --- a/messages/el.json +++ b/messages/el.json @@ -77,20 +77,24 @@ }, "errors": { "cant_convert": "Δεν μπορούμε να μετατρέψουμε αυτό το αρχείο.", - "vertd_server": "τι κάνεις...; υποτίθεται ότι πρέπει να εκτελέσεις τον σέρβερ vertd!", - "vertd_generic_body": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια μετατροπής του βίντεό σας. Θέλετε να υποβάλετε αυτό το βίντεο στους προγραμματιστές για να βοηθήσετε στη διόρθωση αυτού του σφάλματος; Θα αποσταλεί μόνο το αρχείο βίντεό σας. Δεν θα μεταφορτωθούν αναγνωριστικά.", - "vertd_generic_title": "Σφάλμα μετατροπής βίντεο", - "vertd_generic_yes": "Υποβολή βίντεο", - "vertd_generic_no": "Μην υποβάλετε", - "vertd_failed_to_keep": "Αποτυχία διατήρησης του βίντεο στον σέρβερ: {error}", "unsupported_format": "Υποστηρίζονται μόνο αρχεία εικόνας, βίντεο, ήχου και εγγράφων", - "vertd_not_found": "Δεν ήταν δυνατή η εύρεση της παρουσίας vertd για την έναρξη της μετατροπής βίντεο. Είστε βέβαιοι ότι η διεύθυνση URL έχει ρυθμιστεί σωστά;", "worker_downloading": "Ο μετατροπέας {type} αρχικοποιείται αυτή τη στιγμή, παρακαλώ περιμένετε λίγο.", "worker_error": "Ο μετατροπέας {type} αντιμετώπισε σφάλμα κατά την αρχικοποίηση, παρακαλώ δοκιμάστε ξανά αργότερα.", "worker_timeout": "Ο μετατροπέας {type} χρειάζεται περισσότερο χρόνο από το αναμενόμενο για να αρχικοποιηθεί, παρακαλώ περιμένετε λίγο ακόμη ή ανανεώστε τη σελίδα.", "audio": "ήχου", "doc": "εγγράφου", - "image": "εικόνας" + "image": "εικόνας", + "vertd": { + "server": "τι κάνεις...; υποτίθεται ότι πρέπει να εκτελέσεις τον σέρβερ vertd!", + "generic": { + "body": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια μετατροπής του βίντεό σας. Θέλετε να υποβάλετε αυτό το βίντεο στους προγραμματιστές για να βοηθήσετε στη διόρθωση αυτού του σφάλματος; Θα αποσταλεί μόνο το αρχείο βίντεό σας. Δεν θα μεταφορτωθούν αναγνωριστικά.", + "title": "Σφάλμα μετατροπής βίντεο", + "yes": "Υποβολή βίντεο", + "no": "Μην υποβάλετε" + }, + "failed_to_keep": "Αποτυχία διατήρησης του βίντεο στον σέρβερ: {error}", + "not_found": "Δεν ήταν δυνατή η εύρεση της παρουσίας vertd για την έναρξη της μετατροπής βίντεο. Είστε βέβαιοι ότι η διεύθυνση URL έχει ρυθμιστεί σωστά;" + } } }, "settings": { @@ -100,37 +104,53 @@ }, "appearance": { "title": "Εμφάνιση", - "brightness_theme": "Θέμα φωτεινότητας", - "brightness_description": "Θέλετε μια ηλιόλουστη λάμψη ή μια ήσυχη μοναχική νύχτα;", "light": "Φωτεινό", "dark": "Σκούρο", - "effect_settings": "Ρυθμίσεις εφέ", - "effect_description": "Θα θέλατε φανταχτερά εφέ ή μια πιο στατική εμπειρία;", "enable": "Ενεργοποίηση", - "disable": "Απενεργοποίηση" + "disable": "Απενεργοποίηση", + "brightness": { + "theme": "Θέμα φωτεινότητας", + "description": "Θέλετε μια ηλιόλουστη λάμψη ή μια ήσυχη μοναχική νύχτα;" + }, + "effect": { + "settings": "Ρυθμίσεις εφέ", + "description": "Θα θέλατε φανταχτερά εφέ ή μια πιο στατική εμπειρία;" + }, + "language": { + "title": "Γλώσσα", + "description": "Επιλέξτε την προτιμώμενη γλώσσα σας για το περιβάλλον του VERT." + } }, "conversion": { "title": "Μετατροπή", "advanced_settings": "Προηγμένες ρυθμίσεις", - "filename_format": "Μορφή ονόματος αρχείου", - "filename_description": "Αυτό θα καθορίσει το όνομα του αρχείου κατά τη λήψη, χωρίς να περιλαμβάνει την επέκταση αρχείου. Μπορείτε να τοποθετήσετε τα ακόλουθα πρότυπα στη μορφή, τα οποία θα αντικατασταθούν με τις σχετικές πληροφορίες: %name% για το αρχικό όνομα αρχείου, %extension% για την αρχική επέκταση αρχείου και %date% για μια συμβολοσειρά ημερομηνίας του πότε μετατράπηκε το αρχείο.", - "placeholder": "VERT_%name%", - "default_format": "Προεπιλεγμένη μορφή μετατροπής", - "default_format_description": "Αυτό θα αλλάξει την προεπιλεγμένη μορφή που επιλέγεται όταν ανεβάζετε ένα αρχείο αυτού του τύπου.", - "default_format_image": "Εικόνες", - "default_format_video": "Βίντεο", - "default_format_audio": "Ήχος", - "default_format_document": "Έγγραφα", - "metadata": "Μεταδεδομένα αρχείου", - "metadata_description": "Αυτό αλλάζει το αν τυχόν μεταδεδομένα (EXIF, πληροφορίες τραγουδιού κ.λπ.) στο αρχικό αρχείο διατηρούνται στα μετατρεπόμενα αρχεία.", - "keep": "Διατήρηση", - "remove": "Αφαίρεση", - "quality": "Ποιότητα μετατροπής", - "quality_description": "Αυτό αλλάζει την προεπιλεγμένη ποιότητα εξόδου των μετατρεπόμενων αρχείων (στην κατηγορία του). Υψηλότερες τιμές μπορεί να οδηγήσουν σε μεγαλύτερους χρόνους μετατροπής και μέγεθος αρχείου.", - "quality_video": "Αυτό αλλάζει την προεπιλεγμένη ποιότητα εξόδου των μετατρεπόμενων αρχείων βίντεο. Υψηλότερες τιμές μπορεί να οδηγήσουν σε μεγαλύτερους χρόνους μετατροπής και μέγεθος αρχείου.", - "quality_audio": "Ήχος (kbps)", - "quality_images": "Εικόνα (%)", - "rate": "Ρυθμός δειγματοληψίας (Hz)" + "default_format": { + "image": "Εικόνες", + "audio": "Ήχος", + "document": "Έγγραφα", + "label": "Προεπιλεγμένη μορφή μετατροπής", + "description": "Αυτό θα αλλάξει την προεπιλεγμένη μορφή που επιλέγεται όταν ανεβάζετε ένα αρχείο αυτού του τύπου.", + "video": "Βίντεο" + }, + "metadata": { + "label": "Μεταδεδομένα αρχείου", + "description": "Αυτό αλλάζει το αν τυχόν μεταδεδομένα (EXIF, πληροφορίες τραγουδιού κ.λπ.) στο αρχικό αρχείο διατηρούνται στα μετατρεπόμενα αρχεία.", + "keep": "Διατήρηση", + "remove": "Αφαίρεση" + }, + "quality": { + "label": "Ποιότητα μετατροπής", + "description": "Αυτό αλλάζει την προεπιλεγμένη ποιότητα εξόδου των μετατρεπόμενων αρχείων (στην κατηγορία του). Υψηλότερες τιμές μπορεί να οδηγήσουν σε μεγαλύτερους χρόνους μετατροπής και μέγεθος αρχείου.", + "video": "Αυτό αλλάζει την προεπιλεγμένη ποιότητα εξόδου των μετατρεπόμενων αρχείων βίντεο. Υψηλότερες τιμές μπορεί να οδηγήσουν σε μεγαλύτερους χρόνους μετατροπής και μέγεθος αρχείου.", + "audio": "Ήχος (kbps)", + "images": "Εικόνα (%)" + }, + "rate": "Ρυθμός δειγματοληψίας (Hz)", + "filename": { + "format": "Μορφή ονόματος αρχείου", + "description": "Αυτό θα καθορίσει το όνομα του αρχείου κατά τη λήψη, χωρίς να περιλαμβάνει την επέκταση αρχείου. Μπορείτε να τοποθετήσετε τα ακόλουθα πρότυπα στη μορφή, τα οποία θα αντικατασταθούν με τις σχετικές πληροφορίες: %name% για το αρχικό όνομα αρχείου, %extension% για την αρχική επέκταση αρχείου και %date% για μια συμβολοσειρά ημερομηνίας του πότε μετατράπηκε το αρχείο.", + "placeholder": "VERT_%name%" + } }, "vertd": { "title": "Μετατροπή βίντεο", @@ -138,45 +158,51 @@ "loading": "φόρτωση...", "available": "διαθέσιμο, αναγνωριστικό έκδοσης {commitId}", "unavailable": "μη διαθέσιμο (είναι σωστή η διεύθυνση url;)", - "description": "Το έργο vertd είναι ένα περιτύλιγμα σέρβερ για το FFmpeg. Αυτό σας επιτρέπει να μετατρέπετε βίντεο μέσω της ευκολίας της διεπαφής ιστού του VERT, ενώ εξακολουθείτε να μπορείτε να αξιοποιήσετε τη δύναμη της GPU σας για να το κάνετε όσο το δυνατόν πιο γρήγορα.", - "hosting_info": "Φιλοξενούμε μια δημόσια σελίδα για τη διευκόλυνσή σας, αλλά είναι αρκετά εύκολο να φιλοξενήσετε τη δική σας στον υπολογιστή ή τον σέρβερ σας αν γνωρίζετε τι κάνετε. Μπορείτε να κατεβάσετε τα δυαδικά αρχεία του σέρβερ [vertd_link]εδώ[/vertd_link] - η διαδικασία ρύθμισης θα γίνει ευκολότερη στο μέλλον, οπότε μείνετε συντονισμένοι!", - "instance": "Παρουσία", - "url_placeholder": "Παράδειγμα: http://localhost:24153", - "conversion_speed": "Ταχύτητα μετατροπής", - "speed_description": "Αυτό περιγράφει τον συμβιβασμό μεταξύ ταχύτητας και ποιότητας. Ταχύτερες ταχύτητες θα έχουν ως αποτέλεσμα χαμηλότερη ποιότητα, αλλά θα ολοκληρώσουν τη δουλειά γρηγορότερα.", - "speeds": { - "very_slow": "Πολύ αργή", - "slower": "Αργότερη", - "slow": "Αργή", - "medium": "Μέτρια", - "fast": "Γρήγορη", - "ultra_fast": "Πολύ γρήγορη" + "description": { + "main": "Το έργο vertd είναι ένα περιτύλιγμα σέρβερ για το FFmpeg. Αυτό σας επιτρέπει να μετατρέπετε βίντεο μέσω της ευκολίας της διεπαφής ιστού του VERT, ενώ εξακολουθείτε να μπορείτε να αξιοποιήσετε τη δύναμη της GPU σας για να το κάνετε όσο το δυνατόν πιο γρήγορα.", + "info": "Φιλοξενούμε μια δημόσια σελίδα για τη διευκόλυνσή σας, αλλά είναι αρκετά εύκολο να φιλοξενήσετε τη δική σας στον υπολογιστή ή τον σέρβερ σας αν γνωρίζετε τι κάνετε. Μπορείτε να κατεβάσετε τα δυαδικά αρχεία του σέρβερ [vertd_link]εδώ[/vertd_link] - η διαδικασία ρύθμισης θα γίνει ευκολότερη στο μέλλον, οπότε μείνετε συντονισμένοι!" + }, + "instance": { + "custom": "Προσαρμοσμένη", + "label": "Παρουσία", + "url_placeholder": "Παράδειγμα: http://localhost:24153", + "auto": "Αυτόματη (συνιστάται)", + "eu": "Falkenstein, Γερμανία", + "us": "Washington, ΗΠΑ" }, - "auto_instance": "Αυτόματη (συνιστάται)", - "eu_instance": "Falkenstein, Γερμανία", - "us_instance": "Washington, ΗΠΑ", - "custom_instance": "Προσαρμοσμένη" + "conversion_speed": { + "speeds": { + "very_slow": "Πολύ αργή", + "slower": "Αργότερη", + "slow": "Αργή", + "medium": "Μέτρια", + "fast": "Γρήγορη", + "ultra_fast": "Πολύ γρήγορη" + }, + "label": "Ταχύτητα μετατροπής", + "description": "Αυτό περιγράφει τον συμβιβασμό μεταξύ ταχύτητας και ποιότητας. Ταχύτερες ταχύτητες θα έχουν ως αποτέλεσμα χαμηλότερη ποιότητα, αλλά θα ολοκληρώσουν τη δουλειά γρηγορότερα." + } }, "privacy": { "title": "Απόρρητο & δεδομένα", - "plausible_title": "Αναλυτικά στοιχεία Plausible", - "plausible_description": "Χρησιμοποιούμε το [plausible_link]Plausible[/plausible_link], ένα εργαλείο αναλυτικών που εστιάζει στο απόρρητο, για τη συλλογή εντελώς ανώνυμων στατιστικών. Όλα τα δεδομένα είναι ανωνυμοποιημένα και συγκεντρωτικά και δεν αποστέλλονται ούτε αποθηκεύονται ποτέ αναγνωρίσιμες πληροφορίες. Μπορείτε να δείτε τα αναλυτικά στοιχεία [analytics_link]εδώ[/analytics_link] και να επιλέξετε να εξαιρεθείτε παρακάτω.", - "opt_in": "Συμμετοχή", - "opt_out": "Εξαίρεση", - "cache_title": "Διαχείριση προσωρινής μνήμης", - "cache_description": "Αποθηκεύουμε προσωρινά τα αρχεία μετατροπέα στο πρόγραμμα περιήγησής σας, ώστε να μην χρειάζεται να τα κατεβάζετε ξανά κάθε φορά, βελτιώνοντας την απόδοση και μειώνοντας τη χρήση δεδομένων.", - "refresh_cache": "Ανανέωση προσωρινής μνήμης", - "clear_cache": "Εκκαθάριση προσωρινής μνήμης", - "files_cached": "{size} ({count} αρχεία)", - "loading_cache": "Φόρτωση...", - "total_size": "Συνολικό μέγεθος", - "files_cached_label": "Αρχεία σε προσωρινή μνήμη", - "cache_cleared": "Η προσωρινή μνήμη εκκαθαρίστηκε επιτυχώς!", - "cache_clear_error": "Αποτυχία εκκαθάρισης προσωρινής μνήμης." - }, - "language": { - "title": "Γλώσσα", - "description": "Επιλέξτε την προτιμώμενη γλώσσα σας για το περιβάλλον του VERT." + "plausible": { + "title": "Αναλυτικά στοιχεία Plausible", + "description": "Χρησιμοποιούμε το [plausible_link]Plausible[/plausible_link], ένα εργαλείο αναλυτικών που εστιάζει στο απόρρητο, για τη συλλογή εντελώς ανώνυμων στατιστικών. Όλα τα δεδομένα είναι ανωνυμοποιημένα και συγκεντρωτικά και δεν αποστέλλονται ούτε αποθηκεύονται ποτέ αναγνωρίσιμες πληροφορίες. Μπορείτε να δείτε τα αναλυτικά στοιχεία [analytics_link]εδώ[/analytics_link] και να επιλέξετε να εξαιρεθείτε παρακάτω.", + "opt_in": "Συμμετοχή", + "opt_out": "Εξαίρεση" + }, + "cache": { + "title": "Διαχείριση προσωρινής μνήμης", + "description": "Αποθηκεύουμε προσωρινά τα αρχεία μετατροπέα στο πρόγραμμα περιήγησής σας, ώστε να μην χρειάζεται να τα κατεβάζετε ξανά κάθε φορά, βελτιώνοντας την απόδοση και μειώνοντας τη χρήση δεδομένων.", + "refresh_cache": "Ανανέωση προσωρινής μνήμης", + "clear_cache": "Εκκαθάριση προσωρινής μνήμης", + "files_cached": "{size} ({count} αρχεία)", + "loading_cache": "Φόρτωση...", + "total_size": "Συνολικό μέγεθος", + "files_cached_label": "Αρχεία σε προσωρινή μνήμη", + "cache_cleared": "Η προσωρινή μνήμη εκκαθαρίστηκε επιτυχώς!", + "cache_clear_error": "Αποτυχία εκκαθάρισης προσωρινής μνήμης." + } } }, "about": { @@ -241,4 +267,4 @@ "invalid_rate": "Καθορίστηκε μη έγκυρος ρυθμός δειγματοληψίας: {rate}Hz" } } -} \ No newline at end of file +} diff --git a/messages/en.json b/messages/en.json index ff2d4065..63105d80 100644 --- a/messages/en.json +++ b/messages/en.json @@ -15,7 +15,7 @@ }, "upload": { "title": "The file converter you'll love.", - "subtitle": "All image, audio, and document processing is done on your device. Videos are converted on our lightning-fast servers. No file size limit, no ads, and completely open source.", + "subtitle": "All file processing is done on your device. No file size limit, no ads, and completely open source.", "uploader": { "text": "Drop or click to {action}", "convert": "convert" @@ -26,11 +26,12 @@ "audio": "Audio", "documents": "Documents", "video": "Video", - "video_server_processing": "Server supported", + "video_server_processing": "Local & server supported", "local_supported": "Local supported", "status": { "text": "Status: {status}", "ready": "ready", + "partially_ready": "partially ready", "not_ready": "not ready", "not_initialized": "not initialized", "downloading": "downloading...", @@ -43,7 +44,7 @@ "partial_support": "This format can only be converted as {direction}.", "direction_input": "input (from)", "direction_output": "output (to)", - "video_server_processing": "Video uploads to a server for processing by default, learn how to set it up locally here." + "video_server_processing": "When possible, VERT converts videos locally in your browser. Some conversions may require server-side processing, learn how to set it up locally here." } }, "convert": { @@ -58,16 +59,23 @@ "image": "image", "extract_error": "Error extracting {filename}: {error}" }, + "image_sequence": { + "image_sequence": "Image Sequence", + "fps": "FPS", + "transparency": "Transparency" + }, "large_file_warning": "Due to browser / device limitations, video to audio conversion is disabled for this file as it is larger than {limit}GB. We recommend using Firefox or Safari for files of this size since they have less limitations.", "external_warning": { "title": "External server warning", - "text": "If you choose to convert into a video format, those files will be uploaded to an external server to be converted. Do you want to continue?", - "yes": "Yes", - "no": "No" + "text": "Converting {filename} with its current settings is not supported locally and requires server-side processing. Do you want to continue?", + "yes": "Convert on server", + "no": "Cancel conversion", + "dont_show_again": "Convert & don't show again" }, "panel": { "convert_all": "Convert all", "download_all": "Download all as .zip", + "download_all_toast": "Zipping {count} files ({size}MB) for download. This may take a while for larger files (which may be streamed).", "remove_all": "Remove all files", "set_all_to": "Set all to", "na": "N/A" @@ -79,7 +87,84 @@ "image": "Image", "placeholder": "Search format", "no_formats": "No formats available", - "no_results": "No formats match your search" + "no_results": "No formats match your search", + "fallback": "An error occurred loading available categories & formats, showing everything." + }, + "settings": { + "settings": "Settings", + "title": "File conversion settings", + "description": "Change the conversion settings for {filename} with the selected converter. These settings may not be available for all formats. This is an early beta and may have some issues.", + "all_files": "all files", + "none": "No settings available for this format.", + "converter": "Converter", + "image": { + "quality": "Quality", + "depth": "Color depth", + "color_space": "Color space", + "transparency": "Transparency", + "single_size": "Single size image" + }, + "audio": { + "bitrate": { + "label": "Bitrate (kbps)", + "placeholder": "Custom bitrate" + }, + "sample_rate": { + "label": "Sample rate (Hz)", + "placeholder": "Custom sample rate" + }, + "channels": { + "label": "Audio channels", + "placeholder": "Custom audio channels" + }, + "tracks": { + "label": "Audio tracks", + "placeholder": "Custom audio tracks" + } + }, + "video": { + "quality": "Quality", + "metadata": "Metadata", + "speed": { + "title": "Conversion speed", + "description": "This will be overridden if you manually set the bitrate or resolution below - selecting options other than \"auto\".", + "very_slow": "Highest quality (slowest)", + "slower": "Higher quality (slower)", + "slow": "High quality (slow)", + "medium": "Medium quality (average)", + "fast": "Lower quality (faster)", + "ultra_fast": "Lowest quality (fastest)" + }, + "fps": { + "label": "Frame rate (FPS)", + "placeholder": "Custom frame rate" + }, + "resolution": { + "label": "Resolution", + "placeholder": "Custom resolution" + }, + "bitrate": { + "video": "Video bitrate (kbps)", + "audio": "Audio bitrate (kbps)", + "placeholder": "Custom bitrate" + }, + "sample_rate": { + "label": "Audio sample rate (Hz)", + "placeholder": "Custom sample rate" + }, + "codec": { + "video": "Video codec", + "audio": "Audio codec" + } + }, + "document": { + "something": "Something" + }, + "common": { + "metadata": "Metadata", + "auto": "Auto", + "custom": "Custom" + } }, "tooltips": { "unknown_file": "Unknown file type", @@ -92,31 +177,47 @@ }, "errors": { "cant_convert": "We can't convert this file.", - "vertd_server": "what are you doing..? you're supposed to run the vertd server!", - "vertd_generic_view": "View error details", - "vertd_generic_body": "An error occurred whilst whilst trying convert your video. Would you like to submit this video to the developers to help fix this bug? Only your video file will be sent. No identifiers will be uploaded.", - "vertd_generic_title": "Video conversion error", - "vertd_generic_yes": "Submit video", - "vertd_generic_no": "Don't submit", - "vertd_failed_to_keep": "Failed to keep the video on the server: {error}", - "vertd_details": "View error details", - "vertd_details_body": "If you press submit, your video will also be attached alongside the error log which is always reported to us for review. The following information is the log that we automatically receive:", - "vertd_details_footer": "This information will only be used for troubleshooting purposes and will never be shared. View our [privacy_link]privacy policy[/privacy_link] for more details.", - "vertd_details_job_id": "Job ID: {jobId}", - "vertd_details_from": "From format: {from}", - "vertd_details_to": "To format: {to}", - "vertd_details_error_message": "Error message: [view_link]View error logs[/view_link]", - "vertd_details_close": "Close", - "vertd_ratelimit": "Your video, '{filename}', has failed to convert a few times. To prevent server overload, further conversion attempts for this file have been temporarily blocked. Please try again later.", + "converter_fallback": { + "title": "Change converter?", + "body": "Conversion failed for {filename}. Would you like to try the next compatible converter {converter}?", + "yes": "Next converter", + "no": "Cancel conversion", + "all_failed": "All compatible converters failed for {filename}. Conversion has been cancelled." + }, "unsupported_format": "Only image, video, audio, and document files are supported", "format_output_only": "This format can currently only be used as output (converted to), not as input.", - "vertd_not_found": "Could not find the vertd instance to start video conversion. Are you sure the instance URL is set correctly?", "worker_downloading": "The {type} converter is currently being initialized, please wait a few moments.", "worker_error": "The {type} converter had an error during initialization, please try again later.", "worker_timeout": "The {type} converter is taking longer than expected to initialize, please wait a few more moments or refresh the page.", "audio": "audio", "doc": "document", - "image": "image" + "image": "image", + "video": "video", + "vertd": { + "server": "what are you doing..? you're supposed to run the vertd server!", + "not_found": "Could not find the vertd instance to start video conversion. Are you sure the instance URL is set correctly?", + "ratelimit": "Your video, '{filename}', has failed to convert a few times. To prevent server overload, further conversion attempts for this file have been temporarily blocked. Please try again later.", + "file_too_large": "This file is too big for the specified vertd server ({fileSize}/{limit}). Please choose a smaller file or use another converter/server.", + "failed_to_keep": "Failed to keep the video on the server: {error}", + "retry": "Retrying video conversion for {filename} with different settings due to failure. This may take longer than usual.", + "generic": { + "title": "Video conversion error", + "view": "View error details", + "body": "An error occurred whilst whilst trying to convert your video. Would you like to submit this video to the developers to help fix this bug? Only your video file will be sent and no identifiers will be uploaded.", + "yes": "Submit video", + "no": "Don't submit" + }, + "details": { + "view": "View error details", + "body": "If you press submit, your video will also be attached alongside the error log which is always reported to us for review. The following information is the log that we automatically receive:", + "footer": "This information will only be used for troubleshooting purposes and will never be shared. View our [privacy_link]privacy policy[/privacy_link] for more details.", + "close": "Close", + "job_id": "Job ID: {jobId}", + "from": "From format: {from}", + "to": "To format: {to}", + "error_message": "Error message: [view_link]View error logs[/view_link]" + } + } } }, "settings": { @@ -126,100 +227,129 @@ }, "appearance": { "title": "Appearance", - "brightness_theme": "Brightness theme", - "brightness_description": "Want a sunny flash-bang, or a quiet lonely night?", + "brightness": { + "theme": "Brightness theme", + "description": "Want a sunny flash-bang, or a quiet lonely night?" + }, "light": "Light", "dark": "Dark", - "effect_settings": "Effect settings", - "effect_description": "Would you like fancy effects, or a more static experience?", + "effect": { + "settings": "Effect settings", + "description": "Would you like fancy effects, or a more static experience?" + }, "enable": "Enable", - "disable": "Disable" + "disable": "Disable", + "language": { + "title": "Language", + "description": "Select your preferred language for the VERT interface." + } }, "conversion": { "title": "Conversion", "advanced_settings": "Advanced settings", - "filename_format": "File name format", - "filename_description": "This will determine the name of the file on download, not including the file extension. You can put these following templates in the format, which will be replaced with the relevant information: %name% for the original file name, %extension% for the original file extension, and %date% for a date string of when the file was converted.", - "placeholder": "VERT_%name%", - "default_format": "Default conversion format", - "default_format_enable": "Enable", - "default_format_disable": "Disable", - "default_format_description": "This will change the default format selected when you upload a file of this file type.", - "default_format_image": "Images", - "default_format_video": "Videos", - "default_format_audio": "Audio", - "default_format_document": "Documents", - "metadata": "File metadata", - "metadata_description": "This changes whether any metadata (EXIF, song info, etc.) on the original file is preserved in converted files.", - "keep": "Keep", - "remove": "Remove", - "quality": "Conversion quality", - "quality_description": "This changes the default output quality of the converted files (in its category). Higher values may result in longer conversion times and file size.", - "quality_video": "This changes the default output quality of the converted video files. Higher values may result in longer conversion times and file size.", - "quality_audio": "Audio (kbps)", - "quality_images": "Image (%)", + "filename": { + "format": "File name format", + "description": "This will determine the name of the file on download, not including the file extension. You can put the following templates in the format, which will be replaced with the relevant information: %name% for the original file name, %extension% for the original file extension, %datetime% for the full ISO 8601 timestamp, %date% for the date, %time% for the time, and %unix% for the unix timestamp.", + "placeholder": "VERT_%name%" + }, + "default_format": { + "label": "Default conversion format", + "enable": "Enable", + "disable": "Disable", + "description": "This will change the default format selected when you upload a file of this file type.", + "image": "Images", + "video": "Videos", + "audio": "Audio", + "document": "Documents" + }, + "metadata": { + "label": "File metadata", + "description": "This changes whether any metadata (EXIF, song info, etc.) on the original file is preserved in converted files.", + "keep": "Keep", + "remove": "Remove" + }, + "quality": { + "label": "Conversion quality", + "description": "This changes the default output quality of the converted files (in its category). Higher values may result in longer conversion times and file size.", + "video": "This changes the default output quality of the converted video files. Higher values may result in longer conversion times and file size.", + "audio": "Audio (kbps)", + "images": "Image (%)" + }, "rate": "Sample rate (Hz)" }, "vertd": { - "title": "Video conversion", + "title": "Server video conversion", "status": "status:", "loading": "loading...", "available": "available, commit id {commitId}", "unavailable": "unavailable (is the url right?)", - "description": "The vertd project is a server wrapper for FFmpeg. This allows you to convert videos through the convenience of VERT's web interface, while still being able to harness the power of your GPU to do it as quickly as possible.", - "hosting_info": "We host a public instance for your convenience, but it is quite easy to host your own on your PC or server if you know what you are doing. You can download the server binaries [vertd_link]here[/vertd_link] - the process of setting this up will become easier in the future, so stay tuned!", - "instance": "Instance", - "url_placeholder": "Example: http://localhost:24153", - "conversion_speed": "Conversion speed", - "speed_description": "This describes the tradeoff between speed and quality. Faster speeds will result in lower quality, but will get the job done quicker.", - "speeds": { - "very_slow": "Very Slow", - "slower": "Slower", - "slow": "Slow", - "medium": "Medium", - "fast": "Fast", - "ultra_fast": "Ultra Fast" + "description": { + "main": "When possible, VERT converts videos locally in your browser, however some conversions may require the use of the vertd project, a server wrapper for FFmpeg. This allows you to convert videos through the convenience of VERT's web interface, while still being able to harness the power of your GPU to do it as quickly as possible.", + "info": "We host a public instance for your convenience, but it is quite easy to host your own on your PC or server if you know what you are doing. You can download the server binaries [vertd_link]here[/vertd_link] - the process of setting this up will become easier in the future, so stay tuned!" }, - "auto_instance": "Auto (recommended)", - "eu_instance": "Falkenstein, Germany", - "us_instance": "Washington, USA", - "custom_instance": "Custom" + "instance": { + "label": "Instance", + "url_placeholder": "Example: http://localhost:24153", + "auto": "Auto (recommended)", + "eu": "Falkenstein, Germany", + "us": "Washington, USA", + "custom": "Custom" + }, + "custom_headers": { + "label": "Custom headers", + "description": "Add custom headers to be sent with each request to the vertd instance, which could be used for authentication or other purposes (one per line).", + "placeholder": "Header-Name: Header Value" + }, + "conversion_speed": { + "label": "Conversion speed", + "description": "This describes the tradeoff between speed and quality. Faster speeds will result in lower quality, but will get the job done quicker.", + "speeds": { + "very_slow": "Very Slow", + "slower": "Slower", + "slow": "Slow", + "medium": "Medium", + "fast": "Fast", + "ultra_fast": "Ultra Fast" + } + } }, "privacy": { "title": "Privacy & data", - "plausible_title": "Plausible analytics", - "plausible_description": "We use [plausible_link]Plausible[/plausible_link], a privacy-focused analytics tool, to gather completely anonymous statistics. All data is anonymized and aggregated, and no identifiable information is ever sent or stored. You can view the analytics [analytics_link]here[/analytics_link] and choose to opt out below.", - "opt_in": "Opt-in", - "opt_out": "Opt-out", - "cache_title": "Cache management", - "cache_description": "We cache the converter files on your browser so you don't have to re-download them every time, improving performance and reducing data usage.", - "refresh_cache": "Refresh cache", - "clear_cache": "Clear cache", - "files_cached": "{size} ({count} files)", - "loading_cache": "Loading...", - "total_size": "Total Size", - "files_cached_label": "Files Cached", - "cache_cleared": "Cache cleared successfully!", - "cache_clear_error": "Failed to clear cache.", - "site_data_title": "Site data management", - "site_data_description": "Clear all site data including settings and cached files, resetting VERT to its default state and reloading the page.", - "clear_all_data": "Clear all site data", - "clear_all_data_confirm_title": "Clear all site data?", - "clear_all_data_confirm": "This will reset all settings & cache, then reload the page. This action cannot be undone.", - "clear_all_data_cancel": "Cancel", - "all_data_cleared": "All site data cleared! Reloading page...", - "all_data_clear_error": "Failed to clear all site data." - }, - "language": { - "title": "Language", - "description": "Select your preferred language for the VERT interface." + "plausible": { + "title": "Plausible analytics", + "description": "We use [plausible_link]Plausible[/plausible_link], a privacy-focused analytics tool, to gather completely anonymous statistics. All data is anonymized and aggregated, and no identifiable information is ever sent or stored. You can view the analytics [analytics_link]here[/analytics_link] and choose to opt out below.", + "opt_in": "Opt-in", + "opt_out": "Opt-out" + }, + "cache": { + "title": "Cache management", + "description": "We cache the converter files on your browser so you don't have to re-download them every time, improving performance and reducing data usage.", + "refresh_cache": "Refresh cache", + "clear_cache": "Clear cache", + "files_cached": "{size} ({count} files)", + "loading_cache": "Loading...", + "total_size": "Total Size", + "files_cached_label": "Files Cached", + "cache_cleared": "Cache cleared successfully!", + "cache_clear_error": "Failed to clear cache." + }, + "site_data": { + "title": "Site data management", + "description": "Clear all site data including settings and cached files, resetting VERT to its default state and reloading the page.", + "clear_all_data": "Clear all site data", + "clear_all_data_confirm_title": "Clear all site data?", + "clear_all_data_confirm": "This will reset all settings & cache, then reload the page. This action cannot be undone.", + "clear_all_data_cancel": "Cancel", + "all_data_cleared": "All site data cleared! Reloading page...", + "all_data_clear_error": "Failed to clear all site data." + } } }, "about": { "title": "About", "why": { "title": "Why VERT?", - "description": "File converters have always disappointed us. They're ugly, riddled with ads, and most importantly; slow. We decided to solve this problem once and for all by making an alternative that solves all those problems, and more.

All non-video files are converted completely on-device; this means that there's no delay between sending and receiving the files from a server, and we never get to snoop on the files you convert.

Video files get uploaded to our lightning-fast RTX 4000 Ada server. Your videos stay on there for an hour if you do not convert them. If you do convert the file, the video will stay on the server for an hour, or until it is downloaded. The file will then be deleted from our server." + "description": "File converters have always disappointed us. They're ugly, riddled with ads, and most importantly; slow. We decided to solve this problem once and for all by making an alternative that solves all those problems, and more.

When possible, all files are converted completely on-device; this means that there's no delay between sending and receiving the files from a server, and we never get to snoop on the files you convert.

If the conversion is unsupported locally in your browser, video files get uploaded to our lightning-fast RTX 4000 Ada server. Your videos stay on there for an hour if you do not convert them. If you do convert the file, the video will stay on the server for an hour, or until it is downloaded fully. The file will then be deleted from our server." }, "sponsors": { "title": "Sponsors", @@ -249,17 +379,17 @@ }, "credits": { "title": "Credits", - "contact_team": "If you would like to contact the development team, please use the email found on the \"Resources\" card.", + "contact_team": "If you would like to contact the VERT team, please use the email found on the \"Resources\" card.", "notable_contributors": "Notable contributors", "notable_description": "We'd like to thank these people for their major contributions to VERT.", "github_contributors": "GitHub contributors", "github_description": "Big thanks to all these people for helping out! [github_link]Want to help too?[/github_link]", "no_contributors": "Seems like no one has contributed yet... [contribute_link]be the first to contribute![/contribute_link]", "libraries": "Libraries", - "libraries_description": "A big thanks to FFmpeg (audio, video), ImageMagick (images) and Pandoc (documents) for maintaining such excellent libraries for so many years. VERT relies on them to provide you with your conversions.", + "libraries_description": "A big thanks to Mediabunny (video), FFmpeg (audio, video), ImageMagick (images) and Pandoc (documents) for maintaining such excellent libraries for so many years. VERT relies on them to provide you with your conversions.", "roles": { "lead_developer": "Lead developer; conversion backend, UI implementation", - "developer": "Developer; UI implementation", + "developer": "Developer; conversion backend, UI implementation", "designer": "Designer; UX, branding, marketing", "docker_ci": "Maintaining Docker & CI support", "former_cofounder": "Former co-founder & designer" @@ -276,9 +406,17 @@ "magick": "Error in Magick worker, image conversion may not work as expected.", "ffmpeg": "Error loading FFmpeg, some features may not work as expected.", "pandoc": "Error loading Pandoc worker, document conversion may not work as expected.", + "mediabunny": { + "init": "Error loading Mediabunny, video conversion may not work as expected.", + "webcodecs": "Some WebCodecs APIs are not supported in this browser, video conversion may not work as expected.", + "discarded": "Mediabunny discarded {count} track(s) for {file}. See the browser console for details." + }, "no_audio": "No audio stream found.", "invalid_rate": "Invalid sample rate specified: {rate}Hz", "file_too_large": "This file exceeds the {limit}GB browser / device limit. Try Firefox or Safari to convert this large file, which typically have higher limits." + }, + "warnings": { + "settings_change": "Changed the setting '{setting}' from '{oldValue}' to '{newValue}' for {file} to prevent conversion failure." } }, "privacy": { @@ -289,7 +427,7 @@ }, "conversions": { "title": "Conversions", - "description": "Most conversions (images, documents, audio) happen entirely locally on your device using WebAssembly versions of the relevant tools (e.g. ImageMagick, Pandoc, FFmpeg). This means your files never leave your device and we will never have access to them.

Video conversions are performed on our servers because they require more processing power and cannot be done very quickly on the browser yet. Videos you convert with VERT are deleted after being downloaded, or after one hour, unless you explicitly give permission for us to store them longer purely for troubleshooting purposes." + "description": "Most conversions (video, images, documents, audio) happen entirely locally on your device using WebAssembly versions of the relevant tools (e.g. ImageMagick, Pandoc, FFmpeg), or tools that use built-in browesr APIs (e.g. Mediabunny). This means your files never leave your device and we will never have access to them.

When possible, video conversions happen locally in your browser using Mediabunny, however if unsupported they are performed on our servers. Videos you upload to our servers (using vertd) are deleted after being downloaded fully, or after one hour no matter its status, unless you explicitly give permission for us to store them longer purely for troubleshooting purposes." }, "donations": { "title": "Donations", @@ -297,7 +435,7 @@ }, "conversion_errors": { "title": "Conversion Errors", - "description": "When a video conversion fails, we may collect some anonymous data to help us diagnose the issue. This data may include:", + "description": "When a server video conversion fails (vertd), we may collect some anonymous data to help us diagnose the issue. This data may include:", "list_job_id": "The job ID, which is the anonymized file name", "list_format_from": "The format you converted from", "list_format_to": "The format you converted to", @@ -311,13 +449,13 @@ }, "local_storage": { "title": "Local Storage", - "description": "We use your browser's local storage to save your settings, and your browser's session storage to temporarily store the GitHub contributors list for the \"About\" section to reduce repeated GitHub API requests. No personal data is stored or transmitted.

The WebAssembly versions of the conversion tools we use (FFmpeg, ImageMagick, Pandoc) are also stored locally on your browser when you first visit the website, so you don't need to redownload them each visit. No personal data is stored or transmitted. You may view or delete this data at any time in the \"Privacy & data\" section in [settings_link]settings[/settings_link]." + "description": "We use your browser's local storage to save your settings. We also use your browser's session storage to temporarily store the specified vertd server's file size limit (if applicable) to reduce repeated API requests and the GitHub contributors list for the \"About\" section to do the same. No personal data is stored or transmitted.

The WebAssembly or browser versions of the conversion tools we use (Mediabunny, FFmpeg, ImageMagick, Pandoc) are also stored locally on your browser when you first visit the website, so you don't need to redownload them each visit. No personal data is stored or transmitted. You may view or delete this data at any time in the \"Privacy & data\" section in [settings_link]settings[/settings_link]." }, "contact": { "title": "Contact", "description": "For questions, email us at: [email_link]hello@vert.sh[/email_link]. If you are using a third-party instance of VERT, please contact the hoster of that instance instead." }, - "last_updated": "Last updated: 2025-10-29" + "last_updated": "Last updated: 2026-03-11" }, "toast": { "insecure_context": "You are visiting VERT in an insecure context (e.g. accessing over HTTP instead of HTTPS). Some features may not work as expected." diff --git a/messages/es.json b/messages/es.json index ffd31ecb..d15af009 100644 --- a/messages/es.json +++ b/messages/es.json @@ -80,9 +80,7 @@ }, "errors": { "cant_convert": "No podemos convertir este archivo.", - "vertd_server": "¿Qué estás haciendo..? ¡Debes ejecutar el servidor de vertd!", "unsupported_format": "Solo aceptamos imágenes, vídeos, audios y documentos.", - "vertd_not_found": "No se encontró la instancia de vertd para iniciar la conversión de vídeos. ¿Estás seguro de que la URL es correcta?", "worker_downloading": "El convertidor {type} se está inicializando actualmente, espere unos momentos.", "worker_error": "El convertidor {type} tuvo un error durante la inicialización, inténtelo nuevamente más tarde.", "worker_timeout": "El convertidor {type} está tardando más de lo esperado en inicializarse. Espere unos momentos más o actualice la página.", @@ -90,21 +88,27 @@ "doc": "documento", "image": "imagen", "format_output_only": "Actualmente, este formato solo se puede utilizar como salida (convertido a), no como entrada.", - "vertd_details": "Ver detalles del error", - "vertd_details_body": "Si pulsas enviar, tu vídeo también se adjuntará junto con el registro de errores, que siempre se nos envía para su revisión. La siguiente información es el registro que recibimos automáticamente:", - "vertd_details_close": "Cerrar", - "vertd_details_error_message": "Mensaje de error: [view_link]Ver registros de errores[/view_link]", - "vertd_details_footer": "Esta información solo se utilizará para solucionar problemas y nunca se compartirá. Consulte nuestra [privacy_link]política de privacidad[/privacy_link] para obtener más detalles.", - "vertd_details_from": "Desde formato: {from}", - "vertd_details_job_id": "ID de la tarea: {jobId}", - "vertd_details_to": "Para formatear: {to}", - "vertd_failed_to_keep": "No se pudo mantener el video en el servidor: {error}", - "vertd_generic_body": "Se produjo un error al intentar convertir su video. ¿Le gustaría enviar este video a los desarrolladores para ayudar a corregir este error? Sólo se enviará su archivo de vídeo. No se cargarán identificadores.", - "vertd_generic_no": "No enviar", - "vertd_generic_title": "Error de conversión de vídeo", - "vertd_generic_view": "Ver detalles del error", - "vertd_generic_yes": "Enviar vídeo", - "vertd_ratelimit": "La conversión de tu vídeo, {filename}, ha fallado varias veces. Para evitar la sobrecarga del servidor, se han bloqueado temporalmente los nuevos intentos de conversión de este archivo. Inténtalo de nuevo más tarde." + "vertd": { + "details": { + "view": "Ver detalles del error", + "body": "Si pulsas enviar, tu vídeo también se adjuntará junto con el registro de errores, que siempre se nos envía para su revisión. La siguiente información es el registro que recibimos automáticamente:", + "footer": "Esta información solo se utilizará para solucionar problemas y nunca se compartirá. Consulte nuestra [privacy_link]política de privacidad[/privacy_link] para obtener más detalles.", + "job_id": "ID de la tarea: {jobId}", + "from": "Desde formato: {from}", + "to": "Para formatear: {to}", + "error_message": "Mensaje de error: [view_link]Ver registros de errores[/view_link]", + "close": "Cerrar" + }, + "generic": { + "body": "Se produjo un error al intentar convertir su video. ¿Le gustaría enviar este video a los desarrolladores para ayudar a corregir este error? Sólo se enviará su archivo de vídeo. No se cargarán identificadores.", + "view": "Ver detalles del error", + "title": "Error de conversión de vídeo", + "yes": "Enviar vídeo", + "no": "No enviar" + }, + "failed_to_keep": "No se pudo mantener el video en el servidor: {error}", + "ratelimit": "La conversión de tu vídeo, {filename}, ha fallado varias veces. Para evitar la sobrecarga del servidor, se han bloqueado temporalmente los nuevos intentos de conversión de este archivo. Inténtalo de nuevo más tarde." + } }, "archive_file": { "audio": "audio", @@ -126,39 +130,51 @@ }, "appearance": { "title": "Apariencia", - "brightness_theme": "Tema", - "brightness_description": "¿Prefieres una flash-bang soleada o una silenciosa y solitaria noche?", "light": "Claro", "dark": "Oscuro", - "effect_settings": "Efectos", - "effect_description": "¿Prefieres efectos en la interfaz o una experiencia más estática?", "enable": "Activar", - "disable": "Desactivar" + "disable": "Desactivar", + "effect": { + "settings": "Efectos", + "description": "¿Prefieres efectos en la interfaz o una experiencia más estática?" + }, + "language": { + "title": "Lenguaje", + "description": "Selecciona el lenguaje que prefieres usar para la interfaz de VERT." + } }, "conversion": { "title": "Conversión", "advanced_settings": "Configuraciones avanzadas", - "filename_format": "Formato del nombre de archivo", - "filename_description": "Esto va a determinar el nombre del archivo al ser descargado sin incluir la extensión. Puedes poner las siguientes plantillas en el formato, las cuales serán reemplazadas con la información que les corresponde: %name% para el nombre original, %extension% para la extensión original del archivo y %date% para la fecha de cuando el archivo fue convertido.", - "placeholder": "VERT_%name%", - "default_format": "Formato de conversión predeterminado", - "default_format_description": "Esto cambiará el formato predeterminado seleccionado cuando subes un archivo de este tipo.", - "default_format_image": "Imágenes", - "default_format_video": "Vídeos", - "default_format_audio": "Audio", - "default_format_document": "Documentos", - "metadata": "Metadatos del archivo", - "metadata_description": "Esto cambia si los metadatos (EXIF, información de la canción, etc.) del archivo original se conservan en los archivos convertidos.", - "keep": "Mantener", - "remove": "Eliminar", - "quality": "Calidad de la conversión", - "quality_description": "Esto cambia la calidad por defecto de los archivos convertidos (en su categoría). Valores más altos pueden resultar en tiempos de conversión y tamaños de archivo más largos.", - "quality_video": "Esto cambia la calidad por defecto de los vídeos convertidos. Valores más altos pueden resultar en tiempos de conversión y tamaños de archivo más largos.", - "quality_audio": "Audio (kbps)", - "quality_images": "Imagen (%)", + "default_format": { + "image": "Imágenes", + "audio": "Audio", + "document": "Documentos", + "enable": "Activar", + "disable": "Desactivar", + "label": "Formato de conversión predeterminado", + "description": "Esto cambiará el formato predeterminado seleccionado cuando subes un archivo de este tipo.", + "video": "Vídeos" + }, + "metadata": { + "label": "Metadatos del archivo", + "description": "Esto cambia si los metadatos (EXIF, información de la canción, etc.) del archivo original se conservan en los archivos convertidos.", + "keep": "Mantener", + "remove": "Eliminar" + }, + "quality": { + "label": "Calidad de la conversión", + "description": "Esto cambia la calidad por defecto de los archivos convertidos (en su categoría). Valores más altos pueden resultar en tiempos de conversión y tamaños de archivo más largos.", + "video": "Esto cambia la calidad por defecto de los vídeos convertidos. Valores más altos pueden resultar en tiempos de conversión y tamaños de archivo más largos.", + "audio": "Audio (kbps)", + "images": "Imagen (%)" + }, "rate": "Tasa de muestreo (Hz)", - "default_format_disable": "Desactivar", - "default_format_enable": "Activar" + "filename": { + "description": "Esto va a determinar el nombre del archivo al ser descargado sin incluir la extensión. Puedes poner las siguientes plantillas en el formato, las cuales serán reemplazadas con la información que les corresponde: %name% para el nombre original, %extension% para la extensión original del archivo y %date% para la fecha de cuando el archivo fue convertido.", + "format": "Formato del nombre de archivo", + "placeholder": "VERT_%name%" + } }, "vertd": { "title": "Conversión de vídeo", @@ -166,53 +182,61 @@ "loading": "cargando...", "available": "disponible, id del commit {commitId}", "unavailable": "no disponible (¿has comprobado la url?)", - "description": "vertd es un proyecto que actúa como un servidor intermediario (\"wrapper\") para FFmpeg. Permite convertir vídeos sin dejar de lado la conveniente interfaz web de VERT y, a la vez, aprovecha la potencia de tu GPU para hacerlo lo más rápido posible.", - "hosting_info": "Alojamos una instancia pública para tu conveniencia, pero es bastante fácil alojar una propia en tu PC o servidor si sabes lo que estás haciendo. Puedes descargar los binarios del servidor [vertd_link]aquí[/vertd_link]. ¡El proceso de instalación será más fácil en el futuro, así que mantente atento!", - "instance": "Instancia", - "url_placeholder": "Ejemplo: http://localhost:24153", - "conversion_speed": "Velocidad de conversión", - "speed_description": "Esto describe el equilibrio entre velocidad y calidad. Velocidades más rápidas resultarán en una calidad más baja, pero harán el trabajo más rápido.", - "speeds": { - "very_slow": "Extremadamente lento", - "slower": "Muy lento", - "slow": "Lento", - "medium": "Medio", - "fast": "Rápido", - "ultra_fast": "Súper rápido" + "description": { + "main": "vertd es un proyecto que actúa como un servidor intermediario (\"wrapper\") para FFmpeg. Permite convertir vídeos sin dejar de lado la conveniente interfaz web de VERT y, a la vez, aprovecha la potencia de tu GPU para hacerlo lo más rápido posible.", + "info": "Alojamos una instancia pública para tu conveniencia, pero es bastante fácil alojar una propia en tu PC o servidor si sabes lo que estás haciendo. Puedes descargar los binarios del servidor [vertd_link]aquí[/vertd_link]. ¡El proceso de instalación será más fácil en el futuro, así que mantente atento!" }, - "auto_instance": "Automático (recomendado)", - "eu_instance": "Falkenstein, Alemania", - "us_instance": "Washington, EE. UU.", - "custom_instance": "Personalizado" + "instance": { + "custom": "Personalizado", + "label": "Instancia", + "url_placeholder": "Ejemplo: http://localhost:24153", + "auto": "Automático (recomendado)", + "eu": "Falkenstein, Alemania", + "us": "Washington, EE. UU." + }, + "conversion_speed": { + "speeds": { + "very_slow": "Extremadamente lento", + "slower": "Muy lento", + "slow": "Lento", + "medium": "Medio", + "fast": "Rápido", + "ultra_fast": "Súper rápido" + }, + "label": "Velocidad de conversión", + "description": "Esto describe el equilibrio entre velocidad y calidad. Velocidades más rápidas resultarán en una calidad más baja, pero harán el trabajo más rápido." + } }, "privacy": { "title": "Privacidad", - "plausible_title": "Analíticas de Plausible", - "plausible_description": "Usamos [plausible_link]Plausible[/plausible_link], una herramienta de analíticas orientada a la privacidad para recopilar estadísticas completamente anónimas. Toda la información que recopilamos es anonimizada y agregada, y en ningún momento se envía ni se almacena información que permita identificarte. Puedes ver las estadísticas [analytics_link]aquí[/analytics_link] y excluirte de ellas a continuación:", - "opt_in": "Participar", - "opt_out": "No participar", - "cache_title": "Administración de caché", - "cache_description": "Guardamos en caché los archivos del convertidor en su navegador para que no tenga que volver a descargarlos cada vez, mejorando el rendimiento y reduciendo el uso de datos.", - "refresh_cache": "Actualizar caché", - "clear_cache": "Borrar caché", - "files_cached": "{size} ({count} archivos)", - "loading_cache": "Cargando...", - "total_size": "Tamaño total", - "files_cached_label": "Archivos en caché", - "cache_cleared": "¡Caché borrada exitosamente!", - "all_data_clear_error": "No se han podido borrar todos los datos del sitio.", - "all_data_cleared": "¡Se han borrado todos los datos del sitio! Recargando la página...", - "cache_clear_error": "No se pudo borrar el caché.", - "clear_all_data": "Borrar todos los datos del sitio", - "clear_all_data_cancel": "Cancelar", - "clear_all_data_confirm": "Esto restablecerá todos los ajustes y la caché; después se recargará la página. Esta acción no se puede deshacer.", - "clear_all_data_confirm_title": "¿Borrar todos los datos del sitio?", - "site_data_title": "Gestión de datos del sitio", - "site_data_description": "Borra todos los datos del sitio, incluidos los ajustes y los archivos en caché, restableciendo VERT a su estado predeterminado y recargando la página." - }, - "language": { - "title": "Lenguaje", - "description": "Selecciona el lenguaje que prefieres usar para la interfaz de VERT." + "plausible": { + "title": "Analíticas de Plausible", + "description": "Usamos [plausible_link]Plausible[/plausible_link], una herramienta de analíticas orientada a la privacidad para recopilar estadísticas completamente anónimas. Toda la información que recopilamos es anonimizada y agregada, y en ningún momento se envía ni se almacena información que permita identificarte. Puedes ver las estadísticas [analytics_link]aquí[/analytics_link] y excluirte de ellas a continuación:", + "opt_in": "Participar", + "opt_out": "No participar" + }, + "cache": { + "title": "Administración de caché", + "description": "Guardamos en caché los archivos del convertidor en su navegador para que no tenga que volver a descargarlos cada vez, mejorando el rendimiento y reduciendo el uso de datos.", + "refresh_cache": "Actualizar caché", + "clear_cache": "Borrar caché", + "files_cached": "{size} ({count} archivos)", + "loading_cache": "Cargando...", + "total_size": "Tamaño total", + "files_cached_label": "Archivos en caché", + "cache_cleared": "¡Caché borrada exitosamente!", + "cache_clear_error": "No se pudo borrar el caché." + }, + "site_data": { + "title": "Gestión de datos del sitio", + "description": "Borra todos los datos del sitio, incluidos los ajustes y los archivos en caché, restableciendo VERT a su estado predeterminado y recargando la página.", + "clear_all_data": "Borrar todos los datos del sitio", + "clear_all_data_confirm_title": "¿Borrar todos los datos del sitio?", + "clear_all_data_confirm": "Esto restablecerá todos los ajustes y la caché; después se recargará la página. Esta acción no se puede deshacer.", + "clear_all_data_cancel": "Cancelar", + "all_data_cleared": "¡Se han borrado todos los datos del sitio! Recargando la página...", + "all_data_clear_error": "No se han podido borrar todos los datos del sitio." + } } }, "about": { @@ -322,4 +346,4 @@ "toast": { "insecure_context": "Estás visitando VERT en un contexto inseguro (por ejemplo, accediendo a través de HTTP en lugar de HTTPS). Es posible que algunas funciones no funcionen como se espera." } -} \ No newline at end of file +} diff --git a/messages/fr.json b/messages/fr.json index 9a182016..05141914 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -71,15 +71,17 @@ }, "errors": { "cant_convert": "Nous ne pouvons pas convertir ce fichier", - "vertd_server": "Que fais-tu ? Tu es censé exécuter sur le serveur vertd !", "unsupported_format": "Seuls les fichiers image, vidéo, audio et document sont pris en charge", - "vertd_not_found": "Impossible de trouver l'instance vertd pour démarrer la conversion vidéo. Êtes-vous sûr que l'URL de l'instance est correctement définie ?", "worker_downloading": "Le convertisseur de {type} est en cours d'initialisation, veuillez patienter quelques instants.", "worker_error": "Le convertisseur de {type} a rencontré une erreur lors de l'initialisation, veuillez réessayer plus tard.", "worker_timeout": "Le convertisseur de {type} prend plus de temps que prévu pour s'initialiser, veuillez patienter quelques instants de plus ou actualiser la page.", "audio": "audio", "doc": "document", - "image": "image" + "image": "image", + "vertd": { + "server": "Que fais-tu ? Tu es censé exécuter sur le serveur vertd !", + "not_found": "Impossible de trouver l'instance vertd pour démarrer la conversion vidéo. Êtes-vous sûr que l'URL de l'instance est correctement définie ?" + } } }, "settings": { @@ -89,39 +91,55 @@ }, "appearance": { "title": "Appearance", - "brightness_theme": "Luminosité du thème", - "brightness_description": "Envie d'une soirée ensoleillée ou d'une nuit tranquille et solitaire ?", "light": "Lumineux", "dark": "Sombre", - "effect_settings": "Paramètres des effets", - "effect_description": "Vous aimez les effets sophistiqués ou préférez une expérience plus statique ?", "enable": "Activer", - "disable": "Désactiver" + "disable": "Désactiver", + "brightness": { + "theme": "Luminosité du thème", + "description": "Envie d'une soirée ensoleillée ou d'une nuit tranquille et solitaire ?" + }, + "effect": { + "settings": "Paramètres des effets", + "description": "Vous aimez les effets sophistiqués ou préférez une expérience plus statique ?" + }, + "language": { + "title": "Langue", + "description": "Sélectionnez votre langue préférée pour l'interface de VERT" + } }, "conversion": { "title": "Conversion", "advanced_settings": "Paramètres avancés", - "filename_format": "Format du nom de fichier", - "filename_description": "Cela déterminera le nom du fichier lors du téléchargement, sans inclure l'extension du fichier. Vous pouvez mettre les modèles suivants dans le format, qui seront remplacés par les informations pertinentes: %name% pour le nom du fichier d'origine, %extension% pour l'extension du fichier d'origine et %date% pour une chaîne de date indiquant quand le fichier a été converti.", - "placeholder": "VERT_%name%", - "default_format": "Format de conversion par défaut", - "default_format_enable": "Activer", - "default_format_disable": "Désactiver", - "default_format_description": "Cela modifiera le format par défaut sélectionné lorsque vous téléchargez un fichier de ce type de format.", - "default_format_image": "Images", - "default_format_video": "Videos", - "default_format_audio": "Audio", - "default_format_document": "Documents", - "metadata": "Métadonnées du fichier", - "metadata_description": "Cela modifie si les métadonnées (EXIF, informations sur la chanson, etc.) du fichier d'origine sont conservées dans les fichiers convertis.", - "keep": "Conserver", - "remove": "Retirer", - "quality": "Qualité de conversion", - "quality_description": "Cela modifie la qualité de sortie par défaut des fichiers convertis (de son format). Des valeurs plus élevées peuvent entraîner des temps de conversion et une taille de fichier plus longs.", - "quality_video": "Cela modifie la qualité de sortie par défaut des fichiers vidéo convertis. Des valeurs plus élevées peuvent allonger le temps de conversion et la taille du fichier.", - "quality_audio": "Audio (kbps)", - "quality_images": "Image (%)", - "rate": "Taux d'échantillonnage (Hz)" + "default_format": { + "image": "Images", + "audio": "Audio", + "document": "Documents", + "enable": "Activer", + "disable": "Désactiver", + "label": "Format de conversion par défaut", + "description": "Cela modifiera le format par défaut sélectionné lorsque vous téléchargez un fichier de ce type de format.", + "video": "Videos" + }, + "metadata": { + "label": "Métadonnées du fichier", + "description": "Cela modifie si les métadonnées (EXIF, informations sur la chanson, etc.) du fichier d'origine sont conservées dans les fichiers convertis.", + "keep": "Conserver", + "remove": "Retirer" + }, + "quality": { + "label": "Qualité de conversion", + "description": "Cela modifie la qualité de sortie par défaut des fichiers convertis (de son format). Des valeurs plus élevées peuvent entraîner des temps de conversion et une taille de fichier plus longs.", + "video": "Cela modifie la qualité de sortie par défaut des fichiers vidéo convertis. Des valeurs plus élevées peuvent allonger le temps de conversion et la taille du fichier.", + "audio": "Audio (kbps)", + "images": "Image (%)" + }, + "rate": "Taux d'échantillonnage (Hz)", + "filename": { + "format": "Format du nom de fichier", + "description": "Cela déterminera le nom du fichier lors du téléchargement, sans inclure l'extension du fichier. Vous pouvez mettre les modèles suivants dans le format, qui seront remplacés par les informations pertinentes: %name% pour le nom du fichier d'origine, %extension% pour l'extension du fichier d'origine et %date% pour une chaîne de date indiquant quand le fichier a été converti.", + "placeholder": "VERT_%name%" + } }, "vertd": { "title": "Conversion vidéo", @@ -129,31 +147,35 @@ "loading": "Chargement...", "available": "disponible, identifiant de validation {commitId}", "unavailable": "indisponible (l'url est-elle correcte ?)", - "description": "Le projet vertd est un serveur de wrapper utilisant FFmpeg. Il vous permet de convertir des vidéos grâce à l'interface web pratique de VERT'tout en exploitant la puissance de votre GPU pour une exécution rapide.", - "hosting_info": "Nous hébergeons une instance publique pour vous faciliter la tâche, mais il est assez facile d'héberger la vôtre sur votre PC ou votre serveur si vous savez ce que vous faites. Vous pouvez télécharger les binaires pour serveur [vertd_link]ici[/vertd_link] - le processus de mise en place deviendra plus facile à l'avenir, alors restez à l'écoute !", + "description": { + "main": "Le projet vertd est un serveur de wrapper utilisant FFmpeg. Il vous permet de convertir des vidéos grâce à l'interface web pratique de VERT'tout en exploitant la puissance de votre GPU pour une exécution rapide.", + "info": "Nous hébergeons une instance publique pour vous faciliter la tâche, mais il est assez facile d'héberger la vôtre sur votre PC ou votre serveur si vous savez ce que vous faites. Vous pouvez télécharger les binaires pour serveur [vertd_link]ici[/vertd_link] - le processus de mise en place deviendra plus facile à l'avenir, alors restez à l'écoute !" + }, "instance_url": "URL de l'instance", - "url_placeholder": "Exemple: http://localhost:24153", - "conversion_speed": "Vitesse de conversion", - "speed_description": "Ceci décrit le compromis entre vitesse et qualité. Des vitesses plus élevées entraîneront une qualité moindre, mais permettront d'effectuer le travail plus rapidement.", - "speeds": { - "very_slow": "Très lent", - "slower": "Plus lent", - "slow": "Lent", - "medium": "Moyen", - "fast": "Rapide", - "ultra_fast": "Ultra Rapide" + "conversion_speed": { + "speeds": { + "very_slow": "Très lent", + "slower": "Plus lent", + "slow": "Lent", + "medium": "Moyen", + "fast": "Rapide", + "ultra_fast": "Ultra Rapide" + }, + "label": "Vitesse de conversion", + "description": "Ceci décrit le compromis entre vitesse et qualité. Des vitesses plus élevées entraîneront une qualité moindre, mais permettront d'effectuer le travail plus rapidement." + }, + "instance": { + "url_placeholder": "Exemple: http://localhost:24153" } }, "privacy": { "title": "Confidentialité", - "plausible_title": "Analyses plausibles", - "plausible_description": "Nous utilisons [plausible_link]Plausible[/plausible_link], un outil d'analyse axé sur la confidentialité, pour recueillir des statistiques totalement anonymes. Toutes les données sont anonymisées et agrégées, et aucune information identifiable n'est transmise ni stockée. Vous pouvez consulter les analyses [analytics_link]ici[/analytics_link] et choisir de vous désinscrire ci-dessous.", - "opt_in": "Inscription", - "opt_out": "Désinscription" - }, - "language": { - "title": "Langue", - "description": "Sélectionnez votre langue préférée pour l'interface de VERT" + "plausible": { + "title": "Analyses plausibles", + "description": "Nous utilisons [plausible_link]Plausible[/plausible_link], un outil d'analyse axé sur la confidentialité, pour recueillir des statistiques totalement anonymes. Toutes les données sont anonymisées et agrégées, et aucune information identifiable n'est transmise ni stockée. Vous pouvez consulter les analyses [analytics_link]ici[/analytics_link] et choisir de vous désinscrire ci-dessous.", + "opt_in": "Inscription", + "opt_out": "Désinscription" + } } }, "about": { @@ -218,4 +240,4 @@ "invalid_rate": "Taux d'échantillonnage spécifié non valide: {rate}Hz" } } -} \ No newline at end of file +} diff --git a/messages/hr.json b/messages/hr.json index 94d02143..3f643e42 100644 --- a/messages/hr.json +++ b/messages/hr.json @@ -34,7 +34,7 @@ "not_initialized": "nije inicijalizirano", "downloading": "preuzimanje...", "initializing": "inicijaliziranje...", - "unknown": "nepoznati status" + "unknown": "nepoznati status" }, "supported_formats": "Podržani formati:" }, @@ -71,15 +71,17 @@ }, "errors": { "cant_convert": "Ne možemo pretvoriti ovu datoteku.", - "vertd_server": "Sunce ti žarko, što ti radiš!? Moraš pokrenuti vertd server!", "unsupported_format": "Podržane su samo slike, videozapisi, audio i dokumenti", - "vertd_not_found": "Nismo mogli pronači vertd da započnemo pretvaranje. Jeste li sigurni da je URL točno postavljen?", "worker_downloading": "{type} pretvarač se trenutno koristi, molimo pričekajte malo.", "worker_error": "{type} pretvaraču se javila pogreška pri inicijalizaciji, molimo pokušajte ponovno kasnije.", "worker_timeout": "{type} pretvaraču treba duže nego očekivano da se inicijalizira, molimo još malo pričekajte ili osvježite stranicu.", "audio": "audio", "doc": "dokument", - "image": "slika" + "image": "slika", + "vertd": { + "server": "Sunce ti žarko, što ti radiš!? Moraš pokrenuti vertd server!", + "not_found": "Nismo mogli pronači vertd da započnemo pretvaranje. Jeste li sigurni da je URL točno postavljen?" + } } }, "settings": { @@ -89,36 +91,52 @@ }, "appearance": { "title": "Izgled", - "brightness_theme": "Svjetlina", - "brightness_description": "Želite li da Vas Sunce oslijepi ili tihu umirujuću noć?", "light": "Svijetlo", "dark": "Tamno", - "effect_settings": "Efekti", - "effect_description": "Želite li zapanjujuće efekte ili miran doživljaj?", "enable": "Uključeno", - "disable": "Isključeno" + "disable": "Isključeno", + "brightness": { + "theme": "Svjetlina", + "description": "Želite li da Vas Sunce oslijepi ili tihu umirujuću noć?" + }, + "effect": { + "settings": "Efekti", + "description": "Želite li zapanjujuće efekte ili miran doživljaj?" + }, + "language": { + "title": "Jezik", + "description": "Izaberi svoj preferirani jezik za VERTovo sučelje." + } }, "conversion": { "title": "Pretvaranje", - "filename_format": "Način imenovanja datoteke", - "filename_description": "Ovo će odrediti ime datoteke pri preuzimanju, ali ne i nastavak. Možete staviti navedene prijedloge u način imenovanja, koji će biti zamijenjeni sa relevatnim informacijama: %name% za originalni naziv datoteke, %extension% za originalni nastavak, i %date% za datum kada je datoteka bila pretvorena.", - "placeholder": "VERT_%name%", - "default_format": "Zadan format za pretvaranje", - "default_format_description": "Ovo će promijeniti zadani format koji je izabran kada prenesete datoteku te vrste.", - "default_format_image": "Slike", - "default_format_video": "Videozapisi", - "default_format_audio": "Audio", - "default_format_document": "Dokumenti", - "metadata": "Metapodatci datoteke", - "metadata_description": "Ovo mijenja spremaju li se ikakvi metapodatci (EXIF, informacije o pjesmi, itd.) sa originalne datoteke na pretvorenu datoteku", - "keep": "Ostavi", - "remove": "Obriši", - "quality": "Kvaliteta pretvaranja", - "quality_description": "Ovo mijenja zadanu izlaznu kvalitetu pretvorene datoteke (u svojoj kategoriji). Veći iznosi mogu uzrokovati duže vrijeme za pretvaranje i veličinu.", - "quality_video": "Ovo mijenja zadanu izlaznu kvalitetu pretvoranog videozapisa. Veći iznosi mogu uzrokovati duže vrijeme za pretvaranje i veličinu.", - "quality_audio": "Audio (kbps)", - "quality_images": "Slika (%)", - "rate": "Sample rate (Hz)" + "default_format": { + "image": "Slike", + "audio": "Audio", + "document": "Dokumenti", + "label": "Zadan format za pretvaranje", + "description": "Ovo će promijeniti zadani format koji je izabran kada prenesete datoteku te vrste.", + "video": "Videozapisi" + }, + "metadata": { + "label": "Metapodatci datoteke", + "description": "Ovo mijenja spremaju li se ikakvi metapodatci (EXIF, informacije o pjesmi, itd.) sa originalne datoteke na pretvorenu datoteku", + "keep": "Ostavi", + "remove": "Obriši" + }, + "quality": { + "label": "Kvaliteta pretvaranja", + "description": "Ovo mijenja zadanu izlaznu kvalitetu pretvorene datoteke (u svojoj kategoriji). Veći iznosi mogu uzrokovati duže vrijeme za pretvaranje i veličinu.", + "video": "Ovo mijenja zadanu izlaznu kvalitetu pretvoranog videozapisa. Veći iznosi mogu uzrokovati duže vrijeme za pretvaranje i veličinu.", + "audio": "Audio (kbps)", + "images": "Slika (%)" + }, + "rate": "Sample rate (Hz)", + "filename": { + "format": "Način imenovanja datoteke", + "description": "Ovo će odrediti ime datoteke pri preuzimanju, ali ne i nastavak. Možete staviti navedene prijedloge u način imenovanja, koji će biti zamijenjeni sa relevatnim informacijama: %name% za originalni naziv datoteke, %extension% za originalni nastavak, i %date% za datum kada je datoteka bila pretvorena.", + "placeholder": "VERT_%name%" + } }, "vertd": { "title": "Pretvaranje videozapisa", @@ -126,31 +144,35 @@ "loading": "učitavanje...", "available": "dostupno, commit id {commitId}", "unavailable": "nedostupno (Je li URL točan?)", - "description": "vertd projekt je serverski omot za FFmpeg. Ovo omogućuje da pretvarate videozapise sa lakoćom VERTovog web sučelja, dok još uvijek možete iskoristiti snagu vašeg GPU da odradi što brže moguće.", - "hosting_info": "Mi držimo javnu instancu za Vašu lakoću, ali je veoma lako hostati na Vašem računalu ili serveru ako znate što radite. Možete preuzeti serverske programe [vertd_link]ovdje[/vertd_link] - Proces namještanja će biti lakši u budućnosti, pa njuškajte malo za nove vijesti!", + "description": { + "main": "vertd projekt je serverski omot za FFmpeg. Ovo omogućuje da pretvarate videozapise sa lakoćom VERTovog web sučelja, dok još uvijek možete iskoristiti snagu vašeg GPU da odradi što brže moguće.", + "info": "Mi držimo javnu instancu za Vašu lakoću, ali je veoma lako hostati na Vašem računalu ili serveru ako znate što radite. Možete preuzeti serverske programe [vertd_link]ovdje[/vertd_link] - Proces namještanja će biti lakši u budućnosti, pa njuškajte malo za nove vijesti!" + }, "instance_url": "URL instance", - "url_placeholder": "Na primjer: http://localhost:24153", - "conversion_speed": "Brzina pretvaranja", - "speed_description": "Ovo opisuje kompromis između brzine i kvalitete. Većom brzinom će izaći manja kvaliteta, ali će se posao brže odraditi.", - "speeds": { - "very_slow": "Jako Sporo", - "slower": "Sporije", - "slow": "Sporo", - "medium": "Umjereno", - "fast": "Brzo", - "ultra_fast": "Veoma Brzo" + "conversion_speed": { + "speeds": { + "very_slow": "Jako Sporo", + "slower": "Sporije", + "slow": "Sporo", + "medium": "Umjereno", + "fast": "Brzo", + "ultra_fast": "Veoma Brzo" + }, + "label": "Brzina pretvaranja", + "description": "Ovo opisuje kompromis između brzine i kvalitete. Većom brzinom će izaći manja kvaliteta, ali će se posao brže odraditi." + }, + "instance": { + "url_placeholder": "Na primjer: http://localhost:24153" } }, "privacy": { "title": "Privatnost", - "plausible_title": "Plausible analitike", - "plausible_description": "Mi koristimo [plausible_link]Plausible[/plausible_link], alat za analitiku koji je fokusiran na privatnost, da prikupimo potpuno anonimne statistike. Svi podatci su anonimizirani i prikupljeni bez ikakvih identificirajućih informacija spremljeno i poslano. Možete vidjeti analitike [analytics_link]ovdje[/analytics_link] i izabrati da ne sudjelujete ispod.", - "opt_in": "Sudjelujem", - "opt_out": "Ne sudjelujem" - }, - "language": { - "title": "Jezik", - "description": "Izaberi svoj preferirani jezik za VERTovo sučelje." + "plausible": { + "title": "Plausible analitike", + "description": "Mi koristimo [plausible_link]Plausible[/plausible_link], alat za analitiku koji je fokusiran na privatnost, da prikupimo potpuno anonimne statistike. Svi podatci su anonimizirani i prikupljeni bez ikakvih identificirajućih informacija spremljeno i poslano. Možete vidjeti analitike [analytics_link]ovdje[/analytics_link] i izabrati da ne sudjelujete ispod.", + "opt_in": "Sudjelujem", + "opt_out": "Ne sudjelujem" + } } }, "about": { diff --git a/messages/id.json b/messages/id.json index f57e11a4..2e5b4e5c 100644 --- a/messages/id.json +++ b/messages/id.json @@ -78,20 +78,24 @@ }, "errors": { "cant_convert": "Kami tidak dapat mengonversi berkas ini.", - "vertd_server": "apa yang kamu lakukan..? kamu seharusnya menjalankan peladen vertd!", - "vertd_generic_body": "Terjadi galat saat mencoba mengonversi video kamu. Apakah kamu ingin mengirimkan video ini ke pengembang untuk membantu memperbaiki kutu ini? Hanya berkas video kamu yang akan dikirim. Tidak ada data identifikasi yang diunggah.", - "vertd_generic_title": "Konversi video galat", - "vertd_generic_yes": "Kirim video", - "vertd_generic_no": "Jangan kirim", - "vertd_failed_to_keep": "Gagal menyimpan video di peladen: {error}", "unsupported_format": "Hanya berkas gambar, video, audio, dan dokumen yang didukung", - "vertd_not_found": "Tidak dapat menemukan layanan vertd untuk memulai konversi video. Apakah URL layanan sudah diatur dengan benar?", "worker_downloading": "Konverter {type} sedang diinisialisasi, harap tunggu beberapa saat.", "worker_error": "Konverter {type} mengalami kesalahan saat inisialisasi, coba lagi nanti.", "worker_timeout": "Konverter {type} memerlukan waktu lebih lama dari perkiraan untuk inisialisasi, harap tunggu beberapa saat lagi atau segarkan halaman.", "audio": "audio", "doc": "dokumen", - "image": "gambar" + "image": "gambar", + "vertd": { + "server": "apa yang kamu lakukan..? kamu seharusnya menjalankan peladen vertd!", + "generic": { + "body": "Terjadi galat saat mencoba mengonversi video kamu. Apakah kamu ingin mengirimkan video ini ke pengembang untuk membantu memperbaiki kutu ini? Hanya berkas video kamu yang akan dikirim. Tidak ada data identifikasi yang diunggah.", + "title": "Konversi video galat", + "yes": "Kirim video", + "no": "Jangan kirim" + }, + "failed_to_keep": "Gagal menyimpan video di peladen: {error}", + "not_found": "Tidak dapat menemukan layanan vertd untuk memulai konversi video. Apakah URL layanan sudah diatur dengan benar?" + } } }, "settings": { @@ -101,37 +105,53 @@ }, "appearance": { "title": "Tampilan", - "brightness_theme": "Tema kecerahan", - "brightness_description": "Ingin suasana terang benderang, atau malam yang sunyi?", "light": "Terang", "dark": "Gelap", - "effect_settings": "Pengaturan efek", - "effect_description": "Ingin efek keren, atau tampilan yang lebih sederhana?", "enable": "Aktifkan", - "disable": "Nonaktifkan" + "disable": "Nonaktifkan", + "brightness": { + "theme": "Tema kecerahan", + "description": "Ingin suasana terang benderang, atau malam yang sunyi?" + }, + "effect": { + "settings": "Pengaturan efek", + "description": "Ingin efek keren, atau tampilan yang lebih sederhana?" + }, + "language": { + "title": "Bahasa", + "description": "Pilih bahasa pilihanmu untuk antarmuka VERT." + } }, "conversion": { "title": "Konversi", "advanced_settings": "Pengaturan lanjutan", - "filename_format": "Format nama berkas", - "filename_description": "Ini akan menentukan nama berkas saat diunduh, tidak termasuk ekstensi berkas. Kamu dapat menggunakan template berikut dalam format, yang akan diganti dengan informasi terkait: %name% untuk nama berkas asli, %extension% untuk ekstensi berkas asli, dan %date% untuk tanggal saat berkas dikonversi.", - "placeholder": "VERT_%name%", - "default_format": "Format konversi baku", - "default_format_description": "Ini akan mengubah format baku yang dipilih saat kamu mengunggah berkas dengan tipe tersebut.", - "default_format_image": "Gambar", - "default_format_video": "Video", - "default_format_audio": "Audio", - "default_format_document": "Dokumen", - "metadata": "Metadata berkas", - "metadata_description": "Menentukan apakah metadata (EXIF, info lagu, dll.) dari berkas asli akan dipertahankan di berkas hasil konversi.", - "keep": "Pertahankan", - "remove": "Hapus", - "quality": "Kualitas konversi", - "quality_description": "Mengubah kualitas keluaran baku berkas hasil konversi. Nilai yang lebih tinggi dapat menghasilkan waktu konversi dan ukuran berkas yang lebih besar.", - "quality_video": "Mengubah kualitas keluaran baku berkas video hasil konversi. Nilai yang lebih tinggi dapat memperpanjang waktu dan ukuran berkas.", - "quality_audio": "Audio (kbps)", - "quality_images": "Gambar (%)", - "rate": "Laju sampel (Hz)" + "default_format": { + "image": "Gambar", + "audio": "Audio", + "document": "Dokumen", + "label": "Format konversi baku", + "description": "Ini akan mengubah format baku yang dipilih saat kamu mengunggah berkas dengan tipe tersebut.", + "video": "Video" + }, + "metadata": { + "label": "Metadata berkas", + "description": "Menentukan apakah metadata (EXIF, info lagu, dll.) dari berkas asli akan dipertahankan di berkas hasil konversi.", + "keep": "Pertahankan", + "remove": "Hapus" + }, + "quality": { + "label": "Kualitas konversi", + "description": "Mengubah kualitas keluaran baku berkas hasil konversi. Nilai yang lebih tinggi dapat menghasilkan waktu konversi dan ukuran berkas yang lebih besar.", + "video": "Mengubah kualitas keluaran baku berkas video hasil konversi. Nilai yang lebih tinggi dapat memperpanjang waktu dan ukuran berkas.", + "audio": "Audio (kbps)", + "images": "Gambar (%)" + }, + "rate": "Laju sampel (Hz)", + "filename": { + "format": "Format nama berkas", + "description": "Ini akan menentukan nama berkas saat diunduh, tidak termasuk ekstensi berkas. Kamu dapat menggunakan template berikut dalam format, yang akan diganti dengan informasi terkait: %name% untuk nama berkas asli, %extension% untuk ekstensi berkas asli, dan %date% untuk tanggal saat berkas dikonversi.", + "placeholder": "VERT_%name%" + } }, "vertd": { "title": "Konversi video", @@ -139,45 +159,51 @@ "loading": "memuat...", "available": "tersedia, commit id {commitId}", "unavailable": "tidak tersedia (apakah URL sudah benar?)", - "description": "Proyek vertd adalah server wrapper untuk FFmpeg. Ini memungkinkan kamu mengonversi video melalui antarmuka web VERT, sambil memanfaatkan kekuatan GPU untuk mempercepat proses.", - "hosting_info": "Kami menyediakan instance publik untuk kemudahanmu, tetapi kamu juga bisa dengan mudah meng-host sendiri di PC atau server jika tahu caranya. Kamu dapat mengunduh binary server [vertd_link]di sini[/vertd_link] - proses penyiapan akan semakin mudah di masa depan, jadi tetap pantau!", - "instance": "Instance", - "url_placeholder": "Contoh: http://localhost:24153", - "conversion_speed": "Kecepatan konversi", - "speed_description": "Menjelaskan kompromi antara kecepatan dan kualitas. Kecepatan lebih tinggi menghasilkan kualitas lebih rendah, tetapi proses lebih cepat.", - "speeds": { - "very_slow": "Sangat Lambat", - "slower": "Agak Lambat", - "slow": "Lambat", - "medium": "Sedang", - "fast": "Cepat", - "ultra_fast": "Sangat Cepat" + "description": { + "main": "Proyek vertd adalah server wrapper untuk FFmpeg. Ini memungkinkan kamu mengonversi video melalui antarmuka web VERT, sambil memanfaatkan kekuatan GPU untuk mempercepat proses.", + "info": "Kami menyediakan instance publik untuk kemudahanmu, tetapi kamu juga bisa dengan mudah meng-host sendiri di PC atau server jika tahu caranya. Kamu dapat mengunduh binary server [vertd_link]di sini[/vertd_link] - proses penyiapan akan semakin mudah di masa depan, jadi tetap pantau!" + }, + "instance": { + "custom": "Kustom", + "label": "Instance", + "url_placeholder": "Contoh: http://localhost:24153", + "auto": "Otomatis (disarankan)", + "eu": "Falkenstein, Jerman", + "us": "Washington, AS" }, - "auto_instance": "Otomatis (disarankan)", - "eu_instance": "Falkenstein, Jerman", - "us_instance": "Washington, AS", - "custom_instance": "Kustom" + "conversion_speed": { + "speeds": { + "very_slow": "Sangat Lambat", + "slower": "Agak Lambat", + "slow": "Lambat", + "medium": "Sedang", + "fast": "Cepat", + "ultra_fast": "Sangat Cepat" + }, + "label": "Kecepatan konversi", + "description": "Menjelaskan kompromi antara kecepatan dan kualitas. Kecepatan lebih tinggi menghasilkan kualitas lebih rendah, tetapi proses lebih cepat." + } }, "privacy": { "title": "Privasi & data", - "plausible_title": "Analitik Plausible", - "plausible_description": "Kami menggunakan [plausible_link]Plausible[/plausible_link], alat analitik yang berfokus pada privasi, untuk mengumpulkan statistik anonim sepenuhnya. Semua data dianonimkan dan diagregasi, tanpa informasi yang dapat diidentifikasi. Kamu dapat melihat analitiknya [analytics_link]di sini[/analytics_link] dan memilih untuk keluar di bawah.", - "opt_in": "Ikut serta", - "opt_out": "Tidak ikut", - "cache_title": "Manajemen cache", - "cache_description": "Kami menyimpan berkas konverter di browser agar kamu tidak perlu mengunduh ulang setiap kali, meningkatkan performa dan menghemat data.", - "refresh_cache": "Segarkan cache", - "clear_cache": "Hapus cache", - "files_cached": "{size} ({count} berkas)", - "loading_cache": "Memuat...", - "total_size": "Total Ukuran", - "files_cached_label": "File Tersimpan", - "cache_cleared": "Cache berhasil dihapus!", - "cache_clear_error": "Gagal menghapus cache." - }, - "language": { - "title": "Bahasa", - "description": "Pilih bahasa pilihanmu untuk antarmuka VERT." + "plausible": { + "title": "Analitik Plausible", + "description": "Kami menggunakan [plausible_link]Plausible[/plausible_link], alat analitik yang berfokus pada privasi, untuk mengumpulkan statistik anonim sepenuhnya. Semua data dianonimkan dan diagregasi, tanpa informasi yang dapat diidentifikasi. Kamu dapat melihat analitiknya [analytics_link]di sini[/analytics_link] dan memilih untuk keluar di bawah.", + "opt_in": "Ikut serta", + "opt_out": "Tidak ikut" + }, + "cache": { + "title": "Manajemen cache", + "description": "Kami menyimpan berkas konverter di browser agar kamu tidak perlu mengunduh ulang setiap kali, meningkatkan performa dan menghemat data.", + "refresh_cache": "Segarkan cache", + "clear_cache": "Hapus cache", + "files_cached": "{size} ({count} berkas)", + "loading_cache": "Memuat...", + "total_size": "Total Ukuran", + "files_cached_label": "File Tersimpan", + "cache_cleared": "Cache berhasil dihapus!", + "cache_clear_error": "Gagal menghapus cache." + } } }, "about": { @@ -249,4 +275,4 @@ "download": "Unduh", "delete": "Hapus" } -} \ No newline at end of file +} diff --git a/messages/it.json b/messages/it.json index 11b02ead..8a3f41a9 100644 --- a/messages/it.json +++ b/messages/it.json @@ -77,20 +77,24 @@ }, "errors": { "cant_convert": "Non possiamo convertire questo file.", - "vertd_server": "cosa stai facendo...? dovresti eseguire il server vertd!", - "vertd_generic_body": "Si è verificato un errore durante il tentativo di conversione del tuo video. Vuoi inviare questo video agli sviluppatori per aiutare a risolvere questo bug? Verrà inviato solo il tuo file video. Nessun identificatore sarà caricato.", - "vertd_generic_title": "Errore di conversione video", - "vertd_generic_yes": "Invia video", - "vertd_generic_no": "Non inviare", - "vertd_failed_to_keep": "Impossibile mantenere il video sul server: {error}", "unsupported_format": "Sono supportati solo file immagine, video, audio e documento", - "vertd_not_found": "Impossibile trovare l'istanza vertd per avviare la conversione video. Sei sicuro che l'URL dell'istanza sia impostato correttamente?", "worker_downloading": "Il convertitore {type} è attualmente in fase di inizializzazione, attendi qualche istante.", "worker_error": "Il convertitore {type} ha avuto un errore durante l'inizializzazione, riprova più tardi.", "worker_timeout": "Il convertitore {type} sta impiegando più del previsto per inizializzare, attendi ancora qualche istante o aggiorna la pagina.", "audio": "audio", "doc": "documento", - "image": "immagine" + "image": "immagine", + "vertd": { + "server": "cosa stai facendo...? dovresti eseguire il server vertd!", + "generic": { + "body": "Si è verificato un errore durante il tentativo di conversione del tuo video. Vuoi inviare questo video agli sviluppatori per aiutare a risolvere questo bug? Verrà inviato solo il tuo file video. Nessun identificatore sarà caricato.", + "title": "Errore di conversione video", + "yes": "Invia video", + "no": "Non inviare" + }, + "failed_to_keep": "Impossibile mantenere il video sul server: {error}", + "not_found": "Impossibile trovare l'istanza vertd per avviare la conversione video. Sei sicuro che l'URL dell'istanza sia impostato correttamente?" + } } }, "settings": { @@ -100,37 +104,53 @@ }, "appearance": { "title": "Aspetto", - "brightness_theme": "Tema luminosità", - "brightness_description": "Vuoi un lampo di sole, o una tranquilla notte solitaria?", "light": "Chiaro", "dark": "Scuro", - "effect_settings": "Impostazioni effetti", - "effect_description": "Desideri effetti *fancy*, o un'esperienza più statica?", "enable": "Abilita", - "disable": "Disabilita" + "disable": "Disabilita", + "brightness": { + "theme": "Tema luminosità", + "description": "Vuoi un lampo di sole, o una tranquilla notte solitaria?" + }, + "effect": { + "settings": "Impostazioni effetti", + "description": "Desideri effetti *fancy*, o un'esperienza più statica?" + }, + "language": { + "title": "Lingua", + "description": "Seleziona la tua lingua preferita per l'interfaccia di VERT." + } }, "conversion": { "title": "Conversione", "advanced_settings": "Impostazioni avanzate", - "filename_format": "Formato nome file", - "filename_description": "Questo determinerà il nome del file al momento del download, esclusa l'estensione del file. È possibile inserire i seguenti *template* nel formato, che verranno sostituiti con le informazioni pertinenti: %name% per il nome del file originale, %extension% per l'estensione del file originale e %date% per una *stringa* di data di quando il file è stato convertito.", - "placeholder": "VERT_%name%", - "default_format": "Formato di conversione predefinito", - "default_format_description": "Questo cambierà il formato predefinito selezionato quando carichi un file di questo tipo.", - "default_format_image": "Immagini", - "default_format_video": "Video", - "default_format_audio": "Audio", - "default_format_document": "Documenti", - "metadata": "Metadati del file", - "metadata_description": "Questo cambia se eventuali metadati (EXIF, informazioni sul brano, ecc.) del file originale vengono conservati nei file convertiti.", - "keep": "Mantieni", - "remove": "Rimuovi", - "quality": "Qualità di conversione", - "quality_description": "Questo cambia la qualità di output predefinita dei file convertiti (nella sua categoria). Valori più alti possono comportare tempi di conversione più lunghi e dimensioni maggiori.", - "quality_video": "Questo cambia la qualità di output predefinita dei file video convertiti. Valori più alti possono comportare tempi di conversione più lunghi e dimensioni maggiori.", - "quality_audio": "Audio (kbps)", - "quality_images": "Immagine (%)", - "rate": "Frequenza di campionamento (Hz)" + "default_format": { + "image": "Immagini", + "audio": "Audio", + "document": "Documenti", + "label": "Formato di conversione predefinito", + "description": "Questo cambierà il formato predefinito selezionato quando carichi un file di questo tipo.", + "video": "Video" + }, + "metadata": { + "label": "Metadati del file", + "description": "Questo cambia se eventuali metadati (EXIF, informazioni sul brano, ecc.) del file originale vengono conservati nei file convertiti.", + "keep": "Mantieni", + "remove": "Rimuovi" + }, + "quality": { + "label": "Qualità di conversione", + "description": "Questo cambia la qualità di output predefinita dei file convertiti (nella sua categoria). Valori più alti possono comportare tempi di conversione più lunghi e dimensioni maggiori.", + "video": "Questo cambia la qualità di output predefinita dei file video convertiti. Valori più alti possono comportare tempi di conversione più lunghi e dimensioni maggiori.", + "audio": "Audio (kbps)", + "images": "Immagine (%)" + }, + "rate": "Frequenza di campionamento (Hz)", + "filename": { + "format": "Formato nome file", + "description": "Questo determinerà il nome del file al momento del download, esclusa l'estensione del file. È possibile inserire i seguenti *template* nel formato, che verranno sostituiti con le informazioni pertinenti: %name% per il nome del file originale, %extension% per l'estensione del file originale e %date% per una *stringa* di data di quando il file è stato convertito.", + "placeholder": "VERT_%name%" + } }, "vertd": { "title": "Conversione video", @@ -138,45 +158,51 @@ "loading": "caricamento...", "available": "disponibile, ID commit {commitId}", "unavailable": "non disponibile (l'URL è corretto?)", - "description": "Il progetto vertd è un *server wrapper* per FFmpeg. Questo ti permette di convertire video attraverso la comodità dell'interfaccia web di VERT, pur essendo in grado di sfruttare la potenza della tua GPU per farlo il più rapidamente possibile.", - "hosting_info": "Ospitiamo un'istanza pubblica per la tua comodità, ma è abbastanza facile ospitarne una tua sul tuo PC o server se sai cosa stai facendo. Puoi scaricare i binari del server [vertd_link]qui[/vertd_link] - il processo di configurazione diventerà più semplice in futuro, quindi resta sintonizzato!", - "instance": "Istanza", - "url_placeholder": "Esempio: http://localhost:24153", - "conversion_speed": "Velocità di conversione", - "speed_description": "Questo descrive il compromesso tra velocità e qualità. Velocità maggiori si tradurranno in una qualità inferiore, ma completeranno il lavoro più velocemente.", - "speeds": { - "very_slow": "Molto Lento", - "slower": "Più Lento", - "slow": "Lento", - "medium": "Medio", - "fast": "Veloce", - "ultra_fast": "Ultra Veloce" + "description": { + "main": "Il progetto vertd è un *server wrapper* per FFmpeg. Questo ti permette di convertire video attraverso la comodità dell'interfaccia web di VERT, pur essendo in grado di sfruttare la potenza della tua GPU per farlo il più rapidamente possibile.", + "info": "Ospitiamo un'istanza pubblica per la tua comodità, ma è abbastanza facile ospitarne una tua sul tuo PC o server se sai cosa stai facendo. Puoi scaricare i binari del server [vertd_link]qui[/vertd_link] - il processo di configurazione diventerà più semplice in futuro, quindi resta sintonizzato!" + }, + "instance": { + "custom": "Personalizzato", + "label": "Istanza", + "url_placeholder": "Esempio: http://localhost:24153", + "auto": "Automatico (consigliato)", + "eu": "Falkenstein, Germania", + "us": "Washington, USA" }, - "auto_instance": "Automatico (consigliato)", - "eu_instance": "Falkenstein, Germania", - "us_instance": "Washington, USA", - "custom_instance": "Personalizzato" + "conversion_speed": { + "speeds": { + "very_slow": "Molto Lento", + "slower": "Più Lento", + "slow": "Lento", + "medium": "Medio", + "fast": "Veloce", + "ultra_fast": "Ultra Veloce" + }, + "label": "Velocità di conversione", + "description": "Questo descrive il compromesso tra velocità e qualità. Velocità maggiori si tradurranno in una qualità inferiore, ma completeranno il lavoro più velocemente." + } }, "privacy": { "title": "Privacy e dati", - "plausible_title": "Statistiche Plausible", - "plausible_description": "Utilizziamo [plausible_link]Plausible[/plausible_link], uno strumento di analisi focalizzato sulla privacy, per raccogliere statistiche completamente anonime. Tutti i dati sono anonimizzati e aggregati e nessuna informazione identificabile viene mai inviata o archiviata. Puoi visualizzare le statistiche [analytics_link]qui[/analytics_link] e scegliere di disattivare il tracciamento qui sotto.", - "opt_in": "Attiva tracciamento", - "opt_out": "Disattiva tracciamento", - "cache_title": "Gestione della cache", - "cache_description": "Memorizziamo i file del convertitore nella cache del tuo *browser* in modo che tu non debba riscaricarli ogni volta, migliorando le prestazioni e riducendo l'utilizzo dei dati.", - "refresh_cache": "Aggiorna cache", - "clear_cache": "Cancella cache", - "files_cached": "{size} ({count} file)", - "loading_cache": "Caricamento...", - "total_size": "Dimensione Totale", - "files_cached_label": "File in Cache", - "cache_cleared": "Cache cancellata con successo!", - "cache_clear_error": "Impossibile cancellare la cache." - }, - "language": { - "title": "Lingua", - "description": "Seleziona la tua lingua preferita per l'interfaccia di VERT." + "plausible": { + "title": "Statistiche Plausible", + "description": "Utilizziamo [plausible_link]Plausible[/plausible_link], uno strumento di analisi focalizzato sulla privacy, per raccogliere statistiche completamente anonime. Tutti i dati sono anonimizzati e aggregati e nessuna informazione identificabile viene mai inviata o archiviata. Puoi visualizzare le statistiche [analytics_link]qui[/analytics_link] e scegliere di disattivare il tracciamento qui sotto.", + "opt_in": "Attiva tracciamento", + "opt_out": "Disattiva tracciamento" + }, + "cache": { + "title": "Gestione della cache", + "description": "Memorizziamo i file del convertitore nella cache del tuo *browser* in modo che tu non debba riscaricarli ogni volta, migliorando le prestazioni e riducendo l'utilizzo dei dati.", + "refresh_cache": "Aggiorna cache", + "clear_cache": "Cancella cache", + "files_cached": "{size} ({count} file)", + "loading_cache": "Caricamento...", + "total_size": "Dimensione Totale", + "files_cached_label": "File in Cache", + "cache_cleared": "Cache cancellata con successo!", + "cache_clear_error": "Impossibile cancellare la cache." + } } }, "about": { diff --git a/messages/ja.json b/messages/ja.json index 77f5b2f0..408b7187 100644 --- a/messages/ja.json +++ b/messages/ja.json @@ -77,15 +77,17 @@ }, "errors": { "cant_convert": "このファイルを変換できません。", - "vertd_server": "何してるの..? vertdサーバーを起動する必要があります!", "unsupported_format": "画像、動画、音声、ドキュメントのみ対応しています", - "vertd_not_found": "動画変換を開始するためのvertdインスタンスが見つかりません。URLが正しいか確認してください。", "worker_downloading": "{type}コンバーターを初期化中です。少々お待ちください。", "worker_error": "{type}コンバーターの初期化中にエラーが発生しました。後でもう一度お試しください。", "worker_timeout": "{type}コンバーターの初期化に予想以上の時間がかかっています。もう少しお待ちいただくか、ページを更新してください。", "audio": "音声", "doc": "ドキュメント", - "image": "画像" + "image": "画像", + "vertd": { + "server": "何してるの..? vertdサーバーを起動する必要があります!", + "not_found": "動画変換を開始するためのvertdインスタンスが見つかりません。URLが正しいか確認してください。" + } } }, "settings": { @@ -95,37 +97,53 @@ }, "appearance": { "title": "外観", - "brightness_theme": "明るさテーマ", - "brightness_description": "まぶしい昼間か、静かな夜か?", "light": "ライト", "dark": "ダーク", - "effect_settings": "エフェクト設定", - "effect_description": "派手な効果にしますか?それとも静的な体験にしますか?", "enable": "有効", - "disable": "無効" + "disable": "無効", + "brightness": { + "theme": "明るさテーマ", + "description": "まぶしい昼間か、静かな夜か?" + }, + "effect": { + "settings": "エフェクト設定", + "description": "派手な効果にしますか?それとも静的な体験にしますか?" + }, + "language": { + "title": "言語", + "description": "VERTインターフェイスの表示言語を選択してください。" + } }, "conversion": { "title": "変換", "advanced_settings": "詳細設定", - "filename_format": "ファイル名フォーマット", - "filename_description": "これはダウンロード時のファイル名を決定します(拡張子を除く)。以下のテンプレートを使用できます:%name%(元のファイル名)、%extension%(元の拡張子)、%date%(変換日時)。", - "placeholder": "VERT_%name%", - "default_format": "デフォルト変換フォーマット", - "default_format_description": "このファイルタイプをアップロードしたときに自動で選択される形式を変更します。", - "default_format_image": "画像", - "default_format_video": "動画", - "default_format_audio": "音声", - "default_format_document": "ドキュメント", - "metadata": "ファイルメタデータ", - "metadata_description": "変換後のファイルに元のメタデータ(EXIF、曲情報など)を保持するかどうかを変更します。", - "keep": "保持", - "remove": "削除", - "quality": "変換品質", - "quality_description": "出力ファイルの品質を変更します。値が高いほど処理時間とファイルサイズが増加します。", - "quality_video": "動画変換の品質を変更します。高品質ほど変換時間とサイズが増加します。", - "quality_audio": "音声(kbps)", - "quality_images": "画像(%)", - "rate": "サンプリングレート(Hz)" + "default_format": { + "image": "画像", + "audio": "音声", + "document": "ドキュメント", + "label": "デフォルト変換フォーマット", + "description": "このファイルタイプをアップロードしたときに自動で選択される形式を変更します。", + "video": "動画" + }, + "metadata": { + "label": "ファイルメタデータ", + "description": "変換後のファイルに元のメタデータ(EXIF、曲情報など)を保持するかどうかを変更します。", + "keep": "保持", + "remove": "削除" + }, + "quality": { + "label": "変換品質", + "description": "出力ファイルの品質を変更します。値が高いほど処理時間とファイルサイズが増加します。", + "video": "動画変換の品質を変更します。高品質ほど変換時間とサイズが増加します。", + "audio": "音声(kbps)", + "images": "画像(%)" + }, + "rate": "サンプリングレート(Hz)", + "filename": { + "format": "ファイル名フォーマット", + "description": "これはダウンロード時のファイル名を決定します(拡張子を除く)。以下のテンプレートを使用できます:%name%(元のファイル名)、%extension%(元の拡張子)、%date%(変換日時)。", + "placeholder": "VERT_%name%" + } }, "vertd": { "title": "動画変換", @@ -133,44 +151,50 @@ "loading": "読み込み中...", "available": "利用可能(コミットID {commitId})", "unavailable": "利用不可(URLが正しいですか?)", - "description": "vertdプロジェクトはFFmpegのサーバーラッパーです。これにより、GPUの性能を活かして高速に変換しつつ、VERTのウェブインターフェイスから簡単に動画を変換できます。", - "hosting_info": "私たちは利便性のために公開インスタンスをホストしていますが、自分のPCやサーバーでも簡単にホストできます。バイナリは[vertd_link]こちら[/vertd_link]からダウンロードできます。今後さらにセットアップが簡単になる予定です!", - "instance": "インスタンス", - "url_placeholder": "例: http://localhost:24153", - "conversion_speed": "変換速度", - "speed_description": "速度と品質のバランスを設定します。高速化すると品質が低下しますが、処理は速くなります。", - "speeds": { - "very_slow": "非常に遅い", - "slower": "かなり遅い", - "slow": "遅い", - "medium": "普通", - "fast": "速い", - "ultra_fast": "超高速" + "description": { + "main": "vertdプロジェクトはFFmpegのサーバーラッパーです。これにより、GPUの性能を活かして高速に変換しつつ、VERTのウェブインターフェイスから簡単に動画を変換できます。", + "info": "私たちは利便性のために公開インスタンスをホストしていますが、自分のPCやサーバーでも簡単にホストできます。バイナリは[vertd_link]こちら[/vertd_link]からダウンロードできます。今後さらにセットアップが簡単になる予定です!" }, - "auto_instance": "自動(推奨)", - "eu_instance": "ドイツ・ファルケンシュタイン", - "us_instance": "アメリカ・ワシントン", - "custom_instance": "カスタム" + "instance": { + "custom": "カスタム", + "label": "インスタンス", + "url_placeholder": "例: http://localhost:24153", + "auto": "自動(推奨)", + "eu": "ドイツ・ファルケンシュタイン", + "us": "アメリカ・ワシントン" + }, + "conversion_speed": { + "speeds": { + "very_slow": "非常に遅い", + "slower": "かなり遅い", + "slow": "遅い", + "medium": "普通", + "fast": "速い", + "ultra_fast": "超高速" + }, + "label": "変換速度", + "description": "速度と品質のバランスを設定します。高速化すると品質が低下しますが、処理は速くなります。" + } }, "privacy": { "title": "プライバシーとデータ", - "plausible_title": "Plausible解析", - "plausible_description": "私たちはプライバシー重視の解析ツール[plausible_link]Plausible[/plausible_link]を使用しています。すべてのデータは匿名化・集計され、個人情報は一切収集・保存されません。統計情報は[analytics_link]こちら[/analytics_link]で確認でき、以下でオプトアウト可能です。", - "opt_in": "参加する", - "opt_out": "参加しない", - "cache_title": "キャッシュ管理", - "cache_description": "コンバーターファイルをブラウザにキャッシュして再ダウンロードを防ぎ、パフォーマンスを向上させます。", - "refresh_cache": "キャッシュを更新", - "clear_cache": "キャッシュをクリア", - "files_cached": "{size}({count}ファイル)", - "loading_cache": "読み込み中...", - "total_size": "合計サイズ", - "files_cached_label": "キャッシュ済みファイル", - "cache_cleared": "キャッシュが正常にクリアされました!" - }, - "language": { - "title": "言語", - "description": "VERTインターフェイスの表示言語を選択してください。" + "plausible": { + "title": "Plausible解析", + "description": "私たちはプライバシー重視の解析ツール[plausible_link]Plausible[/plausible_link]を使用しています。すべてのデータは匿名化・集計され、個人情報は一切収集・保存されません。統計情報は[analytics_link]こちら[/analytics_link]で確認でき、以下でオプトアウト可能です。", + "opt_in": "参加する", + "opt_out": "参加しない" + }, + "cache": { + "title": "キャッシュ管理", + "description": "コンバーターファイルをブラウザにキャッシュして再ダウンロードを防ぎ、パフォーマンスを向上させます。", + "refresh_cache": "キャッシュを更新", + "clear_cache": "キャッシュをクリア", + "files_cached": "{size}({count}ファイル)", + "loading_cache": "読み込み中...", + "total_size": "合計サイズ", + "files_cached_label": "キャッシュ済みファイル", + "cache_cleared": "キャッシュが正常にクリアされました!" + } } }, "about": { diff --git a/messages/ko.json b/messages/ko.json index 16383236..683a0710 100644 --- a/messages/ko.json +++ b/messages/ko.json @@ -83,30 +83,36 @@ }, "errors": { "cant_convert": "이 파일을 변환할 수 없습니다.", - "vertd_server": "뭐 하는거임? vertd 서버부터 실행하셈", - "vertd_generic_view": "오류 세부정보 보기", - "vertd_generic_body": "비디오 변환 중 오류가 발생했습니다. 이 비디오를 개발자에게 전송해서 이 버그를 수정하는 데 도움을 주시겠습니까? 오직 비디오 파일만 전송됩니다. 익명으로 처리되며, 다른 개인 정보는 포함되지 않습니다.", - "vertd_generic_title": "비디오 변환 오류", - "vertd_generic_yes": "비디오 전송", - "vertd_generic_no": "전송 안 함", - "vertd_failed_to_keep": "영상을 서버에 저장하는데 실패했습니다: {error}", - "vertd_details": "오류 세부정보 보기", - "vertd_details_body": "제출을 누르면, 검토를 위해 항상 보고되는 오류 로그와 함께 동영상도 첨부됩니다. 아래 정보는 우리가 자동으로 받는 로그입니다:", - "vertd_details_footer": "이 정보는 문제 해결 목적으로만 사용되며 절대 공유되지 않습니다. 자세한 내용은 [privacy_link]개인정보 처리방침[/privacy_link]을 확인하세요.", - "vertd_details_job_id": "작업 ID: {jobId}", - "vertd_details_from": "원본 포맷: {from}", - "vertd_details_to": "변환 포맷: {to}", - "vertd_details_error_message": "오류 메시지: [view_link]오류 로그 보기[/view_link]", - "vertd_details_close": "닫기", "unsupported_format": "이미지, 비디오, 오디오 및 문서 파일만 지원됩니다.", "format_output_only": "이 포맷은 현재 입력으로 사용할 수 없으며 (변환된)출력으로만 사용할 수 있습니다.", - "vertd_not_found": "비디오 변환을 시작할 vertd 인스턴스를 찾을 수 없습니다. 인스턴스 URL이 올바르게 설정되었는지 확인해주세요.", "worker_downloading": "현재 {type} 변환기를 준비하고 있습니다. 잠시 기다려 주십시오.", "worker_error": "현재 {type} 변환기 준비 중 오류가 발생했습니다. 나중에 다시 시도해 주십시오.", "worker_timeout": "{type} 변환기를 준비하는데 예상보다 오래 걸리고 있습니다. 잠시 더 기다리거나 페이지를 새로고침해 주세요.", "audio": "오디오", "doc": "문서", - "image": "이미지" + "image": "이미지", + "vertd": { + "server": "뭐 하는거임? vertd 서버부터 실행하셈", + "details": { + "view": "오류 세부정보 보기", + "body": "제출을 누르면, 검토를 위해 항상 보고되는 오류 로그와 함께 동영상도 첨부됩니다. 아래 정보는 우리가 자동으로 받는 로그입니다:", + "footer": "이 정보는 문제 해결 목적으로만 사용되며 절대 공유되지 않습니다. 자세한 내용은 [privacy_link]개인정보 처리방침[/privacy_link]을 확인하세요.", + "job_id": "작업 ID: {jobId}", + "from": "원본 포맷: {from}", + "to": "변환 포맷: {to}", + "error_message": "오류 메시지: [view_link]오류 로그 보기[/view_link]", + "close": "닫기" + }, + "generic": { + "view": "오류 세부정보 보기", + "body": "비디오 변환 중 오류가 발생했습니다. 이 비디오를 개발자에게 전송해서 이 버그를 수정하는 데 도움을 주시겠습니까? 오직 비디오 파일만 전송됩니다. 익명으로 처리되며, 다른 개인 정보는 포함되지 않습니다.", + "title": "비디오 변환 오류", + "yes": "비디오 전송", + "no": "전송 안 함" + }, + "failed_to_keep": "영상을 서버에 저장하는데 실패했습니다: {error}", + "not_found": "비디오 변환을 시작할 vertd 인스턴스를 찾을 수 없습니다. 인스턴스 URL이 올바르게 설정되었는지 확인해주세요." + } } }, "settings": { @@ -116,37 +122,53 @@ }, "appearance": { "title": "테마", - "brightness_theme": "테마 변경", - "brightness_description": "걍 알아서", "light": "라이트 모드", "dark": "다크 모드", - "effect_settings": "이펙트(효과) 설정", - "effect_description": "동적인 애니메이션이나 이펙트, 아님 정적인거?", "enable": "켜기", - "disable": "끄기" + "disable": "끄기", + "brightness": { + "theme": "테마 변경", + "description": "걍 알아서" + }, + "effect": { + "settings": "이펙트(효과) 설정", + "description": "동적인 애니메이션이나 이펙트, 아님 정적인거?" + }, + "language": { + "title": "언어", + "description": "선호하시는 언어를 선택하세요." + } }, "conversion": { "title": "변환", "advanced_settings": "고급 설정", - "filename_format": "파일 이름 형식", - "filename_description": "다운로드할 파일의 이름을 설정합니다. 파일 확장자(포맷)는 포함되지 않습니다. 다음 템플릿을 형식에 넣을 수 있으며, 관련 정보로 대체됩니다: %name% 원본 파일 이름, %extension% 원본 파일 확장자, %date% 파일이 변환된 날짜 문자열.", - "placeholder": "VERT_%name%", - "default_format": "기본 변환 형식", - "default_format_description": "파일 유형의 파일을 업로드할 때 선택되는 기본 형식을 변경합니다.", - "default_format_image": "이미지", - "default_format_video": "비디오", - "default_format_audio": "오디오", - "default_format_document": "문서", - "metadata": "파일 메타데이터", - "metadata_description": "원본 파일의 메타데이터(EXIF, 노래 정보 등)가 변환된 파일에 유지되는지 선택할 수 있습니다.", - "keep": "유지", - "remove": "제거", - "quality": "변환 품질", - "quality_description": "변환된 파일의 기본 출력 품질을 변경합니다(카테고리 내에서). 더 높은 값은 더 긴 변환 시간과 파일 크기를 초래할 수 있습니다.", - "quality_video": "변환된 비디오 파일의 기본 출력 품질을 변경합니다. 높은 값은 더 긴시간과 파일 크기를 초래할 수 있습니다.", - "quality_audio": "오디오 (kbps)", - "quality_images": "이미지 (%)", - "rate": "샘플링 주파수 (Hz)" + "default_format": { + "image": "이미지", + "audio": "오디오", + "document": "문서", + "label": "기본 변환 형식", + "description": "파일 유형의 파일을 업로드할 때 선택되는 기본 형식을 변경합니다.", + "video": "비디오" + }, + "metadata": { + "label": "파일 메타데이터", + "description": "원본 파일의 메타데이터(EXIF, 노래 정보 등)가 변환된 파일에 유지되는지 선택할 수 있습니다.", + "keep": "유지", + "remove": "제거" + }, + "quality": { + "label": "변환 품질", + "description": "변환된 파일의 기본 출력 품질을 변경합니다(카테고리 내에서). 더 높은 값은 더 긴 변환 시간과 파일 크기를 초래할 수 있습니다.", + "video": "변환된 비디오 파일의 기본 출력 품질을 변경합니다. 높은 값은 더 긴시간과 파일 크기를 초래할 수 있습니다.", + "audio": "오디오 (kbps)", + "images": "이미지 (%)" + }, + "rate": "샘플링 주파수 (Hz)", + "filename": { + "format": "파일 이름 형식", + "description": "다운로드할 파일의 이름을 설정합니다. 파일 확장자(포맷)는 포함되지 않습니다. 다음 템플릿을 형식에 넣을 수 있으며, 관련 정보로 대체됩니다: %name% 원본 파일 이름, %extension% 원본 파일 확장자, %date% 파일이 변환된 날짜 문자열.", + "placeholder": "VERT_%name%" + } }, "vertd": { "title": "비디오 변환 서버", @@ -154,45 +176,51 @@ "loading": "로딩중...", "available": "사용 가능, 커밋 ID {commitId}", "unavailable": "사용 불가 (URL를 다시 확인해주세요.)", - "description": "vertd 프로젝트는 FFmpeg를 위한 서버 래퍼입니다. 이를 통해 VERT의 웹 인터페이스를 통해 비디오를 변환할 수 있으며, GPU를 활용하여 가능한 한 빠르게 작업을 수행할 수 있습니다.", - "hosting_info": "편의를 위해 공개 인스턴스를 호스팅하지만, PC나 서버에서 직접 호스팅하는 것도 매우 쉽습니다. 서버 바이너리를 [vertd_link]여기[/vertd_link]에서 다운로드할 수 있습니다. 이 설정 프로세스는 앞으로 더 쉬워질 것이므로 기대해 주세요!", - "instance": "인스턴스", - "url_placeholder": "예시: http://localhost:24153", - "conversion_speed": "변환 속도", - "speed_description": "이는 속도와 품질 사이의 균형을 설명합니다. 속도를 높일수록 품질은 낮아지지만 작업 속도는 더 빨라집니다.", - "speeds": { - "very_slow": "매우 느림", - "slower": "느림", - "slow": "조금 느림", - "medium": "보통", - "fast": "빠름", - "ultra_fast": "매우 빠름" + "description": { + "main": "vertd 프로젝트는 FFmpeg를 위한 서버 래퍼입니다. 이를 통해 VERT의 웹 인터페이스를 통해 비디오를 변환할 수 있으며, GPU를 활용하여 가능한 한 빠르게 작업을 수행할 수 있습니다.", + "info": "편의를 위해 공개 인스턴스를 호스팅하지만, PC나 서버에서 직접 호스팅하는 것도 매우 쉽습니다. 서버 바이너리를 [vertd_link]여기[/vertd_link]에서 다운로드할 수 있습니다. 이 설정 프로세스는 앞으로 더 쉬워질 것이므로 기대해 주세요!" }, - "auto_instance": "자동 (권장됨)", - "eu_instance": "Falkenstein, Germany", - "us_instance": "Washington, USA", - "custom_instance": "사용자 지정" + "instance": { + "custom": "사용자 지정", + "label": "인스턴스", + "url_placeholder": "예시: http://localhost:24153", + "auto": "자동 (권장됨)", + "eu": "Falkenstein, Germany", + "us": "Washington, USA" + }, + "conversion_speed": { + "speeds": { + "very_slow": "매우 느림", + "slower": "느림", + "slow": "조금 느림", + "medium": "보통", + "fast": "빠름", + "ultra_fast": "매우 빠름" + }, + "label": "변환 속도", + "description": "이는 속도와 품질 사이의 균형을 설명합니다. 속도를 높일수록 품질은 낮아지지만 작업 속도는 더 빨라집니다." + } }, "privacy": { "title": "개인정보 및 데이터", - "plausible_title": "Plausible analytics", - "plausible_description": "우리는 개인정보 보호에 초점을 둔 분석 도구인 [plausible_link]Plausible[/plausible_link]를 사용해 완전히 익명화된 통계를 수집합니다. 모든 데이터는 익명화되어 집계되며, 식별 가능한 정보는 전송되거나 보관되지 않습니다. 분석 결과는 [analytics_link]여기[/analytics_link]에서 확인할 수 있고, 아래에서 수집을 거부(opt-out)할 수 있습니다", - "opt_in": "수락", - "opt_out": "거부", - "cache_title": "캐시 정리", - "cache_description": "브라우저에 변환기 파일을 캐시하여 매번 다시 다운로드할 필요가 없도록 하여 최적화와 데이터 사용량을 줄입니다.", - "refresh_cache": "캐시 새로고침", - "clear_cache": "캐시 지우기", - "files_cached": "{size} ({count} files)", - "loading_cache": "로딩중...", - "total_size": "총 크기", - "files_cached_label": "캐시된 파일", - "cache_cleared": "캐시를 성공적으로 지웠습니다!", - "cache_clear_error": "캐시를 지우는 중 오류가 발생했습니다" - }, - "language": { - "title": "언어", - "description": "선호하시는 언어를 선택하세요." + "plausible": { + "title": "Plausible analytics", + "description": "우리는 개인정보 보호에 초점을 둔 분석 도구인 [plausible_link]Plausible[/plausible_link]를 사용해 완전히 익명화된 통계를 수집합니다. 모든 데이터는 익명화되어 집계되며, 식별 가능한 정보는 전송되거나 보관되지 않습니다. 분석 결과는 [analytics_link]여기[/analytics_link]에서 확인할 수 있고, 아래에서 수집을 거부(opt-out)할 수 있습니다", + "opt_in": "수락", + "opt_out": "거부" + }, + "cache": { + "title": "캐시 정리", + "description": "브라우저에 변환기 파일을 캐시하여 매번 다시 다운로드할 필요가 없도록 하여 최적화와 데이터 사용량을 줄입니다.", + "refresh_cache": "캐시 새로고침", + "clear_cache": "캐시 지우기", + "files_cached": "{size} ({count} files)", + "loading_cache": "로딩중...", + "total_size": "총 크기", + "files_cached_label": "캐시된 파일", + "cache_cleared": "캐시를 성공적으로 지웠습니다!", + "cache_clear_error": "캐시를 지우는 중 오류가 발생했습니다" + } } }, "about": { diff --git a/messages/no.json b/messages/no.json new file mode 100644 index 00000000..714e4c1d --- /dev/null +++ b/messages/no.json @@ -0,0 +1,355 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + "navbar": { + "upload": "Last opp", + "convert": "Konverter", + "settings": "Innstillinger", + "about": "Om", + "toggle_theme": "Bytt tema" + }, + "footer": { + "copyright": "© {year} VERT.", + "source_code": "Kildekode", + "discord_server": "Discord-server", + "privacy_policy": "Personvern" + }, + "upload": { + "title": "Filkonvertereren du vil elske.", + "subtitle": "All bilde-, lyd- og dokumentbehandling skjer på enheten din. Videoer konverteres på våre lynraske servere. Ingen filstørrelsesgrense, ingen annonser, og helt åpen kildekode.", + "uploader": { + "text": "Slipp eller klikk for å {action}", + "convert": "konvertere" + }, + "cards": { + "title": "VERT støtter...", + "images": "Bilder", + "audio": "Lyd", + "documents": "Dokumenter", + "video": "Video", + "video_server_processing": "Serverstøttet", + "local_supported": "Lokal støtte", + "status": { + "text": "Status: {status}", + "ready": "klar", + "not_ready": "ikke klar", + "not_initialized": "ikke initialisert", + "downloading": "laster ned...", + "initializing": "initialiserer...", + "unknown": "ukjent status" + }, + "supported_formats": "Støttede formater:" + }, + "tooltip": { + "partial_support": "Dette formatet kan bare konverteres som {direction}.", + "direction_input": "input (fra)", + "direction_output": "output (til)", + "video_server_processing": "Videoer lastes opp til en server for behandling som standard, lær hvordan du setter det opp lokalt her." + } + }, + "convert": { + "archive_file": { + "extract": "Pakk ut arkiv", + "extracting": "Arkiv oppdaget: {filename}", + "extracted": "Pakket ut {extract_count} filer fra {filename}. {ignore_count} elementer ble ignorert.", + "detected": "Oppdaget {type}-filer i {filename}.", + "audio": "lyd", + "video": "video", + "doc": "dokument", + "image": "bilde", + "extract_error": "Feil ved utpakking av {filename}: {error}" + }, + "large_file_warning": "På grunn av begrensninger i nettleser/enhet er konvertering fra video til lyd deaktivert for denne filen fordi den er større enn {limit}GB. Vi anbefaler å bruke Firefox eller Safari for filer av denne størrelsen, da de har færre begrensninger.", + "external_warning": { + "title": "Advarsel om ekstern server", + "text": "Hvis du velger å konvertere til et videoformat, vil disse filene bli lastet opp til en ekstern server for konvertering. Vil du fortsette?", + "yes": "Ja", + "no": "Nei" + }, + "panel": { + "convert_all": "Konverter alle", + "download_all": "Last ned alle som .zip", + "remove_all": "Fjern alle filer", + "set_all_to": "Sett alle til", + "na": "I/T" + }, + "dropdown": { + "audio": "Lyd", + "video": "Video", + "doc": "Dokument", + "image": "Bilde", + "placeholder": "Søk format", + "no_formats": "Ingen formater tilgjengelig", + "no_results": "Ingen formater samsvarer med søket ditt" + }, + "tooltips": { + "unknown_file": "Ukjent filtype", + "audio_file": "Lydfil", + "video_file": "Videofil", + "document_file": "Dokumentfil", + "image_file": "Bildefil", + "convert_file": "Konverter denne filen", + "download_file": "Last ned denne filen" + }, + "errors": { + "cant_convert": "Vi kan ikke konvertere denne filen.", + "unsupported_format": "Kun bilde-, video-, lyd- og dokumentfiler støttes", + "format_output_only": "Dette formatet kan for øyeblikket kun brukes som utdata (konverteres til), ikke som input.", + "worker_downloading": "{type}-konverteren initialiseres for øyeblikket, vennligst vent noen øyeblikk.", + "worker_error": "{type}-konverteren fikk en feil under initialisering, prøv igjen senere.", + "worker_timeout": "{type}-konverteren tar lengre tid enn forventet å initialisere, vennligst vent litt til eller oppdater siden.", + "audio": "lyd", + "doc": "dokument", + "image": "bilde", + "vertd": { + "server": "hva gjør du..? du skal kjøre vertd-serveren!", + "details": { + "view": "Vis feildetaljer", + "body": "Hvis du trykker send, vil videoen din også bli vedlagt sammen med feilloggen som alltid rapporteres til oss for gjennomgang. Følgende informasjon er loggen vi automatisk mottar:", + "footer": "Denne informasjonen brukes kun til feilsøking og vil aldri bli delt. Se vår [privacy_link]personvernerklæring[/privacy_link] for mer informasjon.", + "job_id": "Jobb-ID: {jobId}", + "from": "Fra format: {from}", + "to": "Til format: {to}", + "error_message": "Feilmelding: [view_link]Vis feillogger[/view_link]", + "close": "Lukk" + }, + "generic": { + "view": "Vis feildetaljer", + "body": "En feil oppstod under konvertering av videoen din. Vil du sende denne videoen til utviklerne for å hjelpe med å fikse feilen? Kun videofilen din vil bli sendt. Ingen identifiserende informasjon lastes opp.", + "title": "Feil ved videokonvertering", + "yes": "Send video", + "no": "Ikke send" + }, + "failed_to_keep": "Kunne ikke beholde videoen på serveren: {error}", + "ratelimit": "Videoen din, '{filename}', har feilet å konvertere flere ganger. For å forhindre overbelastning av serveren er videre konverteringsforsøk for denne filen midlertidig blokkert. Prøv igjen senere.", + "not_found": "Kunne ikke finne vertd-instansen for å starte videokonvertering. Er du sikker på at instans-URL-en er satt riktig?" + } + } + }, + "settings": { + "title": "Innstillinger", + "errors": { + "save_failed": "Kunne ikke lagre innstillinger!" + }, + "appearance": { + "title": "Utseende", + "light": "Lyst", + "dark": "Mørkt", + "enable": "Aktiver", + "disable": "Deaktiver", + "brightness": { + "theme": "Lysstyrketema", + "description": "Vil du ha et solfylt smell, eller en rolig ensom natt?" + }, + "effect": { + "settings": "Effektinnstillinger", + "description": "Vil du ha fancy effekter, eller en mer statisk opplevelse?" + }, + "language": { + "title": "Språk", + "description": "Velg ønsket språk for VERT-grensesnittet." + } + }, + "conversion": { + "title": "Konvertering", + "advanced_settings": "Avanserte innstillinger", + "default_format": { + "image": "Bilder", + "audio": "Lyd", + "document": "Dokumenter", + "enable": "Aktiver", + "disable": "Deaktiver", + "label": "Standard konverteringsformat", + "description": "Dette endrer standardformatet som velges når du laster opp en fil av denne filtypen.", + "video": "Videoer" + }, + "metadata": { + "label": "Filmetadata", + "description": "Dette endrer om metadata (EXIF, sanginfo, osv.) på den opprinnelige filen beholdes i konverterte filer.", + "keep": "Behold", + "remove": "Fjern" + }, + "quality": { + "label": "Konverteringskvalitet", + "description": "Dette endrer standard utgangskvalitet for konverterte filer (i sin kategori). Høyere verdier kan føre til lengre konverteringstid og filstørrelse.", + "video": "Dette endrer standard utgangskvalitet for konverterte videofiler. Høyere verdier kan føre til lengre konverteringstid og filstørrelse.", + "audio": "Lyd (kbps)", + "images": "Bilde (%)" + }, + "rate": "Samplingsfrekvens (Hz)", + "filename": { + "format": "Filnavnformat", + "description": "Dette bestemmer navnet på filen ved nedlasting, uten filendelsen. Du kan bruke følgende maler i formatet, som vil bli erstattet med relevant informasjon: %name% for det opprinnelige filnavnet, %extension% for den opprinnelige filendelsen, og %date% for en dato når filen ble konvertert.", + "placeholder": "VERT_%name%" + } + }, + "vertd": { + "title": "Videokonvertering", + "status": "status:", + "loading": "laster...", + "available": "tilgjengelig, commit id {commitId}", + "unavailable": "utilgjengelig (er url-en riktig?)", + "description": { + "main": "vertd-prosjektet er en server-wrapper for FFmpeg. Dette lar deg konvertere videoer gjennom VERTs webgrensesnitt, samtidig som du kan bruke kraften til GPU-en din for å gjøre det så raskt som mulig.", + "info": "Vi hoster en offentlig instans for din bekvemmelighet, men det er ganske enkelt å hoste din egen på PC-en eller serveren din hvis du vet hva du gjør. Du kan laste ned server-binærfiler [vertd_link]her[/vertd_link] - prosessen med å sette dette opp vil bli enklere i fremtiden, så følg med!" + }, + "instance": { + "custom": "Egendefinert", + "label": "Instans", + "url_placeholder": "Eksempel: http://localhost:24153", + "auto": "Auto (anbefalt)", + "eu": "Falkenstein, Tyskland", + "us": "Washington, USA" + }, + "conversion_speed": { + "speeds": { + "very_slow": "Veldig treg", + "slower": "Tregere", + "slow": "Treg", + "medium": "Middels", + "fast": "Rask", + "ultra_fast": "Ekstremt rask" + }, + "label": "Konverteringshastighet", + "description": "Dette beskriver avveiningen mellom hastighet og kvalitet. Raskere hastigheter gir lavere kvalitet, men får jobben gjort raskere." + } + }, + "privacy": { + "title": "Personvern og data", + "plausible": { + "title": "Plausible-analyse", + "description": "Vi bruker [plausible_link]Plausible[/plausible_link], et personvernfokusert analyseverktøy, for å samle helt anonyme statistikker. All data er anonymisert og aggregert, og ingen identifiserbar informasjon blir noen gang sendt eller lagret. Du kan se analysen [analytics_link]her[/analytics_link] og velge å melde deg ut nedenfor.", + "opt_in": "Meld inn", + "opt_out": "Meld ut" + }, + "cache": { + "title": "Cache-håndtering", + "description": "Vi cacher konverteringsfilene i nettleseren din slik at du ikke trenger å laste dem ned på nytt hver gang, noe som forbedrer ytelsen og reduserer databruk.", + "refresh_cache": "Oppdater cache", + "clear_cache": "Tøm cache", + "files_cached": "{size} ({count} filer)", + "loading_cache": "Laster...", + "total_size": "Total størrelse", + "files_cached_label": "Filer i cache", + "cache_cleared": "Cache tømt!", + "cache_clear_error": "Kunne ikke tømme cache." + }, + "site_data": { + "title": "Nettsteddata-håndtering", + "description": "Tøm alle nettsteddata inkludert innstillinger og cachede filer, tilbakestill VERT til standard og last inn siden på nytt.", + "clear_all_data": "Tøm alle nettsteddata", + "clear_all_data_confirm_title": "Tøm alle nettsteddata?", + "clear_all_data_confirm": "Dette vil tilbakestille alle innstillinger og cache, og deretter laste inn siden på nytt. Denne handlingen kan ikke angres.", + "clear_all_data_cancel": "Avbryt", + "all_data_cleared": "Alle nettsteddata er tømt! Laster inn siden på nytt...", + "all_data_clear_error": "Kunne ikke tømme alle nettsteddata." + } + } + }, + "about": { + "title": "Om", + "why": { + "title": "Hvorfor VERT?", + "description": "Filkonverterere har alltid skuffet oss. De er stygge, fulle av annonser, og viktigst av alt; trege. Vi bestemte oss for å løse dette en gang for alle ved å lage et alternativ som løser alle disse problemene, og mer.

Alle ikke-video-filer konverteres helt på enheten; dette betyr at det ikke er noen forsinkelse mellom sending og mottak av filer fra en server, og vi får aldri tilgang til filene du konverterer.

Videofiler lastes opp til vår lynraske RTX 4000 Ada-server. Videoene dine blir liggende der i en time hvis du ikke konverterer dem. Hvis du konverterer filen, blir videoen liggende på serveren i en time, eller til den lastes ned. Filen blir deretter slettet fra serveren vår." + }, + "sponsors": { + "title": "Sponsorer", + "description": "Vil du støtte oss? Kontakt en utvikler i [discord_link]Discord[/discord_link]-serveren, eller send en e-post til", + "email_copied": "E-post kopiert til utklippstavlen!" + }, + "resources": { + "title": "Ressurser", + "discord": "Discord", + "source": "Kilde", + "email": "E-post" + }, + "donate": { + "title": "Doner til VERT", + "description": "Med din støtte kan vi fortsette å vedlikeholde og forbedre VERT.", + "one_time": "Engangs", + "monthly": "Månedlig", + "custom": "Egendefinert", + "pay_now": "Betal nå", + "donate_amount": "Doner ${amount} USD", + "thank_you": "Takk for donasjonen!", + "payment_failed": "Betaling mislyktes: {message}{period} Du er ikke belastet.", + "donation_error": "En feil oppstod under behandlingen av donasjonen. Prøv igjen senere.", + "payment_error": "Feil ved henting av betalingsdetaljer. Prøv igjen senere.", + "donation_notice_official": "Donasjoner her går til den offisielle VERT-instansen (vert.sh) og hjelper til med å støtte utviklingen av prosjektet.", + "donation_notice_unofficial": "Donasjoner her går til operatøren av denne VERT-instansen. Hvis du ønsker å støtte de offisielle VERT-utviklerne, besøk [official_link]vert.sh[/official_link] i stedet." + }, + "credits": { + "title": "Kreditering", + "contact_team": "Hvis du vil kontakte utviklingsteamet, bruk e-posten som finnes på \"Ressurser\"-kortet.", + "notable_contributors": "Merkbare bidragsytere", + "notable_description": "Vi vil takke disse personene for deres store bidrag til VERT.", + "github_contributors": "GitHub-bidragsytere", + "github_description": "Stor takk til alle disse for å hjelpe til! [github_link]Vil du også hjelpe?[/github_link]", + "no_contributors": "Ser ut som ingen har bidratt ennå... [contribute_link]bli den første til å bidra![/contribute_link]", + "libraries": "Biblioteker", + "libraries_description": "En stor takk til FFmpeg (lyd, video), ImageMagick (bilder) og Pandoc (dokumenter) for å vedlikeholde slike utmerkede biblioteker i så mange år. VERT er avhengig av dem for å gi deg konverteringene dine.", + "roles": { + "lead_developer": "Hovedutvikler; konverteringsbackend, UI-implementering", + "developer": "Utvikler; UI-implementering", + "designer": "Designer; UX, merkevarebygging, markedsføring", + "docker_ci": "Vedlikehold av Docker & CI-støtte", + "former_cofounder": "Tidligere medgründer & designer" + } + }, + "errors": { + "github_contributors": "Feil ved henting av GitHub-bidragsytere" + } + }, + "workers": { + "errors": { + "general": "Feil ved konvertering av {file}: {message}", + "cancel": "Feil ved avbrytelse av konvertering for {file}: {message}", + "magick": "Feil i Magick-arbeider, bildekovertering fungerer kanskje ikke som forventet.", + "ffmpeg": "Feil ved lasting av FFmpeg, noen funksjoner fungerer kanskje ikke som forventet.", + "pandoc": "Feil ved lasting av Pandoc-arbeider, dokumentkonvertering fungerer kanskje ikke som forventet.", + "no_audio": "Ingen lydstrøm funnet.", + "invalid_rate": "Ugyldig samplingsfrekvens angitt: {rate}Hz", + "file_too_large": "Denne filen overskrider {limit}GB-grensen for nettleser/enhet. Prøv Firefox eller Safari for å konvertere store filer, da de vanligvis har høyere grenser." + } + }, + "privacy": { + "title": "Personvern", + "summary": { + "title": "Sammendrag", + "description": "VERTs personvernerklæring er veldig enkel: vi samler eller lagrer ingen data om deg i det hele tatt. Vi bruker ikke informasjonskapsler eller sporere, og all konvertering (bortsett fra video) skjer lokalt i nettleseren din. Videoer slettes etter nedlasting eller etter én time, med mindre du eksplisitt gir tillatelse til å lagre dem; de vil kun bli brukt til feilsøking. VERT hoster selv en Coolify-instans for å hoste nettstedet og vertd (for videokonvertering), og en Plausible-instans for helt anonym og aggregert analyse.

Merk at dette kun gjelder den offisielle VERT-instansen på [vert_link]vert.sh[/vert_link]; tredjepartsinstanser kan håndtere dataene dine annerledes." + }, + "conversions": { + "title": "Konverteringer", + "description": "De fleste konverteringer (bilder, dokumenter, lyd) skjer helt lokalt på enheten din ved hjelp av WebAssembly-versjoner av relevante verktøy (f.eks. ImageMagick, Pandoc, FFmpeg). Dette betyr at filene dine aldri forlater enheten din, og vi får aldri tilgang til dem.

Videokonverteringer utføres på våre servere fordi de krever mer prosessorkraft og ikke kan gjøres raskt nok i nettleseren ennå. Videoer du konverterer med VERT slettes etter nedlasting eller etter én time, med mindre du eksplisitt gir tillatelse til å lagre dem lenger kun for feilsøking." + }, + "donations": { + "title": "Donasjoner", + "description": "Vi bruker Stripe på [about_link]om[/about_link]-siden for å samle inn donasjoner. Stripe kan samle inn visse opplysninger om betalingen og enheten for å forhindre svindel, som beskrevet i [stripe_link]deres dokumentasjon om avansert svindeldeteksjon[/stripe_link]. Eksterne nettverksforespørsler til Stripe utsettes, og gjøres kun etter at du klikker på betal-knappen." + }, + "conversion_errors": { + "title": "Konverteringsfeil", + "description": "Når en videokonvertering feiler, kan vi samle inn noe anonym data for å hjelpe oss med å diagnostisere problemet. Denne dataen kan inkludere:", + "list_job_id": "Jobb-ID, som er det anonymiserte filnavnet", + "list_format_from": "Formatet du konverterte fra", + "list_format_to": "Formatet du konverterte til", + "list_stderr": "FFmpeg stderr-utdata fra jobben din (feilmelding)", + "list_video": "Selve videofilen (hvis eksplisitt tillatelse er gitt)", + "footer": "Denne informasjonen brukes kun til å diagnostisere konverteringsproblemer. Selve videofilen vil kun bli samlet inn hvis du gir oss tillatelse, og kun brukes til feilsøking." + }, + "analytics": { + "title": "Analyse", + "description": "Vi hoster en Plausible-instans for helt anonym og aggregert analyse. Plausible bruker ikke informasjonskapsler og overholder alle viktige personvernregler (GDPR/CCPA/PECR). Du kan melde deg ut av analyse i \"Personvern og data\"-seksjonen i [settings_link]innstillinger[/settings_link] og lese mer om Plausibles personvernpraksis [plausible_link]her[/plausible_link]." + }, + "local_storage": { + "title": "Lokal lagring", + "description": "Vi bruker nettleserens lokale lagring for å lagre innstillingene dine, og nettleserens sesjonslagring for midlertidig å lagre GitHub-bidragsyterlisten for \"Om\"-seksjonen for å redusere gjentatte GitHub API-forespørsler. Ingen personlige data lagres eller overføres.

WebAssembly-versjonene av konverteringsverktøyene vi bruker (FFmpeg, ImageMagick, Pandoc) lagres også lokalt i nettleseren din når du først besøker nettstedet, slik at du ikke trenger å laste dem ned på nytt hver gang. Ingen personlige data lagres eller overføres. Du kan se eller slette denne dataen når som helst i \"Personvern og data\"-seksjonen i [settings_link]innstillinger[/settings_link]." + }, + "contact": { + "title": "Kontakt", + "description": "For spørsmål, send oss en e-post på: [email_link]hello@vert.sh[/email_link]. Hvis du bruker en tredjepartsinstans av VERT, kontakt verten for den instansen i stedet." + }, + "last_updated": "Sist oppdatert: 2025-10-29" + }, + "toast": { + "insecure_context": "Du besøker VERT i en usikker kontekst (f.eks. tilgang via HTTP i stedet for HTTPS). Noen funksjoner kan ikke fungere som forventet." + } +} diff --git a/messages/pl.json b/messages/pl.json new file mode 100644 index 00000000..1ee22bf7 --- /dev/null +++ b/messages/pl.json @@ -0,0 +1,355 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + "navbar": { + "upload": "Prześlij", + "convert": "Konwertuj", + "settings": "Ustawienia", + "about": "O nas", + "toggle_theme": "Zmień motyw" + }, + "footer": { + "copyright": "© {year} VERT.", + "source_code": "Kod źródłowy", + "discord_server": "Serwer Discord", + "privacy_policy": "Polityka prywatności" + }, + "upload": { + "title": "Konwerter plików, który pokochasz.", + "subtitle": "Wszystkie zdjęcia, pliki audio oraz dokumenty przetwarzane są na twoim urządzeniu. Pliki wideo konwertowane są na naszych bardzo szybkich serwerach. Bez limitu rozmiaru plików, bez reklam, z otwartym kodem źródłowym.", + "uploader": { + "text": "Przeciągnij lub kliknij, aby {action}", + "convert": "konwertować" + }, + "cards": { + "title": "VERT wspiera...", + "images": "Zdjęcia", + "audio": "Pliki audio", + "documents": "Dokumenty", + "video": "Wideo", + "video_server_processing": "Wspierane serwerowo", + "local_supported": "Wspierane lokalnie", + "status": { + "text": "Status: {status}", + "ready": "gotowy", + "not_ready": "niegotowy", + "not_initialized": "niezainicjowany", + "downloading": "pobieranie...", + "initializing": "inicjowanie...", + "unknown": "nieznany status" + }, + "supported_formats": "Wspierane formaty:" + }, + "tooltip": { + "partial_support": "Ten format może zostać przekonwertowany jedynie jako {direction}.", + "direction_input": "wejście (z)", + "direction_output": "wyjście (do)", + "video_server_processing": "Domyślnie, w celu przetworzenia, pliki wideo przesyłane są na serwer, dowiedz się, jak ustawić lokalne przetwarzanie tutaj." + } + }, + "convert": { + "archive_file": { + "extract": "Wypakuj archiwum", + "extracting": "Wykryto archiwum: {filename}", + "extracted": "Wypakowanych plików z {filename}: {extract_count}. Zignorowanych plików: {ignore_count}.", + "detected": "Wykryto pliki {type} w {filename}.", + "audio": "audio", + "video": "wideo", + "doc": "dokumentowe", + "image": "zdjęciowe", + "extract_error": "Wystąpił błąd przy wypakowywaniu {filename}: {error}" + }, + "large_file_warning": "Ze względu na przeglądarkę / ograniczenia sprzętowe, konwersja wideo do audio jest niedostępna dla tego pliku, ponieważ przekracza on limit {limit}GB. Zalecamy używanie przeglądarki Firefox bądź Safari dla plików o takich rozmiarach, gdyż przeglądarki te mają mniej ograniczeń.", + "external_warning": { + "title": "Ostrzeżenie zewnętrznego serwera", + "text": "Jeśli wybierzesz konwersję na format wideo, pliki te zostaną przesłane na zewnętrzny serwer w celu konwersji. Czy chcesz kontynuować?", + "yes": "Tak", + "no": "Nie" + }, + "panel": { + "convert_all": "Konwertuj wszystko", + "download_all": "Pobierz wszystko jako .zip", + "remove_all": "Usuń wszystkie pliki", + "set_all_to": "Ustaw wszystkie jako", + "na": "Nie dotyczy" + }, + "dropdown": { + "audio": "Audio", + "video": "Wideo", + "doc": "Dokument", + "image": "Zdjęcie", + "placeholder": "Wyszukaj format", + "no_formats": "Formaty niedostępne", + "no_results": "Nie znaleziono wyszukiwanego formatu" + }, + "tooltips": { + "unknown_file": "Nieznany typ pliku", + "audio_file": "Plik audio", + "video_file": "Plik wideo", + "document_file": "Plik dokumentowy", + "image_file": "Plik obrazu", + "convert_file": "Konwertuj ten plik", + "download_file": "Pobierz ten plik" + }, + "errors": { + "cant_convert": "Nie możemy przekonwertować tego pliku.", + "unsupported_format": "Wspierane są jedynie pliki obrazów, wideo, audio oraz dokumentów", + "format_output_only": "Obecnie, ten format może być używany jedynie jako wyjście (konwersja do), nie jako wejście.", + "worker_downloading": "Konwerter {type} jest obecnie inicjowany, proszę czekać.", + "worker_error": "Konwerter {type} napotkał błąd podczas inicjacji, spróbuj ponownie później.", + "worker_timeout": "Konwerter {type} inicjowany jest dłużej niż oczekiwano, proszę odczekać kilka chwil lub odświeżyć stronę.", + "audio": "audio", + "doc": "dokumentów", + "image": "zdjęciowy", + "vertd": { + "server": "co robisz..? powinieneś uruchomić serwer vertd!", + "details": { + "view": "Wyświetl szczegóły błędu", + "body": "Jeśli wciśniesz przycisk prześlij, twoje wideo również zostanie dołączone wraz z wpisem błędu, który zawsze jest do nas wysyłany do sprawdzenia. Następująca informacja jest wpisem, który automatycznie otrzymujemy:", + "footer": "Informacja ta użyta zostanie jedynie w celu rozwiązywania błędów oraz nigdy nie zostanie udostępniona. Zobacz naszą [privacy_link]politykę prywatności[/privacy_link] po więcej szczegółów.", + "job_id": "Job ID: {jobId}", + "from": "Z formatu: {from}", + "to": "Do formatu: {to}", + "error_message": "Wiadomość błędu: [view_link]Wyświetl wpis błędu[/view_link]", + "close": "Zamknij" + }, + "generic": { + "view": "Wyświetl szczegóły błędu", + "body": "Wystąpił błąd podczas próby konwersji twojego wideo. Czy chcesz przesłać to wideo deweloperom w celu pomocy w naprawie tego błędu? Przesłane zostanie jedynie wideo. Żadne identyfikatory nie zostaną przesłane.", + "title": "Błąd konwersji wideo", + "yes": "Prześlij wideo", + "no": "Nie przesyłaj" + }, + "failed_to_keep": "Nie udało się przechować wideo na serwerze: {error}", + "ratelimit": "Nie udało się przekonwertować twojego wideo '{filename}' kilkukrotnie. Aby zapobiec przeciążeniom serwera, dalsze próby konwersji tego pliku zostały chwilowo zablokowane. Spróbuj ponownie później.", + "not_found": "Nie udało się znaleźć instancji vertd w celu uruchomienia konwersji wideo. Czy jesteś pewny, że instancja URL jest ustawiona poprawnie?" + } + } + }, + "settings": { + "title": "Ustawienia", + "errors": { + "save_failed": "Nie udało się zapisać ustawień!" + }, + "appearance": { + "title": "Wygląd", + "light": "Jasny", + "dark": "Ciemny", + "enable": "Włącz", + "disable": "Wyłącz", + "brightness": { + "theme": "Motyw", + "description": "Wolisz motyw jasny jak słońce czy ciemny jak cicha, spokojna noc?" + }, + "effect": { + "settings": "Ustawienia efektów", + "description": "Chciałbyś włączyć szalone efekty czy preferujesz bardziej statyczne doświadczenie?" + }, + "language": { + "title": "Język", + "description": "Wybierz swój preferowany język dla interfejsu VERT." + } + }, + "conversion": { + "title": "Konwersja", + "advanced_settings": "Zaawansowane ustawienia", + "default_format": { + "image": "Zdjęcia", + "audio": "Audio", + "document": "Dokumenty", + "enable": "Włączony", + "disable": "Wyłączony", + "label": "Domyślny format konwersji", + "description": "To ustawienie zmieni domyślnie wybrany format przy przesyłaniu pliku danego typu.", + "video": "Wideo" + }, + "metadata": { + "label": "Metadane pliku", + "description": "To ustawienie pozwala ci ustalić czy metadane (EXIF, informacje o piosence, itp.) oryginalnego pliku zostaną zachowane w przekonwertowanym pliku.", + "keep": "Zachowaj", + "remove": "Usuń" + }, + "quality": { + "label": "Jakość konwersji", + "description": "To ustawienie pozwala ci ustalić domyślną jakość wyjściową przekonwertowanego pliku (w danej kategorii). Wyższe wartości mogą skutkować dłuższym czasem konwersji oraz większym rozmiarem pliku.", + "video": "To ustawienie pozwala ustalić domyślną jakość wyjściową przekonwertowanego pliku wideo. Wyższe wartości mogą skutkować dłuższym czasem konwersji oraz większym rozmiarem pliku.", + "audio": "Audio (kbps)", + "images": "Zdjęcia (%)" + }, + "rate": "Częstotliwość próbkowania (Hz)", + "filename": { + "format": "Format nazwy pliku", + "description": "To ustawienie pozwoli ci określić nazwę pliku przy jego pobieraniu z wyłączeniem jego rozszerzenia. Możesz w formacie umieścić następujące wzorce, które następnie zostaną zamienione na odpowiednią informację: %name% zostanie zamieniony na oryginalną nazwę pliku, %extension% zostanie zamieniony na oryginalne rozszerzenie pliku oraz %date% zamieniony zostanie na datę kiedy plik został przekonwertowany.", + "placeholder": "VERT_%name%" + } + }, + "vertd": { + "title": "Konwersja wideo", + "status": "status:", + "loading": "ładowanie...", + "available": "dostępna, commit id {commitId}", + "unavailable": "niedostępna (czy url jest poprawny?)", + "description": { + "main": "Projekt vertd jest serwerową nakładką na FFmpeg. To pozwala ci konwertować wideo za pomocą interfejsu sieciowego VERT, nadal będąc w stanie wykorzystywać moc swojego procesora graficznego (GPU) w celu jak najszybszej konwersji.", + "info": "Dla twojej wygody hostujemy publiczną instancję, jednak ustawienie hosta na twoim własnym komputerze lub serwerze jest stosunkowo proste, jeśli wiesz, co robisz. Możesz pobrać binaria serwera [vertd_link]tutaj[/vertd_link] - w przyszłości proces tej konfiguracji będzie łatwiejszy, więc czekajcie na więcej informacji!" + }, + "instance": { + "custom": "Własna", + "label": "Instancja", + "url_placeholder": "Przykładowo: http://localhost:24153", + "auto": "Auto (zalecana)", + "eu": "Falkenstein, Niemcy", + "us": "Washington, USA" + }, + "conversion_speed": { + "speeds": { + "very_slow": "Najwolniejsza", + "slower": "Wolniejsza", + "slow": "Wolna", + "medium": "Średnia", + "fast": "Szybka", + "ultra_fast": "Ultra szybka" + }, + "label": "Prędkość konwersji", + "description": "To opisuje kompromis pomiędzy prędkością a jakością. Większa prędkość może skutkować niższą jakością, ale wykona swoje zadanie szybciej." + } + }, + "privacy": { + "title": "Prywatność i dane", + "plausible": { + "title": "Analityka Plausible", + "description": "Używamy [plausible_link]Plausible[/plausible_link], skupionego na prywatności narzędzia analitycznego, w celu zebrania w pełni anonimowych statystyk. Wszystkie dane są anonimizowane i agregowane, a żadne wrażliwe informacje nigdy nie są przesyłane ani przechowywane. Możesz zobaczyć analitykę [analytics_link]tutaj[/analytics_link] oraz podjąć decyzję o zbieraniu danych poniżej.", + "opt_in": "Wyrażam zgodę", + "opt_out": "Rezygnuję" + }, + "cache": { + "title": "Zarządzanie pamięcią podręczną", + "description": "W pamięci podręcznej przeglądarki przechowujemy pliki konwertera, abyś nie musiał ich ponownie pobierać za każdym razem, usprawniając wydajność i redukując wykorzystanie danych.", + "refresh_cache": "Odśwież pamięć podręczną", + "clear_cache": "Wyczyść pamięć podręczną", + "files_cached": "{size} ({count} plików)", + "loading_cache": "Ładowanie...", + "total_size": "Łączny rozmiar", + "files_cached_label": "Przechowywane pliki", + "cache_cleared": "Pomyślnie wyczyszczono pamięć podręczną!", + "cache_clear_error": "Nie udało się wyczyścić pamięci podręcznej." + }, + "site_data": { + "title": "Zarządzanie danymi strony", + "description": "Wyczyść wszystkie dane strony wliczając ustawienia i przechowywane pliki, przywracając VERT do swojego domyślnego stanu oraz odświeżając stronę.", + "clear_all_data": "Wyczyść wszystkie dane strony", + "clear_all_data_confirm_title": "Wyczyścić wszystkie dane strony?", + "clear_all_data_confirm": "To zresetuje wszystkie ustawienia i przechowywane pliki, a następnie odświeży stronę. To działanie jest nieodwracalne.", + "clear_all_data_cancel": "Anuluj", + "all_data_cleared": "Wszystkie dane strony wyczyszczone! Odświeżanie strony...", + "all_data_clear_error": "Nie udało się wyczyścić wszystkich danych strony." + } + } + }, + "about": { + "title": "O nas", + "why": { + "title": "Dlaczego VERT?", + "description": "Konwertery plików od zawsze nas zawodziły. Są brzydkie, przepełnione reklamami, ale przede wszystkim powolne. Postanowiliśmy rozwiązać ten problem raz na zawsze poprzez stworzenie alternatywy, która rozwiązuje wszystkie te problemy i nie tylko.

Wszystkie pliki niebędące wideo są w pełni konwertowane na urządzeniu; to oznacza brak opóźnienia pomiędzy przesyłaniem a odbieraniem plików z serwera, a my nie możemy podejrzeć plików, które konwertujesz.

Pliki wideo przesyłane zostają na nasz bardzo szybki serwer RTX 4000 Ada. Twoje pliki wideo przechowywane są tam przez godzinę jeśli ich nie przekonwertujesz. Jeżeli je przekonwertujesz, wideo zostanie na serwerze przez godzinę lub do momentu jego pobrania. Po tym czasie, plik zostanie usunięty z naszego serwera." + }, + "sponsors": { + "title": "Sponsorzy", + "description": "Chcesz nas wesprzeć? Skontaktuj się z deweloperem na serwerze [discord_link]Discord[/discord_link], lub wyślij email do", + "email_copied": "Email skopiowany do schowka!" + }, + "resources": { + "title": "Zasoby", + "discord": "Discord", + "source": "Źródło", + "email": "Email" + }, + "donate": { + "title": "Wesprzyj VERT", + "description": "Z waszym wsparciem możemy utrzymywać i rozwijać VERT.", + "one_time": "Jednorazowo", + "monthly": "Miesięcznie", + "custom": "Własna kwota", + "pay_now": "Zapłać teraz", + "donate_amount": "Dotacja w kwocie ${amount} USD", + "thank_you": "Dziękujemy za twoje wsparcie!", + "payment_failed": "Płatność nieudana: {message}{period} Nie zostałeś obciążony.", + "donation_error": "Wystąpił błąd podczas przetwarzania twojej dotacji. Spróbuj ponownie później.", + "payment_error": "Wystąpił błąd podczas pobierania danych płatności. Spróbuj ponownie później.", + "donation_notice_official": "Twoje dotacje trafiają do oficjalnej instancji VERT (vert.sh) i wspierają rozwój projektu.", + "donation_notice_unofficial": "Twoje dotacje trafiają do operatora tej instancji VERT. Jeśli chcesz wesprzeć oficjalnych deweloperów VERT, odwiedź [official_link]vert.sh[/official_link]." + }, + "credits": { + "title": "Uznanie", + "contact_team": "Jeśli chcesz się skontaktować z zespołem deweloperów, proszę użyć adresu email znajdującego się w zakładce \"Zasoby\".", + "notable_contributors": "Znaczący kontrybutorzy", + "notable_description": "Chcielibyśmy podziękować tym osobom za ich wielki wkład w VERT.", + "github_contributors": "Kontrybutorzy GitHub", + "github_description": "Wielkie podziękowania dla tych wszystkich osób za pomoc! [github_link]Też chcesz pomóc?[/github_link]", + "no_contributors": "Wygląda na to, że jeszcze nikt nie wspomógł... [contribute_link]bądź pierwszym, który nam pomoże![/contribute_link]", + "libraries": "Biblioteki", + "libraries_description": "Wielkie podziękowania dla FFmpeg (audio, wideo), ImageMagick (zdjęcia) oraz Pandoc (dokumenty) za utrzymywanie tak wspaniałych bibliotek przez tak wiele lat. VERT opiera się na nich aby umożliwić ci twoje konwersje.", + "roles": { + "lead_developer": "Główny deweloper; backend konwersji, implementacja UI", + "developer": "Deweloper; implementacja UI", + "designer": "Designer; UX, branding, marketing", + "docker_ci": "Utrzymywanie Docker oraz wsparcie CI", + "former_cofounder": "Były współzałożyciel oraz designer" + } + }, + "errors": { + "github_contributors": "Błąd przy pobieraniu kontrybutorów GitHub" + } + }, + "workers": { + "errors": { + "general": "Błąd przy konwertowaniu {file}: {message}", + "cancel": "Błąd przy anulowaniu konwersji {file}: {message}", + "magick": "Błąd w Magick worker, konwersja zdjęć może działać niezgodnie z oczekiwaniami.", + "ffmpeg": "Błąd przy wczytywaniu FFmpeg, niektóre usługi mogą działać niezgodnie z oczekiwaniami.", + "pandoc": "Błąd przy wczytywaniu Pandoc worker, konwersja dokumentów może działać niezgodnie z oczekiwaniami.", + "no_audio": "Nie odnaleziono ścieżki audio.", + "invalid_rate": "Wprowadzono nieprawidłową częstotliwość próbkowania: {rate}Hz", + "file_too_large": "Ten plik przekracza limit {limit}GB przeglądarki / urządzenia. Spróbuj użyć przeglądarki Firefox bądź Safari do konwersji tego dużego pliku, gdyż przeglądarki te mają mniejsze ograniczenia." + } + }, + "privacy": { + "title": "Polityka Prywatności", + "summary": { + "title": "Podsumowanie", + "description": "Polityka prywatności VERT jest bardzo prosta: nie zbieramy ani nie przechowujemy żadnych twoich danych. Nie używamy plików cookie ani trackerów, analityka jest w pełni prywatna, a wszystkie konwersje (oprócz plików wideo) wykonywane są lokalnie w twojej przeglądarce. Pliki wideo są usuwane po pobraniu lub po upływie godziny, chyba że wyrazisz zgodę na ich przechowanie; w takim przypadku użyte zostaną jedynie w celu rozwiązywania problemów. VERT samodzielnie hostuje instancję Coolify do hostowania strony internetowej oraz vertd (do konwersji wideo), a także instancję Plausible do anonimowych i agregowanych analiz. Używamy Stripe w celu przetwarzania dotacji, który może zbierać niektóre dane w celu zabezpieczenia przed oszustwami.

Należy pamiętać, że dotyczy to jedynie oficjalnej instancji VERT pod adresem [vert_link]vert.sh[/vert_link]; instancje stron trzecich mogą przetwarzać twoje dane w inny sposób." + }, + "conversions": { + "title": "Konwersje", + "description": "Większość konwersji (zdjęć, dokumentów, audio) wykonywana jest w pełni lokalnie na twoim urządzeniu z użyciem wersji WebAssembly odpowiednich narzędzi (np. ImageMagick, Pandoc, FFmpeg). Oznacza to, że twoje pliki nigdy nie opuszczają twojego urządzenia, a my nigdy nie będziemy mieli do nich dostępu.

Konwersje wideo wykonywane są na naszych serwerach, ponieważ wymagają one więcej mocy obliczeniowej i obecnie nie mogą być wykonywane odpowiednio szybko za pomocą przeglądarki. Pliki wideo które konwertujesz są usuwane po pobraniu lub po upływie godziny, chyba że wyrazisz zgodę na ich dłuższe przechowanie jedynie w celach rozwiązywania problemów." + }, + "donations": { + "title": "Dotacje", + "description": "Używamy Stripe w zakładce [about_link]O nas[/about_link] w celu zbierania dotacji. Stripe może zbierać konkretne informacje o płatności oraz urządzeniu aby zapobiegać oszustwom tak, jak jest to opisane w [stripe_link]ich dokumentacji o zaawansowanym wykrywaniu oszustw[/stripe_link]. Zewnętrzne żądania sieciowe kierowane do Stripe są opóźniane i są wysyłane dopiero po kliknięciu przycisku płatności." + }, + "conversion_errors": { + "title": "Błędy Konwersji", + "description": "Gdy konwersja wideo się nie powiedzie możemy zbierać pewne anonimowe dane w celu diagnozy problemu. Te dane mogą zawierać:", + "list_job_id": "Job ID, czyli anonimizowana nazwa pliku", + "list_format_from": "Format z którego konwertowano", + "list_format_to": "Format na który konwertowano", + "list_stderr": "Wyjście FFmpeg stderr twojego zadania (wiadomość błędu)", + "list_video": "Sam plik wideo (jeśli wyrażono na to zgodę)", + "footer": "Informacje te używane są jedynie w celu diagnozy problemu konwersji. Sam plik wideo przechowany będzie tylko i wyłącznie po wyrażeniu twojej zgody, gdzie będzie wykorzystywany jedynie w celu naprawy problemów." + }, + "analytics": { + "title": "Analityka", + "description": "Samodzielnie hostujemy instancję Plausible do kompletnie anonimowych i agregowanych analiz. Plausible nie używa plików cookie i przestrzega wszystkich regulacji prywatności (GDPR/CCPA/PECR). Możesz zrezygnować z analityki w sekcji \"Prywatność i dane\" w zakładce [settings_link]ustawienia[/settings_link] oraz przeczytać więcej na temat praktyk prywatności Plausible [plausible_link]tutaj[/plausible_link]." + }, + "local_storage": { + "title": "Lokalna Pamięć", + "description": "Używamy lokalnej pamięci twojej przeglądarki aby zapisać twoje ustawienia oraz pamięci sesji twojej przeglądarki aby tymczasowo przechować listę kontrybutorów GitHub w zakładce \"O nas\" aby zredukować powtarzalne zapytania do API GitHub. Żadne wrażliwe dane nie są przechowywane ani przesyłane.

Wersje WebAssembly narzędzi, których używamy (FFmpeg, ImageMagick, Pandoc) również są przechowywane lokalnie w twojej przeglądarce po twoim pierwszym odwiedzeniu strony abyś nie musiał pobierać ich przy każdym odwiedzeniu strony. Żadne wrażliwe dane nie są przechowywane ani przesyłane. Możesz zobaczyć lub usunąć te dane w dowolnym momencie w sekcji \"Prywatność i dane\" w zakładce [settings_link]ustawienia[/settings_link]." + }, + "contact": { + "title": "Kontakt", + "description": "W razie pytań prosimy o napisanie emaila na adres: [email_link]hello@vert.sh[/email_link]. Jeśli używasz instancji VERT stron trzecich prosimy o kontakt z właścicielem tej konkretnej instancji." + }, + "last_updated": "Ostatnia aktualizacja: 2025-10-29" + }, + "toast": { + "insecure_context": "Odwiedzasz VERT w niezabezpieczonym kontekście (np. uzyskujesz dostęp poprzez HTTP zamiast HTTPS). Niektóre funkcje mogą działać niezgodnie z oczekiwaniami." + } +} diff --git a/messages/pt-BR.json b/messages/pt-BR.json index 3dad52bf..79d7dd76 100644 --- a/messages/pt-BR.json +++ b/messages/pt-BR.json @@ -92,31 +92,37 @@ }, "errors": { "cant_convert": "Não podemos converter este arquivo.", - "vertd_server": "O quê você está fazendo..? você deveria executar o servidor vertd!", - "vertd_generic_view": "Ver detalhes do erro", - "vertd_generic_body": "Ocorreu um erro ao tentar converter seu vídeo. Gostaria de enviar este vídeo para os desenvolvedores para ajudar a corrigir este bug? Apenas seu arquivo de vídeo será enviado. Nenhum identificador será carregado.", - "vertd_generic_title": "Erro de conversão de vídeo", - "vertd_generic_yes": "Enviar vídeo", - "vertd_generic_no": "Não enviar", - "vertd_failed_to_keep": "Falha ao manter o vídeo no servidor: {error}", - "vertd_details": "Ver detalhes do erro", - "vertd_details_body": "Se você pressionar enviar, seu vídeo também será anexado junto com o registro de erros que sempre é relatado para nós para revisão. As seguintes informações são o registro que recebemos automaticamente:", - "vertd_details_footer": "Estas informações serão usadas apenas para fins de solução de problemas e nunca serão compartilhadas. Veja nossa [privacy_link]política de privacidade[/privacy_link] para mais detalhes.", - "vertd_details_job_id": "ID do trabalho: {jobId}", - "vertd_details_from": "Formato de origem: {from}", - "vertd_details_to": "Formato de destino: {to}", - "vertd_details_error_message": "Mensagem de erro: [view_link]Ver registros de erro[/view_link]", - "vertd_details_close": "Fechar", - "vertd_ratelimit": "Seu vídeo, '{filename}', falhou na conversão algumas vezes. Para evitar sobrecarga do servidor, novas tentativas de conversão para este arquivo foram temporariamente bloqueadas. Por favor, tente novamente mais tarde.", "unsupported_format": "Apenas arquivos de imagem, vídeo, áudio e documento são suportados", "format_output_only": "Este formato atualmente só pode ser usado como saída (convertido para), não como entrada.", - "vertd_not_found": "Não foi possível encontrar a instância vertd para iniciar a conversão de vídeo. Você tem certeza de que a URL da instância está configurada corretamente?", "worker_downloading": "O conversor {type} está sendo inicializado, por favor, aguarde alguns momentos.", "worker_error": "O conversor {type} teve um erro durante a inicialização, por favor, tente novamente mais tarde.", "worker_timeout": "O conversor {type} está demorando mais do que o esperado para inicializar, por favor, aguarde mais alguns momentos ou atualize a página.", "audio": "áudio", "doc": "documento", - "image": "imagem" + "image": "imagem", + "vertd": { + "server": "O quê você está fazendo..? você deveria executar o servidor vertd!", + "details": { + "view": "Ver detalhes do erro", + "body": "Se você pressionar enviar, seu vídeo também será anexado junto com o registro de erros que sempre é relatado para nós para revisão. As seguintes informações são o registro que recebemos automaticamente:", + "footer": "Estas informações serão usadas apenas para fins de solução de problemas e nunca serão compartilhadas. Veja nossa [privacy_link]política de privacidade[/privacy_link] para mais detalhes.", + "job_id": "ID do trabalho: {jobId}", + "from": "Formato de origem: {from}", + "to": "Formato de destino: {to}", + "error_message": "Mensagem de erro: [view_link]Ver registros de erro[/view_link]", + "close": "Fechar" + }, + "generic": { + "view": "Ver detalhes do erro", + "body": "Ocorreu um erro ao tentar converter seu vídeo. Gostaria de enviar este vídeo para os desenvolvedores para ajudar a corrigir este bug? Apenas seu arquivo de vídeo será enviado. Nenhum identificador será carregado.", + "title": "Erro de conversão de vídeo", + "yes": "Enviar vídeo", + "no": "Não enviar" + }, + "failed_to_keep": "Falha ao manter o vídeo no servidor: {error}", + "ratelimit": "Seu vídeo, '{filename}', falhou na conversão algumas vezes. Para evitar sobrecarga do servidor, novas tentativas de conversão para este arquivo foram temporariamente bloqueadas. Por favor, tente novamente mais tarde.", + "not_found": "Não foi possível encontrar a instância vertd para iniciar a conversão de vídeo. Você tem certeza de que a URL da instância está configurada corretamente?" + } } }, "settings": { @@ -126,39 +132,55 @@ }, "appearance": { "title": "Aparência", - "brightness_theme": "Tema de exibição", - "brightness_description": "Quer um visual brilhante e ensolarado, ou uma noite tranquila e solitária?", "light": "Claro", "dark": "Escuro", - "effect_settings": "Configurações de efeitos", - "effect_description": "Você gostaria de efeitos sofisticados ou uma experiência mais estática?", "enable": "Ativar", - "disable": "Desativar" + "disable": "Desativar", + "brightness": { + "theme": "Tema de exibição", + "description": "Quer um visual brilhante e ensolarado, ou uma noite tranquila e solitária?" + }, + "effect": { + "settings": "Configurações de efeitos", + "description": "Você gostaria de efeitos sofisticados ou uma experiência mais estática?" + }, + "language": { + "title": "Idioma", + "description": "Selecione seu idioma preferido para a interface do VERT." + } }, "conversion": { "title": "Conversão", "advanced_settings": "Configurações avançadas", - "filename_format": "Formato do nome do arquivo", - "filename_description": "Isso determinará o nome do arquivo no download, não incluindo a extensão do arquivo. Você pode colocar os seguintes modelos no formato, que serão substituídos pelas informações relevantes: %name% para o nome original do arquivo, %extension% para a extensão original do arquivo e %date% para uma string de data de quando o arquivo foi convertido.", - "placeholder": "VERT_%name%", - "default_format": "Formato de conversão padrão", - "default_format_enable": "Habilitar", - "default_format_disable": "Desabilitar", - "default_format_description": "Isso mudará o formato padrão selecionado quando você enviar um arquivo deste tipo.", - "default_format_image": "Imagens", - "default_format_video": "ídeos", - "default_format_audio": "Áudio", - "default_format_document": "Documentos", - "metadata": "Metadados do arquivo", - "metadata_description": "Isso altera se algum metadado (EXIF, informações da música, etc.) no arquivo original é preservado nos arquivos convertidos.", - "keep": "Manter", - "remove": "Remover", - "quality": "Qualidade da conversão", - "quality_description": "Isso altera a qualidade de saída padrão dos arquivos convertidos (em sua categoria). Valores mais altos podem resultar em tempos de conversão mais longos e tamanho de arquivo maior.", - "quality_video": "Isso altera a qualidade de saída padrão dos arquivos de vídeo convertidos. Valores mais altos podem resultar em tempos de conversão mais longos e tamanho de arquivo maior.", - "quality_audio": "Áudio (kbps)", - "quality_images": "Imagem (%)", - "rate": "Taxa de amostragem (Hz)" + "default_format": { + "image": "Imagens", + "audio": "Áudio", + "document": "Documentos", + "enable": "Habilitar", + "disable": "Desabilitar", + "label": "Formato de conversão padrão", + "description": "Isso mudará o formato padrão selecionado quando você enviar um arquivo deste tipo.", + "video": "ídeos" + }, + "metadata": { + "label": "Metadados do arquivo", + "description": "Isso altera se algum metadado (EXIF, informações da música, etc.) no arquivo original é preservado nos arquivos convertidos.", + "keep": "Manter", + "remove": "Remover" + }, + "quality": { + "label": "Qualidade da conversão", + "description": "Isso altera a qualidade de saída padrão dos arquivos convertidos (em sua categoria). Valores mais altos podem resultar em tempos de conversão mais longos e tamanho de arquivo maior.", + "video": "Isso altera a qualidade de saída padrão dos arquivos de vídeo convertidos. Valores mais altos podem resultar em tempos de conversão mais longos e tamanho de arquivo maior.", + "audio": "Áudio (kbps)", + "images": "Imagem (%)" + }, + "rate": "Taxa de amostragem (Hz)", + "filename": { + "format": "Formato do nome do arquivo", + "description": "Isso determinará o nome do arquivo no download, não incluindo a extensão do arquivo. Você pode colocar os seguintes modelos no formato, que serão substituídos pelas informações relevantes: %name% para o nome original do arquivo, %extension% para a extensão original do arquivo e %date% para uma string de data de quando o arquivo foi convertido.", + "placeholder": "VERT_%name%" + } }, "vertd": { "title": "Conversão de vídeo", @@ -166,53 +188,61 @@ "loading": "carregando...", "available": "disponível, id do commit {commitId}", "unavailable": "indisponível (a url está correta?)", - "description": "O projeto vertd é um wrapper de servidor para FFmpeg. Isso permite que você converta vídeos através da conveniência da interface web do VERT, enquanto ainda pode aproveitar o poder da sua GPU para fazer isso o mais rápido possível.", - "hosting_info": "Hospedamos uma instância pública para sua conveniência, mas é bastante fácil hospedar a sua própria em seu PC ou servidor se você souber o que está fazendo. Você pode baixar os binários do servidor [vertd_link]aqui[/vertd_link] - o processo de configuração disso ficará mais fácil no futuro, então fique atento!", - "instance": "Instância", - "url_placeholder": "Exemplo: http://localhost:24153", - "conversion_speed": "Velocidade de conversão", - "speed_description": "Isso descreve a troca entre velocidade e qualidade. Velocidades mais rápidas resultarão em qualidade inferior, mas farão o trabalho mais rapidamente.", - "speeds": { - "very_slow": "Muito lento", - "slower": "Mais lento", - "slow": "Lento", - "medium": "Médio", - "fast": "Rápido", - "ultra_fast": "Ultra rápido" + "description": { + "main": "O projeto vertd é um wrapper de servidor para FFmpeg. Isso permite que você converta vídeos através da conveniência da interface web do VERT, enquanto ainda pode aproveitar o poder da sua GPU para fazer isso o mais rápido possível.", + "info": "Hospedamos uma instância pública para sua conveniência, mas é bastante fácil hospedar a sua própria em seu PC ou servidor se você souber o que está fazendo. Você pode baixar os binários do servidor [vertd_link]aqui[/vertd_link] - o processo de configuração disso ficará mais fácil no futuro, então fique atento!" + }, + "instance": { + "custom": "Personalizado", + "label": "Instância", + "url_placeholder": "Exemplo: http://localhost:24153", + "auto": "Automático (recomendado)", + "eu": "Falkenstein, Alemanha", + "us": "Washington, EUA" }, - "auto_instance": "Automático (recomendado)", - "eu_instance": "Falkenstein, Alemanha", - "us_instance": "Washington, EUA", - "custom_instance": "Personalizado" + "conversion_speed": { + "speeds": { + "very_slow": "Muito lento", + "slower": "Mais lento", + "slow": "Lento", + "medium": "Médio", + "fast": "Rápido", + "ultra_fast": "Ultra rápido" + }, + "label": "Velocidade de conversão", + "description": "Isso descreve a troca entre velocidade e qualidade. Velocidades mais rápidas resultarão em qualidade inferior, mas farão o trabalho mais rapidamente." + } }, "privacy": { "title": "Privacidade e dados", - "plausible_title": "Analytics Plausible", - "plausible_description": "Nós usamos [plausible_link]Plausible[/plausible_link], uma ferramenta de análise focada em privacidade, para coletar estatísticas completamente anônimas. Todos os dados são anonimizados e agregados, e nenhuma informação identificável é enviada ou armazenada. Você pode visualizar as análises [analytics_link]aqui[/analytics_link] e escolher optar por não participar abaixo.", - "opt_in": "Aceitar", - "opt_out": "Recusar", - "cache_title": "Gerenciamento de cache", - "cache_description": "Armazenamos em cache os arquivos do conversor no seu navegador para que você não precise baixá-los novamente toda vez, melhorando o desempenho e reduzindo o uso de dados.", - "refresh_cache": "Atualizar cache", - "clear_cache": "Limpar cache", - "files_cached": "{size} ({count} arquivos)", - "loading_cache": "Carregando...", - "total_size": "Tamanho total", - "files_cached_label": "Arquivos em cache", - "cache_cleared": "Cache limpo com sucesso!", - "cache_clear_error": "Falha ao limpar o cache.", - "site_data_title": "Gerenciamento de dados do site", - "site_data_description": "Limpe todos os dados do site, incluindo configurações e arquivos em cache, redefinindo o VERT para seu estado padrão e recarregando a página.", - "clear_all_data": "Limpar todos os dados do site", - "clear_all_data_confirm_title": "Limpar todos os dados do site?", - "clear_all_data_confirm": "Isso irá redefinir todas as configurações e cache, e então recarregar a página. Esta ação não pode ser desfeita.", - "clear_all_data_cancel": "Cancelar", - "all_data_cleared": "Todos os dados do site foram limpos! Recarregando a página...", - "all_data_clear_error": "Falha ao limpar todos os dados do site." - }, - "language": { - "title": "Idioma", - "description": "Selecione seu idioma preferido para a interface do VERT." + "plausible": { + "title": "Analytics Plausible", + "description": "Nós usamos [plausible_link]Plausible[/plausible_link], uma ferramenta de análise focada em privacidade, para coletar estatísticas completamente anônimas. Todos os dados são anonimizados e agregados, e nenhuma informação identificável é enviada ou armazenada. Você pode visualizar as análises [analytics_link]aqui[/analytics_link] e escolher optar por não participar abaixo.", + "opt_in": "Aceitar", + "opt_out": "Recusar" + }, + "cache": { + "title": "Gerenciamento de cache", + "description": "Armazenamos em cache os arquivos do conversor no seu navegador para que você não precise baixá-los novamente toda vez, melhorando o desempenho e reduzindo o uso de dados.", + "refresh_cache": "Atualizar cache", + "clear_cache": "Limpar cache", + "files_cached": "{size} ({count} arquivos)", + "loading_cache": "Carregando...", + "total_size": "Tamanho total", + "files_cached_label": "Arquivos em cache", + "cache_cleared": "Cache limpo com sucesso!", + "cache_clear_error": "Falha ao limpar o cache." + }, + "site_data": { + "title": "Gerenciamento de dados do site", + "description": "Limpe todos os dados do site, incluindo configurações e arquivos em cache, redefinindo o VERT para seu estado padrão e recarregando a página.", + "clear_all_data": "Limpar todos os dados do site", + "clear_all_data_confirm_title": "Limpar todos os dados do site?", + "clear_all_data_confirm": "Isso irá redefinir todas as configurações e cache, e então recarregar a página. Esta ação não pode ser desfeita.", + "clear_all_data_cancel": "Cancelar", + "all_data_cleared": "Todos os dados do site foram limpos! Recarregando a página...", + "all_data_clear_error": "Falha ao limpar todos os dados do site." + } } }, "about": { diff --git a/messages/tr.json b/messages/tr.json index ed2cac8d..eb32a524 100644 --- a/messages/tr.json +++ b/messages/tr.json @@ -10,7 +10,8 @@ "footer": { "copyright": "© {year} VERT.", "source_code": "Kaynak kodu", - "discord_server": "Discord sunucusu" + "discord_server": "Discord sunucusu", + "privacy_policy": "Gizlilik politikası" }, "upload": { "title": "Sevdiğiniz dosya dönüştürücü.", @@ -46,6 +47,18 @@ } }, "convert": { + "archive_file": { + "extract": "Arşivi çıkar", + "extracting": "Arşiv algılandı: {filename}", + "extracted": "{filename} arşivinden {extract_count} dosya çıkarıldı. {ignore_count} öğe yoksayıldı.", + "detected": "{filename} içinde {type} dosyası algılandı.", + "audio": "ses", + "video": "video", + "doc": "belge", + "image": "görsel", + "extract_error": "{filename} çıkarılırken hata oluştu: {error}" + }, + "large_file_warning": "Tarayıcı / cihaz kısıtlamaları nedeniyle, bu dosya için videodan sese dönüştürme devre dışı bırakıldı çünkü {limit}GB'dan daha büyük. Bu boyuttaki dosyalar için daha az kısıtlamaya sahip olan Firefox veya Safari kullanmanızı öneririz.", "external_warning": { "title": "Harici sunucu uyarısı", "text": "Video formatına dönüştürmeyi seçerseniz, bu dosyalar dönüştürülmek üzere harici bir sunucuya yüklenecektir. Devam etmek istiyor musunuz?", @@ -64,7 +77,9 @@ "video": "Video", "doc": "Belge", "image": "Görsel", - "placeholder": "Format ara" + "placeholder": "Format ara", + "no_formats": "Kullanılabilir format yok", + "no_results": "Aramanızla eşleşen format bulunamadı" }, "tooltips": { "unknown_file": "Bilinmeyen dosya türü", @@ -77,15 +92,37 @@ }, "errors": { "cant_convert": "Bu dosyayı dönüştüremiyoruz.", - "vertd_server": "Ne yapıyorsun..? vertd sunucusunu çalıştırman gerekiyordu!", "unsupported_format": "Yalnızca görüntü, video, ses ve belge dosyaları desteklenir.", - "vertd_not_found": "Video dönüştürme işlemini başlatmak için vertd örneği bulunamadı. Sunucu URL’sinin doğru ayarlandığından emin misiniz?", + "format_output_only": "Bu format şu anda yalnızca çıktı (dönüştürülen format) olarak kullanılabilir, girdi olarak kullanılamaz.", "worker_downloading": "{type} dönüştürme işlemi şu anda başlatılıyor, lütfen birkaç saniye bekleyin.", "worker_error": "{type} dönüştürme işlemi başlatılırken bir hata oluştu, lütfen daha sonra tekrar deneyin.", "worker_timeout": "{type} dönüştürme işlemi beklenenden daha uzun sürüyor, lütfen biraz daha bekleyin veya sayfayı yenileyin.", "audio": "ses", "doc": "belge", - "image": "görsel" + "image": "görsel", + "vertd": { + "server": "Ne yapıyorsun..? vertd sunucusunu çalıştırman gerekiyordu!", + "details": { + "view": "Hata ayrıntılarını görüntüle", + "body": "Gönder'e basarsanız, incelememiz için bize bildirilen hata kaydıyla birlikte videonuz da eklenecektir. Aşağıdaki bilgiler otomatik olarak aldığımız hata kaydıdır:", + "footer": "Bu bilgiler yalnızca sorun giderme amacıyla kullanılacak ve asla paylaşılmayacaktır. Daha fazla ayrıntı için [privacy_link]gizlilik politikamıza[/privacy_link] göz atın.", + "job_id": "İş ID: {jobId}", + "from": "Kaynak format: {from}", + "to": "Hedef format: {to}", + "error_message": "Hata mesajı: [view_link]Hata kayıtlarını görüntüle[/view_link]", + "close": "Kapat" + }, + "generic": { + "view": "Hata ayrıntılarını görüntüle", + "body": "Videonuz dönüştürülmeye çalışılırken bir hata oluştu. Hatayı düzeltmeye yardımcı olmak için videoyu geliştiricilere göndermek ister misiniz? Yalnızca video dosyası gönderilecektir. Hiçbir kimlik bilgisi yüklenmeyecektir.", + "title": "Video dönüştürme hatası", + "yes": "Videoyu gönder", + "no": "Gönderme" + }, + "failed_to_keep": "Video sunucuda tutulamadı: {error}", + "ratelimit": "'{filename}' videonuz birkaç kez dönüştürülemedi. Sunucu aşırı yüklenmesini önlemek için, bu dosya için daha fazla dönüştürme denemesi geçici olarak engellendi. Lütfen daha sonra tekrar deneyin.", + "not_found": "Video dönüştürme işlemini başlatmak için vertd örneği bulunamadı. Sunucu URL’sinin doğru ayarlandığından emin misiniz?" + } } }, "settings": { @@ -95,37 +132,55 @@ }, "appearance": { "title": "Görünüm", - "brightness_theme": "Tema seçimi", - "brightness_description": "Güneşli bir gün mü istersiniz, yoksa sessiz ve yalnız bir gece mi?", "light": "Açık", "dark": "Koyu", - "effect_settings": "Efekt ayarları", - "effect_description": "Süslü efektler mi istersiniz, yoksa daha sade bir deneyim mi?", "enable": "Etkinleştir", - "disable": "Devre dışı bırak" + "disable": "Devre dışı bırak", + "brightness": { + "theme": "Tema seçimi", + "description": "Güneşli bir gün mü istersiniz, yoksa sessiz ve yalnız bir gece mi?" + }, + "effect": { + "settings": "Efekt ayarları", + "description": "Süslü efektler mi istersiniz, yoksa daha sade bir deneyim mi?" + }, + "language": { + "title": "Dil", + "description": "VERT arayüzü için tercih ettiğiniz dili seçin." + } }, "conversion": { "title": "Dönüştürme", "advanced_settings": "Gelişmiş ayarlar", - "filename_format": "Dosya adı formatı", - "filename_description": "Bu ayar, dosya uzantısını etkilemeden indirilen dosyanın adını belirleyecektir. Aşağıdaki şablonları formata ekleyebilirsiniz, bunlar ilgili bilgilerle değiştirilecektir: orijinal dosya adı için %name%, orijinal dosya uzantısı için %extension% ve dosyanın dönüştürüldüğü tarihin tarih için %date%.", - "placeholder": "VERT_%name%", - "default_format": "Varsayılan dönüştürme formatı", - "default_format_description": "Bu ayar, bu dosya türünde bir dosya yüklediğinizde seçili olan varsayılan formatı değiştirecektir.", - "default_format_image": "Görsel", - "default_format_video": "Video", - "default_format_audio": "Ses", - "default_format_document": "Belge", - "metadata": "Dosya metadata", - "metadata_description": "Bu ayar, orijinal dosyadaki meta verilerin (EXIF, şarkı bilgileri vb.) dönüştürülen dosyalarda korunup korunmayacağını değiştirir.", - "keep": "Sakla", - "remove": "Kaldır", - "quality": "Dönüştürme kalitesi", - "quality_description": "Bu, dönüştürülen dosyaların (kendi kategorisinde) varsayılan çıktı kalitesini değiştirir. Yüksek değerler, uzun dönüştürme sürelerine ve büyük dosya boyutuna neden olabilir.", - "quality_video": "Bu, dönüştürülen videoların varsayılan çıktı kalitesini değiştirir. Yüksek değerler, uzun dönüştürme sürelerine ve büyük dosya boyutuna neden olabilir.", - "quality_audio": "Ses (kbps)", - "quality_images": "Görsel (%)", - "rate": "Örnekleme oranı (Hz)" + "default_format": { + "image": "Görsel", + "audio": "Ses", + "document": "Belge", + "enable": "Etkinleştir", + "disable": "Devre dışı bırak", + "label": "Varsayılan dönüştürme formatı", + "description": "Bu ayar, bu dosya türünde bir dosya yüklediğinizde seçili olan varsayılan formatı değiştirecektir.", + "video": "Video" + }, + "metadata": { + "label": "Dosya metadata", + "description": "Bu ayar, orijinal dosyadaki meta verilerin (EXIF, şarkı bilgileri vb.) dönüştürülen dosyalarda korunup korunmayacağını değiştirir.", + "keep": "Sakla", + "remove": "Kaldır" + }, + "quality": { + "label": "Dönüştürme kalitesi", + "description": "Bu, dönüştürülen dosyaların (kendi kategorisinde) varsayılan çıktı kalitesini değiştirir. Yüksek değerler, uzun dönüştürme sürelerine ve büyük dosya boyutuna neden olabilir.", + "video": "Bu, dönüştürülen videoların varsayılan çıktı kalitesini değiştirir. Yüksek değerler, uzun dönüştürme sürelerine ve büyük dosya boyutuna neden olabilir.", + "audio": "Ses (kbps)", + "images": "Görsel (%)" + }, + "rate": "Örnekleme oranı (Hz)", + "filename": { + "format": "Dosya adı formatı", + "description": "Bu ayar, dosya uzantısını etkilemeden indirilen dosyanın adını belirleyecektir. Aşağıdaki şablonları formata ekleyebilirsiniz, bunlar ilgili bilgilerle değiştirilecektir: orijinal dosya adı için %name%, orijinal dosya uzantısı için %extension% ve dosyanın dönüştürüldüğü tarihin tarih için %date%.", + "placeholder": "VERT_%name%" + } }, "vertd": { "title": "Video dönüştürme", @@ -133,44 +188,61 @@ "loading": "yükleniyor...", "available": "uygun, işlem no: {commitId}", "unavailable": "uygun değil (url doğru mu?)", - "description": "vertd projesi, FFmpeg için bir sunucu sarmalayıcısıdır (server wrapper). Bu ayar, VERT'in web arayüzünün kullanım kolaylığı ile videoları dönüştürmenize olanak sağlarken, ekran kartınızın gücünden yararlanarak işlemi mümkün olan en hızlı şekilde yapmanızı sağlar.", - "hosting_info": "Kolaylık sağlaması açısından herkese açık bir dönüştürücü sunuyoruz, ancak kendi bilgisayarınızda veya sunucunuzda kendi dönüştürücünüzü kurmak da oldukça kolaydır. Sunucu binary dosyalarını [vertd_link]buradan[/vertd_link] indirebilirsiniz. Kurulum işlemini gelecekte daha kolay hale getirmeye çalışıyoruz, bu nedenle bizi takip etmeyi unutmayın!", - "instance": "Sunucu", - "url_placeholder": "Örneğin: http://localhost:24153", - "conversion_speed": "Dönüştürme hızı", - "speed_description": "Bu ayar, hız ve kalite arasındaki dengeyi belirlemenizi sağlar. Yüksek hızlar, düşük kaliteye neden olur ancak işlem daha hızlı tamamlanır.", - "speeds": { - "very_slow": "En Yavaş", - "slower": "Daha Yavaş", - "slow": "Yavaş", - "medium": "Orta", - "fast": "Hızlı", - "ultra_fast": "En Hızlı" + "description": { + "main": "vertd projesi, FFmpeg için bir sunucu sarmalayıcısıdır (server wrapper). Bu ayar, VERT'in web arayüzünün kullanım kolaylığı ile videoları dönüştürmenize olanak sağlarken, ekran kartınızın gücünden yararlanarak işlemi mümkün olan en hızlı şekilde yapmanızı sağlar.", + "info": "Kolaylık sağlaması açısından herkese açık bir dönüştürücü sunuyoruz, ancak kendi bilgisayarınızda veya sunucunuzda kendi dönüştürücünüzü kurmak da oldukça kolaydır. Sunucu binary dosyalarını [vertd_link]buradan[/vertd_link] indirebilirsiniz. Kurulum işlemini gelecekte daha kolay hale getirmeye çalışıyoruz, bu nedenle bizi takip etmeyi unutmayın!" + }, + "instance": { + "custom": "Özel", + "label": "Sunucu", + "url_placeholder": "Örneğin: http://localhost:24153", + "auto": "Otomatik (önerilen)", + "eu": "Falkenstein, Germany", + "us": "Washington, USA" }, - "auto_instance": "Otomatik (önerilen)", - "eu_instance": "Falkenstein, Germany", - "us_instance": "Washington, USA", - "custom_instance": "Özel" + "conversion_speed": { + "speeds": { + "very_slow": "En Yavaş", + "slower": "Daha Yavaş", + "slow": "Yavaş", + "medium": "Orta", + "fast": "Hızlı", + "ultra_fast": "En Hızlı" + }, + "label": "Dönüştürme hızı", + "description": "Bu ayar, hız ve kalite arasındaki dengeyi belirlemenizi sağlar. Yüksek hızlar, düşük kaliteye neden olur ancak işlem daha hızlı tamamlanır." + } }, "privacy": { "title": "Gizlilik & kişisel veriler", - "plausible_title": "Plausible analytics", - "plausible_description": "Tamamen anonim istatistikler toplamak için gizliliğe odaklı bir analiz aracı olan [plausible_link]Plausible[/plausible_link]’ı kullanıyoruz. Tüm veriler anonimleştirilmiş ve birleştirilmiş şekilde işlenir; hiçbir kişisel veya tanımlanabilir bilgi gönderilmez ya da saklanmaz. Analitik verilerini [analytics_link]buradan[/analytics_link] görüntüleyebilir ve aşağıdan devre dışı bırakmayı seçebilirsiniz.", - "opt_in": "Etkinleştir", - "opt_out": "Devre dışı bırak", - "cache_title": "Önbellek yönetimi", - "cache_description": "Dönüştürücü dosyalarını tarayıcınızda önbelleğe alırız, böylece her seferinde yeniden indirmenize gerek kalmaz, performans artar ve veri kullanımı azalır.", - "refresh_cache": "Önbelleği Yenile", - "clear_cache": "Önbelleği Temizle", - "files_cached": "{size} ({count} dosya)", - "loading_cache": "Yükleniyor...", - "total_size": "Toplam Boyut", - "files_cached_label": "Önbelleğe Alınan Dosyalar", - "cache_cleared": "Önbellek başarıyla temizlendi." - }, - "language": { - "title": "Dil", - "description": "VERT arayüzü için tercih ettiğiniz dili seçin." + "plausible": { + "title": "Plausible analytics", + "description": "Tamamen anonim istatistikler toplamak için gizliliğe odaklı bir analiz aracı olan [plausible_link]Plausible[/plausible_link]’ı kullanıyoruz. Tüm veriler anonimleştirilmiş ve birleştirilmiş şekilde işlenir; hiçbir kişisel veya tanımlanabilir bilgi gönderilmez ya da saklanmaz. Analitik verilerini [analytics_link]buradan[/analytics_link] görüntüleyebilir ve aşağıdan devre dışı bırakmayı seçebilirsiniz.", + "opt_in": "Etkinleştir", + "opt_out": "Devre dışı bırak" + }, + "cache": { + "title": "Önbellek yönetimi", + "description": "Dönüştürücü dosyalarını tarayıcınızda önbelleğe alırız, böylece her seferinde yeniden indirmenize gerek kalmaz, performans artar ve veri kullanımı azalır.", + "refresh_cache": "Önbelleği Yenile", + "clear_cache": "Önbelleği Temizle", + "files_cached": "{size} ({count} dosya)", + "loading_cache": "Yükleniyor...", + "total_size": "Toplam Boyut", + "files_cached_label": "Önbelleğe Alınan Dosyalar", + "cache_cleared": "Önbellek başarıyla temizlendi!", + "cache_clear_error": "Önbellek temizlenemedi." + }, + "site_data": { + "title": "Site verileri yönetimi", + "description": "Ayarlar ve önbelleğe alınmış dosyalar dahil olmak üzere tüm site verilerini temizleyerek VERT'i varsayılan durumuna sıfırlayın ve sayfayı yeniden yükleyin.", + "clear_all_data": "Tüm site verilerini temizle", + "clear_all_data_confirm_title": "Tüm site verileri temizlensin mi?", + "clear_all_data_confirm": "Bu işlem tüm ayarları ve önbelleği sıfırlayacak, ardından sayfayı yeniden yükleyecektir. Bu işlem geri alınamaz.", + "clear_all_data_cancel": "İptal", + "all_data_cleared": "Tüm site verileri temizlendi! Sayfa yeniden yükleniyor...", + "all_data_clear_error": "Site verileri temizlenemedi." + } } }, "about": { @@ -197,11 +269,13 @@ "monthly": "Aylık", "custom": "Özel", "pay_now": "Ödeme yap", - "donate_amount": "${amount} USD Bağış Yap", + "donate_amount": "{amount} USD Bağış Yap", "thank_you": "Bağışınız için teşekkür ederiz!", "payment_failed": "Ödeme başarısız: {message}{period} Kartınızdan para çekilmedi.", "donation_error": "Bağışınız işlenirken bir hata oluştu. Lütfen daha sonra tekrar deneyin.", - "payment_error": "Ödeme bilgileri alınırken hata oluştu. Lütfen daha sonra tekrar deneyin." + "payment_error": "Ödeme bilgileri alınırken hata oluştu. Lütfen daha sonra tekrar deneyin.", + "donation_notice_official": "Bu bağışlarınız, resmi VERT uygulamasına (vert.sh) gider ve projenin gelişimini desteklemeye yardımcı olur.", + "donation_notice_unofficial": "Bu bağışlarınız, kullanmakta olduğunu VERT uygulamasının sahibine gider. Resmi VERT geliştiricilerini desteklemek istiyorsanız lütfen [official_link]vert.sh[/official_link] adresini ziyaret edin." }, "credits": { "title": "Katkıda bulunanlar", @@ -231,8 +305,51 @@ "cancel": "{file} için dönüştürme işlemi iptal edilirken hata oluştu: {message}", "magick": "Magick işlemi sırasında hata oluştu, görsel dönüştürme işlemi beklendiği gibi çalışmayabilir.", "ffmpeg": "ffmpeg yüklenirken hata oluştu, bazı özellikler çalışmayabilir.", + "pandoc": "Pandoc işlemi sırasında hata oluştu, belge dönüştürme işlemi beklendiği gibi çalışmayabilir.", "no_audio": "Ses akışı bulunamadı.", - "invalid_rate": "Geçersiz örnekleme hızı: {rate}Hz" + "invalid_rate": "Geçersiz örnekleme hızı: {rate}Hz", + "file_too_large": "Bu dosya {limit}GB olan tarayıcı / cihaz sınırını aşıyor. Bu büyük dosyayı dönüştürmek için genellikle daha yüksek sınırlara sahip olan Firefox veya Safari'yi deneyin." } + }, + "privacy": { + "title": "Gizlilik Politikası", + "summary": { + "title": "Özet", + "description": "VERT'in gizlilik politikası oldukça basittir: hakkınızda hiçbir veri toplamıyoruz veya saklamıyoruz. Çerez veya takipçi kullanmıyoruz, analizler tamamen gizlidir ve tüm dönüştürmeler (videolar hariç) yerel olarak tarayıcınızda gerçekleşir. Videolar, sorun giderme amacıyla saklanması için tarafınızca açıkça izin verilmedikçe, indirildikten sonra veya bir saat içinde silinir; yalnızca sorun giderme amacıyla kullanılacaktır. VERT, web sitesini ve vertd'yi (video dönüştürme için) barındırmak için kendi bünyesinde bir Coolify uygulaması ve tamamen anonim ve toplu analizler için bir Plausible uygulaması barındırır. Bağışları işlemek için Stripe kullanıyoruz, bu da dolandırıcılığı önlemek için kullanılan bazı verileri toplayabilir.

Not: Bu durum yalnızca [vert_link]vert.sh[/vert_link] adresindeki resmi VERT uygulaması için geçerli olabilir; üçüncü taraf uygulamalar verilerinizi farklı şekilde işleyebilir." + }, + "conversions": { + "title": "Dönüştürmeler", + "description": "Çoğu dönüştürme (görüntüler, belgeler, ses) ilgili araçların (örn. ImageMagick, Pandoc, FFmpeg) WebAssembly sürümleri kullanılarak tamamen yerel olarak cihazınızda gerçekleşir. Bu, dosyalarınızın asla cihazınızdan çıkmadığı ve onlara asla erişemeyeceğimiz anlamına gelir.

Video dönüştürmeleri sunucularımızda gerçekleştirilir çünkü daha fazla işlem gücü gerektirirler ve henüz tarayıcıda yerel olarak hızlıca yapılması mümkün değildir. VERT ile dönüştürdüğünüz videolar, sorun giderme amacıyla saklamamız için açıkça izin vermediğiniz sürece indirildikten sonra silinir (indirilmeyen dosyalar, dönüştürme sonrası bir saatlik sürenin ardından silinir)." + }, + "donations": { + "title": "Bağışlar", + "description": "Bağış toplamak için [about_link]hakkımızda[/about_link] sayfasında Stripe kullanıyoruz. Stripe, [gelişmiş dolandırıcılık tespiti hakkındaki belgelerinde] (https://stripe.com/docs/disputes/prevention/advanced-fraud-detection) açıklandığı gibi dolandırıcılığı önlemek için ödeme ve cihaz hakkında belirli bilgiler toplayabilir. Stripe'a yönelik harici ağ istekleri, yalnızca ödeme yapılırken gerçekleşir." + }, + "conversion_errors": { + "title": "Dönüştürme Hataları", + "description": "Bir video dönüştürme işlemi başarısız olduğunda, sorunu teşhis etmemize yardımcı olması için bazı anonim veriler toplayabiliriz. Bu veriler şunları içerebilir:", + "list_job_id": "Anonimleştirilmiş dosya adı olan iş ID'si", + "list_format_from": "Dönüştürdüğünüz kaynak format", + "list_format_to": "Dönüştürdüğünüz hedef format", + "list_stderr": "Dönüştürme işleminizin FFmpeg stderr çıktısı (hata mesajı)", + "list_video": "Gerçek video dosyası (açıkça izin verilmişse)", + "footer": "bu bilgiler yalnızca dönüştürme sorunlarını teşhis etmek amacıyla kullanılır. Gerçek video dosyası yalnızca bize izin verirseniz toplanır ve bu dosya yalnızca sorun giderme amacıyla kullanılır." + }, + "analytics": { + "title": "Analitik", + "description": "Tamamen anonim ve toplu analizler için kendi bünyemizde barındırdığımız bir Plausible uygulaması kullanıyoruz. Plausible çerez kullanmaz ve tüm ana gizlilik düzenlemelerine (GDPR/CCPA/PECR) uygundur. [settings_link]ayarlar[/settings_link] içindeki \"Gizlilik ve veriler\" bölümünden analizlerden çıkabilir ve Plausible'ın gizlilik uygulamaları hakkında daha fazla bilgiyi [plausible_link]buradan[/plausible_link] okuyabilirsiniz." + }, + "local_storage": { + "title": "Yerel Depolama", + "description": "Ayarlarınızı kaydetmek için tarayıcınızın yerel depolama alanını (local storage) ve tekrarlanan GitHub API isteklerini azaltmak için \"Hakkımızda\" bölümündeki GitHub katkıda bulunanlar listesini geçici olarak depolamak için tarayıcınızın oturum depolama alanını (session storage) kullanıyoruz. Hiçbir kişisel veri saklanmaz veya iletilmez.

Kullandığımız dönüştürme araçlarının (FFmpeg, ImageMagick, Pandoc) WebAssembly sürümleri de web sitesini ilk ziyaret ettiğinizde tarayıcınızda yerel olarak saklanır, böylece her ziyarette bunları yeniden indirmeniz gerekmez. Hiçbir kişisel veri saklanmaz veya iletilmez. Bu verileri istediğiniz zaman [settings_link]ayarlar[/settings_link] içindeki \"Gizlilik ve veriler\" bölümünden görüntüleyebilir veya silebilirsiniz." + }, + "contact": { + "title": "İletişim", + "description": "Sorularınız için bize e-posta gönderin: [email_link]hello@vert.sh[/email_link]. Üçüncü taraf bir VERT uygulaması kullanıyorsanız, lütfen bunun yerine o uygulamanın barındırıcısıyla iletişime geçin." + }, + "last_updated": "Son güncelleme: 29 Ekim 2025" + }, + "toast": { + "insecure_context": "VERT'i güvenli olmayan bir bağlantıda ziyaret ediyorsunuz (örneğin HTTPS yerine HTTP üzerinden erişim). Bazı özellikler beklendiği gibi çalışmayabilir." } } diff --git a/messages/zh-Hans.json b/messages/zh-Hans.json index eb864e61..4436bbef 100644 --- a/messages/zh-Hans.json +++ b/messages/zh-Hans.json @@ -84,30 +84,36 @@ }, "errors": { "cant_convert": "无法转换此文件。", - "vertd_server": "你在做什么...?你应该运行 vertd 服务器!", - "vertd_generic_view": "查看错误详情", - "vertd_generic_body": "尝试转换视频时发生错误。你想将此视频提交给开发者以帮助修复此错误吗?只会发送你的视频文件,不会上传任何标识符。", - "vertd_generic_title": "视频转换错误", - "vertd_generic_yes": "提交视频", - "vertd_generic_no": "不提交", - "vertd_failed_to_keep": "无法在服务器上保留视频:{error}", - "vertd_details": "查看错误详情", - "vertd_details_body": "如果你按下提交,你的视频也会被附加在错误日志旁边,日志会自动报告给我们审核。以下信息是我们自动接收的日志:", - "vertd_details_footer": "此信息仅用于故障排查,绝不会被共享。查看我们的[privacy_link]隐私政策[/privacy_link]了解更多详情。", - "vertd_details_job_id": "任务 ID:{jobId}", - "vertd_details_from": "来源格式:{from}", - "vertd_details_to": "目标格式:{to}", - "vertd_details_error_message": "错误消息:[view_link]查看错误日志[/view_link]", - "vertd_details_close": "关闭", "unsupported_format": "仅支持图片、视频、音频和文档文件", "format_output_only": "此格式目前只能用作输出(转换目标),不能用作输入。", - "vertd_not_found": "未找到 vertd 实例来开始视频转换。请确保实例 URL 设置正确。", "worker_downloading": "{type}转换器正在初始化,请稍候。", "worker_error": "{type}转换器初始化时出错,请稍后重试。", "worker_timeout": "{type}转换器初始化时间超出预期,请再等待一会儿或刷新页面。", "audio": "音频", "doc": "文档", - "image": "图片" + "image": "图片", + "vertd": { + "server": "你在做什么...?你应该运行 vertd 服务器!", + "details": { + "view": "查看错误详情", + "body": "如果你按下提交,你的视频也会被附加在错误日志旁边,日志会自动报告给我们审核。以下信息是我们自动接收的日志:", + "footer": "此信息仅用于故障排查,绝不会被共享。查看我们的[privacy_link]隐私政策[/privacy_link]了解更多详情。", + "job_id": "任务 ID:{jobId}", + "from": "来源格式:{from}", + "to": "目标格式:{to}", + "error_message": "错误消息:[view_link]查看错误日志[/view_link]", + "close": "关闭" + }, + "generic": { + "view": "查看错误详情", + "body": "尝试转换视频时发生错误。你想将此视频提交给开发者以帮助修复此错误吗?只会发送你的视频文件,不会上传任何标识符。", + "title": "视频转换错误", + "yes": "提交视频", + "no": "不提交" + }, + "failed_to_keep": "无法在服务器上保留视频:{error}", + "not_found": "未找到 vertd 实例来开始视频转换。请确保实例 URL 设置正确。" + } } }, "settings": { @@ -117,37 +123,53 @@ }, "appearance": { "title": "外观", - "brightness_theme": "亮度主题", - "brightness_description": "想要阳光明媚的闪光弹,还是宁静孤独的夜晚?", "light": "浅色", "dark": "深色", - "effect_settings": "效果设置", - "effect_description": "你想要华丽的效果,还是更静态的体验?", "enable": "启用", - "disable": "禁用" + "disable": "禁用", + "brightness": { + "theme": "亮度主题", + "description": "想要阳光明媚的闪光弹,还是宁静孤独的夜晚?" + }, + "effect": { + "settings": "效果设置", + "description": "你想要华丽的效果,还是更静态的体验?" + }, + "language": { + "title": "语言", + "description": "选择 VERT 界面的首选语言。" + } }, "conversion": { "title": "转换", "advanced_settings": "高级设置", - "filename_format": "文件名格式", - "filename_description": "这将决定下载时的文件名,不包括文件扩展名。你可以在格式中使用以下模板,它们将被替换为相关信息:%name%表示原始文件名,%extension%表示原始文件扩展名,%date%表示文件转换时的日期字符串。", - "placeholder": "VERT_%name%", - "default_format": "默认转换格式", - "default_format_description": "这将更改上传此文件类型时自动选择的默认格式。", - "default_format_image": "图片", - "default_format_video": "视频", - "default_format_audio": "音频", - "default_format_document": "文档", - "metadata": "文件元数据", - "metadata_description": "这将更改转换后的文件是否保留原始文件的元数据(EXIF、歌曲信息等)。", - "keep": "保留", - "remove": "删除", - "quality": "转换质量", - "quality_description": "更改输出文件的质量。值越高,处理时间和文件大小越大。", - "quality_video": "更改视频转换的质量。质量越高,转换时间和文件大小越大。", - "quality_audio": "音频(kbps)", - "quality_images": "图片(%)", - "rate": "采样率(Hz)" + "default_format": { + "image": "图片", + "audio": "音频", + "document": "文档", + "label": "默认转换格式", + "description": "这将更改上传此文件类型时自动选择的默认格式。", + "video": "视频" + }, + "metadata": { + "label": "文件元数据", + "description": "这将更改转换后的文件是否保留原始文件的元数据(EXIF、歌曲信息等)。", + "keep": "保留", + "remove": "删除" + }, + "quality": { + "label": "转换质量", + "description": "更改输出文件的质量。值越高,处理时间和文件大小越大。", + "video": "更改视频转换的质量。质量越高,转换时间和文件大小越大。", + "audio": "音频(kbps)", + "images": "图片(%)" + }, + "rate": "采样率(Hz)", + "filename": { + "format": "文件名格式", + "description": "这将决定下载时的文件名,不包括文件扩展名。你可以在格式中使用以下模板,它们将被替换为相关信息:%name%表示原始文件名,%extension%表示原始文件扩展名,%date%表示文件转换时的日期字符串。", + "placeholder": "VERT_%name%" + } }, "vertd": { "title": "视频转换", @@ -155,53 +177,61 @@ "loading": "加载中...", "available": "可用(提交 ID {commitId})", "unavailable": "不可用(URL 正确吗?)", - "description": "vertd项目是 FFmpeg 的服务器包装器。这允许你通过 VERT 网页界面方便地转换视频,同时仍能利用 GPU 的强大性能以尽可能快的速度完成转换。", - "hosting_info": "我们为你提供了一个公共实例以方便使用,但如果你知道如何操作,在自己的电脑或服务器上托管也很容易。你可以在[vertd_link]这里[/vertd_link]下载服务器二进制文件 - 设置过程将来会变得更简单,敬请期待!", - "instance": "实例", - "url_placeholder": "例如:http://localhost:24153", - "conversion_speed": "转换速度", - "speed_description": "这描述了速度和质量之间的权衡。速度越快质量越低,但完成工作的速度更快。", - "speeds": { - "very_slow": "非常慢", - "slower": "较慢", - "slow": "慢", - "medium": "中等", - "fast": "快", - "ultra_fast": "超快" + "description": { + "main": "vertd项目是 FFmpeg 的服务器包装器。这允许你通过 VERT 网页界面方便地转换视频,同时仍能利用 GPU 的强大性能以尽可能快的速度完成转换。", + "info": "我们为你提供了一个公共实例以方便使用,但如果你知道如何操作,在自己的电脑或服务器上托管也很容易。你可以在[vertd_link]这里[/vertd_link]下载服务器二进制文件 - 设置过程将来会变得更简单,敬请期待!" + }, + "instance": { + "custom": "自定义", + "label": "实例", + "url_placeholder": "例如:http://localhost:24153", + "auto": "自动(推荐)", + "eu": "德国法尔肯施泰因", + "us": "美国华盛顿" }, - "auto_instance": "自动(推荐)", - "eu_instance": "德国法尔肯施泰因", - "us_instance": "美国华盛顿", - "custom_instance": "自定义" + "conversion_speed": { + "speeds": { + "very_slow": "非常慢", + "slower": "较慢", + "slow": "慢", + "medium": "中等", + "fast": "快", + "ultra_fast": "超快" + }, + "label": "转换速度", + "description": "这描述了速度和质量之间的权衡。速度越快质量越低,但完成工作的速度更快。" + } }, "privacy": { "title": "隐私与数据", - "plausible_title": "Plausible 分析", - "plausible_description": "我们使用[plausible_link]Plausible[/plausible_link],一个注重隐私的分析工具,来收集完全匿名的统计数据。所有数据都是匿名和聚合的,不会发送或存储任何可识别信息。你可以在[analytics_link]这里[/analytics_link]查看分析数据,并在下方选择退出。", - "opt_in": "选择加入", - "opt_out": "选择退出", - "cache_title": "缓存管理", - "cache_description": "我们在浏览器中缓存转换器文件,这样你就不必每次都重新下载,从而提高性能并减少数据使用。", - "refresh_cache": "刷新缓存", - "clear_cache": "清除缓存", - "files_cached": "{size}({count}个文件)", - "loading_cache": "加载中...", - "total_size": "总大小", - "files_cached_label": "已缓存文件", - "cache_cleared": "缓存已成功清除!", - "cache_clear_error": "清除缓存失败。", - "site_data_title": "网站数据管理", - "site_data_description": "清除所有网站数据,包括设置和缓存文件,将 VERT 重置为默认状态并重新加载页面。", - "clear_all_data": "清除所有网站数据", - "clear_all_data_confirm_title": "清除所有网站数据?", - "clear_all_data_confirm": "这将重置所有设置和缓存,然后重新加载页面。此操作无法撤消。", - "clear_all_data_cancel": "取消", - "all_data_cleared": "所有网站数据已清除!正在重新加载页面...", - "all_data_clear_error": "清除所有网站数据失败。" - }, - "language": { - "title": "语言", - "description": "选择 VERT 界面的首选语言。" + "plausible": { + "title": "Plausible 分析", + "description": "我们使用[plausible_link]Plausible[/plausible_link],一个注重隐私的分析工具,来收集完全匿名的统计数据。所有数据都是匿名和聚合的,不会发送或存储任何可识别信息。你可以在[analytics_link]这里[/analytics_link]查看分析数据,并在下方选择退出。", + "opt_in": "选择加入", + "opt_out": "选择退出" + }, + "cache": { + "title": "缓存管理", + "description": "我们在浏览器中缓存转换器文件,这样你就不必每次都重新下载,从而提高性能并减少数据使用。", + "refresh_cache": "刷新缓存", + "clear_cache": "清除缓存", + "files_cached": "{size}({count}个文件)", + "loading_cache": "加载中...", + "total_size": "总大小", + "files_cached_label": "已缓存文件", + "cache_cleared": "缓存已成功清除!", + "cache_clear_error": "清除缓存失败。" + }, + "site_data": { + "title": "网站数据管理", + "description": "清除所有网站数据,包括设置和缓存文件,将 VERT 重置为默认状态并重新加载页面。", + "clear_all_data": "清除所有网站数据", + "clear_all_data_confirm_title": "清除所有网站数据?", + "clear_all_data_confirm": "这将重置所有设置和缓存,然后重新加载页面。此操作无法撤消。", + "clear_all_data_cancel": "取消", + "all_data_cleared": "所有网站数据已清除!正在重新加载页面...", + "all_data_clear_error": "清除所有网站数据失败。" + } } }, "about": { diff --git a/messages/zh-Hant.json b/messages/zh-Hant.json index 5b155569..e64b55d4 100644 --- a/messages/zh-Hant.json +++ b/messages/zh-Hant.json @@ -84,30 +84,36 @@ }, "errors": { "cant_convert": "無法轉換此檔案。", - "vertd_server": "你在做什麼...?你應該執行 vertd 伺服器!", - "vertd_generic_view": "檢視錯誤詳情", - "vertd_generic_body": "嘗試轉換影片時發生錯誤。你想將此影片提交給開發者以協助修復此錯誤嗎?只會傳送你的影片檔案,不會上傳任何識別碼。", - "vertd_generic_title": "影片轉換錯誤", - "vertd_generic_yes": "提交影片", - "vertd_generic_no": "不提交", - "vertd_failed_to_keep": "無法在伺服器上保留影片:{error}", - "vertd_details": "檢視錯誤詳情", - "vertd_details_body": "如果你按下提交,你的影片也會被附加在錯誤日誌旁邊,日誌會自動報告給我們審核。以下資訊是我們自動接收的日誌:", - "vertd_details_footer": "此資訊僅用於故障排除,絕不會被分享。檢視我們的[privacy_link]隱私權政策[/privacy_link]以了解更多詳情。", - "vertd_details_job_id": "任務 ID:{jobId}", - "vertd_details_from": "來源格式:{from}", - "vertd_details_to": "目標格式:{to}", - "vertd_details_error_message": "錯誤訊息:[view_link]檢視錯誤日誌[/view_link]", - "vertd_details_close": "關閉", "unsupported_format": "僅支援圖片、影片、音訊和文件檔案", "format_output_only": "此格式目前只能用作輸出(轉換目標),不能用作輸入。", - "vertd_not_found": "未找到 vertd 執行個體來開始影片轉換。請確保執行個體 URL 設定正確。", "worker_downloading": "{type}轉換器正在初始化,請稍候。", "worker_error": "{type}轉換器初始化時出錯,請稍後重試。", "worker_timeout": "{type}轉換器初始化時間超出預期,請再等待一會兒或重新整理頁面。", "audio": "音訊", "doc": "文件", - "image": "圖片" + "image": "圖片", + "vertd": { + "server": "你在做什麼...?你應該執行 vertd 伺服器!", + "details": { + "view": "檢視錯誤詳情", + "body": "如果你按下提交,你的影片也會被附加在錯誤日誌旁邊,日誌會自動報告給我們審核。以下資訊是我們自動接收的日誌:", + "footer": "此資訊僅用於故障排除,絕不會被分享。檢視我們的[privacy_link]隱私權政策[/privacy_link]以了解更多詳情。", + "job_id": "任務 ID:{jobId}", + "from": "來源格式:{from}", + "to": "目標格式:{to}", + "error_message": "錯誤訊息:[view_link]檢視錯誤日誌[/view_link]", + "close": "關閉" + }, + "generic": { + "view": "檢視錯誤詳情", + "body": "嘗試轉換影片時發生錯誤。你想將此影片提交給開發者以協助修復此錯誤嗎?只會傳送你的影片檔案,不會上傳任何識別碼。", + "title": "影片轉換錯誤", + "yes": "提交影片", + "no": "不提交" + }, + "failed_to_keep": "無法在伺服器上保留影片:{error}", + "not_found": "未找到 vertd 執行個體來開始影片轉換。請確保執行個體 URL 設定正確。" + } } }, "settings": { @@ -117,37 +123,53 @@ }, "appearance": { "title": "外觀", - "brightness_theme": "亮度主題", - "brightness_description": "想要陽光明媚的閃光彈,還是寧靜孤獨的夜晚?", "light": "淺色", "dark": "深色", - "effect_settings": "效果設定", - "effect_description": "你想要華麗的效果,還是更靜態的體驗?", "enable": "啟用", - "disable": "停用" + "disable": "停用", + "brightness": { + "theme": "亮度主題", + "description": "想要陽光明媚的閃光彈,還是寧靜孤獨的夜晚?" + }, + "effect": { + "settings": "效果設定", + "description": "你想要華麗的效果,還是更靜態的體驗?" + }, + "language": { + "title": "語言", + "description": "選擇 VERT 介面的偏好語言。" + } }, "conversion": { "title": "轉換", "advanced_settings": "進階設定", - "filename_format": "檔案名稱格式", - "filename_description": "這將決定下載時的檔案名稱,不包括副檔名。你可以在格式中使用以下範本,它們將被替換為相關資訊:%name%表示原始檔案名稱,%extension%表示原始副檔名,%date%表示檔案轉換時的日期字串。", - "placeholder": "VERT_%name%", - "default_format": "預設轉換格式", - "default_format_description": "這將更改上傳此檔案類型時自動選擇的預設格式。", - "default_format_image": "圖片", - "default_format_video": "影片", - "default_format_audio": "音訊", - "default_format_document": "文件", - "metadata": "檔案中繼資料", - "metadata_description": "這將更改轉換後的檔案是否保留原始檔案的中繼資料(EXIF、歌曲資訊等)。", - "keep": "保留", - "remove": "移除", - "quality": "轉換品質", - "quality_description": "更改輸出檔案的品質。值越高,處理時間和檔案大小越大。", - "quality_video": "更改影片轉換的品質。品質越高,轉換時間和檔案大小越大。", - "quality_audio": "音訊(kbps)", - "quality_images": "圖片(%)", - "rate": "取樣率(Hz)" + "default_format": { + "image": "圖片", + "audio": "音訊", + "document": "文件", + "label": "預設轉換格式", + "description": "這將更改上傳此檔案類型時自動選擇的預設格式。", + "video": "影片" + }, + "metadata": { + "label": "檔案中繼資料", + "description": "這將更改轉換後的檔案是否保留原始檔案的中繼資料(EXIF、歌曲資訊等)。", + "keep": "保留", + "remove": "移除" + }, + "quality": { + "label": "轉換品質", + "description": "更改輸出檔案的品質。值越高,處理時間和檔案大小越大。", + "video": "更改影片轉換的品質。品質越高,轉換時間和檔案大小越大。", + "audio": "音訊(kbps)", + "images": "圖片(%)" + }, + "rate": "取樣率(Hz)", + "filename": { + "format": "檔案名稱格式", + "description": "這將決定下載時的檔案名稱,不包括副檔名。你可以在格式中使用以下範本,它們將被替換為相關資訊:%name%表示原始檔案名稱,%extension%表示原始副檔名,%date%表示檔案轉換時的日期字串。", + "placeholder": "VERT_%name%" + } }, "vertd": { "title": "影片轉換", @@ -155,53 +177,61 @@ "loading": "載入中...", "available": "可用(提交 ID {commitId})", "unavailable": "不可用(URL 正確嗎?)", - "description": "vertd專案是 FFmpeg 的伺服器包裝器。這允許你透過 VERT 網頁介面方便地轉換影片,同時仍能利用 GPU 的強大效能以儘可能快的速度完成轉換。", - "hosting_info": "我們為你提供了一個公共執行個體以方便使用,但如果你知道如何操作,在自己的電腦或伺服器上託管也很容易。你可以在[vertd_link]這裡[/vertd_link]下載伺服器二進位檔案 - 設定程序將來會變得更簡單,敬請期待!", - "instance": "執行個體", - "url_placeholder": "例如:http://localhost:24153", - "conversion_speed": "轉換速度", - "speed_description": "這描述了速度和品質之間的權衡。速度越快品質越低,但完成工作的速度更快。", - "speeds": { - "very_slow": "非常慢", - "slower": "較慢", - "slow": "慢", - "medium": "中等", - "fast": "快", - "ultra_fast": "超快" + "description": { + "main": "vertd專案是 FFmpeg 的伺服器包裝器。這允許你透過 VERT 網頁介面方便地轉換影片,同時仍能利用 GPU 的強大效能以儘可能快的速度完成轉換。", + "info": "我們為你提供了一個公共執行個體以方便使用,但如果你知道如何操作,在自己的電腦或伺服器上託管也很容易。你可以在[vertd_link]這裡[/vertd_link]下載伺服器二進位檔案 - 設定程序將來會變得更簡單,敬請期待!" + }, + "instance": { + "custom": "自訂", + "label": "執行個體", + "url_placeholder": "例如:http://localhost:24153", + "auto": "自動(建議)", + "eu": "德國法爾肯施泰因", + "us": "美國華盛頓" }, - "auto_instance": "自動(建議)", - "eu_instance": "德國法爾肯施泰因", - "us_instance": "美國華盛頓", - "custom_instance": "自訂" + "conversion_speed": { + "speeds": { + "very_slow": "非常慢", + "slower": "較慢", + "slow": "慢", + "medium": "中等", + "fast": "快", + "ultra_fast": "超快" + }, + "label": "轉換速度", + "description": "這描述了速度和品質之間的權衡。速度越快品質越低,但完成工作的速度更快。" + } }, "privacy": { "title": "隱私權與資料", - "plausible_title": "Plausible 分析", - "plausible_description": "我們使用[plausible_link]Plausible[/plausible_link],一個注重隱私權的分析工具,來收集完全匿名的統計資料。所有資料都是匿名和彙總的,不會傳送或儲存任何可識別資訊。你可以在[analytics_link]這裡[/analytics_link]檢視分析資料,並在下方選擇退出。", - "opt_in": "選擇加入", - "opt_out": "選擇退出", - "cache_title": "快取管理", - "cache_description": "我們在瀏覽器中快取轉換器檔案,這樣你就不必每次都重新下載,從而提高效能並減少資料使用。", - "refresh_cache": "重新整理快取", - "clear_cache": "清除快取", - "files_cached": "{size}({count}個檔案)", - "loading_cache": "載入中...", - "total_size": "總大小", - "files_cached_label": "已快取檔案", - "cache_cleared": "快取已成功清除!", - "cache_clear_error": "清除快取失敗。", - "site_data_title": "網站資料管理", - "site_data_description": "清除所有網站資料,包括設定和快取檔案,將 VERT 重置為預設狀態並重新載入頁面。", - "clear_all_data": "清除所有網站資料", - "clear_all_data_confirm_title": "清除所有網站資料?", - "clear_all_data_confirm": "這將重置所有設定和快取,然後重新載入頁面。此操作無法復原。", - "clear_all_data_cancel": "取消", - "all_data_cleared": "所有網站資料已清除!正在重新載入頁面...", - "all_data_clear_error": "清除所有網站資料失敗。" - }, - "language": { - "title": "語言", - "description": "選擇 VERT 介面的偏好語言。" + "plausible": { + "title": "Plausible 分析", + "description": "我們使用[plausible_link]Plausible[/plausible_link],一個注重隱私權的分析工具,來收集完全匿名的統計資料。所有資料都是匿名和彙總的,不會傳送或儲存任何可識別資訊。你可以在[analytics_link]這裡[/analytics_link]檢視分析資料,並在下方選擇退出。", + "opt_in": "選擇加入", + "opt_out": "選擇退出" + }, + "cache": { + "title": "快取管理", + "description": "我們在瀏覽器中快取轉換器檔案,這樣你就不必每次都重新下載,從而提高效能並減少資料使用。", + "refresh_cache": "重新整理快取", + "clear_cache": "清除快取", + "files_cached": "{size}({count}個檔案)", + "loading_cache": "載入中...", + "total_size": "總大小", + "files_cached_label": "已快取檔案", + "cache_cleared": "快取已成功清除!", + "cache_clear_error": "清除快取失敗。" + }, + "site_data": { + "title": "網站資料管理", + "description": "清除所有網站資料,包括設定和快取檔案,將 VERT 重置為預設狀態並重新載入頁面。", + "clear_all_data": "清除所有網站資料", + "clear_all_data_confirm_title": "清除所有網站資料?", + "clear_all_data_confirm": "這將重置所有設定和快取,然後重新載入頁面。此操作無法復原。", + "clear_all_data_cancel": "取消", + "all_data_cleared": "所有網站資料已清除!正在重新載入頁面...", + "all_data_clear_error": "清除所有網站資料失敗。" + } } }, "about": { diff --git a/package.json b/package.json index 0987dd26..7eedfff4 100644 --- a/package.json +++ b/package.json @@ -8,32 +8,33 @@ "preview": "vite preview", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "migrate:messages": "node scripts/migrate-language-keys.mjs", "format": "prettier --write .", - "lint": "prettier --check . && eslint ." + "lint": "eslint ." }, "devDependencies": { - "@inlang/paraglide-js": "^2.5.0", - "@poppanator/sveltekit-svg": "^5.0.1", + "@inlang/paraglide-js": "^2.25.0", + "@poppanator/sveltekit-svg": "^7.0.1", "@sveltejs/adapter-static": "^3.0.10", - "@sveltejs/kit": "^2.49.0", + "@sveltejs/kit": "^2.70.3", "@sveltejs/vite-plugin-svelte": "^4.0.4", "@types/eslint": "^9.6.1", - "@types/sanitize-html": "^2.16.0", - "autoprefixer": "^10.4.22", + "@types/sanitize-html": "^2.16.1", + "autoprefixer": "^10.5.5", "css-select": "5.1.0", - "eslint": "^9.39.1", + "eslint": "^9.39.5", "eslint-config-prettier": "^10.1.8", "eslint-plugin-svelte": "^2.46.1", "globals": "^15.15.0", - "prettier": "^3.6.2", - "prettier-plugin-svelte": "^3.4.0", + "prettier": "^3.9.6", + "prettier-plugin-svelte": "^3.5.2", "prettier-plugin-tailwindcss": "^0.6.14", - "sass": "^1.94.2", - "svelte": "^5.43.14", - "svelte-check": "^4.3.4", - "tailwindcss": "^3.4.18", + "sass": "^1.104.0", + "svelte": "^5.57.0", + "svelte-check": "^4.7.6", + "tailwindcss": "^3.4.19", "typescript": "^5.9.3", - "typescript-eslint": "^8.47.0", + "typescript-eslint": "^8.69.0", "vite": "^5.4.21", "vite-plugin-top-level-await": "^1.6.0" }, @@ -41,28 +42,39 @@ "@bjorn3/browser_wasi_shim": "^0.4.2", "@ffmpeg/ffmpeg": "^0.12.15", "@ffmpeg/util": "^0.12.2", - "@fontsource/azeret-mono": "^5.2.11", - "@fontsource/lexend": "^5.2.11", - "@fontsource/radio-canada-big": "^5.2.7", + "@fontsource/azeret-mono": "^5.3.0", + "@fontsource/lexend": "^5.3.0", + "@fontsource/radio-canada-big": "^5.3.0", "@imagemagick/magick-wasm": "^0.0.43", - "@stripe/stripe-js": "^8.5.2", + "@lucide/svelte": "^1.42.0", + "@mediabunny/ac3": "^1.55.7", + "@mediabunny/flac-encoder": "^1.55.7", + "@mediabunny/mp3-encoder": "^1.55.7", + "@stripe/stripe-js": "^9.15.0", + "@types/node": "^22.20.2", "byte-data": "^19.0.1", "client-zip": "^2.5.0", "clsx": "^2.1.1", - "fflate": "^0.8.2", - "lucide-svelte": "^0.554.0", - "music-metadata": "^11.10.3", - "overlayscrollbars": "^2.12.0", + "dicom.ts": "^1.3.0", + "fflate": "^0.8.3", + "file-type": "^22.0.2", + "mediabunny": "^1.55.7", + "music-metadata": "^11.15.0", + "overlayscrollbars": "^2.16.0", "overlayscrollbars-svelte": "^0.5.5", - "p-queue": "^9.0.1", + "p-queue": "^9.3.3", + "qoa-format": "^1.0.1", "riff-file": "^1.0.3", - "sanitize-html": "^2.17.0", - "svelte-stripe": "^1.4.0", + "sanitize-html": "^2.17.7", + "svelte-stripe": "^2.0.0", "vert-wasm": "^0.0.2", - "vite-plugin-wasm": "^3.5.0" + "vite-plugin-wasm": "^3.6.0" }, "trustedDependencies": [ "@parcel/watcher", - "@swc/core" + "@swc/core", + "core-js-pure", + "esbuild", + "protobufjs" ] } diff --git a/postcss.config.js b/postcss.config.js index 0f772168..7b75c83a 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,6 +1,6 @@ export default { plugins: { tailwindcss: {}, - autoprefixer: {} - } + autoprefixer: {}, + }, }; diff --git a/project.inlang/.gitignore b/project.inlang/.gitignore deleted file mode 100644 index 04df3303..00000000 --- a/project.inlang/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -# IF GIT SHOWED THAT THIS FILE CHANGED -# -# 1. RUN THE FOLLOWING COMMAND -# -# --- -# git rm --cached '**/*.inlang/.gitignore' -# --- -# -# 2. COMMIT THE CHANGE -# -# --- -# git commit -m "fix: remove tracked .gitignore from inlang project" -# --- -# -# Inlang handles the gitignore itself starting with version ^2.5. -# -# everything is ignored except settings.json -* -!settings.json \ No newline at end of file diff --git a/project.inlang/settings.json b/project.inlang/settings.json index 9e09cb91..da3aa28e 100644 --- a/project.inlang/settings.json +++ b/project.inlang/settings.json @@ -12,6 +12,9 @@ "tr", "ja", "ko", + "pl", + "cs", + "no", "el", "id", "zh-Hans", diff --git a/scripts/migrate-language-keys.mjs b/scripts/migrate-language-keys.mjs new file mode 100644 index 00000000..547ee940 --- /dev/null +++ b/scripts/migrate-language-keys.mjs @@ -0,0 +1,412 @@ +#!/usr/bin/env node + +import fs from "node:fs"; +import path from "node:path"; + +// yes, i used ai to make this but its extremely useful. +// sorry, i don't wanna migrate a million language files manually Original source language file (default: messages/en-original.json) + --target Reorganized source language file (default: messages/en.json) + --dir Directory containing locale files to migrate (default: messages) + --files Comma-separated list of files to migrate (relative or absolute paths) + --dry-run Preview changes without writing files + --verbose Print per-key migration details + --map-out Write generated key map to JSON file + -h, --help Show help +`); +} + +function readJson(filePath) { + try { + const text = fs.readFileSync(filePath, "utf8"); + return JSON.parse(text); + } catch (err) { + throw new Error(`Failed to read JSON from ${filePath}: ${err.message}`); + } +} + +function writeJson(filePath, data) { + const content = `${JSON.stringify(data, null, "\t")}\n`; + fs.writeFileSync(filePath, content, "utf8"); +} + +function isPlainObject(value) { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function flattenLeaves(value, prefix = "", out = new Map()) { + if (!isPlainObject(value)) { + out.set(prefix, value); + return out; + } + + for (const [key, child] of Object.entries(value)) { + if (key === "$schema") continue; + const nextPath = prefix ? `${prefix}.${key}` : key; + flattenLeaves(child, nextPath, out); + } + + return out; +} + +function groupByValue(leaves) { + const byValue = new Map(); + for (const [keyPath, value] of leaves.entries()) { + const valueKey = JSON.stringify(value); + const list = byValue.get(valueKey) ?? []; + list.push(keyPath); + byValue.set(valueKey, list); + } + return byValue; +} + +function pathTokens(keyPath) { + return keyPath + .split(".") + .flatMap((part) => part.split("_")) + .filter(Boolean); +} + +function scorePathSimilarity(oldPath, newPath) { + const oldParts = oldPath.split("."); + const newParts = newPath.split("."); + if (oldParts[0] !== newParts[0]) return -1000; + + const oldTokens = new Set(pathTokens(oldPath)); + const newTokens = new Set(pathTokens(newPath)); + let shared = 0; + for (const token of oldTokens) { + if (newTokens.has(token)) shared += 1; + } + + const oldLast = oldParts[oldParts.length - 1]; + const newLast = newParts[newParts.length - 1]; + const oldParent = oldParts.slice(0, -1).join("."); + const newParent = newParts.slice(0, -1).join("."); + + let score = shared * 3; + if (oldLast === newLast) score += 6; + if (newTokens.has(oldLast)) score += 3; + if (oldParent && newParent && oldParent === newParent) score += 8; + if (newPath.startsWith(oldParent)) score += 2; + + return score; +} + +function matchGroup(oldPaths, newPaths) { + const pairs = []; + const usedNew = new Set(); + + for (const oldPath of [...oldPaths].sort()) { + const candidates = newPaths + .filter((candidate) => !usedNew.has(candidate)) + .map((candidate) => ({ + candidate, + score: scorePathSimilarity(oldPath, candidate), + })) + .sort( + (a, b) => + b.score - a.score || a.candidate.localeCompare(b.candidate), + ); + + if (candidates.length === 0) continue; + const best = candidates[0]; + if (best.score < 0) continue; + + const second = candidates[1]; + if (second && second.score === best.score) continue; + + usedNew.add(best.candidate); + pairs.push([oldPath, best.candidate]); + } + + return pairs; +} + +function buildMigrationMap(baseJson, targetJson) { + const baseLeaves = flattenLeaves(baseJson); + const targetLeaves = flattenLeaves(targetJson); + const baseByValue = groupByValue(baseLeaves); + const targetByValue = groupByValue(targetLeaves); + + const migrationMap = new Map(); + const unresolved = []; + + for (const [valueKey, oldPaths] of baseByValue.entries()) { + const newPaths = targetByValue.get(valueKey); + if (!newPaths || newPaths.length === 0) continue; + + if (oldPaths.length === 1 && newPaths.length === 1) { + const oldPath = oldPaths[0]; + const newPath = newPaths[0]; + if (oldPath !== newPath) migrationMap.set(oldPath, newPath); + continue; + } + + const pairs = matchGroup(oldPaths, newPaths); + const matchedOld = new Set(pairs.map(([oldPath]) => oldPath)); + + for (const [oldPath, newPath] of pairs) { + if (oldPath !== newPath) migrationMap.set(oldPath, newPath); + } + + for (const oldPath of oldPaths) { + if (!matchedOld.has(oldPath)) { + unresolved.push({ + oldPath, + value: JSON.parse(valueKey), + candidateCount: newPaths.length, + }); + } + } + } + + return { migrationMap, unresolved }; +} + +function getAtPath(obj, keyPath) { + const parts = keyPath.split("."); + let cursor = obj; + for (const part of parts) { + if (!isPlainObject(cursor) || !(part in cursor)) return undefined; + cursor = cursor[part]; + } + return cursor; +} + +function setAtPath(obj, keyPath, value) { + const parts = keyPath.split("."); + let cursor = obj; + for (let i = 0; i < parts.length - 1; i += 1) { + const part = parts[i]; + if (!isPlainObject(cursor[part])) cursor[part] = {}; + cursor = cursor[part]; + } + cursor[parts[parts.length - 1]] = value; +} + +function deleteAtPath(obj, keyPath) { + const parts = keyPath.split("."); + let cursor = obj; + for (let i = 0; i < parts.length - 1; i += 1) { + const part = parts[i]; + if (!isPlainObject(cursor[part])) return false; + cursor = cursor[part]; + } + + const last = parts[parts.length - 1]; + if (!(last in cursor)) return false; + delete cursor[last]; + + for (let i = parts.length - 2; i >= 0; i -= 1) { + const parentPath = parts.slice(0, i).join("."); + const parent = i === 0 ? obj : getAtPath(obj, parentPath); + const childKey = parts[i]; + if (!isPlainObject(parent?.[childKey])) break; + if (Object.keys(parent[childKey]).length > 0) break; + delete parent[childKey]; + } + + return true; +} + +function resolveTargetFiles(args) { + if (args.files.trim().length > 0) { + return args.files + .split(",") + .map((entry) => entry.trim()) + .filter(Boolean) + .map((entry) => path.resolve(entry)); + } + + const files = fs + .readdirSync(args.dir) + .filter((name) => name.endsWith(".json")) + .map((name) => path.join(args.dir, name)); + + return files.filter( + (filePath) => filePath !== args.base && filePath !== args.target, + ); +} + +function migrateLocaleFile(filePath, migrationMap, options) { + const json = readJson(filePath); + const original = JSON.parse(JSON.stringify(json)); + let moved = 0; + let skippedConflicts = 0; + let unchanged = 0; + + const entries = [...migrationMap.entries()].sort( + (a, b) => b[0].split(".").length - a[0].split(".").length, + ); + const planned = []; + const plannedNewPaths = []; + + for (const [oldPath, newPath] of entries) { + const oldValue = getAtPath(original, oldPath); + if (oldValue === undefined) { + unchanged += 1; + continue; + } + + const existingNew = getAtPath(original, newPath); + if (existingNew !== undefined) { + if (JSON.stringify(existingNew) === JSON.stringify(oldValue)) { + planned.push({ + oldPath, + newPath, + oldValue, + targetAlreadyMatched: true, + }); + plannedNewPaths.push(newPath); + continue; + } + + skippedConflicts += 1; + if (options.verbose) + console.warn( + `[conflict] ${path.basename(filePath)}: ${oldPath} -> ${newPath}`, + ); + continue; + } + + planned.push({ + oldPath, + newPath, + oldValue, + targetAlreadyMatched: false, + }); + plannedNewPaths.push(newPath); + } + + for (const plan of planned) { + if (!plan.targetAlreadyMatched) { + setAtPath(json, plan.newPath, plan.oldValue); + if (options.verbose) + console.log( + `[move] ${path.basename(filePath)}: ${plan.oldPath} -> ${plan.newPath}`, + ); + } + + const becomesParentCategory = plannedNewPaths.some((newPath) => + newPath.startsWith(`${plan.oldPath}.`), + ); + if (becomesParentCategory) { + moved += 1; + continue; + } + + deleteAtPath(json, plan.oldPath); + moved += 1; + } + + if (moved > 0 && !options.dryRun) writeJson(filePath, json); + + return { moved, skippedConflicts, unchanged, changed: moved > 0 }; +} + +function main() { + const args = parseArgs(process.argv.slice(2)); + const baseJson = readJson(args.base); + const targetJson = readJson(args.target); + + const { migrationMap, unresolved } = buildMigrationMap( + baseJson, + targetJson, + ); + + if (args.mapOut) { + const output = { + base: args.base, + target: args.target, + generatedAt: new Date().toISOString(), + mapping: Object.fromEntries( + [...migrationMap.entries()].sort(([a], [b]) => + a.localeCompare(b), + ), + ), + unresolved, + }; + writeJson(path.resolve(args.mapOut), output); + } + + const files = resolveTargetFiles(args); + if (files.length === 0) { + console.log("No locale files to migrate."); + return; + } + + let totalMoved = 0; + let totalConflicts = 0; + let filesChanged = 0; + + for (const filePath of files) { + const result = migrateLocaleFile(filePath, migrationMap, args); + totalMoved += result.moved; + totalConflicts += result.skippedConflicts; + if (result.changed) filesChanged += 1; + console.log( + `${path.basename(filePath)}: moved=${result.moved}, conflicts=${result.skippedConflicts}`, + ); + } + + console.log(`\nGenerated mapping entries: ${migrationMap.size}`); + console.log(`Unresolved mapping entries: ${unresolved.length}`); + console.log(`Files changed: ${filesChanged}/${files.length}`); + console.log(`Total keys moved: ${totalMoved}`); + console.log(`Conflicts skipped: ${totalConflicts}`); + if (args.dryRun) + console.log("Dry run mode enabled: no files were written."); +} + +try { + main(); +} catch (err) { + console.error(`[migration] ${err.message}`); + process.exit(1); +} diff --git a/src/app.d.ts b/src/app.d.ts index 29ed65b9..fce00eb0 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ import "@poppanator/sveltekit-svg/dist/svg"; type EventPayload = { @@ -250,9 +251,7 @@ declare global { // interface Platform {} } } - declare module "svelte/elements" { - // eslint-disable-next-line @typescript-eslint/no-unused-vars interface HTMLAttributes { [key: `event-${string}`]: string | undefined | null; } diff --git a/src/app.html b/src/app.html index 75e8a497..fea703db 100644 --- a/src/app.html +++ b/src/app.html @@ -1,53 +1,53 @@ - - - - - - - - - - - - - - %sveltekit.head% - - - -
%sveltekit.body%
- - + + + + + + + + + + + + + + %sveltekit.head% + + + +
%sveltekit.body%
+ + diff --git a/src/lib/components/functional/ConversionPanel.svelte b/src/lib/components/functional/ConversionPanel.svelte index 607034af..d92b6adf 100644 --- a/src/lib/components/functional/ConversionPanel.svelte +++ b/src/lib/components/functional/ConversionPanel.svelte @@ -1,6 +1,6 @@ @@ -24,21 +26,29 @@ onclick={() => files.convertAll()} class="btn {$effects ? '' - : '!scale-100'} highlight flex gap-3 max-md:w-full md:max-w-[15.5rem]" - disabled={!files.ready} + : '!scale-100'} highlight flex gap-3 max-md:w-full {compactActions + ? 'p-4' + : 'md:max-w-[15.5rem]'}" + disabled={!files.allReady} > -

{m["convert.panel.convert_all"]()}

+ {#if !compactActions} +

{m["convert.panel.convert_all"]()}

+ {/if} {#if $isMobile} - {#if open} -
- {#each options as option} - - {/each} -
- {/if} + +{#if open} +
+ {#each options as option} + + {/each} +
+{/if} diff --git a/src/lib/components/functional/FancyInput.svelte b/src/lib/components/functional/FancyInput.svelte index c1b6740d..6a81085e 100644 --- a/src/lib/components/functional/FancyInput.svelte +++ b/src/lib/components/functional/FancyInput.svelte @@ -1,42 +1,87 @@
- + {#if type === "checkbox"} + + {#if checked} +
+ + + +
+ {/if} + {:else if multiline} + + {:else} + + {/if} + {#if prefix}
{prefix} {/if} {#if extension} -
+
{extension}{extension}
{/if} diff --git a/src/lib/components/functional/FormatDropdown.svelte b/src/lib/components/functional/FormatDropdown.svelte index 1f6845b5..5b60a6e1 100644 --- a/src/lib/components/functional/FormatDropdown.svelte +++ b/src/lib/components/functional/FormatDropdown.svelte @@ -4,10 +4,13 @@ import { isMobile, files, dropdownStates } from "$lib/store/index.svelte"; import type { Categories } from "$lib/types"; import clsx from "clsx"; - import { ChevronDown, SearchIcon } from "lucide-svelte"; + import { ChevronDown, SearchIcon } from "@lucide/svelte"; import { onMount } from "svelte"; import { quintOut } from "svelte/easing"; import { VertFile } from "$lib/types"; + import SettingsModal from "./popups/SettingsModal.svelte"; + import { log } from "$lib/util/logger"; + import FancyInput from "./FancyInput.svelte"; type Props = { categories: Categories; @@ -28,187 +31,273 @@ dropdownSize = "default", file, }: Props = $props(); + let open = $state(false); let dropdown = $state(); - let currentCategory = $state(); - let searchQuery = $state(""); let dropdownMenu: HTMLElement | undefined = $state(); - let rootCategory: string | null = null; let dropdownPosition = $state<"left" | "center" | "right">("center"); + let showSettingsModal = $state(false); + let currentCategory = $state(null); + let searchQuery = $state(""); + let rootCategory: string | null = null; + + // svelte-ignore state_referenced_locally + let imageSequence = $state( + file?.conversionSettings?.imageSequence ?? false, + ); + // svelte-ignore state_referenced_locally + let imageSequenceFPS = $state( + file?.conversionSettings?.imageSequenceFPS ?? 15, + ); + // svelte-ignore state_referenced_locally + let imageSequenceTransparency = $state( + file?.conversionSettings?.imageSequenceTransparency ?? false, + ); - // initialize current category $effect(() => { - if (currentCategory) return; + if (!file) return; + file.conversionSettings.imageSequence = imageSequence; + file.conversionSettings.imageSequenceFPS = imageSequenceFPS; + file.conversionSettings.imageSequenceTransparency = + imageSequenceTransparency; + }); + + const normalize = (str: string) => str.replace(/^\./, "").toLowerCase(); + + const shouldExclude = (format: string): boolean => + !!( + categories["audio"]?.formats.includes(from ?? "") && + format === ".gif" + ); - // find the category whose formats overlap most with the converters for this file (or all files) + const getFormats = (cat: string) => { + let formats = (categories[cat]?.formats ?? []).filter( + (f) => !shouldExclude(f), + ); + + // if imageSequence is checked, filter image category to animated formats only + if (imageSequence && cat === "image") { + const animatedFormats = [".webp", ".gif", ".apng"]; // .apng not supported by magick-wasm rn + formats = formats.filter((f) => animatedFormats.includes(f)); + } + + return formats; + }; + + const detectCategory = (): string => { + if (from) { + // find category containing the input format, if any + const match = Object.keys(categories).find((cat) => + categories[cat].formats.includes(from), + ); + if (match) return match; + } + + // else, fall back by finding the category whose formats overlap most with the converters for this file // this finds the best matching category based on the formats supported by the converters - const pickCategoryFromConverters = ( - convList: VertFile["converters"], - ) => { - let bestCategory: string | null = null; - let maxOverlap = 0; - - for (const cat of Object.keys(categories)) { - const overlapCount = categories[cat].formats.filter((fmt) => - convList.some((conv) => conv.formatStrings().includes(fmt)), - ).length; - - if (overlapCount > maxOverlap) { - maxOverlap = overlapCount; - bestCategory = cat; - } + const converters = file + ? file.findConverters() + : files.files.flatMap((f) => f.findConverters()); + + let best: string | null = null; + let maxOverlap = 0; + for (const cat of Object.keys(categories)) { + const count = categories[cat].formats.filter((fmt) => + converters.some((c) => c.formatStrings().includes(fmt)), + ).length; + if (count > maxOverlap) { + maxOverlap = count; + best = cat; } + } - return bestCategory; - }; + return best ?? Object.keys(categories)[0]; + }; - // decide which converters to use to detect category: - // - if file provided, prefer its primary converter -- individual file dropdown - // - if no file provided, use all converters from all files -- "set all to" dropdown - const convertersToCheck = file - ? file.findConverter() - ? [file.findConverter()!] - : file.converters - : files.files.flatMap((f) => f.converters); - - // pick the best matching category, or fall back to first category - // TODO: if something fails for some reason, maybe show all categories? - const detectedCategory = - pickCategoryFromConverters(convertersToCheck) || - Object.keys(categories)[0]; - - currentCategory = detectedCategory; - rootCategory = detectedCategory; + $effect(() => { + if (currentCategory) return; + const detected = detectCategory(); + log( + ["dropdown", "init"], + `root category: ${detected} (file: ${file?.name}, from: ${from})`, + ); + currentCategory = detected; + rootCategory = detected; }); // other available categories based on current category (e.g. converting between video and audio) const availableCategories = $derived.by(() => { if (!rootCategory) return Object.keys(categories); - let finalCategories = Object.keys(categories).filter( + let cats = Object.keys(categories).filter( (cat) => cat === rootCategory || categories[rootCategory!]?.canConvertTo?.includes(cat), ); - if (from === ".gif") finalCategories.push("video"); - - // filter out categories that can't handle large files (due to browser/device limitations) - if (file && file.isLarge()) { - // if file is large video, disable audio conversion - if (rootCategory === "video") - finalCategories = finalCategories.filter( - (cat) => cat !== "audio", - ); - } - return finalCategories; - }); + if (imageSequence) { + // TODO: image sequence -> video on vertd? + cats.push("video"); + } else { + // handle special cases + if (from === ".gif" || from === ".webp") cats.push("video"); + if (from === ".apng") { + //cats.push("image"); // -- buggy, magick can't convert from or to apng properly + cats = cats.filter((cat) => cat !== "audio"); + } - const shouldInclude = (format: string, category: string): boolean => { - // if converting from audio to video, dont show gifs - if ( - categories["audio"]?.formats.includes(from ?? "") && - format === ".gif" - ) { - return false; + // large videos can't be extracted to audio (browser/device limitations) + if (file && file.isLarge() && rootCategory === "video") + cats = cats.filter((cat) => cat !== "audio"); } - return true; - }; + return cats.filter( + (cat) => (categories[cat]?.formats?.length ?? 0) > 0, + ); + }); + // TODO: better hiddenFormats logic lol const filteredData = $derived.by(() => { - const normalize = (str: string) => str.replace(/^\./, "").toLowerCase(); + const activeCategory = + currentCategory && availableCategories.includes(currentCategory) + ? currentCategory + : availableCategories[0]; + + const hiddenFormats: string[] = []; + + // if audio to video, hide these video formats (because they do not want audio tracks lol) + const nonAudioVideoFormats = [".gif", ".webp", ".apng", ".h264"]; + if ( + activeCategory === "video" && + categories["audio"]?.formats.includes(from ?? "") + ) + hiddenFormats.push(...nonAudioVideoFormats); // if no query, return formats for current category if (!searchQuery) { - let formats = currentCategory - ? categories[currentCategory].formats.filter((format) => - shouldInclude(format, currentCategory!), - ) - : []; + const formats = getFormats(activeCategory ?? ""); + + // if no formats & categories for some reason, fall back and show all categories/formats + if (formats.length === 0 && availableCategories.length === 0) { + log( + ["dropdown", "filter"], + `no formats or available categories found for file ${file?.name}, falling back to all categories and formats`, + ); + return { + categories: Object.keys(categories), + formats: categories[currentCategory ?? ""]?.formats ?? [], + isFallback: true, + resolvedCategory: currentCategory, + }; + } return { categories: availableCategories, - formats, + formats: formats.filter((f) => !hiddenFormats.includes(f)), + isFallback: false, + resolvedCategory: activeCategory ?? currentCategory, }; } - const searchLower = normalize(searchQuery); - // find all categories that have formats matching the search query + const query = normalize(searchQuery); + const animatedFormats = [".webp", ".apng", ".gif"]; + + const matches = (f: string, cat?: string) => { + if ( + !normalize(f).includes(query) || + shouldExclude(f) || + hiddenFormats.includes(f) + ) + return false; + // if imageSequence and image category, only show animated formats + if (imageSequence && (cat ?? activeCategory) === "image") { + return animatedFormats.includes(f); + } + return true; + }; + const matchingCategories = availableCategories.filter((cat) => - categories[cat].formats.some( - (format) => - normalize(format).includes(searchLower) && - shouldInclude(format, cat), - ), + (categories[cat]?.formats ?? []).some((f) => matches(f, cat)), ); + if (matchingCategories.length === 0) { return { categories: availableCategories, formats: [], + isFallback: false, + resolvedCategory: currentCategory, }; } - // if current category has no matches, switch to first category that does - const currentCategoryHasMatches = - currentCategory && - matchingCategories.some((cat) => cat === currentCategory); - if (!currentCategoryHasMatches && matchingCategories.length > 0) { - const newCategory = matchingCategories[0]; - currentCategory = newCategory; - } - - // return formats only from the current category that match the search - let filteredFormats = currentCategory - ? categories[currentCategory].formats.filter( - (format) => - normalize(format).includes(searchLower) && - shouldInclude(format, currentCategory!), - ) - : []; - - // sorting exact match first, then others - filteredFormats = filteredFormats.sort((a, b) => { - const aExact = normalize(a) === searchLower; - const bExact = normalize(b) === searchLower; - if (aExact && !bExact) return -1; - if (!aExact && bExact) return 1; - return 0; - }); + // stay on current category if it matches, else move to first matched category + const resolvedCategory = + currentCategory && matchingCategories.includes(currentCategory) + ? currentCategory + : matchingCategories[0]; + + const formats = (categories[resolvedCategory ?? ""]?.formats ?? []) + .filter((f) => matches(f, resolvedCategory)) + .sort((a, b) => { + // exact matches first, then original order + const aExact = normalize(a) === query; + const bExact = normalize(b) === query; + if (aExact !== bExact) return aExact ? -1 : 1; + return 0; + }); + // show categories with matches, formats from within resolved category return { - categories: - matchingCategories.length > 0 - ? matchingCategories - : availableCategories, - formats: filteredFormats, + categories: matchingCategories, + formats: formats.filter((f) => !hiddenFormats.includes(f)), + isFallback: false, + resolvedCategory, }; }); + $effect(() => { + if ( + filteredData.resolvedCategory && + filteredData.resolvedCategory !== currentCategory + ) + currentCategory = filteredData.resolvedCategory; + }); + + $effect(() => { + // scroll automatically when opening dropdown so you don't have to scroll to see entire dropdown lol + if (!open || !dropdownMenu) return; + scrollView(); + }); + + $effect(() => { + // this thing checks if selected format is still valid with the current filters (imageSequence or search query) and falls back if not + const allUnfilteredFormats = availableCategories.flatMap((cat) => + getFormats(cat), + ); + + if (!allUnfilteredFormats.includes(selected)) { + // check if formats available in filteredData, else fall back to all available formats, else keep previous selection + if (filteredData.formats.length > 0) { + selected = filteredData.formats[0]; + onselect?.(selected); + } else if (allUnfilteredFormats.length > 0) { + selected = allUnfilteredFormats[0]; + onselect?.(allUnfilteredFormats[0]); + } else { + // no formats available, keeping previous selection + // i feel like this is all very scuffed and we need a better search and filtering system + } + } + }); + const selectOption = (option: string) => { selected = option; - open = false; // save user's selection to dropdownStates for this session if (file) { - dropdownStates.update((states) => { - const updated = { ...states, [file.name]: option }; - return updated; - }); - } - - // find the category of this option if it's not in the current category - if ( - currentCategory && - !categories[currentCategory].formats.includes(option) - ) { - const formatCategory = Object.keys(categories).find((cat) => - categories[cat].formats.includes(option), - ); - - if (formatCategory) { - currentCategory = formatCategory; - } + dropdownStates.update((states) => ({ + ...states, + [file.name]: option, + })); } onselect?.(option); @@ -220,39 +309,23 @@ }; const handleSearch = (event: Event) => { - const query = (event.target as HTMLInputElement).value; - searchQuery = query; - - // find which categories have matching formats & switch - if (query) { - const queryLower = query.toLowerCase(); - const categoriesWithMatches = availableCategories.filter((cat) => - categories[cat].formats.some((format) => - format.toLowerCase().includes(queryLower), - ), - ); - - if (categoriesWithMatches.length > 0) { - const currentHasMatches = - currentCategory && - categories[currentCategory].formats.some((format) => - format.toLowerCase().includes(queryLower), - ); - - if (!currentHasMatches) { - currentCategory = categoriesWithMatches[0]; - } - } - } + searchQuery = (event.target as HTMLInputElement).value; }; const onEnter = (event: KeyboardEvent) => { - if (event.key === "Enter") { - event.preventDefault(); - if (filteredData.formats.length > 0) { - selectOption(filteredData.formats[0]); - } - } + if (event.key !== "Enter") return; + event.preventDefault(); + if (filteredData.formats.length > 0) + selectOption(filteredData.formats[0]); + }; + + const scrollView = () => { + if (!dropdownMenu) return; + const selectedOption = dropdownMenu.querySelector( + "[data-selected='true']", + ) as HTMLButtonElement | null; + if (!selectedOption) return; + selectedOption.scrollIntoView({ block: "start" }); }; const clickDropdown = () => { @@ -265,25 +338,18 @@ const viewportWidth = window.innerWidth; let dropdownWidth: number; - if (dropdownSize === "large") { - dropdownWidth = rect.width * 3.2; - } else if (dropdownSize === "default") { + if (dropdownSize === "large") dropdownWidth = rect.width * 3.2; + else if (dropdownSize === "default") dropdownWidth = rect.width * 2.5; - } else { - dropdownWidth = rect.width * 1.5; - } + else dropdownWidth = rect.width * 1.5; const centerX = rect.left + rect.width / 2; const leftEdge = centerX - dropdownWidth / 2; const rightEdge = centerX + dropdownWidth / 2; - if (leftEdge < 0) { - dropdownPosition = "left"; - } else if (rightEdge > viewportWidth) { - dropdownPosition = "right"; - } else { - dropdownPosition = "center"; - } + if (leftEdge < 0) dropdownPosition = "left"; + else if (rightEdge > viewportWidth) dropdownPosition = "right"; + else dropdownPosition = "center"; } setTimeout(() => { @@ -295,13 +361,14 @@ searchInput.focus(); searchInput.select(); } + scrollView(); }, 0); // let dropdown open first }; const extract = async () => { // extract all files in zip, then add all extracted files to files store if (!file) return; - const { extractZip } = await import("$lib/util/zip"); + const { extractZip } = await import("$lib/util/file"); const extractedFiles = await extractZip(file.file); if (!Array.isArray(extractedFiles) || extractedFiles.length === 0) @@ -315,7 +382,7 @@ }); const ext = filename.split(".").pop() ?? ""; return new VertFile(f, ext); - } catch (err) { + } catch { return null; } }) @@ -325,11 +392,17 @@ newFiles.forEach((f) => files.add(f)); }; + const settings = () => { + log( + ["dropdown", "settings"], + `opening settings modal for ${file?.name ?? "all files"}`, + ); + showSettingsModal = true; + }; + onMount(() => { const handleClickOutside = (e: MouseEvent) => { - if (dropdown && !dropdown.contains(e.target as Node)) { - open = false; - } + if (dropdown && !dropdown.contains(e.target as Node)) open = false; }; const handleResize = () => { @@ -349,6 +422,10 @@ }); +{#if showSettingsModal} + (showSettingsModal = false)} /> +{/if} +
{}} id="format-search" autocomplete="off" + disabled={filteredData.isFallback} /> @@ -450,6 +532,12 @@ {/if}
+ + {#if filteredData.isFallback} +
+ {m["convert.dropdown.fallback"]()} +
+ {/if}
{#each filteredData.categories as category} @@ -460,6 +548,7 @@ : 'border-b-separator text-muted'}" onclick={() => selectCategory(category)} > + {(m as any)[`convert.dropdown.${category}`]?.()} {/each} @@ -469,6 +558,7 @@ {#if filteredData.formats.length > 0} {#each filteredData.formats as format} + +
+ +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+ +
+
+
+ {:else} +
+
{/if}
diff --git a/src/lib/components/functional/Uploader.svelte b/src/lib/components/functional/Uploader.svelte index 664aec86..a9a95c54 100644 --- a/src/lib/components/functional/Uploader.svelte +++ b/src/lib/components/functional/Uploader.svelte @@ -1,12 +1,10 @@ - -
-

{@html sanitize(m["convert.errors.vertd_details_body"]())}

-

- - {@html sanitize(m["convert.errors.vertd_details_job_id"]({ - jobId: additional.jobId, - }))} - -

-

- - {@html sanitize(m["convert.errors.vertd_details_from"]({ - from: additional.from, - }))} - -

-

- - {@html sanitize(m["convert.errors.vertd_details_to"]({ to: additional.to }))} - -

-

- - {@html sanitize(link( - ["view_link"], - m["convert.errors.vertd_details_error_message"](), - [ - URL.createObjectURL( - new Blob([additional.errorMessage], { - type: "text/plain", - }), - ), - ], - [true], - ["text-blue-500 font-normal"], - ))} - -

-

- {@html sanitize(link( - ["privacy_link"], - m["convert.errors.vertd_details_footer"](), - "/privacy", - [true], - ))} -

-
diff --git a/src/lib/components/functional/Dialog.svelte b/src/lib/components/functional/popups/Dialog.svelte similarity index 91% rename from src/lib/components/functional/Dialog.svelte rename to src/lib/components/functional/popups/Dialog.svelte index e5668309..b9cda8f2 100644 --- a/src/lib/components/functional/Dialog.svelte +++ b/src/lib/components/functional/popups/Dialog.svelte @@ -1,14 +1,21 @@ + +
+

+ {m["convert.errors.converter_fallback.body"]({ + filename: additional.filename, + converter: additional.nextConverter, + })} +

+
+ + +
+
diff --git a/src/lib/components/functional/popups/Modal.svelte b/src/lib/components/functional/popups/Modal.svelte new file mode 100644 index 00000000..d21f1f43 --- /dev/null +++ b/src/lib/components/functional/popups/Modal.svelte @@ -0,0 +1,114 @@ + + + diff --git a/src/lib/components/functional/popups/ServerUploadWarning.svelte b/src/lib/components/functional/popups/ServerUploadWarning.svelte new file mode 100644 index 00000000..a16978c3 --- /dev/null +++ b/src/lib/components/functional/popups/ServerUploadWarning.svelte @@ -0,0 +1,47 @@ + + + + +
+

+ {m["convert.external_warning.text"]({ + filename: toast.additional.filename, + })} +

+
+ +
+ + +
+
+
diff --git a/src/lib/components/functional/popups/SettingsModal.svelte b/src/lib/components/functional/popups/SettingsModal.svelte new file mode 100644 index 00000000..e30c5dec --- /dev/null +++ b/src/lib/components/functional/popups/SettingsModal.svelte @@ -0,0 +1,315 @@ + + + onclose?.(), + }, + { + text: "Apply", + action: () => { + applySettings(settings.converter!); + onclose?.(); + }, + primary: true, + }, + ]} + onclose={() => onclose?.()} +> +
+ {#if targetFile} + {@const availableConverters = getAvailableConverters(targetFile)} + {@const validConverter = getValidConverter( + targetFile, + settings.converter, + )} +

+ {@html sanitize( + m["convert.settings.description"]({ + filename: + file?.name ?? m["convert.settings.all_files"](), + }), + )} +

+ +
+

+ {m["convert.settings.converter"]()} +

+ ({ + value: converter.name, + label: converter.name, + }))} + selected={validConverter?.name} + settingsStyle + onselect={(value) => { + settings.converter = value; + }} + /> +
+ {#key settings} + {#await targetFile.getAvailableSettings(targetFile, settings.converter) then availableSettings} +
+ {#if availableSettings.length === 0} +

+ {m["convert.settings.none"]()} +

+ {:else} +
+ {#each availableSettings as setting (setting.key)} +
+

+ {setting.label} +

+ + {#if setting.description} +

+ {setting.description} +

+ {/if} + + {#if setting.type === "select"} + + typeof opt === "string" + ? { + value: opt, + label: opt, + } + : opt, + ) || []} + selected={settings[ + setting.key + ] ?? + targetFile + .conversionSettings[ + setting.key + ] ?? + setting.default} + settingsStyle + onselect={(value) => + handleSettingChange( + setting.key, + value, + )} + disabled={setting.disabled} + /> + {#if setting.hasCustomInput} + {@const disabled = + (settings[setting.key] ?? + targetFile + .conversionSettings[ + setting.key + ]) !== "custom"} + + handleSettingChange( + setting.customInputKey!, + e.currentTarget + .value, + )} + /> + {/if} + {:else if setting.type === "boolean"} + + handleSettingChange( + setting.key, + e.currentTarget.checked, + )} + disabled={setting.disabled} + /> + {:else if setting.type === "range"} + {@const rangeValue = (settings[ + setting.key + ] ?? + targetFile.conversionSettings[ + setting.key + ] ?? + setting.default ?? + setting.min ?? + 0) as number} + {@const rangeLabel = + setting.options?.[rangeValue] + ?.label ?? rangeValue} +
+ { + const nextValue = + e.currentTarget + .valueAsNumber; + handleSettingChange( + setting.key, + nextValue, + ); + }} + disabled={setting.disabled} + /> + + {rangeLabel} + +
+ {:else} + + handleSettingChange( + setting.key, + e.currentTarget.value, + )} + disabled={setting.disabled} + /> + {/if} +
+ {/each} +
+ {/if} +
+ {/await} + {/key} + {/if} +
+
diff --git a/src/lib/components/functional/VertdError.svelte b/src/lib/components/functional/popups/VertdError.svelte similarity index 76% rename from src/lib/components/functional/VertdError.svelte rename to src/lib/components/functional/popups/VertdError.svelte index 6afa5012..0ddace4a 100644 --- a/src/lib/components/functional/VertdError.svelte +++ b/src/lib/components/functional/popups/VertdError.svelte @@ -5,12 +5,12 @@ from?: string; to?: string; errorMessage?: string; - fileName?: string; + filename?: string; }
-

{m["convert.errors.vertd_generic_body"]()}

+

{m["convert.errors.vertd.generic.body"]()}

{m["convert.errors.vertd.generic.view"]()}
{m["convert.errors.vertd.generic.yes"]()} {m["convert.errors.vertd.generic.no"]()}
diff --git a/src/lib/components/functional/popups/VertdErrorDetails.svelte b/src/lib/components/functional/popups/VertdErrorDetails.svelte new file mode 100644 index 00000000..d619cb1d --- /dev/null +++ b/src/lib/components/functional/popups/VertdErrorDetails.svelte @@ -0,0 +1,87 @@ + + +
+

{@html sanitize(m["convert.errors.vertd.details.body"]())}

+

+ + {@html sanitize( + m["convert.errors.vertd.details.job_id"]({ + jobId: additional.jobId, + }), + )} + +

+

+ + {@html sanitize( + m["convert.errors.vertd.details.from"]({ + from: additional.from, + }), + )} + +

+

+ + {@html sanitize( + m["convert.errors.vertd.details.to"]({ to: additional.to }), + )} + +

+

+ + {@html sanitize( + link( + ["view_link"], + m["convert.errors.vertd.details.error_message"](), + [errorBlobUrl || "#"], + [true], + ["text-blue-500 font-normal"], + ), + )} + +

+

+ {@html sanitize( + link( + ["privacy_link"], + m["convert.errors.vertd.details.footer"](), + "/privacy", + [true], + ), + )} +

+
diff --git a/src/lib/components/layout/Dialogs.svelte b/src/lib/components/layout/Dialogs.svelte index b496244f..c9022032 100644 --- a/src/lib/components/layout/Dialogs.svelte +++ b/src/lib/components/layout/Dialogs.svelte @@ -1,7 +1,7 @@ - -{#snippet link(item: (typeof items)[0], index: number)} - {@const Icon = item.icon} - -
- {#key item.name} -
-
- - {#if item.badge} -
- {#key item.badge} -
- {item.badge} -
- {/key} -
- {/if} -
- -
- {/key} -
-
-{/snippet} - -
- - {@const linkRect = linkRects.at(selectedIndex) || linkRects[0]} - {#if linkRect && isInitialized} -
- {/if} - - {#each items as item, i (item.url)} - {@render link(item, i)} - {/each} - - - - -
-
+ + +{#snippet link(item: (typeof items)[0], index: number)} + {@const Icon = item.icon} + +
+ {#key item.name} +
+
+ + {#if item.badge} +
+ {#key item.badge} +
+ {item.badge} +
+ {/key} +
+ {/if} +
+ +
+ {/key} +
+
+{/snippet} + +
+ + {@const linkRect = linkRects.at(selectedIndex) || linkRects[0]} + {#if linkRect && isInitialized} +
+ {/if} + + {#each items as item, i (item.url)} + {@render link(item, i)} + {/each} + + + + +
+
diff --git a/src/lib/components/visual/Toast.svelte b/src/lib/components/visual/Toast.svelte index a3bd7004..5a066f8a 100644 --- a/src/lib/components/visual/Toast.svelte +++ b/src/lib/components/visual/Toast.svelte @@ -6,7 +6,7 @@ InfoIcon, TriangleAlert, XIcon, - } from "lucide-svelte"; + } from "@lucide/svelte"; import { quintOut } from "svelte/easing"; import { ToastManager } from "$lib/util/toast.svelte"; import type { ToastProps } from "$lib/util/toast.svelte"; @@ -18,8 +18,10 @@ toast: ToastType; } = $props(); + // svelte-ignore state_referenced_locally const { id, type, message, durations } = props.toast; + // svelte-ignore state_referenced_locally const additional = "additional" in props.toast ? props.toast.additional : {}; @@ -41,10 +43,12 @@ let Icon = $derived(Icons[type]); let msg = $state>(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any const title = $derived(((msg as any)?.title as string) ?? ""); // intentionally unused. this is so tailwind can generate the css for these colours as it doesn't detect if it's dynamically loaded // this would lead to the colours not being generated in the final css file by tailwind + // eslint-disable-next-line @typescript-eslint/no-unused-vars const colourVariants = [ "border-accent-pink-alt", "border-accent-red-alt", diff --git a/src/lib/components/visual/Tooltip.svelte b/src/lib/components/visual/Tooltip.svelte index 3ca218f7..4e229761 100644 --- a/src/lib/components/visual/Tooltip.svelte +++ b/src/lib/components/visual/Tooltip.svelte @@ -1,6 +1,7 @@ @@ -40,7 +44,7 @@ ? '' : '!scale-100'} flex-1 gap-2 p-4 rounded-full bg-button text-black dynadark:text-white flex items-center justify-center" > - + {m["about.resources.source"]()} import Panel from "$lib/components/visual/Panel.svelte"; - import { PiggyBankIcon, CopyIcon, CheckIcon } from "lucide-svelte"; + import { PiggyBankIcon, CopyIcon, CheckIcon } from "@lucide/svelte"; import { DISCORD_URL } from "$lib/util/consts"; import { error } from "$lib/util/logger"; import { m } from "$lib/paraglide/messages"; @@ -9,7 +9,7 @@ import lily from "$lib/assets/lily.jpeg"; let copied = false; - let timeoutId: NodeJS.Timeout | null = null; + let timeoutId: ReturnType | null = null; function copyToClipboard() { try { @@ -52,6 +52,14 @@

+ {@html sanitize( + link( + "discord_link", + m["about.sponsors.description"](), + DISCORD_URL, + true, + ), + )} {@html sanitize( link( "discord_link", diff --git a/src/lib/sections/about/Why.svelte b/src/lib/sections/about/Why.svelte index c526cdb1..45bcd8c1 100644 --- a/src/lib/sections/about/Why.svelte +++ b/src/lib/sections/about/Why.svelte @@ -1,6 +1,6 @@ diff --git a/src/lib/sections/settings/Appearance.svelte b/src/lib/sections/settings/Appearance.svelte index c092ad71..19930ec3 100644 --- a/src/lib/sections/settings/Appearance.svelte +++ b/src/lib/sections/settings/Appearance.svelte @@ -14,7 +14,7 @@ PauseIcon, PlayIcon, SunIcon, - } from "lucide-svelte"; + } from "@lucide/svelte"; import { onMount, onDestroy } from "svelte"; import { m } from "$lib/paraglide/messages"; import { getLocale } from "$lib/paraglide/runtime"; @@ -108,10 +108,10 @@

- {m["settings.appearance.brightness_theme"]()} + {m["settings.appearance.brightness.theme"]()}

- {m["settings.appearance.brightness_description"]()} + {m["settings.appearance.brightness.description"]()}

@@ -143,10 +143,10 @@

- {m["settings.appearance.effect_settings"]()} + {m["settings.appearance.effect.settings"]()}

- {m["settings.appearance.effect_description"]()} + {m["settings.appearance.effect.description"]()}

@@ -178,11 +178,12 @@

- {m["settings.language.title"]()} - {#if currentLocale !== "en"} (Language){/if} + {m["settings.appearance.language.title"]()} + {#if currentLocale !== "en"} + (Language){/if}

- {m["settings.language.description"]()} + {m["settings.appearance.language.description"]()}

diff --git a/src/lib/sections/settings/Conversion.svelte b/src/lib/sections/settings/Conversion.svelte index e9598390..abab6844 100644 --- a/src/lib/sections/settings/Conversion.svelte +++ b/src/lib/sections/settings/Conversion.svelte @@ -6,14 +6,14 @@ PlayIcon, RefreshCwIcon, ChevronDownIcon, - } from "lucide-svelte"; + } from "@lucide/svelte"; import type { ISettings } from "./index.svelte"; import { CONVERSION_BITRATES, type ConversionBitrate, SAMPLE_RATES, type SampleRate, - } from "$lib/converters/ffmpeg.svelte"; + } from "$lib/converters/ffmpeg/ffmpeg.codecs"; import { m } from "$lib/paraglide/messages"; import Dropdown from "$lib/components/functional/Dropdown.svelte"; import FancyInput from "$lib/components/functional/FancyInput.svelte"; @@ -40,10 +40,12 @@

- {m["settings.conversion.filename_format"]()} + {m["settings.conversion.filename.format"]()}

- {@html sanitize(m["settings.conversion.filename_description"]())} + {@html sanitize( + m["settings.conversion.filename.description"](), + )}

- {m["settings.conversion.default_format"]()} + {m[ + "settings.conversion.default_format.label" + ]()}

{m[ - "settings.conversion.default_format_description" + "settings.conversion.default_format.description" ]()}

@@ -102,7 +112,9 @@ size="24" class="inline-block mr-2" /> - {m["settings.conversion.default_format_enable"]()} + {m[ + "settings.conversion.default_format.enable" + ]()}
@@ -129,7 +143,7 @@

{m[ - "settings.conversion.default_format_image" + "settings.conversion.default_format.image" ]()}

{m[ - "settings.conversion.default_format_audio" + "settings.conversion.default_format.audio" ]()}

{m[ - "settings.conversion.default_format_video" + "settings.conversion.default_format.video" ]()}

{m[ - "settings.conversion.default_format_document" + "settings.conversion.default_format.document" ]()}

- {m["settings.conversion.metadata"]()} + {m["settings.conversion.metadata.label"]()}

-

+

{m[ - "settings.conversion.metadata_description" + "settings.conversion.metadata.description" ]()}

@@ -216,7 +228,9 @@ size="24" class="inline-block mr-2" /> - {m["settings.conversion.keep"]()} + {m[ + "settings.conversion.metadata.keep" + ]()}
@@ -240,11 +256,11 @@

- {m["settings.conversion.quality"]()} + {m["settings.conversion.quality.label"]()}

{m[ - "settings.conversion.quality_description" + "settings.conversion.quality.description" ]()}

@@ -252,7 +268,7 @@

{m[ - "settings.conversion.quality_images" + "settings.conversion.quality.images" ]()}

{m[ - "settings.conversion.quality_audio" + "settings.conversion.quality.audio" ]()}

- b.toString(), + options={CONVERSION_BITRATES.map( + (b) => ({ + value: b.toString(), + label: + b === "auto" || + b === "custom" + ? m[ + `convert.settings.common.${b}` + ]() + : `${b} kbps`, + }), )} selected={settings.ffmpegQuality.toString()} onselect={(option: string) => @@ -290,13 +315,19 @@ {m["settings.conversion.rate"]()}

- r.toString(), - )} + options={SAMPLE_RATES.map((r) => ({ + value: r.toString(), + label: + r === "auto" || r === "custom" + ? m[ + `convert.settings.common.${r}` + ]() + : `${r} Hz`, + }))} selected={settings.ffmpegSampleRate.toString()} onselect={(option: string) => { settings.ffmpegSampleRate = - option as SampleRate; + option as SampleRate as string; }} settingsStyle /> diff --git a/src/lib/sections/settings/Privacy.svelte b/src/lib/sections/settings/Privacy.svelte index 30f3edaf..da60371a 100644 --- a/src/lib/sections/settings/Privacy.svelte +++ b/src/lib/sections/settings/Privacy.svelte @@ -6,7 +6,7 @@ PlayIcon, RefreshCwIcon, Trash2Icon, - } from "lucide-svelte"; + } from "@lucide/svelte"; import type { ISettings } from "./index.svelte"; import { effects } from "$lib/store/index.svelte"; import { m } from "$lib/paraglide/messages"; @@ -17,6 +17,7 @@ import { ToastManager } from "$lib/util/toast.svelte"; import { DISABLE_ALL_EXTERNAL_REQUESTS } from "$lib/util/consts"; import { addDialog } from "$lib/store/DialogProvider"; + import { PUB_PLAUSIBLE_URL } from "$env/static/public"; const { settings = $bindable() }: { settings: ISettings } = $props(); @@ -39,7 +40,7 @@ cacheInfo = await swManager.getCacheInfo(); } catch (err) { - error(["privacy", "cache"], "Failed to load cache info:", err); + error(["privacy", "cache"], `Failed to load cache info: ${err}`); } finally { isLoadingCache = false; } @@ -54,13 +55,13 @@ await loadCacheInfo(); ToastManager.add({ type: "success", - message: m["settings.privacy.cache_cleared"](), + message: m["settings.privacy.cache.cache_cleared"](), }); } catch (err) { error(["privacy", "cache"], "Failed to clear cache:", err); ToastManager.add({ type: "error", - message: m["settings.privacy.cache_clear_error"](), + message: m["settings.privacy.cache.cache_clear_error"](), }); } finally { isLoadingCache = false; @@ -71,31 +72,35 @@ if (isLoadingCache) return; addDialog( - m["settings.privacy.clear_all_data_confirm_title"](), - m["settings.privacy.clear_all_data_confirm"](), + m["settings.privacy.site_data.clear_all_data_confirm_title"](), + m["settings.privacy.site_data.clear_all_data_confirm"](), [ { - text: m["settings.privacy.clear_all_data_cancel"](), + text: m[ + "settings.privacy.site_data.clear_all_data_cancel" + ](), action: () => {}, }, { - text: m["settings.privacy.clear_all_data"](), + text: m["settings.privacy.site_data.clear_all_data"](), action: async () => { isLoadingCache = true; try { await swManager.clearCache(); - localStorage.clear(); - sessionStorage.clear(); + if (typeof localStorage.clear === "function") { + localStorage.clear(); + } + if (typeof sessionStorage.clear === "function") { + sessionStorage.clear(); + } ToastManager.add({ type: "success", message: - m["settings.privacy.all_data_cleared"](), + m[ + "settings.privacy.site_data.all_data_cleared" + ](), }); - - setTimeout(() => { - window.location.href = "/"; - }, 1500); } catch (err) { error( ["privacy", "data"], @@ -105,11 +110,14 @@ type: "error", message: m[ - "settings.privacy.all_data_clear_error" + "settings.privacy.site_data.all_data_clear_error" ](), }); } finally { isLoadingCache = false; + setTimeout(() => { + window.location.href = "/"; + }, 1500); } }, }, @@ -134,20 +142,24 @@ {m["settings.privacy.title"]()}
- {#if !DISABLE_ALL_EXTERNAL_REQUESTS} + {#if !DISABLE_ALL_EXTERNAL_REQUESTS && PUB_PLAUSIBLE_URL}

- {m["settings.privacy.plausible_title"]()} + {m["settings.privacy.plausible.title"]()}

- {@html link( - ["plausible_link", "analytics_link"], - m["settings.privacy.plausible_description"](), - [ - "https://plausible.io/privacy-focused-web-analytics", - "https://ats.vert.sh/vert.sh", - ], + {@html sanitize( + link( + ["plausible_link", "analytics_link"], + m[ + "settings.privacy.plausible.description" + ](), + [ + "https://plausible.io/privacy-focused-web-analytics", + "https://ats.vert.sh/vert.sh", + ], + ), )}

@@ -162,7 +174,7 @@ : ''} flex-1 p-4 rounded-lg text-black dynadark:text-white flex items-center justify-center" > - {m["settings.privacy.opt_in"]()} + {m["settings.privacy.plausible.opt_in"]()}
@@ -186,22 +198,22 @@

- {m["settings.privacy.cache_title"]()} + {m["settings.privacy.cache.title"]()}

- {m["settings.privacy.cache_description"]()} + {m["settings.privacy.cache.description"]()}

- {m["settings.privacy.total_size"]()} + {m["settings.privacy.cache.total_size"]()}
{#if isLoadingCache} - {m["settings.privacy.loading_cache"]()} + {m["settings.privacy.cache.loading_cache"]()} {:else} {cacheInfo ? swManager.formatSize(cacheInfo.totalSize) @@ -211,12 +223,12 @@
- {m["settings.privacy.files_cached_label"]()} + {m["settings.privacy.cache.files_cached_label"]()}
{#if isLoadingCache} - {m["settings.privacy.loading_cache"]()} + {m["settings.privacy.cache.loading_cache"]()} {:else} {cacheInfo?.fileCount ?? 0} {/if} @@ -233,7 +245,7 @@ disabled={isLoadingCache} > - {m["settings.privacy.refresh_cache"]()} + {m["settings.privacy.cache.refresh_cache"]()}
@@ -251,10 +263,10 @@

- {m["settings.privacy.site_data_title"]()} + {m["settings.privacy.site_data.title"]()}

- {m["settings.privacy.site_data_description"]()} + {m["settings.privacy.site_data.description"]()}

@@ -266,7 +278,7 @@ disabled={isLoadingCache} > - {m["settings.privacy.clear_all_data"]()} + {m["settings.privacy.site_data.clear_all_data"]()}
diff --git a/src/lib/sections/settings/Vertd.svelte b/src/lib/sections/settings/Vertd.svelte index de116a2c..c662c883 100644 --- a/src/lib/sections/settings/Vertd.svelte +++ b/src/lib/sections/settings/Vertd.svelte @@ -1,14 +1,19 @@
diff --git a/src/routes/convert/+page.svelte b/src/routes/convert/+page.svelte index ded9eb15..3198acb6 100644 --- a/src/routes/convert/+page.svelte +++ b/src/routes/convert/+page.svelte @@ -5,13 +5,16 @@ import Panel from "$lib/components/visual/Panel.svelte"; import ProgressBar from "$lib/components/visual/ProgressBar.svelte"; import Tooltip from "$lib/components/visual/Tooltip.svelte"; - import { categories, converters } from "$lib/converters"; + import { + categories, + converterCategories, + converters, + } from "$lib/converters"; import { effects, files, gradientColor, showGradient, - vertdLoaded, dropdownStates, } from "$lib/store/index.svelte"; import { VertFile } from "$lib/types"; @@ -27,15 +30,34 @@ ImageOffIcon, RotateCwIcon, XIcon, - } from "lucide-svelte"; + } from "@lucide/svelte"; import { m } from "$lib/paraglide/messages"; import { Settings } from "$lib/sections/settings/index.svelte"; import { MAX_ARRAY_BUFFER_SIZE } from "$lib/store/index.svelte"; import { GB } from "$lib/util/consts"; - import { log } from "$lib/util/logger"; let processedFileIds = $state(new Set()); + const getCurrentConverter = (file: VertFile) => { + const converterName = file.conversionSettings.converter; + const availableConverters = file.isZip() + ? file.converters + : file.findConverters(); + + if (converterName) { + const selectedConverter = + availableConverters.find((c) => c.name === converterName) || + file.converters.find((c) => c.name === converterName); + if (selectedConverter) return selectedConverter; + } + + // prefer a usable converter over a not-ready one + const readyConverter = availableConverters.find( + (c) => c.status === "ready" || c.status === "partially-ready", + ); + return readyConverter ?? availableConverters[0]; + }; + $effect(() => { if (!Settings.instance.settings || files.files.length === 0) return; @@ -43,14 +65,13 @@ const settings = Settings.instance.settings; if (processedFileIds.has(file.id)) return; - const converter = file.findConverter(); + const converter = getCurrentConverter(file); if (!converter) return; - let category: string | undefined; - const isImage = converter.name === "imagemagick"; - const isAudio = converter.name === "ffmpeg"; - const isVideo = converter.name === "vertd"; - const isDocument = converter.name === "pandoc"; + const isImage = converterCategories.image.includes(converter.name); + const isAudio = converterCategories.audio.includes(converter.name); + const isVideo = converterCategories.video.includes(converter.name); + const isDocument = converterCategories.doc.includes(converter.name); if (isImage) category = "image"; else if (isAudio) category = "audio"; @@ -106,36 +127,46 @@ $effect(() => { // Set gradient color depending on the file types - let type = ""; - if (files.files.length) { - const converters = files.files.map( - (file) => file.findConverter()?.name, + const fileTypes = files.files + .map((file) => { + const converterName = getCurrentConverter(file)?.name; + if (!converterName) return null; + if (converterCategories.image.includes(converterName)) + return "blue"; + if (converterCategories.audio.includes(converterName)) + return "purple"; + if (converterCategories.video.includes(converterName)) + return "red"; + if (converterCategories.doc.includes(converterName)) + return "green"; + return null; + }) + .filter( + (type): type is "blue" | "purple" | "red" | "green" => + type !== null, ); - const uniqueTypes = new Set(converters); - if (uniqueTypes.size === 1) { - const onlyType = converters[0]; - if (onlyType === "imagemagick") type = "blue"; - else if (onlyType === "ffmpeg") type = "purple"; - else if (onlyType === "vertd") type = "red"; - else if (onlyType === "pandoc") type = "green"; - } - } + const uniqueTypes = new Set(fileTypes); + const type = + files.files.length > 0 && + fileTypes.length === files.files.length && + uniqueTypes.size === 1 + ? fileTypes[0] + : ""; - if (files.files.length === 0 || !type) { - showGradient.set(false); - } else showGradient.set(true); + if (files.files.length === 0 || !type) showGradient.set(false); + else showGradient.set(true); gradientColor.set(type); }); {#snippet fileItem(file: VertFile, index: number)} - {@const currentConverter = file.findConverter()} - {@const isImage = currentConverter?.name === "imagemagick"} - {@const isAudio = currentConverter?.name === "ffmpeg"} - {@const isVideo = currentConverter?.name === "vertd"} - {@const isDocument = currentConverter?.name === "pandoc"} + {@const currentConverter = getCurrentConverter(file)} + {@const name = currentConverter?.name || "unknown"} + {@const isAudio = converterCategories.audio.includes(name)} + {@const isVideo = converterCategories.video.includes(name)} + {@const isDocument = converterCategories.doc.includes(name)}
{#if !converters.length} @@ -179,7 +210,8 @@ @@ -211,7 +243,7 @@ {m["convert.errors.cant_convert"]()}

- {m["convert.errors.vertd_server"]()} + {m["convert.errors.vertd.server"]()}

{:else} @@ -305,24 +337,13 @@ type: isAudio ? m["convert.errors.audio"]() : isVideo - ? "Video" + ? m["convert.errors.video"]() : isDocument ? m["convert.errors.doc"]() : m["convert.errors.image"](), })}

- {:else if isVideo && !$vertdLoaded && !isAudio && !isImage && !isDocument} -
-

- {m["convert.errors.cant_convert"]()} -

-

- {m["convert.errors.vertd_not_found"]()} -

-
{:else}
file.convert()} > diff --git a/src/routes/privacy/+page.svelte b/src/routes/privacy/+page.svelte index 162eb75a..3cadf6de 100644 --- a/src/routes/privacy/+page.svelte +++ b/src/routes/privacy/+page.svelte @@ -1,7 +1,7 @@
@@ -37,7 +37,10 @@ link( ["about_link", "stripe_link"], m["privacy.donations.description"](), - ["/about", "https://stripe.com/docs/disputes/prevention/advanced-fraud-detection"], + [ + "/about", + "https://stripe.com/docs/disputes/prevention/advanced-fraud-detection", + ], [false, true], ), )} diff --git a/src/routes/settings/+page.svelte b/src/routes/settings/+page.svelte index 7d586c81..5e19b699 100644 --- a/src/routes/settings/+page.svelte +++ b/src/routes/settings/+page.svelte @@ -1,18 +1,23 @@