问题 使用Gettext处理语法性别


我正在寻找一种简单,优雅的方式来处理Rails应用程序中的Gettext语法性别,就像处理复数一样 n_() 方法。

这对英语没有兴趣,因为单词不会因性别而异,但在翻译成西班牙语时会有所不同。 他/她是一个很好的英语用例。这在翻译成西班牙语时非常需要。

一个例子:

考虑用户Pablo(男)和María(女)。

_('%{user} is tall') & {:user => user.name}

应该翻译成

'Pablo es alto'
'María es alta'

当然,我们可以访问 user.gender

有任何想法吗?

干杯!


2000
2018-05-26 18:48


起源



答案:


使用标准的gettext功能,可以使用上下文来解决。喜欢称呼:

p_('Male', '%{user} is tall')

要么

p_('Female', '%{user} is tall')

这将在gettext目录中生成两个单独的字符串,用“Male”和“Female”上下文标记它们。


10
2018-04-17 04:29



我认为这个答案比之前标记的答案更正确。谢谢! - dgilperez


答案:


使用标准的gettext功能,可以使用上下文来解决。喜欢称呼:

p_('Male', '%{user} is tall')

要么

p_('Female', '%{user} is tall')

这将在gettext目录中生成两个单独的字符串,用“Male”和“Female”上下文标记它们。


10
2018-04-17 04:29



我认为这个答案比之前标记的答案更正确。谢谢! - dgilperez


很不幸的是,不行。这是gettext系统的限制 - 除了数字,语言功能基于您关键的语言。如果你要用西班牙语键入所有字符串,那就行了。

另一个选择是将字符附加到字符串以进行翻译,然后将其剥离。

我不熟悉Ruby,但psuedo-code的基本思想是:

if (user.sex == male) {
    strip_last_char(_('%{user} is tall') & {:user => user.name})
} else {
    strip_last_char(_('%{user} is tall') & {:user => user.name})
}

3
2018-05-03 18:08



感谢您的回答,确认我已经怀疑的内容,并提供了一个非常有趣的解决方法! - dgilperez
@dgilperez - 欢迎! - DougW
+1为特殊角色解决方案! - Ahmad Nassri


怎么样使用 复数形式 gettext的机制。通常,参数n用于区分单数和复数形式。

现在想象一下使用n来定义你的性别而不是金额。因此,p.ex。 n = 1表示女性(而不是单数),n = 2(或n> 1)表示女性(而不是复数)。

n = user.male? ? 1 : 0
n_('%{user} is tall', '%{user} is tall', n) & {:user => user.name}

1
2017-12-12 15:46



thx用于正确的ruby语法dgilperez。如果你使用user.gender而不是像我提出的那样,那么这也可以用于其他两种性别形式的语言。也要注意正确设置Plural-Forms(这里:Plural-Forms:nplurals = 2;在messages.po中复数= n == 1?0:1;) - Knut
没有!一百万次没有!复数形式特征的要点在于,不同的语言具有不同数量的复数形式,或者根本不具有用于单数和复数的不同形式。永远不要那样做! - CodeMonkey