js文件中怎么使用thymeleaf标签_vuei18n 在 JS 文件中如何使用

Vue.js项目中,vue-i18n是一个比较流行的多语言方案。常规用法是在项目入口文件里,将它作为插件引入,然后在 .vue文件或者组件模板里按照 API 来调用就行。插件会自动往组件实例中注入$t方法。

const messages = {
  en: {
    message: {
      hello: 'hello world'
    }
  },
  cn: {
    message: {
      hello: '你好世界'
    }
  }
}

// Create VueI18n instance with options
const i18n = new VueI18n({
  locale: 'cn', // set locale
  messages, // set locale messages
})
new Vue({ i18n }).$mount('#app')

//App.vue
"app">

{{ $t("message.hello") }}


问题来了,如果不在组件模板里怎么办?比如一些工具函数,请求拦截器等跟视图无关的JS代码中如何使用呢?插件的使用场景是在组件内部,也就是能访问到组件实例的地方。对于其他地方的使用方法,官方文档里貌似没有提供直接的 API。摸索了一段时间终于解决,在此记录下。

import VueI18n from 'vue-i18n';
const messages = {
  en: {
    message: {
      hello: 'hello world'
    }
  },
  cn: {
    message: {
      hello: '你好世界'
    }
  }
}
const i18n = new VueI18n({
  locale: 'cn', // set locale
  messages: messages , // set locale messages
});

console.log(i18n.tc('message.hello')) // 你好世界

搭配 VS Code 插件

随着项目规模的扩大,文本标签会越来越多,手动维护非常麻烦。同时,模板里用"a.b.c"这样的属性字符串来引用文本,在源码层面非常不易阅读。这些问题,都应该由工具来解决。之前想过自己开发一个 VS Code 插件来解决这些问题,没想到早就有人做好了。开源社区就是这么强大,你能想到的,早就有人做了。这个插件就叫 Vue i18n。

0cc3b6902f57aaf304e947d0cd82a5b7.png
Vue i18n

早期版本不怎么好用,本人还提过 PR 修过缺陷。现在比较完善了,功能齐全,操作便捷。可以选中文本一键生成中英文,键名默认是组件路径加随机串,省去了命名的烦恼。还能在编辑器里直接看到对应的中文,鼠标悬浮显示英文。总之比较方便,推荐使用。

前面介绍了vue-i18n在 Vue 组件外部使用的方法,但是对于这个 VS Code 插件有点小问题要解决。插件是根据源码的字符串来匹配,然后在编辑器显示出对应的文本。因此,源码里一定要有 $t('xxx')字样才行。

1d6674e210af92da6775d22dab14f3bb.png

改成这样就能显示出来了:

4fe8c8a057d948e838384a2ddee4ec97.png

看起来没问题,但实际上运行会报错:

7e10022bccb990aa9a6214f7526f90b1.png
运行时异常

这是为什么呢?点击错误信息的调用栈进去看源码,发现原来i18n.tc这个方法是绑定到this(运行时指向VueI18n对象)上去执行的,而这里的代码执行的时候并没有this,所以是undefined

VueI18n.prototype.tc = function tc (key, choice) {
    var ref;
    var values = [], len = arguments.length - 2;
    while ( len-- > 0 ) values[ len ] = arguments[ len + 2 ];
  return (ref = this)._tc.apply(ref, [ key, this.locale, this._getMessages(), null, choice ].concat( values ))
};

所以,这里不能直接拿来调用,需要改变执行上下文。重新封装下这个方法:

import Vue from 'vue';
import VueI18n from 'vue-i18n';
import i18nLabels from '@/i18n';

Vue.use(VueI18n);
export const i18n = new VueI18n({
  locale: 'zh', // set locale
  messages: i18nLabels, // set locale messages
});

// 重新封装方法
export function $t(args) {
  return i18n.tc.call(i18n, args);
}

使用的时候导入这个方法就行了。

在 JavaScript 文件使用 Thymeleaf 语法需要借助于服务器端的渲染,通过在服务器端解析模板并将变量的值渲染到模板,然后将渲染好的 HTML 页面返回给客户端。 具体实现方法有以下几种: 1. 将 JavaScript 文件的内容嵌入到 HTML 页面使用 Thymeleaf 语法引用模板的变量。例如: ``` <script th:inline="javascript"> var myVar = /*[[${myVar}]]*/ ''; // ... </script> ``` 此方法需要将 JavaScript 内容写在 HTML 页面,不太灵活。 2. 将 JavaScript 文件的内容存储在模板使用 Thymeleaf 语法引用模板的变量,然后在服务器端将模板渲染为 HTML 页面。例如: ``` // JS 模板文件 var myVar = /*[[${myVar}]]*/ ''; // 渲染模板并返回 HTML 页面 @GetMapping("/my-page") public String myPage(Model model) { model.addAttribute("myVar", "hello world"); return "my-page"; } ``` 此方法需要在服务器端进行模板渲染,适用于需要动态生成 HTML 页面的情况。 3. 将 JavaScript 文件的内容存储在独立的文件,在服务器端使用 Thymeleaf 语法生成动态的 JavaScript 文件。例如: ``` // JavaScript 文件模板 var myVar = /*[[${myVar}]]*/ ''; // 渲染 JavaScript 文件并返回 @GetMapping("/my-script.js") public ResponseEntity<String> myScript(Model model) { String content = // 读取 JavaScript 文件模板并使用 Thymeleaf 渲染 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JAVASCRIPT); return new ResponseEntity<>(content, headers, HttpStatus.OK); } ``` 此方法需要在服务器端生成动态的 JavaScript 文件,适用于需要动态生成 JavaScript 文件的情况。 无论采用哪种方法,在使用 Thymeleaf 语法时都需要确保在服务器端进行模板渲染,而不能直接在客户端访问 JavaScript 文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值