前面的文章提到了几种实现网站内容多语言的方式,分析了几种方案的优缺点。如果没有看过的话,建议过去看看。
我们根据自身的实际开发经验设计了一种更优的方案,目前这种方案已经实际应用于项目中,效果非常好。
我们的方式是:采用多语言包和第三方翻译接口,然后配合redis进行处理,然后将翻译好的内容缓存起来。这里面有很多的细节,我们将逐步展开说明。
页面的内容翻译涉及两部分,一个是页面展示的内容,一个是js部分的提示内容。做过前端的都知道,js页面提示是必不可少的,比如常见的表单验证等;这部分提示相对固定且较少,可以直接通过语言包实现,无需再通过翻译接口自动翻译,我们将重点讲讲页面内容的翻译。
翻译的过程是页面的内容显示时我们先包在一个动态函数中,我们此处举例用的是一个框架thinkphp(其他的框架也是类似),用过的小伙伴都知道,这个是mvc结构的,view层在加载时会进行动态的渲染,并可以调用定义好的助手函数,我们就是通过这个实现的。
我们通过自定义的翻译助手函数将页面字符串全部进行收集(注意:此处是收集,并未直接调用接口进行翻译),我们会把待翻译的字符串添加到redis中待处理,等页面加载完成后,触发ajax去执行翻译的进程。当然也可以通过其他方式触发,比如定时任务等。一般的翻译接口都是一次只能翻译一条字符串,页面上这么多的字符串只能轮询的方式去执行。
这个翻译好的内容我们进行缓存,存储的格式为json格式的数据,可以按照模块或全局进行缓存,具体的可以根据实际情况自行决定。
有人可能有问题了,你这样页面的内容翻译并没有同步显示啊。其实是这样的,这里处理的是页面的翻译过程,一旦页面页面翻译好后就会进行内容缓存,下次加载会直接从缓存文件中读取,不会再调用接口,所以切换多语言时不会感知翻译的过程。
这里还可以扩展,比如收集页面的字符串保存起来,后期可以随时更新翻译,如果翻译不准确了还可以进行人工校正等。
这是目前的方案,后面我们会介绍下实现的技术细节。