diff --git a/src/lib/i18n/en.ts b/src/lib/i18n/en.ts
index 47f1017..a55e9f7 100644
--- a/src/lib/i18n/en.ts
+++ b/src/lib/i18n/en.ts
@@ -134,5 +134,31 @@ export default {
title: 'Oops!',
message: 'The page you’re looking for doesn’t exist. It might have been removed, renamed, or never existed.\n\n Go back to the homepage to continue browsing',
return: 'Return home',
- }
+ },
+ player: {
+ menu: {
+ showFuri: 'Show Furigana',
+ hideFuri: 'Hide Furigana',
+ revertHiragana: 'Revert to Hiragana',
+ convertToKatakana: 'Convert all to Katakana',
+ showRomaji: 'Show Romaji',
+ hideRomaji: 'Hide Romaji',
+ showRomajiOnError: 'Show Romaji on Error',
+ hideRomajiOnError: 'Don\'t Show Romaji on Error',
+ musicModeUnavailable: 'Not available in music mode',
+ showRepeated: 'Show Repeated Lines',
+ hideRepeated: 'Hide Repeated Lines',
+ shuffle: 'Current: Shuffle',
+ sequential: 'Current: Sequential',
+ nextSong: 'Next Song'
+ }
+ },
+ dialog: {
+ close: 'Close',
+ error: {
+ title: 'Error',
+ refresh: 'Refresh to Retry'
+ }
+ },
+ components: {}
}
\ No newline at end of file
diff --git a/src/lib/i18n/ja.ts b/src/lib/i18n/ja.ts
index 425a73c..d5f46fd 100644
--- a/src/lib/i18n/ja.ts
+++ b/src/lib/i18n/ja.ts
@@ -134,5 +134,31 @@ export default {
title: 'おっと!',
message: 'お探しのページは見つかりませんでした。削除されたか、名前が変更されたか、あるいは最初から存在しなかった可能性があります。\n\n トップページ に戻って閲覧を続けてください',
return: 'トップページに戻る',
- }
+ },
+ player: {
+ menu: {
+ showFuri: 'ふりがなを表示',
+ hideFuri: 'ふりがなを隠す',
+ revertHiragana: 'ひらがなに戻す',
+ convertToKatakana: 'すべてカタカナに変換',
+ showRomaji: 'ローマ字を表示',
+ hideRomaji: 'ローマ字を隠す',
+ showRomajiOnError: 'エラー時にローマ字を表示',
+ hideRomajiOnError: 'エラー時にローマ字を表示しない',
+ musicModeUnavailable: '音楽モードでは利用できません',
+ showRepeated: '重複行を表示',
+ hideRepeated: '重複行を隠す',
+ shuffle: '現在:シャッフル再生',
+ sequential: '現在:順次再生',
+ nextSong: '次の曲'
+ }
+ },
+ dialog: {
+ close: '閉じる',
+ error: {
+ title: 'エラー',
+ refresh: '更新して再試行'
+ }
+ },
+ components: {}
}
diff --git a/src/lib/i18n/zh.ts b/src/lib/i18n/zh.ts
index 3fcd861..a7f6403 100644
--- a/src/lib/i18n/zh.ts
+++ b/src/lib/i18n/zh.ts
@@ -134,5 +134,33 @@ export default {
title: '页面不存在',
message: '很抱歉,您访问的页面不存在。可能已被删除、更名,或链接输入错误。\n\n 返回 首页 继续浏览',
return: '返回首页',
+ },
+ player: {
+ menu: {
+ showFuri: '显示假名标注',
+ hideFuri: '隐藏假名标注',
+ revertHiragana: '恢复平假名',
+ convertToKatakana: '全部转换为片假名',
+ showRomaji: '显示罗马音',
+ hideRomaji: '隐藏罗马音',
+ showRomajiOnError: '错误时显示罗马音',
+ hideRomajiOnError: '不在错误时显示罗马音',
+ musicModeUnavailable: '音乐模式下不可用',
+ showRepeated: '显示重复行',
+ hideRepeated: '隐藏重复行',
+ shuffle: '当前:随机播放',
+ sequential: '当前:顺序播放',
+ nextSong: '下首'
+ }
+ },
+ dialog: {
+ close: '关闭',
+ error: {
+ title: '错误',
+ refresh: '刷新重试'
+ }
+ },
+ components: {
+
}
}
\ No newline at end of file
diff --git a/src/lib/ui/player/PlayerAppBar.svelte b/src/lib/ui/player/PlayerAppBar.svelte
index 791d740..dabd431 100644
--- a/src/lib/ui/player/PlayerAppBar.svelte
+++ b/src/lib/ui/player/PlayerAppBar.svelte
@@ -7,6 +7,8 @@
import { API } from "$lib/client"
import { getNextSong, getNextLoc } from "./SongSwitching"
+ import { getI18n } from "$lib/i18n"
+
interface Props {
song: NeteaseSong
settings: TypingSettings
@@ -27,6 +29,8 @@
isKaraoke = false
}: Props = $props()
+ const t = getI18n().player.menu
+
let isHideRepeated = $derived(settings.hideRepeated && !disableHideRepeated)
const nextSongId = $derived(getNextSong(playlist, loc))
@@ -48,27 +52,27 @@
-
-
-
+
+
+
{#if showRomajiOnError}
-
+
{/if}
+ sub={disableHideRepeated ? t.musicModeUnavailable : ""}
+ onclick={() => settings.hideRepeated = !settings.hideRepeated}>{isHideRepeated ? t.showRepeated : t.hideRepeated}
{#if loc}
{#if nextSongId}
-
+
{/if}
{/if}
diff --git a/src/lib/ui/status/Dialog.svelte b/src/lib/ui/status/Dialog.svelte
index 8024eba..62b6b9f 100644
--- a/src/lib/ui/status/Dialog.svelte
+++ b/src/lib/ui/status/Dialog.svelte
@@ -1,6 +1,7 @@
diff --git a/src/lib/ui/status/ErrorDialog.svelte b/src/lib/ui/status/ErrorDialog.svelte
index 8d8af08..bfcf348 100644
--- a/src/lib/ui/status/ErrorDialog.svelte
+++ b/src/lib/ui/status/ErrorDialog.svelte
@@ -1,15 +1,18 @@
-