2009/04/25

Drupal 模組的翻譯

我一直認為,中文化是推廣軟體系統最重要的一步。


Drupal 是我非常喜歡的一套開源內容管理系統,最近因為自己出來作 SOHO 接案子的關係,時間比以前在公司上班時充裕許多,所以我可以一邊作案子,一邊作 Drupal 模組的翻譯。


最近我把相關作翻譯的模組包在一起,並在 Drupal Taiwan 那邊發了文章,希望能推廣翻譯工作。


 


底下是文章內容轉載(要下載請連過去,我不想兩邊維護):


我用 Drupal with Portable APM for Windows 為基礎,加上以下模組:



包在一起,作成一個翻譯 Drupal 模組用的工具包,希望可以降低翻譯者的門檻。


Localization client 是用它重新匯入翻譯套件的功能,讓翻譯好的模組的 PO 檔可以重新匯入 Drupal 中,看到翻譯的結果。

Translation template extractor 是用它抽取出每個模組的翻譯樣板 POT 檔。

Administration menu 跟 Poormanscron 只是協助一般的操作。


Windows 下翻譯用的工具建議是用 poEdit ,它可以從 POT 檔來轉換成 PO 檔,協助翻譯工作。

線上工具我推薦底下這幾個:



翻譯工作我個人有兩個原則:



  1. 先求有再求好

  2. 隨著案子需要作翻譯而翻譯


這個 l10n 包的更新並不會像 Drupal with Portable APM for Windows 那麼快,不過它還是有幾個階段的目的:

第一階段:推廣模組與版型的翻譯。(對,你沒看錯,版型也是可以翻譯的,請看 Acquia Marina 版型正體中文翻譯檔)

第二階段:加入 Localization Server 的建置與翻譯。
第三階段:加入 OG、CCK、Views、Panels、 Internationalization 這幾個大模組的翻譯。


 

2009/04/17

可卸除 eSATA 裝置的 HotSwap

話說上個月我買了一個 eSATA / USB 雙介面的硬碟座,用起來是蠻快樂的,不過有個小問題,那就是 eSATA 裝置無法卸除。


(註:BIOS 中 SATA 必須設成 ACHI 模式,可以先用 IDE 模式,然後找 RAID / ACHI 的驅動程式裝完後,再進入 BIOS 設成 ACHI 模式)


 


後來聽說是晶片組的關係,我的板子是用 ATI 的晶片組,驅動程式不支援。


最近聽說 ASUS 出了 NVIDIA 980a SLI 的板子,是有點想敗下去,不過根據某主機板大廠工作的朋友講,NVIDIA 晶片的問題也不少,建議我再考慮。


 


後來我想說想測看看 NVIDIA 的板子是否真的可以卸除 eSATA 的裝置,於是今天我到了另外一位有人的家中借他的板子作測試,結果的確是可以。


不過我的這位友人很親切的告訴了我一個小程式:HotSwap


這個程式可以用來移除 eSATA 的裝置,我用了之後果然不錯,蠻符合我的需求,而且 ATI 晶片的板子也可以用。


唯一美中不足的部份是 Spindown 功能沒有作用~


不過因為 Spindown 沒作用,所以裝置卸除後,關掉硬碟座的電源後,不可以立刻把硬碟拔起來,要等大約10秒鐘,等讀寫頭自動歸位後再拔比較安全。

2009/04/11

佈景主題的列表樣式

今天心血來潮,想來換一換部落格的佈景主題,不過選來選去,每個佈景主題對於文章中內文的列表樣式都是 none。


另外就是固定寬度的問題,這對有寬螢幕的人實在是一種折磨,其他還有一些小問題...


這實在是很糟糕,所以手動改了改,在 部落格 » 樣式管理 » 樣式設計精靈 » CSS 原始碼編輯 加上以下的樣式即可:


 


/* 列表樣式 */
.article-content ol, .article-content ul {margin:1em; list-style-position:inside;}
.article-content ol {list-style-type:decimal;}
.article-content ul {list-style-type:disc;}

/* 所有文章列表 */
.box-more {display:inline;}

/* 分頁 */
.page {text-align:center;}

/* 比例寬度 */
#container2 {width:95%;}
#content {width:75%;}
#links {width:20%;}

2009/03/30

Drupal 的所見即所得編輯器

在 Drupal 裡面有許多的所見即所得編輯器,比如說: TinyMCE 和 FCKEditor 是兩個比較為大家熟知的。


不過在設定上,有些只允許本文輸入的狀況,常常需要為不同的 class 或是 path 設定例外條件,以免把所有的 TEXTAREA 都變成所見即所得的編輯畫面。


而 WYSIWYG API 就比較聰明,它可以根據輸入格式(Input Format )來設定不同的編輯器,這樣就無須設定例外條件了。


WYSIWYG API 也支援各種不同的所見即所得編輯器,包括:



  • FCKeditor

  • jWYSIWYG

  • markItUp

  • NicEdit

  • TinyMCE

  • Whizzywig

  • YUI


這些編輯器支援的功能不一,使用者可依需要來選擇使用。


接下來我來說說這些編輯器的的一些問題:



  • FCKeditor:自訂按鈕時,最多只有一排,超過編輯框寬度會被截掉。

  • YUI:按鈕會變成垂直排列。

  • TinyMCE:在 TinyMCE 3 時,如果有選 Flash 按鈕的話,所有的按鈕會消失不見。


TinyMCE 3 的 Flash 按鈕解法: TinyMCE 3 沒有 Flash 按鈕的 Plugin,要改成 Media 按鈕的 Plugin,所以需要修改相關的程式。


找到 [模組目錄]/wysisyg/editors/tinymce.inc 中的 wysiwyg_tinymce_plugins 函式。


註解掉以下幾行:


    'flash' => array(
      'path' => $editor['library path'] .'/plugins/flash',
      'buttons' => array('flash' => t('Flash')),
      'extended_valid_elements' => array('img[class|src|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name|obj|param|embed]'),
      'url' => 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/flash',
      'internal' => TRUE,
      'load' => TRUE,
    ),


 


將函數最後的:


  if ($editor['installed version'] > 3) {
    $plugins['xhtmlxtras'] = array(
      'path' => $editor['library path'] .'/plugins/xhtmlxtras',
      'buttons' => array('cite' => t('Citation'), 'del' => t('Deleted'), 'abbr' => t('Abbreviation'), 'acronym' => t('Acronym'), 'ins' => t('Inserted')),
      'url' => 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras',
      'internal' => TRUE,
      'load' => TRUE,
    );
    $plugins['safari'] = array(
      'path' => $editor['library path'] .'/plugins/safari',
      'extensions' => array('safari' => t('Safari compatibility')),
      'url' => 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/safari',
      'internal' => TRUE,
      'load' => TRUE,
    );
  }


換成:


  if ($editor['installed version'] > 3) {
    $plugins['xhtmlxtras'] = array(
      'path' => $editor['library path'] .'/plugins/xhtmlxtras',
      'buttons' => array('cite' => t('Citation'), 'del' => t('Deleted'), 'abbr' => t('Abbreviation'), 'acronym' => t('Acronym'), 'ins' => t('Inserted')),
      'url' => 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras',
      'internal' => TRUE,
      'load' => TRUE,
    );
    $plugins['safari'] = array(
      'path' => $editor['library path'] .'/plugins/safari',
      'extensions' => array('safari' => t('Safari compatibility')),
      'url' => 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/safari',
      'internal' => TRUE,
      'load' => TRUE,
    );
        $plugins['media'] = array(
            'path' => $editor['library path'] .'/plugins/media',
            'buttons' => array('media' => t('Insert media')),
            'url' => 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',
            'internal' => TRUE,
            'load' => TRUE,
    );
  } else {
    $plugins['flash'] = array(
      'path' => $editor['library path'] .'/plugins/flash',
      'buttons' => array('flash' => t('Flash')),
      'extended_valid_elements' => array('img[class|src|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name|obj|param|embed]'),
      'url' => 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/flash',
      'internal' => TRUE,
      'load' => TRUE,
    );
    }


即可。


 

2009/03/12

快速升級 CakePHP

底下是我用來升級新版的 CakePHP 的作法:



  1. 解壓縮新版的 CakePHP 壓縮包

  2. 刪除解壓出來的所有 .htaccess


    • <解壓目錄>\.htaccess

    • <解壓目錄>\app\.htaccess

    • <解壓目錄>\app\webroot\.htaccess



  3. 更名以下檔案


    • <解壓目錄>\app\config\bootstrap.php => bootstrap.php.default

    • <解壓目錄>\app\config\core.php => core.php.default

    • <解壓目錄>\app\config\inflections.php => inflections.php.default

    • <解壓目錄>\app\config\routes.php => routes.php.default



  4. 將解壓出來的檔案複製到程式目錄中


 

2009/01/06

回應 jaceju 抽象的意義

原文在此 http://www.jaceju.net/blog/?p=375


剛好我去年曾經實做過 DB Layer,對於抽象我有自己的看法。


首先相對於抽象,在編程上就是實做,換言之,抽象是訂定實做規格前必要的手段。
再來是抽象到底抽掉了什麼象?經驗告訴我,抽象是把介面從細節的「現象」抽出來。


用工程的角度來說,抽象是標準化的手法,它可以讓我們更快的瞭解一個系統。
不過抽象也有盲點,因為他抽掉了細節上的現象,所以在實做的時候,必須把細節補回去。


一來一往這就構造了一個系統。

2008/12/29

一年離職的魔咒

我上班從未堅持過一年。


最近,我又要離職了,這份工作將於2008-12-31日劃下一個句點。
這半年來,尤其是這兩個月,許多不利於上班族的訊息不斷在媒體中放送,例如:不景氣、無薪假、裁員等等。
我常常在想,家庭、社會、公司給每個人的歸屬到底是什麼?為甚麼大多數人害怕失業?


我在上一份工作上瞭解到家庭的牽絆,當時是在一個討論勞健保自付額度到底要選擇扣多少%的問題。
個人是傾向扣多一些,因為當時我拿了薪水也不知道要幹麻。
不過當時有家庭(累)的同事們都傾向扣少一點,讓他們能夠有多一點錢去付房屋貸款、小孩的學費等等。
我不知道是幸運還是不幸,目前沒有對象,也沒想過交一個,父母對此也無期待。
雖然已過而立之年,但心中還有一股衝動,想要對世界有些貢獻。


有點離題了,讓我們回到失業的恐懼這個話題上。
我認為,不論是主動還是被動,失業這件事情其實不應該是會讓人恐懼的。
從客觀的角度看,公司並不屬於全體員工,而是屬於公司的經營階層的那一小群人所有。
這些人決定了公司的一切,所以,公司會有「負責人」這個角色,這個角色明明白白告訴我們,公司並不屬於全體員工的。
因此,失業變成了一個平常的事件:人總會來來去去,因為員工不能掌握自身的被僱用權力。(注意,我用的是權力而非權利)


平常的事情像什麼呢?像吃飯、喝水、睡覺一樣。這些東西太平常了,所以讓我們日用而不知。
失業對我來說是稀鬆平常之事,沒有「上班」並不會對我有所損害,重要的是,我有沒有「工作」。
工作是什麼?工作是實現人生唯一的途徑,無論你做的是什麼樣的工作。
我失業、不用上班,但我仍然有工作,只是這工作沒有人會發給我薪水,也不會有人給我鼓勵與支持。


我不知道其他人的選擇是什麼,但我知道我父母的選擇是要那份薪水。
我感謝我父母過去的努力和選擇,讓我可以有選擇的權利(與任性),現在,輪到我了~