Каков стандартный / идиоматический способ обработки многоязычных веб-приложений Go? - PullRequest
0 голосов
/ 03 июля 2018

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

Какой стандартный способ сделать это в Go? Я также хотел бы знать, какие методы вы, ребята, используете.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Если предпочтительный язык пользователя может быть недоступен, вы можете использовать текстовый / языковой пакет Golang для сопоставления запрашиваемых языков с поддерживаемыми языками.

Этот тип соответствия языков является нетривиальной проблемой, как указано в этом прекрасном посте в блоге Go .

Чтобы использовать языковой пакет, создайте сопоставление с кусочком поддерживаемых языков:

var serverLangs = []language.Tag{
    language.AmericanEnglish, // en-US fallback
    language.German,          // de
}

var matcher = language.NewMatcher(serverLangs)

Затем сопоставьте один или несколько предпочитаемых языков. (Предпочтительный язык может основываться на IP-адресе пользователя или заголовке Accept-Language.)

var userPrefs = []language.Tag{
    language.Make("gsw"), // Swiss German
    language.Make("fr"),  // French
}

tag, index, confidence := matcher.Match(sortLanguageTags(&langs, DescendingQuality)...)

Чтобы получить соответствующий текст для языка, вы можете использовать метод tag.String():

type Translation map[string]string
type Translations map[string]Translation

translations := Translations{
        "knee": {
            language.German.String():          "knie",
            language.AmericanEnglish.String(): "knee",
        },
    }

fmt.Println(translations["knee"][tag.String()]) // prints "knie"
0 голосов
/ 03 июля 2018

Я всегда использую карту и определяю на ней функцию, которая возвращает текст для данного ключа:

type Texts map[string]string

func (t *Texts) Get(key string) string{
    return (*t)[key]
}

var texts = map[string]Texts{
    "de":Texts{
        "title":"Deutscher Titel",
    },
    "en":Texts{
        "title":"English title",
    },
}

func executeTemplate(lang string){
    tmpl, _ := template.New("example").Parse(`Title: {{.Texts.Get "title" }} `)
    tmpl.Execute(os.Stdout,struct{
        Texts Texts
    }{
        Texts: texts[lang],
    })
}
...