mirror of
https://github.com/hrfee/jfa-go.git
synced 2024-12-22 09:00:10 +00:00
Harvey Tindall
f063b970b4
config-base.yaml is almost identical to json version, except there's no "order" field, as "sections" and "settings" fields are now lists themselves and so Go can parse the correct order. As such, removed enumerate_config.py. Also, rewrote scripts/generate_ini.py in Go as scripts/ini/. Config structure in Go form is now in common/config.go, and is used by jfa-go and the ini script. app.configBase is now untouched once read from config-base.yaml, and instead copied to and patched in app.patchedConfig. Patching occurs at program start and config modification, so GetConfig is now just a couple of lines. Discord role patching still occurs in GetConfig, as the available roles can change regularly. Also added new "Disabled" field to sections, to avoid the nightmare of deleting from an array.
233 lines
6.0 KiB
Go
233 lines
6.0 KiB
Go
package main
|
|
|
|
import "github.com/hrfee/jfa-go/common"
|
|
|
|
type langMeta struct {
|
|
Name string `json:"name"`
|
|
// Language to fall back on if strings are missing. Defaults to en-us.
|
|
Fallback string `json:"fallback,omitempty"`
|
|
}
|
|
|
|
type quantityString struct {
|
|
Singular string `json:"singular"`
|
|
Plural string `json:"plural"`
|
|
}
|
|
|
|
type adminLangs map[string]adminLang
|
|
|
|
func (ls *adminLangs) getOptions() []common.Option {
|
|
opts := make([]common.Option, len(*ls))
|
|
i := 0
|
|
for key, lang := range *ls {
|
|
opts[i] = common.Option{key, lang.Meta.Name}
|
|
i++
|
|
}
|
|
return opts
|
|
}
|
|
|
|
type commonLangs map[string]commonLang
|
|
|
|
type commonLang struct {
|
|
Meta langMeta `json:"meta"`
|
|
Strings langSection `json:"strings"`
|
|
Notifications langSection `json:"notifications"`
|
|
QuantityStrings map[string]quantityString `json:"quantityStrings"`
|
|
}
|
|
|
|
type adminLang struct {
|
|
Meta langMeta `json:"meta"`
|
|
Strings langSection `json:"strings"`
|
|
Notifications langSection `json:"notifications"`
|
|
QuantityStrings map[string]quantityString `json:"quantityStrings"`
|
|
JSON string
|
|
}
|
|
|
|
type userLangs map[string]userLang
|
|
|
|
func (ls *userLangs) getOptions() []common.Option {
|
|
opts := make([]common.Option, len(*ls))
|
|
i := 0
|
|
for key, lang := range *ls {
|
|
opts[i] = common.Option{key, lang.Meta.Name}
|
|
i++
|
|
}
|
|
return opts
|
|
}
|
|
|
|
type userLang struct {
|
|
Meta langMeta `json:"meta"`
|
|
Strings langSection `json:"strings"`
|
|
Notifications langSection `json:"notifications"`
|
|
notificationsJSON string
|
|
ValidationStrings map[string]quantityString `json:"validationStrings"`
|
|
validationStringsJSON string
|
|
QuantityStrings map[string]quantityString `json:"quantityStrings"`
|
|
JSON string
|
|
}
|
|
|
|
type pwrLangs map[string]pwrLang
|
|
|
|
func (ls *pwrLangs) getOptions() []common.Option {
|
|
opts := make([]common.Option, len(*ls))
|
|
i := 0
|
|
for key, lang := range *ls {
|
|
opts[i] = common.Option{key, lang.Meta.Name}
|
|
i++
|
|
}
|
|
return opts
|
|
}
|
|
|
|
type pwrLang struct {
|
|
Meta langMeta `json:"meta"`
|
|
Strings langSection `json:"strings"`
|
|
}
|
|
|
|
type emailLangs map[string]emailLang
|
|
|
|
func (ls *emailLangs) getOptions() []common.Option {
|
|
opts := make([]common.Option, len(*ls))
|
|
i := 0
|
|
for key, lang := range *ls {
|
|
opts[i] = common.Option{key, lang.Meta.Name}
|
|
i++
|
|
}
|
|
return opts
|
|
}
|
|
|
|
type emailLang struct {
|
|
Meta langMeta `json:"meta"`
|
|
Strings langSection `json:"strings"`
|
|
UserCreated langSection `json:"userCreated"`
|
|
InviteExpiry langSection `json:"inviteExpiry"`
|
|
PasswordReset langSection `json:"passwordReset"`
|
|
UserDeleted langSection `json:"userDeleted"`
|
|
UserDisabled langSection `json:"userDisabled"`
|
|
UserEnabled langSection `json:"userEnabled"`
|
|
UserExpiryAdjusted langSection `json:"userExpiryAdjusted"`
|
|
InviteEmail langSection `json:"inviteEmail"`
|
|
WelcomeEmail langSection `json:"welcomeEmail"`
|
|
EmailConfirmation langSection `json:"emailConfirmation"`
|
|
UserExpired langSection `json:"userExpired"`
|
|
}
|
|
|
|
type setupLangs map[string]setupLang
|
|
|
|
type setupLang struct {
|
|
Meta langMeta `json:"meta"`
|
|
Strings langSection `json:"strings"`
|
|
StartPage langSection `json:"startPage"`
|
|
EndPage langSection `json:"endPage"`
|
|
General langSection `json:"general"`
|
|
Updates langSection `json:"updates"`
|
|
Proxy langSection `json:"proxy"`
|
|
Language langSection `json:"language"`
|
|
Login langSection `json:"login"`
|
|
JellyfinEmby langSection `json:"jellyfinEmby"`
|
|
Ombi langSection `json:"ombi"`
|
|
Jellyseerr langSection `json:"jellyseerr"`
|
|
Email langSection `json:"email"`
|
|
Messages langSection `json:"messages"`
|
|
Notifications langSection `json:"notifications"`
|
|
UserPage langSection `json:"userPage"`
|
|
WelcomeEmails langSection `json:"welcomeEmails"`
|
|
PasswordResets langSection `json:"passwordResets"`
|
|
InviteEmails langSection `json:"inviteEmails"`
|
|
PasswordValidation langSection `json:"passwordValidation"`
|
|
HelpMessages langSection `json:"helpMessages"`
|
|
JSON string
|
|
}
|
|
|
|
func (ls *setupLangs) getOptions() []common.Option {
|
|
opts := make([]common.Option, len(*ls))
|
|
i := 0
|
|
for key, lang := range *ls {
|
|
opts[i] = common.Option{key, lang.Meta.Name}
|
|
i++
|
|
}
|
|
return opts
|
|
}
|
|
|
|
type telegramLangs map[string]telegramLang
|
|
|
|
type telegramLang struct {
|
|
Meta langMeta `json:"meta"`
|
|
Strings langSection `json:"strings"`
|
|
}
|
|
|
|
func (ts *telegramLangs) getOptions() []common.Option {
|
|
opts := make([]common.Option, len(*ts))
|
|
i := 0
|
|
for key, lang := range *ts {
|
|
opts[i] = common.Option{key, lang.Meta.Name}
|
|
i++
|
|
}
|
|
return opts
|
|
}
|
|
|
|
type langSection map[string]string
|
|
type tmpl map[string]string
|
|
|
|
func templateString(text string, vals tmpl) string {
|
|
start, previousEnd := -1, -1
|
|
out := ""
|
|
for i := range text {
|
|
if text[i] == '{' {
|
|
start = i
|
|
continue
|
|
}
|
|
if start != -1 && text[i] == '}' {
|
|
varName := text[start+1 : i]
|
|
val, ok := vals[varName]
|
|
if !ok {
|
|
start = -1
|
|
continue
|
|
}
|
|
out += text[previousEnd+1:start] + val
|
|
previousEnd = i
|
|
start = -1
|
|
}
|
|
}
|
|
if previousEnd != len(text)-1 {
|
|
out += text[previousEnd+1:]
|
|
}
|
|
return out
|
|
}
|
|
|
|
func (el langSection) template(field string, vals tmpl) string {
|
|
text := el.get(field)
|
|
return templateString(text, vals)
|
|
}
|
|
|
|
func (el langSection) format(field string, vals ...string) string {
|
|
text := el.get(field)
|
|
start, previous := -1, -3
|
|
out := ""
|
|
val := 0
|
|
for i := range text {
|
|
if i == len(text)-2 { // Check if there's even enough space for a {n}
|
|
break
|
|
}
|
|
if text[i:i+3] == "{n}" {
|
|
start = i
|
|
out += text[previous+3:start] + vals[val]
|
|
previous = start
|
|
val++
|
|
if val == len(vals) {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
if previous+2 != len(text)-1 {
|
|
out += text[previous+3:]
|
|
}
|
|
return out
|
|
}
|
|
|
|
func (el langSection) get(field string) string {
|
|
t, ok := el[field]
|
|
if !ok {
|
|
return ""
|
|
}
|
|
return t
|
|
}
|