2007年02月 的存档

IE里behavior属性的一个小bug

我用的百优空间没有访问日志,所以我在K2模板的footer.php里加了一段代码,将每次访问的相关信息记录进一个文本文件里。这种方法的缺点是只能记录Blog页面的访问,其他的文件比如图片、js、CSS文件就没办法了。

这两天我的空间经常会提示数据库连接过多,而且垃圾评论也变得狂多。昨天修改了下这个插件,直接屏蔽所有全是英文并包含链接的评论。平常我很少看这个访问日志,只是每个月清理一下,以免影响速度。今天因为空间有问题,就去检查了一下,发现有很多对pngbehavior.htc文件的访问,有根目录下的/pngbehavior.htc,也有各个月份目录下的/2006/07/pngbehavior.htc,也有page下的/kfc/pngbehavior.htc。用WinRAR在我的网站备份文件里搜索了一下,发现CoolPlayer插件CoolPlayer插件的coolplayer.css文件里有"pngbehavior.htc"字样,具体的代码是:

img {
	behavior: url( pngbehavior.htc );
}

我对CSS了解不多,只记得CSS里background里会用到url,一般写成url(abc.png)表示和当前CSS文件同目录下的abc.png文件。而写成url(/abc.png)则表示网站根目录下的abc.png文件。写了个小html文件做测试,1.html文件里引用"/tmp/t.css"这个CSS文件,并加上一个div标签和一个img标签,img标签的src为"/mm.png",而CSS文件里写上:

img {
	behavior: url( pngbehavior.htc );
}
div{
	background: #FFF6BF url(haha.png) 8px 6px no-repeat;
}

把文件上传到网站上,开上IRIS嗅探器,在IE浏览器里输入这个html文件的地址。嗅探结果显示IE依次读取的是/1.html、/tmp/t.css、/pngbehavior.htc、/mm.png、/tmp/haha.png这几个地址。

也就是说,behavior里的url和background里的url还是有区别地,behavior的url不支持相对路径。写错了,behavior里的url不是不支持相对路径,是我的例子特殊了。behavior里的url的当前路径不是CSS文件的目录,而是当前页面的目录。也就是说,"/"目录下的html文件,"/tmp"目录下的CSS文件,background里的url使用的是CSS文件的当前路径"域名/tmp",而behavior里的url使用的是当前访问页面的当前路径"域名/"。bahavior属性好像只有IE支持,或许这是IE的bug?看访问日志里pngbehavior.htc文件的访问记录,User-Agent里有MSIE 6.0的,也有MSIE 7.0的,也就是说IE6和IE7里都有这个问题。

WordPress通过.htaccess文件接管访问,除了服务器上实际存在的文件外,其他的访问都被重定向到WordPress的index.php文件上。所以,这些对pngbehavior.htc文件的访问最终都会被WordPress处理,也就是说都会走一遍WordPress的整套程序,包括连接MySQL数据库、载入WordPress核心文件、载入插件、分析访问地址,最后给出HTTP 404。因为现在使用IE浏览器的人还是比较多的,所以对网站的性能还是有很大影响的,不仅占用了CPU资源,还增加MySQL连接数。而这个pngbehavior.htc文件,估计应该是为了解决IE无法处理png的alpha通道的问题吧,反正我也很少用Coolplayer,直接把这条CSS代码注释了事。

呃,目前CoolPlayer的最新版9.3版同样有这个问题。跟andot大大报bug去,啦啦~~

Update:最近接触到不少bug,包括IE的bug,Firefox 2.0里开发组非要在显示feed时只显示摘要,WordPress 2.1里开发组非要把以前feed里more标签无效改为有效。唉,这些关系民生,影响很多用户的事,怎么就没人管呢?IE也就算了,微软牛气嘛,这么多版本以来,哪个版本不能通过网页执行程序啊。Firefox和WordPress这样的开源软件也有这些问题,感觉开发组里没人为普通用户代言的,爱变成什么样就变成什么样。我越来越觉得WordPress不是我们普通WP用户的WordPress了,而是开发组的WordPress。

IE图片缓存bug

今天花了点时间调Blog的CSS。算起来,也有两个多月没怎么动过CSS了。

这次主要想解决下IE下显示的问题。因为我从去年3月以来一直用着Firefox,呃,上次开Maxthon是去年4月,所以没怎么在IE下检查过我的Blog。现在机器里没有Maxthon,想在IE环境下查看Blog就要开我的IE 6 SP2。可是,我的Firefox里设置了屏蔽51yes的统计代码,所以我每天在Firefox下看查看Blog不用担心51yes的统计数虚增。但是IE里没有屏蔽广告功能,所以,每次用IE进我的Blog时,我的内心都很挣扎。

文章内容部分的字体我又换回Verdana了。去年6月时详细地考虑了一下字体的问题,当时觉得宋体好点,尤其是标点符号的显示。比如“……”省略号,在宋体下显示在中间,而其他英文字体下只能显示在靠下的位置,类似六个点“......”这样。另外,引号和外国人名中间的间隔号也是宋体下好看一些。而字号,我用的是12px,觉得足够了。用了这么半年多,觉得宋体里英文的显示太不好了,显示的很小,不清楚,而粗体的英文,比如"W",简直就是一团黑。换回Verdana,则文章里的英文部分用Verdana显示。听说Verdana是微软特别找人为英文制作的,用来显示英文正文是最好的。而文章的中文部分则使用宋体。这里有点浏览器差异,在下一段介绍。整个CSS写成font: 12px/16px Verdana, 宋体, Sans-Serif;,显示效果还行。

浏览器的问题,Firefox是在字体列表中一次寻找,比如一个汉字,Verdana字体里没有,就往后找后面的字体,如果后面有一个楷体,就用楷体显示这个字。而IE和Opera,则是寻找一个有效自己,比如字体列表里第一个当前系统有装的字体是Verdana,就用Verdana显示文字,当遇到汉字Verdana里没有的时候,就使用系统默认的字体,而汉字的默认字体一般是宋体,所以汉字就被用宋体来显示。听说Vista里汉字的默认字体是微软雅黑,那么IE里我的Blog的文章正文部分应该就是以微软雅黑字体显示。不过我觉得微软雅黑不太好看,或许是不习惯吧。浏览器差异啊,真是个麻烦。

评论部分调整了一下,以前没注意CSS的匹配程度,导致custom.css里的评论CSS代码无法覆盖True Blue的CSS。现在评论部分好看多了。

True Blue 1.3.4是去年10月的事了,1.3.4_svn则是去年12月发布的,只是增加了在K2去年年底新增的TextTrimmer部分的CSS代码。这样算来,True Blue已经有4个月没什么变动了。到True Blue主页看了下,作者在Google Code建立了项目页面,1.4版已经在筹划中,现在已经beta 1了。1.4里做了不少改动,标题图片的显示方式换了,到时要重新用Photoshop制作我自己的标题图片了。

True Blue是用:before选择符对侧边栏里的每一个列表项进行处理的。在Firefox和Opera下可以看到效果,但是IE6里却没有效果,列表项前光秃秃的。原因当然是很简单,IE6不支持before选择符。我想在IE6下模仿Firefox下的效果,把Firefox下的页面截图,截取列表项前的标记保存成图片文件,然后通过CSS控制在IE下用该图片做列表项的标记。

很容易就做好了这件事,但是做好后却发现一个问题:侧边栏那么多列表项,每一个都要读一次图片,结果IE的状态栏上从“还剩160项”开始显示,半天才把这160多个图片下完。

在网上搜了一下,发现这是个很有名的IE的bug,叫做“IE图片缓存bug”。据这篇《IE缓存策略的BUG》里介绍,在使用innerHTML一次性添加多个相同图片的时候,IE不会使用图片缓存而重复多次读取图片。而且,微软网站也有一篇文章提到了这个bug,而这篇文章里则提到使用background-image一样会造成问题。唉,IE可真麻烦啊。

解决办法倒是有,通过JavaScript就可以。参考人家的代码写了一段js放在header.php里,刷新页面,却发现不起作用。或许,innerHTML里的图片和CSS里的图片还是有区别的吧。用IRIS嗅探发现,IE会先执行开头的js代码读取图片,然后再执行body里的js代码,最后再解析CSS,再读取160次那个小图片。

最终,没办法了,只有不用这个图片了。可恶的IE,○○××

DreamHost的down掉

昨晚7点半多一点,收到WatchThatPage的报告,我的一个位于DreamHost主机的网站无法访问。当即打开pietty,连接超时。Ping一下,超时。开代理连,超时。

WatchThatPage位于国外,它报告连不上就应该不关GFW的事。上DreamHost主页,也打不开。再开Google翻译连DreamHost主页,也打不开。瀑布汗,连DreamHost主页都down掉了。想了一下,记得桑葚的Blog用的是DreamHost,连了下yanfeng.org,发现也连不上。

这时,我已经确定是DreamHost服务器整体出问题了。当时在想,估计是网络出了问题,空间上的文件应该没事吧。到Gmail里一看,只有海豚在线。问了他一下,他说他哪里也上不去。又上cnBeta查看消息,结果没找到,于是,算了,反正数据应该没事。

今天上午和中午调了一下CSS,还到WordPress网站操着蹩脚的英语报bug。下午突然想起DreamHost的事。上cnBeta,还是没消息。灵机一动,打开Google Blog Search,直接搜索"DreamHost",然后按日期排序,发现最近几个小时的文章有很多讲这件事。digg.com的这篇文章发表于中午12点,说DreamHost坏了23小时,超过35万网站的管理员正在担忧网站的访客。月光博客的《Dreamhost主机大规模无法访问》说是DreamHost机房停电,而停完电后又发现核心路由器故障,导致所有服务器无法连接互联网。还有一篇英文的《Downtime with Dreamhost》,指向DreamHost网站的关于此次事件的两篇说明文章。从这个页面学到了一个新句子,"Not to be rude, but I probably know more about this than you!",嘻嘻。

现在DreamHost已经可以连上了,只是以前刚连上会显示欢迎信息,现在没了,直接显示命令行提示符。

现在是反思时间。以前遇到突发事件时找消息都是通过搜索引擎,一般来说,百度会比Google更新得更快些,所以都去百度搜。后来,有计算机方面的事情就去keso啊,月光博客啊这些知名Blog网站上去看,一般都会有消息。06年年底台湾地震的时候,懂得了可以去cnBeta看消息。现在才发现,Blog搜索才是获取新消息的最好办法。世界上那么多blogger,一旦有事情发生,肯定有人利马写出文章来发布到Blog上,而Blog搜索引擎,比如Google Blog SearchTechnorati,会在几分钟内索引到这篇Blog文章。所以,从Blog搜索引擎里可以很快得到最新消息。怪不得那么多人说离不开Technorati呢,嘿嘿。现在我终于理解“Blog就是媒体”这句话了。

当然,作为blogger,也应该在最短的时间内把自己得到的消息发布到Blog上,以方便别人搜索。自己得到的新消息post一下就好,抄文章就算了,嘿嘿。

Update:今早起床时,突然想起在西安看到过的发电机。我在西安住的地方,按照深圳、上海、北京这些大城市的话来说,就是个城中村。村里电线密布,线路严重老化,再加上村民们靠出租房子都富裕了,空调越来越多,一到夏天就经常因为超负荷用电把变压器烧了。因为一年总是会烧几次,而且变压器一烧就是一天没电用,而且夏天高峰期时还会临时停一天的电以保证其他地区电力的供应。所以,沿街的餐馆和银行等都自备了发电机。发电机的样子和拖拉机的机头一样,应该是经过改装专门用来发电的,烧的是柴油,开起来声音比拖拉机还大。每到停电的时候,满大街都是突突突的声音,吵死人了。

呃,假如DreamHost也自备一些这样的发电机,就不用为停电而烦恼了,嘿嘿。不过声音是大了点,而且高楼大厦都是密封的,少有窗户,通过中央空调来使空气流通。如果用上很多发电机,不知道会不会使大厦里遍布二氧化碳。

为自己的想法小寒一个。

WordPress 2.1.1和WordPress 2.0.9发布

北京时间2007年2月21日凌晨3点57分,WordPress 2.0.9及WordPress 2.1.1发布

这次WordPress 2.0.9的更新只有两处:

  1. 用wp_specialchars()函数处理WordPress确认对话框的内容。这就是WordPress官方Blog所说的防范XSS跨站脚本攻击的地方。[4877]
  2. 在TinyMCE文件和TinyMCE帮助文件里输出正确的文件的编码方式。[4888]

两处小更新,没啥大变化。况且,现在很多人都转用WordPress 2.1了,而各大插件和模板也都陆续开始只兼容WordPress 2.1了。唉,2.0.9这么快发布,WordPress 2.0.10真的要来了。

WordPress2.1.1更新比较大。从2007年1月23日WordPress 2.1发布以来,这一个月的时间,WordPress开发组在忙于WordPress 2.2的同时也对WordPress 2.1做了许多改进。

  1. wp_list_bookmarks()函数里,当$title_li参数为空时,不输出<ul>标签。[4800]
  2. 一些日期格式现在可以被翻译了。包括页面管理页中页面最后更新日期、文章管理页中文章的发布日期、单篇文章的评论管理页(http://abc.com/wp-admin/edit.php?p=1&c=1)中评论的发布时间,以及常规选项页里UTC日期的格式。[4802]
    /wp-admin/edit.php文件里180行那儿,ryan只写了一个下划线。ryan犯这样的错误不是第一次了,而且这个错误从1月25日直到今天2.1.1发布了也没人发现,哈哈。
  3. 修正导致Ecto工具在刷新文章时由于把分类ID设置为整型而导致的错误。[4807]
  4. 读取模板文件的模板名称(Template Name)的时候,因为正则表达式多加了一个空格而导致出错。[4810]
    比如使用K2模板时,page-archives.php文件里写的是:"Template Name: Archives (Do Not Use Manually)",而最终匹配出来并显示的模板编辑器页面右侧的是" Archives (Do Not Use",都是因为那个空格的存在。
  5. 修正wp_create_file_in_uploads过滤器的参数错误。[4819]
  6. 修正匹配more标签的正则表达式。[4822]
    WordPress 2.1里加入的这个好玩的功能,你可以用<!--more 阅读更多内容吧-->这样的more标签来自定义“阅读更多”链接的文字。我觉得这个功能还是有bug,当more标签后面还有其他的html注释的时候,比如分页标签,正则的匹配还是有问题。<!--more-->hoho,<!--haha-->这样的代码会让“阅读更多”链接的文字变成“-->hoho,”。
  7. 添加遗漏的wp-scriptaculous.js文件。[4823]
  8. 修正read_private_pages权限检测错误的问题。[4825]
  9. 在TinyMCE文件和TinyMCE帮助文件里输出正确的文件的编码方式。同WordPress 2.0.9的更新内容。[4846]
    我在Firefox里没遇到过TinyMCE帮助文件有乱码的情况,不知道IE里如果。可能使用非UTF-8编码的Blog会受此bug影响吧。
  10. get_categories过滤器没有作用于从cache中读取的分类信息。[4849]
  11. 在wp_cron()函数里检测当前请求是否为“Blog地址/wp-cron.php”。[4850]
    该bug在某种特殊情况下会造成很大的流量。
  12. 确保存入cache里的没有引用。#3726 [4857]
    这一条很晕,Mark说,"In any case, I discovered the issue. get_category() tries to store an array of object references into the cache. The cache doesn't like this, and stores a blank string instead. So you get a blank string on the way out. Looking around the web, it seems like good old serialize/unserialize is the sure way to make sure you don't have any references.
    Object reference,对象引用。在Coolcode那儿找到对象引用和指针引用的资料,以及,“PHP在序列化时不记录数组中的对象引用。”所以,serialize后再unserialize一个数组就可以去除其中的对象引用了,哈哈。
  13. 只在page页检查page ID。[4864]
    没太看懂,不过2.0.4时期报的bug现在才有人管,看来开发组的大大们可能也没看懂。
  14. /wp-admin/index-extra.php文件里输出HTTP头标识页面的编码方式。[4871]
  15. 始终使用HTTP协议而非HTTPS协议访问TinyMCE的CSS文件。(Link to TinyMCE css file with http scheme on all server setups.)#3646 [4872]
    if ( $_SERVER['HTTPS'] )改成了if ( $_SERVER['HTTPS'] == 'on' )。说是很多人升级到WordPress 2.1时发现文章编辑框里的文字变得很小,而这个问题有些服务器上有出现,有些没有。这条更新解决了这个问题。看了下,我的服务器上没这个问题。怪不得WordPress 2.1刚发布时很多人抱怨编辑框里的文字太小,然后到处问WordPress 2.1降级到2.0.7的方法。
  16. 用wp_specialchars()函数处理WordPress确认对话框的内容。同WordPress 2.0.9的更新内容。[4876]
  17. 修正使用Autosave功能创建的无标题草稿的日期标题被添加了两个时差的问题。[4883]
  18. 修正fix_attachment_link()函数中的正则表达式错误。[4889]
  19. WordPress不再在文章的div标签里添加p标签。[4894]

更新多多,WordPress 2.1的使用者们应该抓紧升级了。WordPress官方Blog列出了WordPress 2.1升级到WordPress 2.1.1更新文件列表,照抄过来,按照字母顺序重新排了下序,又校对了一下,21个文件被修改,还有新增了一个wp-includes/js/scriptaculous/wp-scriptaculous.js文件,没错。

  • wp-admin/admin-ajax.php
  • wp-admin/admin-functions.php
  • wp-admin/custom-header.php
  • wp-admin/edit.php
  • wp-admin/index-extra.php
  • wp-admin/options-general.php
  • wp-admin/options-reading.php
  • wp-includes/js/scriptaculous/wp-scriptaculous.js
  • wp-includes/js/tinymce/tiny_mce_config.php
  • wp-includes/js/tinymce/tiny_mce_gzip.php
  • wp-includes/js/tinymce/wp-mce-help.php
  • wp-includes/bookmark-template.php
  • wp-includes/cache.php
  • wp-includes/capabilities.php
  • wp-includes/category.php
  • wp-includes/cron.php
  • wp-includes/formatting.php
  • wp-includes/functions.php
  • wp-includes/post.php
  • wp-includes/post-template.php
  • wp-includes/version.php
  • xmlrpc.php

WordPress 2.1.1,大餐不容错过。等到4月底又有WordPress 2.2用了,哈哈,2.2很强的说。

2007情人节

今天是2007年2月14日,情人节。

说好这次情人节要去逛花市。广东的花市传统挺好玩的,按照传统是除夕夜全家一起逛花市,不过记得以前除夕夜花市都撤了,谁还在除夕晚上出去啊。

每年情人节都要消费掉大量的玫瑰花,听说美国情人节期间一支玫瑰花要三四十美元,好贵啊。今年送LP几张捶背券。2月初就找人设计了,自己又做了几张,打印出来,签字生效,嘿嘿。

捶背券1
捶背券2
捶背券3
捶背券

最后一张是找人帮忙设计的,背景不错,就是小人丑了点。

画的不怎么好看,我也不会用Photoshop,以后要抽时间好好学习,争取下一次设计几张好看点的捶背券。

如果你不知道“捶背券”是什么东西,如果你不知道捶背券为什么要有有效日期,说明你没看过《蜡笔小新》,嘿嘿。

斜立的可乐罐

今年一月份看了这篇《斜立着的可乐罐》,觉得很好玩,下了网就跑去买了罐可乐想试一试。文章里说是要喝掉⅔的可乐,只剩大概⅓就可以了。我是个不喜欢浪费的人,所以我喝光了可乐,然后灌进去一些自来水。花了几分钟时间,我就把它给立起来了,然后很得意地找人来参观。

那个可乐罐一直立在我家的墙角,立了一个月(虽然中途被我踢倒过几次,但都立刻被我重新立好),直到昨天LP说时间太长了里面该长霉了才扔掉。一直想找个相机拍下来,好写一个“炫耀帖”,正好2月9号那天去一个朋友家,她新买了个数码相机,于是就在她家立起了一个可乐罐,然后拍了下来,如图所示:
斜立着的可乐罐1
斜立着的可乐罐3

好好玩,拿这招逗小朋友玩应该不错,嘿嘿。呃,泡MM就不一定行了,反正我LP看到我立起来以后上去就给摁倒了……或许,人类的内心中都有搞破坏的欲望。

立起可乐罐也不需要多么高深的技巧。罐里放一些水,或者留一些可乐,既不能让水面超过罐底的高度,也不能让水太少,压不住右边罐体的重量。老是放不稳的时候,不妨把水放多点,水面接近罐底的最高点时最好立,少了的话就有点难,要屏住呼吸,扶住可乐罐,让它在几分钟内都要保持静止,等罐子里的水不再晃动的时候轻轻松手就可以了。有空的时候不妨试试,一罐可乐不过3块钱。

在西安上大学时,每到夏天,天气很闷热,在户外可以看到路面上的热浪滚滚。我又比较胖,受不了热,每天总是买瓶冰镇的大瓶可乐解暑。以前总是爱喝可口可乐,觉得百事可乐的味道不正,现在反过来了,总是喝百事可乐了。也不知道为啥,难道是因为便宜两毛钱?汗。

Google搜书计划

《南方都市报》2007.2.11 B02版

在斯坦福大学,布林和佩奇曾为学校的“数字图书馆技术”项目工作。创建Google后,1998年他们开始讨论如何把书籍“放”进公司的数据库。布林说:“我们真正感兴趣的是搜索的广泛性,所谓‘广泛’,不在于覆盖文字或字节的多少,而是为了获得最高质量的信息。书里包含了数千年的人类知识,可能是最高质量的知识。不把书‘放’进来,确实损失太大。”

4年前,Google开始了野心勃勃的“图书搜索”计划,该项浩大的工程目标是将历史上所有出版过的书籍数字化。在搜书计划的测试版网站books.google.com上,输入一个单词或短语——比如拉登——引擎将反馈出一系列内文中包含搜索关键词的书籍。

所谓树大招风,出版商和作家协会先后把Google告上法庭,称其侵犯版权。但Google辩解,它的目的并非拷贝,而是“改革”书籍,还搬出达尔文的名言告诫出版商:“最后生存下来的物种既不是最强大的,也不是最聪明的,而是那些最适应变化的。”

继续阅读《Google搜书计划》

WordPress 2.0.8发布

WordPress 2.0.8于北京时间2007年2月6日6点43分正式发布。

WordPress 2.0.8和WordPress 2.0.7相比修改不大,主要有以下几点:

  1. 在设置->永久链接页面里,当更新永久链接结构时WordPress如果检测到.htaccess文件无法写入的时候会给出要写入.htaccess文件的内容,要求用户自行将这段代码写入.htaccess文件中。这段内容以前没有做html实体化处理,现在使用wp_specialchars()函数处理以便这段内容能正确显示出来。#3523, [4789]
  2. 建立查询字符串的时候,对每一项进行检测,如果不是scalar的话就跳过。所谓scalar,PHP文档的is_scalar()部分翻译成标量,指整型、浮点型、布尔型、字符串等普通类型,而非数组、对象等复杂类型。这或许可以防止一些攻击。[4826]
  3. 在WordPress打开远程文件时的加强安全检测。[4827]
  4. 在永久链接结构中包含目录名的时候,比如"/%category%/%year%/%postname%/",直接访问"http://abc.com/wp-rss2.php"这样的地址得不到正确的feed内容。不过好像很少有人用这样的feed地址吧。#3214, [4839]
  5. cache模块和数据库模块增加对PHP 5.2的支持。[4841]
  6. 还有其他一些typo error(拼写错误)。
  7. Akismet更新到2.0版。

更新不大,没什么要紧的漏洞,除了第二条和第三条。i18n部分没更新,所以中文包也不需要更新。我直接上传/wp-includes/version.php完事,反正也快要升级WordPress 2.1了。

这次发布静悄悄的,也没在官方Blog上写个发布说明。唉,WordPress 2.0.x的时代真的已经结束了,WordPress 2.1.x的时代已经来临了。我也应该考虑升级到WordPress 2.1了。WordPress 2.0.x还要维护到2010年,但是随着大家开始转用WordPress 2.1,插件和模板的开发者们也会转向2.1平台的。如果失去了各种插件的支持,谁还会用2.0.x系列呢。

Update:汗,忘了补上WordPress 2.0.8的下载地址了。WordPress的各个release版本都可以在http://wordpress.org/download/release-archive/下载到。而且最好下载tar.gz文件的,因为网站上给出的MD5码是tar.gz文件的。而且,Windows下WinRAR打开tar.gz文件并没有什么问题,Linux/UNIX下就不用说了。

WordPress 2.1中文包

做了几天,前后耗时12个多小时,终于把WordPress 2.1的中文包做好了。

1月28日做好的WordPress 2.0.7中文包2.0版,在此基础上做WordPress 2.1的中文包。因为WordPress 2.1相对2.0系列的改动非常大,更新翻译字符串后,总共有346条待翻译的。于是,一条一条地查源文件查后台对应位置进行翻译。其间还有一些功能我不太了解具体的作用,在源代码里翻了一下实现该功能的代码,也耗了一点时间。

WordPress 2.1里已经把WordPress Database Backup插件移出核心了,而WordPress Database Backup插件已经换了开发者,并推出了兼容WordPress 2.1的2.0版。这个2.0版里修复了以前的一些bug,并增加了对WordPress 2.1的定时功能的支持,但是所有的翻译还是用的直接调用WordPress语言包的方法,没有使用自己的语言包。所以,这次翻译WordPress 2.1时我还是把它包含了进来,使用WordPress 2.1的人只要装上这个插件激活就立即是中文的了,就像以前内置的插件一样。

TinyMCE此次更新巨大,花了一个下午的时间从TinyMCE的各个en.js文件里把要翻译的字符串提取出来,做成po文件。最后弄出了150多项,经过内部查重,再经过对比WordPress中文包查重,最终去掉了所有重复项,只剩133项。TinyMCE的大升级,对应的要翻译的字符串也从42项猛增到133项,确实是个好消息。在编辑文章时按下Alt+v快捷键即可看到更多的工具栏按钮,使用的过程中就会在按钮的提示以及弹出的对话框中看到翻译后的中文了。

在弄好TinyMCE的翻译并合并到WordPress中文包之后,我就上传了mo文件到Blog里做测试。不过很遗憾的发现,有几处工具栏按钮的提示没有正确的显示中文。在WordPress 2.1的源代码里查了一番,又到WordPress网站上查源代码的修改记录,最终查到在[3664]里,进行TinyMCE翻译处理的代码里的正则表达式由$search2 = "/ : (['\"])(.*)\\1/Uem";替换成$search2 = "/\\s:\\s(['\"])(.*)\\1(,|\\s*})/Uem";。于是,原本能翻译的一些地方现在没法翻译了。唉,郁闷的很,辛辛苦苦弄的TinyMCE的翻译,到头来却因为WordPress 2.1的bug而无法完整地翻译整个编辑器的字符串。报了bug #3733,等修复吧。

这次翻译的过程中,多亏了Edwardcqcrz的鞭策,而且翻译完以后他们也帮忙做了测试并提出了很多意见,真是要谢谢他们。

最近在WordPress中文论坛看到有个叫陈少钧的人做了个WordPress 2.1中文包[via],并在他的中文包页面上写上“我们需要结束 WordPress 混乱滞后的中文翻译。把 WordPress 本土化标准和统一,受益的是全体使用 WordPress 的用户。有兴趣推动此标准化的朋友请发邮件给我:paveochen(at)gmail.com 。”(好像现在这句话已经被删了)呃,WordPress的中文翻译,“混乱”倒谈不上,目前也没几个人在做这个事。“滞后”嘛,我倒没觉得点点游和我的中文包翻译的有多烂。“标准”嘛,也许弄了工作组,把大家都拉进来,统一制作WordPress中文包也不错。不过,现在这种局面倒也没什么不好。好几个人在做WordPress中文包,大家愿意用哪个就用哪个。百花齐放也未必是件坏事。

这个中文包我下下来看过,并不是很好。我做了WordPress中文包,里面一千三百多项字符串,每一项我都是认真找出在源代码中的地址仔细的查看过,所以对每一项字符串我都清楚的很。陈少钧的整个中文包我大致翻了一下,很多地方都和我和点点游的中文包没什么不同,有些地方还自作聪明的按照英文原文做翻译,却没有参考源代码。比如,我的中文包对存档日期格式的翻译是“%2$d年%1$05s”,而对月份的翻译是“1月”、“2月”...“12月”。"%1$05s"里,5的意思是要显示5个字节,0的意思是不足的以数字0做补充。因为UTF-8里汉字都是3个字节的,所以最终显示效果就是“01月”、“02月”...“12月”。这样把格式写进翻译字符串而不是直接把“01月”写进月份的翻译也是为了不影响其他地方的日期格式。不过,陈少钧的中文包里照抄了我对存档日期格式的翻译,却把月份的翻译改为了“一月”、“二月”...“十二月”,这样就不对应了。

最近nbachiyski提了个建议#3687,建议给要翻译的文字加上注释,以方便翻译者。我觉得这没这个必要。WordPress使用了gettext,翻译者使用poEdit软件即可从WordPress源代码里得到所有要翻译的英文字符串。但是,翻译的时候并不能只看这些英文字符串做翻译,而是要参考每个字符串在源代码里的上下文。同时,翻译者要对WordPress有足够的了解,起码对后台各个选项的作用要清楚。只有这样,翻译出来的效果才会比较好。或许,陈少钧同学应该先把自己的中文包做好,再来扯标准这面大旗。当然,我也知道,“三流企业做产品,二流企业做品牌,一流企业做标准”,扯上标准这面大旗对自己是很有利的。而且,使用者如果看到“WordPress标准中文包”或者“WordPress官方中文包”的字样,也会有所倾心的。只是,在做标准之前,先把你的产品做好撒。

点点游做的WordPress中文版很不错,很多地方都做了很深入的汉化,比如WordPress自带的两个模板,以及很多WordPress没提供汉化的日期等部分。据点点游大大本人所说,他曾经做过很多大型程序的汉化工作。怪不得做WP的汉化做的这么专业。

我做的中文包不同于中文版,有很大的局限性,所有WordPress不提供翻译的地方我都翻译不了。我能做的也就是尽量的去报bug,但是也比较麻烦。首先我的英语很蹩脚,要跟WordPress开发组的人解释清楚事情的原委要查好久的金山词霸。另外,WordPress开发组也比较懒,感觉上好像很多bug被报上去后,他们总要说,希望有人做个Patch。或许,有了Patch他们可以很容易的让机器帮他们合并到WordPress源文件里,而不用自己去找那几行代码了。而我又不会做Patch,对svn软件不太熟...

对于中文版,我觉得不应该仅仅是汉化。我以前看过日本的一个WordPress网站,他们做的非常好,整套的日文文档,还有WordPress日文版里,他们也做了很深入的日文化,还加入了一些功能。比如,安装WordPress日文版时,你可以自行选择数据库的编码方式,是Shift-JIS还是UTF-8。所以我觉得中文版应该做的更多些。比如,WordPress里有一些bug,WordPress开发组迟迟不肯修复。(比如数据库编码方式的问题,WordPress开发组决定到2.2版才开始考虑该问题)还有一些不适合中文的地方,比如后台的一些CSS,比如对英文引号的处理,都不符合中国人的习惯。还有,每次WordPress有release版出来时,都会有很多bug被曝出来,Mark经常在他的Blog上对这些bug做出说明并给出临时处理意见。或许中文版可以做出一个小更新来修复这些问题,不必等WordPress原版推出下一个版本,这样对中文WordPress用户也是个好事。

如果有谁真的希望弄个标准化的WordPress中文版来,以上是我的建议。不过,要紧跟WordPress的步伐,随时获得最新的bug报告,对WordPress进行一些修改以适应中文环境,确实是个很累人的事。

而且,如果多人合作,也会遇到一些新问题。我自己做中文包,对于每一项我都很清楚,但是多人合作,我就要写注释,说明这里为什么不能按照原文翻译而要翻译成这样。同时也会面临一些冲突,比如我比较喜欢不翻译很多名词,比如blog、Trackback、Pingback、blogroll、feed、RSS。没必要非把blog翻译成博客,从国外的Windows、Word、Excel、Winamp、WinRAR,到国内的QQ、Foxmail,英文名并没有对它们的流行造成什么阻碍嘛。只有Google,傻乎乎的认为起个中文名字“谷歌”会更本地化一些。

我还发现我是个很呆的人,内向,不善于与人交流。而且,只懂研究技术,不懂做一些宣传。象点点游在WordPress新版发布后会写“WordPress ××版发布,本站在第一时间为您提供中文版。”象我这样木呐的人写不出这种文字,我只会写中文的WordPress changelog,一条一条的列出更新的内容。唉,孤僻的程序员,终日与电脑为伴。