Archive for April, 2007

也谈拼音输入法

2007-4-18 20:59 | by 2ndboy

  在 Google 拼音输入法推出的最近一段时间里,围绕着 Google 抄袭搜狗拼音词库的各种报道铺天盖地。我一直是紫光拼音的忠实用户,搜狗拼音只是简单的试用过一下而已,没有太多体验。Google 拼音刚发布我就开始下载试用,目前在经过几次升级之后 Google 拼音已经改掉了一些全角字符和中文符号的 bug,目前已经成为了我的首选输入法。

  今天说点有意思的事情,杭州有条路叫“保俶路”,中间这个字读“chu4”,同“触”的音。晚上 GF 在网上查电子地图的时候用紫光怎么都打不出这个字,我用 Google 拼音试了一下,结果顺利找到。于是顺便测试了一下目前安装的几种拼音输入法:
智能ABC 5.0:打不出
紫光拼音 5.0.0.5076:打不出
微软拼音 2003:可以打出
Google 拼音 1.0.17.0:可以打出

  结果真是让我对使用了这么久的紫光拼音有点失望,设置里明明使用的是 GBK 字符集,但就是找不到这个“俶”字。最近听说紫光拼音要出 V6 了,希望在各方面都能有所改进!

  经过这么多天的试用,我对 Google 拼音很是满意,但是每次切换到 Google 拼音时的速度实在不能让人满意,应该说这是现阶段我觉得谷歌拼音最大的不足,希望以后版本中可以改进。

  凭借搜索引擎之利,应该说 Sohu 和 Google 做输入法都很有先天优势,可以收录超大而又最新的词库,让拼音输入法的准确率大幅提高。不管怎么说,希望这几种输入法都能越来越好,造福使用中文的普罗大众:)

用 Smarty 实现多语言网站

2007-4-12 22:03 | by 2ndboy

  用 PHP 实现多语言的正途似乎是 gettext 函数族,但是用 gettext 也有很多不方便的地方,今天实现了一种利用 Smarty 来实现多语言 B/S 应用的方法。最后希望达到的效果是程序中除了切换语言的地方,其它地方能够完全不用关心当前的显示语言,比如同样的 $Tmpl->display( ‘welcome.tpl’ ) 在中文状态下会显示中文的欢迎页面,而在英文状态下就显示英文欢迎页面。

  既然对 Smarty 对象的调用方式在不同语言下保持一致,那么就要拿 Smarty 类来开刀啦。Smarty 里面把模版“实例化”的接口有两个,一个是 display(),另外一个是 fetch(),而 display() 内部其实调用了 fetch(),所以关键点就在于改造这里。从 Smarty 派生一个新类 CSmarty,重载其中的 fetch() 和 display() 接口:

  1.  class CSmarty extends Smarty
  2.  {
  3.      function CSmarty()
  4.      {
  5.          $this->Smarty();
  6.      }
  7.      function set_dirs( $lang )
  8.      {
  9.          $base_path = '2ndboy/';
  10.          $this->template_dir = $base_path . $lang . '/templates/';
  11.          $this->compile_dir  = $base_path . $lang . '/templates_c/';
  12.          $this->config_dir   = $base_path . $lang . '/configs/';
  13.          $this->cache_dir    = $base_path . $lang . '/cache/';
  14.      }
  15.      function fetch( $template, $cache_id = null, $compile_id = null, $display = false )
  16.      {
  17.          $this->set_dirs( $_SESSION['lang'] );
  18.          if( !$this->template_exists( $template ) )
  19.              $this->set_dirs( 'en' )// Default language is English
  20.  
  21.          return( parent::fetch( $template, $cache_id, $compile_id, $display ) );
  22.      }
  23.      function display( $template, $cache_id = null, $compile_id = null )
  24.      {
  25.          $this->fetch( $template, $cache_id, $compile_id, true );
  26.      }
  27.  }
  28.  ?>

  可以看出,上述代码把当前的显示语言设置放在 session 里面,所以还要有针对语言切换操作设置 session 的响应代码:

  1.  if( isset( $_REQUEST['lang'] ) )
  2.  {
  3.      if( 0 == strcasecmp( 'cn', $_REQUEST['lang'] ) )
  4.          $_SESSION['lang'] = 'cn';
  5.      else
  6.          $_SESSION['lang'] = 'en';
  7.  
  8.      header( 'Location: ' . $_SERVER['HTTP_REFERER'] );
  9.      exit;
  10.  }
  11.  ?>

假设上述代码放在 index.php 里面,那么用 index.php?lang=en 就可以实现把当前语言切换成英文的操作,注意代码里设置完显示语言后会跳转到 referer 所指的页面,这样处理可以实现切换语言后所在位置不变的效果。

  以上的代码实现要求模版路径下的目录结构这样布局:第一级目录采用语言名,如 cn,en 等,各个语言目录内部再按 Smarty 的惯例分成 templates、templates_c、cache 等等。

  下面再发挥一下想象力,让程序自动识别用户熟悉的语言,比如老外访问看到的是英文内容,国人访问看到的是中文内容:

  1.  session_start();
  2.  if( !isset( $_SESSION['lang'] ) )
  3.  {
  4.      if( strstr( $_SERVER['HTTP_ACCEPT_LANGUAGE'], 'zh' ) )
  5.          $_SESSION['lang'] = 'cn';
  6.      else
  7.          $_SESSION['lang'] = 'en';
  8.  }
  9.  ?>

其实就是通过分析客户端浏览器可接受的语言来设定默认显示的语言:)

  呵呵,其实两年多以前就实现过这个功能,今天是旧瓶装新酒,把之前的实现加以改进放上来晒晒,不知各位看官有收获没?:D

运气

2007-4-7 12:09 | by 2ndboy

  今天运气很好,纪念一下!

今日杂谈

2007-4-3 22:00 | by 2ndboy

  在 China-Pub 订的《Programming Ruby 中文版:第 2 版》上周末送到,没想到居然是那么厚的一个大部头,貌似英文电子版没有那么多内容吧?书买来了总不能浪费,以后要抽时间把参考部分之前的内容读完。BTW,这本书的函数参考部分真是多,居然占了全书的一半!

  最近右手手腕不太舒服,究其原因还是职业病,用非人体工程学的键盘和鼠标的时间过长,正好,以后打算减少在电脑前的时间,咱改成看书啦:)

—–

  MSIL 就是 .NET 时代的汇编呀,想当初靠着 IDA 看懂过不少没代码的东西,也破解过简单的小东西,但是第一次看到 MSIL 的代码还是晕啦,跟 Win32 汇编完全不是一码事。当然,在 Google 的帮助下找了一些文档看了看终于还是入了 MSIL 的道,其实这东西还是比汇编简单很多的,没有那么多寄存器的习惯约定,只有一个栈,只要时刻搞清楚栈里有什么就没问题。在这一点上,MSDN 的资料就好多啦,我一开始从网上下载了一个 MSIL 指令参考手册,但是对照着 MSIL 代码还是看不明白,等看到了 MSDN 上对 MSIL 每条指令的栈操作解释以后,一切都水落石出!

—–

  最近看过的电影有《风语者(Wind Talkers)》、《我们俩(You And Me)》、《爱情呼叫转移》、《无间道风云(The Departed)》和《少年汉尼拔(Hannibal Rising)》,基本上除了最后一部之外都挺喜欢。

  每周固定的节目还包括看最新的《Lost》和《Prison Break》,很着急的想知道 Lost 里面的小岛到底是怎么一回事,虽然不断有东西被掀去幕布,但还是有太多的未解之谜。

—–

  上周末终于买了婚戒,订了婚纱照,一个月后就是已婚人士了:D