背景描述
最近一直在帮助陈良乔(imcc)维护他的博客——『有{间}客栈』。因为文章都是从博客大巴导过来的,所以文章的标题都是采用的中文方式。中文编码虽然现在不少浏览器、搜索引擎都能识别,但是遇到浏览器没有设置编码的情况下,乱七八糟看起来多少有点不爽。我推荐他使用了 wp slug translate,新的文章可以顺利转换,但是对老文章就无能为力了。
网上搜了一下,有个叫 cos slug converter 的插件可以批量翻译,但是试用了一下,版本太老了,google的翻译接口已经有了些变化。所以我受这两个插件的启发,合并了一下代码,做了这个插件 wp slug converter,现在发布给大家。
安装与使用
- 下载这个zip,在 WordPress 后台上传,并启用
- 在后台编辑插件,主要有这么三个地方需要注意。
- 第一个是第 21 行的 langpair,这个是用来设定翻译类型的,这里默认将中文翻译成英文。
- 第二个是第 44 行的 $per,这个变量限定了每次翻译的标题数量,毕竟一次数量太多可能会被 google 屏蔽。
- 第三个是第 70 行 </script> 前面的数字,这里我写的是5000,意思是每5秒自动翻译下一页。
- 使用的时候很简单,假设你的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');
发表在《
发表在《
发表在《
Pingback: IronBlood on “Wp slug converter” | Wordpress
非常感谢博主的分享,试了一下以前的翻译插件都失效了。
Hi,JiaJieChan,是我这个插件不起作用吗?
非常感謝,可以正常使用。