您在這裡

去掉CAPTCHA的英文字

jesselue's 的頭像
jesselue 在 2010-03-05 (週五) 23:22 發表

去掉CAPTCHA的英文字:2010年03月06日星期六

適用於:Drupal初學者,想更改Drupal theme外觀 的人,對CSS有興趣的人,對PHP有興趣的人,以前用Dreamweaver的人,以前用其他Blog CMS的人。本文用Drupal6.14,想在Drupal中使用Flash,詳見本文的環境

CAPTCHA在durpaltaiwan.org已有模組介紹,用CAPTCHA 6.x-2.0版本(模組6.x-2.1在此下載),很困擾的是一堆英文字,見圖一,有三句CAPTCHA、Math question、Solve this simple math problem and enter the result. E.g. for 1+3, enter 4. 如何去掉?
在sites/all/modules/captcha下找到captcha MODULES檔案(注意:以下的行數是CAPTCHA 6.x-2.0版本),

  1. 用CAPTCHA尋找 , 在269 行找到 '#title' => t('CAPTCHA'),將其改為 '#title' => t(''),。
  2. 用Math question尋找,在538 行找到'#title' => t('Math question'),將其改為'#title' => t('?'),。
  3. 用Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.尋找,在539 行找到'#description' => t('Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.'),將其改為'#description' => t(''),。
  4. 改完後存回captcha MODULES檔案,就好了,如圖二

可能會有人認為沒什麼需要,仍是認為一般的內容網站讀者很可能會很不習慣,最好只放上必需的字,尤其是避免一串英文字,雖然大多數人看得懂英文,但是~~CAPTCHA是啥?我猜是Catch You,"抓到你了"的意思,一般的讀者很可能會不知幹嘛,所以去掉。
以前讀過一些PHP,對Drupal也不熟,信心不是很強,若這作法不好請告知。
 
圖一:用CAPTCHA,很困擾的是一堆英文字,見下圖,有三句CAPTCHA、Math question、Solve this simple math problem and enter the result. E.g. for 1+3, endter 4.

圖二:

 
本文的環境是:

  1. Drupal 6.14。
  2. apache server設在Windows XP上,以http://localhost/drupal為例。
  3. 所有的檔案在c:/xampp/內,以下的路徑均相對於c:/xampp/。
  4. 各檔案均用vim editor打開,行數以vim內的行數為準。
  5. 主機是遠振資訊cPanel環境。

 

附加檔案大小
Image icon pictire1.JPG11.52 KB
Image icon pictire2.JPG4.16 KB

所有在程式裡有被 t('') 包起來的字,例如 t('CAPTCHA'),都是可以被翻譯的。所以,請用內建的介面翻譯功能去調整即可,不要用一堆奇技淫巧啊!!!

像這樣直接修改module來改變顯示的方法,我以前也常用,但是每次update模組時, 縂吃盡苦頭 (除非你能保證永遠不update ), 因爲好多模組被我改來改去,都記不得那裏被改了, 結果下場當然很慘。

如果可以,最好是自己建立一個module, 用外加模組的方式來改變。 要不然就用css 的方法. 需要改變字串的話,用翻譯的方式或是string override的模組, 都是不錯的方式。

參考一下咯。

謝謝Danny及tokimeki的五種方法,都比我的方法好,因為我真正想做的是"將英文改成中文",而又不會JQuery及自建模組,所以大概會用Danny的翻譯的方式。

hello Danny: 試了你的翻譯的方式或是string override的模組,都可成功,偏向用翻譯的方式(可少load string override的模組)。有三問題請問:

  • 翻譯的方式是否即為<網站建置><模組>,再選content translation?因為勾選content translation時出現MySQL has gone away query...,表示timeout或其他,是否用content translation需時長或用memory很大?而應避免用?
  • MySQL has gone away query出現時,要在local host 改wait timeout,您知道在local host 需要如何改?我search wait_timeout找不到?
  • 不知你覺得我選用翻譯的方式是否正確(不用string override)?

謝謝。

Hello tokimeki:謝謝,因為我真正想做的是"將英文改成中文"。而又不會JQuery,所以先用Danny的方法。不過JQuery這東西老是出現,看來是早晚要學,

  • 我對Javascript及MySQL query language有些概念,可否提示一下到那兒去看JQuery的資訊,謝謝。

如果閱讀英文沒有問題的話,建議直接看 jQuery 的官方網站
這裡有一些中文的資料 繁體中文教學

由於 Drupal 本身前端的 Javascript 就是用 jQuery,所以不需要手動載入,你只需要在版型的目錄新增一個 .js 檔案,並在 .info 檔加入該 .js 檔案即可~
至於相關的程式碼當然就是寫在該 .js 檔案裡面~

正確一點做法:

複製以下到 template.php

function phptemplate_captcha($element) { // 將theme 變為 phptemplate_,最佳是 YourThemeName_
if (!empty($element['#description']) && isset($element['captcha_widgets'])) {
$fieldset = array(
'#type' => 'fieldset',
// '#title' => t('CAPTCHA'), // 刪除或注釋掉這行
'#description' => $element['#description'],
'#children' => $element['#children'],
'#attributes' => array('class' => 'captcha'),
);
return theme('fieldset', $fieldset);
}
else {
return '

'. $element['#children'] .'

';
}
}

CSS 隱藏,小小的內容是不錯,但內容多的話,為網頁增加了無謂的大小,也有SEO問題
jQuery,永遠不要使用它來隱藏東西

至於英文 --> 中文翻譯,應該使用 Locale
Locale / string override,沒有特殊原因,不要同時使用

小修改,使用string override就好,好像我的網站 (notaBlueScreen),只有表面上的數個字詞是中文

---
notaBlueScreen | 訂閱RSS | Plurk

CSS 用來隱藏一些需要被隱藏的東西、jQuery 用來作與預設翻譯不同的翻譯,這兩者的搭配,是邊際效應或是說副作用最小的作法,也是調整起來最簡單的方式。
只要你懂得如何用 CSS 定位到該定位的地方就可以隱藏或翻譯,所需的背景知識也僅止於跟 CSS 相關(jQuery 拿來作翻譯時基本上是一個樣板照抄)。

我不太了解用 CSS 隱藏掉一些隱藏需要被隱藏的東西跟 SEO 有何關連?
string override 如果用在所有的翻譯詞都一致的情況下會比較簡單,不過仍然需要配合 Localization client 來查出原始未翻譯的語句是什麼(有些時候句子中會有 %s 之類的變數)。

SEO 這種東西,你不相信就不會存在

Drupal 預設沒有載入 jQuery, 為了翻譯數個文字,就載入幾十KB的檔案,不是有點兒沒必要?
即使有載入,除非內容是不重要,否則 JS 替換,某些引擎只會抓取到本身的英文內容

除了省時間、找不到解決方法或(有可能)省到伺服器資源外,想不到有什麼理由將一些垃圾代碼送到客戶端,然後增加一些 CSS / JS 隱藏起來或替代文字

---
notaBlueScreen | 訂閱RSS | Plurk | twitter

我強調的是最簡單的方式,不是最簡約的方式。

今天你對 Drupal 運作的方式很瞭解,知道如何去寫 theme function 做到最簡約的方式,那是你很了解,不代表其他人也一樣這麼了解。
現在問的是 CAPTCHA 那改天問的是另外一個,是不是又要麻煩你看一下要寫的 theme function 的名稱跟內容應該是什麼呢?
我給出的解法不需要太過於深入了解 Drupal 跟 PHP ,只要你會用 Firebug 去觀察 CSS 該如何定位、了解 CSS 的相關知識,就可以達成一樣的效果。

我並不是不相信 SEO,只是對於個問題而言,我看不出來隱藏一個無關緊要的標籤會對 SEO 產生什麼重大影響?
再說如果你認為 jQuery 是垃圾代碼的話,那整個 Drupal 系統也是,他的效率跟大小絕對比不上你手刻代碼來的快跟小不是嗎?

使用 jQuery 來做翻譯,重點在於有些句子或詞語需要不同的翻譯,例如:Apply 這個字,有些地方我需要他翻成「套用」,而有些地方我需要他翻成「查詢」。
正規的翻譯還是用正規的方法來做,只是因為 Drupal 架構的關係,翻譯是一對一的關係,需要有例外時,要用其他的方式來處理。

節省時間就是我強調的重點,只能說我們側重的方向不一樣~

立場不同,只是討論,不是說你的提議錯誤,我同意你的部分見解,只是可行的情況下,個人不建議這樣做

垃圾代碼所指是沒用的代碼,就是你”隱藏起來的那些”,不是指jQuery本身,如果白白將jQuery送到客戶端而又用不著的,也是垃圾

先向大家抱歉,可能我寫得不清楚:
"CSS 隱藏,小小的內容是不錯,但內容多的話,為網頁增加了無謂的大小,也有SEO問題"

這句的意思是:用 CSS 隱藏少量內容,是不錯的選擇。但隱藏大量內容,就可能有SEO問題。而增加網頁大小是必定會的
DISPLAY: NONE 隱藏東西,有人說沒有問題,有人說是有問題,看大家相不相信了。由於根本沒法或太難證實,所以我才說 "SEO 這種東西,你不相信就不會存在"

如果我上面有什麼錯誤,或言語不當,在此先說聲抱歉,我一心只是提出意見,歡迎任何正面討論。謝謝各位!

---
notaBlueScreen | 訂閱RSS | Plurk | twitter

翻譯的方式是否即為<網站建置><模組>,再選content translation?因為勾選content translation時出現MySQL has gone away query...,表示timeout或其他,是否用content translation需時長或用memory很大?而應避免用?

依照你的情況, 應該用 site building - interface translation (要先enable local 模組)

MySQL has gone away query出現時,要在local host 改wait timeout,您知道在local host 需要如何改?我search wait_timeout找不到?

Modify php.ini; change max_execution_time from 30 to 120.

不知你覺得我選用翻譯的方式是否正確(不用string override)?

翻譯不多的話,少用外加模組是正確的做法。但是,如果很多字串要翻譯,用string override來管理就很值得。

實在很感謝先進提供了七、八種姿勢,由這些知識中才發現原來Locale就可做到,所以決定聽從charles的不用"奇技淫巧",採取正常體位,直攻核心(Core)- 可選擇、Locale模組。

多謝了。

drupaltaiwan真是好玩!charles的"奇技淫巧"四字真是高明!

持續奮戰14週後, 總算有機會專注在 drupal 6 的 theme system了.

14週以來前後東摸西摸地花在探索 drupal 6 的 theme system 時間也不短了, 至少40個小時有吧?

過程當中一樣難以免俗地繞了一大圈子, 才有稍微抓到方向.

即使要改個小地方(ex: exposed filter form 的 輸入框的長度穿出版型框, 需要改短些),

也得花不少時間K文件, 揣摩, 試誤, 過程當中沒出現預期的狀況又要排障, 又要懷疑該不會是用錯方法?

就個人體驗, tokimeki 跟 KAY.L 兩位大大的方法都用到了.

剛開始是從 override theming function 的方式去做, 但是一直搞不定, 想搞定又怕閒工夫不夠,

但是擱著不管也不是辦法, 最後還是直接從css去改, 果然立刻見效, 愈改愈順手,

反而就先不管 theme system 的流程怎麼跑了.

搞懂 theme system 的流程終究是堂堂大道, 只是真的要有用功學好的準備, 時間肯定還是要繼續投下去的.

最後感謝這個討論串的所有參與者, 尤其是 tokimeki 及 KAY.L 兩位大大,

這篇對我而言有指出不少值得注意的思考點. 而且看中文總比硬k英文輕鬆多了. 8D