与传统i18n混合使用
translate.js 与传统 i18n 混合使用的场景
需求:传统i18n翻译的,translate.js 不要参与
网页中有的内容是传统i18n已经指定好的,并且已经有相关语言配置文件位置好的,就不需要在动了,这部分有传统i18n参与翻译的文本,不在需要 translate.js 参与翻译。
这里需要对原本的i18n进行一些重写,比如原本的页面代码为:
import { useI18n } from 'vue-i18n'var { t } = useI18n()//调用出文本显示t('messages.deleteSuccess')
原理是对t方法它进行重写,将t方法取得的文本,加入 translate.js 的 不允许翻译的文本 中去 ,那凡是通过传统i18n 的,也就是这个t方法所输出显示的文本,自然也就不会再被翻译。
调整后的代码:
import { useI18n } from 'vue-i18n'var { t } = useI18n()var oldt=t;t = function(str){var text = oldt(str);translate.ignore.text.push(text); //将这个传统i18n取到的配置文本加入不允许翻译的里面去return text;}//调用出文本显示t('messages.deleteSuccess')
这里注意的是,如果页面中有其他正常需要被翻译的文本,也恰好跟 t 方法所显示的文本相同,那也会导致页面中要正常被翻译的文本不会正常翻译! 这种情况你可以再重写t方法时,写个定时器,比如定时1秒后自动从 translate.ignore.text 中吧这个不允许被翻译的文本再去掉,这样就又被允许翻译了,就单纯只是获取使用这个文本时,不允许翻译。
建议
你完全可以用 离线翻译 的方式,导出当前整个页面的原文跟译文的配置,直接通过配置离线翻译,来全面取代传统i18n,使代码清晰,逻辑明确,不仅仅只是为了功能而去实现,免得页面代码杂乱,逻辑绕,给日后的其他同事或运维留坑。