diff --git a/README.md b/README.md index 9ee82d8..2ee209b 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 6fe79b4..97d8785 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 c6d228f..4c2a329 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 98cceb5..45e578d 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 32e7777..8bb10e9 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 0000000..752c718 Binary files /dev/null and b/public/loading8.png differ diff --git a/public/preview8.png b/public/preview8.png new file mode 100644 index 0000000..db7af01 Binary files /dev/null and b/public/preview8.png differ diff --git a/src/canvases.json b/src/canvases.json index ddd2581..ed049e0 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 829b8d1..77c2a4c 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 45af014..31caa6b 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 9932e6f..3317723 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 6704ada..57fa236 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 1f4cf96..7ad33fd 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 8308f49..b01a855 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 a51b24d..c19e0c2 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 0000000..bbc6b17 --- /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 42c6c00..8c9b9fb 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 55873d0..8fdbf78 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 e902a61..58a7f1b 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, + }, }; }