PHP多语言应使用gettext而非硬编码数组,需setlocale、bindtextdomain、textdomain三步初始化;_()和ngettext()用于模板,xgettext自动生成.po文件,新增字符串后须重新提取并合并翻译。
用
做多语言,别硬
编码
字符串
PHP 动态网站做多语言,最稳妥的方式是用系统级的
,而不是自己写数组映射或 JSON 翻译包。它支持复数、上下文、区域设置切换,且被 Apache/Nginx 和大多数 Linux 发行版原生支持。
关键点:必须用
+
+
三步配齐,缺一不可;否则
函数始终返回原文。
常见错误现象:
返回空字符串或原文,大概率是
文件路径不对、文件权限不足(Web 进程需可读)、或 locale 名字拼错(比如用了
却没在系统里启用)。
控制语言切换,但别只靠它存状态
用户点击语言切换按钮时,把选中的语言代码(如
、
)存进
是常规操作,但要注意三点:
每次请求开头必须先
,否则
不可用
语言参数应同时写入
cookie
(带
),避免 session 失效后语言重置
URL 中显式带
更可靠,可作为 fallback,比如用户首次访问时从
解析后跳转一次
不推荐仅依赖 URL 参数做语言判定——搜索引擎爬虫和分享链接容易丢失上下文。
模板中用
和
,别用
硬编码语言数组(如
)看似简单,实际维护成本极高:新增语言要改所有数组、无法处理复数(如 “1 file” / “3 files”)、不能适配 RTL 布局、IDE 无法提示缺失翻译项。
正确做法是在 HTML 模板里直接调用:
自动根据
和当前 locale 的复数规则选词,比手动 if-else 可靠得多。注意:所有待翻译字符串必须是纯字符串字面量,不能拼接变量(
会导致
提取失败)。
生成
文件要用
,别手写
翻译源文件(
)必须由工具自动生成,否则极易漏项、格式错乱、msgid 重复。
命令示例:
要点:
加
防止中文乱码
指定
让它识别
、
等函数
生成后用
初始化新语言分支
每次代码新增字符串后,必须重新跑
并用
合并旧翻译,否则上线后出现空白文本
很多团队卡在这一步:开发改了界面文案却忘了更新
,结果生产环境部分文字消失——这问题没法靠测试发现,只能靠流程卡点。
立即学习
“
PHP免费学习笔记(深入)
”;
gettextgettextsetlocale(LC_ALL, $locale)bindtextdomain()textdomain()_()gettext.mozh_CN.utf8$_SESSION['lang']en_USzh_CN$_SESSION['lang']session_start()$_SESSIONSameSite=Lax?lang=xx_XX$_SERVER['HTTP_ACCEPT_LANGUAGE']_()ngettext()echo $lang['xxx']$lang = ['home' => '首页', 'about' => '关于'];
ngettext()$count_("Hello " . $name)xgettext.poxgettext.poxgettext --from-code=UTF-8 -L PHP -o messages.po *.php templates/*.php--from-code=UTF-8-L PHP_()ngettext()msginit --input=messages.po --locale=zh_CNxgettextmsgmerge.po