diff --git a/src/components/dialogs/WorldDialog/WorldDialog.vue b/src/components/dialogs/WorldDialog/WorldDialog.vue index 3a27e93a..4417b4ee 100644 --- a/src/components/dialogs/WorldDialog/WorldDialog.vue +++ b/src/components/dialogs/WorldDialog/WorldDialog.vue @@ -150,12 +150,25 @@ -
+
{{ worldDialog.ref.description }}{{ translatedDescription || worldDialog.ref.description }} +
@@ -737,6 +750,7 @@ Flag, Home, Image, + Languages, LineChart, MessageSquare, Monitor, @@ -777,6 +791,7 @@ userStatusClass } from '../../../shared/utils'; import { + useAdvancedSettingsStore, useAppearanceSettingsStore, useFavoriteStore, useGalleryStore, @@ -803,6 +818,8 @@ import InstanceActionBar from '../../InstanceActionBar.vue'; const modalStore = useModalStore(); + const { translateText } = useAdvancedSettingsStore(); + const { bioLanguage, translationApi, translationApiType } = storeToRefs(useAdvancedSettingsStore()); const NewInstanceDialog = defineAsyncComponent(() => import('../NewInstanceDialog.vue')); const ChangeWorldImageDialog = defineAsyncComponent(() => import('./ChangeWorldImageDialog.vue')); @@ -839,6 +856,8 @@ const newInstanceDialogLocationTag = ref(''); const changeWorldImageDialogVisible = ref(false); const previousImageUrl = ref(''); + const translatedDescription = ref(''); + const isTranslating = ref(false); const isDialogVisible = computed({ get() { @@ -1336,6 +1355,40 @@ D.urlList = worldDialog.value.ref?.urlList ?? []; D.visible = true; } + + async function translateDescription() { + if (isTranslating.value) return; + + const description = worldDialog.value.ref.description; + if (!description) return; + + // Toggle: if already translated, clear to show original + if (translatedDescription.value) { + translatedDescription.value = ''; + return; + } + + isTranslating.value = true; + try { + const translated = await translateText(description, bioLanguage.value); + if (!translated) { + throw new Error('No translation returned'); + } + + translatedDescription.value = translated; + } catch (error) { + console.error('Translation failed:', error); + } finally { + isTranslating.value = false; + } + } + + watch( + () => worldDialog.value.id, + () => { + translatedDescription.value = ''; + } + );