让网站全球化可以吸引更多的用户和访问,全球化最重要的就是让各地的人都看得懂你的网站上写了些啥。在我玩联机OSU的时候甚至很多外国人让我们不要说日语。。。。[这是傲娇卖萌?]
那么接下来进入正题,刚刚中午趴在床上很无奈的想到了这个问题。[为啥无奈呢?因为又不想起床,不起床又没有wifi信号。。。。],实际上也是我为iTi想的问题,有可能我已经想的太远了,但是有些想法还是很好的。
特别加注
很多围观者还没仔细看完就私下告诉我直译不通什么的。。。
这种方法只是用于翻译小区块的文字的,比如“登录”,“取消”之类的,不是用来翻译大片文章的,大篇文章的翻译工作为了用户体验必须单独成库或者成表。
首先说一下简单逻辑:
>定义翻译表
>传入原文
>检测翻译表
>返回对应值
大体就是这样了。
然后就开始进行具体操作
1.定义一个翻译表
翻译表本身意向是放在memcache里作为数组调用的,但是暂时只做个演示不想那么麻烦,所以写进了一个叫langs.php的文件里。
里面的内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php $zh_chs=array( "hi"=>"你好", "foot bike"=>"自行车", "all mumber:%u"=>"所有成员:%u", ""=>"", ); $en=array( ""=>"", ""=>"", ); $jp=array( ""=>"", ""=>"", ); ?> |
用像这样的形式保存翻译内容,存放在memcache里时格式一样。上面分别用不同的数组保存了不同语言的翻译,当然下面的英文和日文就懒得写了,现在只表示一下中文,而且我的系统语言是中文也只有中文可以看到效果。
2.做好翻译函数
明确了翻译表格式以后就可以用翻译函数来使用他们了。
下面都是”translate.php”文件里的内容
1 2 3 4 5 6 |
/* 声明 Tseted by LuoJia Language in code:Chinglish(Chinese type Ehglish) 由于我是个鸟语不是特别好的中国人,所以在这里用中式鸟语凑活一下 */ |
首先定义一个最主要的函数,他用来加载语言表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
function tslt_getlang(){ global $userlang; //定义一个全局变量$userlang(用户语言) global $tslttable; //引入全局变量$tslttable(翻译表) require_once("langs.php");//加载语言文件,如果用的是memcache的话这里应该是连接memcache服务器 // ↓把用户语言截前6个字符出来,为了更准确也可以不截 $userlang=substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,6); //↓从这里开始都是进行语言匹配并载入翻译表 if(preg_match("/en/i",$userlang))$tslttable=@$en;//各个语言赋值前最好都加上@以防止报错 elseif(preg_match("/zh-CN/i",$userlang)||preg_match("/zh-CHS/i",$userlang))$tslttable=@$zh_chs; elseif(preg_match("/ja/i",$userlang))$tslttable=@$jp; else $tslttable=NULL; //如果没有符合的语言,就给翻译表赋值为NULL } |
然后就开始做主角了,它用来翻译[对照]传入的字符串
1 2 3 4 5 6 7 8 |
function tslt($string){ //翻译函数 global $tslttable; //全局数组翻译表 if($tslttable){ //如果翻译表存在的话 if(array_key_exists($string,$tslttable)){ //如果翻译表里有 return $tslttable[$string]; //返回翻译表里对应键值内容 }else return $string; //不然还把原本的字符串送回去 }else return $string; //同上 } |
上面的函数作用只是翻译字符串,如果方便地使用它,再做一个名字简短的函数来输出翻译结果
1 2 3 |
function __($string){ //函数名为"__"(两条下划线),这个函数名是从wordpress模版里看到的,觉得简短又不错 echo tslt($string); //翻译结果输出到文档 } |
最后做一个翻译初始化函数,虽然现在里面只有一个函数觉得没什么必要,但是实际使用的时候可能还会有点其它的要求,比如决定到底是否要翻译
1 2 3 |
function tslt_init(){ tslt_getlang(); } |
到这里翻译函数就差不多了,整个翻译过程是这样:
>最开始时初始化翻译表
>语言存在就载入翻译表,不存在赋空值
>调用翻译函数
>翻译表是空值就直接返回原文
>不是空值就翻译
>输出
3.测试
现在在主文件里写入以下内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php @require_once("translate.php");?> <?php tslt_init()?> <!DOCTYPE html> <html> <head> <title>翻译测试</title> </head> <body> <?php __("hi");echo "<br>"; //对应翻译表里的中文“你好” __("z");echo "<br>"; //由于不在翻译表里所以会输出原值 __("foot bike");echo "<br>"; //我知道自行车是bicycle... printf(tslt("all mumber:%u"),2);echo "<br>";//尝试用格式化输出也可以 printf(tslt("luojia:%u"),250); //同样不存在于翻译表里不会被翻译 ?> </body> </html> |
最后在浏览器里会出来这样的结果[亲测]
1 2 3 4 5 |
你好 z 自行车 所有成员:2 luojia:250 |
这和wordpress的Twenty系列模版不同的地方在于WP的模版只指定一个语言并从一个语言文件里提取翻译,不会随用户改变。我写的是根据用户浏览器语言来返回对应语言的翻译方法。[虽然本质差不多。。]
有什么漏洞的话请告诉我,这可能关系到iTi的生死。
本文发布于 https://luojia.me
本站文章未经文下加注授权不得拷贝发布。
本博客使用Disqus评论系统,如果看不到评论框,请尝试爬墙。