feat: 支持讲解详情页粤语语音切换
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
lyf
2026-07-14 18:25:45 +08:00
parent 04c6ccd40b
commit d813f0b375
12 changed files with 291 additions and 70 deletions

View File

@@ -144,24 +144,32 @@ export class ExplainUseCase {
}
private languageLabel(language: AudioLanguage) {
return language === 'en-US' ? '英文' : '文'
if (language === 'en-US') return '文'
if (language === 'yue-HK') return '粤语'
return '中文'
}
private applyLanguageVariant(exhibit: MuseumExhibit, language: AudioLanguage): MuseumExhibit {
const variant = exhibit.audioVariants?.[language]
const mandarinText = exhibit.audioVariants?.['zh-CN']?.text
|| exhibit.guideText
|| exhibit.description
const supportedLanguages = exhibit.supportedLanguages?.length
? exhibit.supportedLanguages
: exhibit.audioVariants ? Object.keys(exhibit.audioVariants) : [language]
if (!variant) {
const label = this.languageLabel(language)
const guideText = language === 'yue-HK'
? mandarinText || '当前讲解词暂未配置。'
: `${label}讲解词暂未配置。`
return {
...exhibit,
guideText: `${label}讲解词暂未配置。`,
guideText,
audioUrl: undefined,
audioDuration: undefined,
audioLanguage: language,
audioHasText: false,
audioHasText: language === 'yue-HK' && Boolean(mandarinText),
audioAvailable: false,
audioStatus: 'MISSING',
audioUnavailableReason: `当前讲解暂无${label}音频`,
@@ -172,11 +180,13 @@ export class ExplainUseCase {
return {
...exhibit,
guideTitle: variant.title || exhibit.guideTitle,
guideText: variant.text || `${this.languageLabel(language)}讲解词暂未配置。`,
guideText: language === 'yue-HK'
? mandarinText || '当前讲解词暂未配置。'
: variant.text || `${this.languageLabel(language)}讲解词暂未配置。`,
audioUrl: variant.audioUrl,
audioDuration: variant.audioDuration,
audioLanguage: language,
audioHasText: variant.hasText === true,
audioHasText: language === 'yue-HK' ? Boolean(mandarinText) : variant.hasText === true,
audioAvailable: variant.available === true && Boolean(variant.audioUrl),
audioStatus: variant.available && variant.audioUrl ? 'READY' : 'MISSING',
audioUnavailableReason: variant.available && variant.audioUrl
@@ -413,12 +423,13 @@ export class ExplainUseCase {
async loadExplainDetailText(exhibit: MuseumExhibit): Promise<ExplainTextSelection> {
const targetType = exhibit.playTargetType || 'ITEM'
const targetId = exhibit.playTargetId || exhibit.id
const lang = (exhibit.audioLanguage as AudioLanguage) || (dataSourceConfig.audioLanguage as AudioLanguage)
try {
const textInfo = await this.audioPlayInfo.getTextInfo({
targetType,
targetId,
lang: (exhibit.audioLanguage as AudioLanguage) || (dataSourceConfig.audioLanguage as AudioLanguage)
lang
})
const nextExhibit = this.applyTextInfo(exhibit, textInfo)
@@ -436,7 +447,7 @@ export class ExplainUseCase {
available: false,
targetType,
targetId,
lang: dataSourceConfig.audioLanguage as AudioLanguage,
lang,
reason: 'SERVICE_ERROR'
},
available: false,