背景描述
最近一直在帮助陈良乔(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');
非常感谢博主的分享,试了一下以前的翻译插件都失效了。
Hi,JiaJieChan,是我这个插件不起作用吗?
非常感謝,可以正常使用。
反馈一个问题,这个插件在定义函数function conv_batconvert()时,往网页里面写了CSS规则,由于插入位置位于声明之前,会导致RSS失效,希望博主能修复下,或者直接删除也可以的,无非是效果不好看了,但是RSS就正常了。
好的,最近抽空看看
Hi, Spunsugar
我仔细回看了一下代码,不是非常明白您说的意思是什么,我解释一下代码逻辑:
1. 您看到的
style
说的是第 42 行的那个吗?它仅仅是为了给插件输出结果增加一点样式。(请抱歉我懒,一年多了也没想着做个像样的界面 ;-))2. 代码中,对于标题的更新,仅仅是针对全局对象
$wpdb->posts
的post_name
字段,理论上来说,影响的是 RSS 的链接地址吧?您说的 RSS 失效,是指转换之后,点击RSS的链接无法跳转到正确的页面,还是其他什么现象呢?可否详细描述一下。谢谢!
博主你好,请问可以做一个去掉翻译功能的版本嘛
我有一个英文站,标题都是英文的
我想直接调用标题用作slug而省略翻译的步骤
谢谢
WordPress 默认就是直接拿标题来做slug的,我不是很明白您的需求是什么,是不是批量导入文章后,再批量生成slug呢?
觉得还是不太好用,不能再写文章的时候,标题自动翻译
自动翻译请用 wp slug translate 这个插件,我这个是后台批量翻译用的
现在这个插件无法使用了。博主是否还会修正呢??
可能 google 换新的接口了,不过最近精力不在 WordPress 上了,所以抱歉。如果您需要单篇文章的翻译,可以使用 wp slug translate。
看起来很不错,哈哈哈
UA插件识别不了。。。Windows10。。
这个插件看起来确实很久没更新了,估计作者在和我比懒呢