From 338c4d42dfa17a9531d4ba1a007ba88b1d86cff8 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 12:36:07 +0000 Subject: [PATCH 01/33] adding locales --- .../playground/website/src/lib/i18n/locales/en.json | 12 ++++++++++++ .../playground/website/src/lib/i18n/locales/es.json | 12 ++++++++++++ .../playground/website/src/lib/i18n/locales/ja.json | 12 ++++++++++++ .../website/src/lib/i18n/locales/pt-br.json | 12 ++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 packages/playground/website/src/lib/i18n/locales/en.json create mode 100644 packages/playground/website/src/lib/i18n/locales/es.json create mode 100644 packages/playground/website/src/lib/i18n/locales/ja.json create mode 100644 packages/playground/website/src/lib/i18n/locales/pt-br.json diff --git a/packages/playground/website/src/lib/i18n/locales/en.json b/packages/playground/website/src/lib/i18n/locales/en.json new file mode 100644 index 0000000000..b4b93780f1 --- /dev/null +++ b/packages/playground/website/src/lib/i18n/locales/en.json @@ -0,0 +1,12 @@ +{ + "domain": "playground-website", + "locale_data": { + "playground-website": { + "": { + "domain": "playground-website", + "lang": "en", + "plural-forms": "nplurals=2; plural=(n != 1);" + } + } + } +} diff --git a/packages/playground/website/src/lib/i18n/locales/es.json b/packages/playground/website/src/lib/i18n/locales/es.json new file mode 100644 index 0000000000..23d5ef3b29 --- /dev/null +++ b/packages/playground/website/src/lib/i18n/locales/es.json @@ -0,0 +1,12 @@ +{ + "domain": "playground-website", + "locale_data": { + "playground-website": { + "": { + "domain": "playground-website", + "lang": "es", + "plural-forms": "nplurals=2; plural=(n != 1);" + } + } + } +} diff --git a/packages/playground/website/src/lib/i18n/locales/ja.json b/packages/playground/website/src/lib/i18n/locales/ja.json new file mode 100644 index 0000000000..6a0b7c33eb --- /dev/null +++ b/packages/playground/website/src/lib/i18n/locales/ja.json @@ -0,0 +1,12 @@ +{ + "domain": "playground-website", + "locale_data": { + "playground-website": { + "": { + "domain": "playground-website", + "lang": "ja", + "plural-forms": "nplurals=1; plural=0;" + } + } + } +} diff --git a/packages/playground/website/src/lib/i18n/locales/pt-br.json b/packages/playground/website/src/lib/i18n/locales/pt-br.json new file mode 100644 index 0000000000..631980c33b --- /dev/null +++ b/packages/playground/website/src/lib/i18n/locales/pt-br.json @@ -0,0 +1,12 @@ +{ + "domain": "playground-website", + "locale_data": { + "playground-website": { + "": { + "domain": "playground-website", + "lang": "pt-br", + "plural-forms": "nplurals=2; plural=(n > 1);" + } + } + } +} From a45baff0329a57ddcf3e9021cec7c65d77a18697 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 12:36:30 +0000 Subject: [PATCH 02/33] installing i18n package --- package-lock.json | 2254 ++++++++------------------------------------- package.json | 1 + 2 files changed, 398 insertions(+), 1857 deletions(-) diff --git a/package-lock.json b/package-lock.json index be2d563b21..ab03148e46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -97,6 +97,7 @@ "@wordpress/core-data": "7.4.0", "@wordpress/data": "10.4.0", "@wordpress/element": "6.4.0", + "@wordpress/i18n": "5.4.0", "@wordpress/notices": "5.4.0", "chalk": "5.2.0", "clsx": "^1.2.1", @@ -149,15 +150,6 @@ "fs-ext": "2.1.1" } }, - "node_modules/@adobe/css-tools": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.2.tgz", - "integrity": "sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/@algolia/abtesting": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", @@ -7228,235 +7220,6 @@ "node": ">=10" } }, - "node_modules/@lerna/legacy-package-management/node_modules/@nrwl/tao": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.10.0.tgz", - "integrity": "sha512-QNAanpINbr+Pod6e1xNgFbzK1x5wmZl+jMocgiEFXZ67KHvmbD6MAQQr0MMz+GPhIu7EE4QCTLTyCEMlAG+K5Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "nx": "16.10.0", - "tslib": "^2.3.0" - }, - "bin": { - "tao": "index.js" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/@nx/nx-darwin-arm64": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.10.0.tgz", - "integrity": "sha512-YF+MIpeuwFkyvM5OwgY/rTNRpgVAI/YiR0yTYCZR+X3AAvP775IVlusNgQ3oedTBRUzyRnI4Tknj1WniENFsvQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/@nx/nx-darwin-x64": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.10.0.tgz", - "integrity": "sha512-ypi6YxwXgb0kg2ixKXE3pwf5myVNUgWf1CsV5OzVccCM8NzheMO51KDXTDmEpXdzUsfT0AkO1sk5GZeCjhVONg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/@nx/nx-freebsd-x64": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.10.0.tgz", - "integrity": "sha512-UeEYFDmdbbDkTQamqvtU8ibgu5jQLgFF1ruNb/U4Ywvwutw2d4ruOMl2e0u9hiNja9NFFAnDbvzrDcMo7jYqYw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.10.0.tgz", - "integrity": "sha512-WV3XUC2DB6/+bz1sx+d1Ai9q2Cdr+kTZRN50SOkfmZUQyEBaF6DRYpx/a4ahhxH3ktpNfyY8Maa9OEYxGCBkQA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.10.0.tgz", - "integrity": "sha512-aWIkOUw995V3ItfpAi5FuxQ+1e9EWLS1cjWM1jmeuo+5WtaKToJn5itgQOkvSlPz+HSLgM3VfXMvOFALNk125g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/@nx/nx-linux-arm64-musl": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.10.0.tgz", - "integrity": "sha512-uO6Gg+irqpVcCKMcEPIQcTFZ+tDI02AZkqkP7koQAjniLEappd8DnUBSQdcn53T086pHpdc264X/ZEpXFfrKWQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/@nx/nx-linux-x64-gnu": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.10.0.tgz", - "integrity": "sha512-134PW/u/arNFAQKpqMJniC7irbChMPz+W+qtyKPAUXE0XFKPa7c1GtlI/wK2dvP9qJDZ6bKf0KtA0U/m2HMUOA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/@nx/nx-linux-x64-musl": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.10.0.tgz", - "integrity": "sha512-q8sINYLdIJxK/iUx9vRk5jWAWb/2O0PAbOJFwv4qkxBv4rLoN7y+otgCZ5v0xfx/zztFgk/oNY4lg5xYjIso2Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.10.0.tgz", - "integrity": "sha512-moJkL9kcqxUdJSRpG7dET3UeLIciwrfP08mzBQ12ewo8K8FzxU8ZUsTIVVdNrwt01CXOdXoweGfdQLjJ4qTURA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/@nx/nx-win32-x64-msvc": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.10.0.tgz", - "integrity": "sha512-5iV2NKZnzxJwZZ4DM5JVbRG/nkhAbzEskKaLBB82PmYGKzaDHuMHP1lcPoD/rtYMlowZgNA/RQndfKvPBPwmXA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/@parcel/watcher": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", - "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "dependencies": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/@zkochan/js-yaml": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", - "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@lerna/legacy-package-management/node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -7537,31 +7300,6 @@ "node": ">=10" } }, - "node_modules/@lerna/legacy-package-management/node_modules/dotenv": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.2.tgz", - "integrity": "sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/dotenv-expand": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", - "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=12" - } - }, "node_modules/@lerna/legacy-package-management/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7639,26 +7377,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/legacy-package-management/node_modules/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/@lerna/legacy-package-management/node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -7909,14 +7627,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/@lerna/legacy-package-management/node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/@lerna/legacy-package-management/node_modules/npm-package-arg": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.1.tgz", @@ -8000,133 +7710,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@lerna/legacy-package-management/node_modules/nx": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/nx/-/nx-16.10.0.tgz", - "integrity": "sha512-gZl4iCC0Hx0Qe1VWmO4Bkeul2nttuXdPpfnlcDKSACGu3ZIo+uySqwOF8yBAxSTIf8xe2JRhgzJN1aFkuezEBg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@nrwl/tao": "16.10.0", - "@parcel/watcher": "2.0.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.0-rc.46", - "@zkochan/js-yaml": "0.0.6", - "axios": "^1.0.0", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.3.1", - "dotenv-expand": "~10.0.0", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "fs-extra": "^11.1.0", - "glob": "7.1.4", - "ignore": "^5.0.4", - "jest-diff": "^29.4.1", - "js-yaml": "4.1.0", - "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", - "minimatch": "3.0.5", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "semver": "7.5.3", - "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "v8-compile-cache": "2.3.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "16.10.0", - "@nx/nx-darwin-x64": "16.10.0", - "@nx/nx-freebsd-x64": "16.10.0", - "@nx/nx-linux-arm-gnueabihf": "16.10.0", - "@nx/nx-linux-arm64-gnu": "16.10.0", - "@nx/nx-linux-arm64-musl": "16.10.0", - "@nx/nx-linux-x64-gnu": "16.10.0", - "@nx/nx-linux-x64-musl": "16.10.0", - "@nx/nx-win32-arm64-msvc": "16.10.0", - "@nx/nx-win32-x64-msvc": "16.10.0" - }, - "peerDependencies": { - "@swc-node/register": "^1.6.7", - "@swc/core": "^1.3.85" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/nx/node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/nx/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/nx/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@lerna/legacy-package-management/node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -12470,330 +12053,6 @@ "@octokit/openapi-types": "^24.2.0" } }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "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" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/@phenomnomnominal/tsquery": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz", @@ -14543,331 +13802,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@swc-node/core": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/@swc-node/core/-/core-1.13.3.tgz", - "integrity": "sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@swc/core": ">= 1.4.13", - "@swc/types": ">= 0.1" - } - }, - "node_modules/@swc-node/register": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@swc-node/register/-/register-1.9.2.tgz", - "integrity": "sha512-BBjg0QNuEEmJSoU/++JOXhrjWdu3PTyYeJWsvchsI0Aqtj8ICkz/DqlwtXbmZVZ5vuDPpTfFlwDBZe81zgShMA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@swc-node/core": "^1.13.1", - "@swc-node/sourcemap-support": "^0.5.0", - "colorette": "^2.0.20", - "debug": "^4.3.4", - "pirates": "^4.0.6", - "tslib": "^2.6.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@swc/core": ">= 1.4.13", - "typescript": ">= 4.3" - } - }, - "node_modules/@swc-node/sourcemap-support": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc-node/sourcemap-support/-/sourcemap-support-0.5.1.tgz", - "integrity": "sha512-JxIvIo/Hrpv0JCHSyRpetAdQ6lB27oFYhv0PKCNf1g2gUXOjpeR1exrXccRxLMuAV5WAmGFBwRnNOJqN38+qtg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "source-map-support": "^0.5.21", - "tslib": "^2.6.3" - } - }, - "node_modules/@swc-node/sourcemap-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@swc-node/sourcemap-support/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@swc/core": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.7.tgz", - "integrity": "sha512-U4qJRBefIJNJDRCCiVtkfa/hpiZ7w0R6kASea+/KLp+vkus3zcLSB8Ub8SvKgTIxjWpwsKcZlPf5nrv4ls46SQ==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@swc/counter": "^0.1.2", - "@swc/types": "0.1.7" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.5.7", - "@swc/core-darwin-x64": "1.5.7", - "@swc/core-linux-arm-gnueabihf": "1.5.7", - "@swc/core-linux-arm64-gnu": "1.5.7", - "@swc/core-linux-arm64-musl": "1.5.7", - "@swc/core-linux-x64-gnu": "1.5.7", - "@swc/core-linux-x64-musl": "1.5.7", - "@swc/core-win32-arm64-msvc": "1.5.7", - "@swc/core-win32-ia32-msvc": "1.5.7", - "@swc/core-win32-x64-msvc": "1.5.7" - }, - "peerDependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.7.tgz", - "integrity": "sha512-bZLVHPTpH3h6yhwVl395k0Mtx8v6CGhq5r4KQdAoPbADU974Mauz1b6ViHAJ74O0IVE5vyy7tD3OpkQxL/vMDQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.7.tgz", - "integrity": "sha512-RpUyu2GsviwTc2qVajPL0l8nf2vKj5wzO3WkLSHAHEJbiUZk83NJrZd1RVbEknIMO7+Uyjh54hEh8R26jSByaw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.7.tgz", - "integrity": "sha512-cTZWTnCXLABOuvWiv6nQQM0hP6ZWEkzdgDvztgHI/+u/MvtzJBN5lBQ2lue/9sSFYLMqzqff5EHKlFtrJCA9dQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.7.tgz", - "integrity": "sha512-hoeTJFBiE/IJP30Be7djWF8Q5KVgkbDtjySmvYLg9P94bHg9TJPSQoC72tXx/oXOgXvElDe/GMybru0UxhKx4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.7.tgz", - "integrity": "sha512-+NDhK+IFTiVK1/o7EXdCeF2hEzCiaRSrb9zD7X2Z7inwWlxAntcSuzZW7Y6BRqGQH89KA91qYgwbnjgTQ22PiQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.7.tgz", - "integrity": "sha512-25GXpJmeFxKB+7pbY7YQLhWWjkYlR+kHz5I3j9WRl3Lp4v4UD67OGXwPe+DIcHqcouA1fhLhsgHJWtsaNOMBNg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.7.tgz", - "integrity": "sha512-0VN9Y5EAPBESmSPPsCJzplZHV26akC0sIgd3Hc/7S/1GkSMoeuVL+V9vt+F/cCuzr4VidzSkqftdP3qEIsXSpg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.7.tgz", - "integrity": "sha512-RtoNnstBwy5VloNCvmvYNApkTmuCe4sNcoYWpmY7C1+bPR+6SOo8im1G6/FpNem8AR5fcZCmXHWQ+EUmRWJyuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.7.tgz", - "integrity": "sha512-Xm0TfvcmmspvQg1s4+USL3x8D+YPAfX2JHygvxAnCJ0EHun8cm2zvfNBcsTlnwYb0ybFWXXY129aq1wgFC9TpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.7.tgz", - "integrity": "sha512-tp43WfJLCsKLQKBmjmY/0vv1slVywR5Q4qKjF5OIY8QijaEW7/8VwPyUyVoJZEnDgv9jKtUTG5PzqtIYPZGnyg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core/node_modules/@swc/types": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.7.tgz", - "integrity": "sha512-scHWahbHF0eyj3JsxG9CFJgFdFNaVQCNAimBlT6PzS3n/HptxqREjsm4OH6AN3lYcffZYSPxXW8ua2BEHp0lJQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true - }, "node_modules/@swc/helpers": { "version": "0.5.17", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", @@ -14878,18 +13812,6 @@ "tslib": "^2.8.0" } }, - "node_modules/@swc/types": { - "version": "0.1.21", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.21.tgz", - "integrity": "sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", @@ -16741,32 +15663,6 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.0.tgz", - "integrity": "sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/typescript-estree": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.31.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.0.tgz", @@ -17101,30 +15997,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/ui": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.9.tgz", - "integrity": "sha512-izzd2zmnk8Nl5ECYkW27328RbQ1nKvkm6Bb5DAaz1Gk59EbLkiCMa6OLT0NoaAYTjOFS6N+SMYW1nh4/9ljPiw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/utils": "2.1.9", - "fflate": "^0.8.2", - "flatted": "^3.3.1", - "pathe": "^1.1.2", - "sirv": "^3.0.0", - "tinyglobby": "^0.2.10", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "2.1.9" - } - }, "node_modules/@vitest/utils": { "version": "2.1.9", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", @@ -17481,6 +16353,28 @@ "node": ">=6.9.0" } }, + "node_modules/@wordpress/api-fetch/node_modules/@wordpress/i18n": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.26.0.tgz", + "integrity": "sha512-YHzaUWlCuN2ynl47qbsdMkTGtP52+E1giDOdWBgUaSexUYjbeFxKFUzRMB0Wuh1psL80+VzvJOH/mU440KAJnA==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/hooks": "^4.26.0", + "gettext-parser": "^1.3.1", + "memize": "^2.1.0", + "sprintf-js": "^1.1.1", + "tannin": "^1.2.0" + }, + "bin": { + "pot-to-php": "tools/pot-to-php.js" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/autop": { "version": "4.22.0", "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-4.22.0.tgz", @@ -17714,6 +16608,28 @@ "react-dom": "^18.0.0" } }, + "node_modules/@wordpress/block-editor/node_modules/@wordpress/i18n": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.26.0.tgz", + "integrity": "sha512-YHzaUWlCuN2ynl47qbsdMkTGtP52+E1giDOdWBgUaSexUYjbeFxKFUzRMB0Wuh1psL80+VzvJOH/mU440KAJnA==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/hooks": "^4.26.0", + "gettext-parser": "^1.3.1", + "memize": "^2.1.0", + "sprintf-js": "^1.1.1", + "tannin": "^1.2.0" + }, + "bin": { + "pot-to-php": "tools/pot-to-php.js" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/block-editor/node_modules/@wordpress/keycodes": { "version": "4.22.0", "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.22.0.tgz", @@ -18004,6 +16920,28 @@ "npm": ">=8.19.2" } }, + "node_modules/@wordpress/commands/node_modules/@wordpress/i18n": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.26.0.tgz", + "integrity": "sha512-YHzaUWlCuN2ynl47qbsdMkTGtP52+E1giDOdWBgUaSexUYjbeFxKFUzRMB0Wuh1psL80+VzvJOH/mU440KAJnA==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/hooks": "^4.26.0", + "gettext-parser": "^1.3.1", + "memize": "^2.1.0", + "sprintf-js": "^1.1.1", + "tannin": "^1.2.0" + }, + "bin": { + "pot-to-php": "tools/pot-to-php.js" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/commands/node_modules/@wordpress/keycodes": { "version": "4.22.0", "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.22.0.tgz", @@ -18546,6 +17484,27 @@ "npm": ">=8.19.2" } }, + "node_modules/@wordpress/dataviews/node_modules/@wordpress/i18n": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.26.0.tgz", + "integrity": "sha512-YHzaUWlCuN2ynl47qbsdMkTGtP52+E1giDOdWBgUaSexUYjbeFxKFUzRMB0Wuh1psL80+VzvJOH/mU440KAJnA==", + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/hooks": "^4.26.0", + "gettext-parser": "^1.3.1", + "memize": "^2.1.0", + "sprintf-js": "^1.1.1", + "tannin": "^1.2.0" + }, + "bin": { + "pot-to-php": "tools/pot-to-php.js" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/dataviews/node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -18757,13 +17716,14 @@ } }, "node_modules/@wordpress/i18n": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.26.0.tgz", - "integrity": "sha512-YHzaUWlCuN2ynl47qbsdMkTGtP52+E1giDOdWBgUaSexUYjbeFxKFUzRMB0Wuh1psL80+VzvJOH/mU440KAJnA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.4.0.tgz", + "integrity": "sha512-nU4vpcBn5X+O/lUw2zhg44iTxh3smmBT6wLDFigGXpBKcVjJjlhVkwWLqpP/ZIc+mfhplgu4TJcTSbHyKsQLgg==", + "dev": true, "license": "GPL-2.0-or-later", "dependencies": { - "@babel/runtime": "7.25.7", - "@wordpress/hooks": "^4.26.0", + "@babel/runtime": "^7.16.0", + "@wordpress/hooks": "^4.4.0", "gettext-parser": "^1.3.1", "memize": "^2.1.0", "sprintf-js": "^1.1.1", @@ -18777,18 +17737,6 @@ "npm": ">=8.19.2" } }, - "node_modules/@wordpress/i18n/node_modules/@babel/runtime": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", - "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@wordpress/icons": { "version": "10.31.0", "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-10.31.0.tgz", @@ -18925,7 +17873,304 @@ "react": "^18.0.0" } }, - "node_modules/@wordpress/keyboard-shortcuts/node_modules/@wordpress/element": { + "node_modules/@wordpress/keyboard-shortcuts/node_modules/@wordpress/element": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.22.0.tgz", + "integrity": "sha512-EX6vnRZBaJWkZU99gKPAJ77ZNZocNaFQr3FjYqVNRUBNyAfu2D8bIyBFAfuGn+YSWp+NAQxO4/j2NOBD44go2g==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "7.25.7", + "@types/react": "^18.2.79", + "@types/react-dom": "^18.2.25", + "@wordpress/escape-html": "^3.22.0", + "change-case": "^4.1.2", + "is-plain-object": "^5.0.0", + "react": "^18.3.0", + "react-dom": "^18.3.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/keyboard-shortcuts/node_modules/@wordpress/i18n": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.26.0.tgz", + "integrity": "sha512-YHzaUWlCuN2ynl47qbsdMkTGtP52+E1giDOdWBgUaSexUYjbeFxKFUzRMB0Wuh1psL80+VzvJOH/mU440KAJnA==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/hooks": "^4.26.0", + "gettext-parser": "^1.3.1", + "memize": "^2.1.0", + "sprintf-js": "^1.1.1", + "tannin": "^1.2.0" + }, + "bin": { + "pot-to-php": "tools/pot-to-php.js" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/keyboard-shortcuts/node_modules/@wordpress/keycodes": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.22.0.tgz", + "integrity": "sha512-xdFE7ZM2MwydodJ+4sSxjQDQU4+gwnI3KyJD6cBI3ubk2856Iu67Rbs4nXPuxDiolbRKGFURX6TfNpCI7/DdWw==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/i18n": "^5.22.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/keycodes": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-3.58.0.tgz", + "integrity": "sha512-Q/LRKpx8ndzuHlkxSQ2BD+NTYYKQPIneNNMng8hTAfyU7RFwXpqj06HpeOFGh4XIdPKCs/8hmucoLJRmmLmZJA==", + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "^7.16.0", + "@wordpress/i18n": "^4.58.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@wordpress/keycodes/node_modules/@wordpress/hooks": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.58.0.tgz", + "integrity": "sha512-9LB0ZHnZRQlORttux9t/xbAskF+dk2ujqzPGsVzc92mSKpQP3K2a5Wy74fUnInguB1vLUNHT6nrNdkVom5qX1Q==", + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "^7.16.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@wordpress/keycodes/node_modules/@wordpress/i18n": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-4.58.0.tgz", + "integrity": "sha512-VfvS3BWv/RDjRKD6PscIcvYfWKnGJcI/DEqyDgUMhxCM6NRwoL478CsUKTiGJIymeyRodNRfprdcF086DpGKYw==", + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "^7.16.0", + "@wordpress/hooks": "^3.58.0", + "gettext-parser": "^1.3.1", + "memize": "^2.1.0", + "sprintf-js": "^1.1.1", + "tannin": "^1.2.0" + }, + "bin": { + "pot-to-php": "tools/pot-to-php.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@wordpress/notices": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.4.0.tgz", + "integrity": "sha512-I3EH5CcGWasXkgjUbO2t+o3l3wmizYY6zxECYiyXgOI5iwBwHwhyA6lcspKx12b0yTUKGug/9R+jKGCdIkkQrg==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "^7.16.0", + "@wordpress/a11y": "^4.4.0", + "@wordpress/data": "^10.4.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/preferences": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-4.22.0.tgz", + "integrity": "sha512-9Ng6KYgTBjygJUF8tMSoEKKsdnwr5ZoMeB8hjcwbi2d/S3qyCb/irj3Rer5VclrY6Bu/ic1XJIP14JkJlxIvxg==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/a11y": "^4.22.0", + "@wordpress/components": "^29.8.0", + "@wordpress/compose": "^7.22.0", + "@wordpress/data": "^10.22.0", + "@wordpress/deprecated": "^4.22.0", + "@wordpress/element": "^6.22.0", + "@wordpress/i18n": "^5.22.0", + "@wordpress/icons": "^10.22.0", + "@wordpress/private-apis": "^1.22.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/preferences/node_modules/@ariakit/core": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/@ariakit/core/-/core-0.4.15.tgz", + "integrity": "sha512-vvxmZvkNhiisKM+Y1TbGMUfVVchV/sWu9F0xw0RYADXcimWPK31dd9JnIZs/OQ5pwAryAHmERHwuGQVESkSjwQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@wordpress/preferences/node_modules/@ariakit/react": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/@ariakit/react/-/react-0.4.17.tgz", + "integrity": "sha512-HQaIboE2axtlncJz1hRTaiQfJ1GGjhdtNcAnPwdjvl2RybfmlHowIB+HTVBp36LzroKPs/M4hPCxk7XTaqRZGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ariakit/react-core": "0.4.17" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ariakit" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@wordpress/preferences/node_modules/@ariakit/react-core": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/@ariakit/react-core/-/react-core-0.4.17.tgz", + "integrity": "sha512-kFF6n+gC/5CRQIyaMTFoBPio2xUe0k9rZhMNdUobWRmc/twfeLVkODx+8UVYaNyKilTge8G0JFqwvFKku/jKEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ariakit/core": "0.4.15", + "@floating-ui/dom": "^1.0.0", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@wordpress/preferences/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/preferences/node_modules/@wordpress/components": { + "version": "29.8.0", + "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-29.8.0.tgz", + "integrity": "sha512-pLh+EeV6AUyKzWX/FpnnCw/oCwAB/yQrNe10iQhvz7mdr0S+NuANZp+1Nv2gaRTiqO3gWjJuZNMeYwxXNPfv4w==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@ariakit/react": "^0.4.15", + "@babel/runtime": "7.25.7", + "@emotion/cache": "^11.7.1", + "@emotion/css": "^11.7.1", + "@emotion/react": "^11.7.1", + "@emotion/serialize": "^1.0.2", + "@emotion/styled": "^11.6.0", + "@emotion/utils": "^1.0.0", + "@floating-ui/react-dom": "^2.0.8", + "@types/gradient-parser": "0.1.3", + "@types/highlight-words-core": "1.2.1", + "@use-gesture/react": "^10.3.1", + "@wordpress/a11y": "^4.22.0", + "@wordpress/compose": "^7.22.0", + "@wordpress/date": "^5.22.0", + "@wordpress/deprecated": "^4.22.0", + "@wordpress/dom": "^4.22.0", + "@wordpress/element": "^6.22.0", + "@wordpress/escape-html": "^3.22.0", + "@wordpress/hooks": "^4.22.0", + "@wordpress/html-entities": "^4.22.0", + "@wordpress/i18n": "^5.22.0", + "@wordpress/icons": "^10.22.0", + "@wordpress/is-shallow-equal": "^5.22.0", + "@wordpress/keycodes": "^4.22.0", + "@wordpress/primitives": "^4.22.0", + "@wordpress/private-apis": "^1.22.0", + "@wordpress/rich-text": "^7.22.0", + "@wordpress/warning": "^3.22.0", + "change-case": "^4.1.2", + "clsx": "^2.1.1", + "colord": "^2.7.0", + "date-fns": "^3.6.0", + "deepmerge": "^4.3.0", + "fast-deep-equal": "^3.1.3", + "framer-motion": "^11.1.9", + "gradient-parser": "1.0.2", + "highlight-words-core": "^1.2.2", + "is-plain-object": "^5.0.0", + "memize": "^2.1.0", + "path-to-regexp": "^6.2.1", + "re-resizable": "^6.4.0", + "react-colorful": "^5.3.1", + "remove-accents": "^0.5.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/preferences/node_modules/@wordpress/data": { + "version": "10.22.0", + "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.22.0.tgz", + "integrity": "sha512-AbPbbvdWB6X30MIAlaAQ2BEAO4+p1G5YnmLfanWNUP9sl7L30JklIm7eRgYe7nA78uC71cax6bBQSBvgBAmV+A==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/compose": "^7.22.0", + "@wordpress/deprecated": "^4.22.0", + "@wordpress/element": "^6.22.0", + "@wordpress/is-shallow-equal": "^5.22.0", + "@wordpress/priority-queue": "^3.22.0", + "@wordpress/private-apis": "^1.22.0", + "@wordpress/redux-routine": "^5.22.0", + "deepmerge": "^4.3.0", + "equivalent-key-map": "^0.2.2", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "redux": "^5.0.1", + "rememo": "^4.0.2", + "use-memo-one": "^1.1.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/preferences/node_modules/@wordpress/element": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.22.0.tgz", "integrity": "sha512-EX6vnRZBaJWkZU99gKPAJ77ZNZocNaFQr3FjYqVNRUBNyAfu2D8bIyBFAfuGn+YSWp+NAQxO4/j2NOBD44go2g==", @@ -18946,54 +18191,15 @@ "npm": ">=8.19.2" } }, - "node_modules/@wordpress/keyboard-shortcuts/node_modules/@wordpress/keycodes": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.22.0.tgz", - "integrity": "sha512-xdFE7ZM2MwydodJ+4sSxjQDQU4+gwnI3KyJD6cBI3ubk2856Iu67Rbs4nXPuxDiolbRKGFURX6TfNpCI7/DdWw==", + "node_modules/@wordpress/preferences/node_modules/@wordpress/i18n": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.26.0.tgz", + "integrity": "sha512-YHzaUWlCuN2ynl47qbsdMkTGtP52+E1giDOdWBgUaSexUYjbeFxKFUzRMB0Wuh1psL80+VzvJOH/mU440KAJnA==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/i18n": "^5.22.0" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, - "node_modules/@wordpress/keycodes": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-3.58.0.tgz", - "integrity": "sha512-Q/LRKpx8ndzuHlkxSQ2BD+NTYYKQPIneNNMng8hTAfyU7RFwXpqj06HpeOFGh4XIdPKCs/8hmucoLJRmmLmZJA==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^4.58.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@wordpress/keycodes/node_modules/@wordpress/hooks": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.58.0.tgz", - "integrity": "sha512-9LB0ZHnZRQlORttux9t/xbAskF+dk2ujqzPGsVzc92mSKpQP3K2a5Wy74fUnInguB1vLUNHT6nrNdkVom5qX1Q==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@wordpress/keycodes/node_modules/@wordpress/i18n": { - "version": "4.58.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-4.58.0.tgz", - "integrity": "sha512-VfvS3BWv/RDjRKD6PscIcvYfWKnGJcI/DEqyDgUMhxCM6NRwoL478CsUKTiGJIymeyRodNRfprdcF086DpGKYw==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/hooks": "^3.58.0", + "@wordpress/hooks": "^4.26.0", "gettext-parser": "^1.3.1", "memize": "^2.1.0", "sprintf-js": "^1.1.1", @@ -19002,220 +18208,6 @@ "bin": { "pot-to-php": "tools/pot-to-php.js" }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@wordpress/notices": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.4.0.tgz", - "integrity": "sha512-I3EH5CcGWasXkgjUbO2t+o3l3wmizYY6zxECYiyXgOI5iwBwHwhyA6lcspKx12b0yTUKGug/9R+jKGCdIkkQrg==", - "dev": true, - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^4.4.0", - "@wordpress/data": "^10.4.0" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/@wordpress/preferences": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-4.22.0.tgz", - "integrity": "sha512-9Ng6KYgTBjygJUF8tMSoEKKsdnwr5ZoMeB8hjcwbi2d/S3qyCb/irj3Rer5VclrY6Bu/ic1XJIP14JkJlxIvxg==", - "dev": true, - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "7.25.7", - "@wordpress/a11y": "^4.22.0", - "@wordpress/components": "^29.8.0", - "@wordpress/compose": "^7.22.0", - "@wordpress/data": "^10.22.0", - "@wordpress/deprecated": "^4.22.0", - "@wordpress/element": "^6.22.0", - "@wordpress/i18n": "^5.22.0", - "@wordpress/icons": "^10.22.0", - "@wordpress/private-apis": "^1.22.0", - "clsx": "^2.1.1" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@wordpress/preferences/node_modules/@ariakit/core": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/@ariakit/core/-/core-0.4.15.tgz", - "integrity": "sha512-vvxmZvkNhiisKM+Y1TbGMUfVVchV/sWu9F0xw0RYADXcimWPK31dd9JnIZs/OQ5pwAryAHmERHwuGQVESkSjwQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@wordpress/preferences/node_modules/@ariakit/react": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/@ariakit/react/-/react-0.4.17.tgz", - "integrity": "sha512-HQaIboE2axtlncJz1hRTaiQfJ1GGjhdtNcAnPwdjvl2RybfmlHowIB+HTVBp36LzroKPs/M4hPCxk7XTaqRZGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ariakit/react-core": "0.4.17" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ariakit" - }, - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@wordpress/preferences/node_modules/@ariakit/react-core": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/@ariakit/react-core/-/react-core-0.4.17.tgz", - "integrity": "sha512-kFF6n+gC/5CRQIyaMTFoBPio2xUe0k9rZhMNdUobWRmc/twfeLVkODx+8UVYaNyKilTge8G0JFqwvFKku/jKEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ariakit/core": "0.4.15", - "@floating-ui/dom": "^1.0.0", - "use-sync-external-store": "^1.2.0" - }, - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@wordpress/preferences/node_modules/@babel/runtime": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", - "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@wordpress/preferences/node_modules/@wordpress/components": { - "version": "29.8.0", - "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-29.8.0.tgz", - "integrity": "sha512-pLh+EeV6AUyKzWX/FpnnCw/oCwAB/yQrNe10iQhvz7mdr0S+NuANZp+1Nv2gaRTiqO3gWjJuZNMeYwxXNPfv4w==", - "dev": true, - "license": "GPL-2.0-or-later", - "dependencies": { - "@ariakit/react": "^0.4.15", - "@babel/runtime": "7.25.7", - "@emotion/cache": "^11.7.1", - "@emotion/css": "^11.7.1", - "@emotion/react": "^11.7.1", - "@emotion/serialize": "^1.0.2", - "@emotion/styled": "^11.6.0", - "@emotion/utils": "^1.0.0", - "@floating-ui/react-dom": "^2.0.8", - "@types/gradient-parser": "0.1.3", - "@types/highlight-words-core": "1.2.1", - "@use-gesture/react": "^10.3.1", - "@wordpress/a11y": "^4.22.0", - "@wordpress/compose": "^7.22.0", - "@wordpress/date": "^5.22.0", - "@wordpress/deprecated": "^4.22.0", - "@wordpress/dom": "^4.22.0", - "@wordpress/element": "^6.22.0", - "@wordpress/escape-html": "^3.22.0", - "@wordpress/hooks": "^4.22.0", - "@wordpress/html-entities": "^4.22.0", - "@wordpress/i18n": "^5.22.0", - "@wordpress/icons": "^10.22.0", - "@wordpress/is-shallow-equal": "^5.22.0", - "@wordpress/keycodes": "^4.22.0", - "@wordpress/primitives": "^4.22.0", - "@wordpress/private-apis": "^1.22.0", - "@wordpress/rich-text": "^7.22.0", - "@wordpress/warning": "^3.22.0", - "change-case": "^4.1.2", - "clsx": "^2.1.1", - "colord": "^2.7.0", - "date-fns": "^3.6.0", - "deepmerge": "^4.3.0", - "fast-deep-equal": "^3.1.3", - "framer-motion": "^11.1.9", - "gradient-parser": "1.0.2", - "highlight-words-core": "^1.2.2", - "is-plain-object": "^5.0.0", - "memize": "^2.1.0", - "path-to-regexp": "^6.2.1", - "re-resizable": "^6.4.0", - "react-colorful": "^5.3.1", - "remove-accents": "^0.5.0", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@wordpress/preferences/node_modules/@wordpress/data": { - "version": "10.22.0", - "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.22.0.tgz", - "integrity": "sha512-AbPbbvdWB6X30MIAlaAQ2BEAO4+p1G5YnmLfanWNUP9sl7L30JklIm7eRgYe7nA78uC71cax6bBQSBvgBAmV+A==", - "dev": true, - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "7.25.7", - "@wordpress/compose": "^7.22.0", - "@wordpress/deprecated": "^4.22.0", - "@wordpress/element": "^6.22.0", - "@wordpress/is-shallow-equal": "^5.22.0", - "@wordpress/priority-queue": "^3.22.0", - "@wordpress/private-apis": "^1.22.0", - "@wordpress/redux-routine": "^5.22.0", - "deepmerge": "^4.3.0", - "equivalent-key-map": "^0.2.2", - "is-plain-object": "^5.0.0", - "is-promise": "^4.0.0", - "redux": "^5.0.1", - "rememo": "^4.0.2", - "use-memo-one": "^1.1.1" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/@wordpress/preferences/node_modules/@wordpress/element": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.22.0.tgz", - "integrity": "sha512-EX6vnRZBaJWkZU99gKPAJ77ZNZocNaFQr3FjYqVNRUBNyAfu2D8bIyBFAfuGn+YSWp+NAQxO4/j2NOBD44go2g==", - "dev": true, - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "7.25.7", - "@types/react": "^18.2.79", - "@types/react-dom": "^18.2.25", - "@wordpress/escape-html": "^3.22.0", - "change-case": "^4.1.2", - "is-plain-object": "^5.0.0", - "react": "^18.3.0", - "react-dom": "^18.3.0" - }, "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" @@ -23329,21 +22321,6 @@ "node": ">= 0.8" } }, - "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "is-what": "^3.14.1" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, "node_modules/copy-text-to-clipboard": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", @@ -24833,21 +23810,6 @@ "node": ">=4" } }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -25470,21 +24432,6 @@ "dev": true, "license": "MIT" }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -27092,15 +26039,6 @@ "node": ">=0.4.0" } }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -29673,15 +28611,6 @@ "url": "https://opencollective.com/immer" } }, - "node_modules/immutable": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz", - "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -30808,15 +29737,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -31264,24 +30184,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, "node_modules/jest-circus/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -31315,25 +30217,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-circus/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-circus/node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", @@ -34035,117 +32918,6 @@ "node": ">=10" } }, - "node_modules/less": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" - } - }, - "node_modules/less/node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/less/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/less/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/less/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/less/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/less/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -38570,40 +37342,6 @@ "dev": true, "license": "MIT" }, - "node_modules/needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -38643,15 +37381,6 @@ "node": ">=10" } }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/node-emoji": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", @@ -40796,18 +39525,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/parse-numeric-range": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", @@ -43105,15 +41822,6 @@ "dev": true, "license": "MIT" }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/ps-man": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/ps-man/-/ps-man-1.1.8.tgz", @@ -45983,63 +44691,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, - "node_modules/sass": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.3.tgz", - "integrity": "sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/sass/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", @@ -46095,14 +44746,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -47226,23 +45869,6 @@ "dev": true, "license": "MIT" }, - "node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -48229,92 +46855,6 @@ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", "license": "MIT" }, - "node_modules/stylus": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", - "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@adobe/css-tools": "^4.0.1", - "debug": "^4.3.2", - "glob": "^7.1.6", - "sax": "~1.2.4", - "source-map": "^0.7.3" - }, - "bin": { - "stylus": "bin/stylus" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://opencollective.com/stylus" - } - }, - "node_modules/stylus/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/stylus/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/stylus/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/stylus/node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true - }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", diff --git a/package.json b/package.json index 0c1f2b86a5..cfbb773971 100644 --- a/package.json +++ b/package.json @@ -150,6 +150,7 @@ "@wordpress/core-data": "7.4.0", "@wordpress/data": "10.4.0", "@wordpress/element": "6.4.0", + "@wordpress/i18n": "5.4.0", "@wordpress/notices": "5.4.0", "chalk": "5.2.0", "clsx": "^1.2.1", From 9fea464eb9122c1e6fdc01e7b749abbc418738ca Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 12:36:56 +0000 Subject: [PATCH 03/33] Adding the I18n provider --- packages/playground/website/src/main.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/playground/website/src/main.tsx b/packages/playground/website/src/main.tsx index 54eb8b39a7..acf9bc2c8e 100644 --- a/packages/playground/website/src/main.tsx +++ b/packages/playground/website/src/main.tsx @@ -6,14 +6,17 @@ import { Provider } from 'react-redux'; import store from './lib/state/redux/store'; import { Layout } from './components/layout'; import { EnsurePlaygroundSite } from './components/ensure-playground-site'; +import { I18nProvider } from './lib/i18n'; collectWindowErrors(logger); const root = createRoot(document.getElementById('root')!); root.render( - - - + + + + + ); From 14fb6bc0a1e9dc52c852e60245149bd90e6c3e33 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 12:38:22 +0000 Subject: [PATCH 04/33] Creatring internationalization provider --- .../website/src/lib/i18n/provider.tsx | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 packages/playground/website/src/lib/i18n/provider.tsx diff --git a/packages/playground/website/src/lib/i18n/provider.tsx b/packages/playground/website/src/lib/i18n/provider.tsx new file mode 100644 index 0000000000..f88a970ef0 --- /dev/null +++ b/packages/playground/website/src/lib/i18n/provider.tsx @@ -0,0 +1,101 @@ +/** + * I18n Provider Component + * + * This component initializes the i18n system and provides + * locale management throughout the application. + */ + +import { useEffect, useState } from 'react'; +import type { ReactNode } from 'react'; +import { + getInitialLocale, + initializeLocale, + saveLocale, + type SupportedLocale, +} from './config'; + +export interface I18nProviderProps { + children: ReactNode; + /** + * Optional initial locale. If not provided, will be determined + * from URL params, localStorage, or browser settings. + */ + initialLocale?: SupportedLocale; +} + +/** + * Provider component that initializes the i18n system. + * + * This component should wrap the entire application to ensure + * translations are available throughout the component tree. + * + * @example + * ```tsx + * import { I18nProvider } from '@/lib/i18n'; + * + * function App() { + * return ( + * + * + * + * ); + * } + * ``` + */ +export function I18nProvider({ + children, + initialLocale, +}: I18nProviderProps): JSX.Element { + const [locale, setLocale] = useState( + initialLocale || getInitialLocale() + ); + const [isLoading, setIsLoading] = useState(true); + + // Initialize the locale on mount and when locale changes + useEffect(() => { + let isCancelled = false; + + async function loadLocale() { + setIsLoading(true); + try { + await initializeLocale(locale); + if (!isCancelled) { + saveLocale(locale); + setIsLoading(false); + } + } catch (error) { + console.error('Failed to initialize locale:', error); + if (!isCancelled) { + setIsLoading(false); + } + } + } + + loadLocale(); + + return () => { + isCancelled = true; + }; + }, [locale]); + + // Expose locale change function globally for debugging/testing + useEffect(() => { + if (typeof window !== 'undefined') { + (window as any).__setPlaygroundLocale = ( + newLocale: SupportedLocale + ) => { + setLocale(newLocale); + }; + } + + return () => { + if (typeof window !== 'undefined') { + delete (window as any).__setPlaygroundLocale; + } + }; + }, []); + + // Render children immediately - translations will update when loaded + // This prevents blocking the entire UI on locale loading + return <>{children}; +} From a39fbfb0bed500a5daf2e2baac0ba8da0a44a9b6 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 12:38:58 +0000 Subject: [PATCH 05/33] Adding i18n config settings --- .../playground/website/src/lib/i18n/config.ts | 143 ++++++++++++++ .../playground/website/src/lib/i18n/index.ts | 20 ++ .../website/src/lib/i18n/use-i18n.ts | 186 ++++++++++++++++++ 3 files changed, 349 insertions(+) create mode 100644 packages/playground/website/src/lib/i18n/config.ts create mode 100644 packages/playground/website/src/lib/i18n/index.ts create mode 100644 packages/playground/website/src/lib/i18n/use-i18n.ts diff --git a/packages/playground/website/src/lib/i18n/config.ts b/packages/playground/website/src/lib/i18n/config.ts new file mode 100644 index 0000000000..f05c8229aa --- /dev/null +++ b/packages/playground/website/src/lib/i18n/config.ts @@ -0,0 +1,143 @@ +/** + * i18n Configuration for WordPress Playground Website + * + * This module provides configuration and initialization for the + * WordPress i18n package (@wordpress/i18n). + */ + +import { setLocaleData } from '@wordpress/i18n'; + +/** + * The text domain for the WordPress Playground website. + * Used to scope translations to this specific application. + */ +export const TEXT_DOMAIN = 'playground-website'; + +/** + * Default locale for the application. + */ +export const DEFAULT_LOCALE = 'en'; + +/** + * Supported locales for the application. + * Add new locales here as translations become available. + */ +export const SUPPORTED_LOCALES = [ + 'en', // English + 'es', // Spanish + 'pt-br', // Portuguese (Brazil) + 'ja', // Japanese +] as const; + +export type SupportedLocale = (typeof SUPPORTED_LOCALES)[number]; + +/** + * Locale metadata including display names. + */ +export const LOCALE_METADATA: Record< + SupportedLocale, + { name: string; nativeName: string } +> = { + en: { name: 'English', nativeName: 'English' }, + es: { name: 'Spanish', nativeName: 'Español' }, + 'pt-br': { name: 'Portuguese (Brazil)', nativeName: 'Português (Brasil)' }, + ja: { name: 'Japanese', nativeName: '日本語' }, +}; + +/** + * Validate if a string is a supported locale. + */ +export function isSupportedLocale(locale: string): locale is SupportedLocale { + return SUPPORTED_LOCALES.includes(locale as SupportedLocale); +} + +/** + * Initialize locale data for a specific locale. + * This function loads translation data and registers it with @wordpress/i18n. + * + * @param locale - The locale code to initialize + */ +export async function initializeLocale(locale: SupportedLocale): Promise { + // For English, we don't need to load any translations + if (locale === DEFAULT_LOCALE) { + return; + } + + try { + // Dynamically import the locale data + const localeData = await import(`./locales/${locale}.json`); + + // Register the locale data with WordPress i18n + setLocaleData(localeData.default, TEXT_DOMAIN); + } catch (error) { + console.warn(`Failed to load locale data for ${locale}:`, error); + // Fall back to default locale (English) on error + } +} + +/** + * Get the browser's preferred locale from available options. + */ +export function getBrowserLocale(): SupportedLocale { + if (typeof navigator === 'undefined') { + return DEFAULT_LOCALE; + } + + // Get browser languages in order of preference + const browserLanguages = navigator.languages || [navigator.language]; + + // Find the first supported locale + for (const lang of browserLanguages) { + // Normalize to lowercase and check exact match + const normalizedLang = lang.toLowerCase(); + if (isSupportedLocale(normalizedLang)) { + return normalizedLang; + } + + // Check language without region (e.g., 'pt' from 'pt-BR') + const baseLang = normalizedLang.split('-')[0]; + if (isSupportedLocale(baseLang)) { + return baseLang; + } + + // Check with hyphen normalized to match our format (e.g., 'pt-br') + const hyphenatedLang = normalizedLang.replace('_', '-'); + if (isSupportedLocale(hyphenatedLang)) { + return hyphenatedLang; + } + } + + return DEFAULT_LOCALE; +} + +/** + * Get locale from URL parameter or storage. + */ +export function getInitialLocale(): SupportedLocale { + // Check URL parameter first + if (typeof window !== 'undefined') { + const urlParams = new URLSearchParams(window.location.search); + const urlLocale = urlParams.get('locale'); + if (urlLocale && isSupportedLocale(urlLocale)) { + return urlLocale; + } + + // Check localStorage + const storedLocale = localStorage.getItem('playground-locale'); + if (storedLocale && isSupportedLocale(storedLocale)) { + return storedLocale; + } + } + + // Fall back to browser locale + return getBrowserLocale(); +} + +/** + * Save the current locale to localStorage. + */ +export function saveLocale(locale: SupportedLocale): void { + if (typeof window !== 'undefined') { + localStorage.setItem('playground-locale', locale); + } +} diff --git a/packages/playground/website/src/lib/i18n/index.ts b/packages/playground/website/src/lib/i18n/index.ts new file mode 100644 index 0000000000..d077838c05 --- /dev/null +++ b/packages/playground/website/src/lib/i18n/index.ts @@ -0,0 +1,20 @@ +/** + * i18n module for WordPress Playground Website + * + * This module exports all i18n-related utilities, hooks, and configuration. + * Import from this file to access translation functionality throughout the app. + * + * @example + * ```tsx + * import { useI18n } from '@/lib/i18n'; + * + * function MyComponent() { + * const { __ } = useI18n(); + * return

{__('Welcome to Playground')}

; + * } + * ``` + */ + +export * from './config'; +export * from './use-i18n'; +export { I18nProvider } from './provider'; diff --git a/packages/playground/website/src/lib/i18n/use-i18n.ts b/packages/playground/website/src/lib/i18n/use-i18n.ts new file mode 100644 index 0000000000..a77942bd78 --- /dev/null +++ b/packages/playground/website/src/lib/i18n/use-i18n.ts @@ -0,0 +1,186 @@ +/** + * Custom React hook for i18n functionality. + * + * This hook provides a convenient way to access WordPress i18n functions + * within React components, with proper text domain scoping. + */ + +import { useCallback, useMemo } from 'react'; +import { + __ as wpTranslate, + _x as wpTranslateWithContext, + _n as wpTranslatePlural, + _nx as wpTranslatePluralWithContext, + sprintf, + isRTL, +} from '@wordpress/i18n'; +import { TEXT_DOMAIN } from './config'; + +/** + * Translation functions with automatic text domain binding. + */ +export interface I18nFunctions { + /** + * Translate a string. + * + * @param text - The text to translate + * @returns The translated text + * + * @example + * const { __ } = useI18n(); + * const text = __('Save Playground'); + */ + __(text: string): string; + + /** + * Translate a string with context. + * Context helps disambiguate identical strings with different meanings. + * + * @param text - The text to translate + * @param context - The context for the translation + * @returns The translated text + * + * @example + * const { _x } = useI18n(); + * // "Save" as in "download" + * const saveButton = _x('Save', 'button label'); + * // "Save" as in "rescue" + * const saveAction = _x('Save', 'action verb'); + */ + _x(text: string, context: string): string; + + /** + * Translate a string with plural forms. + * + * @param singular - The singular form + * @param plural - The plural form + * @param count - The number that determines which form to use + * @returns The translated text in the appropriate form + * + * @example + * const { _n } = useI18n(); + * const text = _n('1 file', '%d files', fileCount); + */ + _n(singular: string, plural: string, count: number): string; + + /** + * Translate a string with plural forms and context. + * + * @param singular - The singular form + * @param plural - The plural form + * @param count - The number that determines which form to use + * @param context - The context for the translation + * @returns The translated text in the appropriate form + * + * @example + * const { _nx } = useI18n(); + * const text = _nx('1 item', '%d items', count, 'shopping cart'); + */ + _nx( + singular: string, + plural: string, + count: number, + context: string + ): string; + + /** + * Format a string with placeholders. + * + * @param format - The format string with %s, %d, etc. + * @param args - Values to substitute into the format string + * @returns The formatted string + * + * @example + * const { sprintf } = useI18n(); + * const text = sprintf('Saving %d / %d files...', current, total); + */ + sprintf(format: string, ...args: (string | number)[]): string; + + /** + * Check if the current locale uses right-to-left text direction. + * + * @returns true if the locale is RTL, false otherwise + * + * @example + * const { isRTL } = useI18n(); + * const direction = isRTL() ? 'rtl' : 'ltr'; + */ + isRTL(): boolean; +} + +/** + * Hook that provides i18n translation functions. + * + * All translation functions are automatically bound to the + * WordPress Playground text domain. + * + * @returns Object containing translation functions + * + * @example + * ```tsx + * function SaveButton() { + * const { __ } = useI18n(); + * return ; + * } + * ``` + * + * @example + * ```tsx + * function FileCounter({ count }: { count: number }) { + * const { _n, sprintf } = useI18n(); + * const text = sprintf( + * _n('Saving %d file...', 'Saving %d files...', count), + * count + * ); + * return
{text}
; + * } + * ``` + */ +export function useI18n(): I18nFunctions { + // Memoize the translation function to avoid recreating on every render + const __ = useCallback((text: string): string => { + return wpTranslate(text, TEXT_DOMAIN); + }, []); + + const _x = useCallback((text: string, context: string): string => { + return wpTranslateWithContext(text, context, TEXT_DOMAIN); + }, []); + + const _n = useCallback( + (singular: string, plural: string, count: number): string => { + return wpTranslatePlural(singular, plural, count, TEXT_DOMAIN); + }, + [] + ); + + const _nx = useCallback( + ( + singular: string, + plural: string, + count: number, + context: string + ): string => { + return wpTranslatePluralWithContext( + singular, + plural, + count, + context, + TEXT_DOMAIN + ); + }, + [] + ); + + // Return all i18n functions as a stable object + return useMemo( + () => ({ + __, + _x, + _n, + _nx, + sprintf, + isRTL, + }), + [__, _x, _n, _nx] + ); +} From 3080a0d75b43add22b4af984f0567c92934751c1 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 12:39:27 +0000 Subject: [PATCH 06/33] adding localization to PR menu --- .../components/toolbar-buttons/wordpress-pr-menu-item.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/playground/website/src/components/toolbar-buttons/wordpress-pr-menu-item.tsx b/packages/playground/website/src/components/toolbar-buttons/wordpress-pr-menu-item.tsx index 381fbb1acf..e2f97f6d8c 100644 --- a/packages/playground/website/src/components/toolbar-buttons/wordpress-pr-menu-item.tsx +++ b/packages/playground/website/src/components/toolbar-buttons/wordpress-pr-menu-item.tsx @@ -3,23 +3,25 @@ import { setActiveModal } from '../../lib/state/redux/slice-ui'; import type { PlaygroundDispatch } from '../../lib/state/redux/store'; import { useDispatch } from 'react-redux'; import { modalSlugs } from '../layout'; +import { useI18n } from '../../lib/i18n'; interface Props { onClose: () => void; disabled?: boolean; } export function WordPressPRMenuItem({ onClose, disabled }: Props) { + const { __ } = useI18n(); const dispatch: PlaygroundDispatch = useDispatch(); return ( { dispatch(setActiveModal(modalSlugs.PREVIEW_PR_WP)); onClose(); }} > - WordPress Core PR + {__('WordPress Core PR')} ); } From 5fd8a528c6c1ba366e82126e34593efa05d63de6 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 12:39:46 +0000 Subject: [PATCH 07/33] Adding localization for view logs --- .../website/src/components/toolbar-buttons/view-logs.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/playground/website/src/components/toolbar-buttons/view-logs.tsx b/packages/playground/website/src/components/toolbar-buttons/view-logs.tsx index 8b196b238a..5755b425b6 100644 --- a/packages/playground/website/src/components/toolbar-buttons/view-logs.tsx +++ b/packages/playground/website/src/components/toolbar-buttons/view-logs.tsx @@ -5,22 +5,24 @@ import { useDispatch } from 'react-redux'; import type { PlaygroundDispatch } from '../../lib/state/redux/store'; import { setActiveModal } from '../../lib/state/redux/slice-ui'; import { modalSlugs } from '../layout'; +import { useI18n } from '../../lib/i18n'; type Props = { onClose: () => void }; export function ViewLogs({ onClose }: Props) { + const { __ } = useI18n(); const dispatch: PlaygroundDispatch = useDispatch(); return ( { dispatch(setActiveModal(modalSlugs.LOG)); onClose(); }} > - View logs + {__('View logs')} ); } From deb803d5ff562acf612a405a2c747f4cb3e07e61 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 12:40:16 +0000 Subject: [PATCH 08/33] adding localization for view error component --- .../website/src/components/toolbar-buttons/report-error.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/playground/website/src/components/toolbar-buttons/report-error.tsx b/packages/playground/website/src/components/toolbar-buttons/report-error.tsx index f1a36aea6e..4debdec620 100644 --- a/packages/playground/website/src/components/toolbar-buttons/report-error.tsx +++ b/packages/playground/website/src/components/toolbar-buttons/report-error.tsx @@ -4,21 +4,23 @@ import { useDispatch } from 'react-redux'; import type { PlaygroundDispatch } from '../../lib/state/redux/store'; import { setActiveModal } from '../../lib/state/redux/slice-ui'; import { modalSlugs } from '../layout'; +import { useI18n } from '../../lib/i18n'; type Props = { onClose: () => void; disabled?: boolean }; export function ReportError({ onClose, disabled }: Props) { + const { __ } = useI18n(); const dispatch: PlaygroundDispatch = useDispatch(); return ( { dispatch(setActiveModal(modalSlugs.ERROR_REPORT)); onClose(); }} > - Report error + {__('Report error')} ); } From afdb1efafae6daf3b03ab6c778f57d17e536cfce Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 12:41:13 +0000 Subject: [PATCH 09/33] adding localization for renaming site modal --- .../src/components/rename-site-modal/index.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/playground/website/src/components/rename-site-modal/index.tsx b/packages/playground/website/src/components/rename-site-modal/index.tsx index c16f68db80..000a4e6570 100644 --- a/packages/playground/website/src/components/rename-site-modal/index.tsx +++ b/packages/playground/website/src/components/rename-site-modal/index.tsx @@ -5,8 +5,10 @@ import { setActiveModal } from '../../lib/state/redux/slice-ui'; import { updateSiteMetadata } from '../../lib/state/redux/slice-sites'; import { Modal } from '../modal'; import ModalButtons from '../modal/modal-buttons'; +import { useI18n } from '../../lib/i18n'; export function RenameSiteModal() { + const { __ } = useI18n(); const dispatch = useAppDispatch(); const site = useAppSelector((state) => state.ui.activeSite?.slug @@ -46,8 +48,10 @@ export function RenameSiteModal() { return ( @@ -60,15 +64,15 @@ export function RenameSiteModal() { > setName(val)} - placeholder="e.g. Testing Gutenberg 24.17" + placeholder={__('e.g. Testing Gutenberg 24.17')} maxLength={80} autoFocus /> Date: Sun, 26 Oct 2025 12:41:45 +0000 Subject: [PATCH 10/33] Adding localization for the import form component --- .../website/src/components/import-form/index.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/playground/website/src/components/import-form/index.tsx b/packages/playground/website/src/components/import-form/index.tsx index 730bc87fd0..9205e3eaf6 100644 --- a/packages/playground/website/src/components/import-form/index.tsx +++ b/packages/playground/website/src/components/import-form/index.tsx @@ -5,6 +5,7 @@ import { importWordPressFiles } from '@wp-playground/client'; import forms from '../../forms.module.css'; import { logger } from '@php-wasm/logger'; import ModalButtons from '../modal/modal-buttons'; +import { useI18n } from '../../lib/i18n'; interface ImportFormProps { playground: PlaygroundClient; @@ -17,6 +18,7 @@ export default function ImportForm({ onImported, onClose, }: ImportFormProps) { + const { __ } = useI18n(); const fileInputRef = useRef(); const [file, setFile] = useState(null); const [error, setError] = useState(''); @@ -35,7 +37,9 @@ export default function ImportForm({ } catch (error) { logger.error(error); setError( - 'Unable to import file. Is it a valid WordPress Playground export?' + __( + 'Unable to import file. Is it a valid WordPress Playground export?' + ) ); return; } @@ -46,8 +50,9 @@ export default function ImportForm({ return ( <>

- You may replace the current WordPress Playground site with a - previously exported one. + {__( + 'You may replace the current WordPress Playground site with a previously exported one.' + )}

{error ?
{error}
: null} @@ -64,7 +69,7 @@ export default function ImportForm({ areDisabled={!file} onCancel={onClose} onSubmit={handleSubmit} - submitText="Import" + submitText={__('Import')} /> ); From 5d08c032bb039b3bd77e5f47a65af434c41f870c Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 12:42:16 +0000 Subject: [PATCH 11/33] Adding localization for missing site modal --- .../components/missing-site-modal/index.tsx | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/packages/playground/website/src/components/missing-site-modal/index.tsx b/packages/playground/website/src/components/missing-site-modal/index.tsx index af7b57ff02..9d87c2584d 100644 --- a/packages/playground/website/src/components/missing-site-modal/index.tsx +++ b/packages/playground/website/src/components/missing-site-modal/index.tsx @@ -8,8 +8,10 @@ import { } from '../../lib/state/redux/store'; import { setActiveModal } from '../../lib/state/redux/slice-ui'; import { selectClientInfoBySiteSlug } from '../../lib/state/redux/slice-clients'; +import { useI18n } from '../../lib/i18n'; export function MissingSiteModal() { + const { __, sprintf } = useI18n(); const dispatch = useAppDispatch(); const closeModal = () => dispatch(setActiveModal(null)); @@ -27,24 +29,28 @@ export function MissingSiteModal() { return null; } - // TODO: Improve language for this modal return (

- The {activeSite.metadata.name} Playground does not exist, - so we loaded a temporary Playground instead. + {sprintf( + __( + 'The %s Playground does not exist, so we loaded a temporary Playground instead.' + ), + activeSite.metadata.name + )}

- If you want to preserve your changes, you can save the - Playground to browser storage. + {__( + 'If you want to preserve your changes, you can save the Playground to browser storage.' + )}

{/* Note: We are using row-reverse direction so the secondary button can display first in row orientation and last when @@ -66,7 +72,7 @@ export function MissingSiteModal() { storage="opfs" > @@ -83,7 +89,7 @@ export function MissingSiteModal() { closeModal(); }} > - Keep using a temporary Playground + {__('Keep using a temporary Playground')} From 3b79589b8aa5f9dfb89c79e5efb29076001ff115 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 12:42:59 +0000 Subject: [PATCH 12/33] Adding Localization for offline notice --- .../website/src/components/offline-notice/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/playground/website/src/components/offline-notice/index.tsx b/packages/playground/website/src/components/offline-notice/index.tsx index c21b18fe63..a13515b5c6 100644 --- a/packages/playground/website/src/components/offline-notice/index.tsx +++ b/packages/playground/website/src/components/offline-notice/index.tsx @@ -1,14 +1,16 @@ import { Notice } from '@wordpress/components'; import css from './style.module.css'; +import { useI18n } from '../../lib/i18n'; export function OfflineNotice() { + const { __ } = useI18n(); return ( - Some features may not available because you are offline. + {__('Some features may not available because you are offline.')} ); } From 281c00130b8337eb324e08dc91269c30637a7b42 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 12:43:28 +0000 Subject: [PATCH 13/33] Adding localization for save-site-modal --- .../src/components/save-site-modal/index.tsx | 62 ++++++++++++------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/packages/playground/website/src/components/save-site-modal/index.tsx b/packages/playground/website/src/components/save-site-modal/index.tsx index e1b69ba583..23bc9b7daa 100644 --- a/packages/playground/website/src/components/save-site-modal/index.tsx +++ b/packages/playground/website/src/components/save-site-modal/index.tsx @@ -21,6 +21,7 @@ import { persistTemporarySite } from '../../lib/state/redux/persist-temporary-si import type { SiteStorageType } from '../../lib/state/redux/slice-sites'; import { logger } from '@php-wasm/logger'; import { isOpfsAvailable } from '../../lib/state/opfs/opfs-site-storage'; +import { useI18n } from '../../lib/i18n'; type StorageOption = Extract; @@ -36,6 +37,7 @@ const errorTextStyle: CSSProperties = { }; export function SaveSiteModal() { + const { __, sprintf } = useI18n(); const dispatch = useAppDispatch(); const site = useAppSelector((state) => state.ui.activeSite?.slug @@ -145,8 +147,8 @@ export function SaveSiteModal() { const localIsAvailable = localFsAvailability === 'available'; const localUnavailableMessage = localFsAvailability === 'not-available' - ? 'Not available in this browser' - : 'Not available on this site'; + ? __('Not available in this browser') + : __('Not available on this site'); const chooseStorage = (storage: StorageOption) => { if (storage === 'local-fs' && !localIsAvailable) { @@ -196,7 +198,7 @@ export function SaveSiteModal() { setSubmitError(null); if (!(window as any).showDirectoryPicker) { setDirectoryError( - 'Directory selection is not supported in this browser.' + __('Directory selection is not supported in this browser.') ); return; } @@ -212,7 +214,9 @@ export function SaveSiteModal() { setDirectoryPermission(permission); if (permission !== 'granted') { setDirectoryError( - 'Allow Playground to edit that directory in the browser prompt to continue.' + __( + 'Allow Playground to edit that directory in the browser prompt to continue.' + ) ); } else { setDirectoryError(null); @@ -222,7 +226,7 @@ export function SaveSiteModal() { return; } logger.error(error); - setDirectoryError('Unable to access the selected directory.'); + setDirectoryError(__('Unable to access the selected directory.')); } }; @@ -238,14 +242,16 @@ export function SaveSiteModal() { if (selectedStorage === 'local-fs') { if (!directoryHandle) { - setDirectoryError('Choose a directory to continue.'); + setDirectoryError(__('Choose a directory to continue.')); return; } const permission = await ensureWriteAccess(directoryHandle); setDirectoryPermission(permission); if (permission !== 'granted') { setDirectoryError( - 'Allow Playground to edit that directory in the browser prompt to continue.' + __( + 'Allow Playground to edit that directory in the browser prompt to continue.' + ) ); return; } @@ -268,7 +274,7 @@ export function SaveSiteModal() { // Don't close modal here - useEffect will close it when save completes } catch (error) { logger.error(error); - setSubmitError('Saving failed. Please try again.'); + setSubmitError(__('Saving failed. Please try again.')); setIsSubmitting(false); } }; @@ -295,8 +301,8 @@ export function SaveSiteModal() { return ( setName(value)} autoFocus @@ -321,19 +327,23 @@ export function SaveSiteModal() { disabled={isSaving} /> {!isOpfsAvailable && selectedStorage === 'opfs' && ( -

Not available in this browser

+

+ {__('Not available in this browser')} +

)} {!localIsAvailable && selectedStorage === 'local-fs' && (

{localUnavailableMessage}

)} {selectedStorage === 'local-fs' && ( - +
{directoryError ? ( @@ -387,13 +399,17 @@ export function SaveSiteModal() { >

{savingProgress - ? `Saving ${savingProgress.files} / ${savingProgress.total} files...` - : 'Preparing to save...'} + ? sprintf( + __('Saving %d / %d files...'), + savingProgress.files, + savingProgress.total + ) + : __('Preparing to save...')}

)} Date: Sun, 26 Oct 2025 12:44:44 +0000 Subject: [PATCH 14/33] adding localization for download as zip component --- .../src/components/toolbar-buttons/download-as-zip.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/playground/website/src/components/toolbar-buttons/download-as-zip.tsx b/packages/playground/website/src/components/toolbar-buttons/download-as-zip.tsx index 52b04d35b4..f566d8d235 100644 --- a/packages/playground/website/src/components/toolbar-buttons/download-as-zip.tsx +++ b/packages/playground/website/src/components/toolbar-buttons/download-as-zip.tsx @@ -4,14 +4,16 @@ import type { PlaygroundClient } from '@wp-playground/client'; import { zipWpContent } from '@wp-playground/client'; import saveAs from 'file-saver'; import { usePlaygroundClient } from '../../lib/use-playground-client'; +import { useI18n } from '../../lib/i18n'; type Props = { onClose: () => void; disabled: boolean }; export function DownloadAsZipMenuItem({ onClose, disabled }: Props) { + const { __ } = useI18n(); const playground = usePlaygroundClient(); return ( { if (!playground) return; @@ -19,7 +21,7 @@ export function DownloadAsZipMenuItem({ onClose, disabled }: Props) { onClose(); }} > - Download as .zip + {__('Download as .zip')} ); } From 98118328ab16385564eba31867ca39d0deade5cb Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 13:00:38 +0000 Subject: [PATCH 15/33] adding localization on restore zip --- .../components/toolbar-buttons/restore-from-zip.tsx | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/playground/website/src/components/toolbar-buttons/restore-from-zip.tsx b/packages/playground/website/src/components/toolbar-buttons/restore-from-zip.tsx index 39549d0576..de117a696e 100644 --- a/packages/playground/website/src/components/toolbar-buttons/restore-from-zip.tsx +++ b/packages/playground/website/src/components/toolbar-buttons/restore-from-zip.tsx @@ -3,19 +3,18 @@ import { setActiveModal } from '../../lib/state/redux/slice-ui'; import type { PlaygroundDispatch } from '../../lib/state/redux/store'; import { useDispatch } from 'react-redux'; import { modalSlugs } from '../layout'; +import { useI18n } from '../../lib/i18n'; type Props = { text?: string; onClose: () => void; disabled: boolean }; -export function RestoreFromZipMenuItem({ - text = 'Restore from .zip', - onClose, - disabled, -}: Props) { +export function RestoreFromZipMenuItem({ text, onClose, disabled }: Props) { + const { __ } = useI18n(); const dispatch: PlaygroundDispatch = useDispatch(); + const defaultText = __('Restore from .zip'); return ( { dispatch(setActiveModal(modalSlugs.IMPORT_FORM)); if (typeof onClose === 'function') { @@ -24,7 +23,7 @@ export function RestoreFromZipMenuItem({ }} disabled={disabled} > - {text} + {text || defaultText} ); } From 3a0cbeaababc47ae84b24501e431b3650d0808c5 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 13:01:05 +0000 Subject: [PATCH 16/33] adding localization Start error modal --- .../src/components/start-error-modal/index.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/playground/website/src/components/start-error-modal/index.tsx b/packages/playground/website/src/components/start-error-modal/index.tsx index 2f7df9da39..ededd4bedf 100644 --- a/packages/playground/website/src/components/start-error-modal/index.tsx +++ b/packages/playground/website/src/components/start-error-modal/index.tsx @@ -1,12 +1,14 @@ import { Button } from '@wordpress/components'; import { LogModal } from '../log-modal'; import { useState } from '@wordpress/element'; +import { useI18n } from '../../lib/i18n'; import css from './style.module.css'; export const localStorageKey = 'playground-start-error-dont-show-again'; export function StartErrorModal() { + const { __ } = useI18n(); const [dontShowAgain, setDontShowAgain] = useState( localStorage.getItem(localStorageKey) === 'true' ); @@ -23,27 +25,25 @@ export function StartErrorModal() { const description = ( <>

- Oops! There was a problem starting Playground. To figure out - what went wrong, please take a look at the error logs provided - below. If you see an "Invalid blueprint error," the logs will - point out the specific step causing the issue. You can then - double-check your blueprint. For more help, you can also{' '} + {__( + 'Oops! There was a problem starting Playground. To figure out what went wrong, please take a look at the error logs provided below. If you see an "Invalid blueprint error," the logs will point out the specific step causing the issue. You can then double-check your blueprint. For more help, you can also' + )}{' '} - visit our documentation. + {__('visit our documentation.')} {' '}

); From 55bab3e2af1bf31fbae59bf436588a0109131388 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 13:01:43 +0000 Subject: [PATCH 18/33] adding localization for impor and export github --- .../toolbar-buttons/github-export-menu-item.tsx | 8 ++++++-- .../toolbar-buttons/github-import-menu-item.tsx | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/playground/website/src/components/toolbar-buttons/github-export-menu-item.tsx b/packages/playground/website/src/components/toolbar-buttons/github-export-menu-item.tsx index cacb8e5795..7d6ea6d760 100644 --- a/packages/playground/website/src/components/toolbar-buttons/github-export-menu-item.tsx +++ b/packages/playground/website/src/components/toolbar-buttons/github-export-menu-item.tsx @@ -3,23 +3,27 @@ import { setActiveModal } from '../../lib/state/redux/slice-ui'; import type { PlaygroundDispatch } from '../../lib/state/redux/store'; import { useDispatch } from 'react-redux'; import { modalSlugs } from '../layout'; +import { useI18n } from '../../lib/i18n'; interface Props { onClose: () => void; disabled?: boolean; } export function GithubExportMenuItem({ onClose, disabled }: Props) { + const { __ } = useI18n(); const dispatch: PlaygroundDispatch = useDispatch(); return ( { dispatch(setActiveModal(modalSlugs.GITHUB_EXPORT)); onClose(); }} > - Export to GitHub + {__('Export to GitHub')} ); } diff --git a/packages/playground/website/src/components/toolbar-buttons/github-import-menu-item.tsx b/packages/playground/website/src/components/toolbar-buttons/github-import-menu-item.tsx index b512e48a3c..bcb93f3e42 100644 --- a/packages/playground/website/src/components/toolbar-buttons/github-import-menu-item.tsx +++ b/packages/playground/website/src/components/toolbar-buttons/github-import-menu-item.tsx @@ -3,23 +3,27 @@ import { setActiveModal } from '../../lib/state/redux/slice-ui'; import type { PlaygroundDispatch } from '../../lib/state/redux/store'; import { useDispatch } from 'react-redux'; import { modalSlugs } from '../layout'; +import { useI18n } from '../../lib/i18n'; interface Props { onClose: () => void; disabled?: boolean; } export function GithubImportMenuItem({ onClose, disabled }: Props) { + const { __ } = useI18n(); const dispatch: PlaygroundDispatch = useDispatch(); return ( { dispatch(setActiveModal(modalSlugs.GITHUB_IMPORT)); onClose(); }} > - GitHub repository + {__('GitHub repository')} ); } From be0feb542f457b5ec7425c77bdf4a3239f5c969d Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 13:02:06 +0000 Subject: [PATCH 19/33] adding localization for pr preview --- .../components/toolbar-buttons/gutenberg-pr-menu-item.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/playground/website/src/components/toolbar-buttons/gutenberg-pr-menu-item.tsx b/packages/playground/website/src/components/toolbar-buttons/gutenberg-pr-menu-item.tsx index f28f61c204..b24bc85991 100644 --- a/packages/playground/website/src/components/toolbar-buttons/gutenberg-pr-menu-item.tsx +++ b/packages/playground/website/src/components/toolbar-buttons/gutenberg-pr-menu-item.tsx @@ -3,23 +3,25 @@ import { setActiveModal } from '../../lib/state/redux/slice-ui'; import type { PlaygroundDispatch } from '../../lib/state/redux/store'; import { useDispatch } from 'react-redux'; import { modalSlugs } from '../layout'; +import { useI18n } from '../../lib/i18n'; interface Props { onClose: () => void; disabled?: boolean; } export function GutenbergPRMenuItem({ onClose, disabled }: Props) { + const { __ } = useI18n(); const dispatch: PlaygroundDispatch = useDispatch(); return ( { dispatch(setActiveModal(modalSlugs.PREVIEW_PR_GUTENBERG)); onClose(); }} > - Gutenberg PR + {__('Gutenberg PR')} ); } From 5dbbfe7c87e72ae0494e1c22afba45252b463ee9 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 13:02:23 +0000 Subject: [PATCH 20/33] adding portuguese translation --- .../website/src/lib/i18n/locales/pt-br.json | 97 ++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) diff --git a/packages/playground/website/src/lib/i18n/locales/pt-br.json b/packages/playground/website/src/lib/i18n/locales/pt-br.json index 631980c33b..92d367d773 100644 --- a/packages/playground/website/src/lib/i18n/locales/pt-br.json +++ b/packages/playground/website/src/lib/i18n/locales/pt-br.json @@ -6,7 +6,102 @@ "domain": "playground-website", "lang": "pt-br", "plural-forms": "nplurals=2; plural=(n > 1);" - } + }, + "Save to browser storage?": [ + "Salvar no armazenamento do navegador?" + ], + "This is a dialog window which overlays the main content of the page. It offers the user a choice between using a temporary Playground and a persistent Playground that is saved to browser storage.": [ + "Esta é uma janela de diálogo que se sobrepõe ao conteúdo principal da página. Ela oferece ao usuário a escolha entre usar um Playground temporário e um Playground persistente que é salvo no armazenamento do navegador." + ], + "The %s Playground does not exist, so we loaded a temporary Playground instead.": [ + "O Playground %s não existe, então carregamos um Playground temporário." + ], + "If you want to preserve your changes, you can save the Playground to browser storage.": [ + "Se você deseja preservar suas alterações, pode salvar o Playground no armazenamento do navegador." + ], + "Save Playground to browser storage": [ + "Salvar Playground no armazenamento do navegador" + ], + "Keep using a temporary Playground": [ + "Continuar usando um Playground temporário" + ], + "Rename Playground": ["Renomear Playground"], + "This is a dialog window which overlays the main content of the page. The modal begins with a heading 2 called \"Rename Playground\". Pressing the Close button will close the modal and bring you back to where you were on the page.": [ + "Esta é uma janela de diálogo que se sobrepõe ao conteúdo principal da página. O modal começa com um título 2 chamado \"Renomear Playground\". Pressionar o botão Fechar fechará o modal e o levará de volta para onde você estava na página." + ], + "Name": ["Nome"], + "e.g. Testing Gutenberg 24.17": ["ex: Testando Gutenberg 24.17"], + "Rename": ["Renomear"], + "Not available in this browser": ["Não disponível neste navegador"], + "Not available on this site": ["Não disponível neste site"], + "Directory selection is not supported in this browser.": [ + "A seleção de diretório não é suportada neste navegador." + ], + "Allow Playground to edit that directory in the browser prompt to continue.": [ + "Permita que o Playground edite esse diretório no prompt do navegador para continuar." + ], + "Unable to access the selected directory.": [ + "Não foi possível acessar o diretório selecionado." + ], + "Choose a directory to continue.": [ + "Escolha um diretório para continuar." + ], + "Saving failed. Please try again.": [ + "Falha ao salvar. Por favor, tente novamente." + ], + "Save Playground": ["Salvar Playground"], + "Playground name": ["Nome do Playground"], + "Storage location": ["Local de armazenamento"], + "Save in this browser": ["Salvar neste navegador"], + "not available": ["não disponível"], + "Save to a local directory": ["Salvar em um diretório local"], + "Local directory": ["Diretório local"], + "Choose a directory...": ["Escolher um diretório..."], + "Choose...": ["Escolher..."], + "Saving %d / %d files...": ["Salvando %d de %d arquivos..."], + "Preparing to save...": ["Preparando para salvar..."], + "Save": ["Salvar"], + "Oops! There was a problem starting Playground. To figure out what went wrong, please take a look at the error logs provided below. If you see an \"Invalid blueprint error,\" the logs will point out the specific step causing the issue. You can then double-check your blueprint. For more help, you can also": [ + "Ops! Houve um problema ao iniciar o Playground. Para descobrir o que deu errado, consulte os logs de erro fornecidos abaixo. Se você ver um \"Erro de blueprint inválido\", os logs apontarão a etapa específica que está causando o problema. Você pode então verificar novamente seu blueprint. Para mais ajuda, você também pode" + ], + "visit our documentation.": ["visitar nossa documentação."], + "Don't show again": ["Não mostrar novamente"], + "Error": ["Erro"], + "Submit": ["Enviar"], + "Cancel": ["Cancelar"], + "Download the current playground as a .zip file": [ + "Baixar o playground atual como um arquivo .zip" + ], + "Download as .zip": ["Baixar como .zip"], + "Restore from .zip": ["Restaurar do .zip"], + "Import a .zip file into the current Playground": [ + "Importar um arquivo .zip para o Playground atual" + ], + "View logs": ["Ver logs"], + "Report an error in Playground": ["Reportar um erro no Playground"], + "Report error": ["Reportar erro"], + "Export WordPress theme, plugin, or wp-content directory to a GitHub repository as a Pull Request.": [ + "Exportar tema WordPress, plugin ou diretório wp-content para um repositório GitHub como um Pull Request." + ], + "Export to GitHub": ["Exportar para GitHub"], + "Import WordPress theme, plugin, or wp-content directory from a GitHub repository.": [ + "Importar tema WordPress, plugin ou diretório wp-content de um repositório GitHub." + ], + "GitHub repository": ["Repositório GitHub"], + "Preview WordPress Core PR": ["Visualizar PR do WordPress Core"], + "WordPress Core PR": ["PR do WordPress Core"], + "Preview Gutenberg PR.": ["Visualizar PR do Gutenberg."], + "Gutenberg PR": ["PR do Gutenberg"], + "Unable to import file. Is it a valid WordPress Playground export?": [ + "Não foi possível importar o arquivo. É uma exportação válida do WordPress Playground?" + ], + "You may replace the current WordPress Playground site with a previously exported one.": [ + "Você pode substituir o site atual do WordPress Playground por um exportado anteriormente." + ], + "Import": ["Importar"], + "Some features may not available because you are offline.": [ + "Alguns recursos podem não estar disponíveis porque você está offline." + ] } } } From 82a3a653919a32d0ac199899189c022377d93ec6 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 13:29:10 +0000 Subject: [PATCH 21/33] Adding localization on the settings panel --- .../src/components/browser-chrome/index.tsx | 39 +++++++++++++------ .../website/src/lib/i18n/locales/pt-br.json | 7 +++- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/packages/playground/website/src/components/browser-chrome/index.tsx b/packages/playground/website/src/components/browser-chrome/index.tsx index df7b3514ab..676fc9e58a 100644 --- a/packages/playground/website/src/components/browser-chrome/index.tsx +++ b/packages/playground/website/src/components/browser-chrome/index.tsx @@ -1,8 +1,22 @@ +/** + * External dependencies + */ import React from 'react'; -import css from './style.module.css'; -import AddressBar from '../address-bar'; import classNames from 'classnames'; + +/** + * WordPress dependencies + */ import { useMediaQuery } from '@wordpress/compose'; +import { Dropdown, Icon } from '@wordpress/components'; +import { cog } from '@wordpress/icons'; +import { SiteManagerIcon } from '@wp-playground/components'; + +/** + * Internal dependencies + */ +import css from './style.module.css'; +import AddressBar from '../address-bar'; import { useAppSelector, getActiveClientInfo, @@ -10,13 +24,11 @@ import { useAppDispatch, } from '../../lib/state/redux/store'; import { SyncLocalFilesButton } from '../sync-local-files-button'; -import { Dropdown, Icon } from '@wordpress/components'; import { Modal } from '../../components/modal'; -import { cog } from '@wordpress/icons'; import Button from '../button'; import { ActiveSiteSettingsForm } from '../site-manager/site-settings-form'; import { setSiteManagerOpen } from '../../lib/state/redux/slice-ui'; -import { SiteManagerIcon } from '@wp-playground/components'; +import { useI18n } from '../../lib/i18n'; interface BrowserChromeProps { children?: React.ReactNode; @@ -27,6 +39,7 @@ export default function BrowserChrome({ children, className, }: BrowserChromeProps) { + const { __ } = useI18n(); const clientInfo = useAppSelector(getActiveClientInfo); const activeSite = useActiveSite(); const showAddressBar = !!clientInfo; @@ -55,7 +68,7 @@ export default function BrowserChrome({ className={classNames(css.toolbar, { [css.withSidebarOpen]: siteManagerIsOpen, })} - aria-label="Playground toolbar" + aria-label={__('Playground toolbar')} >
diff --git a/packages/playground/website/src/components/sync-local-files-button/index.tsx b/packages/playground/website/src/components/sync-local-files-button/index.tsx index c21bb64ee1..293c1ea411 100644 --- a/packages/playground/website/src/components/sync-local-files-button/index.tsx +++ b/packages/playground/website/src/components/sync-local-files-button/index.tsx @@ -4,11 +4,13 @@ import { getActiveClientInfo, useAppSelector, } from '../../lib/state/redux/store'; +import { useI18n } from '../../lib/i18n'; export function SyncLocalFilesButton() { const { client, url, opfsMountDescriptor } = useAppSelector(getActiveClientInfo) || {}; const [isSyncing, setIsSyncing] = useState(false); + const { __ } = useI18n(); return ( ); } From 39cc687e55627325fe6704d29c115f03de4e80cf Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 18:34:48 +0000 Subject: [PATCH 26/33] Adding missing translations --- .../site-manager/site-file-browser/index.tsx | 45 +++++++++++----- .../site-manager/site-info-panel/index.tsx | 51 ++++++++++++------- .../site-persist-button/index.tsx | 4 +- .../website/src/lib/i18n/locales/es.json | 19 ++++++- .../website/src/lib/i18n/locales/pt-br.json | 19 ++++++- 5 files changed, 103 insertions(+), 35 deletions(-) diff --git a/packages/playground/website/src/components/site-manager/site-file-browser/index.tsx b/packages/playground/website/src/components/site-manager/site-file-browser/index.tsx index df46fe097e..79d6c9f799 100644 --- a/packages/playground/website/src/components/site-manager/site-file-browser/index.tsx +++ b/packages/playground/website/src/components/site-manager/site-file-browser/index.tsx @@ -16,6 +16,7 @@ import { FileExplorerSidebar } from './file-explorer-sidebar'; import { CodeEditor, type CodeEditorHandle } from './code-editor'; import styles from './style.module.css'; import { logger } from '@php-wasm/logger'; +import { useI18n } from '../../../lib/i18n'; const SAVE_DEBOUNCE_MS = 1500; @@ -38,6 +39,7 @@ export function SiteFileBrowser({ isVisible?: boolean; documentRoot: string; }) { + const { __ } = useI18n(); const client = usePlaygroundClient(site.slug); const filesystem = useFilesystem(client); @@ -87,6 +89,7 @@ export function SiteFileBrowser({ codeRef, setSaveState, setSaveError, + __, }); } previousClientRef.current = client ?? null; @@ -100,9 +103,10 @@ export function SiteFileBrowser({ codeRef, setSaveState, setSaveError, + __, }); }; - }, []); + }, [__]); useEffect(() => { if (!client) { @@ -163,7 +167,7 @@ export function SiteFileBrowser({ } catch (error) { logger.error('Failed to save file', error); setSaveState(SaveState.ERROR); - setSaveError('Could not save changes. Try again.'); + setSaveError(__('Could not save changes. Try again.')); } }, SAVE_DEBOUNCE_MS); saveTimeoutRef.current = timeout; @@ -245,6 +249,7 @@ export function SiteFileBrowser({ codeRef, setSaveState, setSaveError, + __, }); } catch { // Best-effort save; ignore errors so the new file can still open. @@ -343,6 +348,7 @@ export function SiteFileBrowser({ codeRef, setSaveState, setSaveError, + __, }); } catch { /* noop */ @@ -365,6 +371,7 @@ export function SiteFileBrowser({ codeRef, setSaveState, setSaveError, + __, }); } catch { /* noop */ @@ -397,17 +404,18 @@ export function SiteFileBrowser({ codeRef, setSaveState, setSaveError, + __, }); - }, []); + }, [__]); - const saveStatusLabel = getSaveStatusLabel(saveState, saveError); + const saveStatusLabel = getSaveStatusLabel(saveState, saveError, __); const saveStatusClassName = getSaveStatusClassName(saveState, styles); if (!client || !filesystem) { return (
- Start this Playground to browse and edit its files. + {__('Start this Playground to browse and edit its files.')}
); @@ -446,8 +454,8 @@ export function SiteFileBrowser({ } > {showExplorerOnMobile - ? 'Hide files' - : 'Browse files'} + ? __('Hide files') + : __('Browse files')}
{currentPath?.length ? currentPath - : `Browse files under ${documentRoot}`} + : __('Browse files under %s').replace( + '%s', + documentRoot + )}
- Select a file to view or edit its contents. + {__('Select a file to view or edit its contents.')}
)} @@ -527,15 +538,19 @@ function useFilesystem( }, [client]); } -function getSaveStatusLabel(saveState: SaveState, saveError: string | null) { +function getSaveStatusLabel( + saveState: SaveState, + saveError: string | null, + __: (text: string) => string +) { switch (saveState) { case SaveState.PENDING: case SaveState.SAVING: - return 'Saving…'; + return __('Saving…'); case SaveState.SAVED: - return 'Saved'; + return __('Saved'); case SaveState.ERROR: - return saveError ?? 'Save failed'; + return saveError ?? __('Save failed'); default: return ''; } @@ -565,12 +580,14 @@ async function flushPendingSave( codeRef, setSaveState, setSaveError, + __, }: { saveTimeoutRef: MutableRefObject; currentPathRef: MutableRefObject; codeRef: MutableRefObject; setSaveState: React.Dispatch>; setSaveError: React.Dispatch>; + __: (text: string) => string; } ) { if (saveTimeoutRef.current === null) { @@ -591,7 +608,7 @@ async function flushPendingSave( } catch (error) { logger.error('Failed to save file', error); setSaveState(SaveState.ERROR); - setSaveError('Could not save changes. Try again.'); + setSaveError(__('Could not save changes. Try again.')); throw error; } } diff --git a/packages/playground/website/src/components/site-manager/site-info-panel/index.tsx b/packages/playground/website/src/components/site-manager/site-info-panel/index.tsx index ac9e1e33c6..7458ee6048 100644 --- a/packages/playground/website/src/components/site-manager/site-info-panel/index.tsx +++ b/packages/playground/website/src/components/site-manager/site-info-panel/index.tsx @@ -21,6 +21,7 @@ import { GithubExportMenuItem } from '../../toolbar-buttons/github-export-menu-i import { ReportError } from '../../toolbar-buttons/report-error'; import { TemporarySiteNotice } from '../temporary-site-notice'; import type { SiteInfo } from '../../../lib/state/redux/slice-sites'; +import { useI18n } from '../../../lib/i18n'; import { setSiteManagerOpen, setSiteManagerSection, @@ -76,6 +77,7 @@ export function SiteInfoPanel({ mobileUi?: boolean; siteViewHidden?: boolean; }) { + const { __ } = useI18n(); const offline = useAppSelector((state) => state.ui.offline); const dispatch = useAppDispatch(); @@ -96,7 +98,10 @@ export function SiteInfoPanel({ const removeSiteAndCloseMenu = async (onClose: () => void) => { // TODO: Replace with HTML-based dialog const proceed = window.confirm( - `Are you sure you want to delete the site '${site.metadata.name}'?` + __("Are you sure you want to delete the site '%s'?").replace( + '%s', + site.metadata.name + ) ); if (proceed) { await dispatch(removeSite(site.slug)); @@ -140,7 +145,7 @@ export function SiteInfoPanel({ ? (opfsMountDescriptor as any)?.device?.handle?.name : undefined; - const title = isTemporary ? 'Temporary Playground' : site.metadata.name; + const title = isTemporary ? __('Temporary Playground') : site.metadata.name; const titleWords = title.split(' '); const titleStart = titleWords.slice(0, -1).join(' '); const titleEnd = titleWords[titleWords.length - 1]; @@ -172,7 +177,7 @@ export function SiteInfoPanel({ ) : ( @@ -304,7 +315,7 @@ export function SiteInfoPanel({ disabled={!playground} onClick={() => navigateTo('/wp-admin/')} > - WP Admin + {__('WP Admin')} @@ -313,7 +324,7 @@ export function SiteInfoPanel({ disabled={!playground} onClick={() => navigateTo('/')} > - Homepage + {__('Homepage')} @@ -321,7 +332,7 @@ export function SiteInfoPanel({ removeSiteAndCloseMenu( @@ -339,7 +352,7 @@ export function SiteInfoPanel({ ) } > - Delete + {__('Delete')} )} @@ -380,10 +393,12 @@ export function SiteInfoPanel({ }} icon={external} iconPosition="right" - aria-label="View Blueprint" + aria-label={__( + 'View Blueprint' + )} disabled={offline} > - View Blueprint + {__('View Blueprint')} @@ -406,15 +421,15 @@ export function SiteInfoPanel({ tabs={[ { name: 'settings', - title: 'Settings', + title: __('Settings'), }, { name: 'files', - title: 'File browser', + title: __('File browser'), }, { name: 'logs', - title: 'Logs', + title: __('Logs'), }, ]} > @@ -455,7 +470,7 @@ export function SiteInfoPanel({ - Loading file browser... + {__('Loading file browser...')}
} > diff --git a/packages/playground/website/src/components/site-manager/site-persist-button/index.tsx b/packages/playground/website/src/components/site-manager/site-persist-button/index.tsx index 9e460b467f..7d58f66703 100644 --- a/packages/playground/website/src/components/site-manager/site-persist-button/index.tsx +++ b/packages/playground/website/src/components/site-manager/site-persist-button/index.tsx @@ -5,6 +5,7 @@ import type { SiteStorageType } from '../../../lib/state/redux/slice-sites'; import { setActiveModal } from '../../../lib/state/redux/slice-ui'; import { modalSlugs } from '../../layout'; import React from 'react'; +import { useI18n } from '../../../lib/i18n'; export function SitePersistButton({ siteSlug, @@ -14,6 +15,7 @@ export function SitePersistButton({ children: React.ReactNode; storage?: Extract | null; }) { + const { __ } = useI18n(); const clientInfo = useAppSelector((state) => selectClientInfoBySiteSlug(state, siteSlug) ); @@ -30,7 +32,7 @@ export function SitePersistButton({ {button} {clientInfo?.opfsSync?.status === 'error' && (
- There has been an error. Please try again. + {__('There has been an error. Please try again.')}
)} diff --git a/packages/playground/website/src/lib/i18n/locales/es.json b/packages/playground/website/src/lib/i18n/locales/es.json index b14be65978..72244e726a 100644 --- a/packages/playground/website/src/lib/i18n/locales/es.json +++ b/packages/playground/website/src/lib/i18n/locales/es.json @@ -118,6 +118,12 @@ "This is a temporary Playground. Your changes will be lost on page refresh.": [ "Este es un Playground temporal. Sus cambios se perderán al actualizar la página." ], + "This is a temporary Playground.": [ + "Este es un Playground temporal." + ], + "Your changes will be lost on page refresh.": [ + "Sus cambios se perderán al actualizar la página." + ], "Temporary Playground": ["Playground Temporal"], "Blueprints Gallery": ["Galería de Blueprints"], "Saved Playgrounds": ["Playgrounds Guardados"], @@ -293,7 +299,18 @@ ], "There has been an error. Please try again.": [ "Ha ocurrido un error. Por favor, inténtelo de nuevo." - ] + ], + "WordPress Version is required": [ + "La versión de WordPress es obligatoria" + ], + "WordPress Version": ["Versión de WordPress"], + "-- Select a version --": ["-- Seleccione una versión --"], + "Need an older version?": ["¿Necesita una versión anterior?"], + "PHP version is required": ["La versión de PHP es obligatoria"], + "PHP Version": ["Versión de PHP"], + "Language": ["Idioma"], + "Allow network access": ["Permitir acceso a la red"], + "Create a multisite network": ["Crear una red multisite"] } } } diff --git a/packages/playground/website/src/lib/i18n/locales/pt-br.json b/packages/playground/website/src/lib/i18n/locales/pt-br.json index 9e07ee89c8..5dc850a3d3 100644 --- a/packages/playground/website/src/lib/i18n/locales/pt-br.json +++ b/packages/playground/website/src/lib/i18n/locales/pt-br.json @@ -112,6 +112,12 @@ "This is a temporary Playground. Your changes will be lost on page refresh.": [ "Este é um Playground temporário. Suas alterações serão perdidas ao atualizar a página." ], + "This is a temporary Playground.": [ + "Este é um Playground temporário." + ], + "Your changes will be lost on page refresh.": [ + "Suas alterações serão perdidas ao atualizar a página." + ], "Temporary Playground": ["Playground Temporário"], "Blueprints Gallery": ["Galeria de Blueprints"], "Saved Playgrounds": ["Playgrounds Salvos"], @@ -285,7 +291,18 @@ ], "There has been an error. Please try again.": [ "Ocorreu um erro. Por favor, tente novamente." - ] + ], + "WordPress Version is required": [ + "A versão do WordPress é obrigatória" + ], + "WordPress Version": ["Versão do WordPress"], + "-- Select a version --": ["-- Selecione uma versão --"], + "Need an older version?": ["Precisa de uma versão mais antiga?"], + "PHP version is required": ["A versão do PHP é obrigatória"], + "PHP Version": ["Versão do PHP"], + "Language": ["Idioma"], + "Allow network access": ["Permitir acesso à rede"], + "Create a multisite network": ["Criar uma rede multisite"] } } } From e3079414999ffcde4ee299a3d2fc784b06dae7c3 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 18:35:08 +0000 Subject: [PATCH 27/33] adding space to the text --- .../src/components/site-manager/temporary-site-notice/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/playground/website/src/components/site-manager/temporary-site-notice/index.tsx b/packages/playground/website/src/components/site-manager/temporary-site-notice/index.tsx index 4c9e6cc82e..356094c28b 100644 --- a/packages/playground/website/src/components/site-manager/temporary-site-notice/index.tsx +++ b/packages/playground/website/src/components/site-manager/temporary-site-notice/index.tsx @@ -33,7 +33,7 @@ export function TemporarySiteNotice({ > - {__('This is a temporary Playground.')} + {__('This is a temporary Playground.')}{' '} {__('Your changes will be lost on page refresh.')} From 0b5b569d6b912422fbafc96f3e54452b2e905fd2 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 18:35:27 +0000 Subject: [PATCH 28/33] adding localization to the address bar --- .../playground/website/src/components/address-bar/index.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/playground/website/src/components/address-bar/index.tsx b/packages/playground/website/src/components/address-bar/index.tsx index 01d1d56181..2476019979 100644 --- a/packages/playground/website/src/components/address-bar/index.tsx +++ b/packages/playground/website/src/components/address-bar/index.tsx @@ -1,11 +1,13 @@ import React, { useCallback } from 'react'; import css from './style.module.css'; +import { useI18n } from '../../lib/i18n'; interface AddressBarProps { url?: string; onUpdate?: (url: string) => void; } export default function AddressBar({ url, onUpdate }: AddressBarProps) { + const { __ } = useI18n(); const input = React.useRef(null); const [value, setValue] = React.useState(url || ''); const [isFocused, setIsFocused] = React.useState(false); @@ -38,7 +40,9 @@ export default function AddressBar({ url, onUpdate }: AddressBarProps) { onBlur={() => setIsFocused(false)} name="url" type="text" - aria-label='URL to visit in the WordPress site, like"/wp-admin"' + aria-label={__( + 'URL to visit in the WordPress site, like"/wp-admin"' + )} autoComplete="off" /> From 7bff596423f842f16fc9eac37a526e210aa0f3d3 Mon Sep 17 00:00:00 2001 From: Fellyph Cintra Date: Sun, 26 Oct 2025 18:35:58 +0000 Subject: [PATCH 29/33] Adding localization to playground components --- .../components/error-report-modal/index.tsx | 42 +++++++----- .../components/import-form-modal/index.tsx | 15 +++-- .../src/components/log-modal/index.tsx | 18 +++-- .../components/playground-viewport/index.tsx | 67 ++++++++++++------- .../components/site-manager/sidebar/index.tsx | 45 ++++++++----- 5 files changed, 117 insertions(+), 70 deletions(-) diff --git a/packages/playground/website/src/components/error-report-modal/index.tsx b/packages/playground/website/src/components/error-report-modal/index.tsx index 4b56e7cef6..4d9d6a9f5a 100644 --- a/packages/playground/website/src/components/error-report-modal/index.tsx +++ b/packages/playground/website/src/components/error-report-modal/index.tsx @@ -11,8 +11,10 @@ import { useAppSelector } from '../../lib/state/redux/store'; import { setActiveModal } from '../../lib/state/redux/slice-ui'; import { Modal } from '../../components/modal'; import ModalButtons from '../modal/modal-buttons'; +import { useI18n } from '../../lib/i18n'; export function ErrorReportModal(props: { blueprint: BlueprintV1Declaration }) { + const { __ } = useI18n(); const activeModal = useAppSelector( (state: PlaygroundReduxState) => state.ui.activeModal ); @@ -97,11 +99,11 @@ export function ErrorReportModal(props: { blueprint: BlueprintV1Declaration }) { function getTitle() { if (!submitted) { - return 'Report error'; + return __('Report error'); } else if (submitError) { - return 'Failed to report the error'; + return __('Failed to report the error'); } else { - return 'Thank you for reporting the error'; + return __('Thank you for reporting the error'); } } @@ -109,36 +111,38 @@ export function ErrorReportModal(props: { blueprint: BlueprintV1Declaration }) { if (!submitted) { return ( <> - Playground crashed because of an error. You can help resolve - the issue by sharing the error details with us. + {__( + 'Playground crashed because of an error. You can help resolve the issue by sharing the error details with us.' + )} ); } else if (submitError) { return ( <> - We were unable to submit the error report. Please try again - or open an{' '} + {__( + 'We were unable to submit the error report. Please try again or open an ' + )} - issue on GitHub. + {__('issue on GitHub.')} ); } else { return ( <> - Your report has been submitted to the{' '} + {__('Your report has been submitted to the ')} - Making WordPress #playground-logs Slack channel - {' '} - and will be reviewed by the team. + {__('Making WordPress #playground-logs Slack channel')} + + {__(' and will be reviewed by the team.')} ); } @@ -160,19 +164,25 @@ export function ErrorReportModal(props: { blueprint: BlueprintV1Declaration }) { {showForm() && ( <> - + { + const { __ } = useI18n(); const playground = usePlaygroundClient(); const dispatch: PlaygroundDispatch = useDispatch(); @@ -16,7 +18,9 @@ export const ImportFormModal = () => { function handleImported() { // eslint-disable-next-line no-alert alert( - 'File imported! This Playground instance has been updated. Refreshing now.' + __( + 'File imported! This Playground instance has been updated. Refreshing now.' + ) ); closeModal(); playground!.goTo('/'); @@ -24,11 +28,10 @@ export const ImportFormModal = () => { return ( state.ui.activeModal ); @@ -23,7 +25,7 @@ export function LogModal(props: { description?: JSX.Element; title?: string }) { } return ( - +
{props.description}
@@ -31,6 +33,7 @@ export function LogModal(props: { description?: JSX.Element; title?: string }) { } export function SiteLogs({ className }: { className?: string }) { + const { __ } = useI18n(); const [logs, setLogs] = useState([]); const [searchTerm, setSearchTerm] = useState(''); @@ -67,8 +70,8 @@ export function SiteLogs({ className }: { className?: string }) {
{logs.length > 0 ? ( {logList()} ) : logs.length > 0 ? (
- No matching logs found. + {__('No matching logs found.')}
) : (
- Error logs for Playground, WordPress, and PHP will show - up here when something goes wrong. + {__( + 'Error logs for Playground, WordPress, and PHP will show up here when something goes wrong.' + )}

- No problems so far – yay! 🎉 + {__('No problems so far – yay! 🎉')}
)}
diff --git a/packages/playground/website/src/components/playground-viewport/index.tsx b/packages/playground/website/src/components/playground-viewport/index.tsx index 8d3eabca10..c5105eb904 100644 --- a/packages/playground/website/src/components/playground-viewport/index.tsx +++ b/packages/playground/website/src/components/playground-viewport/index.tsx @@ -19,6 +19,7 @@ import { selectTemporarySites, } from '../../lib/state/redux/slice-sites'; import classNames from 'classnames'; +import { useI18n } from '../../lib/i18n'; export const supportedDisplayModes = [ 'browser-full-screen', @@ -108,6 +109,8 @@ export const KeepAliveTemporarySitesViewport = () => { * We're talking about maybe a 100 empty divs in an extreme scenario. That's nothing. */ const [slugsSeenSoFar, setSlugsSeenSoFar] = useState([]); + const { __ } = useI18n(); + useEffect(() => { setSlugsSeenSoFar((prev) => [ ...prev, @@ -144,8 +147,9 @@ export const KeepAliveTemporarySitesViewport = () => { >

No site is selected

- Select a site from the site manager to explore - Playground. + {__( + 'Select a site from the site manager to explore WordPress Playground.' + )}

@@ -176,6 +180,7 @@ export const JustViewport = function JustViewport({ const site = useAppSelector((state) => selectSiteBySlug(state, siteSlug))!; const dispatch = useAppDispatch(); + const { __ } = useI18n(); const runtimeConfigString = JSON.stringify( site.metadata.runtimeConfiguration ); @@ -214,7 +219,9 @@ export const JustViewport = function JustViewport({ return (