说明:
注:本文使用了谷歌翻译API,不过谷歌貌似把这个API关闭了。
让 DedeCMS 的导航菜单也可以显示英文名称。
此文为自动将中文翻译为E文,可能会不准确。手动指定版请转至《双语导航:让 DedeCMS 导航菜单同时显示英文栏目名称 [手动版]》。
效果:
用法:
{dede:channel type='top'
currentstyle='
<li class="hover">
<a href="~typelink~" ~rel~>~typename~
<div id="navElmHover">~typename~</div>
</a>
</li>
'
}
<li>
<a href="[field:typeurl/]" [field:rel/]>[field:typename/]
<div>[field:typename function="cn2en(@me)"/]</div>
</a>
</li>
{/dede:channel}
<!--
“[field:typename function="cn2en(@me)"/]”即为E文输出代码;
currentstyle 参数不支持自定义函数,需要使用其它方式显示E文;
-->
<!--
使用JS的方法弥补currentstyle的不足,
如果不需要 currentstyle 可以忽略下边的代码:
-->
<script src="http://www.google.com/jsapi?key=ABQIAAAAS14i" type="text/javascript"></script>
<!-- key与域名绑定,可以免费申请 -->
<script>
google.load("language", "1");
var typename;
typename = document.getElementById("navElmHover").innerHTML();
google.language.translate(typename, "", "en", function(result){
if (!result.error){
var container = document.getElementById("navElmHover");
container.innerHTML = result.translation;
}
});
</script>
操作:
第一步:
打开“/include/extend.func.php”文件,添加以下代码:
/**
* 用于DedeCMS的中文翻译为E文的函数
* 查询步骤:1、内置数组;2、查询过的缓存数据;3、在线查谷歌
*/
function cn2en($text, $language = 'zh-CN|en', $forNavi = TRUE){
global $cfg_dataurl;
$text = trim($text);
if (empty($text))return '';
$outText = ''; // 最后输出的、翻译好的文字
$dictFile = str_replace('|','2',$language);
$dictFile = str_replace('/','2',$dictFile);
$dictFile = str_replace('\\','2',$dictFile);
$dictFile = DEDEDATA . '/lang/'.$dictFile.'.dict'; // 存放翻译结果的字典文件
// 内置数据
if (empty($outText)){
$privateData = array(
// 这里可以根据自己的情况追加、修改、删除
'首页'=>'Home',
'主页'=>'Index',
'产品中心'=>'Product',
'产品展示'=>'Product',
'新闻中心'=>'News',
'留言板'=>'Feedback',
'在线留言'=>'Feedback',
'资质荣誉'=>'Honor',
'公司简介'=>'About Us',
'联系方式'=>'Contact Us',
'人才招聘'=>'Jobs',
'招商加盟'=>'Join',
'优惠活动'=>'Promotion',
'服务项目'=>'Service',
'服务流程'=>'Process',
'合作单位'=>'Partner',
'销售网络'=>'Network',
'工程案例'=>'Case',
'服务网络'=>'Network',
'技术服务'=>'TServices',
'企业文化'=>'Culture',
'售后服务'=>'After-sales',
);
foreach ($privateData as $i => $v){
if ($text == $i) $outText = $v;
}
}
// 读缓存的字典文件,若无再查Google。
if (empty($outText)){
$dictFile = $cfg_dataurl . 'translate.dict';
if (!file_exists($dictFile)) @file_put_contents($dictFile,'');
if (!is_writable($dictFile)) return 'UnRead';
$dictData = file_get_contents($dictFile);
$dict = (array)json_decode($dictData);
foreach ($dict as $i => $v){
if ($text == $i) $outText = $v;
}
}
// 查Google
if (empty($outText)){
@set_time_limit(0);
$html = "";
$ch = curl_init("http://google.com/translate_t?langpair=" . urlencode($language) . "&text=" . urlencode($text));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$html = curl_exec($ch);
if (curl_errno($ch))$html = "";
curl_close($ch);
if (!empty($html)){
$x = explode("</span></span></div></div>", $html);
$x = explode("onmouseout=\"this.style.backgroundColor='#fff'\">", $x[0]);
// 写入字典
$dict[$text] = $x[1];
file_put_contents($dictFile, json_encode($dict));
$outText = $x[1];
}
}
if (!empty($outText)){
if ($forNavi){ // 若用于导航栏则需要限制其翻译后的长度
if (12 < strlen($outText)){ // 如果翻译后的E文太长(长过12个字符)
if (strpos($outText, ' ')){
$outTextWordArray = explode(' ',$outText);
//print_r($outTextWordArray);
if (4 < strlen($outTextWordArray[1])){ // 若第二个单词长度大于4则用之
$outText = ucfirst($outTextWordArray[1]);
}
}
}
}
return $outText;
}else{
return '';
}
}
//echo cn2en('北街小巷'); // output: Street
第二步:
请参照“用法”部分。
第三步:
完成了,去看效果吧,^_^
函数说明
1、关于翻译:函数内置有一些中英文词语对照表,如果查询时这个表里没有的话会查询以前查询时缓存过的信息,缓存里还没有的话会到google进行查询并缓存。
2、关于显示:此函数用于导航上显示英文名称,也可查询句子。默认情况用于导航上的文字显示,所以函数限制了查询后的词长。
<完>

