
本文详解如何通过 WPML 的字符串翻译(String Translation)机制,将插件中硬编码的文本(如 'Contact with')及数据库动态值(如 $name)纳入多语言支持体系,确保内容小工具在不同语言站点中正确显示。
本文详解如何通过 wpml 的字符串翻译(string translation)机制,将插件中硬编码的文本(如 `'contact with'`)及数据库动态值(如 `$name`)纳入多语言支持体系,确保内容小工具在不同语言站点中正确显示。
在 WordPress 多语言开发中,WPML 并不会自动翻译 PHP 中的普通字符串或数据库字段——它需要明确的“可翻译注册”和“上下文识别”。针对你代码中 esc_html_e('Contact with','my-plugin') 这类用法,需分两步处理:
✅ 1. 正确注册静态文本供 WPML 扫描
首先,确保你的插件已正确声明文本域(textdomain),并在 load_plugin_textdomain() 中加载翻译文件。但仅靠 esc_html_e() 不足以让 WPML 自动捕获该字符串——你需要主动触发字符串注册。推荐改用 __() 或 esc_html__()(而非 _e()),并确保字符串出现在 WPML 可扫描的上下文中:
// ✅ 推荐写法:使用 __() 返回值,便于 WPML 扫描
$label = sprintf(
esc_html__('Contact with %s', 'my-plugin'),
esc_attr($name)
);
echo $label;
⚠️ 注意:esc_html_e() 是直接输出函数,WPML 在某些主题/插件环境下可能无法可靠抓取其内容;而 __() 返回字符串,更利于 WPML 的静态分析与字符串提取。
✅ 2. 将动态字段 $name 设为可翻译内容
$name 来自数据库表,属于动态内容,不能通过字符串翻译处理。此时应使用 WPML 的 Custom Fields Translation 或 Post Translation 机制(取决于 $name 的存储方式):
- 若 $name 是某条 post 的自定义字段(如 contact_name),请在 WPML → Translation Management → Custom Fields 中勾选该字段,并设置为“Translatable”;
- 若 $name 存储于独立插件数据表(如 wp_myplugin_contacts),则需使用 wpml_register_string() 手动注册其值为可翻译字符串:
// 在插件保存或更新 $name 时调用(例如在 save_post 或 AJAX 回调中)
if (function_exists('wpml_register_string')) {
wpml_register_string(
'my-plugin-contact-name', // 独一无二的字符串名称(slug)
'Contact Name: ' . $name, // 描述性标签(用于 WPML 后台识别)
$name, // 实际待翻译的值
'my-plugin' // 文本域
);
}
之后,在 WPML → String Translation 页面中即可找到该字符串并为其添加各语言版本。
✅ 3. 强制刷新并扫描字符串
完成代码修改后:
- 访问 WPML → String Translation → Translate texts in admin screens,点击 Scan for strings;
- 若未出现新字符串,前往 WPML → Translation Management → Strings in the theme and plugins,确认你的插件文本域已启用;
- 刷新前端页面一次(触发字符串注册),再返回字符串翻译页查看。
? 总结要点
- 静态文本优先用 __() / esc_html__() 替代 _e(),提升 WPML 扫描成功率;
- 动态数据库字段需通过 wpml_register_string() 显式注册,或配置为可翻译自定义字段;
- 所有翻译操作均需在 WPML 后台完成,PHP 层不负责翻译逻辑,只负责调用 apply_filters('wpml_translate_single_string', ...) 获取译文;
- 始终检查 WPML 调试模式(WPML → Support → Debug information)确认插件文本域是否被正确识别。
通过以上步骤,你的小工具即可在多语言站点中准确呈现本地化文本与动态名称,真正实现 WPML 全链路翻译支持。











