@@ -218,7 +218,7 @@ const detailTextLoadedByLanguage = ref<Record<AudioLanguage, boolean>>({
|
||||
const isLocationActionVisible = false
|
||||
const shouldUseHostNavigation = computed(() => isEmbeddedInWechatMiniProgram())
|
||||
|
||||
const contentLanguageOptions: Array<{
|
||||
const languageOptionDefinitions: Array<{
|
||||
value: AudioLanguage
|
||||
label: string
|
||||
}> = [
|
||||
@@ -240,6 +240,24 @@ const isAudioLanguage = (value: unknown): value is AudioLanguage => (
|
||||
value === 'zh-CN' || value === 'yue-HK' || value === 'en-US'
|
||||
)
|
||||
|
||||
const supportedDetailLanguages = computed(() => (
|
||||
(exhibit.value.audio.supportedLanguages || []).filter(isAudioLanguage)
|
||||
))
|
||||
|
||||
const contentLanguageOptions = computed(() => {
|
||||
const supportedLanguages = supportedDetailLanguages.value
|
||||
return languageOptionDefinitions.filter((option) => supportedLanguages.includes(option.value))
|
||||
})
|
||||
|
||||
const resolveSupportedDetailLanguage = (requestedLanguage: AudioLanguage) => {
|
||||
const supportedLanguages = supportedDetailLanguages.value
|
||||
if (!supportedLanguages.length || supportedLanguages.includes(requestedLanguage)) {
|
||||
return requestedLanguage
|
||||
}
|
||||
|
||||
return supportedLanguages.includes('zh-CN') ? 'zh-CN' : supportedLanguages[0]
|
||||
}
|
||||
|
||||
const audioLanguageLabel = (lang: AudioLanguage) => {
|
||||
if (lang === 'en-US') return 'English'
|
||||
if (lang === 'yue-HK') return '粤语'
|
||||
@@ -446,13 +464,20 @@ const loadExplainDetail = async (
|
||||
})
|
||||
|
||||
exhibit.value = toExplainDetailPageViewModel(exhibitData)
|
||||
selectedAudioLanguage.value = lang
|
||||
const resolvedLanguage = resolveSupportedDetailLanguage(lang)
|
||||
selectedAudioLanguage.value = resolvedLanguage
|
||||
|
||||
if (exhibitData.hallId) {
|
||||
resolvedHallId.value = exhibitData.hallId
|
||||
}
|
||||
|
||||
void loadFullDetailTextForLanguage(request, lang, exhibit.value)
|
||||
if (resolvedLanguage !== lang) {
|
||||
replaceDetailRouteLanguage(resolvedLanguage)
|
||||
await loadExplainDetail(request, resolvedLanguage)
|
||||
return
|
||||
}
|
||||
|
||||
void loadFullDetailTextForLanguage(request, resolvedLanguage, exhibit.value)
|
||||
}
|
||||
|
||||
onLoad(async (options: any = {}) => {
|
||||
@@ -581,7 +606,11 @@ const replaceDetailRouteLanguage = (lang: AudioLanguage) => {
|
||||
}
|
||||
|
||||
const handleLanguageChange = async (lang: AudioLanguage, options: { syncAudio?: boolean } = {}) => {
|
||||
if (lang === selectedAudioLanguage.value || languageSwitchLoading.value) return
|
||||
if (
|
||||
lang === selectedAudioLanguage.value
|
||||
|| languageSwitchLoading.value
|
||||
|| (supportedDetailLanguages.value.length > 0 && !supportedDetailLanguages.value.includes(lang))
|
||||
) return
|
||||
|
||||
const shouldSyncAudio = options.syncAudio !== false && isCurrentDetailAudioTarget.value
|
||||
const request = detailEntryRequest.value
|
||||
|
||||
Reference in New Issue
Block a user