PHP I18N gettext没有用特定语言翻译一个特定字符串



我一直在破坏我的大脑,在互联网上搜索了一段时间,却没有找到与我类似的解决方案(或案例(,所以我求助于这里的每个人:

我目前正在开发一个使用gettext扩展进行国际化的网站,目前它只计划在英语和德语中使用。总之,我大部分时间都在翻译,但有一个非常奇怪的问题我似乎无法解决:

首先,一些代码/背景:

问题发生在通过php包含的页脚中,并且页脚包含一个小的侧面导航:

<div class="nav fixed-bottom style-footer">
<div class="col-auto">
<a class="nav-link" href="./index.php?page=contact"><?php echo _("btn_contact"); ?></a>
</div>
<div class="col-auto">
<a class="nav-link" href="#"><?php echo _("btn_language"); ?></a>
</div>
<div class="col-auto">
<a class="nav-link" href="#"><?php echo _("btn_contact"); ?></a>
</div>
</div>

("btn_language"是我作为测试添加的,我认为可能是整个文件无法正确翻译的情况,但事实并非如此(,而且页面是用banner.php、nav.php、content.php、footer.php构建的,其中content.php动态更改/显示内容,其余部分始终显示;静态";并固定到它们的位置(页眉在Nav上方,内容在页脚上方(固定到浏览器窗口的底部((

po文件最初是通过PoEdit创建的,它正确地识别并抓取了";btn_contact";在所有其他条目中,有问题的po条目看起来是这样的:

德语:

#: includes/footer.php:3
msgid "btn_contact"
msgstr "Kontakt"

英语:

#: includes/footer.php:3
msgid "btn_contact"
msgstr "Contact"

现在,当我打开页面时,每个字符串都会正确显示,除了btn_contact的之外,甚至是来自同一文件(footer.php(的btn_language,而且这个出现在德语中,当我切换到英语时,它正确地显示";"联系人";,而不是";btn_contact";就像切换到德语时一样(如果不清楚,我会在底部添加两张显示英语和德语的图片(

我在我的Windows 10 PC上进行本地开发,在我的PC上工作时使用IIS来托管页面,这在我的同事Windows 10 PC和他的MacBook上是一样的(都使用XAMPP托管(

我已经尝试删除po文件中的btn_contact条目,我通过PoEdit删除并重新创建了德语翻译,清除浏览器缓存(这发生在Chrome、Edge(又名reskinned Chrome(和Firefox中,都是最新的(等,删除并重写footer.php中的行,删除并重新安装IIS

我不知道我还能换什么(这是一个非常容易的改变,我的蠢蛋就是看不到atm(

如果我只是因为谷歌功能薄弱而错过了这个问题的解决方案,我向道歉

如果需要其他代码部分进行澄清,我会在需要时添加它们

有问题的页面部分,两种语言比较

字符串不是从.po文件转换的,而是从.mo文件转换的。您可以使用msgfmt程序从.po文件创建.mo文件。

看起来您的德语CCD_ 6文件不完整并且缺少"的翻译;btn_contact";。您可以使用程序msgunfmt:检查.mo文件的内容

msgunfmt FILENAME.mo

请参阅文档(https://www.php.net/manual/en/book.gettext.php)有关翻译工作流程的更多详细信息。更新(重新编译(.mo文件后,应显示翻译。

顺便说一下,没有必要使用丑陋的符号标识符,如";btn_contact";作为消息id。只需使用原始字符串:

_("Contact")

我遇到了同样的问题,事实上有罪的是.mo文件。。。还是.po,取决于观点。

.po文件包含许多fuzzy翻译,.mo文件在编译时没有这些翻译,因为默认情况下,msgfmt会将fuzzy消息从编译的目录中排除。

因此,对我来说,修复方法是用模糊字符串重新编译.mo。

msgfmt --use-fuzzy -o my.mo my.po

在对mo文件进行任何更改后,不要忘记重新启动php-fpm(或Apache(,因为它是由系统缓存的。

最新更新