diff --git a/apps/calendar/apps/web/src/routes/(app)/help/+page.svelte b/apps/calendar/apps/web/src/routes/(app)/help/+page.svelte index 1d3b12230..a87bbd7f9 100644 --- a/apps/calendar/apps/web/src/routes/(app)/help/+page.svelte +++ b/apps/calendar/apps/web/src/routes/(app)/help/+page.svelte @@ -1,163 +1,18 @@ @@ -170,7 +25,7 @@ appId="calendar" {translations} showBackButton - onBack={handleBack} + onBack={() => goto('/')} showGettingStarted={false} showChangelog={false} defaultSection="faq" diff --git a/apps/chat/apps/web/src/routes/(protected)/help/+page.svelte b/apps/chat/apps/web/src/routes/(protected)/help/+page.svelte index 4685558ae..f7bf9019d 100644 --- a/apps/chat/apps/web/src/routes/(protected)/help/+page.svelte +++ b/apps/chat/apps/web/src/routes/(protected)/help/+page.svelte @@ -1,142 +1,17 @@ diff --git a/apps/contacts/apps/web/src/routes/(app)/help/+page.svelte b/apps/contacts/apps/web/src/routes/(app)/help/+page.svelte index 5e80c0082..83f6f34ef 100644 --- a/apps/contacts/apps/web/src/routes/(app)/help/+page.svelte +++ b/apps/contacts/apps/web/src/routes/(app)/help/+page.svelte @@ -1,173 +1,18 @@ @@ -180,7 +25,7 @@ appId="contacts" {translations} showBackButton - onBack={handleBack} + onBack={() => goto('/')} showGettingStarted={false} showChangelog={false} defaultSection="faq" diff --git a/apps/mukke/apps/web/package.json b/apps/mukke/apps/web/package.json index 88b2a33db..f70c139d6 100644 --- a/apps/mukke/apps/web/package.json +++ b/apps/mukke/apps/web/package.json @@ -44,6 +44,8 @@ "@manacore/shared-feedback-service": "workspace:^", "@manacore/shared-feedback-ui": "workspace:^", "@manacore/shared-i18n": "workspace:*", + "@manacore/shared-help-types": "workspace:*", + "@manacore/shared-help-ui": "workspace:*", "@manacore/shared-icons": "workspace:*", "@manacore/shared-splitscreen": "workspace:^", "@manacore/shared-stores": "workspace:*", diff --git a/apps/mukke/apps/web/src/lib/content/help/index.ts b/apps/mukke/apps/web/src/lib/content/help/index.ts new file mode 100644 index 000000000..31731ca79 --- /dev/null +++ b/apps/mukke/apps/web/src/lib/content/help/index.ts @@ -0,0 +1,153 @@ +/** + * Help content for Mukke app + */ + +import type { HelpContent } from '@manacore/shared-help-types'; + +export function getMukkeHelpContent(locale: string): HelpContent { + const isDE = locale === 'de'; + + return { + faq: [ + { + id: 'faq-upload', + question: isDE + ? 'Welche Audioformate werden unterstützt?' + : 'Which audio formats are supported?', + answer: isDE + ? '

Mukke unterstützt eine Vielzahl von Formaten:

Metadaten (ID3-Tags) werden automatisch beim Upload extrahiert — Titel, Künstler, Album, Cover-Art und mehr.

' + : '

Mukke supports a wide range of formats:

Metadata (ID3 tags) is automatically extracted on upload — title, artist, album, cover art, and more.

', + category: 'features', + order: 1, + language: isDE ? 'de' : 'en', + tags: isDE ? ['upload', 'formate', 'audio', 'mp3'] : ['upload', 'formats', 'audio', 'mp3'], + }, + { + id: 'faq-editor', + question: isDE ? 'Wie funktioniert der Lyrics-Editor?' : 'How does the lyrics editor work?', + answer: isDE + ? '

Der Editor ermöglicht synchronisierte Lyrics:

  1. Erstelle ein Projekt aus einem Song deiner Bibliothek
  2. Sieh die Wellenform und setze Beat-Marker
  3. Gib Lyrics ein und synchronisiere sie mit den Zeitstempeln
  4. Exportiere als LRC, SRT oder JSON
' + : '

The editor enables synchronized lyrics:

  1. Create a project from a song in your library
  2. View the waveform and set beat markers
  3. Enter lyrics and sync them with timestamps
  4. Export as LRC, SRT, or JSON
', + category: 'features', + order: 2, + language: isDE ? 'de' : 'en', + featured: true, + tags: isDE + ? ['editor', 'lyrics', 'sync', 'wellenform'] + : ['editor', 'lyrics', 'sync', 'waveform'], + }, + { + id: 'faq-playlists', + question: isDE ? 'Wie erstelle ich Playlists?' : 'How do I create playlists?', + answer: isDE + ? '

Gehe zu Playlists und klicke auf das + Symbol. Füge Songs per Drag & Drop oder über das Kontextmenü hinzu. Die Reihenfolge lässt sich ebenfalls per Drag & Drop anpassen.

' + : '

Go to Playlists and click the + icon. Add songs via drag & drop or the context menu. The order can also be adjusted via drag & drop.

', + category: 'features', + order: 3, + language: isDE ? 'de' : 'en', + tags: isDE ? ['playlist', 'erstellen', 'sortieren'] : ['playlist', 'create', 'sort'], + }, + { + id: 'faq-privacy', + question: isDE ? 'Wie werden meine Daten geschützt?' : 'How is my data protected?', + answer: isDE + ? '

Deine Musik ist sicher:

' + : '

Your music is secure:

', + category: 'privacy', + order: 4, + language: isDE ? 'de' : 'en', + featured: true, + tags: isDE ? ['datenschutz', 'dsgvo', 'sicherheit'] : ['privacy', 'gdpr', 'security'], + }, + ], + features: [ + { + id: 'feature-library', + title: isDE ? 'Musikbibliothek' : 'Music Library', + description: isDE + ? 'Verwalte deine Sammlung nach Künstler, Album und Genre' + : 'Manage your collection by artist, album, and genre', + icon: '🎵', + category: 'core', + highlights: isDE + ? ['Auto-Metadaten', 'Cover-Art', 'Künstler/Alben/Genres'] + : ['Auto metadata', 'Cover art', 'Artists/Albums/Genres'], + content: '', + order: 1, + language: isDE ? 'de' : 'en', + }, + { + id: 'feature-player', + title: 'Player', + description: isDE + ? 'Integrierter Musikplayer mit Wiedergabesteuerung' + : 'Built-in music player with playback controls', + icon: '▶️', + category: 'core', + highlights: isDE + ? ['Streaming', 'Playlists', 'Play-Count'] + : ['Streaming', 'Playlists', 'Play count'], + content: '', + order: 2, + language: isDE ? 'de' : 'en', + }, + { + id: 'feature-editor', + title: isDE ? 'Lyrics-Editor' : 'Lyrics Editor', + description: isDE + ? 'Synchronisiere Lyrics mit Wellenform-Visualisierung' + : 'Sync lyrics with waveform visualization', + icon: '🎤', + category: 'advanced', + highlights: isDE + ? ['Wellenform', 'Beat-Marker', 'LRC/SRT Export'] + : ['Waveform', 'Beat markers', 'LRC/SRT export'], + content: '', + order: 3, + language: isDE ? 'de' : 'en', + }, + { + id: 'feature-visualizer', + title: 'Visualizer', + description: isDE + ? 'Audio-Visualisierungen mit verschiedenen Themes' + : 'Audio visualizations with various themes', + icon: '🌈', + category: 'advanced', + highlights: isDE + ? ['Butterchurn-Presets', 'WebGL', 'Theme-Auswahl'] + : ['Butterchurn presets', 'WebGL', 'Theme selection'], + content: '', + order: 4, + language: isDE ? 'de' : 'en', + }, + ], + shortcuts: [ + { + id: 'shortcuts-nav', + category: 'navigation', + title: 'Navigation', + language: isDE ? 'de' : 'en', + order: 1, + shortcuts: [ + { shortcut: 'Ctrl + 1-5', action: 'Navigation' }, + { shortcut: 'Space', action: isDE ? 'Wiedergabe/Pause' : 'Play/Pause' }, + ], + }, + ], + gettingStarted: [], + changelog: [], + contact: { + id: 'contact-support', + title: isDE ? 'Support kontaktieren' : 'Contact Support', + content: isDE + ? '

Unser Support-Team hilft dir bei allen Fragen rund um Mukke.

' + : '

Our support team is here to help you with any questions about Mukke.

', + language: isDE ? 'de' : 'en', + order: 1, + supportEmail: 'support@mana.how', + documentationUrl: 'https://mana.how/docs', + responseTime: isDE ? 'Normalerweise innerhalb von 24 Stunden' : 'Usually within 24 hours', + }, + }; +} diff --git a/apps/mukke/apps/web/src/routes/(app)/help/+page.svelte b/apps/mukke/apps/web/src/routes/(app)/help/+page.svelte index bed75c520..6f6f8efae 100644 --- a/apps/mukke/apps/web/src/routes/(app)/help/+page.svelte +++ b/apps/mukke/apps/web/src/routes/(app)/help/+page.svelte @@ -1,59 +1,32 @@ - Help - Mukke + {translations.title} | Mukke - - - {#snippet icon()}{/snippet} - - - - - - - - - - - {#snippet icon()}{/snippet} - - - - - - - - {#snippet icon()}{/snippet} - - - - - + goto('/dashboard')} + showGettingStarted={false} + showChangelog={false} + defaultSection="faq" +/> diff --git a/apps/picture/apps/web/src/routes/app/help/+page.svelte b/apps/picture/apps/web/src/routes/app/help/+page.svelte index 1302d0e6f..436bcdd1f 100644 --- a/apps/picture/apps/web/src/routes/app/help/+page.svelte +++ b/apps/picture/apps/web/src/routes/app/help/+page.svelte @@ -1,142 +1,17 @@ diff --git a/apps/storage/apps/web/src/routes/help/+page.svelte b/apps/storage/apps/web/src/routes/help/+page.svelte index 03cf75d04..6cf87bd96 100644 --- a/apps/storage/apps/web/src/routes/help/+page.svelte +++ b/apps/storage/apps/web/src/routes/help/+page.svelte @@ -1,142 +1,17 @@ diff --git a/apps/todo/apps/web/src/routes/(app)/help/+page.svelte b/apps/todo/apps/web/src/routes/(app)/help/+page.svelte index de666398e..2d9c31235 100644 --- a/apps/todo/apps/web/src/routes/(app)/help/+page.svelte +++ b/apps/todo/apps/web/src/routes/(app)/help/+page.svelte @@ -1,163 +1,18 @@ @@ -170,7 +25,7 @@ appId="todo" {translations} showBackButton - onBack={handleBack} + onBack={() => goto('/')} showGettingStarted={false} showChangelog={false} defaultSection="faq" diff --git a/apps/zitare/apps/web/package.json b/apps/zitare/apps/web/package.json index 1c1cf76ed..8667c5adc 100644 --- a/apps/zitare/apps/web/package.json +++ b/apps/zitare/apps/web/package.json @@ -40,6 +40,8 @@ "@manacore/shared-feedback-service": "workspace:*", "@manacore/shared-feedback-ui": "workspace:*", "@manacore/shared-i18n": "workspace:*", + "@manacore/shared-help-types": "workspace:*", + "@manacore/shared-help-ui": "workspace:*", "@manacore/shared-icons": "workspace:*", "@manacore/shared-profile-ui": "workspace:*", "@manacore/shared-stores": "workspace:*", diff --git a/apps/zitare/apps/web/src/lib/content/help/index.ts b/apps/zitare/apps/web/src/lib/content/help/index.ts new file mode 100644 index 000000000..1c7b264eb --- /dev/null +++ b/apps/zitare/apps/web/src/lib/content/help/index.ts @@ -0,0 +1,121 @@ +/** + * Help content for Zitare app + */ + +import type { HelpContent } from '@manacore/shared-help-types'; + +export function getZitareHelpContent(locale: string): HelpContent { + const isDE = locale === 'de'; + + return { + faq: [ + { + id: 'faq-browse', + question: isDE ? 'Wie finde ich Zitate?' : 'How do I find quotes?', + answer: isDE + ? '

Es gibt mehrere Wege, Zitate zu entdecken:

  • Kategorien: Durchstöbere Zitate nach Themen wie Motivation, Liebe, Weisheit
  • Suche: Suche nach Stichwörtern, Autoren oder Inhalten
  • Startseite: Entdecke das tägliche Zitat und Empfehlungen
  • Spiral-Ansicht: Eine einzigartige visuelle Art, Zitate zu erkunden
' + : '

There are several ways to discover quotes:

  • Categories: Browse quotes by topics like motivation, love, wisdom
  • Search: Search by keywords, authors, or content
  • Home: Discover the daily quote and recommendations
  • Spiral view: A unique visual way to explore quotes
', + category: 'features', + order: 1, + language: isDE ? 'de' : 'en', + tags: isDE ? ['suche', 'kategorien', 'entdecken'] : ['search', 'categories', 'discover'], + }, + { + id: 'faq-favorites', + question: isDE ? 'Wie speichere ich Lieblingszitate?' : 'How do I save favorite quotes?', + answer: isDE + ? '

Tippe auf das Herz-Symbol neben einem Zitat, um es als Favorit zu speichern. Alle Favoriten findest du unter Favoriten in der Navigation.

' + : '

Tap the heart icon next to a quote to save it as a favorite. Find all your favorites under Favorites in the navigation.

', + category: 'features', + order: 2, + language: isDE ? 'de' : 'en', + tags: isDE ? ['favoriten', 'speichern', 'herz'] : ['favorites', 'save', 'heart'], + }, + { + id: 'faq-lists', + question: isDE ? 'Was sind Listen?' : 'What are lists?', + answer: isDE + ? '

Listen ermöglichen es dir, Zitate thematisch zu sammeln:

  • Erstelle eigene Listen für verschiedene Anlässe
  • Füge Zitate zu bestehenden Listen hinzu
  • Organisiere deine Lieblingszitate nach Themen
' + : '

Lists allow you to collect quotes by theme:

  • Create custom lists for different occasions
  • Add quotes to existing lists
  • Organize your favorite quotes by topic
', + category: 'features', + order: 3, + language: isDE ? 'de' : 'en', + tags: isDE ? ['listen', 'sammlung', 'organisieren'] : ['lists', 'collection', 'organize'], + }, + { + id: 'faq-privacy', + question: isDE ? 'Wie werden meine Daten geschützt?' : 'How is my data protected?', + answer: isDE + ? '

Deine Daten sind sicher:

  • Verschlüsselung: Alle Daten werden bei der Übertragung (TLS) verschlüsselt
  • Privat: Deine Favoriten und Listen sind nur für dich sichtbar
  • DSGVO-konform: Wir halten uns an die EU-Datenschutzverordnung
' + : '

Your data is secure:

  • Encryption: All data is encrypted in transit (TLS)
  • Private: Your favorites and lists are only visible to you
  • GDPR Compliant: We follow EU data protection regulations
', + category: 'privacy', + order: 4, + language: isDE ? 'de' : 'en', + featured: true, + tags: isDE ? ['datenschutz', 'dsgvo', 'sicherheit'] : ['privacy', 'gdpr', 'security'], + }, + ], + features: [ + { + id: 'feature-daily', + title: isDE ? 'Tägliche Inspiration' : 'Daily Inspiration', + description: isDE + ? 'Jeden Tag ein neues inspirierendes Zitat' + : 'A new inspiring quote every day', + icon: '✨', + category: 'core', + highlights: isDE + ? ['Tägliches Zitat', 'Empfehlungen', 'Kategorien'] + : ['Daily quote', 'Recommendations', 'Categories'], + content: '', + order: 1, + language: isDE ? 'de' : 'en', + }, + { + id: 'feature-collections', + title: isDE ? 'Sammlungen' : 'Collections', + description: isDE + ? 'Speichere und organisiere deine Lieblingszitate' + : 'Save and organize your favorite quotes', + icon: '📚', + category: 'core', + highlights: isDE + ? ['Favoriten', 'Eigene Listen', 'Thematisch sortiert'] + : ['Favorites', 'Custom lists', 'Sorted by theme'], + content: '', + order: 2, + language: isDE ? 'de' : 'en', + }, + { + id: 'feature-spiral', + title: isDE ? 'Spiral-Ansicht' : 'Spiral View', + description: isDE + ? 'Entdecke Zitate in einer einzigartigen visuellen Darstellung' + : 'Discover quotes in a unique visual presentation', + icon: '🌀', + category: 'advanced', + highlights: isDE + ? ['Visuelle Exploration', 'Interaktiv', 'Einzigartig'] + : ['Visual exploration', 'Interactive', 'Unique'], + content: '', + order: 3, + language: isDE ? 'de' : 'en', + }, + ], + shortcuts: [], + gettingStarted: [], + changelog: [], + contact: { + id: 'contact-support', + title: isDE ? 'Support kontaktieren' : 'Contact Support', + content: isDE + ? '

Unser Support-Team hilft dir bei allen Fragen rund um Zitare.

' + : '

Our support team is here to help you with any questions about Zitare.

', + language: isDE ? 'de' : 'en', + order: 1, + supportEmail: 'support@mana.how', + documentationUrl: 'https://mana.how/docs', + responseTime: isDE ? 'Normalerweise innerhalb von 24 Stunden' : 'Usually within 24 hours', + }, + }; +} diff --git a/apps/zitare/apps/web/src/routes/(app)/help/+page.svelte b/apps/zitare/apps/web/src/routes/(app)/help/+page.svelte new file mode 100644 index 000000000..666cc6c40 --- /dev/null +++ b/apps/zitare/apps/web/src/routes/(app)/help/+page.svelte @@ -0,0 +1,33 @@ + + + + {translations.title} | Zitare + + + goto('/')} + showShortcuts={false} + showGettingStarted={false} + showChangelog={false} + defaultSection="faq" +/> diff --git a/packages/shared-help-ui/src/index.ts b/packages/shared-help-ui/src/index.ts index 55b97330c..cc565e012 100644 --- a/packages/shared-help-ui/src/index.ts +++ b/packages/shared-help-ui/src/index.ts @@ -18,6 +18,13 @@ export { default as ChangelogEntry } from './components/ChangelogEntry.svelte'; export { default as ContactSection } from './components/ContactSection.svelte'; export { default as HelpSearch } from './components/HelpSearch.svelte'; +// Default translations +export { + defaultTranslationsDE, + defaultTranslationsEN, + getHelpTranslations, +} from './translations.js'; + // Types export type { HelpPageProps, diff --git a/packages/shared-help-ui/src/translations.ts b/packages/shared-help-ui/src/translations.ts new file mode 100644 index 000000000..e6c116852 --- /dev/null +++ b/packages/shared-help-ui/src/translations.ts @@ -0,0 +1,175 @@ +/** + * Default translations for the HelpPage component. + * Apps can use these directly or override individual fields. + */ + +import type { HelpPageTranslations } from './types.js'; + +export const defaultTranslationsDE: HelpPageTranslations = { + title: 'Hilfe & Support', + subtitle: 'Finde Antworten und lerne die App kennen', + searchPlaceholder: 'Hilfe durchsuchen...', + sections: { + faq: 'FAQ', + features: 'Features', + shortcuts: 'Tastenkürzel', + gettingStarted: 'Erste Schritte', + changelog: 'Änderungen', + contact: 'Kontakt', + }, + search: { + noResults: 'Keine Ergebnisse für "{query}"', + resultsCount: '{count} Ergebnisse', + searching: 'Suche...', + }, + faq: { + noItems: 'Keine häufigen Fragen verfügbar.', + allCategories: 'Alle', + categories: { + general: 'Allgemein', + account: 'Konto', + billing: 'Abrechnung', + features: 'Funktionen', + technical: 'Technisch', + privacy: 'Datenschutz', + }, + }, + features: { + noItems: 'Keine Features verfügbar.', + comingSoon: 'Demnächst', + learnMore: 'Mehr erfahren', + }, + shortcuts: { + noItems: 'Keine Tastenkürzel verfügbar.', + columns: { + shortcut: 'Kürzel', + action: 'Aktion', + description: 'Beschreibung', + }, + }, + gettingStarted: { + noItems: 'Keine Anleitungen verfügbar.', + estimatedTime: 'Geschätzte Zeit', + difficulty: { + beginner: 'Einsteiger', + intermediate: 'Fortgeschritten', + advanced: 'Experte', + }, + }, + changelog: { + noItems: 'Keine Änderungen verfügbar.', + showAll: 'Alle Versionen anzeigen', + types: { + major: 'Hauptversion', + minor: 'Nebenversion', + patch: 'Patch', + beta: 'Beta', + }, + labels: { + features: 'Neue Funktionen', + improvements: 'Verbesserungen', + bugFixes: 'Fehlerbehebungen', + }, + }, + contact: { + noInfo: 'Keine Kontaktinformationen verfügbar.', + email: 'E-Mail senden', + responseTime: 'Antwortzeit', + }, + common: { + back: 'Zurück', + showMore: 'Mehr anzeigen', + showLess: 'Weniger anzeigen', + }, +}; + +export const defaultTranslationsEN: HelpPageTranslations = { + title: 'Help & Support', + subtitle: 'Find answers and learn how to use the app', + searchPlaceholder: 'Search help...', + sections: { + faq: 'FAQ', + features: 'Features', + shortcuts: 'Shortcuts', + gettingStarted: 'Getting Started', + changelog: 'Changelog', + contact: 'Contact', + }, + search: { + noResults: 'No results for "{query}"', + resultsCount: '{count} results', + searching: 'Searching...', + }, + faq: { + noItems: 'No frequently asked questions available.', + allCategories: 'All', + categories: { + general: 'General', + account: 'Account', + billing: 'Billing', + features: 'Features', + technical: 'Technical', + privacy: 'Privacy', + }, + }, + features: { + noItems: 'No features available.', + comingSoon: 'Coming Soon', + learnMore: 'Learn More', + }, + shortcuts: { + noItems: 'No keyboard shortcuts available.', + columns: { + shortcut: 'Shortcut', + action: 'Action', + description: 'Description', + }, + }, + gettingStarted: { + noItems: 'No guides available.', + estimatedTime: 'Estimated time', + difficulty: { + beginner: 'Beginner', + intermediate: 'Intermediate', + advanced: 'Advanced', + }, + }, + changelog: { + noItems: 'No changelog available.', + showAll: 'Show all releases', + types: { + major: 'Major', + minor: 'Minor', + patch: 'Patch', + beta: 'Beta', + }, + labels: { + features: 'New Features', + improvements: 'Improvements', + bugFixes: 'Bug Fixes', + }, + }, + contact: { + noInfo: 'No contact information available.', + email: 'Send email', + responseTime: 'Response time', + }, + common: { + back: 'Back', + showMore: 'Show more', + showLess: 'Show less', + }, +}; + +/** + * Get default translations for a locale, with optional overrides. + * Use this to customize only the fields that differ per app (e.g. subtitle). + */ +export function getHelpTranslations( + locale: string, + overrides?: Partial +): HelpPageTranslations { + const base = locale === 'de' ? defaultTranslationsDE : defaultTranslationsEN; + if (!overrides) return base; + return { ...base, ...overrides }; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b0aefc8e7..165cb6a46 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3197,6 +3197,12 @@ importers: '@manacore/shared-feedback-ui': specifier: workspace:^ version: link:../../../../packages/shared-feedback-ui + '@manacore/shared-help-types': + specifier: workspace:* + version: link:../../../../packages/shared-help-types + '@manacore/shared-help-ui': + specifier: workspace:* + version: link:../../../../packages/shared-help-ui '@manacore/shared-i18n': specifier: workspace:* version: link:../../../../packages/shared-i18n @@ -6261,6 +6267,12 @@ importers: '@manacore/shared-feedback-ui': specifier: workspace:* version: link:../../../../packages/shared-feedback-ui + '@manacore/shared-help-types': + specifier: workspace:* + version: link:../../../../packages/shared-help-types + '@manacore/shared-help-ui': + specifier: workspace:* + version: link:../../../../packages/shared-help-ui '@manacore/shared-i18n': specifier: workspace:* version: link:../../../../packages/shared-i18n