Vue+Element-UI 多语言化

VUE+Element-UI 多语言化


写在前面

应项目需要同时感谢项目组前辈给我这次机会去实践 vue+element-ui 本地化的任务 ,本着分享的原则将过程记录下来

VUE及Element-UI信息

网站快速成型工具
Element-UI

渐进式JavaScript 框架
Vue.js

准备

在查阅了一些资料之后发现所谓本地化就是将相应的menu、tips、message做成变量,同时将这些变量对应的值记录在相应的文件中,由一个全局变量做控制开关,在合适的时候载入相应的文件以实现本地化。

vue本地化 相关资料比较多的就是集成vue-i18n,所以这里也是选用了vue-i18n

本地化记录key-value 的文件方式主要为.json 文件和.js文件,这里选用了js文件的方式

过程

  • vue-cli 搭建脚手架
  • 引入 vue-i18n

    在vscode 的集成终端窗口执行
   npm install --save vue-i18n
  • 在main.js中引用
   import VueI18n from 'vue-i18n'
   import locale from 'element-ui/lib/locale'
   import enLocale from 'element-ui/lib/locale/lang/en'
   import zhLocale from 'element-ui/lib/locale/lang/zh-CN'
   import twLocale from 'element-ui/lib/locale/lang/zh-TW'
   ...
   Vue.use(VueI18n)
   Vue.use(ElementUI, { zhLocale });
   ...
   // InitLanguage  这里引入了vue-cookie,是为了将用户选择的语言存储到Cookie里,在以后访问站点不需要重新选择语言
   function InitLanguage() {
    return Vue.cookie.get('PCDefaultLanguage') == null ? 'zh-CN' : Vue.cookie.get('DefaultLanguage');
   }

   const i18n = new VueI18n({
     locale:  InitLanguage(), // 语言标识,默认汉语,先去cookie查找,如果存在并有效,cookie值即为默认语言类型;否则默认为中文简体
     messages: {
       'en-US': Object.assign(require("../static/lang/en"),enLocale),
       'zh-CN': Object.assign(require("../static/lang/zh-CN"),zhLocale),
       'zh-TW': Object.assign(require("../static/lang/zh-TW"),twLocale)
     }
   });
   locale.i18n((key, value) => i18n.t(key, value));//为了之后将element-ui组件本地化
   ...
   new Vue({
       el: '#app',
       router,
       i18n,//将VueI18n挂载到vue实例上
       store: store,
       components: { App },
       template: '<App/>'
   })
  • 保存key-value 的文件
    • 项目结构
      1337728-20180629104942988-1017733149.png
    • en.js
           module.exports = {
             localization: {
              selectlanguage: "Language",
              type: "English",
              hello: 'Hello',
              login: 'Login',
              welcome: "Welcome"
              }
            }
    • zh-CN.js
          module.exports = {
            localization: {
             selectlanguage: "选择语言",
             type: "中文简体",
             hello: '你好',
             login: '登录',
             welcome: "欢迎"
            }
          }
    • zh-TW.js
          module.exports = {
             localization: {
              selectlanguage: "選擇語言",
              type: "中文繁體",
              hello: '你好',
              login: '登錄',
              welcome: "歡迎"
             }
          }
  • 这里通过下拉框更改语言类型

    1337728-20180629104959027-1099677454.png

App.vue

<el-select v-model="value"  @change="switchLanguage(value)" class="el-select">
     <el-option
            v-for="item in language"
            :key="item.value"
            :label="item.label"
            :value="item.value">
     </el-option>
</el-select>

App.vue

  <script>
    export default {
    data() {
        return {
        value: this.$i18n.locale, //为了把下拉框的默认值和全局变量的值一致,以此实现载入页面时显示的语言和数据配置一致
        language: [
            {
            value: "en-US",
            label: "English"
            },
            {
            value: "zh-CN",
            label: "中文简体"
            },
            {
            value: "zh-TW",
            label: "中文繁體"
            }
        ]
        };
    },
    methods: {
        switchLanguage(value) {
        if (this.value == "zh-CN") {
            this.$i18n.locale = "zh-CN";
        } else if (this.value == "en-US") {
            this.$i18n.locale = "en-US";
        } else if (this.value == "zh-TW") {
            this.$i18n.locale = "zh-TW";
        }
        var _this = this;        //在选择了显示的语言后,将配置保存到Cookie中
        this.$cookie.set(                     
            "DefaultLanguage",                
            (_this.value),        //
            {                     //
            expires: "30m"        //默认cookie有效时间为30分钟
            }                    
        );                     
        }
    }
  </script>
  • 使用
    在定义变量的地方用这种方式写,一定要用$t()的方式
   <div> {{ this.$t("localization.hello") }}</div>

在这因为没有掌握Vue,遇到个小问题就是element 的标签 默认属性 不能绑定变量

    //会报错
   <el-form-item label="this.$t('localization.eamilName')" class="vote-query-email">
  </el-form-item>

需要在属性(lable)前加上 :就可以绑定变量了

  <el-form-item :label="this.$t('localization.eamilName')" class="vote-query-email">
  </el-form-item>

END

转载于:https://www.cnblogs.com/Mxy-cnblog/p/9242305.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前言 使用之前请安装:精易Web浏览器支持库(miniblink内核)-正式版发布 1.3.1231 本模块的更多介绍请看帖子:精易web浏览器填表模块 新增命令 命令注释 el_img_GetImageData //图片框_取图片xx,程序内部不会判断是否为图片,请注意,m_WebView为0将返回{}。 el_img_GetCanvasData //图片框_取Canvas图片xx,程序内部不会判断是否为图片,请注意,m_WebView为0将返回{}。 web_enumJs //网页_枚举Js文件,m_WebView为0将返回假。 web_enumCss //网页_枚举Css文件,m_WebView为0将返回假。 web_enumEmbed //网页_枚举媒体文件,m_WebView为0将返回假。 web_RunJsByFrame //网页_指定框架运行JS el_form_Getaction //表单_取地址,请注意!!程序内部将不会判断是否为表单,m_WebView为0将返回空。 el_form_Setaction //表单_置地址,请注意!!程序内部将不会判断是否为表单,m_WebView为0将返回假。 el_table_Getrows //表格_取行数,请注意!!程序内部将不会判断是否为表格,m_WebView为0将返回-1。 el_table_Getcells //表格_取列数,请注意!!程序内部将不会判断是否为表格,m_WebView为0将返回-1。 el_table_GetText //表格_取文本,请注意!!程序内部将不会判断是否为表格,m_WebView为0将返回空。 el_table_GetinnerHTML //表格_取源码,请注意!!程序内部将不会判断是否为表格,m_WebView为0将返回空。 el_GetID //元素_取ID,m_WebView为0将返回空。 el_GettagName //元素_取tagName,m_WebView为0将返回空。 el_GetName //元素_取tagName,m_WebView为0将返回空。 el_GetinnerHTML //元素_取innerHTML,m_WebView为0将返回空。 el_GetinnerText //元素_取innerText,m_WebView为0将返回空。 el_GetouterText //元素_取outerText,m_WebView为0将返回空。 el_GetclassName //元素_取className,m_WebView为0将返回空。 el_GetouterHTML //元素_取outerHTML,m_WebView为0将返回空。 el_SetinnerHTML //元素_置innerHTML,m_WebView为0将返回假。 el_SetinnerText //元素_置innerText,m_WebView为0将返回假。 el_SetouterText //元素_置outerText,m_WebView为0将返回假。 el_SetouterHTML //元素_置outerHTML,m_WebView为0将返回假。 el_EnterElement //元素_进入填表元素,使用本命令后,可以直接用#way_EnterElement来使用填表命令!!! el_OutElement //元素_退出元素,使用了“el_EnterElement”后退出填表元素的方法 el_GetNowFrameId //元素_取当前框架Id,专用于取“#way_coordinates”方法取到的元素的所属框架,失败返回-1 el_disabled //元素_禁止 更多说明: 本程序内部完全使用Js来进行填表。 更多的使用方法请参考模块注释(模块命令注释已经十分完善!!) 本程序内部已经集合“getElementById,getElementsByClassName,getElementsByTagName,getElementsByName,querySelectorAll,XPath,All,expression,coordinates”等多种选择器定位元素,新增:“way_coordinates”,“way_EnterElement”定位元素! “way_EnterElement”的使用集成到了测试程序中: 新增:【原创】精易web填表模块插件包浏览器 应易友所需,增加中文类 点此查看其它版本
好的,以下是实现这个功能的具体代码: 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 对应的图片了。 希望这个代码能够帮到您!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值