mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-07-12 16:01:35 +08:00
更新国际化支持:调整多个组件中的文本引入,优化语言切换和翻译功能,删除不再使用的类型文件。
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user