说明:
注:本文使用了谷歌翻译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、关于显示:此函数用于导航上显示英文名称,也可查询句子。默认情况用于导航上的文字显示,所以函数限制了查询后的词长。
<完>