You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3中如何在助手函数里使用vue-i18n翻译功能

在非Vue组件上下文访问vue-i18n翻译功能

问题描述

我在Vue项目中使用vue-i18n实现了翻译功能,main.ts核心代码如下:

// Create vue app
const app = createApp(App)

// Use plugins
app.use(i18n)
....

// Mount vue app
app.mount('#app')

组件内的翻译功能运行正常,但在独立文件编写时长格式化的助手函数时,遇到了$t未定义的编译错误。助手函数代码如下:

export default {
  formatDuration: (value: number) => {
    if (!value){
        return null;
    }
    
    let duration = dayjs.duration(value, "seconds");
    let secondsPart = duration.seconds();
    let minutesPart = duration.minutes();
    return (duration + " " + $t("seconds")); // build error
  }
}

需要实现的是根据当前语言,将时长格式化为易读形式(如英文“4 minutes, 2 seconds”、德文“4 Minuten, 2 Sekunden”)。

解决方案

方法1:直接导入i18n实例(推荐纯工具函数场景)

首先在定义i18n实例的文件中(比如i18n.ts)导出实例:

import { createI18n } from 'vue-i18n'

const i18n = createI18n({
  // 你的配置项:locale、messages等
})

export default i18n

然后在助手函数文件中导入该实例,使用i18n.global.t()替代组件内的$t:

import i18n from './path/to/i18n'
import dayjs from 'dayjs'

export default {
  formatDuration: (value: number) => {
    if (!value){
        return null;
    }
    
    const duration = dayjs.duration(value, "seconds");
    const secondsPart = duration.seconds();
    const minutesPart = duration.minutes();
    
    const parts = [];
    if (minutesPart > 0) {
      parts.push(`${minutesPart} ${i18n.global.t("minutes")}`);
    }
    if (secondsPart > 0) {
      parts.push(`${secondsPart} ${i18n.global.t("seconds")}`);
    }
    return parts.join(', ');
  }
}

方法2:使用Vue的inject(适用于组合式API上下文)

如果助手函数是在Vue组件或支持组合式API的场景中调用,可以通过inject获取i18n实例:

import { inject } from 'vue'
import dayjs from 'dayjs'

export default {
  formatDuration: (value: number) => {
    if (!value){
        return null;
    }
    
    const i18n = inject('i18n');
    const duration = dayjs.duration(value, "seconds");
    const secondsPart = duration.seconds();
    const minutesPart = duration.minutes();
    
    const parts = [];
    if (minutesPart > 0) {
      parts.push(`${minutesPart} ${i18n.global.t("minutes")}`);
    }
    if (secondsPart > 0) {
      parts.push(`${secondsPart} ${i18n.global.t("seconds")}`);
    }
    return parts.join(', ');
  }
}

注意:此方法仅能在Vue的注入上下文内使用,纯工具函数场景优先选方法1。

补充:处理复数形式优化

为了适配单复数差异(如英文1 second/2 seconds),可以在语言包中定义复数规则:

// 英文messages
{
  "seconds": "second|seconds",
  "minutes": "minute|minutes"
}

然后在助手函数中传递数量参数实现复数翻译:

parts.push(`${minutesPart} ${i18n.global.t("minutes", minutesPart)}`);
parts.push(`${secondsPart} ${i18n.global.t("seconds", secondsPart)}`);

内容的提问来源于stack exchange,提问作者Martin H.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:12:52