Skip to content

Commit 8744e04

Browse files
committed
feat: 音乐播放 i18n
1 parent dcab044 commit 8744e04

19 files changed

Lines changed: 196 additions & 29 deletions

File tree

src/components/widget/music/atoms/CoverImage.svelte

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,21 @@
11
<script lang="ts">
2+
import I18nKey from "../../../../i18n/i18nKey";
3+
import { i18n } from "../../../../i18n/translation";
4+
import { getAssetPath } from "../../../../utils/asset-path";
5+
26
interface Props {
37
cover: string;
48
isPlaying: boolean;
59
isLoading: boolean;
610
}
711
812
const { cover, isPlaying, isLoading }: Props = $props();
9-
10-
function getAssetPath(path: string): string {
11-
if (!path) return "/favicon/favicon.png";
12-
if (path.startsWith("http://") || path.startsWith("https://")) return path;
13-
if (path.startsWith("/")) return path;
14-
return `/${path}`;
15-
}
1613
</script>
1714

1815
<div class="cover-container">
1916
<img
20-
src={getAssetPath(cover)}
21-
alt="封面"
17+
src={getAssetPath(cover, "/favicon/favicon.png")}
18+
alt={i18n(I18nKey.musicPlayer)}
2219
loading="eager"
2320
class="cover-img"
2421
class:spinning={isPlaying && !isLoading}

src/components/widget/music/atoms/NextButton.svelte

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<script lang="ts">
22
import Icon from "@iconify/svelte";
3+
import I18nKey from "../../../../i18n/i18nKey";
4+
import { i18n } from "../../../../i18n/translation";
35
46
interface Props {
57
onclick: () => void;
@@ -9,6 +11,6 @@ interface Props {
911
const { onclick, disabled = false }: Props = $props();
1012
</script>
1113

12-
<button class="btn-plain w-9 h-9 rounded-lg" aria-label="下一首" {onclick} {disabled}>
14+
<button class="btn-plain w-9 h-9 rounded-lg" aria-label={i18n(I18nKey.musicBoxNext)} {onclick} {disabled}>
1315
<Icon icon="material-symbols:skip-next" class="text-xl" />
1416
</button>

src/components/widget/music/atoms/PlayButton.svelte

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<script lang="ts">
22
import Icon from "@iconify/svelte";
3+
import I18nKey from "../../../../i18n/i18nKey";
4+
import { i18n } from "../../../../i18n/translation";
35
46
interface Props {
57
isPlaying: boolean;
@@ -14,7 +16,7 @@ const { isPlaying, isLoading, onclick }: Props = $props();
1416
class="btn-regular w-11 h-11 rounded-full"
1517
class:opacity-50={isLoading}
1618
disabled={isLoading}
17-
aria-label={isPlaying ? "暂停" : "播放"}
19+
aria-label={isPlaying ? i18n(I18nKey.musicBoxPause) : i18n(I18nKey.musicBoxPlay)}
1820
{onclick}
1921
>
2022
{#if isLoading}

src/components/widget/music/atoms/PrevButton.svelte

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<script lang="ts">
22
import Icon from "@iconify/svelte";
3+
import I18nKey from "../../../../i18n/i18nKey";
4+
import { i18n } from "../../../../i18n/translation";
35
46
interface Props {
57
onclick: () => void;
@@ -9,6 +11,6 @@ interface Props {
911
const { onclick, disabled = false }: Props = $props();
1012
</script>
1113

12-
<button class="btn-plain w-9 h-9 rounded-lg" aria-label="上一首" {onclick} {disabled}>
14+
<button class="btn-plain w-9 h-9 rounded-lg" aria-label={i18n(I18nKey.musicBoxPrev)} {onclick} {disabled}>
1315
<Icon icon="material-symbols:skip-previous" class="text-xl" />
1416
</button>

src/components/widget/music/components/Controls.svelte

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<script lang="ts">
22
import Icon from "@iconify/svelte";
3+
import I18nKey from "../../../../i18n/i18nKey";
4+
import { i18n } from "../../../../i18n/translation";
35
import type { RepeatMode } from "../../../../types/music";
46
import NextButton from "../atoms/NextButton.svelte";
57
import PlayButton from "../atoms/PlayButton.svelte";
@@ -45,14 +47,14 @@ const modeActive = $derived(isShuffled || repeatMode > 0);
4547
class="icon-btn"
4648
class:active-mode={modeActive}
4749
onclick={onToggleMode}
48-
aria-label="播放模式"
50+
aria-label={i18n(I18nKey.musicBoxMode)}
4951
>
5052
<Icon icon={repeatIcon} class="text-xl" />
5153
</button>
5254
<PrevButton onclick={onPrev} />
5355
<PlayButton {isPlaying} {isLoading} onclick={onTogglePlay} />
5456
<NextButton onclick={onNext} />
55-
<button class="icon-btn list-btn" onclick={onTogglePlaylist} aria-label="播放列表">
57+
<button class="icon-btn list-btn" onclick={onTogglePlaylist} aria-label={i18n(I18nKey.musicBoxPlaylist)}>
5658
<Icon icon="material-symbols:queue-music-rounded" class="text-xl" />
5759
</button>
5860
</div>

src/components/widget/music/components/Playlist.svelte

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<script lang="ts">
22
import Icon from "@iconify/svelte";
3+
import I18nKey from "../../../../i18n/i18nKey";
4+
import { i18n } from "../../../../i18n/translation";
35
import type { Song } from "../../../../types/music";
46
import { getAssetPath } from "../../../../utils/asset-path";
57
@@ -19,7 +21,7 @@ const { playlist, currentIndex, isPlaying, show, onClose, onPlaySong }: Props =
1921
<div class="playlist-drawer" class:open={show}>
2022
<div class="playlist-inner">
2123
<div class="playlist-shell">
22-
<div class="playlist-list" role="listbox" aria-label="播放列表">
24+
<div class="playlist-list" role="listbox" aria-label={i18n(I18nKey.musicBoxPlaylist)}>
2325
{#each playlist as song, index}
2426
<div
2527
class="track-item"
@@ -34,7 +36,7 @@ const { playlist, currentIndex, isPlaying, show, onClose, onPlaySong }: Props =
3436
role="option"
3537
tabindex="0"
3638
aria-selected={index === currentIndex}
37-
aria-label={`播放 ${song.title}`}
39+
aria-label={`${i18n(I18nKey.musicBoxPlay)} ${song.title}`}
3840
>
3941
<div class="track-cover">
4042
<img src={getAssetPath(song.cover, "/favicon/favicon.png")} alt={song.title} loading="lazy" />

src/components/widget/music/components/Progress.svelte

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
<script lang="ts">
2+
import I18nKey from "../../../../i18n/i18nKey";
3+
import { i18n } from "../../../../i18n/translation";
4+
25
interface Props {
36
currentTime: number;
47
duration: number;
@@ -38,7 +41,7 @@ function handleClick(event: MouseEvent) {
3841
}}
3942
role="slider"
4043
tabindex="0"
41-
aria-label="播放进度"
44+
aria-label={i18n(I18nKey.musicBoxProgress)}
4245
aria-valuemin="0"
4346
aria-valuemax="100"
4447
aria-valuenow={progressPct}

src/components/widget/music/components/TrackInfo.svelte

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<script lang="ts">
22
import Icon from "@iconify/svelte";
3+
import I18nKey from "../../../../i18n/i18nKey";
4+
import { i18n } from "../../../../i18n/translation";
35
import type { Song } from "../../../types/music";
46
57
interface Props {
@@ -76,7 +78,7 @@ function handleVolumeKey(event: KeyboardEvent) {
7678
type="button"
7779
class="vol-btn"
7880
onclick={onToggleMute}
79-
aria-label="切换静音"
81+
aria-label={isMuted ? i18n(I18nKey.musicBoxUnmute) : i18n(I18nKey.musicBoxMute)}
8082
>
8183
<Icon
8284
icon={isMuted || volume === 0
@@ -94,7 +96,7 @@ function handleVolumeKey(event: KeyboardEvent) {
9496
onkeydown={handleVolumeKey}
9597
role="slider"
9698
tabindex="0"
97-
aria-label="音量"
99+
aria-label={i18n(I18nKey.musicBoxVolume)}
98100
aria-valuemin="0"
99101
aria-valuemax="100"
100102
aria-valuenow={volumePercent}

src/i18n/i18nKey.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,21 @@ enum I18nKey {
3737
friends = "friends",
3838

3939
musicPlayer = "musicPlayer",
40+
musicBox = "musicBox",
41+
musicBoxPlay = "musicBoxPlay",
42+
musicBoxPause = "musicBoxPause",
43+
musicBoxPrev = "musicBoxPrev",
44+
musicBoxNext = "musicBoxNext",
45+
musicBoxPlaylist = "musicBoxPlaylist",
46+
musicBoxMode = "musicBoxMode",
47+
musicBoxVolume = "musicBoxVolume",
48+
musicBoxMute = "musicBoxMute",
49+
musicBoxUnmute = "musicBoxUnmute",
50+
musicBoxShuffle = "musicBoxShuffle",
51+
musicBoxRepeat = "musicBoxRepeat",
52+
musicBoxRepeatOne = "musicBoxRepeatOne",
53+
musicBoxProgress = "musicBoxProgress",
54+
musicBoxCover = "musicBoxCover",
4055
}
4156

4257
export default I18nKey;

src/i18n/languages/en.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,19 @@ export const en: Translation = {
3737
[Key.author]: "Author",
3838
[Key.publishedAt]: "Published at",
3939
[Key.license]: "License",
40-
[Key.musicPlayer]: "Music Player",
40+
[Key.musicPlayer]: "Music Box",
41+
[Key.musicBoxPlay]: "Play",
42+
[Key.musicBoxPause]: "Pause",
43+
[Key.musicBoxPrev]: "Previous",
44+
[Key.musicBoxNext]: "Next",
45+
[Key.musicBoxPlaylist]: "Playlist",
46+
[Key.musicBoxMode]: "Playback mode",
47+
[Key.musicBoxVolume]: "Volume",
48+
[Key.musicBoxMute]: "Mute",
49+
[Key.musicBoxUnmute]: "Unmute",
50+
[Key.musicBoxShuffle]: "Shuffle",
51+
[Key.musicBoxRepeat]: "Repeat",
52+
[Key.musicBoxRepeatOne]: "Repeat one",
53+
[Key.musicBoxProgress]: "Progress",
54+
[Key.musicBoxCover]: "Cover",
4155
};

0 commit comments

Comments
 (0)