自动翻译WordPress所有的中文别名为英文

因为之前的文章,wordpress直接用了中文做别名,这样以别名为固定链接的设置就会导致URL不是那么的友好,而且wordpress还不会去掉中文标点,所以感觉有点怪怪的。今晚写个脚本,利用网上的翻译引擎,把我博客的所有中文别名都翻译为英文。这样就可以用英文的URL作为固定链接来定位我的文章了。

1、导出数据库

暂时只做一个测试,所以我把wp的数据库从服务器上dump出来,然后下载到本机。

mysqldump -uroot -p xiaoxia > blog.sql
tar zcf blog.tar.gz blog.sql

2、导入到本地的mysql中

mysql> create database xiaoxia;
mysql> use xiaoxia;
mysql> source blog.sql;


3、导出别名

编写php脚本把所有别名导出到文本中,以作翻译。同时ID也要取出来,方便到时候更新到数据库。

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$fp = fopen("output.txt", "w");
assert($fp != null);
$r = $db->query("select ID, post_name from wp_posts");

while($row = $r->fetch()){
    if(strpos($row["post_name"], '%')===FALSE)
        continue;
    fwrite($fp, $row["ID"] . "^^^^" . urldecode($row["post_name"]) . "\n");
    echo "ID: " . $row["ID"] . "\n";
}

fclose($fp);

这里仅把含有中文的别名导出来。因为wordpress在别名里保存的是urlencoded的字符串,所以我们可以大致可以通过检查是否含有%符号来确定是否含有中文字符。我使用^^^^作为ID和别名的分隔符,当然可以使用换行或者其他别名里不会包含的字符。

执行php脚本。

root@xiaoxia-pc:~# php -f read.php
ID: 3318
ID: 2
ID: 5
ID: 6
ID: 15
ID: 16
ID: 17
ID: 18
ID: 19
ID: 20

导出的文件内容:

3318^^^^一句话
2^^^^关于
5^^^^语音朗读助手
6^^^^本站新开张,希望大家热烈支持!
15^^^^程序设计-visual-basic教程
16^^^^梦幻日记本
17^^^^汉语小词典
18^^^^网络文件同步系统v1-6
19^^^^2005年7月的日记
20^^^^文件发送控件
21^^^^电脑小管家1-0

4427^^^^一道c语言趣味题
4447^^^^kde-gnome的历史-图展
4493^^^^写编译器:学习gnu-flex,写一个词法分析器
4487^^^^又恢复了以前的工作环境了
4512^^^^自动草稿
4518^^^^阿斯发送到方萨芬撒旦方速度

4、翻译别名

网上开放的在线翻译引擎有很多,众所周知的是Google Translate,不过它越来越不厚道了。Google会对频繁的请求进行制止,把你的IP加入黑名单。这样要等一段时间才能再使用它的服务。下面使用的是百度的在线翻译。

代码用python写,因为我不是很懂php里怎么写网站请求。

# -*- coding: utf8 -*- 
import urllib, json

fin = file("output.txt", "r")
fout = file("output2.txt", "w")

for line in fin.readlines():
    ID, name = line.split("^^^^")
    data = {
        "query" : name, 
        "from":"zh",
        "to":"en",
        "token" :"d89e4a4b091302fb4ed2bcfacde86553",
        "source" : "txt",
        "ie" : "utf-8"
        }
    r = urllib.urlopen("http://fanyi.baidu.com/transcontent", urllib.urlencode(data))
    t = r.read()
    c = json.loads(t)
    if c["status"] != 0:
        print "failed to translate:", t
    t = c["data"][0]["dst"]
    print ID, t
    fout.write(ID + "^^^^" + t + "\n")
print "finish"
fout.close()

执行这段脚本,得到翻译的结果。

root@xiaoxia-pc:~# python fanyi.py
3318 In a word, yes
2 About
5 A voice reading assistant
6 The newly opened, I hope everyone support!
15 Program design of Visual-Basic tutorial
16 Dream diary
17 Chinese small dictionary
18 Network file synchronization system based on v1-6
19 2005 diary of July
20 File control
21 A computer small housekeeper 1-0

4427 A C language interesting questions
4447 The history of kde-gnome – graph Expo
4493 Writing a compiler: learning gnu-flex, write a lexical analyzer
4487 Returned to previous work environment.
4512 Automatic draft
4518 Aspen is sent to the Safin Satan square velocity
finish

5、修饰别名

很明显,导出的结果中,有很多名称是不符合想要的效果的,例如,各种标点以及很多空格。我只想别名里含有小写字母、数字以及‘-’,对于做固定链接来说,空格也是不允许出现的,不然很难看。

下面写一段python脚本来处理以下这些结果。

fin = file("output2.txt", "r")
fout = file("output3.txt", "w")

for line in fin.readlines():
    ID, name = line.split("^^^^")
    # To lower
    name = name.lower()
    # remove chars except digit & alpha
    name = "".join([(x if x.isalnum() else " ") for x in name])
    # rebuild with '-'
    parts = name.split(" ")
    while "" in parts: parts.remove("")
    name = "-".join(parts)
    # ok
    print ID, name
    fout.write(ID + "^^^^" + name + "\n")

执行脚本,

root@xiaoxia-pc:~# python decorate.py
3318 in-a-word-yes
2 about
5 a-voice-reading-assistant
6 the-newly-opened-i-hope-everyone-support
15 program-design-of-visual-basic-tutorial
16 dream-diary
17 chinese-small-dictionary
18 network-file-synchronization-system-based-on-v1-6
19 2005-diary-of-july
20 file-control
21 a-computer-small-housekeeper-1-0

4427 a-c-language-interesting-questions
4447 the-history-of-kde-gnome-graph-expo
4493 writing-a-compiler-learning-gnu-flex-write-a-lexical-analyzer
4487 returned-to-previous-work-environment
4512 automatic-draft
4518 aspen-is-sent-to-the-safin-satan-square-velocity

6. 导入到wp数据库

这是最后一个步骤了,对于数据库的操作,还是用回php比较方便。

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$data = file_get_contents("output3.txt");
$lines = explode("\n", $data);

foreach($lines as $line){
    if($line == "") continue;
    $parts = explode("^^^^", $line);
    $ID = $parts[0];
    $name = $parts[1];
    /* 检查是否有同名 */
    while($db->query("select ID from wp_posts where post_name='$name'")->fetch()){
        $name .= "-";
    }
    $db->query("update wp_posts set post_name='$name' where ID=$ID");
    echo "Update " . $ID . "\n";
}

echo "Finished";

在导入回数据库的时候,我检查了别名是否唯一,否则在后面添加-符号。我觉得最好还是保持唯一吧,这样就可以用别名来定位一篇文章。

7. 小结

很高兴,成功地完成了任务!虽然百度翻译的结果相比Google Translate来说水平还是相差甚远。但在这个过程中,让我再次熟悉了使用php、python等脚本语言,提高了用脚本轻松解决我所遇到问题的能力。

自动翻译WordPress所有的中文别名为英文》有13个想法

    1. Xiaoxia 文章作者

      嗯,python里操作mysql好像不是很方便,所以我才考虑用了php的。我对这些脚本的字符处理函数也不是很熟悉,用到的时候再上网查一下。python和php的官网都有很不错的在线手册!!!

      回复
  1. lijiejie

    我也改版Blog了,哈哈。。。

    不过依然没脱离微软的东西。

    “用脚本轻松解决我所遇到问题”,这句话很熟悉。 大概是某个Python教程上反复提到的话。

    回复
    1. Xiaoxia 文章作者

      原来是你博客在改版???我之前上了几次,发现只剩下一个简历。你是不是要去实习了呢!

      回复
      1. lijiejie

        你现在大三吧? 我已经实习过了,在淘宝公司。 之前也拿到了百度和其他公司的offer,只是没有打算去。

        你呢? 最近可一切都好?

        回复
        1. Xiaoxia 文章作者

          恩,正在大三。哇,原来你去了淘宝实习啊,不知道你实习的是什么职位。有大公司不去,你打算干什么呢?
          我最近做这做那的,手头上有很多事情还没有搞好,心里又想跟着兴趣走,o(∩∩)o…哈哈!!!都是网络方面的。

          回复

回复 Xiaoxia 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据