WordPress的JavaScript本地化
WordPress 升級(jí)到 3.1 之后, 如果主題支持 wp_head() 方法, 將在頁(yè)面加載一個(gè)名為 l10n.js 的文件, 這是為 JavaScript 本地化提供的工具庫(kù). 目前對(duì)大多數(shù)人來(lái)說(shuō)是一個(gè)無(wú)用的功能, 甚至有人認(rèn)為這是 WordPress 卑鄙地偷偷地在頁(yè)面上埋了一個(gè)扯淡的腳本, 所以網(wǎng)上能找到的都是如何卸載腳本的方法.
在我們卸載之前, 是不是應(yīng)該先了解一下這是怎樣的一個(gè)功能, 添加腳本的意圖是什么? 本文將說(shuō)明 l10n.js 腳本存在的意義, 本地化腳本的使用方法和對(duì)其未來(lái)的展望.
- <script type='text/javascript' src='{ROOT DIR}/wp-includes/js/l10n.js?ver=20101110'></script>
i18n 和 l10n
i18n[1] 和 l10n[2] 是 IT 領(lǐng)域常用的縮寫(xiě)術(shù)語(yǔ), 分別是國(guó)際化和本地化的意思. i18n 指應(yīng)用程序能夠?yàn)椴煌膰?guó)家和語(yǔ)言環(huán)境的用戶群體提供本地化的服務(wù), 而 l10n 則是在用戶使用環(huán)境實(shí)現(xiàn)本地化特性, 國(guó)際化和本地化泛指語(yǔ)言環(huán)境的多語(yǔ)言實(shí)現(xiàn). 如: WordPress 是一個(gè)支持國(guó)際化的程序, 只要提供對(duì)應(yīng)國(guó)家語(yǔ)言包并制定國(guó)家代號(hào), 就能替換整個(gè)網(wǎng)站的語(yǔ)言環(huán)境.
JavaScript 本地化
如前面的例子, WordPress 一直支持國(guó)際化, 并提供 _e() 和 __() 兩個(gè) PHP 方法對(duì)程序進(jìn)行本地化. 但隨著前端 JavaScript 應(yīng)用越來(lái)越多, 后端的國(guó)際化已經(jīng)滿足不了所有需求, 有必要引入 JavaScript 的國(guó)際化和本地化.
若你使用的主題支持 wp_head() 方法, 將在頁(yè)面加載 l10n.js 文件, 而且用戶可以通過(guò)簡(jiǎn)單的代碼向頁(yè)面注入本地化資源. l10n.js 是一個(gè) JavaScript 本地化的工具庫(kù), 包含 convertEntities() 方法, 可以將 HTML 對(duì)象還原成原來(lái)的值, 所以它會(huì)在所有注入的 JavaScript 腳本和本地化資源之前載入.
使用的方法
我們可以為每一個(gè)要載入的 JavaScript 文件定義本地化資源. 實(shí)現(xiàn)代碼如下[3]:
- // 必須先載入一個(gè) Javascript 文件
- wp_enqueue_script('some_handle', '/some_javascript.js');
- // 組裝本地化數(shù)據(jù), 使用 __() 制作本地化內(nèi)容
- $data = array( 'some_string' => __( 'Some string to translate' ) );
- // 加載本地化腳本. 這里必須指定一個(gè)需要載入的 JavaScript 文件.
- wp_localize_script( 'some_handle', 'object_name', $data );
執(zhí)行后將在頁(yè)面上生成代碼如下:
- /* <![CDATA[ */
- var object_name = {
- some_string: "Some string to translate"
- };
- /* ]]> */
- <script type='text/javascript' src='{ROOT DIR}/some_javascript.js?ver=3.1'></script>
本地化資源會(huì)在指定腳本之前載入和定義. 其中 {ROOT DIR} 是網(wǎng)站的根目錄.
此時(shí)如果我們可以通過(guò)以下代碼進(jìn)行測(cè)試:
- alert(object_name.some_string); // 彈出對(duì)話框, 顯示 'Some string to translate'
利弊和應(yīng)用場(chǎng)合
好處前面說(shuō)了很多, 可以方便地進(jìn)行前端本地化 (需要后端 PHP 配合). 缺點(diǎn)也很明顯, 會(huì)在每次頁(yè)面加載時(shí)計(jì)算本地化資源, 并且載入大量 JavaScript 代碼, 增加系統(tǒng)負(fù)擔(dān)和延長(zhǎng)頁(yè)面加載時(shí)間.
JavaScript 本地化是 WordPress 主題和插件制作中讓人較為煩惱的地方, 一些插件開(kāi)發(fā)者會(huì)在頁(yè)面上自行定義 l10n 對(duì)象, 可以參考 WP-RecentComments 插件的做法. WordPress 這次強(qiáng)行引入, 很可能會(huì)被主題和插件開(kāi)發(fā)者廣泛應(yīng)用. 也就是說(shuō), 不久的將來(lái)你未必敢卸載掉它, 否則某些插件將運(yùn)行不了.
卸載和恢復(fù)的方法
雖說(shuō) l10n.js 文件很小, 好歹會(huì)發(fā)出一個(gè)請(qǐng)求, 如果你真的認(rèn)為沒(méi)用, 可以在 functions.php 中添加以下代碼將它卸載掉.
- wp_deregister_script('l10n');
如函數(shù)名, 這個(gè)方法不是禁用, 而是注銷. 也就是說(shuō), 一旦你注銷就沒(méi)有了, 就算刪除這段代碼也不會(huì)還原. 如果在注銷后希望回復(fù)需要使用以下方法:
- wp_register_script('l10n');
總結(jié)
WordPress 的想法很好, 但這實(shí)現(xiàn)方式叫我該如何吐槽, 希望 "支持 JavaScript 本地化" 不是通過(guò)主題審核的必要條件. 作為前端, 多少有點(diǎn)頁(yè)面潔癖, 我已經(jīng)將這個(gè)腳本注銷掉了. 另外, 看到 WordPress 3.1 那奪目的 Admin Bar 我淡定地笑了, 祝 WordPress 越來(lái)越臃腫.
【編輯推薦】