Создайте свое приложение, чтобы охватить весь мир
Локализация, по сути, позволяет приложению выйти на несколько глобальных рынков. Локализация — это «процесс адаптации программного обеспечения как к культуре, так и к языку конечного пользователя». Это включает в себя внесение изменений в дизайн и 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
с открытым исходным кодом. Это была моя попытка пролить свет на интересный, но мощный пакет локализации. Существуют и другие способы реализации пакета. Это был мой взгляд на эту тему. Ссылку на пакет вы найдете ниже.