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