【发布时间】:2011-06-09 16:02:52
【问题描述】:
我以德语的所有文本启动我的 PHP 应用程序,然后使用 gettext 提取所有字符串并将它们翻译成英语。
所以,现在我有一个 .po 文件,其中所有 msgids 为德语,msgstrs 为英语。我想切换它们,以便我的源代码包含英文作为 msgids,主要原因有两个:
- 更多的翻译人员会懂英语,因此只适合为他们提供带有msgids 的英文文件。我可以总是在发出文件之前和收到文件之后切换文件,但是不。
- 如果内容文本也是英文,这将有助于我编写英文的对象和函数名称以及 cmets。我愿意这样做,因此该项目对其他开源合作者更开放(更可能懂英语而不是德语)。
我可以手动完成这项任务,我预计我会花更多时间为其编写自动化例程(因为我对 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);
对我来说,问题是在解析 .po 文件时搜索我的项目文件夹文件以查找 _('$msgid') 并替换 _('msgstr') 的例程(这可能甚至不是最优雅的方式,毕竟 .po 文件包含 cmets,其中包含 msgid 出现的所有文件路径)。
在fooling around 稍微回答了akirk 之后,我又遇到了一些问题。
- 因为我有
_('xxx')和_("xxx")的混合调用,所以我必须小心(取消)转义。- msgids 和 msgstrs 中的双引号 " 必须不转义,但斜线不能去掉,因为可能是双引号在 PHP 中也被转义了
- 单引号在替换为 PHP 时必须进行转义,但随后也必须在 .po 文件中进行更改。幸运的是,单引号仅出现在英文文本中。
- msgids 和 msgstrs 可以有多行,那么它们看起来像这样
msgid = """line 1\n""line 2\n"msgstr = """line 1\n"
@ 987654333@ - 目前当然会跳过复数形式,但在我的情况下,这不是问题
- poedit 想要删除似乎已成功切换的过时字符串,但我不知道为什么会在(很多)情况下发生这种情况。
今晚我将不得不停止工作。尽管如此,使用解析器而不是 RegExps 似乎并不过分。
【问题讨论】:
-
棘手,不仅需要切换gettext文件中的条目,还需要替换代码中的所有字符串。
-
@tharkun:是的,当然,这就是我需要做的,但这对我来说似乎并不那么棘手。我想我可以用 PHP 字符串来做,但不能用 shell。以最简单的方式,只需解析(或搜索).po 文件中的 msgids 和 strs,然后搜索并替换文件夹中的所有文件以查找该字符串。我在帖子中包含了开关,以缩小问题范围。
-
我认为你在这里是正确的。诀窍是确保您使用的正则表达式不会无意中更改实际来源。不要忘记正则表达式还需要处理对
_(...)的单引号和双引号调用。祝你好运。 -
@Yzmir Ramirez 我想更改实际的源文件。对我来说,trick 正在正确解析 po-file 以提供我的搜索和替换脚本文件和搜索字符串,而 那是我卡住的地方。
标签: php regex parsing gettext poedit