2024-08-19 22:32:43 +02:00
|
|
|
package i18n
|
|
|
|
|
|
|
|
import (
|
2024-08-24 17:48:14 +02:00
|
|
|
"embed"
|
2024-08-19 22:32:43 +02:00
|
|
|
"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
|
|
|
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-24 17:48:14 +02:00
|
|
|
func RegisterTranslations(embed embed.FS, location string) {
|
2024-08-25 17:43:55 +02:00
|
|
|
amountFilesLoaded := 0
|
2024-08-24 17:48:14 +02:00
|
|
|
if translations == nil {
|
|
|
|
translations = make(map[string]map[string]string)
|
|
|
|
}
|
|
|
|
|
|
|
|
files, err := embed.ReadDir(location)
|
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()))
|
|
|
|
|
2024-08-24 17:48:14 +02:00
|
|
|
data, err := embed.ReadFile(filepath.Join(location, 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-24 17:48:14 +02:00
|
|
|
if translations[lang] == nil {
|
|
|
|
translations[lang] = make(map[string]string)
|
|
|
|
}
|
2024-08-20 13:35:49 +02:00
|
|
|
|
2024-08-24 17:48:14 +02:00
|
|
|
for key, value := range messages {
|
|
|
|
translations[lang][key] = value
|
|
|
|
}
|
|
|
|
|
2024-08-25 17:43:55 +02:00
|
|
|
amountFilesLoaded++
|
|
|
|
//log.Debug().Str("filename", file.Name()).Msg("i18n.RegisterTranslations: loaded")
|
2024-08-24 17:48:14 +02:00
|
|
|
}
|
2024-08-25 17:43:55 +02:00
|
|
|
|
|
|
|
log.Debug().Int("amountFilesLoaded", amountFilesLoaded).Msg("i18n.RegisterTranslations:")
|
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
|
|
|
}
|