Пытаясь понять плюрализм Голанга
Я пытаюсь понять плюрализм в Go. Пример из документов https://godoc.org/golang.org/x/text/message/catalog не работает. Метод 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"
Я тоже видел %[1]d
в catalog.String
, Что это делает?
Большое спасибо! Я очень запутался прямо сейчас.
2 ответа
Ну вот!
Первый аргумент plural.Selectf
является int
, Так что это может быть любое допустимое целое число. Второй аргумент string
, Это должен быть глагол формата т.е. %d
или же %s
или же %f
Третий аргумент - пустой интерфейс, может принимать любой тип, например, строку, структуру, каталог. Сообщение,..
Давайте возьмем этот пример,
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
(т.е. 10 во втором значении для%d) и сравните с селектором случаев, т.е. =10
в случае 1 (интерфейс 1). Если сравнение является успешным, то возвращает обработанное значение, т.е. 1 task and 10 processes
в случае 1.
Если Printf
получает значения для 2% d, отличных от 1 и 10, затем возвращает значение из случая 3 (интерфейс 3)
А также,
%[n]d
может быть использован как,
fmt.Printf("%[2]d %[1]d\n", 11, 22)
и это печатает 22 11
,
Надеюсь, это поможет вам.
В дополнение к принятому ответу Thaadikkaaran относительно цели второго параметра дляplural.Selectf
:
Как указано в документации , «Это особенно актуально для нецелочисленных значений».
Строка формата применяется к аргументу перед его сравнением с различными условиями «case», что, по сути, позволяет вам обрезать значения с плавающей запятой до точности, необходимой для сравнения .
message.Set(language.English, "%f%% battery", plural.Selectf(1, "%f",
"<50", "Your battery is less than half full.",
"other", "You still have enough battery left.",
))
p := message.NewPrinter(language.English)
p.Printf("%f%% battery", 49.99999)
fmt.Println()
message.Set(language.English, "%f%% battery", plural.Selectf(1, "%.4f",
"<50", "Your battery is less than half full.",
"other", "You still have enough battery left.",
))
p.Printf("%f%% battery", 49.99999)
отпечатки
Ваша батарея разряжена менее чем наполовину.
У вас все еще достаточно батареи.