Создайте свое приложение, чтобы охватить весь мир

Локализация, по сути, позволяет приложению выйти на несколько глобальных рынков. Локализация — это «процесс адаптации программного обеспечения как к культуре, так и к языку конечного пользователя». Это включает в себя внесение изменений в дизайн и UX, чтобы они понравились конечному пользователю. Это варьируется от соответствующего перевода текста до удаления потенциально оскорбительного контента.

Например, в арабских странах пишут справа налево, тогда как в большинстве западных стран пишут слева направо. В Go есть библиотека локализации; это часть его подрепозиториев. Этот модуль имеет путь golang.org/x/text. В этом посте я буду называть его пакетом text. Пакет textпозволяет разработчикам добавлять локализацию в соответствии с функциональной или объектно-ориентированной моделью программирования. Он поддерживает печать форматированных строк, что меняет правила игры.

Он также может распознавать отдельные слова и переводить их. В этом посте я подробно расскажу о своем подходе к реализации локализованной программы.

Основной пример

В моем случае я напишу код Go, который будет переводить с английского на французский. Как носитель обоих языков, я понимаю, что машинный перевод иногда может быть бессвязным. Это станет очевидным, когда вы прочитаете пост. Вот исходный код:

package main
import (
 "golang.org/x/text/message"
 "golang.org/x/text/language"
"fmt"
)
func main(){
  message.SetString(
    language.French,
    "The %m car",
    "La voiture %m",
  )
}

В этом примере я использую функциональный подход к добавлению локализации. Я вызываю функцию SetString сообщения, чтобы научить программу переводить конкретную строку. Глагол %m отобразит переведенный текст. Если вы заметили, глагол %m меняет положение для французского перевода. Это иллюстрирует, как простое предложение реструктурируется в другом языке. Я хочу, чтобы глагол %m отображал цвет, однако программа не знает о французских цветах. Чтобы научить программу, я добавлю следующие строки:

message.SetString(
  language.French,
  "green",
  "vert",
)

В отличие от моего предыдущего вызова SetString, я добавляю только одно слово. Это демонстрирует мощь пакета, поскольку мне не нужно добавлять несколько вариантов предложения The %m car. Чтобы отобразить локализованный текст, я запущу следующий код:

p := message.NewPrinter(language.French)
fmt.Println( p.Sprintf("The %m car", "green") ) // prints La voiture vert
fmt.Println( p.Sprintf("The %m car", "red")  ) // prints La voiture red

Это вывод из терминала:

Если вы заметили, что вторая строка напечатана как La voiture red . Я еще не научил программу переводить слово красный. Я также легко управляю структурой предложений, что является еще одним преимуществом пакета. Это базовый пример. Вот сложный.

Отслеживание форм множественного числа

Я часто создавал и видел программы, которые «искажают текст». Например, однажды я создавал компонент оповещения, и заголовок компонента иногда читался как You have 1 notifications left . Это предложение неверно, так как уведомление используется во множественном числе. text имеет функцию именно для этого, и это будет мой следующий пример. Вместо вызова SetString я буду использовать функцию Set, чтобы исправить указанную выше проблему множественности. Этот пример не требует перевода. Вот сигнатура функции Set:

func Set(tag language.Tag, key string, msg ...catalog.Message) error

Функция очень похожа на SetString, за исключением аргумента msg. Так я смогу указать программе, как обрабатывать слова во множественном числе. Это исходный код:

package main
import (
 "golang.org/x/text/message"
 "golang.org/x/text/feature/plural"
 "golang.org/x/text/language"
"fmt"
)
func main(){
 
    message.Set(language.English, "You are %d minute(s) late.",
    plural.Selectf(1, "",
        plural.One, "You are 1 minute late.",
        plural.Other, "You are %d minutes late."),
    )
    p2 := message.NewPrinter(language.English)
    fmt.Println( p2.Sprintf("You are %d minute(s) late.", 1 )  )
    fmt.Println( p2.Sprintf("You are %d minute(s) late.", 5 )  )
}

Как вы заметили выше, есть функция пакета, вызываемая с именем Selectf . «Selectf возвращает первый вариант, для которого подходит его селектор». В этом случае есть два селектора:

  • plural.One для обозначения случая, когда предоставленное целое число равно 1.
  • plural.Other для обозначения любого другого целочисленного значения.

Вот код в действии:

Вот сигнатура функции Selectf :

func Selectf(arg int, format string, cases ...interface{}) catalog.Message

При определении случаев вы должны определить селектор, а следующим аргументом будет текст для этого селектора. Например, чтобы добавить текст, когда передается целое число 1, будет Selectf(...,plural.One, "Format for one",...)

Утилиты

Вот вишенка на торте для этой библиотеки. Он может автоматически извлечь весь текст, который у вас есть в программе. Это устраняет необходимость вручную искать каждый текст, который необходимо локализовать. У него также есть команда для автоматической замены всех вызовов fmt локализованным текстовым принтером. Однако программа не поддерживает Go 1.18, поэтому я не буду ее демонстрировать в этом посте.

Заключение

В сильно глобализированном мире разработчики должны локализовать свое приложение, чтобы выйти на определенные рынки. Локализация вашего приложения гарантирует, что потребители, использующие вашу программу, поймут его. Пакет text — это реализация локализации от команды Go. Последний выпуск этого пакета был в августе 2021 года, что заставило меня задуматься о его стабильности.

Важно отметить, что существуют альтернативы пакету text с открытым исходным кодом. Это была моя попытка пролить свет на интересный, но мощный пакет локализации. Существуют и другие способы реализации пакета. Это был мой взгляд на эту тему. Ссылку на пакет вы найдете ниже.

Дополнительные ссылки

https://www.lionbridge.com/blog/content-transformation/what-is-software-localization-and-who-needs-it