Language Switcher——在后台切换WordPress语言

2006年12月27日,突发奇想,觉得可以写一个在后台就可以很方便切换WordPress语言的插件。WordPress通过gettext支持语言包,而语言包有3种:WordPress本身的语言包、模版语言包、插件语言包。我觉得插件可以检索所有已安装的语言包(也就是mo文件),并在WordPress后台显示出来。另外,gettext的语言包总是用空字符串对应的翻译字符串来存储语言包的信息,这些信息可以显示出来供使用者参考。

这个插件花了3个下午。根据我的Google Calendar的记录:12月27日下午,5个半小时;12月28日下午,4个半小时;12月31日下午,3个半小时。12月28号晚上,写了两天,觉得差不多完成了,本来准备发布出来,但是肚子饿,跑去吃饭了,就没发。29、30号忙,又拖了两天,今天又仔细看了一下,发现还有很多或大或小的问题,比如在没修改过wp-config.php里的WPLANG常量定义时没法工作。呼,还好28号没发布出来,要不然就丢人丢大发了。又花了点时间解决了一下,现在发布出来。

插件的原理是设置$locale变量。WordPress的get_locale()函数会先读取这个变量,如果不存在才会去检查常量WPLANG。所以,本插件只要设置一下全局变量$locale,就可以绕过常量WPLANG,控制WordPress的语言。不过,当有插件使用load_plugin_textdomain()函数载入自己的语言包的时候,就会调用get_locale()函数。所以,我们的插件需要成为第一个载入的插件。这个问题在这里有过讨论,有人提出给插件添加等级,高等级的插件先载入;有人说语言包应该在插件都载入完以后再统一载入。最后,markjaquith以一句"Shouldn't plugins be able to manipulate the active plugins array to 'shuffle' themselves to the front if need be?"来结束讨论。所以,没办法,只有从插件调用顺序上想办法。查了下ASCII码表,选中了"$"符号。把插件的名字起成"$language-switcher.php",因为WordPress会按照ASCII码顺序调用插件,而大多数插件的文件名都是以英文字母开头的,所以这个插件将在其他插件之前被执行。

在后台里添加一个选项页。选项页代码里,在/wp-includes/languages/目录里查找*.mo文件,此为WordPress的语言包;在当前模版的目录里查找*.mo文件,此为模版的语言包;在/wp-content/plugins/目录里递归查找*.mo文件,此为插件的语言包。用gettext依次读取各个mo文件,把空字符串的翻译读出来,解析出各项信息,包括名称、修订日期、译者、国家、语言、编码、翻译字符串数,然后显示出来。另外,在当前正在被使用的语言包后面显示一个红色的"(active)"字样。

在选择新的语言,并点更新选项后,新的选项页面还是原来的语言。没办法,设置的更新是在代码执行到很靠后的地方才被完成的。所以,我想加一个自动刷新页面的js,在网上查了些自动刷新页面的JavaScript代码,都说可以用window.location.reload()这个函数。我试了一下,好像有点问题。因为在点“更新选项”后,浏览器是以POST方式把数据发回服务器的。所以在刷新页面时,Firefox会提示“要查看的页面含有过期数据。”,IE也有类似的提示,这样不爽啊。想了一下,用了window.location.href = window.location.href;这句代码,那个提示就没了。然后用setTimeout()函数设置让它在页面载入5秒之后执行,OK了。

拿我写的WordPress简体中文包,还有Kirin Lin的WordPress繁体中文包,还有我的K2模版中文包以及我装的3个插件的中文包做了测试。因为台湾地震的原因,点点游的中文版下不下来,要不然也应该拿来看一下。插件后台截图在这里。那个Dagon Design Sitemap Generator插件的简体中文包,明显是拿Kirin Lin大大的繁体中文包改的,连"Country: TAIWAN"都没改过来,嘻嘻。

Language Switcher插件的简体中文包也写好,一起发布啦。

请移步到“Language Switcher”主页下载软件并查看更多信息。

本文共有 19 条评论Language Switcher——在后台切换WordPress语言


  1. 1 Keenzy

    good!很好的一个插件!

    祝:新年快乐
    开心、健康、顺利,每天!

  2. 2 guaniu

    站长 我问一个与这个插件无关的问题 就是贵站的 鼠标移动到一些连接会出现这些地址的SNAP网站截图是什么插件 啊?或者是怎么实现的呢?

  3. 3 yskin

    是由www.snap.com网站提供的服务,在它的网站上注册一下,然后把给出的代码贴到</body>之前就可以了。Google一下"Blog snap",有很多文章给出说明的。好像还有一个WordPress插件,安装以后设置一下就可以了。

  4. 4 guaniu

    谢谢站长

  5. 5 youcan

    yskin,你好,我是一个wordpress的新手,对wordpress接触不是很久,但觉得它的扩展性真的很厉害,很值得我们去学习,我想问一下你wordpress它的插件原理是怎样的:它是如何调用那些插件的,你上面说是通过设置$locale变量,get_locale()函数读取这个变量,能不能具体一点呢?因为$locale变量、get_locale()函数在哪里我找了很久都找不出来。

    还有,WordPress通过gettext支持语言包 又是如何进行的?能给我大概说一下涉及到的php文件和函数吗?

    不好意思,问了这么繁琐的问题,我主要是很了解wordpress的插件扩展原理的,希望你能给一个wordpress新手一些指导,在此说声谢谢!!

    祝新年快乐!!

  6. 6 yskin

    新年快乐!

    研究WordPress,当然要先懂PHP才行。另外,找代码,Windows的搜索功能是不太好用的,好像对UNIX行尾符的文件支持不太好。(当然,很多人还不知道Windows有这个功能:在目录上点右键->搜索,在“文件中的一个字或词组”填入你想要找的包含在文件中的字符串。)我一般用的是WinRAR的搜索功能。到WordPress官网下载WordPress压缩包,用WinRAR打开,按F3,在“要查找的字符串”一项填入要查找的字符串,点搜索即可。想查变量,输入"$locale",就可以找到WordPress里所有使用这个变量的地方。想查一个函数的定义,输入"function get_locale(",就可以找到函数的定义了。需要说明的是,还有一种函数,比如get_post(),要多加一个符号,搜索"function &get_post("才可以。

    gettext部分,在/wp-includes/wp-l10n.php文件里。它首先include了/wp-includes/streams.php和/wp-includes/gettext.php两个文件,前一个用于缓存mo文件,后一个用于gettext功能。然后,定义get_locale()函数用于获得当前WordPress语言,比如"zh_CN"。WP本身利用load_default_textdomain()函数载入WP语言包,而模版和插件分别利用load_theme_textdomain()函数和 load_plugin_textdomain()函数载入语言包。而需要翻译字符的时候,通过__()和_e()函数来翻译,从已载入的语言包中读取字符串对应的翻译,分别返回和显示。

    学WordPress插件开发,第一要看WordPress的Codex,第二嘛,多看看别人写的插件,反正都是源代码嘛,先看一些小的插件,照葫芦画瓢,很方便的。

  7. 7 youcan

    谢谢你!yskin。经你的指导,我终于弄清楚它的原理了,不过要深入了解wordpress还要靠自己很长的一段时间去探索!我会去学习WordPress的Codex的了,希望日后在有弄不明白的时候能够得到你的指点。事实上我也在你的网站上学到了不少东西,还有“点点游”的。:)

  8. 8 zoola

      你好,你的WP BLOG办得真好,用了你的很多插件,在此非常感谢,可以交换链接蚂?你的我已经链接好了,我的WP BLOG:语录天地:http://www.eyulu.com 欢迎前往指导一下。
      有问题请教:(1)、我下载了留言簿插件怎么用?怎么调用代码?
            (2)、我安装了“中文 WordPress 工具箱”最新评论怎么调用代码?
            (3)、我也下载了你的“统计”插件,我的“统计”插件安装后怎么和你的不一样?要另加代码?
      能否指导一下我?谢谢了。

    1. 9 yskin
      1. 哪个留言簿插件啊?
      2. 中文工具箱的最新评论的函数是:get_recent_comments(),插件主页里不是写了吗?
      3. 看你的网站上,插件好像被改过。统计插件现在是2.2,3.0应该不远了,到时候可以自己定义要显示的内容。
  9. 10 zoola

    统计插件现在是2.2?在哪?可以提供一下吗?

  10. 11 yskin

    不是在插件主页吗?
    http://yskin.net/projects/wp-statistics/

  11. 12 cqcrz

    yskin,你还真能打字,Orz

    HOHO~~~~~~~~~~~~~~~~~~~~

  12. 13 你好,上帝

    yskin 你好,请问你的侧边拦的最新评论是用什么插件或是代码显示出来的...
    请教

  13. 14 yskin

    Yskin's Latest Comments,不过,这个插件还没发布嘞,嘿嘿。

  14. 15 你好,上帝

    你吊~~
    我以前2.05是用Recent Comments Widget的...差不多有你这样的效果
    现在用2.1的 就不能用的了 :-(

  15. 16 shadow

    呵呵不错~~~不过貌似用不上哈哈

  16. 17 pute

    我说的那个你快点更新哈。可以自由设定前后台语言,前台用户可以自由转换界面语言。

  17. 18 求救

    不支持MO文件,怎么办。

  18. 19 Daniel

    请问站长语言包(要很多国家的)在哪里可以下载!可否发邮件给我?谢谢

请留下您的评论: