首页 » 工作 » 正文

双语导航:让 DedeCMS 导航菜单同时显示英文栏目名称 [自动版]

发布者:站点默认
2012/06/28 浏览数(7,999) 分类:工作 评论(6)

说明:

注:本文使用了谷歌翻译API,不过谷歌貌似把这个API关闭了。

让 DedeCMS 的导航菜单也可以显示英文名称。

此文为自动将中文翻译为E文,可能会不准确。手动指定版请转至《双语导航:让 DedeCMS 导航菜单同时显示英文栏目名称 [手动版]》。

效果:

导航菜单中同时显示英文名称

DedeCMS 导航菜单中同时显示英文名称

DedeCMS 导航菜单中同时显示英文名称 示例二

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

<完>

点击返回顶部
  1. 留言
  2. 联系方式