tijl.dev-core/internal/i18n/i18n.go

87 lines
1.7 KiB
Go
Raw Normal View History

2024-08-19 22:32:43 +02:00
package i18n
import (
"encoding/json"
"path/filepath"
2024-08-22 12:57:38 +02:00
"strings"
2024-08-20 13:35:49 +02:00
2024-08-22 15:15:16 +02:00
"git.tijl.dev/tijl/tijl.dev-core/locales"
log "git.tijl.dev/tijl/tijl.dev-core/modules/logger"
2024-08-21 01:08:47 +02:00
"github.com/gofiber/fiber/v2"
2024-08-19 22:32:43 +02:00
)
var translations map[string]map[string]string
const DefaultLang = "en"
2024-08-20 13:35:49 +02:00
func Load() {
2024-08-19 22:32:43 +02:00
translations = make(map[string]map[string]string)
2024-08-22 12:57:38 +02:00
files, err := locales.Embed.ReadDir(".")
2024-08-19 22:32:43 +02:00
if err != nil {
2024-08-21 01:08:47 +02:00
log.Fatal().Err(err)
2024-08-19 22:32:43 +02:00
}
for _, file := range files {
2024-08-22 12:57:38 +02:00
if file.IsDir() {
continue
}
2024-08-19 22:32:43 +02:00
2024-08-22 12:57:38 +02:00
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()))
2024-08-19 22:32:43 +02:00
if err != nil {
2024-08-22 12:57:38 +02:00
log.Error().Err(err).Msg("Failed to read file")
2024-08-19 22:32:43 +02:00
continue
}
var messages map[string]string
2024-08-22 12:57:38 +02:00
if err := json.Unmarshal(data, &messages); err != nil {
log.Error().Err(err).Msg("Failed to decode JSON")
2024-08-19 22:32:43 +02:00
continue
}
2024-08-22 12:57:38 +02:00
2024-08-22 13:47:16 +02:00
log.Debug().Str("filename", file.Name()).Msg("i18n.Load: loaded")
2024-08-19 22:32:43 +02:00
translations[lang] = messages
}
2024-08-20 13:35:49 +02:00
2024-08-22 13:47:16 +02:00
log.Info().Msg("loaded translations")
2024-08-19 22:32:43 +02:00
}
func Translate(c *fiber.Ctx, key string) string {
2024-08-20 18:25:59 +02:00
lang := c.Cookies("language")
2024-08-19 22:32:43 +02:00
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
}
2024-08-20 18:25:59 +02:00
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]
2024-08-19 22:32:43 +02:00
}