package i18n import ( "encoding/json" "path/filepath" "strings" "git.tijl.dev/tijl/tijl.dev/locales" log "git.tijl.dev/tijl/tijl.dev/modules/logger" "github.com/gofiber/fiber/v2" ) var translations map[string]map[string]string const DefaultLang = "en" func Load() { translations = make(map[string]map[string]string) files, err := locales.Embed.ReadDir(".") if err != nil { log.Fatal().Err(err) } for _, file := range files { if file.IsDir() { continue } if filepath.Ext(file.Name()) != ".json" { continue } lang := strings.TrimSuffix(file.Name(), filepath.Ext(file.Name())) data, err := locales.Embed.ReadFile(filepath.Join(".", file.Name())) if err != nil { log.Error().Err(err).Msg("Failed to read file") continue } var messages map[string]string if err := json.Unmarshal(data, &messages); err != nil { log.Error().Err(err).Msg("Failed to decode JSON") continue } log.Debug().Str("lang", lang).Msg("i18n.Load: loaded") translations[lang] = messages } log.Debug().Msg("loaded translations") } func Translate(c *fiber.Ctx, key string) string { lang := c.Cookies("language") if messages, ok := translations[lang]; ok { if message, ok := messages[key]; ok { return message } } if messages, ok := translations[DefaultLang]; ok { if message, ok := messages[key]; ok { return message } } return key } func GetLanguage(c *fiber.Ctx) string { lang := c.Cookies("language") if _, ok := translations[lang]; ok { return lang } else { return DefaultLang } } func GetTranslations(lang string) map[string]string { if messages, ok := translations[lang]; ok { return messages } return translations[DefaultLang] }