package Managers import ( "AnP/Models" "AnP/Utils" "slices" "strings" ) type I18NManager struct { anp Models.AnPModel default_language string language_selected string sentences map[string]map[string]any } func NewI18NManager(anp Models.AnPModel, inputs any) I18NManager { var i18n I18NManager = I18NManager{ anp: anp, default_language: "english", language_selected: "english", sentences: map[string]map[string]any{}, } for _, key := range []string{"default_i18n_files", "default_i18n", "i18n_files", "i18n"} { i18n.Add(anp.Settings.Get(key, nil, nil), true, "AnP") } return i18n } func (_self *I18NManager) Add(inputs any, overwrite bool, header string) { _self.anp.Request.LoadJSON(inputs, func(data any) { for language, sentences := range Utils.Get[map[string]map[string]any](data, nil) { if _, exists := _self.sentences[language]; !exists { _self.sentences[language] = map[string]any{} } for key, sentence := range sentences { if Utils.IsAnPKey(key, header) { _, exists := _self.sentences[language][key] if overwrite || !exists { _self.sentences[language][key] = sentence } } } } }, true) } func (_self I18NManager) GetRaw(texts any, _default string) string { var keys []string = Utils.GetKeys(texts) if len(keys) != 0 { var done []string = []string{} for _, language := range append( []string{_self.language_selected, _self.default_language}, Utils.GetMapKeys(_self.sentences)..., ) { if !slices.Contains(done, language) { if _, exists := _self.sentences[language]; !exists { for _, key := range keys { if _, exists := _self.sentences[language][key]; exists { switch text := _self.sentences[language][key].(type) { case string: return text case []string: return strings.Join(text, "") } return _default } } } done = append(done, language) } } } var text_options []string = Utils.GetStrings(texts) if len(text_options) != 0 { return text_options[0] } return _default } func (_self I18NManager) Get(texts any, inputs any, _default string) string { var text string = _self.GetRaw(texts, _default) if inputs == nil { return text } return Utils.StringVariables(text, inputs, nil) }