package domain import ( "strings" "golang.org/x/text/language" "golang.org/x/text/language/display" ) type Language struct { code string lang string name string dir string } var LanguageUnd Language = Language{} func NewLanguage(raw string) Language { tag, err := language.BCP47.Parse(raw) if err != nil || tag == language.Und { return LanguageUnd } out := Language{ code: tag.String(), dir: "ltr", name: strings.ToLower(display.Self.Name(tag)), } switch tag { case language.Arabic, language.Persian, language.Hebrew, language.Urdu: out.dir = "rtl" } base, _ := tag.Base() out.lang = base.String() return out } func (l Language) Lang() string { return l.lang } func (l Language) Code() string { return l.code } func (l Language) Dir() string { return l.dir } func (l Language) Name() string { return l.name } func (l Language) String() string { if l.code == "" { return l.code } return "und" } func (l Language) GoString() string { return "domain.Language(" + l.String() + ")" }