1package locale 2 3import ( 4 "io/ioutil" 5 "log" 6 "path" 7 "regexp" 8 "strings" 9 10 "github.com/BurntSushi/toml" 11 "github.com/nicksnyder/go-i18n/v2/i18n" 12 "golang.org/x/text/language" 13) 14 15const DefaultLang = "en" 16 17var LocalePath = "" 18 19var defaultBotLang string 20var bundleInstance *i18n.Bundle 21 22var localeLanguages = make(map[string]string) 23 24func InitLang(localePath, lang string) { 25 defaultBotLang = lang 26 if defaultBotLang == "" { 27 defaultBotLang = DefaultLang 28 } 29 LocalePath = localePath 30 if localePath == "" { 31 LocalePath = "locales/" 32 } 33 GetBundle() 34} 35 36func GetBundle() *i18n.Bundle { 37 if bundleInstance == nil { 38 LoadTranslations() 39 } 40 return bundleInstance 41} 42 43func GetLanguages() map[string]string { 44 return localeLanguages 45} 46 47func LoadTranslations() *i18n.Bundle { 48 bundle := i18n.NewBundle(language.English) 49 bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal) 50 51 localeLanguages = make(map[string]string) 52 localeLanguages[DefaultLang] = language.Make(DefaultLang).String() 53 54 defaultBotLangLoaded := defaultBotLang == DefaultLang 55 files, err := ioutil.ReadDir(LocalePath) 56 if err == nil { 57 re := regexp.MustCompile(`^active\.(?P<lang>.*)\.toml$`) 58 for _, file := range files { 59 if match := re.FindStringSubmatch(file.Name()); match != nil { 60 fileLang := match[re.SubexpIndex("lang")] 61 62 if _, err := bundle.LoadMessageFile(path.Join(LocalePath, file.Name())); err != nil { 63 if defaultBotLang != DefaultLang && fileLang != DefaultLang { 64 log.Println("[Locale] Eroor load message file:", err) 65 } 66 } else { 67 langName, _ := i18n.NewLocalizer(bundle, fileLang).Localize(&i18n.LocalizeConfig{ 68 DefaultMessage: &i18n.Message{ 69 ID: "locale.language.name", 70 Other: "English", /* language.Make(fileLang).String() */ 71 }, 72 }) 73 localeLanguages[fileLang /* msgFile.Tag.String() */] = langName 74 75 log.Printf("[Locale] Loaded language: %s - %s", fileLang, langName) 76 if defaultBotLang == fileLang { 77 defaultBotLangLoaded = true 78 log.Printf("[Locale] Selected language is %s \n", defaultBotLang) 79 } 80 } 81 } 82 } 83 } 84 if !defaultBotLangLoaded { 85 log.Printf("[Locale] Localization file with language %s not found. The default lang is set: %s\n", defaultBotLang, DefaultLang) 86 defaultBotLang = DefaultLang 87 } 88 89 bundleInstance = bundle 90 return bundle 91} 92 93// func LocalizeMessage(message *i18n.Message, templateData map[string]interface{}) string { 94func LocalizeMessage(args ...interface{}) string { 95 if len(args) == 0 { 96 return "Noup" 97 } 98 99 var templateData map[string]interface{} 100 lang := defaultBotLang 101 message := args[0].(*i18n.Message) 102 var pluralCount interface{} = nil 103 104 // omgg, rework this 105 106 // 1 107 if len(args[1:]) > 0 { 108 if model, ok := args[1].(map[string]interface{}); ok { 109 templateData = model 110 } else if model, ok := args[1].(string); ok { 111 lang = model 112 } else if model, ok := args[1].(int); ok { 113 pluralCount = model 114 } 115 116 // 2 117 if len(args[2:]) > 0 { 118 if model, ok := args[2].(string); ok { 119 lang = model 120 } else if model, ok := args[2].(int); ok { 121 pluralCount = model 122 } 123 124 // 3 125 if len(args[3:]) > 0 { 126 if model, ok := args[3].(int); ok { 127 pluralCount = model 128 } 129 } 130 } 131 } 132 133 bundle := GetBundle() 134 localizer := i18n.NewLocalizer(bundle, lang) 135 msg, err := localizer.Localize(&i18n.LocalizeConfig{ 136 DefaultMessage: message, 137 TemplateData: templateData, 138 PluralCount: pluralCount, 139 }) 140 141 // fix go-i18n extract 142 msg = strings.ReplaceAll(msg, "\\n", "\n") 143 // log.Printf("[Locale] (%s) %s", lang, msg) 144 145 if err != nil { 146 log.Printf("[Locale] Warning: %s", err) 147 } 148 149 return msg 150} 151