目录
  • 配置locales
    • 实现 getlangs.js

            前言

            最近有人在吐槽项目使用 vue3 之后,出现一堆问题,填坑困难,甚至是开发中才发现某些第三方库没有推出 vue3 的版本,因此大发吐槽,强烈建议不使用 vue3。 

            做好技术预研和兼容性调查是开发前的工作之一,特别是对于新技术或者大版本的更新,除非你有十个胆,否则不要在预研不充分的情况下,在正式项目中使用。

            最近在将自己的某个 vue3 的项目接入国际化配置,整体的过程跟 vue2 并没有太大的区别,在此做下技术经验分享。

            安装vue-i18n

            npm i vue-i18n --save
            
            

            这里使用的是 vue-i18n 来实现国际化多语言切换,i18n 这个名字其实是由英文单词 internationalization 的首尾两个字母和中间的字符数 18 组成,意为「国际化」。

            配置locales

            在项目 src 中新建 locales 文件夹,在里面新建 language 文件夹,用于存储各个语言的文本配置。language 中新建 en 和 zh-cn 文件夹,并对应的新建 index.js,填充以下内容:

            // src/locales/language/zh_cn/index.js
            
            export default {
            
                title: "中文标题",
            
            }
            
            // src/locales/language/en/index.js
            
            export default {
            
                title: "english title",
            
            }
            

            实现 getlangs.js

            在 locales 中新建 getlangs.js 文件,用于获取 language 文件夹中的语言包并暴露出去。
            这里用到了 lodash-es 插件,你需要安装该插件:

            npm i lodash-es --save
            
            

            具体代码如下:

            import { set } from 'lodash-es'
            
            const modules = import.meta.globeager('./language/**/*.js')
            
            function getlanguages(langs, prefix = 'lang') {
            
              const obj = {}
            
              object.keys(langs).foreach((key) => {
            
                const mod = langs[key].default
            
                let k = key.replace(`./${prefix}/`, '').replace(/^\.\//, '')
            
                const lastindex = k.lastindexof('.')
            
                k = k.substring(0, lastindex)
            
                const keylist = k.split('/')
            
                const lang = keylist.shift()
            
                const objkey = keylist.join('.')
            
                if (lang) {
            
                  set(obj, lang, obj[lang] || {})
            
                  set(obj[lang], objkey, mod)
            
                }
            
              })
            
              return obj
            
            }
            
            const { language } = getlanguages(modules)
            
            export default language
            

            创建 i18n 实例

            接下来需要创建 i18n 实例,并挂载到 vue。在 locales 中新建 i18n.js。代码如下:

            import { createi18n } from 'vue-i18n'
            
            import messages from './getlangs'
            
            export default createi18n({
            
              legacy: false,
            
              locale: window.localstorage.getitem("lang") || 'zh_cn',
            
              messages,
            
            })
            

            可以看到这里默认的语言配置是从浏览器中 localstorage 中获取的,没有则为 “zh-cn”。在切换语言后,需要将当前语言存起来,不然用户刷新,可就又回到默认语言配置了。
            在 main.js 中引入:

            import i18n from './locales/i18n'
            
            const app = createapp(app)
            
            app.use(i18n).mount("#app")
            

            模板中使用

            这里使用 composition api 的方式引入并使用,在模板对应的位置中,使用 t 函数获取当前语言配置下的展示文本,函数接收语言配置文件和属性的路径,通过点语法连接,如果找不到,则会将整个函数名称以字符形式展示。

            <template>
            
            <p>{{t(`index.title`)}}</p>
            
            </template>
            
            import { usei18n } from "vue-i18n";
            
            export default {
            
                setup() {
            
                    const { t } = usei18n();
            
                    return { t }
            
                }
            
            }
            
            

            语言切换

            常用的语言切换方式有两种,一种是将当前语言配置放到 url 上,切换语言即跳转到对应的路由,再展示当前语言下的对应文本。

            第二种是无刷新/跳转的切换,将当前语言存储到本地缓存中,通过修改 vue-i18n 的 locale 的值切换语言。
            这里推荐使用第二种,切换语言不需要刷新页面或者采用跳转的形式。

            <template>
            
              <a
            
                href="javascript:;"
            
                @click="setlocals(locale === 'zh_cn' ? 'en' : 'zh_cn')"
            
              >
            
                {{ locale === 'zh_cn' ? '英' : '中' }}
            
              </a>
            
            </template>
            
            <script>
            
            import { usei18n } from "vue-i18n";
            
            import { ref } from "@vue/reactivity";
            
            export default {
            
            setup() {
            
                const { t, locale } = usei18n();
            
                const getlocals = () => window.localstorage.getitem("lang") || locale.value;
            
                const currentlocale = ref(getlocals());
            
                const setlocals = (lang = "") => {
            
                  locale.value = lang;
            
                  window.localstorage.setitem("lang", lang);
            
                };
            
                if (!window.localstorage.getitem("lang")) {
            
                  setlocals(currentlocale.value);
            
                } else {
            
                  if (currentlocale.value !== locale.value) {
            
                    setlocals(currentlocale.value);
            
                  }
            
                }
            
                return {
            
                  t,
            
                  locale,
            
                  setlocals,
            
                };
            
              },
            
            };
            </script>
            

            初始化的时候,先从本地获取当前语言,如果没有则获取默认的语言配置,切换语言时,不仅需要修改 locale 的值,还需要将当前语言存一份到本地缓存中。

            关于切换后需要刷新后才生效

            上面的例子,在模板中直接使用 t 函数渲染的文本,在语言切换时是无需刷新即可更新视图语言的,但如果是在 setup 中直接使用 t 函数,则不会立即更新,需要刷新后才生效。

            这里不推荐在模板以外的地方使用 t 函数,如有必要,可以在组件中定义多语言文本,在模板中通过键值对的形式去访问。

            切换语言触发其他组件更新

            在一些场景中,页面展示的文本是通过外部获取的,无法直接由语言切换触发更新,需要实现类似兄弟组件的广播效果。

            在 vue3 中取消了 global bug 的使用,进而可以用 mitt 等插件代替。

            总结

            到此这篇关于利用vite2和vue3实现网站国际化的文章就介绍到这了,更多相关vite2和vue3网站国际化内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!