LINUX.ORG.RU

локализация приложения на go

 


0

1

Добрый день. Хочется поинтересоваться, какие ппакеты сейчас принято использовать для локализации приложения на go. в частности вэб сайтов. На глаза попались следующие проэкты

  1. официальные xtext golang.org/x/text/language golang.org/x/text/message
  2. go-i18n https://github.com/nicksnyder/go-i18n/
  3. gotext https://github.com/leonelquinteros/gotext

Первый я потыкал, остальные 2 только доки посмотрел. Что я хочу от пакета для локализации

  1. не сильно монструозный синтаксис

  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 в котором хранит этот перевод в своем формате. Есть пара НО

  1. Не выдерает строки для перевода из шаблонов go

  2. Не понял как переводить например даты time.Now().Weekday()

  3. Иногда странно себя ведет.

    1. Например метод p.Printf(«Hello world!») выдает перевод на нужный язык, а метод p.Println(«Hello world!») (выдает оригинал), хотя по идеи должен.

    2. Если вызвать метод 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 файл вобще придется формировать руками либо сторонними утилитами, в описании пакета не нашел упоминаний о том, что он сам генерирует словари на основе исходников.

Вобщем кто как решает вопросы локализации.


Ответ на: комментарий от beastie

Ну большая часть моего поста про нее. Расскажи тогда. Как выдирать строки из шаблонов. Как хак, можно генерировать из шаблонов .go файл с функциями p.Printf("") с нужными аргументами, а по ним потом генерировать словари.

swelf
() автор топика
fmt.Println("Hello, World!")

—>

fmt.Println("Привет, мир!")

Локализация приложений в Го.

anonymous
()

в описании пакета не нашел упоминаний о том, что он сам генерирует словари на основе исходников.

Думаю, надо использовать xgettext c параметром -k gotext.Get

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.