8

我在我的应用程序中加入了类似 gettext 的本地化系统,但我的翻译功能如下所示:

 t($category, $string, [$plural_string, $number, $vprintf_arguments])

我的 PoEdit 关键字:

t:2
t:2,3
  • t:2 告诉 PoEdit 解析$string,它显然工作
  • t:2,3 应该告诉 PoEdit 解析两者$string$plural_string- 但它不是:(

它只看到$string,所以我没有解析复数形式......我该如何解决这个问题?我不想将我的函数切换为不同的参数格式,因为我喜欢这个:(

此外,此函数的作用类似于 sprintf 替换:

  • 如果第三个参数 ($plural_string) 是一个数组,那么函数会将数组中的值视为 vsprintf 的参数
  • 如果第三个参数是字符串并且提供了 $number,该函数将考虑 $vprintf_arguments 作为 vsprintf 的参数(如果提供了),并且 $plural_string 作为 $string 的复数形式

无论如何,PoEdit 不应该干扰未引用的论点,对吧?我的意思是它只会将 $plural_string 解析为字符串,如果它看起来像'abc abc'

4

2 回答 2

6

gettext 一次只处理一个字符串。您可能追求的是 ngettext。(查找语法)

在那里,您将输入一个文本作为单数,另一个文本作为复数,还有数字。

聪明的一点是,许多语言的复数结构与英语完全不同。例如,俄语使用三种不同的形式。一种是计数以发音“一”结尾的地方:1、21、31、41 等。第二种形式是计数,以发音 2、3 或 4 结尾。第三种形式是其余的…… .

并且,使用 ngettext,可以做到这一点。是的,在 poedit 中,必须正确定义目标语言的复数结构,然后,它就可以工作了。

http://www.gnu.org/s/hello/manual/gettext/Plural-forms.html

于 2011-12-15T01:01:05.330 回答
1

就像 Tor-Bjorn Fjellner 回答的那样,这实际上应该可以工作。

如果您告诉 poedit 该语言实际上具有复数形式(使用 Poedit 翻译复数形式)并考虑了您的关键字,则 poedit 会提供它们进行翻译。

例子

复数形式: nplurals=2; plural=n != 1;

关键词:

  • t:2
  • t:2,3

PHP代码:

<?php

t("cat", "strA");

t("cat", "strB1", "strB2", 2, array());

t("cat", "strC1", "strC2", 3, array());

Poedit 用户界面:

Poedit 复数形式

我在您的问题中不明白的是关于数组等的重点。我无法破译您在 poedit/gettext 域中的意图,我认为如果您添加一些具体的代码示例以及结果应该如何,您的问题将会受益。

于 2011-12-15T16:20:13.400 回答