
本文详解如何在自定义 WordPress 插件中,利用 WPML 的字符串翻译(String Translation)机制,对硬编码文本(如 'Contact with')及动态数据库字段(如 $name)进行多语言支持,确保小工具内容可被完整翻译。
本文详解如何在自定义 wordpress 插件中,利用 wpml 的字符串翻译(string translation)机制,对硬编码文本(如 `'contact with'`)及动态数据库字段(如 `$name`)进行多语言支持,确保小工具内容可被完整翻译。
在 WordPress 插件开发中,若需让小工具(Widget)内容支持多语言,仅使用 esc_html_e() 并不足以实现 WPML 的自动翻译——它仅触发 WordPress 原生 i18n 流程,而 WPML 需要显式注册“可翻译字符串”并配合其后台管理界面完成翻译映射。
✅ 正确做法:结合 icl_register_string() 与 icl_t()
对于你示例中的代码:
echo esc_html_e('Contact with','my-plugin') ." ". esc_attr($name);
应重构为以下两步:
1. 注册静态文本为可翻译字符串(推荐在插件激活或初始化时执行)
// 在插件主文件或 widget 类的 init 方法中注册
if (function_exists('icl_register_string')) {
icl_register_string('my-plugin', 'contact_with_label', 'Contact with');
}
⚠️ 注意:icl_register_string() 必须在 WPML 已加载后调用(建议挂载到 plugins_loaded 或 wpml_loaded 钩子),且仅需注册一次(如在插件激活时调用更稳妥)。
2. 在前端输出时使用 icl_t() 获取翻译
$label = icl_t('my-plugin', 'contact_with_label', 'Contact with');
echo esc_html($label) . ' ' . esc_html(apply_filters('wpml_translate_single_string', $name, 'my-plugin', 'contact_name_field'));
? 关于 $name(来自数据库的动态值):
若 $name 是用户输入的、需按语言区分的内容(如不同语言下显示不同名称),不应直接翻译字符串,而应将其作为 WPML 自定义字段(Custom Field)或使用 wpml_translate_single_string 过滤器注册为可翻译字符串。例如:// 首次保存或更新时注册(避免重复注册) if (function_exists('icl_register_string') && !empty($name)) { icl_register_string('my-plugin', 'contact_name_' . $id, $name); } // 输出时获取翻译 $translated_name = icl_t('my-plugin', 'contact_name_' . $id, $name);
? 后续操作(必需)
- 登录 WordPress 后台 → WPML → String Translation,搜索 my-plugin,即可看到 'Contact with' 和 contact_name_* 字符串;
- 点击“翻译”,为每种启用的语言填写对应译文;
- 若字符串未出现,请先访问含该小工具的页面(触发注册),再点击 WPML → String Translation → “Scan for strings”(或手动刷新“Rescan theme and plugins for new strings”)。
✅ 最佳实践建议
- 使用唯一、语义化的 context(如 'my-plugin')和 name(如 'contact_with_label'),避免冲突;
- 动态字符串(如 $name)建议配合唯一标识(如数据库 ID)生成 name,防止覆盖;
- 永远对输出做 esc_html() 处理,icl_t() 返回的是原始字符串,不自动转义;
- 如小工具本身由 WPML 原生支持(如文本小工具),请优先启用 WPML → Translation Management → Widget Translation 设置,但自定义小工具仍需手动注册字符串。
通过以上方式,你的插件小工具即可无缝集成 WPML 多语言体系,实现专业级国际化支持。











