From b79d44ce4a7925a1de57ee86c470217acb149710 Mon Sep 17 00:00:00 2001
From: HF
Date: Wed, 5 Jan 2022 20:40:09 +0100
Subject: [PATCH] Add Top 10 only canvas
---
README.md | 35 +-
i18n/de.po | 574 ++++++++-------
i18n/ssr-de.po | 89 ++-
i18n/template-ssr.pot | 38 +-
i18n/template.pot | 1209 ++++++++++++++++++++++++++++++-
public/loading8.png | Bin 0 -> 1591 bytes
public/preview8.png | Bin 0 -> 6182 bytes
src/canvases.json | 81 ++-
src/canvasesDesc.js | 10 +-
src/components/CanvasItem.jsx | 27 +-
src/components/Converter.jsx | 10 +-
src/components/windows/Help.jsx | 15 +-
src/core/draw.js | 62 +-
src/core/ranking.js | 15 +-
src/data/models/RedisCanvas.js | 3 +-
src/data/models/prevDayTop.js | 30 +
src/reducers/canvas.js | 15 +-
src/ui/placePixel.js | 4 +
webpack.config.client.babel.js | 11 +-
19 files changed, 1794 insertions(+), 434 deletions(-)
create mode 100644 public/loading8.png
create mode 100644 public/preview8.png
create mode 100644 src/data/models/prevDayTop.js
diff --git a/README.md b/README.md
index 9ee82d8f..2ee209b1 100644
--- a/README.md
+++ b/README.md
@@ -124,28 +124,27 @@ Notes:
- The HTML for SocialMedia logins is in src/componets/UserAreaModal.js , delete stuff from there if you don't need it
- The HTML for the Help Screen is in src/components/HelpModal.js
-Canvas specific configuartion like colors and cooldown is in `canvases.json` for all canvases. The titles and descriptions of the canvases are also in `src/canvasesDesc.js` for translation reasons. Changing them requires a rebuild.
+Canvas specific configuartion like colors and cooldown is in `canvases.json` for all canvases. The titles and descriptions of the canvases are in `src/canvasesDesc.js` for translation reasons. Changing them requires a rebuild.
Meaning of some values:
-| Key | Description |
-|--------|:--------------------------------------------------|
-| ident | Unique character used in the url |
-| title | Title |
-| size | canvas size, power of 4 and between 256 and 65536 |
-| bcd | Base cooldown for unset pixels |
-| pcd | Cooldown for placing on set pixels |
-| cds | Stack time of Cooldown |
-| cli | Number of colors on the palette to ignore |
-| ranked | If pixels on canvas count on player statistic |
-| req | requieremt to place on the canvas |
-| sd | Start-date of the canvas for historical view |
-| desc | Small desctiption text |
-| v | If 3D voxel canvas (boolean) |
-| hid | Hidden canvases, can be just seen by pressing P |
+| Key | Description |
+|--------|:----------------------------------------------------------------|
+| ident | Unique character used in the url |
+| size | canvas size, power of 4 and between 256 and 65536 |
+| bcd | Base cooldown for unset pixels |
+| pcd | Cooldown for placing on set pixels (defaults to same as bcd) |
+| cds | Stack time of Cooldown |
+| cli | Number of leading colors on the palette to ignore (default: 0) |
+| ranked | If pixels on canvas count on player statistic (default: false) |
+| req | requieremt to place on the canvas |
+| sd | Start-date of the canvas for historical view |
+| v | If 3D voxel canvas (boolean) (default: false) |
+| hid | Hidden canvases, can be just seen by pressing P (default: false)|
+Values that have defaults and `req` are optional.
The canvas size limit can be surpassed by changing the websocket packages in src/socket/packages/ to send chunk coordinates in 16bit.
-req is an integer and if >0 is the amount of total pixels placed before being allowed to play there, if -1 it has no requirement and if 0 it is limited to registered users.
-The colors that are ignored via cli are used for making the canvas (blue ocean and white continents) and to know if the pixel is already set by a user or not.
+If `req` is 0, the canvas is only available for registered Useers. If it is a number >0 it is the amount of total pixels placed before a player is allowed to play there. If it is `top`, then it is only accessible for the Top10 players of the previous day.
+The colors that are ignored via `cli` are used for making the canvas (blue ocean and white continents) and to know if the pixel is already set by a user or not.
If you want to add a new canvas, be sure that you additionally create `public/loading${canvasId}.png`, `public/assets3d/normal${canvasId}.jpg`, `public/preview${canvasId}.png` and `public/assets3d/specular${canvasId}.jpg`, check out the existing ones to see what those files are for.
The default configuration values can be seen in `src/core/config.js` and for the canvases in `src/core/constats.js`
diff --git a/i18n/de.po b/i18n/de.po
index 6fe79b43..97d87859 100644
--- a/i18n/de.po
+++ b/i18n/de.po
@@ -10,46 +10,46 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals = 2; plural = (n != 1);\n"
-"X-Generator: Poedit 2.4.3\n"
+"X-Generator: Poedit 3.0.1\n"
-#: src/controls/keypress.js:39
+#: src/controls/keypress.js:41
#, javascript-format
msgid "Switched to ${ canvasName }"
msgstr "Gewechselt zu ${ canvasName }"
-#: src/controls/keypress.js:61
+#: src/controls/keypress.js:64
msgid "Grid ON"
msgstr "Raster Ein"
-#: src/controls/keypress.js:62
+#: src/controls/keypress.js:65
msgid "Grid OFF"
msgstr "Raster Aus"
-#: src/controls/keypress.js:70
+#: src/controls/keypress.js:75
msgid "Pixel Notify ON"
msgstr "Pixelaktivität Ein"
-#: src/controls/keypress.js:71
+#: src/controls/keypress.js:76
msgid "Pixel Notify OFF"
msgstr "Pixelaktivität Aus"
-#: src/controls/keypress.js:76
+#: src/controls/keypress.js:81
msgid "Muted Sound"
msgstr "Ton stummgeschaltet"
-#: src/controls/keypress.js:77
+#: src/controls/keypress.js:82
msgid "Unmuted Sound"
msgstr "Ton eingeschaltet"
-#: src/components/CoordinatesBox.jsx:29 src/controls/keypress.js:83
+#: src/components/CoordinatesBox.jsx:29 src/controls/keypress.js:88
msgid "Copied!"
msgstr "Kopiert!"
-#: src/controls/keypress.js:89
+#: src/controls/keypress.js:94
msgid "Show Hidden Canvases"
msgstr "Zeige versteckte Leinwände"
-#: src/controls/keypress.js:90
+#: src/controls/keypress.js:95
msgid "Hide Hidden Canvases"
msgstr "Verstecke geheime Leinwände"
@@ -63,7 +63,7 @@ msgstr ""
"Keine Antwort von pixelplanet erhalten. Vielleicht versuche die Seite neu zu "
"laden?"
-#: src/ui/placePixel.js:56 src/ui/placePixel.js:237 src/ui/placePixel.js:256
+#: src/ui/placePixel.js:56 src/ui/placePixel.js:237 src/ui/placePixel.js:260
msgid "OK"
msgstr "OK"
@@ -132,43 +132,63 @@ msgid "You are using a Proxy."
msgstr "Du benutzt ein Proxy."
#: src/ui/placePixel.js:246
+msgid "Not allowed"
+msgstr "Nicht erlaubt"
+
+#: src/ui/placePixel.js:247
+msgid "Just the Top10 of yesterday can place here"
+msgstr "Nur die Top10 Spieler von gestern dürfen hier spielen"
+
+#: src/ui/placePixel.js:250
msgid "Weird"
msgstr "Komisch"
-#: src/ui/placePixel.js:247
+#: src/ui/placePixel.js:251
msgid "Couldn't set Pixel"
msgstr "Konnte ein Pixel setzen"
-#: src/ui/placePixel.js:253
+#: src/ui/placePixel.js:257
#, javascript-format
msgid "Error ${ retCode }"
msgstr "Fehler ${ retCode }"
-#: src/actions/index.js:627
+#: src/ui/renderer.js:36
+msgid "Canvas Error"
+msgstr "Leinwand Fehler"
+
+#: src/ui/renderer.js:37
+msgid "Can't render 3D canvas, do you have WebGL2 disabled?"
+msgstr "Kann die 3D Leinwand nicht laden. Ist WebGL2 im Browser deaktiviert?"
+
+#: src/actions/index.js:632
msgid "Register New Account"
msgstr "Registriere neues Konto"
-#: src/actions/index.js:634
+#: src/actions/index.js:639
msgid "Restore my Password"
msgstr "Passwort wiederherstellen"
-#: src/actions/index.js:641
+#: src/actions/index.js:646
msgid "Welcome to PixelPlanet.fun"
msgstr "Willkommen auf PixelPlanet.fun"
-#: src/actions/index.js:647
+#: src/actions/index.js:652
msgid "Look at past Canvases"
msgstr "Zeige vergangene Leinwände"
-#: src/components/Converter.jsx:615 src/components/CoordinatesBox.jsx:32
+#: src/components/Converter.jsx:559 src/components/CoordinatesBox.jsx:32
msgid "Copy to Clipboard"
msgstr "Kopiere in die Zwischenablage"
-#: src/components/OnlineBox.jsx:30
-msgid "User online"
-msgstr "Spieler anwesend"
+#: src/components/OnlineBox.jsx:41
+msgid "Online Users on Canvas"
+msgstr "Spieler auf dieser Leinwand"
-#: src/components/OnlineBox.jsx:33
+#: src/components/OnlineBox.jsx:48
+msgid "Total Online Users"
+msgstr "Spieler insgesamt"
+
+#: src/components/OnlineBox.jsx:56
msgid "Pixels placed"
msgstr "Pixels gesetzt"
@@ -182,7 +202,34 @@ msgstr "Schließen"
msgid "Restore"
msgstr "Wiederherstellen"
-#: src/components/buttons/CanvasSwitchButton.jsx:23
+#: src/actions/fetch.js:39
+msgid "You made too many requests"
+msgstr "Zu viele Anfragen gesendet"
+
+#: src/actions/fetch.js:43
+#, javascript-format
+msgid "try again after ${ ti }min"
+msgstr "versuche es nach ${ ti }min nochmal"
+
+#: src/actions/fetch.js:54
+msgid "Connection error ${ code } :("
+msgstr "Verbindungsfehler ${ code } :("
+
+#: src/actions/fetch.js:79 src/actions/fetch.js:98
+msgid "Could not connect to server, please try again later :("
+msgstr ""
+"Kann nich zum Server verbinden, bitte versuche es später noch einmal :("
+
+#: src/actions/fetch.js:120 src/actions/fetch.js:139 src/actions/fetch.js:158
+#: src/actions/fetch.js:177
+msgid "Unknown Error"
+msgstr "Unbekannter Fehler"
+
+#: src/actions/fetch.js:187
+msgid "Server answered with gibberish :("
+msgstr "Server antwortete mit wirrwarr :("
+
+#: src/components/buttons/CanvasSwitchButton.jsx:22
#: src/components/windows/index.js:22
msgid "Canvas Selection"
msgstr "Leinwand auswahl"
@@ -203,32 +250,9 @@ msgstr "Schließe Menü"
msgid "Open Menu"
msgstr "Öffne Menü"
-#: src/actions/fetch.js:40
-msgid "You made too many requests"
-msgstr "Zu viele Anfragen gesendet"
-
-#: src/actions/fetch.js:44
-#, javascript-format
-msgid "try again after ${ ti }min"
-msgstr "versuche es nach ${ ti }min nochmal"
-
-#: src/actions/fetch.js:55
-msgid "Connection error ${ code } :("
-msgstr "Verbindungsfehler ${ code } :("
-
-#: src/actions/fetch.js:80 src/actions/fetch.js:99
-msgid "Could not connect to server, please try again later :("
-msgstr ""
-"Kann nich zum Server verbinden, bitte versuche es später noch einmal :("
-
-#: src/actions/fetch.js:121 src/actions/fetch.js:140 src/actions/fetch.js:159
-#: src/actions/fetch.js:178
-msgid "Unknown Error"
-msgstr "Unbekannter Fehler"
-
-#: src/actions/fetch.js:188
-msgid "Server answered with gibberish :("
-msgstr "Server antwortete mit wirrwarr :("
+#: src/components/buttons/HelpButton.jsx:23 src/components/windows/index.js:16
+msgid "Help"
+msgstr "Hilfe"
#: src/components/HistorySelect.jsx:144
msgid "Loading"
@@ -254,10 +278,6 @@ msgstr "Maximieren"
msgid "Resize"
msgstr "Größe ändern"
-#: src/components/buttons/HelpButton.jsx:23 src/components/windows/index.js:16
-msgid "Help"
-msgstr "Hilfe"
-
#: src/components/buttons/SettingsButton.jsx:23
#: src/components/windows/index.js:17
msgid "Settings"
@@ -283,10 +303,6 @@ msgstr "Schließe Palette"
msgid "Open Palette"
msgstr "Öffne Palette"
-#: src/components/contextmenus/ChannelContextMenu.jsx:55
-msgid "Mute"
-msgstr "Stummschalten"
-
#: src/components/contextmenus/UserContextMenu.jsx:53
msgid "Ping"
msgstr "Erwähnen"
@@ -299,6 +315,10 @@ msgstr "DM"
msgid "Block"
msgstr "Blocke"
+#: src/components/contextmenus/ChannelContextMenu.jsx:55
+msgid "Mute"
+msgstr "Stummschalten"
+
#: src/components/windows/index.js:19
msgid "Registration"
msgstr "Registrieren"
@@ -361,16 +381,16 @@ msgstr "Abbrechen"
msgid "Send"
msgstr "Senden"
-#: src/components/windows/Help.jsx:35
+#: src/components/windows/Help.jsx:36
msgid "your IP"
msgstr "deiner IP"
-#: src/components/windows/Help.jsx:41
+#: src/components/windows/Help.jsx:42
msgid "Place color pixels on a large canvas with other players online!"
msgstr ""
"Zeichne gemeinsam mit anderen Spielern auf einer großen Leinwand online!"
-#: src/components/windows/Help.jsx:42
+#: src/components/windows/Help.jsx:43
msgid ""
"Our main canvas is a huge worldmap, you can place wherever you like, but you "
"will have to wait a specific Cooldown between pixels. You can check out the "
@@ -388,7 +408,7 @@ msgstr ""
"warten muss, allerdings 7s wenn man über ein Pixel eines anderen Spielers "
"setzt."
-#: src/components/windows/Help.jsx:46
+#: src/components/windows/Help.jsx:47
msgid ""
"Higher zoomlevels take some time to update, the 3D globe gets updated at "
"least once per day."
@@ -396,23 +416,23 @@ msgstr ""
"Die höheren Zoomlevel brauchen etwas Zeit um aktualisiert zu werden, der 3D "
"Globus wird mindestens einmal pro tag neu geladen."
-#: src/components/windows/Help.jsx:47
+#: src/components/windows/Help.jsx:48
msgid "Have fun!"
msgstr "Viel Spaß!"
-#: src/components/windows/Help.jsx:49
+#: src/components/windows/Help.jsx:50
msgid "recommended"
msgstr "empfohlen"
-#: src/components/windows/Help.jsx:50
+#: src/components/windows/Help.jsx:51
msgid "Source on "
msgstr "Quelltext auf "
-#: src/components/windows/Help.jsx:51
+#: src/components/windows/Help.jsx:52
msgid "Map Data"
msgstr "Karten Dateien"
-#: src/components/windows/Help.jsx:52
+#: src/components/windows/Help.jsx:53
msgid ""
"The bare map data that we use, together with converted OpenStreetMap tiles "
"for orientation, can be downloaded from mega.nz here: "
@@ -421,11 +441,11 @@ msgstr ""
"OpenStreetMap Kacheln zur orientierung können auf mega.nz heruntergeladen "
"werden: "
-#: src/components/windows/Help.jsx:54
+#: src/components/windows/Help.jsx:55
msgid "Detected as Proxy?"
msgstr "Als Proxy erkannt?"
-#: src/components/windows/Help.jsx:56
+#: src/components/windows/Help.jsx:57
#, javascript-format
msgid ""
"If you got detected as proxy, but you are none, please go to our "
@@ -437,43 +457,43 @@ msgstr ""
"${ getIPLink } auf ${ mailLink }. Sende deine IP zu niemanden sonst. Wir "
"entschuldigen uns für die Unannehmlichkeiten."
-#: src/components/windows/Help.jsx:58 src/components/windows/Help.jsx:75
+#: src/components/windows/Help.jsx:59 src/components/windows/Help.jsx:76
msgid "Controls"
msgstr "Steuerung"
-#: src/components/windows/Help.jsx:60
+#: src/components/windows/Help.jsx:61
msgid "Click a color in palette to select it"
msgstr "Klicke auf eine Farbe in der Palette um sie auszuwählen"
-#: src/components/windows/Help.jsx:61
+#: src/components/windows/Help.jsx:62
#, javascript-format
msgid "Press ${ bindG } to toggle grid"
msgstr "Drücke ${ bindG } um das Raster ein- und auszuschalten"
-#: src/components/windows/Help.jsx:62
+#: src/components/windows/Help.jsx:63
msgid "Press ${ bindX } to toggle showing of pixel activity"
msgstr "Drücke ${ bindX } um Pixel Aktivität anzuzeigen"
-#: src/components/windows/Help.jsx:63
+#: src/components/windows/Help.jsx:64
#, javascript-format
msgid "Press ${ bindH } to toggle historical view"
msgstr "Drücke ${ bindH } um zur historischen Ansicht zu wechseln"
-#: src/components/windows/Help.jsx:64
+#: src/components/windows/Help.jsx:65
msgid "Press ${ bindR } to copy coordinates"
msgstr "Drücke ${ bindR } um aktuelle Koordinaten zu kopieren"
-#: src/components/windows/Help.jsx:65
+#: src/components/windows/Help.jsx:66
#, javascript-format
msgid "Press ${ bindQ } or ${ bindE } to zoom"
msgstr "Drücke ${ bindQ } oder ${ bindE } um zu zoomen"
-#: src/components/windows/Help.jsx:66 src/components/windows/Help.jsx:77
+#: src/components/windows/Help.jsx:67 src/components/windows/Help.jsx:78
#, javascript-format
msgid "Press ${ bindW }, ${ bindA }, ${ bindS }, ${ bindD } to move"
msgstr "Drücke ${ bindW }, ${ bindA }, ${ bindS }, ${ bindD } zum navigieren"
-#: src/components/windows/Help.jsx:67 src/components/windows/Help.jsx:78
+#: src/components/windows/Help.jsx:68 src/components/windows/Help.jsx:79
#, javascript-format
msgid ""
"Press ${ bindAUp }, ${ bindALeft }, ${ bindADown }, ${ bindARight } to move"
@@ -481,26 +501,26 @@ msgstr ""
"Drücke ${ bindAUp }, ${ bindALeft }, ${ bindADown }, ${ bindARight } zum "
"navigieren"
-#: src/components/windows/Help.jsx:68
+#: src/components/windows/Help.jsx:69
msgid "Drag ${ mouseSymbol } mouse or ${ touchSymbol } pan to move"
msgstr ""
"Ziehe mit der ${ mouseSymbol } Maus oder ${ touchSymbol } wische zum "
"navigieren"
-#: src/components/windows/Help.jsx:69
+#: src/components/windows/Help.jsx:70
#, javascript-format
msgid "Scroll ${ mouseSymbol } mouse wheel or ${ touchSymbol } pinch to zoom"
msgstr ""
"Scrolle ${ mouseSymbol } mit them Mausrad oder ${ touchSymbol } benutze Zwei-"
"Finger-Zoom um zu zoomen"
-#: src/components/windows/Help.jsx:70
+#: src/components/windows/Help.jsx:71
msgid "Hold left ${ bindShift } for placing while moving mouse"
msgstr ""
"Halte die linke ${ bindShift } Taste gedrückt um Pixel unter der Maus zu "
"setzen"
-#: src/components/windows/Help.jsx:71
+#: src/components/windows/Help.jsx:72
#, javascript-format
msgid ""
"Hold right ${ bindShift } for placing while moving mouse according to "
@@ -509,14 +529,14 @@ msgstr ""
"Halte die rechte ${ bindShift } Taste gedrückt um Pixel unter der Maus nach "
"der aktuellen historischen Ansicht zu setzen"
-#: src/components/windows/Help.jsx:72 src/components/windows/Help.jsx:83
+#: src/components/windows/Help.jsx:73 src/components/windows/Help.jsx:84
#, javascript-format
msgid "${ mouseSymbol } Left click or ${ touchSymbol } tap to place a pixel"
msgstr ""
"${ mouseSymbol } Linksklick oder ${ touchSymbol } tippe um ein Pixel zu "
"platzieren"
-#: src/components/windows/Help.jsx:73 src/components/windows/Help.jsx:85
+#: src/components/windows/Help.jsx:74 src/components/windows/Help.jsx:86
msgid ""
"Click ${ mouseSymbol } middle mouse button or ${ touchSymbol } long-tap to "
"select current hovering color"
@@ -524,17 +544,17 @@ msgstr ""
"Klicke ${ mouseSymbol } die mittlere Maustaste oder ${ touchSymbol } tippe "
"lange um eine Farbe von der Leinwand auszuwählen"
-#: src/components/windows/Help.jsx:79
+#: src/components/windows/Help.jsx:80
msgid "Press ${ bindE } and ${ bindC } to fly up and down"
msgstr "Drücke ${ bindE } oder ${ bindC } um hoch und runter zu fliegen"
-#: src/components/windows/Help.jsx:80
+#: src/components/windows/Help.jsx:81
#, javascript-format
msgid "${ mouseSymbol } Hold left mouse button and drag mouse to rotate"
msgstr ""
"${ mouseSymbol } Halte die linke Maustaste gedrückt und ziehe um zu rotieren"
-#: src/components/windows/Help.jsx:81
+#: src/components/windows/Help.jsx:82
#, javascript-format
msgid ""
"${ mouseSymbol } Scroll mouse wheel or hold ${ mouseSymbol } middle mouse "
@@ -543,13 +563,13 @@ msgstr ""
"${ mouseSymbol } Scrolle mit dem Mausrad oder halte ${ mouseSymbol } die "
"mittlere Maustaste gedrückt und ziehe um zu zoomen"
-#: src/components/windows/Help.jsx:82
+#: src/components/windows/Help.jsx:83
msgid "${ mouseSymbol } Right click and drag mouse to pan"
msgstr ""
"${ mouseSymbol } Halte die rechte Maustaste gedrückt und ziehe um dich zu "
"bewegen"
-#: src/components/windows/Help.jsx:84
+#: src/components/windows/Help.jsx:85
#, javascript-format
msgid ""
"${ mouseSymbol } Right click or ${ touchSymbol } double-tap to remove a pixel"
@@ -557,9 +577,22 @@ msgstr ""
"${ mouseSymbol } Rechtsklick oder ${ touchSymbol } tippe zweimal um ein "
"Voxel zu entfernen"
-#: src/components/windows/Help.jsx:87
-msgid "Partners:"
-msgstr "Partner:"
+#: src/components/windows/Help.jsx:90
+msgid ""
+"We thanks those artists very much, they offered their palettes to the public "
+"on"
+msgstr ""
+"Wir bedanken uns bei diesen Künstlern für ihre Paletten, welche sie der "
+"Öffentlichkeit zugänglich machten auf"
+
+#: src/components/windows/Help.jsx:93
+#, javascript-format
+msgid "Credit for the Palette of the Moon goes to ${ starhouseLink }."
+msgstr "Vielen Dank an ${ starhouseLink } für die Palette der Mond Leinwand."
+
+#: src/components/windows/Help.jsx:96
+msgid "Credit for the Palette of the Top10 canvas goes to ${ vinikLink }."
+msgstr "Vielen Dank an ${ vinikLink } für die Palette der Top10 Leinwand."
#: src/components/windows/Settings.jsx:133
msgid "Show Grid"
@@ -630,7 +663,7 @@ msgstr "Erdapfel Modus"
msgid "For when you are playing on a potato."
msgstr "Wenn du auf einer Kartoffel spielst."
-#: src/components/Converter.jsx:429 src/components/windows/Settings.jsx:195
+#: src/components/Converter.jsx:374 src/components/windows/Settings.jsx:195
msgid "Light Grid"
msgstr "Helles Raster"
@@ -709,14 +742,14 @@ msgid "Confirm Password"
msgstr "Passwort bestätigen"
#: src/components/Admintools.jsx:311 src/components/Admintools.jsx:392
-#: src/components/Admintools.jsx:466 src/components/Admintools.jsx:510
-#: src/components/Admintools.jsx:594
+#: src/components/Admintools.jsx:467 src/components/Admintools.jsx:512
+#: src/components/Admintools.jsx:595
#: src/components/windows/ForgotPassword.jsx:86
#: src/components/windows/Register.jsx:119
msgid "Submit"
msgstr "Absenden"
-#: src/components/windows/CanvasSelect.jsx:32
+#: src/components/windows/CanvasSelect.jsx:33
msgid ""
"Select the canvas you want to use. Every canvas is unique and has different "
"palettes, cooldown and requirements. Archive of closed canvases can be "
@@ -726,7 +759,7 @@ msgstr ""
"einzigartig und hat unterschiedliche Parletten, Abklingzeiten und "
"Vorraussetzungen. Archiv von vergangenen Leinwänden kann hier gesehen werden:"
-#: src/components/windows/CanvasSelect.jsx:40
+#: src/components/windows/CanvasSelect.jsx:41
msgid "Archive"
msgstr "Archiv"
@@ -777,14 +810,6 @@ msgstr ""
"kodiertes webm zu archivieren. Eine Bildschirmaufnahme aus dem Video ergibt "
"eine perfekte 1:1 Abbildung der Leinwand zu dieser Zeit."
-#: src/components/windows/ForgotPassword.jsx:60
-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/windows/ForgotPassword.jsx:71
-msgid "Enter your mail address and we will send you a new password:"
-msgstr "Gib deine Mail Adresse an und wir senden dir ein neues Passwort:"
-
#: src/components/windows/Chat.jsx:146
msgid "Channel settings"
msgstr "Kanal Einstellungen"
@@ -801,6 +826,14 @@ msgstr "Chatte hier"
msgid "You must be logged in to chat"
msgstr "Melde dich an um dich zu unterhalten"
+#: src/components/windows/ForgotPassword.jsx:60
+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/windows/ForgotPassword.jsx:71
+msgid "Enter your mail address and we will send you a new password:"
+msgstr "Gib deine Mail Adresse an und wir senden dir ein neues Passwort:"
+
#: src/utils/validation.js:18
msgid "Email can't be empty."
msgstr "Email Feld kann nicht leer sein."
@@ -878,101 +911,6 @@ msgstr "oder registriere dich hier:"
msgid "Register"
msgstr "Registrieren"
-#: src/components/Admintools.jsx:184
-msgid "Build image on canvas."
-msgstr "Zeiche Bild auf Leinwand."
-
-#: src/components/Admintools.jsx:187
-msgid "Build image and set it to protected."
-msgstr "Lade Bild und schütze es."
-
-#: src/components/Admintools.jsx:190
-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:253
-msgid "Image Upload"
-msgstr "Bild Hochladen"
-
-#: src/components/Admintools.jsx:254
-msgid "Upload images to canvas"
-msgstr "Lade ein Bild zur Leinwand hoch"
-
-#: src/components/Admintools.jsx:256
-msgid "File"
-msgstr "Datei"
-
-#: src/components/Admintools.jsx:276
-msgid "Coordinates in X_Y format:"
-msgstr "Koordinaten in X_Y Format:"
-
-#: src/components/Admintools.jsx:316
-msgid "Pixel Protection"
-msgstr "Pixel beschützen"
-
-#: src/components/Admintools.jsx:318
-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:397
-msgid "Rollback to Date"
-msgstr "Spule zum Datum zurück"
-
-#: src/components/Admintools.jsx:399
-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:473
-msgid "IP Actions"
-msgstr "IP Aktionen"
-
-#: src/components/Admintools.jsx:475
-msgid "Do stuff with IPs (one IP per line)"
-msgstr "Mache etwas mit IPs (eine IP pro Zeile)"
-
-#: src/components/Admintools.jsx:515
-msgid "Manage Moderators"
-msgstr "Verwalte Moderatoren"
-
-#: src/components/Admintools.jsx:517
-msgid "Remove Moderator"
-msgstr "Entferne Moderator"
-
-#: src/components/Admintools.jsx:549
-msgid "There are no mods"
-msgstr "Es gibt keine Moderatoren"
-
-#: src/components/Admintools.jsx:554
-msgid "Assign new Mod"
-msgstr "Moderator zuweisen"
-
-#: src/components/Admintools.jsx:557
-msgid "Enter UserName of new Mod"
-msgstr "Gebe Name des neuen Moderators ein"
-
-#: src/components/Admintools.jsx:566
-msgid "User Name"
-msgstr "Spielerbereich"
-
-#: src/components/Rankings.jsx:28
-msgid "Total"
-msgstr "Gesamt"
-
-#: src/components/Rankings.jsx:36
-msgid "Daily"
-msgstr "Täglich"
-
-#: src/components/Rankings.jsx:40
-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/UserAreaContent.jsx:63
msgid "Todays Placed Pixels"
msgstr "Heutige Pixel"
@@ -1018,102 +956,220 @@ msgstr "Lösche Konto"
msgid "Social Settings"
msgstr "Soziale Einstellungen"
-#: src/components/Converter.jsx:280
+#: src/components/Admintools.jsx:184
+msgid "Build image on canvas."
+msgstr "Zeiche Bild auf Leinwand."
+
+#: src/components/Admintools.jsx:187
+msgid "Build image and set it to protected."
+msgstr "Lade Bild und schütze es."
+
+#: src/components/Admintools.jsx:190
+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:253
+msgid "Image Upload"
+msgstr "Bild Hochladen"
+
+#: src/components/Admintools.jsx:254
+msgid "Upload images to canvas"
+msgstr "Lade ein Bild zur Leinwand hoch"
+
+#: src/components/Admintools.jsx:256
+msgid "File"
+msgstr "Datei"
+
+#: src/components/Admintools.jsx:276
+msgid "Coordinates in X_Y format:"
+msgstr "Koordinaten in X_Y Format:"
+
+#: src/components/Admintools.jsx:316
+msgid "Pixel Protection"
+msgstr "Pixel beschützen"
+
+#: src/components/Admintools.jsx:318
+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:398
+msgid "Rollback to Date"
+msgstr "Spule zum Datum zurück"
+
+#: src/components/Admintools.jsx:400
+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:475
+msgid "IP Actions"
+msgstr "IP Aktionen"
+
+#: src/components/Admintools.jsx:477
+msgid "Do stuff with IPs (one IP per line)"
+msgstr "Mache etwas mit IPs (eine IP pro Zeile)"
+
+#: src/components/Admintools.jsx:516
+msgid "Manage Moderators"
+msgstr "Verwalte Moderatoren"
+
+#: src/components/Admintools.jsx:518
+msgid "Remove Moderator"
+msgstr "Entferne Moderator"
+
+#: src/components/Admintools.jsx:550
+msgid "There are no mods"
+msgstr "Es gibt keine Moderatoren"
+
+#: src/components/Admintools.jsx:555
+msgid "Assign new Mod"
+msgstr "Moderator zuweisen"
+
+#: src/components/Admintools.jsx:558
+msgid "Enter UserName of new Mod"
+msgstr "Gebe Name des neuen Moderators ein"
+
+#: src/components/Admintools.jsx:567
+msgid "User Name"
+msgstr "Spielerbereich"
+
+#: src/components/Rankings.jsx:28
+msgid "Total"
+msgstr "Gesamt"
+
+#: src/components/Rankings.jsx:36
+msgid "Daily"
+msgstr "Täglich"
+
+#: src/components/Rankings.jsx:40
+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/Converter.jsx:190
msgid "Choose Canvas"
msgstr "Wähle Leinwand"
-#: src/components/Converter.jsx:306
+#: src/components/Converter.jsx:216
msgid "Palette Download"
msgstr "Palette herunterladen"
-#: src/components/Converter.jsx:308
+#: src/components/Converter.jsx:218
#, javascript-format
msgid "Palette for ${ gimpLink }"
msgstr "Palette für ${ gimpLink }"
-#: src/components/Converter.jsx:326
-#, javascript-format
-msgid "Credit for the Palette of the Moon goes to ${ starhouseLink }."
-msgstr "Vielen Dank an ${ starhouseLink } für die Palette der Mond Leinwand."
-
-#: src/components/Converter.jsx:329
+#: src/components/Converter.jsx:236
msgid "Image Converter"
msgstr "Bild Konverter"
-#: src/components/Converter.jsx:330
+#: src/components/Converter.jsx:237
msgid "Convert an image to canvas colors"
msgstr "Konvertiere ein Bild zu Leinwand Farben"
-#: src/components/Converter.jsx:341
+#: src/components/Converter.jsx:256
msgid "Choose Strategy"
msgstr "Wähle Strategie"
-#: src/components/Converter.jsx:368
+#: src/components/Converter.jsx:293
+msgid "Serpentine"
+msgstr "Serpentine"
+
+#: src/components/Converter.jsx:295
+msgid "Minimum Color Distance"
+msgstr "Minimum Farb Distanz"
+
+#: src/components/Converter.jsx:322
+msgid "Calculate like GIMP"
+msgstr "Berechne wie GIMP"
+
+#: src/components/Converter.jsx:326
msgid "Choose Color Mode"
msgstr "Wähle Farb Modus"
-#: src/components/Converter.jsx:406
+#: src/components/Converter.jsx:354
msgid "Add Grid (uncheck if you need a 1:1 template)"
msgstr "Zeichne Raster (deaktiviere falls du eine 1:1 Vorlage benötigst)"
-#: src/components/Converter.jsx:431 src/components/Converter.jsx:447
+#: src/components/Converter.jsx:376 src/components/Converter.jsx:392
msgid "Offset"
msgstr "Abweichung"
-#: src/components/Converter.jsx:477
+#: src/components/Converter.jsx:421
msgid "Scale Image"
msgstr "Skaliere Bild"
-#: src/components/Converter.jsx:489
+#: src/components/Converter.jsx:432
msgid "Width"
msgstr "Breite"
-#: src/components/Converter.jsx:519
+#: src/components/Converter.jsx:463
msgid "Height"
msgstr "Höhe"
-#: src/components/Converter.jsx:557
+#: src/components/Converter.jsx:502
msgid "Keep Ratio"
msgstr "Seitenverhältniss beibehalten"
-#: src/components/Converter.jsx:570
+#: src/components/Converter.jsx:515
msgid "Anti Aliasing"
msgstr "Kantenglättung"
-#: src/components/Converter.jsx:584
+#: src/components/Converter.jsx:529
msgid "Reset"
msgstr "Zurücksetzen"
-#: src/components/Converter.jsx:603
+#: src/components/Converter.jsx:547
msgid "Download Template"
msgstr "Bild herunterladen"
-#: src/components/CanvasItem.jsx:27
+#: src/components/CanvasItem.jsx:30
+msgid "Online Users"
+msgstr "Spieler online"
+
+#: src/components/CanvasItem.jsx:35
msgid "Cooldown"
msgstr "Abklingzeit"
-#: src/components/CanvasItem.jsx:33
+#: src/components/CanvasItem.jsx:41
msgid "Stacking till"
msgstr "Gesamtzeit"
-#: src/components/CanvasItem.jsx:35
+#: src/components/CanvasItem.jsx:43
msgid "Ranked"
msgstr "Gewertet"
-#: src/components/CanvasItem.jsx:37
+#: src/components/CanvasItem.jsx:45
+msgid "Yes"
+msgstr "Ja"
+
+#: src/components/CanvasItem.jsx:45
+msgid "No"
+msgstr "Nein"
+
+#: src/components/CanvasItem.jsx:51
msgid "Requirements"
msgstr "Vorraussetzungen"
-#: src/components/CanvasItem.jsx:39
+#: src/components/CanvasItem.jsx:54
msgid "User Account"
msgstr "Konto"
-#: src/components/CanvasItem.jsx:41
+#: src/components/CanvasItem.jsx:56
#, javascript-format
msgid "and ${ canvas.req } Pixels set"
msgstr "und ${ canvas.req } gesetzte Pixel"
-#: src/components/CanvasItem.jsx:45
+#: src/components/CanvasItem.jsx:59
+msgid "Top 10 Daily Ranking"
+msgstr "Top 10 Platzierung am Vortag"
+
+#: src/components/CanvasItem.jsx:65
msgid "Dimensions"
msgstr "Dimensionen"
@@ -1125,22 +1181,6 @@ msgstr "Name oder Email"
msgid "LogIn"
msgstr "Einloggen"
-#: src/components/UserMessages.jsx:28
-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:49
-msgid "A new verification mail is getting sent to you."
-msgstr "Eine neue Bestätigungsmail wurde gesendet."
-
-#: src/components/UserMessages.jsx:53
-msgid "Click here to request a new verification mail."
-msgstr "Klicke hier um eine neue Bestätigungsmail zu beantragen."
-
#: src/components/ChangePassword.jsx:22
msgid "Passwords do not match."
msgstr "Passwörter stimmen nicht überein."
@@ -1161,6 +1201,22 @@ msgstr "Neues Passwort"
msgid "Confirm New Password"
msgstr "Neues Passwort bestätigen"
+#: src/components/UserMessages.jsx:28
+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:49
+msgid "A new verification mail is getting sent to you."
+msgstr "Eine neue Bestätigungsmail wurde gesendet."
+
+#: src/components/UserMessages.jsx:53
+msgid "Click here to request a new verification mail."
+msgstr "Klicke hier um eine neue Bestätigungsmail zu beantragen."
+
#: src/components/ChangeName.jsx:64
msgid "New Username"
msgstr "Neuer Name"
@@ -1193,62 +1249,62 @@ msgstr "Entblocke Spieler"
msgid "You have no users blocked"
msgstr "Du hast keinen Spieler geblockt"
-#: src/components/windows/Help.jsx:15 src/components/windows/Settings.jsx:134
+#: src/components/windows/Help.jsx:14 src/components/windows/Settings.jsx:134
msgctxt "keybinds"
msgid "G"
msgstr "G"
-#: src/components/windows/Help.jsx:16 src/components/windows/Settings.jsx:142
+#: src/components/windows/Help.jsx:15 src/components/windows/Settings.jsx:142
msgctxt "keybinds"
msgid "X"
msgstr "X"
-#: src/components/windows/Help.jsx:17 src/components/windows/Settings.jsx:205
+#: src/components/windows/Help.jsx:16 src/components/windows/Settings.jsx:205
msgctxt "keybinds"
msgid "H"
msgstr "H"
-#: src/components/windows/Help.jsx:18
+#: src/components/windows/Help.jsx:17
msgctxt "keybinds"
msgid "R"
msgstr "R"
-#: src/components/windows/Help.jsx:19
+#: src/components/windows/Help.jsx:18
msgctxt "keybinds"
msgid "Q"
msgstr "Q"
-#: src/components/windows/Help.jsx:20
+#: src/components/windows/Help.jsx:19
msgctxt "keybinds"
msgid "E"
msgstr "E"
-#: src/components/windows/Help.jsx:21
+#: src/components/windows/Help.jsx:20
msgctxt "keybinds"
msgid "W"
msgstr "W"
-#: src/components/windows/Help.jsx:22
+#: src/components/windows/Help.jsx:21
msgctxt "keybinds"
msgid "A"
msgstr "A"
-#: src/components/windows/Help.jsx:23
+#: src/components/windows/Help.jsx:22
msgctxt "keybinds"
msgid "S"
msgstr "S"
-#: src/components/windows/Help.jsx:24
+#: src/components/windows/Help.jsx:23
msgctxt "keybinds"
msgid "D"
msgstr "D"
-#: src/components/windows/Help.jsx:31
+#: src/components/windows/Help.jsx:30
msgctxt "keybinds"
msgid "Shift"
msgstr "Shift"
-#: src/components/windows/Help.jsx:32
+#: src/components/windows/Help.jsx:31
msgctxt "keybinds"
msgid "C"
msgstr "C"
@@ -1258,6 +1314,12 @@ msgctxt "keybinds"
msgid "M"
msgstr "M"
+#~ msgid "Partners:"
+#~ msgstr "Partner:"
+
+#~ msgid "User online"
+#~ msgstr "Spieler anwesend"
+
#~ msgid "You successfully linked your mc account."
#~ msgstr "Minecraft Konto wurde erfolgreich verknüpft."
diff --git a/i18n/ssr-de.po b/i18n/ssr-de.po
index c6d228f2..4c2a3299 100644
--- a/i18n/ssr-de.po
+++ b/i18n/ssr-de.po
@@ -10,61 +10,57 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals = 2; plural = (n != 1);\n"
-"X-Generator: Poedit 2.4.3\n"
+"X-Generator: Poedit 3.0.1\n"
-#: src/core/ChatProvider.js:287
+#: src/core/ChatProvider.js:327
msgid "You can not send chat messages with proxy"
msgstr "Du kannst keine Nachrichten senden wenn du ein Proxy benutzt"
-#: src/core/ChatProvider.js:292
-msgid "Couldn't send your message, pls log out and back in again."
-msgstr "Konnte die Nachricht nicht senden, bitte logge duch aus und wieder an."
-
-#: src/core/ChatProvider.js:306
+#: src/core/ChatProvider.js:341
#, javascript-format
msgid "You are sending messages too fast, you have to wait ${ waitTime }s :("
msgstr "Du sendest zu viele Nachrichten, du musst ${ waitTime }s warten :("
-#: src/core/ChatProvider.js:310
+#: src/core/ChatProvider.js:345
msgid "You don't have access to this channel"
msgstr "Du hast keinen Zugriff zu diesen Kanal"
-#: src/core/ChatProvider.js:326
+#: src/core/ChatProvider.js:361
msgid "Your mail has to be verified in order to chat"
msgstr "E-Mail muss verifiziert sein um Nachrichten zu senden"
-#: src/core/ChatProvider.js:331
+#: src/core/ChatProvider.js:366
msgid "You are permanently muted, join our guilded to apppeal the mute"
msgstr ""
"Du bsit permanent stummgeschaltet, gehe zu unser guilded um dagegen "
"einzusprechen"
-#: src/core/ChatProvider.js:336
+#: src/core/ChatProvider.js:371
#, javascript-format
msgid "You are muted for another ${ timeMin } minutes"
msgstr "Du bist für ${ timeMin } Minuten stummgeschaltet"
-#: src/core/ChatProvider.js:338
+#: src/core/ChatProvider.js:373
msgid "You are muted for another ${ muted } seconds"
msgstr "Du bist for ${ muted } Sekunden stummgeschaltet"
-#: src/core/ChatProvider.js:346
+#: src/core/ChatProvider.js:381
msgid "Ow no! Spam protection decided to mute you"
msgstr "Oh nein! Spam-Schutz hat dich stummgeschaltet"
-#: src/core/ChatProvider.js:357
+#: src/core/ChatProvider.js:392
msgid "You can't send a message this long :("
msgstr "Do kannst keine so langen Nachrichten senden"
-#: src/core/ChatProvider.js:361
+#: src/core/ChatProvider.js:396
msgid "Please use int channel"
msgstr "Bitte benutze int Kanal"
-#: src/core/ChatProvider.js:365
+#: src/core/ChatProvider.js:400
msgid "Your country is temporary muted from chat"
msgstr "Dein Land ist temporär stummgeschaltet"
-#: src/core/ChatProvider.js:373
+#: src/core/ChatProvider.js:408
msgid "Stop flooding."
msgstr "Stoppe zu spamen."
@@ -84,39 +80,39 @@ msgstr "PixelPlanet.Fun 3D Globus"
msgid "A 3D globe of our whole map"
msgstr "Ein interaktvier 3D Globus unserer gesamten Karte"
-#: src/ssr-components/Main.jsx:73
+#: src/ssr-components/Main.jsx:70
msgid "PixelPlanet.fun"
msgstr "PixelPlanet.Fun"
-#: src/ssr-components/Main.jsx:75
+#: src/ssr-components/Main.jsx:72
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/routes/reset_password.js:58
+#: src/routes/reset_password.js:41
msgid "You sent an empty password or invalid data :("
msgstr "Du hast ein ungültiges Passwort oder Daten gesendet :("
-#: src/routes/reset_password.js:70
+#: src/routes/reset_password.js:53
msgid "This password-reset link isn't valid anymore :("
msgstr "Dieser Passwort-Wiederherstellungslink ist nichtmehr gültig :("
-#: src/routes/reset_password.js:81
+#: src/routes/reset_password.js:64
msgid "Your passwords do not match :("
msgstr "Passwörter stimmen nicht überein :("
-#: src/routes/reset_password.js:96
+#: src/routes/reset_password.js:79
msgid "User doesn't exist in our database :("
msgstr "Spieler existiert nicht in unserer Datenbank :("
-#: src/routes/reset_password.js:108
+#: src/routes/reset_password.js:91
msgid "Passowrd successfully changed."
msgstr "Passwort erfolgreich geändert."
-#: src/routes/reset_password.js:127
+#: src/routes/reset_password.js:110
msgid "Invalid url :( Please check your mail again."
msgstr "Ungültige Adresse :( Bitte kontrolliere die Mail nochmal."
-#: src/routes/reset_password.js:140
+#: src/routes/reset_password.js:123
msgid ""
"This passwort reset link is wrong or already expired, please request a new "
"one (Note: you can use those links just once)"
@@ -331,10 +327,6 @@ msgstr "Konnte keinen neuen Benutzer erstellen :("
msgid "Failed to establish session after register :("
msgstr "Konnte keine Sitzung nach registrierung starten :("
-#: 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"
@@ -351,6 +343,10 @@ msgstr ""
"Dein E-Mail verifikations Code ist ungültig oder bereits abgelaufen :(, "
"bitte fordere einen neuen an."
+#: src/routes/api/auth/logout.js:13
+msgid "You are not even logged in."
+msgstr "Du bist nichteinmal angemeldet."
+
#: src/routes/api/auth/change_mail.js:41
#: src/routes/api/auth/change_passwd.js:37
#: src/routes/api/auth/delete_account.js:38
@@ -376,34 +372,38 @@ msgstr "Oder ${ clickHere } um zu pixelplanet zurückzukehren"
msgid "PixelPlanet.fun Accounts"
msgstr "PixelPlanet.Fun Konten"
-#: src/canvasesDesc.js:19
+#: src/canvasesDesc.js:18
msgid "Earth"
msgstr "Erde"
-#: src/canvasesDesc.js:20
+#: src/canvasesDesc.js:19
msgid "Moon"
msgstr "Mond"
-#: src/canvasesDesc.js:21
+#: src/canvasesDesc.js:20
msgid "3D Canvas"
msgstr "3D Leinwand"
-#: src/canvasesDesc.js:22
+#: src/canvasesDesc.js:21
msgid "Coronavirus"
msgstr "Coronavirus"
-#: src/canvasesDesc.js:23
+#: src/canvasesDesc.js:22
msgid "PixelZone"
msgstr "PixelZone"
-#: src/canvasesDesc.js:24
+#: src/canvasesDesc.js:23
msgid "PixelCanvas"
msgstr "PixelCanvas"
-#: src/canvasesDesc.js:25
+#: src/canvasesDesc.js:24
msgid "1bit"
msgstr "1bit"
+#: src/canvasesDesc.js:25
+msgid "Top10"
+msgstr "Top10"
+
#: src/canvasesDesc.js:28
msgid "Our main canvas, a huge map of the world. Place everywhere you like"
msgstr ""
@@ -437,6 +437,21 @@ msgstr "Kopie von PixelCanvas"
msgid "Black and White canvas"
msgstr "Schwarz/Weiß Leinwand"
+#: src/canvasesDesc.js:35
+msgid ""
+"A canvas for the most active players from the the previous day. Daily "
+"ranking updates at 00:00 UTC."
+msgstr ""
+"Eine Leinwand für die zehn aktivsten Spieler des Vortages. Tägliche Reihung "
+"wird um 00:00 UTC aktualisiert."
+
+#~ msgid "Top10 Only Canvas"
+#~ msgstr "Tip10 Exklusiv"
+
+#~ msgid "Couldn't send your message, pls log out and back in again."
+#~ msgstr ""
+#~ "Konnte die Nachricht nicht senden, bitte logge duch aus und wieder an."
+
#~ msgid "Could not connect to server, please try again later :("
#~ msgstr ""
#~ "Konnte nicht zum Server verbinden, bitte versuche es später erneut :("
diff --git a/i18n/template-ssr.pot b/i18n/template-ssr.pot
index 98cceb59..45e578df 100644
--- a/i18n/template-ssr.pot
+++ b/i18n/template-ssr.pot
@@ -77,31 +77,31 @@ msgstr ""
msgid "Place color pixels on an map styled canvas with other players online"
msgstr ""
-#: src/routes/reset_password.js:58
+#: src/routes/reset_password.js:41
msgid "You sent an empty password or invalid data :("
msgstr ""
-#: src/routes/reset_password.js:70
+#: src/routes/reset_password.js:53
msgid "This password-reset link isn't valid anymore :("
msgstr ""
-#: src/routes/reset_password.js:81
+#: src/routes/reset_password.js:64
msgid "Your passwords do not match :("
msgstr ""
-#: src/routes/reset_password.js:96
+#: src/routes/reset_password.js:79
msgid "User doesn't exist in our database :("
msgstr ""
-#: src/routes/reset_password.js:108
+#: src/routes/reset_password.js:91
msgid "Passowrd successfully changed."
msgstr ""
-#: src/routes/reset_password.js:127
+#: src/routes/reset_password.js:110
msgid "Invalid url :( Please check your mail again."
msgstr ""
-#: src/routes/reset_password.js:140
+#: src/routes/reset_password.js:123
msgid ""
"This passwort reset link is wrong or already expired, please request a new "
"one (Note: you can use those links just once)"
@@ -374,32 +374,42 @@ msgstr ""
msgid "1bit"
msgstr ""
-#: src/canvasesDesc.js:27
-msgid "Our main canvas, a huge map of the world. Place everywhere you like"
+#: src/canvasesDesc.js:25
+msgid "Top10"
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) or art larger than 1.5k x 1.5k pixels."
msgstr ""
-#: src/canvasesDesc.js:29
+#: src/canvasesDesc.js:30
msgid "Place Voxels on a 3D canvas with others"
msgstr ""
-#: src/canvasesDesc.js:30
+#: src/canvasesDesc.js:31
msgid "Special canvas to spread awareness of SARS-CoV2"
msgstr ""
-#: src/canvasesDesc.js:31
+#: src/canvasesDesc.js:32
msgid "Mirror of PixelZone"
msgstr ""
-#: src/canvasesDesc.js:32
+#: src/canvasesDesc.js:33
msgid "Mirror of PixelCanvas"
msgstr ""
-#: src/canvasesDesc.js:33
+#: src/canvasesDesc.js:34
msgid "Black and White canvas"
+msgstr ""
+
+#: src/canvasesDesc.js:35
+msgid ""
+"A canvas for the most active players from the the previous day. Daily "
+"ranking updates at 00:00 UTC."
msgstr ""
\ No newline at end of file
diff --git a/i18n/template.pot b/i18n/template.pot
index 32e77777..8bb10e98 100644
--- a/i18n/template.pot
+++ b/i18n/template.pot
@@ -3,16 +3,155 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
-#: src/components/OnlineBox.jsx:41
-msgid "Online Users on Canvas"
+#: src/controls/keypress.js:41
+#, javascript-format
+msgid "Switched to ${ canvasName }"
msgstr ""
-#: src/components/OnlineBox.jsx:48
-msgid "Total Online Users"
+#: src/controls/keypress.js:64
+msgid "Grid ON"
msgstr ""
-#: src/components/OnlineBox.jsx:56
-msgid "Pixels placed"
+#: src/controls/keypress.js:65
+msgid "Grid OFF"
+msgstr ""
+
+#: src/controls/keypress.js:75
+msgid "Pixel Notify ON"
+msgstr ""
+
+#: src/controls/keypress.js:76
+msgid "Pixel Notify OFF"
+msgstr ""
+
+#: src/controls/keypress.js:81
+msgid "Muted Sound"
+msgstr ""
+
+#: src/controls/keypress.js:82
+msgid "Unmuted Sound"
+msgstr ""
+
+#: src/components/CoordinatesBox.jsx:29
+#: src/controls/keypress.js:88
+msgid "Copied!"
+msgstr ""
+
+#: src/controls/keypress.js:94
+msgid "Show Hidden Canvases"
+msgstr ""
+
+#: src/controls/keypress.js:95
+msgid "Hide Hidden Canvases"
+msgstr ""
+
+#: src/ui/placePixel.js:53
+msgid "Error :("
+msgstr ""
+
+#: src/ui/placePixel.js:54
+msgid "Didn't get an answer from pixelplanet. Maybe try to refresh?"
+msgstr ""
+
+#: src/ui/placePixel.js:56
+#: src/ui/placePixel.js:237
+#: src/ui/placePixel.js:260
+msgid "OK"
+msgstr ""
+
+#: src/ui/placePixel.js:197
+msgid "Invalid Canvas"
+msgstr ""
+
+#: src/ui/placePixel.js:198
+msgid "This canvas doesn't exist"
+msgstr ""
+
+#: src/ui/placePixel.js:201
+#: src/ui/placePixel.js:205
+#: src/ui/placePixel.js:209
+msgid "Invalid Coordinates"
+msgstr ""
+
+#: src/ui/placePixel.js:202
+msgid "x out of bounds"
+msgstr ""
+
+#: src/ui/placePixel.js:206
+msgid "y out of bounds"
+msgstr ""
+
+#: src/ui/placePixel.js:210
+msgid "z out of bounds"
+msgstr ""
+
+#: src/ui/placePixel.js:213
+msgid "Wrong Color"
+msgstr ""
+
+#: src/ui/placePixel.js:214
+msgid "Invalid color selected"
+msgstr ""
+
+#: src/ui/placePixel.js:217
+msgid "Just for registered Users"
+msgstr ""
+
+#: src/ui/placePixel.js:218
+msgid "You have to be logged in to place on this canvas"
+msgstr ""
+
+#: src/ui/placePixel.js:221
+msgid "Place more :)"
+msgstr ""
+
+#: src/ui/placePixel.js:223
+msgid "You can not access this canvas yet. You need to place more pixels"
+msgstr ""
+
+#: src/ui/placePixel.js:226
+msgid "Pixel protected!"
+msgstr ""
+
+#: src/ui/placePixel.js:235
+msgid "Please prove that you are human"
+msgstr ""
+
+#: src/ui/placePixel.js:242
+msgid "No Proxies Allowed :("
+msgstr ""
+
+#: src/ui/placePixel.js:243
+msgid "You are using a Proxy."
+msgstr ""
+
+#: src/ui/placePixel.js:246
+msgid "Not allowed"
+msgstr ""
+
+#: src/ui/placePixel.js:247
+msgid "Just the Top10 of yesterday can place here"
+msgstr ""
+
+#: src/ui/placePixel.js:250
+msgid "Weird"
+msgstr ""
+
+#: src/ui/placePixel.js:251
+msgid "Couldn't set Pixel"
+msgstr ""
+
+#: src/ui/placePixel.js:257
+#, javascript-format
+msgid "Error ${ retCode }"
+msgstr ""
+
+#: src/ui/renderer.js:36
+msgid "Canvas Error"
+msgstr ""
+
+#: src/ui/renderer.js:37
+msgid "Can't render 3D canvas, do you have WebGL2 disabled?"
msgstr ""
#: src/actions/index.js:632
@@ -31,6 +170,912 @@ msgstr ""
msgid "Look at past Canvases"
msgstr ""
+#: src/components/Converter.jsx:559
+#: src/components/CoordinatesBox.jsx:32
+msgid "Copy to Clipboard"
+msgstr ""
+
+#: src/components/OnlineBox.jsx:41
+msgid "Online Users on Canvas"
+msgstr ""
+
+#: src/components/OnlineBox.jsx:48
+msgid "Total Online Users"
+msgstr ""
+
+#: src/components/OnlineBox.jsx:56
+msgid "Pixels placed"
+msgstr ""
+
+#: src/components/Admintools.jsx:224
+#: src/components/ModalRoot.jsx:69
+#: src/components/Window.jsx:138
+#: src/components/contextmenus/ChannelContextMenu.jsx:67
+msgid "Close"
+msgstr ""
+
+#: src/components/ModalRoot.jsx:78
+msgid "Restore"
+msgstr ""
+
+#: src/actions/fetch.js:39
+msgid "You made too many requests"
+msgstr ""
+
+#: src/actions/fetch.js:43
+#, javascript-format
+msgid "try again after ${ ti }min"
+msgstr ""
+
+#: src/actions/fetch.js:54
+msgid "Connection error ${ code } :("
+msgstr ""
+
+#: src/actions/fetch.js:79
+#: src/actions/fetch.js:98
+msgid "Could not connect to server, please try again later :("
+msgstr ""
+
+#: src/actions/fetch.js:120
+#: src/actions/fetch.js:139
+#: src/actions/fetch.js:158
+#: src/actions/fetch.js:177
+msgid "Unknown Error"
+msgstr ""
+
+#: src/actions/fetch.js:187
+msgid "Server answered with gibberish :("
+msgstr ""
+
+#: src/components/buttons/CanvasSwitchButton.jsx:22
+#: src/components/windows/index.js:22
+msgid "Canvas Selection"
+msgstr ""
+
+#: src/components/buttons/ChatButton.jsx:92
+msgid "Close Chat"
+msgstr ""
+
+#: src/components/buttons/ChatButton.jsx:92
+msgid "Open Chat"
+msgstr ""
+
+#: src/components/buttons/ExpandMenuButton.jsx:23
+msgid "Close Menu"
+msgstr ""
+
+#: src/components/buttons/ExpandMenuButton.jsx:23
+msgid "Open Menu"
+msgstr ""
+
+#: src/components/buttons/HelpButton.jsx:23
+#: src/components/windows/index.js:16
+msgid "Help"
+msgstr ""
+
+#: src/components/HistorySelect.jsx:144
+msgid "Loading"
+msgstr ""
+
+#: src/components/HistorySelect.jsx:145
+msgid "Select Date above"
+msgstr ""
+
+#: src/components/Window.jsx:117
+msgid "Clone"
+msgstr ""
+
+#: src/components/Window.jsx:124
+msgid "Move"
+msgstr ""
+
+#: src/components/Window.jsx:131
+msgid "Maximize"
+msgstr ""
+
+#: src/components/Window.jsx:145
+msgid "Resize"
+msgstr ""
+
+#: src/components/buttons/SettingsButton.jsx:23
+#: src/components/windows/index.js:17
+msgid "Settings"
+msgstr ""
+
+#: src/components/buttons/LogInButton.jsx:23
+#: src/components/windows/index.js:18
+msgid "User Area"
+msgstr ""
+
+#: src/components/buttons/DownloadButton.jsx:37
+msgid "Make Screenshot"
+msgstr ""
+
+#: src/components/buttons/GlobeButton.jsx:35
+msgid "Globe View"
+msgstr ""
+
+#: src/components/buttons/PalselButton.jsx:31
+msgid "Close Palette"
+msgstr ""
+
+#: src/components/buttons/PalselButton.jsx:31
+msgid "Open Palette"
+msgstr ""
+
+#: src/components/contextmenus/UserContextMenu.jsx:53
+msgid "Ping"
+msgstr ""
+
+#: src/components/contextmenus/UserContextMenu.jsx:78
+msgid "DM"
+msgstr ""
+
+#: src/components/contextmenus/UserContextMenu.jsx:88
+msgid "Block"
+msgstr ""
+
+#: src/components/contextmenus/ChannelContextMenu.jsx:55
+msgid "Mute"
+msgstr ""
+
+#: src/components/windows/index.js:19
+msgid "Registration"
+msgstr ""
+
+#: src/components/windows/index.js:20
+msgid "Forgot Password"
+msgstr ""
+
+#: src/components/windows/index.js:21
+msgid "Chat"
+msgstr ""
+
+#: src/components/windows/index.js:23
+msgid "Canvas Archive"
+msgstr ""
+
+#: src/components/Captcha.jsx:43
+#: src/components/ChangeMail.jsx:72
+#: src/components/ChangeName.jsx:58
+#: src/components/ChangePassword.jsx:80
+#: src/components/DeleteAccount.jsx:55
+#: src/components/LogInForm.jsx:69
+#: src/components/windows/ForgotPassword.jsx:75
+#: src/components/windows/Register.jsx:83
+msgid "Error"
+msgstr ""
+
+#: src/components/Captcha.jsx:47
+msgid "Type the characters from the following image:"
+msgstr ""
+
+#: src/components/Captcha.jsx:50
+msgid "Tip: Not case-sensitive; I and l are the same"
+msgstr ""
+
+#: src/components/Captcha.jsx:74
+msgid "Could not load captcha"
+msgstr ""
+
+#: src/components/Captcha.jsx:78
+msgid "Can't read? Reload:"
+msgstr ""
+
+#: src/components/Captcha.jsx:82
+msgid "Reload"
+msgstr ""
+
+#: src/components/Captcha.jsx:94
+msgid "Enter Characters"
+msgstr ""
+
+#: src/components/Captcha.jsx:120
+#: src/components/ChangeMail.jsx:93
+#: src/components/ChangeName.jsx:70
+#: src/components/ChangePassword.jsx:116
+#: src/components/DeleteAccount.jsx:68
+#: src/components/windows/ForgotPassword.jsx:88
+#: src/components/windows/Register.jsx:125
+msgid "Cancel"
+msgstr ""
+
+#: src/components/Captcha.jsx:127
+msgid "Send"
+msgstr ""
+
+#: src/components/windows/Help.jsx:36
+msgid "your IP"
+msgstr ""
+
+#: src/components/windows/Help.jsx:42
+msgid "Place color pixels on a large canvas with other players online!"
+msgstr ""
+
+#: src/components/windows/Help.jsx:43
+msgid ""
+"Our main canvas is a huge worldmap, you can place wherever you like, but "
+"you will have to wait a specific Cooldown between pixels. You can check out "
+"the cooldown and requirements on the Canvas Selection menu (globe button on "
+"top). Some canvases have a different cooldown for replacing a user-set "
+"pixels than placing on a unset pixel. i.e. 4s/7s means 4s on fresh pixels "
+"and 7s on already set pixels."
+msgstr ""
+
+#: src/components/windows/Help.jsx:47
+msgid ""
+"Higher zoomlevels take some time to update, the 3D globe gets updated at "
+"least once per day."
+msgstr ""
+
+#: src/components/windows/Help.jsx:48
+msgid "Have fun!"
+msgstr ""
+
+#: src/components/windows/Help.jsx:50
+msgid "recommended"
+msgstr ""
+
+#: src/components/windows/Help.jsx:51
+msgid "Source on "
+msgstr ""
+
+#: src/components/windows/Help.jsx:52
+msgid "Map Data"
+msgstr ""
+
+#: src/components/windows/Help.jsx:53
+msgid ""
+"The bare map data that we use, together with converted OpenStreetMap tiles "
+"for orientation, can be downloaded from mega.nz here: "
+msgstr ""
+
+#: src/components/windows/Help.jsx:55
+msgid "Detected as Proxy?"
+msgstr ""
+
+#: src/components/windows/Help.jsx:57
+#, javascript-format
+msgid ""
+"If you got detected as proxy, but you are none, please go to our ${ "
+"guildedLink } or send us an e-mail with ${ getIPLink } to ${ mailLink }. Do "
+"not post your IP anywhere else. We are sorry for the inconvenience."
+msgstr ""
+
+#: src/components/windows/Help.jsx:59
+#: src/components/windows/Help.jsx:76
+msgid "Controls"
+msgstr ""
+
+#: src/components/windows/Help.jsx:61
+msgid "Click a color in palette to select it"
+msgstr ""
+
+#: src/components/windows/Help.jsx:62
+#, javascript-format
+msgid "Press ${ bindG } to toggle grid"
+msgstr ""
+
+#: src/components/windows/Help.jsx:63
+msgid "Press ${ bindX } to toggle showing of pixel activity"
+msgstr ""
+
+#: src/components/windows/Help.jsx:64
+#, javascript-format
+msgid "Press ${ bindH } to toggle historical view"
+msgstr ""
+
+#: src/components/windows/Help.jsx:65
+msgid "Press ${ bindR } to copy coordinates"
+msgstr ""
+
+#: src/components/windows/Help.jsx:66
+#, javascript-format
+msgid "Press ${ bindQ } or ${ bindE } to zoom"
+msgstr ""
+
+#: src/components/windows/Help.jsx:67
+#: src/components/windows/Help.jsx:78
+#, javascript-format
+msgid "Press ${ bindW }, ${ bindA }, ${ bindS }, ${ bindD } to move"
+msgstr ""
+
+#: src/components/windows/Help.jsx:68
+#: src/components/windows/Help.jsx:79
+#, javascript-format
+msgid "Press ${ bindAUp }, ${ bindALeft }, ${ bindADown }, ${ bindARight } to move"
+msgstr ""
+
+#: src/components/windows/Help.jsx:69
+msgid "Drag ${ mouseSymbol } mouse or ${ touchSymbol } pan to move"
+msgstr ""
+
+#: src/components/windows/Help.jsx:70
+#, javascript-format
+msgid "Scroll ${ mouseSymbol } mouse wheel or ${ touchSymbol } pinch to zoom"
+msgstr ""
+
+#: src/components/windows/Help.jsx:71
+msgid "Hold left ${ bindShift } for placing while moving mouse"
+msgstr ""
+
+#: src/components/windows/Help.jsx:72
+#, javascript-format
+msgid ""
+"Hold right ${ bindShift } for placing while moving mouse according to "
+"historical view"
+msgstr ""
+
+#: src/components/windows/Help.jsx:73
+#: src/components/windows/Help.jsx:84
+#, javascript-format
+msgid "${ mouseSymbol } Left click or ${ touchSymbol } tap to place a pixel"
+msgstr ""
+
+#: src/components/windows/Help.jsx:74
+#: src/components/windows/Help.jsx:86
+msgid ""
+"Click ${ mouseSymbol } middle mouse button or ${ touchSymbol } long-tap to "
+"select current hovering color"
+msgstr ""
+
+#: src/components/windows/Help.jsx:80
+msgid "Press ${ bindE } and ${ bindC } to fly up and down"
+msgstr ""
+
+#: src/components/windows/Help.jsx:81
+#, javascript-format
+msgid "${ mouseSymbol } Hold left mouse button and drag mouse to rotate"
+msgstr ""
+
+#: src/components/windows/Help.jsx:82
+#, javascript-format
+msgid ""
+"${ mouseSymbol } Scroll mouse wheel or hold ${ mouseSymbol } middle mouse "
+"button and drag to zoom"
+msgstr ""
+
+#: src/components/windows/Help.jsx:83
+msgid "${ mouseSymbol } Right click and drag mouse to pan"
+msgstr ""
+
+#: src/components/windows/Help.jsx:85
+#, javascript-format
+msgid ""
+"${ mouseSymbol } Right click or ${ touchSymbol } double-tap to remove a "
+"pixel"
+msgstr ""
+
+#: src/components/windows/Help.jsx:90
+msgid ""
+"We thanks those artists very much, they offered their palettes to the "
+"public on"
+msgstr ""
+
+#: src/components/windows/Help.jsx:93
+#, javascript-format
+msgid "Credit for the Palette of the Moon goes to ${ starhouseLink }."
+msgstr ""
+
+#: src/components/windows/Help.jsx:96
+msgid "Credit for the Palette of the Top10 canvas goes to ${ vinikLink }."
+msgstr ""
+
+#: src/components/windows/Settings.jsx:133
+msgid "Show Grid"
+msgstr ""
+
+#: src/components/windows/Settings.jsx:138
+msgid "Turn on grid to highlight pixel borders."
+msgstr ""
+
+#: src/components/windows/Settings.jsx:141
+msgid "Show Pixel Activity"
+msgstr ""
+
+#: src/components/windows/Settings.jsx:146
+msgid "Show circles where pixels are placed."
+msgstr ""
+
+#: src/components/windows/Settings.jsx:149
+msgid "Disable Game Sounds"
+msgstr ""
+
+#: src/components/windows/Settings.jsx:155
+msgid "All sound effects will be disabled."
+msgstr ""
+
+#: src/components/windows/Settings.jsx:159
+msgid ""
+"Your Browser doesn't allow us to use AudioContext to play sounds. Do you "
+"have some privacy feature blocking us?"
+msgstr ""
+
+#: src/components/windows/Settings.jsx:165
+msgid "Enable chat notifications"
+msgstr ""
+
+#: src/components/windows/Settings.jsx:169
+msgid "Play a sound when new chat messages arrive"
+msgstr ""
+
+#: src/components/windows/Settings.jsx:172
+msgid "Auto Zoom In"
+msgstr ""
+
+#: src/components/windows/Settings.jsx:177
+msgid ""
+"Zoom in instead of placing a pixel when you tap the canvas and your zoom is "
+"small."
+msgstr ""
+
+#: src/components/windows/Settings.jsx:180
+msgid "Compact Palette"
+msgstr ""
+
+#: src/components/windows/Settings.jsx:185
+msgid "Display Palette in a compact form that takes less screen space."
+msgstr ""
+
+#: src/components/windows/Settings.jsx:188
+msgid "Potato Mode"
+msgstr ""
+
+#: src/components/windows/Settings.jsx:192
+msgid "For when you are playing on a potato."
+msgstr ""
+
+#: src/components/Converter.jsx:374
+#: src/components/windows/Settings.jsx:195
+msgid "Light Grid"
+msgstr ""
+
+#: src/components/windows/Settings.jsx:199
+msgid "Show Grid in white instead of black."
+msgstr ""
+
+#: src/components/windows/Settings.jsx:203
+msgid "Historical View"
+msgstr ""
+
+#: src/components/windows/Settings.jsx:208
+msgid "Check out past versions of the canvas."
+msgstr ""
+
+#: src/components/windows/Settings.jsx:213
+msgid "Themes"
+msgstr ""
+
+#: src/components/windows/Settings.jsx:218
+msgid "How pixelplanet should look like."
+msgstr ""
+
+#: src/components/windows/Settings.jsx:225
+msgid "Select Language"
+msgstr ""
+
+#: src/components/windows/UserArea.jsx:27
+msgid "Profile"
+msgstr ""
+
+#: src/components/windows/UserArea.jsx:30
+msgid "Ranking"
+msgstr ""
+
+#: src/components/windows/UserArea.jsx:33
+msgid "Converter"
+msgstr ""
+
+#: src/components/windows/UserArea.jsx:39
+msgid "Admintools"
+msgstr ""
+
+#: src/components/windows/UserArea.jsx:39
+msgid "Modtools"
+msgstr ""
+
+#: src/components/windows/UserArea.jsx:40
+msgid "Loading..."
+msgstr ""
+
+#: src/components/windows/UserArea.jsx:47
+msgid "Consider joining us on Guilded:"
+msgstr ""
+
+#: src/components/windows/Register.jsx:81
+msgid "Register new account here"
+msgstr ""
+
+#: src/components/windows/Register.jsx:92
+msgid "Name"
+msgstr ""
+
+#: src/components/windows/ForgotPassword.jsx:82
+#: src/components/windows/Register.jsx:100
+msgid "Email"
+msgstr ""
+
+#: src/components/ChangeMail.jsx:80
+#: src/components/DeleteAccount.jsx:62
+#: src/components/LogInForm.jsx:83
+#: src/components/windows/Register.jsx:108
+msgid "Password"
+msgstr ""
+
+#: src/components/windows/Register.jsx:116
+msgid "Confirm Password"
+msgstr ""
+
+#: src/components/Admintools.jsx:311
+#: src/components/Admintools.jsx:392
+#: src/components/Admintools.jsx:467
+#: src/components/Admintools.jsx:512
+#: src/components/Admintools.jsx:595
+#: src/components/windows/ForgotPassword.jsx:86
+#: src/components/windows/Register.jsx:119
+msgid "Submit"
+msgstr ""
+
+#: src/components/windows/CanvasSelect.jsx:33
+msgid ""
+"Select the canvas you want to use. Every canvas is unique and has "
+"different palettes, cooldown and requirements. Archive of closed canvases "
+"can be accessed here:"
+msgstr ""
+
+#: src/components/windows/CanvasSelect.jsx:41
+msgid "Archive"
+msgstr ""
+
+#: src/components/windows/Archive.jsx:20
+msgid ""
+"While we tend to not delete canvases, some canvases are started for fun or "
+"as a request by users who currently like a meme. Those canvases can get "
+"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 ""
+
+#: src/components/windows/Archive.jsx:22
+msgid ""
+"Here we collect those canvases to archive them in a proper way (which is "
+"currently just one)."
+msgstr ""
+
+#: src/components/windows/Archive.jsx:24
+msgid "Political Compass Canvas"
+msgstr ""
+
+#: src/components/windows/Archive.jsx:31
+msgid ""
+"This canvas got requested during a time of political conflicts on the main "
+"Earth canvas. It was a 1024x1024 representation of the political compass "
+"with a 5s cooldown and 60s stacking. It got launched on May 11th and "
+"remained active for months till it got shut down on November 30th."
+msgstr ""
+
+#: src/components/windows/Archive.jsx:32
+msgid ""
+"We decided to archive it as a timelapse with lossless encoded webm. Taking "
+"a screenshot from the timelapse results in a perfect 1:1 representation of "
+"how the canvas was at that time."
+msgstr ""
+
+#: src/components/windows/Chat.jsx:146
+msgid "Channel settings"
+msgstr ""
+
+#: src/components/windows/Chat.jsx:161
+msgid "Start chatting here"
+msgstr ""
+
+#: src/components/windows/Chat.jsx:198
+msgid "Chat here"
+msgstr ""
+
+#: src/components/windows/Chat.jsx:221
+msgid "You must be logged in to chat"
+msgstr ""
+
+#: src/components/windows/ForgotPassword.jsx:60
+msgid "Sent you a mail with instructions to reset your password."
+msgstr ""
+
+#: src/components/windows/ForgotPassword.jsx:71
+msgid "Enter your mail address and we will send you a new password:"
+msgstr ""
+
+#: src/utils/validation.js:18
+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:30
+msgid "Name can't be empty."
+msgstr ""
+
+#: src/utils/validation.js:31
+msgid "Name must be at least 4 characters long"
+msgstr ""
+
+#: src/utils/validation.js:32
+msgid "Name must be shorter than 26 characters"
+msgstr ""
+
+#: src/utils/validation.js:39
+msgid "Name contains invalid character like @, /, \\ or #"
+msgstr ""
+
+#: 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:60
+msgid "Password must be shorter than 60 characters."
+msgstr ""
+
+#: src/components/ChangeMail.jsx:91
+#: src/components/ChangeName.jsx:68
+#: src/components/ChangePassword.jsx:110
+#: src/components/LanguageSelect.jsx:73
+msgid "Save"
+msgstr ""
+
+#: src/components/LogInArea.jsx:21
+msgid "Login to access more features and stats."
+msgstr ""
+
+#: src/components/LogInArea.jsx:23
+msgid "Login with Name or Mail:"
+msgstr ""
+
+#: src/components/LogInArea.jsx:30
+msgid "I forgot my Password."
+msgstr ""
+
+#: src/components/LogInArea.jsx:31
+msgid "or login with:"
+msgstr ""
+
+#: src/components/LogInArea.jsx:72
+msgid "or register here:"
+msgstr ""
+
+#: src/components/LogInArea.jsx:79
+msgid "Register"
+msgstr ""
+
+#: src/components/UserAreaContent.jsx:63
+msgid "Todays Placed Pixels"
+msgstr ""
+
+#: src/components/UserAreaContent.jsx:67
+msgid "Daily Rank"
+msgstr ""
+
+#: src/components/UserAreaContent.jsx:72
+msgid "Placed Pixels"
+msgstr ""
+
+#: src/components/UserAreaContent.jsx:76
+msgid "Total Rank"
+msgstr ""
+
+#: src/components/UserAreaContent.jsx:81
+#, javascript-format
+msgid "Your name is: ${ name }"
+msgstr ""
+
+#: src/components/UserAreaContent.jsx:87
+msgid "Log out"
+msgstr ""
+
+#: src/components/UserAreaContent.jsx:93
+msgid "Change Username"
+msgstr ""
+
+#: src/components/UserAreaContent.jsx:102
+msgid "Change Mail"
+msgstr ""
+
+#: src/components/UserAreaContent.jsx:110
+msgid "Change Password"
+msgstr ""
+
+#: src/components/UserAreaContent.jsx:116
+msgid "Delete Account"
+msgstr ""
+
+#: src/components/UserAreaContent.jsx:123
+msgid "Social Settings"
+msgstr ""
+
+#: src/components/Admintools.jsx:184
+msgid "Build image on canvas."
+msgstr ""
+
+#: src/components/Admintools.jsx:187
+msgid "Build image and set it to protected."
+msgstr ""
+
+#: src/components/Admintools.jsx:190
+msgid "Build image, but reset cooldown to unset-pixel cd."
+msgstr ""
+
+#: src/components/Admintools.jsx:253
+msgid "Image Upload"
+msgstr ""
+
+#: src/components/Admintools.jsx:254
+msgid "Upload images to canvas"
+msgstr ""
+
+#: src/components/Admintools.jsx:256
+msgid "File"
+msgstr ""
+
+#: src/components/Admintools.jsx:276
+msgid "Coordinates in X_Y format:"
+msgstr ""
+
+#: src/components/Admintools.jsx:316
+msgid "Pixel Protection"
+msgstr ""
+
+#: src/components/Admintools.jsx:318
+msgid ""
+"Set protection of areas (if you need finer grained control, "
+"use protect with image upload and alpha layers)"
+msgstr ""
+
+#: src/components/Admintools.jsx:398
+msgid "Rollback to Date"
+msgstr ""
+
+#: src/components/Admintools.jsx:400
+msgid "Rollback an area of the canvas to a set date (00:00 UTC)"
+msgstr ""
+
+#: src/components/Admintools.jsx:475
+msgid "IP Actions"
+msgstr ""
+
+#: src/components/Admintools.jsx:477
+msgid "Do stuff with IPs (one IP per line)"
+msgstr ""
+
+#: src/components/Admintools.jsx:516
+msgid "Manage Moderators"
+msgstr ""
+
+#: src/components/Admintools.jsx:518
+msgid "Remove Moderator"
+msgstr ""
+
+#: src/components/Admintools.jsx:550
+msgid "There are no mods"
+msgstr ""
+
+#: src/components/Admintools.jsx:555
+msgid "Assign new Mod"
+msgstr ""
+
+#: src/components/Admintools.jsx:558
+msgid "Enter UserName of new Mod"
+msgstr ""
+
+#: src/components/Admintools.jsx:567
+msgid "User Name"
+msgstr ""
+
+#: src/components/Rankings.jsx:28
+msgid "Total"
+msgstr ""
+
+#: src/components/Rankings.jsx:36
+msgid "Daily"
+msgstr ""
+
+#: src/components/Rankings.jsx:40
+msgid "Ranking updates every 5 min. Daily rankings get reset at midnight UTC."
+msgstr ""
+
+#: src/components/Converter.jsx:190
+msgid "Choose Canvas"
+msgstr ""
+
+#: src/components/Converter.jsx:216
+msgid "Palette Download"
+msgstr ""
+
+#: src/components/Converter.jsx:218
+#, javascript-format
+msgid "Palette for ${ gimpLink }"
+msgstr ""
+
+#: src/components/Converter.jsx:236
+msgid "Image Converter"
+msgstr ""
+
+#: src/components/Converter.jsx:237
+msgid "Convert an image to canvas colors"
+msgstr ""
+
+#: src/components/Converter.jsx:256
+msgid "Choose Strategy"
+msgstr ""
+
+#: src/components/Converter.jsx:293
+msgid "Serpentine"
+msgstr ""
+
+#: src/components/Converter.jsx:295
+msgid "Minimum Color Distance"
+msgstr ""
+
+#: src/components/Converter.jsx:322
+msgid "Calculate like GIMP"
+msgstr ""
+
+#: src/components/Converter.jsx:326
+msgid "Choose Color Mode"
+msgstr ""
+
+#: src/components/Converter.jsx:354
+msgid "Add Grid (uncheck if you need a 1:1 template)"
+msgstr ""
+
+#: src/components/Converter.jsx:376
+#: src/components/Converter.jsx:392
+msgid "Offset"
+msgstr ""
+
+#: src/components/Converter.jsx:421
+msgid "Scale Image"
+msgstr ""
+
+#: src/components/Converter.jsx:432
+msgid "Width"
+msgstr ""
+
+#: src/components/Converter.jsx:463
+msgid "Height"
+msgstr ""
+
+#: src/components/Converter.jsx:502
+msgid "Keep Ratio"
+msgstr ""
+
+#: src/components/Converter.jsx:515
+msgid "Anti Aliasing"
+msgstr ""
+
+#: src/components/Converter.jsx:529
+msgid "Reset"
+msgstr ""
+
+#: src/components/Converter.jsx:547
+msgid "Download Template"
+msgstr ""
+
#: src/components/CanvasItem.jsx:30
msgid "Online Users"
msgstr ""
@@ -55,19 +1100,163 @@ msgstr ""
msgid "No"
msgstr ""
-#: src/components/CanvasItem.jsx:48
+#: src/components/CanvasItem.jsx:51
msgid "Requirements"
msgstr ""
-#: src/components/CanvasItem.jsx:50
+#: src/components/CanvasItem.jsx:54
msgid "User Account"
msgstr ""
-#: src/components/CanvasItem.jsx:52
+#: src/components/CanvasItem.jsx:56
#, javascript-format
msgid "and ${ canvas.req } Pixels set"
msgstr ""
-#: src/components/CanvasItem.jsx:56
+#: src/components/CanvasItem.jsx:59
+msgid "Top 10 Daily Ranking"
+msgstr ""
+
+#: src/components/CanvasItem.jsx:65
msgid "Dimensions"
+msgstr ""
+
+#: src/components/LogInForm.jsx:76
+msgid "Name or Email"
+msgstr ""
+
+#: src/components/LogInForm.jsx:87
+msgid "LogIn"
+msgstr ""
+
+#: src/components/ChangePassword.jsx:22
+msgid "Passwords do not match."
+msgstr ""
+
+#: src/components/ChangePassword.jsx:45
+msgid "Changed Password successfully."
+msgstr ""
+
+#: src/components/ChangePassword.jsx:89
+msgid "Old Password"
+msgstr ""
+
+#: src/components/ChangePassword.jsx:97
+msgid "New Password"
+msgstr ""
+
+#: src/components/ChangePassword.jsx:104
+msgid "Confirm New Password"
+msgstr ""
+
+#: src/components/UserMessages.jsx:28
+msgid ""
+"Please verify your mail address \n"
+"or your account could get deleted after a few days."
+msgstr ""
+
+#: src/components/UserMessages.jsx:49
+msgid "A new verification mail is getting sent to you."
+msgstr ""
+
+#: src/components/UserMessages.jsx:53
+msgid "Click here to request a new verification mail."
+msgstr ""
+
+#: src/components/ChangeName.jsx:64
+msgid "New Username"
+msgstr ""
+
+#: src/components/ChangeMail.jsx:59
+msgid ""
+"Changed Mail successfully. We sent you a verification mail, "
+"please verify your new mail address."
+msgstr ""
+
+#: src/components/ChangeMail.jsx:87
+msgid "New Mail"
+msgstr ""
+
+#: src/components/DeleteAccount.jsx:66
+msgid "Yes, Delete My Account!"
+msgstr ""
+
+#: src/components/SocialSettings.jsx:38
+msgid "Block all Private Messages"
+msgstr ""
+
+#: src/components/SocialSettings.jsx:56
+msgid "Unblock Users"
+msgstr ""
+
+#: src/components/SocialSettings.jsx:80
+msgid "You have no users blocked"
+msgstr ""
+
+#: src/components/windows/Help.jsx:14
+#: src/components/windows/Settings.jsx:134
+msgctxt "keybinds"
+msgid "G"
+msgstr ""
+
+#: src/components/windows/Help.jsx:15
+#: src/components/windows/Settings.jsx:142
+msgctxt "keybinds"
+msgid "X"
+msgstr ""
+
+#: src/components/windows/Help.jsx:16
+#: src/components/windows/Settings.jsx:205
+msgctxt "keybinds"
+msgid "H"
+msgstr ""
+
+#: src/components/windows/Help.jsx:17
+msgctxt "keybinds"
+msgid "R"
+msgstr ""
+
+#: src/components/windows/Help.jsx:18
+msgctxt "keybinds"
+msgid "Q"
+msgstr ""
+
+#: src/components/windows/Help.jsx:19
+msgctxt "keybinds"
+msgid "E"
+msgstr ""
+
+#: src/components/windows/Help.jsx:20
+msgctxt "keybinds"
+msgid "W"
+msgstr ""
+
+#: src/components/windows/Help.jsx:21
+msgctxt "keybinds"
+msgid "A"
+msgstr ""
+
+#: src/components/windows/Help.jsx:22
+msgctxt "keybinds"
+msgid "S"
+msgstr ""
+
+#: src/components/windows/Help.jsx:23
+msgctxt "keybinds"
+msgid "D"
+msgstr ""
+
+#: src/components/windows/Help.jsx:30
+msgctxt "keybinds"
+msgid "Shift"
+msgstr ""
+
+#: src/components/windows/Help.jsx:31
+msgctxt "keybinds"
+msgid "C"
+msgstr ""
+
+#: src/components/windows/Settings.jsx:150
+msgctxt "keybinds"
+msgid "M"
msgstr ""
\ No newline at end of file
diff --git a/public/loading8.png b/public/loading8.png
new file mode 100644
index 0000000000000000000000000000000000000000..752c7180b25b58fa89797635ee08d7f5678b587b
GIT binary patch
literal 1591
zcmb7E`BM{F5PokmA(?O(h=?dIBS#Ps46qA95r*4nR8&;(fQXbAiX6J21oAkPh=Nd-
zO7Mz`l0`+(MQ{}uC=pzV7r1g2QbarfQP5QhvY~4KfZZRu`s?cMs_w75zJtL_gA6&-
zH~;`c(L(H3OQI)`uZS>gjg`4N5XM&?8|VMUNHD1B)0Ru|X>i$enL
zsc+q^J9pz|sp9m}jI88?IcY`3XBzHTKX}-1N_qTAi@NUao!fLdbdsg&T8P+%VF>^@
zSx*>Dy6F8Y08E9*-zOxgW1y=x+B#@59Vb#3_V|9El*@b{btPs1kr&;@>4B2?jZvZ8
z6TT`r=T_B2-#*7F?5FEy<%sfQ-*C=N&YCG}RVNP*`x@*`RXx(e$kqJEQYK3U*=nSpL
z9U~xgJernr?$B7bSG?jCYaG3{DJRa4rH*G2d6(W!>V{TSq=~;i5br^A9z4z11#kgD
zA`yU3wH>a2@dmfkCkhII`5x0e=z7|=vUna2XCpD!@n=c)3FNtzP=OhM_XZSD
zERs)RYcE0rBR;SZKsg}?(UU{GI4g-Ch{G4Smyxs06<3nw!&(n>87&De^GC7>ymEE9KEFrN1{C9Bd#bE(j
zir{W+Eh^d7=rVyrut-!g-GrUj_nTOWHQ{%GX=T(rq{DI?i`7^HBHq4s8;ao
zW?!GFIH#D>4NBH6VN)6p*JAQfBabzdQm`!Wszrpfu$XQWHoh02Z((N^XUuYzZh9@N
zm6~B(^%l3f*a9O1rJ0`KtY5mAIkf}-aANUwB}SSc^YDy%@>M0V4~zX^Dag_oFrv7$
z4FWIm-Bc!0tluxJUHaIMe(El9I^ybF%Tby%fmS?FGnfbgy|YQitAvvji^k^x
zXK2bbrs;7?DS)M*nuGPrB`dQngFmj*`x`|r
zFoq=D^CP=6-T*QE)1MTT5$XNepDpc&Mtcmy;r{i^G_QiL7xmF|%jwMqE0<*xvr{>k
zuzf5>|B9w`0W(0#hM@zg)z6r28sUL2JWqzE$`Zt0@4S!O>d7@RGase1xkq^+;0oUJ
zarG1gTwplf`?@9(;B5n`$C>2Bjq`Yqp#x5(`!fOU&m`?gMidYSN1_X1%((S4p?TQ~
zkWVg$v8HcybcY}#KrAv>P9px|PjFo3f*L#PLeBsN-8%8AJ3u}aj-`a`-U-%XR+2vO
zQ{1Pyxux3I^_D&JS!LBXVDF)oSwpj%?USAhOYpHO@0?TI7V=PR=T-^Eerz_1jw{CZ
z6g=R5@tOx~HZzhq@zx#nl-<`%8NF(_mXqLcPaR>y8|jPoTFnmrrrzqnN*omJda{Q4
zT)C-Yv;j}4e&>Lz{+QYR4%&PzVmW@|sP5R_=p4Tg4!4_neq+h;b@QtdmhE%k%LJ;M
zj)~sm7R7T7wJCycy~EE(8q&OJ*+DlMjNy|1(Vp8~xmi%aC
zdrbYczP7pG$I1q`W}H`&W|273=BhM|SdvsR)PF#)DQM{S8qnO@uPUzJHDZs>w(5$_
z(BTbs$}o4ZMzRxKlCD?)Djv@tsNKMf-|l+g?2j4yG5T^>H*4Nt3I#{ntm!Ty&M4V#
zhiY_ri)BxAx3e#Nx%iqfxh60N@%N^7o4WoF!TVPnYY0jmG=Lucq-uAzav$ENQ*Iy%
LSn6NuD@p$cSe$a+
literal 0
HcmV?d00001
diff --git a/public/preview8.png b/public/preview8.png
new file mode 100644
index 0000000000000000000000000000000000000000..db7af015e5615c27b268efb04ae6982b6bfaae58
GIT binary patch
literal 6182
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
OKt)kgp-#>+{Qm*ry6MjV
literal 0
HcmV?d00001
diff --git a/src/canvases.json b/src/canvases.json
index ddd2581b..ed049e07 100644
--- a/src/canvases.json
+++ b/src/canvases.json
@@ -1,7 +1,6 @@
{
"0": {
"ident":"d",
- "title": "Earth",
"colors": [
[ 202, 227, 255 ],
[ 255, 255, 255 ],
@@ -37,19 +36,15 @@
[ 130, 0, 128 ]
],
"size": 65536,
- "hid": false,
"cli": 2,
"bcd": 4000,
"pcd" : 7000,
"cds": 60000,
"ranked" : true,
- "req": -1,
- "sd": "2020-01-07",
- "desc": "Our main canvas, a huge map of the world. Place everywhere you like"
+ "sd": "2020-01-07"
},
"1": {
"ident": "m",
- "title": "Moon",
"colors" : [
[ 49, 46, 47 ],
[ 99, 92, 90 ],
@@ -91,19 +86,15 @@
4096
]
],
- "hid": false,
"cli": 2,
"bcd": 15000,
- "pcd": 15000,
"cds": 900000,
"ranked" : true,
"req": 20000,
- "sd": "2020-01-08",
- "desc": "Moon canvas. Safe space for art. No flags or large text (unless part of art)"
+ "sd": "2020-01-08"
},
"2": {
"ident":"v",
- "title": "3D Canvas",
"colors": [
[ 255, 255, 255 ],
[ 255, 255, 255 ],
@@ -169,20 +160,15 @@
[ 174, 215, 185 ]
],
"size": 1024,
- "hid": false,
"v": true,
"cli": 2,
"bcd": 2000,
- "pcd" : 2000,
"cds": 60000,
- "ranked" : false,
"req": 0,
- "sd": "2020-01-08",
- "desc": "Place Voxels on a 3D canvas with others"
+ "sd": "2020-01-08"
},
"3": {
"ident": "c",
- "title": "Coronavirus",
"colors" : [
[ 226, 218, 0 ],
[ 33, 28, 15 ],
@@ -208,19 +194,14 @@
[ 230, 206, 172 ]
],
"size" : 256,
- "hid": false,
"cli": 2,
"bcd": 500,
- "pcd": 500,
"cds": 60000,
- "ranked" : false,
"req": 0,
- "sd": "2020-03-15",
- "desc": "Special canvas to spread awareness of SARS-CoV2"
+ "sd": "2020-03-15"
},
"5": {
"ident": "y",
- "title": "PixelZone",
"colors": [
[ 38, 38, 38 ],
[ 0, 0, 0 ],
@@ -241,18 +222,12 @@
],
"size": 16384,
"hid": true,
- "cli": 0,
"bcd": 4000,
- "pcd": 4000,
"cds": 4000,
- "ranked": false,
- "req": -1,
- "sd": "2020-07-05",
- "desc": "Mirror of PixelZone"
+ "sd": "2020-07-05"
},
"6": {
"ident": "z",
- "title": "PixelCanvas",
"colors": [
[ 255, 255, 255 ],
[ 228, 228, 228 ],
@@ -273,18 +248,12 @@
],
"size": 16384,
"hid": true,
- "cli": 0,
"bcd": 10000,
- "pcd": 10000,
"cds": 10000,
- "ranked": false,
- "req": -1,
- "sd": "2020-07-05",
- "desc": "Mirror of PixelCanvas"
+ "sd": "2020-07-05"
},
"7": {
"ident": "w",
- "title": "1bit",
"colors": [
[ 0, 0, 0 ],
[ 255, 255, 255 ],
@@ -292,14 +261,46 @@
[ 255, 255, 255 ]
],
"size": 65536,
- "hid": false,
"cli": 2,
"bcd": 7000,
"pcd": 15000,
"cds": 1000000,
"ranked": true,
"req": 5000,
- "sd": "2020-11-09",
- "desc": "Black and White canvas"
+ "sd": "2020-11-09"
+ },
+ "8": {
+ "ident": "t",
+ "colors": [
+ [ 197, 204, 184 ],
+ [ 111, 103, 118 ],
+ [ 154, 154, 151 ],
+ [ 139, 85, 128 ],
+ [ 195, 136, 144 ],
+ [ 165, 147, 165 ],
+ [ 102, 96, 146 ],
+ [ 154, 79, 80 ],
+ [ 194, 141, 117 ],
+ [ 124, 161, 192 ],
+ [ 65, 106, 163 ],
+ [ 141, 98, 104 ],
+ [ 190, 149, 92 ],
+ [ 104, 172, 169 ],
+ [ 56, 112, 128 ],
+ [ 110, 105, 98 ],
+ [ 147, 161, 103 ],
+ [ 110, 170, 120 ],
+ [ 85, 112, 100 ],
+ [ 157, 159, 127 ],
+ [ 126, 158, 153 ],
+ [ 93, 104, 114 ],
+ [ 67, 52, 85 ],
+ [ 0, 0, 0 ]
+ ],
+ "size": 1024,
+ "bcd": 15000,
+ "cds": 900000,
+ "req": "top",
+ "sd": "2022-01"
}
}
diff --git a/src/canvasesDesc.js b/src/canvasesDesc.js
index 829b8d1a..77c2a4c4 100644
--- a/src/canvasesDesc.js
+++ b/src/canvasesDesc.js
@@ -22,6 +22,7 @@ function getCanvases(t) {
5: t`PixelZone`,
6: t`PixelCanvas`,
7: t`1bit`,
+ 8: t`Top10`,
};
const canvasDesc = {
0: t`Our main canvas, a huge map of the world. Place everywhere you like`,
@@ -31,6 +32,7 @@ function getCanvases(t) {
5: t`Mirror of PixelZone`,
6: t`Mirror of PixelCanvas`,
7: t`Black and White canvas`,
+ 8: t`A canvas for the most active players from the the previous day. Daily ranking updates at 00:00 UTC.`,
};
/*
* no edit below here needed when adding/removing canvas
@@ -42,8 +44,12 @@ function getCanvases(t) {
for (let i = 0; i < canvasKeys.length; i += 1) {
const key = canvasKeys[i];
localicedCanvases[key] = { ...canvases[key] };
- localicedCanvases[key].desc = canvasDesc[key] || `Canvas ${key}`;
- localicedCanvases[key].title = canvasTitles[key] || `Canvas ${key}`;
+ localicedCanvases[key].desc = canvasDesc[key]
+ || canvases[key].desc
+ || `Canvas ${key}`;
+ localicedCanvases[key].title = canvasTitles[key]
+ || canvases[key].title
+ || `Canvas ${key}`;
}
return localicedCanvases;
diff --git a/src/components/CanvasItem.jsx b/src/components/CanvasItem.jsx
index 45af014d..31caa6b0 100644
--- a/src/components/CanvasItem.jsx
+++ b/src/components/CanvasItem.jsx
@@ -34,7 +34,7 @@ const CanvasItem = ({
{canvas.desc}
{t`Cooldown`}:
- {(canvas.bcd !== canvas.pcd)
+ {(canvas.pcd && canvas.bcd !== canvas.pcd)
? {canvas.bcd / 1000}s / {canvas.pcd / 1000}s
: {canvas.bcd / 1000}s}
@@ -45,14 +45,23 @@ const CanvasItem = ({
(canvas.ranked) ? t`Yes` : t`No`
}
- {(canvas.req !== -1) ? {t`Requirements`}:
: null}
-
- {(canvas.req !== -1) ? {t`User Account`} : null}
- {(canvas.req > 0)
- ? {t`and ${canvas.req} Pixels set`}
- : null}
-
- {(canvas.req !== -1) ?
: null}
+ {(canvas.req !== undefined) && (
+ <>
+
+ {t`Requirements`}:
+
+ {(typeof canvas.req === 'number')
+ ? {t`User Account`} : null}
+ {(canvas.req > 0)
+ ? {t`and ${canvas.req} Pixels set`}
+ : null}
+ {(canvas.req === 'top')
+ && {t`Top 10 Daily Ranking`}}
+
+
+
+ >
+ )}
{t`Dimensions`}:
{canvas.size} x {canvas.size}
{(canvas.v)
diff --git a/src/components/Converter.jsx b/src/components/Converter.jsx
index 9932e6fa..33177236 100644
--- a/src/components/Converter.jsx
+++ b/src/components/Converter.jsx
@@ -126,7 +126,7 @@ function Converter() {
if (inputImageCanvas) {
const canvas = canvases[selectedCanvas];
renderOutputImage({
- colors: canvas.colors.slice(canvas.cli),
+ colors: (canvas.cli) ? canvas.colors.slice(canvas.cli) : canvas.colors,
imgCanvas: inputImageCanvas,
ditherOpts: {
strategy: selectedStrategy,
@@ -184,11 +184,6 @@ function Converter() {
}, [scaleData.enabled]);
const gimpLink = GIMP;
- const starhouseLink = (
-
- starhouse
-
- );
return (
@@ -237,9 +232,6 @@ function Converter() {
>
Download
-
- {jt`Credit for the Palette of the Moon goes to ${starhouseLink}.`}
-
{t`Image Converter`}
{t`Convert an image to canvas colors`}
diff --git a/src/components/windows/Help.jsx b/src/components/windows/Help.jsx
index 6704ada3..57fa2368 100644
--- a/src/components/windows/Help.jsx
+++ b/src/components/windows/Help.jsx
@@ -1,6 +1,5 @@
/**
*
- * @flow
*/
import React from 'react';
@@ -31,6 +30,8 @@ const Help = () => {
const bindShift = ⇧ {c('keybinds').t`Shift`};
const bindC = {c('keybinds').t`C`};
+ const starhouseLink = starhouse ;
+ const vinikLink = Vinikdev;
const guildedLink = guilded;
const getIPLink = {t`your IP`};
const mailLink = pixelplanetdev@gmail.com;
@@ -84,7 +85,17 @@ can be downloaded from mega.nz here: `}crazygames.com
+ Palette Credits
+
+ {jt`We thanks those artists very much, they offered their palettes to the public on`}
+
lospec.com
+
+ {jt`Credit for the Palette of the Moon goes to ${starhouseLink}.`}
+
+
+ {jt`Credit for the Palette of the Top10 canvas goes to ${vinikLink}.`}
+
+
);
};
diff --git a/src/core/draw.js b/src/core/draw.js
index 1f4cf960..7ad33fd1 100644
--- a/src/core/draw.js
+++ b/src/core/draw.js
@@ -13,6 +13,7 @@ import {
setPixelByOffset,
setPixelByCoords,
} from './setPixel';
+import rankings from './ranking';
import rpgEvent from './event';
// eslint-disable-next-line import/no-unresolved
import canvases from './canvases.json';
@@ -46,18 +47,16 @@ export async function drawByOffsets(
let pxlCnt = 0;
const canvas = canvases[canvasId];
- if (!canvas) {
- // canvas doesn't exist
- return {
- wait,
- coolDown,
- pxlCnt,
- retCode: 1,
- };
- }
- const { size: canvasSize, v: is3d } = canvas;
try {
+ if (!canvas) {
+ // canvas doesn't exist
+ throw new Error(1);
+ }
+
+ const canvasSize = canvas.size;
+ const is3d = !!canvas.v;
+
wait = await user.getWait(canvasId);
const tileSize = (is3d) ? THREE_TILE_SIZE : TILE_SIZE;
@@ -74,19 +73,26 @@ export async function drawByOffsets(
// (we don't have to check for <0 becaue it is received as uint)
throw new Error(3);
}
- if (canvas.req !== -1) {
+
+ const isAdmin = (user.userlvl === 1);
+
+ if (canvas.req !== undefined && !isAdmin) {
if (user.id === null) {
// not logged in
throw new Error(6);
}
- const totalPixels = await user.getTotalPixels();
- if (totalPixels < canvas.req) {
- // not enough pixels placed yet
- throw new Error(7);
+ if (canvas.req > 0) {
+ const totalPixels = await user.getTotalPixels();
+ if (totalPixels < canvas.req) {
+ // not enough pixels placed yet
+ throw new Error(7);
+ }
+ }
+ if (canvas.req === 'top' && !rankings.prevTop.includes(user.id)) {
+ throw new Error(12);
}
}
- const isAdmin = (user.userlvl === 1);
let coolDownFactor = 1;
if (rpgEvent.success) {
if (rpgEvent.success === 1) {
@@ -118,6 +124,8 @@ export async function drawByOffsets(
offset,
);
+ const clrIgnore = canvas.cli || 0;
+
/*
* pixel validation
*/
@@ -128,7 +136,7 @@ export async function drawByOffsets(
throw new Error(4);
}
if (color >= canvas.colors.length
- || (color < canvas.cli && !(canvas.v && color === 0))
+ || (color < clrIgnore && !(canvas.v && color === 0))
) {
// color out of bounds
throw new Error(5);
@@ -145,7 +153,8 @@ export async function drawByOffsets(
throw new Error(8);
}
- coolDown = (setColor & 0x3F) < canvas.cli ? canvas.bcd : canvas.pcd;
+ coolDown = ((setColor & 0x3F) >= clrIgnore && canvas.pcd)
+ ? canvas.pcd : canvas.bcd;
if (isAdmin) {
coolDown = 0.0;
} else {
@@ -191,6 +200,7 @@ export async function drawByOffsets(
*
* Old version of draw that returns explicit error messages
* used for http json api/pixel, used with coordinates
+ * Is not used anywhere currently, but we keep it around.
* @param user
* @param canvasId
* @param x
@@ -206,13 +216,14 @@ export async function drawByCoords(
y,
z = null,
) {
- if (!({}.hasOwnProperty.call(canvases, canvasId))) {
+ const canvas = canvases[canvasId];
+
+ if (!canvas) {
return {
error: 'This canvas does not exist',
success: false,
};
}
- const canvas = canvases[canvasId];
const canvasMaxXY = canvas.size / 2;
const canvasMinXY = -canvasMaxXY;
@@ -222,6 +233,9 @@ export async function drawByCoords(
success: false,
};
}
+
+ const clrIgnore = canvas.cli || 0;
+
if (canvas.v) {
if (z < canvasMinXY || z >= canvasMaxXY) {
return {
@@ -254,7 +268,7 @@ export async function drawByCoords(
success: false,
};
}
- if (color < canvas.cli) {
+ if (color < clrIgnore) {
return {
error: 'Invalid color selected',
success: false,
@@ -301,7 +315,11 @@ export async function drawByCoords(
const isAdmin = (user.userlvl === 1);
const setColor = await RedisCanvas.getPixel(canvasId, x, y, z);
- let coolDown = (setColor & 0x3F) < canvas.cli ? canvas.bcd : canvas.pcd;
+ /*
+ * bitwise operation to get rid of protection
+ */
+ let coolDown = ((setColor & 0x3F) >= clrIgnore && canvas.pcd)
+ ? canvas.pcd : canvas.bcd;
if (isAdmin) {
coolDown = 0.0;
} else if (rpgEvent.success) {
diff --git a/src/core/ranking.js b/src/core/ranking.js
index 8308f49f..b01a8558 100644
--- a/src/core/ranking.js
+++ b/src/core/ranking.js
@@ -6,6 +6,7 @@
import Sequelize from 'sequelize';
import Model from '../data/sequelize';
import RegUser from '../data/models/RegUser';
+import { saveDailyTop, loadDailyTop } from '../data/models/prevDayTop';
import logger from './logger';
import { MINUTE } from './constants';
@@ -17,12 +18,21 @@ class Ranks {
constructor() {
this.updateRanking = this.updateRanking.bind(this);
this.resetDailyRanking = this.resetDailyRanking.bind(this);
+ this.prevTop = [];
+ this.ranks = {
+ dailyRanking: [],
+ ranking: [],
+ };
- this.ranks = {};
+ this.loadPrevDayTop();
setInterval(this.updateRanking, 5 * MINUTE);
DailyCron.hook(this.resetDailyRanking);
}
+ async loadPrevDayTop() {
+ this.prevTop = await loadDailyTop();
+ }
+
async updateRanking() {
// recalculate ranking column
await Model.query(
@@ -36,6 +46,7 @@ class Ranks {
// populate dictionaries
const ranking = await RegUser.findAll({
attributes: [
+ 'id',
'name',
'totalPixels',
'ranking',
@@ -57,6 +68,7 @@ class Ranks {
});
const dailyRanking = await RegUser.findAll({
attributes: [
+ 'id',
'name',
'totalPixels',
'ranking',
@@ -81,6 +93,7 @@ class Ranks {
}
async resetDailyRanking() {
+ this.prevTop = await saveDailyTop(this.ranks.dailyRanking);
logger.info('Resetting Daily Ranking');
await RegUser.update({ dailyTotalPixels: 0 }, { where: {} });
await this.updateRanking();
diff --git a/src/data/models/RedisCanvas.js b/src/data/models/RedisCanvas.js
index a51b24d1..c19e0c20 100644
--- a/src/data/models/RedisCanvas.js
+++ b/src/data/models/RedisCanvas.js
@@ -88,8 +88,7 @@ class RedisCanvas {
const key = `ch:${canvasId}:${i}:${j}`;
if (!chunks.has(key)) {
- const is3D = canvases[canvasId].v;
- if (is3D) {
+ if (canvases[canvasId].v) {
await redis.setAsync(key, THREE_EMPTY_CHUNK_BUFFER, 'NX');
} else {
await redis.setAsync(key, EMPTY_CHUNK_BUFFER, 'NX');
diff --git a/src/data/models/prevDayTop.js b/src/data/models/prevDayTop.js
new file mode 100644
index 00000000..bbc6b172
--- /dev/null
+++ b/src/data/models/prevDayTop.js
@@ -0,0 +1,30 @@
+/*
+ * saving and loading the top 10 of the previous day
+ */
+
+import redis from '../redis';
+import logger from '../../core/logger';
+
+const PREV_DAILY_TOP_KEY = 'prevtop';
+
+/*
+ * saves the top 10 into redis
+ * @param dailyRanking Array of dailyRanking
+ */
+export async function saveDailyTop(dailyRanking) {
+ const top10 = dailyRanking.slice(10).map((user) => user.id);
+ const jsonTop = JSON.stringify(top10);
+ logger.info(`Saving current daily top 10 into redis: ${jsonTop}`);
+ await redis.setAsync(PREV_DAILY_TOP_KEY, jsonTop);
+ return top10;
+}
+
+/*
+ * load top10 from redis
+ * @return Promis Array of user IDs of the top 10
+ */
+export async function loadDailyTop() {
+ const jsonTop = await redis.getAsync(PREV_DAILY_TOP_KEY);
+ logger.info(`Loaded current daily top 10 into redis: ${jsonTop}`);
+ return (jsonTop) ? JSON.parse(jsonTop) : [];
+}
diff --git a/src/reducers/canvas.js b/src/reducers/canvas.js
index 42c6c006..8c9b9fbc 100644
--- a/src/reducers/canvas.js
+++ b/src/reducers/canvas.js
@@ -62,9 +62,9 @@ function getViewFromURL(canvases: Object) {
const canvas = (canvasId === null)
? canvases[DEFAULT_CANVAS_ID]
: canvases[canvasId];
+ const clrIgnore = canvas.cli || 0;
const {
colors,
- cli: clrIgnore,
sd: canvasStartDate,
size: canvasSize,
} = canvas;
@@ -120,8 +120,8 @@ function getViewFromURL(canvases: Object) {
canvasStartDate: null,
canvasMaxTiledZoom: getMaxTiledZoom(canvasd.size),
palette: new Palette(canvasd.colors, 0),
- clrIgnore: canvasd.cli,
- selectedColor: canvasd.cli,
+ clrIgnore: canvasd.cli || 0,
+ selectedColor: canvasd.cli || 0,
view: [0, 0, 0],
viewscale: DEFAULT_SCALE,
scale: DEFAULT_SCALE,
@@ -267,12 +267,12 @@ export default function canvasReducer(
canvasId = DEFAULT_CANVAS_ID;
canvas = canvases[DEFAULT_CANVAS_ID];
}
+ const clrIgnore = canvas.cli || 0;
const {
size: canvasSize,
sd: canvasStartDate,
ident: canvasIdent,
v: is3D,
- cli: clrIgnore,
colors,
} = canvas;
// get previous view, scale and viewscale if possible
@@ -334,13 +334,14 @@ export default function canvasReducer(
canvasId = DEFAULT_CANVAS_ID;
canvasIdent = canvases[DEFAULT_CANVAS_ID].ident;
}
+ const canvas = canvases[canvasId];
+ const clrIgnore = canvas.cli || 0;
+ const is3D = !!canvases.v;
const {
size: canvasSize,
sd: canvasStartDate,
- v: is3D,
- cli: clrIgnore,
colors,
- } = canvases[canvasId];
+ } = canvas;
const palette = new Palette(colors, 0);
if (!is3D) {
diff --git a/src/ui/placePixel.js b/src/ui/placePixel.js
index 55873d0d..8fdbf785 100644
--- a/src/ui/placePixel.js
+++ b/src/ui/placePixel.js
@@ -242,6 +242,10 @@ export function receivePixelReturn(
errorTitle = t`No Proxies Allowed :(`;
msg = t`You are using a Proxy.`;
break;
+ case 12:
+ errorTitle = t`Not allowed`;
+ msg = t`Just the Top10 of yesterday can place here`;
+ break;
default:
errorTitle = t`Weird`;
msg = t`Couldn't set Pixel`;
diff --git a/webpack.config.client.babel.js b/webpack.config.client.babel.js
index e902a61f..58a7f1b5 100644
--- a/webpack.config.client.babel.js
+++ b/webpack.config.client.babel.js
@@ -178,11 +178,12 @@ export function buildWebpackClientConfig(
chunkModules: false,
},
- cache: {
- type: 'filesystem',
- name: (development) ? `${locale}-dev` : locale,
- buildDependencies,
- },
+ cache: (extract) ? false
+ : {
+ type: 'filesystem',
+ name: (development) ? `${locale}-dev` : locale,
+ buildDependencies,
+ },
};
}