From cd5a6c749173e79532352d435e945048845d50ad Mon Sep 17 00:00:00 2001 From: Maurice Date: Sun, 5 Apr 2026 17:53:15 +0200 Subject: [PATCH] ui(settings): add about text, community links and bug/feature/wiki cards - Add TREK description and "Made with heart" text to About tab (all 13 languages) - Add Report Bug, Feature Request and Wiki cards to About tab and Admin GitHub panel - Version shown as inline badge --- client/src/components/Admin/GitHubPanel.tsx | 59 ++++++++++++++- client/src/components/Settings/AboutTab.tsx | 80 +++++++++++++++++++-- client/src/i18n/translations/ar.ts | 8 +++ client/src/i18n/translations/br.ts | 8 +++ client/src/i18n/translations/cs.ts | 8 +++ client/src/i18n/translations/de.ts | 8 +++ client/src/i18n/translations/en.ts | 8 +++ client/src/i18n/translations/es.ts | 8 +++ client/src/i18n/translations/fr.ts | 8 +++ client/src/i18n/translations/hu.ts | 8 +++ client/src/i18n/translations/it.ts | 8 +++ client/src/i18n/translations/nl.ts | 8 +++ client/src/i18n/translations/pl.ts | 8 +++ client/src/i18n/translations/ru.ts | 8 +++ client/src/i18n/translations/zh.ts | 8 +++ 15 files changed, 235 insertions(+), 8 deletions(-) diff --git a/client/src/components/Admin/GitHubPanel.tsx b/client/src/components/Admin/GitHubPanel.tsx index 64b469a..ad76c2a 100644 --- a/client/src/components/Admin/GitHubPanel.tsx +++ b/client/src/components/Admin/GitHubPanel.tsx @@ -1,5 +1,5 @@ import { useState, useEffect } from 'react' -import { Tag, Calendar, ExternalLink, ChevronDown, ChevronUp, Loader2, Heart, Coffee } from 'lucide-react' +import { Tag, Calendar, ExternalLink, ChevronDown, ChevronUp, Loader2, Heart, Coffee, Bug, Lightbulb, BookOpen } from 'lucide-react' import { getLocaleForLanguage, useTranslation } from '../../i18n' import apiClient from '../../api/client' @@ -176,6 +176,63 @@ export default function GitHubPanel() { +
+ { e.currentTarget.style.borderColor = '#ef4444'; e.currentTarget.style.boxShadow = '0 0 0 1px #ef444422' }} + onMouseLeave={e => { e.currentTarget.style.borderColor = 'var(--border-primary)'; e.currentTarget.style.boxShadow = 'none' }} + > +
+ +
+
+
{t('settings.about.reportBug')}
+
{t('settings.about.reportBugHint')}
+
+ +
+ { e.currentTarget.style.borderColor = '#f59e0b'; e.currentTarget.style.boxShadow = '0 0 0 1px #f59e0b22' }} + onMouseLeave={e => { e.currentTarget.style.borderColor = 'var(--border-primary)'; e.currentTarget.style.boxShadow = 'none' }} + > +
+ +
+
+
{t('settings.about.featureRequest')}
+
{t('settings.about.featureRequestHint')}
+
+ +
+ { e.currentTarget.style.borderColor = '#6366f1'; e.currentTarget.style.boxShadow = '0 0 0 1px #6366f122' }} + onMouseLeave={e => { e.currentTarget.style.borderColor = 'var(--border-primary)'; e.currentTarget.style.boxShadow = 'none' }} + > +
+ +
+
+
Wiki
+
{t('settings.about.wikiHint')}
+
+ +
+
+ {/* Loading / Error / Releases */} {loading ? (
diff --git a/client/src/components/Settings/AboutTab.tsx b/client/src/components/Settings/AboutTab.tsx index 261f328..26cb3ad 100644 --- a/client/src/components/Settings/AboutTab.tsx +++ b/client/src/components/Settings/AboutTab.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { Info, Coffee, Heart, ExternalLink } from 'lucide-react' +import { Info, Coffee, Heart, ExternalLink, Bug, Lightbulb, BookOpen } from 'lucide-react' import { useTranslation } from '../../i18n' import Section from './Section' @@ -12,12 +12,21 @@ export default function AboutTab({ appVersion }: Props): React.ReactElement { return (
-
-
- TREK - v{appVersion} -
-
+ +

+ {t('settings.about.description')} +

+

+ {t('settings.about.madeWith')}{' '} + + {' '}{t('settings.about.madeBy')}{' '} + v{appVersion} +

+ +
+ { e.currentTarget.style.borderColor = '#ef4444'; e.currentTarget.style.boxShadow = '0 0 0 1px #ef444422' }} + onMouseLeave={e => { e.currentTarget.style.borderColor = 'var(--border-primary)'; e.currentTarget.style.boxShadow = 'none' }} + > +
+ +
+
+
{t('settings.about.reportBug')}
+
{t('settings.about.reportBugHint')}
+
+ +
+ { e.currentTarget.style.borderColor = '#f59e0b'; e.currentTarget.style.boxShadow = '0 0 0 1px #f59e0b22' }} + onMouseLeave={e => { e.currentTarget.style.borderColor = 'var(--border-primary)'; e.currentTarget.style.boxShadow = 'none' }} + > +
+ +
+
+
{t('settings.about.featureRequest')}
+
{t('settings.about.featureRequestHint')}
+
+ +
+ { e.currentTarget.style.borderColor = '#6366f1'; e.currentTarget.style.boxShadow = '0 0 0 1px #6366f122' }} + onMouseLeave={e => { e.currentTarget.style.borderColor = 'var(--border-primary)'; e.currentTarget.style.boxShadow = 'none' }} + > +
+ +
+
+
Wiki
+
{t('settings.about.wikiHint')}
+
+ +
+
) } diff --git a/client/src/i18n/translations/ar.ts b/client/src/i18n/translations/ar.ts index 6bd8b31..43f29ee 100644 --- a/client/src/i18n/translations/ar.ts +++ b/client/src/i18n/translations/ar.ts @@ -256,6 +256,14 @@ const ar: Record = { 'settings.mcp.toast.deleteError': 'فشل حذف الرمز', 'settings.account': 'الحساب', 'settings.about': 'حول', + 'settings.about.reportBug': 'الإبلاغ عن خطأ', + 'settings.about.reportBugHint': 'وجدت مشكلة؟ أخبرنا', + 'settings.about.featureRequest': 'اقتراح ميزة', + 'settings.about.featureRequestHint': 'اقترح ميزة جديدة', + 'settings.about.wikiHint': 'التوثيق والأدلة', + 'settings.about.description': 'TREK هو مخطط سفر مستضاف ذاتيًا يساعدك على تنظيم رحلاتك من أول فكرة حتى آخر ذكرى. تخطيط يومي، ميزانية، قوائم تعبئة، صور والمزيد — كل شيء في مكان واحد، على خادمك الخاص.', + 'settings.about.madeWith': 'صُنع بـ', + 'settings.about.madeBy': 'بواسطة موريس ومجتمع مفتوح المصدر متنامٍ.', 'settings.username': 'اسم المستخدم', 'settings.email': 'البريد الإلكتروني', 'settings.role': 'الدور', diff --git a/client/src/i18n/translations/br.ts b/client/src/i18n/translations/br.ts index 65ecdae..12612da 100644 --- a/client/src/i18n/translations/br.ts +++ b/client/src/i18n/translations/br.ts @@ -226,6 +226,14 @@ const br: Record = { 'settings.off': 'Desligado', 'settings.account': 'Conta', 'settings.about': 'Sobre', + 'settings.about.reportBug': 'Reportar um bug', + 'settings.about.reportBugHint': 'Encontrou um problema? Nos avise', + 'settings.about.featureRequest': 'Solicitar recurso', + 'settings.about.featureRequestHint': 'Sugira um novo recurso', + 'settings.about.wikiHint': 'Documentação e guias', + 'settings.about.description': 'TREK é um planejador de viagens auto-hospedado que ajuda você a organizar suas viagens da primeira ideia à última lembrança. Planejamento diário, orçamento, listas de bagagem, fotos e muito mais — tudo em um só lugar, no seu próprio servidor.', + 'settings.about.madeWith': 'Feito com', + 'settings.about.madeBy': 'por Maurice e uma crescente comunidade open-source.', 'settings.username': 'Nome de usuário', 'settings.email': 'E-mail', 'settings.role': 'Função', diff --git a/client/src/i18n/translations/cs.ts b/client/src/i18n/translations/cs.ts index 31a8fd4..defebfb 100644 --- a/client/src/i18n/translations/cs.ts +++ b/client/src/i18n/translations/cs.ts @@ -204,6 +204,14 @@ const cs: Record = { 'settings.mcp.toast.deleteError': 'Nepodařilo se smazat token', 'settings.account': 'Účet', 'settings.about': 'O aplikaci', + 'settings.about.reportBug': 'Nahlásit chybu', + 'settings.about.reportBugHint': 'Našli jste problém? Dejte nám vědět', + 'settings.about.featureRequest': 'Navrhnout funkci', + 'settings.about.featureRequestHint': 'Navrhněte novou funkci', + 'settings.about.wikiHint': 'Dokumentace a návody', + 'settings.about.description': 'TREK je samohostovaný plánovač cest, který vám pomůže organizovat výlety od prvního nápadu po poslední vzpomínku. Denní plánování, rozpočet, balicí seznamy, fotky a mnoho dalšího — vše na jednom místě, na vašem vlastním serveru.', + 'settings.about.madeWith': 'Vytvořeno s', + 'settings.about.madeBy': 'Mauricem a rostoucí open-source komunitou.', 'settings.username': 'Uživatelské jméno', 'settings.email': 'E-mail', 'settings.role': 'Role', diff --git a/client/src/i18n/translations/de.ts b/client/src/i18n/translations/de.ts index 6716779..d5fad2d 100644 --- a/client/src/i18n/translations/de.ts +++ b/client/src/i18n/translations/de.ts @@ -251,6 +251,14 @@ const de: Record = { 'settings.mcp.toast.deleteError': 'Token konnte nicht gelöscht werden', 'settings.account': 'Konto', 'settings.about': 'Über', + 'settings.about.reportBug': 'Bug melden', + 'settings.about.reportBugHint': 'Problem gefunden? Melde es uns', + 'settings.about.featureRequest': 'Feature vorschlagen', + 'settings.about.featureRequestHint': 'Schlage ein neues Feature vor', + 'settings.about.wikiHint': 'Dokumentation & Anleitungen', + 'settings.about.description': 'TREK ist ein selbst gehosteter Reiseplaner, der dir hilft, deine Trips von der ersten Idee bis zur letzten Erinnerung zu organisieren. Tagesplanung, Budget, Packlisten, Fotos und vieles mehr — alles an einem Ort, auf deinem eigenen Server.', + 'settings.about.madeWith': 'Entwickelt mit', + 'settings.about.madeBy': 'von Maurice und einer wachsenden Open-Source-Community.', 'settings.username': 'Benutzername', 'settings.email': 'E-Mail', 'settings.role': 'Rolle', diff --git a/client/src/i18n/translations/en.ts b/client/src/i18n/translations/en.ts index c0f3997..a2c5a4d 100644 --- a/client/src/i18n/translations/en.ts +++ b/client/src/i18n/translations/en.ts @@ -272,6 +272,14 @@ const en: Record = { 'settings.mcp.toast.deleteError': 'Failed to delete token', 'settings.account': 'Account', 'settings.about': 'About', + 'settings.about.reportBug': 'Report a Bug', + 'settings.about.reportBugHint': 'Found an issue? Let us know', + 'settings.about.featureRequest': 'Feature Request', + 'settings.about.featureRequestHint': 'Suggest a new feature', + 'settings.about.wikiHint': 'Documentation & guides', + 'settings.about.description': 'TREK is a self-hosted travel planner that helps you organize your trips from the first idea to the last memory. Day planning, budget, packing lists, photos and much more — all in one place, on your own server.', + 'settings.about.madeWith': 'Made with', + 'settings.about.madeBy': 'by Maurice and a growing open-source community.', 'settings.username': 'Username', 'settings.email': 'Email', 'settings.role': 'Role', diff --git a/client/src/i18n/translations/es.ts b/client/src/i18n/translations/es.ts index 6c35e6c..c487b25 100644 --- a/client/src/i18n/translations/es.ts +++ b/client/src/i18n/translations/es.ts @@ -252,6 +252,14 @@ const es: Record = { 'settings.mcp.toast.deleteError': 'Error al eliminar el token', 'settings.account': 'Cuenta', 'settings.about': 'Acerca de', + 'settings.about.reportBug': 'Reportar un error', + 'settings.about.reportBugHint': 'Encontraste un problema? Avísanos', + 'settings.about.featureRequest': 'Solicitar función', + 'settings.about.featureRequestHint': 'Sugiere una nueva función', + 'settings.about.wikiHint': 'Documentación y guías', + 'settings.about.description': 'TREK es un planificador de viajes autoalojado que te ayuda a organizar tus viajes desde la primera idea hasta el último recuerdo. Planificación diaria, presupuesto, listas de equipaje, fotos y mucho más — todo en un solo lugar, en tu propio servidor.', + 'settings.about.madeWith': 'Hecho con', + 'settings.about.madeBy': 'por Maurice y una creciente comunidad de código abierto.', 'settings.username': 'Usuario', 'settings.email': 'Correo', 'settings.role': 'Rol', diff --git a/client/src/i18n/translations/fr.ts b/client/src/i18n/translations/fr.ts index 9ba8e1e..b1615c9 100644 --- a/client/src/i18n/translations/fr.ts +++ b/client/src/i18n/translations/fr.ts @@ -251,6 +251,14 @@ const fr: Record = { 'settings.mcp.toast.deleteError': 'Impossible de supprimer le token', 'settings.account': 'Compte', 'settings.about': 'À propos', + 'settings.about.reportBug': 'Signaler un bug', + 'settings.about.reportBugHint': 'Un problème ? Faites-le nous savoir', + 'settings.about.featureRequest': 'Proposer une fonctionnalité', + 'settings.about.featureRequestHint': 'Suggérez une nouvelle fonctionnalité', + 'settings.about.wikiHint': 'Documentation et guides', + 'settings.about.description': 'TREK est un planificateur de voyage auto-hébergé qui vous aide à organiser vos voyages de la première idée au dernier souvenir. Planification journalière, budget, listes de bagages, photos et bien plus — le tout au même endroit, sur votre propre serveur.', + 'settings.about.madeWith': 'Fait avec', + 'settings.about.madeBy': 'par Maurice et une communauté open-source grandissante.', 'settings.username': 'Nom d\'utilisateur', 'settings.email': 'E-mail', 'settings.role': 'Rôle', diff --git a/client/src/i18n/translations/hu.ts b/client/src/i18n/translations/hu.ts index af7aa8e..3d6c660 100644 --- a/client/src/i18n/translations/hu.ts +++ b/client/src/i18n/translations/hu.ts @@ -203,6 +203,14 @@ const hu: Record = { 'settings.mcp.toast.deleteError': 'Nem sikerült törölni a tokent', 'settings.account': 'Fiók', 'settings.about': 'Névjegy', + 'settings.about.reportBug': 'Hiba bejelentése', + 'settings.about.reportBugHint': 'Problémát találtál? Jelezd nekünk', + 'settings.about.featureRequest': 'Funkció javaslat', + 'settings.about.featureRequestHint': 'Javasolj egy új funkciót', + 'settings.about.wikiHint': 'Dokumentáció és útmutatók', + 'settings.about.description': 'A TREK egy saját szerveren üzemeltetett útitervező, amely segít az utazásaid megszervezésében az első ötlettől az utolsó emlékig. Napi tervezés, költségvetés, csomagolási listák, fotók és még sok más — minden egy helyen, a saját szervereden.', + 'settings.about.madeWith': 'Készítve', + 'settings.about.madeBy': 'Maurice és egy növekvő nyílt forráskódú közösség által.', 'settings.username': 'Felhasználónév', 'settings.email': 'E-mail', 'settings.role': 'Szerepkör', diff --git a/client/src/i18n/translations/it.ts b/client/src/i18n/translations/it.ts index 5852db5..0a504f9 100644 --- a/client/src/i18n/translations/it.ts +++ b/client/src/i18n/translations/it.ts @@ -203,6 +203,14 @@ const it: Record = { 'settings.mcp.toast.deleteError': 'Impossibile eliminare il token', 'settings.account': 'Account', 'settings.about': 'Informazioni', + 'settings.about.reportBug': 'Segnala un bug', + 'settings.about.reportBugHint': 'Hai trovato un problema? Faccelo sapere', + 'settings.about.featureRequest': 'Richiedi funzionalità', + 'settings.about.featureRequestHint': 'Suggerisci una nuova funzionalità', + 'settings.about.wikiHint': 'Documentazione e guide', + 'settings.about.description': 'TREK è un pianificatore di viaggi self-hosted che ti aiuta a organizzare i tuoi viaggi dalla prima idea all\'ultimo ricordo. Pianificazione giornaliera, budget, liste bagagli, foto e molto altro — tutto in un unico posto, sul tuo server.', + 'settings.about.madeWith': 'Fatto con', + 'settings.about.madeBy': 'da Maurice e una crescente comunità open-source.', 'settings.username': 'Username', 'settings.email': 'Email', 'settings.role': 'Ruolo', diff --git a/client/src/i18n/translations/nl.ts b/client/src/i18n/translations/nl.ts index b36a2ed..93c4e78 100644 --- a/client/src/i18n/translations/nl.ts +++ b/client/src/i18n/translations/nl.ts @@ -251,6 +251,14 @@ const nl: Record = { 'settings.mcp.toast.deleteError': 'Token verwijderen mislukt', 'settings.account': 'Account', 'settings.about': 'Over', + 'settings.about.reportBug': 'Bug melden', + 'settings.about.reportBugHint': 'Probleem gevonden? Laat het ons weten', + 'settings.about.featureRequest': 'Feature aanvragen', + 'settings.about.featureRequestHint': 'Stel een nieuwe functie voor', + 'settings.about.wikiHint': 'Documentatie en handleidingen', + 'settings.about.description': 'TREK is een zelf-gehoste reisplanner die je helpt je reizen te organiseren van het eerste idee tot de laatste herinnering. Dagplanning, budget, paklijsten, foto\'s en nog veel meer — alles op één plek, op je eigen server.', + 'settings.about.madeWith': 'Gemaakt met', + 'settings.about.madeBy': 'door Maurice en een groeiende open-source community.', 'settings.username': 'Gebruikersnaam', 'settings.email': 'E-mail', 'settings.role': 'Rol', diff --git a/client/src/i18n/translations/pl.ts b/client/src/i18n/translations/pl.ts index 7a65ad6..b020286 100644 --- a/client/src/i18n/translations/pl.ts +++ b/client/src/i18n/translations/pl.ts @@ -221,6 +221,14 @@ const pl: Record = { 'settings.mcp.toast.deleteError': 'Nie udało się usunąć tokenu', 'settings.account': 'Konto', 'settings.about': 'O aplikacji', + 'settings.about.reportBug': 'Zgłoś błąd', + 'settings.about.reportBugHint': 'Znalazłeś problem? Daj nam znać', + 'settings.about.featureRequest': 'Zaproponuj funkcję', + 'settings.about.featureRequestHint': 'Zaproponuj nową funkcję', + 'settings.about.wikiHint': 'Dokumentacja i poradniki', + 'settings.about.description': 'TREK to samodzielnie hostowany planer podróży, który pomaga organizować wyprawy od pierwszego pomysłu po ostatnie wspomnienie. Planowanie dzienne, budżet, listy pakowania, zdjęcia i wiele więcej — wszystko w jednym miejscu, na własnym serwerze.', + 'settings.about.madeWith': 'Stworzone z', + 'settings.about.madeBy': 'przez Maurice\'a i rosnącą społeczność open-source.', 'settings.username': 'Nazwa użytkownika', 'settings.email': 'E-mail', 'settings.role': 'Rola', diff --git a/client/src/i18n/translations/ru.ts b/client/src/i18n/translations/ru.ts index 5b1448c..3cf4cc7 100644 --- a/client/src/i18n/translations/ru.ts +++ b/client/src/i18n/translations/ru.ts @@ -251,6 +251,14 @@ const ru: Record = { 'settings.mcp.toast.deleteError': 'Не удалось удалить токен', 'settings.account': 'Аккаунт', 'settings.about': 'О приложении', + 'settings.about.reportBug': 'Сообщить об ошибке', + 'settings.about.reportBugHint': 'Нашли проблему? Сообщите нам', + 'settings.about.featureRequest': 'Предложить функцию', + 'settings.about.featureRequestHint': 'Предложите новую функцию', + 'settings.about.wikiHint': 'Документация и руководства', + 'settings.about.description': 'TREK — это самостоятельно размещаемый планировщик путешествий, который помогает организовать поездки от первой идеи до последнего воспоминания. Планирование по дням, бюджет, списки вещей, фото и многое другое — всё в одном месте, на вашем собственном сервере.', + 'settings.about.madeWith': 'Сделано с', + 'settings.about.madeBy': 'Морисом и растущим open-source сообществом.', 'settings.username': 'Имя пользователя', 'settings.email': 'Эл. почта', 'settings.role': 'Роль', diff --git a/client/src/i18n/translations/zh.ts b/client/src/i18n/translations/zh.ts index 192a339..5dc7421 100644 --- a/client/src/i18n/translations/zh.ts +++ b/client/src/i18n/translations/zh.ts @@ -251,6 +251,14 @@ const zh: Record = { 'settings.mcp.toast.deleteError': '删除令牌失败', 'settings.account': '账户', 'settings.about': '关于', + 'settings.about.reportBug': '报告错误', + 'settings.about.reportBugHint': '发现问题?告诉我们', + 'settings.about.featureRequest': '功能建议', + 'settings.about.featureRequestHint': '建议一个新功能', + 'settings.about.wikiHint': '文档和指南', + 'settings.about.description': 'TREK 是一个自托管的旅行规划工具,帮助你从最初的想法到最后的回忆,全程组织你的旅行。日程规划、预算、行李清单、照片等——一切尽在一处,在你自己的服务器上。', + 'settings.about.madeWith': '用', + 'settings.about.madeBy': '由 Maurice 和不断壮大的开源社区打造。', 'settings.username': '用户名', 'settings.email': '邮箱', 'settings.role': '角色',