Пытаясь понять плюрализм Голанга

Я пытаюсь понять плюрализм в 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)

отпечатки

Ваша батарея разряжена менее чем наполовину.

У вас все еще достаточно батареи.

Другие вопросы по тегам