处理多语言Go Web应用程序的标准/惯用方式是什么?

时间:2018-07-03 04:42:45

标签: go web multilingual

我在一个网站上工作,该网站需要提供用户选择的不同语言的网页。例如如果用户选择西班牙语作为首选语言,则服务器应使用西班牙语发送网页的文本元素。

在Go中执行此操作的标准方法是什么?我也很想知道你们正在使用什么方法。

谢谢。

2 个答案:

答案 0 :(得分:4)

我总是使用地图并在其上定义一个函数,该函数返回给定键的文本:

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],
    })
}

答案 1 :(得分:4)

如果用户的首选语言可能无法使用,则可以使用Golang的text/language package将请求的语言与支持的语言进行匹配。

outlined in this excellent post in The Go Blog这样的语言匹配是一个不小的问题。

要使用语言包,请使用一部分受支持的语言创建匹配器:

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"