WordPress 插件的国际化:__() 与 load_plugin_textdomain 的正确顺序
摘要
做了 i18n 却发现翻译不生效,八成是加载时机写错了。标准的三步// 1. 所有字符串用翻译函数包裹 __('Hello', 'my-plugin'); _e('Settings', 'my-plugin'); // 2. 在 plug
做了 i18n 却发现翻译不生效,八成是加载时机写错了。
标准的三步
// 1. 所有字符串用翻译函数包裹
__('Hello', 'my-plugin');
_e('Settings', 'my-plugin');
// 2. 在 plugins_loaded 之后加载语言包
add_action('init', function(){
load_plugin_textdomain(
'my-plugin',
false,
dirname(plugin_basename(__FILE__)) . '/languages/'
);
});为什么不能更早
load_plugin_textdomain() 内部依赖 WP 的语言环境,这个环境在 init 之前还没定下来。挂到 plugins_loaded 上通常也可以,但 init 最稳。
文件名要严格对齐
Domain: my-plugin 对应语言包文件名必须是 my-plugin-zh_CN.mo。大小写和连字符错一个字符都加载不到,而且不会报错,表现为直接显示英文原文。
带变量的字符串
sprintf(__('Deleted %d items', 'my-plugin'), $count);不要用字符串拼接,语序在不同语言里不一样,必须用占位符。
复数形式
_n('%d comment', '%d comments', $count, 'my-plugin');中文虽然只有一个形式,但格式还是要按规定写两个参数,否则 .po 文件解析会出错。
调试技巧
怀疑翻译没加载,临时输出 get_locale() 和 is_textdomain_loaded('my-plugin'),两个都对了就是 .mo 文件本身的问题。
所属专题
2026年10月20日 14:59
前后30天 · 点日期看归档
9月20日
9月21日
9月22日
9月23日
9月24日
9月25日
9月26日
9月27日
9月28日
9月29日
9月30日
10月1日
10月2日
10月3日
10月4日
10月5日
10月6日
10月7日
10月8日
10月9日
10月10日
10月11日
10月12日
10月13日
10月14日
10月15日
10月16日
10月17日
10月18日
10月19日
10月20日
10月21日
10月22日
10月23日
10月24日
10月25日
10月26日
10月27日
10月28日
10月29日
10月30日
10月31日
11月1日
11月2日
11月3日
11月4日
11月5日
11月6日
11月7日
11月8日
11月9日
11月10日
11月11日
11月12日
11月13日
11月14日
11月15日
11月16日
11月17日
11月18日
11月19日