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