更新国际化支持:为发现页面、插件卡片列表和下载列表等组件添加多语言文本,提升用户体验

This commit is contained in:
jxxghp
2025-04-29 08:45:59 +08:00
parent b0150f25f6
commit 675cdd5bba
5 changed files with 37 additions and 31 deletions
+4 -4
View File
@@ -149,28 +149,28 @@ onActivated(async () => {
</VHeaderTab> </VHeaderTab>
<VWindow v-model="activeTab" class="mt-5 disable-tab-transition" :touch="false"> <VWindow v-model="activeTab" class="mt-5 disable-tab-transition" :touch="false">
<VWindowItem value="TheMovieDb"> <VWindowItem value="themoviedb">
<transition name="fade-slide" appear> <transition name="fade-slide" appear>
<div> <div>
<TheMovieDbView /> <TheMovieDbView />
</div> </div>
</transition> </transition>
</VWindowItem> </VWindowItem>
<VWindowItem value="豆瓣"> <VWindowItem value="douban">
<transition name="fade-slide" appear> <transition name="fade-slide" appear>
<div> <div>
<DoubanView /> <DoubanView />
</div> </div>
</transition> </transition>
</VWindowItem> </VWindowItem>
<VWindowItem value="Bangumi"> <VWindowItem value="bangumi">
<transition name="fade-slide" appear> <transition name="fade-slide" appear>
<div> <div>
<BangumiView /> <BangumiView />
</div> </div>
</transition> </transition>
</VWindowItem> </VWindowItem>
<VWindowItem v-for="item in extraDiscoverSources" :key="item.mediaid_prefix" :value="item.name"> <VWindowItem v-for="item in extraDiscoverSources" :key="item.mediaid_prefix" :value="item.mediaid_prefix">
<transition name="fade-slide" appear> <transition name="fade-slide" appear>
<div> <div>
<ExtraSourceView :source="item" /> <ExtraSourceView :source="item" />
+21 -18
View File
@@ -497,7 +497,7 @@ useDynamicButton({
<VCardItem> <VCardItem>
<VCardTitle> <VCardTitle>
<VIcon icon="mdi-filter-multiple-outline" class="mr-2" /> <VIcon icon="mdi-filter-multiple-outline" class="mr-2" />
筛选插件 {{ t('plugin.filterPlugins') }}
</VCardTitle> </VCardTitle>
<VDialogCloseBtn @click="filterInstalledPluginDialog = false" /> <VDialogCloseBtn @click="filterInstalledPluginDialog = false" />
</VCardItem> </VCardItem>
@@ -507,13 +507,13 @@ useDynamicButton({
<VCombobox <VCombobox
v-model="installedFilter" v-model="installedFilter"
:items="installedPluginNames" :items="installedPluginNames"
label="名称" :label="t('plugin.name')"
density="comfortable" density="comfortable"
clearable clearable
/> />
</VCol> </VCol>
<VCol cols="12"> <VCol cols="12">
<VSwitch v-model="hasUpdateFilter" label="有新版本" /> <VSwitch v-model="hasUpdateFilter" :label="t('plugin.hasNewVersion')" />
</VCol> </VCol>
</VRow> </VRow>
</VCardText> </VCardText>
@@ -540,7 +540,7 @@ useDynamicButton({
<VCardItem> <VCardItem>
<VCardTitle> <VCardTitle>
<VIcon icon="mdi-filter-multiple-outline" class="mr-2" /> <VIcon icon="mdi-filter-multiple-outline" class="mr-2" />
筛选插件 {{ t('plugin.filterPlugins') }}
</VCardTitle> </VCardTitle>
<VDialogCloseBtn @click="filterMarketPluginDialog = false" /> <VDialogCloseBtn @click="filterMarketPluginDialog = false" />
</VCardItem> </VCardItem>
@@ -549,7 +549,7 @@ useDynamicButton({
<div v-if="isAppMarketLoaded"> <div v-if="isAppMarketLoaded">
<VRow> <VRow>
<VCol cols="12" md="6"> <VCol cols="12" md="6">
<VTextField v-model="filterForm.name" density="comfortable" label="名称" clearable /> <VTextField v-model="filterForm.name" density="comfortable" :label="t('plugin.name')" clearable />
</VCol> </VCol>
<VCol v-if="authorFilterOptions.length > 0" cols="12" md="6"> <VCol v-if="authorFilterOptions.length > 0" cols="12" md="6">
<VSelect <VSelect
@@ -557,7 +557,7 @@ useDynamicButton({
:items="authorFilterOptions" :items="authorFilterOptions"
density="comfortable" density="comfortable"
chips chips
label="作者" :label="t('plugin.author')"
multiple multiple
clearable clearable
/> />
@@ -568,7 +568,7 @@ useDynamicButton({
:items="labelFilterOptions" :items="labelFilterOptions"
density="comfortable" density="comfortable"
chips chips
label="标签" :label="t('plugin.label')"
multiple multiple
clearable clearable
/> />
@@ -579,13 +579,18 @@ useDynamicButton({
:items="repoFilterOptions" :items="repoFilterOptions"
density="comfortable" density="comfortable"
chips chips
label="插件库" :label="t('plugin.repository')"
multiple multiple
clearable clearable
/> />
</VCol> </VCol>
<VCol v-if="sortOptions.length > 0" cols="12" md="6"> <VCol v-if="sortOptions.length > 0" cols="12" md="6">
<VSelect v-model="activeSort" :items="sortOptions" density="comfortable" label="排序" /> <VSelect
v-model="activeSort"
:items="sortOptions"
density="comfortable"
:label="t('plugin.sort')"
/>
</VCol> </VCol>
</VRow> </VRow>
</div> </div>
@@ -609,7 +614,7 @@ useDynamicButton({
<VWindowItem value="installed"> <VWindowItem value="installed">
<transition name="fade-slide" appear> <transition name="fade-slide" appear>
<div> <div>
<VPageContentTitle v-if="installedFilter" :title="`筛选:${installedFilter}`" /> <VPageContentTitle v-if="installedFilter" :title="t('plugin.filter', { name: installedFilter })" />
<LoadingBanner v-if="!isRefreshed" class="mt-12" /> <LoadingBanner v-if="!isRefreshed" class="mt-12" />
<draggable <draggable
v-if="filteredDataList.length > 0" v-if="filteredDataList.length > 0"
@@ -634,11 +639,9 @@ useDynamicButton({
<NoDataFound <NoDataFound
v-if="filteredDataList.length === 0 && isRefreshed" v-if="filteredDataList.length === 0 && isRefreshed"
error-code="404" error-code="404"
error-title="没有数据" :error-title="t('common.noData')"
:error-description=" :error-description="
installedFilter || hasUpdateFilter installedFilter || hasUpdateFilter ? t('plugin.noMatchingContent') : t('plugin.pleaseInstallFromMarket')
? '没有匹配到相关内容请更换筛选条件'
: '请先前往插件市场安装插件'
" "
/> />
</div> </div>
@@ -672,8 +675,8 @@ useDynamicButton({
<NoDataFound <NoDataFound
v-if="displayUninstalledList.length === 0 && isAppMarketLoaded" v-if="displayUninstalledList.length === 0 && isAppMarketLoaded"
error-code="404" error-code="404"
error-title="没有数据" :error-title="t('common.noData')"
error-description="所有可用插件均已安装如有筛选请调整筛选条件" :error-description="t('plugin.allPluginsInstalled')"
/> />
</div> </div>
</transition> </transition>
@@ -717,9 +720,9 @@ useDynamicButton({
<VToolbar flat class="p-0"> <VToolbar flat class="p-0">
<VTextField <VTextField
v-model="keyword" v-model="keyword"
label="搜索插件" :label="t('plugin.searchPlugins')"
single-line single-line
placeholder="插件名称或描述" :placeholder="t('plugin.searchPlaceholder')"
variant="solo" variant="solo"
prepend-inner-icon="mdi-magnify" prepend-inner-icon="mdi-magnify"
flat flat
+6 -2
View File
@@ -5,6 +5,10 @@ import type { DownloadingInfo } from '@/api/types'
import NoDataFound from '@/components/NoDataFound.vue' import NoDataFound from '@/components/NoDataFound.vue'
import DownloadingCard from '@/components/cards/DownloadingCard.vue' import DownloadingCard from '@/components/cards/DownloadingCard.vue'
import { useUserStore } from '@/stores' import { useUserStore } from '@/stores'
import { useI18n } from 'vue-i18n'
// 国际化
const { t } = useI18n()
// 定义输入参数 // 定义输入参数
const props = defineProps<{ const props = defineProps<{
@@ -80,8 +84,8 @@ onUnmounted(() => {
<NoDataFound <NoDataFound
v-if="filteredDataList.length === 0 && isRefreshed" v-if="filteredDataList.length === 0 && isRefreshed"
error-code="404" error-code="404"
error-title="没有任务" :error-title="t('downloading.noTasks')"
error-description="正在下载的任务将会显示在这里" :error-description="t('downloading.tasksWillShowHere')"
/> />
</VPullToRefresh> </VPullToRefresh>
</template> </template>
-4
View File
@@ -2,10 +2,6 @@
import api from '@/api' import api from '@/api'
import { FileItem, StorageConf, TransferDirectoryConf } from '@/api/types' import { FileItem, StorageConf, TransferDirectoryConf } from '@/api/types'
import FileBrowser from '@/components/FileBrowser.vue' import FileBrowser from '@/components/FileBrowser.vue'
import { useI18n } from 'vue-i18n'
// 国际化
const { t } = useI18n()
const endpoints = { const endpoints = {
list: { list: {
+6 -3
View File
@@ -6,6 +6,9 @@ import WorkflowAddEditDialog from '@/components/dialog/WorkflowAddEditDialog.vue
import WorkflowTaskCard from '@/components/cards/WorkflowTaskCard.vue' import WorkflowTaskCard from '@/components/cards/WorkflowTaskCard.vue'
import NoDataFound from '@/components/NoDataFound.vue' import NoDataFound from '@/components/NoDataFound.vue'
import { useDynamicButton } from '@/composables/useDynamicButton' import { useDynamicButton } from '@/composables/useDynamicButton'
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
// APP // APP
const display = useDisplay() const display = useDisplay()
const appMode = inject('pwaMode') && display.mdAndDown.value const appMode = inject('pwaMode') && display.mdAndDown.value
@@ -53,7 +56,7 @@ useDynamicButton({
</script> </script>
<template> <template>
<div> <div>
<VPageContentTitle title="工作流" /> <VPageContentTitle :title="t('navItems.workflow')" />
<LoadingBanner v-if="!isRefreshed" class="mt-12" /> <LoadingBanner v-if="!isRefreshed" class="mt-12" />
<VRow v-if="workflowList.length > 0" class="match-height"> <VRow v-if="workflowList.length > 0" class="match-height">
<VCol cols="12" md="6" lg="4" v-for="item in workflowList" :key="item.id"> <VCol cols="12" md="6" lg="4" v-for="item in workflowList" :key="item.id">
@@ -63,8 +66,8 @@ useDynamicButton({
<NoDataFound <NoDataFound
v-if="workflowList.length === 0 && isRefreshed" v-if="workflowList.length === 0 && isRefreshed"
error-code="404" error-code="404"
error-title="没有工作流" :error-title="t('workflow.noWorkflow')"
error-description="点击添加按钮创建工作流任务" :error-description="t('workflow.clickToAdd')"
/> />
</div> </div>