WordPress 升級到 3.1 之後, 如果主題支援 wp_head() 方法, 將在頁面載入一個名為 l10n.js 的檔案, 這是為 JavaScript 本地化提供的工具庫. 目前對大多數人來說是一個無用的功能, 甚至有人認為這是 WordPress 卑鄙地偷偷地在頁面上埋了一個扯淡的指令碼, 所以網上能找到的都是如何卸載指令碼的方法.
在我們卸載之前, 是不是應該先瞭解一下這是怎樣的一個功能, 添加指令碼的意圖是什麼? 本文將說明 l10n.js 指令碼存在的意義, 本地化指令碼的使用方法和對其未來的展望.
- <script type='text/javascript' src='{ROOT DIR}/wp-includes/js/l10n.js?ver=20101110'></script>
i18n 和 l10n
i18n[1] 和 l10n[2] 是 IT 領域常用的縮寫術語, 分別是國際化和本地化的意思. i18n 指應用程式能夠為不同的國家和語言環境的使用者群體提供本地化的服務, 而 l10n 則是在使用者使用環境實現本地化特性, 國際化和本地化泛指語言環境的多語言實現. 如: WordPress 是一個支援國際化的程式, 只要提供對應國家語言套件並制定國家代號, 就能替換整個網站的語言環境.
JavaScript 本地化
如前面的例子, WordPress 一直支援國際化, 並提供 _e() 和 __() 兩個 PHP 方法對程式進行本地化. 但隨著前端 JavaScript 應用越來越多, 後端的國際化已經滿足不了所有需求, 有必要引入 JavaScript 的國際化和本地化.
若你使用的主題支援 wp_head() 方法, 將在頁面載入 l10n.js 檔案, 而且使用者可以通過簡單的代碼向頁面注入本地化資源. l10n.js 是一個 JavaScript 本地化的工具庫, 包含 convertEntities() 方法, 可以將 HTML 對象還原成原來的值, 所以它會在所有注入的 JavaScript 指令碼和本地化資源之前載入.
使用的方法
我們可以為每一個要載入的 JavaScript 檔案定義本地化資源. 實現代碼如下[3]:
- // 必須先載入一個 Javascript 檔案
- wp_enqueue_script('some_handle', '/some_javascript.js');
- // 組裝本地化資料, 使用 __() 製作本地化內容
- $data = array( 'some_string' => __( 'Some string to translate' ) );
- // 載入本地化指令碼. 這裡必須指定一個需要載入的 JavaScript 檔案.
- wp_localize_script( 'some_handle', 'object_name', $data );
執行後將在頁面上產生代碼如下:
- /* <![CDATA[ */
- var object_name = {
- some_string: "Some string to translate"
- };
- /* ]]> */
- <script type='text/javascript' src='{ROOT DIR}/some_javascript.js?ver=3.1'></script>
本地化資源會在指定指令碼之前載入和定義. 其中 {ROOT DIR} 是網站的根目錄.
此時如果我們可以通過以下代碼進行測試:
- alert(object_name.some_string); // 彈出對話方塊, 顯示 'Some string to translate'
利弊和應用場合
好處前面說了很多, 可以方便地進行前端本地化 (需要後端 PHP 配合). 缺點也很明顯, 會在每次頁面載入時計算本地化資源, 並且載入大量 JavaScript 代碼, 增加系統負擔和延長頁面載入時間.
JavaScript 本地化是 WordPress 主題和外掛程式製作中讓人較為煩惱的地方, 一些外掛程式開發人員會在頁面上自行定義 l10n 對象, 可以參考 WP-RecentComments 外掛程式的做法. WordPress 這次強行引入, 很可能會被主題和外掛程式開發人員廣泛應用. 也就是說, 不久的將來你未必敢卸載掉它, 否則某些外掛程式將運行不了.
卸載和恢複的方法
雖說 l10n.js 檔案很小, 好歹會發出一個請求, 如果你真的認為沒用, 可以在 functions.php 中添加以下代碼將它卸載掉.
- wp_deregister_script('l10n');
如函數名, 這個方法不是禁用, 而是登出. 也就是說, 一旦你登出就沒有了, 就算刪除這段代碼也不會還原. 如果在登出後希望回複需要使用以下方法:
- wp_register_script('l10n');
總結
WordPress 的想法很好, 但這實現方式叫我該如何吐槽, 希望 "支援 JavaScript 本地化" 不是通過主題審核的必要條件. 作為前端, 多少有點頁面潔癖, 我已經將這個指令碼登出掉了. 另外, 看到 WordPress 3.1 那奪目的 Admin Bar 我淡定地笑了, 祝 WordPress 越來越臃腫.