<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      <template>
          <div class="multi-lang-input">
              <el-input v-model="props.modelValue" :placeholder="`請輸入 ${currentLangLabel}`" clearable
                  @input="emit('update:modelValue', $event)"> <!-- 新增這行:觸發父組件更新 -->
                  <template #append>
                      <el-button @click="openDialog" circle>
                          <template #icon>
                              <i class="iconfont icon-diqiu1"></i>
                          </template>
                      </el-button>
                  </template>
              </el-input>
      
              <el-dialog v-model="dialogVisible" title="多語言設置" width="600px">
                  <el-form ref="ruleFormRef" label-width="auto">
                      <el-row :gutter="35">
                          <el-col v-for="lang in languages" :key="lang.code" :span="24">
                              <el-form-item :label="lang.label">
                                  <el-input v-model="multiLangValue[lang.code]" :placeholder="`請輸入: ${lang.label}`"
                                      clearable />
                              </el-form-item>
                          </el-col>
                      </el-row>
                  </el-form>
      
                  <template #footer>
                      <el-button @click="aiTranslation">AI翻譯</el-button>
                      <el-button @click="closeDialog">關閉</el-button>
                      <el-button type="primary" @click="confirmDialog">確認修改</el-button>
                  </template>
              </el-dialog>
          </div>
      </template>
      
      <script setup lang="ts">
          import { ref, computed, onMounted, reactive } from 'vue';
          import { useLangStore } from '/@/stores/useLangStore';
          import { Local } from '/@/utils/storage';
          import { getAPI } from '/@/utils/axios-utils';
          import { SysLangTextApi } from '/@/api-services/api';
          import { ElMessage } from 'element-plus';
      
          const ruleFormRef = ref();
      
          const fetchMultiLang = async () => {
              const result = await getAPI(SysLangTextApi).apiSysLangTextListPost({ entityName: props.entityName, entityId: props.entityId, fieldName: props.fieldName, pageSize: 200 }).then(res => res.data.result)
              return result ?? [];
          };
      
      
          const props = defineProps<{
              modelValue : string;
              entityName : string;
              entityId : string;
              fieldName : string;
          }>();
      
          // 定義 emit 事件:支持 update:modelValue(v-model 雙向綁定的固定事件名)
          const emit = defineEmits<{
              (e : 'update:modelValue', value : string) : void;
          }>();
      
          // 全局語言
          const langStore = useLangStore();
          const languages = ref<any>([] as any);
      
          // 當前語言(可根據用戶設置或瀏覽器設置)
          const currentLang = ref('zh_CN');
          const activeLang = ref('zh_CN');
      
          // 是否彈框
          const dialogVisible = ref(false);
      
          // 多語言對象
          const multiLangValue = ref<Record<string, string>>({});
      
          // 當前語言顯示 Label
          const currentLangLabel = computed(() => {
              return (
                  languages.value.find((l : { code : string; }) => l.code === currentLang.value)?.Label || currentLang.value
              );
          });
      
          // 初始化語言
          onMounted(async () => {
              if (langStore.languages.length === 0) {
                  await langStore.loadLanguages();
              }
              const themeConfig = Local.get('themeConfig');
              const globalI18n = themeConfig?.globalI18n;
              if (globalI18n) {
                  const matched = langStore.languages.find(l => l.code === globalI18n);
                  const langCode = matched?.code || 'zh_CN';
                  currentLang.value = langCode;
                  activeLang.value = langCode;
              }
              languages.value = langStore.languages;
      
              if (languages.value.length > 0) {
                  currentLang.value = languages.value[0].code;
                  activeLang.value = languages.value[0].code;
              }
          });
          const aiTranslation = async () => {
              languages.value.forEach(async (element : { code : string | number; value : string | number; }) => {
                  if (element.code == currentLang.value) {
                      return;
                  }
                  multiLangValue.value[element.code] = '正在翻譯...';
                  try {
                      const text = await getAPI(SysLangTextApi).apiSysLangTextAiTranslateTextPost({ originalText: props.modelValue, targetLang: element.value }).then(res => res.data.result);
                      if (text) {
                          multiLangValue.value[element.code] = text;
                      } else {
                          multiLangValue.value[element.code] = '';
                      }
                  } catch (e : any) {
                      multiLangValue.value[element.code] = '';
                      ElMessage.warning(e.message);
                  }
              });
          }
      
          // 打開對話框(點擊按鈕)
          const openDialog = async () => {
              multiLangValue.value = {};
              const res = await fetchMultiLang();
              multiLangValue.value[currentLang.value] = props.modelValue;
              res.forEach((element : { langCode : string | number; content : string; }) => {
                  multiLangValue.value[element.langCode] = element.content;
              });
              dialogVisible.value = true;
              ruleFormRef.value?.resetFields();
          };
      
          // 關閉對話框(只是關閉)
          const closeDialog = () => {
              dialogVisible.value = false;
              multiLangValue.value = {};
              ruleFormRef.value?.resetFields();
          };
      
          // 確認按鈕(更新 + 關閉)
          const confirmDialog = async () => {
              const langItems = Object.entries(multiLangValue.value)
                  .filter(([_, content]) => content && content.trim() !== '')
                  .map(([code, content]) => ({
                      EntityName: props.entityName,
                      EntityId: props.entityId,
                      FieldName: props.fieldName,
                      LangCode: code,
                      Content: content,
                  }));
      
              if (langItems.length === 0) {
                  ElMessage.warning('請輸入至少一條多語言內容!');
                  return;
              }
      
              try {
                  await getAPI(SysLangTextApi).apiSysLangTextBatchSavePost(langItems);
                  ElMessage.success('保存成功!');
                  dialogVisible.value = false;
              } catch (err) {
                  console.error(err);
                  ElMessage.error('保存失敗!');
              }
              dialogVisible.value = false;
              ruleFormRef.value?.resetFields();
          };
      </script>
      
      <style scoped>
          .multi-lang-input {
              width: 100%;
          }
      </style>

      admin.net 菜單要求中文錄入后,不能錄入問題解決

      posted on 2025-08-25 16:45  小石頭的一天  閱讀(9)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日韩精品国产二区三区| 亚洲精品久荜中文字幕| 日韩精品无码人妻一区二区三区| 国产AV国片精品有毛| 精品无码久久久久国产电影| 亚洲欧美日韩第一页| 成人自拍短视频午夜福利| 午夜精品久久久久久久久| 国内自拍av在线免费| 国产精品爽黄69天堂a| 亚洲av成人一区二区| 国产精品一码二码三码| 日韩高清砖码一二区在线| 国产精品中文字幕av| 国产亚洲精品AA片在线播放天| 精品中文字幕人妻一二| 久久综合九色综合欧洲98| 亚洲丰满熟女一区二区蜜桃| 久久精品一本到99热免费| 国产精品久久久久aaaa| 一色屋精品视频在线观看| 精品亚洲国产成人痴汉av| 精品日韩人妻中文字幕| 亚洲国产欧美一区二区好看电影| 天堂va欧美ⅴa亚洲va在线| 国产裸体美女视频全黄| 人人人澡人人肉久久精品| 少妇人妻偷人精品无码视频新浪 | 日韩人妻少妇一区二区三区| 在线a久青草视频在线观看| 强插少妇视频一区二区三区| 亚洲欧美牲交| 欧美自拍另类欧美综合图片区| 欧美成人精品手机在线| 成人国产精品免费网站| 2018年亚洲欧美在线v| 亚洲精品一区二区三区在| 国产精品美女乱子伦高| 国内精品久久久久影视| 亚欧乱色国产精品免费九库| 国内免费视频成人精品|