ruby-on-rails 用Gettext处理语法性别

mklgxw1f  于 2023-01-27  发布在  Ruby
关注(0)|答案(3)|浏览(132)

我正在寻找一种简单、适当、优雅的方法来处理Rails应用程序中Gettext的语法性别,就像n_()方法处理复数一样。
这在英语中没有意义,因为单词不会随性别而变化,但在翻译成西班牙语时却会变化,his/her在英语中是一个很好的用例,在翻译成西班牙语时这是非常需要的。
举个例子:
考虑用户Pablo(男性)和Ana María(女性)。

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

应翻译为

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

当然,我们可以访问user.gender
有什么想法吗?
干杯!

kx1ctssn

kx1ctssn1#

使用标准的gettext特性,这可以通过上下文来解决。

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

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

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

6qfn3psc

6qfn3psc2#

不幸的是没有。这是gettext系统的一个局限性--除了数字之外,语言特征是基于你键入的语言的。如果你用西班牙语键入所有的字符串,它就可以工作。
另一种选择是为了翻译的目的在字符串后面附加一个字符,然后将其去掉。
我不熟悉Ruby,但伪代码的基本思想是:

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

e37o9pze3#

使用gettext的复数形式机制怎么样?通常使用参数n来区分单数和复数形式。
现在,假设用n来定义你的性别,而不是用数量来定义,那么n=1表示女性(不是单数),n=2(或n〉1)表示女性(不是复数)。

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

相关问题