Yii 2 翻译工作流完全指南:框架消息提取、文档翻译与国际化协作实践
后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载导读Yii 2 作为面向国际化的 PHP 框架其核心代码、校验器与框架消息均内置了多语言支持同时官方文档也被翻译为十余种语言。本文以 docs/internals-sr-Latn/translation-workflow.md 为核心脉络系统讲解 Yii 2 框架消息framework messages的提取、翻译与维护流程以及文档翻译的目录约定和差异报告生成方法并结合仓库内 framework/messages/config.php、framework/console/controllers/MessageController.php 等源码与真实翻译文件深入剖析底层实现原理。读完本文你将能够为 Yii 2 新增一种语言的消息翻译、把官方文档翻译到目标语言并通过构建命令自动生成翻译进度报告。翻译贡献的两大领域Yii 2 的国际化工作覆盖两个主要区域二者贡献者都可以直接参与框架消息framework messages指框架内通过Yii::t()定义的、会展示给最终用户的字符串例如表单校验错误提示。文档documentation指 docs/guide用户指南、docs/internals内部文档等官方文档的多语言翻译。一个重要的前提是并非所有框架内字符串都需要翻译。Yii 2 框架中存在两类消息面向开发者的异常消息例如Invalid config value for the ... component这类抛给程序员的异常文本永远不会被翻译保持英文原样面向最终用户的可见消息例如The file {file} is too big.、Page not found.、Please fix the following errors:等校验与界面提示这些才是翻译工作的对象。判断标准很简单凡是通过Yii::t(yii, ...)翻译函数标记的、实际渲染到页面上的消息都属于需要翻译的范畴。框架消息翻译四步流程第 1 步在languages列表中登记你的语言打开 framework/messages/config.php检查你的语言代码是否已存在于languages数组中languages [ af, ar, az, be, bg, bs, ca, cs, da, de, el, es, et, fa, fi, fr, ga, he, hi, pt-BR, ro, hr, hu, hy, id, it, ja, ka, kk, ko, kz, lt, lv, ms, mt, nb-NO, nl, pl, pt, ru, sk, sl, sr, sr-Latn, sv, tg, th, tr, uk, uz, uz-Cy, vi, zh, zh-TW ],如果目标语言不在列表中就添加它并保持列表的字母顺序。语言代码的书写格式必须遵循IETF 语言标签规范IETF language tag spec例如ru俄语zh-CN简体中文地区子标签使用连字符分隔sr-Latn塞尔维亚语拉丁字母变体仓库实际维护的语言目录可参见 framework/messages 下的各语言子目录af/、ru/、sr-Latn/、zh/、zh-TW/等当前共计五十余种与config.php的languages列表一一对应。第 2 步运行消息提取命令进入framework目录执行控制台命令./yii message/extract yii/messages/config.php --languagesyour_language其中your_language替换为目标语言代码例如./yii message/extract yii/messages/config.php --languageszh-CN该命令由 framework/console/controllers/MessageController.php 的actionExtract()实现其底层执行流程为initConfig()读取配置文件校验必须包含sourcePath与languages两个键对应源码第 984-985 行的throw new Exception(The configuration file must specify sourcePath and languages.)通过FileHelper::findFiles()遍历 framework 目录下所有符合only [*.php]规则、且未被except排除的 PHP 源文件使用配置中的translator [\Yii::t, Yii::t]作为标记正则扫描每个文件中Yii::t(...)的调用array_merge_recursive汇总出全部待翻译消息对配置中列出的每个语言在messagePath即framework/messages下创建language子目录并调用saveMessagesToPHP()写入翻译文件。actionExtract()还支持format配置为db写入数据库表{{%source_message}}/{{%message}}或po/pot生成 GNU gettext 格式但框架自身的消息翻译默认使用php格式。第 3 步翻译消息文件命令执行后会在 framework/messages/your_language/yii.php 生成或更新翻译文件。务必确保文件以 UTF-8 编码保存文件头注释也明确写有NOTE: this file must be saved in UTF-8 encoding.。翻译文件的格式为 PHP 数组每个数组元素就是一条消息的键值对键是英文原文值是该消息的翻译。以 framework/messages/sr-Latn/yii.php 为例return [ and i , (not set) (bez vrednosti), An internal server error occurred. Došlo je do interne greške na serveru., Delete Obriši, Home Početna, Page not found. Stranica nije pronađena., The file {file} is too big. Its size cannot exceed {formattedLimit}. Fajl {file} je prevelik. Veličina ne može biti veća od {formattedLimit}., // ... ];翻译时有几个关键约定值为空串表示未翻译例如Action not found. 表示这条消息尚未翻译提取命令再次运行时会保留空值待后续填充双标记表示已废弃消息在源码中不再出现removeUnused与markUnused均为true时其翻译会被包裹在一对之间例如... 翻译文本提示该条目已不再需要翻译若配置removeUnused true则会直接删除这类条目见 framework/messages/config.php 第 33-38 行的注释说明支持复数形式格式plural forms消息字符串可以使用 ICU 复数语法例如 framework/messages/sr-Latn/yii.php 中的分页提示Showing b{begin, number}-{end, number}/b of b{totalCount, number}/b {totalCount, plural, one{item} other{items}}. Prikazano b{begin, number}-{end, number}/b od b{totalCount, number}/b {totalCount, plural, 1{stavke} one{stavke} few{stavke} many{stavki} other{stavki}}.,复数规则1、one、few、many、other与目标语言自身的语法体系强相关——例如塞尔维亚语同时存在few少量与many大量规则而中文几乎只需other。关于复数格式与消息占位符{begin, number}、{totalCount, plural, ...}的完整语法请参考 i18n 章节 的教程。第 4 步提交 Pull Request完成翻译后按照 docs/internals-sr-Latn/git-workflow.md 描述的 Git 工作流提交 Pull Request 即可。值得一提的是该文档指出仅涉及翻译字符串、文档或 JS/CSS/图片的改动会在提交信息中加入[ci skip]标记从而跳过 CI 构建以减轻服务负担——纯翻译提交因此通常无需等待完整测试流水线。保持翻译与源码同步源码迭代后消息集可能发生变化新增消息、删除消息。此时只需再次运行同一条提取命令./yii message/extract yii/messages/config.php --languagesyour_language提取器会自动合并差异已翻译且仍被使用的消息原样保留新增的消息以空值追加不再需要的消息则被标记或删除取决于配置。这正是 framework/messages/config.php 中overwrite true、sort true、removeUnused true、markUnused true等选项协同作用的结果贡献者无需手工比对源码与翻译文件的差异。配置文件关键参数速览framework/messages/config.php 是消息提取的枢纽其核心参数与作用如下参数当前仓库取值作用说明sourcePath__DIR__ . /..即 framework 根目录扫描哪些目录下的源码以提取Yii::t()消息messagePath__DIR__framework/messages生成的翻译文件存放根目录languages五十余种语言代码数组需要生成/更新哪些语言的翻译文件translator[\Yii::t, Yii::t]以哪些函数调用作为消息提取标记sorttrue合并新消息时是否按键排序overwritetrue是否用合并结果覆盖现有翻译文件removeUnusedtrue是否删除源码中已不存在的消息条目markUnusedtrue是否用标记已不存在的消息与removeUnused配合使用except[.*, /.*, /messages, /tests, /runtime, /vendor, /BaseYii.php]排除不参与提取的目录/文件如 tests、vendoronly[*.php]仅处理 PHP 源文件formatphp输出格式可改为db、po、potphpFileHeaderYii 标准版权头注释写入生成文件的头部注释从源码看MessageController.phpformat决定消息落盘方式php/po按语言逐目录写文件db写入数据库两张表pot生成单一 POT 模板。若自行扩展提取场景可参考该文件生成符合需求的自定义配置。文档翻译目录约定与进度报告目录结构约定文档翻译与消息翻译的存放方式不同所有文档翻译统一放在docs/original-language目录下其中original是原始文档集的名称例如guide用户指南或internals内部文档language是目标文档的语言代码。例如俄语用户指南的翻译位于 docs/guide-ru而本文所属的塞尔维亚语拉丁字母版内部文档位于 docs/internals-sr-Latn。仓库中现存的语言版本包括guide-ar、guide-de、guide-es、guide-fr、guide-id、guide-it、guide-ja、guide-pl、guide-pt-BR、guide-ru、guide-tr、guide-uk、guide-uz、guide-vi、guide-zh-CN等均遵循同一命名规则。生成翻译进度报告文档翻译的难点在于追踪上次翻译之后源文档又改了什么。仓库为此提供了专门的构建命令在build目录下执行php build translation ../docs/guide ../docs/guide-ru Russian guide translation report report_guide_ru.html该命令接收三个参数../docs/guide原始文档目录英文版../docs/guide-ru目标语言翻译目录Russian guide translation report生成报告 HTML 页面的标题文字。输出通过 shell 重定向写入report_guide_ru.html打开即可查看源文档中尚未同步到翻译版的变更内容。如果命令提示缺少 composer 依赖先在仓库根目录执行composer install再重试。文档写作规范翻译文档同样需要遵守官方写作规范可参考 docs/documentation_style_guide.md 中的语法与排版指南如代码块、链接、表格的使用约定保证翻译文档与英文原版在结构上保持一致便于后续差异比对工具准确识别变更。结合源码理解消息提取的底层逻辑想要透彻理解翻译工作流可以通读消息提取控制器的核心实现 framework/console/controllers/MessageController.phpactionExtract()第 300-341 行提取主入口遍历源码 → 聚合消息 → 按format分发到不同保存逻辑actionConfig()相关逻辑第 65、168、198 行--languages命令行选项映射到$this-languages覆盖配置文件中的同名键这正是--languagesyour_language能按需限定目标语言的原因saveMessagesToPHP()负责php格式文件的合并写入实现保留已翻译条目、追加新条目、标记废弃条目的合并语义第 984-985 行的配置校验配置文件缺少sourcePath或languages时直接抛出异常避免误用不完整配置。对框架自身的消息提取而言sourcePath指向 framework 根目录translator标记Yii::t(yii, ...)形式的调用except规则排除了tests、vendor、runtime以及BaseYii.php其内部含大量仅供开发者阅读的异常消息不应进入翻译流程。这与文档中开发者异常不翻译、用户可见消息才翻译的原则相互印证。实战检查清单完成一次框架消息翻译贡献可按以下清单自检语言代码已按字母顺序加入 framework/messages/config.php 的languages列表且符合 IETF 标签规范如zh-CN、sr-Latn在framework目录下成功执行./yii message/extract yii/messages/config.php --languagesyour_language生成了framework/messages/language/yii.php翻译文件已用 UTF-8 编码保存空值消息已填充译文标记的废弃消息已按需处理涉及复数或占位符的消息严格遵循 i18n 教程 的格式如{totalCount, plural, one{...} other{...}}文档翻译位于docs/original-language目录必要时用php build translation生成报告核对同步进度按 Git 工作流 提交 Pull Request纯翻译改动可在提交信息中包含[ci skip]。遵循上述流程无论是为 Yii 2 补齐一个新语种的框架消息还是推进某语言版本的官方文档翻译都能在清晰的目录约定与自动化的提取/报告工具支持下高效完成让框架真正服务于国际化的应用与开发者。赞分享后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载相关推荐3大技术突破OpenHantek如何为开源示波器软件定义新标准3大技术突破OpenHantek如何为开源示波器软件定义新标准 你是否曾经面对昂贵的专业示波器软件而感到无力或者在使用闭源硬件时受限于厂商提供的有限功能O桌面应用智能硬件Yii 2 国际化I18N完全指南消息翻译、ICU 格式化与 message 命令实战Yii 2 国际化I18N完全指南消息翻译、ICU 格式化与 message 命令实战 本指南基于 Yii 2 框架的官方国际化文档 docs/guid后端Web框架focus.nvim高级技巧如何利用方向键实现智能窗口分割与导航focus.nvim高级技巧如何利用方向键实现智能窗口分割与导航 作为一名 Neovim 用户你是否厌倦了手动调整窗口大小的繁琐操作是否希望在多个分割窗口上一篇抖音视频批量采集助手3步掌握多用户视频高效下载终极指南下一篇WarcraftHelper3分钟解决魔兽争霸III现代系统兼容性问题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

ComfyUI-WanVideoWrapper 上手指南:5 步跑通文生视频到口型动画

ComfyUI-WanVideoWrapper 上手指南:5 步跑通文生视频到口型动画

ComfyUI-WanVideoWrapper 上手指南:5 步跑通文生视频到口型动画 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 想给电商团队交一条 5 秒的产品宣传视频,拖入现成工作流却…

2026/9/24 15:55:06 阅读更多 →
建筑 AI 出图工具单轮同场测试:速度、空间保持与局部修改

建筑 AI 出图工具单轮同场测试:速度、空间保持与局部修改

测试日期:2026年9月23日。本文记录一次非盲测、单轮测试,不构成产品排名、购买建议或性能承诺。 建筑概念阶段常见的两个问题是:白模转效果图需要多久,以及局部修改能不能只改指定区域。为了减少不同输入带来的影响,本…

2026/9/24 15:55:06 阅读更多 →
RK3588实战指南:KVM/QEMU打造ARM虚拟化服务器

RK3588实战指南:KVM/QEMU打造ARM虚拟化服务器

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 15:55:06 阅读更多 →

最新新闻

AWS SDK for C++ 跨服务示例全解析:从 Aurora Serverless 任务追踪器到 SNS/SQS 发布订阅

AWS SDK for C++ 跨服务示例全解析:从 Aurora Serverless 任务追踪器到 SNS/SQS 发布订阅

示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地…

2026/9/24 16:37:44 阅读更多 →
关于电缆标签

关于电缆标签

1.电缆按照树结构分 2,隐藏电缆高层代号3.页—页宏–插入 导入宏文件 线缆标签名称自动生成 线缆标签不重复

2026/9/24 16:37:44 阅读更多 →
PHPStan 错误标识符 requireImplements.deprecatedClass 详解:`@phpstan-require-implements` 引用已废弃类时的检测与修复

PHPStan 错误标识符 requireImplements.deprecatedClass 详解:`@phpstan-require-implements` 引用已废弃类时的检测与修复

PHPStan 错误标识符 requireImplements.deprecatedClass 详解:phpstan-require-implements 引用已废弃类时的检测与修复 【免费下载链接】phpstan PHP Static Analysis Tool - discover bugs in your code without running it! 项目地址: https://gitcode.com/gh_…

2026/9/24 16:37:43 阅读更多 →
优秀的项目经理,从来不靠记忆力跟进项目进度

优秀的项目经理,从来不靠记忆力跟进项目进度

很多管理者每天极度内耗: 靠着大脑死记几十项任务、记每个节点工期、记谁的工作没完成、记哪里存在卡点。 真正资深、能同时掌控多个项目的项目经理,往往一点都不忙乱。不是他们记忆力更强、精力更充沛,而是他们早就戒掉了靠记忆管理项目的低…

2026/9/24 16:37:43 阅读更多 →
如何自动识别文件编码?chardet4cj 字符编码检测库新手完全入门指南

如何自动识别文件编码?chardet4cj 字符编码检测库新手完全入门指南

如何自动识别文件编码?chardet4cj 字符编码检测库新手完全入门指南 【免费下载链接】chardet4cj 一个用于检测常用文本编码的库 项目地址: https://gitcode.com/Cangjie-TPC/chardet4cj 打开一个来路不明的文本文件,却看到满屏乱码?这…

2026/9/24 16:37:43 阅读更多 →
如何快速接入支付宝支付?alipay_sdk_cj仓颉原生SDK完全指南

如何快速接入支付宝支付?alipay_sdk_cj仓颉原生SDK完全指南

如何快速接入支付宝支付?alipay_sdk_cj仓颉原生SDK完全指南 【免费下载链接】alipay_sdk_cj AliPay Sdk for 仓颉 支付宝接口后端sdk,方便cangjie开发者快速接入支付宝的支付接口(目前只支持最广泛使用的商户直接接入模式,只支持最…

2026/9/24 16:36:43 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →