与传统i18n混合使用

translate.js 与传统 i18n 混合使用的场景

需求:传统i18n翻译的,translate.js 不要参与

网页中有的内容是传统i18n已经指定好的,并且已经有相关语言配置文件位置好的,就不需要在动了,这部分有传统i18n参与翻译的文本,不在需要 translate.js 参与翻译。
这里需要对原本的i18n进行一些重写,比如原本的页面代码为:

  1. import { useI18n } from 'vue-i18n'
  2. var { t } = useI18n()
  3. //调用出文本显示
  4. t('messages.deleteSuccess')

原理是对t方法它进行重写,将t方法取得的文本,加入 translate.js 的 不允许翻译的文本 中去 ,那凡是通过传统i18n 的,也就是这个t方法所输出显示的文本,自然也就不会再被翻译。
调整后的代码:

  1. import { useI18n } from 'vue-i18n'
  2. var { t } = useI18n()
  3. var oldt=t;
  4. t = function(str){
  5. var text = oldt(str);
  6. translate.ignore.text.push(text); //将这个传统i18n取到的配置文本加入不允许翻译的里面去
  7. return text;
  8. }
  9. //调用出文本显示
  10. t('messages.deleteSuccess')

这里注意的是,如果页面中有其他正常需要被翻译的文本,也恰好跟 t 方法所显示的文本相同,那也会导致页面中要正常被翻译的文本不会正常翻译! 这种情况你可以再重写t方法时,写个定时器,比如定时1秒后自动从 translate.ignore.text 中吧这个不允许被翻译的文本再去掉,这样就又被允许翻译了,就单纯只是获取使用这个文本时,不允许翻译。

建议

你完全可以用 离线翻译 的方式,导出当前整个页面的原文跟译文的配置,直接通过配置离线翻译,来全面取代传统i18n,使代码清晰,逻辑明确,不仅仅只是为了功能而去实现,免得页面代码杂乱,逻辑绕,给日后的其他同事或运维留坑。