diff --git a/drizzle/0001_brave_mimic.sql b/drizzle/0001_brave_mimic.sql new file mode 100644 index 00000000000..e32518ada10 --- /dev/null +++ b/drizzle/0001_brave_mimic.sql @@ -0,0 +1,10 @@ +CREATE TABLE `migrate_token` ( + `id` text PRIMARY KEY NOT NULL, + `token` text NOT NULL, + `boards` integer NOT NULL, + `users` integer NOT NULL, + `integrations` integer NOT NULL, + `expires` integer NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `migrate_token_token_unique` ON `migrate_token` (`token`); \ No newline at end of file diff --git a/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json new file mode 100644 index 00000000000..e47b5af15a6 --- /dev/null +++ b/drizzle/meta/0001_snapshot.json @@ -0,0 +1,527 @@ +{ + "version": "5", + "dialect": "sqlite", + "id": "9c8971c9-6d33-4d14-b318-b19ff9fbb88f", + "prevId": "32c1bc91-e69f-4e1d-b53c-9c43f2e6c9d3", + "tables": { + "account": { + "name": "account", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "providerAccountId": { + "name": "providerAccountId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "token_type": { + "name": "token_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "session_state": { + "name": "session_state", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "userId_idx": { + "name": "userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + } + }, + "foreignKeys": { + "account_userId_user_id_fk": { + "name": "account_userId_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "account_provider_providerAccountId_pk": { + "columns": [ + "provider", + "providerAccountId" + ] + } + }, + "uniqueConstraints": {} + }, + "invite": { + "name": "invite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "invite_token_unique": { + "name": "invite_token_unique", + "columns": [ + "token" + ], + "isUnique": true + } + }, + "foreignKeys": { + "invite_created_by_id_user_id_fk": { + "name": "invite_created_by_id_user_id_fk", + "tableFrom": "invite", + "tableTo": "user", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "migrate_token": { + "name": "migrate_token", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "boards": { + "name": "boards", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "users": { + "name": "users", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "integrations": { + "name": "integrations", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "migrate_token_token_unique": { + "name": "migrate_token_token_unique", + "columns": [ + "token" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "session": { + "name": "session", + "columns": { + "sessionToken": { + "name": "sessionToken", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "user_id_idx": { + "name": "user_id_idx", + "columns": [ + "userId" + ], + "isUnique": false + } + }, + "foreignKeys": { + "session_userId_user_id_fk": { + "name": "session_userId_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_setting": { + "name": "user_setting", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "color_scheme": { + "name": "color_scheme", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'environment'" + }, + "language": { + "name": "language", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'en'" + }, + "default_board": { + "name": "default_board", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'default'" + }, + "first_day_of_week": { + "name": "first_day_of_week", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'monday'" + }, + "search_template": { + "name": "search_template", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'https://google.com/search?q=%s'" + }, + "open_search_in_new_tab": { + "name": "open_search_in_new_tab", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "disable_ping_pulse": { + "name": "disable_ping_pulse", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "replace_ping_with_icons": { + "name": "replace_ping_with_icons", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "use_debug_language": { + "name": "use_debug_language", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "auto_focus_search": { + "name": "auto_focus_search", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_setting_user_id_user_id_fk": { + "name": "user_setting_user_id_user_id_fk", + "tableFrom": "user_setting", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user": { + "name": "user", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "emailVerified": { + "name": "emailVerified", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "salt": { + "name": "salt", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_admin": { + "name": "is_admin", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_owner": { + "name": "is_owner", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "verificationToken": { + "name": "verificationToken", + "columns": { + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "verificationToken_identifier_token_pk": { + "columns": [ + "identifier", + "token" + ] + } + }, + "uniqueConstraints": {} + } + }, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 6af8ab350ad..a456183827f 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -8,6 +8,13 @@ "when": 1695874816934, "tag": "0000_supreme_the_captain", "breakpoints": true + }, + { + "idx": 1, + "version": "5", + "when": 1730643218521, + "tag": "0001_brave_mimic", + "breakpoints": true } ] } \ No newline at end of file diff --git a/package.json b/package.json index bd89afd27f3..824e7fe0642 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homarr", - "version": "0.15.9", + "version": "0.15.10", "description": "Homarr - A homepage for your server.", "license": "MIT", "repository": { @@ -25,7 +25,8 @@ "test:coverage": "SKIP_ENV_VALIDATION=1 vitest run --coverage", "docker:build": "turbo build && docker build . -t homarr:local-dev", "docker:start": "docker run -p 7575:7575 --name homarr-development homarr:local-dev", - "db:migrate": "dotenv tsx drizzle/migrate/migrate.ts ./drizzle" + "db:migrate": "dotenv tsx drizzle/migrate/migrate.ts ./drizzle", + "db:add": "drizzle-kit generate:sqlite --config ./drizzle.config.ts" }, "dependencies": { "@ctrl/deluge": "^4.1.0", @@ -126,7 +127,7 @@ "@types/cookies": "^0.7.7", "@types/dockerode": "^3.3.9", "@types/ldapjs": "^3.0.2", - "@types/node": "18.17.8", + "@types/node": "^20.6.0", "@types/prismjs": "^1.26.0", "@types/react": "^18.2.11", "@types/swagger-ui-react": "^4.18.3", diff --git a/public/locales/cn/layout/manage.json b/public/locales/cn/layout/manage.json index a6f4d340c2f..eea2e3d0b0d 100644 --- a/public/locales/cn/layout/manage.json +++ b/public/locales/cn/layout/manage.json @@ -26,7 +26,8 @@ "title": "工具", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/cn/manage/migrate.json b/public/locales/cn/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/cn/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/cn/widgets/error-boundary.json b/public/locales/cn/widgets/error-boundary.json index a25ae0c83b3..b1bf8695a5e 100644 --- a/public/locales/cn/widgets/error-boundary.json +++ b/public/locales/cn/widgets/error-boundary.json @@ -7,8 +7,8 @@ } }, "modal": { - "text": "", - "label": "您的错误", - "reportButton": "报告该错误" + "text": "组件意外崩溃,请阅读文档并修改错误的输入。", + "label": "发生错误", + "reportButton": "在 GitHub 上报告此错误" } } diff --git a/public/locales/cr/layout/manage.json b/public/locales/cr/layout/manage.json index 1b09783c92d..66cb1b85660 100644 --- a/public/locales/cr/layout/manage.json +++ b/public/locales/cr/layout/manage.json @@ -26,7 +26,8 @@ "title": "crwdns3525:0crwdne3525:0", "items": { "docker": "crwdns3527:0crwdne3527:0", - "api": "crwdns4172:0crwdne4172:0" + "api": "crwdns4172:0crwdne4172:0", + "migrate": "crwdns4536:0crwdne4536:0" } }, "about": { diff --git a/public/locales/cr/manage/migrate.json b/public/locales/cr/manage/migrate.json new file mode 100644 index 00000000000..5d845289b89 --- /dev/null +++ b/public/locales/cr/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "crwdns4506:0crwdne4506:0", + "pageTitle": "crwdns4508:0crwdne4508:0", + "description": "crwdns4510:0crwdne4510:0", + "securityNote": { + "title": "crwdns4512:0crwdne4512:0", + "text": "crwdns4514:0crwdne4514:0" + }, + "form": { + "label": "crwdns4516:0crwdne4516:0", + "option": { + "boards": { + "label": "crwdns4518:0crwdne4518:0" + }, + "integrations": { + "label": "crwdns4520:0crwdne4520:0", + "description": "crwdns4522:0crwdne4522:0" + }, + "users": { + "label": "crwdns4524:0crwdne4524:0", + "description": "crwdns4526:0crwdne4526:0" + } + } + }, + "action": { + "export": "crwdns4528:0crwdne4528:0" + }, + "modal": { + "title": "crwdns4530:0crwdne4530:0", + "description": "crwdns4532:0crwdne4532:0", + "copyDismiss": "crwdns4534:0crwdne4534:0" + } +} \ No newline at end of file diff --git a/public/locales/cr/widgets/error-boundary.json b/public/locales/cr/widgets/error-boundary.json index b0ee0b02350..09ecb226be6 100644 --- a/public/locales/cr/widgets/error-boundary.json +++ b/public/locales/cr/widgets/error-boundary.json @@ -7,8 +7,8 @@ } }, "modal": { - "text": "crwdns2949:0crwdne2949:0", - "label": "crwdns2741:0crwdne2741:0", - "reportButton": "crwdns2743:0crwdne2743:0" + "text": "crwdns4500:0crwdne4500:0", + "label": "crwdns4502:0crwdne4502:0", + "reportButton": "crwdns4504:0crwdne4504:0" } } diff --git a/public/locales/cs/layout/manage.json b/public/locales/cs/layout/manage.json index ace1e87d84e..77a17c97be4 100644 --- a/public/locales/cs/layout/manage.json +++ b/public/locales/cs/layout/manage.json @@ -26,7 +26,8 @@ "title": "Nástroje", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/cs/manage/migrate.json b/public/locales/cs/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/cs/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/cs/widgets/error-boundary.json b/public/locales/cs/widgets/error-boundary.json index 040d88acdbc..cf41e07330c 100644 --- a/public/locales/cs/widgets/error-boundary.json +++ b/public/locales/cs/widgets/error-boundary.json @@ -7,8 +7,8 @@ } }, "modal": { - "text": "", - "label": "Vaše chyba", - "reportButton": "Nahlásit tuto chybu" + "text": "Widget se nečekaně zhroutil. Přečtěte si prosím dokumentaci a opravte případné překlepy.", + "label": "Vyskytlá chyba", + "reportButton": "Nahlásit tuto chybu na GitHubu" } } diff --git a/public/locales/da/layout/manage.json b/public/locales/da/layout/manage.json index 49d3d72a0d3..2c1cb69411c 100644 --- a/public/locales/da/layout/manage.json +++ b/public/locales/da/layout/manage.json @@ -26,7 +26,8 @@ "title": "Værktøjer", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "Migrer til 1.0" } }, "about": { diff --git a/public/locales/da/manage/migrate.json b/public/locales/da/manage/migrate.json new file mode 100644 index 00000000000..0c53f562c4c --- /dev/null +++ b/public/locales/da/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "Migrer til 1.0", + "pageTitle": "Migrér tavler, integrationer og brugere", + "description": "Eksporterer dine tavler og brugere til et ZIP-arkiv for at migrere dem til Homarr efter version 1.0.0", + "securityNote": { + "title": "Sikkerhedsnote", + "text": "Når du eksporterer brugere og integrationer, åbnes der også en modal med en krypteringsnøgle. Denne nøgle er nødvendig for at importere data til Homarr. Opbevar den sikkert, og del den ikke med nogen." + }, + "form": { + "label": "Vælg alt, hvad du vil eksportere", + "option": { + "boards": { + "label": "Eksporter tavler" + }, + "integrations": { + "label": "Eksporter integrationer", + "description": "Dette inkluderer krypterede legitimationsoplysninger til integrationer. Kun tilgængelig ved eksport af tavler" + }, + "users": { + "label": "Eksporter brugere", + "description": "Dette vil kun eksportere brugere med legitimiation, adgangskoders hash og salt er krypteret" + } + } + }, + "action": { + "export": "Eksport af data" + }, + "modal": { + "title": "Krypteringsnøgle", + "description": "Dine data er blevet eksporteret. Opbevar denne nøgle sikkert, og del den ikke med nogen. Du skal bruge denne nøgle for at importere dataene til Homarr.", + "copyDismiss": "Kopiér og afvis" + } +} \ No newline at end of file diff --git a/public/locales/da/widgets/error-boundary.json b/public/locales/da/widgets/error-boundary.json index cb9590d35ff..92fe0c7d351 100644 --- a/public/locales/da/widgets/error-boundary.json +++ b/public/locales/da/widgets/error-boundary.json @@ -7,8 +7,8 @@ } }, "modal": { - "text": "", - "label": "Din fejl", - "reportButton": "Rapportér denne fejl" + "text": "Widgetten crashede uventet. Læs venligst dokumentationen og ret stavefejl.", + "label": "Opstod en fejl", + "reportButton": "Rapporter denne fejl på GitHub" } } diff --git a/public/locales/de/layout/manage.json b/public/locales/de/layout/manage.json index fac655b52e0..2fabaeb8a90 100644 --- a/public/locales/de/layout/manage.json +++ b/public/locales/de/layout/manage.json @@ -26,7 +26,8 @@ "title": "Werkzeuge", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "Auf 1.0 migrieren" } }, "about": { diff --git a/public/locales/de/layout/modals/about.json b/public/locales/de/layout/modals/about.json index ebc92d835e9..111d0574ebf 100644 --- a/public/locales/de/layout/modals/about.json +++ b/public/locales/de/layout/modals/about.json @@ -8,7 +8,7 @@ "translators": "Übersetzer ({{count}})", "translatorsDescription": "Dank dieser Leute ist Homarr in {{languages}} Sprachen verfügbar! Möchten Sie helfen, Homarr in Ihre Sprache zu übersetzen? Lesen Sie hier, wie das geht.", "contributors": "Mitwirkende ({{count}})", - "contributorsDescription": "Diese Leute haben den Code erstellt, der Homarr zum Laufen bringt! Möchten Sie beim Aufbau von Homarr helfen? Lesen Sie hierwie das geht", + "contributorsDescription": "Diese Leute haben den Code entwickelt, der Homarr zum Laufen bringt! Möchten Sie beim Aufbau von Homarr helfen? Lesen Sie hier, wie Sie das tun können", "actions": { "toggleTheme": "Umschalten zwischen Hell- und Dunkelmodus", "focusSearchBar": "Suchleiste fokussieren", diff --git a/public/locales/de/manage/migrate.json b/public/locales/de/manage/migrate.json new file mode 100644 index 00000000000..c158d1cc151 --- /dev/null +++ b/public/locales/de/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "Auf 1.0 migrieren", + "pageTitle": "Boards, Integrationen und Benutzer migrieren", + "description": "Exportiert deine Boards und Benutzer in ein ZIP-Archiv, um sie nach Version 1.0.0 nach Homarr zu migrieren", + "securityNote": { + "title": "Sicherheitshinweis", + "text": "Beim Exportieren von Benutzern und Integrationen wird ein Modalfenster mit einem Verschlüsselungsschlüssel geöffnet. Dieser Schlüssel ist erforderlich, um Daten in Homarr zu importieren. Bewahren Sie ihn sicher auf und geben Sie ihn nicht an Dritte weiter." + }, + "form": { + "label": "Wählen Sie alles aus, was Sie exportieren möchten", + "option": { + "boards": { + "label": "Boards exportieren" + }, + "integrations": { + "label": "Integrationen exportieren", + "description": "Dies beinhaltet verschlüsselte Anmeldeinformationen für Integrationen. Nur verfügbar beim Exportieren von Boards" + }, + "users": { + "label": "Benutzer exportieren", + "description": "Damit werden nur die Anmeldeinformationen der Benutzer exportiert, Hash und Salt der Passwörter werden verschlüsselt" + } + } + }, + "action": { + "export": "Exportieren von Daten" + }, + "modal": { + "title": "Verschlüsselungsschlüssel", + "description": "Ihre Daten wurden exportiert. Bewahren Sie diesen Schlüssel sicher auf und geben Sie ihn nicht an Dritte weiter. Sie benötigen diesen Schlüssel, um die Daten in Homarr zu importieren.", + "copyDismiss": "Kopieren & Verwerfen" + } +} \ No newline at end of file diff --git a/public/locales/de/widgets/error-boundary.json b/public/locales/de/widgets/error-boundary.json index 4b2fd296243..e45b12add58 100644 --- a/public/locales/de/widgets/error-boundary.json +++ b/public/locales/de/widgets/error-boundary.json @@ -7,8 +7,8 @@ } }, "modal": { - "text": "", - "label": "Dein Fehler", - "reportButton": "Fehler melden" + "text": "Das Widet ist unerwartet abgestürzt. Bitte lesen Sie die Dokumentation und beheben Sie etwaige Tippfehler.", + "label": "Fehler aufgetreten", + "reportButton": "Diesen Fehler auf GitHub melden" } } diff --git a/public/locales/el/layout/manage.json b/public/locales/el/layout/manage.json index b2ad21f2894..910682fb54a 100644 --- a/public/locales/el/layout/manage.json +++ b/public/locales/el/layout/manage.json @@ -26,7 +26,8 @@ "title": "Εργαλεία", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/el/manage/migrate.json b/public/locales/el/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/el/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/el/widgets/error-boundary.json b/public/locales/el/widgets/error-boundary.json index 90a04fe3ccf..bc825722050 100644 --- a/public/locales/el/widgets/error-boundary.json +++ b/public/locales/el/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "Το σφάλμα σας", - "reportButton": "Αναφέρετε αυτό το σφάλμα" + "label": "", + "reportButton": "" } } diff --git a/public/locales/en/layout/manage.json b/public/locales/en/layout/manage.json index 39265bd04c3..9a5cee10c5f 100644 --- a/public/locales/en/layout/manage.json +++ b/public/locales/en/layout/manage.json @@ -26,7 +26,8 @@ "title": "Tools", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "Migrate to 1.0" } }, "about": { diff --git a/public/locales/en/manage/migrate.json b/public/locales/en/manage/migrate.json new file mode 100644 index 00000000000..ae58312f352 --- /dev/null +++ b/public/locales/en/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "Migrate to 1.0", + "pageTitle": "Migrate boards, integrations and users", + "description": "Exports your boards and users to a ZIP-Archive to migrate them to Homarr after version 1.0.0", + "securityNote": { + "title": "Security Note", + "text": "When exporting users and integrations it will also open a modal with an encryption key. This key is required to import the data into Homarr. Keep it safe and do not share it with anyone." + }, + "form": { + "label": "Select everything you want to export", + "option": { + "boards": { + "label": "Export boards" + }, + "integrations": { + "label": "Export integrations", + "description": "This will include encrypted credentials for integrations. Only available when exporting boards" + }, + "users": { + "label": "Export users", + "description": "This will only export credential users, passwords hash and salt are encrypted" + } + } + }, + "action": { + "export": "Export data" + }, + "modal": { + "title": "Encryption key", + "description": "Your data has been exported. Keep this key safe and do not share it with anyone. You will need this key to import the data into Homarr.", + "copyDismiss": "Copy & dismiss" + } +} \ No newline at end of file diff --git a/public/locales/es/authentication/login.json b/public/locales/es/authentication/login.json index a5be4571436..735b9a6b411 100644 --- a/public/locales/es/authentication/login.json +++ b/public/locales/es/authentication/login.json @@ -17,7 +17,7 @@ "afterLoginRedirection": "Después de iniciar sesión, serás redirigido a {{url}}", "providersEmpty": { "title": "Error del proveedor de autenticación", - "message": "Los proveedor(es) no están configurados; consulte sus registros para obtener más información." + "message": "El/Los Proveedor(es) no están configurados, por favor, revisa tus registros para obtener más información." } }, "alert": "Tus credenciales son incorrectas o esta cuenta no existe. Por favor, inténtalo de nuevo." diff --git a/public/locales/es/common.json b/public/locales/es/common.json index df7f0bf6b47..a24dbc960cf 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -17,7 +17,7 @@ "disabled": "Desactivado", "enableAll": "Activar todo", "disableAll": "Desactivar todo", - "setTimer": "", + "setTimer": "Configurar temporizador", "version": "Versión", "changePosition": "Cambiar posición", "remove": "Eliminar", diff --git a/public/locales/es/layout/manage.json b/public/locales/es/layout/manage.json index cd556ada281..b29d782adeb 100644 --- a/public/locales/es/layout/manage.json +++ b/public/locales/es/layout/manage.json @@ -26,7 +26,8 @@ "title": "Herramientas", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/es/layout/modals/add-app.json b/public/locales/es/layout/modals/add-app.json index bf530699652..c8fff03199e 100644 --- a/public/locales/es/layout/modals/add-app.json +++ b/public/locales/es/layout/modals/add-app.json @@ -32,7 +32,7 @@ "externalAddress": { "label": "Dirección externa", "description": "URL que se abrirá al hacer clic en la aplicación.", - "tooltip": "" + "tooltip": "Puedes usar algunas variables para crear direcciones dinámicas:

[homarr_base] : dirección completa excluyendo puerto y ruta. (Ejemplo: 'https://subdominio.homarr.dev')
[homarr_hostname] : url base completa incluyendo su subdominio actual. (Ejemplo: 'subdominio.homarr.dev')
[homarr_domain] : dominio con el subdominio filtrado. (Ejemplo: 'homarr.dev')
[homarr_protocol] : http/https

Todas estas variables dependen de la url actual." } }, "behaviour": { diff --git a/public/locales/es/manage/migrate.json b/public/locales/es/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/es/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/es/modules/date.json b/public/locales/es/modules/date.json index 00248dd2a08..8bcfab80cc1 100644 --- a/public/locales/es/modules/date.json +++ b/public/locales/es/modules/date.json @@ -22,7 +22,7 @@ }, "titleState": { "label": "Título del reloj", - "info": "El título personalizado y el código de zona horaria se pueden mostrar en tu widget.
También puedes mostrar solo la ciudad, no mostrar ninguna
o incluso mostrar solo la zona horaria cuando ambas están seleccionadas y no se proporcione ningún título.", + "info": "El título personalizado y el código de zona horaria se pueden mostrar en tu widget.
También puedes mostrar solo la ciudad, no mostrar nada,
o incluso mostrar solo la zona horaria cuando ambos están seleccionados pero no se proporciona un título.", "data": { "both": "Título y zona horaria", "city": "Solo título", diff --git a/public/locales/es/modules/dns-hole-controls.json b/public/locales/es/modules/dns-hole-controls.json index ec08dafe2aa..0ad79bd66df 100644 --- a/public/locales/es/modules/dns-hole-controls.json +++ b/public/locales/es/modules/dns-hole-controls.json @@ -16,10 +16,10 @@ } }, "durationModal": { - "title": "", - "hours": "", - "minutes": "", - "unlimited": "", - "set": "" + "title": "Establecer tiempo de desactivación", + "hours": "Horas", + "minutes": "Minutos", + "unlimited": "Dejar vacío para ilimitado", + "set": "Establecer" } } \ No newline at end of file diff --git a/public/locales/es/modules/health-monitoring.json b/public/locales/es/modules/health-monitoring.json index 0800c43a7f5..faffbcbc52c 100644 --- a/public/locales/es/modules/health-monitoring.json +++ b/public/locales/es/modules/health-monitoring.json @@ -9,8 +9,8 @@ }, "cpu": { "label": "Mostrar información de la CPU", - "load": "", - "minute": "", + "load": "Promedio de Carga", + "minute": "{{minute}} minutos", "minutes": "{{minutes}} Minutos" }, "memory": { @@ -57,43 +57,43 @@ "label": "Mostrar sección de almacenamiento" }, "sectionIndicatorColor": { - "label": "", - "info": "", + "label": "Requisito para que el indicador de estado de la sección sea 'OK'", + "info": "'Todos' requiere que todos los elementos estén en línea para que el indicador sea verde. 'Cualquiera' requiere que al menos un elemento esté en línea.", "data": { - "any": "", - "all": "" + "any": "Cualquiera Activo", + "all": "Todos Activos" } }, "ignoreCert": { - "label": "", - "info": "" + "label": "Ignorar Errores de Certificado", + "info": "Si está habilitado, el widget ignorará los errores de certificado al acceder a la API de Proxmox. Esto puede ser útil al acceder a Proxmox a través de HTTPS." } } }, "cpu": { "label": "CPU", - "load": "", - "minute": "" + "load": "Promedio de Carga", + "minute": "{{minute}} minutos" }, "memory": { - "label": "", - "totalMem": "", - "available": "" + "label": "Memoria", + "totalMem": "Espacio total: {{total}}GB", + "available": "Disponible: {{available}}GB - {{percentage}}%" }, "fileSystem": { - "label": "", - "available": "" + "label": "Archivo de Sistema", + "available": "Disponible: {{available}} - {{percentage}}%" }, "info": { - "uptime": "", - "uptimeFormat": "", - "updates": "", - "reboot": "" + "uptime": "Tiempo de Actividad", + "uptimeFormat": "{{days}} días, {{hours}} horas, {{minutes}} minutos", + "updates": "Actualización disponible", + "reboot": "Reiniciar" }, "errors": { "general": { - "title": "", - "text": "" + "title": "No se puede encontrar tu(s) sistema(s).", + "text": "Hubo un problema al conectarse a tu sistema. Por favor verifica tu configuración/integración(es)." } }, "headings": { @@ -118,24 +118,24 @@ "name": "Nombre", "cpu": "CPU", "ram": "RAM", - "node": "" + "node": "Nodo" } }, "popover": { - "node": "", - "vmid": "", + "node": "Nodo", + "vmid": "VMID", "details": "Detalles", - "cores": "", - "memSize": "", - "memRatio": "", - "diskSize": "", - "diskRatio": "", - "uptime": "", - "plugin": "", - "ha": "", - "sharedStorage": "", - "localStorage": "", - "na": "" + "cores": "Núcleos - {{maxCpu}}", + "memSize": "Memoria - {{maxMem}}", + "memRatio": "Memoria - {{usedMem}} / {{maxMem}}", + "diskSize": "Disco - {{maxDisk}}", + "diskRatio": "Disco - {{usedDisk}} / {{maxDisk}}", + "uptime": "Tiempo de actividad - {{uptime}}", + "plugin": "Complemento", + "ha": "Estado de HA - {{haState}}", + "sharedStorage": "Almacenamiento Compartido", + "localStorage": "Almacenamiento Local", + "na": "N/D" } } } \ No newline at end of file diff --git a/public/locales/es/modules/indexer-manager.json b/public/locales/es/modules/indexer-manager.json index 93145402723..d925c0f1070 100644 --- a/public/locales/es/modules/indexer-manager.json +++ b/public/locales/es/modules/indexer-manager.json @@ -1,22 +1,22 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Estado del Administrador de Índices", + "description": "Estado sobre tus índices", "settings": { - "title": "", + "title": "Estado del Administrador de Índices", "openIndexerSiteInNewTab": { - "label": "" + "label": "Abrir el Sitio del Indexador en una Nueva Pestaña" } } }, "indexersStatus": { - "title": "", - "testAllButton": "" + "title": "Administrador de Índices", + "testAllButton": "Probar todo" }, "errors": { "general": { - "title": "", - "text": "" + "title": "No se puede encontrar un administrador de índices", + "text": "Hubo un problema al conectarse a tu administrador de índices. Por favor verifica tu configuración/integración(es)." } } } \ No newline at end of file diff --git a/public/locales/es/modules/media-transcoding.json b/public/locales/es/modules/media-transcoding.json index f6086ab5e0e..7cb1e7e7155 100644 --- a/public/locales/es/modules/media-transcoding.json +++ b/public/locales/es/modules/media-transcoding.json @@ -1,96 +1,96 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Transcodificación de Medios", + "description": "Muestra información sobre la transcodificación de medios", "settings": { - "title": "", + "title": "Configuraciones de Transcodificación de Medios", "appId": { - "label": "" + "label": "Seleccionar una aplicación" }, "defaultView": { - "label": "", + "label": "Vista predeterminada", "data": { - "workers": "", + "workers": "Trabajadores", "queue": "Cola", - "statistics": "" + "statistics": "Estadísticas" } }, "showHealthCheck": { - "label": "" + "label": "Mostrar indicador de Verificación de Salud" }, "showHealthChecksInQueue": { - "label": "" + "label": "Mostrar Verificaciones de Salud en cola" }, "queuePageSize": { - "label": "" + "label": "Cola: Elementos por página" }, "showAppIcon": { - "label": "" + "label": "Mostrar icono de aplicación en la esquina inferior derecha" } } }, - "noAppSelected": "", + "noAppSelected": "Por favor selecciona una aplicación en la configuración del widget", "views": { "workers": { "table": { "header": { - "name": "", + "name": "Archivo", "eta": "Tiempo restante", "progress": "Completado %" }, "empty": "Vacío", "tooltip": { - "transcode": "", - "healthCheck": "" + "transcode": "Transcodificar", + "healthCheck": "Verificación de Salud" } } }, "queue": { "table": { "header": { - "name": "", + "name": "Archivo", "size": "Tamaño" }, "footer": { - "currentIndex": "" + "currentIndex": "{{start}}-{{end}} de {{total}}" }, "empty": "Vacío", "tooltip": { - "transcode": "", - "healthCheck": "" + "transcode": "Transcodificar", + "healthCheck": "Verificación de Salud" } } }, "statistics": { "empty": "Vacío", "box": { - "transcodes": "", - "healthChecks": "", - "files": "", - "spaceSaved": "" + "transcodes": "Transcodificaciones: {{value}}", + "healthChecks": "Verificaciones de Salud: {{value}}", + "files": "Archivos: {{value}}", + "spaceSaved": "Guardado: {{value}}" }, "pies": { - "transcodes": "", - "healthChecks": "", - "videoCodecs": "", - "videoContainers": "", - "videoResolutions": "" + "transcodes": "Transcodificaciones", + "healthChecks": "Verificaciones de Salud", + "videoCodecs": "Códecs", + "videoContainers": "Contenedores", + "videoResolutions": "Resoluciones" } } }, "error": { "title": "Error", - "message": "" + "message": "Ocurrió un error al obtener datos de Tdarr." }, "tabs": { - "workers": "", + "workers": "Trabajadores", "queue": "Cola", - "statistics": "" + "statistics": "Estadísticas" }, "healthCheckStatus": { - "title": "", - "queued": "", - "healthy": "", - "unhealthy": "" + "title": "Verificación de Salud", + "queued": "En cola", + "healthy": "Saludable", + "unhealthy": "No saludable" } } diff --git a/public/locales/es/modules/rss.json b/public/locales/es/modules/rss.json index b67c4f66b56..63d20f40aee 100644 --- a/public/locales/es/modules/rss.json +++ b/public/locales/es/modules/rss.json @@ -19,13 +19,13 @@ "label": "Límite de líneas de texto" }, "sortByPublishDateAscending": { - "label": "" + "label": "Ordenar por fecha de publicación (ascendente)" }, "sortPostsWithoutPublishDateToTheTop": { - "label": "" + "label": "Colocar publicaciones sin fecha de publicación en la parte superior" }, "maximumAmountOfPosts": { - "label": "" + "label": "Cantidad máxima de publicaciones" } }, "card": { diff --git a/public/locales/es/modules/smart-home/entity-state.json b/public/locales/es/modules/smart-home/entity-state.json index 084a64a2075..bf6ca4e9a23 100644 --- a/public/locales/es/modules/smart-home/entity-state.json +++ b/public/locales/es/modules/smart-home/entity-state.json @@ -11,22 +11,22 @@ }, "appendUnit": { "label": "Añadir unidad de medida", - "info": "Añadir el atributo unidad de medida al estado de la entidad." + "info": "Añadir el atributo de unidad de medida al estado de la entidad." }, "automationId": { "label": "ID de automatización opcional", - "info": "Su ID de automatización única. Siempre empieza por automation.XXXXX. Si no está establecida, no se podrá hacer clic en el widget, y solo se mostrará el estado. Al hacer clic, la entidad se refrescará." + "info": "Tu ID de automatización único. Siempre empieza con automation.XXXXX. Si no está configurado, el widget no será clicable y solo mostrará el estado. Después de hacer clic, el estado de la entidad se actualizará." }, "displayName": { "label": "Nombre a mostrar" }, "displayFriendlyName": { - "label": "Mostrar nombre descriptivo", - "info": "Mostrar el nombre descriptivo de Home Assistant en lugar del nombre para mostrar." + "label": "Mostrar nombre amigable", + "info": "Mostrar el nombre amigable de Home Assistant en lugar del nombre de visualización." }, "genericToggle": { - "label": "Cambio de entidad", - "info": "Realizar una acción genérica de Home Assistant en la entidad cuando se hace clic." + "label": "Interruptor de entidad", + "info": "Realizar una acción genérica de alternar de Home Assistant en la entidad al hacer clic." } } } diff --git a/public/locales/es/modules/smart-home/trigger-automation.json b/public/locales/es/modules/smart-home/trigger-automation.json index a6c02f1c0a5..2cf4a2a7636 100644 --- a/public/locales/es/modules/smart-home/trigger-automation.json +++ b/public/locales/es/modules/smart-home/trigger-automation.json @@ -6,7 +6,7 @@ "title": "Ejecutar una automatización", "automationId": { "label": "ID de automatización", - "info": "Su ID de automatización única. Siempre empieza por automation.XXXXX." + "info": "Tu ID de automatización único. Siempre empieza con automatización.XXXXX." }, "displayName": { "label": "Nombre a mostrar" diff --git a/public/locales/es/modules/torrents-status.json b/public/locales/es/modules/torrents-status.json index 9bfd10a9f7e..24ccf44cd37 100644 --- a/public/locales/es/modules/torrents-status.json +++ b/public/locales/es/modules/torrents-status.json @@ -31,15 +31,15 @@ "info": "Si está deshabilitado, solo se mostrará la relación global. La relación global seguirá usando las etiquetas si están configuradas" }, "columnOrdering": { - "label": "" + "label": "Habilitar el reordenamiento de las columnas" }, "rowSorting": { - "label": "" + "label": "Habilitar la clasificación de las filas" }, "columns": { - "label": "", + "label": "Seleccionar columnas para mostrar", "data": { - "date": "", + "date": "Fecha Agregada", "down": "Descarga", "up": "Subida", "eta": "Tiempo restante", @@ -47,7 +47,7 @@ } }, "nameColumnSize": { - "label": "" + "label": "Cambiar el tamaño de la columna del nombre" } } }, diff --git a/public/locales/es/modules/weather.json b/public/locales/es/modules/weather.json index 20572a9ddad..f4bfc629e7a 100644 --- a/public/locales/es/modules/weather.json +++ b/public/locales/es/modules/weather.json @@ -11,10 +11,10 @@ "label": "Mostrar el nombre de la ciudad" }, "displayWeekly": { - "label": "" + "label": "Mostrar Pronóstico Semanal" }, "forecastDays": { - "label": "" + "label": "Días a Mostrar" }, "location": { "label": "Ubicación" diff --git a/public/locales/es/widgets/error-boundary.json b/public/locales/es/widgets/error-boundary.json index 056c50f81ea..45255e2ae26 100644 --- a/public/locales/es/widgets/error-boundary.json +++ b/public/locales/es/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "Tu error", - "reportButton": "Informar de este error" + "label": "", + "reportButton": "" } } diff --git a/public/locales/et/layout/manage.json b/public/locales/et/layout/manage.json index 5b8d0e81b1f..5717e96a617 100644 --- a/public/locales/et/layout/manage.json +++ b/public/locales/et/layout/manage.json @@ -26,7 +26,8 @@ "title": "", "items": { "docker": "", - "api": "" + "api": "", + "migrate": "" } }, "about": { diff --git a/public/locales/et/manage/migrate.json b/public/locales/et/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/et/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/fr/layout/manage.json b/public/locales/fr/layout/manage.json index 9c0fe083f50..7a536b7a25c 100644 --- a/public/locales/fr/layout/manage.json +++ b/public/locales/fr/layout/manage.json @@ -26,7 +26,8 @@ "title": "Outils", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/fr/manage/migrate.json b/public/locales/fr/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/fr/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/fr/manage/users/edit.json b/public/locales/fr/manage/users/edit.json index b1c725e0f66..c851e299a6f 100644 --- a/public/locales/fr/manage/users/edit.json +++ b/public/locales/fr/manage/users/edit.json @@ -47,7 +47,7 @@ }, "confirm": { "label": "Supprimer définitivement", - "description": "J'ai conscience que cette action est permanente et que toutes les données du compte seront perdues." + "description": "Je suis conscient que cette action est permanente et que toutes les données du compte seront perdues." } } } diff --git a/public/locales/fr/manage/users/invites.json b/public/locales/fr/manage/users/invites.json index 3ac2c1049a3..391dbbf48bc 100644 --- a/public/locales/fr/manage/users/invites.json +++ b/public/locales/fr/manage/users/invites.json @@ -1,7 +1,7 @@ { "metaTitle": "Invitations des utilisateurs", "pageTitle": "Gérer les invitations des utilisateurs", - "description": "Avec les invitations, vous pouvez convier des utilisateurs sur votre instance Homarr. Une invitation ne sera valide que pendant un certain temps et ne peut être utilisée qu'une fois. L'expiration doit être définie entre 5 minutes et 12 mois.", + "description": "Avec les invitations, vous pouvez convier des utilisateurs sur votre instance Homarr. Une invitation ne sera valide que pendant un certain temps et ne peut être utilisée qu'une seule fois. L'expiration doit être définie entre 5 minutes et 12 mois.", "button": { "createInvite": "Créer une invitation", "deleteInvite": "Supprimer une invitation" @@ -9,7 +9,7 @@ "table": { "header": { "id": "ID", - "creator": "Créé par", + "creator": "Créateur", "expires": "Date d'expiration", "action": "Actions" }, @@ -36,7 +36,7 @@ "token": "Jeton" }, "button": { - "close": "Copier et fermer" + "close": "Copier et rejeter" } }, "delete": { diff --git a/public/locales/fr/tools/docker.json b/public/locales/fr/tools/docker.json index 586fe02aadb..c53d84d9407 100644 --- a/public/locales/fr/tools/docker.json +++ b/public/locales/fr/tools/docker.json @@ -8,7 +8,7 @@ "modals": { "selectBoard": { "title": "Choisir un tableau de bord", - "text": "Choisissez le tableau sur lequel vous souhaiyez ajouter les applications pour les conteneurs Docker sélectionnés.", + "text": "Choisissez le tableau sur lequel vous souhaitez ajouter les applications pour les conteneurs Docker sélectionnés.", "form": { "board": { "label": "Tableau de bord" @@ -24,7 +24,7 @@ "message": "Les applications pour les conteneurs Docker sélectionnés ont bien été ajoutées au tableau de bord." }, "error": { - "title": "Impossible d'ajouter des applications au tableau de bord", + "title": "Échec de l'ajout d'applications au tableau de bord", "message": "Les applications pour les conteneurs Docker sélectionnés n'ont pas pu être ajoutées au tableau de bord." } } diff --git a/public/locales/fr/widgets/error-boundary.json b/public/locales/fr/widgets/error-boundary.json index ab11368592f..fd919a076fa 100644 --- a/public/locales/fr/widgets/error-boundary.json +++ b/public/locales/fr/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "Votre erreur", - "reportButton": "Signaler cette erreur" + "label": "", + "reportButton": "" } } diff --git a/public/locales/he/layout/manage.json b/public/locales/he/layout/manage.json index 347e5b10a27..b7d1104e3ef 100644 --- a/public/locales/he/layout/manage.json +++ b/public/locales/he/layout/manage.json @@ -26,7 +26,8 @@ "title": "כלים", "items": { "docker": "דוקר", - "api": "ממשק API" + "api": "ממשק API", + "migrate": "" } }, "about": { diff --git a/public/locales/he/manage/migrate.json b/public/locales/he/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/he/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/he/widgets/error-boundary.json b/public/locales/he/widgets/error-boundary.json index 7ea684985a8..ef8f7938279 100644 --- a/public/locales/he/widgets/error-boundary.json +++ b/public/locales/he/widgets/error-boundary.json @@ -7,8 +7,8 @@ } }, "modal": { - "text": "", - "label": "השגיאה שלך", - "reportButton": "דווח על שגיאה זו" + "text": "הווידט התרסק במפתיע. אנא קרא את התיעוד ותקן שגיאות הקלדה.", + "label": "אירעה שגיאה", + "reportButton": "דווח על שגיאה זו ב-GitHub" } } diff --git a/public/locales/hr/layout/manage.json b/public/locales/hr/layout/manage.json index 770e1dfbcd8..b0ade67bed4 100644 --- a/public/locales/hr/layout/manage.json +++ b/public/locales/hr/layout/manage.json @@ -26,7 +26,8 @@ "title": "Alati", "items": { "docker": "Docker", - "api": "" + "api": "", + "migrate": "" } }, "about": { diff --git a/public/locales/hr/manage/migrate.json b/public/locales/hr/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/hr/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/hr/widgets/error-boundary.json b/public/locales/hr/widgets/error-boundary.json index 129bc753b65..4005ac2c1db 100644 --- a/public/locales/hr/widgets/error-boundary.json +++ b/public/locales/hr/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "Vaša greška", - "reportButton": "Prijavi ovu grešku" + "label": "", + "reportButton": "" } } diff --git a/public/locales/hu/layout/manage.json b/public/locales/hu/layout/manage.json index ccb768b4532..24501225021 100644 --- a/public/locales/hu/layout/manage.json +++ b/public/locales/hu/layout/manage.json @@ -26,7 +26,8 @@ "title": "Eszközök", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/hu/manage/migrate.json b/public/locales/hu/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/hu/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/hu/widgets/error-boundary.json b/public/locales/hu/widgets/error-boundary.json index 9e722aaa912..3b856693acd 100644 --- a/public/locales/hu/widgets/error-boundary.json +++ b/public/locales/hu/widgets/error-boundary.json @@ -7,8 +7,8 @@ } }, "modal": { - "text": "", - "label": "Az Ön hibája", - "reportButton": "Hiba jelentése" + "text": "A widget váratlanul összeomlott. Kérjük, olvassa el a dokumentációt, és javítsa ki a gépelési hibákat.", + "label": "Hiba történt", + "reportButton": "Hiba jelentése a GitHubon" } } diff --git a/public/locales/it/layout/manage.json b/public/locales/it/layout/manage.json index 1646feebd92..3dbde5d6903 100644 --- a/public/locales/it/layout/manage.json +++ b/public/locales/it/layout/manage.json @@ -26,7 +26,8 @@ "title": "Strumenti", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/it/manage/migrate.json b/public/locales/it/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/it/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/it/widgets/error-boundary.json b/public/locales/it/widgets/error-boundary.json index e554e895ef9..9e0053f397d 100644 --- a/public/locales/it/widgets/error-boundary.json +++ b/public/locales/it/widgets/error-boundary.json @@ -7,8 +7,8 @@ } }, "modal": { - "text": "", - "label": "Il tuo errore", - "reportButton": "Segnala questo errore" + "text": "Il widget è crashato inaspettatamente. Leggere la documentazione e correggere eventuali errori di battitura.", + "label": "Si è verificato un errore", + "reportButton": "Segnala questo errore su GitHub" } } diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json index c9fde867d48..722f06493a0 100644 --- a/public/locales/ja/common.json +++ b/public/locales/ja/common.json @@ -1,15 +1,15 @@ { "save": "保存", - "apply": "適用する", + "apply": "適用", "insert": "挿入", "about": "About", "cancel": "キャンセル", "close": "閉じる", - "back": "バック", + "back": "戻る", "delete": "削除", - "ok": "よっしゃー", + "ok": "OK", "edit": "編集", - "next": "次のページ", + "next": "次へ", "previous": "前へ", "confirm": "確認", "enabled": "有効", @@ -21,7 +21,7 @@ "version": "バージョン", "changePosition": "ポジションを変更する", "remove": "削除", - "removeConfirm": "{{item}} を削除してもよろしいですか?", + "removeConfirm": "{{item}} を本当に削除してもよろしいですか?", "createItem": "{{item}}を作成", "sections": { "settings": "設定", diff --git a/public/locales/ja/layout/manage.json b/public/locales/ja/layout/manage.json index f67b3f9d304..ce5d9af170c 100644 --- a/public/locales/ja/layout/manage.json +++ b/public/locales/ja/layout/manage.json @@ -26,7 +26,8 @@ "title": "ツール", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/ja/manage/migrate.json b/public/locales/ja/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/ja/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/ja/widgets/error-boundary.json b/public/locales/ja/widgets/error-boundary.json index e4439c013ee..777aaaac488 100644 --- a/public/locales/ja/widgets/error-boundary.json +++ b/public/locales/ja/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "あなたのエラー", - "reportButton": "このエラーを報告する" + "label": "", + "reportButton": "" } } diff --git a/public/locales/ko/layout/manage.json b/public/locales/ko/layout/manage.json index 481cc68706b..b6a519682a6 100644 --- a/public/locales/ko/layout/manage.json +++ b/public/locales/ko/layout/manage.json @@ -26,7 +26,8 @@ "title": "도구", "items": { "docker": "Docker", - "api": "" + "api": "", + "migrate": "" } }, "about": { diff --git a/public/locales/ko/manage/migrate.json b/public/locales/ko/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/ko/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/ko/widgets/error-boundary.json b/public/locales/ko/widgets/error-boundary.json index bce49cb924f..67ebf6ac5dd 100644 --- a/public/locales/ko/widgets/error-boundary.json +++ b/public/locales/ko/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "오류", - "reportButton": "이 오류 신고하기" + "label": "", + "reportButton": "" } } diff --git a/public/locales/lt/layout/manage.json b/public/locales/lt/layout/manage.json index a315987d067..f3eadc12195 100644 --- a/public/locales/lt/layout/manage.json +++ b/public/locales/lt/layout/manage.json @@ -26,7 +26,8 @@ "title": "Įrankiai", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/lt/manage/migrate.json b/public/locales/lt/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/lt/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/lv/layout/manage.json b/public/locales/lv/layout/manage.json index 6a6fe8b0202..d7e790a3838 100644 --- a/public/locales/lv/layout/manage.json +++ b/public/locales/lv/layout/manage.json @@ -26,7 +26,8 @@ "title": "Rīki", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/lv/manage/migrate.json b/public/locales/lv/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/lv/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/lv/widgets/error-boundary.json b/public/locales/lv/widgets/error-boundary.json index a691ec99fbd..4b874746905 100644 --- a/public/locales/lv/widgets/error-boundary.json +++ b/public/locales/lv/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "Jūsu kļūda", - "reportButton": "Ziņot par šo kļūdu" + "label": "", + "reportButton": "" } } diff --git a/public/locales/nl/layout/manage.json b/public/locales/nl/layout/manage.json index d6b846f3300..3d2122b17c6 100644 --- a/public/locales/nl/layout/manage.json +++ b/public/locales/nl/layout/manage.json @@ -26,7 +26,8 @@ "title": "Gereedschappen", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/nl/manage/migrate.json b/public/locales/nl/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/nl/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/nl/widgets/error-boundary.json b/public/locales/nl/widgets/error-boundary.json index b43207187e7..f8bfe10fcc2 100644 --- a/public/locales/nl/widgets/error-boundary.json +++ b/public/locales/nl/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "Je fout", - "reportButton": "Deze fout melden" + "label": "", + "reportButton": "" } } diff --git a/public/locales/no/layout/manage.json b/public/locales/no/layout/manage.json index a07bdc0e351..aa364582266 100644 --- a/public/locales/no/layout/manage.json +++ b/public/locales/no/layout/manage.json @@ -26,7 +26,8 @@ "title": "Verktøy", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/no/manage/migrate.json b/public/locales/no/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/no/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/no/modules/usenet.json b/public/locales/no/modules/usenet.json index 2cbf319c2d1..35072442337 100644 --- a/public/locales/no/modules/usenet.json +++ b/public/locales/no/modules/usenet.json @@ -16,7 +16,7 @@ "history": "Logg" }, "info": { - "sizeLeft": "Størrelse til venstre", + "sizeLeft": "Resterende datamengde", "paused": "Pauset" }, "queue": { diff --git a/public/locales/no/widgets/error-boundary.json b/public/locales/no/widgets/error-boundary.json index b071c64fe81..f923f39e81b 100644 --- a/public/locales/no/widgets/error-boundary.json +++ b/public/locales/no/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "Din feilmelding", - "reportButton": "Rapporter denne feilen" + "label": "", + "reportButton": "" } } diff --git a/public/locales/pl/layout/manage.json b/public/locales/pl/layout/manage.json index ca25e0b0775..7001d9f3d90 100644 --- a/public/locales/pl/layout/manage.json +++ b/public/locales/pl/layout/manage.json @@ -26,7 +26,8 @@ "title": "Narzędzia", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/pl/manage/migrate.json b/public/locales/pl/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/pl/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/pl/widgets/error-boundary.json b/public/locales/pl/widgets/error-boundary.json index 6c4b532aa6c..c90e13b5d4e 100644 --- a/public/locales/pl/widgets/error-boundary.json +++ b/public/locales/pl/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "Twój błąd", - "reportButton": "Zgłoś ten błąd" + "label": "", + "reportButton": "" } } diff --git a/public/locales/pt/layout/manage.json b/public/locales/pt/layout/manage.json index 1e7a5666c4f..8c9526181f4 100644 --- a/public/locales/pt/layout/manage.json +++ b/public/locales/pt/layout/manage.json @@ -26,7 +26,8 @@ "title": "Ferramentas", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/pt/manage/migrate.json b/public/locales/pt/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/pt/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/pt/widgets/error-boundary.json b/public/locales/pt/widgets/error-boundary.json index c4217b9fef1..6cbce87305e 100644 --- a/public/locales/pt/widgets/error-boundary.json +++ b/public/locales/pt/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "Seu erro", - "reportButton": "Reportar este erro" + "label": "", + "reportButton": "" } } diff --git a/public/locales/ro/layout/manage.json b/public/locales/ro/layout/manage.json index bf23af368b8..b8f85ac5f5e 100644 --- a/public/locales/ro/layout/manage.json +++ b/public/locales/ro/layout/manage.json @@ -26,7 +26,8 @@ "title": "Unelte", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/ro/manage/migrate.json b/public/locales/ro/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/ro/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/ro/widgets/error-boundary.json b/public/locales/ro/widgets/error-boundary.json index 4fbe140b686..f88e1ae129a 100644 --- a/public/locales/ro/widgets/error-boundary.json +++ b/public/locales/ro/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "Eroare dvs.", - "reportButton": "Raportați această eroare" + "label": "", + "reportButton": "" } } diff --git a/public/locales/ru/authentication/invite.json b/public/locales/ru/authentication/invite.json index 6c171077528..3f0013a0c05 100644 --- a/public/locales/ru/authentication/invite.json +++ b/public/locales/ru/authentication/invite.json @@ -1,7 +1,7 @@ { - "metaTitle": "Создать аккаунт", - "title": "Создать аккаунт", - "text": "Пожалуйста, укажите свои регистрационные данные ниже", + "metaTitle": "Создание учётной записи", + "title": "Создание учётной записи", + "text": "Пожалуйста, укажите данные для входа", "form": { "fields": { "username": { @@ -11,25 +11,25 @@ "label": "Пароль" }, "passwordConfirmation": { - "label": "Подтвердите пароль" + "label": "Подтверждение пароля" } }, "buttons": { - "submit": "Создать аккаунт" + "submit": "Создать учётную запись" } }, "notifications": { "loading": { - "title": "Создание аккаунта", + "title": "Создание учётной записи", "text": "Пожалуйста, подождите" }, "success": { - "title": "Аккаунт создан", - "text": "Ваш аккаунт был успешно создан" + "title": "Учётная запись создана", + "text": "Ваша учётная запись успешно создана" }, "error": { "title": "Ошибка", - "text": "Что-то пошло не так, произошла следующая ошибка: {{error}}" + "text": "Что-то пошло не так, получена следующая ошибка: {{error}}" } } } \ No newline at end of file diff --git a/public/locales/ru/authentication/login.json b/public/locales/ru/authentication/login.json index e1216054732..2d2af9d06d6 100644 --- a/public/locales/ru/authentication/login.json +++ b/public/locales/ru/authentication/login.json @@ -1,7 +1,7 @@ { - "metaTitle": "Вход в систему", + "metaTitle": "Вход", "title": "С возвращением!", - "text": "Пожалуйста, введите свои учетные данные", + "text": "Пожалуйста, введите данные для входа", "form": { "fields": { "username": { @@ -16,9 +16,9 @@ }, "afterLoginRedirection": "После входа вы будете перенаправлены на {{url}}", "providersEmpty": { - "title": "Ошибка провайдера авторизации", - "message": "Провайдер(ы) не настроен(ы), проверьте журналы для получения дополнительной информации." + "title": "Ошибка провайдера аутентификации", + "message": "Провайдер(ы) не настроены, проверьте журналы для получения дополнительной информации." } }, - "alert": "Ваши учетные данные неверны или данный аккаунт не существует. Пожалуйста, попробуйте еще раз." + "alert": "Неверные учётные данные или такой учётной записи не существует. Пожалуйста, попробуйте ещё раз." } \ No newline at end of file diff --git a/public/locales/ru/boards/common.json b/public/locales/ru/boards/common.json index 463afeb63da..f62c006edb1 100644 --- a/public/locales/ru/boards/common.json +++ b/public/locales/ru/boards/common.json @@ -1,5 +1,5 @@ { "header": { - "customize": "Настройка панели" + "customize": "Настроить панель" } } \ No newline at end of file diff --git a/public/locales/ru/boards/customize.json b/public/locales/ru/boards/customize.json index 3256e328148..a162b050247 100644 --- a/public/locales/ru/boards/customize.json +++ b/public/locales/ru/boards/customize.json @@ -1,6 +1,6 @@ { "metaTitle": "Настройка панели {{name}}", - "pageTitle": "Настройка для панели {{name}}", + "pageTitle": "Настройка панели {{name}}", "backToBoard": "Вернуться к панели", "settings": { "appearance": { @@ -10,16 +10,16 @@ }, "save": { "button": "Сохранить изменения", - "note": "Осторожно, у вас есть несохраненные изменения!" + "note": "Внимание, у вас есть несохранённые изменения!" }, "notifications": { "pending": { - "title": "Сохранение настройки", - "message": "Пожалуйста, подождите, пока мы сохраняем вашу настройку" + "title": "Сохранение настроек", + "message": "Пожалуйста, подождите, пока мы сохраняем ваши настройки" }, "success": { - "title": "Настройка сохранена", - "message": "Ваша настройка успешно сохранена" + "title": "Настройки сохранены", + "message": "Ваши настройки успешно сохранены" }, "error": { "title": "Ошибка", diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index b06efae7e30..46c6a9204ee 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -8,9 +8,9 @@ "back": "Назад", "delete": "Удалить", "ok": "ОК", - "edit": "Изменить", + "edit": "Редактировать", "next": "Далее", - "previous": "Предыдущий", + "previous": "Назад", "confirm": "Подтвердить", "enabled": "Включено", "duplicate": "Создать копию", @@ -25,14 +25,14 @@ "createItem": "+ создать {{item}}", "sections": { "settings": "Настройки", - "dangerZone": "Зона опасности" + "dangerZone": "Опасная зона" }, "secrets": { "apiKey": "API-ключ", "username": "Имя пользователя", "password": "Пароль" }, - "tip": "Совет: ", + "tip": "Подсказка: ", "time": { "seconds": "секунд", "minutes": "минут", @@ -44,7 +44,7 @@ "medium": "среднего", "large": "большого" }, - "seeMore": "Узнать больше...", + "seeMore": "Подробнее...", "position": { "left": "Слева", "center": "По центру", diff --git a/public/locales/ru/layout/common.json b/public/locales/ru/layout/common.json index 1798b16425b..c0124e04052 100644 --- a/public/locales/ru/layout/common.json +++ b/public/locales/ru/layout/common.json @@ -2,17 +2,17 @@ "modals": { "blockedPopups": { "title": "Всплывающие окна заблокированы", - "text": "Ваш браузер заблокировал доступ Homarr к своему API. Это обычно вызвано блокировщиками рекламы или отказом в разрешениях. Homarr не может автоматически запрашивать разрешения.", + "text": "Ваш браузер заблокировал доступ Homarr к его API. Обычно это происходит из-за блокировщиков рекламы или отказа в разрешениях. Homarr не может запросить разрешения автоматически.", "list": { "browserPermission": "Нажмите на значок рядом с URL и проверьте разрешения. Разрешить показ всплывающих окон", - "adBlockers": "Отключите блокировщики рекламы и инструменты безопасности в вашем браузере", + "adBlockers": "Отключите блокировщики рекламы и инструменты безопасности в браузере", "otherBrowser": "Попробуйте другой браузер" } } }, "actions": { "category": { - "openAllInNewTab": "Открыть все в новых вкладках" + "openAllInNewTab": "Открыть все в новой вкладке" } }, "menu": { diff --git a/public/locales/ru/layout/element-selector/selector.json b/public/locales/ru/layout/element-selector/selector.json index a83b8e95d87..a9c920b5716 100644 --- a/public/locales/ru/layout/element-selector/selector.json +++ b/public/locales/ru/layout/element-selector/selector.json @@ -1,9 +1,9 @@ { "modal": { "title": "Добавить новую плитку", - "text": "Плитки - это основной элемент в Homarr. Они используются для отображения ваших приложений и другой информации. Вы можете добавить столько плиток, сколько захотите." + "text": "Плитки - основной элемент Homarr. Они используются для отображения ваших приложений и другой информации. Вы можете добавить сколько угодно плиток." }, - "widgetDescription": "Виджеты взаимодействуют с вашими приложениями, предоставляя вам больше контроля над ними. Обычно они требуют дополнительной настройки перед использованием.", + "widgetDescription": "Виджеты взаимодействуют с вашими приложениями, предоставляя больше возможностей управления. Обычно требуют дополнительной настройки перед использованием.", "goBack": "Вернуться к предыдущему шагу", "actionIcon": { "tooltip": "Добавить плитку" @@ -19,7 +19,7 @@ "defaultName": "Новая категория", "created": { "title": "Категория создана", - "message": "Создана категория \"{{name}}\"" + "message": "Категория «{{name}}» была создана" } }, "importFromDocker": "Импорт из Docker" diff --git a/public/locales/ru/layout/errors/access-denied.json b/public/locales/ru/layout/errors/access-denied.json index 71e587b20dc..8f4e09c6d7d 100644 --- a/public/locales/ru/layout/errors/access-denied.json +++ b/public/locales/ru/layout/errors/access-denied.json @@ -1,5 +1,5 @@ { - "title": "Доступ запрещен", - "text": "У вас недостаточно прав для доступа к этой странице. Если вы считаете, что это не было преднамеренно, пожалуйста, свяжитесь с вашим администратором.", - "switchAccount": "Переключитесь на другой аккаунт" + "title": "Доступ запрещён", + "text": "У вас недостаточно прав для доступа к этой странице. Если вы считаете, что это ошибка, пожалуйста, обратитесь к администратору.", + "switchAccount": "Переключиться на другую учётную запись" } \ No newline at end of file diff --git a/public/locales/ru/layout/errors/not-found.json b/public/locales/ru/layout/errors/not-found.json index acdeb41af86..786881f06b3 100644 --- a/public/locales/ru/layout/errors/not-found.json +++ b/public/locales/ru/layout/errors/not-found.json @@ -1,5 +1,5 @@ { "title": "Страница не найдена", - "text": "Эта страница не может быть найдена. URL-адрес для этой страницы может быть устаревшим, URL-адрес недействителен или у вас нет необходимых разрешений для доступа к этому ресурсу.", - "button": "Перейти на главную страницу" + "text": "Эта страница не может быть найдена. Возможно, срок действия URL истёк, адрес неверен, или у вас нет необходимых прав доступа к этому ресурсу.", + "button": "Вернуться на главную" } \ No newline at end of file diff --git a/public/locales/ru/layout/header.json b/public/locales/ru/layout/header.json index c87e17662d2..a37631cba66 100644 --- a/public/locales/ru/layout/header.json +++ b/public/locales/ru/layout/header.json @@ -2,20 +2,20 @@ "search": { "label": "Поиск", "engines": { - "web": "Поиск {{query}} в интернете", - "youtube": "Поиск {{query}} на YouTube", - "torrent": "Поиск {{query}} по торрентам", - "movie": "Поиск {{query}} в приложении {{app}}" + "web": "Искать «{{query}}» в интернете", + "youtube": "Искать «{{query}}» на YouTube", + "torrent": "Искать торренты «{{query}}»", + "movie": "Искать «{{query}}» в {{app}}" } }, "actions": { "avatar": { "switchTheme": "Переключить тему", - "preferences": "Пользовательские настройки", + "preferences": "Настройки пользователя", "defaultBoard": "Панель по умолчанию", "manage": "Управление", - "logout": "Выйти как {{username}}", - "login": "Вход в систему" + "logout": "Выйти ({{username}})", + "login": "Вход" } }, "modals": { diff --git a/public/locales/ru/layout/header/actions/toggle-edit-mode.json b/public/locales/ru/layout/header/actions/toggle-edit-mode.json index 296da3edf08..1e2d5696f69 100644 --- a/public/locales/ru/layout/header/actions/toggle-edit-mode.json +++ b/public/locales/ru/layout/header/actions/toggle-edit-mode.json @@ -1,12 +1,12 @@ { - "description": "В режиме редактирования можно настраивать плитки и приложения. Изменения не сохраняются до выхода из режима редактирования.", + "description": "В режиме редактирования вы можете настраивать плитки и конфигурировать приложения. Изменения не сохраняются до выхода из режима редактирования.", "button": { "disabled": "Войти в режим редактирования", - "enabled": "Выход и сохранение" + "enabled": "Выйти и сохранить" }, "popover": { "title": "Режим редактирования включен для <1>{{size}} размера", - "text": "Теперь вы можете скорректировать и настраивать свои приложения. Изменения не сохраняются до выхода из режима редактирования" + "text": "Теперь вы можете настраивать приложения. Изменения не сохраняются до выхода из режима редактирования" }, - "unloadEvent": "Выйти из режима редактирования, чтобы сохранить ваши изменения" + "unloadEvent": "Выйдите из режима редактирования для сохранения изменений" } diff --git a/public/locales/ru/layout/manage.json b/public/locales/ru/layout/manage.json index 57d1f327057..994995108b0 100644 --- a/public/locales/ru/layout/manage.json +++ b/public/locales/ru/layout/manage.json @@ -14,10 +14,10 @@ } }, "help": { - "title": "Помощь", + "title": "Справка", "items": { "documentation": "Документация", - "report": "Сообщить о проблеме / ошибке", + "report": "Сообщить о проблеме", "discord": "Сообщество Discord", "contribute": "Внести вклад" } @@ -26,7 +26,8 @@ "title": "Инструменты", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "Миграция на версию 1.0" } }, "about": { diff --git a/public/locales/ru/layout/modals/about.json b/public/locales/ru/layout/modals/about.json index 45f91bfba8a..24a0e2366d6 100644 --- a/public/locales/ru/layout/modals/about.json +++ b/public/locales/ru/layout/modals/about.json @@ -1,16 +1,16 @@ { - "description": "Homarr - это стильная, современная панель управления, которая выводит все ваши приложения и сервисы на одном экране. С Homarr вы можете получить доступ и управлять всем в одном удобном месте. Homarr беспрепятственно интегрируется с добавленными вами приложениями, предоставляя ценную информацию и полный контроль. Установка проста, Homarr поддерживает широкий спектр методов развертывания.", - "addToDashboard": "Добавить на панель", - "tip": "Mod указывает на вашу модифицирующую клавишу, это Ctrl и Command/Super/Windows клавиши", - "key": "Горячие клавиши", + "description": "Homarr — это элегантная, современная панель управления, которая держит все ваши приложения и службы под рукой. С Homarr вы можете получить доступ ко всему и управлять всем из одного удобного места. Homarr легко интегрируется с добавленными приложениями, предоставляя вам важную информацию и полный контроль. Установка проста, и Homarr поддерживает широкий спектр методов развёртывания.", + "addToDashboard": "Добавить на панель управления", + "tip": "Клавиша-модификатор — это Ctrl и Command/Super/Windows", + "key": "Сочетание клавиш", "action": "Действие", "keybinds": "Сочетания клавиш", "translators": "Переводчики ({{count}})", - "translatorsDescription": "Благодаря этим людям Homarr доступен на {{languages}} языках! Хотите помочь перевести Homarr на ваш язык? Как это сделать читайте здесь.", - "contributors": "Участники ({{count}})", - "contributorsDescription": "Эти люди написали код, благодаря которому Homarr работает! Хотите помочь в разработке Homarr? Прочтите, как это сделать здесь", + "translatorsDescription": "Благодаря этим людям Homarr доступен на {{languages}} языках! Хотите помочь перевести Homarr на ваш язык? Узнайте, как это сделать, здесь.", + "contributors": "Участники разработки ({{count}})", + "contributorsDescription": "Эти люди создали код, благодаря которому работает Homarr! Хотите помочь в разработке Homarr? Узнайте, как это сделать, здесь", "actions": { - "toggleTheme": "Переключить светлый/темный режим", + "toggleTheme": "Переключить светлую/тёмную тему", "focusSearchBar": "Фокус на панели поиска", "openDocker": "Открыть виджет Docker", "toggleEdit": "Переключить режим редактирования" @@ -18,13 +18,13 @@ "metrics": { "configurationSchemaVersion": "Версия схемы конфигурации", "version": "Версия", - "nodeEnvironment": "Node окружение", - "i18n": "Загруженные пространства имен перевода I18n", + "nodeEnvironment": "Окружение Node", + "i18n": "Загруженные пространства имён переводов I18n", "locales": "Настроенные локали I18n", "experimental_disableEditMode": "ЭКСПЕРИМЕНТАЛЬНО: Отключить режим редактирования" }, "version": { "new": "Новая: {{newVersion}}", - "dropdown": "Версия {{newVersion}} уже доступна! Текущая версия: {{currentVersion}}" + "dropdown": "Доступна версия {{newVersion}}! Текущая версия: {{currentVersion}}" } } \ No newline at end of file diff --git a/public/locales/ru/layout/modals/add-app.json b/public/locales/ru/layout/modals/add-app.json index fadf3708939..ba06faa2927 100644 --- a/public/locales/ru/layout/modals/add-app.json +++ b/public/locales/ru/layout/modals/add-app.json @@ -1,6 +1,6 @@ { "tabs": { - "general": "Общие", + "general": "Основное", "behaviour": "Поведение", "network": "Сеть", "appearance": "Внешний вид", @@ -9,82 +9,82 @@ "general": { "appname": { "label": "Название приложения", - "description": "Используется для отображения приложения на панели." + "description": "Используется для отображения приложения на панели управления." }, "internalAddress": { "label": "Внутренний адрес", "description": "Внутренний IP-адрес приложения.", "troubleshoot": { "label": "Возникли проблемы?", - "header": "Ниже приведен список часто встречающихся ошибок и способы их устранения:", + "header": "Вот список распространённых ошибок и способов их устранения:", "lines": { - "nothingAfterPort": "В большинстве, если не во всех случаях, не следует вводить какой-либо путь после порта. (Даже '/admin' для pihole или '/web' для plex)", - "protocolCheck": "Убедитесь, что URL начинается с http или https и что вы используете правильный протокол.", - "preferIP": "Рекомендуется использовать прямой IP-адрес машины или контейнера, с которым вы хотите взаимодействовать.", - "enablePings": "Проверьте правильность IP, включив функцию пинга. Настройка панели -> Макет -> Включить пинг. На плитке вашего приложения появится маленький красный или зеленый кружок, наведя на который вы увидите код ответа (в большинстве случаев ожидается зеленый кружок с кодом 200).", - "wget": "Чтобы убедиться, что Homarr может взаимодействовать с другими приложениями, обязательно выполните команды wget/curl/ping с IP-адресом и портом приложения.", - "iframe": "Что касается iframes, то они всегда должны использовать тот же протокол (http/s), что и Homarr.", - "clearCache": "Некоторые данные сохраняются в кэше, поэтому интеграция может не работать, если вы не очистили кэш в общих настройках Homarr." + "nothingAfterPort": "В большинстве случаев не следует указывать путь после порта (даже '/admin' для pihole или '/web' для plex)", + "protocolCheck": "Всегда проверяйте, что URL начинается с http или https, и убедитесь, что используете правильный протокол.", + "preferIP": "Рекомендуется использовать прямой IP-адрес машины или контейнера, с которым вы пытаетесь установить связь.", + "enablePings": "Проверьте правильность IP-адреса, включив проверку доступности. Настройка панели -> Макет -> Включить проверку доступности. На плитках приложений появится красный или зелёный индикатор, при наведении на который будет показан код ответа (в большинстве случаев ожидается зелёный индикатор с кодом 200).", + "wget": "Чтобы убедиться, что Homarr может взаимодействовать с другими приложениями, проверьте доступность IP:порт с помощью wget/curl/ping.", + "iframe": "Для встраиваемых фреймов всегда должен использоваться тот же протокол (http/s), что и у Homarr.", + "clearCache": "Некоторая информация сохраняется в кеше, поэтому интеграция может не работать, пока вы не очистите кеш в общих настройках Homarr." }, - "footer": "По вопросам решения проблем обращайтесь в наш {{discord}}." + "footer": "Для дополнительной помощи обратитесь в наш {{discord}}." } }, "externalAddress": { "label": "Внешний адрес", - "description": "URL-адрес, который будет открыт при нажатии на приложение.", - "tooltip": "Вы можете использовать несколько переменных для создания динамических адресов:

[homarr_base]: полный адрес без порта и пути. (Пример: 'https://subdomain.homarr.dev')
[homarr_hostname]: полный базовый URL, включая текущий поддомен. (Пример: 'subdomain.homarr.dev')
[homarr_domain]: домен без поддомена. (Пример: 'homarr.dev')
[homarr_protocol]: http/https

Эти переменные зависят от текущего URL." + "description": "URL, который будет открываться при нажатии на приложение.", + "tooltip": "Вы можете использовать несколько переменных для создания динамических адресов:

[homarr_base] : полный адрес без порта и пути. (Пример: 'https://subdomain.homarr.dev')
[homarr_hostname] : полный базовый URL, включая текущий поддомен. (Пример: 'subdomain.homarr.dev')
[homarr_domain] : домен без поддомена. (Пример: 'homarr.dev')
[homarr_protocol] : http/https

Эти переменные зависят от текущего URL." } }, "behaviour": { "isOpeningNewTab": { - "label": "Открыть в новой вкладке", + "label": "Открывать в новой вкладке", "description": "Открывать приложение в новой вкладке вместо текущей." }, "tooltipDescription": { "label": "Описание приложения", - "description": "Введенный вами текст появится при наведении курсора на ваше приложение.\nЗдесь вы можете дать пользователям больше информации о вашем приложении или оставить поле пустым." + "description": "Этот текст будет отображаться при наведении на приложение.\\nИспользуйте его, чтобы предоставить пользователям дополнительную информацию о приложении, или оставьте пустым." }, - "customProtocolWarning": "Используется нестандартный протокол. Это может потребовать установки дополнительных приложений и представлять угрозу для безопасности. Убедитесь, что ваш адрес надежен и является доверенным." + "customProtocolWarning": "Используется нестандартный протокол. Это может потребовать предустановленных приложений и создать риски безопасности. Убедитесь, что ваш адрес безопасен и надёжен." }, "network": { "statusChecker": { - "label": "Проверка статуса", - "description": "Проверяет, включено ли ваше приложение, используя простой HTTP(S) запрос." + "label": "Проверка состояния", + "description": "Проверяет доступность приложения с помощью простого HTTP(S) запроса." }, "statusCodes": { - "label": "HTTP статусные коды", - "description": "HTTP статусные коды, которые считаются включенными." + "label": "HTTP коды состояния", + "description": "HTTP коды состояния, которые считаются признаком доступности." } }, "appearance": { "icon": { - "label": "Иконка приложения", - "description": "Начните вводить текст, чтобы найти иконку. Вы также можете вставить URL-адрес изображения, чтобы использовать собственную иконку.", + "label": "Значок приложения", + "description": "Начните вводить текст для поиска значка. Также можно вставить URL изображения для использования своего значка.", "autocomplete": { "title": "Результаты не найдены", - "text": "Попробуйте использовать более конкретное условие поиска. Если вы не можете найти нужную иконку, вставьте URL-адрес изображения выше для пользовательской иконки" + "text": "Попробуйте использовать более точный поисковый запрос. Если не удаётся найти нужный значок, вставьте URL изображения выше для использования пользовательского значка" }, "noItems": { - "title": "Загрузка внешних иконок", + "title": "Загрузка внешних значков", "text": "Это может занять несколько секунд" } }, "appNameFontSize": { - "label": "Размер шрифта названия приложения", - "description": "Установить размер шрифта отображаемого на плитке названия приложения." + "label": "Размер шрифта названия", + "description": "Установите размер шрифта для отображения названия приложения на плитке." }, "appNameStatus": { - "label": "Статус названия приложения", - "description": "Выберите, где будет отображаться заголовок, если он вообще будет отображаться.", + "label": "Отображение названия", + "description": "Выберите, где должно отображаться название приложения.", "dropdown": { - "normal": "Показать заголовок только на плитке", - "hover": "Показать заголовок только при наведении курсора", - "hidden": "Вообще не показывать" + "normal": "Показывать название на плитке", + "hover": "Показывать название только при наведении", + "hidden": "Не показывать название" } }, "positionAppName": { - "label": "Положение названия приложения", - "description": "Положение названия приложения относительно иконки.", + "label": "Расположение названия", + "description": "Положение названия приложения относительно значка.", "dropdown": { "top": "Сверху", "right": "Справа", @@ -93,37 +93,37 @@ } }, "lineClampAppName": { - "label": "Максимальное количество строк для названия приложения", - "description": "Определяет, на скольких строках максимально должно поместиться ваше название. Установите 0 для неограниченного количества строк." + "label": "Ограничение строк названия", + "description": "Определяет максимальное количество строк для названия. Установите 0 для неограниченного количества." } }, "integration": { "type": { "label": "Настройка интеграции", - "description": "Настройка интеграции, которая будет использоваться для подключения к вашему приложению.", - "placeholder": "Выбрать интеграцию", + "description": "Конфигурация интеграции, которая будет использоваться для подключения к приложению.", + "placeholder": "Выберите интеграцию", "defined": "Определено", "undefined": "Не определено", "public": "Публичный", "private": "Приватный", - "explanationPrivate": "Приватный секрет будет отправлен на сервер только один раз. После обновления страницы он никогда не будет отправлен снова.", - "explanationPublic": "Публичный секрет всегда передается клиенту и доступен через API. Он не должен содержать никаких конфиденциальных значений, таких как имена пользователей, пароли, токены, сертификаты и тому подобное!" + "explanationPrivate": "Приватный ключ отправляется на сервер только один раз. После обновления страницы браузера он больше никогда не будет отправлен.", + "explanationPublic": "Публичный ключ всегда отправляется клиенту и доступен через API. Он не должен содержать конфиденциальные данные, такие как имена пользователей, пароли, токены, сертификаты и подобное!" }, "secrets": { - "description": "Чтобы обновить секрет, введите значение и нажмите кнопку \"Сохранить\". Чтобы удалить секрет, воспользуйтесь кнопкой \"Очистить секрет\".", - "warning": "Ваши учетные данные служат доступом к вашей интеграции, и вы никогда не должны передавать их кому-либо еще. Команда Homarr никогда не запрашивает учетные данные. Убедитесь, что храните и безопасно управляйте вашими секретами.", - "clear": "Очистить секрет", - "save": "Сохранить секрет", - "update": "Обновить секрет" + "description": "Чтобы обновить ключ, введите значение и нажмите кнопку сохранения. Для удаления ключа используйте кнопку очистки.", + "warning": "Ваши учётные данные служат для доступа к интеграциям, и вы никогда не должны делиться ими с кем-либо. Команда Homarr никогда не запрашивает учётные данные. Обязательно храните и управляйте своими ключами безопасно.", + "clear": "Очистить ключ", + "save": "Сохранить ключ", + "update": "Обновить ключ" } }, "validation": { - "popover": "Ваша форма содержит недопустимые данные. Следовательно, она не может быть сохранена. Пожалуйста, устраните все проблемы и нажмите на эту кнопку еще раз, чтобы сохранить изменения", - "name": "Имя обязательно", - "noUrl": "Url обязателен", - "invalidUrl": "Значение не является допустимым url", + "popover": "Форма содержит недопустимые данные и не может быть сохранена. Пожалуйста, исправьте все ошибки и нажмите эту кнопку снова для сохранения изменений", + "name": "Название обязательно", + "noUrl": "URL обязателен", + "invalidUrl": "Значение не является допустимым URL", "noIconUrl": "Это поле обязательно", - "noExternalUri": "Требуется внешний URI", + "noExternalUri": "Внешний URI обязателен", "invalidExternalUri": "Внешний URI не является допустимым" } } diff --git a/public/locales/ru/layout/modals/change-position.json b/public/locales/ru/layout/modals/change-position.json index 6d70393ea69..062162109b5 100644 --- a/public/locales/ru/layout/modals/change-position.json +++ b/public/locales/ru/layout/modals/change-position.json @@ -4,5 +4,5 @@ "height": "Высота", "yPosition": "Позиция по оси Y", "zeroOrHigher": "0 или больше", - "betweenXandY": "Между {{min}} и {{max}}" + "betweenXandY": "От {{min}} до {{max}}" } \ No newline at end of file diff --git a/public/locales/ru/manage/boards.json b/public/locales/ru/manage/boards.json index e90418e1ba5..7621e4f65ab 100644 --- a/public/locales/ru/manage/boards.json +++ b/public/locales/ru/manage/boards.json @@ -11,10 +11,10 @@ "view": "Просмотр панели" }, "menu": { - "setAsDefault": "Установить как панель по умолчанию", + "setAsDefault": "Сделать панелью по умолчанию", "delete": { "label": "Удалить навсегда", - "disabled": "Удаление заблокировано, поскольку старые компоненты Homarr не позволяют удалять конфигурацию по умолчанию. Удаление будет возможным в будущем." + "disabled": "Удаление отключено, так как старые компоненты Homarr не поддерживают удаление панели по умолчанию. Функция будет доступна в будущем." }, "duplicate": "Создать копию", "rename": { @@ -23,8 +23,8 @@ "title": "Переименовать панель {{name}}", "fields": { "name": { - "label": "Новое имя", - "placeholder": "Новое имя панели" + "label": "Новое название", + "placeholder": "Новое название панели" } } } @@ -40,15 +40,15 @@ }, "modals": { "delete": { - "title": "Удалить панель", - "text": "Вы уверены, что хотите удалить эту панель? Это действие нельзя отменить и ваши данные будут потеряны навсегда." + "title": "Удаление панели", + "text": "Вы уверены, что хотите удалить эту панель? Это действие нельзя отменить, и все данные будут безвозвратно потеряны." }, "create": { - "title": "Создать панель", - "text": "Название не может быть изменено после создания панели.", + "title": "Создание панели", + "text": "После создания панели её название нельзя будет изменить.", "form": { "name": { - "label": "Имя" + "label": "Название" }, "submit": "Создать" } diff --git a/public/locales/ru/manage/index.json b/public/locales/ru/manage/index.json index d4a088b74a7..1f12ea2adb5 100644 --- a/public/locales/ru/manage/index.json +++ b/public/locales/ru/manage/index.json @@ -1,22 +1,22 @@ { "metaTitle": "Управление", "hero": { - "title": "Добро пожаловать, {{username}}", - "fallbackUsername": "Анонимный", - "subtitle": "Добро пожаловать в Ваш центр приложений. Организуйте, оптимизируйте и побеждайте!" + "title": "С возвращением, {{username}}", + "fallbackUsername": "Гость", + "subtitle": "Добро пожаловать в центр управления приложениями. Организуйте, оптимизируйте и управляйте!" }, "quickActions": { "title": "Быстрые действия", "boards": { "title": "Ваши панели", - "subtitle": "Создавайте и управляйте своими панелями" + "subtitle": "Создание и управление панелями" }, "inviteUsers": { "title": "Пригласить нового пользователя", - "subtitle": "Создать и отправить приглашение для регистрации" + "subtitle": "Создание и отправка приглашения для регистрации" }, "manageUsers": { - "title": "Управлять пользователями", + "title": "Управление пользователями", "subtitle": "Удаление и управление пользователями" } } diff --git a/public/locales/ru/manage/migrate.json b/public/locales/ru/manage/migrate.json new file mode 100644 index 00000000000..c4ae1c62857 --- /dev/null +++ b/public/locales/ru/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "Миграция на версию 1.0", + "pageTitle": "Миграция панелей, интеграций и пользователей", + "description": "Экспортирует ваши панели и пользователей в ZIP-архив для миграции в Homarr версии 1.0.0 и выше", + "securityNote": { + "title": "Примечание безопасности", + "text": "При экспорте пользователей и интеграций будет открыто окно с ключом шифрования. Этот ключ необходим для импорта данных в Homarr. Сохраните его в безопасном месте и не передавайте третьим лицам." + }, + "form": { + "label": "Выберите всё, что хотите экспортировать", + "option": { + "boards": { + "label": "Экспорт панелей" + }, + "integrations": { + "label": "Экспорт интеграций", + "description": "Включает зашифрованные учётные данные интеграций. Доступно только при экспорте панелей" + }, + "users": { + "label": "Экспорт пользователей", + "description": "Экспортирует только учётные данные пользователей, хеши паролей и соль зашифрованы" + } + } + }, + "action": { + "export": "Экспортировать данные" + }, + "modal": { + "title": "Ключ шифрования", + "description": "Ваши данные экспортированы. Храните этот ключ в безопасном месте и не передавайте его третьим лицам. Этот ключ потребуется для импорта данных в Homarr.", + "copyDismiss": "Скопировать и закрыть" + } +} \ No newline at end of file diff --git a/public/locales/ru/manage/users.json b/public/locales/ru/manage/users.json index 281ee48c975..b38df4497ea 100644 --- a/public/locales/ru/manage/users.json +++ b/public/locales/ru/manage/users.json @@ -1,6 +1,6 @@ { "metaTitle": "Пользователи", - "pageTitle": "Управлять пользователями", + "pageTitle": "Управление пользователями", "buttons": { "create": "Создать" }, @@ -15,7 +15,7 @@ "table": { "header": { "user": "Пользователь", - "email": "E-Mail" + "email": "Электронная почта" } }, "tooltips": { @@ -26,19 +26,19 @@ "modals": { "delete": { "title": "Удалить пользователя {{name}}", - "text": "Вы уверены, что хотите удалить пользователя {{name}}? Это приведет к удалению данных, связанных с этим аккаунтом, но не удалятся созданные этим пользователем панели." + "text": "Вы уверены, что хотите удалить пользователя {{name}}? Это удалит данные, связанные с этой учетной записью, но не созданные этим пользователем панели управления." }, "change-role": { "promote": { "title": "Повысить пользователя {{name}} до администратора", - "text": "Вы уверены, что хотите повысить пользователя {{name}} до администратора? Это даст пользователю доступ ко всем ресурсам на вашем экземпляре Homarr." + "text": "Вы уверены, что хотите повысить пользователя {{name}} до администратора? Это предоставит пользователю доступ ко всем ресурсам вашего экземпляра Homarr." }, "demote": { "title": "Понизить пользователя {{name}} до пользователя", - "text": "Вы уверены, что хотите понизить пользователя {{name}} до пользователя? Это приведет к удалению доступа пользователя ко всем ресурсам на вашем экземпляре Homarr." + "text": "Вы уверены, что хотите понизить пользователя {{name}} до обычного пользователя? Это отменит доступ пользователя ко всем ресурсам вашего экземпляра Homarr." }, "confirm": "Подтвердить" } }, - "searchDoesntMatch": "Ваш поиск не совпадает ни с одной записью. Пожалуйста, скорректируйте ваш фильтр." + "searchDoesntMatch": "По вашему запросу ничего не найдено. Пожалуйста, измените параметры фильтра." } \ No newline at end of file diff --git a/public/locales/ru/manage/users/create.json b/public/locales/ru/manage/users/create.json index e1d4755031c..e7130c91bdc 100644 --- a/public/locales/ru/manage/users/create.json +++ b/public/locales/ru/manage/users/create.json @@ -1,14 +1,14 @@ { - "metaTitle": "Создать пользователя", + "metaTitle": "Создание пользователя", "steps": { "account": { "title": "Первый шаг", - "text": "Создать аккаунт", + "text": "Создать учётную запись", "username": { "label": "Имя пользователя" }, "email": { - "label": "E-Mail" + "label": "Электронная почта" } }, "security": { @@ -20,33 +20,33 @@ }, "finish": { "title": "Подтверждение", - "text": "Сохранить в базе данных", + "text": "Сохранение в базу данных", "card": { - "title": "Проверьте ваши данные", - "text": "После отправки данных в базу данных пользователь сможет войти. Вы уверены, что хотите сохранить этого пользователя в базе данных и активировать вход?" + "title": "Проверьте введённые данные", + "text": "После сохранения данных в базу пользователь сможет войти в систему. Вы уверены, что хотите сохранить этого пользователя в базе данных и активировать возможность входа?" }, "table": { "header": { "property": "Свойство", "value": "Значение", "username": "Имя пользователя", - "email": "E-Mail", + "email": "Электронная почта", "password": "Пароль" }, "notSet": "Не задано", - "valid": "Действителен" + "valid": "Действительно" }, "failed": "Не удалось создать пользователя: {{error}}" }, "completed": { "alert": { "title": "Пользователь создан", - "text": "Пользователь был создан в базе данных. Теперь он может войти." + "text": "Пользователь создан в базе данных. Теперь он может войти в систему." } } }, "buttons": { - "generateRandomPassword": "Сгенерировать случайным образом", - "createAnother": "Создать ещё" + "generateRandomPassword": "Сгенерировать случайный", + "createAnother": "Создать ещё одного" } } \ No newline at end of file diff --git a/public/locales/ru/manage/users/edit.json b/public/locales/ru/manage/users/edit.json index d28b0f0e026..79fbefe3b3a 100644 --- a/public/locales/ru/manage/users/edit.json +++ b/public/locales/ru/manage/users/edit.json @@ -9,7 +9,7 @@ "label": "Имя пользователя" }, "eMail": { - "label": "E-Mail" + "label": "Электронная почта" } } }, @@ -20,12 +20,12 @@ "label": "Новый пароль" }, "terminateExistingSessions": { - "label": "Закрыть текущие сессии", - "description": "Пользователь будет вынужден заново войти в систему на своих устройствах" + "label": "Завершить текущие сессии", + "description": "Пользователю придётся заново войти в систему на всех устройствах" }, "confirm": { "label": "Подтвердить", - "description": "Пароль будет обновлен. Действие не может быть отменено." + "description": "Пароль будет обновлён. Действие нельзя отменить." } } }, @@ -39,15 +39,15 @@ } }, "deletion": { - "title": "Удаление аккаунта", + "title": "Удаление учётной записи", "inputs": { "confirmUsername": { "label": "Подтвердите имя пользователя", - "description": "Введите имя пользователя, чтобы подтвердить удаление" + "description": "Введите имя пользователя для подтверждения удаления" }, "confirm": { "label": "Удалить навсегда", - "description": "Я знаю, что это действие является необратимым и все данные учетной записи будут потеряны." + "description": "Я понимаю, что это действие необратимо и все данные учётной записи будут потеряны." } } } diff --git a/public/locales/ru/manage/users/invites.json b/public/locales/ru/manage/users/invites.json index c119c9aec9f..694e9331b54 100644 --- a/public/locales/ru/manage/users/invites.json +++ b/public/locales/ru/manage/users/invites.json @@ -1,7 +1,7 @@ { "metaTitle": "Приглашения пользователей", - "pageTitle": "Управление приглашениями пользователей", - "description": "С помощью приглашений вы можете приглашать пользователей в свой экземпляр Homarr. Приглашение действует только в течение определенного времени и может быть использовано один раз. При создании приглашения срок его действия должен составлять от 5 минут до 12 месяцев.", + "pageTitle": "Управление приглашениями", + "description": "С помощью приглашений вы можете пригласить пользователей в ваш экземпляр Homarr. Приглашение действительно только в течение определённого времени и может быть использовано один раз. Срок действия должен быть от 5 минут до 12 месяцев с момента создания.", "button": { "createInvite": "Создать приглашение", "deleteInvite": "Удалить приглашение" @@ -10,38 +10,38 @@ "header": { "id": "ID", "creator": "Создатель", - "expires": "Истекает", + "expires": "Срок действия", "action": "Действия" }, "data": { - "expiresAt": "истекло {{at}}", - "expiresIn": "в {{in}}" + "expiresAt": "истекает {{at}}", + "expiresIn": "через {{in}}" } }, "modals": { "create": { "title": "Создать приглашение", - "description": "По истечении этого срока приглашение перестает быть действительным, и получатель приглашения не сможет создать аккаунт.", + "description": "После истечения срока действия приглашение станет недействительным, и получатель не сможет создать учётную запись.", "form": { - "expires": "Срок действия", + "expires": "Дата истечения срока", "submit": "Создать" } }, "copy": { - "title": "Скопировать приглашение", - "description": "Ваше приглашение сгенерировано. После закрытия этого окна, вы больше не сможете скопировать эту ссылку. Если вы больше не хотите приглашать данного пользователя, вы можете удалить это приглашение в любое время.", - "invitationLink": "Ссылка на приглашение", + "title": "Копирование приглашения", + "description": "Ваше приглашение сгенерировано. После закрытия этого окна вы больше не сможете скопировать эту ссылку. Если вы передумали приглашать пользователя, вы можете удалить это приглашение в любое время.", + "invitationLink": "Ссылка приглашения", "details": { "id": "ID", "token": "Токен" }, "button": { - "close": "Копирование и Удаление" + "close": "Скопировать и закрыть" } }, "delete": { "title": "Удалить приглашение", - "description": "Вы уверены, что хотите удалить это приглашение? Пользователи, получившие эту ссылку, больше не смогут создать аккаунт по этой ссылке." + "description": "Вы уверены, что хотите удалить это приглашение? Пользователи с этой ссылкой больше не смогут создать учётную запись." } }, "noInvites": "Приглашений пока нет." diff --git a/public/locales/ru/modules/bookmark.json b/public/locales/ru/modules/bookmark.json index eb906316b1b..016c88ba29d 100644 --- a/public/locales/ru/modules/bookmark.json +++ b/public/locales/ru/modules/bookmark.json @@ -6,7 +6,7 @@ "title": "Настройки закладок", "name": { "label": "Заголовок виджета", - "info": "Оставить пустым, чтобы скрыть заголовок." + "info": "Оставьте пустым, чтобы скрыть заголовок." }, "items": { "label": "Элементы" @@ -15,8 +15,8 @@ "label": "Макет", "data": { "autoGrid": "Автоматическая сетка", - "horizontal": "Горизонтальный", - "vertical": "Вертикальный" + "horizontal": "Горизонтально", + "vertical": "Вертикально" } } } @@ -24,16 +24,16 @@ "card": { "noneFound": { "title": "Список закладок пуст", - "text": "Добавить новые элементы в этот список в режиме редактирования" + "text": "Добавьте новые элементы в режиме редактирования" } }, "item": { "validation": { - "length": "Длина строки должна быть между {{shortest}} и {{longest}} символами", - "invalidLink": "Недопустимая ссылка", - "errorMsg": "Не удалось сохранить, так как возникли ошибки валидации. Пожалуйста, исправьте ошибки" + "length": "Длина должна быть между {{shortest}} и {{longest}}", + "invalidLink": "Недействительная ссылка", + "errorMsg": "Не удалось сохранить из-за ошибок проверки. Пожалуйста, исправьте введенные данные" }, - "name": "Имя", + "name": "Название", "url": "URL", "newTab": "Открыть в новой вкладке", "hideHostname": "Скрыть имя хоста", diff --git a/public/locales/ru/modules/calendar.json b/public/locales/ru/modules/calendar.json index 489d39ca156..61a71d350f2 100644 --- a/public/locales/ru/modules/calendar.json +++ b/public/locales/ru/modules/calendar.json @@ -3,13 +3,13 @@ "name": "Календарь", "description": "Отображает календарь с предстоящими релизами из поддерживаемых интеграций.", "settings": { - "title": "Настройки для виджета календаря", + "title": "Настройки виджета календаря", "radarrReleaseType": { - "label": "Тип релиза в Radarr", + "label": "Тип релиза Radarr", "data": { - "inCinemas": "В кино", - "physicalRelease": "Физический носитель", - "digitalRelease": "Цифровой релиз" + "inCinemas": "В кинотеатрах", + "physicalRelease": "Физический", + "digitalRelease": "Цифровой" } }, "hideWeekDays": { diff --git a/public/locales/ru/modules/common-media-cards.json b/public/locales/ru/modules/common-media-cards.json index 80232c84d4d..f1a0766ad11 100644 --- a/public/locales/ru/modules/common-media-cards.json +++ b/public/locales/ru/modules/common-media-cards.json @@ -1,6 +1,6 @@ { "buttons": { "play": "Воспроизвести", - "request": "Запрос" + "request": "Запросить" } } \ No newline at end of file diff --git a/public/locales/ru/modules/dashdot.json b/public/locales/ru/modules/dashdot.json index a0dae893f8e..5e454d3cb9b 100644 --- a/public/locales/ru/modules/dashdot.json +++ b/public/locales/ru/modules/dashdot.json @@ -1,17 +1,17 @@ { "descriptor": { "name": "Dash.", - "description": "Показывает графики внешнего экземпляра Dash. в Homarr.", + "description": "Отображает графики внешнего экземпляра Dash. в Homarr.", "settings": { - "title": "Настройки для виджета Dash.", + "title": "Настройки виджета Dash.", "dashName": { - "label": "Имя Dash." + "label": "Название Dash." }, "url": { - "label": "URL-адрес Dash." + "label": "URL Dash." }, "usePercentages": { - "label": "Отображать проценты" + "label": "Отображать в процентах" }, "columns": { "label": "Отображать столбцы" @@ -27,13 +27,13 @@ "label": "Показать в виджете" }, "span": { - "label": "Размеры столбцов" + "label": "Размер в столбцах" }, "compactView": { - "label": "Отображение в виде текста (компактно)" + "label": "Показывать как текст (компактно)" }, "multiView": { - "label": "Показать несколько дисков" + "label": "Показывать в режиме нескольких дисков" } }, "network": { @@ -42,10 +42,10 @@ "label": "Показать в виджете" }, "span": { - "label": "Размеры столбцов" + "label": "Размер в столбцах" }, "compactView": { - "label": "Отображение в виде текста (компактно)" + "label": "Показывать как текст (компактно)" } }, "cpu": { @@ -54,10 +54,10 @@ "label": "Показать в виджете" }, "span": { - "label": "Размеры столбцов" + "label": "Размер в столбцах" }, "multiView": { - "label": "Показать многоядерный вид" + "label": "Показывать в режиме нескольких ядер" } }, "ram": { @@ -66,7 +66,7 @@ "label": "Показать в виджете" }, "span": { - "label": "Размеры столбцов" + "label": "Размер в столбцах" } }, "gpu": { @@ -75,7 +75,7 @@ "label": "Показать в виджете" }, "span": { - "label": "Размеры столбцов" + "label": "Размер в столбцах" } } } @@ -84,11 +84,11 @@ "card": { "title": "Dash.", "errors": { - "noService": "Сервис Dash. не найден. Пожалуйста, добавьте его на панель Homarr или укажите URL Dash. в настройках модуля", + "noService": "Сервис Dash. не найден. Добавьте её на панель управления Homarr или укажите URL Dash. в настройках модуля", "noInformation": "Невозможно получить информацию от Dash. - вы используете последнюю версию?", "protocolDowngrade": { - "title": "Обнаружено понижение версии протокола соединения", - "text": "Соединение с вашим экземпляром Dash. использует HTTP. Это представляет угрозу безопасности, поскольку HTTP не шифруется, и злоумышленники могут злоупотребить этим соединением. Убедитесь, что Dash. использует HTTPS, или переведите Homarr на HTTP (не рекомендуется)." + "title": "Обнаружено понижение уровня протокола", + "text": "Подключение к экземпляру Dash. использует HTTP. Это представляет угрозу безопасности, так как HTTP не шифруется и злоумышленники могут перехватить соединение. Убедитесь, что Dash. использует HTTPS или понизьте уровень протокола Homarr до HTTP (не рекомендуется)." } }, "graphs": { diff --git a/public/locales/ru/modules/date.json b/public/locales/ru/modules/date.json index 359b8364e0b..99fa57f9700 100644 --- a/public/locales/ru/modules/date.json +++ b/public/locales/ru/modules/date.json @@ -3,7 +3,7 @@ "name": "Дата и время", "description": "Отображает текущую дату и время.", "settings": { - "title": "Настройки для виджета даты и времени", + "title": "Настройки виджета даты и времени", "timezone": { "label": "Часовой пояс", "info": "Выберите название вашего часового пояса, найти его можно здесь: " @@ -22,7 +22,7 @@ }, "titleState": { "label": "Заголовок часов", - "info": "В вашем виджете можно отобразить пользовательский заголовок и код часового пояса.
Также можно показать только город, не показывать ничего,
или показать только часовой пояс, когда оба параметра выбраны, но заголовок не задан.", + "info": "На виджете могут отображаться пользовательский заголовок и код часового пояса.
Можно показывать только город, не показывать ничего
или показывать только часовой пояс, когда выбраны оба параметра, но заголовок не указан.", "data": { "both": "Заголовок и часовой пояс", "city": "Только заголовок", diff --git a/public/locales/ru/modules/dlspeed.json b/public/locales/ru/modules/dlspeed.json index 2080e4bb17d..b85045084a2 100644 --- a/public/locales/ru/modules/dlspeed.json +++ b/public/locales/ru/modules/dlspeed.json @@ -1,12 +1,12 @@ { "descriptor": { - "name": "Скорость скачивания", - "description": "Отображает скорость скачивания и отдачи поддерживаемых интеграций." + "name": "Скорость загрузки", + "description": "Отображает скорость загрузки и отдачи для поддерживаемых интеграций." }, "card": { "table": { "header": { - "name": "Имя", + "name": "Название", "size": "Размер", "download": "Загрузка", "upload": "Отдача", @@ -18,7 +18,7 @@ } }, "lineChart": { - "title": "Текущая скорость скачивания", + "title": "Текущая скорость загрузки", "download": "Загрузка: {{download}}", "upload": "Отдача: {{upload}}", "timeSpan": "{{seconds}} секунд назад", diff --git a/public/locales/ru/modules/dns-hole-controls.json b/public/locales/ru/modules/dns-hole-controls.json index 0749958639c..07233559e54 100644 --- a/public/locales/ru/modules/dns-hole-controls.json +++ b/public/locales/ru/modules/dns-hole-controls.json @@ -1,17 +1,17 @@ { "descriptor": { - "name": "Управление фильтрующими DNS", - "description": "Управляйте PiHole или AdGuard прямо с вашей панели", + "name": "Управление DNS-фильтрацией", + "description": "Управляйте PiHole или AdGuard с панели управления", "settings": { - "title": "Настройки управления фильтрующими DNS", + "title": "Настройки управления DNS-фильтрацией", "showToggleAllButtons": { - "label": "Показать кнопки 'Включить/Выключить всё'" + "label": "Показывать кнопки 'Включить/Отключить всё'" } }, "errors": { "general": { - "title": "Не удалось найти фильтрующие DNS", - "text": "Проблема с подключением к вашим фильтрующим DNS. Пожалуйста, проверьте свои настройки/интеграцию." + "title": "Не удалось найти DNS-фильтр", + "text": "Возникла проблема при подключении к DNS-фильтру. Проверьте настройки и интеграции." } } }, @@ -19,7 +19,7 @@ "title": "Установить время отключения", "hours": "Часы", "minutes": "Минуты", - "unlimited": "оставьте это поле пустым, если не хотите устанавливать время", + "unlimited": "оставьте пустым для бессрочного отключения", "set": "Установить" } } \ No newline at end of file diff --git a/public/locales/ru/modules/dns-hole-summary.json b/public/locales/ru/modules/dns-hole-summary.json index 5156854b383..715ed7f16c4 100644 --- a/public/locales/ru/modules/dns-hole-summary.json +++ b/public/locales/ru/modules/dns-hole-summary.json @@ -1,18 +1,18 @@ { "descriptor": { - "name": "Сводка по фильтрующим DNS", + "name": "Сводка DNS-фильтра", "description": "Отображает важные данные из PiHole или AdGuard", "settings": { - "title": "Настройки для сводки фильтрующих DNS", + "title": "Настройки сводки DNS-фильтра", "usePiHoleColors": { - "label": "Использовать цвета из PiHole" + "label": "Использовать цвета PiHole" }, "layout": { "label": "Макет", "data": { - "grid": "2 на 2", - "row": "Горизонтальный", - "column": "Вертикальный" + "grid": "Сетка 2x2", + "row": "Горизонтально", + "column": "Вертикально" } } } @@ -21,8 +21,8 @@ "metrics": { "domainsOnAdlist": "доменов в списке блокировок", "queriesToday": "запросов сегодня", - "queriesBlockedTodayPercentage": "Заблокировано сегодня", - "queriesBlockedToday": "Заблокировано сегодня" + "queriesBlockedTodayPercentage": "заблокировано сегодня", + "queriesBlockedToday": "заблокировано сегодня" } } } diff --git a/public/locales/ru/modules/docker.json b/public/locales/ru/modules/docker.json index 2a1aec91230..f5e9e1067e8 100644 --- a/public/locales/ru/modules/docker.json +++ b/public/locales/ru/modules/docker.json @@ -1,20 +1,20 @@ { "descriptor": { "name": "Docker", - "description": "Позволяет легко видеть и управлять всеми вашими контейнерами Docker." + "description": "Позволяет легко просматривать и управлять всеми вашими контейнерами Docker." }, "search": { - "placeholder": "Поиск по контейнеру или имени образа" + "placeholder": "Поиск по названию контейнера или образа" }, "table": { "header": { - "name": "Имя", + "name": "Название", "image": "Образ", "ports": "Порты", "state": "Состояние" }, "body": { - "portCollapse": "Ещё {{ports}}" + "portCollapse": "ещё {{ports}}" }, "states": { "running": "Работает", @@ -68,7 +68,7 @@ "errors": { "integrationFailed": { "title": "Сбой интеграции Docker", - "message": "Вы забыли смонтировать сокет Docker?" + "message": "Возможно, вы забыли подключить сокет Docker?" }, "unknownError": { "title": "Произошла ошибка" diff --git a/public/locales/ru/modules/health-monitoring.json b/public/locales/ru/modules/health-monitoring.json index ca93a582fcf..b13ff09be90 100644 --- a/public/locales/ru/modules/health-monitoring.json +++ b/public/locales/ru/modules/health-monitoring.json @@ -1,14 +1,14 @@ { "descriptor": { "name": "Мониторинг состояния системы", - "description": "Отображает информацию о состоянии и статусе вашей системы(систем).", + "description": "Отображает информацию о состоянии и работоспособности ваших систем.", "settings": { "title": "Настройки мониторинга состояния системы", "fahrenheit": { - "label": "Температура процессора в градусах Фаренгейта" + "label": "Температура CPU в градусах Фаренгейта" }, "cpu": { - "label": "Показывать информацию о процессоре", + "label": "Показывать информацию о CPU", "load": "Средняя нагрузка", "minute": "{{minute}} минута", "minutes": "{{minutes}} минут" @@ -20,16 +20,16 @@ "label": "Показать информацию о файловой системе" }, "node": { - "label": "Фильтр по имени узла", - "info": "Введите имя узла Proxmox, чтобы отображать метрики только для этого узла. По умолчанию отображается весь кластер." + "label": "Фильтровать по имени узла", + "info": "Введите имя узла Proxmox, чтобы показывать метрики только для этого узла. По умолчанию отображается весь кластер." }, "defaultViewState": { - "label": "Раздел открыт по умолчанию", + "label": "Раздел, открытый по умолчанию", "data": { "none": "Ничего", "node": "Узлы", "vm": "Виртуальные машины", - "lxc": "LXC", + "lxc": "Контейнеры LXC", "storage": "Хранилище" } }, @@ -42,31 +42,31 @@ } }, "summary": { - "label": "Показать раздел сводки" + "label": "Показывать раздел сводки" }, "showNode": { - "label": "Показать раздел узлов" + "label": "Показывать раздел узлов" }, "showVM": { - "label": "Показать раздел виртуальных машин" + "label": "Показывать раздел виртуальных машин" }, "showLXCs": { - "label": "Показать раздел LXC" + "label": "Показывать раздел LXC-контейнеров" }, "showStorage": { - "label": "Показать раздел хранилища" + "label": "Показывать раздел хранилища" }, "sectionIndicatorColor": { - "label": "Требование для индикатора состояния раздела быть 'OK'", + "label": "Условия для отображения индикатора статуса раздела как 'OK'", "info": "'Все' требует, чтобы все элементы были онлайн для зеленого индикатора. 'Любой' требует, чтобы хотя бы один элемент был онлайн.", "data": { - "any": "Любой активен", - "all": "Все активны" + "any": "Любой активный", + "all": "Все активные" } }, "ignoreCert": { - "label": "Игнорировать ошибки сертификата", - "info": "Если включено, виджет будет игнорировать ошибки сертификата при доступе к API Proxmox. Это может быть полезно при доступе к Proxmox через HTTPS." + "label": "Игнорировать ошибки сертификатов", + "info": "Если включено, виджет будет игнорировать ошибки сертификатов при доступе к API Proxmox. Это может быть полезно при доступе к Proxmox через HTTPS." } } }, @@ -77,8 +77,8 @@ }, "memory": { "label": "Память", - "totalMem": "Общий объем памяти: {{total}}Гб", - "available": "Доступно: {{available}}Гб - {{percentage}}%" + "totalMem": "Всего памяти: {{total}} ГБ", + "available": "Доступно: {{available}} ГБ - {{percentage}}%" }, "fileSystem": { "label": "Файловая система", @@ -92,8 +92,8 @@ }, "errors": { "general": { - "title": "Невозможно найти вашу систему (системы).", - "text": "Возникла проблема с подключением к вашей системе. Пожалуйста, проверьте вашу конфигурацию/интеграцию." + "title": "Не удается найти ваши системы.", + "text": "Возникла проблема при подключении к вашей системе. Пожалуйста, проверьте настройки и интеграции." } }, "headings": { @@ -109,13 +109,13 @@ "title": { "nodes": "Узлы", "vms": "Виртуальные машины", - "lxcs": "LXC", + "lxcs": "Контейнеры LXC", "storage": "Хранилище" } }, "table": { "header": { - "name": "Имя", + "name": "Название", "cpu": "ЦПУ", "ram": "ОЗУ", "node": "Узел" @@ -123,7 +123,7 @@ }, "popover": { "node": "Узел", - "vmid": "VMID", + "vmid": "ID виртуальной машины", "details": "Подробности", "cores": "Ядра - {{maxCpu}}", "memSize": "Память - {{maxMem}}", diff --git a/public/locales/ru/modules/iframe.json b/public/locales/ru/modules/iframe.json index 858df95cd34..52863fc2ccd 100644 --- a/public/locales/ru/modules/iframe.json +++ b/public/locales/ru/modules/iframe.json @@ -1,11 +1,11 @@ { "descriptor": { - "name": "iFrame", - "description": "Встраиваемое содержимое из интернета. Некоторые веб-сайты могут ограничивать доступ.", + "name": "Встраиваемый фрейм", + "description": "Встраивает любой контент из интернета. Некоторые сайты могут ограничивать доступ.", "settings": { - "title": "Настройки iFrame", + "title": "Настройки встраиваемого фрейма", "embedUrl": { - "label": "URL-адрес на встраивание" + "label": "URL для встраивания" }, "allowFullScreen": { "label": "Разрешить полноэкранный режим" @@ -20,7 +20,7 @@ "label": "Разрешить оплату" }, "allowAutoPlay": { - "label": "Разрешить авто воспроизведение" + "label": "Разрешить автовоспроизведение" }, "allowMicrophone": { "label": "Разрешить микрофон" @@ -36,10 +36,10 @@ "card": { "errors": { "noUrl": { - "title": "Неверный URL", - "text": "Убедитесь, что вы ввели правильный адрес в настройках вашего виджета" + "title": "Недействительный URL", + "text": "Убедитесь, что вы ввели действительный адрес в настройках виджета" }, - "browserSupport": "Ваш браузер не поддерживает iframes. Пожалуйста, обновите свой браузер." + "browserSupport": "Ваш браузер не поддерживает встраиваемые фреймы. Пожалуйста, обновите браузер." } } } diff --git a/public/locales/ru/modules/indexer-manager.json b/public/locales/ru/modules/indexer-manager.json index 4e9d222784a..6895702ac89 100644 --- a/public/locales/ru/modules/indexer-manager.json +++ b/public/locales/ru/modules/indexer-manager.json @@ -1,22 +1,22 @@ { "descriptor": { - "name": "Статус менеджера индексаторов", - "description": "Информация о статусе ваших индексаторов", + "name": "Состояние менеджера индексации", + "description": "Информация о состоянии ваших индексаторов", "settings": { - "title": "Статус менеджера индексаторов", + "title": "Состояние менеджера индексации", "openIndexerSiteInNewTab": { - "label": "Открыть сайт индексатора в новой вкладке" + "label": "Открывать сайт индексатора в новой вкладке" } } }, "indexersStatus": { - "title": "Статус менеджера индексаторов", - "testAllButton": "Тестировать все" + "title": "Менеджер индексации", + "testAllButton": "Проверить все" }, "errors": { "general": { - "title": "Не удалось найти менеджера индексаторов", - "text": "Проблема с подключением к вашему менеджеру индексаторов. Пожалуйста, проверьте свои настройки/интеграцию." + "title": "Не удалось найти менеджер индексации", + "text": "Возникла проблема при подключении к менеджеру индексации. Пожалуйста, проверьте настройки и интеграции." } } } \ No newline at end of file diff --git a/public/locales/ru/modules/media-requests-list.json b/public/locales/ru/modules/media-requests-list.json index 1c7a9c05824..25be4be0554 100644 --- a/public/locales/ru/modules/media-requests-list.json +++ b/public/locales/ru/modules/media-requests-list.json @@ -1,9 +1,9 @@ { "descriptor": { - "name": "Запросы на медиа", - "description": "Просмотреть список всех медиа-запросов из вашего экземпляра Overseerr или Jellyseerr", + "name": "Запросы медиаконтента", + "description": "Просмотр списка всех запросов медиаконтента из вашего экземпляра Overseerr или Jellyseerr", "settings": { - "title": "Список медиа-запросов", + "title": "Список запросов медиаконтента", "replaceLinksWithExternalHost": { "label": "Заменить ссылки на внешний хост" }, @@ -12,12 +12,12 @@ } } }, - "noRequests": "Не найдено ни одного запроса. Убедитесь, что вы правильно настроили свои приложения.", + "noRequests": "Запросы не найдены. Убедитесь, что приложения настроены правильно.", "state": { - "approved": "Одобрен", + "approved": "Одобрено", "pendingApproval": "Ожидает одобрения", - "declined": "Отклонён", - "available": "Доступен", + "declined": "Отклонено", + "available": "Доступно", "partial": "Частично" }, "tooltips": { @@ -26,10 +26,10 @@ "approving": "Одобрение запроса..." }, "mutation": { - "approving": "Одобряется", + "approving": "Одобрение", "declining": "Отклонение", - "request": "запрос...", + "request": "запроса...", "approved": "Запрос был одобрен!", - "declined": "Запрос отклонен!" + "declined": "Запрос был отклонён!" } } diff --git a/public/locales/ru/modules/media-requests-stats.json b/public/locales/ru/modules/media-requests-stats.json index 62fd5f17e38..3a9e4032e79 100644 --- a/public/locales/ru/modules/media-requests-stats.json +++ b/public/locales/ru/modules/media-requests-stats.json @@ -1,9 +1,9 @@ { "descriptor": { - "name": "Статистика медиазапросов", - "description": "Статистика ваших медиазапросов", + "name": "Статистика запросов медиаконтента", + "description": "Статистика по запросам медиаконтента", "settings": { - "title": "Статистика медиазапросов", + "title": "Статистика запросов медиаконтента", "replaceLinksWithExternalHost": { "label": "Заменить ссылки на внешний хост" }, @@ -13,8 +13,8 @@ } }, "mediaStats": { - "title": "Статистика медиа", - "pending": "Ожидающие утверждения", + "title": "Статистика медиаконтента", + "pending": "Ожидает одобрения", "tvRequests": "Запросы сериалов", "movieRequests": "Запросы фильмов", "approved": "Уже одобрено", diff --git a/public/locales/ru/modules/media-server.json b/public/locales/ru/modules/media-server.json index 7fb2f231b65..83223817f0d 100644 --- a/public/locales/ru/modules/media-server.json +++ b/public/locales/ru/modules/media-server.json @@ -1,9 +1,9 @@ { "descriptor": { "name": "Медиасервер", - "description": "Взаимодействие с вашим мультимедийным сервером Jellyfin или Plex", + "description": "Взаимодействие с вашим медиасервером Jellyfin или Plex", "settings": { - "title": "Настройки виджета мультимедийного сервера" + "title": "Настройки виджета медиасервера" } }, "loading": "Загрузка потоков", @@ -12,13 +12,13 @@ "header": { "session": "Сессия", "user": "Пользователь", - "currentlyPlaying": "Сейчас играет" + "currentlyPlaying": "Сейчас воспроизводится" } }, "errors": { "general": { - "title": "Не удалось загрузить контент", - "text": "Не удалось получить информацию с сервера. Пожалуйста, проверьте логи для получения дополнительной информации" + "title": "Не удалось загрузить содержимое", + "text": "Не удалось получить информацию с сервера. Проверьте журналы для получения подробностей" } } } diff --git a/public/locales/ru/modules/media-transcoding.json b/public/locales/ru/modules/media-transcoding.json index ebbad9b1712..c4d7759df68 100644 --- a/public/locales/ru/modules/media-transcoding.json +++ b/public/locales/ru/modules/media-transcoding.json @@ -1,22 +1,22 @@ { "descriptor": { - "name": "Транскодирование медиа", - "description": "Отображает информацию о транскодировании медиа", + "name": "Перекодирование медиафайлов", + "description": "Отображает информацию о перекодировании медиафайлов", "settings": { - "title": "Настройки транскодирования медиа", + "title": "Настройки перекодирования медиафайлов", "appId": { "label": "Выберите приложение" }, "defaultView": { "label": "Вид по умолчанию", "data": { - "workers": "Рабочие процессы", + "workers": "Обработчики", "queue": "Очередь", "statistics": "Статистика" } }, "showHealthCheck": { - "label": "Показать индикатор проверки состояния" + "label": "Показывать индикатор проверки состояния" }, "showHealthChecksInQueue": { "label": "Показывать проверки состояния в очереди" @@ -40,7 +40,7 @@ }, "empty": "Пусто", "tooltip": { - "transcode": "Транскодирование", + "transcode": "Перекодирование", "healthCheck": "Проверка состояния" } } @@ -56,7 +56,7 @@ }, "empty": "Пусто", "tooltip": { - "transcode": "Транскодирование", + "transcode": "Перекодирование", "healthCheck": "Проверка состояния" } } @@ -64,13 +64,13 @@ "statistics": { "empty": "Пусто", "box": { - "transcodes": "Транскодирование: {{value}}", - "healthChecks": "Проверки состояния: {{value}}", - "files": "Файлы: {{value}}", - "spaceSaved": "Сохранено: {{value}}" + "transcodes": "Перекодировано: {{value}}", + "healthChecks": "Проверок состояния: {{value}}", + "files": "Файлов: {{value}}", + "spaceSaved": "Сэкономлено: {{value}}" }, "pies": { - "transcodes": "Транскодирование", + "transcodes": "Перекодирования", "healthChecks": "Проверки состояния", "videoCodecs": "Кодеки", "videoContainers": "Контейнеры", @@ -80,17 +80,17 @@ }, "error": { "title": "Ошибка", - "message": "Произошла ошибка при получении данных из Tdarr." + "message": "Произошла ошибка при получении данных от Tdarr." }, "tabs": { - "workers": "Рабочие процессы", + "workers": "Обработчики", "queue": "Очередь", "statistics": "Статистика" }, "healthCheckStatus": { "title": "Проверка состояния", "queued": "Очередь", - "healthy": "Исправен", + "healthy": "Исправно", "unhealthy": "Неисправен" } } diff --git a/public/locales/ru/modules/notebook.json b/public/locales/ru/modules/notebook.json index 217fdee8359..ace7257f072 100644 --- a/public/locales/ru/modules/notebook.json +++ b/public/locales/ru/modules/notebook.json @@ -1,14 +1,14 @@ { "descriptor": { "name": "Блокнот", - "description": "Интерактивный виджет на основе разметки Markdown для записи ваших заметок!", + "description": "Интерактивный виджет для заметок на основе Markdown!", "settings": { "title": "Настройки виджета блокнота", "showToolbar": { - "label": "Показать панель инструментов для написания текста с использованием разметки Markdown" + "label": "Показывать панель инструментов для работы с Markdown" }, "allowReadOnlyCheck": { - "label": "Разрешить проверку в режиме \"только для чтения\"" + "label": "Разрешить отметки в режиме только для чтения" }, "content": { "label": "Содержимое блокнота" @@ -17,40 +17,40 @@ }, "card": { "controls": { - "bold": "Жирный", + "bold": "Полужирный", "italic": "Курсив", - "strikethrough": "Зачеркнутый", - "underline": "Подчеркнутый", + "strikethrough": "Зачёркнутый", + "underline": "Подчёркнутый", "colorText": "Цвет текста", - "colorHighlight": "Выделение текста цветом", + "colorHighlight": "Цвет выделения текста", "code": "Код", "clear": "Очистить форматирование", "heading": "Заголовок {{level}}", - "align": "Выровнять текст: {{position}}", + "align": "Выравнивание текста: {{position}}", "blockquote": "Цитата", "horizontalLine": "Горизонтальная линия", "bulletList": "Маркированный список", "orderedList": "Нумерованный список", - "checkList": "Чек-лист", + "checkList": "Список с галочками", "increaseIndent": "Увеличить отступ", "decreaseIndent": "Уменьшить отступ", "link": "Ссылка", - "unlink": "Удалить ссылку", + "unlink": "Убрать ссылку", "image": "Вставить изображение", "addTable": "Добавить таблицу", "deleteTable": "Удалить таблицу", "colorCell": "Цвет ячейки", - "mergeCell": "Переключить объединение ячеек", - "addColumnLeft": "Добавить столбец перед", - "addColumnRight": "Добавить столбец после", + "mergeCell": "Объединить/разделить ячейки", + "addColumnLeft": "Добавить столбец слева", + "addColumnRight": "Добавить столбец справа", "deleteColumn": "Удалить столбец", - "addRowTop": "Добавить строку перед", - "addRowBelow": "Добавить строку после", + "addRowTop": "Добавить строку сверху", + "addRowBelow": "Добавить строку снизу", "deleteRow": "Удалить строку" }, "modals": { "clearColor": "Очистить цвет", - "source": "Источник", + "source": "Исходный код", "widthPlaceholder": "Значение в % или пикселях", "columns": "Столбцы", "rows": "Строки" diff --git a/public/locales/ru/modules/overseerr.json b/public/locales/ru/modules/overseerr.json index 3b8914cbe52..1c8a832e8d6 100644 --- a/public/locales/ru/modules/overseerr.json +++ b/public/locales/ru/modules/overseerr.json @@ -1,28 +1,28 @@ { "descriptor": { "name": "Overseerr", - "description": "Позволяет искать и добавлять медиафайлы из Overseerr или Jellyseerr." + "description": "Позволяет искать и добавлять медиаконтент из Overseerr или Jellyseerr." }, "popup": { "item": { "buttons": { "askFor": "Запросить {{title}}", "cancel": "Отмена", - "request": "Запрос" + "request": "Запросить" }, "alerts": { "automaticApproval": { - "title": "Используемый API-ключ", - "text": "Этот запрос будет автоматически одобрен" + "title": "Использование API-ключа", + "text": "Этот запрос будет одобрен автоматически" } } }, "seasonSelector": { - "caption": "Выберите сезоны, которые хотите скачать", + "caption": "Отметьте сезоны, которые вы хотите загрузить", "table": { "header": { "season": "Сезон", - "numberOfEpisodes": "Количество эпизодов" + "numberOfEpisodes": "Количество серий" } } } diff --git a/public/locales/ru/modules/ping.json b/public/locales/ru/modules/ping.json index d7c012912e3..7820c9229d8 100644 --- a/public/locales/ru/modules/ping.json +++ b/public/locales/ru/modules/ping.json @@ -1,11 +1,11 @@ { "descriptor": { - "name": "Пинг", - "description": "Отображает индикатор состояния в зависимости от HTTP-кода ответа данного URL." + "name": "Проверка доступности", + "description": "Отображает индикатор состояния в зависимости от кода HTTP-ответа для указанного URL." }, "states": { - "online": "Онлайн {{response}}", - "offline": "Офлайн {{response}}", + "online": "Доступно {{response}}", + "offline": "Недоступно {{response}}", "loading": "Загрузка..." } } diff --git a/public/locales/ru/modules/rss.json b/public/locales/ru/modules/rss.json index f794318601b..e696745fafd 100644 --- a/public/locales/ru/modules/rss.json +++ b/public/locales/ru/modules/rss.json @@ -1,38 +1,38 @@ { "descriptor": { - "name": "Виджет RSS", - "description": "Виджет RSS позволяет отображать RSS-каналы на вашей панели.", + "name": "RSS-виджет", + "description": "Виджет RSS позволяет отображать RSS-ленты на вашей панели управления.", "settings": { - "title": "Настройки виджета RSS", + "title": "Настройки RSS-виджета", "rssFeedUrl": { - "label": "URL-адреса каналов RSS", - "description": "URL-адреса каналов RSS, которые вы хотите отображать." + "label": "URL-адреса RSS-лент", + "description": "URL-адреса RSS-лент, которые вы хотите отображать." }, "refreshInterval": { "label": "Интервал обновления (в минутах)" }, "dangerousAllowSanitizedItemContent": { - "label": "Разрешить форматирование HTML (Опасно)", - "info": "Разрешение HTML-форматирования извне может быть опасным.
Пожалуйста, убедитесь в том, что лента поступает из надежного источника." + "label": "Разрешить HTML-форматирование (Небезопасно)", + "info": "Разрешение HTML-форматирования из внешних источников может быть небезопасным.
Убедитесь, что лента поступает из надёжного источника." }, "textLinesClamp": { - "label": "Ограничение количества строк текста" + "label": "Ограничение строк текста" }, "sortByPublishDateAscending": { "label": "Сортировать по дате публикации (по возрастанию)" }, "sortPostsWithoutPublishDateToTheTop": { - "label": "Разместить сообщения без даты публикации вверху списка" + "label": "Размещать записи без даты публикации вверху" }, "maximumAmountOfPosts": { - "label": "Максимальное количество постов" + "label": "Максимальное количество записей" } }, "card": { "errors": { "general": { - "title": "Не удаётся получить RSS-канал", - "text": "Проблема с доступом к RSS-каналу. Убедитесь, что вы правильно настроили RSS канал, используя действительный URL. URL-адреса должны соответствовать официальной спецификации. После обновления канала может потребоваться обновить панель." + "title": "Не удалось получить RSS-ленту", + "text": "Возникла проблема при получении RSS-ленты. Убедитесь, что вы правильно настроили RSS-ленту, используя действительный URL. URL-адреса должны соответствовать официальной спецификации. После обновления ленты может потребоваться обновить панель управления." } } } diff --git a/public/locales/ru/modules/search.json b/public/locales/ru/modules/search.json index 0094dea6fae..0ab0ebb7f0a 100644 --- a/public/locales/ru/modules/search.json +++ b/public/locales/ru/modules/search.json @@ -1,7 +1,7 @@ { "descriptor": { "name": "Строка поиска", - "description": "Строка поиска, позволяющая искать в пользовательской поисковой системе, YouTube и поддерживаемых интеграциях." + "description": "Строка поиска, позволяющая искать в вашей поисковой системе, YouTube и поддерживаемых интеграциях." }, "input": { "placeholder": "Поиск в интернете..." @@ -22,9 +22,9 @@ }, "overseerr": { "name": "Overseerr", - "description": "Поиск фильмов и телешоу на Overseerr" + "description": "Поиск фильмов и сериалов в Overseerr" } }, "tip": "Вы можете выбрать строку поиска с помощью сочетания клавиш ", - "switchedSearchEngine": "Переключено на поиск по {{searchEngine}}" + "switchedSearchEngine": "Переключено на поиск в {{searchEngine}}" } diff --git a/public/locales/ru/modules/smart-home/entity-state.json b/public/locales/ru/modules/smart-home/entity-state.json index bfec03d854d..7ef7abdf39d 100644 --- a/public/locales/ru/modules/smart-home/entity-state.json +++ b/public/locales/ru/modules/smart-home/entity-state.json @@ -7,26 +7,26 @@ "title": "Состояние объекта", "entityId": { "label": "ID объекта", - "info": "Уникальный идентификатор объекта в Home Assistant. Скопируйте, нажав на объект > Щелкните значок шестеренки > Нажмите кнопку копирования в разделе «Идентификатор объекта». Некоторые пользовательские объекты могут не поддерживаться." + "info": "Уникальный идентификатор объекта в Home Assistant. Скопируйте, нажав на объект > Нажмите на значок настроек > Нажмите кнопку копирования в поле 'ID объекта'. Некоторые пользовательские объекты могут не поддерживаться." }, "appendUnit": { "label": "Добавить единицу измерения", "info": "Добавьте атрибут единицы измерения к состоянию объекта." }, "automationId": { - "label": "ID автоматизации (необязательно)", - "info": "Ваш уникальный идентификатор автоматизации. Всегда начинается с automation.XXXXX. Если не задан, виджет не будет кликабельным и будет только отображать состояние. После клика состояние объекта будет обновлено." + "label": "Дополнительный ID автоматизации", + "info": "Ваш уникальный идентификатор автоматизации. Всегда начинается с automation.XXXXX. Если не задан, виджет будет неактивным и будет только отображать состояние. При нажатии на виджет состояние объекта будет обновлено." }, "displayName": { "label": "Отображаемое имя" }, "displayFriendlyName": { - "label": "Показать собственное имя", - "info": "Показывать собственное имя Home Assistant вместо отображаемого имени." + "label": "Отображать пользовательское название", + "info": "Отображать пользовательское название из Home Assistant вместо системного идентификатора." }, "genericToggle": { - "label": "Переключение объекта", - "info": "Выполнить общее действие переключения Home Assistant для объекта при нажатии." + "label": "Переключатель объекта", + "info": "Выполнить стандартное действие переключения Home Assistant для объекта при нажатии." } } } diff --git a/public/locales/ru/modules/smart-home/trigger-automation.json b/public/locales/ru/modules/smart-home/trigger-automation.json index a9436e35893..772cd0acef1 100644 --- a/public/locales/ru/modules/smart-home/trigger-automation.json +++ b/public/locales/ru/modules/smart-home/trigger-automation.json @@ -1,9 +1,9 @@ { "descriptor": { "name": "Автоматизация Home Assistant", - "description": "Запуск автоматизации", + "description": "Выполнить автоматизацию", "settings": { - "title": "Запуск автоматизации", + "title": "Выполнить автоматизацию", "automationId": { "label": "ID автоматизации", "info": "Ваш уникальный идентификатор автоматизации. Всегда начинается с automation.XXXXX." diff --git a/public/locales/ru/modules/torrents-status.json b/public/locales/ru/modules/torrents-status.json index 8793a027e18..7345d888d7e 100644 --- a/public/locales/ru/modules/torrents-status.json +++ b/public/locales/ru/modules/torrents-status.json @@ -1,43 +1,43 @@ { "descriptor": { "name": "Торренты", - "description": "Отображает список торрентов из поддерживаемых Torrent-клиентов.", + "description": "Отображает список торрентов из поддерживаемых торрент-клиентов.", "settings": { - "title": "Настройки виджета Торренты", + "title": "Настройки виджета торрентов", "refreshInterval": { "label": "Интервал обновления (в секундах)" }, "displayCompletedTorrents": { - "label": "Отображение завершенных торрентов" + "label": "Отображать завершённые торренты" }, "displayActiveTorrents": { "label": "Отображать активные торренты" }, "speedLimitOfActiveTorrents": { - "label": "Скорость загрузки, при которой торрент считается активным (кБ/с)" + "label": "Скорость отдачи для определения торрента как активного (кБ/с)" }, "displayStaleTorrents": { "label": "Отображать неактивные торренты" }, "labelFilterIsWhitelist": { - "label": "Список меток является белым списком (вместо черного списка)" + "label": "Список меток является белым списком (вместо чёрного)" }, "labelFilter": { "label": "Список меток", - "description": "Когда отмечено 'белый список', применится как белый список. Если не отмечено, применится как чёрный список. Не будет ничего делать, если пусто" + "description": "Когда включен режим 'белого списка', это будет белый список. Если выключен - чёрный список. Не действует, если список пуст" }, "displayRatioWithFilter": { - "label": "Отображать рейтинг для отфильтрованных торрентов", + "label": "Отображать рейтинг отдачи для отфильтрованных торрентов", "info": "Если отключено, будет отображаться только общий рейтинг. Общий рейтинг все равно будет использовать метки, если они заданы" }, "columnOrdering": { - "label": "Включить изменение порядка столбцов" + "label": "Включить переупорядочивание столбцов" }, "rowSorting": { "label": "Включить сортировку строк" }, "columns": { - "label": "Выбрать столбцы для отображения", + "label": "Выберите столбцы для отображения", "data": { "date": "Дата добавления", "down": "Загрузка", @@ -54,14 +54,14 @@ "card": { "footer": { "error": "Ошибка", - "lastUpdated": "Последнее обновление {{time}} назад", + "lastUpdated": "Обновлено {{time}} назад", "ratioGlobal": "Общий рейтинг", "ratioWithFilter": "Рейтинг с фильтром" }, "table": { "header": { - "isCompleted": "Скачивается", - "name": "Имя", + "isCompleted": "Загрузка", + "name": "Название", "dateAdded": "Добавлено", "size": "Размер", "download": "Загрузка", @@ -78,15 +78,15 @@ "stateMessage": "Сообщение о состоянии" }, "item": { - "text": "Под управлением {{appName}}, {{ratio}} рейтинг" + "text": "Управляется {{appName}}, рейтинг {{ratio}}" }, "body": { "nothingFound": "Торренты не найдены", - "filterHidingItems": "{{count}} записей скрыты вашими фильтрами" + "filterHidingItems": "{{count}} записей скрыто вашими фильтрами" } }, "lineChart": { - "title": "Текущая скорость скачивания", + "title": "Текущая скорость загрузки", "download": "Загрузка: {{download}}", "upload": "Отдача: {{upload}}", "timeSpan": "{{seconds}} секунд назад", @@ -95,16 +95,16 @@ }, "errors": { "noDownloadClients": { - "title": "Не найдено поддерживаемых клиентов Torrent!", - "text": "Добавьте поддерживаемый Torrent-клиент для просмотра текущих загрузок" + "title": "Не найдены поддерживаемые торрент-клиенты!", + "text": "Добавьте поддерживаемый торрент-клиент для просмотра текущих загрузок" }, "generic": { - "title": "Возникла непредвиденная ошибка", - "text": "Невозможно установить связь с Torrent-клиентами. Пожалуйста, проверьте настройки" + "title": "Произошла непредвиденная ошибка", + "text": "Не удалось связаться с вашими торрент-клиентами. Пожалуйста, проверьте настройки" } }, "popover": { - "introductionPrefix": "Под управлением", + "introductionPrefix": "Управляется", "metrics": { "queuePosition": "Позиция в очереди - {{position}}", "progress": "Прогресс - {{progress}}%", diff --git a/public/locales/ru/modules/usenet.json b/public/locales/ru/modules/usenet.json index 9af1bfeadf9..86c530add1a 100644 --- a/public/locales/ru/modules/usenet.json +++ b/public/locales/ru/modules/usenet.json @@ -1,12 +1,12 @@ { "descriptor": { "name": "Usenet", - "description": "Позволяет просматривать и управлять экземпляром Usenet." + "description": "Позволяет просматривать и управлять вашим экземпляром Usenet." }, "card": { "errors": { "noDownloadClients": { - "title": "Не найдено ни одного поддерживаемого клиента загрузки!", + "title": "Не найдены поддерживаемые клиенты загрузки!", "text": "Добавьте поддерживаемый клиент загрузки Usenet для просмотра текущих загрузок" } } @@ -16,12 +16,12 @@ "history": "История" }, "info": { - "sizeLeft": "Оставшийся размер", + "sizeLeft": "Осталось", "paused": "Приостановлено" }, "queue": { "header": { - "name": "Имя", + "name": "Название", "size": "Размер", "eta": "Осталось", "progress": "Прогресс" @@ -35,9 +35,9 @@ }, "history": { "header": { - "name": "Имя", + "name": "Название", "size": "Размер", - "duration": "Продолжительность" + "duration": "Длительность" }, "empty": "Пусто", "error": { diff --git a/public/locales/ru/modules/video-stream.json b/public/locales/ru/modules/video-stream.json index 9ac77f70c0c..4e25d6ee33c 100644 --- a/public/locales/ru/modules/video-stream.json +++ b/public/locales/ru/modules/video-stream.json @@ -1,11 +1,11 @@ { "descriptor": { - "name": "Трансляция видео", - "description": "Встраивание видео или прямой трансляции видео с камеры или веб-сайта", + "name": "Видеопоток", + "description": "Встраивание видеопотока или видео с камеры или веб-сайта", "settings": { - "title": "Настройки виджета трансляции видео", + "title": "Настройки виджета видеопотока", "FeedUrl": { - "label": "URL-адрес потока" + "label": "URL потока" }, "autoPlay": { "label": "Автовоспроизведение" @@ -14,11 +14,11 @@ "label": "Без звука" }, "controls": { - "label": "Управление видеоплеером" + "label": "Элементы управления видеоплеером" } } }, "errors": { - "invalidStream": "Некорректная трансляция" + "invalidStream": "Недействительный поток" } } \ No newline at end of file diff --git a/public/locales/ru/modules/weather.json b/public/locales/ru/modules/weather.json index d38909463ca..dd09ea4c5da 100644 --- a/public/locales/ru/modules/weather.json +++ b/public/locales/ru/modules/weather.json @@ -1,20 +1,20 @@ { "descriptor": { "name": "Погода", - "description": "Отображает текущую информацию о погоде для заданного местоположения.", + "description": "Отображает текущую информацию о погоде для указанного местоположения.", "settings": { "title": "Настройки виджета погоды", "displayInFahrenheit": { - "label": "Показать в градусах Фаренгейта" + "label": "Отображать в градусах Фаренгейта" }, "displayCityName": { "label": "Отобразить название города" }, "displayWeekly": { - "label": "Показать прогноз погоды на неделю" + "label": "Отображать прогноз на неделю" }, "forecastDays": { - "label": "Число дней для отображения" + "label": "Количество дней прогноза" }, "location": { "label": "Местоположение" @@ -24,14 +24,14 @@ "card": { "weatherDescriptions": { "clear": "Ясно", - "mainlyClear": "Малооблачно", + "mainlyClear": "Преимущественно ясно", "fog": "Туман", "drizzle": "Морось", - "freezingDrizzle": "Изморозь, возможен гололёд", + "freezingDrizzle": "Ледяная морось", "rain": "Дождь", - "freezingRain": "Моросящий дождь", + "freezingRain": "Ледяной дождь", "snowFall": "Снегопад", - "snowGrains": "Снежные зерна", + "snowGrains": "Снежная крупа", "rainShowers": "Ливень", "snowShowers": "Снегопад", "thunderstorm": "Гроза", diff --git a/public/locales/ru/password-requirements.json b/public/locales/ru/password-requirements.json index 353561a40ed..484632759d3 100644 --- a/public/locales/ru/password-requirements.json +++ b/public/locales/ru/password-requirements.json @@ -1,7 +1,7 @@ { - "number": "Включает цифру", - "lowercase": "Включает строчную букву", - "uppercase": "Включает заглавную букву", - "special": "Включает специальный символ", - "length": "Включает не менее {{count}} символов" + "number": "Содержит цифру", + "lowercase": "Содержит строчную букву", + "uppercase": "Содержит заглавную букву", + "special": "Содержит специальный символ", + "length": "Содержит не менее {{count}} символов" } \ No newline at end of file diff --git a/public/locales/ru/settings/common.json b/public/locales/ru/settings/common.json index dc32ba18d25..38eae514cde 100644 --- a/public/locales/ru/settings/common.json +++ b/public/locales/ru/settings/common.json @@ -3,16 +3,16 @@ "tooltip": "Настройки", "tabs": { "common": "Общие", - "customizations": "Оформление" + "customizations": "Персонализация" }, "tips": { - "configTip": "Загрузите свой файл конфигурации, перетащив его на страницу!" + "configTip": "Загрузите ваш файл конфигурации, перетащив его на страницу!" }, "credits": { "madeWithLove": "Сделано с ❤️ от @", - "thirdPartyContent": "Посмотреть контент от третьих сторон", + "thirdPartyContent": "Посмотреть стороннее содержимое", "thirdPartyContentTable": { - "dependencyName": "Зависимости", + "dependencyName": "Зависимость", "dependencyVersion": "Версия" } }, @@ -23,16 +23,16 @@ "subtitle": "Изменения будут сохранены автоматически" }, "divider": "Параметры макета", - "main": "Главная", + "main": "Основное", "sidebar": "Боковая панель", "cannotturnoff": "Невозможно отключить", - "dashboardlayout": "Макет панели", + "dashboardlayout": "Макет панели управления", "enablersidebar": "Включить правую боковую панель", "enablelsidebar": "Включить левую боковую панель", - "enablesearchbar": "Включить панель поиска", + "enablesearchbar": "Включить строку поиска", "enabledocker": "Включить интеграцию с Docker", - "enableping": "Включить пинг", - "enablelsidebardesc": "Необязательно. Можно использовать только для приложений и интеграций", - "enablersidebardesc": "Необязательно. Можно использовать только для приложений и интеграций" + "enableping": "Включить индикаторы доступности", + "enablelsidebardesc": "Опционально. Может использоваться только для приложений и интеграций", + "enablersidebardesc": "Опционально. Может использоваться только для приложений и интеграций" } } diff --git a/public/locales/ru/settings/customization/access.json b/public/locales/ru/settings/customization/access.json index 77716a538bd..4046b76bb00 100644 --- a/public/locales/ru/settings/customization/access.json +++ b/public/locales/ru/settings/customization/access.json @@ -1,6 +1,6 @@ { "allowGuests": { - "label": "Разрешить анонимность", - "description": "Разрешить пользователям, которые не вошли, просматривать вашу панель" + "label": "Разрешить анонимный доступ", + "description": "Разрешить пользователям, не вошедшим в систему, просматривать вашу панель" } } \ No newline at end of file diff --git a/public/locales/ru/settings/customization/general.json b/public/locales/ru/settings/customization/general.json index 7dbafdea014..68604675a20 100644 --- a/public/locales/ru/settings/customization/general.json +++ b/public/locales/ru/settings/customization/general.json @@ -1,29 +1,29 @@ { - "text": "Настройки позволяют вам настроить и скорректировать свой опыт работы с Homarr в соответствии с вашими предпочтениями.", + "text": "Персонализация позволяет настроить и адаптировать работу с Homarr под ваши предпочтения.", "accordeon": { "layout": { "name": "Макет", - "description": "Включить и отключить элементы в заголовке и на плитках панели" + "description": "Включение и отключение элементов в заголовке и плитках панели управления" }, "gridstack": { "name": "Сетка", - "description": "Настройте поведение и столбцы вашей панели" + "description": "Настройка поведения и столбцов области панели управления" }, "pageMetadata": { "name": "Метаданные страницы", - "description": "Настроить заголовки, логотип и PWA" + "description": "Настройка заголовков, логотипа и PWA" }, "appereance": { "name": "Внешний вид", "description": "Настройка фона, цветов и внешнего вида приложений" }, "accessibility": { - "name": "Доступность", - "description": "Настройте Homarr для людей с ограниченными возможностями" + "name": "Специальные возможности", + "description": "Настройка Homarr для пользователей с ограниченными возможностями" }, "access": { "name": "Доступ", - "description": "Настроить, кто имеет доступ к вашей панели" + "description": "Настройка прав доступа к вашей панели" } } } diff --git a/public/locales/ru/settings/customization/gridstack.json b/public/locales/ru/settings/customization/gridstack.json index 473864f3e90..8a9518e7838 100644 --- a/public/locales/ru/settings/customization/gridstack.json +++ b/public/locales/ru/settings/customization/gridstack.json @@ -1,10 +1,10 @@ { "columnsCount": { - "labelPreset": "Столбцы {{size}} размера", + "labelPreset": "Количество столбцов для размера {{size}}", "descriptionPreset": "Количество столбцов при ширине экрана менее {{pixels}} пикселей", - "descriptionExceedsPreset": "Количество столбцов, когда размер экрана превышает {{pixels}} пикселей" + "descriptionExceedsPreset": "Количество столбцов при ширине экрана более {{pixels}} пикселей" }, - "unsavedChanges": "У вас есть несохраненные изменения. Нажмите кнопку \"Применить изменения\" ниже, чтобы применить и сохранить.", + "unsavedChanges": "Есть несохранённые изменения. Нажмите кнопку «Применить изменения» ниже, чтобы применить и сохранить.", "applyChanges": "Применить изменения", "defaultValues": "Значения по умолчанию" } \ No newline at end of file diff --git a/public/locales/ru/settings/customization/page-appearance.json b/public/locales/ru/settings/customization/page-appearance.json index 442b00de752..761b744c68a 100644 --- a/public/locales/ru/settings/customization/page-appearance.json +++ b/public/locales/ru/settings/customization/page-appearance.json @@ -1,19 +1,19 @@ { "pageTitle": { "label": "Заголовок страницы", - "description": "Заголовок панели в левом верхнем углу" + "description": "Название панели управления в левом верхнем углу" }, "metaTitle": { "label": "Мета-заголовок", - "description": "Заголовок, отображаемый на вкладке вашего браузера" + "description": "Заголовок, отображаемый во вкладке браузера" }, "logo": { "label": "Логотип", "description": "Логотип, отображаемый в верхнем левом углу" }, "favicon": { - "label": "Фавикон", - "description": "Иконка, отображаемая на вкладке вашего браузера" + "label": "Значок сайта", + "description": "Значок, отображаемый во вкладке браузера" }, "background": { "label": "Фон" @@ -21,29 +21,29 @@ "backgroundImageAttachment": { "label": "Закрепление фонового изображения", "options": { - "fixed": "Фиксированное - Фон остается неподвижным в том же положении (рекомендуется)", - "scroll": "Прокрутка - Фон прокручивается вместе с вашим перемещением мыши" + "fixed": "Фиксированный — фон остаётся на месте (рекомендуется)", + "scroll": "Прокручиваемый — фон движется вместе с вашим перемещением мыши" } }, "backgroundImageSize": { - "label": "Размер фонового изображения", + "label": "Повторение фонового изображения", "options": { - "cover": "Заполнение - Изображение масштабируется наименьшим образом для покрытия всего окна с обрезкой лишнего пространства (рекомендуется)", + "cover": "Заполнение - масштабирует изображение с минимально возможным размером для покрытия всего окна, обрезая излишки (рекомендуется)", "contain": "По размеру - Изображение масштабируется наибольшим образом в пределах контейнера без обрезки или растягивания." } }, "backgroundImageRepeat": { "label": "Закрепление фонового изображения", "options": { - "repeat": "Повторение - Изображение повторяется столько раз, сколько нужно для покрытия всей области рисования фонового изображения.", - "no-repeat": "Без повторения - Изображение не повторяется и может не заполнить все пространство (рекомендуется)", - "repeat-x": "Повторение по X - Повторение, как в 'Повторение', но только по горизонтальной оси.", - "repeat-y": "Повторение по Y - Повторение, как в 'Повторение', но только по вертикальной оси." + "repeat": "Повторять — изображение повторяется столько раз, сколько необходимо для покрытия всей области фона.", + "no-repeat": "Без повторения — изображение не повторяется и может не заполнить всё пространство (рекомендуется)", + "repeat-x": "Повторять по горизонтали — аналогично «Повторять», но только по горизонтальной оси.", + "repeat-y": "Повторять по вертикали — аналогично «Повторять», но только по вертикальной оси." } }, "customCSS": { "label": "Пользовательский CSS", - "description": "Дополнительная настройка вашей панели с использованием CSS, рекомендуется только опытным пользователям", + "description": "Дополнительная настройка панели управления с помощью CSS (рекомендуется только опытным пользователям)", "placeholder": "Пользовательский CSS будет применяться в последнюю очередь", "applying": "Применение CSS..." } diff --git a/public/locales/ru/tools/docker.json b/public/locales/ru/tools/docker.json index 1384e9e50bf..14e70107f82 100644 --- a/public/locales/ru/tools/docker.json +++ b/public/locales/ru/tools/docker.json @@ -2,13 +2,13 @@ "title": "Docker", "alerts": { "notConfigured": { - "text": "Ваш экземпляр Homarr не настроен на работу с Docker или не удалось получить информацию о контейнерах. Пожалуйста, ознакомьтесь с документацией, чтобы узнать, как настроить интеграцию." + "text": "В вашем экземпляре Homarr не настроен Docker или не удалось получить контейнеры. Пожалуйста, ознакомьтесь с документацией по настройке интеграции." } }, "modals": { "selectBoard": { "title": "Выберите панель", - "text": "Выберите панель, на которую необходимо добавить приложения для выбранных Docker-контейнеров.", + "text": "Выберите панель, куда вы хотите добавить приложения для выбранных контейнеров Docker.", "form": { "board": { "label": "Панель" @@ -20,12 +20,12 @@ "notifications": { "selectBoard": { "success": { - "title": "Добавлены приложения на панель", - "message": "Приложения для выбранных Docker-контейнеров были добавлены на панель." + "title": "Приложения добавлены на панель", + "message": "Приложения для выбранных контейнеров Docker были добавлены на панель." }, "error": { "title": "Не удалось добавить приложения на панель", - "message": "Приложения для выбранных Docker-контейнеров не удалось добавить на панель." + "message": "Не удалось добавить приложения для выбранных контейнеров Docker на панель." } } } diff --git a/public/locales/ru/user/preferences.json b/public/locales/ru/user/preferences.json index 615d1a70abe..5beea15a4eb 100644 --- a/public/locales/ru/user/preferences.json +++ b/public/locales/ru/user/preferences.json @@ -9,12 +9,12 @@ "accessibility": { "title": "Доступность", "disablePulse": { - "label": "Отключить пульсацию пинга", - "description": "По умолчанию, индикаторы пинга в Homarr будут пульсировать. Это может раздражать. Данный ползунок отключит анимацию" + "label": "Отключить пульсацию индикатора", + "description": "По умолчанию индикаторы доступности в Homarr пульсируют. Это может раздражать. Этот переключатель отключит анимацию" }, "replaceIconsWithDots": { - "label": "Замените точки пинга значками", - "description": "У пользователей, страдающих цветовой слепотой, точки пинга могут быть неразличимыми. Это заменит индикаторы значками" + "label": "Заменить точки-индикаторы на значки", + "description": "Для пользователей с дальтонизмом цветные точки-индикаторы могут быть неразличимы. Это заменит точки на информативные значки" } }, "localization": { @@ -32,17 +32,17 @@ }, "searchEngine": { "title": "Поисковая система", - "custom": "Пользовательский", + "custom": "Пользовательская", "newTab": { "label": "Открывать результаты поиска в новой вкладке" }, "autoFocus": { - "label": "Фокусировать панель поиска при загрузке страницы.", - "description": "Это автоматически переведет фокус на панель поиска, когда вы переходите на страницу панели. Это будет работать только на настольных устройствах." + "label": "Фокусироваться на строке поиска при загрузке страницы.", + "description": "При переходе на страницу панели курсор будет автоматически устанавливаться в строку поиска. Работает только на настольных устройствах." }, "template": { "label": "URL запроса", - "description": "Использовать %s в качестве заполнителя для запроса" + "description": "Используйте %s как заполнитель для запроса" } } } \ No newline at end of file diff --git a/public/locales/ru/widgets/draggable-list.json b/public/locales/ru/widgets/draggable-list.json index c45349970f3..68461131eae 100644 --- a/public/locales/ru/widgets/draggable-list.json +++ b/public/locales/ru/widgets/draggable-list.json @@ -1,7 +1,7 @@ { "noEntries": { "title": "Нет записей", - "text": "Используйте кнопки ниже, чтобы добавить больше записей" + "text": "Используйте кнопки ниже для добавления записей" }, "buttonAdd": "Добавить" } diff --git a/public/locales/ru/widgets/error-boundary.json b/public/locales/ru/widgets/error-boundary.json index de03fd01081..f0478b9a2f2 100644 --- a/public/locales/ru/widgets/error-boundary.json +++ b/public/locales/ru/widgets/error-boundary.json @@ -3,12 +3,12 @@ "title": "Ой, произошла ошибка!", "buttons": { "details": "Подробности", - "tryAgain": "Попробовать снова" + "tryAgain": "Повторить" } }, "modal": { - "text": "", - "label": "Ваша ошибка", - "reportButton": "Сообщить об этой ошибке" + "text": "Виджет неожиданно завершил работу. Пожалуйста, ознакомьтесь с документацией и исправьте возможные опечатки.", + "label": "Возникшая ошибка", + "reportButton": "Сообщить об ошибке на GitHub" } } diff --git a/public/locales/ru/zod.json b/public/locales/ru/zod.json index b163eaa756d..deba3ffcf2d 100644 --- a/public/locales/ru/zod.json +++ b/public/locales/ru/zod.json @@ -1,19 +1,19 @@ { "errors": { - "default": "Данное поле недействительно", + "default": "Недопустимое значение поля", "required": "Данное поле является обязательным", "string": { - "startsWith": "Значение данного поля должно начинаться с {{startsWith}}", - "endsWith": "Значение данного поля должно заканчиваться на {{endsWith}}", - "includes": "Значение данного поля должно включать {{includes}}" + "startsWith": "Поле должно начинаться с {{startsWith}}", + "endsWith": "Поле должно заканчиваться на {{endsWith}}", + "includes": "Поле должно содержать {{includes}}" }, "tooSmall": { - "string": "Данное поле должно содержать не менее {{minimum}} символов", - "number": "Значение данного поля должно быть больше или равно {{minimum}}" + "string": "Поле должно содержать не менее {{minimum}} символов", + "number": "Значение должно быть больше или равно {{minimum}}" }, "tooBig": { - "string": "Данное поле должно содержать не более {{maximum}} символов", - "number": "Значение этого поля должно быть меньше или равно {{maximum}}" + "string": "Поле должно содержать не более {{maximum}} символов", + "number": "Значение должно быть меньше или равно {{maximum}}" }, "custom": { "passwordMatch": "Пароли должны совпадать" diff --git a/public/locales/sk/layout/manage.json b/public/locales/sk/layout/manage.json index 54e776c1c05..aba56ab32d1 100644 --- a/public/locales/sk/layout/manage.json +++ b/public/locales/sk/layout/manage.json @@ -26,7 +26,8 @@ "title": "Nástroje", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/sk/manage/migrate.json b/public/locales/sk/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/sk/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/sk/widgets/error-boundary.json b/public/locales/sk/widgets/error-boundary.json index a3abe5e7ded..e5e36474d15 100644 --- a/public/locales/sk/widgets/error-boundary.json +++ b/public/locales/sk/widgets/error-boundary.json @@ -7,8 +7,8 @@ } }, "modal": { - "text": "", - "label": "Vaša chyba", - "reportButton": "Nahlásiť chybu" + "text": "Widet sa neočakávane zrútil. Prečítajte si dokumentáciu a opravte prípadné preklepy.", + "label": "Vyskytla sa chyba", + "reportButton": "Nahlásiť túto chybu na GitHub" } } diff --git a/public/locales/sl/layout/manage.json b/public/locales/sl/layout/manage.json index e634162fa18..ac7e5c1148f 100644 --- a/public/locales/sl/layout/manage.json +++ b/public/locales/sl/layout/manage.json @@ -26,7 +26,8 @@ "title": "Orodja", "items": { "docker": "Docker", - "api": "" + "api": "", + "migrate": "" } }, "about": { diff --git a/public/locales/sl/manage/migrate.json b/public/locales/sl/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/sl/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/sl/widgets/error-boundary.json b/public/locales/sl/widgets/error-boundary.json index 9169efaa8ed..1d8caa79471 100644 --- a/public/locales/sl/widgets/error-boundary.json +++ b/public/locales/sl/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "Vaša napaka", - "reportButton": "Prijavite to napako" + "label": "", + "reportButton": "" } } diff --git a/public/locales/sv/layout/manage.json b/public/locales/sv/layout/manage.json index 406c112c12e..5ed2e7d019b 100644 --- a/public/locales/sv/layout/manage.json +++ b/public/locales/sv/layout/manage.json @@ -26,7 +26,8 @@ "title": "Verktyg", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/sv/manage/migrate.json b/public/locales/sv/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/sv/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/sv/widgets/error-boundary.json b/public/locales/sv/widgets/error-boundary.json index c9f552454b4..fc816dced98 100644 --- a/public/locales/sv/widgets/error-boundary.json +++ b/public/locales/sv/widgets/error-boundary.json @@ -7,8 +7,8 @@ } }, "modal": { - "text": "", - "label": "Dina fel", - "reportButton": "Rapportera fel" + "text": "Widet kraschade oväntat. Läs igenom dokumentationen och åtgärda eventuella skrivfel.", + "label": "", + "reportButton": "" } } diff --git a/public/locales/tr/layout/manage.json b/public/locales/tr/layout/manage.json index 021919102b2..8df8d652971 100644 --- a/public/locales/tr/layout/manage.json +++ b/public/locales/tr/layout/manage.json @@ -26,7 +26,8 @@ "title": "Araçlar", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/tr/layout/modals/about.json b/public/locales/tr/layout/modals/about.json index facf831f8b3..a15d2f81119 100644 --- a/public/locales/tr/layout/modals/about.json +++ b/public/locales/tr/layout/modals/about.json @@ -12,15 +12,15 @@ "actions": { "toggleTheme": "Aydınlık/karanlık mod", "focusSearchBar": "Arama çubuğuna odaklan", - "openDocker": "Docker Widget'ını açın", + "openDocker": "Docker Sayfası", "toggleEdit": "Düzenleme Modunu Değiştir" }, "metrics": { "configurationSchemaVersion": "Yapılandırma şeması sürümü", - "version": "Versiyon", + "version": "Sürüm", "nodeEnvironment": "Node ortamı", - "i18n": "Yüklenen I18n çeviri ad alanları", - "locales": "Yapılandırılmış I18n yerelleri", + "i18n": "Kullanılan l18n dil yapılandırması", + "locales": "Kurulan l18n dil yapılandırması", "experimental_disableEditMode": "DENEYSEL: Düzenleme modunu devre dışı bırak" }, "version": { diff --git a/public/locales/tr/manage/migrate.json b/public/locales/tr/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/tr/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/tr/widgets/error-boundary.json b/public/locales/tr/widgets/error-boundary.json index afbb173edc1..ec23f0d36ab 100644 --- a/public/locales/tr/widgets/error-boundary.json +++ b/public/locales/tr/widgets/error-boundary.json @@ -7,8 +7,8 @@ } }, "modal": { - "text": "", - "label": "Karşılaştığın Hata", - "reportButton": "Hatayı bildir" + "text": "Widget beklenmedik bir şekilde çöktü. Lütfen dokümantasyonu okuyun ve yazım hatalarını düzeltin.", + "label": "Oluşan hata", + "reportButton": "Bu hatayı GitHub'da bildirin" } } diff --git a/public/locales/tw/layout/manage.json b/public/locales/tw/layout/manage.json index b42795b777b..40b12ba73b5 100644 --- a/public/locales/tw/layout/manage.json +++ b/public/locales/tw/layout/manage.json @@ -26,7 +26,8 @@ "title": "工具", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/tw/manage/migrate.json b/public/locales/tw/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/tw/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/tw/widgets/error-boundary.json b/public/locales/tw/widgets/error-boundary.json index 6b891f73ebf..dde2f0df0c0 100644 --- a/public/locales/tw/widgets/error-boundary.json +++ b/public/locales/tw/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "您的錯誤", - "reportButton": "回報該錯誤" + "label": "", + "reportButton": "" } } diff --git a/public/locales/uk/layout/manage.json b/public/locales/uk/layout/manage.json index 39235e06311..a434e605f8e 100644 --- a/public/locales/uk/layout/manage.json +++ b/public/locales/uk/layout/manage.json @@ -26,7 +26,8 @@ "title": "Інструменти", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/uk/manage/migrate.json b/public/locales/uk/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/uk/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/uk/widgets/error-boundary.json b/public/locales/uk/widgets/error-boundary.json index 249ba7b68c3..408ee83e210 100644 --- a/public/locales/uk/widgets/error-boundary.json +++ b/public/locales/uk/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "Ви помилилися", - "reportButton": "Повідомити про помилку" + "label": "", + "reportButton": "" } } diff --git a/public/locales/vi/layout/manage.json b/public/locales/vi/layout/manage.json index b41f930a507..de707c2d4cf 100644 --- a/public/locales/vi/layout/manage.json +++ b/public/locales/vi/layout/manage.json @@ -26,7 +26,8 @@ "title": "Công cụ", "items": { "docker": "Docker", - "api": "API" + "api": "API", + "migrate": "" } }, "about": { diff --git a/public/locales/vi/manage/migrate.json b/public/locales/vi/manage/migrate.json new file mode 100644 index 00000000000..64030b6ba2d --- /dev/null +++ b/public/locales/vi/manage/migrate.json @@ -0,0 +1,33 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "securityNote": { + "title": "", + "text": "" + }, + "form": { + "label": "", + "option": { + "boards": { + "label": "" + }, + "integrations": { + "label": "", + "description": "" + }, + "users": { + "label": "", + "description": "" + } + } + }, + "action": { + "export": "" + }, + "modal": { + "title": "", + "description": "", + "copyDismiss": "" + } +} \ No newline at end of file diff --git a/public/locales/vi/widgets/error-boundary.json b/public/locales/vi/widgets/error-boundary.json index a5a05e17e46..5b4115bf97d 100644 --- a/public/locales/vi/widgets/error-boundary.json +++ b/public/locales/vi/widgets/error-boundary.json @@ -8,7 +8,7 @@ }, "modal": { "text": "", - "label": "Lỗi của bạn", - "reportButton": "Báo cáo lỗi này" + "label": "", + "reportButton": "" } } diff --git a/src/components/layout/Templates/ManageLayout.tsx b/src/components/layout/Templates/ManageLayout.tsx index 80c5af53144..9ed446e27f1 100644 --- a/src/components/layout/Templates/ManageLayout.tsx +++ b/src/components/layout/Templates/ManageLayout.tsx @@ -17,11 +17,13 @@ import { IconBrandDiscord, IconBrandDocker, IconBrandGithub, + IconFileExport, IconGitFork, IconHome, IconInfoSmall, IconLayoutDashboard, - IconMailForward, IconPlug, + IconMailForward, + IconPlug, IconQuestionMark, IconTool, IconUser, @@ -103,8 +105,12 @@ export const ManageLayout = ({ children }: ManageLayoutProps) => { }, api: { icon: IconPlug, - href: '/manage/tools/swagger' - } + href: '/manage/tools/swagger', + }, + migrate: { + icon: IconFileExport, + href: '/manage/tools/migrate', + }, }, }, help: { diff --git a/src/hooks/useSetSafeInterval.tsx b/src/hooks/useSetSafeInterval.tsx index 4bedbc15e36..f34a18da597 100644 --- a/src/hooks/useSetSafeInterval.tsx +++ b/src/hooks/useSetSafeInterval.tsx @@ -1,7 +1,7 @@ import { useEffect, useRef } from 'react'; export function useSetSafeInterval() { - const timers = useRef([]); + const timers = useRef([]); function setSafeInterval(callback: () => void, delay: number) { const newInterval = setInterval(callback, delay); diff --git a/src/pages/api/migrate.ts b/src/pages/api/migrate.ts new file mode 100644 index 00000000000..a3f9fbaca75 --- /dev/null +++ b/src/pages/api/migrate.ts @@ -0,0 +1,109 @@ +import AdmZip from 'adm-zip'; +import crypto, { randomBytes } from 'crypto'; +import { eq, isNotNull } from 'drizzle-orm'; +import fs from 'fs'; +import { NextApiRequest, NextApiResponse } from 'next'; +import { getServerAuthSession } from '~/server/auth'; +import { db } from '~/server/db'; +import { migrateTokens, users } from '~/server/db/schema'; +import { getConfig } from '~/tools/config/getConfig'; + +const handler = async (req: NextApiRequest, res: NextApiResponse) => { + const session = await getServerAuthSession({ req, res }); + if (!session) { + return res.status(401).end(); + } + + if (!session.user.isAdmin) { + return res.status(403).end('Not an admin'); + } + + const token = req.query.token; + + if (!token || Array.isArray(token)) { + return res.status(400).end(); + } + + const dbToken = await db.query.migrateTokens.findFirst({ + where: eq(migrateTokens.token, token), + }); + + if (!dbToken) { + return res.status(403).end('No db token'); + } + + if (dbToken.expires < new Date()) { + return res.status(403).end('Token expired'); + } + + const files = fs.readdirSync('./data/configs').filter((file) => file.endsWith('.json')); + + const zip = new AdmZip(); + + for (const file of files) { + const data = await getConfig(file.replace('.json', '')); + + const mappedApps = data.apps.map((app) => ({ + ...app, + integration: + app.integration && dbToken.integrations + ? { + ...app.integration, + properties: app.integration.properties.map((property) => ({ + ...property, + value: property.value ? encryptSecret(property.value, dbToken.token) : null, + })), + } + : null, + })); + + const content = JSON.stringify( + { + ...data, + apps: mappedApps, + }, + null, + 2 + ); + zip.addFile(file, Buffer.from(content, 'utf-8')); + } + + if (dbToken.users) { + // Only credentials users + const dbUsers = await db.query.users.findMany({ + with: { settings: true }, + where: isNotNull(users.password), + }); + const encryptedUsers = dbUsers.map((user) => ({ + ...user, + password: user.password ? encryptSecret(user.password, dbToken.token) : null, + salt: user.salt ? encryptSecret(user.salt, dbToken.token) : null, + })); + const content = JSON.stringify(encryptedUsers, null, 2); + zip.addFile('users/users.json', Buffer.from(content, 'utf-8')); + } + + if (dbToken.integrations || dbToken.users) { + const checksum = randomBytes(16).toString('hex'); + const encryptedChecksum = encryptSecret(checksum, dbToken.token); + const content = `${checksum}\n${encryptedChecksum}`; + zip.addFile('checksum.txt', Buffer.from(content, 'utf-8')); + } + + const zipBuffer = zip.toBuffer(); + res.setHeader('Content-Type', 'application/zip'); + res.setHeader('Content-Disposition', 'attachment; filename=migrate-homarr.zip'); + res.setHeader('Content-Length', zipBuffer.length.toString()); + res.status(200).end(zipBuffer); +}; + +export default handler; + +export function encryptSecret(text: string, encryptionKey: string): `${string}.${string}` { + const key = Buffer.from(encryptionKey, 'hex'); + const initializationVector = crypto.randomBytes(16); + const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key), initializationVector); + let encrypted = cipher.update(text); + encrypted = Buffer.concat([encrypted, cipher.final()]); + return `${encrypted.toString('hex')}.${initializationVector.toString('hex')}`; +} diff --git a/src/pages/manage/tools/migrate.tsx b/src/pages/manage/tools/migrate.tsx new file mode 100644 index 00000000000..1c0aaf85198 --- /dev/null +++ b/src/pages/manage/tools/migrate.tsx @@ -0,0 +1,154 @@ +import { + Alert, + Button, + Checkbox, + CopyButton, + Input, + Modal, + PasswordInput, + Stack, + Text, + Title, +} from '@mantine/core'; +import { GetServerSideProps } from 'next'; +import { useTranslation } from 'next-i18next'; +import Head from 'next/head'; +import { useState } from 'react'; +import { ManageLayout } from '~/components/layout/Templates/ManageLayout'; +import { getServerAuthSession } from '~/server/auth'; +import { getServerSideTranslations } from '~/tools/server/getServerSideTranslations'; +import { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder'; +import { api } from '~/utils/api'; + +/** + * 1. Send selected options to the server + * 2. Create a download token and send it back to the client + * 3. Client downloads the ZIP file + * 4. Client shows the encryption key in a modal + */ + +const ManagementPage = () => { + const { t } = useTranslation('manage/migrate'); + const metaTitle = `${t('metaTitle')} • Homarr`; + const { mutateAsync } = api.migrate.createToken.useMutation(); + const [options, setOptions] = useState({ + boards: true, + integrations: true, + users: true, + }); + const [token, setToken] = useState(null); + const [opened, setOpened] = useState(false); + const onClick = async () => { + await mutateAsync(options, { + onSuccess: (token) => { + // Download ZIP file + const link = document.createElement('a'); + const baseUrl = window.location.origin; + link.href = `${baseUrl}/api/migrate?token=${token}`; + link.download = 'migration.zip'; + link.click(); + + // Token is only needed when exporting users or integrations + if (options.users || options.integrations) { + setToken(token); + setOpened(true); + } + }, + }); + }; + + return ( + + + {metaTitle} + + + + {t('pageTitle')} + {t('description')} + + + {t('securityNote.text')} + + + + + + setOptions((prev) => ({ + ...prev, + boards: event.target.checked, + integrations: false, + })) + } + /> + + setOptions((prev) => ({ ...prev, integrations: event.target.checked })) + } + description={t('form.option.integrations.description')} + /> + setOptions((prev) => ({ ...prev, users: event.target.checked }))} + description={t('form.option.users.description')} + /> + + + + + + + setOpened(false)} title={t('modal.title')}> + {token && ( + + {t('modal.description')} + + + {({ copy }) => ( + + )} + + + )} + + + ); +}; + +export const getServerSideProps: GetServerSideProps = async (ctx) => { + const session = await getServerAuthSession(ctx); + + const result = checkForSessionOrAskForLogin(ctx, session, () => Boolean(session?.user.isAdmin)); + if (result) { + return result; + } + + const translations = await getServerSideTranslations( + ['layout/manage', 'manage/migrate'], + ctx.locale, + ctx.req, + ctx.res + ); + return { + props: { + ...translations, + }, + }; +}; + +export default ManagementPage; diff --git a/src/server/api/root.ts b/src/server/api/root.ts index 98f0ee68f55..2ce6cc1e4a0 100644 --- a/src/server/api/root.ts +++ b/src/server/api/root.ts @@ -1,3 +1,4 @@ +import { tdarrRouter } from '~/server/api/routers/tdarr'; import { createTRPCRouter } from '~/server/api/trpc'; import { appRouter } from './routers/app'; @@ -14,6 +15,7 @@ import { indexerManagerRouter } from './routers/indexer-manager'; import { inviteRouter } from './routers/invite/invite-router'; import { mediaRequestsRouter } from './routers/media-request'; import { mediaServerRouter } from './routers/media-server'; +import { migrateRouter } from './routers/migrate'; import { notebookRouter } from './routers/notebook'; import { overseerrRouter } from './routers/overseerr'; import { passwordRouter } from './routers/password'; @@ -22,7 +24,6 @@ import { smartHomeEntityStateRouter } from './routers/smart-home/entity-state'; import { usenetRouter } from './routers/usenet/router'; import { userRouter } from './routers/user'; import { weatherRouter } from './routers/weather'; -import { tdarrRouter } from '~/server/api/routers/tdarr'; /** * This is the primary router for your server. @@ -53,6 +54,7 @@ export const rootRouter = createTRPCRouter({ smartHomeEntityState: smartHomeEntityStateRouter, healthMonitoring: healthMonitoringRouter, tdarr: tdarrRouter, + migrate: migrateRouter, }); // export type definition of API diff --git a/src/server/api/routers/config.ts b/src/server/api/routers/config.ts index 6344a70ae2a..79926615096 100644 --- a/src/server/api/routers/config.ts +++ b/src/server/api/routers/config.ts @@ -23,7 +23,7 @@ export const configRouter = createTRPCRouter({ ) .output(z.object({ message: z.string() })) .mutation(async ({ input }) => { - if (input.name.toLowerCase() === 'default') { + if (input.name === 'default') { Consola.error("Rejected config deletion because default configuration can't be deleted"); throw new TRPCError({ code: 'FORBIDDEN', diff --git a/src/server/api/routers/migrate.ts b/src/server/api/routers/migrate.ts new file mode 100644 index 00000000000..b167d74688d --- /dev/null +++ b/src/server/api/routers/migrate.ts @@ -0,0 +1,26 @@ +import { randomBytes } from 'crypto'; +import dayjs from 'dayjs'; +import { v4 } from 'uuid'; +import { z } from 'zod'; +import { db } from '~/server/db'; +import { migrateTokens } from '~/server/db/schema'; + +import { adminProcedure, createTRPCRouter } from '../trpc'; + +export const migrateRouter = createTRPCRouter({ + createToken: adminProcedure + .input(z.object({ boards: z.boolean(), users: z.boolean(), integrations: z.boolean() })) + .mutation(async ({ input }) => { + const id = v4(); + const token = randomBytes(32).toString('hex'); + + await db.insert(migrateTokens).values({ + id, + token, + ...input, + expires: dayjs().add(5, 'minutes').toDate(), + }); + + return token; + }), +}); diff --git a/src/server/api/routers/notebook.ts b/src/server/api/routers/notebook.ts index e3f0339018b..c75a4e112a9 100644 --- a/src/server/api/routers/notebook.ts +++ b/src/server/api/routers/notebook.ts @@ -6,7 +6,7 @@ import { getConfig } from '~/tools/config/getConfig'; import { BackendConfigType } from '~/types/config'; import { INotebookWidget } from '~/widgets/notebook/NotebookWidgetTile'; -import { adminProcedure, createTRPCRouter, publicProcedure } from '../trpc'; +import { adminProcedure, createTRPCRouter } from '../trpc'; export const notebookRouter = createTRPCRouter({ update: adminProcedure diff --git a/src/server/db/schema.ts b/src/server/db/schema.ts index 9ee168d0599..4909723e6e9 100644 --- a/src/server/db/schema.ts +++ b/src/server/db/schema.ts @@ -109,6 +109,17 @@ export const invites = sqliteTable('invite', { export type Invite = InferSelectModel; +export const migrateTokens = sqliteTable('migrate_token', { + id: text('id').notNull().primaryKey(), + token: text('token').notNull().unique(), + boards: int('boards', { mode: 'boolean' }).notNull(), + users: int('users', { mode: 'boolean' }).notNull(), + integrations: int('integrations', { mode: 'boolean' }).notNull(), + expires: int('expires', { + mode: 'timestamp', + }).notNull(), +}); + export const accountRelations = relations(accounts, ({ one }) => ({ user: one(users, { fields: [accounts.userId], diff --git a/yarn.lock b/yarn.lock index f95bb243390..4a654fe0d4d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3509,13 +3509,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:18.17.8": - version: 18.17.8 - resolution: "@types/node@npm:18.17.8" - checksum: ebb71526368c9c58f03e2c2408bfda4aa686c13d84226e2c9b48d9c4aee244fb82e672aaf4aa8ccb6e4993b4274d5f4b2b3d52d0a2e57ab187ae653903376411 - languageName: node - linkType: hard - "@types/node@npm:^16.10.2": version: 16.18.61 resolution: "@types/node@npm:16.18.61" @@ -3532,6 +3525,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^20.6.0": + version: 20.17.6 + resolution: "@types/node@npm:20.17.6" + dependencies: + undici-types: ~6.19.2 + checksum: d51dbb9881c94d0310b32b5fd8013e3261595c61bc888fa27258469c93c3dc0b3c4d20a9f28f3f5f79562f6737e28e7f3dd04940dc8b4d966d34aaf318f7f69b + languageName: node + linkType: hard + "@types/object.omit@npm:^3.0.0": version: 3.0.3 resolution: "@types/object.omit@npm:3.0.3" @@ -7622,7 +7624,7 @@ __metadata: "@types/cookies": ^0.7.7 "@types/dockerode": ^3.3.9 "@types/ldapjs": ^3.0.2 - "@types/node": 18.17.8 + "@types/node": ^20.6.0 "@types/prismjs": ^1.26.0 "@types/react": ^18.2.11 "@types/swagger-ui-react": ^4.18.3 @@ -12567,6 +12569,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: de51f1b447d22571cf155dfe14ff6d12c5bdaec237c765085b439c38ca8518fc360e88c70f99469162bf2e14188a7b0bcb06e1ed2dc031042b984b0bb9544017 + languageName: node + linkType: hard + "undici@npm:^5.24.0": version: 5.28.2 resolution: "undici@npm:5.28.2"