From 2664b8a1a3db829e94644b51c3061820e0a5b7e7 Mon Sep 17 00:00:00 2001 From: lupusA Date: Fri, 8 Mar 2024 11:34:54 +0100 Subject: [PATCH 01/27] First draft to support multiple languages --- package-lock.json | 225 ++++++++++++++++++++++++-- package.json | 3 + public/locales/de-DE/translation.json | 22 +++ public/locales/en-GB/translation.json | 21 +++ public/locales/es-ES/translation.json | 21 +++ src/App.jsx | 1 + src/contexts/UIPreferencesContext.tsx | 26 ++- src/index.jsx | 1 + src/pages/Preferences.jsx | 115 +++++++------ src/utils/18ns.js | 17 ++ 10 files changed, 390 insertions(+), 62 deletions(-) create mode 100644 public/locales/de-DE/translation.json create mode 100644 public/locales/en-GB/translation.json create mode 100644 public/locales/es-ES/translation.json create mode 100644 src/utils/18ns.js diff --git a/package-lock.json b/package-lock.json index 88cc6a7a..0c9235f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,10 +15,13 @@ "@fortawesome/react-fontawesome": "^0.2.0", "bootstrap": "^5.3.1", "http-proxy-middleware": "^2.0.6", + "i18next": "^23.10.1", + "i18next-http-backend": "^2.5.0", "moment": "^2.30.1", "react": "^18.2.0", "react-bootstrap": "^2.8.0", "react-dom": "^18.2.0", + "react-i18next": "^14.1.0", "react-router-dom": "^5.3.4", "react-table": "^7.8.0" }, @@ -2096,11 +2099,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" @@ -2119,6 +2122,11 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", @@ -6744,6 +6752,14 @@ "node": ">=10" } }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -9523,6 +9539,14 @@ "node": ">=12" } }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "dependencies": { + "void-elements": "3.1.0" + } + }, "node_modules/html-webpack-plugin": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", @@ -9665,6 +9689,36 @@ "node": ">=10.17.0" } }, + "node_modules/i18next": { + "version": "23.10.1", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.1.tgz", + "integrity": "sha512-NDiIzFbcs3O9PXpfhkjyf7WdqFn5Vq6mhzhtkXzj51aOcNuPNcTwuYNuXCpHsanZGHlHKL35G7huoFeVic1hng==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/i18next-http-backend": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.0.tgz", + "integrity": "sha512-Z/aQsGZk1gSxt2/DztXk92DuDD20J+rNudT7ZCdTrNOiK8uQppfvdjq9+DFQfpAnFPn3VZS+KQIr1S/W1KxhpQ==", + "dependencies": { + "cross-fetch": "4.0.0" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -13865,6 +13919,44 @@ "tslib": "^2.0.3" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -16133,6 +16225,27 @@ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", "dev": true }, + "node_modules/react-i18next": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.0.tgz", + "integrity": "sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.2.3", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -17405,7 +17518,8 @@ "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -19305,6 +19419,14 @@ "node": ">= 0.8" } }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -21696,11 +21818,18 @@ } }, "@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", "requires": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + } } }, "@babel/runtime-corejs3": { @@ -25262,6 +25391,14 @@ "yaml": "^1.10.0" } }, + "cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "requires": { + "node-fetch": "^2.6.12" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -27349,6 +27486,14 @@ "terser": "^5.10.0" } }, + "html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "requires": { + "void-elements": "3.1.0" + } + }, "html-webpack-plugin": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", @@ -27448,6 +27593,22 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, + "i18next": { + "version": "23.10.1", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.1.tgz", + "integrity": "sha512-NDiIzFbcs3O9PXpfhkjyf7WdqFn5Vq6mhzhtkXzj51aOcNuPNcTwuYNuXCpHsanZGHlHKL35G7huoFeVic1hng==", + "requires": { + "@babel/runtime": "^7.23.2" + } + }, + "i18next-http-backend": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.0.tgz", + "integrity": "sha512-Z/aQsGZk1gSxt2/DztXk92DuDD20J+rNudT7ZCdTrNOiK8uQppfvdjq9+DFQfpAnFPn3VZS+KQIr1S/W1KxhpQ==", + "requires": { + "cross-fetch": "4.0.0" + } + }, "iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -30800,6 +30961,35 @@ "tslib": "^2.0.3" } }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -32314,6 +32504,15 @@ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", "dev": true }, + "react-i18next": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.0.tgz", + "integrity": "sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ==", + "requires": { + "@babel/runtime": "^7.23.9", + "html-parse-stringify": "^3.0.1" + } + }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -33318,7 +33517,8 @@ "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true }, "regenerator-transform": { "version": "0.15.0", @@ -34769,6 +34969,11 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, + "void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==" + }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", diff --git a/package.json b/package.json index 566012bc..363a7262 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,13 @@ "@fortawesome/react-fontawesome": "^0.2.0", "bootstrap": "^5.3.1", "http-proxy-middleware": "^2.0.6", + "i18next": "^23.10.1", + "i18next-http-backend": "^2.5.0", "moment": "^2.30.1", "react": "^18.2.0", "react-bootstrap": "^2.8.0", "react-dom": "^18.2.0", + "react-i18next": "^14.1.0", "react-router-dom": "^5.3.4", "react-table": "^7.8.0" }, diff --git a/public/locales/de-DE/translation.json b/public/locales/de-DE/translation.json new file mode 100644 index 00000000..e46347a4 --- /dev/null +++ b/public/locales/de-DE/translation.json @@ -0,0 +1,22 @@ +{ + "user.interface": "Benutzeroberfläche", + + "lang.en": "Englisch", + "lang.de": "Deutsch", + "lang.es": "Spanisch", + "lang.help": "Ändert die Sprache", + "lang.select": "Select language", + "lang.description": "Select the language", + + "theme.description": "Theme", + "theme.select":"Theme auswählen", + "theme.help": "Das aktuelle Theme", + "theme.dark":"Dunkel", + "theme.light": "Hell", + "theme.pastel": "Pastelfarbend", + "theme.ocean":"Ozean", + + "byte.representation.description":"Byte Darstellung", + "byte.representation.select": "Darstellung der Bytes auswählen", + "byte.representation.help": "Gibt die Darstellung der Bytes an" +} \ No newline at end of file diff --git a/public/locales/en-GB/translation.json b/public/locales/en-GB/translation.json new file mode 100644 index 00000000..7e968826 --- /dev/null +++ b/public/locales/en-GB/translation.json @@ -0,0 +1,21 @@ +{ + "user.interface": "User interface", + + "lang.en": "English", + "lang.de": "German", + "lang.es": "Spanish", + "lang.help": "Sets the language for the user interface", + "lang.select": "Select language", + "lang.select.description": "Select the language", + + "theme.description": "Theme", + "theme.select": "Select theme", + "theme.help": "The current active theme", + "theme.dark":"dark", + "theme.light": "light", + "theme.pastel": "pastel", + "theme.ocean":"ocean", + + "byte.representation.select":"Select byte representation", + "byte.representation.help":"Specifies the representation of bytes" +} \ No newline at end of file diff --git a/public/locales/es-ES/translation.json b/public/locales/es-ES/translation.json new file mode 100644 index 00000000..876ede5e --- /dev/null +++ b/public/locales/es-ES/translation.json @@ -0,0 +1,21 @@ +{ + "user.interface": "User interface", + + "lang.en": "Ingles", + "lang.de": "German", + "lang.es": "Spanish", + "lang.help": "Sets the language for the user interface", + "lang.select": "Select language", + "lang.select.description": "Select the language", + + "theme.description": "Theme", + "theme.select": "Select theme", + "theme.help": "The current active theme", + "theme.dark":"dark", + "theme.light": "light", + "theme.pastel": "pastel", + "theme.ocean":"ocean", + + "byte.representation.select":"Select byte representation", + "byte.representation.help":"Specifies the representation of bytes" +} \ No newline at end of file diff --git a/src/App.jsx b/src/App.jsx index 6669ff91..1a4c7e19 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -36,6 +36,7 @@ export default class App extends Component { this.fetchInitialRepositoryDescription = this.fetchInitialRepositoryDescription.bind(this); const tok = document.head.querySelector('meta[name="kopia-csrf-token"]'); + if (tok && tok.content) { axios.defaults.headers.common['X-Kopia-Csrf-Token'] = tok.content; } else { diff --git a/src/contexts/UIPreferencesContext.tsx b/src/contexts/UIPreferencesContext.tsx index 5bf31674..16131369 100644 --- a/src/contexts/UIPreferencesContext.tsx +++ b/src/contexts/UIPreferencesContext.tsx @@ -1,15 +1,18 @@ import React, { ReactNode, useCallback, useEffect, useState } from 'react'; import axios from 'axios'; +import i18next from 'i18next'; + +const PREFERENCES_URL = '/api/v1/ui-preferences'; export const PAGE_SIZES = [10, 20, 30, 40, 50, 100]; export const UIPreferencesContext = React.createContext({} as UIPreferences); -const DEFAULT_PREFERENCES = { pageSize: PAGE_SIZES[0], bytesStringBase2: false, defaultSnapshotViewAll: false, theme: getDefaultTheme(), preferWebDav: false, fontSize: "fs-6" } as SerializedUIPreferences; -const PREFERENCES_URL = '/api/v1/ui-preferences'; +const DEFAULT_PREFERENCES = { pageSize: PAGE_SIZES[0], bytesStringBase2: false, defaultSnapshotViewAll: false, theme: getDefaultTheme(), fontSize: "fs-6", language: "en-GB" } as SerializedUIPreferences; export type Theme = "light" | "dark" | "pastel" | "ocean"; export type PageSize = 10 | 20 | 30 | 40 | 50 | 100; export type FontSize = "fs-6" | "fs-5" | "fs-4"; +export type Language = "en-GB" | "de-DE" | "es-ES"; export interface UIPreferences { get pageSize(): PageSize @@ -17,11 +20,14 @@ export interface UIPreferences { get bytesStringBase2(): boolean get defaultSnapshotViewAll(): boolean get fontSize(): FontSize + get language(): Language + setTheme: (theme: Theme) => void setPageSize: (pageSize: number) => void setByteStringBase: (bytesStringBase2: String) => void setDefaultSnapshotViewAll: (defaultSnapshotView: boolean) => void setFontSize: (size: String) => void + setLanguage: (lang: Language) => void } interface SerializedUIPreferences { @@ -30,6 +36,7 @@ interface SerializedUIPreferences { defaultSnapshotView?: boolean theme: Theme fontSize: FontSize + language: Language } export interface UIPreferenceProviderProps { @@ -66,7 +73,7 @@ function normalizePageSize(pageSize: number): PageSize { export function UIPreferenceProvider(props: UIPreferenceProviderProps) { const [preferences, setPreferences] = useState(DEFAULT_PREFERENCES); - + const setTheme = useCallback((theme: Theme) => setPreferences(oldPreferences => { syncTheme(theme, oldPreferences.fontSize); return { ...oldPreferences, theme }; @@ -90,6 +97,11 @@ export function UIPreferenceProvider(props: UIPreferenceProviderProps) { return { ...oldPreferences, fontSize }; }), []); + const setLanguage = useCallback((language: Language) => setPreferences(oldPreferences => { + i18next.changeLanguage(language); + return { ...oldPreferences, language }; + }), []); + useEffect(() => { axios.get(PREFERENCES_URL).then(result => { let storedPreferences = result.data as SerializedUIPreferences; @@ -99,17 +111,21 @@ export function UIPreferenceProvider(props: UIPreferenceProviderProps) { if (!storedPreferences.fontSize || (storedPreferences.fontSize as string) === "") { storedPreferences.fontSize = DEFAULT_PREFERENCES.fontSize } + if (!storedPreferences.language || (storedPreferences.language as string) === "") { + storedPreferences.language = DEFAULT_PREFERENCES.language + } if (!storedPreferences.pageSize || storedPreferences.pageSize === 0) { storedPreferences.pageSize = DEFAULT_PREFERENCES.pageSize; } else { storedPreferences.pageSize = normalizePageSize(storedPreferences.pageSize); } setTheme(storedPreferences.theme); + setLanguage(storedPreferences.language); setFontSize(storedPreferences.fontSize); setPreferences(storedPreferences); }).catch(err => console.error(err)); - }, [setTheme, setFontSize]); + }, [setTheme, setFontSize, setLanguage]); useEffect(() => { if (!preferences) { @@ -134,7 +150,7 @@ export function UIPreferenceProvider(props: UIPreferenceProviderProps) { doc.classList.add(theme, fontSize) } - const providedValue = { ...preferences, setTheme, setPageSize, setByteStringBase, setDefaultSnapshotViewAll, setFontSize } as UIPreferences; + const providedValue = { ...preferences, setTheme, setPageSize, setByteStringBase, setDefaultSnapshotViewAll, setFontSize, setLanguage } as UIPreferences; return {props.children} diff --git a/src/index.jsx b/src/index.jsx index 3057d233..54543a8b 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -2,6 +2,7 @@ import React from 'react'; import { createRoot } from 'react-dom/client'; import App from './App'; import './css/index.css'; +import './utils/18ns'; const root = createRoot(document.getElementById('root')) root.render(); diff --git a/src/pages/Preferences.jsx b/src/pages/Preferences.jsx index f831d6cb..a6c8508f 100644 --- a/src/pages/Preferences.jsx +++ b/src/pages/Preferences.jsx @@ -1,52 +1,73 @@ -import { Component } from 'react'; +import Accordion from 'react-bootstrap/Accordion'; import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; +import { useContext } from 'react'; +import { useTranslation } from "react-i18next"; /** * Class that exports preferences */ -export class Preferences extends Component { - render() { - const { pageSize, theme, bytesStringBase2, fontSize, setByteStringBase, setTheme, setFontSize} = this.context; - return <> -
-
- - - The current active theme -
-
-
- - - Specifies the representation of bytes -
-
-
- - - Specifies the appearance of the user interface -
-
-
- - - Specifies the pagination size in tables -
-
- - } -} -Preferences.contextType = UIPreferencesContext +export function Preferences() { + const { t } = useTranslation(); + const { pageSize, theme, bytesStringBase2, fontSize, language, setFontSize, setByteStringBase, setTheme, setLanguage } = useContext(UIPreferencesContext); + return <> + + + {t('user.interface')} + +
+
+ + + {t('theme.help')} +
+
+
+ + + {t('byte.representation.help')} +
+
+
+ + + Specifies the appearance of the user interface +
+
+
+ + + Specifies the pagination size in tables +
+
+
+
+ + Language + +
+ + + {t('lang.help')} +
+
+
+
+ +} \ No newline at end of file diff --git a/src/utils/18ns.js b/src/utils/18ns.js new file mode 100644 index 00000000..e3eb770a --- /dev/null +++ b/src/utils/18ns.js @@ -0,0 +1,17 @@ +import i18n from "i18next"; +import { initReactI18next } from "react-i18next"; +import backend from "i18next-http-backend"; + +i18n + .use(backend) + .use(initReactI18next) + .init({ + fallbackLng: "en-GB", + ns: ["translation"], + defaultNS: "translation", + interpolation: { + escapeValue: false, + }, + }); + +export default i18n; \ No newline at end of file From 9c85f8ceb56aaec876d3844bd9fb0efa8ff0886d Mon Sep 17 00:00:00 2001 From: lupusA Date: Fri, 8 Mar 2024 12:29:13 +0100 Subject: [PATCH 02/27] Added more languages as a placeholder --- public/locales/de-DE/translation.json | 19 +++++++++++--- public/locales/en-GB/translation.json | 16 +++++++++++- public/locales/es-ES/translation.json | 36 +++++++++++++++++++-------- public/locales/fr-FR/translation.json | 35 ++++++++++++++++++++++++++ public/locales/it-IT/translation.json | 35 ++++++++++++++++++++++++++ public/locales/jp-JP/translation.json | 35 ++++++++++++++++++++++++++ public/locales/ru-RU/translation.json | 35 ++++++++++++++++++++++++++ src/contexts/UIPreferencesContext.tsx | 2 +- src/pages/Preferences.jsx | 18 ++++++++------ 9 files changed, 208 insertions(+), 23 deletions(-) create mode 100644 public/locales/fr-FR/translation.json create mode 100644 public/locales/it-IT/translation.json create mode 100644 public/locales/jp-JP/translation.json create mode 100644 public/locales/ru-RU/translation.json diff --git a/public/locales/de-DE/translation.json b/public/locales/de-DE/translation.json index e46347a4..4694e109 100644 --- a/public/locales/de-DE/translation.json +++ b/public/locales/de-DE/translation.json @@ -1,16 +1,29 @@ { "user.interface": "Benutzeroberfläche", + "user.interface.appearance":"Erscheinungsbild", + "user.interface.appearance.small":"klein", + "user.interface.appearance.medium":"mittel", + "user.interface.appearance.large":"groß", + + "user.interface.pagesize.description": "Page size", + "user.interface.pagesize.help": "Specifies the pagination size in tables", + "user.interface.pagesize.hint": "Page size", "lang.en": "Englisch", "lang.de": "Deutsch", "lang.es": "Spanisch", + "lang.fr": "Französisch", + "lang.ru": "Russisch", + "lang.jp": "Japanisch", + "lang.it": "Italienisch", + "lang.help": "Ändert die Sprache", "lang.select": "Select language", "lang.description": "Select the language", - "theme.description": "Theme", - "theme.select":"Theme auswählen", - "theme.help": "Das aktuelle Theme", + "theme.description": "Thema", + "theme.select":"Thema auswählen", + "theme.help": "Das aktuelle Thema", "theme.dark":"Dunkel", "theme.light": "Hell", "theme.pastel": "Pastelfarbend", diff --git a/public/locales/en-GB/translation.json b/public/locales/en-GB/translation.json index 7e968826..e5558055 100644 --- a/public/locales/en-GB/translation.json +++ b/public/locales/en-GB/translation.json @@ -1,12 +1,25 @@ { "user.interface": "User interface", + "user.interface.appearance":"Appearance", + "user.interface.appearance.small":"small", + "user.interface.appearance.medium":"medium", + "user.interface.appearance.large":"large", + + "user.interface.pagesize.description": "Page size", + "user.interface.pagesize.help": "Specifies the pagination size in tables", + "user.interface.pagesize.hint": "Page size", "lang.en": "English", "lang.de": "German", "lang.es": "Spanish", + "lang.fr": "French", + "lang.ru": "Russian", + "lang.jp": "Japanese", + "lang.it": "Italian", + "lang.help": "Sets the language for the user interface", "lang.select": "Select language", - "lang.select.description": "Select the language", + "lang.description": "Select the language", "theme.description": "Theme", "theme.select": "Select theme", @@ -16,6 +29,7 @@ "theme.pastel": "pastel", "theme.ocean":"ocean", + "byte.representation.description":"Select byte representation", "byte.representation.select":"Select byte representation", "byte.representation.help":"Specifies the representation of bytes" } \ No newline at end of file diff --git a/public/locales/es-ES/translation.json b/public/locales/es-ES/translation.json index 876ede5e..e545b4b2 100644 --- a/public/locales/es-ES/translation.json +++ b/public/locales/es-ES/translation.json @@ -1,21 +1,35 @@ { - "user.interface": "User interface", + "user.interface": "Interfaz de usuario", + "user.interface.appearance":"Presentación", + "user.interface.appearance.small":"pequeño", + "user.interface.appearance.medium":"medio", + "user.interface.appearance.large":"gran", - "lang.en": "Ingles", - "lang.de": "German", - "lang.es": "Spanish", - "lang.help": "Sets the language for the user interface", - "lang.select": "Select language", - "lang.select.description": "Select the language", + "user.interface.pagesize.description": "Page size", + "user.interface.pagesize.help": "Specifies the pagination size in tables", + "user.interface.pagesize.hint": "Page size", - "theme.description": "Theme", + "lang.en": "Inglés", + "lang.de": "Alemán", + "lang.es": "Español", + "lang.fr": "Francés", + "lang.ru": "Russian", + "lang.jp": "Japanese", + "lang.it": "Italian", + + "lang.help": "Establece el idioma de la interfaz de usuario", + "lang.select": "Seleccionar idioma", + "lang.description": "Seleccione el idioma", + + "theme.description": "Tema", "theme.select": "Select theme", "theme.help": "The current active theme", - "theme.dark":"dark", - "theme.light": "light", + "theme.dark":"oscuro", + "theme.light": "luz", "theme.pastel": "pastel", - "theme.ocean":"ocean", + "theme.ocean":"océano", + "byte.representation.description":"Select byte representation", "byte.representation.select":"Select byte representation", "byte.representation.help":"Specifies the representation of bytes" } \ No newline at end of file diff --git a/public/locales/fr-FR/translation.json b/public/locales/fr-FR/translation.json new file mode 100644 index 00000000..af9ff2dc --- /dev/null +++ b/public/locales/fr-FR/translation.json @@ -0,0 +1,35 @@ +{ + "user.interface": "Interface utilisateur", + "user.interface.appearance":"Appearance", + "user.interface.appearance.small":"small", + "user.interface.appearance.medium":"medium", + "user.interface.appearance.large":"large", + + "user.interface.pagesize.description": "Page size", + "user.interface.pagesize.help": "Specifies the pagination size in tables", + "user.interface.pagesize.hint": "Page size", + + "lang.en": "English", + "lang.de": "German", + "lang.es": "Spanish", + "lang.fr": "Français", + "lang.ru": "Russian", + "lang.jp": "Japanese", + "lang.it": "Italian", + + "lang.help": "Sets the language for the user interface", + "lang.select": "Select language", + "lang.description": "Select the language", + + "theme.description": "Theme", + "theme.select": "Select theme", + "theme.help": "The current active theme", + "theme.dark":"dark", + "theme.light": "light", + "theme.pastel": "pastel", + "theme.ocean":"ocean", + + "byte.representation.description":"Select byte representation", + "byte.representation.select":"Select byte representation", + "byte.representation.help":"Specifies the representation of bytes" +} \ No newline at end of file diff --git a/public/locales/it-IT/translation.json b/public/locales/it-IT/translation.json new file mode 100644 index 00000000..af9ff2dc --- /dev/null +++ b/public/locales/it-IT/translation.json @@ -0,0 +1,35 @@ +{ + "user.interface": "Interface utilisateur", + "user.interface.appearance":"Appearance", + "user.interface.appearance.small":"small", + "user.interface.appearance.medium":"medium", + "user.interface.appearance.large":"large", + + "user.interface.pagesize.description": "Page size", + "user.interface.pagesize.help": "Specifies the pagination size in tables", + "user.interface.pagesize.hint": "Page size", + + "lang.en": "English", + "lang.de": "German", + "lang.es": "Spanish", + "lang.fr": "Français", + "lang.ru": "Russian", + "lang.jp": "Japanese", + "lang.it": "Italian", + + "lang.help": "Sets the language for the user interface", + "lang.select": "Select language", + "lang.description": "Select the language", + + "theme.description": "Theme", + "theme.select": "Select theme", + "theme.help": "The current active theme", + "theme.dark":"dark", + "theme.light": "light", + "theme.pastel": "pastel", + "theme.ocean":"ocean", + + "byte.representation.description":"Select byte representation", + "byte.representation.select":"Select byte representation", + "byte.representation.help":"Specifies the representation of bytes" +} \ No newline at end of file diff --git a/public/locales/jp-JP/translation.json b/public/locales/jp-JP/translation.json new file mode 100644 index 00000000..af9ff2dc --- /dev/null +++ b/public/locales/jp-JP/translation.json @@ -0,0 +1,35 @@ +{ + "user.interface": "Interface utilisateur", + "user.interface.appearance":"Appearance", + "user.interface.appearance.small":"small", + "user.interface.appearance.medium":"medium", + "user.interface.appearance.large":"large", + + "user.interface.pagesize.description": "Page size", + "user.interface.pagesize.help": "Specifies the pagination size in tables", + "user.interface.pagesize.hint": "Page size", + + "lang.en": "English", + "lang.de": "German", + "lang.es": "Spanish", + "lang.fr": "Français", + "lang.ru": "Russian", + "lang.jp": "Japanese", + "lang.it": "Italian", + + "lang.help": "Sets the language for the user interface", + "lang.select": "Select language", + "lang.description": "Select the language", + + "theme.description": "Theme", + "theme.select": "Select theme", + "theme.help": "The current active theme", + "theme.dark":"dark", + "theme.light": "light", + "theme.pastel": "pastel", + "theme.ocean":"ocean", + + "byte.representation.description":"Select byte representation", + "byte.representation.select":"Select byte representation", + "byte.representation.help":"Specifies the representation of bytes" +} \ No newline at end of file diff --git a/public/locales/ru-RU/translation.json b/public/locales/ru-RU/translation.json new file mode 100644 index 00000000..af9ff2dc --- /dev/null +++ b/public/locales/ru-RU/translation.json @@ -0,0 +1,35 @@ +{ + "user.interface": "Interface utilisateur", + "user.interface.appearance":"Appearance", + "user.interface.appearance.small":"small", + "user.interface.appearance.medium":"medium", + "user.interface.appearance.large":"large", + + "user.interface.pagesize.description": "Page size", + "user.interface.pagesize.help": "Specifies the pagination size in tables", + "user.interface.pagesize.hint": "Page size", + + "lang.en": "English", + "lang.de": "German", + "lang.es": "Spanish", + "lang.fr": "Français", + "lang.ru": "Russian", + "lang.jp": "Japanese", + "lang.it": "Italian", + + "lang.help": "Sets the language for the user interface", + "lang.select": "Select language", + "lang.description": "Select the language", + + "theme.description": "Theme", + "theme.select": "Select theme", + "theme.help": "The current active theme", + "theme.dark":"dark", + "theme.light": "light", + "theme.pastel": "pastel", + "theme.ocean":"ocean", + + "byte.representation.description":"Select byte representation", + "byte.representation.select":"Select byte representation", + "byte.representation.help":"Specifies the representation of bytes" +} \ No newline at end of file diff --git a/src/contexts/UIPreferencesContext.tsx b/src/contexts/UIPreferencesContext.tsx index 16131369..5d946b24 100644 --- a/src/contexts/UIPreferencesContext.tsx +++ b/src/contexts/UIPreferencesContext.tsx @@ -12,7 +12,7 @@ const DEFAULT_PREFERENCES = { pageSize: PAGE_SIZES[0], bytesStringBase2: false, export type Theme = "light" | "dark" | "pastel" | "ocean"; export type PageSize = 10 | 20 | 30 | 40 | 50 | 100; export type FontSize = "fs-6" | "fs-5" | "fs-4"; -export type Language = "en-GB" | "de-DE" | "es-ES"; +export type Language = "en-GB" | "de-DE" | "es-ES" | "fr-FR" | "jp-JP" | "ru-RU" | "it-IT"; export interface UIPreferences { get pageSize(): PageSize diff --git a/src/pages/Preferences.jsx b/src/pages/Preferences.jsx index a6c8508f..1289d14f 100644 --- a/src/pages/Preferences.jsx +++ b/src/pages/Preferences.jsx @@ -36,20 +36,20 @@ export function Preferences() {
- + Specifies the appearance of the user interface

- + - Specifies the pagination size in tables + type='text' placeholder={t('user.interface.pagesize.hint')} value={pageSize} disabled={true} /> + {t('user.interface.pagesize.help')}
@@ -63,6 +63,10 @@ export function Preferences() { + + + + {t('lang.help')} From 4209eaab994e6db2c508137c124589233cf5d467 Mon Sep 17 00:00:00 2001 From: lupusA Date: Fri, 8 Mar 2024 17:43:23 +0100 Subject: [PATCH 03/27] Further working on the feature --- public/locales/de-DE/translation.json | 90 +- public/locales/en-GB/translation.json | 52 +- public/locales/es-ES/translation.json | 84 +- public/locales/fr-FR/translation.json | 58 +- public/locales/it-IT/translation.json | 58 +- public/locales/jp-JP/translation.json | 58 +- public/locales/ru-RU/translation.json | 58 +- src/App.jsx | 13 +- src/pages/Preferences.jsx | 12 +- src/pages/Repository.jsx | 11 +- src/pages/Task.jsx | 25 +- src/pages/Tasks.jsx | 19 +- src/tests/Preferences.test.js | 12 +- .../__snapshots__/Preferences.test.js.snap | 1793 +++++------------ 14 files changed, 906 insertions(+), 1437 deletions(-) diff --git a/public/locales/de-DE/translation.json b/public/locales/de-DE/translation.json index 4694e109..ca722b1e 100644 --- a/public/locales/de-DE/translation.json +++ b/public/locales/de-DE/translation.json @@ -1,35 +1,77 @@ { - "user.interface": "Benutzeroberfläche", - "user.interface.appearance":"Erscheinungsbild", - "user.interface.appearance.small":"klein", - "user.interface.appearance.medium":"mittel", - "user.interface.appearance.large":"groß", + "tab.preferences":"Preferences", + "tab.repository":"Repository", + "tab.tasks":"Tasks", + "tab.policies":"Policies", + "tab.snapshots":"Snapshots", + + "task.all":"All", + "task.running":"Running", + "task.failed":"Failed", + "task.loading": "Loading...", + "task.time.start": "Start time", + "task.status": "Status", + "task.kind": "Kind", + "task.description": "Description", + + "task.status.succeed.after": "Task succeeded after", + "task.status.canceled": "Task canceled after", + "task.status.canceling": "Canceling", + "task.status.error": "Task error", + "task.status.running.for": "Task running for", + + "task.status.started": "Started", + "task.status.finished": "Finished", + "task.logs": "Logs", + + "task.event.stop": "Stop", + "task.header.counter": "Counter", + "task.header.value": "Value", + + "repository.status.initializing": "Initializing repository...", + "repository.event.connection.cancel":"Cancel connection", + "repository.status.connected": "Connected to repository", + + "log.event.hide": "Hide log", + "log.event.show": "Show log", + + + "user.interface": "User interface", + "user.interface.appearance":"Appearance", + "user.interface.appearance.hint":"Select font size", + "user.interface.appearance.help": "Specifies the appearance of the user interface", + + "user.interface.appearance.small":"small", + "user.interface.appearance.medium":"medium", + "user.interface.appearance.large":"large", "user.interface.pagesize.description": "Page size", "user.interface.pagesize.help": "Specifies the pagination size in tables", "user.interface.pagesize.hint": "Page size", - "lang.en": "Englisch", - "lang.de": "Deutsch", - "lang.es": "Spanisch", - "lang.fr": "Französisch", - "lang.ru": "Russisch", - "lang.jp": "Japanisch", - "lang.it": "Italienisch", + "user.interface.byte.representation.description":"Select byte representation", + "user.interface.byte.representation.select":"Select byte representation", + "user.interface.byte.representation.help":"Specifies the representation of bytes", + + "user.language":"Language", + + "lang.en": "English", + "lang.de": "German", + "lang.es": "Spanish", + "lang.fr": "French", + "lang.ru": "Russian", + "lang.jp": "Japanese", + "lang.it": "Italian", - "lang.help": "Ändert die Sprache", + "lang.help": "Sets the language for the user interface", "lang.select": "Select language", "lang.description": "Select the language", - "theme.description": "Thema", - "theme.select":"Thema auswählen", - "theme.help": "Das aktuelle Thema", - "theme.dark":"Dunkel", - "theme.light": "Hell", - "theme.pastel": "Pastelfarbend", - "theme.ocean":"Ozean", - - "byte.representation.description":"Byte Darstellung", - "byte.representation.select": "Darstellung der Bytes auswählen", - "byte.representation.help": "Gibt die Darstellung der Bytes an" + "theme.description": "Theme", + "theme.select": "Select theme", + "theme.help": "The current active theme", + "theme.dark":"dark", + "theme.light": "light", + "theme.pastel": "pastel", + "theme.ocean":"ocean" } \ No newline at end of file diff --git a/public/locales/en-GB/translation.json b/public/locales/en-GB/translation.json index e5558055..ca722b1e 100644 --- a/public/locales/en-GB/translation.json +++ b/public/locales/en-GB/translation.json @@ -1,6 +1,46 @@ { + "tab.preferences":"Preferences", + "tab.repository":"Repository", + "tab.tasks":"Tasks", + "tab.policies":"Policies", + "tab.snapshots":"Snapshots", + + "task.all":"All", + "task.running":"Running", + "task.failed":"Failed", + "task.loading": "Loading...", + "task.time.start": "Start time", + "task.status": "Status", + "task.kind": "Kind", + "task.description": "Description", + + "task.status.succeed.after": "Task succeeded after", + "task.status.canceled": "Task canceled after", + "task.status.canceling": "Canceling", + "task.status.error": "Task error", + "task.status.running.for": "Task running for", + + "task.status.started": "Started", + "task.status.finished": "Finished", + "task.logs": "Logs", + + "task.event.stop": "Stop", + "task.header.counter": "Counter", + "task.header.value": "Value", + + "repository.status.initializing": "Initializing repository...", + "repository.event.connection.cancel":"Cancel connection", + "repository.status.connected": "Connected to repository", + + "log.event.hide": "Hide log", + "log.event.show": "Show log", + + "user.interface": "User interface", "user.interface.appearance":"Appearance", + "user.interface.appearance.hint":"Select font size", + "user.interface.appearance.help": "Specifies the appearance of the user interface", + "user.interface.appearance.small":"small", "user.interface.appearance.medium":"medium", "user.interface.appearance.large":"large", @@ -9,6 +49,12 @@ "user.interface.pagesize.help": "Specifies the pagination size in tables", "user.interface.pagesize.hint": "Page size", + "user.interface.byte.representation.description":"Select byte representation", + "user.interface.byte.representation.select":"Select byte representation", + "user.interface.byte.representation.help":"Specifies the representation of bytes", + + "user.language":"Language", + "lang.en": "English", "lang.de": "German", "lang.es": "Spanish", @@ -27,9 +73,5 @@ "theme.dark":"dark", "theme.light": "light", "theme.pastel": "pastel", - "theme.ocean":"ocean", - - "byte.representation.description":"Select byte representation", - "byte.representation.select":"Select byte representation", - "byte.representation.help":"Specifies the representation of bytes" + "theme.ocean":"ocean" } \ No newline at end of file diff --git a/public/locales/es-ES/translation.json b/public/locales/es-ES/translation.json index e545b4b2..ca722b1e 100644 --- a/public/locales/es-ES/translation.json +++ b/public/locales/es-ES/translation.json @@ -1,35 +1,77 @@ { - "user.interface": "Interfaz de usuario", - "user.interface.appearance":"Presentación", - "user.interface.appearance.small":"pequeño", - "user.interface.appearance.medium":"medio", - "user.interface.appearance.large":"gran", + "tab.preferences":"Preferences", + "tab.repository":"Repository", + "tab.tasks":"Tasks", + "tab.policies":"Policies", + "tab.snapshots":"Snapshots", + + "task.all":"All", + "task.running":"Running", + "task.failed":"Failed", + "task.loading": "Loading...", + "task.time.start": "Start time", + "task.status": "Status", + "task.kind": "Kind", + "task.description": "Description", + + "task.status.succeed.after": "Task succeeded after", + "task.status.canceled": "Task canceled after", + "task.status.canceling": "Canceling", + "task.status.error": "Task error", + "task.status.running.for": "Task running for", + + "task.status.started": "Started", + "task.status.finished": "Finished", + "task.logs": "Logs", + + "task.event.stop": "Stop", + "task.header.counter": "Counter", + "task.header.value": "Value", + + "repository.status.initializing": "Initializing repository...", + "repository.event.connection.cancel":"Cancel connection", + "repository.status.connected": "Connected to repository", + + "log.event.hide": "Hide log", + "log.event.show": "Show log", + + + "user.interface": "User interface", + "user.interface.appearance":"Appearance", + "user.interface.appearance.hint":"Select font size", + "user.interface.appearance.help": "Specifies the appearance of the user interface", + + "user.interface.appearance.small":"small", + "user.interface.appearance.medium":"medium", + "user.interface.appearance.large":"large", "user.interface.pagesize.description": "Page size", "user.interface.pagesize.help": "Specifies the pagination size in tables", "user.interface.pagesize.hint": "Page size", - "lang.en": "Inglés", - "lang.de": "Alemán", - "lang.es": "Español", - "lang.fr": "Francés", + "user.interface.byte.representation.description":"Select byte representation", + "user.interface.byte.representation.select":"Select byte representation", + "user.interface.byte.representation.help":"Specifies the representation of bytes", + + "user.language":"Language", + + "lang.en": "English", + "lang.de": "German", + "lang.es": "Spanish", + "lang.fr": "French", "lang.ru": "Russian", "lang.jp": "Japanese", "lang.it": "Italian", - - "lang.help": "Establece el idioma de la interfaz de usuario", - "lang.select": "Seleccionar idioma", - "lang.description": "Seleccione el idioma", - "theme.description": "Tema", + "lang.help": "Sets the language for the user interface", + "lang.select": "Select language", + "lang.description": "Select the language", + + "theme.description": "Theme", "theme.select": "Select theme", "theme.help": "The current active theme", - "theme.dark":"oscuro", - "theme.light": "luz", + "theme.dark":"dark", + "theme.light": "light", "theme.pastel": "pastel", - "theme.ocean":"océano", - - "byte.representation.description":"Select byte representation", - "byte.representation.select":"Select byte representation", - "byte.representation.help":"Specifies the representation of bytes" + "theme.ocean":"ocean" } \ No newline at end of file diff --git a/public/locales/fr-FR/translation.json b/public/locales/fr-FR/translation.json index af9ff2dc..ca722b1e 100644 --- a/public/locales/fr-FR/translation.json +++ b/public/locales/fr-FR/translation.json @@ -1,6 +1,46 @@ { - "user.interface": "Interface utilisateur", + "tab.preferences":"Preferences", + "tab.repository":"Repository", + "tab.tasks":"Tasks", + "tab.policies":"Policies", + "tab.snapshots":"Snapshots", + + "task.all":"All", + "task.running":"Running", + "task.failed":"Failed", + "task.loading": "Loading...", + "task.time.start": "Start time", + "task.status": "Status", + "task.kind": "Kind", + "task.description": "Description", + + "task.status.succeed.after": "Task succeeded after", + "task.status.canceled": "Task canceled after", + "task.status.canceling": "Canceling", + "task.status.error": "Task error", + "task.status.running.for": "Task running for", + + "task.status.started": "Started", + "task.status.finished": "Finished", + "task.logs": "Logs", + + "task.event.stop": "Stop", + "task.header.counter": "Counter", + "task.header.value": "Value", + + "repository.status.initializing": "Initializing repository...", + "repository.event.connection.cancel":"Cancel connection", + "repository.status.connected": "Connected to repository", + + "log.event.hide": "Hide log", + "log.event.show": "Show log", + + + "user.interface": "User interface", "user.interface.appearance":"Appearance", + "user.interface.appearance.hint":"Select font size", + "user.interface.appearance.help": "Specifies the appearance of the user interface", + "user.interface.appearance.small":"small", "user.interface.appearance.medium":"medium", "user.interface.appearance.large":"large", @@ -9,14 +49,20 @@ "user.interface.pagesize.help": "Specifies the pagination size in tables", "user.interface.pagesize.hint": "Page size", + "user.interface.byte.representation.description":"Select byte representation", + "user.interface.byte.representation.select":"Select byte representation", + "user.interface.byte.representation.help":"Specifies the representation of bytes", + + "user.language":"Language", + "lang.en": "English", "lang.de": "German", "lang.es": "Spanish", - "lang.fr": "Français", + "lang.fr": "French", "lang.ru": "Russian", "lang.jp": "Japanese", "lang.it": "Italian", - + "lang.help": "Sets the language for the user interface", "lang.select": "Select language", "lang.description": "Select the language", @@ -27,9 +73,5 @@ "theme.dark":"dark", "theme.light": "light", "theme.pastel": "pastel", - "theme.ocean":"ocean", - - "byte.representation.description":"Select byte representation", - "byte.representation.select":"Select byte representation", - "byte.representation.help":"Specifies the representation of bytes" + "theme.ocean":"ocean" } \ No newline at end of file diff --git a/public/locales/it-IT/translation.json b/public/locales/it-IT/translation.json index af9ff2dc..ca722b1e 100644 --- a/public/locales/it-IT/translation.json +++ b/public/locales/it-IT/translation.json @@ -1,6 +1,46 @@ { - "user.interface": "Interface utilisateur", + "tab.preferences":"Preferences", + "tab.repository":"Repository", + "tab.tasks":"Tasks", + "tab.policies":"Policies", + "tab.snapshots":"Snapshots", + + "task.all":"All", + "task.running":"Running", + "task.failed":"Failed", + "task.loading": "Loading...", + "task.time.start": "Start time", + "task.status": "Status", + "task.kind": "Kind", + "task.description": "Description", + + "task.status.succeed.after": "Task succeeded after", + "task.status.canceled": "Task canceled after", + "task.status.canceling": "Canceling", + "task.status.error": "Task error", + "task.status.running.for": "Task running for", + + "task.status.started": "Started", + "task.status.finished": "Finished", + "task.logs": "Logs", + + "task.event.stop": "Stop", + "task.header.counter": "Counter", + "task.header.value": "Value", + + "repository.status.initializing": "Initializing repository...", + "repository.event.connection.cancel":"Cancel connection", + "repository.status.connected": "Connected to repository", + + "log.event.hide": "Hide log", + "log.event.show": "Show log", + + + "user.interface": "User interface", "user.interface.appearance":"Appearance", + "user.interface.appearance.hint":"Select font size", + "user.interface.appearance.help": "Specifies the appearance of the user interface", + "user.interface.appearance.small":"small", "user.interface.appearance.medium":"medium", "user.interface.appearance.large":"large", @@ -9,14 +49,20 @@ "user.interface.pagesize.help": "Specifies the pagination size in tables", "user.interface.pagesize.hint": "Page size", + "user.interface.byte.representation.description":"Select byte representation", + "user.interface.byte.representation.select":"Select byte representation", + "user.interface.byte.representation.help":"Specifies the representation of bytes", + + "user.language":"Language", + "lang.en": "English", "lang.de": "German", "lang.es": "Spanish", - "lang.fr": "Français", + "lang.fr": "French", "lang.ru": "Russian", "lang.jp": "Japanese", "lang.it": "Italian", - + "lang.help": "Sets the language for the user interface", "lang.select": "Select language", "lang.description": "Select the language", @@ -27,9 +73,5 @@ "theme.dark":"dark", "theme.light": "light", "theme.pastel": "pastel", - "theme.ocean":"ocean", - - "byte.representation.description":"Select byte representation", - "byte.representation.select":"Select byte representation", - "byte.representation.help":"Specifies the representation of bytes" + "theme.ocean":"ocean" } \ No newline at end of file diff --git a/public/locales/jp-JP/translation.json b/public/locales/jp-JP/translation.json index af9ff2dc..ca722b1e 100644 --- a/public/locales/jp-JP/translation.json +++ b/public/locales/jp-JP/translation.json @@ -1,6 +1,46 @@ { - "user.interface": "Interface utilisateur", + "tab.preferences":"Preferences", + "tab.repository":"Repository", + "tab.tasks":"Tasks", + "tab.policies":"Policies", + "tab.snapshots":"Snapshots", + + "task.all":"All", + "task.running":"Running", + "task.failed":"Failed", + "task.loading": "Loading...", + "task.time.start": "Start time", + "task.status": "Status", + "task.kind": "Kind", + "task.description": "Description", + + "task.status.succeed.after": "Task succeeded after", + "task.status.canceled": "Task canceled after", + "task.status.canceling": "Canceling", + "task.status.error": "Task error", + "task.status.running.for": "Task running for", + + "task.status.started": "Started", + "task.status.finished": "Finished", + "task.logs": "Logs", + + "task.event.stop": "Stop", + "task.header.counter": "Counter", + "task.header.value": "Value", + + "repository.status.initializing": "Initializing repository...", + "repository.event.connection.cancel":"Cancel connection", + "repository.status.connected": "Connected to repository", + + "log.event.hide": "Hide log", + "log.event.show": "Show log", + + + "user.interface": "User interface", "user.interface.appearance":"Appearance", + "user.interface.appearance.hint":"Select font size", + "user.interface.appearance.help": "Specifies the appearance of the user interface", + "user.interface.appearance.small":"small", "user.interface.appearance.medium":"medium", "user.interface.appearance.large":"large", @@ -9,14 +49,20 @@ "user.interface.pagesize.help": "Specifies the pagination size in tables", "user.interface.pagesize.hint": "Page size", + "user.interface.byte.representation.description":"Select byte representation", + "user.interface.byte.representation.select":"Select byte representation", + "user.interface.byte.representation.help":"Specifies the representation of bytes", + + "user.language":"Language", + "lang.en": "English", "lang.de": "German", "lang.es": "Spanish", - "lang.fr": "Français", + "lang.fr": "French", "lang.ru": "Russian", "lang.jp": "Japanese", "lang.it": "Italian", - + "lang.help": "Sets the language for the user interface", "lang.select": "Select language", "lang.description": "Select the language", @@ -27,9 +73,5 @@ "theme.dark":"dark", "theme.light": "light", "theme.pastel": "pastel", - "theme.ocean":"ocean", - - "byte.representation.description":"Select byte representation", - "byte.representation.select":"Select byte representation", - "byte.representation.help":"Specifies the representation of bytes" + "theme.ocean":"ocean" } \ No newline at end of file diff --git a/public/locales/ru-RU/translation.json b/public/locales/ru-RU/translation.json index af9ff2dc..ca722b1e 100644 --- a/public/locales/ru-RU/translation.json +++ b/public/locales/ru-RU/translation.json @@ -1,6 +1,46 @@ { - "user.interface": "Interface utilisateur", + "tab.preferences":"Preferences", + "tab.repository":"Repository", + "tab.tasks":"Tasks", + "tab.policies":"Policies", + "tab.snapshots":"Snapshots", + + "task.all":"All", + "task.running":"Running", + "task.failed":"Failed", + "task.loading": "Loading...", + "task.time.start": "Start time", + "task.status": "Status", + "task.kind": "Kind", + "task.description": "Description", + + "task.status.succeed.after": "Task succeeded after", + "task.status.canceled": "Task canceled after", + "task.status.canceling": "Canceling", + "task.status.error": "Task error", + "task.status.running.for": "Task running for", + + "task.status.started": "Started", + "task.status.finished": "Finished", + "task.logs": "Logs", + + "task.event.stop": "Stop", + "task.header.counter": "Counter", + "task.header.value": "Value", + + "repository.status.initializing": "Initializing repository...", + "repository.event.connection.cancel":"Cancel connection", + "repository.status.connected": "Connected to repository", + + "log.event.hide": "Hide log", + "log.event.show": "Show log", + + + "user.interface": "User interface", "user.interface.appearance":"Appearance", + "user.interface.appearance.hint":"Select font size", + "user.interface.appearance.help": "Specifies the appearance of the user interface", + "user.interface.appearance.small":"small", "user.interface.appearance.medium":"medium", "user.interface.appearance.large":"large", @@ -9,14 +49,20 @@ "user.interface.pagesize.help": "Specifies the pagination size in tables", "user.interface.pagesize.hint": "Page size", + "user.interface.byte.representation.description":"Select byte representation", + "user.interface.byte.representation.select":"Select byte representation", + "user.interface.byte.representation.help":"Specifies the representation of bytes", + + "user.language":"Language", + "lang.en": "English", "lang.de": "German", "lang.es": "Spanish", - "lang.fr": "Français", + "lang.fr": "French", "lang.ru": "Russian", "lang.jp": "Japanese", "lang.it": "Italian", - + "lang.help": "Sets the language for the user interface", "lang.select": "Select language", "lang.description": "Select the language", @@ -27,9 +73,5 @@ "theme.dark":"dark", "theme.light": "light", "theme.pastel": "pastel", - "theme.ocean":"ocean", - - "byte.representation.description":"Select byte representation", - "byte.representation.select":"Select byte representation", - "byte.representation.help":"Specifies the representation of bytes" + "theme.ocean":"ocean" } \ No newline at end of file diff --git a/src/App.jsx b/src/App.jsx index 1a4c7e19..deea4b6e 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -2,6 +2,8 @@ import 'bootstrap/dist/css/bootstrap.min.css'; import './css/Theme.css'; import './css/App.css'; import axios from 'axios'; +import i18n from './utils/18ns' + import { React, Component } from 'react'; import { Navbar, Nav, Container } from 'react-bootstrap'; import { BrowserRouter as Router, NavLink, Redirect, Route, Switch } from 'react-router-dom'; @@ -99,7 +101,6 @@ export default class App extends Component { render() { const { uiPrefs, runningTaskCount, isRepositoryConnected } = this.state; - return ( @@ -110,18 +111,18 @@ export default class App extends Component { diff --git a/src/pages/Preferences.jsx b/src/pages/Preferences.jsx index 1289d14f..f718972a 100644 --- a/src/pages/Preferences.jsx +++ b/src/pages/Preferences.jsx @@ -27,22 +27,22 @@ export function Preferences() {
- - setByteStringBase(e.target.value)}> - {t('byte.representation.help')} + {t('user.interface.byte.representation.help')}

- setFontSize(e.target.value)}> - Specifies the appearance of the user interface + {t('user.interface.appearance.help')}

@@ -55,7 +55,7 @@ export function Preferences() { - Language + {t('user.language')}
diff --git a/src/pages/Repository.jsx b/src/pages/Repository.jsx index 5e646cb3..4e87c454 100644 --- a/src/pages/Repository.jsx +++ b/src/pages/Repository.jsx @@ -14,6 +14,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faCheck, faChevronCircleDown, faChevronCircleUp, faWindowClose } from '@fortawesome/free-solid-svg-icons'; import { Logs } from '../components/Logs'; import { AppContext } from '../contexts/AppContext'; +import i18n from '../utils/18ns' export class Repository extends Component { constructor() { @@ -127,13 +128,13 @@ export class Repository extends Component { } if (this.state.status.initTaskID) { - return <>

 Initializing Repository...

+ return <>

 {i18n.t('repository.status.initializing')}

{this.state.showLog ? <> - + - : } + : }
- + ; } @@ -141,7 +142,7 @@ export class Repository extends Component { return <>

- Connected To Repository + {i18n.t('repository.status.connected')}

diff --git a/src/pages/Task.jsx b/src/pages/Task.jsx index df4bbf90..03d62bc2 100644 --- a/src/pages/Task.jsx +++ b/src/pages/Task.jsx @@ -13,6 +13,7 @@ import Spinner from 'react-bootstrap/Spinner'; import { Logs } from '../components/Logs'; import { cancelTask, formatDuration, GoBackButton, redirect, sizeDisplayName } from '../utils/uiutil'; import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; +import i18n from '../utils/18ns' export class Task extends Component { constructor() { @@ -81,21 +82,21 @@ export class Task extends Component { switch (task.status) { case "SUCCESS": - return Task succeeded after {dur}.; + return {i18n.t('task.status.succeed.after')} {dur}.; case "FAILED": - return Error: {task.errorMessage}.; + return {i18n.t('task.status.error')}: {task.errorMessage}.; case "CANCELED": - return Task canceled.; + return {i18n.t('task.status.canceled')}.; case "CANCELING": return - Canceling {dur}: {task.progressInfo}.; + {i18n.t('task.status.canceling')} {dur}: {task.progressInfo}.; default: return - Running for {dur}: {task.progressInfo}.; + {i18n.t('task.status.running.for')} {dur}: {task.progressInfo}.; } } @@ -174,7 +175,7 @@ export class Task extends Component {

{task.status === "RUNNING" && <> -   +   }  {task.kind}: {task.description}

@@ -189,8 +190,8 @@ export class Task extends Component { - - + + @@ -202,25 +203,25 @@ export class Task extends Component { - Started + {i18n.t('task.status.started')} - Finished + {i18n.t('task.status.finished')} +
- Logs + {i18n.t('task.logs')} - ; } } Task.contextType = UIPreferencesContext \ No newline at end of file diff --git a/src/pages/Tasks.jsx b/src/pages/Tasks.jsx index 427df65a..6bc06fa9 100644 --- a/src/pages/Tasks.jsx +++ b/src/pages/Tasks.jsx @@ -13,6 +13,7 @@ import { Link } from 'react-router-dom'; import { handleChange } from '../forms'; import KopiaTable from '../utils/KopiaTable'; import { redirect, taskStatusSymbol } from '../utils/uiutil'; +import i18n from '../utils/18ns' export class Tasks extends Component { constructor() { @@ -100,25 +101,25 @@ export class Tasks extends Component { return

{error.message}

; } if (isLoading) { - return

Loading ...

; + return

{i18n.t('task.loading')}

; } const columns = [{ - Header: 'Start Time', + Header: i18n.t('task.time.start'), width: 160, accessor: x => {moment(x.startTime).fromNow()} }, { - Header: 'Status', + Header: i18n.t('task.status'), width: 240, accessor: x => taskStatusSymbol(x), }, { - Header: 'Kind', + Header: i18n.t('task.kind'), width: "", accessor: x =>

{x.kind}

, }, { - Header: 'Description', + Header: i18n.t('task.description'), width: "", accessor: x =>

{x.description}

, }] @@ -133,10 +134,10 @@ export class Tasks extends Component { Status: {this.state.showStatus} - this.setState({ showStatus: "All" })}>All + this.setState({ showStatus: "All" })}>{i18n.t('task.all')} - this.setState({ showStatus: "Running" })}>Running - this.setState({ showStatus: "Failed" })}>Failed + this.setState({ showStatus: "Running" })}>{i18n.t('task.running')} + this.setState({ showStatus: "Failed" })}>{i18n.t('task.failed')} @@ -144,7 +145,7 @@ export class Tasks extends Component { Kind: {this.state.showKind} - this.setState({ showKind: "All" })}>All + this.setState({ showKind: "All" })}>{i18n.t('task.all')} {this.state.uniqueKinds.map(k => this.setState({ showKind: k })}>{k})} diff --git a/src/tests/Preferences.test.js b/src/tests/Preferences.test.js index 2660571d..6ea6ad9b 100644 --- a/src/tests/Preferences.test.js +++ b/src/tests/Preferences.test.js @@ -2,7 +2,10 @@ import { render, screen } from '@testing-library/react' import { expect, test } from '@jest/globals'; import userEvent from "@testing-library/user-event"; import { Preferences } from '../pages/Preferences'; -const { setTheme } = jest.requireActual('../pages/Preferences'); + +import { configure } from '@testing-library/dom' +configure({ testIdAttribute: 'id' }) + // Wrapper let wrapper; @@ -22,16 +25,17 @@ describe('Calling the preference page', () => { }) }) + /** * */ describe('Select the light theme', () => { test('Should select light theme', () => { userEvent.selectOptions( - screen.getByRole('combobox', { name: "Theme" }), - screen.getByRole('option', { name: 'light' })); + screen.getByTestId('themeSelector'), + screen.getByRole('option', { name: "light" })); - expect(screen.getByRole('option', { name: 'light' }).selected).toBe(true) + expect(screen.getByRole('option', { name: "light" }).selected).toBe(true) expect(wrapper).toMatchSnapshot(); }) diff --git a/src/tests/__snapshots__/Preferences.test.js.snap b/src/tests/__snapshots__/Preferences.test.js.snap index 09741206..372e90f6 100644 --- a/src/tests/__snapshots__/Preferences.test.js.snap +++ b/src/tests/__snapshots__/Preferences.test.js.snap @@ -5,1342 +5,509 @@ Object { "asFragment": [Function], "baseElement":
-
-
- - - - The current active theme - -
-
-
- - - - Specifies the representation of bytes - -
-
-
- - - - Specifies the appearance of the user interface - -
-
-
- - - - Specifies the pagination size in tables - -
- -
- , - "container":
-
-
- - - - The current active theme - -
-
-
- - - - Specifies the representation of bytes - -
-
- - - - Specifies the appearance of the user interface - -
-
-
- - - - Specifies the pagination size in tables - -
- -
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; - -exports[`Select the light theme Should select light theme 1`] = ` -Object { - "asFragment": [Function], - "baseElement": -
-
- - - - The current active theme - + class="accordion-item" + > +

+ +

+
+
+ +
+ + + + theme.help + +
+
+
+ + + + user.interface.byte.representation.help + +
+
+
+ + + + user.interface.appearance.help + +
+
+
+ + + + user.interface.pagesize.help + +
+ +
+
-
- - - - Specifies the representation of bytes - -
-
-
- - - - Specifies the appearance of the user interface - + class="accordion-item" + > +

+ +

+
+
+
+ + + + lang.help + +
+
+
-
-
- - - - Specifies the pagination size in tables - -
- +
, "container":
-
-
- - - - The current active theme - -
-
-
- - - - Specifies the representation of bytes - -
-
+
- - - - Specifies the appearance of the user interface - -
-
-
- - - - Specifies the pagination size in tables - -
- -
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; - -exports[`Test byte representation Should have two options 1`] = ` -Object { - "asFragment": [Function], - "baseElement": -
-
-
- - - - The current active theme - -
-
-
- - - - Specifies the representation of bytes - -
-
-
- - - - Specifies the appearance of the user interface - -
-
+ user.interface + +
- - - - Specifies the pagination size in tables - + class="accordion-collapse collapse show" + > +
+ +
+ + + + theme.help + +
+
+
+ + + + user.interface.byte.representation.help + +
+
+
+ + + + user.interface.appearance.help + +
+
+
+ + + + user.interface.pagesize.help + +
+ +
- -
- , - "container":
-
-
- - - - The current active theme -
-
- - - - Specifies the representation of bytes - -
-
-
- - - - Specifies the appearance of the user interface - -
-
-
- - - - Specifies the pagination size in tables - -
- -
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; - -exports[`Test number of themes Should have four themes 1`] = ` -Object { - "asFragment": [Function], - "baseElement": -
-
-
- - - - The current active theme - -
-
-
- - - - Specifies the representation of bytes - -
-
+ user.language + +
- - - - Specifies the appearance of the user interface - + class="accordion-collapse collapse" + > +
+
+ + + + lang.help + +
+
-
-
- - - - Specifies the pagination size in tables - -
- -
- , - "container":
-
-
- - - - The current active theme - -
-
-
- - - - Specifies the representation of bytes - -
-
-
- - - - Specifies the appearance of the user interface -
-
-
- - - - Specifies the pagination size in tables - -
- +
, "debug": [Function], "findAllByAltText": [Function], From 70311c8ddc280ab53c35981624b0171b3a83ba30 Mon Sep 17 00:00:00 2001 From: lupusA Date: Fri, 8 Mar 2024 18:15:30 +0100 Subject: [PATCH 04/27] Added placeholder for polish language support --- public/locales/de-DE/translation.json | 23 ++++++- public/locales/en-GB/translation.json | 23 ++++++- public/locales/es-ES/translation.json | 23 ++++++- public/locales/fr-FR/translation.json | 23 ++++++- public/locales/it-IT/translation.json | 23 ++++++- public/locales/jp-JP/translation.json | 23 ++++++- public/locales/pl-PL/translation.json | 96 +++++++++++++++++++++++++++ public/locales/ru-RU/translation.json | 23 ++++++- src/contexts/UIPreferencesContext.tsx | 2 +- src/pages/Preferences.jsx | 1 + src/pages/Repository.jsx | 40 +++++------ 11 files changed, 266 insertions(+), 34 deletions(-) create mode 100644 public/locales/pl-PL/translation.json diff --git a/public/locales/de-DE/translation.json b/public/locales/de-DE/translation.json index ca722b1e..679ad377 100644 --- a/public/locales/de-DE/translation.json +++ b/public/locales/de-DE/translation.json @@ -29,13 +29,31 @@ "task.header.value": "Value", "repository.status.initializing": "Initializing repository...", - "repository.event.connection.cancel":"Cancel connection", "repository.status.connected": "Connected to repository", + "repository.event.connection.cancel":"Cancel connection", + "repository.event.connection.disconnect": "Disconnect from repository", + "repository.event.description.update": "Update description", + + "repository.feedback.description.required":"Repository description is required", + "repository.feedback.read.only": "Repository is read-only", + "repository.feedback.eco.disabled":"Inaktiv", + + "repository.attribute.server.url": "Server URL", + "repository.attribute.config.file": "Config file", + "repository.attribute.provider": "Provider", + "repository.attribute.algorithm.encryption": "Encryption algorithm", + "repository.attribute.algorithm.hash": "Hash algorithm", + "repository.attribute.algorithm.splitter": "Splitter algorithm", + "repository.attribute.algorithm.eco": "Error correction algorithm", + + "repository.attribute.connected.as": "Connected as", + "repository.attribute.compression.internal": "Internal compression", + "repository.attribute.format": "Repository format", + "repository.attribute.eco": "Error correction overhead", "log.event.hide": "Hide log", "log.event.show": "Show log", - "user.interface": "User interface", "user.interface.appearance":"Appearance", "user.interface.appearance.hint":"Select font size", @@ -62,6 +80,7 @@ "lang.ru": "Russian", "lang.jp": "Japanese", "lang.it": "Italian", + "lang.pl": "Polish", "lang.help": "Sets the language for the user interface", "lang.select": "Select language", diff --git a/public/locales/en-GB/translation.json b/public/locales/en-GB/translation.json index ca722b1e..e0a47f02 100644 --- a/public/locales/en-GB/translation.json +++ b/public/locales/en-GB/translation.json @@ -29,13 +29,31 @@ "task.header.value": "Value", "repository.status.initializing": "Initializing repository...", - "repository.event.connection.cancel":"Cancel connection", "repository.status.connected": "Connected to repository", + "repository.event.connection.cancel":"Cancel connection", + "repository.event.connection.disconnect": "Disconnect from repository", + "repository.event.description.update": "Update description", + + "repository.feedback.description.required":"Repository description is required", + "repository.feedback.read.only": "Repository is read-only", + "repository.feedback.eco.disabled":"Disabled", + + "repository.attribute.server.url": "Server URL", + "repository.attribute.config.file": "Config file", + "repository.attribute.provider": "Provider", + "repository.attribute.algorithm.encryption": "Encryption algorithm", + "repository.attribute.algorithm.hash": "Hash algorithm", + "repository.attribute.algorithm.splitter": "Splitter algorithm", + "repository.attribute.algorithm.eco": "Error correction algorithm", + + "repository.attribute.connected.as": "Connected as", + "repository.attribute.compression.internal": "Internal compression", + "repository.attribute.format": "Repository format", + "repository.attribute.eco": "Error correction overhead", "log.event.hide": "Hide log", "log.event.show": "Show log", - "user.interface": "User interface", "user.interface.appearance":"Appearance", "user.interface.appearance.hint":"Select font size", @@ -62,6 +80,7 @@ "lang.ru": "Russian", "lang.jp": "Japanese", "lang.it": "Italian", + "lang.pl": "Polish", "lang.help": "Sets the language for the user interface", "lang.select": "Select language", diff --git a/public/locales/es-ES/translation.json b/public/locales/es-ES/translation.json index ca722b1e..e0a47f02 100644 --- a/public/locales/es-ES/translation.json +++ b/public/locales/es-ES/translation.json @@ -29,13 +29,31 @@ "task.header.value": "Value", "repository.status.initializing": "Initializing repository...", - "repository.event.connection.cancel":"Cancel connection", "repository.status.connected": "Connected to repository", + "repository.event.connection.cancel":"Cancel connection", + "repository.event.connection.disconnect": "Disconnect from repository", + "repository.event.description.update": "Update description", + + "repository.feedback.description.required":"Repository description is required", + "repository.feedback.read.only": "Repository is read-only", + "repository.feedback.eco.disabled":"Disabled", + + "repository.attribute.server.url": "Server URL", + "repository.attribute.config.file": "Config file", + "repository.attribute.provider": "Provider", + "repository.attribute.algorithm.encryption": "Encryption algorithm", + "repository.attribute.algorithm.hash": "Hash algorithm", + "repository.attribute.algorithm.splitter": "Splitter algorithm", + "repository.attribute.algorithm.eco": "Error correction algorithm", + + "repository.attribute.connected.as": "Connected as", + "repository.attribute.compression.internal": "Internal compression", + "repository.attribute.format": "Repository format", + "repository.attribute.eco": "Error correction overhead", "log.event.hide": "Hide log", "log.event.show": "Show log", - "user.interface": "User interface", "user.interface.appearance":"Appearance", "user.interface.appearance.hint":"Select font size", @@ -62,6 +80,7 @@ "lang.ru": "Russian", "lang.jp": "Japanese", "lang.it": "Italian", + "lang.pl": "Polish", "lang.help": "Sets the language for the user interface", "lang.select": "Select language", diff --git a/public/locales/fr-FR/translation.json b/public/locales/fr-FR/translation.json index ca722b1e..e0a47f02 100644 --- a/public/locales/fr-FR/translation.json +++ b/public/locales/fr-FR/translation.json @@ -29,13 +29,31 @@ "task.header.value": "Value", "repository.status.initializing": "Initializing repository...", - "repository.event.connection.cancel":"Cancel connection", "repository.status.connected": "Connected to repository", + "repository.event.connection.cancel":"Cancel connection", + "repository.event.connection.disconnect": "Disconnect from repository", + "repository.event.description.update": "Update description", + + "repository.feedback.description.required":"Repository description is required", + "repository.feedback.read.only": "Repository is read-only", + "repository.feedback.eco.disabled":"Disabled", + + "repository.attribute.server.url": "Server URL", + "repository.attribute.config.file": "Config file", + "repository.attribute.provider": "Provider", + "repository.attribute.algorithm.encryption": "Encryption algorithm", + "repository.attribute.algorithm.hash": "Hash algorithm", + "repository.attribute.algorithm.splitter": "Splitter algorithm", + "repository.attribute.algorithm.eco": "Error correction algorithm", + + "repository.attribute.connected.as": "Connected as", + "repository.attribute.compression.internal": "Internal compression", + "repository.attribute.format": "Repository format", + "repository.attribute.eco": "Error correction overhead", "log.event.hide": "Hide log", "log.event.show": "Show log", - "user.interface": "User interface", "user.interface.appearance":"Appearance", "user.interface.appearance.hint":"Select font size", @@ -62,6 +80,7 @@ "lang.ru": "Russian", "lang.jp": "Japanese", "lang.it": "Italian", + "lang.pl": "Polish", "lang.help": "Sets the language for the user interface", "lang.select": "Select language", diff --git a/public/locales/it-IT/translation.json b/public/locales/it-IT/translation.json index ca722b1e..e0a47f02 100644 --- a/public/locales/it-IT/translation.json +++ b/public/locales/it-IT/translation.json @@ -29,13 +29,31 @@ "task.header.value": "Value", "repository.status.initializing": "Initializing repository...", - "repository.event.connection.cancel":"Cancel connection", "repository.status.connected": "Connected to repository", + "repository.event.connection.cancel":"Cancel connection", + "repository.event.connection.disconnect": "Disconnect from repository", + "repository.event.description.update": "Update description", + + "repository.feedback.description.required":"Repository description is required", + "repository.feedback.read.only": "Repository is read-only", + "repository.feedback.eco.disabled":"Disabled", + + "repository.attribute.server.url": "Server URL", + "repository.attribute.config.file": "Config file", + "repository.attribute.provider": "Provider", + "repository.attribute.algorithm.encryption": "Encryption algorithm", + "repository.attribute.algorithm.hash": "Hash algorithm", + "repository.attribute.algorithm.splitter": "Splitter algorithm", + "repository.attribute.algorithm.eco": "Error correction algorithm", + + "repository.attribute.connected.as": "Connected as", + "repository.attribute.compression.internal": "Internal compression", + "repository.attribute.format": "Repository format", + "repository.attribute.eco": "Error correction overhead", "log.event.hide": "Hide log", "log.event.show": "Show log", - "user.interface": "User interface", "user.interface.appearance":"Appearance", "user.interface.appearance.hint":"Select font size", @@ -62,6 +80,7 @@ "lang.ru": "Russian", "lang.jp": "Japanese", "lang.it": "Italian", + "lang.pl": "Polish", "lang.help": "Sets the language for the user interface", "lang.select": "Select language", diff --git a/public/locales/jp-JP/translation.json b/public/locales/jp-JP/translation.json index ca722b1e..e0a47f02 100644 --- a/public/locales/jp-JP/translation.json +++ b/public/locales/jp-JP/translation.json @@ -29,13 +29,31 @@ "task.header.value": "Value", "repository.status.initializing": "Initializing repository...", - "repository.event.connection.cancel":"Cancel connection", "repository.status.connected": "Connected to repository", + "repository.event.connection.cancel":"Cancel connection", + "repository.event.connection.disconnect": "Disconnect from repository", + "repository.event.description.update": "Update description", + + "repository.feedback.description.required":"Repository description is required", + "repository.feedback.read.only": "Repository is read-only", + "repository.feedback.eco.disabled":"Disabled", + + "repository.attribute.server.url": "Server URL", + "repository.attribute.config.file": "Config file", + "repository.attribute.provider": "Provider", + "repository.attribute.algorithm.encryption": "Encryption algorithm", + "repository.attribute.algorithm.hash": "Hash algorithm", + "repository.attribute.algorithm.splitter": "Splitter algorithm", + "repository.attribute.algorithm.eco": "Error correction algorithm", + + "repository.attribute.connected.as": "Connected as", + "repository.attribute.compression.internal": "Internal compression", + "repository.attribute.format": "Repository format", + "repository.attribute.eco": "Error correction overhead", "log.event.hide": "Hide log", "log.event.show": "Show log", - "user.interface": "User interface", "user.interface.appearance":"Appearance", "user.interface.appearance.hint":"Select font size", @@ -62,6 +80,7 @@ "lang.ru": "Russian", "lang.jp": "Japanese", "lang.it": "Italian", + "lang.pl": "Polish", "lang.help": "Sets the language for the user interface", "lang.select": "Select language", diff --git a/public/locales/pl-PL/translation.json b/public/locales/pl-PL/translation.json new file mode 100644 index 00000000..e0a47f02 --- /dev/null +++ b/public/locales/pl-PL/translation.json @@ -0,0 +1,96 @@ +{ + "tab.preferences":"Preferences", + "tab.repository":"Repository", + "tab.tasks":"Tasks", + "tab.policies":"Policies", + "tab.snapshots":"Snapshots", + + "task.all":"All", + "task.running":"Running", + "task.failed":"Failed", + "task.loading": "Loading...", + "task.time.start": "Start time", + "task.status": "Status", + "task.kind": "Kind", + "task.description": "Description", + + "task.status.succeed.after": "Task succeeded after", + "task.status.canceled": "Task canceled after", + "task.status.canceling": "Canceling", + "task.status.error": "Task error", + "task.status.running.for": "Task running for", + + "task.status.started": "Started", + "task.status.finished": "Finished", + "task.logs": "Logs", + + "task.event.stop": "Stop", + "task.header.counter": "Counter", + "task.header.value": "Value", + + "repository.status.initializing": "Initializing repository...", + "repository.status.connected": "Connected to repository", + "repository.event.connection.cancel":"Cancel connection", + "repository.event.connection.disconnect": "Disconnect from repository", + "repository.event.description.update": "Update description", + + "repository.feedback.description.required":"Repository description is required", + "repository.feedback.read.only": "Repository is read-only", + "repository.feedback.eco.disabled":"Disabled", + + "repository.attribute.server.url": "Server URL", + "repository.attribute.config.file": "Config file", + "repository.attribute.provider": "Provider", + "repository.attribute.algorithm.encryption": "Encryption algorithm", + "repository.attribute.algorithm.hash": "Hash algorithm", + "repository.attribute.algorithm.splitter": "Splitter algorithm", + "repository.attribute.algorithm.eco": "Error correction algorithm", + + "repository.attribute.connected.as": "Connected as", + "repository.attribute.compression.internal": "Internal compression", + "repository.attribute.format": "Repository format", + "repository.attribute.eco": "Error correction overhead", + + "log.event.hide": "Hide log", + "log.event.show": "Show log", + + "user.interface": "User interface", + "user.interface.appearance":"Appearance", + "user.interface.appearance.hint":"Select font size", + "user.interface.appearance.help": "Specifies the appearance of the user interface", + + "user.interface.appearance.small":"small", + "user.interface.appearance.medium":"medium", + "user.interface.appearance.large":"large", + + "user.interface.pagesize.description": "Page size", + "user.interface.pagesize.help": "Specifies the pagination size in tables", + "user.interface.pagesize.hint": "Page size", + + "user.interface.byte.representation.description":"Select byte representation", + "user.interface.byte.representation.select":"Select byte representation", + "user.interface.byte.representation.help":"Specifies the representation of bytes", + + "user.language":"Language", + + "lang.en": "English", + "lang.de": "German", + "lang.es": "Spanish", + "lang.fr": "French", + "lang.ru": "Russian", + "lang.jp": "Japanese", + "lang.it": "Italian", + "lang.pl": "Polish", + + "lang.help": "Sets the language for the user interface", + "lang.select": "Select language", + "lang.description": "Select the language", + + "theme.description": "Theme", + "theme.select": "Select theme", + "theme.help": "The current active theme", + "theme.dark":"dark", + "theme.light": "light", + "theme.pastel": "pastel", + "theme.ocean":"ocean" +} \ No newline at end of file diff --git a/public/locales/ru-RU/translation.json b/public/locales/ru-RU/translation.json index ca722b1e..e0a47f02 100644 --- a/public/locales/ru-RU/translation.json +++ b/public/locales/ru-RU/translation.json @@ -29,13 +29,31 @@ "task.header.value": "Value", "repository.status.initializing": "Initializing repository...", - "repository.event.connection.cancel":"Cancel connection", "repository.status.connected": "Connected to repository", + "repository.event.connection.cancel":"Cancel connection", + "repository.event.connection.disconnect": "Disconnect from repository", + "repository.event.description.update": "Update description", + + "repository.feedback.description.required":"Repository description is required", + "repository.feedback.read.only": "Repository is read-only", + "repository.feedback.eco.disabled":"Disabled", + + "repository.attribute.server.url": "Server URL", + "repository.attribute.config.file": "Config file", + "repository.attribute.provider": "Provider", + "repository.attribute.algorithm.encryption": "Encryption algorithm", + "repository.attribute.algorithm.hash": "Hash algorithm", + "repository.attribute.algorithm.splitter": "Splitter algorithm", + "repository.attribute.algorithm.eco": "Error correction algorithm", + + "repository.attribute.connected.as": "Connected as", + "repository.attribute.compression.internal": "Internal compression", + "repository.attribute.format": "Repository format", + "repository.attribute.eco": "Error correction overhead", "log.event.hide": "Hide log", "log.event.show": "Show log", - "user.interface": "User interface", "user.interface.appearance":"Appearance", "user.interface.appearance.hint":"Select font size", @@ -62,6 +80,7 @@ "lang.ru": "Russian", "lang.jp": "Japanese", "lang.it": "Italian", + "lang.pl": "Polish", "lang.help": "Sets the language for the user interface", "lang.select": "Select language", diff --git a/src/contexts/UIPreferencesContext.tsx b/src/contexts/UIPreferencesContext.tsx index 5d946b24..703a29e6 100644 --- a/src/contexts/UIPreferencesContext.tsx +++ b/src/contexts/UIPreferencesContext.tsx @@ -12,7 +12,7 @@ const DEFAULT_PREFERENCES = { pageSize: PAGE_SIZES[0], bytesStringBase2: false, export type Theme = "light" | "dark" | "pastel" | "ocean"; export type PageSize = 10 | 20 | 30 | 40 | 50 | 100; export type FontSize = "fs-6" | "fs-5" | "fs-4"; -export type Language = "en-GB" | "de-DE" | "es-ES" | "fr-FR" | "jp-JP" | "ru-RU" | "it-IT"; +export type Language = "en-GB" | "de-DE" | "es-ES" | "fr-FR" | "jp-JP" | "ru-RU" | "it-IT" | "pl-PL"; export interface UIPreferences { get pageSize(): PageSize diff --git a/src/pages/Preferences.jsx b/src/pages/Preferences.jsx index f718972a..c3774428 100644 --- a/src/pages/Preferences.jsx +++ b/src/pages/Preferences.jsx @@ -65,6 +65,7 @@ export function Preferences() { + diff --git a/src/pages/Repository.jsx b/src/pages/Repository.jsx index 4e87c454..56a3ca70 100644 --- a/src/pages/Repository.jsx +++ b/src/pages/Repository.jsx @@ -156,13 +156,13 @@ export class Repository extends Component { onChange={this.handleChange} size="sm" />   - + - Description Is Required + {i18n.t('repository.feedback.description.required')} {this.state.status.readonly && - Repository is read-only + {i18n.t('repository.feedback.read.only')} }
@@ -170,68 +170,71 @@ export class Repository extends Component { {this.state.status.apiServerURL ? <> - Server URL + {i18n.t('repository.attribute.server.url')}: : <> - Config File + {i18n.t('repository.attribute.config.file')}: +
- Provider + {i18n.t('repository.attribute.provider')}: - Encryption Algorithm + {i18n.t('repository.attribute.algorithm.encryption')}: - Hash Algorithm + {i18n.t('repository.attribute.algorithm.hash')}: - Splitter Algorithm + {i18n.t('repository.attribute.algorithm.splitter')}: +
- Repository Format + {i18n.t('repository.attribute.format')}: - Error Correction Overhead - 0 ? this.state.status.eccOverheadPercent + "%" : "Disabled"} /> + {i18n.t('repository.attribute.eco')}: + 0 ? this.state.status.eccOverheadPercent + "%" : i18n.t('repository.feedback.eco.disabled')} /> - Error Correction Algorithm + {i18n.t('repository.attribute.algorithm.eco')}: - Internal Compression + {i18n.t('repository.attribute.compression.internal')}: } +
- Connected as: + {i18n.t('repository.attribute.connected.as')}: -
  +
- + -   +
@@ -239,7 +242,6 @@ export class Repository extends Component { ; } - return ; } } From a26b0fd854ea93110e07ab3d290204c26e54e5fe Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Fri, 8 Mar 2024 20:53:11 -0800 Subject: [PATCH 05/27] added Polish translation --- public/locales/pl-PL/translation.json | 184 +++++++++++++------------- 1 file changed, 92 insertions(+), 92 deletions(-) diff --git a/public/locales/pl-PL/translation.json b/public/locales/pl-PL/translation.json index e0a47f02..0642adb8 100644 --- a/public/locales/pl-PL/translation.json +++ b/public/locales/pl-PL/translation.json @@ -1,96 +1,96 @@ { - "tab.preferences":"Preferences", - "tab.repository":"Repository", - "tab.tasks":"Tasks", - "tab.policies":"Policies", - "tab.snapshots":"Snapshots", - - "task.all":"All", - "task.running":"Running", - "task.failed":"Failed", - "task.loading": "Loading...", - "task.time.start": "Start time", + "tab.preferences":"Ustawienia", + "tab.repository":"Repozytorium", + "tab.tasks":"Zadania", + "tab.policies":"Konfiguracje", + "tab.snapshots":"Kopie", + + "task.all":"wszystkie", + "task.running":"w toku", + "task.failed":"nieudane", + "task.loading": "Wczytywanie...", + "task.time.start": "Początek", "task.status": "Status", - "task.kind": "Kind", - "task.description": "Description", - - "task.status.succeed.after": "Task succeeded after", - "task.status.canceled": "Task canceled after", - "task.status.canceling": "Canceling", - "task.status.error": "Task error", - "task.status.running.for": "Task running for", - - "task.status.started": "Started", - "task.status.finished": "Finished", - "task.logs": "Logs", - - "task.event.stop": "Stop", - "task.header.counter": "Counter", - "task.header.value": "Value", - - "repository.status.initializing": "Initializing repository...", - "repository.status.connected": "Connected to repository", - "repository.event.connection.cancel":"Cancel connection", - "repository.event.connection.disconnect": "Disconnect from repository", - "repository.event.description.update": "Update description", - - "repository.feedback.description.required":"Repository description is required", - "repository.feedback.read.only": "Repository is read-only", - "repository.feedback.eco.disabled":"Disabled", - - "repository.attribute.server.url": "Server URL", - "repository.attribute.config.file": "Config file", + "task.kind": "Rodzaj", + "task.description": "Opis", + + "task.status.succeed.after": "Zadanie zakończone po", + "task.status.canceled": "Zadanie anulowane po", + "task.status.canceling": "Anulowanie", + "task.status.error": "Błąd", + "task.status.running.for": "Zadanie w toku od", + + "task.status.started": "Rozpoczęte", + "task.status.finished": "Zakończone", + "task.logs": "Logi", + + "task.event.stop": "Zatrzymaj", + "task.header.counter": "Licznik", + "task.header.value": "Wartość", + + "repository.status.initializing": "Inicjalizacja w toku...", + "repository.status.connected": "Podłączone repoytorium", + "repository.event.connection.cancel":"Przerwij próbę połączenia", + "repository.event.connection.disconnect": "Odłącz od repozytorium", + "repository.event.description.update": "Zmień opis", + + "repository.feedback.description.required":"Opis jest wymagany", + "repository.feedback.read.only": "Repozytorium jest w trybie tylko do odczytu", + "repository.feedback.eco.disabled":"Brak", + + "repository.attribute.server.url": "Adres URL serwera", + "repository.attribute.config.file": "Plik konfiguracyjny", "repository.attribute.provider": "Provider", - "repository.attribute.algorithm.encryption": "Encryption algorithm", - "repository.attribute.algorithm.hash": "Hash algorithm", - "repository.attribute.algorithm.splitter": "Splitter algorithm", - "repository.attribute.algorithm.eco": "Error correction algorithm", - - "repository.attribute.connected.as": "Connected as", - "repository.attribute.compression.internal": "Internal compression", - "repository.attribute.format": "Repository format", - "repository.attribute.eco": "Error correction overhead", - - "log.event.hide": "Hide log", - "log.event.show": "Show log", - - "user.interface": "User interface", - "user.interface.appearance":"Appearance", - "user.interface.appearance.hint":"Select font size", - "user.interface.appearance.help": "Specifies the appearance of the user interface", - - "user.interface.appearance.small":"small", - "user.interface.appearance.medium":"medium", - "user.interface.appearance.large":"large", - - "user.interface.pagesize.description": "Page size", - "user.interface.pagesize.help": "Specifies the pagination size in tables", - "user.interface.pagesize.hint": "Page size", - - "user.interface.byte.representation.description":"Select byte representation", - "user.interface.byte.representation.select":"Select byte representation", - "user.interface.byte.representation.help":"Specifies the representation of bytes", - - "user.language":"Language", - - "lang.en": "English", - "lang.de": "German", - "lang.es": "Spanish", - "lang.fr": "French", - "lang.ru": "Russian", - "lang.jp": "Japanese", - "lang.it": "Italian", - "lang.pl": "Polish", - - "lang.help": "Sets the language for the user interface", - "lang.select": "Select language", - "lang.description": "Select the language", - - "theme.description": "Theme", - "theme.select": "Select theme", - "theme.help": "The current active theme", - "theme.dark":"dark", - "theme.light": "light", - "theme.pastel": "pastel", - "theme.ocean":"ocean" + "repository.attribute.algorithm.encryption": "Szyfrowanie", + "repository.attribute.algorithm.hash": "Funkcja haszująca", + "repository.attribute.algorithm.splitter": "Splitter", + "repository.attribute.algorithm.eco": "Korekcja błędów", + + "repository.attribute.connected.as": "Połączony jako", + "repository.attribute.compression.internal": "Wewnętrzna kompresja", + "repository.attribute.format": "Format repozytorium", + "repository.attribute.eco": "Narzut na korekcję błędów", + + "log.event.hide": "Schowaj log", + "log.event.show": "Pokaż log", + + "user.interface": "Interfejs użytkownika", + "user.interface.appearance":"Wielkość tekstu", + "user.interface.appearance.hint":"Rozmiar czcionki", + "user.interface.appearance.help": "Wybierz rodzaj czcionki", + + "user.interface.appearance.small":"mała", + "user.interface.appearance.medium":"średnia", + "user.interface.appearance.large":"duża", + + "user.interface.pagesize.description": "Rozmiar strony wyników", + "user.interface.pagesize.help": "Określa liczbę elementów na stronie wyników", + "user.interface.pagesize.hint": "Rozmiar strony", + + "user.interface.byte.representation.description":"Formatowanie rozmiarów plików", + "user.interface.byte.representation.select":"Wybierz sposób formatowania rozmiarów plików", + "user.interface.byte.representation.help":"Określa w jaki sposób będą wyświetlane rozmiary plików", + + "user.language":"Język", + + "lang.en": "angielski", + "lang.de": "niemiecki", + "lang.es": "hiszpański", + "lang.fr": "francuski", + "lang.ru": "rosyjski", + "lang.jp": "japoński", + "lang.it": "włoski", + "lang.pl": "polski", + + "lang.help": "Wybierz język interfejsu użytkownika", + "lang.select": "Wybierz język", + "lang.description": "Wybierz język", + + "theme.description": "Kolorystyka", + "theme.select": "Wybierz schemat kolorów", + "theme.help": "Aktywny schemat kolorów", + "theme.dark":"ciemna", + "theme.light": "jasna", + "theme.pastel": "pastelowa", + "theme.ocean":"oceaniczna" } \ No newline at end of file From 3ddce73507ccf7875bec08eb019eacc6d4990ba0 Mon Sep 17 00:00:00 2001 From: lupusA Date: Sat, 9 Mar 2024 08:01:34 +0100 Subject: [PATCH 06/27] Further working on the feature --- public/locales/de-DE/translation.json | 4 +++- public/locales/en-GB/translation.json | 2 ++ public/locales/es-ES/translation.json | 2 ++ public/locales/fr-FR/translation.json | 2 ++ public/locales/it-IT/translation.json | 2 ++ public/locales/jp-JP/translation.json | 2 ++ public/locales/pl-PL/translation.json | 2 ++ public/locales/ru-RU/translation.json | 2 ++ src/pages/Repository.jsx | 2 +- 9 files changed, 18 insertions(+), 2 deletions(-) diff --git a/public/locales/de-DE/translation.json b/public/locales/de-DE/translation.json index 679ad377..7d7b602c 100644 --- a/public/locales/de-DE/translation.json +++ b/public/locales/de-DE/translation.json @@ -36,7 +36,9 @@ "repository.feedback.description.required":"Repository description is required", "repository.feedback.read.only": "Repository is read-only", - "repository.feedback.eco.disabled":"Inaktiv", + "repository.feedback.eco.disabled":"Disabled", + "repository.feedback.compression.internal.supported": "yes", + "repository.feedback.compression.internal.not.supported": "no", "repository.attribute.server.url": "Server URL", "repository.attribute.config.file": "Config file", diff --git a/public/locales/en-GB/translation.json b/public/locales/en-GB/translation.json index e0a47f02..7d7b602c 100644 --- a/public/locales/en-GB/translation.json +++ b/public/locales/en-GB/translation.json @@ -37,6 +37,8 @@ "repository.feedback.description.required":"Repository description is required", "repository.feedback.read.only": "Repository is read-only", "repository.feedback.eco.disabled":"Disabled", + "repository.feedback.compression.internal.supported": "yes", + "repository.feedback.compression.internal.not.supported": "no", "repository.attribute.server.url": "Server URL", "repository.attribute.config.file": "Config file", diff --git a/public/locales/es-ES/translation.json b/public/locales/es-ES/translation.json index e0a47f02..7d7b602c 100644 --- a/public/locales/es-ES/translation.json +++ b/public/locales/es-ES/translation.json @@ -37,6 +37,8 @@ "repository.feedback.description.required":"Repository description is required", "repository.feedback.read.only": "Repository is read-only", "repository.feedback.eco.disabled":"Disabled", + "repository.feedback.compression.internal.supported": "yes", + "repository.feedback.compression.internal.not.supported": "no", "repository.attribute.server.url": "Server URL", "repository.attribute.config.file": "Config file", diff --git a/public/locales/fr-FR/translation.json b/public/locales/fr-FR/translation.json index e0a47f02..7d7b602c 100644 --- a/public/locales/fr-FR/translation.json +++ b/public/locales/fr-FR/translation.json @@ -37,6 +37,8 @@ "repository.feedback.description.required":"Repository description is required", "repository.feedback.read.only": "Repository is read-only", "repository.feedback.eco.disabled":"Disabled", + "repository.feedback.compression.internal.supported": "yes", + "repository.feedback.compression.internal.not.supported": "no", "repository.attribute.server.url": "Server URL", "repository.attribute.config.file": "Config file", diff --git a/public/locales/it-IT/translation.json b/public/locales/it-IT/translation.json index e0a47f02..7d7b602c 100644 --- a/public/locales/it-IT/translation.json +++ b/public/locales/it-IT/translation.json @@ -37,6 +37,8 @@ "repository.feedback.description.required":"Repository description is required", "repository.feedback.read.only": "Repository is read-only", "repository.feedback.eco.disabled":"Disabled", + "repository.feedback.compression.internal.supported": "yes", + "repository.feedback.compression.internal.not.supported": "no", "repository.attribute.server.url": "Server URL", "repository.attribute.config.file": "Config file", diff --git a/public/locales/jp-JP/translation.json b/public/locales/jp-JP/translation.json index e0a47f02..7d7b602c 100644 --- a/public/locales/jp-JP/translation.json +++ b/public/locales/jp-JP/translation.json @@ -37,6 +37,8 @@ "repository.feedback.description.required":"Repository description is required", "repository.feedback.read.only": "Repository is read-only", "repository.feedback.eco.disabled":"Disabled", + "repository.feedback.compression.internal.supported": "yes", + "repository.feedback.compression.internal.not.supported": "no", "repository.attribute.server.url": "Server URL", "repository.attribute.config.file": "Config file", diff --git a/public/locales/pl-PL/translation.json b/public/locales/pl-PL/translation.json index e0a47f02..7d7b602c 100644 --- a/public/locales/pl-PL/translation.json +++ b/public/locales/pl-PL/translation.json @@ -37,6 +37,8 @@ "repository.feedback.description.required":"Repository description is required", "repository.feedback.read.only": "Repository is read-only", "repository.feedback.eco.disabled":"Disabled", + "repository.feedback.compression.internal.supported": "yes", + "repository.feedback.compression.internal.not.supported": "no", "repository.attribute.server.url": "Server URL", "repository.attribute.config.file": "Config file", diff --git a/public/locales/ru-RU/translation.json b/public/locales/ru-RU/translation.json index e0a47f02..7d7b602c 100644 --- a/public/locales/ru-RU/translation.json +++ b/public/locales/ru-RU/translation.json @@ -37,6 +37,8 @@ "repository.feedback.description.required":"Repository description is required", "repository.feedback.read.only": "Repository is read-only", "repository.feedback.eco.disabled":"Disabled", + "repository.feedback.compression.internal.supported": "yes", + "repository.feedback.compression.internal.not.supported": "no", "repository.attribute.server.url": "Server URL", "repository.attribute.config.file": "Config file", diff --git a/src/pages/Repository.jsx b/src/pages/Repository.jsx index 56a3ca70..6947d133 100644 --- a/src/pages/Repository.jsx +++ b/src/pages/Repository.jsx @@ -216,7 +216,7 @@ export class Repository extends Component { {i18n.t('repository.attribute.compression.internal')}: - + } From 71f8262cd389153865fb235575343f98150baa51 Mon Sep 17 00:00:00 2001 From: lupusA Date: Sat, 9 Mar 2024 08:04:21 +0100 Subject: [PATCH 07/27] Integrated polish translation --- public/locales/pl-PL/translation.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/public/locales/pl-PL/translation.json b/public/locales/pl-PL/translation.json index 438dd163..ea23018a 100644 --- a/public/locales/pl-PL/translation.json +++ b/public/locales/pl-PL/translation.json @@ -37,9 +37,6 @@ "repository.feedback.description.required":"Opis jest wymagany", "repository.feedback.read.only": "Repozytorium jest w trybie tylko do odczytu", "repository.feedback.eco.disabled":"Brak", - "repository.feedback.description.required":"Repository description is required", - "repository.feedback.read.only": "Repository is read-only", - "repository.feedback.eco.disabled":"Disabled", "repository.feedback.compression.internal.supported": "yes", "repository.feedback.compression.internal.not.supported": "no", From 32a2f8ff50ae51eed2bdf32b503bc68df21607f6 Mon Sep 17 00:00:00 2001 From: lupusA Date: Sat, 9 Mar 2024 12:15:35 +0100 Subject: [PATCH 08/27] Languages are not represented in a single JSON file --- package-lock.json | 502 ++++++++++++++++++++------ package.json | 2 + public/locales/de-DE/translation.json | 69 ++-- public/locales/en-GB/translation.json | 9 - public/locales/es-ES/translation.json | 9 - public/locales/fr-FR/translation.json | 9 - public/locales/it-IT/translation.json | 9 - public/locales/jp-JP/translation.json | 9 - public/locales/pl-PL/translation.json | 9 - public/locales/ru-RU/translation.json | 9 - src/App.jsx | 4 + src/assets/languages.json | 42 +++ src/components/LanguageSelection.jsx | 31 ++ src/css/App.css | 4 + src/pages/Preferences.jsx | 107 ++---- 15 files changed, 536 insertions(+), 288 deletions(-) create mode 100644 src/assets/languages.json create mode 100644 src/components/LanguageSelection.jsx diff --git a/package-lock.json b/package-lock.json index 0c9235f3..4fb80fa3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@fortawesome/free-solid-svg-icons": "^6.5.1", "@fortawesome/react-fontawesome": "^0.2.0", "bootstrap": "^5.3.1", + "country-flag-icons": "^1.5.9", "http-proxy-middleware": "^2.0.6", "i18next": "^23.10.1", "i18next-http-backend": "^2.5.0", @@ -23,6 +24,7 @@ "react-dom": "^18.2.0", "react-i18next": "^14.1.0", "react-router-dom": "^5.3.4", + "react-select": "^5.8.0", "react-table": "^7.8.0" }, "devDependencies": { @@ -60,7 +62,6 @@ "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, "dependencies": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" @@ -73,7 +74,6 @@ "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==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -85,7 +85,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -99,7 +98,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -107,14 +105,12 @@ "node_modules/@babel/code-frame/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==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/code-frame/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==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -123,7 +119,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -132,7 +127,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -454,7 +448,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -572,7 +565,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -581,7 +573,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -628,7 +619,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -642,7 +632,6 @@ "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==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -654,7 +643,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -668,7 +656,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -676,14 +663,12 @@ "node_modules/@babel/highlight/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==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/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==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -692,7 +677,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -701,7 +685,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2166,7 +2149,6 @@ "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", @@ -2419,6 +2401,117 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", + "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "node_modules/@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -2484,6 +2577,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "dependencies": { + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, "node_modules/@fortawesome/fontawesome-common-types": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", @@ -4665,8 +4780,7 @@ "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prettier": { "version": "2.7.3", @@ -5782,7 +5896,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dev": true, "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -6175,7 +6288,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -6665,7 +6777,6 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.1" } @@ -6740,7 +6851,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -6752,6 +6862,11 @@ "node": ">=10" } }, + "node_modules/country-flag-icons": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/country-flag-icons/-/country-flag-icons-1.5.9.tgz", + "integrity": "sha512-9jrjv2w7kRbqNtdtMdK2j3gmDIZzd5l9L2pZiQjF9J0mUcB+NKIGDNADTDHBEp8EQtjOkCOcciJGGSOpERdXPQ==" + }, "node_modules/cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", @@ -7678,7 +7793,6 @@ "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, "dependencies": { "is-arrayish": "^0.2.1" } @@ -7786,7 +7900,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -8851,6 +8964,11 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -9090,8 +9208,7 @@ "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", @@ -9343,7 +9460,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" }, @@ -9784,7 +9900,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -9800,7 +9915,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -9898,8 +10012,7 @@ "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 + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -9980,7 +10093,6 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -13318,8 +13430,7 @@ "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", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema": { "version": "0.4.0", @@ -13461,8 +13572,7 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { "version": "4.3.0", @@ -13648,6 +13758,11 @@ "node": ">= 4.0.0" } }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -14321,7 +14436,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -14333,7 +14447,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -14402,8 +14515,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-to-regexp": { "version": "1.8.0", @@ -14417,7 +14529,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -17410,6 +17521,26 @@ "node": ">=10" } }, + "node_modules/react-select": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz", + "integrity": "sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-table": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.8.0.tgz", @@ -17658,7 +17789,6 @@ "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, "dependencies": { "is-core-module": "^2.8.1", "path-parse": "^1.0.7", @@ -17870,8 +18000,7 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -18589,6 +18718,11 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -18618,7 +18752,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" }, @@ -19010,7 +19143,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "engines": { "node": ">=4" } @@ -19338,6 +19470,19 @@ "requires-port": "^1.0.0" } }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -20323,7 +20468,6 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, "engines": { "node": ">= 6" } @@ -20393,7 +20537,6 @@ "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, "requires": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" @@ -20403,7 +20546,6 @@ "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==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -20412,7 +20554,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -20423,7 +20564,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -20431,26 +20571,22 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "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==", - "dev": true + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "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==", - "dev": true + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -20695,7 +20831,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -20785,14 +20920,12 @@ "@babel/helper-string-parser": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" }, "@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" }, "@babel/helper-validator-option": { "version": "7.16.7", @@ -20827,7 +20960,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -20838,7 +20970,6 @@ "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==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -20847,7 +20978,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -20858,7 +20988,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -20866,26 +20995,22 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "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==", - "dev": true + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "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==", - "dev": true + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -21875,7 +22000,6 @@ "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, "requires": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", @@ -22012,6 +22136,106 @@ "dev": true, "requires": {} }, + "@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + } + } + }, + "@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "requires": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", + "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "requires": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -22061,6 +22285,28 @@ } } }, + "@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "requires": { + "@floating-ui/utils": "^0.2.1" + } + }, + "@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "requires": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, "@fortawesome/fontawesome-common-types": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", @@ -23783,8 +24029,7 @@ "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prettier": { "version": "2.7.3", @@ -24642,7 +24887,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dev": true, "requires": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -24949,8 +25193,7 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camel-case": { "version": "4.1.2", @@ -25325,7 +25568,6 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, "requires": { "safe-buffer": "~5.1.1" } @@ -25382,7 +25624,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -25391,6 +25632,11 @@ "yaml": "^1.10.0" } }, + "country-flag-icons": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/country-flag-icons/-/country-flag-icons-1.5.9.tgz", + "integrity": "sha512-9jrjv2w7kRbqNtdtMdK2j3gmDIZzd5l9L2pZiQjF9J0mUcB+NKIGDNADTDHBEp8EQtjOkCOcciJGGSOpERdXPQ==" + }, "cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", @@ -26065,7 +26311,6 @@ "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, "requires": { "is-arrayish": "^0.2.1" } @@ -26157,8 +26402,7 @@ "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "escodegen": { "version": "2.1.0", @@ -26978,6 +27222,11 @@ "pkg-dir": "^4.1.0" } }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -27136,8 +27385,7 @@ "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==" }, "function.prototype.name": { "version": "1.1.5", @@ -27325,7 +27573,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -27656,7 +27903,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -27665,8 +27911,7 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" } } }, @@ -27742,8 +27987,7 @@ "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 + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-bigint": { "version": "1.0.4", @@ -27789,7 +28033,6 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -30496,8 +30739,7 @@ "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", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema": { "version": "0.4.0", @@ -30607,8 +30849,7 @@ "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "loader-runner": { "version": "4.3.0", @@ -30760,6 +31001,11 @@ "fs-monkey": "1.0.3" } }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -31252,7 +31498,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "requires": { "callsites": "^3.0.0" } @@ -31261,7 +31506,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -31312,8 +31556,7 @@ "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==" }, "path-to-regexp": { "version": "1.8.0", @@ -31326,8 +31569,7 @@ "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "performance-now": { "version": "2.1.0", @@ -33434,6 +33676,22 @@ } } }, + "react-select": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz", + "integrity": "sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==", + "requires": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + } + }, "react-table": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.8.0.tgz", @@ -33629,7 +33887,6 @@ "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, "requires": { "is-core-module": "^2.8.1", "path-parse": "^1.0.7", @@ -33769,8 +34026,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safer-buffer": { "version": "2.1.2", @@ -34327,6 +34583,11 @@ "postcss-selector-parser": "^6.0.4" } }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -34349,8 +34610,7 @@ "supports-preserve-symlinks-flag": { "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 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "svg-parser": { "version": "2.0.4", @@ -34651,8 +34911,7 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" }, "to-regex-range": { "version": "5.0.1", @@ -34903,6 +35162,12 @@ "requires-port": "^1.0.0" } }, + "use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "requires": {} + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -35699,8 +35964,7 @@ "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { "version": "17.7.2", diff --git a/package.json b/package.json index 363a7262..35019782 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "@fortawesome/free-solid-svg-icons": "^6.5.1", "@fortawesome/react-fontawesome": "^0.2.0", "bootstrap": "^5.3.1", + "country-flag-icons": "^1.5.9", "http-proxy-middleware": "^2.0.6", "i18next": "^23.10.1", "i18next-http-backend": "^2.5.0", @@ -17,6 +18,7 @@ "react-dom": "^18.2.0", "react-i18next": "^14.1.0", "react-router-dom": "^5.3.4", + "react-select": "^5.8.0", "react-table": "^7.8.0" }, "scripts": { diff --git a/public/locales/de-DE/translation.json b/public/locales/de-DE/translation.json index 7d7b602c..74094056 100644 --- a/public/locales/de-DE/translation.json +++ b/public/locales/de-DE/translation.json @@ -1,18 +1,18 @@ { - "tab.preferences":"Preferences", + "tab.preferences":"Einstellungen", "tab.repository":"Repository", - "tab.tasks":"Tasks", - "tab.policies":"Policies", + "tab.tasks":"Aufgaben", + "tab.policies":"Richtlinien", "tab.snapshots":"Snapshots", - "task.all":"All", + "task.all":"Alle", "task.running":"Running", - "task.failed":"Failed", + "task.failed":"Fehlgeschlagen", "task.loading": "Loading...", "task.time.start": "Start time", "task.status": "Status", - "task.kind": "Kind", - "task.description": "Description", + "task.kind": "Art", + "task.description": "Beschreibung", "task.status.succeed.after": "Task succeeded after", "task.status.canceled": "Task canceled after", @@ -20,8 +20,8 @@ "task.status.error": "Task error", "task.status.running.for": "Task running for", - "task.status.started": "Started", - "task.status.finished": "Finished", + "task.status.started": "Gestartet", + "task.status.finished": "Abgeschlossen", "task.logs": "Logs", "task.event.stop": "Stop", @@ -37,62 +37,53 @@ "repository.feedback.description.required":"Repository description is required", "repository.feedback.read.only": "Repository is read-only", "repository.feedback.eco.disabled":"Disabled", - "repository.feedback.compression.internal.supported": "yes", - "repository.feedback.compression.internal.not.supported": "no", + "repository.feedback.compression.internal.supported": "ja", + "repository.feedback.compression.internal.not.supported": "nein", "repository.attribute.server.url": "Server URL", - "repository.attribute.config.file": "Config file", - "repository.attribute.provider": "Provider", - "repository.attribute.algorithm.encryption": "Encryption algorithm", - "repository.attribute.algorithm.hash": "Hash algorithm", + "repository.attribute.config.file": "Konfigurationsdatei", + "repository.attribute.provider": "Anbieter", + "repository.attribute.algorithm.encryption": "Verschlüsselungsalgorithmus", + "repository.attribute.algorithm.hash": "Hash-Algorithmus", "repository.attribute.algorithm.splitter": "Splitter algorithm", "repository.attribute.algorithm.eco": "Error correction algorithm", - "repository.attribute.connected.as": "Connected as", - "repository.attribute.compression.internal": "Internal compression", + "repository.attribute.connected.as": "Verbunden als", + "repository.attribute.compression.internal": "Interne Kompression", "repository.attribute.format": "Repository format", "repository.attribute.eco": "Error correction overhead", "log.event.hide": "Hide log", "log.event.show": "Show log", - "user.interface": "User interface", - "user.interface.appearance":"Appearance", + "user.interface": "Benuteroberfläche", + "user.interface.appearance":"Erscheinung", "user.interface.appearance.hint":"Select font size", "user.interface.appearance.help": "Specifies the appearance of the user interface", - "user.interface.appearance.small":"small", - "user.interface.appearance.medium":"medium", - "user.interface.appearance.large":"large", + "user.interface.appearance.small":"klein", + "user.interface.appearance.medium":"mittel", + "user.interface.appearance.large":"groß", "user.interface.pagesize.description": "Page size", - "user.interface.pagesize.help": "Specifies the pagination size in tables", + "user.interface.pagesize.help": "Gibt die Anzahl der anzuzeigenden Elemente in Listen an", "user.interface.pagesize.hint": "Page size", "user.interface.byte.representation.description":"Select byte representation", "user.interface.byte.representation.select":"Select byte representation", "user.interface.byte.representation.help":"Specifies the representation of bytes", - "user.language":"Language", - - "lang.en": "English", - "lang.de": "German", - "lang.es": "Spanish", - "lang.fr": "French", - "lang.ru": "Russian", - "lang.jp": "Japanese", - "lang.it": "Italian", - "lang.pl": "Polish", + "user.language":"Sprache", "lang.help": "Sets the language for the user interface", "lang.select": "Select language", "lang.description": "Select the language", - "theme.description": "Theme", + "theme.description": "Design", "theme.select": "Select theme", - "theme.help": "The current active theme", - "theme.dark":"dark", - "theme.light": "light", - "theme.pastel": "pastel", - "theme.ocean":"ocean" + "theme.help": "Das aktuell ausgewählte Design", + "theme.dark":"Dunkel", + "theme.light": "Hell", + "theme.pastel": "Pastel", + "theme.ocean":"Ozean" } \ No newline at end of file diff --git a/public/locales/en-GB/translation.json b/public/locales/en-GB/translation.json index 7d7b602c..eea2936b 100644 --- a/public/locales/en-GB/translation.json +++ b/public/locales/en-GB/translation.json @@ -75,15 +75,6 @@ "user.language":"Language", - "lang.en": "English", - "lang.de": "German", - "lang.es": "Spanish", - "lang.fr": "French", - "lang.ru": "Russian", - "lang.jp": "Japanese", - "lang.it": "Italian", - "lang.pl": "Polish", - "lang.help": "Sets the language for the user interface", "lang.select": "Select language", "lang.description": "Select the language", diff --git a/public/locales/es-ES/translation.json b/public/locales/es-ES/translation.json index 7d7b602c..eea2936b 100644 --- a/public/locales/es-ES/translation.json +++ b/public/locales/es-ES/translation.json @@ -75,15 +75,6 @@ "user.language":"Language", - "lang.en": "English", - "lang.de": "German", - "lang.es": "Spanish", - "lang.fr": "French", - "lang.ru": "Russian", - "lang.jp": "Japanese", - "lang.it": "Italian", - "lang.pl": "Polish", - "lang.help": "Sets the language for the user interface", "lang.select": "Select language", "lang.description": "Select the language", diff --git a/public/locales/fr-FR/translation.json b/public/locales/fr-FR/translation.json index 7d7b602c..eea2936b 100644 --- a/public/locales/fr-FR/translation.json +++ b/public/locales/fr-FR/translation.json @@ -75,15 +75,6 @@ "user.language":"Language", - "lang.en": "English", - "lang.de": "German", - "lang.es": "Spanish", - "lang.fr": "French", - "lang.ru": "Russian", - "lang.jp": "Japanese", - "lang.it": "Italian", - "lang.pl": "Polish", - "lang.help": "Sets the language for the user interface", "lang.select": "Select language", "lang.description": "Select the language", diff --git a/public/locales/it-IT/translation.json b/public/locales/it-IT/translation.json index 7d7b602c..eea2936b 100644 --- a/public/locales/it-IT/translation.json +++ b/public/locales/it-IT/translation.json @@ -75,15 +75,6 @@ "user.language":"Language", - "lang.en": "English", - "lang.de": "German", - "lang.es": "Spanish", - "lang.fr": "French", - "lang.ru": "Russian", - "lang.jp": "Japanese", - "lang.it": "Italian", - "lang.pl": "Polish", - "lang.help": "Sets the language for the user interface", "lang.select": "Select language", "lang.description": "Select the language", diff --git a/public/locales/jp-JP/translation.json b/public/locales/jp-JP/translation.json index 7d7b602c..eea2936b 100644 --- a/public/locales/jp-JP/translation.json +++ b/public/locales/jp-JP/translation.json @@ -75,15 +75,6 @@ "user.language":"Language", - "lang.en": "English", - "lang.de": "German", - "lang.es": "Spanish", - "lang.fr": "French", - "lang.ru": "Russian", - "lang.jp": "Japanese", - "lang.it": "Italian", - "lang.pl": "Polish", - "lang.help": "Sets the language for the user interface", "lang.select": "Select language", "lang.description": "Select the language", diff --git a/public/locales/pl-PL/translation.json b/public/locales/pl-PL/translation.json index ea23018a..1b0c0340 100644 --- a/public/locales/pl-PL/translation.json +++ b/public/locales/pl-PL/translation.json @@ -75,15 +75,6 @@ "user.language":"Język", - "lang.en": "angielski", - "lang.de": "niemiecki", - "lang.es": "hiszpański", - "lang.fr": "francuski", - "lang.ru": "rosyjski", - "lang.jp": "japoński", - "lang.it": "włoski", - "lang.pl": "polski", - "lang.help": "Wybierz język interfejsu użytkownika", "lang.select": "Wybierz język", "lang.description": "Wybierz język", diff --git a/public/locales/ru-RU/translation.json b/public/locales/ru-RU/translation.json index 7d7b602c..eea2936b 100644 --- a/public/locales/ru-RU/translation.json +++ b/public/locales/ru-RU/translation.json @@ -75,15 +75,6 @@ "user.language":"Language", - "lang.en": "English", - "lang.de": "German", - "lang.es": "Spanish", - "lang.fr": "French", - "lang.ru": "Russian", - "lang.jp": "Japanese", - "lang.it": "Italian", - "lang.pl": "Polish", - "lang.help": "Sets the language for the user interface", "lang.select": "Select language", "lang.description": "Select the language", diff --git a/src/App.jsx b/src/App.jsx index deea4b6e..27089611 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -4,6 +4,7 @@ import './css/App.css'; import axios from 'axios'; import i18n from './utils/18ns' +import { LanguageSelection } from './components/LanguageSelection'; import { React, Component } from 'react'; import { Navbar, Nav, Container } from 'react-bootstrap'; import { BrowserRouter as Router, NavLink, Redirect, Route, Switch } from 'react-router-dom'; @@ -124,6 +125,9 @@ export default class App extends Component { {i18n.t('tab.repository')} {i18n.t('tab.preferences')} + diff --git a/src/assets/languages.json b/src/assets/languages.json new file mode 100644 index 00000000..4d8f04cc --- /dev/null +++ b/src/assets/languages.json @@ -0,0 +1,42 @@ +[ + { + "label": "English", + "code": "GB", + "value": "en-GB" + }, + { + "label": "Deutsch", + "code": "DE", + "value": "de-DE" + }, + { + "label": "Español", + "code": "ES", + "value": "es-ES" + }, + { + "label": "Français", + "code": "FR", + "value": "fr-FR" + }, + { + "label": "Русский", + "code": "RU", + "value": "ru-RU" + }, + { + "label": "日本語", + "code": "JP", + "value": "jp-JP" + }, + { + "label": "Italiano", + "code": "IT", + "value": "it-IT" + }, + { + "label": "Polski", + "code": "PL", + "value": "pl-PL" + } +] \ No newline at end of file diff --git a/src/components/LanguageSelection.jsx b/src/components/LanguageSelection.jsx new file mode 100644 index 00000000..fb8b1805 --- /dev/null +++ b/src/components/LanguageSelection.jsx @@ -0,0 +1,31 @@ +import React, { useContext } from 'react'; +import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; +import languages from '../assets/languages.json' +import Flags from 'country-flag-icons/react/3x2' +import Select, { components } from "react-select"; + +const { Option } = components; +const LanguageOption = props => { + const Flag = Flags[props.data.code]; + return <> + + +}; + + +export function LanguageSelection() { + const { language, setLanguage } = useContext(UIPreferencesContext); + return <> + + +} \ No newline at end of file diff --git a/src/css/App.css b/src/css/App.css index d75bd892..3c61deb6 100644 --- a/src/css/App.css +++ b/src/css/App.css @@ -11,6 +11,10 @@ body { color: var(--color-text-body); } +#select-language { + width: 10em; +} + #kopia .options-select { overflow: ellipsis } diff --git a/src/pages/Preferences.jsx b/src/pages/Preferences.jsx index c3774428..e1b0ea46 100644 --- a/src/pages/Preferences.jsx +++ b/src/pages/Preferences.jsx @@ -1,78 +1,51 @@ -import Accordion from 'react-bootstrap/Accordion'; -import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; import { useContext } from 'react'; import { useTranslation } from "react-i18next"; +import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; /** * Class that exports preferences */ export function Preferences() { const { t } = useTranslation(); - const { pageSize, theme, bytesStringBase2, fontSize, language, setFontSize, setByteStringBase, setTheme, setLanguage } = useContext(UIPreferencesContext); + const { pageSize, theme, bytesStringBase2, fontSize, setFontSize, setByteStringBase, setTheme } = useContext(UIPreferencesContext); return <> - - - {t('user.interface')} - -
-
- - - {t('theme.help')} -
-
-
- - - {t('user.interface.byte.representation.help')} -
-
-
- - - {t('user.interface.appearance.help')} -
-
-
- - - {t('user.interface.pagesize.help')} -
- -
-
- - {t('user.language')} - -
- - - {t('lang.help')} -
-
-
-
+
+
+ + + {t('theme.help')} +
+
+
+ + + {t('user.interface.byte.representation.help')} +
+
+
+ + + {t('user.interface.appearance.help')} +
+
+
+ + + {t('user.interface.pagesize.help')} +
+ } \ No newline at end of file From bc26ddad2737de2eb15e8b0c31189e458f33bedc Mon Sep 17 00:00:00 2001 From: lupusA Date: Sat, 9 Mar 2024 17:45:59 +0100 Subject: [PATCH 09/27] Some smaller changes --- package-lock.json | 17 ++++++++++++ package.json | 1 + public/locales/de-DE/translation.json | 12 ++++---- public/locales/es-ES/translation.json | 40 +++++++++++++-------------- src/utils/18ns.js | 8 +++++- 5 files changed, 51 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4fb80fa3..b0cf61a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "country-flag-icons": "^1.5.9", "http-proxy-middleware": "^2.0.6", "i18next": "^23.10.1", + "i18next-browser-languagedetector": "^7.2.0", "i18next-http-backend": "^2.5.0", "moment": "^2.30.1", "react": "^18.2.0", @@ -9827,6 +9828,14 @@ "@babel/runtime": "^7.23.2" } }, + "node_modules/i18next-browser-languagedetector": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.0.tgz", + "integrity": "sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, "node_modules/i18next-http-backend": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.0.tgz", @@ -27848,6 +27857,14 @@ "@babel/runtime": "^7.23.2" } }, + "i18next-browser-languagedetector": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.0.tgz", + "integrity": "sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==", + "requires": { + "@babel/runtime": "^7.23.2" + } + }, "i18next-http-backend": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.0.tgz", diff --git a/package.json b/package.json index 35019782..bff92ca3 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "country-flag-icons": "^1.5.9", "http-proxy-middleware": "^2.0.6", "i18next": "^23.10.1", + "i18next-browser-languagedetector": "^7.2.0", "i18next-http-backend": "^2.5.0", "moment": "^2.30.1", "react": "^18.2.0", diff --git a/public/locales/de-DE/translation.json b/public/locales/de-DE/translation.json index 74094056..fbcea5b7 100644 --- a/public/locales/de-DE/translation.json +++ b/public/locales/de-DE/translation.json @@ -22,16 +22,16 @@ "task.status.started": "Gestartet", "task.status.finished": "Abgeschlossen", - "task.logs": "Logs", + "task.logs": "Protokoll", "task.event.stop": "Stop", "task.header.counter": "Counter", "task.header.value": "Value", "repository.status.initializing": "Initializing repository...", - "repository.status.connected": "Connected to repository", + "repository.status.connected": "Mit Repository verbunden", "repository.event.connection.cancel":"Cancel connection", - "repository.event.connection.disconnect": "Disconnect from repository", + "repository.event.connection.disconnect": "Repository trennen", "repository.event.description.update": "Update description", "repository.feedback.description.required":"Repository description is required", @@ -65,9 +65,9 @@ "user.interface.appearance.medium":"mittel", "user.interface.appearance.large":"groß", - "user.interface.pagesize.description": "Page size", - "user.interface.pagesize.help": "Gibt die Anzahl der anzuzeigenden Elemente in Listen an", - "user.interface.pagesize.hint": "Page size", + "user.interface.pagesize.description": "Anzahl an Einträgen", + "user.interface.pagesize.help": "Gibt die Anzahl der Einträge in Listen an", + "user.interface.pagesize.hint": "Anzahl Einträge", "user.interface.byte.representation.description":"Select byte representation", "user.interface.byte.representation.select":"Select byte representation", diff --git a/public/locales/es-ES/translation.json b/public/locales/es-ES/translation.json index eea2936b..1a32b1d9 100644 --- a/public/locales/es-ES/translation.json +++ b/public/locales/es-ES/translation.json @@ -1,18 +1,18 @@ { - "tab.preferences":"Preferences", - "tab.repository":"Repository", - "tab.tasks":"Tasks", - "tab.policies":"Policies", - "tab.snapshots":"Snapshots", + "tab.preferences":"Preferencias", + "tab.repository":"Repositorio", + "tab.tasks":"Tareas", + "tab.policies":"Políticas", + "tab.snapshots":"Imágenes", "task.all":"All", "task.running":"Running", - "task.failed":"Failed", + "task.failed":"Fallido", "task.loading": "Loading...", "task.time.start": "Start time", - "task.status": "Status", + "task.status": "Estado", "task.kind": "Kind", - "task.description": "Description", + "task.description": "Descripción", "task.status.succeed.after": "Task succeeded after", "task.status.canceled": "Task canceled after", @@ -20,9 +20,9 @@ "task.status.error": "Task error", "task.status.running.for": "Task running for", - "task.status.started": "Started", - "task.status.finished": "Finished", - "task.logs": "Logs", + "task.status.started": "Comenzó", + "task.status.finished": "Terminado", + "task.logs": "Registros", "task.event.stop": "Stop", "task.header.counter": "Counter", @@ -32,23 +32,23 @@ "repository.status.connected": "Connected to repository", "repository.event.connection.cancel":"Cancel connection", "repository.event.connection.disconnect": "Disconnect from repository", - "repository.event.description.update": "Update description", + "repository.event.description.update": "Actualizar descripción", "repository.feedback.description.required":"Repository description is required", "repository.feedback.read.only": "Repository is read-only", - "repository.feedback.eco.disabled":"Disabled", + "repository.feedback.eco.disabled":"Discapacitados", "repository.feedback.compression.internal.supported": "yes", "repository.feedback.compression.internal.not.supported": "no", "repository.attribute.server.url": "Server URL", "repository.attribute.config.file": "Config file", - "repository.attribute.provider": "Provider", + "repository.attribute.provider": "Proveedor", "repository.attribute.algorithm.encryption": "Encryption algorithm", "repository.attribute.algorithm.hash": "Hash algorithm", "repository.attribute.algorithm.splitter": "Splitter algorithm", "repository.attribute.algorithm.eco": "Error correction algorithm", - "repository.attribute.connected.as": "Connected as", + "repository.attribute.connected.as": "Conectado como", "repository.attribute.compression.internal": "Internal compression", "repository.attribute.format": "Repository format", "repository.attribute.eco": "Error correction overhead", @@ -57,17 +57,17 @@ "log.event.show": "Show log", "user.interface": "User interface", - "user.interface.appearance":"Appearance", + "user.interface.appearance":"Apariencia", "user.interface.appearance.hint":"Select font size", "user.interface.appearance.help": "Specifies the appearance of the user interface", - "user.interface.appearance.small":"small", - "user.interface.appearance.medium":"medium", - "user.interface.appearance.large":"large", + "user.interface.appearance.small":"pequeño", + "user.interface.appearance.medium":"medio", + "user.interface.appearance.large":"grande", "user.interface.pagesize.description": "Page size", "user.interface.pagesize.help": "Specifies the pagination size in tables", - "user.interface.pagesize.hint": "Page size", + "user.interface.pagesize.hint": "Tamaño de página", "user.interface.byte.representation.description":"Select byte representation", "user.interface.byte.representation.select":"Select byte representation", diff --git a/src/utils/18ns.js b/src/utils/18ns.js index e3eb770a..6274a3b1 100644 --- a/src/utils/18ns.js +++ b/src/utils/18ns.js @@ -1,17 +1,23 @@ import i18n from "i18next"; import { initReactI18next } from "react-i18next"; -import backend from "i18next-http-backend"; +import languageDetector from 'i18next-browser-languagedetector'; +import backend from "i18next-http-backend" i18n .use(backend) + .use(languageDetector) .use(initReactI18next) .init({ fallbackLng: "en-GB", + deubg: true, ns: ["translation"], defaultNS: "translation", interpolation: { escapeValue: false, }, + react: { + wait: true + } }); export default i18n; \ No newline at end of file From 16619fe59545dbcf1871243ea9b8deba5f3de5b0 Mon Sep 17 00:00:00 2001 From: lupusA Date: Sun, 10 Mar 2024 08:22:29 +0100 Subject: [PATCH 10/27] Started to translate SnapshotRestore --- public/locales/de-DE/translation.json | 15 +++++++++++++ public/locales/en-GB/translation.json | 16 ++++++++++++++ src/pages/SnapshotRestore.jsx | 1 + src/pages/Snapshots.jsx | 32 ++++++++++++--------------- 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/public/locales/de-DE/translation.json b/public/locales/de-DE/translation.json index fbcea5b7..5e403c4a 100644 --- a/public/locales/de-DE/translation.json +++ b/public/locales/de-DE/translation.json @@ -28,6 +28,21 @@ "task.header.counter": "Counter", "task.header.value": "Value", + "snapshot.header.actions": "Aktionen", + "snapshot.header.status": "Status", + "snapshot.header.snapshot.next":"Nächster Snapshot", + "snapshot.header.snapshot.last":"Letzter Snapshot", + "snapshot.header.snapshot.size":"Größe", + "snapshot.header.snapshot.owner":"Eigentümer", + "snapshot.header.snapshot.path":"Pfad", + + "snapshot.event.sychronize":"Synchronisieren", + "snapshot.event.snapshot.policy": "Richtlinie", + "snapshot.event.snapshot.now": "Snapshot erstellen", + "snapshot.event.snapshot.pending": "Wartend", + "snapshot.feedback.snapshot.start": "Der Snapshot startet, sobald der vorherige abgeschlossen ist", + "snapshot.event.snapshot.new": "Neuer Snapshot", + "repository.status.initializing": "Initializing repository...", "repository.status.connected": "Mit Repository verbunden", "repository.event.connection.cancel":"Cancel connection", diff --git a/public/locales/en-GB/translation.json b/public/locales/en-GB/translation.json index eea2936b..1037b0e8 100644 --- a/public/locales/en-GB/translation.json +++ b/public/locales/en-GB/translation.json @@ -28,6 +28,22 @@ "task.header.counter": "Counter", "task.header.value": "Value", + "snapshot.header.actions": "Actions", + "snapshot.header.status": "Status", + "snapshot.header.snapshot.next":"Next Snapshot", + "snapshot.header.snapshot.last":"Last Snapshot", + "snapshot.header.snapshot.size":"Size", + "snapshot.header.snapshot.owner":"Owner", + "snapshot.header.snapshot.path":"Path", + + "snapshot.event.snapshot.now": "Snapshot Now", + "snapshot.event.snapshot.policy": "Policy", + "snapshot.event.snapshot.pending": "Pending", + "snapshot.feedback.snapshot.start": "Snapshot will start after the previous snapshot completes", + "snapshot.event.snapshot.new": "New Snapshot", + + "snapshot.event.sychronize":"Synchronize", + "repository.status.initializing": "Initializing repository...", "repository.status.connected": "Connected to repository", "repository.event.connection.cancel":"Cancel connection", diff --git a/src/pages/SnapshotRestore.jsx b/src/pages/SnapshotRestore.jsx index 1041fea0..e31de182 100644 --- a/src/pages/SnapshotRestore.jsx +++ b/src/pages/SnapshotRestore.jsx @@ -10,6 +10,7 @@ import { RequiredBoolean } from '../forms/RequiredBoolean'; import { RequiredField } from '../forms/RequiredField'; import { RequiredNumberField } from '../forms/RequiredNumberField'; import { errorAlert, GoBackButton } from '../utils/uiutil'; +import i18n from '../utils/18ns' export class SnapshotRestore extends Component { constructor(props) { diff --git a/src/pages/Snapshots.jsx b/src/pages/Snapshots.jsx index ffabeaab..9fb89af6 100644 --- a/src/pages/Snapshots.jsx +++ b/src/pages/Snapshots.jsx @@ -14,6 +14,7 @@ import { handleChange } from '../forms'; import KopiaTable from '../utils/KopiaTable'; import { CLIEquivalent, compare, errorAlert, ownerName, policyEditorURL, redirect, sizeDisplayName, sizeWithFailures, sourceQueryStringParams } from '../utils/uiutil'; import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; +import i18n from '../utils/18ns' const localSnapshots = "Local Snapshots" const allSnapshots = "All Snapshots" @@ -111,10 +112,10 @@ export class Snapshots extends Component { switch (x.cell.value) { case "IDLE": case "PAUSED": - return x.cell.column.Header = "Actions" + return x.cell.column.Header = i18n.t('snapshot.header.actions'); case "PENDING": case "UPLOADING": - return x.cell.column.Header = "Status" + return x.cell.column.Header = i18n.t('snapshot.header.status'); default: return x.cell.column.Header = "" } @@ -131,17 +132,17 @@ export class Snapshots extends Component { case "IDLE": case "PAUSED": return <> - + ; case "PENDING": return <> - -  Pending + +  {i18n.t('snapshot.event.snapshot.pending')} ; case "UPLOADING": @@ -152,13 +153,10 @@ export class Snapshots extends Component { title = " hashed " + u.hashedFiles + " files (" + sizeDisplayName(u.hashedBytes, bytesStringBase2) + ")\n" + " cached " + u.cachedFiles + " files (" + sizeDisplayName(u.cachedBytes, bytesStringBase2) + ")\n" + " dir " + u.directory; - const totalBytes = u.hashedBytes + u.cachedBytes; - totals = sizeDisplayName(totalBytes, bytesStringBase2); if (u.estimatedBytes) { totals += "/" + sizeDisplayName(u.estimatedBytes, bytesStringBase2); - const percent = Math.round(totalBytes * 1000.0 / u.estimatedBytes) / 10.0; if (percent <= 100) { totals += " " + percent + "%"; @@ -198,7 +196,6 @@ export class Snapshots extends Component { if (x.row.original.status === "PAUSED") { return "paused"; } - return ""; } @@ -248,26 +245,25 @@ export class Snapshots extends Component { const columns = [{ id: 'path', - Header: 'Path', + Header: i18n.t('snapshot.header.snapshot.path'), accessor: x => x.source, sortType: (a, b) => { const v = compare(a.original.source.path, b.original.source.path); if (v !== 0) { return v; } - return compare(ownerName(a.original.source), ownerName(b.original.source)); }, width: "", Cell: x => {x.cell.value.path}, }, { id: 'owner', - Header: 'Owner', + Header: i18n.t('snapshot.header.snapshot.owner'), accessor: x => x.source.userName + '@' + x.source.host, width: 250, }, { id: 'lastSnapshotSize', - Header: 'Size', + Header: i18n.t('snapshot.header.snapshot.size'), width: 120, accessor: x => x.lastSnapshot ? x.lastSnapshot.stats.totalSize : 0, Cell: x => sizeWithFailures( @@ -275,13 +271,13 @@ export class Snapshots extends Component { x.row.original.lastSnapshot && x.row.original.lastSnapshot.rootEntry ? x.row.original.lastSnapshot.rootEntry.summ : null, bytesStringBase2), }, { id: 'lastSnapshotTime', - Header: 'Last Snapshot', + Header: i18n.t('snapshot.header.snapshot.last'), width: 160, accessor: x => x.lastSnapshot ? x.lastSnapshot.startTime : null, Cell: x => x.cell.value ?

{moment(x.cell.value).fromNow()}

: '', }, { id: 'nextSnapshotTime', - Header: 'Next Snapshot', + Header: i18n.t('snapshot.header.snapshot.next'), width: 160, accessor: x => x.nextSnapshotTime, Cell: x => this.nextSnapshotTimeCell(x, this), @@ -311,12 +307,12 @@ export class Snapshots extends Component { }
- + - From eab290d2657178364cebe5483686303bbdac3406 Mon Sep 17 00:00:00 2001 From: lupusA Date: Sun, 10 Mar 2024 18:34:58 +0100 Subject: [PATCH 11/27] Language selection now works properly. Added some translations. --- public/locales/de-DE/translation.json | 10 +- public/locales/en-GB/translation.json | 10 +- public/locales/es-ES/translation.json | 167 ++++++++++++------------ public/locales/fr-FR/translation.json | 176 ++++++++++++------------- src/assets/languages.json | 20 +-- src/components/LanguageSelection.jsx | 13 +- src/css/App.css | 5 +- src/pages/Tasks.jsx | 177 ++++++++++++-------------- src/utils/18ns.js | 6 +- 9 files changed, 293 insertions(+), 291 deletions(-) diff --git a/public/locales/de-DE/translation.json b/public/locales/de-DE/translation.json index 5e403c4a..8ab75663 100644 --- a/public/locales/de-DE/translation.json +++ b/public/locales/de-DE/translation.json @@ -9,10 +9,12 @@ "task.running":"Running", "task.failed":"Fehlgeschlagen", "task.loading": "Loading...", - "task.time.start": "Start time", - "task.status": "Status", - "task.kind": "Art", - "task.description": "Beschreibung", + "task.header.time.start": "Startzeit", + "task.header.status": "Status", + "task.header.kind": "Art", + "task.header.description": "Beschreibung", + "task.feedback.search": "Suchen nach Einträgen per Beschreibung", + "task.feedback.entries": "Hier erscheint eine Liste von Aufgaben, sobald Snapshots, Wartungsaufgaben oder Wiederherstellungen durchgeführt werden.", "task.status.succeed.after": "Task succeeded after", "task.status.canceled": "Task canceled after", diff --git a/public/locales/en-GB/translation.json b/public/locales/en-GB/translation.json index 1037b0e8..8dfc655f 100644 --- a/public/locales/en-GB/translation.json +++ b/public/locales/en-GB/translation.json @@ -9,10 +9,12 @@ "task.running":"Running", "task.failed":"Failed", "task.loading": "Loading...", - "task.time.start": "Start time", - "task.status": "Status", - "task.kind": "Kind", - "task.description": "Description", + "task.header.time.start": "Start time", + "task.header.status": "Status", + "task.header.kind": "Kind", + "task.header.description": "Description", + "task.feedback.search": "Search logs by description", + "task.feedback.entries": "A list of tasks will appear here when you create snapshots, restore, run maintenance, etc.", "task.status.succeed.after": "Task succeeded after", "task.status.canceled": "Task canceled after", diff --git a/public/locales/es-ES/translation.json b/public/locales/es-ES/translation.json index 1a32b1d9..14e8d2aa 100644 --- a/public/locales/es-ES/translation.json +++ b/public/locales/es-ES/translation.json @@ -1,89 +1,96 @@ { - "tab.preferences":"Preferencias", - "tab.repository":"Repositorio", - "tab.tasks":"Tareas", - "tab.policies":"Políticas", - "tab.snapshots":"Imágenes", - - "task.all":"All", - "task.running":"Running", - "task.failed":"Fallido", - "task.loading": "Loading...", - "task.time.start": "Start time", - "task.status": "Estado", - "task.kind": "Kind", - "task.description": "Descripción", - - "task.status.succeed.after": "Task succeeded after", - "task.status.canceled": "Task canceled after", - "task.status.canceling": "Canceling", - "task.status.error": "Task error", - "task.status.running.for": "Task running for", - - "task.status.started": "Comenzó", - "task.status.finished": "Terminado", + "tab.preferences": "Preferencias", + "tab.repository": "Repositorio", + "tab.tasks": "Tareas", + "tab.policies": "Políticas", + "tab.snapshots": "Instantáneas", + + "task.all": "Todas", + "task.running": "En ejecución", + "task.failed": "Fallidas", + "task.loading": "Cargando...", + "task.header.time.start": "Hora de inicio", + "task.header.status": "Estado", + "task.header.kind": "Tipo", + "task.header.description": "Descripción", + "task.feedback.search": "Buscar registros por descripción", + "task.feedback.entries": "Aquí aparecerá una lista de tareas cuando crees instantáneas, restaures, ejecutes mantenimiento, etc.", + + "task.status.succeed.after": "La tarea se completó con éxito después de", + "task.status.canceled": "Tarea cancelada después de", + "task.status.canceling": "Cancelando", + "task.status.error": "Error en la tarea", + "task.status.running.for": "Tarea en ejecución durante", + "task.status.started": "Iniciada", + "task.status.finished": "Finalizada", + "task.logs": "Registros", - - "task.event.stop": "Stop", - "task.header.counter": "Counter", - "task.header.value": "Value", - - "repository.status.initializing": "Initializing repository...", - "repository.status.connected": "Connected to repository", - "repository.event.connection.cancel":"Cancel connection", - "repository.event.connection.disconnect": "Disconnect from repository", + "task.event.stop": "Detener", + "task.header.counter": "Contador", + "task.header.value": "Valor", + + "snapshot.header.actions": "Acciones", + "snapshot.header.status": "Estado", + "snapshot.header.snapshot.next": "Siguiente instantánea", + "snapshot.header.snapshot.last": "Última instantánea", + "snapshot.header.snapshot.size": "Tamaño", + "snapshot.header.snapshot.owner": "Propietario", + "snapshot.header.snapshot.path": "Ruta", + "snapshot.event.snapshot.now": "Instantánea ahora", + "snapshot.event.snapshot.policy": "Política", + "snapshot.event.snapshot.pending": "Pendiente", + "snapshot.feedback.snapshot.start": "La instantánea comenzará después de que se complete la instantánea anterior", + "snapshot.event.snapshot.new": "Nueva instantánea", + "snapshot.event.sychronize": "Sincronizar", + + "repository.status.initializing": "Inicializando el repositorio...", + "repository.status.connected": "Conectado al repositorio", + "repository.event.connection.cancel": "Cancelar conexión", + "repository.event.connection.disconnect": "Desconectar del repositorio", "repository.event.description.update": "Actualizar descripción", - - "repository.feedback.description.required":"Repository description is required", - "repository.feedback.read.only": "Repository is read-only", - "repository.feedback.eco.disabled":"Discapacitados", - "repository.feedback.compression.internal.supported": "yes", + "repository.feedback.description.required": "La descripción del repositorio es obligatoria", + "repository.feedback.read.only": "El repositorio es de solo lectura", + "repository.feedback.eco.disabled": "Deshabilitado", + "repository.feedback.compression.internal.supported": "sí", "repository.feedback.compression.internal.not.supported": "no", - - "repository.attribute.server.url": "Server URL", - "repository.attribute.config.file": "Config file", + "repository.attribute.server.url": "URL del servidor", + "repository.attribute.config.file": "Archivo de configuración", "repository.attribute.provider": "Proveedor", - "repository.attribute.algorithm.encryption": "Encryption algorithm", - "repository.attribute.algorithm.hash": "Hash algorithm", - "repository.attribute.algorithm.splitter": "Splitter algorithm", - "repository.attribute.algorithm.eco": "Error correction algorithm", - + "repository.attribute.algorithm.encryption": "Algoritmo de cifrado", + "repository.attribute.algorithm.hash": "Algoritmo de hash", + "repository.attribute.algorithm.splitter": "Algoritmo de división", + "repository.attribute.algorithm.eco": "Algoritmo de corrección de errores", "repository.attribute.connected.as": "Conectado como", - "repository.attribute.compression.internal": "Internal compression", - "repository.attribute.format": "Repository format", - "repository.attribute.eco": "Error correction overhead", - - "log.event.hide": "Hide log", - "log.event.show": "Show log", - - "user.interface": "User interface", - "user.interface.appearance":"Apariencia", - "user.interface.appearance.hint":"Select font size", - "user.interface.appearance.help": "Specifies the appearance of the user interface", - - "user.interface.appearance.small":"pequeño", - "user.interface.appearance.medium":"medio", - "user.interface.appearance.large":"grande", - - "user.interface.pagesize.description": "Page size", - "user.interface.pagesize.help": "Specifies the pagination size in tables", + "repository.attribute.compression.internal": "Compresión interna", + "repository.attribute.format": "Formato del repositorio", + "repository.attribute.eco": "Overhead de corrección de errores", + + "log.event.hide": "Ocultar registro", + "log.event.show": "Mostrar registro", + + "user.interface": "Interfaz de usuario", + "user.interface.appearance": "Apariencia", + "user.interface.appearance.hint": "Selecciona el tamaño de fuente", + "user.interface.appearance.help": "Especifica la apariencia de la interfaz de usuario", + "user.interface.appearance.small": "pequeño", + "user.interface.appearance.medium": "mediano", + "user.interface.appearance.large": "grande", + "user.interface.pagesize.description": "Tamaño de página", + "user.interface.pagesize.help": "Especifica el tamaño de paginación en las tablas", "user.interface.pagesize.hint": "Tamaño de página", - - "user.interface.byte.representation.description":"Select byte representation", - "user.interface.byte.representation.select":"Select byte representation", - "user.interface.byte.representation.help":"Specifies the representation of bytes", - - "user.language":"Language", - - "lang.help": "Sets the language for the user interface", - "lang.select": "Select language", - "lang.description": "Select the language", - - "theme.description": "Theme", - "theme.select": "Select theme", - "theme.help": "The current active theme", - "theme.dark":"dark", - "theme.light": "light", + "user.interface.byte.representation.description": "Selecciona la representación de bytes", + "user.interface.byte.representation.select": "Selecciona la representación de bytes", + "user.interface.byte.representation.help": "Especifica la representación de bytes", + "user.language": "Idioma", + + "lang.help": "Establece el idioma para la interfaz de usuario", + "lang.select": "Selecciona el idioma", + "lang.description": "Selecciona el idioma", + "theme.description": "Tema", + "theme.select": "Seleccionar tema", + "theme.help": "El tema activo actual", + "theme.dark": "oscuro", + "theme.light": "claro", "theme.pastel": "pastel", - "theme.ocean":"ocean" + "theme.ocean": "oceánico" } \ No newline at end of file diff --git a/public/locales/fr-FR/translation.json b/public/locales/fr-FR/translation.json index eea2936b..657b4909 100644 --- a/public/locales/fr-FR/translation.json +++ b/public/locales/fr-FR/translation.json @@ -1,89 +1,93 @@ { - "tab.preferences":"Preferences", - "tab.repository":"Repository", - "tab.tasks":"Tasks", - "tab.policies":"Policies", - "tab.snapshots":"Snapshots", - - "task.all":"All", - "task.running":"Running", - "task.failed":"Failed", - "task.loading": "Loading...", - "task.time.start": "Start time", - "task.status": "Status", - "task.kind": "Kind", - "task.description": "Description", - - "task.status.succeed.after": "Task succeeded after", - "task.status.canceled": "Task canceled after", - "task.status.canceling": "Canceling", - "task.status.error": "Task error", - "task.status.running.for": "Task running for", - - "task.status.started": "Started", - "task.status.finished": "Finished", - "task.logs": "Logs", - - "task.event.stop": "Stop", - "task.header.counter": "Counter", - "task.header.value": "Value", - - "repository.status.initializing": "Initializing repository...", - "repository.status.connected": "Connected to repository", - "repository.event.connection.cancel":"Cancel connection", - "repository.event.connection.disconnect": "Disconnect from repository", - "repository.event.description.update": "Update description", - - "repository.feedback.description.required":"Repository description is required", - "repository.feedback.read.only": "Repository is read-only", - "repository.feedback.eco.disabled":"Disabled", - "repository.feedback.compression.internal.supported": "yes", - "repository.feedback.compression.internal.not.supported": "no", - - "repository.attribute.server.url": "Server URL", - "repository.attribute.config.file": "Config file", - "repository.attribute.provider": "Provider", - "repository.attribute.algorithm.encryption": "Encryption algorithm", - "repository.attribute.algorithm.hash": "Hash algorithm", - "repository.attribute.algorithm.splitter": "Splitter algorithm", - "repository.attribute.algorithm.eco": "Error correction algorithm", - - "repository.attribute.connected.as": "Connected as", - "repository.attribute.compression.internal": "Internal compression", - "repository.attribute.format": "Repository format", - "repository.attribute.eco": "Error correction overhead", - - "log.event.hide": "Hide log", - "log.event.show": "Show log", - - "user.interface": "User interface", - "user.interface.appearance":"Appearance", - "user.interface.appearance.hint":"Select font size", - "user.interface.appearance.help": "Specifies the appearance of the user interface", - - "user.interface.appearance.small":"small", - "user.interface.appearance.medium":"medium", - "user.interface.appearance.large":"large", - - "user.interface.pagesize.description": "Page size", - "user.interface.pagesize.help": "Specifies the pagination size in tables", - "user.interface.pagesize.hint": "Page size", - - "user.interface.byte.representation.description":"Select byte representation", - "user.interface.byte.representation.select":"Select byte representation", - "user.interface.byte.representation.help":"Specifies the representation of bytes", - - "user.language":"Language", - - "lang.help": "Sets the language for the user interface", - "lang.select": "Select language", - "lang.description": "Select the language", - - "theme.description": "Theme", - "theme.select": "Select theme", - "theme.help": "The current active theme", - "theme.dark":"dark", - "theme.light": "light", + "tab.preferences": "Préférences", + "tab.repository": "Répertoire", + "tab.tasks": "Tâches", + "tab.policies": "Politiques", + "tab.snapshots": "Instantanés", + + "task.all": "Tous", + "task.running": "En cours", + "task.failed": "Échoué", + "task.loading": "Chargement...", + "task.header.time.start": "Heure de début", + "task.header.status": "Statut", + "task.header.kind": "Type", + "task.header.description": "Description", + "task.feedback.search": "Rechercher des journaux par description", + "task.feedback.entries": "Une liste de tâches apparaîtra ici lorsque vous créerez des instantanés, restaurerez, exécuterez des opérations de maintenance, etc.", + "task.status.succeed.after": "Tâche réussie après", + "task.status.canceled": "Tâche annulée après", + "task.status.canceling": "Annulation en cours", + "task.status.error": "Erreur de tâche", + "task.status.running.for": "Tâche en cours depuis", + "task.status.started": "Démarré", + "task.status.finished": "Terminé", + "task.logs": "Journaux", + "task.event.stop": "Arrêter", + "task.header.counter": "Compteur", + "task.header.value": "Valeur", + + "snapshot.header.actions": "Actions", + "snapshot.header.status": "Statut", + "snapshot.header.snapshot.next": "Instantané suivant", + "snapshot.header.snapshot.last": "Dernier instantané", + "snapshot.header.snapshot.size": "Taille", + "snapshot.header.snapshot.owner": "Propriétaire", + "snapshot.header.snapshot.path": "Chemin", + "snapshot.event.snapshot.now": "Instantané maintenant", + "snapshot.event.snapshot.policy": "Politique", + "snapshot.event.snapshot.pending": "En attente", + "snapshot.feedback.snapshot.start": "L'instantané démarrera après la fin de l'instantané précédent", + "snapshot.event.snapshot.new": "Nouvel instantané", + "snapshot.event.synchronize": "Synchroniser", + + "repository.status.initializing": "Initialisation du répertoire...", + "repository.status.connected": "Connecté au répertoire", + "repository.event.connection.cancel": "Annuler la connexion", + "repository.event.connection.disconnect": "Déconnexion du répertoire", + "repository.event.description.update": "Mettre à jour la description", + "repository.feedback.description.required": "La description du répertoire est obligatoire", + "repository.feedback.read.only": "Le répertoire est en lecture seule", + "repository.feedback.eco.disabled": "Désactivé", + "repository.feedback.compression.internal.supported": "oui", + "repository.feedback.compression.internal.not.supported": "non", + "repository.attribute.server.url": "URL du serveur", + "repository.attribute.config.file": "Fichier de configuration", + "repository.attribute.provider": "Fournisseur", + "repository.attribute.algorithm.encryption": "Algorithme de chiffrement", + "repository.attribute.algorithm.hash": "Algorithme de hachage", + "repository.attribute.algorithm.splitter": "Algorithme de découpage", + "repository.attribute.algorithm.eco": "Algorithme de correction d'erreurs", + "repository.attribute.connected.as": "Connecté en tant que", + "repository.attribute.compression.internal": "Compression interne", + "repository.attribute.format": "Format du répertoire", + "repository.attribute.eco": "Surcoût de correction d'erreurs", + + "log.event.hide": "Masquer le journal", + "log.event.show": "Afficher le journal", + + "user.interface": "Interface utilisateur", + "user.interface.appearance": "Apparence", + "user.interface.appearance.hint": "Sélectionnez la taille de police", + "user.interface.appearance.help": "Spécifie l'apparence de l'interface utilisateur", + "user.interface.appearance.small": "petite", + "user.interface.appearance.medium": "moyenne", + "user.interface.appearance.large": "grande", + "user.interface.pagesize.description": "Taille de la page", + "user.interface.pagesize.help": "Spécifie la taille de pagination dans les tableaux", + "user.interface.pagesize.hint": "Taille de la page", + "user.interface.byte.representation.description": "Sélectionnez la représentation des octets", + "user.interface.byte.representation.select": "Sélectionnez la représentation des octets", + "user.interface.byte.representation.help": "Spécifie la représentation des octets", + "user.language": "Langue", + + "lang.help": "Définit la langue de l'interface utilisateur", + "lang.select": "Sélectionnez la langue", + + "theme.select": "Sélectionnez un thème", + "theme.help": "Le thème actif actuel", + "theme.dark": "sombre", + "theme.light": "clair", "theme.pastel": "pastel", - "theme.ocean":"ocean" + "theme.ocean": "océan" } \ No newline at end of file diff --git a/src/assets/languages.json b/src/assets/languages.json index 4d8f04cc..43246504 100644 --- a/src/assets/languages.json +++ b/src/assets/languages.json @@ -1,42 +1,42 @@ -[ - { +{ + "en-GB": { "label": "English", "code": "GB", "value": "en-GB" }, - { + "de-DE": { "label": "Deutsch", "code": "DE", "value": "de-DE" }, - { + "es-ES": { "label": "Español", "code": "ES", "value": "es-ES" }, - { + "fr-FR": { "label": "Français", "code": "FR", "value": "fr-FR" }, - { + "ru-RU": { "label": "Русский", "code": "RU", "value": "ru-RU" }, - { + "jp-JP": { "label": "日本語", "code": "JP", "value": "jp-JP" }, - { + "it-IT": { "label": "Italiano", "code": "IT", "value": "it-IT" }, - { + "pl-PL": { "label": "Polski", "code": "PL", "value": "pl-PL" } -] \ No newline at end of file +} \ No newline at end of file diff --git a/src/components/LanguageSelection.jsx b/src/components/LanguageSelection.jsx index fb8b1805..2449dfa6 100644 --- a/src/components/LanguageSelection.jsx +++ b/src/components/LanguageSelection.jsx @@ -1,8 +1,8 @@ import React, { useContext } from 'react'; -import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; import languages from '../assets/languages.json' import Flags from 'country-flag-icons/react/3x2' import Select, { components } from "react-select"; +import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; const { Option } = components; const LanguageOption = props => { @@ -15,16 +15,19 @@ const LanguageOption = props => { }; - export function LanguageSelection() { const { language, setLanguage } = useContext(UIPreferencesContext); + const allLanguages = Object.values(languages) return <> diff --git a/src/css/App.css b/src/css/App.css index 3c61deb6..ac365323 100644 --- a/src/css/App.css +++ b/src/css/App.css @@ -12,11 +12,12 @@ body { } #select-language { - width: 10em; + width: 8em; + font-size: 90%; } #kopia .options-select { - overflow: ellipsis + overflow: ellipsis; } #kopia .btn-close { diff --git a/src/pages/Tasks.jsx b/src/pages/Tasks.jsx index 6bc06fa9..eeabc898 100644 --- a/src/pages/Tasks.jsx +++ b/src/pages/Tasks.jsx @@ -3,48 +3,48 @@ import { faInfoCircle } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import axios from 'axios'; import moment from 'moment'; -import React, { Component } from 'react'; +import React from 'react'; import Alert from 'react-bootstrap/Alert'; import Col from 'react-bootstrap/Col'; import Dropdown from 'react-bootstrap/Dropdown'; import Form from 'react-bootstrap/Form'; import Row from 'react-bootstrap/Row'; -import { Link } from 'react-router-dom'; -import { handleChange } from '../forms'; import KopiaTable from '../utils/KopiaTable'; +import { Link } from 'react-router-dom'; import { redirect, taskStatusSymbol } from '../utils/uiutil'; -import i18n from '../utils/18ns' - -export class Tasks extends Component { - constructor() { - super(); - this.state = { - items: [], - isLoading: false, - error: null, - showKind: "All", - showStatus: "All", - uniqueKinds: [], - }; - - this.handleChange = handleChange.bind(this); - this.fetchTasks = this.fetchTasks.bind(this); - this.interval = window.setInterval(this.fetchTasks, 3000); - } - - componentDidMount() { - this.setState({ - isLoading: true, +import { useTranslation } from "react-i18next"; +import { useState, useLayoutEffect, useCallback } from 'react'; + +export function Tasks() { + const [isLoading, setIsLoading] = useState(false); + const [searchDescription, setDescription] = useState("") + const [response, setResponse] = useState({ items: [], kinds: [] }); + const [kind, setKind] = useState("All"); + const [status, setStatus] = useState("All"); + const [error, setError] = useState(); + const { t } = useTranslation(); + + const fetchTasks = useCallback(() => { + axios.get('/api/v1/tasks').then(result => { + setIsLoading(false); + setResponse({ items: result.data.tasks, kinds: getUniqueKinds(result.data.tasks) }); + }).catch(error => { + redirect(error); + setError(error); + setIsLoading(false); }); + }, []) + + useLayoutEffect(() => { + setIsLoading(true) + fetchTasks() + let interval = setInterval(fetchTasks, 5000) + return () => { + window.clearInterval(interval); + }; + }, [fetchTasks]); - this.fetchTasks(); - } - - componentWillUnmount() { - window.clearInterval(this.interval); - } - - getUniqueKinds(tasks) { + function getUniqueKinds(tasks) { let o = {}; for (const tsk of tasks) { @@ -59,112 +59,97 @@ export class Tasks extends Component { return result; } - fetchTasks() { - axios.get('/api/v1/tasks').then(result => { - this.setState({ - items: result.data.tasks, - uniqueKinds: this.getUniqueKinds(result.data.tasks), - isLoading: false, - }); - }).catch(error => { - redirect(error); - this.setState({ - error, - isLoading: false - }); - }); + function handleDescription(desc) { + setDescription(desc.target.value) } - taskMatches(t) { - if (this.state.showKind !== "All" && t.kind !== this.state.showKind) { + function taskMatches(t) { + if (kind !== "All" && t.kind !== kind) { return false; } - if (this.state.showStatus !== "All" && t.status.toLowerCase() !== this.state.showStatus.toLowerCase()) { + if (status !== "All" && t.status.toLowerCase() !== status.toLowerCase()) { return false; } - if (this.state.searchDescription && t.description.indexOf(this.state.searchDescription) < 0) { + if (searchDescription && t.description.indexOf(searchDescription) < 0) { return false; } return true } - filterItems(items) { - return items.filter(c => this.taskMatches(c)) + function filterItems(items) { + return items.filter(c => taskMatches(c)) } - render() { - const { items, isLoading, error } = this.state; - if (error) { - return

{error.message}

; - } - if (isLoading) { - return

{i18n.t('task.loading')}

; - } + if (error) { + return

{error.message}

; + } + if (isLoading) { + return

{t('task.loading')}

; + } - const columns = [{ - Header: i18n.t('task.time.start'), - width: 160, - accessor: x => - {moment(x.startTime).fromNow()} - - }, { - Header: i18n.t('task.status'), - width: 240, - accessor: x => taskStatusSymbol(x), - }, { - Header: i18n.t('task.kind'), - width: "", - accessor: x =>

{x.kind}

, - }, { - Header: i18n.t('task.description'), - width: "", - accessor: x =>

{x.description}

, - }] - - const filteredItems = this.filterItems(items) - - return <> + const columns = [{ + Header: t('task.header.time.start'), + width: 160, + accessor: x => + {moment(x.startTime).fromNow()} + + }, { + Header: t('task.header.status'), + width: 240, + accessor: x => taskStatusSymbol(x), + }, { + Header: t('task.header.kind'), + width: "", + accessor: x =>

{x.kind}

, + }, { + Header: t('task.header.description'), + width: "", + accessor: x =>

{x.description}

, + }] + + const filteredItems = filterItems(response.items) + return ( + <>
- Status: {this.state.showStatus} + {t('task.header.status')}: {status} - this.setState({ showStatus: "All" })}>{i18n.t('task.all')} + setStatus("All")}>{t('task.all')} - this.setState({ showStatus: "Running" })}>{i18n.t('task.running')} - this.setState({ showStatus: "Failed" })}>{i18n.t('task.failed')} + setStatus("Running")}>{t('task.running')} + setStatus("Failed")}>{t('task.failed')} - Kind: {this.state.showKind} + {t('task.header.kind')}: {kind} - this.setState({ showKind: "All" })}>{i18n.t('task.all')} + setKind("All")}>{t('task.all')} - {this.state.uniqueKinds.map(k => this.setState({ showKind: k })}>{k})} + {response.kinds.map(kind => setKind(kind)}>{kind})} - + - {!items.length ? + {!response.items.length ? - A list of tasks will appear here when you create snapshots, restore, run maintenance, etc. + {t('task.feedback.entries')} : } - ; - } + ); } diff --git a/src/utils/18ns.js b/src/utils/18ns.js index 6274a3b1..dedb0340 100644 --- a/src/utils/18ns.js +++ b/src/utils/18ns.js @@ -9,15 +9,13 @@ i18n .use(initReactI18next) .init({ fallbackLng: "en-GB", - deubg: true, ns: ["translation"], defaultNS: "translation", interpolation: { escapeValue: false, }, - react: { - wait: true - } + react: + { useSuspense: true } }); export default i18n; \ No newline at end of file From 07d2d11628ffc9f20b25b43879b68c6f19cb0349 Mon Sep 17 00:00:00 2001 From: lupusA Date: Tue, 12 Mar 2024 20:35:03 +0100 Subject: [PATCH 12/27] i18next is now properly initialized using suspense and lazy loading --- public/locales/{de-DE => de}/translation.json | 2 +- public/locales/{en-GB => en}/translation.json | 2 +- public/locales/{es-ES => es}/translation.json | 2 +- public/locales/{fr-FR => fr}/translation.json | 0 public/locales/it-IT/translation.json | 89 --------------- public/locales/it/translation.json | 107 ++++++++++++++++++ public/locales/jp-JP/translation.json | 89 --------------- public/locales/jp/translation.json | 107 ++++++++++++++++++ public/locales/{pl-PL => pl}/translation.json | 0 public/locales/{ru-RU => ru}/translation.json | 26 ++++- src/App.jsx | 107 +++++++++--------- src/assets/languages.json | 32 +++--- src/contexts/UIPreferencesContext.tsx | 4 +- src/css/App.css | 46 +++++++- src/index.jsx | 21 +++- src/pages/Repository.jsx | 2 +- src/pages/SnapshotRestore.jsx | 2 +- src/pages/Snapshots.jsx | 8 +- src/pages/Task.jsx | 2 +- src/utils/{18ns.js => i18n.js} | 8 +- 20 files changed, 384 insertions(+), 272 deletions(-) rename public/locales/{de-DE => de}/translation.json (98%) rename public/locales/{en-GB => en}/translation.json (98%) rename public/locales/{es-ES => es}/translation.json (98%) rename public/locales/{fr-FR => fr}/translation.json (100%) delete mode 100644 public/locales/it-IT/translation.json create mode 100644 public/locales/it/translation.json delete mode 100644 public/locales/jp-JP/translation.json create mode 100644 public/locales/jp/translation.json rename public/locales/{pl-PL => pl}/translation.json (100%) rename public/locales/{ru-RU => ru}/translation.json (76%) rename src/utils/{18ns.js => i18n.js} (71%) diff --git a/public/locales/de-DE/translation.json b/public/locales/de/translation.json similarity index 98% rename from public/locales/de-DE/translation.json rename to public/locales/de/translation.json index 8ab75663..9ae7b711 100644 --- a/public/locales/de-DE/translation.json +++ b/public/locales/de/translation.json @@ -38,7 +38,7 @@ "snapshot.header.snapshot.owner":"Eigentümer", "snapshot.header.snapshot.path":"Pfad", - "snapshot.event.sychronize":"Synchronisieren", + "snapshot.event.synchronize":"Synchronisieren", "snapshot.event.snapshot.policy": "Richtlinie", "snapshot.event.snapshot.now": "Snapshot erstellen", "snapshot.event.snapshot.pending": "Wartend", diff --git a/public/locales/en-GB/translation.json b/public/locales/en/translation.json similarity index 98% rename from public/locales/en-GB/translation.json rename to public/locales/en/translation.json index 8dfc655f..8b43644f 100644 --- a/public/locales/en-GB/translation.json +++ b/public/locales/en/translation.json @@ -44,7 +44,7 @@ "snapshot.feedback.snapshot.start": "Snapshot will start after the previous snapshot completes", "snapshot.event.snapshot.new": "New Snapshot", - "snapshot.event.sychronize":"Synchronize", + "snapshot.event.synchronize":"Synchronize", "repository.status.initializing": "Initializing repository...", "repository.status.connected": "Connected to repository", diff --git a/public/locales/es-ES/translation.json b/public/locales/es/translation.json similarity index 98% rename from public/locales/es-ES/translation.json rename to public/locales/es/translation.json index 14e8d2aa..d4f491d1 100644 --- a/public/locales/es-ES/translation.json +++ b/public/locales/es/translation.json @@ -41,7 +41,7 @@ "snapshot.event.snapshot.pending": "Pendiente", "snapshot.feedback.snapshot.start": "La instantánea comenzará después de que se complete la instantánea anterior", "snapshot.event.snapshot.new": "Nueva instantánea", - "snapshot.event.sychronize": "Sincronizar", + "snapshot.event.synchronize": "Sincronizar", "repository.status.initializing": "Inicializando el repositorio...", "repository.status.connected": "Conectado al repositorio", diff --git a/public/locales/fr-FR/translation.json b/public/locales/fr/translation.json similarity index 100% rename from public/locales/fr-FR/translation.json rename to public/locales/fr/translation.json diff --git a/public/locales/it-IT/translation.json b/public/locales/it-IT/translation.json deleted file mode 100644 index eea2936b..00000000 --- a/public/locales/it-IT/translation.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "tab.preferences":"Preferences", - "tab.repository":"Repository", - "tab.tasks":"Tasks", - "tab.policies":"Policies", - "tab.snapshots":"Snapshots", - - "task.all":"All", - "task.running":"Running", - "task.failed":"Failed", - "task.loading": "Loading...", - "task.time.start": "Start time", - "task.status": "Status", - "task.kind": "Kind", - "task.description": "Description", - - "task.status.succeed.after": "Task succeeded after", - "task.status.canceled": "Task canceled after", - "task.status.canceling": "Canceling", - "task.status.error": "Task error", - "task.status.running.for": "Task running for", - - "task.status.started": "Started", - "task.status.finished": "Finished", - "task.logs": "Logs", - - "task.event.stop": "Stop", - "task.header.counter": "Counter", - "task.header.value": "Value", - - "repository.status.initializing": "Initializing repository...", - "repository.status.connected": "Connected to repository", - "repository.event.connection.cancel":"Cancel connection", - "repository.event.connection.disconnect": "Disconnect from repository", - "repository.event.description.update": "Update description", - - "repository.feedback.description.required":"Repository description is required", - "repository.feedback.read.only": "Repository is read-only", - "repository.feedback.eco.disabled":"Disabled", - "repository.feedback.compression.internal.supported": "yes", - "repository.feedback.compression.internal.not.supported": "no", - - "repository.attribute.server.url": "Server URL", - "repository.attribute.config.file": "Config file", - "repository.attribute.provider": "Provider", - "repository.attribute.algorithm.encryption": "Encryption algorithm", - "repository.attribute.algorithm.hash": "Hash algorithm", - "repository.attribute.algorithm.splitter": "Splitter algorithm", - "repository.attribute.algorithm.eco": "Error correction algorithm", - - "repository.attribute.connected.as": "Connected as", - "repository.attribute.compression.internal": "Internal compression", - "repository.attribute.format": "Repository format", - "repository.attribute.eco": "Error correction overhead", - - "log.event.hide": "Hide log", - "log.event.show": "Show log", - - "user.interface": "User interface", - "user.interface.appearance":"Appearance", - "user.interface.appearance.hint":"Select font size", - "user.interface.appearance.help": "Specifies the appearance of the user interface", - - "user.interface.appearance.small":"small", - "user.interface.appearance.medium":"medium", - "user.interface.appearance.large":"large", - - "user.interface.pagesize.description": "Page size", - "user.interface.pagesize.help": "Specifies the pagination size in tables", - "user.interface.pagesize.hint": "Page size", - - "user.interface.byte.representation.description":"Select byte representation", - "user.interface.byte.representation.select":"Select byte representation", - "user.interface.byte.representation.help":"Specifies the representation of bytes", - - "user.language":"Language", - - "lang.help": "Sets the language for the user interface", - "lang.select": "Select language", - "lang.description": "Select the language", - - "theme.description": "Theme", - "theme.select": "Select theme", - "theme.help": "The current active theme", - "theme.dark":"dark", - "theme.light": "light", - "theme.pastel": "pastel", - "theme.ocean":"ocean" -} \ No newline at end of file diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json new file mode 100644 index 00000000..75cf1413 --- /dev/null +++ b/public/locales/it/translation.json @@ -0,0 +1,107 @@ +{ + "tab.preferences": "Preferenze", + "tab.repository": "Repository", + "tab.tasks": "Attività", + "tab.policies": "Politiche", + "tab.snapshots": "Istantanee", + + "task.all": "Tutte", + "task.running": "In esecuzione", + "task.failed": "Fallite", + "task.loading": "Caricamento...", + "task.header.time.start": "Ora di inizio", + "task.header.status": "Stato", + "task.header.kind": "Tipo", + "task.header.description": "Descrizione", + "task.feedback.search": "Cerca log per descrizione", + "task.feedback.entries": "Un elenco di attività apparirà qui quando crei istantanee, ripristini, esegui manutenzione, ecc.", + + "task.status.succeed.after": "Attività completata dopo", + "task.status.canceled": "Attività annullata dopo", + "task.status.canceling": "Annullamento in corso", + "task.status.error": "Errore nell'attività", + "task.status.running.for": "Attività in esecuzione da", + + "task.status.started": "Avviata", + "task.status.finished": "Completata", + "task.logs": "Log", + + "task.event.stop": "Arresta", + "task.header.counter": "Contatore", + "task.header.value": "Valore", + + "snapshot.header.actions": "Azioni", + "snapshot.header.status": "Stato", + "snapshot.header.snapshot.next": "Prossima istantanea", + "snapshot.header.snapshot.last": "Ultima istantanea", + "snapshot.header.snapshot.size": "Dimensione", + "snapshot.header.snapshot.owner": "Proprietario", + "snapshot.header.snapshot.path": "Percorso", + + "snapshot.event.snapshot.now": "**Crea Istantanea Ora**", + "snapshot.event.snapshot.policy": "Politica", + "snapshot.event.snapshot.pending": "In attesa", + "snapshot.feedback.snapshot.start": "L'istantanea inizierà dopo il completamento dell'istantanea precedente", + "snapshot.event.snapshot.new": "Nuova Istantanea", + + "snapshot.event.synchronize":"Sincronizza", + + "repository.status.initializing": "Inizializzazione del repository...", + "repository.status.connected": "Connesso al repository", + "repository.event.connection.cancel":"Annulla connessione", + "repository.event.connection.disconnect": "Disconnetti dal repository", + "repository.event.description.update": "Aggiorna descrizione", + + "repository.feedback.description.required":"La descrizione del repository è obbligatoria", + "repository.feedback.read.only": "Il repository è in sola lettura", + "repository.feedback.eco.disabled":"Disabilitato", + "repository.feedback.compression.internal.supported": "sì", + "repository.feedback.compression.internal.not.supported": "no", + + "repository.attribute.server.url": "URL del server", + "repository.attribute.config.file": "File di configurazione", + "repository.attribute.provider": "Provider", + "repository.attribute.algorithm.encryption": "Algoritmo di crittografia", + "repository.attribute.algorithm.hash": "Algoritmo di hash", + "repository.attribute.algorithm.splitter": "Algoritmo di suddivisione", + "repository.attribute.algorithm.eco": "Algoritmo di correzione degli errori", + + "repository.attribute.connected.as": "Connesso come", + "repository.attribute.compression.internal": "Compressione interna", + "repository.attribute.format": "Formato del repository", + "repository.attribute.eco": "Overhead di correzione degli errori", + + "log.event.hide": "Nascondi log", + "log.event.show": "Mostra log", + + "user.interface": "Interfaccia utente", + "user.interface.appearance":"Aspetto", + "user.interface.appearance.hint":"Seleziona la dimensione del carattere", + "user.interface.appearance.help": "Specifica l'aspetto dell'interfaccia utente", + + "user.interface.appearance.small": "piccolo", + "user.interface.appearance.medium": "medio", + "user.interface.appearance.large": "grande", + + "user.interface.pagesize.description": "Dimensione pagina", + "user.interface.pagesize.help": "Specifica la dimensione di paginazione nelle tabelle", + "user.interface.pagesize.hint": "Dimensione pagina", + + "user.interface.byte.representation.description": "Seleziona la rappresentazione dei byte", + "user.interface.byte.representation.select": "Seleziona la rappresentazione dei byte", + "user.interface.byte.representation.help": "Specifica la rappresentazione dei byte", + + "user.language": "Lingua", + + "lang.help": "Imposta la lingua per l'interfaccia utente", + "lang.select": "Seleziona la lingua", + "lang.description": "Seleziona la lingua", + + "theme.description": "Tema", + "theme.select": "Seleziona il tema", + "theme.help": "Il tema attivo corrente", + "theme.dark": "scuro", + "theme.light": "chiaro", + "theme.pastel": "pastello", + "theme.ocean": "oceano" +} \ No newline at end of file diff --git a/public/locales/jp-JP/translation.json b/public/locales/jp-JP/translation.json deleted file mode 100644 index eea2936b..00000000 --- a/public/locales/jp-JP/translation.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "tab.preferences":"Preferences", - "tab.repository":"Repository", - "tab.tasks":"Tasks", - "tab.policies":"Policies", - "tab.snapshots":"Snapshots", - - "task.all":"All", - "task.running":"Running", - "task.failed":"Failed", - "task.loading": "Loading...", - "task.time.start": "Start time", - "task.status": "Status", - "task.kind": "Kind", - "task.description": "Description", - - "task.status.succeed.after": "Task succeeded after", - "task.status.canceled": "Task canceled after", - "task.status.canceling": "Canceling", - "task.status.error": "Task error", - "task.status.running.for": "Task running for", - - "task.status.started": "Started", - "task.status.finished": "Finished", - "task.logs": "Logs", - - "task.event.stop": "Stop", - "task.header.counter": "Counter", - "task.header.value": "Value", - - "repository.status.initializing": "Initializing repository...", - "repository.status.connected": "Connected to repository", - "repository.event.connection.cancel":"Cancel connection", - "repository.event.connection.disconnect": "Disconnect from repository", - "repository.event.description.update": "Update description", - - "repository.feedback.description.required":"Repository description is required", - "repository.feedback.read.only": "Repository is read-only", - "repository.feedback.eco.disabled":"Disabled", - "repository.feedback.compression.internal.supported": "yes", - "repository.feedback.compression.internal.not.supported": "no", - - "repository.attribute.server.url": "Server URL", - "repository.attribute.config.file": "Config file", - "repository.attribute.provider": "Provider", - "repository.attribute.algorithm.encryption": "Encryption algorithm", - "repository.attribute.algorithm.hash": "Hash algorithm", - "repository.attribute.algorithm.splitter": "Splitter algorithm", - "repository.attribute.algorithm.eco": "Error correction algorithm", - - "repository.attribute.connected.as": "Connected as", - "repository.attribute.compression.internal": "Internal compression", - "repository.attribute.format": "Repository format", - "repository.attribute.eco": "Error correction overhead", - - "log.event.hide": "Hide log", - "log.event.show": "Show log", - - "user.interface": "User interface", - "user.interface.appearance":"Appearance", - "user.interface.appearance.hint":"Select font size", - "user.interface.appearance.help": "Specifies the appearance of the user interface", - - "user.interface.appearance.small":"small", - "user.interface.appearance.medium":"medium", - "user.interface.appearance.large":"large", - - "user.interface.pagesize.description": "Page size", - "user.interface.pagesize.help": "Specifies the pagination size in tables", - "user.interface.pagesize.hint": "Page size", - - "user.interface.byte.representation.description":"Select byte representation", - "user.interface.byte.representation.select":"Select byte representation", - "user.interface.byte.representation.help":"Specifies the representation of bytes", - - "user.language":"Language", - - "lang.help": "Sets the language for the user interface", - "lang.select": "Select language", - "lang.description": "Select the language", - - "theme.description": "Theme", - "theme.select": "Select theme", - "theme.help": "The current active theme", - "theme.dark":"dark", - "theme.light": "light", - "theme.pastel": "pastel", - "theme.ocean":"ocean" -} \ No newline at end of file diff --git a/public/locales/jp/translation.json b/public/locales/jp/translation.json new file mode 100644 index 00000000..22f31804 --- /dev/null +++ b/public/locales/jp/translation.json @@ -0,0 +1,107 @@ +{ + "tab.preferences": "設定", + "tab.repository": "リポジトリ", + "tab.tasks": "タスク", + "tab.policies": "ポリシー", + "tab.snapshots": "スナップショット", + + "task.all": "すべて", + "task.running": "実行中", + "task.failed": "失敗", + "task.loading": "読み込み中...", + "task.header.time.start": "開始時刻", + "task.header.status": "ステータス", + "task.header.kind": "種類", + "task.header.description": "説明", + "task.feedback.search": "説明でログを検索", + "task.feedback.entries": "スナップショットを作成したり、復元したり、メンテナンスを実行したりすると、ここにタスクの一覧が表示されます。", + + "task.status.succeed.after": "タスクは成功しました。", + "task.status.canceled": "タスクはキャンセルされました。", + "task.status.canceling": "キャンセル中", + "task.status.error": "タスクエラー", + "task.status.running.for": "タスク実行中", + + "task.status.started": "開始済み", + "task.status.finished": "完了済み", + "task.logs": "ログ", + + "task.event.stop": "停止", + "task.header.counter": "カウンター", + "task.header.value": "値", + + "snapshot.header.actions": "アクション", + "snapshot.header.status": "ステータス", + "snapshot.header.snapshot.next": "次のスナップショット", + "snapshot.header.snapshot.last": "最後のスナップショット", + "snapshot.header.snapshot.size": "サイズ", + "snapshot.header.snapshot.owner": "オーナー", + "snapshot.header.snapshot.path": "パス", + + "snapshot.event.snapshot.now": "スナップショットを作成", + "snapshot.event.snapshot.policy": "ポリシー", + "snapshot.event.snapshot.pending": "保留中", + "snapshot.feedback.snapshot.start": "前のスナップショットが完了した後にスナップショットが開始されます", + "snapshot.event.snapshot.new": "新しいスナップショット", + + "snapshot.event.synchronize": "同期", + + "repository.status.initializing": "リポジトリの初期化中...", + "repository.status.connected": "リポジトリに接続済み", + "repository.event.connection.cancel": "接続をキャンセル", + "repository.event.connection.disconnect": "リポジトリから切断", + "repository.event.description.update": "説明を更新", + + "repository.feedback.description.required": "リポジトリの説明は必須です", + "repository.feedback.read.only": "リポジトリは読み取り専用です", + "repository.feedback.eco.disabled": "無効", + "repository.feedback.compression.internal.supported": "はい", + "repository.feedback.compression.internal.not.supported": "いいえ", + + "repository.attribute.server.url": "サーバーのURL", + "repository.attribute.config.file": "設定ファイル", + "repository.attribute.provider": "プロバイダー", + "repository.attribute.algorithm.encryption": "暗号化アルゴリズム", + "repository.attribute.algorithm.hash": "ハッシュアルゴリズム", + "repository.attribute.algorithm.splitter": "分割アルゴリズム", + "repository.attribute.algorithm.eco": "エラー訂正アルゴリズム", + + "repository.attribute.connected.as": "接続されたユーザー", + "repository.attribute.compression.internal": "内部圧縮", + "repository.attribute.format": "リポジトリの形式", + "repository.attribute.eco": "エラー訂正オーバーヘッド", + + "log.event.hide": "ログを非表示", + "log.event.show": "ログを表示", + + "user.interface": "ユーザーインターフェース", + "user.interface.appearance": "外観", + "user.interface.appearance.hint": "フォントサイズを選択", + "user.interface.appearance.help": "ユーザーインターフェースの外観を指定します", + + "user.interface.appearance.small": "小", + "user.interface.appearance.medium": "中", + "user.interface.appearance.large": "大", + + "user.interface.pagesize.description": "ページサイズ", + "user.interface.pagesize.help": "テーブルのページネーションサイズを指定します", + "user.interface.pagesize.hint": "ページサイズ", + + "user.interface.byte.representation.description": "バイトの表現を選択", + "user.interface.byte.representation.select": "バイトの表現を選択", + "user.interface.byte.representation.help": "バイトの表現を指定します", + + "user.language": "言語", + + "lang.help": "ユーザーインターフェースの言語を設定します", + "lang.select": "言語を選択", + "lang.description": "言語を選択してください", + + "theme.description": "テーマ", + "theme.select": "テーマを選択", + "theme.help": "現在のアクティブなテーマ", + "theme.dark": "ダーク", + "theme.light": "ライト", + "theme.pastel": "パステル", + "theme.ocean": "オーシャン" +} diff --git a/public/locales/pl-PL/translation.json b/public/locales/pl/translation.json similarity index 100% rename from public/locales/pl-PL/translation.json rename to public/locales/pl/translation.json diff --git a/public/locales/ru-RU/translation.json b/public/locales/ru/translation.json similarity index 76% rename from public/locales/ru-RU/translation.json rename to public/locales/ru/translation.json index eea2936b..8b43644f 100644 --- a/public/locales/ru-RU/translation.json +++ b/public/locales/ru/translation.json @@ -9,10 +9,12 @@ "task.running":"Running", "task.failed":"Failed", "task.loading": "Loading...", - "task.time.start": "Start time", - "task.status": "Status", - "task.kind": "Kind", - "task.description": "Description", + "task.header.time.start": "Start time", + "task.header.status": "Status", + "task.header.kind": "Kind", + "task.header.description": "Description", + "task.feedback.search": "Search logs by description", + "task.feedback.entries": "A list of tasks will appear here when you create snapshots, restore, run maintenance, etc.", "task.status.succeed.after": "Task succeeded after", "task.status.canceled": "Task canceled after", @@ -28,6 +30,22 @@ "task.header.counter": "Counter", "task.header.value": "Value", + "snapshot.header.actions": "Actions", + "snapshot.header.status": "Status", + "snapshot.header.snapshot.next":"Next Snapshot", + "snapshot.header.snapshot.last":"Last Snapshot", + "snapshot.header.snapshot.size":"Size", + "snapshot.header.snapshot.owner":"Owner", + "snapshot.header.snapshot.path":"Path", + + "snapshot.event.snapshot.now": "Snapshot Now", + "snapshot.event.snapshot.policy": "Policy", + "snapshot.event.snapshot.pending": "Pending", + "snapshot.feedback.snapshot.start": "Snapshot will start after the previous snapshot completes", + "snapshot.event.snapshot.new": "New Snapshot", + + "snapshot.event.synchronize":"Synchronize", + "repository.status.initializing": "Initializing repository...", "repository.status.connected": "Connected to repository", "repository.event.connection.cancel":"Cancel connection", diff --git a/src/App.jsx b/src/App.jsx index 27089611..db3ba6bb 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -2,8 +2,7 @@ import 'bootstrap/dist/css/bootstrap.min.css'; import './css/Theme.css'; import './css/App.css'; import axios from 'axios'; -import i18n from './utils/18ns' - +import i18n from './utils/i18n' import { LanguageSelection } from './components/LanguageSelection'; import { React, Component } from 'react'; import { Navbar, Nav, Container } from 'react-bootstrap'; @@ -39,7 +38,7 @@ export default class App extends Component { this.fetchInitialRepositoryDescription = this.fetchInitialRepositoryDescription.bind(this); const tok = document.head.querySelector('meta[name="kopia-csrf-token"]'); - + if (tok && tok.content) { axios.defaults.headers.common['X-Kopia-Csrf-Token'] = tok.content; } else { @@ -103,59 +102,59 @@ export default class App extends Component { render() { const { uiPrefs, runningTaskCount, isRepositoryConnected } = this.state; return ( - - - - - logo - - - - - - + + + + + logo + + + + + + - - -
{this.state.repoDescription}
-
+ + +
{this.state.repoDescription}
+
- - - - - - - - - - - - - - - - -
-
-
-
+ + + + + + + + + + + + + + + + + +
+
+
); } } diff --git a/src/assets/languages.json b/src/assets/languages.json index 43246504..776a91a2 100644 --- a/src/assets/languages.json +++ b/src/assets/languages.json @@ -1,42 +1,42 @@ { - "en-GB": { + "en": { "label": "English", "code": "GB", - "value": "en-GB" + "value": "en" }, - "de-DE": { + "de": { "label": "Deutsch", "code": "DE", - "value": "de-DE" + "value": "de" }, - "es-ES": { + "es": { "label": "Español", "code": "ES", - "value": "es-ES" + "value": "es" }, - "fr-FR": { + "fr": { "label": "Français", "code": "FR", - "value": "fr-FR" + "value": "fr" }, - "ru-RU": { + "ru": { "label": "Русский", "code": "RU", - "value": "ru-RU" + "value": "ru" }, - "jp-JP": { + "jp": { "label": "日本語", "code": "JP", - "value": "jp-JP" + "value": "jp" }, - "it-IT": { + "it": { "label": "Italiano", "code": "IT", - "value": "it-IT" + "value": "it" }, - "pl-PL": { + "pl": { "label": "Polski", "code": "PL", - "value": "pl-PL" + "value": "pl" } } \ No newline at end of file diff --git a/src/contexts/UIPreferencesContext.tsx b/src/contexts/UIPreferencesContext.tsx index 703a29e6..31620fe7 100644 --- a/src/contexts/UIPreferencesContext.tsx +++ b/src/contexts/UIPreferencesContext.tsx @@ -7,12 +7,12 @@ const PREFERENCES_URL = '/api/v1/ui-preferences'; export const PAGE_SIZES = [10, 20, 30, 40, 50, 100]; export const UIPreferencesContext = React.createContext({} as UIPreferences); -const DEFAULT_PREFERENCES = { pageSize: PAGE_SIZES[0], bytesStringBase2: false, defaultSnapshotViewAll: false, theme: getDefaultTheme(), fontSize: "fs-6", language: "en-GB" } as SerializedUIPreferences; +const DEFAULT_PREFERENCES = { pageSize: PAGE_SIZES[0], bytesStringBase2: false, defaultSnapshotViewAll: false, theme: getDefaultTheme(), fontSize: "fs-6", language: "en" } as SerializedUIPreferences; export type Theme = "light" | "dark" | "pastel" | "ocean"; export type PageSize = 10 | 20 | 30 | 40 | 50 | 100; export type FontSize = "fs-6" | "fs-5" | "fs-4"; -export type Language = "en-GB" | "de-DE" | "es-ES" | "fr-FR" | "jp-JP" | "ru-RU" | "it-IT" | "pl-PL"; +export type Language = "en" | "de" | "es" | "fr" | "jp" | "ru" | "it" | "pl"; export interface UIPreferences { get pageSize(): PageSize diff --git a/src/css/App.css b/src/css/App.css index ac365323..49502f76 100644 --- a/src/css/App.css +++ b/src/css/App.css @@ -12,7 +12,7 @@ body { } #select-language { - width: 8em; + width: 10em; font-size: 90%; } @@ -469,3 +469,47 @@ div.tab-body { #kopia li.page-item:disabled { background-color: var(--background-color) } + +#kopia .loader-container{ + position: absolute; + top: 50%; + left: 50%; + margin-top: -50px; + margin-left: -50px; + width: 100px; + height: 100px; +}​ + +#kopia .loader { + width: 48px; + height: 48px; + border-radius: 50%; + position: relative; + animation: rotate 1s linear infinite +} +#kopia .loader::before , .loader::after { + content: ""; + box-sizing: border-box; + position: absolute; + inset: 0px; + border-radius: 50%; + border: 5px solid #FFF; + animation: prixClipFix 2s linear infinite ; +} +#kopia .loader::after{ + inset: 8px; + transform: rotate3d(90, 90, 0, 180deg ); + border-color: #FF3D00; +} + +@keyframes rotate { + 0% {transform: rotate(0deg)} + 100% {transform: rotate(360deg)} +} + +@keyframes prixClipFix { + 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0,0 0,0 0)} + 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0,100% 0,100% 0)} + 75%, 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} +} + diff --git a/src/index.jsx b/src/index.jsx index 54543a8b..2b6c8739 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -1,8 +1,19 @@ -import React from 'react'; -import { createRoot } from 'react-dom/client'; -import App from './App'; +import './utils/i18n'; import './css/index.css'; -import './utils/18ns'; +import { createRoot } from 'react-dom/client'; +import React, { lazy, Suspense } from 'react'; +const App = lazy(() => import('./App')) const root = createRoot(document.getElementById('root')) -root.render(); +const loadingScreen = ( +
+ +
+) + +root.render( + + + + , + ); \ No newline at end of file diff --git a/src/pages/Repository.jsx b/src/pages/Repository.jsx index 6947d133..d3d646a7 100644 --- a/src/pages/Repository.jsx +++ b/src/pages/Repository.jsx @@ -14,7 +14,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faCheck, faChevronCircleDown, faChevronCircleUp, faWindowClose } from '@fortawesome/free-solid-svg-icons'; import { Logs } from '../components/Logs'; import { AppContext } from '../contexts/AppContext'; -import i18n from '../utils/18ns' +import i18n from '../utils/i18n' export class Repository extends Component { constructor() { diff --git a/src/pages/SnapshotRestore.jsx b/src/pages/SnapshotRestore.jsx index e31de182..64f6983a 100644 --- a/src/pages/SnapshotRestore.jsx +++ b/src/pages/SnapshotRestore.jsx @@ -10,7 +10,7 @@ import { RequiredBoolean } from '../forms/RequiredBoolean'; import { RequiredField } from '../forms/RequiredField'; import { RequiredNumberField } from '../forms/RequiredNumberField'; import { errorAlert, GoBackButton } from '../utils/uiutil'; -import i18n from '../utils/18ns' +import i18n from '../utils/i18n' export class SnapshotRestore extends Component { constructor(props) { diff --git a/src/pages/Snapshots.jsx b/src/pages/Snapshots.jsx index 9fb89af6..b5ffdad9 100644 --- a/src/pages/Snapshots.jsx +++ b/src/pages/Snapshots.jsx @@ -14,7 +14,7 @@ import { handleChange } from '../forms'; import KopiaTable from '../utils/KopiaTable'; import { CLIEquivalent, compare, errorAlert, ownerName, policyEditorURL, redirect, sizeDisplayName, sizeWithFailures, sourceQueryStringParams } from '../utils/uiutil'; import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; -import i18n from '../utils/18ns' +import i18n from '../utils/i18n' const localSnapshots = "Local Snapshots" const allSnapshots = "All Snapshots" @@ -218,7 +218,9 @@ export class Snapshots extends Component { return

{error.message}

; } if (isLoading) { - return ; + return (
+ +
); } let uniqueOwners = sources.reduce((a, d) => { const owner = ownerName(d.source); @@ -312,7 +314,7 @@ export class Snapshots extends Component {
- diff --git a/src/pages/Task.jsx b/src/pages/Task.jsx index 03d62bc2..26013be5 100644 --- a/src/pages/Task.jsx +++ b/src/pages/Task.jsx @@ -13,7 +13,7 @@ import Spinner from 'react-bootstrap/Spinner'; import { Logs } from '../components/Logs'; import { cancelTask, formatDuration, GoBackButton, redirect, sizeDisplayName } from '../utils/uiutil'; import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; -import i18n from '../utils/18ns' +import i18n from '../utils/i18n' export class Task extends Component { constructor() { diff --git a/src/utils/18ns.js b/src/utils/i18n.js similarity index 71% rename from src/utils/18ns.js rename to src/utils/i18n.js index dedb0340..90e6115c 100644 --- a/src/utils/18ns.js +++ b/src/utils/i18n.js @@ -1,14 +1,16 @@ import i18n from "i18next"; import { initReactI18next } from "react-i18next"; -import languageDetector from 'i18next-browser-languagedetector'; +import LanguageDetector from 'i18next-browser-languagedetector'; import backend from "i18next-http-backend" i18n .use(backend) - .use(languageDetector) + .use(LanguageDetector) .use(initReactI18next) .init({ - fallbackLng: "en-GB", + lng: "en", + fallbackLng: "en", + debug: true, ns: ["translation"], defaultNS: "translation", interpolation: { From de5d777f96a1c35e86b32fffb6bfba36dea56d15 Mon Sep 17 00:00:00 2001 From: lupusA Date: Tue, 12 Mar 2024 21:22:41 +0100 Subject: [PATCH 13/27] Some minor changes --- public/locales/ru/translation.json | 212 ++++++++++++++--------------- src/App.jsx | 102 +++++++------- src/utils/i18n.js | 5 +- 3 files changed, 160 insertions(+), 159 deletions(-) diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index 8b43644f..1145d1f7 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -1,107 +1,107 @@ { - "tab.preferences":"Preferences", - "tab.repository":"Repository", - "tab.tasks":"Tasks", - "tab.policies":"Policies", - "tab.snapshots":"Snapshots", - - "task.all":"All", - "task.running":"Running", - "task.failed":"Failed", - "task.loading": "Loading...", - "task.header.time.start": "Start time", - "task.header.status": "Status", - "task.header.kind": "Kind", - "task.header.description": "Description", - "task.feedback.search": "Search logs by description", - "task.feedback.entries": "A list of tasks will appear here when you create snapshots, restore, run maintenance, etc.", - - "task.status.succeed.after": "Task succeeded after", - "task.status.canceled": "Task canceled after", - "task.status.canceling": "Canceling", - "task.status.error": "Task error", - "task.status.running.for": "Task running for", - - "task.status.started": "Started", - "task.status.finished": "Finished", - "task.logs": "Logs", - - "task.event.stop": "Stop", - "task.header.counter": "Counter", - "task.header.value": "Value", - - "snapshot.header.actions": "Actions", - "snapshot.header.status": "Status", - "snapshot.header.snapshot.next":"Next Snapshot", - "snapshot.header.snapshot.last":"Last Snapshot", - "snapshot.header.snapshot.size":"Size", - "snapshot.header.snapshot.owner":"Owner", - "snapshot.header.snapshot.path":"Path", - - "snapshot.event.snapshot.now": "Snapshot Now", - "snapshot.event.snapshot.policy": "Policy", - "snapshot.event.snapshot.pending": "Pending", - "snapshot.feedback.snapshot.start": "Snapshot will start after the previous snapshot completes", - "snapshot.event.snapshot.new": "New Snapshot", - - "snapshot.event.synchronize":"Synchronize", - - "repository.status.initializing": "Initializing repository...", - "repository.status.connected": "Connected to repository", - "repository.event.connection.cancel":"Cancel connection", - "repository.event.connection.disconnect": "Disconnect from repository", - "repository.event.description.update": "Update description", - - "repository.feedback.description.required":"Repository description is required", - "repository.feedback.read.only": "Repository is read-only", - "repository.feedback.eco.disabled":"Disabled", - "repository.feedback.compression.internal.supported": "yes", - "repository.feedback.compression.internal.not.supported": "no", - - "repository.attribute.server.url": "Server URL", - "repository.attribute.config.file": "Config file", - "repository.attribute.provider": "Provider", - "repository.attribute.algorithm.encryption": "Encryption algorithm", - "repository.attribute.algorithm.hash": "Hash algorithm", - "repository.attribute.algorithm.splitter": "Splitter algorithm", - "repository.attribute.algorithm.eco": "Error correction algorithm", - - "repository.attribute.connected.as": "Connected as", - "repository.attribute.compression.internal": "Internal compression", - "repository.attribute.format": "Repository format", - "repository.attribute.eco": "Error correction overhead", - - "log.event.hide": "Hide log", - "log.event.show": "Show log", - - "user.interface": "User interface", - "user.interface.appearance":"Appearance", - "user.interface.appearance.hint":"Select font size", - "user.interface.appearance.help": "Specifies the appearance of the user interface", - - "user.interface.appearance.small":"small", - "user.interface.appearance.medium":"medium", - "user.interface.appearance.large":"large", - - "user.interface.pagesize.description": "Page size", - "user.interface.pagesize.help": "Specifies the pagination size in tables", - "user.interface.pagesize.hint": "Page size", - - "user.interface.byte.representation.description":"Select byte representation", - "user.interface.byte.representation.select":"Select byte representation", - "user.interface.byte.representation.help":"Specifies the representation of bytes", - - "user.language":"Language", - - "lang.help": "Sets the language for the user interface", - "lang.select": "Select language", - "lang.description": "Select the language", - - "theme.description": "Theme", - "theme.select": "Select theme", - "theme.help": "The current active theme", - "theme.dark":"dark", - "theme.light": "light", - "theme.pastel": "pastel", - "theme.ocean":"ocean" -} \ No newline at end of file + "tab.preferences": "Настройки", + "tab.repository": "Репозиторий", + "tab.tasks": "Задачи", + "tab.policies": "Политики", + "tab.snapshots": "Снимки", + + "task.all": "Все", + "task.running": "Выполняются", + "task.failed": "Не удалось", + "task.loading": "Загрузка...", + "task.header.time.start": "Время начала", + "task.header.status": "Статус", + "task.header.kind": "Тип", + "task.header.description": "Описание", + "task.feedback.search": "Поиск по описанию", + "task.feedback.entries": "Список задач появится здесь при создании снимков, восстановлении, выполнении обслуживания и т. д.", + + "task.status.succeed.after": "Задача успешно завершена после", + "task.status.canceled": "Задача отменена после", + "task.status.canceling": "Отмена", + "task.status.error": "Ошибка задачи", + "task.status.running.for": "Задача выполняется в течение", + + "task.status.started": "Начало", + "task.status.finished": "Завершено", + "task.logs": "Логи", + + "task.event.stop": "Остановить", + "task.header.counter": "Счетчик", + "task.header.value": "Значение", + + "snapshot.header.actions": "Действия", + "snapshot.header.status": "Статус", + "snapshot.header.snapshot.next": "Следующий снимок", + "snapshot.header.snapshot.last": "Последний снимок", + "snapshot.header.snapshot.size": "Размер", + "snapshot.header.snapshot.owner": "Владелец", + "snapshot.header.snapshot.path": "Путь", + + "snapshot.event.snapshot.now": "Сделать снимок сейчас", + "snapshot.event.snapshot.policy": "Политика", + "snapshot.event.snapshot.pending": "Ожидание", + "snapshot.feedback.snapshot.start": "Снимок начнется после завершения предыдущего снимка", + "snapshot.event.snapshot.new": "Новый снимок", + + "snapshot.event.synchronize": "Синхронизировать", + + "repository.status.initializing": "Инициализация репозитория...", + "repository.status.connected": "Подключено к репозиторию", + "repository.event.connection.cancel": "Отменить подключение", + "repository.event.connection.disconnect": "Отключиться от репозитория", + "repository.event.description.update": "Обновить описание", + + "repository.feedback.description.required": "Требуется описание репозитория", + "repository.feedback.read.only": "Репозиторий доступен только для чтения", + "repository.feedback.eco.disabled": "Отключено", + "repository.feedback.compression.internal.supported": "да", + "repository.feedback.compression.internal.not.supported": "нет", + + "repository.attribute.server.url": "URL сервера", + "repository.attribute.config.file": "Файл конфигурации", + "repository.attribute.provider": "Поставщик", + "repository.attribute.algorithm.encryption": "Алгоритм шифрования", + "repository.attribute.algorithm.hash": "Алгоритм хеширования", + "repository.attribute.algorithm.splitter": "Алгоритм разделения", + "repository.attribute.algorithm.eco": "Алгоритм коррекции ошибок", + + "repository.attribute.connected.as": "Подключено как", + "repository.attribute.compression.internal": "Внутреннее сжатие", + "repository.attribute.format": "Формат репозитория", + "repository.attribute.eco": "Коррекция ошибок", + + "log.event.hide": "Скрыть лог", + "log.event.show": "Показать лог", + + "user.interface": "Пользовательский интерфейс", + "user.interface.appearance":"Внешний вид", + "user.interface.appearance.hint":"Выберите размер шрифта", + "user.interface.appearance.help": "Определяет внешний вид пользовательского интерфейса", + + "user.interface.appearance.small":"маленький", + "user.interface.appearance.medium":"средний", + "user.interface.appearance.large":"большой", + + "user.interface.pagesize.description": "Размер страницы", + "user.interface.pagesize.help": "Определяет размер страницы в таблицах", + "user.interface.pagesize.hint": "Размер страницы", + + "user.interface.byte.representation.description":"Выберите представление байта", + "user.interface.byte.representation.select":"Выберите представление байта", + "user.interface.byte.representation.help":"Определяет представление байтов", + + "user.language":"Язык", + + "lang.help": "Устанавливает язык пользовательского интерфейса", + "lang.select": "Выберите язык", + "lang.description": "Выберите язык", + + "theme.description": "Тема", + "theme.select": "Выберите тему", + "theme.help": "Текущая активная тема", + "theme.dark":"темная", + "theme.light": "светлая", + "theme.pastel": "пастельная", + "theme.ocean":"морская" +} diff --git a/src/App.jsx b/src/App.jsx index db3ba6bb..cd159c1c 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -102,59 +102,59 @@ export default class App extends Component { render() { const { uiPrefs, runningTaskCount, isRepositoryConnected } = this.state; return ( - - - - - logo - - - - - - + + + + + logo + + + + + + - - -
{this.state.repoDescription}
-
+ + +
{this.state.repoDescription}
+
- - - - - - - - - - - - - - - - -
-
-
-
+ + + + + + + + + + + + + + + + + +
+
+
); } } diff --git a/src/utils/i18n.js b/src/utils/i18n.js index 90e6115c..6c09172e 100644 --- a/src/utils/i18n.js +++ b/src/utils/i18n.js @@ -10,14 +10,15 @@ i18n .init({ lng: "en", fallbackLng: "en", - debug: true, ns: ["translation"], defaultNS: "translation", interpolation: { escapeValue: false, }, react: - { useSuspense: true } + { + useSuspense: true + } }); export default i18n; \ No newline at end of file From 9c97dc9f2cff9ec1653645789ca31f7a7a93731e Mon Sep 17 00:00:00 2001 From: lupusA Date: Wed, 13 Mar 2024 20:25:45 +0100 Subject: [PATCH 14/27] Translated SnapshotRestore --- public/locales/de/translation.json | 25 + public/locales/en/translation.json | 25 + public/locales/es/translation.json | 35 +- public/locales/fr/translation.json | 25 + public/locales/it/translation.json | 27 +- public/locales/jp/translation.json | 25 + public/locales/pl/translation.json | 25 + public/locales/ru/translation.json | 25 + src/pages/Policy.jsx | 41 +- src/pages/SnapshotRestore.jsx | 49 +- .../__snapshots__/Preferences.test.js.snap | 734 +++++++----------- src/utils/uiutil.jsx | 3 +- 12 files changed, 510 insertions(+), 529 deletions(-) diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 9ae7b711..34d3a1ec 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -5,6 +5,8 @@ "tab.policies":"Richtlinien", "tab.snapshots":"Snapshots", + "common.return": "Zurück", + "task.all":"Alle", "task.running":"Running", "task.failed":"Fehlgeschlagen", @@ -45,6 +47,29 @@ "snapshot.feedback.snapshot.start": "Der Snapshot startet, sobald der vorherige abgeschlossen ist", "snapshot.event.snapshot.new": "Neuer Snapshot", + "snapshot.event.restore.task.go": "Go To Restore Task", + "snapshot.event.restore":"Restore", + "snapshot.feedback.restore.destination": "Destination", + "snapshot.feedback.restore.destination.path":"Enter destination path", + "snapshot.feedback.restore.destination.help": "You can also restore to a .zip or .tar file by providing the appropriate extension.", + "snapshot.feedback.restore.skip": "Skip previously restored files and symlinks", + "snapshot.feedback.restore.continue.errors": "Continue on errors", + "snapshot.feedback.restore.continue.errors.help": "When a restore error occurs, attempt to continue instead of failing fast.", + "snapshot.feedback.restore.file.ownership": "Restore file ownership", + "snapshot.feedback.restore.file.permission": "Restore file permissions", + "snapshot.feedback.restore.file.modification.time": "Restore file modification time", + "snapshot.feedback.restore.file.overwrite": "Overwrite files", + "snapshot.feedback.restore.directory.overwrite": "Overwrite directories", + "snapshot.feedback.restore.link.overwrite": "Overwrite symbolic links", + "snapshot.feedback.restore.file.atomically": "Write files atomically", + "snapshot.feedback.restore.file.sparse":"Write sparse files", + + "snapshot.feedback.restore.shallow.depth": "Shallow restore at depth", + "snapshot.feedback.restore.shallow.file.size.minimal": "Minimal file size for shallow restore", + "snapshot.feedback.restore.disable.compression.zip": "Disable ZIP compression", + "snapshot.feedback.restore.disable.compression.zip.help": "Do not compress when restoring to a ZIP file (faster).", + "snapshot.event.restore.begin":"Begin restore", + "repository.status.initializing": "Initializing repository...", "repository.status.connected": "Mit Repository verbunden", "repository.event.connection.cancel":"Cancel connection", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 8b43644f..2950b2df 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -5,6 +5,8 @@ "tab.policies":"Policies", "tab.snapshots":"Snapshots", + "common.return": "Return", + "task.all":"All", "task.running":"Running", "task.failed":"Failed", @@ -46,6 +48,29 @@ "snapshot.event.synchronize":"Synchronize", + "snapshot.event.restore.task.go": "Go To Restore Task", + "snapshot.event.restore":"Restore", + "snapshot.feedback.restore.destination": "Destination", + "snapshot.feedback.restore.destination.path":"Enter destination path", + "snapshot.feedback.restore.destination.help": "You can also restore to a .zip or .tar file by providing the appropriate extension.", + "snapshot.feedback.restore.skip": "Skip previously restored files and symlinks", + "snapshot.feedback.restore.continue.errors": "Continue on errors", + "snapshot.feedback.restore.continue.errors.help": "When a restore error occurs, attempt to continue instead of failing fast.", + "snapshot.feedback.restore.file.ownership": "Restore file ownership", + "snapshot.feedback.restore.file.permission": "Restore file permissions", + "snapshot.feedback.restore.file.modification.time": "Restore file modification time", + "snapshot.feedback.restore.file.overwrite": "Overwrite files", + "snapshot.feedback.restore.directory.overwrite": "Overwrite directories", + "snapshot.feedback.restore.link.overwrite": "Overwrite symbolic links", + "snapshot.feedback.restore.file.atomically": "Write files atomically", + "snapshot.feedback.restore.file.sparse":"Write sparse files", + + "snapshot.feedback.restore.shallow.depth": "Shallow restore at depth", + "snapshot.feedback.restore.shallow.file.size.minimal": "Minimal file size for shallow restore", + "snapshot.feedback.restore.disable.compression.zip": "Disable ZIP compression", + "snapshot.feedback.restore.disable.compression.zip.help": "Do not compress when restoring to a ZIP file (faster).", + "snapshot.event.restore.begin":"Begin restore", + "repository.status.initializing": "Initializing repository...", "repository.status.connected": "Connected to repository", "repository.event.connection.cancel":"Cancel connection", diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index d4f491d1..2e7c0be2 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -1,9 +1,11 @@ { "tab.preferences": "Preferencias", - "tab.repository": "Repositorio", + "tab.repository": "Depósito", "tab.tasks": "Tareas", "tab.policies": "Políticas", - "tab.snapshots": "Instantáneas", + "tab.snapshots": "Copias de respaldo", + + "common.return": "Volver", "task.all": "Todas", "task.running": "En ejecución", @@ -34,7 +36,7 @@ "snapshot.header.snapshot.next": "Siguiente instantánea", "snapshot.header.snapshot.last": "Última instantánea", "snapshot.header.snapshot.size": "Tamaño", - "snapshot.header.snapshot.owner": "Propietario", + "snapshot.header.snapshot.owner": "Dueño", "snapshot.header.snapshot.path": "Ruta", "snapshot.event.snapshot.now": "Instantánea ahora", "snapshot.event.snapshot.policy": "Política", @@ -42,6 +44,29 @@ "snapshot.feedback.snapshot.start": "La instantánea comenzará después de que se complete la instantánea anterior", "snapshot.event.snapshot.new": "Nueva instantánea", "snapshot.event.synchronize": "Sincronizar", + + "snapshot.event.restore.task.go": "Ir a la tarea de restauración", + "snapshot.event.restore": "Restaurar", + "snapshot.feedback.restore.destination": "Destino", + "snapshot.feedback.restore.destination.path": "Introducir la ruta de destino", + "snapshot.feedback.restore.destination.help": "También puedes restaurar a un archivo .zip o .tar proporcionando la extensión adecuada.", + "snapshot.feedback.restore.skip": "Saltar archivos y enlaces simbólicos restaurados previamente", + "snapshot.feedback.restore.continue.errors": "Continuar en caso de errores", + "snapshot.feedback.restore.continue.errors.help": "Cuando se produce un error durante la restauración, intenta continuar en lugar de detenerse rápidamente.", + "snapshot.feedback.restore.file.ownership": "Restaurar propiedad de archivos", + "snapshot.feedback.restore.file.permission": "Restaurar permisos de archivos", + "snapshot.feedback.restore.file.modification.time": "Restaurar hora de modificación de archivos", + "snapshot.feedback.restore.file.overwrite": "Sobrescribir archivos", + "snapshot.feedback.restore.directory.overwrite": "Sobrescribir directorios", + "snapshot.feedback.restore.link.overwrite": "Sobrescribir enlaces simbólicos", + "snapshot.feedback.restore.file.atomically": "Escribir archivos atómicamente", + "snapshot.feedback.restore.file.sparse": "Escribir archivos dispersos", + + "snapshot.feedback.restore.shallow.depth": "Restauración superficial a una profundidad específica", + "snapshot.feedback.restore.shallow.file.size.minimal": "Tamaño mínimo de archivo para restauración superficial", + "snapshot.feedback.restore.disable.compression.zip": "Desactivar compresión ZIP", + "snapshot.feedback.restore.disable.compression.zip.help": "No comprimir al restaurar en un archivo ZIP (más rápido).", + "snapshot.event.restore.begin": "Comenzar la restauración", "repository.status.initializing": "Inicializando el repositorio...", "repository.status.connected": "Conectado al repositorio", @@ -49,7 +74,7 @@ "repository.event.connection.disconnect": "Desconectar del repositorio", "repository.event.description.update": "Actualizar descripción", "repository.feedback.description.required": "La descripción del repositorio es obligatoria", - "repository.feedback.read.only": "El repositorio es de solo lectura", + "repository.feedback.read.only": "El repositorio es de sólo lectura", "repository.feedback.eco.disabled": "Deshabilitado", "repository.feedback.compression.internal.supported": "sí", "repository.feedback.compression.internal.not.supported": "no", @@ -70,7 +95,7 @@ "user.interface": "Interfaz de usuario", "user.interface.appearance": "Apariencia", - "user.interface.appearance.hint": "Selecciona el tamaño de fuente", + "user.interface.appearance.hint": "Selecciona el tamaño de letra", "user.interface.appearance.help": "Especifica la apariencia de la interfaz de usuario", "user.interface.appearance.small": "pequeño", "user.interface.appearance.medium": "mediano", diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 657b4909..1d7148bc 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -5,6 +5,8 @@ "tab.policies": "Politiques", "tab.snapshots": "Instantanés", + "common.return": "Retour", + "task.all": "Tous", "task.running": "En cours", "task.failed": "Échoué", @@ -41,6 +43,29 @@ "snapshot.event.snapshot.new": "Nouvel instantané", "snapshot.event.synchronize": "Synchroniser", + "snapshot.event.restore.task.go": "Aller à la tâche de restauration", + "snapshot.event.restore": "Restaurer", + "snapshot.feedback.restore.destination": "Destination", + "snapshot.feedback.restore.destination.path": "Entrez le chemin de destination", + "snapshot.feedback.restore.destination.help": "Vous pouvez également restaurer vers un fichier .zip ou .tar en fournissant l'extension appropriée.", + "snapshot.feedback.restore.skip": "Ignorer les fichiers et liens symboliques déjà restaurés", + "snapshot.feedback.restore.continue.errors": "Continuer en cas d'erreurs", + "snapshot.feedback.restore.continue.errors.help": "Lorsqu'une erreur de restauration se produit, essayez de continuer au lieu d'échouer rapidement.", + "snapshot.feedback.restore.file.ownership": "Restaurer la propriété des fichiers", + "snapshot.feedback.restore.file.permission": "Restaurer les permissions des fichiers", + "snapshot.feedback.restore.file.modification.time": "Restaurer l'heure de modification des fichiers", + "snapshot.feedback.restore.file.overwrite": "Écraser les fichiers", + "snapshot.feedback.restore.directory.overwrite": "Écraser les répertoires", + "snapshot.feedback.restore.link.overwrite": "Écraser les liens symboliques", + "snapshot.feedback.restore.file.atomically": "Écrire les fichiers de manière atomique", + "snapshot.feedback.restore.file.sparse": "Écrire les fichiers en mode sparse", + + "snapshot.feedback.restore.shallow.depth": "Restauration superficielle à une profondeur spécifique", + "snapshot.feedback.restore.shallow.file.size.minimal": "Taille minimale des fichiers pour une restauration superficielle", + "snapshot.feedback.restore.disable.compression.zip": "Désactiver la compression ZIP", + "snapshot.feedback.restore.disable.compression.zip.help": "Ne pas compresser lors de la restauration vers un fichier ZIP (plus rapide).", + "snapshot.event.restore.begin": "Démarrer la restauration", + "repository.status.initializing": "Initialisation du répertoire...", "repository.status.connected": "Connecté au répertoire", "repository.event.connection.cancel": "Annuler la connexion", diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index 75cf1413..51831fba 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -5,6 +5,8 @@ "tab.policies": "Politiche", "tab.snapshots": "Istantanee", + "common.return": "Ritorno", + "task.all": "Tutte", "task.running": "In esecuzione", "task.failed": "Fallite", @@ -38,7 +40,7 @@ "snapshot.header.snapshot.owner": "Proprietario", "snapshot.header.snapshot.path": "Percorso", - "snapshot.event.snapshot.now": "**Crea Istantanea Ora**", + "snapshot.event.snapshot.now": "Crea Istantanea Ora", "snapshot.event.snapshot.policy": "Politica", "snapshot.event.snapshot.pending": "In attesa", "snapshot.feedback.snapshot.start": "L'istantanea inizierà dopo il completamento dell'istantanea precedente", @@ -46,6 +48,29 @@ "snapshot.event.synchronize":"Sincronizza", + "snapshot.event.restore.task.go": "Vai alla task di ripristino", + "snapshot.event.restore": "Ripristina", + "snapshot.feedback.restore.destination": "Destinazione", + "snapshot.feedback.restore.destination.path": "Inserisci il percorso di destinazione", + "snapshot.feedback.restore.destination.help": "Puoi anche ripristinare in un file .zip o .tar fornendo l'estensione appropriata.", + "snapshot.feedback.restore.skip": "Salta i file e i collegamenti simbolici già ripristinati in precedenza", + "snapshot.feedback.restore.continue.errors": "Continua in caso di errori", + "snapshot.feedback.restore.continue.errors.help": "Quando si verifica un errore durante il ripristino, prova a continuare invece di interrompere rapidamente.", + "snapshot.feedback.restore.file.ownership": "Ripristina la proprietà dei file", + "snapshot.feedback.restore.file.permission": "Ripristina i permessi dei file", + "snapshot.feedback.restore.file.modification.time": "Ripristina l'orario di modifica dei file", + "snapshot.feedback.restore.file.overwrite": "Sovrascrivi i file", + "snapshot.feedback.restore.directory.overwrite": "Sovrascrivi le directory", + "snapshot.feedback.restore.link.overwrite": "Sovrascrivi i collegamenti simbolici", + "snapshot.feedback.restore.file.atomically": "Scrivi i file atomicamente", + "snapshot.feedback.restore.file.sparse": "Scrivi file sparsi", + + "snapshot.feedback.restore.shallow.depth": "Ripristino superficiale a una profondità specifica", + "snapshot.feedback.restore.shallow.file.size.minimal": "Dimensione minima del file per il ripristino superficiale", + "snapshot.feedback.restore.disable.compression.zip": "Disabilita la compressione ZIP", + "snapshot.feedback.restore.disable.compression.zip.help": "Non comprimere quando si ripristina in un file ZIP (più veloce).", + "snapshot.event.restore.begin": "Inizia il ripristino", + "repository.status.initializing": "Inizializzazione del repository...", "repository.status.connected": "Connesso al repository", "repository.event.connection.cancel":"Annulla connessione", diff --git a/public/locales/jp/translation.json b/public/locales/jp/translation.json index 22f31804..9afe52ae 100644 --- a/public/locales/jp/translation.json +++ b/public/locales/jp/translation.json @@ -5,6 +5,8 @@ "tab.policies": "ポリシー", "tab.snapshots": "スナップショット", + "common.return": "戻る", + "task.all": "すべて", "task.running": "実行中", "task.failed": "失敗", @@ -46,6 +48,29 @@ "snapshot.event.synchronize": "同期", + "snapshot.event.restore.task.go": "復元タスクに移動", + "snapshot.event.restore": "復元", + "snapshot.feedback.restore.destination": "宛先", + "snapshot.feedback.restore.destination.path": "宛先パスを入力", + "snapshot.feedback.restore.destination.help": "適切な拡張子を指定することで、.zipまたは.tarファイルにも復元できます。", + "snapshot.feedback.restore.skip": "以前に復元されたファイルとシンボリックリンクをスキップ", + "snapshot.feedback.restore.continue.errors": "エラーが発生した場合に続行", + "snapshot.feedback.restore.continue.errors.help": "復元エラーが発生した場合、即座に失敗せずに続行を試みます。", + "snapshot.feedback.restore.file.ownership": "ファイル所有権を復元", + "snapshot.feedback.restore.file.permission": "ファイルのアクセス権を復元", + "snapshot.feedback.restore.file.modification.time": "ファイルの変更時刻を復元", + "snapshot.feedback.restore.file.overwrite": "ファイルを上書き", + "snapshot.feedback.restore.directory.overwrite": "ディレクトリを上書き", + "snapshot.feedback.restore.link.overwrite": "シンボリックリンクを上書き", + "snapshot.feedback.restore.file.atomically": "ファイルをアトミックに書き込む", + "snapshot.feedback.restore.file.sparse": "スパースファイルを書き込む", + + "snapshot.feedback.restore.shallow.depth": "指定の深さで浅い復元", + "snapshot.feedback.restore.shallow.file.size.minimal": "浅い復元の最小ファイルサイズ", + "snapshot.feedback.restore.disable.compression.zip": "ZIP圧縮を無効にする", + "snapshot.feedback.restore.disable.compression.zip.help": "ZIPファイルへの復元時に圧縮しない(高速)。", + "snapshot.event.restore.begin": "復元を開始", + "repository.status.initializing": "リポジトリの初期化中...", "repository.status.connected": "リポジトリに接続済み", "repository.event.connection.cancel": "接続をキャンセル", diff --git a/public/locales/pl/translation.json b/public/locales/pl/translation.json index 1b0c0340..44ce0cf2 100644 --- a/public/locales/pl/translation.json +++ b/public/locales/pl/translation.json @@ -5,6 +5,8 @@ "tab.policies":"Konfiguracje", "tab.snapshots":"Kopie", + "common.return": "Wróć", + "task.all":"wszystkie", "task.running":"w toku", "task.failed":"nieudane", @@ -28,6 +30,29 @@ "task.header.counter": "Licznik", "task.header.value": "Wartość", + "snapshot.event.restore.task.go": "Przejdź do zadania przywracania", + "snapshot.event.restore": "Przywróć", + "snapshot.feedback.restore.destination": "Cel", + "snapshot.feedback.restore.destination.path": "Wprowadź ścieżkę docelową", + "snapshot.feedback.restore.destination.help": "Możesz również przywrócić do pliku .zip lub .tar, podając odpowiednie rozszerzenie.", + "snapshot.feedback.restore.skip": "Pomiń wcześniej przywrócone pliki i dowiązania symboliczne", + "snapshot.feedback.restore.continue.errors": "Kontynuuj w przypadku błędów", + "snapshot.feedback.restore.continue.errors.help": "Gdy wystąpi błąd przywracania, spróbuj kontynuować zamiast szybko zakończyć.", + "snapshot.feedback.restore.file.ownership": "Przywróć własność plików", + "snapshot.feedback.restore.file.permission": "Przywróć uprawnienia plików", + "snapshot.feedback.restore.file.modification.time": "Przywróć czas modyfikacji plików", + "snapshot.feedback.restore.file.overwrite": "Nadpisz pliki", + "snapshot.feedback.restore.directory.overwrite": "Nadpisz katalogi", + "snapshot.feedback.restore.link.overwrite": "Nadpisz dowiązania symboliczne", + "snapshot.feedback.restore.file.atomically": "Zapisuj pliki atomowo", + "snapshot.feedback.restore.file.sparse": "Zapisuj pliki rzadkie", + + "snapshot.feedback.restore.shallow.depth": "Płytkie przywracanie na określonej głębokości", + "snapshot.feedback.restore.shallow.file.size.minimal": "Minimalny rozmiar pliku dla płytkiego przywracania", + "snapshot.feedback.restore.disable.compression.zip": "Wyłącz kompresję ZIP", + "snapshot.feedback.restore.disable.compression.zip.help": "Nie kompresuj przy przywracaniu do pliku ZIP (szybciej).", + "snapshot.event.restore.begin": "Rozpocznij przywracanie", + "repository.status.initializing": "Inicjalizacja w toku...", "repository.status.connected": "Podłączone repoytorium", "repository.event.connection.cancel":"Przerwij próbę połączenia", diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index 1145d1f7..97475584 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -5,6 +5,8 @@ "tab.policies": "Политики", "tab.snapshots": "Снимки", + "common.return": "Возврат", + "task.all": "Все", "task.running": "Выполняются", "task.failed": "Не удалось", @@ -46,6 +48,29 @@ "snapshot.event.synchronize": "Синхронизировать", + "snapshot.event.restore.task.go": "Перейти к задаче восстановления", + "snapshot.event.restore": "Восстановить", + "snapshot.feedback.restore.destination": "Назначение", + "snapshot.feedback.restore.destination.path": "Введите путь назначения", + "snapshot.feedback.restore.destination.help": "Вы также можете восстановить в файл .zip или .tar, указав соответствующее расширение.", + "snapshot.feedback.restore.skip": "Пропустить ранее восстановленные файлы и символические ссылки", + "snapshot.feedback.restore.continue.errors": "Продолжить при возникновении ошибок", + "snapshot.feedback.restore.continue.errors.help": "При возникновении ошибки восстановления попробуйте продолжить, а не прекращать операцию.", + "snapshot.feedback.restore.file.ownership": "Восстановить владение файлами", + "snapshot.feedback.restore.file.permission": "Восстановить разрешения файлов", + "snapshot.feedback.restore.file.modification.time": "Восстановить время изменения файлов", + "snapshot.feedback.restore.file.overwrite": "Перезаписать файлы", + "snapshot.feedback.restore.directory.overwrite": "Перезаписать директории", + "snapshot.feedback.restore.link.overwrite": "Перезаписать символические ссылки", + "snapshot.feedback.restore.file.atomically": "Записывать файлы атомарно", + "snapshot.feedback.restore.file.sparse": "Записывать разреженные файлы", + + "snapshot.feedback.restore.shallow.depth": "Поверхностное восстановление на определенной глубине", + "snapshot.feedback.restore.shallow.file.size.minimal": "Минимальный размер файла для поверхностного восстановления", + "snapshot.feedback.restore.disable.compression.zip": "Отключить сжатие ZIP", + "snapshot.feedback.restore.disable.compression.zip.help": "Не сжимать при восстановлении в файл ZIP (быстрее).", + "snapshot.event.restore.begin": "Начать восстановление", + "repository.status.initializing": "Инициализация репозитория...", "repository.status.connected": "Подключено к репозиторию", "repository.event.connection.cancel": "Отменить подключение", diff --git a/src/pages/Policy.jsx b/src/pages/Policy.jsx index e759e786..27ef359d 100644 --- a/src/pages/Policy.jsx +++ b/src/pages/Policy.jsx @@ -1,31 +1,24 @@ -import React, { Component, createRef } from 'react'; +import { useRef } from 'react'; import Col from 'react-bootstrap/esm/Col'; import Row from 'react-bootstrap/esm/Row'; import { PolicyEditor } from '../components/policy-editor/PolicyEditor'; import { CLIEquivalent, GoBackButton, parseQuery, PolicyTypeName } from '../utils/uiutil'; -export class Policy extends Component { - constructor() { - super(); +export function Policy({ location, history }) { + const source = parseQuery(location.search); + const { userName, host, path } = source; + const editorRef = useRef(); - this.editorRef = createRef(); - } - - render() { - const source = parseQuery(this.props.location.search); - const { userName, host, path } = source; - - return <> -

- -   {PolicyTypeName(source)}

- -
  - - - - - - ; - } + return <> +

+ + {' '}{PolicyTypeName(source)}

+ +
+ +
+ + + + ; } diff --git a/src/pages/SnapshotRestore.jsx b/src/pages/SnapshotRestore.jsx index 64f6983a..72da735f 100644 --- a/src/pages/SnapshotRestore.jsx +++ b/src/pages/SnapshotRestore.jsx @@ -97,65 +97,66 @@ export class SnapshotRestore extends Component { } return
-  Restore -
+ {' '}{i18n.t('snapshot.event.restore')} +
- {RequiredField(this, "Destination", "destination", { - autoFocus: true, - placeholder: "enter destination path", - }, - "You can also restore to a .zip or .tar file by providing the appropriate extension.")} + {RequiredField(this, i18n.t('snapshot.feedback.restore.destination'), "destination", + { + autoFocus: true, + placeholder: i18n.t('snapshot.feedback.restore.destination.path'), + }, i18n.t('snapshot.feedback.restore.destination.help'))} +
- {RequiredBoolean(this, "Skip previously restored files and symlinks", "incremental")} + {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.skip'), "incremental")} - {RequiredBoolean(this, "Continue on Errors", "continueOnErrors", "When a restore error occurs, attempt to continue instead of failing fast.")} + {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.continue.errors'), "continueOnErrors", i18n.t('snapshot.feedback.restore.continue.errors.help'))} - {RequiredBoolean(this, "Restore File Ownership", "restoreOwnership")} + {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.file.ownership'), "restoreOwnership")} - {RequiredBoolean(this, "Restore File Permissions", "restorePermissions")} + {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.file.permission'), "restorePermissions")} - {RequiredBoolean(this, "Restore File Modification Time", "restoreModTimes")} + {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.file.modification.time'), "restoreModTimes")} - {RequiredBoolean(this, "Overwrite Files", "overwriteFiles")} + {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.file.overwrite'), "overwriteFiles")} - {RequiredBoolean(this, "Overwrite Directories", "overwriteDirectories")} + {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.directory.overwrite'), "overwriteDirectories")} - {RequiredBoolean(this, "Overwrite Symbolic Links", "overwriteSymlinks")} + {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.link.overwrite'), "overwriteSymlinks")} - {RequiredBoolean(this, "Write files atomically", "writeFilesAtomically")} + {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.file.atomically'), "writeFilesAtomically")} - {RequiredBoolean(this, "Write Sparse Files", "writeSparseFiles")} + {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.file.sparse'), "writeSparseFiles")} -

+
- {RequiredNumberField(this, "Shallow Restore At Depth", "restoreDirEntryAtDepth")} - {RequiredNumberField(this, "Minimal File Size For Shallow Restore", "minSizeForPlaceholder")} + {RequiredNumberField(this, i18n.t('snapshot.feedback.restore.shallow.depth'), "restoreDirEntryAtDepth")} + {RequiredNumberField(this, i18n.t('snapshot.feedback.restore.shallow.file.size.minimal'), "minSizeForPlaceholder")} -
+
- {RequiredBoolean(this, "Disable ZIP compression", "uncompressedZip", "Do not compress when restoring to a ZIP file (faster).")} + {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.disable.compression.zip'), "uncompressedZip", i18n.t('snapshot.feedback.restore.disable.compression.zip.help'))} -
+
- + diff --git a/src/tests/__snapshots__/Preferences.test.js.snap b/src/tests/__snapshots__/Preferences.test.js.snap index 372e90f6..25d20bc2 100644 --- a/src/tests/__snapshots__/Preferences.test.js.snap +++ b/src/tests/__snapshots__/Preferences.test.js.snap @@ -5,509 +5,295 @@ Object { "asFragment": [Function], "baseElement":
-
+
-

- -

-
+ - - - - - - - theme.help - -
-
-
- - - - user.interface.byte.representation.help - -
-
-
- - - - user.interface.appearance.help - -
-
-
- - - - user.interface.pagesize.help - -
- -
-
+ theme.dark + + + + + + theme.help +
+
-

-

+
+
+
- + user.interface.appearance.large + + + + user.interface.appearance.help + - +
+
+ + + + user.interface.pagesize.help + +
+ , "container":
-
+
-

- -

-
+ - - - - - - - theme.help - -
-
-
- - - - user.interface.byte.representation.help - -
-
-
- - - - user.interface.appearance.help - -
-
-
- - - - user.interface.pagesize.help - -
- -
-
+ theme.light + + + + + + + theme.help +
+
-

+ user.interface.byte.representation.description + + + + user.interface.byte.representation.help + +

+
+
+
- + user.interface.appearance.small + + + + + + user.interface.appearance.help + - +
+
+ + + + user.interface.pagesize.help + +
+ , "debug": [Function], "findAllByAltText": [Function], diff --git a/src/utils/uiutil.jsx b/src/utils/uiutil.jsx index 0f230498..7595829a 100644 --- a/src/utils/uiutil.jsx +++ b/src/utils/uiutil.jsx @@ -7,6 +7,7 @@ import FormControl from 'react-bootstrap/FormControl'; import InputGroup from 'react-bootstrap/InputGroup'; import Spinner from 'react-bootstrap/Spinner'; import { Link } from 'react-router-dom'; +import i18n from './i18n' // locale to use for number formatting (undefined would use default locale, but we stick to EN for now) const locale = "en-US" @@ -298,7 +299,7 @@ export function cancelTask(tid) { } export function GoBackButton(props) { - return ; + return ; } export function PolicyTypeName(s) { From 4fcec02c7370adbc654e388ac76017dc20400839 Mon Sep 17 00:00:00 2001 From: lupusA Date: Wed, 13 Mar 2024 20:42:04 +0100 Subject: [PATCH 15/27] Preliminary fix tests. Tests are extened in a another PR. --- src/tests/Preferences.test.js | 14 +- .../__snapshots__/Preferences.test.js.snap | 1047 +++++++++++++++++ 2 files changed, 1053 insertions(+), 8 deletions(-) diff --git a/src/tests/Preferences.test.js b/src/tests/Preferences.test.js index 6ea6ad9b..6149df30 100644 --- a/src/tests/Preferences.test.js +++ b/src/tests/Preferences.test.js @@ -25,7 +25,6 @@ describe('Calling the preference page', () => { }) }) - /** * */ @@ -33,10 +32,9 @@ describe('Select the light theme', () => { test('Should select light theme', () => { userEvent.selectOptions( screen.getByTestId('themeSelector'), - screen.getByRole('option', { name: "light" })); - - expect(screen.getByRole('option', { name: "light" }).selected).toBe(true) + screen.getByRole('option', { name: "theme.light" })); + expect(screen.getByRole('option', { name: "theme.light" }).selected).toBe(true) expect(wrapper).toMatchSnapshot(); }) }) @@ -46,8 +44,8 @@ describe('Select the light theme', () => { */ describe('Test number of themes', () => { test('Should have four themes', () => { - let theme = screen.getByRole('combobox', { name: "Theme" }); - expect(theme).toHaveLength(4); + let selector = screen.getByTestId('themeSelector'); + expect(selector).toHaveLength(4); expect(wrapper).toMatchSnapshot(); }) }) @@ -57,8 +55,8 @@ describe('Test number of themes', () => { */ describe('Test byte representation', () => { test('Should have two options', () => { - let theme = screen.getByRole('combobox', { name: "Byte representation" }); - expect(theme).toHaveLength(2); + let selector = screen.getByTestId('bytesBaseInput'); + expect(selector).toHaveLength(2); expect(wrapper).toMatchSnapshot(); }) }) \ No newline at end of file diff --git a/src/tests/__snapshots__/Preferences.test.js.snap b/src/tests/__snapshots__/Preferences.test.js.snap index 25d20bc2..b6f90f06 100644 --- a/src/tests/__snapshots__/Preferences.test.js.snap +++ b/src/tests/__snapshots__/Preferences.test.js.snap @@ -348,3 +348,1050 @@ Object { "unmount": [Function], } `; + +exports[`Select the light theme Should select light theme 1`] = ` +Object { + "asFragment": [Function], + "baseElement": +
+
+
+ + + + theme.help + +
+
+
+ + + + user.interface.byte.representation.help + +
+
+
+ + + + user.interface.appearance.help + +
+
+
+ + + + user.interface.pagesize.help + +
+ +
+ , + "container":
+
+
+ + + + theme.help + +
+
+
+ + + + user.interface.byte.representation.help + +
+
+
+ + + + user.interface.appearance.help + +
+
+
+ + + + user.interface.pagesize.help + +
+ +
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; + +exports[`Test byte representation Should have two options 1`] = ` +Object { + "asFragment": [Function], + "baseElement": +
+
+
+ + + + theme.help + +
+
+
+ + + + user.interface.byte.representation.help + +
+
+
+ + + + user.interface.appearance.help + +
+
+
+ + + + user.interface.pagesize.help + +
+ +
+ , + "container":
+
+
+ + + + theme.help + +
+
+
+ + + + user.interface.byte.representation.help + +
+
+
+ + + + user.interface.appearance.help + +
+
+
+ + + + user.interface.pagesize.help + +
+ +
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; + +exports[`Test number of themes Should have four themes 1`] = ` +Object { + "asFragment": [Function], + "baseElement": +
+
+
+ + + + theme.help + +
+
+
+ + + + user.interface.byte.representation.help + +
+
+
+ + + + user.interface.appearance.help + +
+
+
+ + + + user.interface.pagesize.help + +
+ +
+ , + "container":
+
+
+ + + + theme.help + +
+
+
+ + + + user.interface.byte.representation.help + +
+
+
+ + + + user.interface.appearance.help + +
+
+
+ + + + user.interface.pagesize.help + +
+ +
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; From 6d7c8d906bf9681b631ea5e8dc26e194a12a85a1 Mon Sep 17 00:00:00 2001 From: lupusA Date: Sat, 16 Mar 2024 18:11:16 +0100 Subject: [PATCH 16/27] Added more translations --- .gitignore | 1 + public/locales/de/translation.json | 299 +++++++++-------- public/locales/en/translation.json | 300 ++++++++++-------- public/locales/es/translation.json | 289 ++++++++++------- public/locales/fr/translation.json | 286 ++++++++++------- public/locales/it/translation.json | 300 ++++++++++-------- public/locales/jp/translation.json | 298 +++++++++-------- public/locales/pl/translation.json | 282 +++++++++------- public/locales/ru/translation.json | 298 +++++++++-------- src/pages/Policies.jsx | 37 +-- src/pages/Preferences.jsx | 38 +-- src/pages/Repository.jsx | 2 +- src/pages/SnapshotCreate.jsx | 15 +- src/pages/SnapshotDirectory.jsx | 15 +- src/pages/SnapshotHistory.jsx | 79 +++-- src/pages/SnapshotRestore.jsx | 2 +- src/pages/Snapshots.jsx | 15 +- src/pages/Task.jsx | 2 +- src/tests/Language.test.jsx | 28 ++ .../__snapshots__/Preferences.test.js.snap | 200 ++++++------ src/utils/i18n.js | 6 +- 21 files changed, 1583 insertions(+), 1209 deletions(-) create mode 100644 src/tests/Language.test.jsx diff --git a/.gitignore b/.gitignore index 1a092e8d..b26bb104 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ build/ node_modules/ coverage/ .idea/ +.vscode/ diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 34d3a1ec..c377782b 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -1,131 +1,170 @@ { - "tab.preferences":"Einstellungen", - "tab.repository":"Repository", - "tab.tasks":"Aufgaben", - "tab.policies":"Richtlinien", - "tab.snapshots":"Snapshots", - - "common.return": "Zurück", - - "task.all":"Alle", - "task.running":"Running", - "task.failed":"Fehlgeschlagen", - "task.loading": "Loading...", - "task.header.time.start": "Startzeit", - "task.header.status": "Status", - "task.header.kind": "Art", - "task.header.description": "Beschreibung", - "task.feedback.search": "Suchen nach Einträgen per Beschreibung", - "task.feedback.entries": "Hier erscheint eine Liste von Aufgaben, sobald Snapshots, Wartungsaufgaben oder Wiederherstellungen durchgeführt werden.", - - "task.status.succeed.after": "Task succeeded after", - "task.status.canceled": "Task canceled after", - "task.status.canceling": "Canceling", - "task.status.error": "Task error", - "task.status.running.for": "Task running for", - - "task.status.started": "Gestartet", - "task.status.finished": "Abgeschlossen", - "task.logs": "Protokoll", - - "task.event.stop": "Stop", - "task.header.counter": "Counter", - "task.header.value": "Value", - - "snapshot.header.actions": "Aktionen", - "snapshot.header.status": "Status", - "snapshot.header.snapshot.next":"Nächster Snapshot", - "snapshot.header.snapshot.last":"Letzter Snapshot", - "snapshot.header.snapshot.size":"Größe", - "snapshot.header.snapshot.owner":"Eigentümer", - "snapshot.header.snapshot.path":"Pfad", - - "snapshot.event.synchronize":"Synchronisieren", - "snapshot.event.snapshot.policy": "Richtlinie", - "snapshot.event.snapshot.now": "Snapshot erstellen", - "snapshot.event.snapshot.pending": "Wartend", - "snapshot.feedback.snapshot.start": "Der Snapshot startet, sobald der vorherige abgeschlossen ist", - "snapshot.event.snapshot.new": "Neuer Snapshot", - - "snapshot.event.restore.task.go": "Go To Restore Task", - "snapshot.event.restore":"Restore", - "snapshot.feedback.restore.destination": "Destination", - "snapshot.feedback.restore.destination.path":"Enter destination path", - "snapshot.feedback.restore.destination.help": "You can also restore to a .zip or .tar file by providing the appropriate extension.", - "snapshot.feedback.restore.skip": "Skip previously restored files and symlinks", - "snapshot.feedback.restore.continue.errors": "Continue on errors", - "snapshot.feedback.restore.continue.errors.help": "When a restore error occurs, attempt to continue instead of failing fast.", - "snapshot.feedback.restore.file.ownership": "Restore file ownership", - "snapshot.feedback.restore.file.permission": "Restore file permissions", - "snapshot.feedback.restore.file.modification.time": "Restore file modification time", - "snapshot.feedback.restore.file.overwrite": "Overwrite files", - "snapshot.feedback.restore.directory.overwrite": "Overwrite directories", - "snapshot.feedback.restore.link.overwrite": "Overwrite symbolic links", - "snapshot.feedback.restore.file.atomically": "Write files atomically", - "snapshot.feedback.restore.file.sparse":"Write sparse files", - - "snapshot.feedback.restore.shallow.depth": "Shallow restore at depth", - "snapshot.feedback.restore.shallow.file.size.minimal": "Minimal file size for shallow restore", - "snapshot.feedback.restore.disable.compression.zip": "Disable ZIP compression", - "snapshot.feedback.restore.disable.compression.zip.help": "Do not compress when restoring to a ZIP file (faster).", - "snapshot.event.restore.begin":"Begin restore", - - "repository.status.initializing": "Initializing repository...", - "repository.status.connected": "Mit Repository verbunden", - "repository.event.connection.cancel":"Cancel connection", - "repository.event.connection.disconnect": "Repository trennen", - "repository.event.description.update": "Update description", - - "repository.feedback.description.required":"Repository description is required", - "repository.feedback.read.only": "Repository is read-only", - "repository.feedback.eco.disabled":"Disabled", - "repository.feedback.compression.internal.supported": "ja", - "repository.feedback.compression.internal.not.supported": "nein", - - "repository.attribute.server.url": "Server URL", - "repository.attribute.config.file": "Konfigurationsdatei", - "repository.attribute.provider": "Anbieter", - "repository.attribute.algorithm.encryption": "Verschlüsselungsalgorithmus", - "repository.attribute.algorithm.hash": "Hash-Algorithmus", - "repository.attribute.algorithm.splitter": "Splitter algorithm", - "repository.attribute.algorithm.eco": "Error correction algorithm", - - "repository.attribute.connected.as": "Verbunden als", - "repository.attribute.compression.internal": "Interne Kompression", - "repository.attribute.format": "Repository format", - "repository.attribute.eco": "Error correction overhead", - - "log.event.hide": "Hide log", - "log.event.show": "Show log", - - "user.interface": "Benuteroberfläche", - "user.interface.appearance":"Erscheinung", - "user.interface.appearance.hint":"Select font size", - "user.interface.appearance.help": "Specifies the appearance of the user interface", - - "user.interface.appearance.small":"klein", - "user.interface.appearance.medium":"mittel", - "user.interface.appearance.large":"groß", - - "user.interface.pagesize.description": "Anzahl an Einträgen", - "user.interface.pagesize.help": "Gibt die Anzahl der Einträge in Listen an", - "user.interface.pagesize.hint": "Anzahl Einträge", - - "user.interface.byte.representation.description":"Select byte representation", - "user.interface.byte.representation.select":"Select byte representation", - "user.interface.byte.representation.help":"Specifies the representation of bytes", - - "user.language":"Sprache", - - "lang.help": "Sets the language for the user interface", - "lang.select": "Select language", - "lang.description": "Select the language", - - "theme.description": "Design", - "theme.select": "Select theme", - "theme.help": "Das aktuell ausgewählte Design", - "theme.dark":"Dunkel", - "theme.light": "Hell", - "theme.pastel": "Pastel", - "theme.ocean":"Ozean" -} \ No newline at end of file + "common.cancel": "Abbrechen", + "common.delete": "Löschen", + "common.delete.confirm": "Löschen bestätigen", + "common.loading": "Wird geladen ...", + "common.return": "Zurück", + "description.event.cancel": "Abbrechen", + "description.event.new": "Geben Sie eine neue Beschreibung ein", + "description.event.remove": "Beschreibung entfernen", + "description.event.update": "Beschreibung aktualisieren", + "description.feedback.description": "Beschreibung des Snapshots", + "feedback.ui.appearance": "Darstellung", + "feedback.ui.appearance-help": "Gibt die Darstellung des Nutzerinterfaces an", + "feedback.ui.appearance-hint": "Select font size", + "feedback.ui.theme-select": "Select theme", + "log.event.hide": "Hide log", + "log.event.show": "Show log", + "pin.event.add": "Pin hinzufügen", + "pin.event.cancel": "Abbrechen", + "pin.event.remove": "Pin entfernen", + "pin.event.snapshot.pin": "Snapshot anheften", + "pin.event.update": "Pin aktualisieren", + "pin.feedback.name": "Name des Pins", + "pin.feedback.standard-text": "Nicht löschen", + "policies.feedback.find.count_one": "{{count}} Richtlinie gefunden, die den Kriterien entspricht", + "policies.feedback.find.count_other": "{{count}} Richtlinien gefunden, die den Kriterien entsprechen", + "policies.feedback.find.none": "Keine Richtlinien gefunden.", + "policies.feedback.find.none.create": "Für das Verzeichnis {{path}} wurde keine Richtlinie gefunden. \nBitte richten Sie eine neue Richtlinie ein.", + "policies.feedback.loading": "Wird geladen ...", + "policies.feedback.path.absolute": "Richtlinien können nur für absolute Pfade definiert werden.", + "policies.feedback.policy.find": "Geben Sie das Verzeichnis ein, um die Richtlinie zu finden oder festzulegen", + "policies.header.actions": "Aktionen", + "policies.header.defined": "Definiert", + "policies.header.host": "Host", + "policies.header.path": "Pfad", + "policies.header.username": "Nutzername", + "policies.kind.all": "Alle Richtlinien", + "policies.kind.applicable": "Anwendbare Richtlinien", + "policies.kind.global": "Globale Richtlinien", + "policies.kind.host": "Richtlinien pro Host", + "policies.kind.local": "Lokale Richtlinien", + "policies.kind.user": "Richtlinien pro Benutzer", + "repository.attribute.algorithm.eco": "Error correction algorithm", + "repository.attribute.algorithm.encryption": "Verschlüsselungsalgorithmus", + "repository.attribute.algorithm.hash": "Hash-Algorithmus", + "repository.attribute.algorithm.splitter": "Splitter algorithm", + "repository.attribute.compression.internal": "Interne Kompression", + "repository.attribute.config.file": "Konfigurationsdatei", + "repository.attribute.connected.as": "Verbunden als", + "repository.attribute.eco": "Error correction overhead", + "repository.attribute.format": "Repository format", + "repository.attribute.provider": "Anbieter", + "repository.attribute.server.url": "Server URL", + "repository.event.connection.cancel": "Cancel connection", + "repository.event.connection.disconnect": "Repository trennen", + "repository.event.description.update": "Update description", + "repository.feedback.compression.internal.not.supported": "nein", + "repository.feedback.compression.internal.supported": "ja", + "repository.feedback.description.required": "Repository description is required", + "repository.feedback.eco.disabled": "Disabled", + "repository.feedback.read.only": "Repository is read-only", + "repository.status.connected": "Mit Repository verbunden", + "repository.status.initializing": "Initializing repository...", + "snapshot.event.create.estimate": "Schätzung", + "snapshot.event.create.now": "Snapshot erstellen", + "snapshot.event.create.path": "Pfad des Schnapshots eingeben", + "snapshot.event.create.path.resolve": "Pfad zur Erstellung des Snapshot muss angegeben werden.", + "snapshot.event.delete.selected_one": "Möchten Sie den ausgewählten {{count}} Snapshot löschen?", + "snapshot.event.delete.selected_other": "Möchten Sie die ausgewählten {{count}} Snapshots löschen?", + "snapshot.event.directory.browse": "Durchsuchen", + "snapshot.event.directory.browsing": "Das Durchsuchen von Verzeichnissen wird in einem Webbrowser nicht unterstützt. \nVerwenden Sie die Kopia-Benutzeroberfläche.", + "snapshot.event.directory.mount": "Als lokales Dateisystem mounten", + "snapshot.event.directory.restore": "Dateien und Verzeichnisse wiederherstellen", + "snapshot.event.directory.unmount": "Aushängen", + "snapshot.event.history.delete.source": "Snapshot-Quelle löschen", + "snapshot.event.history.description.update": "{{description}} – Klicken Sie hier, um die Snapshot-Beschreibung zu aktualisieren.", + "snapshot.event.history.deselect.all": "Alle abwählen", + "snapshot.event.history.fetch.snapshots": "Schnappschüsse abrufen", + "snapshot.event.history.pin.add": "Fügen Sie eine PIN hinzu, um den Snapshot vor dem Löschen zu schützen", + "snapshot.event.history.select.all": "Wählen Sie Alle", + "snapshot.event.history.selected.delete": "Ausgewählte löschen (", + "snapshot.event.restore": "Restore", + "snapshot.event.restore.begin": "Begin restore", + "snapshot.event.snapshot.new": "Neuer Snapshot", + "snapshot.event.snapshot.pending": "Wartend", + "snapshot.event.snapshot.policy": "Richtlinie", + "snapshot.event.synchronize": "Synchronisieren", + "snapshot.feedback.directory.mount.restore": "Sie können alle unten angezeigten Dateien und Verzeichnisse mounten/wiederherstellen oder Dateien einzeln wiederherstellen.", + "snapshot.feedback.history.display": "Anzeigen", + "snapshot.feedback.history.wipe.all": "Löschen Sie alle Snapshots und die Richtlinie für diese Quelle.", + "snapshot.feedback.restore.continue.errors": "Continue on errors", + "snapshot.feedback.restore.continue.errors.help": "When a restore error occurs, attempt to continue instead of failing fast.", + "snapshot.feedback.restore.destination": "Destination", + "snapshot.feedback.restore.destination.help": "You can also restore to a .zip or .tar file by providing the appropriate extension.", + "snapshot.feedback.restore.destination.path": "Enter destination path", + "snapshot.feedback.restore.directory.overwrite": "Overwrite directories", + "snapshot.feedback.restore.disable.compression.zip": "Disable ZIP compression", + "snapshot.feedback.restore.disable.compression.zip.help": "Do not compress when restoring to a ZIP file (faster).", + "snapshot.feedback.restore.file.atomically": "Write files atomically", + "snapshot.feedback.restore.file.modification.time": "Restore file modification time", + "snapshot.feedback.restore.file.overwrite": "Overwrite files", + "snapshot.feedback.restore.file.ownership": "Restore file ownership", + "snapshot.feedback.restore.file.permission": "Restore file permissions", + "snapshot.feedback.restore.file.sparse": "Write sparse files", + "snapshot.feedback.restore.link.overwrite": "Overwrite symbolic links", + "snapshot.feedback.restore.shallow.depth": "Shallow restore at depth", + "snapshot.feedback.restore.shallow.file.size.minimal": "Minimal file size for shallow restore", + "snapshot.feedback.restore.skip": "Skip previously restored files and symlinks", + "snapshot.feedback.restore.task.go": "Gehen Sie zur Wiederherstellungsaufgabe", + "snapshot.feedback.snapshot.new": "Neuer Snapshot", + "snapshot.feedback.snapshot.start": "Der Snapshot startet, sobald der vorherige abgeschlossen ist", + "snapshot.header.actions": "Aktionen", + "snapshot.header.snapshot.last": "Letzter Snapshot", + "snapshot.header.snapshot.next": "Nächster Snapshot", + "snapshot.header.snapshot.owner": "Eigentümer", + "snapshot.header.snapshot.path": "Pfad", + "snapshot.header.snapshot.size": "Größe", + "snapshot.header.status": "Status", + "snapshot.history.feedack.unfiltered.count_one": "{{count}} einzelnen Schnappschuss anzeigen", + "snapshot.history.feedack.unfiltered.count_other": "{{count}} einzelne Schnappschüsse anzeigen", + "snapshot.history.header.description": "Beschreibung", + "snapshot.history.header.directories": "Ordner", + "snapshot.history.header.files": "Dateien", + "snapshot.history.header.retention": "Beibehaltung", + "snapshot.history.header.root": "Wurzelverzeichnis", + "snapshot.history.header.selected": "Ausgewählt", + "snapshot.history.header.size": "Größe", + "snapshot.history.header.time.start": "Startzeit", + "tab.policies": "Richtlinien", + "tab.preferences": "Einstellungen", + "tab.repository": "Repository", + "tab.snapshots": "Snapshots", + "tab.tasks": "Aufgaben", + "task.all": "Alle", + "task.event.stop": "Stop", + "task.failed": "Fehlgeschlagen", + "task.feedback.entries": "Hier erscheint eine Liste von Aufgaben, sobald Snapshots, Wartungsaufgaben oder Wiederherstellungen durchgeführt werden.", + "task.feedback.search": "Suchen nach Einträgen per Beschreibung", + "task.header.counter": "Counter", + "task.header.description": "Beschreibung", + "task.header.kind": "Art", + "task.header.status": "Status", + "task.header.time.start": "Startzeit", + "task.header.value": "Value", + "task.loading": "Loading...", + "task.logs": "Protokoll", + "task.running": "Running", + "task.status.canceled": "Task canceled after", + "task.status.canceling": "Canceling", + "task.status.error": "Task error", + "task.status.finished": "Abgeschlossen", + "task.status.running.for": "Task running for", + "task.status.started": "Gestartet", + "task.status.succeed.after": "Task succeeded after", + "ui.feedback.byte-representation-description": "Darstellung der Speichergrößen", + "ui.feedback.byte-representation-help": "Gibt die aktuelle Darstellung von Speichergrößen an", + "ui.feedback.byte-representation-select": "Darstellung der Speichgröße auswählen", + "ui.feedback.pagesize-description": "Anzahl an Einträgen", + "ui.feedback.pagesize-help": "Gibt die Anzahl der Einträge in Listen an", + "ui.feedback.pagesize-hint": "Anzahl Einträge", + "ui.feedback.theme-description": "Design", + "ui.feedback.theme-help": "Das aktuell ausgewählte Design", + "ui.value.appearance-large": "groß", + "ui.value.appearance-medium": "mittel", + "ui.value.appearance-small": "klein", + "ui.value.theme-dark": "dunkel", + "ui.value.theme-light": "hell", + "ui.value.theme-ocean": "ozeanisch", + "ui.value.theme-pastel": "pastelfarbend" +} diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 2950b2df..281f7da2 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -1,132 +1,170 @@ { - "tab.preferences":"Preferences", - "tab.repository":"Repository", - "tab.tasks":"Tasks", - "tab.policies":"Policies", - "tab.snapshots":"Snapshots", - - "common.return": "Return", - - "task.all":"All", - "task.running":"Running", - "task.failed":"Failed", - "task.loading": "Loading...", - "task.header.time.start": "Start time", - "task.header.status": "Status", - "task.header.kind": "Kind", - "task.header.description": "Description", - "task.feedback.search": "Search logs by description", - "task.feedback.entries": "A list of tasks will appear here when you create snapshots, restore, run maintenance, etc.", - - "task.status.succeed.after": "Task succeeded after", - "task.status.canceled": "Task canceled after", - "task.status.canceling": "Canceling", - "task.status.error": "Task error", - "task.status.running.for": "Task running for", - - "task.status.started": "Started", - "task.status.finished": "Finished", - "task.logs": "Logs", - - "task.event.stop": "Stop", - "task.header.counter": "Counter", - "task.header.value": "Value", - - "snapshot.header.actions": "Actions", - "snapshot.header.status": "Status", - "snapshot.header.snapshot.next":"Next Snapshot", - "snapshot.header.snapshot.last":"Last Snapshot", - "snapshot.header.snapshot.size":"Size", - "snapshot.header.snapshot.owner":"Owner", - "snapshot.header.snapshot.path":"Path", - - "snapshot.event.snapshot.now": "Snapshot Now", - "snapshot.event.snapshot.policy": "Policy", - "snapshot.event.snapshot.pending": "Pending", - "snapshot.feedback.snapshot.start": "Snapshot will start after the previous snapshot completes", - "snapshot.event.snapshot.new": "New Snapshot", - - "snapshot.event.synchronize":"Synchronize", - - "snapshot.event.restore.task.go": "Go To Restore Task", - "snapshot.event.restore":"Restore", - "snapshot.feedback.restore.destination": "Destination", - "snapshot.feedback.restore.destination.path":"Enter destination path", - "snapshot.feedback.restore.destination.help": "You can also restore to a .zip or .tar file by providing the appropriate extension.", - "snapshot.feedback.restore.skip": "Skip previously restored files and symlinks", - "snapshot.feedback.restore.continue.errors": "Continue on errors", - "snapshot.feedback.restore.continue.errors.help": "When a restore error occurs, attempt to continue instead of failing fast.", - "snapshot.feedback.restore.file.ownership": "Restore file ownership", - "snapshot.feedback.restore.file.permission": "Restore file permissions", - "snapshot.feedback.restore.file.modification.time": "Restore file modification time", - "snapshot.feedback.restore.file.overwrite": "Overwrite files", - "snapshot.feedback.restore.directory.overwrite": "Overwrite directories", - "snapshot.feedback.restore.link.overwrite": "Overwrite symbolic links", - "snapshot.feedback.restore.file.atomically": "Write files atomically", - "snapshot.feedback.restore.file.sparse":"Write sparse files", - - "snapshot.feedback.restore.shallow.depth": "Shallow restore at depth", - "snapshot.feedback.restore.shallow.file.size.minimal": "Minimal file size for shallow restore", - "snapshot.feedback.restore.disable.compression.zip": "Disable ZIP compression", - "snapshot.feedback.restore.disable.compression.zip.help": "Do not compress when restoring to a ZIP file (faster).", - "snapshot.event.restore.begin":"Begin restore", - - "repository.status.initializing": "Initializing repository...", - "repository.status.connected": "Connected to repository", - "repository.event.connection.cancel":"Cancel connection", - "repository.event.connection.disconnect": "Disconnect from repository", - "repository.event.description.update": "Update description", - - "repository.feedback.description.required":"Repository description is required", - "repository.feedback.read.only": "Repository is read-only", - "repository.feedback.eco.disabled":"Disabled", - "repository.feedback.compression.internal.supported": "yes", - "repository.feedback.compression.internal.not.supported": "no", - - "repository.attribute.server.url": "Server URL", - "repository.attribute.config.file": "Config file", - "repository.attribute.provider": "Provider", - "repository.attribute.algorithm.encryption": "Encryption algorithm", - "repository.attribute.algorithm.hash": "Hash algorithm", - "repository.attribute.algorithm.splitter": "Splitter algorithm", - "repository.attribute.algorithm.eco": "Error correction algorithm", - - "repository.attribute.connected.as": "Connected as", - "repository.attribute.compression.internal": "Internal compression", - "repository.attribute.format": "Repository format", - "repository.attribute.eco": "Error correction overhead", - - "log.event.hide": "Hide log", - "log.event.show": "Show log", - - "user.interface": "User interface", - "user.interface.appearance":"Appearance", - "user.interface.appearance.hint":"Select font size", - "user.interface.appearance.help": "Specifies the appearance of the user interface", - - "user.interface.appearance.small":"small", - "user.interface.appearance.medium":"medium", - "user.interface.appearance.large":"large", - - "user.interface.pagesize.description": "Page size", - "user.interface.pagesize.help": "Specifies the pagination size in tables", - "user.interface.pagesize.hint": "Page size", - - "user.interface.byte.representation.description":"Select byte representation", - "user.interface.byte.representation.select":"Select byte representation", - "user.interface.byte.representation.help":"Specifies the representation of bytes", - - "user.language":"Language", - - "lang.help": "Sets the language for the user interface", - "lang.select": "Select language", - "lang.description": "Select the language", - - "theme.description": "Theme", - "theme.select": "Select theme", - "theme.help": "The current active theme", - "theme.dark":"dark", - "theme.light": "light", - "theme.pastel": "pastel", - "theme.ocean":"ocean" -} \ No newline at end of file + "common.cancel": "Cancel", + "common.delete": "Delete", + "common.delete.confirm": "Confirm Delete", + "common.loading": "Loading ...", + "common.return": "Return", + "description.event.cancel": "Cancel", + "description.event.new": "Enter new description", + "description.event.remove": "Remove Description", + "description.event.update": "Update Description", + "description.feedback.description": "Snapshot Description", + "feedback.ui.appearance": "Appearance", + "feedback.ui.appearance-help": "Specifies the appearance of the user interface", + "feedback.ui.appearance-hint": "Select font size", + "feedback.ui.theme-select": "Select theme", + "log.event.hide": "Hide log", + "log.event.show": "Show log", + "pin.event.add": "Add Pin", + "pin.event.cancel": "Cancel", + "pin.event.remove": "Remove Pin", + "pin.event.snapshot.pin": "Pin Snapshot", + "pin.event.update": "Update Pin", + "pin.feedback.name": "Name of the pin", + "pin.feedback.standard-text": "do-not-delete", + "policies.feedback.find.count_one": "Found {{count}} policy matching the criteria", + "policies.feedback.find.count_other": "Found {{count}} policies matching the criteria", + "policies.feedback.find.none": "No policies found.", + "policies.feedback.find.none.create": " No policy found for directory {{path}}. Please setup a new policy.", + "policies.feedback.loading": "Loading ...", + "policies.feedback.path.absolute": "Policies can only be defined for absolute paths.", + "policies.feedback.policy.find": "Enter directory to find or set policy", + "policies.header.actions": "Actions", + "policies.header.defined": "Defined", + "policies.header.host": "Host", + "policies.header.path": "Path", + "policies.header.username": "Username", + "policies.kind.all": "All policies", + "policies.kind.applicable": "Applicable policies", + "policies.kind.global": "Global policies", + "policies.kind.host": "Per-Host policies", + "policies.kind.local": "Local policies", + "policies.kind.user": "Per-User policies", + "repository.attribute.algorithm.eco": "Error correction algorithm", + "repository.attribute.algorithm.encryption": "Encryption algorithm", + "repository.attribute.algorithm.hash": "Hash algorithm", + "repository.attribute.algorithm.splitter": "Splitter algorithm", + "repository.attribute.compression.internal": "Internal compression", + "repository.attribute.config.file": "Config file", + "repository.attribute.connected.as": "Connected as", + "repository.attribute.eco": "Error correction overhead", + "repository.attribute.format": "Repository format", + "repository.attribute.provider": "Provider", + "repository.attribute.server.url": "Server URL", + "repository.event.connection.cancel": "Cancel connection", + "repository.event.connection.disconnect": "Disconnect from repository", + "repository.event.description.update": "Update description", + "repository.feedback.compression.internal.not.supported": "no", + "repository.feedback.compression.internal.supported": "yes", + "repository.feedback.description.required": "Repository description is required", + "repository.feedback.eco.disabled": "Disabled", + "repository.feedback.read.only": "Repository is read-only", + "repository.status.connected": "Connected to repository", + "repository.status.initializing": "Initializing repository...", + "snapshot.event.create.estimate": "Estimate", + "snapshot.event.create.now": "Snapshot now", + "snapshot.event.create.path": "Enter path to snapshot", + "snapshot.event.create.path.resolve": "Must specify directory to snapshot.", + "snapshot.event.delete.selected_one": "Do you want to delete the selected {{count}} snapshot?", + "snapshot.event.delete.selected_other": "Do you want to delete the selected {{count}} snapshots?", + "snapshot.event.directory.browse": "Browse", + "snapshot.event.directory.browsing": "Directory browsing is not supported in a web browser. Use Kopia UI.", + "snapshot.event.directory.mount": "Mount as Local Filesystem", + "snapshot.event.directory.restore": "Restore files and directories\n", + "snapshot.event.directory.unmount": "Unmount", + "snapshot.event.history.delete.source": "Delete Snapshot Source", + "snapshot.event.history.description.update": "{{description}} - Click to update snapshot description.", + "snapshot.event.history.deselect.all": "Deselect All", + "snapshot.event.history.fetch.snapshots": "Fetch snapshots", + "snapshot.event.history.pin.add": "Add a pin to protect snapshot from deletion", + "snapshot.event.history.select.all": "Select All", + "snapshot.event.history.selected.delete": "Delete Selected (", + "snapshot.event.restore": "Restore", + "snapshot.event.restore.begin": "Begin restore", + "snapshot.event.snapshot.new": "New Snapshot", + "snapshot.event.snapshot.pending": "Pending", + "snapshot.event.snapshot.policy": "Policy", + "snapshot.event.synchronize": "Synchronize", + "snapshot.feedback.directory.mount.restore": "You can mount/restore all the files and directories that you see below or restore files individually.", + "snapshot.feedback.history.display": "Displaying", + "snapshot.feedback.history.wipe.all": "Wipe all snapshots and the policy for this source.", + "snapshot.feedback.restore.continue.errors": "Continue on errors", + "snapshot.feedback.restore.continue.errors.help": "When a restore error occurs, attempt to continue instead of failing fast.", + "snapshot.feedback.restore.destination": "Destination", + "snapshot.feedback.restore.destination.help": "You can also restore to a .zip or .tar file by providing the appropriate extension.", + "snapshot.feedback.restore.destination.path": "Enter destination path", + "snapshot.feedback.restore.directory.overwrite": "Overwrite directories", + "snapshot.feedback.restore.disable.compression.zip": "Disable ZIP compression", + "snapshot.feedback.restore.disable.compression.zip.help": "Do not compress when restoring to a ZIP file (faster).", + "snapshot.feedback.restore.file.atomically": "Write files atomically", + "snapshot.feedback.restore.file.modification.time": "Restore file modification time", + "snapshot.feedback.restore.file.overwrite": "Overwrite files", + "snapshot.feedback.restore.file.ownership": "Restore file ownership", + "snapshot.feedback.restore.file.permission": "Restore file permissions", + "snapshot.feedback.restore.file.sparse": "Write sparse files", + "snapshot.feedback.restore.link.overwrite": "Overwrite symbolic links", + "snapshot.feedback.restore.shallow.depth": "Shallow restore at depth", + "snapshot.feedback.restore.shallow.file.size.minimal": "Minimal file size for shallow restore", + "snapshot.feedback.restore.skip": "Skip previously restored files and symlinks", + "snapshot.feedback.restore.task.go": "Go To Restore Task", + "snapshot.feedback.snapshot.new": "New Snapshot", + "snapshot.feedback.snapshot.start": "Snapshot will start after the previous snapshot completes", + "snapshot.header.actions": "Actions", + "snapshot.header.snapshot.last": "Last Snapshot", + "snapshot.header.snapshot.next": "Next Snapshot", + "snapshot.header.snapshot.owner": "Owner", + "snapshot.header.snapshot.path": "Path", + "snapshot.header.snapshot.size": "Size", + "snapshot.header.status": "Status", + "snapshot.history.feedack.unfiltered.count_one": "Show {{count}} individual snapshot", + "snapshot.history.feedack.unfiltered.count_other": "Show {{count}} individual snapshots", + "snapshot.history.header.description": "Description", + "snapshot.history.header.directories": "Dirs", + "snapshot.history.header.files": "Files", + "snapshot.history.header.retention": "Retention", + "snapshot.history.header.root": "Root", + "snapshot.history.header.selected": "Selected", + "snapshot.history.header.size": "Size", + "snapshot.history.header.time.start": "Start time", + "tab.policies": "Policies", + "tab.preferences": "Preferences", + "tab.repository": "Repository", + "tab.snapshots": "Snapshots", + "tab.tasks": "Tasks", + "task.all": "All", + "task.event.stop": "Stop", + "task.failed": "Failed", + "task.feedback.entries": "A list of tasks will appear here when you create snapshots, restore, run maintenance, etc.", + "task.feedback.search": "Search logs by description", + "task.header.counter": "Counter", + "task.header.description": "Description", + "task.header.kind": "Kind", + "task.header.status": "Status", + "task.header.time.start": "Start time", + "task.header.value": "Value", + "task.loading": "Loading...", + "task.logs": "Logs", + "task.running": "Running", + "task.status.canceled": "Task canceled after", + "task.status.canceling": "Canceling", + "task.status.error": "Task error", + "task.status.finished": "Finished", + "task.status.running.for": "Task running for", + "task.status.started": "Started", + "task.status.succeed.after": "Task succeeded after", + "ui.feedback.byte-representation-description": "Select byte representation", + "ui.feedback.byte-representation-help": "Specifies the representation of bytes", + "ui.feedback.byte-representation-select": "Select byte representation", + "ui.feedback.pagesize-description": "Page size", + "ui.feedback.pagesize-help": "Specifies the pagination size in tables", + "ui.feedback.pagesize-hint": "Page size", + "ui.feedback.theme-description": "Theme", + "ui.feedback.theme-help": "The current active theme", + "ui.value.appearance-large": "large", + "ui.value.appearance-medium": "medium", + "ui.value.appearance-small": "small", + "ui.value.theme-dark": "dark", + "ui.value.theme-light": "light", + "ui.value.theme-ocean": "ocean", + "ui.value.theme-pastel": "pastel" +} diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 2e7c0be2..17d79b70 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -1,121 +1,170 @@ { - "tab.preferences": "Preferencias", - "tab.repository": "Depósito", - "tab.tasks": "Tareas", - "tab.policies": "Políticas", - "tab.snapshots": "Copias de respaldo", - - "common.return": "Volver", - - "task.all": "Todas", - "task.running": "En ejecución", - "task.failed": "Fallidas", - "task.loading": "Cargando...", - "task.header.time.start": "Hora de inicio", - "task.header.status": "Estado", - "task.header.kind": "Tipo", - "task.header.description": "Descripción", - "task.feedback.search": "Buscar registros por descripción", - "task.feedback.entries": "Aquí aparecerá una lista de tareas cuando crees instantáneas, restaures, ejecutes mantenimiento, etc.", - - "task.status.succeed.after": "La tarea se completó con éxito después de", - "task.status.canceled": "Tarea cancelada después de", - "task.status.canceling": "Cancelando", - "task.status.error": "Error en la tarea", - "task.status.running.for": "Tarea en ejecución durante", - "task.status.started": "Iniciada", - "task.status.finished": "Finalizada", - - "task.logs": "Registros", - "task.event.stop": "Detener", - "task.header.counter": "Contador", - "task.header.value": "Valor", - - "snapshot.header.actions": "Acciones", - "snapshot.header.status": "Estado", - "snapshot.header.snapshot.next": "Siguiente instantánea", - "snapshot.header.snapshot.last": "Última instantánea", - "snapshot.header.snapshot.size": "Tamaño", - "snapshot.header.snapshot.owner": "Dueño", - "snapshot.header.snapshot.path": "Ruta", - "snapshot.event.snapshot.now": "Instantánea ahora", - "snapshot.event.snapshot.policy": "Política", - "snapshot.event.snapshot.pending": "Pendiente", - "snapshot.feedback.snapshot.start": "La instantánea comenzará después de que se complete la instantánea anterior", - "snapshot.event.snapshot.new": "Nueva instantánea", - "snapshot.event.synchronize": "Sincronizar", - - "snapshot.event.restore.task.go": "Ir a la tarea de restauración", - "snapshot.event.restore": "Restaurar", - "snapshot.feedback.restore.destination": "Destino", - "snapshot.feedback.restore.destination.path": "Introducir la ruta de destino", - "snapshot.feedback.restore.destination.help": "También puedes restaurar a un archivo .zip o .tar proporcionando la extensión adecuada.", - "snapshot.feedback.restore.skip": "Saltar archivos y enlaces simbólicos restaurados previamente", - "snapshot.feedback.restore.continue.errors": "Continuar en caso de errores", - "snapshot.feedback.restore.continue.errors.help": "Cuando se produce un error durante la restauración, intenta continuar en lugar de detenerse rápidamente.", - "snapshot.feedback.restore.file.ownership": "Restaurar propiedad de archivos", - "snapshot.feedback.restore.file.permission": "Restaurar permisos de archivos", - "snapshot.feedback.restore.file.modification.time": "Restaurar hora de modificación de archivos", - "snapshot.feedback.restore.file.overwrite": "Sobrescribir archivos", - "snapshot.feedback.restore.directory.overwrite": "Sobrescribir directorios", - "snapshot.feedback.restore.link.overwrite": "Sobrescribir enlaces simbólicos", - "snapshot.feedback.restore.file.atomically": "Escribir archivos atómicamente", - "snapshot.feedback.restore.file.sparse": "Escribir archivos dispersos", - - "snapshot.feedback.restore.shallow.depth": "Restauración superficial a una profundidad específica", - "snapshot.feedback.restore.shallow.file.size.minimal": "Tamaño mínimo de archivo para restauración superficial", - "snapshot.feedback.restore.disable.compression.zip": "Desactivar compresión ZIP", - "snapshot.feedback.restore.disable.compression.zip.help": "No comprimir al restaurar en un archivo ZIP (más rápido).", - "snapshot.event.restore.begin": "Comenzar la restauración", - - "repository.status.initializing": "Inicializando el repositorio...", - "repository.status.connected": "Conectado al repositorio", - "repository.event.connection.cancel": "Cancelar conexión", - "repository.event.connection.disconnect": "Desconectar del repositorio", - "repository.event.description.update": "Actualizar descripción", - "repository.feedback.description.required": "La descripción del repositorio es obligatoria", - "repository.feedback.read.only": "El repositorio es de sólo lectura", - "repository.feedback.eco.disabled": "Deshabilitado", - "repository.feedback.compression.internal.supported": "sí", - "repository.feedback.compression.internal.not.supported": "no", - "repository.attribute.server.url": "URL del servidor", - "repository.attribute.config.file": "Archivo de configuración", - "repository.attribute.provider": "Proveedor", - "repository.attribute.algorithm.encryption": "Algoritmo de cifrado", - "repository.attribute.algorithm.hash": "Algoritmo de hash", - "repository.attribute.algorithm.splitter": "Algoritmo de división", - "repository.attribute.algorithm.eco": "Algoritmo de corrección de errores", - "repository.attribute.connected.as": "Conectado como", - "repository.attribute.compression.internal": "Compresión interna", - "repository.attribute.format": "Formato del repositorio", - "repository.attribute.eco": "Overhead de corrección de errores", - - "log.event.hide": "Ocultar registro", - "log.event.show": "Mostrar registro", - - "user.interface": "Interfaz de usuario", - "user.interface.appearance": "Apariencia", - "user.interface.appearance.hint": "Selecciona el tamaño de letra", - "user.interface.appearance.help": "Especifica la apariencia de la interfaz de usuario", - "user.interface.appearance.small": "pequeño", - "user.interface.appearance.medium": "mediano", - "user.interface.appearance.large": "grande", - "user.interface.pagesize.description": "Tamaño de página", - "user.interface.pagesize.help": "Especifica el tamaño de paginación en las tablas", - "user.interface.pagesize.hint": "Tamaño de página", - "user.interface.byte.representation.description": "Selecciona la representación de bytes", - "user.interface.byte.representation.select": "Selecciona la representación de bytes", - "user.interface.byte.representation.help": "Especifica la representación de bytes", - "user.language": "Idioma", - - "lang.help": "Establece el idioma para la interfaz de usuario", - "lang.select": "Selecciona el idioma", - "lang.description": "Selecciona el idioma", - "theme.description": "Tema", - "theme.select": "Seleccionar tema", - "theme.help": "El tema activo actual", - "theme.dark": "oscuro", - "theme.light": "claro", - "theme.pastel": "pastel", - "theme.ocean": "oceánico" -} \ No newline at end of file + "common.cancel": "Cancelar", + "common.delete": "Borrar", + "common.delete.confirm": "Confirmar eliminación", + "common.loading": "Cargando ...", + "common.return": "Volver", + "description.event.cancel": "Cancelar", + "description.event.new": "Ingrese una nueva descripción", + "description.event.remove": "Eliminar descripción", + "description.event.update": "Descripción de la actualización", + "description.feedback.description": "Descripción de la instantánea", + "feedback.ui.appearance": "Apariencia", + "feedback.ui.appearance-help": "Especifica la apariencia de la interfaz de usuario", + "feedback.ui.appearance-hint": "Selecciona el tamaño de letra", + "feedback.ui.theme-select": "Seleccionar tema", + "log.event.hide": "Ocultar registro", + "log.event.show": "Mostrar registro", + "pin.event.add": "Agregar PIN", + "pin.event.cancel": "Cancelar", + "pin.event.remove": "Quitar pin", + "pin.event.snapshot.pin": "Instantánea de pin", + "pin.event.update": "Actualizar PIN", + "pin.feedback.name": "nombre del pin", + "pin.feedback.standard-text": "no borres", + "policies.feedback.find.count_one": "Se encontró {{count}} política que coincide con los criterios", + "policies.feedback.find.count_other": "Se encontraron {{count}} políticas que coinciden con los criterios", + "policies.feedback.find.none": "No se encontraron políticas.", + "policies.feedback.find.none.create": "No se encontró ninguna política para el directorio {{ruta}}. \nConfigure una nueva política.", + "policies.feedback.loading": "Cargando ...", + "policies.feedback.path.absolute": "Las políticas sólo se pueden definir para rutas absolutas.", + "policies.feedback.policy.find": "Ingrese al directorio para buscar o establecer una política", + "policies.header.actions": "Comportamiento", + "policies.header.defined": "Definido", + "policies.header.host": "Anfitrión", + "policies.header.path": "Camino", + "policies.header.username": "Nombre de usuario", + "policies.kind.all": "Todas las pólizas", + "policies.kind.applicable": "Políticas aplicables", + "policies.kind.global": "Políticas globales", + "policies.kind.host": "Políticas por host", + "policies.kind.local": "Políticas locales", + "policies.kind.user": "Políticas por usuario", + "repository.attribute.algorithm.eco": "Algoritmo de corrección de errores", + "repository.attribute.algorithm.encryption": "Algoritmo de cifrado", + "repository.attribute.algorithm.hash": "Algoritmo de hash", + "repository.attribute.algorithm.splitter": "Algoritmo de división", + "repository.attribute.compression.internal": "Compresión interna", + "repository.attribute.config.file": "Archivo de configuración", + "repository.attribute.connected.as": "Conectado como", + "repository.attribute.eco": "Overhead de corrección de errores", + "repository.attribute.format": "Formato del repositorio", + "repository.attribute.provider": "Proveedor", + "repository.attribute.server.url": "URL del servidor", + "repository.event.connection.cancel": "Cancelar conexión", + "repository.event.connection.disconnect": "Desconectar del repositorio", + "repository.event.description.update": "Actualizar descripción", + "repository.feedback.compression.internal.not.supported": "no", + "repository.feedback.compression.internal.supported": "sí", + "repository.feedback.description.required": "La descripción del repositorio es obligatoria", + "repository.feedback.eco.disabled": "Deshabilitado", + "repository.feedback.read.only": "El repositorio es de sólo lectura", + "repository.status.connected": "Conectado al repositorio", + "repository.status.initializing": "Inicializando el repositorio...", + "snapshot.event.create.estimate": "Estimar", + "snapshot.event.create.now": "Instantánea ahora", + "snapshot.event.create.path": "Ingrese la ruta a la instantánea", + "snapshot.event.create.path.resolve": "Debe especificar el directorio para la instantánea.", + "snapshot.event.delete.selected_one": "¿Quieres eliminar la instantánea {{count}} seleccionada?", + "snapshot.event.delete.selected_other": "¿Quieres eliminar las {{count}} instantáneas seleccionadas?", + "snapshot.event.directory.browse": "Navegar", + "snapshot.event.directory.browsing": "La exploración de directorios no es compatible con un navegador web. \nUtilice la interfaz de usuario de Kopia.", + "snapshot.event.directory.mount": "Montar como sistema de archivos local", + "snapshot.event.directory.restore": "Restaurar archivos y directorios", + "snapshot.event.directory.unmount": "Desmontar", + "snapshot.event.history.delete.source": "Eliminar fuente de instantánea", + "snapshot.event.history.description.update": "{{description}}: haga clic para actualizar la descripción de la instantánea.", + "snapshot.event.history.deselect.all": "Deseleccionar todo", + "snapshot.event.history.fetch.snapshots": "Obtener instantáneas", + "snapshot.event.history.pin.add": "Agregue un pin para proteger la instantánea contra la eliminación", + "snapshot.event.history.select.all": "Seleccionar todo", + "snapshot.event.history.selected.delete": "Eliminar seleccionado (", + "snapshot.event.restore": "Restaurar", + "snapshot.event.restore.begin": "Comenzar la restauración", + "snapshot.event.snapshot.new": "Nueva instantánea", + "snapshot.event.snapshot.pending": "Pendiente", + "snapshot.event.snapshot.policy": "Política", + "snapshot.event.synchronize": "Sincronizar", + "snapshot.feedback.directory.mount.restore": "Puede montar/restaurar todos los archivos y directorios que ve a continuación o restaurar archivos individualmente.", + "snapshot.feedback.history.display": "Mostrando", + "snapshot.feedback.history.wipe.all": "Borre todas las instantáneas y la política de esta fuente.", + "snapshot.feedback.restore.continue.errors": "Continuar en caso de errores", + "snapshot.feedback.restore.continue.errors.help": "Cuando se produce un error durante la restauración, intenta continuar en lugar de detenerse rápidamente.", + "snapshot.feedback.restore.destination": "Destino", + "snapshot.feedback.restore.destination.help": "También puedes restaurar a un archivo .zip o .tar proporcionando la extensión adecuada.", + "snapshot.feedback.restore.destination.path": "Introducir la ruta de destino", + "snapshot.feedback.restore.directory.overwrite": "Sobrescribir directorios", + "snapshot.feedback.restore.disable.compression.zip": "Desactivar compresión ZIP", + "snapshot.feedback.restore.disable.compression.zip.help": "No comprimir al restaurar en un archivo ZIP (más rápido).", + "snapshot.feedback.restore.file.atomically": "Escribir archivos atómicamente", + "snapshot.feedback.restore.file.modification.time": "Restaurar hora de modificación de archivos", + "snapshot.feedback.restore.file.overwrite": "Sobrescribir archivos", + "snapshot.feedback.restore.file.ownership": "Restaurar propiedad de archivos", + "snapshot.feedback.restore.file.permission": "Restaurar permisos de archivos", + "snapshot.feedback.restore.file.sparse": "Escribir archivos dispersos", + "snapshot.feedback.restore.link.overwrite": "Sobrescribir enlaces simbólicos", + "snapshot.feedback.restore.shallow.depth": "Restauración superficial a una profundidad específica", + "snapshot.feedback.restore.shallow.file.size.minimal": "Tamaño mínimo de archivo para restauración superficial", + "snapshot.feedback.restore.skip": "Saltar archivos y enlaces simbólicos restaurados previamente", + "snapshot.feedback.restore.task.go": "Ir a restaurar tarea", + "snapshot.feedback.snapshot.new": "Nueva instantánea", + "snapshot.feedback.snapshot.start": "La instantánea comenzará después de que se complete la instantánea anterior", + "snapshot.header.actions": "Acciones", + "snapshot.header.snapshot.last": "Última instantánea", + "snapshot.header.snapshot.next": "Siguiente instantánea", + "snapshot.header.snapshot.owner": "Dueño", + "snapshot.header.snapshot.path": "Ruta", + "snapshot.header.snapshot.size": "Tamaño", + "snapshot.header.status": "Estado", + "snapshot.history.feedack.unfiltered.count_one": "Mostrar {{count}} instantánea individual", + "snapshot.history.feedack.unfiltered.count_other": "Mostrar {{count}} instantáneas individuales", + "snapshot.history.header.description": "Descripción", + "snapshot.history.header.directories": "directorios", + "snapshot.history.header.files": "Archivos", + "snapshot.history.header.retention": "Retención", + "snapshot.history.header.root": "Raíz", + "snapshot.history.header.selected": "Seleccionado", + "snapshot.history.header.size": "Tamaño", + "snapshot.history.header.time.start": "Hora de inicio", + "tab.policies": "Políticas", + "tab.preferences": "Preferencias", + "tab.repository": "Depósito", + "tab.snapshots": "Copias de respaldo", + "tab.tasks": "Tareas", + "task.all": "Todas", + "task.event.stop": "Detener", + "task.failed": "Fallidas", + "task.feedback.entries": "Aquí aparecerá una lista de tareas cuando crees instantáneas, restaures, ejecutes mantenimiento, etc.", + "task.feedback.search": "Buscar registros por descripción", + "task.header.counter": "Contador", + "task.header.description": "Descripción", + "task.header.kind": "Tipo", + "task.header.status": "Estado", + "task.header.time.start": "Hora de inicio", + "task.header.value": "Valor", + "task.loading": "Cargando...", + "task.logs": "Registros", + "task.running": "En ejecución", + "task.status.canceled": "Tarea cancelada después de", + "task.status.canceling": "Cancelando", + "task.status.error": "Error en la tarea", + "task.status.finished": "Finalizada", + "task.status.running.for": "Tarea en ejecución durante", + "task.status.started": "Iniciada", + "task.status.succeed.after": "La tarea se completó con éxito después de", + "ui.feedback.byte-representation-description": "Selecciona la representación de bytes", + "ui.feedback.byte-representation-help": "Especifica la representación de bytes", + "ui.feedback.byte-representation-select": "Selecciona la representación de bytes", + "ui.feedback.pagesize-description": "Tamaño de página", + "ui.feedback.pagesize-help": "Especifica el tamaño de paginación en las tablas", + "ui.feedback.pagesize-hint": "Tamaño de página", + "ui.feedback.theme-description": "Tema", + "ui.feedback.theme-help": "El tema activo actual", + "ui.value.appearance-large": "grande", + "ui.value.appearance-medium": "mediano", + "ui.value.appearance-small": "pequeño", + "ui.value.theme-dark": "oscuro", + "ui.value.theme-light": "claro", + "ui.value.theme-ocean": "oceánico", + "ui.value.theme-pastel": "pastel" +} diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 1d7148bc..6e14bb75 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -1,118 +1,170 @@ { - "tab.preferences": "Préférences", - "tab.repository": "Répertoire", - "tab.tasks": "Tâches", - "tab.policies": "Politiques", - "tab.snapshots": "Instantanés", - - "common.return": "Retour", - - "task.all": "Tous", - "task.running": "En cours", - "task.failed": "Échoué", - "task.loading": "Chargement...", - "task.header.time.start": "Heure de début", - "task.header.status": "Statut", - "task.header.kind": "Type", - "task.header.description": "Description", - "task.feedback.search": "Rechercher des journaux par description", - "task.feedback.entries": "Une liste de tâches apparaîtra ici lorsque vous créerez des instantanés, restaurerez, exécuterez des opérations de maintenance, etc.", - "task.status.succeed.after": "Tâche réussie après", - "task.status.canceled": "Tâche annulée après", - "task.status.canceling": "Annulation en cours", - "task.status.error": "Erreur de tâche", - "task.status.running.for": "Tâche en cours depuis", - "task.status.started": "Démarré", - "task.status.finished": "Terminé", - "task.logs": "Journaux", - "task.event.stop": "Arrêter", - "task.header.counter": "Compteur", - "task.header.value": "Valeur", - - "snapshot.header.actions": "Actions", - "snapshot.header.status": "Statut", - "snapshot.header.snapshot.next": "Instantané suivant", - "snapshot.header.snapshot.last": "Dernier instantané", - "snapshot.header.snapshot.size": "Taille", - "snapshot.header.snapshot.owner": "Propriétaire", - "snapshot.header.snapshot.path": "Chemin", - "snapshot.event.snapshot.now": "Instantané maintenant", - "snapshot.event.snapshot.policy": "Politique", - "snapshot.event.snapshot.pending": "En attente", - "snapshot.feedback.snapshot.start": "L'instantané démarrera après la fin de l'instantané précédent", - "snapshot.event.snapshot.new": "Nouvel instantané", - "snapshot.event.synchronize": "Synchroniser", - - "snapshot.event.restore.task.go": "Aller à la tâche de restauration", - "snapshot.event.restore": "Restaurer", - "snapshot.feedback.restore.destination": "Destination", - "snapshot.feedback.restore.destination.path": "Entrez le chemin de destination", - "snapshot.feedback.restore.destination.help": "Vous pouvez également restaurer vers un fichier .zip ou .tar en fournissant l'extension appropriée.", - "snapshot.feedback.restore.skip": "Ignorer les fichiers et liens symboliques déjà restaurés", - "snapshot.feedback.restore.continue.errors": "Continuer en cas d'erreurs", - "snapshot.feedback.restore.continue.errors.help": "Lorsqu'une erreur de restauration se produit, essayez de continuer au lieu d'échouer rapidement.", - "snapshot.feedback.restore.file.ownership": "Restaurer la propriété des fichiers", - "snapshot.feedback.restore.file.permission": "Restaurer les permissions des fichiers", - "snapshot.feedback.restore.file.modification.time": "Restaurer l'heure de modification des fichiers", - "snapshot.feedback.restore.file.overwrite": "Écraser les fichiers", - "snapshot.feedback.restore.directory.overwrite": "Écraser les répertoires", - "snapshot.feedback.restore.link.overwrite": "Écraser les liens symboliques", - "snapshot.feedback.restore.file.atomically": "Écrire les fichiers de manière atomique", - "snapshot.feedback.restore.file.sparse": "Écrire les fichiers en mode sparse", - - "snapshot.feedback.restore.shallow.depth": "Restauration superficielle à une profondeur spécifique", - "snapshot.feedback.restore.shallow.file.size.minimal": "Taille minimale des fichiers pour une restauration superficielle", - "snapshot.feedback.restore.disable.compression.zip": "Désactiver la compression ZIP", - "snapshot.feedback.restore.disable.compression.zip.help": "Ne pas compresser lors de la restauration vers un fichier ZIP (plus rapide).", - "snapshot.event.restore.begin": "Démarrer la restauration", - - "repository.status.initializing": "Initialisation du répertoire...", - "repository.status.connected": "Connecté au répertoire", - "repository.event.connection.cancel": "Annuler la connexion", - "repository.event.connection.disconnect": "Déconnexion du répertoire", - "repository.event.description.update": "Mettre à jour la description", - "repository.feedback.description.required": "La description du répertoire est obligatoire", - "repository.feedback.read.only": "Le répertoire est en lecture seule", - "repository.feedback.eco.disabled": "Désactivé", - "repository.feedback.compression.internal.supported": "oui", - "repository.feedback.compression.internal.not.supported": "non", - "repository.attribute.server.url": "URL du serveur", - "repository.attribute.config.file": "Fichier de configuration", - "repository.attribute.provider": "Fournisseur", - "repository.attribute.algorithm.encryption": "Algorithme de chiffrement", - "repository.attribute.algorithm.hash": "Algorithme de hachage", - "repository.attribute.algorithm.splitter": "Algorithme de découpage", - "repository.attribute.algorithm.eco": "Algorithme de correction d'erreurs", - "repository.attribute.connected.as": "Connecté en tant que", - "repository.attribute.compression.internal": "Compression interne", - "repository.attribute.format": "Format du répertoire", - "repository.attribute.eco": "Surcoût de correction d'erreurs", - - "log.event.hide": "Masquer le journal", - "log.event.show": "Afficher le journal", - - "user.interface": "Interface utilisateur", - "user.interface.appearance": "Apparence", - "user.interface.appearance.hint": "Sélectionnez la taille de police", - "user.interface.appearance.help": "Spécifie l'apparence de l'interface utilisateur", - "user.interface.appearance.small": "petite", - "user.interface.appearance.medium": "moyenne", - "user.interface.appearance.large": "grande", - "user.interface.pagesize.description": "Taille de la page", - "user.interface.pagesize.help": "Spécifie la taille de pagination dans les tableaux", - "user.interface.pagesize.hint": "Taille de la page", - "user.interface.byte.representation.description": "Sélectionnez la représentation des octets", - "user.interface.byte.representation.select": "Sélectionnez la représentation des octets", - "user.interface.byte.representation.help": "Spécifie la représentation des octets", - "user.language": "Langue", - - "lang.help": "Définit la langue de l'interface utilisateur", - "lang.select": "Sélectionnez la langue", - - "theme.select": "Sélectionnez un thème", - "theme.help": "Le thème actif actuel", - "theme.dark": "sombre", - "theme.light": "clair", - "theme.pastel": "pastel", - "theme.ocean": "océan" -} \ No newline at end of file + "common.cancel": "Annuler", + "common.delete": "Supprimer", + "common.delete.confirm": "Confirmation de la suppression", + "common.loading": "Chargement ...", + "common.return": "Retour", + "description.event.cancel": "Annuler", + "description.event.new": "Entrez une nouvelle description", + "description.event.remove": "Supprimer la description", + "description.event.update": "Description de la mise à jour", + "description.feedback.description": "Description de l'instantané", + "feedback.ui.appearance": "Apparence", + "feedback.ui.appearance-help": "Spécifie l'apparence de l'interface utilisateur", + "feedback.ui.appearance-hint": "Sélectionnez la taille de police", + "feedback.ui.theme-select": "Sélectionnez un thème", + "log.event.hide": "Masquer le journal", + "log.event.show": "Afficher le journal", + "pin.event.add": "Ajouter une épingle", + "pin.event.cancel": "Annuler", + "pin.event.remove": "Supprimer l'épingle", + "pin.event.snapshot.pin": "Épingler un instantané", + "pin.event.update": "Mettre à jour l'épingle", + "pin.feedback.name": "Nom de la broche", + "pin.feedback.standard-text": "ne pas supprimer", + "policies.feedback.find.count_one": "{{count}} politiques correspondant aux critères ont été trouvées", + "policies.feedback.find.count_other": "{{count}} politiques correspondant aux critères ont été trouvées", + "policies.feedback.find.none": "Aucune politique trouvée.", + "policies.feedback.find.none.create": "Aucune stratégie trouvée pour le répertoire {{path}}. \nVeuillez configurer une nouvelle politique.", + "policies.feedback.loading": "Chargement ...", + "policies.feedback.path.absolute": "Les stratégies ne peuvent être définies que pour des chemins absolus.", + "policies.feedback.policy.find": "Entrez dans le répertoire pour rechercher ou définir une politique", + "policies.header.actions": "Actions", + "policies.header.defined": "Défini", + "policies.header.host": "Hôte", + "policies.header.path": "Chemin", + "policies.header.username": "Nom d'utilisateur", + "policies.kind.all": "Toutes les politiques", + "policies.kind.applicable": "Politiques applicables", + "policies.kind.global": "Politiques mondiales", + "policies.kind.host": "Politiques par hôte", + "policies.kind.local": "Politiques locales", + "policies.kind.user": "Politiques par utilisateur", + "repository.attribute.algorithm.eco": "Algorithme de correction d'erreurs", + "repository.attribute.algorithm.encryption": "Algorithme de chiffrement", + "repository.attribute.algorithm.hash": "Algorithme de hachage", + "repository.attribute.algorithm.splitter": "Algorithme de découpage", + "repository.attribute.compression.internal": "Compression interne", + "repository.attribute.config.file": "Fichier de configuration", + "repository.attribute.connected.as": "Connecté en tant que", + "repository.attribute.eco": "Surcoût de correction d'erreurs", + "repository.attribute.format": "Format du répertoire", + "repository.attribute.provider": "Fournisseur", + "repository.attribute.server.url": "URL du serveur", + "repository.event.connection.cancel": "Annuler la connexion", + "repository.event.connection.disconnect": "Déconnexion du répertoire", + "repository.event.description.update": "Mettre à jour la description", + "repository.feedback.compression.internal.not.supported": "non", + "repository.feedback.compression.internal.supported": "oui", + "repository.feedback.description.required": "La description du répertoire est obligatoire", + "repository.feedback.eco.disabled": "Désactivé", + "repository.feedback.read.only": "Le répertoire est en lecture seule", + "repository.status.connected": "Connecté au répertoire", + "repository.status.initializing": "Initialisation du répertoire...", + "snapshot.event.create.estimate": "Estimation", + "snapshot.event.create.now": "Instantané maintenant", + "snapshot.event.create.path": "Entrez le chemin d'accès à l'instantané", + "snapshot.event.create.path.resolve": "Doit spécifier le répertoire dans lequel prendre l'instantané.", + "snapshot.event.delete.selected_one": "Voulez-vous supprimer l'instantané {{count}} sélectionné ?", + "snapshot.event.delete.selected_other": "Voulez-vous supprimer les {{count}} instantanés sélectionnés ?", + "snapshot.event.directory.browse": "Parcourir", + "snapshot.event.directory.browsing": "La navigation dans les répertoires n'est pas prise en charge dans un navigateur Web. \nUtilisez l'interface utilisateur de Kopia.", + "snapshot.event.directory.mount": "Monter en tant que système de fichiers local", + "snapshot.event.directory.restore": "Restaurer des fichiers et des répertoires", + "snapshot.event.directory.unmount": "Démonter", + "snapshot.event.history.delete.source": "Supprimer la source de l'instantané", + "snapshot.event.history.description.update": "{{description}} : cliquez pour mettre à jour la description de l'instantané.", + "snapshot.event.history.deselect.all": "Tout déselectionner", + "snapshot.event.history.fetch.snapshots": "Récupérer des instantanés", + "snapshot.event.history.pin.add": "Ajouter une épingle pour protéger l'instantané de la suppression", + "snapshot.event.history.select.all": "Tout sélectionner", + "snapshot.event.history.selected.delete": "Supprimer sélectionnée (", + "snapshot.event.restore": "Restaurer", + "snapshot.event.restore.begin": "Démarrer la restauration", + "snapshot.event.snapshot.new": "Nouvel instantané", + "snapshot.event.snapshot.pending": "En attente", + "snapshot.event.snapshot.policy": "Politique", + "snapshot.event.synchronize": "Synchroniser", + "snapshot.feedback.directory.mount.restore": "Vous pouvez monter/restaurer tous les fichiers et répertoires que vous voyez ci-dessous ou restaurer les fichiers individuellement.", + "snapshot.feedback.history.display": "Affichage", + "snapshot.feedback.history.wipe.all": "Effacez tous les instantanés et la stratégie de cette source.", + "snapshot.feedback.restore.continue.errors": "Continuer en cas d'erreurs", + "snapshot.feedback.restore.continue.errors.help": "Lorsqu'une erreur de restauration se produit, essayez de continuer au lieu d'échouer rapidement.", + "snapshot.feedback.restore.destination": "Destination", + "snapshot.feedback.restore.destination.help": "Vous pouvez également restaurer vers un fichier .zip ou .tar en fournissant l'extension appropriée.", + "snapshot.feedback.restore.destination.path": "Entrez le chemin de destination", + "snapshot.feedback.restore.directory.overwrite": "Écraser les répertoires", + "snapshot.feedback.restore.disable.compression.zip": "Désactiver la compression ZIP", + "snapshot.feedback.restore.disable.compression.zip.help": "Ne pas compresser lors de la restauration vers un fichier ZIP (plus rapide).", + "snapshot.feedback.restore.file.atomically": "Écrire les fichiers de manière atomique", + "snapshot.feedback.restore.file.modification.time": "Restaurer l'heure de modification des fichiers", + "snapshot.feedback.restore.file.overwrite": "Écraser les fichiers", + "snapshot.feedback.restore.file.ownership": "Restaurer la propriété des fichiers", + "snapshot.feedback.restore.file.permission": "Restaurer les permissions des fichiers", + "snapshot.feedback.restore.file.sparse": "Écrire les fichiers en mode sparse", + "snapshot.feedback.restore.link.overwrite": "Écraser les liens symboliques", + "snapshot.feedback.restore.shallow.depth": "Restauration superficielle à une profondeur spécifique", + "snapshot.feedback.restore.shallow.file.size.minimal": "Taille minimale des fichiers pour une restauration superficielle", + "snapshot.feedback.restore.skip": "Ignorer les fichiers et liens symboliques déjà restaurés", + "snapshot.feedback.restore.task.go": "Aller à la tâche de restauration", + "snapshot.feedback.snapshot.new": "Nouvel instantané", + "snapshot.feedback.snapshot.start": "L'instantané démarrera après la fin de l'instantané précédent", + "snapshot.header.actions": "Actions", + "snapshot.header.snapshot.last": "Dernier instantané", + "snapshot.header.snapshot.next": "Instantané suivant", + "snapshot.header.snapshot.owner": "Propriétaire", + "snapshot.header.snapshot.path": "Chemin", + "snapshot.header.snapshot.size": "Taille", + "snapshot.header.status": "Statut", + "snapshot.history.feedack.unfiltered.count_one": "Afficher {{count}} instantané individuel", + "snapshot.history.feedack.unfiltered.count_other": "Afficher {{count}} instantanés individuels", + "snapshot.history.header.description": "Description", + "snapshot.history.header.directories": "Directeurs", + "snapshot.history.header.files": "Des dossiers", + "snapshot.history.header.retention": "Rétention", + "snapshot.history.header.root": "Racine", + "snapshot.history.header.selected": "Choisi", + "snapshot.history.header.size": "Taille", + "snapshot.history.header.time.start": "Heure de début", + "tab.policies": "Politiques", + "tab.preferences": "Préférences", + "tab.repository": "Répertoire", + "tab.snapshots": "Instantanés", + "tab.tasks": "Tâches", + "task.all": "Tous", + "task.event.stop": "Arrêter", + "task.failed": "Échoué", + "task.feedback.entries": "Une liste de tâches apparaîtra ici lorsque vous créerez des instantanés, restaurerez, exécuterez des opérations de maintenance, etc.", + "task.feedback.search": "Rechercher des journaux par description", + "task.header.counter": "Compteur", + "task.header.description": "Description", + "task.header.kind": "Type", + "task.header.status": "Statut", + "task.header.time.start": "Heure de début", + "task.header.value": "Valeur", + "task.loading": "Chargement...", + "task.logs": "Journaux", + "task.running": "En cours", + "task.status.canceled": "Tâche annulée après", + "task.status.canceling": "Annulation en cours", + "task.status.error": "Erreur de tâche", + "task.status.finished": "Terminé", + "task.status.running.for": "Tâche en cours depuis", + "task.status.started": "Démarré", + "task.status.succeed.after": "Tâche réussie après", + "ui.feedback.byte-representation-description": "Sélectionnez la représentation des octets", + "ui.feedback.byte-representation-help": "Spécifie la représentation des octets", + "ui.feedback.byte-representation-select": "Sélectionnez la représentation des octets", + "ui.feedback.pagesize-description": "Taille de la page", + "ui.feedback.pagesize-help": "Spécifie la taille de pagination dans les tableaux", + "ui.feedback.pagesize-hint": "Taille de la page", + "ui.feedback.theme-description": "Thème", + "ui.feedback.theme-help": "Le thème actif actuel", + "ui.value.appearance-large": "grande", + "ui.value.appearance-medium": "moyenne", + "ui.value.appearance-small": "petite", + "ui.value.theme-dark": "sombre", + "ui.value.theme-light": "clair", + "ui.value.theme-ocean": "océan", + "ui.value.theme-pastel": "pastel" +} diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index 51831fba..b3912bce 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -1,132 +1,170 @@ { - "tab.preferences": "Preferenze", - "tab.repository": "Repository", - "tab.tasks": "Attività", - "tab.policies": "Politiche", - "tab.snapshots": "Istantanee", - - "common.return": "Ritorno", - - "task.all": "Tutte", - "task.running": "In esecuzione", - "task.failed": "Fallite", - "task.loading": "Caricamento...", - "task.header.time.start": "Ora di inizio", - "task.header.status": "Stato", - "task.header.kind": "Tipo", - "task.header.description": "Descrizione", - "task.feedback.search": "Cerca log per descrizione", - "task.feedback.entries": "Un elenco di attività apparirà qui quando crei istantanee, ripristini, esegui manutenzione, ecc.", - - "task.status.succeed.after": "Attività completata dopo", - "task.status.canceled": "Attività annullata dopo", - "task.status.canceling": "Annullamento in corso", - "task.status.error": "Errore nell'attività", - "task.status.running.for": "Attività in esecuzione da", - - "task.status.started": "Avviata", - "task.status.finished": "Completata", - "task.logs": "Log", - - "task.event.stop": "Arresta", - "task.header.counter": "Contatore", - "task.header.value": "Valore", - - "snapshot.header.actions": "Azioni", - "snapshot.header.status": "Stato", - "snapshot.header.snapshot.next": "Prossima istantanea", - "snapshot.header.snapshot.last": "Ultima istantanea", - "snapshot.header.snapshot.size": "Dimensione", - "snapshot.header.snapshot.owner": "Proprietario", - "snapshot.header.snapshot.path": "Percorso", - - "snapshot.event.snapshot.now": "Crea Istantanea Ora", - "snapshot.event.snapshot.policy": "Politica", - "snapshot.event.snapshot.pending": "In attesa", - "snapshot.feedback.snapshot.start": "L'istantanea inizierà dopo il completamento dell'istantanea precedente", - "snapshot.event.snapshot.new": "Nuova Istantanea", - - "snapshot.event.synchronize":"Sincronizza", - - "snapshot.event.restore.task.go": "Vai alla task di ripristino", - "snapshot.event.restore": "Ripristina", - "snapshot.feedback.restore.destination": "Destinazione", - "snapshot.feedback.restore.destination.path": "Inserisci il percorso di destinazione", - "snapshot.feedback.restore.destination.help": "Puoi anche ripristinare in un file .zip o .tar fornendo l'estensione appropriata.", - "snapshot.feedback.restore.skip": "Salta i file e i collegamenti simbolici già ripristinati in precedenza", - "snapshot.feedback.restore.continue.errors": "Continua in caso di errori", - "snapshot.feedback.restore.continue.errors.help": "Quando si verifica un errore durante il ripristino, prova a continuare invece di interrompere rapidamente.", - "snapshot.feedback.restore.file.ownership": "Ripristina la proprietà dei file", - "snapshot.feedback.restore.file.permission": "Ripristina i permessi dei file", - "snapshot.feedback.restore.file.modification.time": "Ripristina l'orario di modifica dei file", - "snapshot.feedback.restore.file.overwrite": "Sovrascrivi i file", - "snapshot.feedback.restore.directory.overwrite": "Sovrascrivi le directory", - "snapshot.feedback.restore.link.overwrite": "Sovrascrivi i collegamenti simbolici", - "snapshot.feedback.restore.file.atomically": "Scrivi i file atomicamente", - "snapshot.feedback.restore.file.sparse": "Scrivi file sparsi", - - "snapshot.feedback.restore.shallow.depth": "Ripristino superficiale a una profondità specifica", - "snapshot.feedback.restore.shallow.file.size.minimal": "Dimensione minima del file per il ripristino superficiale", - "snapshot.feedback.restore.disable.compression.zip": "Disabilita la compressione ZIP", - "snapshot.feedback.restore.disable.compression.zip.help": "Non comprimere quando si ripristina in un file ZIP (più veloce).", - "snapshot.event.restore.begin": "Inizia il ripristino", - - "repository.status.initializing": "Inizializzazione del repository...", - "repository.status.connected": "Connesso al repository", - "repository.event.connection.cancel":"Annulla connessione", - "repository.event.connection.disconnect": "Disconnetti dal repository", - "repository.event.description.update": "Aggiorna descrizione", - - "repository.feedback.description.required":"La descrizione del repository è obbligatoria", - "repository.feedback.read.only": "Il repository è in sola lettura", - "repository.feedback.eco.disabled":"Disabilitato", - "repository.feedback.compression.internal.supported": "sì", - "repository.feedback.compression.internal.not.supported": "no", - - "repository.attribute.server.url": "URL del server", - "repository.attribute.config.file": "File di configurazione", - "repository.attribute.provider": "Provider", - "repository.attribute.algorithm.encryption": "Algoritmo di crittografia", - "repository.attribute.algorithm.hash": "Algoritmo di hash", - "repository.attribute.algorithm.splitter": "Algoritmo di suddivisione", - "repository.attribute.algorithm.eco": "Algoritmo di correzione degli errori", - - "repository.attribute.connected.as": "Connesso come", - "repository.attribute.compression.internal": "Compressione interna", - "repository.attribute.format": "Formato del repository", - "repository.attribute.eco": "Overhead di correzione degli errori", - - "log.event.hide": "Nascondi log", - "log.event.show": "Mostra log", - - "user.interface": "Interfaccia utente", - "user.interface.appearance":"Aspetto", - "user.interface.appearance.hint":"Seleziona la dimensione del carattere", - "user.interface.appearance.help": "Specifica l'aspetto dell'interfaccia utente", - - "user.interface.appearance.small": "piccolo", - "user.interface.appearance.medium": "medio", - "user.interface.appearance.large": "grande", - - "user.interface.pagesize.description": "Dimensione pagina", - "user.interface.pagesize.help": "Specifica la dimensione di paginazione nelle tabelle", - "user.interface.pagesize.hint": "Dimensione pagina", - - "user.interface.byte.representation.description": "Seleziona la rappresentazione dei byte", - "user.interface.byte.representation.select": "Seleziona la rappresentazione dei byte", - "user.interface.byte.representation.help": "Specifica la rappresentazione dei byte", - - "user.language": "Lingua", - - "lang.help": "Imposta la lingua per l'interfaccia utente", - "lang.select": "Seleziona la lingua", - "lang.description": "Seleziona la lingua", - - "theme.description": "Tema", - "theme.select": "Seleziona il tema", - "theme.help": "Il tema attivo corrente", - "theme.dark": "scuro", - "theme.light": "chiaro", - "theme.pastel": "pastello", - "theme.ocean": "oceano" -} \ No newline at end of file + "common.cancel": "Annulla", + "common.delete": "Eliminare", + "common.delete.confirm": "Conferma cancellazione", + "common.loading": "Caricamento ...", + "common.return": "Ritorno", + "description.event.cancel": "Annulla", + "description.event.new": "Inserisci una nuova descrizione", + "description.event.remove": "Rimuovi descrizione", + "description.event.update": "Descrizione dell'aggiornamento", + "description.feedback.description": "Descrizione dell'istantanea", + "feedback.ui.appearance": "Aspetto", + "feedback.ui.appearance-help": "Specifica l'aspetto dell'interfaccia utente", + "feedback.ui.appearance-hint": "Seleziona la dimensione del carattere", + "feedback.ui.theme-select": "Seleziona il tema", + "log.event.hide": "Nascondi log", + "log.event.show": "Mostra log", + "pin.event.add": "Aggiungi puntina", + "pin.event.cancel": "Annulla", + "pin.event.remove": "Rimuovi perno", + "pin.event.snapshot.pin": "Pin istantanea", + "pin.event.update": "Aggiorna perno", + "pin.feedback.name": "Nome del perno", + "pin.feedback.standard-text": "non cancellare", + "policies.feedback.find.count_one": "Trovata {{count}} policy corrispondente ai criteri", + "policies.feedback.find.count_other": "Trovate {{count}} politiche che corrispondono ai criteri", + "policies.feedback.find.none": "Nessuna politica trovata.", + "policies.feedback.find.none.create": "Nessuna policy trovata per la directory {{path}}. \nImposta una nuova policy.", + "policies.feedback.loading": "Caricamento ...", + "policies.feedback.path.absolute": "Le policy possono essere definite solo per percorsi assoluti.", + "policies.feedback.policy.find": "Inserisci la directory per trovare o impostare la policy", + "policies.header.actions": "Azioni", + "policies.header.defined": "Definito", + "policies.header.host": "Ospite", + "policies.header.path": "Sentiero", + "policies.header.username": "Nome utente", + "policies.kind.all": "Tutte le politiche", + "policies.kind.applicable": "Politiche applicabili", + "policies.kind.global": "Politiche globali", + "policies.kind.host": "Politiche per host", + "policies.kind.local": "Politiche locali", + "policies.kind.user": "Criteri per utente", + "repository.attribute.algorithm.eco": "Algoritmo di correzione degli errori", + "repository.attribute.algorithm.encryption": "Algoritmo di crittografia", + "repository.attribute.algorithm.hash": "Algoritmo di hash", + "repository.attribute.algorithm.splitter": "Algoritmo di suddivisione", + "repository.attribute.compression.internal": "Compressione interna", + "repository.attribute.config.file": "File di configurazione", + "repository.attribute.connected.as": "Connesso come", + "repository.attribute.eco": "Overhead di correzione degli errori", + "repository.attribute.format": "Formato del repository", + "repository.attribute.provider": "Provider", + "repository.attribute.server.url": "URL del server", + "repository.event.connection.cancel": "Annulla connessione", + "repository.event.connection.disconnect": "Disconnetti dal repository", + "repository.event.description.update": "Aggiorna descrizione", + "repository.feedback.compression.internal.not.supported": "no", + "repository.feedback.compression.internal.supported": "sì", + "repository.feedback.description.required": "La descrizione del repository è obbligatoria", + "repository.feedback.eco.disabled": "Disabilitato", + "repository.feedback.read.only": "Il repository è in sola lettura", + "repository.status.connected": "Connesso al repository", + "repository.status.initializing": "Inizializzazione del repository...", + "snapshot.event.create.estimate": "Stima", + "snapshot.event.create.now": "Scatta subito un'istantanea", + "snapshot.event.create.path": "Inserisci il percorso dello snapshot", + "snapshot.event.create.path.resolve": "È necessario specificare la directory in cui eseguire lo snapshot.", + "snapshot.event.delete.selected_one": "Vuoi eliminare lo snapshot {{count}} selezionato?", + "snapshot.event.delete.selected_other": "Vuoi eliminare le istantanee {{count}} selezionate?", + "snapshot.event.directory.browse": "Navigare", + "snapshot.event.directory.browsing": "L'esplorazione delle directory non è supportata in un browser Web. \nUtilizza l'interfaccia utente di Copia.", + "snapshot.event.directory.mount": "Monta come file system locale", + "snapshot.event.directory.restore": "Ripristina file e directory", + "snapshot.event.directory.unmount": "Smonta", + "snapshot.event.history.delete.source": "Elimina origine istantanea", + "snapshot.event.history.description.update": "{{description}}: fai clic per aggiornare la descrizione dell'istantanea.", + "snapshot.event.history.deselect.all": "Deselezionare tutto", + "snapshot.event.history.fetch.snapshots": "Recupera istantanee", + "snapshot.event.history.pin.add": "Aggiungi un segnaposto per proteggere l'istantanea dall'eliminazione", + "snapshot.event.history.select.all": "Seleziona tutto", + "snapshot.event.history.selected.delete": "Elimina selezionato (", + "snapshot.event.restore": "Ripristina", + "snapshot.event.restore.begin": "Inizia il ripristino", + "snapshot.event.snapshot.new": "Nuova Istantanea", + "snapshot.event.snapshot.pending": "In attesa", + "snapshot.event.snapshot.policy": "Politica", + "snapshot.event.synchronize": "Sincronizza", + "snapshot.feedback.directory.mount.restore": "Puoi montare/ripristinare tutti i file e le directory che vedi di seguito o ripristinare i file individualmente.", + "snapshot.feedback.history.display": "Visualizzazione", + "snapshot.feedback.history.wipe.all": "Cancella tutti gli snapshot e la policy per questa origine.", + "snapshot.feedback.restore.continue.errors": "Continua in caso di errori", + "snapshot.feedback.restore.continue.errors.help": "Quando si verifica un errore durante il ripristino, prova a continuare invece di interrompere rapidamente.", + "snapshot.feedback.restore.destination": "Destinazione", + "snapshot.feedback.restore.destination.help": "Puoi anche ripristinare in un file .zip o .tar fornendo l'estensione appropriata.", + "snapshot.feedback.restore.destination.path": "Inserisci il percorso di destinazione", + "snapshot.feedback.restore.directory.overwrite": "Sovrascrivi le directory", + "snapshot.feedback.restore.disable.compression.zip": "Disabilita la compressione ZIP", + "snapshot.feedback.restore.disable.compression.zip.help": "Non comprimere quando si ripristina in un file ZIP (più veloce).", + "snapshot.feedback.restore.file.atomically": "Scrivi i file atomicamente", + "snapshot.feedback.restore.file.modification.time": "Ripristina l'orario di modifica dei file", + "snapshot.feedback.restore.file.overwrite": "Sovrascrivi i file", + "snapshot.feedback.restore.file.ownership": "Ripristina la proprietà dei file", + "snapshot.feedback.restore.file.permission": "Ripristina i permessi dei file", + "snapshot.feedback.restore.file.sparse": "Scrivi file sparsi", + "snapshot.feedback.restore.link.overwrite": "Sovrascrivi i collegamenti simbolici", + "snapshot.feedback.restore.shallow.depth": "Ripristino superficiale a una profondità specifica", + "snapshot.feedback.restore.shallow.file.size.minimal": "Dimensione minima del file per il ripristino superficiale", + "snapshot.feedback.restore.skip": "Salta i file e i collegamenti simbolici già ripristinati in precedenza", + "snapshot.feedback.restore.task.go": "Vai a Ripristina attività", + "snapshot.feedback.snapshot.new": "Nuova istantanea", + "snapshot.feedback.snapshot.start": "L'istantanea inizierà dopo il completamento dell'istantanea precedente", + "snapshot.header.actions": "Azioni", + "snapshot.header.snapshot.last": "Ultima istantanea", + "snapshot.header.snapshot.next": "Prossima istantanea", + "snapshot.header.snapshot.owner": "Proprietario", + "snapshot.header.snapshot.path": "Percorso", + "snapshot.header.snapshot.size": "Dimensione", + "snapshot.header.status": "Stato", + "snapshot.history.feedack.unfiltered.count_one": "Mostra {{count}} istantanea individuale", + "snapshot.history.feedack.unfiltered.count_other": "Mostra {{count}} istantanee individuali", + "snapshot.history.header.description": "Descrizione", + "snapshot.history.header.directories": "Dir", + "snapshot.history.header.files": "File", + "snapshot.history.header.retention": "Ritenzione", + "snapshot.history.header.root": "Radice", + "snapshot.history.header.selected": "Selezionato", + "snapshot.history.header.size": "Misurare", + "snapshot.history.header.time.start": "Ora di inizio", + "tab.policies": "Politiche", + "tab.preferences": "Preferenze", + "tab.repository": "Repository", + "tab.snapshots": "Istantanee", + "tab.tasks": "Attività", + "task.all": "Tutte", + "task.event.stop": "Arresta", + "task.failed": "Fallite", + "task.feedback.entries": "Un elenco di attività apparirà qui quando crei istantanee, ripristini, esegui manutenzione, ecc.", + "task.feedback.search": "Cerca log per descrizione", + "task.header.counter": "Contatore", + "task.header.description": "Descrizione", + "task.header.kind": "Tipo", + "task.header.status": "Stato", + "task.header.time.start": "Ora di inizio", + "task.header.value": "Valore", + "task.loading": "Caricamento...", + "task.logs": "Log", + "task.running": "In esecuzione", + "task.status.canceled": "Attività annullata dopo", + "task.status.canceling": "Annullamento in corso", + "task.status.error": "Errore nell'attività", + "task.status.finished": "Completata", + "task.status.running.for": "Attività in esecuzione da", + "task.status.started": "Avviata", + "task.status.succeed.after": "Attività completata dopo", + "ui.feedback.byte-representation-description": "Seleziona la rappresentazione dei byte", + "ui.feedback.byte-representation-help": "Specifica la rappresentazione dei byte", + "ui.feedback.byte-representation-select": "Seleziona la rappresentazione dei byte", + "ui.feedback.pagesize-description": "Dimensione pagina", + "ui.feedback.pagesize-help": "Specifica la dimensione di paginazione nelle tabelle", + "ui.feedback.pagesize-hint": "Dimensione pagina", + "ui.feedback.theme-description": "Tema", + "ui.feedback.theme-help": "Il tema attivo corrente", + "ui.value.appearance-large": "grande", + "ui.value.appearance-medium": "medio", + "ui.value.appearance-small": "piccolo", + "ui.value.theme-dark": "scuro", + "ui.value.theme-light": "chiaro", + "ui.value.theme-ocean": "oceano", + "ui.value.theme-pastel": "pastello" +} diff --git a/public/locales/jp/translation.json b/public/locales/jp/translation.json index 9afe52ae..f970004b 100644 --- a/public/locales/jp/translation.json +++ b/public/locales/jp/translation.json @@ -1,132 +1,170 @@ { - "tab.preferences": "設定", - "tab.repository": "リポジトリ", - "tab.tasks": "タスク", - "tab.policies": "ポリシー", - "tab.snapshots": "スナップショット", - - "common.return": "戻る", - - "task.all": "すべて", - "task.running": "実行中", - "task.failed": "失敗", - "task.loading": "読み込み中...", - "task.header.time.start": "開始時刻", - "task.header.status": "ステータス", - "task.header.kind": "種類", - "task.header.description": "説明", - "task.feedback.search": "説明でログを検索", - "task.feedback.entries": "スナップショットを作成したり、復元したり、メンテナンスを実行したりすると、ここにタスクの一覧が表示されます。", - - "task.status.succeed.after": "タスクは成功しました。", - "task.status.canceled": "タスクはキャンセルされました。", - "task.status.canceling": "キャンセル中", - "task.status.error": "タスクエラー", - "task.status.running.for": "タスク実行中", - - "task.status.started": "開始済み", - "task.status.finished": "完了済み", - "task.logs": "ログ", - - "task.event.stop": "停止", - "task.header.counter": "カウンター", - "task.header.value": "値", - - "snapshot.header.actions": "アクション", - "snapshot.header.status": "ステータス", - "snapshot.header.snapshot.next": "次のスナップショット", - "snapshot.header.snapshot.last": "最後のスナップショット", - "snapshot.header.snapshot.size": "サイズ", - "snapshot.header.snapshot.owner": "オーナー", - "snapshot.header.snapshot.path": "パス", - - "snapshot.event.snapshot.now": "スナップショットを作成", - "snapshot.event.snapshot.policy": "ポリシー", - "snapshot.event.snapshot.pending": "保留中", - "snapshot.feedback.snapshot.start": "前のスナップショットが完了した後にスナップショットが開始されます", - "snapshot.event.snapshot.new": "新しいスナップショット", - - "snapshot.event.synchronize": "同期", - - "snapshot.event.restore.task.go": "復元タスクに移動", - "snapshot.event.restore": "復元", - "snapshot.feedback.restore.destination": "宛先", - "snapshot.feedback.restore.destination.path": "宛先パスを入力", - "snapshot.feedback.restore.destination.help": "適切な拡張子を指定することで、.zipまたは.tarファイルにも復元できます。", - "snapshot.feedback.restore.skip": "以前に復元されたファイルとシンボリックリンクをスキップ", - "snapshot.feedback.restore.continue.errors": "エラーが発生した場合に続行", - "snapshot.feedback.restore.continue.errors.help": "復元エラーが発生した場合、即座に失敗せずに続行を試みます。", - "snapshot.feedback.restore.file.ownership": "ファイル所有権を復元", - "snapshot.feedback.restore.file.permission": "ファイルのアクセス権を復元", - "snapshot.feedback.restore.file.modification.time": "ファイルの変更時刻を復元", - "snapshot.feedback.restore.file.overwrite": "ファイルを上書き", - "snapshot.feedback.restore.directory.overwrite": "ディレクトリを上書き", - "snapshot.feedback.restore.link.overwrite": "シンボリックリンクを上書き", - "snapshot.feedback.restore.file.atomically": "ファイルをアトミックに書き込む", - "snapshot.feedback.restore.file.sparse": "スパースファイルを書き込む", - - "snapshot.feedback.restore.shallow.depth": "指定の深さで浅い復元", - "snapshot.feedback.restore.shallow.file.size.minimal": "浅い復元の最小ファイルサイズ", - "snapshot.feedback.restore.disable.compression.zip": "ZIP圧縮を無効にする", - "snapshot.feedback.restore.disable.compression.zip.help": "ZIPファイルへの復元時に圧縮しない(高速)。", - "snapshot.event.restore.begin": "復元を開始", - - "repository.status.initializing": "リポジトリの初期化中...", - "repository.status.connected": "リポジトリに接続済み", - "repository.event.connection.cancel": "接続をキャンセル", - "repository.event.connection.disconnect": "リポジトリから切断", - "repository.event.description.update": "説明を更新", - - "repository.feedback.description.required": "リポジトリの説明は必須です", - "repository.feedback.read.only": "リポジトリは読み取り専用です", - "repository.feedback.eco.disabled": "無効", - "repository.feedback.compression.internal.supported": "はい", - "repository.feedback.compression.internal.not.supported": "いいえ", - - "repository.attribute.server.url": "サーバーのURL", - "repository.attribute.config.file": "設定ファイル", - "repository.attribute.provider": "プロバイダー", - "repository.attribute.algorithm.encryption": "暗号化アルゴリズム", - "repository.attribute.algorithm.hash": "ハッシュアルゴリズム", - "repository.attribute.algorithm.splitter": "分割アルゴリズム", - "repository.attribute.algorithm.eco": "エラー訂正アルゴリズム", - - "repository.attribute.connected.as": "接続されたユーザー", - "repository.attribute.compression.internal": "内部圧縮", - "repository.attribute.format": "リポジトリの形式", - "repository.attribute.eco": "エラー訂正オーバーヘッド", - - "log.event.hide": "ログを非表示", - "log.event.show": "ログを表示", - - "user.interface": "ユーザーインターフェース", - "user.interface.appearance": "外観", - "user.interface.appearance.hint": "フォントサイズを選択", - "user.interface.appearance.help": "ユーザーインターフェースの外観を指定します", - - "user.interface.appearance.small": "小", - "user.interface.appearance.medium": "中", - "user.interface.appearance.large": "大", - - "user.interface.pagesize.description": "ページサイズ", - "user.interface.pagesize.help": "テーブルのページネーションサイズを指定します", - "user.interface.pagesize.hint": "ページサイズ", - - "user.interface.byte.representation.description": "バイトの表現を選択", - "user.interface.byte.representation.select": "バイトの表現を選択", - "user.interface.byte.representation.help": "バイトの表現を指定します", - - "user.language": "言語", - - "lang.help": "ユーザーインターフェースの言語を設定します", - "lang.select": "言語を選択", - "lang.description": "言語を選択してください", - - "theme.description": "テーマ", - "theme.select": "テーマを選択", - "theme.help": "現在のアクティブなテーマ", - "theme.dark": "ダーク", - "theme.light": "ライト", - "theme.pastel": "パステル", - "theme.ocean": "オーシャン" + "common.cancel": "Cancel", + "common.delete": "Delete", + "common.delete.confirm": "Confirm Delete", + "common.loading": "Loading ...", + "common.return": "戻る", + "description.event.cancel": "Cancel", + "description.event.new": "Enter new description", + "description.event.remove": "Remove Description", + "description.event.update": "Update Description", + "description.feedback.description": "Snapshot Description", + "feedback.ui.appearance": "外観", + "feedback.ui.appearance-help": "ユーザーインターフェースの外観を指定します", + "feedback.ui.appearance-hint": "フォントサイズを選択", + "feedback.ui.theme-select": "テーマを選択", + "log.event.hide": "ログを非表示", + "log.event.show": "ログを表示", + "pin.event.add": "Add Pin", + "pin.event.cancel": "Cancel", + "pin.event.remove": "Remove Pin", + "pin.event.snapshot.pin": "Pin Snapshot", + "pin.event.update": "Update Pin", + "pin.feedback.name": "Name of the pin", + "pin.feedback.standard-text": "do-not-delete", + "policies.feedback.find.count_one": "Found {{count}} policy matching the criteria", + "policies.feedback.find.count_other": "Found {{count}} policies matching the criteria", + "policies.feedback.find.none": "No policies found.", + "policies.feedback.find.none.create": "No policy found for directory {{path}}. Please setup a new policy.", + "policies.feedback.loading": "Loading ...", + "policies.feedback.path.absolute": "Policies can only be defined for absolute paths.", + "policies.feedback.policy.find": "Enter directory to find or set policy", + "policies.header.actions": "Actions", + "policies.header.defined": "Defined", + "policies.header.host": "Host", + "policies.header.path": "Path", + "policies.header.username": "Username", + "policies.kind.all": "All policies", + "policies.kind.applicable": "Applicable policies", + "policies.kind.global": "Global policies", + "policies.kind.host": "Per-Host policies", + "policies.kind.local": "Local policies", + "policies.kind.user": "Per-User policies", + "repository.attribute.algorithm.eco": "エラー訂正アルゴリズム", + "repository.attribute.algorithm.encryption": "暗号化アルゴリズム", + "repository.attribute.algorithm.hash": "ハッシュアルゴリズム", + "repository.attribute.algorithm.splitter": "分割アルゴリズム", + "repository.attribute.compression.internal": "内部圧縮", + "repository.attribute.config.file": "設定ファイル", + "repository.attribute.connected.as": "接続されたユーザー", + "repository.attribute.eco": "エラー訂正オーバーヘッド", + "repository.attribute.format": "リポジトリの形式", + "repository.attribute.provider": "プロバイダー", + "repository.attribute.server.url": "サーバーのURL", + "repository.event.connection.cancel": "接続をキャンセル", + "repository.event.connection.disconnect": "リポジトリから切断", + "repository.event.description.update": "説明を更新", + "repository.feedback.compression.internal.not.supported": "いいえ", + "repository.feedback.compression.internal.supported": "はい", + "repository.feedback.description.required": "リポジトリの説明は必須です", + "repository.feedback.eco.disabled": "無効", + "repository.feedback.read.only": "リポジトリは読み取り専用です", + "repository.status.connected": "リポジトリに接続済み", + "repository.status.initializing": "リポジトリの初期化中...", + "snapshot.event.create.estimate": "Estimate", + "snapshot.event.create.now": "Snapshot now", + "snapshot.event.create.path": "Enter path to snapshot", + "snapshot.event.create.path.resolve": "Must specify directory to snapshot.", + "snapshot.event.delete.selected_one": "Do you want to delete the selected {{count}} snapshot?", + "snapshot.event.delete.selected_other": "Do you want to delete the selected {{count}} snapshots?", + "snapshot.event.directory.browse": "Browse", + "snapshot.event.directory.browsing": "Directory browsing is not supported in a web browser. Use Kopia UI.", + "snapshot.event.directory.mount": "Mount as Local Filesystem", + "snapshot.event.directory.restore": "Restore files and directories", + "snapshot.event.directory.unmount": "Unmount", + "snapshot.event.history.delete.source": "Delete Snapshot Source", + "snapshot.event.history.description.update": "{{description}} - Click to update snapshot description.", + "snapshot.event.history.deselect.all": "Deselect All", + "snapshot.event.history.fetch.snapshots": "Fetch snapshots", + "snapshot.event.history.pin.add": "Add a pin to protect snapshot from deletion", + "snapshot.event.history.select.all": "Select All", + "snapshot.event.history.selected.delete": "Delete Selected (", + "snapshot.event.restore": "復元", + "snapshot.event.restore.begin": "復元を開始", + "snapshot.event.snapshot.new": "新しいスナップショット", + "snapshot.event.snapshot.pending": "保留中", + "snapshot.event.snapshot.policy": "ポリシー", + "snapshot.event.synchronize": "同期", + "snapshot.feedback.directory.mount.restore": "You can mount/restore all the files and directories that you see below or restore files individually.", + "snapshot.feedback.history.display": "Displaying", + "snapshot.feedback.history.wipe.all": "Wipe all snapshots and the policy for this source.", + "snapshot.feedback.restore.continue.errors": "エラーが発生した場合に続行", + "snapshot.feedback.restore.continue.errors.help": "復元エラーが発生した場合、即座に失敗せずに続行を試みます。", + "snapshot.feedback.restore.destination": "宛先", + "snapshot.feedback.restore.destination.help": "適切な拡張子を指定することで、.zipまたは.tarファイルにも復元できます。", + "snapshot.feedback.restore.destination.path": "宛先パスを入力", + "snapshot.feedback.restore.directory.overwrite": "ディレクトリを上書き", + "snapshot.feedback.restore.disable.compression.zip": "ZIP圧縮を無効にする", + "snapshot.feedback.restore.disable.compression.zip.help": "ZIPファイルへの復元時に圧縮しない(高速)。", + "snapshot.feedback.restore.file.atomically": "ファイルをアトミックに書き込む", + "snapshot.feedback.restore.file.modification.time": "ファイルの変更時刻を復元", + "snapshot.feedback.restore.file.overwrite": "ファイルを上書き", + "snapshot.feedback.restore.file.ownership": "ファイル所有権を復元", + "snapshot.feedback.restore.file.permission": "ファイルのアクセス権を復元", + "snapshot.feedback.restore.file.sparse": "スパースファイルを書き込む", + "snapshot.feedback.restore.link.overwrite": "シンボリックリンクを上書き", + "snapshot.feedback.restore.shallow.depth": "指定の深さで浅い復元", + "snapshot.feedback.restore.shallow.file.size.minimal": "浅い復元の最小ファイルサイズ", + "snapshot.feedback.restore.skip": "以前に復元されたファイルとシンボリックリンクをスキップ", + "snapshot.feedback.restore.task.go": "Go To Restore Task", + "snapshot.feedback.snapshot.new": "New Snapshot", + "snapshot.feedback.snapshot.start": "前のスナップショットが完了した後にスナップショットが開始されます", + "snapshot.header.actions": "アクション", + "snapshot.header.snapshot.last": "最後のスナップショット", + "snapshot.header.snapshot.next": "次のスナップショット", + "snapshot.header.snapshot.owner": "オーナー", + "snapshot.header.snapshot.path": "パス", + "snapshot.header.snapshot.size": "サイズ", + "snapshot.header.status": "ステータス", + "snapshot.history.feedack.unfiltered.count_one": "Show {{count}} individual snapshot", + "snapshot.history.feedack.unfiltered.count_other": "Show {{count}} individual snapshots", + "snapshot.history.header.description": "Description", + "snapshot.history.header.directories": "Dirs", + "snapshot.history.header.files": "Files", + "snapshot.history.header.retention": "Retention", + "snapshot.history.header.root": "Root", + "snapshot.history.header.selected": "Selected", + "snapshot.history.header.size": "Size", + "snapshot.history.header.time.start": "Start time", + "tab.policies": "ポリシー", + "tab.preferences": "設定", + "tab.repository": "リポジトリ", + "tab.snapshots": "スナップショット", + "tab.tasks": "タスク", + "task.all": "すべて", + "task.event.stop": "停止", + "task.failed": "失敗", + "task.feedback.entries": "スナップショットを作成したり、復元したり、メンテナンスを実行したりすると、ここにタスクの一覧が表示されます。", + "task.feedback.search": "説明でログを検索", + "task.header.counter": "カウンター", + "task.header.description": "説明", + "task.header.kind": "種類", + "task.header.status": "ステータス", + "task.header.time.start": "開始時刻", + "task.header.value": "値", + "task.loading": "読み込み中...", + "task.logs": "ログ", + "task.running": "実行中", + "task.status.canceled": "タスクはキャンセルされました。", + "task.status.canceling": "キャンセル中", + "task.status.error": "タスクエラー", + "task.status.finished": "完了済み", + "task.status.running.for": "タスク実行中", + "task.status.started": "開始済み", + "task.status.succeed.after": "タスクは成功しました。", + "ui.feedback.byte-representation-description": "バイトの表現を選択", + "ui.feedback.byte-representation-help": "バイトの表現を指定します", + "ui.feedback.byte-representation-select": "バイトの表現を選択", + "ui.feedback.pagesize-description": "ページサイズ", + "ui.feedback.pagesize-help": "テーブルのページネーションサイズを指定します", + "ui.feedback.pagesize-hint": "ページサイズ", + "ui.feedback.theme-description": "テーマ", + "ui.feedback.theme-help": "現在のアクティブなテーマ", + "ui.value.appearance-large": "大", + "ui.value.appearance-medium": "中", + "ui.value.appearance-small": "小", + "ui.value.theme-dark": "ダーク", + "ui.value.theme-light": "ライト", + "ui.value.theme-ocean": "オーシャン", + "ui.value.theme-pastel": "パステル" } diff --git a/public/locales/pl/translation.json b/public/locales/pl/translation.json index 44ce0cf2..593a9721 100644 --- a/public/locales/pl/translation.json +++ b/public/locales/pl/translation.json @@ -1,114 +1,170 @@ { - "tab.preferences":"Ustawienia", - "tab.repository":"Repozytorium", - "tab.tasks":"Zadania", - "tab.policies":"Konfiguracje", - "tab.snapshots":"Kopie", - - "common.return": "Wróć", - - "task.all":"wszystkie", - "task.running":"w toku", - "task.failed":"nieudane", - "task.loading": "Wczytywanie...", - "task.time.start": "Początek", - "task.status": "Status", - "task.kind": "Rodzaj", - "task.description": "Opis", - - "task.status.succeed.after": "Zadanie zakończone po", - "task.status.canceled": "Zadanie anulowane po", - "task.status.canceling": "Anulowanie", - "task.status.error": "Błąd", - "task.status.running.for": "Zadanie w toku od", - - "task.status.started": "Rozpoczęte", - "task.status.finished": "Zakończone", - "task.logs": "Logi", - - "task.event.stop": "Zatrzymaj", - "task.header.counter": "Licznik", - "task.header.value": "Wartość", - - "snapshot.event.restore.task.go": "Przejdź do zadania przywracania", - "snapshot.event.restore": "Przywróć", - "snapshot.feedback.restore.destination": "Cel", - "snapshot.feedback.restore.destination.path": "Wprowadź ścieżkę docelową", - "snapshot.feedback.restore.destination.help": "Możesz również przywrócić do pliku .zip lub .tar, podając odpowiednie rozszerzenie.", - "snapshot.feedback.restore.skip": "Pomiń wcześniej przywrócone pliki i dowiązania symboliczne", - "snapshot.feedback.restore.continue.errors": "Kontynuuj w przypadku błędów", - "snapshot.feedback.restore.continue.errors.help": "Gdy wystąpi błąd przywracania, spróbuj kontynuować zamiast szybko zakończyć.", - "snapshot.feedback.restore.file.ownership": "Przywróć własność plików", - "snapshot.feedback.restore.file.permission": "Przywróć uprawnienia plików", - "snapshot.feedback.restore.file.modification.time": "Przywróć czas modyfikacji plików", - "snapshot.feedback.restore.file.overwrite": "Nadpisz pliki", - "snapshot.feedback.restore.directory.overwrite": "Nadpisz katalogi", - "snapshot.feedback.restore.link.overwrite": "Nadpisz dowiązania symboliczne", - "snapshot.feedback.restore.file.atomically": "Zapisuj pliki atomowo", - "snapshot.feedback.restore.file.sparse": "Zapisuj pliki rzadkie", - - "snapshot.feedback.restore.shallow.depth": "Płytkie przywracanie na określonej głębokości", - "snapshot.feedback.restore.shallow.file.size.minimal": "Minimalny rozmiar pliku dla płytkiego przywracania", - "snapshot.feedback.restore.disable.compression.zip": "Wyłącz kompresję ZIP", - "snapshot.feedback.restore.disable.compression.zip.help": "Nie kompresuj przy przywracaniu do pliku ZIP (szybciej).", - "snapshot.event.restore.begin": "Rozpocznij przywracanie", - - "repository.status.initializing": "Inicjalizacja w toku...", - "repository.status.connected": "Podłączone repoytorium", - "repository.event.connection.cancel":"Przerwij próbę połączenia", - "repository.event.connection.disconnect": "Odłącz od repozytorium", - "repository.event.description.update": "Zmień opis", - - "repository.feedback.description.required":"Opis jest wymagany", - "repository.feedback.read.only": "Repozytorium jest w trybie tylko do odczytu", - "repository.feedback.eco.disabled":"Brak", - "repository.feedback.compression.internal.supported": "yes", - "repository.feedback.compression.internal.not.supported": "no", - - "repository.attribute.server.url": "Adres URL serwera", - "repository.attribute.config.file": "Plik konfiguracyjny", - "repository.attribute.provider": "Provider", - "repository.attribute.algorithm.encryption": "Szyfrowanie", - "repository.attribute.algorithm.hash": "Funkcja haszująca", - "repository.attribute.algorithm.splitter": "Splitter", - "repository.attribute.algorithm.eco": "Korekcja błędów", - - "repository.attribute.connected.as": "Połączony jako", - "repository.attribute.compression.internal": "Wewnętrzna kompresja", - "repository.attribute.format": "Format repozytorium", - "repository.attribute.eco": "Narzut na korekcję błędów", - - "log.event.hide": "Schowaj log", - "log.event.show": "Pokaż log", - - "user.interface": "Interfejs użytkownika", - "user.interface.appearance":"Wielkość tekstu", - "user.interface.appearance.hint":"Rozmiar czcionki", - "user.interface.appearance.help": "Wybierz rodzaj czcionki", - - "user.interface.appearance.small":"mała", - "user.interface.appearance.medium":"średnia", - "user.interface.appearance.large":"duża", - - "user.interface.pagesize.description": "Rozmiar strony wyników", - "user.interface.pagesize.help": "Określa liczbę elementów na stronie wyników", - "user.interface.pagesize.hint": "Rozmiar strony", - - "user.interface.byte.representation.description":"Formatowanie rozmiarów plików", - "user.interface.byte.representation.select":"Wybierz sposób formatowania rozmiarów plików", - "user.interface.byte.representation.help":"Określa w jaki sposób będą wyświetlane rozmiary plików", - - "user.language":"Język", - - "lang.help": "Wybierz język interfejsu użytkownika", - "lang.select": "Wybierz język", - "lang.description": "Wybierz język", - - "theme.description": "Kolorystyka", - "theme.select": "Wybierz schemat kolorów", - "theme.help": "Aktywny schemat kolorów", - "theme.dark":"ciemna", - "theme.light": "jasna", - "theme.pastel": "pastelowa", - "theme.ocean":"oceaniczna" -} \ No newline at end of file + "common.cancel": "Anulować", + "common.delete": "Usuwać", + "common.delete.confirm": "Potwierdź usunięcie", + "common.loading": "Ładowanie ...", + "common.return": "Wróć", + "description.event.cancel": "Anulować", + "description.event.new": "Wprowadź nowy opis", + "description.event.remove": "Usuń opis", + "description.event.update": "Aktualizuj opis", + "description.feedback.description": "Opis migawki", + "feedback.ui.appearance": "Wielkość tekstu", + "feedback.ui.appearance-help": "Wybierz rodzaj czcionki", + "feedback.ui.appearance-hint": "Rozmiar czcionki", + "feedback.ui.theme-select": "Wybierz schemat kolorów", + "log.event.hide": "Schowaj log", + "log.event.show": "Pokaż log", + "pin.event.add": "Dodaj Pin", + "pin.event.cancel": "Anulować", + "pin.event.remove": "Usuń pinezkę", + "pin.event.snapshot.pin": "Przypnij migawkę", + "pin.event.update": "Zaktualizuj Pin", + "pin.feedback.name": "Nazwa pinu", + "pin.feedback.standard-text": "nie kasuj", + "policies.feedback.find.count_one": "Znaleziono {{count}} zasad spełniających kryteria", + "policies.feedback.find.count_other": "Znaleziono {{count}} zasad spełniających kryteria", + "policies.feedback.find.none": "Nie znaleziono zasad.", + "policies.feedback.find.none.create": "Nie znaleziono zasad dla katalogu {{path}}. \nSkonfiguruj nową politykę.", + "policies.feedback.loading": "Ładowanie ...", + "policies.feedback.path.absolute": "Zasady można definiować tylko dla ścieżek bezwzględnych.", + "policies.feedback.policy.find": "Wejdź do katalogu, aby znaleźć lub ustawić politykę", + "policies.header.actions": "działania", + "policies.header.defined": "Zdefiniowane", + "policies.header.host": "Gospodarz", + "policies.header.path": "Ścieżka", + "policies.header.username": "Nazwa użytkownika", + "policies.kind.all": "Wszystkie zasady", + "policies.kind.applicable": "Obowiązujące zasady", + "policies.kind.global": "Polityka globalna", + "policies.kind.host": "Zasady dotyczące poszczególnych hostów", + "policies.kind.local": "Polityka lokalna", + "policies.kind.user": "Zasady dotyczące poszczególnych użytkowników", + "repository.attribute.algorithm.eco": "Korekcja błędów", + "repository.attribute.algorithm.encryption": "Szyfrowanie", + "repository.attribute.algorithm.hash": "Funkcja haszująca", + "repository.attribute.algorithm.splitter": "Splitter", + "repository.attribute.compression.internal": "Wewnętrzna kompresja", + "repository.attribute.config.file": "Plik konfiguracyjny", + "repository.attribute.connected.as": "Połączony jako", + "repository.attribute.eco": "Narzut na korekcję błędów", + "repository.attribute.format": "Format repozytorium", + "repository.attribute.provider": "Provider", + "repository.attribute.server.url": "Adres URL serwera", + "repository.event.connection.cancel": "Przerwij próbę połączenia", + "repository.event.connection.disconnect": "Odłącz od repozytorium", + "repository.event.description.update": "Zmień opis", + "repository.feedback.compression.internal.not.supported": "no", + "repository.feedback.compression.internal.supported": "yes", + "repository.feedback.description.required": "Opis jest wymagany", + "repository.feedback.eco.disabled": "Brak", + "repository.feedback.read.only": "Repozytorium jest w trybie tylko do odczytu", + "repository.status.connected": "Podłączone repoytorium", + "repository.status.initializing": "Inicjalizacja w toku...", + "snapshot.event.create.estimate": "Oszacować", + "snapshot.event.create.now": "Zrzut ekranu teraz", + "snapshot.event.create.path": "Wprowadź ścieżkę do migawki", + "snapshot.event.create.path.resolve": "Należy określić katalog do wykonania migawki.", + "snapshot.event.delete.selected_one": "Czy chcesz usunąć wybraną migawkę {{count}}?", + "snapshot.event.delete.selected_other": "Czy chcesz usunąć wybrane migawki ({{count}})?", + "snapshot.event.directory.browse": "Przeglądać", + "snapshot.event.directory.browsing": "Przeglądanie katalogów nie jest obsługiwane w przeglądarce internetowej. \nUżyj interfejsu Kopia.", + "snapshot.event.directory.mount": "Zamontuj jako lokalny system plików", + "snapshot.event.directory.restore": "Przywróć pliki i katalogi", + "snapshot.event.directory.unmount": "Odmontuj", + "snapshot.event.history.delete.source": "Usuń źródło migawki", + "snapshot.event.history.description.update": "{{description}} - Kliknij, aby zaktualizować opis migawki.", + "snapshot.event.history.deselect.all": "Odznacz wszystkie", + "snapshot.event.history.fetch.snapshots": "Pobieraj migawki", + "snapshot.event.history.pin.add": "Dodaj pinezkę, aby zabezpieczyć migawkę przed usunięciem", + "snapshot.event.history.select.all": "Zaznacz wszystko", + "snapshot.event.history.selected.delete": "Usuń wybrane (", + "snapshot.event.restore": "Przywróć", + "snapshot.event.restore.begin": "Rozpocznij przywracanie", + "snapshot.event.snapshot.new": "Nowy zrzut ekranu", + "snapshot.event.snapshot.pending": "Aż do", + "snapshot.event.snapshot.policy": "Polityka", + "snapshot.event.synchronize": "Synchronizować", + "snapshot.feedback.directory.mount.restore": "Możesz zamontować/przywrócić wszystkie pliki i katalogi widoczne poniżej lub przywrócić pliki pojedynczo.", + "snapshot.feedback.history.display": "Wyświetlanie", + "snapshot.feedback.history.wipe.all": "Wyczyść wszystkie migawki i zasady dla tego źródła.", + "snapshot.feedback.restore.continue.errors": "Kontynuuj w przypadku błędów", + "snapshot.feedback.restore.continue.errors.help": "Gdy wystąpi błąd przywracania, spróbuj kontynuować zamiast szybko zakończyć.", + "snapshot.feedback.restore.destination": "Cel", + "snapshot.feedback.restore.destination.help": "Możesz również przywrócić do pliku .zip lub .tar, podając odpowiednie rozszerzenie.", + "snapshot.feedback.restore.destination.path": "Wprowadź ścieżkę docelową", + "snapshot.feedback.restore.directory.overwrite": "Nadpisz katalogi", + "snapshot.feedback.restore.disable.compression.zip": "Wyłącz kompresję ZIP", + "snapshot.feedback.restore.disable.compression.zip.help": "Nie kompresuj przy przywracaniu do pliku ZIP (szybciej).", + "snapshot.feedback.restore.file.atomically": "Zapisuj pliki atomowo", + "snapshot.feedback.restore.file.modification.time": "Przywróć czas modyfikacji plików", + "snapshot.feedback.restore.file.overwrite": "Nadpisz pliki", + "snapshot.feedback.restore.file.ownership": "Przywróć własność plików", + "snapshot.feedback.restore.file.permission": "Przywróć uprawnienia plików", + "snapshot.feedback.restore.file.sparse": "Zapisuj pliki rzadkie", + "snapshot.feedback.restore.link.overwrite": "Nadpisz dowiązania symboliczne", + "snapshot.feedback.restore.shallow.depth": "Płytkie przywracanie na określonej głębokości", + "snapshot.feedback.restore.shallow.file.size.minimal": "Minimalny rozmiar pliku dla płytkiego przywracania", + "snapshot.feedback.restore.skip": "Pomiń wcześniej przywrócone pliki i dowiązania symboliczne", + "snapshot.feedback.restore.task.go": "Przejdź do przywracania zadania", + "snapshot.feedback.snapshot.new": "Nowy zrzut ekranu", + "snapshot.feedback.snapshot.start": "Migawka rozpocznie się po zakończeniu poprzedniej migawki", + "snapshot.header.actions": "działania", + "snapshot.header.snapshot.last": "Ostatni zrzut ekranu", + "snapshot.header.snapshot.next": "Następna migawka", + "snapshot.header.snapshot.owner": "Właściciel", + "snapshot.header.snapshot.path": "Ścieżka", + "snapshot.header.snapshot.size": "Rozmiar", + "snapshot.header.status": "Status", + "snapshot.history.feedack.unfiltered.count_one": "Pokaż {{count}} indywidualną migawkę", + "snapshot.history.feedack.unfiltered.count_other": "Pokaż {{count}} pojedynczych migawek", + "snapshot.history.header.description": "Opis", + "snapshot.history.header.directories": "Reż", + "snapshot.history.header.files": "Akta", + "snapshot.history.header.retention": "Zatrzymanie", + "snapshot.history.header.root": "Źródło", + "snapshot.history.header.selected": "Wybrany", + "snapshot.history.header.size": "Rozmiar", + "snapshot.history.header.time.start": "Czas rozpoczęcia", + "tab.policies": "Konfiguracje", + "tab.preferences": "Ustawienia", + "tab.repository": "Repozytorium", + "tab.snapshots": "Kopie", + "tab.tasks": "Zadania", + "task.all": "wszystkie", + "task.event.stop": "Zatrzymaj", + "task.failed": "nieudane", + "task.feedback.entries": "Lista zadań pojawi się tutaj podczas tworzenia migawek, przywracania, przeprowadzania konserwacji itp.", + "task.feedback.search": "Szukaj logów według opisu", + "task.header.counter": "Licznik", + "task.header.description": "Opis", + "task.header.kind": "Uprzejmy", + "task.header.status": "Status", + "task.header.time.start": "Czas rozpoczęcia", + "task.header.value": "Wartość", + "task.loading": "Wczytywanie...", + "task.logs": "Logi", + "task.running": "w toku", + "task.status.canceled": "Zadanie anulowane po", + "task.status.canceling": "Anulowanie", + "task.status.error": "Błąd", + "task.status.finished": "Zakończone", + "task.status.running.for": "Zadanie w toku od", + "task.status.started": "Rozpoczęte", + "task.status.succeed.after": "Zadanie zakończone po", + "ui.feedback.byte-representation-description": "Formatowanie rozmiarów plików", + "ui.feedback.byte-representation-help": "Określa w jaki sposób będą wyświetlane rozmiary plików", + "ui.feedback.byte-representation-select": "Wybierz sposób formatowania rozmiarów plików", + "ui.feedback.pagesize-description": "Rozmiar strony wyników", + "ui.feedback.pagesize-help": "Określa liczbę elementów na stronie wyników", + "ui.feedback.pagesize-hint": "Rozmiar strony", + "ui.feedback.theme-description": "Kolorystyka", + "ui.feedback.theme-help": "Aktywny schemat kolorów", + "ui.value.appearance-large": "duża", + "ui.value.appearance-medium": "średnia", + "ui.value.appearance-small": "mała", + "ui.value.theme-dark": "ciemna", + "ui.value.theme-light": "jasna", + "ui.value.theme-ocean": "oceaniczna", + "ui.value.theme-pastel": "pastelowa" +} diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index 97475584..b147e610 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -1,132 +1,170 @@ { - "tab.preferences": "Настройки", - "tab.repository": "Репозиторий", - "tab.tasks": "Задачи", - "tab.policies": "Политики", - "tab.snapshots": "Снимки", - - "common.return": "Возврат", - - "task.all": "Все", - "task.running": "Выполняются", - "task.failed": "Не удалось", - "task.loading": "Загрузка...", - "task.header.time.start": "Время начала", - "task.header.status": "Статус", - "task.header.kind": "Тип", - "task.header.description": "Описание", - "task.feedback.search": "Поиск по описанию", - "task.feedback.entries": "Список задач появится здесь при создании снимков, восстановлении, выполнении обслуживания и т. д.", - - "task.status.succeed.after": "Задача успешно завершена после", - "task.status.canceled": "Задача отменена после", - "task.status.canceling": "Отмена", - "task.status.error": "Ошибка задачи", - "task.status.running.for": "Задача выполняется в течение", - - "task.status.started": "Начало", - "task.status.finished": "Завершено", - "task.logs": "Логи", - - "task.event.stop": "Остановить", - "task.header.counter": "Счетчик", - "task.header.value": "Значение", - - "snapshot.header.actions": "Действия", - "snapshot.header.status": "Статус", - "snapshot.header.snapshot.next": "Следующий снимок", - "snapshot.header.snapshot.last": "Последний снимок", - "snapshot.header.snapshot.size": "Размер", - "snapshot.header.snapshot.owner": "Владелец", - "snapshot.header.snapshot.path": "Путь", - - "snapshot.event.snapshot.now": "Сделать снимок сейчас", - "snapshot.event.snapshot.policy": "Политика", - "snapshot.event.snapshot.pending": "Ожидание", - "snapshot.feedback.snapshot.start": "Снимок начнется после завершения предыдущего снимка", - "snapshot.event.snapshot.new": "Новый снимок", - - "snapshot.event.synchronize": "Синхронизировать", - - "snapshot.event.restore.task.go": "Перейти к задаче восстановления", - "snapshot.event.restore": "Восстановить", - "snapshot.feedback.restore.destination": "Назначение", - "snapshot.feedback.restore.destination.path": "Введите путь назначения", - "snapshot.feedback.restore.destination.help": "Вы также можете восстановить в файл .zip или .tar, указав соответствующее расширение.", - "snapshot.feedback.restore.skip": "Пропустить ранее восстановленные файлы и символические ссылки", - "snapshot.feedback.restore.continue.errors": "Продолжить при возникновении ошибок", - "snapshot.feedback.restore.continue.errors.help": "При возникновении ошибки восстановления попробуйте продолжить, а не прекращать операцию.", - "snapshot.feedback.restore.file.ownership": "Восстановить владение файлами", - "snapshot.feedback.restore.file.permission": "Восстановить разрешения файлов", - "snapshot.feedback.restore.file.modification.time": "Восстановить время изменения файлов", - "snapshot.feedback.restore.file.overwrite": "Перезаписать файлы", - "snapshot.feedback.restore.directory.overwrite": "Перезаписать директории", - "snapshot.feedback.restore.link.overwrite": "Перезаписать символические ссылки", - "snapshot.feedback.restore.file.atomically": "Записывать файлы атомарно", - "snapshot.feedback.restore.file.sparse": "Записывать разреженные файлы", - - "snapshot.feedback.restore.shallow.depth": "Поверхностное восстановление на определенной глубине", - "snapshot.feedback.restore.shallow.file.size.minimal": "Минимальный размер файла для поверхностного восстановления", - "snapshot.feedback.restore.disable.compression.zip": "Отключить сжатие ZIP", - "snapshot.feedback.restore.disable.compression.zip.help": "Не сжимать при восстановлении в файл ZIP (быстрее).", - "snapshot.event.restore.begin": "Начать восстановление", - - "repository.status.initializing": "Инициализация репозитория...", - "repository.status.connected": "Подключено к репозиторию", - "repository.event.connection.cancel": "Отменить подключение", - "repository.event.connection.disconnect": "Отключиться от репозитория", - "repository.event.description.update": "Обновить описание", - - "repository.feedback.description.required": "Требуется описание репозитория", - "repository.feedback.read.only": "Репозиторий доступен только для чтения", - "repository.feedback.eco.disabled": "Отключено", - "repository.feedback.compression.internal.supported": "да", - "repository.feedback.compression.internal.not.supported": "нет", - - "repository.attribute.server.url": "URL сервера", - "repository.attribute.config.file": "Файл конфигурации", - "repository.attribute.provider": "Поставщик", - "repository.attribute.algorithm.encryption": "Алгоритм шифрования", - "repository.attribute.algorithm.hash": "Алгоритм хеширования", - "repository.attribute.algorithm.splitter": "Алгоритм разделения", - "repository.attribute.algorithm.eco": "Алгоритм коррекции ошибок", - - "repository.attribute.connected.as": "Подключено как", - "repository.attribute.compression.internal": "Внутреннее сжатие", - "repository.attribute.format": "Формат репозитория", - "repository.attribute.eco": "Коррекция ошибок", - - "log.event.hide": "Скрыть лог", - "log.event.show": "Показать лог", - - "user.interface": "Пользовательский интерфейс", - "user.interface.appearance":"Внешний вид", - "user.interface.appearance.hint":"Выберите размер шрифта", - "user.interface.appearance.help": "Определяет внешний вид пользовательского интерфейса", - - "user.interface.appearance.small":"маленький", - "user.interface.appearance.medium":"средний", - "user.interface.appearance.large":"большой", - - "user.interface.pagesize.description": "Размер страницы", - "user.interface.pagesize.help": "Определяет размер страницы в таблицах", - "user.interface.pagesize.hint": "Размер страницы", - - "user.interface.byte.representation.description":"Выберите представление байта", - "user.interface.byte.representation.select":"Выберите представление байта", - "user.interface.byte.representation.help":"Определяет представление байтов", - - "user.language":"Язык", - - "lang.help": "Устанавливает язык пользовательского интерфейса", - "lang.select": "Выберите язык", - "lang.description": "Выберите язык", - - "theme.description": "Тема", - "theme.select": "Выберите тему", - "theme.help": "Текущая активная тема", - "theme.dark":"темная", - "theme.light": "светлая", - "theme.pastel": "пастельная", - "theme.ocean":"морская" + "common.cancel": "Отмена", + "common.delete": "Удалить", + "common.delete.confirm": "Подтвердите удаление", + "common.loading": "Загрузка...", + "common.return": "Возврат", + "description.event.cancel": "Отмена", + "description.event.new": "Введите новое описание", + "description.event.remove": "Удалить описание", + "description.event.update": "Описание обновления", + "description.feedback.description": "Описание снимка", + "feedback.ui.appearance": "Внешний вид", + "feedback.ui.appearance-help": "Определяет внешний вид пользовательского интерфейса", + "feedback.ui.appearance-hint": "Выберите размер шрифта", + "feedback.ui.theme-select": "Выберите тему", + "log.event.hide": "Скрыть лог", + "log.event.show": "Показать лог", + "pin.event.add": "Добавить пин", + "pin.event.cancel": "Отмена", + "pin.event.remove": "Удалить булавку", + "pin.event.snapshot.pin": "Снимок закрепления", + "pin.event.update": "Обновить пин-код", + "pin.feedback.name": "Название контакта", + "pin.feedback.standard-text": "не удалять", + "policies.feedback.find.count_one": "Найдено {{count}} политики, соответствующей критериям.", + "policies.feedback.find.count_other": "Найдено {{count}} политик, соответствующих критериям.", + "policies.feedback.find.none": "Политики не найдены.", + "policies.feedback.find.none.create": "Политика для каталога {{path}} не найдена. \nПожалуйста, настройте новую политику.", + "policies.feedback.loading": "Загрузка...", + "policies.feedback.path.absolute": "Политики могут быть определены только для абсолютных путей.", + "policies.feedback.policy.find": "Введите каталог, чтобы найти или установить политику", + "policies.header.actions": "Действия", + "policies.header.defined": "Определенный", + "policies.header.host": "Хозяин", + "policies.header.path": "Путь", + "policies.header.username": "Имя пользователя", + "policies.kind.all": "Все политики", + "policies.kind.applicable": "Применимые политики", + "policies.kind.global": "Глобальная политика", + "policies.kind.host": "Политики для каждого хоста", + "policies.kind.local": "Местная политика", + "policies.kind.user": "Политики для каждого пользователя", + "repository.attribute.algorithm.eco": "Алгоритм коррекции ошибок", + "repository.attribute.algorithm.encryption": "Алгоритм шифрования", + "repository.attribute.algorithm.hash": "Алгоритм хеширования", + "repository.attribute.algorithm.splitter": "Алгоритм разделения", + "repository.attribute.compression.internal": "Внутреннее сжатие", + "repository.attribute.config.file": "Файл конфигурации", + "repository.attribute.connected.as": "Подключено как", + "repository.attribute.eco": "Коррекция ошибок", + "repository.attribute.format": "Формат репозитория", + "repository.attribute.provider": "Поставщик", + "repository.attribute.server.url": "URL сервера", + "repository.event.connection.cancel": "Отменить подключение", + "repository.event.connection.disconnect": "Отключиться от репозитория", + "repository.event.description.update": "Обновить описание", + "repository.feedback.compression.internal.not.supported": "нет", + "repository.feedback.compression.internal.supported": "да", + "repository.feedback.description.required": "Требуется описание репозитория", + "repository.feedback.eco.disabled": "Отключено", + "repository.feedback.read.only": "Репозиторий доступен только для чтения", + "repository.status.connected": "Подключено к репозиторию", + "repository.status.initializing": "Инициализация репозитория...", + "snapshot.event.create.estimate": "Оценивать", + "snapshot.event.create.now": "Снимок сейчас", + "snapshot.event.create.path": "Введите путь к снимку", + "snapshot.event.create.path.resolve": "Необходимо указать каталог для снимка.", + "snapshot.event.delete.selected_one": "Вы хотите удалить выбранный снимок {{count}}?", + "snapshot.event.delete.selected_other": "Вы хотите удалить выбранные снимки ({{count}})?", + "snapshot.event.directory.browse": "Просматривать", + "snapshot.event.directory.browsing": "Просмотр каталогов не поддерживается в веб-браузере. \nИспользуйте интерфейс Копиа.", + "snapshot.event.directory.mount": "Монтировать как локальную файловую систему", + "snapshot.event.directory.restore": "Восстановление файлов и каталогов", + "snapshot.event.directory.unmount": "Размонтировать", + "snapshot.event.history.delete.source": "Удалить источник снимка", + "snapshot.event.history.description.update": "{{description}} – нажмите, чтобы обновить описание снимка.", + "snapshot.event.history.deselect.all": "Убрать выделение со всего", + "snapshot.event.history.fetch.snapshots": "Получить снимки", + "snapshot.event.history.pin.add": "Добавьте булавку, чтобы защитить снимок от удаления", + "snapshot.event.history.select.all": "Выбрать все", + "snapshot.event.history.selected.delete": "Удалить выбранное (", + "snapshot.event.restore": "Восстановить", + "snapshot.event.restore.begin": "Начать восстановление", + "snapshot.event.snapshot.new": "Новый снимок", + "snapshot.event.snapshot.pending": "Ожидание", + "snapshot.event.snapshot.policy": "Политика", + "snapshot.event.synchronize": "Синхронизировать", + "snapshot.feedback.directory.mount.restore": "Вы можете смонтировать/восстановить все файлы и каталоги, которые вы видите ниже, или восстановить файлы по отдельности.", + "snapshot.feedback.history.display": "Отображение", + "snapshot.feedback.history.wipe.all": "Сотрите все снимки и политику для этого источника.", + "snapshot.feedback.restore.continue.errors": "Продолжить при возникновении ошибок", + "snapshot.feedback.restore.continue.errors.help": "При возникновении ошибки восстановления попробуйте продолжить, а не прекращать операцию.", + "snapshot.feedback.restore.destination": "Назначение", + "snapshot.feedback.restore.destination.help": "Вы также можете восстановить в файл .zip или .tar, указав соответствующее расширение.", + "snapshot.feedback.restore.destination.path": "Введите путь назначения", + "snapshot.feedback.restore.directory.overwrite": "Перезаписать директории", + "snapshot.feedback.restore.disable.compression.zip": "Отключить сжатие ZIP", + "snapshot.feedback.restore.disable.compression.zip.help": "Не сжимать при восстановлении в файл ZIP (быстрее).", + "snapshot.feedback.restore.file.atomically": "Записывать файлы атомарно", + "snapshot.feedback.restore.file.modification.time": "Восстановить время изменения файлов", + "snapshot.feedback.restore.file.overwrite": "Перезаписать файлы", + "snapshot.feedback.restore.file.ownership": "Восстановить владение файлами", + "snapshot.feedback.restore.file.permission": "Восстановить разрешения файлов", + "snapshot.feedback.restore.file.sparse": "Записывать разреженные файлы", + "snapshot.feedback.restore.link.overwrite": "Перезаписать символические ссылки", + "snapshot.feedback.restore.shallow.depth": "Поверхностное восстановление на определенной глубине", + "snapshot.feedback.restore.shallow.file.size.minimal": "Минимальный размер файла для поверхностного восстановления", + "snapshot.feedback.restore.skip": "Пропустить ранее восстановленные файлы и символические ссылки", + "snapshot.feedback.restore.task.go": "Перейти к задаче восстановления", + "snapshot.feedback.snapshot.new": "Новый снимок", + "snapshot.feedback.snapshot.start": "Снимок начнется после завершения предыдущего снимка", + "snapshot.header.actions": "Действия", + "snapshot.header.snapshot.last": "Последний снимок", + "snapshot.header.snapshot.next": "Следующий снимок", + "snapshot.header.snapshot.owner": "Владелец", + "snapshot.header.snapshot.path": "Путь", + "snapshot.header.snapshot.size": "Размер", + "snapshot.header.status": "Статус", + "snapshot.history.feedack.unfiltered.count_one": "Показать {{count}} отдельный снимок", + "snapshot.history.feedack.unfiltered.count_other": "Показать {{count}} отдельных снимков", + "snapshot.history.header.description": "Описание", + "snapshot.history.header.directories": "Дирс", + "snapshot.history.header.files": "Файлы", + "snapshot.history.header.retention": "Удержание", + "snapshot.history.header.root": "Корень", + "snapshot.history.header.selected": "Выбрано", + "snapshot.history.header.size": "Размер", + "snapshot.history.header.time.start": "Время начала", + "tab.policies": "Политики", + "tab.preferences": "Настройки", + "tab.repository": "Репозиторий", + "tab.snapshots": "Снимки", + "tab.tasks": "Задачи", + "task.all": "Все", + "task.event.stop": "Остановить", + "task.failed": "Не удалось", + "task.feedback.entries": "Список задач появится здесь при создании снимков, восстановлении, выполнении обслуживания и т. д.", + "task.feedback.search": "Поиск по описанию", + "task.header.counter": "Счетчик", + "task.header.description": "Описание", + "task.header.kind": "Тип", + "task.header.status": "Статус", + "task.header.time.start": "Время начала", + "task.header.value": "Значение", + "task.loading": "Загрузка...", + "task.logs": "Логи", + "task.running": "Выполняются", + "task.status.canceled": "Задача отменена после", + "task.status.canceling": "Отмена", + "task.status.error": "Ошибка задачи", + "task.status.finished": "Завершено", + "task.status.running.for": "Задача выполняется в течение", + "task.status.started": "Начало", + "task.status.succeed.after": "Задача успешно завершена после", + "ui.feedback.byte-representation-description": "Выберите представление байта", + "ui.feedback.byte-representation-help": "Определяет представление байтов", + "ui.feedback.byte-representation-select": "Выберите представление байта", + "ui.feedback.pagesize-description": "Размер страницы", + "ui.feedback.pagesize-help": "Определяет размер страницы в таблицах", + "ui.feedback.pagesize-hint": "Размер страницы", + "ui.feedback.theme-description": "Тема", + "ui.feedback.theme-help": "Текущая активная тема", + "ui.value.appearance-large": "большой", + "ui.value.appearance-medium": "средний", + "ui.value.appearance-small": "маленький", + "ui.value.theme-dark": "темная", + "ui.value.theme-light": "светлая", + "ui.value.theme-ocean": "морская", + "ui.value.theme-pastel": "пастельная" } diff --git a/src/pages/Policies.jsx b/src/pages/Policies.jsx index 56676d56..381d8333 100644 --- a/src/pages/Policies.jsx +++ b/src/pages/Policies.jsx @@ -13,6 +13,7 @@ import { handleChange } from '../forms'; import { OptionalDirectory } from '../forms/OptionalDirectory' import KopiaTable from '../utils/KopiaTable'; import { CLIEquivalent, compare, isAbsolutePath, ownerName, policyEditorURL, redirect } from '../utils/uiutil'; +import i18n from '../utils/i18n' const applicablePolicies = "Applicable Policies" const localPolicies = "Local Path Policies" @@ -104,7 +105,7 @@ export class Policies extends Component { } if (!isAbsolutePath(this.state.policyPath)) { - alert("Policies can only be defined for absolute paths."); + alert(i18n.t('policies.feedback.path.absolute')); return; } @@ -174,7 +175,7 @@ export class Policies extends Component { return

{error.message}

; } if (isLoading) { - return

Loading ...

; + return

{i18n.t('policies.feedback.loading')}

; } let uniqueOwners = sources.reduce((a, d) => { @@ -230,22 +231,22 @@ export class Policies extends Component { const columns = [{ - Header: 'Username', + Header: i18n.t('policies.header.username'), width: 100, accessor: x => x.target.userName || "*", }, { - Header: 'Host', + Header: i18n.t('policies.header.host'), width: 100, accessor: x => x.target.host || "*", }, { - Header: 'Path', + Header: i18n.t('policies.header.path'), accessor: x => x.target.path || "*", }, { - Header: 'Defined', + Header: i18n.t('policies.header.defined'), accessor: x => this.policySummary(x), }, { id: 'edit', - Header: 'Actions', + Header: i18n.t('policies.header.actions'), width: 50, Cell: x => }] @@ -257,17 +258,17 @@ export class Policies extends Component {
-  {this.state.selectedOwner} + {' '}{this.state.selectedOwner} - this.selectOwner(applicablePolicies)}>{applicablePolicies} - this.selectOwner(localPolicies)}>{localPolicies} - this.selectOwner(allPolicies)}>{allPolicies} + this.selectOwner(applicablePolicies)}>{i18n.t('policies.kind.applicable')} + this.selectOwner(localPolicies)}>{i18n.t('policies.kind.local')} + this.selectOwner(allPolicies)}>{i18n.t('policies.kind.all')} - this.selectOwner(globalPolicy)}>{globalPolicy} - this.selectOwner(perUserPolicies)}>{perUserPolicies} - this.selectOwner(perHostPolicies)}>{perHostPolicies} + this.selectOwner(globalPolicy)}>{i18n.t('policies.kind.global')} + this.selectOwner(perUserPolicies)}>{i18n.t('policies.kind.user')} + this.selectOwner(perHostPolicies)}>{i18n.t('policies.kind.host')} {uniqueOwners.map(v => this.selectOwner(v)}>{v})} @@ -275,7 +276,7 @@ export class Policies extends Component { {(this.state.selectedOwner === localPolicies || this.state.selectedOwner === this.state.localSourceName || this.state.selectedOwner === applicablePolicies) ? <> - {OptionalDirectory(this, null, "policyPath", { autoFocus: true, placeholder: "enter directory to find or set policy" })} + {OptionalDirectory(this, null, "policyPath", { autoFocus: true, placeholder: i18n.t('policies.feedback.policy.find') })} @@ -286,11 +287,11 @@ export class Policies extends Component { } {policies.length > 0 ?
-

Found {policies.length} policies matching criteria.

+

{i18n.t('policies.feedback.find.count', { count: policies.length })}

: ((this.state.selectedOwner === localPolicies && this.state.policyPath) ?

- No policy found for directory {this.state.policyPath}. Click Set Policy to define it. -

:

No policies found.

)} + {i18n.t('policies.feedback.find.none.create', { path: this.state.policyPath })} +

:

{i18n.t('policies.feedback.find.none')}

)} ; } diff --git a/src/pages/Preferences.jsx b/src/pages/Preferences.jsx index e1b0ea46..f7bc0437 100644 --- a/src/pages/Preferences.jsx +++ b/src/pages/Preferences.jsx @@ -11,40 +11,40 @@ export function Preferences() { return <>
- - setTheme(e.target.value)}> + + + + - {t('theme.help')} + {t('ui.feedback.theme-help')}

- - setByteStringBase(e.target.value)}> - {t('user.interface.byte.representation.help')} + {t('ui.feedback.byte-representation-help')}

- - setFontSize(e.target.value)}> + + + - {t('user.interface.appearance.help')} + {t('feedback.ui.appearance-help')}

- + - {t('user.interface.pagesize.help')} + type='text' placeholder={t('ui.feedback.pagesize-hint')} value={pageSize} disabled={true} /> + {t('ui.feedback.pagesize-help')}
diff --git a/src/pages/Repository.jsx b/src/pages/Repository.jsx index d3d646a7..e056ee24 100644 --- a/src/pages/Repository.jsx +++ b/src/pages/Repository.jsx @@ -128,7 +128,7 @@ export class Repository extends Component { } if (this.state.status.initTaskID) { - return <>

 {i18n.t('repository.status.initializing')}

+ return <>

{' '}{i18n.t('repository.status.initializing')}

{this.state.showLog ? <> diff --git a/src/pages/SnapshotCreate.jsx b/src/pages/SnapshotCreate.jsx index 0bc663a6..e2fa6f32 100644 --- a/src/pages/SnapshotCreate.jsx +++ b/src/pages/SnapshotCreate.jsx @@ -9,6 +9,7 @@ import { PolicyEditor } from '../components/policy-editor/PolicyEditor'; import { SnapshotEstimation } from '../components/SnapshotEstimation'; import { RequiredDirectory } from '../forms/RequiredDirectory'; import { CLIEquivalent, errorAlert, GoBackButton, redirect } from '../utils/uiutil'; +import i18n from '../utils/i18n' export class SnapshotCreate extends Component { constructor() { @@ -117,7 +118,7 @@ export class SnapshotCreate extends Component { e.preventDefault(); if (!this.state.resolvedSource.path) { - alert('Must specify directory to snapshot.'); + alert(i18n.t('snapshot.event.create.path.resolve')); return } @@ -152,27 +153,27 @@ export class SnapshotCreate extends Component {
-

New Snapshot

+

{i18n.t('snapshot.feedback.snapshot.new')}


- {RequiredDirectory(this, null, "path", { autoFocus: true, placeholder: "enter path to snapshot" })} + {RequiredDirectory(this, null, "path", { autoFocus: true, placeholder: i18n.t('snapshot.event.create.path')})} + onClick={this.estimate}>{i18n.t('snapshot.event.create.estimate')} + onClick={this.snapshotNow}>{i18n.t('snapshot.event.create.now')} {this.state.estimateTaskID && this.state.estimateTaskVisible && diff --git a/src/pages/SnapshotDirectory.jsx b/src/pages/SnapshotDirectory.jsx index bbadb8d6..7f051a3b 100644 --- a/src/pages/SnapshotDirectory.jsx +++ b/src/pages/SnapshotDirectory.jsx @@ -10,6 +10,7 @@ import { DirectoryItems } from "../components/DirectoryItems"; import { CLIEquivalent } from '../utils/uiutil'; import { DirectoryBreadcrumbs } from "../components/DirectoryBreadcrumbs"; import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; +import i18n from '../utils/i18n'; export class SnapshotDirectory extends Component { constructor() { @@ -91,7 +92,7 @@ export class SnapshotDirectory extends Component { browseMounted() { if (!window.kopiaUI) { - alert('Directory browsing is not supported in a web browser. Use Kopia UI.'); + alert(i18n.t('snapshot.event.directory.browsing')); return; } @@ -124,24 +125,22 @@ export class SnapshotDirectory extends Component { {this.state.mountInfo.path ? <> - + {window.kopiaUI && <> - + } : <> - + }   + href={"/snapshots/dir/" + this.props.match.params.oid + "/restore"}>{i18n.t('snapshot.event.directory.restore')}   - You can mount/restore all the files & directories that you see below or restore files individually. - + {i18n.t('snapshot.feedback.directory.mount.restore')}   diff --git a/src/pages/SnapshotHistory.jsx b/src/pages/SnapshotHistory.jsx index cf6324f4..e695b260 100644 --- a/src/pages/SnapshotHistory.jsx +++ b/src/pages/SnapshotHistory.jsx @@ -14,6 +14,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import Modal from 'react-bootstrap/Modal'; import { faFileAlt } from '@fortawesome/free-regular-svg-icons'; import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; +import i18n from '../utils/i18n' function pillVariant(tag) { if (tag.startsWith("latest-")) { @@ -249,7 +250,7 @@ export class SnapshotHistory extends Component { originalSnapshotDescription: x.description, }) }} - title={x.description + " - Click to update snapshot description."} + title={i18n.t('snapshot.event.history.description.update', {description: x.description})} className={x.description ? "snapshot-description-set" : "snapshot-description"}>; } @@ -260,10 +261,10 @@ export class SnapshotHistory extends Component { this.setState({ editPinFor: [x.id], originalPinName: "", - newPinName: "do-not-delete", + newPinName: i18n.t('pin.feedback.standard-text'), }); } - } title="Add a pin to protect snapshot from deletion">; + } title={i18n.t('snapshot.event.history.pin.add')}>; } editPin(snap, pin) { @@ -331,13 +332,13 @@ export class SnapshotHistory extends Component { const columns = [{ id: 'selected', - Header: 'Selected', + Header: i18n.t('snapshot.history.header.selected'), width: 20, align: "center", Cell: x =>
this.toggleSelected(x.row.original)} />
, }, { id: 'startTime', - Header: 'Start time', + Header: i18n.t('snapshot.history.header.time.start'), width: 200, accessor: x => { let timestamp = rfc3339TimestampForDisplay(x.startTime); @@ -345,38 +346,38 @@ export class SnapshotHistory extends Component { }, }, { id: 'description', - Header: '', + Header: i18n.t('snapshot.history.header.description'), width: 20, Cell: x => this.descriptionFor(x.row.original), }, { id: 'rootID', - Header: 'Root', + Header: i18n.t('snapshot.history.header.root'), width: "", accessor: x => x.rootID, Cell: x => <>{x.cell.value} {x.row.original.description &&
{x.row.original.description}
}, }, { - Header: 'Retention', + Header: i18n.t('snapshot.history.header.retention'), accessor: 'retention', width: "", Cell: x => {x.cell.value.map(l => {l}{' '})} {x.row.original.pins.map(l => - this.editPin(x.row.original, l)}> {l}{' '} + this.editPin(x.row.original, l)}>{l}{' '} )} {this.newPinFor(x.row.original)} }, { - Header: 'Size', + Header: i18n.t('snapshot.history.header.size'), accessor: 'summary.size', width: 100, Cell: x => sizeWithFailures(x.cell.value, x.row.original.summary, bytesStringBase2), }, { - Header: 'Files', + Header: i18n.t('snapshot.history.header.files'), accessor: 'summary.files', width: 100, }, { - Header: 'Dirs', + Header: i18n.t('snapshot.history.header.directories'), accessor: 'summary.dirs', width: 100, }] @@ -387,30 +388,30 @@ export class SnapshotHistory extends Component {
-   + {' '} {snapshots.length > 0 && (selectedElements.length < snapshots.length ? - : - )} -   - {selectedElements.length > 0 && <>  - + : + )} + {' '} + {selectedElements.length > 0 && <>{' '} + } - {snapshots.length === 0 && <>  - + {snapshots.length === 0 && <>{' '} + }
- Displaying {snapshots.length !== unfilteredCount ? snapshots.length + ' out of ' + unfilteredCount : snapshots.length} snapshots of {this.state.userName}@{this.state.host}:{this.state.path} + {i18n.t('snapshot.feedback.history.display')} {snapshots.length !== unfilteredCount ? snapshots.length + ' out of ' + unfilteredCount : snapshots.length} snapshots of{' '}{this.state.userName}@{this.state.host}:{this.state.path}
@@ -421,7 +422,7 @@ export class SnapshotHistory extends Component { @@ -437,17 +438,15 @@ export class SnapshotHistory extends Component { - Confirm Delete + {i18n.t('common.delete.confirm')} <> - {selectedElements.length > 1 ? -

Do you want to delete the selected {selectedElements.length} snapshots?

: -

Do you want to delete the selected snapshot?

} +

{i18n.t('snapshot.event.delete.selected',{count: selectedElements.length})}

{selectedElements.length === snapshots.length && this.setState({ alsoDeleteSource: !this.state.alsoDeleteSource })} @@ -457,19 +456,19 @@ export class SnapshotHistory extends Component {
- - + +
- Snapshot Description + {i18n.t('description.feedback.description')} - Enter new description + {i18n.t('description.event.new')} {this.state.savingSnapshot && } - - {this.state.originalSnapshotDescription && } - + + {this.state.originalSnapshotDescription && } + - Pin Snapshot + {i18n.t('pin.event.snapshot.pin')} - Name of the pin + {i18n.t('pin.feedback.name')} {this.state.savingSnapshot && } - - {this.state.originalPinName && } - + + {this.state.originalPinName && } + ; diff --git a/src/pages/SnapshotRestore.jsx b/src/pages/SnapshotRestore.jsx index 72da735f..1b9371bd 100644 --- a/src/pages/SnapshotRestore.jsx +++ b/src/pages/SnapshotRestore.jsx @@ -92,7 +92,7 @@ export class SnapshotRestore extends Component { if (this.state.restoreTask) { return

- Go To Restore Task. + {i18n.t('snapshot.feedback.restore.task.go')}.

; } diff --git a/src/pages/Snapshots.jsx b/src/pages/Snapshots.jsx index b5ffdad9..4aec6be3 100644 --- a/src/pages/Snapshots.jsx +++ b/src/pages/Snapshots.jsx @@ -14,7 +14,7 @@ import { handleChange } from '../forms'; import KopiaTable from '../utils/KopiaTable'; import { CLIEquivalent, compare, errorAlert, ownerName, policyEditorURL, redirect, sizeDisplayName, sizeWithFailures, sourceQueryStringParams } from '../utils/uiutil'; import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; -import i18n from '../utils/i18n' +import i18n from '../utils/i18n'; const localSnapshots = "Local Snapshots" const allSnapshots = "All Snapshots" @@ -135,14 +135,14 @@ export class Snapshots extends Component { ; case "PENDING": return <> -  {i18n.t('snapshot.event.snapshot.pending')} + {' '}{i18n.t('snapshot.event.snapshot.pending')} ; case "UPLOADING": @@ -211,6 +211,11 @@ export class Snapshots extends Component {

; } + navigateTo(path) { + this.props.history.push(path); + } + + render() { let { sources, isLoading, error } = this.state; const { bytesStringBase2 } = this.context @@ -297,7 +302,7 @@ export class Snapshots extends Component { {this.state.multiUser && <>
-  {this.state.selectedOwner} + {' '}{this.state.selectedOwner} @@ -309,7 +314,7 @@ export class Snapshots extends Component { } - + diff --git a/src/pages/Task.jsx b/src/pages/Task.jsx index 26013be5..1a109a58 100644 --- a/src/pages/Task.jsx +++ b/src/pages/Task.jsx @@ -165,7 +165,7 @@ export class Task extends Component { } if (isLoading) { - return

Loading ...

; + return

{i18n.t('common.loading')}

; } return diff --git a/src/tests/Language.test.jsx b/src/tests/Language.test.jsx new file mode 100644 index 00000000..2e9f29eb --- /dev/null +++ b/src/tests/Language.test.jsx @@ -0,0 +1,28 @@ +import { render, screen } from '@testing-library/react' +import { expect, test } from '@jest/globals'; + +jest.mock('react-i18next', () => ({ + // this mock makes sure any components using the translate hook can use it without a warning being shown + useTranslation: () => { + return { + t: (str) => str, + i18n: { + changeLanguage: () => new Promise(() => {}), + }, + }; + }, + initReactI18next: { + type: '3rdParty', + init: () => {}, + } + })); + +/** + * + */ +describe('Check tranlations', () => { + test('Translations should not have unused keys', () => { + }) +}) + + diff --git a/src/tests/__snapshots__/Preferences.test.js.snap b/src/tests/__snapshots__/Preferences.test.js.snap index b6f90f06..342c90c7 100644 --- a/src/tests/__snapshots__/Preferences.test.js.snap +++ b/src/tests/__snapshots__/Preferences.test.js.snap @@ -58,12 +58,12 @@ Object { class="label-description" for="bytesBaseInput" > - user.interface.byte.representation.description + ui.feedback.byte-representation-description - user.interface.appearance.help + ui.feedback.appearance-help
@@ -129,22 +129,21 @@ Object { - user.interface.pagesize.help + ui.feedback.pagesize-help @@ -204,12 +203,12 @@ Object { class="label-description" for="bytesBaseInput" > - user.interface.byte.representation.description + ui.feedback.byte-representation-description - user.interface.appearance.help + ui.feedback.appearance-help
@@ -275,22 +274,21 @@ Object { - user.interface.pagesize.help + ui.feedback.pagesize-help @@ -407,12 +405,12 @@ Object { class="label-description" for="bytesBaseInput" > - user.interface.byte.representation.description + ui.feedback.byte-representation-description - user.interface.appearance.help + ui.feedback.appearance-help
@@ -478,22 +476,21 @@ Object { - user.interface.pagesize.help + ui.feedback.pagesize-help @@ -553,12 +550,12 @@ Object { class="label-description" for="bytesBaseInput" > - user.interface.byte.representation.description + ui.feedback.byte-representation-description - user.interface.appearance.help + ui.feedback.appearance-help
@@ -624,22 +621,21 @@ Object { - user.interface.pagesize.help + ui.feedback.pagesize-help @@ -756,12 +752,12 @@ Object { class="label-description" for="bytesBaseInput" > - user.interface.byte.representation.description + ui.feedback.byte-representation-description - user.interface.appearance.help + ui.feedback.appearance-help
@@ -827,22 +823,21 @@ Object { - user.interface.pagesize.help + ui.feedback.pagesize-help @@ -902,12 +897,12 @@ Object { class="label-description" for="bytesBaseInput" > - user.interface.byte.representation.description + ui.feedback.byte-representation-description - user.interface.appearance.help + ui.feedback.appearance-help
@@ -973,22 +968,21 @@ Object { - user.interface.pagesize.help + ui.feedback.pagesize-help @@ -1105,12 +1099,12 @@ Object { class="label-description" for="bytesBaseInput" > - user.interface.byte.representation.description + ui.feedback.byte-representation-description - user.interface.appearance.help + ui.feedback.appearance-help
@@ -1176,22 +1170,21 @@ Object { - user.interface.pagesize.help + ui.feedback.pagesize-help @@ -1251,12 +1244,12 @@ Object { class="label-description" for="bytesBaseInput" > - user.interface.byte.representation.description + ui.feedback.byte-representation-description - user.interface.appearance.help + ui.feedback.appearance-help
@@ -1322,22 +1315,21 @@ Object { - user.interface.pagesize.help + ui.feedback.pagesize-help diff --git a/src/utils/i18n.js b/src/utils/i18n.js index 6c09172e..a0002f04 100644 --- a/src/utils/i18n.js +++ b/src/utils/i18n.js @@ -1,11 +1,11 @@ import i18n from "i18next"; import { initReactI18next } from "react-i18next"; -import LanguageDetector from 'i18next-browser-languagedetector'; +import detector from 'i18next-browser-languagedetector'; import backend from "i18next-http-backend" i18n .use(backend) - .use(LanguageDetector) + .use(detector) .use(initReactI18next) .init({ lng: "en", @@ -18,7 +18,7 @@ i18n react: { useSuspense: true - } + }, }); export default i18n; \ No newline at end of file From 0d1c8cad0acaee9fa679686018513d46c5921b7f Mon Sep 17 00:00:00 2001 From: lupusA Date: Sat, 16 Mar 2024 18:24:20 +0100 Subject: [PATCH 17/27] npm audit fix --- .gitignore | 2 +- .vscode/i18n-ally-reviews.yml | 5 + .vscode/settings.json | 5 + package-lock.json | 199 +++++++++++------- ...eferences.test.js => Preferences.test.jsx} | 4 +- ...test.js.snap => Preferences.test.jsx.snap} | 168 ++++++++------- 6 files changed, 219 insertions(+), 164 deletions(-) create mode 100644 .vscode/i18n-ally-reviews.yml rename src/tests/{Preferences.test.js => Preferences.test.jsx} (88%) rename src/tests/__snapshots__/{Preferences.test.js.snap => Preferences.test.jsx.snap} (91%) diff --git a/.gitignore b/.gitignore index b26bb104..f2e87f4f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ build/ node_modules/ coverage/ .idea/ -.vscode/ +.vscode/settings.json diff --git a/.vscode/i18n-ally-reviews.yml b/.vscode/i18n-ally-reviews.yml new file mode 100644 index 00000000..2db97795 --- /dev/null +++ b/.vscode/i18n-ally-reviews.yml @@ -0,0 +1,5 @@ +# Review comments generated by i18n-ally. Please commit this file. + +reviews: + ui.value.appearance-large: + description: Value large diff --git a/.vscode/settings.json b/.vscode/settings.json index 7a73a41b..29b6219e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,2 +1,7 @@ { + "i18n-ally.localesPaths": [ + "public/locales" + ], + "i18n-ally.keystyle": "flat", + "i18n-ally.sourceLanguage": "en" } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b0cf61a6..2ae02f5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6208,9 +6208,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.20.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz", - "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -6220,14 +6220,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001349", - "electron-to-chromium": "^1.4.147", - "escalade": "^3.1.1", - "node-releases": "^2.0.5", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -6337,9 +6340,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001352", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", - "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==", + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", "dev": true, "funding": [ { @@ -6349,6 +6352,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -6809,28 +6816,18 @@ } }, "node_modules/core-js-compat": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.1.tgz", - "integrity": "sha512-KeYrEc8t6FJsKYB2qnDwRHWaC0cJNaqlHfCpMe5q3j/W1nje3moib/txNklddLPCtGb+etcBIyJ8zuMa/LN5/A==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", + "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", "dev": true, "dependencies": { - "browserslist": "^4.20.4", - "semver": "7.0.0" + "browserslist": "^4.22.3" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/core-js-pure": { "version": "3.23.1", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.23.1.tgz", @@ -7725,9 +7722,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.155", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.155.tgz", - "integrity": "sha512-niPzKBSYPG06gxLKO0c2kEmgdRMTtIbNrBlvD31Ld8Q57b/K0218U4j8u/OOt25XE1eFOn47FcmQVdx9R1qqxA==", + "version": "1.4.708", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.708.tgz", + "integrity": "sha512-iWgEEvREL4GTXXHKohhh33+6Y8XkPI5eHihDmm8zUk5Zo7HICEW+wI/j5kJ2tbuNUCXJ/sNXa03ajW635DiJXA==", "dev": true }, "node_modules/emittery": { @@ -9006,9 +9003,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -14001,10 +13998,16 @@ } }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -14097,9 +14100,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/normalize-path": { @@ -14721,9 +14724,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "funding": [ { @@ -14733,10 +14736,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -19460,6 +19467,36 @@ "yarn": "*" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -25150,16 +25187,15 @@ "dev": true }, "browserslist": { - "version": "4.20.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz", - "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001349", - "electron-to-chromium": "^1.4.147", - "escalade": "^3.1.1", - "node-releases": "^2.0.5", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" } }, "bser": { @@ -25239,9 +25275,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001352", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", - "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==", + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", "dev": true }, "case-sensitive-paths-webpack-plugin": { @@ -25600,21 +25636,12 @@ "dev": true }, "core-js-compat": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.1.tgz", - "integrity": "sha512-KeYrEc8t6FJsKYB2qnDwRHWaC0cJNaqlHfCpMe5q3j/W1nje3moib/txNklddLPCtGb+etcBIyJ8zuMa/LN5/A==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", + "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", "dev": true, "requires": { - "browserslist": "^4.20.4", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "browserslist": "^4.22.3" } }, "core-js-pure": { @@ -26269,9 +26296,9 @@ } }, "electron-to-chromium": { - "version": "1.4.155", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.155.tgz", - "integrity": "sha512-niPzKBSYPG06gxLKO0c2kEmgdRMTtIbNrBlvD31Ld8Q57b/K0218U4j8u/OOt25XE1eFOn47FcmQVdx9R1qqxA==", + "version": "1.4.708", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.708.tgz", + "integrity": "sha512-iWgEEvREL4GTXXHKohhh33+6Y8XkPI5eHihDmm8zUk5Zo7HICEW+wI/j5kJ2tbuNUCXJ/sNXa03ajW635DiJXA==", "dev": true }, "emittery": { @@ -27263,9 +27290,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==" + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, "fork-ts-checker-webpack-plugin": { "version": "6.5.2", @@ -31191,9 +31218,9 @@ } }, "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true }, "natural-compare": { @@ -31266,9 +31293,9 @@ "dev": true }, "node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "normalize-path": { @@ -31720,12 +31747,12 @@ } }, "postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "requires": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } @@ -35160,6 +35187,16 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, + "update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/src/tests/Preferences.test.js b/src/tests/Preferences.test.jsx similarity index 88% rename from src/tests/Preferences.test.js rename to src/tests/Preferences.test.jsx index 6149df30..b73cbca6 100644 --- a/src/tests/Preferences.test.js +++ b/src/tests/Preferences.test.jsx @@ -32,9 +32,9 @@ describe('Select the light theme', () => { test('Should select light theme', () => { userEvent.selectOptions( screen.getByTestId('themeSelector'), - screen.getByRole('option', { name: "theme.light" })); + screen.getByRole('option', { name: "ui.value.theme-light" })); - expect(screen.getByRole('option', { name: "theme.light" }).selected).toBe(true) + expect(screen.getByRole('option', { name: "ui.value.theme-light" }).selected).toBe(true) expect(wrapper).toMatchSnapshot(); }) }) diff --git a/src/tests/__snapshots__/Preferences.test.js.snap b/src/tests/__snapshots__/Preferences.test.jsx.snap similarity index 91% rename from src/tests/__snapshots__/Preferences.test.js.snap rename to src/tests/__snapshots__/Preferences.test.jsx.snap index 342c90c7..192fd285 100644 --- a/src/tests/__snapshots__/Preferences.test.js.snap +++ b/src/tests/__snapshots__/Preferences.test.jsx.snap @@ -14,32 +14,32 @@ Object { for="themeSelector" id="themeLabel" > - theme.description + ui.feedback.theme-description - theme.help + ui.feedback.theme-help
@@ -91,12 +91,12 @@ Object { - theme.help + ui.feedback.theme-help
@@ -236,12 +237,12 @@ Object { - theme.help + ui.feedback.theme-help
@@ -438,12 +440,12 @@ Object { - theme.help + ui.feedback.theme-help
@@ -583,12 +586,12 @@ Object { - theme.help + ui.feedback.theme-help
@@ -785,12 +789,12 @@ Object { - theme.help + ui.feedback.theme-help
@@ -930,12 +935,12 @@ Object { - theme.help + ui.feedback.theme-help
@@ -1132,12 +1138,12 @@ Object { - theme.help + ui.feedback.theme-help
@@ -1277,12 +1284,12 @@ Object { setTheme(e.target.value)}> - - - - + + + + - {t('ui.feedback.theme-help')} + {t('feedback.ui.theme-help')}
- - setByteStringBase(e.target.value)}> + + - {t('ui.feedback.byte-representation-help')} + {t('feedback.ui.byte-representation-help')}

{t('feedback.ui.appearance-help')}

- + - {t('ui.feedback.pagesize-help')} + type='text' placeholder={t('feedback.ui.pagesize-hint')} value={pageSize} disabled={true} /> + {t('feedback.ui.pagesize-help')}
diff --git a/src/pages/Repository.jsx b/src/pages/Repository.jsx index e056ee24..e8ecd47e 100644 --- a/src/pages/Repository.jsx +++ b/src/pages/Repository.jsx @@ -130,9 +130,9 @@ export class Repository extends Component { if (this.state.status.initTaskID) { return <>

{' '}{i18n.t('repository.status.initializing')}

{this.state.showLog ? <> - + - : } + : }
; diff --git a/src/pages/SnapshotHistory.jsx b/src/pages/SnapshotHistory.jsx index e695b260..038553c6 100644 --- a/src/pages/SnapshotHistory.jsx +++ b/src/pages/SnapshotHistory.jsx @@ -261,7 +261,7 @@ export class SnapshotHistory extends Component { this.setState({ editPinFor: [x.id], originalPinName: "", - newPinName: i18n.t('pin.feedback.standard-text'), + newPinName: i18n.t('feedback.pin.standard-text'), }); } } title={i18n.t('snapshot.event.history.pin.add')}>; @@ -438,7 +438,7 @@ export class SnapshotHistory extends Component { - {i18n.t('common.delete.confirm')} + {i18n.t('common.delete-confirm')} @@ -463,12 +463,12 @@ export class SnapshotHistory extends Component { - {i18n.t('description.feedback.description')} + {i18n.t('feedback.description.modal-title')} - {i18n.t('description.event.new')} + {i18n.t('event.description.new')} {this.state.savingSnapshot && } - - {this.state.originalSnapshotDescription && } - + + {this.state.originalSnapshotDescription && } + - {i18n.t('pin.event.snapshot.pin')} + {i18n.t('event.pin.snapshot-pin')} - {i18n.t('pin.feedback.name')} + {i18n.t('feedback.pin.name')} {this.state.savingSnapshot && } - - {this.state.originalPinName && } - + + {this.state.originalPinName && } + ; From 24281d0edb35686fc74ff67946f87ee7307268c7 Mon Sep 17 00:00:00 2001 From: lupusA Date: Sun, 17 Mar 2024 14:19:04 +0100 Subject: [PATCH 19/27] Fix test --- src/tests/Preferences.test.jsx | 4 +- .../__snapshots__/Preferences.test.jsx.snap | 272 +++++++++--------- 2 files changed, 138 insertions(+), 138 deletions(-) diff --git a/src/tests/Preferences.test.jsx b/src/tests/Preferences.test.jsx index b73cbca6..09ea26d4 100644 --- a/src/tests/Preferences.test.jsx +++ b/src/tests/Preferences.test.jsx @@ -32,9 +32,9 @@ describe('Select the light theme', () => { test('Should select light theme', () => { userEvent.selectOptions( screen.getByTestId('themeSelector'), - screen.getByRole('option', { name: "ui.value.theme-light" })); + screen.getByRole('option', { name: "value.ui.theme-light" })); - expect(screen.getByRole('option', { name: "ui.value.theme-light" }).selected).toBe(true) + expect(screen.getByRole('option', { name: "value.ui.theme-light" }).selected).toBe(true) expect(wrapper).toMatchSnapshot(); }) }) diff --git a/src/tests/__snapshots__/Preferences.test.jsx.snap b/src/tests/__snapshots__/Preferences.test.jsx.snap index 192fd285..d3b4ef38 100644 --- a/src/tests/__snapshots__/Preferences.test.jsx.snap +++ b/src/tests/__snapshots__/Preferences.test.jsx.snap @@ -14,7 +14,7 @@ Object { for="themeSelector" id="themeLabel" > - ui.feedback.theme-description + feedback.ui.theme-description - ui.feedback.theme-help + feedback.ui.theme-help
@@ -58,22 +58,22 @@ Object { class="label-description" for="bytesBaseInput" > - ui.feedback.byte-representation-description + feedback.ui.byte-representation-description - ui.feedback.byte-representation-help + feedback.ui.byte-representation-help
@@ -101,17 +101,17 @@ Object { - ui.feedback.pagesize-description + feedback.ui.pagesize-description @@ -144,7 +144,7 @@ Object { hmtlfor="pageSizeInput" id="pageSizeHelp" > - ui.feedback.pagesize-help + feedback.ui.pagesize-help @@ -160,7 +160,7 @@ Object { for="themeSelector" id="themeLabel" > - ui.feedback.theme-description + feedback.ui.theme-description - ui.feedback.theme-help + feedback.ui.theme-help
@@ -204,22 +204,22 @@ Object { class="label-description" for="bytesBaseInput" > - ui.feedback.byte-representation-description + feedback.ui.byte-representation-description - ui.feedback.byte-representation-help + feedback.ui.byte-representation-help
@@ -247,17 +247,17 @@ Object { - ui.feedback.pagesize-description + feedback.ui.pagesize-description @@ -290,7 +290,7 @@ Object { hmtlfor="pageSizeInput" id="pageSizeHelp" > - ui.feedback.pagesize-help + feedback.ui.pagesize-help @@ -363,7 +363,7 @@ Object { for="themeSelector" id="themeLabel" > - ui.feedback.theme-description + feedback.ui.theme-description - ui.feedback.theme-help + feedback.ui.theme-help
@@ -407,22 +407,22 @@ Object { class="label-description" for="bytesBaseInput" > - ui.feedback.byte-representation-description + feedback.ui.byte-representation-description - ui.feedback.byte-representation-help + feedback.ui.byte-representation-help
@@ -450,17 +450,17 @@ Object { - ui.feedback.pagesize-description + feedback.ui.pagesize-description @@ -493,7 +493,7 @@ Object { hmtlfor="pageSizeInput" id="pageSizeHelp" > - ui.feedback.pagesize-help + feedback.ui.pagesize-help @@ -509,7 +509,7 @@ Object { for="themeSelector" id="themeLabel" > - ui.feedback.theme-description + feedback.ui.theme-description - ui.feedback.theme-help + feedback.ui.theme-help
@@ -553,22 +553,22 @@ Object { class="label-description" for="bytesBaseInput" > - ui.feedback.byte-representation-description + feedback.ui.byte-representation-description - ui.feedback.byte-representation-help + feedback.ui.byte-representation-help
@@ -596,17 +596,17 @@ Object { - ui.feedback.pagesize-description + feedback.ui.pagesize-description @@ -639,7 +639,7 @@ Object { hmtlfor="pageSizeInput" id="pageSizeHelp" > - ui.feedback.pagesize-help + feedback.ui.pagesize-help @@ -712,7 +712,7 @@ Object { for="themeSelector" id="themeLabel" > - ui.feedback.theme-description + feedback.ui.theme-description - ui.feedback.theme-help + feedback.ui.theme-help
@@ -756,22 +756,22 @@ Object { class="label-description" for="bytesBaseInput" > - ui.feedback.byte-representation-description + feedback.ui.byte-representation-description - ui.feedback.byte-representation-help + feedback.ui.byte-representation-help
@@ -799,17 +799,17 @@ Object { - ui.feedback.pagesize-description + feedback.ui.pagesize-description @@ -842,7 +842,7 @@ Object { hmtlfor="pageSizeInput" id="pageSizeHelp" > - ui.feedback.pagesize-help + feedback.ui.pagesize-help @@ -858,7 +858,7 @@ Object { for="themeSelector" id="themeLabel" > - ui.feedback.theme-description + feedback.ui.theme-description - ui.feedback.theme-help + feedback.ui.theme-help
@@ -902,22 +902,22 @@ Object { class="label-description" for="bytesBaseInput" > - ui.feedback.byte-representation-description + feedback.ui.byte-representation-description - ui.feedback.byte-representation-help + feedback.ui.byte-representation-help
@@ -945,17 +945,17 @@ Object { - ui.feedback.pagesize-description + feedback.ui.pagesize-description @@ -988,7 +988,7 @@ Object { hmtlfor="pageSizeInput" id="pageSizeHelp" > - ui.feedback.pagesize-help + feedback.ui.pagesize-help @@ -1061,7 +1061,7 @@ Object { for="themeSelector" id="themeLabel" > - ui.feedback.theme-description + feedback.ui.theme-description - ui.feedback.theme-help + feedback.ui.theme-help
@@ -1105,22 +1105,22 @@ Object { class="label-description" for="bytesBaseInput" > - ui.feedback.byte-representation-description + feedback.ui.byte-representation-description - ui.feedback.byte-representation-help + feedback.ui.byte-representation-help
@@ -1148,17 +1148,17 @@ Object { - ui.feedback.pagesize-description + feedback.ui.pagesize-description @@ -1191,7 +1191,7 @@ Object { hmtlfor="pageSizeInput" id="pageSizeHelp" > - ui.feedback.pagesize-help + feedback.ui.pagesize-help @@ -1207,7 +1207,7 @@ Object { for="themeSelector" id="themeLabel" > - ui.feedback.theme-description + feedback.ui.theme-description - ui.feedback.theme-help + feedback.ui.theme-help
@@ -1251,22 +1251,22 @@ Object { class="label-description" for="bytesBaseInput" > - ui.feedback.byte-representation-description + feedback.ui.byte-representation-description - ui.feedback.byte-representation-help + feedback.ui.byte-representation-help
@@ -1294,17 +1294,17 @@ Object { - ui.feedback.pagesize-description + feedback.ui.pagesize-description @@ -1337,7 +1337,7 @@ Object { hmtlfor="pageSizeInput" id="pageSizeHelp" > - ui.feedback.pagesize-help + feedback.ui.pagesize-help From 93298ef533864c1d772d1f16904aac7e0d7b5f4c Mon Sep 17 00:00:00 2001 From: lupusA Date: Sun, 17 Mar 2024 20:35:54 +0100 Subject: [PATCH 20/27] Added tests and additional translations --- public/locales/de/translation.json | 38 +++++++++++ public/locales/en/translation.json | 38 +++++++++++ public/locales/es/translation.json | 38 +++++++++++ public/locales/fr/translation.json | 38 +++++++++++ public/locales/it/translation.json | 38 +++++++++++ public/locales/jp/translation.json | 38 +++++++++++ public/locales/pl/translation.json | 38 +++++++++++ public/locales/ru/translation.json | 38 +++++++++++ src/components/SetupRepository.jsx | 49 +++++++------ src/components/SetupRepositoryAzure.jsx | 13 ++-- src/components/SetupRepositoryB2.jsx | 9 +-- src/components/SetupRepositoryFilesystem.jsx | 3 +- src/components/SetupRepositoryGCS.jsx | 9 +-- src/pages/SnapshotDirectory.jsx | 17 ++--- src/tests/Language.test.jsx | 72 ++++++++++++++------ 15 files changed, 409 insertions(+), 67 deletions(-) diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 7ea8f5dc..40c62298 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -43,6 +43,9 @@ "feedback.provider.use-repository-token": "Repository-Token", "feedback.provider.webdav-server": "WebDAV-Server", "feedback.repository.configuration": "Speicherkonfiguration", + "feedback.repository.create-repository-new": "Neues Repository erstellen", + "feedback.repository.create-repository-new-help": "Geben Sie ein sicheres Passwort ein, um das Kopia-Repository im bereitgestellten Speicher zu erstellen.", + "feedback.repository.encryption": "Verschlüsselung", "feedback.repository.kopia-server-parameters": "Kopia-Serverparameter", "feedback.repository.name-default": "Mein Repository", "feedback.repository.provider-selection": "Wählen Sie ein Repository aus", @@ -66,11 +69,46 @@ "feedback.ui.theme-description": "Design", "feedback.ui.theme-help": "Das aktuell ausgewählte Design", "feedback.ui.theme-select": "Select theme", + "feedback.validation.azure.access-key": "Zugangsschlüssel", + "feedback.validation.azure.access-key-hint": "Geben Sie den geheimen Zugangsschlüssel ein", + "feedback.validation.azure.azure-storage-domain": "Azure Storage-Domäne", + "feedback.validation.azure.azure-storage-domain-hint": "Geben Sie die Speicherdomäne ein oder lassen Sie sie leer, um die Standardeinstellung „blob.core.windows.net“ zu verwenden.", + "feedback.validation.azure.container": "Container", + "feedback.validation.azure.container-hint": "Geben Sie den Containernamen ein", + "feedback.validation.azure.object-name-prefix": "Präfix des Objektnamens", + "feedback.validation.azure.object-name-prefix-hint": "Geben Sie das Präfix für den Objektnamen ein oder lassen Sie es leer", + "feedback.validation.azure.sas-token": "SAS-Token", + "feedback.validation.azure.sas-token-hint": "Geben Sie den geheimen SAS-Token ein", + "feedback.validation.azure.storage-account": "Speicherkonto", + "feedback.validation.azure.storage-account-hint": "Geben Sie den Namen des Speicherkontos ein", + "feedback.validation.b2.bucket-name": "B2-Bucket", + "feedback.validation.b2.bucket-name-hint": "Geben Sie den Bucket-Namen ein", + "feedback.validation.b2.key": "Schlüssel", + "feedback.validation.b2.key-hint": "Geben Sie den geheimen Anwendungs- oder Kontoschlüssel ein", + "feedback.validation.b2.key-id": "Schlüssel-ID", + "feedback.validation.b2.key-id-hint": "Geben Sie die Anwendungs- oder Kontoschlüssel-ID ein", + "feedback.validation.b2.object-name-prefix": "Präfix des Objektnamens", + "feedback.validation.b2.object-name-prefix-hint": "Geben Sie das Präfix für den Objektnamen ein oder lassen Sie es leer", + "feedback.validation.gcs.bucket-name": "GCS-Bucket", + "feedback.validation.gcs.bucket-name-hint": "Geben Sie den Bucket-Namen ein", + "feedback.validation.gcs.credentials-file": "Anmeldeinformationsdatei", + "feedback.validation.gcs.credentials-file-hint": "Geben Sie den Namen der JSON-Datei mit den Anmeldeinformationen ein", + "feedback.validation.gcs.credentials-json": "Anmeldeinformationen JSON", + "feedback.validation.gcs.credentials-json-paste": "Fügen Sie hier JSON-Anmeldeinformationen ein", + "feedback.validation.gcs.object-name-prefix": "Präfix des Objektnamens", + "feedback.validation.gcs.object-name-prefix-hint": "Geben Sie das Präfix für den Objektnamen ein oder lassen Sie es leer", "feedback.validation.invalid-times-of-day": "Ungültige Tageszeiten", + "feedback.validation.local.directory-path": "Verzeichnispfad", + "feedback.validation.local.directory-path-hint": "Geben Sie den Verzeichnispfad ein, in dem Sie die Repository-Dateien speichern möchten", "feedback.validation.optional.valid-number-or-empty": "Muss eine gültige Zahl sein oder leer sein", "feedback.validation.passwords-dont-match": "Passwörter stimmen nicht überein", "feedback.validation.required.directory": "Pflichtfeld", "feedback.validation.required.field": "Pflichtfeld", + "feedback.validation.required.password-repository": "Repository-Passwort", + "feedback.validation.required.password-repository-help": "Wird zum Verschlüsseln des Repository-Inhalts verwendet", + "feedback.validation.required.password-repository-hint": "Geben Sie das Repository-Passwort ein", + "feedback.validation.required.repository-password-confirm": "Bestätigen Sie das Repository-Passwort", + "feedback.validation.required.repository-password-confirm-again": "Geben Sie das Repository-Passwort erneut ein", "feedback.validation.required.valid-number-or-empty": "Muss eine gültige Zahl oder leer sein", "policies.feedback.find.count_one": "{{count}} Richtlinie gefunden, die den Kriterien entspricht", "policies.feedback.find.count_other": "{{count}} Richtlinien gefunden, die den Kriterien entsprechen", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 5db70314..4eb4cd01 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -43,6 +43,9 @@ "feedback.provider.use-repository-token": "Use Repository Token", "feedback.provider.webdav-server": "WebDAV Server", "feedback.repository.configuration": "Storage Configuration", + "feedback.repository.create-repository-new": "Create New Repository", + "feedback.repository.create-repository-new-help": "Enter a strong password to create Kopia repository in the provided storage.", + "feedback.repository.encryption": "Encryption", "feedback.repository.kopia-server-parameters": "Kopia Server Parameters", "feedback.repository.name-default": "My Repository", "feedback.repository.provider-selection": "Select Storage Type", @@ -66,11 +69,46 @@ "feedback.ui.theme-description": "Theme", "feedback.ui.theme-help": "The current active theme", "feedback.ui.theme-select": "Select theme", + "feedback.validation.azure.access-key": "Access Key", + "feedback.validation.azure.access-key-hint": "Enter secret access key", + "feedback.validation.azure.azure-storage-domain": "Azure Storage Domain", + "feedback.validation.azure.azure-storage-domain-hint": "Enter storage domain or leave empty for default 'blob.core.windows.net'", + "feedback.validation.azure.container": "Container", + "feedback.validation.azure.container-hint": "Enter container name", + "feedback.validation.azure.object-name-prefix": "Object Name Prefix", + "feedback.validation.azure.object-name-prefix-hint": "Enter object name prefix or leave empty", + "feedback.validation.azure.sas-token": "SAS Token", + "feedback.validation.azure.sas-token-hint": "Enter secret SAS Token", + "feedback.validation.azure.storage-account": "Storage Account", + "feedback.validation.azure.storage-account-hint": "Enter storage account name", + "feedback.validation.b2.bucket-name": "B2 Bucket", + "feedback.validation.b2.bucket-name-hint": "Enter bucket name", + "feedback.validation.b2.key": "Key", + "feedback.validation.b2.key-hint": "Enter secret application or account key", + "feedback.validation.b2.key-id": "Key ID", + "feedback.validation.b2.key-id-hint": "Enter application or account key ID", + "feedback.validation.b2.object-name-prefix": "Object Name Prefix", + "feedback.validation.b2.object-name-prefix-hint": "Enter object name prefix or leave empty", + "feedback.validation.gcs.bucket-name": "GCS Bucket", + "feedback.validation.gcs.bucket-name-hint": "Enter bucket name", + "feedback.validation.gcs.credentials-file": "Credentials File", + "feedback.validation.gcs.credentials-file-hint": "Enter name of credentials JSON file", + "feedback.validation.gcs.credentials-json": "Credentials JSON", + "feedback.validation.gcs.credentials-json-paste": "Paste JSON credentials here", + "feedback.validation.gcs.object-name-prefix": "Object Name Prefix", + "feedback.validation.gcs.object-name-prefix-hint": "Enter object name prefix or leave empty", "feedback.validation.invalid-times-of-day": "Invalid Times of Day", + "feedback.validation.local.directory-path": "Directory Path", + "feedback.validation.local.directory-path-hint": "Enter directory path where you want to store repository files", "feedback.validation.optional.valid-number-or-empty": "Must be a valid number or empty", "feedback.validation.passwords-dont-match": "Passwords don't match", "feedback.validation.required.directory": "Required field", "feedback.validation.required.field": "Required field", + "feedback.validation.required.password-repository": "Repository Password", + "feedback.validation.required.password-repository-help": "Used to encrypt the repository's contents", + "feedback.validation.required.password-repository-hint": "Enter repository password", + "feedback.validation.required.repository-password-confirm": "Confirm Repository Password", + "feedback.validation.required.repository-password-confirm-again": "enter repository password again", "feedback.validation.required.valid-number-or-empty": "Must be a valid number or empty", "policies.feedback.find.count_one": "Found {{count}} policy matching the criteria", "policies.feedback.find.count_other": "Found {{count}} policies matching the criteria", diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 95a0ada8..dc314434 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -43,6 +43,9 @@ "feedback.provider.use-repository-token": "Usar token de repositorio", "feedback.provider.webdav-server": "Servidor WebDAV", "feedback.repository.configuration": "Configuración de almacenamiento", + "feedback.repository.create-repository-new": "Crear nuevo repositorio", + "feedback.repository.create-repository-new-help": "Ingrese una contraseña segura para crear el repositorio de Kopia en el almacenamiento proporcionado.", + "feedback.repository.encryption": "Cifrado", "feedback.repository.kopia-server-parameters": "Parámetros del servidor Kopia", "feedback.repository.name-default": "Mi repositorio", "feedback.repository.provider-selection": "Seleccione el tipo de almacenamiento", @@ -66,11 +69,46 @@ "feedback.ui.theme-description": "Tema", "feedback.ui.theme-help": "El tema activo actual", "feedback.ui.theme-select": "Seleccionar tema", + "feedback.validation.azure.access-key": "Llave de acceso", + "feedback.validation.azure.access-key-hint": "Introduzca la clave de acceso secreta", + "feedback.validation.azure.azure-storage-domain": "Dominio de almacenamiento de Azure", + "feedback.validation.azure.azure-storage-domain-hint": "Ingrese el dominio de almacenamiento o déjelo vacío para el valor predeterminado 'blob.core.windows.net'", + "feedback.validation.azure.container": "Envase", + "feedback.validation.azure.container-hint": "Introduzca el nombre del contenedor", + "feedback.validation.azure.object-name-prefix": "Prefijo del nombre del objeto", + "feedback.validation.azure.object-name-prefix-hint": "Introduzca el prefijo del nombre del objeto o déjelo vacío", + "feedback.validation.azure.sas-token": "Ficha SAS", + "feedback.validation.azure.sas-token-hint": "Ingrese el token SAS secreto", + "feedback.validation.azure.storage-account": "Cuenta de almacenamiento", + "feedback.validation.azure.storage-account-hint": "Ingrese el nombre de la cuenta de almacenamiento", + "feedback.validation.b2.bucket-name": "Balde B2", + "feedback.validation.b2.bucket-name-hint": "Introduce el nombre del depósito", + "feedback.validation.b2.key": "Llave", + "feedback.validation.b2.key-hint": "Ingrese la aplicación secreta o la clave de cuenta", + "feedback.validation.b2.key-id": "ID de clave", + "feedback.validation.b2.key-id-hint": "Ingrese la ID de la clave de la aplicación o de la cuenta", + "feedback.validation.b2.object-name-prefix": "Prefijo del nombre del objeto", + "feedback.validation.b2.object-name-prefix-hint": "Introduzca el prefijo del nombre del objeto o déjelo vacío", + "feedback.validation.gcs.bucket-name": "Cucharón GCS", + "feedback.validation.gcs.bucket-name-hint": "Introduce el nombre del depósito", + "feedback.validation.gcs.credentials-file": "Archivo de credenciales", + "feedback.validation.gcs.credentials-file-hint": "Ingrese el nombre del archivo JSON de credenciales", + "feedback.validation.gcs.credentials-json": "Credenciales JSON", + "feedback.validation.gcs.credentials-json-paste": "Pegue las credenciales JSON aquí", + "feedback.validation.gcs.object-name-prefix": "Prefijo del nombre del objeto", + "feedback.validation.gcs.object-name-prefix-hint": "Introduzca el prefijo del nombre del objeto o déjelo vacío", "feedback.validation.invalid-times-of-day": "Horas del día no válidas", + "feedback.validation.local.directory-path": "Ruta de directorio", + "feedback.validation.local.directory-path-hint": "Ingrese la ruta del directorio donde desea almacenar los archivos del repositorio", "feedback.validation.optional.valid-number-or-empty": "Debe ser un número válido o vacío.", "feedback.validation.passwords-dont-match": "Las contraseñas no coinciden", "feedback.validation.required.directory": "Campo requerido", "feedback.validation.required.field": "Campo requerido", + "feedback.validation.required.password-repository": "Contraseña del repositorio", + "feedback.validation.required.password-repository-help": "Se utiliza para cifrar el contenido del repositorio.", + "feedback.validation.required.password-repository-hint": "Ingrese la contraseña del repositorio", + "feedback.validation.required.repository-password-confirm": "Confirmar contraseña del repositorio", + "feedback.validation.required.repository-password-confirm-again": "ingrese la contraseña del repositorio nuevamente", "feedback.validation.required.valid-number-or-empty": "Debe ser un número válido o vacío.", "policies.feedback.find.count_one": "Se encontró {{count}} política que coincide con los criterios", "policies.feedback.find.count_other": "Se encontraron {{count}} políticas que coinciden con los criterios", diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 0f72e94b..64f16d33 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -43,6 +43,9 @@ "feedback.provider.use-repository-token": "Utiliser le jeton de référentiel", "feedback.provider.webdav-server": "Serveur WebDAV", "feedback.repository.configuration": "Configuration du stockage", + "feedback.repository.create-repository-new": "Créer un nouveau référentiel", + "feedback.repository.create-repository-new-help": "Entrez un mot de passe fort pour créer le référentiel Kopia dans le stockage fourni.", + "feedback.repository.encryption": "Chiffrement", "feedback.repository.kopia-server-parameters": "Paramètres du serveur Kopia", "feedback.repository.name-default": "Mon référentiel", "feedback.repository.provider-selection": "Sélectionnez le type de stockage", @@ -66,11 +69,46 @@ "feedback.ui.theme-description": "Thème", "feedback.ui.theme-help": "Le thème actif actuel", "feedback.ui.theme-select": "Sélectionnez un thème", + "feedback.validation.azure.access-key": "Clef d'accès", + "feedback.validation.azure.access-key-hint": "Entrez la clé d'accès secrète", + "feedback.validation.azure.azure-storage-domain": "Domaine de stockage Azure", + "feedback.validation.azure.azure-storage-domain-hint": "Entrez le domaine de stockage ou laissez vide pour « blob.core.windows.net » par défaut.", + "feedback.validation.azure.container": "Récipient", + "feedback.validation.azure.container-hint": "Entrez le nom du conteneur", + "feedback.validation.azure.object-name-prefix": "Préfixe du nom de l'objet", + "feedback.validation.azure.object-name-prefix-hint": "Entrez le préfixe du nom de l'objet ou laissez vide", + "feedback.validation.azure.sas-token": "Jeton SAS", + "feedback.validation.azure.sas-token-hint": "Entrez le jeton SAS secret", + "feedback.validation.azure.storage-account": "Compte de stockage", + "feedback.validation.azure.storage-account-hint": "Saisissez le nom du compte de stockage", + "feedback.validation.b2.bucket-name": "Godet B2", + "feedback.validation.b2.bucket-name-hint": "Saisissez le nom du compartiment", + "feedback.validation.b2.key": "Clé", + "feedback.validation.b2.key-hint": "Entrez l'application secrète ou la clé de compte", + "feedback.validation.b2.key-id": "ID de clé", + "feedback.validation.b2.key-id-hint": "Saisissez l'ID de la clé de l'application ou du compte", + "feedback.validation.b2.object-name-prefix": "Préfixe du nom de l'objet", + "feedback.validation.b2.object-name-prefix-hint": "Entrez le préfixe du nom de l'objet ou laissez vide", + "feedback.validation.gcs.bucket-name": "Godet GCS", + "feedback.validation.gcs.bucket-name-hint": "Saisissez le nom du compartiment", + "feedback.validation.gcs.credentials-file": "Fichier d'informations d'identification", + "feedback.validation.gcs.credentials-file-hint": "Entrez le nom du fichier JSON d'informations d'identification", + "feedback.validation.gcs.credentials-json": "Identifiants JSON", + "feedback.validation.gcs.credentials-json-paste": "Collez les informations d'identification JSON ici", + "feedback.validation.gcs.object-name-prefix": "Préfixe du nom de l'objet", + "feedback.validation.gcs.object-name-prefix-hint": "Entrez le préfixe du nom de l'objet ou laissez vide", "feedback.validation.invalid-times-of-day": "Heures de la journée invalides", + "feedback.validation.local.directory-path": "Chemin du répertoire", + "feedback.validation.local.directory-path-hint": "Entrez le chemin du répertoire dans lequel vous souhaitez stocker les fichiers du référentiel", "feedback.validation.optional.valid-number-or-empty": "Doit être un numéro valide ou vide", "feedback.validation.passwords-dont-match": "Les mots de passe ne correspondent pas", "feedback.validation.required.directory": "champs requis", "feedback.validation.required.field": "champs requis", + "feedback.validation.required.password-repository": "Mot de passe du référentiel", + "feedback.validation.required.password-repository-help": "Utilisé pour chiffrer le contenu du référentiel", + "feedback.validation.required.password-repository-hint": "Entrez le mot de passe du référentiel", + "feedback.validation.required.repository-password-confirm": "Confirmer le mot de passe du référentiel", + "feedback.validation.required.repository-password-confirm-again": "entrez à nouveau le mot de passe du référentiel", "feedback.validation.required.valid-number-or-empty": "Doit être un numéro valide ou vide", "policies.feedback.find.count_one": "{{count}} politiques correspondant aux critères ont été trouvées", "policies.feedback.find.count_other": "{{count}} politiques correspondant aux critères ont été trouvées", diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index 4cdcb1a8..32f8339a 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -43,6 +43,9 @@ "feedback.provider.use-repository-token": "Utilizza token di archivio", "feedback.provider.webdav-server": "Server WebDAV", "feedback.repository.configuration": "Configurazione di archiviazione", + "feedback.repository.create-repository-new": "Crea nuovo archivio", + "feedback.repository.create-repository-new-help": "Inserisci una password complessa per creare il repository Kopia nello spazio di archiviazione fornito.", + "feedback.repository.encryption": "Crittografia", "feedback.repository.kopia-server-parameters": "Parametri del server Copia", "feedback.repository.name-default": "Il mio deposito", "feedback.repository.provider-selection": "Seleziona il tipo di archiviazione", @@ -66,11 +69,46 @@ "feedback.ui.theme-description": "Tema", "feedback.ui.theme-help": "Il tema attivo corrente", "feedback.ui.theme-select": "Seleziona il tema", + "feedback.validation.azure.access-key": "Chiave di accesso", + "feedback.validation.azure.access-key-hint": "Inserisci la chiave di accesso segreta", + "feedback.validation.azure.azure-storage-domain": "Dominio di archiviazione di Azure", + "feedback.validation.azure.azure-storage-domain-hint": "Inserisci il dominio di archiviazione o lascia vuoto il campo predefinito \"blob.core.windows.net\"", + "feedback.validation.azure.container": "Contenitore", + "feedback.validation.azure.container-hint": "Inserisci il nome del contenitore", + "feedback.validation.azure.object-name-prefix": "Prefisso nome oggetto", + "feedback.validation.azure.object-name-prefix-hint": "Inserisci il prefisso del nome dell'oggetto o lascia vuoto", + "feedback.validation.azure.sas-token": "Gettone SAS", + "feedback.validation.azure.sas-token-hint": "Inserisci il token SAS segreto", + "feedback.validation.azure.storage-account": "Conto di archiviazione", + "feedback.validation.azure.storage-account-hint": "Immettere il nome dell'account di archiviazione", + "feedback.validation.b2.bucket-name": "Benna B2", + "feedback.validation.b2.bucket-name-hint": "Inserisci il nome del bucket", + "feedback.validation.b2.key": "Chiave", + "feedback.validation.b2.key-hint": "Inserisci l'applicazione segreta o la chiave dell'account", + "feedback.validation.b2.key-id": "ID chiave", + "feedback.validation.b2.key-id-hint": "Inserisci l'ID della chiave dell'applicazione o dell'account", + "feedback.validation.b2.object-name-prefix": "Prefisso nome oggetto", + "feedback.validation.b2.object-name-prefix-hint": "Inserisci il prefisso del nome dell'oggetto o lascia vuoto", + "feedback.validation.gcs.bucket-name": "Benna GCS", + "feedback.validation.gcs.bucket-name-hint": "Inserisci il nome del bucket", + "feedback.validation.gcs.credentials-file": "File delle credenziali", + "feedback.validation.gcs.credentials-file-hint": "Immettere il nome del file JSON delle credenziali", + "feedback.validation.gcs.credentials-json": "Credenziali JSON", + "feedback.validation.gcs.credentials-json-paste": "Incolla qui le credenziali JSON", + "feedback.validation.gcs.object-name-prefix": "Prefisso nome oggetto", + "feedback.validation.gcs.object-name-prefix-hint": "Inserisci il prefisso del nome dell'oggetto o lascia vuoto", "feedback.validation.invalid-times-of-day": "Orari del giorno non validi", + "feedback.validation.local.directory-path": "Percorso della directory", + "feedback.validation.local.directory-path-hint": "Inserisci il percorso della directory in cui desideri archiviare i file del repository", "feedback.validation.optional.valid-number-or-empty": "Deve essere un numero valido o vuoto", "feedback.validation.passwords-dont-match": "Le password non corrispondono", "feedback.validation.required.directory": "campo obbligatorio", "feedback.validation.required.field": "campo obbligatorio", + "feedback.validation.required.password-repository": "Password dell'archivio", + "feedback.validation.required.password-repository-help": "Utilizzato per crittografare il contenuto del repository", + "feedback.validation.required.password-repository-hint": "Inserisci la password dell'archivio", + "feedback.validation.required.repository-password-confirm": "Conferma la password dell'archivio", + "feedback.validation.required.repository-password-confirm-again": "immettere nuovamente la password del repository", "feedback.validation.required.valid-number-or-empty": "Deve essere un numero valido o vuoto", "policies.feedback.find.count_one": "Trovata {{count}} policy corrispondente ai criteri", "policies.feedback.find.count_other": "Trovate {{count}} politiche che corrispondono ai criteri", diff --git a/public/locales/jp/translation.json b/public/locales/jp/translation.json index 4d2e366f..0acdd5b3 100644 --- a/public/locales/jp/translation.json +++ b/public/locales/jp/translation.json @@ -43,6 +43,9 @@ "feedback.provider.use-repository-token": "Use Repository Token", "feedback.provider.webdav-server": "WebDAV Server", "feedback.repository.configuration": "Storage Configuration", + "feedback.repository.create-repository-new": "Create New Repository", + "feedback.repository.create-repository-new-help": "Enter a strong password to create Kopia repository in the provided storage.", + "feedback.repository.encryption": "Encryption", "feedback.repository.kopia-server-parameters": "Kopia Server Parameters", "feedback.repository.name-default": "My Repository", "feedback.repository.provider-selection": "Select Storage Type", @@ -66,11 +69,46 @@ "feedback.ui.theme-description": "テーマ", "feedback.ui.theme-help": "現在のアクティブなテーマ", "feedback.ui.theme-select": "テーマを選択", + "feedback.validation.azure.access-key": "Access Key", + "feedback.validation.azure.access-key-hint": "Enter secret access key", + "feedback.validation.azure.azure-storage-domain": "Azure Storage Domain", + "feedback.validation.azure.azure-storage-domain-hint": "feedback.validation.azure.azure-storage-domain-hint", + "feedback.validation.azure.container": "Container", + "feedback.validation.azure.container-hint": "Enter container name", + "feedback.validation.azure.object-name-prefix": "Object Name Prefix", + "feedback.validation.azure.object-name-prefix-hint": "Enter object name prefix or leave empty", + "feedback.validation.azure.sas-token": "SAS Token", + "feedback.validation.azure.sas-token-hint": "Enter secret SAS Token", + "feedback.validation.azure.storage-account": "Storage Account", + "feedback.validation.azure.storage-account-hint": "Enter storage account name", + "feedback.validation.b2.bucket-name": "B2 Bucket", + "feedback.validation.b2.bucket-name-hint": "Enter bucket name", + "feedback.validation.b2.key": "Key", + "feedback.validation.b2.key-hint": "Enter secret application or account key", + "feedback.validation.b2.key-id": "Key ID", + "feedback.validation.b2.key-id-hint": "Enter application or account key ID", + "feedback.validation.b2.object-name-prefix": "Object Name Prefix", + "feedback.validation.b2.object-name-prefix-hint": "Enter object name prefix or leave empty", + "feedback.validation.gcs.bucket-name": "GCS Bucket", + "feedback.validation.gcs.bucket-name-hint": "Enter bucket name", + "feedback.validation.gcs.credentials-file": "Credentials File", + "feedback.validation.gcs.credentials-file-hint": "Enter name of credentials JSON file", + "feedback.validation.gcs.credentials-json": "Credentials JSON", + "feedback.validation.gcs.credentials-json-paste": "Paste JSON credentials here", + "feedback.validation.gcs.object-name-prefix": "Object Name Prefix", + "feedback.validation.gcs.object-name-prefix-hint": "Enter object name prefix or leave empty", "feedback.validation.invalid-times-of-day": "Invalid Times of Day", + "feedback.validation.local.directory-path": "Directory Path", + "feedback.validation.local.directory-path-hint": "Enter directory path where you want to store repository files", "feedback.validation.optional.valid-number-or-empty": "Must be a valid number or empty", "feedback.validation.passwords-dont-match": "Passwords don't match", "feedback.validation.required.directory": "Required field", "feedback.validation.required.field": "Required field", + "feedback.validation.required.password-repository": "Repository Password", + "feedback.validation.required.password-repository-help": "Used to encrypt the repository's contents", + "feedback.validation.required.password-repository-hint": "Enter repository password", + "feedback.validation.required.repository-password-confirm": "Confirm Repository Password", + "feedback.validation.required.repository-password-confirm-again": "enter repository password again", "feedback.validation.required.valid-number-or-empty": "Must be a valid number or empty", "policies.feedback.find.count_one": "Found {{count}} policy matching the criteria", "policies.feedback.find.count_other": "Found {{count}} policies matching the criteria", diff --git a/public/locales/pl/translation.json b/public/locales/pl/translation.json index 8cb65061..482270c6 100644 --- a/public/locales/pl/translation.json +++ b/public/locales/pl/translation.json @@ -43,6 +43,9 @@ "feedback.provider.use-repository-token": "Użyj tokena repozytorium", "feedback.provider.webdav-server": "Serwer WebDAV", "feedback.repository.configuration": "Konfiguracja pamięci", + "feedback.repository.create-repository-new": "Utwórz nowe repozytorium", + "feedback.repository.create-repository-new-help": "Wprowadź silne hasło, aby utworzyć repozytorium Kopia w udostępnionym magazynie.", + "feedback.repository.encryption": "Szyfrowanie", "feedback.repository.kopia-server-parameters": "Parametry serwera Kopia", "feedback.repository.name-default": "Moje repozytorium", "feedback.repository.provider-selection": "Wybierz Typ przechowywania", @@ -66,11 +69,46 @@ "feedback.ui.theme-description": "Kolorystyka", "feedback.ui.theme-help": "Aktywny schemat kolorów", "feedback.ui.theme-select": "Wybierz schemat kolorów", + "feedback.validation.azure.access-key": "Klucz dostępu", + "feedback.validation.azure.access-key-hint": "Wprowadź tajny klucz dostępu", + "feedback.validation.azure.azure-storage-domain": "Domena magazynu Azure", + "feedback.validation.azure.azure-storage-domain-hint": "Wprowadź domenę magazynu lub pozostaw puste dla domyślnego „blob.core.windows.net”", + "feedback.validation.azure.container": "Pojemnik", + "feedback.validation.azure.container-hint": "Wpisz nazwę kontenera", + "feedback.validation.azure.object-name-prefix": "Przedrostek nazwy obiektu", + "feedback.validation.azure.object-name-prefix-hint": "Wprowadź przedrostek nazwy obiektu lub pozostaw puste", + "feedback.validation.azure.sas-token": "Token SAS-owy", + "feedback.validation.azure.sas-token-hint": "Wprowadź tajny token SAS", + "feedback.validation.azure.storage-account": "Konto magazynu", + "feedback.validation.azure.storage-account-hint": "Wprowadź nazwę konta magazynu", + "feedback.validation.b2.bucket-name": "Wiadro B2", + "feedback.validation.b2.bucket-name-hint": "Wpisz nazwę zasobnika", + "feedback.validation.b2.key": "Klucz", + "feedback.validation.b2.key-hint": "Wprowadź tajną aplikację lub klucz konta", + "feedback.validation.b2.key-id": "Identyfikator klucza", + "feedback.validation.b2.key-id-hint": "Wprowadź identyfikator klucza aplikacji lub konta", + "feedback.validation.b2.object-name-prefix": "Przedrostek nazwy obiektu", + "feedback.validation.b2.object-name-prefix-hint": "Wprowadź przedrostek nazwy obiektu lub pozostaw puste", + "feedback.validation.gcs.bucket-name": "Wiadro GCS", + "feedback.validation.gcs.bucket-name-hint": "Wpisz nazwę zasobnika", + "feedback.validation.gcs.credentials-file": "Plik poświadczeń", + "feedback.validation.gcs.credentials-file-hint": "Wprowadź nazwę pliku JSON poświadczeń", + "feedback.validation.gcs.credentials-json": "Poświadczenia JSON", + "feedback.validation.gcs.credentials-json-paste": "Wklej tutaj dane uwierzytelniające JSON", + "feedback.validation.gcs.object-name-prefix": "Przedrostek nazwy obiektu", + "feedback.validation.gcs.object-name-prefix-hint": "Wprowadź przedrostek nazwy obiektu lub pozostaw puste", "feedback.validation.invalid-times-of-day": "Nieprawidłowe pory dnia", + "feedback.validation.local.directory-path": "Ścieżka katalogu", + "feedback.validation.local.directory-path-hint": "Wprowadź ścieżkę katalogu, w którym chcesz przechowywać pliki repozytorium", "feedback.validation.optional.valid-number-or-empty": "Musi to być prawidłowy numer lub pusty", "feedback.validation.passwords-dont-match": "Hasła nie pasują", "feedback.validation.required.directory": "Pole wymagane", "feedback.validation.required.field": "Pole wymagane", + "feedback.validation.required.password-repository": "Hasło do repozytorium", + "feedback.validation.required.password-repository-help": "Służy do szyfrowania zawartości repozytorium", + "feedback.validation.required.password-repository-hint": "Wprowadź hasło do repozytorium", + "feedback.validation.required.repository-password-confirm": "Potwierdź hasło do repozytorium", + "feedback.validation.required.repository-password-confirm-again": "wprowadź ponownie hasło do repozytorium", "feedback.validation.required.valid-number-or-empty": "Musi to być prawidłowy numer lub pusty", "policies.feedback.find.count_one": "Znaleziono {{count}} zasad spełniających kryteria", "policies.feedback.find.count_other": "Znaleziono {{count}} zasad spełniających kryteria", diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index 4a100c88..d74b64b2 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -43,6 +43,9 @@ "feedback.provider.use-repository-token": "Использовать токен репозитория", "feedback.provider.webdav-server": "ВебДАВ-сервер", "feedback.repository.configuration": "Конфигурация хранилища", + "feedback.repository.create-repository-new": "Создать новый репозиторий", + "feedback.repository.create-repository-new-help": "Введите надежный пароль, чтобы создать репозиторий Kopia в предоставленном хранилище.", + "feedback.repository.encryption": "Шифрование", "feedback.repository.kopia-server-parameters": "Параметры сервера Копия", "feedback.repository.name-default": "Мой репозиторий", "feedback.repository.provider-selection": "Выберите тип хранилища", @@ -66,11 +69,46 @@ "feedback.ui.theme-description": "Тема", "feedback.ui.theme-help": "Текущая активная тема", "feedback.ui.theme-select": "Выберите тему", + "feedback.validation.azure.access-key": "Ключ доступа", + "feedback.validation.azure.access-key-hint": "Введите секретный ключ доступа", + "feedback.validation.azure.azure-storage-domain": "Домен хранилища Azure", + "feedback.validation.azure.azure-storage-domain-hint": "Введите домен хранения или оставьте пустым для значения по умолчанию «blob.core.windows.net».", + "feedback.validation.azure.container": "Контейнер", + "feedback.validation.azure.container-hint": "Введите имя контейнера", + "feedback.validation.azure.object-name-prefix": "Префикс имени объекта", + "feedback.validation.azure.object-name-prefix-hint": "Введите префикс имени объекта или оставьте пустым.", + "feedback.validation.azure.sas-token": "Токен SAS", + "feedback.validation.azure.sas-token-hint": "Введите секретный токен SAS", + "feedback.validation.azure.storage-account": "Учетная запись хранения", + "feedback.validation.azure.storage-account-hint": "Введите имя учетной записи хранения", + "feedback.validation.b2.bucket-name": "Ведро Б2", + "feedback.validation.b2.bucket-name-hint": "Введите название сегмента", + "feedback.validation.b2.key": "Ключ", + "feedback.validation.b2.key-hint": "Введите секретный ключ приложения или аккаунта", + "feedback.validation.b2.key-id": "Идентификатор ключа", + "feedback.validation.b2.key-id-hint": "Введите идентификатор ключа приложения или учетной записи", + "feedback.validation.b2.object-name-prefix": "Префикс имени объекта", + "feedback.validation.b2.object-name-prefix-hint": "Введите префикс имени объекта или оставьте пустым.", + "feedback.validation.gcs.bucket-name": "Сегмент ГКС", + "feedback.validation.gcs.bucket-name-hint": "Введите название сегмента", + "feedback.validation.gcs.credentials-file": "Файл учетных данных", + "feedback.validation.gcs.credentials-file-hint": "Введите имя файла JSON учетных данных", + "feedback.validation.gcs.credentials-json": "Учетные данные JSON", + "feedback.validation.gcs.credentials-json-paste": "Вставьте сюда учетные данные JSON.", + "feedback.validation.gcs.object-name-prefix": "Префикс имени объекта", + "feedback.validation.gcs.object-name-prefix-hint": "Введите префикс имени объекта или оставьте пустым.", "feedback.validation.invalid-times-of-day": "Неверное время суток", + "feedback.validation.local.directory-path": "Путь к каталогу", + "feedback.validation.local.directory-path-hint": "Введите путь к каталогу, в котором вы хотите хранить файлы репозитория.", "feedback.validation.optional.valid-number-or-empty": "Должно быть действительным числом или пустым.", "feedback.validation.passwords-dont-match": "Пароли не совпадают", "feedback.validation.required.directory": "Обязательное поле", "feedback.validation.required.field": "Обязательное поле", + "feedback.validation.required.password-repository": "Пароль репозитория", + "feedback.validation.required.password-repository-help": "Используется для шифрования содержимого репозитория.", + "feedback.validation.required.password-repository-hint": "Введите пароль репозитория", + "feedback.validation.required.repository-password-confirm": "Подтвердите пароль репозитория", + "feedback.validation.required.repository-password-confirm-again": "введите пароль хранилища еще раз", "feedback.validation.required.valid-number-or-empty": "Должно быть действительным числом или пустым.", "policies.feedback.find.count_one": "Найдено {{count}} политики, соответствующей критериям.", "policies.feedback.find.count_other": "Найдено {{count}} политик, соответствующих критериям.", diff --git a/src/components/SetupRepository.jsx b/src/components/SetupRepository.jsx index 860af136..dbfc7f2f 100644 --- a/src/components/SetupRepository.jsx +++ b/src/components/SetupRepository.jsx @@ -39,7 +39,7 @@ const supportedProviders = [ { provider: "webdav", description: 'feedback.provider.webdav-server', component: SetupRepositoryWebDAV }, { provider: "_server", description: 'feedback.provider.kopia-repository-server', component: SetupRepositoryServer }, { provider: "_token", description: 'feedback.provider.use-repository-token', component: SetupRepositoryToken }, - ]; +]; export class SetupRepository extends Component { constructor() { @@ -333,8 +333,7 @@ export class SetupRepository extends Component { variant="primary" aria-controls="advanced-options-div" aria-expanded={this.state.showAdvanced} - size="sm" - > + size="sm"> {text} ; @@ -342,11 +341,11 @@ export class SetupRepository extends Component { renderConfirmCreate() { return
-

Create New Repository

-

Enter a strong password to create Kopia repository in the provided storage.

+

{i18n.t('feedback.repository.create-repository-new')}

+

{i18n.t('feedback.repository.create-repository-new-help')}

- {RequiredField(this, "Repository Password", "password", { autoFocus: true, type: "password", placeholder: "enter repository password" }, "Used to encrypt the repository's contents")} - {RequiredField(this, "Confirm Repository Password", "confirmPassword", { type: "password", placeholder: "enter repository password again" })} + {RequiredField(this, i18n.t('feedback.validation.required.password-repository'), "password", { autoFocus: true, type: "password", placeholder: i18n.t('feedback.validation.required.password-repository-hint') }, i18n.t('feedback.validation.required.password-repository-help'))} + {RequiredField(this, i18n.t('feedback.validation.required.repository-password-confirm'), "confirmPassword", { type: "password", placeholder: i18n.t('feedback.validation.required.repository-password-confirm-again')})}
{this.toggleAdvancedButton()} @@ -355,7 +354,7 @@ export class SetupRepository extends Component {
- Encryption + {i18n.t('feedback.repository.encryption')} Hash Algorithm + name="hash" + onChange={this.handleChange} + data-testid="control-hash" + value={this.state.hash}> {this.state.algorithms.hash.map(x => toAlgorithmOption(x, this.state.defaultHash))} Splitter + name="splitter" + onChange={this.handleChange} + data-testid="control-splitter" + value={this.state.splitter}> {this.state.algorithms.splitter.map(x => toAlgorithmOption(x, this.state.defaultSplitter))} @@ -389,10 +388,10 @@ export class SetupRepository extends Component { Repository Format + name="formatVersion" + onChange={this.handleChange} + data-testid="control-formatVersion" + value={this.state.formatVersion}> @@ -400,10 +399,10 @@ export class SetupRepository extends Component { Error Correction Overhead + name="eccOverheadPercent" + onChange={this.handleChange} + data-testid="control-eccOverheadPercent" + value={this.state.eccOverheadPercent}> @@ -431,7 +430,7 @@ export class SetupRepository extends Component { [EXPERIMENTAL] Error correction can help protect from certain kinds of data corruption due to spontaneous bit flips in the storage media. Click here to - learn more. + learn more. {this.overrideUsernameHostnameRow()} diff --git a/src/components/SetupRepositoryAzure.jsx b/src/components/SetupRepositoryAzure.jsx index b32e22c2..492df683 100644 --- a/src/components/SetupRepositoryAzure.jsx +++ b/src/components/SetupRepositoryAzure.jsx @@ -3,6 +3,7 @@ import Row from 'react-bootstrap/Row'; import { handleChange, validateRequiredFields } from '../forms'; import { OptionalField } from '../forms/OptionalField'; import { RequiredField } from '../forms/RequiredField'; +import i18n from '../utils/i18n'; export class SetupRepositoryAzure extends Component { constructor(props) { @@ -21,16 +22,16 @@ export class SetupRepositoryAzure extends Component { render() { return <> - {RequiredField(this, "Container", "container", { autoFocus: true, placeholder: "enter container name" })} - {OptionalField(this, "Object Name Prefix", "prefix", { placeholder: "enter object name prefix or leave empty" })} + {RequiredField(this, i18n.t('feedback.validation.azure.container'), "container", { autoFocus: true, placeholder: i18n.t('feedback.validation.azure.container-hint') })} + {OptionalField(this, i18n.t('feedback.validation.azure.object-name-prefix'), "prefix", { placeholder: i18n.t('feedback.validation.azure.object-name-prefix-hint') })} - {RequiredField(this, "Storage Account", "storageAccount", { placeholder: "enter storage account name" })} - {OptionalField(this, "Access Key", "storageKey", { placeholder: "enter secret access key", type: "password" })} + {RequiredField(this, i18n.t('feedback.validation.azure.storage-account'), "storageAccount", { placeholder: i18n.t('feedback.validation.azure.storage-account-hint') })} + {OptionalField(this, i18n.t('feedback.validation.azure.access-key'), "storageKey", { placeholder: i18n.t('feedback.validation.azure.access-key-hint'), type: "password" })} - {OptionalField(this, "Azure Storage Domain", "storageDomain", { placeholder: "enter storage domain or leave empty for default 'blob.core.windows.net'" })} - {OptionalField(this, "SAS Token", "sasToken", { placeholder: "enter secret SAS Token", type: "password" })} + {OptionalField(this, i18n.t('feedback.validation.azure.azure-storage-domain'), "storageDomain", { placeholder: i18n.t('feedback.validation.azure.azure-storage-domain-hint') })} + {OptionalField(this, i18n.t('feedback.validation.azure.sas-token'), "sasToken", { placeholder: i18n.t('feedback.validation.azure.sas-token-hint'), type: "password" })} ; } diff --git a/src/components/SetupRepositoryB2.jsx b/src/components/SetupRepositoryB2.jsx index 73fffd11..b442bdb1 100644 --- a/src/components/SetupRepositoryB2.jsx +++ b/src/components/SetupRepositoryB2.jsx @@ -3,6 +3,7 @@ import Row from 'react-bootstrap/Row'; import { handleChange, validateRequiredFields } from '../forms'; import { RequiredField } from '../forms/RequiredField'; import { OptionalField } from '../forms/OptionalField'; +import i18n from '../utils/i18n'; export class SetupRepositoryB2 extends Component { constructor(props) { @@ -21,14 +22,14 @@ export class SetupRepositoryB2 extends Component { render() { return <> - {RequiredField(this, "B2 Bucket", "bucket", { autoFocus: true, placeholder: "enter bucket name" })} + {RequiredField(this, i18n.t('feedback.validation.b2.bucket-name'), "bucket", { autoFocus: true, placeholder: i18n.t('feedback.validation.b2.bucket-name-hint') })} - {RequiredField(this, "Key ID", "keyId", { placeholder: "enter application or account key ID" })} - {RequiredField(this, "Key", "key", { placeholder: "enter secret application or account key", type: "password" })} + {RequiredField(this, i18n.t('feedback.validation.b2.key-id'), "keyId", { placeholder: i18n.t('feedback.validation.b2.key-id-hint') })} + {RequiredField(this, i18n.t('feedback.validation.b2.key'), "key", { placeholder: i18n.t('feedback.validation.b2.key-hint'), type: "password" })} - {OptionalField(this, "Object Name Prefix", "prefix", { placeholder: "enter object name prefix or leave empty" })} + {OptionalField(this, i18n.t('feedback.validation.b2.object-name-prefix'), "prefix", { placeholder: i18n.t('feedback.validation.b2.object-name-prefix-hint') })} ; } diff --git a/src/components/SetupRepositoryFilesystem.jsx b/src/components/SetupRepositoryFilesystem.jsx index 6f3dbcd6..5b14fa2a 100644 --- a/src/components/SetupRepositoryFilesystem.jsx +++ b/src/components/SetupRepositoryFilesystem.jsx @@ -1,6 +1,7 @@ import React, { Component } from 'react'; import { handleChange, validateRequiredFields } from '../forms'; import { RequiredDirectory } from '../forms/RequiredDirectory'; +import i18n from '../utils/i18n'; export class SetupRepositoryFilesystem extends Component { constructor(props) { @@ -18,7 +19,7 @@ export class SetupRepositoryFilesystem extends Component { render() { return <> - {RequiredDirectory(this, "Directory Path", "path", { autoFocus: true, placeholder: "enter directory path where you want to store repository files"})} + {RequiredDirectory(this, i18n.t('feedback.validation.local.directory-path'), "path", { autoFocus: true, placeholder: i18n.t('feedback.validation.local.directory-path-hint')})} ; } } diff --git a/src/components/SetupRepositoryGCS.jsx b/src/components/SetupRepositoryGCS.jsx index cb303e99..b57b2fb2 100644 --- a/src/components/SetupRepositoryGCS.jsx +++ b/src/components/SetupRepositoryGCS.jsx @@ -3,6 +3,7 @@ import Row from 'react-bootstrap/Row'; import { handleChange, validateRequiredFields } from '../forms'; import { OptionalField } from '../forms/OptionalField'; import { RequiredField } from '../forms/RequiredField'; +import i18n from '../utils/i18n'; export class SetupRepositoryGCS extends Component { constructor(props) { @@ -21,14 +22,14 @@ export class SetupRepositoryGCS extends Component { render() { return <> - {RequiredField(this, "GCS Bucket", "bucket", { autoFocus: true, placeholder: "enter bucket name" })} - {OptionalField(this, "Object Name Prefix", "prefix", { placeholder: "enter object name prefix or leave empty", type: "password" })} + {RequiredField(this, i18n.t('feedback.validation.gcs.bucket-name'), "bucket", { autoFocus: true, placeholder: i18n.t('feedback.validation.gcs.bucket-name-hint') })} + {OptionalField(this, i18n.t('feedback.validation.gcs.object-name-prefix'), "prefix", { placeholder: i18n.t('feedback.validation.gcs.object-name-prefix-hint'), type: "password" })} - {OptionalField(this, "Credentials File", "credentialsFile", { placeholder: "enter name of credentials JSON file" })} + {OptionalField(this, i18n.t('feedback.validation.gcs.credentials-file'), "credentialsFile", { placeholder: i18n.t('feedback.validation.gcs.credentials-file-hint') })} - {OptionalField(this, "Credentials JSON", "credentials", { placeholder: "paste JSON credentials here", as: "textarea", rows: 5 })} + {OptionalField(this, i18n.t('feedback.validation.gcs.credentials-json'), "credentials", { placeholder: i18n.t('feedback.validation.gcs.credentials-json-paste'), as: "textarea", rows: 5 })} ; } diff --git a/src/pages/SnapshotDirectory.jsx b/src/pages/SnapshotDirectory.jsx index 7f051a3b..79645ba7 100644 --- a/src/pages/SnapshotDirectory.jsx +++ b/src/pages/SnapshotDirectory.jsx @@ -70,7 +70,7 @@ export class SnapshotDirectory extends Component { } mount() { - axios.post('/api/v1/mounts', { "root": this.state.oid} ).then(result => { + axios.post('/api/v1/mounts', { "root": this.state.oid }).then(result => { this.setState({ mountInfo: result.data, }); @@ -111,6 +111,10 @@ export class SnapshotDirectory extends Component { document.execCommand("copy"); } + navigateTo(path) { + this.props.history.push(path); + } + render() { let { items, isLoading, error } = this.state; if (error) { @@ -132,18 +136,15 @@ export class SnapshotDirectory extends Component { : <> - + } -   - -   +
{i18n.t('snapshot.feedback.directory.mount.restore')} -   - +
diff --git a/src/tests/Language.test.jsx b/src/tests/Language.test.jsx index 2e9f29eb..bd68277c 100644 --- a/src/tests/Language.test.jsx +++ b/src/tests/Language.test.jsx @@ -1,28 +1,62 @@ -import { render, screen } from '@testing-library/react' import { expect, test } from '@jest/globals'; +const { sync: globSync } = require('glob'); + +const localesPaths = globSync('./public/locales/*/*.json', { realpath: true }); +const srcPaths = globSync('./src/**/*.+(tsx|ts|jsx)', { realpath: true }); -jest.mock('react-i18next', () => ({ - // this mock makes sure any components using the translate hook can use it without a warning being shown - useTranslation: () => { - return { - t: (str) => str, - i18n: { - changeLanguage: () => new Promise(() => {}), - }, - }; - }, - initReactI18next: { - type: '3rdParty', - init: () => {}, - } - })); + +function computeIntersection(dataA, dataB) { + return dataA.filter(element => dataB.includes(element)); +} /** * */ -describe('Check tranlations', () => { - test('Translations should not have unused keys', () => { - }) +describe('Check completeness of tranlations', () => { + test('Translations should not have unused keys', () => { + }) }) +/** + * This test checks for empty strings within each translation file. + * If an empty string exists, the test will fail. + */ +describe('Check for empty translations', () => { + test('Translations should not be emtpy', async () => { + for (const localeFile in localesPaths) { + let locale = localesPaths[localeFile] + let data = require(locale); + for (const key in data) { + expect(data[key]).toBeTruthy(); + } + } + }) +}) + +/** + * The test checks whether the intersection of two json sets is equal + * to the length of the primary json key set. + * + * Each file is checked against the others. + */ +describe('Check that translations are in sync', () => { + test('All translations should be in sync with each other', () => { + for (const localeF1 in localesPaths) { + let l1 = localesPaths[localeF1] + for (const localeF2 in localesPaths) { + let l2 = localesPaths[localeF2] + // We do not have to check the files with itself + if (l1 == l2) { + break; + } + let dataA = require(l1) + let dataB = require(l2) + let keysA = Object.keys(dataA) + let keysB = Object.keys(dataB) + let intersection = computeIntersection(keysA, keysB) + expect(intersection.length).toEqual(keysA.length) + } + } + }) +}) From 4bb0e23ce2867747310b2713055515b044735f33 Mon Sep 17 00:00:00 2001 From: lupusA Date: Tue, 19 Mar 2024 19:01:43 +0100 Subject: [PATCH 21/27] Further tranlsating strings --- public/locales/de/translation.json | 16 +++++++++++++ public/locales/en/translation.json | 21 +++++++++++++++-- public/locales/es/translation.json | 16 +++++++++++++ public/locales/fr/translation.json | 16 +++++++++++++ public/locales/it/translation.json | 16 +++++++++++++ public/locales/jp/translation.json | 16 +++++++++++++ public/locales/pl/translation.json | 16 +++++++++++++ public/locales/ru/translation.json | 16 +++++++++++++ src/components/SetupRepositoryRclone.jsx | 5 ++-- src/components/SetupRepositoryServer.jsx | 5 ++-- src/components/SetupRepositoryToken.jsx | 3 ++- src/components/SetupRepositoryWebDAV.jsx | 7 +++--- src/components/SnapshotEstimation.jsx | 29 ++++++++++++++++-------- src/tests/Language.test.jsx | 25 ++++++++++++-------- 14 files changed, 179 insertions(+), 28 deletions(-) diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 40c62298..90e2fdf0 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -57,6 +57,7 @@ "feedback.tab.repository-is-not-connected": "Das Repository ist nicht verbunden", "feedback.tab.snapshots": "Snapshots", "feedback.tab.tasks": "Aufgaben", + "feedback.task.total": "Gesamt", "feedback.ui.appearance": "Darstellung", "feedback.ui.appearance-help": "Gibt die Darstellung des Nutzerinterfaces an", "feedback.ui.appearance-hint": "Select font size", @@ -102,6 +103,16 @@ "feedback.validation.local.directory-path-hint": "Geben Sie den Verzeichnispfad ein, in dem Sie die Repository-Dateien speichern möchten", "feedback.validation.optional.valid-number-or-empty": "Muss eine gültige Zahl sein oder leer sein", "feedback.validation.passwords-dont-match": "Passwörter stimmen nicht überein", + "feedback.validation.rclone.rclone-executable-path": "Rclone Pfad", + "feedback.validation.rclone.rclone-executable-path-hint": "Geben Sie den Pfad zur ausführbaren rclone-Datei ein", + "feedback.validation.rclone.rclone-remote-path": "Rclone-Remote-Pfad", + "feedback.validation.rclone.rclone-remote-path-hint": "Geben Sie : ein", + "feedback.validation.repository-server.server-address": "Serveradresse", + "feedback.validation.repository-server.server-address-hint": "Geben Sie die Server-URL ein (https://:port)", + "feedback.validation.repository-server.server-certificate-fingerprint": "Fingerabdruck des vertrauenswürdigen Serverzertifikats (SHA256)", + "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Geben Sie den Fingerabdruck des vertrauenswürdigen Serverzertifikats ein, der beim Serverstart gedruckt wird", + "feedback.validation.repository-token.token": "Token", + "feedback.validation.repository-token.token-hint": "Verbindungstoken einfügen", "feedback.validation.required.directory": "Pflichtfeld", "feedback.validation.required.field": "Pflichtfeld", "feedback.validation.required.password-repository": "Repository-Passwort", @@ -110,6 +121,11 @@ "feedback.validation.required.repository-password-confirm": "Bestätigen Sie das Repository-Passwort", "feedback.validation.required.repository-password-confirm-again": "Geben Sie das Repository-Passwort erneut ein", "feedback.validation.required.valid-number-or-empty": "Muss eine gültige Zahl oder leer sein", + "feedback.validation.webdav.password": "Passwort", + "feedback.validation.webdav.password-hint": "Passwort eingeben", + "feedback.validation.webdav.server-url": "WebDAV-Server-URL", + "feedback.validation.webdav.username": "Nutzername", + "feedback.validation.webdav.username-hint": "Geben Sie den Benutzernamen ein", "policies.feedback.find.count_one": "{{count}} Richtlinie gefunden, die den Kriterien entspricht", "policies.feedback.find.count_other": "{{count}} Richtlinien gefunden, die den Kriterien entsprechen", "policies.feedback.find.none": "Keine Richtlinien gefunden.", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 4eb4cd01..b229c28f 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -57,6 +57,7 @@ "feedback.tab.repository-is-not-connected": "Repository is not connected", "feedback.tab.snapshots": "Snapshots", "feedback.tab.tasks": "Tasks", + "feedback.task.total": "Total", "feedback.ui.appearance": "Appearance", "feedback.ui.appearance-help": "Specifies the appearance of the user interface", "feedback.ui.appearance-hint": "Select font size", @@ -102,6 +103,16 @@ "feedback.validation.local.directory-path-hint": "Enter directory path where you want to store repository files", "feedback.validation.optional.valid-number-or-empty": "Must be a valid number or empty", "feedback.validation.passwords-dont-match": "Passwords don't match", + "feedback.validation.rclone.rclone-executable-path": "Rclone Executable Path", + "feedback.validation.rclone.rclone-executable-path-hint": "Enter path to rclone executable", + "feedback.validation.rclone.rclone-remote-path": "Rclone Remote Path", + "feedback.validation.rclone.rclone-remote-path-hint": "Enter :", + "feedback.validation.repository-server.server-address": "Server address", + "feedback.validation.repository-server.server-address-hint": "Enter server URL (https://:port)", + "feedback.validation.repository-server.server-certificate-fingerprint": "Trusted server certificate fingerprint (SHA256)", + "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Enter trusted server certificate fingerprint printed at server startup", + "feedback.validation.repository-token.token": "Token", + "feedback.validation.repository-token.token-hint": "Paste connection token", "feedback.validation.required.directory": "Required field", "feedback.validation.required.field": "Required field", "feedback.validation.required.password-repository": "Repository Password", @@ -110,6 +121,11 @@ "feedback.validation.required.repository-password-confirm": "Confirm Repository Password", "feedback.validation.required.repository-password-confirm-again": "enter repository password again", "feedback.validation.required.valid-number-or-empty": "Must be a valid number or empty", + "feedback.validation.webdav.password": "Password", + "feedback.validation.webdav.password-hint": "Enter password", + "feedback.validation.webdav.server-url": "WebDAV Server URL", + "feedback.validation.webdav.username": "Username", + "feedback.validation.webdav.username-hint": "Enter username", "policies.feedback.find.count_one": "Found {{count}} policy matching the criteria", "policies.feedback.find.count_other": "Found {{count}} policies matching the criteria", "policies.feedback.find.none": "No policies found.", @@ -245,5 +261,6 @@ "value.ui.theme-ocean": "ocean", "value.ui.theme-pastel": "pastel", "value.validation.optional-no": "no", - "value.validation.optional-yes": "yes" -} + "value.validation.optional-yes": "yes", + "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} excluded) Files: {{files}} ({{files.excluded}} excluded) Directories: {{directories}} ({{directories.excluded}} excluded) Errors: {{errors}} ({{errors.ignored}} ignored)" +} \ No newline at end of file diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index dc314434..1d6b3d48 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -57,6 +57,7 @@ "feedback.tab.repository-is-not-connected": "El repositorio no está conectado", "feedback.tab.snapshots": "Copias de respaldo", "feedback.tab.tasks": "Tareas", + "feedback.task.total": "Total", "feedback.ui.appearance": "Apariencia", "feedback.ui.appearance-help": "Especifica la apariencia de la interfaz de usuario", "feedback.ui.appearance-hint": "Selecciona el tamaño de letra", @@ -102,6 +103,16 @@ "feedback.validation.local.directory-path-hint": "Ingrese la ruta del directorio donde desea almacenar los archivos del repositorio", "feedback.validation.optional.valid-number-or-empty": "Debe ser un número válido o vacío.", "feedback.validation.passwords-dont-match": "Las contraseñas no coinciden", + "feedback.validation.rclone.rclone-executable-path": "Ruta ejecutable de Rclone", + "feedback.validation.rclone.rclone-executable-path-hint": "Ingrese la ruta al ejecutable rclone", + "feedback.validation.rclone.rclone-remote-path": "Ruta remota de clonación", + "feedback.validation.rclone.rclone-remote-path-hint": "Ingrese :", + "feedback.validation.repository-server.server-address": "Dirección del servidor", + "feedback.validation.repository-server.server-address-hint": "Ingrese la URL del servidor (https://:puerto)", + "feedback.validation.repository-server.server-certificate-fingerprint": "Huella digital del certificado del servidor de confianza (SHA256)", + "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Ingrese la huella digital del certificado del servidor confiable impresa al iniciar el servidor", + "feedback.validation.repository-token.token": "Simbólico", + "feedback.validation.repository-token.token-hint": "Pegar token de conexión", "feedback.validation.required.directory": "Campo requerido", "feedback.validation.required.field": "Campo requerido", "feedback.validation.required.password-repository": "Contraseña del repositorio", @@ -110,6 +121,11 @@ "feedback.validation.required.repository-password-confirm": "Confirmar contraseña del repositorio", "feedback.validation.required.repository-password-confirm-again": "ingrese la contraseña del repositorio nuevamente", "feedback.validation.required.valid-number-or-empty": "Debe ser un número válido o vacío.", + "feedback.validation.webdav.password": "Contraseña", + "feedback.validation.webdav.password-hint": "Introducir la contraseña", + "feedback.validation.webdav.server-url": "URL del servidor WebDAV", + "feedback.validation.webdav.username": "Nombre de usuario", + "feedback.validation.webdav.username-hint": "Introduzca su nombre de usuario", "policies.feedback.find.count_one": "Se encontró {{count}} política que coincide con los criterios", "policies.feedback.find.count_other": "Se encontraron {{count}} políticas que coinciden con los criterios", "policies.feedback.find.none": "No se encontraron políticas.", diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 64f16d33..63c89e03 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -57,6 +57,7 @@ "feedback.tab.repository-is-not-connected": "Le référentiel n'est pas connecté", "feedback.tab.snapshots": "Instantanés", "feedback.tab.tasks": "Tâches", + "feedback.task.total": "Total", "feedback.ui.appearance": "Apparence", "feedback.ui.appearance-help": "Spécifie l'apparence de l'interface utilisateur", "feedback.ui.appearance-hint": "Sélectionnez la taille de police", @@ -102,6 +103,16 @@ "feedback.validation.local.directory-path-hint": "Entrez le chemin du répertoire dans lequel vous souhaitez stocker les fichiers du référentiel", "feedback.validation.optional.valid-number-or-empty": "Doit être un numéro valide ou vide", "feedback.validation.passwords-dont-match": "Les mots de passe ne correspondent pas", + "feedback.validation.rclone.rclone-executable-path": "Chemin de l'exécutable Rclone", + "feedback.validation.rclone.rclone-executable-path-hint": "Entrez le chemin de l'exécutable rclone", + "feedback.validation.rclone.rclone-remote-path": "Chemin distant Rclone", + "feedback.validation.rclone.rclone-remote-path-hint": "Entrez  :", + "feedback.validation.repository-server.server-address": "Adresse du serveur", + "feedback.validation.repository-server.server-address-hint": "Entrez l'URL du serveur (https://:port)", + "feedback.validation.repository-server.server-certificate-fingerprint": "Empreinte digitale du certificat de serveur de confiance (SHA256)", + "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Saisissez l'empreinte digitale du certificat de serveur de confiance imprimée au démarrage du serveur", + "feedback.validation.repository-token.token": "Jeton", + "feedback.validation.repository-token.token-hint": "Coller le jeton de connexion", "feedback.validation.required.directory": "champs requis", "feedback.validation.required.field": "champs requis", "feedback.validation.required.password-repository": "Mot de passe du référentiel", @@ -110,6 +121,11 @@ "feedback.validation.required.repository-password-confirm": "Confirmer le mot de passe du référentiel", "feedback.validation.required.repository-password-confirm-again": "entrez à nouveau le mot de passe du référentiel", "feedback.validation.required.valid-number-or-empty": "Doit être un numéro valide ou vide", + "feedback.validation.webdav.password": "Mot de passe", + "feedback.validation.webdav.password-hint": "Entrer le mot de passe", + "feedback.validation.webdav.server-url": "URL du serveur WebDAV", + "feedback.validation.webdav.username": "Nom d'utilisateur", + "feedback.validation.webdav.username-hint": "Saisissez votre nom d'utilisateur", "policies.feedback.find.count_one": "{{count}} politiques correspondant aux critères ont été trouvées", "policies.feedback.find.count_other": "{{count}} politiques correspondant aux critères ont été trouvées", "policies.feedback.find.none": "Aucune politique trouvée.", diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index 32f8339a..e20bca3e 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -57,6 +57,7 @@ "feedback.tab.repository-is-not-connected": "Il repository non è connesso", "feedback.tab.snapshots": "Istantanee", "feedback.tab.tasks": "Attività", + "feedback.task.total": "Totale", "feedback.ui.appearance": "Aspetto", "feedback.ui.appearance-help": "Specifica l'aspetto dell'interfaccia utente", "feedback.ui.appearance-hint": "Seleziona la dimensione del carattere", @@ -102,6 +103,16 @@ "feedback.validation.local.directory-path-hint": "Inserisci il percorso della directory in cui desideri archiviare i file del repository", "feedback.validation.optional.valid-number-or-empty": "Deve essere un numero valido o vuoto", "feedback.validation.passwords-dont-match": "Le password non corrispondono", + "feedback.validation.rclone.rclone-executable-path": "Percorso eseguibile Rclone", + "feedback.validation.rclone.rclone-executable-path-hint": "Immettere il percorso dell'eseguibile rclone", + "feedback.validation.rclone.rclone-remote-path": "Rclone percorso remoto", + "feedback.validation.rclone.rclone-remote-path-hint": "Inserisci :", + "feedback.validation.repository-server.server-address": "Indirizzo del server", + "feedback.validation.repository-server.server-address-hint": "Inserisci l'URL del server (https://:porta)", + "feedback.validation.repository-server.server-certificate-fingerprint": "Impronta digitale del certificato del server affidabile (SHA256)", + "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Inserisci l'impronta digitale del certificato del server attendibile stampata all'avvio del server", + "feedback.validation.repository-token.token": "Gettone", + "feedback.validation.repository-token.token-hint": "Incolla token di connessione", "feedback.validation.required.directory": "campo obbligatorio", "feedback.validation.required.field": "campo obbligatorio", "feedback.validation.required.password-repository": "Password dell'archivio", @@ -110,6 +121,11 @@ "feedback.validation.required.repository-password-confirm": "Conferma la password dell'archivio", "feedback.validation.required.repository-password-confirm-again": "immettere nuovamente la password del repository", "feedback.validation.required.valid-number-or-empty": "Deve essere un numero valido o vuoto", + "feedback.validation.webdav.password": "Parola d'ordine", + "feedback.validation.webdav.password-hint": "Inserire la password", + "feedback.validation.webdav.server-url": "URL del server WebDAV", + "feedback.validation.webdav.username": "Nome utente", + "feedback.validation.webdav.username-hint": "Inserire username", "policies.feedback.find.count_one": "Trovata {{count}} policy corrispondente ai criteri", "policies.feedback.find.count_other": "Trovate {{count}} politiche che corrispondono ai criteri", "policies.feedback.find.none": "Nessuna politica trovata.", diff --git a/public/locales/jp/translation.json b/public/locales/jp/translation.json index 0acdd5b3..a6f4907a 100644 --- a/public/locales/jp/translation.json +++ b/public/locales/jp/translation.json @@ -57,6 +57,7 @@ "feedback.tab.repository-is-not-connected": "Repository is not connected", "feedback.tab.snapshots": "スナップショット", "feedback.tab.tasks": "タスク", + "feedback.task.total": "Total", "feedback.ui.appearance": "外観", "feedback.ui.appearance-help": "ユーザーインターフェースの外観を指定します", "feedback.ui.appearance-hint": "フォントサイズを選択", @@ -102,6 +103,16 @@ "feedback.validation.local.directory-path-hint": "Enter directory path where you want to store repository files", "feedback.validation.optional.valid-number-or-empty": "Must be a valid number or empty", "feedback.validation.passwords-dont-match": "Passwords don't match", + "feedback.validation.rclone.rclone-executable-path": "Rclone Executable Path", + "feedback.validation.rclone.rclone-executable-path-hint": "Enter path to rclone executable", + "feedback.validation.rclone.rclone-remote-path": "Rclone Remote Path", + "feedback.validation.rclone.rclone-remote-path-hint": "Enter :", + "feedback.validation.repository-server.server-address": "Server address", + "feedback.validation.repository-server.server-address-hint": "Enter server URL (https://:port)", + "feedback.validation.repository-server.server-certificate-fingerprint": "Trusted server certificate fingerprint (SHA256)", + "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Enter trusted server certificate fingerprint printed at server startup", + "feedback.validation.repository-token.token": "Token", + "feedback.validation.repository-token.token-hint": "Paste connection token", "feedback.validation.required.directory": "Required field", "feedback.validation.required.field": "Required field", "feedback.validation.required.password-repository": "Repository Password", @@ -110,6 +121,11 @@ "feedback.validation.required.repository-password-confirm": "Confirm Repository Password", "feedback.validation.required.repository-password-confirm-again": "enter repository password again", "feedback.validation.required.valid-number-or-empty": "Must be a valid number or empty", + "feedback.validation.webdav.password": "Password", + "feedback.validation.webdav.password-hint": "Enter password", + "feedback.validation.webdav.server-url": "WebDAV Server URL", + "feedback.validation.webdav.username": "Username", + "feedback.validation.webdav.username-hint": "Enter username", "policies.feedback.find.count_one": "Found {{count}} policy matching the criteria", "policies.feedback.find.count_other": "Found {{count}} policies matching the criteria", "policies.feedback.find.none": "No policies found.", diff --git a/public/locales/pl/translation.json b/public/locales/pl/translation.json index 482270c6..71108101 100644 --- a/public/locales/pl/translation.json +++ b/public/locales/pl/translation.json @@ -57,6 +57,7 @@ "feedback.tab.repository-is-not-connected": "Repozytorium nie jest połączone", "feedback.tab.snapshots": "Kopie", "feedback.tab.tasks": "Zadania", + "feedback.task.total": "Całkowity", "feedback.ui.appearance": "Wielkość tekstu", "feedback.ui.appearance-help": "Wybierz rodzaj czcionki", "feedback.ui.appearance-hint": "Rozmiar czcionki", @@ -102,6 +103,16 @@ "feedback.validation.local.directory-path-hint": "Wprowadź ścieżkę katalogu, w którym chcesz przechowywać pliki repozytorium", "feedback.validation.optional.valid-number-or-empty": "Musi to być prawidłowy numer lub pusty", "feedback.validation.passwords-dont-match": "Hasła nie pasują", + "feedback.validation.rclone.rclone-executable-path": "Ścieżka pliku wykonywalnego Rclone", + "feedback.validation.rclone.rclone-executable-path-hint": "Wprowadź ścieżkę do pliku wykonywalnego rclone", + "feedback.validation.rclone.rclone-remote-path": "Zdalna ścieżka Rclone", + "feedback.validation.rclone.rclone-remote-path-hint": "Wpisz :<ścieżka>", + "feedback.validation.repository-server.server-address": "Adres serwera", + "feedback.validation.repository-server.server-address-hint": "Wprowadź adres URL serwera (https://:port)", + "feedback.validation.repository-server.server-certificate-fingerprint": "Odcisk palca certyfikatu zaufanego serwera (SHA256)", + "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Wprowadź odcisk palca certyfikatu zaufanego serwera wydrukowany podczas uruchamiania serwera", + "feedback.validation.repository-token.token": "Znak", + "feedback.validation.repository-token.token-hint": "Wklej token połączenia", "feedback.validation.required.directory": "Pole wymagane", "feedback.validation.required.field": "Pole wymagane", "feedback.validation.required.password-repository": "Hasło do repozytorium", @@ -110,6 +121,11 @@ "feedback.validation.required.repository-password-confirm": "Potwierdź hasło do repozytorium", "feedback.validation.required.repository-password-confirm-again": "wprowadź ponownie hasło do repozytorium", "feedback.validation.required.valid-number-or-empty": "Musi to być prawidłowy numer lub pusty", + "feedback.validation.webdav.password": "Hasło", + "feedback.validation.webdav.password-hint": "Wprowadź hasło", + "feedback.validation.webdav.server-url": "Adres URL serwera WebDAV", + "feedback.validation.webdav.username": "Nazwa użytkownika", + "feedback.validation.webdav.username-hint": "Wpisz nazwę użytkownika", "policies.feedback.find.count_one": "Znaleziono {{count}} zasad spełniających kryteria", "policies.feedback.find.count_other": "Znaleziono {{count}} zasad spełniających kryteria", "policies.feedback.find.none": "Nie znaleziono zasad.", diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index d74b64b2..41e9391c 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -57,6 +57,7 @@ "feedback.tab.repository-is-not-connected": "Репозиторий не подключен", "feedback.tab.snapshots": "Снимки", "feedback.tab.tasks": "Задачи", + "feedback.task.total": "Общий", "feedback.ui.appearance": "Внешний вид", "feedback.ui.appearance-help": "Определяет внешний вид пользовательского интерфейса", "feedback.ui.appearance-hint": "Выберите размер шрифта", @@ -102,6 +103,16 @@ "feedback.validation.local.directory-path-hint": "Введите путь к каталогу, в котором вы хотите хранить файлы репозитория.", "feedback.validation.optional.valid-number-or-empty": "Должно быть действительным числом или пустым.", "feedback.validation.passwords-dont-match": "Пароли не совпадают", + "feedback.validation.rclone.rclone-executable-path": "Путь к исполняемому файлу Rclone", + "feedback.validation.rclone.rclone-executable-path-hint": "Введите путь к исполняемому файлу rclone", + "feedback.validation.rclone.rclone-remote-path": "Rclone удаленный путь", + "feedback.validation.rclone.rclone-remote-path-hint": "Введите <имя-удаленного клона>:<путь>", + "feedback.validation.repository-server.server-address": "Адрес сервера", + "feedback.validation.repository-server.server-address-hint": "Введите URL-адрес сервера (https://<хост>:порт)", + "feedback.validation.repository-server.server-certificate-fingerprint": "Отпечаток сертификата доверенного сервера (SHA256)", + "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Введите отпечаток сертификата доверенного сервера, распечатанный при запуске сервера.", + "feedback.validation.repository-token.token": "Токен", + "feedback.validation.repository-token.token-hint": "Вставить токен подключения", "feedback.validation.required.directory": "Обязательное поле", "feedback.validation.required.field": "Обязательное поле", "feedback.validation.required.password-repository": "Пароль репозитория", @@ -110,6 +121,11 @@ "feedback.validation.required.repository-password-confirm": "Подтвердите пароль репозитория", "feedback.validation.required.repository-password-confirm-again": "введите пароль хранилища еще раз", "feedback.validation.required.valid-number-or-empty": "Должно быть действительным числом или пустым.", + "feedback.validation.webdav.password": "Пароль", + "feedback.validation.webdav.password-hint": "Введите пароль", + "feedback.validation.webdav.server-url": "URL-адрес сервера WebDAV", + "feedback.validation.webdav.username": "Имя пользователя", + "feedback.validation.webdav.username-hint": "Введите имя пользователя", "policies.feedback.find.count_one": "Найдено {{count}} политики, соответствующей критериям.", "policies.feedback.find.count_other": "Найдено {{count}} политик, соответствующих критериям.", "policies.feedback.find.none": "Политики не найдены.", diff --git a/src/components/SetupRepositoryRclone.jsx b/src/components/SetupRepositoryRclone.jsx index 5a59e43f..d791a65e 100644 --- a/src/components/SetupRepositoryRclone.jsx +++ b/src/components/SetupRepositoryRclone.jsx @@ -3,6 +3,7 @@ import Row from 'react-bootstrap/Row'; import { handleChange, validateRequiredFields } from '../forms'; import { OptionalField } from '../forms/OptionalField'; import { RequiredField } from '../forms/RequiredField'; +import i18n from '../utils/i18n'; export class SetupRepositoryRclone extends Component { constructor(props) { @@ -21,10 +22,10 @@ export class SetupRepositoryRclone extends Component { render() { return <> - {RequiredField(this, "Rclone Remote Path", "remotePath", { autoFocus: true, placeholder: "enter :" })} + {RequiredField(this, i18n.t('feedback.validation.rclone.rclone-remote-path'), "remotePath", { autoFocus: true, placeholder: i18n.t('feedback.validation.rclone.rclone-remote-path-hint') })} - {OptionalField(this, "Rclone Executable Path", "rcloneExe", { placeholder: "enter path to rclone executable" })} + {OptionalField(this, i18n.t('feedback.validation.rclone.rclone-executable-path'), "rcloneExe", { placeholder: i18n.t('feedback.validation.rclone.rclone-executable-path-hint') })} ; } diff --git a/src/components/SetupRepositoryServer.jsx b/src/components/SetupRepositoryServer.jsx index 1bf7ab7e..05b7d3f9 100644 --- a/src/components/SetupRepositoryServer.jsx +++ b/src/components/SetupRepositoryServer.jsx @@ -3,6 +3,7 @@ import Row from 'react-bootstrap/Row'; import { handleChange, validateRequiredFields } from '../forms'; import { OptionalField } from '../forms/OptionalField'; import { RequiredField } from '../forms/RequiredField'; +import i18n from '../utils/i18n'; export class SetupRepositoryServer extends Component { constructor(props) { @@ -21,10 +22,10 @@ export class SetupRepositoryServer extends Component { render() { return <> - {RequiredField(this, "Server address", "url", { autoFocus: true, placeholder: "enter server URL (https://:port)" })} + {RequiredField(this, i18n.t('feedback.validation.repository-server.server-address'), "url", { autoFocus: true, placeholder: i18n.t('feedback.validation.repository-server.server-address-hint') })} - {OptionalField(this, "Trusted server certificate fingerprint (SHA256)", "serverCertFingerprint", { placeholder: "enter trusted server certificate fingerprint printed at server startup" })} + {OptionalField(this, i18n.t('feedback.validation.repository-server.server-certificate-fingerprint'), "serverCertFingerprint", { placeholder: i18n.t('feedback.validation.repository-server.server-certificate-fingerprint-hint') })} ; } diff --git a/src/components/SetupRepositoryToken.jsx b/src/components/SetupRepositoryToken.jsx index b767a355..f4fcccdc 100644 --- a/src/components/SetupRepositoryToken.jsx +++ b/src/components/SetupRepositoryToken.jsx @@ -2,6 +2,7 @@ import React, { Component } from 'react'; import Row from 'react-bootstrap/Row'; import { handleChange, validateRequiredFields } from '../forms'; import { RequiredField } from '../forms/RequiredField'; +import i18n from '../utils/i18n'; export class SetupRepositoryToken extends Component { constructor(props) { @@ -20,7 +21,7 @@ export class SetupRepositoryToken extends Component { render() { return <> - {RequiredField(this, "Token", "token", { autoFocus: true, type: "password", placeholder: "paste connection token" })} + {RequiredField(this, i18n.t('feedback.validation.repository-token.token'), "token", { autoFocus: true, type: "password", placeholder: i18n.t('feedback.validation.repository-token.token-hint') })} ; } diff --git a/src/components/SetupRepositoryWebDAV.jsx b/src/components/SetupRepositoryWebDAV.jsx index 51067630..a0e47cc2 100644 --- a/src/components/SetupRepositoryWebDAV.jsx +++ b/src/components/SetupRepositoryWebDAV.jsx @@ -3,6 +3,7 @@ import Row from 'react-bootstrap/Row'; import { handleChange, validateRequiredFields } from '../forms'; import { OptionalField } from '../forms/OptionalField'; import { RequiredField } from '../forms/RequiredField'; +import i18n from '../utils/i18n'; export class SetupRepositoryWebDAV extends Component { constructor(props) { @@ -21,11 +22,11 @@ export class SetupRepositoryWebDAV extends Component { render() { return <> - {RequiredField(this, "WebDAV Server URL", "url", { autoFocus: true, placeholder: "http[s]://server:port/path" })} + {RequiredField(this, i18n.t('feedback.validation.webdav.server-url'), "url", { autoFocus: true, placeholder: "http[s]://server:port/path" })} - {OptionalField(this, "Username", "username", { placeholder: "enter username" })} - {OptionalField(this, "Password", "password", { placeholder: "enter password", type: "password" })} + {OptionalField(this, i18n.t('feedback.validation.webdav.username'), "username", { placeholder: i18n.t('feedback.validation.webdav.username-hint') })} + {OptionalField(this, i18n.t('feedback.validation.webdav.password'), "password", { placeholder: i18n.t('feedback.validation.webdav.password-hint'), type: "password" })} ; } diff --git a/src/components/SnapshotEstimation.jsx b/src/components/SnapshotEstimation.jsx index 86b07b74..80adc094 100644 --- a/src/components/SnapshotEstimation.jsx +++ b/src/components/SnapshotEstimation.jsx @@ -9,6 +9,8 @@ import Form from 'react-bootstrap/Form'; import { Logs } from './Logs'; import { cancelTask, redirect, sizeDisplayName } from '../utils/uiutil'; import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; +import i18n from '../utils/i18n'; +import { Trans } from 'react-i18next'; export class SnapshotEstimation extends Component { constructor() { @@ -76,7 +78,7 @@ export class SnapshotEstimation extends Component { } if (task.status === "SUCCESS") { - return "Total" + return i18n.t('feedback.task.total') } if (task.status === "CANCELED") { @@ -94,24 +96,33 @@ export class SnapshotEstimation extends Component { } if (isLoading) { - return

Loading ...

; + return

{i18n.t('common.loading')}

; } return <> {task.counters && - {this.taskStatusDescription(task)} Bytes: {sizeDisplayName(task.counters["Bytes"]?.value, bytesStringBase2)} ({sizeDisplayName(task.counters["Excluded Bytes"]?.value, bytesStringBase2)} excluded) - Files: {task.counters["Files"]?.value} ({task.counters["Excluded Files"]?.value} excluded) - Directories: {task.counters["Directories"]?.value} ({task.counters["Excluded Directories"]?.value} excluded) - Errors: {task.counters["Errors"]?.value} ({task.counters["Ignored Errors"]?.value} ignored) + } {task.status === "RUNNING" && <> -   + {' '} } {this.state.showLog ? <> - + - : } + : } ; } diff --git a/src/tests/Language.test.jsx b/src/tests/Language.test.jsx index bd68277c..2929319e 100644 --- a/src/tests/Language.test.jsx +++ b/src/tests/Language.test.jsx @@ -12,8 +12,8 @@ function computeIntersection(dataA, dataB) { /** * */ -describe('Check completeness of tranlations', () => { - test('Translations should not have unused keys', () => { +describe('Check for unused translations', () => { + test('Translations should be declared and used', () => { }) }) @@ -26,6 +26,8 @@ describe('Check for empty translations', () => { for (const localeFile in localesPaths) { let locale = localesPaths[localeFile] let data = require(locale); + expect(data).not.toBeNull() + for (const key in data) { expect(data[key]).toBeTruthy(); } @@ -40,23 +42,28 @@ describe('Check for empty translations', () => { * Each file is checked against the others. */ describe('Check that translations are in sync', () => { - test('All translations should be in sync with each other', () => { - for (const localeF1 in localesPaths) { - let l1 = localesPaths[localeF1] + test.each(localesPaths)('All translations should be in sync with each other', l1 => { for (const localeF2 in localesPaths) { let l2 = localesPaths[localeF2] - // We do not have to check the files with itself + // We do not have to check the file with itself if (l1 == l2) { break; } + + let msg = `${l1} should be in sync with ${l2}` let dataA = require(l1) let dataB = require(l2) + expect(dataA).not.toBeNull() + expect(dataB).not.toBeNull() + let keysA = Object.keys(dataA) let keysB = Object.keys(dataB) + expect(keysA.length).toBeGreaterThan(0) + expect(keysB.length).toBeGreaterThan(0) + let intersection = computeIntersection(keysA, keysB) - expect(intersection.length).toEqual(keysA.length) + expect({msg, result:intersection.length}).toEqual({msg, result:keysA.length}) } - } - }) + }) }) From 5550aac36b56714eac7fa073786a974fd0adfa73 Mon Sep 17 00:00:00 2001 From: lupusA Date: Thu, 21 Mar 2024 19:59:17 +0100 Subject: [PATCH 22/27] Some smaller improvements. Further translating text. --- .vscode/settings.json | 3 +- public/locales/de/translation.json | 37 +++++++++++++++++++++ public/locales/en/translation.json | 42 +++++++++++++++++++++-- public/locales/es/translation.json | 37 +++++++++++++++++++++ public/locales/fr/translation.json | 37 +++++++++++++++++++++ public/locales/it/translation.json | 37 +++++++++++++++++++++ public/locales/jp/translation.json | 37 +++++++++++++++++++++ public/locales/pl/translation.json | 37 +++++++++++++++++++++ public/locales/ru/translation.json | 37 +++++++++++++++++++++ src/components/Logs.jsx | 6 ++-- src/components/SetupRepository.jsx | 48 ++++++++++++++------------- src/components/SetupRepositoryS3.jsx | 19 ++++++----- src/components/SnapshotEstimation.jsx | 11 +++--- src/css/App.css | 3 +- src/pages/Task.jsx | 9 +++-- 15 files changed, 348 insertions(+), 52 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 561c45c0..94e7f97e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,6 +14,7 @@ "feedback.provider.rclone-remote", "feedback.provider.webdav-server", "feedback.provider.backblaze-b2", - "feedback.provider.sftp-server" + "feedback.provider.sftp-server", + "feedback.task.estimate-results" ] } \ No newline at end of file diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 90e2fdf0..24f7764a 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -1,11 +1,13 @@ { "common.back": "Zurück", "common.cancel": "Abbrechen", + "common.click-here-to-learn-more": "Klick hier um mehr zu erfahren.", "common.delete": "Löschen", "common.delete-confirm": "Löschen bestätigen", "common.loading": "Wird geladen ...", "common.next": "Weiter", "common.return": "Zurück", + "enter-object-name-prefix-or-leave-empty-hint": "Geben Sie das Präfix für den Objektnamen ein oder lassen Sie es leer", "event.description.cancel": "Abbrechen", "event.description.new": "Geben Sie eine neue Beschreibung ein", "event.description.remove": "Beschreibung entfernen", @@ -19,7 +21,10 @@ "event.pin.update": "Pin aktualisieren", "event.repository.advanced-options-hide": "Erweiterte Optionen ausblenden", "event.repository.advanced-options.show": "Erweiterte Optionen anzeigen", + "event.repository.connect-to-repository": "Mit Repository verbinden", + "event.repository.create-repository": "Repository erstellen", "feedback.description.modal-title": "Beschreibung des Snapshots", + "feedback.error.connection": "Verbindungsfehler:", "feedback.header.actions": "Aktionen", "feedback.header.defined": "Definiert", "feedback.header.directories": "Verzeichnisse", @@ -42,14 +47,24 @@ "feedback.provider.sftp-server": "SFTP-Server", "feedback.provider.use-repository-token": "Repository-Token", "feedback.provider.webdav-server": "WebDAV-Server", + "feedback.repository.additional-parameters-hint": "Beim Erstellen des Repositorys über die Befehlszeile können zusätzliche Parameter festgelegt werden.", "feedback.repository.configuration": "Speicherkonfiguration", + "feedback.repository.connect-as": "Verbinden als", + "feedback.repository.connect-in-read-only-mode": "Stellen Sie eine Verbindung im schreibgeschützten Modus her", + "feedback.repository.connect-in-read-only-mode-hint": "Der schreibgeschützte Modus verhindert jegliche Änderungen am Repository.", + "feedback.repository.connect-to-repository": "Mit Repository verbinden", "feedback.repository.create-repository-new": "Neues Repository erstellen", "feedback.repository.create-repository-new-help": "Geben Sie ein sicheres Passwort ein, um das Kopia-Repository im bereitgestellten Speicher zu erstellen.", + "feedback.repository.eec-warning": "[EXPERIMENTELL] Eine Fehlerkorrektur kann zum Schutz vor bestimmten Arten von Datenbeschädigungen aufgrund spontaner Bitwechsel im Speichermedium beitragen.", "feedback.repository.encryption": "Verschlüsselung", "feedback.repository.kopia-server-parameters": "Kopia-Serverparameter", "feedback.repository.name-default": "Mein Repository", + "feedback.repository.override-hint": "Klicken Sie zum Überschreiben auf „Erweiterte Optionen anzeigen“.", "feedback.repository.provider-selection": "Wählen Sie ein Repository aus", "feedback.repository.provider-selection-hint": "Wählen Sie ein Repository aus, um ein neues zu erstellen oder eine Verbindung zu einem bestehenden Repository herzustellen:", + "feedback.repository.repository-description": "Beschreibung des Repository", + "feedback.repository.repository-description-help": "Hilft bei der Unterscheidung zwischen mehreren verbundenen Repositorys", + "feedback.repository.repository-description-hint": "Geben Sie eine Repository-Beschreibung ein", "feedback.repository.repository-token-enter": "Geben Sie das Repository-Token ein", "feedback.tab.policies": "Richtlinien", "feedback.tab.preferences": "Einstellungen", @@ -57,6 +72,7 @@ "feedback.tab.repository-is-not-connected": "Das Repository ist nicht verbunden", "feedback.tab.snapshots": "Snapshots", "feedback.tab.tasks": "Aufgaben", + "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} exkludiert) Files: {{files}} ({{files.excluded}} exkludiert) Directories: {{directories}} ({{directories.excluded}} exkludiert) Errors: {{errors}} ({{errors.ignored}} ignoriert)", "feedback.task.total": "Gesamt", "feedback.ui.appearance": "Darstellung", "feedback.ui.appearance-help": "Gibt die Darstellung des Nutzerinterfaces an", @@ -115,12 +131,31 @@ "feedback.validation.repository-token.token-hint": "Verbindungstoken einfügen", "feedback.validation.required.directory": "Pflichtfeld", "feedback.validation.required.field": "Pflichtfeld", + "feedback.validation.required.hostname": "Hostname", + "feedback.validation.required.hostname-hint": "Überschreiben Sie dies, wenn Sie einen Snapshot wiederherstellen, der auf einem anderen Computer erstellt wurde", "feedback.validation.required.password-repository": "Repository-Passwort", "feedback.validation.required.password-repository-help": "Wird zum Verschlüsseln des Repository-Inhalts verwendet", "feedback.validation.required.password-repository-hint": "Geben Sie das Repository-Passwort ein", "feedback.validation.required.repository-password-confirm": "Bestätigen Sie das Repository-Passwort", "feedback.validation.required.repository-password-confirm-again": "Geben Sie das Repository-Passwort erneut ein", + "feedback.validation.required.server-password": "Server-Passwort", + "feedback.validation.required.server-password-hint": "Geben Sie das Passwort ein, um eine Verbindung zum Server herzustellen", + "feedback.validation.required.username": "Nutzername", + "feedback.validation.required.username-hint": "Überschreiben Sie dies, wenn Sie einen Snapshot wiederherstellen, der von einem anderen Benutzer erstellt wurde", "feedback.validation.required.valid-number-or-empty": "Muss eine gültige Zahl oder leer sein", + "feedback.validation.s3.access-key-id": "Zugriffsschlüssel-ID", + "feedback.validation.s3.access-key-id-hint": "Geben Sie die Zugriffsschlüssel-ID ein", + "feedback.validation.s3.bucket-name": "Bucket", + "feedback.validation.s3.bucket-name-hint": "Geben Sie den Bucket-Namen ein", + "feedback.validation.s3.object-name-prefix": "Präfix des Objektnamens", + "feedback.validation.s3.override-region": "Region überschreiben", + "feedback.validation.s3.override-region-hint": "Geben Sie eine bestimmte Region ein (z. B. us-west-1) oder lassen Sie das Feld leer", + "feedback.validation.s3.secret-access-key": "Geheimer Zugangsschlüssel", + "feedback.validation.s3.secret-access-key-hint": "Geben Sie den geheimen Zugangsschlüssel ein", + "feedback.validation.s3.server-endpoint": "Serverendpunkt", + "feedback.validation.s3.server-endpoint-hint": "Geben Sie die Serveradresse ein (z. B. s3.amazonaws.com)", + "feedback.validation.s3.session-token": "Sitzungstoken", + "feedback.validation.s3.session-token-hint": "Geben Sie das Sitzungstoken ein oder lassen Sie es leer", "feedback.validation.webdav.password": "Passwort", "feedback.validation.webdav.password-hint": "Passwort eingeben", "feedback.validation.webdav.server-url": "WebDAV-Server-URL", @@ -251,6 +286,8 @@ "value.log.details-10-maximum-details": "10 - maximale Details", "value.log.details-5-normal-details": "5 - normale Details", "value.log.details-inherit-from-parent": "(vom übergeordneten Element erben)", + "value.provider.s3.http-connection-insecure": "HTTP-Verbindung verwenden (unsicher)", + "value.provider.s3.no-tls-verification": "TLS-Zertifikat nicht überprüfen", "value.ui.appearance-large": "groß", "value.ui.appearance-medium": "mittel", "value.ui.appearance-small": "klein", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index b229c28f..75747325 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -1,11 +1,13 @@ { "common.back": "Back", "common.cancel": "Cancel", + "common.click-here-to-learn-more": "Click here to learn more.", "common.delete": "Delete", "common.delete-confirm": "Confirm Delete", "common.loading": "Loading ...", "common.next": "Next", "common.return": "Return", + "enter-object-name-prefix-or-leave-empty-hint": "Enter object name prefix or leave empty", "event.description.cancel": "Cancel", "event.description.new": "Enter new description", "event.description.remove": "Remove Description", @@ -19,7 +21,10 @@ "event.pin.update": "Update Pin", "event.repository.advanced-options-hide": "Hide Advanced Options", "event.repository.advanced-options.show": "Show Advanced Options", + "event.repository.connect-to-repository": "Connect to repository", + "event.repository.create-repository": "Create repository", "feedback.description.modal-title": "Snapshot Description", + "feedback.error.connection": "Connect Error:", "feedback.header.actions": "Actions", "feedback.header.defined": "Defined", "feedback.header.directories": "Directories", @@ -42,14 +47,24 @@ "feedback.provider.sftp-server": "SFTP Server", "feedback.provider.use-repository-token": "Use Repository Token", "feedback.provider.webdav-server": "WebDAV Server", + "feedback.repository.additional-parameters-hint": "Additional parameters can be set when creating repository using command line.", "feedback.repository.configuration": "Storage Configuration", + "feedback.repository.connect-as": "Connect as", + "feedback.repository.connect-in-read-only-mode": "Connect in read-only mode", + "feedback.repository.connect-in-read-only-mode-hint": "Read-only mode prevents any changes to the repository.", + "feedback.repository.connect-to-repository": "Connect to repository", "feedback.repository.create-repository-new": "Create New Repository", "feedback.repository.create-repository-new-help": "Enter a strong password to create Kopia repository in the provided storage.", + "feedback.repository.eec-warning": "[EXPERIMENTAL] Error correction can help protect from certain kinds of data corruption due to spontaneous bit flips in the storage media.", "feedback.repository.encryption": "Encryption", "feedback.repository.kopia-server-parameters": "Kopia Server Parameters", "feedback.repository.name-default": "My Repository", + "feedback.repository.override-hint": "To override, click 'Show Advanced Options'", "feedback.repository.provider-selection": "Select Storage Type", "feedback.repository.provider-selection-hint": "To connect to a repository or create one, select the preferred storage type:", + "feedback.repository.repository-description": "Repository description", + "feedback.repository.repository-description-help": "Helps to distinguish between multiple connected repositories", + "feedback.repository.repository-description-hint": "Enter repository description", "feedback.repository.repository-token-enter": "Enter Repository Token", "feedback.tab.policies": "Policies", "feedback.tab.preferences": "Preferences", @@ -57,6 +72,7 @@ "feedback.tab.repository-is-not-connected": "Repository is not connected", "feedback.tab.snapshots": "Snapshots", "feedback.tab.tasks": "Tasks", + "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} excluded) Files: {{files}} ({{files.excluded}} excluded) Directories: {{directories}} ({{directories.excluded}} excluded) Errors: {{errors}} ({{errors.ignored}} ignored)", "feedback.task.total": "Total", "feedback.ui.appearance": "Appearance", "feedback.ui.appearance-help": "Specifies the appearance of the user interface", @@ -115,12 +131,31 @@ "feedback.validation.repository-token.token-hint": "Paste connection token", "feedback.validation.required.directory": "Required field", "feedback.validation.required.field": "Required field", + "feedback.validation.required.hostname": "Hostname", + "feedback.validation.required.hostname-hint": "Override this when restoring a snapshot taken on another machine", "feedback.validation.required.password-repository": "Repository Password", "feedback.validation.required.password-repository-help": "Used to encrypt the repository's contents", "feedback.validation.required.password-repository-hint": "Enter repository password", "feedback.validation.required.repository-password-confirm": "Confirm Repository Password", "feedback.validation.required.repository-password-confirm-again": "enter repository password again", + "feedback.validation.required.server-password": "Server password", + "feedback.validation.required.server-password-hint": "Enter password to connect to server", + "feedback.validation.required.username": "Username", + "feedback.validation.required.username-hint": "Override this when restoring a snapshot taken by another user", "feedback.validation.required.valid-number-or-empty": "Must be a valid number or empty", + "feedback.validation.s3.access-key-id": "Access Key ID", + "feedback.validation.s3.access-key-id-hint": "Enter access key ID", + "feedback.validation.s3.bucket-name": "Bucket", + "feedback.validation.s3.bucket-name-hint": "Enter bucket name", + "feedback.validation.s3.object-name-prefix": "Object Name Prefix", + "feedback.validation.s3.override-region": "Override Region", + "feedback.validation.s3.override-region-hint": "Enter specific region (e.g., us-west-1) or leave empty", + "feedback.validation.s3.secret-access-key": "Secret Access Key", + "feedback.validation.s3.secret-access-key-hint": "Enter secret access key", + "feedback.validation.s3.server-endpoint": "Server Endpoint", + "feedback.validation.s3.server-endpoint-hint": "Enter server address (e.g., s3.amazonaws.com)", + "feedback.validation.s3.session-token": "Session Token", + "feedback.validation.s3.session-token-hint": "Enter session token or leave empty", "feedback.validation.webdav.password": "Password", "feedback.validation.webdav.password-hint": "Enter password", "feedback.validation.webdav.server-url": "WebDAV Server URL", @@ -251,6 +286,8 @@ "value.log.details-10-maximum-details": "10 - maximum details", "value.log.details-5-normal-details": "5 - normal details", "value.log.details-inherit-from-parent": "(inherit from parent)", + "value.provider.s3.http-connection-insecure": "Use HTTP connection (insecure)", + "value.provider.s3.no-tls-verification": "Do not verify TLS certificate", "value.ui.appearance-large": "large", "value.ui.appearance-medium": "medium", "value.ui.appearance-small": "small", @@ -261,6 +298,5 @@ "value.ui.theme-ocean": "ocean", "value.ui.theme-pastel": "pastel", "value.validation.optional-no": "no", - "value.validation.optional-yes": "yes", - "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} excluded) Files: {{files}} ({{files.excluded}} excluded) Directories: {{directories}} ({{directories.excluded}} excluded) Errors: {{errors}} ({{errors.ignored}} ignored)" -} \ No newline at end of file + "value.validation.optional-yes": "yes" +} diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 1d6b3d48..bdad0155 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -1,11 +1,13 @@ { "common.back": "Atrás", "common.cancel": "Cancelar", + "common.click-here-to-learn-more": "Clic aquí para saber más.", "common.delete": "Borrar", "common.delete-confirm": "Confirmar eliminación", "common.loading": "Cargando ...", "common.next": "Próximo", "common.return": "Volver", + "enter-object-name-prefix-or-leave-empty-hint": "Introduzca el prefijo del nombre del objeto o déjelo vacío", "event.description.cancel": "Cancelar", "event.description.new": "Ingrese una nueva descripción", "event.description.remove": "Eliminar descripción", @@ -19,7 +21,10 @@ "event.pin.update": "Actualizar PIN", "event.repository.advanced-options-hide": "Ocultar opciones avanzadas", "event.repository.advanced-options.show": "Mostrar opciones avanzadas", + "event.repository.connect-to-repository": "Conectarse al repositorio", + "event.repository.create-repository": "Crear repositorio", "feedback.description.modal-title": "Descripción de la instantánea", + "feedback.error.connection": "Error de conexión:", "feedback.header.actions": "Comportamiento", "feedback.header.defined": "Definido", "feedback.header.directories": "Directorios", @@ -42,14 +47,24 @@ "feedback.provider.sftp-server": "Servidor SFTP", "feedback.provider.use-repository-token": "Usar token de repositorio", "feedback.provider.webdav-server": "Servidor WebDAV", + "feedback.repository.additional-parameters-hint": "Se pueden configurar parámetros adicionales al crear un repositorio usando la línea de comando.", "feedback.repository.configuration": "Configuración de almacenamiento", + "feedback.repository.connect-as": "Conectar como", + "feedback.repository.connect-in-read-only-mode": "Conéctese en modo de solo lectura", + "feedback.repository.connect-in-read-only-mode-hint": "El modo de solo lectura evita cualquier cambio en el repositorio.", + "feedback.repository.connect-to-repository": "Conectarse al repositorio", "feedback.repository.create-repository-new": "Crear nuevo repositorio", "feedback.repository.create-repository-new-help": "Ingrese una contraseña segura para crear el repositorio de Kopia en el almacenamiento proporcionado.", + "feedback.repository.eec-warning": "[EXPERIMENTAL] La corrección de errores puede ayudar a proteger contra ciertos tipos de corrupción de datos debido a cambios espontáneos de bits en los medios de almacenamiento.", "feedback.repository.encryption": "Cifrado", "feedback.repository.kopia-server-parameters": "Parámetros del servidor Kopia", "feedback.repository.name-default": "Mi repositorio", + "feedback.repository.override-hint": "Para anular, haga clic en 'Mostrar opciones avanzadas'", "feedback.repository.provider-selection": "Seleccione el tipo de almacenamiento", "feedback.repository.provider-selection-hint": "Para conectarse a un repositorio o crear uno, seleccione el tipo de almacenamiento preferido:", + "feedback.repository.repository-description": "Descripción del repositorio", + "feedback.repository.repository-description-help": "Ayuda a distinguir entre múltiples repositorios conectados", + "feedback.repository.repository-description-hint": "Ingrese la descripción del repositorio", "feedback.repository.repository-token-enter": "Ingrese el token del repositorio", "feedback.tab.policies": "Políticas", "feedback.tab.preferences": "Preferencias", @@ -57,6 +72,7 @@ "feedback.tab.repository-is-not-connected": "El repositorio no está conectado", "feedback.tab.snapshots": "Copias de respaldo", "feedback.tab.tasks": "Tareas", + "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} excluido) Files: {{files}} ({{files.excluded}} excluido) Directories: {{directories}} ({{directories.excluded}} excluido) Errors: {{errors}} ({{errors.ignored}} ignorado)", "feedback.task.total": "Total", "feedback.ui.appearance": "Apariencia", "feedback.ui.appearance-help": "Especifica la apariencia de la interfaz de usuario", @@ -115,12 +131,31 @@ "feedback.validation.repository-token.token-hint": "Pegar token de conexión", "feedback.validation.required.directory": "Campo requerido", "feedback.validation.required.field": "Campo requerido", + "feedback.validation.required.hostname": "Nombre de host", + "feedback.validation.required.hostname-hint": "Anule esto al restaurar una instantánea tomada en otra máquina", "feedback.validation.required.password-repository": "Contraseña del repositorio", "feedback.validation.required.password-repository-help": "Se utiliza para cifrar el contenido del repositorio.", "feedback.validation.required.password-repository-hint": "Ingrese la contraseña del repositorio", "feedback.validation.required.repository-password-confirm": "Confirmar contraseña del repositorio", "feedback.validation.required.repository-password-confirm-again": "ingrese la contraseña del repositorio nuevamente", + "feedback.validation.required.server-password": "Contraseña del servidor", + "feedback.validation.required.server-password-hint": "Ingrese la contraseña para conectarse al servidor", + "feedback.validation.required.username": "Nombre de usuario", + "feedback.validation.required.username-hint": "Anule esto al restaurar una instantánea tomada por otro usuario", "feedback.validation.required.valid-number-or-empty": "Debe ser un número válido o vacío.", + "feedback.validation.s3.access-key-id": "ID de clave de acceso", + "feedback.validation.s3.access-key-id-hint": "Introduzca el ID de la clave de acceso", + "feedback.validation.s3.bucket-name": "Balde", + "feedback.validation.s3.bucket-name-hint": "Introduce el nombre del depósito", + "feedback.validation.s3.object-name-prefix": "Prefijo del nombre del objeto", + "feedback.validation.s3.override-region": "Anular región", + "feedback.validation.s3.override-region-hint": "Ingrese una región específica (por ejemplo, us-west-1) o déjela vacía", + "feedback.validation.s3.secret-access-key": "Clave de acceso secreta", + "feedback.validation.s3.secret-access-key-hint": "Introduzca la clave de acceso secreta", + "feedback.validation.s3.server-endpoint": "Punto final del servidor", + "feedback.validation.s3.server-endpoint-hint": "Ingrese la dirección del servidor (por ejemplo, s3.amazonaws.com)", + "feedback.validation.s3.session-token": "Token de sesión", + "feedback.validation.s3.session-token-hint": "Ingrese el token de sesión o déjelo vacío", "feedback.validation.webdav.password": "Contraseña", "feedback.validation.webdav.password-hint": "Introducir la contraseña", "feedback.validation.webdav.server-url": "URL del servidor WebDAV", @@ -251,6 +286,8 @@ "value.log.details-10-maximum-details": "10 - detalles máximos", "value.log.details-5-normal-details": "5 - detalles normales", "value.log.details-inherit-from-parent": "(heredado de los padres)", + "value.provider.s3.http-connection-insecure": "Usar conexión HTTP (insegura)", + "value.provider.s3.no-tls-verification": "No verificar el certificado TLS", "value.ui.appearance-large": "grande", "value.ui.appearance-medium": "mediano", "value.ui.appearance-small": "pequeño", diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 63c89e03..992c2389 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -1,11 +1,13 @@ { "common.back": "Dos", "common.cancel": "Annuler", + "common.click-here-to-learn-more": "Cliquez ici pour en savoir plus.", "common.delete": "Supprimer", "common.delete-confirm": "Confirmation de la suppression", "common.loading": "Chargement ...", "common.next": "Suivant", "common.return": "Retour", + "enter-object-name-prefix-or-leave-empty-hint": "Entrez le préfixe du nom de l'objet ou laissez vide", "event.description.cancel": "Annuler", "event.description.new": "Entrez une nouvelle description", "event.description.remove": "Supprimer la description", @@ -19,7 +21,10 @@ "event.pin.update": "Mettre à jour l'épingle", "event.repository.advanced-options-hide": "Masquer les options avancées", "event.repository.advanced-options.show": "Montrer les options avancées", + "event.repository.connect-to-repository": "Se connecter au référentiel", + "event.repository.create-repository": "Créer un référentiel", "feedback.description.modal-title": "Description de l'instantané", + "feedback.error.connection": "Erreur de connexion :", "feedback.header.actions": "Actions", "feedback.header.defined": "Défini", "feedback.header.directories": "Annuaires", @@ -42,14 +47,24 @@ "feedback.provider.sftp-server": "Serveur SFTP", "feedback.provider.use-repository-token": "Utiliser le jeton de référentiel", "feedback.provider.webdav-server": "Serveur WebDAV", + "feedback.repository.additional-parameters-hint": "Des paramètres supplémentaires peuvent être définis lors de la création du référentiel à l'aide de la ligne de commande.", "feedback.repository.configuration": "Configuration du stockage", + "feedback.repository.connect-as": "Se connecter en tant que", + "feedback.repository.connect-in-read-only-mode": "Connectez-vous en mode lecture seule", + "feedback.repository.connect-in-read-only-mode-hint": "Le mode lecture seule empêche toute modification du référentiel.", + "feedback.repository.connect-to-repository": "Se connecter au référentiel", "feedback.repository.create-repository-new": "Créer un nouveau référentiel", "feedback.repository.create-repository-new-help": "Entrez un mot de passe fort pour créer le référentiel Kopia dans le stockage fourni.", + "feedback.repository.eec-warning": "[EXPERIMENTAL] La correction d'erreurs peut aider à protéger contre certains types de corruption de données dues à des retournements de bits spontanés dans le support de stockage.", "feedback.repository.encryption": "Chiffrement", "feedback.repository.kopia-server-parameters": "Paramètres du serveur Kopia", "feedback.repository.name-default": "Mon référentiel", + "feedback.repository.override-hint": "Pour remplacer, cliquez sur \"Afficher les options avancées\".", "feedback.repository.provider-selection": "Sélectionnez le type de stockage", "feedback.repository.provider-selection-hint": "Pour vous connecter à un référentiel ou en créer un, sélectionnez le type de stockage préféré :", + "feedback.repository.repository-description": "Description du référentiel", + "feedback.repository.repository-description-help": "Aide à distinguer plusieurs référentiels connectés", + "feedback.repository.repository-description-hint": "Entrez la description du référentiel", "feedback.repository.repository-token-enter": "Entrez le jeton de référentiel", "feedback.tab.policies": "Politiques", "feedback.tab.preferences": "Préférences", @@ -57,6 +72,7 @@ "feedback.tab.repository-is-not-connected": "Le référentiel n'est pas connecté", "feedback.tab.snapshots": "Instantanés", "feedback.tab.tasks": "Tâches", + "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} exclu) Files: {{files}} ({{files.excluded}} exclu) Directories: {{directories}} ({{directories.excluded}} exclu) Errors: {{errors}} ({{errors.ignored}} ignoré)", "feedback.task.total": "Total", "feedback.ui.appearance": "Apparence", "feedback.ui.appearance-help": "Spécifie l'apparence de l'interface utilisateur", @@ -115,12 +131,31 @@ "feedback.validation.repository-token.token-hint": "Coller le jeton de connexion", "feedback.validation.required.directory": "champs requis", "feedback.validation.required.field": "champs requis", + "feedback.validation.required.hostname": "Nom d'hôte", + "feedback.validation.required.hostname-hint": "Remplacez ceci lors de la restauration d'un instantané pris sur une autre machine", "feedback.validation.required.password-repository": "Mot de passe du référentiel", "feedback.validation.required.password-repository-help": "Utilisé pour chiffrer le contenu du référentiel", "feedback.validation.required.password-repository-hint": "Entrez le mot de passe du référentiel", "feedback.validation.required.repository-password-confirm": "Confirmer le mot de passe du référentiel", "feedback.validation.required.repository-password-confirm-again": "entrez à nouveau le mot de passe du référentiel", + "feedback.validation.required.server-password": "Mot de passe du serveur", + "feedback.validation.required.server-password-hint": "Entrez le mot de passe pour vous connecter au serveur", + "feedback.validation.required.username": "Nom d'utilisateur", + "feedback.validation.required.username-hint": "Remplacez ceci lors de la restauration d'un instantané pris par un autre utilisateur", "feedback.validation.required.valid-number-or-empty": "Doit être un numéro valide ou vide", + "feedback.validation.s3.access-key-id": "ID de clé d'accès", + "feedback.validation.s3.access-key-id-hint": "Entrez l'ID de la clé d'accès", + "feedback.validation.s3.bucket-name": "Seau", + "feedback.validation.s3.bucket-name-hint": "Saisissez le nom du compartiment", + "feedback.validation.s3.object-name-prefix": "Préfixe du nom de l'objet", + "feedback.validation.s3.override-region": "Remplacer la région", + "feedback.validation.s3.override-region-hint": "Entrez une région spécifique (par exemple, us-west-1) ou laissez vide", + "feedback.validation.s3.secret-access-key": "Clé d'accès secrète", + "feedback.validation.s3.secret-access-key-hint": "Entrez la clé d'accès secrète", + "feedback.validation.s3.server-endpoint": "Point de terminaison du serveur", + "feedback.validation.s3.server-endpoint-hint": "Saisissez l'adresse du serveur (par exemple, s3.amazonaws.com)", + "feedback.validation.s3.session-token": "Jeton de session", + "feedback.validation.s3.session-token-hint": "Entrez le jeton de session ou laissez vide", "feedback.validation.webdav.password": "Mot de passe", "feedback.validation.webdav.password-hint": "Entrer le mot de passe", "feedback.validation.webdav.server-url": "URL du serveur WebDAV", @@ -251,6 +286,8 @@ "value.log.details-10-maximum-details": "10 - détails maximum", "value.log.details-5-normal-details": "5 - détails normaux", "value.log.details-inherit-from-parent": "(hériter du parent)", + "value.provider.s3.http-connection-insecure": "Utiliser une connexion HTTP (non sécurisée)", + "value.provider.s3.no-tls-verification": "Ne pas vérifier le certificat TLS", "value.ui.appearance-large": "grande", "value.ui.appearance-medium": "moyenne", "value.ui.appearance-small": "petite", diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index e20bca3e..9ea5ab87 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -1,11 +1,13 @@ { "common.back": "Indietro", "common.cancel": "Annulla", + "common.click-here-to-learn-more": "Clicca qui per saperne di più.", "common.delete": "Eliminare", "common.delete-confirm": "Conferma cancellazione", "common.loading": "Caricamento ...", "common.next": "Prossimo", "common.return": "Ritorno", + "enter-object-name-prefix-or-leave-empty-hint": "Inserisci il prefisso del nome dell'oggetto o lascia vuoto", "event.description.cancel": "Annulla", "event.description.new": "Inserisci una nuova descrizione", "event.description.remove": "Rimuovi descrizione", @@ -19,7 +21,10 @@ "event.pin.update": "Aggiorna perno", "event.repository.advanced-options-hide": "Nascondi opzioni avanzate", "event.repository.advanced-options.show": "Mostra opzioni avanzate", + "event.repository.connect-to-repository": "Connettiti al deposito", + "event.repository.create-repository": "Crea archivio", "feedback.description.modal-title": "Descrizione dell'istantanea", + "feedback.error.connection": "Errore di connessione:", "feedback.header.actions": "Azioni", "feedback.header.defined": "Definito", "feedback.header.directories": "Directory", @@ -42,14 +47,24 @@ "feedback.provider.sftp-server": "Server SFTP", "feedback.provider.use-repository-token": "Utilizza token di archivio", "feedback.provider.webdav-server": "Server WebDAV", + "feedback.repository.additional-parameters-hint": "È possibile impostare parametri aggiuntivi durante la creazione del repository utilizzando la riga di comando.", "feedback.repository.configuration": "Configurazione di archiviazione", + "feedback.repository.connect-as": "Connetti come", + "feedback.repository.connect-in-read-only-mode": "Connetti in modalità di sola lettura", + "feedback.repository.connect-in-read-only-mode-hint": "La modalità di sola lettura impedisce qualsiasi modifica al repository.", + "feedback.repository.connect-to-repository": "Connettiti al deposito", "feedback.repository.create-repository-new": "Crea nuovo archivio", "feedback.repository.create-repository-new-help": "Inserisci una password complessa per creare il repository Kopia nello spazio di archiviazione fornito.", + "feedback.repository.eec-warning": "[SPERIMENTALE] La correzione degli errori può aiutare a proteggere da alcuni tipi di danneggiamento dei dati dovuti a inversioni di bit spontanee nei supporti di memorizzazione.", "feedback.repository.encryption": "Crittografia", "feedback.repository.kopia-server-parameters": "Parametri del server Copia", "feedback.repository.name-default": "Il mio deposito", + "feedback.repository.override-hint": "Per eseguire l'override, fai clic su \"Mostra opzioni avanzate\"", "feedback.repository.provider-selection": "Seleziona il tipo di archiviazione", "feedback.repository.provider-selection-hint": "Per connettersi a un repository o crearne uno, selezionare il tipo di archiviazione preferito:", + "feedback.repository.repository-description": "Descrizione del deposito", + "feedback.repository.repository-description-help": "Aiuta a distinguere tra più repository connessi", + "feedback.repository.repository-description-hint": "Inserisci la descrizione del repository", "feedback.repository.repository-token-enter": "Inserisci il token del repository", "feedback.tab.policies": "Politiche", "feedback.tab.preferences": "Preferenze", @@ -57,6 +72,7 @@ "feedback.tab.repository-is-not-connected": "Il repository non è connesso", "feedback.tab.snapshots": "Istantanee", "feedback.tab.tasks": "Attività", + "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} escluso) Files: {{files}} ({{files.excluded}} escluso) Directories: {{directories}} ({{directories.excluded}} escluso) Errors: {{errors}} ({{errors.ignored}} ignorato)", "feedback.task.total": "Totale", "feedback.ui.appearance": "Aspetto", "feedback.ui.appearance-help": "Specifica l'aspetto dell'interfaccia utente", @@ -115,12 +131,31 @@ "feedback.validation.repository-token.token-hint": "Incolla token di connessione", "feedback.validation.required.directory": "campo obbligatorio", "feedback.validation.required.field": "campo obbligatorio", + "feedback.validation.required.hostname": "Nome host", + "feedback.validation.required.hostname-hint": "Sostituiscilo quando ripristini uno snapshot acquisito su un altro computer", "feedback.validation.required.password-repository": "Password dell'archivio", "feedback.validation.required.password-repository-help": "Utilizzato per crittografare il contenuto del repository", "feedback.validation.required.password-repository-hint": "Inserisci la password dell'archivio", "feedback.validation.required.repository-password-confirm": "Conferma la password dell'archivio", "feedback.validation.required.repository-password-confirm-again": "immettere nuovamente la password del repository", + "feedback.validation.required.server-password": "Password del server", + "feedback.validation.required.server-password-hint": "Inserisci la password per connetterti al server", + "feedback.validation.required.username": "Nome utente", + "feedback.validation.required.username-hint": "Sostituiscilo quando ripristini uno snapshot scattato da un altro utente", "feedback.validation.required.valid-number-or-empty": "Deve essere un numero valido o vuoto", + "feedback.validation.s3.access-key-id": "ID chiave di accesso", + "feedback.validation.s3.access-key-id-hint": "Immettere l'ID della chiave di accesso", + "feedback.validation.s3.bucket-name": "Secchio", + "feedback.validation.s3.bucket-name-hint": "Inserisci il nome del bucket", + "feedback.validation.s3.object-name-prefix": "Prefisso nome oggetto", + "feedback.validation.s3.override-region": "Sostituisci regione", + "feedback.validation.s3.override-region-hint": "Inserisci una regione specifica (ad esempio, us-west-1) o lascia vuoto", + "feedback.validation.s3.secret-access-key": "Chiave di accesso segreta", + "feedback.validation.s3.secret-access-key-hint": "Inserisci la chiave di accesso segreta", + "feedback.validation.s3.server-endpoint": "Punto finale del server", + "feedback.validation.s3.server-endpoint-hint": "Inserisci l'indirizzo del server (ad esempio, s3.amazonaws.com)", + "feedback.validation.s3.session-token": "Gettone di sessione", + "feedback.validation.s3.session-token-hint": "Inserisci il token della sessione o lascia vuoto", "feedback.validation.webdav.password": "Parola d'ordine", "feedback.validation.webdav.password-hint": "Inserire la password", "feedback.validation.webdav.server-url": "URL del server WebDAV", @@ -251,6 +286,8 @@ "value.log.details-10-maximum-details": "10 - dettagli massimi", "value.log.details-5-normal-details": "5 - dettagli normali", "value.log.details-inherit-from-parent": "(eredita dal genitore)", + "value.provider.s3.http-connection-insecure": "Utilizza connessione HTTP (non sicura)", + "value.provider.s3.no-tls-verification": "Non verificare il certificato TLS", "value.ui.appearance-large": "grande", "value.ui.appearance-medium": "medio", "value.ui.appearance-small": "piccolo", diff --git a/public/locales/jp/translation.json b/public/locales/jp/translation.json index a6f4907a..0eb69042 100644 --- a/public/locales/jp/translation.json +++ b/public/locales/jp/translation.json @@ -1,11 +1,13 @@ { "common.back": "Back", "common.cancel": "キャンセル", + "common.click-here-to-learn-more": "Click here to learn more.", "common.delete": "削除", "common.delete-confirm": "Confirm Delete", "common.loading": "Loading ...", "common.next": "Next", "common.return": "戻る", + "enter-object-name-prefix-or-leave-empty-hint": "Enter object name prefix or leave empty", "event.description.cancel": "Cancel", "event.description.new": "Enter new description", "event.description.remove": "Remove Description", @@ -19,7 +21,10 @@ "event.pin.update": "Update Pin", "event.repository.advanced-options-hide": "Hide Advanced Options", "event.repository.advanced-options.show": "Show Advanced Options", + "event.repository.connect-to-repository": "Connect to repository", + "event.repository.create-repository": "Create repository", "feedback.description.modal-title": "Snapshot Description", + "feedback.error.connection": "Connect Error:", "feedback.header.actions": "Actions", "feedback.header.defined": "Defined", "feedback.header.directories": "Directories", @@ -42,14 +47,24 @@ "feedback.provider.sftp-server": "SFTP Server", "feedback.provider.use-repository-token": "Use Repository Token", "feedback.provider.webdav-server": "WebDAV Server", + "feedback.repository.additional-parameters-hint": "Additional parameters can be set when creating repository using command line.", "feedback.repository.configuration": "Storage Configuration", + "feedback.repository.connect-as": "Connect as", + "feedback.repository.connect-in-read-only-mode": "Connect in read-only mode", + "feedback.repository.connect-in-read-only-mode-hint": "Read-only mode prevents any changes to the repository.", + "feedback.repository.connect-to-repository": "Connect to repository", "feedback.repository.create-repository-new": "Create New Repository", "feedback.repository.create-repository-new-help": "Enter a strong password to create Kopia repository in the provided storage.", + "feedback.repository.eec-warning": "[EXPERIMENTAL] Error correction can help protect from certain kinds of data corruption due to spontaneous bit flips in the storage media.", "feedback.repository.encryption": "Encryption", "feedback.repository.kopia-server-parameters": "Kopia Server Parameters", "feedback.repository.name-default": "My Repository", + "feedback.repository.override-hint": "To override, click 'Show Advanced Options'", "feedback.repository.provider-selection": "Select Storage Type", "feedback.repository.provider-selection-hint": "To connect to a repository or create one, select the preferred storage type:", + "feedback.repository.repository-description": "Repository description", + "feedback.repository.repository-description-help": "Helps to distinguish between multiple connected repositories", + "feedback.repository.repository-description-hint": "Enter repository description", "feedback.repository.repository-token-enter": "Enter Repository Token", "feedback.tab.policies": "ポリシー", "feedback.tab.preferences": "設定", @@ -57,6 +72,7 @@ "feedback.tab.repository-is-not-connected": "Repository is not connected", "feedback.tab.snapshots": "スナップショット", "feedback.tab.tasks": "タスク", + "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} excluded) Files: {{files}} ({{files.excluded}} excluded) Directories: {{directories}} ({{directories.excluded}} excluded) Errors: {{errors}} ({{errors.ignored}} ignored)", "feedback.task.total": "Total", "feedback.ui.appearance": "外観", "feedback.ui.appearance-help": "ユーザーインターフェースの外観を指定します", @@ -115,12 +131,31 @@ "feedback.validation.repository-token.token-hint": "Paste connection token", "feedback.validation.required.directory": "Required field", "feedback.validation.required.field": "Required field", + "feedback.validation.required.hostname": "Hostname", + "feedback.validation.required.hostname-hint": "Override this when restoring a snapshot taken on another machine", "feedback.validation.required.password-repository": "Repository Password", "feedback.validation.required.password-repository-help": "Used to encrypt the repository's contents", "feedback.validation.required.password-repository-hint": "Enter repository password", "feedback.validation.required.repository-password-confirm": "Confirm Repository Password", "feedback.validation.required.repository-password-confirm-again": "enter repository password again", + "feedback.validation.required.server-password": "Server password", + "feedback.validation.required.server-password-hint": "Enter password to connect to server", + "feedback.validation.required.username": "Username", + "feedback.validation.required.username-hint": "Override this when restoring a snapshot taken by another user", "feedback.validation.required.valid-number-or-empty": "Must be a valid number or empty", + "feedback.validation.s3.access-key-id": "Access Key ID", + "feedback.validation.s3.access-key-id-hint": "Enter access key ID", + "feedback.validation.s3.bucket-name": "Bucket", + "feedback.validation.s3.bucket-name-hint": "Enter bucket name", + "feedback.validation.s3.object-name-prefix": "Object Name Prefix", + "feedback.validation.s3.override-region": "Override Region", + "feedback.validation.s3.override-region-hint": "Enter specific region (e.g., us-west-1) or leave empty", + "feedback.validation.s3.secret-access-key": "Secret Access Key", + "feedback.validation.s3.secret-access-key-hint": "Enter secret access key", + "feedback.validation.s3.server-endpoint": "Server Endpoint", + "feedback.validation.s3.server-endpoint-hint": "Enter server address (e.g., s3.amazonaws.com)", + "feedback.validation.s3.session-token": "Session Token", + "feedback.validation.s3.session-token-hint": "Enter session token or leave empty", "feedback.validation.webdav.password": "Password", "feedback.validation.webdav.password-hint": "Enter password", "feedback.validation.webdav.server-url": "WebDAV Server URL", @@ -251,6 +286,8 @@ "value.log.details-10-maximum-details": "10 - maximum details", "value.log.details-5-normal-details": "5 - normal details", "value.log.details-inherit-from-parent": "(inherit from parent)", + "value.provider.s3.http-connection-insecure": "Use HTTP connection (insecure)", + "value.provider.s3.no-tls-verification": "Do not verify TLS certificate", "value.ui.appearance-large": "大", "value.ui.appearance-medium": "中", "value.ui.appearance-small": "小", diff --git a/public/locales/pl/translation.json b/public/locales/pl/translation.json index 71108101..98ce9cd0 100644 --- a/public/locales/pl/translation.json +++ b/public/locales/pl/translation.json @@ -1,11 +1,13 @@ { "common.back": "Z powrotem", "common.cancel": "Anulować", + "common.click-here-to-learn-more": "Kliknij tutaj, aby dowiedzieć się więcej.", "common.delete": "Usuwać", "common.delete-confirm": "Potwierdź usunięcie", "common.loading": "Ładowanie ...", "common.next": "Następny", "common.return": "Wróć", + "enter-object-name-prefix-or-leave-empty-hint": "Wprowadź przedrostek nazwy obiektu lub pozostaw puste", "event.description.cancel": "Anulować", "event.description.new": "Wprowadź nowy opis", "event.description.remove": "Usuń opis", @@ -19,7 +21,10 @@ "event.pin.update": "Zaktualizuj Pin", "event.repository.advanced-options-hide": "Ukryj opcje zaawansowane", "event.repository.advanced-options.show": "Pokaż ustawienia zaawansowane", + "event.repository.connect-to-repository": "Połącz się z repozytorium", + "event.repository.create-repository": "Utwórz repozytorium", "feedback.description.modal-title": "Opis migawki", + "feedback.error.connection": "Błąd połączenia:", "feedback.header.actions": "działania", "feedback.header.defined": "Zdefiniowane", "feedback.header.directories": "Katalogi", @@ -42,14 +47,24 @@ "feedback.provider.sftp-server": "Serwer SFTP", "feedback.provider.use-repository-token": "Użyj tokena repozytorium", "feedback.provider.webdav-server": "Serwer WebDAV", + "feedback.repository.additional-parameters-hint": "Dodatkowe parametry można ustawić podczas tworzenia repozytorium za pomocą wiersza poleceń.", "feedback.repository.configuration": "Konfiguracja pamięci", + "feedback.repository.connect-as": "Połącz jako", + "feedback.repository.connect-in-read-only-mode": "Połącz się w trybie tylko do odczytu", + "feedback.repository.connect-in-read-only-mode-hint": "Tryb tylko do odczytu zapobiega wszelkim zmianom w repozytorium.", + "feedback.repository.connect-to-repository": "Połącz się z repozytorium", "feedback.repository.create-repository-new": "Utwórz nowe repozytorium", "feedback.repository.create-repository-new-help": "Wprowadź silne hasło, aby utworzyć repozytorium Kopia w udostępnionym magazynie.", + "feedback.repository.eec-warning": "[EKSPERYMENTALNE] Korekcja błędów może pomóc w ochronie przed niektórymi rodzajami uszkodzeń danych spowodowanymi spontanicznymi zamianami bitów na nośniku pamięci.", "feedback.repository.encryption": "Szyfrowanie", "feedback.repository.kopia-server-parameters": "Parametry serwera Kopia", "feedback.repository.name-default": "Moje repozytorium", + "feedback.repository.override-hint": "Aby zastąpić, kliknij „Pokaż opcje zaawansowane”", "feedback.repository.provider-selection": "Wybierz Typ przechowywania", "feedback.repository.provider-selection-hint": "Aby połączyć się z repozytorium lub je utworzyć, wybierz preferowany typ magazynu:", + "feedback.repository.repository-description": "Opis repozytorium", + "feedback.repository.repository-description-help": "Pomaga rozróżnić wiele połączonych repozytoriów", + "feedback.repository.repository-description-hint": "Wprowadź opis repozytorium", "feedback.repository.repository-token-enter": "Wprowadź token repozytorium", "feedback.tab.policies": "Konfiguracje", "feedback.tab.preferences": "Ustawienia", @@ -57,6 +72,7 @@ "feedback.tab.repository-is-not-connected": "Repozytorium nie jest połączone", "feedback.tab.snapshots": "Kopie", "feedback.tab.tasks": "Zadania", + "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} wyłączony) Files: {{files}} ({{files.excluded}} wyłączony) Directories: {{directories}} ({{directories.excluded}} wyłączony) Errors: {{errors}} ({{errors.ignored}} ignorowany)", "feedback.task.total": "Całkowity", "feedback.ui.appearance": "Wielkość tekstu", "feedback.ui.appearance-help": "Wybierz rodzaj czcionki", @@ -115,12 +131,31 @@ "feedback.validation.repository-token.token-hint": "Wklej token połączenia", "feedback.validation.required.directory": "Pole wymagane", "feedback.validation.required.field": "Pole wymagane", + "feedback.validation.required.hostname": "Nazwa hosta", + "feedback.validation.required.hostname-hint": "Zastąp tę opcję podczas przywracania migawki wykonanej na innym komputerze", "feedback.validation.required.password-repository": "Hasło do repozytorium", "feedback.validation.required.password-repository-help": "Służy do szyfrowania zawartości repozytorium", "feedback.validation.required.password-repository-hint": "Wprowadź hasło do repozytorium", "feedback.validation.required.repository-password-confirm": "Potwierdź hasło do repozytorium", "feedback.validation.required.repository-password-confirm-again": "wprowadź ponownie hasło do repozytorium", + "feedback.validation.required.server-password": "Hasło serwera", + "feedback.validation.required.server-password-hint": "Wprowadź hasło, aby połączyć się z serwerem", + "feedback.validation.required.username": "Nazwa użytkownika", + "feedback.validation.required.username-hint": "Zastąp tę opcję podczas przywracania migawki wykonanej przez innego użytkownika", "feedback.validation.required.valid-number-or-empty": "Musi to być prawidłowy numer lub pusty", + "feedback.validation.s3.access-key-id": "Identyfikator klucza dostępu", + "feedback.validation.s3.access-key-id-hint": "Wprowadź identyfikator klucza dostępu", + "feedback.validation.s3.bucket-name": "Wiaderko", + "feedback.validation.s3.bucket-name-hint": "Wpisz nazwę zasobnika", + "feedback.validation.s3.object-name-prefix": "Przedrostek nazwy obiektu", + "feedback.validation.s3.override-region": "Zastąp region", + "feedback.validation.s3.override-region-hint": "Wpisz konkretny region (np. us-west-1) lub pozostaw puste", + "feedback.validation.s3.secret-access-key": "Tajny klucz dostępu", + "feedback.validation.s3.secret-access-key-hint": "Wprowadź tajny klucz dostępu", + "feedback.validation.s3.server-endpoint": "Punkt końcowy serwera", + "feedback.validation.s3.server-endpoint-hint": "Wpisz adres serwera (np. s3.amazonaws.com)", + "feedback.validation.s3.session-token": "Token sesji", + "feedback.validation.s3.session-token-hint": "Wprowadź token sesji lub pozostaw puste", "feedback.validation.webdav.password": "Hasło", "feedback.validation.webdav.password-hint": "Wprowadź hasło", "feedback.validation.webdav.server-url": "Adres URL serwera WebDAV", @@ -251,6 +286,8 @@ "value.log.details-10-maximum-details": "10 - maksimum szczegółów", "value.log.details-5-normal-details": "5 - normalne szczegóły", "value.log.details-inherit-from-parent": "(dziedzicz po rodzicu)", + "value.provider.s3.http-connection-insecure": "Użyj połączenia HTTP (niepewne)", + "value.provider.s3.no-tls-verification": "Nie weryfikuj certyfikatu TLS", "value.ui.appearance-large": "duża", "value.ui.appearance-medium": "średnia", "value.ui.appearance-small": "mała", diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index 41e9391c..c28beccb 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -1,11 +1,13 @@ { "common.back": "Назад", "common.cancel": "Отмена", + "common.click-here-to-learn-more": "Кликните сюда, чтобы узнать больше.", "common.delete": "Удалить", "common.delete-confirm": "Подтвердите удаление", "common.loading": "Загрузка...", "common.next": "Следующий", "common.return": "Возврат", + "enter-object-name-prefix-or-leave-empty-hint": "Введите префикс имени объекта или оставьте пустым.", "event.description.cancel": "Отмена", "event.description.new": "Введите новое описание", "event.description.remove": "Удалить описание", @@ -19,7 +21,10 @@ "event.pin.update": "Обновить пин-код", "event.repository.advanced-options-hide": "Скрыть дополнительные параметры", "event.repository.advanced-options.show": "Показать дополнительные параметры", + "event.repository.connect-to-repository": "Подключиться к репозиторию", + "event.repository.create-repository": "Создать репозиторий", "feedback.description.modal-title": "Описание снимка", + "feedback.error.connection": "Ошибка подключения:", "feedback.header.actions": "Действия", "feedback.header.defined": "Определенный", "feedback.header.directories": "Каталоги", @@ -42,14 +47,24 @@ "feedback.provider.sftp-server": "SFTP-сервер", "feedback.provider.use-repository-token": "Использовать токен репозитория", "feedback.provider.webdav-server": "ВебДАВ-сервер", + "feedback.repository.additional-parameters-hint": "Дополнительные параметры можно задать при создании репозитория с помощью командной строки.", "feedback.repository.configuration": "Конфигурация хранилища", + "feedback.repository.connect-as": "Подключиться как", + "feedback.repository.connect-in-read-only-mode": "Подключайтесь в режиме только для чтения", + "feedback.repository.connect-in-read-only-mode-hint": "Режим только для чтения предотвращает любые изменения в репозитории.", + "feedback.repository.connect-to-repository": "Подключиться к репозиторию", "feedback.repository.create-repository-new": "Создать новый репозиторий", "feedback.repository.create-repository-new-help": "Введите надежный пароль, чтобы создать репозиторий Kopia в предоставленном хранилище.", + "feedback.repository.eec-warning": "[ЭКСПЕРИМЕНТАЛЬНАЯ ЧАСТЬ] Исправление ошибок может помочь защитить от определенных видов повреждения данных из-за самопроизвольной смены битов на носителе.", "feedback.repository.encryption": "Шифрование", "feedback.repository.kopia-server-parameters": "Параметры сервера Копия", "feedback.repository.name-default": "Мой репозиторий", + "feedback.repository.override-hint": "Чтобы переопределить, нажмите «Показать дополнительные параметры».", "feedback.repository.provider-selection": "Выберите тип хранилища", "feedback.repository.provider-selection-hint": "Чтобы подключиться к репозиторию или создать его, выберите предпочитаемый тип хранилища:", + "feedback.repository.repository-description": "Описание репозитория", + "feedback.repository.repository-description-help": "Помогает различать несколько подключенных репозиториев.", + "feedback.repository.repository-description-hint": "Введите описание репозитория", "feedback.repository.repository-token-enter": "Введите токен репозитория", "feedback.tab.policies": "Политики", "feedback.tab.preferences": "Настройки", @@ -57,6 +72,7 @@ "feedback.tab.repository-is-not-connected": "Репозиторий не подключен", "feedback.tab.snapshots": "Снимки", "feedback.tab.tasks": "Задачи", + "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} исключено) Files: {{files}} ({{files.excluded}} исключено) Directories: {{directories}} ({{directories.excluded}} исключено) Errors: {{errors}} ({{errors.ignored}} проигнорировал)", "feedback.task.total": "Общий", "feedback.ui.appearance": "Внешний вид", "feedback.ui.appearance-help": "Определяет внешний вид пользовательского интерфейса", @@ -115,12 +131,31 @@ "feedback.validation.repository-token.token-hint": "Вставить токен подключения", "feedback.validation.required.directory": "Обязательное поле", "feedback.validation.required.field": "Обязательное поле", + "feedback.validation.required.hostname": "Имя хоста", + "feedback.validation.required.hostname-hint": "Переопределите это значение при восстановлении снимка, сделанного на другом компьютере.", "feedback.validation.required.password-repository": "Пароль репозитория", "feedback.validation.required.password-repository-help": "Используется для шифрования содержимого репозитория.", "feedback.validation.required.password-repository-hint": "Введите пароль репозитория", "feedback.validation.required.repository-password-confirm": "Подтвердите пароль репозитория", "feedback.validation.required.repository-password-confirm-again": "введите пароль хранилища еще раз", + "feedback.validation.required.server-password": "Пароль сервера", + "feedback.validation.required.server-password-hint": "Введите пароль для подключения к серверу", + "feedback.validation.required.username": "Имя пользователя", + "feedback.validation.required.username-hint": "Переопределите это при восстановлении снимка, сделанного другим пользователем.", "feedback.validation.required.valid-number-or-empty": "Должно быть действительным числом или пустым.", + "feedback.validation.s3.access-key-id": "Идентификатор ключа доступа", + "feedback.validation.s3.access-key-id-hint": "Введите идентификатор ключа доступа", + "feedback.validation.s3.bucket-name": "Ведро", + "feedback.validation.s3.bucket-name-hint": "Введите название сегмента", + "feedback.validation.s3.object-name-prefix": "Префикс имени объекта", + "feedback.validation.s3.override-region": "Переопределить регион", + "feedback.validation.s3.override-region-hint": "Введите конкретный регион (например, us-west-1) или оставьте пустым.", + "feedback.validation.s3.secret-access-key": "Секретный ключ доступа", + "feedback.validation.s3.secret-access-key-hint": "Введите секретный ключ доступа", + "feedback.validation.s3.server-endpoint": "Конечная точка сервера", + "feedback.validation.s3.server-endpoint-hint": "Введите адрес сервера (например, s3.amazonaws.com)", + "feedback.validation.s3.session-token": "Токен сеанса", + "feedback.validation.s3.session-token-hint": "Введите токен сеанса или оставьте пустым", "feedback.validation.webdav.password": "Пароль", "feedback.validation.webdav.password-hint": "Введите пароль", "feedback.validation.webdav.server-url": "URL-адрес сервера WebDAV", @@ -251,6 +286,8 @@ "value.log.details-10-maximum-details": "10 - максимум деталей", "value.log.details-5-normal-details": "5 - нормальные детали", "value.log.details-inherit-from-parent": "(наследовать от родителя)", + "value.provider.s3.http-connection-insecure": "Использовать HTTP-соединение (небезопасно)", + "value.provider.s3.no-tls-verification": "Не проверять сертификат TLS", "value.ui.appearance-large": "большой", "value.ui.appearance-medium": "средний", "value.ui.appearance-small": "маленький", diff --git a/src/components/Logs.jsx b/src/components/Logs.jsx index 5ee904d4..44699f0f 100644 --- a/src/components/Logs.jsx +++ b/src/components/Logs.jsx @@ -6,8 +6,8 @@ import { redirect } from '../utils/uiutil'; import i18n from '../utils/i18n'; export class Logs extends Component { - constructor() { - super(); + constructor(props) { + super(props); this.state = { items: [], isLoading: false, @@ -16,7 +16,6 @@ export class Logs extends Component { this.handleChange = handleChange.bind(this); this.fetchLog = this.fetchLog.bind(this); - this.interval = window.setInterval(this.fetchLog, 3000); this.messagesEndRef = React.createRef(); this.scrollToBottom = this.scrollToBottom.bind(this); } @@ -26,6 +25,7 @@ export class Logs extends Component { isLoading: true, }); + this.interval = window.setInterval(this.fetchLog, 3000); this.fetchLog(); this.scrollToBottom(); } diff --git a/src/components/SetupRepository.jsx b/src/components/SetupRepository.jsx index dbfc7f2f..ac93a00b 100644 --- a/src/components/SetupRepository.jsx +++ b/src/components/SetupRepository.jsx @@ -345,7 +345,7 @@ export class SetupRepository extends Component {

{i18n.t('feedback.repository.create-repository-new-help')}

{RequiredField(this, i18n.t('feedback.validation.required.password-repository'), "password", { autoFocus: true, type: "password", placeholder: i18n.t('feedback.validation.required.password-repository-hint') }, i18n.t('feedback.validation.required.password-repository-help'))} - {RequiredField(this, i18n.t('feedback.validation.required.repository-password-confirm'), "confirmPassword", { type: "password", placeholder: i18n.t('feedback.validation.required.repository-password-confirm-again')})} + {RequiredField(this, i18n.t('feedback.validation.required.repository-password-confirm'), "confirmPassword", { type: "password", placeholder: i18n.t('feedback.validation.required.repository-password-confirm-again') })}
{this.toggleAdvancedButton()} @@ -384,6 +384,7 @@ export class SetupRepository extends Component { +
Repository Format @@ -427,78 +428,80 @@ export class SetupRepository extends Component {
- [EXPERIMENTAL] Error correction can help protect from certain - kinds of data corruption due to spontaneous bit flips in the storage - media. Click here to - learn more. + {i18n.t('feedback.repository.eec-warning')} {i18n.t('common.click-here-to-learn-more')}. +
{this.overrideUsernameHostnameRow()} - Additional parameters can be set when creating repository using command line. + {i18n.t('feedback.repository.additional-parameters-hint')} +
{this.connectionErrorInfo()}
- -   - + + {' '} + {this.loadingSpinner()} ; } overrideUsernameHostnameRow() { return - {RequiredField(this, "Username", "username", {}, "Override this when restoring a snapshot taken by another user")} - {RequiredField(this, "Hostname", "hostname", {}, "Override this when restoring a snapshot taken on another machine")} + {RequiredField(this, i18n.t('feedback.validation.required.username'), "username", {}, i18n.t('feedback.validation.required.username-hint'))} + {RequiredField(this, i18n.t('feedback.validation.required.hostname'), "hostname", {}, i18n.t('feedback.validation.required.hostname-hint'))} ; } connectionErrorInfo() { return this.state.connectError && - Connect Error: {this.state.connectError} + {i18n.t('feedback.error.connection')} {this.state.connectError} ; } renderConfirmConnect() { return -

Connect To Repository

+

{i18n.t('feedback.repository.connect-to-repository')}

- Connect As + {i18n.t('feedback.repository.connect-as')} - To override, click 'Show Advanced Options' + {i18n.t('feedback.repository.override-hint')} +
- {(this.state.provider !== "_token" && this.state.provider !== "_server") && RequiredField(this, "Repository Password", "password", { autoFocus: true, type: "password", placeholder: "enter repository password" }, "Used to encrypt the repository's contents")} - {this.state.provider === "_server" && RequiredField(this, "Server Password", "password", { autoFocus: true, type: "password", placeholder: "enter password to connect to server" })} + {(this.state.provider !== "_token" && this.state.provider !== "_server") && RequiredField(this, i18n.t('feedback.validation.required.password-repository'), "password", { autoFocus: true, type: "password", placeholder: i18n.t('feedback.validation.required.password-repository-hint') }, i18n.t('feedback.validation.required.password-repository-help'))} + {this.state.provider === "_server" && RequiredField(this, i18n.t('feedback.validation.required.server-password'), "password", { autoFocus: true, type: "password", placeholder: i18n.t('feedback.validation.required.server-password-hint') })} +
- {RequiredField(this, "Repository Description", "description", { autoFocus: this.state.provider === "_token", placeholder: "enter repository description" }, "Helps to distinguish between multiple connected repositories")} + {RequiredField(this, i18n.t('feedback.repository.repository-description'), "description", { autoFocus: this.state.provider === "_token", placeholder: i18n.t('feedback.repository.repository-description-hint') }, i18n.t('feedback.repository.repository-description-help') )} +
{this.toggleAdvancedButton()}
- {RequiredBoolean(this, "Connect in read-only mode", "readonly", "Read-only mode prevents any changes to the repository.")} + {RequiredBoolean(this, i18n.t('feedback.repository.connect-in-read-only-mode'), "readonly", i18n.t('feedback.repository.connect-in-read-only-mode-hint'))} {this.overrideUsernameHostnameRow()}
{this.connectionErrorInfo()}
- -   - + + {' '} + {this.loadingSpinner()} ; } @@ -526,7 +529,6 @@ export class SetupRepository extends Component { render() { return <> {this.renderInternal()} - {/*
{JSON.stringify(this.state, null, 2)}
*/} ; } } diff --git a/src/components/SetupRepositoryS3.jsx b/src/components/SetupRepositoryS3.jsx index d05da1d3..96c28e39 100644 --- a/src/components/SetupRepositoryS3.jsx +++ b/src/components/SetupRepositoryS3.jsx @@ -4,6 +4,7 @@ import { handleChange, validateRequiredFields } from '../forms'; import { OptionalField } from '../forms/OptionalField'; import { RequiredBoolean } from '../forms/RequiredBoolean'; import { RequiredField } from '../forms/RequiredField'; +import i18n from '../utils/i18n'; export class SetupRepositoryS3 extends Component { constructor(props) { @@ -24,21 +25,21 @@ export class SetupRepositoryS3 extends Component { render() { return <> - {RequiredField(this, "Bucket", "bucket", { autoFocus: true, placeholder: "enter bucket name" })} - {RequiredField(this, "Server Endpoint", "endpoint", { placeholder: "enter server address (e.g., s3.amazonaws.com)" })} - {OptionalField(this, "Override Region", "region", { placeholder: "enter specific region (e.g., us-west-1) or leave empty" })} + {RequiredField(this, i18n.t('feedback.validation.s3.bucket-name'), "bucket", { autoFocus: true, placeholder: i18n.t('feedback.validation.s3.bucket-name-hint') })} + {RequiredField(this, i18n.t('feedback.validation.s3.server-endpoint'), "endpoint", { placeholder: i18n.t('feedback.validation.s3.server-endpoint-hint') })} + {OptionalField(this, i18n.t('feedback.validation.s3.override-region'), "region", { placeholder: i18n.t('feedback.validation.s3.override-region-hint') })} - {RequiredBoolean(this, "Use HTTP connection (insecure)", "doNotUseTLS")} - {RequiredBoolean(this, "Do not verify TLS certificate", "doNotVerifyTLS")} + {RequiredBoolean(this, i18n.t('value.provider.s3.http-connection-insecure'), "doNotUseTLS")} + {RequiredBoolean(this, i18n.t('value.provider.s3.no-tls-verification'), "doNotVerifyTLS")} - {RequiredField(this, "Access Key ID", "accessKeyID", { placeholder: "enter access key ID" })} - {RequiredField(this, "Secret Access Key", "secretAccessKey", { placeholder: "enter secret access key", type: "password" })} - {OptionalField(this, "Session Token", "sessionToken", { placeholder: "enter session token or leave empty", type: "password" })} + {RequiredField(this, i18n.t('feedback.validation.s3.access-key-id'), "accessKeyID", { placeholder: i18n.t('feedback.validation.s3.access-key-id-hint') })} + {RequiredField(this, i18n.t('feedback.validation.s3.secret-access-key'), "secretAccessKey", { placeholder: i18n.t('feedback.validation.s3.secret-access-key-hint'), type: "password" })} + {OptionalField(this, i18n.t('feedback.validation.s3.session-token'), "sessionToken", { placeholder: i18n.t('feedback.validation.s3.session-token-hint'), type: "password" })} - {OptionalField(this, "Object Name Prefix", "prefix", { placeholder: "enter object name prefix or leave empty" })} + {OptionalField(this, i18n.t('feedback.validation.s3.object-name-prefix'), "prefix", { placeholder: i18n.t('enter-object-name-prefix-or-leave-empty-hint') })} ; } diff --git a/src/components/SnapshotEstimation.jsx b/src/components/SnapshotEstimation.jsx index 80adc094..033c5d33 100644 --- a/src/components/SnapshotEstimation.jsx +++ b/src/components/SnapshotEstimation.jsx @@ -13,26 +13,23 @@ import i18n from '../utils/i18n'; import { Trans } from 'react-i18next'; export class SnapshotEstimation extends Component { - constructor() { - super(); + constructor(props) { + super(props); this.state = { isLoading: true, error: null, showLog: false, }; - this.taskID = this.taskID.bind(this); this.fetchTask = this.fetchTask.bind(this); - - // poll frequently, we will stop as soon as the task ends. - this.interval = window.setInterval(() => this.fetchTask(this.props), 500); } componentDidMount() { this.setState({ isLoading: true, }); - + // poll frequently, we will stop as soon as the task ends. + this.interval = window.setInterval(() => this.fetchTask(this.props), 500); this.fetchTask(this.props); } diff --git a/src/css/App.css b/src/css/App.css index 49502f76..eba0edf3 100644 --- a/src/css/App.css +++ b/src/css/App.css @@ -158,9 +158,10 @@ body { } #kopia .text-muted.form-text, +#kopia .text-muted, #kopia .form-text, #kopia .form-control::placeholder { - color: var(--color-text-form-help) !important + color: var(--color-text-form-help) !important; } #kopia .accordion-body, diff --git a/src/pages/Task.jsx b/src/pages/Task.jsx index 1a109a58..11ff8c61 100644 --- a/src/pages/Task.jsx +++ b/src/pages/Task.jsx @@ -16,8 +16,8 @@ import { UIPreferencesContext } from '../contexts/UIPreferencesContext'; import i18n from '../utils/i18n' export class Task extends Component { - constructor() { - super(); + constructor(props) { + super(props); this.state = { items: [], isLoading: true, @@ -27,9 +27,6 @@ export class Task extends Component { this.taskID = this.taskID.bind(this); this.fetchTask = this.fetchTask.bind(this); - - // poll frequently, we will stop as soon as the task ends. - this.interval = window.setInterval(() => this.fetchTask(), 500); } componentDidMount() { @@ -37,6 +34,8 @@ export class Task extends Component { isLoading: true, }); + // poll frequently, we will stop as soon as the task ends. + this.interval = window.setInterval(() => this.fetchTask(), 500); this.fetchTask(); } From 81025f0f2ac753fcf343eea0e1eb803efce4ebd1 Mon Sep 17 00:00:00 2001 From: lupusA Date: Fri, 22 Mar 2024 21:43:34 +0100 Subject: [PATCH 23/27] Further translating strings. Some minor layout fixes. --- .vscode/settings.json | 4 ++- public/locales/de/translation.json | 37 ++++++++++++++++++--- public/locales/en/translation.json | 31 +++++++++++++++++- public/locales/es/translation.json | 29 +++++++++++++++++ public/locales/fr/translation.json | 31 +++++++++++++++++- public/locales/it/translation.json | 29 +++++++++++++++++ public/locales/jp/translation.json | 29 +++++++++++++++++ public/locales/pl/translation.json | 29 +++++++++++++++++ public/locales/ru/translation.json | 29 +++++++++++++++++ src/components/SetupRepository.jsx | 16 ++++----- src/components/SetupRepositoryAzure.jsx | 2 ++ src/components/SetupRepositoryB2.jsx | 2 ++ src/components/SetupRepositoryGCS.jsx | 2 ++ src/components/SetupRepositoryRclone.jsx | 1 + src/components/SetupRepositoryS3.jsx | 3 ++ src/components/SetupRepositorySFTP.jsx | 41 ++++++++++++++---------- src/components/SetupRepositoryServer.jsx | 1 + src/components/SetupRepositoryWebDAV.jsx | 1 + 18 files changed, 285 insertions(+), 32 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 94e7f97e..d45150a4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -15,6 +15,8 @@ "feedback.provider.webdav-server", "feedback.provider.backblaze-b2", "feedback.provider.sftp-server", - "feedback.task.estimate-results" + "feedback.task.estimate-results", + "feedback.provider.required-either-known-host-data", + "feedback.provider.required-either-key-file" ] } \ No newline at end of file diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 24f7764a..9052c012 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -43,6 +43,8 @@ "feedback.provider.kopia-repository-server": "Kopia-Repository-Server", "feedback.provider.local-directory-or-nas": "Lokales Verzeichnis oder NAS", "feedback.provider.rclone-remote": "Rclone Remote", + "feedback.provider.required-either-key-file": "Es ist entweder Passwort, Schlüsseldatei oder Schlüsseldaten erforderlich.", + "feedback.provider.required-either-known-host-data": "Es sind entweder Known Hosts File oder Known Hosts Data erforderlich, aber nicht beides.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 oder kompatibler Speicher", "feedback.provider.sftp-server": "SFTP-Server", "feedback.provider.use-repository-token": "Repository-Token", @@ -174,15 +176,15 @@ "policies.kind.host": "Richtlinien pro Host", "policies.kind.local": "Lokale Richtlinien", "policies.kind.user": "Richtlinien pro Benutzer", - "repository.attribute.algorithm.eco": "Error correction algorithm", + "repository.attribute.algorithm.eco": "Fehlerkorrekturalgorithmus", "repository.attribute.algorithm.encryption": "Verschlüsselungsalgorithmus", "repository.attribute.algorithm.hash": "Hash-Algorithmus", - "repository.attribute.algorithm.splitter": "Splitter algorithm", + "repository.attribute.algorithm.splitter": "Splitter-Algorithmus", "repository.attribute.compression.internal": "Interne Kompression", "repository.attribute.config.file": "Konfigurationsdatei", "repository.attribute.connected.as": "Verbunden als", - "repository.attribute.eco": "Error correction overhead", - "repository.attribute.format": "Repository format", + "repository.attribute.eco": "Aufwand für die Fehlerkorrektur", + "repository.attribute.format": "Repository-Format", "repository.attribute.provider": "Anbieter", "repository.attribute.server.url": "Server URL", "repository.event.connection.cancel": "Cancel connection", @@ -281,6 +283,31 @@ "task.status.running.for": "Task running for", "task.status.started": "Gestartet", "task.status.succeed.after": "Task succeeded after", + "validation.password": "Passwort", + "validation.password-hint": "Passwort eingeben", + "validation.provider.external-ssh-command": "Starten Sie einen externen SSH-Befehl ohne Passwort", + "validation.provider.external-ssh-command-hint": "Standardmäßig stellt Kopia über einen internen SSH-Client eine Verbindung zum Server her, der begrenzte Optionen unterstützt. \nAlternativ kann ein externer SSH-Befehl ohne Passwort gestartet werden, der zusätzliche Optionen unterstützt, aber im Allgemeinen weniger effizient ist als der integrierte Client.", + "validation.provider.host": "Host", + "validation.provider.host-hint": "SSH-Hostname (z. B. example.com)", + "validation.provider.key-data": "Schlüsseldaten", + "validation.provider.key-data-hint": "Fügen Sie den Inhalt der Schlüsseldatei ein", + "validation.provider.known-host-data": "Daten bekannter Hosts", + "validation.provider.known-host-data-hint": "Fügen Sie den Inhalt der Datei „known_hosts“ ein", + "validation.provider.path": "Pfad", + "validation.provider.path-hint": "Geben Sie den Remote-Pfad zum Repository ein, z. B. „/mnt/data/repository“.", + "validation.provider.path-host-file": "Pfad zur Datei „known_hosts“.", + "validation.provider.path-host-file-hint": "Geben Sie den Pfad zur Datei „known_hosts“ ein", + "validation.provider.path-key-file": "Pfad zur Schlüsseldatei", + "validation.provider.path-key-file-hint": "Geben Sie den Pfad zur Schlüsseldatei ein", + "validation.provider.port": "Port", + "validation.provider.port-hint": "Portnummer (z. B. 22)", + "validation.provider.ssh-arguments": "SSH-Argumente", + "validation.provider.ssh-arguments-hint": "Geben Sie SSH-Befehlsargumente ein ('user@host -s sftp' wird automatisch angehängt)", + "validation.provider.ssh-command": "SSH-Befehl", + "validation.provider.ssh-command-hint": "Geben Sie den auszuführenden passwortlosen SSH-Befehl an (normalerweise „ssh“).", + "validation.provider.user": "Benutzer", + "validation.provider.user-hint": "Nutzername", + "value.algorithm.eco-disabled": "Deaktiviert", "value.log.details-0-no-output": "0 - keine Ausgabe", "value.log.details-1-minimal-details": "1 – minimale Details", "value.log.details-10-maximum-details": "10 - maximale Details", @@ -288,6 +315,8 @@ "value.log.details-inherit-from-parent": "(vom übergeordneten Element erben)", "value.provider.s3.http-connection-insecure": "HTTP-Verbindung verwenden (unsicher)", "value.provider.s3.no-tls-verification": "TLS-Zertifikat nicht überprüfen", + "value.repository.format.latest": "Neuestes Format", + "value.repository.format.legacy": "Legacy-Format kompatibel mit v0.8", "value.ui.appearance-large": "groß", "value.ui.appearance-medium": "mittel", "value.ui.appearance-small": "klein", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 75747325..51bc49df 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -43,6 +43,7 @@ "feedback.provider.kopia-repository-server": "Kopia Repository Server", "feedback.provider.local-directory-or-nas": "Local Directory or NAS", "feedback.provider.rclone-remote": "Rclone Remote", + "feedback.provider.required-either-key-file": "One of Password, Key File or Key Data is required.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 or Compatible Storage", "feedback.provider.sftp-server": "SFTP Server", "feedback.provider.use-repository-token": "Use Repository Token", @@ -281,6 +282,31 @@ "task.status.running.for": "Task running for", "task.status.started": "Started", "task.status.succeed.after": "Task succeeded after", + "validation.password": "Password", + "validation.password-hint": "Enter password", + "validation.provider.external-ssh-command": "Launch external password-less SSH command", + "validation.provider.external-ssh-command-hint": "By default Kopia connects to the server using internal SSH client which supports limited options. Alternatively it may launch external password-less SSH command, which supports additional options, but is generally less efficient than the built-in client.", + "validation.provider.host": "Host", + "validation.provider.host-hint": "ssh host name (e.g., example.com)", + "validation.provider.key-data": "Key data", + "validation.provider.key-data-hint": "Paste contents of the key file", + "validation.provider.known-host-data": "Known Hosts Data", + "validation.provider.known-host-data-hint": "Paste the contents of the known_hosts file", + "validation.provider.path": "Path", + "validation.provider.path-hint": "Enter remote path to repository, e.g., '/mnt/data/repository'", + "validation.provider.path-host-file": "Path to known_hosts file", + "validation.provider.path-host-file-hint": "Enter path to the known_hosts file", + "validation.provider.path-key-file": "Path to key file", + "validation.provider.path-key-file-hint": "Enter path to the key file", + "validation.provider.port": "Port", + "validation.provider.port-hint": "Port number (e.g., 22)", + "validation.provider.ssh-arguments": "SSH Arguments", + "validation.provider.ssh-arguments-hint": "Enter SSH command arguments ('user@host -s sftp' will be appended automatically)", + "validation.provider.ssh-command": "SSH Command", + "validation.provider.ssh-command-hint": "Provide the passwordless SSH command to execute (typically 'ssh')", + "validation.provider.user": "User", + "validation.provider.user-hint": "User name", + "value.algorithm.eco-disabled": "Disabled", "value.log.details-0-no-output": "0 - no output", "value.log.details-1-minimal-details": "1 - minimal details", "value.log.details-10-maximum-details": "10 - maximum details", @@ -288,6 +314,8 @@ "value.log.details-inherit-from-parent": "(inherit from parent)", "value.provider.s3.http-connection-insecure": "Use HTTP connection (insecure)", "value.provider.s3.no-tls-verification": "Do not verify TLS certificate", + "value.repository.format.latest": "Latest format", + "value.repository.format.legacy": "Legacy format compatible with v0.8", "value.ui.appearance-large": "large", "value.ui.appearance-medium": "medium", "value.ui.appearance-small": "small", @@ -298,5 +326,6 @@ "value.ui.theme-ocean": "ocean", "value.ui.theme-pastel": "pastel", "value.validation.optional-no": "no", - "value.validation.optional-yes": "yes" + "value.validation.optional-yes": "yes", + "feedback.provider.required-either-known-host-data": "Either Known Hosts File or Known Hosts Data is required, but not both." } diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index bdad0155..1a776551 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -43,6 +43,8 @@ "feedback.provider.kopia-repository-server": "Servidor de repositorio de Kopia", "feedback.provider.local-directory-or-nas": "Directorio local o NAS", "feedback.provider.rclone-remote": "Clon remoto", + "feedback.provider.required-either-key-file": "Se requiere una de las opciones Contraseña, Archivo de claves o Datos clave.", + "feedback.provider.required-either-known-host-data": "Se requiere archivo de hosts conocidos o datos de hosts conocidos, pero no ambos.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 o almacenamiento compatible", "feedback.provider.sftp-server": "Servidor SFTP", "feedback.provider.use-repository-token": "Usar token de repositorio", @@ -281,6 +283,31 @@ "task.status.running.for": "Tarea en ejecución durante", "task.status.started": "Iniciada", "task.status.succeed.after": "La tarea se completó con éxito después de", + "validation.password": "Contraseña", + "validation.password-hint": "Introducir la contraseña", + "validation.provider.external-ssh-command": "Inicie el comando SSH externo sin contraseña", + "validation.provider.external-ssh-command-hint": "De forma predeterminada, Kopia se conecta al servidor mediante un cliente SSH interno que admite opciones limitadas. \nAlternativamente, puede iniciar un comando SSH externo sin contraseña, que admite opciones adicionales, pero generalmente es menos eficiente que el cliente integrado.", + "validation.provider.host": "Anfitrión", + "validation.provider.host-hint": "nombre de host ssh (por ejemplo, ejemplo.com)", + "validation.provider.key-data": "Llave de datos", + "validation.provider.key-data-hint": "Pegar el contenido del archivo clave", + "validation.provider.known-host-data": "Datos de hosts conocidos", + "validation.provider.known-host-data-hint": "Pegue el contenido del archivo conocido_hosts", + "validation.provider.path": "Camino", + "validation.provider.path-hint": "Ingrese la ruta remota al repositorio, por ejemplo, '/mnt/data/repository'", + "validation.provider.path-host-file": "Ruta al archivoknown_hosts", + "validation.provider.path-host-file-hint": "Ingrese la ruta al archivo conocido_hosts", + "validation.provider.path-key-file": "Ruta al archivo clave", + "validation.provider.path-key-file-hint": "Ingrese la ruta al archivo clave", + "validation.provider.port": "Puerto", + "validation.provider.port-hint": "Número de puerto (por ejemplo, 22)", + "validation.provider.ssh-arguments": "Argumentos SSH", + "validation.provider.ssh-arguments-hint": "Ingrese los argumentos del comando SSH ('user@host -s sftp' se agregará automáticamente)", + "validation.provider.ssh-command": "Comando SSH", + "validation.provider.ssh-command-hint": "Proporcione el comando SSH sin contraseña para ejecutar (normalmente 'ssh')", + "validation.provider.user": "Usuario", + "validation.provider.user-hint": "Nombre de usuario", + "value.algorithm.eco-disabled": "Desactivado", "value.log.details-0-no-output": "0 - sin salida", "value.log.details-1-minimal-details": "1 - detalles mínimos", "value.log.details-10-maximum-details": "10 - detalles máximos", @@ -288,6 +315,8 @@ "value.log.details-inherit-from-parent": "(heredado de los padres)", "value.provider.s3.http-connection-insecure": "Usar conexión HTTP (insegura)", "value.provider.s3.no-tls-verification": "No verificar el certificado TLS", + "value.repository.format.latest": "Último formato", + "value.repository.format.legacy": "Formato heredado compatible con v0.8", "value.ui.appearance-large": "grande", "value.ui.appearance-medium": "mediano", "value.ui.appearance-small": "pequeño", diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 992c2389..a0feaf14 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -43,6 +43,8 @@ "feedback.provider.kopia-repository-server": "Serveur de référentiel Kopia", "feedback.provider.local-directory-or-nas": "Répertoire local ou NAS", "feedback.provider.rclone-remote": "Rclone à distance", + "feedback.provider.required-either-key-file": "L'un des éléments suivants : Mot de passe, Fichier clé ou Données clés est requis.", + "feedback.provider.required-either-known-host-data": "Le Fichier des hôtes connus ou les Données des hôtes connus sont requis, mais pas les deux.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 ou stockage compatible", "feedback.provider.sftp-server": "Serveur SFTP", "feedback.provider.use-repository-token": "Utiliser le jeton de référentiel", @@ -174,7 +176,7 @@ "policies.kind.host": "Politiques par hôte", "policies.kind.local": "Politiques locales", "policies.kind.user": "Politiques par utilisateur", - "repository.attribute.algorithm.eco": "Algorithme de correction d'erreurs", + "repository.attribute.algorithm.eco": "Algorithme de correction d'erreur", "repository.attribute.algorithm.encryption": "Algorithme de chiffrement", "repository.attribute.algorithm.hash": "Algorithme de hachage", "repository.attribute.algorithm.splitter": "Algorithme de découpage", @@ -281,6 +283,31 @@ "task.status.running.for": "Tâche en cours depuis", "task.status.started": "Démarré", "task.status.succeed.after": "Tâche réussie après", + "validation.password": "Mot de passe", + "validation.password-hint": "Entrer le mot de passe", + "validation.provider.external-ssh-command": "Lancer une commande SSH externe sans mot de passe", + "validation.provider.external-ssh-command-hint": "Par défaut, Kopia se connecte au serveur à l'aide d'un client SSH interne qui prend en charge des options limitées. \nAlternativement, il peut lancer une commande SSH externe sans mot de passe, qui prend en charge des options supplémentaires, mais est généralement moins efficace que le client intégré.", + "validation.provider.host": "Hôte", + "validation.provider.host-hint": "nom d'hôte ssh (par exemple, example.com)", + "validation.provider.key-data": "Données clé", + "validation.provider.key-data-hint": "Collez le contenu du fichier de clé", + "validation.provider.known-host-data": "Données sur les hôtes connus", + "validation.provider.known-host-data-hint": "Collez le contenu du fichier known_hosts", + "validation.provider.path": "Chemin", + "validation.provider.path-hint": "Entrez le chemin distant vers le référentiel, par exemple « /mnt/data/repository »", + "validation.provider.path-host-file": "Chemin d'accès au fichier known_hosts", + "validation.provider.path-host-file-hint": "Entrez le chemin d'accès au fichier known_hosts", + "validation.provider.path-key-file": "Chemin d'accès au fichier de clé", + "validation.provider.path-key-file-hint": "Entrez le chemin d'accès au fichier de clé", + "validation.provider.port": "Port", + "validation.provider.port-hint": "Numéro de port (par exemple, 22)", + "validation.provider.ssh-arguments": "Arguments SSH", + "validation.provider.ssh-arguments-hint": "Entrez les arguments de la commande SSH (« user@host -s sftp » sera ajouté automatiquement)", + "validation.provider.ssh-command": "Commande SSH", + "validation.provider.ssh-command-hint": "Fournissez la commande SSH sans mot de passe à exécuter (généralement « ssh »)", + "validation.provider.user": "Utilisateur", + "validation.provider.user-hint": "Nom d'utilisateur", + "value.algorithm.eco-disabled": "Désactivé", "value.log.details-0-no-output": "0 - aucune sortie", "value.log.details-1-minimal-details": "1 - détails minimes", "value.log.details-10-maximum-details": "10 - détails maximum", @@ -288,6 +315,8 @@ "value.log.details-inherit-from-parent": "(hériter du parent)", "value.provider.s3.http-connection-insecure": "Utiliser une connexion HTTP (non sécurisée)", "value.provider.s3.no-tls-verification": "Ne pas vérifier le certificat TLS", + "value.repository.format.latest": "Dernier format", + "value.repository.format.legacy": "Format hérité compatible avec la v0.8", "value.ui.appearance-large": "grande", "value.ui.appearance-medium": "moyenne", "value.ui.appearance-small": "petite", diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index 9ea5ab87..470e8c48 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -43,6 +43,8 @@ "feedback.provider.kopia-repository-server": "Server di archivio Kopia", "feedback.provider.local-directory-or-nas": "Directory locale o NAS", "feedback.provider.rclone-remote": "RClone remoto", + "feedback.provider.required-either-key-file": "È richiesta una tra Password, File chiave o Dati chiave.", + "feedback.provider.required-either-known-host-data": "È richiesto il file degli host conosciuti o i dati degli host conosciuti, ma non entrambi.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 o spazio di archiviazione compatibile", "feedback.provider.sftp-server": "Server SFTP", "feedback.provider.use-repository-token": "Utilizza token di archivio", @@ -281,6 +283,31 @@ "task.status.running.for": "Attività in esecuzione da", "task.status.started": "Avviata", "task.status.succeed.after": "Attività completata dopo", + "validation.password": "Parola d'ordine", + "validation.password-hint": "Inserire la password", + "validation.provider.external-ssh-command": "Avvia il comando SSH esterno senza password", + "validation.provider.external-ssh-command-hint": "Per impostazione predefinita Kopia si connette al server utilizzando il client SSH interno che supporta opzioni limitate. \nIn alternativa, può avviare un comando SSH esterno senza password, che supporta opzioni aggiuntive, ma generalmente è meno efficiente del client integrato.", + "validation.provider.host": "Ospite", + "validation.provider.host-hint": "nome host ssh (ad esempio, example.com)", + "validation.provider.key-data": "Dati chiave", + "validation.provider.key-data-hint": "Incolla il contenuto del file chiave", + "validation.provider.known-host-data": "Dati degli host conosciuti", + "validation.provider.known-host-data-hint": "Incolla il contenuto del fileknown_hosts", + "validation.provider.path": "Sentiero", + "validation.provider.path-hint": "Inserisci il percorso remoto del repository, ad esempio \"/mnt/data/repository\"", + "validation.provider.path-host-file": "Percorso del fileknown_hosts", + "validation.provider.path-host-file-hint": "Inserisci il percorso del fileknown_hosts", + "validation.provider.path-key-file": "Percorso del file chiave", + "validation.provider.path-key-file-hint": "Immettere il percorso del file chiave", + "validation.provider.port": "Porta", + "validation.provider.port-hint": "Numero di porta (ad esempio, 22)", + "validation.provider.ssh-arguments": "Argomenti SSH", + "validation.provider.ssh-arguments-hint": "Inserisci gli argomenti del comando SSH ('user@host -s sftp' verrà aggiunto automaticamente)", + "validation.provider.ssh-command": "Comando SSH", + "validation.provider.ssh-command-hint": "Fornire il comando SSH senza password da eseguire (in genere 'ssh')", + "validation.provider.user": "Utente", + "validation.provider.user-hint": "Nome utente", + "value.algorithm.eco-disabled": "Disabilitato", "value.log.details-0-no-output": "0 - nessuna uscita", "value.log.details-1-minimal-details": "1 - dettagli minimi", "value.log.details-10-maximum-details": "10 - dettagli massimi", @@ -288,6 +315,8 @@ "value.log.details-inherit-from-parent": "(eredita dal genitore)", "value.provider.s3.http-connection-insecure": "Utilizza connessione HTTP (non sicura)", "value.provider.s3.no-tls-verification": "Non verificare il certificato TLS", + "value.repository.format.latest": "Ultimo formato", + "value.repository.format.legacy": "Formato legacy compatibile con v0.8", "value.ui.appearance-large": "grande", "value.ui.appearance-medium": "medio", "value.ui.appearance-small": "piccolo", diff --git a/public/locales/jp/translation.json b/public/locales/jp/translation.json index 0eb69042..97b4871e 100644 --- a/public/locales/jp/translation.json +++ b/public/locales/jp/translation.json @@ -43,6 +43,8 @@ "feedback.provider.kopia-repository-server": "Kopia Repository Server", "feedback.provider.local-directory-or-nas": "Local Directory or NAS", "feedback.provider.rclone-remote": "Rclone Remote", + "feedback.provider.required-either-key-file": "One of Password, Key File or Key Data is required.", + "feedback.provider.required-either-known-host-data": "Either Known Hosts File or Known Hosts Data is required, but not both.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 or Compatible Storage", "feedback.provider.sftp-server": "SFTP Server", "feedback.provider.use-repository-token": "Use Repository Token", @@ -281,6 +283,31 @@ "task.status.running.for": "タスク実行中", "task.status.started": "開始済み", "task.status.succeed.after": "タスクは成功しました。", + "validation.password": "Password", + "validation.password-hint": "Enter password", + "validation.provider.external-ssh-command": "Launch external password-less SSH command", + "validation.provider.external-ssh-command-hint": "By default Kopia connects to the server using internal SSH client which supports limited options. Alternatively it may launch external password-less SSH command, which supports additional options, but is generally less efficient than the built-in client.", + "validation.provider.host": "Host", + "validation.provider.host-hint": "ssh host name (e.g., example.com)", + "validation.provider.key-data": "Key Data", + "validation.provider.key-data-hint": "Paste contents of the key file", + "validation.provider.known-host-data": "Known Hosts Data", + "validation.provider.known-host-data-hint": "Paste the contents of the known_hosts file", + "validation.provider.path": "Path", + "validation.provider.path-hint": "Enter remote path to repository, e.g., '/mnt/data/repository'", + "validation.provider.path-host-file": "Path to known_hosts file", + "validation.provider.path-host-file-hint": "Enter path to the known_hosts file", + "validation.provider.path-key-file": "Path to key file", + "validation.provider.path-key-file-hint": "Enter path to the key file", + "validation.provider.port": "Port", + "validation.provider.port-hint": "Port number (e.g., 22)", + "validation.provider.ssh-arguments": "SSH Arguments", + "validation.provider.ssh-arguments-hint": "Enter SSH command arguments ('user@host -s sftp' will be appended automatically)", + "validation.provider.ssh-command": "SSH Command", + "validation.provider.ssh-command-hint": "Provide the passwordless SSH command to execute (typically 'ssh')", + "validation.provider.user": "User", + "validation.provider.user-hint": "User name", + "value.algorithm.eco-disabled": "Disabled", "value.log.details-0-no-output": "0 - no output", "value.log.details-1-minimal-details": "1 - minimal details", "value.log.details-10-maximum-details": "10 - maximum details", @@ -288,6 +315,8 @@ "value.log.details-inherit-from-parent": "(inherit from parent)", "value.provider.s3.http-connection-insecure": "Use HTTP connection (insecure)", "value.provider.s3.no-tls-verification": "Do not verify TLS certificate", + "value.repository.format.latest": "Latest format", + "value.repository.format.legacy": "Legacy format compatible with v0.8", "value.ui.appearance-large": "大", "value.ui.appearance-medium": "中", "value.ui.appearance-small": "小", diff --git a/public/locales/pl/translation.json b/public/locales/pl/translation.json index 98ce9cd0..5421e414 100644 --- a/public/locales/pl/translation.json +++ b/public/locales/pl/translation.json @@ -43,6 +43,8 @@ "feedback.provider.kopia-repository-server": "Serwer repozytorium Kopia", "feedback.provider.local-directory-or-nas": "Katalog lokalny lub NAS", "feedback.provider.rclone-remote": "Pilot zdalnego sterowania", + "feedback.provider.required-either-key-file": "Wymagane jest jedno z Hasło, Plik klucza lub Kluczowe dane.", + "feedback.provider.required-either-known-host-data": "Wymagany jest plik znanych hostów lub dane znanych hostów, ale nie oba.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 lub kompatybilna pamięć masowa", "feedback.provider.sftp-server": "Serwer SFTP", "feedback.provider.use-repository-token": "Użyj tokena repozytorium", @@ -281,6 +283,31 @@ "task.status.running.for": "Zadanie w toku od", "task.status.started": "Rozpoczęte", "task.status.succeed.after": "Zadanie zakończone po", + "validation.password": "Hasło", + "validation.password-hint": "Wprowadź hasło", + "validation.provider.external-ssh-command": "Uruchom zewnętrzne polecenie SSH bez hasła", + "validation.provider.external-ssh-command-hint": "Domyślnie Kopia łączy się z serwerem za pomocą wewnętrznego klienta SSH, który obsługuje ograniczone opcje. \nAlternatywnie może uruchomić zewnętrzne polecenie SSH bez hasła, które obsługuje dodatkowe opcje, ale jest generalnie mniej wydajne niż wbudowany klient.", + "validation.provider.host": "Gospodarz", + "validation.provider.host-hint": "nazwa hosta ssh (np. przykład.com)", + "validation.provider.key-data": "Kluczowe dane", + "validation.provider.key-data-hint": "Wklej zawartość pliku klucza", + "validation.provider.known-host-data": "Znane dane hostów", + "validation.provider.known-host-data-hint": "Wklej zawartość pliku znane_hosty", + "validation.provider.path": "Ścieżka", + "validation.provider.path-hint": "Wprowadź zdalną ścieżkę do repozytorium, np. „/mnt/data/repository”", + "validation.provider.path-host-file": "Ścieżka do pliku znane_hosty", + "validation.provider.path-host-file-hint": "Wprowadź ścieżkę do pliku znane_hosty", + "validation.provider.path-key-file": "Ścieżka do pliku klucza", + "validation.provider.path-key-file-hint": "Wprowadź ścieżkę do pliku klucza", + "validation.provider.port": "Port", + "validation.provider.port-hint": "Numer portu (np. 22)", + "validation.provider.ssh-arguments": "Argumenty SSH", + "validation.provider.ssh-arguments-hint": "Wprowadź argumenty polecenia SSH („użytkownik@host -s sftp” zostanie dodany automatycznie)", + "validation.provider.ssh-command": "Polecenie SSH", + "validation.provider.ssh-command-hint": "Podaj polecenie SSH bez hasła do wykonania (zwykle „ssh”)", + "validation.provider.user": "Użytkownik", + "validation.provider.user-hint": "Nazwa użytkownika", + "value.algorithm.eco-disabled": "Wyłączony", "value.log.details-0-no-output": "0 - brak wyjścia", "value.log.details-1-minimal-details": "1 - minimalne szczegóły", "value.log.details-10-maximum-details": "10 - maksimum szczegółów", @@ -288,6 +315,8 @@ "value.log.details-inherit-from-parent": "(dziedzicz po rodzicu)", "value.provider.s3.http-connection-insecure": "Użyj połączenia HTTP (niepewne)", "value.provider.s3.no-tls-verification": "Nie weryfikuj certyfikatu TLS", + "value.repository.format.latest": "Najnowszy format", + "value.repository.format.legacy": "Starszy format zgodny z wersją 0.8", "value.ui.appearance-large": "duża", "value.ui.appearance-medium": "średnia", "value.ui.appearance-small": "mała", diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index c28beccb..e45ca0b1 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -43,6 +43,8 @@ "feedback.provider.kopia-repository-server": "Сервер репозитория Копиа", "feedback.provider.local-directory-or-nas": "Локальный каталог или NAS", "feedback.provider.rclone-remote": "Rclone удаленный", + "feedback.provider.required-either-key-file": "Требуется один из Пароль, Ключевой файл или Ключевые данные.", + "feedback.provider.required-either-known-host-data": "Требуется либо Файл известных хостов, либо Данные известных хостов, но не оба одновременно.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 или совместимое хранилище", "feedback.provider.sftp-server": "SFTP-сервер", "feedback.provider.use-repository-token": "Использовать токен репозитория", @@ -281,6 +283,31 @@ "task.status.running.for": "Задача выполняется в течение", "task.status.started": "Начало", "task.status.succeed.after": "Задача успешно завершена после", + "validation.password": "Пароль", + "validation.password-hint": "Введите пароль", + "validation.provider.external-ssh-command": "Запустите внешнюю SSH-команду без пароля.", + "validation.provider.external-ssh-command-hint": "По умолчанию Kopia подключается к серверу с помощью внутреннего SSH-клиента, который поддерживает ограниченные возможности. \nВ качестве альтернативы он может запустить внешнюю команду SSH без пароля, которая поддерживает дополнительные параметры, но, как правило, менее эффективна, чем встроенный клиент.", + "validation.provider.host": "Хозяин", + "validation.provider.host-hint": "имя хоста ssh (например, example.com)", + "validation.provider.key-data": "Ключевые данные", + "validation.provider.key-data-hint": "Вставьте содержимое ключевого файла", + "validation.provider.known-host-data": "Данные об известных хостах", + "validation.provider.known-host-data-hint": "Вставьте содержимое файлаknown_hosts.", + "validation.provider.path": "Путь", + "validation.provider.path-hint": "Введите удаленный путь к репозиторию, например, «/mnt/data/repository».", + "validation.provider.path-host-file": "Путь к файлуknown_hosts", + "validation.provider.path-host-file-hint": "Введите путь к файлуknown_hosts", + "validation.provider.path-key-file": "Путь к ключевому файлу", + "validation.provider.path-key-file-hint": "Введите путь к файлу ключа", + "validation.provider.port": "Порт", + "validation.provider.port-hint": "Номер порта (например, 22)", + "validation.provider.ssh-arguments": "SSH-аргументы", + "validation.provider.ssh-arguments-hint": "Введите аргументы команды SSH (user@host -s sftp будет добавлен автоматически)", + "validation.provider.ssh-command": "SSH-команда", + "validation.provider.ssh-command-hint": "Предоставьте для выполнения команду SSH без пароля (обычно «ssh»).", + "validation.provider.user": "Пользователь", + "validation.provider.user-hint": "Имя пользователя", + "value.algorithm.eco-disabled": "Неполноценный", "value.log.details-0-no-output": "0 - нет вывода", "value.log.details-1-minimal-details": "1 - минимум деталей", "value.log.details-10-maximum-details": "10 - максимум деталей", @@ -288,6 +315,8 @@ "value.log.details-inherit-from-parent": "(наследовать от родителя)", "value.provider.s3.http-connection-insecure": "Использовать HTTP-соединение (небезопасно)", "value.provider.s3.no-tls-verification": "Не проверять сертификат TLS", + "value.repository.format.latest": "Последний формат", + "value.repository.format.legacy": "Устаревший формат, совместимый с версией 0.8.", "value.ui.appearance-large": "большой", "value.ui.appearance-medium": "средний", "value.ui.appearance-small": "маленький", diff --git a/src/components/SetupRepository.jsx b/src/components/SetupRepository.jsx index ac93a00b..c2e5fc70 100644 --- a/src/components/SetupRepository.jsx +++ b/src/components/SetupRepository.jsx @@ -364,7 +364,7 @@ export class SetupRepository extends Component { - Hash Algorithm + {i18n.t('repository.attribute.algorithm.hash')} - Splitter + {i18n.t('repository.attribute.algorithm.splitter')} - Repository Format + {i18n.t('repository.attribute.format')} - - + + - Error Correction Overhead + {i18n.t('repository.attribute.eco')} - + @@ -412,7 +412,7 @@ export class SetupRepository extends Component { - Error Correction Algorithm + {i18n.t('repository.attribute.algorithm.eco')} +
{RequiredField(this, i18n.t('feedback.validation.azure.storage-account'), "storageAccount", { placeholder: i18n.t('feedback.validation.azure.storage-account-hint') })} {OptionalField(this, i18n.t('feedback.validation.azure.access-key'), "storageKey", { placeholder: i18n.t('feedback.validation.azure.access-key-hint'), type: "password" })} +
{OptionalField(this, i18n.t('feedback.validation.azure.azure-storage-domain'), "storageDomain", { placeholder: i18n.t('feedback.validation.azure.azure-storage-domain-hint') })} {OptionalField(this, i18n.t('feedback.validation.azure.sas-token'), "sasToken", { placeholder: i18n.t('feedback.validation.azure.sas-token-hint'), type: "password" })} diff --git a/src/components/SetupRepositoryB2.jsx b/src/components/SetupRepositoryB2.jsx index b442bdb1..54460254 100644 --- a/src/components/SetupRepositoryB2.jsx +++ b/src/components/SetupRepositoryB2.jsx @@ -24,10 +24,12 @@ export class SetupRepositoryB2 extends Component { {RequiredField(this, i18n.t('feedback.validation.b2.bucket-name'), "bucket", { autoFocus: true, placeholder: i18n.t('feedback.validation.b2.bucket-name-hint') })} +
{RequiredField(this, i18n.t('feedback.validation.b2.key-id'), "keyId", { placeholder: i18n.t('feedback.validation.b2.key-id-hint') })} {RequiredField(this, i18n.t('feedback.validation.b2.key'), "key", { placeholder: i18n.t('feedback.validation.b2.key-hint'), type: "password" })} +
{OptionalField(this, i18n.t('feedback.validation.b2.object-name-prefix'), "prefix", { placeholder: i18n.t('feedback.validation.b2.object-name-prefix-hint') })} diff --git a/src/components/SetupRepositoryGCS.jsx b/src/components/SetupRepositoryGCS.jsx index b57b2fb2..e847a3c2 100644 --- a/src/components/SetupRepositoryGCS.jsx +++ b/src/components/SetupRepositoryGCS.jsx @@ -25,9 +25,11 @@ export class SetupRepositoryGCS extends Component { {RequiredField(this, i18n.t('feedback.validation.gcs.bucket-name'), "bucket", { autoFocus: true, placeholder: i18n.t('feedback.validation.gcs.bucket-name-hint') })} {OptionalField(this, i18n.t('feedback.validation.gcs.object-name-prefix'), "prefix", { placeholder: i18n.t('feedback.validation.gcs.object-name-prefix-hint'), type: "password" })}
+
{OptionalField(this, i18n.t('feedback.validation.gcs.credentials-file'), "credentialsFile", { placeholder: i18n.t('feedback.validation.gcs.credentials-file-hint') })} +
{OptionalField(this, i18n.t('feedback.validation.gcs.credentials-json'), "credentials", { placeholder: i18n.t('feedback.validation.gcs.credentials-json-paste'), as: "textarea", rows: 5 })} diff --git a/src/components/SetupRepositoryRclone.jsx b/src/components/SetupRepositoryRclone.jsx index d791a65e..ce17563c 100644 --- a/src/components/SetupRepositoryRclone.jsx +++ b/src/components/SetupRepositoryRclone.jsx @@ -24,6 +24,7 @@ export class SetupRepositoryRclone extends Component { {RequiredField(this, i18n.t('feedback.validation.rclone.rclone-remote-path'), "remotePath", { autoFocus: true, placeholder: i18n.t('feedback.validation.rclone.rclone-remote-path-hint') })} +
{OptionalField(this, i18n.t('feedback.validation.rclone.rclone-executable-path'), "rcloneExe", { placeholder: i18n.t('feedback.validation.rclone.rclone-executable-path-hint') })} diff --git a/src/components/SetupRepositoryS3.jsx b/src/components/SetupRepositoryS3.jsx index 96c28e39..50a122ab 100644 --- a/src/components/SetupRepositoryS3.jsx +++ b/src/components/SetupRepositoryS3.jsx @@ -29,15 +29,18 @@ export class SetupRepositoryS3 extends Component { {RequiredField(this, i18n.t('feedback.validation.s3.server-endpoint'), "endpoint", { placeholder: i18n.t('feedback.validation.s3.server-endpoint-hint') })} {OptionalField(this, i18n.t('feedback.validation.s3.override-region'), "region", { placeholder: i18n.t('feedback.validation.s3.override-region-hint') })}
+
{RequiredBoolean(this, i18n.t('value.provider.s3.http-connection-insecure'), "doNotUseTLS")} {RequiredBoolean(this, i18n.t('value.provider.s3.no-tls-verification'), "doNotVerifyTLS")} +
{RequiredField(this, i18n.t('feedback.validation.s3.access-key-id'), "accessKeyID", { placeholder: i18n.t('feedback.validation.s3.access-key-id-hint') })} {RequiredField(this, i18n.t('feedback.validation.s3.secret-access-key'), "secretAccessKey", { placeholder: i18n.t('feedback.validation.s3.secret-access-key-hint'), type: "password" })} {OptionalField(this, i18n.t('feedback.validation.s3.session-token'), "sessionToken", { placeholder: i18n.t('feedback.validation.s3.session-token-hint'), type: "password" })} +
{OptionalField(this, i18n.t('feedback.validation.s3.object-name-prefix'), "prefix", { placeholder: i18n.t('enter-object-name-prefix-or-leave-empty-hint') })} diff --git a/src/components/SetupRepositorySFTP.jsx b/src/components/SetupRepositorySFTP.jsx index 3f9a58b9..ca50684a 100644 --- a/src/components/SetupRepositorySFTP.jsx +++ b/src/components/SetupRepositorySFTP.jsx @@ -5,6 +5,8 @@ import { OptionalField } from '../forms/OptionalField'; import { OptionalNumberField } from '../forms/OptionalNumberField'; import { RequiredBoolean } from '../forms/RequiredBoolean'; import { RequiredField } from '../forms/RequiredField'; +import i18n from '../utils/i18n'; +import { Trans } from 'react-i18next'; function hasExactlyOneOf(component, names) { let count = 0; @@ -57,41 +59,46 @@ export class SetupRepositorySFTP extends Component { render() { return <> - {RequiredField(this, "Host", "host", { autoFocus: true, placeholder: "ssh host name (e.g., example.com)" })} - {RequiredField(this, "User", "username", { placeholder: "user name" })} - {OptionalNumberField(this, "Port", "port", { placeholder: "port number (e.g., 22)" })} + {RequiredField(this, i18n.t('validation.provider.host'), "host", { autoFocus: true, placeholder: i18n.t('validation.provider.host-hint') })} + {RequiredField(this, i18n.t('validation.provider.user'), "username", { placeholder: i18n.t('validation.provider.user-hint') })} + {OptionalNumberField(this, i18n.t('validation.provider.port'), "port", { placeholder: i18n.t('validation.provider.port-hint') })} +
- {RequiredField(this, "Path", "path", { placeholder: "enter remote path to repository, e.g., '/mnt/data/repository'" })} + {RequiredField(this, i18n.t('validation.provider.path'), "path", { placeholder: i18n.t('validation.provider.path-hint') })} +
{!this.state.externalSSH && <> - {OptionalField(this, "Password", "password", { type: "password", placeholder: "password" })} + {OptionalField(this, i18n.t('validation.password'), "password", { type: "password", placeholder: i18n.t('validation.password-hint') })} +
- {OptionalField(this, "Path to key file", "keyfile", { placeholder: "enter path to the key file" })} - {OptionalField(this, "Path to known_hosts File", "knownHostsFile", { placeholder: "enter path to the known_hosts file" })} + {OptionalField(this, i18n.t('validation.provider.path-key-file'), "keyfile", { placeholder: i18n.t('validation.provider.path-key-file-hint') })} + {OptionalField(this, i18n.t('validation.provider.path-host-file'), "knownHostsFile", { placeholder: i18n.t('validation.provider.path-host-file-hint') })} +
- {OptionalField(this, "Key Data", "keyData", { - placeholder: "paste contents of the key file", + {OptionalField(this, i18n.t('validation.provider.key-data'), "keyData", { + placeholder: i18n.t('validation.provider.key-data-hint'), as: "textarea", rows: 5, isInvalid: this.state.validated && !this.state.externalSSH && !hasExactlyOneOf(this, ["password", "keyfile", "keyData"]), - }, null, <>One of Password, Key File or Key Data is required.)} - {OptionalField(this, "Known Hosts Data", "knownHostsData", { - placeholder: "paste contents of the known_hosts file", + }, )} + {OptionalField(this, i18n.t('validation.provider.known-host-data'), "knownHostsData", { + placeholder: i18n.t('validation.provider.known-host-data-hint'), as: "textarea", rows: 5, isInvalid: this.state.validated && !this.state.externalSSH && !hasExactlyOneOf(this, ["knownHostsFile", "knownHostsData"]), - }, null, <>Either Known Hosts File or Known Hosts Data is required, but not both.)} + }, )} -
+
} - {RequiredBoolean(this, "Launch external password-less SSH command", "externalSSH", "By default Kopia connects to the server using internal SSH client which supports limited options. Alternatively it may launch external password-less SSH command, which supports additional options, but is generally less efficient than the built-in client.")} + {RequiredBoolean(this, i18n.t('validation.provider.external-ssh-command'), "externalSSH", i18n.t('validation.provider.external-ssh-command-hint'))} +
{this.state.externalSSH && <> - {OptionalField(this, "SSH Command", "sshCommand", { placeholder: "provide enter passwordless SSH command to execute (typically 'ssh')" })} - {OptionalField(this, "SSH Arguments", "sshArguments", { placeholder: "enter SSH command arguments ('user@host -s sftp' will be appended automatically)" })} + {OptionalField(this, i18n.t('validation.provider.ssh-command'), "sshCommand", { placeholder: i18n.t('validation.provider.ssh-command-hint') })} + {OptionalField(this, i18n.t('validation.provider.ssh-arguments'), "sshArguments", { placeholder: i18n.t('validation.provider.ssh-arguments-hint') })} } ; diff --git a/src/components/SetupRepositoryServer.jsx b/src/components/SetupRepositoryServer.jsx index 05b7d3f9..24776b64 100644 --- a/src/components/SetupRepositoryServer.jsx +++ b/src/components/SetupRepositoryServer.jsx @@ -24,6 +24,7 @@ export class SetupRepositoryServer extends Component { {RequiredField(this, i18n.t('feedback.validation.repository-server.server-address'), "url", { autoFocus: true, placeholder: i18n.t('feedback.validation.repository-server.server-address-hint') })} +
{OptionalField(this, i18n.t('feedback.validation.repository-server.server-certificate-fingerprint'), "serverCertFingerprint", { placeholder: i18n.t('feedback.validation.repository-server.server-certificate-fingerprint-hint') })} diff --git a/src/components/SetupRepositoryWebDAV.jsx b/src/components/SetupRepositoryWebDAV.jsx index a0e47cc2..cd26c989 100644 --- a/src/components/SetupRepositoryWebDAV.jsx +++ b/src/components/SetupRepositoryWebDAV.jsx @@ -24,6 +24,7 @@ export class SetupRepositoryWebDAV extends Component { {RequiredField(this, i18n.t('feedback.validation.webdav.server-url'), "url", { autoFocus: true, placeholder: "http[s]://server:port/path" })} +
{OptionalField(this, i18n.t('feedback.validation.webdav.username'), "username", { placeholder: i18n.t('feedback.validation.webdav.username-hint') })} {OptionalField(this, i18n.t('feedback.validation.webdav.password'), "password", { placeholder: i18n.t('feedback.validation.webdav.password-hint'), type: "password" })} From 744bd4071736ad526e8e5d38b60ba5c4df262c83 Mon Sep 17 00:00:00 2001 From: lupusA Date: Sun, 24 Mar 2024 10:43:52 +0100 Subject: [PATCH 24/27] Further translating. Minor layout fixes. --- .vscode/settings.json | 7 +- public/locales/de/translation.json | 77 +++++++++++- public/locales/en/translation.json | 79 +++++++++++- public/locales/es/translation.json | 77 +++++++++++- public/locales/fr/translation.json | 77 +++++++++++- public/locales/it/translation.json | 77 +++++++++++- public/locales/jp/translation.json | 75 ++++++++++++ public/locales/pl/translation.json | 77 +++++++++++- public/locales/ru/translation.json | 75 ++++++++++++ .../policy-editor/ActionRowMode.jsx | 9 +- .../policy-editor/ActionRowTimeout.jsx | 3 +- src/components/policy-editor/PolicyEditor.jsx | 115 +++++++++--------- .../policy-editor/SectionHeaderRow.jsx | 5 +- src/css/App.css | 7 ++ 14 files changed, 688 insertions(+), 72 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d45150a4..08bec049 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -18,5 +18,10 @@ "feedback.task.estimate-results", "feedback.provider.required-either-known-host-data", "feedback.provider.required-either-key-file" - ] + ], + "i18n-ally.extract.ignoredByFiles": { + "src\\components\\policy-editor\\PolicyEditor.jsx": [ + "Do not cross filesystem boundaries when creating a snapshot" + ] + } } \ No newline at end of file diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 9052c012..5e1a30c1 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -28,6 +28,7 @@ "feedback.header.actions": "Aktionen", "feedback.header.defined": "Definiert", "feedback.header.directories": "Verzeichnisse", + "feedback.header.effective": "Angewandt", "feedback.header.files": "Dateien", "feedback.header.host": "Host", "feedback.header.modification-last": "Letzte Änderung", @@ -37,6 +38,75 @@ "feedback.header.username": "Nutzername", "feedback.pin.name": "Name des Pins", "feedback.pin.standard-text": "Nicht löschen", + "feedback.policy.command-mode-help": "Wesentlich (muss erfolgreich sein; Standardverhalten), optional (Fehler werden toleriert) oder asynchron (Kopia startet die Aktion, wartet aber nicht auf deren Abschluss)", + "feedback.policy.compression.compression-algorithm": "Komprimierungsalgorithmus", + "feedback.policy.compression.compression-algorithm-help": "Geben Sie den Komprimierungsalgorithmus an, der beim Erstellen von Snapshots von Dateien in diesem Verzeichnis und Unterverzeichnissen verwendet werden soll", + "feedback.policy.compression.maximal-file-size": "Maximale Dateigröße", + "feedback.policy.compression.maximal-file-size-help": "Dateien, deren Größe den angegebenen Wert überschreitet, werden nicht komprimiert", + "feedback.policy.compression.maximal-file-size-hint": "Maximale Dateigröße in Bytes", + "feedback.policy.compression.minimal-file-size": "Mindestdateigröße", + "feedback.policy.compression.minimal-file-size-help": "Dateien, die kleiner als der angegebene Wert sind, werden nicht komprimiert", + "feedback.policy.compression.minimal-file-size-hint": "Mindestdateigröße in Bytes", + "feedback.policy.compression.never-compress-extensions": "Keine Komprimierung von Datei-Erweiterungen", + "feedback.policy.compression.never-compress-extensions-help": "Die folgenden Dateierweiterungen, werden nicht kompromiert (eine Erweiterung pro Zeile)", + "feedback.policy.compression.never-compress-extensions-hint": "z.B. *.mp4", + "feedback.policy.compression.only-compress-extensions": "Komprimieren Sie nur Erweiterungen", + "feedback.policy.compression.only-compress-extensions-help": "Komprimieren Sie nur Dateien mit den folgenden Dateierweiterungen (eine Erweiterung pro Zeile)", + "feedback.policy.compression.only-compress-extensions-hint": "z.B. *.txt", + "feedback.policy.confirm-delete-policy": "Sind Sie sicher, dass Sie diese Richtlinie löschen möchten?", + "feedback.policy.defined-by-this-policy": "(Definiert durch diese Richtlinie)", + "feedback.policy.error-delete-policy": "Fehler beim Löschen der Richtlinie", + "feedback.policy.error-handling.ignore-directory-errors": "Verzeichnisfehler ignorieren", + "feedback.policy.error-handling.ignore-directory-errors-help": "Verzeichnislesefehler werden als nicht schwerwiegend behandelt.", + "feedback.policy.error-handling.ignore-file-errors": "Dateifehler ignorieren", + "feedback.policy.error-handling.ignore-file-errors-help": "Dateilesefehler werden als nicht schwerwiegend behandelt.", + "feedback.policy.error-handling.ignore-unknown-directories": "Unbekannte Verzeichniseinträge ignorieren", + "feedback.policy.error-handling.ignore-unknown-directories-help": "Nicht erkannte/nicht unterstützte Verzeichniseinträge werden als nicht schwerwiegende Fehler behandelt.", + "feedback.policy.error-saving-policy": "Fehler beim Speichern der Richtlinie", + "feedback.policy.files.ignore-files": "Dateien ignorieren", + "feedback.policy.files.ignore-files-hint": "z.B. /file.txt", + "feedback.policy.files.ignore-rule-files": "Regeldateien ignorieren", + "feedback.policy.files.ignore-rule-files-from-parent-directories": "Regeldateien aus übergeordneten Verzeichnissen ignorieren", + "feedback.policy.files.ignore-rule-files-from-parent-directories-help": "Wenn diese Option festgelegt ist, werden die Dateien, die Ignorierungsregeln angeben (.kopiaignore usw.), aus dem übergeordneten Verzeichnis ignoriert", + "feedback.policy.files.ignore-rule-files-help": "Liste zusätzlicher Dateien mit Ignorierregeln (jede Datei konfiguriert Ignorierungsregeln für das Verzeichnis und seine Unterverzeichnisse)", + "feedback.policy.files.ignore-rule-files-hint": "z.B. .kopiaignore", + "feedback.policy.files.ignore-rules-from-parent-directories": "Regeln aus übergeordneten Verzeichnissen ignorieren", + "feedback.policy.files.ignore-rules-from-parent-directories-help": "Wenn diese Option festgelegt ist, werden Ignorierregeln aus dem übergeordneten Verzeichnis ignoriert", + "feedback.policy.files.ignore-well-known-cache-directories": "Bekannte Cache-Verzeichnisse ignorieren", + "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignorieren Sie Verzeichnisse, die CACHEDIR.TAG und ähnliches enthalten", + "feedback.policy.files.scan-only-one-filesystem": "Scannen Sie nur ein Dateisystem", + "feedback.policy.files.scan-only-one-filesystem-help": "Überschreiten Sie beim Erstellen eines Snapshots keine Dateisystemgrenzen", + "feedback.policy.header.compression": "Kompression", + "feedback.policy.header.error-handling": "Fehlerbehandlung", + "feedback.policy.header.files": "Dateien", + "feedback.policy.header.folder-actions": "Ordneraktionen", + "feedback.policy.header.logging": "Protokollierung", + "feedback.policy.header.other": "Andere", + "feedback.policy.header.scheduling": "Terminplanung", + "feedback.policy.header.snapshot-action": "Snapshot-Aktionen", + "feedback.policy.header.snapshot-retention": "Snapshot-Aufbewahrung", + "feedback.policy.header.upload": "Hochladen", + "feedback.policy.retention.annual-snapshot-retain": "Jährlich", + "feedback.policy.retention.annual-snapshot-retain-help": "Wie viele jährliche Snapshots pro Quelle aufbewahrt werden sollen. \nDer neueste Snapshot jedes Kalenderjahres wird aufbewahrt", + "feedback.policy.retention.annual-snapshot-retain-hint": "Anzahl der jährlichen Schnappschüsse", + "feedback.policy.retention.daily-snapshot-retain": "Täglich", + "feedback.policy.retention.daily-snapshot-retain-help": "Gibt an, wie viele tägliche Snapshots pro Quelle aufbewahrt werden sollen. \nDer neueste Schnappschuss jedes Tages wird beibehalten", + "feedback.policy.retention.daily-snapshot-retain-hint": "Anzahl der täglichen Snapshots", + "feedback.policy.retention.hourly-snapshot-retain": "Stündlich", + "feedback.policy.retention.hourly-snapshot-retain-help": "Gibt an, wie viele stündliche Snapshots pro Quelle aufbewahrt werden sollen. \nDer neueste Snapshot jeder Stunde wird beibehalten", + "feedback.policy.retention.hourly-snapshot-retain-hint": "Anzahl der stündlichen Snapshots", + "feedback.policy.retention.ignore-identical-snapshots": "Ignorieren Sie identische Snapshots", + "feedback.policy.retention.ignore-identical-snapshots-help": "Speichern Sie KEINEN Snapshot, wenn keine Dateien geändert wurden", + "feedback.policy.retention.keep-latest-help": "Anzahl der neuesten Schnappschüsse", + "feedback.policy.retention.latest-snapshot-retain": "Neueste Schnappschüsse", + "feedback.policy.retention.latest-snapshot-retain-help": "Anzahl der aktuellsten Snapshots, die pro Quelle aufbewahrt werden sollen", + "feedback.policy.retention.monthly-snapshot-retain": "Monatlich", + "feedback.policy.retention.monthly-snapshot-retain-help": "Wie viele monatliche Snapshots pro Quelle aufbewahrt werden sollen. \nDer neueste Snapshot jedes Kalendermonats bleibt erhalten", + "feedback.policy.retention.monthly-snapshot-retain-hint": "Anzahl der monatlichen Snapshots", + "feedback.policy.retention.weekly-snapshot-retain": "Wöchentlich", + "feedback.policy.retention.weekly-snapshot-retain-help": "Gibt an, wie viele wöchentliche Snapshots pro Quelle aufbewahrt werden sollen. \nDer neueste Schnappschuss jeder Woche wird beibehalten", + "feedback.policy.retention.weekly-snapshot-retain-hint": "Anzahl der wöchentlichen Snapshots", + "feedback.policy.timeout-help": "Timeout in Sekunden, bevor Kopia den Prozess abbricht", "feedback.provider.azure-blob-storage": "Azure Blob Storage", "feedback.provider.backblaze-b2": "Backblaze B2", "feedback.provider.google-cloud-storage": "Google Cloud-Speicher", @@ -313,6 +383,11 @@ "value.log.details-10-maximum-details": "10 - maximale Details", "value.log.details-5-normal-details": "5 - normale Details", "value.log.details-inherit-from-parent": "(vom übergeordneten Element erben)", + "value.policy.async": "Asynchron ausführen, Fehler ignorieren", + "value.policy.essential": "Muss gelingen", + "value.policy.inherent-from-parent": "Vom Elternteil erben", + "value.policy.none": "keine Angabe", + "value.policy.optional": "Fehler ignorieren", "value.provider.s3.http-connection-insecure": "HTTP-Verbindung verwenden (unsicher)", "value.provider.s3.no-tls-verification": "TLS-Zertifikat nicht überprüfen", "value.repository.format.latest": "Neuestes Format", @@ -326,6 +401,6 @@ "value.ui.theme-light": "hell", "value.ui.theme-ocean": "ozeanisch", "value.ui.theme-pastel": "pastelfarbend", - "value.validation.optional-no": "NEIN", + "value.validation.optional-no": "nein", "value.validation.optional-yes": "Ja" } diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 51bc49df..575a3d0a 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -28,6 +28,7 @@ "feedback.header.actions": "Actions", "feedback.header.defined": "Defined", "feedback.header.directories": "Directories", + "feedback.header.effective": "Effective", "feedback.header.files": "Files", "feedback.header.host": "Host", "feedback.header.modification-last": "Last Modification", @@ -37,6 +38,75 @@ "feedback.header.username": "Username", "feedback.pin.name": "Name of the pin", "feedback.pin.standard-text": "do-not-delete", + "feedback.policy.command-mode-help": "Essential (must succeed; default behavior), optional (failures are tolerated), or async (Kopia will start the action but not wait for it to finish)", + "feedback.policy.compression.compression-algorithm": "Compression Algorithm", + "feedback.policy.compression.compression-algorithm-help": "Specify compression algorithm to use when snapshotting files in this directory and subdirectories", + "feedback.policy.compression.maximal-file-size": "Maximum file size", + "feedback.policy.compression.maximal-file-size-help": "Files whose size exceeds the provided value will not be compressed", + "feedback.policy.compression.maximal-file-size-hint": "Maximum file size in bytes", + "feedback.policy.compression.minimal-file-size": "Minimum File Size", + "feedback.policy.compression.minimal-file-size-help": "Files that are smaller than the provided value will not be compressed", + "feedback.policy.compression.minimal-file-size-hint": "minimum file size in bytes", + "feedback.policy.compression.never-compress-extensions": "Never compress extensions", + "feedback.policy.compression.never-compress-extensions-help": "Never compress the following file extensions (one extension per line)", + "feedback.policy.compression.never-compress-extensions-hint": "e.g. *.mp4", + "feedback.policy.compression.only-compress-extensions": "Only compress extensions", + "feedback.policy.compression.only-compress-extensions-help": "Only compress files with the following file extensions (one extension per line)", + "feedback.policy.compression.only-compress-extensions-hint": "e.g. *.txt", + "feedback.policy.confirm-delete-policy": "Are you sure you want to delete this policy?", + "feedback.policy.defined-by-this-policy": "(Defined by this policy)", + "feedback.policy.error-delete-policy": "Error deleting policy", + "feedback.policy.error-handling.ignore-directory-errors": "Ignore Directory Errors", + "feedback.policy.error-handling.ignore-directory-errors-help": "Treat directory read errors as non-fatal.", + "feedback.policy.error-handling.ignore-file-errors": "Ignore File Errors", + "feedback.policy.error-handling.ignore-file-errors-help": "Treat file read errors as non-fatal.", + "feedback.policy.error-handling.ignore-unknown-directories": "Ignore Unknown Directory Entries", + "feedback.policy.error-handling.ignore-unknown-directories-help": "Treat unrecognized/unsupported directory entries as non-fatal errors.", + "feedback.policy.error-saving-policy": "Error saving policy", + "feedback.policy.files.ignore-files": "Ignore Files", + "feedback.policy.files.ignore-files-hint": "e.g. /file.txt", + "feedback.policy.files.ignore-rule-files": "Ignore Rule Files", + "feedback.policy.files.ignore-rule-files-from-parent-directories": "Ignore Rule Files From Parent Directories", + "feedback.policy.files.ignore-rule-files-from-parent-directories-help": "When set, the files specifying ignore rules (.kopiaignore, etc.) from the parent directory are ignored", + "feedback.policy.files.ignore-rule-files-help": "List of additional files containing ignore rules (each file configures ignore rules for the directory and its subdirectories)", + "feedback.policy.files.ignore-rule-files-hint": "e.g. .kopiaignore", + "feedback.policy.files.ignore-rules-from-parent-directories": "Ignore Rules From Parent Directories", + "feedback.policy.files.ignore-rules-from-parent-directories-help": "When set, ignore rules from the parent directory are ignored", + "feedback.policy.files.ignore-well-known-cache-directories": "Ignore Well-Known Cache Directories", + "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignore directories containing CACHEDIR.TAG and similar", + "feedback.policy.files.scan-only-one-filesystem": "Scan only one filesystem", + "feedback.policy.files.scan-only-one-filesystem-help": "Do not cross filesystem boundaries when creating a snapshot", + "feedback.policy.header.compression": "Compression", + "feedback.policy.header.error-handling": "Error Handling", + "feedback.policy.header.files": "Files", + "feedback.policy.header.folder-actions": "Folder Actions", + "feedback.policy.header.logging": "Logging", + "feedback.policy.header.other": "Other", + "feedback.policy.header.scheduling": "Scheduling", + "feedback.policy.header.snapshot-action": "Snapshot Actions", + "feedback.policy.header.snapshot-retention": "Snapshot Retention", + "feedback.policy.header.upload": "Upload", + "feedback.policy.retention.annual-snapshot-retain": "Annual", + "feedback.policy.retention.annual-snapshot-retain-help": "How many annual snapshots to retain per source. The latest snapshot from each calendar year will be retained", + "feedback.policy.retention.annual-snapshot-retain-hint": "Number of annual snapshots", + "feedback.policy.retention.daily-snapshot-retain": "Daily", + "feedback.policy.retention.daily-snapshot-retain-help": "How many daily snapshots to retain per source. The latest snapshot from each day will be retained", + "feedback.policy.retention.daily-snapshot-retain-hint": "Number of daily snapshots", + "feedback.policy.retention.hourly-snapshot-retain": "Hourly", + "feedback.policy.retention.hourly-snapshot-retain-help": "How many hourly snapshots to retain per source. The latest snapshot from each hour will be retained", + "feedback.policy.retention.hourly-snapshot-retain-hint": "number of hourly snapshots", + "feedback.policy.retention.ignore-identical-snapshots": "Ignore Identical Snapshots", + "feedback.policy.retention.ignore-identical-snapshots-help": "Do NOT save a snapshot when no files have been changed", + "feedback.policy.retention.keep-latest-help": "number of latest snapshots", + "feedback.policy.retention.latest-snapshot-retain": "Latest Snapshots", + "feedback.policy.retention.latest-snapshot-retain-help": "Number of the most recent snapshots to retain per source", + "feedback.policy.retention.monthly-snapshot-retain": "Monthly", + "feedback.policy.retention.monthly-snapshot-retain-help": "How many monthly snapshots to retain per source. The latest snapshot from each calendar month will be retained", + "feedback.policy.retention.monthly-snapshot-retain-hint": "Number of monthly snapshots", + "feedback.policy.retention.weekly-snapshot-retain": "Weekly", + "feedback.policy.retention.weekly-snapshot-retain-help": "How many weekly snapshots to retain per source. The latest snapshot from each week will be retained", + "feedback.policy.retention.weekly-snapshot-retain-hint": "Number of weekly snapshots", + "feedback.policy.timeout-help": "Timeout in seconds before Kopia kills the process", "feedback.provider.azure-blob-storage": "Azure Blob Storage", "feedback.provider.backblaze-b2": "Backblaze B2", "feedback.provider.google-cloud-storage": "Google Cloud Storage", @@ -44,6 +114,7 @@ "feedback.provider.local-directory-or-nas": "Local Directory or NAS", "feedback.provider.rclone-remote": "Rclone Remote", "feedback.provider.required-either-key-file": "One of Password, Key File or Key Data is required.", + "feedback.provider.required-either-known-host-data": "Either Known Hosts File or Known Hosts Data is required, but not both.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 or Compatible Storage", "feedback.provider.sftp-server": "SFTP Server", "feedback.provider.use-repository-token": "Use Repository Token", @@ -312,6 +383,11 @@ "value.log.details-10-maximum-details": "10 - maximum details", "value.log.details-5-normal-details": "5 - normal details", "value.log.details-inherit-from-parent": "(inherit from parent)", + "value.policy.async": "Run asynchronously, ignore failures", + "value.policy.essential": "Must succeed", + "value.policy.inherent-from-parent": "inherit from parent", + "value.policy.none": "none", + "value.policy.optional": "Ignore failures", "value.provider.s3.http-connection-insecure": "Use HTTP connection (insecure)", "value.provider.s3.no-tls-verification": "Do not verify TLS certificate", "value.repository.format.latest": "Latest format", @@ -326,6 +402,5 @@ "value.ui.theme-ocean": "ocean", "value.ui.theme-pastel": "pastel", "value.validation.optional-no": "no", - "value.validation.optional-yes": "yes", - "feedback.provider.required-either-known-host-data": "Either Known Hosts File or Known Hosts Data is required, but not both." + "value.validation.optional-yes": "yes" } diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 1a776551..d1e6c2c5 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -28,6 +28,7 @@ "feedback.header.actions": "Comportamiento", "feedback.header.defined": "Definido", "feedback.header.directories": "Directorios", + "feedback.header.effective": "Eficaz", "feedback.header.files": "Archivos", "feedback.header.host": "Anfitrión", "feedback.header.modification-last": "Última modificación", @@ -37,6 +38,75 @@ "feedback.header.username": "Nombre de usuario", "feedback.pin.name": "nombre del pin", "feedback.pin.standard-text": "no borres", + "feedback.policy.command-mode-help": "Esencial (debe tener éxito; comportamiento predeterminado), opcional (se toleran los errores) o asíncrono (Kopia iniciará la acción pero no esperará a que finalice)", + "feedback.policy.compression.compression-algorithm": "Algoritmo de compresión", + "feedback.policy.compression.compression-algorithm-help": "Especifique el algoritmo de compresión que se utilizará al tomar instantáneas de archivos en este directorio y subdirectorios.", + "feedback.policy.compression.maximal-file-size": "Tamaño máximo de archivo", + "feedback.policy.compression.maximal-file-size-help": "Los archivos cuyo tamaño exceda el valor proporcionado no se comprimirán", + "feedback.policy.compression.maximal-file-size-hint": "Tamaño máximo de archivo en bytes", + "feedback.policy.compression.minimal-file-size": "Tamaño mínimo de archivo", + "feedback.policy.compression.minimal-file-size-help": "Los archivos que sean más pequeños que el valor proporcionado no se comprimirán", + "feedback.policy.compression.minimal-file-size-hint": "tamaño mínimo de archivo en bytes", + "feedback.policy.compression.never-compress-extensions": "Nunca comprimir extensiones", + "feedback.policy.compression.never-compress-extensions-help": "Nunca comprima las siguientes extensiones de archivo (una extensión por línea)", + "feedback.policy.compression.never-compress-extensions-hint": "p.ej. *.mp4", + "feedback.policy.compression.only-compress-extensions": "Solo comprimir extensiones", + "feedback.policy.compression.only-compress-extensions-help": "Comprima únicamente archivos con las siguientes extensiones de archivo (una extensión por línea)", + "feedback.policy.compression.only-compress-extensions-hint": "p.ej. *.txt", + "feedback.policy.confirm-delete-policy": "¿Está seguro de que desea eliminar esta política?", + "feedback.policy.defined-by-this-policy": "(Definido por esta política)", + "feedback.policy.error-delete-policy": "Error al eliminar la política", + "feedback.policy.error-handling.ignore-directory-errors": "Ignorar errores de directorio", + "feedback.policy.error-handling.ignore-directory-errors-help": "Trate los errores de lectura de directorio como no fatales.", + "feedback.policy.error-handling.ignore-file-errors": "Ignorar errores de archivos", + "feedback.policy.error-handling.ignore-file-errors-help": "Trate los errores de lectura de archivos como no fatales.", + "feedback.policy.error-handling.ignore-unknown-directories": "Ignorar entradas de directorio desconocidas", + "feedback.policy.error-handling.ignore-unknown-directories-help": "Trate las entradas de directorio no reconocidas/no admitidas como errores no fatales.", + "feedback.policy.error-saving-policy": "Error al guardar la política", + "feedback.policy.files.ignore-files": "Ignorar archivos", + "feedback.policy.files.ignore-files-hint": "p.ej. /archivo.txt", + "feedback.policy.files.ignore-rule-files": "Ignorar archivos de reglas", + "feedback.policy.files.ignore-rule-files-from-parent-directories": "Ignorar archivos de reglas de directorios principales", + "feedback.policy.files.ignore-rule-files-from-parent-directories-help": "Cuando se establece, los archivos que especifican reglas de ignorar (.kopiaignore, etc.) del directorio principal se ignoran", + "feedback.policy.files.ignore-rule-files-help": "Lista de archivos adicionales que contienen reglas de ignorar (cada archivo configura reglas de ignorar para el directorio y sus subdirectorios)", + "feedback.policy.files.ignore-rule-files-hint": "p.ej. .kopiaignore", + "feedback.policy.files.ignore-rules-from-parent-directories": "Ignorar reglas de directorios principales", + "feedback.policy.files.ignore-rules-from-parent-directories-help": "Cuando se establece, se ignoran las reglas de ignorar del directorio principal.", + "feedback.policy.files.ignore-well-known-cache-directories": "Ignorar directorios de caché conocidos", + "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignorar directorios que contengan CACHEDIR.TAG y similares", + "feedback.policy.files.scan-only-one-filesystem": "Escanea solo un sistema de archivos", + "feedback.policy.files.scan-only-one-filesystem-help": "No cruce los límites del sistema de archivos al crear una instantánea", + "feedback.policy.header.compression": "Compresión", + "feedback.policy.header.error-handling": "Manejo de errores", + "feedback.policy.header.files": "Archivos", + "feedback.policy.header.folder-actions": "Acciones de carpeta", + "feedback.policy.header.logging": "Inicio sesión", + "feedback.policy.header.other": "Otro", + "feedback.policy.header.scheduling": "Planificación", + "feedback.policy.header.snapshot-action": "Acciones de instantáneas", + "feedback.policy.header.snapshot-retention": "Retención de instantáneas", + "feedback.policy.header.upload": "Subir", + "feedback.policy.retention.annual-snapshot-retain": "Anual", + "feedback.policy.retention.annual-snapshot-retain-help": "Cuántas instantáneas anuales conservar por fuente. \nSe conservará la última instantánea de cada año calendario.", + "feedback.policy.retention.annual-snapshot-retain-hint": "Número de instantáneas anuales", + "feedback.policy.retention.daily-snapshot-retain": "A diario", + "feedback.policy.retention.daily-snapshot-retain-help": "Cuántas instantáneas diarias conservar por fuente. \nSe conservará la última instantánea de cada día.", + "feedback.policy.retention.daily-snapshot-retain-hint": "Número de instantáneas diarias", + "feedback.policy.retention.hourly-snapshot-retain": "Cada hora", + "feedback.policy.retention.hourly-snapshot-retain-help": "Cuántas instantáneas por hora conservar por fuente. \nSe conservará la última instantánea de cada hora.", + "feedback.policy.retention.hourly-snapshot-retain-hint": "número de instantáneas por hora", + "feedback.policy.retention.ignore-identical-snapshots": "Ignorar instantáneas idénticas", + "feedback.policy.retention.ignore-identical-snapshots-help": "NO guarde una instantánea cuando no se hayan modificado archivos", + "feedback.policy.retention.keep-latest-help": "número de instantáneas más recientes", + "feedback.policy.retention.latest-snapshot-retain": "Últimas instantáneas", + "feedback.policy.retention.latest-snapshot-retain-help": "Número de instantáneas más recientes para conservar por fuente", + "feedback.policy.retention.monthly-snapshot-retain": "Mensual", + "feedback.policy.retention.monthly-snapshot-retain-help": "Cuántas instantáneas mensuales conservar por fuente. \nSe conservará la última instantánea de cada mes calendario.", + "feedback.policy.retention.monthly-snapshot-retain-hint": "Número de instantáneas mensuales", + "feedback.policy.retention.weekly-snapshot-retain": "Semanalmente", + "feedback.policy.retention.weekly-snapshot-retain-help": "Cuántas instantáneas semanales conservar por fuente. \nSe conservará la última instantánea de cada semana.", + "feedback.policy.retention.weekly-snapshot-retain-hint": "Número de instantáneas semanales", + "feedback.policy.timeout-help": "Tiempo de espera en segundos antes de que Kopia finalice el proceso", "feedback.provider.azure-blob-storage": "Almacenamiento de blobs de Azure", "feedback.provider.backblaze-b2": "Resplandor B2", "feedback.provider.google-cloud-storage": "Almacenamiento en la nube de Google", @@ -313,6 +383,11 @@ "value.log.details-10-maximum-details": "10 - detalles máximos", "value.log.details-5-normal-details": "5 - detalles normales", "value.log.details-inherit-from-parent": "(heredado de los padres)", + "value.policy.async": "Ejecutar de forma asíncrona, ignorar los fallos", + "value.policy.essential": "debe tener éxito", + "value.policy.inherent-from-parent": "heredar de los padres", + "value.policy.none": "ninguno", + "value.policy.optional": "ignorar los fracasos", "value.provider.s3.http-connection-insecure": "Usar conexión HTTP (insegura)", "value.provider.s3.no-tls-verification": "No verificar el certificado TLS", "value.repository.format.latest": "Último formato", @@ -326,6 +401,6 @@ "value.ui.theme-light": "claro", "value.ui.theme-ocean": "oceánico", "value.ui.theme-pastel": "pastel", - "value.validation.optional-no": "No", + "value.validation.optional-no": "no", "value.validation.optional-yes": "Sí" } diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index a0feaf14..098929fd 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -28,6 +28,7 @@ "feedback.header.actions": "Actions", "feedback.header.defined": "Défini", "feedback.header.directories": "Annuaires", + "feedback.header.effective": "Efficace", "feedback.header.files": "Des dossiers", "feedback.header.host": "Hôte", "feedback.header.modification-last": "Dernière modification", @@ -37,6 +38,75 @@ "feedback.header.username": "Nom d'utilisateur", "feedback.pin.name": "Nom de la broche", "feedback.pin.standard-text": "ne pas supprimer", + "feedback.policy.command-mode-help": "Essentiel (doit réussir ; comportement par défaut), facultatif (les échecs sont tolérés) ou asynchrone (Kopia démarrera l'action mais n'attendra pas qu'elle se termine)", + "feedback.policy.compression.compression-algorithm": "Algorithme de compression", + "feedback.policy.compression.compression-algorithm-help": "Spécifiez l'algorithme de compression à utiliser lors de la capture instantanée des fichiers dans ce répertoire et ses sous-répertoires.", + "feedback.policy.compression.maximal-file-size": "Taille maximale du fichier", + "feedback.policy.compression.maximal-file-size-help": "Les fichiers dont la taille dépasse la valeur fournie ne seront pas compressés", + "feedback.policy.compression.maximal-file-size-hint": "Taille maximale du fichier en octets", + "feedback.policy.compression.minimal-file-size": "Taille minimale du fichier", + "feedback.policy.compression.minimal-file-size-help": "Les fichiers plus petits que la valeur fournie ne seront pas compressés", + "feedback.policy.compression.minimal-file-size-hint": "taille minimale du fichier en octets", + "feedback.policy.compression.never-compress-extensions": "Ne compressez jamais les extensions", + "feedback.policy.compression.never-compress-extensions-help": "Ne compressez jamais les extensions de fichiers suivantes (une extension par ligne)", + "feedback.policy.compression.never-compress-extensions-hint": "par exemple. *.mp4", + "feedback.policy.compression.only-compress-extensions": "Compresser uniquement les extensions", + "feedback.policy.compression.only-compress-extensions-help": "Compressez uniquement les fichiers avec les extensions de fichiers suivantes (une extension par ligne)", + "feedback.policy.compression.only-compress-extensions-hint": "par exemple. *.txt", + "feedback.policy.confirm-delete-policy": "Êtes-vous sûr de vouloir supprimer cette stratégie ?", + "feedback.policy.defined-by-this-policy": "(Défini par cette politique)", + "feedback.policy.error-delete-policy": "Erreur lors de la suppression de la stratégie", + "feedback.policy.error-handling.ignore-directory-errors": "Ignorer les erreurs de répertoire", + "feedback.policy.error-handling.ignore-directory-errors-help": "Traitez les erreurs de lecture de répertoire comme non fatales.", + "feedback.policy.error-handling.ignore-file-errors": "Ignorer les erreurs de fichiers", + "feedback.policy.error-handling.ignore-file-errors-help": "Traitez les erreurs de lecture de fichiers comme non fatales.", + "feedback.policy.error-handling.ignore-unknown-directories": "Ignorer les entrées de répertoire inconnues", + "feedback.policy.error-handling.ignore-unknown-directories-help": "Traitez les entrées de répertoire non reconnues/non prises en charge comme des erreurs non fatales.", + "feedback.policy.error-saving-policy": "Politique d'enregistrement des erreurs", + "feedback.policy.files.ignore-files": "Ignorer les fichiers", + "feedback.policy.files.ignore-files-hint": "par exemple. /fichier.txt", + "feedback.policy.files.ignore-rule-files": "Ignorer les fichiers de règles", + "feedback.policy.files.ignore-rule-files-from-parent-directories": "Ignorer les fichiers de règles des répertoires parents", + "feedback.policy.files.ignore-rule-files-from-parent-directories-help": "Lorsqu'il est défini, les fichiers spécifiant les règles d'ignorer (.kopiaignore, etc.) du répertoire parent sont ignorés", + "feedback.policy.files.ignore-rule-files-help": "Liste de fichiers supplémentaires contenant des règles d'ignorance (chaque fichier configure les règles d'ignorance pour le répertoire et ses sous-répertoires)", + "feedback.policy.files.ignore-rule-files-hint": "par exemple. .kopiaignore", + "feedback.policy.files.ignore-rules-from-parent-directories": "Ignorer les règles des répertoires parents", + "feedback.policy.files.ignore-rules-from-parent-directories-help": "Lorsqu'elles sont définies, les règles d'ignorance du répertoire parent sont ignorées", + "feedback.policy.files.ignore-well-known-cache-directories": "Ignorer les répertoires de cache bien connus", + "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignorer les répertoires contenant CACHEDIR.TAG et similaires", + "feedback.policy.files.scan-only-one-filesystem": "Analyser un seul système de fichiers", + "feedback.policy.files.scan-only-one-filesystem-help": "Ne franchissez pas les limites du système de fichiers lors de la création d'un instantané", + "feedback.policy.header.compression": "Compression", + "feedback.policy.header.error-handling": "La gestion des erreurs", + "feedback.policy.header.files": "Des dossiers", + "feedback.policy.header.folder-actions": "Actions sur les dossiers", + "feedback.policy.header.logging": "Enregistrement", + "feedback.policy.header.other": "Autre", + "feedback.policy.header.scheduling": "Planification", + "feedback.policy.header.snapshot-action": "Actions d'instantané", + "feedback.policy.header.snapshot-retention": "Conservation des instantanés", + "feedback.policy.header.upload": "Télécharger", + "feedback.policy.retention.annual-snapshot-retain": "Annuel", + "feedback.policy.retention.annual-snapshot-retain-help": "Combien d’instantanés annuels conserver par source. \nLe dernier instantané de chaque année civile sera conservé", + "feedback.policy.retention.annual-snapshot-retain-hint": "Nombre d'instantanés annuels", + "feedback.policy.retention.daily-snapshot-retain": "Tous les jours", + "feedback.policy.retention.daily-snapshot-retain-help": "Combien d’instantanés quotidiens conserver par source. \nLe dernier instantané de chaque jour sera conservé", + "feedback.policy.retention.daily-snapshot-retain-hint": "Nombre d'instantanés quotidiens", + "feedback.policy.retention.hourly-snapshot-retain": "Horaire", + "feedback.policy.retention.hourly-snapshot-retain-help": "Combien d’instantanés horaires conserver par source. \nLe dernier instantané de chaque heure sera conservé", + "feedback.policy.retention.hourly-snapshot-retain-hint": "nombre d'instantanés horaires", + "feedback.policy.retention.ignore-identical-snapshots": "Ignorer les instantanés identiques", + "feedback.policy.retention.ignore-identical-snapshots-help": "Ne PAS enregistrer un instantané lorsqu'aucun fichier n'a été modifié", + "feedback.policy.retention.keep-latest-help": "nombre de derniers instantanés", + "feedback.policy.retention.latest-snapshot-retain": "Derniers instantanés", + "feedback.policy.retention.latest-snapshot-retain-help": "Nombre d'instantanés les plus récents à conserver par source", + "feedback.policy.retention.monthly-snapshot-retain": "Mensuel", + "feedback.policy.retention.monthly-snapshot-retain-help": "Combien d’instantanés mensuels conserver par source. \nLe dernier instantané de chaque mois civil sera conservé", + "feedback.policy.retention.monthly-snapshot-retain-hint": "Nombre d'instantanés mensuels", + "feedback.policy.retention.weekly-snapshot-retain": "Hebdomadaire", + "feedback.policy.retention.weekly-snapshot-retain-help": "Combien d’instantanés hebdomadaires conserver par source. \nLe dernier instantané de chaque semaine sera conservé", + "feedback.policy.retention.weekly-snapshot-retain-hint": "Nombre d'instantanés hebdomadaires", + "feedback.policy.timeout-help": "Délai d'attente en secondes avant que Kopia ne tue le processus", "feedback.provider.azure-blob-storage": "Stockage Blob Azure", "feedback.provider.backblaze-b2": "Backblaze B2", "feedback.provider.google-cloud-storage": "Stockage Google Cloud", @@ -313,6 +383,11 @@ "value.log.details-10-maximum-details": "10 - détails maximum", "value.log.details-5-normal-details": "5 - détails normaux", "value.log.details-inherit-from-parent": "(hériter du parent)", + "value.policy.async": "Exécutez de manière asynchrone, ignorez les échecs", + "value.policy.essential": "Doit réussir", + "value.policy.inherent-from-parent": "hériter du parent", + "value.policy.none": "aucun", + "value.policy.optional": "Ignorer les échecs", "value.provider.s3.http-connection-insecure": "Utiliser une connexion HTTP (non sécurisée)", "value.provider.s3.no-tls-verification": "Ne pas vérifier le certificat TLS", "value.repository.format.latest": "Dernier format", @@ -326,6 +401,6 @@ "value.ui.theme-light": "clair", "value.ui.theme-ocean": "océan", "value.ui.theme-pastel": "pastel", - "value.validation.optional-no": "Non", + "value.validation.optional-no": "non", "value.validation.optional-yes": "Oui" } diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index 470e8c48..6d6bd892 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -28,6 +28,7 @@ "feedback.header.actions": "Azioni", "feedback.header.defined": "Definito", "feedback.header.directories": "Directory", + "feedback.header.effective": "Efficace", "feedback.header.files": "File", "feedback.header.host": "Ospite", "feedback.header.modification-last": "Ultima modifica", @@ -37,6 +38,75 @@ "feedback.header.username": "Nome utente", "feedback.pin.name": "Nome del perno", "feedback.pin.standard-text": "non cancellare", + "feedback.policy.command-mode-help": "Essenziale (deve avere successo; comportamento predefinito), facoltativo (gli errori sono tollerati) o asincrono (Kopia avvierà l'azione ma non aspetterà che finisca)", + "feedback.policy.compression.compression-algorithm": "Algoritmo di compressione", + "feedback.policy.compression.compression-algorithm-help": "Specificare l'algoritmo di compressione da utilizzare durante lo snapshot dei file in questa directory e nelle sottodirectory", + "feedback.policy.compression.maximal-file-size": "Dimensione massima del file", + "feedback.policy.compression.maximal-file-size-help": "I file la cui dimensione supera il valore fornito non verranno compressi", + "feedback.policy.compression.maximal-file-size-hint": "Dimensione massima del file in byte", + "feedback.policy.compression.minimal-file-size": "Dimensione minima del file", + "feedback.policy.compression.minimal-file-size-help": "I file più piccoli del valore fornito non verranno compressi", + "feedback.policy.compression.minimal-file-size-hint": "dimensione minima del file in byte", + "feedback.policy.compression.never-compress-extensions": "Non comprimere mai le estensioni", + "feedback.policy.compression.never-compress-extensions-help": "Non comprimere mai le seguenti estensioni di file (un'estensione per riga)", + "feedback.policy.compression.never-compress-extensions-hint": "per esempio. *.mp4", + "feedback.policy.compression.only-compress-extensions": "Comprimi solo le estensioni", + "feedback.policy.compression.only-compress-extensions-help": "Comprimi solo file con le seguenti estensioni di file (un'estensione per riga)", + "feedback.policy.compression.only-compress-extensions-hint": "per esempio. *.txt", + "feedback.policy.confirm-delete-policy": "Sei sicuro di voler eliminare questa politica?", + "feedback.policy.defined-by-this-policy": "(Definito da questa politica)", + "feedback.policy.error-delete-policy": "Errore durante l'eliminazione della policy", + "feedback.policy.error-handling.ignore-directory-errors": "Ignora gli errori della directory", + "feedback.policy.error-handling.ignore-directory-errors-help": "Trattare gli errori di lettura della directory come non fatali.", + "feedback.policy.error-handling.ignore-file-errors": "Ignora gli errori dei file", + "feedback.policy.error-handling.ignore-file-errors-help": "Considera gli errori di lettura dei file come non fatali.", + "feedback.policy.error-handling.ignore-unknown-directories": "Ignora le voci della directory sconosciute", + "feedback.policy.error-handling.ignore-unknown-directories-help": "Trattare le voci di directory non riconosciute/non supportate come errori non irreversibili.", + "feedback.policy.error-saving-policy": "Errore durante il salvataggio della norma", + "feedback.policy.files.ignore-files": "Ignora file", + "feedback.policy.files.ignore-files-hint": "per esempio. /file.txt", + "feedback.policy.files.ignore-rule-files": "Ignora file di regole", + "feedback.policy.files.ignore-rule-files-from-parent-directories": "Ignora i file delle regole dalle directory principali", + "feedback.policy.files.ignore-rule-files-from-parent-directories-help": "Quando impostato, i file che specificano le regole di ignora (.kopiaignore, ecc.) dalla directory principale vengono ignorati", + "feedback.policy.files.ignore-rule-files-help": "Elenco di file aggiuntivi contenenti regole di ignoranza (ogni file configura le regole di ignoranza per la directory e le sue sottodirectory)", + "feedback.policy.files.ignore-rule-files-hint": "per esempio. .kopiaignore", + "feedback.policy.files.ignore-rules-from-parent-directories": "Ignora le regole delle directory principali", + "feedback.policy.files.ignore-rules-from-parent-directories-help": "Se impostato, le regole di ignora dalla directory principale vengono ignorate", + "feedback.policy.files.ignore-well-known-cache-directories": "Ignora le directory della cache ben note", + "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignorare le directory contenenti CACHEDIR.TAG e simili", + "feedback.policy.files.scan-only-one-filesystem": "Scansiona solo un filesystem", + "feedback.policy.files.scan-only-one-filesystem-help": "Non oltrepassare i limiti del file system durante la creazione di uno snapshot", + "feedback.policy.header.compression": "Compressione", + "feedback.policy.header.error-handling": "Gestione degli errori", + "feedback.policy.header.files": "File", + "feedback.policy.header.folder-actions": "Azioni delle cartelle", + "feedback.policy.header.logging": "Registrazione", + "feedback.policy.header.other": "Altro", + "feedback.policy.header.scheduling": "Pianificazione", + "feedback.policy.header.snapshot-action": "Azioni istantanee", + "feedback.policy.header.snapshot-retention": "Conservazione delle istantanee", + "feedback.policy.header.upload": "Caricamento", + "feedback.policy.retention.annual-snapshot-retain": "Annuale", + "feedback.policy.retention.annual-snapshot-retain-help": "Numero di snapshot annuali da conservare per origine. \nVerrà conservata l'ultima istantanea di ogni anno solare", + "feedback.policy.retention.annual-snapshot-retain-hint": "Numero di snapshot annuali", + "feedback.policy.retention.daily-snapshot-retain": "Quotidiano", + "feedback.policy.retention.daily-snapshot-retain-help": "Numero di snapshot giornalieri conservare per origine. \nVerrà conservata l'ultima istantanea di ogni giorno", + "feedback.policy.retention.daily-snapshot-retain-hint": "Numero di snapshot giornalieri", + "feedback.policy.retention.hourly-snapshot-retain": "Ogni ora", + "feedback.policy.retention.hourly-snapshot-retain-help": "Numero di snapshot orari da conservare per origine. \nVerrà conservata l'ultima istantanea di ogni ora", + "feedback.policy.retention.hourly-snapshot-retain-hint": "numero di snapshot orari", + "feedback.policy.retention.ignore-identical-snapshots": "Ignora istantanee identiche", + "feedback.policy.retention.ignore-identical-snapshots-help": "NON salvare un'istantanea quando nessun file è stato modificato", + "feedback.policy.retention.keep-latest-help": "numero di istantanee più recenti", + "feedback.policy.retention.latest-snapshot-retain": "Ultime istantanee", + "feedback.policy.retention.latest-snapshot-retain-help": "Numero degli snapshot più recenti da conservare per origine", + "feedback.policy.retention.monthly-snapshot-retain": "Mensile", + "feedback.policy.retention.monthly-snapshot-retain-help": "Quanti snapshot mensili conservare per origine. \nVerrà conservata l'ultima istantanea di ogni mese di calendario", + "feedback.policy.retention.monthly-snapshot-retain-hint": "Numero di snapshot mensili", + "feedback.policy.retention.weekly-snapshot-retain": "settimanalmente", + "feedback.policy.retention.weekly-snapshot-retain-help": "Numero di snapshot settimanali da conservare per origine. \nVerrà conservata l'ultima istantanea di ogni settimana", + "feedback.policy.retention.weekly-snapshot-retain-hint": "Numero di snapshot settimanali", + "feedback.policy.timeout-help": "Timeout in secondi prima che Kopia interrompa il processo", "feedback.provider.azure-blob-storage": "Archiviazione BLOB di Azure", "feedback.provider.backblaze-b2": "Backblaze B2", "feedback.provider.google-cloud-storage": "Archiviazione Google Cloud", @@ -313,6 +383,11 @@ "value.log.details-10-maximum-details": "10 - dettagli massimi", "value.log.details-5-normal-details": "5 - dettagli normali", "value.log.details-inherit-from-parent": "(eredita dal genitore)", + "value.policy.async": "Esegui in modo asincrono, ignora gli errori", + "value.policy.essential": "Deve avere successo", + "value.policy.inherent-from-parent": "ereditare dal genitore", + "value.policy.none": "nessuno", + "value.policy.optional": "Ignora i fallimenti", "value.provider.s3.http-connection-insecure": "Utilizza connessione HTTP (non sicura)", "value.provider.s3.no-tls-verification": "Non verificare il certificato TLS", "value.repository.format.latest": "Ultimo formato", @@ -326,6 +401,6 @@ "value.ui.theme-light": "chiaro", "value.ui.theme-ocean": "oceano", "value.ui.theme-pastel": "pastello", - "value.validation.optional-no": "NO", + "value.validation.optional-no": "no", "value.validation.optional-yes": "SÌ" } diff --git a/public/locales/jp/translation.json b/public/locales/jp/translation.json index 97b4871e..2ae05dd5 100644 --- a/public/locales/jp/translation.json +++ b/public/locales/jp/translation.json @@ -28,6 +28,7 @@ "feedback.header.actions": "Actions", "feedback.header.defined": "Defined", "feedback.header.directories": "Directories", + "feedback.header.effective": "Effective", "feedback.header.files": "Files", "feedback.header.host": "Host", "feedback.header.modification-last": "Last Modification", @@ -37,6 +38,75 @@ "feedback.header.username": "Username", "feedback.pin.name": "Name of the pin", "feedback.pin.standard-text": "do-not-delete", + "feedback.policy.command-mode-help": "Essential (must succeed; default behavior), optional (failures are tolerated), or async (Kopia will start the action but not wait for it to finish)", + "feedback.policy.compression.compression-algorithm": "Compression Algorithm", + "feedback.policy.compression.compression-algorithm-help": "Specify compression algorithm to use when snapshotting files in this directory and subdirectories", + "feedback.policy.compression.maximal-file-size": "Maximum file size", + "feedback.policy.compression.maximal-file-size-help": "Files whose size exceeds the provided value will not be compressed", + "feedback.policy.compression.maximal-file-size-hint": "Maximum file size in bytes", + "feedback.policy.compression.minimal-file-size": "Minimum File Size", + "feedback.policy.compression.minimal-file-size-help": "Files that are smaller than the provided value will not be compressed", + "feedback.policy.compression.minimal-file-size-hint": "minimum file size in bytes", + "feedback.policy.compression.never-compress-extensions": "Never compress extensions", + "feedback.policy.compression.never-compress-extensions-help": "Never compress the following file extensions (one extension per line)", + "feedback.policy.compression.never-compress-extensions-hint": "e.g. *.mp4", + "feedback.policy.compression.only-compress-extensions": "Only compress extensions", + "feedback.policy.compression.only-compress-extensions-help": "Only compress files with the following file extensions (one extension per line)", + "feedback.policy.compression.only-compress-extensions-hint": "e.g. *.txt", + "feedback.policy.confirm-delete-policy": "Are you sure you want to delete this policy?", + "feedback.policy.defined-by-this-policy": "(Defined by this policy)", + "feedback.policy.error-delete-policy": "Error deleting policy", + "feedback.policy.error-handling.ignore-directory-errors": "Ignore Directory Errors", + "feedback.policy.error-handling.ignore-directory-errors-help": "Treat directory read errors as non-fatal.", + "feedback.policy.error-handling.ignore-file-errors": "Ignore File Errors", + "feedback.policy.error-handling.ignore-file-errors-help": "Treat file read errors as non-fatal.", + "feedback.policy.error-handling.ignore-unknown-directories": "Ignore Unknown Directory Entries", + "feedback.policy.error-handling.ignore-unknown-directories-help": "Treat unrecognized/unsupported directory entries as non-fatal errors.", + "feedback.policy.error-saving-policy": "Error saving policy", + "feedback.policy.files.ignore-files": "Ignore Files", + "feedback.policy.files.ignore-files-hint": "e.g. /file.txt", + "feedback.policy.files.ignore-rule-files": "Ignore Rule Files", + "feedback.policy.files.ignore-rule-files-from-parent-directories": "Ignore Rule Files From Parent Directories", + "feedback.policy.files.ignore-rule-files-from-parent-directories-help": "When set, the files specifying ignore rules (.kopiaignore, etc.) from the parent directory are ignored", + "feedback.policy.files.ignore-rule-files-help": "List of additional files containing ignore rules (each file configures ignore rules for the directory and its subdirectories)", + "feedback.policy.files.ignore-rule-files-hint": "e.g. .kopiaignore", + "feedback.policy.files.ignore-rules-from-parent-directories": "Ignore Rules From Parent Directories", + "feedback.policy.files.ignore-rules-from-parent-directories-help": "When set, ignore rules from the parent directory are ignored", + "feedback.policy.files.ignore-well-known-cache-directories": "Ignore Well-Known Cache Directories", + "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignore directories containing CACHEDIR.TAG and similar", + "feedback.policy.files.scan-only-one-filesystem": "Scan only one filesystem", + "feedback.policy.files.scan-only-one-filesystem-help": "Do not cross filesystem boundaries when creating a snapshot", + "feedback.policy.header.compression": "Compression", + "feedback.policy.header.error-handling": "Error Handling", + "feedback.policy.header.files": "Files", + "feedback.policy.header.folder-actions": "Folder Actions", + "feedback.policy.header.logging": "Logging", + "feedback.policy.header.other": "Other", + "feedback.policy.header.scheduling": "Scheduling", + "feedback.policy.header.snapshot-action": "Snapshot Actions", + "feedback.policy.header.snapshot-retention": "Snapshot Retention", + "feedback.policy.header.upload": "Upload", + "feedback.policy.retention.annual-snapshot-retain": "Annual", + "feedback.policy.retention.annual-snapshot-retain-help": "How many annual snapshots to retain per source. The latest snapshot from each calendar year will be retained", + "feedback.policy.retention.annual-snapshot-retain-hint": "Number of annual snapshots", + "feedback.policy.retention.daily-snapshot-retain": "Daily", + "feedback.policy.retention.daily-snapshot-retain-help": "How many daily snapshots to retain per source. The latest snapshot from each day will be retained", + "feedback.policy.retention.daily-snapshot-retain-hint": "Number of daily snapshots", + "feedback.policy.retention.hourly-snapshot-retain": "Hourly", + "feedback.policy.retention.hourly-snapshot-retain-help": "How many hourly snapshots to retain per source. The latest snapshot from each hour will be retained", + "feedback.policy.retention.hourly-snapshot-retain-hint": "number of hourly snapshots", + "feedback.policy.retention.ignore-identical-snapshots": "Ignore Identical Snapshots", + "feedback.policy.retention.ignore-identical-snapshots-help": "Do NOT save a snapshot when no files have been changed", + "feedback.policy.retention.keep-latest-help": "number of latest snapshots", + "feedback.policy.retention.latest-snapshot-retain": "Latest Snapshots", + "feedback.policy.retention.latest-snapshot-retain-help": "Number of the most recent snapshots to retain per source", + "feedback.policy.retention.monthly-snapshot-retain": "Monthly", + "feedback.policy.retention.monthly-snapshot-retain-help": "How many monthly snapshots to retain per source. The latest snapshot from each calendar month will be retained", + "feedback.policy.retention.monthly-snapshot-retain-hint": "Number of monthly snapshots", + "feedback.policy.retention.weekly-snapshot-retain": "Weekly", + "feedback.policy.retention.weekly-snapshot-retain-help": "How many weekly snapshots to retain per source. The latest snapshot from each week will be retained", + "feedback.policy.retention.weekly-snapshot-retain-hint": "Number of weekly snapshots", + "feedback.policy.timeout-help": "Timeout in seconds before Kopia kills the process", "feedback.provider.azure-blob-storage": "Azure Blob Storage", "feedback.provider.backblaze-b2": "Backblaze B2", "feedback.provider.google-cloud-storage": "Google Cloud Storage", @@ -313,6 +383,11 @@ "value.log.details-10-maximum-details": "10 - maximum details", "value.log.details-5-normal-details": "5 - normal details", "value.log.details-inherit-from-parent": "(inherit from parent)", + "value.policy.async": "Run asynchronously, ignore failures", + "value.policy.essential": "Must succeed", + "value.policy.inherent-from-parent": "inherit from parent", + "value.policy.none": "none", + "value.policy.optional": "Ignore failures", "value.provider.s3.http-connection-insecure": "Use HTTP connection (insecure)", "value.provider.s3.no-tls-verification": "Do not verify TLS certificate", "value.repository.format.latest": "Latest format", diff --git a/public/locales/pl/translation.json b/public/locales/pl/translation.json index 5421e414..32a3f18c 100644 --- a/public/locales/pl/translation.json +++ b/public/locales/pl/translation.json @@ -28,6 +28,7 @@ "feedback.header.actions": "działania", "feedback.header.defined": "Zdefiniowane", "feedback.header.directories": "Katalogi", + "feedback.header.effective": "Skuteczny", "feedback.header.files": "Akta", "feedback.header.host": "Gospodarz", "feedback.header.modification-last": "Ostatnia modyfikacja", @@ -37,6 +38,75 @@ "feedback.header.username": "Nazwa użytkownika", "feedback.pin.name": "Nazwa pinu", "feedback.pin.standard-text": "nie kasuj", + "feedback.policy.command-mode-help": "Niezbędny (musi zakończyć się sukcesem; zachowanie domyślne), opcjonalny (awarie są tolerowane) lub asynchroniczny (Kopia rozpocznie akcję, ale nie będzie czekać na jej zakończenie)", + "feedback.policy.compression.compression-algorithm": "Algorytm kompresji", + "feedback.policy.compression.compression-algorithm-help": "Określ algorytm kompresji, który będzie używany podczas tworzenia migawek plików w tym katalogu i podkatalogach", + "feedback.policy.compression.maximal-file-size": "Maksymalny rozmiar pliku", + "feedback.policy.compression.maximal-file-size-help": "Pliki, których rozmiar przekracza podaną wartość, nie zostaną skompresowane", + "feedback.policy.compression.maximal-file-size-hint": "Maksymalny rozmiar pliku w bajtach", + "feedback.policy.compression.minimal-file-size": "Minimalny rozmiar pliku", + "feedback.policy.compression.minimal-file-size-help": "Pliki mniejsze niż podana wartość nie zostaną skompresowane", + "feedback.policy.compression.minimal-file-size-hint": "minimalny rozmiar pliku w bajtach", + "feedback.policy.compression.never-compress-extensions": "Nigdy nie kompresuj rozszerzeń", + "feedback.policy.compression.never-compress-extensions-help": "Nigdy nie kompresuj następujących rozszerzeń plików (jedno rozszerzenie w linii)", + "feedback.policy.compression.never-compress-extensions-hint": "np. *.mp4", + "feedback.policy.compression.only-compress-extensions": "Kompresuj tylko rozszerzenia", + "feedback.policy.compression.only-compress-extensions-help": "Kompresuj tylko pliki z następującymi rozszerzeniami (jedno rozszerzenie w linii)", + "feedback.policy.compression.only-compress-extensions-hint": "np. *.tekst", + "feedback.policy.confirm-delete-policy": "Czy na pewno chcesz usunąć tę politykę?", + "feedback.policy.defined-by-this-policy": "(Określone w tej polityce)", + "feedback.policy.error-delete-policy": "Błąd podczas usuwania zasady", + "feedback.policy.error-handling.ignore-directory-errors": "Ignoruj ​​​​błędy katalogu", + "feedback.policy.error-handling.ignore-directory-errors-help": "Traktuj błędy odczytu katalogu jako niekrytyczne.", + "feedback.policy.error-handling.ignore-file-errors": "Ignoruj ​​​​błędy plików", + "feedback.policy.error-handling.ignore-file-errors-help": "Traktuj błędy odczytu plików jako niekrytyczne.", + "feedback.policy.error-handling.ignore-unknown-directories": "Ignoruj ​​nieznane wpisy w katalogu", + "feedback.policy.error-handling.ignore-unknown-directories-help": "Traktuj nierozpoznane/nieobsługiwane wpisy katalogu jako błędy niekrytyczne.", + "feedback.policy.error-saving-policy": "Błąd podczas zapisywania zasad", + "feedback.policy.files.ignore-files": "Ignoruj ​​pliki", + "feedback.policy.files.ignore-files-hint": "np. /plik.txt", + "feedback.policy.files.ignore-rule-files": "Ignoruj ​​pliki reguł", + "feedback.policy.files.ignore-rule-files-from-parent-directories": "Ignoruj ​​pliki reguł z katalogów nadrzędnych", + "feedback.policy.files.ignore-rule-files-from-parent-directories-help": "Po ustawieniu, pliki określające reguły ignorowania (.kopiaignore itp.) z katalogu nadrzędnego są ignorowane", + "feedback.policy.files.ignore-rule-files-help": "Lista dodatkowych plików zawierających reguły ignorowania (każdy plik konfiguruje reguły ignorowania dla katalogu i jego podkatalogów)", + "feedback.policy.files.ignore-rule-files-hint": "np. .kopiaignore", + "feedback.policy.files.ignore-rules-from-parent-directories": "Ignoruj ​​reguły z katalogów nadrzędnych", + "feedback.policy.files.ignore-rules-from-parent-directories-help": "Po ustawieniu reguły ignorowania z katalogu nadrzędnego są ignorowane", + "feedback.policy.files.ignore-well-known-cache-directories": "Ignoruj ​​dobrze znane katalogi pamięci podręcznej", + "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignoruj ​​katalogi zawierające CACHEDIR.TAG i podobne", + "feedback.policy.files.scan-only-one-filesystem": "Skanuj tylko jeden system plików", + "feedback.policy.files.scan-only-one-filesystem-help": "Podczas tworzenia migawki nie przekraczaj granic systemu plików", + "feedback.policy.header.compression": "Kompresja", + "feedback.policy.header.error-handling": "Obsługa błędów", + "feedback.policy.header.files": "Akta", + "feedback.policy.header.folder-actions": "Akcje folderów", + "feedback.policy.header.logging": "Logowanie", + "feedback.policy.header.other": "Inny", + "feedback.policy.header.scheduling": "Planowanie", + "feedback.policy.header.snapshot-action": "Akcje migawki", + "feedback.policy.header.snapshot-retention": "Przechowywanie migawek", + "feedback.policy.header.upload": "Wgrywać", + "feedback.policy.retention.annual-snapshot-retain": "Coroczny", + "feedback.policy.retention.annual-snapshot-retain-help": "Liczba rocznych migawek przechowywanych dla każdego źródła. \nZachowana zostanie najnowsza migawka z każdego roku kalendarzowego", + "feedback.policy.retention.annual-snapshot-retain-hint": "Liczba rocznych migawek", + "feedback.policy.retention.daily-snapshot-retain": "Codziennie", + "feedback.policy.retention.daily-snapshot-retain-help": "Liczba codziennych migawek przechowywanych dla każdego źródła. \nNajnowsza migawka z każdego dnia zostanie zachowana", + "feedback.policy.retention.daily-snapshot-retain-hint": "Liczba codziennych migawek", + "feedback.policy.retention.hourly-snapshot-retain": "Cogodzinny", + "feedback.policy.retention.hourly-snapshot-retain-help": "Ile godzinnych migawek zachować na źródło. \nNajnowsza migawka z każdej godziny zostanie zachowana", + "feedback.policy.retention.hourly-snapshot-retain-hint": "liczba godzinnych migawek", + "feedback.policy.retention.ignore-identical-snapshots": "Ignoruj ​​identyczne migawki", + "feedback.policy.retention.ignore-identical-snapshots-help": "NIE zapisuj migawki, jeśli żadne pliki nie zostały zmienione", + "feedback.policy.retention.keep-latest-help": "liczba najnowszych migawek", + "feedback.policy.retention.latest-snapshot-retain": "Najnowsze migawki", + "feedback.policy.retention.latest-snapshot-retain-help": "Liczba najnowszych migawek do zachowania dla każdego źródła", + "feedback.policy.retention.monthly-snapshot-retain": "Miesięczny", + "feedback.policy.retention.monthly-snapshot-retain-help": "Liczba miesięcznych migawek przechowywanych dla każdego źródła. \nZachowana zostanie najnowsza migawka z każdego miesiąca kalendarzowego", + "feedback.policy.retention.monthly-snapshot-retain-hint": "Liczba miesięcznych migawek", + "feedback.policy.retention.weekly-snapshot-retain": "Co tydzień", + "feedback.policy.retention.weekly-snapshot-retain-help": "Liczba cotygodniowych migawek przechowywanych dla każdego źródła. \nNajnowsza migawka z każdego tygodnia zostanie zachowana", + "feedback.policy.retention.weekly-snapshot-retain-hint": "Liczba cotygodniowych migawek", + "feedback.policy.timeout-help": "Limit czasu w sekundach, zanim Kopia zabije proces", "feedback.provider.azure-blob-storage": "Magazyn obiektów Blob platformy Azure", "feedback.provider.backblaze-b2": "Blask wsteczny B2", "feedback.provider.google-cloud-storage": "Magazyn w chmurze Google", @@ -313,6 +383,11 @@ "value.log.details-10-maximum-details": "10 - maksimum szczegółów", "value.log.details-5-normal-details": "5 - normalne szczegóły", "value.log.details-inherit-from-parent": "(dziedzicz po rodzicu)", + "value.policy.async": "Uruchom asynchronicznie, ignoruj ​​awarie", + "value.policy.essential": "Musi się udać", + "value.policy.inherent-from-parent": "dziedziczyć od rodziców", + "value.policy.none": "nic", + "value.policy.optional": "Ignoruj ​​niepowodzenia", "value.provider.s3.http-connection-insecure": "Użyj połączenia HTTP (niepewne)", "value.provider.s3.no-tls-verification": "Nie weryfikuj certyfikatu TLS", "value.repository.format.latest": "Najnowszy format", @@ -326,6 +401,6 @@ "value.ui.theme-light": "jasna", "value.ui.theme-ocean": "oceaniczna", "value.ui.theme-pastel": "pastelowa", - "value.validation.optional-no": "NIE", + "value.validation.optional-no": "nie", "value.validation.optional-yes": "Tak" } diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index e45ca0b1..dda41116 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -28,6 +28,7 @@ "feedback.header.actions": "Действия", "feedback.header.defined": "Определенный", "feedback.header.directories": "Каталоги", + "feedback.header.effective": "Эффективный", "feedback.header.files": "Файлы", "feedback.header.host": "Хозяин", "feedback.header.modification-last": "Последнее изменение", @@ -37,6 +38,75 @@ "feedback.header.username": "Имя пользователя", "feedback.pin.name": "Название контакта", "feedback.pin.standard-text": "не удалять", + "feedback.policy.command-mode-help": "Необходимое (должно быть успешным; поведение по умолчанию), необязательное (сбои допускаются) или асинхронное (Kopia запускает действие, но не ждет его завершения).", + "feedback.policy.compression.compression-algorithm": "Алгоритм сжатия", + "feedback.policy.compression.compression-algorithm-help": "Укажите алгоритм сжатия, который будет использоваться при создании снимков файлов в этом каталоге и подкаталогах.", + "feedback.policy.compression.maximal-file-size": "Максимальный размер файла", + "feedback.policy.compression.maximal-file-size-help": "Файлы, размер которых превышает указанное значение, не будут сжаты.", + "feedback.policy.compression.maximal-file-size-hint": "Максимальный размер файла в байтах", + "feedback.policy.compression.minimal-file-size": "Минимальный размер файла", + "feedback.policy.compression.minimal-file-size-help": "Файлы размером меньше указанного значения не будут сжаты.", + "feedback.policy.compression.minimal-file-size-hint": "минимальный размер файла в байтах", + "feedback.policy.compression.never-compress-extensions": "Никогда не сжимайте расширения", + "feedback.policy.compression.never-compress-extensions-help": "Никогда не сжимайте следующие расширения файлов (по одному расширению в строке)", + "feedback.policy.compression.never-compress-extensions-hint": "например *.mp4", + "feedback.policy.compression.only-compress-extensions": "Сжимать только расширения", + "feedback.policy.compression.only-compress-extensions-help": "Сжимайте только файлы со следующими расширениями (по одному расширению в строке)", + "feedback.policy.compression.only-compress-extensions-hint": "например *.текст", + "feedback.policy.confirm-delete-policy": "Вы уверены, что хотите удалить эту политику?", + "feedback.policy.defined-by-this-policy": "(Определено настоящей политикой)", + "feedback.policy.error-delete-policy": "Ошибка удаления политики.", + "feedback.policy.error-handling.ignore-directory-errors": "Игнорировать ошибки каталога", + "feedback.policy.error-handling.ignore-directory-errors-help": "Считайте ошибки чтения каталога нефатальными.", + "feedback.policy.error-handling.ignore-file-errors": "Игнорировать ошибки файлов", + "feedback.policy.error-handling.ignore-file-errors-help": "Считайте ошибки чтения файлов нефатальными.", + "feedback.policy.error-handling.ignore-unknown-directories": "Игнорировать неизвестные записи каталога", + "feedback.policy.error-handling.ignore-unknown-directories-help": "Считайте нераспознанные/неподдерживаемые записи каталога нефатальными ошибками.", + "feedback.policy.error-saving-policy": "Ошибка сохранения политики.", + "feedback.policy.files.ignore-files": "Игнорировать файлы", + "feedback.policy.files.ignore-files-hint": "например /file.txt", + "feedback.policy.files.ignore-rule-files": "Игнорировать файлы правил", + "feedback.policy.files.ignore-rule-files-from-parent-directories": "Игнорировать файлы правил из родительских каталогов", + "feedback.policy.files.ignore-rule-files-from-parent-directories-help": "Если этот параметр установлен, файлы, определяющие правила игнорирования (.kopiaignore и т. д.), из родительского каталога игнорируются.", + "feedback.policy.files.ignore-rule-files-help": "Список дополнительных файлов, содержащих правила игнорирования (каждый файл настраивает правила игнорирования для каталога и его подкаталогов)", + "feedback.policy.files.ignore-rule-files-hint": "например .kopiaignore", + "feedback.policy.files.ignore-rules-from-parent-directories": "Игнорировать правила из родительских каталогов", + "feedback.policy.files.ignore-rules-from-parent-directories-help": "Если установлено, игнорируются правила из родительского каталога.", + "feedback.policy.files.ignore-well-known-cache-directories": "Игнорировать известные каталоги кэша", + "feedback.policy.files.ignore-well-known-cache-directories-help": "Игнорировать каталоги, содержащие CACHEDIR.TAG и подобные.", + "feedback.policy.files.scan-only-one-filesystem": "Сканировать только одну файловую систему", + "feedback.policy.files.scan-only-one-filesystem-help": "Не пересекайте границы файловой системы при создании моментального снимка.", + "feedback.policy.header.compression": "Сжатие", + "feedback.policy.header.error-handling": "Обработка ошибок", + "feedback.policy.header.files": "Файлы", + "feedback.policy.header.folder-actions": "Действия с папками", + "feedback.policy.header.logging": "Ведение журнала", + "feedback.policy.header.other": "Другой", + "feedback.policy.header.scheduling": "Планирование", + "feedback.policy.header.snapshot-action": "Действия со снимками", + "feedback.policy.header.snapshot-retention": "Хранение моментальных снимков", + "feedback.policy.header.upload": "Загрузить", + "feedback.policy.retention.annual-snapshot-retain": "Ежегодный", + "feedback.policy.retention.annual-snapshot-retain-help": "Сколько ежегодных снимков следует сохранять для каждого источника. \nПоследний снимок за каждый календарный год будет сохранен.", + "feedback.policy.retention.annual-snapshot-retain-hint": "Количество ежегодных снимков", + "feedback.policy.retention.daily-snapshot-retain": "Ежедневно", + "feedback.policy.retention.daily-snapshot-retain-help": "Сколько ежедневных снимков следует сохранять для каждого источника. \nПоследний снимок каждого дня будет сохранен.", + "feedback.policy.retention.daily-snapshot-retain-hint": "Количество ежедневных снимков", + "feedback.policy.retention.hourly-snapshot-retain": "Ежечасно", + "feedback.policy.retention.hourly-snapshot-retain-help": "Сколько снимков в час сохранять для каждого источника. \nПоследний снимок каждого часа будет сохранен.", + "feedback.policy.retention.hourly-snapshot-retain-hint": "количество снимков в час", + "feedback.policy.retention.ignore-identical-snapshots": "Игнорировать идентичные снимки", + "feedback.policy.retention.ignore-identical-snapshots-help": "НЕ сохраняйте снимок, если файлы не были изменены.", + "feedback.policy.retention.keep-latest-help": "количество последних снимков", + "feedback.policy.retention.latest-snapshot-retain": "Последние снимки", + "feedback.policy.retention.latest-snapshot-retain-help": "Количество последних снимков, которые необходимо сохранить, для каждого источника", + "feedback.policy.retention.monthly-snapshot-retain": "Ежемесячно", + "feedback.policy.retention.monthly-snapshot-retain-help": "Сколько ежемесячных снимков следует сохранять для каждого источника. \nПоследний снимок за каждый календарный месяц будет сохранен.", + "feedback.policy.retention.monthly-snapshot-retain-hint": "Количество ежемесячных снимков", + "feedback.policy.retention.weekly-snapshot-retain": "Еженедельно", + "feedback.policy.retention.weekly-snapshot-retain-help": "Сколько еженедельных снимков сохранять для каждого источника. \nПоследний снимок каждой недели будет сохранен.", + "feedback.policy.retention.weekly-snapshot-retain-hint": "Количество еженедельных снимков", + "feedback.policy.timeout-help": "Тайм-аут в секундах, прежде чем Копия завершит процесс", "feedback.provider.azure-blob-storage": "Хранилище BLOB-объектов Azure", "feedback.provider.backblaze-b2": "Бэкблэйз Б2", "feedback.provider.google-cloud-storage": "Облачное хранилище Google", @@ -313,6 +383,11 @@ "value.log.details-10-maximum-details": "10 - максимум деталей", "value.log.details-5-normal-details": "5 - нормальные детали", "value.log.details-inherit-from-parent": "(наследовать от родителя)", + "value.policy.async": "Запускать асинхронно, игнорировать сбои", + "value.policy.essential": "Должен добиться успеха", + "value.policy.inherent-from-parent": "наследовать от родителя", + "value.policy.none": "никто", + "value.policy.optional": "Игнорировать неудачи", "value.provider.s3.http-connection-insecure": "Использовать HTTP-соединение (небезопасно)", "value.provider.s3.no-tls-verification": "Не проверять сертификат TLS", "value.repository.format.latest": "Последний формат", diff --git a/src/components/policy-editor/ActionRowMode.jsx b/src/components/policy-editor/ActionRowMode.jsx index 43600dee..3b52391e 100644 --- a/src/components/policy-editor/ActionRowMode.jsx +++ b/src/components/policy-editor/ActionRowMode.jsx @@ -5,18 +5,19 @@ import { stateProperty } from '../../forms'; import { LabelColumn } from './LabelColumn'; import { WideValueColumn } from './WideValueColumn'; import { EffectiveValue } from './EffectiveValue'; +import i18n from '../../utils/i18n' export function ActionRowMode(component, action) { return - + - - - + + + {EffectiveValue(component, action)} diff --git a/src/components/policy-editor/ActionRowTimeout.jsx b/src/components/policy-editor/ActionRowTimeout.jsx index fbbf3417..b0cd44d1 100644 --- a/src/components/policy-editor/ActionRowTimeout.jsx +++ b/src/components/policy-editor/ActionRowTimeout.jsx @@ -4,10 +4,11 @@ import { OptionalNumberField } from '../../forms/OptionalNumberField'; import { LabelColumn } from './LabelColumn'; import { WideValueColumn } from './WideValueColumn'; import { EffectiveValue } from './EffectiveValue'; +import i18n from '../../utils/i18n'; export function ActionRowTimeout(component, action) { return - + {OptionalNumberField(component, "", "policy." + action, {})} {EffectiveValue(component, action)} ; diff --git a/src/components/policy-editor/PolicyEditor.jsx b/src/components/policy-editor/PolicyEditor.jsx index b61554ee..6a10633c 100644 --- a/src/components/policy-editor/PolicyEditor.jsx +++ b/src/components/policy-editor/PolicyEditor.jsx @@ -29,6 +29,7 @@ import { SectionHeaderRow } from './SectionHeaderRow'; import { ActionRowScript } from './ActionRowScript'; import { ActionRowTimeout } from './ActionRowTimeout'; import { ActionRowMode } from './ActionRowMode'; +import i18n from '../../utils/i18n'; export class PolicyEditor extends Component { constructor() { @@ -117,7 +118,7 @@ export class PolicyEditor extends Component { } if (p.userName === this.props.userName && p.host === this.props.host && p.path === this.props.path) { - return "(Defined by this policy)"; + return i18n.t('feedback.policy.defined-by-this-policy'); } return <>Defined by {PolicyEditorLink(p)}; @@ -212,7 +213,7 @@ export class PolicyEditor extends Component { this.props.close(); }).catch(error => { this.setState({ saving: false }); - errorAlert(error, 'Error saving policy'); + errorAlert(error, i18n.t('feedback.policy.error-saving-policy')); }); } catch (e) { errorAlert(e); @@ -221,14 +222,14 @@ export class PolicyEditor extends Component { } deletePolicy() { - if (window.confirm('Are you sure you want to delete this policy?')) { + if (window.confirm(i18n.t('feedback.policy.confirm-delete-policy'))) { this.setState({ saving: true }); axios.delete(this.policyURL(this.props)).then(result => { this.props.close(); }).catch(error => { this.setState({ saving: false }); - errorAlert(error, 'Error deleting policy'); + errorAlert(error, i18n.t('feedback.policy.error-delete-policy')); }); } } @@ -248,155 +249,155 @@ export class PolicyEditor extends Component { } if (isLoading) { - return

Loading ...

; + return

{i18n.t('common.loading')}

; } return <>
- + -  Snapshot Retention + {i18n.t('feedback.policy.header.snapshot-retention')} - - {OptionalNumberField(this, null, "policy.retention.keepLatest", { placeholder: "# of latest snapshots" })} + + {OptionalNumberField(this, null, "policy.retention.keepLatest", { placeholder: i18n.t('feedback.policy.retention.keep-latest-help') })} {EffectiveValue(this, "retention.keepLatest")} - - {OptionalNumberField(this, null, "policy.retention.keepHourly", { placeholder: "# of hourly snapshots" })} + + {OptionalNumberField(this, null, "policy.retention.keepHourly", { placeholder: i18n.t('feedback.policy.retention.hourly-snapshot-retain-hint') })} {EffectiveValue(this, "retention.keepHourly")} - - {OptionalNumberField(this, null, "policy.retention.keepDaily", { placeholder: "# of daily snapshots" })} + + {OptionalNumberField(this, null, "policy.retention.keepDaily", { placeholder: i18n.t('feedback.policy.retention.daily-snapshot-retain-hint') })} {EffectiveValue(this, "retention.keepDaily")} - - {OptionalNumberField(this, null, "policy.retention.keepWeekly", { placeholder: "# of weekly snapshots" })} + + {OptionalNumberField(this, null, "policy.retention.keepWeekly", { placeholder: i18n.t('feedback.policy.retention.weekly-snapshot-retain-hint') })} {EffectiveValue(this, "retention.keepWeekly")} - - {OptionalNumberField(this, null, "policy.retention.keepMonthly", { placeholder: "# of monthly snapshots" })} + + {OptionalNumberField(this, null, "policy.retention.keepMonthly", { placeholder: i18n.t('feedback.policy.retention.monthly-snapshot-retain-hint') })} {EffectiveValue(this, "retention.keepMonthly")} - - {OptionalNumberField(this, null, "policy.retention.keepAnnual", { placeholder: "# of annual snapshots" })} + + {OptionalNumberField(this, null, "policy.retention.keepAnnual", { placeholder: i18n.t('feedback.policy.retention.annual-snapshot-retain-hint') })} {EffectiveValue(this, "retention.keepAnnual")} - - {OptionalBoolean(this, null, "policy.retention.ignoreIdenticalSnapshots", "inherit from parent")} + + {OptionalBoolean(this, null, "policy.retention.ignoreIdenticalSnapshots", i18n.t('value.policy.inherent-from-parent'))} {EffectiveValue(this, "retention.ignoreIdenticalSnapshots")} -  Files + {i18n.t('feedback.policy.header.files')} - List of file and directory names to ignore.
(See documentation on ignoring files).} /> - {StringList(this, "policy.files.ignore", { placeholder: "e.g. /file.txt" })} + List of file and directory names to ignore.
(See documentation on ignoring files).} /> + {StringList(this, "policy.files.ignore", { placeholder: i18n.t('feedback.policy.files.ignore-files-hint') })} {EffectiveTextAreaValue(this, "files.ignore")}
- + {RequiredBoolean(this, "", "policy.files.noParentIgnore")} - - {StringList(this, "policy.files.ignoreDotFiles", { placeholder: "e.g. .kopiaignore" })} + + {StringList(this, "policy.files.ignoreDotFiles", { placeholder: i18n.t('feedback.policy.files.ignore-rule-files-hint') })} {EffectiveTextAreaValue(this, "files.ignoreDotFiles")} - + {RequiredBoolean(this, "", "policy.files.noParentDotFiles")} - - {OptionalBoolean(this, null, "policy.files.ignoreCacheDirs", "inherit from parent")} + + {OptionalBoolean(this, null, "policy.files.ignoreCacheDirs", i18n.t('value.policy.inherent-from-parent'))} {EffectiveBooleanValue(this, "files.ignoreCacheDirs")} - - {OptionalBoolean(this, null, "policy.files.oneFileSystem", "inherit from parent")} + + {OptionalBoolean(this, null, "policy.files.oneFileSystem", i18n.t('value.policy.inherent-from-parent'))} {EffectiveBooleanValue(this, "files.oneFileSystem")}
-  Error Handling + {i18n.t('feedback.policy.header.error-handling')} - - {OptionalBoolean(this, null, "policy.errorHandling.ignoreDirectoryErrors", "inherit from parent")} + + {OptionalBoolean(this, null, "policy.errorHandling.ignoreDirectoryErrors", i18n.t('value.policy.inherent-from-parent') )} {EffectiveBooleanValue(this, "errorHandling.ignoreDirectoryErrors")} - - {OptionalBoolean(this, null, "policy.errorHandling.ignoreFileErrors", "inherit from parent")} + + {OptionalBoolean(this, null, "policy.errorHandling.ignoreFileErrors", i18n.t('value.policy.inherent-from-parent') )} {EffectiveBooleanValue(this, "errorHandling.ignoreFileErrors")} - - {OptionalBoolean(this, null, "policy.errorHandling.ignoreUnknownTypes", "inherit from parent")} + + {OptionalBoolean(this, null, "policy.errorHandling.ignoreUnknownTypes", i18n.t('value.policy.inherent-from-parent') )} {EffectiveBooleanValue(this, "errorHandling.ignoreUnknownTypes")} -  Compression + {i18n.t('feedback.policy.header.compression')} - + - + {this.state.algorithms && this.state.algorithms.compression.map(x => toAlgorithmOption(x, ""))} {EffectiveValue(this, "compression.compressorName")} - - {OptionalNumberField(this, "", "policy.compression.minSize", { placeholder: "minimum file size in bytes" })} + + {OptionalNumberField(this, "", "policy.compression.minSize", { placeholder: i18n.t('feedback.policy.compression.minimal-file-size-hint') })} {EffectiveValue(this, "compression.minSize")} - - {OptionalNumberField(this, "", "policy.compression.maxSize", { placeholder: "maximum file size in bytes" })} + + {OptionalNumberField(this, "", "policy.compression.maxSize", { placeholder: i18n.t('feedback.policy.compression.maximal-file-size-hint') })} {EffectiveValue(this, "compression.maxSize")} - + - {StringList(this, "policy.compression.onlyCompress", { placeholder: "e.g. *.txt" })} + {StringList(this, "policy.compression.onlyCompress", { placeholder: i18n.t('feedback.policy.compression.only-compress-extensions-hint') })} {EffectiveTextAreaValue(this, "compression.onlyCompress")} - + - {StringList(this, "policy.compression.neverCompress", { placeholder: "e.g. *.mp4" })} + {StringList(this, "policy.compression.neverCompress", { placeholder: i18n.t('feedback.policy.compression.never-compress-extensions-hint') })} {EffectiveTextAreaValue(this, "compression.neverCompress")} -  Scheduling + {i18n.t('feedback.policy.header.scheduling')} @@ -459,7 +460,7 @@ export class PolicyEditor extends Component { -  Upload + {i18n.t('feedback.policy.header.upload')} @@ -476,7 +477,7 @@ export class PolicyEditor extends Component { -  Snapshot Actions + {i18n.t('feedback.policy.header.snapshot-action')} {ActionRowScript(this, "actions.beforeSnapshotRoot.script", "Before Snapshot", "Script to run before snapshot")} @@ -489,7 +490,7 @@ export class PolicyEditor extends Component { -  Folder Actions + {i18n.t('feedback.policy.header.folder-actions')} {ActionRowScript(this, "actions.beforeFolder.script", "Before Folder", "Script to run before folder")} @@ -502,7 +503,7 @@ export class PolicyEditor extends Component { -  Logging + {i18n.t('feedback.policy.header.logging')} @@ -550,7 +551,7 @@ export class PolicyEditor extends Component { -  Other + {i18n.t('feedback.policy.header.other')} @@ -568,7 +569,7 @@ export class PolicyEditor extends Component {
- +
{!this.props.embedded && } {!this.state.isNew && !this.props.embedded && <>  diff --git a/src/components/policy-editor/SectionHeaderRow.jsx b/src/components/policy-editor/SectionHeaderRow.jsx index 568a14ad..c3fe3df1 100644 --- a/src/components/policy-editor/SectionHeaderRow.jsx +++ b/src/components/policy-editor/SectionHeaderRow.jsx @@ -3,11 +3,12 @@ import Row from 'react-bootstrap/Row'; import { LabelColumn } from './LabelColumn'; import { ValueColumn } from './ValueColumn'; import { EffectiveValueColumn } from './EffectiveValueColumn'; +import i18n from '../../utils/i18n'; export function SectionHeaderRow() { return -
Defined
-
Effective
+
{i18n.t('feedback.header.defined')}
+
{i18n.t('feedback.header.effective')}
; } diff --git a/src/css/App.css b/src/css/App.css index eba0edf3..65b1f0ea 100644 --- a/src/css/App.css +++ b/src/css/App.css @@ -195,6 +195,13 @@ body { border: 1px solid rgba(0,0,0,.125); } +#kopia .policy-icon { + margin-left: 0; + margin-right:0.5em; + height: 1.25em; + width: 1.25em; +} + .popover { max-width: 1000px; } From dda4271cd0d3b2b1174456f4928de11eb91f6fb5 Mon Sep 17 00:00:00 2001 From: lupusA Date: Sat, 30 Mar 2024 08:59:02 +0100 Subject: [PATCH 25/27] First full translation. Some parts need fine-tuning --- .vscode/settings.json | 21 ++++- public/locales/de/translation.json | 80 ++++++++++++++++- public/locales/en/translation.json | 78 +++++++++++++++- public/locales/es/translation.json | 78 +++++++++++++++- public/locales/fr/translation.json | 78 +++++++++++++++- public/locales/it/translation.json | 78 +++++++++++++++- public/locales/jp/translation.json | 78 +++++++++++++++- public/locales/pl/translation.json | 78 +++++++++++++++- public/locales/ru/translation.json | 78 +++++++++++++++- .../policy-editor/ActionRowMode.jsx | 2 +- .../policy-editor/ActionRowTimeout.jsx | 2 +- src/components/policy-editor/PolicyEditor.jsx | 88 +++++++++---------- .../policy-editor/UpcomingSnapshotTimes.jsx | 5 +- src/pages/Policies.jsx | 4 +- src/pages/Repository.jsx | 2 +- src/pages/Snapshots.jsx | 4 +- src/tests/PolicyEditor.test.jsx | 3 +- src/utils/uiutil.jsx | 20 ++--- 18 files changed, 702 insertions(+), 75 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 08bec049..7bc1d54e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -17,11 +17,28 @@ "feedback.provider.sftp-server", "feedback.task.estimate-results", "feedback.provider.required-either-known-host-data", - "feedback.provider.required-either-key-file" + "feedback.provider.required-either-key-file", + "feedback.policy.files.ignore-files-help", + "feedback.policy.scheduling.cron-help" ], "i18n-ally.extract.ignoredByFiles": { "src\\components\\policy-editor\\PolicyEditor.jsx": [ "Do not cross filesystem boundaries when creating a snapshot" + ], + "src\\components\\policy-editor\\UpcomingSnapshotTimes.jsx": [ + "L LT" + ], + "src\\contexts\\UIPreferencesContext.tsx": [ + "(prefers-color-scheme: dark)" + ], + "src\\pages\\Policies.jsx": [ + "policy list" ] - } + }, + "i18n-ally.extract.ignored": [ + " (", + " (", + ")", + ")" + ] } \ No newline at end of file diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 5e1a30c1..c1bf1ad9 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -8,6 +8,8 @@ "common.next": "Weiter", "common.return": "Zurück", "enter-object-name-prefix-or-leave-empty-hint": "Geben Sie das Präfix für den Objektnamen ein oder lassen Sie es leer", + "event.cli.copy-to-clipboard": "In die Zwischenablage kopieren", + "event.cli.show-cli-equivalent": "Klicken Sie, um das CLI-Äquivalent anzuzeigen", "event.description.cancel": "Abbrechen", "event.description.new": "Geben Sie eine neue Beschreibung ein", "event.description.remove": "Beschreibung entfernen", @@ -19,14 +21,21 @@ "event.pin.remove": "Pin entfernen", "event.pin.snapshot-pin": "Snapshot anheften", "event.pin.update": "Pin aktualisieren", + "event.policy.delete": "Richtlinie löschen", + "event.policy.edit": "Bearbeiten", + "event.policy.save": "Richtlinie speichern", + "event.policy.set": "Richtlinie festlegen", "event.repository.advanced-options-hide": "Erweiterte Optionen ausblenden", "event.repository.advanced-options.show": "Erweiterte Optionen anzeigen", "event.repository.connect-to-repository": "Mit Repository verbinden", "event.repository.create-repository": "Repository erstellen", + "event.task.cancel": "Aufgabe abbrechen", "feedback.description.modal-title": "Beschreibung des Snapshots", + "feedback.error.common": "Fehler", "feedback.error.connection": "Verbindungsfehler:", "feedback.header.actions": "Aktionen", "feedback.header.defined": "Definiert", + "feedback.header.details": "Details", "feedback.header.directories": "Verzeichnisse", "feedback.header.effective": "Angewandt", "feedback.header.files": "Dateien", @@ -38,6 +47,16 @@ "feedback.header.username": "Nutzername", "feedback.pin.name": "Name des Pins", "feedback.pin.standard-text": "Nicht löschen", + "feedback.policy.action.command-mode": "Befehlsmodus", + "feedback.policy.actions.after-folder": "Nach dem Ordner", + "feedback.policy.actions.after-folder-help": "Skript zur Ausführung nach dem Ordner", + "feedback.policy.actions.after-snapshot": "Nach dem Schnappschuss", + "feedback.policy.actions.after-snapshot-help": "Skript, das nach dem Snapshot ausgeführt wird", + "feedback.policy.actions.before-folder": "Vor dem Ordner", + "feedback.policy.actions.before-folder-help": "Skript, das vor dem Ordner ausgeführt werden soll", + "feedback.policy.actions.before-snapshot": "Vor dem Schnappschuss", + "feedback.policy.actions.before-snapshot-help": "Skript, das vor dem Snapshot ausgeführt werden soll", + "feedback.policy.actions.timeout": "Auszeit", "feedback.policy.command-mode-help": "Wesentlich (muss erfolgreich sein; Standardverhalten), optional (Fehler werden toleriert) oder asynchron (Kopia startet die Aktion, wartet aber nicht auf deren Abschluss)", "feedback.policy.compression.compression-algorithm": "Komprimierungsalgorithmus", "feedback.policy.compression.compression-algorithm-help": "Geben Sie den Komprimierungsalgorithmus an, der beim Erstellen von Snapshots von Dateien in diesem Verzeichnis und Unterverzeichnissen verwendet werden soll", @@ -54,7 +73,8 @@ "feedback.policy.compression.only-compress-extensions-help": "Komprimieren Sie nur Dateien mit den folgenden Dateierweiterungen (eine Erweiterung pro Zeile)", "feedback.policy.compression.only-compress-extensions-hint": "z.B. *.txt", "feedback.policy.confirm-delete-policy": "Sind Sie sicher, dass Sie diese Richtlinie löschen möchten?", - "feedback.policy.defined-by-this-policy": "(Definiert durch diese Richtlinie)", + "feedback.policy.defined-by": "Definiert durch", + "feedback.policy.defined-by-this-policy": "Definiert durch diese Richtlinie", "feedback.policy.error-delete-policy": "Fehler beim Löschen der Richtlinie", "feedback.policy.error-handling.ignore-directory-errors": "Verzeichnisfehler ignorieren", "feedback.policy.error-handling.ignore-directory-errors-help": "Verzeichnislesefehler werden als nicht schwerwiegend behandelt.", @@ -64,6 +84,7 @@ "feedback.policy.error-handling.ignore-unknown-directories-help": "Nicht erkannte/nicht unterstützte Verzeichniseinträge werden als nicht schwerwiegende Fehler behandelt.", "feedback.policy.error-saving-policy": "Fehler beim Speichern der Richtlinie", "feedback.policy.files.ignore-files": "Dateien ignorieren", + "feedback.policy.files.ignore-files-help": "Liste der zu ignorierenden Datei- und Verzeichnisnamen.
Siehe Dokumentation zum Ignorieren von Dateien.", "feedback.policy.files.ignore-files-hint": "z.B. /file.txt", "feedback.policy.files.ignore-rule-files": "Regeldateien ignorieren", "feedback.policy.files.ignore-rule-files-from-parent-directories": "Regeldateien aus übergeordneten Verzeichnissen ignorieren", @@ -86,6 +107,22 @@ "feedback.policy.header.snapshot-action": "Snapshot-Aktionen", "feedback.policy.header.snapshot-retention": "Snapshot-Aufbewahrung", "feedback.policy.header.upload": "Hochladen", + "feedback.policy.logging.cache-hit": "Cache-Treffer", + "feedback.policy.logging.cache-hit-help": "Protokollieren Sie die Ausführlichkeit, wenn ein Cache verwendet wird, anstatt die Datei hochzuladen", + "feedback.policy.logging.cache-miss": "Cache-Fehler", + "feedback.policy.logging.cache-miss-help": "Protokollausführlichkeit, wenn ein Cache nicht verwendet werden kann und eine Datei gehasht werden muss", + "feedback.policy.logging.directory-ignored": "Verzeichnis ignoriert", + "feedback.policy.logging.directory-ignored-help": "Protokollieren Sie die Ausführlichkeit, wenn ein Verzeichnis ignoriert wird", + "feedback.policy.logging.directory-snapshotted": "Verzeichnis-Snapshot erstellt", + "feedback.policy.logging.directory-snapshotted-help": "Protokollieren Sie die Ausführlichkeit, wenn ein Verzeichnis-Snapshot erstellt wird", + "feedback.policy.logging.file-ignored": "Datei ignoriert", + "feedback.policy.logging.file-ignored-help": "Protokollieren Sie die Ausführlichkeit, wenn eine Datei, ein symbolischer Link usw. ignoriert wird", + "feedback.policy.logging.file-snapshotted": "Datei-Snapshot erstellt", + "feedback.policy.logging.file-snapshotted-help": "Protokollieren Sie die Ausführlichkeit, wenn eine Datei, ein symbolischer Link usw. als Snapshot erstellt wird", + "feedback.policy.other.disable-parent-policy-evaluation": "Deaktivieren Sie die Evaluierung der übergeordneten Richtlinien", + "feedback.policy.other.disable-parent-policy-evaluation-help": "Verhindert, dass sich übergeordnete Richtlinien auf dieses Verzeichnis und seine Unterverzeichnisse auswirken", + "feedback.policy.other.json-representation": "JSON-Darstellung", + "feedback.policy.other.json-representation-help": "Dies ist die interne Darstellung einer Richtlinie", "feedback.policy.retention.annual-snapshot-retain": "Jährlich", "feedback.policy.retention.annual-snapshot-retain-help": "Wie viele jährliche Snapshots pro Quelle aufbewahrt werden sollen. \nDer neueste Snapshot jedes Kalenderjahres wird aufbewahrt", "feedback.policy.retention.annual-snapshot-retain-hint": "Anzahl der jährlichen Schnappschüsse", @@ -106,7 +143,31 @@ "feedback.policy.retention.weekly-snapshot-retain": "Wöchentlich", "feedback.policy.retention.weekly-snapshot-retain-help": "Gibt an, wie viele wöchentliche Snapshots pro Quelle aufbewahrt werden sollen. \nDer neueste Schnappschuss jeder Woche wird beibehalten", "feedback.policy.retention.weekly-snapshot-retain-hint": "Anzahl der wöchentlichen Snapshots", + "feedback.policy.scheduling.cron-expressions": "Cron-Ausdrücke", + "feedback.policy.scheduling.cron-expressions-hint": "Minute Stunde Tag Monat Wochentag #Kommentar", + "feedback.policy.scheduling.cron-help": "Snapshot-Zeitpläne mit UNIX-Crontab-Syntax (einer pro Zeile):
Siehe Details zum unterstützten Format.", + "feedback.policy.scheduling.manual-snapshots-only": "Nur manuelle Snapshots", + "feedback.policy.scheduling.manual-snapshots-only-help": "Schnappschüsse nur manuell erstellen (geplante Schnappschüsse werden deaktiviert)", + "feedback.policy.scheduling.missed-snapshots-startup": "Führen Sie beim Start verpasste Snapshots aus", + "feedback.policy.scheduling.missed-snapshots-startup-help": "Führen Sie alle verpassten Snapshots sofort aus, wenn Kopia startet (nur relevant für Time-of-Day-Snapshots).", + "feedback.policy.scheduling.no-upcoming-snapshots": "Keine bevorstehenden Schnappschüsse", + "feedback.policy.scheduling.snapshot-frequency": "Häufigkeit der Snapshots", + "feedback.policy.scheduling.snapshot-frequency-help": "Gibt an, wie oft Snapshots in KopiaUI oder Kopia-Server erstellt werden sollen (hat außerhalb des Servermodus keine Auswirkung)", + "feedback.policy.scheduling.times-of-day": "Tageszeiten", + "feedback.policy.scheduling.times-of-day-help": "Schnappschüsse zu den angegebenen Tageszeiten erstellen (24-Stunden-Format)", + "feedback.policy.scheduling.times-of-day-hint": "z.B. 17:00", + "feedback.policy.scheduling.upcoming": "Bevorstehend", + "feedback.policy.scheduling.upcoming-snapshots": "Kommende Schnappschüsse", + "feedback.policy.scheduling.upcoming-snapshots-help": "Zeiten bevorstehender Snapshots, berechnet auf Grundlage von Richtlinienparametern", + "feedback.policy.time-of-day.invalid": "Ungültige Tageszeit: {{tod}}", "feedback.policy.timeout-help": "Timeout in Sekunden, bevor Kopia den Prozess abbricht", + "feedback.policy.upload.maximum-parallel-file-reads": "Maximale parallele Dateilesevorgänge", + "feedback.policy.upload.maximum-parallel-file-reads-help": "Maximale Anzahl von Dateien, die parallel gelesen werden (standardmäßig die Anzahl der logischen Prozessoren)", + "feedback.policy.upload.maximum-parallel-file-reads-hint": "Maximale Anzahl paralleler Dateilesevorgänge", + "feedback.policy.upload.maximum-parallel-snapshots": "Maximale parallele Snapshots", + "feedback.policy.upload.maximum-parallel-snapshots-help": "Maximale Anzahl von Snapshots, die gleichzeitig hochgeladen werden können", + "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "Maximale Anzahl paralleler Snapshots", + "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "muss mithilfe einer globalen, Benutzer- oder Hostrichtlinie angegeben werden", "feedback.provider.azure-blob-storage": "Azure Blob Storage", "feedback.provider.backblaze-b2": "Backblaze B2", "feedback.provider.google-cloud-storage": "Google Cloud-Speicher", @@ -138,13 +199,18 @@ "feedback.repository.repository-description-help": "Hilft bei der Unterscheidung zwischen mehreren verbundenen Repositorys", "feedback.repository.repository-description-hint": "Geben Sie eine Repository-Beschreibung ein", "feedback.repository.repository-token-enter": "Geben Sie das Repository-Token ein", + "feedback.snapshot.status.overdue": "überfällig", "feedback.tab.policies": "Richtlinien", "feedback.tab.preferences": "Einstellungen", "feedback.tab.repository": "Repository", "feedback.tab.repository-is-not-connected": "Das Repository ist nicht verbunden", "feedback.tab.snapshots": "Snapshots", "feedback.tab.tasks": "Aufgaben", + "feedback.task.canceled-after": "Abgebrochen nach", "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} exkludiert) Files: {{files}} ({{files.excluded}} exkludiert) Directories: {{directories}} ({{directories.excluded}} exkludiert) Errors: {{errors}} ({{errors.ignored}} ignoriert)", + "feedback.task.failed-after": "Fehlgeschlagen nach", + "feedback.task.finished-in": "Abgeschlossen in", + "feedback.task.running-for": "Läuft seit", "feedback.task.total": "Gesamt", "feedback.ui.appearance": "Darstellung", "feedback.ui.appearance-help": "Gibt die Darstellung des Nutzerinterfaces an", @@ -283,7 +349,7 @@ "snapshot.event.history.deselect.all": "Alle abwählen", "snapshot.event.history.fetch.snapshots": "Schnappschüsse abrufen", "snapshot.event.history.pin.add": "Fügen Sie eine PIN hinzu, um den Snapshot vor dem Löschen zu schützen", - "snapshot.event.history.select.all": "Wählen Sie Alle", + "snapshot.event.history.select.all": "Alle auswählen", "snapshot.event.history.selected.delete": "Ausgewählte löschen (", "snapshot.event.restore": "Restore", "snapshot.event.restore.begin": "Begin restore", @@ -378,6 +444,8 @@ "validation.provider.user": "Benutzer", "validation.provider.user-hint": "Nutzername", "value.algorithm.eco-disabled": "Deaktiviert", + "value.algorithm.suffix-not-recommended": "(NICHT EMPFOHLEN)", + "value.algorithm.suffix-recommended": "(EMPFOHLEN)", "value.log.details-0-no-output": "0 - keine Ausgabe", "value.log.details-1-minimal-details": "1 – minimale Details", "value.log.details-10-maximum-details": "10 - maximale Details", @@ -392,6 +460,14 @@ "value.provider.s3.no-tls-verification": "TLS-Zertifikat nicht überprüfen", "value.repository.format.latest": "Neuestes Format", "value.repository.format.legacy": "Legacy-Format kompatibel mit v0.8", + "value.snapshot-frequency.10-minutes": "alle 10 Minuten", + "value.snapshot-frequency.12-hours": "alle 12 Stunden", + "value.snapshot-frequency.15-minutes": "alle 15 Minuten", + "value.snapshot-frequency.20-minutes": "alle 20 Minuten", + "value.snapshot-frequency.3-hours": "alle 3 Stunden", + "value.snapshot-frequency.30-minutes": "alle 30 Minuten", + "value.snapshot-frequency.6-hours": "alle 6 Stunden", + "value.snapshot-frequency.hour": "jede Stunde", "value.ui.appearance-large": "groß", "value.ui.appearance-medium": "mittel", "value.ui.appearance-small": "klein", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 575a3d0a..3b04eb6b 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -8,6 +8,8 @@ "common.next": "Next", "common.return": "Return", "enter-object-name-prefix-or-leave-empty-hint": "Enter object name prefix or leave empty", + "event.cli.copy-to-clipboard": "Copy to clipboard", + "event.cli.show-cli-equivalent": "Click to show CLI equivalent", "event.description.cancel": "Cancel", "event.description.new": "Enter new description", "event.description.remove": "Remove Description", @@ -19,14 +21,21 @@ "event.pin.remove": "Remove Pin", "event.pin.snapshot-pin": "Pin Snapshot", "event.pin.update": "Update Pin", + "event.policy.delete": "Delete policy", + "event.policy.edit": "Edit", + "event.policy.save": "Save policy", + "event.policy.set": "Set policy", "event.repository.advanced-options-hide": "Hide Advanced Options", "event.repository.advanced-options.show": "Show Advanced Options", "event.repository.connect-to-repository": "Connect to repository", "event.repository.create-repository": "Create repository", + "event.task.cancel": "Cancel task", "feedback.description.modal-title": "Snapshot Description", + "feedback.error.common": "Error", "feedback.error.connection": "Connect Error:", "feedback.header.actions": "Actions", "feedback.header.defined": "Defined", + "feedback.header.details": "Details", "feedback.header.directories": "Directories", "feedback.header.effective": "Effective", "feedback.header.files": "Files", @@ -38,6 +47,16 @@ "feedback.header.username": "Username", "feedback.pin.name": "Name of the pin", "feedback.pin.standard-text": "do-not-delete", + "feedback.policy.action.command-mode": "Command Mode", + "feedback.policy.actions.after-folder": "After Folder", + "feedback.policy.actions.after-folder-help": "Script to run after folder", + "feedback.policy.actions.after-snapshot": "After Snapshot", + "feedback.policy.actions.after-snapshot-help": "Script to run after snapshot", + "feedback.policy.actions.before-folder": "Before Folder", + "feedback.policy.actions.before-folder-help": "Script to run before folder", + "feedback.policy.actions.before-snapshot": "Before Snapshot", + "feedback.policy.actions.before-snapshot-help": "Script to run before snapshot", + "feedback.policy.actions.timeout": "Timeout", "feedback.policy.command-mode-help": "Essential (must succeed; default behavior), optional (failures are tolerated), or async (Kopia will start the action but not wait for it to finish)", "feedback.policy.compression.compression-algorithm": "Compression Algorithm", "feedback.policy.compression.compression-algorithm-help": "Specify compression algorithm to use when snapshotting files in this directory and subdirectories", @@ -54,7 +73,8 @@ "feedback.policy.compression.only-compress-extensions-help": "Only compress files with the following file extensions (one extension per line)", "feedback.policy.compression.only-compress-extensions-hint": "e.g. *.txt", "feedback.policy.confirm-delete-policy": "Are you sure you want to delete this policy?", - "feedback.policy.defined-by-this-policy": "(Defined by this policy)", + "feedback.policy.defined-by": "Defined by", + "feedback.policy.defined-by-this-policy": "Defined by this policy", "feedback.policy.error-delete-policy": "Error deleting policy", "feedback.policy.error-handling.ignore-directory-errors": "Ignore Directory Errors", "feedback.policy.error-handling.ignore-directory-errors-help": "Treat directory read errors as non-fatal.", @@ -64,6 +84,7 @@ "feedback.policy.error-handling.ignore-unknown-directories-help": "Treat unrecognized/unsupported directory entries as non-fatal errors.", "feedback.policy.error-saving-policy": "Error saving policy", "feedback.policy.files.ignore-files": "Ignore Files", + "feedback.policy.files.ignore-files-help": "List of file and directory names to ignore.
See documentation on ignoring files.", "feedback.policy.files.ignore-files-hint": "e.g. /file.txt", "feedback.policy.files.ignore-rule-files": "Ignore Rule Files", "feedback.policy.files.ignore-rule-files-from-parent-directories": "Ignore Rule Files From Parent Directories", @@ -86,6 +107,22 @@ "feedback.policy.header.snapshot-action": "Snapshot Actions", "feedback.policy.header.snapshot-retention": "Snapshot Retention", "feedback.policy.header.upload": "Upload", + "feedback.policy.logging.cache-hit": "Cache hit", + "feedback.policy.logging.cache-hit-help": "Log verbosity when a cache is used instead of uploading the file", + "feedback.policy.logging.cache-miss": "Cache miss", + "feedback.policy.logging.cache-miss-help": "Log verbosity when a cache cannot be used and a file must be hashed", + "feedback.policy.logging.directory-ignored": "Directory ignored", + "feedback.policy.logging.directory-ignored-help": "Log verbosity when a directory is ignored", + "feedback.policy.logging.directory-snapshotted": "Directory snapshotted", + "feedback.policy.logging.directory-snapshotted-help": "Log verbosity when a directory is snapshotted", + "feedback.policy.logging.file-ignored": "File ignored", + "feedback.policy.logging.file-ignored-help": "Log verbosity when a file, symbolic link, etc. is ignored", + "feedback.policy.logging.file-snapshotted": "File snapshotted", + "feedback.policy.logging.file-snapshotted-help": "Log verbosity when a file, symbolic link, etc. is snapshotted", + "feedback.policy.other.disable-parent-policy-evaluation": "Disable Parent Policy Evaluation", + "feedback.policy.other.disable-parent-policy-evaluation-help": "Prevents any parent policies from affecting this directory and its subdirectories", + "feedback.policy.other.json-representation": "JSON Representation", + "feedback.policy.other.json-representation-help": "This is the internal representation of a policy", "feedback.policy.retention.annual-snapshot-retain": "Annual", "feedback.policy.retention.annual-snapshot-retain-help": "How many annual snapshots to retain per source. The latest snapshot from each calendar year will be retained", "feedback.policy.retention.annual-snapshot-retain-hint": "Number of annual snapshots", @@ -106,7 +143,31 @@ "feedback.policy.retention.weekly-snapshot-retain": "Weekly", "feedback.policy.retention.weekly-snapshot-retain-help": "How many weekly snapshots to retain per source. The latest snapshot from each week will be retained", "feedback.policy.retention.weekly-snapshot-retain-hint": "Number of weekly snapshots", + "feedback.policy.scheduling.cron-expressions": "Cron Expressions", + "feedback.policy.scheduling.cron-expressions-hint": "minute hour day month weekday #comment", + "feedback.policy.scheduling.cron-help": "Snapshot schedules using UNIX crontab syntax (one per line):
See supported format details.", + "feedback.policy.scheduling.manual-snapshots-only": "Manual Snapshots Only", + "feedback.policy.scheduling.manual-snapshots-only-help": "Only create snapshots manually (disables scheduled snapshots)", + "feedback.policy.scheduling.missed-snapshots-startup": "Run Missed Snapshots on Startup", + "feedback.policy.scheduling.missed-snapshots-startup-help": "Immediately run any missed snapshots when kopia starts (only relevant for Time-of-day snapshots)", + "feedback.policy.scheduling.no-upcoming-snapshots": "No upcoming snapshots", + "feedback.policy.scheduling.snapshot-frequency": "Snapshot Frequency", + "feedback.policy.scheduling.snapshot-frequency-help": "How frequently to create snapshots in KopiaUI or Kopia server (has no effect outside of the server mode)", + "feedback.policy.scheduling.times-of-day": "Times Of Day", + "feedback.policy.scheduling.times-of-day-help": "Create snapshots at the specified times of day (24hr format)", + "feedback.policy.scheduling.times-of-day-hint": "e.g. 17:00", + "feedback.policy.scheduling.upcoming": "Upcoming", + "feedback.policy.scheduling.upcoming-snapshots": "Upcoming Snapshots", + "feedback.policy.scheduling.upcoming-snapshots-help": "Times of upcoming snapshots calculated based on policy parameters", + "feedback.policy.time-of-day.invalid": "Invalid time of day: {{tod}}", "feedback.policy.timeout-help": "Timeout in seconds before Kopia kills the process", + "feedback.policy.upload.maximum-parallel-file-reads": "Maximum Parallel File Reads", + "feedback.policy.upload.maximum-parallel-file-reads-help": "Maximum number of files that will be read in parallel (defaults to the number of logical processors)", + "feedback.policy.upload.maximum-parallel-file-reads-hint": "max number of parallel file reads", + "feedback.policy.upload.maximum-parallel-snapshots": "Maximum Parallel Snapshots", + "feedback.policy.upload.maximum-parallel-snapshots-help": "Maximum number of snapshots that can be uploaded simultaneously", + "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "max number of parallel snapshots", + "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "must be specified using global, user, or host policy", "feedback.provider.azure-blob-storage": "Azure Blob Storage", "feedback.provider.backblaze-b2": "Backblaze B2", "feedback.provider.google-cloud-storage": "Google Cloud Storage", @@ -138,13 +199,18 @@ "feedback.repository.repository-description-help": "Helps to distinguish between multiple connected repositories", "feedback.repository.repository-description-hint": "Enter repository description", "feedback.repository.repository-token-enter": "Enter Repository Token", + "feedback.snapshot.status.overdue": "overdue", "feedback.tab.policies": "Policies", "feedback.tab.preferences": "Preferences", "feedback.tab.repository": "Repository", "feedback.tab.repository-is-not-connected": "Repository is not connected", "feedback.tab.snapshots": "Snapshots", "feedback.tab.tasks": "Tasks", + "feedback.task.canceled-after": "Canceled after", "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} excluded) Files: {{files}} ({{files.excluded}} excluded) Directories: {{directories}} ({{directories.excluded}} excluded) Errors: {{errors}} ({{errors.ignored}} ignored)", + "feedback.task.failed-after": "Failed after", + "feedback.task.finished-in": "Finished in", + "feedback.task.running-for": "Running for", "feedback.task.total": "Total", "feedback.ui.appearance": "Appearance", "feedback.ui.appearance-help": "Specifies the appearance of the user interface", @@ -378,6 +444,8 @@ "validation.provider.user": "User", "validation.provider.user-hint": "User name", "value.algorithm.eco-disabled": "Disabled", + "value.algorithm.suffix-not-recommended": "(NOT RECOMMENDED)", + "value.algorithm.suffix-recommended": "(RECOMMENDED)", "value.log.details-0-no-output": "0 - no output", "value.log.details-1-minimal-details": "1 - minimal details", "value.log.details-10-maximum-details": "10 - maximum details", @@ -392,6 +460,14 @@ "value.provider.s3.no-tls-verification": "Do not verify TLS certificate", "value.repository.format.latest": "Latest format", "value.repository.format.legacy": "Legacy format compatible with v0.8", + "value.snapshot-frequency.10-minutes": "every 10 minutes", + "value.snapshot-frequency.12-hours": "every 12 hours", + "value.snapshot-frequency.15-minutes": "every 15 minutes", + "value.snapshot-frequency.20-minutes": "every 20 minutes", + "value.snapshot-frequency.3-hours": "every 3 hours", + "value.snapshot-frequency.30-minutes": "every 30 minutes", + "value.snapshot-frequency.6-hours": "every 6 hours", + "value.snapshot-frequency.hour": "every hour", "value.ui.appearance-large": "large", "value.ui.appearance-medium": "medium", "value.ui.appearance-small": "small", diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index d1e6c2c5..2e5c85e1 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -8,6 +8,8 @@ "common.next": "Próximo", "common.return": "Volver", "enter-object-name-prefix-or-leave-empty-hint": "Introduzca el prefijo del nombre del objeto o déjelo vacío", + "event.cli.copy-to-clipboard": "Copiar al portapapeles", + "event.cli.show-cli-equivalent": "Haga clic para mostrar el equivalente de CLI", "event.description.cancel": "Cancelar", "event.description.new": "Ingrese una nueva descripción", "event.description.remove": "Eliminar descripción", @@ -19,14 +21,21 @@ "event.pin.remove": "Quitar pin", "event.pin.snapshot-pin": "Instantánea de pin", "event.pin.update": "Actualizar PIN", + "event.policy.delete": "Eliminar política", + "event.policy.edit": "Editar", + "event.policy.save": "Guardar política", + "event.policy.set": "Establecer política", "event.repository.advanced-options-hide": "Ocultar opciones avanzadas", "event.repository.advanced-options.show": "Mostrar opciones avanzadas", "event.repository.connect-to-repository": "Conectarse al repositorio", "event.repository.create-repository": "Crear repositorio", + "event.task.cancel": "Cancelar tarea", "feedback.description.modal-title": "Descripción de la instantánea", + "feedback.error.common": "Error", "feedback.error.connection": "Error de conexión:", "feedback.header.actions": "Comportamiento", "feedback.header.defined": "Definido", + "feedback.header.details": "Detalles", "feedback.header.directories": "Directorios", "feedback.header.effective": "Eficaz", "feedback.header.files": "Archivos", @@ -38,6 +47,16 @@ "feedback.header.username": "Nombre de usuario", "feedback.pin.name": "nombre del pin", "feedback.pin.standard-text": "no borres", + "feedback.policy.action.command-mode": "Modo de comando", + "feedback.policy.actions.after-folder": "Después de la carpeta", + "feedback.policy.actions.after-folder-help": "Script para ejecutar después de la carpeta", + "feedback.policy.actions.after-snapshot": "Después de la instantánea", + "feedback.policy.actions.after-snapshot-help": "Script para ejecutar después de la instantánea", + "feedback.policy.actions.before-folder": "Antes de la carpeta", + "feedback.policy.actions.before-folder-help": "Script para ejecutar antes de la carpeta", + "feedback.policy.actions.before-snapshot": "Antes de la instantánea", + "feedback.policy.actions.before-snapshot-help": "Script para ejecutar antes de la instantánea", + "feedback.policy.actions.timeout": "Se acabó el tiempo", "feedback.policy.command-mode-help": "Esencial (debe tener éxito; comportamiento predeterminado), opcional (se toleran los errores) o asíncrono (Kopia iniciará la acción pero no esperará a que finalice)", "feedback.policy.compression.compression-algorithm": "Algoritmo de compresión", "feedback.policy.compression.compression-algorithm-help": "Especifique el algoritmo de compresión que se utilizará al tomar instantáneas de archivos en este directorio y subdirectorios.", @@ -54,7 +73,8 @@ "feedback.policy.compression.only-compress-extensions-help": "Comprima únicamente archivos con las siguientes extensiones de archivo (una extensión por línea)", "feedback.policy.compression.only-compress-extensions-hint": "p.ej. *.txt", "feedback.policy.confirm-delete-policy": "¿Está seguro de que desea eliminar esta política?", - "feedback.policy.defined-by-this-policy": "(Definido por esta política)", + "feedback.policy.defined-by": "Definido por", + "feedback.policy.defined-by-this-policy": "Definido por esta política", "feedback.policy.error-delete-policy": "Error al eliminar la política", "feedback.policy.error-handling.ignore-directory-errors": "Ignorar errores de directorio", "feedback.policy.error-handling.ignore-directory-errors-help": "Trate los errores de lectura de directorio como no fatales.", @@ -64,6 +84,7 @@ "feedback.policy.error-handling.ignore-unknown-directories-help": "Trate las entradas de directorio no reconocidas/no admitidas como errores no fatales.", "feedback.policy.error-saving-policy": "Error al guardar la política", "feedback.policy.files.ignore-files": "Ignorar archivos", + "feedback.policy.files.ignore-files-help": "Lista de nombres de archivos y directorios para ignorar.
Consulte la documentación sobre cómo ignorar archivos.", "feedback.policy.files.ignore-files-hint": "p.ej. /archivo.txt", "feedback.policy.files.ignore-rule-files": "Ignorar archivos de reglas", "feedback.policy.files.ignore-rule-files-from-parent-directories": "Ignorar archivos de reglas de directorios principales", @@ -86,6 +107,22 @@ "feedback.policy.header.snapshot-action": "Acciones de instantáneas", "feedback.policy.header.snapshot-retention": "Retención de instantáneas", "feedback.policy.header.upload": "Subir", + "feedback.policy.logging.cache-hit": "Golpe de caché", + "feedback.policy.logging.cache-hit-help": "Registrar detalle cuando se utiliza un caché en lugar de cargar el archivo", + "feedback.policy.logging.cache-miss": "Falta de caché", + "feedback.policy.logging.cache-miss-help": "Detalle del registro cuando no se puede usar un caché y se debe aplicar hash a un archivo", + "feedback.policy.logging.directory-ignored": "Directorio ignorado", + "feedback.policy.logging.directory-ignored-help": "Registrar detalle cuando se ignora un directorio", + "feedback.policy.logging.directory-snapshotted": "Directorio fotografiado", + "feedback.policy.logging.directory-snapshotted-help": "Registrar la detalle cuando se toma una instantánea de un directorio", + "feedback.policy.logging.file-ignored": "Archivo ignorado", + "feedback.policy.logging.file-ignored-help": "Registrar la detalle cuando se ignora un archivo, enlace simbólico, etc.", + "feedback.policy.logging.file-snapshotted": "Archivo capturado", + "feedback.policy.logging.file-snapshotted-help": "Registre la detalle cuando se toma una instantánea de un archivo, enlace simbólico, etc.", + "feedback.policy.other.disable-parent-policy-evaluation": "Deshabilitar la evaluación de la política principal", + "feedback.policy.other.disable-parent-policy-evaluation-help": "Evita que las políticas principales afecten a este directorio y sus subdirectorios", + "feedback.policy.other.json-representation": "Representación JSON", + "feedback.policy.other.json-representation-help": "Esta es la representación interna de una política.", "feedback.policy.retention.annual-snapshot-retain": "Anual", "feedback.policy.retention.annual-snapshot-retain-help": "Cuántas instantáneas anuales conservar por fuente. \nSe conservará la última instantánea de cada año calendario.", "feedback.policy.retention.annual-snapshot-retain-hint": "Número de instantáneas anuales", @@ -106,7 +143,31 @@ "feedback.policy.retention.weekly-snapshot-retain": "Semanalmente", "feedback.policy.retention.weekly-snapshot-retain-help": "Cuántas instantáneas semanales conservar por fuente. \nSe conservará la última instantánea de cada semana.", "feedback.policy.retention.weekly-snapshot-retain-hint": "Número de instantáneas semanales", + "feedback.policy.scheduling.cron-expressions": "Expresiones cron", + "feedback.policy.scheduling.cron-expressions-hint": "minuto hora día mes día laborable", + "feedback.policy.scheduling.cron-help": "Programaciones de instantáneas utilizando la sintaxis crontab de UNIX (una por línea):
Consulte detalles de los formatos admitidos.", + "feedback.policy.scheduling.manual-snapshots-only": "Solo instantáneas manuales", + "feedback.policy.scheduling.manual-snapshots-only-help": "Cree instantáneas solo manualmente (deshabilita las instantáneas programadas)", + "feedback.policy.scheduling.missed-snapshots-startup": "Ejecute instantáneas perdidas al iniciar", + "feedback.policy.scheduling.missed-snapshots-startup-help": "Ejecute inmediatamente cualquier instantánea perdida cuando se inicie kopia (solo relevante para instantáneas de la hora del día)", + "feedback.policy.scheduling.no-upcoming-snapshots": "No hay instantáneas próximas", + "feedback.policy.scheduling.snapshot-frequency": "Frecuencia de instantáneas", + "feedback.policy.scheduling.snapshot-frequency-help": "Con qué frecuencia crear instantáneas en KopiaUI o el servidor Kopia (no tiene efecto fuera del modo servidor)", + "feedback.policy.scheduling.times-of-day": "Tiempos del Día", + "feedback.policy.scheduling.times-of-day-help": "Cree instantáneas a las horas especificadas del día (formato de 24 horas)", + "feedback.policy.scheduling.times-of-day-hint": "p.ej. 17:00", + "feedback.policy.scheduling.upcoming": "Próximo", + "feedback.policy.scheduling.upcoming-snapshots": "Próximas instantáneas", + "feedback.policy.scheduling.upcoming-snapshots-help": "Horarios de las próximas instantáneas calculados en función de los parámetros de la política", + "feedback.policy.time-of-day.invalid": "Hora del día no válida: {{tod}}", "feedback.policy.timeout-help": "Tiempo de espera en segundos antes de que Kopia finalice el proceso", + "feedback.policy.upload.maximum-parallel-file-reads": "Lecturas máximas de archivos paralelos", + "feedback.policy.upload.maximum-parallel-file-reads-help": "Número máximo de archivos que se leerán en paralelo (el valor predeterminado es el número de procesadores lógicos)", + "feedback.policy.upload.maximum-parallel-file-reads-hint": "número máximo de lecturas de archivos paralelos", + "feedback.policy.upload.maximum-parallel-snapshots": "Instantáneas paralelas máximas", + "feedback.policy.upload.maximum-parallel-snapshots-help": "Número máximo de instantáneas que se pueden cargar simultáneamente", + "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "número máximo de instantáneas paralelas", + "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "debe especificarse mediante la política global, de usuario o de host", "feedback.provider.azure-blob-storage": "Almacenamiento de blobs de Azure", "feedback.provider.backblaze-b2": "Resplandor B2", "feedback.provider.google-cloud-storage": "Almacenamiento en la nube de Google", @@ -138,13 +199,18 @@ "feedback.repository.repository-description-help": "Ayuda a distinguir entre múltiples repositorios conectados", "feedback.repository.repository-description-hint": "Ingrese la descripción del repositorio", "feedback.repository.repository-token-enter": "Ingrese el token del repositorio", + "feedback.snapshot.status.overdue": "atrasado", "feedback.tab.policies": "Políticas", "feedback.tab.preferences": "Preferencias", "feedback.tab.repository": "Depósito", "feedback.tab.repository-is-not-connected": "El repositorio no está conectado", "feedback.tab.snapshots": "Copias de respaldo", "feedback.tab.tasks": "Tareas", + "feedback.task.canceled-after": "Cancelado después", "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} excluido) Files: {{files}} ({{files.excluded}} excluido) Directories: {{directories}} ({{directories.excluded}} excluido) Errors: {{errors}} ({{errors.ignored}} ignorado)", + "feedback.task.failed-after": "falló después", + "feedback.task.finished-in": "Terminado en", + "feedback.task.running-for": "Corriendo para", "feedback.task.total": "Total", "feedback.ui.appearance": "Apariencia", "feedback.ui.appearance-help": "Especifica la apariencia de la interfaz de usuario", @@ -378,6 +444,8 @@ "validation.provider.user": "Usuario", "validation.provider.user-hint": "Nombre de usuario", "value.algorithm.eco-disabled": "Desactivado", + "value.algorithm.suffix-not-recommended": "(NO RECOMENDADO)", + "value.algorithm.suffix-recommended": "(RECOMENDADO)", "value.log.details-0-no-output": "0 - sin salida", "value.log.details-1-minimal-details": "1 - detalles mínimos", "value.log.details-10-maximum-details": "10 - detalles máximos", @@ -392,6 +460,14 @@ "value.provider.s3.no-tls-verification": "No verificar el certificado TLS", "value.repository.format.latest": "Último formato", "value.repository.format.legacy": "Formato heredado compatible con v0.8", + "value.snapshot-frequency.10-minutes": "cada 10 minutos", + "value.snapshot-frequency.12-hours": "cada 12 horas", + "value.snapshot-frequency.15-minutes": "cada 15 minutos", + "value.snapshot-frequency.20-minutes": "cada 20 minutos", + "value.snapshot-frequency.3-hours": "cada 3 horas", + "value.snapshot-frequency.30-minutes": "cada 30 minutos", + "value.snapshot-frequency.6-hours": "cada 6 horas", + "value.snapshot-frequency.hour": "cada hora", "value.ui.appearance-large": "grande", "value.ui.appearance-medium": "mediano", "value.ui.appearance-small": "pequeño", diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 098929fd..226dd830 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -8,6 +8,8 @@ "common.next": "Suivant", "common.return": "Retour", "enter-object-name-prefix-or-leave-empty-hint": "Entrez le préfixe du nom de l'objet ou laissez vide", + "event.cli.copy-to-clipboard": "Copier dans le presse-papier", + "event.cli.show-cli-equivalent": "Cliquez pour afficher l'équivalent CLI", "event.description.cancel": "Annuler", "event.description.new": "Entrez une nouvelle description", "event.description.remove": "Supprimer la description", @@ -19,14 +21,21 @@ "event.pin.remove": "Supprimer l'épingle", "event.pin.snapshot-pin": "Épingler un instantané", "event.pin.update": "Mettre à jour l'épingle", + "event.policy.delete": "Supprimer la stratégie", + "event.policy.edit": "Modifier", + "event.policy.save": "Enregistrer la politique", + "event.policy.set": "Définir la politique", "event.repository.advanced-options-hide": "Masquer les options avancées", "event.repository.advanced-options.show": "Montrer les options avancées", "event.repository.connect-to-repository": "Se connecter au référentiel", "event.repository.create-repository": "Créer un référentiel", + "event.task.cancel": "Annuler la tâche", "feedback.description.modal-title": "Description de l'instantané", + "feedback.error.common": "Erreur", "feedback.error.connection": "Erreur de connexion :", "feedback.header.actions": "Actions", "feedback.header.defined": "Défini", + "feedback.header.details": "Détails", "feedback.header.directories": "Annuaires", "feedback.header.effective": "Efficace", "feedback.header.files": "Des dossiers", @@ -38,6 +47,16 @@ "feedback.header.username": "Nom d'utilisateur", "feedback.pin.name": "Nom de la broche", "feedback.pin.standard-text": "ne pas supprimer", + "feedback.policy.action.command-mode": "Mode commande", + "feedback.policy.actions.after-folder": "Après le dossier", + "feedback.policy.actions.after-folder-help": "Script à exécuter après le dossier", + "feedback.policy.actions.after-snapshot": "Après l'instantané", + "feedback.policy.actions.after-snapshot-help": "Script à exécuter après l'instantané", + "feedback.policy.actions.before-folder": "Avant le dossier", + "feedback.policy.actions.before-folder-help": "Script à exécuter avant le dossier", + "feedback.policy.actions.before-snapshot": "Avant l'instantané", + "feedback.policy.actions.before-snapshot-help": "Script à exécuter avant l'instantané", + "feedback.policy.actions.timeout": "Temps mort", "feedback.policy.command-mode-help": "Essentiel (doit réussir ; comportement par défaut), facultatif (les échecs sont tolérés) ou asynchrone (Kopia démarrera l'action mais n'attendra pas qu'elle se termine)", "feedback.policy.compression.compression-algorithm": "Algorithme de compression", "feedback.policy.compression.compression-algorithm-help": "Spécifiez l'algorithme de compression à utiliser lors de la capture instantanée des fichiers dans ce répertoire et ses sous-répertoires.", @@ -54,7 +73,8 @@ "feedback.policy.compression.only-compress-extensions-help": "Compressez uniquement les fichiers avec les extensions de fichiers suivantes (une extension par ligne)", "feedback.policy.compression.only-compress-extensions-hint": "par exemple. *.txt", "feedback.policy.confirm-delete-policy": "Êtes-vous sûr de vouloir supprimer cette stratégie ?", - "feedback.policy.defined-by-this-policy": "(Défini par cette politique)", + "feedback.policy.defined-by": "Défini par", + "feedback.policy.defined-by-this-policy": "Défini par cette politique", "feedback.policy.error-delete-policy": "Erreur lors de la suppression de la stratégie", "feedback.policy.error-handling.ignore-directory-errors": "Ignorer les erreurs de répertoire", "feedback.policy.error-handling.ignore-directory-errors-help": "Traitez les erreurs de lecture de répertoire comme non fatales.", @@ -64,6 +84,7 @@ "feedback.policy.error-handling.ignore-unknown-directories-help": "Traitez les entrées de répertoire non reconnues/non prises en charge comme des erreurs non fatales.", "feedback.policy.error-saving-policy": "Politique d'enregistrement des erreurs", "feedback.policy.files.ignore-files": "Ignorer les fichiers", + "feedback.policy.files.ignore-files-help": "Liste des noms de fichiers et de répertoires à ignorer.
Voir la documentation sur l'ignorance des fichiers.", "feedback.policy.files.ignore-files-hint": "par exemple. /fichier.txt", "feedback.policy.files.ignore-rule-files": "Ignorer les fichiers de règles", "feedback.policy.files.ignore-rule-files-from-parent-directories": "Ignorer les fichiers de règles des répertoires parents", @@ -86,6 +107,22 @@ "feedback.policy.header.snapshot-action": "Actions d'instantané", "feedback.policy.header.snapshot-retention": "Conservation des instantanés", "feedback.policy.header.upload": "Télécharger", + "feedback.policy.logging.cache-hit": "Accès au cache", + "feedback.policy.logging.cache-hit-help": "Consigner la verbosité lorsqu'un cache est utilisé au lieu de télécharger le fichier", + "feedback.policy.logging.cache-miss": "Manque de cache", + "feedback.policy.logging.cache-miss-help": "Enregistrer la verbosité lorsqu'un cache ne peut pas être utilisé et qu'un fichier doit être haché", + "feedback.policy.logging.directory-ignored": "Répertoire ignoré", + "feedback.policy.logging.directory-ignored-help": "Consigner la verbosité lorsqu'un répertoire est ignoré", + "feedback.policy.logging.directory-snapshotted": "Répertoire instantané", + "feedback.policy.logging.directory-snapshotted-help": "Consigner la verbosité lorsqu'un répertoire est instantané", + "feedback.policy.logging.file-ignored": "Fichier ignoré", + "feedback.policy.logging.file-ignored-help": "Consigner la verbosité lorsqu'un fichier, un lien symbolique, etc. est ignoré", + "feedback.policy.logging.file-snapshotted": "Fichier instantané", + "feedback.policy.logging.file-snapshotted-help": "Consigner la verbosité lorsqu'un fichier, un lien symbolique, etc. est capturé", + "feedback.policy.other.disable-parent-policy-evaluation": "Désactiver l'évaluation de la stratégie parentale", + "feedback.policy.other.disable-parent-policy-evaluation-help": "Empêche toute stratégie parent d'affecter ce répertoire et ses sous-répertoires", + "feedback.policy.other.json-representation": "Représentation JSON", + "feedback.policy.other.json-representation-help": "C'est la représentation interne d'une politique", "feedback.policy.retention.annual-snapshot-retain": "Annuel", "feedback.policy.retention.annual-snapshot-retain-help": "Combien d’instantanés annuels conserver par source. \nLe dernier instantané de chaque année civile sera conservé", "feedback.policy.retention.annual-snapshot-retain-hint": "Nombre d'instantanés annuels", @@ -106,7 +143,31 @@ "feedback.policy.retention.weekly-snapshot-retain": "Hebdomadaire", "feedback.policy.retention.weekly-snapshot-retain-help": "Combien d’instantanés hebdomadaires conserver par source. \nLe dernier instantané de chaque semaine sera conservé", "feedback.policy.retention.weekly-snapshot-retain-hint": "Nombre d'instantanés hebdomadaires", + "feedback.policy.scheduling.cron-expressions": "Expressions Cron", + "feedback.policy.scheduling.cron-expressions-hint": "minute heure jour mois jour de la semaine", + "feedback.policy.scheduling.cron-help": "Planifications d'instantanés utilisant la syntaxe crontab UNIX (une par ligne) :
Voir les détails sur les formats pris en charge.", + "feedback.policy.scheduling.manual-snapshots-only": "Instantanés manuels uniquement", + "feedback.policy.scheduling.manual-snapshots-only-help": "Créez uniquement des instantanés manuellement (désactive les instantanés planifiés)", + "feedback.policy.scheduling.missed-snapshots-startup": "Exécuter des instantanés manqués au démarrage", + "feedback.policy.scheduling.missed-snapshots-startup-help": "Exécutez immédiatement tous les instantanés manqués au démarrage de kopia (uniquement pertinent pour les instantanés d'heure)", + "feedback.policy.scheduling.no-upcoming-snapshots": "Aucun instantané à venir", + "feedback.policy.scheduling.snapshot-frequency": "Fréquence des instantanés", + "feedback.policy.scheduling.snapshot-frequency-help": "À quelle fréquence créer des instantanés dans KopiaUI ou le serveur Kopia (n'a aucun effet en dehors du mode serveur)", + "feedback.policy.scheduling.times-of-day": "Heures du jour", + "feedback.policy.scheduling.times-of-day-help": "Créez des instantanés aux heures spécifiées de la journée (format 24 heures)", + "feedback.policy.scheduling.times-of-day-hint": "par exemple. 17h00", + "feedback.policy.scheduling.upcoming": "A venir", + "feedback.policy.scheduling.upcoming-snapshots": "Instantanés à venir", + "feedback.policy.scheduling.upcoming-snapshots-help": "Heures des instantanés à venir calculées en fonction des paramètres de politique", + "feedback.policy.time-of-day.invalid": "Heure de la journée non valide : {{tod}}", "feedback.policy.timeout-help": "Délai d'attente en secondes avant que Kopia ne tue le processus", + "feedback.policy.upload.maximum-parallel-file-reads": "Nombre maximal de lectures de fichiers parallèles", + "feedback.policy.upload.maximum-parallel-file-reads-help": "Nombre maximum de fichiers qui seront lus en parallèle (par défaut, le nombre de processeurs logiques)", + "feedback.policy.upload.maximum-parallel-file-reads-hint": "nombre maximum de lectures de fichiers parallèles", + "feedback.policy.upload.maximum-parallel-snapshots": "Nombre maximal d'instantanés parallèles", + "feedback.policy.upload.maximum-parallel-snapshots-help": "Nombre maximum d'instantanés pouvant être téléchargés simultanément", + "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "nombre maximum d'instantanés parallèles", + "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "doit être spécifié à l'aide d'une stratégie globale, utilisateur ou hôte", "feedback.provider.azure-blob-storage": "Stockage Blob Azure", "feedback.provider.backblaze-b2": "Backblaze B2", "feedback.provider.google-cloud-storage": "Stockage Google Cloud", @@ -138,13 +199,18 @@ "feedback.repository.repository-description-help": "Aide à distinguer plusieurs référentiels connectés", "feedback.repository.repository-description-hint": "Entrez la description du référentiel", "feedback.repository.repository-token-enter": "Entrez le jeton de référentiel", + "feedback.snapshot.status.overdue": "en retard", "feedback.tab.policies": "Politiques", "feedback.tab.preferences": "Préférences", "feedback.tab.repository": "Répertoire", "feedback.tab.repository-is-not-connected": "Le référentiel n'est pas connecté", "feedback.tab.snapshots": "Instantanés", "feedback.tab.tasks": "Tâches", + "feedback.task.canceled-after": "Annulé après", "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} exclu) Files: {{files}} ({{files.excluded}} exclu) Directories: {{directories}} ({{directories.excluded}} exclu) Errors: {{errors}} ({{errors.ignored}} ignoré)", + "feedback.task.failed-after": "Échec après", + "feedback.task.finished-in": "Terminé en", + "feedback.task.running-for": "Courir pour", "feedback.task.total": "Total", "feedback.ui.appearance": "Apparence", "feedback.ui.appearance-help": "Spécifie l'apparence de l'interface utilisateur", @@ -378,6 +444,8 @@ "validation.provider.user": "Utilisateur", "validation.provider.user-hint": "Nom d'utilisateur", "value.algorithm.eco-disabled": "Désactivé", + "value.algorithm.suffix-not-recommended": "(NON RECOMMANDÉ)", + "value.algorithm.suffix-recommended": "(RECOMMANDÉ)", "value.log.details-0-no-output": "0 - aucune sortie", "value.log.details-1-minimal-details": "1 - détails minimes", "value.log.details-10-maximum-details": "10 - détails maximum", @@ -392,6 +460,14 @@ "value.provider.s3.no-tls-verification": "Ne pas vérifier le certificat TLS", "value.repository.format.latest": "Dernier format", "value.repository.format.legacy": "Format hérité compatible avec la v0.8", + "value.snapshot-frequency.10-minutes": "toutes les 10 minutes", + "value.snapshot-frequency.12-hours": "toutes les 12 heures", + "value.snapshot-frequency.15-minutes": "toutes les 15 minutes", + "value.snapshot-frequency.20-minutes": "toutes les 20 minutes", + "value.snapshot-frequency.3-hours": "toutes les 3 heures", + "value.snapshot-frequency.30-minutes": "toutes les 30 minutes", + "value.snapshot-frequency.6-hours": "toutes les 6 heures", + "value.snapshot-frequency.hour": "Toutes les heures", "value.ui.appearance-large": "grande", "value.ui.appearance-medium": "moyenne", "value.ui.appearance-small": "petite", diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index 6d6bd892..02a54300 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -8,6 +8,8 @@ "common.next": "Prossimo", "common.return": "Ritorno", "enter-object-name-prefix-or-leave-empty-hint": "Inserisci il prefisso del nome dell'oggetto o lascia vuoto", + "event.cli.copy-to-clipboard": "Copia negli appunti", + "event.cli.show-cli-equivalent": "Fare clic per mostrare l'equivalente CLI", "event.description.cancel": "Annulla", "event.description.new": "Inserisci una nuova descrizione", "event.description.remove": "Rimuovi descrizione", @@ -19,14 +21,21 @@ "event.pin.remove": "Rimuovi perno", "event.pin.snapshot-pin": "Pin istantanea", "event.pin.update": "Aggiorna perno", + "event.policy.delete": "Elimina politica", + "event.policy.edit": "Modificare", + "event.policy.save": "Salva politica", + "event.policy.set": "Imposta la politica", "event.repository.advanced-options-hide": "Nascondi opzioni avanzate", "event.repository.advanced-options.show": "Mostra opzioni avanzate", "event.repository.connect-to-repository": "Connettiti al deposito", "event.repository.create-repository": "Crea archivio", + "event.task.cancel": "Annulla attività", "feedback.description.modal-title": "Descrizione dell'istantanea", + "feedback.error.common": "Errore", "feedback.error.connection": "Errore di connessione:", "feedback.header.actions": "Azioni", "feedback.header.defined": "Definito", + "feedback.header.details": "Dettagli", "feedback.header.directories": "Directory", "feedback.header.effective": "Efficace", "feedback.header.files": "File", @@ -38,6 +47,16 @@ "feedback.header.username": "Nome utente", "feedback.pin.name": "Nome del perno", "feedback.pin.standard-text": "non cancellare", + "feedback.policy.action.command-mode": "Modalità di comando", + "feedback.policy.actions.after-folder": "Dopo la cartella", + "feedback.policy.actions.after-folder-help": "Script da eseguire dopo la cartella", + "feedback.policy.actions.after-snapshot": "Dopo l'istantanea", + "feedback.policy.actions.after-snapshot-help": "Script da eseguire dopo lo snapshot", + "feedback.policy.actions.before-folder": "Prima della cartella", + "feedback.policy.actions.before-folder-help": "Script da eseguire prima della cartella", + "feedback.policy.actions.before-snapshot": "Prima dell'istantanea", + "feedback.policy.actions.before-snapshot-help": "Script da eseguire prima dello snapshot", + "feedback.policy.actions.timeout": "Tempo scaduto", "feedback.policy.command-mode-help": "Essenziale (deve avere successo; comportamento predefinito), facoltativo (gli errori sono tollerati) o asincrono (Kopia avvierà l'azione ma non aspetterà che finisca)", "feedback.policy.compression.compression-algorithm": "Algoritmo di compressione", "feedback.policy.compression.compression-algorithm-help": "Specificare l'algoritmo di compressione da utilizzare durante lo snapshot dei file in questa directory e nelle sottodirectory", @@ -54,7 +73,8 @@ "feedback.policy.compression.only-compress-extensions-help": "Comprimi solo file con le seguenti estensioni di file (un'estensione per riga)", "feedback.policy.compression.only-compress-extensions-hint": "per esempio. *.txt", "feedback.policy.confirm-delete-policy": "Sei sicuro di voler eliminare questa politica?", - "feedback.policy.defined-by-this-policy": "(Definito da questa politica)", + "feedback.policy.defined-by": "Definito da", + "feedback.policy.defined-by-this-policy": "Definito da questa politica", "feedback.policy.error-delete-policy": "Errore durante l'eliminazione della policy", "feedback.policy.error-handling.ignore-directory-errors": "Ignora gli errori della directory", "feedback.policy.error-handling.ignore-directory-errors-help": "Trattare gli errori di lettura della directory come non fatali.", @@ -64,6 +84,7 @@ "feedback.policy.error-handling.ignore-unknown-directories-help": "Trattare le voci di directory non riconosciute/non supportate come errori non irreversibili.", "feedback.policy.error-saving-policy": "Errore durante il salvataggio della norma", "feedback.policy.files.ignore-files": "Ignora file", + "feedback.policy.files.ignore-files-help": "Elenco di nomi di file e directory da ignorare.
Vedi la documentazione su come ignorare i file.", "feedback.policy.files.ignore-files-hint": "per esempio. /file.txt", "feedback.policy.files.ignore-rule-files": "Ignora file di regole", "feedback.policy.files.ignore-rule-files-from-parent-directories": "Ignora i file delle regole dalle directory principali", @@ -86,6 +107,22 @@ "feedback.policy.header.snapshot-action": "Azioni istantanee", "feedback.policy.header.snapshot-retention": "Conservazione delle istantanee", "feedback.policy.header.upload": "Caricamento", + "feedback.policy.logging.cache-hit": "Hit della cache", + "feedback.policy.logging.cache-hit-help": "Registra la verbosità quando viene utilizzata una cache invece di caricare il file", + "feedback.policy.logging.cache-miss": "Mancata cache", + "feedback.policy.logging.cache-miss-help": "Registra la verbosità quando non è possibile utilizzare una cache ed è necessario sottoporre ad hashing un file", + "feedback.policy.logging.directory-ignored": "Directory ignorata", + "feedback.policy.logging.directory-ignored-help": "Registra la verbosità quando una directory viene ignorata", + "feedback.policy.logging.directory-snapshotted": "Directory istantanea", + "feedback.policy.logging.directory-snapshotted-help": "Registra la verbosità quando viene eseguito lo snapshot di una directory", + "feedback.policy.logging.file-ignored": "File ignorato", + "feedback.policy.logging.file-ignored-help": "Registra la verbosità quando un file, un collegamento simbolico, ecc. viene ignorato", + "feedback.policy.logging.file-snapshotted": "File istantaneo", + "feedback.policy.logging.file-snapshotted-help": "Registra la verbosità quando viene eseguito lo snapshot di un file, di un collegamento simbolico e così via", + "feedback.policy.other.disable-parent-policy-evaluation": "Disabilita la valutazione della policy principale", + "feedback.policy.other.disable-parent-policy-evaluation-help": "Impedisce che eventuali policy principali influenzino questa directory e le relative sottodirectory", + "feedback.policy.other.json-representation": "Rappresentazione JSON", + "feedback.policy.other.json-representation-help": "Questa è la rappresentazione interna di una politica", "feedback.policy.retention.annual-snapshot-retain": "Annuale", "feedback.policy.retention.annual-snapshot-retain-help": "Numero di snapshot annuali da conservare per origine. \nVerrà conservata l'ultima istantanea di ogni anno solare", "feedback.policy.retention.annual-snapshot-retain-hint": "Numero di snapshot annuali", @@ -106,7 +143,31 @@ "feedback.policy.retention.weekly-snapshot-retain": "settimanalmente", "feedback.policy.retention.weekly-snapshot-retain-help": "Numero di snapshot settimanali da conservare per origine. \nVerrà conservata l'ultima istantanea di ogni settimana", "feedback.policy.retention.weekly-snapshot-retain-hint": "Numero di snapshot settimanali", + "feedback.policy.scheduling.cron-expressions": "Espressioni Cron", + "feedback.policy.scheduling.cron-expressions-hint": "minuto ora giorno mese giorno feriale", + "feedback.policy.scheduling.cron-help": "Pianificazioni di istantanee utilizzando la sintassi crontab UNIX (una per riga):
Vedi dettagli sui formati supportati.", + "feedback.policy.scheduling.manual-snapshots-only": "Solo istantanee manuali", + "feedback.policy.scheduling.manual-snapshots-only-help": "Crea istantanee solo manualmente (disabilita le istantanee pianificate)", + "feedback.policy.scheduling.missed-snapshots-startup": "Esegui le istantanee perse all'avvio", + "feedback.policy.scheduling.missed-snapshots-startup-help": "Esegui immediatamente eventuali istantanee perse all'avvio di Kopia (rilevante solo per le istantanee dell'ora del giorno)", + "feedback.policy.scheduling.no-upcoming-snapshots": "Nessuna istantanea imminente", + "feedback.policy.scheduling.snapshot-frequency": "Frequenza dell'istantanea", + "feedback.policy.scheduling.snapshot-frequency-help": "La frequenza con cui creare istantanee in KopiaUI o nel server Kopia (non ha effetto al di fuori della modalità server)", + "feedback.policy.scheduling.times-of-day": "Momenti della giornata", + "feedback.policy.scheduling.times-of-day-help": "Crea istantanee alle ore del giorno specificate (formato 24 ore)", + "feedback.policy.scheduling.times-of-day-hint": "per esempio. 17:00", + "feedback.policy.scheduling.upcoming": "Prossimamente", + "feedback.policy.scheduling.upcoming-snapshots": "Prossime istantanee", + "feedback.policy.scheduling.upcoming-snapshots-help": "Tempi degli snapshot imminenti calcolati in base ai parametri della policy", + "feedback.policy.time-of-day.invalid": "Ora del giorno non valida: {{tod}}", "feedback.policy.timeout-help": "Timeout in secondi prima che Kopia interrompa il processo", + "feedback.policy.upload.maximum-parallel-file-reads": "Numero massimo di letture di file parallele", + "feedback.policy.upload.maximum-parallel-file-reads-help": "Numero massimo di file che verranno letti in parallelo (il valore predefinito è il numero di processori logici)", + "feedback.policy.upload.maximum-parallel-file-reads-hint": "numero massimo di letture di file parallele", + "feedback.policy.upload.maximum-parallel-snapshots": "Numero massimo di istantanee parallele", + "feedback.policy.upload.maximum-parallel-snapshots-help": "Numero massimo di snapshot che possono essere caricati contemporaneamente", + "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "numero massimo di snapshot paralleli", + "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "deve essere specificato utilizzando la policy globale, utente o host", "feedback.provider.azure-blob-storage": "Archiviazione BLOB di Azure", "feedback.provider.backblaze-b2": "Backblaze B2", "feedback.provider.google-cloud-storage": "Archiviazione Google Cloud", @@ -138,13 +199,18 @@ "feedback.repository.repository-description-help": "Aiuta a distinguere tra più repository connessi", "feedback.repository.repository-description-hint": "Inserisci la descrizione del repository", "feedback.repository.repository-token-enter": "Inserisci il token del repository", + "feedback.snapshot.status.overdue": "in ritardo", "feedback.tab.policies": "Politiche", "feedback.tab.preferences": "Preferenze", "feedback.tab.repository": "Repository", "feedback.tab.repository-is-not-connected": "Il repository non è connesso", "feedback.tab.snapshots": "Istantanee", "feedback.tab.tasks": "Attività", + "feedback.task.canceled-after": "Annullato dopo", "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} escluso) Files: {{files}} ({{files.excluded}} escluso) Directories: {{directories}} ({{directories.excluded}} escluso) Errors: {{errors}} ({{errors.ignored}} ignorato)", + "feedback.task.failed-after": "Fallito dopo", + "feedback.task.finished-in": "Finito tra", + "feedback.task.running-for": "Correre per", "feedback.task.total": "Totale", "feedback.ui.appearance": "Aspetto", "feedback.ui.appearance-help": "Specifica l'aspetto dell'interfaccia utente", @@ -378,6 +444,8 @@ "validation.provider.user": "Utente", "validation.provider.user-hint": "Nome utente", "value.algorithm.eco-disabled": "Disabilitato", + "value.algorithm.suffix-not-recommended": "(NON CONSIGLIATO)", + "value.algorithm.suffix-recommended": "(CONSIGLIATO)", "value.log.details-0-no-output": "0 - nessuna uscita", "value.log.details-1-minimal-details": "1 - dettagli minimi", "value.log.details-10-maximum-details": "10 - dettagli massimi", @@ -392,6 +460,14 @@ "value.provider.s3.no-tls-verification": "Non verificare il certificato TLS", "value.repository.format.latest": "Ultimo formato", "value.repository.format.legacy": "Formato legacy compatibile con v0.8", + "value.snapshot-frequency.10-minutes": "ogni 10 minuti", + "value.snapshot-frequency.12-hours": "ogni 12 ore", + "value.snapshot-frequency.15-minutes": "ogni 15 minuti", + "value.snapshot-frequency.20-minutes": "ogni 20 minuti", + "value.snapshot-frequency.3-hours": "ogni 3 ore", + "value.snapshot-frequency.30-minutes": "ogni 30 minuti", + "value.snapshot-frequency.6-hours": "ogni 6 ore", + "value.snapshot-frequency.hour": "ogni ora", "value.ui.appearance-large": "grande", "value.ui.appearance-medium": "medio", "value.ui.appearance-small": "piccolo", diff --git a/public/locales/jp/translation.json b/public/locales/jp/translation.json index 2ae05dd5..8ad2a6bf 100644 --- a/public/locales/jp/translation.json +++ b/public/locales/jp/translation.json @@ -8,6 +8,8 @@ "common.next": "Next", "common.return": "戻る", "enter-object-name-prefix-or-leave-empty-hint": "Enter object name prefix or leave empty", + "event.cli.copy-to-clipboard": "Copy to clipboard", + "event.cli.show-cli-equivalent": "Click to show CLI equivalent", "event.description.cancel": "Cancel", "event.description.new": "Enter new description", "event.description.remove": "Remove Description", @@ -19,14 +21,21 @@ "event.pin.remove": "Remove Pin", "event.pin.snapshot-pin": "Pin Snapshot", "event.pin.update": "Update Pin", + "event.policy.delete": "Delete policy", + "event.policy.edit": "Edit", + "event.policy.save": "Save policy", + "event.policy.set": "Set policy", "event.repository.advanced-options-hide": "Hide Advanced Options", "event.repository.advanced-options.show": "Show Advanced Options", "event.repository.connect-to-repository": "Connect to repository", "event.repository.create-repository": "Create repository", + "event.task.cancel": "Cancel task", "feedback.description.modal-title": "Snapshot Description", + "feedback.error.common": "Error", "feedback.error.connection": "Connect Error:", "feedback.header.actions": "Actions", "feedback.header.defined": "Defined", + "feedback.header.details": "Details", "feedback.header.directories": "Directories", "feedback.header.effective": "Effective", "feedback.header.files": "Files", @@ -38,6 +47,16 @@ "feedback.header.username": "Username", "feedback.pin.name": "Name of the pin", "feedback.pin.standard-text": "do-not-delete", + "feedback.policy.action.command-mode": "Command Mode", + "feedback.policy.actions.after-folder": "After Folder", + "feedback.policy.actions.after-folder-help": "Script to run after folder", + "feedback.policy.actions.after-snapshot": "After Snapshot", + "feedback.policy.actions.after-snapshot-help": "Script to run after snapshot", + "feedback.policy.actions.before-folder": "Before Folder", + "feedback.policy.actions.before-folder-help": "Script to run before folder", + "feedback.policy.actions.before-snapshot": "Before Snapshot", + "feedback.policy.actions.before-snapshot-help": "Script to run before snapshot", + "feedback.policy.actions.timeout": "Timeout", "feedback.policy.command-mode-help": "Essential (must succeed; default behavior), optional (failures are tolerated), or async (Kopia will start the action but not wait for it to finish)", "feedback.policy.compression.compression-algorithm": "Compression Algorithm", "feedback.policy.compression.compression-algorithm-help": "Specify compression algorithm to use when snapshotting files in this directory and subdirectories", @@ -54,7 +73,8 @@ "feedback.policy.compression.only-compress-extensions-help": "Only compress files with the following file extensions (one extension per line)", "feedback.policy.compression.only-compress-extensions-hint": "e.g. *.txt", "feedback.policy.confirm-delete-policy": "Are you sure you want to delete this policy?", - "feedback.policy.defined-by-this-policy": "(Defined by this policy)", + "feedback.policy.defined-by": "Defined by", + "feedback.policy.defined-by-this-policy": "Defined by this policy", "feedback.policy.error-delete-policy": "Error deleting policy", "feedback.policy.error-handling.ignore-directory-errors": "Ignore Directory Errors", "feedback.policy.error-handling.ignore-directory-errors-help": "Treat directory read errors as non-fatal.", @@ -64,6 +84,7 @@ "feedback.policy.error-handling.ignore-unknown-directories-help": "Treat unrecognized/unsupported directory entries as non-fatal errors.", "feedback.policy.error-saving-policy": "Error saving policy", "feedback.policy.files.ignore-files": "Ignore Files", + "feedback.policy.files.ignore-files-help": "List of file and directory names to ignore.
See documentation on ignoring files.", "feedback.policy.files.ignore-files-hint": "e.g. /file.txt", "feedback.policy.files.ignore-rule-files": "Ignore Rule Files", "feedback.policy.files.ignore-rule-files-from-parent-directories": "Ignore Rule Files From Parent Directories", @@ -86,6 +107,22 @@ "feedback.policy.header.snapshot-action": "Snapshot Actions", "feedback.policy.header.snapshot-retention": "Snapshot Retention", "feedback.policy.header.upload": "Upload", + "feedback.policy.logging.cache-hit": "Cache hit", + "feedback.policy.logging.cache-hit-help": "Log verbosity when a cache is used instead of uploading the file", + "feedback.policy.logging.cache-miss": "Cache miss", + "feedback.policy.logging.cache-miss-help": "Log verbosity when a cache cannot be used and a file must be hashed", + "feedback.policy.logging.directory-ignored": "Directory ignored", + "feedback.policy.logging.directory-ignored-help": "Log verbosity when a directory is ignored", + "feedback.policy.logging.directory-snapshotted": "Directory snapshotted", + "feedback.policy.logging.directory-snapshotted-help": "Log verbosity when a directory is snapshotted", + "feedback.policy.logging.file-ignored": "File ignored", + "feedback.policy.logging.file-ignored-help": "Log verbosity when a file, symbolic link, etc. is ignored", + "feedback.policy.logging.file-snapshotted": "File snapshotted", + "feedback.policy.logging.file-snapshotted-help": "Log verbosity when a file, symbolic link, etc. is snapshotted", + "feedback.policy.other.disable-parent-policy-evaluation": "Disable Parent Policy Evaluation", + "feedback.policy.other.disable-parent-policy-evaluation-help": "Prevents any parent policies from affecting this directory and its subdirectories", + "feedback.policy.other.json-representation": "JSON Representation", + "feedback.policy.other.json-representation-help": "This is the internal representation of a policy", "feedback.policy.retention.annual-snapshot-retain": "Annual", "feedback.policy.retention.annual-snapshot-retain-help": "How many annual snapshots to retain per source. The latest snapshot from each calendar year will be retained", "feedback.policy.retention.annual-snapshot-retain-hint": "Number of annual snapshots", @@ -106,7 +143,31 @@ "feedback.policy.retention.weekly-snapshot-retain": "Weekly", "feedback.policy.retention.weekly-snapshot-retain-help": "How many weekly snapshots to retain per source. The latest snapshot from each week will be retained", "feedback.policy.retention.weekly-snapshot-retain-hint": "Number of weekly snapshots", + "feedback.policy.scheduling.cron-expressions": "Cron Expressions", + "feedback.policy.scheduling.cron-expressions-hint": "minute hour day month weekday", + "feedback.policy.scheduling.cron-help": "Snapshot schedules using UNIX crontab syntax (one per line):
See supported format details.", + "feedback.policy.scheduling.manual-snapshots-only": "Manual Snapshots Only", + "feedback.policy.scheduling.manual-snapshots-only-help": "Only create snapshots manually (disables scheduled snapshots)", + "feedback.policy.scheduling.missed-snapshots-startup": "Run Missed Snapshots on Startup", + "feedback.policy.scheduling.missed-snapshots-startup-help": "Immediately run any missed snapshots when kopia starts (only relevant for Time-of-day snapshots)", + "feedback.policy.scheduling.no-upcoming-snapshots": "No upcoming snapshots", + "feedback.policy.scheduling.snapshot-frequency": "Snapshot Frequency", + "feedback.policy.scheduling.snapshot-frequency-help": "How frequently to create snapshots in KopiaUI or Kopia server (has no effect outside of the server mode)", + "feedback.policy.scheduling.times-of-day": "Times Of Day", + "feedback.policy.scheduling.times-of-day-help": "Create snapshots at the specified times of day (24hr format)", + "feedback.policy.scheduling.times-of-day-hint": "e.g. 17:00", + "feedback.policy.scheduling.upcoming": "Upcoming", + "feedback.policy.scheduling.upcoming-snapshots": "Upcoming Snapshots", + "feedback.policy.scheduling.upcoming-snapshots-help": "Times of upcoming snapshots calculated based on policy parameters", + "feedback.policy.time-of-day.invalid": "Invalid time of day: {{tod}}", "feedback.policy.timeout-help": "Timeout in seconds before Kopia kills the process", + "feedback.policy.upload.maximum-parallel-file-reads": "Maximum Parallel File Reads", + "feedback.policy.upload.maximum-parallel-file-reads-help": "Maximum number of files that will be read in parallel (defaults to the number of logical processors)", + "feedback.policy.upload.maximum-parallel-file-reads-hint": "max number of parallel file reads", + "feedback.policy.upload.maximum-parallel-snapshots": "Maximum Parallel Snapshots", + "feedback.policy.upload.maximum-parallel-snapshots-help": "Maximum number of snapshots that can be uploaded simultaneously", + "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "max number of parallel snapshots", + "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "must be specified using global, user, or host policy", "feedback.provider.azure-blob-storage": "Azure Blob Storage", "feedback.provider.backblaze-b2": "Backblaze B2", "feedback.provider.google-cloud-storage": "Google Cloud Storage", @@ -138,13 +199,18 @@ "feedback.repository.repository-description-help": "Helps to distinguish between multiple connected repositories", "feedback.repository.repository-description-hint": "Enter repository description", "feedback.repository.repository-token-enter": "Enter Repository Token", + "feedback.snapshot.status.overdue": "overdue", "feedback.tab.policies": "ポリシー", "feedback.tab.preferences": "設定", "feedback.tab.repository": "リポジトリ", "feedback.tab.repository-is-not-connected": "Repository is not connected", "feedback.tab.snapshots": "スナップショット", "feedback.tab.tasks": "タスク", + "feedback.task.canceled-after": "Canceled after", "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} excluded) Files: {{files}} ({{files.excluded}} excluded) Directories: {{directories}} ({{directories.excluded}} excluded) Errors: {{errors}} ({{errors.ignored}} ignored)", + "feedback.task.failed-after": "Failed after", + "feedback.task.finished-in": "Finished in", + "feedback.task.running-for": "Running for", "feedback.task.total": "Total", "feedback.ui.appearance": "外観", "feedback.ui.appearance-help": "ユーザーインターフェースの外観を指定します", @@ -378,6 +444,8 @@ "validation.provider.user": "User", "validation.provider.user-hint": "User name", "value.algorithm.eco-disabled": "Disabled", + "value.algorithm.suffix-not-recommended": "(NOT RECOMMENDED)", + "value.algorithm.suffix-recommended": "(RECOMMENDED)", "value.log.details-0-no-output": "0 - no output", "value.log.details-1-minimal-details": "1 - minimal details", "value.log.details-10-maximum-details": "10 - maximum details", @@ -392,6 +460,14 @@ "value.provider.s3.no-tls-verification": "Do not verify TLS certificate", "value.repository.format.latest": "Latest format", "value.repository.format.legacy": "Legacy format compatible with v0.8", + "value.snapshot-frequency.10-minutes": "every 10 minutes", + "value.snapshot-frequency.12-hours": "every 12 hours", + "value.snapshot-frequency.15-minutes": "every 15 minutes", + "value.snapshot-frequency.20-minutes": "every 20 minutes", + "value.snapshot-frequency.3-hours": "every 3 hours", + "value.snapshot-frequency.30-minutes": "every 30 minutes", + "value.snapshot-frequency.6-hours": "every 6 hours", + "value.snapshot-frequency.hour": "every hour", "value.ui.appearance-large": "大", "value.ui.appearance-medium": "中", "value.ui.appearance-small": "小", diff --git a/public/locales/pl/translation.json b/public/locales/pl/translation.json index 32a3f18c..06a11726 100644 --- a/public/locales/pl/translation.json +++ b/public/locales/pl/translation.json @@ -8,6 +8,8 @@ "common.next": "Następny", "common.return": "Wróć", "enter-object-name-prefix-or-leave-empty-hint": "Wprowadź przedrostek nazwy obiektu lub pozostaw puste", + "event.cli.copy-to-clipboard": "Skopiuj do schowka", + "event.cli.show-cli-equivalent": "Kliknij, aby wyświetlić odpowiednik CLI", "event.description.cancel": "Anulować", "event.description.new": "Wprowadź nowy opis", "event.description.remove": "Usuń opis", @@ -19,14 +21,21 @@ "event.pin.remove": "Usuń pinezkę", "event.pin.snapshot-pin": "Przypnij migawkę", "event.pin.update": "Zaktualizuj Pin", + "event.policy.delete": "Usuń politykę", + "event.policy.edit": "Edytować", + "event.policy.save": "Zapisz politykę", + "event.policy.set": "Ustaw politykę", "event.repository.advanced-options-hide": "Ukryj opcje zaawansowane", "event.repository.advanced-options.show": "Pokaż ustawienia zaawansowane", "event.repository.connect-to-repository": "Połącz się z repozytorium", "event.repository.create-repository": "Utwórz repozytorium", + "event.task.cancel": "Anuluj zadanie", "feedback.description.modal-title": "Opis migawki", + "feedback.error.common": "Błąd", "feedback.error.connection": "Błąd połączenia:", "feedback.header.actions": "działania", "feedback.header.defined": "Zdefiniowane", + "feedback.header.details": "Detale", "feedback.header.directories": "Katalogi", "feedback.header.effective": "Skuteczny", "feedback.header.files": "Akta", @@ -38,6 +47,16 @@ "feedback.header.username": "Nazwa użytkownika", "feedback.pin.name": "Nazwa pinu", "feedback.pin.standard-text": "nie kasuj", + "feedback.policy.action.command-mode": "Tryb poleceń", + "feedback.policy.actions.after-folder": "Po folderze", + "feedback.policy.actions.after-folder-help": "Skrypt uruchamiany po folderze", + "feedback.policy.actions.after-snapshot": "Po migawce", + "feedback.policy.actions.after-snapshot-help": "Skrypt uruchamiany po zrobieniu migawki", + "feedback.policy.actions.before-folder": "Przed folderem", + "feedback.policy.actions.before-folder-help": "Skrypt uruchamiany przed folderem", + "feedback.policy.actions.before-snapshot": "Przed zrzutem ekranu", + "feedback.policy.actions.before-snapshot-help": "Skrypt uruchamiany przed wykonaniem migawki", + "feedback.policy.actions.timeout": "Koniec czasu", "feedback.policy.command-mode-help": "Niezbędny (musi zakończyć się sukcesem; zachowanie domyślne), opcjonalny (awarie są tolerowane) lub asynchroniczny (Kopia rozpocznie akcję, ale nie będzie czekać na jej zakończenie)", "feedback.policy.compression.compression-algorithm": "Algorytm kompresji", "feedback.policy.compression.compression-algorithm-help": "Określ algorytm kompresji, który będzie używany podczas tworzenia migawek plików w tym katalogu i podkatalogach", @@ -54,7 +73,8 @@ "feedback.policy.compression.only-compress-extensions-help": "Kompresuj tylko pliki z następującymi rozszerzeniami (jedno rozszerzenie w linii)", "feedback.policy.compression.only-compress-extensions-hint": "np. *.tekst", "feedback.policy.confirm-delete-policy": "Czy na pewno chcesz usunąć tę politykę?", - "feedback.policy.defined-by-this-policy": "(Określone w tej polityce)", + "feedback.policy.defined-by": "Określony przez", + "feedback.policy.defined-by-this-policy": "Zdefiniowane w tej polityce", "feedback.policy.error-delete-policy": "Błąd podczas usuwania zasady", "feedback.policy.error-handling.ignore-directory-errors": "Ignoruj ​​​​błędy katalogu", "feedback.policy.error-handling.ignore-directory-errors-help": "Traktuj błędy odczytu katalogu jako niekrytyczne.", @@ -64,6 +84,7 @@ "feedback.policy.error-handling.ignore-unknown-directories-help": "Traktuj nierozpoznane/nieobsługiwane wpisy katalogu jako błędy niekrytyczne.", "feedback.policy.error-saving-policy": "Błąd podczas zapisywania zasad", "feedback.policy.files.ignore-files": "Ignoruj ​​pliki", + "feedback.policy.files.ignore-files-help": "Lista nazw plików i katalogów do zignorowania.
Zobacz dokumentację dotyczącą ignorowania plików.", "feedback.policy.files.ignore-files-hint": "np. /plik.txt", "feedback.policy.files.ignore-rule-files": "Ignoruj ​​pliki reguł", "feedback.policy.files.ignore-rule-files-from-parent-directories": "Ignoruj ​​pliki reguł z katalogów nadrzędnych", @@ -86,6 +107,22 @@ "feedback.policy.header.snapshot-action": "Akcje migawki", "feedback.policy.header.snapshot-retention": "Przechowywanie migawek", "feedback.policy.header.upload": "Wgrywać", + "feedback.policy.logging.cache-hit": "Trafienie w pamięć podręczną", + "feedback.policy.logging.cache-hit-help": "Szczegółowość dziennika, gdy zamiast przesyłania pliku używana jest pamięć podręczna", + "feedback.policy.logging.cache-miss": "Brak pamięci podręcznej", + "feedback.policy.logging.cache-miss-help": "Szczegółowość dziennika, gdy nie można użyć pamięci podręcznej i plik musi zostać zaszyfrowany", + "feedback.policy.logging.directory-ignored": "Katalog zignorowany", + "feedback.policy.logging.directory-ignored-help": "Rejestruj szczegółowość, gdy katalog jest ignorowany", + "feedback.policy.logging.directory-snapshotted": "Zrzut katalogu", + "feedback.policy.logging.directory-snapshotted-help": "Szczegółowość dziennika podczas tworzenia migawki katalogu", + "feedback.policy.logging.file-ignored": "Plik zignorowany", + "feedback.policy.logging.file-ignored-help": "Rejestruj szczegółowość, gdy plik, łącze symboliczne itp. jest ignorowane", + "feedback.policy.logging.file-snapshotted": "Zrzut pliku", + "feedback.policy.logging.file-snapshotted-help": "Rejestruj szczegółowość zapisu pliku, łącza symbolicznego itp", + "feedback.policy.other.disable-parent-policy-evaluation": "Wyłącz ocenę zasad nadrzędnych", + "feedback.policy.other.disable-parent-policy-evaluation-help": "Zapobiega wpływowi zasad nadrzędnych na ten katalog i jego podkatalogi", + "feedback.policy.other.json-representation": "Reprezentacja JSON", + "feedback.policy.other.json-representation-help": "Jest to wewnętrzna reprezentacja polityki", "feedback.policy.retention.annual-snapshot-retain": "Coroczny", "feedback.policy.retention.annual-snapshot-retain-help": "Liczba rocznych migawek przechowywanych dla każdego źródła. \nZachowana zostanie najnowsza migawka z każdego roku kalendarzowego", "feedback.policy.retention.annual-snapshot-retain-hint": "Liczba rocznych migawek", @@ -106,7 +143,31 @@ "feedback.policy.retention.weekly-snapshot-retain": "Co tydzień", "feedback.policy.retention.weekly-snapshot-retain-help": "Liczba cotygodniowych migawek przechowywanych dla każdego źródła. \nNajnowsza migawka z każdego tygodnia zostanie zachowana", "feedback.policy.retention.weekly-snapshot-retain-hint": "Liczba cotygodniowych migawek", + "feedback.policy.scheduling.cron-expressions": "Wyrażenia Crona", + "feedback.policy.scheduling.cron-expressions-hint": "minuta godzina dzień miesiąc dzień powszedni", + "feedback.policy.scheduling.cron-help": "Harmonogramy zrzutów ekranu przy użyciu składni crontab UNIX (po jednym w wierszu):
Zobacz szczegóły dotyczące obsługiwanych formatów.", + "feedback.policy.scheduling.manual-snapshots-only": "Tylko ręczne migawki", + "feedback.policy.scheduling.manual-snapshots-only-help": "Twórz migawki tylko ręcznie (wyłącza zaplanowane migawki)", + "feedback.policy.scheduling.missed-snapshots-startup": "Uruchom pominięte migawki podczas uruchamiania", + "feedback.policy.scheduling.missed-snapshots-startup-help": "Natychmiast uruchom wszelkie pominięte migawki po rozpoczęciu kopiowania (dotyczy tylko migawek aktualnych)", + "feedback.policy.scheduling.no-upcoming-snapshots": "Brak nadchodzących migawek", + "feedback.policy.scheduling.snapshot-frequency": "Częstotliwość migawki", + "feedback.policy.scheduling.snapshot-frequency-help": "Jak często tworzyć migawki na serwerze KopiaUI lub Kopia (nie ma wpływu poza trybem serwera)", + "feedback.policy.scheduling.times-of-day": "Pory dnia", + "feedback.policy.scheduling.times-of-day-help": "Twórz migawki o określonych porach dnia (format 24-godzinny)", + "feedback.policy.scheduling.times-of-day-hint": "np. 17:00", + "feedback.policy.scheduling.upcoming": "Nadchodzące", + "feedback.policy.scheduling.upcoming-snapshots": "Nadchodzące migawki", + "feedback.policy.scheduling.upcoming-snapshots-help": "Czasy nadchodzących migawek obliczone na podstawie parametrów zasad", + "feedback.policy.time-of-day.invalid": "Nieprawidłowa godzina: {{tod}}", "feedback.policy.timeout-help": "Limit czasu w sekundach, zanim Kopia zabije proces", + "feedback.policy.upload.maximum-parallel-file-reads": "Maksymalne równoległe odczyty plików", + "feedback.policy.upload.maximum-parallel-file-reads-help": "Maksymalna liczba plików, które będą odczytywane równolegle (domyślnie jest to liczba procesorów logicznych)", + "feedback.policy.upload.maximum-parallel-file-reads-hint": "maksymalna liczba równoległych odczytów plików", + "feedback.policy.upload.maximum-parallel-snapshots": "Maksymalnie równoległe migawki", + "feedback.policy.upload.maximum-parallel-snapshots-help": "Maksymalna liczba migawek, które można przesłać jednocześnie", + "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "maksymalna liczba równoległych migawek", + "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "należy określić przy użyciu zasad globalnych, użytkownika lub hosta", "feedback.provider.azure-blob-storage": "Magazyn obiektów Blob platformy Azure", "feedback.provider.backblaze-b2": "Blask wsteczny B2", "feedback.provider.google-cloud-storage": "Magazyn w chmurze Google", @@ -138,13 +199,18 @@ "feedback.repository.repository-description-help": "Pomaga rozróżnić wiele połączonych repozytoriów", "feedback.repository.repository-description-hint": "Wprowadź opis repozytorium", "feedback.repository.repository-token-enter": "Wprowadź token repozytorium", + "feedback.snapshot.status.overdue": "zaległy", "feedback.tab.policies": "Konfiguracje", "feedback.tab.preferences": "Ustawienia", "feedback.tab.repository": "Repozytorium", "feedback.tab.repository-is-not-connected": "Repozytorium nie jest połączone", "feedback.tab.snapshots": "Kopie", "feedback.tab.tasks": "Zadania", + "feedback.task.canceled-after": "Anulowano po", "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} wyłączony) Files: {{files}} ({{files.excluded}} wyłączony) Directories: {{directories}} ({{directories.excluded}} wyłączony) Errors: {{errors}} ({{errors.ignored}} ignorowany)", + "feedback.task.failed-after": "Nie udało się po", + "feedback.task.finished-in": "Skończono w", + "feedback.task.running-for": "Biegać dla", "feedback.task.total": "Całkowity", "feedback.ui.appearance": "Wielkość tekstu", "feedback.ui.appearance-help": "Wybierz rodzaj czcionki", @@ -378,6 +444,8 @@ "validation.provider.user": "Użytkownik", "validation.provider.user-hint": "Nazwa użytkownika", "value.algorithm.eco-disabled": "Wyłączony", + "value.algorithm.suffix-not-recommended": "(NIEPOLECANE)", + "value.algorithm.suffix-recommended": "(ZALECANA)", "value.log.details-0-no-output": "0 - brak wyjścia", "value.log.details-1-minimal-details": "1 - minimalne szczegóły", "value.log.details-10-maximum-details": "10 - maksimum szczegółów", @@ -392,6 +460,14 @@ "value.provider.s3.no-tls-verification": "Nie weryfikuj certyfikatu TLS", "value.repository.format.latest": "Najnowszy format", "value.repository.format.legacy": "Starszy format zgodny z wersją 0.8", + "value.snapshot-frequency.10-minutes": "co 10 minut", + "value.snapshot-frequency.12-hours": "co 12 godzin", + "value.snapshot-frequency.15-minutes": "co 15 minut", + "value.snapshot-frequency.20-minutes": "co 20 minut", + "value.snapshot-frequency.3-hours": "co 3 godziny", + "value.snapshot-frequency.30-minutes": "co 30 minut", + "value.snapshot-frequency.6-hours": "co 6 godzin", + "value.snapshot-frequency.hour": "co godzinę", "value.ui.appearance-large": "duża", "value.ui.appearance-medium": "średnia", "value.ui.appearance-small": "mała", diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index dda41116..86c2fdc5 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -8,6 +8,8 @@ "common.next": "Следующий", "common.return": "Возврат", "enter-object-name-prefix-or-leave-empty-hint": "Введите префикс имени объекта или оставьте пустым.", + "event.cli.copy-to-clipboard": "Скопировать в буфер обмена", + "event.cli.show-cli-equivalent": "Нажмите, чтобы показать эквивалент CLI", "event.description.cancel": "Отмена", "event.description.new": "Введите новое описание", "event.description.remove": "Удалить описание", @@ -19,14 +21,21 @@ "event.pin.remove": "Удалить булавку", "event.pin.snapshot-pin": "Снимок закрепления", "event.pin.update": "Обновить пин-код", + "event.policy.delete": "Удалить политику", + "event.policy.edit": "Редактировать", + "event.policy.save": "Сохранить политику", + "event.policy.set": "Установить политику", "event.repository.advanced-options-hide": "Скрыть дополнительные параметры", "event.repository.advanced-options.show": "Показать дополнительные параметры", "event.repository.connect-to-repository": "Подключиться к репозиторию", "event.repository.create-repository": "Создать репозиторий", + "event.task.cancel": "Отменить задачу", "feedback.description.modal-title": "Описание снимка", + "feedback.error.common": "Ошибка", "feedback.error.connection": "Ошибка подключения:", "feedback.header.actions": "Действия", "feedback.header.defined": "Определенный", + "feedback.header.details": "Подробности", "feedback.header.directories": "Каталоги", "feedback.header.effective": "Эффективный", "feedback.header.files": "Файлы", @@ -38,6 +47,16 @@ "feedback.header.username": "Имя пользователя", "feedback.pin.name": "Название контакта", "feedback.pin.standard-text": "не удалять", + "feedback.policy.action.command-mode": "Командный режим", + "feedback.policy.actions.after-folder": "После папки", + "feedback.policy.actions.after-folder-help": "Скрипт для запуска после папки", + "feedback.policy.actions.after-snapshot": "После снимка", + "feedback.policy.actions.after-snapshot-help": "Скрипт для запуска после снимка", + "feedback.policy.actions.before-folder": "Перед папкой", + "feedback.policy.actions.before-folder-help": "Скрипт для запуска перед папкой", + "feedback.policy.actions.before-snapshot": "Перед снимком", + "feedback.policy.actions.before-snapshot-help": "Скрипт для запуска перед снимком", + "feedback.policy.actions.timeout": "Тайм-аут", "feedback.policy.command-mode-help": "Необходимое (должно быть успешным; поведение по умолчанию), необязательное (сбои допускаются) или асинхронное (Kopia запускает действие, но не ждет его завершения).", "feedback.policy.compression.compression-algorithm": "Алгоритм сжатия", "feedback.policy.compression.compression-algorithm-help": "Укажите алгоритм сжатия, который будет использоваться при создании снимков файлов в этом каталоге и подкаталогах.", @@ -54,7 +73,8 @@ "feedback.policy.compression.only-compress-extensions-help": "Сжимайте только файлы со следующими расширениями (по одному расширению в строке)", "feedback.policy.compression.only-compress-extensions-hint": "например *.текст", "feedback.policy.confirm-delete-policy": "Вы уверены, что хотите удалить эту политику?", - "feedback.policy.defined-by-this-policy": "(Определено настоящей политикой)", + "feedback.policy.defined-by": "Определяется", + "feedback.policy.defined-by-this-policy": "Определено этой политикой", "feedback.policy.error-delete-policy": "Ошибка удаления политики.", "feedback.policy.error-handling.ignore-directory-errors": "Игнорировать ошибки каталога", "feedback.policy.error-handling.ignore-directory-errors-help": "Считайте ошибки чтения каталога нефатальными.", @@ -64,6 +84,7 @@ "feedback.policy.error-handling.ignore-unknown-directories-help": "Считайте нераспознанные/неподдерживаемые записи каталога нефатальными ошибками.", "feedback.policy.error-saving-policy": "Ошибка сохранения политики.", "feedback.policy.files.ignore-files": "Игнорировать файлы", + "feedback.policy.files.ignore-files-help": "Список имен файлов и каталогов, которые следует игнорировать.
См. документацию по игнорированию файлов.", "feedback.policy.files.ignore-files-hint": "например /file.txt", "feedback.policy.files.ignore-rule-files": "Игнорировать файлы правил", "feedback.policy.files.ignore-rule-files-from-parent-directories": "Игнорировать файлы правил из родительских каталогов", @@ -86,6 +107,22 @@ "feedback.policy.header.snapshot-action": "Действия со снимками", "feedback.policy.header.snapshot-retention": "Хранение моментальных снимков", "feedback.policy.header.upload": "Загрузить", + "feedback.policy.logging.cache-hit": "Попадание в кэш", + "feedback.policy.logging.cache-hit-help": "Подробность журнала, когда вместо загрузки файла используется кеш", + "feedback.policy.logging.cache-miss": "Промах в кэше", + "feedback.policy.logging.cache-miss-help": "Подробность журнала, когда кеш нельзя использовать и файл необходимо хешировать", + "feedback.policy.logging.directory-ignored": "Каталог игнорируется", + "feedback.policy.logging.directory-ignored-help": "Подробность журнала, когда каталог игнорируется", + "feedback.policy.logging.directory-snapshotted": "Снимок каталога", + "feedback.policy.logging.directory-snapshotted-help": "Подробность журнала при создании снимка каталога", + "feedback.policy.logging.file-ignored": "Файл игнорируется", + "feedback.policy.logging.file-ignored-help": "Подробность журнала, когда файл, символическая ссылка и т. д. игнорируются", + "feedback.policy.logging.file-snapshotted": "Снимок файла", + "feedback.policy.logging.file-snapshotted-help": "Подробность журнала при создании моментального снимка файла, символической ссылки и т. д.", + "feedback.policy.other.disable-parent-policy-evaluation": "Отключить оценку родительской политики", + "feedback.policy.other.disable-parent-policy-evaluation-help": "Предотвращает влияние родительских политик на этот каталог и его подкаталоги.", + "feedback.policy.other.json-representation": "JSON-представление", + "feedback.policy.other.json-representation-help": "Это внутреннее представление политики", "feedback.policy.retention.annual-snapshot-retain": "Ежегодный", "feedback.policy.retention.annual-snapshot-retain-help": "Сколько ежегодных снимков следует сохранять для каждого источника. \nПоследний снимок за каждый календарный год будет сохранен.", "feedback.policy.retention.annual-snapshot-retain-hint": "Количество ежегодных снимков", @@ -106,7 +143,31 @@ "feedback.policy.retention.weekly-snapshot-retain": "Еженедельно", "feedback.policy.retention.weekly-snapshot-retain-help": "Сколько еженедельных снимков сохранять для каждого источника. \nПоследний снимок каждой недели будет сохранен.", "feedback.policy.retention.weekly-snapshot-retain-hint": "Количество еженедельных снимков", + "feedback.policy.scheduling.cron-expressions": "Выражения Крон", + "feedback.policy.scheduling.cron-expressions-hint": "минута час день месяц будний день", + "feedback.policy.scheduling.cron-help": "Расписания моментальных снимков с использованием синтаксиса crontab UNIX (по одному на строку):
см. подробности о поддерживаемом формате.", + "feedback.policy.scheduling.manual-snapshots-only": "Только снимки вручную", + "feedback.policy.scheduling.manual-snapshots-only-help": "Создавайте снимки только вручную (отключает запланированные снимки)", + "feedback.policy.scheduling.missed-snapshots-startup": "Запуск пропущенных снимков при запуске", + "feedback.policy.scheduling.missed-snapshots-startup-help": "Немедленно запускайте все пропущенные снимки при запуске kopia (актуально только для снимков по времени).", + "feedback.policy.scheduling.no-upcoming-snapshots": "Нет предстоящих снимков", + "feedback.policy.scheduling.snapshot-frequency": "Частота снимков", + "feedback.policy.scheduling.snapshot-frequency-help": "Как часто создавать снимки на сервере KopiaUI или Kopia (не влияет вне режима сервера)", + "feedback.policy.scheduling.times-of-day": "Время суток", + "feedback.policy.scheduling.times-of-day-help": "Создание снимков в указанное время суток (24-часовой формат)", + "feedback.policy.scheduling.times-of-day-hint": "например 17:00", + "feedback.policy.scheduling.upcoming": "Предстоящие", + "feedback.policy.scheduling.upcoming-snapshots": "Предстоящие снимки", + "feedback.policy.scheduling.upcoming-snapshots-help": "Время предстоящих снимков рассчитывается на основе параметров политики.", + "feedback.policy.time-of-day.invalid": "Неверное время суток: {{tod}}", "feedback.policy.timeout-help": "Тайм-аут в секундах, прежде чем Копия завершит процесс", + "feedback.policy.upload.maximum-parallel-file-reads": "Максимальное параллельное чтение файлов", + "feedback.policy.upload.maximum-parallel-file-reads-help": "Максимальное количество файлов, которые будут читаться параллельно (по умолчанию равно количеству логических процессоров).", + "feedback.policy.upload.maximum-parallel-file-reads-hint": "максимальное количество параллельных чтений файлов", + "feedback.policy.upload.maximum-parallel-snapshots": "Максимальное количество параллельных снимков", + "feedback.policy.upload.maximum-parallel-snapshots-help": "Максимальное количество снимков, которые можно загрузить одновременно", + "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "максимальное количество параллельных снимков", + "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "должно быть указано с использованием глобальной, пользовательской или хостовой политики.", "feedback.provider.azure-blob-storage": "Хранилище BLOB-объектов Azure", "feedback.provider.backblaze-b2": "Бэкблэйз Б2", "feedback.provider.google-cloud-storage": "Облачное хранилище Google", @@ -138,13 +199,18 @@ "feedback.repository.repository-description-help": "Помогает различать несколько подключенных репозиториев.", "feedback.repository.repository-description-hint": "Введите описание репозитория", "feedback.repository.repository-token-enter": "Введите токен репозитория", + "feedback.snapshot.status.overdue": "просроченный", "feedback.tab.policies": "Политики", "feedback.tab.preferences": "Настройки", "feedback.tab.repository": "Репозиторий", "feedback.tab.repository-is-not-connected": "Репозиторий не подключен", "feedback.tab.snapshots": "Снимки", "feedback.tab.tasks": "Задачи", + "feedback.task.canceled-after": "Отменено после", "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} исключено) Files: {{files}} ({{files.excluded}} исключено) Directories: {{directories}} ({{directories.excluded}} исключено) Errors: {{errors}} ({{errors.ignored}} проигнорировал)", + "feedback.task.failed-after": "Не удалось после", + "feedback.task.finished-in": "Закончено через", + "feedback.task.running-for": "Бег за", "feedback.task.total": "Общий", "feedback.ui.appearance": "Внешний вид", "feedback.ui.appearance-help": "Определяет внешний вид пользовательского интерфейса", @@ -378,6 +444,8 @@ "validation.provider.user": "Пользователь", "validation.provider.user-hint": "Имя пользователя", "value.algorithm.eco-disabled": "Неполноценный", + "value.algorithm.suffix-not-recommended": "(НЕ РЕКОМЕНДУЕТСЯ)", + "value.algorithm.suffix-recommended": "(РЕКОМЕНДУЕМЫЕ)", "value.log.details-0-no-output": "0 - нет вывода", "value.log.details-1-minimal-details": "1 - минимум деталей", "value.log.details-10-maximum-details": "10 - максимум деталей", @@ -392,6 +460,14 @@ "value.provider.s3.no-tls-verification": "Не проверять сертификат TLS", "value.repository.format.latest": "Последний формат", "value.repository.format.legacy": "Устаревший формат, совместимый с версией 0.8.", + "value.snapshot-frequency.10-minutes": "каждые 10 минут", + "value.snapshot-frequency.12-hours": "каждые 12 часов", + "value.snapshot-frequency.15-minutes": "каждые 15 минут", + "value.snapshot-frequency.20-minutes": "каждые 20 минут", + "value.snapshot-frequency.3-hours": "каждые 3 часа", + "value.snapshot-frequency.30-minutes": "каждые 30 минут", + "value.snapshot-frequency.6-hours": "каждые 6 часов", + "value.snapshot-frequency.hour": "каждый час", "value.ui.appearance-large": "большой", "value.ui.appearance-medium": "средний", "value.ui.appearance-small": "маленький", diff --git a/src/components/policy-editor/ActionRowMode.jsx b/src/components/policy-editor/ActionRowMode.jsx index 3b52391e..3c186efb 100644 --- a/src/components/policy-editor/ActionRowMode.jsx +++ b/src/components/policy-editor/ActionRowMode.jsx @@ -9,7 +9,7 @@ import i18n from '../../utils/i18n' export function ActionRowMode(component, action) { return - + - + {OptionalNumberField(component, "", "policy." + action, {})} {EffectiveValue(component, action)} ; diff --git a/src/components/policy-editor/PolicyEditor.jsx b/src/components/policy-editor/PolicyEditor.jsx index 6a10633c..33198048 100644 --- a/src/components/policy-editor/PolicyEditor.jsx +++ b/src/components/policy-editor/PolicyEditor.jsx @@ -30,6 +30,7 @@ import { ActionRowScript } from './ActionRowScript'; import { ActionRowTimeout } from './ActionRowTimeout'; import { ActionRowMode } from './ActionRowMode'; import i18n from '../../utils/i18n'; +import { Trans } from 'react-i18next'; export class PolicyEditor extends Component { constructor() { @@ -121,7 +122,7 @@ export class PolicyEditor extends Component { return i18n.t('feedback.policy.defined-by-this-policy'); } - return <>Defined by {PolicyEditorLink(p)}; + return <>{i18n.t('feedback.policy.defined-by')} {PolicyEditorLink(p)}; } getAndValidatePolicy() { @@ -147,7 +148,7 @@ export class PolicyEditor extends Component { for (const tod of l) { if (typeof (tod) !== "object") { // unparsed - throw Error("invalid time of day: '" + tod + "'") + throw Error(i18n.t('feedback.policy.time-of-day.invalid', { 'tod': tod })) } } @@ -301,7 +302,7 @@ export class PolicyEditor extends Component { - List of file and directory names to ignore.
(See documentation on ignoring files).} /> + }} />} /> {StringList(this, "policy.files.ignore", { placeholder: i18n.t('feedback.policy.files.ignore-files-hint') })} {EffectiveTextAreaValue(this, "files.ignore")}
@@ -338,17 +339,17 @@ export class PolicyEditor extends Component { - {OptionalBoolean(this, null, "policy.errorHandling.ignoreDirectoryErrors", i18n.t('value.policy.inherent-from-parent') )} + {OptionalBoolean(this, null, "policy.errorHandling.ignoreDirectoryErrors", i18n.t('value.policy.inherent-from-parent'))} {EffectiveBooleanValue(this, "errorHandling.ignoreDirectoryErrors")} - {OptionalBoolean(this, null, "policy.errorHandling.ignoreFileErrors", i18n.t('value.policy.inherent-from-parent') )} + {OptionalBoolean(this, null, "policy.errorHandling.ignoreFileErrors", i18n.t('value.policy.inherent-from-parent'))} {EffectiveBooleanValue(this, "errorHandling.ignoreFileErrors")} - {OptionalBoolean(this, null, "policy.errorHandling.ignoreUnknownTypes", i18n.t('value.policy.inherent-from-parent') )} + {OptionalBoolean(this, null, "policy.errorHandling.ignoreUnknownTypes", i18n.t('value.policy.inherent-from-parent'))} {EffectiveBooleanValue(this, "errorHandling.ignoreUnknownTypes")}
@@ -401,56 +402,55 @@ export class PolicyEditor extends Component { - + this.handleChange(e, valueToNumber)} value={stateProperty(this, "policy.scheduling.intervalSeconds")}> - - - - - - - - + + + + + + + + {EffectiveValue(this, "scheduling.intervalSeconds")} - + - {TimesOfDayList(this, "policy.scheduling.timeOfDay", { placeholder: "e.g. 17:00" })} + {TimesOfDayList(this, "policy.scheduling.timeOfDay", { placeholder: i18n.t('feedback.policy.scheduling.times-of-day-hint') })} {EffectiveTimesOfDayValue(this, "scheduling.timeOfDay")} - Snapshot schedules using UNIX crontab syntax (one per line): -
See supported format details.} /> + }} />} /> - {StringList(this, "policy.scheduling.cron", { placeholder: "minute hour day month weekday #comment" })} + {StringList(this, "policy.scheduling.cron", { placeholder: i18n.t('feedback.policy.scheduling.cron-expressions-hint') })} {EffectiveListValue(this, "scheduling.cron")}
- + - {OptionalBoolean(this, "", "policy.scheduling.runMissed", "inherit from parent")} + {OptionalBoolean(this, "", "policy.scheduling.runMissed", i18n.t('value.policy.inherent-from-parent'))} {EffectiveBooleanValue(this, "scheduling.runMissed")} - + - {OptionalBoolean(this, "", "policy.scheduling.manual", "inherit from parent")} + {OptionalBoolean(this, "", "policy.scheduling.manual", i18n.t('value.policy.inherent-from-parent'))} {EffectiveBooleanValue(this, "scheduling.manual")} - + @@ -464,14 +464,14 @@ export class PolicyEditor extends Component { - - {OptionalNumberField(this, "", "policy.upload.maxParallelSnapshots", { placeholder: !this.props.path ? "max number of parallel snapshots" : "must be specified using global, user, or host policy", disabled: !!this.props.path })} + + {OptionalNumberField(this, "", "policy.upload.maxParallelSnapshots", { placeholder: !this.props.path ? i18n.t('feedback.policy.upload.maximum-parallel-snapshots-hint-set') : i18n.t('feedback.policy.upload.maximum-parallel-snapshots-hint-unset'), disabled: !!this.props.path })} {EffectiveValue(this, "upload.maxParallelSnapshots")} - - {OptionalNumberField(this, "", "policy.upload.maxParallelFileReads", { placeholder: "max number of parallel file reads" })} + + {OptionalNumberField(this, "", "policy.upload.maxParallelFileReads", { placeholder: i18n.t('feedback.policy.upload.maximum-parallel-file-reads-hint') })} {EffectiveValue(this, "upload.maxParallelFileReads")} @@ -480,11 +480,11 @@ export class PolicyEditor extends Component { {i18n.t('feedback.policy.header.snapshot-action')} - {ActionRowScript(this, "actions.beforeSnapshotRoot.script", "Before Snapshot", "Script to run before snapshot")} + {ActionRowScript(this, "actions.beforeSnapshotRoot.script", i18n.t('feedback.policy.actions.before-snapshot'), i18n.t('feedback.policy.actions.before-snapshot-help'))} {ActionRowTimeout(this, "actions.beforeSnapshotRoot.timeout")} {ActionRowMode(this, "actions.beforeSnapshotRoot.mode")}
- {ActionRowScript(this, "actions.afterSnapshotRoot.script", "After Snapshot", "Script to run after snapshot")} + {ActionRowScript(this, "actions.afterSnapshotRoot.script", i18n.t('feedback.policy.actions.after-snapshot'), i18n.t('feedback.policy.actions.after-snapshot-help'))} {ActionRowTimeout(this, "actions.afterSnapshotRoot.timeout")} {ActionRowMode(this, "actions.afterSnapshotRoot.mode")}
@@ -493,11 +493,11 @@ export class PolicyEditor extends Component { {i18n.t('feedback.policy.header.folder-actions')} - {ActionRowScript(this, "actions.beforeFolder.script", "Before Folder", "Script to run before folder")} + {ActionRowScript(this, "actions.beforeFolder.script", i18n.t('feedback.policy.actions.before-folder'), i18n.t('feedback.policy.actions.before-folder-help'))} {ActionRowTimeout(this, "actions.beforeFolder.timeout")} {ActionRowMode(this, "actions.beforeFolder.mode")}
- {ActionRowScript(this, "actions.afterFolder.script", "After Folder", "Script to run after folder")} + {ActionRowScript(this, "actions.afterFolder.script", i18n.t('feedback.policy.actions.after-folder'), i18n.t('feedback.policy.actions.after-folder-help'))} {ActionRowTimeout(this, "actions.afterFolder.timeout")} {ActionRowMode(this, "actions.afterFolder.mode")}
@@ -507,42 +507,42 @@ export class PolicyEditor extends Component { - + {LogDetailSelector(this, "policy.logging.directories.snapshotted")} {EffectiveValue(this, "logging.directories.snapshotted")} - + {LogDetailSelector(this, "policy.logging.directories.ignored")} {EffectiveValue(this, "logging.directories.ignored")} - + {LogDetailSelector(this, "policy.logging.entries.snapshotted")} {EffectiveValue(this, "logging.entries.snapshotted")} - + {LogDetailSelector(this, "policy.logging.entries.ignored")} {EffectiveValue(this, "logging.entries.ignored")} - + {LogDetailSelector(this, "policy.logging.entries.cacheHit")} {EffectiveValue(this, "logging.entries.cacheHit")} - + {LogDetailSelector(this, "policy.logging.entries.cacheMiss")} @@ -554,13 +554,13 @@ export class PolicyEditor extends Component { {i18n.t('feedback.policy.header.other')} - + {RequiredBoolean(this, "", "policy.noParent")} - +
{JSON.stringify(this.state.policy, null, 4)}
                                     
@@ -570,9 +570,9 @@ export class PolicyEditor extends Component {

- {!this.props.embedded && } + {!this.props.embedded && } {!this.state.isNew && !this.props.embedded && <>  - + } {this.state.saving && <>   diff --git a/src/components/policy-editor/UpcomingSnapshotTimes.jsx b/src/components/policy-editor/UpcomingSnapshotTimes.jsx index b5285898..969ed350 100644 --- a/src/components/policy-editor/UpcomingSnapshotTimes.jsx +++ b/src/components/policy-editor/UpcomingSnapshotTimes.jsx @@ -1,6 +1,7 @@ import moment from 'moment'; import React from 'react'; import { LabelColumn } from './LabelColumn'; +import i18n from '../../utils/i18n'; export function UpcomingSnapshotTimes(resolved) { if (!resolved) { @@ -14,11 +15,11 @@ export function UpcomingSnapshotTimes(resolved) { const times = resolved.upcomingSnapshotTimes; if (!times) { - return ; + return ; } return <> - +
    {times.map(x =>
  • {moment(x).format('L LT')} ({moment(x).fromNow()})
  • )} diff --git a/src/pages/Policies.jsx b/src/pages/Policies.jsx index 97680eb4..1edb8c5a 100644 --- a/src/pages/Policies.jsx +++ b/src/pages/Policies.jsx @@ -248,7 +248,7 @@ export class Policies extends Component { id: 'edit', Header: i18n.t('feedback.header.actions'), width: 50, - Cell: x => + Cell: x => }] return <> @@ -279,7 +279,7 @@ export class Policies extends Component { {OptionalDirectory(this, null, "policyPath", { autoFocus: true, placeholder: i18n.t('policies.feedback.policy.find') })}
- + : } diff --git a/src/pages/Repository.jsx b/src/pages/Repository.jsx index e8ecd47e..114d7b56 100644 --- a/src/pages/Repository.jsx +++ b/src/pages/Repository.jsx @@ -134,7 +134,7 @@ export class Repository extends Component { : }
- + ; } diff --git a/src/pages/Snapshots.jsx b/src/pages/Snapshots.jsx index 4aec6be3..b1f79c6b 100644 --- a/src/pages/Snapshots.jsx +++ b/src/pages/Snapshots.jsx @@ -167,7 +167,7 @@ export class Snapshots extends Component { return <>  {totals}   - {x.row.original.currentTask && Details} + {x.row.original.currentTask && {i18n.t('feedback.header.details')}} ; default: @@ -206,7 +206,7 @@ export class Snapshots extends Component { return

{moment(x.cell.value).fromNow()} {moment(x.cell.value).isBefore(moment()) && <>   - overdue + {i18n.t('feedback.snapshot.status.overdue')} }

; } diff --git a/src/tests/PolicyEditor.test.jsx b/src/tests/PolicyEditor.test.jsx index c27e4614..9ceedb27 100644 --- a/src/tests/PolicyEditor.test.jsx +++ b/src/tests/PolicyEditor.test.jsx @@ -5,6 +5,7 @@ import { MemoryRouter } from 'react-router-dom'; import { setupAPIMock } from '../tests/api_mocks'; import moment from 'moment'; import { changeControlValue, simulateClick } from '../tests/testutils'; +import i18n from '../utils/i18n'; // Mockup for the server let serverMock; @@ -144,7 +145,7 @@ it('e2e', async () => { // this will trigger resolve and will update effective field: "(Defined by this policy)" await waitFor(() => expect(getByTestId("effective-retention.keepLatest").value).toBe("44")); - await waitFor(() => expect(getByTestId("definition-retention.keepLatest").innerHTML).toEqual("(Defined by this policy)")); + await waitFor(() => expect(getByTestId("definition-retention.keepLatest").innerHTML).toEqual(i18n.t('feedback.policy.defined-by-this-policy'))); simulateClick(getByTestId('button-save')); await waitFor(() => expect(serverMock.history.put.length).toEqual(1)); diff --git a/src/utils/uiutil.jsx b/src/utils/uiutil.jsx index 7595829a..6bd820f8 100644 --- a/src/utils/uiutil.jsx +++ b/src/utils/uiutil.jsx @@ -273,19 +273,19 @@ export function taskStatusSymbol(task) { switch (st) { case "RUNNING": return <> - Running for {dur} + {i18n.t('feedback.task.running-for')} {dur} case "SUCCESS": - return

Finished in {dur}

; + return

{i18n.t('feedback.task.finished-in')} {dur}

; case "FAILED": - return

Failed after {dur}

; + return

{i18n.t('feedback.task.failed-after')} {dur}

; case "CANCELED": - return

Canceled after {dur}

; + return

{i18n.t('feedback.task.canceled-after')} {dur}

; default: return st; @@ -353,7 +353,7 @@ export function isAbsolutePath(p) { export function errorAlert(err, prefix) { if (!prefix) { - prefix = "Error" + prefix = i18n.t('feedback.error.common') } prefix += ": "; @@ -393,8 +393,8 @@ export function CLIEquivalent(props) { return <> - - {visible && } + + {visible && } {visible && } ; @@ -404,11 +404,11 @@ export function toAlgorithmOption(x, defaultID) { let text = x.id; if (x.id === defaultID) { - text = x.id + " (RECOMMENDED)"; + text = x.id + i18n.t('value.algorithm.suffix-recommended'); } if (x.deprecated) { - text = x.id + " (NOT RECOMMENDED)"; + text = x.id + i18n.t('value.algorithm.suffix-not-recommended'); } return ; From 6a3b1c3fcb8c7e5056fda145e2aa675d98f2a5c3 Mon Sep 17 00:00:00 2001 From: lupusA Date: Sun, 7 Apr 2024 17:17:42 +0200 Subject: [PATCH 26/27] Refactored translations keys --- .vscode/settings.json | 8 +- public/locales/de/translation.json | 515 +++++++++--------- public/locales/en/translation.json | 515 +++++++++--------- public/locales/es/translation.json | 515 +++++++++--------- public/locales/fr/translation.json | 515 +++++++++--------- public/locales/it/translation.json | 515 +++++++++--------- public/locales/jp/translation.json | 515 +++++++++--------- public/locales/pl/translation.json | 515 +++++++++--------- public/locales/ru/translation.json | 515 +++++++++--------- src/components/DirectoryItems.jsx | 10 +- src/components/Logs.jsx | 2 +- src/components/SetupRepository.jsx | 38 +- src/components/SetupRepositoryAzure.jsx | 12 +- src/components/SetupRepositoryB2.jsx | 8 +- src/components/SetupRepositoryFilesystem.jsx | 2 +- src/components/SetupRepositoryGCS.jsx | 8 +- src/components/SetupRepositoryRclone.jsx | 4 +- src/components/SetupRepositoryS3.jsx | 14 +- src/components/SetupRepositorySFTP.jsx | 28 +- src/components/SetupRepositoryServer.jsx | 4 +- src/components/SetupRepositoryToken.jsx | 2 +- src/components/SetupRepositoryWebDAV.jsx | 6 +- src/components/SnapshotEstimation.jsx | 15 +- src/components/policy-editor/PolicyEditor.jsx | 2 +- .../policy-editor/SectionHeaderRow.jsx | 2 +- src/pages/Policies.jsx | 34 +- src/pages/Repository.jsx | 44 +- src/pages/SnapshotCreate.jsx | 14 +- src/pages/SnapshotDirectory.jsx | 12 +- src/pages/SnapshotHistory.jsx | 66 +-- src/pages/SnapshotRestore.jsx | 38 +- src/pages/Snapshots.jsx | 30 +- src/pages/Task.jsx | 24 +- src/pages/Tasks.jsx | 26 +- src/tests/Language.test.jsx | 41 +- src/utils/uiutil.jsx | 12 +- 36 files changed, 2303 insertions(+), 2323 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 7bc1d54e..d6137325 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -19,7 +19,13 @@ "feedback.provider.required-either-known-host-data", "feedback.provider.required-either-key-file", "feedback.policy.files.ignore-files-help", - "feedback.policy.scheduling.cron-help" + "feedback.policy.scheduling.cron-help", + "feedback.policy.find-count", + "feedback.policy.find-count_one", + "feedback.policy.find-count_other", + "feedback.task.estimated-results", + "feedback.snapshot.show-individual-snapshots-count_other", + "feedback.snapshot.show-individual-snapshots-count_one" ], "i18n-ally.extract.ignoredByFiles": { "src\\components\\policy-editor\\PolicyEditor.jsx": [ diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index c1bf1ad9..ad12dcc2 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -1,52 +1,71 @@ { - "common.back": "Zurück", - "common.cancel": "Abbrechen", - "common.click-here-to-learn-more": "Klick hier um mehr zu erfahren.", - "common.delete": "Löschen", - "common.delete-confirm": "Löschen bestätigen", - "common.loading": "Wird geladen ...", - "common.next": "Weiter", - "common.return": "Zurück", - "enter-object-name-prefix-or-leave-empty-hint": "Geben Sie das Präfix für den Objektnamen ein oder lassen Sie es leer", + "common.action.back": "Zurück", + "common.action.cancel": "Abbrechen", + "common.action.click-here-to-learn-more": "Klick hier um mehr zu erfahren.", + "common.action.confirm-delete": "Löschen bestätigen", + "common.action.delete": "Löschen", + "common.action.next": "Weiter", + "common.action.return": "Zurück", + "common.action.stop": "Stop", + "common.label.loading": "Loading...", "event.cli.copy-to-clipboard": "In die Zwischenablage kopieren", "event.cli.show-cli-equivalent": "Klicken Sie, um das CLI-Äquivalent anzuzeigen", - "event.description.cancel": "Abbrechen", - "event.description.new": "Geben Sie eine neue Beschreibung ein", - "event.description.remove": "Beschreibung entfernen", - "event.description.update": "Beschreibung aktualisieren", - "event.log.hide": "Hide log", - "event.log.show": "Show log", - "event.pin.add": "Pin hinzufügen", - "event.pin.cancel": "Abbrechen", - "event.pin.remove": "Pin entfernen", - "event.pin.snapshot-pin": "Snapshot anheften", - "event.pin.update": "Pin aktualisieren", + "event.log.hide-log": "Hide log", + "event.log.show-log": "Show log", + "event.pin.add-pin": "Pin hinzufügen", + "event.pin.pin-snapshot": "Snapshot anheften", + "event.pin.remove-pin": "Pin entfernen", + "event.pin.update-pin": "Pin aktualisieren", "event.policy.delete": "Richtlinie löschen", "event.policy.edit": "Bearbeiten", "event.policy.save": "Richtlinie speichern", - "event.policy.set": "Richtlinie festlegen", - "event.repository.advanced-options-hide": "Erweiterte Optionen ausblenden", - "event.repository.advanced-options.show": "Erweiterte Optionen anzeigen", + "event.policy.set-policy": "Richtlinie festlegen", + "event.repository.cancel-connection": "Cancel connection", "event.repository.connect-to-repository": "Mit Repository verbinden", "event.repository.create-repository": "Repository erstellen", - "event.task.cancel": "Aufgabe abbrechen", - "feedback.description.modal-title": "Beschreibung des Snapshots", + "event.repository.disconnect-from-repository": "Repository trennen", + "event.repository.hide-advanced-options": "Erweiterte Optionen ausblenden", + "event.repository.show-advanced-options": "Erweiterte Optionen anzeigen", + "event.repository.update-description": "Update description", + "event.snapshot.browse-directory": "Durchsuchen", + "event.snapshot.delete-selected": "event.snapshot.delete-selected", + "event.snapshot.delete-selected_one": "Möchten Sie den ausgewählten {{count}} Snapshot löschen?", + "event.snapshot.delete-selected_other": "Möchten Sie die ausgewählten {{count}} Snapshots löschen?", + "event.snapshot.description.enter-new-description": "Geben Sie eine neue Beschreibung ein", + "event.snapshot.description.remove-description": "Beschreibung entfernen", + "event.snapshot.description.update-description": "Beschreibung aktualisieren", + "event.snapshot.estimate": "Schätzung", + "event.snapshot.fetch-snapshots": "Schnappschüsse abrufen", + "event.snapshot.history.delete-selected": "Ausgewählte löschen ({{count}})", + "event.snapshot.history.delete-snapshot-source": "Snapshot-Quelle löschen", + "event.snapshot.history.deselect-all": "Alle abwählen", + "event.snapshot.history.select-all-snapshots": "Alle auswählen", + "event.snapshot.history.update-snapshot-description": "{{description}} – Klicken Sie hier, um die Snapshot-Beschreibung zu aktualisieren.", + "event.snapshot.mount-directory": "Als lokales Dateisystem mounten", + "event.snapshot.new-snapshot": "Neuer Snapshot", + "event.snapshot.restore-file-directories": "Dateien und Verzeichnisse wiederherstellen", + "event.snapshot.restore.begin-restore": "Begin restore", + "event.snapshot.restore.go-to-restore-task": "Gehen Sie zur Wiederherstellungsaufgabe", + "event.snapshot.show-policy": "Richtlinie", + "event.snapshot.snapshot-now": "Snapshot erstellen", + "event.snapshot.synchronize": "Synchronisieren", + "event.snapshot.unmount-directory": "Aushängen", + "event.task.action.cancel": "Aufgabe abbrechen", + "event.task.select.task-all": "Alle", + "event.task.select.task-failed": "Fehlgeschlagen", + "event.task.select.task-running": "Running", + "feedback.directory.header.directories": "Verzeichnisse", + "feedback.directory.header.files": "Dateien", + "feedback.directory.header.last-modification": "Letzte Änderung", + "feedback.directory.header.name": "Name", + "feedback.directory.header.size": "Größe", "feedback.error.common": "Fehler", "feedback.error.connection": "Verbindungsfehler:", - "feedback.header.actions": "Aktionen", - "feedback.header.defined": "Definiert", - "feedback.header.details": "Details", - "feedback.header.directories": "Verzeichnisse", "feedback.header.effective": "Angewandt", - "feedback.header.files": "Dateien", - "feedback.header.host": "Host", - "feedback.header.modification-last": "Letzte Änderung", - "feedback.header.name": "Name", - "feedback.header.path": "Pfad", - "feedback.header.size": "Größe", "feedback.header.username": "Nutzername", - "feedback.pin.name": "Name des Pins", - "feedback.pin.standard-text": "Nicht löschen", + "feedback.pin.add-pin-to-protect": "Fügen Sie eine PIN hinzu, um den Snapshot vor dem Löschen zu schützen", + "feedback.pin.do-not-delete": "Nicht löschen", + "feedback.pin.name-of-the-pin": "Name des Pins", "feedback.policy.action.command-mode": "Befehlsmodus", "feedback.policy.actions.after-folder": "Nach dem Ordner", "feedback.policy.actions.after-folder-help": "Skript zur Ausführung nach dem Ordner", @@ -97,16 +116,32 @@ "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignorieren Sie Verzeichnisse, die CACHEDIR.TAG und ähnliches enthalten", "feedback.policy.files.scan-only-one-filesystem": "Scannen Sie nur ein Dateisystem", "feedback.policy.files.scan-only-one-filesystem-help": "Überschreiten Sie beim Erstellen eines Snapshots keine Dateisystemgrenzen", + "feedback.policy.find-count": "feedback.policy.find-count", + "feedback.policy.find-count_one": "Es wurde {{count}} Richtlinie gefunden, die den Kriterien entspricht", + "feedback.policy.find-count_other": "Es wurden {{count}} Richtlinien gefunden, die den Kriterien entsprechen", + "feedback.policy.find-hint": "Geben Sie das Verzeichnis ein, um die Richtlinie zu finden oder festzulegen", + "feedback.policy.find-none": "Keine Richtlinien gefunden", + "feedback.policy.find-none-create": "Für das Verzeichnis {{path}} wurde keine Richtlinie gefunden. \nBitte richten Sie eine neue Richtlinie ein.", + "feedback.policy.header.actions": "Aktionen", "feedback.policy.header.compression": "Kompression", + "feedback.policy.header.defined": "Definiert", "feedback.policy.header.error-handling": "Fehlerbehandlung", "feedback.policy.header.files": "Dateien", "feedback.policy.header.folder-actions": "Ordneraktionen", + "feedback.policy.header.host": "Host", "feedback.policy.header.logging": "Protokollierung", "feedback.policy.header.other": "Andere", + "feedback.policy.header.path": "Pfad", "feedback.policy.header.scheduling": "Terminplanung", "feedback.policy.header.snapshot-action": "Snapshot-Aktionen", "feedback.policy.header.snapshot-retention": "Snapshot-Aufbewahrung", "feedback.policy.header.upload": "Hochladen", + "feedback.policy.kind.all": "Alle Richtlinien", + "feedback.policy.kind.applicable": "Anwendbare Richtlinien", + "feedback.policy.kind.global": "Globale Richtlinien", + "feedback.policy.kind.local": "Lokale Richtlinien", + "feedback.policy.kind.per-host-policies": "Richtlinien pro Host", + "feedback.policy.kind.per-user-policies": "Richtlinien pro Benutzer", "feedback.policy.logging.cache-hit": "Cache-Treffer", "feedback.policy.logging.cache-hit-help": "Protokollieren Sie die Ausführlichkeit, wenn ein Cache verwendet wird, anstatt die Datei hochzuladen", "feedback.policy.logging.cache-miss": "Cache-Fehler", @@ -123,6 +158,7 @@ "feedback.policy.other.disable-parent-policy-evaluation-help": "Verhindert, dass sich übergeordnete Richtlinien auf dieses Verzeichnis und seine Unterverzeichnisse auswirken", "feedback.policy.other.json-representation": "JSON-Darstellung", "feedback.policy.other.json-representation-help": "Dies ist die interne Darstellung einer Richtlinie", + "feedback.policy.policies-defined-by-path-absolute": "Richtlinien können nur für absolute Pfade definiert werden.", "feedback.policy.retention.annual-snapshot-retain": "Jährlich", "feedback.policy.retention.annual-snapshot-retain-help": "Wie viele jährliche Snapshots pro Quelle aufbewahrt werden sollen. \nDer neueste Snapshot jedes Kalenderjahres wird aufbewahrt", "feedback.policy.retention.annual-snapshot-retain-hint": "Anzahl der jährlichen Schnappschüsse", @@ -168,19 +204,113 @@ "feedback.policy.upload.maximum-parallel-snapshots-help": "Maximale Anzahl von Snapshots, die gleichzeitig hochgeladen werden können", "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "Maximale Anzahl paralleler Snapshots", "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "muss mithilfe einer globalen, Benutzer- oder Hostrichtlinie angegeben werden", + "feedback.prodiver.gcs.paste-json-credentials": "Fügen Sie hier JSON-Anmeldeinformationen ein", "feedback.provider.azure-blob-storage": "Azure Blob Storage", + "feedback.provider.azure.access-key": "Zugangsschlüssel", + "feedback.provider.azure.azure-storage-domain": "Azure Storage-Domäne", + "feedback.provider.azure.container": "Container", + "feedback.provider.azure.enter-access-key": "Geben Sie den geheimen Zugangsschlüssel ein", + "feedback.provider.azure.enter-azure-storage-domain": "Geben Sie die Speicherdomäne ein oder lassen Sie sie leer, um die Standardeinstellung „blob.core.windows.net“ zu verwenden.", + "feedback.provider.azure.enter-container-name": "Geben Sie den Containernamen ein", + "feedback.provider.azure.enter-object-name-prefix": "Geben Sie das Präfix für den Objektnamen ein oder lassen Sie es leer", + "feedback.provider.azure.enter-sas-token": "Geben Sie den geheimen SAS-Token ein", + "feedback.provider.azure.enter-storage-account": "Geben Sie den Namen des Speicherkontos ein", + "feedback.provider.azure.object-name-prefix": "Präfix des Objektnamens", + "feedback.provider.azure.sas-token": "SAS-Token", + "feedback.provider.azure.storage-account": "Speicherkonto", + "feedback.provider.b2.bucket-name": "B2-Bucket", + "feedback.provider.b2.enter-account-key": "Geben Sie den geheimen Anwendungs- oder Kontoschlüssel ein", + "feedback.provider.b2.enter-account-key-id": "Geben Sie die Anwendungs- oder Kontoschlüssel-ID ein", + "feedback.provider.b2.enter-bucket-name": "Geben Sie den Bucket-Namen ein", + "feedback.provider.b2.enter-object-name-prefix": "Geben Sie das Präfix für den Objektnamen ein oder lassen Sie es leer", + "feedback.provider.b2.key": "Schlüssel", + "feedback.provider.b2.key-id": "Schlüssel-ID", + "feedback.provider.b2.object-name-prefix": "Präfix des Objektnamens", "feedback.provider.backblaze-b2": "Backblaze B2", + "feedback.provider.filesystem.directory-path": "Verzeichnispfad", + "feedback.provider.filesystem.enter-directory-path": "Geben Sie den Verzeichnispfad ein, in dem Sie die Repository-Dateien speichern möchten", + "feedback.provider.gcs.bucket-name": "GCS-Bucket", + "feedback.provider.gcs.credentials-file": "Anmeldeinformationsdatei", + "feedback.provider.gcs.credentials-json": "Anmeldeinformationen JSON", + "feedback.provider.gcs.enter-bucket-name": "Geben Sie den Bucket-Namen ein", + "feedback.provider.gcs.enter-credentials-file-name": "Geben Sie den Namen der JSON-Datei mit den Anmeldeinformationen ein", + "feedback.provider.gcs.enter-object-name-prefix": "Geben Sie das Präfix für den Objektnamen ein oder lassen Sie es leer", + "feedback.provider.gcs.object-name-prefix": "Präfix des Objektnamens", "feedback.provider.google-cloud-storage": "Google Cloud-Speicher", "feedback.provider.kopia-repository-server": "Kopia-Repository-Server", "feedback.provider.local-directory-or-nas": "Lokales Verzeichnis oder NAS", "feedback.provider.rclone-remote": "Rclone Remote", + "feedback.provider.rclone.rclone-executable-path": "Rclone Pfad", + "feedback.provider.rclone.rclone-executable-path-hint": "Geben Sie den Pfad zur ausführbaren rclone-Datei ein", + "feedback.provider.rclone.rclone-remote-path": "Rclone-Remote-Pfad", + "feedback.provider.rclone.rclone-remote-path-hint": "Geben Sie : ein", + "feedback.provider.repositoryserver.enter-server-certificate-fingerprint": "Geben Sie den Fingerabdruck des vertrauenswürdigen Serverzertifikats ein, der beim Serverstart gedruckt wird", + "feedback.provider.repositoryserver.enter-server-url": "Geben Sie die Server-URL ein (https://:port)", + "feedback.provider.repositoryserver.server-address": "Serveradresse", + "feedback.provider.repositoryserver.server-certificate-fingerprint": "Fingerabdruck des vertrauenswürdigen Serverzertifikats (SHA256)", + "feedback.provider.repositorytoken.paste-token": "Verbindungstoken einfügen", + "feedback.provider.repositorytoken.token": "Token", "feedback.provider.required-either-key-file": "Es ist entweder Passwort, Schlüsseldatei oder Schlüsseldaten erforderlich.", "feedback.provider.required-either-known-host-data": "Es sind entweder Known Hosts File oder Known Hosts Data erforderlich, aber nicht beides.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 oder kompatibler Speicher", + "feedback.provider.s3.access-key-id": "Zugriffsschlüssel-ID", + "feedback.provider.s3.access-key-id-hint": "Geben Sie die Zugriffsschlüssel-ID ein", + "feedback.provider.s3.bucket-name": "Bucket", + "feedback.provider.s3.bucket-name-hint": "Geben Sie den Bucket-Namen ein", + "feedback.provider.s3.enter-object-name-prefix-hint": "Geben Sie das Präfix für den Objektnamen ein oder lassen Sie es leer", + "feedback.provider.s3.object-name-prefix": "Präfix des Objektnamens", + "feedback.provider.s3.override-region": "Region überschreiben", + "feedback.provider.s3.override-region-hint": "Geben Sie eine bestimmte Region ein (z. B. us-west-1) oder lassen Sie das Feld leer", + "feedback.provider.s3.secret-access-key": "Geheimer Zugangsschlüssel", + "feedback.provider.s3.secret-access-key-hint": "Geben Sie den geheimen Zugangsschlüssel ein", + "feedback.provider.s3.server-endpoint": "Serverendpunkt", + "feedback.provider.s3.server-endpoint-hint": "Geben Sie die Serveradresse ein (z. B. s3.amazonaws.com)", + "feedback.provider.s3.session-token": "Sitzungstoken", + "feedback.provider.s3.session-token-hint": "Geben Sie das Sitzungstoken ein oder lassen Sie es leer", + "feedback.provider.sftp-key-data": "Schlüsseldaten", + "feedback.provider.sftp-key-data-hint": "Fügen Sie den Inhalt der Schlüsseldatei ein", "feedback.provider.sftp-server": "SFTP-Server", + "feedback.provider.sftp.enter-password": "Passwort eingeben", + "feedback.provider.sftp.enter-path-host-file": "Geben Sie den Pfad zur Datei „known_hosts“ ein", + "feedback.provider.sftp.enter-path-to-key-file": "Geben Sie den Pfad zur Schlüsseldatei ein", + "feedback.provider.sftp.enter-remote-path": "Geben Sie den Remote-Pfad zum Repository ein, z. B. „/mnt/data/repository“.", + "feedback.provider.sftp.enter-ssh-arguments": "Geben Sie SSH-Befehlsargumente ein ('user@host -s sftp' wird automatisch angehängt)", + "feedback.provider.sftp.enter-ssh-host-name": "SSH-Hostname (z. B. example.com)", + "feedback.provider.sftp.host": "Host", + "feedback.provider.sftp.known-host-data": "Daten bekannter Hosts", + "feedback.provider.sftp.launch-external-ssh-command": "Starten Sie einen externen SSH-Befehl ohne Passwort", + "feedback.provider.sftp.launch-external-ssh-command-hint": "Standardmäßig stellt Kopia über einen internen SSH-Client eine Verbindung zum Server her, der begrenzte Optionen unterstützt. \nAlternativ kann ein externer SSH-Befehl ohne Passwort gestartet werden, der zusätzliche Optionen unterstützt, aber im Allgemeinen weniger effizient ist als der integrierte Client.", + "feedback.provider.sftp.password": "Passwort", + "feedback.provider.sftp.paste-content-of-known-host": "Fügen Sie den Inhalt der Datei „known_hosts“ ein", + "feedback.provider.sftp.path": "Pfad", + "feedback.provider.sftp.path-host-file": "Pfad zur Datei „known_hosts“.", + "feedback.provider.sftp.path-key-file": "Pfad zur Schlüsseldatei", + "feedback.provider.sftp.port": "Port", + "feedback.provider.sftp.port-number": "Portnummer (z. B. 22)", + "feedback.provider.sftp.provide-passwordless-ssh-command": "Geben Sie den auszuführenden passwortlosen SSH-Befehl an (normalerweise „ssh“).", + "feedback.provider.sftp.ssh-arguments": "SSH-Argumente", + "feedback.provider.sftp.ssh-command": "SSH-Befehl", + "feedback.provider.sftp.user": "Benutzer", + "feedback.provider.sftp.user-name": "Nutzername", "feedback.provider.use-repository-token": "Repository-Token", "feedback.provider.webdav-server": "WebDAV-Server", + "feedback.provider.webdav.enter-password": "Passwort eingeben", + "feedback.provider.webdav.enter-username": "Geben Sie den Benutzernamen ein", + "feedback.provider.webdav.password": "Passwort", + "feedback.provider.webdav.server-url": "WebDAV-Server-URL", + "feedback.provider.webdav.username": "Nutzername", "feedback.repository.additional-parameters-hint": "Beim Erstellen des Repositorys über die Befehlszeile können zusätzliche Parameter festgelegt werden.", + "feedback.repository.attribute.algorithm-eco": "Fehlerkorrekturalgorithmus", + "feedback.repository.attribute.algorithm-encryption": "Verschlüsselungsalgorithmus", + "feedback.repository.attribute.algorithm-hash": "Hash-Algorithmus", + "feedback.repository.attribute.algorithm-splitter": "Splitter-Algorithmus", + "feedback.repository.attribute.config-file": "Konfigurationsdatei", + "feedback.repository.attribute.connected-as": "Verbunden als", + "feedback.repository.attribute.internal-compression": "Interne Kompression", + "feedback.repository.attribute.repository-eco": "Aufwand für die Fehlerkorrektur", + "feedback.repository.attribute.repository-format": "Repository-Format", + "feedback.repository.attribute.repository-provider": "Anbieter", + "feedback.repository.attribute.server-url": "Server URL", "feedback.repository.configuration": "Speicherkonfiguration", "feedback.repository.connect-as": "Verbinden als", "feedback.repository.connect-in-read-only-mode": "Stellen Sie eine Verbindung im schreibgeschützten Modus her", @@ -188,8 +318,14 @@ "feedback.repository.connect-to-repository": "Mit Repository verbinden", "feedback.repository.create-repository-new": "Neues Repository erstellen", "feedback.repository.create-repository-new-help": "Geben Sie ein sicheres Passwort ein, um das Kopia-Repository im bereitgestellten Speicher zu erstellen.", + "feedback.repository.eco-disabled": "Disabled", "feedback.repository.eec-warning": "[EXPERIMENTELL] Eine Fehlerkorrektur kann zum Schutz vor bestimmten Arten von Datenbeschädigungen aufgrund spontaner Bitwechsel im Speichermedium beitragen.", "feedback.repository.encryption": "Verschlüsselung", + "feedback.repository.enter-repository-password": "Geben Sie das Repository-Passwort ein", + "feedback.repository.hostname": "Hostname", + "feedback.repository.hostname-hint": "Überschreiben Sie dies, wenn Sie einen Snapshot wiederherstellen, der auf einem anderen Computer erstellt wurde", + "feedback.repository.internal-compression-supported-no": "nein", + "feedback.repository.internal-compression-supported-yes": "ja", "feedback.repository.kopia-server-parameters": "Kopia-Serverparameter", "feedback.repository.name-default": "Mein Repository", "feedback.repository.override-hint": "Klicken Sie zum Überschreiben auf „Erweiterte Optionen anzeigen“.", @@ -198,20 +334,94 @@ "feedback.repository.repository-description": "Beschreibung des Repository", "feedback.repository.repository-description-help": "Hilft bei der Unterscheidung zwischen mehreren verbundenen Repositorys", "feedback.repository.repository-description-hint": "Geben Sie eine Repository-Beschreibung ein", + "feedback.repository.repository-description-required": "Repository description is required", + "feedback.repository.repository-initializing": "Initializing repository...", + "feedback.repository.repository-is-read-only": "Repository is read-only", + "feedback.repository.repository-password": "Repository-Passwort", + "feedback.repository.repository-password-confirm": "Bestätigen Sie das Repository-Passwort", + "feedback.repository.repository-password-confirm-again": "Geben Sie das Repository-Passwort erneut ein", + "feedback.repository.repository-password-help": "Wird zum Verschlüsseln des Repository-Inhalts verwendet", "feedback.repository.repository-token-enter": "Geben Sie das Repository-Token ein", - "feedback.snapshot.status.overdue": "überfällig", + "feedback.repository.server-password": "Server-Passwort", + "feedback.repository.server-password-hint": "Geben Sie das Passwort ein, um eine Verbindung zum Server herzustellen", + "feedback.repository.status-connected": "Mit Repository verbunden", + "feedback.repository.username": "Nutzername", + "feedback.repository.username-hint": "Überschreiben Sie dies, wenn Sie einen Snapshot wiederherstellen, der von einem anderen Benutzer erstellt wurde", + "feedback.snapshot.create.enter-path-to-snapshot-hint": "Pfad des Schnapshots eingeben", + "feedback.snapshot.create.must-specify-path": "Pfad zur Erstellung des Snapshot muss angegeben werden.", + "feedback.snapshot.create.snapshot-new": "Neuer Snapshot", + "feedback.snapshot.description": "Beschreibung", + "feedback.snapshot.description.snapshot-description": "Beschreibung des Snapshots", + "feedback.snapshot.directory.browsing-not-supported": "Das Durchsuchen von Verzeichnissen wird in einem Webbrowser nicht unterstützt. \nVerwenden Sie die Kopia-Benutzeroberfläche.", + "feedback.snapshot.directory.restore-all-files-help": "Sie können alle unten angezeigten Dateien und Verzeichnisse mounten/wiederherstellen oder Dateien einzeln wiederherstellen.", + "feedback.snapshot.header.actions": "Aktionen", + "feedback.snapshot.header.details": "Details", + "feedback.snapshot.header.directories": "Ordner", + "feedback.snapshot.header.files": "Dateien", + "feedback.snapshot.header.last-snapshot": "Letzter Snapshot", + "feedback.snapshot.header.next-snapshot": "Nächster Snapshot", + "feedback.snapshot.header.retention": "Beibehaltung", + "feedback.snapshot.header.root": "Wurzelverzeichnis", + "feedback.snapshot.header.selected": "Ausgewählt", + "feedback.snapshot.header.snapshot-owner": "Eigentümer", + "feedback.snapshot.header.snapshot-path": "Pfad", + "feedback.snapshot.header.snapshot-size": "Größe", + "feedback.snapshot.header.start-time": "Startzeit", + "feedback.snapshot.header.status": "Status", + "feedback.snapshot.history.snapshot-displaying": "Anzeigen", + "feedback.snapshot.history.wipe-all-snapshots": "Löschen Sie alle Snapshots und die Richtlinie für diese Quelle.", + "feedback.snapshot.restore.continue-on-errors": "Continue on errors", + "feedback.snapshot.restore.continue-on-errors-help": "When a restore error occurs, attempt to continue instead of failing fast.", + "feedback.snapshot.restore.destination": "Destination", + "feedback.snapshot.restore.destination-help": "You can also restore to a .zip or .tar file by providing the appropriate extension.", + "feedback.snapshot.restore.destination-hint": "Enter destination path", + "feedback.snapshot.restore.disable-zip-compression": "Disable ZIP compression", + "feedback.snapshot.restore.disable-zip-compression-help": "Do not compress when restoring to a ZIP file (faster).", + "feedback.snapshot.restore.minimal-file-size-for-shallow-restore": "Minimal file size for shallow restore", + "feedback.snapshot.restore.overwrite-directory": "Overwrite directories", + "feedback.snapshot.restore.overwrite-files": "Overwrite files", + "feedback.snapshot.restore.overwrite-symbolic-links": "Overwrite symbolic links", + "feedback.snapshot.restore.restore-file-modification-time": "Restore file modification time", + "feedback.snapshot.restore.restore-file-ownership": "Restore file ownership", + "feedback.snapshot.restore.restore-file-permissions": "Restore file permissions", + "feedback.snapshot.restore.shallow-restore-at-depth": "Shallow restore at depth", + "feedback.snapshot.restore.skip-previously-restored-files": "Skip previously restored files and symlinks", + "feedback.snapshot.restore.snapshot-restore": "Restore", + "feedback.snapshot.restore.write-files-atomically": "Write files atomically", + "feedback.snapshot.restore.write-sparse-files": "Write sparse files", + "feedback.snapshot.show-individual-snapshots-count": "feedback.snapshot.show-individual-snapshots-count", + "feedback.snapshot.show-individual-snapshots-count_one": "{{count}} einzelnen Schnappschuss anzeigen", + "feedback.snapshot.show-individual-snapshots-count_other": "{{count}} einzelne Schnappschüsse anzeigen", + "feedback.snapshot.start-after-previous-snapshot": "Der Snapshot startet, sobald der vorherige abgeschlossen ist", + "feedback.snapshot.status.status-overdue": "überfällig", + "feedback.snapshot.status.status-pending": "Wartend", "feedback.tab.policies": "Richtlinien", "feedback.tab.preferences": "Einstellungen", "feedback.tab.repository": "Repository", "feedback.tab.repository-is-not-connected": "Das Repository ist nicht verbunden", "feedback.tab.snapshots": "Snapshots", "feedback.tab.tasks": "Aufgaben", - "feedback.task.canceled-after": "Abgebrochen nach", - "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} exkludiert) Files: {{files}} ({{files.excluded}} exkludiert) Directories: {{directories}} ({{directories.excluded}} exkludiert) Errors: {{errors}} ({{errors.ignored}} ignoriert)", - "feedback.task.failed-after": "Fehlgeschlagen nach", - "feedback.task.finished-in": "Abgeschlossen in", - "feedback.task.running-for": "Läuft seit", - "feedback.task.total": "Gesamt", + "feedback.task.estimated-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} exkludiert) Files: {{files}} ({{files.excluded}} exkludiert) Directories: {{directories}} ({{directories.excluded}} exkludiert) Errors: {{errors}} ({{errors.ignored}} ignoriert)", + "feedback.task.header.counter": "Counter", + "feedback.task.header.value": "Value", + "feedback.task.logs": "Protokoll", + "feedback.task.no-tasks-help": "Hier erscheint eine Liste von Aufgaben, sobald Snapshots, Wartungsaufgaben oder Wiederherstellungen durchgeführt werden.", + "feedback.task.search-tasks-by-hint": "Durchsuchen Sie Aufgabenprotokolle nach Beschreibung", + "feedback.task.status.task-canceled": "Aufgabe abgebrochen", + "feedback.task.status.task-canceled-after": "Aufgabe abgebrochen nach", + "feedback.task.status.task-canceling": "Canceling", + "feedback.task.status.task-error": "Task error", + "feedback.task.status.task-failed-after": "Fehlgeschlagen nach", + "feedback.task.status.task-finished": "Abgeschlossen", + "feedback.task.status.task-finished-in": "Abgeschlossen in", + "feedback.task.status.task-running-for": "Task running for", + "feedback.task.status.task-started": "Gestartet", + "feedback.task.status.task-succeeded-after": "Task succeeded after", + "feedback.task.table.header-description": "Beschreibung", + "feedback.task.table.header-kind": "Art", + "feedback.task.table.header-start-time": "Startzeit", + "feedback.task.table.header-status": "Status", + "feedback.task.tasks-total": "Gesamt", "feedback.ui.appearance": "Darstellung", "feedback.ui.appearance-help": "Gibt die Darstellung des Nutzerinterfaces an", "feedback.ui.appearance-hint": "Select font size", @@ -224,225 +434,12 @@ "feedback.ui.theme-description": "Design", "feedback.ui.theme-help": "Das aktuell ausgewählte Design", "feedback.ui.theme-select": "Select theme", - "feedback.validation.azure.access-key": "Zugangsschlüssel", - "feedback.validation.azure.access-key-hint": "Geben Sie den geheimen Zugangsschlüssel ein", - "feedback.validation.azure.azure-storage-domain": "Azure Storage-Domäne", - "feedback.validation.azure.azure-storage-domain-hint": "Geben Sie die Speicherdomäne ein oder lassen Sie sie leer, um die Standardeinstellung „blob.core.windows.net“ zu verwenden.", - "feedback.validation.azure.container": "Container", - "feedback.validation.azure.container-hint": "Geben Sie den Containernamen ein", - "feedback.validation.azure.object-name-prefix": "Präfix des Objektnamens", - "feedback.validation.azure.object-name-prefix-hint": "Geben Sie das Präfix für den Objektnamen ein oder lassen Sie es leer", - "feedback.validation.azure.sas-token": "SAS-Token", - "feedback.validation.azure.sas-token-hint": "Geben Sie den geheimen SAS-Token ein", - "feedback.validation.azure.storage-account": "Speicherkonto", - "feedback.validation.azure.storage-account-hint": "Geben Sie den Namen des Speicherkontos ein", - "feedback.validation.b2.bucket-name": "B2-Bucket", - "feedback.validation.b2.bucket-name-hint": "Geben Sie den Bucket-Namen ein", - "feedback.validation.b2.key": "Schlüssel", - "feedback.validation.b2.key-hint": "Geben Sie den geheimen Anwendungs- oder Kontoschlüssel ein", - "feedback.validation.b2.key-id": "Schlüssel-ID", - "feedback.validation.b2.key-id-hint": "Geben Sie die Anwendungs- oder Kontoschlüssel-ID ein", - "feedback.validation.b2.object-name-prefix": "Präfix des Objektnamens", - "feedback.validation.b2.object-name-prefix-hint": "Geben Sie das Präfix für den Objektnamen ein oder lassen Sie es leer", - "feedback.validation.gcs.bucket-name": "GCS-Bucket", - "feedback.validation.gcs.bucket-name-hint": "Geben Sie den Bucket-Namen ein", - "feedback.validation.gcs.credentials-file": "Anmeldeinformationsdatei", - "feedback.validation.gcs.credentials-file-hint": "Geben Sie den Namen der JSON-Datei mit den Anmeldeinformationen ein", - "feedback.validation.gcs.credentials-json": "Anmeldeinformationen JSON", - "feedback.validation.gcs.credentials-json-paste": "Fügen Sie hier JSON-Anmeldeinformationen ein", - "feedback.validation.gcs.object-name-prefix": "Präfix des Objektnamens", - "feedback.validation.gcs.object-name-prefix-hint": "Geben Sie das Präfix für den Objektnamen ein oder lassen Sie es leer", "feedback.validation.invalid-times-of-day": "Ungültige Tageszeiten", - "feedback.validation.local.directory-path": "Verzeichnispfad", - "feedback.validation.local.directory-path-hint": "Geben Sie den Verzeichnispfad ein, in dem Sie die Repository-Dateien speichern möchten", "feedback.validation.optional.valid-number-or-empty": "Muss eine gültige Zahl sein oder leer sein", "feedback.validation.passwords-dont-match": "Passwörter stimmen nicht überein", - "feedback.validation.rclone.rclone-executable-path": "Rclone Pfad", - "feedback.validation.rclone.rclone-executable-path-hint": "Geben Sie den Pfad zur ausführbaren rclone-Datei ein", - "feedback.validation.rclone.rclone-remote-path": "Rclone-Remote-Pfad", - "feedback.validation.rclone.rclone-remote-path-hint": "Geben Sie : ein", - "feedback.validation.repository-server.server-address": "Serveradresse", - "feedback.validation.repository-server.server-address-hint": "Geben Sie die Server-URL ein (https://:port)", - "feedback.validation.repository-server.server-certificate-fingerprint": "Fingerabdruck des vertrauenswürdigen Serverzertifikats (SHA256)", - "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Geben Sie den Fingerabdruck des vertrauenswürdigen Serverzertifikats ein, der beim Serverstart gedruckt wird", - "feedback.validation.repository-token.token": "Token", - "feedback.validation.repository-token.token-hint": "Verbindungstoken einfügen", "feedback.validation.required.directory": "Pflichtfeld", "feedback.validation.required.field": "Pflichtfeld", - "feedback.validation.required.hostname": "Hostname", - "feedback.validation.required.hostname-hint": "Überschreiben Sie dies, wenn Sie einen Snapshot wiederherstellen, der auf einem anderen Computer erstellt wurde", - "feedback.validation.required.password-repository": "Repository-Passwort", - "feedback.validation.required.password-repository-help": "Wird zum Verschlüsseln des Repository-Inhalts verwendet", - "feedback.validation.required.password-repository-hint": "Geben Sie das Repository-Passwort ein", - "feedback.validation.required.repository-password-confirm": "Bestätigen Sie das Repository-Passwort", - "feedback.validation.required.repository-password-confirm-again": "Geben Sie das Repository-Passwort erneut ein", - "feedback.validation.required.server-password": "Server-Passwort", - "feedback.validation.required.server-password-hint": "Geben Sie das Passwort ein, um eine Verbindung zum Server herzustellen", - "feedback.validation.required.username": "Nutzername", - "feedback.validation.required.username-hint": "Überschreiben Sie dies, wenn Sie einen Snapshot wiederherstellen, der von einem anderen Benutzer erstellt wurde", "feedback.validation.required.valid-number-or-empty": "Muss eine gültige Zahl oder leer sein", - "feedback.validation.s3.access-key-id": "Zugriffsschlüssel-ID", - "feedback.validation.s3.access-key-id-hint": "Geben Sie die Zugriffsschlüssel-ID ein", - "feedback.validation.s3.bucket-name": "Bucket", - "feedback.validation.s3.bucket-name-hint": "Geben Sie den Bucket-Namen ein", - "feedback.validation.s3.object-name-prefix": "Präfix des Objektnamens", - "feedback.validation.s3.override-region": "Region überschreiben", - "feedback.validation.s3.override-region-hint": "Geben Sie eine bestimmte Region ein (z. B. us-west-1) oder lassen Sie das Feld leer", - "feedback.validation.s3.secret-access-key": "Geheimer Zugangsschlüssel", - "feedback.validation.s3.secret-access-key-hint": "Geben Sie den geheimen Zugangsschlüssel ein", - "feedback.validation.s3.server-endpoint": "Serverendpunkt", - "feedback.validation.s3.server-endpoint-hint": "Geben Sie die Serveradresse ein (z. B. s3.amazonaws.com)", - "feedback.validation.s3.session-token": "Sitzungstoken", - "feedback.validation.s3.session-token-hint": "Geben Sie das Sitzungstoken ein oder lassen Sie es leer", - "feedback.validation.webdav.password": "Passwort", - "feedback.validation.webdav.password-hint": "Passwort eingeben", - "feedback.validation.webdav.server-url": "WebDAV-Server-URL", - "feedback.validation.webdav.username": "Nutzername", - "feedback.validation.webdav.username-hint": "Geben Sie den Benutzernamen ein", - "policies.feedback.find.count_one": "{{count}} Richtlinie gefunden, die den Kriterien entspricht", - "policies.feedback.find.count_other": "{{count}} Richtlinien gefunden, die den Kriterien entsprechen", - "policies.feedback.find.none": "Keine Richtlinien gefunden.", - "policies.feedback.find.none.create": "Für das Verzeichnis {{path}} wurde keine Richtlinie gefunden. \nBitte richten Sie eine neue Richtlinie ein.", - "policies.feedback.loading": "Wird geladen ...", - "policies.feedback.path.absolute": "Richtlinien können nur für absolute Pfade definiert werden.", - "policies.feedback.policy.find": "Geben Sie das Verzeichnis ein, um die Richtlinie zu finden oder festzulegen", - "policies.kind.all": "Alle Richtlinien", - "policies.kind.applicable": "Anwendbare Richtlinien", - "policies.kind.global": "Globale Richtlinien", - "policies.kind.host": "Richtlinien pro Host", - "policies.kind.local": "Lokale Richtlinien", - "policies.kind.user": "Richtlinien pro Benutzer", - "repository.attribute.algorithm.eco": "Fehlerkorrekturalgorithmus", - "repository.attribute.algorithm.encryption": "Verschlüsselungsalgorithmus", - "repository.attribute.algorithm.hash": "Hash-Algorithmus", - "repository.attribute.algorithm.splitter": "Splitter-Algorithmus", - "repository.attribute.compression.internal": "Interne Kompression", - "repository.attribute.config.file": "Konfigurationsdatei", - "repository.attribute.connected.as": "Verbunden als", - "repository.attribute.eco": "Aufwand für die Fehlerkorrektur", - "repository.attribute.format": "Repository-Format", - "repository.attribute.provider": "Anbieter", - "repository.attribute.server.url": "Server URL", - "repository.event.connection.cancel": "Cancel connection", - "repository.event.connection.disconnect": "Repository trennen", - "repository.event.description.update": "Update description", - "repository.feedback.compression.internal.not.supported": "nein", - "repository.feedback.compression.internal.supported": "ja", - "repository.feedback.description.required": "Repository description is required", - "repository.feedback.eco.disabled": "Disabled", - "repository.feedback.read.only": "Repository is read-only", - "repository.status.connected": "Mit Repository verbunden", - "repository.status.initializing": "Initializing repository...", - "snapshot.event.create.estimate": "Schätzung", - "snapshot.event.create.now": "Snapshot erstellen", - "snapshot.event.create.path": "Pfad des Schnapshots eingeben", - "snapshot.event.create.path.resolve": "Pfad zur Erstellung des Snapshot muss angegeben werden.", - "snapshot.event.delete.selected_one": "Möchten Sie den ausgewählten {{count}} Snapshot löschen?", - "snapshot.event.delete.selected_other": "Möchten Sie die ausgewählten {{count}} Snapshots löschen?", - "snapshot.event.directory.browse": "Durchsuchen", - "snapshot.event.directory.browsing": "Das Durchsuchen von Verzeichnissen wird in einem Webbrowser nicht unterstützt. \nVerwenden Sie die Kopia-Benutzeroberfläche.", - "snapshot.event.directory.mount": "Als lokales Dateisystem mounten", - "snapshot.event.directory.restore": "Dateien und Verzeichnisse wiederherstellen", - "snapshot.event.directory.unmount": "Aushängen", - "snapshot.event.history.delete.source": "Snapshot-Quelle löschen", - "snapshot.event.history.description.update": "{{description}} – Klicken Sie hier, um die Snapshot-Beschreibung zu aktualisieren.", - "snapshot.event.history.deselect.all": "Alle abwählen", - "snapshot.event.history.fetch.snapshots": "Schnappschüsse abrufen", - "snapshot.event.history.pin.add": "Fügen Sie eine PIN hinzu, um den Snapshot vor dem Löschen zu schützen", - "snapshot.event.history.select.all": "Alle auswählen", - "snapshot.event.history.selected.delete": "Ausgewählte löschen (", - "snapshot.event.restore": "Restore", - "snapshot.event.restore.begin": "Begin restore", - "snapshot.event.snapshot.new": "Neuer Snapshot", - "snapshot.event.snapshot.pending": "Wartend", - "snapshot.event.snapshot.policy": "Richtlinie", - "snapshot.event.synchronize": "Synchronisieren", - "snapshot.feedback.directory.mount.restore": "Sie können alle unten angezeigten Dateien und Verzeichnisse mounten/wiederherstellen oder Dateien einzeln wiederherstellen.", - "snapshot.feedback.history.display": "Anzeigen", - "snapshot.feedback.history.wipe.all": "Löschen Sie alle Snapshots und die Richtlinie für diese Quelle.", - "snapshot.feedback.restore.continue.errors": "Continue on errors", - "snapshot.feedback.restore.continue.errors.help": "When a restore error occurs, attempt to continue instead of failing fast.", - "snapshot.feedback.restore.destination": "Destination", - "snapshot.feedback.restore.destination.help": "You can also restore to a .zip or .tar file by providing the appropriate extension.", - "snapshot.feedback.restore.destination.path": "Enter destination path", - "snapshot.feedback.restore.directory.overwrite": "Overwrite directories", - "snapshot.feedback.restore.disable.compression.zip": "Disable ZIP compression", - "snapshot.feedback.restore.disable.compression.zip.help": "Do not compress when restoring to a ZIP file (faster).", - "snapshot.feedback.restore.file.atomically": "Write files atomically", - "snapshot.feedback.restore.file.modification.time": "Restore file modification time", - "snapshot.feedback.restore.file.overwrite": "Overwrite files", - "snapshot.feedback.restore.file.ownership": "Restore file ownership", - "snapshot.feedback.restore.file.permission": "Restore file permissions", - "snapshot.feedback.restore.file.sparse": "Write sparse files", - "snapshot.feedback.restore.link.overwrite": "Overwrite symbolic links", - "snapshot.feedback.restore.shallow.depth": "Shallow restore at depth", - "snapshot.feedback.restore.shallow.file.size.minimal": "Minimal file size for shallow restore", - "snapshot.feedback.restore.skip": "Skip previously restored files and symlinks", - "snapshot.feedback.restore.task.go": "Gehen Sie zur Wiederherstellungsaufgabe", - "snapshot.feedback.snapshot.new": "Neuer Snapshot", - "snapshot.feedback.snapshot.start": "Der Snapshot startet, sobald der vorherige abgeschlossen ist", - "snapshot.header.actions": "Aktionen", - "snapshot.header.snapshot.last": "Letzter Snapshot", - "snapshot.header.snapshot.next": "Nächster Snapshot", - "snapshot.header.snapshot.owner": "Eigentümer", - "snapshot.header.snapshot.path": "Pfad", - "snapshot.header.snapshot.size": "Größe", - "snapshot.header.status": "Status", - "snapshot.history.feedack.unfiltered.count_one": "{{count}} einzelnen Schnappschuss anzeigen", - "snapshot.history.feedack.unfiltered.count_other": "{{count}} einzelne Schnappschüsse anzeigen", - "snapshot.history.header.description": "Beschreibung", - "snapshot.history.header.directories": "Ordner", - "snapshot.history.header.files": "Dateien", - "snapshot.history.header.retention": "Beibehaltung", - "snapshot.history.header.root": "Wurzelverzeichnis", - "snapshot.history.header.selected": "Ausgewählt", - "snapshot.history.header.size": "Größe", - "snapshot.history.header.time.start": "Startzeit", - "task.all": "Alle", - "task.event.stop": "Stop", - "task.failed": "Fehlgeschlagen", - "task.feedback.entries": "Hier erscheint eine Liste von Aufgaben, sobald Snapshots, Wartungsaufgaben oder Wiederherstellungen durchgeführt werden.", - "task.feedback.search": "Suchen nach Einträgen per Beschreibung", - "task.header.counter": "Counter", - "task.header.description": "Beschreibung", - "task.header.kind": "Art", - "task.header.status": "Status", - "task.header.time.start": "Startzeit", - "task.header.value": "Value", - "task.loading": "Loading...", - "task.logs": "Protokoll", - "task.running": "Running", - "task.status.canceled": "Task canceled after", - "task.status.canceling": "Canceling", - "task.status.error": "Task error", - "task.status.finished": "Abgeschlossen", - "task.status.running.for": "Task running for", - "task.status.started": "Gestartet", - "task.status.succeed.after": "Task succeeded after", - "validation.password": "Passwort", - "validation.password-hint": "Passwort eingeben", - "validation.provider.external-ssh-command": "Starten Sie einen externen SSH-Befehl ohne Passwort", - "validation.provider.external-ssh-command-hint": "Standardmäßig stellt Kopia über einen internen SSH-Client eine Verbindung zum Server her, der begrenzte Optionen unterstützt. \nAlternativ kann ein externer SSH-Befehl ohne Passwort gestartet werden, der zusätzliche Optionen unterstützt, aber im Allgemeinen weniger effizient ist als der integrierte Client.", - "validation.provider.host": "Host", - "validation.provider.host-hint": "SSH-Hostname (z. B. example.com)", - "validation.provider.key-data": "Schlüsseldaten", - "validation.provider.key-data-hint": "Fügen Sie den Inhalt der Schlüsseldatei ein", - "validation.provider.known-host-data": "Daten bekannter Hosts", - "validation.provider.known-host-data-hint": "Fügen Sie den Inhalt der Datei „known_hosts“ ein", - "validation.provider.path": "Pfad", - "validation.provider.path-hint": "Geben Sie den Remote-Pfad zum Repository ein, z. B. „/mnt/data/repository“.", - "validation.provider.path-host-file": "Pfad zur Datei „known_hosts“.", - "validation.provider.path-host-file-hint": "Geben Sie den Pfad zur Datei „known_hosts“ ein", - "validation.provider.path-key-file": "Pfad zur Schlüsseldatei", - "validation.provider.path-key-file-hint": "Geben Sie den Pfad zur Schlüsseldatei ein", - "validation.provider.port": "Port", - "validation.provider.port-hint": "Portnummer (z. B. 22)", - "validation.provider.ssh-arguments": "SSH-Argumente", - "validation.provider.ssh-arguments-hint": "Geben Sie SSH-Befehlsargumente ein ('user@host -s sftp' wird automatisch angehängt)", - "validation.provider.ssh-command": "SSH-Befehl", - "validation.provider.ssh-command-hint": "Geben Sie den auszuführenden passwortlosen SSH-Befehl an (normalerweise „ssh“).", - "validation.provider.user": "Benutzer", - "validation.provider.user-hint": "Nutzername", "value.algorithm.eco-disabled": "Deaktiviert", "value.algorithm.suffix-not-recommended": "(NICHT EMPFOHLEN)", "value.algorithm.suffix-recommended": "(EMPFOHLEN)", @@ -458,8 +455,8 @@ "value.policy.optional": "Fehler ignorieren", "value.provider.s3.http-connection-insecure": "HTTP-Verbindung verwenden (unsicher)", "value.provider.s3.no-tls-verification": "TLS-Zertifikat nicht überprüfen", - "value.repository.format.latest": "Neuestes Format", - "value.repository.format.legacy": "Legacy-Format kompatibel mit v0.8", + "value.repository.latest-format": "Neuestes Format", + "value.repository.legacy-format": "Legacy-Format kompatibel mit v0.8", "value.snapshot-frequency.10-minutes": "alle 10 Minuten", "value.snapshot-frequency.12-hours": "alle 12 Stunden", "value.snapshot-frequency.15-minutes": "alle 15 Minuten", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 3b04eb6b..b54d423f 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -1,52 +1,71 @@ { - "common.back": "Back", - "common.cancel": "Cancel", - "common.click-here-to-learn-more": "Click here to learn more.", - "common.delete": "Delete", - "common.delete-confirm": "Confirm Delete", - "common.loading": "Loading ...", - "common.next": "Next", - "common.return": "Return", - "enter-object-name-prefix-or-leave-empty-hint": "Enter object name prefix or leave empty", + "common.action.back": "Back", + "common.action.cancel": "Cancel", + "common.action.click-here-to-learn-more": "Click here to learn more.", + "common.action.confirm-delete": "Confirm Delete", + "common.action.delete": "Delete", + "common.action.next": "Next", + "common.action.return": "Return", + "common.action.stop": "Stop", + "common.label.loading": "Loading...", "event.cli.copy-to-clipboard": "Copy to clipboard", "event.cli.show-cli-equivalent": "Click to show CLI equivalent", - "event.description.cancel": "Cancel", - "event.description.new": "Enter new description", - "event.description.remove": "Remove Description", - "event.description.update": "Update Description", - "event.log.hide": "Hide log", - "event.log.show": "Show log", - "event.pin.add": "Add Pin", - "event.pin.cancel": "Cancel", - "event.pin.remove": "Remove Pin", - "event.pin.snapshot-pin": "Pin Snapshot", - "event.pin.update": "Update Pin", + "event.log.hide-log": "Hide log", + "event.log.show-log": "Show log", + "event.pin.add-pin": "Add Pin", + "event.pin.pin-snapshot": "Pin Snapshot", + "event.pin.remove-pin": "Remove Pin", + "event.pin.update-pin": "Update Pin", "event.policy.delete": "Delete policy", "event.policy.edit": "Edit", "event.policy.save": "Save policy", - "event.policy.set": "Set policy", - "event.repository.advanced-options-hide": "Hide Advanced Options", - "event.repository.advanced-options.show": "Show Advanced Options", + "event.policy.set-policy": "Set policy", + "event.repository.cancel-connection": "Cancel connection", "event.repository.connect-to-repository": "Connect to repository", "event.repository.create-repository": "Create repository", - "event.task.cancel": "Cancel task", - "feedback.description.modal-title": "Snapshot Description", + "event.repository.disconnect-from-repository": "Disconnect from repository", + "event.repository.hide-advanced-options": "Hide advanced options", + "event.repository.show-advanced-options": "Show Advanced Options", + "event.repository.update-description": "Update description", + "event.snapshot.browse-directory": "Browse", + "event.snapshot.delete-selected": "event.snapshot.delete-selected", + "event.snapshot.delete-selected_one": "Do you want to delete the selected {{count}} snapshot?", + "event.snapshot.delete-selected_other": "Do you want to delete the selected {{count}} snapshots?", + "event.snapshot.description.enter-new-description": "Enter new description", + "event.snapshot.description.remove-description": "Remove Description", + "event.snapshot.description.update-description": "Update Description", + "event.snapshot.estimate": "Estimate", + "event.snapshot.fetch-snapshots": "Fetch snapshots", + "event.snapshot.history.delete-selected": "Delete Selected ({{count}})", + "event.snapshot.history.delete-snapshot-source": "Delete Snapshot Source", + "event.snapshot.history.deselect-all": "Deselect All", + "event.snapshot.history.select-all-snapshots": "Select All", + "event.snapshot.history.update-snapshot-description": "{{description}} - Click to update snapshot description.", + "event.snapshot.mount-directory": "Mount as Local Filesystem", + "event.snapshot.new-snapshot": "New Snapshot", + "event.snapshot.restore-file-directories": "Restore files and directories\n", + "event.snapshot.restore.begin-restore": "Begin restore", + "event.snapshot.restore.go-to-restore-task": "Go To Restore Task", + "event.snapshot.show-policy": "Policy", + "event.snapshot.snapshot-now": "Snapshot now", + "event.snapshot.synchronize": "Synchronize", + "event.snapshot.unmount-directory": "Unmount", + "event.task.action.cancel": "Cancel task", + "event.task.select.task-all": "All", + "event.task.select.task-failed": "Failed", + "event.task.select.task-running": "Running", + "feedback.directory.header.directories": "Directories", + "feedback.directory.header.files": "Files", + "feedback.directory.header.last-modification": "Last Modification", + "feedback.directory.header.name": "Name", + "feedback.directory.header.size": "Size", "feedback.error.common": "Error", "feedback.error.connection": "Connect Error:", - "feedback.header.actions": "Actions", - "feedback.header.defined": "Defined", - "feedback.header.details": "Details", - "feedback.header.directories": "Directories", "feedback.header.effective": "Effective", - "feedback.header.files": "Files", - "feedback.header.host": "Host", - "feedback.header.modification-last": "Last Modification", - "feedback.header.name": "Name", - "feedback.header.path": "Path", - "feedback.header.size": "Size", "feedback.header.username": "Username", - "feedback.pin.name": "Name of the pin", - "feedback.pin.standard-text": "do-not-delete", + "feedback.pin.add-pin-to-protect": "Add a pin to protect snapshot from deletion", + "feedback.pin.do-not-delete": "do-not-delete", + "feedback.pin.name-of-the-pin": "Name of the pin", "feedback.policy.action.command-mode": "Command Mode", "feedback.policy.actions.after-folder": "After Folder", "feedback.policy.actions.after-folder-help": "Script to run after folder", @@ -97,16 +116,32 @@ "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignore directories containing CACHEDIR.TAG and similar", "feedback.policy.files.scan-only-one-filesystem": "Scan only one filesystem", "feedback.policy.files.scan-only-one-filesystem-help": "Do not cross filesystem boundaries when creating a snapshot", + "feedback.policy.find-count": "feedback.policy.find-count", + "feedback.policy.find-count_one": "Found {{count}} policy matching the criteria", + "feedback.policy.find-count_other": "Found {{count}} policies matching the criteria", + "feedback.policy.find-hint": "Enter directory to find or set policy", + "feedback.policy.find-none": "No policies found", + "feedback.policy.find-none-create": " No policy found for directory {{path}}. Please setup a new policy.", + "feedback.policy.header.actions": "Actions", "feedback.policy.header.compression": "Compression", + "feedback.policy.header.defined": "Defined", "feedback.policy.header.error-handling": "Error Handling", "feedback.policy.header.files": "Files", "feedback.policy.header.folder-actions": "Folder Actions", + "feedback.policy.header.host": "Host", "feedback.policy.header.logging": "Logging", "feedback.policy.header.other": "Other", + "feedback.policy.header.path": "Path", "feedback.policy.header.scheduling": "Scheduling", "feedback.policy.header.snapshot-action": "Snapshot Actions", "feedback.policy.header.snapshot-retention": "Snapshot Retention", "feedback.policy.header.upload": "Upload", + "feedback.policy.kind.all": "All policies", + "feedback.policy.kind.applicable": "Applicable policies", + "feedback.policy.kind.global": "Global policies", + "feedback.policy.kind.local": "Local policies", + "feedback.policy.kind.per-host-policies": "Per-Host policies", + "feedback.policy.kind.per-user-policies": "Per-User policies", "feedback.policy.logging.cache-hit": "Cache hit", "feedback.policy.logging.cache-hit-help": "Log verbosity when a cache is used instead of uploading the file", "feedback.policy.logging.cache-miss": "Cache miss", @@ -123,6 +158,7 @@ "feedback.policy.other.disable-parent-policy-evaluation-help": "Prevents any parent policies from affecting this directory and its subdirectories", "feedback.policy.other.json-representation": "JSON Representation", "feedback.policy.other.json-representation-help": "This is the internal representation of a policy", + "feedback.policy.policies-defined-by-path-absolute": "Policies can only be defined for absolute paths.", "feedback.policy.retention.annual-snapshot-retain": "Annual", "feedback.policy.retention.annual-snapshot-retain-help": "How many annual snapshots to retain per source. The latest snapshot from each calendar year will be retained", "feedback.policy.retention.annual-snapshot-retain-hint": "Number of annual snapshots", @@ -168,19 +204,113 @@ "feedback.policy.upload.maximum-parallel-snapshots-help": "Maximum number of snapshots that can be uploaded simultaneously", "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "max number of parallel snapshots", "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "must be specified using global, user, or host policy", + "feedback.prodiver.gcs.paste-json-credentials": "Paste JSON credentials here", "feedback.provider.azure-blob-storage": "Azure Blob Storage", + "feedback.provider.azure.access-key": "Access Key", + "feedback.provider.azure.azure-storage-domain": "Azure Storage Domain", + "feedback.provider.azure.container": "Container", + "feedback.provider.azure.enter-access-key": "Enter secret access key", + "feedback.provider.azure.enter-azure-storage-domain": "Enter storage domain or leave empty for default 'blob.core.windows.net'", + "feedback.provider.azure.enter-container-name": "Enter container name", + "feedback.provider.azure.enter-object-name-prefix": "Enter object name prefix or leave empty", + "feedback.provider.azure.enter-sas-token": "Enter secret SAS Token", + "feedback.provider.azure.enter-storage-account": "Enter storage account name", + "feedback.provider.azure.object-name-prefix": "Object Name Prefix", + "feedback.provider.azure.sas-token": "SAS Token", + "feedback.provider.azure.storage-account": "Storage Account", + "feedback.provider.b2.bucket-name": "B2 Bucket", + "feedback.provider.b2.enter-account-key": "Enter secret application or account key", + "feedback.provider.b2.enter-account-key-id": "Enter application or account key ID", + "feedback.provider.b2.enter-bucket-name": "Enter bucket name", + "feedback.provider.b2.enter-object-name-prefix": "Enter object name prefix or leave empty", + "feedback.provider.b2.key": "Key", + "feedback.provider.b2.key-id": "Key ID", + "feedback.provider.b2.object-name-prefix": "Object Name Prefix", "feedback.provider.backblaze-b2": "Backblaze B2", + "feedback.provider.filesystem.directory-path": "Directory Path", + "feedback.provider.filesystem.enter-directory-path": "Enter directory path where you want to store repository files", + "feedback.provider.gcs.bucket-name": "GCS Bucket", + "feedback.provider.gcs.credentials-file": "Credentials File", + "feedback.provider.gcs.credentials-json": "Credentials JSON", + "feedback.provider.gcs.enter-bucket-name": "Enter bucket name", + "feedback.provider.gcs.enter-credentials-file-name": "Enter name of credentials JSON file", + "feedback.provider.gcs.enter-object-name-prefix": "Enter object name prefix or leave empty", + "feedback.provider.gcs.object-name-prefix": "Object Name Prefix", "feedback.provider.google-cloud-storage": "Google Cloud Storage", "feedback.provider.kopia-repository-server": "Kopia Repository Server", "feedback.provider.local-directory-or-nas": "Local Directory or NAS", "feedback.provider.rclone-remote": "Rclone Remote", + "feedback.provider.rclone.rclone-executable-path": "Rclone Executable Path", + "feedback.provider.rclone.rclone-executable-path-hint": "Enter path to rclone executable", + "feedback.provider.rclone.rclone-remote-path": "Rclone Remote Path", + "feedback.provider.rclone.rclone-remote-path-hint": "Enter :", + "feedback.provider.repositoryserver.enter-server-certificate-fingerprint": "Enter trusted server certificate fingerprint printed at server startup", + "feedback.provider.repositoryserver.enter-server-url": "Enter server URL (https://:port)", + "feedback.provider.repositoryserver.server-address": "Server address", + "feedback.provider.repositoryserver.server-certificate-fingerprint": "Trusted server certificate fingerprint (SHA256)", + "feedback.provider.repositorytoken.paste-token": "Paste connection token", + "feedback.provider.repositorytoken.token": "Token", "feedback.provider.required-either-key-file": "One of Password, Key File or Key Data is required.", "feedback.provider.required-either-known-host-data": "Either Known Hosts File or Known Hosts Data is required, but not both.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 or Compatible Storage", + "feedback.provider.s3.access-key-id": "Access Key ID", + "feedback.provider.s3.access-key-id-hint": "Enter access key ID", + "feedback.provider.s3.bucket-name": "Bucket", + "feedback.provider.s3.bucket-name-hint": "Enter bucket name", + "feedback.provider.s3.enter-object-name-prefix-hint": "Enter object name prefix or leave empty", + "feedback.provider.s3.object-name-prefix": "Object Name Prefix", + "feedback.provider.s3.override-region": "Override Region", + "feedback.provider.s3.override-region-hint": "Enter specific region (e.g., us-west-1) or leave empty", + "feedback.provider.s3.secret-access-key": "Secret Access Key", + "feedback.provider.s3.secret-access-key-hint": "Enter secret access key", + "feedback.provider.s3.server-endpoint": "Server Endpoint", + "feedback.provider.s3.server-endpoint-hint": "Enter server address (e.g., s3.amazonaws.com)", + "feedback.provider.s3.session-token": "Session Token", + "feedback.provider.s3.session-token-hint": "Enter session token or leave empty", + "feedback.provider.sftp-key-data": "Key data", + "feedback.provider.sftp-key-data-hint": "Paste contents of the key file", "feedback.provider.sftp-server": "SFTP Server", + "feedback.provider.sftp.enter-password": "Enter password", + "feedback.provider.sftp.enter-path-host-file": "Enter path to the known_hosts file", + "feedback.provider.sftp.enter-path-to-key-file": "Enter path to the key file", + "feedback.provider.sftp.enter-remote-path": "Enter remote path to repository, e.g., '/mnt/data/repository'", + "feedback.provider.sftp.enter-ssh-arguments": "Enter SSH command arguments ('user@host -s sftp' will be appended automatically)", + "feedback.provider.sftp.enter-ssh-host-name": "ssh host name (e.g., example.com)", + "feedback.provider.sftp.host": "Host", + "feedback.provider.sftp.known-host-data": "Known Hosts Data", + "feedback.provider.sftp.launch-external-ssh-command": "Launch external password-less SSH command", + "feedback.provider.sftp.launch-external-ssh-command-hint": "By default Kopia connects to the server using internal SSH client which supports limited options. Alternatively it may launch external password-less SSH command, which supports additional options, but is generally less efficient than the built-in client.", + "feedback.provider.sftp.password": "Password", + "feedback.provider.sftp.paste-content-of-known-host": "Paste the contents of the known_hosts file", + "feedback.provider.sftp.path": "Path", + "feedback.provider.sftp.path-host-file": "Path to known_hosts file", + "feedback.provider.sftp.path-key-file": "Path to key file", + "feedback.provider.sftp.port": "Port", + "feedback.provider.sftp.port-number": "Port number (e.g., 22)", + "feedback.provider.sftp.provide-passwordless-ssh-command": "Provide the passwordless SSH command to execute (typically 'ssh')", + "feedback.provider.sftp.ssh-arguments": "SSH Arguments", + "feedback.provider.sftp.ssh-command": "SSH Command", + "feedback.provider.sftp.user": "User", + "feedback.provider.sftp.user-name": "User name", "feedback.provider.use-repository-token": "Use Repository Token", "feedback.provider.webdav-server": "WebDAV Server", + "feedback.provider.webdav.enter-password": "Enter password", + "feedback.provider.webdav.enter-username": "Enter username", + "feedback.provider.webdav.password": "Password", + "feedback.provider.webdav.server-url": "WebDAV Server URL", + "feedback.provider.webdav.username": "Username", "feedback.repository.additional-parameters-hint": "Additional parameters can be set when creating repository using command line.", + "feedback.repository.attribute.algorithm-eco": "Error correction algorithm", + "feedback.repository.attribute.algorithm-encryption": "Encryption algorithm", + "feedback.repository.attribute.algorithm-hash": "Hash algorithm", + "feedback.repository.attribute.algorithm-splitter": "Splitter algorithm", + "feedback.repository.attribute.config-file": "Config file", + "feedback.repository.attribute.connected-as": "Connected as", + "feedback.repository.attribute.internal-compression": "Internal compression", + "feedback.repository.attribute.repository-eco": "Error correction overhead", + "feedback.repository.attribute.repository-format": "Repository format", + "feedback.repository.attribute.repository-provider": "Provider", + "feedback.repository.attribute.server-url": "Server URL", "feedback.repository.configuration": "Storage Configuration", "feedback.repository.connect-as": "Connect as", "feedback.repository.connect-in-read-only-mode": "Connect in read-only mode", @@ -188,8 +318,14 @@ "feedback.repository.connect-to-repository": "Connect to repository", "feedback.repository.create-repository-new": "Create New Repository", "feedback.repository.create-repository-new-help": "Enter a strong password to create Kopia repository in the provided storage.", + "feedback.repository.eco-disabled": "Disabled", "feedback.repository.eec-warning": "[EXPERIMENTAL] Error correction can help protect from certain kinds of data corruption due to spontaneous bit flips in the storage media.", "feedback.repository.encryption": "Encryption", + "feedback.repository.enter-repository-password": "Enter repository password", + "feedback.repository.hostname": "Hostname", + "feedback.repository.hostname-hint": "Override this when restoring a snapshot taken on another machine", + "feedback.repository.internal-compression-supported-no": "no", + "feedback.repository.internal-compression-supported-yes": "yes", "feedback.repository.kopia-server-parameters": "Kopia Server Parameters", "feedback.repository.name-default": "My Repository", "feedback.repository.override-hint": "To override, click 'Show Advanced Options'", @@ -198,20 +334,94 @@ "feedback.repository.repository-description": "Repository description", "feedback.repository.repository-description-help": "Helps to distinguish between multiple connected repositories", "feedback.repository.repository-description-hint": "Enter repository description", + "feedback.repository.repository-description-required": "Repository description is required", + "feedback.repository.repository-initializing": "Initializing repository...", + "feedback.repository.repository-is-read-only": "Repository is read-only", + "feedback.repository.repository-password": "Repository Password", + "feedback.repository.repository-password-confirm": "Confirm Repository Password", + "feedback.repository.repository-password-confirm-again": "enter repository password again", + "feedback.repository.repository-password-help": "Used to encrypt the repository's contents", "feedback.repository.repository-token-enter": "Enter Repository Token", - "feedback.snapshot.status.overdue": "overdue", + "feedback.repository.server-password": "Server password", + "feedback.repository.server-password-hint": "Enter password to connect to server", + "feedback.repository.status-connected": "Connected to repository", + "feedback.repository.username": "Username", + "feedback.repository.username-hint": "Override this when restoring a snapshot taken by another user", + "feedback.snapshot.create.enter-path-to-snapshot-hint": "Enter path to snapshot", + "feedback.snapshot.create.must-specify-path": "Must specify directory to snapshot.", + "feedback.snapshot.create.snapshot-new": "New Snapshot", + "feedback.snapshot.description": "Description", + "feedback.snapshot.description.snapshot-description": "Snapshot Description", + "feedback.snapshot.directory.browsing-not-supported": "Directory browsing is not supported in a web browser. Use Kopia UI.", + "feedback.snapshot.directory.restore-all-files-help": "You can mount/restore all the files and directories that you see below or restore files individually.", + "feedback.snapshot.header.actions": "Actions", + "feedback.snapshot.header.details": "Details", + "feedback.snapshot.header.directories": "Dirs", + "feedback.snapshot.header.files": "Files", + "feedback.snapshot.header.last-snapshot": "Last Snapshot", + "feedback.snapshot.header.next-snapshot": "Next Snapshot", + "feedback.snapshot.header.retention": "Retention", + "feedback.snapshot.header.root": "Root", + "feedback.snapshot.header.selected": "Selected", + "feedback.snapshot.header.snapshot-owner": "Owner", + "feedback.snapshot.header.snapshot-path": "Path", + "feedback.snapshot.header.snapshot-size": "Size", + "feedback.snapshot.header.start-time": "Start time", + "feedback.snapshot.header.status": "Status", + "feedback.snapshot.history.snapshot-displaying": "Displaying", + "feedback.snapshot.history.wipe-all-snapshots": "Wipe all snapshots and the policy for this source.", + "feedback.snapshot.restore.continue-on-errors": "Continue on errors", + "feedback.snapshot.restore.continue-on-errors-help": "When a restore error occurs, attempt to continue instead of failing fast.", + "feedback.snapshot.restore.destination": "Destination", + "feedback.snapshot.restore.destination-help": "You can also restore to a .zip or .tar file by providing the appropriate extension.", + "feedback.snapshot.restore.destination-hint": "Enter destination path", + "feedback.snapshot.restore.disable-zip-compression": "Disable ZIP compression", + "feedback.snapshot.restore.disable-zip-compression-help": "Do not compress when restoring to a ZIP file (faster).", + "feedback.snapshot.restore.minimal-file-size-for-shallow-restore": "Minimal file size for shallow restore", + "feedback.snapshot.restore.overwrite-directory": "Overwrite directories", + "feedback.snapshot.restore.overwrite-files": "Overwrite files", + "feedback.snapshot.restore.overwrite-symbolic-links": "Overwrite symbolic links", + "feedback.snapshot.restore.restore-file-modification-time": "Restore file modification time", + "feedback.snapshot.restore.restore-file-ownership": "Restore file ownership", + "feedback.snapshot.restore.restore-file-permissions": "Restore file permissions", + "feedback.snapshot.restore.shallow-restore-at-depth": "Shallow restore at depth", + "feedback.snapshot.restore.skip-previously-restored-files": "Skip previously restored files and symlinks", + "feedback.snapshot.restore.snapshot-restore": "Restore", + "feedback.snapshot.restore.write-files-atomically": "Write files atomically", + "feedback.snapshot.restore.write-sparse-files": "Write sparse files", + "feedback.snapshot.show-individual-snapshots-count": "feedback.snapshot.show-individual-snapshots-count", + "feedback.snapshot.show-individual-snapshots-count_one": "Show {{count}} individual snapshot", + "feedback.snapshot.show-individual-snapshots-count_other": "Show {{count}} individual snapshots", + "feedback.snapshot.start-after-previous-snapshot": "Snapshot will start after the previous snapshot completes", + "feedback.snapshot.status.status-overdue": "overdue", + "feedback.snapshot.status.status-pending": "Pending", "feedback.tab.policies": "Policies", "feedback.tab.preferences": "Preferences", "feedback.tab.repository": "Repository", "feedback.tab.repository-is-not-connected": "Repository is not connected", "feedback.tab.snapshots": "Snapshots", "feedback.tab.tasks": "Tasks", - "feedback.task.canceled-after": "Canceled after", - "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} excluded) Files: {{files}} ({{files.excluded}} excluded) Directories: {{directories}} ({{directories.excluded}} excluded) Errors: {{errors}} ({{errors.ignored}} ignored)", - "feedback.task.failed-after": "Failed after", - "feedback.task.finished-in": "Finished in", - "feedback.task.running-for": "Running for", - "feedback.task.total": "Total", + "feedback.task.estimated-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} excluded) Files: {{files}} ({{files.excluded}} excluded) Directories: {{directories}} ({{directories.excluded}} excluded) Errors: {{errors}} ({{errors.ignored}} ignored)", + "feedback.task.header.counter": "Counter", + "feedback.task.header.value": "Value", + "feedback.task.logs": "Logs", + "feedback.task.no-tasks-help": "A list of tasks will appear here when you create snapshots, restore, run maintenance, etc.", + "feedback.task.search-tasks-by-hint": "Search task logs by description", + "feedback.task.status.task-canceled": "Task canceled", + "feedback.task.status.task-canceled-after": "Task canceled after", + "feedback.task.status.task-canceling": "Canceling", + "feedback.task.status.task-error": "Task error", + "feedback.task.status.task-failed-after": "Failed after", + "feedback.task.status.task-finished": "Finished", + "feedback.task.status.task-finished-in": "Finished in", + "feedback.task.status.task-running-for": "Task running for", + "feedback.task.status.task-started": "Started", + "feedback.task.status.task-succeeded-after": "Task succeeded after", + "feedback.task.table.header-description": "Description", + "feedback.task.table.header-kind": "Kind", + "feedback.task.table.header-start-time": "Start time", + "feedback.task.table.header-status": "Status", + "feedback.task.tasks-total": "Total", "feedback.ui.appearance": "Appearance", "feedback.ui.appearance-help": "Specifies the appearance of the user interface", "feedback.ui.appearance-hint": "Select font size", @@ -224,225 +434,12 @@ "feedback.ui.theme-description": "Theme", "feedback.ui.theme-help": "The current active theme", "feedback.ui.theme-select": "Select theme", - "feedback.validation.azure.access-key": "Access Key", - "feedback.validation.azure.access-key-hint": "Enter secret access key", - "feedback.validation.azure.azure-storage-domain": "Azure Storage Domain", - "feedback.validation.azure.azure-storage-domain-hint": "Enter storage domain or leave empty for default 'blob.core.windows.net'", - "feedback.validation.azure.container": "Container", - "feedback.validation.azure.container-hint": "Enter container name", - "feedback.validation.azure.object-name-prefix": "Object Name Prefix", - "feedback.validation.azure.object-name-prefix-hint": "Enter object name prefix or leave empty", - "feedback.validation.azure.sas-token": "SAS Token", - "feedback.validation.azure.sas-token-hint": "Enter secret SAS Token", - "feedback.validation.azure.storage-account": "Storage Account", - "feedback.validation.azure.storage-account-hint": "Enter storage account name", - "feedback.validation.b2.bucket-name": "B2 Bucket", - "feedback.validation.b2.bucket-name-hint": "Enter bucket name", - "feedback.validation.b2.key": "Key", - "feedback.validation.b2.key-hint": "Enter secret application or account key", - "feedback.validation.b2.key-id": "Key ID", - "feedback.validation.b2.key-id-hint": "Enter application or account key ID", - "feedback.validation.b2.object-name-prefix": "Object Name Prefix", - "feedback.validation.b2.object-name-prefix-hint": "Enter object name prefix or leave empty", - "feedback.validation.gcs.bucket-name": "GCS Bucket", - "feedback.validation.gcs.bucket-name-hint": "Enter bucket name", - "feedback.validation.gcs.credentials-file": "Credentials File", - "feedback.validation.gcs.credentials-file-hint": "Enter name of credentials JSON file", - "feedback.validation.gcs.credentials-json": "Credentials JSON", - "feedback.validation.gcs.credentials-json-paste": "Paste JSON credentials here", - "feedback.validation.gcs.object-name-prefix": "Object Name Prefix", - "feedback.validation.gcs.object-name-prefix-hint": "Enter object name prefix or leave empty", "feedback.validation.invalid-times-of-day": "Invalid Times of Day", - "feedback.validation.local.directory-path": "Directory Path", - "feedback.validation.local.directory-path-hint": "Enter directory path where you want to store repository files", "feedback.validation.optional.valid-number-or-empty": "Must be a valid number or empty", "feedback.validation.passwords-dont-match": "Passwords don't match", - "feedback.validation.rclone.rclone-executable-path": "Rclone Executable Path", - "feedback.validation.rclone.rclone-executable-path-hint": "Enter path to rclone executable", - "feedback.validation.rclone.rclone-remote-path": "Rclone Remote Path", - "feedback.validation.rclone.rclone-remote-path-hint": "Enter :", - "feedback.validation.repository-server.server-address": "Server address", - "feedback.validation.repository-server.server-address-hint": "Enter server URL (https://:port)", - "feedback.validation.repository-server.server-certificate-fingerprint": "Trusted server certificate fingerprint (SHA256)", - "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Enter trusted server certificate fingerprint printed at server startup", - "feedback.validation.repository-token.token": "Token", - "feedback.validation.repository-token.token-hint": "Paste connection token", "feedback.validation.required.directory": "Required field", "feedback.validation.required.field": "Required field", - "feedback.validation.required.hostname": "Hostname", - "feedback.validation.required.hostname-hint": "Override this when restoring a snapshot taken on another machine", - "feedback.validation.required.password-repository": "Repository Password", - "feedback.validation.required.password-repository-help": "Used to encrypt the repository's contents", - "feedback.validation.required.password-repository-hint": "Enter repository password", - "feedback.validation.required.repository-password-confirm": "Confirm Repository Password", - "feedback.validation.required.repository-password-confirm-again": "enter repository password again", - "feedback.validation.required.server-password": "Server password", - "feedback.validation.required.server-password-hint": "Enter password to connect to server", - "feedback.validation.required.username": "Username", - "feedback.validation.required.username-hint": "Override this when restoring a snapshot taken by another user", "feedback.validation.required.valid-number-or-empty": "Must be a valid number or empty", - "feedback.validation.s3.access-key-id": "Access Key ID", - "feedback.validation.s3.access-key-id-hint": "Enter access key ID", - "feedback.validation.s3.bucket-name": "Bucket", - "feedback.validation.s3.bucket-name-hint": "Enter bucket name", - "feedback.validation.s3.object-name-prefix": "Object Name Prefix", - "feedback.validation.s3.override-region": "Override Region", - "feedback.validation.s3.override-region-hint": "Enter specific region (e.g., us-west-1) or leave empty", - "feedback.validation.s3.secret-access-key": "Secret Access Key", - "feedback.validation.s3.secret-access-key-hint": "Enter secret access key", - "feedback.validation.s3.server-endpoint": "Server Endpoint", - "feedback.validation.s3.server-endpoint-hint": "Enter server address (e.g., s3.amazonaws.com)", - "feedback.validation.s3.session-token": "Session Token", - "feedback.validation.s3.session-token-hint": "Enter session token or leave empty", - "feedback.validation.webdav.password": "Password", - "feedback.validation.webdav.password-hint": "Enter password", - "feedback.validation.webdav.server-url": "WebDAV Server URL", - "feedback.validation.webdav.username": "Username", - "feedback.validation.webdav.username-hint": "Enter username", - "policies.feedback.find.count_one": "Found {{count}} policy matching the criteria", - "policies.feedback.find.count_other": "Found {{count}} policies matching the criteria", - "policies.feedback.find.none": "No policies found.", - "policies.feedback.find.none.create": " No policy found for directory {{path}}. Please setup a new policy.", - "policies.feedback.loading": "Loading ...", - "policies.feedback.path.absolute": "Policies can only be defined for absolute paths.", - "policies.feedback.policy.find": "Enter directory to find or set policy", - "policies.kind.all": "All policies", - "policies.kind.applicable": "Applicable policies", - "policies.kind.global": "Global policies", - "policies.kind.host": "Per-Host policies", - "policies.kind.local": "Local policies", - "policies.kind.user": "Per-User policies", - "repository.attribute.algorithm.eco": "Error correction algorithm", - "repository.attribute.algorithm.encryption": "Encryption algorithm", - "repository.attribute.algorithm.hash": "Hash algorithm", - "repository.attribute.algorithm.splitter": "Splitter algorithm", - "repository.attribute.compression.internal": "Internal compression", - "repository.attribute.config.file": "Config file", - "repository.attribute.connected.as": "Connected as", - "repository.attribute.eco": "Error correction overhead", - "repository.attribute.format": "Repository format", - "repository.attribute.provider": "Provider", - "repository.attribute.server.url": "Server URL", - "repository.event.connection.cancel": "Cancel connection", - "repository.event.connection.disconnect": "Disconnect from repository", - "repository.event.description.update": "Update description", - "repository.feedback.compression.internal.not.supported": "no", - "repository.feedback.compression.internal.supported": "yes", - "repository.feedback.description.required": "Repository description is required", - "repository.feedback.eco.disabled": "Disabled", - "repository.feedback.read.only": "Repository is read-only", - "repository.status.connected": "Connected to repository", - "repository.status.initializing": "Initializing repository...", - "snapshot.event.create.estimate": "Estimate", - "snapshot.event.create.now": "Snapshot now", - "snapshot.event.create.path": "Enter path to snapshot", - "snapshot.event.create.path.resolve": "Must specify directory to snapshot.", - "snapshot.event.delete.selected_one": "Do you want to delete the selected {{count}} snapshot?", - "snapshot.event.delete.selected_other": "Do you want to delete the selected {{count}} snapshots?", - "snapshot.event.directory.browse": "Browse", - "snapshot.event.directory.browsing": "Directory browsing is not supported in a web browser. Use Kopia UI.", - "snapshot.event.directory.mount": "Mount as Local Filesystem", - "snapshot.event.directory.restore": "Restore files and directories\n", - "snapshot.event.directory.unmount": "Unmount", - "snapshot.event.history.delete.source": "Delete Snapshot Source", - "snapshot.event.history.description.update": "{{description}} - Click to update snapshot description.", - "snapshot.event.history.deselect.all": "Deselect All", - "snapshot.event.history.fetch.snapshots": "Fetch snapshots", - "snapshot.event.history.pin.add": "Add a pin to protect snapshot from deletion", - "snapshot.event.history.select.all": "Select All", - "snapshot.event.history.selected.delete": "Delete Selected (", - "snapshot.event.restore": "Restore", - "snapshot.event.restore.begin": "Begin restore", - "snapshot.event.snapshot.new": "New Snapshot", - "snapshot.event.snapshot.pending": "Pending", - "snapshot.event.snapshot.policy": "Policy", - "snapshot.event.synchronize": "Synchronize", - "snapshot.feedback.directory.mount.restore": "You can mount/restore all the files and directories that you see below or restore files individually.", - "snapshot.feedback.history.display": "Displaying", - "snapshot.feedback.history.wipe.all": "Wipe all snapshots and the policy for this source.", - "snapshot.feedback.restore.continue.errors": "Continue on errors", - "snapshot.feedback.restore.continue.errors.help": "When a restore error occurs, attempt to continue instead of failing fast.", - "snapshot.feedback.restore.destination": "Destination", - "snapshot.feedback.restore.destination.help": "You can also restore to a .zip or .tar file by providing the appropriate extension.", - "snapshot.feedback.restore.destination.path": "Enter destination path", - "snapshot.feedback.restore.directory.overwrite": "Overwrite directories", - "snapshot.feedback.restore.disable.compression.zip": "Disable ZIP compression", - "snapshot.feedback.restore.disable.compression.zip.help": "Do not compress when restoring to a ZIP file (faster).", - "snapshot.feedback.restore.file.atomically": "Write files atomically", - "snapshot.feedback.restore.file.modification.time": "Restore file modification time", - "snapshot.feedback.restore.file.overwrite": "Overwrite files", - "snapshot.feedback.restore.file.ownership": "Restore file ownership", - "snapshot.feedback.restore.file.permission": "Restore file permissions", - "snapshot.feedback.restore.file.sparse": "Write sparse files", - "snapshot.feedback.restore.link.overwrite": "Overwrite symbolic links", - "snapshot.feedback.restore.shallow.depth": "Shallow restore at depth", - "snapshot.feedback.restore.shallow.file.size.minimal": "Minimal file size for shallow restore", - "snapshot.feedback.restore.skip": "Skip previously restored files and symlinks", - "snapshot.feedback.restore.task.go": "Go To Restore Task", - "snapshot.feedback.snapshot.new": "New Snapshot", - "snapshot.feedback.snapshot.start": "Snapshot will start after the previous snapshot completes", - "snapshot.header.actions": "Actions", - "snapshot.header.snapshot.last": "Last Snapshot", - "snapshot.header.snapshot.next": "Next Snapshot", - "snapshot.header.snapshot.owner": "Owner", - "snapshot.header.snapshot.path": "Path", - "snapshot.header.snapshot.size": "Size", - "snapshot.header.status": "Status", - "snapshot.history.feedack.unfiltered.count_one": "Show {{count}} individual snapshot", - "snapshot.history.feedack.unfiltered.count_other": "Show {{count}} individual snapshots", - "snapshot.history.header.description": "Description", - "snapshot.history.header.directories": "Dirs", - "snapshot.history.header.files": "Files", - "snapshot.history.header.retention": "Retention", - "snapshot.history.header.root": "Root", - "snapshot.history.header.selected": "Selected", - "snapshot.history.header.size": "Size", - "snapshot.history.header.time.start": "Start time", - "task.all": "All", - "task.event.stop": "Stop", - "task.failed": "Failed", - "task.feedback.entries": "A list of tasks will appear here when you create snapshots, restore, run maintenance, etc.", - "task.feedback.search": "Search logs by description", - "task.header.counter": "Counter", - "task.header.description": "Description", - "task.header.kind": "Kind", - "task.header.status": "Status", - "task.header.time.start": "Start time", - "task.header.value": "Value", - "task.loading": "Loading...", - "task.logs": "Logs", - "task.running": "Running", - "task.status.canceled": "Task canceled after", - "task.status.canceling": "Canceling", - "task.status.error": "Task error", - "task.status.finished": "Finished", - "task.status.running.for": "Task running for", - "task.status.started": "Started", - "task.status.succeed.after": "Task succeeded after", - "validation.password": "Password", - "validation.password-hint": "Enter password", - "validation.provider.external-ssh-command": "Launch external password-less SSH command", - "validation.provider.external-ssh-command-hint": "By default Kopia connects to the server using internal SSH client which supports limited options. Alternatively it may launch external password-less SSH command, which supports additional options, but is generally less efficient than the built-in client.", - "validation.provider.host": "Host", - "validation.provider.host-hint": "ssh host name (e.g., example.com)", - "validation.provider.key-data": "Key data", - "validation.provider.key-data-hint": "Paste contents of the key file", - "validation.provider.known-host-data": "Known Hosts Data", - "validation.provider.known-host-data-hint": "Paste the contents of the known_hosts file", - "validation.provider.path": "Path", - "validation.provider.path-hint": "Enter remote path to repository, e.g., '/mnt/data/repository'", - "validation.provider.path-host-file": "Path to known_hosts file", - "validation.provider.path-host-file-hint": "Enter path to the known_hosts file", - "validation.provider.path-key-file": "Path to key file", - "validation.provider.path-key-file-hint": "Enter path to the key file", - "validation.provider.port": "Port", - "validation.provider.port-hint": "Port number (e.g., 22)", - "validation.provider.ssh-arguments": "SSH Arguments", - "validation.provider.ssh-arguments-hint": "Enter SSH command arguments ('user@host -s sftp' will be appended automatically)", - "validation.provider.ssh-command": "SSH Command", - "validation.provider.ssh-command-hint": "Provide the passwordless SSH command to execute (typically 'ssh')", - "validation.provider.user": "User", - "validation.provider.user-hint": "User name", "value.algorithm.eco-disabled": "Disabled", "value.algorithm.suffix-not-recommended": "(NOT RECOMMENDED)", "value.algorithm.suffix-recommended": "(RECOMMENDED)", @@ -458,8 +455,8 @@ "value.policy.optional": "Ignore failures", "value.provider.s3.http-connection-insecure": "Use HTTP connection (insecure)", "value.provider.s3.no-tls-verification": "Do not verify TLS certificate", - "value.repository.format.latest": "Latest format", - "value.repository.format.legacy": "Legacy format compatible with v0.8", + "value.repository.latest-format": "Latest format", + "value.repository.legacy-format": "Legacy format compatible with v0.8", "value.snapshot-frequency.10-minutes": "every 10 minutes", "value.snapshot-frequency.12-hours": "every 12 hours", "value.snapshot-frequency.15-minutes": "every 15 minutes", diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 2e5c85e1..56f673b1 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -1,52 +1,71 @@ { - "common.back": "Atrás", - "common.cancel": "Cancelar", - "common.click-here-to-learn-more": "Clic aquí para saber más.", - "common.delete": "Borrar", - "common.delete-confirm": "Confirmar eliminación", - "common.loading": "Cargando ...", - "common.next": "Próximo", - "common.return": "Volver", - "enter-object-name-prefix-or-leave-empty-hint": "Introduzca el prefijo del nombre del objeto o déjelo vacío", + "common.action.back": "Atrás", + "common.action.cancel": "Cancelar", + "common.action.click-here-to-learn-more": "Clic aquí para saber más.", + "common.action.confirm-delete": "Confirmar eliminación", + "common.action.delete": "Borrar", + "common.action.next": "Próximo", + "common.action.return": "Volver", + "common.action.stop": "Detener", + "common.label.loading": "Cargando...", "event.cli.copy-to-clipboard": "Copiar al portapapeles", "event.cli.show-cli-equivalent": "Haga clic para mostrar el equivalente de CLI", - "event.description.cancel": "Cancelar", - "event.description.new": "Ingrese una nueva descripción", - "event.description.remove": "Eliminar descripción", - "event.description.update": "Descripción de la actualización", - "event.log.hide": "Ocultar registro", - "event.log.show": "Mostrar registro", - "event.pin.add": "Agregar PIN", - "event.pin.cancel": "Cancelar", - "event.pin.remove": "Quitar pin", - "event.pin.snapshot-pin": "Instantánea de pin", - "event.pin.update": "Actualizar PIN", + "event.log.hide-log": "Ocultar registro", + "event.log.show-log": "Mostrar registro", + "event.pin.add-pin": "Agregar PIN", + "event.pin.pin-snapshot": "Instantánea de pin", + "event.pin.remove-pin": "Quitar pin", + "event.pin.update-pin": "Actualizar PIN", "event.policy.delete": "Eliminar política", "event.policy.edit": "Editar", "event.policy.save": "Guardar política", - "event.policy.set": "Establecer política", - "event.repository.advanced-options-hide": "Ocultar opciones avanzadas", - "event.repository.advanced-options.show": "Mostrar opciones avanzadas", + "event.policy.set-policy": "Establecer política", + "event.repository.cancel-connection": "Cancelar conexión", "event.repository.connect-to-repository": "Conectarse al repositorio", "event.repository.create-repository": "Crear repositorio", - "event.task.cancel": "Cancelar tarea", - "feedback.description.modal-title": "Descripción de la instantánea", + "event.repository.disconnect-from-repository": "Desconectar del repositorio", + "event.repository.hide-advanced-options": "Ocultar opciones avanzadas", + "event.repository.show-advanced-options": "Mostrar opciones avanzadas", + "event.repository.update-description": "Actualizar descripción", + "event.snapshot.browse-directory": "Navegar", + "event.snapshot.delete-selected": "event.snapshot.delete-selected", + "event.snapshot.delete-selected_one": "¿Quieres eliminar la instantánea {{count}} seleccionada?", + "event.snapshot.delete-selected_other": "¿Quieres eliminar las {{count}} instantáneas seleccionadas?", + "event.snapshot.description.enter-new-description": "Ingrese una nueva descripción", + "event.snapshot.description.remove-description": "Eliminar descripción", + "event.snapshot.description.update-description": "Descripción de la actualización", + "event.snapshot.estimate": "Estimar", + "event.snapshot.fetch-snapshots": "Obtener instantáneas", + "event.snapshot.history.delete-selected": "Eliminar seleccionados ({{count}})", + "event.snapshot.history.delete-snapshot-source": "Eliminar fuente de instantánea", + "event.snapshot.history.deselect-all": "Deseleccionar todo", + "event.snapshot.history.select-all-snapshots": "Seleccionar todo", + "event.snapshot.history.update-snapshot-description": "{{description}}: haga clic para actualizar la descripción de la instantánea.", + "event.snapshot.mount-directory": "Montar como sistema de archivos local", + "event.snapshot.new-snapshot": "Nueva instantánea", + "event.snapshot.restore-file-directories": "Restaurar archivos y directorios", + "event.snapshot.restore.begin-restore": "Comenzar la restauración", + "event.snapshot.restore.go-to-restore-task": "Ir a restaurar tarea", + "event.snapshot.show-policy": "Política", + "event.snapshot.snapshot-now": "Instantánea ahora", + "event.snapshot.synchronize": "Sincronizar", + "event.snapshot.unmount-directory": "Desmontar", + "event.task.action.cancel": "Cancelar tarea", + "event.task.select.task-all": "Todas", + "event.task.select.task-failed": "Fallidas", + "event.task.select.task-running": "En ejecución", + "feedback.directory.header.directories": "Directorios", + "feedback.directory.header.files": "Archivos", + "feedback.directory.header.last-modification": "Última modificación", + "feedback.directory.header.name": "Nombre", + "feedback.directory.header.size": "Tamaño", "feedback.error.common": "Error", "feedback.error.connection": "Error de conexión:", - "feedback.header.actions": "Comportamiento", - "feedback.header.defined": "Definido", - "feedback.header.details": "Detalles", - "feedback.header.directories": "Directorios", "feedback.header.effective": "Eficaz", - "feedback.header.files": "Archivos", - "feedback.header.host": "Anfitrión", - "feedback.header.modification-last": "Última modificación", - "feedback.header.name": "Nombre", - "feedback.header.path": "Camino", - "feedback.header.size": "Tamaño", "feedback.header.username": "Nombre de usuario", - "feedback.pin.name": "nombre del pin", - "feedback.pin.standard-text": "no borres", + "feedback.pin.add-pin-to-protect": "Agregue un pin para proteger la instantánea contra la eliminación", + "feedback.pin.do-not-delete": "no borres", + "feedback.pin.name-of-the-pin": "nombre del pin", "feedback.policy.action.command-mode": "Modo de comando", "feedback.policy.actions.after-folder": "Después de la carpeta", "feedback.policy.actions.after-folder-help": "Script para ejecutar después de la carpeta", @@ -97,16 +116,32 @@ "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignorar directorios que contengan CACHEDIR.TAG y similares", "feedback.policy.files.scan-only-one-filesystem": "Escanea solo un sistema de archivos", "feedback.policy.files.scan-only-one-filesystem-help": "No cruce los límites del sistema de archivos al crear una instantánea", + "feedback.policy.find-count": "comentarios.política.find-count", + "feedback.policy.find-count_one": "Se encontró {{count}} política que coincide con los criterios", + "feedback.policy.find-count_other": "Se encontraron {{count}} políticas que coinciden con los criterios", + "feedback.policy.find-hint": "Ingrese al directorio para buscar o establecer una política", + "feedback.policy.find-none": "No se encontraron políticas", + "feedback.policy.find-none-create": "No se encontró ninguna política para el directorio {{ruta}}. \nConfigure una nueva política.", + "feedback.policy.header.actions": "Comportamiento", "feedback.policy.header.compression": "Compresión", + "feedback.policy.header.defined": "Definido", "feedback.policy.header.error-handling": "Manejo de errores", "feedback.policy.header.files": "Archivos", "feedback.policy.header.folder-actions": "Acciones de carpeta", + "feedback.policy.header.host": "Anfitrión", "feedback.policy.header.logging": "Inicio sesión", "feedback.policy.header.other": "Otro", + "feedback.policy.header.path": "Camino", "feedback.policy.header.scheduling": "Planificación", "feedback.policy.header.snapshot-action": "Acciones de instantáneas", "feedback.policy.header.snapshot-retention": "Retención de instantáneas", "feedback.policy.header.upload": "Subir", + "feedback.policy.kind.all": "Todas las pólizas", + "feedback.policy.kind.applicable": "Políticas aplicables", + "feedback.policy.kind.global": "Políticas globales", + "feedback.policy.kind.local": "Políticas locales", + "feedback.policy.kind.per-host-policies": "Políticas por host", + "feedback.policy.kind.per-user-policies": "Políticas por usuario", "feedback.policy.logging.cache-hit": "Golpe de caché", "feedback.policy.logging.cache-hit-help": "Registrar detalle cuando se utiliza un caché en lugar de cargar el archivo", "feedback.policy.logging.cache-miss": "Falta de caché", @@ -123,6 +158,7 @@ "feedback.policy.other.disable-parent-policy-evaluation-help": "Evita que las políticas principales afecten a este directorio y sus subdirectorios", "feedback.policy.other.json-representation": "Representación JSON", "feedback.policy.other.json-representation-help": "Esta es la representación interna de una política.", + "feedback.policy.policies-defined-by-path-absolute": "Las políticas sólo se pueden definir para rutas absolutas.", "feedback.policy.retention.annual-snapshot-retain": "Anual", "feedback.policy.retention.annual-snapshot-retain-help": "Cuántas instantáneas anuales conservar por fuente. \nSe conservará la última instantánea de cada año calendario.", "feedback.policy.retention.annual-snapshot-retain-hint": "Número de instantáneas anuales", @@ -168,19 +204,113 @@ "feedback.policy.upload.maximum-parallel-snapshots-help": "Número máximo de instantáneas que se pueden cargar simultáneamente", "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "número máximo de instantáneas paralelas", "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "debe especificarse mediante la política global, de usuario o de host", + "feedback.prodiver.gcs.paste-json-credentials": "Pegue las credenciales JSON aquí", "feedback.provider.azure-blob-storage": "Almacenamiento de blobs de Azure", + "feedback.provider.azure.access-key": "Llave de acceso", + "feedback.provider.azure.azure-storage-domain": "Dominio de almacenamiento de Azure", + "feedback.provider.azure.container": "Envase", + "feedback.provider.azure.enter-access-key": "Introduzca la clave de acceso secreta", + "feedback.provider.azure.enter-azure-storage-domain": "Ingrese el dominio de almacenamiento o déjelo vacío para el valor predeterminado 'blob.core.windows.net'", + "feedback.provider.azure.enter-container-name": "Introduzca el nombre del contenedor", + "feedback.provider.azure.enter-object-name-prefix": "Introduzca el prefijo del nombre del objeto o déjelo vacío", + "feedback.provider.azure.enter-sas-token": "Ingrese el token SAS secreto", + "feedback.provider.azure.enter-storage-account": "Ingrese el nombre de la cuenta de almacenamiento", + "feedback.provider.azure.object-name-prefix": "Prefijo del nombre del objeto", + "feedback.provider.azure.sas-token": "Ficha SAS", + "feedback.provider.azure.storage-account": "Cuenta de almacenamiento", + "feedback.provider.b2.bucket-name": "Balde B2", + "feedback.provider.b2.enter-account-key": "Ingrese la aplicación secreta o la clave de cuenta", + "feedback.provider.b2.enter-account-key-id": "Ingrese la ID de la clave de la aplicación o de la cuenta", + "feedback.provider.b2.enter-bucket-name": "Introduce el nombre del depósito", + "feedback.provider.b2.enter-object-name-prefix": "Introduzca el prefijo del nombre del objeto o déjelo vacío", + "feedback.provider.b2.key": "Llave", + "feedback.provider.b2.key-id": "ID de clave", + "feedback.provider.b2.object-name-prefix": "Prefijo del nombre del objeto", "feedback.provider.backblaze-b2": "Resplandor B2", + "feedback.provider.filesystem.directory-path": "Ruta de directorio", + "feedback.provider.filesystem.enter-directory-path": "Ingrese la ruta del directorio donde desea almacenar los archivos del repositorio", + "feedback.provider.gcs.bucket-name": "Cucharón GCS", + "feedback.provider.gcs.credentials-file": "Archivo de credenciales", + "feedback.provider.gcs.credentials-json": "Credenciales JSON", + "feedback.provider.gcs.enter-bucket-name": "Introduce el nombre del depósito", + "feedback.provider.gcs.enter-credentials-file-name": "Ingrese el nombre del archivo JSON de credenciales", + "feedback.provider.gcs.enter-object-name-prefix": "Introduzca el prefijo del nombre del objeto o déjelo vacío", + "feedback.provider.gcs.object-name-prefix": "Prefijo del nombre del objeto", "feedback.provider.google-cloud-storage": "Almacenamiento en la nube de Google", "feedback.provider.kopia-repository-server": "Servidor de repositorio de Kopia", "feedback.provider.local-directory-or-nas": "Directorio local o NAS", "feedback.provider.rclone-remote": "Clon remoto", + "feedback.provider.rclone.rclone-executable-path": "Ruta ejecutable de Rclone", + "feedback.provider.rclone.rclone-executable-path-hint": "Ingrese la ruta al ejecutable rclone", + "feedback.provider.rclone.rclone-remote-path": "Ruta remota de clonación", + "feedback.provider.rclone.rclone-remote-path-hint": "Ingrese :", + "feedback.provider.repositoryserver.enter-server-certificate-fingerprint": "Ingrese la huella digital del certificado del servidor confiable impresa al iniciar el servidor", + "feedback.provider.repositoryserver.enter-server-url": "Ingrese la URL del servidor (https://:puerto)", + "feedback.provider.repositoryserver.server-address": "Dirección del servidor", + "feedback.provider.repositoryserver.server-certificate-fingerprint": "Huella digital del certificado del servidor de confianza (SHA256)", + "feedback.provider.repositorytoken.paste-token": "Pegar token de conexión", + "feedback.provider.repositorytoken.token": "Simbólico", "feedback.provider.required-either-key-file": "Se requiere una de las opciones Contraseña, Archivo de claves o Datos clave.", "feedback.provider.required-either-known-host-data": "Se requiere archivo de hosts conocidos o datos de hosts conocidos, pero no ambos.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 o almacenamiento compatible", + "feedback.provider.s3.access-key-id": "ID de clave de acceso", + "feedback.provider.s3.access-key-id-hint": "Introduzca el ID de la clave de acceso", + "feedback.provider.s3.bucket-name": "Balde", + "feedback.provider.s3.bucket-name-hint": "Introduce el nombre del depósito", + "feedback.provider.s3.enter-object-name-prefix-hint": "Introduzca el prefijo del nombre del objeto o déjelo vacío", + "feedback.provider.s3.object-name-prefix": "Prefijo del nombre del objeto", + "feedback.provider.s3.override-region": "Anular región", + "feedback.provider.s3.override-region-hint": "Ingrese una región específica (por ejemplo, us-west-1) o déjela vacía", + "feedback.provider.s3.secret-access-key": "Clave de acceso secreta", + "feedback.provider.s3.secret-access-key-hint": "Introduzca la clave de acceso secreta", + "feedback.provider.s3.server-endpoint": "Punto final del servidor", + "feedback.provider.s3.server-endpoint-hint": "Ingrese la dirección del servidor (por ejemplo, s3.amazonaws.com)", + "feedback.provider.s3.session-token": "Token de sesión", + "feedback.provider.s3.session-token-hint": "Ingrese el token de sesión o déjelo vacío", + "feedback.provider.sftp-key-data": "Llave de datos", + "feedback.provider.sftp-key-data-hint": "Pegar el contenido del archivo clave", "feedback.provider.sftp-server": "Servidor SFTP", + "feedback.provider.sftp.enter-password": "Introducir la contraseña", + "feedback.provider.sftp.enter-path-host-file": "Ingrese la ruta al archivo conocido_hosts", + "feedback.provider.sftp.enter-path-to-key-file": "Ingrese la ruta al archivo clave", + "feedback.provider.sftp.enter-remote-path": "Ingrese la ruta remota al repositorio, por ejemplo, '/mnt/data/repository'", + "feedback.provider.sftp.enter-ssh-arguments": "Ingrese los argumentos del comando SSH ('user@host -s sftp' se agregará automáticamente)", + "feedback.provider.sftp.enter-ssh-host-name": "nombre de host ssh (por ejemplo, ejemplo.com)", + "feedback.provider.sftp.host": "Anfitrión", + "feedback.provider.sftp.known-host-data": "Datos de hosts conocidos", + "feedback.provider.sftp.launch-external-ssh-command": "Inicie el comando SSH externo sin contraseña", + "feedback.provider.sftp.launch-external-ssh-command-hint": "De forma predeterminada, Kopia se conecta al servidor mediante un cliente SSH interno que admite opciones limitadas. \nAlternativamente, puede iniciar un comando SSH externo sin contraseña, que admite opciones adicionales, pero generalmente es menos eficiente que el cliente integrado.", + "feedback.provider.sftp.password": "Contraseña", + "feedback.provider.sftp.paste-content-of-known-host": "Pegue el contenido del archivo conocido_hosts", + "feedback.provider.sftp.path": "Camino", + "feedback.provider.sftp.path-host-file": "Ruta al archivoknown_hosts", + "feedback.provider.sftp.path-key-file": "Ruta al archivo clave", + "feedback.provider.sftp.port": "Puerto", + "feedback.provider.sftp.port-number": "Número de puerto (por ejemplo, 22)", + "feedback.provider.sftp.provide-passwordless-ssh-command": "Proporcione el comando SSH sin contraseña para ejecutar (normalmente 'ssh')", + "feedback.provider.sftp.ssh-arguments": "Argumentos SSH", + "feedback.provider.sftp.ssh-command": "Comando SSH", + "feedback.provider.sftp.user": "Usuario", + "feedback.provider.sftp.user-name": "Nombre de usuario", "feedback.provider.use-repository-token": "Usar token de repositorio", "feedback.provider.webdav-server": "Servidor WebDAV", + "feedback.provider.webdav.enter-password": "Introducir la contraseña", + "feedback.provider.webdav.enter-username": "Introduzca su nombre de usuario", + "feedback.provider.webdav.password": "Contraseña", + "feedback.provider.webdav.server-url": "URL del servidor WebDAV", + "feedback.provider.webdav.username": "Nombre de usuario", "feedback.repository.additional-parameters-hint": "Se pueden configurar parámetros adicionales al crear un repositorio usando la línea de comando.", + "feedback.repository.attribute.algorithm-eco": "Algoritmo de corrección de errores", + "feedback.repository.attribute.algorithm-encryption": "Algoritmo de cifrado", + "feedback.repository.attribute.algorithm-hash": "Algoritmo de hash", + "feedback.repository.attribute.algorithm-splitter": "Algoritmo de división", + "feedback.repository.attribute.config-file": "Archivo de configuración", + "feedback.repository.attribute.connected-as": "Conectado como", + "feedback.repository.attribute.internal-compression": "Compresión interna", + "feedback.repository.attribute.repository-eco": "Overhead de corrección de errores", + "feedback.repository.attribute.repository-format": "Formato del repositorio", + "feedback.repository.attribute.repository-provider": "Proveedor", + "feedback.repository.attribute.server-url": "URL del servidor", "feedback.repository.configuration": "Configuración de almacenamiento", "feedback.repository.connect-as": "Conectar como", "feedback.repository.connect-in-read-only-mode": "Conéctese en modo de solo lectura", @@ -188,8 +318,14 @@ "feedback.repository.connect-to-repository": "Conectarse al repositorio", "feedback.repository.create-repository-new": "Crear nuevo repositorio", "feedback.repository.create-repository-new-help": "Ingrese una contraseña segura para crear el repositorio de Kopia en el almacenamiento proporcionado.", + "feedback.repository.eco-disabled": "Deshabilitado", "feedback.repository.eec-warning": "[EXPERIMENTAL] La corrección de errores puede ayudar a proteger contra ciertos tipos de corrupción de datos debido a cambios espontáneos de bits en los medios de almacenamiento.", "feedback.repository.encryption": "Cifrado", + "feedback.repository.enter-repository-password": "Ingrese la contraseña del repositorio", + "feedback.repository.hostname": "Nombre de host", + "feedback.repository.hostname-hint": "Anule esto al restaurar una instantánea tomada en otra máquina", + "feedback.repository.internal-compression-supported-no": "no", + "feedback.repository.internal-compression-supported-yes": "sí", "feedback.repository.kopia-server-parameters": "Parámetros del servidor Kopia", "feedback.repository.name-default": "Mi repositorio", "feedback.repository.override-hint": "Para anular, haga clic en 'Mostrar opciones avanzadas'", @@ -198,20 +334,94 @@ "feedback.repository.repository-description": "Descripción del repositorio", "feedback.repository.repository-description-help": "Ayuda a distinguir entre múltiples repositorios conectados", "feedback.repository.repository-description-hint": "Ingrese la descripción del repositorio", + "feedback.repository.repository-description-required": "La descripción del repositorio es obligatoria", + "feedback.repository.repository-initializing": "Inicializando el repositorio...", + "feedback.repository.repository-is-read-only": "El repositorio es de sólo lectura", + "feedback.repository.repository-password": "Contraseña del repositorio", + "feedback.repository.repository-password-confirm": "Confirmar contraseña del repositorio", + "feedback.repository.repository-password-confirm-again": "ingrese la contraseña del repositorio nuevamente", + "feedback.repository.repository-password-help": "Se utiliza para cifrar el contenido del repositorio.", "feedback.repository.repository-token-enter": "Ingrese el token del repositorio", - "feedback.snapshot.status.overdue": "atrasado", + "feedback.repository.server-password": "Contraseña del servidor", + "feedback.repository.server-password-hint": "Ingrese la contraseña para conectarse al servidor", + "feedback.repository.status-connected": "Conectado al repositorio", + "feedback.repository.username": "Nombre de usuario", + "feedback.repository.username-hint": "Anule esto al restaurar una instantánea tomada por otro usuario", + "feedback.snapshot.create.enter-path-to-snapshot-hint": "Ingrese la ruta a la instantánea", + "feedback.snapshot.create.must-specify-path": "Debe especificar el directorio para la instantánea.", + "feedback.snapshot.create.snapshot-new": "Nueva instantánea", + "feedback.snapshot.description": "Descripción", + "feedback.snapshot.description.snapshot-description": "Descripción de la instantánea", + "feedback.snapshot.directory.browsing-not-supported": "La exploración de directorios no es compatible con un navegador web. \nUtilice la interfaz de usuario de Kopia.", + "feedback.snapshot.directory.restore-all-files-help": "Puede montar/restaurar todos los archivos y directorios que ve a continuación o restaurar archivos individualmente.", + "feedback.snapshot.header.actions": "Acciones", + "feedback.snapshot.header.details": "Detalles", + "feedback.snapshot.header.directories": "directorios", + "feedback.snapshot.header.files": "Archivos", + "feedback.snapshot.header.last-snapshot": "Última instantánea", + "feedback.snapshot.header.next-snapshot": "Siguiente instantánea", + "feedback.snapshot.header.retention": "Retención", + "feedback.snapshot.header.root": "Raíz", + "feedback.snapshot.header.selected": "Seleccionado", + "feedback.snapshot.header.snapshot-owner": "Dueño", + "feedback.snapshot.header.snapshot-path": "Ruta", + "feedback.snapshot.header.snapshot-size": "Tamaño", + "feedback.snapshot.header.start-time": "Hora de inicio", + "feedback.snapshot.header.status": "Estado", + "feedback.snapshot.history.snapshot-displaying": "Mostrando", + "feedback.snapshot.history.wipe-all-snapshots": "Borre todas las instantáneas y la política de esta fuente.", + "feedback.snapshot.restore.continue-on-errors": "Continuar en caso de errores", + "feedback.snapshot.restore.continue-on-errors-help": "Cuando se produce un error durante la restauración, intenta continuar en lugar de detenerse rápidamente.", + "feedback.snapshot.restore.destination": "Destino", + "feedback.snapshot.restore.destination-help": "También puedes restaurar a un archivo .zip o .tar proporcionando la extensión adecuada.", + "feedback.snapshot.restore.destination-hint": "Introducir la ruta de destino", + "feedback.snapshot.restore.disable-zip-compression": "Desactivar compresión ZIP", + "feedback.snapshot.restore.disable-zip-compression-help": "No comprimir al restaurar en un archivo ZIP (más rápido).", + "feedback.snapshot.restore.minimal-file-size-for-shallow-restore": "Tamaño mínimo de archivo para restauración superficial", + "feedback.snapshot.restore.overwrite-directory": "Sobrescribir directorios", + "feedback.snapshot.restore.overwrite-files": "Sobrescribir archivos", + "feedback.snapshot.restore.overwrite-symbolic-links": "Sobrescribir enlaces simbólicos", + "feedback.snapshot.restore.restore-file-modification-time": "Restaurar hora de modificación de archivos", + "feedback.snapshot.restore.restore-file-ownership": "Restaurar propiedad de archivos", + "feedback.snapshot.restore.restore-file-permissions": "Restaurar permisos de archivos", + "feedback.snapshot.restore.shallow-restore-at-depth": "Restauración superficial a una profundidad específica", + "feedback.snapshot.restore.skip-previously-restored-files": "Saltar archivos y enlaces simbólicos restaurados previamente", + "feedback.snapshot.restore.snapshot-restore": "Restaurar", + "feedback.snapshot.restore.write-files-atomically": "Escribir archivos atómicamente", + "feedback.snapshot.restore.write-sparse-files": "Escribir archivos dispersos", + "feedback.snapshot.show-individual-snapshots-count": "feedback.snapshot.show-individual-snapshots-count", + "feedback.snapshot.show-individual-snapshots-count_one": "Mostrar {{count}} instantánea individual", + "feedback.snapshot.show-individual-snapshots-count_other": "Mostrar {{count}} instantáneas individuales", + "feedback.snapshot.start-after-previous-snapshot": "La instantánea comenzará después de que se complete la instantánea anterior", + "feedback.snapshot.status.status-overdue": "atrasado", + "feedback.snapshot.status.status-pending": "Pendiente", "feedback.tab.policies": "Políticas", "feedback.tab.preferences": "Preferencias", "feedback.tab.repository": "Depósito", "feedback.tab.repository-is-not-connected": "El repositorio no está conectado", "feedback.tab.snapshots": "Copias de respaldo", "feedback.tab.tasks": "Tareas", - "feedback.task.canceled-after": "Cancelado después", - "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} excluido) Files: {{files}} ({{files.excluded}} excluido) Directories: {{directories}} ({{directories.excluded}} excluido) Errors: {{errors}} ({{errors.ignored}} ignorado)", - "feedback.task.failed-after": "falló después", - "feedback.task.finished-in": "Terminado en", - "feedback.task.running-for": "Corriendo para", - "feedback.task.total": "Total", + "feedback.task.estimated-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} excluido) Files: {{files}} ({{files.excluded}} excluido) Directories: {{directories}} ({{directories.excluded}} excluido) Errors: {{errors}} ({{errors.ignored}} ignorado)", + "feedback.task.header.counter": "Contador", + "feedback.task.header.value": "Valor", + "feedback.task.logs": "Registros", + "feedback.task.no-tasks-help": "Aquí aparecerá una lista de tareas cuando crees instantáneas, restaures, ejecutes mantenimiento, etc.", + "feedback.task.search-tasks-by-hint": "Buscar registros de tareas por descripción", + "feedback.task.status.task-canceled": "Tarea cancelada", + "feedback.task.status.task-canceled-after": "Tarea cancelada después", + "feedback.task.status.task-canceling": "Cancelando", + "feedback.task.status.task-error": "Error en la tarea", + "feedback.task.status.task-failed-after": "falló después", + "feedback.task.status.task-finished": "Finalizada", + "feedback.task.status.task-finished-in": "Terminado en", + "feedback.task.status.task-running-for": "Tarea en ejecución durante", + "feedback.task.status.task-started": "Iniciada", + "feedback.task.status.task-succeeded-after": "La tarea se completó con éxito después de", + "feedback.task.table.header-description": "Descripción", + "feedback.task.table.header-kind": "Tipo", + "feedback.task.table.header-start-time": "Hora de inicio", + "feedback.task.table.header-status": "Estado", + "feedback.task.tasks-total": "Total", "feedback.ui.appearance": "Apariencia", "feedback.ui.appearance-help": "Especifica la apariencia de la interfaz de usuario", "feedback.ui.appearance-hint": "Selecciona el tamaño de letra", @@ -224,225 +434,12 @@ "feedback.ui.theme-description": "Tema", "feedback.ui.theme-help": "El tema activo actual", "feedback.ui.theme-select": "Seleccionar tema", - "feedback.validation.azure.access-key": "Llave de acceso", - "feedback.validation.azure.access-key-hint": "Introduzca la clave de acceso secreta", - "feedback.validation.azure.azure-storage-domain": "Dominio de almacenamiento de Azure", - "feedback.validation.azure.azure-storage-domain-hint": "Ingrese el dominio de almacenamiento o déjelo vacío para el valor predeterminado 'blob.core.windows.net'", - "feedback.validation.azure.container": "Envase", - "feedback.validation.azure.container-hint": "Introduzca el nombre del contenedor", - "feedback.validation.azure.object-name-prefix": "Prefijo del nombre del objeto", - "feedback.validation.azure.object-name-prefix-hint": "Introduzca el prefijo del nombre del objeto o déjelo vacío", - "feedback.validation.azure.sas-token": "Ficha SAS", - "feedback.validation.azure.sas-token-hint": "Ingrese el token SAS secreto", - "feedback.validation.azure.storage-account": "Cuenta de almacenamiento", - "feedback.validation.azure.storage-account-hint": "Ingrese el nombre de la cuenta de almacenamiento", - "feedback.validation.b2.bucket-name": "Balde B2", - "feedback.validation.b2.bucket-name-hint": "Introduce el nombre del depósito", - "feedback.validation.b2.key": "Llave", - "feedback.validation.b2.key-hint": "Ingrese la aplicación secreta o la clave de cuenta", - "feedback.validation.b2.key-id": "ID de clave", - "feedback.validation.b2.key-id-hint": "Ingrese la ID de la clave de la aplicación o de la cuenta", - "feedback.validation.b2.object-name-prefix": "Prefijo del nombre del objeto", - "feedback.validation.b2.object-name-prefix-hint": "Introduzca el prefijo del nombre del objeto o déjelo vacío", - "feedback.validation.gcs.bucket-name": "Cucharón GCS", - "feedback.validation.gcs.bucket-name-hint": "Introduce el nombre del depósito", - "feedback.validation.gcs.credentials-file": "Archivo de credenciales", - "feedback.validation.gcs.credentials-file-hint": "Ingrese el nombre del archivo JSON de credenciales", - "feedback.validation.gcs.credentials-json": "Credenciales JSON", - "feedback.validation.gcs.credentials-json-paste": "Pegue las credenciales JSON aquí", - "feedback.validation.gcs.object-name-prefix": "Prefijo del nombre del objeto", - "feedback.validation.gcs.object-name-prefix-hint": "Introduzca el prefijo del nombre del objeto o déjelo vacío", "feedback.validation.invalid-times-of-day": "Horas del día no válidas", - "feedback.validation.local.directory-path": "Ruta de directorio", - "feedback.validation.local.directory-path-hint": "Ingrese la ruta del directorio donde desea almacenar los archivos del repositorio", "feedback.validation.optional.valid-number-or-empty": "Debe ser un número válido o vacío.", "feedback.validation.passwords-dont-match": "Las contraseñas no coinciden", - "feedback.validation.rclone.rclone-executable-path": "Ruta ejecutable de Rclone", - "feedback.validation.rclone.rclone-executable-path-hint": "Ingrese la ruta al ejecutable rclone", - "feedback.validation.rclone.rclone-remote-path": "Ruta remota de clonación", - "feedback.validation.rclone.rclone-remote-path-hint": "Ingrese :", - "feedback.validation.repository-server.server-address": "Dirección del servidor", - "feedback.validation.repository-server.server-address-hint": "Ingrese la URL del servidor (https://:puerto)", - "feedback.validation.repository-server.server-certificate-fingerprint": "Huella digital del certificado del servidor de confianza (SHA256)", - "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Ingrese la huella digital del certificado del servidor confiable impresa al iniciar el servidor", - "feedback.validation.repository-token.token": "Simbólico", - "feedback.validation.repository-token.token-hint": "Pegar token de conexión", "feedback.validation.required.directory": "Campo requerido", "feedback.validation.required.field": "Campo requerido", - "feedback.validation.required.hostname": "Nombre de host", - "feedback.validation.required.hostname-hint": "Anule esto al restaurar una instantánea tomada en otra máquina", - "feedback.validation.required.password-repository": "Contraseña del repositorio", - "feedback.validation.required.password-repository-help": "Se utiliza para cifrar el contenido del repositorio.", - "feedback.validation.required.password-repository-hint": "Ingrese la contraseña del repositorio", - "feedback.validation.required.repository-password-confirm": "Confirmar contraseña del repositorio", - "feedback.validation.required.repository-password-confirm-again": "ingrese la contraseña del repositorio nuevamente", - "feedback.validation.required.server-password": "Contraseña del servidor", - "feedback.validation.required.server-password-hint": "Ingrese la contraseña para conectarse al servidor", - "feedback.validation.required.username": "Nombre de usuario", - "feedback.validation.required.username-hint": "Anule esto al restaurar una instantánea tomada por otro usuario", "feedback.validation.required.valid-number-or-empty": "Debe ser un número válido o vacío.", - "feedback.validation.s3.access-key-id": "ID de clave de acceso", - "feedback.validation.s3.access-key-id-hint": "Introduzca el ID de la clave de acceso", - "feedback.validation.s3.bucket-name": "Balde", - "feedback.validation.s3.bucket-name-hint": "Introduce el nombre del depósito", - "feedback.validation.s3.object-name-prefix": "Prefijo del nombre del objeto", - "feedback.validation.s3.override-region": "Anular región", - "feedback.validation.s3.override-region-hint": "Ingrese una región específica (por ejemplo, us-west-1) o déjela vacía", - "feedback.validation.s3.secret-access-key": "Clave de acceso secreta", - "feedback.validation.s3.secret-access-key-hint": "Introduzca la clave de acceso secreta", - "feedback.validation.s3.server-endpoint": "Punto final del servidor", - "feedback.validation.s3.server-endpoint-hint": "Ingrese la dirección del servidor (por ejemplo, s3.amazonaws.com)", - "feedback.validation.s3.session-token": "Token de sesión", - "feedback.validation.s3.session-token-hint": "Ingrese el token de sesión o déjelo vacío", - "feedback.validation.webdav.password": "Contraseña", - "feedback.validation.webdav.password-hint": "Introducir la contraseña", - "feedback.validation.webdav.server-url": "URL del servidor WebDAV", - "feedback.validation.webdav.username": "Nombre de usuario", - "feedback.validation.webdav.username-hint": "Introduzca su nombre de usuario", - "policies.feedback.find.count_one": "Se encontró {{count}} política que coincide con los criterios", - "policies.feedback.find.count_other": "Se encontraron {{count}} políticas que coinciden con los criterios", - "policies.feedback.find.none": "No se encontraron políticas.", - "policies.feedback.find.none.create": "No se encontró ninguna política para el directorio {{ruta}}. \nConfigure una nueva política.", - "policies.feedback.loading": "Cargando ...", - "policies.feedback.path.absolute": "Las políticas sólo se pueden definir para rutas absolutas.", - "policies.feedback.policy.find": "Ingrese al directorio para buscar o establecer una política", - "policies.kind.all": "Todas las pólizas", - "policies.kind.applicable": "Políticas aplicables", - "policies.kind.global": "Políticas globales", - "policies.kind.host": "Políticas por host", - "policies.kind.local": "Políticas locales", - "policies.kind.user": "Políticas por usuario", - "repository.attribute.algorithm.eco": "Algoritmo de corrección de errores", - "repository.attribute.algorithm.encryption": "Algoritmo de cifrado", - "repository.attribute.algorithm.hash": "Algoritmo de hash", - "repository.attribute.algorithm.splitter": "Algoritmo de división", - "repository.attribute.compression.internal": "Compresión interna", - "repository.attribute.config.file": "Archivo de configuración", - "repository.attribute.connected.as": "Conectado como", - "repository.attribute.eco": "Overhead de corrección de errores", - "repository.attribute.format": "Formato del repositorio", - "repository.attribute.provider": "Proveedor", - "repository.attribute.server.url": "URL del servidor", - "repository.event.connection.cancel": "Cancelar conexión", - "repository.event.connection.disconnect": "Desconectar del repositorio", - "repository.event.description.update": "Actualizar descripción", - "repository.feedback.compression.internal.not.supported": "no", - "repository.feedback.compression.internal.supported": "sí", - "repository.feedback.description.required": "La descripción del repositorio es obligatoria", - "repository.feedback.eco.disabled": "Deshabilitado", - "repository.feedback.read.only": "El repositorio es de sólo lectura", - "repository.status.connected": "Conectado al repositorio", - "repository.status.initializing": "Inicializando el repositorio...", - "snapshot.event.create.estimate": "Estimar", - "snapshot.event.create.now": "Instantánea ahora", - "snapshot.event.create.path": "Ingrese la ruta a la instantánea", - "snapshot.event.create.path.resolve": "Debe especificar el directorio para la instantánea.", - "snapshot.event.delete.selected_one": "¿Quieres eliminar la instantánea {{count}} seleccionada?", - "snapshot.event.delete.selected_other": "¿Quieres eliminar las {{count}} instantáneas seleccionadas?", - "snapshot.event.directory.browse": "Navegar", - "snapshot.event.directory.browsing": "La exploración de directorios no es compatible con un navegador web. \nUtilice la interfaz de usuario de Kopia.", - "snapshot.event.directory.mount": "Montar como sistema de archivos local", - "snapshot.event.directory.restore": "Restaurar archivos y directorios", - "snapshot.event.directory.unmount": "Desmontar", - "snapshot.event.history.delete.source": "Eliminar fuente de instantánea", - "snapshot.event.history.description.update": "{{description}}: haga clic para actualizar la descripción de la instantánea.", - "snapshot.event.history.deselect.all": "Deseleccionar todo", - "snapshot.event.history.fetch.snapshots": "Obtener instantáneas", - "snapshot.event.history.pin.add": "Agregue un pin para proteger la instantánea contra la eliminación", - "snapshot.event.history.select.all": "Seleccionar todo", - "snapshot.event.history.selected.delete": "Eliminar seleccionado (", - "snapshot.event.restore": "Restaurar", - "snapshot.event.restore.begin": "Comenzar la restauración", - "snapshot.event.snapshot.new": "Nueva instantánea", - "snapshot.event.snapshot.pending": "Pendiente", - "snapshot.event.snapshot.policy": "Política", - "snapshot.event.synchronize": "Sincronizar", - "snapshot.feedback.directory.mount.restore": "Puede montar/restaurar todos los archivos y directorios que ve a continuación o restaurar archivos individualmente.", - "snapshot.feedback.history.display": "Mostrando", - "snapshot.feedback.history.wipe.all": "Borre todas las instantáneas y la política de esta fuente.", - "snapshot.feedback.restore.continue.errors": "Continuar en caso de errores", - "snapshot.feedback.restore.continue.errors.help": "Cuando se produce un error durante la restauración, intenta continuar en lugar de detenerse rápidamente.", - "snapshot.feedback.restore.destination": "Destino", - "snapshot.feedback.restore.destination.help": "También puedes restaurar a un archivo .zip o .tar proporcionando la extensión adecuada.", - "snapshot.feedback.restore.destination.path": "Introducir la ruta de destino", - "snapshot.feedback.restore.directory.overwrite": "Sobrescribir directorios", - "snapshot.feedback.restore.disable.compression.zip": "Desactivar compresión ZIP", - "snapshot.feedback.restore.disable.compression.zip.help": "No comprimir al restaurar en un archivo ZIP (más rápido).", - "snapshot.feedback.restore.file.atomically": "Escribir archivos atómicamente", - "snapshot.feedback.restore.file.modification.time": "Restaurar hora de modificación de archivos", - "snapshot.feedback.restore.file.overwrite": "Sobrescribir archivos", - "snapshot.feedback.restore.file.ownership": "Restaurar propiedad de archivos", - "snapshot.feedback.restore.file.permission": "Restaurar permisos de archivos", - "snapshot.feedback.restore.file.sparse": "Escribir archivos dispersos", - "snapshot.feedback.restore.link.overwrite": "Sobrescribir enlaces simbólicos", - "snapshot.feedback.restore.shallow.depth": "Restauración superficial a una profundidad específica", - "snapshot.feedback.restore.shallow.file.size.minimal": "Tamaño mínimo de archivo para restauración superficial", - "snapshot.feedback.restore.skip": "Saltar archivos y enlaces simbólicos restaurados previamente", - "snapshot.feedback.restore.task.go": "Ir a restaurar tarea", - "snapshot.feedback.snapshot.new": "Nueva instantánea", - "snapshot.feedback.snapshot.start": "La instantánea comenzará después de que se complete la instantánea anterior", - "snapshot.header.actions": "Acciones", - "snapshot.header.snapshot.last": "Última instantánea", - "snapshot.header.snapshot.next": "Siguiente instantánea", - "snapshot.header.snapshot.owner": "Dueño", - "snapshot.header.snapshot.path": "Ruta", - "snapshot.header.snapshot.size": "Tamaño", - "snapshot.header.status": "Estado", - "snapshot.history.feedack.unfiltered.count_one": "Mostrar {{count}} instantánea individual", - "snapshot.history.feedack.unfiltered.count_other": "Mostrar {{count}} instantáneas individuales", - "snapshot.history.header.description": "Descripción", - "snapshot.history.header.directories": "directorios", - "snapshot.history.header.files": "Archivos", - "snapshot.history.header.retention": "Retención", - "snapshot.history.header.root": "Raíz", - "snapshot.history.header.selected": "Seleccionado", - "snapshot.history.header.size": "Tamaño", - "snapshot.history.header.time.start": "Hora de inicio", - "task.all": "Todas", - "task.event.stop": "Detener", - "task.failed": "Fallidas", - "task.feedback.entries": "Aquí aparecerá una lista de tareas cuando crees instantáneas, restaures, ejecutes mantenimiento, etc.", - "task.feedback.search": "Buscar registros por descripción", - "task.header.counter": "Contador", - "task.header.description": "Descripción", - "task.header.kind": "Tipo", - "task.header.status": "Estado", - "task.header.time.start": "Hora de inicio", - "task.header.value": "Valor", - "task.loading": "Cargando...", - "task.logs": "Registros", - "task.running": "En ejecución", - "task.status.canceled": "Tarea cancelada después de", - "task.status.canceling": "Cancelando", - "task.status.error": "Error en la tarea", - "task.status.finished": "Finalizada", - "task.status.running.for": "Tarea en ejecución durante", - "task.status.started": "Iniciada", - "task.status.succeed.after": "La tarea se completó con éxito después de", - "validation.password": "Contraseña", - "validation.password-hint": "Introducir la contraseña", - "validation.provider.external-ssh-command": "Inicie el comando SSH externo sin contraseña", - "validation.provider.external-ssh-command-hint": "De forma predeterminada, Kopia se conecta al servidor mediante un cliente SSH interno que admite opciones limitadas. \nAlternativamente, puede iniciar un comando SSH externo sin contraseña, que admite opciones adicionales, pero generalmente es menos eficiente que el cliente integrado.", - "validation.provider.host": "Anfitrión", - "validation.provider.host-hint": "nombre de host ssh (por ejemplo, ejemplo.com)", - "validation.provider.key-data": "Llave de datos", - "validation.provider.key-data-hint": "Pegar el contenido del archivo clave", - "validation.provider.known-host-data": "Datos de hosts conocidos", - "validation.provider.known-host-data-hint": "Pegue el contenido del archivo conocido_hosts", - "validation.provider.path": "Camino", - "validation.provider.path-hint": "Ingrese la ruta remota al repositorio, por ejemplo, '/mnt/data/repository'", - "validation.provider.path-host-file": "Ruta al archivoknown_hosts", - "validation.provider.path-host-file-hint": "Ingrese la ruta al archivo conocido_hosts", - "validation.provider.path-key-file": "Ruta al archivo clave", - "validation.provider.path-key-file-hint": "Ingrese la ruta al archivo clave", - "validation.provider.port": "Puerto", - "validation.provider.port-hint": "Número de puerto (por ejemplo, 22)", - "validation.provider.ssh-arguments": "Argumentos SSH", - "validation.provider.ssh-arguments-hint": "Ingrese los argumentos del comando SSH ('user@host -s sftp' se agregará automáticamente)", - "validation.provider.ssh-command": "Comando SSH", - "validation.provider.ssh-command-hint": "Proporcione el comando SSH sin contraseña para ejecutar (normalmente 'ssh')", - "validation.provider.user": "Usuario", - "validation.provider.user-hint": "Nombre de usuario", "value.algorithm.eco-disabled": "Desactivado", "value.algorithm.suffix-not-recommended": "(NO RECOMENDADO)", "value.algorithm.suffix-recommended": "(RECOMENDADO)", @@ -458,8 +455,8 @@ "value.policy.optional": "ignorar los fracasos", "value.provider.s3.http-connection-insecure": "Usar conexión HTTP (insegura)", "value.provider.s3.no-tls-verification": "No verificar el certificado TLS", - "value.repository.format.latest": "Último formato", - "value.repository.format.legacy": "Formato heredado compatible con v0.8", + "value.repository.latest-format": "Último formato", + "value.repository.legacy-format": "Formato heredado compatible con v0.8", "value.snapshot-frequency.10-minutes": "cada 10 minutos", "value.snapshot-frequency.12-hours": "cada 12 horas", "value.snapshot-frequency.15-minutes": "cada 15 minutos", diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 226dd830..89191828 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -1,52 +1,71 @@ { - "common.back": "Dos", - "common.cancel": "Annuler", - "common.click-here-to-learn-more": "Cliquez ici pour en savoir plus.", - "common.delete": "Supprimer", - "common.delete-confirm": "Confirmation de la suppression", - "common.loading": "Chargement ...", - "common.next": "Suivant", - "common.return": "Retour", - "enter-object-name-prefix-or-leave-empty-hint": "Entrez le préfixe du nom de l'objet ou laissez vide", + "common.action.back": "Dos", + "common.action.cancel": "Annuler", + "common.action.click-here-to-learn-more": "Cliquez ici pour en savoir plus.", + "common.action.confirm-delete": "Confirmation de la suppression", + "common.action.delete": "Supprimer", + "common.action.next": "Suivant", + "common.action.return": "Retour", + "common.action.stop": "Arrêter", + "common.label.loading": "Chargement...", "event.cli.copy-to-clipboard": "Copier dans le presse-papier", "event.cli.show-cli-equivalent": "Cliquez pour afficher l'équivalent CLI", - "event.description.cancel": "Annuler", - "event.description.new": "Entrez une nouvelle description", - "event.description.remove": "Supprimer la description", - "event.description.update": "Description de la mise à jour", - "event.log.hide": "Masquer le journal", - "event.log.show": "Afficher le journal", - "event.pin.add": "Ajouter une épingle", - "event.pin.cancel": "Annuler", - "event.pin.remove": "Supprimer l'épingle", - "event.pin.snapshot-pin": "Épingler un instantané", - "event.pin.update": "Mettre à jour l'épingle", + "event.log.hide-log": "Masquer le journal", + "event.log.show-log": "Afficher le journal", + "event.pin.add-pin": "Ajouter une épingle", + "event.pin.pin-snapshot": "Épingler un instantané", + "event.pin.remove-pin": "Supprimer l'épingle", + "event.pin.update-pin": "Mettre à jour l'épingle", "event.policy.delete": "Supprimer la stratégie", "event.policy.edit": "Modifier", "event.policy.save": "Enregistrer la politique", - "event.policy.set": "Définir la politique", - "event.repository.advanced-options-hide": "Masquer les options avancées", - "event.repository.advanced-options.show": "Montrer les options avancées", + "event.policy.set-policy": "Définir la politique", + "event.repository.cancel-connection": "Annuler la connexion", "event.repository.connect-to-repository": "Se connecter au référentiel", "event.repository.create-repository": "Créer un référentiel", - "event.task.cancel": "Annuler la tâche", - "feedback.description.modal-title": "Description de l'instantané", + "event.repository.disconnect-from-repository": "Déconnexion du répertoire", + "event.repository.hide-advanced-options": "Masquer les options avancées", + "event.repository.show-advanced-options": "Montrer les options avancées", + "event.repository.update-description": "Mettre à jour la description", + "event.snapshot.browse-directory": "Parcourir", + "event.snapshot.delete-selected": "event.snapshot.delete-selected", + "event.snapshot.delete-selected_one": "Voulez-vous supprimer l'instantané {{count}} sélectionné ?", + "event.snapshot.delete-selected_other": "Voulez-vous supprimer les {{count}} instantanés sélectionnés ?", + "event.snapshot.description.enter-new-description": "Entrez une nouvelle description", + "event.snapshot.description.remove-description": "Supprimer la description", + "event.snapshot.description.update-description": "Description de la mise à jour", + "event.snapshot.estimate": "Estimation", + "event.snapshot.fetch-snapshots": "Récupérer des instantanés", + "event.snapshot.history.delete-selected": "Supprimer la sélection ({{count}})", + "event.snapshot.history.delete-snapshot-source": "Supprimer la source de l'instantané", + "event.snapshot.history.deselect-all": "Tout déselectionner", + "event.snapshot.history.select-all-snapshots": "Tout sélectionner", + "event.snapshot.history.update-snapshot-description": "{{description}} : cliquez pour mettre à jour la description de l'instantané.", + "event.snapshot.mount-directory": "Monter en tant que système de fichiers local", + "event.snapshot.new-snapshot": "Nouvel instantané", + "event.snapshot.restore-file-directories": "Restaurer des fichiers et des répertoires", + "event.snapshot.restore.begin-restore": "Démarrer la restauration", + "event.snapshot.restore.go-to-restore-task": "Aller à la tâche de restauration", + "event.snapshot.show-policy": "Politique", + "event.snapshot.snapshot-now": "Instantané maintenant", + "event.snapshot.synchronize": "Synchroniser", + "event.snapshot.unmount-directory": "Démonter", + "event.task.action.cancel": "Annuler la tâche", + "event.task.select.task-all": "Tous", + "event.task.select.task-failed": "Échoué", + "event.task.select.task-running": "En cours", + "feedback.directory.header.directories": "Annuaires", + "feedback.directory.header.files": "Des dossiers", + "feedback.directory.header.last-modification": "Dernière modification", + "feedback.directory.header.name": "Nom", + "feedback.directory.header.size": "Taille", "feedback.error.common": "Erreur", "feedback.error.connection": "Erreur de connexion :", - "feedback.header.actions": "Actions", - "feedback.header.defined": "Défini", - "feedback.header.details": "Détails", - "feedback.header.directories": "Annuaires", "feedback.header.effective": "Efficace", - "feedback.header.files": "Des dossiers", - "feedback.header.host": "Hôte", - "feedback.header.modification-last": "Dernière modification", - "feedback.header.name": "Nom", - "feedback.header.path": "Chemin", - "feedback.header.size": "Taille", "feedback.header.username": "Nom d'utilisateur", - "feedback.pin.name": "Nom de la broche", - "feedback.pin.standard-text": "ne pas supprimer", + "feedback.pin.add-pin-to-protect": "Ajouter une épingle pour protéger l'instantané de la suppression", + "feedback.pin.do-not-delete": "ne pas supprimer", + "feedback.pin.name-of-the-pin": "Nom de la broche", "feedback.policy.action.command-mode": "Mode commande", "feedback.policy.actions.after-folder": "Après le dossier", "feedback.policy.actions.after-folder-help": "Script à exécuter après le dossier", @@ -97,16 +116,32 @@ "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignorer les répertoires contenant CACHEDIR.TAG et similaires", "feedback.policy.files.scan-only-one-filesystem": "Analyser un seul système de fichiers", "feedback.policy.files.scan-only-one-filesystem-help": "Ne franchissez pas les limites du système de fichiers lors de la création d'un instantané", + "feedback.policy.find-count": "feedback.policy.find-count", + "feedback.policy.find-count_one": "{{count}} politiques correspondant aux critères ont été trouvées", + "feedback.policy.find-count_other": "{{count}} politiques correspondant aux critères ont été trouvées", + "feedback.policy.find-hint": "Entrez dans le répertoire pour rechercher ou définir une politique", + "feedback.policy.find-none": "Aucune politique trouvée", + "feedback.policy.find-none-create": "Aucune stratégie trouvée pour le répertoire {{path}}. \nVeuillez configurer une nouvelle politique.", + "feedback.policy.header.actions": "Actions", "feedback.policy.header.compression": "Compression", + "feedback.policy.header.defined": "Défini", "feedback.policy.header.error-handling": "La gestion des erreurs", "feedback.policy.header.files": "Des dossiers", "feedback.policy.header.folder-actions": "Actions sur les dossiers", + "feedback.policy.header.host": "Hôte", "feedback.policy.header.logging": "Enregistrement", "feedback.policy.header.other": "Autre", + "feedback.policy.header.path": "Chemin", "feedback.policy.header.scheduling": "Planification", "feedback.policy.header.snapshot-action": "Actions d'instantané", "feedback.policy.header.snapshot-retention": "Conservation des instantanés", "feedback.policy.header.upload": "Télécharger", + "feedback.policy.kind.all": "Toutes les politiques", + "feedback.policy.kind.applicable": "Politiques applicables", + "feedback.policy.kind.global": "Politiques mondiales", + "feedback.policy.kind.local": "Politiques locales", + "feedback.policy.kind.per-host-policies": "Politiques par hôte", + "feedback.policy.kind.per-user-policies": "Politiques par utilisateur", "feedback.policy.logging.cache-hit": "Accès au cache", "feedback.policy.logging.cache-hit-help": "Consigner la verbosité lorsqu'un cache est utilisé au lieu de télécharger le fichier", "feedback.policy.logging.cache-miss": "Manque de cache", @@ -123,6 +158,7 @@ "feedback.policy.other.disable-parent-policy-evaluation-help": "Empêche toute stratégie parent d'affecter ce répertoire et ses sous-répertoires", "feedback.policy.other.json-representation": "Représentation JSON", "feedback.policy.other.json-representation-help": "C'est la représentation interne d'une politique", + "feedback.policy.policies-defined-by-path-absolute": "Les stratégies ne peuvent être définies que pour des chemins absolus.", "feedback.policy.retention.annual-snapshot-retain": "Annuel", "feedback.policy.retention.annual-snapshot-retain-help": "Combien d’instantanés annuels conserver par source. \nLe dernier instantané de chaque année civile sera conservé", "feedback.policy.retention.annual-snapshot-retain-hint": "Nombre d'instantanés annuels", @@ -168,19 +204,113 @@ "feedback.policy.upload.maximum-parallel-snapshots-help": "Nombre maximum d'instantanés pouvant être téléchargés simultanément", "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "nombre maximum d'instantanés parallèles", "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "doit être spécifié à l'aide d'une stratégie globale, utilisateur ou hôte", + "feedback.prodiver.gcs.paste-json-credentials": "Collez les informations d'identification JSON ici", "feedback.provider.azure-blob-storage": "Stockage Blob Azure", + "feedback.provider.azure.access-key": "Clef d'accès", + "feedback.provider.azure.azure-storage-domain": "Domaine de stockage Azure", + "feedback.provider.azure.container": "Récipient", + "feedback.provider.azure.enter-access-key": "Entrez la clé d'accès secrète", + "feedback.provider.azure.enter-azure-storage-domain": "Entrez le domaine de stockage ou laissez vide pour « blob.core.windows.net » par défaut.", + "feedback.provider.azure.enter-container-name": "Entrez le nom du conteneur", + "feedback.provider.azure.enter-object-name-prefix": "Entrez le préfixe du nom de l'objet ou laissez vide", + "feedback.provider.azure.enter-sas-token": "Entrez le jeton SAS secret", + "feedback.provider.azure.enter-storage-account": "Saisissez le nom du compte de stockage", + "feedback.provider.azure.object-name-prefix": "Préfixe du nom de l'objet", + "feedback.provider.azure.sas-token": "Jeton SAS", + "feedback.provider.azure.storage-account": "Compte de stockage", + "feedback.provider.b2.bucket-name": "Godet B2", + "feedback.provider.b2.enter-account-key": "Entrez l'application secrète ou la clé de compte", + "feedback.provider.b2.enter-account-key-id": "Saisissez l'ID de la clé de l'application ou du compte", + "feedback.provider.b2.enter-bucket-name": "Saisissez le nom du compartiment", + "feedback.provider.b2.enter-object-name-prefix": "Entrez le préfixe du nom de l'objet ou laissez vide", + "feedback.provider.b2.key": "Clé", + "feedback.provider.b2.key-id": "ID de clé", + "feedback.provider.b2.object-name-prefix": "Préfixe du nom de l'objet", "feedback.provider.backblaze-b2": "Backblaze B2", + "feedback.provider.filesystem.directory-path": "Chemin du répertoire", + "feedback.provider.filesystem.enter-directory-path": "Entrez le chemin du répertoire dans lequel vous souhaitez stocker les fichiers du référentiel", + "feedback.provider.gcs.bucket-name": "Godet GCS", + "feedback.provider.gcs.credentials-file": "Fichier d'informations d'identification", + "feedback.provider.gcs.credentials-json": "Identifiants JSON", + "feedback.provider.gcs.enter-bucket-name": "Saisissez le nom du compartiment", + "feedback.provider.gcs.enter-credentials-file-name": "Entrez le nom du fichier JSON d'informations d'identification", + "feedback.provider.gcs.enter-object-name-prefix": "Entrez le préfixe du nom de l'objet ou laissez vide", + "feedback.provider.gcs.object-name-prefix": "Préfixe du nom de l'objet", "feedback.provider.google-cloud-storage": "Stockage Google Cloud", "feedback.provider.kopia-repository-server": "Serveur de référentiel Kopia", "feedback.provider.local-directory-or-nas": "Répertoire local ou NAS", "feedback.provider.rclone-remote": "Rclone à distance", + "feedback.provider.rclone.rclone-executable-path": "Chemin de l'exécutable Rclone", + "feedback.provider.rclone.rclone-executable-path-hint": "Entrez le chemin de l'exécutable rclone", + "feedback.provider.rclone.rclone-remote-path": "Chemin distant Rclone", + "feedback.provider.rclone.rclone-remote-path-hint": "Entrez  :", + "feedback.provider.repositoryserver.enter-server-certificate-fingerprint": "Saisissez l'empreinte digitale du certificat de serveur de confiance imprimée au démarrage du serveur", + "feedback.provider.repositoryserver.enter-server-url": "Entrez l'URL du serveur (https://:port)", + "feedback.provider.repositoryserver.server-address": "Adresse du serveur", + "feedback.provider.repositoryserver.server-certificate-fingerprint": "Empreinte digitale du certificat de serveur de confiance (SHA256)", + "feedback.provider.repositorytoken.paste-token": "Coller le jeton de connexion", + "feedback.provider.repositorytoken.token": "Jeton", "feedback.provider.required-either-key-file": "L'un des éléments suivants : Mot de passe, Fichier clé ou Données clés est requis.", "feedback.provider.required-either-known-host-data": "Le Fichier des hôtes connus ou les Données des hôtes connus sont requis, mais pas les deux.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 ou stockage compatible", + "feedback.provider.s3.access-key-id": "ID de clé d'accès", + "feedback.provider.s3.access-key-id-hint": "Entrez l'ID de la clé d'accès", + "feedback.provider.s3.bucket-name": "Seau", + "feedback.provider.s3.bucket-name-hint": "Saisissez le nom du compartiment", + "feedback.provider.s3.enter-object-name-prefix-hint": "Entrez le préfixe du nom de l'objet ou laissez vide", + "feedback.provider.s3.object-name-prefix": "Préfixe du nom de l'objet", + "feedback.provider.s3.override-region": "Remplacer la région", + "feedback.provider.s3.override-region-hint": "Entrez une région spécifique (par exemple, us-west-1) ou laissez vide", + "feedback.provider.s3.secret-access-key": "Clé d'accès secrète", + "feedback.provider.s3.secret-access-key-hint": "Entrez la clé d'accès secrète", + "feedback.provider.s3.server-endpoint": "Point de terminaison du serveur", + "feedback.provider.s3.server-endpoint-hint": "Saisissez l'adresse du serveur (par exemple, s3.amazonaws.com)", + "feedback.provider.s3.session-token": "Jeton de session", + "feedback.provider.s3.session-token-hint": "Entrez le jeton de session ou laissez vide", + "feedback.provider.sftp-key-data": "Données clé", + "feedback.provider.sftp-key-data-hint": "Collez le contenu du fichier de clé", "feedback.provider.sftp-server": "Serveur SFTP", + "feedback.provider.sftp.enter-password": "Entrer le mot de passe", + "feedback.provider.sftp.enter-path-host-file": "Entrez le chemin d'accès au fichier known_hosts", + "feedback.provider.sftp.enter-path-to-key-file": "Entrez le chemin d'accès au fichier de clé", + "feedback.provider.sftp.enter-remote-path": "Entrez le chemin distant vers le référentiel, par exemple « /mnt/data/repository »", + "feedback.provider.sftp.enter-ssh-arguments": "Entrez les arguments de la commande SSH (« user@host -s sftp » sera ajouté automatiquement)", + "feedback.provider.sftp.enter-ssh-host-name": "nom d'hôte ssh (par exemple, example.com)", + "feedback.provider.sftp.host": "Hôte", + "feedback.provider.sftp.known-host-data": "Données sur les hôtes connus", + "feedback.provider.sftp.launch-external-ssh-command": "Lancer une commande SSH externe sans mot de passe", + "feedback.provider.sftp.launch-external-ssh-command-hint": "Par défaut, Kopia se connecte au serveur à l'aide d'un client SSH interne qui prend en charge des options limitées. \nAlternativement, il peut lancer une commande SSH externe sans mot de passe, qui prend en charge des options supplémentaires, mais est généralement moins efficace que le client intégré.", + "feedback.provider.sftp.password": "Mot de passe", + "feedback.provider.sftp.paste-content-of-known-host": "Collez le contenu du fichier known_hosts", + "feedback.provider.sftp.path": "Chemin", + "feedback.provider.sftp.path-host-file": "Chemin d'accès au fichier known_hosts", + "feedback.provider.sftp.path-key-file": "Chemin d'accès au fichier de clé", + "feedback.provider.sftp.port": "Port", + "feedback.provider.sftp.port-number": "Numéro de port (par exemple, 22)", + "feedback.provider.sftp.provide-passwordless-ssh-command": "Fournissez la commande SSH sans mot de passe à exécuter (généralement « ssh »)", + "feedback.provider.sftp.ssh-arguments": "Arguments SSH", + "feedback.provider.sftp.ssh-command": "Commande SSH", + "feedback.provider.sftp.user": "Utilisateur", + "feedback.provider.sftp.user-name": "Nom d'utilisateur", "feedback.provider.use-repository-token": "Utiliser le jeton de référentiel", "feedback.provider.webdav-server": "Serveur WebDAV", + "feedback.provider.webdav.enter-password": "Entrer le mot de passe", + "feedback.provider.webdav.enter-username": "Saisissez votre nom d'utilisateur", + "feedback.provider.webdav.password": "Mot de passe", + "feedback.provider.webdav.server-url": "URL du serveur WebDAV", + "feedback.provider.webdav.username": "Nom d'utilisateur", "feedback.repository.additional-parameters-hint": "Des paramètres supplémentaires peuvent être définis lors de la création du référentiel à l'aide de la ligne de commande.", + "feedback.repository.attribute.algorithm-eco": "Algorithme de correction d'erreur", + "feedback.repository.attribute.algorithm-encryption": "Algorithme de chiffrement", + "feedback.repository.attribute.algorithm-hash": "Algorithme de hachage", + "feedback.repository.attribute.algorithm-splitter": "Algorithme de découpage", + "feedback.repository.attribute.config-file": "Fichier de configuration", + "feedback.repository.attribute.connected-as": "Connecté en tant que", + "feedback.repository.attribute.internal-compression": "Compression interne", + "feedback.repository.attribute.repository-eco": "Surcoût de correction d'erreurs", + "feedback.repository.attribute.repository-format": "Format du répertoire", + "feedback.repository.attribute.repository-provider": "Fournisseur", + "feedback.repository.attribute.server-url": "URL du serveur", "feedback.repository.configuration": "Configuration du stockage", "feedback.repository.connect-as": "Se connecter en tant que", "feedback.repository.connect-in-read-only-mode": "Connectez-vous en mode lecture seule", @@ -188,8 +318,14 @@ "feedback.repository.connect-to-repository": "Se connecter au référentiel", "feedback.repository.create-repository-new": "Créer un nouveau référentiel", "feedback.repository.create-repository-new-help": "Entrez un mot de passe fort pour créer le référentiel Kopia dans le stockage fourni.", + "feedback.repository.eco-disabled": "Désactivé", "feedback.repository.eec-warning": "[EXPERIMENTAL] La correction d'erreurs peut aider à protéger contre certains types de corruption de données dues à des retournements de bits spontanés dans le support de stockage.", "feedback.repository.encryption": "Chiffrement", + "feedback.repository.enter-repository-password": "Entrez le mot de passe du référentiel", + "feedback.repository.hostname": "Nom d'hôte", + "feedback.repository.hostname-hint": "Remplacez ceci lors de la restauration d'un instantané pris sur une autre machine", + "feedback.repository.internal-compression-supported-no": "non", + "feedback.repository.internal-compression-supported-yes": "oui", "feedback.repository.kopia-server-parameters": "Paramètres du serveur Kopia", "feedback.repository.name-default": "Mon référentiel", "feedback.repository.override-hint": "Pour remplacer, cliquez sur \"Afficher les options avancées\".", @@ -198,20 +334,94 @@ "feedback.repository.repository-description": "Description du référentiel", "feedback.repository.repository-description-help": "Aide à distinguer plusieurs référentiels connectés", "feedback.repository.repository-description-hint": "Entrez la description du référentiel", + "feedback.repository.repository-description-required": "La description du répertoire est obligatoire", + "feedback.repository.repository-initializing": "Initialisation du répertoire...", + "feedback.repository.repository-is-read-only": "Le répertoire est en lecture seule", + "feedback.repository.repository-password": "Mot de passe du référentiel", + "feedback.repository.repository-password-confirm": "Confirmer le mot de passe du référentiel", + "feedback.repository.repository-password-confirm-again": "entrez à nouveau le mot de passe du référentiel", + "feedback.repository.repository-password-help": "Utilisé pour chiffrer le contenu du référentiel", "feedback.repository.repository-token-enter": "Entrez le jeton de référentiel", - "feedback.snapshot.status.overdue": "en retard", + "feedback.repository.server-password": "Mot de passe du serveur", + "feedback.repository.server-password-hint": "Entrez le mot de passe pour vous connecter au serveur", + "feedback.repository.status-connected": "Connecté au répertoire", + "feedback.repository.username": "Nom d'utilisateur", + "feedback.repository.username-hint": "Remplacez ceci lors de la restauration d'un instantané pris par un autre utilisateur", + "feedback.snapshot.create.enter-path-to-snapshot-hint": "Entrez le chemin d'accès à l'instantané", + "feedback.snapshot.create.must-specify-path": "Doit spécifier le répertoire dans lequel prendre l'instantané.", + "feedback.snapshot.create.snapshot-new": "Nouvel instantané", + "feedback.snapshot.description": "Description", + "feedback.snapshot.description.snapshot-description": "Description de l'instantané", + "feedback.snapshot.directory.browsing-not-supported": "La navigation dans les répertoires n'est pas prise en charge dans un navigateur Web. \nUtilisez l'interface utilisateur de Kopia.", + "feedback.snapshot.directory.restore-all-files-help": "Vous pouvez monter/restaurer tous les fichiers et répertoires que vous voyez ci-dessous ou restaurer les fichiers individuellement.", + "feedback.snapshot.header.actions": "Actions", + "feedback.snapshot.header.details": "Détails", + "feedback.snapshot.header.directories": "Directeurs", + "feedback.snapshot.header.files": "Des dossiers", + "feedback.snapshot.header.last-snapshot": "Dernier instantané", + "feedback.snapshot.header.next-snapshot": "Instantané suivant", + "feedback.snapshot.header.retention": "Rétention", + "feedback.snapshot.header.root": "Racine", + "feedback.snapshot.header.selected": "Choisi", + "feedback.snapshot.header.snapshot-owner": "Propriétaire", + "feedback.snapshot.header.snapshot-path": "Chemin", + "feedback.snapshot.header.snapshot-size": "Taille", + "feedback.snapshot.header.start-time": "Heure de début", + "feedback.snapshot.header.status": "Statut", + "feedback.snapshot.history.snapshot-displaying": "Affichage", + "feedback.snapshot.history.wipe-all-snapshots": "Effacez tous les instantanés et la stratégie de cette source.", + "feedback.snapshot.restore.continue-on-errors": "Continuer en cas d'erreurs", + "feedback.snapshot.restore.continue-on-errors-help": "Lorsqu'une erreur de restauration se produit, essayez de continuer au lieu d'échouer rapidement.", + "feedback.snapshot.restore.destination": "Destination", + "feedback.snapshot.restore.destination-help": "Vous pouvez également restaurer vers un fichier .zip ou .tar en fournissant l'extension appropriée.", + "feedback.snapshot.restore.destination-hint": "Entrez le chemin de destination", + "feedback.snapshot.restore.disable-zip-compression": "Désactiver la compression ZIP", + "feedback.snapshot.restore.disable-zip-compression-help": "Ne pas compresser lors de la restauration vers un fichier ZIP (plus rapide).", + "feedback.snapshot.restore.minimal-file-size-for-shallow-restore": "Taille minimale des fichiers pour une restauration superficielle", + "feedback.snapshot.restore.overwrite-directory": "Écraser les répertoires", + "feedback.snapshot.restore.overwrite-files": "Écraser les fichiers", + "feedback.snapshot.restore.overwrite-symbolic-links": "Écraser les liens symboliques", + "feedback.snapshot.restore.restore-file-modification-time": "Restaurer l'heure de modification des fichiers", + "feedback.snapshot.restore.restore-file-ownership": "Restaurer la propriété des fichiers", + "feedback.snapshot.restore.restore-file-permissions": "Restaurer les permissions des fichiers", + "feedback.snapshot.restore.shallow-restore-at-depth": "Restauration superficielle à une profondeur spécifique", + "feedback.snapshot.restore.skip-previously-restored-files": "Ignorer les fichiers et liens symboliques déjà restaurés", + "feedback.snapshot.restore.snapshot-restore": "Restaurer", + "feedback.snapshot.restore.write-files-atomically": "Écrire les fichiers de manière atomique", + "feedback.snapshot.restore.write-sparse-files": "Écrire les fichiers en mode sparse", + "feedback.snapshot.show-individual-snapshots-count": "feedback.snapshot.show-individual-snapshots-count", + "feedback.snapshot.show-individual-snapshots-count_one": "Afficher {{count}} instantané individuel", + "feedback.snapshot.show-individual-snapshots-count_other": "Afficher {{count}} instantanés individuels", + "feedback.snapshot.start-after-previous-snapshot": "L'instantané démarrera après la fin de l'instantané précédent", + "feedback.snapshot.status.status-overdue": "en retard", + "feedback.snapshot.status.status-pending": "En attente", "feedback.tab.policies": "Politiques", "feedback.tab.preferences": "Préférences", "feedback.tab.repository": "Répertoire", "feedback.tab.repository-is-not-connected": "Le référentiel n'est pas connecté", "feedback.tab.snapshots": "Instantanés", "feedback.tab.tasks": "Tâches", - "feedback.task.canceled-after": "Annulé après", - "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} exclu) Files: {{files}} ({{files.excluded}} exclu) Directories: {{directories}} ({{directories.excluded}} exclu) Errors: {{errors}} ({{errors.ignored}} ignoré)", - "feedback.task.failed-after": "Échec après", - "feedback.task.finished-in": "Terminé en", - "feedback.task.running-for": "Courir pour", - "feedback.task.total": "Total", + "feedback.task.estimated-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} exclu) Files: {{files}} ({{files.excluded}} exclu) Directories: {{directories}} ({{directories.excluded}} exclu) Errors: {{errors}} ({{errors.ignored}} ignoré)", + "feedback.task.header.counter": "Compteur", + "feedback.task.header.value": "Valeur", + "feedback.task.logs": "Journaux", + "feedback.task.no-tasks-help": "Une liste de tâches apparaîtra ici lorsque vous créerez des instantanés, restaurerez, exécuterez des opérations de maintenance, etc.", + "feedback.task.search-tasks-by-hint": "Rechercher les journaux de tâches par description", + "feedback.task.status.task-canceled": "Tâche annulée", + "feedback.task.status.task-canceled-after": "Tâche annulée après", + "feedback.task.status.task-canceling": "Annulation en cours", + "feedback.task.status.task-error": "Erreur de tâche", + "feedback.task.status.task-failed-after": "Échec après", + "feedback.task.status.task-finished": "Terminé", + "feedback.task.status.task-finished-in": "Terminé en", + "feedback.task.status.task-running-for": "Tâche en cours depuis", + "feedback.task.status.task-started": "Démarré", + "feedback.task.status.task-succeeded-after": "Tâche réussie après", + "feedback.task.table.header-description": "Description", + "feedback.task.table.header-kind": "Type", + "feedback.task.table.header-start-time": "Heure de début", + "feedback.task.table.header-status": "Statut", + "feedback.task.tasks-total": "Total", "feedback.ui.appearance": "Apparence", "feedback.ui.appearance-help": "Spécifie l'apparence de l'interface utilisateur", "feedback.ui.appearance-hint": "Sélectionnez la taille de police", @@ -224,225 +434,12 @@ "feedback.ui.theme-description": "Thème", "feedback.ui.theme-help": "Le thème actif actuel", "feedback.ui.theme-select": "Sélectionnez un thème", - "feedback.validation.azure.access-key": "Clef d'accès", - "feedback.validation.azure.access-key-hint": "Entrez la clé d'accès secrète", - "feedback.validation.azure.azure-storage-domain": "Domaine de stockage Azure", - "feedback.validation.azure.azure-storage-domain-hint": "Entrez le domaine de stockage ou laissez vide pour « blob.core.windows.net » par défaut.", - "feedback.validation.azure.container": "Récipient", - "feedback.validation.azure.container-hint": "Entrez le nom du conteneur", - "feedback.validation.azure.object-name-prefix": "Préfixe du nom de l'objet", - "feedback.validation.azure.object-name-prefix-hint": "Entrez le préfixe du nom de l'objet ou laissez vide", - "feedback.validation.azure.sas-token": "Jeton SAS", - "feedback.validation.azure.sas-token-hint": "Entrez le jeton SAS secret", - "feedback.validation.azure.storage-account": "Compte de stockage", - "feedback.validation.azure.storage-account-hint": "Saisissez le nom du compte de stockage", - "feedback.validation.b2.bucket-name": "Godet B2", - "feedback.validation.b2.bucket-name-hint": "Saisissez le nom du compartiment", - "feedback.validation.b2.key": "Clé", - "feedback.validation.b2.key-hint": "Entrez l'application secrète ou la clé de compte", - "feedback.validation.b2.key-id": "ID de clé", - "feedback.validation.b2.key-id-hint": "Saisissez l'ID de la clé de l'application ou du compte", - "feedback.validation.b2.object-name-prefix": "Préfixe du nom de l'objet", - "feedback.validation.b2.object-name-prefix-hint": "Entrez le préfixe du nom de l'objet ou laissez vide", - "feedback.validation.gcs.bucket-name": "Godet GCS", - "feedback.validation.gcs.bucket-name-hint": "Saisissez le nom du compartiment", - "feedback.validation.gcs.credentials-file": "Fichier d'informations d'identification", - "feedback.validation.gcs.credentials-file-hint": "Entrez le nom du fichier JSON d'informations d'identification", - "feedback.validation.gcs.credentials-json": "Identifiants JSON", - "feedback.validation.gcs.credentials-json-paste": "Collez les informations d'identification JSON ici", - "feedback.validation.gcs.object-name-prefix": "Préfixe du nom de l'objet", - "feedback.validation.gcs.object-name-prefix-hint": "Entrez le préfixe du nom de l'objet ou laissez vide", "feedback.validation.invalid-times-of-day": "Heures de la journée invalides", - "feedback.validation.local.directory-path": "Chemin du répertoire", - "feedback.validation.local.directory-path-hint": "Entrez le chemin du répertoire dans lequel vous souhaitez stocker les fichiers du référentiel", "feedback.validation.optional.valid-number-or-empty": "Doit être un numéro valide ou vide", "feedback.validation.passwords-dont-match": "Les mots de passe ne correspondent pas", - "feedback.validation.rclone.rclone-executable-path": "Chemin de l'exécutable Rclone", - "feedback.validation.rclone.rclone-executable-path-hint": "Entrez le chemin de l'exécutable rclone", - "feedback.validation.rclone.rclone-remote-path": "Chemin distant Rclone", - "feedback.validation.rclone.rclone-remote-path-hint": "Entrez  :", - "feedback.validation.repository-server.server-address": "Adresse du serveur", - "feedback.validation.repository-server.server-address-hint": "Entrez l'URL du serveur (https://:port)", - "feedback.validation.repository-server.server-certificate-fingerprint": "Empreinte digitale du certificat de serveur de confiance (SHA256)", - "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Saisissez l'empreinte digitale du certificat de serveur de confiance imprimée au démarrage du serveur", - "feedback.validation.repository-token.token": "Jeton", - "feedback.validation.repository-token.token-hint": "Coller le jeton de connexion", "feedback.validation.required.directory": "champs requis", "feedback.validation.required.field": "champs requis", - "feedback.validation.required.hostname": "Nom d'hôte", - "feedback.validation.required.hostname-hint": "Remplacez ceci lors de la restauration d'un instantané pris sur une autre machine", - "feedback.validation.required.password-repository": "Mot de passe du référentiel", - "feedback.validation.required.password-repository-help": "Utilisé pour chiffrer le contenu du référentiel", - "feedback.validation.required.password-repository-hint": "Entrez le mot de passe du référentiel", - "feedback.validation.required.repository-password-confirm": "Confirmer le mot de passe du référentiel", - "feedback.validation.required.repository-password-confirm-again": "entrez à nouveau le mot de passe du référentiel", - "feedback.validation.required.server-password": "Mot de passe du serveur", - "feedback.validation.required.server-password-hint": "Entrez le mot de passe pour vous connecter au serveur", - "feedback.validation.required.username": "Nom d'utilisateur", - "feedback.validation.required.username-hint": "Remplacez ceci lors de la restauration d'un instantané pris par un autre utilisateur", "feedback.validation.required.valid-number-or-empty": "Doit être un numéro valide ou vide", - "feedback.validation.s3.access-key-id": "ID de clé d'accès", - "feedback.validation.s3.access-key-id-hint": "Entrez l'ID de la clé d'accès", - "feedback.validation.s3.bucket-name": "Seau", - "feedback.validation.s3.bucket-name-hint": "Saisissez le nom du compartiment", - "feedback.validation.s3.object-name-prefix": "Préfixe du nom de l'objet", - "feedback.validation.s3.override-region": "Remplacer la région", - "feedback.validation.s3.override-region-hint": "Entrez une région spécifique (par exemple, us-west-1) ou laissez vide", - "feedback.validation.s3.secret-access-key": "Clé d'accès secrète", - "feedback.validation.s3.secret-access-key-hint": "Entrez la clé d'accès secrète", - "feedback.validation.s3.server-endpoint": "Point de terminaison du serveur", - "feedback.validation.s3.server-endpoint-hint": "Saisissez l'adresse du serveur (par exemple, s3.amazonaws.com)", - "feedback.validation.s3.session-token": "Jeton de session", - "feedback.validation.s3.session-token-hint": "Entrez le jeton de session ou laissez vide", - "feedback.validation.webdav.password": "Mot de passe", - "feedback.validation.webdav.password-hint": "Entrer le mot de passe", - "feedback.validation.webdav.server-url": "URL du serveur WebDAV", - "feedback.validation.webdav.username": "Nom d'utilisateur", - "feedback.validation.webdav.username-hint": "Saisissez votre nom d'utilisateur", - "policies.feedback.find.count_one": "{{count}} politiques correspondant aux critères ont été trouvées", - "policies.feedback.find.count_other": "{{count}} politiques correspondant aux critères ont été trouvées", - "policies.feedback.find.none": "Aucune politique trouvée.", - "policies.feedback.find.none.create": "Aucune stratégie trouvée pour le répertoire {{path}}. \nVeuillez configurer une nouvelle politique.", - "policies.feedback.loading": "Chargement ...", - "policies.feedback.path.absolute": "Les stratégies ne peuvent être définies que pour des chemins absolus.", - "policies.feedback.policy.find": "Entrez dans le répertoire pour rechercher ou définir une politique", - "policies.kind.all": "Toutes les politiques", - "policies.kind.applicable": "Politiques applicables", - "policies.kind.global": "Politiques mondiales", - "policies.kind.host": "Politiques par hôte", - "policies.kind.local": "Politiques locales", - "policies.kind.user": "Politiques par utilisateur", - "repository.attribute.algorithm.eco": "Algorithme de correction d'erreur", - "repository.attribute.algorithm.encryption": "Algorithme de chiffrement", - "repository.attribute.algorithm.hash": "Algorithme de hachage", - "repository.attribute.algorithm.splitter": "Algorithme de découpage", - "repository.attribute.compression.internal": "Compression interne", - "repository.attribute.config.file": "Fichier de configuration", - "repository.attribute.connected.as": "Connecté en tant que", - "repository.attribute.eco": "Surcoût de correction d'erreurs", - "repository.attribute.format": "Format du répertoire", - "repository.attribute.provider": "Fournisseur", - "repository.attribute.server.url": "URL du serveur", - "repository.event.connection.cancel": "Annuler la connexion", - "repository.event.connection.disconnect": "Déconnexion du répertoire", - "repository.event.description.update": "Mettre à jour la description", - "repository.feedback.compression.internal.not.supported": "non", - "repository.feedback.compression.internal.supported": "oui", - "repository.feedback.description.required": "La description du répertoire est obligatoire", - "repository.feedback.eco.disabled": "Désactivé", - "repository.feedback.read.only": "Le répertoire est en lecture seule", - "repository.status.connected": "Connecté au répertoire", - "repository.status.initializing": "Initialisation du répertoire...", - "snapshot.event.create.estimate": "Estimation", - "snapshot.event.create.now": "Instantané maintenant", - "snapshot.event.create.path": "Entrez le chemin d'accès à l'instantané", - "snapshot.event.create.path.resolve": "Doit spécifier le répertoire dans lequel prendre l'instantané.", - "snapshot.event.delete.selected_one": "Voulez-vous supprimer l'instantané {{count}} sélectionné ?", - "snapshot.event.delete.selected_other": "Voulez-vous supprimer les {{count}} instantanés sélectionnés ?", - "snapshot.event.directory.browse": "Parcourir", - "snapshot.event.directory.browsing": "La navigation dans les répertoires n'est pas prise en charge dans un navigateur Web. \nUtilisez l'interface utilisateur de Kopia.", - "snapshot.event.directory.mount": "Monter en tant que système de fichiers local", - "snapshot.event.directory.restore": "Restaurer des fichiers et des répertoires", - "snapshot.event.directory.unmount": "Démonter", - "snapshot.event.history.delete.source": "Supprimer la source de l'instantané", - "snapshot.event.history.description.update": "{{description}} : cliquez pour mettre à jour la description de l'instantané.", - "snapshot.event.history.deselect.all": "Tout déselectionner", - "snapshot.event.history.fetch.snapshots": "Récupérer des instantanés", - "snapshot.event.history.pin.add": "Ajouter une épingle pour protéger l'instantané de la suppression", - "snapshot.event.history.select.all": "Tout sélectionner", - "snapshot.event.history.selected.delete": "Supprimer sélectionnée (", - "snapshot.event.restore": "Restaurer", - "snapshot.event.restore.begin": "Démarrer la restauration", - "snapshot.event.snapshot.new": "Nouvel instantané", - "snapshot.event.snapshot.pending": "En attente", - "snapshot.event.snapshot.policy": "Politique", - "snapshot.event.synchronize": "Synchroniser", - "snapshot.feedback.directory.mount.restore": "Vous pouvez monter/restaurer tous les fichiers et répertoires que vous voyez ci-dessous ou restaurer les fichiers individuellement.", - "snapshot.feedback.history.display": "Affichage", - "snapshot.feedback.history.wipe.all": "Effacez tous les instantanés et la stratégie de cette source.", - "snapshot.feedback.restore.continue.errors": "Continuer en cas d'erreurs", - "snapshot.feedback.restore.continue.errors.help": "Lorsqu'une erreur de restauration se produit, essayez de continuer au lieu d'échouer rapidement.", - "snapshot.feedback.restore.destination": "Destination", - "snapshot.feedback.restore.destination.help": "Vous pouvez également restaurer vers un fichier .zip ou .tar en fournissant l'extension appropriée.", - "snapshot.feedback.restore.destination.path": "Entrez le chemin de destination", - "snapshot.feedback.restore.directory.overwrite": "Écraser les répertoires", - "snapshot.feedback.restore.disable.compression.zip": "Désactiver la compression ZIP", - "snapshot.feedback.restore.disable.compression.zip.help": "Ne pas compresser lors de la restauration vers un fichier ZIP (plus rapide).", - "snapshot.feedback.restore.file.atomically": "Écrire les fichiers de manière atomique", - "snapshot.feedback.restore.file.modification.time": "Restaurer l'heure de modification des fichiers", - "snapshot.feedback.restore.file.overwrite": "Écraser les fichiers", - "snapshot.feedback.restore.file.ownership": "Restaurer la propriété des fichiers", - "snapshot.feedback.restore.file.permission": "Restaurer les permissions des fichiers", - "snapshot.feedback.restore.file.sparse": "Écrire les fichiers en mode sparse", - "snapshot.feedback.restore.link.overwrite": "Écraser les liens symboliques", - "snapshot.feedback.restore.shallow.depth": "Restauration superficielle à une profondeur spécifique", - "snapshot.feedback.restore.shallow.file.size.minimal": "Taille minimale des fichiers pour une restauration superficielle", - "snapshot.feedback.restore.skip": "Ignorer les fichiers et liens symboliques déjà restaurés", - "snapshot.feedback.restore.task.go": "Aller à la tâche de restauration", - "snapshot.feedback.snapshot.new": "Nouvel instantané", - "snapshot.feedback.snapshot.start": "L'instantané démarrera après la fin de l'instantané précédent", - "snapshot.header.actions": "Actions", - "snapshot.header.snapshot.last": "Dernier instantané", - "snapshot.header.snapshot.next": "Instantané suivant", - "snapshot.header.snapshot.owner": "Propriétaire", - "snapshot.header.snapshot.path": "Chemin", - "snapshot.header.snapshot.size": "Taille", - "snapshot.header.status": "Statut", - "snapshot.history.feedack.unfiltered.count_one": "Afficher {{count}} instantané individuel", - "snapshot.history.feedack.unfiltered.count_other": "Afficher {{count}} instantanés individuels", - "snapshot.history.header.description": "Description", - "snapshot.history.header.directories": "Directeurs", - "snapshot.history.header.files": "Des dossiers", - "snapshot.history.header.retention": "Rétention", - "snapshot.history.header.root": "Racine", - "snapshot.history.header.selected": "Choisi", - "snapshot.history.header.size": "Taille", - "snapshot.history.header.time.start": "Heure de début", - "task.all": "Tous", - "task.event.stop": "Arrêter", - "task.failed": "Échoué", - "task.feedback.entries": "Une liste de tâches apparaîtra ici lorsque vous créerez des instantanés, restaurerez, exécuterez des opérations de maintenance, etc.", - "task.feedback.search": "Rechercher des journaux par description", - "task.header.counter": "Compteur", - "task.header.description": "Description", - "task.header.kind": "Type", - "task.header.status": "Statut", - "task.header.time.start": "Heure de début", - "task.header.value": "Valeur", - "task.loading": "Chargement...", - "task.logs": "Journaux", - "task.running": "En cours", - "task.status.canceled": "Tâche annulée après", - "task.status.canceling": "Annulation en cours", - "task.status.error": "Erreur de tâche", - "task.status.finished": "Terminé", - "task.status.running.for": "Tâche en cours depuis", - "task.status.started": "Démarré", - "task.status.succeed.after": "Tâche réussie après", - "validation.password": "Mot de passe", - "validation.password-hint": "Entrer le mot de passe", - "validation.provider.external-ssh-command": "Lancer une commande SSH externe sans mot de passe", - "validation.provider.external-ssh-command-hint": "Par défaut, Kopia se connecte au serveur à l'aide d'un client SSH interne qui prend en charge des options limitées. \nAlternativement, il peut lancer une commande SSH externe sans mot de passe, qui prend en charge des options supplémentaires, mais est généralement moins efficace que le client intégré.", - "validation.provider.host": "Hôte", - "validation.provider.host-hint": "nom d'hôte ssh (par exemple, example.com)", - "validation.provider.key-data": "Données clé", - "validation.provider.key-data-hint": "Collez le contenu du fichier de clé", - "validation.provider.known-host-data": "Données sur les hôtes connus", - "validation.provider.known-host-data-hint": "Collez le contenu du fichier known_hosts", - "validation.provider.path": "Chemin", - "validation.provider.path-hint": "Entrez le chemin distant vers le référentiel, par exemple « /mnt/data/repository »", - "validation.provider.path-host-file": "Chemin d'accès au fichier known_hosts", - "validation.provider.path-host-file-hint": "Entrez le chemin d'accès au fichier known_hosts", - "validation.provider.path-key-file": "Chemin d'accès au fichier de clé", - "validation.provider.path-key-file-hint": "Entrez le chemin d'accès au fichier de clé", - "validation.provider.port": "Port", - "validation.provider.port-hint": "Numéro de port (par exemple, 22)", - "validation.provider.ssh-arguments": "Arguments SSH", - "validation.provider.ssh-arguments-hint": "Entrez les arguments de la commande SSH (« user@host -s sftp » sera ajouté automatiquement)", - "validation.provider.ssh-command": "Commande SSH", - "validation.provider.ssh-command-hint": "Fournissez la commande SSH sans mot de passe à exécuter (généralement « ssh »)", - "validation.provider.user": "Utilisateur", - "validation.provider.user-hint": "Nom d'utilisateur", "value.algorithm.eco-disabled": "Désactivé", "value.algorithm.suffix-not-recommended": "(NON RECOMMANDÉ)", "value.algorithm.suffix-recommended": "(RECOMMANDÉ)", @@ -458,8 +455,8 @@ "value.policy.optional": "Ignorer les échecs", "value.provider.s3.http-connection-insecure": "Utiliser une connexion HTTP (non sécurisée)", "value.provider.s3.no-tls-verification": "Ne pas vérifier le certificat TLS", - "value.repository.format.latest": "Dernier format", - "value.repository.format.legacy": "Format hérité compatible avec la v0.8", + "value.repository.latest-format": "Dernier format", + "value.repository.legacy-format": "Format hérité compatible avec la v0.8", "value.snapshot-frequency.10-minutes": "toutes les 10 minutes", "value.snapshot-frequency.12-hours": "toutes les 12 heures", "value.snapshot-frequency.15-minutes": "toutes les 15 minutes", diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index 02a54300..28f68e50 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -1,52 +1,71 @@ { - "common.back": "Indietro", - "common.cancel": "Annulla", - "common.click-here-to-learn-more": "Clicca qui per saperne di più.", - "common.delete": "Eliminare", - "common.delete-confirm": "Conferma cancellazione", - "common.loading": "Caricamento ...", - "common.next": "Prossimo", - "common.return": "Ritorno", - "enter-object-name-prefix-or-leave-empty-hint": "Inserisci il prefisso del nome dell'oggetto o lascia vuoto", + "common.action.back": "Indietro", + "common.action.cancel": "Annulla", + "common.action.click-here-to-learn-more": "Clicca qui per saperne di più.", + "common.action.confirm-delete": "Conferma cancellazione", + "common.action.delete": "Eliminare", + "common.action.next": "Prossimo", + "common.action.return": "Ritorno", + "common.action.stop": "Arresta", + "common.label.loading": "Caricamento...", "event.cli.copy-to-clipboard": "Copia negli appunti", "event.cli.show-cli-equivalent": "Fare clic per mostrare l'equivalente CLI", - "event.description.cancel": "Annulla", - "event.description.new": "Inserisci una nuova descrizione", - "event.description.remove": "Rimuovi descrizione", - "event.description.update": "Descrizione dell'aggiornamento", - "event.log.hide": "Nascondi log", - "event.log.show": "Mostra log", - "event.pin.add": "Aggiungi puntina", - "event.pin.cancel": "Annulla", - "event.pin.remove": "Rimuovi perno", - "event.pin.snapshot-pin": "Pin istantanea", - "event.pin.update": "Aggiorna perno", + "event.log.hide-log": "Nascondi log", + "event.log.show-log": "Mostra log", + "event.pin.add-pin": "Aggiungi puntina", + "event.pin.pin-snapshot": "Pin istantanea", + "event.pin.remove-pin": "Rimuovi perno", + "event.pin.update-pin": "Aggiorna perno", "event.policy.delete": "Elimina politica", "event.policy.edit": "Modificare", "event.policy.save": "Salva politica", - "event.policy.set": "Imposta la politica", - "event.repository.advanced-options-hide": "Nascondi opzioni avanzate", - "event.repository.advanced-options.show": "Mostra opzioni avanzate", + "event.policy.set-policy": "Imposta la politica", + "event.repository.cancel-connection": "Annulla connessione", "event.repository.connect-to-repository": "Connettiti al deposito", "event.repository.create-repository": "Crea archivio", - "event.task.cancel": "Annulla attività", - "feedback.description.modal-title": "Descrizione dell'istantanea", + "event.repository.disconnect-from-repository": "Disconnetti dal repository", + "event.repository.hide-advanced-options": "Nascondi opzioni avanzate", + "event.repository.show-advanced-options": "Mostra opzioni avanzate", + "event.repository.update-description": "Aggiorna descrizione", + "event.snapshot.browse-directory": "Navigare", + "event.snapshot.delete-selected": "event.snapshot.delete-selected", + "event.snapshot.delete-selected_one": "Vuoi eliminare lo snapshot {{count}} selezionato?", + "event.snapshot.delete-selected_other": "Vuoi eliminare le istantanee {{count}} selezionate?", + "event.snapshot.description.enter-new-description": "Inserisci una nuova descrizione", + "event.snapshot.description.remove-description": "Rimuovi descrizione", + "event.snapshot.description.update-description": "Descrizione dell'aggiornamento", + "event.snapshot.estimate": "Stima", + "event.snapshot.fetch-snapshots": "Recupera istantanee", + "event.snapshot.history.delete-selected": "Elimina selezionati ({{count}})", + "event.snapshot.history.delete-snapshot-source": "Elimina origine istantanea", + "event.snapshot.history.deselect-all": "Deselezionare tutto", + "event.snapshot.history.select-all-snapshots": "Seleziona tutto", + "event.snapshot.history.update-snapshot-description": "{{description}}: fai clic per aggiornare la descrizione dell'istantanea.", + "event.snapshot.mount-directory": "Monta come file system locale", + "event.snapshot.new-snapshot": "Nuova Istantanea", + "event.snapshot.restore-file-directories": "Ripristina file e directory", + "event.snapshot.restore.begin-restore": "Inizia il ripristino", + "event.snapshot.restore.go-to-restore-task": "Vai a Ripristina attività", + "event.snapshot.show-policy": "Politica", + "event.snapshot.snapshot-now": "Scatta subito un'istantanea", + "event.snapshot.synchronize": "Sincronizza", + "event.snapshot.unmount-directory": "Smonta", + "event.task.action.cancel": "Annulla attività", + "event.task.select.task-all": "Tutte", + "event.task.select.task-failed": "Fallite", + "event.task.select.task-running": "In esecuzione", + "feedback.directory.header.directories": "Directory", + "feedback.directory.header.files": "File", + "feedback.directory.header.last-modification": "Ultima modifica", + "feedback.directory.header.name": "Nome", + "feedback.directory.header.size": "Misurare", "feedback.error.common": "Errore", "feedback.error.connection": "Errore di connessione:", - "feedback.header.actions": "Azioni", - "feedback.header.defined": "Definito", - "feedback.header.details": "Dettagli", - "feedback.header.directories": "Directory", "feedback.header.effective": "Efficace", - "feedback.header.files": "File", - "feedback.header.host": "Ospite", - "feedback.header.modification-last": "Ultima modifica", - "feedback.header.name": "Nome", - "feedback.header.path": "Sentiero", - "feedback.header.size": "Misurare", "feedback.header.username": "Nome utente", - "feedback.pin.name": "Nome del perno", - "feedback.pin.standard-text": "non cancellare", + "feedback.pin.add-pin-to-protect": "Aggiungi un segnaposto per proteggere l'istantanea dall'eliminazione", + "feedback.pin.do-not-delete": "non cancellare", + "feedback.pin.name-of-the-pin": "Nome del perno", "feedback.policy.action.command-mode": "Modalità di comando", "feedback.policy.actions.after-folder": "Dopo la cartella", "feedback.policy.actions.after-folder-help": "Script da eseguire dopo la cartella", @@ -97,16 +116,32 @@ "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignorare le directory contenenti CACHEDIR.TAG e simili", "feedback.policy.files.scan-only-one-filesystem": "Scansiona solo un filesystem", "feedback.policy.files.scan-only-one-filesystem-help": "Non oltrepassare i limiti del file system durante la creazione di uno snapshot", + "feedback.policy.find-count": "feedback.policy.find-count", + "feedback.policy.find-count_one": "Trovata {{count}} policy corrispondente ai criteri", + "feedback.policy.find-count_other": "Trovate {{count}} politiche che corrispondono ai criteri", + "feedback.policy.find-hint": "Inserisci la directory per trovare o impostare la policy", + "feedback.policy.find-none": "Nessuna politica trovata", + "feedback.policy.find-none-create": "Nessuna policy trovata per la directory {{path}}. \nImposta una nuova policy.", + "feedback.policy.header.actions": "Azioni", "feedback.policy.header.compression": "Compressione", + "feedback.policy.header.defined": "Definito", "feedback.policy.header.error-handling": "Gestione degli errori", "feedback.policy.header.files": "File", "feedback.policy.header.folder-actions": "Azioni delle cartelle", + "feedback.policy.header.host": "Ospite", "feedback.policy.header.logging": "Registrazione", "feedback.policy.header.other": "Altro", + "feedback.policy.header.path": "Sentiero", "feedback.policy.header.scheduling": "Pianificazione", "feedback.policy.header.snapshot-action": "Azioni istantanee", "feedback.policy.header.snapshot-retention": "Conservazione delle istantanee", "feedback.policy.header.upload": "Caricamento", + "feedback.policy.kind.all": "Tutte le politiche", + "feedback.policy.kind.applicable": "Politiche applicabili", + "feedback.policy.kind.global": "Politiche globali", + "feedback.policy.kind.local": "Politiche locali", + "feedback.policy.kind.per-host-policies": "Politiche per host", + "feedback.policy.kind.per-user-policies": "Criteri per utente", "feedback.policy.logging.cache-hit": "Hit della cache", "feedback.policy.logging.cache-hit-help": "Registra la verbosità quando viene utilizzata una cache invece di caricare il file", "feedback.policy.logging.cache-miss": "Mancata cache", @@ -123,6 +158,7 @@ "feedback.policy.other.disable-parent-policy-evaluation-help": "Impedisce che eventuali policy principali influenzino questa directory e le relative sottodirectory", "feedback.policy.other.json-representation": "Rappresentazione JSON", "feedback.policy.other.json-representation-help": "Questa è la rappresentazione interna di una politica", + "feedback.policy.policies-defined-by-path-absolute": "Le policy possono essere definite solo per percorsi assoluti.", "feedback.policy.retention.annual-snapshot-retain": "Annuale", "feedback.policy.retention.annual-snapshot-retain-help": "Numero di snapshot annuali da conservare per origine. \nVerrà conservata l'ultima istantanea di ogni anno solare", "feedback.policy.retention.annual-snapshot-retain-hint": "Numero di snapshot annuali", @@ -168,19 +204,113 @@ "feedback.policy.upload.maximum-parallel-snapshots-help": "Numero massimo di snapshot che possono essere caricati contemporaneamente", "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "numero massimo di snapshot paralleli", "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "deve essere specificato utilizzando la policy globale, utente o host", + "feedback.prodiver.gcs.paste-json-credentials": "Incolla qui le credenziali JSON", "feedback.provider.azure-blob-storage": "Archiviazione BLOB di Azure", + "feedback.provider.azure.access-key": "Chiave di accesso", + "feedback.provider.azure.azure-storage-domain": "Dominio di archiviazione di Azure", + "feedback.provider.azure.container": "Contenitore", + "feedback.provider.azure.enter-access-key": "Inserisci la chiave di accesso segreta", + "feedback.provider.azure.enter-azure-storage-domain": "Inserisci il dominio di archiviazione o lascia vuoto il campo predefinito \"blob.core.windows.net\"", + "feedback.provider.azure.enter-container-name": "Inserisci il nome del contenitore", + "feedback.provider.azure.enter-object-name-prefix": "Inserisci il prefisso del nome dell'oggetto o lascia vuoto", + "feedback.provider.azure.enter-sas-token": "Inserisci il token SAS segreto", + "feedback.provider.azure.enter-storage-account": "Immettere il nome dell'account di archiviazione", + "feedback.provider.azure.object-name-prefix": "Prefisso nome oggetto", + "feedback.provider.azure.sas-token": "Gettone SAS", + "feedback.provider.azure.storage-account": "Conto di archiviazione", + "feedback.provider.b2.bucket-name": "Benna B2", + "feedback.provider.b2.enter-account-key": "Inserisci l'applicazione segreta o la chiave dell'account", + "feedback.provider.b2.enter-account-key-id": "Inserisci l'ID della chiave dell'applicazione o dell'account", + "feedback.provider.b2.enter-bucket-name": "Inserisci il nome del bucket", + "feedback.provider.b2.enter-object-name-prefix": "Inserisci il prefisso del nome dell'oggetto o lascia vuoto", + "feedback.provider.b2.key": "Chiave", + "feedback.provider.b2.key-id": "ID chiave", + "feedback.provider.b2.object-name-prefix": "Prefisso nome oggetto", "feedback.provider.backblaze-b2": "Backblaze B2", + "feedback.provider.filesystem.directory-path": "Percorso della directory", + "feedback.provider.filesystem.enter-directory-path": "Inserisci il percorso della directory in cui desideri archiviare i file del repository", + "feedback.provider.gcs.bucket-name": "Benna GCS", + "feedback.provider.gcs.credentials-file": "File delle credenziali", + "feedback.provider.gcs.credentials-json": "Credenziali JSON", + "feedback.provider.gcs.enter-bucket-name": "Inserisci il nome del bucket", + "feedback.provider.gcs.enter-credentials-file-name": "Immettere il nome del file JSON delle credenziali", + "feedback.provider.gcs.enter-object-name-prefix": "Inserisci il prefisso del nome dell'oggetto o lascia vuoto", + "feedback.provider.gcs.object-name-prefix": "Prefisso nome oggetto", "feedback.provider.google-cloud-storage": "Archiviazione Google Cloud", "feedback.provider.kopia-repository-server": "Server di archivio Kopia", "feedback.provider.local-directory-or-nas": "Directory locale o NAS", "feedback.provider.rclone-remote": "RClone remoto", + "feedback.provider.rclone.rclone-executable-path": "Percorso eseguibile Rclone", + "feedback.provider.rclone.rclone-executable-path-hint": "Immettere il percorso dell'eseguibile rclone", + "feedback.provider.rclone.rclone-remote-path": "Rclone percorso remoto", + "feedback.provider.rclone.rclone-remote-path-hint": "Inserisci :", + "feedback.provider.repositoryserver.enter-server-certificate-fingerprint": "Inserisci l'impronta digitale del certificato del server attendibile stampata all'avvio del server", + "feedback.provider.repositoryserver.enter-server-url": "Inserisci l'URL del server (https://:porta)", + "feedback.provider.repositoryserver.server-address": "Indirizzo del server", + "feedback.provider.repositoryserver.server-certificate-fingerprint": "Impronta digitale del certificato del server affidabile (SHA256)", + "feedback.provider.repositorytoken.paste-token": "Incolla token di connessione", + "feedback.provider.repositorytoken.token": "Gettone", "feedback.provider.required-either-key-file": "È richiesta una tra Password, File chiave o Dati chiave.", "feedback.provider.required-either-known-host-data": "È richiesto il file degli host conosciuti o i dati degli host conosciuti, ma non entrambi.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 o spazio di archiviazione compatibile", + "feedback.provider.s3.access-key-id": "ID chiave di accesso", + "feedback.provider.s3.access-key-id-hint": "Immettere l'ID della chiave di accesso", + "feedback.provider.s3.bucket-name": "Secchio", + "feedback.provider.s3.bucket-name-hint": "Inserisci il nome del bucket", + "feedback.provider.s3.enter-object-name-prefix-hint": "Inserisci il prefisso del nome dell'oggetto o lascia vuoto", + "feedback.provider.s3.object-name-prefix": "Prefisso nome oggetto", + "feedback.provider.s3.override-region": "Sostituisci regione", + "feedback.provider.s3.override-region-hint": "Inserisci una regione specifica (ad esempio, us-west-1) o lascia vuoto", + "feedback.provider.s3.secret-access-key": "Chiave di accesso segreta", + "feedback.provider.s3.secret-access-key-hint": "Inserisci la chiave di accesso segreta", + "feedback.provider.s3.server-endpoint": "Punto finale del server", + "feedback.provider.s3.server-endpoint-hint": "Inserisci l'indirizzo del server (ad esempio, s3.amazonaws.com)", + "feedback.provider.s3.session-token": "Gettone di sessione", + "feedback.provider.s3.session-token-hint": "Inserisci il token della sessione o lascia vuoto", + "feedback.provider.sftp-key-data": "Dati chiave", + "feedback.provider.sftp-key-data-hint": "Incolla il contenuto del file chiave", "feedback.provider.sftp-server": "Server SFTP", + "feedback.provider.sftp.enter-password": "Inserire la password", + "feedback.provider.sftp.enter-path-host-file": "Inserisci il percorso del fileknown_hosts", + "feedback.provider.sftp.enter-path-to-key-file": "Immettere il percorso del file chiave", + "feedback.provider.sftp.enter-remote-path": "Inserisci il percorso remoto del repository, ad esempio \"/mnt/data/repository\"", + "feedback.provider.sftp.enter-ssh-arguments": "Inserisci gli argomenti del comando SSH ('user@host -s sftp' verrà aggiunto automaticamente)", + "feedback.provider.sftp.enter-ssh-host-name": "nome host ssh (ad esempio, example.com)", + "feedback.provider.sftp.host": "Ospite", + "feedback.provider.sftp.known-host-data": "Dati degli host conosciuti", + "feedback.provider.sftp.launch-external-ssh-command": "Avvia il comando SSH esterno senza password", + "feedback.provider.sftp.launch-external-ssh-command-hint": "Per impostazione predefinita Kopia si connette al server utilizzando il client SSH interno che supporta opzioni limitate. \nIn alternativa, può avviare un comando SSH esterno senza password, che supporta opzioni aggiuntive, ma generalmente è meno efficiente del client integrato.", + "feedback.provider.sftp.password": "Parola d'ordine", + "feedback.provider.sftp.paste-content-of-known-host": "Incolla il contenuto del fileknown_hosts", + "feedback.provider.sftp.path": "Sentiero", + "feedback.provider.sftp.path-host-file": "Percorso del fileknown_hosts", + "feedback.provider.sftp.path-key-file": "Percorso del file chiave", + "feedback.provider.sftp.port": "Porta", + "feedback.provider.sftp.port-number": "Numero di porta (ad esempio, 22)", + "feedback.provider.sftp.provide-passwordless-ssh-command": "Fornire il comando SSH senza password da eseguire (in genere 'ssh')", + "feedback.provider.sftp.ssh-arguments": "Argomenti SSH", + "feedback.provider.sftp.ssh-command": "Comando SSH", + "feedback.provider.sftp.user": "Utente", + "feedback.provider.sftp.user-name": "Nome utente", "feedback.provider.use-repository-token": "Utilizza token di archivio", "feedback.provider.webdav-server": "Server WebDAV", + "feedback.provider.webdav.enter-password": "Inserire la password", + "feedback.provider.webdav.enter-username": "Inserire username", + "feedback.provider.webdav.password": "Parola d'ordine", + "feedback.provider.webdav.server-url": "URL del server WebDAV", + "feedback.provider.webdav.username": "Nome utente", "feedback.repository.additional-parameters-hint": "È possibile impostare parametri aggiuntivi durante la creazione del repository utilizzando la riga di comando.", + "feedback.repository.attribute.algorithm-eco": "Algoritmo di correzione degli errori", + "feedback.repository.attribute.algorithm-encryption": "Algoritmo di crittografia", + "feedback.repository.attribute.algorithm-hash": "Algoritmo di hash", + "feedback.repository.attribute.algorithm-splitter": "Algoritmo di suddivisione", + "feedback.repository.attribute.config-file": "File di configurazione", + "feedback.repository.attribute.connected-as": "Connesso come", + "feedback.repository.attribute.internal-compression": "Compressione interna", + "feedback.repository.attribute.repository-eco": "Overhead di correzione degli errori", + "feedback.repository.attribute.repository-format": "Formato del repository", + "feedback.repository.attribute.repository-provider": "Provider", + "feedback.repository.attribute.server-url": "URL del server", "feedback.repository.configuration": "Configurazione di archiviazione", "feedback.repository.connect-as": "Connetti come", "feedback.repository.connect-in-read-only-mode": "Connetti in modalità di sola lettura", @@ -188,8 +318,14 @@ "feedback.repository.connect-to-repository": "Connettiti al deposito", "feedback.repository.create-repository-new": "Crea nuovo archivio", "feedback.repository.create-repository-new-help": "Inserisci una password complessa per creare il repository Kopia nello spazio di archiviazione fornito.", + "feedback.repository.eco-disabled": "Disabilitato", "feedback.repository.eec-warning": "[SPERIMENTALE] La correzione degli errori può aiutare a proteggere da alcuni tipi di danneggiamento dei dati dovuti a inversioni di bit spontanee nei supporti di memorizzazione.", "feedback.repository.encryption": "Crittografia", + "feedback.repository.enter-repository-password": "Inserisci la password dell'archivio", + "feedback.repository.hostname": "Nome host", + "feedback.repository.hostname-hint": "Sostituiscilo quando ripristini uno snapshot acquisito su un altro computer", + "feedback.repository.internal-compression-supported-no": "no", + "feedback.repository.internal-compression-supported-yes": "sì", "feedback.repository.kopia-server-parameters": "Parametri del server Copia", "feedback.repository.name-default": "Il mio deposito", "feedback.repository.override-hint": "Per eseguire l'override, fai clic su \"Mostra opzioni avanzate\"", @@ -198,20 +334,94 @@ "feedback.repository.repository-description": "Descrizione del deposito", "feedback.repository.repository-description-help": "Aiuta a distinguere tra più repository connessi", "feedback.repository.repository-description-hint": "Inserisci la descrizione del repository", + "feedback.repository.repository-description-required": "La descrizione del repository è obbligatoria", + "feedback.repository.repository-initializing": "Inizializzazione del repository...", + "feedback.repository.repository-is-read-only": "Il repository è in sola lettura", + "feedback.repository.repository-password": "Password dell'archivio", + "feedback.repository.repository-password-confirm": "Conferma la password dell'archivio", + "feedback.repository.repository-password-confirm-again": "immettere nuovamente la password del repository", + "feedback.repository.repository-password-help": "Utilizzato per crittografare il contenuto del repository", "feedback.repository.repository-token-enter": "Inserisci il token del repository", - "feedback.snapshot.status.overdue": "in ritardo", + "feedback.repository.server-password": "Password del server", + "feedback.repository.server-password-hint": "Inserisci la password per connetterti al server", + "feedback.repository.status-connected": "Connesso al repository", + "feedback.repository.username": "Nome utente", + "feedback.repository.username-hint": "Sostituiscilo quando ripristini uno snapshot scattato da un altro utente", + "feedback.snapshot.create.enter-path-to-snapshot-hint": "Inserisci il percorso dello snapshot", + "feedback.snapshot.create.must-specify-path": "È necessario specificare la directory in cui eseguire lo snapshot.", + "feedback.snapshot.create.snapshot-new": "Nuova istantanea", + "feedback.snapshot.description": "Descrizione", + "feedback.snapshot.description.snapshot-description": "Descrizione dell'istantanea", + "feedback.snapshot.directory.browsing-not-supported": "L'esplorazione delle directory non è supportata in un browser Web. \nUtilizza l'interfaccia utente di Copia.", + "feedback.snapshot.directory.restore-all-files-help": "Puoi montare/ripristinare tutti i file e le directory che vedi di seguito o ripristinare i file individualmente.", + "feedback.snapshot.header.actions": "Azioni", + "feedback.snapshot.header.details": "Dettagli", + "feedback.snapshot.header.directories": "Dir", + "feedback.snapshot.header.files": "File", + "feedback.snapshot.header.last-snapshot": "Ultima istantanea", + "feedback.snapshot.header.next-snapshot": "Prossima istantanea", + "feedback.snapshot.header.retention": "Ritenzione", + "feedback.snapshot.header.root": "Radice", + "feedback.snapshot.header.selected": "Selezionato", + "feedback.snapshot.header.snapshot-owner": "Proprietario", + "feedback.snapshot.header.snapshot-path": "Percorso", + "feedback.snapshot.header.snapshot-size": "Misurare", + "feedback.snapshot.header.start-time": "Ora di inizio", + "feedback.snapshot.header.status": "Stato", + "feedback.snapshot.history.snapshot-displaying": "Visualizzazione", + "feedback.snapshot.history.wipe-all-snapshots": "Cancella tutti gli snapshot e la policy per questa origine.", + "feedback.snapshot.restore.continue-on-errors": "Continua in caso di errori", + "feedback.snapshot.restore.continue-on-errors-help": "Quando si verifica un errore durante il ripristino, prova a continuare invece di interrompere rapidamente.", + "feedback.snapshot.restore.destination": "Destinazione", + "feedback.snapshot.restore.destination-help": "Puoi anche ripristinare in un file .zip o .tar fornendo l'estensione appropriata.", + "feedback.snapshot.restore.destination-hint": "Inserisci il percorso di destinazione", + "feedback.snapshot.restore.disable-zip-compression": "Disabilita la compressione ZIP", + "feedback.snapshot.restore.disable-zip-compression-help": "Non comprimere quando si ripristina in un file ZIP (più veloce).", + "feedback.snapshot.restore.minimal-file-size-for-shallow-restore": "Dimensione minima del file per il ripristino superficiale", + "feedback.snapshot.restore.overwrite-directory": "Sovrascrivi le directory", + "feedback.snapshot.restore.overwrite-files": "Sovrascrivi i file", + "feedback.snapshot.restore.overwrite-symbolic-links": "Sovrascrivi i collegamenti simbolici", + "feedback.snapshot.restore.restore-file-modification-time": "Ripristina l'orario di modifica dei file", + "feedback.snapshot.restore.restore-file-ownership": "Ripristina la proprietà dei file", + "feedback.snapshot.restore.restore-file-permissions": "Ripristina i permessi dei file", + "feedback.snapshot.restore.shallow-restore-at-depth": "Ripristino superficiale a una profondità specifica", + "feedback.snapshot.restore.skip-previously-restored-files": "Salta i file e i collegamenti simbolici già ripristinati in precedenza", + "feedback.snapshot.restore.snapshot-restore": "Ripristina", + "feedback.snapshot.restore.write-files-atomically": "Scrivi i file atomicamente", + "feedback.snapshot.restore.write-sparse-files": "Scrivi file sparsi", + "feedback.snapshot.show-individual-snapshots-count": "feedback.snapshot.show-individual-snapshots-count", + "feedback.snapshot.show-individual-snapshots-count_one": "Mostra {{count}} istantanea individuale", + "feedback.snapshot.show-individual-snapshots-count_other": "Mostra {{count}} istantanee individuali", + "feedback.snapshot.start-after-previous-snapshot": "L'istantanea inizierà dopo il completamento dell'istantanea precedente", + "feedback.snapshot.status.status-overdue": "in ritardo", + "feedback.snapshot.status.status-pending": "In attesa", "feedback.tab.policies": "Politiche", "feedback.tab.preferences": "Preferenze", "feedback.tab.repository": "Repository", "feedback.tab.repository-is-not-connected": "Il repository non è connesso", "feedback.tab.snapshots": "Istantanee", "feedback.tab.tasks": "Attività", - "feedback.task.canceled-after": "Annullato dopo", - "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} escluso) Files: {{files}} ({{files.excluded}} escluso) Directories: {{directories}} ({{directories.excluded}} escluso) Errors: {{errors}} ({{errors.ignored}} ignorato)", - "feedback.task.failed-after": "Fallito dopo", - "feedback.task.finished-in": "Finito tra", - "feedback.task.running-for": "Correre per", - "feedback.task.total": "Totale", + "feedback.task.estimated-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} escluso) Files: {{files}} ({{files.excluded}} escluso) Directories: {{directories}} ({{directories.excluded}} escluso) Errors: {{errors}} ({{errors.ignored}} ignorato)", + "feedback.task.header.counter": "Contatore", + "feedback.task.header.value": "Valore", + "feedback.task.logs": "Log", + "feedback.task.no-tasks-help": "Un elenco di attività apparirà qui quando crei istantanee, ripristini, esegui manutenzione, ecc.", + "feedback.task.search-tasks-by-hint": "Cerca i registri delle attività in base alla descrizione", + "feedback.task.status.task-canceled": "Attività annullata", + "feedback.task.status.task-canceled-after": "Attività annullata dopo", + "feedback.task.status.task-canceling": "Annullamento in corso", + "feedback.task.status.task-error": "Errore nell'attività", + "feedback.task.status.task-failed-after": "Fallito dopo", + "feedback.task.status.task-finished": "Completata", + "feedback.task.status.task-finished-in": "Finito tra", + "feedback.task.status.task-running-for": "Attività in esecuzione da", + "feedback.task.status.task-started": "Avviata", + "feedback.task.status.task-succeeded-after": "Attività completata dopo", + "feedback.task.table.header-description": "Descrizione", + "feedback.task.table.header-kind": "Tipo", + "feedback.task.table.header-start-time": "Ora di inizio", + "feedback.task.table.header-status": "Stato", + "feedback.task.tasks-total": "Totale", "feedback.ui.appearance": "Aspetto", "feedback.ui.appearance-help": "Specifica l'aspetto dell'interfaccia utente", "feedback.ui.appearance-hint": "Seleziona la dimensione del carattere", @@ -224,225 +434,12 @@ "feedback.ui.theme-description": "Tema", "feedback.ui.theme-help": "Il tema attivo corrente", "feedback.ui.theme-select": "Seleziona il tema", - "feedback.validation.azure.access-key": "Chiave di accesso", - "feedback.validation.azure.access-key-hint": "Inserisci la chiave di accesso segreta", - "feedback.validation.azure.azure-storage-domain": "Dominio di archiviazione di Azure", - "feedback.validation.azure.azure-storage-domain-hint": "Inserisci il dominio di archiviazione o lascia vuoto il campo predefinito \"blob.core.windows.net\"", - "feedback.validation.azure.container": "Contenitore", - "feedback.validation.azure.container-hint": "Inserisci il nome del contenitore", - "feedback.validation.azure.object-name-prefix": "Prefisso nome oggetto", - "feedback.validation.azure.object-name-prefix-hint": "Inserisci il prefisso del nome dell'oggetto o lascia vuoto", - "feedback.validation.azure.sas-token": "Gettone SAS", - "feedback.validation.azure.sas-token-hint": "Inserisci il token SAS segreto", - "feedback.validation.azure.storage-account": "Conto di archiviazione", - "feedback.validation.azure.storage-account-hint": "Immettere il nome dell'account di archiviazione", - "feedback.validation.b2.bucket-name": "Benna B2", - "feedback.validation.b2.bucket-name-hint": "Inserisci il nome del bucket", - "feedback.validation.b2.key": "Chiave", - "feedback.validation.b2.key-hint": "Inserisci l'applicazione segreta o la chiave dell'account", - "feedback.validation.b2.key-id": "ID chiave", - "feedback.validation.b2.key-id-hint": "Inserisci l'ID della chiave dell'applicazione o dell'account", - "feedback.validation.b2.object-name-prefix": "Prefisso nome oggetto", - "feedback.validation.b2.object-name-prefix-hint": "Inserisci il prefisso del nome dell'oggetto o lascia vuoto", - "feedback.validation.gcs.bucket-name": "Benna GCS", - "feedback.validation.gcs.bucket-name-hint": "Inserisci il nome del bucket", - "feedback.validation.gcs.credentials-file": "File delle credenziali", - "feedback.validation.gcs.credentials-file-hint": "Immettere il nome del file JSON delle credenziali", - "feedback.validation.gcs.credentials-json": "Credenziali JSON", - "feedback.validation.gcs.credentials-json-paste": "Incolla qui le credenziali JSON", - "feedback.validation.gcs.object-name-prefix": "Prefisso nome oggetto", - "feedback.validation.gcs.object-name-prefix-hint": "Inserisci il prefisso del nome dell'oggetto o lascia vuoto", "feedback.validation.invalid-times-of-day": "Orari del giorno non validi", - "feedback.validation.local.directory-path": "Percorso della directory", - "feedback.validation.local.directory-path-hint": "Inserisci il percorso della directory in cui desideri archiviare i file del repository", "feedback.validation.optional.valid-number-or-empty": "Deve essere un numero valido o vuoto", "feedback.validation.passwords-dont-match": "Le password non corrispondono", - "feedback.validation.rclone.rclone-executable-path": "Percorso eseguibile Rclone", - "feedback.validation.rclone.rclone-executable-path-hint": "Immettere il percorso dell'eseguibile rclone", - "feedback.validation.rclone.rclone-remote-path": "Rclone percorso remoto", - "feedback.validation.rclone.rclone-remote-path-hint": "Inserisci :", - "feedback.validation.repository-server.server-address": "Indirizzo del server", - "feedback.validation.repository-server.server-address-hint": "Inserisci l'URL del server (https://:porta)", - "feedback.validation.repository-server.server-certificate-fingerprint": "Impronta digitale del certificato del server affidabile (SHA256)", - "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Inserisci l'impronta digitale del certificato del server attendibile stampata all'avvio del server", - "feedback.validation.repository-token.token": "Gettone", - "feedback.validation.repository-token.token-hint": "Incolla token di connessione", "feedback.validation.required.directory": "campo obbligatorio", "feedback.validation.required.field": "campo obbligatorio", - "feedback.validation.required.hostname": "Nome host", - "feedback.validation.required.hostname-hint": "Sostituiscilo quando ripristini uno snapshot acquisito su un altro computer", - "feedback.validation.required.password-repository": "Password dell'archivio", - "feedback.validation.required.password-repository-help": "Utilizzato per crittografare il contenuto del repository", - "feedback.validation.required.password-repository-hint": "Inserisci la password dell'archivio", - "feedback.validation.required.repository-password-confirm": "Conferma la password dell'archivio", - "feedback.validation.required.repository-password-confirm-again": "immettere nuovamente la password del repository", - "feedback.validation.required.server-password": "Password del server", - "feedback.validation.required.server-password-hint": "Inserisci la password per connetterti al server", - "feedback.validation.required.username": "Nome utente", - "feedback.validation.required.username-hint": "Sostituiscilo quando ripristini uno snapshot scattato da un altro utente", "feedback.validation.required.valid-number-or-empty": "Deve essere un numero valido o vuoto", - "feedback.validation.s3.access-key-id": "ID chiave di accesso", - "feedback.validation.s3.access-key-id-hint": "Immettere l'ID della chiave di accesso", - "feedback.validation.s3.bucket-name": "Secchio", - "feedback.validation.s3.bucket-name-hint": "Inserisci il nome del bucket", - "feedback.validation.s3.object-name-prefix": "Prefisso nome oggetto", - "feedback.validation.s3.override-region": "Sostituisci regione", - "feedback.validation.s3.override-region-hint": "Inserisci una regione specifica (ad esempio, us-west-1) o lascia vuoto", - "feedback.validation.s3.secret-access-key": "Chiave di accesso segreta", - "feedback.validation.s3.secret-access-key-hint": "Inserisci la chiave di accesso segreta", - "feedback.validation.s3.server-endpoint": "Punto finale del server", - "feedback.validation.s3.server-endpoint-hint": "Inserisci l'indirizzo del server (ad esempio, s3.amazonaws.com)", - "feedback.validation.s3.session-token": "Gettone di sessione", - "feedback.validation.s3.session-token-hint": "Inserisci il token della sessione o lascia vuoto", - "feedback.validation.webdav.password": "Parola d'ordine", - "feedback.validation.webdav.password-hint": "Inserire la password", - "feedback.validation.webdav.server-url": "URL del server WebDAV", - "feedback.validation.webdav.username": "Nome utente", - "feedback.validation.webdav.username-hint": "Inserire username", - "policies.feedback.find.count_one": "Trovata {{count}} policy corrispondente ai criteri", - "policies.feedback.find.count_other": "Trovate {{count}} politiche che corrispondono ai criteri", - "policies.feedback.find.none": "Nessuna politica trovata.", - "policies.feedback.find.none.create": "Nessuna policy trovata per la directory {{path}}. \nImposta una nuova policy.", - "policies.feedback.loading": "Caricamento ...", - "policies.feedback.path.absolute": "Le policy possono essere definite solo per percorsi assoluti.", - "policies.feedback.policy.find": "Inserisci la directory per trovare o impostare la policy", - "policies.kind.all": "Tutte le politiche", - "policies.kind.applicable": "Politiche applicabili", - "policies.kind.global": "Politiche globali", - "policies.kind.host": "Politiche per host", - "policies.kind.local": "Politiche locali", - "policies.kind.user": "Criteri per utente", - "repository.attribute.algorithm.eco": "Algoritmo di correzione degli errori", - "repository.attribute.algorithm.encryption": "Algoritmo di crittografia", - "repository.attribute.algorithm.hash": "Algoritmo di hash", - "repository.attribute.algorithm.splitter": "Algoritmo di suddivisione", - "repository.attribute.compression.internal": "Compressione interna", - "repository.attribute.config.file": "File di configurazione", - "repository.attribute.connected.as": "Connesso come", - "repository.attribute.eco": "Overhead di correzione degli errori", - "repository.attribute.format": "Formato del repository", - "repository.attribute.provider": "Provider", - "repository.attribute.server.url": "URL del server", - "repository.event.connection.cancel": "Annulla connessione", - "repository.event.connection.disconnect": "Disconnetti dal repository", - "repository.event.description.update": "Aggiorna descrizione", - "repository.feedback.compression.internal.not.supported": "no", - "repository.feedback.compression.internal.supported": "sì", - "repository.feedback.description.required": "La descrizione del repository è obbligatoria", - "repository.feedback.eco.disabled": "Disabilitato", - "repository.feedback.read.only": "Il repository è in sola lettura", - "repository.status.connected": "Connesso al repository", - "repository.status.initializing": "Inizializzazione del repository...", - "snapshot.event.create.estimate": "Stima", - "snapshot.event.create.now": "Scatta subito un'istantanea", - "snapshot.event.create.path": "Inserisci il percorso dello snapshot", - "snapshot.event.create.path.resolve": "È necessario specificare la directory in cui eseguire lo snapshot.", - "snapshot.event.delete.selected_one": "Vuoi eliminare lo snapshot {{count}} selezionato?", - "snapshot.event.delete.selected_other": "Vuoi eliminare le istantanee {{count}} selezionate?", - "snapshot.event.directory.browse": "Navigare", - "snapshot.event.directory.browsing": "L'esplorazione delle directory non è supportata in un browser Web. \nUtilizza l'interfaccia utente di Copia.", - "snapshot.event.directory.mount": "Monta come file system locale", - "snapshot.event.directory.restore": "Ripristina file e directory", - "snapshot.event.directory.unmount": "Smonta", - "snapshot.event.history.delete.source": "Elimina origine istantanea", - "snapshot.event.history.description.update": "{{description}}: fai clic per aggiornare la descrizione dell'istantanea.", - "snapshot.event.history.deselect.all": "Deselezionare tutto", - "snapshot.event.history.fetch.snapshots": "Recupera istantanee", - "snapshot.event.history.pin.add": "Aggiungi un segnaposto per proteggere l'istantanea dall'eliminazione", - "snapshot.event.history.select.all": "Seleziona tutto", - "snapshot.event.history.selected.delete": "Elimina selezionato (", - "snapshot.event.restore": "Ripristina", - "snapshot.event.restore.begin": "Inizia il ripristino", - "snapshot.event.snapshot.new": "Nuova Istantanea", - "snapshot.event.snapshot.pending": "In attesa", - "snapshot.event.snapshot.policy": "Politica", - "snapshot.event.synchronize": "Sincronizza", - "snapshot.feedback.directory.mount.restore": "Puoi montare/ripristinare tutti i file e le directory che vedi di seguito o ripristinare i file individualmente.", - "snapshot.feedback.history.display": "Visualizzazione", - "snapshot.feedback.history.wipe.all": "Cancella tutti gli snapshot e la policy per questa origine.", - "snapshot.feedback.restore.continue.errors": "Continua in caso di errori", - "snapshot.feedback.restore.continue.errors.help": "Quando si verifica un errore durante il ripristino, prova a continuare invece di interrompere rapidamente.", - "snapshot.feedback.restore.destination": "Destinazione", - "snapshot.feedback.restore.destination.help": "Puoi anche ripristinare in un file .zip o .tar fornendo l'estensione appropriata.", - "snapshot.feedback.restore.destination.path": "Inserisci il percorso di destinazione", - "snapshot.feedback.restore.directory.overwrite": "Sovrascrivi le directory", - "snapshot.feedback.restore.disable.compression.zip": "Disabilita la compressione ZIP", - "snapshot.feedback.restore.disable.compression.zip.help": "Non comprimere quando si ripristina in un file ZIP (più veloce).", - "snapshot.feedback.restore.file.atomically": "Scrivi i file atomicamente", - "snapshot.feedback.restore.file.modification.time": "Ripristina l'orario di modifica dei file", - "snapshot.feedback.restore.file.overwrite": "Sovrascrivi i file", - "snapshot.feedback.restore.file.ownership": "Ripristina la proprietà dei file", - "snapshot.feedback.restore.file.permission": "Ripristina i permessi dei file", - "snapshot.feedback.restore.file.sparse": "Scrivi file sparsi", - "snapshot.feedback.restore.link.overwrite": "Sovrascrivi i collegamenti simbolici", - "snapshot.feedback.restore.shallow.depth": "Ripristino superficiale a una profondità specifica", - "snapshot.feedback.restore.shallow.file.size.minimal": "Dimensione minima del file per il ripristino superficiale", - "snapshot.feedback.restore.skip": "Salta i file e i collegamenti simbolici già ripristinati in precedenza", - "snapshot.feedback.restore.task.go": "Vai a Ripristina attività", - "snapshot.feedback.snapshot.new": "Nuova istantanea", - "snapshot.feedback.snapshot.start": "L'istantanea inizierà dopo il completamento dell'istantanea precedente", - "snapshot.header.actions": "Azioni", - "snapshot.header.snapshot.last": "Ultima istantanea", - "snapshot.header.snapshot.next": "Prossima istantanea", - "snapshot.header.snapshot.owner": "Proprietario", - "snapshot.header.snapshot.path": "Percorso", - "snapshot.header.snapshot.size": "Dimensione", - "snapshot.header.status": "Stato", - "snapshot.history.feedack.unfiltered.count_one": "Mostra {{count}} istantanea individuale", - "snapshot.history.feedack.unfiltered.count_other": "Mostra {{count}} istantanee individuali", - "snapshot.history.header.description": "Descrizione", - "snapshot.history.header.directories": "Dir", - "snapshot.history.header.files": "File", - "snapshot.history.header.retention": "Ritenzione", - "snapshot.history.header.root": "Radice", - "snapshot.history.header.selected": "Selezionato", - "snapshot.history.header.size": "Misurare", - "snapshot.history.header.time.start": "Ora di inizio", - "task.all": "Tutte", - "task.event.stop": "Arresta", - "task.failed": "Fallite", - "task.feedback.entries": "Un elenco di attività apparirà qui quando crei istantanee, ripristini, esegui manutenzione, ecc.", - "task.feedback.search": "Cerca log per descrizione", - "task.header.counter": "Contatore", - "task.header.description": "Descrizione", - "task.header.kind": "Tipo", - "task.header.status": "Stato", - "task.header.time.start": "Ora di inizio", - "task.header.value": "Valore", - "task.loading": "Caricamento...", - "task.logs": "Log", - "task.running": "In esecuzione", - "task.status.canceled": "Attività annullata dopo", - "task.status.canceling": "Annullamento in corso", - "task.status.error": "Errore nell'attività", - "task.status.finished": "Completata", - "task.status.running.for": "Attività in esecuzione da", - "task.status.started": "Avviata", - "task.status.succeed.after": "Attività completata dopo", - "validation.password": "Parola d'ordine", - "validation.password-hint": "Inserire la password", - "validation.provider.external-ssh-command": "Avvia il comando SSH esterno senza password", - "validation.provider.external-ssh-command-hint": "Per impostazione predefinita Kopia si connette al server utilizzando il client SSH interno che supporta opzioni limitate. \nIn alternativa, può avviare un comando SSH esterno senza password, che supporta opzioni aggiuntive, ma generalmente è meno efficiente del client integrato.", - "validation.provider.host": "Ospite", - "validation.provider.host-hint": "nome host ssh (ad esempio, example.com)", - "validation.provider.key-data": "Dati chiave", - "validation.provider.key-data-hint": "Incolla il contenuto del file chiave", - "validation.provider.known-host-data": "Dati degli host conosciuti", - "validation.provider.known-host-data-hint": "Incolla il contenuto del fileknown_hosts", - "validation.provider.path": "Sentiero", - "validation.provider.path-hint": "Inserisci il percorso remoto del repository, ad esempio \"/mnt/data/repository\"", - "validation.provider.path-host-file": "Percorso del fileknown_hosts", - "validation.provider.path-host-file-hint": "Inserisci il percorso del fileknown_hosts", - "validation.provider.path-key-file": "Percorso del file chiave", - "validation.provider.path-key-file-hint": "Immettere il percorso del file chiave", - "validation.provider.port": "Porta", - "validation.provider.port-hint": "Numero di porta (ad esempio, 22)", - "validation.provider.ssh-arguments": "Argomenti SSH", - "validation.provider.ssh-arguments-hint": "Inserisci gli argomenti del comando SSH ('user@host -s sftp' verrà aggiunto automaticamente)", - "validation.provider.ssh-command": "Comando SSH", - "validation.provider.ssh-command-hint": "Fornire il comando SSH senza password da eseguire (in genere 'ssh')", - "validation.provider.user": "Utente", - "validation.provider.user-hint": "Nome utente", "value.algorithm.eco-disabled": "Disabilitato", "value.algorithm.suffix-not-recommended": "(NON CONSIGLIATO)", "value.algorithm.suffix-recommended": "(CONSIGLIATO)", @@ -458,8 +455,8 @@ "value.policy.optional": "Ignora i fallimenti", "value.provider.s3.http-connection-insecure": "Utilizza connessione HTTP (non sicura)", "value.provider.s3.no-tls-verification": "Non verificare il certificato TLS", - "value.repository.format.latest": "Ultimo formato", - "value.repository.format.legacy": "Formato legacy compatibile con v0.8", + "value.repository.latest-format": "Ultimo formato", + "value.repository.legacy-format": "Formato legacy compatibile con v0.8", "value.snapshot-frequency.10-minutes": "ogni 10 minuti", "value.snapshot-frequency.12-hours": "ogni 12 ore", "value.snapshot-frequency.15-minutes": "ogni 15 minuti", diff --git a/public/locales/jp/translation.json b/public/locales/jp/translation.json index 8ad2a6bf..c2da5c8e 100644 --- a/public/locales/jp/translation.json +++ b/public/locales/jp/translation.json @@ -1,52 +1,71 @@ { - "common.back": "Back", - "common.cancel": "キャンセル", - "common.click-here-to-learn-more": "Click here to learn more.", - "common.delete": "削除", - "common.delete-confirm": "Confirm Delete", - "common.loading": "Loading ...", - "common.next": "Next", - "common.return": "戻る", - "enter-object-name-prefix-or-leave-empty-hint": "Enter object name prefix or leave empty", + "common.action.back": "Back", + "common.action.cancel": "Cancel", + "common.action.click-here-to-learn-more": "Click here to learn more.", + "common.action.confirm-delete": "Confirm Delete", + "common.action.delete": "削除", + "common.action.next": "Next", + "common.action.return": "戻る", + "common.action.stop": "停止", + "common.label.loading": "読み込み中...", "event.cli.copy-to-clipboard": "Copy to clipboard", "event.cli.show-cli-equivalent": "Click to show CLI equivalent", - "event.description.cancel": "Cancel", - "event.description.new": "Enter new description", - "event.description.remove": "Remove Description", - "event.description.update": "Update Description", - "event.log.hide": "ログを非表示", - "event.log.show": "ログを表示", - "event.pin.add": "Add Pin", - "event.pin.cancel": "Cancel", - "event.pin.remove": "Remove Pin", - "event.pin.snapshot-pin": "Pin Snapshot", - "event.pin.update": "Update Pin", + "event.log.hide-log": "ログを非表示", + "event.log.show-log": "ログを表示", + "event.pin.add-pin": "Add Pin", + "event.pin.pin-snapshot": "Pin Snapshot", + "event.pin.remove-pin": "Remove Pin", + "event.pin.update-pin": "Update Pin", "event.policy.delete": "Delete policy", "event.policy.edit": "Edit", "event.policy.save": "Save policy", - "event.policy.set": "Set policy", - "event.repository.advanced-options-hide": "Hide Advanced Options", - "event.repository.advanced-options.show": "Show Advanced Options", + "event.policy.set-policy": "Set policy", + "event.repository.cancel-connection": "接続をキャンセル", "event.repository.connect-to-repository": "Connect to repository", "event.repository.create-repository": "Create repository", - "event.task.cancel": "Cancel task", - "feedback.description.modal-title": "Snapshot Description", + "event.repository.disconnect-from-repository": "リポジトリから切断", + "event.repository.hide-advanced-options": "Hide advanced options", + "event.repository.show-advanced-options": "Show Advanced Options", + "event.repository.update-description": "説明を更新", + "event.snapshot.browse-directory": "Browse", + "event.snapshot.delete-selected": "event.snapshot.delete-selected", + "event.snapshot.delete-selected_one": "Do you want to delete the selected {{count}} snapshot?", + "event.snapshot.delete-selected_other": "Do you want to delete the selected {{count}} snapshots?", + "event.snapshot.description.enter-new-description": "Enter new description", + "event.snapshot.description.remove-description": "Remove Description", + "event.snapshot.description.update-description": "Update Description", + "event.snapshot.estimate": "Estimate", + "event.snapshot.fetch-snapshots": "Fetch snapshots", + "event.snapshot.history.delete-selected": "Delete Selected ({{count}})", + "event.snapshot.history.delete-snapshot-source": "Delete Snapshot Source", + "event.snapshot.history.deselect-all": "Deselect All", + "event.snapshot.history.select-all-snapshots": "Select All", + "event.snapshot.history.update-snapshot-description": "{{description}} - Click to update snapshot description.", + "event.snapshot.mount-directory": "Mount as Local Filesystem", + "event.snapshot.new-snapshot": "新しいスナップショット", + "event.snapshot.restore-file-directories": "Restore files and directories", + "event.snapshot.restore.begin-restore": "復元を開始", + "event.snapshot.restore.go-to-restore-task": "Go To Restore Task", + "event.snapshot.show-policy": "ポリシー", + "event.snapshot.snapshot-now": "Snapshot now", + "event.snapshot.synchronize": "同期", + "event.snapshot.unmount-directory": "Unmount", + "event.task.action.cancel": "Cancel task", + "event.task.select.task-all": "すべて", + "event.task.select.task-failed": "失敗", + "event.task.select.task-running": "実行中", + "feedback.directory.header.directories": "Directories", + "feedback.directory.header.files": "Files", + "feedback.directory.header.last-modification": "Last Modification", + "feedback.directory.header.name": "Name", + "feedback.directory.header.size": "Size", "feedback.error.common": "Error", "feedback.error.connection": "Connect Error:", - "feedback.header.actions": "Actions", - "feedback.header.defined": "Defined", - "feedback.header.details": "Details", - "feedback.header.directories": "Directories", "feedback.header.effective": "Effective", - "feedback.header.files": "Files", - "feedback.header.host": "Host", - "feedback.header.modification-last": "Last Modification", - "feedback.header.name": "Name", - "feedback.header.path": "Path", - "feedback.header.size": "Size", "feedback.header.username": "Username", - "feedback.pin.name": "Name of the pin", - "feedback.pin.standard-text": "do-not-delete", + "feedback.pin.add-pin-to-protect": "Add a pin to protect snapshot from deletion", + "feedback.pin.do-not-delete": "do-not-delete", + "feedback.pin.name-of-the-pin": "Name of the pin", "feedback.policy.action.command-mode": "Command Mode", "feedback.policy.actions.after-folder": "After Folder", "feedback.policy.actions.after-folder-help": "Script to run after folder", @@ -97,16 +116,32 @@ "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignore directories containing CACHEDIR.TAG and similar", "feedback.policy.files.scan-only-one-filesystem": "Scan only one filesystem", "feedback.policy.files.scan-only-one-filesystem-help": "Do not cross filesystem boundaries when creating a snapshot", + "feedback.policy.find-count": "feedback.policy.find-count", + "feedback.policy.find-count_one": "Found {{count}} policy matching the criteria", + "feedback.policy.find-count_other": "Found {{count}} policies matching the criteria", + "feedback.policy.find-hint": "Enter directory to find or set policy", + "feedback.policy.find-none": "feedback.policy.find-none", + "feedback.policy.find-none-create": "No policy found for directory {{path}}. Please setup a new policy.", + "feedback.policy.header.actions": "Actions", "feedback.policy.header.compression": "Compression", + "feedback.policy.header.defined": "Defined", "feedback.policy.header.error-handling": "Error Handling", "feedback.policy.header.files": "Files", "feedback.policy.header.folder-actions": "Folder Actions", + "feedback.policy.header.host": "Host", "feedback.policy.header.logging": "Logging", "feedback.policy.header.other": "Other", + "feedback.policy.header.path": "Path", "feedback.policy.header.scheduling": "Scheduling", "feedback.policy.header.snapshot-action": "Snapshot Actions", "feedback.policy.header.snapshot-retention": "Snapshot Retention", "feedback.policy.header.upload": "Upload", + "feedback.policy.kind.all": "All policies", + "feedback.policy.kind.applicable": "Applicable policies", + "feedback.policy.kind.global": "Global policies", + "feedback.policy.kind.local": "Local policies", + "feedback.policy.kind.per-host-policies": "Per-Host policies", + "feedback.policy.kind.per-user-policies": "Per-User policies", "feedback.policy.logging.cache-hit": "Cache hit", "feedback.policy.logging.cache-hit-help": "Log verbosity when a cache is used instead of uploading the file", "feedback.policy.logging.cache-miss": "Cache miss", @@ -123,6 +158,7 @@ "feedback.policy.other.disable-parent-policy-evaluation-help": "Prevents any parent policies from affecting this directory and its subdirectories", "feedback.policy.other.json-representation": "JSON Representation", "feedback.policy.other.json-representation-help": "This is the internal representation of a policy", + "feedback.policy.policies-defined-by-path-absolute": "Policies can only be defined for absolute paths.", "feedback.policy.retention.annual-snapshot-retain": "Annual", "feedback.policy.retention.annual-snapshot-retain-help": "How many annual snapshots to retain per source. The latest snapshot from each calendar year will be retained", "feedback.policy.retention.annual-snapshot-retain-hint": "Number of annual snapshots", @@ -168,19 +204,113 @@ "feedback.policy.upload.maximum-parallel-snapshots-help": "Maximum number of snapshots that can be uploaded simultaneously", "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "max number of parallel snapshots", "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "must be specified using global, user, or host policy", + "feedback.prodiver.gcs.paste-json-credentials": "Paste JSON credentials here", "feedback.provider.azure-blob-storage": "Azure Blob Storage", + "feedback.provider.azure.access-key": "Access Key", + "feedback.provider.azure.azure-storage-domain": "Azure Storage Domain", + "feedback.provider.azure.container": "Container", + "feedback.provider.azure.enter-access-key": "Enter secret access key", + "feedback.provider.azure.enter-azure-storage-domain": "feedback.validation.azure.azure-storage-domain-hint", + "feedback.provider.azure.enter-container-name": "Enter container name", + "feedback.provider.azure.enter-object-name-prefix": "Enter object name prefix or leave empty", + "feedback.provider.azure.enter-sas-token": "Enter secret SAS Token", + "feedback.provider.azure.enter-storage-account": "Enter storage account name", + "feedback.provider.azure.object-name-prefix": "Object Name Prefix", + "feedback.provider.azure.sas-token": "SAS Token", + "feedback.provider.azure.storage-account": "Storage Account", + "feedback.provider.b2.bucket-name": "B2 Bucket", + "feedback.provider.b2.enter-account-key": "Enter secret application or account key", + "feedback.provider.b2.enter-account-key-id": "Enter application or account key ID", + "feedback.provider.b2.enter-bucket-name": "Enter bucket name", + "feedback.provider.b2.enter-object-name-prefix": "Enter object name prefix or leave empty", + "feedback.provider.b2.key": "Key", + "feedback.provider.b2.key-id": "Key ID", + "feedback.provider.b2.object-name-prefix": "Object Name Prefix", "feedback.provider.backblaze-b2": "Backblaze B2", + "feedback.provider.filesystem.directory-path": "Directory Path", + "feedback.provider.filesystem.enter-directory-path": "Enter directory path where you want to store repository files", + "feedback.provider.gcs.bucket-name": "GCS Bucket", + "feedback.provider.gcs.credentials-file": "Credentials File", + "feedback.provider.gcs.credentials-json": "Credentials JSON", + "feedback.provider.gcs.enter-bucket-name": "Enter bucket name", + "feedback.provider.gcs.enter-credentials-file-name": "Enter name of credentials JSON file", + "feedback.provider.gcs.enter-object-name-prefix": "Enter object name prefix or leave empty", + "feedback.provider.gcs.object-name-prefix": "Object Name Prefix", "feedback.provider.google-cloud-storage": "Google Cloud Storage", "feedback.provider.kopia-repository-server": "Kopia Repository Server", "feedback.provider.local-directory-or-nas": "Local Directory or NAS", "feedback.provider.rclone-remote": "Rclone Remote", + "feedback.provider.rclone.rclone-executable-path": "Rclone Executable Path", + "feedback.provider.rclone.rclone-executable-path-hint": "Enter path to rclone executable", + "feedback.provider.rclone.rclone-remote-path": "Rclone Remote Path", + "feedback.provider.rclone.rclone-remote-path-hint": "Enter :", + "feedback.provider.repositoryserver.enter-server-certificate-fingerprint": "Enter trusted server certificate fingerprint printed at server startup", + "feedback.provider.repositoryserver.enter-server-url": "Enter server URL (https://:port)", + "feedback.provider.repositoryserver.server-address": "Server address", + "feedback.provider.repositoryserver.server-certificate-fingerprint": "Trusted server certificate fingerprint (SHA256)", + "feedback.provider.repositorytoken.paste-token": "Paste connection token", + "feedback.provider.repositorytoken.token": "Token", "feedback.provider.required-either-key-file": "One of Password, Key File or Key Data is required.", "feedback.provider.required-either-known-host-data": "Either Known Hosts File or Known Hosts Data is required, but not both.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 or Compatible Storage", + "feedback.provider.s3.access-key-id": "Access Key ID", + "feedback.provider.s3.access-key-id-hint": "Enter access key ID", + "feedback.provider.s3.bucket-name": "Bucket", + "feedback.provider.s3.bucket-name-hint": "Enter bucket name", + "feedback.provider.s3.enter-object-name-prefix-hint": "Enter object name prefix or leave empty", + "feedback.provider.s3.object-name-prefix": "Object Name Prefix", + "feedback.provider.s3.override-region": "Override Region", + "feedback.provider.s3.override-region-hint": "Enter specific region (e.g., us-west-1) or leave empty", + "feedback.provider.s3.secret-access-key": "Secret Access Key", + "feedback.provider.s3.secret-access-key-hint": "Enter secret access key", + "feedback.provider.s3.server-endpoint": "Server Endpoint", + "feedback.provider.s3.server-endpoint-hint": "Enter server address (e.g., s3.amazonaws.com)", + "feedback.provider.s3.session-token": "Session Token", + "feedback.provider.s3.session-token-hint": "Enter session token or leave empty", + "feedback.provider.sftp-key-data": "Key Data", + "feedback.provider.sftp-key-data-hint": "Paste contents of the key file", "feedback.provider.sftp-server": "SFTP Server", + "feedback.provider.sftp.enter-password": "Enter password", + "feedback.provider.sftp.enter-path-host-file": "Enter path to the known_hosts file", + "feedback.provider.sftp.enter-path-to-key-file": "Enter path to the key file", + "feedback.provider.sftp.enter-remote-path": "Enter remote path to repository, e.g., '/mnt/data/repository'", + "feedback.provider.sftp.enter-ssh-arguments": "Enter SSH command arguments ('user@host -s sftp' will be appended automatically)", + "feedback.provider.sftp.enter-ssh-host-name": "ssh host name (e.g., example.com)", + "feedback.provider.sftp.host": "Host", + "feedback.provider.sftp.known-host-data": "Known Hosts Data", + "feedback.provider.sftp.launch-external-ssh-command": "Launch external password-less SSH command", + "feedback.provider.sftp.launch-external-ssh-command-hint": "By default Kopia connects to the server using internal SSH client which supports limited options. Alternatively it may launch external password-less SSH command, which supports additional options, but is generally less efficient than the built-in client.", + "feedback.provider.sftp.password": "Password", + "feedback.provider.sftp.paste-content-of-known-host": "Paste the contents of the known_hosts file", + "feedback.provider.sftp.path": "Path", + "feedback.provider.sftp.path-host-file": "Path to known_hosts file", + "feedback.provider.sftp.path-key-file": "Path to key file", + "feedback.provider.sftp.port": "Port", + "feedback.provider.sftp.port-number": "Port number (e.g., 22)", + "feedback.provider.sftp.provide-passwordless-ssh-command": "Provide the passwordless SSH command to execute (typically 'ssh')", + "feedback.provider.sftp.ssh-arguments": "SSH Arguments", + "feedback.provider.sftp.ssh-command": "SSH Command", + "feedback.provider.sftp.user": "User", + "feedback.provider.sftp.user-name": "User name", "feedback.provider.use-repository-token": "Use Repository Token", "feedback.provider.webdav-server": "WebDAV Server", + "feedback.provider.webdav.enter-password": "Enter password", + "feedback.provider.webdav.enter-username": "Enter username", + "feedback.provider.webdav.password": "Password", + "feedback.provider.webdav.server-url": "WebDAV Server URL", + "feedback.provider.webdav.username": "Username", "feedback.repository.additional-parameters-hint": "Additional parameters can be set when creating repository using command line.", + "feedback.repository.attribute.algorithm-eco": "エラー訂正アルゴリズム", + "feedback.repository.attribute.algorithm-encryption": "暗号化アルゴリズム", + "feedback.repository.attribute.algorithm-hash": "ハッシュアルゴリズム", + "feedback.repository.attribute.algorithm-splitter": "分割アルゴリズム", + "feedback.repository.attribute.config-file": "設定ファイル", + "feedback.repository.attribute.connected-as": "接続されたユーザー", + "feedback.repository.attribute.internal-compression": "内部圧縮", + "feedback.repository.attribute.repository-eco": "エラー訂正オーバーヘッド", + "feedback.repository.attribute.repository-format": "リポジトリの形式", + "feedback.repository.attribute.repository-provider": "プロバイダー", + "feedback.repository.attribute.server-url": "サーバーのURL", "feedback.repository.configuration": "Storage Configuration", "feedback.repository.connect-as": "Connect as", "feedback.repository.connect-in-read-only-mode": "Connect in read-only mode", @@ -188,8 +318,14 @@ "feedback.repository.connect-to-repository": "Connect to repository", "feedback.repository.create-repository-new": "Create New Repository", "feedback.repository.create-repository-new-help": "Enter a strong password to create Kopia repository in the provided storage.", + "feedback.repository.eco-disabled": "無効", "feedback.repository.eec-warning": "[EXPERIMENTAL] Error correction can help protect from certain kinds of data corruption due to spontaneous bit flips in the storage media.", "feedback.repository.encryption": "Encryption", + "feedback.repository.enter-repository-password": "Enter repository password", + "feedback.repository.hostname": "Hostname", + "feedback.repository.hostname-hint": "Override this when restoring a snapshot taken on another machine", + "feedback.repository.internal-compression-supported-no": "いいえ", + "feedback.repository.internal-compression-supported-yes": "はい", "feedback.repository.kopia-server-parameters": "Kopia Server Parameters", "feedback.repository.name-default": "My Repository", "feedback.repository.override-hint": "To override, click 'Show Advanced Options'", @@ -198,20 +334,94 @@ "feedback.repository.repository-description": "Repository description", "feedback.repository.repository-description-help": "Helps to distinguish between multiple connected repositories", "feedback.repository.repository-description-hint": "Enter repository description", + "feedback.repository.repository-description-required": "リポジトリの説明は必須です", + "feedback.repository.repository-initializing": "リポジトリの初期化中...", + "feedback.repository.repository-is-read-only": "リポジトリは読み取り専用です", + "feedback.repository.repository-password": "Repository Password", + "feedback.repository.repository-password-confirm": "Confirm Repository Password", + "feedback.repository.repository-password-confirm-again": "enter repository password again", + "feedback.repository.repository-password-help": "Used to encrypt the repository's contents", "feedback.repository.repository-token-enter": "Enter Repository Token", - "feedback.snapshot.status.overdue": "overdue", + "feedback.repository.server-password": "Server password", + "feedback.repository.server-password-hint": "Enter password to connect to server", + "feedback.repository.status-connected": "リポジトリに接続済み", + "feedback.repository.username": "Username", + "feedback.repository.username-hint": "Override this when restoring a snapshot taken by another user", + "feedback.snapshot.create.enter-path-to-snapshot-hint": "Enter path to snapshot", + "feedback.snapshot.create.must-specify-path": "Must specify directory to snapshot.", + "feedback.snapshot.create.snapshot-new": "New Snapshot", + "feedback.snapshot.description": "Description", + "feedback.snapshot.description.snapshot-description": "Snapshot Description", + "feedback.snapshot.directory.browsing-not-supported": "Directory browsing is not supported in a web browser. Use Kopia UI.", + "feedback.snapshot.directory.restore-all-files-help": "You can mount/restore all the files and directories that you see below or restore files individually.", + "feedback.snapshot.header.actions": "アクション", + "feedback.snapshot.header.details": "Details", + "feedback.snapshot.header.directories": "Dirs", + "feedback.snapshot.header.files": "Files", + "feedback.snapshot.header.last-snapshot": "最後のスナップショット", + "feedback.snapshot.header.next-snapshot": "次のスナップショット", + "feedback.snapshot.header.retention": "Retention", + "feedback.snapshot.header.root": "Root", + "feedback.snapshot.header.selected": "Selected", + "feedback.snapshot.header.snapshot-owner": "オーナー", + "feedback.snapshot.header.snapshot-path": "パス", + "feedback.snapshot.header.snapshot-size": "Size", + "feedback.snapshot.header.start-time": "Start time", + "feedback.snapshot.header.status": "ステータス", + "feedback.snapshot.history.snapshot-displaying": "Displaying", + "feedback.snapshot.history.wipe-all-snapshots": "Wipe all snapshots and the policy for this source.", + "feedback.snapshot.restore.continue-on-errors": "エラーが発生した場合に続行", + "feedback.snapshot.restore.continue-on-errors-help": "復元エラーが発生した場合、即座に失敗せずに続行を試みます。", + "feedback.snapshot.restore.destination": "宛先", + "feedback.snapshot.restore.destination-help": "適切な拡張子を指定することで、.zipまたは.tarファイルにも復元できます。", + "feedback.snapshot.restore.destination-hint": "宛先パスを入力", + "feedback.snapshot.restore.disable-zip-compression": "ZIP圧縮を無効にする", + "feedback.snapshot.restore.disable-zip-compression-help": "ZIPファイルへの復元時に圧縮しない(高速)。", + "feedback.snapshot.restore.minimal-file-size-for-shallow-restore": "浅い復元の最小ファイルサイズ", + "feedback.snapshot.restore.overwrite-directory": "ディレクトリを上書き", + "feedback.snapshot.restore.overwrite-files": "ファイルを上書き", + "feedback.snapshot.restore.overwrite-symbolic-links": "シンボリックリンクを上書き", + "feedback.snapshot.restore.restore-file-modification-time": "ファイルの変更時刻を復元", + "feedback.snapshot.restore.restore-file-ownership": "ファイル所有権を復元", + "feedback.snapshot.restore.restore-file-permissions": "ファイルのアクセス権を復元", + "feedback.snapshot.restore.shallow-restore-at-depth": "指定の深さで浅い復元", + "feedback.snapshot.restore.skip-previously-restored-files": "以前に復元されたファイルとシンボリックリンクをスキップ", + "feedback.snapshot.restore.snapshot-restore": "復元", + "feedback.snapshot.restore.write-files-atomically": "ファイルをアトミックに書き込む", + "feedback.snapshot.restore.write-sparse-files": "スパースファイルを書き込む", + "feedback.snapshot.show-individual-snapshots-count": "feedback.snapshot.show-individual-snapshots-count", + "feedback.snapshot.show-individual-snapshots-count_one": "Show {{count}} individual snapshot", + "feedback.snapshot.show-individual-snapshots-count_other": "Show {{count}} individual snapshots", + "feedback.snapshot.start-after-previous-snapshot": "前のスナップショットが完了した後にスナップショットが開始されます", + "feedback.snapshot.status.status-overdue": "overdue", + "feedback.snapshot.status.status-pending": "保留中", "feedback.tab.policies": "ポリシー", "feedback.tab.preferences": "設定", "feedback.tab.repository": "リポジトリ", "feedback.tab.repository-is-not-connected": "Repository is not connected", "feedback.tab.snapshots": "スナップショット", "feedback.tab.tasks": "タスク", - "feedback.task.canceled-after": "Canceled after", - "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} excluded) Files: {{files}} ({{files.excluded}} excluded) Directories: {{directories}} ({{directories.excluded}} excluded) Errors: {{errors}} ({{errors.ignored}} ignored)", - "feedback.task.failed-after": "Failed after", - "feedback.task.finished-in": "Finished in", - "feedback.task.running-for": "Running for", - "feedback.task.total": "Total", + "feedback.task.estimated-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} excluded) Files: {{files}} ({{files.excluded}} excluded) Directories: {{directories}} ({{directories.excluded}} excluded) Errors: {{errors}} ({{errors.ignored}} ignored)", + "feedback.task.header.counter": "カウンター", + "feedback.task.header.value": "値", + "feedback.task.logs": "ログ", + "feedback.task.no-tasks-help": "スナップショットを作成したり、復元したり、メンテナンスを実行したりすると、ここにタスクの一覧が表示されます。", + "feedback.task.search-tasks-by-hint": "Search task logs by description", + "feedback.task.status.task-canceled": "Task canceled", + "feedback.task.status.task-canceled-after": "Task canceled after", + "feedback.task.status.task-canceling": "キャンセル中", + "feedback.task.status.task-error": "タスクエラー", + "feedback.task.status.task-failed-after": "Failed after", + "feedback.task.status.task-finished": "完了済み", + "feedback.task.status.task-finished-in": "Finished in", + "feedback.task.status.task-running-for": "タスク実行中", + "feedback.task.status.task-started": "開始済み", + "feedback.task.status.task-succeeded-after": "タスクは成功しました。", + "feedback.task.table.header-description": "説明", + "feedback.task.table.header-kind": "種類", + "feedback.task.table.header-start-time": "開始時刻", + "feedback.task.table.header-status": "ステータス", + "feedback.task.tasks-total": "Total", "feedback.ui.appearance": "外観", "feedback.ui.appearance-help": "ユーザーインターフェースの外観を指定します", "feedback.ui.appearance-hint": "フォントサイズを選択", @@ -224,225 +434,12 @@ "feedback.ui.theme-description": "テーマ", "feedback.ui.theme-help": "現在のアクティブなテーマ", "feedback.ui.theme-select": "テーマを選択", - "feedback.validation.azure.access-key": "Access Key", - "feedback.validation.azure.access-key-hint": "Enter secret access key", - "feedback.validation.azure.azure-storage-domain": "Azure Storage Domain", - "feedback.validation.azure.azure-storage-domain-hint": "feedback.validation.azure.azure-storage-domain-hint", - "feedback.validation.azure.container": "Container", - "feedback.validation.azure.container-hint": "Enter container name", - "feedback.validation.azure.object-name-prefix": "Object Name Prefix", - "feedback.validation.azure.object-name-prefix-hint": "Enter object name prefix or leave empty", - "feedback.validation.azure.sas-token": "SAS Token", - "feedback.validation.azure.sas-token-hint": "Enter secret SAS Token", - "feedback.validation.azure.storage-account": "Storage Account", - "feedback.validation.azure.storage-account-hint": "Enter storage account name", - "feedback.validation.b2.bucket-name": "B2 Bucket", - "feedback.validation.b2.bucket-name-hint": "Enter bucket name", - "feedback.validation.b2.key": "Key", - "feedback.validation.b2.key-hint": "Enter secret application or account key", - "feedback.validation.b2.key-id": "Key ID", - "feedback.validation.b2.key-id-hint": "Enter application or account key ID", - "feedback.validation.b2.object-name-prefix": "Object Name Prefix", - "feedback.validation.b2.object-name-prefix-hint": "Enter object name prefix or leave empty", - "feedback.validation.gcs.bucket-name": "GCS Bucket", - "feedback.validation.gcs.bucket-name-hint": "Enter bucket name", - "feedback.validation.gcs.credentials-file": "Credentials File", - "feedback.validation.gcs.credentials-file-hint": "Enter name of credentials JSON file", - "feedback.validation.gcs.credentials-json": "Credentials JSON", - "feedback.validation.gcs.credentials-json-paste": "Paste JSON credentials here", - "feedback.validation.gcs.object-name-prefix": "Object Name Prefix", - "feedback.validation.gcs.object-name-prefix-hint": "Enter object name prefix or leave empty", "feedback.validation.invalid-times-of-day": "Invalid Times of Day", - "feedback.validation.local.directory-path": "Directory Path", - "feedback.validation.local.directory-path-hint": "Enter directory path where you want to store repository files", "feedback.validation.optional.valid-number-or-empty": "Must be a valid number or empty", "feedback.validation.passwords-dont-match": "Passwords don't match", - "feedback.validation.rclone.rclone-executable-path": "Rclone Executable Path", - "feedback.validation.rclone.rclone-executable-path-hint": "Enter path to rclone executable", - "feedback.validation.rclone.rclone-remote-path": "Rclone Remote Path", - "feedback.validation.rclone.rclone-remote-path-hint": "Enter :", - "feedback.validation.repository-server.server-address": "Server address", - "feedback.validation.repository-server.server-address-hint": "Enter server URL (https://:port)", - "feedback.validation.repository-server.server-certificate-fingerprint": "Trusted server certificate fingerprint (SHA256)", - "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Enter trusted server certificate fingerprint printed at server startup", - "feedback.validation.repository-token.token": "Token", - "feedback.validation.repository-token.token-hint": "Paste connection token", "feedback.validation.required.directory": "Required field", "feedback.validation.required.field": "Required field", - "feedback.validation.required.hostname": "Hostname", - "feedback.validation.required.hostname-hint": "Override this when restoring a snapshot taken on another machine", - "feedback.validation.required.password-repository": "Repository Password", - "feedback.validation.required.password-repository-help": "Used to encrypt the repository's contents", - "feedback.validation.required.password-repository-hint": "Enter repository password", - "feedback.validation.required.repository-password-confirm": "Confirm Repository Password", - "feedback.validation.required.repository-password-confirm-again": "enter repository password again", - "feedback.validation.required.server-password": "Server password", - "feedback.validation.required.server-password-hint": "Enter password to connect to server", - "feedback.validation.required.username": "Username", - "feedback.validation.required.username-hint": "Override this when restoring a snapshot taken by another user", "feedback.validation.required.valid-number-or-empty": "Must be a valid number or empty", - "feedback.validation.s3.access-key-id": "Access Key ID", - "feedback.validation.s3.access-key-id-hint": "Enter access key ID", - "feedback.validation.s3.bucket-name": "Bucket", - "feedback.validation.s3.bucket-name-hint": "Enter bucket name", - "feedback.validation.s3.object-name-prefix": "Object Name Prefix", - "feedback.validation.s3.override-region": "Override Region", - "feedback.validation.s3.override-region-hint": "Enter specific region (e.g., us-west-1) or leave empty", - "feedback.validation.s3.secret-access-key": "Secret Access Key", - "feedback.validation.s3.secret-access-key-hint": "Enter secret access key", - "feedback.validation.s3.server-endpoint": "Server Endpoint", - "feedback.validation.s3.server-endpoint-hint": "Enter server address (e.g., s3.amazonaws.com)", - "feedback.validation.s3.session-token": "Session Token", - "feedback.validation.s3.session-token-hint": "Enter session token or leave empty", - "feedback.validation.webdav.password": "Password", - "feedback.validation.webdav.password-hint": "Enter password", - "feedback.validation.webdav.server-url": "WebDAV Server URL", - "feedback.validation.webdav.username": "Username", - "feedback.validation.webdav.username-hint": "Enter username", - "policies.feedback.find.count_one": "Found {{count}} policy matching the criteria", - "policies.feedback.find.count_other": "Found {{count}} policies matching the criteria", - "policies.feedback.find.none": "No policies found.", - "policies.feedback.find.none.create": "No policy found for directory {{path}}. Please setup a new policy.", - "policies.feedback.loading": "Loading ...", - "policies.feedback.path.absolute": "Policies can only be defined for absolute paths.", - "policies.feedback.policy.find": "Enter directory to find or set policy", - "policies.kind.all": "All policies", - "policies.kind.applicable": "Applicable policies", - "policies.kind.global": "Global policies", - "policies.kind.host": "Per-Host policies", - "policies.kind.local": "Local policies", - "policies.kind.user": "Per-User policies", - "repository.attribute.algorithm.eco": "エラー訂正アルゴリズム", - "repository.attribute.algorithm.encryption": "暗号化アルゴリズム", - "repository.attribute.algorithm.hash": "ハッシュアルゴリズム", - "repository.attribute.algorithm.splitter": "分割アルゴリズム", - "repository.attribute.compression.internal": "内部圧縮", - "repository.attribute.config.file": "設定ファイル", - "repository.attribute.connected.as": "接続されたユーザー", - "repository.attribute.eco": "エラー訂正オーバーヘッド", - "repository.attribute.format": "リポジトリの形式", - "repository.attribute.provider": "プロバイダー", - "repository.attribute.server.url": "サーバーのURL", - "repository.event.connection.cancel": "接続をキャンセル", - "repository.event.connection.disconnect": "リポジトリから切断", - "repository.event.description.update": "説明を更新", - "repository.feedback.compression.internal.not.supported": "いいえ", - "repository.feedback.compression.internal.supported": "はい", - "repository.feedback.description.required": "リポジトリの説明は必須です", - "repository.feedback.eco.disabled": "無効", - "repository.feedback.read.only": "リポジトリは読み取り専用です", - "repository.status.connected": "リポジトリに接続済み", - "repository.status.initializing": "リポジトリの初期化中...", - "snapshot.event.create.estimate": "Estimate", - "snapshot.event.create.now": "Snapshot now", - "snapshot.event.create.path": "Enter path to snapshot", - "snapshot.event.create.path.resolve": "Must specify directory to snapshot.", - "snapshot.event.delete.selected_one": "Do you want to delete the selected {{count}} snapshot?", - "snapshot.event.delete.selected_other": "Do you want to delete the selected {{count}} snapshots?", - "snapshot.event.directory.browse": "Browse", - "snapshot.event.directory.browsing": "Directory browsing is not supported in a web browser. Use Kopia UI.", - "snapshot.event.directory.mount": "Mount as Local Filesystem", - "snapshot.event.directory.restore": "Restore files and directories", - "snapshot.event.directory.unmount": "Unmount", - "snapshot.event.history.delete.source": "Delete Snapshot Source", - "snapshot.event.history.description.update": "{{description}} - Click to update snapshot description.", - "snapshot.event.history.deselect.all": "Deselect All", - "snapshot.event.history.fetch.snapshots": "Fetch snapshots", - "snapshot.event.history.pin.add": "Add a pin to protect snapshot from deletion", - "snapshot.event.history.select.all": "Select All", - "snapshot.event.history.selected.delete": "Delete Selected (", - "snapshot.event.restore": "復元", - "snapshot.event.restore.begin": "復元を開始", - "snapshot.event.snapshot.new": "新しいスナップショット", - "snapshot.event.snapshot.pending": "保留中", - "snapshot.event.snapshot.policy": "ポリシー", - "snapshot.event.synchronize": "同期", - "snapshot.feedback.directory.mount.restore": "You can mount/restore all the files and directories that you see below or restore files individually.", - "snapshot.feedback.history.display": "Displaying", - "snapshot.feedback.history.wipe.all": "Wipe all snapshots and the policy for this source.", - "snapshot.feedback.restore.continue.errors": "エラーが発生した場合に続行", - "snapshot.feedback.restore.continue.errors.help": "復元エラーが発生した場合、即座に失敗せずに続行を試みます。", - "snapshot.feedback.restore.destination": "宛先", - "snapshot.feedback.restore.destination.help": "適切な拡張子を指定することで、.zipまたは.tarファイルにも復元できます。", - "snapshot.feedback.restore.destination.path": "宛先パスを入力", - "snapshot.feedback.restore.directory.overwrite": "ディレクトリを上書き", - "snapshot.feedback.restore.disable.compression.zip": "ZIP圧縮を無効にする", - "snapshot.feedback.restore.disable.compression.zip.help": "ZIPファイルへの復元時に圧縮しない(高速)。", - "snapshot.feedback.restore.file.atomically": "ファイルをアトミックに書き込む", - "snapshot.feedback.restore.file.modification.time": "ファイルの変更時刻を復元", - "snapshot.feedback.restore.file.overwrite": "ファイルを上書き", - "snapshot.feedback.restore.file.ownership": "ファイル所有権を復元", - "snapshot.feedback.restore.file.permission": "ファイルのアクセス権を復元", - "snapshot.feedback.restore.file.sparse": "スパースファイルを書き込む", - "snapshot.feedback.restore.link.overwrite": "シンボリックリンクを上書き", - "snapshot.feedback.restore.shallow.depth": "指定の深さで浅い復元", - "snapshot.feedback.restore.shallow.file.size.minimal": "浅い復元の最小ファイルサイズ", - "snapshot.feedback.restore.skip": "以前に復元されたファイルとシンボリックリンクをスキップ", - "snapshot.feedback.restore.task.go": "Go To Restore Task", - "snapshot.feedback.snapshot.new": "New Snapshot", - "snapshot.feedback.snapshot.start": "前のスナップショットが完了した後にスナップショットが開始されます", - "snapshot.header.actions": "アクション", - "snapshot.header.snapshot.last": "最後のスナップショット", - "snapshot.header.snapshot.next": "次のスナップショット", - "snapshot.header.snapshot.owner": "オーナー", - "snapshot.header.snapshot.path": "パス", - "snapshot.header.snapshot.size": "サイズ", - "snapshot.header.status": "ステータス", - "snapshot.history.feedack.unfiltered.count_one": "Show {{count}} individual snapshot", - "snapshot.history.feedack.unfiltered.count_other": "Show {{count}} individual snapshots", - "snapshot.history.header.description": "Description", - "snapshot.history.header.directories": "Dirs", - "snapshot.history.header.files": "Files", - "snapshot.history.header.retention": "Retention", - "snapshot.history.header.root": "Root", - "snapshot.history.header.selected": "Selected", - "snapshot.history.header.size": "Size", - "snapshot.history.header.time.start": "Start time", - "task.all": "すべて", - "task.event.stop": "停止", - "task.failed": "失敗", - "task.feedback.entries": "スナップショットを作成したり、復元したり、メンテナンスを実行したりすると、ここにタスクの一覧が表示されます。", - "task.feedback.search": "説明でログを検索", - "task.header.counter": "カウンター", - "task.header.description": "説明", - "task.header.kind": "種類", - "task.header.status": "ステータス", - "task.header.time.start": "開始時刻", - "task.header.value": "値", - "task.loading": "読み込み中...", - "task.logs": "ログ", - "task.running": "実行中", - "task.status.canceled": "タスクはキャンセルされました。", - "task.status.canceling": "キャンセル中", - "task.status.error": "タスクエラー", - "task.status.finished": "完了済み", - "task.status.running.for": "タスク実行中", - "task.status.started": "開始済み", - "task.status.succeed.after": "タスクは成功しました。", - "validation.password": "Password", - "validation.password-hint": "Enter password", - "validation.provider.external-ssh-command": "Launch external password-less SSH command", - "validation.provider.external-ssh-command-hint": "By default Kopia connects to the server using internal SSH client which supports limited options. Alternatively it may launch external password-less SSH command, which supports additional options, but is generally less efficient than the built-in client.", - "validation.provider.host": "Host", - "validation.provider.host-hint": "ssh host name (e.g., example.com)", - "validation.provider.key-data": "Key Data", - "validation.provider.key-data-hint": "Paste contents of the key file", - "validation.provider.known-host-data": "Known Hosts Data", - "validation.provider.known-host-data-hint": "Paste the contents of the known_hosts file", - "validation.provider.path": "Path", - "validation.provider.path-hint": "Enter remote path to repository, e.g., '/mnt/data/repository'", - "validation.provider.path-host-file": "Path to known_hosts file", - "validation.provider.path-host-file-hint": "Enter path to the known_hosts file", - "validation.provider.path-key-file": "Path to key file", - "validation.provider.path-key-file-hint": "Enter path to the key file", - "validation.provider.port": "Port", - "validation.provider.port-hint": "Port number (e.g., 22)", - "validation.provider.ssh-arguments": "SSH Arguments", - "validation.provider.ssh-arguments-hint": "Enter SSH command arguments ('user@host -s sftp' will be appended automatically)", - "validation.provider.ssh-command": "SSH Command", - "validation.provider.ssh-command-hint": "Provide the passwordless SSH command to execute (typically 'ssh')", - "validation.provider.user": "User", - "validation.provider.user-hint": "User name", "value.algorithm.eco-disabled": "Disabled", "value.algorithm.suffix-not-recommended": "(NOT RECOMMENDED)", "value.algorithm.suffix-recommended": "(RECOMMENDED)", @@ -458,8 +455,8 @@ "value.policy.optional": "Ignore failures", "value.provider.s3.http-connection-insecure": "Use HTTP connection (insecure)", "value.provider.s3.no-tls-verification": "Do not verify TLS certificate", - "value.repository.format.latest": "Latest format", - "value.repository.format.legacy": "Legacy format compatible with v0.8", + "value.repository.latest-format": "Latest format", + "value.repository.legacy-format": "Legacy format compatible with v0.8", "value.snapshot-frequency.10-minutes": "every 10 minutes", "value.snapshot-frequency.12-hours": "every 12 hours", "value.snapshot-frequency.15-minutes": "every 15 minutes", diff --git a/public/locales/pl/translation.json b/public/locales/pl/translation.json index 06a11726..b84afba2 100644 --- a/public/locales/pl/translation.json +++ b/public/locales/pl/translation.json @@ -1,52 +1,71 @@ { - "common.back": "Z powrotem", - "common.cancel": "Anulować", - "common.click-here-to-learn-more": "Kliknij tutaj, aby dowiedzieć się więcej.", - "common.delete": "Usuwać", - "common.delete-confirm": "Potwierdź usunięcie", - "common.loading": "Ładowanie ...", - "common.next": "Następny", - "common.return": "Wróć", - "enter-object-name-prefix-or-leave-empty-hint": "Wprowadź przedrostek nazwy obiektu lub pozostaw puste", + "common.action.back": "Z powrotem", + "common.action.cancel": "Anulować", + "common.action.click-here-to-learn-more": "Kliknij tutaj, aby dowiedzieć się więcej.", + "common.action.confirm-delete": "Potwierdź usunięcie", + "common.action.delete": "Usuwać", + "common.action.next": "Następny", + "common.action.return": "Wróć", + "common.action.stop": "Zatrzymaj", + "common.label.loading": "Wczytywanie...", "event.cli.copy-to-clipboard": "Skopiuj do schowka", "event.cli.show-cli-equivalent": "Kliknij, aby wyświetlić odpowiednik CLI", - "event.description.cancel": "Anulować", - "event.description.new": "Wprowadź nowy opis", - "event.description.remove": "Usuń opis", - "event.description.update": "Aktualizuj opis", - "event.log.hide": "Schowaj log", - "event.log.show": "Pokaż log", - "event.pin.add": "Dodaj Pin", - "event.pin.cancel": "Anulować", - "event.pin.remove": "Usuń pinezkę", - "event.pin.snapshot-pin": "Przypnij migawkę", - "event.pin.update": "Zaktualizuj Pin", + "event.log.hide-log": "Schowaj log", + "event.log.show-log": "Pokaż log", + "event.pin.add-pin": "Dodaj Pin", + "event.pin.pin-snapshot": "Przypnij migawkę", + "event.pin.remove-pin": "Usuń pinezkę", + "event.pin.update-pin": "Zaktualizuj Pin", "event.policy.delete": "Usuń politykę", "event.policy.edit": "Edytować", "event.policy.save": "Zapisz politykę", - "event.policy.set": "Ustaw politykę", - "event.repository.advanced-options-hide": "Ukryj opcje zaawansowane", - "event.repository.advanced-options.show": "Pokaż ustawienia zaawansowane", + "event.policy.set-policy": "Ustaw politykę", + "event.repository.cancel-connection": "Przerwij próbę połączenia", "event.repository.connect-to-repository": "Połącz się z repozytorium", "event.repository.create-repository": "Utwórz repozytorium", - "event.task.cancel": "Anuluj zadanie", - "feedback.description.modal-title": "Opis migawki", + "event.repository.disconnect-from-repository": "Odłącz od repozytorium", + "event.repository.hide-advanced-options": "Ukryj opcje zaawansowane", + "event.repository.show-advanced-options": "Pokaż ustawienia zaawansowane", + "event.repository.update-description": "Zmień opis", + "event.snapshot.browse-directory": "Przeglądać", + "event.snapshot.delete-selected": "event.snapshot.delete-selected", + "event.snapshot.delete-selected_one": "Czy chcesz usunąć wybraną migawkę {{count}}?", + "event.snapshot.delete-selected_other": "Czy chcesz usunąć wybrane migawki ({{count}})?", + "event.snapshot.description.enter-new-description": "Wprowadź nowy opis", + "event.snapshot.description.remove-description": "Usuń opis", + "event.snapshot.description.update-description": "Aktualizuj opis", + "event.snapshot.estimate": "Oszacować", + "event.snapshot.fetch-snapshots": "Pobieraj migawki", + "event.snapshot.history.delete-selected": "Usuń wybrane ({{count}})", + "event.snapshot.history.delete-snapshot-source": "Usuń źródło migawki", + "event.snapshot.history.deselect-all": "Odznacz wszystkie", + "event.snapshot.history.select-all-snapshots": "Zaznacz wszystko", + "event.snapshot.history.update-snapshot-description": "{{description}} - Kliknij, aby zaktualizować opis migawki.", + "event.snapshot.mount-directory": "Zamontuj jako lokalny system plików", + "event.snapshot.new-snapshot": "Nowy zrzut ekranu", + "event.snapshot.restore-file-directories": "Przywróć pliki i katalogi", + "event.snapshot.restore.begin-restore": "Rozpocznij przywracanie", + "event.snapshot.restore.go-to-restore-task": "Przejdź do przywracania zadania", + "event.snapshot.show-policy": "Polityka", + "event.snapshot.snapshot-now": "Zrzut ekranu teraz", + "event.snapshot.synchronize": "Synchronizować", + "event.snapshot.unmount-directory": "Odmontuj", + "event.task.action.cancel": "Anuluj zadanie", + "event.task.select.task-all": "wszystkie", + "event.task.select.task-failed": "nieudane", + "event.task.select.task-running": "w toku", + "feedback.directory.header.directories": "Katalogi", + "feedback.directory.header.files": "Akta", + "feedback.directory.header.last-modification": "Ostatnia modyfikacja", + "feedback.directory.header.name": "Nazwa", + "feedback.directory.header.size": "Rozmiar", "feedback.error.common": "Błąd", "feedback.error.connection": "Błąd połączenia:", - "feedback.header.actions": "działania", - "feedback.header.defined": "Zdefiniowane", - "feedback.header.details": "Detale", - "feedback.header.directories": "Katalogi", "feedback.header.effective": "Skuteczny", - "feedback.header.files": "Akta", - "feedback.header.host": "Gospodarz", - "feedback.header.modification-last": "Ostatnia modyfikacja", - "feedback.header.name": "Nazwa", - "feedback.header.path": "Ścieżka", - "feedback.header.size": "Rozmiar", "feedback.header.username": "Nazwa użytkownika", - "feedback.pin.name": "Nazwa pinu", - "feedback.pin.standard-text": "nie kasuj", + "feedback.pin.add-pin-to-protect": "Dodaj pinezkę, aby zabezpieczyć migawkę przed usunięciem", + "feedback.pin.do-not-delete": "nie kasuj", + "feedback.pin.name-of-the-pin": "Nazwa pinu", "feedback.policy.action.command-mode": "Tryb poleceń", "feedback.policy.actions.after-folder": "Po folderze", "feedback.policy.actions.after-folder-help": "Skrypt uruchamiany po folderze", @@ -97,16 +116,32 @@ "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignoruj ​​katalogi zawierające CACHEDIR.TAG i podobne", "feedback.policy.files.scan-only-one-filesystem": "Skanuj tylko jeden system plików", "feedback.policy.files.scan-only-one-filesystem-help": "Podczas tworzenia migawki nie przekraczaj granic systemu plików", + "feedback.policy.find-count": "feedback.policy.find-count", + "feedback.policy.find-count_one": "Znaleziono {{count}} zasad spełniających kryteria", + "feedback.policy.find-count_other": "Znaleziono {{count}} zasad spełniających kryteria", + "feedback.policy.find-hint": "Wejdź do katalogu, aby znaleźć lub ustawić politykę", + "feedback.policy.find-none": "feedback.policy.find-none", + "feedback.policy.find-none-create": "Nie znaleziono zasad dla katalogu {{path}}. \nSkonfiguruj nową politykę.", + "feedback.policy.header.actions": "działania", "feedback.policy.header.compression": "Kompresja", + "feedback.policy.header.defined": "Zdefiniowane", "feedback.policy.header.error-handling": "Obsługa błędów", "feedback.policy.header.files": "Akta", "feedback.policy.header.folder-actions": "Akcje folderów", + "feedback.policy.header.host": "Gospodarz", "feedback.policy.header.logging": "Logowanie", "feedback.policy.header.other": "Inny", + "feedback.policy.header.path": "Ścieżka", "feedback.policy.header.scheduling": "Planowanie", "feedback.policy.header.snapshot-action": "Akcje migawki", "feedback.policy.header.snapshot-retention": "Przechowywanie migawek", "feedback.policy.header.upload": "Wgrywać", + "feedback.policy.kind.all": "Wszystkie zasady", + "feedback.policy.kind.applicable": "Obowiązujące zasady", + "feedback.policy.kind.global": "Polityka globalna", + "feedback.policy.kind.local": "Polityka lokalna", + "feedback.policy.kind.per-host-policies": "Zasady dotyczące poszczególnych hostów", + "feedback.policy.kind.per-user-policies": "Zasady dotyczące poszczególnych użytkowników", "feedback.policy.logging.cache-hit": "Trafienie w pamięć podręczną", "feedback.policy.logging.cache-hit-help": "Szczegółowość dziennika, gdy zamiast przesyłania pliku używana jest pamięć podręczna", "feedback.policy.logging.cache-miss": "Brak pamięci podręcznej", @@ -123,6 +158,7 @@ "feedback.policy.other.disable-parent-policy-evaluation-help": "Zapobiega wpływowi zasad nadrzędnych na ten katalog i jego podkatalogi", "feedback.policy.other.json-representation": "Reprezentacja JSON", "feedback.policy.other.json-representation-help": "Jest to wewnętrzna reprezentacja polityki", + "feedback.policy.policies-defined-by-path-absolute": "Zasady można definiować tylko dla ścieżek bezwzględnych.", "feedback.policy.retention.annual-snapshot-retain": "Coroczny", "feedback.policy.retention.annual-snapshot-retain-help": "Liczba rocznych migawek przechowywanych dla każdego źródła. \nZachowana zostanie najnowsza migawka z każdego roku kalendarzowego", "feedback.policy.retention.annual-snapshot-retain-hint": "Liczba rocznych migawek", @@ -168,19 +204,113 @@ "feedback.policy.upload.maximum-parallel-snapshots-help": "Maksymalna liczba migawek, które można przesłać jednocześnie", "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "maksymalna liczba równoległych migawek", "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "należy określić przy użyciu zasad globalnych, użytkownika lub hosta", + "feedback.prodiver.gcs.paste-json-credentials": "Wklej tutaj dane uwierzytelniające JSON", "feedback.provider.azure-blob-storage": "Magazyn obiektów Blob platformy Azure", + "feedback.provider.azure.access-key": "Klucz dostępu", + "feedback.provider.azure.azure-storage-domain": "Domena magazynu Azure", + "feedback.provider.azure.container": "Pojemnik", + "feedback.provider.azure.enter-access-key": "Wprowadź tajny klucz dostępu", + "feedback.provider.azure.enter-azure-storage-domain": "Wprowadź domenę magazynu lub pozostaw puste dla domyślnego „blob.core.windows.net”", + "feedback.provider.azure.enter-container-name": "Wpisz nazwę kontenera", + "feedback.provider.azure.enter-object-name-prefix": "Wprowadź przedrostek nazwy obiektu lub pozostaw puste", + "feedback.provider.azure.enter-sas-token": "Wprowadź tajny token SAS", + "feedback.provider.azure.enter-storage-account": "Wprowadź nazwę konta magazynu", + "feedback.provider.azure.object-name-prefix": "Przedrostek nazwy obiektu", + "feedback.provider.azure.sas-token": "Token SAS-owy", + "feedback.provider.azure.storage-account": "Konto magazynu", + "feedback.provider.b2.bucket-name": "Wiadro B2", + "feedback.provider.b2.enter-account-key": "Wprowadź tajną aplikację lub klucz konta", + "feedback.provider.b2.enter-account-key-id": "Wprowadź identyfikator klucza aplikacji lub konta", + "feedback.provider.b2.enter-bucket-name": "Wpisz nazwę zasobnika", + "feedback.provider.b2.enter-object-name-prefix": "Wprowadź przedrostek nazwy obiektu lub pozostaw puste", + "feedback.provider.b2.key": "Klucz", + "feedback.provider.b2.key-id": "Identyfikator klucza", + "feedback.provider.b2.object-name-prefix": "Przedrostek nazwy obiektu", "feedback.provider.backblaze-b2": "Blask wsteczny B2", + "feedback.provider.filesystem.directory-path": "Ścieżka katalogu", + "feedback.provider.filesystem.enter-directory-path": "Wprowadź ścieżkę katalogu, w którym chcesz przechowywać pliki repozytorium", + "feedback.provider.gcs.bucket-name": "Wiadro GCS", + "feedback.provider.gcs.credentials-file": "Plik poświadczeń", + "feedback.provider.gcs.credentials-json": "Poświadczenia JSON", + "feedback.provider.gcs.enter-bucket-name": "Wpisz nazwę zasobnika", + "feedback.provider.gcs.enter-credentials-file-name": "Wprowadź nazwę pliku JSON poświadczeń", + "feedback.provider.gcs.enter-object-name-prefix": "Wprowadź przedrostek nazwy obiektu lub pozostaw puste", + "feedback.provider.gcs.object-name-prefix": "Przedrostek nazwy obiektu", "feedback.provider.google-cloud-storage": "Magazyn w chmurze Google", "feedback.provider.kopia-repository-server": "Serwer repozytorium Kopia", "feedback.provider.local-directory-or-nas": "Katalog lokalny lub NAS", "feedback.provider.rclone-remote": "Pilot zdalnego sterowania", + "feedback.provider.rclone.rclone-executable-path": "Ścieżka pliku wykonywalnego Rclone", + "feedback.provider.rclone.rclone-executable-path-hint": "Wprowadź ścieżkę do pliku wykonywalnego rclone", + "feedback.provider.rclone.rclone-remote-path": "Zdalna ścieżka Rclone", + "feedback.provider.rclone.rclone-remote-path-hint": "Wpisz :<ścieżka>", + "feedback.provider.repositoryserver.enter-server-certificate-fingerprint": "Wprowadź odcisk palca certyfikatu zaufanego serwera wydrukowany podczas uruchamiania serwera", + "feedback.provider.repositoryserver.enter-server-url": "Wprowadź adres URL serwera (https://:port)", + "feedback.provider.repositoryserver.server-address": "Adres serwera", + "feedback.provider.repositoryserver.server-certificate-fingerprint": "Odcisk palca certyfikatu zaufanego serwera (SHA256)", + "feedback.provider.repositorytoken.paste-token": "Wklej token połączenia", + "feedback.provider.repositorytoken.token": "Znak", "feedback.provider.required-either-key-file": "Wymagane jest jedno z Hasło, Plik klucza lub Kluczowe dane.", "feedback.provider.required-either-known-host-data": "Wymagany jest plik znanych hostów lub dane znanych hostów, ale nie oba.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 lub kompatybilna pamięć masowa", + "feedback.provider.s3.access-key-id": "Identyfikator klucza dostępu", + "feedback.provider.s3.access-key-id-hint": "Wprowadź identyfikator klucza dostępu", + "feedback.provider.s3.bucket-name": "Wiaderko", + "feedback.provider.s3.bucket-name-hint": "Wpisz nazwę zasobnika", + "feedback.provider.s3.enter-object-name-prefix-hint": "Wprowadź przedrostek nazwy obiektu lub pozostaw puste", + "feedback.provider.s3.object-name-prefix": "Przedrostek nazwy obiektu", + "feedback.provider.s3.override-region": "Zastąp region", + "feedback.provider.s3.override-region-hint": "Wpisz konkretny region (np. us-west-1) lub pozostaw puste", + "feedback.provider.s3.secret-access-key": "Tajny klucz dostępu", + "feedback.provider.s3.secret-access-key-hint": "Wprowadź tajny klucz dostępu", + "feedback.provider.s3.server-endpoint": "Punkt końcowy serwera", + "feedback.provider.s3.server-endpoint-hint": "Wpisz adres serwera (np. s3.amazonaws.com)", + "feedback.provider.s3.session-token": "Token sesji", + "feedback.provider.s3.session-token-hint": "Wprowadź token sesji lub pozostaw puste", + "feedback.provider.sftp-key-data": "Kluczowe dane", + "feedback.provider.sftp-key-data-hint": "Wklej zawartość pliku klucza", "feedback.provider.sftp-server": "Serwer SFTP", + "feedback.provider.sftp.enter-password": "Wprowadź hasło", + "feedback.provider.sftp.enter-path-host-file": "Wprowadź ścieżkę do pliku znane_hosty", + "feedback.provider.sftp.enter-path-to-key-file": "Wprowadź ścieżkę do pliku klucza", + "feedback.provider.sftp.enter-remote-path": "Wprowadź zdalną ścieżkę do repozytorium, np. „/mnt/data/repository”", + "feedback.provider.sftp.enter-ssh-arguments": "Wprowadź argumenty polecenia SSH („użytkownik@host -s sftp” zostanie dodany automatycznie)", + "feedback.provider.sftp.enter-ssh-host-name": "nazwa hosta ssh (np. przykład.com)", + "feedback.provider.sftp.host": "Gospodarz", + "feedback.provider.sftp.known-host-data": "Znane dane hostów", + "feedback.provider.sftp.launch-external-ssh-command": "Uruchom zewnętrzne polecenie SSH bez hasła", + "feedback.provider.sftp.launch-external-ssh-command-hint": "Domyślnie Kopia łączy się z serwerem za pomocą wewnętrznego klienta SSH, który obsługuje ograniczone opcje. \nAlternatywnie może uruchomić zewnętrzne polecenie SSH bez hasła, które obsługuje dodatkowe opcje, ale jest generalnie mniej wydajne niż wbudowany klient.", + "feedback.provider.sftp.password": "Hasło", + "feedback.provider.sftp.paste-content-of-known-host": "Wklej zawartość pliku znane_hosty", + "feedback.provider.sftp.path": "Ścieżka", + "feedback.provider.sftp.path-host-file": "Ścieżka do pliku znane_hosty", + "feedback.provider.sftp.path-key-file": "Ścieżka do pliku klucza", + "feedback.provider.sftp.port": "Port", + "feedback.provider.sftp.port-number": "Numer portu (np. 22)", + "feedback.provider.sftp.provide-passwordless-ssh-command": "Podaj polecenie SSH bez hasła do wykonania (zwykle „ssh”)", + "feedback.provider.sftp.ssh-arguments": "Argumenty SSH", + "feedback.provider.sftp.ssh-command": "Polecenie SSH", + "feedback.provider.sftp.user": "Użytkownik", + "feedback.provider.sftp.user-name": "Nazwa użytkownika", "feedback.provider.use-repository-token": "Użyj tokena repozytorium", "feedback.provider.webdav-server": "Serwer WebDAV", + "feedback.provider.webdav.enter-password": "Wprowadź hasło", + "feedback.provider.webdav.enter-username": "Wpisz nazwę użytkownika", + "feedback.provider.webdav.password": "Hasło", + "feedback.provider.webdav.server-url": "Adres URL serwera WebDAV", + "feedback.provider.webdav.username": "Nazwa użytkownika", "feedback.repository.additional-parameters-hint": "Dodatkowe parametry można ustawić podczas tworzenia repozytorium za pomocą wiersza poleceń.", + "feedback.repository.attribute.algorithm-eco": "Korekcja błędów", + "feedback.repository.attribute.algorithm-encryption": "Szyfrowanie", + "feedback.repository.attribute.algorithm-hash": "Funkcja haszująca", + "feedback.repository.attribute.algorithm-splitter": "Splitter", + "feedback.repository.attribute.config-file": "Plik konfiguracyjny", + "feedback.repository.attribute.connected-as": "Połączony jako", + "feedback.repository.attribute.internal-compression": "Wewnętrzna kompresja", + "feedback.repository.attribute.repository-eco": "Narzut na korekcję błędów", + "feedback.repository.attribute.repository-format": "Format repozytorium", + "feedback.repository.attribute.repository-provider": "Provider", + "feedback.repository.attribute.server-url": "Adres URL serwera", "feedback.repository.configuration": "Konfiguracja pamięci", "feedback.repository.connect-as": "Połącz jako", "feedback.repository.connect-in-read-only-mode": "Połącz się w trybie tylko do odczytu", @@ -188,8 +318,14 @@ "feedback.repository.connect-to-repository": "Połącz się z repozytorium", "feedback.repository.create-repository-new": "Utwórz nowe repozytorium", "feedback.repository.create-repository-new-help": "Wprowadź silne hasło, aby utworzyć repozytorium Kopia w udostępnionym magazynie.", + "feedback.repository.eco-disabled": "Brak", "feedback.repository.eec-warning": "[EKSPERYMENTALNE] Korekcja błędów może pomóc w ochronie przed niektórymi rodzajami uszkodzeń danych spowodowanymi spontanicznymi zamianami bitów na nośniku pamięci.", "feedback.repository.encryption": "Szyfrowanie", + "feedback.repository.enter-repository-password": "Wprowadź hasło do repozytorium", + "feedback.repository.hostname": "Nazwa hosta", + "feedback.repository.hostname-hint": "Zastąp tę opcję podczas przywracania migawki wykonanej na innym komputerze", + "feedback.repository.internal-compression-supported-no": "no", + "feedback.repository.internal-compression-supported-yes": "yes", "feedback.repository.kopia-server-parameters": "Parametry serwera Kopia", "feedback.repository.name-default": "Moje repozytorium", "feedback.repository.override-hint": "Aby zastąpić, kliknij „Pokaż opcje zaawansowane”", @@ -198,20 +334,94 @@ "feedback.repository.repository-description": "Opis repozytorium", "feedback.repository.repository-description-help": "Pomaga rozróżnić wiele połączonych repozytoriów", "feedback.repository.repository-description-hint": "Wprowadź opis repozytorium", + "feedback.repository.repository-description-required": "Opis jest wymagany", + "feedback.repository.repository-initializing": "Inicjalizacja w toku...", + "feedback.repository.repository-is-read-only": "Repozytorium jest w trybie tylko do odczytu", + "feedback.repository.repository-password": "Hasło do repozytorium", + "feedback.repository.repository-password-confirm": "Potwierdź hasło do repozytorium", + "feedback.repository.repository-password-confirm-again": "wprowadź ponownie hasło do repozytorium", + "feedback.repository.repository-password-help": "Służy do szyfrowania zawartości repozytorium", "feedback.repository.repository-token-enter": "Wprowadź token repozytorium", - "feedback.snapshot.status.overdue": "zaległy", + "feedback.repository.server-password": "Hasło serwera", + "feedback.repository.server-password-hint": "Wprowadź hasło, aby połączyć się z serwerem", + "feedback.repository.status-connected": "Podłączone repoytorium", + "feedback.repository.username": "Nazwa użytkownika", + "feedback.repository.username-hint": "Zastąp tę opcję podczas przywracania migawki wykonanej przez innego użytkownika", + "feedback.snapshot.create.enter-path-to-snapshot-hint": "Wprowadź ścieżkę do migawki", + "feedback.snapshot.create.must-specify-path": "Należy określić katalog do wykonania migawki.", + "feedback.snapshot.create.snapshot-new": "Nowy zrzut ekranu", + "feedback.snapshot.description": "Opis", + "feedback.snapshot.description.snapshot-description": "Opis migawki", + "feedback.snapshot.directory.browsing-not-supported": "Przeglądanie katalogów nie jest obsługiwane w przeglądarce internetowej. \nUżyj interfejsu Kopia.", + "feedback.snapshot.directory.restore-all-files-help": "Możesz zamontować/przywrócić wszystkie pliki i katalogi widoczne poniżej lub przywrócić pliki pojedynczo.", + "feedback.snapshot.header.actions": "działania", + "feedback.snapshot.header.details": "Detale", + "feedback.snapshot.header.directories": "Reż", + "feedback.snapshot.header.files": "Akta", + "feedback.snapshot.header.last-snapshot": "Ostatni zrzut ekranu", + "feedback.snapshot.header.next-snapshot": "Następna migawka", + "feedback.snapshot.header.retention": "Zatrzymanie", + "feedback.snapshot.header.root": "Źródło", + "feedback.snapshot.header.selected": "Wybrany", + "feedback.snapshot.header.snapshot-owner": "Właściciel", + "feedback.snapshot.header.snapshot-path": "Ścieżka", + "feedback.snapshot.header.snapshot-size": "Rozmiar", + "feedback.snapshot.header.start-time": "Czas rozpoczęcia", + "feedback.snapshot.header.status": "Status", + "feedback.snapshot.history.snapshot-displaying": "Wyświetlanie", + "feedback.snapshot.history.wipe-all-snapshots": "Wyczyść wszystkie migawki i zasady dla tego źródła.", + "feedback.snapshot.restore.continue-on-errors": "Kontynuuj w przypadku błędów", + "feedback.snapshot.restore.continue-on-errors-help": "Gdy wystąpi błąd przywracania, spróbuj kontynuować zamiast szybko zakończyć.", + "feedback.snapshot.restore.destination": "Cel", + "feedback.snapshot.restore.destination-help": "Możesz również przywrócić do pliku .zip lub .tar, podając odpowiednie rozszerzenie.", + "feedback.snapshot.restore.destination-hint": "Wprowadź ścieżkę docelową", + "feedback.snapshot.restore.disable-zip-compression": "Wyłącz kompresję ZIP", + "feedback.snapshot.restore.disable-zip-compression-help": "Nie kompresuj przy przywracaniu do pliku ZIP (szybciej).", + "feedback.snapshot.restore.minimal-file-size-for-shallow-restore": "Minimalny rozmiar pliku dla płytkiego przywracania", + "feedback.snapshot.restore.overwrite-directory": "Nadpisz katalogi", + "feedback.snapshot.restore.overwrite-files": "Nadpisz pliki", + "feedback.snapshot.restore.overwrite-symbolic-links": "Nadpisz dowiązania symboliczne", + "feedback.snapshot.restore.restore-file-modification-time": "Przywróć czas modyfikacji plików", + "feedback.snapshot.restore.restore-file-ownership": "Przywróć własność plików", + "feedback.snapshot.restore.restore-file-permissions": "Przywróć uprawnienia plików", + "feedback.snapshot.restore.shallow-restore-at-depth": "Płytkie przywracanie na określonej głębokości", + "feedback.snapshot.restore.skip-previously-restored-files": "Pomiń wcześniej przywrócone pliki i dowiązania symboliczne", + "feedback.snapshot.restore.snapshot-restore": "Przywróć", + "feedback.snapshot.restore.write-files-atomically": "Zapisuj pliki atomowo", + "feedback.snapshot.restore.write-sparse-files": "Zapisuj pliki rzadkie", + "feedback.snapshot.show-individual-snapshots-count": "feedback.snapshot.show-individual-snapshots-count", + "feedback.snapshot.show-individual-snapshots-count_one": "Pokaż {{count}} indywidualną migawkę", + "feedback.snapshot.show-individual-snapshots-count_other": "Pokaż {{count}} pojedynczych migawek", + "feedback.snapshot.start-after-previous-snapshot": "Migawka rozpocznie się po zakończeniu poprzedniej migawki", + "feedback.snapshot.status.status-overdue": "zaległy", + "feedback.snapshot.status.status-pending": "Aż do", "feedback.tab.policies": "Konfiguracje", "feedback.tab.preferences": "Ustawienia", "feedback.tab.repository": "Repozytorium", "feedback.tab.repository-is-not-connected": "Repozytorium nie jest połączone", "feedback.tab.snapshots": "Kopie", "feedback.tab.tasks": "Zadania", - "feedback.task.canceled-after": "Anulowano po", - "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} wyłączony) Files: {{files}} ({{files.excluded}} wyłączony) Directories: {{directories}} ({{directories.excluded}} wyłączony) Errors: {{errors}} ({{errors.ignored}} ignorowany)", - "feedback.task.failed-after": "Nie udało się po", - "feedback.task.finished-in": "Skończono w", - "feedback.task.running-for": "Biegać dla", - "feedback.task.total": "Całkowity", + "feedback.task.estimated-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} wyłączony) Files: {{files}} ({{files.excluded}} wyłączony) Directories: {{directories}} ({{directories.excluded}} wyłączony) Errors: {{errors}} ({{errors.ignored}} ignorowany)", + "feedback.task.header.counter": "Licznik", + "feedback.task.header.value": "Wartość", + "feedback.task.logs": "Logi", + "feedback.task.no-tasks-help": "Lista zadań pojawi się tutaj podczas tworzenia migawek, przywracania, przeprowadzania konserwacji itp.", + "feedback.task.search-tasks-by-hint": "Przeszukuj dzienniki zadań według opisu", + "feedback.task.status.task-canceled": "Zadanie anulowane", + "feedback.task.status.task-canceled-after": "Zadanie anulowane po", + "feedback.task.status.task-canceling": "Anulowanie", + "feedback.task.status.task-error": "Błąd", + "feedback.task.status.task-failed-after": "Nie udało się po", + "feedback.task.status.task-finished": "Zakończone", + "feedback.task.status.task-finished-in": "Skończono w", + "feedback.task.status.task-running-for": "Zadanie w toku od", + "feedback.task.status.task-started": "Rozpoczęte", + "feedback.task.status.task-succeeded-after": "Zadanie zakończone po", + "feedback.task.table.header-description": "Opis", + "feedback.task.table.header-kind": "Uprzejmy", + "feedback.task.table.header-start-time": "Czas rozpoczęcia", + "feedback.task.table.header-status": "Status", + "feedback.task.tasks-total": "Całkowity", "feedback.ui.appearance": "Wielkość tekstu", "feedback.ui.appearance-help": "Wybierz rodzaj czcionki", "feedback.ui.appearance-hint": "Rozmiar czcionki", @@ -224,225 +434,12 @@ "feedback.ui.theme-description": "Kolorystyka", "feedback.ui.theme-help": "Aktywny schemat kolorów", "feedback.ui.theme-select": "Wybierz schemat kolorów", - "feedback.validation.azure.access-key": "Klucz dostępu", - "feedback.validation.azure.access-key-hint": "Wprowadź tajny klucz dostępu", - "feedback.validation.azure.azure-storage-domain": "Domena magazynu Azure", - "feedback.validation.azure.azure-storage-domain-hint": "Wprowadź domenę magazynu lub pozostaw puste dla domyślnego „blob.core.windows.net”", - "feedback.validation.azure.container": "Pojemnik", - "feedback.validation.azure.container-hint": "Wpisz nazwę kontenera", - "feedback.validation.azure.object-name-prefix": "Przedrostek nazwy obiektu", - "feedback.validation.azure.object-name-prefix-hint": "Wprowadź przedrostek nazwy obiektu lub pozostaw puste", - "feedback.validation.azure.sas-token": "Token SAS-owy", - "feedback.validation.azure.sas-token-hint": "Wprowadź tajny token SAS", - "feedback.validation.azure.storage-account": "Konto magazynu", - "feedback.validation.azure.storage-account-hint": "Wprowadź nazwę konta magazynu", - "feedback.validation.b2.bucket-name": "Wiadro B2", - "feedback.validation.b2.bucket-name-hint": "Wpisz nazwę zasobnika", - "feedback.validation.b2.key": "Klucz", - "feedback.validation.b2.key-hint": "Wprowadź tajną aplikację lub klucz konta", - "feedback.validation.b2.key-id": "Identyfikator klucza", - "feedback.validation.b2.key-id-hint": "Wprowadź identyfikator klucza aplikacji lub konta", - "feedback.validation.b2.object-name-prefix": "Przedrostek nazwy obiektu", - "feedback.validation.b2.object-name-prefix-hint": "Wprowadź przedrostek nazwy obiektu lub pozostaw puste", - "feedback.validation.gcs.bucket-name": "Wiadro GCS", - "feedback.validation.gcs.bucket-name-hint": "Wpisz nazwę zasobnika", - "feedback.validation.gcs.credentials-file": "Plik poświadczeń", - "feedback.validation.gcs.credentials-file-hint": "Wprowadź nazwę pliku JSON poświadczeń", - "feedback.validation.gcs.credentials-json": "Poświadczenia JSON", - "feedback.validation.gcs.credentials-json-paste": "Wklej tutaj dane uwierzytelniające JSON", - "feedback.validation.gcs.object-name-prefix": "Przedrostek nazwy obiektu", - "feedback.validation.gcs.object-name-prefix-hint": "Wprowadź przedrostek nazwy obiektu lub pozostaw puste", "feedback.validation.invalid-times-of-day": "Nieprawidłowe pory dnia", - "feedback.validation.local.directory-path": "Ścieżka katalogu", - "feedback.validation.local.directory-path-hint": "Wprowadź ścieżkę katalogu, w którym chcesz przechowywać pliki repozytorium", "feedback.validation.optional.valid-number-or-empty": "Musi to być prawidłowy numer lub pusty", "feedback.validation.passwords-dont-match": "Hasła nie pasują", - "feedback.validation.rclone.rclone-executable-path": "Ścieżka pliku wykonywalnego Rclone", - "feedback.validation.rclone.rclone-executable-path-hint": "Wprowadź ścieżkę do pliku wykonywalnego rclone", - "feedback.validation.rclone.rclone-remote-path": "Zdalna ścieżka Rclone", - "feedback.validation.rclone.rclone-remote-path-hint": "Wpisz :<ścieżka>", - "feedback.validation.repository-server.server-address": "Adres serwera", - "feedback.validation.repository-server.server-address-hint": "Wprowadź adres URL serwera (https://:port)", - "feedback.validation.repository-server.server-certificate-fingerprint": "Odcisk palca certyfikatu zaufanego serwera (SHA256)", - "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Wprowadź odcisk palca certyfikatu zaufanego serwera wydrukowany podczas uruchamiania serwera", - "feedback.validation.repository-token.token": "Znak", - "feedback.validation.repository-token.token-hint": "Wklej token połączenia", "feedback.validation.required.directory": "Pole wymagane", "feedback.validation.required.field": "Pole wymagane", - "feedback.validation.required.hostname": "Nazwa hosta", - "feedback.validation.required.hostname-hint": "Zastąp tę opcję podczas przywracania migawki wykonanej na innym komputerze", - "feedback.validation.required.password-repository": "Hasło do repozytorium", - "feedback.validation.required.password-repository-help": "Służy do szyfrowania zawartości repozytorium", - "feedback.validation.required.password-repository-hint": "Wprowadź hasło do repozytorium", - "feedback.validation.required.repository-password-confirm": "Potwierdź hasło do repozytorium", - "feedback.validation.required.repository-password-confirm-again": "wprowadź ponownie hasło do repozytorium", - "feedback.validation.required.server-password": "Hasło serwera", - "feedback.validation.required.server-password-hint": "Wprowadź hasło, aby połączyć się z serwerem", - "feedback.validation.required.username": "Nazwa użytkownika", - "feedback.validation.required.username-hint": "Zastąp tę opcję podczas przywracania migawki wykonanej przez innego użytkownika", "feedback.validation.required.valid-number-or-empty": "Musi to być prawidłowy numer lub pusty", - "feedback.validation.s3.access-key-id": "Identyfikator klucza dostępu", - "feedback.validation.s3.access-key-id-hint": "Wprowadź identyfikator klucza dostępu", - "feedback.validation.s3.bucket-name": "Wiaderko", - "feedback.validation.s3.bucket-name-hint": "Wpisz nazwę zasobnika", - "feedback.validation.s3.object-name-prefix": "Przedrostek nazwy obiektu", - "feedback.validation.s3.override-region": "Zastąp region", - "feedback.validation.s3.override-region-hint": "Wpisz konkretny region (np. us-west-1) lub pozostaw puste", - "feedback.validation.s3.secret-access-key": "Tajny klucz dostępu", - "feedback.validation.s3.secret-access-key-hint": "Wprowadź tajny klucz dostępu", - "feedback.validation.s3.server-endpoint": "Punkt końcowy serwera", - "feedback.validation.s3.server-endpoint-hint": "Wpisz adres serwera (np. s3.amazonaws.com)", - "feedback.validation.s3.session-token": "Token sesji", - "feedback.validation.s3.session-token-hint": "Wprowadź token sesji lub pozostaw puste", - "feedback.validation.webdav.password": "Hasło", - "feedback.validation.webdav.password-hint": "Wprowadź hasło", - "feedback.validation.webdav.server-url": "Adres URL serwera WebDAV", - "feedback.validation.webdav.username": "Nazwa użytkownika", - "feedback.validation.webdav.username-hint": "Wpisz nazwę użytkownika", - "policies.feedback.find.count_one": "Znaleziono {{count}} zasad spełniających kryteria", - "policies.feedback.find.count_other": "Znaleziono {{count}} zasad spełniających kryteria", - "policies.feedback.find.none": "Nie znaleziono zasad.", - "policies.feedback.find.none.create": "Nie znaleziono zasad dla katalogu {{path}}. \nSkonfiguruj nową politykę.", - "policies.feedback.loading": "Ładowanie ...", - "policies.feedback.path.absolute": "Zasady można definiować tylko dla ścieżek bezwzględnych.", - "policies.feedback.policy.find": "Wejdź do katalogu, aby znaleźć lub ustawić politykę", - "policies.kind.all": "Wszystkie zasady", - "policies.kind.applicable": "Obowiązujące zasady", - "policies.kind.global": "Polityka globalna", - "policies.kind.host": "Zasady dotyczące poszczególnych hostów", - "policies.kind.local": "Polityka lokalna", - "policies.kind.user": "Zasady dotyczące poszczególnych użytkowników", - "repository.attribute.algorithm.eco": "Korekcja błędów", - "repository.attribute.algorithm.encryption": "Szyfrowanie", - "repository.attribute.algorithm.hash": "Funkcja haszująca", - "repository.attribute.algorithm.splitter": "Splitter", - "repository.attribute.compression.internal": "Wewnętrzna kompresja", - "repository.attribute.config.file": "Plik konfiguracyjny", - "repository.attribute.connected.as": "Połączony jako", - "repository.attribute.eco": "Narzut na korekcję błędów", - "repository.attribute.format": "Format repozytorium", - "repository.attribute.provider": "Provider", - "repository.attribute.server.url": "Adres URL serwera", - "repository.event.connection.cancel": "Przerwij próbę połączenia", - "repository.event.connection.disconnect": "Odłącz od repozytorium", - "repository.event.description.update": "Zmień opis", - "repository.feedback.compression.internal.not.supported": "no", - "repository.feedback.compression.internal.supported": "yes", - "repository.feedback.description.required": "Opis jest wymagany", - "repository.feedback.eco.disabled": "Brak", - "repository.feedback.read.only": "Repozytorium jest w trybie tylko do odczytu", - "repository.status.connected": "Podłączone repoytorium", - "repository.status.initializing": "Inicjalizacja w toku...", - "snapshot.event.create.estimate": "Oszacować", - "snapshot.event.create.now": "Zrzut ekranu teraz", - "snapshot.event.create.path": "Wprowadź ścieżkę do migawki", - "snapshot.event.create.path.resolve": "Należy określić katalog do wykonania migawki.", - "snapshot.event.delete.selected_one": "Czy chcesz usunąć wybraną migawkę {{count}}?", - "snapshot.event.delete.selected_other": "Czy chcesz usunąć wybrane migawki ({{count}})?", - "snapshot.event.directory.browse": "Przeglądać", - "snapshot.event.directory.browsing": "Przeglądanie katalogów nie jest obsługiwane w przeglądarce internetowej. \nUżyj interfejsu Kopia.", - "snapshot.event.directory.mount": "Zamontuj jako lokalny system plików", - "snapshot.event.directory.restore": "Przywróć pliki i katalogi", - "snapshot.event.directory.unmount": "Odmontuj", - "snapshot.event.history.delete.source": "Usuń źródło migawki", - "snapshot.event.history.description.update": "{{description}} - Kliknij, aby zaktualizować opis migawki.", - "snapshot.event.history.deselect.all": "Odznacz wszystkie", - "snapshot.event.history.fetch.snapshots": "Pobieraj migawki", - "snapshot.event.history.pin.add": "Dodaj pinezkę, aby zabezpieczyć migawkę przed usunięciem", - "snapshot.event.history.select.all": "Zaznacz wszystko", - "snapshot.event.history.selected.delete": "Usuń wybrane (", - "snapshot.event.restore": "Przywróć", - "snapshot.event.restore.begin": "Rozpocznij przywracanie", - "snapshot.event.snapshot.new": "Nowy zrzut ekranu", - "snapshot.event.snapshot.pending": "Aż do", - "snapshot.event.snapshot.policy": "Polityka", - "snapshot.event.synchronize": "Synchronizować", - "snapshot.feedback.directory.mount.restore": "Możesz zamontować/przywrócić wszystkie pliki i katalogi widoczne poniżej lub przywrócić pliki pojedynczo.", - "snapshot.feedback.history.display": "Wyświetlanie", - "snapshot.feedback.history.wipe.all": "Wyczyść wszystkie migawki i zasady dla tego źródła.", - "snapshot.feedback.restore.continue.errors": "Kontynuuj w przypadku błędów", - "snapshot.feedback.restore.continue.errors.help": "Gdy wystąpi błąd przywracania, spróbuj kontynuować zamiast szybko zakończyć.", - "snapshot.feedback.restore.destination": "Cel", - "snapshot.feedback.restore.destination.help": "Możesz również przywrócić do pliku .zip lub .tar, podając odpowiednie rozszerzenie.", - "snapshot.feedback.restore.destination.path": "Wprowadź ścieżkę docelową", - "snapshot.feedback.restore.directory.overwrite": "Nadpisz katalogi", - "snapshot.feedback.restore.disable.compression.zip": "Wyłącz kompresję ZIP", - "snapshot.feedback.restore.disable.compression.zip.help": "Nie kompresuj przy przywracaniu do pliku ZIP (szybciej).", - "snapshot.feedback.restore.file.atomically": "Zapisuj pliki atomowo", - "snapshot.feedback.restore.file.modification.time": "Przywróć czas modyfikacji plików", - "snapshot.feedback.restore.file.overwrite": "Nadpisz pliki", - "snapshot.feedback.restore.file.ownership": "Przywróć własność plików", - "snapshot.feedback.restore.file.permission": "Przywróć uprawnienia plików", - "snapshot.feedback.restore.file.sparse": "Zapisuj pliki rzadkie", - "snapshot.feedback.restore.link.overwrite": "Nadpisz dowiązania symboliczne", - "snapshot.feedback.restore.shallow.depth": "Płytkie przywracanie na określonej głębokości", - "snapshot.feedback.restore.shallow.file.size.minimal": "Minimalny rozmiar pliku dla płytkiego przywracania", - "snapshot.feedback.restore.skip": "Pomiń wcześniej przywrócone pliki i dowiązania symboliczne", - "snapshot.feedback.restore.task.go": "Przejdź do przywracania zadania", - "snapshot.feedback.snapshot.new": "Nowy zrzut ekranu", - "snapshot.feedback.snapshot.start": "Migawka rozpocznie się po zakończeniu poprzedniej migawki", - "snapshot.header.actions": "działania", - "snapshot.header.snapshot.last": "Ostatni zrzut ekranu", - "snapshot.header.snapshot.next": "Następna migawka", - "snapshot.header.snapshot.owner": "Właściciel", - "snapshot.header.snapshot.path": "Ścieżka", - "snapshot.header.snapshot.size": "Rozmiar", - "snapshot.header.status": "Status", - "snapshot.history.feedack.unfiltered.count_one": "Pokaż {{count}} indywidualną migawkę", - "snapshot.history.feedack.unfiltered.count_other": "Pokaż {{count}} pojedynczych migawek", - "snapshot.history.header.description": "Opis", - "snapshot.history.header.directories": "Reż", - "snapshot.history.header.files": "Akta", - "snapshot.history.header.retention": "Zatrzymanie", - "snapshot.history.header.root": "Źródło", - "snapshot.history.header.selected": "Wybrany", - "snapshot.history.header.size": "Rozmiar", - "snapshot.history.header.time.start": "Czas rozpoczęcia", - "task.all": "wszystkie", - "task.event.stop": "Zatrzymaj", - "task.failed": "nieudane", - "task.feedback.entries": "Lista zadań pojawi się tutaj podczas tworzenia migawek, przywracania, przeprowadzania konserwacji itp.", - "task.feedback.search": "Szukaj logów według opisu", - "task.header.counter": "Licznik", - "task.header.description": "Opis", - "task.header.kind": "Uprzejmy", - "task.header.status": "Status", - "task.header.time.start": "Czas rozpoczęcia", - "task.header.value": "Wartość", - "task.loading": "Wczytywanie...", - "task.logs": "Logi", - "task.running": "w toku", - "task.status.canceled": "Zadanie anulowane po", - "task.status.canceling": "Anulowanie", - "task.status.error": "Błąd", - "task.status.finished": "Zakończone", - "task.status.running.for": "Zadanie w toku od", - "task.status.started": "Rozpoczęte", - "task.status.succeed.after": "Zadanie zakończone po", - "validation.password": "Hasło", - "validation.password-hint": "Wprowadź hasło", - "validation.provider.external-ssh-command": "Uruchom zewnętrzne polecenie SSH bez hasła", - "validation.provider.external-ssh-command-hint": "Domyślnie Kopia łączy się z serwerem za pomocą wewnętrznego klienta SSH, który obsługuje ograniczone opcje. \nAlternatywnie może uruchomić zewnętrzne polecenie SSH bez hasła, które obsługuje dodatkowe opcje, ale jest generalnie mniej wydajne niż wbudowany klient.", - "validation.provider.host": "Gospodarz", - "validation.provider.host-hint": "nazwa hosta ssh (np. przykład.com)", - "validation.provider.key-data": "Kluczowe dane", - "validation.provider.key-data-hint": "Wklej zawartość pliku klucza", - "validation.provider.known-host-data": "Znane dane hostów", - "validation.provider.known-host-data-hint": "Wklej zawartość pliku znane_hosty", - "validation.provider.path": "Ścieżka", - "validation.provider.path-hint": "Wprowadź zdalną ścieżkę do repozytorium, np. „/mnt/data/repository”", - "validation.provider.path-host-file": "Ścieżka do pliku znane_hosty", - "validation.provider.path-host-file-hint": "Wprowadź ścieżkę do pliku znane_hosty", - "validation.provider.path-key-file": "Ścieżka do pliku klucza", - "validation.provider.path-key-file-hint": "Wprowadź ścieżkę do pliku klucza", - "validation.provider.port": "Port", - "validation.provider.port-hint": "Numer portu (np. 22)", - "validation.provider.ssh-arguments": "Argumenty SSH", - "validation.provider.ssh-arguments-hint": "Wprowadź argumenty polecenia SSH („użytkownik@host -s sftp” zostanie dodany automatycznie)", - "validation.provider.ssh-command": "Polecenie SSH", - "validation.provider.ssh-command-hint": "Podaj polecenie SSH bez hasła do wykonania (zwykle „ssh”)", - "validation.provider.user": "Użytkownik", - "validation.provider.user-hint": "Nazwa użytkownika", "value.algorithm.eco-disabled": "Wyłączony", "value.algorithm.suffix-not-recommended": "(NIEPOLECANE)", "value.algorithm.suffix-recommended": "(ZALECANA)", @@ -458,8 +455,8 @@ "value.policy.optional": "Ignoruj ​​niepowodzenia", "value.provider.s3.http-connection-insecure": "Użyj połączenia HTTP (niepewne)", "value.provider.s3.no-tls-verification": "Nie weryfikuj certyfikatu TLS", - "value.repository.format.latest": "Najnowszy format", - "value.repository.format.legacy": "Starszy format zgodny z wersją 0.8", + "value.repository.latest-format": "Najnowszy format", + "value.repository.legacy-format": "Starszy format zgodny z wersją 0.8", "value.snapshot-frequency.10-minutes": "co 10 minut", "value.snapshot-frequency.12-hours": "co 12 godzin", "value.snapshot-frequency.15-minutes": "co 15 minut", diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index 86c2fdc5..3f2c84a4 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -1,52 +1,71 @@ { - "common.back": "Назад", - "common.cancel": "Отмена", - "common.click-here-to-learn-more": "Кликните сюда, чтобы узнать больше.", - "common.delete": "Удалить", - "common.delete-confirm": "Подтвердите удаление", - "common.loading": "Загрузка...", - "common.next": "Следующий", - "common.return": "Возврат", - "enter-object-name-prefix-or-leave-empty-hint": "Введите префикс имени объекта или оставьте пустым.", + "common.action.back": "Назад", + "common.action.cancel": "Отмена", + "common.action.click-here-to-learn-more": "Кликните сюда, чтобы узнать больше.", + "common.action.confirm-delete": "Подтвердите удаление", + "common.action.delete": "Удалить", + "common.action.next": "Следующий", + "common.action.return": "Возврат", + "common.action.stop": "Остановить", + "common.label.loading": "Загрузка...", "event.cli.copy-to-clipboard": "Скопировать в буфер обмена", "event.cli.show-cli-equivalent": "Нажмите, чтобы показать эквивалент CLI", - "event.description.cancel": "Отмена", - "event.description.new": "Введите новое описание", - "event.description.remove": "Удалить описание", - "event.description.update": "Описание обновления", - "event.log.hide": "Скрыть лог", - "event.log.show": "Показать лог", - "event.pin.add": "Добавить пин", - "event.pin.cancel": "Отмена", - "event.pin.remove": "Удалить булавку", - "event.pin.snapshot-pin": "Снимок закрепления", - "event.pin.update": "Обновить пин-код", + "event.log.hide-log": "Скрыть лог", + "event.log.show-log": "Показать лог", + "event.pin.add-pin": "Добавить пин", + "event.pin.pin-snapshot": "Снимок закрепления", + "event.pin.remove-pin": "Удалить булавку", + "event.pin.update-pin": "Обновить пин-код", "event.policy.delete": "Удалить политику", "event.policy.edit": "Редактировать", "event.policy.save": "Сохранить политику", - "event.policy.set": "Установить политику", - "event.repository.advanced-options-hide": "Скрыть дополнительные параметры", - "event.repository.advanced-options.show": "Показать дополнительные параметры", + "event.policy.set-policy": "Установить политику", + "event.repository.cancel-connection": "Отменить подключение", "event.repository.connect-to-repository": "Подключиться к репозиторию", "event.repository.create-repository": "Создать репозиторий", - "event.task.cancel": "Отменить задачу", - "feedback.description.modal-title": "Описание снимка", + "event.repository.disconnect-from-repository": "Отключиться от репозитория", + "event.repository.hide-advanced-options": "Скрыть дополнительные параметры", + "event.repository.show-advanced-options": "Показать дополнительные параметры", + "event.repository.update-description": "Обновить описание", + "event.snapshot.browse-directory": "Просматривать", + "event.snapshot.delete-selected": "event.snapshot.delete-selected", + "event.snapshot.delete-selected_one": "Вы хотите удалить выбранный снимок {{count}}?", + "event.snapshot.delete-selected_other": "Вы хотите удалить выбранные снимки ({{count}})?", + "event.snapshot.description.enter-new-description": "Введите новое описание", + "event.snapshot.description.remove-description": "Удалить описание", + "event.snapshot.description.update-description": "Описание обновления", + "event.snapshot.estimate": "Оценивать", + "event.snapshot.fetch-snapshots": "Получить снимки", + "event.snapshot.history.delete-selected": "Удалить выбранное ({{count}})", + "event.snapshot.history.delete-snapshot-source": "Удалить источник снимка", + "event.snapshot.history.deselect-all": "Убрать выделение со всего", + "event.snapshot.history.select-all-snapshots": "Выбрать все", + "event.snapshot.history.update-snapshot-description": "{{description}} – нажмите, чтобы обновить описание снимка.", + "event.snapshot.mount-directory": "Монтировать как локальную файловую систему", + "event.snapshot.new-snapshot": "Новый снимок", + "event.snapshot.restore-file-directories": "Восстановление файлов и каталогов", + "event.snapshot.restore.begin-restore": "Начать восстановление", + "event.snapshot.restore.go-to-restore-task": "Перейти к задаче восстановления", + "event.snapshot.show-policy": "Политика", + "event.snapshot.snapshot-now": "Снимок сейчас", + "event.snapshot.synchronize": "Синхронизировать", + "event.snapshot.unmount-directory": "Размонтировать", + "event.task.action.cancel": "Отменить задачу", + "event.task.select.task-all": "Все", + "event.task.select.task-failed": "Не удалось", + "event.task.select.task-running": "Выполняются", + "feedback.directory.header.directories": "Каталоги", + "feedback.directory.header.files": "Файлы", + "feedback.directory.header.last-modification": "Последнее изменение", + "feedback.directory.header.name": "Имя", + "feedback.directory.header.size": "Размер", "feedback.error.common": "Ошибка", "feedback.error.connection": "Ошибка подключения:", - "feedback.header.actions": "Действия", - "feedback.header.defined": "Определенный", - "feedback.header.details": "Подробности", - "feedback.header.directories": "Каталоги", "feedback.header.effective": "Эффективный", - "feedback.header.files": "Файлы", - "feedback.header.host": "Хозяин", - "feedback.header.modification-last": "Последнее изменение", - "feedback.header.name": "Имя", - "feedback.header.path": "Путь", - "feedback.header.size": "Размер", "feedback.header.username": "Имя пользователя", - "feedback.pin.name": "Название контакта", - "feedback.pin.standard-text": "не удалять", + "feedback.pin.add-pin-to-protect": "Добавьте булавку, чтобы защитить снимок от удаления", + "feedback.pin.do-not-delete": "не удалять", + "feedback.pin.name-of-the-pin": "Название контакта", "feedback.policy.action.command-mode": "Командный режим", "feedback.policy.actions.after-folder": "После папки", "feedback.policy.actions.after-folder-help": "Скрипт для запуска после папки", @@ -97,16 +116,32 @@ "feedback.policy.files.ignore-well-known-cache-directories-help": "Игнорировать каталоги, содержащие CACHEDIR.TAG и подобные.", "feedback.policy.files.scan-only-one-filesystem": "Сканировать только одну файловую систему", "feedback.policy.files.scan-only-one-filesystem-help": "Не пересекайте границы файловой системы при создании моментального снимка.", + "feedback.policy.find-count": "обратная связь.policy.find-count", + "feedback.policy.find-count_one": "Найдено {{count}} политики, соответствующей критериям.", + "feedback.policy.find-count_other": "Найдено {{count}} политик, соответствующих критериям.", + "feedback.policy.find-hint": "Введите каталог, чтобы найти или установить политику", + "feedback.policy.find-none": "Политики не найдены", + "feedback.policy.find-none-create": "Политика для каталога {{path}} не найдена. \nПожалуйста, настройте новую политику.", + "feedback.policy.header.actions": "Действия", "feedback.policy.header.compression": "Сжатие", + "feedback.policy.header.defined": "Определенный", "feedback.policy.header.error-handling": "Обработка ошибок", "feedback.policy.header.files": "Файлы", "feedback.policy.header.folder-actions": "Действия с папками", + "feedback.policy.header.host": "Хозяин", "feedback.policy.header.logging": "Ведение журнала", "feedback.policy.header.other": "Другой", + "feedback.policy.header.path": "Путь", "feedback.policy.header.scheduling": "Планирование", "feedback.policy.header.snapshot-action": "Действия со снимками", "feedback.policy.header.snapshot-retention": "Хранение моментальных снимков", "feedback.policy.header.upload": "Загрузить", + "feedback.policy.kind.all": "Все политики", + "feedback.policy.kind.applicable": "Применимые политики", + "feedback.policy.kind.global": "Глобальная политика", + "feedback.policy.kind.local": "Местная политика", + "feedback.policy.kind.per-host-policies": "Политики для каждого хоста", + "feedback.policy.kind.per-user-policies": "Политики для каждого пользователя", "feedback.policy.logging.cache-hit": "Попадание в кэш", "feedback.policy.logging.cache-hit-help": "Подробность журнала, когда вместо загрузки файла используется кеш", "feedback.policy.logging.cache-miss": "Промах в кэше", @@ -123,6 +158,7 @@ "feedback.policy.other.disable-parent-policy-evaluation-help": "Предотвращает влияние родительских политик на этот каталог и его подкаталоги.", "feedback.policy.other.json-representation": "JSON-представление", "feedback.policy.other.json-representation-help": "Это внутреннее представление политики", + "feedback.policy.policies-defined-by-path-absolute": "Политики могут быть определены только для абсолютных путей.", "feedback.policy.retention.annual-snapshot-retain": "Ежегодный", "feedback.policy.retention.annual-snapshot-retain-help": "Сколько ежегодных снимков следует сохранять для каждого источника. \nПоследний снимок за каждый календарный год будет сохранен.", "feedback.policy.retention.annual-snapshot-retain-hint": "Количество ежегодных снимков", @@ -168,19 +204,113 @@ "feedback.policy.upload.maximum-parallel-snapshots-help": "Максимальное количество снимков, которые можно загрузить одновременно", "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "максимальное количество параллельных снимков", "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "должно быть указано с использованием глобальной, пользовательской или хостовой политики.", + "feedback.prodiver.gcs.paste-json-credentials": "Вставьте сюда учетные данные JSON.", "feedback.provider.azure-blob-storage": "Хранилище BLOB-объектов Azure", + "feedback.provider.azure.access-key": "Ключ доступа", + "feedback.provider.azure.azure-storage-domain": "Домен хранилища Azure", + "feedback.provider.azure.container": "Контейнер", + "feedback.provider.azure.enter-access-key": "Введите секретный ключ доступа", + "feedback.provider.azure.enter-azure-storage-domain": "Введите домен хранения или оставьте пустым для значения по умолчанию «blob.core.windows.net».", + "feedback.provider.azure.enter-container-name": "Введите имя контейнера", + "feedback.provider.azure.enter-object-name-prefix": "Введите префикс имени объекта или оставьте пустым.", + "feedback.provider.azure.enter-sas-token": "Введите секретный токен SAS", + "feedback.provider.azure.enter-storage-account": "Введите имя учетной записи хранения", + "feedback.provider.azure.object-name-prefix": "Префикс имени объекта", + "feedback.provider.azure.sas-token": "Токен SAS", + "feedback.provider.azure.storage-account": "Учетная запись хранения", + "feedback.provider.b2.bucket-name": "Ведро Б2", + "feedback.provider.b2.enter-account-key": "Введите секретный ключ приложения или аккаунта", + "feedback.provider.b2.enter-account-key-id": "Введите идентификатор ключа приложения или учетной записи", + "feedback.provider.b2.enter-bucket-name": "Введите название сегмента", + "feedback.provider.b2.enter-object-name-prefix": "Введите префикс имени объекта или оставьте пустым.", + "feedback.provider.b2.key": "Ключ", + "feedback.provider.b2.key-id": "Идентификатор ключа", + "feedback.provider.b2.object-name-prefix": "Префикс имени объекта", "feedback.provider.backblaze-b2": "Бэкблэйз Б2", + "feedback.provider.filesystem.directory-path": "Путь к каталогу", + "feedback.provider.filesystem.enter-directory-path": "Введите путь к каталогу, в котором вы хотите хранить файлы репозитория.", + "feedback.provider.gcs.bucket-name": "Сегмент ГКС", + "feedback.provider.gcs.credentials-file": "Файл учетных данных", + "feedback.provider.gcs.credentials-json": "Учетные данные JSON", + "feedback.provider.gcs.enter-bucket-name": "Введите название сегмента", + "feedback.provider.gcs.enter-credentials-file-name": "Введите имя файла JSON учетных данных", + "feedback.provider.gcs.enter-object-name-prefix": "Введите префикс имени объекта или оставьте пустым.", + "feedback.provider.gcs.object-name-prefix": "Префикс имени объекта", "feedback.provider.google-cloud-storage": "Облачное хранилище Google", "feedback.provider.kopia-repository-server": "Сервер репозитория Копиа", "feedback.provider.local-directory-or-nas": "Локальный каталог или NAS", "feedback.provider.rclone-remote": "Rclone удаленный", + "feedback.provider.rclone.rclone-executable-path": "Путь к исполняемому файлу Rclone", + "feedback.provider.rclone.rclone-executable-path-hint": "Введите путь к исполняемому файлу rclone", + "feedback.provider.rclone.rclone-remote-path": "Rclone удаленный путь", + "feedback.provider.rclone.rclone-remote-path-hint": "Введите <имя-удаленного клона>:<путь>", + "feedback.provider.repositoryserver.enter-server-certificate-fingerprint": "Введите отпечаток сертификата доверенного сервера, распечатанный при запуске сервера.", + "feedback.provider.repositoryserver.enter-server-url": "Введите URL-адрес сервера (https://<хост>:порт)", + "feedback.provider.repositoryserver.server-address": "Адрес сервера", + "feedback.provider.repositoryserver.server-certificate-fingerprint": "Отпечаток сертификата доверенного сервера (SHA256)", + "feedback.provider.repositorytoken.paste-token": "Вставить токен подключения", + "feedback.provider.repositorytoken.token": "Токен", "feedback.provider.required-either-key-file": "Требуется один из Пароль, Ключевой файл или Ключевые данные.", "feedback.provider.required-either-known-host-data": "Требуется либо Файл известных хостов, либо Данные известных хостов, но не оба одновременно.", "feedback.provider.s3-or-compatible-storage": "Amazon S3 или совместимое хранилище", + "feedback.provider.s3.access-key-id": "Идентификатор ключа доступа", + "feedback.provider.s3.access-key-id-hint": "Введите идентификатор ключа доступа", + "feedback.provider.s3.bucket-name": "Ведро", + "feedback.provider.s3.bucket-name-hint": "Введите название сегмента", + "feedback.provider.s3.enter-object-name-prefix-hint": "Введите префикс имени объекта или оставьте пустым.", + "feedback.provider.s3.object-name-prefix": "Префикс имени объекта", + "feedback.provider.s3.override-region": "Переопределить регион", + "feedback.provider.s3.override-region-hint": "Введите конкретный регион (например, us-west-1) или оставьте пустым.", + "feedback.provider.s3.secret-access-key": "Секретный ключ доступа", + "feedback.provider.s3.secret-access-key-hint": "Введите секретный ключ доступа", + "feedback.provider.s3.server-endpoint": "Конечная точка сервера", + "feedback.provider.s3.server-endpoint-hint": "Введите адрес сервера (например, s3.amazonaws.com)", + "feedback.provider.s3.session-token": "Токен сеанса", + "feedback.provider.s3.session-token-hint": "Введите токен сеанса или оставьте пустым", + "feedback.provider.sftp-key-data": "Ключевые данные", + "feedback.provider.sftp-key-data-hint": "Вставьте содержимое ключевого файла", "feedback.provider.sftp-server": "SFTP-сервер", + "feedback.provider.sftp.enter-password": "Введите пароль", + "feedback.provider.sftp.enter-path-host-file": "Введите путь к файлуknown_hosts", + "feedback.provider.sftp.enter-path-to-key-file": "Введите путь к файлу ключа", + "feedback.provider.sftp.enter-remote-path": "Введите удаленный путь к репозиторию, например, «/mnt/data/repository».", + "feedback.provider.sftp.enter-ssh-arguments": "Введите аргументы команды SSH (user@host -s sftp будет добавлен автоматически)", + "feedback.provider.sftp.enter-ssh-host-name": "имя хоста ssh (например, example.com)", + "feedback.provider.sftp.host": "Хозяин", + "feedback.provider.sftp.known-host-data": "Данные об известных хостах", + "feedback.provider.sftp.launch-external-ssh-command": "Запустите внешнюю SSH-команду без пароля.", + "feedback.provider.sftp.launch-external-ssh-command-hint": "По умолчанию Kopia подключается к серверу с помощью внутреннего SSH-клиента, который поддерживает ограниченные возможности. \nВ качестве альтернативы он может запустить внешнюю команду SSH без пароля, которая поддерживает дополнительные параметры, но, как правило, менее эффективна, чем встроенный клиент.", + "feedback.provider.sftp.password": "Пароль", + "feedback.provider.sftp.paste-content-of-known-host": "Вставьте содержимое файлаknown_hosts.", + "feedback.provider.sftp.path": "Путь", + "feedback.provider.sftp.path-host-file": "Путь к файлуknown_hosts", + "feedback.provider.sftp.path-key-file": "Путь к ключевому файлу", + "feedback.provider.sftp.port": "Порт", + "feedback.provider.sftp.port-number": "Номер порта (например, 22)", + "feedback.provider.sftp.provide-passwordless-ssh-command": "Предоставьте для выполнения команду SSH без пароля (обычно «ssh»).", + "feedback.provider.sftp.ssh-arguments": "SSH-аргументы", + "feedback.provider.sftp.ssh-command": "SSH-команда", + "feedback.provider.sftp.user": "Пользователь", + "feedback.provider.sftp.user-name": "Имя пользователя", "feedback.provider.use-repository-token": "Использовать токен репозитория", "feedback.provider.webdav-server": "ВебДАВ-сервер", + "feedback.provider.webdav.enter-password": "Введите пароль", + "feedback.provider.webdav.enter-username": "Введите имя пользователя", + "feedback.provider.webdav.password": "Пароль", + "feedback.provider.webdav.server-url": "URL-адрес сервера WebDAV", + "feedback.provider.webdav.username": "Имя пользователя", "feedback.repository.additional-parameters-hint": "Дополнительные параметры можно задать при создании репозитория с помощью командной строки.", + "feedback.repository.attribute.algorithm-eco": "Алгоритм коррекции ошибок", + "feedback.repository.attribute.algorithm-encryption": "Алгоритм шифрования", + "feedback.repository.attribute.algorithm-hash": "Алгоритм хеширования", + "feedback.repository.attribute.algorithm-splitter": "Алгоритм разделения", + "feedback.repository.attribute.config-file": "Файл конфигурации", + "feedback.repository.attribute.connected-as": "Подключено как", + "feedback.repository.attribute.internal-compression": "Внутреннее сжатие", + "feedback.repository.attribute.repository-eco": "Коррекция ошибок", + "feedback.repository.attribute.repository-format": "Формат репозитория", + "feedback.repository.attribute.repository-provider": "Поставщик", + "feedback.repository.attribute.server-url": "URL сервера", "feedback.repository.configuration": "Конфигурация хранилища", "feedback.repository.connect-as": "Подключиться как", "feedback.repository.connect-in-read-only-mode": "Подключайтесь в режиме только для чтения", @@ -188,8 +318,14 @@ "feedback.repository.connect-to-repository": "Подключиться к репозиторию", "feedback.repository.create-repository-new": "Создать новый репозиторий", "feedback.repository.create-repository-new-help": "Введите надежный пароль, чтобы создать репозиторий Kopia в предоставленном хранилище.", + "feedback.repository.eco-disabled": "Отключено", "feedback.repository.eec-warning": "[ЭКСПЕРИМЕНТАЛЬНАЯ ЧАСТЬ] Исправление ошибок может помочь защитить от определенных видов повреждения данных из-за самопроизвольной смены битов на носителе.", "feedback.repository.encryption": "Шифрование", + "feedback.repository.enter-repository-password": "Введите пароль репозитория", + "feedback.repository.hostname": "Имя хоста", + "feedback.repository.hostname-hint": "Переопределите это значение при восстановлении снимка, сделанного на другом компьютере.", + "feedback.repository.internal-compression-supported-no": "нет", + "feedback.repository.internal-compression-supported-yes": "да", "feedback.repository.kopia-server-parameters": "Параметры сервера Копия", "feedback.repository.name-default": "Мой репозиторий", "feedback.repository.override-hint": "Чтобы переопределить, нажмите «Показать дополнительные параметры».", @@ -198,20 +334,94 @@ "feedback.repository.repository-description": "Описание репозитория", "feedback.repository.repository-description-help": "Помогает различать несколько подключенных репозиториев.", "feedback.repository.repository-description-hint": "Введите описание репозитория", + "feedback.repository.repository-description-required": "Требуется описание репозитория", + "feedback.repository.repository-initializing": "Инициализация репозитория...", + "feedback.repository.repository-is-read-only": "Репозиторий доступен только для чтения", + "feedback.repository.repository-password": "Пароль репозитория", + "feedback.repository.repository-password-confirm": "Подтвердите пароль репозитория", + "feedback.repository.repository-password-confirm-again": "введите пароль хранилища еще раз", + "feedback.repository.repository-password-help": "Используется для шифрования содержимого репозитория.", "feedback.repository.repository-token-enter": "Введите токен репозитория", - "feedback.snapshot.status.overdue": "просроченный", + "feedback.repository.server-password": "Пароль сервера", + "feedback.repository.server-password-hint": "Введите пароль для подключения к серверу", + "feedback.repository.status-connected": "Подключено к репозиторию", + "feedback.repository.username": "Имя пользователя", + "feedback.repository.username-hint": "Переопределите это при восстановлении снимка, сделанного другим пользователем.", + "feedback.snapshot.create.enter-path-to-snapshot-hint": "Введите путь к снимку", + "feedback.snapshot.create.must-specify-path": "Необходимо указать каталог для снимка.", + "feedback.snapshot.create.snapshot-new": "Новый снимок", + "feedback.snapshot.description": "Описание", + "feedback.snapshot.description.snapshot-description": "Описание снимка", + "feedback.snapshot.directory.browsing-not-supported": "Просмотр каталогов не поддерживается в веб-браузере. \nИспользуйте интерфейс Копиа.", + "feedback.snapshot.directory.restore-all-files-help": "Вы можете смонтировать/восстановить все файлы и каталоги, которые вы видите ниже, или восстановить файлы по отдельности.", + "feedback.snapshot.header.actions": "Действия", + "feedback.snapshot.header.details": "Подробности", + "feedback.snapshot.header.directories": "Дирс", + "feedback.snapshot.header.files": "Файлы", + "feedback.snapshot.header.last-snapshot": "Последний снимок", + "feedback.snapshot.header.next-snapshot": "Следующий снимок", + "feedback.snapshot.header.retention": "Удержание", + "feedback.snapshot.header.root": "Корень", + "feedback.snapshot.header.selected": "Выбрано", + "feedback.snapshot.header.snapshot-owner": "Владелец", + "feedback.snapshot.header.snapshot-path": "Путь", + "feedback.snapshot.header.snapshot-size": "Размер", + "feedback.snapshot.header.start-time": "Время начала", + "feedback.snapshot.header.status": "Статус", + "feedback.snapshot.history.snapshot-displaying": "Отображение", + "feedback.snapshot.history.wipe-all-snapshots": "Сотрите все снимки и политику для этого источника.", + "feedback.snapshot.restore.continue-on-errors": "Продолжить при возникновении ошибок", + "feedback.snapshot.restore.continue-on-errors-help": "При возникновении ошибки восстановления попробуйте продолжить, а не прекращать операцию.", + "feedback.snapshot.restore.destination": "Назначение", + "feedback.snapshot.restore.destination-help": "Вы также можете восстановить в файл .zip или .tar, указав соответствующее расширение.", + "feedback.snapshot.restore.destination-hint": "Введите путь назначения", + "feedback.snapshot.restore.disable-zip-compression": "Отключить сжатие ZIP", + "feedback.snapshot.restore.disable-zip-compression-help": "Не сжимать при восстановлении в файл ZIP (быстрее).", + "feedback.snapshot.restore.minimal-file-size-for-shallow-restore": "Минимальный размер файла для поверхностного восстановления", + "feedback.snapshot.restore.overwrite-directory": "Перезаписать директории", + "feedback.snapshot.restore.overwrite-files": "Перезаписать файлы", + "feedback.snapshot.restore.overwrite-symbolic-links": "Перезаписать символические ссылки", + "feedback.snapshot.restore.restore-file-modification-time": "Восстановить время изменения файлов", + "feedback.snapshot.restore.restore-file-ownership": "Восстановить владение файлами", + "feedback.snapshot.restore.restore-file-permissions": "Восстановить разрешения файлов", + "feedback.snapshot.restore.shallow-restore-at-depth": "Поверхностное восстановление на определенной глубине", + "feedback.snapshot.restore.skip-previously-restored-files": "Пропустить ранее восстановленные файлы и символические ссылки", + "feedback.snapshot.restore.snapshot-restore": "Восстановить", + "feedback.snapshot.restore.write-files-atomically": "Записывать файлы атомарно", + "feedback.snapshot.restore.write-sparse-files": "Записывать разреженные файлы", + "feedback.snapshot.show-individual-snapshots-count": "feedback.snapshot.show-individual-snapshots-count", + "feedback.snapshot.show-individual-snapshots-count_one": "Показать {{count}} отдельный снимок", + "feedback.snapshot.show-individual-snapshots-count_other": "Показать {{count}} отдельных снимков", + "feedback.snapshot.start-after-previous-snapshot": "Снимок начнется после завершения предыдущего снимка", + "feedback.snapshot.status.status-overdue": "просроченный", + "feedback.snapshot.status.status-pending": "Ожидание", "feedback.tab.policies": "Политики", "feedback.tab.preferences": "Настройки", "feedback.tab.repository": "Репозиторий", "feedback.tab.repository-is-not-connected": "Репозиторий не подключен", "feedback.tab.snapshots": "Снимки", "feedback.tab.tasks": "Задачи", - "feedback.task.canceled-after": "Отменено после", - "feedback.task.estimate-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} исключено) Files: {{files}} ({{files.excluded}} исключено) Directories: {{directories}} ({{directories.excluded}} исключено) Errors: {{errors}} ({{errors.ignored}} проигнорировал)", - "feedback.task.failed-after": "Не удалось после", - "feedback.task.finished-in": "Закончено через", - "feedback.task.running-for": "Бег за", - "feedback.task.total": "Общий", + "feedback.task.estimated-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} исключено) Files: {{files}} ({{files.excluded}} исключено) Directories: {{directories}} ({{directories.excluded}} исключено) Errors: {{errors}} ({{errors.ignored}} проигнорировал)", + "feedback.task.header.counter": "Счетчик", + "feedback.task.header.value": "Значение", + "feedback.task.logs": "Логи", + "feedback.task.no-tasks-help": "Список задач появится здесь при создании снимков, восстановлении, выполнении обслуживания и т. д.", + "feedback.task.search-tasks-by-hint": "Поиск журналов задач по описанию", + "feedback.task.status.task-canceled": "Задача отменена", + "feedback.task.status.task-canceled-after": "Задача отменена после", + "feedback.task.status.task-canceling": "Отмена", + "feedback.task.status.task-error": "Ошибка задачи", + "feedback.task.status.task-failed-after": "Не удалось после", + "feedback.task.status.task-finished": "Завершено", + "feedback.task.status.task-finished-in": "Закончено через", + "feedback.task.status.task-running-for": "Задача выполняется в течение", + "feedback.task.status.task-started": "Начало", + "feedback.task.status.task-succeeded-after": "Задача успешно завершена после", + "feedback.task.table.header-description": "Описание", + "feedback.task.table.header-kind": "Тип", + "feedback.task.table.header-start-time": "Время начала", + "feedback.task.table.header-status": "Статус", + "feedback.task.tasks-total": "Общий", "feedback.ui.appearance": "Внешний вид", "feedback.ui.appearance-help": "Определяет внешний вид пользовательского интерфейса", "feedback.ui.appearance-hint": "Выберите размер шрифта", @@ -224,225 +434,12 @@ "feedback.ui.theme-description": "Тема", "feedback.ui.theme-help": "Текущая активная тема", "feedback.ui.theme-select": "Выберите тему", - "feedback.validation.azure.access-key": "Ключ доступа", - "feedback.validation.azure.access-key-hint": "Введите секретный ключ доступа", - "feedback.validation.azure.azure-storage-domain": "Домен хранилища Azure", - "feedback.validation.azure.azure-storage-domain-hint": "Введите домен хранения или оставьте пустым для значения по умолчанию «blob.core.windows.net».", - "feedback.validation.azure.container": "Контейнер", - "feedback.validation.azure.container-hint": "Введите имя контейнера", - "feedback.validation.azure.object-name-prefix": "Префикс имени объекта", - "feedback.validation.azure.object-name-prefix-hint": "Введите префикс имени объекта или оставьте пустым.", - "feedback.validation.azure.sas-token": "Токен SAS", - "feedback.validation.azure.sas-token-hint": "Введите секретный токен SAS", - "feedback.validation.azure.storage-account": "Учетная запись хранения", - "feedback.validation.azure.storage-account-hint": "Введите имя учетной записи хранения", - "feedback.validation.b2.bucket-name": "Ведро Б2", - "feedback.validation.b2.bucket-name-hint": "Введите название сегмента", - "feedback.validation.b2.key": "Ключ", - "feedback.validation.b2.key-hint": "Введите секретный ключ приложения или аккаунта", - "feedback.validation.b2.key-id": "Идентификатор ключа", - "feedback.validation.b2.key-id-hint": "Введите идентификатор ключа приложения или учетной записи", - "feedback.validation.b2.object-name-prefix": "Префикс имени объекта", - "feedback.validation.b2.object-name-prefix-hint": "Введите префикс имени объекта или оставьте пустым.", - "feedback.validation.gcs.bucket-name": "Сегмент ГКС", - "feedback.validation.gcs.bucket-name-hint": "Введите название сегмента", - "feedback.validation.gcs.credentials-file": "Файл учетных данных", - "feedback.validation.gcs.credentials-file-hint": "Введите имя файла JSON учетных данных", - "feedback.validation.gcs.credentials-json": "Учетные данные JSON", - "feedback.validation.gcs.credentials-json-paste": "Вставьте сюда учетные данные JSON.", - "feedback.validation.gcs.object-name-prefix": "Префикс имени объекта", - "feedback.validation.gcs.object-name-prefix-hint": "Введите префикс имени объекта или оставьте пустым.", "feedback.validation.invalid-times-of-day": "Неверное время суток", - "feedback.validation.local.directory-path": "Путь к каталогу", - "feedback.validation.local.directory-path-hint": "Введите путь к каталогу, в котором вы хотите хранить файлы репозитория.", "feedback.validation.optional.valid-number-or-empty": "Должно быть действительным числом или пустым.", "feedback.validation.passwords-dont-match": "Пароли не совпадают", - "feedback.validation.rclone.rclone-executable-path": "Путь к исполняемому файлу Rclone", - "feedback.validation.rclone.rclone-executable-path-hint": "Введите путь к исполняемому файлу rclone", - "feedback.validation.rclone.rclone-remote-path": "Rclone удаленный путь", - "feedback.validation.rclone.rclone-remote-path-hint": "Введите <имя-удаленного клона>:<путь>", - "feedback.validation.repository-server.server-address": "Адрес сервера", - "feedback.validation.repository-server.server-address-hint": "Введите URL-адрес сервера (https://<хост>:порт)", - "feedback.validation.repository-server.server-certificate-fingerprint": "Отпечаток сертификата доверенного сервера (SHA256)", - "feedback.validation.repository-server.server-certificate-fingerprint-hint": "Введите отпечаток сертификата доверенного сервера, распечатанный при запуске сервера.", - "feedback.validation.repository-token.token": "Токен", - "feedback.validation.repository-token.token-hint": "Вставить токен подключения", "feedback.validation.required.directory": "Обязательное поле", "feedback.validation.required.field": "Обязательное поле", - "feedback.validation.required.hostname": "Имя хоста", - "feedback.validation.required.hostname-hint": "Переопределите это значение при восстановлении снимка, сделанного на другом компьютере.", - "feedback.validation.required.password-repository": "Пароль репозитория", - "feedback.validation.required.password-repository-help": "Используется для шифрования содержимого репозитория.", - "feedback.validation.required.password-repository-hint": "Введите пароль репозитория", - "feedback.validation.required.repository-password-confirm": "Подтвердите пароль репозитория", - "feedback.validation.required.repository-password-confirm-again": "введите пароль хранилища еще раз", - "feedback.validation.required.server-password": "Пароль сервера", - "feedback.validation.required.server-password-hint": "Введите пароль для подключения к серверу", - "feedback.validation.required.username": "Имя пользователя", - "feedback.validation.required.username-hint": "Переопределите это при восстановлении снимка, сделанного другим пользователем.", "feedback.validation.required.valid-number-or-empty": "Должно быть действительным числом или пустым.", - "feedback.validation.s3.access-key-id": "Идентификатор ключа доступа", - "feedback.validation.s3.access-key-id-hint": "Введите идентификатор ключа доступа", - "feedback.validation.s3.bucket-name": "Ведро", - "feedback.validation.s3.bucket-name-hint": "Введите название сегмента", - "feedback.validation.s3.object-name-prefix": "Префикс имени объекта", - "feedback.validation.s3.override-region": "Переопределить регион", - "feedback.validation.s3.override-region-hint": "Введите конкретный регион (например, us-west-1) или оставьте пустым.", - "feedback.validation.s3.secret-access-key": "Секретный ключ доступа", - "feedback.validation.s3.secret-access-key-hint": "Введите секретный ключ доступа", - "feedback.validation.s3.server-endpoint": "Конечная точка сервера", - "feedback.validation.s3.server-endpoint-hint": "Введите адрес сервера (например, s3.amazonaws.com)", - "feedback.validation.s3.session-token": "Токен сеанса", - "feedback.validation.s3.session-token-hint": "Введите токен сеанса или оставьте пустым", - "feedback.validation.webdav.password": "Пароль", - "feedback.validation.webdav.password-hint": "Введите пароль", - "feedback.validation.webdav.server-url": "URL-адрес сервера WebDAV", - "feedback.validation.webdav.username": "Имя пользователя", - "feedback.validation.webdav.username-hint": "Введите имя пользователя", - "policies.feedback.find.count_one": "Найдено {{count}} политики, соответствующей критериям.", - "policies.feedback.find.count_other": "Найдено {{count}} политик, соответствующих критериям.", - "policies.feedback.find.none": "Политики не найдены.", - "policies.feedback.find.none.create": "Политика для каталога {{path}} не найдена. \nПожалуйста, настройте новую политику.", - "policies.feedback.loading": "Загрузка...", - "policies.feedback.path.absolute": "Политики могут быть определены только для абсолютных путей.", - "policies.feedback.policy.find": "Введите каталог, чтобы найти или установить политику", - "policies.kind.all": "Все политики", - "policies.kind.applicable": "Применимые политики", - "policies.kind.global": "Глобальная политика", - "policies.kind.host": "Политики для каждого хоста", - "policies.kind.local": "Местная политика", - "policies.kind.user": "Политики для каждого пользователя", - "repository.attribute.algorithm.eco": "Алгоритм коррекции ошибок", - "repository.attribute.algorithm.encryption": "Алгоритм шифрования", - "repository.attribute.algorithm.hash": "Алгоритм хеширования", - "repository.attribute.algorithm.splitter": "Алгоритм разделения", - "repository.attribute.compression.internal": "Внутреннее сжатие", - "repository.attribute.config.file": "Файл конфигурации", - "repository.attribute.connected.as": "Подключено как", - "repository.attribute.eco": "Коррекция ошибок", - "repository.attribute.format": "Формат репозитория", - "repository.attribute.provider": "Поставщик", - "repository.attribute.server.url": "URL сервера", - "repository.event.connection.cancel": "Отменить подключение", - "repository.event.connection.disconnect": "Отключиться от репозитория", - "repository.event.description.update": "Обновить описание", - "repository.feedback.compression.internal.not.supported": "нет", - "repository.feedback.compression.internal.supported": "да", - "repository.feedback.description.required": "Требуется описание репозитория", - "repository.feedback.eco.disabled": "Отключено", - "repository.feedback.read.only": "Репозиторий доступен только для чтения", - "repository.status.connected": "Подключено к репозиторию", - "repository.status.initializing": "Инициализация репозитория...", - "snapshot.event.create.estimate": "Оценивать", - "snapshot.event.create.now": "Снимок сейчас", - "snapshot.event.create.path": "Введите путь к снимку", - "snapshot.event.create.path.resolve": "Необходимо указать каталог для снимка.", - "snapshot.event.delete.selected_one": "Вы хотите удалить выбранный снимок {{count}}?", - "snapshot.event.delete.selected_other": "Вы хотите удалить выбранные снимки ({{count}})?", - "snapshot.event.directory.browse": "Просматривать", - "snapshot.event.directory.browsing": "Просмотр каталогов не поддерживается в веб-браузере. \nИспользуйте интерфейс Копиа.", - "snapshot.event.directory.mount": "Монтировать как локальную файловую систему", - "snapshot.event.directory.restore": "Восстановление файлов и каталогов", - "snapshot.event.directory.unmount": "Размонтировать", - "snapshot.event.history.delete.source": "Удалить источник снимка", - "snapshot.event.history.description.update": "{{description}} – нажмите, чтобы обновить описание снимка.", - "snapshot.event.history.deselect.all": "Убрать выделение со всего", - "snapshot.event.history.fetch.snapshots": "Получить снимки", - "snapshot.event.history.pin.add": "Добавьте булавку, чтобы защитить снимок от удаления", - "snapshot.event.history.select.all": "Выбрать все", - "snapshot.event.history.selected.delete": "Удалить выбранное (", - "snapshot.event.restore": "Восстановить", - "snapshot.event.restore.begin": "Начать восстановление", - "snapshot.event.snapshot.new": "Новый снимок", - "snapshot.event.snapshot.pending": "Ожидание", - "snapshot.event.snapshot.policy": "Политика", - "snapshot.event.synchronize": "Синхронизировать", - "snapshot.feedback.directory.mount.restore": "Вы можете смонтировать/восстановить все файлы и каталоги, которые вы видите ниже, или восстановить файлы по отдельности.", - "snapshot.feedback.history.display": "Отображение", - "snapshot.feedback.history.wipe.all": "Сотрите все снимки и политику для этого источника.", - "snapshot.feedback.restore.continue.errors": "Продолжить при возникновении ошибок", - "snapshot.feedback.restore.continue.errors.help": "При возникновении ошибки восстановления попробуйте продолжить, а не прекращать операцию.", - "snapshot.feedback.restore.destination": "Назначение", - "snapshot.feedback.restore.destination.help": "Вы также можете восстановить в файл .zip или .tar, указав соответствующее расширение.", - "snapshot.feedback.restore.destination.path": "Введите путь назначения", - "snapshot.feedback.restore.directory.overwrite": "Перезаписать директории", - "snapshot.feedback.restore.disable.compression.zip": "Отключить сжатие ZIP", - "snapshot.feedback.restore.disable.compression.zip.help": "Не сжимать при восстановлении в файл ZIP (быстрее).", - "snapshot.feedback.restore.file.atomically": "Записывать файлы атомарно", - "snapshot.feedback.restore.file.modification.time": "Восстановить время изменения файлов", - "snapshot.feedback.restore.file.overwrite": "Перезаписать файлы", - "snapshot.feedback.restore.file.ownership": "Восстановить владение файлами", - "snapshot.feedback.restore.file.permission": "Восстановить разрешения файлов", - "snapshot.feedback.restore.file.sparse": "Записывать разреженные файлы", - "snapshot.feedback.restore.link.overwrite": "Перезаписать символические ссылки", - "snapshot.feedback.restore.shallow.depth": "Поверхностное восстановление на определенной глубине", - "snapshot.feedback.restore.shallow.file.size.minimal": "Минимальный размер файла для поверхностного восстановления", - "snapshot.feedback.restore.skip": "Пропустить ранее восстановленные файлы и символические ссылки", - "snapshot.feedback.restore.task.go": "Перейти к задаче восстановления", - "snapshot.feedback.snapshot.new": "Новый снимок", - "snapshot.feedback.snapshot.start": "Снимок начнется после завершения предыдущего снимка", - "snapshot.header.actions": "Действия", - "snapshot.header.snapshot.last": "Последний снимок", - "snapshot.header.snapshot.next": "Следующий снимок", - "snapshot.header.snapshot.owner": "Владелец", - "snapshot.header.snapshot.path": "Путь", - "snapshot.header.snapshot.size": "Размер", - "snapshot.header.status": "Статус", - "snapshot.history.feedack.unfiltered.count_one": "Показать {{count}} отдельный снимок", - "snapshot.history.feedack.unfiltered.count_other": "Показать {{count}} отдельных снимков", - "snapshot.history.header.description": "Описание", - "snapshot.history.header.directories": "Дирс", - "snapshot.history.header.files": "Файлы", - "snapshot.history.header.retention": "Удержание", - "snapshot.history.header.root": "Корень", - "snapshot.history.header.selected": "Выбрано", - "snapshot.history.header.size": "Размер", - "snapshot.history.header.time.start": "Время начала", - "task.all": "Все", - "task.event.stop": "Остановить", - "task.failed": "Не удалось", - "task.feedback.entries": "Список задач появится здесь при создании снимков, восстановлении, выполнении обслуживания и т. д.", - "task.feedback.search": "Поиск по описанию", - "task.header.counter": "Счетчик", - "task.header.description": "Описание", - "task.header.kind": "Тип", - "task.header.status": "Статус", - "task.header.time.start": "Время начала", - "task.header.value": "Значение", - "task.loading": "Загрузка...", - "task.logs": "Логи", - "task.running": "Выполняются", - "task.status.canceled": "Задача отменена после", - "task.status.canceling": "Отмена", - "task.status.error": "Ошибка задачи", - "task.status.finished": "Завершено", - "task.status.running.for": "Задача выполняется в течение", - "task.status.started": "Начало", - "task.status.succeed.after": "Задача успешно завершена после", - "validation.password": "Пароль", - "validation.password-hint": "Введите пароль", - "validation.provider.external-ssh-command": "Запустите внешнюю SSH-команду без пароля.", - "validation.provider.external-ssh-command-hint": "По умолчанию Kopia подключается к серверу с помощью внутреннего SSH-клиента, который поддерживает ограниченные возможности. \nВ качестве альтернативы он может запустить внешнюю команду SSH без пароля, которая поддерживает дополнительные параметры, но, как правило, менее эффективна, чем встроенный клиент.", - "validation.provider.host": "Хозяин", - "validation.provider.host-hint": "имя хоста ssh (например, example.com)", - "validation.provider.key-data": "Ключевые данные", - "validation.provider.key-data-hint": "Вставьте содержимое ключевого файла", - "validation.provider.known-host-data": "Данные об известных хостах", - "validation.provider.known-host-data-hint": "Вставьте содержимое файлаknown_hosts.", - "validation.provider.path": "Путь", - "validation.provider.path-hint": "Введите удаленный путь к репозиторию, например, «/mnt/data/repository».", - "validation.provider.path-host-file": "Путь к файлуknown_hosts", - "validation.provider.path-host-file-hint": "Введите путь к файлуknown_hosts", - "validation.provider.path-key-file": "Путь к ключевому файлу", - "validation.provider.path-key-file-hint": "Введите путь к файлу ключа", - "validation.provider.port": "Порт", - "validation.provider.port-hint": "Номер порта (например, 22)", - "validation.provider.ssh-arguments": "SSH-аргументы", - "validation.provider.ssh-arguments-hint": "Введите аргументы команды SSH (user@host -s sftp будет добавлен автоматически)", - "validation.provider.ssh-command": "SSH-команда", - "validation.provider.ssh-command-hint": "Предоставьте для выполнения команду SSH без пароля (обычно «ssh»).", - "validation.provider.user": "Пользователь", - "validation.provider.user-hint": "Имя пользователя", "value.algorithm.eco-disabled": "Неполноценный", "value.algorithm.suffix-not-recommended": "(НЕ РЕКОМЕНДУЕТСЯ)", "value.algorithm.suffix-recommended": "(РЕКОМЕНДУЕМЫЕ)", @@ -458,8 +455,8 @@ "value.policy.optional": "Игнорировать неудачи", "value.provider.s3.http-connection-insecure": "Использовать HTTP-соединение (небезопасно)", "value.provider.s3.no-tls-verification": "Не проверять сертификат TLS", - "value.repository.format.latest": "Последний формат", - "value.repository.format.legacy": "Устаревший формат, совместимый с версией 0.8.", + "value.repository.latest-format": "Последний формат", + "value.repository.legacy-format": "Устаревший формат, совместимый с версией 0.8.", "value.snapshot-frequency.10-minutes": "каждые 10 минут", "value.snapshot-frequency.12-hours": "каждые 12 часов", "value.snapshot-frequency.15-minutes": "каждые 15 минут", diff --git a/src/components/DirectoryItems.jsx b/src/components/DirectoryItems.jsx index a0c6557f..3fcd875c 100644 --- a/src/components/DirectoryItems.jsx +++ b/src/components/DirectoryItems.jsx @@ -38,30 +38,30 @@ export class DirectoryItems extends Component { const { bytesStringBase2 } = this.context; const columns = [{ id: "name", - Header: i18n.t('feedback.header.name'), + Header: i18n.t('feedback.directory.header.name'), width: "", accessor: x => directoryLinkOrDownload(x, this.props.historyState), }, { id: "mtime", accessor: "mtime", - Header: i18n.t('feedback.header.modification-last'), + Header: i18n.t('feedback.directory.header.last-modification'), width: 200, Cell: x => rfc3339TimestampForDisplay(x.cell.value), }, { id: "size", accessor: x => sizeInfo(x), - Header: i18n.t('feedback.header.size'), + Header: i18n.t('feedback.directory.header.size'), width: 100, Cell: x => sizeWithFailures(x.cell.value, x.row.original.summ, bytesStringBase2), }, { id: "files", accessor: "summ.files", - Header: i18n.t('feedback.header.files'), + Header: i18n.t('feedback.directory.header.files'), width: 100, }, { id: "dirs", accessor: "summ.dirs", - Header: i18n.t('feedback.header.directories'), + Header: i18n.t('feedback.directory.header.directories'), width: 100, }] diff --git a/src/components/Logs.jsx b/src/components/Logs.jsx index 44699f0f..5f78a8bd 100644 --- a/src/components/Logs.jsx +++ b/src/components/Logs.jsx @@ -106,7 +106,7 @@ export class Logs extends Component { return

{error.message}

; } if (isLoading) { - return

{i18n.t('common.loading')}

; + return

{i18n.t('common.label.loading')}

; } if (logs) { diff --git a/src/components/SetupRepository.jsx b/src/components/SetupRepository.jsx index c2e5fc70..e37a6fcb 100644 --- a/src/components/SetupRepository.jsx +++ b/src/components/SetupRepository.jsx @@ -317,9 +317,9 @@ export class SetupRepository extends Component { {this.connectionErrorInfo()}
- +   - + {this.loadingSpinner()} ; } @@ -327,7 +327,7 @@ export class SetupRepository extends Component { toggleAdvancedButton() { // Determine button icon and text based upon component state. const icon = this.state.showAdvanced ? faAngleDoubleUp : faAngleDoubleDown; - const text = this.state.showAdvanced ? i18n.t('event.repository.advanced-options-hide') : i18n.t('event.repository.advanced-options.show'); + const text = this.state.showAdvanced ? i18n.t('event.repository.hide-advanced-options') : i18n.t('event.repository.show-advanced-options'); return
- {i18n.t('feedback.repository.eec-warning')} {i18n.t('common.click-here-to-learn-more')}. + {i18n.t('feedback.repository.eec-warning')} {i18n.t('common.action.click-here-to-learn-more')}.
@@ -443,7 +443,7 @@ export class SetupRepository extends Component {
{this.connectionErrorInfo()}
- + {' '} {this.loadingSpinner()} @@ -452,8 +452,8 @@ export class SetupRepository extends Component { overrideUsernameHostnameRow() { return - {RequiredField(this, i18n.t('feedback.validation.required.username'), "username", {}, i18n.t('feedback.validation.required.username-hint'))} - {RequiredField(this, i18n.t('feedback.validation.required.hostname'), "hostname", {}, i18n.t('feedback.validation.required.hostname-hint'))} + {RequiredField(this, i18n.t('feedback.repository.username'), "username", {}, i18n.t('feedback.repository.username-hint'))} + {RequiredField(this, i18n.t('feedback.repository.hostname'), "hostname", {}, i18n.t('feedback.repository.hostname-hint'))} ; } @@ -480,8 +480,8 @@ export class SetupRepository extends Component {
- {(this.state.provider !== "_token" && this.state.provider !== "_server") && RequiredField(this, i18n.t('feedback.validation.required.password-repository'), "password", { autoFocus: true, type: "password", placeholder: i18n.t('feedback.validation.required.password-repository-hint') }, i18n.t('feedback.validation.required.password-repository-help'))} - {this.state.provider === "_server" && RequiredField(this, i18n.t('feedback.validation.required.server-password'), "password", { autoFocus: true, type: "password", placeholder: i18n.t('feedback.validation.required.server-password-hint') })} + {(this.state.provider !== "_token" && this.state.provider !== "_server") && RequiredField(this, i18n.t('feedback.repository.repository-password'), "password", { autoFocus: true, type: "password", placeholder: i18n.t('feedback.repository.enter-repository-password') }, i18n.t('feedback.repository.repository-password-help'))} + {this.state.provider === "_server" && RequiredField(this, i18n.t('feedback.repository.server-password'), "password", { autoFocus: true, type: "password", placeholder: i18n.t('feedback.repository.server-password-hint') })}
@@ -499,7 +499,7 @@ export class SetupRepository extends Component { {this.connectionErrorInfo()}
- + {' '} {this.loadingSpinner()} diff --git a/src/components/SetupRepositoryAzure.jsx b/src/components/SetupRepositoryAzure.jsx index b9055d8c..ceb9660d 100644 --- a/src/components/SetupRepositoryAzure.jsx +++ b/src/components/SetupRepositoryAzure.jsx @@ -22,18 +22,18 @@ export class SetupRepositoryAzure extends Component { render() { return <> - {RequiredField(this, i18n.t('feedback.validation.azure.container'), "container", { autoFocus: true, placeholder: i18n.t('feedback.validation.azure.container-hint') })} - {OptionalField(this, i18n.t('feedback.validation.azure.object-name-prefix'), "prefix", { placeholder: i18n.t('feedback.validation.azure.object-name-prefix-hint') })} + {RequiredField(this, i18n.t('feedback.provider.azure.container'), "container", { autoFocus: true, placeholder: i18n.t('feedback.provider.azure.enter-container-name') })} + {OptionalField(this, i18n.t('feedback.provider.azure.object-name-prefix'), "prefix", { placeholder: i18n.t('feedback.provider.azure.enter-object-name-prefix') })}
- {RequiredField(this, i18n.t('feedback.validation.azure.storage-account'), "storageAccount", { placeholder: i18n.t('feedback.validation.azure.storage-account-hint') })} - {OptionalField(this, i18n.t('feedback.validation.azure.access-key'), "storageKey", { placeholder: i18n.t('feedback.validation.azure.access-key-hint'), type: "password" })} + {RequiredField(this, i18n.t('feedback.provider.azure.storage-account'), "storageAccount", { placeholder: i18n.t('feedback.provider.azure.enter-storage-account') })} + {OptionalField(this, i18n.t('feedback.provider.azure.access-key'), "storageKey", { placeholder: i18n.t('feedback.provider.azure.enter-access-key'), type: "password" })}
- {OptionalField(this, i18n.t('feedback.validation.azure.azure-storage-domain'), "storageDomain", { placeholder: i18n.t('feedback.validation.azure.azure-storage-domain-hint') })} - {OptionalField(this, i18n.t('feedback.validation.azure.sas-token'), "sasToken", { placeholder: i18n.t('feedback.validation.azure.sas-token-hint'), type: "password" })} + {OptionalField(this, i18n.t('feedback.provider.azure.azure-storage-domain'), "storageDomain", { placeholder: i18n.t('feedback.provider.azure.enter-azure-storage-domain') })} + {OptionalField(this, i18n.t('feedback.provider.azure.sas-token'), "sasToken", { placeholder: i18n.t('feedback.provider.azure.enter-sas-token'), type: "password" })} ; } diff --git a/src/components/SetupRepositoryB2.jsx b/src/components/SetupRepositoryB2.jsx index 54460254..626b399f 100644 --- a/src/components/SetupRepositoryB2.jsx +++ b/src/components/SetupRepositoryB2.jsx @@ -22,16 +22,16 @@ export class SetupRepositoryB2 extends Component { render() { return <> - {RequiredField(this, i18n.t('feedback.validation.b2.bucket-name'), "bucket", { autoFocus: true, placeholder: i18n.t('feedback.validation.b2.bucket-name-hint') })} + {RequiredField(this, i18n.t('feedback.provider.b2.bucket-name'), "bucket", { autoFocus: true, placeholder: i18n.t('feedback.provider.b2.enter-bucket-name') })}
- {RequiredField(this, i18n.t('feedback.validation.b2.key-id'), "keyId", { placeholder: i18n.t('feedback.validation.b2.key-id-hint') })} - {RequiredField(this, i18n.t('feedback.validation.b2.key'), "key", { placeholder: i18n.t('feedback.validation.b2.key-hint'), type: "password" })} + {RequiredField(this, i18n.t('feedback.provider.b2.key-id'), "keyId", { placeholder: i18n.t('feedback.provider.b2.enter-account-key-id') })} + {RequiredField(this, i18n.t('feedback.provider.b2.key'), "key", { placeholder: i18n.t('feedback.provider.b2.enter-account-key'), type: "password" })}
- {OptionalField(this, i18n.t('feedback.validation.b2.object-name-prefix'), "prefix", { placeholder: i18n.t('feedback.validation.b2.object-name-prefix-hint') })} + {OptionalField(this, i18n.t('feedback.provider.b2.object-name-prefix'), "prefix", { placeholder: i18n.t('feedback.provider.b2.enter-object-name-prefix') })} ; } diff --git a/src/components/SetupRepositoryFilesystem.jsx b/src/components/SetupRepositoryFilesystem.jsx index 5b14fa2a..157b0db1 100644 --- a/src/components/SetupRepositoryFilesystem.jsx +++ b/src/components/SetupRepositoryFilesystem.jsx @@ -19,7 +19,7 @@ export class SetupRepositoryFilesystem extends Component { render() { return <> - {RequiredDirectory(this, i18n.t('feedback.validation.local.directory-path'), "path", { autoFocus: true, placeholder: i18n.t('feedback.validation.local.directory-path-hint')})} + {RequiredDirectory(this, i18n.t('feedback.provider.filesystem.directory-path'), "path", { autoFocus: true, placeholder: i18n.t('feedback.provider.filesystem.enter-directory-path')})} ; } } diff --git a/src/components/SetupRepositoryGCS.jsx b/src/components/SetupRepositoryGCS.jsx index e847a3c2..e9b26194 100644 --- a/src/components/SetupRepositoryGCS.jsx +++ b/src/components/SetupRepositoryGCS.jsx @@ -22,16 +22,16 @@ export class SetupRepositoryGCS extends Component { render() { return <> - {RequiredField(this, i18n.t('feedback.validation.gcs.bucket-name'), "bucket", { autoFocus: true, placeholder: i18n.t('feedback.validation.gcs.bucket-name-hint') })} - {OptionalField(this, i18n.t('feedback.validation.gcs.object-name-prefix'), "prefix", { placeholder: i18n.t('feedback.validation.gcs.object-name-prefix-hint'), type: "password" })} + {RequiredField(this, i18n.t('feedback.provider.gcs.bucket-name'), "bucket", { autoFocus: true, placeholder: i18n.t('feedback.provider.gcs.enter-bucket-name') })} + {OptionalField(this, i18n.t('feedback.provider.gcs.object-name-prefix'), "prefix", { placeholder: i18n.t('feedback.provider.gcs.enter-object-name-prefix'), type: "password" })}
- {OptionalField(this, i18n.t('feedback.validation.gcs.credentials-file'), "credentialsFile", { placeholder: i18n.t('feedback.validation.gcs.credentials-file-hint') })} + {OptionalField(this, i18n.t('feedback.provider.gcs.credentials-file'), "credentialsFile", { placeholder: i18n.t('feedback.provider.gcs.enter-credentials-file-name') })}
- {OptionalField(this, i18n.t('feedback.validation.gcs.credentials-json'), "credentials", { placeholder: i18n.t('feedback.validation.gcs.credentials-json-paste'), as: "textarea", rows: 5 })} + {OptionalField(this, i18n.t('feedback.provider.gcs.credentials-json'), "credentials", { placeholder: i18n.t('feedback.prodiver.gcs.paste-json-credentials'), as: "textarea", rows: 5 })} ; } diff --git a/src/components/SetupRepositoryRclone.jsx b/src/components/SetupRepositoryRclone.jsx index ce17563c..68796f15 100644 --- a/src/components/SetupRepositoryRclone.jsx +++ b/src/components/SetupRepositoryRclone.jsx @@ -22,11 +22,11 @@ export class SetupRepositoryRclone extends Component { render() { return <> - {RequiredField(this, i18n.t('feedback.validation.rclone.rclone-remote-path'), "remotePath", { autoFocus: true, placeholder: i18n.t('feedback.validation.rclone.rclone-remote-path-hint') })} + {RequiredField(this, i18n.t('feedback.provider.rclone.rclone-remote-path'), "remotePath", { autoFocus: true, placeholder: i18n.t('feedback.provider.rclone.rclone-remote-path-hint') })}
- {OptionalField(this, i18n.t('feedback.validation.rclone.rclone-executable-path'), "rcloneExe", { placeholder: i18n.t('feedback.validation.rclone.rclone-executable-path-hint') })} + {OptionalField(this, i18n.t('feedback.provider.rclone.rclone-executable-path'), "rcloneExe", { placeholder: i18n.t('feedback.provider.rclone.rclone-executable-path-hint') })} ; } diff --git a/src/components/SetupRepositoryS3.jsx b/src/components/SetupRepositoryS3.jsx index 50a122ab..0c9c8216 100644 --- a/src/components/SetupRepositoryS3.jsx +++ b/src/components/SetupRepositoryS3.jsx @@ -25,9 +25,9 @@ export class SetupRepositoryS3 extends Component { render() { return <> - {RequiredField(this, i18n.t('feedback.validation.s3.bucket-name'), "bucket", { autoFocus: true, placeholder: i18n.t('feedback.validation.s3.bucket-name-hint') })} - {RequiredField(this, i18n.t('feedback.validation.s3.server-endpoint'), "endpoint", { placeholder: i18n.t('feedback.validation.s3.server-endpoint-hint') })} - {OptionalField(this, i18n.t('feedback.validation.s3.override-region'), "region", { placeholder: i18n.t('feedback.validation.s3.override-region-hint') })} + {RequiredField(this, i18n.t('feedback.provider.s3.bucket-name'), "bucket", { autoFocus: true, placeholder: i18n.t('feedback.provider.s3.bucket-name-hint') })} + {RequiredField(this, i18n.t('feedback.provider.s3.server-endpoint'), "endpoint", { placeholder: i18n.t('feedback.provider.s3.server-endpoint-hint') })} + {OptionalField(this, i18n.t('feedback.provider.s3.override-region'), "region", { placeholder: i18n.t('feedback.provider.s3.override-region-hint') })}
@@ -36,13 +36,13 @@ export class SetupRepositoryS3 extends Component {
- {RequiredField(this, i18n.t('feedback.validation.s3.access-key-id'), "accessKeyID", { placeholder: i18n.t('feedback.validation.s3.access-key-id-hint') })} - {RequiredField(this, i18n.t('feedback.validation.s3.secret-access-key'), "secretAccessKey", { placeholder: i18n.t('feedback.validation.s3.secret-access-key-hint'), type: "password" })} - {OptionalField(this, i18n.t('feedback.validation.s3.session-token'), "sessionToken", { placeholder: i18n.t('feedback.validation.s3.session-token-hint'), type: "password" })} + {RequiredField(this, i18n.t('feedback.provider.s3.access-key-id'), "accessKeyID", { placeholder: i18n.t('feedback.provider.s3.access-key-id-hint') })} + {RequiredField(this, i18n.t('feedback.provider.s3.secret-access-key'), "secretAccessKey", { placeholder: i18n.t('feedback.provider.s3.secret-access-key-hint'), type: "password" })} + {OptionalField(this, i18n.t('feedback.provider.s3.session-token'), "sessionToken", { placeholder: i18n.t('feedback.provider.s3.session-token-hint'), type: "password" })}
- {OptionalField(this, i18n.t('feedback.validation.s3.object-name-prefix'), "prefix", { placeholder: i18n.t('enter-object-name-prefix-or-leave-empty-hint') })} + {OptionalField(this, i18n.t('feedback.provider.s3.object-name-prefix'), "prefix", { placeholder: i18n.t('feedback.provider.s3.enter-object-name-prefix-hint') })} ; } diff --git a/src/components/SetupRepositorySFTP.jsx b/src/components/SetupRepositorySFTP.jsx index ca50684a..6d7b39c6 100644 --- a/src/components/SetupRepositorySFTP.jsx +++ b/src/components/SetupRepositorySFTP.jsx @@ -59,34 +59,34 @@ export class SetupRepositorySFTP extends Component { render() { return <> - {RequiredField(this, i18n.t('validation.provider.host'), "host", { autoFocus: true, placeholder: i18n.t('validation.provider.host-hint') })} - {RequiredField(this, i18n.t('validation.provider.user'), "username", { placeholder: i18n.t('validation.provider.user-hint') })} - {OptionalNumberField(this, i18n.t('validation.provider.port'), "port", { placeholder: i18n.t('validation.provider.port-hint') })} + {RequiredField(this, i18n.t('feedback.provider.sftp.host'), "host", { autoFocus: true, placeholder: i18n.t('feedback.provider.sftp.enter-ssh-host-name') })} + {RequiredField(this, i18n.t('feedback.provider.sftp.user'), "username", { placeholder: i18n.t('feedback.provider.sftp.user-name') })} + {OptionalNumberField(this, i18n.t('feedback.provider.sftp.port'), "port", { placeholder: i18n.t('feedback.provider.sftp.port-number') })}
- {RequiredField(this, i18n.t('validation.provider.path'), "path", { placeholder: i18n.t('validation.provider.path-hint') })} + {RequiredField(this, i18n.t('feedback.provider.sftp.path'), "path", { placeholder: i18n.t('feedback.provider.sftp.enter-remote-path') })}
{!this.state.externalSSH && <> - {OptionalField(this, i18n.t('validation.password'), "password", { type: "password", placeholder: i18n.t('validation.password-hint') })} + {OptionalField(this, i18n.t('feedback.provider.sftp.password'), "password", { type: "password", placeholder: i18n.t('feedback.provider.sftp.enter-password') })}
- {OptionalField(this, i18n.t('validation.provider.path-key-file'), "keyfile", { placeholder: i18n.t('validation.provider.path-key-file-hint') })} - {OptionalField(this, i18n.t('validation.provider.path-host-file'), "knownHostsFile", { placeholder: i18n.t('validation.provider.path-host-file-hint') })} + {OptionalField(this, i18n.t('feedback.provider.sftp.path-key-file'), "keyfile", { placeholder: i18n.t('feedback.provider.sftp.enter-path-to-key-file') })} + {OptionalField(this, i18n.t('feedback.provider.sftp.path-host-file'), "knownHostsFile", { placeholder: i18n.t('feedback.provider.sftp.enter-path-host-file') })}
- {OptionalField(this, i18n.t('validation.provider.key-data'), "keyData", { - placeholder: i18n.t('validation.provider.key-data-hint'), + {OptionalField(this, i18n.t('feedback.provider.sftp-key-data'), "keyData", { + placeholder: i18n.t('feedback.provider.sftp-key-data-hint'), as: "textarea", rows: 5, isInvalid: this.state.validated && !this.state.externalSSH && !hasExactlyOneOf(this, ["password", "keyfile", "keyData"]), }, )} - {OptionalField(this, i18n.t('validation.provider.known-host-data'), "knownHostsData", { - placeholder: i18n.t('validation.provider.known-host-data-hint'), + {OptionalField(this, i18n.t('feedback.provider.sftp.known-host-data'), "knownHostsData", { + placeholder: i18n.t('feedback.provider.sftp.paste-content-of-known-host'), as: "textarea", rows: 5, isInvalid: this.state.validated && !this.state.externalSSH && !hasExactlyOneOf(this, ["knownHostsFile", "knownHostsData"]), @@ -94,11 +94,11 @@ export class SetupRepositorySFTP extends Component {
} - {RequiredBoolean(this, i18n.t('validation.provider.external-ssh-command'), "externalSSH", i18n.t('validation.provider.external-ssh-command-hint'))} + {RequiredBoolean(this, i18n.t('feedback.provider.sftp.launch-external-ssh-command'), "externalSSH", i18n.t('feedback.provider.sftp.launch-external-ssh-command-hint'))}
{this.state.externalSSH && <> - {OptionalField(this, i18n.t('validation.provider.ssh-command'), "sshCommand", { placeholder: i18n.t('validation.provider.ssh-command-hint') })} - {OptionalField(this, i18n.t('validation.provider.ssh-arguments'), "sshArguments", { placeholder: i18n.t('validation.provider.ssh-arguments-hint') })} + {OptionalField(this, i18n.t('feedback.provider.sftp.ssh-command'), "sshCommand", { placeholder: i18n.t('feedback.provider.sftp.provide-passwordless-ssh-command') })} + {OptionalField(this, i18n.t('feedback.provider.sftp.ssh-arguments'), "sshArguments", { placeholder: i18n.t('feedback.provider.sftp.enter-ssh-arguments') })} } ; diff --git a/src/components/SetupRepositoryServer.jsx b/src/components/SetupRepositoryServer.jsx index 24776b64..8aeec57f 100644 --- a/src/components/SetupRepositoryServer.jsx +++ b/src/components/SetupRepositoryServer.jsx @@ -22,11 +22,11 @@ export class SetupRepositoryServer extends Component { render() { return <> - {RequiredField(this, i18n.t('feedback.validation.repository-server.server-address'), "url", { autoFocus: true, placeholder: i18n.t('feedback.validation.repository-server.server-address-hint') })} + {RequiredField(this, i18n.t('feedback.provider.repositoryserver.server-address'), "url", { autoFocus: true, placeholder: i18n.t('feedback.provider.repositoryserver.enter-server-url') })}
- {OptionalField(this, i18n.t('feedback.validation.repository-server.server-certificate-fingerprint'), "serverCertFingerprint", { placeholder: i18n.t('feedback.validation.repository-server.server-certificate-fingerprint-hint') })} + {OptionalField(this, i18n.t('feedback.provider.repositoryserver.server-certificate-fingerprint'), "serverCertFingerprint", { placeholder: i18n.t('feedback.provider.repositoryserver.enter-server-certificate-fingerprint') })} ; } diff --git a/src/components/SetupRepositoryToken.jsx b/src/components/SetupRepositoryToken.jsx index f4fcccdc..25e9c064 100644 --- a/src/components/SetupRepositoryToken.jsx +++ b/src/components/SetupRepositoryToken.jsx @@ -21,7 +21,7 @@ export class SetupRepositoryToken extends Component { render() { return <> - {RequiredField(this, i18n.t('feedback.validation.repository-token.token'), "token", { autoFocus: true, type: "password", placeholder: i18n.t('feedback.validation.repository-token.token-hint') })} + {RequiredField(this, i18n.t('feedback.provider.repositorytoken.token'), "token", { autoFocus: true, type: "password", placeholder: i18n.t('feedback.provider.repositorytoken.paste-token') })} ; } diff --git a/src/components/SetupRepositoryWebDAV.jsx b/src/components/SetupRepositoryWebDAV.jsx index cd26c989..88acd4fd 100644 --- a/src/components/SetupRepositoryWebDAV.jsx +++ b/src/components/SetupRepositoryWebDAV.jsx @@ -22,12 +22,12 @@ export class SetupRepositoryWebDAV extends Component { render() { return <> - {RequiredField(this, i18n.t('feedback.validation.webdav.server-url'), "url", { autoFocus: true, placeholder: "http[s]://server:port/path" })} + {RequiredField(this, i18n.t('feedback.provider.webdav.server-url'), "url", { autoFocus: true, placeholder: "http[s]://server:port/path" })}
- {OptionalField(this, i18n.t('feedback.validation.webdav.username'), "username", { placeholder: i18n.t('feedback.validation.webdav.username-hint') })} - {OptionalField(this, i18n.t('feedback.validation.webdav.password'), "password", { placeholder: i18n.t('feedback.validation.webdav.password-hint'), type: "password" })} + {OptionalField(this, i18n.t('feedback.provider.webdav.username'), "username", { placeholder: i18n.t('feedback.provider.webdav.enter-username') })} + {OptionalField(this, i18n.t('feedback.provider.webdav.password'), "password", { placeholder: i18n.t('feedback.provider.webdav.enter-password'), type: "password" })} ; } diff --git a/src/components/SnapshotEstimation.jsx b/src/components/SnapshotEstimation.jsx index 033c5d33..4cd54f2a 100644 --- a/src/components/SnapshotEstimation.jsx +++ b/src/components/SnapshotEstimation.jsx @@ -75,7 +75,7 @@ export class SnapshotEstimation extends Component { } if (task.status === "SUCCESS") { - return i18n.t('feedback.task.total') + return i18n.t('feedback.task.tasks-total') } if (task.status === "CANCELED") { @@ -93,12 +93,12 @@ export class SnapshotEstimation extends Component { } if (isLoading) { - return

{i18n.t('common.loading')}

; + return

{i18n.t('common.label.loading')}

; } return <> {task.counters && - } {task.status === "RUNNING" && <> - {' '} + {' '} } {this.state.showLog ? <> - + - : } - - ; + : } + ; } } SnapshotEstimation.contextType = UIPreferencesContext \ No newline at end of file diff --git a/src/components/policy-editor/PolicyEditor.jsx b/src/components/policy-editor/PolicyEditor.jsx index 33198048..65ca0a4d 100644 --- a/src/components/policy-editor/PolicyEditor.jsx +++ b/src/components/policy-editor/PolicyEditor.jsx @@ -250,7 +250,7 @@ export class PolicyEditor extends Component { } if (isLoading) { - return

{i18n.t('common.loading')}

; + return

{i18n.t('common.label.loading')}

; } return <> diff --git a/src/components/policy-editor/SectionHeaderRow.jsx b/src/components/policy-editor/SectionHeaderRow.jsx index c3fe3df1..500c94a4 100644 --- a/src/components/policy-editor/SectionHeaderRow.jsx +++ b/src/components/policy-editor/SectionHeaderRow.jsx @@ -8,7 +8,7 @@ import i18n from '../../utils/i18n'; export function SectionHeaderRow() { return -
{i18n.t('feedback.header.defined')}
+
{i18n.t('feedback.policy.header.defined')}
{i18n.t('feedback.header.effective')}
; } diff --git a/src/pages/Policies.jsx b/src/pages/Policies.jsx index 1edb8c5a..46c2124f 100644 --- a/src/pages/Policies.jsx +++ b/src/pages/Policies.jsx @@ -105,7 +105,7 @@ export class Policies extends Component { } if (!isAbsolutePath(this.state.policyPath)) { - alert(i18n.t('policies.feedback.path.absolute')); + alert(i18n.t('feedback.policy.policies-defined-by-path-absolute')); return; } @@ -175,7 +175,7 @@ export class Policies extends Component { return

{error.message}

; } if (isLoading) { - return

{i18n.t('policies.feedback.loading')}

; + return

{i18n.t('common.label.loading')}

; } let uniqueOwners = sources.reduce((a, d) => { @@ -235,18 +235,18 @@ export class Policies extends Component { width: 100, accessor: x => x.target.userName || "*", }, { - Header: i18n.t('feedback.header.host'), + Header: i18n.t('feedback.policy.header.host'), width: 100, accessor: x => x.target.host || "*", }, { - Header: i18n.t('feedback.header.path'), + Header: i18n.t('feedback.policy.header.path'), accessor: x => x.target.path || "*", }, { - Header: i18n.t('feedback.header.defined'), + Header: i18n.t('feedback.policy.header.defined'), accessor: x => this.policySummary(x), }, { id: 'edit', - Header: i18n.t('feedback.header.actions'), + Header: i18n.t('feedback.policy.header.actions'), width: 50, Cell: x => }] @@ -262,13 +262,13 @@ export class Policies extends Component { - this.selectOwner(applicablePolicies)}>{i18n.t('policies.kind.applicable')} - this.selectOwner(localPolicies)}>{i18n.t('policies.kind.local')} - this.selectOwner(allPolicies)}>{i18n.t('policies.kind.all')} + this.selectOwner(applicablePolicies)}>{i18n.t('feedback.policy.kind.applicable')} + this.selectOwner(localPolicies)}>{i18n.t('feedback.policy.kind.local')} + this.selectOwner(allPolicies)}>{i18n.t('feedback.policy.kind.all')} - this.selectOwner(globalPolicy)}>{i18n.t('policies.kind.global')} - this.selectOwner(perUserPolicies)}>{i18n.t('policies.kind.user')} - this.selectOwner(perHostPolicies)}>{i18n.t('policies.kind.host')} + this.selectOwner(globalPolicy)}>{i18n.t('feedback.policy.kind.global')} + this.selectOwner(perUserPolicies)}>{i18n.t('feedback.policy.kind.per-user-policies')} + this.selectOwner(perHostPolicies)}>{i18n.t('feedback.policy.kind.per-host-policies')} {uniqueOwners.map(v => this.selectOwner(v)}>{v})} @@ -276,10 +276,10 @@ export class Policies extends Component { {(this.state.selectedOwner === localPolicies || this.state.selectedOwner === this.state.localSourceName || this.state.selectedOwner === applicablePolicies) ? <>
- {OptionalDirectory(this, null, "policyPath", { autoFocus: true, placeholder: i18n.t('policies.feedback.policy.find') })} + {OptionalDirectory(this, null, "policyPath", { autoFocus: true, placeholder: i18n.t('feedback.policy.find-hint') })} - + : } @@ -287,11 +287,11 @@ export class Policies extends Component { } {policies.length > 0 ?
-

{i18n.t('policies.feedback.find.count', { count: policies.length })}

+

{i18n.t('feedback.policy.find-count', { count: policies.length })}.

: ((this.state.selectedOwner === localPolicies && this.state.policyPath) ?

- {i18n.t('policies.feedback.find.none.create', { path: this.state.policyPath })} -

:

{i18n.t('policies.feedback.find.none')}

)} + {i18n.t('feedback.policy.find-none-create', { path: this.state.policyPath })} +

:

{i18n.t('feedback.policy.find-none')}.

)} ; } diff --git a/src/pages/Repository.jsx b/src/pages/Repository.jsx index 114d7b56..740d7993 100644 --- a/src/pages/Repository.jsx +++ b/src/pages/Repository.jsx @@ -128,13 +128,13 @@ export class Repository extends Component { } if (this.state.status.initTaskID) { - return <>

{' '}{i18n.t('repository.status.initializing')}

+ return <>

{' '}{i18n.t('feedback.repository.repository-initializing')}

{this.state.showLog ? <> - + - : } + : }
- + ; } @@ -142,7 +142,7 @@ export class Repository extends Component { return <>

- {i18n.t('repository.status.connected')} + {i18n.t('feedback.repository.status-connected')}

@@ -156,13 +156,13 @@ export class Repository extends Component { onChange={this.handleChange} size="sm" />   - + - {i18n.t('repository.feedback.description.required')} + {i18n.t('feedback.repository.repository-description-required')} {this.state.status.readonly && - {i18n.t('repository.feedback.read.only')} + {i18n.t('feedback.repository.repository-is-read-only')} }
@@ -170,67 +170,67 @@ export class Repository extends Component { {this.state.status.apiServerURL ? <> - {i18n.t('repository.attribute.server.url')}: + {i18n.t('feedback.repository.attribute.server-url')}: : <> - {i18n.t('repository.attribute.config.file')}: + {i18n.t('feedback.repository.attribute.config-file')}:
- {i18n.t('repository.attribute.provider')}: + {i18n.t('feedback.repository.attribute.repository-provider')}: - {i18n.t('repository.attribute.algorithm.encryption')}: + {i18n.t('feedback.repository.attribute.algorithm-encryption')}: - {i18n.t('repository.attribute.algorithm.hash')}: + {i18n.t('feedback.repository.attribute.algorithm-hash')}: - {i18n.t('repository.attribute.algorithm.splitter')}: + {i18n.t('feedback.repository.attribute.algorithm-splitter')}:
- {i18n.t('repository.attribute.format')}: + {i18n.t('feedback.repository.attribute.repository-format')}: - {i18n.t('repository.attribute.eco')}: - 0 ? this.state.status.eccOverheadPercent + "%" : i18n.t('repository.feedback.eco.disabled')} /> + {i18n.t('feedback.repository.attribute.repository-eco')}: + 0 ? this.state.status.eccOverheadPercent + "%" : i18n.t('feedback.repository.eco-disabled')} /> - {i18n.t('repository.attribute.algorithm.eco')}: + {i18n.t('feedback.repository.attribute.algorithm-eco')}: - {i18n.t('repository.attribute.compression.internal')}: - + {i18n.t('feedback.repository.attribute.internal-compression')}: + }
- {i18n.t('repository.attribute.connected.as')}: + {i18n.t('feedback.repository.attribute.connected-as')}:
- + diff --git a/src/pages/SnapshotCreate.jsx b/src/pages/SnapshotCreate.jsx index e2fa6f32..966490d8 100644 --- a/src/pages/SnapshotCreate.jsx +++ b/src/pages/SnapshotCreate.jsx @@ -118,7 +118,7 @@ export class SnapshotCreate extends Component { e.preventDefault(); if (!this.state.resolvedSource.path) { - alert(i18n.t('snapshot.event.create.path.resolve')); + alert(i18n.t('feedback.snapshot.create.must-specify-path')); return } @@ -153,27 +153,27 @@ export class SnapshotCreate extends Component {
-

{i18n.t('snapshot.feedback.snapshot.new')}

+

{i18n.t('feedback.snapshot.create.snapshot-new')}


- {RequiredDirectory(this, null, "path", { autoFocus: true, placeholder: i18n.t('snapshot.event.create.path')})} + {RequiredDirectory(this, null, "path", { autoFocus: true, placeholder: i18n.t('feedback.snapshot.create.enter-path-to-snapshot-hint')})} + onClick={this.estimate}>{i18n.t('event.snapshot.estimate')} + onClick={this.snapshotNow}>{i18n.t('event.snapshot.snapshot-now')} {this.state.estimateTaskID && this.state.estimateTaskVisible && diff --git a/src/pages/SnapshotDirectory.jsx b/src/pages/SnapshotDirectory.jsx index 79645ba7..2a6e4244 100644 --- a/src/pages/SnapshotDirectory.jsx +++ b/src/pages/SnapshotDirectory.jsx @@ -92,7 +92,7 @@ export class SnapshotDirectory extends Component { browseMounted() { if (!window.kopiaUI) { - alert(i18n.t('snapshot.event.directory.browsing')); + alert(i18n.t('feedback.snapshot.directory.browsing-not-supported')); return; } @@ -129,20 +129,20 @@ export class SnapshotDirectory extends Component { {this.state.mountInfo.path ? <> - + {window.kopiaUI && <> - + } : <> - + } + {i18n.t('event.snapshot.restore-file-directories')}{' '}- {i18n.t('snapshot.feedback.directory.mount.restore')} + {i18n.t('feedback.snapshot.directory.restore-all-files-help')}
diff --git a/src/pages/SnapshotHistory.jsx b/src/pages/SnapshotHistory.jsx index 038553c6..ccd6b789 100644 --- a/src/pages/SnapshotHistory.jsx +++ b/src/pages/SnapshotHistory.jsx @@ -250,7 +250,7 @@ export class SnapshotHistory extends Component { originalSnapshotDescription: x.description, }) }} - title={i18n.t('snapshot.event.history.description.update', {description: x.description})} + title={i18n.t('event.snapshot.history.update-snapshot-description', {description: x.description})} className={x.description ? "snapshot-description-set" : "snapshot-description"}>; } @@ -261,10 +261,10 @@ export class SnapshotHistory extends Component { this.setState({ editPinFor: [x.id], originalPinName: "", - newPinName: i18n.t('feedback.pin.standard-text'), + newPinName: i18n.t('feedback.pin.do-not-delete'), }); } - } title={i18n.t('snapshot.event.history.pin.add')}>; + } title={i18n.t('feedback.pin.add-pin-to-protect')}>; } editPin(snap, pin) { @@ -332,13 +332,13 @@ export class SnapshotHistory extends Component { const columns = [{ id: 'selected', - Header: i18n.t('snapshot.history.header.selected'), + Header: i18n.t('feedback.snapshot.header.selected'), width: 20, align: "center", Cell: x =>
this.toggleSelected(x.row.original)} />
, }, { id: 'startTime', - Header: i18n.t('snapshot.history.header.time.start'), + Header: i18n.t('feedback.snapshot.header.start-time'), width: 200, accessor: x => { let timestamp = rfc3339TimestampForDisplay(x.startTime); @@ -346,18 +346,18 @@ export class SnapshotHistory extends Component { }, }, { id: 'description', - Header: i18n.t('snapshot.history.header.description'), + Header: i18n.t('feedback.snapshot.description'), width: 20, Cell: x => this.descriptionFor(x.row.original), }, { id: 'rootID', - Header: i18n.t('snapshot.history.header.root'), + Header: i18n.t('feedback.snapshot.header.root'), width: "", accessor: x => x.rootID, Cell: x => <>{x.cell.value} {x.row.original.description &&
{x.row.original.description}
}, }, { - Header: i18n.t('snapshot.history.header.retention'), + Header: i18n.t('feedback.snapshot.header.retention'), accessor: 'retention', width: "", Cell: x => @@ -368,16 +368,16 @@ export class SnapshotHistory extends Component { {this.newPinFor(x.row.original)} }, { - Header: i18n.t('snapshot.history.header.size'), + Header: i18n.t('feedback.snapshot.header.snapshot-size'), accessor: 'summary.size', width: 100, Cell: x => sizeWithFailures(x.cell.value, x.row.original.summary, bytesStringBase2), }, { - Header: i18n.t('snapshot.history.header.files'), + Header: i18n.t('feedback.snapshot.header.files'), accessor: 'summary.files', width: 100, }, { - Header: i18n.t('snapshot.history.header.directories'), + Header: i18n.t('feedback.snapshot.header.directories'), accessor: 'summary.dirs', width: 100, }] @@ -390,28 +390,28 @@ export class SnapshotHistory extends Component { {' '} {snapshots.length > 0 && (selectedElements.length < snapshots.length ? - : - )} + : + )} {' '} {selectedElements.length > 0 && <>{' '} - + } {snapshots.length === 0 && <>{' '} - + }
- {i18n.t('snapshot.feedback.history.display')} {snapshots.length !== unfilteredCount ? snapshots.length + ' out of ' + unfilteredCount : snapshots.length} snapshots of{' '}{this.state.userName}@{this.state.host}:{this.state.path} + {i18n.t('feedback.snapshot.history.snapshot-displaying')} {snapshots.length !== unfilteredCount ? snapshots.length + ' out of ' + unfilteredCount : snapshots.length} snapshots of{' '}{this.state.userName}@{this.state.host}:{this.state.path}
@@ -422,7 +422,7 @@ export class SnapshotHistory extends Component { @@ -438,15 +438,15 @@ export class SnapshotHistory extends Component { - {i18n.t('common.delete-confirm')} + {i18n.t('common.action.confirm-delete')} <> -

{i18n.t('snapshot.event.delete.selected',{count: selectedElements.length})}

+

{i18n.t('event.snapshot.delete-selected',{count: selectedElements.length})}

{selectedElements.length === snapshots.length && this.setState({ alsoDeleteSource: !this.state.alsoDeleteSource })} @@ -456,19 +456,19 @@ export class SnapshotHistory extends Component {
- - + +
- {i18n.t('feedback.description.modal-title')} + {i18n.t('feedback.snapshot.description.snapshot-description')} - {i18n.t('event.description.new')} + {i18n.t('event.snapshot.description.enter-new-description')} {this.state.savingSnapshot && } - - {this.state.originalSnapshotDescription && } - + + {this.state.originalSnapshotDescription && } + - {i18n.t('event.pin.snapshot-pin')} + {i18n.t('event.pin.pin-snapshot')} - {i18n.t('feedback.pin.name')} + {i18n.t('feedback.pin.name-of-the-pin')} {this.state.savingSnapshot && } - - {this.state.originalPinName && } - + + {this.state.originalPinName && } + ; diff --git a/src/pages/SnapshotRestore.jsx b/src/pages/SnapshotRestore.jsx index 1b9371bd..fa8fa578 100644 --- a/src/pages/SnapshotRestore.jsx +++ b/src/pages/SnapshotRestore.jsx @@ -92,71 +92,71 @@ export class SnapshotRestore extends Component { if (this.state.restoreTask) { return

- {i18n.t('snapshot.feedback.restore.task.go')}. + {i18n.t('event.snapshot.restore.go-to-restore-task')}.

; } return
- {' '}{i18n.t('snapshot.event.restore')} + {' '}{i18n.t('feedback.snapshot.restore.snapshot-restore')}
- {RequiredField(this, i18n.t('snapshot.feedback.restore.destination'), "destination", + {RequiredField(this, i18n.t('feedback.snapshot.restore.destination'), "destination", { autoFocus: true, - placeholder: i18n.t('snapshot.feedback.restore.destination.path'), - }, i18n.t('snapshot.feedback.restore.destination.help'))} + placeholder: i18n.t('feedback.snapshot.restore.destination-hint'), + }, i18n.t('feedback.snapshot.restore.destination-help'))}
- {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.skip'), "incremental")} + {RequiredBoolean(this, i18n.t('feedback.snapshot.restore.skip-previously-restored-files'), "incremental")} - {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.continue.errors'), "continueOnErrors", i18n.t('snapshot.feedback.restore.continue.errors.help'))} + {RequiredBoolean(this, i18n.t('feedback.snapshot.restore.continue-on-errors'), "continueOnErrors", i18n.t('feedback.snapshot.restore.continue-on-errors-help'))} - {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.file.ownership'), "restoreOwnership")} + {RequiredBoolean(this, i18n.t('feedback.snapshot.restore.restore-file-ownership'), "restoreOwnership")} - {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.file.permission'), "restorePermissions")} + {RequiredBoolean(this, i18n.t('feedback.snapshot.restore.restore-file-permissions'), "restorePermissions")} - {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.file.modification.time'), "restoreModTimes")} + {RequiredBoolean(this, i18n.t('feedback.snapshot.restore.restore-file-modification-time'), "restoreModTimes")} - {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.file.overwrite'), "overwriteFiles")} + {RequiredBoolean(this, i18n.t('feedback.snapshot.restore.overwrite-files'), "overwriteFiles")} - {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.directory.overwrite'), "overwriteDirectories")} + {RequiredBoolean(this, i18n.t('feedback.snapshot.restore.overwrite-directory'), "overwriteDirectories")} - {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.link.overwrite'), "overwriteSymlinks")} + {RequiredBoolean(this, i18n.t('feedback.snapshot.restore.overwrite-symbolic-links'), "overwriteSymlinks")} - {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.file.atomically'), "writeFilesAtomically")} + {RequiredBoolean(this, i18n.t('feedback.snapshot.restore.write-files-atomically'), "writeFilesAtomically")} - {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.file.sparse'), "writeSparseFiles")} + {RequiredBoolean(this, i18n.t('feedback.snapshot.restore.write-sparse-files'), "writeSparseFiles")}

- {RequiredNumberField(this, i18n.t('snapshot.feedback.restore.shallow.depth'), "restoreDirEntryAtDepth")} - {RequiredNumberField(this, i18n.t('snapshot.feedback.restore.shallow.file.size.minimal'), "minSizeForPlaceholder")} + {RequiredNumberField(this, i18n.t('feedback.snapshot.restore.shallow-restore-at-depth'), "restoreDirEntryAtDepth")} + {RequiredNumberField(this, i18n.t('feedback.snapshot.restore.minimal-file-size-for-shallow-restore'), "minSizeForPlaceholder")}
- {RequiredBoolean(this, i18n.t('snapshot.feedback.restore.disable.compression.zip'), "uncompressedZip", i18n.t('snapshot.feedback.restore.disable.compression.zip.help'))} + {RequiredBoolean(this, i18n.t('feedback.snapshot.restore.disable-zip-compression'), "uncompressedZip", i18n.t('feedback.snapshot.restore.disable-zip-compression-help'))}
- + diff --git a/src/pages/Snapshots.jsx b/src/pages/Snapshots.jsx index b1f79c6b..0b2861cf 100644 --- a/src/pages/Snapshots.jsx +++ b/src/pages/Snapshots.jsx @@ -112,10 +112,10 @@ export class Snapshots extends Component { switch (x.cell.value) { case "IDLE": case "PAUSED": - return x.cell.column.Header = i18n.t('snapshot.header.actions'); + return x.cell.column.Header = i18n.t('feedback.snapshot.header.actions'); case "PENDING": case "UPLOADING": - return x.cell.column.Header = i18n.t('snapshot.header.status'); + return x.cell.column.Header = i18n.t('feedback.snapshot.header.status'); default: return x.cell.column.Header = "" } @@ -132,17 +132,17 @@ export class Snapshots extends Component { case "IDLE": case "PAUSED": return <> - + ; case "PENDING": return <> - - {' '}{i18n.t('snapshot.event.snapshot.pending')} + + {' '}{i18n.t('feedback.snapshot.status.status-pending')} ; case "UPLOADING": @@ -167,7 +167,7 @@ export class Snapshots extends Component { return <>  {totals}   - {x.row.original.currentTask && {i18n.t('feedback.header.details')}} + {x.row.original.currentTask && {i18n.t('feedback.snapshot.header.details')}} ; default: @@ -206,7 +206,7 @@ export class Snapshots extends Component { return

{moment(x.cell.value).fromNow()} {moment(x.cell.value).isBefore(moment()) && <>   - {i18n.t('feedback.snapshot.status.overdue')} + {i18n.t('feedback.snapshot.status.status-overdue')} }

; } @@ -252,7 +252,7 @@ export class Snapshots extends Component { const columns = [{ id: 'path', - Header: i18n.t('snapshot.header.snapshot.path'), + Header: i18n.t('feedback.snapshot.header.snapshot-path'), accessor: x => x.source, sortType: (a, b) => { const v = compare(a.original.source.path, b.original.source.path); @@ -265,12 +265,12 @@ export class Snapshots extends Component { Cell: x => {x.cell.value.path}, }, { id: 'owner', - Header: i18n.t('snapshot.header.snapshot.owner'), + Header: i18n.t('feedback.snapshot.header.snapshot-owner'), accessor: x => x.source.userName + '@' + x.source.host, width: 250, }, { id: 'lastSnapshotSize', - Header: i18n.t('snapshot.header.snapshot.size'), + Header: i18n.t('feedback.snapshot.header.snapshot-size'), width: 120, accessor: x => x.lastSnapshot ? x.lastSnapshot.stats.totalSize : 0, Cell: x => sizeWithFailures( @@ -278,13 +278,13 @@ export class Snapshots extends Component { x.row.original.lastSnapshot && x.row.original.lastSnapshot.rootEntry ? x.row.original.lastSnapshot.rootEntry.summ : null, bytesStringBase2), }, { id: 'lastSnapshotTime', - Header: i18n.t('snapshot.header.snapshot.last'), + Header: i18n.t('feedback.snapshot.header.last-snapshot'), width: 160, accessor: x => x.lastSnapshot ? x.lastSnapshot.startTime : null, Cell: x => x.cell.value ?

{moment(x.cell.value).fromNow()}

: '', }, { id: 'nextSnapshotTime', - Header: i18n.t('snapshot.header.snapshot.next'), + Header: i18n.t('feedback.snapshot.header.next-snapshot'), width: 160, accessor: x => x.nextSnapshotTime, Cell: x => this.nextSnapshotTimeCell(x, this), @@ -314,12 +314,12 @@ export class Snapshots extends Component { }
- + - diff --git a/src/pages/Task.jsx b/src/pages/Task.jsx index 11ff8c61..605843cb 100644 --- a/src/pages/Task.jsx +++ b/src/pages/Task.jsx @@ -81,21 +81,21 @@ export class Task extends Component { switch (task.status) { case "SUCCESS": - return {i18n.t('task.status.succeed.after')} {dur}.; + return {i18n.t('feedback.task.status.task-succeeded-after')} {dur}.; case "FAILED": - return {i18n.t('task.status.error')}: {task.errorMessage}.; + return {i18n.t('feedback.task.status.task-error')}: {task.errorMessage}.; case "CANCELED": - return {i18n.t('task.status.canceled')}.; + return {i18n.t('feedback.task.status.task-canceled')}.; case "CANCELING": return - {i18n.t('task.status.canceling')} {dur}: {task.progressInfo}.; + {i18n.t('feedback.task.status.task-canceling')} {dur}: {task.progressInfo}.; default: return - {i18n.t('task.status.running.for')} {dur}: {task.progressInfo}.; + {i18n.t('feedback.task.status.task-running-for')} {dur}: {task.progressInfo}.; } } @@ -164,7 +164,7 @@ export class Task extends Component { } if (isLoading) { - return

{i18n.t('common.loading')}

; + return

{i18n.t('common.label.loading')}

; } return
@@ -174,7 +174,7 @@ export class Task extends Component {

{task.status === "RUNNING" && <> -   +   }  {task.kind}: {task.description}

@@ -189,8 +189,8 @@ export class Task extends Component {
CounterValue{i18n.t('task.header.counter')}{i18n.t('task.header.value')}
- - + + @@ -202,13 +202,13 @@ export class Task extends Component { - {i18n.t('task.status.started')} + {i18n.t('feedback.task.status.task-started')} - {i18n.t('task.status.finished')} + {i18n.t('feedback.task.status.task-finished')} @@ -216,7 +216,7 @@ export class Task extends Component {
- {i18n.t('task.logs')} + {i18n.t('feedback.task.logs')} diff --git a/src/pages/Tasks.jsx b/src/pages/Tasks.jsx index eeabc898..3cac691e 100644 --- a/src/pages/Tasks.jsx +++ b/src/pages/Tasks.jsx @@ -87,25 +87,25 @@ export function Tasks() { return

{error.message}

; } if (isLoading) { - return

{t('task.loading')}

; + return

{t('common.label.loading')}

; } const columns = [{ - Header: t('task.header.time.start'), + Header: t('feedback.task.table.header-start-time'), width: 160, accessor: x => {moment(x.startTime).fromNow()} }, { - Header: t('task.header.status'), + Header: t('feedback.task.table.header-status'), width: 240, accessor: x => taskStatusSymbol(x), }, { - Header: t('task.header.kind'), + Header: t('feedback.task.table.header-kind'), width: "", accessor: x =>

{x.kind}

, }, { - Header: t('task.header.description'), + Header: t('feedback.task.table.header-description'), width: "", accessor: x =>

{x.description}

, }] @@ -118,27 +118,27 @@ export function Tasks() { - {t('task.header.status')}: {status} + {t('feedback.task.table.header-status')}: {status} - setStatus("All")}>{t('task.all')} + setStatus("All")}>{t('event.task.select.task-all')} - setStatus("Running")}>{t('task.running')} - setStatus("Failed")}>{t('task.failed')} + setStatus("Running")}>{t('event.task.select.task-running')} + setStatus("Failed")}>{t('event.task.select.task-failed')} - {t('task.header.kind')}: {kind} + {t('feedback.task.table.header-kind')}: {kind} - setKind("All")}>{t('task.all')} + setKind("All")}>{t('event.task.select.task-all')} {response.kinds.map(kind => setKind(kind)}>{kind})} - + @@ -146,7 +146,7 @@ export function Tasks() { {!response.items.length ? - {t('task.feedback.entries')} + {t('feedback.task.no-tasks-help')} : } diff --git a/src/tests/Language.test.jsx b/src/tests/Language.test.jsx index 2929319e..e9fa0cce 100644 --- a/src/tests/Language.test.jsx +++ b/src/tests/Language.test.jsx @@ -4,7 +4,6 @@ const { sync: globSync } = require('glob'); const localesPaths = globSync('./public/locales/*/*.json', { realpath: true }); const srcPaths = globSync('./src/**/*.+(tsx|ts|jsx)', { realpath: true }); - function computeIntersection(dataA, dataB) { return dataA.filter(element => dataB.includes(element)); } @@ -22,7 +21,7 @@ describe('Check for unused translations', () => { * If an empty string exists, the test will fail. */ describe('Check for empty translations', () => { - test('Translations should not be emtpy', async () => { + test('Translations should not be emtpy. Check translations files for empty values!', async () => { for (const localeFile in localesPaths) { let locale = localesPaths[localeFile] let data = require(locale); @@ -43,27 +42,27 @@ describe('Check for empty translations', () => { */ describe('Check that translations are in sync', () => { test.each(localesPaths)('All translations should be in sync with each other', l1 => { - for (const localeF2 in localesPaths) { - let l2 = localesPaths[localeF2] - // We do not have to check the file with itself - if (l1 == l2) { - break; - } + for (const localeF2 in localesPaths) { + let l2 = localesPaths[localeF2] + // We do not have to check the file with itself + if (l1 == l2) { + break; + } - let msg = `${l1} should be in sync with ${l2}` - let dataA = require(l1) - let dataB = require(l2) - expect(dataA).not.toBeNull() - expect(dataB).not.toBeNull() + let msg = `${l1} should be in sync with ${l2}` + let dataA = require(l1) + let dataB = require(l2) + expect(dataA).not.toBeNull() + expect(dataB).not.toBeNull() - let keysA = Object.keys(dataA) - let keysB = Object.keys(dataB) - expect(keysA.length).toBeGreaterThan(0) - expect(keysB.length).toBeGreaterThan(0) + let keysA = Object.keys(dataA) + let keysB = Object.keys(dataB) + expect(keysA.length).toBeGreaterThan(0) + expect(keysB.length).toBeGreaterThan(0) - let intersection = computeIntersection(keysA, keysB) - expect({msg, result:intersection.length}).toEqual({msg, result:keysA.length}) - } - }) + let intersection = computeIntersection(keysA, keysB) + expect({ msg, result: intersection.length }).toEqual({ msg, result: keysA.length }) + } + }) }) diff --git a/src/utils/uiutil.jsx b/src/utils/uiutil.jsx index 6bd820f8..dd9bdd9e 100644 --- a/src/utils/uiutil.jsx +++ b/src/utils/uiutil.jsx @@ -273,19 +273,19 @@ export function taskStatusSymbol(task) { switch (st) { case "RUNNING": return <> - {i18n.t('feedback.task.running-for')} {dur} + {i18n.t('feedback.task.status.task-running-for')} {dur} case "SUCCESS": - return

{i18n.t('feedback.task.finished-in')} {dur}

; + return

{i18n.t('feedback.task.status.task-finished-in')} {dur}

; case "FAILED": - return

{i18n.t('feedback.task.failed-after')} {dur}

; + return

{i18n.t('feedback.task.status.task-failed-after')} {dur}

; case "CANCELED": - return

{i18n.t('feedback.task.canceled-after')} {dur}

; + return

{i18n.t('feedback.task.status.task-canceled-after')} {dur}

; default: return st; @@ -299,7 +299,7 @@ export function cancelTask(tid) { } export function GoBackButton(props) { - return ; + return ; } export function PolicyTypeName(s) { From 42b8184699c8c8650164070e41ff9ae234ce7f20 Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Sun, 7 Apr 2024 11:55:07 -0700 Subject: [PATCH 27/27] some Polish translation updates, work in progress --- public/locales/pl/translation.json | 188 ++++++++++++++--------------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/public/locales/pl/translation.json b/public/locales/pl/translation.json index b84afba2..342a06d4 100644 --- a/public/locales/pl/translation.json +++ b/public/locales/pl/translation.json @@ -1,10 +1,10 @@ { "common.action.back": "Z powrotem", - "common.action.cancel": "Anulować", + "common.action.cancel": "Anuluj", "common.action.click-here-to-learn-more": "Kliknij tutaj, aby dowiedzieć się więcej.", "common.action.confirm-delete": "Potwierdź usunięcie", - "common.action.delete": "Usuwać", - "common.action.next": "Następny", + "common.action.delete": "Usuń", + "common.action.next": "Dalej", "common.action.return": "Wróć", "common.action.stop": "Zatrzymaj", "common.label.loading": "Wczytywanie...", @@ -13,13 +13,13 @@ "event.log.hide-log": "Schowaj log", "event.log.show-log": "Pokaż log", "event.pin.add-pin": "Dodaj Pin", - "event.pin.pin-snapshot": "Przypnij migawkę", + "event.pin.pin-snapshot": "Dodaj pinezkę", "event.pin.remove-pin": "Usuń pinezkę", - "event.pin.update-pin": "Zaktualizuj Pin", - "event.policy.delete": "Usuń politykę", - "event.policy.edit": "Edytować", - "event.policy.save": "Zapisz politykę", - "event.policy.set-policy": "Ustaw politykę", + "event.pin.update-pin": "Zmień piezkę", + "event.policy.delete": "Usuń regułę", + "event.policy.edit": "Edytuj", + "event.policy.save": "Zapisz regułę", + "event.policy.set-policy": "Ustaw regułę", "event.repository.cancel-connection": "Przerwij próbę połączenia", "event.repository.connect-to-repository": "Połącz się z repozytorium", "event.repository.create-repository": "Utwórz repozytorium", @@ -28,34 +28,34 @@ "event.repository.show-advanced-options": "Pokaż ustawienia zaawansowane", "event.repository.update-description": "Zmień opis", "event.snapshot.browse-directory": "Przeglądać", - "event.snapshot.delete-selected": "event.snapshot.delete-selected", - "event.snapshot.delete-selected_one": "Czy chcesz usunąć wybraną migawkę {{count}}?", - "event.snapshot.delete-selected_other": "Czy chcesz usunąć wybrane migawki ({{count}})?", + "event.snapshot.delete-selected": "Usuń zaznaczone", + "event.snapshot.delete-selected_one": "Czy chcesz usunąć wybraną kopię?", + "event.snapshot.delete-selected_other": "Czy chcesz usunąć wybrane kopie ({{count}})?", "event.snapshot.description.enter-new-description": "Wprowadź nowy opis", "event.snapshot.description.remove-description": "Usuń opis", "event.snapshot.description.update-description": "Aktualizuj opis", - "event.snapshot.estimate": "Oszacować", - "event.snapshot.fetch-snapshots": "Pobieraj migawki", + "event.snapshot.estimate": "Oszacuj", + "event.snapshot.fetch-snapshots": "Odśwież", "event.snapshot.history.delete-selected": "Usuń wybrane ({{count}})", - "event.snapshot.history.delete-snapshot-source": "Usuń źródło migawki", + "event.snapshot.history.delete-snapshot-source": "Usuń źródło kopii zapasowyc", "event.snapshot.history.deselect-all": "Odznacz wszystkie", - "event.snapshot.history.select-all-snapshots": "Zaznacz wszystko", - "event.snapshot.history.update-snapshot-description": "{{description}} - Kliknij, aby zaktualizować opis migawki.", + "event.snapshot.history.select-all-snapshots": "Zaznacz wszystkie", + "event.snapshot.history.update-snapshot-description": "{{description}} - Kliknij aby zaktualizować opis.", "event.snapshot.mount-directory": "Zamontuj jako lokalny system plików", - "event.snapshot.new-snapshot": "Nowy zrzut ekranu", + "event.snapshot.new-snapshot": "Nowa kopia zapasowa", "event.snapshot.restore-file-directories": "Przywróć pliki i katalogi", "event.snapshot.restore.begin-restore": "Rozpocznij przywracanie", - "event.snapshot.restore.go-to-restore-task": "Przejdź do przywracania zadania", - "event.snapshot.show-policy": "Polityka", - "event.snapshot.snapshot-now": "Zrzut ekranu teraz", - "event.snapshot.synchronize": "Synchronizować", + "event.snapshot.restore.go-to-restore-task": "Przejdź do zadania przywracania", + "event.snapshot.show-policy": "Pokaz regułę", + "event.snapshot.snapshot-now": "Utwórz kopię teraz", + "event.snapshot.synchronize": "Synchronizuj", "event.snapshot.unmount-directory": "Odmontuj", "event.task.action.cancel": "Anuluj zadanie", "event.task.select.task-all": "wszystkie", "event.task.select.task-failed": "nieudane", "event.task.select.task-running": "w toku", "feedback.directory.header.directories": "Katalogi", - "feedback.directory.header.files": "Akta", + "feedback.directory.header.files": "Pliki", "feedback.directory.header.last-modification": "Ostatnia modyfikacja", "feedback.directory.header.name": "Nazwa", "feedback.directory.header.size": "Rozmiar", @@ -63,22 +63,22 @@ "feedback.error.connection": "Błąd połączenia:", "feedback.header.effective": "Skuteczny", "feedback.header.username": "Nazwa użytkownika", - "feedback.pin.add-pin-to-protect": "Dodaj pinezkę, aby zabezpieczyć migawkę przed usunięciem", + "feedback.pin.add-pin-to-protect": "Dodaj pinezkę, aby zabezpieczyć kopię zapasową przed usunięciem", "feedback.pin.do-not-delete": "nie kasuj", "feedback.pin.name-of-the-pin": "Nazwa pinu", "feedback.policy.action.command-mode": "Tryb poleceń", "feedback.policy.actions.after-folder": "Po folderze", "feedback.policy.actions.after-folder-help": "Skrypt uruchamiany po folderze", - "feedback.policy.actions.after-snapshot": "Po migawce", - "feedback.policy.actions.after-snapshot-help": "Skrypt uruchamiany po zrobieniu migawki", + "feedback.policy.actions.after-snapshot": "Po wykonaniu kopii zapasowej", + "feedback.policy.actions.after-snapshot-help": "Skrypt uruchamiany po wykonaniu kopii zapasowej", "feedback.policy.actions.before-folder": "Przed folderem", "feedback.policy.actions.before-folder-help": "Skrypt uruchamiany przed folderem", - "feedback.policy.actions.before-snapshot": "Przed zrzutem ekranu", - "feedback.policy.actions.before-snapshot-help": "Skrypt uruchamiany przed wykonaniem migawki", - "feedback.policy.actions.timeout": "Koniec czasu", + "feedback.policy.actions.before-snapshot": "Przed wykonaniem kopii zapasowej", + "feedback.policy.actions.before-snapshot-help": "Skrypt uruchamiany przed wykonaniem kopii zapasowej", + "feedback.policy.actions.timeout": "Maksymalny czas działania skryptu", "feedback.policy.command-mode-help": "Niezbędny (musi zakończyć się sukcesem; zachowanie domyślne), opcjonalny (awarie są tolerowane) lub asynchroniczny (Kopia rozpocznie akcję, ale nie będzie czekać na jej zakończenie)", "feedback.policy.compression.compression-algorithm": "Algorytm kompresji", - "feedback.policy.compression.compression-algorithm-help": "Określ algorytm kompresji, który będzie używany podczas tworzenia migawek plików w tym katalogu i podkatalogach", + "feedback.policy.compression.compression-algorithm-help": "Określ algorytm kompresji, który będzie używany podczas tworzenia kopii zapasowych plików w tym katalogu i podkatalogach", "feedback.policy.compression.maximal-file-size": "Maksymalny rozmiar pliku", "feedback.policy.compression.maximal-file-size-help": "Pliki, których rozmiar przekracza podaną wartość, nie zostaną skompresowane", "feedback.policy.compression.maximal-file-size-hint": "Maksymalny rozmiar pliku w bajtach", @@ -91,10 +91,10 @@ "feedback.policy.compression.only-compress-extensions": "Kompresuj tylko rozszerzenia", "feedback.policy.compression.only-compress-extensions-help": "Kompresuj tylko pliki z następującymi rozszerzeniami (jedno rozszerzenie w linii)", "feedback.policy.compression.only-compress-extensions-hint": "np. *.tekst", - "feedback.policy.confirm-delete-policy": "Czy na pewno chcesz usunąć tę politykę?", - "feedback.policy.defined-by": "Określony przez", - "feedback.policy.defined-by-this-policy": "Zdefiniowane w tej polityce", - "feedback.policy.error-delete-policy": "Błąd podczas usuwania zasady", + "feedback.policy.confirm-delete-policy": "Czy na pewno chcesz usunąć tę regułę?", + "feedback.policy.defined-by": "Określona przez", + "feedback.policy.defined-by-this-policy": "Zdefiniowane w tej regule", + "feedback.policy.error-delete-policy": "Błąd podczas usuwania reguły", "feedback.policy.error-handling.ignore-directory-errors": "Ignoruj ​​​​błędy katalogu", "feedback.policy.error-handling.ignore-directory-errors-help": "Traktuj błędy odczytu katalogu jako niekrytyczne.", "feedback.policy.error-handling.ignore-file-errors": "Ignoruj ​​​​błędy plików", @@ -115,33 +115,33 @@ "feedback.policy.files.ignore-well-known-cache-directories": "Ignoruj ​​dobrze znane katalogi pamięci podręcznej", "feedback.policy.files.ignore-well-known-cache-directories-help": "Ignoruj ​​katalogi zawierające CACHEDIR.TAG i podobne", "feedback.policy.files.scan-only-one-filesystem": "Skanuj tylko jeden system plików", - "feedback.policy.files.scan-only-one-filesystem-help": "Podczas tworzenia migawki nie przekraczaj granic systemu plików", - "feedback.policy.find-count": "feedback.policy.find-count", - "feedback.policy.find-count_one": "Znaleziono {{count}} zasad spełniających kryteria", - "feedback.policy.find-count_other": "Znaleziono {{count}} zasad spełniających kryteria", + "feedback.policy.files.scan-only-one-filesystem-help": "Podczas tworzenia kopii zapasowych nie przekraczaj granic systemu plików", + "feedback.policy.find-count": "Znaleziono {{count}} reguł spełniających kryteria", + "feedback.policy.find-count_one": "Znaleziono regułę spełniającą kryteria", + "feedback.policy.find-count_other": "Znaleziono {{count}} reguł spełniających kryteria", "feedback.policy.find-hint": "Wejdź do katalogu, aby znaleźć lub ustawić politykę", - "feedback.policy.find-none": "feedback.policy.find-none", - "feedback.policy.find-none-create": "Nie znaleziono zasad dla katalogu {{path}}. \nSkonfiguruj nową politykę.", + "feedback.policy.find-none": "Nie znaleziono reguł", + "feedback.policy.find-none-create": "Nie znaleziono reguł dla katalogu {{path}}. \nUtwórz nową regułę.", "feedback.policy.header.actions": "działania", "feedback.policy.header.compression": "Kompresja", "feedback.policy.header.defined": "Zdefiniowane", "feedback.policy.header.error-handling": "Obsługa błędów", - "feedback.policy.header.files": "Akta", + "feedback.policy.header.files": "Pliki", "feedback.policy.header.folder-actions": "Akcje folderów", - "feedback.policy.header.host": "Gospodarz", + "feedback.policy.header.host": "Host", "feedback.policy.header.logging": "Logowanie", "feedback.policy.header.other": "Inny", "feedback.policy.header.path": "Ścieżka", "feedback.policy.header.scheduling": "Planowanie", - "feedback.policy.header.snapshot-action": "Akcje migawki", - "feedback.policy.header.snapshot-retention": "Przechowywanie migawek", + "feedback.policy.header.snapshot-action": "Akcje kopii zapasowych", + "feedback.policy.header.snapshot-retention": "Przechowywanie kopii zapasowych", "feedback.policy.header.upload": "Wgrywać", "feedback.policy.kind.all": "Wszystkie zasady", - "feedback.policy.kind.applicable": "Obowiązujące zasady", + "feedback.policy.kind.applicable": "Obowiązujące reguły", "feedback.policy.kind.global": "Polityka globalna", "feedback.policy.kind.local": "Polityka lokalna", - "feedback.policy.kind.per-host-policies": "Zasady dotyczące poszczególnych hostów", - "feedback.policy.kind.per-user-policies": "Zasady dotyczące poszczególnych użytkowników", + "feedback.policy.kind.per-host-policies": "Reguły dotyczące poszczególnych hostów", + "feedback.policy.kind.per-user-policies": "Reguły dotyczące poszczególnych użytkowników", "feedback.policy.logging.cache-hit": "Trafienie w pamięć podręczną", "feedback.policy.logging.cache-hit-help": "Szczegółowość dziennika, gdy zamiast przesyłania pliku używana jest pamięć podręczna", "feedback.policy.logging.cache-miss": "Brak pamięci podręcznej", @@ -149,7 +149,7 @@ "feedback.policy.logging.directory-ignored": "Katalog zignorowany", "feedback.policy.logging.directory-ignored-help": "Rejestruj szczegółowość, gdy katalog jest ignorowany", "feedback.policy.logging.directory-snapshotted": "Zrzut katalogu", - "feedback.policy.logging.directory-snapshotted-help": "Szczegółowość dziennika podczas tworzenia migawki katalogu", + "feedback.policy.logging.directory-snapshotted-help": "Szczegółowość dziennika podczas tworzenia kopii zapasowej katalogu", "feedback.policy.logging.file-ignored": "Plik zignorowany", "feedback.policy.logging.file-ignored-help": "Rejestruj szczegółowość, gdy plik, łącze symboliczne itp. jest ignorowane", "feedback.policy.logging.file-snapshotted": "Zrzut pliku", @@ -160,49 +160,49 @@ "feedback.policy.other.json-representation-help": "Jest to wewnętrzna reprezentacja polityki", "feedback.policy.policies-defined-by-path-absolute": "Zasady można definiować tylko dla ścieżek bezwzględnych.", "feedback.policy.retention.annual-snapshot-retain": "Coroczny", - "feedback.policy.retention.annual-snapshot-retain-help": "Liczba rocznych migawek przechowywanych dla każdego źródła. \nZachowana zostanie najnowsza migawka z każdego roku kalendarzowego", - "feedback.policy.retention.annual-snapshot-retain-hint": "Liczba rocznych migawek", + "feedback.policy.retention.annual-snapshot-retain-help": "Liczba corocznych kopii zapasowych przechowywanych dla każdego źródła. \nZachowana zostanie najnowsza kopia zapasowa z każdego roku kalendarzowego", + "feedback.policy.retention.annual-snapshot-retain-hint": "Liczba corocznych kopii zapasowych", "feedback.policy.retention.daily-snapshot-retain": "Codziennie", - "feedback.policy.retention.daily-snapshot-retain-help": "Liczba codziennych migawek przechowywanych dla każdego źródła. \nNajnowsza migawka z każdego dnia zostanie zachowana", - "feedback.policy.retention.daily-snapshot-retain-hint": "Liczba codziennych migawek", - "feedback.policy.retention.hourly-snapshot-retain": "Cogodzinny", - "feedback.policy.retention.hourly-snapshot-retain-help": "Ile godzinnych migawek zachować na źródło. \nNajnowsza migawka z każdej godziny zostanie zachowana", - "feedback.policy.retention.hourly-snapshot-retain-hint": "liczba godzinnych migawek", - "feedback.policy.retention.ignore-identical-snapshots": "Ignoruj ​​identyczne migawki", - "feedback.policy.retention.ignore-identical-snapshots-help": "NIE zapisuj migawki, jeśli żadne pliki nie zostały zmienione", - "feedback.policy.retention.keep-latest-help": "liczba najnowszych migawek", - "feedback.policy.retention.latest-snapshot-retain": "Najnowsze migawki", - "feedback.policy.retention.latest-snapshot-retain-help": "Liczba najnowszych migawek do zachowania dla każdego źródła", - "feedback.policy.retention.monthly-snapshot-retain": "Miesięczny", - "feedback.policy.retention.monthly-snapshot-retain-help": "Liczba miesięcznych migawek przechowywanych dla każdego źródła. \nZachowana zostanie najnowsza migawka z każdego miesiąca kalendarzowego", - "feedback.policy.retention.monthly-snapshot-retain-hint": "Liczba miesięcznych migawek", - "feedback.policy.retention.weekly-snapshot-retain": "Co tydzień", - "feedback.policy.retention.weekly-snapshot-retain-help": "Liczba cotygodniowych migawek przechowywanych dla każdego źródła. \nNajnowsza migawka z każdego tygodnia zostanie zachowana", - "feedback.policy.retention.weekly-snapshot-retain-hint": "Liczba cotygodniowych migawek", - "feedback.policy.scheduling.cron-expressions": "Wyrażenia Crona", - "feedback.policy.scheduling.cron-expressions-hint": "minuta godzina dzień miesiąc dzień powszedni", + "feedback.policy.retention.daily-snapshot-retain-help": "Liczba codziennych kopii zapasowych przechowywanych dla każdego źródła. \nNajnowsza kopia zapasowa z każdego dnia zostanie zachowana", + "feedback.policy.retention.daily-snapshot-retain-hint": "Liczba codziennych kopii zapasowych", + "feedback.policy.retention.hourly-snapshot-retain": "Cogodzinne", + "feedback.policy.retention.hourly-snapshot-retain-help": "Ile godzinnych kopii zapasowych zachować na źródło. \nNajnowsza kopia zapasowa z każdej godziny zostanie zachowana", + "feedback.policy.retention.hourly-snapshot-retain-hint": "liczba godzinnych kopii zapasowych", + "feedback.policy.retention.ignore-identical-snapshots": "Ignoruj ​​identyczne kopie zapasowe", + "feedback.policy.retention.ignore-identical-snapshots-help": "NIE zapisuj kopii, jeśli żadne pliki nie zostały zmienione", + "feedback.policy.retention.keep-latest-help": "liczba najnowszych kopii zapasowych", + "feedback.policy.retention.latest-snapshot-retain": "Najnowsze kopie zapasowe", + "feedback.policy.retention.latest-snapshot-retain-help": "Liczba najnowszych kopii zapasowych do zachowania dla każdego źródła", + "feedback.policy.retention.monthly-snapshot-retain": "Comiesięczne", + "feedback.policy.retention.monthly-snapshot-retain-help": "Liczba comiesięcznych kopii zapasowych przechowywanych dla każdego źródła. \nZachowana zostanie najnowsza kopia z każdego miesiąca kalendarzowego", + "feedback.policy.retention.monthly-snapshot-retain-hint": "Liczba comiesięcznych kopii zapasowych", + "feedback.policy.retention.weekly-snapshot-retain": "Tygodniowe", + "feedback.policy.retention.weekly-snapshot-retain-help": "Liczba cotygodniowych kopii zapasowych przechowywanych dla każdego źródła. \nNajnowsza kopia z każdego tygodnia zostanie zachowana", + "feedback.policy.retention.weekly-snapshot-retain-hint": "Liczba cotygodniowych kopii zapasowych", + "feedback.policy.scheduling.cron-expressions": "Wyrażenia Crontab", + "feedback.policy.scheduling.cron-expressions-hint": "minuta godzina dzień miesiąc dzień_tygodnia", "feedback.policy.scheduling.cron-help": "Harmonogramy zrzutów ekranu przy użyciu składni crontab UNIX (po jednym w wierszu):
Zobacz szczegóły dotyczące obsługiwanych formatów.", - "feedback.policy.scheduling.manual-snapshots-only": "Tylko ręczne migawki", - "feedback.policy.scheduling.manual-snapshots-only-help": "Twórz migawki tylko ręcznie (wyłącza zaplanowane migawki)", - "feedback.policy.scheduling.missed-snapshots-startup": "Uruchom pominięte migawki podczas uruchamiania", - "feedback.policy.scheduling.missed-snapshots-startup-help": "Natychmiast uruchom wszelkie pominięte migawki po rozpoczęciu kopiowania (dotyczy tylko migawek aktualnych)", - "feedback.policy.scheduling.no-upcoming-snapshots": "Brak nadchodzących migawek", - "feedback.policy.scheduling.snapshot-frequency": "Częstotliwość migawki", - "feedback.policy.scheduling.snapshot-frequency-help": "Jak często tworzyć migawki na serwerze KopiaUI lub Kopia (nie ma wpływu poza trybem serwera)", + "feedback.policy.scheduling.manual-snapshots-only": "Tylko ręczne kopie zapasowe", + "feedback.policy.scheduling.manual-snapshots-only-help": "Twórz kopie zapasowe tylko ręcznie (wyłącza zaplanowane zadania)", + "feedback.policy.scheduling.missed-snapshots-startup": "Uruchom pominięte kopie zapasowe podczas uruchamiania", + "feedback.policy.scheduling.missed-snapshots-startup-help": "Natychmiast uruchom wszelkie pominięte zadania kopii zapasowych po rozpoczęciu kopiowania (dotyczy tylko kopii zapasowych aktualnych)", + "feedback.policy.scheduling.no-upcoming-snapshots": "Brak nadchodzących kopii zapasowych", + "feedback.policy.scheduling.snapshot-frequency": "Częstotliwość kopii zapasowych", + "feedback.policy.scheduling.snapshot-frequency-help": "Jak często tworzyć kopie zapasowe na serwerze KopiaUI lub Kopia (nie dotyczy działania poza trybem serwera)", "feedback.policy.scheduling.times-of-day": "Pory dnia", - "feedback.policy.scheduling.times-of-day-help": "Twórz migawki o określonych porach dnia (format 24-godzinny)", + "feedback.policy.scheduling.times-of-day-help": "Twórz kopie zapasowe o określonych porach dnia (format 24-godzinny)", "feedback.policy.scheduling.times-of-day-hint": "np. 17:00", - "feedback.policy.scheduling.upcoming": "Nadchodzące", - "feedback.policy.scheduling.upcoming-snapshots": "Nadchodzące migawki", - "feedback.policy.scheduling.upcoming-snapshots-help": "Czasy nadchodzących migawek obliczone na podstawie parametrów zasad", + "feedback.policy.scheduling.upcoming": "Najbliższe kopie", + "feedback.policy.scheduling.upcoming-snapshots": "Najbliższe kopie zapasowe", + "feedback.policy.scheduling.upcoming-snapshots-help": "Czasy nadchodzących kopii zapasowych obliczone na podstawie parametrów reguł", "feedback.policy.time-of-day.invalid": "Nieprawidłowa godzina: {{tod}}", "feedback.policy.timeout-help": "Limit czasu w sekundach, zanim Kopia zabije proces", "feedback.policy.upload.maximum-parallel-file-reads": "Maksymalne równoległe odczyty plików", "feedback.policy.upload.maximum-parallel-file-reads-help": "Maksymalna liczba plików, które będą odczytywane równolegle (domyślnie jest to liczba procesorów logicznych)", "feedback.policy.upload.maximum-parallel-file-reads-hint": "maksymalna liczba równoległych odczytów plików", - "feedback.policy.upload.maximum-parallel-snapshots": "Maksymalnie równoległe migawki", - "feedback.policy.upload.maximum-parallel-snapshots-help": "Maksymalna liczba migawek, które można przesłać jednocześnie", - "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "maksymalna liczba równoległych migawek", + "feedback.policy.upload.maximum-parallel-snapshots": "Maksymalnie równoległe kopie zapasowe", + "feedback.policy.upload.maximum-parallel-snapshots-help": "Maksymalna liczba kopii zapasowych, które można przesłać jednocześnie", + "feedback.policy.upload.maximum-parallel-snapshots-hint-set": "maksymalna liczba równoległych kopii zapasowych", "feedback.policy.upload.maximum-parallel-snapshots-hint-unset": "należy określić przy użyciu zasad globalnych, użytkownika lub hosta", "feedback.prodiver.gcs.paste-json-credentials": "Wklej tutaj dane uwierzytelniające JSON", "feedback.provider.azure-blob-storage": "Magazyn obiektów Blob platformy Azure", @@ -323,7 +323,7 @@ "feedback.repository.encryption": "Szyfrowanie", "feedback.repository.enter-repository-password": "Wprowadź hasło do repozytorium", "feedback.repository.hostname": "Nazwa hosta", - "feedback.repository.hostname-hint": "Zastąp tę opcję podczas przywracania migawki wykonanej na innym komputerze", + "feedback.repository.hostname-hint": "Użyj tej opcji podczas przywracania kopii wykonanej na innym komputerze", "feedback.repository.internal-compression-supported-no": "no", "feedback.repository.internal-compression-supported-yes": "yes", "feedback.repository.kopia-server-parameters": "Parametry serwera Kopia", @@ -349,20 +349,20 @@ "feedback.repository.username-hint": "Zastąp tę opcję podczas przywracania migawki wykonanej przez innego użytkownika", "feedback.snapshot.create.enter-path-to-snapshot-hint": "Wprowadź ścieżkę do migawki", "feedback.snapshot.create.must-specify-path": "Należy określić katalog do wykonania migawki.", - "feedback.snapshot.create.snapshot-new": "Nowy zrzut ekranu", + "feedback.snapshot.create.snapshot-new": "Nowa kopia zapasowa", "feedback.snapshot.description": "Opis", - "feedback.snapshot.description.snapshot-description": "Opis migawki", + "feedback.snapshot.description.snapshot-description": "Opis kopii zapasowej", "feedback.snapshot.directory.browsing-not-supported": "Przeglądanie katalogów nie jest obsługiwane w przeglądarce internetowej. \nUżyj interfejsu Kopia.", "feedback.snapshot.directory.restore-all-files-help": "Możesz zamontować/przywrócić wszystkie pliki i katalogi widoczne poniżej lub przywrócić pliki pojedynczo.", "feedback.snapshot.header.actions": "działania", "feedback.snapshot.header.details": "Detale", "feedback.snapshot.header.directories": "Reż", "feedback.snapshot.header.files": "Akta", - "feedback.snapshot.header.last-snapshot": "Ostatni zrzut ekranu", - "feedback.snapshot.header.next-snapshot": "Następna migawka", - "feedback.snapshot.header.retention": "Zatrzymanie", + "feedback.snapshot.header.last-snapshot": "Ostatnia kopia zapasowa", + "feedback.snapshot.header.next-snapshot": "Następna kopia zapasowa", + "feedback.snapshot.header.retention": "Przechowywanie", "feedback.snapshot.header.root": "Źródło", - "feedback.snapshot.header.selected": "Wybrany", + "feedback.snapshot.header.selected": "Zaznacz", "feedback.snapshot.header.snapshot-owner": "Właściciel", "feedback.snapshot.header.snapshot-path": "Ścieżka", "feedback.snapshot.header.snapshot-size": "Rozmiar", @@ -391,21 +391,21 @@ "feedback.snapshot.restore.write-sparse-files": "Zapisuj pliki rzadkie", "feedback.snapshot.show-individual-snapshots-count": "feedback.snapshot.show-individual-snapshots-count", "feedback.snapshot.show-individual-snapshots-count_one": "Pokaż {{count}} indywidualną migawkę", - "feedback.snapshot.show-individual-snapshots-count_other": "Pokaż {{count}} pojedynczych migawek", + "feedback.snapshot.show-individual-snapshots-count_other": "Pokaż {{count}} pojedynczych kopii zapasowych", "feedback.snapshot.start-after-previous-snapshot": "Migawka rozpocznie się po zakończeniu poprzedniej migawki", "feedback.snapshot.status.status-overdue": "zaległy", "feedback.snapshot.status.status-pending": "Aż do", - "feedback.tab.policies": "Konfiguracje", + "feedback.tab.policies": "Reguły", "feedback.tab.preferences": "Ustawienia", "feedback.tab.repository": "Repozytorium", "feedback.tab.repository-is-not-connected": "Repozytorium nie jest połączone", - "feedback.tab.snapshots": "Kopie", + "feedback.tab.snapshots": "Kopie zapasowe", "feedback.tab.tasks": "Zadania", "feedback.task.estimated-results": "{{description}} Bytes: {{bytes}} ({{bytes.excluded}} wyłączony) Files: {{files}} ({{files.excluded}} wyłączony) Directories: {{directories}} ({{directories.excluded}} wyłączony) Errors: {{errors}} ({{errors.ignored}} ignorowany)", "feedback.task.header.counter": "Licznik", "feedback.task.header.value": "Wartość", "feedback.task.logs": "Logi", - "feedback.task.no-tasks-help": "Lista zadań pojawi się tutaj podczas tworzenia migawek, przywracania, przeprowadzania konserwacji itp.", + "feedback.task.no-tasks-help": "Lista zadań pojawi się tutaj podczas tworzenia kopii zapasowych, przywracania, przeprowadzania konserwacji itp.", "feedback.task.search-tasks-by-hint": "Przeszukuj dzienniki zadań według opisu", "feedback.task.status.task-canceled": "Zadanie anulowane", "feedback.task.status.task-canceled-after": "Zadanie anulowane po", @@ -441,7 +441,7 @@ "feedback.validation.required.field": "Pole wymagane", "feedback.validation.required.valid-number-or-empty": "Musi to być prawidłowy numer lub pusty", "value.algorithm.eco-disabled": "Wyłączony", - "value.algorithm.suffix-not-recommended": "(NIEPOLECANE)", + "value.algorithm.suffix-not-recommended": "(NIEZALECANE)", "value.algorithm.suffix-recommended": "(ZALECANA)", "value.log.details-0-no-output": "0 - brak wyjścia", "value.log.details-1-minimal-details": "1 - minimalne szczegóły",
{i18n.t('task.header.counter')}{i18n.t('task.header.value')}{i18n.t('feedback.task.header.counter')}{i18n.t('feedback.task.header.value')}