問題現象
網站原本環境:
- WordPress 6.6.7
- WooCommerce 8.8.5
- PHP 8.1
- 網站語系:
zh_TW
WordPress 從 6.6.7 升級至 7.0.4 後,WooCommerce 前台開始顯示英文。
例如:
Cart
Checkout
Add to cart
View cart但 Loco Translate 裡的繁體中文翻譯仍然存在,而且完成度為 100%。
根本原因
WordPress 核心翻譯機制有變更
新版 WordPress 翻譯載入機制 + 舊版 WooCommerce 8.8.5 翻譯程式邏輯產生相容性問題。
WordPress 6.7 之後調整了外掛翻譯的載入方式,更依賴 Just-In-Time(JIT)翻譯載入機制。
因此升級:
WordPress 6.6.7
↓
WordPress 7.0.4之後,舊外掛如果使用較舊的翻譯載入/卸載方式,就可能發生翻譯無法重新載入的情況。
所以:WordPress 核心不是「翻譯壞掉」,而是翻譯機制改變了。
WooCommerce 8.8.5 有舊版程式寫法
WooCommerce 8.8.5 的:
woocommerce/includes/class-woocommerce.php裡面有:
unload_textdomain( 'woocommerce' );因為沒有指定第二個參數,所以等同:
unload_textdomain( 'woocommerce', false );這會讓 WordPress 將 WooCommerce 翻譯標記為:
不可自動重新載入實際檢查網站時發現:
l10n class: NOOP_Translations
l10n_unloaded: YES也就是:
WooCommerce 卸載翻譯
↓
WordPress 將 woocommerce 標記為 unloaded
↓
新版 JIT 翻譯機制不再重新載入
↓
WooCommerce 中文翻譯檔雖然存在
↓
前台仍然輸出英文最後確認 WooCommerce 程式問題
將 WooCommerce 8.8.5:
unload_textdomain( 'woocommerce' );暫時修改成:
unload_textdomain( 'woocommerce', true );重新測試後:
Class: WP_Translations
Unloaded: NO
Cart => 購物車
Checkout => 結帳
Add to cart => 加入購物車
View cart => 查看購物車中文翻譯立即恢復。
因此可以確認根本原因。
問題責任
WordPress 6.7+ 修改了翻譯載入機制。
舊版程式原本可以運作的翻譯處理方式,在新版 WordPress 下變得不相容。
真正觸發問題的是舊版 WooCommerce 8.8.5:
unload_textdomain( 'woocommerce' );它將 WooCommerce 翻譯設定成不可重新載入。
新版 WooCommerce 已改成類似:
unload_textdomain( 'woocommerce', true );讓翻譯可以重新載入。
總結
WordPress 6.7+ 改變翻譯載入機制,而舊版 WooCommerce 8.8.5 使用 unload_textdomain('woocommerce') 將翻譯標記為不可重新載入
兩者產生相容性問題,導致 WordPress 7.0.4 升級後 WooCommerce 繁中翻譯檔雖然存在,前台卻只顯示英文。
解決方向
升級 WooCommerce 至已修正新版翻譯載入相容性的版本,不建議永久修改 WooCommerce 核心檔案。
目前至少需要9.9.4版本