Today's the day

向软件大牛炫耀我会焊单片机,向硬件大牛炫耀我会写 Rails,向软硬件大牛炫耀我生物,向软硬件生物大牛炫耀我会折腾期货 -_-bbb

多语言顺利进行中

顺利的把语言信息通过 Gettext 提取了出去,完全的体力活,干得非常郁闷……

另外发现自己英文实在是太烂了,“文章数量” 翻译成 “Article number”……   不过我相信大家的智商,应该能看懂我要表达什么。

嗯嗯,看上去还挺像样的~

麻烦的皮肤问题

Chito 的皮肤和一般的 Blog 皮肤一样,都包含了模板 ( 也就是 rhtml 文件) ,还有就是 CSS 和图像这些静态文件。

众所周知,Rails 的模板文件一般在 app/views 目录下,静态文件要放在 public 下,不过一个皮肤是一个整体,总不能让别人每次下载一个皮肤回来,就要把模板和静态文件拷贝到不同的位置。

Typo 的实现方法倒是比较有趣,模板和静态文件都放在 public 之外,找不到文件的请求会转向 ThemeController 上,然后再把请求的文件拷贝到 public 目录下,这样下次请求就会找到了。不过总觉得这样有点小题大作,与其这样,还不如建个 rake 任务,运行一下就自动把 theme 中的静态文件拷贝到 public 目录下,或者 rails 启动的时候,把静态文件一股脑拷过去。

还有一种方法就是干脆把模板文件也放在 public 目录下,缺点就是别人也能看到你的模板内容了,里面如果没有什么敏感信息的话倒是不算问题,但是就算现在没有,也不能保证以后没有,所以这种方法 pass ……

没想到这个问题这么麻烦。

准备用 Ruby-Gettext 国际化 Chito

也算是积攒经验吧,准备把 Chito 国际化。Rails 下的国际化方案有不少,复杂度和功能上都差别很大,可以参考这篇文章 InternationalizationComparison 里面对比了几个 Rails 的国际化方案,看下来还是决定用 Ruby-Gettext

Gettext 是个非常老牌和广泛使用的国际化、本地化实现,文档非常丰富,功能也非常强大,支持的 locales 也很多,po 文件还有专门的跨平台编辑器 poEdit,这样即使非编程人员,也可以用 poEdit 来轻松翻译程序中的文字信息。

Ruby-Gettext 的资料也不少,可以参考下面这两个:

Ruby-GetText-Package HOWTO for Ruby on Rails

Using Gettext To Translate Your Rails Application

中文的可以参考这篇在 IBM Developer Work 上的文章:

Ruby 和 Rails 的国际化与本地化技术

查看可能需要注册,如果你懒得注册,可以去看下面这个在 ruby-lang.org.cn 上转载的:

Rails 的国际化和本地化技术

别看这些文章洋洋洒洒写了那么一大篇,其实用 Ruby-Gettext 国际化 Rails 网站很简单,如果你原来对 Gettext 有一些了解的话,会发现和国际化普通的程序没有什么两样~

现在只是比较担心插件的部分国际化,不知道能不能把语言信息和插件打包在一起,不过现在也不用考虑这么长远,到时候遇到问题再解决就是了~

Chito 小白鼠版

单机版的基本的工作差不多完成了,愿意当小白鼠的可以下这个测试版玩玩~ 

此版就是目前 Chito 目录的一个打包,所以包含所有的插件和皮肤,没有充分测试过各个部分和细节,所以不要拿这一版做实际应用~

放到了 Google Code 上:

http://chito.googlecode.com/files/chito-demo.tar.bz2

安装和其他 Rails 程序完全一样:

  1. 解压
  2. 建立数据库,开发数据库名称是 chito_dev
  3. 修改 database.yml 填上正确的数据库密码
  4. rake db:migrate
  5. ruby script/server
  6. 浏览器访问 http://127.0.0.1:3000

Ruby 中获取目录大小

查了查,Dir 类没有 size 方法,也没找到现成的解决方案,自己动手吧~

当前 Chito 中统计目录大小完全是偷懒的方式

  1. class Dir
  2.     def self.size(dir)
  3.        `du -s #{dir} | awk '{print $1}'`.to_i
  4.     end
  5. end

直接调用 du 这个程序然后把结果转换成数值就可以了,非常方便~  不过要是运行在 Windows 下就不灵了,只好自己写代码统计下:

  1. class Dir
  2.     def self.size(dir)
  3.         sum = 0
  4.         Dir.foreach(dir) do |entry|
  5.            next if entry =~ /^\./
  6.            path = File.join(dir, entry)
  7.            FileTest.directory?(path) ? sum += Dir.size(path) : sum += File.size(path)
  8.         end
  9.         sum
  10.     end
  11. end

不过计算目录大小是个很慢的工作,尤其时文件夹嵌套很深,小文件又很多的时候,缓存一下是很必要的,当新文件上传或者删除设置个 dirty 标记,dirty 标记存在的时候再去重新获取。