i18n(sleep): translate ListView via $_() — log CTA, last-night, week chart, stats, heatmap, hygiene

- Log CTA "Wie hast du geschlafen?" + "Jetzt loggen"
- Last-night card: "Letzte Nacht" label, "Bearbeiten" edit button, "{n}× aufgewacht" interpolation
- "Diese Woche" week section heading
- 5 stat labels (Ø Dauer (7T) / Ø Qualität / Schlafschuld / Konsistenz / Streak)
- Quality heatmap: section heading + cell title with {date}/{label} interpolation, label sourced via $_('sleep.qualities.' + n) (added qualities sub-namespace)
- Hygiene-correlation card: heading + with/without rows
- Action buttons: Schlaf loggen / Hygiene-Check
- QUALITY_LABELS import dropped (constant kept in types.ts for non-Svelte callers)

Baselines: hardcoded 1034 → 1033 (8 cleared from sleep + 7 added by parallel community-feature commits = net -1); missing-keys baseline +1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-04-27 14:58:45 +02:00
parent 3a18a5e50d
commit 66ab5f65f6
8 changed files with 70 additions and 20 deletions

View file

@ -1,4 +1,11 @@
{
"qualities": {
"1": "Sehr schlecht",
"2": "Schlecht",
"3": "Okay",
"4": "Gut",
"5": "Sehr gut"
},
"list_view": {
"cta_question": "Wie hast du geschlafen?",
"cta_action": "Jetzt loggen",

View file

@ -1,4 +1,11 @@
{
"qualities": {
"1": "Very poor",
"2": "Poor",
"3": "Okay",
"4": "Good",
"5": "Very good"
},
"list_view": {
"cta_question": "How did you sleep?",
"cta_action": "Log now",

View file

@ -1,4 +1,11 @@
{
"qualities": {
"1": "Muy malo",
"2": "Malo",
"3": "Aceptable",
"4": "Bueno",
"5": "Muy bueno"
},
"list_view": {
"cta_question": "¿Cómo dormiste?",
"cta_action": "Registrar ahora",

View file

@ -1,4 +1,11 @@
{
"qualities": {
"1": "Très mauvais",
"2": "Mauvais",
"3": "Correct",
"4": "Bon",
"5": "Très bon"
},
"list_view": {
"cta_question": "Comment as-tu dormi ?",
"cta_action": "Enregistrer maintenant",

View file

@ -1,4 +1,11 @@
{
"qualities": {
"1": "Pessimo",
"2": "Scarso",
"3": "Discreto",
"4": "Buono",
"5": "Ottimo"
},
"list_view": {
"cta_question": "Come hai dormito?",
"cta_action": "Registra ora",

View file

@ -22,9 +22,9 @@
formatDuration,
formatTime,
} from './queries';
import { QUALITY_LABELS } from './types';
import MorningLog from './components/MorningLog.svelte';
import HygieneChecklist from './components/HygieneChecklist.svelte';
import { _ } from 'svelte-i18n';
const entriesQuery = useAllSleepEntries();
const hygieneLogsQuery = useAllSleepHygieneLogs();
@ -85,8 +85,8 @@
{#if !logged}
<button class="log-cta" onclick={() => (showMorningLog = true)}>
<span class="cta-icon">🌙</span>
<span class="cta-text">Wie hast du geschlafen?</span>
<span class="cta-sub">Jetzt loggen</span>
<span class="cta-text">{$_('sleep.list_view.cta_question')}</span>
<span class="cta-sub">{$_('sleep.list_view.cta_action')}</span>
</button>
{/if}
@ -94,9 +94,11 @@
{#if lastNight}
<div class="last-night">
<div class="ln-header">
<span class="ln-label">Letzte Nacht</span>
<span class="ln-label">{$_('sleep.list_view.label_last_night')}</span>
{#if logged}
<button class="edit-btn" onclick={() => (showMorningLog = true)}>Bearbeiten</button>
<button class="edit-btn" onclick={() => (showMorningLog = true)}
>{$_('sleep.list_view.action_edit')}</button
>
{/if}
</div>
<div class="ln-bar-container">
@ -117,7 +119,11 @@
{/each}
</span>
{#if lastNight.interruptions > 0}
<span class="ln-interruptions">{lastNight.interruptions}× aufgewacht</span>
<span class="ln-interruptions"
>{$_('sleep.list_view.interruptions', {
values: { n: lastNight.interruptions },
})}</span
>
{/if}
</div>
<div class="ln-goal">
@ -129,7 +135,7 @@
<!-- Week Chart -->
<div class="week-section">
<span class="section-label">Diese Woche</span>
<span class="section-label">{$_('sleep.list_view.section_week')}</span>
<div class="week-chart">
{#each weekData as day}
<div class="week-col">
@ -157,37 +163,42 @@
<div class="stats-grid">
<div class="stat">
<span class="stat-val">{formatDuration(avgDuration7)}</span>
<span class="stat-lbl">Ø Dauer (7T)</span>
<span class="stat-lbl">{$_('sleep.list_view.stat_avg_duration')}</span>
</div>
<div class="stat">
<span class="stat-val">{avgQuality7}</span>
<span class="stat-lbl">Ø Qualität</span>
<span class="stat-lbl">{$_('sleep.list_view.stat_avg_quality')}</span>
</div>
<div class="stat">
<span class="stat-val" class:debt={sleepDebt > 0}
>{sleepDebt > 0 ? '-' : '+'}{formatDuration(Math.abs(sleepDebt))}</span
>
<span class="stat-lbl">Schlafschuld</span>
<span class="stat-lbl">{$_('sleep.list_view.stat_sleep_debt')}</span>
</div>
<div class="stat">
<span class="stat-val">{consistency}%</span>
<span class="stat-lbl">Konsistenz</span>
<span class="stat-lbl">{$_('sleep.list_view.stat_consistency')}</span>
</div>
<div class="stat">
<span class="stat-val">{streak}</span>
<span class="stat-lbl">Streak</span>
<span class="stat-lbl">{$_('sleep.list_view.stat_streak')}</span>
</div>
</div>
<!-- Quality Heatmap -->
<div class="heatmap-section">
<span class="section-label">Qualität (30 Tage)</span>
<span class="section-label">{$_('sleep.list_view.section_quality')}</span>
<div class="heatmap-grid">
{#each heatmap as day}
<div
class="heat-cell"
style:background={day.quality > 0 ? qualityColor(day.quality) : ''}
title="{day.date}: {QUALITY_LABELS[day.quality]?.de ?? '—'}"
title={$_('sleep.list_view.heatmap_cell_title', {
values: {
date: day.date,
label: day.quality > 0 ? $_('sleep.qualities.' + day.quality) : '—',
},
})}
></div>
{/each}
</div>
@ -196,13 +207,13 @@
<!-- Hygiene Correlation -->
{#if hygieneCorr}
<div class="correlation-card">
<span class="section-label">Schlafhygiene-Effekt</span>
<span class="section-label">{$_('sleep.list_view.section_hygiene_corr')}</span>
<div class="corr-row">
<span class="corr-label">Mit Hygiene (≥70%):</span>
<span class="corr-label">{$_('sleep.list_view.corr_with')}</span>
<span class="corr-val good">{hygieneCorr.withHygiene}</span>
</div>
<div class="corr-row">
<span class="corr-label">Ohne:</span>
<span class="corr-label">{$_('sleep.list_view.corr_without')}</span>
<span class="corr-val">{hygieneCorr.withoutHygiene}</span>
</div>
</div>
@ -210,9 +221,11 @@
<!-- Actions -->
<div class="actions-row">
<button class="action-btn" onclick={() => (showMorningLog = true)}> Schlaf loggen </button>
<button class="action-btn" onclick={() => (showMorningLog = true)}>
{$_('sleep.list_view.action_log_sleep')}
</button>
<button class="action-btn secondary" onclick={() => (showHygiene = true)}>
Hygiene-Check
{$_('sleep.list_view.action_hygiene_check')}
</button>
</div>
</div>

View file

@ -93,6 +93,7 @@
"apps/mana/apps/web/src/lib/modules/community/components/ItemCard.svelte": 1,
"apps/mana/apps/web/src/lib/modules/community/views/DetailView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/community/views/ListView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/community/views/MyWishesView.svelte": 6,
"apps/mana/apps/web/src/lib/modules/community/views/RoadmapView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/companion/components/CompanionChat.svelte": 1,
"apps/mana/apps/web/src/lib/modules/companion/components/RitualRunner.svelte": 5,
@ -174,7 +175,6 @@
"apps/mana/apps/web/src/lib/modules/skilltree/components/StatsOverview.svelte": 4,
"apps/mana/apps/web/src/lib/modules/skilltree/views/DetailView.svelte": 5,
"apps/mana/apps/web/src/lib/modules/sleep/components/MorningLog.svelte": 5,
"apps/mana/apps/web/src/lib/modules/sleep/ListView.svelte": 8,
"apps/mana/apps/web/src/lib/modules/spaces/ListView.svelte": 6,
"apps/mana/apps/web/src/lib/modules/storage/ListView.svelte": 2,
"apps/mana/apps/web/src/lib/modules/storage/views/DetailView.svelte": 4,
@ -290,6 +290,7 @@
"apps/mana/apps/web/src/routes/(app)/presi/+page.svelte": 6,
"apps/mana/apps/web/src/routes/(app)/presi/deck/[id]/+page.svelte": 6,
"apps/mana/apps/web/src/routes/(app)/presi/present/[id]/+page.svelte": 2,
"apps/mana/apps/web/src/routes/(app)/profile/my-wishes/+page.svelte": 1,
"apps/mana/apps/web/src/routes/(app)/questions/[id]/+page.svelte": 3,
"apps/mana/apps/web/src/routes/(app)/questions/+page.svelte": 7,
"apps/mana/apps/web/src/routes/(app)/questions/collections/+page.svelte": 1,

View file

@ -22,6 +22,7 @@
"apps/mana/apps/web/src/lib/modules/quiz/EditView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/quotes/components/QuoteCard.svelte": 4,
"apps/mana/apps/web/src/lib/modules/recipes/ListView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/sleep/ListView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/times/components/EntryForm.svelte": 6,
"apps/mana/apps/web/src/lib/modules/times/components/EntryItem.svelte": 6,
"apps/mana/apps/web/src/lib/modules/times/components/EntryList.svelte": 2,