<script setup lang="ts">
import { traduction } from '@/utils/language';
import { computed, onUnmounted, reactive, ref } from 'vue';
import useStore from '@/stores';
import { configLanguage, getLanguage } from '@/services/language-service';
import { IResponse } from '@/model/base-interface';
import { langOptions } from '@/utils/language';
import GlobalStoreService from '@/services/gloabal-store-service';
import Dialog from '@/components/Dialog/Dialog.vue';
import { getStoreData } from '@/utils/composition';
const globService = new GlobalStoreService();
const store = useStore();
const dialogRef = ref();
let resolveFunc: any = null;
let rejectFunc: any = null;
let timeStamp: any = null;
const isSystemLocked = computed(() => {
return getStoreData('glob', 'systemLocked');
});
const langSupported = computed(() => getStoreData('loct', 'langSupported'));
const supportedLangKey = Object.keys(langSupported.value).filter(item => langSupported.value[item]);
const columns = ref([
{
label: 'TABLE_TITLE_NUM',
prop: 'num'
},
{
label: 'LANGUAGE_CODE',
prop: 'locale'
},
{
label: 'LANGUAGE_NAME',
prop: 'name'
},
{
label: 'LANGUAGE_OPERATION',
prop: 'opderator'
}
]);
const dialogConfig = reactive({
title: traduction('COMMON_CONFIRM'),
content: traduction('COMMON_ASK_OK')
});
const data = reactive(
[
{ locale: 'zh', label: '简体中文', enabled: true, show: false, id: 'switch_zh' },
{ locale: 'en', label: 'English', enabled: true, show: false, id: 'switch_en' },
{ locale: 'ja', label: '日本語', enabled: false, show: true, id: 'switch_ja' },
{ locale: 'fr', label: 'Français', enabled: false, show: true, id: 'switch_fr' },
{ locale: 'ru', label: 'Русский', enabled: false, show: true, id: 'switch_ru' }
].filter(item => supportedLangKey.includes(item.locale))
);
let curRow = ref(data[0]);
init();
function init(isReset?: boolean) {
globService.loading(true);
getLanguage()
.then((res: IResponse) => {
const langSet = res.data.LanguageSet;
if (langSet) {
langSet.split(',').forEach((item: string) => {
data.forEach(langItem => {
if (langItem.locale === item) {
langItem.enabled = true;
}
});
});
}
if (isReset) {
resetLangOptions(langSet);
}
})
.finally(() => {
globService.loading(false);
});
}
function resetLangOptions(langSet: string) {
const options = langOptions;
const tempArr: any[] = [];
options.forEach(item => {
if (langSet.indexOf(item.id) > -1) {
tempArr.push(item);
}
});
store.state.glob.setGlobState({ type: 'langOptions', value: tempArr });
}
function recordRow(row: any) {
curRow.value = row;
}
function confirmSwitch() {
dialogRef.value.show();
return new Promise((resolve, reject) => {
resolveFunc = resolve;
rejectFunc = reject;
});
}
function switchLanguage(reason: boolean) {
dialogRef.value.hide();
if (isSystemLocked.value) {
return;
}
if (reason) {
globService.loading(true);
configLanguage(curRow.value.locale, !curRow.value.enabled)
.then(
() => {
resolveFunc(true);
store.state.event.setEventState({
type: 'alertMessage',
value: { type: 'success', message: traduction('COMMON_SUCCESS') }
});
const locale = store.state.loct.locale;
if (locale === curRow.value.locale) {
timeStamp = setTimeout(() => {
self.location.reload();
}, 1000);
} else {
init(true);
}
},
() => {
rejectFunc(new Error());
store.state.event.setEventState({
type: 'alertMessage',
value: { type: 'error', message: traduction('COMMON_FAILED') }
});
}
)
.finally(() => {
globService.loading(false);
});
}
onUnmounted(() => {
if (timeStamp) {
timeStamp = clearTimeout(timeStamp);
}
});
}
</script>
<template>
<div class="root-container">
<h3>{{ traduction('LANGUAGE_INFO') }}</h3>
<el-table v-addId.table="'langTable'" :data="data" resizable border>
<el-table-column :prop="'num'" :label="$t(columns[0].label)" :resizable="true">
<template #default="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column :prop="'locale'" :label="$t(columns[1].label)" :resizable="true">
<template #default="scope">
<span class="locale-code">{{ scope.row.locale }}</span>
</template>
</el-table-column>
<el-table-column :prop="'name'" :label="$t(columns[2].label)" :resizable="true">
<template #default="scope">
<span class="locale-name">{{ scope.row.label }}</span>
</template>
</el-table-column>
<el-table-column :prop="'opderator'" :label="$t(columns[3].label)">
<template #default="scope">
<el-switch
v-if="scope.row.show"
:id="scope.row.id"
v-model="scope.row.enabled"
:disabled="isSystemLocked"
:before-change="confirmSwitch"
@click="recordRow(scope.row)"
></el-switch>
</template>
</el-table-column>
</el-table>
</div>
<Dialog ref="dialogRef" :config="dialogConfig" @close="switchLanguage" />
</template>
<style lang="scss" scoped>
.root-container {
margin-right: 24px;
padding: 16px;
background-color: var(--o-bg-color-base);
border-radius: 4px;
height: 100%;
}
h3 {
font-size: 16px;
line-height: 24px;
margin-bottom: 16px;
}
:deep(.el-table__cell) {
border-right: none;
}
</style>