Merge branch 'mealie-next' into fix/meal-plan-settings-offscreen

This commit is contained in:
boc-the-git 2023-12-11 12:33:41 +11:00 committed by GitHub
commit 36b35caffb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
40 changed files with 333 additions and 323 deletions

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Sleutelwoord", "keyword": "Sleutelwoord",
"link-copied": "Skakel gekopieer", "link-copied": "Skakel gekopieer",
"loading": "Loading",
"loading-events": "Besig om gebeurtenisse te laai", "loading-events": "Besig om gebeurtenisse te laai",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "كلمة مفتاحية", "keyword": "كلمة مفتاحية",
"link-copied": "تمّ نسْخ الرّابط", "link-copied": "تمّ نسْخ الرّابط",
"loading": "Loading",
"loading-events": "جاري تحميل الأحداث", "loading-events": "جاري تحميل الأحداث",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Ключова дума", "keyword": "Ключова дума",
"link-copied": "Линкът е копиран", "link-copied": "Линкът е копиран",
"loading": "Loading",
"loading-events": "Зареждане на събития", "loading-events": "Зареждане на събития",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Paraula clau", "keyword": "Paraula clau",
"link-copied": "S'ha copiat l'enllaç", "link-copied": "S'ha copiat l'enllaç",
"loading": "Loading",
"loading-events": "Carregant esdeveniments", "loading-events": "Carregant esdeveniments",
"loading-recipe": "Carregant la recepta...", "loading-recipe": "Carregant la recepta...",
"loading-ocr-data": "Carregant les dades OCR...", "loading-ocr-data": "Carregant les dades OCR...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Klíčové slovo", "keyword": "Klíčové slovo",
"link-copied": "Odkaz zkopírován", "link-copied": "Odkaz zkopírován",
"loading": "Loading",
"loading-events": "Načítání událostí", "loading-events": "Načítání událostí",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Nøgleord", "keyword": "Nøgleord",
"link-copied": "Link kopieret", "link-copied": "Link kopieret",
"loading": "Indlæser",
"loading-events": "Indlæser hændelser", "loading-events": "Indlæser hændelser",
"loading-recipe": "Indlæser opskrift...", "loading-recipe": "Indlæser opskrift...",
"loading-ocr-data": "Indlæser OCR data...", "loading-ocr-data": "Indlæser OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Schlüsselwort", "keyword": "Schlüsselwort",
"link-copied": "Link kopiert", "link-copied": "Link kopiert",
"loading": "Wird geladen...",
"loading-events": "Ereignisse werden geladen", "loading-events": "Ereignisse werden geladen",
"loading-recipe": "Lade Rezept...", "loading-recipe": "Lade Rezept...",
"loading-ocr-data": "Lade OCR-Daten...", "loading-ocr-data": "Lade OCR-Daten...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Λέξη-κλειδί", "keyword": "Λέξη-κλειδί",
"link-copied": "Ο Σύνδεσμος Αντιγράφηκε", "link-copied": "Ο Σύνδεσμος Αντιγράφηκε",
"loading": "Loading",
"loading-events": "Loading Events", "loading-events": "Loading Events",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Keyword", "keyword": "Keyword",
"link-copied": "Link Copied", "link-copied": "Link Copied",
"loading": "Loading",
"loading-events": "Loading Events", "loading-events": "Loading Events",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Keyword", "keyword": "Keyword",
"link-copied": "Link Copied", "link-copied": "Link Copied",
"loading": "Loading",
"loading-events": "Loading Events", "loading-events": "Loading Events",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Etiqueta", "keyword": "Etiqueta",
"link-copied": "Enlace copiado", "link-copied": "Enlace copiado",
"loading": "Loading",
"loading-events": "Cargando Eventos", "loading-events": "Cargando Eventos",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Hakusana", "keyword": "Hakusana",
"link-copied": "Linkki kopioitu", "link-copied": "Linkki kopioitu",
"loading": "Loading",
"loading-events": "Ladataan tapahtumia", "loading-events": "Ladataan tapahtumia",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Mot-clé", "keyword": "Mot-clé",
"link-copied": "Lien copié", "link-copied": "Lien copié",
"loading": "Chargement",
"loading-events": "Chargement des événements", "loading-events": "Chargement des événements",
"loading-recipe": "Chargement de la recette...", "loading-recipe": "Chargement de la recette...",
"loading-ocr-data": "Chargement des données OCR...", "loading-ocr-data": "Chargement des données OCR...",
@ -875,7 +876,7 @@
"user-management": "Gestion des utilisateurs", "user-management": "Gestion des utilisateurs",
"reset-locked-users": "Réinitialiser les utilisateurs verrouillés", "reset-locked-users": "Réinitialiser les utilisateurs verrouillés",
"admin-user-creation": "Création d'un utilisateur admin", "admin-user-creation": "Création d'un utilisateur admin",
"admin-user-management": "Admin User Management", "admin-user-management": "Administration des utilisateurs",
"user-details": "Détails de l'utilisateur", "user-details": "Détails de l'utilisateur",
"user-name": "Nom d'utilisateur", "user-name": "Nom d'utilisateur",
"authentication-method": "Méthode d'authentification", "authentication-method": "Méthode d'authentification",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Mot-clé", "keyword": "Mot-clé",
"link-copied": "Lien copié", "link-copied": "Lien copié",
"loading": "Chargement",
"loading-events": "Chargement des événements", "loading-events": "Chargement des événements",
"loading-recipe": "Chargement de la recette...", "loading-recipe": "Chargement de la recette...",
"loading-ocr-data": "Chargement des données OCR...", "loading-ocr-data": "Chargement des données OCR...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Keyword", "keyword": "Keyword",
"link-copied": "Link Copied", "link-copied": "Link Copied",
"loading": "Loading",
"loading-events": "Loading Events", "loading-events": "Loading Events",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "מילת מפתח", "keyword": "מילת מפתח",
"link-copied": "קישור הועתק", "link-copied": "קישור הועתק",
"loading": "Loading",
"loading-events": "טוען", "loading-events": "טוען",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Ključna riječ", "keyword": "Ključna riječ",
"link-copied": "Poveznica kopirana", "link-copied": "Poveznica kopirana",
"loading": "Loading",
"loading-events": "Učitavanje događaja", "loading-events": "Učitavanje događaja",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -77,7 +77,7 @@
"tag-events": "Címke események", "tag-events": "Címke események",
"category-events": "Kategória események", "category-events": "Kategória események",
"when-a-new-user-joins-your-group": "Amikor egy új felhasználó csatlakozik a csoportodba", "when-a-new-user-joins-your-group": "Amikor egy új felhasználó csatlakozik a csoportodba",
"recipe-events": "Recipe Events" "recipe-events": "Recept esemény"
}, },
"general": { "general": {
"cancel": "Mégsem", "cancel": "Mégsem",
@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Kulcsszó", "keyword": "Kulcsszó",
"link-copied": "Hivatkozás másolva", "link-copied": "Hivatkozás másolva",
"loading": "Loading",
"loading-events": "Események betöltése", "loading-events": "Események betöltése",
"loading-recipe": "Recept betöltése...", "loading-recipe": "Recept betöltése...",
"loading-ocr-data": "OCR adatok betöltése...", "loading-ocr-data": "OCR adatok betöltése...",
@ -590,7 +591,7 @@
"import-summary": "Import összefoglaló", "import-summary": "Import összefoglaló",
"partial-backup": "Részleges biztonsági mentés", "partial-backup": "Részleges biztonsági mentés",
"unable-to-delete-backup": "Nem lehetett létrehozni a biztonsági mentést.", "unable-to-delete-backup": "Nem lehetett létrehozni a biztonsági mentést.",
"experimental-description": "Backups a total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think off this as a snapshot of Mealie at a specific time. Currently, {not-crossed-version} (data migrations are not done automatically). These serve as a database agnostic way to export and import data or backup the site to an external location.", "experimental-description": "A biztonsági mentések az oldal adatbázisának és adatkönyvtárának teljes pillanatfelvételei. Ez az összes adatot tartalmazza, és nem lehet beállítani, hogy az adatok részhalmazait kizárja. Ezt úgy is elképzelheti, mint a Mealie egy adott időpontban készült pillanatfelvételét. Ezek adatbázis-független módon szolgálnak az adatok exportálására és importálására, vagy a webhely külső helyre történő mentésére.",
"backup-restore": "Biztonsági Mentés/Visszaállítás", "backup-restore": "Biztonsági Mentés/Visszaállítás",
"back-restore-description": "A biztonsági mentés visszaállítása felülírja az adatbázisban és az adatkönyvtárban lévő összes aktuális adatot, és a biztonsági mentés tartalmával helyettesíti azokat. {cannot-be-undone} Ha a visszaállítás sikeres, akkor a rendszer kilépteti Önt.", "back-restore-description": "A biztonsági mentés visszaállítása felülírja az adatbázisban és az adatkönyvtárban lévő összes aktuális adatot, és a biztonsági mentés tartalmával helyettesíti azokat. {cannot-be-undone} Ha a visszaállítás sikeres, akkor a rendszer kilépteti Önt.",
"cannot-be-undone": "Ezt a műveletet visszavonható - óvatosan használja.", "cannot-be-undone": "Ezt a műveletet visszavonható - óvatosan használja.",
@ -1056,8 +1057,8 @@
"click": "Kattintson bármelyik mezőre a jobb oldalon, majd kattintson vissza a kép feletti téglalapra.", "click": "Kattintson bármelyik mezőre a jobb oldalon, majd kattintson vissza a kép feletti téglalapra.",
"result": "A kiválasztott szöveg a korábban kiválasztott mezőben jelenik meg." "result": "A kiválasztott szöveg a korábban kiválasztott mezőben jelenik meg."
}, },
"pan-and-zoom-mode": "Pan and Zoom Mode", "pan-and-zoom-mode": "Pásztázás és nagyítás mód",
"pan-and-zoom-desc": "Select pan and zoom by clicking the icon. This mode allows to zoom inside the image and move around to make using big images easier.", "pan-and-zoom-desc": "Válassza ki a pásztázást és a nagyítást az ikonra kattintva. Ez a mód lehetővé teszi a kép nagyítását és mozgását a nagy képek használatának megkönnyítése érdekében.",
"split-text-mode": "Szöveg felosztási módok", "split-text-mode": "Szöveg felosztási módok",
"split-modes": { "split-modes": {
"line-mode": "Vonal mód (alapértelmezett)", "line-mode": "Vonal mód (alapértelmezett)",
@ -1113,7 +1114,7 @@
"show-individual-confidence": "", "show-individual-confidence": "",
"ingredient-text": "Hozzávaló szöveg", "ingredient-text": "Hozzávaló szöveg",
"average-confident": "{0} Confident", "average-confident": "{0} Confident",
"try-an-example": "Próbáld ki", "try-an-example": "Próbáljon ki egy példát",
"parser": "Szintaxis elemző", "parser": "Szintaxis elemző",
"background-tasks": "Háttér folyamatok", "background-tasks": "Háttér folyamatok",
"background-tasks-description": "Itt megtekintheti az összes futó háttérfeladatot és azok állapotát", "background-tasks-description": "Itt megtekintheti az összes futó háttérfeladatot és azok állapotát",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Parola chiave", "keyword": "Parola chiave",
"link-copied": "Link Copiato", "link-copied": "Link Copiato",
"loading": "Loading",
"loading-events": "Caricamento eventi", "loading-events": "Caricamento eventi",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "キーワード", "keyword": "キーワード",
"link-copied": "リンクをコピーしました。", "link-copied": "リンクをコピーしました。",
"loading": "Loading",
"loading-events": "Loading Events", "loading-events": "Loading Events",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "키워드", "keyword": "키워드",
"link-copied": "링크 복사됨", "link-copied": "링크 복사됨",
"loading": "Loading",
"loading-events": "이벤트를 불러오는 중", "loading-events": "이벤트를 불러오는 중",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Raktažodis", "keyword": "Raktažodis",
"link-copied": "Nuoroda nukopijuota", "link-copied": "Nuoroda nukopijuota",
"loading": "Loading",
"loading-events": "Užkrovimo įvykiai", "loading-events": "Užkrovimo įvykiai",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Keyword", "keyword": "Keyword",
"link-copied": "Link Copied", "link-copied": "Link Copied",
"loading": "Loading",
"loading-events": "Loading Events", "loading-events": "Loading Events",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Trefwoord", "keyword": "Trefwoord",
"link-copied": "Link Gekopieerd", "link-copied": "Link Gekopieerd",
"loading": "Bezig met laden",
"loading-events": "Gebeurtenis laden", "loading-events": "Gebeurtenis laden",
"loading-recipe": "Recepten ophalen...", "loading-recipe": "Recepten ophalen...",
"loading-ocr-data": "OCR gegevens laden...", "loading-ocr-data": "OCR gegevens laden...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Nøkkelord", "keyword": "Nøkkelord",
"link-copied": "Lenke kopiert", "link-copied": "Lenke kopiert",
"loading": "Loading",
"loading-events": "Laster hendelser", "loading-events": "Laster hendelser",
"loading-recipe": "Laster oppskrift...", "loading-recipe": "Laster oppskrift...",
"loading-ocr-data": "Laster OCR data...", "loading-ocr-data": "Laster OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Słowo kluczowe", "keyword": "Słowo kluczowe",
"link-copied": "Odnośnik skopiowany", "link-copied": "Odnośnik skopiowany",
"loading": "Loading",
"loading-events": "Ładowanie wydarzeń", "loading-events": "Ładowanie wydarzeń",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Palavra chave", "keyword": "Palavra chave",
"link-copied": "Link Copiado", "link-copied": "Link Copiado",
"loading": "Loading",
"loading-events": "Carregando eventos", "loading-events": "Carregando eventos",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Palavra-chave", "keyword": "Palavra-chave",
"link-copied": "Ligação copiada", "link-copied": "Ligação copiada",
"loading": "Loading",
"loading-events": "A carregar Eventos", "loading-events": "A carregar Eventos",
"loading-recipe": "A carregar receita...", "loading-recipe": "A carregar receita...",
"loading-ocr-data": "A carregar dados OCR...", "loading-ocr-data": "A carregar dados OCR...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Cuvânt cheie", "keyword": "Cuvânt cheie",
"link-copied": "Link copiat", "link-copied": "Link copiat",
"loading": "Loading",
"loading-events": "Se încarcă evenimentele", "loading-events": "Se încarcă evenimentele",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Ключевое слово", "keyword": "Ключевое слово",
"link-copied": "Ссылка скопирована", "link-copied": "Ссылка скопирована",
"loading": "Loading",
"loading-events": "Загрузка событий", "loading-events": "Загрузка событий",
"loading-recipe": "Загрузка рецепта...", "loading-recipe": "Загрузка рецепта...",
"loading-ocr-data": "Загрузка данных OCR...", "loading-ocr-data": "Загрузка данных OCR...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Kľučové slovo", "keyword": "Kľučové slovo",
"link-copied": "Odkaz bol skopírovaný", "link-copied": "Odkaz bol skopírovaný",
"loading": "Loading",
"loading-events": "Načítanie udalostí", "loading-events": "Načítanie udalostí",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Ključna beseda", "keyword": "Ključna beseda",
"link-copied": "Povezava kopirana", "link-copied": "Povezava kopirana",
"loading": "Loading",
"loading-events": "Loading Events", "loading-events": "Loading Events",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Ključna reč", "keyword": "Ključna reč",
"link-copied": "Линк је копиран", "link-copied": "Линк је копиран",
"loading": "Loading",
"loading-events": "Учитавање догађаја", "loading-events": "Учитавање догађаја",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Nyckelord", "keyword": "Nyckelord",
"link-copied": "Länk kopierad", "link-copied": "Länk kopierad",
"loading": "Loading",
"loading-events": "Laddar händelser", "loading-events": "Laddar händelser",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Anahtar Kelime", "keyword": "Anahtar Kelime",
"link-copied": "Bağlantı Kopyalandı", "link-copied": "Bağlantı Kopyalandı",
"loading": "Loading",
"loading-events": "Etkinlikler yükleniyor", "loading-events": "Etkinlikler yükleniyor",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "OCR verileri yükleniyor...", "loading-ocr-data": "OCR verileri yükleniyor...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Ключове слово", "keyword": "Ключове слово",
"link-copied": "Посилання скопійовано", "link-copied": "Посилання скопійовано",
"loading": "Завантаження",
"loading-events": "Завантаження подій", "loading-events": "Завантаження подій",
"loading-recipe": "Завантаження рецепта...", "loading-recipe": "Завантаження рецепта...",
"loading-ocr-data": "Завантаження даних OCR...", "loading-ocr-data": "Завантаження даних OCR...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "Keyword", "keyword": "Keyword",
"link-copied": "Link Copied", "link-copied": "Link Copied",
"loading": "Loading",
"loading-events": "Loading Events", "loading-events": "Loading Events",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "关键字", "keyword": "关键字",
"link-copied": "链接已复制", "link-copied": "链接已复制",
"loading": "Loading",
"loading-events": "正在加载事件", "loading-events": "正在加载事件",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -114,6 +114,7 @@
"json": "JSON", "json": "JSON",
"keyword": "關鍵字", "keyword": "關鍵字",
"link-copied": "已複製連結", "link-copied": "已複製連結",
"loading": "Loading",
"loading-events": "Loading Events", "loading-events": "Loading Events",
"loading-recipe": "Loading recipe...", "loading-recipe": "Loading recipe...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Loading OCR data...",

View File

@ -130,6 +130,7 @@
<section class="mt-4"> <section class="mt-4">
<BaseCardSectionTitle class="pb-0" :icon="$globals.icons.cog" :title="$tc('settings.general-about')"> </BaseCardSectionTitle> <BaseCardSectionTitle class="pb-0" :icon="$globals.icons.cog" :title="$tc('settings.general-about')"> </BaseCardSectionTitle>
<v-card class="mb-4"> <v-card class="mb-4">
<template v-if="appInfo && appInfo.length">
<template v-for="(property, idx) in appInfo"> <template v-for="(property, idx) in appInfo">
<v-list-item :key="property.name"> <v-list-item :key="property.name">
<v-list-item-icon> <v-list-item-icon>
@ -165,6 +166,12 @@
</v-list-item> </v-list-item>
<v-divider v-if="appInfo && idx !== appInfo.length - 1" :key="`divider-${property.name}`"></v-divider> <v-divider v-if="appInfo && idx !== appInfo.length - 1" :key="`divider-${property.name}`"></v-divider>
</template> </template>
</template>
<template v-else>
<div class="mb-3 text-center">
<AppLoader :waiting-text="$tc('general.loading')" />
</div>
</template>
</v-card> </v-card>
</section> </section>
</v-container> </v-container>
@ -186,6 +193,7 @@ import { useAdminApi, useUserApi } from "~/composables/api";
import { validators } from "~/composables/use-validators"; import { validators } from "~/composables/use-validators";
import { useAsyncKey } from "~/composables/use-utils"; import { useAsyncKey } from "~/composables/use-utils";
import { CheckAppConfig } from "~/lib/api/types/admin"; import { CheckAppConfig } from "~/lib/api/types/admin";
import AppLoader from "~/components/global/AppLoader.vue";
enum DockerVolumeState { enum DockerVolumeState {
Unknown = "unknown", Unknown = "unknown",
@ -216,29 +224,24 @@ export default defineComponent({
loading: false, loading: false,
state: DockerVolumeState.Unknown, state: DockerVolumeState.Unknown,
}); });
async function dockerValidate() { async function dockerValidate() {
docker.loading = true; docker.loading = true;
// Do API Check // Do API Check
const { data } = await adminApi.about.checkDocker(); const { data } = await adminApi.about.checkDocker();
if (data == null) { if (data == null) {
docker.state = DockerVolumeState.Error; docker.state = DockerVolumeState.Error;
return; return;
} }
// Get File Contents // Get File Contents
const { data: fileContents } = await adminApi.about.getDockerValidateFileContents(); const { data: fileContents } = await adminApi.about.getDockerValidateFileContents();
if (data.text === fileContents) { if (data.text === fileContents) {
docker.state = DockerVolumeState.Success; docker.state = DockerVolumeState.Success;
} else { }
else {
docker.state = DockerVolumeState.Error; docker.state = DockerVolumeState.Error;
} }
docker.loading = false; docker.loading = false;
} }
const state = reactive({ const state = reactive({
loading: false, loading: false,
address: "", address: "",
@ -246,7 +249,6 @@ export default defineComponent({
error: "", error: "",
tested: false, tested: false,
}); });
const appConfig = ref<CheckApp>({ const appConfig = ref<CheckApp>({
emailReady: true, emailReady: true,
baseUrlSet: true, baseUrlSet: true,
@ -254,34 +256,25 @@ export default defineComponent({
isUpToDate: false, isUpToDate: false,
ldapReady: false, ldapReady: false,
}); });
function isLocalHostOrHttps() { function isLocalHostOrHttps() {
return window.location.hostname === "localhost" || window.location.protocol === "https:"; return window.location.hostname === "localhost" || window.location.protocol === "https:";
} }
const api = useUserApi(); const api = useUserApi();
const adminApi = useAdminApi(); const adminApi = useAdminApi();
onMounted(async () => { onMounted(async () => {
const { data } = await adminApi.about.checkApp(); const { data } = await adminApi.about.checkApp();
if (data) { if (data) {
appConfig.value = { ...data, isSiteSecure: false }; appConfig.value = { ...data, isSiteSecure: false };
} }
appConfig.value.isSiteSecure = isLocalHostOrHttps(); appConfig.value.isSiteSecure = isLocalHostOrHttps();
}); });
const simpleChecks = computed<SimpleCheck[]>(() => { const simpleChecks = computed<SimpleCheck[]>(() => {
const goodIcon = $globals.icons.checkboxMarkedCircle; const goodIcon = $globals.icons.checkboxMarkedCircle;
const badIcon = $globals.icons.alert; const badIcon = $globals.icons.alert;
const warningIcon = $globals.icons.alertCircle; const warningIcon = $globals.icons.alertCircle;
const goodColor = "success"; const goodColor = "success";
const badColor = "error"; const badColor = "error";
const warningColor = "warning"; const warningColor = "warning";
const data: SimpleCheck[] = [ const data: SimpleCheck[] = [
{ {
id: "application-version", id: "application-version",
@ -305,8 +298,7 @@ export default defineComponent({
id: "server-side-base-url", id: "server-side-base-url",
text: i18n.t("settings.server-side-base-url"), text: i18n.t("settings.server-side-base-url"),
status: appConfig.value.baseUrlSet, status: appConfig.value.baseUrlSet,
errorText: errorText: i18n.t("settings.server-side-base-url-error-text"),
i18n.t("settings.server-side-base-url-error-text"),
successText: i18n.t("settings.server-side-base-url-success-text"), successText: i18n.t("settings.server-side-base-url-success-text"),
color: appConfig.value.baseUrlSet ? goodColor : badColor, color: appConfig.value.baseUrlSet ? goodColor : badColor,
icon: appConfig.value.baseUrlSet ? goodIcon : badIcon, icon: appConfig.value.baseUrlSet ? goodIcon : badIcon,
@ -315,26 +307,23 @@ export default defineComponent({
id: "ldap-ready", id: "ldap-ready",
text: i18n.t("settings.ldap-ready"), text: i18n.t("settings.ldap-ready"),
status: appConfig.value.ldapReady, status: appConfig.value.ldapReady,
errorText: errorText: i18n.t("settings.ldap-ready-error-text"),
i18n.t("settings.ldap-ready-error-text"),
successText: i18n.t("settings.ldap-ready-success-text"), successText: i18n.t("settings.ldap-ready-success-text"),
color: appConfig.value.ldapReady ? goodColor : warningColor, color: appConfig.value.ldapReady ? goodColor : warningColor,
icon: appConfig.value.ldapReady ? goodIcon : warningIcon, icon: appConfig.value.ldapReady ? goodIcon : warningIcon,
}, },
]; ];
return data; return data;
}); });
async function testEmail() { async function testEmail() {
state.loading = true; state.loading = true;
state.tested = false; state.tested = false;
const { data } = await api.email.test({ email: state.address }); const { data } = await api.email.test({ email: state.address });
if (data) { if (data) {
if (data.success) { if (data.success) {
state.success = true; state.success = true;
} else { }
else {
state.error = data.error ?? ""; state.error = data.error ?? "";
state.success = false; state.success = false;
} }
@ -342,38 +331,30 @@ export default defineComponent({
state.loading = false; state.loading = false;
state.tested = true; state.tested = true;
} }
const validEmail = computed(() => { const validEmail = computed(() => {
if (state.address === "") { if (state.address === "") {
return false; return false;
} }
const valid = validators.email(state.address); const valid = validators.email(state.address);
// Explicit bool check because validators.email sometimes returns a string // Explicit bool check because validators.email sometimes returns a string
if (valid === true) { if (valid === true) {
return true; return true;
} }
return false; return false;
}); });
// ============================================================ // ============================================================
// General About Info // General About Info
const { $globals, i18n } = useContext(); const { $globals, i18n } = useContext();
const rawAppInfo = ref({ const rawAppInfo = ref({
version: "null", version: "null",
versionLatest: "null", versionLatest: "null",
}); });
function getAppInfo() { function getAppInfo() {
const statistics = useAsync(async () => { const statistics = useAsync(async () => {
const { data } = await adminApi.about.about(); const { data } = await adminApi.about.about();
if (data) { if (data) {
rawAppInfo.value.version = data.version; rawAppInfo.value.version = data.version;
rawAppInfo.value.versionLatest = data.versionLatest; rawAppInfo.value.versionLatest = data.versionLatest;
const prettyInfo = [ const prettyInfo = [
{ {
name: i18n.t("about.version"), name: i18n.t("about.version"),
@ -428,40 +409,32 @@ export default defineComponent({
value: data.recipeScraperVersion, value: data.recipeScraperVersion,
}, },
]; ];
return prettyInfo; return prettyInfo;
} }
return data; return data;
}, useAsyncKey()); }, useAsyncKey());
return statistics; return statistics;
} }
const appInfo = getAppInfo(); const appInfo = getAppInfo();
const bugReportDialog = ref(false); const bugReportDialog = ref(false);
const bugReportText = computed(() => { const bugReportText = computed(() => {
const ignore = { const ignore = {
[i18n.tc("about.database-url")]: true, [i18n.tc("about.database-url")]: true,
[i18n.tc("about.default-group")]: true, [i18n.tc("about.default-group")]: true,
}; };
let text = "**Details**\n"; let text = "**Details**\n";
appInfo.value?.forEach((item) => { appInfo.value?.forEach((item) => {
if (ignore[item.name as string]) { if (ignore[item.name as string]) {
return; return;
} }
text += `${item.name as string}: ${item.value as string}\n`; text += `${item.name as string}: ${item.value as string}\n`;
}); });
const ignoreChecks: {
const ignoreChecks: { [key: string]: boolean } = { [key: string]: boolean;
} = {
"application-version": true, "application-version": true,
}; };
text += "\n**Checks**\n"; text += "\n**Checks**\n";
simpleChecks.value.forEach((item) => { simpleChecks.value.forEach((item) => {
if (ignoreChecks[item.id]) { if (ignoreChecks[item.id]) {
return; return;
@ -469,13 +442,10 @@ export default defineComponent({
const status = item.status ? i18n.tc("general.yes") : i18n.tc("general.no"); const status = item.status ? i18n.tc("general.yes") : i18n.tc("general.no");
text += `${item.text.toString()}: ${status}\n`; text += `${item.text.toString()}: ${status}\n`;
}); });
text += `${i18n.tc("settings.email-configured")}: ${appConfig.value.emailReady ? i18n.tc("general.yes") : i18n.tc("general.no")}\n`; text += `${i18n.tc("settings.email-configured")}: ${appConfig.value.emailReady ? i18n.tc("general.yes") : i18n.tc("general.no")}\n`;
text += `${i18n.tc("settings.docker-volume")}: ${docker.state}`; text += `${i18n.tc("settings.docker-volume")}: ${docker.state}`;
return text; return text;
}); });
return { return {
bugReportDialog, bugReportDialog,
bugReportText, bugReportText,
@ -496,6 +466,7 @@ export default defineComponent({
title: this.$t("settings.site-settings") as string, title: this.$t("settings.site-settings") as string,
}; };
}, },
components: { AppLoader }
}); });
</script> </script>