-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathi18n.go
More file actions
73 lines (60 loc) · 1.29 KB
/
Copy pathi18n.go
File metadata and controls
73 lines (60 loc) · 1.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package i18n
import (
"fmt"
"html/template"
"sync"
"sync/atomic"
"golang.org/x/text/language"
"golang.org/x/text/message"
)
var FuncMap = template.FuncMap{
"L": language.MustParse,
"T": trans,
"t": trans,
"i18n": trans,
}
var (
fallback atomic.Value
printers sync.Map
)
func Fallback() language.Tag {
if tag := fallback.Load(); tag != nil {
return tag.(language.Tag)
}
return language.English
}
func SetFallback(tag language.Tag) {
fallback.Store(tag)
}
func Printer(tag language.Tag) *message.Printer {
if v, ok := printers.Load(tag); ok {
return v.(*message.Printer)
}
printer := message.NewPrinter(tag)
printers.Store(tag, printer)
return printer
}
func SetPrinter(tag language.Tag, printer *message.Printer) {
printers.Store(tag, printer)
}
func T(tag language.Tag, key message.Reference, a ...any) string {
return Printer(tag).Sprintf(key, a...)
}
func trans(lang any, key message.Reference, a ...any) string {
var tag language.Tag
switch lang := lang.(type) {
case language.Tag:
tag = lang
case *language.Tag:
tag = *lang
case string:
tag = language.MustParse(lang)
case *string:
tag = language.MustParse(*lang)
case fmt.Stringer:
tag = language.MustParse(lang.String())
default:
panic("invalid language tag")
}
return T(tag, key, a...)
}