commit 224b4eda043c69f81cf53ab4fb3ea18518638aca
parent 350a6cadbacc5d21f4b1a1cbbf2581e6718f0bf7
Author: cblgh <cblgh@cblgh.org>
Date: Thu, 13 Oct 2022 11:38:40 +0200
add swedish translation, work on defaults
Diffstat:
6 files changed, 164 insertions(+), 17 deletions(-)
diff --git a/defaults/defaults.go b/defaults/defaults.go
@@ -1,7 +1,7 @@
package defaults
import (
- "embed"
+ _ "embed"
)
//go:embed sample-about.md
diff --git a/defaults/sample-config.toml b/defaults/sample-config.toml
@@ -0,0 +1,15 @@
+[general]
+name = ""
+link = ""
+conduct_url = ""
+
+[theme]
+background = "pink"
+foreground = "red"
+links = "aqua"
+
+[documents]
+logo = ""
+about = ""
+rules = ""
+verification_explanation = ""
diff --git a/i18n/i18n.go b/i18n/i18n.go
@@ -124,6 +124,120 @@ var English = map[string]string{
"ChangePassword": "change password",
}
+var Swedish = map[string]string{
+ "About": "om",
+ "Login": "logga in",
+ "Logout": "logga ut",
+ "Sort": "sortera",
+ "Enter": "skicka",
+ "Register": "registrera",
+
+ "LoggedIn": "inloggad",
+ "NotLoggedIn": "Ej inloggad",
+ "LogIn": "logga in",
+ "GoBack": "Go back",
+
+ "SortRecentPosts": "nyast poster",
+ "SortRecentThreads": "nyast trådar",
+
+ "ForumDescription": "Detta forum är till för <a href='{{ .CommunityLink }}'>{{.CommunityName}}</a> communityt.",
+ "LoginNoAccount": "Saknar du konto? <a href='/register'>Skapa</a> ett.",
+ "LoginFailure": "<b>Misslyckat inloggningsförsök:</b> inkorrekt lösenord, fel användernamn, eller obefintlig användare.",
+ "LoginAlreadyLoggedIn": `Du är redan inloggad. Vill du <a href="/logout">logga ut</a>?`,
+
+ "Username": "användarnamn",
+ "Password": "lösenord",
+ "PasswordMin": "Måste vara minst 9 karaktärer långt",
+ "PasswordForgot": "Glömt lösenordet?",
+
+ "Threads": "trådar",
+ "ThreadNew": "ny tråd",
+ "ThreadThe": "tråden",
+ "Index": "index",
+
+ "ThreadCreate": "Skapa en tråd",
+ "Title": "Titel",
+ "Content": "Innehåll",
+ "Create": "Skapa",
+ "TextareaPlaceholder": "Tabula rasa",
+
+ "PasswordReset": "nollställ lösenord",
+ "PasswordResetMessage": "Du är inloggad, logga ut för att nollställga lösenordet med skapat lösenordsbevis",
+ "PasswordResetSuccess": "Nollställning av lösenord—lyckades!",
+ "PasswordResetSuccessMessage": "Du har nollställt ditt lösenord!",
+ "PasswordResetSuccessLinkMessage": "Ge det ett försök och",
+
+ "RegisterMessage": "Du har redan ett konto (du är inloggad med det).",
+ "RegisterLinkMessage": "Besök",
+ "RegisterSuccess": "konto skapat",
+
+ "ErrUnaccepted": "Ej accepterat request",
+ "ErrThread404": "Tråd ej funnen",
+ "ErrThread404Message": "Denna tråden finns ej (längre?)",
+ "ErrGeneric404": "Sida ej funnen",
+ "ErrGeneric404Message": "Den besökta sidan finns ej (längre?). Felkod %d.",
+
+ "NewThreadMessage": "Enbart medlemmarna av detta forum får skapa nya trådar",
+ "NewThreadLinkMessage": "Om du är en medlem,",
+ "NewThreadCreateError": "Fel uppstod vid trådskapning",
+ "NewThreadCreateErrorMessage": "Det uppstod ett databasfel under trådskapningen, ursäkta.",
+
+ "AriaPostMeta": "Post meta",
+ "AriaDeletePost": "Delete this post",
+ "AriaRespondIntoThread": "Respond into this thread",
+ "PromptDeleteQuestion": "Radera post för alltid?",
+ "Delete": "radera",
+ "Post": "post",
+ "Author": "Författare",
+ "Responded": "svarade",
+ "YourAnswer": "Ditt svar",
+
+ "AriaHome": "Hem",
+ "ThreadStartNew": "Starta ny tråd",
+
+ "RegisterHTMLMessage": `Du har nu ett konto! Välkommen. Besök <a href="/">trådindexet</a> för att läsa och svara på trådar, eller för att starta en ny.`,
+ "RegisterKeypairExplanationStart": `En grej till: <b>spara nyckeln du ser nedan</b>. Det är ett <a href="https://en.wikipedia.org/wiki/Public-key_cryptography">nyckelpar</a> som tillhandahåller din forumidentitet, och inkluderar en hemlig del som bara du vet om och endast visas nu; forumdatabasen kommer enbart ihåg den publika delen.`,
+ "RegisterViewKeypairExplanationEnd": `Med detta nyckelpar kan du återställa ditt lösenord om du skulle tappa bort det—och detta utan att behöva samla in din email (eller kräva emailinfrastruktur på forumets sida).`,
+ "RegisterKeypairWarning": "Detta nyckelpar visas enbart denna gång",
+
+ "RegisterRules": `To register, you need to either belong to the <a href="https://webring.xxiivv.com">Merveilles Webring</a> or the <a href="https://merveilles.town">Merveilles Fediverse instance</a>`,
+
+ "RegisterVerificationCode": "Din verifikationskod är",
+ "RegisterVerificationInstructionsTitle": "Verification instructions",
+ // TODO (2022-09-20): make verification instructions another md file to load, pass path from config
+ "RegisterVerificationInstructions": `<p>You can use either your mastodon profile or your webring site to verify your registration.</p>
+ <ul>
+ <li><b>Mastodon:</b> temporarily add a new metadata item to <a href="https://merveilles.town/settings/profile">your profile</a> containing the verification code
+ displayed above. Pass your profile as the verification link.</li>
+ <li><b>Webring site:</b> Upload a plaintext file somewhere on your webring domain (incl. subdomain) containing
+ the verification code from above. Pass the link to the uploaded file as the verification link (make sure it is viewable in a browser).</li>
+ </ul>
+ `,
+
+ "RegisterVerificationLink": "Verificationsnyckel",
+ "RegisterConductCodeBoxOne": `I have refreshed my memory of the <a target="_blank" href="https://github.com/merveilles/Resources/blob/master/CONDUCT.md">{{ .CommunityName }} Code of Conduct</a>`,
+ "RegisterConductCodeBoxTwo": `Yes, I have actually <a target="_blank" href="https://github.com/merveilles/Resources/blob/master/CONDUCT.md">read it</a>`,
+
+ "PasswordResetDescription": "På denna sida går vi igenom ett par steg för att säkert nollställa ditt lösenord—utan att behöva ta till mejl!",
+ "PasswordResetUsernameQuestion": "För de första: hur löd användarnamnet?",
+ "PasswordResetCopyPayload": `Kopiera nu textsnutten nedan (aka <i>beviset</i>)`,
+ "PasswordResetFollowToolInstructions": `Följ <b>verktygsinstruktionerna</b> för att finalisera nollställningen.`,
+ "ToolInstructions": `verktygsinstruktionerna`,
+ "PasswordResetToolInstructions": fmt.Sprintf(`
+ <ul>
+ <li><a href="%s">Ladda ned verktyget</a></li>
+ <li>Kör det så hör:<br><code>pwtool --payload <payload från ovan> --keypair <filvägen innehållandes ditt nyckelpar från när du registrerade dig></code>
+ </li>
+ <li>Kopiera det genererade beviset och klistra in nedan</li>
+ <li>(Kom ihåg att spara ditt lösenord:)</li>
+ </ul>
+ `, toolURL),
+ "GeneratePayload": "skapa payload",
+ "Proof": "bevis",
+ "NewPassword": "nytt lösenord",
+ "ChangePassword": "ändra lösenord",
+}
+
var EspanolMexicano = map[string]string{
"About": "acerca de",
"Login": "loguearse",
@@ -239,6 +353,7 @@ var EspanolMexicano = map[string]string{
var translations = map[string]map[string]string{
"English": English,
"EspañolMexicano": EspanolMexicano,
+ "Swedish": Swedish,
}
type Community struct {
diff --git a/server/server.go b/server/server.go
@@ -127,7 +127,7 @@ func (h RequestHandler) IsLoggedIn(req *http.Request) (bool, int) {
}
var (
- translator = i18n.Init("EspañolMexicano")
+ translator = i18n.Init("Swedish")
community = i18n.Community{"Merveilles", "https://wiki.xxiivv.com/site/merveilles.html"}
templateFuncs = template.FuncMap{
diff --git a/types/types.go b/types/types.go
@@ -9,22 +9,22 @@ type Config struct {
// config.Files["verification"] -> verification explanation
Community struct {
- Name string
- Link string
- ConductLink string
+ Name string `json:"name"`
+ Link string `json:"link"`
+ ConductLink string `json:"conduct_url"`
} `json:"general"`
Theme struct {
- Background string
- Foreground string
- Links string
+ Background string `json:"background"`
+ Foreground string `json:"foreground"`
+ Links string `json:"links"`
} `json:"theme"`
Documents struct {
- LogoPath string
- AboutPath string
- RegisterRulesPath string
- VerificationExplanationPath string
+ LogoPath string `json:"logo"`
+ AboutPath string `json:"about"`
+ RegisterRulesPath string `json:"rules"`
+ VerificationExplanationPath string `json:"verification_explanation"`
} `json:"documents"`
}
diff --git a/util/util.go b/util/util.go
@@ -5,6 +5,8 @@ import (
"encoding/base64"
"encoding/hex"
"encoding/json"
+ "errors"
+ "io/fs"
"fmt"
"html/template"
"log"
@@ -141,18 +143,33 @@ func Capitalize(s string) string {
return strings.ToUpper(string(s[0])) + s[1:]
}
-func CheckFileExists(filepath string, defaultContent string) {
- // check if file exists
- // if it doesn't:
- // write the default contents to the filepath
+func createIfNotExist(name, content string) (bool, error) {
+ _, err := os.Stat(name)
+ if err != nil {
+ // if the file doesn't exist, create it
+ if errors.Is(err, fs.ErrNotExist) {
+ err = os.WriteFile(name, []byte(content), 0777)
+ if err != nil {
+ return false, err
+ }
+ // created file successfully
+ return true, nil
+ } else {
+ return false, err
+ }
+ }
+ return false, nil
}
// TODO (2022-09-21):
// * DONE go:embed sample-config.toml ---> defaults.DEFAULT_<x>
// * util.checkFileExists(path, mockContents)
func ReadConfig(confpath string) types.Config {
- data, err := os.ReadFile(confpath)
ed := Describe("config")
+ _, err := createIfNotExist(confpath, defaults.DEFAULT_CONFIG)
+ ed.Check(err, "create default config")
+
+ data, err := os.ReadFile(confpath)
ed.Check(err, "read file")
var conf types.Config