VUE中使用$t字符串中包含@被截取问题

一个很神奇的问题,请大老帮忙解答
VUE3.0 定义一个语言字符串,其中包含@符号,如const publicLang = {'str' : '123@456'}
因为涉及多语言,用到$t,let footerItem = this.$t('str')
打印footerItem,发现@及后面的字符被截取了,只得到‘123’

可能是由于 $t 方法识别 @ 符号作为格式化字符串的一部分而导致的。您可以使用双大括号 {{ }} 将字符串包裹起来,以确保 $t 方法正确解析。
const publicLang = { 'str': '123{{atSymbol}}456' }
在使用 $t 方法时,传入一个对象,包含一个名为 atSymbol 的属性:
let footerItem = this.$t('str', { atSymbol: '@' })
这样,$t 方法将正确解析 123{{atSymbol}}456,并将 {{atSymbol}} 替换为 @ 符号。您将获得正确的翻译结果。
如果您只是需要显示原始的字符串,而不需要通过 $t 进行翻译,可以使用双大括号绑定表达式 {{ ... }} 来显示该字符串,而不需要使用 $t 方法。

【以下回答由 GPT 生成】

答案:

这个问题是因为在Vue的国际化插件中,默认会将 "@" 符号解析为语言占位符,因此会导致字符串中的 "@" 符号及其后面的字符被截取掉。

要解决这个问题,可以使用 Vue I18n 提供的 raw 属性来指示不解析特殊字符。以下是具体的解决方案:

  1. 在 main.js 文件中引入 Vue I18n 插件:
import { createApp } from 'vue'
import { createI18n } from 'vue-i18n'
import App from './App.vue'

const i18n = createI18n({
  // 在这里设置其他 Vue I18n 配置
  legacy: false, // 建议将此项设置为 false,以支持 Vue 3.0
})

createApp(App).use(i18n).mount('#app')
  1. 在你的国际化文件中,在需要保留 "@" 符号的字符串中,使用 raw 标记来指示不解析特殊字符:
const messages = {
  en: {
    str: { raw: '123@456' }
  },
  // 其他语言的翻译...
}

export default messages
  1. 在组件中使用 $t 函数时,通过 { raw: true } 配置参数来指示不解析特殊字符:
let footerItem = this.$t('str', { raw: true })

这样就可以正确地获取到整个字符串 "123@456" 了。

希望这个解决方案对你有帮助!如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^