rails l10n in 2.1

一般來說,使用Localization plugin,我們的程式就可以做到localization的需求。不過從GitHub上下載下來的plugin 只能自動抓出view內需要翻譯的字串,想要抓出model、controller、甚至helper內需要翻譯的字串就顯得無能為力。

還好,要讓它修改為能夠自動掃描所需字串的方式並不困難,只是要作一點點的Hack而已:

# 在localization/lib/localization.rb內,找到generate_l10n_file method,然後以下面的程式碼段取代掉整個method就好。

def self.generate_l10n_file
 
    file_collection = []
    file_collection.concat(Dir.glob("#{RAILS_ROOT}/app/views/**/*.html.erb").collect)
    file_collection.concat(Dir.glob("#{RAILS_ROOT}/app/models/**/*.rb").collect)
    file_collection.concat(Dir.glob("#{RAILS_ROOT}/app/helpers/**/*.rb").collect)
    file_collection.concat(Dir.glob("#{RAILS_ROOT}/app/controllers/**/*.rb").collect)
 
    "Localization.define(‘en_US’) do |l|\n" <<
    file_collection.collect do |f|
#      ["# #{f}"] << File.read(f).scan(/<%.*[^\w]_\s*[\"'](.*?)[\"']/)  #原來的樣式比對
      ["# #{f}"] << File.read(f).scan(/_\(['\"](.*?)['\"]\)/)
    end.uniq.flatten.collect do |g|
      g.starts_with?(‘#’) ? "\n  #{g}" : "  l.store \"#{g}\", \"#{g}\""
    end.uniq.join("\n") << "\nend"
  end

當然,如果有翻譯api/lib內檔案的需求,也可以直接增加 file_collection 那幾列的敘述來抓到檔案。

至於要把這些字串存檔編輯,則更簡單明瞭。首先開啟 rails console,然後把它當成檔案寫入就好了:

file = File.open("lang/en_US.rb", "w")
file.write(Localization.generate_l10n_file)
file.close

這樣就會在lang下產生en_US.rb,然後就可以把檔案交給翻譯去做事了。

BTW,9月出的Rails 2.2據說會內建多國語言支援,所以這解決方案也算是臨時的而已吧

Posted by Stevennick Thu, 04 Sep 2008 08:06:00 GMT


Alpha version: Rev. 60 is out!

就在今夜,(一切比我預期的時間還要晚了兩天的)TravelLog正式進入第一版本了!

可喜可賀、可喜可賀、可喜可賀、可喜可賀~

經過了大大小小無數次的測試、修改及設計,目前的TravelLog系統已經有個基本的雛型出來:我們在內部掛上了簡單(到不行,至少我是這麼想的)的blogging介面,然後我們也加入了位置紀錄功能,還有同樣簡單易用(因為很陽春)的相片系統。雖然是說第一版,可惜的是,目前整套系統僅僅提供各位在花花綠綠的網路世界中,垂手可得的基本功能而已。因此,我們未來的目標,將會非常著重這個服務一開始所訴求的整合功能,我們也期待,未來的某天,您也能夠體驗我們的創意,或者提供更棒的點子給我們知道。第一版本的TravelLog將於近日內進行佈署,若您迫不及待想要測試它提供哪些新功能,請按下後面的連結來立即體驗!

TravelLog System: http://stevennick.dyndns.org:3000

基本功能(截至目前為止):

  1. 提供站內使用者資訊
  2. 站內個人部落格
  3. 站內個人相片集
  4. 位置管理

注意事項:體驗網站內的所有資料僅供測試使用,因此您的資料儲存將不會受到保證!請勿在體驗網站儲存任何真實資料。

Posted by Stevennick Sat, 16 Aug 2008 18:37:00 GMT


FCKEditor Plugin for Rails

引用 winson@午夜盧比人說過的一句話:

玩Rails的人沒有不裝外掛的。

要讓編輯文字頁面看起來(還有使用起來)一躍千里,選個好的 Editor 作為輔助是非常經濟實惠又非常有效的。FCKEditor是目前非常穩定的一個 text editor,而 FCKEditor Plugin for Rails則讓兩者的結合更加簡單。

使用步驟:

  1. 安裝:uby script/plugin install svn://rubyforge.org//var/svn/fckeditorp/trunk/fckeditor 一行解決
  2. 引用:在要使用FCKEditor的對應 Layout 中,加上 <%= javascript_include_tag “fckeditor/fckeditor” %>
  3. 修改相對應的View,把原本的 textarea 換成plugin 的輔助方法:

    <div id="<%= fckeditor_div_id("ControllerName", "paramsElementName") %>">
        <%= fckeditor_textarea("ControllerName", "paramsElementName", :height => "400", :width => "750" ) %>
    </div>
這樣就好了,如果要調整控制項的話,去 public/javascripts 下修改 fckcustom.js 就可以了。當然,要記得照著使用說明來做才會事半功倍。
 

 

Posted by Stevennick Tue, 12 Aug 2008 14:01:00 GMT


Namespaced Routes

根據 Rails 發佈公告,以及 Rolling with Rails 2.0 - The First Full Tutorial - Part 1 的記載,Rails 從2.0開始就增強了原來的 Namespaced Routes,不過我在試用的過程中卻出現很意外的狀況。

假設我現在的系統有個使用 scaffold 建立起來的 Article Model (當然還有對應的 ArticlesController 以及 Views ),然後我只要開始建立 Namespaced Routes 就會踩到地雷:

script/generate controller Admin::Articles # Rails raise ether Admin::ArticlesHelper is used or reserved by Rails.
script/generate controller Foo::Articles # Same above.

不信邪的我,就把複數的Atricles改成單數重做:

script/generate controller Admin::Article # Success.
script/generate controller Admin::Articles # Success!! why?

然後,其他相同的controllers直接使用複數型態就可以成功建立起來了。。。

難道RoR也在趕流行慶鬼月?

Posted by Stevennick Tue, 12 Aug 2008 12:56:00 GMT


開版文~

Celebration~~~

This is my first post in this travellog~~

 

Posted by fish Sat, 02 Aug 2008 06:58:00 GMT


公告

本服務目前屬於Private Development,若您有興趣參與測試工作,請於我們的DevBlog中留言。我們將於收到您的留言後,開啟您的測試權限。

Posted by Stevennick Fri, 01 Aug 2008 19:29:00 GMT


跨站整合認證

要做到Rails Web Application跟其他網站的相互認證,在實作上會因為環境的不同而有不同的實踐方法。

同一網站上的Apps相互認證,可以透過使用者端signed cookie、WebService以及另立daemon的方式進行認證,不過今天要講的認證方式跟以往不太一樣。

根據開發者文件,我們的程式要跟mhfans做使用者認證,而mhfans僅提供php函式接口,這就表示我們無論如何都要另外寫一個php script作為socket program,然後再想辦法讓Rails Web Application讀取認證訊息。

目前的情況是,使用者欲登入時,系統將會導入使用者到mhfans login screen,待使用者輸入帳號密碼後,mhfans將會於使用者遊覽器設定cookie,並加入session資訊,隨後會將使用者頁面導回我們指定的位址,而對於認證成功後的使用者,我們會取得(也只會取得)該使用者的「帳號」作為後續動作。

我在設計認證系統時,曾經考慮過使用控制session及cookie的方式進行操作,不過mhfans似乎有鎖定該功能,導致寫入的script完全無法正常作用。另如前述,php script只會得到驗證通過的使用者名稱(即帳號),除此之外不會有任何東西回傳給我,因此若要直接使用帳號作為驗證token不但是極為危險也毫無意義。因此我最後想到利用「金鑰」進行密碼學上的金鑰認證,成功做出Rails Web Application的跨站整合認證功能。

首先,我們要假設自己的 Rails程式是安全的(這是廢話…),並且保存著一組私鑰。(請注意,我不是說這「份」,而是這「組」。為了增加安全性,私鑰除了會隨時間自動更新以外,還會以自訂的加密演算法進行處理。)然後對於作為socket program的php script,也保存著一份相同的私鑰。而認證通過的使用者名稱,自然就是加密對象的明文。為了要達成整合認證的功能,在使用認證服務前,我們的系統需要使用者先宣告自己的mhfans帳號,並(如果使用者希望的話)與某一組系統帳號進行單一連結。

程式大概是這樣運作的:

首先,在我們的系統上,使用者先輸入系統帳號、或是mhfans帳號。然後我們的系統會以私鑰加密明文成為一組token,隨後我們將這組token暫存於Server中。接下來,若使用者一開始是輸入本站帳號,則將會被導向至mhfans的帳號輸入頁面,上面會出現預設的mhfans帳號名稱。使用者要完成的工作,就是輸入mhfans的密碼。若密碼輸入錯誤,使用者將會被滯留在mhfans的服務畫面中,而我們的socket program也不會被執行。直到使用者在mhfans認證成功後,mhfans的認證系統會負責啟動我們的php socket program,然後我們的php script會接收到mhfans回傳的使用者名稱,並且使用相同的私鑰加密字串後將密文token回傳到我們的Rails program。這時候,我們的程式就會將暫存的資料調出然後進行比對,隨即清除暫存的token。若使用者正確,則兩組token將會是一模一樣的內容;否則在認證過程中一定有出現問題。只要一進行認證就刪除token的原因,是為了要避免入侵者使用暴力測試進行密文嘗試。一旦密文產生錯誤,則即使隨後密文為正確結果,系統也將不給予認證。

拜現代的技術進步所賜,這個php script最後的內容出乎我意料的簡單。整個程式含註解、空行也僅30行而已。而且script本身並不進行內容輸出,所以程式碼非常簡潔,在使用者體驗間也幾乎成為透明認證。在我的專案中,我們透過與mhfans進行相互認證,令大部分就讀台灣的大專院校在學學生都可直接登入本系統。若您的網站也需要解決類似問題,或希望實現SSO機制的話,可以將此整合認證方式作為考慮選項之一。

Posted by Stevennick Fri, 01 Aug 2008 18:07:00 GMT


Second post!

Just for test.

Posted by Stevennick Fri, 01 Aug 2008 09:04:00 GMT


Hello World!

Welcome to Typo. This is your first article. Edit or delete it, then start blogging!

Posted by Mr Typo Tue, 29 Jul 2008 08:48:36 GMT