Localzation Client 的安裝與使用,及同步協調翻譯

在過往,你可以透過官方的 Localized Server 進行協調翻譯工作,大家必定發現純粹看句子,太難譯了,也常會錯意思。Localization client 正在這方面作出補充,提供 UI 方式進行翻譯工作,非常友好。而且現在能與 Localized Server 同步資料了!!

進行初期安裝

安裝 Localzation Client 非常簡單,如同一般模組。為了更簡化,官方也有了安裝檔案:Localized Drupal install profile,現在來看看。

  1. 首先可以到這裏取得最新的安裝檔案 (core.tar.gz 包含了 Drupal 在內),我們選擇這個作例子。
  2. 下載後如常解壓縮,並進行安裝。在安裝第一步選取 "",然後選擇 "Chinese, Traditional (繁體中文) ",這會自動化地將翻譯由 Localized Server 中下載。
  3. 如常進行 Drupal 安裝餘下的工作。

安裝後設定與 Localized Server 同步資料

在這裏大家請注意,與 Localized Server 同步資料的意思,並不只是從 Server 中取得翻譯,而是你所作的一切動作,都會同步儲存至 Server 上,所以在進行個性化的翻譯時,不要與 Server 進行同步。至於你所提交的翻譯,也會如常在 Server 中進行一般性的審核程序,所以不用太擔心弄亂大家的工作。

由於 Drupal 7 中含有 Overlay,Overlay是額外在一個層上工作,Localization client 目前並不支援。為了方便翻譯,我們先把它關掉:

  1. 至模組設定頁面:[#overlay=admin/modules]
  2. 關掉 Overlay

然後至語言設定頁面中,看看是否啟用了與 Server 協調同步:

[admin/config/regional/language/share]

需要同步,怎麼可能沒有身份確認呢 ?? Server 提供了 API KEY 給大家作認證工作:

  1. 登入帳號 (這是你自己架設 Client 端中的帳號),並按下編輯帳號 (如:user/1/edit)
  2. 按下畫中連結至 SERVER 中取得你的 API KEY,並填好

** 假如還沒有 Drupal.org 帳號或未成為繁體協調翻譯一員,請先加入:http://localize.drupal.org/translate/languages/zh-hant

使用 Localization client

** 如果你使用 Profile 進行安裝,需耍將預設介面語言變更為非 English,Localized Client 才會顯示。

在任何頁面中,按下 Translate Text 便可進行翻譯了,看圖作文吧:

小技巧:
Localiztion client 提供有快速鍵 CTRL + SHIFT + S

  • 快速鍵可以打開或關閉翻譯視窗
  • 當選擇了文字時,按下快速鍵,可以直接進行搜尋

覺得 CTRL + SHIFT + S 很難按的話,可以打開模組下的 l10n_client.js,並修改這一行:


this.keys = {'toggle':'ctrl+shift+s', 'clear': 'esc'}; // Keybindings

** 在 Firefox 3 之下進行搜尋是極慢的,可能出現假死現像,多加注意。

Drupal 7 的翻譯並沒完全,現有字詞也並不固定,看到有錯,快點提交建議,也當試試用這個模組吧!不論模組還是翻譯,怎有一天你會使用到,及早作準備 ^_^

Localized Server 繁體中文:
http://localize.drupal.org/translate/languages/zh-hant

Drupal 模組專案本地化狀況:
https://notabluescreen.com/localize/zh-hant.php

Drupal 7 大不同:關於人的事

人多,就會有麻煩出現,這是不可改變的定律。Drupal 7 引入不少關於 "人" 的功能。

  • IP address blocking [admin/config/people/ip-blocking]

    可以透過 IP 來封鎖該死的人,這不是一個新功能,但簡化及核心上有改變。可惜這功能很弱,不能一次封鎖整個 IP 段,還只能每次輸入一個。難道是為了增加可用性,開發這功能給超級純用戶端的使用者?不太敢這麼想像,Drupal 不是走這種風格的,Drupal 8 應該要去除這個沒用的功能界面。現在除了很沒質素的免費主機外,還有多少是不支援 .htaccess 的 ? 建議大家要封鎖的話,直接使用 .htaccess 便可,VPS的使用者透過防火牆更好,對系統負載也有所減少。
  • 加入使用者登入的暴力攻擊防護

    "Sorry, there have been more than 5 failed login attempts for this account"
    什麼?不用驚訝!Drupal 7 中,只要猜五次密碼不成功,就會將你的帳號鎖上。這功能原意是不錯的,可惜並沒有提供 UI 讓你修改相關的參數,也就是說,你要更改為十次不成功才封鎖,就要安裝一個模組 (Flood control),或透過手動去修改。
    Flood control 只是提供一個界面來改動 Drupal 的系統變量,可以手動從資料庫的 variable 表或 variable_set() 來設定

    user_failed_login_ip_limit
    user_failed_login_ip_window
    user_failed_login_user_limit
    user_failed_login_user_window
    contact_threshold_limit
    contact_threshold_window
    

    但為什麼封鎖 IP 有 UI,這沒有呢 ? 可用性在哪去了 ?? 其實這樣的封鎖方法是很弱的,任何人很簡單寫程式捉取使用者列表,便可以攻擊你,雖然未必取得使用者密碼,但能使你成千上萬的使用者都要重新進行 EMAIL 驗證,這算不算安全問題就看你想法囉!
    關於密碼,Drupal 7 將使用更安全的 sha-256 算法取代 MD5,外部程式要注意這點改變。

  • 取消使用者帳號
    可以設定容許特定的使用者取消自己的帳號。在帳戶設定中,更能設定取消後,使用者本來發佈的內容如何處理。這是不錯的新功能,可是大家都這麼喜歡談我的網站擁有多少用戶的商業環境,誰會隨意讓人刪除自己的帳號?你 Google 了多少次 Facebook 才能將帳號刪除?
  • 管理員角色
    只想特定的人員管理某功能? Drupal 7 終於能實現了,你可以增加新角色自由設定他們的管轄範圍。說到管理者,大家可以看看此兩個模組:Admin RoleMasquerade
  • 物極必反,太多管制也不是好事。在 Drupal 7 中將 Access Rules 從核心中移除,取而代之是上面那個輕量級的 IP 防護及模組:User restrictions

People

在 Drupal 7 中,一些Drupal 6 中的 User management 功能將移至 People 區域去。據說這是Drupal 7 IA 的設計,在概念中的 People 指的包含了註冊使用者、匿名,還有…. (好了,我搞不懂這麼抽象的理論!所以中文化若譯為使用者管理、用戶是不太對的)。

對於我們這些不懂事的人來說,就是不明白為什麼關於人的地方卻找不到相關的設定功能 ….

Drupal 7 提倡改善使用者體驗,因此在權限設定中加了說明。

除了界面的事,Druapl 在內裏也有些變化,詳細參看:

Node Access in Drupal 7

整合舊網站資料至 Drupal (利用 node_save() 建立 Node)

要從舊有的網站,轉移至 Drupal,是否很頭痛?? 怎麼 Drupal 建立一個 NODE 會改動這麼多資料表啊!! 該怎麼好呢? 請永遠緊記 Drupal API 是你的朋友!

透過編寫程式建立 Drupal Node

我們的編寫步驟及方向流程:

  1. 如果你還未會建立 Drupal 模組或要從外部執行,可使用 bootstrap 將它們連結起來。
  2. 從其他程式的資料庫或任何途徑取得你想要的資料 (PHP 你不會? 那請關閉此網頁)
  3. 透過 Drupal API node_save() 儲存到 Drupal 資料庫中
  4. 上 Youtube 看一會短片,讓程式自己運行

簡單示範程式碼:



// 打開 Drupal index.php,將前面兩行複製一下就可以
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

$node = new stdClass(); // 建立 Node Object.

module_load_include('inc', 'node', 'node.pages');

/**
 * 自動準備好一些該有的參數
 * 因此在下面只需填上你要修改的內容便可
 * 如缺乏這一步,你需要獨一編寫。
 */
node_object_prepare($node); 

/**
 * 好戲現在開始
 * 從其他資料庫或程式中取得數據,然後再寫入
 * 使用 print_r($node) 或 Devel dsm($node) 了解有什麼可用
 */
 
$node->type = 'story';
$node->title = "Node 標題";
$node->body = "Node 內容";

$new_node = node_submit($node); // 準備儲存前的一些資料
node_save($new_node); // 最重要是這一步 !! 

就是這麼簡單。

透過現有模組

當然,如果你真是不會 PHP,而又沒有好好聽我上面所說而關閉此頁面的話,可以考慮使用現有的 Drupal 模組來達成。

到 Drupal.org 搜尋 csv import, node import, X improt 就有一大堆,我也不知那個好,跟我分享哦 🙂

從移除、修改 Drupal Rss icon 看 Drupal API 之優及版型修改

安裝好 Drupal 後,預設就有提供 RSS 的服務,但不想要該如何 ? 很有趣的是,即使到了最新的 Drupal 7 也沒有提供關閉功能,你可以靠模組來解決 (RSS Permissions)。算了算,我不太想安裝模組,就是要隱藏起來就好….

Rss icon 是來自版型中的,要隱藏的方法的確多,但既然使用了 Drupal,就好好學一下 Drupal 能如何去做。

利用 CSS 隱藏

對於新手來說,第一個想法必定是 CSS,真的太簡單


.feed-icon { display: none }

但你或許會說:我雖不懂 Drupal ,可是一名 HTML & CSS 的高手,無謂的輸出這些 HTML 程式碼,有點兒… (是的,這是最糟糕的方法,窮途未路時才好使用)

從 Page.tpl.php 中移除

對了,這次對了!找到以下這句,刪了就可以


print $feed_icons

可是,$feed_icons未必只在一個版型檔案中,要獨一修改也太麻煩。某天,老闆想法不同,不是又要花大量時間去修改回來嗎 ? 一些模組亦可能會輸出啊!

透過 Drupal API theme_feed_icon 移除

這是終極武器,既不會輸出無謂的 HTML,也不用大量修改版型,某天後悔了,也只是註釋掉就可以。模組做壞事嗎 ?? 也會殺掉它!

參考:http://api.drupal.org/api/function/theme_feed_icon/6

直接複製程式碼到版型下的 template.php 檔案,並做小修改。


function phptemplate_feed_icon($url, $title) {
     return '';
 }

** 緊記到管理界面清除快取,否則沒效果不要說我的方法失敗。

Drupal 7 中 "phptemplate_" 已失效,請使用你的版型名代替,事實上 Drupal 6 中也應該這樣做。

要修改圖片 ?

Drupal 6


function theme_feed_icon($url, $title) {
  if ($image = theme('image', path_to_theme() . '/images/feed.png', t('Syndicate content'), $title)) {
    return '<a href="'. check_url($url) .'" class="feed-icon">'. $image .'</a>';
  }
}

Drupal 7 API 變了,做法沒差別,你可以使用新的 API


function theme_feed_icon($variables) {
  $text = t('Subscribe to @feed-title', array('@feed-title' => $variables['title']));
  if ($image = theme('image', array('path' => path_to_theme() . '/images/feed.png', 'alt' => $text))) {
    return '<a href="' . check_url($variables['url']) . '" title="' . $text . '" class="feed-icon">' . $image . '</a>';
  }
}

複製了,出錯啊 ! 剛才說過,你要修改 theme_ 為你的版型名。
修改了,變了沒東西 ? 別忘記清除快取及在你指定的位置放上圖片。
只出文字該如何做 ?? 我不太懂, LOL
 

(這是 Drupal 小技巧系列,專門分享微不足道,但實用的修改技巧。)

移除 Drupal 回應中的未驗證使用者字串 (not verified)

在 Drupal 中,經常性地看見一個很不討好的字串:(not verified)。當匿名或未驗證使用者發佈內容時,必會看到!很討厭,將它移除吧:

Drupal 7 移除的超簡單

只要在管理後台 Appearance 中,選擇你的版型 (或者是 Gobal Settings),然後取消 "User verification status in comments" (使用者在回應中的驗證狀態) 便可。

Drupal 6 或以下版本需要修改版型檔案

參考 http://api.drupal.org/api/function/theme_username/6

直接複製程式碼到版型下的 template.php 檔案,並做小修改。


function phptemplate_username($object) {

  if ($object->uid && $object->name) {
    // Shorten the name when it is too long or it will break many tables.
    if (drupal_strlen($object->name) > 20) {
      $name = drupal_substr($object->name, 0, 15) .'...';
    }
    else {
      $name = $object->name;
    }

    if (user_access('access user profiles')) {
      $output = l($name, 'user/'. $object->uid, array('attributes' => array('title' => t('View user profile.'))));
    }
    else {
      $output = check_plain($name);
    }
  }
  else if ($object->name) {
    // Sometimes modules display content composed by people who are
    // not registered members of the site (e.g. mailing list or news
    // aggregator modules). This clause enables modules to display
    // the true author of the content.
    if (!empty($object->homepage)) {
      $output = l($object->name, $object->homepage, array('attributes' => array('rel' => 'nofollow')));
    }
    else {
      $output = check_plain($object->name);
    }

   // $output .= ' ('. t('not verified') .')'; 將這一行註釋了就可以 !!
  }
  else {
    $output = check_plain(variable_get('anonymous', t('Anonymous')));
  }

  return $output;
}

覺得太長的話,直接使用 str_replace 也可以


function phptemplate_username($object) {
  return str_replace(' ('. t('not verified') .')', '', theme_username($object));
}

兩者效能相差並不大,各取其好。

若 Drupal 7 也想使用修改程式碼方式,可以修改 template_process_username()

(這是 Drupal 小技巧系列,專門分享微不足道,但實用的修改技巧。)

Drupal 7 大不同:BLOCK 變很大,親和性增強

Region & Block (區域及區塊) 在 Drupal 中佔了很重要的位置,Drupal 7 進一步將 Content (內容) & Help (幫助訊息) 變成了 Block,增加了彈性。

Drupal 6 中的 BLOCK (區塊)

在 Drupal 6 或更舊版本中編輯 Block,介面都會隨時現使用的版型而改變,遇上版型不完整時,就亂掉了,甚至沒法正常顯示出 BLOCK 編輯畫面,真痛苦

Drupal 7 的改善

Drupal 7 的首要任務是增強 UI,當然不會忘記 BLOCK 這個重要的構件。 現在 BLOCK 編輯界面會固定使用管理員版型,要看看效果?請按下 Demonstrate block regions 連結。

正如上面所說,現在的內容都是一個 BLOCK 了,想擺到那裏去都行。

除此以外,還能在同一畫面為所有已啟用的 Theme (版型) 進行設定

可以向 Block Node Visibility 模組說再見,Drupal 7 內置能控制 BLOCK 在那一些 Content type (內容類型) 才顯示

看不到的效能提升

在 Drupal 6 或以前版本中,當有大量的 BLOCK ,即使不顯示在目前頁面中,也是會被執行的,這對效能有極大的影響,現在 Drupal 7 解決了這些問題,只會在需要執行的時候,才執行。(不需要額外設定)

Drupal 6 或以前版本,可以使用以下模組解決:

Block Page Visibility

可參考文章:
Improve Drupal’s performance by not executing block logic on page templates with no regions
Part 1 Part 2

Drupal Performance Tip: Block Visibility

 

 

Drupal 7 大不同:內置自動執行 CRON

在 Drupal 當中,一些見常功能如搜尋索引、處理 Watchdog 記錄或是檢查更新內容都是要透過 CRON 執行。

Drupal 7 內置自動執行 CRON

不幸的是,遇上一個伺服機並沒有 CRON 功能提供,即使是有也不會設定就是了。為了解決這問題,在 Drupal 6 中我們都使用 Poormanscron,簡單易用,使 Drupal 內部功能保持正常運作。很明顯 Drupal 社區意識到 CRON 對 Drupal 的重要性,Drupal 7 中這將是一個內置的核心功能。

設定位置:admin/config/system/site-information

快慢頻率由你,怎然之不是 Never 就行了。

Drupal 7 CRON 更安全

Drupal 6 以前版本的 cron 都是任由執行,並不用什麼特定帳戶。現在終於解決了這個問題,不再讓人任由魚肉囉!以後在外部執行 cron,緊記需要不同的 URL。

透過外部工具執行 Drupal CRON

Drupal 7 內置 CRON 是當有人瀏覽網站時,才會觸發,如果架設的是定期發送 EMAIL 這類網站,就無法達到目的。

Linux CRON 設定

  1. 開啟 『crontab -e』
  2. 輸入 
  3. 45 * * * * /usr/bin/wget -O -q -t 1 http://www.example.com/cron.php?cron_key=XXXXXXX > /dev/null

    意思是在每小時的 45 分執行。更詳細解釋可看烏哥 CRON 教學

其他有用資源