ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

POMO 实战指南:在 PHP 项目中用 MO/PO 文件实现 gettext 风格 i18n 国际化翻译

POMO 实战指南:在 PHP 项目中用 MO/PO 文件实现 gettext 风格 i18n 国际化翻译 后端【免费下载链接】YOURLS The standard, self hosted, powerful and customizable, URL shortener in PHP项目地址https://gitcode.com/gh_mirrors/yo/YOURLS点击查看免费下载POMOPHP Object Message Object是一个纯 PHP 实现的 gettext 翻译库专门用于读取、解析、生成和查询 MO/PO 格式的翻译文件为自托管 PHP 应用提供轻量级的 i18n国际化能力。本篇指南将基于 POMO 的官方 README 与仓库源码带你掌握其安装方式、核心 API 用法、MO/PO 文件的底层解析原理以及它在 YOURLS 短链接项目中作为翻译引擎的实际落地方式读完即可在自己的 PHP 项目中接入这套翻译方案。POMO 是什么POMO 的全称是 Gettext library to translate with i18n它把 GNU gettext 工具链中经典的.moMachine Object二进制机器可读格式和.poPortable Object人类可读的纯文本格式翻译文件抽象为一组 PHP 类开发者无需依赖服务器上的 gettext C 扩展就能在纯 PHP 环境中完成翻译字符串的加载、查询与导出。在 YOURLS 项目中POMO 以 vendor 依赖的形式被内置在 includes/vendor/pomo/pomo 目录中并被 includes/functions-l10n.php 通过use POMO\MO;与use POMO\Translations\NOOPTranslations;引入作为多语言界面如法语 fr_FR 翻译的实际加载引擎。仓库源码结构总览从源码目录布局可以直观看到 POMO 的分层设计见 includes/vendor/pomo/pomo/src目录/文件职责src/MO.phpMO 二进制文件的导入与导出src/PO.phpPO 文本文件的导入与导出src/Parser/PluralForms.php解析 gettext 复数表达式如nplurals2; plural(n ! 1)src/Streams/底层字节流读取抽象FileReader、StringReader、CachedFileReader 等src/Translations/翻译条目容器Translations、EntryTranslations、GettextTranslations 等安装 POMOPOMO 通过 Composer 分发官方推荐方式对应 README 的 Installation 章节composer require pomo/pomo安装后在业务代码中引入 Composer 自动加载器即可使用?php require vendor/autoload.php; use POMO\MO; // 业务代码...需要说明的是在 YOURLS 当前仓库中 POMO 是作为内置 vendor 依赖随项目分发的其自动加载映射注册在 includes/vendor/composer/autoload_psr4.php 与 includes/vendor/composer/installed.php 中因此 YOURLS 自身运行时无需再单独执行composer require。快速上手加载 MO 文件并翻译README 给出了一个最精简、可直接运行的示例这也是 POMO 的核心使用范式——创建对象 → 导入文件 → 翻译文本三步走?php use POMO\MO; // Create MO object $translations new MO(); // Import MO file $translations-import_from_file($the_mo_filepath); // Translate $translations-translate($text);这段代码的底层行为可以在 src/MO.php 中找到对应实现new MO()构造一个继承自GettextTranslations的翻译容器默认_nplurals 2即默认认为语言有两种复数形式import_from_file($filename)src/MO.php 第 52-63 行内部先通过FileReader打开文件若资源不可用则返回false否则记录文件名并调用import_from_reader()完成二进制解析translate($text)src/Translations/Translations.php 第 82-93 行根据源字符串构造一个临时EntryTranslations条目在$entries表中按 key 精确查找命中且译文非空时返回译文否则原样返回源字符串未翻译内容天然回退到原文这是 gettext 的标准降级行为。对于中文等多字节语言需要注意translate()返回的是对应语言环境下的翻译文本例如在 YOURLS 的 fr_FR 语言包场景下英文原文会被替换为法语译文。核心 API 深入MO 与 PO 的双向能力MO 二进制格式的导入与导出MO类不仅支持读取还支持反向导出。导出链路为export()写入php://temp内存流并返回完整字符串→export_to_file($filename)写入磁盘文件→export_to_file_handle($fh)逐段fwrite到任意句柄其中 export_to_file_handle 的实现 完整复刻了 MO 规范魔数0x950412de与修订号 0 写入 28 字节文件头依次写入原始字符串长度表、翻译字符串长度表、哈希表地址并预留哈希长度 0头部条目msgid为空字符串之后每个条目按pack(VV, length, addr)记录偏移与长度最后统一落盘原文字符串表与翻译字符串表字符串之间以\0分隔。导入方向则由 import_from_reader 负责它通过get_byteorder()第 219-235 行依据魔数判断文件是大端N还是小端V字节序随后逐段校验头部、索引表长度并通过make_entry()把\4上下文分隔符与\0单复数分隔符拆解为结构化条目。若文件头、索引长度、字符串区域任一环节校验失败都会返回false保证非法文件不会被半解析。PO 文本格式的解析与生成PO类src/PO.php面向人类可读的.po文本其import_from_file()按行状态机解析msgctxt、msgid、msgid_plural、msgstr、msgstr[N]以及#:引用位置、#.提取注释、#,标志等语法见 read_entry 的实现。两个值得关注的静态工具方法poify()把任意字符串转成 PO 引号转义形式处理反斜杠、双引号、制表符与多行拼接unpoify()反向还原转义并把\r\n、\r统一标准化为\n换行避免跨平台行尾差异导致的解析问题。export_entry()src/PO.php 第 232-267 行则把单个条目渲染回 PO 语法按序输出译者注释、提取注释、引用位置、标志、msgctxt、msgid、msgid_plural与各复数msgstr[i]并通过match_begin_and_end_newlines()保持原文与译文首尾换行符的一致性。翻译容器与条目模型所有格式的公共数据模型沉淀在src/Translations/目录Translations基础容器维护$entries按 key 索引的条目表与$headers头信息表提供add_entry()、add_entry_or_merge()、translate()、translate_plural()、merge_with()等操作src/Translations/Translations.phpEntryTranslations单个可翻译字符串的载体字段包括is_plural、context、singular、plural、translations数组以及译者注释、提取注释、引用位置、标志等元数据其key()方法第 82-94 行使用context . \4 . singular生成唯一键这与 MO 文件内部\4分隔的约定完全一致GettextTranslationsgettext 语义增强层解析Plural-Forms头并动态构造复数形式选择函数NOOPTranslations空操作实现用于关闭翻译功能时保持接口一致。复数形式的动态求值gettext 的复数规则由Plural-Forms头如nplurals2; plural(n ! 1)声明。GettextTranslations::nplurals_and_expression_from_header() 用正则提取nplurals数值与plural表达式解析失败时安全回退到(2, n ! 1)随后 make_plural_form_function() 交给 src/Parser/PluralForms.php 的表达式解析器求值——该解析器内置运算符优先级表% 比较运算符 /!|| 三元?:解析异常时同样回退到默认规则保证任何语言包都不会因复数表达式而崩溃。在 YOURLS 中的实际应用YOURLS 将 POMO 集成进其本地化系统入口文件 includes/functions-l10n.php 第 15-16 行直接use POMO\MO;与use POMO\Translations\NOOPTranslations;前者负责从.mo语言包加载翻译后者在未启用翻译或语言包缺失时提供空操作降级避免对上层业务代码产生额外分支。这一模式正是 README Why use it 所强调的价值在不依赖服务器 gettext 扩展的前提下用纯 PHP 获得与 WordPress 一致的 i18n 开发体验。如果你要为 YOURLS 扩展新语言只需遵循标准 gettext 工作流——用 Poedit 等工具基于源码中的待翻译字符串生成.po文件翻译后编译为.mo文件并放入语言包目录即可被 includes/functions-l10n.php 加载。环境要求与运行前提README 的 Requirements 章节明确POMO 需要PHP 5.3 或以上。从源码细节看其兼容性还体现在几个刻意为之的处理上src/Streams/Reader.php 第 25-32 行 检测mbstring.func_overload是否开启 2位开启时统一改用mb_substr/mb_strlen并强制ascii编码操作字节流确保二进制 MO 解析在函数重载环境下依然准确src/PO.php 第 15 行 通过ini_set(auto_detect_line_endings, 1)兼容旧 Mac 的\r换行文件src/MO.php 第 223-227 行 注释中记录了 PHP 5.0.2 时代 32 位整型魔数比较的已知 bug并以显式强转规避。许可证POMO 依据GPLv2 许可证发布这一点在 README 的 License 章节及源码文件头注释如 src/MO.php 第 7 行 的license GPL中均有声明。在 YOURLS 中POMO 作为内置 vendor 依赖随项目一并分发使用时需遵守 GPLv2 的条款约束。赞分享后端【免费下载链接】YOURLS The standard, self hosted, powerful and customizable, URL shortener in PHP项目地址https://gitcode.com/gh_mirrors/yo/YOURLS点击查看免费下载相关推荐kubectl 国际化i18n翻译工作流指南基于 gettext 的 PO/MO 多语言管理实践kubectl 国际化i18n翻译工作流指南基于 gettext 的 PO/MO 多语言管理实践 kubectl 是 Kubernetes 的用户命令行界云原生容器编排集群管理微服务FontForge 界面翻译实战指南gettext 国际化流程与 po 文件翻译要点FontForge 界面翻译实战指南gettext 国际化流程与 po 文件翻译要点 本篇技术指南以 FontForge 官方文档《User Interfac桌面应用图形学Readest KOReader 插件国际化实战基于 gettext .po 的 Lua i18n 提取与翻译工作流Readest KOReader 插件国际化实战基于 gettext .po 的 Lua i18n 提取与翻译工作流 导读 Readest 仓库中内置了一个专桌面应用跨平台前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表