试图理解 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
.
希望对您有所帮助。
我正在尝试理解 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
.
希望对您有所帮助。