diff --git a/.gitignore b/.gitignore index 46763dacca..3688e83941 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ node_modules node_modules/ dist/ .vercel + diff --git a/.typesafe-i18n.json b/.typesafe-i18n.json new file mode 100644 index 0000000000..2c1c56efbc --- /dev/null +++ b/.typesafe-i18n.json @@ -0,0 +1,4 @@ +{ + "adapter": "svelte", + "$schema": "https://unpkg.com/typesafe-i18n@5.24.3/schema/typesafe-i18n.json" +} diff --git a/build.js b/build.js index ff5c789c62..38e56b85f3 100644 --- a/build.js +++ b/build.js @@ -1,5 +1,7 @@ import { fileURLToPath } from 'url'; import { build, loadEnv } from 'vite'; +import { execSync } from 'child_process'; + import kleur from 'kleur'; const { bold, yellow } = kleur; diff --git a/package-lock.json b/package-lock.json index 46a8434389..aa9bb64c23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,9 +16,11 @@ "dotenv": "^16.0.3", "echarts": "^5.4.1", "logrocket": "^3.0.1", + "npm-run-all": "^4.1.5", "pretty-bytes": "^6.1.0", "prismjs": "^1.29.0", "tippy.js": "^6.3.7", + "typesafe-i18n": "^5.24.3", "web-vitals": "^3.1.1" }, "devDependencies": { @@ -156,9 +158,9 @@ } }, "node_modules/@appwrite.io/pink": { - "version": "0.0.6-rc.10", - "resolved": "https://registry.npmjs.org/@appwrite.io/pink/-/pink-0.0.6-rc.10.tgz", - "integrity": "sha512-mhpgjQVfQvghItgcCzsHN0Ynn4U9JNg8HlSJ+HVDUi/bNHxmlm7XdNJE6s65LMJ6LfepROn6zZMHquANvGfNDg==", + "version": "0.0.6-rc.14", + "resolved": "https://registry.npmjs.org/@appwrite.io/pink/-/pink-0.0.6-rc.14.tgz", + "integrity": "sha512-KSfuW/MIc9aXaSjHmOB0TSyd2G/nTX8Yj49LOqOw41v649tVNfPGutvI6eTULCKve24HTYSspnHLil5Eb4Kk2Q==", "dependencies": { "@appwrite.io/pink-icons": "*", "normalize.css": "^8.0.1", @@ -2847,6 +2849,18 @@ "deep-equal": "^2.0.5" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -2874,7 +2888,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -2981,8 +2994,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/binary-extensions": { "version": "2.2.0", @@ -2997,7 +3009,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3094,7 +3105,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -3366,8 +3376,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.2", @@ -3549,7 +3558,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -3729,12 +3737,57 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "peer": true, "dependencies": { "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-get-iterator": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", @@ -3755,6 +3808,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", @@ -4299,7 +4381,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "dependencies": { "is-callable": "^1.1.3" } @@ -4340,14 +4421,29 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4385,7 +4481,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -4418,6 +4513,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -4465,6 +4575,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globalyzer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", @@ -4501,7 +4625,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -4512,8 +4635,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -4525,7 +4647,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -4537,7 +4658,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4555,7 +4675,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -4563,11 +4682,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -4579,7 +4708,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -4590,6 +4718,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -4747,7 +4880,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", @@ -4777,7 +4909,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -4790,15 +4921,12 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "peer": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, "dependencies": { "has-bigints": "^1.0.1" }, @@ -4822,7 +4950,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -4838,7 +4965,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -4850,7 +4976,6 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -4862,7 +4987,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4925,6 +5049,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4938,7 +5073,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4968,7 +5102,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -4993,7 +5126,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -5018,7 +5150,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -5033,7 +5164,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -5048,7 +5178,6 @@ "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -5072,6 +5201,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakset": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", @@ -5094,8 +5234,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isomorphic-form-data": { "version": "2.0.0", @@ -6173,6 +6312,11 @@ "node": ">=4" } }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -6250,6 +6394,40 @@ "dev": true, "peer": true }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, "node_modules/local-pkg": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", @@ -6369,6 +6547,14 @@ "tmpl": "1.0.5" } }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -6452,7 +6638,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6547,6 +6732,11 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -6599,6 +6789,25 @@ "dev": true, "peer": true }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6613,6 +6822,155 @@ "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/npm-run-all/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm-run-all/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -6636,7 +6994,6 @@ "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6661,7 +7018,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -6670,7 +7026,6 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -6848,8 +7203,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-type": { "version": "4.0.0", @@ -6893,6 +7247,25 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "engines": { + "node": ">=4" + } + }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -7270,6 +7643,30 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -7326,7 +7723,6 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -7359,7 +7755,6 @@ "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -7502,6 +7897,19 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -7621,11 +8029,18 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -7767,6 +8182,34 @@ "os-shim": "^0.1.2" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -7895,6 +8338,64 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -7979,7 +8480,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -8328,17 +8828,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, + "node_modules/typesafe-i18n": { + "version": "5.24.3", + "resolved": "https://registry.npmjs.org/typesafe-i18n/-/typesafe-i18n-5.24.3.tgz", + "integrity": "sha512-VqjGbIydOqtQjO81mGo++TjuqeC8YoxxgYrO1/ikXIS/l/Q6mAcz4yrt5AvqjdFHMt3gRm7oGbVI/yLyV+VTOg==", + "bin": { + "typesafe-i18n": "cli/typesafe-i18n.mjs" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ivanhofer" + }, + "peerDependencies": { + "typescript": ">=3.5.1" + } + }, "node_modules/typescript": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8353,6 +8880,20 @@ "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==", "dev": true }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici": { "version": "5.20.0", "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", @@ -8448,6 +8989,15 @@ "dev": true, "peer": true }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vite": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", @@ -8694,7 +9244,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -8725,7 +9274,6 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", diff --git a/package.json b/package.json index 0e7ec8d6e1..b3275036ae 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,10 @@ "node": ">=16" }, "scripts": { - "dev": "vite dev", - "build": "node build.js", + "dev": "npm-run-all --parallel dev:*", + "dev:vite": "vite dev", + "dev:i18n": "typesafe-i18n", + "build": "node build.js --parallel dev:i18n", "preview": "vite preview", "sync": "svelte-kit sync", "check": "svelte-check --tsconfig ./tsconfig.json --fail-on-warnings --threshold warning", @@ -28,9 +30,11 @@ "dotenv": "^16.0.3", "echarts": "^5.4.1", "logrocket": "^3.0.1", + "npm-run-all": "^4.1.5", "pretty-bytes": "^6.1.0", "prismjs": "^1.29.0", "tippy.js": "^6.3.7", + "typesafe-i18n": "^5.24.3", "web-vitals": "^3.1.1" }, "devDependencies": { diff --git a/src/i18n/de/de.json b/src/i18n/de/de.json new file mode 100644 index 0000000000..2c95c5892c --- /dev/null +++ b/src/i18n/de/de.json @@ -0,0 +1,1859 @@ +{ + "auth": { + "title": { + "missingRedirectUrl": "Fehlende Weiterleitungs-URL" + }, + "texts": { + "magicUrl": { + "loginFlow": "Deinem Magic URL-Login-Flow fehlt eine korrekte Weiterleitungs-URL. Bitte überprüfen Sie die", + "magicDocs": "Magische URL-Dokumente", + "sendMsg": "und sende eine Anfrage für eine neue Sitzung mit einer gültigen Umleitungs-URL." + }, + "oAuth": { + "loginFlow": "Deinem OAuth-Anmeldeablauf fehlt eine korrekte Weiterleitungs-URL. Bitte überprüfen Sie die", + "oAuthDocs": "OAuth-Dokumente", + "sendRequest": "und sende eine Anfrage für eine neue Sitzung mit einer gültigen Callback-URL." + } + } + }, + + "login": { + "title": "Anmelden", + "forms": { + "login": { + "inputs": { + "email": { + "label": "E-Mail", + "placeholder": "E-Mail" + }, + "password": { + "label": "Passwort", + "placeholder": "Passwort" + } + } + } + }, + "button": { + "submit": { + "login": "Anmelden" + } + }, + "links": { + "recovery": "Passwort vergessen", + "register": "Anmeldung" + } + }, + + "register": { + "title": "Anmeldung", + "forms": { + "register": { + "inputs": { + "name": { + "label": "Name", + "placeholder": "Ihr Name" + }, + "email": { + "label": "E-Mail", + "placeholder": "Ihr E-Mail-Adresse" + }, + "password": { + "label": "Passwort", + "placeholder": "Ihr Passwort" + }, + "terms": { + "label": "Bedingungen" + } + } + }, + "invite": { + "inputs": { + "name": { + "label": "Name", + "placeholder": "Ihr Name" + }, + "email": { + "label": "E-Mail", + "placeholder": "Ihr E-Mail-Adresse" + }, + "password": { + "label": "Passwort", + "placeholder": "Ihr Passwort" + }, + "code": { + "label": "Code", + "placeholder": "Ihr Code" + } + } + } + }, + "button": { + "submit": { + "register": "Anmeldung" + } + }, + "links": { + "login": "Anmelden" + }, + "texts": { + "registery": "Sie haben bereits ein Konto?", + "privacyPolicy": { + "phraseOne": "Mit der Registrierung bestätigen Sie, dass Sie unsere gelesen, verstanden und anerkannt haben", + "privacy": "Datenschutzerklärung", + "phraseTwo": "und akzeptiere unsere", + "generalTerm": "Allgemeine Nutzungsbedingungen" + } + } + }, + + "recover": { + "title": { + "pageHeader": "genesen", + "pageTitle": "Passwort-Wiederherstellung" + }, + "forms": { + "resetPassword": { + "inputs": { + "email": { + "label": "E-Mail", + "placeholder": "E-Mail" + }, + "password": { + "label": "Neues Kennwort", + "placeholder": "Passwort eingeben" + }, + "cnfPassword": { + "label": "Passwort bestätigen", + "placeholder": "Passwort bestätigen" + } + } + } + }, + "button": { + "submit": { + "update": "aktualisieren", + "recover": "genesen" + } + }, + "links": { + "register": "Anmeldung", + "login": "Anmelden" + } + }, + + "invite": { + "title": { + "pageHeader": "Einladung annehmen", + "invalidInvite": "Ungültige Einladung", + "invite": "einladen" + }, + "alerts": { + "warningAlert": { + "phraseOne": "Der Einladungslink ist ungültig", + "phraseTwo": "Bitten Sie den Projektinhaber, Ihnen eine neue Einladung zu senden." + }, + "successAlert": "Sie wurden eingeladen, an einem Teamprojekt auf Appwrite teilzunehmen" + }, + "button": { + "submit": { + "cancel": "stornieren", + "accept": "akzeptieren" + }, + "accept": { + "register": "Melden Sie sich bei Appwrite an" + } + }, + "texts": { + "privacyPolicy": { + "phraseOne": "Mit der Annahme der Einladung erklärst du dich damit einverstanden", + "termsAndCond": "Allgemeine Geschäftsbedingungen", + "and": "und", + "privacy": "Datenschutz und Richtlinie" + } + }, + "forms": { + "invite": { + "inputs": { + "terms": { + "label": "Bedingungen" + } + } + } + } + }, + + "console": { + "forms": { + "createOrg": { + "title": "Neue Organisation erstellen", + "inputs": { + "name": { + "label": "Name", + "placeholder": "Namen eingeben" + } + } + }, + "inputSwitch": { + "enable": "aktivieren", + "disabled": "deaktiviert" + } + }, + "button": { + "cancel": "Abbrechen", + "backToConsole": "Zurück zur Konsole", + "submit": { + "create": "Erstellen" + } + }, + "table": { + "pill": { + "orgId": "Organisations-ID" + } + }, + "account": { + "title": { + "user": "Benutzer", + "organizations": "Organisationen", + "deleteAccount": "Konto löschen" + }, + "forms": { + "updateName": { + "title": "Name", + "inputs": { + "name": { + "label": "Name", + "placeholder": "Namen eingeben" + } + } + }, + "updateEmail": { + "title": "E-Mail", + "inputs": { + "email": { + "label": "E-Mail", + "placeholder": "E-Mail-Adresse eingeben" + }, + "password": { + "label": "Passwort", + "placeholder": "Passwort eingeben" + } + } + }, + "updatePassword": { + "title": "Passwort", + "inputs": { + "oldPassword": { + "label": "Altes Passwort", + "placeholder": "Passwort eingeben" + }, + "newPassword": { + "label": "Neues Passwort", + "placeholder": "Passwort eingeben" + } + }, + "texts": { + "forgotPassword": "Passwort vergessen?", + "recoverPassword": "Stellen Sie Ihr Passwort wieder her" + } + } + }, + "button": { + "submit": { + "update": "Aktualisieren", + "cancel": "Abbrechen", + "delete": "Löschen" + }, + "logout": "Löschen", + "documentation": "Dokumentation", + "createOrg": "Organisation erstellen", + "logoutAllSessions": "Alle Sitzungen abmelden" + }, + "texts": { + "members": "Mitglieder", + "createOrg": "Eine neue Organisation erstellen", + "noSession": "Keine Sitzungen verfügbar", + "totalResult": "Gesamtergebnisse:", + "deleteWarning": "Sind Sie sicher, dass Sie Ihr Konto löschen möchten?", + "deleteAccount": " Ihr Konto wird dauerhaft gelöscht und der Zugriff auf alle Ihre Teams und Daten geht verloren. Diese Aktion ist irreversibel." + }, + "navbar": { + "header": { + "overview": "Übersicht", + "sessions": "Sitzungen", + "activity": "Aktivität", + "organization": "Organisationen" + } + }, + "table": { + "header": { + "client": "Kunde", + "location": "Standort", + "ip": "IP" + }, + "trim": { + "on": "on" + }, + "texts": { + "unknown": "unbekannt" + }, + "pill": { + "alert": { + "current": "aktuelle Sitzung" + } + } + } + }, + "onboarding": { + "title": { + "onboarding": "Onboarding", + "coverTitle": "Lass uns dein erstes Projekt erstellen" + }, + "forms": { + "createProject": { + "inputs": { + "name": { + "label": "Projektname", + "placeholder": "Erstes Appwrite-Projekt" + } + } + } + }, + "button": { + "submit": { + "create": "Projekt erstellen" + } + }, + "table": { + "pill": { + "projectId": "Projekt-ID" + } + } + }, + "organization": { + "title": { + "organizations": "Organisationen", + "projects": "Projekte", + "members": "Mitglieder" + }, + "forms": { + "updateName": { + "title": "Name", + "inputs": { + "name": { + "label": "Name", + "placeholder": "Namen eingeben" + } + } + }, + "createMember": { + "title": "Mitglied einladen", + "inputs": { + "email": { + "label": "E-Mail", + "placeholder": "E-Mail-Adresse eingeben" + }, + "name": { + "label": "Namen (optional)", + "placeholder": "Namen eingeben" + } + } + }, + "createProject": { + "title": "Projekt erstellen", + "inputs": { + "name": { + "label": "Name" + } + } + }, + "deleteOrg": { + "title": "Organisation löschen", + "texts": { + "phraseOne": "Sind Sie sicher, dass Sie löschen möchten", + "phraseTwo": "? Alle Projekte", + "phraseThree": "und mit dieser Organisation verknüpfte Daten werden gelöscht. Diese Aktion ist unwiderruflich.", + "orgSettings": "Die Organisation wird dauerhaft gelöscht, einschließlich aller mit dieser Organisation verknüpften Projekte und Daten. Diese Aktion ist irreversibel." + } + }, + "limit": { + "inputs": { + "rows": { + "label": "Zeilen pro Seite" + } + }, + "texts": { + "perPage": " pro Seite", + "totalResult": "Gesamtergebnisse:" + } + } + }, + "table": { + "header": { + "name": "Name", + "email": "E-Mail" + }, + "pill": { + "projectId": "Projekt-ID", + "pending": "Ausstehend" + } + }, + "button": { + "submit": { + "create": "Erstellen", + "createProject": "Projekt erstellen", + "send": "Einladung senden", + "update": "Aktualisieren", + "cancel": "Aktualisieren", + "delete": "Löschen" + }, + "invite": "Löschen", + "resend": "Erneut senden" + }, + "texts": { + "dropDown": "Neue Organisation", + "apps": "apps", + "no": "nein", + "members": "Mitglieder", + "createProject": "Neues Projekt erstellen" + }, + "navbar": { + "header": { + "projects": "Projekte", + "members": "Projekte", + "settings": "Einstellungen" + } + } + }, + "project": { + "title": { + "auth": "Auth", + "createUser": "Benutzer erstellen", + "createTeam": "Team erstellen", + "createDb": "Datenbank erstellen", + "createData": "Daten erstellen", + "createMembership": "Mitgliedschaft erstellen", + "createCollection": "Sammlung erstellen", + "createIndex": "Index erstellen", + "deleteUser": "Benutzer löschen", + "deleteSession": "Sitzungen löschen", + "deleteAllSession": "Alle Sitzungen löschen", + "deleteMember": "Mitglied löschen", + "deleteDatabase": "Datenbank löschen", + "deleteAttribute": "Attribut löschen", + "deleteCollection": "Sammlung löschen", + "deleteProject": "Projekt löschen", + "deleteTeam": "Team löschen", + "deleteDocument": "Dokument löschen", + "deleteIndex": "Index löschen", + "deleteDomain": "Domain löschen", + "deleteWebhook": "Webhook löschen", + "deletePlatform": "Plattform löschen", + "exitProcess": "Prozess beenden", + "expirationDate": "Ablaufdatum", + "user": "Benutzer", + "team": "Team", + "hostName": "Hostname", + "schedule": "Zeitplan", + "overview": "Übersicht", + "logs": "Protokolle", + "indexes": "Indizes", + "buckets": "Eimer", + "services": "Dienste", + "console": "Konsole", + "bandwith": "Bandbreite", + "documents": "Dokumente", + "addScopes": "Bereiche hinzufügen", + "storage": "Speicher", + "bucket": "Eimer", + "variables": "Variablen", + "timeout": "Timeout", + "scopes": "Umfänge", + "executeAccess": "Ausführungszugriff", + "customDomains": "Benutzerdefinierte Domänen", + "customPermission": "Benutzerdefinierte Berechtigung", + "documentSecurity": "Dokumentensicherheit", + "webhooks": "Webhooks", + "webhook": "Webhook", + "deployments": "Bereitstellungen", + "deleteFunction": "Funktion löschen", + "deleteBucket": "Bucket löschen", + "displayName": "Anzeigename", + "deleteFile": "Datei löschen", + "teamPref": "Teameinstellungen", + "apiCredentials": "API-Anmeldeinformationen", + "active": "Aktiv", + "inactive": "Inaktiv", + "uploadVariables": "Variablen hochladen", + "data": "Daten", + "users": "Benutzer", + "document": "Dokument", + "functions": "Funktionen", + "executions": "Ausführungen", + "integrations": "Integrationen", + "metaData": "Metadaten", + "permissions": "Berechtigungen", + "attributes": "Attribute", + "database": "Datenbank", + "databases": "Datenbanken", + "collections": "Sammlungen", + "oAuth2": "OAuth2-Einstellungen", + "regenerateKey": "Schlüssel neu generieren", + "signatureKey": "Signaturschlüssel", + "apiKey": "API-Schlüssel", + "apiKeys": "API-Schlüssel", + "createApiKey": "API-Schlüssel erstellen", + "deleteApiKey": "API-Schlüssel löschen", + "events": "Ereignisse", + "httpAuth": "HTTP-Authentifizierung", + "selectTeams": "Teams auswählen", + "selectUsers": "Benutzer auswählen", + "platforms": "Plattformen", + "packageName": "Paketname", + "bundleId": "Bundle-ID", + "userData": { + "name": "Name", + "email": "E-Mail", + "phone": "Telefon", + "password": "Passwort", + "userPref": "Benutzereinstellungen", + "deleteUser": "Benutzer löschen" + }, + "security": { + "title": "Sicherheit", + "passwordDictionary": "Passwortwörterbuch", + "passwordHistory": "Passwortverlauf", + "sessionLength": "Sitzungslänge", + "sessionLimit": "Sitzungslimit", + "usersLimit": "Benutzerlimit" + }, + "settings": { + "header": "Einstellungen", + "authMethods": "Auth-Methoden", + "oauth2Providers": "OAuth2-Anbieter" + }, + "wizards": { + "addYourDomain": "Fügen Sie Ihre Domain hinzu", + "subTitle": "Verwenden Sie Ihre eigene Domäne als Endpunkt Ihrer Appwrite-API." + }, + "overView": { + "getStartedGuid": "Erste Schritte", + "addPlatform": "Eine Plattform hinzufügen", + "integrateWithServer": "Mit Ihrem Server integrieren" + } + }, + "forms": { + "createUser": { + "inputs": { + "name": { + "label": "Name", + "placeholder": "Namen eingeben" + }, + "email": { + "label": "E-Mail", + "placeholder": "E-Mail-Adresse eingeben" + }, + "phone": { + "label": "Telefon", + "placeholder": "Telefonnummer eingeben" + }, + "password": { + "label": "Passwort", + "placeholder": "Passwort eingeben" + } + } + }, + "createTeam": { + "inputs": { + "name": { + "label": "Name", + "placeholder": "Namen eingeben" + } + } + }, + "userData": { + "update": { + "name": { + "label": "Name", + "placeholder": "Namen eingeben" + }, + "email": { + "label": "E-Mail", + "placeholder": "E-Mail-Adresse eingeben" + }, + "phone": { + "label": "Telefon", + "placeholder": "Telefonnummer eingeben" + }, + "password": { + "label": "Neues Passwort", + "placeholder": "Neues Passwort eingeben" + }, + "userPref": { + "key": { + "label": "Schlüssel", + "placeholder": "Eingabetaste" + }, + "value": { + "label": "Wert", + "placeholder": "Wert eingeben" + } + } + } + }, + "oAuthProvider": { + "inputs": { + "appleAuth": { + "bundleId": { + "label": "Bundle ID", + "placeholder": "com.company.appname" + }, + "keyId": { + "label": "Schlüssel-ID", + "placeholder": "SHAB13ROFN" + }, + "teamId": { + "label": "Team-ID", + "placeholder": "ELA2CD3AED" + }, + "p8": { + "label": "P8-Datei", + "placeholder": "" + } + }, + "auth0Auth": { + "clientId": { + "label": "Client-ID", + "placeholder": "ID eingeben" + }, + "secret": { + "label": "Client-Geheimnis", + "placeholder": "Client-Geheimnis eingeben" + }, + "domain": { + "label": "Auth0-Domäne", + "placeholder": "Ihre Auth0-Domäne" + } + }, + "githubAuth": { + "appId": { + "label": "App-ID", + "placeholder": "ID eingeben" + }, + "secret": { + "label": "App-Geheimnis", + "placeholder": "App-Geheimnis eingeben" + }, + "endpoint": { + "label": "Endpunkt(optional)", + "placeholder": "Ihr Endpunkt" + } + }, + "mainAuth": { + "appId": { + "label": "App-ID", + "placeholder": "ID eingeben" + }, + "secret": { + "label": "App-Geheimnis", + "placeholder": "App-Geheimnis eingeben" + } + }, + "microsoftAuth": { + "appId": { + "label": "Anwendungs-(Client-)ID", + "placeholder": "ID eingeben" + }, + "secret": { + "label": "Client-Geheimnis", + "placeholder": "Client-Geheimnis eingeben" + }, + "tenant": { + "label": "Zielmieter", + "placeholder": "'gemeinsam', 'Organisationen', 'Verbraucher' oder Ihre TenantID" + } + }, + "oktaAuth": { + "appId": { + "label": "Client-ID", + "placeholder": "ID eingeben" + }, + "secret": { + "label": "Client-Geheimnis", + "placeholder": "Client-Geheimnis eingeben" + }, + "domain": { + "label": "Okta Domain", + "placeholder": "dev-1337.okta.com" + }, + "serverId": { + "label": "Autorisierungsserver-ID", + "placeholder": "Standard" + } + } + } + }, + "security": { + "inputs": { + "passwordDictionary": { + "label": "Passwortwörterbuch" + }, + "passwordHistory": { + "label": "Passwortverlauf" + }, + "maxSession": { + "label": "Limit" + }, + "sessionLength": { + "label": "Länge" + }, + "sessionPeriod": { + "label": "Zeitraum" + } + } + }, + "teams": { + "updatePrefs": { + "inputs": { + "key": { + "label": "Schlüssel", + "placeholder": "Eingabetaste" + }, + "value": { + "label": "Eingabetaste", + "placeholder": "Wert eingeben" + } + } + }, + "updateName": { + "title": "Name", + "inputs": { + "name": { + "label": "Name", + "placeholder": "Teamnamen eingeben" + } + } + }, + "createMembership": { + "inputs": { + "name": { + "label": "Namen (optional)", + "placeholder": "Namen eingeben" + }, + "email": { + "label": "E-Mail", + "placeholder": "E-Mail-Adresse eingeben" + }, + "roles": { + "label": "Rollen", + "placeholder": "Rollen hinzufügen" + } + } + } + }, + "databases": { + "createDb": { + "inputs": { + "name": { + "label": "Name", + "placeholder": "Datenbanknamen eingeben" + } + } + }, + "createCollection": { + "inputs": { + "name": { + "label": "Name", + "placeholder": "Sammlungsnamen eingeben" + } + } + }, + "updateName": { + "title": "Name", + "inputs": { + "name": { + "label": "Name", + "placeholder": "Datenbanknamen eingeben", + "defaultPlaceholder": "Namen eingeben" + } + } + }, + "createAttribute": { + "texts": { + "createAttribute": "Zulässige Zeichen: alphanumerisch, Bindestrich, nicht führender Unterstrich, Punkt" + }, + "inputs": { + "key": { + "label": "Attributschlüssel", + "placeholder": "Eingabetaste" + } + } + }, + "attribute": { + "texts": { + "phraseOne": "Geben Sie an, ob dies ein erforderliches Attribut ist", + "phraseTwo": "Geben Sie an, ob dieses Attribut als Array fungieren soll", + "relationship": { + "oneWay": { + "phraseOne": "Einseitige Beziehung", + "phraseTwo": "Ein Beziehungsattribut innerhalb dieser Sammlung" + }, + "twoWay": { + "phraseOne": "Zwei-Wege-Beziehung", + "phraseTwo": "Ein Beziehungsattribut innerhalb dieser Sammlung und ein weiteres innerhalb der zugehörigen Sammlung" + } + } + }, + "inputs": { + "default": { + "label": "Standardwert", + "placeholder": "Wählen Sie einen Wert aus" + }, + "defaultValue": { + "label": "Standardwert", + "placeholder": "Wert eingeben" + }, + "elements": { + "label": "Elemente", + "placeholder": "Hier Elemente hinzufügen" + }, + "required": { + "label": "Erforderlich" + }, + "array": { + "label": "Array" + }, + "key": { + "label": "Attributschlüssel", + "placeholder": "Eingabetaste" + }, + "min": { + "label": "Min", + "placeholder": "Größe eingeben" + }, + "max": { + "label": "Max", + "placeholder": "Enter size" + }, + "related": { + "label": "Verwandte Sammlung", + "placeholder": "Verwandte Sammlung" + }, + "keyRelated": { + "label": "Attributschlüssel (zugehörige Sammlung)", + "placeholder": "Eingabetaste" + }, + "relationship": { + "label": "Beziehung", + "placeholder": "Wählen Sie eine Beziehung aus" + }, + "deleting": { + "label": "Beim Löschen eines Dokuments", + "placeholder": "Wählen Sie eine Löschmethode aus" + }, + "size": { + "label": "größe", + "placeholder": "Größe eingeben" + }, + "string": { + "label": "Etikettengröße", + "placeholder": "Zeichenfolge eingeben" + }, + "email": { + "placeholder": "URL eingeben" + } + } + }, + "index": { + "inputs": { + "key": { + "label": "Indexschlüssel", + "placeholder": "Eingabetaste" + }, + "type": { + "label": "Indextyp", + "placeholder": "Typ auswählen" + }, + "attribute": { + "label": "Attribut", + "placeholder": "Attribut auswählen" + }, + "order": { + "label": "Bestellung" + }, + "id": { + "label": "Dokument-ID", + "placeholder": "Dokument-ID" + } + }, + "options": { + "title": { + "selectAttribute": "Attribut auswählen", + "selectOrder": "Bestellung auswählen" + }, + "label": { + "id": "$id", + "createdAt": "$createdAt", + "updatedAt": "$updatedAt", + "asc": "ASC", + "desc": "DESC" + } + } + }, + "settings": { + "inputs": { + "docSecurity": { + "label": "Dokumentensicherheit" + } + } + } + }, + "settings": { + "default": { + "inputs": { + "projectId": { + "label": "Projekt-ID" + }, + "apiEndPoint": { + "label": "API-Endpunkt" + } + } + }, + "updateName": { + "title": "Name", + "inputs": { + "name": { + "label": "Name", + "placeholder": "Datenbanknamen eingeben", + "defaultPlaceholder": "Namen eingeben" + } + }, + "texts": { + "chooseWebhook": "Wählen Sie einen beliebigen Namen, der Ihnen bei der Unterscheidung zwischen Webhooks hilft." + } + }, + "domain": { + "inputs": { + "domain": { + "label": "Benutzerdefinierte Domäne", + "placeholder": "appwrite.example.com" + } + } + }, + "webhooks": { + "texts": { + "stepOne": "Verwenden Sie Webhooks, um Integrationen zu erstellen, die bestimmte Ereignisse auf Appwrite abonnieren. Appwrite sendet eine HTTP-POST-Nutzlast an die konfigurierte URL des Webhooks, wenn eines der angegebenen Ereignisse ausgelöst wird.", + "events": "Legen Sie die Ereignisse fest, die Ihre Funktion auslösen. Maximal 100 Ereignisse zulässig.", + "addEvent": "Fügen Sie ein Ereignis hinzu, um loszulegen", + "selectEvent": "Wählen Sie Ereignisse in Ihrem Appwrite-Projekt aus, die Ihren Webhook auslösen.", + "learnMore": "Erfahren Sie mehr über Appwrite-Events", + "learnMoreWarning": "Weitere Informationen", + "untrustedCertificate": "Nicht vertrauenswürdige oder selbstsignierte Zertifikate sind möglicherweise nicht sicher.", + "security": "Legen Sie einen optionalen Benutzernamen und ein Passwort für die einfache HTTP-Authentifizierung fest, um Ihren Endpunkt vor unbefugtem Zugriff zu schützen.", + "secureEndpoints": "Verwenden Sie diese Option, um Ihren Endpunkt vor nicht vertrauenswürdigen Quellen zu schützen." + }, + "inputs": { + "name": { + "label": "Name", + "defaultPlaceholder": "Namen eingeben" + }, + "url": { + "label": "POST URL" + }, + "user": { + "label": "Benutzer", + "placeholder": "Benutzernamen eingeben" + }, + "password": { + "label": "Passwort", + "placeholder": "Passwort eingeben" + } + } + } + }, + "overview": { + "title": { + "name": "Name", + "coding": "Lass uns mit dem Codieren beginnen", + "initSdk": "Initiieren Sie Ihr SDK", + "getSdk": "Holen Sie sich das SDK", + "selfHosted": "Für selbstgehostete Lösungen", + "register": { + "android": "Registrieren Sie Ihre Android-App", + "apple": "Registrieren Sie Ihre Apple-App", + "flutter": "Registrieren Sie Ihre Flutter-App", + "web": "Registrieren Sie Ihre Web-App" + } + }, + "inputs": { + "name": { + "label": "Name", + "placeholder": "API-Schlüsselname", + "defaultPlaceholder": "Namen eingeben" + }, + "androidPlatformName": { + "label": "Name", + "placeholder": "Meine Android-App" + }, + "androidPlatformKey": { + "label": "Paketname", + "tooltip": "Ihr Paketname ist im Allgemeinen die Anwendungs-ID in Ihrer build.gradle-Datei auf App-Ebene." + }, + "applePlatformName": { + "label": "Name", + "placeholder": "Meine Apple App" + }, + "appleHostname": { + "label": "Bundle-ID", + "tooltip": "Sie finden Ihre Bundle-ID auf der Registerkarte 'Allgemein' für das primäre Ziel Ihrer App in Xcode." + }, + "webAppname": { + "label": "Name", + "placeholder": "Meine Web-App" + }, + "webHostName": { + "label": "Hostname", + "tooltip": "Der Hostname, den Ihre Website für die Interaktion mit den Appwrite-APIs in Produktions- oder Entwicklungsumgebungen verwendet. Kein Protokoll oder Portnummer erforderlich." + } + }, + "texts": { + "initSdk": " Nachdem Sie das SDK heruntergeladen haben, ist es an der Zeit, es zu initialisieren. Verwenden Sie Ihre Projekt-ID, die Sie auf der Seite mit den Projekteinstellungen finden.", + "apiCall": "Bevor Sie API-Aufrufe an Ihr neues Appwrite-Projekt senden, stellen Sie sicher, dass Ihr Gerät oder Emulator Netzwerkzugriff auf den Hostnamen oder die IP-Adresse Ihres Appwrite-Projekts hat.", + "alert": "Wenn Sie von einem Emulator oder einem mobilen Gerät aus eine Verbindung zu einem lokal gehosteten Appwrite-Projekt herstellen, sollten Sie die private IP des Geräts, auf dem Ihr Appwrite-Projekt ausgeführt wird, als Hostnamen des Endpunkts anstelle von 'localhost' verwenden. Sie können auch einen Dienst verwenden wie ngrok als Proxy für den Appwrite-Server.", + "android": { + "first": "Fügen Sie dies zunächst zu Ihrer build.gradle-Datei auf Stammebene hinzu:", + "second": "Und fügen Sie dies zur build.gradle-Datei Ihres Projekts hinzu:" + }, + "selectFile": "Datei auswählen", + "addPackages": "Pakete hinzufügen", + "searchAppwrite": "Suchen Sie mit der URL nach dem Appwrite SDK", + "selectTargetProject": "Wählen Sie im rechten Bereich Ihr Zielprojekt aus und fügen Sie die gewünschten Versionsregeln hinzu", + "selectAndAddPackage": "Wählen Sie 'Paket hinzufügen' und warten Sie, bis die Paketauflösung abgeschlossen ist", + "productCheck": "Stellen Sie sicher, dass das Appwrite-Paketprodukt aktiviert ist und wählen Sie erneut Paket hinzufügen", + "addToSwift": "Fügen Sie dies zu Ihrer Package.swift-Datei hinzu:", + "addDependency": "Fügen Sie dann die Abhängigkeit zu Ihrem Ziel hinzu:", + "addProjectFlutter": "Appwrite SDK zur pubspec.yaml-Datei Ihres Pakets hinzufügen. Ein Beispiel können Sie hier ansehen.", + "installDartPackage": "Sie können das SDK auch mit dem Dart-Paketmanager von Ihrem Terminal aus installieren:", + "chooseMethod": "Wählen Sie Ihre bevorzugte Installationsmethode", + "use": "Verwenden", + "cmdLine": "Fügen Sie über Ihre Befehlszeile Appwrite SDK zu Ihrem Projekt hinzu.", + "note": { + "phraseOne": "Wenn Sie einen Bundler verwenden (wie", + "or": "oder", + "phraseTwo": "), importieren Sie das Appwrite-Modul, wenn Sie es benötigen:" + }, + "installWithCdn": "Um mit einem CDN (Content Delivery Network) zu installieren, fügen Sie die folgenden Skripte am Ende Ihres Tags hinzu, aber bevor Sie Appwrite-Dienste verwenden:", + "wildcard": "Die Verwendung von Wildcard-Hostnamen in der Produktion kann unsicher werden. Lesen Sie mehr darüber", + "moreInfo": "für weitere Informationen." + } + }, + "functions": { + "title": { + "executeFunction": "Funktion ausführen", + "deleteDeployment": "Bereitstellung löschen", + "createDeployment": "Bereitstellung erstellen", + "activeDeployment": "Bereitstellung aktivieren", + "commingSoon": "Bald verfügbar!", + "easyDeployments": "Mit unserer kommenden Git-Integration wird das Erstellen von Bereitstellungen einfacher denn je. Richten Sie einfach ein Repository ein und wir erledigen den Rest.", + "deploymentBuild": "Diese Bereitstellung wird aktiviert, nachdem der Build abgeschlossen ist.", + "name": "Name" + }, + "inputs": { + "key": { + "label": "Schlüssel", + "placeholder": "Eingabetaste" + }, + "value": { + "label": "Wert", + "placeholder": "Wert eingeben" + }, + "name": { + "label": "Name", + "placeholder": "Funktionsname", + "defaultPlaceholder": "Namen eingeben" + }, + "runtime": { + "label": "Laufzeit", + "placeholder": "Laufzeit auswählen" + }, + "data": { + "label": "Benutzerdefinierte Daten (optional)" + }, + "json": { + "label": "Beispiel JSON anzeigen" + }, + "entryPoint": { + "label": "Einstiegspunkt" + }, + "activeDeployment": { + "label": "Bereitstellung nach Build aktivieren" + } + }, + "texts": { + "customDataExample": "Hier ist ein Beispiel für einige benutzerdefinierte Daten.", + "deleteDeployment": "Sind Sie sicher, dass Sie diese Bereitstellung löschen möchten?", + "deployFunction": "Sie können Ihre Funktion über die Appwrite-CLI mit Unix, CMD oder PowerShell bereitstellen. Schauen Sie sich unsere Dokumentation an, um mehr darüber zu erfahren", + "deployYourFunction": "Ihre Funktionen bereitstellen", + "installAndUse": "oder wie man installiert und verwendet", + "activateWarning": "Sind Sie sicher, dass Sie diese Bereitstellung aktivieren möchten?" + } + }, + "storage": { + "title": { + "createBucket": "Bucket erstellen", + "createFile": "Datei erstellen", + "maximumSize": "Maximale Dateigröße", + "fileSecurity": "Dateisicherheit", + "name": "Name", + "securitySettings": "Sicherheitseinstellungen", + "compression": "Komprimierung", + "fileExtensions": "Dateierweiterungen" + }, + "inputs": { + "name": { + "label": "Name", + "placeholder": "Neuer Bucket", + "defaultPlaceholder": "Namen eingeben" + }, + "size": { + "label": "Etikettengröße" + }, + "security": { + "label": "Dateisicherheit" + }, + "algorithm": { + "lable": "Algorithmus" + }, + "extensions": { + "lable": "Erlaubte Erweiterungen", + "placeholder": "Erlaubte Dateierweiterungen (mp4, jpg, pdf usw.)" + } + }, + "texts": { + "setMaxBucketSize": "Legen Sie die maximal zulässige Dateigröße im Bucket fest.", + "created": "Erstellt:", + "lastUpdated": "Letzte Aktualisierung:", + "enableFileSecurity": "Wenn die Dateisicherheit aktiviert ist, können Benutzer auf Dateien zugreifen, für die sie gewährt wurden", + "fileAndBucketPermission": "entweder Datei- oder Bucket-Berechtigungen", + "fileDisabled": "Wenn die Dateisicherheit deaktiviert ist, können Benutzer auf Dateien zugreifen", + "onlyBucketPermission": "nur wenn sie über Bucket-Berechtigungen verfügen", + "ignorePermission": "Dateiberechtigungen werden ignoriert.", + "enableDisableSecurityService": "Sicherheitsdienste für den Bucket aktivieren oder deaktivieren, einschließlich", + "encruption": "Verschlüsselung", + "and": "und", + "antivirusScanning": "Antivirus-Scanning.", + "antivirus": "Antivirus", + "configureEncruption": "Mit diesem Parameter können Sie konfigurieren, ob die Dateien im Bucket verschlüsselt werden oder nicht. Wir verschlüsseln keine Dateien, die größer als 20 MB sind.", + "configureAntivirus": "Mit diesem Parameter können Sie konfigurieren, ob die Dateien im Bucket vom Appwrite Antivirus-Scanner gescannt werden sollen oder nicht.", + "chooseCompressionAlgo": "Wählen Sie einen Algorithmus für die Komprimierung. Bei Dateien, die größer als 20 MB sind, wird die Komprimierung übersprungen, auch wenn sie aktiviert ist.", + "allowedFileExtensions": "Zulässige Dateierweiterungen. Es können maximal 100 Dateierweiterungen hinzugefügt werden. Lassen Sie das Feld leer, um alle Dateitypen zuzulassen." + } + }, + "components": { + "inputs": { + "team": { + "placeholder": "Suche nach Name oder ID" + }, + "user": { + "placeholder": "Suche nach Name, E-Mail, Telefon oder ID" + } + } + } + }, + "texts": { + "emptySearch": { + "phraseOne": "Leider konnten wir nichts finden", + "phraseTwo": "Es gibt keine Benutzer, die Ihrer Suche entsprechen." + }, + "oAuthProvider": { + "uri": "URI", + "textOne": "Zu verwenden", + "phraseOne": "Authentifizierung in Ihrer Bewerbung, füllen Sie zunächst dieses Formular aus. Weitere Informationen erhalten Sie" + }, + "security": { + "passwordDictionary": "Durch die Aktivierung dieser Option wird verhindert, dass Benutzer unsichere Passwörter festlegen, indem das Passwort des Benutzers mit dem Passwort verglichen wird", + "passwordHistory": { + "phraseOne": "Die Aktivierung dieser Option verhindert, dass Benutzer aktuelle Passwörter wiederverwenden, indem das neue Passwort mit ihrem Passwortverlauf verglichen wird.", + "phraseTwo": "Legen Sie die maximale Anzahl der pro Benutzer gespeicherten Passwörter fest. Maximal 20 Passwörter." + }, + "sessionLength": "Wenn Sie das Limit reduzieren, werden aktuell angemeldete Benutzer von der Anwendung abgemeldet.", + "sessionLimit": "Maximal zulässige Anzahl aktiver Sitzungen pro Benutzer.", + "usersLimit": "Beschränken Sie die Anmeldung neuer Benutzer für Ihr Projekt, unabhängig von der Authentifizierungsmethode. Sie scannen weiterhin Benutzer und Teammitgliedschaften über Ihre Appwrite-Konsole.", + "limited": "limitiert", + "unlimited": "unbegrenzt" + }, + "settings": "Aktivieren Sie die Authentifizierungsmethoden, die Sie verwenden möchten.", + "teams": { + "members": "Mitglieder", + "searchData": { + "phaseOne": "Leider konnten wir nichts finden", + "phaseTwo": "Es gibt keine Teams, die Ihrer Suche entsprechen.", + "phaseThree": "Es gibt keine Mitglieder, die Ihrer Suche entsprechen." + }, + "updatePrefs": "Sie können die Einstellungen Ihres Teams aktualisieren, indem Sie gemeinsame Informationen zu den Objekten des Teams speichern, sodass sie problemlos von allen Mitgliedern geteilt werden können.", + "deleteTeam": "Sind Sie sicher, dass Sie löschen möchten", + "deleteMember": "Sind Sie sicher, dass Sie löschen möchten", + "from": "von", + "dangerZone": " Das Team wird dauerhaft gelöscht, einschließlich aller mit diesem Team verknüpften Daten. Diese Aktion ist irreversibel.", + "createdOn": "Erstellt am" + }, + + "databases": { + "newDb": "Eine neue Datenbank erstellen", + "delete": "Sind Sie sicher, dass Sie löschen möchten", + "docFrom": "das Dokument von", + "created": "Erstellt:", + "lastUpdated": "Letzte Aktualisierung:", + "settings": "Die Datenbank wird dauerhaft gelöscht, einschließlich aller mit diesem Team verknüpften Daten. Diese Aktion ist irreversibel.", + "createAttribute": { + "heading": "Erstellen Sie Ihr erstes Attribut, um loszulegen.", + "note": "Brauchen Sie Hilfe? Erfahren Sie mehr in unserer Dokumentation." + }, + "totalResult": "Gesamtergebnisse:", + "from": "von", + "twoWayRelationship": "Dies ist eine zweiseitige Beziehung und die entsprechende Beziehung wird ebenfalls gelöscht.", + "irreversibleAction": "Diese Aktion ist irreversibel.", + "deleteRelation": "Beziehung zwischen löschen", + "deleteDocFrom": "Dokument löschen aus", + "to": "zu", + "documentsPage": { + "para": { + "phraseOne": "Lese- oder Schreibberechtigungen zuweisen", + "collectionLevel": "Sammlungsebene", + "or": "oder", + "documentLevel": "Dokumentebene", + "phraseTwo": "Wenn Berechtigungen auf Sammlungsebene zugewiesen sind, werden auf einzelne Dokumente angewendete Berechtigungen ignoriert." + } + }, + "deleteDocWarning": "Das Dokument wird dauerhaft gelöscht, einschließlich aller darin enthaltenen Daten. Diese Aktion ist irreversibel.", + "updateDocument": "Dokumentdaten basierend auf den zuvor erstellten Attributen aktualisieren.", + "deleteCollection": "Die Sammlung wird dauerhaft gelöscht, einschließlich aller darin enthaltenen Dokumente. Diese Aktion ist irreversibel.", + "displayName": "Legen Sie Zeichenfolgenattribute mit maximal 50 Zeichen fest, die als Anzeigename in der Appwrite-Konsole verwendet werden sollen. Maximal 5 Namen.", + "updatePermission": { + "collectionAndDocumentation": "Wählen Sie aus, wer auf Ihre Sammlung und Dokumente zugreifen kann. Weitere Informationen finden Sie im", + "permissionGuide": "Berechtigungshandbuch" + }, + "updateSecurity": { + "phraseOne": "Wenn die Dokumentensicherheit aktiviert ist, können Benutzer auf Dokumente zugreifen, für die sie gewährt wurden", + "eitherDocOrCollection": "entweder Dokument- oder Sammlungsberechtigungen", + "collectionPermission": "nur wenn sie Sammlungsberechtigungen haben", + "documentPermission": "Dokumentberechtigungen werden ignoriert." + }, + "wizards": { + "stepOne": "Stellen Sie Dokumentdaten basierend auf den zuvor erstellten Attributen bereit." + } + }, + "users": { + "updatePrefs": "Sie können Ihre Benutzereinstellungen aktualisieren, indem Sie Informationen zu den Objekten des Benutzers speichern, sodass diese problemlos über Geräte und Sitzungen hinweg geteilt werden können.", + "updatePassword": { + "phaseOne": "Geben Sie ein neues Passwort ein. Ein Passwort muss enthalten", + "phaseTwo": "mindestens 8 Zeichen." + }, + "noMembership": "Keine Mitgliedschaften verfügbar", + "noSessions": "Keine Sitzungen verfügbar", + "deleteUser": { + "phaseOne": "Sind Sie sicher, dass Sie löschen möchten", + "from": "von" + }, + "deleteSession": "Sind Sie sicher, dass Sie diese Sitzung löschen möchten?", + "deleteMembership": { + "phaseOne": "Sind Sie sicher, dass Sie löschen möchten", + "from": "von" + }, + "deleteAllSession": { + "phaseOne": "Sind Sie sicher, dass Sie löschen möchten", + "allOf": "alle von", + "sessions": "sessions" + }, + "dangerZone": "Der Benutzer wird dauerhaft gelöscht, einschließlich aller mit diesem Benutzer verknüpften Daten. Diese Aktion ist unwiderruflich.", + "on": "on" + }, + "consoleSettings": { + "deleteProject": { + "phraseOne": "Dieses Projekt wird gelöscht", + "phraseTwo": "zusammen mit all seinen Metadaten, Statistiken und anderen Ressourcen.", + "phraseThree": "Diese Aktion ist irreversibel" + }, + "accessService": "Greifen Sie über Ihren API-Endpunkt und Ihre Projekt-ID auf Appwrite-Dienste zu.", + "options": "Wählen Sie Dienste aus, die Sie aktivieren oder deaktivieren möchten.", + "deleteAll": "Das Projekt wird dauerhaft gelöscht, einschließlich aller darin enthaltenen Metadaten, Ressourcen und Statistiken. Diese Aktion ist irreversibel.", + "lastUpdated": "Letzte Aktualisierung:", + "delete": { + "phaseOne": "Sind Sie sicher, dass Sie löschen möchten", + "from": "von" + }, + "verifiedDomain": "Domain wurde verifiziert", + "pendingDomain": "Domain wartet auf Verifizierung", + "dnsDoc": "Hier finden Sie eine Liste der Domänenanbieter und deren Dokumentation zu den DNS-Einstellungen", + "domainProvider": "Wenn Ihr Domain-Anbieter nicht aufgeführt ist, kontaktieren Sie uns bitte. Wir werden dann auch dessen Einstellungen übernehmen.", + "dnsProvider": "Um fortzufahren, setzen Sie den folgenden Eintrag bei Ihrem DNS-Anbieter", + "time": "Je nach Anbieter kann es einige Zeit dauern, bis Änderungen wirksam werden." + }, + "webhooks": { + "deletePermanently": "Der Webhook wird dauerhaft gelöscht. Diese Aktion ist irreversibel.", + "lastUpdated": "Letzte Aktualisierung:", + "delete": { + "phaseOne": "Sind Sie sicher, dass Sie löschen möchten", + "from": "von" + }, + "generateKey": "Sind Sie sicher, dass Sie einen neuen Signaturschlüssel generieren möchten?", + "noRecoveryKey": "Sie können Ihren aktuellen Schlüssel nicht wiederherstellen.", + "triggerWebhook": "Legen Sie die Ereignisse fest, die Ihren Webhook auslösen. Maximal 100 Ereignisse zulässig.", + "addEvent": "Fügen Sie ein Ereignis hinzu, um loszulegen", + "selectEvent": "Wählen Sie Ereignisse in Ihrem Appwrite-Projekt aus, die Ihren Webhook auslösen.", + "learnMore": "Erfahren Sie mehr über Appwrite-Events", + "httpAuth": "Legen Sie einen optionalen Benutzernamen und ein Passwort für die einfache HTTP-Authentifizierung fest, um Ihren Endpunkt vor unbefugtem Zugriff zu schützen.", + "secureEndpoints": "Verwenden Sie diese Option, um Ihren Endpunkt vor nicht vertrauenswürdigen Quellen zu schützen.", + "addSignature": "Fügen Sie den Signaturschlüssel zum X-Appwrite-Webhook-Signature-Header hinzu, um Ihre Webhooks zu validieren.", + "webhookValidation": "Erfahren Sie mehr über die Webhook-Validierung." + }, + "overview": { + "noData": "Keine Daten zum Anzeigen", + "realtimeGetStarted": "Erste Schritte mit Realtime", + "sdks": "Unsere SDKs ermöglichen das einfache Hinzufügen jeder Plattform, die Sie verwenden möchten.", + "addPlatform": "Eine Plattform hinzufügen, um Daten zu Ihrem Projekt anzuzeigen", + "insights": "Erhalten Sie Einblicke in Bandbreitennutzung, Anfragen, Echtzeitverbindungen und mehr, nachdem Sie Ihren ersten API-Aufruf durchgeführt haben", + "scopePermission": "Wählen Sie aus, welche Berechtigungsbereiche Sie Ihrer Anwendung gewähren möchten. Es empfiehlt sich, nur die Berechtigungen zuzulassen, die Sie zum Erreichen Ihrer Projektziele benötigen.", + "createApiKey": "Lassen Sie uns einen API-Schlüssel erstellen.", + "deletePermanent": "Der API-Schlüssel wird dauerhaft gelöscht. Diese Aktion ist irreversibel.", + "lastAccessed": "Letzter Zugriff:", + "scopeGranted": "Gewährte Bereiche:", + "chooseName": "Wählen Sie einen beliebigen Namen, der Ihnen bei der Unterscheidung zwischen API-Schlüsseln hilft.", + "permissionScope": "Sie können auswählen, welchen Berechtigungsbereich Sie Ihrer Anwendung gewähren möchten. Es ist eine bewährte Vorgehensweise, nur die Berechtigungen zuzulassen, die Sie zum Erreichen Ihrer Projektziele benötigen.", + "readyTogo": "Du bist bereit zu gehen", + "congratulations": "Herzlichen Glückwunsch, Sie haben gerade Ihre erste Plattform zu Ihrem Appwrite-Dashboard hinzugefügt! Sind Sie bereit, es auszuprobieren? Warum fügen Sie Ihrem Projekt nicht eine Datenbank hinzu oder beginnen mit dem Hochladen von Dateien? Die Wahl liegt bei Ihnen.", + "choosePlatform": "Wähle einen beliebigen Namen, der dir hilft, zwischen den Plattformen zu unterscheiden.", + "deletePlatform": "Die Plattform wird dauerhaft gelöscht. Diese Aktion ist irreversibel.", + "deletePlatformPermanent": "Die Plattform wird dauerhaft gelöscht. Diese Aktion ist irreversibel.", + "packageName": "Ihr Paketname ist im Allgemeinen die applicationId in Ihrer build.gradle-Datei auf App-Ebene.", + "bundleId": "Du findest deinen Bundle-Bezeichner auf der Registerkarte Allgemein für das primäre Ziel deiner App in Xcode.", + "applicationName": "Der Name Ihrer Anwendung.", + "hostName": "Sie können * verwenden, um Platzhalter-Hostnamen oder Subdomains zuzulassen.", + "realTime": "Echtzeit-Verbindungen", + "setExpireDate": "Legen Sie ein Datum fest, nach dem Ihr API-Schlüssel abläuft.", + "expiredApiKey": "Dein API-Schlüssel ist abgelaufen", + "deleteExpiredKey": "Aus Sicherheitsgründen empfehlen wir dir, deinen abgelaufenen Schlüssel zu löschen und einen neuen zu erstellen.", + "keyToExpire": "Ihr API-Schlüssel läuft bald ab", + "updateExpireDate": "Aktualisieren Sie das Ablaufdatum, um den Schlüssel aktiv zu halten", + "expireWarning": "Ihr Schlüssel läuft ab in" + }, + "functions": { + "createNewFunction": "Eine neue Funktion erstellen", + "createVariable": "Erstellen Sie eine Variable (oder einen geheimen Schlüssel), die zur Laufzeit an Ihre Funktion übergeben wird.", + "setVariable": "Legen Sie die Variablen (oder geheimen Schlüssel) fest, die zur Laufzeit an Ihre Funktion übergeben werden.", + "getStartedVar": "Erstellen Sie eine Variable, um loszulegen", + "setCron": "Legen Sie einen Cron-Zeitplan fest, um Ihre Funktion auszulösen. Lassen Sie das Feld leer, wenn kein Zeitplan vorhanden ist.", + "moreDetailsCronSyntax": "Weitere Details zur Cron-Syntax hier", + "setEvents": "Legen Sie die Ereignisse fest, die Ihre Funktion auslösen. Maximal 100 Ereignisse zulässig.", + "addEvent": "Fügen Sie ein Ereignis hinzu, um loszulegen", + "selectEvents": "Wählen Sie Ereignisse in Ihrem Appwrite-Projekt aus, die Ihre Funktion auslösen.", + "learnMore": "Erfahren Sie mehr über Appwrite-Events", + "setPermission": "Wählen Sie aus, wer diese Funktion mithilfe der Client-API ausführen kann. Weitere Informationen finden Sie im", + "permissionGuide": "Berechtigungshandbuch", + "createYourFunction": "Erstellen Sie Ihre Funktion", + "createFunction": "Lass uns eine Funktion erstellen.", + "functionId": "Funktions-ID:", + "deploymentId": "Bereitstellungs-ID:", + "createdAt": "Erstellt am:", + "updatedAt": "Aktualisiert am:", + "entryPoint": "Einstiegspunkt:", + "totalVariables": "Variablen insgesamt:", + "noInactiveDeployments": "Sie haben keine inaktiven Bereitstellungen. Erstellen Sie eine, um sie hier anzuzeigen.", + "learnDeployments": " Erfahren Sie mehr über Bereitstellungen in unserer Dokumentation.", + "uploadVariables": "Laden Sie mehrere Variablen über eine .env-Datei hoch, die zur Laufzeit an Ihre Funktion übergeben wird.", + "permanentDelete": "Sind Sie sicher, dass Sie diese Funktion und alle zugehörigen Bereitstellungen aus Ihrem Projekt löschen möchten?", + "timeLimit": "Begrenzen Sie die Ausführungszeit Ihrer Funktion. Der Maximalwert beträgt 900 Sekunden (15 Minuten).", + "permanentActionDelete": "Die Funktion wird dauerhaft gelöscht, einschließlich aller damit verbundenen Bereitstellungen. Diese Aktion ist irreversibel.", + "noExecutionLogs": "Sie haben keine Ausführungsprotokolle. Erstellen und aktivieren Sie eine Bereitstellung, um sie hier anzuzeigen.", + "needHand": "Brauchen Sie Hilfe? Erfahren Sie mehr in unserer Dokumentation", + "executions": "Ausführungen", + "errors": "Fehler" + }, + "storage": { + "addNewBucket": "Neuen Bucket hinzufügen", + "deleteWarning": "Sind Sie sicher, dass Sie löschen möchten", + "accessPermission": "Wählen Sie aus, wer auf Ihre Buckets und Dateien zugreifen kann. Weitere Informationen finden Sie im", + "permissionGuide": "Berechtigungshandbuch", + "fileSecurity": { + "enable": "Dateisicherheit aktiviert", + "disable": "Dateisicherheit deaktiviert" + }, + "userAccessability": "Benutzer können auf diese Datei zugreifen, wenn ihnen dies gewährt wurde", + "fileAndBucketPermission": "entweder Datei- oder Bucket-Berechtigungen", + "assignFilePermission": "Wenn Sie Dateiberechtigungen zuweisen möchten, navigieren Sie zu den Bucket-Einstellungen und aktivieren Sie die Dateisicherheit. Andernfalls werden nur Bucket-Berechtigungen verwendet.", + "couldNotFind": "Leider konnten wir nichts finden", + "noMatchingFiles": "Es gibt keine Dateien, die Ihrer Suche entsprechen.", + "permanentDeleteBucket": "Der Bucket wird dauerhaft gelöscht, einschließlich aller darin enthaltenen Dateien. Diese Aktion ist irreversibel.", + "permanentDeleteFile": "Die Datei wird dauerhaft gelöscht. Diese Aktion ist irreversibel.", + "lastUpdated": "Letzte Aktualisierung:", + "created": "Erstellt:", + "size": "Größe:", + "mime": "MIME-Typ:", + "readWritePermission": "Weisen Sie Lese- oder Schreibberechtigungen auf Bucket-Ebene oder Dateiebene zu. Wenn Berechtigungen auf Bucket-Ebene aktiviert sind, werden Dateiberechtigungen ignoriert." + }, + "components": { + "create": "Erstelle dein erstes", + "getStarted": "um loszulegen.", + "needHand": "Brauchen Sie Hilfe? Erfahren Sie mehr in unserer Dokumentation.", + "pagination": { + "totalResult": "Gesamtergebnisse:", + "uploadingFiles": "Hochladen von Dateien" + }, + "custom": { + "permissions": "Mit benutzerdefinierten Berechtigungen kannst du bestimmten Benutzern oder Teams mithilfe ihrer ID und Rolle Zugriff gewähren.", + "permissionFormation": "Eine Berechtigung sollte wie folgt formatiert werden:", + "user": "Benutzer:", + "or": "oder", + "team": "Mannschaft:" + }, + "addRole": "Fügen Sie eine Rolle hinzu, um loszulegen", + "totalResult": "Gesamtergebnisse:", + "couldNotFind": "Leider konnten wir nichts finden", + "noTeamMembers": "Es gibt keine Teams, die Ihrer Suche entsprechen.", + "noUserExist": "Es gibt keine Benutzer, die Ihrer Suche entsprechen.", + "noUsers": "Sie haben keine Benutzer. Erstellen Sie einen Benutzer, um sie hier anzuzeigen.", + "noTeams": "Sie haben keine Teams. Erstellen Sie ein Team, um sie hier zu sehen.", + "needHelp": "Hilfe brauchen? Erfahren Sie mehr in unserem", + "email": "E-Mail:", + "phone": "Telefon:", + "members": "Mitglieder:", + "notFound": "nicht gefunden", + "grantAccessSpecificTeamMember": "Gewähren Sie jedem Mitglied eines bestimmten Teams Zugriff. So gewähren Sie Teammitgliedern Zugriff mit bestimmten müssen Sie eine", + "grantAccessToUser": "Gewähren Sie jedem authentifizierten oder anonymen Benutzer Zugriff.", + "lastUpdated": "Letzte Aktualisierung", + "firstPlatform": "Erstelle deine erste Plattform, um loszulegen." + }, + "footer": { + "version": "Version", + "terms": "Bedingungen", + "privacy": "Datenschutz", + "allRightReserved": "Appwrite. Alle Rechte vorbehalten" + }, + "logs": { + "functionId": "Funktions-ID:", + "deploymentId": "Bereitstellungs-ID:", + "executionId": "Ausführungs-ID:" + }, + "unAuthenticated": "Integrieren Sie Ihre bevorzugten Technologien", + "wizardExitModle": { + "areYouSure": "Bist du sicher, dass du aussteigen möchtest", + "dataDelete": "Alle Daten werden gelöscht. Dieser Vorgang ist irreversibel." + } + }, + "button": { + "createUser": "Benutzer erstellen", + "clearSearch": "Suche löschen", + "account": "Konto", + "email": "E-mail", + "phone": "Telefon", + "createTeam": "Team erstellen", + "createIndex": "Index erstellen", + "createMembership": "Mitgliedschaft erstellen", + "createDb": "Datenbank erstellen", + "createCollection": "Sammlung erstellen", + "createAttribute": "Attribut erstellen", + "createDocument": "Dokument erstellen", + "createDomain": "Domäne erstellen", + "documentation": "Dokumentation", + "createBucket": "Bucket erstellen", + "items": "Artikel", + "test": "prüfen", + "addItem": "Element hinzufügen", + "addEvent": "Ereignis hinzufügen", + "addAttribute": "Attribut hinzufügen", + "createWebhook": "Webhook erstellen", + "createApiKey": "API-Schlüssel erstellen", + "createFunction": "Funktion erstellen", + "createVariable": "Variable erstellen", + "createFile": "Datei erstellen", + "createDeployment": "Bereitstellung erstellen", + "viewApiKeys": "API-Schlüssel anzeigen", + "deselectAll": "Alle abwählen", + "selectAll": "Alles auswählen", + "cancel": "Abbrechen", + "buildLogs": "Erstellungsprotokolle", + "download": "Herunterladen", + "feedback": "Feedback", + "next": "Nächster", + "back": "Zurück", + "skipSteps": "Optionale Schritte überspringen", + "exit": "Beenden", + "close": "Schließen", + "addRole": "Rolle hinzufügen", + "customPermission": "Benutzerdefinierte Berechtigung", + "rawData": "Rohdaten", + "scrollToTop": "Nach oben scrollen", + "button": "Taste", + "platforms": "Plattformen", + "apiKeys": "API-Schlüssel", + "submit": { + "create": "Erstellen", + "update": "Aktualisieren", + "addPrefs": "Präferenz hinzufügen", + "addPlatform": "Plattform hinzufügen", + "delete": "Löschen", + "deleteAll": "Alle löschen", + "verify": "Überprüfen", + "regenerate": "Regenerieren", + "regenerateKey": "Schlüssel neu generieren", + "executeNow": "Jetzt ausführen", + "activate": "Aktivieren", + "downloadEnv": ".env-Datei herunterladen", + "importEnv": ".env-Datei importieren", + "add": "Hinzufügen", + "submit": "Einreichen" + }, + "pill": { + "userId": "Benutzer-ID" + }, + "dropdown": { + "edit": "Bearbeiten", + "createIndex": "Index erstellen", + "overview": "Übersicht", + "ninty": "90d", + "thirty": "30d", + "twentyFour": "24h", + "newOrg": "Neue Organisation", + "yourAccount": "Ihr Konto", + "signOut": "Abmelden", + "any": "Beliebig", + "allGuests": "Alle Gäste", + "allUsers": "Alle Benutzer", + "selectUsers": "Benutzer auswählen", + "selectTeams": "Teams auswählen", + "currentPermission": "Benutzerdefinierte Berechtigung" + } + }, + "table": { + "header": { + "name": "Nennen", + "roles": "Rollen", + "identifiers": "Identifikatoren", + "status": "Status", + "id": "ID", + "documentId": "Dokument-ID", + "executionId": "Ausführungs-ID", + "trigger": "Trigger", + "duration": "Dauer", + "ip": "IP", + "joined": "Beigetreten", + "members": "Mitglieder", + "created": "Erstellt", + "browserAndDevice": "Browser und Gerät", + "sessions": "Sitzungen", + "location": "Standort", + "deleteDatabase": "Datenbank löschen", + "key": "Schlüssel", + "type": "Type", + "value": "Wert", + "attributes": "Attribute", + "asc_dsc": "Asc/Desc", + "defaultValue": "Standardwert", + "relation": "Beziehung", + "filename": "Dateiname", + "role": "Rolle", + "create": "Erstellen", + "read": "Lesen", + "update": "Aktualisieren", + "delete": "Löschen", + "settings": "Einstellungen", + "domainName": "Domänenname", + "postUrl": "POST-URL", + "events": "Ereignisse", + "lastAccessed": "letzter Zugriff", + "expirationDate": "Ablaufdatum", + "scopes": "Umfänge", + "buildTime": "Bauzeit", + "size": "Größe", + "any": "Beliebig", + "guests": "Gäste", + "users": "Benutzer" + }, + "pill": { + "verify": "verifiziert", + "emailVerify": "bestätigte E-Mail", + "phoneVerify": "verifiziertes Telefon", + "unverify": "nicht verifiziert", + "block": "blockiert", + "userId": "Benutzer-ID", + "teamId": "Team-ID", + "webhookId": "Webhook-ID", + "required": "Erforderlich", + "pending": "Ausstehend", + "collectionId": "Sammlungs-ID", + "recommended": "empfohlen", + "dbId": "Datenbank-ID", + "currentSession": "aktuelle Sitzung", + "disabled": "deaktiviert", + "documentId": "Dokument-ID", + "functionId": "Funktions-ID", + "fileId": "Datei-ID", + "bucketId": "Bucket-ID", + "failed": "failed", + "sllTlsDisabled": "SLL/TLS deaktiviert", + "apiKeySecret": "API-Schlüsselgeheimnis", + "columns": "Spalten" + } + }, + "legends": { + "teams": { + "users": "Registrierte Benutzer", + "create": "Benutzer erstellt", + "read": "Benutzer lesen", + "update": "Benutzer aktualisiert", + "delete": "Benutzer gelöscht" + }, + "databases": { + "databases": "Gesamtdatenbanken", + "create": "Datenbanken erstellt", + "read": "Datenbanken gelesen", + "update": "Datenbanken aktualisiert", + "delete": "Datenbanken gelöscht", + "usage": { + "collections": "Gesamtsammlungen", + "create": "Sammlungen erstellt", + "read": "Sammlungen gelesen", + "update": "Sammlungen aktualisiert", + "delete": "Sammlungen gelöscht" + }, + "documents": { + "documents": "Gesamtdokumente", + "create": "Dokumente erstellt", + "read": "Dokumente gelesen", + "update": "Dokumente aktualisiert", + "delete": "Dokumente gelöscht" + } + }, + "settings": { + "domain": { + "addDomain": "Fügen Sie Ihre Domain hinzu", + "addCname": "Einen CNAME-Eintrag hinzufügen", + "verifyDomain": "Domäne überprüfen", + "sslCertificate": "SSL-Zertifikat" + }, + "webhooks": { + "addWebhooks": "Fügen Sie Ihren Webhook hinzu", + "events": "Webhook-Ereignisse", + "Sicherheit": "Sicherheit" + } + }, + "overview": { "details": "Details", "scopes": "Umfänge" }, + "functions": { + "details": "Details", + "excecuteAccess": "Ausführungszugriff", + "events": "Ereignisse", + "schedule": "Zeitplan", + "Variablen": "Variablen" + }, + "storage": { + "buckets": "Gesamtzahl der Buckets", + "create": "Buckets erstellt", + "read": "Buckets gelesen", + "update": "Buckets aktualisiert", + "delete": "Buckets gelöscht", + "usage": { + "files": "Dateien", + "create": "Dateien erstellt", + "read": "Dateien gelesen", + "update": "Dateien aktualisiert", + "delete": "Dateien gelöscht" + } + } + }, + "navbar": { + "header": { + "users": "Benutzer", + "teams": "Teams", + "usage": "Nutzung", + "security": "Sicherheit", + "settings": "Einstellungen" + }, + "userHeader": { + "overview": "Übersicht", + "membership": "Mitgliedschaften", + "sessions": "Sitzungen", + "activity": "Aktivität" + }, + "teamHeader": { + "overview": "Übersicht", + "members": "Mitglieder", + "activity": "Aktivität" + }, + "databases": { + "databases": "Datenbanken", + "usage": "Nutzung", + "collections": "Sammlungen", + "settings": "Einstellungen", + "dbCollection": { + "documents": "Dokumente", + "activity": "Aktivität", + "indexes": "Indizes", + "attribute": "Attribute", + "usage": "Nutzung", + "settings": "Einstellungen" + }, + "document": { + "overview": "Übersicht", + "data": "Daten", + "activity": "Aktivität" + } + }, + "settings": { + "overview": "Übersicht", + "customDomains": "Benutzerdefinierte Domänen", + "webhooks": "Webhooks" + }, + "platforms": { + "web": "Web-App", + "flutter": "Flutter-App", + "apple": "Apple-App", + "android": "Android-App" + }, + "functions": { + "deployments": "Bereitstellungen", + "usage": "Nutzung", + "executions": "Ausführungen", + "settings": "Einstellungen" + }, + "storage": { + "buckets": "Eimer", + "usage": "Nutzung", + "files": "Dateien", + "settings": "Einstellungen" + }, + "sideNavigation": { + "overview": "Übersicht", + "auth": "Auth", + "databases": "Datenbanken", + "functions": "Funktionen", + "storage": "Speicher", + "settings": "Einstellungen" + } + }, + "links": { + "oAuthProvider": { + "visitDoc": "Besuchen Sie die Dokumente." + }, + "passwordDictionary": "10.000 am häufigsten verwendete Passwörter.", + "support": "Unterstützung" + }, + "alert": { + "oAuthProvider": { + "fieldOne": "Um die Einrichtung abzuschließen, fügen Sie diesen OAuth2-Umleitungs-URI zu Ihrem hinzu", + "fieldTwo": "App-Konfiguration." + }, + "teams": { + "createMembership": "Rollen werden zum Verwalten von Zugriffsberechtigungen verwendet. Sie können jede gewünschte Rolle erstellen." + }, + "databases": { + "title": { + "documentSecurity": { + "enabled": "Dokumentensicherheit ist aktiviert", + "disabled": "Dokumentsicherheit ist deaktiviert" + }, + "userPermission": "Benutzer können auf dieses Dokument zugreifen, wenn ihnen dies gewährt wurde", + "collectionPermission": "Entweder Dokument- oder Sammlungsberechtigungen.", + "permissionCheck": "Wenn Sie Dokumentberechtigungen zuweisen möchten, navigieren Sie zu den Sammlungseinstellungen und aktivieren Sie die Dokumentsicherheit. Andernfalls werden nur Sammlungsberechtigungen verwendet." + }, + "relationshipSettings": "Um die Auswahl zu ändern, bearbeiten Sie die Beziehungseinstellungen." + } + }, + "components": { + "pagination": { + "prev": "Zurück", + "next": "Nächster" + } + }, + "mock": { + "content": "Inhalt", + "list": "Liste", + "other": "andere", + "title": { + "stepOne": "Schritt-1", + "stepTwo": "Schritt-2", + "subStepOne": "Untertitel-1", + "subStepTwo": "Untertitel-2" + }, + "inputs": { + "label": { + "stepOneFirst": "Schritt-1-erforderlich", + "stepOneSecond": "Schritt-1-Optional", + "labelStepOne": "Etikett-Schritt-1", + "stepTwoFirst": "Schritt-2-Erste", + "stepTwoSecond": "Schritt-2-Sekunde", + "labelStepTwo": "Etikett-Schritt-2" + } + } + } + } + }, + + "components": { + "notification": { + "sentPswdLink": "Wir haben Ihnen eine E-Mail mit einem Link zum Zurücksetzen des Passworts gesendet", + "pswdUpdatedSuccessfully": "Passwort wurde erfolgreich aktualisiert", + "loginSuccessfully": "Erfolgreich angemeldet.", + "hasBeenCreated": "wurde erstellt", + "hasBeenUpdated": "wurde aktualisiert", + "hasBeenDeleted": "wurde gelöscht", + "accountDeleted": "Konto wurde gelöscht", + "sessionDeleted": "Sitzung wurde gelöscht", + "allSessionDeleted": "Alle Sitzungen wurden gelöscht", + "functionDeleted": "Funktion wurde gelöscht", + "membershipDeleted": "Mitgliedschaft wurde gelöscht", + "indexDeleted": "Index wurde gelöscht", + "indexCreated": "Index wurde erstellt", + "webhookHasBeenCreated": "Webhook wurde erstellt", + "webhookUrlHasBeenCreated": "Webhook-URL wurde erstellt", + "webhookSecurityHasBeenCreated": "Webhook-Sicherheit wurde aktualisiert", + "webhookNameHasBeenCreated": "Webhook-Name wurde aktualisiert", + "webhookEventsHasBeenCreated": "Webhook-Ereignisse wurden aktualisiert", + "keyRegenerated": "Schlüssel wurde neu generiert", + "fileUpload": "Datei wurde hochgeladen", + "nameUpdated": "Name wurde aktualisiert", + "emailUpdated": "E-Mail wurde aktualisiert", + "pswdUpdated": "Passwort wurde aktualisiert", + "updatePrefs": "Einstellungen wurden aktualisiert", + "phoneUpdated": "Telefon wurde aktualisiert", + "authUpdated": "Authentifizierung wurde aktualisiert", + "projectUserLimitUpdated": "Projektbenutzerlimit erfolgreich aktualisiert", + "platformNameUpdated": "Plattformname wurde aktualisiert", + "apiKeyExpirationUpdated": "Der Ablauf des API-Schlüssels wurde aktualisiert", + "apiKeyNameUpdated": "API-Schlüsselname wurde aktualisiert", + "apiKeyScopeUpdated": "API-Schlüsselbereiche wurden aktualisiert", + "securityUpdated": "Sicherheit wurde aktualisiert", + "permissionsUpdated": "Berechtigungen wurden aktualisiert", + "displayNameUpdated": "Anzeigenamen wurden aktualisiert", + "cronUpdated": "Cron-Zeitplan wurde aktualisiert", + "timeOutUpdated": "Timeout wurde aktualisiert", + "variablesUpdated": "Variablen wurden aktualisiert", + "platformHostnameUpdated": "Plattform-Hostname wurde aktualisiert", + "platformPackageNameUpdated": "Plattform-Paketname wurde aktualisiert", + "platformBundleIdUpdated": "Plattform-Bundle-ID wurde aktualisiert", + "projectNameUpdated": "Der Projektname wurde aktualisiert", + "documentCreated": "Dokument wurde erstellt", + "documentDeleted": "Dokument wurde gelöscht", + "documentWasUpdated": "Dokument wurde aktualisiert!", + "attributeDeleted": "Attribut wurde gelöscht", + "sessionLimitUpdated": "Sitzungslimit wurde aktualisiert", + "pswdHistoryLimitUpdated": "Grenze für den Passwortverlauf aktualisiert.", + "pswdDictonaryCheck": "Überprüfung des Passwortwörterbuchs aktualisiert.", + "functionExecuted": "Funktion wurde ausgeführt", + "deploymentDeleted": "Bereitstellung wurde gelöscht", + "deploymentActivated": "Bereitstellung wurde aktiviert", + "variablesUploaded": "Variablen hochgeladen", + "wasDeletedFrom": "wurde gelöscht aus", + "inviteSentTo": "Einladung wurde gesendet an", + "yourExperience": "Wie sind Ihre Erfahrungen mit unserer neuen Funktion „Beziehungen“? Wir würden uns über Ihr Feedback freuen!", + "attribute": "Attribut", + "theAccount": "Das Konto", + "serviceHasBeen": "Dienst war", + "hasBeen": "war", + "verified": "verifiziert", + "unVerfied": "unverifiziert", + "blocked": "blockiert", + "unBlocked": "blockiert", + "enabled": "aktiviert", + "disabled": "deaktiviert" + } + } +} diff --git a/src/i18n/de/index.ts b/src/i18n/de/index.ts new file mode 100644 index 0000000000..27dfd2c11d --- /dev/null +++ b/src/i18n/de/index.ts @@ -0,0 +1,6 @@ +import type { Translation } from '../i18n-types'; +import deJson from './de.json'; + +const de: Translation = deJson; + +export default de; diff --git a/src/i18n/en/en.json b/src/i18n/en/en.json new file mode 100644 index 0000000000..6611b5835f --- /dev/null +++ b/src/i18n/en/en.json @@ -0,0 +1,1861 @@ +{ + "auth": { + "title": { + "missingRedirectUrl": "Missing Redirect URL" + }, + "texts": { + "magicUrl": { + "loginFlow": "Your Magic URL login flow is missing a proper redirect URL. Please check the", + "magicDocs": "Magic URL docs", + "sendMsg": "and send request for new session with a valid redirect URL." + }, + "oAuth": { + "loginFlow": "Your OAuth login flow is missing a proper redirect URL. Please check the", + "oAuthDocs": "OAuth docs", + "sendRequest": "and send request for new session with a valid callback URL." + } + } + }, + + "login": { + "title": "Sign in", + "forms": { + "login": { + "inputs": { + "email": { + "label": "Email", + "placeholder": "Email" + }, + "password": { + "label": "Password", + "placeholder": "Password" + } + } + } + }, + "button": { + "submit": { + "login": "Sign in" + } + }, + "links": { + "recovery": "Forgot Password", + "register": "Sign up" + } + }, + + "register": { + "title": "Sign up", + "forms": { + "register": { + "inputs": { + "name": { + "label": "Name", + "placeholder": "Your name" + }, + "email": { + "label": "Email", + "placeholder": "Your email" + }, + "password": { + "label": "Password", + "placeholder": "Your password" + }, + "terms": { + "label": "terms" + } + } + }, + "invite": { + "inputs": { + "name": { + "label": "Name", + "placeholder": "Your name" + }, + "email": { + "label": "Email", + "placeholder": "Your email" + }, + "password": { + "label": "Password", + "placeholder": "Your password" + }, + "code": { + "label": "Code", + "placeholder": "Your code" + } + } + } + }, + "button": { + "submit": { + "register": "Sign up" + } + }, + "links": { + "login": "Sign in" + }, + "texts": { + "registery": "Already got an account?", + "privacyPolicy": { + "phraseOne": "By registering, you agree that you have read, understand, and acknowledge our", + "privacy": "Privacy Policy", + "phraseTwo": "and accept our", + "generalTerm": "General Terms of Use" + } + } + }, + + "recover": { + "title": { + "pageHeader": "Recover", + "pageTitle": "Password Recovery" + }, + "forms": { + "resetPassword": { + "inputs": { + "email": { + "label": "Email", + "placeholder": "Email" + }, + "password": { + "label": "New password", + "placeholder": "Enter password" + }, + "cnfPassword": { + "label": "Confirm password", + "placeholder": "Confirm password" + } + } + } + }, + "button": { + "submit": { + "update": "Update", + "recover": "Recover" + } + }, + "links": { + "register": "Sign up", + "login": "Sign in" + } + }, + + "invite": { + "title": { + "pageHeader": "Accept invite", + "invalidInvite": "Invalid invite", + "invite": "Invite" + }, + "alerts": { + "warningAlert": { + "phraseOne": "The invite link is not valid", + "phraseTwo": "Please ask the project owner to send you a new invite." + }, + "successAlert": "You have been invited to join a team project on Appwrite" + }, + "button": { + "submit": { + "cancel": "Cancel", + "accept": "Accept" + }, + "accept": { + "register": "Sign up to Appwrite" + } + }, + "texts": { + "privacyPolicy": { + "phraseOne": "By accepting the invitation, you agree to the", + "termsAndCond": "Terms and Conditions", + "and": "and", + "privacy": "Privacy and Policy" + } + }, + "forms": { + "invite": { + "inputs": { + "terms": { + "label": "terms" + } + } + } + } + }, + + "console": { + "forms": { + "createOrg": { + "title": "Create New Organization", + "inputs": { + "name": { + "label": "Name", + "placeholder": "Enter name" + } + } + }, + "inputSwitch": { + "enable": "enable", + "disabled": "disabled" + } + }, + "button": { + "cancel": "Cancel", + "backToConsole": "Back to the console", + "submit": { + "create": "Create" + } + }, + "table": { + "pill": { + "orgId": "Organization ID" + } + }, + "account": { + "title": { + "user": "User", + "organizations": "Organizations", + "deleteAccount": "Delete Account" + }, + "forms": { + "updateName": { + "title": "Name", + "inputs": { + "name": { + "label": "Name", + "placeholder": "Enter name" + } + } + }, + "updateEmail": { + "title": "Email", + "inputs": { + "email": { + "label": "Email", + "placeholder": "Enter email" + }, + "password": { + "label": "Password", + "placeholder": "Enter password" + } + } + }, + "updatePassword": { + "title": "Password", + "inputs": { + "oldPassword": { + "label": "Old Password", + "placeholder": "Enter password" + }, + "newPassword": { + "label": "New Password", + "placeholder": "Enter password" + } + }, + "texts": { + "forgotPassword": "Forgot your password?", + "recoverPassword": "Recover your password" + } + } + }, + "button": { + "submit": { + "update": "Update", + "cancel": "Cancel", + "delete": "Delete" + }, + "logout": "Logout", + "documentation": "Documentation", + "createOrg": "Create organization", + "logoutAllSessions": "Logout all sessions" + }, + "texts": { + "members": "members", + "createOrg": "Create a new organization", + "noSession": "No sessions available", + "totalResult": "Total results:", + "deleteWarning": "Are you sure you want to delete your account?", + "deleteAccount": " Your account will be permanently deleted and access will be lost to any of your teams and data. This action is irreversible." + }, + "navbar": { + "header": { + "overview": "Overview", + "sessions": "Sessions", + "activity": "Activity", + "organization": "Organizations" + } + }, + "table": { + "header": { + "client": "Client", + "location": "Location", + "ip": "IP" + }, + "trim": { + "on": "on" + }, + "texts": { + "unknown": "Unknown" + }, + "pill": { + "alert": { + "current": "current session" + } + } + } + }, + "onboarding": { + "title": { + "onboarding": "Onboarding", + "coverTitle": "Let's create your first project" + }, + "forms": { + "createProject": { + "inputs": { + "name": { + "label": "Project name", + "placeholder": "First Appwrite Project" + } + } + } + }, + "button": { + "submit": { + "create": "Create Project" + } + }, + "table": { + "pill": { + "projectId": "Project ID" + } + } + }, + "organization": { + "title": { + "organizations": "Organizations", + "projects": "Projects", + "members": "Members" + }, + "forms": { + "updateName": { + "title": "Name", + "inputs": { + "name": { + "label": "Name", + "placeholder": "Enter name" + } + } + }, + "createMember": { + "title": "Invite Member", + "inputs": { + "email": { + "label": "Email", + "placeholder": "Enter email" + }, + "name": { + "label": "Name (optional)", + "placeholder": "Enter name" + } + } + }, + "createProject": { + "title": "Create Project", + "inputs": { + "name": { + "label": "Name" + } + } + }, + "deleteOrg": { + "title": "Delete Organization", + "texts": { + "phraseOne": "Are you sure you want to delete", + "phraseTwo": "? All projects", + "phraseThree": "and data associated with this organization will be deleted. This action is irreversible.", + "orgSettings": "The organization will be permanently deleted, including all projects and data associated with this organization. This action is irreversible." + } + }, + "limit": { + "inputs": { + "rows": { + "label": "Rows per page" + } + }, + "texts": { + "perPage": "per page", + "totalResult": "Total results:" + } + } + }, + "table": { + "header": { + "name": "Name", + "email": "Email" + }, + "pill": { + "projectId": "Project ID", + "pending": "Pending" + } + }, + "button": { + "submit": { + "create": "Create", + "createProject": "Create Project", + "send": "Send invite", + "update": "Update", + "cancel": "Cancel", + "delete": "Delete" + }, + "invite": "Invite", + "resend": "Resend" + }, + "texts": { + "dropDown": "New Organization", + "apps": "apps", + "no": "no", + "members": "members", + "createProject": "Create a new project" + }, + "navbar": { + "header": { + "projects": "Projects", + "members": "Members", + "settings": "Settings" + } + } + }, + "project": { + "title": { + "auth": "Auth", + "createUser": "Create User", + "createTeam": "Create Team", + "createDb": "Create Database", + "createData": "Create data", + "createMembership": "Create Membership", + "createCollection": "Create Collection", + "createIndex": "Create Index", + "deleteUser": "Delete User", + "deleteSession": "Delete Sessions", + "deleteAllSession": "Delete All Sessions", + "deleteMember": "Delete Member", + "deleteDatabase": "Delete Database", + "deleteAttribute": "Delete Attribute", + "deleteCollection": "Delete Collection", + "deleteProject": "Delete Project", + "deleteTeam": "Delete Team", + "deleteDocument": "Delete Document", + "deleteIndex": "Delete Index", + "deleteDomain": "Delete Domain", + "deleteWebhook": "Delete Webhook", + "deletePlatform": "Delete Platform", + "expirationDate": "Expiration Date", + "exitProcess": "Exit Process", + "hostName": "Hostname", + "user": "User", + "team": "Team", + "schedule": "Schedule", + "overview": "Overview", + "logs": "Logs", + "indexes": "Indexes", + "buckets": "Buckets", + "services": "Services", + "console": "Console", + "bandwith": "Bandwidth", + "documents": "Documents", + "addScopes": "Add Scopes", + "storage": "Storage", + "bucket": "Bucket", + "variables": "Variables", + "timeout": "Timeout", + "scopes": "Scopes", + "executeAccess": "Execute access", + "customDomains": "Custom Domains", + "customPermission": "Custom permission", + "documentSecurity": "Document Security", + "webhooks": "Webhooks", + "webhook": "Webhook", + "deployments": "Deployments", + "deleteFunction": "Delete Function", + "deleteBucket": "Delete Bucket", + "displayName": "Display Name", + "deleteFile": "Delete File", + "teamPref": "Team Preferences", + "apiCredentials": "API Credentials", + "active": "Active", + "inactive": "Inactive", + "uploadVariables": "Upload Variables", + "data": "Data", + "users": "Users", + "document": "Document", + "functions": "Functions", + "executions": "Executions", + "integrations": "Integrations", + "metaData": "Metadata", + "permissions": "Permissions", + "attributes": "Attributes", + "database": "Database", + "databases": "Databases", + "collections": "Collections", + "oAuth2": "OAuth2 Settings", + "regenerateKey": "Regenerate Key", + "signatureKey": "Signature Key", + "apiKey": "API Key", + "apiKeys": "API Keys", + "createApiKey": "Create an API Key", + "deleteApiKey": "Delete API Key", + "events": "Events", + "httpAuth": "HTTP Authentication", + "selectTeams": "Select teams", + "selectUsers": "Select users", + "platforms": "Platforms", + "packageName": "Package Name", + "bundleId": "Bundle ID", + "userData": { + "name": "Name", + "email": "Email", + "phone": "Phone", + "password": "Password", + "userPref": "User Preferences", + "deleteUser": "Delete User" + }, + "security": { + "title": "Security", + "passwordDictionary": "Password Dictionary", + "passwordHistory": "Password History", + "sessionLength": "Session Length", + "sessionLimit": "Session Limit", + "usersLimit": "Users Limit" + }, + "settings": { + "header": "Settings", + "authMethods": "Auth Methods", + "oauth2Providers": "OAuth2 Providers" + }, + "wizards": { + "addYourDomain": "Add your domain", + "subTitle": "Use your self-owned domain as the endpoint of your Appwrite API." + }, + "overView": { + "getStartedGuid": "Getting Started Guide", + "addPlatform": "Add a Platform", + "integrateWithServer": "Integrate With Your Server" + } + }, + "forms": { + "createUser": { + "inputs": { + "name": { + "label": "Name", + "placeholder": "Enter name" + }, + "email": { + "label": "Email", + "placeholder": "Enter email" + }, + "phone": { + "label": "Phone", + "placeholder": "Enter phone" + }, + "password": { + "label": "Password", + "placeholder": "Enter password" + } + } + }, + "createTeam": { + "inputs": { + "name": { + "label": "Name", + "placeholder": "Enter name" + } + } + }, + "userData": { + "update": { + "name": { + "label": "Name", + "placeholder": "Enter name" + }, + "email": { + "label": "Email", + "placeholder": "Enter email" + }, + "phone": { + "label": "Phone", + "placeholder": "Enter phone" + }, + "password": { + "label": "New Password", + "placeholder": "Enter New password" + }, + "userPref": { + "key": { + "label": "Key", + "placeholder": "Enter key" + }, + "value": { + "label": "Value", + "placeholder": "Enter value" + } + } + } + }, + "oAuthProvider": { + "inputs": { + "appleAuth": { + "bundleId": { + "label": "Bundle ID", + "placeholder": "com.company.appname" + }, + "keyId": { + "label": "Key ID", + "placeholder": "SHAB13ROFN" + }, + "teamId": { + "label": "Team ID", + "placeholder": "ELA2CD3AED" + }, + "p8": { + "label": "P8 File", + "placeholder": "" + } + }, + "auth0Auth": { + "clientId": { + "label": "Client ID", + "placeholder": "Enter ID" + }, + "secret": { + "label": "Client Secret", + "placeholder": "Enter Client Secret" + }, + "domain": { + "label": "Auth0 Domain", + "placeholder": "Your Auth0 domain" + } + }, + "githubAuth": { + "appId": { + "label": "App ID", + "placeholder": "Enter ID" + }, + "secret": { + "label": "App Secret", + "placeholder": "Enter App Secret" + }, + "endpoint": { + "label": "Endpoint (optional)", + "placeholder": "Your endpoint" + } + }, + "mainAuth": { + "appId": { + "label": "App ID", + "placeholder": "Enter ID" + }, + "secret": { + "label": "App Secret", + "placeholder": "Enter App Secret" + } + }, + "microsoftAuth": { + "appId": { + "label": "Application (client) ID", + "placeholder": "Enter ID" + }, + "secret": { + "label": "Client Secret", + "placeholder": "Enter Client Secret" + }, + "tenant": { + "label": "Target Tenant", + "placeholder": "'common','organizations','consumers' or your TenantID" + } + }, + "oktaAuth": { + "appId": { + "label": "Client ID", + "placeholder": "Enter ID" + }, + "secret": { + "label": "Client Secret", + "placeholder": "Enter Client Secret" + }, + "domain": { + "label": "Okta Domain", + "placeholder": "dev-1337.okta.com" + }, + "serverId": { + "label": "Authorization Server ID", + "placeholder": "default" + } + } + } + }, + "security": { + "inputs": { + "passwordDictionary": { + "label": "Password Dictionary" + }, + "passwordHistory": { + "label": "Password History" + }, + "maxSession": { + "label": "Limit" + }, + "sessionLength": { + "label": "Length" + }, + "sessionPeriod": { + "label": "Time Period" + } + } + }, + "teams": { + "updatePrefs": { + "inputs": { + "key": { + "label": "Key", + "placeholder": "Enter key" + }, + "value": { + "label": "Value", + "placeholder": "Enter value" + } + } + }, + "updateName": { + "title": "Name", + "inputs": { + "name": { + "label": "Name", + "placeholder": "Enter team name" + } + } + }, + "createMembership": { + "inputs": { + "name": { + "label": "Name (optional)", + "placeholder": "Enter name" + }, + "email": { + "label": "Email", + "placeholder": "Enter email" + }, + "roles": { + "label": "Roles", + "placeholder": "Add roles" + } + } + } + }, + "databases": { + "createDb": { + "inputs": { + "name": { + "label": "Name", + "placeholder": "Enter database name" + } + } + }, + "createCollection": { + "inputs": { + "name": { + "label": "Name", + "placeholder": "Enter collection name" + } + } + }, + "updateName": { + "title": "Name", + "inputs": { + "name": { + "label": "Name", + "placeholder": "Enter database name", + "defaultPlaceholder": "Enter name" + } + } + }, + "createAttribute": { + "texts": { + "createAttribute": " Allowed characters: alphanumeric, hyphen, non-leading underscore, period" + }, + "inputs": { + "key": { + "label": "Attribute Key", + "placeholder": "Enter Key" + } + } + }, + "attribute": { + "texts": { + "phraseOne": "Indicate whether this is a required attribute", + "phraseTwo": "Indicate whether this attribute should act as an array", + "relationship": { + "oneWay": { + "phraseOne": "One-way relationship", + "phraseTwo": " One Relation attribute within this collection" + }, + "twoWay": { + "phraseOne": "Two-way relationship", + "phraseTwo": "One Relation attribute within this collection and another within the related collection" + } + } + }, + "inputs": { + "default": { + "label": "Default value", + "placeholder": "Select a value" + }, + "defaultValue": { + "label": "Default value", + "placeholder": "Enter value" + }, + "elements": { + "label": "Elements", + "placeholder": "Add elements here" + }, + "required": { + "label": "Required" + }, + "array": { + "label": "Array" + }, + "key": { + "label": "Attribute Key", + "placeholder": "Enter Key" + }, + "min": { + "label": "Min", + "placeholder": "Enter size" + }, + "max": { + "label": "Max", + "placeholder": "Enter size" + }, + "related": { + "label": "Related Collection", + "placeholder": "Select a collection" + }, + "keyRelated": { + "label": "Attribute Key (related collection)", + "placeholder": "Enter Key" + }, + "relationship": { + "label": "Relation", + "placeholder": "Select a relation" + }, + "deleting": { + "label": "On deleting a document", + "placeholder": "Select a deletion method" + }, + "size": { + "label": "Size", + "placeholder": "Enter size" + }, + "string": { + "label": "Default", + "placeholder": "Enter string" + }, + "email": { + "placeholder": "Enter URL" + } + } + }, + "index": { + "inputs": { + "key": { + "label": "Index Key", + "placeholder": "Enter Key" + }, + "type": { + "label": "Index type", + "placeholder": "Select type" + }, + "attribute": { + "label": "Attribute", + "placeholder": "Select attribute" + }, + "order": { + "label": "Order" + }, + "id": { + "label": "Document ID", + "placeholder": "Document ID" + } + }, + "options": { + "title": { + "selectAttribute": "Select Attribute", + "selectOrder": "Select Order" + }, + "label": { + "id": "$id", + "createdAt": "$createdAt", + "updatedAt": "$updatedAt", + "asc": "ASC", + "desc": "DESC" + } + } + }, + "settings": { + "inputs": { + "docSecurity": { + "label": "Document Security" + } + } + } + }, + "settings": { + "default": { + "inputs": { + "projectId": { + "label": "Project ID" + }, + "apiEndPoint": { + "label": "API Endpoint" + } + } + }, + "updateName": { + "title": "Name", + "inputs": { + "name": { + "label": "Name", + "placeholder": "Enter database name", + "defaultPlaceholder": "Enter name" + } + }, + "texts": { + "chooseWebhook": "Choose any name that will help you distinguish between Webhooks." + } + }, + "domain": { + "inputs": { + "domain": { + "label": "Custom Domain", + "placeholder": "appwrite.example.com" + } + } + }, + "webhooks": { + "texts": { + "stepOne": "Use webhooks to build integrations that subscribe to specific events on Appwrite. Appwrite will send an HTTP POST payload to the webhook's configured URL when one of the specified events is triggered.", + "events": "Set the events that will trigger your function. Maximum 100 events allowed.", + "addEvent": "Add an event to get started", + "selectEvent": "Select events in your Appwrite project that will trigger your webhook.", + "learnMore": "Learn more about Appwrite Events", + "learnMoreWarning": "Learn more", + "untrustedCertificate": "Untrusted or self-signed certificates may not be secure.", + "security": "Set an optional basic HTTP authentication username and password to protect your endpoint from unauthorized access.", + "secureEndpoints": "Use to secure your endpoint from untrusted sources." + }, + "inputs": { + "name": { + "label": "Name", + "defaultPlaceholder": "Enter name" + }, + "url": { + "label": "POST URL" + }, + "user": { + "label": "User", + "placeholder": "Enter username" + }, + "password": { + "label": "Password", + "placeholder": "Enter password" + } + } + } + }, + "overview": { + "title": { + "name": "Name", + "coding": "Let's get coding", + "initSdk": "Init your SDK", + "getSdk": "Get the SDK", + "selfHosted": "For self-hosted solutions", + "register": { + "android": "Register your Android app", + "apple": "Register your Apple app", + "flutter": "Register your Flutter app", + "web": "Register your Web app" + } + }, + "inputs": { + "name": { + "label": "Name", + "placeholder": "API Key Name", + "defaultPlaceholder": "Enter name" + }, + "androidPlatformName": { + "label": "Name", + "placeholder": "My Android App" + }, + "androidPlatformKey": { + "label": "Package Name", + "tooltip": "Your package name is generally the applicationId in your app-level build.gradle file." + }, + "applePlatformName": { + "label": "Name", + "placeholder": "My Apple App" + }, + "appleHostname": { + "label": "Bundle ID", + "tooltip": "You can find your Bundle Identifier in the General tab for your app's primary target in Xcode." + }, + "webAppname": { + "label": "Name", + "placeholder": "My Web App" + }, + "webHostName": { + "label": "Hostname", + "tooltip": "The hostname that your website will use to interact with the Appwrite APIs in production or development environments. No protocol or port number required." + } + }, + "texts": { + "initSdk": " Now that you've downloaded the SDK, it's time to initialze it. Use your project ID, which can be found in your project settings page.", + "apiCall": "Before sending any API calls to your new Appwrite project, make sure your device or emulator has network access to your Appwrite project's hostname or IP address.", + "alert": "When connecting to a locally hosted Appwrite project from an emulator or a mobile device, you should use the private IP of the device running your Appwrite project as the hostname of the endpoint instead of localhost. You can also use a service like ngrok to proxy the Appwrite server.", + "android": { + "first": "First, add this to your root level build.gradle file:", + "second": "And add this to your project's build.gradle file:" + }, + "selectFile": "Select File", + "addPackages": "Add Packages", + "searchAppwrite": "Search for the Appwrite SDK with the URL", + "selectTargetProject": "In the right panel, select your target project and add your desired version rules", + "selectAndAddPackage": "Select Add Package and wait for package resolution to complete", + "productCheck": "Make sure the Appwrite package product is checked and select Add Package again", + "addToSwift": "Add this to your Package.swift file:", + "addDependency": "Then add the dependency to your target:", + "addProjectFlutter": "Add Appwrite SDK to your package's pubspec.yaml file. You can view an example here.", + "installDartPackage": "You can also install the SDK using the Dart package manager from your terminal:", + "chooseMethod": " Choose your preferred method of installation", + "use": "Use", + "cmdLine": "from your command line to add Appwrite SDK to your project.", + "note": { + "phraseOne": "When you're using a bundler (like", + "or": "or", + "phraseTwo": "), import the Appwrite module when you need it:" + }, + "installWithCdn": "To install with a CDN (content delivery network) add the following scripts to the bottom of your tag, but before you use any Appwrite services:", + "wildcard": "Using wildcard hostnames in production can become insecure. You can read about", + "moreInfo": "for more information." + } + }, + "functions": { + "title": { + "executeFunction": "Execute Function", + "deleteDeployment": "Delete Deployment", + "createDeployment": "Create Deployment", + "activeDeployment": "Activate Deployment", + "commingSoon": "Coming Soon!", + "easyDeployments": "Creating deployments will be easier than ever with our upcoming Git Integration. Just set up a repository and we'll do the rest.", + "deploymentBuild": "This deployment will be activated after the build is completed.", + "name": "Name" + }, + "inputs": { + "key": { + "label": "Key", + "placeholder": "Enter key" + }, + "value": { + "label": "Value", + "placeholder": "Enter value" + }, + "name": { + "label": "Name", + "placeholder": "Function name", + "defaultPlaceholder": "Enter name" + }, + "runtime": { + "label": "Runtime", + "placeholder": "Select runtime" + }, + "data": { + "label": "Custom data (optional)" + }, + "json": { + "label": "Show example JSON" + }, + "entryPoint": { + "label": "Entrypoint" + }, + "activeDeployment": { + "label": "Activate deployment after build" + } + }, + "texts": { + "customDataExample": "Here's an example of some custom data.", + "deleteDeployment": "Are you sure you want to delete this deployment?", + "deployFunction": "You can deploy your function from the Appwrite CLI using Unix, CMD, or PowerShell. Check out our Documentation to learn more about", + "deployYourFunction": "deploying your functions", + "installAndUse": "or how to install and use the", + "activateWarning": "Are you sure you want to activate this deployment?" + } + }, + "storage": { + "title": { + "createBucket": "Create Bucket", + "createFile": "Create File", + "maximumSize": "Maximum File Size", + "fileSecurity": "File Security", + "name": "Name", + "securitySettings": "Security Settings", + "compression": "Compression", + "fileExtensions": "File Extensions" + }, + "inputs": { + "name": { + "label": "Name", + "placeholder": "New Bucket", + "defaultPlaceholder": "Enter name" + }, + "size": { + "label": "Size" + }, + "security": { + "label": "File Security" + }, + "algorithm": { + "lable": "Algorithm" + }, + "extensions": { + "lable": "Allowed extensionss", + "placeholder": "Allowed file extensions (mp4, jpg, pdf, etc.)" + } + }, + "texts": { + "setMaxBucketSize": "Set the maximum file size allowed in the bucket.", + "created": "Created:", + "lastUpdated": "Last Updated:", + "enableFileSecurity": "When file security is enabled, users will be able to access files for which they have been granted", + "fileAndBucketPermission": "either File or Bucket permissions", + "fileDisabled": "If file security is disabled, users can access files", + "onlyBucketPermission": "only if they have Bucket permissions", + "ignorePermission": "File permissions will be ignored..", + "enableDisableSecurityService": "Enable or disable security services for the bucket including", + "encruption": "Ecryption", + "and": "and", + "antivirusScanning": "Antivirus scanning.", + "antivirus": "Antivirus", + "configureEncruption": "This parameter allows you to configure whether or not the files inside the bucket will be encrypted. We don't encrypt files bigger than 20MB.", + "configureAntivirus": "This parameter allows you to configure whether or not the files inside the bucket should be scanned by the Appwrite Antivirus scanner.", + "chooseCompressionAlgo": "Choose an algorithm for compression. For files larger than 20MB, compression will be skipped even if it's enabled.", + "allowedFileExtensions": "Allowed file extensions. A maximum of 100 file extensions can be added. Leave blank to allow all file types." + } + }, + "components": { + "inputs": { + "team": { + "placeholder": "Search by name or ID" + }, + "user": { + "placeholder": "Search by name, email, phone or ID" + } + } + } + }, + "button": { + "createUser": "Create user", + "clearSearch": "Clear Search", + "account": "account", + "email": "email", + "phone": "phone", + "createTeam": "Create team", + "createIndex": "Create index", + "createMembership": "Create Membership", + "createDb": "Create database", + "createCollection": "Create Collection", + "createAttribute": "Create attribute", + "createDocument": "Create document", + "createDomain": "Create domain", + "documentation": "Documentation", + "createBucket": "Create bucket", + "items": "Items", + "addItem": "Add item", + "test": "test", + "addEvent": "Add event", + "addAttribute": "Add attribute", + "createWebhook": "Create webhook", + "createApiKey": "Create API Key", + "createFunction": "Create function", + "createVariable": "Create variable", + "createFile": "Create File", + "createDeployment": "Create deployment", + "viewApiKeys": "View API Keys", + "deselectAll": "Deselect all", + "selectAll": "Select all", + "cancel": "Cancel", + "buildLogs": "Build logs", + "download": "Download", + "feedback": "Feedback", + "close": "Close", + "next": "Next", + "back": "Back", + "skipSteps": "Skip optional steps", + "exit": "Exit", + "addRole": "Add role", + "customPermission": "custom permission", + "rawData": "Raw data", + "scrollToTop": "Scroll to top", + "button": "Button", + "platforms": "Platforms", + "apiKeys": "API Keys", + "submit": { + "create": "Create", + "update": "Update", + "addPrefs": "Add Preference", + "addPlatform": "Add platform", + "delete": "Delete", + "deleteAll": "Delete All", + "verify": "Verify", + "regenerate": "Regenerate", + "regenerateKey": "Regenerate Key", + "executeNow": "Execute Now", + "activate": "Activate", + "downloadEnv": "Download .env file", + "importEnv": "Import .env file", + "add": "Add", + "submit": "Submit" + }, + "pill": { + "userId": "User ID" + }, + "dropdown": { + "edit": "Edit", + "createIndex": "Create Index", + "overview": "Overview", + "ninty": "90d", + "thirty": "30d", + "twentyFour": "24h", + "newOrg": "New organization", + "yourAccount": "Your Account", + "signOut": "Sign Out", + "any": "Any", + "allGuests": "All guests", + "allUsers": "All users", + "selectUsers": "Select users", + "selectTeams": "Select teams", + "currentPermission": "Custom permission" + } + }, + "texts": { + "emptySearch": { + "phraseOne": "Sorry, we couldn't find", + "phraseTwo": "There are no users that match your search." + }, + "oAuthProvider": { + "uri": "URI", + "textOne": "To use", + "phraseOne": "authentication in your application, first fill in this form. For more info you can" + }, + "security": { + "passwordDictionary": "Enabling this option prevent users from setting insecure passwords by comparing the user's password with the", + "passwordHistory": { + "phraseOne": "Enabling this option prevents users from reusing recent passwords by comparing the new password with their password history.", + "phraseTwo": "Set the maximum number of passwords saved per user. Maximum 20 passwords." + }, + "sessionLength": "If you reduce the limit, users who are currently logged in will be logged out of the application.", + "sessionLimit": "Maximum number of active sessions allowed per user.", + "usersLimit": "Limit new users from signing up for your project, regardless of authentication method. You scan still create users and team memberships from your Appwrite console.", + "limited": "limited", + "unlimited": "unlimited" + }, + "settings": "Enable the authentication methods you wish to use.", + "teams": { + "members": "members", + "searchData": { + "phaseOne": "Sorry, we couldn’t find", + "phaseTwo": "There are no teams that match your search.", + "phaseThree": "There are no members that match your search." + }, + "updatePrefs": "You can update your team's preferences by storing shared information on the teams's objects so they can easily be shared across members.", + "deleteTeam": "Are you sure you want to delete", + "deleteMember": "Are you sure you want to delete", + "from": "from", + "dangerZone": " The team will be permanently deleted, including all data associated with this team. This action is irreversible.", + "createdOn": "Created on" + }, + "databases": { + "newDb": "Create a new database", + "delete": "Are you sure you want to delete", + "docFrom": "the document from", + "created": "Created:", + "lastUpdated": "Last Updated:", + "settings": "The database will be permanently deleted, including all data associated with this team. This action is irreversible.", + "createAttribute": { + "heading": "Create your first attribute to get started.", + "note": "Need a hand? Learn more in our documentation." + }, + "totalResult": "Total results:", + "from": "from", + "twoWayRelationship": "This is a two way relationship and the corresponding relationship will also be deleted.", + "irreversibleAction": "This action is irreversible.", + "deleteRelation": "Delete relationship between", + "deleteDocFrom": "Delete document from", + "to": "to", + "documentsPage": { + "para": { + "phraseOne": "Assign read or write permissions at the", + "collectionLevel": "Collection Level", + "or": "or", + "documentLevel": "Document Level", + "phraseTwo": "If collection Level permissions are assigned, permissions applied to individual documents are ignored." + } + }, + "deleteDocWarning": "The document will be permanently deleted, including all the data within it. This action is irreversible.", + "updateDocument": "Update document data based on the attributes created earlier.", + "deleteCollection": "The collection will be permanently deleted, including all the documents within it. This action is irreversible.", + "displayName": "Set string attributes with maximum 50 characters to be used as a display name in the Appwrite console. Maximum 5 names.", + "updatePermission": { + "collectionAndDocumentation": "Choose who can access your collection and documents. For more information, check out the", + "permissionGuide": "Permissions Guide" + }, + "updateSecurity": { + "phraseOne": "When document security is enabled, users will be able to access documents for which they have been granted", + "eitherDocOrCollection": "either Document or Collection permissions", + "collectionPermission": "only if they have Collection permissions", + "documentPermission": "Document permissions will be ignored." + }, + "wizards": { + "stepOne": "Provide document data based on attributes you created earlier." + } + }, + "users": { + "updatePrefs": "You can update your user preferences by storing information on the user's objects so they can easily be shared across devices and sessions.", + "updatePassword": { + "phaseOne": "Enter a new password. A password must contain", + "phaseTwo": "at least 8 characters." + }, + "noMembership": "No memberships available", + "noSessions": "No sessions available", + "deleteUser": { + "phaseOne": "Are you sure you want to delete", + "from": "from" + }, + "deleteSession": "Are you sure you want to delete this session?", + "deleteMembership": { + "phaseOne": "Are you sure you want to delete", + "from": "from" + }, + "deleteAllSession": { + "phaseOne": "Are you sure you want to delete", + "allOf": "all of", + "sessions": "sessions" + }, + "dangerZone": "The user will be permanently deleted, including all data associated with this user. This action is irreversible.", + "on": "on" + }, + "consoleSettings": { + "deleteProject": { + "phraseOne": "This project will be deleted", + "phraseTwo": "along with all of its metadata, stats, and other resources.", + "phraseThree": "This action is irreversible" + }, + "accessService": "Access Appwrite services using your API Endpoint and Project ID.", + "options": "Choose services you wish to enable or disable.", + "deleteAll": "The project will be permanently deleted, including all the metadata, resources and stats within it. This action is irreversible.", + "lastUpdated": "Last Updated:", + "delete": { + "phaseOne": "Are you sure you want to delete", + "from": "from" + }, + "verifiedDomain": "Domain has been verified", + "pendingDomain": "Domain is pending verification", + "dnsDoc": "You can find a list of domain providers and their DNS setting documentation", + "domainProvider": "If your domain provider isn't listed, please contact us, and we'll include their settings as well.", + "dnsProvider": "In order to continue, set the following record on your DNS provider", + "time": "Changes may take some time to take effect depending on your provider." + }, + "webhooks": { + "deletePermanently": "The webhook will be permanently deleted. This action is irreversible.", + "lastUpdated": "Last Updated:", + "delete": { + "phaseOne": "Are you sure you want to delete", + "from": "from" + }, + "generateKey": "Are you sure you want to generate a new Signature Key?", + "noRecoveryKey": "You will not be able to recover your current key.", + "triggerWebhook": "Set the events that will trigger your webhook. Maximum 100 events allowed.", + "addEvent": "Add an event to get started", + "selectEvent": "Select events in your Appwrite project that will trigger your webhook.", + "learnMore": "Learn more about Appwrite Events", + "httpAuth": "Set an optional basic HTTP authentication username and password to protect your endpoint from unauthorized access.", + "secureEndpoints": "Use to secure your endpoint from untrusted sources.", + "addSignature": "Add the Signature Key to the X-Appwrite-Webhook-Signature header to validate your webhooks.", + "webhookValidation": "Learn more about webhook validation." + }, + "overview": { + "noData": "No data to show", + "realtimeGetStarted": "Get started with Realtime", + "sdks": "Our SDK's make it possible to easily add any platform that you want to use.", + "addPlatform": "Add a Platform to View Data About Your Project", + "insights": "Get insights on bandwidth usage, requests, realtime connections and more after making your first API call", + "scopePermission": "Choose which permission scopes to grant your application. It is best practice to allow only the permissions you need to meet your project goals.", + "createApiKey": "Let's create an API Key.", + "deletePermanent": "The API Key will be permanently deleted. This action is irreversible.", + "lastAccessed": "Last accessed:", + "scopeGranted": "Scopes granted:", + "chooseName": "Choose any name that will help you distinguish between API keys.", + "permissionScope": "You can choose which permission scope to grant your application. It is a best practice to allow only the permissions you need to meet your project goals.", + "readyTogo": "You're ready to go", + "congratulations": "Congrats, you've just added your first platform to your Appwrite dashboard! Are you ready to give it a go? Why not add a database to your project, or start uploading files? The choice is up to you.", + "choosePlatform": "Choose any name that will help you distinguish between platforms.", + "deletePlatform": "The Platform will be permanently deleted. This action is irreversible.", + "deletePlatformPermanent": "The Platform will be permanently deleted. This action is irreversible.", + "packageName": "Your package name is generally the applicationId in your app-level build.gradle file.", + "bundleId": "You can find your Bundle Identifier in the General tab for your app's primary target in Xcode.", + "applicationName": "Your application name.", + "hostName": "You can use * to allow wildcard hostnames or subdomains.", + "realTime": "Realtime Connections", + "setExpireDate": "Set a date after which your API Key will expire.", + "expiredApiKey": "Your API Key has expired", + "deleteExpiredKey": "For security reasons, we recommend you delete your expired key and create a new one.", + "keyToExpire": "Your API Key is about to expire", + "updateExpireDate": "Update the expiration date to keep the key active", + "expireWarning": "Your key will expire in" + }, + "functions": { + "createNewFunction": "Create a new function", + "createVariable": "Create a variable (or secret key) that will be passed to your function at runtime.", + "setVariable": "Set the variables (or secret keys) that will be passed to your function at runtime.", + "getStartedVar": "Create a variable to get started", + "setCron": "Set a Cron schedule to trigger your function. Leave blank for no schedule.", + "moreDetailsCronSyntax": "More details on Cron syntax here", + "setEvents": "Set the events that will trigger your function. Maximum 100 events allowed.", + "addEvent": "Add an event to get started", + "selectEvents": "Select events in your Appwrite project that will trigger your function.", + "learnMore": "Learn more about Appwrite Events", + "setPermission": "Choose who can execute this function using the client API. For more information, check out the", + "permissionGuide": "Permissions Guide", + "createYourFunction": "Create your function", + "createFunction": "Let’s create a function.", + "functionId": "Function ID:", + "deploymentId": "Deployment ID:", + "createdAt": "Created at:", + "updatedAt": "Updated at:", + "entryPoint": "Entrypoint:", + "totalVariables": "Total variables:", + "noInactiveDeployments": "You have no inactive deployments. Create one to see it here.", + "learnDeployments": " Learn more about deployments in our Documentation.", + "uploadVariables": "Upload multiple variables via a .env file that will be passed to your function at runtime.", + "permanentDelete": "Are you sure you want to delete this function and all associated deployments from your project?", + "timeLimit": "Limit the execution time of your function. Maximum value is 900 seconds (15 minutes).", + "permanentActionDelete": "The function will be permanently deleted, including all deployments associated with it. This action is irreversible.", + "noExecutionLogs": "You have no execution logs. Create and activate a deployment to see it here.", + "needHand": "Need a hand? Learn more in our documentation", + "executions": "Executions", + "errors": "Errors" + }, + "storage": { + "addNewBucket": "Add a new bucket", + "deleteWarning": "Are you sure you want to delete", + "accessPermission": "Choose who can access your buckets and files. For more information, check out the", + "permissionGuide": "Permissions Guide", + "fileSecurity": { + "enable": "File security enabled", + "disable": "File security disabled" + }, + "userAccessability": "Users will be able to access this file if they have been granted", + "fileAndBucketPermission": "either File or Bucket permissions", + "assignFilePermission": "If you want to assign file permissions, navigate to Bucket settings and enable file security. Otherwise, only Bucket permissions will be used.", + "couldNotFind": "Sorry, we couldn’t find", + "noMatchingFiles": "There are no files that match your search.", + "permanentDeleteBucket": "The bucket will be permanently deleted, including all the files within it. This action is irreversible.", + "permanentDeleteFile": "The file will be permanently deleted. This action is irreversible.", + "lastUpdated": "Last Updated:", + "created": "Created:", + "size": "Size:", + "mime": "MIME Type:", + "readWritePermission": "Assign read or write permissions at the Bucket Level or File Level. If Bucket Level permissions are enabled, file permissions will be ignored." + }, + "components": { + "create": "Create your first", + "getStarted": "to get started.", + "needHand": "Need a hand? Learn more in our documentation.", + "pagination": { + "totalResult": "Total results:", + "uploadingFiles": "Uploading files" + }, + "custom": { + "permissions": "Custom permissions allow you to grant access to specific users or teams using their ID and role.", + "permissionFormation": "A permission should be formatted as:", + "user": "user:", + "or": "or", + "team": "team:" + }, + "addRole": "Add a role to get started", + "totalResult": "Total results:", + "couldNotFind": "Sorry we couldn't find", + "noTeamMembers": "There are no teams that match your search.", + "noUserExist": "There are no Users that match your search.", + "noUsers": "You have no users. Create a user to see them here.", + "noTeams": "You have no teams. Create a team to see them here.", + "needHelp": "Need a hand? Learn more in our", + "email": "Email:", + "phone": "Phone:", + "members": "Members:", + "notFound": "Not found.", + "grantAccessSpecificTeamMember": "Grant access to any member of a specific team. To grant access to team members with specific roles, you will need to set a", + "grantAccessToUser": "Grant access to any authenticated or anonymous user.", + "lastUpdated": "Last Updated", + "firstPlatform": "Create your first platform to get started." + }, + "footer": { + "version": "Version", + "terms": "Terms", + "privacy": "Privacy", + "allRightReserved": "Appwrite. All rights reserved." + }, + "logs": { + "functionId": "Function ID:", + "deploymentId": "Deployment ID:", + "executionId": "Execution ID:" + }, + "unAuthenticated": "Integrate with your favourite technologies", + "wizardExitModle": { + "areYouSure": "Are you sure you want to exit from", + "dataDelete": "All data will be deleted. This action is irreversible." + } + }, + "table": { + "header": { + "name": "Name", + "roles": "Roles", + "identifiers": "Identifiers", + "status": "Status", + "id": "ID", + "documentId": "Document ID", + "executionId": "Execution ID", + "trigger": "Trigger", + "duration": "Duration", + "ip": "IP", + "joined": "Joined", + "members": "Members", + "created": "Created", + "browserAndDevice": "Browser and Device", + "sessions": "Sessions", + "location": "Location", + "deleteDatabase": "Delete Database", + "key": "Key", + "type": "Type", + "value": "Value", + "attributes": "Attributes", + "asc_dsc": "Asc/Desc", + "defaultValue": "Default Value", + "relation": "Relation", + "filename": "Filename", + "role": "Role", + "create": "Create", + "read": "Read", + "update": "Update", + "delete": "Delete", + "settings": "Settings", + "domainName": "Domain Name", + "postUrl": "POST URL", + "events": "Events", + "lastAccessed": "last accessed", + "expirationDate": "expiration date", + "scopes": "Scopes", + "buildTime": "Build Time", + "size": "Size", + "any": "Any", + "guests": "Guests", + "users": "Users" + }, + "pill": { + "verify": "verified", + "emailVerify": "verified email", + "phoneVerify": "verified phone", + "unverify": "unverified", + "block": "blocked", + "userId": "User ID", + "teamId": "Team ID", + "webhookId": "Webhook ID", + "required": "Required", + "pending": "Pending", + "collectionId": "Collection ID", + "recommended": "recommended", + "dbId": "Database ID", + "currentSession": "current session", + "disabled": "disabled", + "documentId": "Document ID", + "functionId": "Function ID", + "fileId": "File ID", + "bucketId": "Bucket ID", + "failed": "Failed", + "sllTlsDisabled": "SLL/TLS disabled", + "apiKeySecret": "API Key Secret", + "columns": "Columns" + } + }, + "legends": { + "teams": { + "users": "Registered users", + "create": "Users created", + "read": "Users read", + "update": "Users updated", + "delete": "Users deleted" + }, + "databases": { + "databases": "Total databases", + "create": "Databases created", + "read": "Databases read", + "update": "Databases updated", + "delete": "Databases deleted", + "usage": { + "collections": "Total collections", + "create": "Collections created", + "read": "Collections read", + "update": "Collections updated", + "delete": "Collections deleted" + }, + "documents": { + "documents": "Total documents", + "create": "Documents created", + "read": "Documents read", + "update": "Documents updated", + "delete": "Documents deleted" + } + }, + "settings": { + "domain": { + "addDomain": "Add your domain", + "addCname": "Add a CNAME Record", + "verifyDomain": "Verify domain", + "sslCertificate": "SSL Certificate" + }, + "webhooks": { + "addWebhooks": "Add your webhook", + "events": "Webhook events", + "security": "Security" + } + }, + "overview": { + "details": "Details", + "scopes": "Scopes" + }, + "functions": { + "details": "Details", + "excecuteAccess": "Execute access", + "events": "Events", + "schedule": "Schedule", + "variables": "Variables" + }, + "storage": { + "buckets": "Total buckets", + "create": "Buckets created", + "read": "Buckets read", + "update": "Buckets updated", + "delete": "Buckets deleted", + "usage": { + "files": "Files", + "create": "Files created", + "read": "Files read", + "update": "Files updated", + "delete": "Files deleted" + } + } + }, + "navbar": { + "header": { + "users": "Users", + "teams": "Teams", + "usage": "Usage", + "security": "Security", + "settings": "Settings" + }, + "userHeader": { + "overview": "Overview", + "membership": "Memberships", + "sessions": "Sessions", + "activity": "Activity" + }, + "teamHeader": { + "overview": "Overview", + "members": "Members", + "activity": "Activity" + }, + "databases": { + "databases": "Databases", + "usage": "Usage", + "collections": "Collections", + "settings": "Settings", + "dbCollection": { + "documents": "Documents", + "activity": "Activity", + "indexes": "Indexes", + "attribute": "Attributes", + "usage": "Usage", + "settings": "Settings" + }, + "document": { + "overview": "Overview", + "data": "Data", + "activity": "Activity" + } + }, + "settings": { + "overview": "Overview", + "customDomains": "Custom Domains", + "webhooks": "Webhooks" + }, + "platforms": { + "web": "Web App", + "flutter": "Flutter App", + "apple": "Apple App", + "android": "Android App" + }, + "functions": { + "deployments": "Deployments", + "usage": "Usage", + "executions": "Executions", + "settings": "Settings" + }, + "storage": { + "buckets": "Buckets", + "usage": "Usage", + "files": "Files", + "settings": "Settings" + }, + "sideNavigation": { + "overview": "Overview", + "auth": "Auth", + "databases": "Databases", + "functions": "Functions", + "storage": "Storage", + "settings": "Settings" + } + }, + "links": { + "oAuthProvider": { + "visitDoc": "visit the docs." + }, + "passwordDictionary": "10k most commonly used passwords.", + "support": "Support" + }, + "alert": { + "oAuthProvider": { + "fieldOne": "To complete set up, add this OAuth2 redirect URI to your", + "fieldTwo": "app configuration." + }, + "teams": { + "createMembership": "Roles are used to manage access permissions. You can create any role you want." + }, + "databases": { + "title": { + "documentSecurity": { + "enabled": "Document security is enabled", + "disabled": "Document security is disabled" + }, + "userPermission": "Users will be able to access this document if they have been granted", + "collectionPermission": "either Document or Collection permissions.", + "permissionCheck": "If you want to assign document permissions, navigate to Collection settings and enable document security. Otherwise, only Collection permissions will be used." + }, + "relationshipSettings": "To change the selection edit the relationship settings." + } + }, + "components": { + "pagination": { + "prev": "Prev", + "next": "Next" + } + }, + "mock": { + "content": "Content", + "list": "list", + "other": "other", + "title": { + "stepOne": "step-1", + "stepTwo": "step-2", + "subStepOne": "sub-title-1", + "subStepTwo": "sub-title-2" + }, + "inputs": { + "label": { + "stepOneFirst": "step-1-required", + "stepOneSecond": "step-1-optional", + "labelStepOne": "label-step-1", + "stepTwoFirst": "step-2-first", + "stepTwoSecond": "step-2-second", + "labelStepTwo": "label-step-2" + } + } + } + } + }, + + "components": { + "notification": { + "sentPswdLink": "We have sent you an email with a password reset link", + "pswdUpdatedSuccessfully": "Password has been updated successfully", + "loginSuccessfully": "Successfully logged in.", + "hasBeenCreated": "has been created", + "hasBeenUpdated": "has been updated", + "hasBeenDeleted": "has been deleted", + "accountDeleted": "Account was deleted", + "sessionDeleted": "Session has been deleted", + "allSessionDeleted": "All sessions have been deleted", + "functionDeleted": "Function has been deleted", + "membershipDeleted": "Membership has been deleted", + "indexDeleted": "Index has been deleted", + "indexCreated": "Index has been created", + "webhookHasBeenCreated": "Webhook has been created", + "webhookUrlHasBeenCreated": "Webhook url has been created", + "webhookSecurityHasBeenCreated": "Webhook security has been updated", + "webhookNameHasBeenCreated": "Webhook name has been updated", + "webhookEventsHasBeenCreated": "Webhook events has been updated", + "keyRegenerated": "Key has been regenerated", + "fileUpload": "File has been uploaded", + "nameUpdated": "Name has been updated", + "emailUpdated": "Email has been updated", + "pswdUpdated": "Password has been updated", + "updatePrefs": "Preferences have been updated", + "phoneUpdated": "Phone has been updated", + "authUpdated": "authentication has been updated", + "projectUserLimitUpdated": "Updated project users limit successfully", + "platformNameUpdated": "Platform name has been updated", + "apiKeyExpirationUpdated": "API Key expiration has been updated", + "apiKeyNameUpdated": "API Key name has been updated", + "apiKeyScopeUpdated": "API Key scopes have been updated", + "securityUpdated": "Security has been updated", + "permissionsUpdated": "Permissions have been updated", + "displayNameUpdated": "Display names has been updated", + "cronUpdated": "Cron Schedule has been updated", + "timeOutUpdated": "Timeout has been updated", + "variablesUpdated": "variables have been updated", + "platformHostnameUpdated": "Platform hostname have been updated", + "platformPackageNameUpdated": "Platform Package Name has been updated", + "platformBundleIdUpdated": "Platform Bundle ID has been updated", + "projectNameUpdated": "Project name has been updated", + "documentCreated": "Document has been created", + "documentDeleted": "Document has been deleted", + "documentWasUpdated": "Document was updated!", + "attributeDeleted": "Attribute has been deleted", + "sessionLimitUpdated": "Sessions limit has been updated", + "pswdHistoryLimitUpdated": "Updated password history limit.", + "pswdDictonaryCheck": "Updated password dictionary check.", + "functionExecuted": "Function has been executed", + "deploymentDeleted": "Deployment has been deleted", + "deploymentActivated": "Deployment has been activated", + "variablesUploaded": "Variables uploaded", + "wasDeletedFrom": "was deleted from", + "inviteSentTo": "Invite has been sent to", + "yourExperience": "How is your experience with our new 'Relationships' feature? We'd love to hear your feedback!", + "attribute": "Attribute", + "theAccount": "The account", + "serviceHasBeen": "service has been", + "hasBeen": "has been", + "verified": "verified", + "unVerfied": "unverified", + "blocked": "blocked", + "unBlocked": "blocked", + "enabled": "enabled", + "disabled": "disabled" + } + } +} diff --git a/src/i18n/en/index.ts b/src/i18n/en/index.ts new file mode 100644 index 0000000000..17d0c8e2b6 --- /dev/null +++ b/src/i18n/en/index.ts @@ -0,0 +1,6 @@ +import type { BaseTranslation } from '../i18n-types'; +import engJson from './en.json'; + +const en: BaseTranslation = engJson; + +export default en; diff --git a/src/i18n/formatters.ts b/src/i18n/formatters.ts new file mode 100644 index 0000000000..2d4bb859c8 --- /dev/null +++ b/src/i18n/formatters.ts @@ -0,0 +1,11 @@ +import type { FormattersInitializer } from 'typesafe-i18n'; +import { date } from 'typesafe-i18n/formatters'; +import type { Formatters, Locales } from './i18n-types'; + +export const initFormatters: FormattersInitializer = (locale: Locales) => { + const formatters: Formatters = { + weekday: date(locale, { weekday: 'long' }) + }; + + return formatters; +}; diff --git a/src/i18n/i18n-svelte.ts b/src/i18n/i18n-svelte.ts new file mode 100644 index 0000000000..6cdffb3e51 --- /dev/null +++ b/src/i18n/i18n-svelte.ts @@ -0,0 +1,12 @@ +// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. +/* eslint-disable */ + +import { initI18nSvelte } from 'typesafe-i18n/svelte' +import type { Formatters, Locales, TranslationFunctions, Translations } from './i18n-types' +import { loadedFormatters, loadedLocales } from './i18n-util' + +const { locale, LL, setLocale } = initI18nSvelte(loadedLocales, loadedFormatters) + +export { locale, LL, setLocale } + +export default LL diff --git a/src/i18n/i18n-types.ts b/src/i18n/i18n-types.ts new file mode 100644 index 0000000000..32d2510080 --- /dev/null +++ b/src/i18n/i18n-types.ts @@ -0,0 +1,21 @@ +// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. +/* eslint-disable */ +import type { BaseTranslation as BaseTranslationType } from 'typesafe-i18n' + +export type BaseTranslation = BaseTranslationType +export type BaseLocale = 'en' + +export type Locales = + | 'de' + | 'en' + | 'it' + +export type Translation = RootTranslation + +export type Translations = RootTranslation + +type RootTranslation = {} + +export type TranslationFunctions = {} + +export type Formatters = {} diff --git a/src/i18n/i18n-util.async.ts b/src/i18n/i18n-util.async.ts new file mode 100644 index 0000000000..8ea5971d4e --- /dev/null +++ b/src/i18n/i18n-util.async.ts @@ -0,0 +1,28 @@ +// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. +/* eslint-disable */ + +import { initFormatters } from './formatters' +import type { Locales, Translations } from './i18n-types' +import { loadedFormatters, loadedLocales, locales } from './i18n-util' + +const localeTranslationLoaders = { + de: () => import('./de'), + en: () => import('./en'), + it: () => import('./it'), +} + +const updateDictionary = (locale: Locales, dictionary: Partial): Translations => + loadedLocales[locale] = { ...loadedLocales[locale], ...dictionary } + +export const importLocaleAsync = async (locale: Locales): Promise => + (await localeTranslationLoaders[locale]()).default as unknown as Translations + +export const loadLocaleAsync = async (locale: Locales): Promise => { + updateDictionary(locale, await importLocaleAsync(locale)) + loadFormatters(locale) +} + +export const loadAllLocalesAsync = (): Promise => Promise.all(locales.map(loadLocaleAsync)) + +export const loadFormatters = (locale: Locales): void => + void (loadedFormatters[locale] = initFormatters(locale)) diff --git a/src/i18n/i18n-util.sync.ts b/src/i18n/i18n-util.sync.ts new file mode 100644 index 0000000000..4b8472f259 --- /dev/null +++ b/src/i18n/i18n-util.sync.ts @@ -0,0 +1,28 @@ +// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. +/* eslint-disable */ + +import { initFormatters } from './formatters' +import type { Locales, Translations } from './i18n-types' +import { loadedFormatters, loadedLocales, locales } from './i18n-util' + +import de from './de' +import en from './en' +import it from './it' + +const localeTranslations = { + de, + en, + it, +} + +export const loadLocale = (locale: Locales): void => { + if (loadedLocales[locale]) return + + loadedLocales[locale] = localeTranslations[locale] as unknown as Translations + loadFormatters(locale) +} + +export const loadAllLocales = (): void => locales.forEach(loadLocale) + +export const loadFormatters = (locale: Locales): void => + void (loadedFormatters[locale] = initFormatters(locale)) diff --git a/src/i18n/i18n-util.ts b/src/i18n/i18n-util.ts new file mode 100644 index 0000000000..45c6935871 --- /dev/null +++ b/src/i18n/i18n-util.ts @@ -0,0 +1,39 @@ +// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. +/* eslint-disable */ + +import { i18n as initI18n, i18nObject as initI18nObject, i18nString as initI18nString } from 'typesafe-i18n' +import type { LocaleDetector } from 'typesafe-i18n/detectors' +import type { LocaleTranslationFunctions, TranslateByString } from 'typesafe-i18n' +import { detectLocale as detectLocaleFn } from 'typesafe-i18n/detectors' +import { initExtendDictionary } from 'typesafe-i18n/utils' +import type { Formatters, Locales, Translations, TranslationFunctions } from './i18n-types' + +export const baseLocale: Locales = 'en' + +export const locales: Locales[] = [ + 'de', + 'en', + 'it' +] + +export const isLocale = (locale: string): locale is Locales => locales.includes(locale as Locales) + +export const loadedLocales: Record = {} as Record + +export const loadedFormatters: Record = {} as Record + +export const extendDictionary = initExtendDictionary() + +export const i18nString = (locale: Locales): TranslateByString => initI18nString(locale, loadedFormatters[locale]) + +export const i18nObject = (locale: Locales): TranslationFunctions => + initI18nObject( + locale, + loadedLocales[locale], + loadedFormatters[locale] + ) + +export const i18n = (): LocaleTranslationFunctions => + initI18n(loadedLocales, loadedFormatters) + +export const detectLocale = (...detectors: LocaleDetector[]): Locales => detectLocaleFn(baseLocale, locales, ...detectors) diff --git a/src/i18n/it/index.ts b/src/i18n/it/index.ts new file mode 100644 index 0000000000..899830acc7 --- /dev/null +++ b/src/i18n/it/index.ts @@ -0,0 +1,6 @@ +import type { Translation } from '../i18n-types'; +import itJson from './it.json'; + +const it: Translation = itJson; + +export default it; diff --git a/src/i18n/it/it.json b/src/i18n/it/it.json new file mode 100644 index 0000000000..ebf0b8589b --- /dev/null +++ b/src/i18n/it/it.json @@ -0,0 +1,1861 @@ +{ + "auth": { + "title": { + "missingRedirectUrl": "URL di reindirizzamento mancante" + }, + "texts": { + "magicUrl": { + "loginFlow": "Nel flusso di accesso di Magic URL manca un URL di reindirizzamento corretto. Si prega di controllare il", + "magicDocs": "Magic URL docs", + "sendMsg": "e invia la richiesta di una nuova sessione con un URL di reindirizzamento valido." + }, + "oAuth": { + "loginFlow": "Nel flusso di accesso OAuth manca un URL di reindirizzamento corretto. Si prega di controllare il", + "oAuthDocs": "OAuth docs", + "sendRequest": "e invia la richiesta di una nuova sessione con un URL di callback valido." + } + } + }, + + "login": { + "title": "Accedi", + "forms": { + "login": { + "inputs": { + "email": { + "label": "E-mail", + "placeholder": "E-mail" + }, + "password": { + "label": "Password", + "placeholder": "Password" + } + } + } + }, + "button": { + "submit": { + "login": "Accedi" + } + }, + "links": { + "recovery": "Password dimenticata", + "register": "Iscriviti" + } + }, + + "register": { + "title": "Iscriviti", + "forms": { + "register": { + "inputs": { + "name": { + "label": "Nome", + "placeholder": "Il tuo nome" + }, + "email": { + "label": "E-mail", + "placeholder": "La tua e-mail" + }, + "password": { + "label": "Password", + "placeholder": "La tua password" + }, + "terms": { + "label": "Termini" + } + } + }, + "invite": { + "inputs": { + "name": { + "label": "Nome", + "placeholder": "Il tuo nome" + }, + "email": { + "label": "E-mail", + "placeholder": "La tua e-mail" + }, + "password": { + "label": "Password", + "placeholder": "La tua password" + }, + "code": { + "label": "Codice", + "placeholder": "Il tuo codice" + } + } + } + }, + "button": { + "submit": { + "register": "Iscriviti" + } + }, + "links": { + "login": "Accedi" + }, + "texts": { + "registery": "Hai già un account?", + "privacyPolicy": { + "phraseOne": "Registrandoti, accetti di aver letto, compreso e riconosciuto il nostro", + "privacy": "Informativa sulla privacy", + "phraseTwo": "e accetta il nostro", + "generalTerm": "Condizioni generali d'uso" + } + } + }, + + "recover": { + "title": { + "pageHeader": "Recupera", + "pageTitle": "Recupero password" + }, + "forms": { + "resetPassword": { + "inputs": { + "email": { + "label": "E-mail", + "placeholder": "E-mail" + }, + "password": { + "label": "Nuova password", + "placeholder": "Inserisci password" + }, + "cnfPassword": { + "label": "Conferma password", + "placeholder": "Conferma password" + } + } + } + }, + "button": { + "submit": { + "update": "Update", + "recover": "Recupera" + } + }, + "links": { + "register": "Iscriviti", + "login": "Accedi" + } + }, + + "invite": { + "title": { + "pageHeader": "Accetta invito", + "invalidInvite": "Invito non valido", + "invite": "Invita" + }, + "alerts": { + "warningAlert": { + "phraseOne": "Il link di invito non è valido", + "phraseTwo": "Chiedi al proprietario del progetto di inviarti un nuovo invito." + }, + "successAlert": "Sei stato invitato a partecipare a un progetto di gruppo su Appwrite" + }, + "button": { + "submit": { + "cancel": "Annulla", + "accept": "Accetta" + }, + "accept": { + "register": "Iscriviti ad Appwrite" + } + }, + "texts": { + "privacyPolicy": { + "phraseOne": "Accettando l'invito, accetti il", + "termsAndCond": "Termini e condizioni", + "and": "e", + "privacy": "Informativa sulla e privacy" + } + }, + "forms": { + "invite": { + "inputs": { + "terms": { + "label": "Termini" + } + } + } + } + }, + + "console": { + "forms": { + "createOrg": { + "title": "Crea nuova organizzazione", + "inputs": { + "name": { + "label": "Nome", + "placeholder": "Inserisci il nome" + } + } + }, + "inputSwitch": { + "enable": "abilita", + "disabled": "disabilitato" + } + }, + "button": { + "cancel": "Annulla", + "backToConsole": "Torna alla console", + "submit": { + "create": "Crea" + } + }, + "table": { + "pill": { + "orgId": "ID organizzazione" + } + }, + "account": { + "title": { + "user": "Utente", + "organizations": "Organizzazioni", + "deleteAccount": "Elimina account" + }, + "forms": { + "updateName": { + "title": "Nome", + "inputs": { + "name": { + "label": "Nome", + "placeholder": "Inserisci il nome" + } + } + }, + "updateEmail": { + "title": "E-mail", + "inputs": { + "email": { + "label": "E-mail", + "placeholder": "Inserisci email" + }, + "password": { + "label": "Password", + "placeholder": "Inserisci password" + } + } + }, + "updatePassword": { + "title": "Password", + "inputs": { + "oldPassword": { + "label": "Vecchia Password", + "placeholder": "Inserisci password" + }, + "newPassword": { + "label": "Nuova Password", + "placeholder": "Inserisci password" + } + }, + "texts": { + "forgotPassword": "Hai dimenticato la password?", + "recoverPassword": "Recupera la tua password" + } + } + }, + "button": { + "submit": { + "update": "Aggiorna", + "cancel": "Annulla", + "delete": "Annulla" + }, + "logout": "Esci", + "documentation": "Documentazione", + "createOrg": "Crea organizzazione", + "logoutAllSessions": "Esci da tutte le sessioni" + }, + "texts": { + "members": "membri", + "createOrg": "Crea una nuova organizzazione", + "noSession": "Nessuna sessione disponibile", + "totalResult": "Risultati totali:", + "deleteWarning": "Sei sicuro di voler eliminare il tuo account?", + "deleteAccount": " Il tuo account verrà eliminato in modo permanente e l'accesso a tutti i tuoi team e dati verrà perso. Questa azione è irreversibile." + }, + "navbar": { + "header": { + "overview": "Panoramica", + "sessions": "Sessioni", + "activity": "Activity", + "organization": "Organizzazioni" + } + }, + "table": { + "header": { + "client": "Cliente", + "location": "Posizione", + "ip": "IP" + }, + "trim": { + "on": "su" + }, + "texts": { + "unknown": "Sconosciuto" + }, + "pill": { + "alert": { + "current": "sessione corrente" + } + } + } + }, + "onboarding": { + "title": { + "onboarding": "Onboarding", + "coverTitle": "Creiamo il tuo primo progetto" + }, + "forms": { + "createProject": { + "inputs": { + "name": { + "label": "Nome progetto", + "placeholder": "Primo progetto Appwrite" + } + } + } + }, + "button": { + "submit": { + "create": "Crea progetto" + } + }, + "table": { + "pill": { + "projectId": "ID progetto" + } + } + }, + "organization": { + "title": { + "organizations": "Organizzazioni", + "projects": "Progetti", + "members": "Progetti" + }, + "forms": { + "updateName": { + "title": "Nome", + "inputs": { + "name": { + "label": "Nome", + "placeholder": "Inserisci il nome" + } + } + }, + "createMember": { + "title": "Invita membro", + "inputs": { + "email": { + "label": "E-mail", + "placeholder": "Inserisci email" + }, + "name": { + "label": "Nome (facoltativo)", + "placeholder": "Inserisci il nome" + } + } + }, + "createProject": { + "title": "Crea progetto", + "inputs": { + "name": { + "label": "Nome" + } + } + }, + "deleteOrg": { + "title": "Elimina organizzazione", + "texts": { + "phraseOne": "Sei sicuro di voler eliminare", + "phraseTwo": "? Tutti i progetti", + "phraseThree": "e i dati associati a questa organizzazione verranno eliminati. Questa azione è irreversibile.", + "orgSettings": "L'organizzazione verrà eliminata definitivamente, inclusi tutti i progetti ei dati associati a questa organizzazione. Questa azione è irreversibile." + } + }, + "limit": { + "inputs": { + "rows": { + "label": "Righe per pagina" + } + }, + "texts": { + "perPage": "per pagina", + "totalResult": "Risultati totali:" + } + } + }, + "table": { + "header": { + "name": "Nome", + "email": "E-mail" + }, + "pill": { + "projectId": "ID progetto", + "pending": "In attesa" + } + }, + "button": { + "submit": { + "create": "Crea", + "createProject": "Crea progetto", + "send": "Invia invito", + "update": "Aggiorna", + "cancel": "Annulla", + "delete": "Elimina" + }, + "invite": "Invita", + "resend": "rinvia" + }, + "texts": { + "dropDown": "Nuova organizzazione", + "apps": "apps", + "no": "no", + "members": "membri", + "createProject": "Crea un nuovo progetto" + }, + "navbar": { + "header": { + "projects": "Progetti", + "members": "Membri", + "settings": "Impostazioni" + } + } + }, + "project": { + "title": { + "auth": "Aut", + "createUser": "Crea utente", + "createTeam": "Crea squadra", + "createDb": "Crea database", + "createData": "Crea dati", + "createMembership": "Crea iscrizione", + "createCollection": "Crea raccolta", + "createIndex": "Crea indice", + "deleteUser": "Elimina utente", + "deleteSession": "Elimina sessioni", + "deleteAllSession": "Elimina tutte le sessioni", + "deleteMember": "Elimina membro", + "deleteDatabase": "Elimina database", + "deleteAttribute": "Elimina attributo", + "deleteCollection": "Elimina raccolta", + "deleteProject": "Elimina progetto", + "deleteTeam": "Elimina squadra", + "deleteDocument": "Elimina documento", + "deleteIndex": "Elimina indice", + "deleteDomain": "Elimina dominio", + "deleteWebhook": "Elimina webhook", + "deletePlatform": "Elimina piattaforma", + "exitProcess": "Processo di uscita", + "expirationDate": "data di scadenza", + "user": "Utente", + "team": "Squadra", + "schedule": "Programma", + "overview": "Panoramica", + "hostName": "Nome host", + "logs": "Registri", + "indexes": "Indici", + "buckets": "Secchi", + "services": "Secchi", + "console": "Console", + "bandwith": "Larghezza di banda", + "documents": "Documenti", + "addScopes": "Aggiungi ambiti", + "storage": "Archiviazione", + "bucket": "Secchio", + "variables": "Variabili", + "timeout": "Timeout", + "scopes": "Scopi", + "executeAccess": "Esegui accesso", + "customDomains": "Domini personalizzati", + "customPermission": "Autorizzazione personalizzata", + "documentSecurity": "Sicurezza documento", + "webhook": "Webhook", + "webhooks": "Webhooks", + "deployments": "Deployments", + "deleteFunction": "Elimina funzione", + "deleteBucket": "Elimina secchio", + "displayName": "Nome visualizzato", + "deleteFile": "Elimina file", + "teamPref": "Preferenze squadra", + "apiCredentials": "Credenziali API", + "active": "Attivo", + "inactive": "Inattivo", + "uploadVariables": "Carica variabili", + "data": "Dati", + "users": "Utenti", + "document": "Documento", + "functions": "Funzioni", + "executions": "Funzioni", + "integrations": "Integrazioni", + "metaData": "Metadati", + "permissions": "Autorizzazioni", + "attributes": "Attributi", + "database": "Database", + "databases": "Databases", + "collections": "Collezioni", + "oAuth2": "Impostazioni OAuth2", + "regenerateKey": "Rigenera chiave", + "signatureKey": "Chiave di firma", + "apiKey": "Chiave API", + "apiKeys": "Chiavi API", + "createApiKey": "Crea una chiave API", + "deleteApiKey": "Elimina chiave API", + "events": "Eventi", + "httpAuth": "Autenticazione HTTP", + "selectTeams": "Seleziona le squadre", + "selectUsers": "Seleziona utenti", + "platforms": "piattaforme", + "packageName": "nome del pacchetto", + "bundleId": "ID bundle", + "userData": { + "name": "Nome", + "email": "E-mail", + "phone": "Telefono", + "password": "Password", + "userPref": "Preferenze utente", + "deleteUser": "Elimina utente" + }, + "security": { + "title": "Sicurezza", + "passwordDictionary": "Dizionario delle password", + "passwordHistory": "Cronologia password", + "sessionLength": "Durata della sessione", + "sessionLimit": "Limite sessione", + "usersLimit": "Limite utenti" + }, + "settings": { + "header": "Impostazioni", + "authMethods": "Metodi di autenticazione", + "oauth2Providers": "Fornitori OAuth2" + }, + "wizards": { + "addYourDomain": "Aggiungi il tuo dominio", + "subTitle": "Utilizza il tuo dominio di proprietà come endpoint della tua API Appwrite." + }, + "overView": { + "getStartedGuid": "Guida introduttiva", + "addPlatform": "Aggiungi una piattaforma", + "integrateWithServer": "Integra con il tuo server" + } + }, + "forms": { + "createUser": { + "inputs": { + "name": { + "label": "Nome", + "placeholder": "Inserisci il nome" + }, + "email": { + "label": "E-mail", + "placeholder": "Inserisci email" + }, + "phone": { + "label": "Telefono", + "placeholder": "Inserisci telefono" + }, + "password": { + "label": "Password", + "placeholder": "Inserisci password" + } + } + }, + "createTeam": { + "inputs": { + "name": { + "label": "Nome", + "placeholder": "Inserisci il nome" + } + } + }, + "userData": { + "update": { + "name": { + "label": "Name", + "placeholder": "Enter name" + }, + "email": { + "label": "E-mail", + "placeholder": "Inserisci email" + }, + "phone": { + "label": "Telefono", + "placeholder": "Inserisci telefono" + }, + "password": { + "label": "Nuova password", + "placeholder": "Inserisci nuova password" + }, + "userPref": { + "key": { + "label": "Chiave", + "placeholder": "Inserisci chiave" + }, + "value": { + "label": "Valore", + "placeholder": "Inserisci valore" + } + } + } + }, + "oAuthProvider": { + "inputs": { + "appleAuth": { + "bundleId": { + "label": "ID gruppo", + "placeholder": "com.company.appname" + }, + "keyId": { + "label": "ID chiave", + "placeholder": "SHAB13ROFN" + }, + "teamId": { + "label": "ID squadra", + "placeholder": "ELA2CD3AED" + }, + "p8": { + "label": "File P8", + "placeholder": "" + } + }, + "auth0Auth": { + "clientId": { + "label": "ID cliente", + "placeholder": "Inserisci ID" + }, + "secret": { + "label": "Segreto cliente", + "placeholder": "Inserisci segreto client" + }, + "domain": { + "label": "Dominio Auth0", + "placeholder": "Il tuo dominio Auth0" + } + }, + "githubAuth": { + "appId": { + "label": "ID app", + "placeholder": "Inserisci ID" + }, + "secret": { + "label": "Segreto dell'app", + "placeholder": "Inserisci il segreto dell'app" + }, + "endpoint": { + "label": "Endpoint (facoltativo)", + "placeholder": "Il tuo endpoint" + } + }, + "mainAuth": { + "appId": { + "label": "ID app", + "placeholder": "Inserisci ID" + }, + "secret": { + "label": "Segreto dell'app", + "placeholder": "Inserisci il segreto dell'app" + } + }, + "microsoftAuth": { + "appId": { + "label": "ID applicazione (client)", + "placeholder": "Inserisci ID" + }, + "secret": { + "label": "Segreto cliente", + "placeholder": "Inserisci segreto client" + }, + "tenant": { + "label": "Locatario di destinazione", + "placeholder": "'comuni','organizzazioni','consumatori' o il tuo TenantID" + } + }, + "oktaAuth": { + "appId": { + "label": "ID cliente", + "placeholder": "Inserisci ID" + }, + "secret": { + "label": "Segreto cliente", + "placeholder": "Inserisci segreto client" + }, + "domain": { + "label": "Dominio Okta", + "placeholder": "dev-1337.okta.com" + }, + "serverId": { + "label": "ID server di autorizzazione", + "placeholder": "predefinito" + } + } + } + }, + "security": { + "inputs": { + "passwordDictionary": { + "label": "Dizionario delle password" + }, + "passwordHistory": { + "label": "Cronologia password" + }, + "maxSession": { + "label": "Limite" + }, + "sessionLength": { + "label": "Lunghezza" + }, + "sessionPeriod": { + "label": "Periodo di tempo" + } + } + }, + "teams": { + "updatePrefs": { + "inputs": { + "key": { + "label": "Chiave", + "placeholder": "Inserisci chiave" + }, + "value": { + "label": "Inserisci chiave", + "placeholder": "Inserisci valore" + } + } + }, + "updateName": { + "title": "Nome", + "inputs": { + "name": { + "label": "Nome", + "placeholder": "Inserisci il nome della squadra" + } + } + }, + "createMembership": { + "inputs": { + "name": { + "label": "Nome (facoltativo)", + "placeholder": "Inserisci il nome" + }, + "email": { + "label": "E-mail", + "placeholder": "Inserisci email" + }, + "roles": { + "label": "Ruoli", + "placeholder": "Aggiungi ruoli" + } + } + } + }, + "databases": { + "createDb": { + "inputs": { + "name": { + "label": "Nome", + "placeholder": "Inserisci il nome del database" + } + } + }, + "createCollection": { + "inputs": { + "name": { + "label": "Nome", + "placeholder": "Inserisci il nome della raccolta" + } + } + }, + "updateName": { + "title": "Nome", + "inputs": { + "name": { + "label": "Nome", + "placeholder": "Inserisci il nome del database", + "defaultPlaceholder": "Inserisci il nome" + } + } + }, + "createAttribute": { + "texts": { + "createAttribute": "Caratteri consentiti: alfanumerico, trattino, trattino basso non iniziale, punto" + }, + "inputs": { + "key": { + "label": "Chiave attributo", + "placeholder": "Inserisci chiave" + } + } + }, + "attribute": { + "texts": { + "phraseOne": "Indica se questo è un attributo obbligatorio", + "phraseTwo": "Indica se questo attributo deve fungere da array", + "relationship": { + "oneWay": { + "phraseOne": "Relazione a senso unico", + "phraseTwo": "Un attributo di relazione all'interno di questa raccolta" + }, + "twoWay": { + "phraseOne": "Relazione a due vie", + "phraseTwo": "Un attributo Relation all'interno di questa raccolta e un altro all'interno della raccolta correlata" + } + } + }, + "inputs": { + "default": { + "label": "Valore predefinito", + "placeholder": "Seleziona un valore" + }, + "defaultValue": { + "label": "Valore predefinito", + "placeholder": "Inserisci valore" + }, + "elements": { + "label": "Elementi", + "placeholder": "Aggiungi elementi qui" + }, + "required": { + "label": "Obbligatorio" + }, + "array": { + "label": "Array" + }, + "key": { + "label": "Chiave attributo", + "placeholder": "Inserisci chiave" + }, + "min": { + "label": "Min", + "placeholder": "Inserisci dimensioni" + }, + "max": { + "label": "Max", + "placeholder": "Inserisci dimensioni" + }, + "related": { + "label": "Collezione correlata", + "placeholder": "Seleziona una raccolta" + }, + "keyRelated": { + "label": "Chiave attributo (raccolta correlata)", + "placeholder": "Inserisci chiave" + }, + "relationship": { + "label": "Relazione", + "placeholder": "Seleziona una relazione" + }, + "deleting": { + "label": "All'eliminazione di un documento", + "placeholder": "Seleziona un metodo di eliminazione" + }, + "size": { + "label": "Dimensioni", + "placeholder": "Inserisci dimensioni" + }, + "string": { + "label": "Predefinito", + "placeholder": "Inserisci stringa" + }, + "email": { + "placeholder": "Inserisci URL" + } + } + }, + "index": { + "inputs": { + "key": { + "label": "Chiave indice", + "placeholder": "Inserisci chiave" + }, + "type": { + "label": "Tipo di indice", + "placeholder": "Seleziona tipo" + }, + "attribute": { + "label": "Attributo", + "placeholder": "Seleziona attributo" + }, + "order": { + "label": "Seleziona attributo" + }, + "id": { + "label": "ID documento", + "placeholder": "ID documento" + } + }, + "options": { + "title": { + "selectAttribute": "Seleziona attributo", + "selectOrder": "Seleziona ordine" + }, + "label": { + "id": "$id", + "createdAt": "$createdAt", + "updatedAt": "$updatedAt", + "asc": "ASC", + "desc": "DESC" + } + } + }, + "settings": { + "inputs": { + "docSecurity": { + "label": "Sicurezza documento" + } + } + } + }, + "settings": { + "default": { + "inputs": { + "projectId": { + "label": "ID progetto" + }, + "apiEndPoint": { + "label": "Endpoint API" + } + } + }, + "updateName": { + "title": "Nome", + "inputs": { + "name": { + "label": "Nome", + "placeholder": "Inserisci il nome del database", + "defaultPlaceholder": "Inserisci il nome" + } + }, + "texts": { + "chooseWebhook": "Scegli un nome che ti aiuti a distinguere i webhook." + } + }, + "domain": { + "inputs": { + "domain": { + "label": "Dominio personalizzato", + "placeholder": "appwrite.example.com" + } + } + }, + "webhooks": { + "texts": { + "stepOne": "Utilizza i webhook per creare integrazioni che sottoscrivono eventi specifici su Appwrite. Appwrite invierà un payload HTTP POST all'URL configurato del webhook quando viene attivato uno degli eventi specificati.", + "events": "Imposta gli eventi che attiveranno la tua funzione. Sono consentiti massimo 100 eventi.", + "addEvent": "Aggiungi un evento per iniziare", + "selectEvent": "Seleziona gli eventi nel tuo progetto Appwrite che attiveranno il tuo webhook.", + "learnMore": "Ulteriori informazioni sugli eventi Appwrite", + "learnMoreWarning": "Ulteriori informazioni", + "untrustedCertificate": "I certificati non attendibili o autofirmati potrebbero non essere sicuri.", + "security": "Imposta un nome utente e una password di autenticazione HTTP di base facoltativi per proteggere il tuo endpoint da accessi non autorizzati.", + "secureEndpoints": "Utilizza per proteggere il tuo endpoint da fonti non attendibili." + }, + "inputs": { + "name": { + "label": "Nome", + "defaultPlaceholder": "Inserisci il nome" + }, + "url": { + "label": "URL POST" + }, + "user": { + "label": "Utente", + "placeholder": "Inserisci nome utente" + }, + "password": { + "label": "Password", + "placeholder": "Inserisci password" + } + } + } + }, + "overview": { + "title": { + "name": "Nome", + "coding": "Prendiamo il codice", + "initSdk": "Inizializza il tuo SDK", + "getSdk": "Ottieni l'SDK", + "selfHosted": "Per soluzioni self-hosted", + "register": { + "android": "Registra la tua app Android", + "apple": "Registra la tua app Apple", + "flutter": "Registra la tua app Flutter", + "web": "Registra la tua app Web" + } + }, + "inputs": { + "name": { + "label": "Nome", + "placeholder": "Nome chiave API", + "defaultPlaceholder": "Inserisci nome" + }, + "androidPlatformName": { + "label": "Nome", + "placeholder": "La mia app Android" + }, + "androidPlatformKey": { + "label": "Nome pacchetto", + "tooltip": "Il nome del tuo pacchetto è generalmente l'ID applicazione nel tuo file build.gradle a livello di app." + }, + "applePlatformName": { + "label": "Nome", + "placeholder": "La mia app Apple" + }, + "appleHostname": { + "label": "ID gruppo", + "tooltip": "Puoi trovare il tuo identificatore di bundle nella scheda Generale per il target principale della tua app in Xcode." + }, + "webAppname": { + "label": "Nome", + "placeholder": "La mia Web App" + }, + "webHostName": { + "label": "Nome host", + "tooltip": "Il nome host che il tuo sito web utilizzerà per interagire con le API Appwrite negli ambienti di produzione o sviluppo. Nessun protocollo o numero di porta richiesto." + } + }, + "texts": { + "initSdk": " Ora che hai scaricato l'SDK, è il momento di inizializzarlo. Usa il tuo ID progetto, che si trova nella pagina delle impostazioni del progetto.", + "apiCall": "Prima di inviare qualsiasi chiamata API al tuo nuovo progetto Appwrite, assicurati che il tuo dispositivo o emulatore abbia accesso di rete al nome host o all'indirizzo IP del tuo progetto Appwrite.", + "alert": "Quando ti connetti a un progetto Appwrite ospitato localmente da un emulatore o un dispositivo mobile, dovresti utilizzare l'IP privato del dispositivo che esegue il tuo progetto Appwrite come nome host dell'endpoint anziché localhost. Puoi anche utilizzare un servizio come ngrok per eseguire il proxy del server Appwrite.", + "android": { + "first": "Per prima cosa, aggiungi questo al tuo file build.gradle di livello root:", + "second": "E aggiungi questo al file build.gradle del tuo progetto:" + }, + "selectFile": "Seleziona file", + "addPackages": "Aggiungi pacchetti", + "searchAppwrite": "Cerca l'Appwrite SDK con l'URL", + "selectTargetProject": "Nel pannello di destra, seleziona il tuo progetto di destinazione e aggiungi le regole di versione desiderate", + "selectAndAddPackage": "Seleziona Aggiungi pacchetto e attendi il completamento della risoluzione del pacchetto", + "productCheck": "Assicurati che il prodotto del pacchetto Appwrite sia selezionato e seleziona di nuovo Aggiungi pacchetto", + "addToSwift": "Aggiungi questo al tuo file Package.swift:", + "addDependency": "Quindi aggiungi la dipendenza al tuo obiettivo:", + "addProjectFlutter": "Aggiungi Appwrite SDK al file pubspec.yaml del tuo pacchetto. Puoi vedere un esempio qui.", + "installDartPackage": "Puoi anche installare l'SDK utilizzando il gestore di pacchetti Dart dal tuo terminale:", + "chooseMethod": " Scegli il tuo metodo di installazione preferito", + "use": "usa", + "cmdLine": "dalla tua riga di comando per aggiungere Appwrite SDK al tuo progetto.", + "note": { + "phraseOne": "Quando usi un bundler (come", + "or": "o", + "phraseTwo": "), importa il modulo Appwrite quando ne hai bisogno:" + }, + "installWithCdn": "Per installare con un CDN (rete per la distribuzione di contenuti) aggiungi i seguenti script in fondo al tag, ma prima di utilizzare qualsiasi servizio Appwrite:", + "wildcard": "L'utilizzo di nomi host con caratteri jolly in produzione può diventare insicuro. Puoi leggere informazioni", + "moreInfo": "per maggiori informazioni." + } + }, + "functions": { + "title": { + "executeFunction": "Esegui funzione", + "deleteDeployment": "Elimina distribuzione", + "createDeployment": "Crea distribuzione", + "activeDeployment": "Attiva distribuzione", + "commingSoon": "Prossimamente!", + "easyDeployments": "La creazione di deployment sarà più semplice che mai con la nostra imminente integrazione con Git. Basta impostare un repository e noi faremo il resto.", + "deploymentBuild": "Questa distribuzione verrà attivata dopo che la build è stata completata.", + "name": "Nome" + }, + "inputs": { + "key": { + "label": "Chiave", + "placeholder": "Inserisci chiave" + }, + "value": { + "label": "Valore", + "placeholder": "Inserisci valore" + }, + "name": { + "label": "Nome", + "placeholder": "Nome funzione", + "defaultPlaceholder": "Inserisci il nome" + }, + "runtime": { + "label": "Runtime", + "placeholder": "Seleziona runtime" + }, + "data": { + "label": "Dati personalizzati (opzionale)" + }, + "json": { + "label": "Mostra JSON di esempio" + }, + "entryPoint": { + "label": "Punto di ingresso" + }, + "activeDeployment": { + "label": "Attiva la distribuzione dopo la compilazione" + } + }, + "texts": { + "customDataExample": "Ecco un esempio di alcuni dati personalizzati.", + "deleteDeployment": "Sei sicuro di voler eliminare questo deployment?", + "deployFunction": "Puoi distribuire la tua funzione dalla CLI di Appwrite utilizzando Unix, CMD o PowerShell. Consulta la nostra documentazione per saperne di più", + "deployYourFunction": "distribuire le tue funzioni", + "installAndUse": "o come installare e utilizzare il", + "activateWarning": "Sei sicuro di voler attivare questo deployment?" + } + }, + "storage": { + "title": { + "createBucket": "Crea secchio", + "createFile": "Crea file", + "maximumSize": "Dimensione massima del file", + "fileSecurity": "Sicurezza file", + "name": "Nome", + "securitySettings": "Impostazioni di sicurezza", + "compression": "Compressione", + "fileExtensions": "Estensioni file" + }, + "inputs": { + "name": { + "label": "Nome", + "placeholder": "Nuovo secchio", + "defaultPlaceholder": "Inserisci il nome" + }, + "size": { + "label": "Dimensione" + }, + "security": { + "label": "Sicurezza file" + }, + "algorithm": { + "lable": "Algoritmo" + }, + "extensions": { + "lable": "Estensioni consentite", + "placeholder": "Estensioni di file consentite (mp4, jpg, pdf, ecc.)" + } + }, + "texts": { + "setMaxBucketSize": "Imposta la dimensione massima del file consentita nel bucket.", + "created": "Creato:", + "lastUpdated": "Ultimo aggiornamento:", + "enableFileSecurity": "Quando la sicurezza dei file è abilitata, gli utenti potranno accedere ai file per i quali sono stati autorizzati", + "fileAndBucketPermission": "autorizzazioni File o Bucket", + "fileDisabled": "Se la sicurezza dei file è disabilitata, gli utenti possono accedere ai file", + "onlyBucketPermission": "solo se dispongono delle autorizzazioni Bucket", + "ignorePermission": "I permessi dei file verranno ignorati..", + "enableDisableSecurityService": "Abilita o disabilita i servizi di sicurezza per il bucket incluso", + "encruption": "Crittografia", + "and": "e", + "antivirusScanning": "Scansione antivirus.", + "antivirus": "Antivirus", + "configureEncruption": "Questo parametro ti consente di configurare se i file all'interno del bucket verranno crittografati o meno. Non crittografiamo file più grandi di 20 MB.", + "configureAntivirus": "Questo parametro consente di configurare se i file all'interno del bucket devono essere scansionati o meno dallo scanner Appwrite Antivirus.", + "chooseCompressionAlgo": "Scegli un algoritmo per la compressione. Per i file più grandi di 20MB, la compressione verrà saltata anche se è abilitata.", + "allowedFileExtensions": "Estensioni di file consentite. È possibile aggiungere un massimo di 100 estensioni di file. Lasciare vuoto per consentire tutti i tipi di file." + } + }, + "components": { + "inputs": { + "team": { + "placeholder": "Ricerca per nome o ID" + }, + "user": { + "placeholder": "Ricerca per nome, e-mail, telefono o ID" + } + } + } + }, + "button": { + "createUser": "Crea utente", + "clearSearch": "Cancella ricerca", + "account": "account", + "email": "e-mail", + "phone": "telefono", + "createTeam": "Crea squadra", + "createIndex": "Crea indice", + "createMembership": "Crea iscrizione", + "createDb": "Crea database", + "createCollection": "Crea raccolta", + "createAttribute": "Crea attributo", + "createDocument": "Crea documento", + "createDomain": "Crea dominio", + "documentation": "Documentazione", + "createBucket": "Crea secchio", + "items": "Articoli", + "test": "test", + "addItem": "Aggiungi elemento", + "addEvent": "Aggiungi evento", + "addAttribute": "Aggiungi attributo", + "createWebhook": "Crea webhook", + "createApiKey": "Crea chiave API", + "createFunction": "Crea funzione", + "createVariable": "Crea variabile", + "createFile": "Crea file", + "createDeployment": "Crea distribuzione", + "viewApiKeys": "Visualizza chiavi API", + "deselectAll": "Deseleziona tutto", + "selectAll": "Seleziona tutto", + "cancel": "Annulla", + "buildLogs": "Crea log", + "download": "Scarica", + "feedback": "Feedback", + "next": "Prossima", + "back": "indietro", + "skipSteps": "Salta passaggi facoltativi", + "exit": "Exit", + "close": "Chiudi", + "addRole": "Aggiungi ruolo", + "customPermission": "Autorizzazione personalizzata", + "rawData": "Dati grezzi", + "scrollToTop": "Scorri verso l'alto", + "button": "Pulsante", + "platforms": "piattaforme", + "apiKeys": "Chiavi API", + "submit": { + "create": "Crea", + "update": "Aggiorna", + "addPrefs": "Aggiungi preferenza", + "addPlatform": "Aggiungi piattaforma", + "delete": "Elimina", + "deleteAll": "Elimina tutto", + "verify": "Verifica", + "regenerate": "Rigenera", + "regenerateKey": "Rigenera chiave", + "executeNow": "Esegui ora", + "activate": "Attiva", + "downloadEnv": "Scarica file .env", + "importEnv": "Importa file .env", + "add": "Aggiungere", + "submit": "Invia" + }, + "pill": { + "userId": "ID utente" + }, + "dropdown": { + "edit": "Modifica", + "createIndex": "Crea indice", + "overview": "Panoramica", + "ninty": "90d", + "thirty": "30d", + "twentyFour": "24h", + "newOrg": "Nuova organizzazione", + "yourAccount": "Il tuo account", + "signOut": "Esci", + "any": "Qualsiasi", + "allGuests": "Tutti gli ospiti", + "allUsers": "Tutti gli utenti", + "selectUsers": "Seleziona utenti", + "selectTeams": "Seleziona team", + "currentPermission": "Autorizzazione personalizzata" + } + }, + "texts": { + "emptySearch": { + "phraseOne": "Spiacenti, non siamo riusciti a trovare", + "phraseTwo": "Non ci sono utenti che corrispondono alla tua ricerca." + }, + "oAuthProvider": { + "uri": "URI", + "textOne": "Da usare", + "phraseOne": "autenticazione nella tua applicazione, prima compila questo modulo. Per maggiori informazioni puoi farlo" + }, + "security": { + "passwordDictionary": "L'abilitazione di questa opzione impedisce agli utenti di impostare password non sicure confrontando la password dell'utente con la", + "passwordHistory": { + "phraseOne": "L'abilitazione di questa opzione impedisce agli utenti di riutilizzare le password recenti confrontando la nuova password con la loro cronologia delle password.", + "phraseTwo": "Imposta il numero massimo di password salvate per utente. Massimo 20 password." + }, + "sessionLength": "Se riduci il limite, gli utenti attualmente connessi verranno disconnessi dall'applicazione.", + "sessionLimit": "Numero massimo di sessioni attive consentite per utente.", + "usersLimit": "Limita l'iscrizione di nuovi utenti al tuo progetto, indipendentemente dal metodo di autenticazione. Puoi comunque creare utenti e appartenenze al team dalla tua console Appwrite.", + "limited": "limitato", + "unlimited": "illimitato" + }, + "settings": "Abilita i metodi di autenticazione che desideri utilizzare.", + "teams": { + "members": "membri", + "searchData": { + "phaseOne": "Spiacenti, non siamo riusciti a trovare", + "phaseTwo": "Non ci sono squadre che corrispondono alla tua ricerca.", + "phaseThree": "Non ci sono membri che corrispondono alla tua ricerca." + }, + "updatePrefs": "Puoi aggiornare le preferenze del tuo team memorizzando le informazioni condivise sugli oggetti dei team in modo che possano essere facilmente condivise tra i membri.", + "deleteTeam": "Sei sicuro di voler eliminare", + "deleteMember": "Sei sicuro di voler eliminare", + "from": "da", + "dangerZone": " La squadra verrà eliminata definitivamente, inclusi tutti i dati associati a questa squadra. Questa azione è irreversibile.", + "createdOn": "Creato il" + }, + "databases": { + "newDb": "Crea un nuovo database", + "delete": "Sei sicuro di voler eliminare", + "docFrom": "il documento da", + "created": "Creato:", + "lastUpdated": "Ultimo aggiornamento:", + "settings": "Il database verrà eliminato definitivamente, inclusi tutti i dati associati a questo team. Questa azione è irreversibile.", + "createAttribute": { + "heading": "Crea il tuo primo attributo per iniziare.", + "note": "Hai bisogno di una mano? Scopri di più nella nostra documentazione." + }, + "totalResult": "Risultati totali:", + "from": "da", + "twoWayRelationship": "Questa è una relazione bidirezionale e anche la relazione corrispondente verrà eliminata.", + "irreversibleAction": "Questa azione è irreversibile.", + "deleteRelation": "Elimina relazione tra", + "deleteDocFrom": "Elimina documento da", + "to": "a", + "documentsPage": { + "para": { + "phraseOne": "Assegna i permessi di lettura o scrittura al", + "collectionLevel": "Livello raccolta", + "or": "o", + "documentLevel": "Livello documento", + "phraseTwo": "Se vengono assegnate le autorizzazioni a livello di raccolta, le autorizzazioni applicate ai singoli documenti vengono ignorate." + } + }, + "deleteDocWarning": "Il documento verrà eliminato definitivamente, inclusi tutti i dati al suo interno. Questa azione è irreversibile.", + "updateDocument": "Aggiorna i dati del documento in base agli attributi creati in precedenza.", + "deleteCollection": "La raccolta verrà eliminata definitivamente, inclusi tutti i documenti al suo interno. Questa azione è irreversibile.", + "displayName": "Imposta attributi stringa con un massimo di 50 caratteri da utilizzare come nome visualizzato nella console Appwrite. Massimo 5 nomi.", + "updatePermission": { + "collectionAndDocumentation": "Scegli chi può accedere alla tua collezione e ai tuoi documenti. Per maggiori informazioni, controlla il", + "permissionGuide": "Guida alle autorizzazioni" + }, + "updateSecurity": { + "phraseOne": "Quando la sicurezza dei documenti è abilitata, gli utenti potranno accedere ai documenti per i quali sono stati autorizzati", + "eitherDocOrCollection": "autorizzazioni documento o raccolta", + "collectionPermission": "solo se hanno i permessi di raccolta", + "documentPermission": "I permessi del documento verranno ignorati." + }, + "wizards": { + "stepOne": "Fornisci i dati del documento in base agli attributi che hai creato in precedenza." + } + }, + "users": { + "updatePrefs": "Puoi aggiornare le tue preferenze utente memorizzando le informazioni sugli oggetti dell'utente in modo che possano essere facilmente condivise tra dispositivi e sessioni.", + "updatePassword": { + "phaseOne": "Inserisci una nuova password. Una password deve contenere", + "phaseTwo": "almeno 8 caratteri." + }, + "noMembership": "Nessuna iscrizione disponibile", + "noSessions": "Nessuna sessione disponibile", + "deleteUser": { + "phaseOne": "Sei sicuro di voler eliminare", + "from": "da" + }, + "deleteSession": "Sei sicuro di voler eliminare questa sessione?", + "deleteMembership": { + "phaseOne": "Sei sicuro di voler eliminare", + "from": "da" + }, + "deleteAllSession": { + "phaseOne": "Sei sicuro di voler eliminare", + "allOf": "tutto", + "sessions": "sessioni" + }, + "dangerZone": "L'utente verrà eliminato definitivamente, inclusi tutti i dati associati a questo utente. Questa azione è irreversibile.", + "on": "su" + }, + "consoleSettings": { + "deleteProject": { + "phraseOne": "Questo progetto verrà eliminato", + "phraseTwo": "insieme a tutti i suoi metadati, statistiche e altre risorse.", + "phraseThree": "Questa azione è irreversibile" + }, + "accessService": "Accedi ai servizi Appwrite utilizzando il tuo endpoint API e l'ID progetto.", + "options": "Scegli i servizi che desideri abilitare o disabilitare.", + "deleteAll": "Il progetto verrà eliminato definitivamente, inclusi tutti i metadati, le risorse e le statistiche al suo interno. Questa azione è irreversibile.", + "lastUpdated": "Ultimo aggiornamento:", + "delete": { + "phaseOne": "Sei sicuro di voler eliminare", + "from": "da" + }, + "verifiedDomain": "Il dominio è stato verificato", + "pendingDomain": "Il dominio è in attesa di verifica", + "dnsDoc": "Puoi trovare un elenco di provider di dominio e la relativa documentazione sulle impostazioni DNS", + "domainProvider": "Se il tuo provider di dominio non è elencato, contattaci e includeremo anche le loro impostazioni.", + "dnsProvider": "Per continuare, imposta il seguente record sul tuo provider DNS", + "time": "L'applicazione delle modifiche potrebbe richiedere del tempo a seconda del tuo provider." + }, + "webhooks": { + "deletePermanently": "Il webhook verrà eliminato definitivamente. Questa azione è irreversibile.", + "lastUpdated": "Ultimo aggiornamento:", + "delete": { + "phaseOne": "Sei sicuro di voler eliminare", + "from": "da" + }, + "generateKey": "Sei sicuro di voler generare una nuova chiave di firma?", + "noRecoveryKey": "Non sarai in grado di recuperare la tua chiave attuale.", + "triggerWebhook": "Imposta gli eventi che attiveranno il tuo webhook. Massimo 100 eventi consentiti.", + "addEvent": "Aggiungi un evento per iniziare", + "selectEvent": "Seleziona gli eventi nel tuo progetto Appwrite che attiveranno il tuo webhook.", + "learnMore": "Ulteriori informazioni sugli eventi Appwrite", + "httpAuth": "Imposta un nome utente e una password di autenticazione HTTP di base facoltativi per proteggere il tuo endpoint da accessi non autorizzati.", + "secureEndpoints": "Utilizza per proteggere il tuo endpoint da fonti non attendibili.", + "addSignature": "Aggiungi la chiave di firma all'intestazione X-Appwrite-Webhook-Signature per convalidare i tuoi webhook.", + "webhookValidation": "Ulteriori informazioni sulla convalida del webhook." + }, + "overview": { + "noData": "Nessun dato da mostrare", + "realtimeGetStarted": "Inizia con Realtime", + "sdks": "I nostri SDK consentono di aggiungere facilmente qualsiasi piattaforma che desideri utilizzare.", + "addPlatform": "Aggiungi una piattaforma per visualizzare i dati sul tuo progetto", + "insights": "Ottieni informazioni sull'utilizzo della larghezza di banda, richieste, connessioni in tempo reale e altro ancora dopo aver effettuato la tua prima chiamata API", + "scopePermission": "Scegli quali ambiti di autorizzazione concedere alla tua applicazione. È consigliabile consentire solo le autorizzazioni necessarie per raggiungere gli obiettivi del progetto.", + "createApiKey": "Creiamo una chiave API.", + "deletePermanent": "La chiave API verrà eliminata definitivamente. Questa azione è irreversibile.", + "lastAccessed": "Ultimo accesso:", + "scopeGranted": "Ambiti concessi:", + "chooseName": "Scegli un nome che ti aiuti a distinguere le chiavi API.", + "permissionScope": "Puoi scegliere quale ambito di autorizzazione concedere alla tua applicazione. È consigliabile consentire solo le autorizzazioni necessarie per raggiungere gli obiettivi del tuo progetto.", + "readyTogo": "Sei pronto per partire", + "congratulations": "Congratulazioni, hai appena aggiunto la tua prima piattaforma alla dashboard di Appwrite! Sei pronto a fare un tentativo? Perché non aggiungere un database al tuo progetto o iniziare a caricare i file? La scelta spetta a te. ", + "choosePlatform": "Scegli un nome che ti aiuti a distinguere tra le piattaforme.", + "deletePlatform": "La piattaforma verrà eliminata definitivamente. Questa azione è irreversibile.", + "deletePlatformPermanent": "La piattaforma verrà eliminata definitivamente. Questa azione è irreversibile.", + "packageName": "Il nome del pacchetto è generalmente applicationId nel file build.gradle a livello di app.", + "bundleId": "Puoi trovare il tuo identificatore bundle nella scheda Generale per la destinazione principale della tua app in Xcode.", + "applicationName": "Nome dell'applicazione.", + "hostName": "È possibile utilizzare * per consentire nomi host o sottodomini con caratteri jolly.", + "realTime": "Connessioni in tempo reale", + "setExpireDate": "Imposta una data dopo la quale scadrà la tua chiave API.", + "expiredApiKey": "La tua chiave API è scaduta", + "deleteExpiredKey": "Per motivi di sicurezza, ti consigliamo di eliminare la chiave scaduta e crearne una nuova.", + "keyToExpire": "La tua chiave API sta per scadere", + "updateExpireDate": "Aggiornare la data di scadenza per mantenere attiva la chiave", + "expireWarning": "La chiave scadrà nel" + }, + "functions": { + "createNewFunction": "Crea una nuova funzione", + "createVariable": "Crea una variabile (o chiave segreta) che verrà passata alla tua funzione in fase di esecuzione.", + "setVariable": "Imposta le variabili (o chiavi segrete) che verranno passate alla tua funzione in fase di esecuzione.", + "getStartedVar": "Crea una variabile per iniziare", + "setCron": "Imposta una pianificazione Cron per attivare la tua funzione. Lascia vuoto per nessuna pianificazione.", + "moreDetailsCronSyntax": "Maggiori dettagli sulla sintassi di Cron qui", + "setEvents": "Imposta gli eventi che attiveranno la tua funzione. Massimo 100 eventi consentiti.", + "addEvent": "Aggiungi un evento per iniziare", + "selectEvents": "Seleziona gli eventi nel tuo progetto Appwrite che attiveranno la tua funzione.", + "learnMore": "Ulteriori informazioni sugli eventi Appwrite", + "setPermission": "Scegli chi può eseguire questa funzione utilizzando l'API del client. Per ulteriori informazioni, consulta il", + "permissionGuide": "Guida ai permessi", + "createYourFunction": "Crea la tua funzione", + "createFunction": "Creiamo una funzione.", + "functionId": "ID funzione:", + "deploymentId": "ID distribuzione:", + "createdAt": "Creato in:", + "updatedAt": "Aggiornato alle:", + "entryPoint": "Punto di ingresso:", + "totalVariables": "Variabili totali:", + "noInactiveDeployments": "Non hai implementazioni inattive. Creane una per vederla qui.", + "learnDeployments": " Ulteriori informazioni sulle distribuzioni nella nostra documentazione.", + "uploadVariables": "Carica più variabili tramite un file .env che verrà passato alla tua funzione in fase di esecuzione.", + "permanentDelete": "Sei sicuro di voler eliminare questa funzione e tutte le distribuzioni associate dal tuo progetto?", + "timeLimit": "Limita il tempo di esecuzione della tua funzione. Il valore massimo è 900 secondi (15 minuti).", + "permanentActionDelete": "La funzione verrà eliminata definitivamente, inclusi tutti i deployment ad essa associati. Questa azione è irreversibile.", + "noExecutionLogs": "Non hai log di esecuzione. Crea e attiva un'implementazione per visualizzarla qui.", + "needHand": "Hai bisogno di una mano? Scopri di più nella nostra documentazione", + "executions": "Esecuzioni", + "errors": "Errori" + }, + "storage": { + "addNewBucket": "Aggiungi un nuovo bucket", + "deleteWarning": "Sei sicuro di voler eliminare", + "accessPermission": "Scegli chi può accedere ai tuoi bucket e ai tuoi file. Per ulteriori informazioni, consulta il", + "permissionGuide": "Guida ai permessi", + "fileSecurity": { + "enable": "Sicurezza file abilitata", + "disable": "Sicurezza file disabilitata" + }, + "userAccessability": "Gli utenti potranno accedere a questo file se sono stati autorizzati", + "fileAndBucketPermission": "autorizzazioni File o Bucket", + "assignFilePermission": "Se desideri assegnare i permessi ai file, vai alle impostazioni del Bucket e abilita la sicurezza dei file. In caso contrario, verranno utilizzati solo i permessi del Bucket.", + "couldNotFind": "Spiacenti, non siamo riusciti a trovare", + "noMatchingFiles": "Non ci sono file che corrispondono alla tua ricerca.", + "permanentDeleteBucket": "Il bucket verrà eliminato definitivamente, inclusi tutti i file al suo interno. Questa azione è irreversibile.", + "permanentDeleteFile": "Il file verrà eliminato definitivamente. Questa azione è irreversibile.", + "lastUpdated": "Ultimo aggiornamento:", + "created": "Creato:", + "size": "Creato:", + "mime": "Tipo MIME:", + "readWritePermission": "Assegna autorizzazioni di lettura o scrittura a livello di bucket o di file. Se le autorizzazioni a livello di bucket sono abilitate, le autorizzazioni di file verranno ignorate." + }, + "components": { + "create": "Crea il tuo primo", + "getStarted": "per iniziare.", + "needHand": "Hai bisogno di una mano? Scopri di più nella nostra documentazione.", + "pagination": { + "totalResult": "Risultati totali:", + "uploadingFiles": "Caricamento di file" + }, + "custom": { + "permissions": "Le autorizzazioni personalizzate consentono di concedere l'accesso a utenti o team specifici utilizzando il loro ID e ruolo.", + "permissionFormation": "Un'autorizzazione deve essere formattata come:", + "user": "utente:", + "or": "o", + "team": "squadra:" + }, + "addRole": "Aggiungere un ruolo per iniziare", + "totalResult": "Risultati totali:", + "couldNotFind": "Spiacenti, non siamo riusciti a trovare", + "noTeamMembers": "Non ci sono squadre che corrispondono alla tua ricerca.", + "noUserExist": "Non ci sono utenti che corrispondono alla tua ricerca.", + "noUsers": "Non hai utenti. Crea un utente per vederli qui.", + "noTeams": "Non hai squadre. Crea un team per vederli qui.", + "needHelp": "Aver bisogno di una mano? Scopri di più nel nostro", + "email": "E-mail:", + "phone": "Telefono:", + "members": "Membri:", + "notFound": "non trovato", + "grantAccessSpecificTeamMember": "Concedere l'accesso a qualsiasi membro di un team specifico. Per concedere l'accesso ai membri del team con ruoli, sarà necessario impostare un", + "grantAccessToUser": "Concedere l'accesso a qualsiasi utente autenticato o anonimo.", + "lastUpdated": "Ultimo aggiornamento", + "firstPlatform": "Crea la tua prima piattaforma per iniziare." + }, + "footer": { + "version": "Versione", + "terms": "Termini", + "privacy": "Privacy", + "allRightReserved": "Appwrite. Tutti i diritti riservati." + }, + "logs": { + "functionId": "ID funzione:", + "deploymentId": "ID distribuzione:", + "executionId": "ID esecuzione:" + }, + "unAuthenticated": "Integrazione con le tue tecnologie preferite", + "wizardExitModle": { + "areYouSure": "Sei sicuro di voler uscire da", + "dataDelete": "Tutti i dati verranno cancellati. Questa azione è irreversibile." + } + }, + "table": { + "header": { + "name": "Nome", + "roles": "Ruoli", + "identifiers": "Identificatori", + "status": "Stato", + "id": "ID", + "documentId": "ID documento", + "executionId": "ID esecuzione", + "trigger": "Trigger", + "duration": "Durata", + "ip": "IP", + "joined": "unito", + "members": "Membri", + "created": "Creato", + "browserAndDevice": "Browser e dispositivo", + "sessions": "Sessioni", + "location": "Posizione", + "deleteDatabase": "Elimina database", + "key": "Chiave", + "type": "Tipo", + "value": "Tipo", + "attributes": "Tipo", + "asc_dsc": "Asc/Desc", + "defaultValue": "Valore predefinito", + "relation": "Relazione", + "filename": "Nome file", + "role": "Ruolo", + "create": "Crea", + "read": "Leggi", + "update": "Aggiorna", + "delete": "Elimina", + "settings": "Impostazioni", + "domainName": "Nome di dominio", + "postUrl": "URL POST", + "events": "Eventi", + "lastAccessed": "ultimo accesso", + "expirationDate": "data di scadenza", + "scopes": "Scopi", + "buildTime": "Tempo di costruzione", + "size": "taglia", + "any": "Qualsiasi", + "guests": "Ospiti", + "users": "Utenti" + }, + "pill": { + "verify": "verificato", + "emailVerify": "email verificata", + "phoneVerify": "telefono verificato", + "unverify": "non verificato", + "block": "bloccato", + "userId": "ID utente", + "teamId": "ID squadra", + "webhookId": "ID webhook", + "required": "Richiesto", + "pending": "In attesa", + "collectionId": "ID raccolta", + "recommended": "consigliato", + "dbId": "ID database", + "currentSession": "sessione corrente", + "disabled": "disabilitato", + "documentId": "ID documento", + "functionId": "ID funzione", + "fileId": "ID file", + "bucketId": "ID secchio", + "failed": "fallito", + "sllTlsDisabled": "SLL/TLS disabilitato", + "apiKeySecret": "Segreto chiave API", + "columns": "Colonne" + } + }, + "legends": { + "teams": { + "users": "Utenti registrati", + "create": "Utenti creati", + "read": "Gli utenti leggono", + "update": "Utenti aggiornati", + "delete": "Utenti cancellati" + }, + "databases": { + "databases": "Database totali", + "create": "Database creati", + "read": "Database letti", + "update": "Database aggiornati", + "delete": "Database cancellati", + "usage": { + "collections": "Collezioni totali", + "create": "Raccolte create", + "read": "Raccolte lette", + "update": "Raccolte aggiornate", + "delete": "Raccolte eliminate" + }, + "documents": { + "documents": "Totale documenti", + "create": "Documenti creati", + "read": "Documenti letti", + "update": "Documenti aggiornati", + "delete": "Documenti eliminati" + } + }, + "settings": { + "domain": { + "addDomain": "Aggiungi il tuo dominio", + "addCname": "Aggiungi un record CNAME", + "verifyDomain": "Verifica dominio", + "sslCertificate": "Certificato SSL" + }, + "webhooks": { + "addWebhooks": "Aggiungi il tuo webhook", + "events": "Eventi webhook", + "security": "Sicurezza" + } + }, + "overview": { + "details": "Sicurezza", + "scopes": "Scopi" + }, + "functions": { + "details": "Dettagli", + "excecuteAccess": "Esegui accesso", + "events": "Eventi", + "schedule": "Programma", + "variables": "Variabili" + }, + "storage": { + "buckets": "Secchi totali", + "create": "Bucket creati", + "read": "Bucket letti", + "update": "Bucket aggiornati", + "delete": "Bucket eliminati", + "usage": { + "files": "File", + "create": "File creati", + "read": "File letti", + "update": "File aggiornati", + "delete": "File cancellati" + } + } + }, + "navbar": { + "header": { + "users": "Utenti", + "teams": "Squadre", + "usage": "Utilizzo", + "security": "Sicurezza", + "settings": "Impostazioni" + }, + "userHeader": { + "overview": "Panoramica", + "membership": "Abbonamenti", + "sessions": "Sessioni", + "activity": "Attività" + }, + "teamHeader": { + "overview": "Panoramica", + "members": "Panoramica", + "activity": "Panoramica" + }, + "databases": { + "databases": "Database", + "usage": "Utilizzo", + "collections": "Collezioni", + "settings": "Impostazioni", + "dbCollection": { + "documents": "Documenti", + "activity": "Attività", + "indexes": "Indici", + "attribute": "Attributi", + "usage": "Utilizzo", + "settings": "Utilizzo" + }, + "document": { + "overview": "Panoramica", + "data": "Dati", + "activity": "Attività" + } + }, + "settings": { + "overview": "Attività", + "customDomains": "Domini personalizzati", + "webhooks": "Webhook" + }, + "platforms": { + "web": "Applicazione Web", + "flutter": "Applicazione Flutter ", + "apple": "Applicazione Apple", + "android": "Applicazione Android" + }, + "functions": { + "deployments": "Deploymenti", + "usage": "Utilizzo", + "executions": "Esecuzioni", + "settings": "Impostazioni" + }, + "storage": { + "buckets": "Secchi", + "usage": "Utilizzo", + "files": "File", + "settings": "Impostazioni" + }, + "sideNavigation": { + "overview": "Panoramica", + "auth": "Aut", + "databases": "Databases", + "functions": "Funzioni", + "storage": "Archiviazione", + "settings": "Archiviazione" + } + }, + "links": { + "oAuthProvider": { + "visitDoc": "visita i documenti." + }, + "passwordDictionary": "10k password più utilizzate.", + "support": "supporto" + }, + "alert": { + "oAuthProvider": { + "fieldOne": "Per completare la configurazione, aggiungi questo URI di reindirizzamento OAuth2 al tuo", + "fieldTwo": "configurazione app." + }, + "teams": { + "createMembership": "I ruoli sono usati per gestire i permessi di accesso. Puoi creare qualsiasi ruolo tu voglia." + }, + "databases": { + "title": { + "documentSecurity": { + "enabled": "La sicurezza del documento è abilitata", + "disabled": "La sicurezza del documento è disabilitata" + }, + "userPermission": "Gli utenti potranno accedere a questo documento se sono stati autorizzati", + "collectionPermission": "autorizzazioni documento o raccolta.", + "permissionCheck": "Se desideri assegnare i permessi ai documenti, vai alle impostazioni della raccolta e abilita la sicurezza dei documenti. In caso contrario, verranno utilizzati solo i permessi della raccolta." + }, + "relationshipSettings": "Per cambiare la selezione modifica le impostazioni di relazione." + } + }, + "components": { + "pagination": { + "prev": "Prev", + "next": "Prossima" + } + }, + "mock": { + "content": "Contenuto", + "list": "elenco", + "other": "altro", + "title": { + "stepOne": "passo-1", + "stepTwo": "passo-2", + "subStepOne": "sottotitolo-1", + "subStepTwo": "sottotitolo-2" + }, + "inputs": { + "label": { + "stepOneFirst": "passo-1-necessario", + "stepOneSecond": "passo-1-opzionale", + "labelStepOne": "etichetta-passo-1", + "stepTwoFirst": "passo-2-primo", + "stepTwoSecond": "passo-2-secondo", + "labelStepTwo": "etichetta-passo-2" + } + } + } + } + }, + + "components": { + "notification": { + "sentPswdLink": "Ti abbiamo inviato un'email con un link per reimpostare la password", + "pswdUpdatedSuccessfully": "La password è stata aggiornata con successo", + "loginSuccessfully": "Accesso riuscito.", + "hasBeenCreated": "è stato creato", + "hasBeenUpdated": "è stato aggiornato", + "hasBeenDeleted": "è stato eliminato", + "accountDeleted": "L'account è stato eliminato", + "sessionDeleted": "La sessione è stata eliminata", + "allSessionDeleted": "Tutte le sessioni sono state eliminate", + "functionDeleted": "La funzione è stata eliminata", + "membershipDeleted": "L'iscrizione è stata cancellata", + "indexDeleted": "L'indice è stato eliminato", + "indexCreated": "L'indice è stato creato", + "webhookHasBeenCreated": "Il webhook è stato creato", + "webhookUrlHasBeenCreated": "L'URL del webhook è stato creato", + "webhookSecurityHasBeenCreated": "La sicurezza del webhook è stata aggiornata", + "webhookNameHasBeenCreated": "Il nome del webhook è stato aggiornato", + "webhookEventsHasBeenCreated": "Gli eventi webhook sono stati aggiornati", + "keyRegenerated": "La chiave è stata rigenerata", + "fileUpload": "Il file è stato caricato", + "nameUpdated": "Il nome è stato aggiornato", + "emailUpdated": "L'email è stata aggiornata", + "pswdUpdated": "La password è stata aggiornata", + "updatePrefs": "Le preferenze sono state aggiornate", + "phoneUpdated": "Il telefono è stato aggiornato", + "authUpdated": "l'autenticazione è stata aggiornata", + "projectUserLimitUpdated": "Limite utenti del progetto aggiornato con successo", + "platformNameUpdated": "Il nome della piattaforma è stato aggiornato", + "apiKeyExpirationUpdated": "La scadenza della chiave API è stata aggiornata", + "apiKeyNameUpdated": "Il nome della chiave API è stato aggiornato", + "apiKeyScopeUpdated": "Gli ambiti della chiave API sono stati aggiornati", + "securityUpdated": "La sicurezza è stata aggiornata", + "permissionsUpdated": "I permessi sono stati aggiornati", + "displayNameUpdated": "I nomi visualizzati sono stati aggiornati", + "cronUpdated": "La pianificazione Cron è stata aggiornata", + "timeOutUpdated": "Il timeout è stato aggiornato", + "variablesUpdated": "le variabili sono state aggiornate", + "platformHostnameUpdated": "Il nome host della piattaforma è stato aggiornato", + "platformPackageNameUpdated": "Il nome del pacchetto della piattaforma è stato aggiornato", + "platformBundleIdUpdated": "L'ID pacchetto piattaforma è stato aggiornato", + "projectNameUpdated": "Il nome del progetto è stato aggiornato", + "documentCreated": "Il documento è stato creato", + "documentDeleted": "Il documento è stato eliminato", + "documentWasUpdated": "Il documento è stato aggiornato!", + "attributeDeleted": "L'attributo è stato eliminato", + "sessionLimitUpdated": "Il limite delle sessioni è stato aggiornato", + "pswdHistoryLimitUpdated": "Limite cronologia password aggiornato.", + "pswdDictonaryCheck": "Controllo dizionario password aggiornato.", + "functionExecuted": "La funzione è stata eseguita", + "deploymentDeleted": "Il deployment è stato eliminato", + "deploymentActivated": "La distribuzione è stata attivata", + "variablesUploaded": "Variabili caricate", + "wasDeletedFrom": "è stato eliminato da", + "inviteSentTo": "L'invito è stato inviato a", + "yourExperience": "Com'è la tua esperienza con la nostra nuova funzione 'Relazioni'? Ci piacerebbe sentire il tuo feedback!", + "attribute": "Attributo", + "theAccount": "L'account", + "serviceHasBeen": "il servizio è stato", + "hasBeen": "è stato", + "verified": "verificato", + "unVerfied": "non verificato", + "blocked": "bloccato", + "unBlocked": "bloccato", + "enabled": "abilitato", + "disabled": "disabilitato" + } + } +} diff --git a/src/lib/components/LanguageSelector.svelte b/src/lib/components/LanguageSelector.svelte new file mode 100644 index 0000000000..95c25148fe --- /dev/null +++ b/src/lib/components/LanguageSelector.svelte @@ -0,0 +1,29 @@ + + + diff --git a/src/lib/components/empty.svelte b/src/lib/components/empty.svelte index 2c01f69faa..9b569e8104 100644 --- a/src/lib/components/empty.svelte +++ b/src/lib/components/empty.svelte @@ -5,6 +5,7 @@ import EmptyDark from '$lib/images/empty-dark.svg'; import { Heading } from '.'; import { trackEvent } from '$lib/actions/analytics'; + import LL from '$i18n/i18n-svelte'; export let single = false; export let target: string = null; @@ -40,9 +41,12 @@
- Create your first {target} to get started. + {$LL.console.project.texts.components.create()} + {target} + {$LL.console.project.texts.components.getStarted()}

- Need a hand? Learn more in our documentation. + {$LL.console.project.texts.components.needHand()}

@@ -51,9 +55,11 @@ {href} text event="empty_documentation" - ariaLabel={`create {target}`}>Documentation + ariaLabel={`create {target}`} + >{$LL.console.project.button.documentation()}
diff --git a/src/lib/components/index.ts b/src/lib/components/index.ts index f891b82552..e4cd09d4d2 100644 --- a/src/lib/components/index.ts +++ b/src/lib/components/index.ts @@ -38,6 +38,7 @@ export { default as Steps } from './steps.svelte'; export { default as Step } from './step.svelte'; export { default as Code } from './code.svelte'; export { default as Json } from './json.svelte'; +export { default as LanguageSelector } from './LanguageSelector.svelte'; export { default as CustomId } from './customId.svelte'; export { default as Secret } from './secret.svelte'; export { default as Trim } from './trim.svelte'; diff --git a/src/lib/components/limit.svelte b/src/lib/components/limit.svelte index 7594ccc94e..b9e39825e1 100644 --- a/src/lib/components/limit.svelte +++ b/src/lib/components/limit.svelte @@ -1,6 +1,7 @@ - Custom permission + {$LL.console.project.title.customPermission()}

- Custom permissions allow you to grant access to specific users or teams using their ID and - role. + {$LL.console.project.texts.components.custom.permission()}

- A permission should be formatted as: user:[USER_ID] or team:[TEAM_ID]/[ROLE]¸ + {$LL.console.project.texts.components.custom.permissionFormation()} + {$LL.console.project.texts.components.custom.user()}[USER_ID] {$LL.console.project.texts.components.custom.or()} + {$LL.console.project.texts.components.custom.team()}[TEAM_ID]/[ROLE]¸ - +
diff --git a/src/lib/components/permissions/permissions.svelte b/src/lib/components/permissions/permissions.svelte index e50feb9a6d..44d95b07d9 100644 --- a/src/lib/components/permissions/permissions.svelte +++ b/src/lib/components/permissions/permissions.svelte @@ -24,6 +24,7 @@ import { writable, type Unsubscriber } from 'svelte/store'; import Actions from './actions.svelte'; import Row from './row.svelte'; + import LL from '$i18n/i18n-svelte'; export let withCreate = false; export let permissions: string[] = []; @@ -144,13 +145,14 @@ {#if [...$groups]?.length} - Role + {$LL.console.project.table.header.role()} {#if withCreate} - Create + {$LL.console.project.table.header.create()} {/if} - Read - Update - Delete + {$LL.console.project.table.header.read()} + {$LL.console.project.table.header.update()} + {$LL.console.project.table.header.delete()} @@ -220,7 +222,7 @@ on:create={create}> {:else} @@ -240,7 +242,7 @@
- Add a role to get started + {$LL.console.project.texts.components.addRole()}
diff --git a/src/lib/components/permissions/roles.svelte b/src/lib/components/permissions/roles.svelte index 7f2b32454b..7cd0f266a0 100644 --- a/src/lib/components/permissions/roles.svelte +++ b/src/lib/components/permissions/roles.svelte @@ -15,6 +15,7 @@ import Actions from './actions.svelte'; import type { Permission } from './permissions.svelte'; import Row from './row.svelte'; + import LL from '$i18n/i18n-svelte'; export let roles: string[] = []; @@ -127,7 +128,7 @@ on:create={create}> {:else} @@ -147,7 +148,7 @@
- Add a role to get started + {$LL.console.project.texts.components.addRole()}
diff --git a/src/lib/components/permissions/row.svelte b/src/lib/components/permissions/row.svelte index 86481e6398..f0baeedc4d 100644 --- a/src/lib/components/permissions/row.svelte +++ b/src/lib/components/permissions/row.svelte @@ -5,6 +5,7 @@ import { tick } from 'svelte'; import { AvatarInitials } from '../'; import Output from '../output.svelte'; + import LL from '$i18n/i18n-svelte'; export let role: string; @@ -33,11 +34,11 @@
{#if role === 'users'} -
Users
+
{$LL.console.project.table.header.users()}
{:else if role === 'guests'} -
Guests
+
{$LL.console.project.table.header.guests()}
{:else if role === 'any'} -
Any
+
{$LL.console.project.table.header.any()}
{:else}
{#if data?.email} -

Email: {data?.email}

+

{$LL.console.project.texts.components.email()} {data?.email}

{/if} {#if data?.phone} -

Phone: {data?.phone}

+

{$LL.console.project.texts.components.phone()} {data?.phone}

{/if}
{:else if isTeam} -

Members: {data?.total}

+

{$LL.console.project.texts.components.members()} {data?.total}

{/if} {/if}
{:else} - Not found. + {$LL.console.project.texts.components.notFound()} {/if}
diff --git a/src/lib/components/permissions/team.svelte b/src/lib/components/permissions/team.svelte index fdd4c5e9c1..c09e9c3a88 100644 --- a/src/lib/components/permissions/team.svelte +++ b/src/lib/components/permissions/team.svelte @@ -6,6 +6,7 @@ import { AvatarInitials, EmptySearch, Modal, PaginationInline } from '..'; import type { Writable } from 'svelte/store'; import type { Permission } from './permissions.svelte'; + import LL from '$i18n/i18n-svelte'; export let show: boolean; export let groups: Writable>; @@ -62,19 +63,17 @@ - Select teams + {$LL.console.project.title.selectTeams()}

- Grant access to any member of a specific team. To grant access to team members with specific - roles, you will need to set a dispatch('custom')} + >{$LL.console.project.button.customPermission()}.

{#if results?.teams?.length}
@@ -109,20 +108,25 @@
-

Total results: {results?.total}

+

+ {$LL.console.project.texts.components.totalResult()} + {results?.total} +

{:else if search}
- Sorry we couldn't find "{search}" -

There are no teams that match your search.

+ {$LL.console.project.texts.components.couldNotFind()} "{search}" +

{$LL.console.project.texts.components.noTeamMembers()}

- + >{$LL.console.project.button.documentation()} +
@@ -131,14 +135,15 @@

- You have no teams. Create a team to see them here. + {$LL.console.project.texts.components.noTeams()}

- Need a hand? Learn more in our - documentation.

@@ -147,6 +152,6 @@ {/if} - + diff --git a/src/lib/components/permissions/user.svelte b/src/lib/components/permissions/user.svelte index 5835023b61..b236d87c0a 100644 --- a/src/lib/components/permissions/user.svelte +++ b/src/lib/components/permissions/user.svelte @@ -6,6 +6,7 @@ import { Query, type Models } from '@appwrite.io/console'; import type { Writable } from 'svelte/store'; import type { Permission } from './permissions.svelte'; + import LL from '$i18n/i18n-svelte'; export let show: boolean; export let groups: Writable>; @@ -62,12 +63,12 @@ - Select users -

Grant access to any authenticated or anonymous user.

+ {$LL.console.project.title.selectUsers()} +

{$LL.console.project.texts.components.grantAccessToUser()}

{#if results?.users?.length}
@@ -128,20 +129,25 @@
-

Total results: {results?.total}

+

+ {$LL.console.project.texts.components.totalResult()} + {results?.total} +

{:else if search}
- Sorry we couldn't find "{search}" -

There are no Users that match your search.

+ {$LL.console.project.texts.components.couldNotFind()} "{search}" +

{$LL.console.project.texts.components.noUserExist()}

- + >{$LL.console.project.button.documentation()} +
@@ -150,14 +156,15 @@

- You have no users. Create a user to see them here. + {$LL.console.project.texts.components.noUsers()}

- Need a hand? Learn more in our - documentation.

@@ -166,6 +173,6 @@ {/if} - + diff --git a/src/lib/components/uploadBox.svelte b/src/lib/components/uploadBox.svelte index 988567eba3..4ca5d1add3 100644 --- a/src/lib/components/uploadBox.svelte +++ b/src/lib/components/uploadBox.svelte @@ -5,6 +5,7 @@ import { Avatar } from '$lib/components'; import { base } from '$app/paths'; import { page } from '$app/stores'; + import LL from '$i18n/i18n-svelte'; let hovering = false; @@ -16,7 +17,8 @@

- Uploading files + {$LL.console.project.texts.components.pagination.uploadingFiles()} {$uploader.files.length}

- Failed + {$LL.console.project.table.pill.failed()}
- Pending + {$LL.console.project.table.pill.pending()} {/if} {/each} diff --git a/src/lib/components/viewSelector.svelte b/src/lib/components/viewSelector.svelte index 82d7d499b8..6ed4bc3e1e 100644 --- a/src/lib/components/viewSelector.svelte +++ b/src/lib/components/viewSelector.svelte @@ -16,6 +16,7 @@ import { onMount } from 'svelte'; import { View } from '$lib/helpers/load'; import { tooltip } from '$lib/actions/tooltip'; + import LL from '$i18n/i18n-svelte'; export let columns: Writable; export let view: View; @@ -84,7 +85,8 @@ class="icon-view-boards u-opacity-50" aria-hidden="true" aria-label="columns" /> - Columns + {$LL.console.project.table.pill.columns()} {selectedColumnsNumber} diff --git a/src/lib/layout/footer.svelte b/src/lib/layout/footer.svelte index fff918da3d..6eafde27e6 100644 --- a/src/lib/layout/footer.svelte +++ b/src/lib/layout/footer.svelte @@ -1,6 +1,7 @@ @@ -19,19 +20,20 @@ href="https://github.com/appwrite/appwrite/releases" target="_blank" rel="noreferrer"> - Version {$version} + {$LL.console.project.texts.footer.version()} + {$version} {/if} @@ -39,7 +41,8 @@
-

Deployment ID:

+

+ {$LL.console.project.texts.footer.deploymentId()} +

{$log.data.$id} @@ -110,10 +116,11 @@
@@ -145,7 +152,9 @@
-

Execution ID:

+

+ {$LL.console.project.texts.footer.executionId()} +

{$log.data.$id} @@ -187,10 +196,11 @@
diff --git a/src/lib/layout/navigation.svelte b/src/lib/layout/navigation.svelte index 15790203bf..ea5007d8cf 100644 --- a/src/lib/layout/navigation.svelte +++ b/src/lib/layout/navigation.svelte @@ -5,6 +5,7 @@ import { tooltip } from '$lib/actions/tooltip'; import { isMac } from '$lib/helpers/platform'; import { slide } from '$lib/helpers/transition'; + import LL from '$i18n/i18n-svelte'; $: project = $page.params.project; $: projectPath = `${base}/console/project-${project}`; @@ -51,7 +52,8 @@ disabled: !narrow }}>
diff --git a/src/lib/layout/unauthenticated.svelte b/src/lib/layout/unauthenticated.svelte index e2470d309a..aeab7f2a28 100644 --- a/src/lib/layout/unauthenticated.svelte +++ b/src/lib/layout/unauthenticated.svelte @@ -5,6 +5,7 @@ import { app } from '$lib/stores/app'; import { base } from '$app/paths'; import { user } from '$lib/stores/user'; + import LL from '$i18n/i18n-svelte'; export let imgLight = LoginLight; export let imgDark = LoginDark; @@ -53,7 +54,7 @@
-

Integrate with your favourite technologies

+

{$LL.console.project.texts.unAuthenticated()}

    {#each technologies as tech} diff --git a/src/lib/layout/wizard.svelte b/src/lib/layout/wizard.svelte index 72321a84b6..9daf9adfe6 100644 --- a/src/lib/layout/wizard.svelte +++ b/src/lib/layout/wizard.svelte @@ -18,6 +18,7 @@ import { wizard } from '$lib/stores/wizard'; import { createEventDispatcher, type SvelteComponent } from 'svelte'; import WizardExitModal from './wizardExitModal.svelte'; + import LL from '$i18n/i18n-svelte'; export let title: string; export let steps: WizardStepsType; @@ -132,24 +133,27 @@
    {#if !isLastStep && sortedSteps[currentStep - 1][1].optional} {/if} {#if currentStep === 1} - - + + {:else if isLastStep} + on:click={() => trackEvent('wizard_back')} + >{$LL.console.project.button.back()} {:else} - + on:click={() => trackEvent('wizard_back')} + >{$LL.console.project.button.back()} + {/if}
diff --git a/src/lib/layout/wizardExitModal.svelte b/src/lib/layout/wizardExitModal.svelte index 6211c9d637..2731ac60b2 100644 --- a/src/lib/layout/wizardExitModal.svelte +++ b/src/lib/layout/wizardExitModal.svelte @@ -1,4 +1,5 @@ - Exit Process + {$LL.console.project.title.exitProcess()}

- Are you sure you want to exit from ? All data will be deleted. This action is - irreversible. + {$LL.console.project.texts.wizardExitModle.areYouSure()} + ? {$LL.console.project.texts.wizardExitModle.dataDelete()}

- - + +
diff --git a/src/lib/mock/copy.test.svelte b/src/lib/mock/copy.test.svelte index ec7911834f..baace0d988 100644 --- a/src/lib/mock/copy.test.svelte +++ b/src/lib/mock/copy.test.svelte @@ -1,9 +1,10 @@ - Content + {$LL.console.project.mock.content()} diff --git a/src/lib/mock/drop.test.svelte b/src/lib/mock/drop.test.svelte index fbf027afd1..223a8f610b 100644 --- a/src/lib/mock/drop.test.svelte +++ b/src/lib/mock/drop.test.svelte @@ -1,12 +1,15 @@ - + -
  • list
  • - other +
  • {$LL.console.project.mock.list()}
  • + {$LL.console.project.mock.other()}
    diff --git a/src/lib/mock/form.test.svelte b/src/lib/mock/form.test.svelte index c900d26e16..ff14cf85fc 100644 --- a/src/lib/mock/form.test.svelte +++ b/src/lib/mock/form.test.svelte @@ -1,11 +1,12 @@
    - - + +
    diff --git a/src/lib/mock/modal.test.svelte b/src/lib/mock/modal.test.svelte index 570da17413..c06f2e23de 100644 --- a/src/lib/mock/modal.test.svelte +++ b/src/lib/mock/modal.test.svelte @@ -1,9 +1,10 @@ - Content + {$LL.console.project.mock.content()} diff --git a/src/lib/mock/wizard.step1.test.svelte b/src/lib/mock/wizard.step1.test.svelte index 48ef8cd029..771f9cc6d6 100644 --- a/src/lib/mock/wizard.step1.test.svelte +++ b/src/lib/mock/wizard.step1.test.svelte @@ -1,4 +1,5 @@ - step-1 - sub-title-1 - - + {$LL.console.project.mock.title.stepOne()} + {$LL.console.project.mock.title.stepStepOne()} + + diff --git a/src/lib/mock/wizard.step2.test.svelte b/src/lib/mock/wizard.step2.test.svelte index 8e8dcd21a1..3b62c1d4cb 100644 --- a/src/lib/mock/wizard.step2.test.svelte +++ b/src/lib/mock/wizard.step2.test.svelte @@ -1,11 +1,13 @@ - step-2 - sub-title-2 - - + {$LL.console.project.mock.title.stepTwo()} + {$LL.console.project.mock.title.stepStepTwo()} + + diff --git a/src/lib/mock/wizard.test.svelte b/src/lib/mock/wizard.test.svelte index 0314a51e7b..69141bbf87 100644 --- a/src/lib/mock/wizard.test.svelte +++ b/src/lib/mock/wizard.test.svelte @@ -4,15 +4,16 @@ import Step2 from './wizard.step2.test.svelte'; import { wizard } from '$lib/stores/wizard'; import type { WizardStepsType } from '$lib/layout/wizard.svelte'; + import LL from '$i18n/i18n-svelte'; const stepsComponents: WizardStepsType = new Map(); stepsComponents.set(1, { - label: 'label-step-1', + label: $LL.console.project.mock.inputs.label.labelStepOne(), component: Step1 }); stepsComponents.set(2, { - label: 'label-step-2', + label: $LL.console.project.mock.inputs.label.labelStepTwo(), component: Step2 }); diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte index 4e9d8e5400..7d0e59738a 100644 --- a/src/routes/+error.svelte +++ b/src/routes/+error.svelte @@ -1,5 +1,6 @@ -Missing Redirect URL +{$LL.auth.title.missingRedirectUrl()}

    - Your Magic URL login flow is missing a proper redirect URL. Please check the + {$LL.auth.texts.magicUrl.loginFlow} Magic URL docs - and send request for new session with a valid redirect URL. + >{$LL.auth.texts.magicUrl.sendMsg} + {$LL.auth.texts.magicUrl.sendMsg}

    diff --git a/src/routes/auth/oauth2/failure/+page.svelte b/src/routes/auth/oauth2/failure/+page.svelte index 359c6ffdca..28805a1e02 100644 --- a/src/routes/auth/oauth2/failure/+page.svelte +++ b/src/routes/auth/oauth2/failure/+page.svelte @@ -1,6 +1,7 @@ -Missing Redirect URL +{$LL.auth.title.missingRedirectUrl()}

    - Your OAuth login flow is missing a proper redirect URL. Please check the + {$LL.auth.texts.oAuth.loginFlow()} OAuth docs - and send request for new session with a valid callback URL. + >{$LL.auth.texts.oAuth.oAuthDocs()} + {$LL.auth.texts.oAuth.sendRequest()}

    diff --git a/src/routes/auth/oauth2/success/+page.svelte b/src/routes/auth/oauth2/success/+page.svelte index 359c6ffdca..28805a1e02 100644 --- a/src/routes/auth/oauth2/success/+page.svelte +++ b/src/routes/auth/oauth2/success/+page.svelte @@ -1,6 +1,7 @@ -Missing Redirect URL +{$LL.auth.title.missingRedirectUrl()}

    - Your OAuth login flow is missing a proper redirect URL. Please check the + {$LL.auth.texts.oAuth.loginFlow()} OAuth docs - and send request for new session with a valid callback URL. + >{$LL.auth.texts.oAuth.oAuthDocs()} + {$LL.auth.texts.oAuth.sendRequest()}

    diff --git a/src/routes/console/+error.svelte b/src/routes/console/+error.svelte index 9a50e9be7c..b50db96083 100644 --- a/src/routes/console/+error.svelte +++ b/src/routes/console/+error.svelte @@ -3,10 +3,11 @@ import { Heading } from '$lib/components'; import { Button } from '$lib/elements/forms'; import { Container } from '$lib/layout'; + import LL from '$i18n/i18n-svelte'; {$page.status} {$page.error.message} - + diff --git a/src/routes/console/account/+layout.svelte b/src/routes/console/account/+layout.svelte index af7ca922be..bec331ad4a 100644 --- a/src/routes/console/account/+layout.svelte +++ b/src/routes/console/account/+layout.svelte @@ -1,5 +1,9 @@ + + - User - Appwrite + {$LL.console.account.title.user()} - Appwrite diff --git a/src/routes/console/account/+page.svelte b/src/routes/console/account/+page.svelte index 9e799fa8fd..e690aa5cfc 100644 --- a/src/routes/console/account/+page.svelte +++ b/src/routes/console/account/+page.svelte @@ -11,6 +11,7 @@ import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; + import LL from '$i18n/i18n-svelte'; let name: string = null, email: string = null, @@ -29,7 +30,7 @@ await sdk.forConsole.account.updateName(name); await invalidate(Dependencies.ACCOUNT); addNotification({ - message: 'Name has been updated', + message: $LL.components.notification.nameUpdated(), type: 'success' }); trackEvent(Submit.AccountUpdateName); @@ -47,7 +48,7 @@ await sdk.forConsole.account.updateEmail(email, emailPassword); await invalidate(Dependencies.ACCOUNT); addNotification({ - message: 'Email has been updated', + message: $LL.components.notification.emailUpdated(), type: 'success' }); trackEvent(Submit.AccountUpdateEmail); @@ -65,7 +66,7 @@ await sdk.forConsole.account.updatePassword(newPassword, oldPassword); newPassword = oldPassword = null; addNotification({ - message: 'Password has been updated', + message: $LL.components.notification.pswdUpdated(), type: 'success' }); trackEvent(Submit.AccountUpdatePassword); @@ -82,35 +83,40 @@
    - Name + {$LL.console.account.forms.updateName.title()}
      - +
    - +
    - Email + {$LL.console.account.forms.updateEmail.title()} {#if email !== $user.email && email} {/if} @@ -119,47 +125,48 @@ + >{$LL.console.account.button.submit.update()}
    - Password + {$LL.console.account.forms.updatePassword.title()}

    - Forgot your password? Recover your password + {$LL.console.account.forms.updatePassword.texts.forgotPassword()} + {$LL.console.account.forms.updatePassword.texts.recoverPassword()}

    - +
    - Delete Account + {$LL.console.account.title.deleteAccount()}

    - Your account will be permanently deleted and access will be lost to any of your teams - and data. This action is irreversible. + {$LL.console.account.texts.deleteAccount()}

    @@ -173,7 +180,8 @@ - +
    diff --git a/src/routes/console/account/delete.svelte b/src/routes/console/account/delete.svelte index 0459c5a4d7..7dfd876931 100644 --- a/src/routes/console/account/delete.svelte +++ b/src/routes/console/account/delete.svelte @@ -6,6 +6,7 @@ import { Button } from '$lib/elements/forms'; import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; + import LL from '$i18n/i18n-svelte'; export let showDelete = false; @@ -16,7 +17,7 @@ showDelete = false; addNotification({ type: 'success', - message: `Account was deleted ` + message: $LL.components.notification.accountDeleted() }); trackEvent(Submit.AccountDelete); } catch (error) { @@ -35,10 +36,11 @@ icon="exclamation" state="warning" headerDivider={false}> - Delete Account -

    Are you sure you want to delete your account?

    + {$LL.console.account.title.deleteAccount()} +

    {$LL.console.account.texts.deleteWarning()}

    - - + + diff --git a/src/routes/console/account/header.svelte b/src/routes/console/account/header.svelte index 71d54f3d3b..8602bd5e37 100644 --- a/src/routes/console/account/header.svelte +++ b/src/routes/console/account/header.svelte @@ -9,29 +9,30 @@ import { Cover, CoverTitle } from '$lib/layout'; import { sdk } from '$lib/stores/sdk'; import { user } from '$lib/stores/user'; + import LL from '$i18n/i18n-svelte'; const path = `/console/account`; $: tabs = [ { href: path, - title: 'Overview', + title: $LL.console.account.navbar.header.overview(), event: 'overview' }, { href: `${path}/sessions`, - title: 'Sessions', + title: $LL.console.account.navbar.header.sessions(), event: 'sessions' }, { href: `${path}/activity`, - title: 'Activity', + title: $LL.console.account.navbar.header.activity(), event: 'activity', hasChildren: true }, { href: `${path}/organizations`, - title: 'Organizations', + title: $LL.console.account.navbar.header.organization(), event: 'organizations', hasChildren: true } @@ -50,7 +51,7 @@ {$user.name}
    - +
    diff --git a/src/routes/console/account/organizations/+page.svelte b/src/routes/console/account/organizations/+page.svelte index f43f7c46ca..5f0b357f2f 100644 --- a/src/routes/console/account/organizations/+page.svelte +++ b/src/routes/console/account/organizations/+page.svelte @@ -13,6 +13,7 @@ import CreateOrganization from '../../createOrganization.svelte'; import { sdk } from '$lib/stores/sdk'; import type { PageData } from './$types'; + import LL from '$i18n/i18n-svelte'; export let data: PageData; @@ -26,11 +27,11 @@
    - Organizations + {$LL.console.account.title.organization()}
    @@ -44,7 +45,8 @@ {@const avatarList = getMemberships(organization.$id)} - {organization?.total ? organization?.total : 'No'} members + {organization?.total ? organization?.total : 'No'} + {$LL.console.account.texts.members()} {organization.name} @@ -57,12 +59,12 @@ {/each} -

    Create a new organization

    +

    {$LL.console.account.texts.createOrg()}

    {:else} (addOrganization = true)}> -

    Create a new organization

    +

    {$LL.console.account.texts.createOrg()}

    {/if} diff --git a/src/routes/console/account/sessions/+page.svelte b/src/routes/console/account/sessions/+page.svelte index fc15bebe05..15ae5a8552 100644 --- a/src/routes/console/account/sessions/+page.svelte +++ b/src/routes/console/account/sessions/+page.svelte @@ -19,6 +19,7 @@ import type { PageData } from './$types'; import { Submit, trackEvent } from '$lib/actions/analytics'; import { base } from '$app/paths'; + import LL from '$i18n/i18n-svelte'; export let data: PageData; @@ -45,19 +46,21 @@
    - Sessions + {$LL.console.account.title.sessions()}
    {#if data.sessions.total} - Client - Location - IP + {$LL.console.account.table.header.client()} + {$LL.console.account.table.header.location()} + {$LL.console.account.table.header.ip()} @@ -76,18 +79,22 @@ {session.clientName} {session.clientVersion} - on {session.osName} + {$LL.console.account.table.trim.on()} + {session.osName} {session.osVersion} {:else} -

    Unknown

    +

    + {$LL.console.account.table.texts.unknown()} +

    {/if}
    {session.provider}
    {#if session.current} - current session + {$LL.console.account.table.pill.alert.current()} {/if}
    @@ -95,12 +102,13 @@ {#if session.countryCode !== '--'} {session.countryName} {:else} - Unknown + {$LL.console.account.table.texts.unknown()} {/if} {session.ip} - + {/each} @@ -110,20 +118,20 @@
    -

    No sessions available

    +

    {$LL.console.account.texts.noSession()}

    {/if}
    -

    Total results: {data.sessions.total}

    +

    {$LL.console.account.texts.totalResult()} {data.sessions.total}

    diff --git a/src/routes/console/createOrganization.svelte b/src/routes/console/createOrganization.svelte index bff7bc9456..a081bc6de5 100644 --- a/src/routes/console/createOrganization.svelte +++ b/src/routes/console/createOrganization.svelte @@ -9,6 +9,7 @@ import { Dependencies } from '$lib/constants'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; import { ID } from '@appwrite.io/console'; + import LL from '$i18n/i18n-svelte'; export let show = false; @@ -27,7 +28,7 @@ await goto(`/console/organization-${org.$id}`); addNotification({ type: 'success', - message: `${name} has been created` + message: `${name} ${$LL.components.notification.hasBeenCreated()}` }); trackEvent(Submit.OrganizationCreate, { customId: !!id @@ -43,12 +44,12 @@ - Create New Organization + {$LL.console.forms.createOrg.title()} @@ -56,7 +57,7 @@
    (showCustomId = !showCustomId)}>
    @@ -65,7 +66,7 @@ {/if}
    - - + +
    diff --git a/src/routes/console/onboarding/+layout.svelte b/src/routes/console/onboarding/+layout.svelte index 3fad2e9ed2..d90ebcc8c5 100644 --- a/src/routes/console/onboarding/+layout.svelte +++ b/src/routes/console/onboarding/+layout.svelte @@ -1,5 +1,9 @@ + + - Onboarding - Appwrite + {$LL.console.onboarding.title.onboarding()} - Appwrite diff --git a/src/routes/console/onboarding/+page.svelte b/src/routes/console/onboarding/+page.svelte index be55cba83b..2f20c7ecbe 100644 --- a/src/routes/console/onboarding/+page.svelte +++ b/src/routes/console/onboarding/+page.svelte @@ -11,6 +11,7 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { ID } from '@appwrite.io/console'; + import LL from '$i18n/i18n-svelte'; let name: string; let id: string; @@ -51,15 +52,15 @@ {#if !showCustomId}
    (showCustomId = !showCustomId)}>
    @@ -67,7 +68,7 @@ {/if}
    diff --git a/src/routes/console/onboarding/header.svelte b/src/routes/console/onboarding/header.svelte index 51f7314c6e..7a1bb9768c 100644 --- a/src/routes/console/onboarding/header.svelte +++ b/src/routes/console/onboarding/header.svelte @@ -1,7 +1,8 @@ - Let's create your first project + {$LL.console.onboarding.title.coverTitle()} diff --git a/src/routes/console/organization-[organization]/+layout.svelte b/src/routes/console/organization-[organization]/+layout.svelte index ae86b80378..7c84129a81 100644 --- a/src/routes/console/organization-[organization]/+layout.svelte +++ b/src/routes/console/organization-[organization]/+layout.svelte @@ -2,10 +2,11 @@ import { newOrgModal, newMemberModal } from '$lib/stores/organization'; import CreateMember from './createMember.svelte'; import Create from '../createOrganization.svelte'; + import LL from '$i18n/i18n-svelte'; - Organizations - Appwrite + {$LL.console.organization.title.organization()} - Appwrite diff --git a/src/routes/console/organization-[organization]/+page.svelte b/src/routes/console/organization-[organization]/+page.svelte index d039ac7d37..d5aba6b4ce 100644 --- a/src/routes/console/organization-[organization]/+page.svelte +++ b/src/routes/console/organization-[organization]/+page.svelte @@ -8,6 +8,7 @@ import CreateOrganization from '../createOrganization.svelte'; import type { PageData } from './$types'; import { page } from '$app/stores'; + import LL from '$i18n/i18n-svelte'; export let data: PageData; @@ -47,9 +48,10 @@
    - Projects + {$LL.console.organization.title.project()}
    @@ -62,7 +64,11 @@ {#each data.projects.projects as project} - {project?.platforms?.length ? project?.platforms?.length : 'No'} apps + {project?.platforms?.length + ? project?.platforms?.length + : $LL.console.organization.texts.no()} + {' '} + {$LL.console.organization.texts.apps()} {project.name} @@ -86,12 +92,12 @@ {/each} -

    Create a new project

    +

    {$LL.console.organization.texts.createProject()}

    {:else} (showCreate = true)}> -

    Create a new project

    +

    {$LL.console.organization.texts.createProject()}

    {/if} diff --git a/src/routes/console/organization-[organization]/createMember.svelte b/src/routes/console/organization-[organization]/createMember.svelte index c32f67cbc5..05793b673a 100644 --- a/src/routes/console/organization-[organization]/createMember.svelte +++ b/src/routes/console/organization-[organization]/createMember.svelte @@ -9,6 +9,7 @@ import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; + import LL from '$i18n/i18n-svelte'; export let showCreate = false; @@ -32,7 +33,7 @@ showCreate = false; addNotification({ type: 'success', - message: `Invite has been sent to ${email}` + message: `${$LL.components.notification.inviteSentTo()} ${email}` }); trackEvent(Submit.MemberCreate); dispatch('created', team); @@ -50,23 +51,25 @@ - Invite Member + {$LL.console.organization.forms.createMember.title()} - - + + diff --git a/src/routes/console/organization-[organization]/createProject.svelte b/src/routes/console/organization-[organization]/createProject.svelte index 7c8897aa6d..f0c6fa8af5 100644 --- a/src/routes/console/organization-[organization]/createProject.svelte +++ b/src/routes/console/organization-[organization]/createProject.svelte @@ -8,6 +8,7 @@ import { sdk } from '$lib/stores/sdk'; import { ID } from '@appwrite.io/console'; import { createEventDispatcher } from 'svelte'; + import LL from '$i18n/i18n-svelte'; export let show = false; export let teamId: string; @@ -34,7 +35,7 @@ }); addNotification({ type: 'success', - message: `${name} has been created` + message: `${name} ${$LL.components.notification.hasBeenCreated()}` }); await goto(`/console/project-${project.$id}`); } catch (e) { @@ -45,14 +46,20 @@ - Create Project + {$LL.console.organization.forms.createProject.title()} - + {#if !showCustomId}
    (showCustomId = !showCustomId)}>
    @@ -61,7 +68,8 @@ {/if}
    - - + +
    diff --git a/src/routes/console/organization-[organization]/deleteMember.svelte b/src/routes/console/organization-[organization]/deleteMember.svelte index aa60711fe1..c13906945b 100644 --- a/src/routes/console/organization-[organization]/deleteMember.svelte +++ b/src/routes/console/organization-[organization]/deleteMember.svelte @@ -9,6 +9,7 @@ import { createEventDispatcher } from 'svelte'; import { user } from '$lib/stores/user'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; + import LL from '$i18n/i18n-svelte'; const dispatch = createEventDispatcher(); @@ -28,7 +29,7 @@ showDelete = false; addNotification({ type: 'success', - message: `${selectedMember.userName} was deleted from ${selectedMember.teamName}` + message: `${selectedMember.userName} ${$LL.components.notification.wasDeletedFrom()} ${selectedMember.teamName}` }); trackEvent(Submit.MemberDelete); } catch (error) { @@ -58,7 +59,8 @@ : `Are you sure you want to delete ${selectedMember?.userName} from '${selectedMember?.teamName}'?`}

    - + diff --git a/src/routes/console/organization-[organization]/deleteOrganization.svelte b/src/routes/console/organization-[organization]/deleteOrganization.svelte index 6a56a6d9c7..7c0ca87932 100644 --- a/src/routes/console/organization-[organization]/deleteOrganization.svelte +++ b/src/routes/console/organization-[organization]/deleteOrganization.svelte @@ -8,6 +8,7 @@ import { base } from '$app/paths'; import { Dependencies } from '$lib/constants'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; + import LL from '$i18n/i18n-svelte'; export let showDelete = false; @@ -17,7 +18,7 @@ await invalidate(Dependencies.ACCOUNT); addNotification({ type: 'success', - message: `${$organization.name} has been deleted` + message: `${$organization.name} ${$LL.components.notification.hasBeenUpdated()}` }); trackEvent(Submit.OrganizationDelete); if ($organizationList?.total > 1) { @@ -42,13 +43,16 @@ icon="exclamation" state="warning" headerDivider={false}> - Delete Organization + {$LL.console.organization.forms.deleteOrg.title()}

    - Are you sure you want to delete {$organization.name}? All projects ({$organization.total}) - and data associated with this organization will be deleted. This action is irreversible. + {$LL.console.organization.forms.deleteOrg.texts.phraseOne()}{' '}{$organization.name}{$LL.console.organization.forms.deleteOrg.texts.phraseTwo()}{' '}({$organization.total}){' '} + {$LL.console.organization.forms.deleteOrg.texts.phraseThree()}

    - - + + diff --git a/src/routes/console/organization-[organization]/header.svelte b/src/routes/console/organization-[organization]/header.svelte index 8f115ad1bf..33551b496b 100644 --- a/src/routes/console/organization-[organization]/header.svelte +++ b/src/routes/console/organization-[organization]/header.svelte @@ -12,6 +12,7 @@ organization, organizationList } from '$lib/stores/organization'; + import LL from '$i18n/i18n-svelte'; let showDropdown = false; @@ -21,20 +22,20 @@ $: tabs = [ { href: path, - title: 'Projects', + title: $LL.console.organization.navbar.header.projects(), event: 'projects', hasChildren: true }, { href: `${path}/members`, - title: 'Members', + title: $LL.console.organization.navbar.header.members(), event: 'members', hasChildren: true }, { href: `${path}/settings`, - event: 'settings', - title: 'Settings' + title: $LL.console.organization.navbar.header.settings(), + event: 'settings' } ]; @@ -65,7 +66,7 @@
      newOrgModal.set(true)}> - New Organization + {$LL.console.organization.texts.dropDown()}
    @@ -77,7 +78,7 @@
    diff --git a/src/routes/console/organization-[organization]/members/+page.svelte b/src/routes/console/organization-[organization]/members/+page.svelte index 140a595104..32f1c26fc2 100644 --- a/src/routes/console/organization-[organization]/members/+page.svelte +++ b/src/routes/console/organization-[organization]/members/+page.svelte @@ -22,6 +22,7 @@ import type { Models } from '@appwrite.io/console'; import type { PageData } from './$types'; import Delete from '../deleteMember.svelte'; + import LL from '$i18n/i18n-svelte'; export let data: PageData; @@ -42,7 +43,7 @@ ); addNotification({ type: 'success', - message: `Invite has been sent to ${member.userEmail}` + message: `${$LL.components.notification.inviteSentTo()} ${member.userEmail}` }); trackEvent(Submit.MemberCreate); } catch (error) { @@ -58,18 +59,20 @@ {#if data.organizationMembers.total}
    - Members + {$LL.console.organization.title.members()}
    - Name - Email + {$LL.console.organization.table.header.name()} + {$LL.console.organization.table.header.email()} @@ -83,7 +86,8 @@ {member.userName ? member.userName : 'n/a'} {#if member.invited && !member.joined} - Pending + {$LL.console.organization.table.pill.pending()} {/if} @@ -93,7 +97,8 @@ + on:click={() => resend(member)} + >{$LL.console.organization.button.resend()} {/if} diff --git a/src/routes/console/organization-[organization]/settings/+page.svelte b/src/routes/console/organization-[organization]/settings/+page.svelte index ec066ada42..247639d6fe 100644 --- a/src/routes/console/organization-[organization]/settings/+page.svelte +++ b/src/routes/console/organization-[organization]/settings/+page.svelte @@ -10,6 +10,7 @@ import { onMount } from 'svelte'; import Delete from '../deleteOrganization.svelte'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; + import LL from '$i18n/i18n-svelte'; let name: string; let showDelete = false; @@ -23,7 +24,7 @@ await sdk.forConsole.teams.updateName($organization.$id, name); await invalidate(Dependencies.ORGANIZATION); addNotification({ - message: 'Name has been updated', + message: $LL.components.notification.nameUpdated(), type: 'success' }); trackEvent(Submit.OrganizationUpdateName); @@ -43,32 +44,34 @@ {#if $organization}
    - Name + {$LL.console.organization.forms.updateName.title()}
    - +
    - Delete Organization + {$LL.console.organization.forms.deleteOrg.title()}

    - The organization will be permanently deleted, including all projects and data - associated with this organization. This action is irreversible. + {$LL.console.organization.forms.deleteOrg.texts.orgSettings()}

    @@ -78,12 +81,13 @@
    {$organization.name}
    -

    {$organization.total} members

    +

    {$organization.total}{' '}{$LL.console.organization.texts.members()}

    - +
    {/if} diff --git a/src/routes/console/project-[project]/auth/+layout.svelte b/src/routes/console/project-[project]/auth/+layout.svelte index f900d77341..7d50e86d85 100644 --- a/src/routes/console/project-[project]/auth/+layout.svelte +++ b/src/routes/console/project-[project]/auth/+layout.svelte @@ -1,5 +1,9 @@ + + - Auth - Appwrite + {$LL.console.project.title.auth()} - Appwrite diff --git a/src/routes/console/project-[project]/auth/+page.svelte b/src/routes/console/project-[project]/auth/+page.svelte index 0063f7ea1f..9d05cefd64 100644 --- a/src/routes/console/project-[project]/auth/+page.svelte +++ b/src/routes/console/project-[project]/auth/+page.svelte @@ -26,11 +26,13 @@ import Create from './createUser.svelte'; import type { Models } from '@appwrite.io/console'; import type { PageData } from './$types'; + import LL from '$i18n/i18n-svelte'; export let data: PageData; let showCreate = false; const projectId = $page.params.project; + async function userCreated(event: CustomEvent>>) { await goto(`${base}/console/project-${projectId}/auth/user-${event.detail.$id}`); } @@ -39,17 +41,23 @@ + {#if data.users.total} - Name - Identifiers - Status - ID - Joined + {$LL.console.project.table.header.name()} + {$LL.console.project.table.header.identifiers()} + {$LL.console.project.table.header.status()} + {$LL.console.project.table.header.id()} + {$LL.console.project.table.header.joined()} {#each data.users.users as user} @@ -83,22 +91,23 @@ {#if user.status} {user.emailVerification && user.phoneVerification - ? 'verified' + ? `${$LL.console.project.table.pill.verify()}` : user.emailVerification - ? 'verified email' + ? `${$LL.console.project.table.pill.emialVerify()}` : user.phoneVerification - ? 'verified phone' - : 'unverified'} + ? `${$LL.console.project.table.pill.phoneVerify()}` + : `${$LL.console.project.table.pill.unverify()}`} {:else} - blocked + {$LL.console.project.table.pill.block()} {/if} @@ -118,10 +127,11 @@ {:else if data.search}
    - Sorry, we couldn't find '{data.search}' -

    There are no users that match your search.

    + {$LL.console.project.texts.emptySearch.phraseOne()} '{data.search}' +

    {$LL.console.project.texts.emptySearch.phraseTwo()}.

    - +
    {:else} - {provider.name} OAuth2 Settings + {provider.name}{' '}{$LL.console.project.title.oAuth2()}

    - To use {provider.name} authentication in your application, first fill in this form. For more - info you can + {$LL.console.project.texts.oAuthProvider.textOne()}{' '}{provider.name}{' '}{$LL.console.project.texts.oAuthProvider.phraseOne()} - visit the docs. + {$LL.console.project.links.oAuthProvider.visitDoc()}

    - + - - - + + + - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. + {$LL.console.project.alert.oAuthProvider.fieldOne()}{' '}{provider.name}{' '} + {$LL.console.project.alert.oAuthProvider.fieldTwo()}
    -

    URI

    +

    {$LL.console.project.texts.oAuthProvider.uri()}

    - + + submit>{$LL.console.project.button.submit.update()} diff --git a/src/routes/console/project-[project]/auth/auth0OAuth.svelte b/src/routes/console/project-[project]/auth/auth0OAuth.svelte index b8e0fa35cf..49b721786f 100644 --- a/src/routes/console/project-[project]/auth/auth0OAuth.svelte +++ b/src/routes/console/project-[project]/auth/auth0OAuth.svelte @@ -6,6 +6,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { updateOAuth } from './updateOAuth'; + import LL from '$i18n/i18n-svelte'; export let provider: Provider; @@ -39,38 +40,45 @@ - {provider.name} OAuth2 Settings + {provider.name}{' '}{$LL.console.project.title.oAuth2()}

    - To use {provider.name} authentication in your application, first fill in this form. For more - info you can - visit the docs. + {$LL.console.project.texts.oAuthProvider.textOne()}{' '}{provider.name}{' '}{$LL.console.project.texts.oAuthProvider.phraseOne()} + + {$LL.console.project.links.oAuthProvider.visitDoc()} +

    - + - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. + {$LL.console.project.alert.oAuthProvider.fieldOne()}{' '}{provider.name}{' '} + {$LL.console.project.alert.oAuthProvider.fieldTwo()}
    -

    URI

    +

    {$LL.console.project.texts.oAuthProvider.uri()}

    - + + submit>{$LL.console.project.button.submit.update()} diff --git a/src/routes/console/project-[project]/auth/authentikOAuth.svelte b/src/routes/console/project-[project]/auth/authentikOAuth.svelte index 350fac230b..3a11375e19 100644 --- a/src/routes/console/project-[project]/auth/authentikOAuth.svelte +++ b/src/routes/console/project-[project]/auth/authentikOAuth.svelte @@ -6,6 +6,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { updateOAuth } from './updateOAuth'; + import LL from '$i18n/i18n-svelte'; export let provider: Provider; @@ -39,38 +40,45 @@ - {provider.name} OAuth2 Settings + {provider.name}{' '}{$LL.console.project.title.oAuth2()}

    - To use {provider.name} authentication in your application, first fill in this form. For more - info you can - visit the docs. + {$LL.console.project.texts.oAuthProvider.textOne()}{' '}{provider.name}{' '}{$LL.console.project.texts.oAuthProvider.phraseOne()} + + {$LL.console.project.links.oAuthProvider.visitDoc()} +

    - + - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. + {$LL.console.project.alert.oAuthProvider.fieldOne()}{' '}{provider.name}{' '} + {$LL.console.project.alert.oAuthProvider.fieldTwo()}
    -

    URI

    +

    {$LL.console.project.texts.oAuthProvider.uri()}

    - + + submit>{$LL.console.project.button.submit.update()} diff --git a/src/routes/console/project-[project]/auth/createTeam.svelte b/src/routes/console/project-[project]/auth/createTeam.svelte index 9215d63493..d61f4fd966 100644 --- a/src/routes/console/project-[project]/auth/createTeam.svelte +++ b/src/routes/console/project-[project]/auth/createTeam.svelte @@ -7,6 +7,7 @@ import { sdk } from '$lib/stores/sdk'; import { ID } from '@appwrite.io/console'; import { createEventDispatcher } from 'svelte'; + import LL from '$i18n/i18n-svelte'; export let showCreate = false; @@ -23,7 +24,7 @@ showCustomId = false; addNotification({ type: 'success', - message: `${team.name} has been created` + message: `${team.name} ${$LL.components.notification.hasBeenCreated()}` }); trackEvent(Submit.TeamCreate, { customId: !!id @@ -42,12 +43,12 @@ - Create Team + {$LL.console.project.title.createTeam()} @@ -55,7 +56,7 @@
    (showCustomId = !showCustomId)} >
    {:else} @@ -63,7 +64,8 @@ {/if}
    - - + +
    diff --git a/src/routes/console/project-[project]/auth/createUser.svelte b/src/routes/console/project-[project]/auth/createUser.svelte index c00709849f..1fea184a1a 100644 --- a/src/routes/console/project-[project]/auth/createUser.svelte +++ b/src/routes/console/project-[project]/auth/createUser.svelte @@ -14,6 +14,7 @@ import { sdk } from '$lib/stores/sdk'; import { ID } from '@appwrite.io/console'; import { createEventDispatcher } from 'svelte'; + import LL from '$i18n/i18n-svelte'; export let showCreate = false; @@ -37,7 +38,7 @@ showDropdown = false; addNotification({ type: 'success', - message: `${user.name ? user.name : 'User'} has been created` + message: `${user.name ? user.name : 'User'} ${$LL.components.notification.hasBeenCreated()}` }); trackEvent(Submit.UserCreate, { customId: !!id @@ -59,20 +60,28 @@ - Create User + {$LL.console.title.createUser()} - - + + @@ -80,7 +89,7 @@
    (showDropdown = !showDropdown)}>
    @@ -89,7 +98,7 @@ {/if}
    - - + +
    diff --git a/src/routes/console/project-[project]/auth/gitlabOAuth.svelte b/src/routes/console/project-[project]/auth/gitlabOAuth.svelte index 2b5aea8a64..8e091c6614 100644 --- a/src/routes/console/project-[project]/auth/gitlabOAuth.svelte +++ b/src/routes/console/project-[project]/auth/gitlabOAuth.svelte @@ -6,6 +6,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { updateOAuth } from './updateOAuth'; + import LL from '$i18n/i18n-svelte'; export let provider: Provider; @@ -22,6 +23,7 @@ }); const projectId = $page.params.project; + const update = async () => { const result = await updateOAuth({ projectId, provider, secret, appId, enabled }); @@ -37,38 +39,45 @@ - {provider.name} OAuth2 Settings + {provider.name}{' '}{$LL.console.project.title.oAuth2()}

    - To use {provider.name} authentication in your application, first fill in this form. For more - info you can - visit the docs. + {$LL.console.project.texts.oAuthProvider.textOne()}{' '}{provider.name}{' '}{$LL.console.project.texts.oAuthProvider.phraseOne()} + + {$LL.console.project.links.oAuthProvider.visitDoc()} +

    - + - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. + {$LL.console.project.alert.oAuthProvider.fieldOne()}{' '}{provider.name}{' '} + {$LL.console.project.alert.oAuthProvider.fieldTwo()}
    -

    URI

    +

    {$LL.console.project.texts.oAuthProvider.uri()}

    - + + submit>{$LL.console.project.button.submit.update()} diff --git a/src/routes/console/project-[project]/auth/header.svelte b/src/routes/console/project-[project]/auth/header.svelte index 1e43c859b4..244306c17c 100644 --- a/src/routes/console/project-[project]/auth/header.svelte +++ b/src/routes/console/project-[project]/auth/header.svelte @@ -3,36 +3,37 @@ import { Tab, Tabs } from '$lib/components'; import { isTabSelected } from '$lib/helpers/load'; import { Cover, CoverTitle } from '$lib/layout'; + import LL from '$i18n/i18n-svelte'; const projectId = $page.params.project; const path = `/console/project-${projectId}/auth`; const tabs = [ { href: path, - title: 'Users', + title: $LL.console.project.navbar.header.users(), hasChildren: true, event: 'users' }, { href: `${path}/teams`, - title: 'Teams', + title: $LL.console.project.navbar.header.teams(), hasChildren: true, event: 'teams' }, { href: `${path}/usage`, - title: 'Usage', + title: $LL.console.project.navbar.header.usage(), hasChildren: true, event: 'usage' }, { href: `${path}/security`, - title: 'Security', + title: $LL.console.project.navbar.header.security(), event: 'security' }, { href: `${path}/settings`, - title: 'Settings', + title: $LL.console.project.navbar.header.settings(), event: 'settings' } ]; @@ -40,7 +41,7 @@ - Auth + {$LL.console.project.title.auth()} {#each tabs as tab} diff --git a/src/routes/console/project-[project]/auth/mainOAuth.svelte b/src/routes/console/project-[project]/auth/mainOAuth.svelte index 684e8ff81d..7bf1fcf2ca 100644 --- a/src/routes/console/project-[project]/auth/mainOAuth.svelte +++ b/src/routes/console/project-[project]/auth/mainOAuth.svelte @@ -6,6 +6,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { updateOAuth } from './updateOAuth'; + import LL from '$i18n/i18n-svelte'; export let provider: Provider; @@ -35,33 +36,40 @@ - {provider.name} OAuth2 Settings + {provider.name}{' '}{$LL.console.project.title.oAuth2()}

    - To use {provider.name} authentication in your application, first fill in this form. For more - info you can - visit the docs. + {$LL.console.project.texts.oAuthProvider.textOne()}{' '}{provider.name}{' '}{$LL.console.project.texts.oAuthProvider.phraseOne()} + + {$LL.console.project.links.oAuthProvider.visitDoc()} +

    - + - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. + {$LL.console.project.alert.oAuthProvider.fieldOne()}{' '}{provider.name}{' '} + {$LL.console.project.alert.oAuthProvider.fieldTwo()}
    -

    URI

    +

    {$LL.console.project.texts.oAuthProvider.uri()}

    - + + submit>{$LL.console.project.button.submit.update()} diff --git a/src/routes/console/project-[project]/auth/microsoftOAuth.svelte b/src/routes/console/project-[project]/auth/microsoftOAuth.svelte index e404fec845..251c831056 100644 --- a/src/routes/console/project-[project]/auth/microsoftOAuth.svelte +++ b/src/routes/console/project-[project]/auth/microsoftOAuth.svelte @@ -6,6 +6,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { updateOAuth } from './updateOAuth'; + import LL from '$i18n/i18n-svelte'; export let provider: Provider; @@ -38,39 +39,45 @@ - {provider.name} OAuth2 Settings + {provider.name}{' '}{$LL.console.project.title.oAuth2()}

    - To use {provider.name} authentication in your application, first fill in this form. For more - info you can + {$LL.console.project.texts.oAuthProvider.textOne()}{' '}{provider.name}{' '}{$LL.console.project.texts.oAuthProvider.phraseOne()} - visit the docs. + {$LL.console.project.links.oAuthProvider.visitDoc()}

    - + - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. + {$LL.console.project.alert.oAuthProvider.fieldOne()}{' '}{provider.name}{' '} + {$LL.console.project.alert.oAuthProvider.fieldTwo()}
    -

    URI

    +

    {$LL.console.project.texts.oAuthProvider.uri()}

    - + + submit>{$LL.console.project.button.submit.update()} diff --git a/src/routes/console/project-[project]/auth/oktaOAuth.svelte b/src/routes/console/project-[project]/auth/oktaOAuth.svelte index 98f607df1a..4862de1055 100644 --- a/src/routes/console/project-[project]/auth/oktaOAuth.svelte +++ b/src/routes/console/project-[project]/auth/oktaOAuth.svelte @@ -6,6 +6,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { updateOAuth } from './updateOAuth'; + import LL from '$i18n/i18n-svelte'; const projectId = $page.params.project; @@ -43,44 +44,51 @@ - {provider.name} OAuth2 Settings + {provider.name}{' '}{$LL.console.project.title.oAuth2()}

    - To use {provider.name} authentication in your application, first fill in this form. For more - info you can - visit the docs. + {$LL.console.project.texts.oAuthProvider.textOne()}{' '}{provider.name}{' '}{$LL.console.project.texts.oAuthProvider.phraseOne()} + + {$LL.console.project.links.oAuthProvider.visitDoc()} +

    - + - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. + {$LL.console.project.alert.oAuthProvider.fieldOne()}{' '}{provider.name}{' '} + {$LL.console.project.alert.oAuthProvider.fieldTwo()}
    -

    URI

    +

    {$LL.console.project.texts.oAuthProvider.uri()}

    - + + submit>{$LL.console.project.button.submit.update()} diff --git a/src/routes/console/project-[project]/auth/security/updatePasswordDictionary.svelte b/src/routes/console/project-[project]/auth/security/updatePasswordDictionary.svelte index dd183af366..9e404d6602 100644 --- a/src/routes/console/project-[project]/auth/security/updatePasswordDictionary.svelte +++ b/src/routes/console/project-[project]/auth/security/updatePasswordDictionary.svelte @@ -7,6 +7,7 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { project } from '../../store'; + import LL from '$i18n/i18n-svelte'; const projectId = $project.$id; let passwordDictionary = $project.authPasswordDictionary ?? false; @@ -20,7 +21,7 @@ await invalidate(Dependencies.PROJECT); addNotification({ type: 'success', - message: 'Updated password dictionary check.' + message: $LL.components.notification.pswdDictonaryCheck() }); trackEvent(Submit.AuthPasswordDictionaryUpdate); } catch (error) { @@ -35,28 +36,28 @@
    - Password Dictionary + {$LL.console.project.title.security.passwordDictionary()} + label={$LL.console.project.forms.security.inputs.passwordDictionary.label()} />

    - Enabling this option prevent users from setting insecure passwords by comparing the - user's password with the 10k most commonly used passwords. + >{$LL.console.project.links.passwordDictionary()}

    + >{$LL.console.project.button.submit.update()}
    diff --git a/src/routes/console/project-[project]/auth/security/updatePasswordHistory.svelte b/src/routes/console/project-[project]/auth/security/updatePasswordHistory.svelte index 27a28b5d14..2dd81f5ee3 100644 --- a/src/routes/console/project-[project]/auth/security/updatePasswordHistory.svelte +++ b/src/routes/console/project-[project]/auth/security/updatePasswordHistory.svelte @@ -8,6 +8,7 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { project } from '../../store'; + import LL from '$i18n/i18n-svelte'; const projectId = $project.$id; let passwordHistory = $project.authPasswordHistory < 1 ? 5 : $project.authPasswordHistory; @@ -24,7 +25,7 @@ initialPasswordHistoryEnabled = passwordHistoryEnabled; addNotification({ type: 'success', - message: 'Updated password history limit.' + message: $LL.components.notification.pswdHistoryLimitUpdated() }); trackEvent(Submit.AuthPasswordHistoryUpdate); } catch (error) { @@ -39,27 +40,26 @@
    - Password History + {$LL.console.project.title.security.passwordHistory()} + label={$LL.console.project.forms.security.inputs.passwordHistory.label()} />

    - Enabling this option prevents users from reusing recent passwords by comparing the - new password with their password history. + {$LL.console.project.texts.security.passwordHistory.phaseOne()}

    - Set the maximum number of passwords saved per user. Maximum 20 passwords. + {$LL.console.project.texts.security.passwordHistory.phaseTwo()}

    @@ -70,7 +70,7 @@ disabled={(passwordHistory === $project.authPasswordHistory || $project.authPasswordHistory === 0) && initialPasswordHistoryEnabled === passwordHistoryEnabled} - submit>Update + submit>{$LL.console.project.button.submit.update()}
    diff --git a/src/routes/console/project-[project]/auth/security/updateSessionLength.svelte b/src/routes/console/project-[project]/auth/security/updateSessionLength.svelte index 47ad2f9914..1598235ddb 100644 --- a/src/routes/console/project-[project]/auth/security/updateSessionLength.svelte +++ b/src/routes/console/project-[project]/auth/security/updateSessionLength.svelte @@ -8,6 +8,7 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { project } from '../../store'; + import LL from '$i18n/i18n-svelte'; const projectId = $project.$id; const { value, unit, baseValue, units } = createTimeUnitPair($project.authDuration); @@ -20,7 +21,7 @@ addNotification({ type: 'success', - message: 'Updated project users limit successfully' + message: $LL.components.notification.projectUserLimitUpdated() }); trackEvent(Submit.SessionsLengthUpdate); } catch (error) { @@ -34,17 +35,24 @@ - Session Length + {$LL.console.project.title.security.sessionLength()}

    - If you reduce the limit, users who are currently logged in will be logged out of the - application. + {$LL.console.project.texts.security.sessionLength()}

      - - + +
    @@ -55,7 +63,7 @@ on:click={() => { updateSessionLength(); }}> - Update + {$LL.console.project.button.submit.update()}
    diff --git a/src/routes/console/project-[project]/auth/security/updateSessionsLimit.svelte b/src/routes/console/project-[project]/auth/security/updateSessionsLimit.svelte index 557208a1da..8b00645dd4 100644 --- a/src/routes/console/project-[project]/auth/security/updateSessionsLimit.svelte +++ b/src/routes/console/project-[project]/auth/security/updateSessionsLimit.svelte @@ -7,6 +7,7 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { project } from '../../store'; + import LL from '$i18n/i18n-svelte'; const projectId = $project.$id; @@ -19,7 +20,7 @@ addNotification({ type: 'success', - message: 'Sessions limit has been updated' + message: $LL.components.notification.sessionLimitUpdated() }); trackEvent(Submit.SessionsLimitUpdate); } catch (error) { @@ -34,16 +35,20 @@
    - Sessions Limit -

    Maximum number of active sessions allowed per user.

    + {$LL.console.project.title.security.sessionLimit()} +

    {$LL.console.project.texts.security.sessionLimit()}

      - +
    - +
    diff --git a/src/routes/console/project-[project]/auth/security/updateUsersLimit.svelte b/src/routes/console/project-[project]/auth/security/updateUsersLimit.svelte index 9d6e50bdf6..d6d1299def 100644 --- a/src/routes/console/project-[project]/auth/security/updateUsersLimit.svelte +++ b/src/routes/console/project-[project]/auth/security/updateUsersLimit.svelte @@ -9,6 +9,7 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { project } from '../../store'; + import LL from '$i18n/i18n-svelte'; const projectId = $project.$id; @@ -32,7 +33,7 @@ await invalidate(Dependencies.PROJECT); addNotification({ type: 'success', - message: 'Updated project users limit successfully' + message: $LL.components.notification.projectUserLimitUpdated() }); trackEvent(Submit.AuthLimitUpdate); } catch (error) { @@ -46,10 +47,9 @@ - Users Limit + {$LL.console.project.title.security.usersLimit()}

    - Limit new users from signing up for your project, regardless of authentication method. You - can still create users and team memberships from your Appwrite console. + {$LL.console.project.texts.security.usersLimit()}

    @@ -65,9 +65,11 @@ bind:group={isLimited} value={false} />
    -
    Unlimited
    +
    + {$LL.console.project.texts.security.unlimited()} +
    - recommended + {$LL.console.project.table.pill.recommended()}
  • @@ -81,7 +83,9 @@ bind:group={isLimited} value={true} />
    -
    Limited
    +
    + {$LL.console.project.texts.security.limited()} +
  • @@ -107,6 +111,7 @@ disabled={btnDisabled} on:click={() => { updateLimit(); - }}>Update + }}> + {$LL.console.project.button.submit.update()} diff --git a/src/routes/console/project-[project]/auth/settings/+page.svelte b/src/routes/console/project-[project]/auth/settings/+page.svelte index eba59cea4d..95a3f46f56 100644 --- a/src/routes/console/project-[project]/auth/settings/+page.svelte +++ b/src/routes/console/project-[project]/auth/settings/+page.svelte @@ -12,6 +12,7 @@ import { page } from '$app/stores'; import type { Provider } from '$lib/stores/oauth-providers'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; + import LL from '$i18n/i18n-svelte'; const projectId = $page.params.project; @@ -25,7 +26,7 @@ await sdk.forConsole.projects.updateAuthStatus(projectId, box.method, box.value); addNotification({ type: 'success', - message: `${box.label} authentication has been updated` + message: `${box.label} ${$LL.components.notification.authUpdated()}` }); trackEvent(Submit.AuthStatusUpdate, { method: box.method, @@ -47,8 +48,8 @@ {#if $authMethods && $OAuthProviders} - Auth Methods -

    Enable the authentication methods you wish to use.

    + {$LL.console.project.title.settings.authMethods()} +

    {$LL.console.project.texts.settings()}

      @@ -64,7 +65,9 @@
      -

      OAuth2 Providers

      +

      + {$LL.console.project.title.settings.oauth2Providers()} +

        {#each $OAuthProviders.providers .filter((p) => p.name !== 'Mock') diff --git a/src/routes/console/project-[project]/auth/teams/+page.svelte b/src/routes/console/project-[project]/auth/teams/+page.svelte index 063b9bb731..bf1932bbb1 100644 --- a/src/routes/console/project-[project]/auth/teams/+page.svelte +++ b/src/routes/console/project-[project]/auth/teams/+page.svelte @@ -24,6 +24,7 @@ import { base } from '$app/paths'; import type { Models } from '@appwrite.io/console'; import type { PageData } from './$types'; + import LL from '$i18n/i18n-svelte'; export let data: PageData; @@ -38,15 +39,18 @@ {#if data.teams.total}
    - Name - Members - Created + {$LL.console.project.table.header.name()} + {$LL.console.project.table.header.members()} + {$LL.console.project.table.header.created()} {#each data.teams.teams as team} @@ -59,7 +63,8 @@ {team.total} members + >{team.total} + {$LL.console.project.texts.teams.members()} {toLocaleDateTime(team.$createdAt)} @@ -76,11 +81,11 @@ {:else if data.search}
    - Sorry, we couldn’t find ‘{data.search}’ -

    There are no teams that match your search.

    + {$LL.console.project.texts.teams.searchData.phaseOne()}{' '}‘{data.search}’ +

    {$LL.console.project.texts.teams.searchData.phaseTwo()}

    {:else} diff --git a/src/routes/console/project-[project]/auth/teams/team-[team]/+layout.svelte b/src/routes/console/project-[project]/auth/teams/team-[team]/+layout.svelte index f20f1c4b61..6a0e5c11df 100644 --- a/src/routes/console/project-[project]/auth/teams/team-[team]/+layout.svelte +++ b/src/routes/console/project-[project]/auth/teams/team-[team]/+layout.svelte @@ -1,5 +1,9 @@ + + - Team - Appwrite + {$LL.console.project.title.team()} - Appwrite diff --git a/src/routes/console/project-[project]/auth/teams/team-[team]/+page.svelte b/src/routes/console/project-[project]/auth/teams/team-[team]/+page.svelte index 68c4c62989..8acc0c7019 100644 --- a/src/routes/console/project-[project]/auth/teams/team-[team]/+page.svelte +++ b/src/routes/console/project-[project]/auth/teams/team-[team]/+page.svelte @@ -6,6 +6,7 @@ import UpdatePrefs from './updatePrefs.svelte'; import UpdateName from './updateName.svelte'; import DangerZone from './dangerZone.svelte'; + import LL from '$i18n/i18n-svelte'; @@ -18,8 +19,11 @@
    -

    {$team.total} Members

    -

    Created on {toLocaleDateTime($team.$createdAt)}

    +

    {$team.total}{' '}{$LL.console.project.texts.teams.members()}

    +

    + {$LL.console.project.texts.teams.createdOn()} + {toLocaleDateTime($team.$createdAt)} +

    diff --git a/src/routes/console/project-[project]/auth/teams/team-[team]/createMembership.svelte b/src/routes/console/project-[project]/auth/teams/team-[team]/createMembership.svelte index cc52a3bd4a..ff236ce0eb 100644 --- a/src/routes/console/project-[project]/auth/teams/team-[team]/createMembership.svelte +++ b/src/routes/console/project-[project]/auth/teams/team-[team]/createMembership.svelte @@ -6,6 +6,7 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { createEventDispatcher } from 'svelte'; + import LL from '$i18n/i18n-svelte'; export let showCreate = false; export let teamId: string; @@ -45,24 +46,33 @@ - Create Membership + {$LL.console.project.title.createMembership()} - + - Roles are used to manage access permissions. You can create any role you want. + {$LL.console.project.alert.teams.createMembership()} - + - - + + diff --git a/src/routes/console/project-[project]/auth/teams/team-[team]/dangerZone.svelte b/src/routes/console/project-[project]/auth/teams/team-[team]/dangerZone.svelte index 2ebabf3afa..d445186b4b 100644 --- a/src/routes/console/project-[project]/auth/teams/team-[team]/dangerZone.svelte +++ b/src/routes/console/project-[project]/auth/teams/team-[team]/dangerZone.svelte @@ -3,18 +3,18 @@ import { Button } from '$lib/elements/forms'; import DeleteTeam from './deleteTeam.svelte'; import { team } from './store'; + import LL from '$i18n/i18n-svelte'; let showDelete = false;
    - Delete Team + {$LL.console.project.title.deleteTeam()}

    - The team will be permanently deleted, including all data associated with this team. This - action is irreversible. + {$LL.console.project.texts.teams.dangerZone()}

    @@ -23,13 +23,14 @@
    {$team.name}
    - {$team.total} Members + {$team.total}{' '}{$LL.console.project.texts.teams.members()}
    - +
    diff --git a/src/routes/console/project-[project]/auth/teams/team-[team]/deleteMembership.svelte b/src/routes/console/project-[project]/auth/teams/team-[team]/deleteMembership.svelte index 358a41161c..bbd4a61fe9 100644 --- a/src/routes/console/project-[project]/auth/teams/team-[team]/deleteMembership.svelte +++ b/src/routes/console/project-[project]/auth/teams/team-[team]/deleteMembership.svelte @@ -9,6 +9,7 @@ import { sdk } from '$lib/stores/sdk'; import type { Models } from '@appwrite.io/console'; import { createEventDispatcher } from 'svelte'; + import LL from '$i18n/i18n-svelte'; const dispatch = createEventDispatcher(); @@ -43,12 +44,14 @@ icon="exclamation" state="warning" headerDivider={false}> - Delete Member + {$LL.console.project.title.deleteMember()}

    - Are you sure you want to delete {selectedMembership.userName} from '{selectedMembership.teamName}'? + {$LL.console.project.texts.teams.deleteMember()}{' '}{selectedMembership.userName}{' '}{$LL.console.project.texts.teams.from()}{' '}'{selectedMembership.teamName}'?

    - - + + diff --git a/src/routes/console/project-[project]/auth/teams/team-[team]/deleteTeam.svelte b/src/routes/console/project-[project]/auth/teams/team-[team]/deleteTeam.svelte index 45492e29a9..c533160e51 100644 --- a/src/routes/console/project-[project]/auth/teams/team-[team]/deleteTeam.svelte +++ b/src/routes/console/project-[project]/auth/teams/team-[team]/deleteTeam.svelte @@ -8,7 +8,8 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import type { Models } from '@appwrite.io/console'; - + import LL from '$i18n/i18n-svelte'; + export let showDelete = false; export let team: Models.Team>; @@ -34,12 +35,13 @@ icon="exclamation" state="warning" headerDivider={false}> - Delete Team + {$LL.console.project.title.deleteTeam()}

    - Are you sure you want to delete {team.name}? + {$LL.console.project.texts.teams.deleteTeam()}{' '}{team.name}?

    - - + + diff --git a/src/routes/console/project-[project]/auth/teams/team-[team]/header.svelte b/src/routes/console/project-[project]/auth/teams/team-[team]/header.svelte index d176f8740f..fe0b22bc3e 100644 --- a/src/routes/console/project-[project]/auth/teams/team-[team]/header.svelte +++ b/src/routes/console/project-[project]/auth/teams/team-[team]/header.svelte @@ -4,6 +4,7 @@ import { isTabSelected } from '$lib/helpers/load'; import { Cover, CoverTitle } from '$lib/layout'; import { team } from './store'; + import LL from '$i18n/i18n-svelte'; const projectId = $page.params.project; const teamId = $page.params.team; @@ -11,18 +12,18 @@ const tabs = [ { href: path, - title: 'Overview', + title: $LL.console.project.navbar.teamHeader.overview(), event: 'overview' }, { href: `${path}/members`, - title: 'Members', + title: $LL.console.project.navbar.teamHeader.members(), event: 'members', hasChildren: true }, { href: `${path}/activity`, - title: 'Activity', + title: $LL.console.project.navbar.teamHeader.activity(), event: 'activity', hasChildren: true } diff --git a/src/routes/console/project-[project]/auth/teams/team-[team]/members/+page.svelte b/src/routes/console/project-[project]/auth/teams/team-[team]/members/+page.svelte index 8fdc988e64..a5e2d7b827 100644 --- a/src/routes/console/project-[project]/auth/teams/team-[team]/members/+page.svelte +++ b/src/routes/console/project-[project]/auth/teams/team-[team]/members/+page.svelte @@ -27,6 +27,7 @@ import DeleteMembership from '../deleteMembership.svelte'; import { Dependencies } from '$lib/constants'; import { trackEvent } from '$lib/actions/analytics'; + import LL from '$i18n/i18n-svelte'; export let data: PageData; @@ -45,15 +46,17 @@ {#if data.memberships.total}
    - Name - Roles - Joined + {$LL.console.project.table.header.name()} + {$LL.console.project.table.header.roles()} + {$LL.console.project.table.header.joined()} @@ -95,16 +98,17 @@ {:else if data.search}
    - Sorry, we couldn’t find ‘{data.search}’ -

    There are no members that match your search.

    + {$LL.console.project.texts.teams.searchData.phaseOne()}{' '}‘{data.search}’ +

    {$LL.console.project.texts.teams.searchData.phaseThree()}

    - +
    {:else} - Name + {$LL.console.project.forms.teams.updateName.title()}
    - +
    diff --git a/src/routes/console/project-[project]/auth/teams/team-[team]/updatePrefs.svelte b/src/routes/console/project-[project]/auth/teams/team-[team]/updatePrefs.svelte index a29aabcdb5..86dcc1bfce 100644 --- a/src/routes/console/project-[project]/auth/teams/team-[team]/updatePrefs.svelte +++ b/src/routes/console/project-[project]/auth/teams/team-[team]/updatePrefs.svelte @@ -8,6 +8,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { team } from './store'; + import LL from '$i18n/i18n-svelte'; $: if (prefs) { if (JSON.stringify(prefs) !== JSON.stringify(Object.entries($team.prefs))) { @@ -40,7 +41,7 @@ arePrefsDisabled = true; addNotification({ - message: 'Preferences have been updated', + message: $LL.components.notification.updatePrefs(), type: 'success' }); trackEvent(Submit.UserUpdatePreferences); @@ -56,10 +57,9 @@
    - Team Preferences + {$LL.console.project.title.teamPref()}

    - You can update your team's preferences by storing shared information on the teams's - objects so they can easily be shared across members. + {$LL.console.project.texts.teams.updatePrefs()}

    @@ -68,22 +68,25 @@ {#each prefs as [key, value], index}
  • - +
    - +
    @@ -123,13 +126,14 @@ } }}>
  • - Name - Roles - Joined + {$LL.console.project.table.header.name()} + {$LL.console.project.table.header.roles()} + {$LL.console.project.table.header.joined()} @@ -69,9 +72,11 @@ {:else}
    -

    No memberships available

    +

    + {$LL.console.project.texts.users.noMembership()} +

    diff --git a/src/routes/console/project-[project]/auth/user-[user]/sessions/+page.svelte b/src/routes/console/project-[project]/auth/user-[user]/sessions/+page.svelte index 29aef6a74f..e7e4bb7189 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/sessions/+page.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/sessions/+page.svelte @@ -16,6 +16,7 @@ import DeleteAllSessions from '../deleteAllSessions.svelte'; import DeleteSessions from '../deleteSession.svelte'; import type { PageData } from './$types'; + import LL from '$i18n/i18n-svelte'; export let data: PageData; @@ -31,15 +32,18 @@ {#if data.sessions.total}
    - Browser and Device - Session - Location - IP + {$LL.console.project.table.header.browserAndDevice()} + {$LL.console.project.table.header.sessions()} + {$LL.console.project.table.header.location()} + {$LL.console.project.table.header.ip()} @@ -56,11 +60,12 @@

    {session.clientName} - {session.clientVersion} on {session.osName} + {session.clientVersion}{' '}{$LL.console.project.texts.users.on()}{' '}{session.osName} {session.osVersion}

    {#if session.current} - current session + {$LL.console.project.table.pill.currentSession()} {/if} @@ -87,12 +92,14 @@ {:else}
    -

    No sessions available

    +

    + {$LL.console.project.texts.users.noSessions()} +

    diff --git a/src/routes/console/project-[project]/auth/user-[user]/updateEmail.svelte b/src/routes/console/project-[project]/auth/user-[user]/updateEmail.svelte index 62ff255f83..67d472d44e 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/updateEmail.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/updateEmail.svelte @@ -8,6 +8,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { user } from './store'; + import LL from '$i18n/i18n-svelte'; let userEmail: string = null; onMount(async () => { @@ -19,7 +20,7 @@ await sdk.forProject.users.updateEmail($user.$id, userEmail); await invalidate(Dependencies.USER); addNotification({ - message: 'Email has been updated', + message: $LL.components.notification.emailUpdated(), type: 'success' }); trackEvent(Submit.UserUpdateEmail); @@ -35,20 +36,21 @@
    - Email + {$LL.console.project.title.userData.email()}
    - +
    diff --git a/src/routes/console/project-[project]/auth/user-[user]/updateName.svelte b/src/routes/console/project-[project]/auth/user-[user]/updateName.svelte index 74d9db9cce..c666f491bd 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/updateName.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/updateName.svelte @@ -8,6 +8,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { user } from './store'; + import LL from '$i18n/i18n-svelte'; let userName: string = null; onMount(async () => { @@ -19,7 +20,7 @@ await sdk.forProject.users.updateName($user.$id, userName); await invalidate(Dependencies.USER); addNotification({ - message: 'Name has been updated', + message: $LL.components.notification.nameUpdated(), type: 'success' }); trackEvent(Submit.UserUpdateName); @@ -35,21 +36,22 @@
    - Name + {$LL.console.project.title.userData.name()}
    - +
    diff --git a/src/routes/console/project-[project]/auth/user-[user]/updatePassword.svelte b/src/routes/console/project-[project]/auth/user-[user]/updatePassword.svelte index 0444089123..05a29ca07e 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/updatePassword.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/updatePassword.svelte @@ -5,6 +5,7 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { user } from './store'; + import LL from '$i18n/i18n-svelte'; let newPassword: string = null; @@ -13,7 +14,7 @@ await sdk.forProject.users.updatePassword($user.$id, newPassword); newPassword = null; addNotification({ - message: 'Password has been updated', + message: $LL.components.notification.pswdUpdated(), type: 'success' }); trackEvent(Submit.UserUpdatePassword); @@ -30,18 +31,19 @@
    - Password + {$LL.console.project.title.userData.password()}

    - Enter a new password. A password must contain at least 8 characters. + {$LL.console.project.texts.users.updatePassword.phaseOne()}{' '}{$LL.console.project.texts.users.updatePassword.phaseTwo()}

      - + diff --git a/src/routes/console/project-[project]/auth/user-[user]/updatePhone.svelte b/src/routes/console/project-[project]/auth/user-[user]/updatePhone.svelte index baeeaea18f..e2677f21bf 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/updatePhone.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/updatePhone.svelte @@ -8,6 +8,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { user } from './store'; + import LL from '$i18n/i18n-svelte'; let userPhone: string = null; onMount(async () => { @@ -19,7 +20,7 @@ await sdk.forProject.users.updatePhone($user.$id, userPhone); await invalidate(Dependencies.USER); addNotification({ - message: 'Phone has been updated', + message: $LL.components.notification.phoneUpdated(), type: 'success' }); trackEvent(Submit.UserUpdatePhone); @@ -35,20 +36,21 @@
      - Phone + {$LL.console.project.title.userData.phone()}
      - +
      diff --git a/src/routes/console/project-[project]/auth/user-[user]/updatePrefs.svelte b/src/routes/console/project-[project]/auth/user-[user]/updatePrefs.svelte index 08511efd2b..57aec74ea2 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/updatePrefs.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/updatePrefs.svelte @@ -8,6 +8,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { user } from './store'; + import LL from '$i18n/i18n-svelte'; $: if (prefs) { if (JSON.stringify(prefs) !== JSON.stringify(Object.entries($user.prefs))) { @@ -40,7 +41,7 @@ arePrefsDisabled = true; addNotification({ - message: 'Preferences have been updated', + message: $LL.components.notification.updatePrefs(), type: 'success' }); trackEvent(Submit.UserUpdatePreferences); @@ -56,10 +57,9 @@
      - User Preferences + {$LL.console.project.title.userData.userPref()}

      - You can update your user preferences by storing information on the user's objects so - they can easily be shared across devices and sessions. + {$LL.console.project.texts.users.updatePrefs()}

      @@ -68,22 +68,25 @@ {#each prefs as [key, value], index}
    • - +
      - +
      @@ -123,13 +126,14 @@ } }}>
    - Key - Type - Default Value + {$LL.console.project.table.header.key()} + {$LL.console.project.table.header.type()} + {$LL.console.project.table.header.defaultValue()} @@ -95,7 +97,7 @@ {attribute.status} {:else if attribute.required} - Required + {$LL.console.project.table.pill.required()} {/if} @@ -143,7 +145,7 @@ showEdit = true; showDropdown[index] = false; }}> - Edit + {$LL.console.project.button.dropdown.edit()} {#if !isRelationship(attribute)} - Create Index + {$LL.console.project.button.dropdown.createIndex()} {/if} - Delete + {$LL.console.project.buttons.submit.delete()} @@ -173,14 +175,17 @@
    -

    Total results: {$attributes.length}

    +

    + {$LL.console.project.texts.databases.totalResult()}{' '}{$attributes.length} +

    {:else} (showEmptyCreateDropdown = true)}>
    - Create your first attribute to get started. + {$LL.console.project.texts.databases.createAttribute.heading()}

    - Need a hand? Learn more in our documentation. + {$LL.console.project.texts.databases.createAttribute.note()}

    @@ -189,7 +194,8 @@ href="https://appwrite.io/docs/databases#attributes" text event="empty_documentation" - ariaLabel={`create {target}`}>Documentation + ariaLabel={`create {target}`} + >{$LL.console.project.buttons.documentation()} { showEmptyCreateDropdown = !showEmptyCreateDropdown; }}> - Create attribute + {$LL.console.project.buttons.createAttribute()}
    diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/boolean.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/boolean.svelte index ffa3e61f41..ffba6de1ba 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/boolean.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/boolean.svelte @@ -1,6 +1,7 @@ + - Document - Appwrite + {$LL.console.project.title.document()} - Appwrite diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/+page.svelte index 33289fdc76..b7503a0337 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/+page.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/+page.svelte @@ -13,6 +13,7 @@ import { Dependencies } from '$lib/constants'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; import { collection } from '../store'; + import LL from '$i18n/i18n-svelte'; let showDelete = false; let permissions = $doc?.$permissions; @@ -31,7 +32,7 @@ await invalidate(Dependencies.DOCUMENT); arePermsDisabled = true; addNotification({ - message: 'Permissions have been updated', + message: $LL.components.notification.permissionsUpdated(), type: 'success' }); trackEvent(Submit.DocumentUpdatePermissions); @@ -52,35 +53,46 @@ - Document - Appwrite + {$LL.console.project.title.document()} - Appwrite - Metadata + {$LL.console.project.title.metaData()}
    -

    Created: {toLocaleDateTime($doc.$createdAt)}

    -

    Last Updated: {toLocaleDateTime($doc.$updatedAt)}

    +

    + {$LL.console.project.texts.databases.created()}{' '}{toLocaleDateTime( + $doc.$createdAt + )} +

    +

    + {$LL.console.project.texts.databases.lastUpdated()}{' '}{toLocaleDateTime( + $doc.$updatedAt + )} +

    - Permissions + {$LL.console.project.title.permissions()}

    - Assign read or write permissions at the Collection Level or - Document Level. If collection Level permissions are assigned, permissions - applied to individual documents are ignored. + {$LL.console.project.texts.databases.documentsPage.para.phraseOne()}{' '}{$LL.console.project.texts.databases.documentsPage.para.collectionLevel()}{' '}{$LL.console.project.texts.databases.documentsPage.para.or()}{' '}{$LL.console.project.texts.databases.documentsPage.para.documentLevel()}.{' '}{$LL.console.project.texts.databases.documentsPage.para.phraseTwo()}

    {#if $collection.documentSecurity} {#if showPermissionAlert} (showPermissionAlert = false)}> - Document security is enabled + {$LL.console.project.alert.databases.title.documentSecurity.enabled()}

    - Users will be able to access this document if they have been granted either Document or Collection permissions. + {$LL.console.project.alert.databases.title.userPermission()}{' '}{$LL.console.project.alert.databases.title.collectionPermission()}

    @@ -90,11 +102,10 @@ {/if} {:else} - Document security is disabled + {$LL.console.project.alert.databases.title.documentSecurity.disabled()}

    - If you want to assign document permissions, navigate to Collection settings - and enable document security. Otherwise, only Collection permissions will be - used. + {$LL.console.project.alert.databases.title.permissionCheck()}

    {/if} @@ -105,15 +116,14 @@ disabled={arePermsDisabled} on:click={() => { updatePermissions(); - }}>Update + }}>{$LL.console.project.button.submit.update()}
    - Delete Document + {$LL.console.project.title.deleteDocument()}

    - The document will be permanently deleted, including all the data within it. This action - is irreversible. + {$LL.console.project.texts.database.deleteDocWarning()}

    @@ -121,13 +131,16 @@
    {$doc.$id}

    - Last Updated: {toLocaleDateTime($doc.$updatedAt)} + {$LL.console.project.texts.database.lastUpdated()}{' '}{toLocaleDateTime( + $doc.$updatedAt + )}

    - + diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributeForm.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributeForm.svelte index 53b239306c..1f4e5873a6 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributeForm.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributeForm.svelte @@ -3,6 +3,7 @@ import Pill from '$lib/elements/pill.svelte'; import type { Attributes } from '../store'; import AttributeItem from './attributeItem.svelte'; + import LL from '$i18n/i18n-svelte' export let attributes: Attributes[] = []; export let formValues: object = {}; @@ -24,7 +25,7 @@
    (showCustomId = !showCustomId)}>
    diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributeItem.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributeItem.svelte index 857e645842..55d4d88b9f 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributeItem.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributeItem.svelte @@ -3,6 +3,7 @@ import { capitalize } from '$lib/helpers/string'; import type { Attributes } from '../store'; import Attribute from './attribute.svelte'; + import LL from '$i18n/i18n-svelte'; export let attribute: Attributes; export let formValues: object = {}; @@ -54,7 +55,7 @@ {:else} @@ -81,7 +82,7 @@ {/each} {/if} diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/boolean.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/boolean.svelte index fb18a51fc3..5d723f31b7 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/boolean.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/boolean.svelte @@ -1,6 +1,7 @@ - Data - Appwrite + {$LL.console.project.title.data()} - Appwrite @@ -120,7 +121,8 @@ + on:click={() => updateData()} + >{$LL.console.project.button.submit.update()} {/each} diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/delete.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/delete.svelte index 2a31bffa16..814db38e28 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/delete.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/delete.svelte @@ -19,6 +19,7 @@ import { attributes, collection } from '../store'; import { isRelationship } from './attributes/store'; import type { Models } from '@appwrite.io/console'; + import LL from '$i18n/i18n-svelte'; export let showDelete = false; const databaseId = $page.params.database; @@ -34,7 +35,7 @@ showDelete = false; addNotification({ type: 'success', - message: `Document has been deleted` + message: $LL.components.notification.documentDeleted() }); trackEvent(Submit.DocumentDelete); await goto( @@ -66,19 +67,23 @@ onSubmit={handleDelete} bind:show={showDelete} headerDivider={false}> - Delete Document + {$LL.console.project.title.deleteDocument()}

    - Are you sure you want to delete the document from {$collection.name}{$LL.console.project.texts.database.docFrom()}{' '}{$collection.name}?

    {#if relAttributes?.length} - Relation - Setting + {$LL.console.project.table.header.relation()} + {$LL.console.project.table.header.settings()} @@ -105,15 +110,18 @@
    - To change the selection edit the relationship settings. + {$LL.console.project.alert.databases.relationshipSettings()} - Delete document from {$collection.name} + {$LL.console.project.texts.databases.deleteDocFrom()}{' '}{$collection.name}
    {/if} - - + + diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/document.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/document.svelte index c2a85e9a57..a6114aa05e 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/document.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/document.svelte @@ -13,6 +13,7 @@ import { invalidate } from '$app/navigation'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; import AttributeForm from './attributeForm.svelte'; + import LL from '$i18n/i18n-svelte'; let disableUpdate = true; let currentDoc: string; @@ -65,7 +66,7 @@ trackEvent(Submit.DocumentUpdate); disableUpdate = true; addNotification({ - message: 'Document was updated!', + message: $LL.components.notification.documentWasUpdated(), type: 'success' }); } catch (error) { @@ -79,13 +80,14 @@ - Data -

    Update document data based on the attributes created earlier.

    + {$LL.console.project.title.data()} +

    {$LL.console.project.texts.databases.updateDocument()}

    - +
    diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/header.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/header.svelte index 8e28ec6ac4..ea3ae1e234 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/header.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/header.svelte @@ -4,6 +4,7 @@ import { isTabSelected } from '$lib/helpers/load'; import { Cover, CoverTitle } from '$lib/layout'; import { doc } from './store'; + import LL from '$i18n/i18n-svelte'; const projectId = $page.params.project; const databaseId = $page.params.database; @@ -13,18 +14,18 @@ const tabs = [ { href: path, - title: 'Overview', + title: $LL.console.project.navbar.databases.document.overview(), event: 'overview' }, { href: `${path}/data`, - title: 'Data', + title: $LL.console.project.navbar.databases.document.data(), event: 'data', hasChildren: true }, { href: `${path}/activity`, - title: 'Activity', + title: $LL.console.project.navbar.databases.document.activity(), event: 'activity', hasChildren: true } @@ -37,7 +38,8 @@ href={`/console/project-${projectId}/databases/database-${databaseId}/collection-${collectionId}`}> {$doc?.$id} - Document ID + {$LL.console.project.databases.table.pill.documentId()} diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/header.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/header.svelte index 51f5f0a45d..a35959869c 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/header.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/header.svelte @@ -4,6 +4,7 @@ import { isTabSelected } from '$lib/helpers/load'; import { Cover, CoverTitle } from '$lib/layout'; import { collection } from './store'; + import LL from '$i18n/i18n-svelte'; $: projectId = $page.params.project; $: databaseId = $page.params.database; @@ -12,35 +13,35 @@ $: tabs = [ { href: path, - title: 'Documents', + title: $LL.console.project.navbar.databases.dbCollection.documents(), event: 'documents', hasChildren: true }, { href: `${path}/attributes`, - title: 'Attributes', + title: $LL.console.project.navbar.databases.dbCollection.documents(), event: 'attributes' }, { href: `${path}/indexes`, - title: 'Indexes', + title: $LL.console.project.navbar.databases.dbCollection.indexes(), event: 'indexes' }, { href: `${path}/activity`, - title: 'Activity', + title: $LL.console.project.navbar.databases.dbCollection.activity(), event: 'activity', hasChildren: true }, { href: `${path}/usage`, - title: 'Usage', + title: $LL.console.project.navbar.databases.dbCollection.usage(), event: 'usage', hasChildren: true }, { href: `${path}/settings`, - title: 'Settings', + title: $LL.console.project.navbar.databases.dbCollection.settings(), event: 'settings' } ]; diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/+page.svelte index 81cc43c894..9ae60da25f 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/+page.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/+page.svelte @@ -19,6 +19,7 @@ import type { Models } from '@appwrite.io/console'; import { Button } from '$lib/elements/forms'; import CreateAttributeDropdown from '../attributes/createAttributeDropdown.svelte'; + import LL from '$i18n/i18n-svelte'; let showDropdown = []; let selectedIndex: Models.Index = null; @@ -32,24 +33,27 @@
    - Indexes + {$LL.console.project.title.indexes()}
    {#if $collection?.attributes?.length} {#if $indexes.length} - Key - Type - Attributes - Asc/Desc + {$LL.console.project.table.header.key()} + {$LL.console.project.table.header.type()} + {$LL.console.project.table.header.attributes()} + {$LL.console.project.table.header.asc_dsc()} @@ -95,14 +99,16 @@ on:click={() => { selectedIndex = index; showOverview = true; - }}>Overview + }} + >{$LL.console.project.button.dropdown.overview()} { selectedIndex = index; showDelete = true; - }}>Delete + }} + >{$LL.console.project.button.submit.delete()} @@ -111,7 +117,9 @@
    -

    Total results: {$indexes.length}

    +

    + {$LL.console.project.texts.databaes.totalResult()}{' '}{$indexes.length} +

    {:else} (showCreateDropdown = true)}>
    - Create your first attribute to get started. + {$LL.console.project.texts.databaes.createAttribute.heading()}

    - Need a hand? Learn more in our documentation. + {$LL.console.project.texts.databaes.createAttribute.note()}

    @@ -134,7 +143,8 @@ href="https://appwrite.io/docs/databases#attributes" text event="empty_documentation" - ariaLabel={`create {target}`}>Documentation + ariaLabel={`create {target}`} + >{$LL.console.project.button.documentation()} { showCreateDropdown = !showCreateDropdown; }}> - Create attribute + {$LL.console.project.button.createAttribute()}
    diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/createIndex.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/createIndex.svelte index 3bf7b67762..4feac86a7a 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/createIndex.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/createIndex.svelte @@ -13,6 +13,7 @@ import { indexes, type Attributes } from '../store'; import { collection } from '../store'; import Select from './select.svelte'; + import LL from '$i18n/i18n-svelte'; export let showCreateIndex = false; export let externalAttribute: Attributes = null; @@ -77,7 +78,7 @@ ); addNotification({ - message: 'Index has been created', + message: $LL.components.notification.indexCreated(), type: 'success' }); trackEvent(Submit.IndexCreate); @@ -100,21 +101,37 @@ - Create Index + {$LL.console.project.title.createIndex()} - - + + {#each attributeList as attribute, i}
  • - + - - - + + + {#each attributeOptions as option} @@ -127,10 +144,15 @@
    @@ -150,11 +172,12 @@ - - + + diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/deleteIndex.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/deleteIndex.svelte index b0535ae413..0a6e1ef3be 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/deleteIndex.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/deleteIndex.svelte @@ -9,6 +9,7 @@ import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; + import LL from '$i18n/i18n-svelte'; export let showDelete = false; export let selectedIndex: Models.Index; @@ -26,7 +27,7 @@ showDelete = false; addNotification({ type: 'success', - message: `Index has been deleted` + message: $LL.components.notification.indexDeleted() }); trackEvent(Submit.IndexDelete); } catch (error) { @@ -45,13 +46,16 @@ onSubmit={handleDelete} bind:show={showDelete} headerDivider={false}> - Delete Index + {$LL.console.project.title.deleteIndex()}

    - Are you sure you want to delete '{selectedIndex.key}' from {$collection.name}? + {$LL.console.project.texts.databases.delete()}{' '}'{selectedIndex.key}'{' '}{$LL.console.project.texts.databases.from()}{' '}{$collection.name}?

    - - + + diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/overviewIndex.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/overviewIndex.svelte index 86f21edd4b..1cff86dc59 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/overviewIndex.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/indexes/overviewIndex.svelte @@ -2,6 +2,7 @@ import { Modal } from '$lib/components'; import { Button, InputText, FormList } from '$lib/elements/forms'; import type { Models } from '@appwrite.io/console'; + import LL from '$i18n/i18n-svelte'; export let showOverview = false; export let selectedIndex: Models.Index = null; @@ -9,18 +10,18 @@ - Overview + {$LL.console.project.title.overview()} @@ -28,7 +29,8 @@ {#each selectedIndex.attributes as attribute, i}
  • - +
    - +
    - Delete Collection + {$LL.console.project.title.deleteCollection()}

    - The collection will be permanently deleted, including all the documents within it. This - action is irreversible. + {$LL.console.project.texts.databases.deleteCollection()}

    {$collection.name}
    -

    Last Updated: {toLocaleDateTime($collection.$updatedAt)}

    +

    + {$LL.console.project.texts.databases.lastUpdated()}{' '}{toLocaleDateTime( + $collection.$updatedAt + )} +

    - +
    diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/deleteCollection.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/deleteCollection.svelte index f7a65cc8fc..9f21877026 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/deleteCollection.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/deleteCollection.svelte @@ -9,6 +9,7 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { collection } from '../store'; + import LL from '$i18n/i18n-svelte'; export let showDelete = false; @@ -21,7 +22,7 @@ showDelete = false; addNotification({ type: 'success', - message: `${$collection.name} has been deleted` + message: `${$collection.name} ${$LL.components.notification.hasBeenDeleted()}` }); trackEvent(Submit.CollectionDelete); await goto( @@ -43,13 +44,14 @@ bind:show={showDelete} onSubmit={handleDelete} headerDivider={false}> - Delete Collection + {$LL.console.project.title.deleteCollection()}

    - Are you sure you want to delete {$collection.name}? + {$LL.console.project.texts.databases.delete()}{' '}{$collection.name}?

    - - + + diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/displayName.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/displayName.svelte index 3a5f769576..b9cf08d6f7 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/displayName.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/displayName.svelte @@ -10,6 +10,7 @@ import { attributes } from '../store'; import { preferences } from '$lib/stores/preferences'; import { page } from '$app/stores'; + import LL from '$i18n/i18n-svelte'; const collectionId = $page.params.collection; let names: string[] = [...(preferences.getDisplayNames()?.[collectionId] ?? [])]; @@ -21,7 +22,7 @@ names = [...(preferences.getDisplayNames()?.[collectionId] ?? [])]; await invalidate(Dependencies.TEAM); addNotification({ - message: 'Display names has been updated', + message: $LL.components.notification.displayNameUpdated(), type: 'success' }); trackEvent(Submit.CollectionUpdateDisplayNames); @@ -58,10 +59,9 @@
    - Display Name + {$LL.console.project.title.displayName()}

    - Set string attributes with maximum 50 characters to be used as a display name in the - Appwrite console. Maximum 5 names. + {$LL.console.project.texts.database.displayName()}

    @@ -69,9 +69,9 @@
      {#if names?.length} {#each names as name, i} @@ -82,7 +82,7 @@ label={name} showLabel={false} interactiveOutput - placeholder="Select attribute" + placeholder={$LL.console.project.forms.databases.index.attribute.placeholder()} bind:value={names[i]} bind:search={names[i]} name="attributes" @@ -93,7 +93,7 @@ id={name} label={name} showLabel={false} - placeholder="Select attribute" + placeholder={$LL.console.project.forms.databases.index.attribute.placeholder()} bind:value={names[i]} bind:search name="attributes" @@ -124,13 +124,14 @@ names = names; }}>
    - + diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updateName.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updateName.svelte index 6170e6b24f..f812596a20 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updateName.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updateName.svelte @@ -9,6 +9,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { collection } from '../store'; + import LL from '$i18n/i18n-svelte'; const databaseId = $page.params.database; @@ -30,7 +31,7 @@ ); await invalidate(Dependencies.COLLECTION); addNotification({ - message: 'Name has been updated', + message: $LL.components.notification.nameUpdated(), type: 'success' }); trackEvent(Submit.CollectionUpdateName); @@ -46,14 +47,15 @@
    - Name + {$LL.console.project.forms.databases.updateName.title()}
    @@ -61,7 +63,7 @@ + >{$LL.console.project.button.submit.update()}
    diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updatePermissions.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updatePermissions.svelte index 54f46eead8..9541cccd9b 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updatePermissions.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updatePermissions.svelte @@ -11,6 +11,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { collection } from '../store'; + import LL from '$i18n/i18n-svelte'; const databaseId = $page.params.database; @@ -34,7 +35,7 @@ ); await invalidate(Dependencies.COLLECTION); addNotification({ - message: 'Permissions have been updated', + message: $LL.components.notification.permissionsUpdated(), type: 'success' }); trackEvent(Submit.CollectionUpdatePermissions); @@ -56,14 +57,14 @@ - Permissions + {$LL.console.project.title.permissions()}

    - Choose who can access your collection and documents. For more information, check out the - Permissions Guide + {$LL.console.project.texts.databases.updatePermission.permissionGuide()} .

    @@ -72,6 +73,7 @@ {/if} - +
    diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updateSecurity.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updateSecurity.svelte index 2d8203585e..e71792072e 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updateSecurity.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updateSecurity.svelte @@ -9,6 +9,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { collection } from '../store'; + import LL from '$i18n/i18n-svelte'; const databaseId = $page.params.database; @@ -30,7 +31,7 @@ ); await invalidate(Dependencies.COLLECTION); addNotification({ - message: 'Security has been updated', + message: $LL.components.notification.securityUpdated(), type: 'success' }); trackEvent(Submit.CollectionUpdateSecurity); @@ -45,27 +46,27 @@ - Document Security + {$LL.console.project.title.updateSecurity()} + label={$LL.console.project.forms.databases.settings.inputs.docSecurity.label()} />

    - When document security is enabled, users will be able to access documents for which they - have been granted either Document or Collection permissions. + {$LL.console.project.texts.databases.updateSecurity.phraseOne()}{' '}{$LL.console.project.texts.databases.updateSecurity.eitherDocOrCollection()}.

    - If document security is disabled, users can access documents only if they have Collection permissions. Document permissions will be ignored. + {$LL.console.project.texts.databases.updateSecurity.collectionPermission()}.{$LL.console.project.texts.databases.updateSecurity.documentPermission()}

    + on:click={updateSecurity}>{$LL.console.project.button.submit.update()}
    diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updateStatus.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updateStatus.svelte index 70ba7f57f5..c3190e65e7 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updateStatus.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/settings/updateStatus.svelte @@ -10,6 +10,7 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { collection } from '../store'; + import LL from '$i18n/i18n-svelte'; const databaseId = $page.params.database; @@ -31,7 +32,7 @@ ); await invalidate(Dependencies.COLLECTION); addNotification({ - message: `${$collection.name} has been updated`, + message: `${$collection.name} ${$LL.components.notification.hasBeenUpdated()}`, type: 'success' }); trackEvent(Submit.CollectionUpdateEnabled); @@ -56,14 +57,22 @@ bind:value={enabled} />
    -

    Created: {toLocaleDateTime($collection.$createdAt)}

    -

    Last Updated: {toLocaleDateTime($collection.$updatedAt)}

    +

    + {$LL.console.project.texts.databases.created()}{' '}{toLocaleDateTime( + $collection.$createdAt + )} +

    +

    + {$LL.console.project.texts.databases.lastUpdated()}{' '}{toLocaleDateTime( + $collection.$updatedAt + )} +

    diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/subNavigation.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/subNavigation.svelte index 7b022b459e..695f13974c 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/subNavigation.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/subNavigation.svelte @@ -4,6 +4,8 @@ import { showCreate } from '../store'; import type { PageData } from './$types'; + import LL from '$i18n/i18n-svelte'; + $: data = $page.data as PageData; $: project = $page.params.project; $: databaseId = $page.params.database; @@ -19,14 +21,18 @@ class="u-flex u-cross-center u-sep-block-end u-padding-block-12 is-not-desktop" href={`${base}/console/project-${project}/databases/database-${databaseId}?openNavbar=true`}>
    -

    Created: {toLocaleDateTime($database.$createdAt)}

    -

    Last Updated: {toLocaleDateTime($database.$updatedAt)}

    +

    + {$LL.console.project.texts.databases.created()}{' '}{toLocaleDateTime( + $database.$createdAt + )} +

    +

    + {$LL.console.project.texts.databases.lastUpdated()}{' '}{toLocaleDateTime( + $database.$updatedAt + )} +

    - Name + {$LL.console.project.forms.databases.updateName.title()}