SDL中文论坛

标题: 实现多国语言翻译 [打印本页]

作者: ancientcc    时间: 2020-11-29 11:02
标题: 实现多国语言翻译
要察看、更改多国语言翻译需下载源码包。发行包不提供*.pot和*.po。

实现多国语言翻译指的是用指定语言来显示游戏中界面上信息,像伤害,让英文时显示“Damage”,简体中文时显示“伤害”,繁体中文则是“傷害”。

游戏中显示文字使用GNU中的gettext项目。

二楼:让用简单例子来说明gettext是如何工作的
三楼:如何制作*.mo
四楼:游戏中用到的*.mo
作者: ancientcc    时间: 2020-11-29 11:04
标题: 让用简单例子来说明gettext是如何工作的
gettext要工作,它需要的相关文件
wesnoth.pot文件
*.pot叫模板文件,文本格式。内有类似以下文字:
  1. msgid "Damage"
  2. msgstr ""
复制代码
en_GB.po、zh_CN.po和zh_TW.po
*.po叫源文件,文本格式,依据wesnoth.pot文件生成。这三个文件内分别有以下文字:
  1. en_GB.po
  2. msgid "Damage"
  3. msgstr "Damage"

  4. zh_CN.po
  5. msgid "Damage"
  6. msgstr "伤害"

  7. zh_TW.po
  8. msgid "Damage"
  9. msgstr "傷害"
复制代码
“依据wesnoth.pot文件生成”指的就是在不同语言时,用该语言补上相应文字。

wesnoth.mo
以en_GB.po、zh_CN.po和zh_TW.po分别生成三个同名的二进制文件wesnoth.mo,这三个文件同名但被放在三个不一样目录下:
(, 下载次数: 4361)

gettext工作逻辑
对要显示字符串“Damage”,根据当前选定的语言到“transations”目录下找,英文(英国)就定位到translations/en_GB/LC_MESSAGES/wesnoth.mo,于是显示内里的“Damage”,简体中文定位到translations/zh_CN/LC_MESSAGES/wesnoth.mo,于是显示内里的“伤害”。——这样就实现了根据当前选定语言使界面上显示不一样字符串。

当特定语言下找不到相应*.mo时,像当前语言是简体中文,但没有translations/zh_CN/LC_MESSAGES/wesnoth.mo,这时程序就只会显示那个原生字符串:Damage。由于这个字符串一般都是英文表示,这就使得当前语言是英文时,虽然没有相应*.mo,但它显示依旧是对的。
作者: ancientcc    时间: 2020-11-29 11:04
标题: 如何制作*.mo

游戏最终去读取的是*.mo。*.mo是由*.po生成的,而*.po是由*.pot生成的。

*.pot:建议找个文本编辑器,像UltraEdit-32。*.pot要写什么内容由游戏主程序决定,像会出现“Damage”,是游戏中要显示“Damage”,这时程序员会说出“Damage”大概是表示什么,mod制作者就根据这个作用进行相应翻译。

*.po:建议用Poedit。Poedit让编写*.po变得十分容易。具体操作,打开一个*.po,像wesnoth/zh_CN.po(文件可以没内容),菜单:“类目”,“从pot文件更新...”,选择wesnoth.pot,接下就可以逐条翻译。好了之后“文件”,“保存”,就可生成你希望的zh_CN.po。

*.mo:建议用Poedit实现*.po转为*.mo。这个转换过程和保存*.po是一样的操作,“文件”,“保存”,也就是这个菜单操作不仅生成像zh_CN.po,同时生成zh_CN.mo。然后把zh_CN.mo改名wesnoth.mo,放到相应的translations/zh_CN/LC_MESSAGES目录下。
作者: ancientcc    时间: 2020-11-29 11:04
标题: 游戏中用到的*.mo
游戏用到近5000条需翻译字符串,为方便管理,这些字符串被归到数个*.mo中。



以下是和特定战役相关的*.mo





欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/) Powered by Discuz! X3.3