vue:动态加载指定多语言文件

背景:项目中涉及多个国家使用,每个页面都添加了四个国家的多语言,使用绝对路径引入导入所有的多语言的都会进行加载,造成页面加载文件过多
解决方案:动态加载我当前需要使用的多语言文件:

import { createI18n } from 'vue-i18n'
import path from 'path'
// import en from './en-US'
// import cn from './zh-CN'
// import de from './de-DE'
// import fr from './fr-FR'


export const LOCALE_OPTIONS = [
  { label: '中文', value: 'zh-CN' },
  { label: 'English', value: 'en-US' },
  { label: 'German', value: 'de-DE'},
  { label: 'French', value: 'fr-FR'},
]

const defaultLang = (navigator.language === 'en' ? 'en-US' : navigator.language) || 'zh-CN'
const defaultLocale = localStorage.getItem('arco-locale') || defaultLang

const obj = {}
const getLang = async(defaultLocale:any)=>{
  const files = import.meta.glob('./*')
  // let modules:any = null
  for (const key in files) {
      const localKey = key.replace(/(\.\/)|(\.ts)/g, '')
      if(localKey===defaultLocale){
        files[key]().then((res:any)=>{
          obj[defaultLocale]= res.default
        })
      }
  }

getLang(defaultLocale)


const i18n = createI18n({
  legacy: false,
  locale: defaultLocale,
  fallbackLocale: 'en-US',
  messages: obj
})


// const i18n = createI18n({
//   legacy: false,
//   locale: defaultLocale,
//   fallbackLocale: 'en-US',
//   messages: {
//     'en-US': en,
//     'zh-CN': cn,
//     'de-DE': de,
//     'fr-FR': fr,
//   }
// })

export default i18n

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是实现这个功能的具体代码: 1. 在 Vue 组件中引入 Element-UI 中的 Upload 组件,并设置属性 action 为上传图片的接口地址。 ```html <template> <div> <el-upload class="upload-demo" :action="uploadUrl" :on-success="uploadSuccess" :file-list="fileList" multiple> <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> </div> </template> <script> import { ElUpload, ElButton } from 'element-ui'; export default { components: { ElUpload, ElButton, }, data() { return { uploadUrl: 'your-upload-api-url', fileList: [], }; }, methods: { uploadSuccess(response, file, fileList) { // 上传成功后的处理逻辑 }, }, }; </script> ``` 2. 在接口中,将上传的图片保存到指定文件夹中,并将图片的文件名设置为书籍 id。 这里的具体实现逻辑会因为后端语言和框架而有所不同,我这里提供一种伪代码: ```php <?php if ($_FILES['file']) { // 获取上传的文件 $file = $_FILES['file']; // 获取书籍 id $bookId = $_POST['bookId']; // 设置文件名为书籍 id $filename = $bookId . '.jpg'; // 保存文件指定文件夹 move_uploaded_file($file['tmp_name'], '/path/to/your/uploads/folder/' . $filename); // 返回上传成功的信息 echo json_encode([ 'code' => 0, 'msg' => '上传成功', 'data' => [ 'url' => '/path/to/your/uploads/folder/' . $filename, ], ]); } ``` 3. 在 Vue 组件中使用 v-for 遍历书籍列表,并使用 v-bind:src 绑定书籍对应的图片地址。 ```html <template> <div> <div v-for="book in books" :key="book.id"> <img :src="require(`@/assets/${book.id}.jpg`)"> <p>{{ book.title }}</p> </div> </div> </template> <script> export default { data() { return { books: [ { id: 1, title: 'Book 1', }, { id: 2, title: 'Book 2', }, // ... ], }; }, }; </script> ``` 在上面的代码中,books 是一个包含了多个书籍对象的数组,每个书籍对象都有一个 id 和 title 属性。 4. 在绑定图片地址时,使用 require 动态加载图片。 ```html <img :src="require(`@/assets/${book.id}.jpg`)"> ``` 这里使用了 require 动态加载图片,注意路径中的反引号和 ${book.id} 的使用,这样就可以根据书籍 id 动态加载多个 assets 中以书籍 id 命名且与书籍 id 对应的图片了。 希望这个代码能够帮到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值