更新国际化支持:调整多个组件中的文本引入,优化语言切换和翻译功能,删除不再使用的类型文件。

This commit is contained in:
jxxghp
2025-04-27 20:49:44 +08:00
parent f809c8e538
commit 0396f180ae
21 changed files with 260 additions and 97 deletions

View File

@@ -1,13 +1,18 @@
<script lang="ts" setup>
import { useI18n } from 'vue-i18n'
// 国际化
const { t } = useI18n()
// 已解析的日志列表
const parsedLogs = ref<{ level: string; time: string; program: string; content: string }[]>([])
// 表头
const headers = [
{ title: '级别', value: 'level' },
{ title: '时间', value: 'time' },
{ title: '程序', value: 'program' },
{ title: '内容', value: 'content' },
{ title: t('logging.level'), value: 'level' },
{ title: t('logging.time'), value: 'time' },
{ title: t('logging.program'), value: 'program' },
{ title: t('logging.content'), value: 'content' },
]
// SSE消息对象
@@ -73,7 +78,7 @@ onBeforeUnmount(() => {
</script>
<template>
<LoadingBanner v-if="parsedLogs.length === 0" class="mt-12" text="正在刷新 ..." />
<LoadingBanner v-if="parsedLogs.length === 0" class="mt-12" :text="t('logging.refreshing') + ' ...'" />
<div v-else>
<VTable class="table-rounded" hide-default-footer disable-sort>
<tbody>

View File

@@ -2,6 +2,10 @@
import type { Message } from '@/api/types'
import MessageCard from '@/components/cards/MessageCard.vue'
import api from '@/api'
import { useI18n } from 'vue-i18n'
// 国际化
const { t } = useI18n()
// 定义事件
const emit = defineEmits(['scroll'])
@@ -103,12 +107,12 @@ onBeforeUnmount(() => {
:items="messages"
class="overflow-visible"
@load="loadMessages"
load-more-text="加载更多 ..."
:load-more-text="t('message.loadMore') + ' ...'"
>
<template #loading>
<LoadingBanner />
</template>
<template #empty> 没有更多数据 </template>
<template #empty> {{ t('message.noMoreData') }} </template>
<div>
<div
v-for="(msg, index) in messages"

View File

@@ -1,5 +1,9 @@
<script setup lang="ts">
import api from '@/api'
import { useI18n } from 'vue-i18n'
// 国际化
const { t } = useI18n()
// 定义所有的模块ID、名称列表
const modules = ref<
@@ -41,13 +45,13 @@ async function moduleTest(index: number) {
target.loading = false
if (result.success) {
target.state = 'success'
target.name = `${target.name} - 正常`
target.name = `${target.name} - ${t('moduleTest.normal')}`
} else if (!result.message) {
target.state = undefined
target.name = `${target.name} - 未启用`
target.name = `${target.name} - ${t('moduleTest.disabled')}`
} else {
target.state = 'error'
target.name = `${target.name} - 错误`
target.name = `${target.name} - ${t('moduleTest.error')}`
target.errmsg = result.message
}
} catch (error) {

View File

@@ -4,6 +4,10 @@ import { requiredValidator } from '@/@validators'
import api from '@/api'
import type { Context } from '@/api/types'
import MediaInfoCard from '@/components/cards/MediaInfoCard.vue'
import { useI18n } from 'vue-i18n'
// 国际化
const { t } = useI18n()
// 识别结果
const nameTestResult = ref<Context>()
@@ -18,19 +22,18 @@ const nameTestForm = reactive({
const nameTestLoading = ref(false)
// 识别按钮文本
const nameTestText = ref('识别')
const nameTestText = ref(t('nameTest.recognize'))
// 是否显示结果
const showResult = ref(false)
// 调用API识别
async function nameTest() {
if (!nameTestForm.title)
return
if (!nameTestForm.title) return
try {
nameTestLoading.value = true
nameTestText.value = '识别中...'
nameTestText.value = t('nameTest.recognizing')
showResult.value = false
nameTestResult.value = await api.get('media/recognize', {
params: {
@@ -39,10 +42,9 @@ async function nameTest() {
},
})
nameTestLoading.value = false
nameTestText.value = '重新识别'
nameTestText.value = t('nameTest.recognizeAgain')
showResult.value = true
}
catch (error) {
} catch (error) {
console.error(error)
}
}
@@ -52,30 +54,15 @@ async function nameTest() {
<VForm @submit.prevent="() => {}">
<VRow class="pt-2">
<VCol cols="12">
<VTextField
v-model="nameTestForm.title"
label="标题"
:rules="[requiredValidator]"
/>
<VTextField v-model="nameTestForm.title" :label="t('nameTest.title')" :rules="[requiredValidator]" />
</VCol>
<VCol cols="12">
<VTextarea
v-model="nameTestForm.subtitle"
label="副标题"
rows="2"
auto-grow
/>
<VTextarea v-model="nameTestForm.subtitle" :label="t('nameTest.subtitle')" rows="2" auto-grow />
</VCol>
</VRow>
<VRow>
<VCol
cols="12"
class="text-center"
>
<VBtn
:disabled="nameTestLoading"
@click="nameTest"
>
<VCol cols="12" class="text-center">
<VBtn :disabled="nameTestLoading" @click="nameTest">
<template #prepend>
<VIcon icon="mdi-text-recognition" />
</template>

View File

@@ -8,6 +8,10 @@ import tmdb from '@images/logos/tmdb.png'
import wechat from '@images/logos/wechat.png'
import fanart from '@images/logos/fanart.webp'
import tvdb from '@images/logos/thetvdb.jpeg'
import { useI18n } from 'vue-i18n'
// 国际化
const { t } = useI18n()
interface Status {
OK: string
@@ -46,7 +50,7 @@ const targets = ref<Address[]>([
proxy: true,
status: 'Normal',
time: '',
message: '未测试',
message: t('netTest.notTested'),
btndisable: false,
},
{
@@ -56,7 +60,7 @@ const targets = ref<Address[]>([
proxy: true,
status: 'Normal',
time: '',
message: '未测试',
message: t('netTest.notTested'),
btndisable: false,
},
{
@@ -66,7 +70,7 @@ const targets = ref<Address[]>([
proxy: true,
status: 'Normal',
time: '',
message: '未测试',
message: t('netTest.notTested'),
btndisable: false,
},
{
@@ -76,7 +80,7 @@ const targets = ref<Address[]>([
proxy: true,
status: 'Normal',
time: '',
message: '未测试',
message: t('netTest.notTested'),
btndisable: false,
},
{
@@ -86,7 +90,7 @@ const targets = ref<Address[]>([
proxy: true,
status: 'Normal',
time: '',
message: '未测试',
message: t('netTest.notTested'),
btndisable: false,
},
{
@@ -96,7 +100,7 @@ const targets = ref<Address[]>([
proxy: false,
status: 'Normal',
time: '',
message: '未测试',
message: t('netTest.notTested'),
btndisable: false,
},
{
@@ -106,7 +110,7 @@ const targets = ref<Address[]>([
proxy: false,
status: 'Normal',
time: '',
message: '未测试',
message: t('netTest.notTested'),
btndisable: false,
},
{
@@ -116,7 +120,7 @@ const targets = ref<Address[]>([
proxy: false,
status: 'Normal',
time: '',
message: '未测试',
message: t('netTest.notTested'),
btndisable: false,
},
{
@@ -126,7 +130,7 @@ const targets = ref<Address[]>([
proxy: true,
status: 'Normal',
time: '',
message: '未测试',
message: t('netTest.notTested'),
btndisable: false,
},
{
@@ -136,7 +140,7 @@ const targets = ref<Address[]>([
proxy: true,
status: 'Normal',
time: '',
message: '未测试',
message: t('netTest.notTested'),
btndisable: false,
},
{
@@ -146,7 +150,7 @@ const targets = ref<Address[]>([
proxy: true,
status: 'Normal',
time: '',
message: '未测试',
message: t('netTest.notTested'),
btndisable: false,
},
])
@@ -165,7 +169,7 @@ async function netTest(index: number) {
target.btndisable = true
target.status = 'Doing'
target.message = '测试中...'
target.message = t('netTest.testing')
const result: { [key: string]: any } = await api.get('system/nettest', {
params: {
@@ -176,7 +180,7 @@ async function netTest(index: number) {
if (result.success) {
target.status = 'OK'
target.message = '正常'
target.message = t('netTest.normal')
} else {
target.status = 'Fail'
target.message = result.message

View File

@@ -3,6 +3,10 @@ import { reactive, ref } from 'vue'
import { requiredValidator } from '@/@validators'
import api from '@/api'
import { FilterRuleGroup } from '@/api/types'
import { useI18n } from 'vue-i18n'
// 国际化
const { t } = useI18n()
// 识别结果
const ruleTestResult = ref('')
@@ -18,7 +22,7 @@ const ruleTestForm = reactive({
const ruleTestLoading = ref(false)
// 识别按钮文本
const ruleTestText = ref('测试')
const ruleTestText = ref(t('ruleTest.test'))
// 是否显示结果
const showResult = ref(false)
@@ -47,7 +51,7 @@ async function ruleTest() {
try {
ruleTestLoading.value = true
ruleTestText.value = '正在测试...'
ruleTestText.value = t('ruleTest.testing')
showResult.value = false
const result: { [key: string]: any } = await api.get('system/ruletest', {
params: {
@@ -56,11 +60,11 @@ async function ruleTest() {
rulegroup_name: ruleTestForm.rulegroup,
},
})
if (result.success) ruleTestResult.value = `优先级:${result.data.priority}`
else ruleTestResult.value = '未命中任何优先级规则!'
if (result.success) ruleTestResult.value = t('ruleTest.priority', { value: result.data.priority })
else ruleTestResult.value = t('ruleTest.noPriorityRule')
ruleTestLoading.value = false
ruleTestText.value = '重新测试'
ruleTestText.value = t('ruleTest.testAgain')
showResult.value = true
} catch (error) {
console.error(error)
@@ -76,13 +80,13 @@ onMounted(() => {
<VForm @submit.prevent="() => {}">
<VRow class="pt-2">
<VCol cols="12" md="8">
<VTextField v-model="ruleTestForm.title" label="标题" :rules="[requiredValidator]" />
<VTextField v-model="ruleTestForm.title" :label="t('ruleTest.title')" :rules="[requiredValidator]" />
</VCol>
<VCol cols="12" md="4">
<VSelect v-model="ruleTestForm.rulegroup" label="规则组" :items="filterRuleGroupItems" />
<VSelect v-model="ruleTestForm.rulegroup" :label="t('ruleTest.ruleGroup')" :items="filterRuleGroupItems" />
</VCol>
<VCol cols="12">
<VTextarea v-model="ruleTestForm.subtitle" label="副标题" rows="2" auto-grow />
<VTextarea v-model="ruleTestForm.subtitle" :label="t('ruleTest.subtitle')" rows="2" auto-grow />
</VCol>
</VRow>
<VRow>