背景描述

最近一直在帮助陈良乔(imcc)维护他的博客——『有{间}客栈』。因为文章都是从博客大巴导过来的,所以文章的标题都是采用的中文方式。中文编码虽然现在不少浏览器、搜索引擎都能识别,但是遇到浏览器没有设置编码的情况下,乱七八糟看起来多少有点不爽。我推荐他使用了 wp slug translate,新的文章可以顺利转换,但是对老文章就无能为力了。

网上搜了一下,有个叫 cos slug converter 的插件可以批量翻译,但是试用了一下,版本太老了,google的翻译接口已经有了些变化。所以我受这两个插件的启发,合并了一下代码,做了这个插件 wp slug converter,现在发布给大家。

安装与使用

  1. 下载这个zip,在 WordPress 后台上传,并启用
  2. 在后台编辑插件,主要有这么三个地方需要注意。
    • 第一个是第 21 行的 langpair,这个是用来设定翻译类型的,这里默认将中文翻译成英文。
    • 第二个是第 44 行的 $per,这个变量限定了每次翻译的标题数量,毕竟一次数量太多可能会被 google 屏蔽。
    • 第三个是第 70 行 </script> 前面的数字,这里我写的是5000,意思是每5秒自动翻译下一页。
  3. 使用的时候很简单,假设你的blog域名是 http://example.com,那么只要打开 http://example.com/?tran=1 ,就开始自动翻页了

源码

源码采用 GPLv2 方式发布,与 WordPress 保持一致。

<?php
/*
Plugin Name:Wp slug converter
Plugin URI: http://ironblood.net/2012/03/23/wp-slug-converter
Description: 批量中文标题翻译成英语,使用方法:
             请参见 http://ironblood.net/2012/03/23/wp-slug-converter
Version: 1.0
Author: IronBlood
date:2012-03-23
Author URI:http://ironblood.net
*/
if( !class_exists("Snoopy") )
	require_once (ABSPATH."/wp-includes/class-snoopy.php");

function wp_translate_ib($text){
	$snoopy = new Snoopy;

	$url="http://translate.google.com/translate_t?langpair=zh|en";
	$submit_vars["text"] = $text;
	$submit_vars["ie"] = "UTF8"; 
	$submit_vars["hl"] = "zh-CN"; 
        // 翻译的类型,前面是原语言,后者是翻译后的语言
	$submit_vars["langpair"] = "zh|en"; 
	$snoopy->agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11';
	
	$snoopy->submit($url,$submit_vars);
	$htmlret = $snoopy->results;

	if(preg_match('/<div.*?id\s*=\s*("|\')?\s*result_box\s*("|\')?.*?>/ius', $htmlret, $matchs) == 1){
		$out = explode($matchs[0],$htmlret);
		unset($matchs);
		$out = explode('</div>',$out[1]);
		$name_tmp = sanitize_user(sanitize_title($out[0]), true);
		
		unset($out,$htmlret);

	}

	return $name_tmp;
}

function conv_batconvert(){
	header("Content-Type: text/html; charset=UTF-8");
	echo "<style>a,td,div{font-size:12px;}</style>";
	if( $_GET['tran'] =='') return true;
	$per = 10; // 每次翻译的条数
	if( $_GET['page'] < 1)$_GET['page'] =1;
	$begin = $_GET['page'] * $per - $per ; 
	global $wpdb  ;		
	$tableposts = $wpdb->posts;
	$sql = "SELECT post_title,post_name ,ID FROM $tableposts WHERE post_status = 'publish'   AND   post_type='post' limit $begin , $per";		
	$titleSel = $wpdb->get_results($sql);
	$i = 0;
	echo "<table border='1'><tr><td><b>原标题</b></td><td><b>翻译标题</b></td></tr>";
	
	foreach ($titleSel as $TS) {
		/* start */
		$slug = sanitize_title( wp_translate_ib($TS->post_title) );
		$sql ="UPDATE ".$tableposts." SET `post_name` = '".$slug."' WHERE ID =$TS->ID;";		
		if( strlen($slug) > 4 ) $res = $wpdb->get_results($sql);
		echo "<tr><td>".$TS->post_title."</td><td>".$slug."</td></tr>";
		$i ++ ;
	}

	echo "</table>";
	
	$page = $_GET['page'] + 1;
	
	if( $i == $per  ) {
		echo "<a href='?tran=1&page=".$page."'>下一页 </a>";
		echo "<div>防止google临时屏蔽IP,所以一次只翻译(".$per .")篇之,<b>请稍等10秒钟</b>左右手动点击下一页</div>";
		echo "<script language=\"javascript\">setTimeout(\"window.location.href='?tran=1&page=".$page."'\",5000)</script>";
	}
	else {
		echo "<div>已经转换完毕</div>";
	}
	
	die();
}

add_action('init', 'conv_batconvert');