mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 19:01:08 +02:00
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:
parent
3a18a5e50d
commit
66ab5f65f6
8 changed files with 70 additions and 20 deletions
|
|
@ -1,4 +1,11 @@
|
||||||
{
|
{
|
||||||
|
"qualities": {
|
||||||
|
"1": "Sehr schlecht",
|
||||||
|
"2": "Schlecht",
|
||||||
|
"3": "Okay",
|
||||||
|
"4": "Gut",
|
||||||
|
"5": "Sehr gut"
|
||||||
|
},
|
||||||
"list_view": {
|
"list_view": {
|
||||||
"cta_question": "Wie hast du geschlafen?",
|
"cta_question": "Wie hast du geschlafen?",
|
||||||
"cta_action": "Jetzt loggen",
|
"cta_action": "Jetzt loggen",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,11 @@
|
||||||
{
|
{
|
||||||
|
"qualities": {
|
||||||
|
"1": "Very poor",
|
||||||
|
"2": "Poor",
|
||||||
|
"3": "Okay",
|
||||||
|
"4": "Good",
|
||||||
|
"5": "Very good"
|
||||||
|
},
|
||||||
"list_view": {
|
"list_view": {
|
||||||
"cta_question": "How did you sleep?",
|
"cta_question": "How did you sleep?",
|
||||||
"cta_action": "Log now",
|
"cta_action": "Log now",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,11 @@
|
||||||
{
|
{
|
||||||
|
"qualities": {
|
||||||
|
"1": "Muy malo",
|
||||||
|
"2": "Malo",
|
||||||
|
"3": "Aceptable",
|
||||||
|
"4": "Bueno",
|
||||||
|
"5": "Muy bueno"
|
||||||
|
},
|
||||||
"list_view": {
|
"list_view": {
|
||||||
"cta_question": "¿Cómo dormiste?",
|
"cta_question": "¿Cómo dormiste?",
|
||||||
"cta_action": "Registrar ahora",
|
"cta_action": "Registrar ahora",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,11 @@
|
||||||
{
|
{
|
||||||
|
"qualities": {
|
||||||
|
"1": "Très mauvais",
|
||||||
|
"2": "Mauvais",
|
||||||
|
"3": "Correct",
|
||||||
|
"4": "Bon",
|
||||||
|
"5": "Très bon"
|
||||||
|
},
|
||||||
"list_view": {
|
"list_view": {
|
||||||
"cta_question": "Comment as-tu dormi ?",
|
"cta_question": "Comment as-tu dormi ?",
|
||||||
"cta_action": "Enregistrer maintenant",
|
"cta_action": "Enregistrer maintenant",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,11 @@
|
||||||
{
|
{
|
||||||
|
"qualities": {
|
||||||
|
"1": "Pessimo",
|
||||||
|
"2": "Scarso",
|
||||||
|
"3": "Discreto",
|
||||||
|
"4": "Buono",
|
||||||
|
"5": "Ottimo"
|
||||||
|
},
|
||||||
"list_view": {
|
"list_view": {
|
||||||
"cta_question": "Come hai dormito?",
|
"cta_question": "Come hai dormito?",
|
||||||
"cta_action": "Registra ora",
|
"cta_action": "Registra ora",
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,9 @@
|
||||||
formatDuration,
|
formatDuration,
|
||||||
formatTime,
|
formatTime,
|
||||||
} from './queries';
|
} from './queries';
|
||||||
import { QUALITY_LABELS } from './types';
|
|
||||||
import MorningLog from './components/MorningLog.svelte';
|
import MorningLog from './components/MorningLog.svelte';
|
||||||
import HygieneChecklist from './components/HygieneChecklist.svelte';
|
import HygieneChecklist from './components/HygieneChecklist.svelte';
|
||||||
|
import { _ } from 'svelte-i18n';
|
||||||
|
|
||||||
const entriesQuery = useAllSleepEntries();
|
const entriesQuery = useAllSleepEntries();
|
||||||
const hygieneLogsQuery = useAllSleepHygieneLogs();
|
const hygieneLogsQuery = useAllSleepHygieneLogs();
|
||||||
|
|
@ -85,8 +85,8 @@
|
||||||
{#if !logged}
|
{#if !logged}
|
||||||
<button class="log-cta" onclick={() => (showMorningLog = true)}>
|
<button class="log-cta" onclick={() => (showMorningLog = true)}>
|
||||||
<span class="cta-icon">🌙</span>
|
<span class="cta-icon">🌙</span>
|
||||||
<span class="cta-text">Wie hast du geschlafen?</span>
|
<span class="cta-text">{$_('sleep.list_view.cta_question')}</span>
|
||||||
<span class="cta-sub">Jetzt loggen</span>
|
<span class="cta-sub">{$_('sleep.list_view.cta_action')}</span>
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
|
@ -94,9 +94,11 @@
|
||||||
{#if lastNight}
|
{#if lastNight}
|
||||||
<div class="last-night">
|
<div class="last-night">
|
||||||
<div class="ln-header">
|
<div class="ln-header">
|
||||||
<span class="ln-label">Letzte Nacht</span>
|
<span class="ln-label">{$_('sleep.list_view.label_last_night')}</span>
|
||||||
{#if logged}
|
{#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}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class="ln-bar-container">
|
<div class="ln-bar-container">
|
||||||
|
|
@ -117,7 +119,11 @@
|
||||||
{/each}
|
{/each}
|
||||||
</span>
|
</span>
|
||||||
{#if lastNight.interruptions > 0}
|
{#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}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class="ln-goal">
|
<div class="ln-goal">
|
||||||
|
|
@ -129,7 +135,7 @@
|
||||||
|
|
||||||
<!-- Week Chart -->
|
<!-- Week Chart -->
|
||||||
<div class="week-section">
|
<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">
|
<div class="week-chart">
|
||||||
{#each weekData as day}
|
{#each weekData as day}
|
||||||
<div class="week-col">
|
<div class="week-col">
|
||||||
|
|
@ -157,37 +163,42 @@
|
||||||
<div class="stats-grid">
|
<div class="stats-grid">
|
||||||
<div class="stat">
|
<div class="stat">
|
||||||
<span class="stat-val">{formatDuration(avgDuration7)}</span>
|
<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>
|
||||||
<div class="stat">
|
<div class="stat">
|
||||||
<span class="stat-val">{avgQuality7}</span>
|
<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>
|
||||||
<div class="stat">
|
<div class="stat">
|
||||||
<span class="stat-val" class:debt={sleepDebt > 0}
|
<span class="stat-val" class:debt={sleepDebt > 0}
|
||||||
>{sleepDebt > 0 ? '-' : '+'}{formatDuration(Math.abs(sleepDebt))}</span
|
>{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>
|
||||||
<div class="stat">
|
<div class="stat">
|
||||||
<span class="stat-val">{consistency}%</span>
|
<span class="stat-val">{consistency}%</span>
|
||||||
<span class="stat-lbl">Konsistenz</span>
|
<span class="stat-lbl">{$_('sleep.list_view.stat_consistency')}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="stat">
|
<div class="stat">
|
||||||
<span class="stat-val">{streak}</span>
|
<span class="stat-val">{streak}</span>
|
||||||
<span class="stat-lbl">Streak</span>
|
<span class="stat-lbl">{$_('sleep.list_view.stat_streak')}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Quality Heatmap -->
|
<!-- Quality Heatmap -->
|
||||||
<div class="heatmap-section">
|
<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">
|
<div class="heatmap-grid">
|
||||||
{#each heatmap as day}
|
{#each heatmap as day}
|
||||||
<div
|
<div
|
||||||
class="heat-cell"
|
class="heat-cell"
|
||||||
style:background={day.quality > 0 ? qualityColor(day.quality) : ''}
|
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>
|
></div>
|
||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -196,13 +207,13 @@
|
||||||
<!-- Hygiene Correlation -->
|
<!-- Hygiene Correlation -->
|
||||||
{#if hygieneCorr}
|
{#if hygieneCorr}
|
||||||
<div class="correlation-card">
|
<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">
|
<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>
|
<span class="corr-val good">{hygieneCorr.withHygiene} ★</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="corr-row">
|
<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>
|
<span class="corr-val">{hygieneCorr.withoutHygiene} ★</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -210,9 +221,11 @@
|
||||||
|
|
||||||
<!-- Actions -->
|
<!-- Actions -->
|
||||||
<div class="actions-row">
|
<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)}>
|
<button class="action-btn secondary" onclick={() => (showHygiene = true)}>
|
||||||
Hygiene-Check
|
{$_('sleep.list_view.action_hygiene_check')}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,7 @@
|
||||||
"apps/mana/apps/web/src/lib/modules/community/components/ItemCard.svelte": 1,
|
"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/DetailView.svelte": 1,
|
||||||
"apps/mana/apps/web/src/lib/modules/community/views/ListView.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/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/CompanionChat.svelte": 1,
|
||||||
"apps/mana/apps/web/src/lib/modules/companion/components/RitualRunner.svelte": 5,
|
"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/components/StatsOverview.svelte": 4,
|
||||||
"apps/mana/apps/web/src/lib/modules/skilltree/views/DetailView.svelte": 5,
|
"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/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/spaces/ListView.svelte": 6,
|
||||||
"apps/mana/apps/web/src/lib/modules/storage/ListView.svelte": 2,
|
"apps/mana/apps/web/src/lib/modules/storage/ListView.svelte": 2,
|
||||||
"apps/mana/apps/web/src/lib/modules/storage/views/DetailView.svelte": 4,
|
"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/+page.svelte": 6,
|
||||||
"apps/mana/apps/web/src/routes/(app)/presi/deck/[id]/+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)/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/[id]/+page.svelte": 3,
|
||||||
"apps/mana/apps/web/src/routes/(app)/questions/+page.svelte": 7,
|
"apps/mana/apps/web/src/routes/(app)/questions/+page.svelte": 7,
|
||||||
"apps/mana/apps/web/src/routes/(app)/questions/collections/+page.svelte": 1,
|
"apps/mana/apps/web/src/routes/(app)/questions/collections/+page.svelte": 1,
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@
|
||||||
"apps/mana/apps/web/src/lib/modules/quiz/EditView.svelte": 1,
|
"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/quotes/components/QuoteCard.svelte": 4,
|
||||||
"apps/mana/apps/web/src/lib/modules/recipes/ListView.svelte": 1,
|
"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/EntryForm.svelte": 6,
|
||||||
"apps/mana/apps/web/src/lib/modules/times/components/EntryItem.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,
|
"apps/mana/apps/web/src/lib/modules/times/components/EntryList.svelte": 2,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue