搜索全站
multilingual 2 分钟阅读

主题与插件国际化 i18n 规范:文本域、占位符与复数

开发者视角:写可被翻译的主题/插件要遵守的 i18n 规范——正确使用 __/_e 与文本域、占位符避免拼接、复数处理,让 Loco/Poedit 顺利提取、译文不串。

U
UFO_PF 2022-12-15 · 阅读 2 分钟
主题 MULTILINGUAL
阅读提示
本文约 735 字,预计阅读 2 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:字写死翻译工具抓不到

开发者把”提交”硬编码成 '提交',翻译工具提取不到,多语言站界面永远原语。i18n 规范就是”所有用户可见字符串走翻译函数 + 文本域”。

原理分析:规范要点

  1. 文本域:每个 __('x','mytextdomain') 必须带域,否则 WP 不知归谁。
  2. 占位符:别用 '共'.$n.'篇',要用 sprintf(__('共 %d 篇','d'),$n),让译文调整语序。
  3. 复数:用 _n('条','条',$n,'d') 处理单复数(英文 a/复数)。
  4. 不拼字符串:”Welcome “.__(‘user’) 在不同语言语序错。

保姆级实操

正确写法:

echo sprintf( __( '共 %d 篇评论', 'mytheme' ), $count );
echo _n( '一条评论', '%d 条评论', $count, 'mytheme' );
load_theme_textdomain( 'mytheme', get_stylesheet_directory() . '/languages' );

提取:wp i18n make-pot(WP-CLI)生成 pot。

常见坑

  1. 漏文本域,字符串孤儿。
  2. 拼接字符串,译文语序错。
  3. 案例:某主题用”Hello “.__(‘name’),德语语序变,改 sprintf 后正常。
  4. 复数用 if 硬编码,部分语言不止两形。
  5. HTML 塞进翻译串,译文带标签易错。

总结

判断标准:所有可见串走 __() 带域、用占位符/复数、HTML 外置。行动清单:审代码 → 改硬编码 → 加域 → make-pot → 验提取。详见用 Loco Translate 翻译主题与插件界面。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。