.Mo翻译文件结构解析

.Mo翻译文件结构解析

.mo文件是.po文件经msgfmt编译后生成的翻译文件, 便于程序阅读. 我这段时间折腾了下i18n, 根据Gettext的文档研究了一下Mo文件的结构, 在C#上实现了mo文件的解析和浏览, 现把.mo的结构和基于Winform实现的Mo查看器分享给大家.

结构

整型均为4字节(Int32), 下面不再标注

位置 标识 说明
0 Magic 用于识别Mo文件, 值为0x950412de0xde120495
4 Major&Minor Revision 两个16位整型组成的版本号.
8 N 文本数量
12 O (Original) 源文本信息位置
16 T (Translation) 译文信息位置
20 S (hashtable Size) 哈希表大小
24 H (hashtable Offset) 哈希表位置
... ... 这里以后可能会有更多的头部信息...
O string 0 - Len&Offset (4字节+4字节, 下同)第一条源文本的长度和位置
O + 8 string 1 - Len&Offset 第二条源文本的长度和位置
... ... ...
O+(N-1)*8 string (N-1) - Len&Offset 第N条源文本的长度和位置
T translation 0 - Len&Offset 第一条翻译的长度和位置
T + 8 translation 1 - Len&Offset 第二条翻译的长度和位置
... ... ...
T + (N-1)*8 translation (N-1) - Len&Offset 第N条翻译的长度和位置
H hash table 哈希表区(H ~ H+S*4)
* * 文本区
  • 开头的Magic用作Mo格式文件的标记, 值为固定的0x950412de0xde120495(大端小端的区别), 如果检测到起始4字节不是这两个值的话就可以报error了;
  • 之后的2字节+2字节是主次版本号, 目前主版本号为1或0, 次版本号为1或0;
  • 接下来便可以读到文本数量N, 源文本信息起始位置O和译文信息起始位置T. 这里可以获取到每串文本的长度和位置, 进而跳转到指定位置, 读指定长度的字节流, 然后转成字符串即可.

顺序

  • msgfmt生成Mo文件时, 会把文本串的顺序按照ASCII重新排序. (这样也保证了头部信息是第一条文本)

Hash Table

  • Po生成Mo时有一个选项--no-hash, 不指定它的话, msgfmt会生成由源文本得到的哈希表. 这有利于实际使用时的查找. 指定--no-hash可以减小.mo文件体积, 此时S的值为0.

文本串结尾 & 复数

? 每一条文本串以‘\0‘结尾, 文本信息的Len不包含这个‘\0‘. 如果没有复数文本串的话, 可以通过‘\0‘来完成字符串的读取. 但是有复数的话就不可以了, 复数文本串以‘\0‘分隔, 放在一个文本串里.

? 举个例子, 源文本 File removed, 复数Files removed. 那么这个源文本串在文件中的格式:

File removed\0Files removed\0
^           ^             ^
Offset      NUL           Offset+Len

? 于是就可以从Offset位置读Len长度的字节, 如果字节串里有‘\0‘就说明是复数文本. 然后就可以用相同方式处理译文串了.

Mo查看器

? 这个是研究i18n的时候顺手做的, 用C#实现了Mo的解析和查看, 丢到Github上了 刚开始做的时候以为指定了--no-hash就可以按照Po的文本顺序生成Mo的...后来发现并不会, 所以无法还原出原有的文本串顺序. 不过排序后的字符串方便定位和查找, 如果你的电脑没安装Poedit, 又只想查看Mo的话可以试试: Github

原文地址:https://www.cnblogs.com/zaevi/p/mo-structure.html

时间: 2024-10-27 17:52:38

.Mo翻译文件结构解析的相关文章

Android学习心得(15) --- Dex文件结构解析(1)

我在博客上发表一些我的Android学习心得,希望对大家能有帮助. 这一篇我们讲述一下Android可执行文件dex的结构解析. 参考Leb128数据类型 Android学习心得(5) --- dex数据类型LEB128 参考实例分析学习理解dex文件结构Android学习心得(15) --- Dex文件结构解析(1) 1.Dex背景 Android应用开发和Dalvik虚拟机Android应用所使用的编程语言是Java语言,在编译时使用JDK将Java源程序编程成标准的Java字节码文件. 而

FLV文件结构解析

1. FLV文件格式相对于MP4,简单很多. FLV Header(9Bytes) + FLV Body a比特: 1:有音频: 0:无音频 v比特: 1:有视频: 0:无视频   如果音视频都有这个字节为0x05 'F'|'L'|'V'|0x01|0b00000a0v| 0x00 00 00 09| |                                         | 版本字节一般为0x01      头长度 固定为9 FLV Body由一系列的Tag组成,每个tag的结构如

[翻译]Autofac 解析服务

注册组件以后,通过容器或 ILifetimeScope 的 Resolve 方法解析服务: var builder = new ContainerBuilder(); builder.RegisterType<MyComponent>().As<IService>(); var container = builder.Build(); using(var scope = container.BeginLifetimeScope()) { var service = scope.Re

[老文章搬家] [翻译] 深入解析win32 crt 调试堆

09 年翻译的东西. 原文见:  http://www.nobugs.org/developer/win32/debug_crt_heap.html 在DeviceStudio的Debug编译模式下, crt中的堆内存分配操作----包括malloc()和free()----使用一个特殊的, 便于调试的版本, 我们称之为crt debug堆(译注: 下面简称CDH). 相比于电光火石(译注: 原文blazingly, 我想不出更确切的说法)的运行效率, 调试版本更关注对于堆错误的定位, 它通过以

MPEG-2 文件结构解析

代码实现:mpeg-2文件分析器代码实现 一个完整的MPEG-2文件就是一个PS流文件. MPEG-2文件的构造格式如下图: 自己找个mpg文件打开,可以看到文件以0x0000 01B9结束(有些文件不标准没有),即MPEG_Program_end_code,之前有很多个0x0000 00BA字段,即为program pack的开始标志,program pack包的构造如下: 可以看出program pack由3部分组成:pack_header+system_header+PES_packets

PE文件结构解析

说明:本文件中各种文件头格式截图基本都来自看雪的<加密与解密>:本文相当<加密与解密>的阅读笔记. 1.PE文件总体结构 PE文件框架结构,就是exe文件的排版结构.也就是说我们以十六进制打开一个.exe文件,开头的那些内容就是DOS头内容,下来是PE头内容,依次类推. 如果能认识到这样的内含,那么"exe开头的内容是不是就直接是我们编写的代码"(不是,开头是DOS头内容)以及"我们编写的代码被编排到了exe文件的哪里"(在.text段,.t

Android学习心得(16) --- Dex文件结构实例解析(2)

我在博客上发表一些我的Android学习心得,希望对大家能有帮助. 这一篇我们讲述一下通过一个实例来分析dex文件结构和组成. 参考Leb128数据类型 Android学习心得(5) --- dex数据类型LEB128 参考实例分析学习理解dex文件结构Android学习心得(15) --- Dex文件结构解析(1) 参考baksmali工具使用Android学习心得(4) --- MAC下smali文件编写与运行 1.编译 我们通过一个例子来分析dex文件的构成 创建一个Hello.java文

bmp文件格式详细解析

先区分几个概念:16色和16位色一样吗? 不一样! 颜色位数,即是用多少位字节表示的值,每一位可以表示0和1两值.通常图片的颜色深度,简称色深,就是用位数来表示的,所以,我通常会看到8位色,16位色,24位色和32位色.而我们在其它地方看到的又是16色,256色,16777216色等等,这些怎么一回事呢? 16色即代表16种颜色,256色即256种颜色,8位色就是用8个位来表示的颜色,即2的8次方,就是256色,16位色2的16次方,就是65536色,24位即16777216色,32位即4294

深入分析JavaWeb技术内幕(修订版)》【PDF】下载

<深入分析JavaWeb技术内幕(修订版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062569 内容简介 <深入分析Java Web技术内幕>围绕JavaWeb相关技术从三方面全面深入地进行阐述.首先介绍前端知识,主要介绍JavaWeb开发中涉及的一些基本知识,包括Web请求过程.HTTP协议.DNS技术和CDN技术.其次深入介绍Java技术,包括I/O技术.中文编码问题.Javac编译原理.class文件结构解析.