前面的两篇文章分别介绍了网站多语言的使用场景和实现方案,本节就将更深入的介绍技术细节,如果没有看过前面文章的,可以点去大概看下,这里不再重复上面的内容。
我们将从这几方面进行阐述:收集页面待翻译字符串;存入redis待处理;编写第三方翻译接口;编写翻译算法;输出翻译后的字符串。
首先,如何收集页面上需要翻译的字符串呢?
用过laravel、thinkphp等第三方开源框架的应该都有印象,系统会默认提供一个翻译的助手函数,正常我们通过语言包把内容翻译后就可以了,我们就是利用了类似的方法,如果没有接触过上面说的开源框架也没关系,接下来我们会说明。我们会预先定义一个页面方法,这个方法是可以在view层被执行,现在的架构都是mvc架构,页面的显示都是通过view层文件渲染出来的,比如view层常用的smart模板引擎,都有很多的预定义方法,我们可以参考然后可以方便实现我们需要的这个功能。
这个语言方法中我们将会进行一次封装,具体逻辑是:首先调用系统的默认语言函数,如果系统语言包没有定义该语言对应的内容,则通过逻辑判断进行我们接下来的逻辑,从我们缓存的语言文件进行读取解析,如果有则直接返回,如果没有则通过逻辑判断,执行进一步的逻辑,调用翻译接口去翻译。那么这些没有翻译的字符串将会被收集起来,进行到下一个步骤,存入redis待处理。
字符串存入redis,为什么要存如redis呢,这也是基于执行效率考虑的。其他方法也可以考虑,比如存入数据库或者存入文件都可以。但是推荐redis,如果对redis不熟悉,可以考虑数据库。这是为调用翻译接口准备的,因为翻译接口都是一条一条字符串进行翻译的,很少支持批量的。对每个字符串收集到redis中,还要进行重复性判断,如果已经存在了则不再继续存入,确保唯一。这里还有个细节可以根据自己的需求进行取舍,调用接口翻译之后,你是想把字符串继续留在redis中还是删除掉。不删除的话,后期还可以继续使用,可以通过后台定时任务的方式可以进行翻译文件的统一更新(如果有需要的话),我们是翻译完了之后就删除。
(未完下节继续)