如何用PHP实现API国际化功能,返回多语言错误消息?
- 内容介绍
- 文章标签
- 相关推荐
本文共计804个文字,预计阅读时间需要4分钟。
PHP API 返回结果处理:
Locale 必须在验证/响应前就设好,不能等进控制器才动
很多开发者把 App::setLocale() 或 Lang::setLang() 放在控制器方法开头,但此时验证器(如 Laravel 的 FormRequest 或 ThinkPHP 的 Validate::check())可能已初始化完毕,错误消息早已按默认语言生成。结果就是:你设了中文,但验证失败提示还是英文。
- Laravel:必须在中间件(如
LocaleMiddleware)中调用App::setLocale(),且该中间件要排在ValidateRequests之前 - ThinkPHP:
Lang::setLang()必须在app()->initialize()后、任何验证逻辑前执行;CLI 场景下还得手动Lang::load()对应语言文件 - 原生 PHP:若用
gettext,setlocale()和bindtextdomain()必须在第一次调用gettext()前完成,且不能被后续请求覆盖
错误码 → 语言键的映射不能靠猜,必须显式维护
框架不会自动把 'invalid_request' 这种 OAuth2 错误码,映射到 lang/zh-CN/errors.php 里的同名键。你得自己建一张表,告诉程序“这个错误码对应哪个翻译键”。
本文共计804个文字,预计阅读时间需要4分钟。
PHP API 返回结果处理:
Locale 必须在验证/响应前就设好,不能等进控制器才动
很多开发者把 App::setLocale() 或 Lang::setLang() 放在控制器方法开头,但此时验证器(如 Laravel 的 FormRequest 或 ThinkPHP 的 Validate::check())可能已初始化完毕,错误消息早已按默认语言生成。结果就是:你设了中文,但验证失败提示还是英文。
- Laravel:必须在中间件(如
LocaleMiddleware)中调用App::setLocale(),且该中间件要排在ValidateRequests之前 - ThinkPHP:
Lang::setLang()必须在app()->initialize()后、任何验证逻辑前执行;CLI 场景下还得手动Lang::load()对应语言文件 - 原生 PHP:若用
gettext,setlocale()和bindtextdomain()必须在第一次调用gettext()前完成,且不能被后续请求覆盖
错误码 → 语言键的映射不能靠猜,必须显式维护
框架不会自动把 'invalid_request' 这种 OAuth2 错误码,映射到 lang/zh-CN/errors.php 里的同名键。你得自己建一张表,告诉程序“这个错误码对应哪个翻译键”。

