如何使用Composer处理PHP项目中的国际化(i18n)文件? (资源管理)

13次阅读

composer 不处理国际化文件,因其仅为依赖管理器;翻译资源应作为源码纳入版本控制,而非依赖 Composer 安装或生成,推荐用 Makefile 或自定义脚本替代不可靠的 composer.json scripts。

如何使用Composer处理PHP项目中的国际化(i18n)文件? (资源管理)

Composer 本身不处理国际化(i18n)文件,它只是依赖管理器;你不能用 composer install 自动下载或编译 .po.momessages.php 这类语言资源。

为什么 composer.json 的 scripts 无法可靠生成翻译文件

有人尝试在 composer.jsonscripts 中调用 php bin/console translation:extractsymfony)或 xgettext,但这存在明显问题:

  • 命令依赖项目已安装的框架/工具,而 composer install 阶段这些可能还没就绪(尤其是 --no-dev 时)
  • 提取逻辑通常需扫描源码路径、识别翻译函数(如 __('hello')$translator->trans('key')),但 Composer 不理解 PHP 语法或框架约定
  • 不同项目用不同 i18n 方案(Symfony Translation, laravel Lang, gettext, PHP arrays),没有统一钩子

推荐做法:把 i18n 文件当作“源码”而非“依赖”来管理

将翻译资源纳入版本控制,而非试图让 Composer 下载或生成它们。具体操作取决于你的方案:

  • 使用 Symfony?把 translations/ 目录提交进 git,运行 bin/console translation:extract --force en fr 手动更新,再 git add translations/
  • 使用 gettext?提交 locale/en_US/LC_MESSAGES/messages.po 和编译后的 .mo,用 msgfmt -o messages.mo messages.po 构建,不靠 Composer
  • 使用纯 PHP 数组(如 lang/en.php)?直接提交该文件,确保 include 路径正确,无需额外工具

如果真要自动化,用 Makefile 或自定义脚本替代 Composer scripts

比起在 composer.json 里塞一不可靠的 post-install-cmd,更可控的方式是写一个 Makefilescripts/i18n-sync.sh

立即学习PHP免费学习笔记(深入)”;

#!/bin/bash # scripts/i18n-sync.sh set -e if [ ! -f "vendor/autoload.php" ]; then   echo "Run 'composer install' first"   exit 1 fi bin/console translation:extract --force --output-format=xliff --domain=messages en fr msgmerge -U locale/fr_FR/LC_MESSAGES/messages.po locale/en_FR/LC_MESSAGES/messages.po msgfmt -o locale/fr_FR/LC_MESSAGES/messages.mo locale/fr_FR/LC_MESSAGES/messages.po

然后执行 bash scripts/i18n-sync.sh —— 这样时机、依赖、错误处理都由你自己掌控,不会被 Composer 生命周期干扰。

真正容易被忽略的是:i18n 文件的变更往往需要重新部署+重启(比如某些缓存机制下修改 .mo 不生效),而这点无论用什么工具触发,都得手动验证。别指望 Composer 能绕过这个环节。

text=ZqhQzanResources