mirror of
https://github.com/hrfee/jfa-go.git
synced 2024-12-22 17:10:10 +00:00
move validationStrings out of strings in lang/form
This commit is contained in:
parent
26a1f30d32
commit
1aadd12006
@ -1,8 +1,8 @@
|
||||
{{ define "form-base" }}
|
||||
<script>
|
||||
window.usernameEnabled = {{ .username }};
|
||||
window.validationStrings = JSON.parse({{ .lang.validationStrings }});
|
||||
window.invalidPassword = "{{ .lang.reEnterPasswordInvalid }}";
|
||||
window.validationStrings = JSON.parse({{ .validationStrings }});
|
||||
window.invalidPassword = "{{ .strings.reEnterPasswordInvalid }}";
|
||||
window.URLBase = "{{ .urlBase }}";
|
||||
window.code = "{{ .code }}";
|
||||
</script>
|
||||
|
@ -3,14 +3,14 @@
|
||||
<head>
|
||||
<link rel="stylesheet" type="text/css" href="css/base.css">
|
||||
{{ template "header.html" . }}
|
||||
<title>{{ .lang.pageTitle }}</title>
|
||||
<title>{{ .strings.pageTitle }}</title>
|
||||
</head>
|
||||
<body class="max-w-full overflow-x-hidden section">
|
||||
<div id="modal-success" class="modal">
|
||||
<div class="modal-content card">
|
||||
<span class="heading mb-1">{{ .lang.successHeader }}</span>
|
||||
<span class="heading mb-1">{{ .strings.successHeader }}</span>
|
||||
<p class="content mb-1">{{ .successMessage }}</p>
|
||||
<a class="button ~urge !normal full-width center supra submit" href="{{ .jfLink }}" id="create-success-button">{{ .lang.successContinueButton }}</a>
|
||||
<a class="button ~urge !normal full-width center supra submit" href="{{ .jfLink }}" id="create-success-button">{{ .strings.successContinueButton }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div id="notification-box"></div>
|
||||
@ -27,34 +27,34 @@
|
||||
<div class="page-container">
|
||||
<div class="card ~neutral !low">
|
||||
<div class="row baseline">
|
||||
<span class="col heading">{{ .lang.createAccountHeader }}</span>
|
||||
<span class="col heading">{{ .strings.createAccountHeader }}</span>
|
||||
<span class="col subheading"> {{ .helpMessage }}</span>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<form class="card ~neutral !normal" id="form-create" href="">
|
||||
<label class="label supra">
|
||||
{{ .lang.username }}
|
||||
<input type="text" class="input ~neutral !high mt-half mb-1" placeholder="{{ .lang.username }}" id="create-username" aria-label="{{ .lang.username }}">
|
||||
{{ .strings.username }}
|
||||
<input type="text" class="input ~neutral !high mt-half mb-1" placeholder="{{ .strings.username }}" id="create-username" aria-label="{{ .strings.username }}">
|
||||
</label>
|
||||
|
||||
<label class="label supra" for="create-email">{{ .lang.emailAddress }}</label>
|
||||
<input type="email" class="input ~neutral 1high mt-half mb-1" placeholder="{{ .lang.emailAddress }}" id="create-email" aria-label="{{ .lang.emailAddress }}" value="{{ .email }}">
|
||||
<label class="label supra" for="create-email">{{ .strings.emailAddress }}</label>
|
||||
<input type="email" class="input ~neutral 1high mt-half mb-1" placeholder="{{ .strings.emailAddress }}" id="create-email" aria-label="{{ .strings.emailAddress }}" value="{{ .email }}">
|
||||
|
||||
<label class="label supra" for="create-password">{{ .lang.password }}</label>
|
||||
<input type="password" class="input ~neutral 1high mt-half mb-1" placeholder="{{ .lang.password }}" id="create-password" aria-label="{{ .lang.password }}">
|
||||
<label class="label supra" for="create-password">{{ .strings.password }}</label>
|
||||
<input type="password" class="input ~neutral 1high mt-half mb-1" placeholder="{{ .strings.password }}" id="create-password" aria-label="{{ .strings.password }}">
|
||||
|
||||
<label class="label supra" for="create-reenter-password">{{ .lang.reEnterPassword }}</label>
|
||||
<input type="password" class="input ~neutral 1high mt-half mb-1" placeholder="{{ .lang.password }}" id="create-reenter-password" aria-label="{{ .lang.reEnterPassword }}">
|
||||
<label class="label supra" for="create-reenter-password">{{ .strings.reEnterPassword }}</label>
|
||||
<input type="password" class="input ~neutral 1high mt-half mb-1" placeholder="{{ .strings.password }}" id="create-reenter-password" aria-label="{{ .strings.reEnterPassword }}">
|
||||
<label>
|
||||
<input type="submit" class="unfocused">
|
||||
<span class="button ~urge !normal full-width center supra submit">{{ .lang.createAccountButton }}</span>
|
||||
<span class="button ~urge !normal full-width center supra submit">{{ .strings.createAccountButton }}</span>
|
||||
</label>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="card ~neutral !normal">
|
||||
<span class="label supra" for="inv-uses">{{ .lang.passwordRequirementsHeader }}</span>
|
||||
<span class="label supra" for="inv-uses">{{ .strings.passwordRequirementsHeader }}</span>
|
||||
<ul>
|
||||
{{ range $key, $value := .requirements }}
|
||||
<li class="" id="requirement-{{ $key }}" min="{{ $value }}">
|
||||
@ -70,9 +70,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
window.validationStrings = {{ .lang.validationStrings }};
|
||||
</script>
|
||||
{{ template "form-base" . }}
|
||||
</body>
|
||||
</html>
|
||||
|
22
lang.go
Normal file
22
lang.go
Normal file
@ -0,0 +1,22 @@
|
||||
package main
|
||||
|
||||
type langMeta struct {
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
type quantityString struct {
|
||||
Singular string `json:"singular"`
|
||||
Plural string `json:"plural"`
|
||||
}
|
||||
|
||||
type adminLang struct {
|
||||
Meta langMeta `json:"meta"`
|
||||
Strings map[string]string `json:"strings"`
|
||||
Notifications map[string]string `json:"notifications"`
|
||||
QuantityStrings map[string]quantityString `json:"quantityStrings"`
|
||||
}
|
||||
|
||||
type formLang struct {
|
||||
Strings map[string]string `json:"strings"`
|
||||
ValidationStrings map[string]quantityString `json:"validationStrings"`
|
||||
}
|
@ -14,28 +14,28 @@
|
||||
"createAccountButton": "Create Account",
|
||||
"passwordRequirementsHeader": "Password Requirements",
|
||||
"successHeader": "Success!",
|
||||
"successContinueButton": "Continue",
|
||||
"validationStrings": {
|
||||
"length": {
|
||||
"singular": "Must have at least {n} character",
|
||||
"plural": "Must have at least {n} characters"
|
||||
},
|
||||
"uppercase": {
|
||||
"singular": "Must have at least {n} uppercase character",
|
||||
"plural": "Must have at least {n} uppercase characters"
|
||||
},
|
||||
"lowercase": {
|
||||
"singular": "Must have at least {n} lowercase character",
|
||||
"plural": "Must have at least {n} lowercase characters"
|
||||
},
|
||||
"number": {
|
||||
"singular": "Must have at least {n} number",
|
||||
"plural": "Must have at least {n} numbers"
|
||||
},
|
||||
"special": {
|
||||
"singular": "Must have at least {n} special character",
|
||||
"plural": "Must have at least {n} special characters"
|
||||
}
|
||||
"successContinueButton": "Continue"
|
||||
},
|
||||
"validationStrings": {
|
||||
"length": {
|
||||
"singular": "Must have at least {n} character",
|
||||
"plural": "Must have at least {n} characters"
|
||||
},
|
||||
"uppercase": {
|
||||
"singular": "Must have at least {n} uppercase character",
|
||||
"plural": "Must have at least {n} uppercase characters"
|
||||
},
|
||||
"lowercase": {
|
||||
"singular": "Must have at least {n} lowercase character",
|
||||
"plural": "Must have at least {n} lowercase characters"
|
||||
},
|
||||
"number": {
|
||||
"singular": "Must have at least {n} number",
|
||||
"plural": "Must have at least {n} numbers"
|
||||
},
|
||||
"special": {
|
||||
"singular": "Must have at least {n} special character",
|
||||
"plural": "Must have at least {n} special characters"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -15,28 +15,28 @@
|
||||
"createAccountButton": "Créer le compte",
|
||||
"passwordRequirementsHeader": "Mot de passe requis",
|
||||
"successHeader": "Succes!",
|
||||
"successContinueButton": "Continuer",
|
||||
"validationStrings": {
|
||||
"length": {
|
||||
"singular": "Doit avoir au moins {n} caractère",
|
||||
"plural": "Doit avoir au moins {n} caractères"
|
||||
},
|
||||
"uppercase": {
|
||||
"singular": "Doit avoir au moins {n} caractère majuscule",
|
||||
"plural": "Must have at least {n} caractères majuscules"
|
||||
},
|
||||
"lowercase": {
|
||||
"singular": "Doit avoir au moins {n} caractère minuscule",
|
||||
"plural": "Doit avoir au moins {n} caractères minuscules"
|
||||
},
|
||||
"number": {
|
||||
"singular": "Doit avoir au moins {n} nombre",
|
||||
"plural": "Doit avoir au moins {n} nombres"
|
||||
},
|
||||
"special": {
|
||||
"singular": "Doit avoir au moins {n} caractère spécial",
|
||||
"plural": "Doit avoir au moins {n} caractères spéciaux"
|
||||
}
|
||||
"successContinueButton": "Continuer"
|
||||
},
|
||||
"validationStrings": {
|
||||
"length": {
|
||||
"singular": "Doit avoir au moins {n} caractère",
|
||||
"plural": "Doit avoir au moins {n} caractères"
|
||||
},
|
||||
"uppercase": {
|
||||
"singular": "Doit avoir au moins {n} caractère majuscule",
|
||||
"plural": "Must have at least {n} caractères majuscules"
|
||||
},
|
||||
"lowercase": {
|
||||
"singular": "Doit avoir au moins {n} caractère minuscule",
|
||||
"plural": "Doit avoir au moins {n} caractères minuscules"
|
||||
},
|
||||
"number": {
|
||||
"singular": "Doit avoir au moins {n} nombre",
|
||||
"plural": "Doit avoir au moins {n} nombres"
|
||||
},
|
||||
"special": {
|
||||
"singular": "Doit avoir au moins {n} caractère spécial",
|
||||
"plural": "Doit avoir au moins {n} caractères spéciaux"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,28 +14,28 @@
|
||||
"createAccountButton": "Maak account aan",
|
||||
"passwordRequirementsHeader": "Wachtwoordvereisten",
|
||||
"successHeader": "Succes!",
|
||||
"successContinueButton": "Doorgaan",
|
||||
"validationStrings": {
|
||||
"length": {
|
||||
"singular": "Moet ten minste {n} teken bevatten",
|
||||
"plural": "Moet ten minste {n} tekens bevatten"
|
||||
},
|
||||
"uppercase": {
|
||||
"singular": "Moet ten minste {n} hoofdletter bevatten",
|
||||
"plural": "Moet ten minste {n} hoofdletters bevatten"
|
||||
},
|
||||
"lowercase": {
|
||||
"singular": "Moet ten minste {n} kleine letter bevatten",
|
||||
"plural": "Moet ten minste {n} kleine letters bevatten"
|
||||
},
|
||||
"number": {
|
||||
"singular": "Moet ten minste {n} cijfer bevatten",
|
||||
"plural": "Moet ten minste {n} cijfers bevatten"
|
||||
},
|
||||
"special": {
|
||||
"singular": "Moet ten minste {n} bijzonder teken bevatten",
|
||||
"plural": "Moet ten minste {n} bijzondere tekens bevatten"
|
||||
}
|
||||
"successContinueButton": "Doorgaan"
|
||||
},
|
||||
"validationStrings": {
|
||||
"length": {
|
||||
"singular": "Moet ten minste {n} teken bevatten",
|
||||
"plural": "Moet ten minste {n} tekens bevatten"
|
||||
},
|
||||
"uppercase": {
|
||||
"singular": "Moet ten minste {n} hoofdletter bevatten",
|
||||
"plural": "Moet ten minste {n} hoofdletters bevatten"
|
||||
},
|
||||
"lowercase": {
|
||||
"singular": "Moet ten minste {n} kleine letter bevatten",
|
||||
"plural": "Moet ten minste {n} kleine letters bevatten"
|
||||
},
|
||||
"number": {
|
||||
"singular": "Moet ten minste {n} cijfer bevatten",
|
||||
"plural": "Moet ten minste {n} cijfers bevatten"
|
||||
},
|
||||
"special": {
|
||||
"singular": "Moet ten minste {n} bijzonder teken bevatten",
|
||||
"plural": "Moet ten minste {n} bijzondere tekens bevatten"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -147,7 +147,7 @@ type setting struct {
|
||||
}
|
||||
|
||||
type section struct {
|
||||
Meta meta `json:"meta"`
|
||||
Meta langMeta `json:"meta"`
|
||||
Order []string `json:"order"`
|
||||
Settings map[string]setting `json:"settings"`
|
||||
}
|
||||
|
16
storage.go
16
storage.go
@ -23,13 +23,19 @@ type Storage struct {
|
||||
type EmailLang map[string]map[string]map[string]interface{} // Map of lang codes to email name to fields
|
||||
|
||||
func (el *EmailLang) format(lang, email, field string, vals ...string) string {
|
||||
text := (*el)[lang][email][field].(string)
|
||||
text := el.get(lang, email, field)
|
||||
for _, val := range vals {
|
||||
text = strings.Replace(text, "{n}", val, 1)
|
||||
}
|
||||
return text
|
||||
}
|
||||
func (el *EmailLang) get(lang, email, field string) string { return (*el)[lang][email][field].(string) }
|
||||
func (el *EmailLang) get(lang, email, field string) string {
|
||||
t, ok := (*el)[lang][email][field]
|
||||
if !ok {
|
||||
t = (*el)["en-us"][email][field]
|
||||
}
|
||||
return t.(string)
|
||||
}
|
||||
|
||||
type Lang struct {
|
||||
chosenFormLang string
|
||||
@ -121,14 +127,12 @@ func (st *Storage) loadLang() error {
|
||||
return err
|
||||
}
|
||||
for index, lang := range form {
|
||||
strings := lang["strings"].(map[string]interface{})
|
||||
validationStrings := strings["validationStrings"].(map[string]interface{})
|
||||
validationStrings := lang["validationStrings"].(map[string]interface{})
|
||||
vS, err := json.Marshal(validationStrings)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
strings["validationStrings"] = string(vS)
|
||||
lang["strings"] = strings
|
||||
lang["validationStrings"] = string(vS)
|
||||
form[index] = lang
|
||||
}
|
||||
st.lang.Form = form
|
||||
|
25
views.go
25
views.go
@ -84,18 +84,19 @@ func (app *appContext) InviteProxy(gc *gin.Context) {
|
||||
email = ""
|
||||
}
|
||||
gcHTML(gc, http.StatusOK, "form-loader.html", gin.H{
|
||||
"urlBase": app.URLBase,
|
||||
"cssClass": app.cssClass,
|
||||
"contactMessage": app.config.Section("ui").Key("contact_message").String(),
|
||||
"helpMessage": app.config.Section("ui").Key("help_message").String(),
|
||||
"successMessage": app.config.Section("ui").Key("success_message").String(),
|
||||
"jfLink": app.config.Section("jellyfin").Key("public_server").String(),
|
||||
"validate": app.config.Section("password_validation").Key("enabled").MustBool(false),
|
||||
"requirements": app.validator.getCriteria(),
|
||||
"email": email,
|
||||
"username": !app.config.Section("email").Key("no_username").MustBool(false),
|
||||
"lang": app.storage.lang.Form[lang]["strings"],
|
||||
"code": code,
|
||||
"urlBase": app.URLBase,
|
||||
"cssClass": app.cssClass,
|
||||
"contactMessage": app.config.Section("ui").Key("contact_message").String(),
|
||||
"helpMessage": app.config.Section("ui").Key("help_message").String(),
|
||||
"successMessage": app.config.Section("ui").Key("success_message").String(),
|
||||
"jfLink": app.config.Section("jellyfin").Key("public_server").String(),
|
||||
"validate": app.config.Section("password_validation").Key("enabled").MustBool(false),
|
||||
"requirements": app.validator.getCriteria(),
|
||||
"email": email,
|
||||
"username": !app.config.Section("email").Key("no_username").MustBool(false),
|
||||
"strings": app.storage.lang.Form[lang]["strings"],
|
||||
"validationStrings": app.storage.lang.Form[lang]["validationStrings"],
|
||||
"code": code,
|
||||
})
|
||||
} else {
|
||||
gcHTML(gc, 404, "invalidCode.html", gin.H{
|
||||
|
Loading…
Reference in New Issue
Block a user