Skip to content

Commit 152ae2f

Browse files
committed
2 parents a137688 + 0897002 commit 152ae2f

29 files changed

Lines changed: 293 additions & 63 deletions

‎src/main/window/miniPlayerWindow.ts‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ const lockNormalHeight = (target: BrowserWindow, width: number) => {
149149
}
150150

151151
const hideMainWindow = () => {
152+
hideMiniPlayerTooltip()
152153
const main = getMainWindow()
153154
if (!isUsableWindow(main) || !main.isVisible()) return
154155
try {
@@ -404,6 +405,9 @@ const createMiniPlayerWindow = () => {
404405
pushWindowFocus(true)
405406
})
406407
target.on('blur', () => {
408+
// 小窗失焦时锚点可能不会收到 mouseleave(例如切到主窗口或其他应用),
409+
// 不能让独立 tooltip 窗口继续悬挂在屏幕上。
410+
hideMiniPlayerTooltip()
407411
pushWindowFocus(false)
408412
})
409413
target.on('ready-to-show', () => {

‎src/renderer/src/components/HorizontalBrowseDeckBandControls.vue‎

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { HorizontalBrowseDeckKey } from '@renderer/composables/horizontalBr
33
import type { HorizontalBrowseBandKey } from '@renderer/composables/horizontalBrowse/useHorizontalBrowseFaderControls'
44
import bubbleBoxTrigger from '@renderer/components/bubbleBoxTrigger.vue'
55
import { useHorizontalBrowseAutoGain } from '@renderer/composables/horizontalBrowse/useHorizontalBrowseAutoGain'
6+
import { t } from '@renderer/utils/translate'
67
78
type HorizontalBrowseBandState = Record<HorizontalBrowseBandKey, boolean>
89
@@ -58,7 +59,11 @@ const { autoGainEnabled, autoGainStatus, autoGainTitle, toggleAutoGain } =
5859
:class="[`deck-band-controls__button--${band}`, { 'is-active': props.bands[band] }]"
5960
type="button"
6061
:aria-pressed="props.bands[band]"
61-
:aria-label="`${bandLabels[band]} ${props.bands[band] ? '已激活' : '已削减'}`"
62+
:aria-label="
63+
t(props.bands[band] ? 'horizontalBrowse.bandActive' : 'horizontalBrowse.bandCut', {
64+
band: bandLabels[band]
65+
})
66+
"
6267
@click.stop="emit('toggle-band', props.deck, band)"
6368
>
6469
{{ bandLabels[band] }}
@@ -71,9 +76,11 @@ const { autoGainEnabled, autoGainStatus, autoGainTitle, toggleAutoGain } =
7176
:class="{ 'is-active': props.cueMonitorEnabled }"
7277
type="button"
7378
:disabled="props.cueMonitorDisabled"
74-
title="监听该轨"
79+
:title="t('horizontalBrowse.cueMonitorTitle')"
7580
:aria-pressed="props.cueMonitorEnabled"
76-
:aria-label="props.cueMonitorEnabled ? '关闭该轨监听' : '开启该轨监听'"
81+
:aria-label="
82+
t(props.cueMonitorEnabled ? 'horizontalBrowse.cueMonitorOn' : 'horizontalBrowse.cueMonitorOff')
83+
"
7784
@click.stop="emit('toggle-cue-monitor', props.deck)"
7885
>
7986
CUE

‎src/renderer/src/components/HorizontalBrowseDeckToolbarRow.vue‎

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import BeatGridMetronomeControls from '@renderer/components/BeatGridMetronomeCon
33
import MixtapeBeatAlignGridAdjustToolbar from '@renderer/components/mixtapeBeatAlignGridAdjustToolbar.vue'
44
import HorizontalBrowseDeckMoveButton from '@renderer/components/HorizontalBrowseDeckMoveButton.vue'
55
import bubbleBoxTrigger from '@renderer/components/bubbleBoxTrigger.vue'
6+
import { t } from '@renderer/utils/translate'
67
import type { HorizontalBrowseDeckMoveTargetLibrary } from '@renderer/composables/horizontalBrowse/useHorizontalBrowseDeckMove'
78
import type { LibraryTransferActionMode } from '@renderer/utils/libraryTransfer'
89
import type { HorizontalBrowseTempoNudgeDirection } from '@renderer/composables/horizontalBrowse/useHorizontalBrowseDeckTempoNudge'
@@ -157,8 +158,8 @@ const handleTempoNudgeKeyUp = (direction: HorizontalBrowseTempoNudgeDirection) =
157158
type="button"
158159
class="overview__loop-arrow"
159160
:disabled="props.loopDisabled"
160-
title="Loop 缩短"
161-
aria-label="Loop 缩短"
161+
:title="t('horizontalBrowse.loopShorten')"
162+
:aria-label="t('horizontalBrowse.loopShorten')"
162163
@click="emit('loop-step-down')"
163164
>
164165
<svg viewBox="0 0 16 16" aria-hidden="true" focusable="false">
@@ -184,8 +185,8 @@ const handleTempoNudgeKeyUp = (direction: HorizontalBrowseTempoNudgeDirection) =
184185
type="button"
185186
class="overview__loop-arrow"
186187
:disabled="props.loopDisabled"
187-
title="Loop 加长"
188-
aria-label="Loop 加长"
188+
:title="t('horizontalBrowse.loopLengthen')"
189+
:aria-label="t('horizontalBrowse.loopLengthen')"
189190
@click="emit('loop-step-up')"
190191
>
191192
<svg viewBox="0 0 16 16" aria-hidden="true" focusable="false">
@@ -205,7 +206,7 @@ const handleTempoNudgeKeyUp = (direction: HorizontalBrowseTempoNudgeDirection) =
205206
v-if="props.showTempoNudge !== false"
206207
class="overview__toolbar-group overview__tempo-nudge-control"
207208
role="group"
208-
aria-label="临时速度调整"
209+
:aria-label="t('horizontalBrowse.tempoNudgeGroup')"
209210
>
210211
<bubbleBoxTrigger
211212
wrapper-tag="span"
@@ -214,8 +215,8 @@ const handleTempoNudgeKeyUp = (direction: HorizontalBrowseTempoNudgeDirection) =
214215
class="overview__tempo-nudge-btn"
215216
:class="{ 'is-active': props.tempoNudgeActiveDirection === 'fast' }"
216217
:disabled="!props.songPresent"
217-
title="按住临时加速"
218-
aria-label="按住临时加速"
218+
:title="t('horizontalBrowse.tempoNudgeFaster')"
219+
:aria-label="t('horizontalBrowse.tempoNudgeFaster')"
219220
@pointerdown="handleTempoNudgePointerDown('fast', $event)"
220221
@pointerup="handleTempoNudgePointerEnd('fast', $event)"
221222
@pointercancel="handleTempoNudgePointerEnd('fast', $event)"
@@ -237,8 +238,8 @@ const handleTempoNudgeKeyUp = (direction: HorizontalBrowseTempoNudgeDirection) =
237238
class="overview__tempo-nudge-btn"
238239
:class="{ 'is-active': props.tempoNudgeActiveDirection === 'slow' }"
239240
:disabled="!props.songPresent"
240-
title="按住临时减速"
241-
aria-label="按住临时减速"
241+
:title="t('horizontalBrowse.tempoNudgeSlower')"
242+
:aria-label="t('horizontalBrowse.tempoNudgeSlower')"
242243
@pointerdown="handleTempoNudgePointerDown('slow', $event)"
243244
@pointerup="handleTempoNudgePointerEnd('slow', $event)"
244245
@pointercancel="handleTempoNudgePointerEnd('slow', $event)"

‎src/renderer/src/components/HorizontalBrowseEditDeckControls.vue‎

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<script setup lang="ts">
22
import bubbleBoxTrigger from '@renderer/components/bubbleBoxTrigger.vue'
3+
import { t } from '@renderer/utils/translate'
34
45
type BeatStep = 4 | 8 | 16 | 32 | 128
56
@@ -30,7 +31,7 @@ const handleBeatStepChange = (event: Event) => {
3031
</script>
3132

3233
<template>
33-
<div class="edit-deck-controls" aria-label="编辑模式控制">
34+
<div class="edit-deck-controls" :aria-label="t('horizontalBrowse.editModeControls')">
3435
<div class="edit-deck-controls__pair">
3536
<bubbleBoxTrigger
3637
tag="button"
@@ -39,15 +40,19 @@ const handleBeatStepChange = (event: Event) => {
3940
class="edit-deck-controls__button"
4041
:title="
4142
disabled
42-
? '保存中,暂时不能切换歌曲'
43+
? t('horizontalBrowse.saveBlockingSongSwitch')
4344
: canPreviousSong
44-
? '载入上一首'
45-
: '没有可载入的上一首'
45+
? t('horizontalBrowse.loadPreviousSong')
46+
: t('horizontalBrowse.noPreviousSong')
4647
"
4748
shortcut="W"
4849
type="button"
4950
:disabled="disabled || !canPreviousSong"
50-
:aria-label="canPreviousSong ? '载入上一首' : '没有可载入的上一首'"
51+
:aria-label="
52+
canPreviousSong
53+
? t('horizontalBrowse.loadPreviousSong')
54+
: t('horizontalBrowse.noPreviousSong')
55+
"
5156
@click="emit('previous-song')"
5257
>
5358
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
@@ -61,12 +66,16 @@ const handleBeatStepChange = (event: Event) => {
6166
wrapper-class="edit-deck-controls__anchor"
6267
class="edit-deck-controls__button"
6368
:title="
64-
disabled ? '保存中,暂时不能切换歌曲' : canNextSong ? '载入下一首' : '没有可载入的下一首'
69+
disabled
70+
? t('horizontalBrowse.saveBlockingSongSwitch')
71+
: canNextSong
72+
? t('horizontalBrowse.loadNextSong')
73+
: t('horizontalBrowse.noNextSong')
6574
"
6675
shortcut="S"
6776
type="button"
6877
:disabled="disabled || !canNextSong"
69-
:aria-label="canNextSong ? '载入下一首' : '没有可载入的下一首'"
78+
:aria-label="canNextSong ? t('horizontalBrowse.loadNextSong') : t('horizontalBrowse.noNextSong')"
7079
@click="emit('next-song')"
7180
>
7281
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
@@ -82,10 +91,14 @@ const handleBeatStepChange = (event: Event) => {
8291
wrapper-tag="span"
8392
wrapper-class="edit-deck-controls__anchor"
8493
class="edit-deck-controls__button"
85-
:title="disabled ? '保存中,暂时不能跳转' : `后退 ${beatStep} beats`"
94+
:title="
95+
disabled
96+
? t('horizontalBrowse.saveBlockingSeek')
97+
: t('horizontalBrowse.jumpBackward', { beats: beatStep })
98+
"
8699
type="button"
87100
:disabled="disabled || !songPresent"
88-
:aria-label="`后退 ${beatStep} beats`"
101+
:aria-label="t('horizontalBrowse.jumpBackward', { beats: beatStep })"
89102
@click="emit('jump-beats', -1)"
90103
>
91104
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
@@ -99,10 +112,14 @@ const handleBeatStepChange = (event: Event) => {
99112
wrapper-tag="span"
100113
wrapper-class="edit-deck-controls__anchor"
101114
class="edit-deck-controls__button"
102-
:title="disabled ? '保存中,暂时不能跳转' : `前进 ${beatStep} beats`"
115+
:title="
116+
disabled
117+
? t('horizontalBrowse.saveBlockingSeek')
118+
: t('horizontalBrowse.jumpForward', { beats: beatStep })
119+
"
103120
type="button"
104121
:disabled="disabled || !songPresent"
105-
:aria-label="`前进 ${beatStep} beats`"
122+
:aria-label="t('horizontalBrowse.jumpForward', { beats: beatStep })"
106123
@click="emit('jump-beats', 1)"
107124
>
108125
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
@@ -116,13 +133,17 @@ const handleBeatStepChange = (event: Event) => {
116133
<bubbleBoxTrigger
117134
tag="div"
118135
class="edit-deck-controls__select-wrap"
119-
:title="disabled ? '保存中,暂时不能调整' : `跳转步长:${beatStep} beats`"
136+
:title="
137+
disabled
138+
? t('horizontalBrowse.saveBlockingAdjust')
139+
: t('horizontalBrowse.jumpStep', { beats: beatStep })
140+
"
120141
>
121142
<select
122143
class="edit-deck-controls__select"
123144
:value="beatStep"
124145
:disabled="disabled || !songPresent"
125-
aria-label="切换 beat 跳转步长"
146+
:aria-label="t('horizontalBrowse.changeJumpStep')"
126147
@change="handleBeatStepChange"
127148
>
128149
<option v-for="option in beatStepOptions" :key="option" :value="option">

‎src/renderer/src/components/HorizontalBrowseFaderPanel.vue‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { computed, toRef } from 'vue'
33
import type { CSSProperties } from 'vue'
44
import { useHorizontalBrowseOutput } from '@renderer/composables/horizontalBrowse/useHorizontalBrowseOutput'
5+
import { t } from '@renderer/utils/translate'
56
67
type HorizontalBrowseOutputTransport = {
78
state: {
@@ -106,7 +107,9 @@ defineExpose({
106107
class="fader-panel__toggle"
107108
type="button"
108109
:aria-expanded="props.expanded"
109-
:aria-label="props.expanded ? '收起双轨控制面板' : '展开双轨控制面板'"
110+
:aria-label="
111+
t(props.expanded ? 'horizontalBrowse.collapseFaderPanel' : 'horizontalBrowse.expandFaderPanel')
112+
"
110113
@click.stop="togglePanelExpanded"
111114
>
112115
<svg viewBox="0 0 16 16" aria-hidden="true" :class="{ 'is-flipped': props.expanded }">
@@ -132,7 +135,13 @@ defineExpose({
132135
type="button"
133136
:disabled="props.transportSyncDisabled"
134137
:aria-pressed="props.transportSyncEnabled"
135-
:aria-label="props.transportSyncEnabled ? '关闭双轨连接同步' : '开启双轨连接同步'"
138+
:aria-label="
139+
t(
140+
props.transportSyncEnabled
141+
? 'horizontalBrowse.transportSyncOn'
142+
: 'horizontalBrowse.transportSyncOff'
143+
)
144+
"
136145
@click.stop="emit('toggle-transport-sync')"
137146
>
138147
<svg

‎src/renderer/src/components/HorizontalBrowseMasterMeter.vue‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script setup lang="ts">
22
import { computed, onBeforeUnmount, ref, watch } from 'vue'
33
import bubbleBoxTrigger from '@renderer/components/bubbleBoxTrigger.vue'
4+
import { t } from '@renderer/utils/translate'
45
56
const props = defineProps<{
67
preLimiterPeakLeftDb: number
@@ -30,12 +31,17 @@ const meterStyle = computed(() => ({
3031
}))
3132
const meterHint = computed(() => {
3233
const formatPeak = (value: number) =>
33-
value <= METER_FLOOR_DB ? '无节目音频' : `${value.toFixed(1)} dBFS`
34+
value <= METER_FLOOR_DB
35+
? t('horizontalBrowse.masterMeterNoProgramAudio')
36+
: `${value.toFixed(1)} dBFS`
3437
const peakText = `L ${formatPeak(peakDb.value[0])} · R ${formatPeak(peakDb.value[1])}`
3538
if (!limiterActive.value) {
36-
return `主输出峰值 ${peakText};尚未触发 LIMIT。黄线是 -1 dBFS 预警,最右端是 -0.3 dBFS 上限。`
39+
return t('horizontalBrowse.masterMeterIdle', { peaks: peakText })
3740
}
38-
return `主输出峰值 ${peakText};LIMIT 正在压低 ${gainReductionDb.value.toFixed(1)} dB。请自行降低通道音量、EQ 或交叉推子叠加量。`
41+
return t('horizontalBrowse.masterMeterActive', {
42+
peaks: peakText,
43+
reduction: gainReductionDb.value.toFixed(1)
44+
})
3945
})
4046
4147
const animate = () => {
@@ -65,7 +71,7 @@ onBeforeUnmount(() => {
6571
<bubbleBoxTrigger tag="span" class="master-meter-anchor" :title="meterHint" :max-width="300">
6672
<span class="master-meter" :style="meterStyle">
6773
<span class="master-meter__label">LIMIT</span>
68-
<span class="master-meter__tracks" aria-label="主输出左右声道限幅表">
74+
<span class="master-meter__tracks" :aria-label="t('horizontalBrowse.masterMeterTracks')">
6975
<span class="master-meter__track master-meter__track--left">
7076
<span class="master-meter__fill"></span>
7177
<span class="master-meter__warning"></span>

‎src/renderer/src/components/HorizontalBrowseModeShell.vue‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ import {
8484
} from '@renderer/composables/horizontalBrowse/horizontalBrowseModeShellPresentationResolvers'
8585
import { isRekordboxExternalPlaybackSource } from '@renderer/utils/rekordboxExternalSource'
8686
import { resolveInitialPlaybackRangeStartSec } from '@shared/playbackRange'
87+
import { t } from '@renderer/utils/translate'
8788
8889
type DeckKey = HorizontalBrowseDeckKey
8990
const props = withDefaults(defineProps<{ viewMode?: HorizontalBrowseViewMode }>(), {
@@ -707,10 +708,12 @@ const resolveDeckToolbarState = (deck: DeckKey) => {
707708
loopBeatLabel: resolveDeckLoopBeatLabel(deck),
708709
loopActive: isDeckLoopActive(deck),
709710
loopDisabled: resolveDeckLoopDisabled(deck),
710-
bpmInputTitle: isEditMode.value ? EDIT_MODE_BPM_INPUT_TITLE : DUAL_MODE_BPM_INPUT_TITLE,
711+
bpmInputTitle: t(
712+
isEditMode.value ? EDIT_MODE_BPM_INPUT_TITLE : DUAL_MODE_BPM_INPUT_TITLE
713+
),
711714
bpmInputFirst: isEditMode.value,
712715
showTapButton: isEditMode.value,
713-
tapBpmTitle: isEditMode.value ? EDIT_MODE_TAP_BPM_TITLE : ''
716+
tapBpmTitle: isEditMode.value ? t(EDIT_MODE_TAP_BPM_TITLE) : ''
714717
}
715718
)
716719
const editSaving = isEditMode.value && deck === 'top' && audioEdit.saving.value

‎src/renderer/src/components/HorizontalBrowseRawWaveformDetail.scss‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,12 @@
5454
display: flex;
5555
align-items: center;
5656
justify-content: center;
57+
max-width: 100%;
58+
padding: 0 12px;
5759
color: var(--text-weak);
5860
font-size: 12px;
61+
text-align: center;
62+
overflow-wrap: anywhere;
5963
pointer-events: none;
6064
}
6165

‎src/renderer/src/components/HorizontalBrowseRawWaveformDetail.vue‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<script setup lang="ts">
22
import { computed, ref, watch } from 'vue'
3+
import { t } from '@renderer/utils/translate'
34
import { normalizeSongBeatGridMapV2 } from '@shared/songBeatGridMapV2'
45
import type { MixxxWaveformData } from '@renderer/pages/modules/songPlayer/webAudioPlayer'
56
import type { RawWaveformData } from '@renderer/composables/mixtape/types'
@@ -1212,7 +1213,7 @@ defineExpose(
12121213
</div>
12131214
</div>
12141215
<div v-if="externalDetailWaveformUnavailable" class="raw-detail-waveform__unavailable">
1215-
Rekordbox 未提供细节波形
1216+
{{ t('horizontalBrowse.waveformUnavailable') }}
12161217
</div>
12171218
<div ref="overlaySurfaceRef" class="raw-detail-waveform__overlay-surface">
12181219
<div ref="overlayTempoScalerRef" class="raw-detail-waveform__tempo-scaler">

0 commit comments

Comments
 (0)