forked from gofiber/contrib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconfig.go
144 lines (115 loc) · 3.29 KB
/
config.go
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package fiberi18n
import (
"os"
"sync"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/utils"
"github.com/nicksnyder/go-i18n/v2/i18n"
"golang.org/x/text/language"
"gopkg.in/yaml.v2"
)
type Config struct {
// Next defines a function to skip this middleware when returned true.
//
// Optional. Default: nil
Next func(c *fiber.Ctx) bool
// RootPath is i18n template folder path
//
// Default: ./example/localize
RootPath string
// AcceptLanguages is a collection of languages that can be processed
//
// Optional. Default: []language.Tag{language.Chinese, language.English}
AcceptLanguages []language.Tag
// FormatBundleFile is type of template file.
//
// Optional. Default: "yaml"
FormatBundleFile string
// DefaultLanguage is the default returned language type
//
// Optional. Default: language.English
DefaultLanguage language.Tag
// Loader implements the Loader interface, which defines how to read the file.
// We provide both os.ReadFile and embed.FS.ReadFile
// Optional. Default: LoaderFunc(os.ReadFile)
Loader Loader
// UnmarshalFunc for decoding template files
//
// Optional. Default: yaml.Unmarshal
UnmarshalFunc i18n.UnmarshalFunc
// LangHandler is used to get the kind of language handled by *fiber.Ctx and defaultLang
//
// Optional. Default: The language type is retrieved from the request header: `Accept-Language` or query param : `lang`
LangHandler func(ctx *fiber.Ctx, defaultLang string) string
bundle *i18n.Bundle
localizerMap *sync.Map
mu sync.Mutex
}
type Loader interface {
LoadMessage(path string) ([]byte, error)
}
type LoaderFunc func(path string) ([]byte, error)
func (f LoaderFunc) LoadMessage(path string) ([]byte, error) {
return f(path)
}
var ConfigDefault = &Config{
Next: nil,
RootPath: "./example/localize",
DefaultLanguage: language.English,
AcceptLanguages: []language.Tag{language.Chinese, language.English},
FormatBundleFile: "yaml",
UnmarshalFunc: yaml.Unmarshal,
Loader: LoaderFunc(os.ReadFile),
LangHandler: defaultLangHandler,
}
func defaultLangHandler(c *fiber.Ctx, defaultLang string) string {
if c == nil || c.Request() == nil {
return defaultLang
}
var lang string
lang = utils.CopyString(c.Query("lang"))
if lang != "" {
return lang
}
lang = utils.CopyString(c.Get("Accept-Language"))
if lang != "" {
return lang
}
return defaultLang
}
func configDefault(config ...*Config) *Config {
// Return default config if nothing provided
if len(config) == 0 {
return ConfigDefault
}
// Override default config
cfg := config[0]
if cfg.Next == nil {
cfg.Next = ConfigDefault.Next
}
if cfg.RootPath == "" {
cfg.RootPath = ConfigDefault.RootPath
}
if cfg.DefaultLanguage == language.Und {
cfg.DefaultLanguage = ConfigDefault.DefaultLanguage
}
if cfg.UnmarshalFunc == nil {
cfg.UnmarshalFunc = ConfigDefault.UnmarshalFunc
}
if cfg.FormatBundleFile == "" {
cfg.FormatBundleFile = ConfigDefault.FormatBundleFile
}
if cfg.AcceptLanguages == nil {
cfg.AcceptLanguages = ConfigDefault.AcceptLanguages
}
if cfg.Loader == nil {
cfg.Loader = ConfigDefault.Loader
}
if cfg.UnmarshalFunc == nil {
cfg.UnmarshalFunc = ConfigDefault.UnmarshalFunc
}
if cfg.LangHandler == nil {
cfg.LangHandler = ConfigDefault.LangHandler
}
return cfg
}