Files
zen-kanji/client/src/plugins/i18n.js
2025-12-23 02:23:44 +01:00

406 lines
12 KiB
JavaScript

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.',
},
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',
newContent: 'New content available',
welcome: 'Welcome Back',
subtitle: 'Your mind is ready.',
start: 'Start Review',
readyToReview: 'Ready to review',
noReviews: 'No Reviews',
allCaughtUp: 'All caught up',
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',
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',
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',
newContent: 'Neue Inhalte verfügbar',
welcome: 'Willkommen zurück',
subtitle: 'Dein Geist ist bereit.',
start: 'Starten',
readyToReview: 'Bereit zum Wiederholen',
noReviews: 'Alles erledigt',
allCaughtUp: 'Alles auf dem neuesten Stand',
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',
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',
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: 'レッスン',
newContent: '新しいコンテンツがあります',
welcome: 'お帰りなさい',
subtitle: '準備は完了です。',
start: '復習開始',
readyToReview: '復習の準備ができています',
noReviews: 'レビューなし',
allCaughtUp: 'すべて完了しています',
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: '多',
streakTitle: '連続学習日数',
days: '日',
shieldActive: 'Zenシールド有効: 1日休んでもストリークを守ります。',
shieldCooldown: '再チャージ中: 残り{n}日',
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 i18n = createI18n({
legacy: false,
locale: savedLocale,
fallbackLocale: 'en',
messages,
});
export default i18n;