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

@@ -14,6 +14,10 @@ import {
EXHIBIT_PLACEHOLDER_IMAGE,
HALL_PLACEHOLDER_IMAGE
} from '@/utils/placeholders'
import {
normalizeGuideAudioLanguage,
type GuideAudioLanguage
} from '@/data/adapters/guideStopInfoAdapter'
export interface BackendGuideContent {
id?: string | number | null
@@ -251,8 +255,12 @@ const buildTags = (exhibit: BackendExhibit) => Array.from(new Set([
firstText(exhibit.origin)
].filter(Boolean)))
const normalizeSupportedLanguages = (languages: string[] | null | undefined) => (
Array.isArray(languages) ? languages.map(String).filter(Boolean) : []
const normalizeSupportedLanguages = (languages: string[] | null | undefined): GuideAudioLanguage[] => (
Array.from(new Set((languages || [])
.map(String)
.filter((language) => ['zh', 'zh-cn', 'en', 'en-us', 'yue', 'yue-cn', 'yue-hk']
.includes(language.trim().toLowerCase()))
.map(normalizeGuideAudioLanguage)))
)
const normalizeCatalogAudioStatus = (status?: string | null) => (
@@ -496,7 +504,8 @@ export const toBackendMuseumExhibit = (
const audioUrl = options.includeDetail ? resolveGuideAudioUrl(guide, source) : normalizeSameOriginPublicUrl(firstText(source.audioUrl))
const targetType = normalizeAudioTargetType(guide?.targetType || source.playTargetType)
const targetId = stringifyId(guide?.targetId || source.playTargetId)
const supportedLanguage = source.supportedLanguages?.find((language) => language === 'zh-CN' || language === 'en-US')
const supportedLanguages = normalizeSupportedLanguages(source.supportedLanguages)
const supportedLanguage = supportedLanguages[0]
const metadataSuggestsAudio = source.hasAudio === true && isAudioReady(source.audioStatus)
const audioAvailable = Boolean(audioUrl)
const sourcePoiId = stringifyId(source.poiId)
@@ -528,7 +537,7 @@ export const toBackendMuseumExhibit = (
audioHasText: options.includeDetail ? Boolean(guideText) : undefined,
audioAvailable: audioAvailable || metadataSuggestsAudio,
audioStatus: source.audioStatus || undefined,
supportedLanguages: source.supportedLanguages || undefined,
supportedLanguages: supportedLanguages.length ? supportedLanguages : undefined,
audioUnavailableReason: audioAvailable || metadataSuggestsAudio
? undefined
: '该讲解暂无已发布音频,当前提供图文讲解。',