From da7c1114384b895d894c681848ec4cd603fd4776 Mon Sep 17 00:00:00 2001 From: tuxsudo Date: Sat, 18 Nov 2023 14:42:47 +0000 Subject: [PATCH 01/28] Allow custom nextauth port (#1663) --- scripts/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/run.sh b/scripts/run.sh index ba017d05e..4623c6078 100644 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -1,7 +1,7 @@ #!/bin/sh echo "Exporting hostname..." -export NEXTAUTH_URL_INTERNAL="http://$HOSTNAME:7575" +export NEXTAUTH_URL_INTERNAL="http://$HOSTNAME:${PORT:-7575}" echo "Migrating database..." cd ./migrate; yarn db:migrate & PID=$! From 5aefd0962f8757a4357d015a4353a1f4a109eaa2 Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Sat, 18 Nov 2023 15:43:46 +0100 Subject: [PATCH 02/28] New Crowdin updates (#1641) --- public/locales/cn/common.json | 4 +- public/locales/cn/layout/modals/about.json | 2 +- public/locales/cr/common.json | 4 +- public/locales/cs/common.json | 4 +- .../locales/cs/modules/torrents-status.json | 2 +- public/locales/da/common.json | 4 +- public/locales/de/common.json | 4 +- public/locales/el/common.json | 4 +- public/locales/es/common.json | 4 +- public/locales/fr/common.json | 4 +- public/locales/he/common.json | 4 +- .../customization/page-appearance.json | 22 +++--- public/locales/he/tools/docker.json | 2 +- public/locales/hr/common.json | 4 +- public/locales/hu/common.json | 4 +- public/locales/it/common.json | 4 +- public/locales/ja/common.json | 4 +- public/locales/ko/common.json | 4 +- public/locales/lv/common.json | 4 +- public/locales/nl/common.json | 4 +- public/locales/no/common.json | 4 +- public/locales/pl/common.json | 4 +- public/locales/pt/common.json | 4 +- public/locales/pt/layout/modals/about.json | 8 +-- .../locales/pt/modules/dns-hole-summary.json | 4 +- public/locales/pt/modules/notebook.json | 72 +++++++++---------- public/locales/ru/common.json | 4 +- public/locales/sk/common.json | 4 +- public/locales/sl/common.json | 4 +- public/locales/sv/common.json | 4 +- public/locales/tr/common.json | 4 +- .../customization/page-appearance.json | 4 +- .../customization/shade-selector.json | 2 +- public/locales/tw/common.json | 4 +- public/locales/uk/common.json | 4 +- public/locales/vi/common.json | 4 +- 36 files changed, 140 insertions(+), 86 deletions(-) diff --git a/public/locales/cn/common.json b/public/locales/cn/common.json index 7115fbb72..13a736080 100644 --- a/public/locales/cn/common.json +++ b/public/locales/cn/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "宽度", "height": "高度" - } + }, + "public": "公开", + "restricted": "限制" } \ No newline at end of file diff --git a/public/locales/cn/layout/modals/about.json b/public/locales/cn/layout/modals/about.json index 7210ffadc..9e3c1673a 100644 --- a/public/locales/cn/layout/modals/about.json +++ b/public/locales/cn/layout/modals/about.json @@ -5,7 +5,7 @@ "key": "快捷键", "action": "操作", "keybinds": "热键绑定", - "translators": "翻译 ({{count}})", + "translators": "翻译者 ({{count}})", "translatorsDescription": "感谢这些人,Homarr 现已支持 {{languages}} 种语言!想要帮助将 Homarr 翻译成您的语言吗?请阅读此处了解如何执行此操作 。", "contributors": "贡献者 ({{count}})", "contributorsDescription": "这些人构建了让 homarr 工作的代码!想帮助建造 Homarr 吗?请阅读此处了解如何操作", diff --git a/public/locales/cr/common.json b/public/locales/cr/common.json index eaab4b3d9..32b5e93db 100644 --- a/public/locales/cr/common.json +++ b/public/locales/cr/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "crwdns3910:0crwdne3910:0", "height": "crwdns3912:0crwdne3912:0" - } + }, + "public": "crwdns4034:0crwdne4034:0", + "restricted": "crwdns4036:0crwdne4036:0" } \ No newline at end of file diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json index 065f41b13..814bcdbfa 100644 --- a/public/locales/cs/common.json +++ b/public/locales/cs/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "", "height": "" - } + }, + "public": "", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/cs/modules/torrents-status.json b/public/locales/cs/modules/torrents-status.json index 4d700fe75..af0834cb1 100644 --- a/public/locales/cs/modules/torrents-status.json +++ b/public/locales/cs/modules/torrents-status.json @@ -36,7 +36,7 @@ "footer": { "error": "", "lastUpdated": "Naposledy aktualizováno před {{time}}", - "ratioGlobal": "Globální poměr", + "ratioGlobal": "Obecný poměr", "ratioWithFilter": "Filtrovaný poměr" }, "table": { diff --git a/public/locales/da/common.json b/public/locales/da/common.json index 7cb274d47..af6f64a58 100644 --- a/public/locales/da/common.json +++ b/public/locales/da/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Bredde", "height": "Højde" - } + }, + "public": "Offentlig", + "restricted": "Begrænset" } \ No newline at end of file diff --git a/public/locales/de/common.json b/public/locales/de/common.json index a43767043..1d4f442ab 100644 --- a/public/locales/de/common.json +++ b/public/locales/de/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Breite", "height": "Höhe" - } + }, + "public": "Öffentlich sichtbar", + "restricted": "Eingeschränkt" } \ No newline at end of file diff --git a/public/locales/el/common.json b/public/locales/el/common.json index 3f3b132c9..e05f3c470 100644 --- a/public/locales/el/common.json +++ b/public/locales/el/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Πλάτος", "height": "Ύψος" - } + }, + "public": "Δημόσιο", + "restricted": "Περιορισμένη πρόσβαση" } \ No newline at end of file diff --git a/public/locales/es/common.json b/public/locales/es/common.json index 4dff3f768..6a2ffe27e 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Ancho", "height": "Alto" - } + }, + "public": "Pública", + "restricted": "Restringido" } \ No newline at end of file diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index 2260ecdf9..fe57b1204 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Largeur", "height": "Hauteur" - } + }, + "public": "Public", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/he/common.json b/public/locales/he/common.json index 735b7eead..81f1f1869 100644 --- a/public/locales/he/common.json +++ b/public/locales/he/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "רוחב", "height": "גובה" - } + }, + "public": "ציבורי", + "restricted": "מוגבל" } \ No newline at end of file diff --git a/public/locales/he/settings/customization/page-appearance.json b/public/locales/he/settings/customization/page-appearance.json index 70d34cfad..8a843849e 100644 --- a/public/locales/he/settings/customization/page-appearance.json +++ b/public/locales/he/settings/customization/page-appearance.json @@ -19,26 +19,26 @@ "label": "רקע" }, "backgroundImageAttachment": { - "label": "", + "label": "צירוף תמונת רקע", "options": { - "fixed": "", - "scroll": "" + "fixed": "קבוע - הרקע נשאר באותו מיקום (מומלץ)", + "scroll": "גלילה - גלילה ברקע עם העכבר" } }, "backgroundImageSize": { - "label": "", + "label": "גודל תמונת רקע", "options": { - "cover": "", - "contain": "" + "cover": "כיסוי - קנה מידה קטן ככל האפשר של התמונה כדי לכסות את כל החלון על ידי חיתוך שטח מוגזם. (מוּמלָץ)", + "contain": "מכיל - קנה מידה גדול ככל האפשר של התמונה בתוך המיכל שלה מבלי לחתוך או למתוח את התמונה." } }, "backgroundImageRepeat": { - "label": "", + "label": "צירוף תמונת רקע", "options": { - "repeat": "", - "no-repeat": "", - "repeat-x": "", - "repeat-y": "" + "repeat": "חזור - התמונה חוזרת על עצמה ככל שנדרש כדי לכסות את כל אזור ציור תמונת הרקע.", + "no-repeat": "ללא חזרה - התמונה אינה חוזרת על עצמה וייתכן שלא תמלא את כל החלל (מומלץ)", + "repeat-x": "חזור X - זהה ל'חזרה' אבל רק על הציר האופקי.", + "repeat-y": "חזור Y - זהה ל'חזרה' אבל רק על הציר האנכי." } }, "customCSS": { diff --git a/public/locales/he/tools/docker.json b/public/locales/he/tools/docker.json index 3affb1371..c2ef87e55 100644 --- a/public/locales/he/tools/docker.json +++ b/public/locales/he/tools/docker.json @@ -2,7 +2,7 @@ "title": "דוקר", "alerts": { "notConfigured": { - "text": "" + "text": "למופע ה-Homarr שלך לא הוגדר Docker או שהוא נכשל באחזור קונטיינרים. אנא עיין בתיעוד כיצד להגדיר את האינטגרציה." } }, "modals": { diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json index 83bca3a24..ae1523ab8 100644 --- a/public/locales/hr/common.json +++ b/public/locales/hr/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Širina", "height": "Visina" - } + }, + "public": "Javno", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json index 95f6d9eb4..8bb6ce7ed 100644 --- a/public/locales/hu/common.json +++ b/public/locales/hu/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Szélesség", "height": "Magasság" - } + }, + "public": "Nyilvános", + "restricted": "Korlátozott" } \ No newline at end of file diff --git a/public/locales/it/common.json b/public/locales/it/common.json index 409e5d444..1073a2306 100644 --- a/public/locales/it/common.json +++ b/public/locales/it/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Larghezza", "height": "Altezza" - } + }, + "public": "Pubblico", + "restricted": "Limitato" } \ No newline at end of file diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json index ed31ad643..0f6284982 100644 --- a/public/locales/ja/common.json +++ b/public/locales/ja/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "幅", "height": "高さ" - } + }, + "public": "公開", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/ko/common.json b/public/locales/ko/common.json index 387c33c16..3d4508036 100644 --- a/public/locales/ko/common.json +++ b/public/locales/ko/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "너비", "height": "높이" - } + }, + "public": "공개", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/lv/common.json b/public/locales/lv/common.json index 3b7787e17..97911405f 100644 --- a/public/locales/lv/common.json +++ b/public/locales/lv/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Platums", "height": "Augstums" - } + }, + "public": "Publisks", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json index 28b0288a2..200c27260 100644 --- a/public/locales/nl/common.json +++ b/public/locales/nl/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Breedte", "height": "Hoogte" - } + }, + "public": "Openbaar", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/no/common.json b/public/locales/no/common.json index 1fc22fd99..e8c70c589 100644 --- a/public/locales/no/common.json +++ b/public/locales/no/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Bredde", "height": "Høyde" - } + }, + "public": "Offentlig", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json index fe14bc03d..b4fee4d41 100644 --- a/public/locales/pl/common.json +++ b/public/locales/pl/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Szerokość", "height": "Wysokość" - } + }, + "public": "Publiczna", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json index 8ca0efcd8..41ce82808 100644 --- a/public/locales/pt/common.json +++ b/public/locales/pt/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Largura", "height": "Altura" - } + }, + "public": "Público", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/pt/layout/modals/about.json b/public/locales/pt/layout/modals/about.json index 471f0a8d0..ade865ce1 100644 --- a/public/locales/pt/layout/modals/about.json +++ b/public/locales/pt/layout/modals/about.json @@ -5,10 +5,10 @@ "key": "Tecla de atalho", "action": "Ação", "keybinds": "Ligações de teclas", - "translators": "", - "translatorsDescription": "", - "contributors": "", - "contributorsDescription": "", + "translators": "Tradutores ({{count}})", + "translatorsDescription": "Graças a essas pessoas, o Homarr está disponível em {{languages}} idiomas! Quer ajudar a traduzir o Homarr para seu idioma? Veja como fazer isso aqui.", + "contributors": "Colaboradores ({{count}})", + "contributorsDescription": "Essas pessoas criaram o código que faz o homarr funcionar! Quer ajudar a construir o Homarr? Veja como fazer isso aqui", "actions": { "toggleTheme": "Alternar o modo claro/escuro", "focusSearchBar": "Foco na barra de pesquisa", diff --git a/public/locales/pt/modules/dns-hole-summary.json b/public/locales/pt/modules/dns-hole-summary.json index b6fde0d77..075ce5239 100644 --- a/public/locales/pt/modules/dns-hole-summary.json +++ b/public/locales/pt/modules/dns-hole-summary.json @@ -21,8 +21,8 @@ "metrics": { "domainsOnAdlist": "Domínios em adlists", "queriesToday": "Consultas hoje", - "queriesBlockedTodayPercentage": "", - "queriesBlockedToday": "" + "queriesBlockedTodayPercentage": "Bloqueado hoje", + "queriesBlockedToday": "Bloqueado hoje" } } } diff --git a/public/locales/pt/modules/notebook.json b/public/locales/pt/modules/notebook.json index a48a95c33..41de25796 100644 --- a/public/locales/pt/modules/notebook.json +++ b/public/locales/pt/modules/notebook.json @@ -8,7 +8,7 @@ "label": "Mostrar a barra de ferramentas para ajudá-lo a escrever markdown" }, "allowReadOnlyCheck": { - "label": "" + "label": "Permitir a verificação no modo de leitura" }, "content": { "label": "O conteúdo do notebook" @@ -17,43 +17,43 @@ }, "card": { "controls": { - "bold": "", - "italic": "", - "strikethrough": "", - "underline": "", - "colorText": "", - "colorHighlight": "", - "code": "", - "clear": "", - "heading": "", - "align": "", - "blockquote": "", - "horizontalLine": "", - "bulletList": "", - "orderedList": "", - "checkList": "", - "increaseIndent": "", - "decreaseIndent": "", - "link": "", - "unlink": "", - "image": "", - "addTable": "", - "deleteTable": "", - "colorCell": "", - "mergeCell": "", - "addColumnLeft": "", - "addColumnRight": "", - "deleteColumn": "", - "addRowTop": "", - "addRowBelow": "", - "deleteRow": "" + "bold": "Negrito", + "italic": "Itálico", + "strikethrough": "Riscar", + "underline": "Sublinhar", + "colorText": "Cor do texto", + "colorHighlight": "Texto colorido em destaque", + "code": "Código", + "clear": "Limpar formatação", + "heading": "Cabeçalho {{level}}", + "align": "Alinhar texto: {{position}}", + "blockquote": "Bloco de Citação", + "horizontalLine": "Linha horizontal", + "bulletList": "Lista de marcadores", + "orderedList": "Lista ordenada", + "checkList": "Lista de verificação", + "increaseIndent": "Aumentar recuo", + "decreaseIndent": "Diminuir recuo", + "link": "Link", + "unlink": "Remover link", + "image": "Incorporar imagem", + "addTable": "Adicionar tabela", + "deleteTable": "Excluir tabela", + "colorCell": "Cor da Célula", + "mergeCell": "Ativar/desativar mesclagem de células", + "addColumnLeft": "Adicionar coluna antes", + "addColumnRight": "Adicionar coluna depois", + "deleteColumn": "Excluir coluna", + "addRowTop": "Adicionar linha antes", + "addRowBelow": "Adicionar linha depois", + "deleteRow": "Excluir linha" }, "modals": { - "clearColor": "", - "source": "", - "widthPlaceholder": "", - "columns": "", - "rows": "" + "clearColor": "Limpar cor", + "source": "Fonte", + "widthPlaceholder": "Valor em % ou pixels", + "columns": "Colunas", + "rows": "Linhas" } } } \ No newline at end of file diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index 182197bbd..2bdeb1d73 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Ширина", "height": "Высота" - } + }, + "public": "Публичный", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json index 86fc75c7a..d44fa489e 100644 --- a/public/locales/sk/common.json +++ b/public/locales/sk/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Šírka", "height": "Výška" - } + }, + "public": "Verejné", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/sl/common.json b/public/locales/sl/common.json index 453f0a86d..a7955df42 100644 --- a/public/locales/sl/common.json +++ b/public/locales/sl/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Širina", "height": "Višina" - } + }, + "public": "Javna stran", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json index 1abe2496b..7f1ac4da8 100644 --- a/public/locales/sv/common.json +++ b/public/locales/sv/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Bredd", "height": "Höjd" - } + }, + "public": "Publik", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json index b5a11df3b..f6637c055 100644 --- a/public/locales/tr/common.json +++ b/public/locales/tr/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Genişlik", "height": "Yükseklik" - } + }, + "public": "Herkese açık", + "restricted": "Sınırlı" } \ No newline at end of file diff --git a/public/locales/tr/settings/customization/page-appearance.json b/public/locales/tr/settings/customization/page-appearance.json index 768963087..da824cb33 100644 --- a/public/locales/tr/settings/customization/page-appearance.json +++ b/public/locales/tr/settings/customization/page-appearance.json @@ -21,7 +21,7 @@ "backgroundImageAttachment": { "label": "Arkaplan resim ekle", "options": { - "fixed": "Düzeltildi - Arka plan aynı konumda kalıyor (tavsiye edilen)", + "fixed": "Sabit - Arka plan aynı konumda kalır (önerilir)", "scroll": "Kaydırma - Arka plan farenizle kaydırılır" } }, @@ -36,7 +36,7 @@ "label": "Arkaplan resim ekle", "options": { "repeat": "Tekrarla - Resim, arka plan görüntü alanının tamamını kapsayacak şekilde gerektiği kadar tekrarlanır.", - "no-repeat": "", + "no-repeat": "Tekrarsız - Resim tekrarlanmaz ve tüm alanı doldurmayabilir (önerilir)", "repeat-x": "Tekrarla X - 'Tekrarla' ile aynıdır ancak yalnızca yatay eksende.", "repeat-y": "Tekrar Y - 'Tekrarla' ile aynıdır, ancak yalnızca dikey eksende." } diff --git a/public/locales/tr/settings/customization/shade-selector.json b/public/locales/tr/settings/customization/shade-selector.json index 97c5e820b..f983c3e62 100644 --- a/public/locales/tr/settings/customization/shade-selector.json +++ b/public/locales/tr/settings/customization/shade-selector.json @@ -1,3 +1,3 @@ { - "label": "Gölge" + "label": "Gölge " } \ No newline at end of file diff --git a/public/locales/tw/common.json b/public/locales/tw/common.json index c9c722329..9c5236d49 100644 --- a/public/locales/tw/common.json +++ b/public/locales/tw/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "寬度", "height": "高度" - } + }, + "public": "公開", + "restricted": "受到限制" } \ No newline at end of file diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json index 3b0e1e56f..e4143d0fc 100644 --- a/public/locales/uk/common.json +++ b/public/locales/uk/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Ширина", "height": "Висота" - } + }, + "public": "Публічний", + "restricted": "" } \ No newline at end of file diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json index c37ea6b9d..33ff8cfbd 100644 --- a/public/locales/vi/common.json +++ b/public/locales/vi/common.json @@ -51,5 +51,7 @@ "attributes": { "width": "Chiều rộng", "height": "Chiều cao" - } + }, + "public": "Công khai", + "restricted": "" } \ No newline at end of file From eadfa4a10ffa2702a723b5fb43bf49fc5ef6ef55 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Sat, 18 Nov 2023 22:11:29 +0100 Subject: [PATCH 03/28] =?UTF-8?q?=E2=9C=A8=20Add=20support=20for=20install?= =?UTF-8?q?ation=20in=20address=20bar=20(#1675)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/site.webmanifest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/site.webmanifest b/public/site.webmanifest index 96dae66d5..cb12a1e1b 100644 --- a/public/site.webmanifest +++ b/public/site.webmanifest @@ -1,4 +1,6 @@ { + "name": "Homarr", + "start_url": "/", "display": "standalone", "icons": [ { From fe63c03372b20da00c0d65ce722b2e438540b1e6 Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Tue, 21 Nov 2023 18:33:18 +0100 Subject: [PATCH 04/28] =?UTF-8?q?=F0=9F=8C=90=20New=20Crowdin=20updates=20?= =?UTF-8?q?(#1682)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/locales/fr/common.json | 2 +- public/locales/pl/common.json | 6 ++--- public/locales/pl/layout/modals/add-app.json | 10 ++++----- public/locales/pl/modules/calendar.json | 2 +- public/locales/pl/modules/dashdot.json | 4 ++-- public/locales/pl/modules/notebook.json | 4 ++-- .../locales/pl/modules/torrents-status.json | 4 ++-- .../customization/page-appearance.json | 22 +++++++++---------- public/locales/pl/tools/docker.json | 2 +- 9 files changed, 28 insertions(+), 28 deletions(-) diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index fe57b1204..868684af7 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -53,5 +53,5 @@ "height": "Hauteur" }, "public": "Public", - "restricted": "" + "restricted": "Restreint" } \ No newline at end of file diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json index b4fee4d41..18e17c952 100644 --- a/public/locales/pl/common.json +++ b/public/locales/pl/common.json @@ -1,7 +1,7 @@ { "save": "Zapisz", "apply": "Zastosuj", - "insert": "", + "insert": "Wstaw", "about": "O programie", "cancel": "Anuluj", "close": "Zamknij", @@ -45,7 +45,7 @@ "seeMore": "Zobacz więcej...", "position": { "left": "Lewo", - "center": "", + "center": "Wyśrodkowany", "right": "Prawo" }, "attributes": { @@ -53,5 +53,5 @@ "height": "Wysokość" }, "public": "Publiczna", - "restricted": "" + "restricted": "Ograniczone" } \ No newline at end of file diff --git a/public/locales/pl/layout/modals/add-app.json b/public/locales/pl/layout/modals/add-app.json index 841cb2881..79445aae3 100644 --- a/public/locales/pl/layout/modals/add-app.json +++ b/public/locales/pl/layout/modals/add-app.json @@ -20,11 +20,11 @@ "lines": { "nothingAfterPort": "W większości, jeśli nie we wszystkich przypadkach, nie należy wprowadzać żadnej ścieżki po porcie. (Nawet '/admin' dla pihole lub '/web' dla plex)", "protocolCheck": "Zawsze upewnij się, że adres URL jest poprzedzony przez http lub https, i upewnij się, że używasz odpowiedniego adresu.", - "preferIP": "", - "enablePings": "", - "wget": "", - "iframe": "", - "clearCache": "" + "preferIP": "Zalecane jest użycie bezpośredniego adresu IP maszyny lub kontenera, z którym próbujesz się komunikować.", + "enablePings": "Sprawdź, czy adres IP jest prawidłowy, włączając polecenia ping. Dostosuj tablicę -> Układ -> Włącz pingi. Na kafelkach aplikacji pojawi się mała czerwona lub zielona dymka, a najechanie na nią spowoduje wyświetlenie kodu odpowiedzi (w większości przypadków oczekiwana jest zielona dymka z kodem 200).", + "wget": "Aby mieć pewność, że homarr będzie mógł komunikować się z innymi aplikacjami, wykonaj wget/curl/ping IP:port aplikacji.", + "iframe": "Jeśli chodzi o ramki iframe, powinny one zawsze używać tego samego protokołu (http/s), co Homarr.", + "clearCache": "Niektóre informacje są rejestrowane w pamięci podręcznej, więc integracja może nie działać, jeśli nie wyczyścisz pamięci podręcznej w ogólnych opcjach Homarr." }, "footer": "Aby uzyskać więcej informacji na temat rozwiązywania problemów, skontaktuj się z nami na naszym {{discord}}." } diff --git a/public/locales/pl/modules/calendar.json b/public/locales/pl/modules/calendar.json index e3ba8e24a..7cbf4cf41 100644 --- a/public/locales/pl/modules/calendar.json +++ b/public/locales/pl/modules/calendar.json @@ -3,7 +3,7 @@ "name": "Kalendarz", "description": "Wyświetla kalendarz z nadchodzącymi wydaniami, z obsługiwanych integracji.", "settings": { - "title": "Ustawienia dla widżetu Kalendarz", + "title": "Ustawienia dla widżetu Kalendarza", "radarrReleaseType": { "label": "Rodzaj premiery w Radarr", "data": { diff --git a/public/locales/pl/modules/dashdot.json b/public/locales/pl/modules/dashdot.json index 3deca86e3..93f560112 100644 --- a/public/locales/pl/modules/dashdot.json +++ b/public/locales/pl/modules/dashdot.json @@ -1,6 +1,6 @@ { "descriptor": { - "name": "Dash.", + "name": "Dach.", "description": "Wyświetla wykresy zewnętrznego Dash. Instancja wewnątrz Homarr.", "settings": { "title": "Ustawienia dla widgetu Dash.", @@ -82,7 +82,7 @@ } }, "card": { - "title": "Dash.", + "title": "Dach.", "errors": { "noService": "Nie znaleziono usługi Dash. Proszę dodać ją do pulpitu Homarra lub ustawić adres URL usługi Dash. w opcjach modułu", "noInformation": "Nie można uzyskać informacji z dash. - używasz najnowszej wersji?", diff --git a/public/locales/pl/modules/notebook.json b/public/locales/pl/modules/notebook.json index 84b043ebb..e800018db 100644 --- a/public/locales/pl/modules/notebook.json +++ b/public/locales/pl/modules/notebook.json @@ -8,7 +8,7 @@ "label": "Pokaż pasek narzędzi ułatwiający pisanie w markdown" }, "allowReadOnlyCheck": { - "label": "" + "label": "Zezwalaj na sprawdzanie w trybie tylko do odczytu" }, "content": { "label": "Zawartość notatnika" @@ -39,7 +39,7 @@ "image": "Osadź obraz", "addTable": "Dodaj tabelę", "deleteTable": "Usuń tabelę", - "colorCell": "", + "colorCell": "Kolor Komórki", "mergeCell": "Przełączanie scalania komórek", "addColumnLeft": "Dodaj kolumnę przed", "addColumnRight": "Dodaj kolumnę po", diff --git a/public/locales/pl/modules/torrents-status.json b/public/locales/pl/modules/torrents-status.json index e21bbb299..324001ae2 100644 --- a/public/locales/pl/modules/torrents-status.json +++ b/public/locales/pl/modules/torrents-status.json @@ -11,10 +11,10 @@ "label": "Wyświetlanie ukończonych torrentów" }, "displayActiveTorrents": { - "label": "" + "label": "Wyświetl aktywne torrenty" }, "speedLimitOfActiveTorrents": { - "label": "" + "label": "Prędkość wysyłania pozwalająca uznać torrent za aktywny (kB/s)" }, "displayStaleTorrents": { "label": "Wyświetlanie nieaktualnych torrentów" diff --git a/public/locales/pl/settings/customization/page-appearance.json b/public/locales/pl/settings/customization/page-appearance.json index 4cdb44fa8..eb91bd053 100644 --- a/public/locales/pl/settings/customization/page-appearance.json +++ b/public/locales/pl/settings/customization/page-appearance.json @@ -19,26 +19,26 @@ "label": "Tło" }, "backgroundImageAttachment": { - "label": "", + "label": "Ustawienie obrazu tła", "options": { - "fixed": "", - "scroll": "" + "fixed": "Fixed – Tło pozostaje w tej samej pozycji (zalecane)", + "scroll": "Scroll - Tło przewija się za pomocą myszy" } }, "backgroundImageSize": { - "label": "", + "label": "Rozmiar obrazu tła", "options": { - "cover": "", - "contain": "" + "cover": "Cover — skaluje obraz do najmniejszego możliwego rozmiaru, aby pokryć całe okno poprzez przycięcie nadmiernej przestrzeni. (Zalecana)", + "contain": "Contain — skaluje obraz do największego możliwego rozmiaru w jego kontenerze, bez przycinania i rozciągania obrazu." } }, "backgroundImageRepeat": { - "label": "", + "label": "Ustawienie obrazu tła", "options": { - "repeat": "", - "no-repeat": "", - "repeat-x": "", - "repeat-y": "" + "repeat": "Repeat — obraz jest powtarzany tak często, jak to konieczne, aby pokryć cały obszar obrazu tła.", + "no-repeat": "No repeat — obraz nie jest powtarzany i może nie wypełniać całej przestrzeni (zalecane)", + "repeat-x": "Repeat X — to samo co „Powtórz”, ale tylko na osi poziomej.", + "repeat-y": "Repeat Y — to samo co „Powtórz”, ale tylko w osi pionowej." } }, "customCSS": { diff --git a/public/locales/pl/tools/docker.json b/public/locales/pl/tools/docker.json index 5eccbe96a..af1ad0e11 100644 --- a/public/locales/pl/tools/docker.json +++ b/public/locales/pl/tools/docker.json @@ -2,7 +2,7 @@ "title": "Docker", "alerts": { "notConfigured": { - "text": "" + "text": "Twoja instancja Homarr nie ma skonfigurowanego Dockera lub nie była w stanie pobrać listę kontenerów. Sprawdź dokumentację, aby dowiedzieć się, jak skonfigurować integrację." } }, "modals": { From 5a8a378a2ecddef31d20f1ed6092d936d92ab05f Mon Sep 17 00:00:00 2001 From: Tagaishi Date: Tue, 21 Nov 2023 18:34:01 +0100 Subject: [PATCH 05/28] =?UTF-8?q?=F0=9F=90=9B=20Affix=20overlapping=20cust?= =?UTF-8?q?om=20CSS=20box=20(#1687)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/board/[slug]/customize.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/board/[slug]/customize.tsx b/src/pages/board/[slug]/customize.tsx index a83ecf33c..5234f9d84 100644 --- a/src/pages/board/[slug]/customize.tsx +++ b/src/pages/board/[slug]/customize.tsx @@ -229,7 +229,7 @@ export default function CustomizationPage({ )} - + From 7f46fafbb94c1f08a73ff440f8aafea7ba2f00f5 Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Thu, 23 Nov 2023 21:43:18 +0100 Subject: [PATCH 06/28] =?UTF-8?q?=F0=9F=8C=90=20New=20Crowdin=20updates=20?= =?UTF-8?q?(#1692)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/locales/pt/common.json | 8 +++---- .../locales/pt/modules/torrents-status.json | 12 +++++----- .../pt/settings/customization/general.json | 2 +- .../customization/page-appearance.json | 22 +++++++++---------- public/locales/pt/tools/docker.json | 6 ++--- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json index 41ce82808..da2117089 100644 --- a/public/locales/pt/common.json +++ b/public/locales/pt/common.json @@ -1,7 +1,7 @@ { "save": "Salvar", - "apply": "", - "insert": "", + "apply": "Aplicar", + "insert": "Inserir", "about": "Sobre", "cancel": "Cancelar", "close": "Fechar", @@ -45,7 +45,7 @@ "seeMore": "Veja mais...", "position": { "left": "Esquerda", - "center": "", + "center": "Centralizado", "right": "Certo" }, "attributes": { @@ -53,5 +53,5 @@ "height": "Altura" }, "public": "Público", - "restricted": "" + "restricted": "Restrito" } \ No newline at end of file diff --git a/public/locales/pt/modules/torrents-status.json b/public/locales/pt/modules/torrents-status.json index 8089d44ba..6c1fab563 100644 --- a/public/locales/pt/modules/torrents-status.json +++ b/public/locales/pt/modules/torrents-status.json @@ -11,10 +11,10 @@ "label": "Mostrar torrentes completas" }, "displayActiveTorrents": { - "label": "" + "label": "Exibir torrents ativos" }, "speedLimitOfActiveTorrents": { - "label": "" + "label": "Velocidade de upload para considerar um torrent como ativo (kB/s)" }, "displayStaleTorrents": { "label": "Exibição de torrentes envelhecidas" @@ -27,8 +27,8 @@ "description": "Quando a opção \"is whitelist\" estiver marcada, ela funcionará como uma lista de permissões. Se não estiver marcada, será uma lista negra. Não fará nada quando estiver vazia" }, "displayRatioWithFilter": { - "label": "", - "info": "" + "label": "Exibir proporção da lista de torrents filtrados", + "info": "Se estiver desativado, somente a proporção global será exibida. A proporção global ainda usará os rótulos se estiver definida" } } }, @@ -36,8 +36,8 @@ "footer": { "error": "Erro", "lastUpdated": "Última actualização {{time}} atrás", - "ratioGlobal": "", - "ratioWithFilter": "" + "ratioGlobal": "Proporção global", + "ratioWithFilter": "Proporção com filtro" }, "table": { "header": { diff --git a/public/locales/pt/settings/customization/general.json b/public/locales/pt/settings/customization/general.json index 80053d146..f2a5ab396 100644 --- a/public/locales/pt/settings/customization/general.json +++ b/public/locales/pt/settings/customization/general.json @@ -22,7 +22,7 @@ "description": "Configure o Homarr para usuários com deficiência ou incapacitados" }, "access": { - "name": "", + "name": "Acesso", "description": "Configure quem tem acesso ao seu quadro" } } diff --git a/public/locales/pt/settings/customization/page-appearance.json b/public/locales/pt/settings/customization/page-appearance.json index 8f8a32ec9..66581d72c 100644 --- a/public/locales/pt/settings/customization/page-appearance.json +++ b/public/locales/pt/settings/customization/page-appearance.json @@ -19,26 +19,26 @@ "label": "Antecedentes" }, "backgroundImageAttachment": { - "label": "", + "label": "Anexo de imagem de fundo", "options": { - "fixed": "", - "scroll": "" + "fixed": "Fixado - O plano de fundo permanece na mesma posição (recomendado)", + "scroll": "Rolagem - O plano de fundo rola com seu mouse" } }, "backgroundImageSize": { - "label": "", + "label": "Tamanho da imagem de fundo", "options": { - "cover": "", - "contain": "" + "cover": "Capa - Dimensiona a imagem o menor possível para cobrir toda a janela cortando o espaço excessivo. (recomendado)", + "contain": "Conter - Dimensiona a imagem o máximo possível dentro de seu contêiner, sem cortar ou esticar a imagem." } }, "backgroundImageRepeat": { - "label": "", + "label": "Anexo de imagem de fundo", "options": { - "repeat": "", - "no-repeat": "", - "repeat-x": "", - "repeat-y": "" + "repeat": "Repetir - A imagem é repetida o quanto for necessário para cobrir toda a área de pintura da imagem de fundo.", + "no-repeat": "Sem repetição - A imagem não se repete e pode não preencher todo o espaço (recomendado)", + "repeat-x": "Repetir X - O mesmo que 'Repetir', mas apenas no eixo horizontal.", + "repeat-y": "Repetir Y - O mesmo que 'Repetir', mas apenas no eixo vertical." } }, "customCSS": { diff --git a/public/locales/pt/tools/docker.json b/public/locales/pt/tools/docker.json index b81fe732e..7e080aceb 100644 --- a/public/locales/pt/tools/docker.json +++ b/public/locales/pt/tools/docker.json @@ -2,16 +2,16 @@ "title": "Docker", "alerts": { "notConfigured": { - "text": "" + "text": "Sua instância do Homarr não possui o Docker configurado ou falhou em buscar contêineres. Por favor, verifique a documentação sobre como configurar a integração." } }, "modals": { "selectBoard": { - "title": "Escolha uma placa", + "title": "Escolha um quadro", "text": "Escolha o quadro em que deseja adicionar os aplicativos para os contêineres do Docker selecionados.", "form": { "board": { - "label": "Diretoria" + "label": "Quadro" }, "submit": "Adicionar aplicativos" } From 312e2c8297e5daf521ca7088a37293b001fa37e2 Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Thu, 23 Nov 2023 21:44:05 +0100 Subject: [PATCH 07/28] =?UTF-8?q?=E2=9C=A8=20#698=20homeassistant=20widget?= =?UTF-8?q?=20(#1658)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- .../en/modules/smart-home/entity-state.json | 17 ++++ .../InputElements/IntegrationSelector.tsx | 5 + src/server/api/root.ts | 3 +- .../api/routers/smart-home/entity-state.ts | 53 ++++++++++ .../server/sdk/homeassistant/HomeAssistant.ts | 41 ++++++++ .../sdk/homeassistant/models/EntityState.ts | 12 +++ src/tools/server/translation-namespaces.ts | 1 + src/tools/shared/strings.ts | 6 ++ src/tools/singleton/HomeAssistantSingleton.ts | 20 ++++ src/types/app.ts | 5 +- src/widgets/index.ts | 2 + .../entity-state/entity-state.widget.tsx | 97 +++++++++++++++++++ 13 files changed, 261 insertions(+), 3 deletions(-) create mode 100644 public/locales/en/modules/smart-home/entity-state.json create mode 100644 src/server/api/routers/smart-home/entity-state.ts create mode 100644 src/tools/server/sdk/homeassistant/HomeAssistant.ts create mode 100644 src/tools/server/sdk/homeassistant/models/EntityState.ts create mode 100644 src/tools/singleton/HomeAssistantSingleton.ts create mode 100644 src/widgets/smart-home/entity-state/entity-state.widget.tsx diff --git a/package.json b/package.json index 3724f70c2..7fbaf9707 100644 --- a/package.json +++ b/package.json @@ -233,4 +233,4 @@ ] } } -} \ No newline at end of file +} diff --git a/public/locales/en/modules/smart-home/entity-state.json b/public/locales/en/modules/smart-home/entity-state.json new file mode 100644 index 000000000..e477757df --- /dev/null +++ b/public/locales/en/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "Entity not found", + "descriptor": { + "name": "Home Assistant entity", + "description": "Current state of an entity in Home Assistant", + "settings": { + "title": "Entity state", + "entityId": { + "label": "Entity ID", + "info": "Unique entity ID in Home Assistant. Copy by clicking on entity > Click on cog icon > Click on copy button at 'Entity ID'. Some custom entities may not be supported." + }, + "displayName": { + "label": "Display name" + } + } + } +} \ No newline at end of file diff --git a/src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/IntegrationSelector.tsx b/src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/IntegrationSelector.tsx index 632a2cefa..eb021a94c 100644 --- a/src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/IntegrationSelector.tsx +++ b/src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/IntegrationSelector.tsx @@ -183,4 +183,9 @@ export const availableIntegrations = [ image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/adguard-home.png', label: 'AdGuard Home', }, + { + value: 'homeAssistant', + image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/home-assistant.png', + label: 'Home Assistant' + } ] as const satisfies Readonly; diff --git a/src/server/api/root.ts b/src/server/api/root.ts index 23ddd6044..f6aed4aac 100644 --- a/src/server/api/root.ts +++ b/src/server/api/root.ts @@ -1,5 +1,4 @@ import { createTRPCRouter } from '~/server/api/trpc'; - import { appRouter } from './routers/app'; import { boardRouter } from './routers/board'; import { calendarRouter } from './routers/calendar'; @@ -16,6 +15,7 @@ import { notebookRouter } from './routers/notebook'; import { overseerrRouter } from './routers/overseerr'; import { passwordRouter } from './routers/password'; import { rssRouter } from './routers/rss'; +import { smartHomeEntityStateRouter } from './routers/smart-home/entity-state'; import { timezoneRouter } from './routers/timezone'; import { usenetRouter } from './routers/usenet/router'; import { userRouter } from './routers/user'; @@ -47,6 +47,7 @@ export const rootRouter = createTRPCRouter({ boards: boardRouter, password: passwordRouter, notebook: notebookRouter, + smartHomeEntityState: smartHomeEntityStateRouter }); // export type definition of API diff --git a/src/server/api/routers/smart-home/entity-state.ts b/src/server/api/routers/smart-home/entity-state.ts new file mode 100644 index 000000000..b977bcb11 --- /dev/null +++ b/src/server/api/routers/smart-home/entity-state.ts @@ -0,0 +1,53 @@ +import { TRPCError } from '@trpc/server'; + +import { ZodError, z } from 'zod'; + + +import { createTRPCRouter, protectedProcedure } from '../../trpc'; + +import { findAppProperty } from '~/tools/client/app-properties'; +import { getConfig } from '~/tools/config/getConfig'; +import { HomeAssistantSingleton } from '~/tools/singleton/HomeAssistantSingleton'; + +export const smartHomeEntityStateRouter = createTRPCRouter({ + retrieveStatus: protectedProcedure + .input( + z.object({ + configName: z.string(), + entityId: z.string().regex(/^[A-Za-z0-9-_\.]+$/) + }) + ) + .query(async ({ input }) => { + const config = getConfig(input.configName); + + const instances = config.apps.filter((app) => app.integration?.type == 'homeAssistant'); + + for (var instance of instances) { + const url = new URL(instance.url); + const client = HomeAssistantSingleton.getOrSet(url, findAppProperty(instance, 'apiKey')); + const state = await client.getEntityState(input.entityId); + + if (!state.success) { + if (!(state.error instanceof ZodError)) { + continue; + } + // Consola.error('Unable to handle entity state: ', state.error); + throw new TRPCError({ + code: 'NOT_IMPLEMENTED', + message: `Unable to handle Home Assistant entity state. This may be due to malformed response or unknown entity type. Check log for details` + }); + } + + if(!state.data) { + throw new TRPCError({ + code: 'INTERNAL_SERVER_ERROR', + message: `Home Assistant: Unable to connect to app '${instance.id}'. Check logs for details` + }); + } + + return state.data; + } + + return null; + }), +}); diff --git a/src/tools/server/sdk/homeassistant/HomeAssistant.ts b/src/tools/server/sdk/homeassistant/HomeAssistant.ts new file mode 100644 index 000000000..6ee8418b4 --- /dev/null +++ b/src/tools/server/sdk/homeassistant/HomeAssistant.ts @@ -0,0 +1,41 @@ +import Consola from 'consola'; +import { appendPath } from '~/tools/shared/strings'; +import { entityStateSchema } from './models/EntityState'; + +export class HomeAssistant { + public readonly basePath: URL; + private readonly token: string; + + constructor(url: URL, token: string) { + if (!url.pathname.endsWith('/')) { + url.pathname += "/"; + } + url.pathname += 'api'; + this.basePath = url; + this.token = token; + } + + async getEntityState(entityId: string) { + try { + const response = await fetch(appendPath(this.basePath, `/states/${entityId}`), { + headers: { + 'Authorization': `Bearer ${this.token}` + } + }); + const body = await response.json(); + if (!response.ok) { + return { + success: false as const, + error: body + }; + } + return entityStateSchema.safeParseAsync(body); + } catch (err) { + Consola.error(`Failed to fetch from '${this.basePath}': ${err}`); + return { + success: false as const, + error: err + }; + } + } +} diff --git a/src/tools/server/sdk/homeassistant/models/EntityState.ts b/src/tools/server/sdk/homeassistant/models/EntityState.ts new file mode 100644 index 000000000..de3f3ffc0 --- /dev/null +++ b/src/tools/server/sdk/homeassistant/models/EntityState.ts @@ -0,0 +1,12 @@ +import { z } from 'zod'; + + +export const entityStateSchema = z.object({ + attributes: z.record(z.union([z.string(), z.number(), z.boolean()])), + entity_id: z.string(), + last_changed: z.string().pipe(z.coerce.date()), + last_updated: z.string().pipe(z.coerce.date()), + state: z.string(), +}); + +export type EntityState = z.infer; diff --git a/src/tools/server/translation-namespaces.ts b/src/tools/server/translation-namespaces.ts index ff186c616..910e30220 100644 --- a/src/tools/server/translation-namespaces.ts +++ b/src/tools/server/translation-namespaces.ts @@ -29,6 +29,7 @@ export const boardNamespaces = [ 'modules/dns-hole-controls', 'modules/bookmark', 'modules/notebook', + 'modules/smart-home/entity-state', 'widgets/error-boundary', 'widgets/draggable-list', 'widgets/location', diff --git a/src/tools/shared/strings.ts b/src/tools/shared/strings.ts index 086edcae5..298983b33 100644 --- a/src/tools/shared/strings.ts +++ b/src/tools/shared/strings.ts @@ -12,3 +12,9 @@ export const trimStringEnding = (original: string, toTrimIfExists: string[]) => export const firstUpperCase = (str: string) => { return str.charAt(0).toUpperCase() + str.slice(1); }; + +export const appendPath = (url: URL, path: string) => { + const newUrl = new URL(url); + newUrl.pathname += path; + return newUrl; +} diff --git a/src/tools/singleton/HomeAssistantSingleton.ts b/src/tools/singleton/HomeAssistantSingleton.ts new file mode 100644 index 000000000..262f9816e --- /dev/null +++ b/src/tools/singleton/HomeAssistantSingleton.ts @@ -0,0 +1,20 @@ +import { HomeAssistant } from '../server/sdk/homeassistant/HomeAssistant'; + +export class HomeAssistantSingleton { + private static _instances: HomeAssistant[] = []; + + public static getOrSet(url: URL, token: string): HomeAssistant { + const match = this._instances.find( + (instance) => + instance.basePath.hostname === url.hostname && instance.basePath.port === url.port + ); + + if (!match) { + const instance = new HomeAssistant(url, token); + this._instances.push(instance); + return instance; + } + + return match; + } +} diff --git a/src/types/app.ts b/src/types/app.ts index 68a3c5039..6c624ca5d 100644 --- a/src/types/app.ts +++ b/src/types/app.ts @@ -1,4 +1,5 @@ import { Icon, IconKey, IconPassword, IconUser } from '@tabler/icons-react'; + import { Property } from 'csstype'; import { TileBaseType } from './tile'; @@ -55,7 +56,8 @@ export type IntegrationType = | 'jellyfin' | 'nzbGet' | 'pihole' - | 'adGuardHome'; + | 'adGuardHome' + | 'homeAssistant'; export type AppIntegrationType = { type: IntegrationType | null; @@ -97,6 +99,7 @@ export const integrationFieldProperties: { plex: ['apiKey'], pihole: ['apiKey'], adGuardHome: ['username', 'password'], + homeAssistant: ['apiKey'] }; export type IntegrationFieldDefinitionType = { diff --git a/src/widgets/index.ts b/src/widgets/index.ts index 39d775896..9219d8ae2 100644 --- a/src/widgets/index.ts +++ b/src/widgets/index.ts @@ -11,6 +11,7 @@ import mediaRequestsStats from './media-requests/MediaRequestStatsTile'; import mediaServer from './media-server/MediaServerTile'; import notebook from './notebook/NotebookWidgetTile'; import rss from './rss/RssWidgetTile'; +import smartHomeEntityState from './smart-home/entity-state/entity-state.widget'; import torrent from './torrent/TorrentTile'; import usenet from './useNet/UseNetTile'; import videoStream from './video/VideoStreamTile'; @@ -34,4 +35,5 @@ export default { 'dns-hole-controls': dnsHoleControls, bookmark, notebook, + 'smart-home/entity-state': smartHomeEntityState }; diff --git a/src/widgets/smart-home/entity-state/entity-state.widget.tsx b/src/widgets/smart-home/entity-state/entity-state.widget.tsx new file mode 100644 index 000000000..ac497d3b3 --- /dev/null +++ b/src/widgets/smart-home/entity-state/entity-state.widget.tsx @@ -0,0 +1,97 @@ +import { Center, Loader, Stack, Text, Tooltip } from '@mantine/core'; +import { IconAlertHexagon, IconBinaryTree, IconExclamationMark } from '@tabler/icons-react'; +import { useTranslation } from 'react-i18next'; +import { useConfigContext } from '~/config/provider'; +import { api } from '~/utils/api'; +import { defineWidget } from '~/widgets/helper'; +import { WidgetLoading } from '~/widgets/loading'; +import { IWidget } from '~/widgets/widgets'; + +const definition = defineWidget({ + id: 'smart-home/entity-state', + icon: IconBinaryTree, + options: { + entityId: { + type: 'text', + defaultValue: 'sun.sun', + info: true, + }, + displayName: { + type: 'text', + defaultValue: 'Sun', + }, + }, + gridstack: { + minWidth: 1, + minHeight: 1, + maxWidth: 12, + maxHeight: 12, + }, + component: EntityStateTile, +}); + +export type ISmartHomeEntityStateWidget = IWidget<(typeof definition)['id'], typeof definition>; + +interface SmartHomeEntityStateWidgetProps { + widget: ISmartHomeEntityStateWidget; +} + +function EntityStateTile({ widget }: SmartHomeEntityStateWidgetProps) { + const { t } = useTranslation('modules/smart-home/entity-state'); + const { name: configName } = useConfigContext(); + + const { data, isInitialLoading, isLoading, isError, error } = + api.smartHomeEntityState.retrieveStatus.useQuery( + { + configName: configName!, + entityId: widget.properties.entityId, + }, + { + enabled: !!configName, + } + ); + + let dataComponent = null; + + if (isError) { + dataComponent = ( + + + + ); + } + + if (!dataComponent && isInitialLoading) { + dataComponent = ; + } + + if (!dataComponent && !data) { + dataComponent = ( + + + + ); + } + + if (!dataComponent) { + dataComponent = ( + + {data?.state} + {isLoading && } + + ); + } + + return ( +
+ + + {widget.properties.displayName} + + {dataComponent} + +
+ ); +} + +export default definition; From 5522abdfb6705f077f4e31558914055a08cdb3db Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Thu, 23 Nov 2023 21:46:51 +0100 Subject: [PATCH 08/28] =?UTF-8?q?=F0=9F=94=96=20Increase=20version=20(#169?= =?UTF-8?q?9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7fbaf9707..0ec53e668 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homarr", - "version": "0.14.1", + "version": "0.14.2", "description": "Homarr - A homepage for your server.", "license": "MIT", "repository": { From dfcb899013479ed80bb255f78b4b29f3d5a5508b Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Thu, 23 Nov 2023 22:21:34 +0100 Subject: [PATCH 09/28] =?UTF-8?q?=E2=9C=A8=20Stale=20time=20for=20entity?= =?UTF-8?q?=20state=20(#1702)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/widgets/smart-home/entity-state/entity-state.widget.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/widgets/smart-home/entity-state/entity-state.widget.tsx b/src/widgets/smart-home/entity-state/entity-state.widget.tsx index ac497d3b3..ef3846517 100644 --- a/src/widgets/smart-home/entity-state/entity-state.widget.tsx +++ b/src/widgets/smart-home/entity-state/entity-state.widget.tsx @@ -48,6 +48,7 @@ function EntityStateTile({ widget }: SmartHomeEntityStateWidgetProps) { }, { enabled: !!configName, + refetchInterval: 2 * 60 * 1000 } ); From 9bdd6a442e7703d5d143c43d8a00675d0aa845b8 Mon Sep 17 00:00:00 2001 From: "Jefferson J. Raimon" <80064475+jeffersonraimon@users.noreply.github.com> Date: Sat, 25 Nov 2023 16:28:21 -0300 Subject: [PATCH 10/28] Update acceptableStatusCodes.ts add 202 code --- src/tools/acceptableStatusCodes.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/acceptableStatusCodes.ts b/src/tools/acceptableStatusCodes.ts index 12707ad65..a0d39f643 100644 --- a/src/tools/acceptableStatusCodes.ts +++ b/src/tools/acceptableStatusCodes.ts @@ -2,6 +2,7 @@ import { SelectItem } from '@mantine/core'; export const StatusCodes: SelectItem[] = [ { value: '200', label: '200 - OK', group: 'Sucessful responses' }, + { value: '202', label: '202 - Accepted', group: 'Sucessful responses' }, { value: '204', label: '204 - No Content', group: 'Sucessful responses' }, { value: '301', label: '301 - Moved Permanently', group: 'Redirection responses' }, { value: '302', label: '302 - Found / Moved Temporarily', group: 'Redirection responses' }, From fc38f7ab290e5e6a0c8af7afc4b6abbe2d2472dc Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Mon, 4 Dec 2023 13:06:14 +0100 Subject: [PATCH 11/28] =?UTF-8?q?=E2=9C=A8=20#1616=20Recovery=20script=20i?= =?UTF-8?q?n=20Docker=20container=20(#1726)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + Dockerfile | 5 + cli/cli.js | 30 + cli/commands/reset-owner-password.js | 55 ++ cli/commands/reset-password.js | 56 ++ cli/package.json | 12 + cli/yarn.lock | 1371 ++++++++++++++++++++++++++ 7 files changed, 1531 insertions(+) create mode 100644 cli/cli.js create mode 100644 cli/commands/reset-owner-password.js create mode 100644 cli/commands/reset-password.js create mode 100644 cli/package.json create mode 100644 cli/yarn.lock diff --git a/.gitignore b/.gitignore index fc8e46928..d07f51c20 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /node_modules /.pnp .pnp.js +/cli/node_modules/ # testing /coverage @@ -49,6 +50,7 @@ data/configs !.yarn/releases !.yarn/sdks !.yarn/versions +/cli/.yarn/ #envfiles .env diff --git a/Dockerfile b/Dockerfile index 2579bcf85..2c479d3aa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,6 +21,7 @@ COPY ./drizzle ./drizzle COPY ./drizzle/migrate ./migrate COPY ./tsconfig.json ./migrate/tsconfig.json +COPY ./cli ./cli RUN mkdir /data @@ -43,6 +44,10 @@ RUN mv node_modules ./migrate/node_modules # Copy temp node_modules of app to app folder RUN mv _node_modules node_modules +RUN echo '#!/bin/bash\nnode /app/cli/cli.js "$@"' > /usr/bin/homarr +RUN chmod +x /usr/bin/homarr +RUN cd /app/cli && yarn --immutable + # Expose the default application port EXPOSE $PORT ENV PORT=${PORT} diff --git a/cli/cli.js b/cli/cli.js new file mode 100644 index 000000000..4c8f692da --- /dev/null +++ b/cli/cli.js @@ -0,0 +1,30 @@ +import yargs from 'yargs'; + +import { resetPasswordForOwner } from './commands/reset-owner-password.js'; +import { resetPasswordForUsername } from './commands/reset-password.js'; + +yargs(process.argv.slice(2)) + .scriptName('homarr') + .usage('$0 [args]') + .command('reset-owner-password', 'Resets the current owner password without UI access', async () => { + await resetPasswordForOwner(); + }) + .command( + 'reset-password', + 'Reset the password of a specific user without UI access', + (yargs) => { + yargs.option('username', { + type: 'string', + describe: 'Username of user', + demandOption: true + }); + }, + async (argv) => { + await resetPasswordForUsername(argv.username); + } + ) + .version(false) + .showHelpOnFail(true) + .alias('h', 'help') + .demandCommand() + .help().argv; \ No newline at end of file diff --git a/cli/commands/reset-owner-password.js b/cli/commands/reset-owner-password.js new file mode 100644 index 000000000..d7d1fdc6d --- /dev/null +++ b/cli/commands/reset-owner-password.js @@ -0,0 +1,55 @@ +import bcrypt from 'bcryptjs'; + +import Database from 'better-sqlite3'; + +import boxen from 'boxen'; + +import chalk from 'chalk'; + +import Consola from 'consola'; + +import crypto from 'crypto'; + +import { sql } from 'drizzle-orm'; +import { drizzle } from 'drizzle-orm/better-sqlite3'; + +export async function resetPasswordForOwner() { + if (!process.env.DATABASE_URL) { + Consola.error('Unable to connect to database due to missing database URL environment variable'); + return; + } + + Consola.info('Connecting to the database...'); + const sqlite = new Database(process.env.DATABASE_URL.replace('file:', '')); + const db = drizzle(sqlite); + + Consola.info('Connected to the database ' + chalk.green('✓')); + Consola.info('Generating new random password...'); + + const newPassword = crypto.randomUUID(); + const salt = bcrypt.genSaltSync(10); + const hashedPassword = bcrypt.hashSync(newPassword, salt); + + try { + await db.transaction((tx) => { + tx.run( + sql`DELETE FROM session WHERE userId = (SELECT id FROM user WHERE is_owner = 1 LIMIT 1)` + ); + tx.run(sql`UPDATE user SET password = ${hashedPassword} WHERE is_owner = 1 LIMIT 1;`); + }); + console.log( + boxen(`New owner password is '${chalk.red(newPassword)}'. You can now log in with this password.\nExising sessions have been destroyed and need to login again with the new passowrd.`, { + dimBorder: true, + borderStyle: 'round', + padding: { + left: 1, + right: 1 + } + }) + ); + } catch (err) { + Consola.error('Failed to update password', err); + } finally { + Consola.info('Command has completed'); + } +} diff --git a/cli/commands/reset-password.js b/cli/commands/reset-password.js new file mode 100644 index 000000000..c4e011faa --- /dev/null +++ b/cli/commands/reset-password.js @@ -0,0 +1,56 @@ +import bcrypt from 'bcryptjs'; + +import Database from 'better-sqlite3'; + +import Consola from 'consola'; + +import crypto from 'crypto'; + +import boxen from 'boxen'; + +import chalk from 'chalk'; + +import { sql } from 'drizzle-orm'; +import { drizzle } from 'drizzle-orm/better-sqlite3'; + +export async function resetPasswordForUsername(username) { + if (!process.env.DATABASE_URL) { + Consola.error('Unable to connect to database due to missing database URL environment variable'); + return; + } + + Consola.info('Connecting to the database...'); + const sqlite = new Database(process.env.DATABASE_URL.replace('file:', '')); + const db = drizzle(sqlite); + + Consola.info('Generating new random password...'); + + const newPassword = crypto.randomUUID(); + const salt = bcrypt.genSaltSync(10); + const hashedPassword = bcrypt.hashSync(newPassword, salt); + + Consola.info(`Updating password for user '${username}'`); + + try { + await db.transaction((tx) => { + tx.run( + sql`DELETE FROM session WHERE userId = (SELECT id FROM user WHERE name = ${username} LIMIT 1)` + ); + tx.run(sql`UPDATE user SET password = ${hashedPassword} WHERE id = (SELECT id FROM user WHERE name = ${username} LIMIT 1) LIMIT 1`); + }); + console.log( + boxen(`New password for '${username}' is '${chalk.red(newPassword)}'. You can now log in with this password.\nExising sessions have been destroyed and need to login again with the new passowrd.`, { + dimBorder: true, + borderStyle: 'round', + padding: { + left: 1, + right: 1 + } + }) + ); + } catch (err) { + Consola.error('Failed to update password', err); + } finally { + Consola.info('Command has completed'); + } +} diff --git a/cli/package.json b/cli/package.json new file mode 100644 index 000000000..f1ee09e18 --- /dev/null +++ b/cli/package.json @@ -0,0 +1,12 @@ +{ + "dependencies": { + "bcryptjs": "^2.4.3", + "better-sqlite3": "^8.6.0", + "boxen": "^7.1.1", + "chalk": "^5.3.0", + "consola": "^3.0.0", + "drizzle-orm": "^0.28.6", + "yargs": "^17.7.2" + }, + "type": "module" +} diff --git a/cli/yarn.lock b/cli/yarn.lock new file mode 100644 index 000000000..d99d60b33 --- /dev/null +++ b/cli/yarn.lock @@ -0,0 +1,1371 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: ^5.1.2 + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: ^7.0.1 + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: ^8.1.0 + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.0 + resolution: "@npmcli/agent@npm:2.2.0" + dependencies: + agent-base: ^7.1.0 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.1 + lru-cache: ^10.0.1 + socks-proxy-agent: ^8.0.1 + checksum: 3b25312edbdfaa4089af28e2d423b6f19838b945e47765b0c8174c1395c79d43c3ad6d23cb364b43f59fd3acb02c93e3b493f72ddbe3dfea04c86843a7311fc4 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: ^7.3.5 + checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 0e994ad2aa6575f94670d8a2149afe94465de9cedaaaac364e7fb43a40c3691c980ff74899f682f4ca58fa96b4cbd7421a015d3a6defe43a442117d7821a2f36 + languageName: node + linkType: hard + +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": + version: 7.1.0 + resolution: "agent-base@npm:7.1.0" + dependencies: + debug: ^4.3.4 + checksum: f7828f991470a0cc22cb579c86a18cbae83d8a3cbed39992ab34fc7217c4d126017f1c74d0ab66be87f71455318a8ea3e757d6a37881b8d0f2a2c6aa55e5418f + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: ^2.0.0 + indent-string: ^4.0.0 + checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + languageName: node + linkType: hard + +"ansi-align@npm:^3.0.1": + version: 3.0.1 + resolution: "ansi-align@npm:3.0.1" + dependencies: + string-width: ^4.1.0 + checksum: 6abfa08f2141d231c257162b15292467081fa49a208593e055c866aa0455b57f3a86b5a678c190c618faa79b4c59e254493099cb700dd9cf2293c6be2c8f5d8d + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 + languageName: node + linkType: hard + +"bcryptjs@npm:^2.4.3": + version: 2.4.3 + resolution: "bcryptjs@npm:2.4.3" + checksum: 0e80ed852a41f5dfb1853f53ee14a7390b0ef263ce05dba6e2ef3cd919dfad025a7c21ebcfe5bc7fa04b100990edf90c7a877ff7fe623d3e479753253131b629 + languageName: node + linkType: hard + +"better-sqlite3@npm:^8.6.0": + version: 8.7.0 + resolution: "better-sqlite3@npm:8.7.0" + dependencies: + bindings: ^1.5.0 + node-gyp: latest + prebuild-install: ^7.1.1 + checksum: f1fa38a9a0e4fcd59ececb67c60371b9638d29c19ce9af034421e8a56c9a77e799bb1411b1c3cb08bb9678e15dfb8985553a9ef4098cf5558e7207a3e019f211 + languageName: node + linkType: hard + +"bindings@npm:^1.5.0": + version: 1.5.0 + resolution: "bindings@npm:1.5.0" + dependencies: + file-uri-to-path: 1.0.0 + checksum: 65b6b48095717c2e6105a021a7da4ea435aa8d3d3cd085cb9e85bcb6e5773cf318c4745c3f7c504412855940b585bdf9b918236612a1c7a7942491de176f1ae7 + languageName: node + linkType: hard + +"bl@npm:^4.0.3": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: ^5.5.0 + inherits: ^2.0.4 + readable-stream: ^3.4.0 + checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662 + languageName: node + linkType: hard + +"boxen@npm:^7.1.1": + version: 7.1.1 + resolution: "boxen@npm:7.1.1" + dependencies: + ansi-align: ^3.0.1 + camelcase: ^7.0.1 + chalk: ^5.2.0 + cli-boxes: ^3.0.0 + string-width: ^5.1.2 + type-fest: ^2.13.0 + widest-line: ^4.0.1 + wrap-ansi: ^8.1.0 + checksum: ad8833d5f2845b0a728fdf8a0bc1505dff0c518edcb0fd56979a08774b1f26cf48b71e66532179ccdfb9ed95b64aa008689cca26f7776f93f002b8000a683d76 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.1.13 + checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84 + languageName: node + linkType: hard + +"cacache@npm:^18.0.0": + version: 18.0.1 + resolution: "cacache@npm:18.0.1" + dependencies: + "@npmcli/fs": ^3.1.0 + fs-minipass: ^3.0.0 + glob: ^10.2.2 + lru-cache: ^10.0.1 + minipass: ^7.0.3 + minipass-collect: ^2.0.1 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + p-map: ^4.0.0 + ssri: ^10.0.0 + tar: ^6.1.11 + unique-filename: ^3.0.0 + checksum: 5a0b3b2ea451a0379814dc1d3c81af48c7c6db15cd8f7d72e028501ae0036a599a99bbac9687bfec307afb2760808d1c7708e9477c8c70d2b166e7d80b162a23 + languageName: node + linkType: hard + +"camelcase@npm:^7.0.1": + version: 7.0.1 + resolution: "camelcase@npm:7.0.1" + checksum: 86ab8f3ebf08bcdbe605a211a242f00ed30d8bfb77dab4ebb744dd36efbc84432d1c4adb28975ba87a1b8be40a80fbd1e60e2f06565315918fa7350011a26d3d + languageName: node + linkType: hard + +"chalk@npm:^5.2.0, chalk@npm:^5.3.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 623922e077b7d1e9dedaea6f8b9e9352921f8ae3afe739132e0e00c275971bdd331268183b2628cf4ab1727c45ea1f28d7e24ac23ce1db1eb653c414ca8a5a80 + languageName: node + linkType: hard + +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 115648f8eb38bac5e41c3857f3e663f9c39ed6480d1349977c4d96c95a47266fcacc5a5aabf3cb6c481e22d72f41992827db47301851766c4fd77ac21a4f081d + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 + languageName: node + linkType: hard + +"cli-boxes@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-boxes@npm:3.0.0" + checksum: 637d84419d293a9eac40a1c8c96a2859e7d98b24a1a317788e13c8f441be052fc899480c6acab3acc82eaf1bccda6b7542d7cdcf5c9c3cc39227175dc098d5b2 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.1 + wrap-ansi: ^7.0.0 + checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"consola@npm:^3.0.0": + version: 3.2.3 + resolution: "consola@npm:3.2.3" + checksum: 32ec70e177dd2385c42e38078958cc7397be91db21af90c6f9faa0b16168b49b1c61d689338604bbb2d64370b9347a35f42a9197663a913d3a405bb0ce728499 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + languageName: node + linkType: hard + +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: ^3.1.0 + checksum: d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812 + languageName: node + linkType: hard + +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 + languageName: node + linkType: hard + +"detect-libc@npm:^2.0.0": + version: 2.0.2 + resolution: "detect-libc@npm:2.0.2" + checksum: 2b2cd3649b83d576f4be7cc37eb3b1815c79969c8b1a03a40a4d55d83bc74d010753485753448eacb98784abf22f7dbd3911fd3b60e29fda28fed2d1a997944d + languageName: node + linkType: hard + +"drizzle-orm@npm:^0.28.6": + version: 0.28.6 + resolution: "drizzle-orm@npm:0.28.6" + peerDependencies: + "@aws-sdk/client-rds-data": ">=3" + "@cloudflare/workers-types": ">=3" + "@libsql/client": "*" + "@neondatabase/serverless": ">=0.1" + "@opentelemetry/api": ^1.4.1 + "@planetscale/database": ">=1" + "@types/better-sqlite3": "*" + "@types/pg": "*" + "@types/sql.js": "*" + "@vercel/postgres": "*" + better-sqlite3: ">=7" + bun-types: "*" + knex: "*" + kysely: "*" + mysql2: ">=2" + pg: ">=8" + postgres: ">=3" + sql.js: ">=1" + sqlite3: ">=5" + peerDependenciesMeta: + "@aws-sdk/client-rds-data": + optional: true + "@cloudflare/workers-types": + optional: true + "@libsql/client": + optional: true + "@neondatabase/serverless": + optional: true + "@opentelemetry/api": + optional: true + "@planetscale/database": + optional: true + "@types/better-sqlite3": + optional: true + "@types/pg": + optional: true + "@types/sql.js": + optional: true + "@vercel/postgres": + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + checksum: 1e079be9e969c1e9d325d68164006d976f093f296f6e058222a921debd047aa2369703b2142de03366e38baba3d8ef322f2e094bc0509d16f0577509b1f9bad7 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: ^0.6.2 + checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: ^1.4.0 + checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 + languageName: node + linkType: hard + +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 588c19847216421ed92befb521767b7018dc88f88b0576df98cb242f20961425e96a92cbece525ef28cc5becceae5d544ae0f5b9b5e2aa05acb13716ca5b3099 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 + languageName: node + linkType: hard + +"file-uri-to-path@npm:1.0.0": + version: 1.0.0 + resolution: "file-uri-to-path@npm:1.0.0" + checksum: b648580bdd893a008c92c7ecc96c3ee57a5e7b6c4c18a9a09b44fb5d36d79146f8e442578bc0e173dc027adf3987e254ba1dfd6e3ec998b7c282873010502144 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: ^7.0.0 + signal-exit: ^4.0.1 + checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 + languageName: node + linkType: hard + +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: 18f5b718371816155849475ac36c7d0b24d39a11d91348cfcb308b4494824413e03572c403c86d3a260e049465518c4f0d5bd00f0371cdfcad6d4f30a85b350d + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: ^3.0.0 + checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: ^7.0.3 + checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 + languageName: node + linkType: hard + +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 14e448192a35c1e42efee94c9d01a10f42fe790375891a24b25261246ce9336ab9df5d274585aedd4568f7922246c2a78b8a8cd2571bfe99c693a9718e7dd0e3 + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^2.3.5 + minimatch: ^9.0.1 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + path-scurry: ^1.10.1 + bin: + glob: dist/esm/bin.mjs + checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "http-proxy-agent@npm:7.0.0" + dependencies: + agent-base: ^7.1.0 + debug: ^4.3.4 + checksum: 48d4fac997917e15f45094852b63b62a46d0c8a4f0b9c6c23ca26d27b8df8d178bed88389e604745e748bd9a01f5023e25093722777f0593c3f052009ff438b6 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.2 + resolution: "https-proxy-agent@npm:7.0.2" + dependencies: + agent-base: ^7.0.2 + debug: 4 + checksum: 088969a0dd476ea7a0ed0a2cf1283013682b08f874c3bc6696c83fa061d2c157d29ef0ad3eb70a2046010bb7665573b2388d10fdcb3e410a66995e5248444292 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + languageName: node + linkType: hard + +"inherits@npm:^2.0.3, inherits@npm:^2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + languageName: node + linkType: hard + +"ini@npm:~1.3.0": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 + languageName: node + linkType: hard + +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": ^8.0.2 + "@pkgjs/parseargs": ^0.11.0 + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.1.0 + resolution: "lru-cache@npm:10.1.0" + checksum: 58056d33e2500fbedce92f8c542e7c11b50d7d086578f14b7074d8c241422004af0718e08a6eaae8705cee09c77e39a61c1c79e9370ba689b7010c152e6a76ab + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.0 + resolution: "make-fetch-happen@npm:13.0.0" + dependencies: + "@npmcli/agent": ^2.0.0 + cacache: ^18.0.0 + http-cache-semantics: ^4.1.1 + is-lambda: ^1.0.1 + minipass: ^7.0.2 + minipass-fetch: ^3.0.0 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^0.6.3 + promise-retry: ^2.0.1 + ssri: ^10.0.0 + checksum: 7c7a6d381ce919dd83af398b66459a10e2fe8f4504f340d1d090d3fa3d1b0c93750220e1d898114c64467223504bd258612ba83efbc16f31b075cd56de24b4af + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 25739fee32c17f433626bf19f016df9036b75b3d84a3046c7d156e72ec963dd29d7fc8a302f55a3d6c5a4ff24259676b15d915aad6480815a969ff2ec0836867 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.1": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: ^2.0.1 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.3": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: ^7.0.3 + checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" + dependencies: + encoding: ^0.1.13 + minipass: ^7.0.3 + minipass-sized: ^1.0.3 + minizlib: ^2.1.2 + dependenciesMeta: + encoding: + optional: true + checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: ^3.0.0 + checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: ^3.0.0 + checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: ^3.0.0 + checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: ^4.0.0 + checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: ^3.0.0 + yallist: ^4.0.0 + checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 + languageName: node + linkType: hard + +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"napi-build-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "napi-build-utils@npm:1.0.2" + checksum: 06c14271ee966e108d55ae109f340976a9556c8603e888037145d6522726aebe89dd0c861b4b83947feaf6d39e79e08817559e8693deedc2c94e82c5cbd090c7 + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 + languageName: node + linkType: hard + +"node-abi@npm:^3.3.0": + version: 3.51.0 + resolution: "node-abi@npm:3.51.0" + dependencies: + semver: ^7.3.5 + checksum: 3fabc9d58f0478767157560249f79c4a9e95082b96700cd8cc470f517bd566dbab82a37c862db3f78d3187be9f19f5cd9822b6f1b7ac7a3254fa70c3e3b38a83 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 10.0.1 + resolution: "node-gyp@npm:10.0.1" + dependencies: + env-paths: ^2.2.0 + exponential-backoff: ^3.1.1 + glob: ^10.3.10 + graceful-fs: ^4.2.6 + make-fetch-happen: ^13.0.0 + nopt: ^7.0.0 + proc-log: ^3.0.0 + semver: ^7.3.5 + tar: ^6.1.2 + which: ^4.0.0 + bin: + node-gyp: bin/node-gyp.js + checksum: 60a74e66d364903ce02049966303a57f898521d139860ac82744a5fdd9f7b7b3b61f75f284f3bfe6e6add3b8f1871ce305a1d41f775c7482de837b50c792223f + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.0 + resolution: "nopt@npm:7.2.0" + dependencies: + abbrev: ^2.0.0 + bin: + nopt: bin/nopt.js + checksum: a9c0f57fb8cb9cc82ae47192ca2b7ef00e199b9480eed202482c962d61b59a7fbe7541920b2a5839a97b42ee39e288c0aed770e38057a608d7f579389dfde410 + languageName: node + linkType: hard + +"once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: ^3.0.0 + checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: ^9.1.1 || ^10.0.0 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 + languageName: node + linkType: hard + +"prebuild-install@npm:^7.1.1": + version: 7.1.1 + resolution: "prebuild-install@npm:7.1.1" + dependencies: + detect-libc: ^2.0.0 + expand-template: ^2.0.3 + github-from-package: 0.0.0 + minimist: ^1.2.3 + mkdirp-classic: ^0.5.3 + napi-build-utils: ^1.0.1 + node-abi: ^3.3.0 + pump: ^3.0.0 + rc: ^1.2.7 + simple-get: ^4.0.0 + tar-fs: ^2.0.0 + tunnel-agent: ^0.6.0 + bin: + prebuild-install: bin.js + checksum: dbf96d0146b6b5827fc8f67f72074d2e19c69628b9a7a0a17d0fad1bf37e9f06922896972e074197fc00a52eae912993e6ef5a0d471652f561df5cb516f3f467 + languageName: node + linkType: hard + +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: 02b64e1b3919e63df06f836b98d3af002b5cd92655cab18b5746e37374bfb73e03b84fe305454614b34c25b485cc687a9eebdccf0242cda8fda2475dd2c97e02 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: ^2.0.2 + retry: ^0.12.0 + checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.0 + resolution: "pump@npm:3.0.0" + dependencies: + end-of-stream: ^1.1.0 + once: ^1.3.1 + checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 + languageName: node + linkType: hard + +"rc@npm:^1.2.7": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: ^0.6.0 + ini: ~1.3.0 + minimist: ^1.2.0 + strip-json-comments: ~2.0.1 + bin: + rc: ./cli.js + checksum: 2e26e052f8be2abd64e6d1dabfbd7be03f80ec18ccbc49562d31f617d0015fbdbcf0f9eed30346ea6ab789e0fdfe4337f033f8016efdbee0df5354751842080e + languageName: node + linkType: hard + +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c + languageName: node + linkType: hard + +"root-workspace-0b6124@workspace:.": + version: 0.0.0-use.local + resolution: "root-workspace-0b6124@workspace:." + dependencies: + bcryptjs: ^2.4.3 + better-sqlite3: ^8.6.0 + boxen: ^7.1.1 + chalk: ^5.3.0 + consola: ^3.0.0 + drizzle-orm: ^0.28.6 + yargs: ^17.7.2 + languageName: unknown + linkType: soft + +"safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + languageName: node + linkType: hard + +"semver@npm:^7.3.5": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 + languageName: node + linkType: hard + +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 4d211042cc3d73a718c21ac6c4e7d7a0363e184be6a5ad25c8a1502e49df6d0a0253979e3d50dbdd3f60ef6c6c58d756b5d66ac1e05cda9cacd2e9fc59e3876a + languageName: node + linkType: hard + +"simple-get@npm:^4.0.0": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" + dependencies: + decompress-response: ^6.0.0 + once: ^1.3.1 + simple-concat: ^1.0.0 + checksum: e4132fd27cf7af230d853fa45c1b8ce900cb430dd0a3c6d3829649fe4f2b26574c803698076c4006450efb0fad2ba8c5455fbb5755d4b0a5ec42d4f12b31d27e + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.1": + version: 8.0.2 + resolution: "socks-proxy-agent@npm:8.0.2" + dependencies: + agent-base: ^7.0.2 + debug: ^4.3.4 + socks: ^2.7.1 + checksum: 4fb165df08f1f380881dcd887b3cdfdc1aba3797c76c1e9f51d29048be6e494c5b06d68e7aea2e23df4572428f27a3ec22b3d7c75c570c5346507433899a4b6d + languageName: node + linkType: hard + +"socks@npm:^2.7.1": + version: 2.7.1 + resolution: "socks@npm:2.7.1" + dependencies: + ip: ^2.0.0 + smart-buffer: ^4.2.0 + checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.5 + resolution: "ssri@npm:10.0.5" + dependencies: + minipass: ^7.0.3 + checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: ^8.0.0 + is-fullwidth-code-point: ^3.0.0 + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: ^0.2.0 + emoji-regex: ^9.2.2 + strip-ansi: ^7.0.1 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: ~5.2.0 + checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: ^6.0.1 + checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d + languageName: node + linkType: hard + +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 + languageName: node + linkType: hard + +"tar-fs@npm:^2.0.0": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: ^1.1.1 + mkdirp-classic: ^0.5.2 + pump: ^3.0.0 + tar-stream: ^2.1.4 + checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d + languageName: node + linkType: hard + +"tar-stream@npm:^2.1.4": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: ^4.0.3 + end-of-stream: ^1.4.1 + fs-constants: ^1.0.0 + inherits: ^2.0.3 + readable-stream: ^3.1.1 + checksum: 699831a8b97666ef50021c767f84924cfee21c142c2eb0e79c63254e140e6408d6d55a065a2992548e72b06de39237ef2b802b99e3ece93ca3904a37622a66f3 + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.2.0 + resolution: "tar@npm:6.2.0" + dependencies: + chownr: ^2.0.0 + fs-minipass: ^2.0.0 + minipass: ^5.0.0 + minizlib: ^2.1.1 + mkdirp: ^1.0.3 + yallist: ^4.0.0 + checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c + languageName: node + linkType: hard + +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: ^5.0.1 + checksum: 05f6510358f8afc62a057b8b692f05d70c1782b70db86d6a1e0d5e28a32389e52fa6e7707b6c5ecccacc031462e4bc35af85ecfe4bbc341767917b7cf6965711 + languageName: node + linkType: hard + +"type-fest@npm:^2.13.0": + version: 2.19.0 + resolution: "type-fest@npm:2.19.0" + checksum: a4ef07ece297c9fba78fc1bd6d85dff4472fe043ede98bd4710d2615d15776902b595abf62bd78339ed6278f021235fb28a96361f8be86ed754f778973a0d278 + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: ^4.0.0 + checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: ^3.1.1 + bin: + node-which: bin/which.js + checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 + languageName: node + linkType: hard + +"widest-line@npm:^4.0.1": + version: 4.0.1 + resolution: "widest-line@npm:4.0.1" + dependencies: + string-width: ^5.0.1 + checksum: 64c48cf27171221be5f86fc54b94dd29879165bdff1a7aa92dde723d9a8c99fb108312768a5d62c8c2b80b701fa27bbd36a1ddc58367585cd45c0db7920a0cba + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c + languageName: node + linkType: hard + +"yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: ^8.0.1 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.3 + y18n: ^5.0.5 + yargs-parser: ^21.1.1 + checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a + languageName: node + linkType: hard From d6af6af0b6c47bd67b231f2deb320d972c62c42c Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Thu, 7 Dec 2023 18:14:10 +0100 Subject: [PATCH 12/28] =?UTF-8?q?=F0=9F=90=9B=20About=20page=20and=20manag?= =?UTF-8?q?e=20user=20pages=20not=20translated=20(#1724)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/manage/about.tsx | 13 +++++++++---- src/pages/manage/users/index.tsx | 5 +++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/pages/manage/about.tsx b/src/pages/manage/about.tsx index f800b20ca..394e07c92 100644 --- a/src/pages/manage/about.tsx +++ b/src/pages/manage/about.tsx @@ -10,7 +10,7 @@ import { Stack, Table, Text, - createStyles + createStyles, } from '@mantine/core'; import { IconAnchor, @@ -18,7 +18,7 @@ import { IconLanguage, IconSchema, IconVersions, - IconVocabulary + IconVocabulary, } from '@tabler/icons-react'; import { useQuery } from '@tanstack/react-query'; import { InitOptions } from 'i18next'; @@ -262,7 +262,7 @@ export const Page = ({ contributors }: { contributors: Contributors[] }) => { ); }; -export async function getServerSideProps({ locale }: GetServerSidePropsContext) { +export async function getServerSideProps(ctx: GetServerSidePropsContext) { const contributors = (await fetch( `https://api.github.com/repos/${REPO_URL}/contributors?per_page=100`, { @@ -272,7 +272,12 @@ export async function getServerSideProps({ locale }: GetServerSidePropsContext) return { props: { contributors, - ...(await getServerSideTranslations(['layout/manage', 'manage/index'], locale)), + ...(await getServerSideTranslations( + ['layout/manage', 'manage/index'], + ctx.locale, + ctx.req, + ctx.res + )), }, }; } diff --git a/src/pages/manage/users/index.tsx b/src/pages/manage/users/index.tsx index 4a3b3176b..8b90a3505 100644 --- a/src/pages/manage/users/index.tsx +++ b/src/pages/manage/users/index.tsx @@ -189,9 +189,10 @@ export const getServerSideProps: GetServerSideProps = async (ctx) => { const translations = await getServerSideTranslations( manageNamespaces, ctx.locale, - undefined, - undefined + ctx.req, + ctx.res ); + return { props: { ...translations, From 51e96c0ccfc283d55f0ddd028d4653ba62fa7952 Mon Sep 17 00:00:00 2001 From: Tagaishi Date: Thu, 7 Dec 2023 18:15:07 +0100 Subject: [PATCH 13/28] =?UTF-8?q?=E2=9C=A8=20Use=20gravatar=20with=20user?= =?UTF-8?q?=20email=20(#1688)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ Use gravatar with user email --- src/components/layout/header/AvatarMenu.tsx | 132 +++++++++++--------- 1 file changed, 74 insertions(+), 58 deletions(-) diff --git a/src/components/layout/header/AvatarMenu.tsx b/src/components/layout/header/AvatarMenu.tsx index e0ea38d01..f9d6b4d0d 100644 --- a/src/components/layout/header/AvatarMenu.tsx +++ b/src/components/layout/header/AvatarMenu.tsx @@ -8,6 +8,7 @@ import { IconSun, IconUserCog, } from '@tabler/icons-react'; +import { createHash } from 'crypto'; import { User } from 'next-auth'; import { signOut, useSession } from 'next-auth/react'; import { useTranslation } from 'next-i18next'; @@ -26,66 +27,64 @@ export const AvatarMenu = () => { const defaultBoardHref = useBoardLink('/board'); return ( - <> - - - - - - - } - onClick={toggleColorScheme} - > - {t('actions.avatar.switchTheme')} - - {sessionData?.user && ( - <> - } - > - {t('actions.avatar.preferences')} - - } - > - {t('actions.avatar.defaultBoard')} - - }> - {t('actions.avatar.manage')} - - - - )} - {sessionData?.user ? ( + + + + + + + } + onClick={toggleColorScheme} + > + {t('actions.avatar.switchTheme')} + + {sessionData?.user && ( + <> } - color="red" - onClick={() => - signOut({ - redirect: false, - }).then(() => window.location.reload()) - } + component={Link} + passHref + href="/user/preferences" + icon={} > - {t('actions.avatar.logout', { - username: sessionData.user.name, - })} + {t('actions.avatar.preferences')} - ) : ( - } component={Link} href="/auth/login"> - {t('actions.avatar.login')} + } + > + {t('actions.avatar.defaultBoard')} - )} - - - - + }> + {t('actions.avatar.manage')} + + + + )} + {sessionData?.user ? ( + } + color="red" + onClick={() => + signOut({ + redirect: false, + }).then(() => window.location.reload()) + } + > + {t('actions.avatar.logout', { + username: sessionData.user.name, + })} + + ) : ( + } component={Link} href="/auth/login"> + {t('actions.avatar.login')} + + )} + + + ); }; @@ -93,12 +92,29 @@ type CurrentUserAvatarProps = { user: User | null; }; +const getGravatar = (email?: string | undefined | null) => { + if (!email) return null; + const emailHash = createHash('sha256').update(email.trim().toLowerCase()).digest('hex'); + return `https://gravatar.com/avatar/${emailHash}?d=null`; +}; + const CurrentUserAvatar = forwardRef( ({ user, ...others }, ref) => { const { primaryColor } = useMantineTheme(); - if (!user) return ; + const { fn } = useMantineTheme(); + const border = fn.variant({ variant: 'default' }).border; + + if (!user) + return ; + return ( - + {user.name?.slice(0, 2).toUpperCase()} ); From 217020154b17897f3e0ebfe0996810eaa3bf6796 Mon Sep 17 00:00:00 2001 From: Someone <10882916+InterN0te@users.noreply.github.com> Date: Thu, 7 Dec 2023 18:28:28 +0100 Subject: [PATCH 14/28] feat: add filter and sorting functionality to torrents table --- package.json | 4 + .../locales/en/modules/torrents-status.json | 12 +- src/widgets/torrent/TorrentQueueItem.tsx | 89 +-- src/widgets/torrent/TorrentTile.tsx | 226 +++++-- yarn.lock | 551 +++++++++++------- 5 files changed, 523 insertions(+), 359 deletions(-) diff --git a/package.json b/package.json index 0ec53e668..d2ac3e5e7 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,10 @@ "html-entities": "^2.3.3", "i18next": "^22.5.1", "immer": "^10.0.2", + "js-file-download": "^0.4.12", + "mantine-react-table": "^1.3.4", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", "next": "13.4.12", "next-auth": "^4.23.0", "next-i18next": "^14.0.0", diff --git a/public/locales/en/modules/torrents-status.json b/public/locales/en/modules/torrents-status.json index c402c31c3..594b34e00 100644 --- a/public/locales/en/modules/torrents-status.json +++ b/public/locales/en/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "Downloading", "name": "Name", + "dateAdded": "Added On", "size": "Size", "download": "Down", "upload": "Up", "estimatedTimeOfArrival": "ETA", - "progress": "Progress" + "progress": "Progress", + "totalUploaded": "Total Upload", + "totalDownloaded": "Total Download", + "ratio": "Ratio", + "seeds": "Seeds (Connected)", + "peers": "Peers (Connected)", + "label": "Label", + "state": "State", + "stateMessage": "State Message" }, "item": { "text": "Managed by {{appName}}, {{ratio}} ratio" diff --git a/src/widgets/torrent/TorrentQueueItem.tsx b/src/widgets/torrent/TorrentQueueItem.tsx index f463b156f..bf20ba86a 100644 --- a/src/widgets/torrent/TorrentQueueItem.tsx +++ b/src/widgets/torrent/TorrentQueueItem.tsx @@ -6,12 +6,11 @@ import { Group, List, MantineColor, - Popover, Progress, Stack, Text, createStyles, - useMantineTheme, + useMantineTheme } from '@mantine/core'; import { IconAffiliate, @@ -24,8 +23,6 @@ import { IconUpload, } from '@tabler/icons-react'; import { useTranslation } from 'next-i18next'; -import { MIN_WIDTH_MOBILE } from '~/constants/constants'; -import { calculateETA } from '~/tools/client/calculateEta'; import { humanFileSize } from '~/tools/humanFileSize'; import { AppType } from '~/types/app'; @@ -35,89 +32,7 @@ interface TorrentQueueItemProps { width: number; } -export const BitTorrentQueueItem = ({ torrent, width, app }: TorrentQueueItemProps) => { - const { classes } = useStyles(); - const { t } = useTranslation('modules/torrents-status'); - - const size = torrent.totalSelected; - return ( - - - - - - {torrent.name} - - {app && ( - - {t('card.table.item.text', { - appName: app.name, - ratio: torrent.ratio.toFixed(2), - })} - - )} - - - - {humanFileSize(size, false)} - - - {width > MIN_WIDTH_MOBILE && ( - - - {torrent.downloadSpeed > 0 ? `${humanFileSize(torrent.downloadSpeed,false)}/s` : '-'} - - - )} - {width > MIN_WIDTH_MOBILE && ( - - - {torrent.uploadSpeed > 0 ? `${humanFileSize(torrent.uploadSpeed,false)}/s` : '-'} - - - )} - {width > MIN_WIDTH_MOBILE && ( - - - {torrent.eta <= 0 ? '∞' : calculateETA(torrent.eta)} - - - )} - - {(torrent.progress * 100).toFixed(1)}% - - - - - - - - - ); -}; - -const TorrentQueuePopover = ({ torrent, app }: Omit) => { +export const TorrentQueuePopover = ({ torrent, app }: Omit) => { const { t } = useTranslation('modules/torrents-status'); const { colors } = useMantineTheme(); diff --git a/src/widgets/torrent/TorrentTile.tsx b/src/widgets/torrent/TorrentTile.tsx index b553d50b9..31124fd45 100644 --- a/src/widgets/torrent/TorrentTile.tsx +++ b/src/widgets/torrent/TorrentTile.tsx @@ -1,31 +1,42 @@ -import { NormalizedTorrent, TorrentState } from '@ctrl/shared-torrent'; +import { + MRT_Table, + useMantineReactTable, + type MRT_ColumnDef, +} from 'mantine-react-table'; + +import { NormalizedTorrent } from '@ctrl/shared-torrent'; import { Badge, Center, + createStyles, Flex, Group, Loader, + Popover, + Progress, ScrollArea, Stack, - Table, Text, Title, } from '@mantine/core'; import { useElementSize } from '@mantine/hooks'; -import { IconFileDownload, IconInfoCircle } from '@tabler/icons-react'; +import { IconFileDownload } from '@tabler/icons-react'; import dayjs from 'dayjs'; import duration from 'dayjs/plugin/duration'; import relativeTime from 'dayjs/plugin/relativeTime'; import { useTranslation } from 'next-i18next'; +import { useMemo } from 'react'; import { useCardStyles } from '~/components/layout/Common/useCardStyles'; import { MIN_WIDTH_MOBILE } from '~/constants/constants'; +import { calculateETA } from '~/tools/client/calculateEta'; +import { humanFileSize } from '~/tools/humanFileSize'; import { NormalizedDownloadQueueResponse } from '~/types/api/downloads/queue/NormalizedDownloadQueueResponse'; import { AppIntegrationType } from '~/types/app'; import { useGetDownloadClientsQueue } from '../download-speed/useGetNetworkSpeed'; import { defineWidget } from '../helper'; import { IWidget } from '../widgets'; -import { BitTorrentQueueItem } from './TorrentQueueItem'; +import { TorrentQueuePopover } from './TorrentQueueItem'; dayjs.extend(duration); dayjs.extend(relativeTime); @@ -44,7 +55,8 @@ const definition = defineWidget({ type: 'switch', defaultValue: true, }, - speedLimitOfActiveTorrents: { // Unit : kB/s + speedLimitOfActiveTorrents: { + // Unit : kB/s type: 'number', defaultValue: 10, }, @@ -98,6 +110,137 @@ function TorrentTile({ widget }: TorrentTileProps) { dataUpdatedAt: number; } = useGetDownloadClientsQueue(); + let torrents: NormalizedTorrent[] = []; + if(!(isError || !data || data.apps.length === 0 || Object.values(data.apps).length < 1)) { + torrents = data.apps.flatMap((app) => (app.type === 'torrent' ? app.torrents : [])) + } + + const filteredTorrents = filterTorrents(widget, torrents); + + + const difference = new Date().getTime() - dataUpdatedAt; + const duration = dayjs.duration(difference, 'ms'); + const humanizedDuration = duration.humanize(); + + const ratioGlobal = getTorrentsRatio(widget, torrents, false); + const ratioWithFilter = getTorrentsRatio(widget, torrents, true); + + const columns = useMemo[]>(() => [ + { + id: "dateAdded", + accessorFn: (row) => new Date(row.dateAdded), + header: "dateAdded", + }, + { + accessorKey: 'name', + header: t('card.table.header.name'), + Cell: ({ cell, row }) => ( + + + + {String(cell.getValue())} + + + + + + + ), + }, + { + accessorKey: 'totalSize', + header: t('card.table.header.size'), + Cell: ({ cell }) => formatSize(Number(cell.getValue())), + sortDescFirst: true, + }, + { + accessorKey: 'uploadSpeed', + header: t('card.table.header.upload'), + Cell: ({ cell }) => formatSpeed(Number(cell.getValue())), + sortDescFirst: true, + }, + { + accessorKey: 'downloadSpeed', + header: t('card.table.header.download'), + Cell: ({ cell }) => formatSpeed(Number(cell.getValue())), + sortDescFirst: true, + }, + { + accessorKey: 'eta', + header: t('card.table.header.estimatedTimeOfArrival'), + Cell: ({ cell }) => formatETA(Number(cell.getValue())), + sortDescFirst: true, + }, + { + accessorKey: 'progress', + header: t('card.table.header.progress'), + Cell: ({ cell, row }) => ( + + {(Number(cell.getValue()) * 100).toFixed(1)}% + , + ), + sortDescFirst: true, + }, + ], []); + + const torrentsTable = useMantineReactTable({ + columns, + data: filteredTorrents, + enablePagination: false, + enableBottomToolbar: false, + enableMultiSort: true, + enableColumnActions: false, + enableColumnFilters: false, + enableSorting: true, + initialState: { + showColumnFilters: false, + showGlobalFilter: false, + density: 'xs', + sorting: [{ id: 'dateAdded', desc: true }], + columnVisibility: { + isCompleted: false, + dateAdded: false, + uploadSpeed: false, + downloadSpeed: false, + eta: false, + }, + }, + state: { + showColumnFilters: false, + showGlobalFilter: false, + density: 'xs', + columnVisibility: { + isCompleted: false, + dateAdded: false, + uploadSpeed: width > MIN_WIDTH_MOBILE, + downloadSpeed: width > MIN_WIDTH_MOBILE, + eta: width > MIN_WIDTH_MOBILE, + }, + }, + }); + + if (isError) { return ( @@ -146,51 +289,10 @@ function TorrentTile({ widget }: TorrentTileProps) { ); } - const torrents = data.apps.flatMap((app) => (app.type === 'torrent' ? app.torrents : [])); - const filteredTorrents = filterTorrents(widget, torrents); - - const difference = new Date().getTime() - dataUpdatedAt; - const duration = dayjs.duration(difference, 'ms'); - const humanizedDuration = duration.humanize(); - - const ratioGlobal = getTorrentsRatio(widget, torrents, false); - const ratioWithFilter = getTorrentsRatio(widget, torrents, true); - return ( - - - - - - - {width > MIN_WIDTH_MOBILE && } - {width > MIN_WIDTH_MOBILE && } - {width > MIN_WIDTH_MOBILE && } - - - - - {filteredTorrents.map((torrent, index) => ( - - ))} - - {filteredTorrents.length !== torrents.length && ( - - - - )} - -
{t('card.table.header.name')}{t('card.table.header.size')}{t('card.table.header.download')}{t('card.table.header.upload')}{t('card.table.header.estimatedTimeOfArrival')}{t('card.table.header.progress')}
MIN_WIDTH_MOBILE ? 6 : 3}> - - - - {t('card.table.body.filterHidingItems', { - count: torrents.length - filteredTorrents.length, - })} - - -
+ + {data.apps.some((x) => !x.success) && ( @@ -198,9 +300,8 @@ function TorrentTile({ widget }: TorrentTileProps) { {t('card.footer.error')} )} - - {t('card.footer.lastUpdated', { time: humanizedDuration })} + {t('card.footer.lastUpdated', { time: humanizedDuration })} {` - ${t('card.footer.ratioGlobal')} : ${ ratioGlobal === -1 ? '∞' : ratioGlobal.toFixed(2) }`} @@ -217,7 +318,12 @@ function TorrentTile({ widget }: TorrentTileProps) { export const filterTorrents = (widget: ITorrent, torrents: NormalizedTorrent[]) => { let result = torrents; if (!widget.properties.displayCompletedTorrents) { - result = result.filter((torrent) => !torrent.isCompleted || (widget.properties.displayActiveTorrents && torrent.uploadSpeed > widget.properties.speedLimitOfActiveTorrents * 1024)); + result = result.filter( + (torrent) => + !torrent.isCompleted || + (widget.properties.displayActiveTorrents && + torrent.uploadSpeed > widget.properties.speedLimitOfActiveTorrents * 1024) + ); } if (widget.properties.labelFilter.length > 0) { @@ -279,4 +385,22 @@ export const getTorrentsRatio = ( : -1; }; +const formatSize = (sizeInBytes: number) => { + return humanFileSize(sizeInBytes, false); +}; + +const formatSpeed = (speedInBytesPerSecond: number) => { + return `${humanFileSize(speedInBytesPerSecond, false)}/s`; +}; + +const formatETA = (seconds: number) => { + return calculateETA(seconds); +}; + +const useStyles = createStyles(() => ({ + noTextBreak: { + whiteSpace: 'nowrap', + }, +})); + export default definition; diff --git a/yarn.lock b/yarn.lock index e000ebb4e..976ac1c6e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,14 +22,14 @@ __metadata: languageName: node linkType: hard -"@auth/core@npm:0.18.0": - version: 0.18.0 - resolution: "@auth/core@npm:0.18.0" +"@auth/core@npm:0.18.1": + version: 0.18.1 + resolution: "@auth/core@npm:0.18.1" dependencies: - "@panva/hkdf": ^1.0.4 + "@panva/hkdf": ^1.1.1 cookie: 0.5.0 - jose: ^4.11.1 - oauth4webapi: ^2.0.6 + jose: ^5.1.0 + oauth4webapi: ^2.3.0 preact: 10.11.3 preact-render-to-string: 5.2.3 peerDependencies: @@ -37,16 +37,16 @@ __metadata: peerDependenciesMeta: nodemailer: optional: true - checksum: f0acc784661b6244f4a94e0a1494d2dd56af92b44cb49012f5b7dec9fe4674b5986508e0ab43f91296df0212ea5f0f56e8f317dd27037d72c5408c1bc77eea42 + checksum: 46ae80e621e03d9206cc9a5e37941df92207e58298f423ec71ae2b8d3492d86f14d5e024ba30c5a905675c451688d212d389b580748f3a176ec0ddcd3872291a languageName: node linkType: hard "@auth/drizzle-adapter@npm:^0.3.2": - version: 0.3.5 - resolution: "@auth/drizzle-adapter@npm:0.3.5" + version: 0.3.6 + resolution: "@auth/drizzle-adapter@npm:0.3.6" dependencies: - "@auth/core": 0.18.0 - checksum: c2b5794fbd3b9eabdd4058fe913b92200e9ea6486b43e951c8541ffa9fea6d268ba3948c6662007968288a7c449341685bf2080d82f37dfeb9993f4bbdd8d714 + "@auth/core": 0.18.1 + checksum: c80abc825ab15645f39ad4fd630ca81caf18880aca32f8df030a072dfb7f5222d1fe4396713041bf24e7252c8478a09be81ac4f921652497319acf30e138f4ec languageName: node linkType: hard @@ -67,7 +67,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.23.2": +"@babel/core@npm:^7.23.3": version: 7.23.3 resolution: "@babel/core@npm:7.23.3" dependencies: @@ -253,7 +253,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-self@npm:^7.22.5": +"@babel/plugin-transform-react-jsx-self@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-react-jsx-self@npm:7.23.3" dependencies: @@ -264,7 +264,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-source@npm:^7.22.5": +"@babel/plugin-transform-react-jsx-source@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-react-jsx-source@npm:7.23.3" dependencies: @@ -823,10 +823,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.53.0": - version: 8.53.0 - resolution: "@eslint/js@npm:8.53.0" - checksum: e0d5cfb0000aaee237c8e6d6d6e366faa60b1ef7f928ce17778373aa44d3b886368f6d5e1f97f913f0f16801aad016db8b8df78418c9d18825c15590328028af +"@eslint/js@npm:8.54.0": + version: 8.54.0 + resolution: "@eslint/js@npm:8.54.0" + checksum: 6d88a6f711ef0133566b5340e3178a178fbb297585766460f195d0a9db85688f1e5cf8559fd5748aeb3131e2096c66595b323d8edab22df015acda68f1ebde92 languageName: node linkType: hard @@ -1253,27 +1253,27 @@ __metadata: languageName: node linkType: hard -"@nivo/annotations@npm:0.83.0": - version: 0.83.0 - resolution: "@nivo/annotations@npm:0.83.0" +"@nivo/annotations@npm:0.83.1": + version: 0.83.1 + resolution: "@nivo/annotations@npm:0.83.1" dependencies: - "@nivo/colors": 0.83.0 - "@nivo/core": 0.83.0 + "@nivo/colors": 0.83.1 + "@nivo/core": 0.83.1 "@react-spring/web": 9.4.5 || ^9.7.2 "@types/prop-types": ^15.7.2 lodash: ^4.17.21 prop-types: ^15.7.2 peerDependencies: react: ">= 16.14.0 < 19.0.0" - checksum: 8d7b6fc8b9d8d3a31e661138b3af3e56639fd2e26ddbde2947f986adc0aaba55c684a581a24f5124d0852074ab631b6690c1a859e2e80c7470ed8d975851bf19 + checksum: a3b8d806edbdc9ebcf5734f49513a9ba7263a7476db1aed88d57bab8a06d1aae72a53255256b1604e8bb5f4e9f1c41f3aaa7af31ff127e57af7e708962eb18d9 languageName: node linkType: hard -"@nivo/axes@npm:0.83.0": - version: 0.83.0 - resolution: "@nivo/axes@npm:0.83.0" +"@nivo/axes@npm:0.83.1": + version: 0.83.1 + resolution: "@nivo/axes@npm:0.83.1" dependencies: - "@nivo/core": 0.83.0 + "@nivo/core": 0.83.1 "@nivo/scales": 0.83.0 "@react-spring/web": 9.4.5 || ^9.7.2 "@types/d3-format": ^1.4.1 @@ -1284,15 +1284,15 @@ __metadata: prop-types: ^15.7.2 peerDependencies: react: ">= 16.14.0 < 19.0.0" - checksum: bb96372d026407f5ce3ae1503200955d576f9ba49c49f595b32cbef5aabaacb97068aecb5f08445aa92ec6205cf14364d7a2ad9a58c4ef839b347a61ca1739a9 + checksum: 81341f0456fe6eca759ead80f2a49351c0e275c590cd80090642a6661b688e3facdd55829d93a2e368ecc9433a047413ff588dd569495442c1ddff2aebc1320c languageName: node linkType: hard -"@nivo/colors@npm:0.83.0": - version: 0.83.0 - resolution: "@nivo/colors@npm:0.83.0" +"@nivo/colors@npm:0.83.1": + version: 0.83.1 + resolution: "@nivo/colors@npm:0.83.1" dependencies: - "@nivo/core": 0.83.0 + "@nivo/core": 0.83.1 "@types/d3-color": ^2.0.0 "@types/d3-scale": ^3.2.3 "@types/d3-scale-chromatic": ^2.0.0 @@ -1304,67 +1304,67 @@ __metadata: prop-types: ^15.7.2 peerDependencies: react: ">= 16.14.0 < 19.0.0" - checksum: d06ea2b3f9dbec20aa1d623b2aefa8e5be9c925448285611aaef027c2ee2caa9262bb4f2a8db5315e8c2f706290df16d0a92d7020847ea4c0260ff85699433f1 + checksum: cb5c192efe3a36f6ce2e8fadcb26f4fcb8755e42581752f2010aeae9976c8aa2b92e013f09af602dd29b5cdb589f5f905ad367acaa27a377a9853071810c15e8 languageName: node linkType: hard -"@nivo/core@npm:0.83.0, @nivo/core@npm:^0.83.0": - version: 0.83.0 - resolution: "@nivo/core@npm:0.83.0" +"@nivo/core@npm:0.83.1, @nivo/core@npm:^0.83.0": + version: 0.83.1 + resolution: "@nivo/core@npm:0.83.1" dependencies: "@nivo/recompose": 0.83.0 - "@nivo/tooltip": 0.83.0 + "@nivo/tooltip": 0.83.1 "@react-spring/web": 9.4.5 || ^9.7.2 "@types/d3-shape": ^2.0.0 d3-color: ^3.1.0 d3-format: ^1.4.4 - d3-interpolate: ^2.0.1 + d3-interpolate: ^3.0.1 d3-scale: ^3.2.3 - d3-scale-chromatic: ^2.0.0 + d3-scale-chromatic: ^3.0.0 d3-shape: ^1.3.5 d3-time-format: ^3.0.0 lodash: ^4.17.21 peerDependencies: prop-types: ">= 15.5.10 < 16.0.0" react: ">= 16.14.0 < 19.0.0" - checksum: d60e2626790b229bf8137600a704c597b3321ad862df1bcbb03bd19b7b36d58ea68786776c1f0c6d332aa914eac169364e4ed722ae13e20a183c35d7190a320a + checksum: 66b720c9971ecfc3a09af1d31862ff1b6a4d3b269b76b763a8fed1199bcd4a12f8e91785039cac3f1d6621ef8ac7130336c2a6042037fb6e6bd684ec7d208051 languageName: node linkType: hard -"@nivo/legends@npm:0.83.0": - version: 0.83.0 - resolution: "@nivo/legends@npm:0.83.0" +"@nivo/legends@npm:0.83.1": + version: 0.83.1 + resolution: "@nivo/legends@npm:0.83.1" dependencies: - "@nivo/colors": 0.83.0 - "@nivo/core": 0.83.0 + "@nivo/colors": 0.83.1 + "@nivo/core": 0.83.1 "@types/d3-scale": ^3.2.3 "@types/prop-types": ^15.7.2 d3-scale: ^3.2.3 prop-types: ^15.7.2 peerDependencies: react: ">= 16.14.0 < 19.0.0" - checksum: 2732e2781b27c403b3623a59232573074ba4cf91668802a6d2d184be0300ec3455e29f3dde188d635e506ad94a56680cdf2f34a721f685a224cac1eab1be3a84 + checksum: 7d9b01bbc04702aad303fc368926783c4aecbf327ee81dda75c03ef51a14f8da940765c91e0ab738dc1600ab93701a7964faaa36df5065049f4c8857126942fb languageName: node linkType: hard "@nivo/line@npm:^0.83.0": - version: 0.83.0 - resolution: "@nivo/line@npm:0.83.0" + version: 0.83.1 + resolution: "@nivo/line@npm:0.83.1" dependencies: - "@nivo/annotations": 0.83.0 - "@nivo/axes": 0.83.0 - "@nivo/colors": 0.83.0 - "@nivo/core": 0.83.0 - "@nivo/legends": 0.83.0 + "@nivo/annotations": 0.83.1 + "@nivo/axes": 0.83.1 + "@nivo/colors": 0.83.1 + "@nivo/core": 0.83.1 + "@nivo/legends": 0.83.1 "@nivo/scales": 0.83.0 - "@nivo/tooltip": 0.83.0 - "@nivo/voronoi": 0.83.0 + "@nivo/tooltip": 0.83.1 + "@nivo/voronoi": 0.83.1 "@react-spring/web": 9.4.5 || ^9.7.2 d3-shape: ^1.3.5 prop-types: ^15.7.2 peerDependencies: react: ">= 16.14.0 < 19.0.0" - checksum: 9fcec539498aca10e6c13feed2595361a8800d52c286f497786cbedda33550220bda6c645e3203a0fd45c77efc7a43b712512baaa6aad6eeb47b81074cf3f8a1 + checksum: 0e8eb8f0086d02778c86c1f73ba9638ea77bad908757f3ad6c16d73830768197566bd5d7593ab5e1c907b6e3f35203244949a91a3b51e422b0c084b27d0539a7 languageName: node linkType: hard @@ -1397,28 +1397,28 @@ __metadata: languageName: node linkType: hard -"@nivo/tooltip@npm:0.83.0": - version: 0.83.0 - resolution: "@nivo/tooltip@npm:0.83.0" +"@nivo/tooltip@npm:0.83.1": + version: 0.83.1 + resolution: "@nivo/tooltip@npm:0.83.1" dependencies: - "@nivo/core": 0.83.0 + "@nivo/core": 0.83.1 "@react-spring/web": 9.4.5 || ^9.7.2 - checksum: d49627a3c5ce1d2af5098c1e7d7e6fad817e45cada3510835cb02739cecf23f7a4e2936d06ff32934fc884bc7ce8b8bcde2efa32eacba61c7620267adb0b2cdf + checksum: a61771eacb88c0728b23d57ae4a01a489994cb394e4839de49996d92ba0fecec509eaf0eb198ec1a82efb791575c5dc66d6f57cea073aaeb1dec65a59e170f53 languageName: node linkType: hard -"@nivo/voronoi@npm:0.83.0": - version: 0.83.0 - resolution: "@nivo/voronoi@npm:0.83.0" +"@nivo/voronoi@npm:0.83.1": + version: 0.83.1 + resolution: "@nivo/voronoi@npm:0.83.1" dependencies: - "@nivo/core": 0.83.0 + "@nivo/core": 0.83.1 "@types/d3-delaunay": ^5.3.0 "@types/d3-scale": ^3.2.3 d3-delaunay: ^5.3.0 d3-scale: ^3.2.3 peerDependencies: react: ">= 16.14.0 < 19.0.0" - checksum: 0adf6c9b584f070165357e8d7b6382cd7b096e3376930a2ae2b848da8c7178045e58167ba701d8f31a50c37bd78ec77a252544096430ce060f7452e1ca383105 + checksum: 7652b18331c06a9825a01142f6cf2d0149cd08f4ac84b6314e5c763932135f4701e87cff4db2cc2409e8b6a9d853ac4cc9b21774505e96260d7f7fbf583a2af9 languageName: node linkType: hard @@ -1471,7 +1471,7 @@ __metadata: languageName: node linkType: hard -"@panva/hkdf@npm:^1.0.2, @panva/hkdf@npm:^1.0.4": +"@panva/hkdf@npm:^1.0.2, @panva/hkdf@npm:^1.1.1": version: 1.1.1 resolution: "@panva/hkdf@npm:1.1.1" checksum: f0dd12903751d8792420353f809ed3c7de860cf506399759fff5f59f7acfef8a77e2b64012898cee7e5b047708fa0bd91dff5ef55a502bf8ea11aad9842160da @@ -1811,25 +1811,25 @@ __metadata: linkType: hard "@tabler/icons-react@npm:^2.20.0": - version: 2.40.0 - resolution: "@tabler/icons-react@npm:2.40.0" + version: 2.41.0 + resolution: "@tabler/icons-react@npm:2.41.0" dependencies: - "@tabler/icons": 2.40.0 + "@tabler/icons": 2.41.0 prop-types: ^15.7.2 peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 - checksum: e50255a18dd5c4c50a3bcd85caad4b71ca4d76e67bf21df9df4c2c0788dec1e9fcb306a15109eaa317a9d3d841e8c33f023dd7af9ac32a1e3e14abb798dfae5b + checksum: a7b90b2213a24012d9f0c95e2d84a7501c574b22ac345564b175533c93cb412da2349976f219cf5ca4aad7fb1889c8a3581e68da68b7572d6ae9900a8d48696f languageName: node linkType: hard -"@tabler/icons@npm:2.40.0": - version: 2.40.0 - resolution: "@tabler/icons@npm:2.40.0" - checksum: 0ac93afcb3499a8bc1a9bd8a545ef8f49b07cf9b653279ce1121773f0b04380300aa0b700d4a223da883628cfd4ee0939574dd663c15b8358f43c519b8a621c4 +"@tabler/icons@npm:2.41.0": + version: 2.41.0 + resolution: "@tabler/icons@npm:2.41.0" + checksum: 1d8a76654e1864e12966dd86320c5be81af66f7d904296b70982a984b8095f733c368a0146f975409256645b8ee9ff9a7c5fdcff418d279cb86bce4e1a1dd9db languageName: node linkType: hard -"@tanstack/match-sorter-utils@npm:^8.7.0": +"@tanstack/match-sorter-utils@npm:8.8.4, @tanstack/match-sorter-utils@npm:^8.7.0": version: 8.8.4 resolution: "@tanstack/match-sorter-utils@npm:8.8.4" dependencies: @@ -1879,6 +1879,43 @@ __metadata: languageName: node linkType: hard +"@tanstack/react-table@npm:8.10.6": + version: 8.10.6 + resolution: "@tanstack/react-table@npm:8.10.6" + dependencies: + "@tanstack/table-core": 8.10.6 + peerDependencies: + react: ">=16" + react-dom: ">=16" + checksum: 4b920fa36c70ed2de356c8c0e99f497f6ee8ab5bc74bc57f1f9aa8cc5d580ea3eb4a7743a03ad149fc43629efb157c592aba620141fb230d5529646dd6c7c002 + languageName: node + linkType: hard + +"@tanstack/react-virtual@npm:3.0.0-beta.63": + version: 3.0.0-beta.63 + resolution: "@tanstack/react-virtual@npm:3.0.0-beta.63" + dependencies: + "@tanstack/virtual-core": 3.0.0-beta.63 + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: b0b9f4e1bfa8d5d0b732e404df342f69e7c4092787e6f827808ac3df746f54c8e8b776af689dcf97ce5c99627893f40298c53643b25f721ff138c3a565234e28 + languageName: node + linkType: hard + +"@tanstack/table-core@npm:8.10.6": + version: 8.10.6 + resolution: "@tanstack/table-core@npm:8.10.6" + checksum: 05e7f15171f02053d1a9e552a7877e878a827635d3d4ed50387fa3d0e4ede9eb325eae758a4faa921dc2dd552302f4b49bb3b540e3511bff16b6a2b92d450429 + languageName: node + linkType: hard + +"@tanstack/virtual-core@npm:3.0.0-beta.63": + version: 3.0.0-beta.63 + resolution: "@tanstack/virtual-core@npm:3.0.0-beta.63" + checksum: 2c16aee993c2ef4a9e2c758427b640fabf450e670d7d599657fdaa596fb5d3c3d3c7808bd41acb7173082d1eaadeba098edde67245a68ea90813b3c7f2767b40 + languageName: node + linkType: hard + "@testing-library/dom@npm:^9.0.0": version: 9.3.3 resolution: "@testing-library/dom@npm:9.3.3" @@ -1896,8 +1933,8 @@ __metadata: linkType: hard "@testing-library/react@npm:^14.0.0": - version: 14.1.0 - resolution: "@testing-library/react@npm:14.1.0" + version: 14.1.2 + resolution: "@testing-library/react@npm:14.1.2" dependencies: "@babel/runtime": ^7.12.5 "@testing-library/dom": ^9.0.0 @@ -1905,7 +1942,7 @@ __metadata: peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: e76681911947f0981a1a72802ea01abeacdc4973c62deaf19c206cb9ff8d23eff5e3888c572303614686f029ee8a2a2dad6d0f0a9fb222944dbd9e0ea573b248 + checksum: 0269903e53412cf96fddb55c8a97a9987a89c3308d71fa1418fe61c47d275445e7044c5387f57cf39b8cda319a41623dbad2cce7a17016aed3a9e85185aac75a languageName: node linkType: hard @@ -2301,8 +2338,8 @@ __metadata: linkType: hard "@trivago/prettier-plugin-sort-imports@npm:^4.2.0": - version: 4.2.1 - resolution: "@trivago/prettier-plugin-sort-imports@npm:4.2.1" + version: 4.3.0 + resolution: "@trivago/prettier-plugin-sort-imports@npm:4.3.0" dependencies: "@babel/generator": 7.17.7 "@babel/parser": ^7.20.5 @@ -2316,53 +2353,53 @@ __metadata: peerDependenciesMeta: "@vue/compiler-sfc": optional: true - checksum: 7f40a31368e2718a7e23085f2bc7b6daf2f1f5841c42b3a238e5900770178b6a8addf1f873906b7b342bf6cdbca49004e73f884153dc927be77ad3d4d1697f70 + checksum: 22bb311ca24f09eef25915a66727e7be113b703f196f6ea0589dc9730b11a6f1e5e4bcc468213101d138b570d310792c83abb8d9487c53f9e597942fea052b6e languageName: node linkType: hard "@trpc/client@npm:^10.37.1": - version: 10.43.2 - resolution: "@trpc/client@npm:10.43.2" + version: 10.43.6 + resolution: "@trpc/client@npm:10.43.6" peerDependencies: - "@trpc/server": 10.43.2 - checksum: 07291bb21933328a473246871c50d6f8d45486d6d8aab5f05399ad68e64e0bd59f208ba09b4bf20bf884dede4fd56903dc28d13d5fa80d525d8168d7c68cf037 + "@trpc/server": 10.43.6 + checksum: 2d80771e19626c192780731eed5fc4db67612f4dfc45b1aca72fa3e8c6da1749edc504ecfe4232f28df2dee022d9fdc78a8c34ce5e314ec3f74fa365fa539e22 languageName: node linkType: hard "@trpc/next@npm:^10.37.1": - version: 10.43.2 - resolution: "@trpc/next@npm:10.43.2" + version: 10.43.6 + resolution: "@trpc/next@npm:10.43.6" dependencies: react-ssr-prepass: ^1.5.0 peerDependencies: "@tanstack/react-query": ^4.18.0 - "@trpc/client": 10.43.2 - "@trpc/react-query": 10.43.2 - "@trpc/server": 10.43.2 + "@trpc/client": 10.43.6 + "@trpc/react-query": 10.43.6 + "@trpc/server": 10.43.6 next: "*" react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 15b300900ee8c39e74057e1c4cee5b95aa7b1c0318f7d52d11ea19b8906814c529670b57b67f21ba4f15d76cbd5ccc8383e8223e74b9839e933c571ee29f8407 + checksum: cbd1e59f294c003fd17d5a953bac1590b15857743e86475bd9898b641a89db242180167d5c118fde09bf76c4c8580897bc3b7ffcc6c4a5053a29fd3ceeddc1f6 languageName: node linkType: hard "@trpc/react-query@npm:^10.37.1": - version: 10.43.2 - resolution: "@trpc/react-query@npm:10.43.2" + version: 10.43.6 + resolution: "@trpc/react-query@npm:10.43.6" peerDependencies: "@tanstack/react-query": ^4.18.0 - "@trpc/client": 10.43.2 - "@trpc/server": 10.43.2 + "@trpc/client": 10.43.6 + "@trpc/server": 10.43.6 react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 8d956bbf3fe624e7c5e69f64071a1ab3c50d0e49348edcb3484a4639cb08b76cfa5012aba5f27af1cd9fe54242eb8afcf50aaa491e7ffdcddc50169ca73469eb + checksum: 3bf947618f01e515d23b84f3287e1cb7fbee55b66dcad5dd24a0e7264fb4a08acef22288e0f2e7ce67eb04e628cdf30a6e1aa190732f2e9938c6b11bfb3c137d languageName: node linkType: hard "@trpc/server@npm:^10.37.1": - version: 10.43.2 - resolution: "@trpc/server@npm:10.43.2" - checksum: aca01245576f781d581085a446b628f2d95e3ad1ac59bff7fe3bf475fbe5f6008462e956ae1adf4916929eefa8f18ef04e60cd1be2b197c155669ab3231be550 + version: 10.43.6 + resolution: "@trpc/server@npm:10.43.6" + checksum: 51ca1bc79e61c200f46cc8597761ac38af1ac5464458ab45ebba0c342640c0c4b54d57d361f06616e0c315542478d9862394cb80306891c8f2452cfb75641dd5 languageName: node linkType: hard @@ -2427,7 +2464,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.20.3": +"@types/babel__core@npm:^7.20.4": version: 7.20.4 resolution: "@types/babel__core@npm:7.20.4" dependencies: @@ -2751,11 +2788,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 20.9.0 - resolution: "@types/node@npm:20.9.0" + version: 20.9.1 + resolution: "@types/node@npm:20.9.1" dependencies: undici-types: ~5.26.4 - checksum: bfd927da6bff8a32051fa44bb47ca32a56d2c8bc8ba0170770f181cc1fa3c0b05863c9b930f0ba8604a48d5eb0d319166601709ca53bf2deae0025d8b6c6b8a3 + checksum: bb893c6790733dac32818c1ca170fa466622dec39a0ade4639463e1358cb811771e242accbd065e7a1bfe59adc989c0ee59be65e462d3a0ab49043426f0b7637 languageName: node linkType: hard @@ -2942,14 +2979,14 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^6.0.0": - version: 6.10.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.10.0" + version: 6.11.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.11.0" dependencies: "@eslint-community/regexpp": ^4.5.1 - "@typescript-eslint/scope-manager": 6.10.0 - "@typescript-eslint/type-utils": 6.10.0 - "@typescript-eslint/utils": 6.10.0 - "@typescript-eslint/visitor-keys": 6.10.0 + "@typescript-eslint/scope-manager": 6.11.0 + "@typescript-eslint/type-utils": 6.11.0 + "@typescript-eslint/utils": 6.11.0 + "@typescript-eslint/visitor-keys": 6.11.0 debug: ^4.3.4 graphemer: ^1.4.0 ignore: ^5.2.4 @@ -2962,25 +2999,25 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: eaf1f66ae1915426dad8d229c8cb80d2b320572a30c3fbc57d560d40edc2d17d004101a2fcbe331bc458df19a00f8b705f2442ee02e028bb595f4e9f9152e99d + checksum: 8ba9ce7ce8609a044e405baf57cc84d6973d7676950c870288d7eae2dba44b36664e3f4d90b94a4de08e17259fe8baa7790750cd4e5391dbe2a2743497d7fae2 languageName: node linkType: hard "@typescript-eslint/parser@npm:^5.4.2 || ^6.0.0, @typescript-eslint/parser@npm:^6.0.0": - version: 6.10.0 - resolution: "@typescript-eslint/parser@npm:6.10.0" + version: 6.11.0 + resolution: "@typescript-eslint/parser@npm:6.11.0" dependencies: - "@typescript-eslint/scope-manager": 6.10.0 - "@typescript-eslint/types": 6.10.0 - "@typescript-eslint/typescript-estree": 6.10.0 - "@typescript-eslint/visitor-keys": 6.10.0 + "@typescript-eslint/scope-manager": 6.11.0 + "@typescript-eslint/types": 6.11.0 + "@typescript-eslint/typescript-estree": 6.11.0 + "@typescript-eslint/visitor-keys": 6.11.0 debug: ^4.3.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: c4b140932d639b3f3eac892497aa700bcc9101ef268285020757dc9bee670d122de107e936320af99a5c06569e4eb93bccf87f14a9970ceab708c432e748423a + checksum: e9cb175e3537b82aa8cd39641ecb4e656586f89f8365cf05400b5aa8794dac0c8c10c6aa2fd7c13a684f62c1493f5e41c5534df49d377abe9dc89d861a51195c languageName: node linkType: hard @@ -2994,22 +3031,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.10.0": - version: 6.10.0 - resolution: "@typescript-eslint/scope-manager@npm:6.10.0" +"@typescript-eslint/scope-manager@npm:6.11.0": + version: 6.11.0 + resolution: "@typescript-eslint/scope-manager@npm:6.11.0" dependencies: - "@typescript-eslint/types": 6.10.0 - "@typescript-eslint/visitor-keys": 6.10.0 - checksum: c9b9483082ae853f10b888cf04d4a14f666ac55e749bfdb7b7f726fc51127a6340b5e2f50d93f134a8854ddcc41f7b116b214753251a8b033d0d84c600439c54 + "@typescript-eslint/types": 6.11.0 + "@typescript-eslint/visitor-keys": 6.11.0 + checksum: d219a96fd80fb14176cdcc47b070e870c73ccc0dfb32a8657f6ceaefb613dc0ea240a77250dcfc437d9c9360ca165c2765d4cf8fe689dae7e9eee2c0d6a98a50 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.10.0": - version: 6.10.0 - resolution: "@typescript-eslint/type-utils@npm:6.10.0" +"@typescript-eslint/type-utils@npm:6.11.0": + version: 6.11.0 + resolution: "@typescript-eslint/type-utils@npm:6.11.0" dependencies: - "@typescript-eslint/typescript-estree": 6.10.0 - "@typescript-eslint/utils": 6.10.0 + "@typescript-eslint/typescript-estree": 6.11.0 + "@typescript-eslint/utils": 6.11.0 debug: ^4.3.4 ts-api-utils: ^1.0.1 peerDependencies: @@ -3017,7 +3054,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: cfe9520cf0c0f50b115d2591acb2abf99ffe5789b3536268ca65b624c8498812d91f187e80c41bea7cf2cebad9c38f69ef27440f872a20fb53c59856d8f5df38 + checksum: 2effbe62ae3b12f8a88663072f68a5dcb1135d9ee3c09a0d9fcf49b943837c0a5966e907d4a1a15c27ddf82af2fcf7f6e004655d3e1f7a17c21596469771ff7d languageName: node linkType: hard @@ -3028,10 +3065,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:6.10.0": - version: 6.10.0 - resolution: "@typescript-eslint/types@npm:6.10.0" - checksum: e63a9e05eb3d736d02a09131627d5cb89394bf0d9d6b46fb4b620be902d89d73554720be65acbc194787bff9ffcd518c9a6cf88fd63e418232b4181e8d8438df +"@typescript-eslint/types@npm:6.11.0": + version: 6.11.0 + resolution: "@typescript-eslint/types@npm:6.11.0" + checksum: ca8a11320286c9b0759a70ec83b9fd99937c9686fafdd41d8ea09ed7b2fa12e6b342bf65547efe5495926cd04cfc6488315920e3caffd27f12d42cb9a8cf88c8 languageName: node linkType: hard @@ -3053,12 +3090,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.10.0": - version: 6.10.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.10.0" +"@typescript-eslint/typescript-estree@npm:6.11.0": + version: 6.11.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.11.0" dependencies: - "@typescript-eslint/types": 6.10.0 - "@typescript-eslint/visitor-keys": 6.10.0 + "@typescript-eslint/types": 6.11.0 + "@typescript-eslint/visitor-keys": 6.11.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -3067,24 +3104,24 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 15bd8d9239a557071d6b03e7aa854b769fcc2dbdff587ed94be7ee8060dabdb05bcae4251df22432f625f82087e7f6986e9aab04f7eea35af694d4edd76a21af + checksum: e137ba7c4cad08853a44d9c40072496ca5f2d440828be9fd2d207a59db56b05a6dcb4756f3ba341ee2ae714de45df80114477946d30801c5a46eed67314fd9c6 languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.10.0, @typescript-eslint/utils@npm:^6.2.0": - version: 6.10.0 - resolution: "@typescript-eslint/utils@npm:6.10.0" +"@typescript-eslint/utils@npm:6.11.0, @typescript-eslint/utils@npm:^6.2.0": + version: 6.11.0 + resolution: "@typescript-eslint/utils@npm:6.11.0" dependencies: "@eslint-community/eslint-utils": ^4.4.0 "@types/json-schema": ^7.0.12 "@types/semver": ^7.5.0 - "@typescript-eslint/scope-manager": 6.10.0 - "@typescript-eslint/types": 6.10.0 - "@typescript-eslint/typescript-estree": 6.10.0 + "@typescript-eslint/scope-manager": 6.11.0 + "@typescript-eslint/types": 6.11.0 + "@typescript-eslint/typescript-estree": 6.11.0 semver: ^7.5.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: b6bd4d68623fb8d616ae63a88f2954258411a0cc113029fba801d1e74b4c0319fdfbcac0070527afe5cc38c012c8718e4faecd1603000924d7b89e8fefc3f24d + checksum: e90aa2c8c56038a48de65a5303f9e4a4a70bb0d4d0a05cfcd28157fc0f06b2fc186c2e76a495f4540a903ea37577daa1403bab923d940114ec27a6326153d60f languageName: node linkType: hard @@ -3116,13 +3153,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.10.0": - version: 6.10.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.10.0" +"@typescript-eslint/visitor-keys@npm:6.11.0": + version: 6.11.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.11.0" dependencies: - "@typescript-eslint/types": 6.10.0 + "@typescript-eslint/types": 6.11.0 eslint-visitor-keys: ^3.4.1 - checksum: 9640bfae41e6109ffba31e68b1720382de0538d021261e2fc9e514c83c703084393c0818ca77ed26b950273e45e593371120281e8d4bbd09cb8c2d46c9fe4f03 + checksum: 6aae9dd79963bbefbf2e310015b909627da541a13ab4d8359eea3c86c34fdbb91e583f65b5a99dee1959f7c5d67b21b45e5a05c63ddb4b82dacd60c890ce8b25 languageName: node linkType: hard @@ -3185,17 +3222,17 @@ __metadata: linkType: hard "@vitejs/plugin-react@npm:^4.0.0": - version: 4.1.1 - resolution: "@vitejs/plugin-react@npm:4.1.1" + version: 4.2.0 + resolution: "@vitejs/plugin-react@npm:4.2.0" dependencies: - "@babel/core": ^7.23.2 - "@babel/plugin-transform-react-jsx-self": ^7.22.5 - "@babel/plugin-transform-react-jsx-source": ^7.22.5 - "@types/babel__core": ^7.20.3 + "@babel/core": ^7.23.3 + "@babel/plugin-transform-react-jsx-self": ^7.23.3 + "@babel/plugin-transform-react-jsx-source": ^7.23.3 + "@types/babel__core": ^7.20.4 react-refresh: ^0.14.0 peerDependencies: - vite: ^4.2.0 - checksum: 275132ab1e4c227326396aeee93084f20bbe5f0fbe92d45813f3eacd0766eb6e8cd83ee222f90411aefad1ce60fbd31766a8e4725e7bb36914f2bba37afbdebf + vite: ^4.2.0 || ^5.0.0 + checksum: 515dc270dc433d9d80806501221d152f627aabc342916e9dc0d1d840fec76bc00daf3e41738f9aad286de89ee9325fd423372298bd04a3bfd618601ae62d515d languageName: node linkType: hard @@ -3738,13 +3775,13 @@ __metadata: linkType: hard "axios@npm:^1.0.0": - version: 1.6.1 - resolution: "axios@npm:1.6.1" + version: 1.6.2 + resolution: "axios@npm:1.6.2" dependencies: follow-redirects: ^1.15.0 form-data: ^4.0.0 proxy-from-env: ^1.1.0 - checksum: 573f03f59b7487d54551b16f5e155d1d130ad4864ed32d1da93d522b78a57123b34e3bde37f822a65ee297e79f1db840f9ad6514addff50d3cbf5caeed39e8dc + checksum: 4a7429e2b784be0f2902ca2680964391eae7236faa3967715f30ea45464b98ae3f1c6f631303b13dfe721b17126b01f486c7644b9ef276bfc63112db9fd379f8 languageName: node linkType: hard @@ -4280,9 +4317,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001406, caniuse-lite@npm:^1.0.30001541": - version: 1.0.30001561 - resolution: "caniuse-lite@npm:1.0.30001561" - checksum: 949829fe037e23346595614e01d362130245920503a12677f2506ce68e1240360113d6383febed41e8aa38cd0f5fd9c69c21b0af65a71c0246d560db489f1373 + version: 1.0.30001563 + resolution: "caniuse-lite@npm:1.0.30001563" + checksum: c90a1e6efc72fc73ad4a756011242211406883b36dde3a01726e7246281dcbceaf78e1ee61d1298624c4a69cf81c12b41e8d2a2f1b7c89ed84c9333026a0bfbd languageName: node linkType: hard @@ -4835,7 +4872,7 @@ __metadata: languageName: node linkType: hard -"d3-color@npm:^3.1.0": +"d3-color@npm:1 - 3, d3-color@npm:^3.1.0": version: 3.1.0 resolution: "d3-color@npm:3.1.0" checksum: 4931fbfda5d7c4b5cfa283a13c91a954f86e3b69d75ce588d06cde6c3628cebfc3af2069ccf225e982e8987c612aa7948b3932163ce15eb3c11cd7c003f3ee3b @@ -4865,7 +4902,7 @@ __metadata: languageName: node linkType: hard -"d3-interpolate@npm:1 - 2, d3-interpolate@npm:1.2.0 - 2, d3-interpolate@npm:^2.0.1": +"d3-interpolate@npm:1 - 2, d3-interpolate@npm:1.2.0 - 2": version: 2.0.1 resolution: "d3-interpolate@npm:2.0.1" dependencies: @@ -4874,6 +4911,15 @@ __metadata: languageName: node linkType: hard +"d3-interpolate@npm:1 - 3, d3-interpolate@npm:^3.0.1": + version: 3.0.1 + resolution: "d3-interpolate@npm:3.0.1" + dependencies: + d3-color: 1 - 3 + checksum: a42ba314e295e95e5365eff0f604834e67e4a3b3c7102458781c477bd67e9b24b6bb9d8e41ff5521050a3f2c7c0c4bbbb6e187fd586daa3980943095b267e78b + languageName: node + linkType: hard + "d3-path@npm:1": version: 1.0.9 resolution: "d3-path@npm:1.0.9" @@ -4891,6 +4937,16 @@ __metadata: languageName: node linkType: hard +"d3-scale-chromatic@npm:^3.0.0": + version: 3.0.0 + resolution: "d3-scale-chromatic@npm:3.0.0" + dependencies: + d3-color: 1 - 3 + d3-interpolate: 1 - 3 + checksum: a8ce4cb0267a17b28ebbb929f5e3071d985908a9c13b6fcaa2a198e1e018f275804d691c5794b970df0049725b7944f32297b31603d235af6414004f0c7f82c0 + languageName: node + linkType: hard + "d3-scale@npm:^3.2.3": version: 3.3.0 resolution: "d3-scale@npm:3.3.0" @@ -5495,9 +5551,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.535": - version: 1.4.579 - resolution: "electron-to-chromium@npm:1.4.579" - checksum: 42fcb8608c68f8c7568d1ef6cd48f6a2133f1089e26b203ead7eed47cf0c15ece66824de8076d51b11f2693598cec5cf756fbb67dfa7a70e7cdfaadd26ae257b + version: 1.4.588 + resolution: "electron-to-chromium@npm:1.4.588" + checksum: 446bdd4754183a6635c535c31ffc2c61d0679692b72e2b63f13fc0fcdfc0d2a4db9f8214ee71d9b862d8b63b14e2c5ed122bb5cd5538dc8899b76aff7e4628d6 languageName: node linkType: hard @@ -6129,13 +6185,13 @@ __metadata: linkType: hard "eslint@npm:^8.0.1": - version: 8.53.0 - resolution: "eslint@npm:8.53.0" + version: 8.54.0 + resolution: "eslint@npm:8.54.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.6.1 "@eslint/eslintrc": ^2.1.3 - "@eslint/js": 8.53.0 + "@eslint/js": 8.54.0 "@humanwhocodes/config-array": ^0.11.13 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 @@ -6172,7 +6228,7 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 2da808655c7aa4b33f8970ba30d96b453c3071cc4d6cd60d367163430677e32ff186b65270816b662d29139283138bff81f28dddeb2e73265495245a316ed02c + checksum: 7e876e9da2a18a017271cf3733d05a3dfbbe469272d75753408c6ea5b1646c71c6bb18cb91e10ca930144c32c1ce3701e222f1ae6784a3975a69f8f8aa68e49f languageName: node linkType: hard @@ -6400,13 +6456,13 @@ __metadata: linkType: hard "flat-cache@npm:^3.0.4": - version: 3.1.1 - resolution: "flat-cache@npm:3.1.1" + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" dependencies: flatted: ^3.2.9 keyv: ^4.5.3 rimraf: ^3.0.2 - checksum: 4958cfe0f46acf84953d4e16676ef5f0d38eab3a92d532a1e8d5f88f11eea8b36d5d598070ff2aeae15f1fde18f8d7d089eefaf9db10b5a587cc1c9072325c7a + checksum: e7e0f59801e288b54bee5cb9681e9ee21ee28ef309f886b312c9d08415b79fc0f24ac842f84356ce80f47d6a53de62197ce0e6e148dc42d5db005992e2a756ec languageName: node linkType: hard @@ -6492,8 +6548,8 @@ __metadata: linkType: hard "framer-motion@npm:^10.0.0": - version: 10.16.4 - resolution: "framer-motion@npm:10.16.4" + version: 10.16.5 + resolution: "framer-motion@npm:10.16.5" dependencies: "@emotion/is-prop-valid": ^0.8.2 tslib: ^2.4.0 @@ -6508,7 +6564,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 57eb252f25a2c4ee14b024295c6a1162a53a05e0321bdb9c8a22ec266fbe777832823eaa0309e42854170fcde16c42915c6c5d0208b628fd000d6fab013c501f + checksum: 189e26745c860390d9320586c11248c81c63edf093cda33f95cc6f5e5a31fdf09ed64319c8303923692c36beb5cf56a1a40a32c70520d55df37b7d77a690aeb0 languageName: node linkType: hard @@ -7160,6 +7216,10 @@ __metadata: html-entities: ^2.3.3 i18next: ^22.5.1 immer: ^10.0.2 + js-file-download: ^0.4.12 + mantine-react-table: ^1.3.4 + moment: ^2.29.4 + moment-timezone: ^0.5.43 next: 13.4.12 next-auth: ^4.23.0 next-i18next: ^14.0.0 @@ -7298,12 +7358,12 @@ __metadata: linkType: hard "http2-wrapper@npm:^2.1.10": - version: 2.2.0 - resolution: "http2-wrapper@npm:2.2.0" + version: 2.2.1 + resolution: "http2-wrapper@npm:2.2.1" dependencies: quick-lru: ^5.1.1 resolve-alpn: ^1.2.0 - checksum: 6fd20e5cb6a58151715b3581e06a62a47df943187d2d1f69e538a50cccb7175dd334ecfde7900a37d18f3e13a1a199518a2c211f39860e81e9a16210c199cfaa + checksum: e95e55e22c6fd61182ce81fecb9b7da3af680d479febe8ad870d05f7ebbc9f076e455193766f4e7934e50913bf1d8da3ba121fb5cd2928892390b58cf9d5c509 languageName: node linkType: hard @@ -7325,9 +7385,9 @@ __metadata: linkType: hard "i18next-fs-backend@npm:^2.1.5": - version: 2.2.0 - resolution: "i18next-fs-backend@npm:2.2.0" - checksum: 33e00ccc8ec66a9fc20363513c3189a201a59e8601f167f0483c0a0d53ecee1dd4bb43b83d0f5661784e7a7ca3e43cd9c771d426cec73d8f819b9b823b77d724 + version: 2.3.0 + resolution: "i18next-fs-backend@npm:2.3.0" + checksum: ca7f1679a31ca1404e8e924d1857cbe58d36f945b3e1dc6fda615708da112d92352fc380e4d48533796e4a189a7007aca28cce6c6c5e64911845b8d8c0818516 languageName: node linkType: hard @@ -7364,9 +7424,9 @@ __metadata: linkType: hard "ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef + version: 5.3.0 + resolution: "ignore@npm:5.3.0" + checksum: 2736da6621f14ced652785cb05d86301a66d70248597537176612bd0c8630893564bd5f6421f8806b09e8472e75c591ef01672ab8059c07c6eb2c09cefe04bf9 languageName: node linkType: hard @@ -7965,13 +8025,27 @@ __metadata: languageName: node linkType: hard -"jose@npm:^4.11.1, jose@npm:^4.11.4, jose@npm:^4.15.1": +"jose@npm:^4.11.4, jose@npm:^4.15.1": version: 4.15.4 resolution: "jose@npm:4.15.4" checksum: dccad91cb3357f36423774a0b89ad830dd84b31090de65cd139b85488439f16a00f8c59c0773825e8a1adb0dd9d13ad725ad66e6ea33880ecb3959bb99e1ea5b languageName: node linkType: hard +"jose@npm:^5.1.0": + version: 5.1.1 + resolution: "jose@npm:5.1.1" + checksum: 3a18d85dd1ed0e7746c67cba65a95ee972f20b363ceb99a9d75b870beb34942089cfca6249c4a50a79bc854c5a052f1be39e814c42b0f00f9358e902ce706e8d + languageName: node + linkType: hard + +"js-file-download@npm:^0.4.12": + version: 0.4.12 + resolution: "js-file-download@npm:0.4.12" + checksum: a03847eef0184fbf34a7b7fd365ea6aa1a6cc142efeac52c4baa0cdde845dc93718eb66808dfcffd6c91b37ddc9d058d352ac9698b4280744bad3587240c93b6 + languageName: node + linkType: hard + "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -8359,9 +8433,11 @@ __metadata: linkType: hard "lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.0.1 - resolution: "lru-cache@npm:10.0.1" - checksum: 06f8d0e1ceabd76bb6f644a26dbb0b4c471b79c7b514c13c6856113879b3bf369eb7b497dad4ff2b7e2636db202412394865b33c332100876d838ad1372f0181 + version: 10.0.2 + resolution: "lru-cache@npm:10.0.2" + dependencies: + semver: ^7.3.5 + checksum: 83ad0e899d79f48574bdda131fe8157c6d65cbd073a6e78e0d1a3467a85dce1ef4d8dc9fd618a56c57a068271501c81d54471e13f84dd121e046b155ed061ed4 languageName: node linkType: hard @@ -8474,6 +8550,25 @@ __metadata: languageName: node linkType: hard +"mantine-react-table@npm:^1.3.4": + version: 1.3.4 + resolution: "mantine-react-table@npm:1.3.4" + dependencies: + "@tanstack/match-sorter-utils": 8.8.4 + "@tanstack/react-table": 8.10.6 + "@tanstack/react-virtual": 3.0.0-beta.63 + peerDependencies: + "@emotion/react": ">=11" + "@mantine/core": ^6.0 + "@mantine/dates": ^6.0 + "@mantine/hooks": ^6.0 + "@tabler/icons-react": ">=2.23" + react: ">=18.0" + react-dom: ">=18.0" + checksum: 21165735d0963cd63f7d301ad382708d5d9334ffdb02050b04af34caffad8d76c5c494407f3f09b92a90130cb3581f02e58927edd2fa965ba67f199295cd6033 + languageName: node + linkType: hard + "markdown-it@npm:^13.0.1": version: 13.0.2 resolution: "markdown-it@npm:13.0.2" @@ -8531,9 +8626,9 @@ __metadata: linkType: hard "merge-descriptors@npm:^1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 52117adbe0313d5defa771c9993fe081e2d2df9b840597e966aadafde04ae8d0e3da46bac7ca4efc37d4d2b839436582659cd49c6a43eacb3fe3050896a105d1 languageName: node linkType: hard @@ -8822,6 +8917,22 @@ __metadata: languageName: node linkType: hard +"moment-timezone@npm:^0.5.43": + version: 0.5.43 + resolution: "moment-timezone@npm:0.5.43" + dependencies: + moment: ^2.29.4 + checksum: 8075c897ed8a044f992ef26fe8cdbcad80caf974251db424cae157473cca03be2830de8c74d99341b76edae59f148c9d9d19c1c1d9363259085688ec1cf508d0 + languageName: node + linkType: hard + +"moment@npm:^2.29.4": + version: 2.29.4 + resolution: "moment@npm:2.29.4" + checksum: 0ec3f9c2bcba38dc2451b1daed5daded747f17610b92427bebe1d08d48d8b7bdd8d9197500b072d14e326dd0ccf3e326b9e3d07c5895d3d49e39b6803b76e80e + languageName: node + linkType: hard + "mpd-parser@npm:^1.0.1, mpd-parser@npm:^1.2.2": version: 1.2.2 resolution: "mpd-parser@npm:1.2.2" @@ -8919,8 +9030,8 @@ __metadata: linkType: hard "next-auth@npm:^4.23.0": - version: 4.24.4 - resolution: "next-auth@npm:4.24.4" + version: 4.24.5 + resolution: "next-auth@npm:4.24.5" dependencies: "@babel/runtime": ^7.20.13 "@panva/hkdf": ^1.0.2 @@ -8939,7 +9050,7 @@ __metadata: peerDependenciesMeta: nodemailer: optional: true - checksum: 93d14137609f0759da35173b648f882d505b6a04d1366f73ddabd8cf88c4198439960c1167c3ace0c09396aea26d3d4a9996e7f29db3c4a1b1db46ceb9b323e2 + checksum: 7cc49385123690ccb908f4552b75012717c4e45205a9fdc7cf48cd730dbcc7823a3e33e2a2073ecf1edae5c1980123f68678fd4af9198ea21ab0decb630cc71e languageName: node linkType: hard @@ -9152,10 +9263,10 @@ __metadata: languageName: node linkType: hard -"oauth4webapi@npm:^2.0.6": - version: 2.3.0 - resolution: "oauth4webapi@npm:2.3.0" - checksum: abe1aa9997f8cd779b661ca60b378d50de039b624f89c0a72574c65141432bca6a319116362cae49197f687b6e08d01d76476f74545f074071cbb63303d86fab +"oauth4webapi@npm:^2.3.0": + version: 2.4.0 + resolution: "oauth4webapi@npm:2.4.0" + checksum: 9e6d5be3966013aa9dd61781032a6bd07a63166a9819f2fc0d622d33b23221ea39ae25334a4bde9eba4623e576972d367b196e3b5d3facff75002125c510b672 languageName: node linkType: hard @@ -9691,9 +9802,9 @@ __metadata: linkType: hard "preact@npm:^10.6.3": - version: 10.18.2 - resolution: "preact@npm:10.18.2" - checksum: 84fb8c3259c0b929f662856c075b41f7faaa20f28db0524549998aa892c8e3e990e9d1344e278506ed762f7975a976ec3c62494b972ad95e7af1354b79647d3f + version: 10.19.2 + resolution: "preact@npm:10.19.2" + checksum: fec27fa3f14ac2d7a5061818d0cf2973ffaece83126047a47e5a075aa8e40ca56b5fcebc36106ee9cf59be0aeb51f3d996760e158d2a2660b42cbfb2e71f37bf languageName: node linkType: hard @@ -9727,11 +9838,11 @@ __metadata: linkType: hard "prettier@npm:^3.0.0": - version: 3.0.3 - resolution: "prettier@npm:3.0.3" + version: 3.1.0 + resolution: "prettier@npm:3.1.0" bin: prettier: bin/prettier.cjs - checksum: e10b9af02b281f6c617362ebd2571b1d7fc9fb8a3bd17e371754428cda992e5e8d8b7a046e8f7d3e2da1dcd21aa001e2e3c797402ebb6111b5cd19609dd228e0 + checksum: 44b556bd56f74d7410974fbb2418bb4e53a894d3e7b42f6f87779f69f27a6c272fa7fc27cec0118cd11730ef3246478052e002cbd87e9a253f9cd04a56aa7d9b languageName: node linkType: hard @@ -9887,12 +9998,12 @@ __metadata: linkType: hard "prosemirror-inputrules@npm:^1.2.0": - version: 1.2.1 - resolution: "prosemirror-inputrules@npm:1.2.1" + version: 1.3.0 + resolution: "prosemirror-inputrules@npm:1.3.0" dependencies: prosemirror-state: ^1.0.0 prosemirror-transform: ^1.0.0 - checksum: fc414d8376a09ad2a403be682b60c883d69c9fa249dddef3956707f0cd50500c8bd427fb5696c6836f546dbc8241120ffe5d806142bb2d77bbac31c7a9dbf704 + checksum: 0ef322908aa0be1777c27e869a8c3f8499d1a4da3a619726bdae6327588bbd4904d189d34852f69b5560341ae3f53e4b40215d052ceadcd8d3f6c253b29ccf08 languageName: node linkType: hard @@ -11056,9 +11167,9 @@ __metadata: linkType: hard "std-env@npm:^3.3.3": - version: 3.4.3 - resolution: "std-env@npm:3.4.3" - checksum: bef186fb2baddda31911234b1e58fa18f181eb6930616aaec3b54f6d5db65f2da5daaa5f3b326b98445a7d50ca81d6fe8809ab4ebab85ecbe4a802f1b40921bf + version: 3.5.0 + resolution: "std-env@npm:3.5.0" + checksum: 8eba87eab2d6933e0575f13a65a359952a2e3e8c4d24eb55beac5500fe0403b3482c7b59a5de8d035ae13d390c76dd6c677772f9d2a89ea7cf39ae267b71bdd3 languageName: node linkType: hard @@ -11974,9 +12085,9 @@ __metadata: linkType: hard "ufo@npm:^1.3.0": - version: 1.3.1 - resolution: "ufo@npm:1.3.1" - checksum: 2db2f9d24e3f572ddb9b2f4415eda679fd366cbb9eec4c56996651323737f17528b4aab2bb45c5f2effff2304f9b0c46e0981aee3e48f38ac51106a8993dff31 + version: 1.3.2 + resolution: "ufo@npm:1.3.2" + checksum: f1180bb715ff4dd46152fd4dec41c731e84d7b9eaf1432548a0210b2f7e0cd29de125ac88e582c6a079d8ae5bc9ab04ef2bdbafe125086480b10c1006b81bfce languageName: node linkType: hard From 976634a908482b2f17474b339f8140f8d0d21be3 Mon Sep 17 00:00:00 2001 From: Tagaishi Date: Thu, 7 Dec 2023 18:30:49 +0100 Subject: [PATCH 15/28] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Improve=20code=20in?= =?UTF-8?q?=20manage=20layout=20page=20(#1681)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Thomas Camlong --- .../layout/Templates/ManageLayout.tsx | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/components/layout/Templates/ManageLayout.tsx b/src/components/layout/Templates/ManageLayout.tsx index 6634597a1..a88ea2868 100644 --- a/src/components/layout/Templates/ManageLayout.tsx +++ b/src/components/layout/Templates/ManageLayout.tsx @@ -201,20 +201,14 @@ export const ManageLayout = ({ children }: ManageLayoutProps) => { const matchesActive = router.pathname.endsWith(item.href); - if (item.href.startsWith('http')) { - return ( - - ); - } - return ( - + ); })} From 199b71132460dd6fea1778e3ca7d1dcb6e35ea35 Mon Sep 17 00:00:00 2001 From: gleb Date: Sun, 17 Dec 2023 20:06:51 +0300 Subject: [PATCH 16/28] Updated entityStateSchema to handle nullables (#1744) Co-authored-by: Gleb Fomichev --- src/tools/server/sdk/homeassistant/models/EntityState.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/server/sdk/homeassistant/models/EntityState.ts b/src/tools/server/sdk/homeassistant/models/EntityState.ts index de3f3ffc0..09eb9b2f2 100644 --- a/src/tools/server/sdk/homeassistant/models/EntityState.ts +++ b/src/tools/server/sdk/homeassistant/models/EntityState.ts @@ -2,7 +2,7 @@ import { z } from 'zod'; export const entityStateSchema = z.object({ - attributes: z.record(z.union([z.string(), z.number(), z.boolean()])), + attributes: z.record(z.union([z.string(), z.number(), z.boolean(), z.null()])), entity_id: z.string(), last_changed: z.string().pipe(z.coerce.date()), last_updated: z.string().pipe(z.coerce.date()), From 553fa98e6143027ffe865be9dda62a5825babc7d Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Wed, 20 Dec 2023 10:18:24 +0100 Subject: [PATCH 17/28] =?UTF-8?q?=E2=9C=A8=20#1616=20better=20user=20manag?= =?UTF-8?q?ement=20(#1748)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/locales/en/manage/users.json | 12 +- public/locales/en/manage/users/edit.json | 55 ++++ .../Manage/User/Edit/GeneralForm.tsx | 81 ++++++ .../Manage/User/Edit/ManageUserDanger.tsx | 83 ++++++ .../Manage/User/Edit/ManageUserRoles.tsx | 65 +++++ .../User/Edit/ManageUserSecurityForm.tsx | 91 ++++++ .../Manage/User/change-user-role.modal.tsx | 1 + src/pages/manage/users/[userId]/edit.tsx | 90 ++++++ src/pages/manage/users/index.tsx | 260 +++++++++++------- src/server/api/routers/user.ts | 148 ++++++++-- src/tools/server/translation-namespaces.ts | 1 + 11 files changed, 760 insertions(+), 127 deletions(-) create mode 100644 public/locales/en/manage/users/edit.json create mode 100644 src/components/Manage/User/Edit/GeneralForm.tsx create mode 100644 src/components/Manage/User/Edit/ManageUserDanger.tsx create mode 100644 src/components/Manage/User/Edit/ManageUserRoles.tsx create mode 100644 src/components/Manage/User/Edit/ManageUserSecurityForm.tsx create mode 100644 src/pages/manage/users/[userId]/edit.tsx diff --git a/public/locales/en/manage/users.json b/public/locales/en/manage/users.json index 576f072a6..5e016c946 100644 --- a/public/locales/en/manage/users.json +++ b/public/locales/en/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Users", "pageTitle": "Manage users", - "text": "Using users, you can configure who can edit your dashboards. Future versions of Homarr will have even more granular control over permissions and boards.", "buttons": { "create": "Create" }, + "filter": { + "roles": { + "all": "All", + "normal": "Normal", + "admin": "Admin", + "owner": "Owner" + } + }, "table": { "header": { - "user": "User" + "user": "User", + "email": "E-Mail" } }, "tooltips": { diff --git a/public/locales/en/manage/users/edit.json b/public/locales/en/manage/users/edit.json new file mode 100644 index 000000000..543853b5b --- /dev/null +++ b/public/locales/en/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "User {{username}}", + "back": "Back to user management", + "sections": { + "general": { + "title": "General", + "inputs": { + "username": { + "label": "Username" + }, + "eMail": { + "label": "E-Mail" + } + } + }, + "security": { + "title": "Security", + "inputs": { + "password": { + "label": "New password" + }, + "terminateExistingSessions": { + "label": "Terminate existing sessions", + "description": "Forces user to log in again on their devices" + }, + "confirm": { + "label": "Confirm", + "description": "Password will be updated. Action cannot be reverted." + } + } + }, + "roles": { + "title": "Roles", + "currentRole": "Current role: ", + "badges": { + "owner": "Owner", + "admin": "Admin", + "normal": "Normal" + } + }, + "deletion": { + "title": "Account deletion", + "inputs": { + "confirmUsername": { + "label": "Confirm username", + "description": "Type username to confirm deletion" + }, + "confirm": { + "label": "Delete permanently", + "description": "I am aware that this action is permanent and all account data will be lost." + } + } + } + } +} \ No newline at end of file diff --git a/src/components/Manage/User/Edit/GeneralForm.tsx b/src/components/Manage/User/Edit/GeneralForm.tsx new file mode 100644 index 000000000..f5c94172d --- /dev/null +++ b/src/components/Manage/User/Edit/GeneralForm.tsx @@ -0,0 +1,81 @@ +import { Box, Button, Group, TextInput, Title } from '@mantine/core'; +import { useForm, zodResolver } from '@mantine/form'; +import { IconAt, IconCheck, IconLetterCase } from '@tabler/icons-react'; +import { useTranslation } from 'next-i18next'; +import { z } from 'zod'; +import { api } from '~/utils/api'; + +export const ManageUserGeneralForm = ({ + userId, + defaultUsername, + defaultEmail, +}: { + userId: string; + defaultUsername: string; + defaultEmail: string; +}) => { + const form = useForm({ + initialValues: { + username: defaultUsername, + eMail: defaultEmail, + }, + validate: zodResolver( + z.object({ + username: z.string(), + eMail: z.string().email().or(z.literal('')), + }) + ), + validateInputOnBlur: true, + validateInputOnChange: true, + }); + const { t } = useTranslation(['manage/users/edit', 'common']); + + const utils = api.useUtils(); + + const { mutate, isLoading } = api.user.updateDetails.useMutation({ + onSettled: async () => { + await utils.user.invalidate(); + form.resetDirty(); + }, + }); + + function handleSubmit() { + mutate({ + userId: userId, + username: form.values.username, + eMail: form.values.eMail, + }); + } + + return ( + + {t('sections.general.title')} +
+ } + label={t('sections.general.inputs.username.label')} + mb="md" + withAsterisk + {...form.getInputProps('username')} + /> + } + label={t('sections.general.inputs.eMail.label')} + {...form.getInputProps('eMail')} + /> + + + + +
+ ); +}; diff --git a/src/components/Manage/User/Edit/ManageUserDanger.tsx b/src/components/Manage/User/Edit/ManageUserDanger.tsx new file mode 100644 index 000000000..c05328d28 --- /dev/null +++ b/src/components/Manage/User/Edit/ManageUserDanger.tsx @@ -0,0 +1,83 @@ +import { Box, Button, Checkbox, Group, LoadingOverlay, PasswordInput, Title } from '@mantine/core'; +import { useForm, zodResolver } from '@mantine/form'; +import { IconTextSize, IconTrash } from '@tabler/icons-react'; +import { useTranslation } from 'next-i18next'; +import { z } from 'zod'; +import { api } from '~/utils/api'; + +export const ManageUserDanger = ({ + userId, + username, +}: { + userId: string; + username: string | null; +}) => { + const form = useForm({ + initialValues: { + username: '', + confirm: false, + }, + validate: zodResolver( + z.object({ + username: z.literal(username), + confirm: z.literal(true), + }) + ), + validateInputOnBlur: true, + validateInputOnChange: true, + }); + + const apiUtils = api.useUtils(); + + const { mutate, isLoading } = api.user.deleteUser.useMutation({ + onSuccess: () => { + window.location.href = '/manage/users'; + }, + onSettled: () => { + void apiUtils.user.details.invalidate(); + form.reset(); + }, + }); + + const { t } = useTranslation(['manage/users/edit', 'common']); + + const handleSubmit = () => { + mutate({ + id: userId, + }); + }; + + return ( + + + {t('sections.deletion.title')} +
+ } + label={t('sections.deletion.inputs.confirmUsername.label')} + description={t('sections.deletion.inputs.confirmUsername.description')} + mb="md" + withAsterisk + {...form.getInputProps('username')} + /> + + + + + +
+ ); +}; diff --git a/src/components/Manage/User/Edit/ManageUserRoles.tsx b/src/components/Manage/User/Edit/ManageUserRoles.tsx new file mode 100644 index 000000000..0a4443b52 --- /dev/null +++ b/src/components/Manage/User/Edit/ManageUserRoles.tsx @@ -0,0 +1,65 @@ +import { ActionIcon, Badge, Box, Group, Title, Text, Tooltip, Button } from '@mantine/core'; +import { openRoleChangeModal } from '~/components/Manage/User/change-user-role.modal'; +import { IconUserDown, IconUserUp } from '@tabler/icons-react'; +import { useTranslation } from 'next-i18next'; +import { useSession } from 'next-auth/react'; + +export const ManageUserRoles = ({ user }: { + user: { + image: string | null; + id: string; + name: string | null; + password: string | null; + email: string | null; + emailVerified: Date | null; + salt: string | null; + isAdmin: boolean; + isOwner: boolean; + } +}) => { + const { t } = useTranslation(['manage/users/edit', 'manage/users']); + const { data: sessionData } = useSession(); + return ( + + + {t('sections.roles.title')} + + + + {t('sections.roles.currentRole')} + {user.isOwner ? ({t('sections.roles.badges.owner')}) : user.isAdmin ? ( + {t('sections.roles.badges.admin')}) : ({t('sections.roles.badges.normal')})} + + + {user.isAdmin ? ( + + ) : ( + + )} + + ); +}; \ No newline at end of file diff --git a/src/components/Manage/User/Edit/ManageUserSecurityForm.tsx b/src/components/Manage/User/Edit/ManageUserSecurityForm.tsx new file mode 100644 index 000000000..ac734e487 --- /dev/null +++ b/src/components/Manage/User/Edit/ManageUserSecurityForm.tsx @@ -0,0 +1,91 @@ +import { Box, Button, Checkbox, Group, LoadingOverlay, PasswordInput, Title } from '@mantine/core'; +import { useForm, zodResolver } from '@mantine/form'; +import { useInputState } from '@mantine/hooks'; +import { IconAlertTriangle, IconPassword } from '@tabler/icons-react'; +import { useTranslation } from 'next-i18next'; +import { z } from 'zod'; +import { api } from '~/utils/api'; + +export const ManageUserSecurityForm = ({ userId }: { userId: string }) => { + const form = useForm({ + initialValues: { + password: '', + terminateExistingSessions: false, + confirm: false, + }, + validate: zodResolver( + z.object({ + password: z.string().min(3), + terminateExistingSessions: z.boolean(), + confirm: z.literal(true), + }) + ), + validateInputOnBlur: true, + validateInputOnChange: true, + }); + + const [checked, setChecked] = useInputState(false); + + const { t } = useTranslation(['manage/users/edit', 'common']); + + const apiUtils = api.useUtils(); + + const { mutate, isLoading } = api.user.updatePassword.useMutation({ + onSettled: () => { + void apiUtils.user.details.invalidate(); + form.reset(); + }, + }); + + const handleSubmit = (values: { password: string; terminateExistingSessions: boolean }) => { + mutate({ + newPassword: values.password, + terminateExistingSessions: values.terminateExistingSessions, + userId: userId, + }); + setChecked(false); + }; + + return ( + + + {t('sections.security.title')} +
+ } + label={t('sections.security.inputs.password.label')} + mb="md" + withAsterisk + {...form.getInputProps('password')} + /> + + { + setChecked(event.currentTarget.checked); + }} + {...form.getInputProps('confirm')} + /> + + + + +
+ ); +}; diff --git a/src/components/Manage/User/change-user-role.modal.tsx b/src/components/Manage/User/change-user-role.modal.tsx index 45c09a7aa..97c2efc36 100644 --- a/src/components/Manage/User/change-user-role.modal.tsx +++ b/src/components/Manage/User/change-user-role.modal.tsx @@ -11,6 +11,7 @@ export const ChangeUserRoleModal = ({ id, innerProps }: ContextModalProps { await utils.user.all.invalidate(); + await utils.user.details.invalidate(); modals.close(id); }, }); diff --git a/src/pages/manage/users/[userId]/edit.tsx b/src/pages/manage/users/[userId]/edit.tsx new file mode 100644 index 000000000..ff1989c7d --- /dev/null +++ b/src/pages/manage/users/[userId]/edit.tsx @@ -0,0 +1,90 @@ +import { Avatar, Divider, Group, Loader, Stack, Text, ThemeIcon, Title, UnstyledButton } from '@mantine/core'; +import { IconArrowLeft } from '@tabler/icons-react'; +import { GetServerSideProps } from 'next'; +import { useTranslation } from 'next-i18next'; +import Head from 'next/head'; +import Link from 'next/link'; +import { useRouter } from 'next/router'; +import { ManageUserGeneralForm } from '~/components/Manage/User/Edit/GeneralForm'; +import { ManageUserDanger } from '~/components/Manage/User/Edit/ManageUserDanger'; +import { ManageUserSecurityForm } from '~/components/Manage/User/Edit/ManageUserSecurityForm'; +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 { manageNamespaces } from '~/tools/server/translation-namespaces'; +import { api } from '~/utils/api'; +import { ManageUserRoles } from '~/components/Manage/User/Edit/ManageUserRoles'; + +const EditPage = () => { + const { t } = useTranslation('manage/users/edit'); + + const router = useRouter(); + + const { isLoading, data } = api.user.details.useQuery({ userId: router.query.userId as string }); + + const metaTitle = `${t('metaTitle', { + username: data?.name, + })} • Homarr`; + + return ( + + + {metaTitle} + + + + + + + {t('back')} + + + + + {data?.name?.slice(0, 2).toUpperCase()} + {data?.name} + + + {data ? ( + + + + + + + + + + ) : ( + + )} + + ); +}; + +export const getServerSideProps: GetServerSideProps = async (ctx) => { + const session = await getServerAuthSession(ctx); + const result = checkForSessionOrAskForLogin(ctx, session, () => session?.user.isAdmin == true); + if (result) { + return result; + } + + const translations = await getServerSideTranslations( + manageNamespaces, + ctx.locale, + undefined, + undefined, + ); + return { + props: { + ...translations, + }, + }; +}; + +export default EditPage; diff --git a/src/pages/manage/users/index.tsx b/src/pages/manage/users/index.tsx index 8b90a3505..6a2d08fad 100644 --- a/src/pages/manage/users/index.tsx +++ b/src/pages/manage/users/index.tsx @@ -1,28 +1,34 @@ import { - ActionIcon, - Autocomplete, Avatar, Badge, - Box, Button, Flex, + Grid, Group, + Loader, + NavLink, Pagination, Table, Text, + TextInput, Title, - Tooltip, } from '@mantine/core'; +import { useForm, zodResolver } from '@mantine/form'; import { useDebouncedValue } from '@mantine/hooks'; -import { IconPlus, IconTrash, IconUserDown, IconUserUp } from '@tabler/icons-react'; +import { + IconPencil, + IconUser, + IconUserPlus, + IconUserShield, + IconUserStar, + IconX, +} from '@tabler/icons-react'; import { GetServerSideProps } from 'next'; -import { useSession } from 'next-auth/react'; import { useTranslation } from 'next-i18next'; import Head from 'next/head'; import Link from 'next/link'; import { useState } from 'react'; -import { openRoleChangeModal } from '~/components/Manage/User/change-user-role.modal'; -import { openDeleteUserModal } from '~/components/Manage/User/delete-user.modal'; +import { z } from 'zod'; import { ManageLayout } from '~/components/layout/Templates/ManageLayout'; import { getServerAuthSession } from '~/server/auth'; import { getServerSideTranslations } from '~/tools/server/getServerSideTranslations'; @@ -30,17 +36,49 @@ import { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder'; import { manageNamespaces } from '~/tools/server/translation-namespaces'; import { api } from '~/utils/api'; +export const PossibleRoleFilter = [ + { + id: 'all', + icon: IconUser, + }, + { + id: 'owner', + icon: IconUserStar, + }, + { + id: 'admin', + icon: IconUserShield, + }, + { + id: 'normal', + icon: IconUser, + }, +]; + const ManageUsersPage = () => { const [activePage, setActivePage] = useState(0); - const [nonDebouncedSearch, setNonDebouncedSearch] = useState(''); - const [debouncedSearch] = useDebouncedValue(nonDebouncedSearch, 200); - const { data } = api.user.all.useQuery({ - page: activePage, - search: debouncedSearch, + const form = useForm({ + initialValues: { + fullTextSearch: '', + role: PossibleRoleFilter[0].id, + }, + validate: zodResolver( + z.object({ + fullTextSearch: z.string(), + role: z + .string() + .transform((value) => (value.length > 0 ? value : undefined)) + .optional(), + }) + ), + }); + const [debouncedForm] = useDebouncedValue(form, 200); + const { data, isLoading } = api.user.all.useQuery({ + page: activePage, + search: debouncedForm.values, }); - const { data: sessionData } = useSession(); - const { t } = useTranslation('manage/users'); + const { t } = useTranslation(['manage/users', 'common']); const metaTitle = `${t('metaTitle')} • Homarr`; @@ -51,118 +89,127 @@ const ManageUsersPage = () => { {t('pageTitle')} - {t('text')} - - user.name).filter((name) => name !== null) as string[]) ?? [] + + { + form.setFieldValue('fullTextSearch', ''); + }} + size="1rem" + /> } - variant="filled" - onChange={(value) => { - setNonDebouncedSearch(value); + style={{ + flexGrow: 1, }} + placeholder="Filter" + variant="filled" + {...form.getInputProps('fullTextSearch')} /> - {data && ( - <> + + + + Roles + + {PossibleRoleFilter.map((role) => ( + } + rightSection={!isLoading && data && {data?.stats.roles[role.id]}} + label={t(`filter.roles.${role.id}`)} + active={form.values.role === role.id} + onClick={() => { + form.setFieldValue('role', role.id); + }} + sx={(theme) => ({ + borderRadius: theme.radius.md, + marginBottom: 5, + })} + /> + ))} + + - - - - - - {data.users.map((user, index) => ( - - + - ))} - - {debouncedSearch && debouncedSearch.length > 0 && data.countPages === 0 && ( + )} + {data?.users.length === 0 && ( - )} + {data?.users.map((user, index) => ( + + + + + + ))}
{t('table.header.user')}
- - - - {user.name} - {user.isOwner && ( - - Owner - - )} - {user.isAdmin && ( - - Admin - - )} - - - {user.isAdmin ? ( - - { - openRoleChangeModal({ - ...user, - type: 'demote', - }); - }} - > - - - - ) : ( - - { - openRoleChangeModal({ - ...user, - type: 'promote', - }); - }} - > - - - - )} - - - { - openDeleteUserModal(user); - }} - color="red" - variant="light" - > - - - - + {isLoading && ( +
+ +
- - {t('searchDoesntMatch')} - + + + {t('searchDoesntMatch')} +
+ + + + + + {user.name} + {user.isOwner && ( + + Owner + + )} + {user.isAdmin && ( + + Admin + + )} + + + + {user.email ? ( + {user.email} + ) : ( + No E-Mail + )} + + + + +
+
+ { setActivePage((prev) => prev + 1); }} @@ -172,9 +219,12 @@ const ManageUsersPage = () => { onChange={(targetPage) => { setActivePage(targetPage - 1); }} + total={data?.countPages ?? 0} + value={activePage + 1} + withControls /> - - )} + +
); }; diff --git a/src/server/api/routers/user.ts b/src/server/api/routers/user.ts index 236f0a8fa..fcfb9d93c 100644 --- a/src/server/api/routers/user.ts +++ b/src/server/api/routers/user.ts @@ -1,11 +1,19 @@ import { TRPCError } from '@trpc/server'; + import bcrypt from 'bcryptjs'; + import { randomUUID } from 'crypto'; -import { eq, like, sql } from 'drizzle-orm'; + +import { and, eq, like, sql } from 'drizzle-orm'; + import { z } from 'zod'; + +import { COOKIE_COLOR_SCHEME_KEY, COOKIE_LOCALE_KEY } from '../../../../data/constants'; +import { adminProcedure, createTRPCRouter, protectedProcedure, publicProcedure } from '../trpc'; + import { db } from '~/server/db'; import { getTotalUserCountAsync } from '~/server/db/queries/user'; -import { UserSettings, invites, userSettings, users } from '~/server/db/schema'; +import { invites, sessions, users, userSettings, UserSettings } from '~/server/db/schema'; import { hashPassword } from '~/utils/security'; import { colorSchemeParser, @@ -13,9 +21,7 @@ import { signUpFormSchema, updateSettingsValidationSchema, } from '~/validations/user'; - -import { COOKIE_COLOR_SCHEME_KEY, COOKIE_LOCALE_KEY } from '../../../../data/constants'; -import { adminProcedure, createTRPCRouter, protectedProcedure, publicProcedure } from '../trpc'; +import { PossibleRoleFilter } from '~/pages/manage/users'; export const userRouter = createTRPCRouter({ createOwnerAccount: publicProcedure.input(signUpFormSchema).mutation(async ({ ctx, input }) => { @@ -34,6 +40,47 @@ export const userRouter = createTRPCRouter({ isOwner: true, }); }), + updatePassword: adminProcedure + .input( + z.object({ + userId: z.string(), + newPassword: z.string().min(3), + terminateExistingSessions: z.boolean(), + }), + ) + .mutation(async ({ input, ctx }) => { + const user = await db.query.users.findFirst({ + where: eq(users.id, input.userId), + }); + + if (!user) { + throw new TRPCError({ + code: 'NOT_FOUND', + }); + } + + if (user.isOwner && user.id !== ctx.session.user.id) { + throw new TRPCError({ + code: 'FORBIDDEN', + message: 'Operation not allowed or incorrect user', + }); + } + + const salt = bcrypt.genSaltSync(10); + const hashedPassword = hashPassword(input.newPassword, salt); + + if (input.terminateExistingSessions) { + await db.delete(sessions).where(eq(sessions.userId, input.userId)); + } + + await db + .update(users) + .set({ + password: hashedPassword, + salt: salt, + }) + .where(eq(users.id, input.userId)); + }), count: publicProcedure.query(async () => { return await getTotalUserCountAsync(); }), @@ -42,8 +89,8 @@ export const userRouter = createTRPCRouter({ signUpFormSchema.and( z.object({ inviteToken: z.string(), - }) - ) + }), + ), ) .mutation(async ({ ctx, input }) => { const invite = await db.query.invites.findFirst({ @@ -75,7 +122,7 @@ export const userRouter = createTRPCRouter({ .input( z.object({ colorScheme: colorSchemeParser, - }) + }), ) .mutation(async ({ ctx, input }) => { await db @@ -122,7 +169,7 @@ export const userRouter = createTRPCRouter({ .input( z.object({ language: z.string(), - }) + }), ) .mutation(async ({ ctx, input }) => { await db @@ -184,24 +231,48 @@ export const userRouter = createTRPCRouter({ z.object({ limit: z.number().min(1).max(100).default(10), page: z.number().min(0), - search: z - .string() - .optional() - .transform((value) => (value === '' ? undefined : value)), - }) + search: z.object({ + fullTextSearch: z + .string() + .optional() + .transform((value) => (value === '' ? undefined : value)), + role: z + .string() + .transform((value) => (value.length > 0 ? value : undefined)) + .optional(), + }), + }), ) .query(async ({ ctx, input }) => { + + const roleFilter = () => { + if (input.search.role === PossibleRoleFilter[1].id) { + return eq(users.isOwner, true); + } + + if (input.search.role === PossibleRoleFilter[2].id) { + return eq(users.isAdmin, true); + } + + if (input.search.role === PossibleRoleFilter[3].id) { + return and(eq(users.isAdmin, false), eq(users.isOwner, false)); + } + + return undefined; + }; + const limit = input.limit; const dbUsers = await db.query.users.findMany({ limit: limit + 1, offset: limit * input.page, - where: input.search ? like(users.name, `%${input.search}%`) : undefined, + where: and(input.search.fullTextSearch ? like(users.name, `%${input.search.fullTextSearch}%`) : undefined, roleFilter()), }); const countUsers = await db .select({ count: sql`count(*)` }) .from(users) - .where(input.search ? like(users.name, `%${input.search}%`) : undefined) + .where(input.search.fullTextSearch ? like(users.name, `%${input.search.fullTextSearch}%`) : undefined) + .where(roleFilter()) .then((rows) => rows[0].count); return { @@ -213,17 +284,54 @@ export const userRouter = createTRPCRouter({ isOwner: user.isOwner, })), countPages: Math.ceil(countUsers / limit), + stats: { + roles: { + all: (await db.select({ count: sql`count(*)` }).from(users))[0]['count'], + owner: ( + await db + .select({ count: sql`count(*)` }) + .from(users) + .where(eq(users.isOwner, true)) + )[0]['count'], + admin: ( + await db + .select({ count: sql`count(*)` }) + .from(users) + .where(and(eq(users.isAdmin, true), eq(users.isOwner, false))) + )[0]['count'], + normal: ( + await db + .select({ count: sql`count(*)` }) + .from(users) + .where(and(eq(users.isAdmin, false), eq(users.isOwner, false))) + )[0]['count'], + } as Record, + }, }; }), - create: adminProcedure.input(createNewUserSchema).mutation(async ({ ctx, input }) => { + create: adminProcedure.input(createNewUserSchema).mutation(async ({ input }) => { await createUserIfNotPresent(input); }), - + details: adminProcedure.input(z.object({ userId: z.string() })).query(async ({ input }) => { + return db.query.users.findFirst({ + where: eq(users.id, input.userId), + }); + }), + updateDetails: adminProcedure.input(z.object({ + userId: z.string(), + username: z.string(), + eMail: z.string().optional().transform(value => value?.length === 0 ? null : value), + })).mutation(async ({ input }) => { + await db.update(users).set({ + name: input.username, + email: input.eMail as string | null, + }).where(eq(users.id, input.userId)); + }), deleteUser: adminProcedure .input( z.object({ id: z.string(), - }) + }), ) .mutation(async ({ ctx, input }) => { const user = await db.query.users.findFirst({ @@ -259,7 +367,7 @@ const createUserIfNotPresent = async ( options: { defaultSettings?: Partial; isOwner?: boolean; - } | void + } | void, ) => { const existingUser = await db.query.users.findFirst({ where: eq(users.name, input.username), diff --git a/src/tools/server/translation-namespaces.ts b/src/tools/server/translation-namespaces.ts index 910e30220..f9af2b593 100644 --- a/src/tools/server/translation-namespaces.ts +++ b/src/tools/server/translation-namespaces.ts @@ -42,6 +42,7 @@ export const manageNamespaces = [ 'manage/users', 'manage/users/invites', 'manage/users/create', + 'manage/users/edit' ]; export const loginNamespaces = ['authentication/login']; From fd3f8f317a763a14a154fe302c6a836b4dc61223 Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Fri, 22 Dec 2023 21:50:04 +0100 Subject: [PATCH 18/28] config: update crowdin translations --- public/locales/cn/layout/header.json | 6 +- public/locales/cn/manage/users.json | 12 ++- public/locales/cn/manage/users/edit.json | 55 ++++++++++++++ .../cn/modules/smart-home/entity-state.json | 17 +++++ .../locales/cn/modules/torrents-status.json | 12 ++- public/locales/cr/manage/users.json | 12 ++- public/locales/cr/manage/users/edit.json | 55 ++++++++++++++ .../cr/modules/smart-home/entity-state.json | 17 +++++ .../locales/cr/modules/torrents-status.json | 12 ++- public/locales/cs/boards/common.json | 2 +- public/locales/cs/common.json | 10 +-- .../cs/layout/element-selector/selector.json | 16 ++-- public/locales/cs/layout/manage.json | 2 +- public/locales/cs/layout/modals/about.json | 2 +- public/locales/cs/layout/modals/add-app.json | 74 +++++++++---------- public/locales/cs/manage/boards.json | 20 ++--- public/locales/cs/manage/users.json | 14 +++- public/locales/cs/manage/users/create.json | 12 +-- public/locales/cs/manage/users/edit.json | 55 ++++++++++++++ public/locales/cs/manage/users/invites.json | 10 +-- public/locales/cs/modules/bookmark.json | 4 +- public/locales/cs/modules/calendar.json | 4 +- public/locales/cs/modules/dashdot.json | 6 +- public/locales/cs/modules/date.json | 4 +- public/locales/cs/modules/dlspeed.json | 4 +- .../locales/cs/modules/dns-hole-controls.json | 4 +- .../locales/cs/modules/dns-hole-summary.json | 4 +- public/locales/cs/modules/iframe.json | 4 +- .../cs/modules/media-requests-list.json | 4 +- .../cs/modules/media-requests-stats.json | 4 +- public/locales/cs/modules/media-server.json | 2 +- public/locales/cs/modules/notebook.json | 4 +- public/locales/cs/modules/rss.json | 4 +- .../cs/modules/smart-home/entity-state.json | 17 +++++ .../locales/cs/modules/torrents-status.json | 16 +++- public/locales/cs/modules/usenet.json | 4 +- public/locales/cs/modules/video-stream.json | 4 +- public/locales/cs/modules/weather.json | 4 +- public/locales/cs/tools/docker.json | 10 +-- public/locales/cs/user/preferences.json | 38 +++++----- public/locales/da/manage/users.json | 12 ++- public/locales/da/manage/users/edit.json | 55 ++++++++++++++ .../da/modules/smart-home/entity-state.json | 17 +++++ .../locales/da/modules/torrents-status.json | 12 ++- public/locales/de/manage/users.json | 12 ++- public/locales/de/manage/users/edit.json | 55 ++++++++++++++ .../de/modules/smart-home/entity-state.json | 17 +++++ .../locales/de/modules/torrents-status.json | 12 ++- public/locales/el/manage/users.json | 12 ++- public/locales/el/manage/users/edit.json | 55 ++++++++++++++ .../el/modules/smart-home/entity-state.json | 17 +++++ .../locales/el/modules/torrents-status.json | 12 ++- public/locales/es/manage/users.json | 12 ++- public/locales/es/manage/users/edit.json | 55 ++++++++++++++ .../es/modules/smart-home/entity-state.json | 17 +++++ .../locales/es/modules/torrents-status.json | 12 ++- .../fr/layout/errors/access-denied.json | 2 +- public/locales/fr/manage/users.json | 12 ++- public/locales/fr/manage/users/edit.json | 55 ++++++++++++++ .../fr/modules/smart-home/entity-state.json | 17 +++++ .../locales/fr/modules/torrents-status.json | 12 ++- public/locales/he/manage/users.json | 12 ++- public/locales/he/manage/users/edit.json | 55 ++++++++++++++ .../he/modules/smart-home/entity-state.json | 17 +++++ .../locales/he/modules/torrents-status.json | 12 ++- public/locales/hr/manage/users.json | 12 ++- public/locales/hr/manage/users/edit.json | 55 ++++++++++++++ .../hr/modules/smart-home/entity-state.json | 17 +++++ .../locales/hr/modules/torrents-status.json | 12 ++- public/locales/hu/manage/users.json | 12 ++- public/locales/hu/manage/users/edit.json | 55 ++++++++++++++ .../hu/modules/smart-home/entity-state.json | 17 +++++ .../locales/hu/modules/torrents-status.json | 12 ++- public/locales/it/manage/users.json | 12 ++- public/locales/it/manage/users/edit.json | 55 ++++++++++++++ .../it/modules/smart-home/entity-state.json | 17 +++++ .../locales/it/modules/torrents-status.json | 12 ++- public/locales/ja/manage/users.json | 12 ++- public/locales/ja/manage/users/edit.json | 55 ++++++++++++++ .../ja/modules/smart-home/entity-state.json | 17 +++++ .../locales/ja/modules/torrents-status.json | 12 ++- public/locales/ko/manage/users.json | 12 ++- public/locales/ko/manage/users/edit.json | 55 ++++++++++++++ .../ko/modules/smart-home/entity-state.json | 17 +++++ .../locales/ko/modules/torrents-status.json | 12 ++- public/locales/lv/manage/users.json | 12 ++- public/locales/lv/manage/users/edit.json | 55 ++++++++++++++ .../lv/modules/smart-home/entity-state.json | 17 +++++ .../locales/lv/modules/torrents-status.json | 12 ++- public/locales/nl/manage/users.json | 12 ++- public/locales/nl/manage/users/edit.json | 55 ++++++++++++++ .../nl/modules/smart-home/entity-state.json | 17 +++++ .../locales/nl/modules/torrents-status.json | 12 ++- public/locales/no/common.json | 2 +- public/locales/no/manage/users.json | 12 ++- public/locales/no/manage/users/edit.json | 55 ++++++++++++++ .../no/modules/smart-home/entity-state.json | 17 +++++ .../locales/no/modules/torrents-status.json | 12 ++- .../customization/page-appearance.json | 22 +++--- public/locales/no/tools/docker.json | 2 +- public/locales/pl/manage/users.json | 12 ++- public/locales/pl/manage/users/edit.json | 55 ++++++++++++++ .../pl/modules/smart-home/entity-state.json | 17 +++++ .../locales/pl/modules/torrents-status.json | 12 ++- public/locales/pt/manage/users.json | 12 ++- public/locales/pt/manage/users/edit.json | 55 ++++++++++++++ .../pt/modules/smart-home/entity-state.json | 17 +++++ .../locales/pt/modules/torrents-status.json | 12 ++- public/locales/ru/layout/modals/about.json | 8 +- public/locales/ru/manage/users.json | 12 ++- public/locales/ru/manage/users/edit.json | 55 ++++++++++++++ .../ru/modules/smart-home/entity-state.json | 17 +++++ .../locales/ru/modules/torrents-status.json | 18 ++++- public/locales/sk/manage/users.json | 12 ++- public/locales/sk/manage/users/edit.json | 55 ++++++++++++++ .../sk/modules/smart-home/entity-state.json | 17 +++++ .../locales/sk/modules/torrents-status.json | 12 ++- public/locales/sl/manage/users.json | 12 ++- public/locales/sl/manage/users/edit.json | 55 ++++++++++++++ .../sl/modules/smart-home/entity-state.json | 17 +++++ .../locales/sl/modules/torrents-status.json | 12 ++- public/locales/sv/manage/users.json | 12 ++- public/locales/sv/manage/users/edit.json | 55 ++++++++++++++ .../sv/modules/smart-home/entity-state.json | 17 +++++ .../locales/sv/modules/torrents-status.json | 12 ++- public/locales/tr/manage/users.json | 12 ++- public/locales/tr/manage/users/edit.json | 55 ++++++++++++++ public/locales/tr/modules/dlspeed.json | 2 +- .../tr/modules/smart-home/entity-state.json | 17 +++++ .../locales/tr/modules/torrents-status.json | 16 +++- public/locales/tw/manage/users.json | 12 ++- public/locales/tw/manage/users/edit.json | 55 ++++++++++++++ .../tw/modules/smart-home/entity-state.json | 17 +++++ .../locales/tw/modules/torrents-status.json | 12 ++- public/locales/uk/manage/users.json | 12 ++- public/locales/uk/manage/users/edit.json | 55 ++++++++++++++ .../uk/modules/smart-home/entity-state.json | 17 +++++ .../locales/uk/modules/torrents-status.json | 12 ++- public/locales/vi/common.json | 10 +-- public/locales/vi/layout/header.json | 2 +- public/locales/vi/layout/manage.json | 4 +- public/locales/vi/manage/boards.json | 4 +- public/locales/vi/manage/users.json | 12 ++- public/locales/vi/manage/users/edit.json | 55 ++++++++++++++ .../locales/vi/modules/dns-hole-summary.json | 2 +- public/locales/vi/modules/notebook.json | 66 ++++++++--------- .../vi/modules/smart-home/entity-state.json | 17 +++++ .../locales/vi/modules/torrents-status.json | 26 +++++-- .../vi/settings/customization/general.json | 2 +- .../customization/page-appearance.json | 22 +++--- public/locales/vi/tools/docker.json | 2 +- public/locales/vi/user/preferences.json | 4 +- 152 files changed, 2737 insertions(+), 307 deletions(-) create mode 100644 public/locales/cn/manage/users/edit.json create mode 100644 public/locales/cn/modules/smart-home/entity-state.json create mode 100644 public/locales/cr/manage/users/edit.json create mode 100644 public/locales/cr/modules/smart-home/entity-state.json create mode 100644 public/locales/cs/manage/users/edit.json create mode 100644 public/locales/cs/modules/smart-home/entity-state.json create mode 100644 public/locales/da/manage/users/edit.json create mode 100644 public/locales/da/modules/smart-home/entity-state.json create mode 100644 public/locales/de/manage/users/edit.json create mode 100644 public/locales/de/modules/smart-home/entity-state.json create mode 100644 public/locales/el/manage/users/edit.json create mode 100644 public/locales/el/modules/smart-home/entity-state.json create mode 100644 public/locales/es/manage/users/edit.json create mode 100644 public/locales/es/modules/smart-home/entity-state.json create mode 100644 public/locales/fr/manage/users/edit.json create mode 100644 public/locales/fr/modules/smart-home/entity-state.json create mode 100644 public/locales/he/manage/users/edit.json create mode 100644 public/locales/he/modules/smart-home/entity-state.json create mode 100644 public/locales/hr/manage/users/edit.json create mode 100644 public/locales/hr/modules/smart-home/entity-state.json create mode 100644 public/locales/hu/manage/users/edit.json create mode 100644 public/locales/hu/modules/smart-home/entity-state.json create mode 100644 public/locales/it/manage/users/edit.json create mode 100644 public/locales/it/modules/smart-home/entity-state.json create mode 100644 public/locales/ja/manage/users/edit.json create mode 100644 public/locales/ja/modules/smart-home/entity-state.json create mode 100644 public/locales/ko/manage/users/edit.json create mode 100644 public/locales/ko/modules/smart-home/entity-state.json create mode 100644 public/locales/lv/manage/users/edit.json create mode 100644 public/locales/lv/modules/smart-home/entity-state.json create mode 100644 public/locales/nl/manage/users/edit.json create mode 100644 public/locales/nl/modules/smart-home/entity-state.json create mode 100644 public/locales/no/manage/users/edit.json create mode 100644 public/locales/no/modules/smart-home/entity-state.json create mode 100644 public/locales/pl/manage/users/edit.json create mode 100644 public/locales/pl/modules/smart-home/entity-state.json create mode 100644 public/locales/pt/manage/users/edit.json create mode 100644 public/locales/pt/modules/smart-home/entity-state.json create mode 100644 public/locales/ru/manage/users/edit.json create mode 100644 public/locales/ru/modules/smart-home/entity-state.json create mode 100644 public/locales/sk/manage/users/edit.json create mode 100644 public/locales/sk/modules/smart-home/entity-state.json create mode 100644 public/locales/sl/manage/users/edit.json create mode 100644 public/locales/sl/modules/smart-home/entity-state.json create mode 100644 public/locales/sv/manage/users/edit.json create mode 100644 public/locales/sv/modules/smart-home/entity-state.json create mode 100644 public/locales/tr/manage/users/edit.json create mode 100644 public/locales/tr/modules/smart-home/entity-state.json create mode 100644 public/locales/tw/manage/users/edit.json create mode 100644 public/locales/tw/modules/smart-home/entity-state.json create mode 100644 public/locales/uk/manage/users/edit.json create mode 100644 public/locales/uk/modules/smart-home/entity-state.json create mode 100644 public/locales/vi/manage/users/edit.json create mode 100644 public/locales/vi/modules/smart-home/entity-state.json diff --git a/public/locales/cn/layout/header.json b/public/locales/cn/layout/header.json index 456a8a0aa..ca36fd850 100644 --- a/public/locales/cn/layout/header.json +++ b/public/locales/cn/layout/header.json @@ -11,9 +11,9 @@ "actions": { "avatar": { "switchTheme": "切换主题", - "preferences": "用户首选项", - "defaultBoard": "默认仪表盘", - "manage": "管理", + "preferences": "用户选项", + "defaultBoard": "默认面板", + "manage": "管理中心", "logout": "注销 {{username}}", "login": "登录" } diff --git a/public/locales/cn/manage/users.json b/public/locales/cn/manage/users.json index 75722cca3..b699c5d8a 100644 --- a/public/locales/cn/manage/users.json +++ b/public/locales/cn/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "用户", "pageTitle": "管理用户", - "text": "通过账号,您可以配置谁可以编辑您的面板。Homarr的未来版本将对权限和面板进行更精细地控制。", "buttons": { "create": "创建" }, + "filter": { + "roles": { + "all": "全部", + "normal": "普通", + "admin": "管理员", + "owner": "所有者" + } + }, "table": { "header": { - "user": "用户" + "user": "用户", + "email": "邮箱" } }, "tooltips": { diff --git a/public/locales/cn/manage/users/edit.json b/public/locales/cn/manage/users/edit.json new file mode 100644 index 000000000..a99c16272 --- /dev/null +++ b/public/locales/cn/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "用户 {{username}}", + "back": "返回用户管理", + "sections": { + "general": { + "title": "通用", + "inputs": { + "username": { + "label": "用户名" + }, + "eMail": { + "label": "邮箱" + } + } + }, + "security": { + "title": "安全", + "inputs": { + "password": { + "label": "新密码" + }, + "terminateExistingSessions": { + "label": "终止现有会话", + "description": "强制用户在其设备上重新登录" + }, + "confirm": { + "label": "确认", + "description": "密码将被更新。该操作不可撤销。" + } + } + }, + "roles": { + "title": "角色", + "currentRole": "当前角色: ", + "badges": { + "owner": "所有者", + "admin": "管理员", + "normal": "普通" + } + }, + "deletion": { + "title": "删除账号", + "inputs": { + "confirmUsername": { + "label": "确认用户名", + "description": "输入用户名以确认删除" + }, + "confirm": { + "label": "永久删除", + "description": "我知道此操作是永久性的,所有帐户数据都将丢失。" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/cn/modules/smart-home/entity-state.json b/public/locales/cn/modules/smart-home/entity-state.json new file mode 100644 index 000000000..7ec5f18a0 --- /dev/null +++ b/public/locales/cn/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "未找到实体", + "descriptor": { + "name": "Home Assistant 实体", + "description": "Home Assistant 中实体的当前状态", + "settings": { + "title": "实体状态", + "entityId": { + "label": "实体 ID", + "info": "Home Assistant 中的唯一实体 ID。通过单击实体 > 单击齿轮图标 > 单击“实体 ID”处的复制按钮进行复制。某些自定义实体可能不受支持。" + }, + "displayName": { + "label": "显示名称" + } + } + } +} \ No newline at end of file diff --git a/public/locales/cn/modules/torrents-status.json b/public/locales/cn/modules/torrents-status.json index 21345f04c..9570a8696 100644 --- a/public/locales/cn/modules/torrents-status.json +++ b/public/locales/cn/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "正在下载", "name": "名称", + "dateAdded": "已添加到", "size": "大小", "download": "下载", "upload": "上传", "estimatedTimeOfArrival": "剩余时间", - "progress": "进度" + "progress": "进度", + "totalUploaded": "上传总量", + "totalDownloaded": "下载总量", + "ratio": "分享率", + "seeds": "种子数(已连接)", + "peers": "用户数(已连接)", + "label": "标签", + "state": "状态", + "stateMessage": "状态信息" }, "item": { "text": "由 {{appName}}, {{ratio}} 管理的比率" diff --git a/public/locales/cr/manage/users.json b/public/locales/cr/manage/users.json index 2d7f1247b..7fd0a0bfa 100644 --- a/public/locales/cr/manage/users.json +++ b/public/locales/cr/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "crwdns3789:0crwdne3789:0", "pageTitle": "crwdns3791:0crwdne3791:0", - "text": "crwdns3793:0crwdne3793:0", "buttons": { "create": "crwdns3795:0crwdne3795:0" }, + "filter": { + "roles": { + "all": "crwdns4114:0crwdne4114:0", + "normal": "crwdns4116:0crwdne4116:0", + "admin": "crwdns4118:0crwdne4118:0", + "owner": "crwdns4120:0crwdne4120:0" + } + }, "table": { "header": { - "user": "crwdns3797:0crwdne3797:0" + "user": "crwdns3797:0crwdne3797:0", + "email": "crwdns4122:0crwdne4122:0" } }, "tooltips": { diff --git a/public/locales/cr/manage/users/edit.json b/public/locales/cr/manage/users/edit.json new file mode 100644 index 000000000..9c12e3ab2 --- /dev/null +++ b/public/locales/cr/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "crwdns4072:0{{username}}crwdne4072:0", + "back": "crwdns4074:0crwdne4074:0", + "sections": { + "general": { + "title": "crwdns4076:0crwdne4076:0", + "inputs": { + "username": { + "label": "crwdns4078:0crwdne4078:0" + }, + "eMail": { + "label": "crwdns4080:0crwdne4080:0" + } + } + }, + "security": { + "title": "crwdns4082:0crwdne4082:0", + "inputs": { + "password": { + "label": "crwdns4084:0crwdne4084:0" + }, + "terminateExistingSessions": { + "label": "crwdns4086:0crwdne4086:0", + "description": "crwdns4088:0crwdne4088:0" + }, + "confirm": { + "label": "crwdns4090:0crwdne4090:0", + "description": "crwdns4092:0crwdne4092:0" + } + } + }, + "roles": { + "title": "crwdns4094:0crwdne4094:0", + "currentRole": "crwdns4096:0crwdne4096:0", + "badges": { + "owner": "crwdns4098:0crwdne4098:0", + "admin": "crwdns4100:0crwdne4100:0", + "normal": "crwdns4102:0crwdne4102:0" + } + }, + "deletion": { + "title": "crwdns4104:0crwdne4104:0", + "inputs": { + "confirmUsername": { + "label": "crwdns4106:0crwdne4106:0", + "description": "crwdns4108:0crwdne4108:0" + }, + "confirm": { + "label": "crwdns4110:0crwdne4110:0", + "description": "crwdns4112:0crwdne4112:0" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/cr/modules/smart-home/entity-state.json b/public/locales/cr/modules/smart-home/entity-state.json new file mode 100644 index 000000000..e0520f6db --- /dev/null +++ b/public/locales/cr/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "crwdns4038:0crwdne4038:0", + "descriptor": { + "name": "crwdns4040:0crwdne4040:0", + "description": "crwdns4042:0crwdne4042:0", + "settings": { + "title": "crwdns4044:0crwdne4044:0", + "entityId": { + "label": "crwdns4046:0crwdne4046:0", + "info": "crwdns4048:0crwdne4048:0" + }, + "displayName": { + "label": "crwdns4050:0crwdne4050:0" + } + } + } +} \ No newline at end of file diff --git a/public/locales/cr/modules/torrents-status.json b/public/locales/cr/modules/torrents-status.json index 12e166623..226de309c 100644 --- a/public/locales/cr/modules/torrents-status.json +++ b/public/locales/cr/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "crwdns4052:0crwdne4052:0", "name": "crwdns2225:0crwdne2225:0", + "dateAdded": "crwdns4054:0crwdne4054:0", "size": "crwdns2227:0crwdne2227:0", "download": "crwdns2229:0crwdne2229:0", "upload": "crwdns2231:0crwdne2231:0", "estimatedTimeOfArrival": "crwdns2233:0crwdne2233:0", - "progress": "crwdns2235:0crwdne2235:0" + "progress": "crwdns2235:0crwdne2235:0", + "totalUploaded": "crwdns4056:0crwdne4056:0", + "totalDownloaded": "crwdns4058:0crwdne4058:0", + "ratio": "crwdns4060:0crwdne4060:0", + "seeds": "crwdns4062:0crwdne4062:0", + "peers": "crwdns4064:0crwdne4064:0", + "label": "crwdns4066:0crwdne4066:0", + "state": "crwdns4068:0crwdne4068:0", + "stateMessage": "crwdns4070:0crwdne4070:0" }, "item": { "text": "crwdns2461:0{{appName}}crwdnd2461:0{{ratio}}crwdne2461:0" diff --git a/public/locales/cs/boards/common.json b/public/locales/cs/boards/common.json index a70db06bf..4246ae56d 100644 --- a/public/locales/cs/boards/common.json +++ b/public/locales/cs/boards/common.json @@ -1,5 +1,5 @@ { "header": { - "customize": "" + "customize": "Přizpůsobit plochu" } } \ No newline at end of file diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json index 814bcdbfa..30e248cb4 100644 --- a/public/locales/cs/common.json +++ b/public/locales/cs/common.json @@ -5,11 +5,11 @@ "about": "", "cancel": "", "close": "", - "back": "", + "back": "Zpět", "delete": "", "ok": "", "edit": "", - "next": "", + "next": "Další", "previous": "", "confirm": "", "enabled": "", @@ -44,14 +44,14 @@ }, "seeMore": "", "position": { - "left": "", + "left": "Vlevo", "center": "", - "right": "" + "right": "Vpravo" }, "attributes": { "width": "", "height": "" }, "public": "", - "restricted": "" + "restricted": "Omezené" } \ No newline at end of file diff --git a/public/locales/cs/layout/element-selector/selector.json b/public/locales/cs/layout/element-selector/selector.json index 6dd6ad716..ca2d798a7 100644 --- a/public/locales/cs/layout/element-selector/selector.json +++ b/public/locales/cs/layout/element-selector/selector.json @@ -3,23 +3,23 @@ "title": "Přidat novou dlaždici", "text": "Dlaždice jsou hlavním prvkem Homarru. Slouží k zobrazení Vašich aplikací a dalších informací. Můžete přidat libovolný počet dlaždic." }, - "widgetDescription": "", - "goBack": "", + "widgetDescription": "Widgety komunikují s vašimi aplikacemi, aby nad nimi poskytovaly větší kontrolu. Před použitím obvykle vyžadují další konfiguraci.", + "goBack": "Přejít zpět na předchozí stránku", "actionIcon": { - "tooltip": "" + "tooltip": "Přidat dlaždici" }, "apps": "Aplikace", "app": { - "defaultName": "" + "defaultName": "Vaše aplikace" }, "widgets": "Widgety", "categories": "Kategorie", "category": { - "newName": "", - "defaultName": "", + "newName": "Název nové kategorie", + "defaultName": "Nová kategorie", "created": { - "title": "", - "message": "" + "title": "Kategorie vytvořena", + "message": "Kategorie \"{{name}}\" byla vytvořena" } } } diff --git a/public/locales/cs/layout/manage.json b/public/locales/cs/layout/manage.json index 02262e724..f95356c1c 100644 --- a/public/locales/cs/layout/manage.json +++ b/public/locales/cs/layout/manage.json @@ -16,7 +16,7 @@ "help": { "title": "Nápověda", "items": { - "documentation": "", + "documentation": "Dokumentace", "report": "Nahlášení problému/chyby", "discord": "Komunitní Discord", "contribute": "Zapojte se" diff --git a/public/locales/cs/layout/modals/about.json b/public/locales/cs/layout/modals/about.json index 9a09c330d..835ce8ea8 100644 --- a/public/locales/cs/layout/modals/about.json +++ b/public/locales/cs/layout/modals/about.json @@ -1,6 +1,6 @@ { "description": "", - "addToDashboard": "", + "addToDashboard": "Přidat na plochu", "tip": "", "key": "", "action": "", diff --git a/public/locales/cs/layout/modals/add-app.json b/public/locales/cs/layout/modals/add-app.json index efadec3f7..807103a09 100644 --- a/public/locales/cs/layout/modals/add-app.json +++ b/public/locales/cs/layout/modals/add-app.json @@ -9,29 +9,29 @@ "general": { "appname": { "label": "Název aplikace", - "description": "" + "description": "Zobrazuje se s aplikací na ploše." }, "internalAddress": { - "label": "", - "description": "", + "label": "Interní adresa", + "description": "Interní IP adresa aplikace.", "troubleshoot": { "label": "Narazili jste na problém?", - "header": "", + "header": "Zde je seznam nejčastějších chyb a jejich řešení:", "lines": { - "nothingAfterPort": "", - "protocolCheck": "", - "preferIP": "", - "enablePings": "", - "wget": "", - "iframe": "", + "nothingAfterPort": "Ve většině případů, ne-li ve všech, byste za port neměli zadávat žádnou cestu. (Dokonce ani '/admin' pro pihole nebo '/web' pro plex)", + "protocolCheck": "Vždy se ujistěte, že na začátku URL je http nebo https a také se ujistěte, že používáte správnou předponu.", + "preferIP": "Doporučuje se používat přímo Ip adresu stroje nebo kontejneru, se kterým se snažíte komunikovat.", + "enablePings": "Zkontrolujte, zda je IP adresa správná, povolením pingů. Běžte do Přizpůsobení plochy -> Rozložení -> Povolit ping. Na dlaždicích aplikace se objeví malá červená nebo zelená bublina a po najetí na ni se zobrazí kód odpovědi (ve většině případů se očekává zelená bublina s kódem 200).", + "wget": "Chcete-li se ujistit, že homarr může komunikovat s ostatními aplikacemi, zkontrolujte, zda wget/curl/ping odpovídá IP adrese:portu aplikace.", + "iframe": "Pokud jde o iframe, ty by měly vždy používat stejný protokol (http/s) jako Homarr.", "clearCache": "" }, - "footer": "" + "footer": "Pro řešení dalších problémů se obraťte na náš {{discord}}." } }, "externalAddress": { - "label": "", - "description": "" + "label": "Veřejná adresa", + "description": "URL která bude otevřena po kliknutí na aplikaci." } }, "behaviour": { @@ -47,18 +47,18 @@ }, "network": { "statusChecker": { - "label": "", - "description": "" + "label": "Kontrola stavu", + "description": "Kontroluje, zda je aplikace online pomocí jednoduchého HTTP(S) požadavku." }, "statusCodes": { - "label": "", - "description": "" + "label": "Stavové kódy HTTP", + "description": "Stavové kódy HTTP, které jsou považovány jako online." } }, "appearance": { "icon": { - "label": "", - "description": "", + "label": "Ikona aplikace", + "description": "Začněte psát pro vyhledání ikony. Můžete také vložit adresu URL obrázku a použít vlastní ikonu.", "autocomplete": { "title": "", "text": "" @@ -69,38 +69,38 @@ } }, "appNameFontSize": { - "label": "", - "description": "" + "label": "Velikost písma názvu aplikace", + "description": "Nastavte velikost písma zobrazení názvu aplikace na dlaždici." }, "appNameStatus": { - "label": "", - "description": "", + "label": "Stav názvu aplikace", + "description": "Zvolte, kde se má název zobrazit, pokud se vůbec má zobrazit.", "dropdown": { - "normal": "", - "hover": "", - "hidden": "" + "normal": "Zobrazení názvu pouze na dlaždici", + "hover": "Zobrazení názvu pouze při najetí myší", + "hidden": "Nezobrazovat vůbec" } }, "positionAppName": { - "label": "", - "description": "", + "label": "Pozice názvu aplikace", + "description": "Pozice názvu aplikace vzhledem k ikoně.", "dropdown": { - "top": "", - "right": "", - "bottom": "", - "left": "" + "top": "Nahoře", + "right": "Vpravo", + "bottom": "Dole", + "left": "Vlevo" } }, "lineClampAppName": { - "label": "", - "description": "" + "label": "Řádky názvu aplikace", + "description": "Určuje, na kolik řádků se má maximálně vejít váš nadpis. Nastavte 0 pro neomezený počet." } }, "integration": { "type": { - "label": "", - "description": "", - "placeholder": "", + "label": "Nastavení propojení", + "description": "Konfigurace integrace, která bude použita pro připojení k vaší aplikaci.", + "placeholder": "Vyberte integraci", "defined": "", "undefined": "", "public": "", diff --git a/public/locales/cs/manage/boards.json b/public/locales/cs/manage/boards.json index d8910e1e0..0552c616b 100644 --- a/public/locales/cs/manage/boards.json +++ b/public/locales/cs/manage/boards.json @@ -8,22 +8,22 @@ "categories": "Kategorie" }, "buttons": { - "view": "" + "view": "Zobrazit plochu" }, "menu": { - "setAsDefault": "", + "setAsDefault": "Nastavit jako výchozí plochu", "delete": { - "label": "", - "disabled": "" + "label": "Trvale smazat", + "disabled": "Smazání je zakázáno, protože starší komponenty Homarru neumožňují smazání výchozí konfigurace. Smazání bude možné v budoucnu." } }, "badges": { - "fileSystem": "", - "default": "" + "fileSystem": "Souborový systém", + "default": "Výchozí" } }, "buttons": { - "create": "" + "create": "Vytvořit novou plochu" }, "modals": { "delete": { @@ -31,13 +31,13 @@ "text": "" }, "create": { - "title": "", - "text": "", + "title": "Vytvořit plochu", + "text": "Název nelze po vytvoření plochy změnit.", "form": { "name": { "label": "" }, - "submit": "" + "submit": "Vytvořit" } } } diff --git a/public/locales/cs/manage/users.json b/public/locales/cs/manage/users.json index d717de76c..a90eb3bba 100644 --- a/public/locales/cs/manage/users.json +++ b/public/locales/cs/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Uživatelé", "pageTitle": "Správa uživatelů", - "text": "", "buttons": { - "create": "" + "create": "Vytvořit" + }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } }, "table": { "header": { - "user": "Uživatel" + "user": "Uživatel", + "email": "E-mail" } }, "tooltips": { diff --git a/public/locales/cs/manage/users/create.json b/public/locales/cs/manage/users/create.json index 846e81df7..ed6677683 100644 --- a/public/locales/cs/manage/users/create.json +++ b/public/locales/cs/manage/users/create.json @@ -1,25 +1,25 @@ { - "metaTitle": "", + "metaTitle": "Vytvořit uživatele", "steps": { "account": { - "title": "", + "title": "První krok", "text": "", "username": { "label": "" }, "email": { - "label": "" + "label": "E-mail" } }, "security": { - "title": "", + "title": "Druhý krok", "text": "", "password": { "label": "" } }, "finish": { - "title": "", + "title": "Potvrzení", "text": "", "card": { "title": "", @@ -30,7 +30,7 @@ "property": "", "value": "", "username": "", - "email": "", + "email": "E-mail", "password": "" }, "notSet": "", diff --git a/public/locales/cs/manage/users/edit.json b/public/locales/cs/manage/users/edit.json new file mode 100644 index 000000000..ec7c98fd3 --- /dev/null +++ b/public/locales/cs/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Obecné", + "inputs": { + "username": { + "label": "" + }, + "eMail": { + "label": "E-mail" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Trvale smazat", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/cs/manage/users/invites.json b/public/locales/cs/manage/users/invites.json index ea4fc945a..11c354e8b 100644 --- a/public/locales/cs/manage/users/invites.json +++ b/public/locales/cs/manage/users/invites.json @@ -20,11 +20,11 @@ }, "modals": { "create": { - "title": "", - "description": "", + "title": "Vytvořit pozvánku", + "description": "Po vypršení platnosti pozvánka přestane být platná a příjemce pozvánky si nebude moci vytvořit účet.", "form": { - "expires": "", - "submit": "" + "expires": "Datum konce platnosti", + "submit": "Vytvořit" } }, "copy": { @@ -44,5 +44,5 @@ "description": "" } }, - "noInvites": "" + "noInvites": "Zatím zde nejsou žádné pozvánky." } \ No newline at end of file diff --git a/public/locales/cs/modules/bookmark.json b/public/locales/cs/modules/bookmark.json index 87bf684c7..c4691e3b2 100644 --- a/public/locales/cs/modules/bookmark.json +++ b/public/locales/cs/modules/bookmark.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Záložka", + "description": "Zobrazí statický seznam textů nebo odkazů", "settings": { "title": "", "name": { diff --git a/public/locales/cs/modules/calendar.json b/public/locales/cs/modules/calendar.json index 03c146c39..f91eed31e 100644 --- a/public/locales/cs/modules/calendar.json +++ b/public/locales/cs/modules/calendar.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Kalendář", + "description": "Zobrazí kalendář s nadcházejícími vydáními z podporovaných integrací.", "settings": { "title": "", "radarrReleaseType": { diff --git a/public/locales/cs/modules/dashdot.json b/public/locales/cs/modules/dashdot.json index 98f45c5c2..66228ced5 100644 --- a/public/locales/cs/modules/dashdot.json +++ b/public/locales/cs/modules/dashdot.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Dash.", + "description": "Zobrazuje grafy z externího Dash. Instance uvnitř Homarru.", "settings": { "title": "", "dashName": { @@ -82,7 +82,7 @@ } }, "card": { - "title": "", + "title": "Dash.", "errors": { "noService": "", "noInformation": "", diff --git a/public/locales/cs/modules/date.json b/public/locales/cs/modules/date.json index e8ca6f5e8..2358c4563 100644 --- a/public/locales/cs/modules/date.json +++ b/public/locales/cs/modules/date.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Datum a čas", + "description": "Zobrazuje aktuální datum a čas.", "settings": { "title": "", "display24HourFormat": { diff --git a/public/locales/cs/modules/dlspeed.json b/public/locales/cs/modules/dlspeed.json index 770488591..c034b3284 100644 --- a/public/locales/cs/modules/dlspeed.json +++ b/public/locales/cs/modules/dlspeed.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "" + "name": "Rychlost stahování", + "description": "Zobrazuje rychlost stahování a odesílání z podporovaných integrací." }, "card": { "table": { diff --git a/public/locales/cs/modules/dns-hole-controls.json b/public/locales/cs/modules/dns-hole-controls.json index 3bf25c924..deb82a48b 100644 --- a/public/locales/cs/modules/dns-hole-controls.json +++ b/public/locales/cs/modules/dns-hole-controls.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Ovládání DNS hole", + "description": "Ovládejte PiHole nebo AdGuard z plochy", "settings": { "title": "", "showToggleAllButtons": { diff --git a/public/locales/cs/modules/dns-hole-summary.json b/public/locales/cs/modules/dns-hole-summary.json index 50bc08c3c..86f2bfa63 100644 --- a/public/locales/cs/modules/dns-hole-summary.json +++ b/public/locales/cs/modules/dns-hole-summary.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Shrnutí DNS hole", + "description": "Zobrazuje důležitá data ze služby PiHole nebo AdGuard", "settings": { "title": "", "usePiHoleColors": { diff --git a/public/locales/cs/modules/iframe.json b/public/locales/cs/modules/iframe.json index cbd07acf7..93879b490 100644 --- a/public/locales/cs/modules/iframe.json +++ b/public/locales/cs/modules/iframe.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "", + "name": "iFrame", + "description": "Vložte jakýkoli obsah z internetu. Některé webové stránky mohou omezit přístup.", "settings": { "title": "", "embedUrl": { diff --git a/public/locales/cs/modules/media-requests-list.json b/public/locales/cs/modules/media-requests-list.json index bef8c144b..5904c0146 100644 --- a/public/locales/cs/modules/media-requests-list.json +++ b/public/locales/cs/modules/media-requests-list.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Žádosti o média", + "description": "Podívejte se na seznam všech požadavků na média z vaší instance Overseerr nebo Jellyseerr", "settings": { "title": "", "replaceLinksWithExternalHost": { diff --git a/public/locales/cs/modules/media-requests-stats.json b/public/locales/cs/modules/media-requests-stats.json index 8ad032e26..4ec55c171 100644 --- a/public/locales/cs/modules/media-requests-stats.json +++ b/public/locales/cs/modules/media-requests-stats.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Statistiky požadavků na média", + "description": "Statistiky vašich požadavků na média", "settings": { "title": "", "replaceLinksWithExternalHost": { diff --git a/public/locales/cs/modules/media-server.json b/public/locales/cs/modules/media-server.json index 16a686ef7..80a41cf27 100644 --- a/public/locales/cs/modules/media-server.json +++ b/public/locales/cs/modules/media-server.json @@ -1,7 +1,7 @@ { "descriptor": { "name": "Mediální server", - "description": "", + "description": "Interagujte se svým mediálním serverem Jellyfin nebo Plex", "settings": { "title": "" } diff --git a/public/locales/cs/modules/notebook.json b/public/locales/cs/modules/notebook.json index 69b88092c..4bd1c9a93 100644 --- a/public/locales/cs/modules/notebook.json +++ b/public/locales/cs/modules/notebook.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Zápisník", + "description": "Interaktivní widget založený na Markdownu, do kterého si můžete zapisovat poznámky!", "settings": { "title": "", "showToolbar": { diff --git a/public/locales/cs/modules/rss.json b/public/locales/cs/modules/rss.json index 32b2b7889..8755e2736 100644 --- a/public/locales/cs/modules/rss.json +++ b/public/locales/cs/modules/rss.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "", + "name": "RSS Widget", + "description": "RSS widget umožňuje zobrazit RSS kanály na vaší nástěnce.", "settings": { "title": "", "rssFeedUrl": { diff --git a/public/locales/cs/modules/smart-home/entity-state.json b/public/locales/cs/modules/smart-home/entity-state.json new file mode 100644 index 000000000..415cc293d --- /dev/null +++ b/public/locales/cs/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "", + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "entityId": { + "label": "", + "info": "" + }, + "displayName": { + "label": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/cs/modules/torrents-status.json b/public/locales/cs/modules/torrents-status.json index af0834cb1..0588402eb 100644 --- a/public/locales/cs/modules/torrents-status.json +++ b/public/locales/cs/modules/torrents-status.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Torrenty", + "description": "Zobrazuje seznam torrentů z podporovaných klientů Torrent.", "settings": { "title": "", "refreshInterval": { @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "", "name": "", + "dateAdded": "", "size": "", "download": "", "upload": "", "estimatedTimeOfArrival": "", - "progress": "" + "progress": "", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "", + "stateMessage": "" }, "item": { "text": "" diff --git a/public/locales/cs/modules/usenet.json b/public/locales/cs/modules/usenet.json index dfe4e1e86..b94cbc949 100644 --- a/public/locales/cs/modules/usenet.json +++ b/public/locales/cs/modules/usenet.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "" + "name": "Usenet", + "description": "Umožňuje zobrazit a spravovat instanci Usenetu." }, "card": { "errors": { diff --git a/public/locales/cs/modules/video-stream.json b/public/locales/cs/modules/video-stream.json index 539daa1c4..62e7c6631 100644 --- a/public/locales/cs/modules/video-stream.json +++ b/public/locales/cs/modules/video-stream.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Streamování videa", + "description": "Vložte video stream nebo video z kamery nebo webové stránky", "settings": { "title": "", "FeedUrl": { diff --git a/public/locales/cs/modules/weather.json b/public/locales/cs/modules/weather.json index 9e52e237f..af5c028ce 100644 --- a/public/locales/cs/modules/weather.json +++ b/public/locales/cs/modules/weather.json @@ -1,7 +1,7 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Počasí", + "description": "Zobrazuje aktuální informace o počasí na nastaveném místě.", "settings": { "title": "", "displayInFahrenheit": { diff --git a/public/locales/cs/tools/docker.json b/public/locales/cs/tools/docker.json index 54e726b73..722854510 100644 --- a/public/locales/cs/tools/docker.json +++ b/public/locales/cs/tools/docker.json @@ -2,18 +2,18 @@ "title": "", "alerts": { "notConfigured": { - "text": "" + "text": "Vaše instance Homarr nemá nakonfigurovaný Docker nebo se nepodařilo načíst kontejnery. Podívejte se prosím do dokumentace, jak integraci nastavit." } }, "modals": { "selectBoard": { - "title": "", - "text": "", + "title": "Vyberte plochu", + "text": "Vyberte plochu, na kterou chcete přidat aplikace pro vybrané Docker kontejnery.", "form": { "board": { - "label": "" + "label": "Plocha" }, - "submit": "" + "submit": "Přidat aplikace" } } }, diff --git a/public/locales/cs/user/preferences.json b/public/locales/cs/user/preferences.json index 6c0e93d28..11fe31f96 100644 --- a/public/locales/cs/user/preferences.json +++ b/public/locales/cs/user/preferences.json @@ -1,48 +1,48 @@ { - "metaTitle": "", - "pageTitle": "", + "metaTitle": "Předvolby", + "pageTitle": "Vaše předvolby", "boards": { "defaultBoard": { - "label": "" + "label": "Výchozí plocha" } }, "accessibility": { "title": "", "disablePulse": { - "label": "", - "description": "" + "label": "Vypnout pulsování pingu", + "description": "Ve výchozím nastavení budou indikátory pingu v Homarru pulzovat. To může být dráždivé. Tento posuvník deaktivuje animaci" }, "replaceIconsWithDots": { - "label": "", - "description": "" + "label": "Nahraďte tečky pingu ikonami", + "description": "Pro barvoslepé uživatele mohou být body pingu nerozpoznatelné. Toto nahradí indikátory ikonami" } }, "localization": { "language": { - "label": "" + "label": "Jazyk" }, "firstDayOfWeek": { - "label": "", + "label": "První den v týdnu", "options": { - "monday": "", - "saturday": "", - "sunday": "" + "monday": "Pondělí", + "saturday": "Sobota", + "sunday": "Neděle" } } }, "searchEngine": { - "title": "", - "custom": "", + "title": "Vyhledávač", + "custom": "Vlastní", "newTab": { - "label": "" + "label": "Otevřít výsledky hledání v nové záložce" }, "autoFocus": { - "label": "", - "description": "" + "label": "Zaměřit na vyhledávací panel po načtení stránky.", + "description": "Při přechodu na stránky plochy se automaticky zaměří vyhledávací panel. Funguje pouze na stolních počítačích." }, "template": { - "label": "", - "description": "" + "label": "Adresa URL dotazu", + "description": "Použijte %s jako zástupný znak pro dotaz" } } } \ No newline at end of file diff --git a/public/locales/da/manage/users.json b/public/locales/da/manage/users.json index 578b429ed..9f647d494 100644 --- a/public/locales/da/manage/users.json +++ b/public/locales/da/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Brugere", "pageTitle": "Administrér brugere", - "text": "Ved hjælp af brugere kan du konfigurere, hvem der kan redigere dine dashboards. Fremtidige versioner af Homarr vil have endnu mere detaljeret kontrol over tilladelser og tavler.", "buttons": { "create": "Opret" }, + "filter": { + "roles": { + "all": "Alle", + "normal": "Normal", + "admin": "Admin", + "owner": "Ejer" + } + }, "table": { "header": { - "user": "Bruger" + "user": "Bruger", + "email": "E-mail" } }, "tooltips": { diff --git a/public/locales/da/manage/users/edit.json b/public/locales/da/manage/users/edit.json new file mode 100644 index 000000000..cadcfedc9 --- /dev/null +++ b/public/locales/da/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "Bruger {{username}}", + "back": "Tilbage til brugeradministration", + "sections": { + "general": { + "title": "Generelt", + "inputs": { + "username": { + "label": "Brugernavn" + }, + "eMail": { + "label": "E-mail" + } + } + }, + "security": { + "title": "Sikkerhed", + "inputs": { + "password": { + "label": "Nyt kodeord" + }, + "terminateExistingSessions": { + "label": "Afslut eksisterende sessioner", + "description": "Tvinger brugeren til at logge ind igen på deres enheder" + }, + "confirm": { + "label": "Bekræft", + "description": "Adgangskoden vil blive opdateret. Handlingen kan ikke fortrydes." + } + } + }, + "roles": { + "title": "Roller", + "currentRole": "Nuværende rolle: ", + "badges": { + "owner": "Ejer", + "admin": "Admin", + "normal": "Normal" + } + }, + "deletion": { + "title": "Sletning af konto", + "inputs": { + "confirmUsername": { + "label": "Bekræft brugernavn", + "description": "Indtast brugernavn for at bekræfte sletningen" + }, + "confirm": { + "label": "Slet permanent", + "description": "Jeg er klar over, at denne handling er permanent, og alle kontodata vil gå tabt." + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/da/modules/smart-home/entity-state.json b/public/locales/da/modules/smart-home/entity-state.json new file mode 100644 index 000000000..b9d378b63 --- /dev/null +++ b/public/locales/da/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "Entitet blev ikke fundet", + "descriptor": { + "name": "Home Assistant entitet", + "description": "Aktuel tilstand for en entitet i Home Assistant", + "settings": { + "title": "Entitet tilstand", + "entityId": { + "label": "Entitet ID", + "info": "Unikt entitets-id i Home Assistant. Kopier ved at klikke på entitet > Klik på tandhjulsikon > Klik på kopieringsknappen ved 'Entitets-ID'. Nogle brugerdefinerede entiteter understøttes muligvis ikke." + }, + "displayName": { + "label": "Visningsnavn" + } + } + } +} \ No newline at end of file diff --git a/public/locales/da/modules/torrents-status.json b/public/locales/da/modules/torrents-status.json index 94d83f495..0e00e3bbd 100644 --- a/public/locales/da/modules/torrents-status.json +++ b/public/locales/da/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "Downloader", "name": "Navn", + "dateAdded": "Tilføjet den", "size": "Størrelse", "download": "Down", "upload": "Up", "estimatedTimeOfArrival": "ETA", - "progress": "Fremskridt" + "progress": "Fremskridt", + "totalUploaded": "Samlet upload", + "totalDownloaded": "Samlet download", + "ratio": "Delingsforhold", + "seeds": "Seeds (forbundet)", + "peers": "Peers (forbundet)", + "label": "Etiket", + "state": "Tilstand", + "stateMessage": "Tilstandsbesked" }, "item": { "text": "Administreret af {{appName}}, {{ratio}} ratio" diff --git a/public/locales/de/manage/users.json b/public/locales/de/manage/users.json index 8e104a643..460f6ab3d 100644 --- a/public/locales/de/manage/users.json +++ b/public/locales/de/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Benutzer", "pageTitle": "Verwaltung von Benutzern", - "text": "Mit Benutzern können Sie konfigurieren, wer Ihre Dashboards bearbeiten kann. Zukünftige Versionen von Homarr werden eine noch detailliertere Kontrolle über Berechtigungen und Boards haben.", "buttons": { "create": "Erstellen" }, + "filter": { + "roles": { + "all": "Alle", + "normal": "Normal", + "admin": "Admin", + "owner": "Eigentümer" + } + }, "table": { "header": { - "user": "Benutzer" + "user": "Benutzer", + "email": "E-Mail" } }, "tooltips": { diff --git a/public/locales/de/manage/users/edit.json b/public/locales/de/manage/users/edit.json new file mode 100644 index 000000000..392807ad0 --- /dev/null +++ b/public/locales/de/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "Benutzer {{username}}", + "back": "Zurück zur Benutzerverwaltung", + "sections": { + "general": { + "title": "Allgemein", + "inputs": { + "username": { + "label": "Benutzername" + }, + "eMail": { + "label": "E-Mail" + } + } + }, + "security": { + "title": "Sicherheit", + "inputs": { + "password": { + "label": "Neues Passwort" + }, + "terminateExistingSessions": { + "label": "Beenden Sie bestehende Sitzungen", + "description": "Erzwingt die erneute Anmeldung des Benutzers auf seinen Geräten" + }, + "confirm": { + "label": "Bestätigen", + "description": "Das Passwort wird aktualisiert. Diese Aktion kann nicht rückgängig gemacht werden." + } + } + }, + "roles": { + "title": "Rollen", + "currentRole": "Aktuelle Rolle: ", + "badges": { + "owner": "Eigentümer", + "admin": "Admin", + "normal": "Normal" + } + }, + "deletion": { + "title": "Löschung des Kontos", + "inputs": { + "confirmUsername": { + "label": "Benutzername bestätigen", + "description": "Geben Sie den Benutzernamen ein, um die Löschung zu bestätigen" + }, + "confirm": { + "label": "Dauerhaft löschen", + "description": "Ich bin mir bewusst, dass diese Maßnahme dauerhaft ist und alle Kontodaten im Zuge dessen verloren gehen." + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/de/modules/smart-home/entity-state.json b/public/locales/de/modules/smart-home/entity-state.json new file mode 100644 index 000000000..2cee8a126 --- /dev/null +++ b/public/locales/de/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "Eintrag nicht gefunden", + "descriptor": { + "name": "Home Assistant Eintrag", + "description": "Aktueller Status eines Eintrags in Home Assistant", + "settings": { + "title": "Zustand des Eintrags", + "entityId": { + "label": "Eintrag-ID", + "info": "Eindeutige Eintrag-ID im Home Assistant. Kopieren durch Anklicken von Eintrag > Anklicken des Zahnradsymbols > Anklicken der Schaltfläche \"Kopieren\" bei \"Eintrag-ID\". Einige benutzerdefinierte Einträge werden möglicherweise nicht unterstützt." + }, + "displayName": { + "label": "Anzeigename" + } + } + } +} \ No newline at end of file diff --git a/public/locales/de/modules/torrents-status.json b/public/locales/de/modules/torrents-status.json index fc8a201f0..9effe7066 100644 --- a/public/locales/de/modules/torrents-status.json +++ b/public/locales/de/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "Herunterladen", "name": "Name", + "dateAdded": "Hinzugefügt am", "size": "Größe", "download": "Down", "upload": "Up", "estimatedTimeOfArrival": "Voraussichtlicher Abschluss", - "progress": "Fortschritt" + "progress": "Fortschritt", + "totalUploaded": "Upload gesamt", + "totalDownloaded": "Download gesamt", + "ratio": "Verhältnis", + "seeds": "Seeds (verbunden)", + "peers": "Peers (Verbunden)", + "label": "Kategorie", + "state": "Staat", + "stateMessage": "Statusmeldung" }, "item": { "text": "Verwaltet von {{appName}}, {{ratio}} ratio" diff --git a/public/locales/el/manage/users.json b/public/locales/el/manage/users.json index 196ed572c..96f4a5722 100644 --- a/public/locales/el/manage/users.json +++ b/public/locales/el/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Χρήστες", "pageTitle": "Διαχείριση χρηστών", - "text": "Χρησιμοποιώντας τους χρήστες, μπορείτε να ρυθμίσετε ποιος μπορεί να επεξεργάζεται τους πίνακές σας. Οι μελλοντικές εκδόσεις του Homarr θα έχουν ακόμα πιο λεπτομερή έλεγχο των δικαιωμάτων και των πινάκων.", "buttons": { "create": "Δημιουργία" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "Χρήστης" + "user": "Χρήστης", + "email": "E-Mail" } }, "tooltips": { diff --git a/public/locales/el/manage/users/edit.json b/public/locales/el/manage/users/edit.json new file mode 100644 index 000000000..ed92c187f --- /dev/null +++ b/public/locales/el/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Γενικά", + "inputs": { + "username": { + "label": "Όνομα Χρήστη" + }, + "eMail": { + "label": "E-Mail" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Επιβεβαίωση", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Οριστική διαγραφή", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/el/modules/smart-home/entity-state.json b/public/locales/el/modules/smart-home/entity-state.json new file mode 100644 index 000000000..16ee484da --- /dev/null +++ b/public/locales/el/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "Η οντότητα δε βρέθηκε", + "descriptor": { + "name": "Οντότητα Home Assistant", + "description": "Τρέχουσα κατάσταση μιας οντότητας στο Home Assistant", + "settings": { + "title": "Κατάσταση οντότητας", + "entityId": { + "label": "Αναγνωριστικό οντότητας", + "info": "Μοναδικό αναγνωριστικό οντότητας στο Home Assistant. Αντιγράψτε κάνοντας κλικ στην οντότητα > Κάντε κλικ στο εικονίδιο με το γρανάζι > Κάντε κλικ στο κουμπί αντιγραφής στο 'Αναγνωριστικό οντότητας'. Ορισμένες προσαρμοσμένες οντότητες ενδέχεται να μην υποστηρίζονται." + }, + "displayName": { + "label": "Εμφανιζόμενο όνομα" + } + } + } +} \ No newline at end of file diff --git a/public/locales/el/modules/torrents-status.json b/public/locales/el/modules/torrents-status.json index f3828f9b1..2436f3a9a 100644 --- a/public/locales/el/modules/torrents-status.json +++ b/public/locales/el/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "Λήψη", "name": "Όνομα", + "dateAdded": "Προστέθηκε στις", "size": "Μέγεθος", "download": "Κάτω", "upload": "Πάνω", "estimatedTimeOfArrival": "Εκτιμώμενος χρόνος αναμονής", - "progress": "Πρόοδος" + "progress": "Πρόοδος", + "totalUploaded": "Συνολική Μεταφόρτωση", + "totalDownloaded": "Συνολικές λήψεις", + "ratio": "Αναλογία", + "seeds": "Seeds (Συνδεδεμένοι)", + "peers": "Peers (Συνδεδεμένοι)", + "label": "Ετικέτα", + "state": "Κατάσταση", + "stateMessage": "Μήνυμα Κατάστασης" }, "item": { "text": "Διαχειρίζεται από {{appName}}, {{ratio}} αναλογία" diff --git a/public/locales/es/manage/users.json b/public/locales/es/manage/users.json index 415e3697c..ff00aae45 100644 --- a/public/locales/es/manage/users.json +++ b/public/locales/es/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Usuarios", "pageTitle": "Administrar usuarios", - "text": "Mediante los usuarios, puedes configurar quién puede editar tus paneles. Las versiones futuras de Homarr tendrán un control aún más granular sobre los permisos y los tableros.", "buttons": { "create": "Crear" }, + "filter": { + "roles": { + "all": "", + "normal": "Normal", + "admin": "Administrador", + "owner": "Dueño" + } + }, "table": { "header": { - "user": "Usuario" + "user": "Usuario", + "email": "Correo electrónico" } }, "tooltips": { diff --git a/public/locales/es/manage/users/edit.json b/public/locales/es/manage/users/edit.json new file mode 100644 index 000000000..c34bd5787 --- /dev/null +++ b/public/locales/es/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "Usuario {{username}}", + "back": "Volver a la administración de usuario", + "sections": { + "general": { + "title": "General", + "inputs": { + "username": { + "label": "Nombre de usuario" + }, + "eMail": { + "label": "Correo electrónico" + } + } + }, + "security": { + "title": "Seguridad", + "inputs": { + "password": { + "label": "Nueva contraseña" + }, + "terminateExistingSessions": { + "label": "Finalizar sesiones activas", + "description": "Fuerza al usuario a iniciar sesión nuevamente en sus dispositivos" + }, + "confirm": { + "label": "Confirmar", + "description": "La contraseña será actualiza. La acción no puede ser revertida." + } + } + }, + "roles": { + "title": "Roles", + "currentRole": "Rol actual: ", + "badges": { + "owner": "Dueño", + "admin": "Administrador", + "normal": "Normal" + } + }, + "deletion": { + "title": "Eliminación de la cuenta", + "inputs": { + "confirmUsername": { + "label": "Confirmar nombre de usuario", + "description": "Introduzca el nombre de usuario para confirmar la eliminación" + }, + "confirm": { + "label": "Eliminar permanentemente", + "description": "Estoy al tanto de que dicha acción es permanente, y todos los datos serán borrados." + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/es/modules/smart-home/entity-state.json b/public/locales/es/modules/smart-home/entity-state.json new file mode 100644 index 000000000..42c9b88dd --- /dev/null +++ b/public/locales/es/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "Entidad no encontrada", + "descriptor": { + "name": "Entidad de Home Assistant", + "description": "Estado actual de una entidad en Home Assistant", + "settings": { + "title": "Estado de la entidad", + "entityId": { + "label": "ID de la entidad", + "info": "ID de entidad única en Home Assistant. Copie haciendo clic en la entidad > Clic en el icono de engranaje > Clic en el botón copiar en 'ID de entidad'. Algunas entidades personalizadas pueden no ser compatibles." + }, + "displayName": { + "label": "Nombre a mostrar" + } + } + } +} \ No newline at end of file diff --git a/public/locales/es/modules/torrents-status.json b/public/locales/es/modules/torrents-status.json index 493c91153..a3795eda2 100644 --- a/public/locales/es/modules/torrents-status.json +++ b/public/locales/es/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "Descargando", "name": "Nombre", + "dateAdded": "Añadido En", "size": "Tamaño", "download": "Descarga", "upload": "Subida", "estimatedTimeOfArrival": "Tiempo restante", - "progress": "Completado %" + "progress": "Completado %", + "totalUploaded": "Subida Total", + "totalDownloaded": "Descarga Total", + "ratio": "Ratio", + "seeds": "Semillas (conectadas)", + "peers": "Pares (conectados)", + "label": "Etiqueta", + "state": "Estado", + "stateMessage": "Mensaje de estado" }, "item": { "text": "Gestionado por {{appName}}, proporción {{ratio}}" diff --git a/public/locales/fr/layout/errors/access-denied.json b/public/locales/fr/layout/errors/access-denied.json index 96713fc3f..9ebb0bbb6 100644 --- a/public/locales/fr/layout/errors/access-denied.json +++ b/public/locales/fr/layout/errors/access-denied.json @@ -1,5 +1,5 @@ { "title": "Accès refusé", - "text": "Vous n'avez pas les permissions suffissantes pour accéder à cette page. Si vous pouvez pensez qu'il s'agit d'une erreur, veuillez contacter votre administrateur.", + "text": "Vous n'avez pas les permissions suffisantes pour accéder à cette page. Si vous pensez qu'il s'agit d'une erreur, veuillez contacter votre administrateur.", "switchAccount": "Basculer sur un autre compte" } \ No newline at end of file diff --git a/public/locales/fr/manage/users.json b/public/locales/fr/manage/users.json index 2f95243f2..515d73b52 100644 --- a/public/locales/fr/manage/users.json +++ b/public/locales/fr/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Utilisateurs", "pageTitle": "Gérer les utilisateurs", - "text": "En utilisant des utilisateurs, vous pouvez configurer qui peut éditer vos tableaux de bord. Les prochaines versions de Homarr auront un contrôle plus fin quant aux permissions et les tableaux de bord.", "buttons": { "create": "Créer" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "Utilisateur" + "user": "Utilisateur", + "email": "Courriel" } }, "tooltips": { diff --git a/public/locales/fr/manage/users/edit.json b/public/locales/fr/manage/users/edit.json new file mode 100644 index 000000000..456fd7c76 --- /dev/null +++ b/public/locales/fr/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Général", + "inputs": { + "username": { + "label": "Nom d'utilisateur" + }, + "eMail": { + "label": "Courriel" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Confirmer", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Supprimer définitivement", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/fr/modules/smart-home/entity-state.json b/public/locales/fr/modules/smart-home/entity-state.json new file mode 100644 index 000000000..5c36c0216 --- /dev/null +++ b/public/locales/fr/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "Entité non trouvée", + "descriptor": { + "name": "Entité Home Assistant", + "description": "État actuel d'une entité dans Home Assistant", + "settings": { + "title": "État de l'entité", + "entityId": { + "label": "ID de l’entité", + "info": "ID d’entité unique dans Home Assistant. Copiez en cliquant sur l'entité > Cliquez sur l'icône en forme de rouage > Cliquez sur le bouton Copier sous « ID d'entité ». Certaines entités personnalisées peuvent ne pas être prises en charge." + }, + "displayName": { + "label": "Nom d'affichage" + } + } + } +} \ No newline at end of file diff --git a/public/locales/fr/modules/torrents-status.json b/public/locales/fr/modules/torrents-status.json index 7ef7a58b6..c9f35a3f5 100644 --- a/public/locales/fr/modules/torrents-status.json +++ b/public/locales/fr/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "Téléchargement en cours", "name": "Nom", + "dateAdded": "", "size": "Taille", "download": "Descendant", "upload": "Montant", "estimatedTimeOfArrival": "ETA", - "progress": "Progrès" + "progress": "Progrès", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "État", + "stateMessage": "" }, "item": { "text": "Géré par {{appName}}, {{ratio}} ratio" diff --git a/public/locales/he/manage/users.json b/public/locales/he/manage/users.json index 882562149..7faecaf64 100644 --- a/public/locales/he/manage/users.json +++ b/public/locales/he/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "משתמשים", "pageTitle": "ניהול משתמשים", - "text": "באמצעות משתמשים, באפשרותך להגדיר מי יוכל לערוך את לוח המחוונים שלך. גרסאות עתידיות של Homarr יהיו בעלות שליטה פרטנית עוד יותר על הרשאות ולוחות.", "buttons": { "create": "צור" }, + "filter": { + "roles": { + "all": "את כל", + "normal": "רגיל", + "admin": "מנהל מערכת", + "owner": "בעלים" + } + }, "table": { "header": { - "user": "משתמש" + "user": "משתמש", + "email": "אימייל" } }, "tooltips": { diff --git a/public/locales/he/manage/users/edit.json b/public/locales/he/manage/users/edit.json new file mode 100644 index 000000000..1c3ed9e9c --- /dev/null +++ b/public/locales/he/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "משתמש {{username}}", + "back": "חזרה לניהול משתמשים", + "sections": { + "general": { + "title": "כללי", + "inputs": { + "username": { + "label": "שם משתמש" + }, + "eMail": { + "label": "אימייל" + } + } + }, + "security": { + "title": "אבטחה", + "inputs": { + "password": { + "label": "סיסמה חדשה" + }, + "terminateExistingSessions": { + "label": "סיום הפעלות קיימות", + "description": "מאלץ את המשתמש להתחבר שוב במכשירים שלו" + }, + "confirm": { + "label": "לאשר", + "description": "הסיסמה תעודכן. לא ניתן לבטל פעולה." + } + } + }, + "roles": { + "title": "תפקידים", + "currentRole": "תפקיד נוכחי: ", + "badges": { + "owner": "בעלים", + "admin": "מנהל מערכת", + "normal": "רגיל" + } + }, + "deletion": { + "title": "מחיקת חשבון", + "inputs": { + "confirmUsername": { + "label": "אשר את שם המשתמש", + "description": "הקלד שם משתמש כדי לאשר את המחיקה" + }, + "confirm": { + "label": "מחיקה לצמיתות", + "description": "אני מודע לכך שהפעולה הזו היא קבועה וכל נתוני החשבון יאבדו." + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/he/modules/smart-home/entity-state.json b/public/locales/he/modules/smart-home/entity-state.json new file mode 100644 index 000000000..06835304a --- /dev/null +++ b/public/locales/he/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "הישות לא נמצאה", + "descriptor": { + "name": "ישות Home Assistant", + "description": "מצב נוכחי של ישות ב-Home Assistant", + "settings": { + "title": "מצב ישות", + "entityId": { + "label": "מזהה ישות", + "info": "מזהה ישות ייחודי ב-Home Assistant. העתק על ידי לחיצה על ישות > לחץ על סמל גלגל שיניים > לחץ על כפתור העתק ב'זיהוי ישות'. ייתכן שחלק מהישויות המותאמות אישית אינן נתמכות." + }, + "displayName": { + "label": "הצג שם" + } + } + } +} \ No newline at end of file diff --git a/public/locales/he/modules/torrents-status.json b/public/locales/he/modules/torrents-status.json index 4db036186..90285ffc1 100644 --- a/public/locales/he/modules/torrents-status.json +++ b/public/locales/he/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "מוריד", "name": "שם", + "dateAdded": "נוסף על", "size": "גודל", "download": "הורדה", "upload": "העלאה", "estimatedTimeOfArrival": "זמן סיום משוער", - "progress": "התקדמות" + "progress": "התקדמות", + "totalUploaded": "סך העלאה", + "totalDownloaded": "הורדה כוללת", + "ratio": "יחס", + "seeds": "זרעים (מחוברים)", + "peers": "עמיתים (מחוברים)", + "label": "תווית", + "state": "מצב", + "stateMessage": "הודעת מצב" }, "item": { "text": "מנוהל על ידי {{appName}}, יחס {{ratio}}" diff --git a/public/locales/hr/manage/users.json b/public/locales/hr/manage/users.json index c97ed70f1..58f8c71fa 100644 --- a/public/locales/hr/manage/users.json +++ b/public/locales/hr/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Korisnici", "pageTitle": "Upravljanje korisnicima", - "text": "Pomoću korisnika možete konfigurirati tko može uređivati vaše nadzorne ploče. Buduće verzije Homarra imat će još detaljniju kontrolu nad dozvolama i pločama.", "buttons": { "create": "Stvoriti" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "Korisnik" + "user": "Korisnik", + "email": "E-pošta" } }, "tooltips": { diff --git a/public/locales/hr/manage/users/edit.json b/public/locales/hr/manage/users/edit.json new file mode 100644 index 000000000..aebb4b335 --- /dev/null +++ b/public/locales/hr/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Općenito", + "inputs": { + "username": { + "label": "Korisničko ime" + }, + "eMail": { + "label": "E-pošta" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Potvrdi", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Izbriši trajno", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/hr/modules/smart-home/entity-state.json b/public/locales/hr/modules/smart-home/entity-state.json new file mode 100644 index 000000000..415cc293d --- /dev/null +++ b/public/locales/hr/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "", + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "entityId": { + "label": "", + "info": "" + }, + "displayName": { + "label": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/hr/modules/torrents-status.json b/public/locales/hr/modules/torrents-status.json index 2abddf160..1d9bdf2bb 100644 --- a/public/locales/hr/modules/torrents-status.json +++ b/public/locales/hr/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "", "name": "Naziv", + "dateAdded": "", "size": "Veličina", "download": "Isključeno", "upload": "Uključeno", "estimatedTimeOfArrival": "ETA", - "progress": "Napredak" + "progress": "Napredak", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "Stanje", + "stateMessage": "" }, "item": { "text": "Upravlja {{appName}}, omjer: {{ratio}}" diff --git a/public/locales/hu/manage/users.json b/public/locales/hu/manage/users.json index 90a5c6c20..5949ba1be 100644 --- a/public/locales/hu/manage/users.json +++ b/public/locales/hu/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Felhasználók", "pageTitle": "Felhasználók kezelése", - "text": "A felhasználók segítségével beállíthatja, hogy ki szerkesztheti a műszerfalait. A Homarr jövőbeli verziói még részletesebb szabályozást biztosítanak a jogosultságok és a táblák felett.", "buttons": { "create": "Létrehozás" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "Felhasználó" + "user": "Felhasználó", + "email": "Email cím" } }, "tooltips": { diff --git a/public/locales/hu/manage/users/edit.json b/public/locales/hu/manage/users/edit.json new file mode 100644 index 000000000..8f3c9f455 --- /dev/null +++ b/public/locales/hu/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Általános", + "inputs": { + "username": { + "label": "Felhasználónév" + }, + "eMail": { + "label": "Email cím" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Megerősít", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Végleges törlés", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/hu/modules/smart-home/entity-state.json b/public/locales/hu/modules/smart-home/entity-state.json new file mode 100644 index 000000000..96b150c05 --- /dev/null +++ b/public/locales/hu/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "Elem nem található", + "descriptor": { + "name": "Otthoni asszisztens egység", + "description": "Egy egység aktuális állapota a Home Assistantban", + "settings": { + "title": "Egység állapota", + "entityId": { + "label": "Egység azonosító", + "info": "Egyedi egység ID a Home Assistantben. Másolás az egységre kattintva > Kattintson a fogaskerék ikonra > Kattintson a másolás gombra az „Egység ID”-nél. Előfordulhat, hogy egyes egyéni egységek nem támogatottak." + }, + "displayName": { + "label": "Megjelenített név" + } + } + } +} \ No newline at end of file diff --git a/public/locales/hu/modules/torrents-status.json b/public/locales/hu/modules/torrents-status.json index 29b332c66..d4e0a877a 100644 --- a/public/locales/hu/modules/torrents-status.json +++ b/public/locales/hu/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "Letöltés", "name": "Név", + "dateAdded": "Hozzáadva", "size": "Méret", "download": "Le", "upload": "Fel", "estimatedTimeOfArrival": "Hátralévő idő", - "progress": "Folyamat" + "progress": "Folyamat", + "totalUploaded": "Teljes feltöltés", + "totalDownloaded": "Összes letöltés", + "ratio": "Arány", + "seeds": "Teljes megosztó (csatlakozott)", + "peers": "Részleges megosztó (csatlakozott)", + "label": "Azonosító", + "state": "Állapot", + "stateMessage": "Statikus üzenet" }, "item": { "text": "Kezeli: {{appName}}, {{ratio}} arány" diff --git a/public/locales/it/manage/users.json b/public/locales/it/manage/users.json index 692dc753b..af006c305 100644 --- a/public/locales/it/manage/users.json +++ b/public/locales/it/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Utenti", "pageTitle": "Gestisci utenti", - "text": "Utilizzando gli utenti, è possibile configurare chi può modificare i dashboard. Le versioni future di Homarr offriranno un controllo ancora più granulare sulle autorizzazioni e sulle board.", "buttons": { "create": "Crea" }, + "filter": { + "roles": { + "all": "Tutto", + "normal": "Normale", + "admin": "Admin", + "owner": "Proprietario" + } + }, "table": { "header": { - "user": "Utente" + "user": "Utente", + "email": "E-mail" } }, "tooltips": { diff --git a/public/locales/it/manage/users/edit.json b/public/locales/it/manage/users/edit.json new file mode 100644 index 000000000..f957ee1fa --- /dev/null +++ b/public/locales/it/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "Utente {{username}}", + "back": "Torna alla gestione utenti", + "sections": { + "general": { + "title": "Generale", + "inputs": { + "username": { + "label": "Nome utente" + }, + "eMail": { + "label": "E-mail" + } + } + }, + "security": { + "title": "Sicurezza", + "inputs": { + "password": { + "label": "Nuova password" + }, + "terminateExistingSessions": { + "label": "Termina le sessioni esistenti", + "description": "Forza l'utente ad accedere nuovamente sui propri dispositivi" + }, + "confirm": { + "label": "Conferma", + "description": "La password verrà aggiornata. L'azione non può essere annullata." + } + } + }, + "roles": { + "title": "Ruoli", + "currentRole": "Ruolo attuale: ", + "badges": { + "owner": "Proprietario", + "admin": "Admin", + "normal": "Normale" + } + }, + "deletion": { + "title": "Cancellazione dell'account", + "inputs": { + "confirmUsername": { + "label": "Conferma nome utente", + "description": "Digita il nome utente per confermare l'eliminazione" + }, + "confirm": { + "label": "Elimina definitivamente", + "description": "Sono consapevole che questa azione è permanente e che tutti i dati dell'account andranno persi." + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/it/modules/smart-home/entity-state.json b/public/locales/it/modules/smart-home/entity-state.json new file mode 100644 index 000000000..c83858e5e --- /dev/null +++ b/public/locales/it/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "Entità non trovata", + "descriptor": { + "name": "Entità Home Assistant", + "description": "Stato attuale di un'entità in Home Assistant", + "settings": { + "title": "Stato entità", + "entityId": { + "label": "ID entità", + "info": "ID entità univoco in Home Assistant. Copia facendo clic sull'entità > clic sull'icona della rondella > clic sul pulsante copia in \"ID entità\". Alcune entità personalizzate potrebbero non essere supportate." + }, + "displayName": { + "label": "Visualizza nome" + } + } + } +} \ No newline at end of file diff --git a/public/locales/it/modules/torrents-status.json b/public/locales/it/modules/torrents-status.json index 86b78fe33..2160905c6 100644 --- a/public/locales/it/modules/torrents-status.json +++ b/public/locales/it/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "Download in corso", "name": "Nome", + "dateAdded": "Aggiunto il", "size": "Dimensione", "download": "Down", "upload": "Up", "estimatedTimeOfArrival": "ETA", - "progress": "Avanzamento" + "progress": "Avanzamento", + "totalUploaded": "Upload Totale", + "totalDownloaded": "Download totale", + "ratio": "Ratio", + "seeds": "Seeds (connessi)", + "peers": "Peers (Connessi)", + "label": "Etichetta", + "state": "Stato", + "stateMessage": "Messaggio di stato" }, "item": { "text": "Gestito da {{appName}}, {{ratio}} ratio" diff --git a/public/locales/ja/manage/users.json b/public/locales/ja/manage/users.json index 4d84778da..5859c7d2d 100644 --- a/public/locales/ja/manage/users.json +++ b/public/locales/ja/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "ユーザー", "pageTitle": "ユーザー管理", - "text": "ユーザーを使用して、ダッシュボードを編集できるユーザーを設定できます。Homarrの将来のバージョンでは、権限とボードをさらに細かく制御できるようになります。", "buttons": { "create": "作成" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "ユーザー" + "user": "ユーザー", + "email": "Eメール" } }, "tooltips": { diff --git a/public/locales/ja/manage/users/edit.json b/public/locales/ja/manage/users/edit.json new file mode 100644 index 000000000..176d99790 --- /dev/null +++ b/public/locales/ja/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "一般", + "inputs": { + "username": { + "label": "ユーザー名" + }, + "eMail": { + "label": "Eメール" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "確認", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "永久削除", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/ja/modules/smart-home/entity-state.json b/public/locales/ja/modules/smart-home/entity-state.json new file mode 100644 index 000000000..415cc293d --- /dev/null +++ b/public/locales/ja/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "", + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "entityId": { + "label": "", + "info": "" + }, + "displayName": { + "label": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/ja/modules/torrents-status.json b/public/locales/ja/modules/torrents-status.json index b8e52d1c3..46032f5bf 100644 --- a/public/locales/ja/modules/torrents-status.json +++ b/public/locales/ja/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "", "name": "名称", + "dateAdded": "", "size": "サイズ", "download": "ダウンロード", "upload": "アップロード", "estimatedTimeOfArrival": "ETA", - "progress": "進捗状況" + "progress": "進捗状況", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "状態", + "stateMessage": "" }, "item": { "text": "運営: {{appName}}, {{ratio}} 比率" diff --git a/public/locales/ko/manage/users.json b/public/locales/ko/manage/users.json index 901a06214..1ff1e1baf 100644 --- a/public/locales/ko/manage/users.json +++ b/public/locales/ko/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "사용자", "pageTitle": "사용자 관리", - "text": "사용자를 사용하여 대시보드를 편집할 수 있는 사용자를 구성할 수 있습니다. 향후 Homarr 버전에서는 권한과 보드를 더욱 세밀하게 제어할 수 있습니다.", "buttons": { "create": "만들기" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "사용자" + "user": "사용자", + "email": "이메일" } }, "tooltips": { diff --git a/public/locales/ko/manage/users/edit.json b/public/locales/ko/manage/users/edit.json new file mode 100644 index 000000000..38b03d16a --- /dev/null +++ b/public/locales/ko/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "일반", + "inputs": { + "username": { + "label": "사용자 이름" + }, + "eMail": { + "label": "이메일" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "확인", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "영구 삭제", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/ko/modules/smart-home/entity-state.json b/public/locales/ko/modules/smart-home/entity-state.json new file mode 100644 index 000000000..415cc293d --- /dev/null +++ b/public/locales/ko/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "", + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "entityId": { + "label": "", + "info": "" + }, + "displayName": { + "label": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/ko/modules/torrents-status.json b/public/locales/ko/modules/torrents-status.json index 582f6515f..80b2d165b 100644 --- a/public/locales/ko/modules/torrents-status.json +++ b/public/locales/ko/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "", "name": "이름", + "dateAdded": "", "size": "크기", "download": "다운로드", "upload": "업로드", "estimatedTimeOfArrival": "남은 시간", - "progress": "진행률" + "progress": "진행률", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "상태", + "stateMessage": "" }, "item": { "text": "관리: {{appName}}, {{ratio}} 비율" diff --git a/public/locales/lv/manage/users.json b/public/locales/lv/manage/users.json index b513be1fe..1562ab6e6 100644 --- a/public/locales/lv/manage/users.json +++ b/public/locales/lv/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Lietotāji", "pageTitle": "Pārvaldīt lietotājus", - "text": "Izmantojot lietotājus, varat konfigurēt, kas var rediģēt paneļus. Nākamajās Homarr versijās būs pieejama vēl detalizētāka piekļuves tiesību un dēļu kontrole.", "buttons": { "create": "Izveidot" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "Lietotājs" + "user": "Lietotājs", + "email": "E-pasts" } }, "tooltips": { diff --git a/public/locales/lv/manage/users/edit.json b/public/locales/lv/manage/users/edit.json new file mode 100644 index 000000000..a190593eb --- /dev/null +++ b/public/locales/lv/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Vispārīgi", + "inputs": { + "username": { + "label": "Lietotājvārds" + }, + "eMail": { + "label": "E-pasts" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Apstipriniet", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Neatgriezeniski dzēst", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/lv/modules/smart-home/entity-state.json b/public/locales/lv/modules/smart-home/entity-state.json new file mode 100644 index 000000000..415cc293d --- /dev/null +++ b/public/locales/lv/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "", + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "entityId": { + "label": "", + "info": "" + }, + "displayName": { + "label": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/lv/modules/torrents-status.json b/public/locales/lv/modules/torrents-status.json index 7aefcd158..84beeea59 100644 --- a/public/locales/lv/modules/torrents-status.json +++ b/public/locales/lv/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "", "name": "Nosaukums", + "dateAdded": "", "size": "Lielums", "download": "Lejupielāde", "upload": "Augšupielāde", "estimatedTimeOfArrival": "ETA", - "progress": "Progress" + "progress": "Progress", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "Stāvoklis", + "stateMessage": "" }, "item": { "text": "Pārvalda {{appName}}, {{ratio}} attiecība" diff --git a/public/locales/nl/manage/users.json b/public/locales/nl/manage/users.json index a60fc917d..176acda75 100644 --- a/public/locales/nl/manage/users.json +++ b/public/locales/nl/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Gebruikers", "pageTitle": "Gebruikers beheren", - "text": "Met behulp van gebruikers kun je instellen wie je dashboards mag bewerken. Toekomstige versies van Homarr zullen nog meer granulaire controle hebben over rechten en borden.", "buttons": { "create": "Maak" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "Gebruiker" + "user": "Gebruiker", + "email": "E-mail" } }, "tooltips": { diff --git a/public/locales/nl/manage/users/edit.json b/public/locales/nl/manage/users/edit.json new file mode 100644 index 000000000..270ab7277 --- /dev/null +++ b/public/locales/nl/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Algemeen", + "inputs": { + "username": { + "label": "Gebruikersnaam" + }, + "eMail": { + "label": "E-mail" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Bevestig", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Permanent verwijderen", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/nl/modules/smart-home/entity-state.json b/public/locales/nl/modules/smart-home/entity-state.json new file mode 100644 index 000000000..415cc293d --- /dev/null +++ b/public/locales/nl/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "", + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "entityId": { + "label": "", + "info": "" + }, + "displayName": { + "label": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/nl/modules/torrents-status.json b/public/locales/nl/modules/torrents-status.json index 32d2bd435..49083d16a 100644 --- a/public/locales/nl/modules/torrents-status.json +++ b/public/locales/nl/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "", "name": "Naam", + "dateAdded": "", "size": "Grootte", "download": "Down", "upload": "Up", "estimatedTimeOfArrival": "ETA", - "progress": "Voortgang" + "progress": "Voortgang", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "Status", + "stateMessage": "" }, "item": { "text": "Beheerd door {{appName}}, {{ratio}} verhouding" diff --git a/public/locales/no/common.json b/public/locales/no/common.json index e8c70c589..bc62d1f6b 100644 --- a/public/locales/no/common.json +++ b/public/locales/no/common.json @@ -53,5 +53,5 @@ "height": "Høyde" }, "public": "Offentlig", - "restricted": "" + "restricted": "Begrenset" } \ No newline at end of file diff --git a/public/locales/no/manage/users.json b/public/locales/no/manage/users.json index 440b7bebb..012a3ade7 100644 --- a/public/locales/no/manage/users.json +++ b/public/locales/no/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Brukere", "pageTitle": "Administrer brukere", - "text": "Ved å bruke brukere kan du konfigurere hvem som kan redigere tavlene dine. Fremtidige versjoner av Homarr vil ha enda mer detaljert kontroll over tillatelser og tavler.", "buttons": { "create": "Opprett" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "Bruker" + "user": "Bruker", + "email": "E-post" } }, "tooltips": { diff --git a/public/locales/no/manage/users/edit.json b/public/locales/no/manage/users/edit.json new file mode 100644 index 000000000..e42b28e15 --- /dev/null +++ b/public/locales/no/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Generelt", + "inputs": { + "username": { + "label": "Brukernavn" + }, + "eMail": { + "label": "E-post" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Bekreft", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Slett permanent", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/no/modules/smart-home/entity-state.json b/public/locales/no/modules/smart-home/entity-state.json new file mode 100644 index 000000000..e220f031b --- /dev/null +++ b/public/locales/no/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "Enhet ikke funnet", + "descriptor": { + "name": "Home Assistant enhet", + "description": "Nåværende tilstand for en enhet i Home Assistant", + "settings": { + "title": "Enhetstilstand", + "entityId": { + "label": "Enhets-ID", + "info": "Unik enhets-ID i Home Assistant. Kopier ved å klikke på enhet > Klikk på tannhjulikonet > Klikk på kopieringsknappen ved Entitets-ID. Noen egendefinerte enheter støttes kanskje ikke." + }, + "displayName": { + "label": "Visningsnavn" + } + } + } +} \ No newline at end of file diff --git a/public/locales/no/modules/torrents-status.json b/public/locales/no/modules/torrents-status.json index 3bb3dc204..e8e00479a 100644 --- a/public/locales/no/modules/torrents-status.json +++ b/public/locales/no/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "Laster ned", "name": "Navn", + "dateAdded": "Lagt til", "size": "Størrelse", "download": "Ned", "upload": "Opp", "estimatedTimeOfArrival": "Gjenstående tid (estimat)", - "progress": "Fremgang" + "progress": "Fremgang", + "totalUploaded": "Total opplasting", + "totalDownloaded": "Totalt nedlasting", + "ratio": "Forhold", + "seeds": "Seeds (tilkoblet)", + "peers": "Peers (tilkoblet)", + "label": "Etikett", + "state": "Status", + "stateMessage": "Tilstandsmelding" }, "item": { "text": "Styrt med {{appName}}, {{ratio}} forhold" diff --git a/public/locales/no/settings/customization/page-appearance.json b/public/locales/no/settings/customization/page-appearance.json index ab5c95018..ed470fe49 100644 --- a/public/locales/no/settings/customization/page-appearance.json +++ b/public/locales/no/settings/customization/page-appearance.json @@ -19,26 +19,26 @@ "label": "Bakgrunn" }, "backgroundImageAttachment": { - "label": "", + "label": "Bakgrunnsbildevedlegg", "options": { - "fixed": "", - "scroll": "" + "fixed": "Fast - Bakgrunn holder seg i samme posisjon (anbefales)", + "scroll": "Rull - Bakgrunnen ruller med musen" } }, "backgroundImageSize": { - "label": "", + "label": "Størrelse på bakgrunnsbilde", "options": { - "cover": "", - "contain": "" + "cover": "Dekk - Skalerer bildet så lite som mulig for å dekke hele vinduet ved å beskjære for mye plass. (anbefales)", + "contain": "Sperr inne - Skalerer bildet så stort som mulig i beholderen uten å beskjære eller strekke ut bildet." } }, "backgroundImageRepeat": { - "label": "", + "label": "Bakgrunnsbildevedlegg", "options": { - "repeat": "", - "no-repeat": "", - "repeat-x": "", - "repeat-y": "" + "repeat": "Gjenta - Bildet gjentas så mye som nødvendig for å dekke hele bakgrunnsbildet.", + "no-repeat": "Ingen repetisjon - Bildet gjentas ikke og fyller kanskje ikke hele plassen (anbefalt)", + "repeat-x": "Gjenta X - Samme som \"Gjenta\", men bare på horisontal akse.", + "repeat-y": "Gjenta Y - Samme som \"Gjenta\", men bare på vertikal akse." } }, "customCSS": { diff --git a/public/locales/no/tools/docker.json b/public/locales/no/tools/docker.json index d3895345b..c32d14e1f 100644 --- a/public/locales/no/tools/docker.json +++ b/public/locales/no/tools/docker.json @@ -2,7 +2,7 @@ "title": "Docker", "alerts": { "notConfigured": { - "text": "" + "text": "Din Homarr-forekomst har ikke Docker konfigurert eller den har ikke klart å hente containere. Vennligst sjekk dokumentasjonen for hvordan du setter opp integrasjonen." } }, "modals": { diff --git a/public/locales/pl/manage/users.json b/public/locales/pl/manage/users.json index 248d4b9c6..b28b572c9 100644 --- a/public/locales/pl/manage/users.json +++ b/public/locales/pl/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Użytkownicy", "pageTitle": "Zarządzaj użytkownikami", - "text": "Używając użytkowników, możesz skonfigurować, kto może edytować twoje panele. Przyszłe wersje Homarr będą miały jeszcze większą kontrolę nad uprawnieniami i działami.", "buttons": { "create": "Utwórz" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "Użytkownik" + "user": "Użytkownik", + "email": "E-mail" } }, "tooltips": { diff --git a/public/locales/pl/manage/users/edit.json b/public/locales/pl/manage/users/edit.json new file mode 100644 index 000000000..f8d00574c --- /dev/null +++ b/public/locales/pl/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Ogólne", + "inputs": { + "username": { + "label": "Nazwa użytkownika" + }, + "eMail": { + "label": "E-mail" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Potwierdź", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Usuń trwale", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/pl/modules/smart-home/entity-state.json b/public/locales/pl/modules/smart-home/entity-state.json new file mode 100644 index 000000000..7a20ee12d --- /dev/null +++ b/public/locales/pl/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "Nie znaleziono obiektu", + "descriptor": { + "name": "Obiekt asystenta domu", + "description": "Aktualny stan obiektu w Asystencie Domu", + "settings": { + "title": "Stan obiektu", + "entityId": { + "label": "ID obiektu", + "info": "Unikalne ID obiektu w Asystencie Domu. Kopiuj klikając na obiekt > Kliknij ikonę koła zębatego > Kliknij na przycisk kopiuj na 'ID obiektu'. Niektóre niestandardowe obiekty mogą nie być obsługiwane." + }, + "displayName": { + "label": "Nazwa wyświetlana" + } + } + } +} \ No newline at end of file diff --git a/public/locales/pl/modules/torrents-status.json b/public/locales/pl/modules/torrents-status.json index 324001ae2..312785e3e 100644 --- a/public/locales/pl/modules/torrents-status.json +++ b/public/locales/pl/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "", "name": "Nazwa", + "dateAdded": "", "size": "Rozmiar", "download": "Pobieranie", "upload": "Udostępnianie", "estimatedTimeOfArrival": "ETA", - "progress": "Postęp" + "progress": "Postęp", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "Status", + "stateMessage": "" }, "item": { "text": "Zarządzany przez {{appName}}, {{ratio}} stosunek" diff --git a/public/locales/pt/manage/users.json b/public/locales/pt/manage/users.json index d28922337..fc94a8803 100644 --- a/public/locales/pt/manage/users.json +++ b/public/locales/pt/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Usuários", "pageTitle": "Gerenciar usuários", - "text": "Usando usuários, você pode configurar quem pode editar seus painéis. As versões futuras do Homarr terão um controle ainda mais granular sobre as permissões e os painéis.", "buttons": { "create": "Criar" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "Usuário" + "user": "Usuário", + "email": "E-mail" } }, "tooltips": { diff --git a/public/locales/pt/manage/users/edit.json b/public/locales/pt/manage/users/edit.json new file mode 100644 index 000000000..f34018664 --- /dev/null +++ b/public/locales/pt/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Geral", + "inputs": { + "username": { + "label": "Usuário" + }, + "eMail": { + "label": "E-mail" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Confirme", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Excluir permanentemente", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/pt/modules/smart-home/entity-state.json b/public/locales/pt/modules/smart-home/entity-state.json new file mode 100644 index 000000000..7f0bd673d --- /dev/null +++ b/public/locales/pt/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "Entidade não encontrada", + "descriptor": { + "name": "Entidade Home Assistant", + "description": "Estado atual de uma entidade do Home Assistant", + "settings": { + "title": "Estado da entidade", + "entityId": { + "label": "ID da entidade", + "info": "ID de entidade exclusiva do Home Assistant. Copie clicando na entidade > Clique no ícone de engrenagem > Clique no botão copiar em 'ID da entidade'. Algumas entidades personalizadas podem não ser suportadas." + }, + "displayName": { + "label": "Nome de exibição" + } + } + } +} \ No newline at end of file diff --git a/public/locales/pt/modules/torrents-status.json b/public/locales/pt/modules/torrents-status.json index 6c1fab563..cd004536c 100644 --- a/public/locales/pt/modules/torrents-status.json +++ b/public/locales/pt/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "", "name": "Nome", + "dateAdded": "", "size": "Tamanho", "download": "Para baixo", "upload": "Para cima", "estimatedTimeOfArrival": "TED", - "progress": "Progresso" + "progress": "Progresso", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "Estado", + "stateMessage": "" }, "item": { "text": "Gerido por {{appName}}, {{ratio}} ratio" diff --git a/public/locales/ru/layout/modals/about.json b/public/locales/ru/layout/modals/about.json index 733b951de..e18621e77 100644 --- a/public/locales/ru/layout/modals/about.json +++ b/public/locales/ru/layout/modals/about.json @@ -5,10 +5,10 @@ "key": "Горячие клавиши", "action": "Действие", "keybinds": "Сочетания клавиш", - "translators": "", - "translatorsDescription": "", - "contributors": "", - "contributorsDescription": "", + "translators": "Переводчики ({{count}})", + "translatorsDescription": "Благодаря этим людям Homarr доступен на {{languages}} языках! Хотите помочь перевести Homarr на ваш язык? Как это сделать читайте здесь.", + "contributors": "Соавторы ({{count}})", + "contributorsDescription": "Эти люди создали код, благодаря которому работает homarr! Хотите помочь в создании Homarr? Читайте, как это сделать здесь", "actions": { "toggleTheme": "Переключить светлый/темный режим", "focusSearchBar": "Фокус на панели поиска", diff --git a/public/locales/ru/manage/users.json b/public/locales/ru/manage/users.json index e41f34e3f..84585161f 100644 --- a/public/locales/ru/manage/users.json +++ b/public/locales/ru/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Пользователи", "pageTitle": "Управлять пользователями", - "text": "Используя пользователей, вы можете настроить, кто может редактировать ваши панели. В будущих версиях Homarr у вас будет еще более детальный контроль над правами доступа и панелями.", "buttons": { "create": "Создать" }, + "filter": { + "roles": { + "all": "Все", + "normal": "Обычный", + "admin": "Администратор", + "owner": "Владелец" + } + }, "table": { "header": { - "user": "Пользователь" + "user": "Пользователь", + "email": "E-Mail" } }, "tooltips": { diff --git a/public/locales/ru/manage/users/edit.json b/public/locales/ru/manage/users/edit.json new file mode 100644 index 000000000..464539cf6 --- /dev/null +++ b/public/locales/ru/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "Пользователь {{username}}", + "back": "Вернуться к управлению пользователями", + "sections": { + "general": { + "title": "Общие", + "inputs": { + "username": { + "label": "Имя пользователя" + }, + "eMail": { + "label": "E-Mail" + } + } + }, + "security": { + "title": "Безопасность", + "inputs": { + "password": { + "label": "Новый пароль" + }, + "terminateExistingSessions": { + "label": "Закрыть текущие сессии", + "description": "Заставить пользователя снова войти на своих устройствах" + }, + "confirm": { + "label": "Подтвердить", + "description": "Пароль будет обновлен. Действие не может быть отменено." + } + } + }, + "roles": { + "title": "Роли", + "currentRole": "Текущая роль: ", + "badges": { + "owner": "Владелец", + "admin": "Администратор", + "normal": "Обычный" + } + }, + "deletion": { + "title": "Удаление аккаунта", + "inputs": { + "confirmUsername": { + "label": "Подтвердить имя пользователя", + "description": "Введите имя пользователя, чтобы подтвердить удаление" + }, + "confirm": { + "label": "Удалить навсегда", + "description": "Я знаю, что это действие является необратимым и все данные учетной записи будут потеряны." + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/ru/modules/smart-home/entity-state.json b/public/locales/ru/modules/smart-home/entity-state.json new file mode 100644 index 000000000..37bd91a38 --- /dev/null +++ b/public/locales/ru/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "Объект не найден", + "descriptor": { + "name": "Объект Home Assistant", + "description": "Текущее состояние объекта в Home Assistant", + "settings": { + "title": "Состояние объекта", + "entityId": { + "label": "ID объекта", + "info": "Уникальный идентификатор объекта в Home Assistant. Скопируйте, нажав на объект > Щелкните значок шестеренки > Нажмите кнопку копирования в разделе «Идентификатор объекта». Некоторые пользовательские объекты могут не поддерживаться." + }, + "displayName": { + "label": "Отображаемое имя" + } + } + } +} \ No newline at end of file diff --git a/public/locales/ru/modules/torrents-status.json b/public/locales/ru/modules/torrents-status.json index 37c56b96a..64bcbd61d 100644 --- a/public/locales/ru/modules/torrents-status.json +++ b/public/locales/ru/modules/torrents-status.json @@ -11,10 +11,10 @@ "label": "Отображение завершенных торрентов" }, "displayActiveTorrents": { - "label": "" + "label": "Отображать активные торренты" }, "speedLimitOfActiveTorrents": { - "label": "" + "label": "Скорость загрузки, при которой торрент считается активным (кБ/с)" }, "displayStaleTorrents": { "label": "Отображение устаревших торрентов" @@ -27,7 +27,7 @@ "description": "Когда отмечено 'белый список', применится как белый список. Если не отмечено, применится как чёрный список. Не будет ничего делать, если пусто" }, "displayRatioWithFilter": { - "label": "", + "label": "Отображение соотношения списка отфильтрованных торрентов", "info": "" } } @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "", "name": "Имя", + "dateAdded": "", "size": "Размер", "download": "Загрузка", "upload": "Отдача", "estimatedTimeOfArrival": "Осталось", - "progress": "Прогресс" + "progress": "Прогресс", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "Состояние", + "stateMessage": "" }, "item": { "text": "Под управлением {{appName}}, {{ratio}} рейтинг" diff --git a/public/locales/sk/manage/users.json b/public/locales/sk/manage/users.json index 4b44e0d57..ccd5d520e 100644 --- a/public/locales/sk/manage/users.json +++ b/public/locales/sk/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Používatelia", "pageTitle": "Spravovať používateľov", - "text": "Pomocou používateľov môžete nakonfigurovať, kto môže upravovať informačné panely. Budúce verzie aplikácie Homarr budú mať ešte podrobnejšie ovládanie oprávnení a tabuliek.", "buttons": { "create": "Vytvoriť" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "Používateľ" + "user": "Používateľ", + "email": "E-mail" } }, "tooltips": { diff --git a/public/locales/sk/manage/users/edit.json b/public/locales/sk/manage/users/edit.json new file mode 100644 index 000000000..145ea08e7 --- /dev/null +++ b/public/locales/sk/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Všeobecné", + "inputs": { + "username": { + "label": "Používateľské meno" + }, + "eMail": { + "label": "E-mail" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Potvrďte", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Odstrániť natrvalo", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/sk/modules/smart-home/entity-state.json b/public/locales/sk/modules/smart-home/entity-state.json new file mode 100644 index 000000000..415cc293d --- /dev/null +++ b/public/locales/sk/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "", + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "entityId": { + "label": "", + "info": "" + }, + "displayName": { + "label": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/sk/modules/torrents-status.json b/public/locales/sk/modules/torrents-status.json index 9a67b43a8..115e947f0 100644 --- a/public/locales/sk/modules/torrents-status.json +++ b/public/locales/sk/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "", "name": "Názov", + "dateAdded": "", "size": "Veľkosť", "download": "Dole", "upload": "Hore", "estimatedTimeOfArrival": "Odhad", - "progress": "Stav" + "progress": "Stav", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "Stav", + "stateMessage": "" }, "item": { "text": "Spravuje {{appName}}, {{ratio}} pomer" diff --git a/public/locales/sl/manage/users.json b/public/locales/sl/manage/users.json index 700a5d503..c2c769454 100644 --- a/public/locales/sl/manage/users.json +++ b/public/locales/sl/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "", "pageTitle": "", - "text": "", "buttons": { "create": "" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "Uporabnik" + "user": "Uporabnik", + "email": "" } }, "tooltips": { diff --git a/public/locales/sl/manage/users/edit.json b/public/locales/sl/manage/users/edit.json new file mode 100644 index 000000000..9be480801 --- /dev/null +++ b/public/locales/sl/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Splošno", + "inputs": { + "username": { + "label": "Uporabniško ime" + }, + "eMail": { + "label": "" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Potrdi", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/sl/modules/smart-home/entity-state.json b/public/locales/sl/modules/smart-home/entity-state.json new file mode 100644 index 000000000..415cc293d --- /dev/null +++ b/public/locales/sl/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "", + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "entityId": { + "label": "", + "info": "" + }, + "displayName": { + "label": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/sl/modules/torrents-status.json b/public/locales/sl/modules/torrents-status.json index 94f0a255f..6dee0d33c 100644 --- a/public/locales/sl/modules/torrents-status.json +++ b/public/locales/sl/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "", "name": "Ime", + "dateAdded": "", "size": "Velikost", "download": "Dol", "upload": "Gor", "estimatedTimeOfArrival": "ETA", - "progress": "Napredek" + "progress": "Napredek", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "Stanje", + "stateMessage": "" }, "item": { "text": "Upravlja {{appName}}, {{ratio}} razmerje" diff --git a/public/locales/sv/manage/users.json b/public/locales/sv/manage/users.json index b44e93285..e937c9a04 100644 --- a/public/locales/sv/manage/users.json +++ b/public/locales/sv/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "", "pageTitle": "", - "text": "", "buttons": { "create": "" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "Användare" + "user": "Användare", + "email": "" } }, "tooltips": { diff --git a/public/locales/sv/manage/users/edit.json b/public/locales/sv/manage/users/edit.json new file mode 100644 index 000000000..eb6d81e37 --- /dev/null +++ b/public/locales/sv/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Allmänt", + "inputs": { + "username": { + "label": "Användarnamn" + }, + "eMail": { + "label": "" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Bekräfta", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/sv/modules/smart-home/entity-state.json b/public/locales/sv/modules/smart-home/entity-state.json new file mode 100644 index 000000000..415cc293d --- /dev/null +++ b/public/locales/sv/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "", + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "entityId": { + "label": "", + "info": "" + }, + "displayName": { + "label": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/sv/modules/torrents-status.json b/public/locales/sv/modules/torrents-status.json index 1f92ebed1..b1b22b366 100644 --- a/public/locales/sv/modules/torrents-status.json +++ b/public/locales/sv/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "", "name": "Namn", + "dateAdded": "", "size": "Storlek", "download": "Ned", "upload": "Upp", "estimatedTimeOfArrival": "Beräknad sluttid", - "progress": "Förlopp" + "progress": "Förlopp", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "Läge", + "stateMessage": "" }, "item": { "text": "Hanteras av {{appName}}, {{ratio}} förhållande" diff --git a/public/locales/tr/manage/users.json b/public/locales/tr/manage/users.json index f91a0ffb9..1d45ddccc 100644 --- a/public/locales/tr/manage/users.json +++ b/public/locales/tr/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Kullanıcılar", "pageTitle": "Kullanıcıları yönet", - "text": "Kullanıcıları kullanarak panelşnizi kimlerin düzenleyebileceğini yapılandırabilirsiniz. Homarr'ın gelecekteki sürümleri, izinler ve panolar üzerinde daha da ayrıntılı kontrole sahip olacak.", "buttons": { "create": "Oluştur" }, + "filter": { + "roles": { + "all": "Tümü", + "normal": "Normal", + "admin": "Yönetici", + "owner": "Sahip" + } + }, "table": { "header": { - "user": "Kullanıcı" + "user": "Kullanıcı", + "email": "E-Posta" } }, "tooltips": { diff --git a/public/locales/tr/manage/users/edit.json b/public/locales/tr/manage/users/edit.json new file mode 100644 index 000000000..caf833cb1 --- /dev/null +++ b/public/locales/tr/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "Kullanıcı {{username}}", + "back": "Kullanıcı Yönetimine dön", + "sections": { + "general": { + "title": "Genel", + "inputs": { + "username": { + "label": "Kullanıcı adı" + }, + "eMail": { + "label": "E-Posta" + } + } + }, + "security": { + "title": "Güvenlik", + "inputs": { + "password": { + "label": "Yeni parola" + }, + "terminateExistingSessions": { + "label": "Mevcut oturumları sonlandır", + "description": "Kullanıcıyı cihazlarında tekrar oturum açmaya zorlar" + }, + "confirm": { + "label": "Onayla", + "description": "Parola güncellenecektir. İşlem geri alınamaz." + } + } + }, + "roles": { + "title": "Roller", + "currentRole": "Mevcut rol: ", + "badges": { + "owner": "Sahip", + "admin": "Yönetici", + "normal": "Normal" + } + }, + "deletion": { + "title": "Hesap silme", + "inputs": { + "confirmUsername": { + "label": "Kullanıcı adını onaylayın", + "description": "Silme işlemini onaylamak için kullanıcı adını yazın" + }, + "confirm": { + "label": "Kalıcı olarak sil", + "description": "Bu işlemin kalıcı olduğunun ve tüm hesap verilerinin kaybolacağının farkındayım." + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/tr/modules/dlspeed.json b/public/locales/tr/modules/dlspeed.json index 4d7610c17..37754bc43 100644 --- a/public/locales/tr/modules/dlspeed.json +++ b/public/locales/tr/modules/dlspeed.json @@ -21,7 +21,7 @@ "title": "Şu anki indirme hızı", "download": "İndirme: {{download}}", "upload": "Yükleme: {{upload}}", - "timeSpan": "{{seconds}} saniye önce", + "timeSpan": "{{seconds}} saniye önce ", "totalDownload": "İndirme: {{download}}/s", "totalUpload": "Yükleme: {{upload}}/s" }, diff --git a/public/locales/tr/modules/smart-home/entity-state.json b/public/locales/tr/modules/smart-home/entity-state.json new file mode 100644 index 000000000..c6dac7cb8 --- /dev/null +++ b/public/locales/tr/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "Varlık bulunamadı", + "descriptor": { + "name": "Home Assistant varlığı", + "description": "Home Assistant'nda bir varlığın mevcut durumu", + "settings": { + "title": "Varlık Durumu", + "entityId": { + "label": "Varlık Kimliği", + "info": "Home Assistant'ta benzersiz varlık kimliği. Varlığa tıklayın > Çark simgesine tıklayın > 'Varlık Kimliği'ndeki kopyala butonuna tıklayın. Bazı özel varlıklar desteklenmeyebilir." + }, + "displayName": { + "label": "Ekran adı" + } + } + } +} \ No newline at end of file diff --git a/public/locales/tr/modules/torrents-status.json b/public/locales/tr/modules/torrents-status.json index 0c44adc94..6e61b7c34 100644 --- a/public/locales/tr/modules/torrents-status.json +++ b/public/locales/tr/modules/torrents-status.json @@ -35,18 +35,28 @@ "card": { "footer": { "error": "Hata", - "lastUpdated": "Son Güncelleme {{time}} önce", + "lastUpdated": "Son Güncelleme {{time}} önce ", "ratioGlobal": "Genel Ratio", "ratioWithFilter": "Filtrelenen ratio" }, "table": { "header": { + "isCompleted": "İndiriliyor", "name": "İsim", + "dateAdded": "Eklendi", "size": "Boyut", "download": "İndirme", "upload": "Yükleme", "estimatedTimeOfArrival": "ETA (Kalan Süre)", - "progress": "İlerleme" + "progress": "İlerleme", + "totalUploaded": "Toplam Yüklenen", + "totalDownloaded": "Toplam İndirilen", + "ratio": "Ratio", + "seeds": "Tohumlar (Bağlı)", + "peers": "Eşler (Bağlı)", + "label": "Etiket", + "state": "Durum", + "stateMessage": "Durum Mesajı" }, "item": { "text": "{{appName}} tarafından yönetilen, {{ratio}} oranı" @@ -60,7 +70,7 @@ "title": "Şu anki indirme hızı", "download": "İndirme: {{download}}", "upload": "Yükleme: {{upload}}", - "timeSpan": "{{seconds}} saniye önce", + "timeSpan": "{{seconds}} saniye önce ", "totalDownload": "İndirme: {{download}}/s", "totalUpload": "Yükleme: {{upload}}/s" }, diff --git a/public/locales/tw/manage/users.json b/public/locales/tw/manage/users.json index 5797c8686..d908c6f0c 100644 --- a/public/locales/tw/manage/users.json +++ b/public/locales/tw/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "使用者", "pageTitle": "管理使用者", - "text": "通過使用者,您可以設定誰可以編輯您的面板,Homarr 的未來版本將對權限和面板進行更精細的控制", "buttons": { "create": "創建" }, + "filter": { + "roles": { + "all": "全部", + "normal": "普通", + "admin": "管理員", + "owner": "所有者" + } + }, "table": { "header": { - "user": "使用者" + "user": "使用者", + "email": "E-mail" } }, "tooltips": { diff --git a/public/locales/tw/manage/users/edit.json b/public/locales/tw/manage/users/edit.json new file mode 100644 index 000000000..be19d987d --- /dev/null +++ b/public/locales/tw/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "使用者 {{username}}", + "back": "返回使用者管理", + "sections": { + "general": { + "title": "一般", + "inputs": { + "username": { + "label": "使用者" + }, + "eMail": { + "label": "E-mail" + } + } + }, + "security": { + "title": "安全", + "inputs": { + "password": { + "label": "新密碼" + }, + "terminateExistingSessions": { + "label": "停止現有會話", + "description": "強制使用者在其設備上重新登錄" + }, + "confirm": { + "label": "確認", + "description": "密碼將被更新,此操作不可取消" + } + } + }, + "roles": { + "title": "腳色", + "currentRole": "當前腳色: ", + "badges": { + "owner": "所有者", + "admin": "管理員", + "normal": "普通" + } + }, + "deletion": { + "title": "刪除帳號", + "inputs": { + "confirmUsername": { + "label": "確認使用者名", + "description": "輸入使用者名以確認刪除" + }, + "confirm": { + "label": "永久刪除", + "description": "我明白此操作不可逆,所有帳號數據都會消失" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/tw/modules/smart-home/entity-state.json b/public/locales/tw/modules/smart-home/entity-state.json new file mode 100644 index 000000000..0425fdab0 --- /dev/null +++ b/public/locales/tw/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "未找到實體", + "descriptor": { + "name": "Home Assistant 實體", + "description": "Home Assistant 中實體的目前狀態", + "settings": { + "title": "實體狀態", + "entityId": { + "label": "實體 ID", + "info": "Home Assistant 中的唯一實體ID,通過點擊實體 > 點擊齒輪圖示 > 點擊實體 ID 觸地的複製按鈕進行複製,某些自定義實體可能不支持" + }, + "displayName": { + "label": "顯示名稱" + } + } + } +} \ No newline at end of file diff --git a/public/locales/tw/modules/torrents-status.json b/public/locales/tw/modules/torrents-status.json index 30684478c..c44a9aa5c 100644 --- a/public/locales/tw/modules/torrents-status.json +++ b/public/locales/tw/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "正在下載", "name": "名稱", + "dateAdded": "已新增", "size": "大小", "download": "下載", "upload": "上傳", "estimatedTimeOfArrival": "剩餘時間", - "progress": "進度" + "progress": "進度", + "totalUploaded": "總上傳", + "totalDownloaded": "總下載", + "ratio": "分享率", + "seeds": "種子數(已連接)", + "peers": "用戶數(已連接)", + "label": "標籤", + "state": "狀態", + "stateMessage": "狀態訊息" }, "item": { "text": "由 {{appName}},{{ratio}} 管理的比率" diff --git a/public/locales/uk/manage/users.json b/public/locales/uk/manage/users.json index 0101c26c2..0715f7d93 100644 --- a/public/locales/uk/manage/users.json +++ b/public/locales/uk/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Користувачі", "pageTitle": "Керування користувачами", - "text": "За допомогою користувачів ви можете налаштувати, хто може редагувати ваші дашборди. Майбутні версії Homarr матимуть ще більш детальний контроль над дозволами та дошками.", "buttons": { "create": "Створити" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "Користувач" + "user": "Користувач", + "email": "Електронна пошта" } }, "tooltips": { diff --git a/public/locales/uk/manage/users/edit.json b/public/locales/uk/manage/users/edit.json new file mode 100644 index 000000000..6716f1492 --- /dev/null +++ b/public/locales/uk/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Загальне", + "inputs": { + "username": { + "label": "Логін" + }, + "eMail": { + "label": "Електронна пошта" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Підтвердити", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Видалити назавжди", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/uk/modules/smart-home/entity-state.json b/public/locales/uk/modules/smart-home/entity-state.json new file mode 100644 index 000000000..415cc293d --- /dev/null +++ b/public/locales/uk/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "", + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "entityId": { + "label": "", + "info": "" + }, + "displayName": { + "label": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/uk/modules/torrents-status.json b/public/locales/uk/modules/torrents-status.json index 83986d2f9..1af6bd391 100644 --- a/public/locales/uk/modules/torrents-status.json +++ b/public/locales/uk/modules/torrents-status.json @@ -41,12 +41,22 @@ }, "table": { "header": { + "isCompleted": "", "name": "Ім’я", + "dateAdded": "", "size": "Розмір", "download": "Завантаження", "upload": "Віддача", "estimatedTimeOfArrival": "Залишилося", - "progress": "Прогрес" + "progress": "Прогрес", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "Стан", + "stateMessage": "" }, "item": { "text": "Управляється {{appName}}, {{ratio}} співвідношення" diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json index 33ff8cfbd..42e47d811 100644 --- a/public/locales/vi/common.json +++ b/public/locales/vi/common.json @@ -1,11 +1,11 @@ { "save": "Lưu", - "apply": "", - "insert": "", + "apply": "Áp dụng", + "insert": "Thêm", "about": "Về chúng tôi", "cancel": "Hủy", "close": "Đóng", - "back": "Mặt sau", + "back": "Quay lại", "delete": "Xóa", "ok": "OK", "edit": "Sửa", @@ -45,7 +45,7 @@ "seeMore": "Xem thêm...", "position": { "left": "Bên trái", - "center": "", + "center": "Giữa", "right": "Phải" }, "attributes": { @@ -53,5 +53,5 @@ "height": "Chiều cao" }, "public": "Công khai", - "restricted": "" + "restricted": "Bị hạn chế" } \ No newline at end of file diff --git a/public/locales/vi/layout/header.json b/public/locales/vi/layout/header.json index 2111a48ee..da9bf830f 100644 --- a/public/locales/vi/layout/header.json +++ b/public/locales/vi/layout/header.json @@ -4,7 +4,7 @@ "engines": { "web": "Tìm kiếm {{query}} trên mạng", "youtube": "Tìm kiếm {{query}} trên YouTube", - "torrent": "Tìm kiếm {{query}} torrent", + "torrent": "Tìm kiếm torrent {{query}}", "movie": "Tìm kiếm {{query}} trên {{app}}" } }, diff --git a/public/locales/vi/layout/manage.json b/public/locales/vi/layout/manage.json index d5d0c2bd3..34e860704 100644 --- a/public/locales/vi/layout/manage.json +++ b/public/locales/vi/layout/manage.json @@ -4,7 +4,7 @@ "title": "Trang chủ" }, "boards": { - "title": "bảng" + "title": "Bảng" }, "users": { "title": "Người dùng", @@ -18,7 +18,7 @@ "items": { "documentation": "Tài liệu", "report": "Báo cáo sự cố/lỗi", - "discord": "Bất hòa cộng đồng", + "discord": "Discord", "contribute": "Đóng góp" } }, diff --git a/public/locales/vi/manage/boards.json b/public/locales/vi/manage/boards.json index 8fdecea94..40ace04f3 100644 --- a/public/locales/vi/manage/boards.json +++ b/public/locales/vi/manage/boards.json @@ -1,6 +1,6 @@ { - "metaTitle": "bảng", - "pageTitle": "bảng", + "metaTitle": "Bảng", + "pageTitle": "Bảng", "cards": { "statistics": { "apps": "Ứng dụng", diff --git a/public/locales/vi/manage/users.json b/public/locales/vi/manage/users.json index 251a2cae8..3c41ca76c 100644 --- a/public/locales/vi/manage/users.json +++ b/public/locales/vi/manage/users.json @@ -1,13 +1,21 @@ { "metaTitle": "Người dùng", "pageTitle": "Quản lý người dùng", - "text": "Bằng cách sử dụng người dùng, bạn có thể định cấu hình ai có thể chỉnh sửa trang tổng quan của mình. Các phiên bản tương lai của Homarr sẽ có quyền kiểm soát chi tiết hơn đối với các quyền và bảng.", "buttons": { "create": "Tạo nên" }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, "table": { "header": { - "user": "Người dùng" + "user": "Người dùng", + "email": "E-mail" } }, "tooltips": { diff --git a/public/locales/vi/manage/users/edit.json b/public/locales/vi/manage/users/edit.json new file mode 100644 index 000000000..26d7333ed --- /dev/null +++ b/public/locales/vi/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "Chung", + "inputs": { + "username": { + "label": "Tên người dùng" + }, + "eMail": { + "label": "E-mail" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Xác nhận", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "Xóa vĩnh viễn", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/vi/modules/dns-hole-summary.json b/public/locales/vi/modules/dns-hole-summary.json index d90896743..08dca5edc 100644 --- a/public/locales/vi/modules/dns-hole-summary.json +++ b/public/locales/vi/modules/dns-hole-summary.json @@ -19,7 +19,7 @@ }, "card": { "metrics": { - "domainsOnAdlist": "Tên miền trên danh sách quảng cáo", + "domainsOnAdlist": "Tên miền trên d.sách q.cáo", "queriesToday": "Truy vấn hôm nay", "queriesBlockedTodayPercentage": "Đã chặn hôm nay", "queriesBlockedToday": "Đã chặn hôm nay" diff --git a/public/locales/vi/modules/notebook.json b/public/locales/vi/modules/notebook.json index e9efa7765..63a442dff 100644 --- a/public/locales/vi/modules/notebook.json +++ b/public/locales/vi/modules/notebook.json @@ -8,7 +8,7 @@ "label": "Hiển thị thanh công cụ giúp bạn viết markdown" }, "allowReadOnlyCheck": { - "label": "" + "label": "Cho phép tích dấu kiểm tra ở chế độ chỉ đọc" }, "content": { "label": "Nội dung của ghi chú" @@ -17,40 +17,40 @@ }, "card": { "controls": { - "bold": "", - "italic": "", - "strikethrough": "", - "underline": "", - "colorText": "", - "colorHighlight": "", - "code": "", - "clear": "", - "heading": "", - "align": "", - "blockquote": "", - "horizontalLine": "", - "bulletList": "", - "orderedList": "", - "checkList": "", - "increaseIndent": "", - "decreaseIndent": "", - "link": "", - "unlink": "", - "image": "", - "addTable": "", - "deleteTable": "", - "colorCell": "", - "mergeCell": "", - "addColumnLeft": "", - "addColumnRight": "", - "deleteColumn": "", - "addRowTop": "", - "addRowBelow": "", - "deleteRow": "" + "bold": "Đậm", + "italic": "Nghiêng", + "strikethrough": "Gạch ngang", + "underline": "Gạch dưới", + "colorText": "Màu chữ", + "colorHighlight": "Màu đánh dấu", + "code": "Mã", + "clear": "Xóa định dạng", + "heading": "Tiêu đề {{level}}", + "align": "Căn chỉnh: {{position}}", + "blockquote": "Trích dẫn", + "horizontalLine": "Kẻ ngang", + "bulletList": "Danh sách kiểu ký hiệu", + "orderedList": "Danh sách đánh số", + "checkList": "Danh sách kiểm tra", + "increaseIndent": "Tăng thụt lề", + "decreaseIndent": "Giảm thụt lề", + "link": "Liên kết", + "unlink": "Gỡ bỏ liên kết", + "image": "Nhúng hình ảnh", + "addTable": "Thêm bảng", + "deleteTable": "Xóa bảng", + "colorCell": "Màu ô", + "mergeCell": "Bật/tắt hợp nhất ô", + "addColumnLeft": "Thêm cột trước", + "addColumnRight": "Thêm cột sau", + "deleteColumn": "Xóa cột", + "addRowTop": "Thêm dòng bên trên", + "addRowBelow": "Thêm dòng bên dưới", + "deleteRow": "Xóa dòng" }, "modals": { - "clearColor": "", - "source": "", + "clearColor": "Xóa màu", + "source": "Nguồn", "widthPlaceholder": "Giá trị tính bằng % hoặc pixel", "columns": "Cột", "rows": "Dòng" diff --git a/public/locales/vi/modules/smart-home/entity-state.json b/public/locales/vi/modules/smart-home/entity-state.json new file mode 100644 index 000000000..fa28a04a5 --- /dev/null +++ b/public/locales/vi/modules/smart-home/entity-state.json @@ -0,0 +1,17 @@ +{ + "entityNotFound": "Không tìm thấy thực thể", + "descriptor": { + "name": "Thực thể Home Assistant", + "description": "Trạng thái hiện tại của một thực thể trong Home Assistant", + "settings": { + "title": "Trạng thái thực thể", + "entityId": { + "label": "ID thực thể", + "info": "ID thực thể độc nhất trong Home Assistant. Sao chép bằng cách nhấp vào thực thể > Nhấp vào biểu tượng răng cưa > Nhấp vào nút sao chép tại 'ID thực thể'. Một số thực thể tùy chỉnh có thể không được hỗ trợ." + }, + "displayName": { + "label": "Tên hiển thị" + } + } + } +} \ No newline at end of file diff --git a/public/locales/vi/modules/torrents-status.json b/public/locales/vi/modules/torrents-status.json index 099fb8ce1..89c48877b 100644 --- a/public/locales/vi/modules/torrents-status.json +++ b/public/locales/vi/modules/torrents-status.json @@ -11,10 +11,10 @@ "label": "Hiển thị torrent hoàn thành" }, "displayActiveTorrents": { - "label": "" + "label": "Hiển thị torrent đang hoạt động" }, "speedLimitOfActiveTorrents": { - "label": "" + "label": "Tốc độ tải lên để coi torrent là đang hoạt động (kB/s)" }, "displayStaleTorrents": { "label": "Hiển thị torrent hết hạn" @@ -27,8 +27,8 @@ "description": "Nếu chọn \"Danh sách trắng\", các nhãn sẽ được dùng như một danh sách trắng. Nếu không được chọn, đây sẽ là danh sách đen. Sẽ không có gì xảy ra nếu trống không" }, "displayRatioWithFilter": { - "label": "", - "info": "" + "label": "Hiển thị tỷ lệ danh sách torrent sau lọc", + "info": "Nếu tắt, chỉ tỉ lệ chung sẽ được hiển thị. Tỉ lệ chung sẽ vẫn sử dụng nhãn nếu được đặt" } } }, @@ -36,24 +36,34 @@ "footer": { "error": "Lỗi", "lastUpdated": "Cập nhật cuối cách đây {{time}}", - "ratioGlobal": "", - "ratioWithFilter": "" + "ratioGlobal": "Tỉ lệ chung", + "ratioWithFilter": "Tỉ lệ sau lọc" }, "table": { "header": { + "isCompleted": "Đang tải", "name": "Tên", + "dateAdded": "Được thêm vào", "size": "Kích cỡ", "download": "Tải xuống", "upload": "Tải lên", "estimatedTimeOfArrival": "Thời gian dự kiến", - "progress": "Tiến độ" + "progress": "Tiến độ", + "totalUploaded": "Tổng tải lên", + "totalDownloaded": "Tổng tải xuống", + "ratio": "Tỉ lệ", + "seeds": "Chia sẻ (Đã kết nối)", + "peers": "Ngang hàng (Đã kết nối)", + "label": "Nhãn", + "state": "Trạng thái", + "stateMessage": "Thông tin trạng thái" }, "item": { "text": "Quản lý bởi {{appName}}, tỷ lệ {{ratio}}" }, "body": { "nothingFound": "Không tìm thấy torrent nào", - "filterHidingItems": "Đã ẩn {{count}} dòng bởi bộ lọc của bạn" + "filterHidingItems": "{{count}} dòng đã ẩn bởi bộ lọc của bạn" } }, "lineChart": { diff --git a/public/locales/vi/settings/customization/general.json b/public/locales/vi/settings/customization/general.json index 406d742f7..3ae750f82 100644 --- a/public/locales/vi/settings/customization/general.json +++ b/public/locales/vi/settings/customization/general.json @@ -22,7 +22,7 @@ "description": "Thiết lập Homarr cho người dùng khuyết tật" }, "access": { - "name": "", + "name": "Truy cập", "description": "Định cấu hình ai có quyền truy cập vào bảng của bạn" } } diff --git a/public/locales/vi/settings/customization/page-appearance.json b/public/locales/vi/settings/customization/page-appearance.json index ef0e7f90f..af79ed125 100644 --- a/public/locales/vi/settings/customization/page-appearance.json +++ b/public/locales/vi/settings/customization/page-appearance.json @@ -19,26 +19,26 @@ "label": "Hình nền" }, "backgroundImageAttachment": { - "label": "", + "label": "Vị trí ảnh nền", "options": { - "fixed": "", - "scroll": "" + "fixed": "Cố định - Nền vẫn giữ nguyên vị trí (được khuyến nghị)", + "scroll": "Cuộn - Ảnh nền bám theo cuộn chuột" } }, "backgroundImageSize": { - "label": "", + "label": "Kích cỡ ảnh nền", "options": { - "cover": "", - "contain": "" + "cover": "Che - Chia tỷ lệ hình ảnh càng nhỏ càng tốt để che toàn bộ cửa sổ bằng cách cắt bớt khoảng trống quá mức. (được khuyến nghị)", + "contain": "Chứa - Dùng tỷ lệ hình ảnh lớn nhất có thể trong khung chứa của nó mà không cắt xén hay kéo giãn." } }, "backgroundImageRepeat": { - "label": "", + "label": "Vị trí ảnh nền", "options": { - "repeat": "", - "no-repeat": "", - "repeat-x": "", - "repeat-y": "" + "repeat": "Lặp lại - Hình ảnh được lặp lại nhiều nhất có thể để bao phủ toàn bộ khu vực vẽ hình nền.", + "no-repeat": "Không lặp lại - Hình ảnh không được lặp lại và có thể không lấp đầy toàn bộ không gian (được khuyến nghị)", + "repeat-x": "Lặp lại trục X - Tương tự như 'Lặp lại' nhưng chỉ trên trục ngang.", + "repeat-y": "Lặp lại trục Y - Tương tự như 'Lặp lại' nhưng chỉ trên trục tung." } }, "customCSS": { diff --git a/public/locales/vi/tools/docker.json b/public/locales/vi/tools/docker.json index 5f57baf16..74777762b 100644 --- a/public/locales/vi/tools/docker.json +++ b/public/locales/vi/tools/docker.json @@ -2,7 +2,7 @@ "title": "Docker", "alerts": { "notConfigured": { - "text": "" + "text": "Homarr của bạn chưa được thiết lập Docker hoặc không tìm thấy các vùng chứa. Hãy tham khảo cách thiết lập bên trong tài liệu." } }, "modals": { diff --git a/public/locales/vi/user/preferences.json b/public/locales/vi/user/preferences.json index fb0c8429d..3c77254b8 100644 --- a/public/locales/vi/user/preferences.json +++ b/public/locales/vi/user/preferences.json @@ -1,6 +1,6 @@ { "metaTitle": "Sở thích", - "pageTitle": "sở thích của bạn", + "pageTitle": "Cá nhân hoá", "boards": { "defaultBoard": { "label": "Bảng mặc định" @@ -37,7 +37,7 @@ "label": "Mở kết quả tìm kiếm trong tab mới" }, "autoFocus": { - "label": "Thanh tìm kiếm tập trung vào tải trang.", + "label": "Tự tập trung vào thanh tìm kiếm khi tải trang.", "description": "Điều này sẽ tự động tập trung vào thanh tìm kiếm khi bạn điều hướng đến các trang bảng. Nó sẽ chỉ hoạt động trên các thiết bị máy tính để bàn." }, "template": { From b6b697cabdb296d2c1b5b0a3e92afa4da62d22ee Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Fri, 29 Dec 2023 10:55:59 +0100 Subject: [PATCH 19/28] fix: umlaute in RSS (#1755) --- src/server/api/routers/rss.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/server/api/routers/rss.ts b/src/server/api/routers/rss.ts index 83f307768..02bc618b7 100644 --- a/src/server/api/routers/rss.ts +++ b/src/server/api/routers/rss.ts @@ -39,10 +39,10 @@ const rssFeedResultObjectSchema = z title: z.string(), content: z.string(), pubDate: z.string().optional(), - }) + }), ), }), - }) + }), ); export const rssRouter = createTRPCRouter({ @@ -52,7 +52,7 @@ export const rssRouter = createTRPCRouter({ widgetId: z.string().uuid(), feedUrls: z.array(z.string()), configName: z.string(), - }) + }), ) .output(z.array(rssFeedResultObjectSchema)) .query(async ({ input }) => { @@ -75,8 +75,8 @@ export const rssRouter = createTRPCRouter({ const result = await Promise.all( input.feedUrls.map(async (feedUrl) => - getFeedUrl(feedUrl, rssWidget.properties.dangerousAllowSanitizedItemContent) - ) + getFeedUrl(feedUrl, rssWidget.properties.dangerousAllowSanitizedItemContent), + ), ); return result; @@ -106,11 +106,11 @@ const getFeedUrl = async (feedUrl: string, dangerousAllowSanitizedItemContent: b title: item.title ? decode(item.title) : undefined, content: processItemContent( item['content:encoded'] ?? item.content, - dangerousAllowSanitizedItemContent + dangerousAllowSanitizedItemContent, ), enclosure: createEnclosure(item), link: createLink(item), - }) + }), ) .sort((a: { pubDate: number }, b: { pubDate: number }) => { if (!a.pubDate || !b.pubDate) { @@ -159,7 +159,9 @@ const processItemContent = (content: string, dangerousAllowSanitizedItemContent: }); } - return encode(content); + return encode(content, { + level: "html5" + }); }; const createLink = (item: any) => { From 19e65e0d086e0f64146ad086ffb5fd6c5fe15eed Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Fri, 29 Dec 2023 10:57:26 +0100 Subject: [PATCH 20/28] config: new crowdin updates --- public/locales/es/manage/users.json | 4 +-- public/locales/es/manage/users/edit.json | 8 ++--- .../es/modules/smart-home/entity-state.json | 4 +-- .../locales/es/modules/torrents-status.json | 6 ++-- public/locales/sk/common.json | 2 +- public/locales/sk/manage/users.json | 8 ++--- public/locales/sk/manage/users/edit.json | 32 +++++++++---------- .../sk/modules/smart-home/entity-state.json | 14 ++++---- .../locales/sk/modules/torrents-status.json | 18 +++++------ 9 files changed, 48 insertions(+), 48 deletions(-) diff --git a/public/locales/es/manage/users.json b/public/locales/es/manage/users.json index ff00aae45..951de964d 100644 --- a/public/locales/es/manage/users.json +++ b/public/locales/es/manage/users.json @@ -6,10 +6,10 @@ }, "filter": { "roles": { - "all": "", + "all": "Todos", "normal": "Normal", "admin": "Administrador", - "owner": "Dueño" + "owner": "Propietario" } }, "table": { diff --git a/public/locales/es/manage/users/edit.json b/public/locales/es/manage/users/edit.json index c34bd5787..50d330921 100644 --- a/public/locales/es/manage/users/edit.json +++ b/public/locales/es/manage/users/edit.json @@ -25,7 +25,7 @@ }, "confirm": { "label": "Confirmar", - "description": "La contraseña será actualiza. La acción no puede ser revertida." + "description": "La contraseña se actualizará. La acción no se puede revertir." } } }, @@ -33,7 +33,7 @@ "title": "Roles", "currentRole": "Rol actual: ", "badges": { - "owner": "Dueño", + "owner": "Propietario", "admin": "Administrador", "normal": "Normal" } @@ -43,11 +43,11 @@ "inputs": { "confirmUsername": { "label": "Confirmar nombre de usuario", - "description": "Introduzca el nombre de usuario para confirmar la eliminación" + "description": "Escribe el nombre de usuario para confirmar la eliminación" }, "confirm": { "label": "Eliminar permanentemente", - "description": "Estoy al tanto de que dicha acción es permanente, y todos los datos serán borrados." + "description": "Soy consciente de que esta acción es permanente y se perderán todos los datos de la cuenta." } } } diff --git a/public/locales/es/modules/smart-home/entity-state.json b/public/locales/es/modules/smart-home/entity-state.json index 42c9b88dd..13482c779 100644 --- a/public/locales/es/modules/smart-home/entity-state.json +++ b/public/locales/es/modules/smart-home/entity-state.json @@ -2,12 +2,12 @@ "entityNotFound": "Entidad no encontrada", "descriptor": { "name": "Entidad de Home Assistant", - "description": "Estado actual de una entidad en Home Assistant", + "description": "Estado actual de una entidad de Home Assistant", "settings": { "title": "Estado de la entidad", "entityId": { "label": "ID de la entidad", - "info": "ID de entidad única en Home Assistant. Copie haciendo clic en la entidad > Clic en el icono de engranaje > Clic en el botón copiar en 'ID de entidad'. Algunas entidades personalizadas pueden no ser compatibles." + "info": "ID de entidad única de Home Assistant. Copia haciendo clic en la entidad > Clic en el icono de engranaje > Clic en el botón copiar en 'ID de la entidad'. Algunas entidades personalizadas pueden no ser compatibles." }, "displayName": { "label": "Nombre a mostrar" diff --git a/public/locales/es/modules/torrents-status.json b/public/locales/es/modules/torrents-status.json index a3795eda2..7032f9178 100644 --- a/public/locales/es/modules/torrents-status.json +++ b/public/locales/es/modules/torrents-status.json @@ -43,7 +43,7 @@ "header": { "isCompleted": "Descargando", "name": "Nombre", - "dateAdded": "Añadido En", + "dateAdded": "Añadido el", "size": "Tamaño", "download": "Descarga", "upload": "Subida", @@ -52,8 +52,8 @@ "totalUploaded": "Subida Total", "totalDownloaded": "Descarga Total", "ratio": "Ratio", - "seeds": "Semillas (conectadas)", - "peers": "Pares (conectados)", + "seeds": "Semillas (Conectadas)", + "peers": "Pares (Conectados)", "label": "Etiqueta", "state": "Estado", "stateMessage": "Mensaje de estado" diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json index d44fa489e..751de2984 100644 --- a/public/locales/sk/common.json +++ b/public/locales/sk/common.json @@ -53,5 +53,5 @@ "height": "Výška" }, "public": "Verejné", - "restricted": "" + "restricted": "Obmedzené" } \ No newline at end of file diff --git a/public/locales/sk/manage/users.json b/public/locales/sk/manage/users.json index ccd5d520e..e6b5a4ed3 100644 --- a/public/locales/sk/manage/users.json +++ b/public/locales/sk/manage/users.json @@ -6,10 +6,10 @@ }, "filter": { "roles": { - "all": "", - "normal": "", - "admin": "", - "owner": "" + "all": "Všetko", + "normal": "Normálna", + "admin": "Správca", + "owner": "Vlastník" } }, "table": { diff --git a/public/locales/sk/manage/users/edit.json b/public/locales/sk/manage/users/edit.json index 145ea08e7..5faf7e806 100644 --- a/public/locales/sk/manage/users/edit.json +++ b/public/locales/sk/manage/users/edit.json @@ -1,6 +1,6 @@ { - "metaTitle": "", - "back": "", + "metaTitle": "Používateľ {{username}}", + "back": "Späť na správu používateľov", "sections": { "general": { "title": "Všeobecné", @@ -14,40 +14,40 @@ } }, "security": { - "title": "", + "title": "Bezpečnosť", "inputs": { "password": { - "label": "" + "label": "Nové heslo" }, "terminateExistingSessions": { - "label": "", - "description": "" + "label": "Ukončite existujúce relácie", + "description": "Núti používateľa, aby sa znova prihlásil na svojich zariadeniach" }, "confirm": { "label": "Potvrďte", - "description": "" + "description": "Heslo bude aktualizované. Akciu nie je možné vrátiť späť." } } }, "roles": { - "title": "", - "currentRole": "", + "title": "Kontá", + "currentRole": "Súčasná úloha: ", "badges": { - "owner": "", - "admin": "", - "normal": "" + "owner": "Vlastník", + "admin": "Správca", + "normal": "Normálna" } }, "deletion": { - "title": "", + "title": "Vymazanie účtu", "inputs": { "confirmUsername": { - "label": "", - "description": "" + "label": "Potvrďte používateľské meno", + "description": "Zadaním používateľského mena potvrďte vymazanie" }, "confirm": { "label": "Odstrániť natrvalo", - "description": "" + "description": "Uvedomujem si, že táto akcia je trvalá a všetky údaje účtu sa stratia." } } } diff --git a/public/locales/sk/modules/smart-home/entity-state.json b/public/locales/sk/modules/smart-home/entity-state.json index 415cc293d..b8c374851 100644 --- a/public/locales/sk/modules/smart-home/entity-state.json +++ b/public/locales/sk/modules/smart-home/entity-state.json @@ -1,16 +1,16 @@ { - "entityNotFound": "", + "entityNotFound": "Identita nebola nájdená", "descriptor": { - "name": "", - "description": "", + "name": "Subjekt Home Assistant", + "description": "Aktuálny stav entity v aplikácii Home Assistant", "settings": { - "title": "", + "title": "Stav subjektu", "entityId": { - "label": "", - "info": "" + "label": "ID subjektu", + "info": "Jedinečné ID subjektu v aplikácii Home Assistant. Kopírujte kliknutím na entitu > kliknite na ikonu ozubeného kolieska > kliknite na tlačidlo Kopírovať pri \"ID entity\". Niektoré vlastné entity nemusia byť podporované." }, "displayName": { - "label": "" + "label": "Zobrazenie názvu" } } } diff --git a/public/locales/sk/modules/torrents-status.json b/public/locales/sk/modules/torrents-status.json index 115e947f0..251957716 100644 --- a/public/locales/sk/modules/torrents-status.json +++ b/public/locales/sk/modules/torrents-status.json @@ -41,22 +41,22 @@ }, "table": { "header": { - "isCompleted": "", + "isCompleted": "Sťahovanie", "name": "Názov", - "dateAdded": "", + "dateAdded": "Pridané Dňa", "size": "Veľkosť", "download": "Dole", "upload": "Hore", "estimatedTimeOfArrival": "Odhad", "progress": "Stav", - "totalUploaded": "", - "totalDownloaded": "", - "ratio": "", - "seeds": "", - "peers": "", - "label": "", + "totalUploaded": "Celkové odoslanie", + "totalDownloaded": "Celkovo stiahnuté", + "ratio": "Pomer", + "seeds": "Semená (pripojené)", + "peers": "Semená (pripojené)", + "label": "Štítok", "state": "Stav", - "stateMessage": "" + "stateMessage": "Správa" }, "item": { "text": "Spravuje {{appName}}, {{ratio}} pomer" From e13a4afddebcdcfcb311d26d6ee3be36c4dd5f83 Mon Sep 17 00:00:00 2001 From: Tagaishi Date: Sat, 30 Dec 2023 20:09:17 +0100 Subject: [PATCH 21/28] feat: remove location based timezone resolving (#1680) --- package.json | 1 - public/locales/en/modules/date.json | 21 +- .../Tiles/Widgets/WidgetsEditModal.tsx | 1 + src/server/api/root.ts | 2 - src/server/api/routers/timezone.ts | 19 - src/widgets/date/DateTile.tsx | 63 +- yarn.lock | 1598 +---------------- 7 files changed, 71 insertions(+), 1634 deletions(-) delete mode 100644 src/server/api/routers/timezone.ts diff --git a/package.json b/package.json index d2ac3e5e7..9e336f36f 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,6 @@ "axios": "^1.0.0", "bcryptjs": "^2.4.3", "better-sqlite3": "^8.6.0", - "browser-geo-tz": "^0.0.4", "consola": "^3.0.0", "cookies": "^0.8.0", "cookies-next": "^2.1.1", diff --git a/public/locales/en/modules/date.json b/public/locales/en/modules/date.json index 1a9e36efc..5dc6c0572 100644 --- a/public/locales/en/modules/date.json +++ b/public/locales/en/modules/date.json @@ -4,6 +4,13 @@ "description": "Displays the current date and time.", "settings": { "title": "Settings for Date and Time widget", + "timezone":{ + "label":"Timezone", + "info":"Select the name of your timezone, find yours here: " + }, + "customTitle":{ + "label":"City name or custom title" + }, "display24HourFormat": { "label": "Display full time (24-hour)" }, @@ -13,18 +20,12 @@ "hide": "Hide Date" } }, - "enableTimezone": { - "label": "Display a custom Timezone" - }, - "timezoneLocation": { - "label": "Timezone Location" - }, "titleState": { - "label": "City title", - "info": "In case you activate the Timezone option, the name of the city and the timezone code can be shown.
You can also show the city alone or even show none.", + "label": "Clock title", + "info": "The custom title and the timezone code can be shown on your widget.
You can also show the city alone, show none,
or even show the timezone alone when both are selected but no title is provided.", "data": { - "both": "City and Timezone", - "city": "City only", + "both": "Title and Timezone", + "city": "Title only", "none": "None" } } diff --git a/src/components/Dashboard/Tiles/Widgets/WidgetsEditModal.tsx b/src/components/Dashboard/Tiles/Widgets/WidgetsEditModal.tsx index 738473177..750231281 100644 --- a/src/components/Dashboard/Tiles/Widgets/WidgetsEditModal.tsx +++ b/src/components/Dashboard/Tiles/Widgets/WidgetsEditModal.tsx @@ -207,6 +207,7 @@ const WidgetOptionTypeSwitch: FC<{ {info && }