Albirew/nyaa-pantsu
Archivé
1
0
Bifurcation 0
Ce dépôt a été archivé le 2022-05-07. Vous pouvez voir ses fichiers ou le cloner, mais pas ouvrir de ticket ou de demandes d'ajout, ni soumettre de changements.
nyaa-pantsu/util/languages/translation.go

84 lignes
2,5 Kio
Go
Brut Vue normale Historique

package languages
import (
2017-05-09 01:44:41 +02:00
"fmt"
2017-05-10 21:45:39 +02:00
"github.com/ewhal/nyaa/service/user"
2017-05-11 15:12:19 +02:00
"github.com/nicksnyder/go-i18n/i18n"
"html/template"
"net/http"
)
// When go-i18n finds a language with >0 translations, it uses it as the Tfunc
// However, if said language has a missing translation, it won't fallback to the "main" language
func TfuncWithFallback(language string, languages ...string) (i18n.TranslateFunc, error) {
// Use the last language on the args as the fallback one.
fallbackLanguage := language
if languages != nil {
fallbackLanguage = languages[len(languages)-1]
}
T, err1 := i18n.Tfunc(language, languages...)
fallbackT, err2 := i18n.Tfunc(fallbackLanguage)
if err1 != nil && err2 != nil {
// fallbackT is still a valid function even with the error, it returns translationID.
2017-05-11 15:12:19 +02:00
return fallbackT, err2
}
return func(translationID string, args ...interface{}) string {
if translated := T(translationID, args...); translated != translationID {
return translated
}
return fallbackT(translationID, args...)
}, nil
}
2017-05-10 21:45:39 +02:00
func GetAvailableLanguages() (languages map[string]string) {
languages = make(map[string]string)
var T i18n.TranslateFunc
for _, languageTag := range i18n.LanguageTags() {
T, _ = i18n.Tfunc(languageTag)
/* Translation files should have an ID with the translated language name.
If they don't, just use the languageTag */
if languageName := T("language_name"); languageName != "language_name" {
2017-05-11 15:12:19 +02:00
languages[languageTag] = languageName
2017-05-10 21:45:39 +02:00
} else {
languages[languageTag] = languageTag
}
}
return
}
2017-05-09 17:47:06 +02:00
func SetTranslation(tmpl *template.Template, language string, languages ...string) i18n.TranslateFunc {
T, _ := TfuncWithFallback(language, languages...)
tmpl.Funcs(map[string]interface{}{
2017-05-09 01:44:41 +02:00
"T": func(str string, args ...interface{}) template.HTML {
return template.HTML(fmt.Sprintf(T(str), args...))
},
"Ts": func(str string, args ...interface{}) string {
return fmt.Sprintf(T(str), args...)
},
})
2017-05-09 17:47:06 +02:00
return T
}
2017-05-09 17:47:06 +02:00
func SetTranslationFromRequest(tmpl *template.Template, r *http.Request, defaultLanguage string) i18n.TranslateFunc {
2017-05-10 21:45:39 +02:00
userLanguage := ""
user, _, err := userService.RetrieveCurrentUser(r)
if err == nil {
2017-05-11 15:12:19 +02:00
userLanguage = user.Language
2017-05-10 21:45:39 +02:00
}
cookie, err := r.Cookie("lang")
cookieLanguage := ""
if err == nil {
cookieLanguage = cookie.Value
}
2017-05-10 21:45:39 +02:00
// go-i18n supports the format of the Accept-Language header, thankfully.
headerLanguage := r.Header.Get("Accept-Language")
2017-05-11 15:12:19 +02:00
r.Header.Add("Vary", "Accept-Encoding")
2017-05-10 21:45:39 +02:00
return SetTranslation(tmpl, userLanguage, cookieLanguage, headerLanguage, defaultLanguage)
}