2

我需要根据性别和数量翻译法语短语。在 message.fr.yml 中,我有:

key.toto: "male_singular: tu es venu 1 fois donc 1 vie|female_singular: tu es venue 1 fois donc 1 vie|male_plural: tu es venu %count% fois donc %count% vies|male_singular: tu es venue %count% fois donc %count% vies"

我在 transchoice() 使用的 Symfony\Component\Translation\MessageSelector 文档中看到

索引解决方案还可以包含标签(例如,一个:有一个苹果)。

这纯粹是为了使翻译更清晰 - 它不会影响功能。

这两种方法也可以混合使用:

{0} 没有苹果|one: 有一个苹果|more: 有 %count% 个苹果

但是当我用这样的电话呼叫 transchoice

transchoice("key.toto", "female_singular", array(), "messages")

我有 :

“tu es venu 1 fois donc 1 vie”

代替 :

“tu es 场地 1 fois donc 1 vie”

我更喜欢使用标签而不是 {},因为消息文件是由另一家企业翻译的。

任何想法 ?

4

1 回答 1

0

Translation组件文档

标签实际上只是对翻译者的提示,不会影响用于确定使用哪种复数形式的逻辑。

由于标签是可选的,翻译者不使用它们(翻译者只会根据它在字符串中的位置得到一个字符串)。

您可以确定是否打开方法的源代码transChoice()

public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
{
    ...

    return strtr($this->selector->choose($catalogue->get($id, $domain), (int) $number, $locale), $parameters);
}

如您所见,将参数transChoice()强制转换$number为 int。

手册PHP转换"female_singular"0

<?php

echo (int) "female_singular"; //0

因此,当您未在 transchoice 字符串中指定范围时,Translation组件会根据字符串位置进行选择。

在你的情况下(number = 0)它是字符串:"tu es venu 1 fois donc 1 vie"

于 2015-03-06T14:24:53.090 回答