Vue3+Vue-i18n+I18N ALLY+VSCODE 自动翻译多国语言

这篇具有很好参考价值的文章主要介绍了Vue3+Vue-i18n+I18N ALLY+VSCODE 自动翻译多国语言。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ps: 效果图放前面,符合的往下看,不符合的出门右转,希望多多点赞评论支持。

Vue3+Vue-i18n+I18N ALLY+VSCODE 自动翻译多国语言,Vue3,TS,vue.js,javascript,前端

  • 三种语言模式,分别是中文、英文、日文
    Vue3+Vue-i18n+I18N ALLY+VSCODE 自动翻译多国语言,Vue3,TS,vue.js,javascript,前端
  • 批量翻译
    Vue3+Vue-i18n+I18N ALLY+VSCODE 自动翻译多国语言,Vue3,TS,vue.js,javascript,前端
  • 最后的结果
    Vue3+Vue-i18n+I18N ALLY+VSCODE 自动翻译多国语言,Vue3,TS,vue.js,javascript,前端

配置vue-i18n

1、下载安装vue-i18n,@9以上的版本。
2、创建对应文件夹
Vue3+Vue-i18n+I18N ALLY+VSCODE 自动翻译多国语言,Vue3,TS,vue.js,javascript,前端
3、对应文件夹中代码如下

helper.ts
import type { LocaleType } from '@/types/i18n';
import { set } from 'lodash-es';

export const loadLocalePool: LocaleType[] = [];

export function setHtmlPageLang(locale: LocaleType) {
    document.querySelector('html')?.setAttribute('lang', locale);
}

export function setLoadLocalePool(cb: (loadLocalePool: LocaleType[]) => void) {
    cb(loadLocalePool);
}
export function genMessage(langs: Record<string, Record<string, any>>, prefix = 'lang') {
    const obj: Recordable = {};
    
    Object.keys(langs).forEach((key) => {
        const langFileModule = langs[key].default;
        let fileName = key.replace(`./${prefix}/`, '').replace(/^\.\//, '');
        const lastIndex = fileName.lastIndexOf('.');
        fileName = fileName.substring(0, lastIndex);
        const keyList = fileName.split('/');
        const moduleName = keyList.shift();
        const objKey = keyList.join('.');

        if (moduleName) {
            if (objKey) {
                set(obj, moduleName, obj[moduleName] || {});
                set(obj[moduleName], objKey, langFileModule);
            } else {
                set(obj, moduleName, langFileModule || {});
            }
        }
    });
    return obj;
}
setupI18n.ts
import type { App } from 'vue';
import type { I18n, I18nOptions } from 'vue-i18n';
import { createI18n } from 'vue-i18n';
import { setHtmlPageLang, setLoadLocalePool } from './helper';
import { useLocaleStore } from '@/store/modules/locale'

export let i18n: ReturnType<typeof createI18n>;
async function createI18nOptions(): Promise<I18nOptions> {
    const store = useLocaleStore()
    const locale = store.getLocalInfo
    const defaultLocal = await import(`./lang/${locale}.ts`);
    const message = defaultLocal.default?.message ?? {};

    setHtmlPageLang(locale);
    setLoadLocalePool((loadLocalePool) => {
        loadLocalePool.push(locale);
    });
    return {
        legacy: false, //false:新版API 
        locale,//当前语言
        fallbackLocale: 'zh_CN', //找不到语言环境,回滚到中文
        messages: {
            [locale]: message, //对应的语言环境具体值
        },
        availableLocales: ['zh_CN', 'en'],//包含的语言种类
        sync: true,  //是否从全局继承语言环境
        silentTranslationWarn: true, //true:关闭翻译警告
        missingWarn: false,//是否显示缺失翻译的警告信息
        silentFallbackWarn: true,//忽略回退警告
    };
}
export async function setupI18n(app: App) {
    const options = await createI18nOptions();
    i18n = createI18n(options) as I18n;
    app.use(i18n);
}
useLocale.ts
import type { LocaleType } from '@/types/i18n';
import { i18n } from './setupI18n';
import { unref, computed } from 'vue';
import { useLocaleStore } from '@/store/modules/locale'
import { loadLocalePool, setHtmlPageLang } from './helper';
interface LangModule {
    message: Recordable;
    dateLocale: Recordable;
    dateLocaleName: string;
}

function setI18nLanguage(locale: LocaleType) {
    const store = useLocaleStore()
    if (i18n.mode === 'legacy') {
        i18n.global.locale = locale;
    } else {
        (i18n.global.locale as any).value = locale;
    }
    store.setLocaleInfo({ locale })
    setHtmlPageLang(locale);
}

export function useLocale() {
    const store = useLocaleStore()
    const getLocale = computed(() => store.getLocalInfo);
    const getShowLocalePicker = computed(() => store.getShowPicker);
    const getAntdLocale = computed((): any => {
        return i18n.global.getLocaleMessage(store.getAntdLocale);
    });
    async function changeLocale(locale: LocaleType) {
        const globalI18n = i18n.global;
        const currentLocale = unref(globalI18n.locale);
        if (currentLocale === locale) {
            return locale;
        }
        if (loadLocalePool.includes(locale)) {
            setI18nLanguage(locale);
            return locale;
        }
        const langModule = ((await import(`./lang/${locale}.ts`)) as any).default as LangModule;
        if (!langModule) return;
        const { message } = langModule;

        globalI18n.setLocaleMessage(locale, message);
        loadLocalePool.push(locale);
        setI18nLanguage(locale);
        return locale;
    }
    return {
        getLocale,
        getShowLocalePicker,
        changeLocale,
        getAntdLocale,
    };
}

4、创建全局当前语言类型值,如果需要刷新保持,还应将值保存到localStorage中。

locale.ts

import { defineStore } from 'pinia';
import type { LocaleType } from '@/types/i18n'
type LocaleState = {
    localInfo: LocaleType,
    availableLocales: LocaleType[],
    showPicker: boolean,
    antdLocale: LocaleType
}
type SetLocalInfoOpt = {
    locale: LocaleType,
}
export const useLocaleStore = defineStore({
    id: 'app-locale',
    state: (): LocaleState => ({
        localInfo: 'zh_CN',
        showPicker: false,
        availableLocales: [],
        antdLocale: 'zh_CN'
    }),
    getters: {
        getLocalInfo(): LocaleType {
            return this.localInfo
        },
        getShowPicker(): boolean {
            return this.showPicker
        },
        getAntdLocale(): LocaleType{
            return this.antdLocale
        }
    },
    actions: {
        setLocaleInfo({ locale }: SetLocalInfoOpt) {
            this.localInfo = locale
        },
    }
})

5、lang文件夹下创建对应翻译的入口en.ts\ja.ts\zh_CH.ts

import { genMessage } from '../helper';
import antdLocale from 'ant-design-vue/es/locale/en_US';//更改对应的类型

const modules:Record<string, Record<string, any>> = import.meta.globEager('./en/**/*.json'); //更改对应的类型
export default {
  message: {
    ...genMessage(modules, 'en'),//更改对应的类型
    antdLocale,
  },
  dateLocale: null,
  dateLocaleName: 'en',//更改对应的类型
};

5、main.ts中引入

import { setupI18n } from '@/locales/setupI18n';
await setupI18n(app);

6、页面中引入

<template>
    <p>
        <a-button @click="onChange('zh_CN')">中文</a-button>
        <a-button @click="onChange('en')">英文</a-button>
        <a-button @click="onChange('ja')">日文</a-button>
    </p>
    <div>{{ t('common.a') }}</div>
    <div>{{ t('common.b') }}</div>
    <div>{{ t('common.c') }}</div>
    <div>{{ t('common.d') }}</div>
    <div>{{ t('common.e') }}</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { useI18n } from '@/hooks/web/useI18n';
import type { LocaleType } from '@/types/i18n';
import { useLocale } from '@/locales/useLocale';
export default defineComponent({
    setup() {

        const { changeLocale } = useLocale();
        const { t } = useI18n();
        async function onChange(local: LocaleType) {
            await changeLocale(local as LocaleType);
        }
        return {
            t,
            onChange
        }
    }
})
</script>
<style lang="less"></style>

至此,页面上的语言切换可以了。接下来是如何自动翻译

VSCODE插件I18n Ally

1、插件市场下载
Vue3+Vue-i18n+I18N ALLY+VSCODE 自动翻译多国语言,Vue3,TS,vue.js,javascript,前端
2、在.vscode下新建settings.json文件
Vue3+Vue-i18n+I18N ALLY+VSCODE 自动翻译多国语言,Vue3,TS,vue.js,javascript,前端
3、在配置文件中新增关于i18n的设置。

{
    "i18n-ally.localesPaths": [
        "src/locales/lang"
    ], // 翻译文件路径 (自动生成) 相对于项目根目录的语言环境目录路径
    "i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}",
    "i18n-ally.enabledParsers": [
        "json"
    ],
    "i18n-ally.sourceLanguage": "zh-CN",
    "i18n-ally.displayLanguage": "zh-CN",
    "i18n-ally.enabledFrameworks": [
        "vue",
        "react"
    ],
    // 如下须要手动配置
    "i18n-ally.keystyle": "nested", // 翻译路径格式 (翻译后变量格式 nested:嵌套式  flat:扁平式)
    "i18n-ally.sortKeys": true,
    "i18n-ally.namespace": true,
    "i18n-ally.translate.engines": [
        "google",
        "deepl"
    ], // 翻译器
    "i18n-ally.extract.keygenStyle": "camelCase", // 翻译字段命名样式采用驼峰
}

备注“i18n-ally.localesPaths”这个是你翻译文件的路径、“i18n-ally.translate.engines”翻译器,需要科学上网(fq)。

4、配置成功后,鼠标移动上去会显示当前翻译结果,失败的可以关闭编译器重启。
Vue3+Vue-i18n+I18N ALLY+VSCODE 自动翻译多国语言,Vue3,TS,vue.js,javascript,前端
5、批量翻译,点击编译器左下角翻译的图标,然后再翻译进度中找到,未翻译的语言。空值右边对应有个地球图标。单击翻译即可。

Vue3+Vue-i18n+I18N ALLY+VSCODE 自动翻译多国语言,Vue3,TS,vue.js,javascript,前端

有些人写的翻译是json文件有的是TS文件,注意配置的时候和lang文件夹下面的入口文件
不要写错了。
写在最后,有问题可评论,可私聊。欢迎讨论。文章来源地址https://www.toymoban.com/news/detail-696951.html

到了这里,关于Vue3+Vue-i18n+I18N ALLY+VSCODE 自动翻译多国语言的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue-i18n 实现国际化,支持切换不同语言

    需求:后台管理系统,可以实现语言切换 实现过程:用的i18n来实现的语言切换,网上能看到好多模板,根据自己的需求,修改一下即可使用,大概都是差不多的,因为涉及到后端,所以要跟后端协商一致决定去写,我的设计思路是跟着后端设计更改的,如下: 1.语言是后端接

    2024年02月12日
    浏览(32)
  • 安卓系统--翻译手机rom语言 添加多国语言 编译apk 反编译ODEX 工具步骤解析

    很多小品牌机型不具备多语言设置。国内大都是中文。要想换为其他语言除非固件支持。例如国际版固件等等。大厂基本都有中文或者英文或者其他语言配置。而小品牌机型只能通过修改rom来达到多语言调用. 今天给友友介绍一款工具,可以用来翻译手机rom语言。添加多国语

    2024年02月04日
    浏览(34)
  • i18n多国语言Internationalization的实现

    i18n 是\\\"Internationalization”的缩写,这个术语来源于英文单词中首尾字母“”和“n”以及中间的字符数(共计18个字符) 当我们需要开发不同语言版本时,就可以使用i18n多国语言的一个操作处理,i18n主要实现那一方面的内容呢?例如: 文本内容本地化、日期/时间格式、货币与度

    2024年01月16日
    浏览(30)
  • 【Vue】使用 vue-i18n 报错问题解决(一)

    初始化好前端项目后,准备使用vue中文插件i18n,代码里加载好插件,重启项目发现页面无法跳转至首页,呈空白 a.右击打开检查 b.查看console c.报错信息 具体报错内容: ssage-compiler.esm-bundler.js:54 Uncaught (in promise) SyntaxError: Not available in legacy mode (at message-compiler.esm-bundler.js:54:1)

    2024年02月16日
    浏览(26)
  • Vue 国际化之 vue-i18n 的使用

    目录 一、安装 二、使用 1、准备语言包 2、准备翻译的语言环境 3、实现语言翻译 三、整合 ElementUI 语言包 1、扩展中文 2、扩展英文  3、使用扩展语言翻译 四、问题记录 五、扩展 vue3 中使用 vue-i18n 如果在一个模块系统中使用它,你必须通过  Vue.use()  明确地安装  vue-i18n

    2024年03月14日
    浏览(37)
  • 扩展 jQurey.i18n.properties 的能力来向 vue-i18n 靠齐

    jQuery.i18n.properties 是 jQuery 老项目的国际化框架,其实国际化方案本质上都大同小异,都是需要用翻译函数包裹词条,然后根据词条文件来进行翻译 就是使用上与其他框架不太一样而已 但由于我们已经基于 vue 框架实现了一个国际化自动处理脚本,脚本会自动用全局函数包裹

    2024年02月03日
    浏览(27)
  • 【chrome扩展开发】vue-i18n使用问题及解决方案

    记录chrome扩展开发时调用vue-i18n的一些问题和解决方法 vue : ^3.3.4 vue-i18n : ^9.2.2 vite : ^4.4.8 Uncaught (in promise) EvalError: Refused to evaluate a string as JavaScript because \\\'unsafe-eval\\\' is not an allowed source of script in the following Content Security Policy directive: \\\"script-src \\\'self\\\' \\\'wasm-unsafe-eval\\\' \\\'inline-speculation-

    2024年02月14日
    浏览(32)
  • uniapp国际化npm install vue-i18n报错

    在vue2环境下,默认安装 npm install vue-i18n 的版本是 vue-i18n@9.1.9,所以报错。 用以上命令查看版本:  vue2建议5.0版本  

    2024年02月12日
    浏览(34)
  • ubuntu18.04 vscode 安装 vue.volar Vue Language Features (Volar) , vue3 必备插件

    直接在vscode 里面下载老是失败,不是网络问题,而是vue.volar插件配置的vscode版本与vscode版本不一致导致出现安装失败 https://marketplace.visualstudio.com/ 官网搜索 vue.volar 然后打开 Vue Language Features (Volar) 点击 Download Extension 下载最新版本插件 我这里分享了自己下载的Vue.volar-1.8.25.

    2024年03月11日
    浏览(35)
  • vue2+element-ui使用vue-i18n进行国际化的多语言/国际化

    注意:vue2.0要用8版本的,使用9版本的会报错 在src目录下,创建新的文件夹,命名为i18n zh.js en.js index.js main.js 使用方式一 效果图 使用方式二 效果图 使用方式三,在 效果图 ` 注意:这种方式存在更新this.$i18n.locale的值时无法自动切换的问题,需要刷新页面才能切换语言。解

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包