add new lesson mode and started code refraction

This commit is contained in:
Rene Kievits
2025-12-20 04:31:15 +01:00
parent 6438660b03
commit 4428a2b7be
101 changed files with 12255 additions and 8172 deletions

View File

@@ -1,306 +1,396 @@
import { createI18n } from 'vue-i18n'
import { createI18n } from 'vue-i18n';
const messages = {
en: {
common: {
close: "Close",
cancel: "Cancel"
},
nav: {
dashboard: "Dashboard",
review: "Review",
collection: "Collection",
settings: "Settings",
sync: "Sync",
logout: "Logout",
menu: "Menu"
},
login: {
instruction: "Enter your WaniKani V2 API Key to login",
placeholder: "Paste key here...",
button: "Login",
failed: "Login failed. Is server running?"
},
alerts: {
syncSuccess: "Sync complete! Collection: {count}",
syncFailed: "Sync failed.",
logoutConfirm: "Are you sure you want to log out? This will end your session.",
},
hero: {
welcome: "Welcome Back",
subtitle: "Your mind is ready.",
start: "Start Review",
noReviews: "No Reviews",
nextIn: "Next review in",
now: "now",
prioritize: "Prioritize Lower Levels ({count})"
},
stats: {
mastery: "Mastery (Guru+)",
srsDistribution: "SRS Levels",
accuracy: "Global Accuracy",
correct: "Correct",
total: "Total",
next24: "Next 24h",
availableNow: "Available Now",
inHours: "In {n} hour | In {n} hours",
noIncoming: "No reviews incoming for 24 hours.",
items: "items",
reviewsCount: "{count} reviews",
en: {
common: {
close: 'Close',
cancel: 'Cancel',
},
nav: {
dashboard: 'Dashboard',
review: 'Review',
collection: 'Collection',
settings: 'Settings',
sync: 'Sync',
logout: 'Logout',
menu: 'Menu',
},
login: {
instruction: 'Enter your WaniKani V2 API Key to login',
placeholder: 'Paste key here...',
button: 'Login',
failed: 'Login failed. Is server running?',
},
alerts: {
syncSuccess: 'Sync complete! Collection: {count}',
syncFailed: 'Sync failed.',
logoutConfirm: 'Are you sure you want to log out? This will end your session.',
},
lesson: {
phasePrimer: 'Study',
phaseDemo: 'Observation',
phaseGuided: 'Guided',
phasePractice: 'Recall',
understand: 'I Understand',
ready: 'Ready to Draw',
startPractice: 'Start Practice',
continue: 'Continue',
streak: 'Correct: {n} / {total}',
hint: 'Show Hint (Resets Streak)',
hintAction: 'Hint',
watchAgain: 'Watch Again',
completeTitle: 'Lesson Complete!',
completeBody: 'You have unlocked new Kanji for review.',
learned: "You've learned {n} new kanji.",
components: 'Components',
observe: 'Observe Stroke Order',
trace: 'Trace',
drawStep: 'Draw ({n}/{total})',
backToDashboard: 'Back to Dashboard',
},
hero: {
lessons: 'Lessons',
welcome: 'Welcome Back',
subtitle: 'Your mind is ready.',
start: 'Start Review',
noReviews: 'No Reviews',
nextIn: 'Next review in',
now: 'now',
prioritize: 'Prioritize Lower Levels ({count})',
},
stats: {
mastery: 'Mastery (Guru+)',
srsDistribution: 'SRS Levels',
accuracy: 'Global Accuracy',
correct: 'Correct',
total: 'Total',
next24: 'Next 24h',
availableNow: 'Available Now',
inHours: 'In {n} hour | In {n} hours',
noIncoming: 'No reviews incoming for 24 hours.',
items: 'items',
reviewsCount: '{count} reviews',
consistency: "Study Consistency",
less: "Less",
more: "More",
consistency: 'Study Consistency',
less: 'Less',
more: 'More',
streakTitle: "Study Streak",
days: "days",
shieldActive: "Zen Shield Active: Protects streak if you miss 1 day.",
shieldCooldown: "Regenerating: {n} days left",
streakTitle: 'Study Streak',
days: 'days',
shieldActive: 'Zen Shield Active: Protects streak if you miss 1 day.',
shieldCooldown: 'Regenerating: {n} days left',
ghostTitle: "Ghost Items",
ghostSubtitle: "Lowest Accuracy",
noGhosts: "No ghosts found! Keep it up."
},
settings: {
title: "Settings",
batchSize: "Review Batch Size",
items: "Items",
language: "Language",
save: "Save & Close"
},
review: {
meaning: "Meaning",
level: "Level",
draw: "Draw correctly",
hint: "Hint Shown",
tryAgain: "Try again",
correct: "Correct!",
next: "NEXT",
sessionComplete: "Session Complete!",
levelup: "You leveled up your Kanji skills.",
back: "Back to Collection",
caughtUp: "All Caught Up!",
noReviews: "No reviews available right now.",
viewCollection: "View Collection",
queue: "Session queue:",
loading: "Loading Kanji...",
},
collection: {
searchLabel: "Search Kanji, Meaning, or Reading...",
placeholder: "e.g. 'water', 'mizu', '水'",
loading: "Loading Collection...",
noMatches: "No matches found",
tryDifferent: "Try searching for a different meaning or reading.",
levelHeader: "LEVEL",
onyomi: "On'yomi",
kunyomi: "Kun'yomi",
nanori: "Nanori",
close: "Close"
}
},
de: {
common: {
close: "Schließen",
cancel: "Abbrechen"
},
nav: {
dashboard: "Übersicht",
review: "Lernen",
collection: "Sammlung",
settings: "Einstellungen",
sync: "Sync",
logout: "Abmelden",
menu: "Menü"
},
login: {
instruction: "Gib deinen WaniKani V2 API Key ein",
placeholder: "Key hier einfügen...",
button: "Anmelden",
failed: "Login fehlgeschlagen. Läuft der Server?"
},
alerts: {
syncSuccess: "Sync fertig! Sammlung: {count}",
syncFailed: "Sync fehlgeschlagen.",
logoutConfirm: "Möchtest du dich wirklich abmelden? Deine Sitzung wird beendet.",
},
hero: {
welcome: "Willkommen zurück",
subtitle: "Dein Geist ist bereit.",
start: "Starten",
noReviews: "Alles erledigt",
nextIn: "Nächste Review in",
now: "jetzt",
prioritize: "Niedrige Stufen zuerst ({count})"
},
stats: {
mastery: "Meisterschaft (Guru+)",
srsDistribution: "SRS Verteilung",
accuracy: "Genauigkeit",
correct: "Richtig",
total: "Gesamt",
next24: "Nächste 24h",
availableNow: "Jetzt verfügbar",
inHours: "In {n} Stunde | In {n} Stunden",
noIncoming: "Keine Reviews in den nächsten 24h.",
items: "Einträge",
reviewsCount: "{count} Reviews",
ghostTitle: 'Ghost Items',
ghostSubtitle: 'Lowest Accuracy',
noGhosts: 'No ghosts found! Keep it up.',
},
settings: {
title: 'Settings',
batchSize: 'Review Batch Size',
items: 'Items',
language: 'Language',
drawingTolerance: 'Drawing Tolerance',
strict: 'Strict',
loose: 'Loose',
save: 'Save & Close',
},
review: {
meaning: 'Meaning',
level: 'Level',
draw: 'Draw correctly',
hint: 'Hint Shown',
showHint: 'Show Hint',
redoLesson: 'Redo Lesson',
tryAgain: 'Try again',
correct: 'Correct!',
next: 'NEXT',
sessionComplete: 'Session Complete!',
levelup: 'You leveled up your Kanji skills.',
back: 'Back to Collection',
caughtUp: 'All Caught Up!',
noReviews: 'No reviews available right now.',
viewCollection: 'View Collection',
queue: 'Session queue:',
loading: 'Loading Kanji...',
},
collection: {
searchLabel: 'Search Kanji, Meaning, or Reading...',
placeholder: "e.g. 'water', 'mizu', '水'",
loading: 'Loading Collection...',
noMatches: 'No matches found',
tryDifferent: 'Try searching for a different meaning or reading.',
levelHeader: 'LEVEL',
onyomi: "On'yomi",
kunyomi: "Kun'yomi",
nanori: 'Nanori',
close: 'Close',
startLesson: 'Start Lesson',
redoLesson: 'Redo Lesson',
},
},
de: {
common: {
close: 'Schließen',
cancel: 'Abbrechen',
},
nav: {
dashboard: 'Übersicht',
review: 'Lernen',
collection: 'Sammlung',
settings: 'Einstellungen',
sync: 'Sync',
logout: 'Abmelden',
menu: 'Menü',
},
login: {
instruction: 'Gib deinen WaniKani V2 API Key ein',
placeholder: 'Key hier einfügen...',
button: 'Anmelden',
failed: 'Login fehlgeschlagen. Läuft der Server?',
},
alerts: {
syncSuccess: 'Sync fertig! Sammlung: {count}',
syncFailed: 'Sync fehlgeschlagen.',
logoutConfirm: 'Möchtest du dich wirklich abmelden? Deine Sitzung wird beendet.',
},
lesson: {
phasePrimer: 'Lernen',
phaseDemo: 'Beobachtung',
phaseGuided: 'Geführt',
phasePractice: 'Abruf',
understand: 'Verstanden',
ready: 'Bereit zum Zeichnen',
startPractice: 'Üben Starten',
continue: 'Weiter',
streak: 'Richtig: {n} / {total}',
hint: 'Hinweis (Setzt Serie zurück)',
hintAction: 'Hinweis',
watchAgain: 'Nochmal ansehen',
completeTitle: 'Lektion Fertig!',
completeBody: 'Neue Kanji für Reviews freigeschaltet.',
learned: 'Du hast {n} neue Kanji gelernt.',
components: 'Komponenten',
observe: 'Strichfolge beobachten',
trace: 'Nachzeichnen',
drawStep: 'Zeichnen ({n}/{total})',
backToDashboard: 'Zurück zur Übersicht',
},
hero: {
lessons: 'Lektionen',
welcome: 'Willkommen zurück',
subtitle: 'Dein Geist ist bereit.',
start: 'Starten',
noReviews: 'Alles erledigt',
nextIn: 'Nächste Review in',
now: 'jetzt',
prioritize: 'Niedrige Stufen zuerst ({count})',
},
stats: {
mastery: 'Meisterschaft (Guru+)',
srsDistribution: 'SRS Verteilung',
accuracy: 'Genauigkeit',
correct: 'Richtig',
total: 'Gesamt',
next24: 'Nächste 24h',
availableNow: 'Jetzt verfügbar',
inHours: 'In {n} Stunde | In {n} Stunden',
noIncoming: 'Keine Reviews in den nächsten 24h.',
items: 'Einträge',
reviewsCount: '{count} Reviews',
consistency: "Lern-Konstanz",
less: "Weniger",
more: "Mehr",
consistency: 'Lern-Konstanz',
less: 'Weniger',
more: 'Mehr',
streakTitle: "Lern-Serie",
days: "Tage",
shieldActive: "Zen-Schild Aktiv: Schützt dich bei einem verpassten Tag.",
shieldCooldown: "Regeneriert: noch {n} Tage",
streakTitle: 'Lern-Serie',
days: 'Tage',
shieldActive: 'Zen-Schild Aktiv: Schützt dich bei einem verpassten Tag.',
shieldCooldown: 'Regeneriert: noch {n} Tage',
ghostTitle: "Geister-Items",
ghostSubtitle: "Niedrigste Genauigkeit",
noGhosts: "Keine Geister gefunden! Weiter so."
},
settings: {
title: "Einstellungen",
batchSize: "Anzahl pro Sitzung",
items: "Einträge",
language: "Sprache",
save: "Speichern & Schließen"
},
review: {
meaning: "Bedeutung",
level: "Stufe",
draw: "Zeichne das Kanji",
hint: "Hinweis angezeigt",
tryAgain: "Nochmal versuchen",
correct: "Richtig!",
next: "WEITER",
sessionComplete: "Sitzung beendet!",
levelup: "Du hast deine Kanji-Skills verbessert.",
back: "Zurück zur Sammlung",
caughtUp: "Alles erledigt!",
noReviews: "Gerade keine Reviews verfügbar.",
viewCollection: "Zur Sammlung",
queue: "Verbleibend:",
loading: "Lade Kanji...",
},
collection: {
searchLabel: "Suche Kanji, Bedeutung oder Lesung...",
placeholder: "z.B. 'Wasser', 'mizu'",
loading: "Lade Sammlung...",
noMatches: "Keine Treffer",
tryDifferent: "Versuche einen anderen Suchbegriff.",
levelHeader: "STUFE",
onyomi: "On'yomi",
kunyomi: "Kun'yomi",
nanori: "Nanori",
close: "Schließen"
}
},
ja: {
common: {
close: "閉じる",
cancel: "キャンセル"
},
nav: {
dashboard: "ダッシュボード",
review: "復習",
collection: "コレクション",
settings: "設定",
sync: "同期",
logout: "ログアウト",
menu: "メニュー"
},
login: {
instruction: "WaniKani V2 APIキーを入力してください",
placeholder: "キーを貼り付け...",
button: "ログイン",
failed: "ログイン失敗。サーバーは起動していますか?"
},
alerts: {
syncSuccess: "同期完了! コレクション: {count}",
syncFailed: "同期に失敗しました。",
logoutConfirm: "ログアウトしてもよろしいですか?セッションが終了します。",
},
hero: {
welcome: "お帰りなさい",
subtitle: "準備は完了です。",
start: "復習開始",
noReviews: "レビューなし",
nextIn: "次の復習まで",
now: "今",
prioritize: "低レベルを優先 ({count})"
},
stats: {
mastery: "習得度 (Guru+)",
srsDistribution: "SRS分布",
accuracy: "正解率",
correct: "正解",
total: "合計",
next24: "今後24時間",
availableNow: "今すぐ可能",
inHours: "{n}時間後",
noIncoming: "24時間以内のレビューはありません。",
items: "個",
reviewsCount: "{count} レビュー",
ghostTitle: 'Geister-Items',
ghostSubtitle: 'Niedrigste Genauigkeit',
noGhosts: 'Keine Geister gefunden! Weiter so.',
},
settings: {
title: 'Einstellungen',
batchSize: 'Anzahl pro Sitzung',
items: 'Einträge',
language: 'Sprache',
drawingTolerance: 'Zeichentoleranz',
strict: 'Strikt',
loose: 'Locker',
save: 'Speichern & Schließen',
},
review: {
meaning: 'Bedeutung',
level: 'Stufe',
draw: 'Zeichne das Kanji',
hint: 'Hinweis angezeigt',
showHint: 'Hinweis zeigen',
redoLesson: 'Lektion wiederholen',
tryAgain: 'Nochmal versuchen',
correct: 'Richtig!',
next: 'WEITER',
sessionComplete: 'Sitzung beendet!',
levelup: 'Du hast deine Kanji-Skills verbessert.',
back: 'Zurück zur Sammlung',
caughtUp: 'Alles erledigt!',
noReviews: 'Gerade keine Reviews verfügbar.',
viewCollection: 'Zur Sammlung',
queue: 'Verbleibend:',
loading: 'Lade Kanji...',
},
collection: {
searchLabel: 'Suche Kanji, Bedeutung oder Lesung...',
placeholder: "z.B. 'Wasser', 'mizu'",
loading: 'Lade Sammlung...',
noMatches: 'Keine Treffer',
tryDifferent: 'Versuche einen anderen Suchbegriff.',
levelHeader: 'STUFE',
onyomi: "On'yomi",
kunyomi: "Kun'yomi",
nanori: 'Nanori',
close: 'Schließen',
startLesson: 'Lektion starten',
redoLesson: 'Lektion wiederholen',
},
},
ja: {
common: {
close: '閉じる',
cancel: 'キャンセル',
},
nav: {
dashboard: 'ダッシュボード',
review: '復習',
collection: 'コレクション',
settings: '設定',
sync: '同期',
logout: 'ログアウト',
menu: 'メニュー',
},
login: {
instruction: 'WaniKani V2 APIキーを入力してください',
placeholder: 'キーを貼り付け...',
button: 'ログイン',
failed: 'ログイン失敗。サーバーは起動していますか?',
},
alerts: {
syncSuccess: '同期完了! コレクション: {count}',
syncFailed: '同期に失敗しました。',
logoutConfirm: 'ログアウトしてもよろしいですか?セッションが終了します。',
},
lesson: {
phasePrimer: '学習',
phaseDemo: '観察',
phaseGuided: 'ガイド',
phasePractice: '想起',
understand: '理解した',
ready: '描いてみる',
startPractice: '練習開始',
continue: '次へ',
streak: '正解: {n} / {total}',
hint: 'ヒント (連勝リセット)',
hintAction: 'ヒント',
watchAgain: 'もう一度見る',
completeTitle: 'レッスン完了!',
completeBody: '新しい漢字がレビューに追加されました。',
learned: '{n}個の新しい漢字を覚えました。',
components: '構成要素',
observe: '書き順を見る',
trace: 'なぞる',
drawStep: '書く ({n}/{total})',
backToDashboard: 'ダッシュボードに戻る',
},
hero: {
lessons: 'レッスン',
welcome: 'お帰りなさい',
subtitle: '準備は完了です。',
start: '復習開始',
noReviews: 'レビューなし',
nextIn: '次の復習まで',
now: '今',
prioritize: '低レベルを優先 ({count})',
},
stats: {
mastery: '習得度 (Guru+)',
srsDistribution: 'SRS分布',
accuracy: '正解率',
correct: '正解',
total: '合計',
next24: '今後24時間',
availableNow: '今すぐ可能',
inHours: '{n}時間後',
noIncoming: '24時間以内のレビューはありません。',
items: '個',
reviewsCount: '{count} レビュー',
consistency: "学習の一貫性",
less: "少",
more: "多",
consistency: '学習の一貫性',
less: '少',
more: '多',
streakTitle: "連続学習日数",
days: "日",
shieldActive: "Zenシールド有効: 1日休んでもストリークを守ります。",
shieldCooldown: "再チャージ中: 残り{n}日",
streakTitle: '連続学習日数',
days: '日',
shieldActive: 'Zenシールド有効: 1日休んでもストリークを守ります。',
shieldCooldown: '再チャージ中: 残り{n}日',
ghostTitle: "苦手なアイテム",
ghostSubtitle: "正解率が低い",
noGhosts: "苦手なアイテムはありません!"
},
settings: {
title: "設定",
batchSize: "1回の復習数",
items: "個",
language: "言語 (Language)",
save: "保存して閉じる"
},
review: {
meaning: "意味",
level: "レベル",
draw: "正しく描いてください",
hint: "ヒント表示",
tryAgain: "もう一度",
correct: "正解!",
next: "次へ",
sessionComplete: "セッション完了!",
levelup: "漢字力がアップしました。",
back: "コレクションに戻る",
caughtUp: "完了しました!",
noReviews: "現在レビューするものはありません。",
viewCollection: "コレクションを見る",
queue: "残り:",
loading: "漢字を読み込み中...",
},
collection: {
searchLabel: "漢字、意味、読みで検索...",
placeholder: "例: '水', 'mizu'",
loading: "読み込み中...",
noMatches: "見つかりませんでした",
tryDifferent: "別のキーワードで検索してください。",
levelHeader: "レベル",
onyomi: "音読み",
kunyomi: "訓読み",
nanori: "名乗り",
close: "閉じる"
}
}
}
ghostTitle: '苦手なアイテム',
ghostSubtitle: '正解率が低い',
noGhosts: '苦手なアイテムはありません!',
},
settings: {
title: '設定',
batchSize: '1回の復習数',
items: '個',
language: '言語 (Language)',
drawingTolerance: '描画許容範囲',
strict: '厳しい',
loose: '甘い',
save: '保存して閉じる',
},
review: {
meaning: '意味',
level: 'レベル',
draw: '正しく描いてください',
hint: 'ヒント表示',
showHint: 'ヒントを表示',
redoLesson: 'レッスンをやり直す',
tryAgain: 'もう一度',
correct: '正解!',
next: '次へ',
sessionComplete: 'セッション完了!',
levelup: '漢字力がアップしました。',
back: 'コレクションに戻る',
caughtUp: '完了しました!',
noReviews: '現在レビューするものはありません。',
viewCollection: 'コレクションを見る',
queue: '残り:',
loading: '漢字を読み込み中...',
},
collection: {
searchLabel: '漢字、意味、読みで検索...',
placeholder: "例: '水', 'mizu'",
loading: '読み込み中...',
noMatches: '見つかりませんでした',
tryDifferent: '別のキーワードで検索してください。',
levelHeader: 'レベル',
onyomi: '音読み',
kunyomi: '訓読み',
nanori: '名乗り',
close: '閉じる',
startLesson: 'レッスン開始',
redoLesson: 'レッスンをやり直す',
},
},
};
const savedLocale = localStorage.getItem('zen_locale') || 'en'
const savedLocale = localStorage.getItem('zen_locale') || 'en';
const i18n = createI18n({
legacy: false,
locale: savedLocale,
fallbackLocale: 'en',
messages
})
legacy: false,
locale: savedLocale,
fallbackLocale: 'en',
messages,
});
export default i18n
export default i18n;