webman原生仅支持trans()函数,依赖config/translation.php配置locale、fallback_locale和path三项;i18n()和__()不存在,直接调用报错;语言文件须为lang/{locale}/messages.php格式,且每次请求需显式调用setlocale()初始化上下文。

Webman 里直接用 i18n() 或 __() 函数会报错 —— 它们根本不存在,除非你手动注册或装了非官方扩展。 真正开箱即用、被框架原生支持的只有 trans(),且它只认 config/translation.php 这个文件,其他名字(比如 i18n.php)全是摆设。
trans() 函数不生效?先确认 config/translation.php 是否存在且格式正确
Webman 不扫描配置目录,也不加载任意命名的 PHP 配置文件。它只在启动时读取 config/translation.php,且该文件必须返回一个含三项的数组:
-
locale:默认语言标识,如'zh_CN',必须和你后续要加载的语言目录名完全一致(zh_CN≠zh≠zh-cn) -
fallback_locale:数组,例如['zh_CN', 'en_US'],当当前语言缺某 key 时按顺序回退 -
path:绝对路径,指向语言文件根目录(不是单个文件!),推荐写成__DIR__ . '/../lang'
常见错误是把配置塞进 app.php 或新建了 i18n.php 却没在任何地方调用 config('i18n') —— 这些都不会触发 trans() 加载逻辑。
语言文件路径和命名必须严格匹配 locale 值
trans('welcome') 要查到内容,得满足三个硬性条件:
- 你设的
locale是'zh_CN',那语言文件就必须放在lang/zh_CN/messages.php(注意不是zh.php或zh_CN.php) -
messages.php必须是纯返回数组的文件,不能有echo、BOM、多余空格或注释:return [<br> 'welcome' => '欢迎',<br> 'hello' => '你好'<br>];
- 键名只能是 ASCII 字母、数字、下划线,不能含空格或点号;嵌套数组(如
['auth' => ['login' => '登录']])会被原样返回,不递归解析
语言切换后页面没变?别只改 Session,得重初始化 trans() 上下文
Webman 的 trans() 在单次请求内缓存语言环境,不会监听 Session 或 Cookie 变更。用户点了“切换英文”,只执行 $_SESSION['locale'] = 'en_US'; 是无效的。
- 必须在每次请求开始时(如全局中间件或控制器基类的
initialize())重新设置语言上下文 - 调用顺序不能错:
app()->setLocale($locale)(注意不是setlocale()系统函数)必须在第一个trans()调用之前完成 - 如果从 URL 取值(如
$_GET['lang']),记得校验它是否在config/translation.php的fallback_locale白名单里,否则会被忽略
想用 gettext?Webman 不拦着,但得自己扛全部初始化责任
Webman 没封装 gettext,你要用就得自己写三步初始化逻辑,并确保每次请求都执行:
- 调用
setlocale(LC_ALL, $locale),且$locale必须和系统已安装的 locale 名完全一致(locale -a | grep zh_CN查) - 用
bindtextdomain('messages', __DIR__ . '/locale')绑定绝对路径,目录结构必须为/locale/zh_CN.UTF-8/LC_MESSAGES/messages.mo - 再调一次
textdomain('messages'),否则_()仍查旧域
最容易被忽略的是:Docker 环境下 Alpine 镜像默认不带完整 locale,Debian 镜像也常需手动 locale-gen;msgfmt 编译失败却生成空 .mo 文件,也会导致静默失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











