Author: Adam <git@apiote.tk>
fall back if accept-language is unknown
front/html.go | 5 ++++- i18n/i18n.go | 25 ++++++++++++++++++-------
diff --git a/front/html.go b/front/html.go index f7e5f2b856d087643c548ddde1cb1d391156cdfa..ba3a5538dbd09c060afbd05140f8b5eebb5248a2 100644 --- a/front/html.go +++ b/front/html.go @@ -60,7 +60,10 @@ } func render(languages []language.Tag, data RenderData, file string) string { i18n.LoadServerLangs() - language := i18n.Match(languages) + language, err := i18n.Match(languages) + if err != nil { + // todo show warning + } strings, err := i18n.LoadStrings(language) if err != nil { // todo return http:500 diff --git a/i18n/i18n.go b/i18n/i18n.go index 30e2f263365f502821ae88f1e6b3ed7cd2697056..99e12f7f787c02ae60cf4ca82b0a035c0eb4a56f 100644 --- a/i18n/i18n.go +++ b/i18n/i18n.go @@ -75,16 +75,23 @@ serverLangs = append(serverLangs, language.Make(tag)) } } -func Match(acceptLanguages []language.Tag) string { +func Match(acceptLanguages []language.Tag) (language.Tag, error) { var matcher = language.NewMatcher(serverLangs) tag, _, _ := matcher.Match(acceptLanguages...) - return tag.String() + b, s, r := tag.Raw() + t, err := language.Compose(b, s, r) + return t, err } func loadStringsFile(args ...interface{}) (interface{}, error) { - language := args[0].(string) - var strings Translation - _, err := toml.DecodeFile(filepath.Join(config.DataHome+"/i18n", language+".toml"), &strings) + var ( + strings Translation + err error + ) + if langTag, ok := args[0].(language.Tag); ok { + language := langTag.String() + _, err = toml.DecodeFile(filepath.Join(config.DataHome+"/i18n", language+".toml"), &strings) + } args[1] = strings return gott.Tuple(args), err } @@ -117,7 +124,7 @@ args[1] = strings return gott.Tuple(args) } -func LoadStrings(language string) (Translation, error) { +func LoadStrings(language language.Tag) (Translation, error) { r, err := gott. NewResult(gott.Tuple{language, Translation{}, Translation{}}). Bind(loadStringsFile). @@ -125,7 +132,11 @@ Bind(loadDefaultStringsFile). Map(loadStrings). Finish() - return r.(gott.Tuple)[1].(Translation), err + if err == nil { + return r.(gott.Tuple)[1].(Translation), nil + } else { + return Translation{}, err + } } func FormatDate(date time.Time, format string, translation map[string]string) string {