0

我有一个非 Symfony PHP 项目,我想在其中使用带有 MoFileLoader 的 Symfony Translate 组件。我已经设置了 PoEdit,以便在解析文件以查找翻译时识别 trans("string") 函数。这部分代码<?php echo $translator->trans("Welcome"); ?>按应有的方式解析。

问题是我无法让 PoEdit 将其识别为复数字符串<?php echo $translator->trans('Found {result} search result', ['{result}' => 1]); ?>

1 显然是结果的数量,并且我希望能够使用正确的复数字符串。

大问题是我的主要语言是克罗地亚语,它的复数形式‪nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);比英语复杂得多nplurals=2; plural=(n!=1)

我在 PoEdit 中添加了这个 Sources 关键字

trans
trans:1,2

我已经尝试使用 PHP 和 gettext 来完成此任务,但由于服务器限制和 gettex、Apache 和 PHP 的其他问题,它对我不起作用。

这是我使用 Symfony Translate 组件的方式:

<?php
require_once __DIR__.'/vendor/autoload.php';
use Symfony\Component\Translation\Translator;
use Symfony\Component\Translation\MessageSelector;
use Symfony\Component\Translation\Loader\MoFileLoader;

$lang = "hr";
$translator = new Translator($lang, new MessageSelector());
$translator->setFallbackLocales(['en']);
$translator->addLoader('mo', new MoFileLoader());
$translator->addResource('mo', "locale/$lang/LC_MESSAGES/messages.mo", $lang);

echo $translator->trans("Welcome");
echo $translator->trans('Found {result} search result', ['{result}' => 1]);
?>

有没有办法让 PoEdit 将其识别为复数字符串:

<?php echo $translator->trans('Found {result} search result', ['{result}' => 1]); ?>
4

1 回答 1

0
trans
trans:1,2

你在那里给出了两个相互矛盾的指令——一个trans是单数,一个是复数。此外,复数trans:1,2没有意义:您要求将第一个参数提取为单数,将第二个参数提取为复数,但您甚至没有两个字符串参数。有关语法,请参阅文档。

$translator->trans('找到{result}搜索结果', ['{result}' => 1]);

不可能像这样trans()工作——它怎么知道用什么数字来确定要选择的复数版本?如果在代码中找不到它,它怎么知道用什么来表示英语的复数版本?

您需要使用transChoice(),如Symfony docs中所述。复数始终是一个中等复杂的主题,在编写任何代码之前,您绝对必须阅读文档以理解这些概念。

于 2019-09-03T16:54:13.133 回答