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