如何國際化您的 WordPress 網站
已發表: 2022-03-102017 年 9 月 30 日,國際 WordPress 社區聯合 24 小時翻譯 WordPress 生態系統。 #WPTranslationDay 第三次將全天翻譯馬拉鬆與數字和貢獻者日活動相結合,旨在提升為全球用戶創造無障礙體驗的價值,即眾所周知的“本地化”。
作為一個開源社區,我們都應該努力將我們的開源貢獻本地化。 不過,在您轉錄您的數字資產之前,您必須將您的代碼庫國際化。
“國際化”和“本地化”這兩個術語經常互換使用,儘管它們在技術上代表了翻譯過程的兩個不同方面。
- 國際化 (I18N)是國際化或調整您的主題或插件以將其翻譯成世界上任何語言的過程。
- 本地化 (L10N)是將您的國際化工具本地化或翻譯成給定語言的後續過程。
WordPress 目前已完全本地化超過 65 種語言,並為另外 95 種語言環境提供部分翻譯。 隨著更多本地化的引入,國際使用量繼續增加。
非英語 WordPress 用戶在 2014 年超過了英語用戶,隨著#WPTranslateDay 等努力的增長,他們在 2017 年無意中繼續稀釋英語用戶的比例。
隨著 WordPress 在語言上變得越來越容易訪問,I18N 和 L10N 的知識對於插件和主題開發人員在全球 WordPress 經濟中蓬勃發展至關重要。 對於擴展業務,這些開發技能可以打開通往國外市場的大門。 Web 可訪問性,包括語言可訪問性,對業務有好處,對人們也更好。
作為#WPTranslationDay的延續,這裡有一個更新的指南,用於國際化您的 WordPress 插件和主題。
這是我們今天將要探索的過程的簡要概述。
- 發現
- 了解翻譯文件
- 鍋檔
- 採購訂單文件
- 莫文件
- GlotPress 和語言包
- 備份和準備您的環境
- 了解翻譯文件
- 插件 I18N
- 插件頭
- 加載文本域
- 字符串審計
- 生成 POT 文件
- 主題 I18N
- 主題標題
- 加載文本域
- 字符串審計
- 生成 POT 文件
- JavaScript I18N
- 其他資源
發現
了解翻譯文件
WordPress 使用 GNU gettext 庫來促進 I18N。
首先,讓我們熟悉一下整個過程生成的gettext翻譯文件。
可移植對像模板文件 (POT)
在 I18N 過程中,我們將使用一個工具來查找國際化字符串並生成一個POT 文件,其中包含您的插件和主題中的所有可翻譯文本。
可移植對象文件 (PO)
從外觀上看,POT 文件和PO 文件之間沒有顯著差異。 它們在語法上是相同的,只是根據它們的預期目的而有所不同。
生成 POT 文件後,文本字符串應由翻譯器解釋為您的首選語言。 PO 文件最終將包含您的母語的文本字符串以及相應的翻譯。
機器對象文件 (MO)
最後,PO 文件被轉換為機器可讀的文檔或機器對象文件。 該文件將存在於您的主題或插件目錄中,以便 WordPress 在提供翻譯版本時調用。
備份和準備您的環境
在修改任何標記之前,備份您的插件、主題或整個站點(無論您正在國際化什麼!),並讓您的開發環境井井有條。
如果您打算本地化您的網站,請務必進行快速插件審核。 刪除或停用您不再積極使用的任何插件。 從長遠來看,這種快速審核將為您節省時間。
國際化您的插件
插件頭
首先,我們將更新插件標頭。 具體來說,文本域和域路徑。
示例插件頭
/* Plugin Name: My Rad Plugin Plugin URI: https://myradplugin.com Description: Custom Plugin That Makes My Site Rad Author: Rad Plugin Creator Version: 1.0 Author URI: https://radplugincreator.com Text Domain: rad-plugin Domain Path: /languages/ */
文本域
文本域是 WordPress 識別屬於插件的所有文本的唯一標識符,並且必須與插件的 slug 匹配。
如果您的插件託管在 WordPress.org 上,這一點尤其重要; 這些需要匹配,以便 GlotPress 為您的插件正確導入翻譯。
在我們的示例中,插件文件名為rad-plugin.php ,文本域為rad-plugin
您可能已經設置了文本域。 如果不這樣做,請記住使用連字符,而不是下劃線。
域路徑
域路徑是最終翻譯文件所在的文件夾。您應該在插件目錄中創建一個新文件夾,例如/languages/ ,並更新域路徑,以便 WordPress 確切知道在哪裡搜索翻譯文件。
加載文本域
接下來,我們將通過將以下函數添加到我們的代碼中來加載文本域。
load_plugin_textdomain()
load_plugin_textdomain( $domain, $abs_rel_path, $plugin_rel_path );
如果用戶語言的翻譯文件可用,加載文本域功能將告訴 WordPress 交付它。
參數
- $domain — 文本域(必需)
- $abs_rel_path — false (可選,已棄用)
- $plugin_rel_path — /languages/ (可選,這是包含翻譯文件的目錄的相對路徑。在我們的示例中,/languages/。從 4.6 開始,WordPress 將在插件的 /languages/ 目錄中搜索這些文件,如果這未指定。)
Rad 插件示例
要加載文本域,我們將掛鉤到“plugins_loaded”操作。
add_action( 'plugins_loaded', 'rad_plugin_load_text_domain' ); function rad_plugin_load_text_domain() { load_plugin_textdomain( 'rad-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' ); }
字符串審核
下一步是將插件的所有文本字符串包裝在翻譯函數中。
最常見的翻譯函數是用於返回已翻譯字符串的__()
和用於回顯已翻譯字符串的_e()
。
Rad 插件示例
__() $text = __( 'Super Rad!', 'rad-plugin' );
此功能適用於簡單的翻譯。 它考慮了兩個參數; 文本字符串和文本域。
_e( 'Super Rad!', 'rad-plugin' );
該函數只是簡單地回顯該值。 否則,它的工作原理與前一個函數完全相同。
有許多額外的翻譯功能也應該在適當的時候使用。
其他基本功能
__() _e() _x() _ex() _n() _nx() _n_noop() _nx_noop() translate_nooped_plural()
日期和數字功能
number_format_i18n() date_i18n()
轉義函數
不要忘記使用以下轉義函數轉義正在輸出的任何數據。
esc_html__() esc_html__() esc_html_x() esc_attr__() esc_attr_e() esc_attr_x()
在我們的 Rad 示例中,我們可能有一行插件代碼,如下所示:
function create_section() { esc_html_e( 'Below are your settings for Rad Plugin', 'rad-plugin' ); }
創建一個鍋文件
最後一步是創建一個 POT 文件。 有幾種不同的工具可用於生成這種類型的文件,但在本教程中,我們將堅持 WordPress codex 的建議並使用 Poedit,這是一個易於使用的用於管理翻譯的 GUI。
注意:如果您的插件或主題已經在 WordPress.org 存儲庫中,您可以跳過此過程並從管理頁面生成一個 POT 文件。 在這種情況下,沒有必要為每種語言生成一個 .po 文件。 2015 年引入 GlotPress 和語言包簡化了翻譯過程; GlotPress 只需要 .pot 文件,該文件將由 WordPress.org 導入並通過 translate.wordpress.org 儀表板提供給翻譯人員。 來自世界各地的合作者將使用此儀表板在#WPTranslateDay 上提供翻譯。
下載 Poedit
配置 Poedit
翻譯屬性
首先轉到File > New 。 然後選擇插件的母語並點擊OK 。
接下來,選擇目錄>新建。 輸入項目名稱、版本、聯繫人和語言。
路徑
接下來選擇源路徑選項卡。 如果這是一個新文件,您必須先保存該文件。
按照我們的示例,我們將選擇File > Save As以將 .po 文件另存為 rad-plugin 內的 /languages/ 目錄。 同樣,文件名應與插件的 slug 匹配。
rad-plugin.po
保存後,輸入翻譯文件所在目錄的相對路徑。在這種情況下, languages 。
關鍵詞
選擇來源關鍵字選項卡。 單擊+ 圖標以添加適當的函數名稱。
備忘單
__ _e _x _ex _n _nx _n_noop _nx_noop translate_nooped_plural number_format_i18n date_i18n esc_html__ esc_html__ esc_html_x esc_attr__ esc_attr_e esc_attr_x
之後,您可以單擊 OK ,然後單擊File > Save 。
Poedit 將保存 .mo 和 .po 文件。 您可以通過複製 .po 文件並添加 .pot 擴展名來創建 .pot 文件。 國際用戶可以使用模板 .pot 文件將字符串翻譯成他們的語言。
國際化您的主題
主題國際化的過程實際上與插件的 I18N 相同。 我們將從檢查主題標題開始,然後生成另一個 POT 文件。
主題標題
仔細檢查您的主題標題以確保您的文本域和域路徑已設置。
示例主題標題
/* Theme Name: Rad Theme Author: Rad Theme Author Text Domain: rad-theme Domain Path: /languages/ */
加載文本域
下一步是這次在主題的functions.php文件中加載一個文本域。
load_theme_textdomain()
load_theme_textdomain( 'radtheme', get_template_directory() . '/languages' );
為了加載這些文件,您必須使用 after_setup_theme 操作註冊它們。
add_action( 'after_setup_theme', 'rad_theme_setup' ); function rad_theme_setup() { load_theme_textdomain( 'radtheme', get_template_directory() . '/languages' ); }
字符串審核
是時候進行另一個字符串審計了! 此時您應該熟悉基本的翻譯功能。
讓我們看一些更棘手的翻譯。
佔位符
如果不使用佔位符,PHP 變量(如以下示例)將無法正確翻譯。
echo "We added $count rad points.";
printf() & sprintf()
這些函數使用佔位符(例如%s或%d表示整數)來插入包含動態內容的文本字符串。
Rad 主題示例
/* Translators: %d is the number of rad points added */ printf( esc_html__( 'We added %d rad points.', 'rad-plugin' ), $count );
複數
_n()
函數可以處理更複雜的字符串翻譯,如復數形式,但不推薦使用,因為它在翻譯軟件中存在限制。 相反,您可以編寫一個簡單的if 語句來區分單數和復數詞。
Rad 插件示例
If ( 1 === $rad_points_found ) { $message = __( '1 rad point', 'rad-plugin' ); } else { /* Translators: %s is the number of rad points found */ $message = sprintf( __( '%s rad points' , 'rad-plugin' ) , $rad_points_found ); }
生成鍋文件
生成主題 POT 文件的過程與生成插件 POT 文件的過程相同。 探索下面的一些方法。
命令行
安裝 WordPress Trunk 和 gettext GNU 軟件包後,您可以通過在命令行中運行makepot.php腳本輕鬆完成這一步。
打開命令行並導航到 I18N 工具目錄。
cd wpdev/tools/i18n/
該腳本應如下所示:
php path/to/makepot.php wp-theme path/to/rad-theme rad-theme.pot
該腳本將完成它的工作,完成的文件rad-theme.pot將最終出現在當前目錄中。
繁重的任務
創建 POT 文件的另一種方法是使用 grunt-wp-i18n 或 grunt-pot 運行 Grunt 任務。 像 Grunt 這樣的任務運行器可以自動執行許多繁瑣的任務,例如生成 POT 文件。
要創建 POT 文件,請確保首先安裝了 node.js。 然後,通過命令行在你的語言目錄中安裝 Grunt,然後你就可以走了。 現在,您可以快速運行這些 I18N 命令並製作翻譯文件,而無需離開舒適的命令行。
JavaScript I18N
如果您是現代主題或插件開發人員,您可能會使用 JavaScript 來處理項目的某些組件。 wp_localize_script是提取 PHP 數據以提供給腳本的有效函數,它是在 WordPress 中翻譯 JavaScript 的唯一方法。
WP_LOCALIZE_SCRIPT()
該函數將允許我們在 PHP 中本地化字符串服務器端並將文本字符串作為 JavaScript 對象提供給腳本。
wp_localize_script( $handle, $name, $data );
參數
- $handle — 數據需要可用的腳本句柄(必需 — 需要匹配此數據所在的腳本句柄,請參見下面的示例)
- $name — 包含數據的對象的名稱(必需 — 應該是唯一的)
- $data — 傳遞給腳本的數據數組(必需) 。
RAD 插件示例
add_action( 'wp_enqueue_scripts', 'rad_theme_scripts' ); function rad_theme_scripts() { wp_enqueue_script( 'rad-theme-script', get_template_directory_url() . '/js/rad-theme-script.js' ); wp_localize_script( 'rad-theme-script', 'rad-I18n', array( 'message' => __( 'Super Rad!', 'rad-theme' ), ) ); }
在 JAVASCRIPT 中訪問數據
下面的簡單代碼片段是如何在 JavaScript 文件中訪問此數據的示例。
alert( rad-I18n.message );
其他資源
- 面向 WordPress 開發人員的 I18N
- WordPress 主題手冊:國際化
- WordPress 插件手冊:國際化
- WordPress.tv:I18N
把它包起來
恭喜! 您剛剛國際化了您的主題和/或插件,使所有母語的人都可以從中受益。 無論您的項目是通過 WordPress 存儲庫分發的,還是為您組織的網站定制開發的,從一開始就將文件國際化只有一個好處。
- 讓您的開源貢獻在全球範圍內可訪問。
- 與國外市場的新客戶建立對話。
- 節省時間並減少將來費力的更新。
始終國際化。