Weglot Translation 无法翻译 checkout payment 区域
结论
WooCommerce 的 checkout payment 区域会在结账页加载后通过 AJAX 多次刷新。如果 Weglot 只扫描服务器首次返回的 HTML,后续生成或替换的支付方式名称、说明和提示文本就可能没有被翻译。
建议先将支付区域的 CSS 选择器加入 Weglot 的“动态内容翻译”配置:
#payment
如果需要缩小匹配范围,可以使用:
.woocommerce-checkout-payment
.payment_methods
.payment_box
保存配置后,清除 WordPress、Weglot、CDN 和浏览器缓存,再重新打开结账页测试。如果未翻译的内容位于第三方支付服务的跨域 iframe 中,Weglot 无法直接处理,只能使用支付网关提供的语言设置。
原因
WooCommerce 会监听结账页中的地址、配送方式、优惠券和订单金额等变化,然后通过 update_order_review 请求刷新订单信息和支付区域。刷新时,原有的支付节点可能会被整段替换。
常见情况包括:
- 页面其他区域已经由 Weglot 翻译;
- 支付区域在 Weglot 首次扫描后才由 AJAX 插入;
- 用户切换配送方式后,WooCommerce 再次替换支付区域;
- 支付网关通过 JavaScript 或
iframe输出内容; - 支付方式的标题或说明来自 WooCommerce 后台配置,而非主题语言包。
这类问题通常与 WooCommerce 翻译文件无关,主要取决于内容何时生成,以及内容来自哪里。
解决步骤
1. 将支付区域标记为动态内容
进入 Weglot 的 WordPress 插件设置或项目设置,找到“动态内容”“Dynamic content”或“动态元素选择器”等选项。不同版本的界面名称可能稍有差异。
先添加:
#payment
如果仍有部分内容无法识别,再分别添加:
.woocommerce-checkout-payment
.payment_methods
.payment_box
不要一开始就使用范围过大的选择器,例如:
body
.woocommerce
范围过大可能导致重复扫描,拖慢结账页。
2. 触发支付区域的所有状态
打开目标语言的结账页,依次执行可能触发支付方式刷新的操作:
- 修改国家、省份或邮政编码;
- 切换配送方式;
- 使用或移除优惠券;
- 切换不同的支付方式;
- 等待订单摘要刷新完成。
有些文本只有在对应的支付方式展开后才会出现在页面中。先触发这些状态,Weglot 才有机会收集相关字符串。
完成后进入 Weglot 的翻译列表,搜索支付方式的标题或说明原文,确认这些字符串是否已经被检测到。
3. 检查支付方式后台配置
在 WooCommerce 的支付设置中检查支付方式的标题和说明。这类文本通常由商店管理员填写并保存在数据库中,例如:
Direct bank transfer
Pay securely using your credit card
它们不一定来自 WooCommerce 的 .po 或 .mo 语言文件,所以仅安装 WordPress 语言包可能不起作用。Weglot 检测到字符串后,可以在翻译列表中补充或修正翻译。
4. 清除各层缓存
修改配置后,需要清除:
- WordPress 缓存插件缓存;
- 主机或反向代理缓存;
- CDN 缓存;
- 浏览器缓存;
- Weglot 的翻译或 URL 缓存,如果当前套餐和界面提供相关操作。
还要确认缓存系统没有缓存结账页。WooCommerce 的购物车、结账和“我的账户”等动态页面通常不适合使用整页缓存。
必要时增加稳定的 HTML 容器
如果主题或结账插件修改了 WooCommerce 的默认结构,页面中可能没有稳定的 #payment 节点。此时可以通过 WooCommerce 钩子在支付区域外增加一个容器,再将这个容器设为 Weglot 的动态选择器。
add_action('woocommerce_review_order_before_payment', function () {
echo '<div id="weglot-checkout-payment">';
}, 5);
add_action('woocommerce_review_order_after_payment', function () {
echo '</div>';
}, 100);
然后在 Weglot 中添加:
#weglot-checkout-payment
这段代码应放在子主题的 functions.php 中,或通过自定义代码插件加载。上线前要在测试环境中确认生成的 HTML 标签正确闭合,因为部分主题或结账编辑器可能会改变 WooCommerce 钩子的执行位置。
如果默认结账模板中已有稳定的 #payment 节点,就不需要添加这段代码。
判断内容是否位于 iframe
使用浏览器开发者工具检查未翻译的文本。如果文本位于类似下面的结构中:
<iframe src="https://payment-provider.example/..."></iframe>
并且 src 指向另一个域名,说明内容由支付服务商控制。由于浏览器同源策略的限制,Weglot 无法读取或修改跨域 iframe 内的文字。
这种情况需要:
- 在支付网关插件中设置语言或 locale;
- 确认网关能否根据 WordPress、WooCommerce 或当前页面语言自动切换语言;
- 按照支付服务商的文档向其 SDK 传入语言参数;
- 联系支付网关插件开发者,确认支持的多语言兼容方式。
不要尝试使用 JavaScript 强行访问跨域 iframe,浏览器会阻止这种操作。
进一步排查
如果添加动态选择器后仍然无效,可以暂时切换到 WooCommerce 默认主题,并停用结账增强类插件进行对比。排查时重点检查:
- 浏览器控制台中是否有 JavaScript 错误;
- AJAX 请求是否成功返回;
- 支付区域刷新后,页面语言是否被切回默认语言;
- Weglot 是否排除了结账页或支付节点;
- Cookie 同意、性能优化或脚本延迟插件是否阻止 Weglot 执行;
- 未翻译的内容是普通 DOM 文本、图片中的文字,还是跨域
iframe内容。
建议先为 #payment 配置动态翻译。只有在页面结构中确实找不到这个节点时,才需要增加自定义容器。如果内容来自跨域支付组件,则需要通过支付网关的本地化设置解决。
备注:内容仅供参考。
