AnP/Go/Managers/I18NManager.go

99 lines
2.3 KiB
Go

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)
}