go-i18n/transform.go
Virgil 43cf530b9d
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
fix(i18n): honor default translation context count
2026-04-02 13:41:48 +00:00

178 lines
2.6 KiB
Go

package i18n
import (
"strconv"
"dappco.re/go/core"
)
func getCount(data any) int {
if data == nil {
return 0
}
switch d := data.(type) {
case *Subject:
if d == nil {
return 0
}
return d.CountInt()
case *TranslationContext:
if d == nil {
return 0
}
if count, ok := d.countValue(); ok {
return count
}
if d.Extra != nil {
if c, ok := d.Extra["Count"]; ok {
return toInt(c)
}
if c, ok := d.Extra["count"]; ok {
return toInt(c)
}
}
return d.count
case map[string]any:
if c, ok := d["Count"]; ok {
return toInt(c)
}
if c, ok := d["count"]; ok {
return toInt(c)
}
case map[string]int:
if c, ok := d["Count"]; ok {
return c
}
if c, ok := d["count"]; ok {
return c
}
case map[string]string:
if c, ok := d["Count"]; ok {
return toInt(c)
}
if c, ok := d["count"]; ok {
return toInt(c)
}
}
return toInt(data)
}
func toInt(v any) int {
if v == nil {
return 0
}
switch n := v.(type) {
case int:
return n
case int64:
return int(n)
case int32:
return int(n)
case int16:
return int(n)
case int8:
return int(n)
case uint:
return int(n)
case uint64:
return int(n)
case uint32:
return int(n)
case uint16:
return int(n)
case uint8:
return int(n)
case float64:
return int(n)
case float32:
return int(n)
case string:
if n == "" {
return 0
}
if parsed, err := strconv.Atoi(core.Trim(n)); err == nil {
return parsed
}
}
return 0
}
func toInt64(v any) int64 {
if v == nil {
return 0
}
switch n := v.(type) {
case int:
return int64(n)
case int64:
return n
case int32:
return int64(n)
case int16:
return int64(n)
case int8:
return int64(n)
case uint:
return int64(n)
case uint64:
return int64(n)
case uint32:
return int64(n)
case uint16:
return int64(n)
case uint8:
return int64(n)
case float64:
return int64(n)
case float32:
return int64(n)
case string:
if n == "" {
return 0
}
if parsed, err := strconv.ParseInt(core.Trim(n), 10, 64); err == nil {
return parsed
}
}
return 0
}
func toFloat64(v any) float64 {
if v == nil {
return 0
}
switch n := v.(type) {
case float64:
return n
case float32:
return float64(n)
case int:
return float64(n)
case int64:
return float64(n)
case int32:
return float64(n)
case int16:
return float64(n)
case int8:
return float64(n)
case uint:
return float64(n)
case uint64:
return float64(n)
case uint32:
return float64(n)
case uint16:
return float64(n)
case uint8:
return float64(n)
case string:
if n == "" {
return 0
}
if parsed, err := strconv.ParseFloat(core.Trim(n), 64); err == nil {
return parsed
}
}
return 0
}