Добрый день. Хочется поинтересоваться, какие ппакеты сейчас принято использовать для локализации приложения на go. в частности вэб сайтов. На глаза попались следующие проэкты
- официальные xtext golang.org/x/text/language golang.org/x/text/message
- go-i18n https://github.com/nicksnyder/go-i18n/
- gotext https://github.com/leonelquinteros/gotext
Первый я потыкал, остальные 2 только доки посмотрел. Что я хочу от пакета для локализации
-
не сильно монструозный синтаксис
-
Автоматическое выдерание строк для перевода из исходников go, и из шаблонов html. По большому счету все.
Начнем по порядку
официальные xtext синтаксис вполне себе ок, заменяете
fmt.Printf(«hello world»)
на
p := message.NewPrinter(language.Greek)
p.Printf(«Hello world!»)
при помощи команды go generate и коментария в файле
//go:generate gotext -srclang=en update -out=catalog.go -lang=en,el
генерирует вам json файлы в которых можно осуществлять перевод, а так же генерирует файл catalog.py в котором хранит этот перевод в своем формате. Есть пара НО
-
Не выдерает строки для перевода из шаблонов go
-
Не понял как переводить например даты time.Now().Weekday()
-
Иногда странно себя ведет.
-
Например метод p.Printf(«Hello world!») выдает перевод на нужный язык, а метод p.Println(«Hello world!») (выдает оригинал), хотя по идеи должен.
-
Если вызвать метод p.Printf(«Hello world!») для строки которая не зарегестрирована в файле переводов соответствующего языка, то на печать выйдет перевод самой первой строки в словаре. Я б ожидал что на печать выйдет оригинал без перевода.
-
Например: Файл переводов
{
"language": "el",
"messages": [
{
"id": "Hello world!",
"message": "Hello world!",
"translation": "Γειά σου Κόσμε"
}
]
}
наш текст программы
func main() {
p := message.NewPrinter(language.Greek)
p.Printf("Hello world!")
p.Println()
p.Println("Hello world!")
p.Printf("buy world!")
p.Println()
}
я бы ожидал на выходе
Γειά σου Κόσμε
Γειά σου Κόσμε
buy world!
но нет, у нас будет
Γειά σου Κόσμε
Hello world!
Γειά σου Κόσμε
go-i18n Монструозный синтаксис. Даже копировать сюда не буду, что необходимо для «регистрации» строки для перевода. Не умеет выдергивать текст из шаблонов, судя по коду https://github.com/nicksnyder/go-i18n/blob/master/v2/goi18n/extract_command.go
gotext https://github.com/leonelquinteros/gotext Использует как хранилище переводов po/mo файлы. Синтаксис вроде компактненький. Но насколько я понимаю весь po файл вобще придется формировать руками либо сторонними утилитами, в описании пакета не нашел упоминаний о том, что он сам генерирует словари на основе исходников.
Вобщем кто как решает вопросы локализации.