add more translations

This commit is contained in:
HF 2021-01-30 22:36:53 +01:00
parent e7eafbf450
commit a5881d11ac
29 changed files with 1042 additions and 583 deletions

View File

@ -134,32 +134,16 @@ msgid "User online"
msgstr "Spieler anwesend"
#: src/components/OnlineBox.jsx:25
msgid "Pixel gesetzt"
msgstr "Pixel plaziert"
msgid "Pixels placed"
msgstr "Pixels gesetzt"
#: src/components/Converter.jsx:609 src/components/CoordinatesBox.jsx:26
msgid "Copy to Clipboard"
msgstr "Kopiere in die Zwischenablage"
#: src/components/DownloadButton.jsx:37
msgid "Make Screenshot"
msgstr "Erstelle eine Bildschirmaufnahme"
#: src/components/LogInButton.jsx:20 src/components/UserAreaModal.jsx:160
msgid "User Area"
msgstr "Spielerbereich"
#: src/components/SettingsButton.jsx:20 src/components/SettingsModal.jsx:267
msgid "Settings"
msgstr "Einstellungen"
#: src/components/HelpButton.jsx:20
msgid "Help"
msgstr "Hilfe"
#: src/components/Chat.jsx:143
msgid "Channel settings"
msgstr "Channel Einstellungen"
msgstr "Kanal Einstellungen"
#: src/components/Chat.jsx:152
msgid "maximize"
@ -177,6 +161,22 @@ msgstr "Chatte hier"
msgid "You must be logged in to chat"
msgstr "Melde dich an um dich zu unterhalten"
#: src/components/DownloadButton.jsx:37
msgid "Make Screenshot"
msgstr "Erstelle eine Bildschirmaufnahme"
#: src/components/LogInButton.jsx:20 src/components/UserAreaModal.jsx:160
msgid "User Area"
msgstr "Spielerbereich"
#: src/components/SettingsButton.jsx:20 src/components/SettingsModal.jsx:267
msgid "Settings"
msgstr "Einstellungen"
#: src/components/HelpButton.jsx:20
msgid "Help"
msgstr "Hilfe"
#: src/components/GlobeButton.jsx:31
msgid "Globe View"
msgstr "Globus Ansicht"
@ -203,7 +203,7 @@ msgstr "Deaktiviere Spiel Ton"
#: src/components/SettingsModal.jsx:139
msgid "All sound effects will be disabled."
msgstr "alle Toneffekte werden ausgeschaltet"
msgstr "Alle Toneffekte werden ausgeschaltet."
#: src/components/SettingsModal.jsx:145
msgid "Enable chat notifications"
@ -232,7 +232,7 @@ msgstr "Kompakte Palette"
#: src/components/SettingsModal.jsx:160
msgid "Display Palette in a compact form that takes less screen space."
msgstr ""
"Zeige die Palette in einer kleineren Form an, welche weniger Platz benötigt"
"Zeige die Palette in einer kleineren Form an, welche weniger Platz benötigt."
#: src/components/SettingsModal.jsx:165
msgid "Potato Mode"
@ -248,7 +248,7 @@ msgstr "Helles Raster"
#: src/components/SettingsModal.jsx:172
msgid "Show Grid in white instead of black."
msgstr "Zeige das Raster in weiß anstatt schwarz"
msgstr "Zeige das Raster in weiß anstatt schwarz."
#: src/components/SettingsModal.jsx:179
msgid "Historical View"
@ -256,7 +256,7 @@ msgstr "Historische Ansicht"
#: src/components/SettingsModal.jsx:180
msgid "Check out past versions of the canvas."
msgstr "Siehe vergangene Versionen der Leinwand"
msgstr "Siehe vergangene Versionen der Leinwand."
#: src/components/SettingsModal.jsx:188
msgid "Themes"
@ -264,7 +264,7 @@ msgstr "Themen"
#: src/components/SettingsModal.jsx:189
msgid "How pixelplanet should look like."
msgstr "Wähle aus wie pixelplanet aussehen soll"
msgstr "Wähle aus wie pixelplanet aussehen soll."
#: src/components/HelpModal.jsx:34 src/components/HelpModal.jsx:35
msgid "Privacy Policy"
@ -497,19 +497,19 @@ msgstr "Willkommen auf PixelPlanet.fun"
#: src/components/ChannelContextMenu.jsx:73
msgid "Mute"
msgstr ""
msgstr "Stummschalten"
#: src/components/UserContextMenu.jsx:72
msgid "Ping"
msgstr ""
msgstr "Erwähnen"
#: src/components/UserContextMenu.jsx:97
msgid "DM"
msgstr ""
msgstr "DM"
#: src/components/UserContextMenu.jsx:107
msgid "Block"
msgstr ""
msgstr "Blocke"
#: src/components/PalselButton.jsx:25
msgid "Close Palette"
@ -537,12 +537,12 @@ msgid "Login to access more features and stats."
msgstr "Melde dich and um mehr Funktionen und Statistikan zu sehen."
#: src/components/UserAreaModal.jsx:35
msgid "Login with Mail:"
msgstr "Mit Mail anmelden:"
msgid "Login with Name or Mail:"
msgstr "Mit Name oder Mail anmelden:"
#: src/components/UserAreaModal.jsx:42
msgid "I forgot my Password."
msgstr "Ich habe mein Passwort vergessen"
msgstr "Ich habe mein Passwort vergessen."
#: src/components/UserAreaModal.jsx:43
msgid "or login with:"
@ -582,7 +582,7 @@ msgstr "Lade..."
#: src/components/ForgotPasswordModal.jsx:16
msgid "Enter your mail adress and we will send you a new password:"
msgstr "Gib deine Mail Adresse an und wir senden dir ein neues Passwort."
msgstr "Gib deine Mail Adresse an und wir senden dir ein neues Passwort:"
#: src/components/ForgotPasswordModal.jsx:37
msgid "Restore my Password"
@ -599,6 +599,11 @@ msgid ""
"boring after a while and after weeks of no major change and if they really "
"aren't worth being kept active, we decide to remove them."
msgstr ""
"Wir versuchen so wenig wie möglich Leinwände zu entfernen. Manche werden "
"allerding aus Spaß gestarted oder von Spielern angefragt oder sind nur "
"Memes. Diese Leinwände können nach einiger Zeit langweilig werden und nach "
"Wochen ohne erwähnenswerte Aktivität und falls sie es wirklich nicht wert "
"sind, behalten zu werden, entscheiden wir uns side zu entfernen."
#: src/components/ArchiveModal.jsx:22
msgid ""
@ -619,6 +624,10 @@ msgid ""
"with a 5s coolodwn and 60s stacking. It got launched on May 11th and "
"remained active for months till it got shut down on November 30th."
msgstr ""
"Diese Leinwand wurde zu Zeiten politscher Konlikte auf der Erd-Leinwand "
"gestarted. Es war eine 1024x1024 Abbildung des politischen Kompass mit 5s "
"Abklingzeit und 60s gesamter Wartezeit. Es wurde am 11. Mai 2020 gestartet "
"und war für Monate aktiv bis es am 30. November geschlossen wurde."
#: src/components/ArchiveModal.jsx:32
msgid ""
@ -640,17 +649,27 @@ msgid ""
"palettes, cooldown and requirements. Archive of closed canvases can be "
"accessed here:"
msgstr ""
"Wähle die Leinwand aus welche du benutzen willst. Jede Leinwand ist "
"einzigartig und hat unterschiedliche Parletten, Abklingzeiten und "
"Vorraussetzungen. Archiv von vergangenen Leinwänden kann hier gesehen werden:"
#: src/components/CanvasSelectModal.jsx:37
msgid "Archive"
msgstr "Archiv"
#: src/components/ChangeMail.jsx:104 src/components/ChangeName.jsx:82
#: src/components/ChangePassword.jsx:120 src/components/DeleteAccount.jsx:82
#: src/components/LogInForm.jsx:97 src/components/NewPasswordForm.jsx:93
#: src/components/SignUpForm.jsx:118
msgid "Error"
msgstr "Fehler"
#: src/components/LogInForm.jsx:104
msgid "Name or Email"
msgstr "Name oder Email"
#: src/components/ChangeMail.jsx:109 src/components/DeleteAccount.jsx:88
#: src/components/LogInForm.jsx:111 src/components/SignUpForm.jsx:139
#: src/components/ChangeMail.jsx:112 src/components/DeleteAccount.jsx:89
#: src/components/LogInForm.jsx:111 src/components/SignUpForm.jsx:140
msgid "Password"
msgstr "Passwort"
@ -658,6 +677,20 @@ msgstr "Passwort"
msgid "LogIn"
msgstr "Einloggen"
#: src/components/Rankings.jsx:37
msgid "Total"
msgstr "Gesamt"
#: src/components/Rankings.jsx:45
msgid "Daily"
msgstr "Täglich"
#: src/components/Rankings.jsx:49
msgid "Ranking updates every 5 min. Daily rankings get reset at midnight UTC."
msgstr ""
"Die Rangliste wird alle 5min aktualisiert. Die tägliche Liste wird um "
"Mitternacht UTC zurückgestellt."
#: src/components/UserArea.jsx:57
msgid "Todays Placed Pixels"
msgstr "Heutige Pixel"
@ -703,23 +736,38 @@ msgstr "Lösche Konto"
msgid "Social Settings"
msgstr "Soziale Einstellungen"
#: src/components/Rankings.jsx:37
msgid "Total"
msgstr "Gesamt"
#: src/components/SignUpForm.jsx:126
msgid "Name"
msgstr "Name"
#: src/components/Rankings.jsx:45
msgid "Daily"
msgstr "Täglich"
#: src/components/NewPasswordForm.jsx:100 src/components/SignUpForm.jsx:133
msgid "Email"
msgstr "Email"
#: src/components/Rankings.jsx:49
msgid "Ranking updates every 5 min. Daily rankings get reset at midnight UTC."
msgstr ""
"Die Rangliste wird alle 5min aktualisiert. Die tägliche Liste wird um "
"Mitternacht UTC zurückgestellt."
#: src/components/SignUpForm.jsx:149
msgid "Confirm Password"
msgstr "Passwort bestätigen"
#: src/components/Admintools.jsx:306 src/components/Admintools.jsx:387
#: src/components/Admintools.jsx:461 src/components/Admintools.jsx:505
#: src/components/Admintools.jsx:589 src/components/NewPasswordForm.jsx:104
#: src/components/SignUpForm.jsx:152
msgid "Submit"
msgstr "Absenden"
#: src/components/ChangeMail.jsx:125 src/components/ChangeName.jsx:94
#: src/components/ChangePassword.jsx:152 src/components/DeleteAccount.jsx:95
#: src/components/NewPasswordForm.jsx:106 src/components/SignUpForm.jsx:158
msgid "Cancel"
msgstr "Abbrechen"
#: src/components/NewPasswordForm.jsx:83
msgid "Sent you a mail with instructions to reset your password."
msgstr "Sendete eine E-Mail mit Instruktionen um das Passwort zurückzusetzen."
#: src/components/CanvasItem.jsx:46
msgid "Cooldown"
msgstr "Wartezeit"
msgstr "Abklingzeit"
#: src/components/CanvasItem.jsx:52
msgid "Stacking till"
@ -746,103 +794,6 @@ msgstr "und ${ canvas.req } gesetzte Pixel"
msgid "Dimensions"
msgstr "Dimensionen"
#: src/components/Admintools.jsx:179
msgid "Build image on canvas."
msgstr ""
#: src/components/Admintools.jsx:182
msgid "Build image and set it to protected."
msgstr ""
#: src/components/Admintools.jsx:185
msgid "Build image, but reset cooldown to unset-pixel cd."
msgstr ""
#: src/components/Admintools.jsx:248
msgid "Image Upload"
msgstr ""
#: src/components/Admintools.jsx:249
msgid "Upload images to canvas"
msgstr "Lade ein Bild zur Leinwand hoch"
#: src/components/Admintools.jsx:251
msgid "File"
msgstr ""
#: src/components/Admintools.jsx:271
msgid "Coordinates in X_Y format:"
msgstr ""
#: src/components/Admintools.jsx:306 src/components/Admintools.jsx:387
#: src/components/Admintools.jsx:461 src/components/Admintools.jsx:505
#: src/components/Admintools.jsx:589 src/components/SignUpForm.jsx:151
msgid "Submit"
msgstr ""
#: src/components/Admintools.jsx:311
msgid "Pixel Protection"
msgstr "Pixel beschützen"
#: src/components/Admintools.jsx:313
msgid ""
"Set protection of areas (if you need finer grained control, "
"use protect with image upload and alpha layers)"
msgstr ""
#: src/components/Admintools.jsx:392
msgid "Rollback to Date"
msgstr ""
#: src/components/Admintools.jsx:394
msgid "Rollback an area of the canvas to a set date (00:00 UTC)"
msgstr ""
#: src/components/Admintools.jsx:468
msgid "IP Actions"
msgstr ""
#: src/components/Admintools.jsx:470
msgid "Do stuff with IPs (one IP per line)"
msgstr ""
#: src/components/Admintools.jsx:510
msgid "Manage Moderators"
msgstr ""
#: src/components/Admintools.jsx:512
msgid "Remove Moderator"
msgstr ""
#: src/components/Admintools.jsx:544
msgid "There are no mods"
msgstr ""
#: src/components/Admintools.jsx:549
msgid "Assign new Mod"
msgstr ""
#: src/components/Admintools.jsx:552
msgid "Enter UserName of new Mod"
msgstr ""
#: src/components/SignUpForm.jsx:125
msgid "Name"
msgstr ""
#: src/components/SignUpForm.jsx:132
msgid "Email"
msgstr ""
#: src/components/SignUpForm.jsx:148
msgid "Confirm Password"
msgstr "Passwort bestätigen"
#: src/components/ChangeMail.jsx:122 src/components/ChangePassword.jsx:151
#: src/components/DeleteAccount.jsx:94 src/components/SignUpForm.jsx:157
msgid "Cancel"
msgstr "Abbrechen"
#: src/components/Converter.jsx:274
msgid "Choose Canvas"
msgstr "Wähle Leinwand"
@ -913,169 +864,305 @@ msgstr "Zurücksetzen"
msgid "Download Template"
msgstr "Bild herunterladen"
#: src/utils/validation.js:15
msgid "Email can't be empty."
msgstr ""
#: src/components/Admintools.jsx:179
msgid "Build image on canvas."
msgstr "Zeiche Bild auf Leinwand."
#: src/utils/validation.js:16
msgid "Email should be at least 5 characters long."
msgstr ""
#: src/components/Admintools.jsx:182
msgid "Build image and set it to protected."
msgstr "Lade Bild und schütze es."
#: src/utils/validation.js:17
msgid "Email can't be longer than 40 characters."
#: src/components/Admintools.jsx:185
msgid "Build image, but reset cooldown to unset-pixel cd."
msgstr "Lade Bild und setze Abklingzeit wenn möglich zurück."
#: src/components/Admintools.jsx:248
msgid "Image Upload"
msgstr "Bild Hochladen"
#: src/components/Admintools.jsx:249
msgid "Upload images to canvas"
msgstr "Lade ein Bild zur Leinwand hoch"
#: src/components/Admintools.jsx:251
msgid "File"
msgstr "Datei"
#: src/components/Admintools.jsx:271
msgid "Coordinates in X_Y format:"
msgstr "Koordinaten in X_Y Format:"
#: src/components/Admintools.jsx:311
msgid "Pixel Protection"
msgstr "Pixel beschützen"
#: src/components/Admintools.jsx:313
msgid ""
"Set protection of areas (if you need finer grained control, "
"use protect with image upload and alpha layers)"
msgstr ""
"Setze Gebiet auf geschützt (falls genauere Kontrolle erwünscht, lade Bild "
"mit Transparenz mit \"protect\" hoch)"
#: src/components/Admintools.jsx:392
msgid "Rollback to Date"
msgstr "Spule zum Datum zurück"
#: src/components/Admintools.jsx:394
msgid "Rollback an area of the canvas to a set date (00:00 UTC)"
msgstr ""
"Spule einen Beraich auf der Leinwand zum angegebenen Datum zurück (00:00 UTC)"
#: src/components/Admintools.jsx:468
msgid "IP Actions"
msgstr "IP Aktionen"
#: src/components/Admintools.jsx:470
msgid "Do stuff with IPs (one IP per line)"
msgstr "Mache etwas mit IPs (eine IP pro Zeile)"
#: src/components/Admintools.jsx:510
msgid "Manage Moderators"
msgstr "Verwalte Moderatoren"
#: src/components/Admintools.jsx:512
msgid "Remove Moderator"
msgstr "Entferne Moderator"
#: src/components/Admintools.jsx:544
msgid "There are no mods"
msgstr "Es gibt keine Moderatoren"
#: src/components/Admintools.jsx:549
msgid "Assign new Mod"
msgstr "Moderator zuweisen"
#: src/components/Admintools.jsx:552
msgid "Enter UserName of new Mod"
msgstr "Gebe Name des neuen Moderators ein"
#: src/components/Admintools.jsx:561
msgid "User Name"
msgstr "Spielerbereich"
#: src/utils/validation.js:18
msgid "Email should at least contain a dot"
msgstr ""
msgid "Email can't be empty."
msgstr "Email Feld kann nicht leer sein."
#: src/utils/validation.js:19
msgid "Email should be at least 5 characters long."
msgstr "Email sollte zumindest 5 Zeichen lang sein."
#: src/utils/validation.js:20
msgid "Email can't be longer than 40 characters."
msgstr "Email kann nicht länger als 40 Zeichen sein."
#: src/utils/validation.js:21
msgid "Email should at least contain a dot"
msgstr "Email sollte zumindest einen Punkt beinhalten"
#: src/utils/validation.js:23
msgid "Email should contain a @"
msgstr ""
msgstr "Email sollte ein @ beinhalten"
#: src/utils/validation.js:27
#: src/utils/validation.js:30
msgid "Name can't be empty."
msgstr ""
msgstr "Email Feld kann nicht leer sein."
#: src/utils/validation.js:28
#: src/utils/validation.js:31
msgid "Name must be at least 4 characters long"
msgstr ""
msgstr "Name muss mindestens 4 Zeichen lang sein"
#: src/utils/validation.js:29
#: src/utils/validation.js:32
msgid "Name must be shorter than 26 characters"
msgstr ""
msgstr "Name muss kleiner als 26 Zeichen sein"
#: src/utils/validation.js:36
#: src/utils/validation.js:39
msgid "Name contains invalid character like @, /, \\ or #"
msgstr ""
#: src/utils/validation.js:51
msgid "Password must be at least 6 characters long."
msgstr "Passwort muss mindestens 6 Zeichen lang sein"
msgstr "Ungültige Zeichen im Namen wie @,/.\\ oder #"
#: src/utils/validation.js:54
msgid "Password must be shorter than 60 characters."
msgstr ""
msgid "No password given."
msgstr "Kein Passwort eingegeben."
#: src/utils/validation.js:68
msgid "Could not connect to server, please try again later :("
msgstr ""
#: src/utils/validation.js:57
msgid "Password must be at least 6 characters long."
msgstr "Passwort muss mindestens 6 Zeichen lang sein."
#: src/utils/validation.js:60
msgid "Password must be shorter than 60 characters."
msgstr "Passwort muss kleiner als 60 Zeichen sein."
#: src/utils/validation.js:74
msgid "I think we experienced some error :("
msgid "Could not connect to server, please try again later :("
msgstr ""
"Kann nich zum Server verbinden, bitte versuche es später noch einmal :("
#: src/components/DeleteAccount.jsx:92
#: src/utils/validation.js:80
msgid "I think we experienced some error :("
msgstr "Ich glaube wir haben einen Fehler :("
#: src/components/DeleteAccount.jsx:93
msgid "Yes, Delete My Account!"
msgstr "Ja, löche mein Konto!"
#: src/components/SocialSettings.jsx:39
msgid "Block all Private Messages"
msgstr "Blockiere alle Privaten Nachrichten"
#: src/components/SocialSettings.jsx:57
msgid "Unblock Users"
msgstr "Entblocke Spieler"
#: src/components/SocialSettings.jsx:81
msgid "You have no users blocked"
msgstr "Du hast keinen Spieler geblockt"
#: src/components/ChangeMail.jsx:89
msgid ""
"Changed Mail successfully. We sent you a verification mail, "
"please verify your new mail adress."
msgstr ""
"Erfolgreich änderte Mail Adresse. Wir haben dir eine neue Bestätigungsmail "
"gesendet."
#: src/components/ChangeMail.jsx:116
#: src/components/ChangeMail.jsx:119
msgid "New Mail"
msgstr "Neue Mail"
#: src/components/ChangeMail.jsx:120 src/components/ChangePassword.jsx:149
#: src/components/ChangeMail.jsx:123 src/components/ChangeName.jsx:92
#: src/components/ChangePassword.jsx:150
msgid "Save"
msgstr ""
msgstr "Speichern"
#: src/components/ChangePassword.jsx:18
msgid "Passwords do not match."
msgstr ""
msgstr "Passwörter stimmen nicht überein."
#: src/components/ChangePassword.jsx:103
msgid "Changed Password successfully."
msgstr "Passwort erfolgreich geändert"
msgstr "Passwort erfolgreich geändert."
#: src/components/ChangePassword.jsx:128
#: src/components/ChangePassword.jsx:129
msgid "Old Password"
msgstr "Altes Passwort"
#: src/components/ChangePassword.jsx:136
#: src/components/ChangePassword.jsx:137
msgid "New Password"
msgstr "Neues Passwort"
#: src/components/ChangePassword.jsx:145
#: src/components/ChangePassword.jsx:146
msgid "Confirm New Password"
msgstr "Neues Passwort bestätigen"
#: src/components/SocialSettings.jsx:39
msgid "Block all Private Messages"
msgstr ""
#: src/components/ChangeName.jsx:88
msgid "New Username"
msgstr "Neuer Name"
#: src/components/SocialSettings.jsx:57
msgid "Unblock Users"
msgstr ""
#: src/components/UserMessages.jsx:41
msgid "A new verification mail is getting sent to you."
msgstr "Eine neue Bestätigungsmail wurde gesendet."
#: src/components/SocialSettings.jsx:81
msgid "You have no users blocked"
#: src/components/UserMessages.jsx:75
msgid "You successfully linked your mc account."
msgstr "Minecraft Konto wurde erfolgreich verknüpft."
#: src/components/UserMessages.jsx:76
msgid "You denied."
msgstr "Abgelehnt."
#: src/components/UserMessages.jsx:94
msgid ""
"Please verify your mail address \n"
"or your account could get deleted after a few days."
msgstr ""
"Bitte bestätige deine E-Mail Adresse oder dein Konto könnte nach einigen "
"Tagen gelöscht werden."
#: src/components/UserMessages.jsx:111
msgid "Click here to request a new verification mail."
msgstr "Klicke hier um eine neue Bestätigungsmail zu beantragen."
#: src/components/UserMessages.jsx:120
#, javascript-format
msgid "You requested to link your mc account ${ minecraftname }."
msgstr "Anfrage um das Minecraft Konto ${ minecraftname } zu verknüpfen."
#: src/components/UserMessages.jsx:140
msgid "Accept"
msgstr "Annehmen"
#: src/components/UserMessages.jsx:150
msgid "Deny"
msgstr "Ablehnen"
#: src/components/HelpModal.jsx:15 src/components/SettingsModal.jsx:125
msgctxt "keybinds"
msgid "G"
msgstr ""
msgstr "G"
#: src/components/HelpModal.jsx:16 src/components/SettingsModal.jsx:132
msgctxt "keybinds"
msgid "X"
msgstr ""
msgstr "X"
#: src/components/SettingsModal.jsx:140
msgctxt "keybinds"
msgid "M"
msgstr ""
msgstr "M"
#: src/components/HelpModal.jsx:17 src/components/SettingsModal.jsx:182
msgctxt "keybinds"
msgid "H"
msgstr ""
msgstr "H"
#: src/components/HelpModal.jsx:18
msgctxt "keybinds"
msgid "R"
msgstr ""
msgstr "R"
#: src/components/HelpModal.jsx:19
msgctxt "keybinds"
msgid "Q"
msgstr ""
msgstr "Q"
#: src/components/HelpModal.jsx:20
msgctxt "keybinds"
msgid "E"
msgstr ""
msgstr "E"
#: src/components/HelpModal.jsx:21
msgctxt "keybinds"
msgid "W"
msgstr ""
msgstr "W"
#: src/components/HelpModal.jsx:22
msgctxt "keybinds"
msgid "A"
msgstr ""
msgstr "A"
#: src/components/HelpModal.jsx:23
msgctxt "keybinds"
msgid "S"
msgstr ""
msgstr "S"
#: src/components/HelpModal.jsx:24
msgctxt "keybinds"
msgid "D"
msgstr ""
msgstr "D"
#: src/components/HelpModal.jsx:31
msgctxt "keybinds"
msgid "Shift"
msgstr ""
msgstr "Shift"
#: src/components/HelpModal.jsx:32
msgctxt "keybinds"
msgid "C"
msgstr ""
msgstr "C"
#~ msgid "Error: ${ error }"
#~ msgstr "Fehler: ${ error }"
#~ msgid "Pixel gesetzt"
#~ msgstr "Pixel plaziert"

View File

@ -12,9 +12,17 @@ msgstr ""
"Plural-Forms: nplurals = 2; plural = (n != 1);\n"
"X-Generator: Poedit 2.3\n"
#: src/ssr-components/Main.jsx:53
msgid "PixelPlanet.fun"
msgstr "PixelPlanet.Fun"
#: src/ssr-components/Main.jsx:55
msgid "Place color pixels on an map styled canvas with other players online"
msgstr "Zeichne mit farbigen Pixel auf einer Weltkarte mit anderen Spielern"
#: src/ssr-components/Globe.jsx:44
msgid "Double click on globe to go back."
msgstr "Doppelklick um zurück zu gehen"
msgstr "Doppelklick um zurück zu gehen."
#: src/ssr-components/Globe.jsx:45
msgid "Loading..."
@ -28,35 +36,37 @@ msgstr "PixelPlanet.Fun 3D Globus"
msgid "A 3D globe of our whole map"
msgstr "Ein interaktvier 3D Globus unserer gesamten Karte"
#: src/routes/reset_password.js:63
#: src/routes/reset_password.js:65
msgid "You sent an empty password or invalid data :("
msgstr ""
msgstr "Du hast ein ungültiges Passwort oder Daten gesendet :("
#: src/routes/reset_password.js:74
#: src/routes/reset_password.js:77
msgid "This password-reset link isn't valid anymore :("
msgstr ""
msgstr "Dieser Passwort-Wiederherstellungslink ist nichtmehr gültig :("
#: src/routes/reset_password.js:84
#: src/routes/reset_password.js:88
msgid "Your passwords do not match :("
msgstr ""
msgstr "Passwörter stimmen nicht überein :("
#: src/routes/reset_password.js:98
#: src/routes/reset_password.js:103
msgid "User doesn't exist in our database :("
msgstr ""
msgstr "Spieler existiert nicht in unserer Datenbank :("
#: src/routes/reset_password.js:109
#: src/routes/reset_password.js:115
msgid "Passowrd successfully changed."
msgstr ""
msgstr "Passwort erfolgreich geändert."
#: src/routes/reset_password.js:126
#: src/routes/reset_password.js:134
msgid "Invalid url :( Please check your mail again."
msgstr ""
msgstr "Ungültige Adresse :( Bitte kontrolliere die Mail nochmal."
#: src/routes/reset_password.js:138
#: src/routes/reset_password.js:147
msgid ""
"This passwort reset link is wrong or already expired, please request a new "
"one (Note: you can use those links just once)"
msgstr ""
"Dieser Passwort Wiederherstellungslink ist falsch oder abgelaufen, bitte "
"beantrage einen neuen (Hinweis: Du kannst diese Links nur einmal verwenden)"
#: src/core/mail.js:65
#, javascript-format
@ -64,66 +74,79 @@ msgid ""
"We already sent you a verification mail, you can request another one in "
"${ minLeft } minutes."
msgstr ""
"Wir sendeten dir bereits eine Wiederherstellung Mail, du kannst die nächste "
"in ${ minLeft } minuten anfordern."
#: src/core/mail.js:75
msgid "Welcome ${ name } to PixelPlanet, plese verify your mail"
msgstr ""
"Willkommen ${ name } auf PixelPlnet, bitte verifiziere deine Mail Adresse"
#: src/core/mail.js:77
#, javascript-format
msgid "Hello ${ name }"
msgstr ""
msgstr "Hallo ${ name }"
#: src/core/mail.js:78
msgid ""
"welcome to our little community of pixelplacers, to use your account, you "
"have to verify your mail. You can do that here: "
msgstr ""
"wilkommen in unserer kleinen Gemeinschaft aus Pixel schubser, um dein Konto "
"zu verwenden musst du deine E-Mail Adresse verifizieren. Du kannst das hier "
"erledigen: "
#: src/core/mail.js:78
msgid "Click to Verify"
msgstr ""
msgstr "Klicke zum verifizieren"
#: src/core/mail.js:78 src/core/mail.js:128
msgid "Or by copying following url:"
msgstr ""
msgstr "Oder kopiere den folgenden Link:"
#: src/core/mail.js:79
msgid ""
"Have fun and don't hesitate to contact us if you encouter any problems :)"
msgstr ""
"Viel Spaß und scheue dich nicht uns zu kontaktieren wenn du Probleme hast :)"
#: src/core/mail.js:80 src/core/mail.js:130
msgid "Thanks"
msgstr ""
msgstr "Danke"
#: src/core/mail.js:98
msgid ""
"We already sent you a mail with instructions. Please wait before requesting "
"another mail."
msgstr ""
"Wir sendeten dir bereits eine E-Mail mit Instruktionen. Bitte warte bevor du "
"eine neue beantragts."
#: src/core/mail.js:106
msgid "Couldn't find this mail in our database"
msgstr ""
msgstr "Konnten diese E-Mail nicht in unserer Datenbank finden"
#: src/core/mail.js:125
msgid "You forgot your password for PixelPlanet? Get a new one here"
msgstr ""
"Du hast dein Passwort für PixelPlanet vergessen? Bekomme ein neues hier"
#: src/core/mail.js:127
msgid "Hello"
msgstr ""
msgstr "Hallo"
#: src/core/mail.js:128
msgid ""
"You requested to get a new password. You can change your password within the "
"next 30min here: "
msgstr ""
"Du hast ein neues Passwort beantragt. Du kannst es nun während der nächsten "
"30min hier ändern:"
#: src/core/mail.js:128
#: src/core/mail.js:128 src/ssr-components/PasswordReset.jsx:19
#: src/ssr-components/PasswordReset.jsx:28
msgid "Reset Password"
msgstr ""
msgstr "Passwort zurücksetzen"
#: src/core/mail.js:129
#, javascript-format
@ -131,107 +154,216 @@ msgid ""
"If you did not request this mail, please just ignore it (the ip that "
"requested this mail was ${ ip })."
msgstr ""
"Falls du diese Mail nicht beantragt hast, bitte ignoriere sie (die IP welche "
"diese Nachricht beantragt hat war ${ ip })."
#: src/utils/validation.js:15
msgid "Email can't be empty."
msgstr ""
#: src/ssr-components/PasswordReset.jsx:21
#: src/ssr-components/RedirectionPage.jsx:15
msgid "Click here"
msgstr "Klicke hier"
#: src/utils/validation.js:16
msgid "Email should be at least 5 characters long."
msgstr ""
#: src/ssr-components/PasswordReset.jsx:22
msgid "to go back to pixelplanet"
msgstr "um zu pixelplanet zurückzukehren"
#: src/utils/validation.js:17
msgid "Email can't be longer than 40 characters."
msgstr ""
#: src/ssr-components/PasswordReset.jsx:29
#, javascript-format
msgid "Hello ${ name }, you can set your new password here:"
msgstr "Hallo ${ name }, du kannst dein neues Passwort hier setzen:"
#: src/ssr-components/PasswordReset.jsx:33
msgid "New Password"
msgstr "Neues Passwort"
#: src/ssr-components/PasswordReset.jsx:41
msgid "Confirm New Password"
msgstr "Bestätige neues Passwort"
#: src/ssr-components/PasswordReset.jsx:47
msgid "Submit"
msgstr "Absenden"
#: src/ssr-components/PasswordReset.jsx:52
msgid "PixelPlanet.fun Password Reset"
msgstr "PixelPlanet.Fun Passwort Wiederherstellung"
#: src/ssr-components/PasswordReset.jsx:53
msgid "Reset your password here"
msgstr "Setze hier dein Passwort zurück"
#: src/utils/validation.js:18
msgid "Email should at least contain a dot"
msgstr ""
msgid "Email can't be empty."
msgstr "E-Mail Feld kann nicht leer sein."
#: src/utils/validation.js:19
msgid "Email should be at least 5 characters long."
msgstr "E-Mail sollte mindestens 5 Zeichen lang sein."
#: src/utils/validation.js:20
msgid "Email can't be longer than 40 characters."
msgstr "E-Mail kann nicht länger als 40 Zeichen sein."
#: src/utils/validation.js:21
msgid "Email should at least contain a dot"
msgstr "E-Mail sollte zumindest einen Punkt beinhalten"
#: src/utils/validation.js:23
msgid "Email should contain a @"
msgstr ""
msgstr "E-Mail sollte zumindest ein @ beinhalten"
#: src/utils/validation.js:27
#: src/utils/validation.js:30
msgid "Name can't be empty."
msgstr ""
msgstr "Name kann nicht leer sein."
#: src/utils/validation.js:28
#: src/utils/validation.js:31
msgid "Name must be at least 4 characters long"
msgstr ""
msgstr "Name muss mindestens 4 Zeichen lang sein"
#: src/utils/validation.js:29
#: src/utils/validation.js:32
msgid "Name must be shorter than 26 characters"
msgstr ""
msgstr "Name muss kürzer als 26 Zeichen sein"
#: src/utils/validation.js:36
#: src/utils/validation.js:39
msgid "Name contains invalid character like @, /, \\ or #"
msgstr ""
msgstr "Name beinhalted ungültige Zeichen wie @,/.\\ oder #"
#: src/utils/validation.js:51
#: src/utils/validation.js:54
msgid "No password given."
msgstr "Kein Passwort angegeben."
#: src/utils/validation.js:57
msgid "Password must be at least 6 characters long."
msgstr "Passwort muss mindestens 6 Zeichen lang sein."
#: src/utils/validation.js:54
#: src/utils/validation.js:60
msgid "Password must be shorter than 60 characters."
msgstr ""
#: src/utils/validation.js:68
msgid "Could not connect to server, please try again later :("
msgstr ""
msgstr "Passwort muss kürzer als 60 Zeichen sein"
#: src/utils/validation.js:74
msgid "Could not connect to server, please try again later :("
msgstr "Konnte nicht zum Server verbinden, bitte versuche es später erneut :("
#: src/utils/validation.js:80
msgid "I think we experienced some error :("
msgstr ""
msgstr "Ich glaube wir haben ein Problem :("
#: src/routes/api/auth/change_mail.js:41
#: src/routes/api/auth/change_passwd.js:37
#: src/routes/api/auth/delete_account.js:38
msgid "You are not authenticated."
msgstr ""
msgstr "Du bist nicht auhtentifiziert."
#: src/routes/api/auth/change_mail.js:50
#: src/routes/api/auth/change_passwd.js:46
#: src/routes/api/auth/delete_account.js:48
msgid "Incorrect password!"
msgstr "Falsches Passwort!"
#: src/routes/api/auth/logout.js:13
msgid "You are not even logged in."
msgstr "Du bist nichteinmal angemeldet."
#: src/routes/api/auth/verify.js:25 src/routes/api/auth/verify.js:32
msgid "Mail verification"
msgstr "E-Mail verifizieren"
#: src/routes/api/auth/verify.js:26
msgid "You are now verified :)"
msgstr "Du bist nun verifiziert :)"
#: src/routes/api/auth/verify.js:32
msgid ""
"Your mail verification code is invalid or already expired :(, please request "
"a new one."
msgstr ""
"Dein E-Mail verifikations Code ist ungültig oder bereits abgelaufen :(, "
"bitte fordere einen neuen an."
#: src/routes/api/auth/register.js:31
msgid "E-Mail already in use."
msgstr "E-Mail wird bereits verwendet."
#: src/routes/api/auth/register.js:33
msgid "Username already in use."
msgstr "Name wird bereits verwendet."
#: src/routes/api/auth/register.js:61
msgid "Failed to create new user :("
msgstr ""
msgstr "Konnte keinen neuen Benutzer erstellen :("
#: src/routes/api/auth/register.js:77
msgid "Failed to establish session after register :("
msgstr ""
msgstr "Konnte keine Sitzung nach registrierung starten :("
#: src/ssr-components/RedirectionPage.jsx:20
msgid "You will be automatically redirected after 15s"
msgstr "Du wirst automatisch weitergeleitet nach 15s"
#: src/ssr-components/RedirectionPage.jsx:21
#, javascript-format
msgid "Or ${ clickHere } to go back to pixelplanet"
msgstr "oder ${ clickHere } um zu pixelplanet zurückzukehren"
#: src/ssr-components/RedirectionPage.jsx:25
msgid "PixelPlanet.fun Accounts"
msgstr "PixelPlanet.Fun Konten"
#: src/canvasesDesc.js:19
msgid "Our main canvas, a huge map of the world. Place everywhere you like"
msgstr ""
"Unsere Hauptleinwand, eine große Weltkarte. Zeichnen ist überall möglich."
msgid "Earth"
msgstr "Erde"
#: src/canvasesDesc.js:20
msgid "Moon"
msgstr "Mond"
#: src/canvasesDesc.js:21
msgid "3D Canvas"
msgstr "3D Leinwand"
#: src/canvasesDesc.js:22
msgid "Coronavirus"
msgstr "Coronavirus"
#: src/canvasesDesc.js:23
msgid "PixelZone"
msgstr "PixelZone"
#: src/canvasesDesc.js:24
msgid "PixelCanvas"
msgstr "PixelCanvas"
#: src/canvasesDesc.js:25
msgid "1bit"
msgstr "1bit"
#: src/canvasesDesc.js:28
msgid "Our main canvas, a huge map of the world. Place everywhere you like"
msgstr ""
"Unsere Hauptleinwand, eine große Weltkarte. Zeichnen ist überall möglich"
#: src/canvasesDesc.js:29
msgid ""
"Moon canvas. Safe space for art. No flags or large text (unless part of art)"
msgstr ""
"Mond Leinwand. Kunst erwünscht. Keine Flaggen oder großer Text außer als "
"Teil von Kunst."
#: src/canvasesDesc.js:21
#: src/canvasesDesc.js:30
msgid "Place Voxels on a 3D canvas with others"
msgstr "Zeichne mit Voxeln in einer 3D Umgebung."
msgstr "Zeichne mit Voxeln in einer 3D Umgebung"
#: src/canvasesDesc.js:22
#: src/canvasesDesc.js:31
msgid "Special canvas to spread awareness of SARS-CoV2"
msgstr "Kleine Leinwand im SARS-CoV2 Thema"
#: src/canvasesDesc.js:23
#: src/canvasesDesc.js:32
msgid "Mirror of PixelZone"
msgstr "Kopie von PixelZone"
#: src/canvasesDesc.js:24
#: src/canvasesDesc.js:33
msgid "Mirror of PixelCanvas"
msgstr "Kopie von PixelCanvas"
#: src/canvasesDesc.js:25
#: src/canvasesDesc.js:34
msgid "Black and White canvas"
msgstr "Schwarz/Weiß Leinwand"

View File

@ -3,6 +3,14 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
#: src/ssr-components/Main.jsx:53
msgid "PixelPlanet.fun"
msgstr ""
#: src/ssr-components/Main.jsx:55
msgid "Place color pixels on an map styled canvas with other players online"
msgstr ""
#: src/ssr-components/Globe.jsx:44
msgid "Double click on globe to go back."
msgstr ""
@ -19,31 +27,31 @@ msgstr ""
msgid "A 3D globe of our whole map"
msgstr ""
#: src/routes/reset_password.js:63
#: src/routes/reset_password.js:65
msgid "You sent an empty password or invalid data :("
msgstr ""
#: src/routes/reset_password.js:74
#: src/routes/reset_password.js:77
msgid "This password-reset link isn't valid anymore :("
msgstr ""
#: src/routes/reset_password.js:84
#: src/routes/reset_password.js:88
msgid "Your passwords do not match :("
msgstr ""
#: src/routes/reset_password.js:98
#: src/routes/reset_password.js:103
msgid "User doesn't exist in our database :("
msgstr ""
#: src/routes/reset_password.js:109
#: src/routes/reset_password.js:115
msgid "Passowrd successfully changed."
msgstr ""
#: src/routes/reset_password.js:126
#: src/routes/reset_password.js:134
msgid "Invalid url :( Please check your mail again."
msgstr ""
#: src/routes/reset_password.js:138
#: src/routes/reset_password.js:147
msgid ""
"This passwort reset link is wrong or already expired, please request a new "
"one (Note: you can use those links just once)"
@ -114,6 +122,8 @@ msgid ""
msgstr ""
#: src/core/mail.js:128
#: src/ssr-components/PasswordReset.jsx:19
#: src/ssr-components/PasswordReset.jsx:28
msgid "Reset Password"
msgstr ""
@ -124,55 +134,93 @@ msgid ""
"requested this mail was ${ ip })."
msgstr ""
#: src/utils/validation.js:15
msgid "Email can't be empty."
#: src/ssr-components/PasswordReset.jsx:21
#: src/ssr-components/RedirectionPage.jsx:15
msgid "Click here"
msgstr ""
#: src/utils/validation.js:16
msgid "Email should be at least 5 characters long."
#: src/ssr-components/PasswordReset.jsx:22
msgid "to go back to pixelplanet"
msgstr ""
#: src/utils/validation.js:17
msgid "Email can't be longer than 40 characters."
#: src/ssr-components/PasswordReset.jsx:29
#, javascript-format
msgid "Hello ${ name }, you can set your new password here:"
msgstr ""
#: src/ssr-components/PasswordReset.jsx:33
msgid "New Password"
msgstr ""
#: src/ssr-components/PasswordReset.jsx:41
msgid "Confirm New Password"
msgstr ""
#: src/ssr-components/PasswordReset.jsx:47
msgid "Submit"
msgstr ""
#: src/ssr-components/PasswordReset.jsx:52
msgid "PixelPlanet.fun Password Reset"
msgstr ""
#: src/ssr-components/PasswordReset.jsx:53
msgid "Reset your password here"
msgstr ""
#: src/utils/validation.js:18
msgid "Email should at least contain a dot"
msgid "Email can't be empty."
msgstr ""
#: src/utils/validation.js:19
msgid "Email should be at least 5 characters long."
msgstr ""
#: src/utils/validation.js:20
msgid "Email can't be longer than 40 characters."
msgstr ""
#: src/utils/validation.js:21
msgid "Email should at least contain a dot"
msgstr ""
#: src/utils/validation.js:23
msgid "Email should contain a @"
msgstr ""
#: src/utils/validation.js:27
#: src/utils/validation.js:30
msgid "Name can't be empty."
msgstr ""
#: src/utils/validation.js:28
#: src/utils/validation.js:31
msgid "Name must be at least 4 characters long"
msgstr ""
#: src/utils/validation.js:29
#: src/utils/validation.js:32
msgid "Name must be shorter than 26 characters"
msgstr ""
#: src/utils/validation.js:36
#: src/utils/validation.js:39
msgid "Name contains invalid character like @, /, \\ or #"
msgstr ""
#: src/utils/validation.js:51
#: src/utils/validation.js:54
msgid "No password given."
msgstr ""
#: src/utils/validation.js:57
msgid "Password must be at least 6 characters long."
msgstr ""
#: src/utils/validation.js:54
#: src/utils/validation.js:60
msgid "Password must be shorter than 60 characters."
msgstr ""
#: src/utils/validation.js:68
#: src/utils/validation.js:74
msgid "Could not connect to server, please try again later :("
msgstr ""
#: src/utils/validation.js:74
#: src/utils/validation.js:80
msgid "I think we experienced some error :("
msgstr ""
@ -188,6 +236,33 @@ msgstr ""
msgid "Incorrect password!"
msgstr ""
#: src/routes/api/auth/logout.js:13
msgid "You are not even logged in."
msgstr ""
#: src/routes/api/auth/verify.js:25
#: src/routes/api/auth/verify.js:32
msgid "Mail verification"
msgstr ""
#: src/routes/api/auth/verify.js:26
msgid "You are now verified :)"
msgstr ""
#: src/routes/api/auth/verify.js:32
msgid ""
"Your mail verification code is invalid or already expired :(, please "
"request a new one."
msgstr ""
#: src/routes/api/auth/register.js:31
msgid "E-Mail already in use."
msgstr ""
#: src/routes/api/auth/register.js:33
msgid "Username already in use."
msgstr ""
#: src/routes/api/auth/register.js:61
msgid "Failed to create new user :("
msgstr ""
@ -196,30 +271,71 @@ msgstr ""
msgid "Failed to establish session after register :("
msgstr ""
#: src/ssr-components/RedirectionPage.jsx:20
msgid "You will be automatically redirected after 15s"
msgstr ""
#: src/ssr-components/RedirectionPage.jsx:21
#, javascript-format
msgid "Or ${ clickHere } to go back to pixelplanet"
msgstr ""
#: src/ssr-components/RedirectionPage.jsx:25
msgid "PixelPlanet.fun Accounts"
msgstr ""
#: src/canvasesDesc.js:19
msgid "Our main canvas, a huge map of the world. Place everywhere you like"
msgid "Earth"
msgstr ""
#: src/canvasesDesc.js:20
msgid "Moon canvas. Safe space for art. No flags or large text (unless part of art)"
msgid "Moon"
msgstr ""
#: src/canvasesDesc.js:21
msgid "Place Voxels on a 3D canvas with others"
msgid "3D Canvas"
msgstr ""
#: src/canvasesDesc.js:22
msgid "Special canvas to spread awareness of SARS-CoV2"
msgid "Coronavirus"
msgstr ""
#: src/canvasesDesc.js:23
msgid "Mirror of PixelZone"
msgid "PixelZone"
msgstr ""
#: src/canvasesDesc.js:24
msgid "Mirror of PixelCanvas"
msgid "PixelCanvas"
msgstr ""
#: src/canvasesDesc.js:25
msgid "1bit"
msgstr ""
#: src/canvasesDesc.js:28
msgid "Our main canvas, a huge map of the world. Place everywhere you like"
msgstr ""
#: src/canvasesDesc.js:29
msgid "Moon canvas. Safe space for art. No flags or large text (unless part of art)"
msgstr ""
#: src/canvasesDesc.js:30
msgid "Place Voxels on a 3D canvas with others"
msgstr ""
#: src/canvasesDesc.js:31
msgid "Special canvas to spread awareness of SARS-CoV2"
msgstr ""
#: src/canvasesDesc.js:32
msgid "Mirror of PixelZone"
msgstr ""
#: src/canvasesDesc.js:33
msgid "Mirror of PixelCanvas"
msgstr ""
#: src/canvasesDesc.js:34
msgid "Black and White canvas"
msgstr ""

View File

@ -128,7 +128,7 @@ msgid "User online"
msgstr ""
#: src/components/OnlineBox.jsx:25
msgid "Pixel gesetzt"
msgid "Pixels placed"
msgstr ""
#: src/components/Converter.jsx:609
@ -136,24 +136,6 @@ msgstr ""
msgid "Copy to Clipboard"
msgstr ""
#: src/components/DownloadButton.jsx:37
msgid "Make Screenshot"
msgstr ""
#: src/components/LogInButton.jsx:20
#: src/components/UserAreaModal.jsx:160
msgid "User Area"
msgstr ""
#: src/components/SettingsButton.jsx:20
#: src/components/SettingsModal.jsx:267
msgid "Settings"
msgstr ""
#: src/components/HelpButton.jsx:20
msgid "Help"
msgstr ""
#: src/components/Chat.jsx:143
msgid "Channel settings"
msgstr ""
@ -174,6 +156,24 @@ msgstr ""
msgid "You must be logged in to chat"
msgstr ""
#: src/components/DownloadButton.jsx:37
msgid "Make Screenshot"
msgstr ""
#: src/components/LogInButton.jsx:20
#: src/components/UserAreaModal.jsx:160
msgid "User Area"
msgstr ""
#: src/components/SettingsButton.jsx:20
#: src/components/SettingsModal.jsx:267
msgid "Settings"
msgstr ""
#: src/components/HelpButton.jsx:20
msgid "Help"
msgstr ""
#: src/components/GlobeButton.jsx:31
msgid "Globe View"
msgstr ""
@ -497,7 +497,7 @@ msgid "Login to access more features and stats."
msgstr ""
#: src/components/UserAreaModal.jsx:35
msgid "Login with Mail:"
msgid "Login with Name or Mail:"
msgstr ""
#: src/components/UserAreaModal.jsx:42
@ -600,14 +600,24 @@ msgstr ""
msgid "Archive"
msgstr ""
#: src/components/ChangeMail.jsx:104
#: src/components/ChangeName.jsx:82
#: src/components/ChangePassword.jsx:120
#: src/components/DeleteAccount.jsx:82
#: src/components/LogInForm.jsx:97
#: src/components/NewPasswordForm.jsx:93
#: src/components/SignUpForm.jsx:118
msgid "Error"
msgstr ""
#: src/components/LogInForm.jsx:104
msgid "Name or Email"
msgstr ""
#: src/components/ChangeMail.jsx:109
#: src/components/DeleteAccount.jsx:88
#: src/components/ChangeMail.jsx:112
#: src/components/DeleteAccount.jsx:89
#: src/components/LogInForm.jsx:111
#: src/components/SignUpForm.jsx:139
#: src/components/SignUpForm.jsx:140
msgid "Password"
msgstr ""
@ -615,6 +625,18 @@ msgstr ""
msgid "LogIn"
msgstr ""
#: src/components/Rankings.jsx:37
msgid "Total"
msgstr ""
#: src/components/Rankings.jsx:45
msgid "Daily"
msgstr ""
#: src/components/Rankings.jsx:49
msgid "Ranking updates every 5 min. Daily rankings get reset at midnight UTC."
msgstr ""
#: src/components/UserArea.jsx:57
msgid "Todays Placed Pixels"
msgstr ""
@ -660,16 +682,40 @@ msgstr ""
msgid "Social Settings"
msgstr ""
#: src/components/Rankings.jsx:37
msgid "Total"
#: src/components/SignUpForm.jsx:126
msgid "Name"
msgstr ""
#: src/components/Rankings.jsx:45
msgid "Daily"
#: src/components/NewPasswordForm.jsx:100
#: src/components/SignUpForm.jsx:133
msgid "Email"
msgstr ""
#: src/components/Rankings.jsx:49
msgid "Ranking updates every 5 min. Daily rankings get reset at midnight UTC."
#: src/components/SignUpForm.jsx:149
msgid "Confirm Password"
msgstr ""
#: src/components/Admintools.jsx:306
#: src/components/Admintools.jsx:387
#: src/components/Admintools.jsx:461
#: src/components/Admintools.jsx:505
#: src/components/Admintools.jsx:589
#: src/components/NewPasswordForm.jsx:104
#: src/components/SignUpForm.jsx:152
msgid "Submit"
msgstr ""
#: src/components/ChangeMail.jsx:125
#: src/components/ChangeName.jsx:94
#: src/components/ChangePassword.jsx:152
#: src/components/DeleteAccount.jsx:95
#: src/components/NewPasswordForm.jsx:106
#: src/components/SignUpForm.jsx:158
msgid "Cancel"
msgstr ""
#: src/components/NewPasswordForm.jsx:83
msgid "Sent you a mail with instructions to reset your password."
msgstr ""
#: src/components/CanvasItem.jsx:46
@ -701,108 +747,6 @@ msgstr ""
msgid "Dimensions"
msgstr ""
#: src/components/Admintools.jsx:179
msgid "Build image on canvas."
msgstr ""
#: src/components/Admintools.jsx:182
msgid "Build image and set it to protected."
msgstr ""
#: src/components/Admintools.jsx:185
msgid "Build image, but reset cooldown to unset-pixel cd."
msgstr ""
#: src/components/Admintools.jsx:248
msgid "Image Upload"
msgstr ""
#: src/components/Admintools.jsx:249
msgid "Upload images to canvas"
msgstr ""
#: src/components/Admintools.jsx:251
msgid "File"
msgstr ""
#: src/components/Admintools.jsx:271
msgid "Coordinates in X_Y format:"
msgstr ""
#: src/components/Admintools.jsx:306
#: src/components/Admintools.jsx:387
#: src/components/Admintools.jsx:461
#: src/components/Admintools.jsx:505
#: src/components/Admintools.jsx:589
#: src/components/SignUpForm.jsx:151
msgid "Submit"
msgstr ""
#: src/components/Admintools.jsx:311
msgid "Pixel Protection"
msgstr ""
#: src/components/Admintools.jsx:313
msgid ""
"Set protection of areas (if you need finer grained control, "
"use protect with image upload and alpha layers)"
msgstr ""
#: src/components/Admintools.jsx:392
msgid "Rollback to Date"
msgstr ""
#: src/components/Admintools.jsx:394
msgid "Rollback an area of the canvas to a set date (00:00 UTC)"
msgstr ""
#: src/components/Admintools.jsx:468
msgid "IP Actions"
msgstr ""
#: src/components/Admintools.jsx:470
msgid "Do stuff with IPs (one IP per line)"
msgstr ""
#: src/components/Admintools.jsx:510
msgid "Manage Moderators"
msgstr ""
#: src/components/Admintools.jsx:512
msgid "Remove Moderator"
msgstr ""
#: src/components/Admintools.jsx:544
msgid "There are no mods"
msgstr ""
#: src/components/Admintools.jsx:549
msgid "Assign new Mod"
msgstr ""
#: src/components/Admintools.jsx:552
msgid "Enter UserName of new Mod"
msgstr ""
#: src/components/SignUpForm.jsx:125
msgid "Name"
msgstr ""
#: src/components/SignUpForm.jsx:132
msgid "Email"
msgstr ""
#: src/components/SignUpForm.jsx:148
msgid "Confirm Password"
msgstr ""
#: src/components/ChangeMail.jsx:122
#: src/components/ChangePassword.jsx:151
#: src/components/DeleteAccount.jsx:94
#: src/components/SignUpForm.jsx:157
msgid "Cancel"
msgstr ""
#: src/components/Converter.jsx:274
msgid "Choose Canvas"
msgstr ""
@ -874,97 +818,144 @@ msgstr ""
msgid "Download Template"
msgstr ""
#: src/utils/validation.js:15
msgid "Email can't be empty."
#: src/components/Admintools.jsx:179
msgid "Build image on canvas."
msgstr ""
#: src/utils/validation.js:16
msgid "Email should be at least 5 characters long."
#: src/components/Admintools.jsx:182
msgid "Build image and set it to protected."
msgstr ""
#: src/utils/validation.js:17
msgid "Email can't be longer than 40 characters."
#: src/components/Admintools.jsx:185
msgid "Build image, but reset cooldown to unset-pixel cd."
msgstr ""
#: src/components/Admintools.jsx:248
msgid "Image Upload"
msgstr ""
#: src/components/Admintools.jsx:249
msgid "Upload images to canvas"
msgstr ""
#: src/components/Admintools.jsx:251
msgid "File"
msgstr ""
#: src/components/Admintools.jsx:271
msgid "Coordinates in X_Y format:"
msgstr ""
#: src/components/Admintools.jsx:311
msgid "Pixel Protection"
msgstr ""
#: src/components/Admintools.jsx:313
msgid ""
"Set protection of areas (if you need finer grained control, "
"use protect with image upload and alpha layers)"
msgstr ""
#: src/components/Admintools.jsx:392
msgid "Rollback to Date"
msgstr ""
#: src/components/Admintools.jsx:394
msgid "Rollback an area of the canvas to a set date (00:00 UTC)"
msgstr ""
#: src/components/Admintools.jsx:468
msgid "IP Actions"
msgstr ""
#: src/components/Admintools.jsx:470
msgid "Do stuff with IPs (one IP per line)"
msgstr ""
#: src/components/Admintools.jsx:510
msgid "Manage Moderators"
msgstr ""
#: src/components/Admintools.jsx:512
msgid "Remove Moderator"
msgstr ""
#: src/components/Admintools.jsx:544
msgid "There are no mods"
msgstr ""
#: src/components/Admintools.jsx:549
msgid "Assign new Mod"
msgstr ""
#: src/components/Admintools.jsx:552
msgid "Enter UserName of new Mod"
msgstr ""
#: src/components/Admintools.jsx:561
msgid "User Name"
msgstr ""
#: src/utils/validation.js:18
msgid "Email should at least contain a dot"
msgid "Email can't be empty."
msgstr ""
#: src/utils/validation.js:19
msgid "Email should be at least 5 characters long."
msgstr ""
#: src/utils/validation.js:20
msgid "Email can't be longer than 40 characters."
msgstr ""
#: src/utils/validation.js:21
msgid "Email should at least contain a dot"
msgstr ""
#: src/utils/validation.js:23
msgid "Email should contain a @"
msgstr ""
#: src/utils/validation.js:27
#: src/utils/validation.js:30
msgid "Name can't be empty."
msgstr ""
#: src/utils/validation.js:28
#: src/utils/validation.js:31
msgid "Name must be at least 4 characters long"
msgstr ""
#: src/utils/validation.js:29
#: src/utils/validation.js:32
msgid "Name must be shorter than 26 characters"
msgstr ""
#: src/utils/validation.js:36
#: src/utils/validation.js:39
msgid "Name contains invalid character like @, /, \\ or #"
msgstr ""
#: src/utils/validation.js:51
#: src/utils/validation.js:54
msgid "No password given."
msgstr ""
#: src/utils/validation.js:57
msgid "Password must be at least 6 characters long."
msgstr ""
#: src/utils/validation.js:54
#: src/utils/validation.js:60
msgid "Password must be shorter than 60 characters."
msgstr ""
#: src/utils/validation.js:68
#: src/utils/validation.js:74
msgid "Could not connect to server, please try again later :("
msgstr ""
#: src/utils/validation.js:74
#: src/utils/validation.js:80
msgid "I think we experienced some error :("
msgstr ""
#: src/components/DeleteAccount.jsx:92
#: src/components/DeleteAccount.jsx:93
msgid "Yes, Delete My Account!"
msgstr ""
#: src/components/ChangeMail.jsx:89
msgid ""
"Changed Mail successfully. We sent you a verification mail, "
"please verify your new mail adress."
msgstr ""
#: src/components/ChangeMail.jsx:116
msgid "New Mail"
msgstr ""
#: src/components/ChangeMail.jsx:120
#: src/components/ChangePassword.jsx:149
msgid "Save"
msgstr ""
#: src/components/ChangePassword.jsx:18
msgid "Passwords do not match."
msgstr ""
#: src/components/ChangePassword.jsx:103
msgid "Changed Password successfully."
msgstr ""
#: src/components/ChangePassword.jsx:128
msgid "Old Password"
msgstr ""
#: src/components/ChangePassword.jsx:136
msgid "New Password"
msgstr ""
#: src/components/ChangePassword.jsx:145
msgid "Confirm New Password"
msgstr ""
#: src/components/SocialSettings.jsx:39
msgid "Block all Private Messages"
msgstr ""
@ -977,6 +968,81 @@ msgstr ""
msgid "You have no users blocked"
msgstr ""
#: src/components/ChangeMail.jsx:89
msgid ""
"Changed Mail successfully. We sent you a verification mail, "
"please verify your new mail adress."
msgstr ""
#: src/components/ChangeMail.jsx:119
msgid "New Mail"
msgstr ""
#: src/components/ChangeMail.jsx:123
#: src/components/ChangeName.jsx:92
#: src/components/ChangePassword.jsx:150
msgid "Save"
msgstr ""
#: src/components/ChangePassword.jsx:18
msgid "Passwords do not match."
msgstr ""
#: src/components/ChangePassword.jsx:103
msgid "Changed Password successfully."
msgstr ""
#: src/components/ChangePassword.jsx:129
msgid "Old Password"
msgstr ""
#: src/components/ChangePassword.jsx:137
msgid "New Password"
msgstr ""
#: src/components/ChangePassword.jsx:146
msgid "Confirm New Password"
msgstr ""
#: src/components/ChangeName.jsx:88
msgid "New Username"
msgstr ""
#: src/components/UserMessages.jsx:41
msgid "A new verification mail is getting sent to you."
msgstr ""
#: src/components/UserMessages.jsx:75
msgid "You successfully linked your mc account."
msgstr ""
#: src/components/UserMessages.jsx:76
msgid "You denied."
msgstr ""
#: src/components/UserMessages.jsx:94
msgid ""
"Please verify your mail address \n"
"or your account could get deleted after a few days."
msgstr ""
#: src/components/UserMessages.jsx:111
msgid "Click here to request a new verification mail."
msgstr ""
#: src/components/UserMessages.jsx:120
#, javascript-format
msgid "You requested to link your mc account ${ minecraftname }."
msgstr ""
#: src/components/UserMessages.jsx:140
msgid "Accept"
msgstr ""
#: src/components/UserMessages.jsx:150
msgid "Deny"
msgstr ""
#: src/components/HelpModal.jsx:15
#: src/components/SettingsModal.jsx:125
msgctxt "keybinds"

View File

@ -44,7 +44,8 @@
"cds": 60000,
"ranked" : true,
"req": -1,
"sd": "2020-01-07"
"sd": "2020-01-07",
"desc": "Our main canvas, a huge map of the world. Place everywhere you like"
},
"1": {
"ident": "m",
@ -91,7 +92,8 @@
"cds": 900000,
"ranked" : true,
"req": 20000,
"sd": "2020-01-08"
"sd": "2020-01-08",
"desc": "Moon canvas. Safe space for art. No flags or large text (unless part of art)"
},
"2": {
"ident":"v",
@ -169,7 +171,8 @@
"cds": 60000,
"ranked" : false,
"req": 0,
"sd": "2020-01-08"
"sd": "2020-01-08",
"desc": "Place Voxels on a 3D canvas with others"
},
"3": {
"ident": "c",
@ -206,7 +209,8 @@
"cds": 60000,
"ranked" : false,
"req": 0,
"sd": "2020-03-15"
"sd": "2020-03-15",
"desc": "Special canvas to spread awareness of SARS-CoV2"
},
"5": {
"ident": "y",
@ -237,7 +241,8 @@
"cds": 4000,
"ranked": false,
"req": -1,
"sd": "2020-07-05"
"sd": "2020-07-05",
"desc": "Mirror of PixelZone"
},
"6": {
"ident": "z",
@ -268,7 +273,8 @@
"cds": 10000,
"ranked": false,
"req": -1,
"sd": "2020-07-05"
"sd": "2020-07-05",
"desc": "Mirror of PixelCanvas"
},
"7": {
"ident": "w",
@ -287,6 +293,7 @@
"cds": 1000000,
"ranked": true,
"req": 5000,
"sd": "2020-11-09"
"sd": "2020-11-09",
"desc": "Black and White canvas"
}
}

View File

@ -12,9 +12,18 @@ import ttag from './core/ttag';
function getCanvases(t) {
/*
* add descriptions of canvases here
* add descriptions and titles of canvases here
* Use the t tab and right `backquotes`
*/
const canvasTitles = {
0: t`Earth`,
1: t`Moon`,
2: t`3D Canvas`,
3: t`Coronavirus`,
5: t`PixelZone`,
6: t`PixelCanvas`,
7: t`1bit`,
};
const canvasDesc = {
0: t`Our main canvas, a huge map of the world. Place everywhere you like`,
1: t`Moon canvas. Safe space for art. No flags or large text (unless part of art)`,
@ -34,6 +43,7 @@ function getCanvases(t) {
for (let i = 0; i < canvasKeys.length; i += 1) {
const key = canvasKeys[i];
localicedCanvases[key].desc = canvasDesc[key] || `Canvas ${key}`;
localicedCanvases[key].title = canvasTitles[key] || `Canvas ${key}`;
}
return localicedCanvases;

View File

@ -558,7 +558,7 @@ function Admintools({
maxWidth: '20em',
}}
type="text"
placeholder="User Name"
placeholder={t`User Name`}
onChange={(evt) => {
const co = evt.target.value.trim();
selectModName(co);

View File

@ -100,7 +100,10 @@ class ChangeMail extends React.Component {
<div className="inarea">
<form onSubmit={this.handleSubmit}>
{errors.map((error) => (
<p key={error} className="errormessage">Error: {error}</p>
<p key={error} className="errormessage">
<span>{t`Error`}</span>:&nbsp;
{error}
</p>
))}
<input
value={password}

View File

@ -4,6 +4,7 @@
*/
import React from 'react';
import { t } from 'ttag';
import { validateName, parseAPIresponse } from '../utils/validation';
@ -77,19 +78,20 @@ class ChangeName extends React.Component {
<div className="inarea">
<form onSubmit={this.handleSubmit}>
{errors.map((error) => (
<p key={error} className="errormessage">Error: {error}</p>
<p key={error} className="errormessage">
<span>{t`Error`}</span>:&nbsp;{error}</p>
))}
<input
value={name}
onChange={(evt) => this.setState({ name: evt.target.value })}
type="text"
placeholder="New Username"
placeholder={t`New Username`}
/>
<br />
<button type="submit">
{(submitting) ? '...' : 'Save'}
{(submitting) ? '...' : t`Save`}
</button>
<button type="button" onClick={done}>Cancel</button>
<button type="button" onClick={done}>{t`Cancel`}</button>
</form>
</div>
);

View File

@ -117,7 +117,8 @@ class ChangePassword extends React.Component {
<div className="inarea">
<form onSubmit={this.handleSubmit}>
{errors.map((error) => (
<p key={error} className="errormessage">Error: {error}</p>
<p key={error} className="errormessage"><span>{t`Error`}</span>
:&nbsp;{error}</p>
))}
{(mailreg)
&& (

View File

@ -79,7 +79,8 @@ class DeleteAccount extends React.Component {
<div className="inarea" style={{ backgroundColor: '#ff6666' }}>
<form onSubmit={this.handleSubmit}>
{errors.map((error) => (
<p key={error} className="errormessage">Error: {error}</p>
<p key={error} className="errormessage"><span>{t`Error`}</span>
:&nbsp;{error}</p>
))}
<input
value={password}

View File

@ -18,10 +18,8 @@ function validate(nameoremail, password) {
? validateEMail(nameoremail)
: validateName(nameoremail);
if (mailerror) errors.push(mailerror);
/*
const passworderror = validatePassword(password);
if (passworderror) errors.push(passworderror);
*/
return errors;
}
@ -96,7 +94,7 @@ class LogInForm extends React.Component {
return (
<form onSubmit={this.handleSubmit}>
{errors.map((error) => (
<p key={error}>Error: {error}</p>
<p key={error}><span>{t`Error`}</span>:&nbsp;{error}</p>
))}
<input
value={nameoremail}

View File

@ -3,6 +3,7 @@
* @flow
*/
import React from 'react';
import { t } from 'ttag';
import { validateEMail, parseAPIresponse } from '../utils/validation';
function validate(email) {
@ -79,7 +80,7 @@ class NewPasswordForm extends React.Component {
return (
<div>
<p className="modalmessage">
Sent you a mail with instructions to reset your password.
{t`Sent you a mail with instructions to reset your password.`}
</p>
<button type="button" onClick={back}>Back</button>
</div>
@ -89,20 +90,20 @@ class NewPasswordForm extends React.Component {
return (
<form onSubmit={this.handleSubmit}>
{errors.map((error) => (
<p key={error}>Error: {error}</p>
<p key={error}><span>{t`Error`}</span>:&nbsp;{error}</p>
))}
<input
style={inputStyles}
value={email}
onChange={(evt) => this.setState({ email: evt.target.value })}
type="text"
placeholder="Email"
placeholder={t`Email`}
/>
<br />
<button type="submit">
{(submitting) ? '...' : 'Submit'}
{(submitting) ? '...' : t`Submit`}
</button>
<button type="button" onClick={back}>Cancel</button>
<button type="button" onClick={back}>{t`Cancel`}</button>
</form>
);
}

View File

@ -22,7 +22,7 @@ const OnlineBox = ({ online, totalPixels, name }) => (
&& <span title={t`User online`}>{online} <FaUser />&nbsp;</span>}
{(name != null)
&& (
<span title={t`Pixel gesetzt`}>
<span title={t`Pixels placed`}>
{numberToString(totalPixels)} <FaPaintBrush />
</span>
)}

View File

@ -115,7 +115,8 @@ class SignUpForm extends React.Component {
return (
<form onSubmit={this.handleSubmit}>
{errors.map((error) => (
<p key={error} className="errormessage">Error: {error}</p>
<p key={error} className="errormessage"><span>{t`Error`}</span>
:&nbsp;{error}</p>
))}
<input
style={inputStyles}

View File

@ -32,7 +32,7 @@ const LogInArea = ({ register, forgotPassword, me }) => (
<p className="modaltext">
{t`Login to access more features and stats.`}
</p><br />
<h2>{t`Login with Mail:`}</h2>
<h2>{t`Login with Name or Mail:`}</h2>
<LogInForm me={me} />
<p
className="modallink"

View File

@ -4,6 +4,7 @@
*/
import React from 'react';
import { connect } from 'react-redux';
import { t } from 'ttag';
import { parseAPIresponse } from '../utils/validation';
import { setMinecraftName, remFromMessages } from '../actions';
@ -37,7 +38,7 @@ class UserMessages extends React.Component {
const { errors } = await parseAPIresponse(response);
const verifyAnswer = (errors)
? errors[0]
: 'A new verification mail is getting sent to you.';
: t`A new verification mail is getting sent to you.`;
this.setState({
verifyAnswer,
});
@ -71,8 +72,8 @@ class UserMessages extends React.Component {
remFromUserMessages('not_mc_verified');
this.setState({
linkAnswer: (accepted)
? 'You successfully linked your mc account.'
: 'You denied.',
? t`You successfully linked your mc account.`
: t`You denied.`,
});
}
@ -90,8 +91,8 @@ class UserMessages extends React.Component {
&& messages.splice(messages.indexOf('not_verified'), 1))
? (
<p className="usermessages">
Please verify your mail address&nbsp;
or your account could get deleted after a few days.&nbsp;
{t`Please verify your mail address&nbsp;
or your account could get deleted after a few days.`}&nbsp;
{(verifyAnswer)
? (
<span
@ -107,7 +108,7 @@ class UserMessages extends React.Component {
className="modallink"
onClick={this.submitResendVerify}
>
Click here to request a new verification mail.
{t`Click here to request a new verification mail.`}
</span>
)}
</p>
@ -116,7 +117,7 @@ class UserMessages extends React.Component {
&& messages.splice(messages.indexOf('not_mc_verified'), 1))
? (
<p className="usermessages">
You requested to link your mc account {minecraftname}.
{t`You requested to link your mc account ${minecraftname}.`}
&nbsp;
{(linkAnswer)
? (
@ -136,7 +137,7 @@ class UserMessages extends React.Component {
this.submitMcLink(true);
}}
>
Accept
{t`Accept`}
</span>&nbsp;or&nbsp;
<span
role="button"
@ -146,7 +147,7 @@ class UserMessages extends React.Component {
this.submitMcLink(false);
}}
>
Deny
{t`Deny`}
</span>.
</span>
)}

View File

@ -3,22 +3,21 @@
* @flow
*/
import { TTag } from 'ttag';
import deLocale from '../../i18n/ssr-de.po';
import { languageFromLocalisation } from '../utils/location';
const LOCALES = {
de: deLocale,
};
// eslint-disable-next-line max-len
const localeImports = require.context('../../i18n', false, /^\.[/\\]ssr-.+\.po$/);
const ttags = {
default: new TTag(),
};
(() => {
const langs = Object.keys(LOCALES);
langs.forEach((lang) => {
localeImports.keys().forEach((file) => {
const ttag = new TTag();
ttag.addLocale(lang, LOCALES[lang]);
// ./ssr-de.po
const lang = file.replace('./ssr-', '').replace('.po', '');
ttag.addLocale(lang, localeImports(file).default);
ttag.useLocale(lang);
ttags[lang] = ttag;
});

View File

@ -16,7 +16,7 @@ function validate(email, password, gettext) {
const passerror = gettext(validatePassword(password));
if (passerror) errors.push(passerror);
const mailerror = validateEMail(email);
const mailerror = gettext(validateEMail(email));
if (mailerror) errors.push(mailerror);
return errors;

View File

@ -108,7 +108,10 @@ export default (passport) => {
if (err) {
const host = getHostFromRequest(req);
logger.info(`Authentification error ${err}`);
const index = getHtml('OAuth Authentification', err.message, host);
const index = getHtml(
'OAuth Authentification',
err.message, host, req.lang,
);
res.status(400).send(index);
} else {
next();

View File

@ -6,10 +6,11 @@ import type { Request, Response } from 'express';
export default async (req: Request, res: Response) => {
const { user } = req;
const { t } = req.ttag;
if (!user) {
res.status(401);
res.json({
errors: ['You are not even logged in.'],
errors: [t`You are not even logged in.`],
});
return;
}

View File

@ -18,9 +18,9 @@ import {
validatePassword,
} from '../../../utils/validation';
async function validate(email, name, password, gettext) {
async function validate(email, name, password, t, gettext) {
const errors = [];
const emailerror = validateEMail(email);
const emailerror = gettext(validateEMail(email));
if (emailerror) errors.push(emailerror);
const nameerror = validateName(name);
if (nameerror) errors.push(nameerror);
@ -28,9 +28,9 @@ async function validate(email, name, password, gettext) {
if (passworderror) errors.push(passworderror);
let reguser = await RegUser.findOne({ where: { email } });
if (reguser) errors.push('E-Mail already in use.');
if (reguser) errors.push(t`E-Mail already in use.`);
reguser = await RegUser.findOne({ where: { name } });
if (reguser) errors.push('Username already in use.');
if (reguser) errors.push(t`Username already in use.`);
return errors;
}
@ -38,7 +38,7 @@ async function validate(email, name, password, gettext) {
export default async (req: Request, res: Response) => {
const { email, name, password } = req.body;
const { t, gettext } = req.ttag;
const errors = await validate(email, name, password, gettext);
const errors = await validate(email, name, password, t, gettext);
if (errors.length > 0) {
res.status(400);
res.json({

View File

@ -10,9 +10,9 @@ import mailProvider from '../../../core/mail';
import { validateEMail } from '../../../utils/validation';
import { getHostFromRequest } from '../../../utils/ip';
async function validate(email) {
async function validate(email, gettext) {
const errors = [];
const emailerror = validateEMail(email);
const emailerror = gettext(validateEMail(email));
if (emailerror) errors.push(emailerror);
return errors;
@ -21,8 +21,9 @@ async function validate(email) {
export default async (req: Request, res: Response) => {
const ip = req.trueIp;
const { email } = req.body;
const { gettext } = req.ttag;
const errors = await validate(email);
const errors = validate(email, gettext);
if (errors.length > 0) {
res.status(400);
res.json({

View File

@ -12,6 +12,8 @@ import mailProvider from '../../../core/mail';
export default async (req: Request, res: Response) => {
const { token } = req.query;
const { lang } = req;
const { t } = req.ttag;
const name = await mailProvider.verify(token);
const host = getHostFromRequest(req);
if (name) {
@ -19,11 +21,15 @@ export default async (req: Request, res: Response) => {
// thats a bit counter productive because it directly links to the websocket
webSockets.notifyChangedMe(name);
// ---
const index = getHtml('Mail verification', 'You are now verified :)', host);
const index = getHtml(
t`Mail verification`,
t`You are now verified :)`,
host, lang,
);
res.status(200).send(index);
} else {
// eslint-disable-next-line max-len
const index = getHtml('Mail verification', 'Your mail verification code is invalid or already expired :(, please request a new one.', host);
const index = getHtml(t`Mail verification`, t`Your mail verification code is invalid or already expired :(, please request a new one.`, host, lang);
res.status(400).send(index);
}
};

View File

@ -54,12 +54,14 @@ router.use(expressTTag);
*/
router.post('/', async (req: Request, res: Response) => {
const { pass, passconf, code } = req.body;
const { lang } = req;
const { t } = req.ttag;
if (!pass || !passconf || !code) {
const html = getPasswordResetHtml(
null,
null,
lang,
t`You sent an empty password or invalid data :(`,
);
res.status(400).send(html);
@ -71,6 +73,7 @@ router.post('/', async (req: Request, res: Response) => {
const html = getPasswordResetHtml(
null,
null,
lang,
t`This password-reset link isn't valid anymore :(`,
);
res.status(401).send(html);
@ -81,6 +84,7 @@ router.post('/', async (req: Request, res: Response) => {
const html = getPasswordResetHtml(
null,
null,
lang,
t`Your passwords do not match :(`,
);
res.status(400).send(html);
@ -95,6 +99,7 @@ router.post('/', async (req: Request, res: Response) => {
const html = getPasswordResetHtml(
null,
null,
lang,
t`User doesn't exist in our database :(`,
);
res.status(400).send(html);
@ -106,6 +111,7 @@ router.post('/', async (req: Request, res: Response) => {
const html = getPasswordResetHtml(
null,
null,
lang,
t`Passowrd successfully changed.`,
);
res.status(200).send(html);
@ -117,12 +123,14 @@ router.post('/', async (req: Request, res: Response) => {
*/
router.get('/', async (req: Request, res: Response) => {
const { token } = req.query;
const { lang } = req;
const { t } = req.ttag;
if (!token) {
const html = getPasswordResetHtml(
null,
null,
lang,
t`Invalid url :( Please check your mail again.`,
);
res.status(400).send(html);
@ -134,6 +142,7 @@ router.get('/', async (req: Request, res: Response) => {
const html = getPasswordResetHtml(
null,
null,
lang,
// eslint-disable-next-line max-len
t`This passwort reset link is wrong or already expired, please request a new one (Note: you can use those links just once)`,
);

View File

@ -8,6 +8,7 @@
import React from 'react';
import ReactDOM from 'react-dom/server';
import { getTTag } from '../core/ttag';
import Html from './Html';
/* this one is set by webpack */
// eslint-disable-next-line import/no-unresolved
@ -45,12 +46,13 @@ function generateMainPage(countryCoords: Cell, lang: string): string {
const scripts = (assets[`client-${lang}`])
? assets[`client-${lang}`].js.map((s) => ASSET_SERVER + s)
: defaultScripts;
const { t } = getTTag(lang);
// eslint-disable-next-line
const html = ReactDOM.renderToStaticMarkup(
<Html
title="PixelPlanet.fun"
title={t`PixelPlanet.fun`}
// eslint-disable-next-line max-len
description="Place color pixels on an map styled canvas with other players online"
description={t`Place color pixels on an map styled canvas with other players online`}
scripts={scripts}
css={css}
code={`${code}window.coordx=${x};window.coordy=${y};`}

View File

@ -6,50 +6,57 @@ import React from 'react';
import ReactDOM from 'react-dom/server';
import Html from './Html';
const PasswordReset = ({ name, code }) => (
<form method="post" action="reset_password">
<h3>Reset Password</h3>
<p>Hello {name}, you can set your new password here:</p>
<input
type="password"
name="pass"
placeholder="New Password"
style={{
maxWidth: '35em',
}}
/>
<input
type="password"
name="passconf"
placeholder="Confirm New Password"
style={{
maxWidth: '35em',
}}
/>
<input type="hidden" name="code" value={code} />
<button type="submit" name="submit">Submit</button>
</form>
);
import { getTTag } from '../core/ttag';
const PasswordResetError = ({ message }) => (
<div>
<h3>Reset Password</h3>
<p>{message}</p>
<p><a href="./">Click here</a> to go back to pixelplanet</p>
</div>
);
export default function getPasswordResetHtml(name, code, lang, message = null) {
const { t } = getTTag(lang);
let body = '';
if (message) {
body = (
<div>
<h3>{t`Reset Password`}</h3>
<p>{message}</p>
<p><a href="./">{t`Click here`}</a>&nbsp;
{t`to go back to pixelplanet`}</p>
</div>
);
} else {
body = (
<form method="post" action="reset_password">
<h3>{t`Reset Password`}</h3>
<p>{t`Hello ${name}, you can set your new password here:`}</p>
<input
type="password"
name="pass"
placeholder={t`New Password`}
style={{
maxWidth: '35em',
}}
/>
<input
type="password"
name="passconf"
placeholder={t`Confirm New Password`}
style={{
maxWidth: '35em',
}}
/>
<input type="hidden" name="code" value={code} />
<button type="submit" name="submit">{t`Submit`}</button>
</form>
);
}
const title = t`PixelPlanet.fun Password Reset`;
const description = t`Reset your password here`;
export default function getPasswordResetHtml(name, code, message = null) {
const title = 'PixelPlanet.fun Password Reset';
const description = 'reset your password here';
const body = (message)
? <PasswordResetError message={message} />
: <PasswordReset name={name} code={code} />;
const index = `<!doctype html>${
ReactDOM.renderToStaticMarkup(<Html
title={title}
description={description}
body={body}
title={title}
description={description}
body={body}
/>)}`;
return index;
}

View File

@ -7,17 +7,22 @@ import React from 'react';
import ReactDOM from 'react-dom/server';
import Html from './Html';
const RedirectionPage = ({ text, host }) => (
<div>
<h3>{text}</h3>
<p>You will be automatically redirected after 15s</p>
<p>Or <a href={host}>Click here</a> to go back to pixelplanet</p>
</div>
);
import { getTTag } from '../core/ttag';
function getHtml(description, text, host) {
const title = 'PixelPlanet.fun Accounts';
const body = <RedirectionPage text={text} host={host} />;
function getHtml(description, text, host, lang) {
const { jt, t } = getTTag(lang);
const clickHere = <a href={host}>{t`Click here`}</a>;
const body = (
<div>
<h3>{text}</h3>
<p>{t`You will be automatically redirected after 15s`}</p>
<p>{jt`Or ${clickHere} to go back to pixelplanet`}</p>
</div>
);
const title = t`PixelPlanet.fun Accounts`;
// eslint-disable-next-line max-len
const code = `window.setTimeout(function(){window.location.href="${host}";},15000)`;

View File

@ -9,7 +9,7 @@
* @flow
*/
import { t } from 'ttag/dist/mock';
import { t } from 'ttag';
// eslint-disable-next-line no-useless-escape, max-len
const mailTester = /^[-!#$%&'*+\/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$/;