试图理解 Golang 多元化

Trying to understand Golang pluralization

我正在尝试理解 Go 中的复数。文档 https://godoc.org/golang.org/x/text/message/catalog#hdr-String_interpolation 中的示例不起作用。方法 plural.Select 不存在。应该是plural.Selectf。注意最后的 f

message.Set(language.English, "You are %d minute(s) late.",
catalog.Var("minutes", plural.Selectf(1, "one", "minute")),
catalog.String("You are %d ${minutes} late."))
p := message.NewPrinter(language.English)
p.Printf("You are %d minute(s) late.", 5)

我在这里找到了另一个教程 https://phraseapp.com/blog/posts/internationalization-i18n-go/。此代码工作正常

message.Set(language.English, "You have %d problem",
    catalog.Var("minutes", plural.Selectf(1, "%d", "one", "minute", "other", "minutes")),
    catalog.String("You are %d ${minutes} late."))
printer := message.NewPrinter(language.English)
printer.Printf("You have %d problem", 1)
printer.Println()
printer.Printf("You have %d problem", 3)
printer.Println()

// result
// You are 1 minute late.
// You are 3 minutes late.

两个示例都使用了高级字符串插值。现在我正在努力理解 plural.Selectf。第一个参数 1 在做什么?为什么我需要第二个参数 %d?我想我明白了剩下的

"one"  : "minute"
"other": "minutes"

我也在catalog.String看到了%[1]d。这是做什么的?

非常感谢!我现在超级困惑。

给你!

plural.Selectf 的第一个参数是一个 int。所以它可以是任何有效的整数。 第二个参数是 string。它应该是一个格式动词,即 %d%s%f 第三个参数是一个空接口,可以接收任何类型,即字符串、结构、catalog.Message、..

举个例子,

func main() {

    var (
            msg = plural.Selectf(2, "%d",
                "=10", "%[1]d task and %[2]d processes remaining!", // interface 1
                "=1", "%[1]d task and %[2]d processes", // interface 2
                "other", "%d tasks and %d processes!" // interface 3
            )
            key = "%d task - %d process"
            tag = "en"
        )

        lTag := language.MustParse(tag)
        message.Set(lTag, key, msg)

        p := message.NewPrinter(language.English)
        p.Printf("%d task - %d process", 1, 10)

}

我们在这里创建了一个 NewPrinter 语言为英语,并使用键 %d task(s) remaining! 为标签 en(英语语言的短代码)设置了翻译消息。

p.Printf("%d task - %d process", 1, 3) 行执行时,翻译机制采用第一个参数(格式说明符)即 %d task - %d process 并通过与我们为 en 标签设置的键进行比较来检查消息.如果找到密钥,则它会处理消息,即 msg.

此处 Selectf 的第一个参数表示采用 nth(即在我们的例子中为第 2 个)格式动词的值来自 Printf(即 %d 的第二个值中的 10)并与案例选择器进行比较,即案例 1(接口 1)中的 =10。如果比较成功,则 return 是处理后的值,即情况 1 中的 1 task and 10 processes

如果 Printf 接收到除 1 和 10 之外的第二个 %d 的值,那么它将 return 来自案例 3(接口 3)的值

而且,

%[n]d可以像

一样使用

fmt.Printf("%[2]d %[1]d\n", 11, 22) 并打印 22 11.

希望对您有所帮助。