我开始使用德文编写我的PHP应用程序,并使用gettext提取所有字符串并将其翻译为英文。
现在我有一个包含所有用德语编写的msgids和英文msgstrs的.po文件。我想要交换它们,这样我的源代码就包含了英语作为msgids,有两个主要原因:
- 更多的翻译者会懂得英语,因此向他们提供带有英语msgids的文件是合适的。我可以在分发文件之前和收到文件后随时切换文件,但是不愿意。
- 如果内容文本也是英文,则编写英语对象和函数名称以及注释将对我有所帮助。我想这样做,以便该项目更容易开放给其他开源合作者(他们可能比德语更懂英语)。
我可以手动完成此操作,并且这是一种任务,我预计编写自动化例程需要花费更多时间(因为我非常不擅长shell脚本),而手动完成要快得多。但我也预计会像平时一样讨厌每一分钟的手动计算机劳动(感觉像一种矛盾吧?)。
有人以前做过这个吗?我认为这将是一个普遍存在的问题,但是找不到任何东西。提前感谢您。
示例问题:
<title><?=_('Routinen')?></title>
#: /users/ruben/sites/v/routinen.php:43
msgid "Routinen"
msgstr "Routines"
我想我可以将问题缩小范围。 .po文件中的开关当然不是问题,它很简单,只需
preg_replace('/msgid "(.+)"\nmsgstr "(.+)"/', '/msgid "$2"\nmsgstr "$1"/', $str);
对我来说,问题在于搜索我的项目文件夹中的_('$msgid')
并替换_('msgstr')
,同时解析.po文件(这可能甚至不是最优雅的方法,毕竟.po文件包含了包含所有msgid出现的文件路径的注释)。
通过修改akirk的答案后,我遇到了更多问题。
- 由于我混合使用了
_('xxx')
和_("xxx")
的调用方式,所以我必须小心谨慎地进行转义和反转义。- msgid和msgstr中的双引号"必须被反转义,但是不能去掉斜杠,因为在PHP中也可能对双引号进行转义
- 当字符串被替换为PHP时,必须转义单引号,但是它们还必须在.po文件中更改。对我而言,幸运的是,单引号只出现在英文文本中。
- msgid和msgstr可以有多行,看起来像这样
msgid = ""
"line 1\n"
"line 2\n"
msgstr = ""
"line 1\n"
"line 2\n"
- 复数形式当然被跳过了,但在我的情况下,这不是问题
- poedit想要将似乎已经成功转换的字符串标记为废弃,我不知道这在(许多)情况下为什么会发生。
我今晚必须停止处理这个问题。尽管如此,使用解析器而不是正则表达式似乎并不是过度设计。
_(...)
的单引号和双引号调用。祝你好运。 - Yzmir Ramirez