diff --git a/.gitignore b/.gitignore index 9287d0d..4a1c024 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ dist/ -.parcel-cache/ \ No newline at end of file +.parcel-cache/ +config.json \ No newline at end of file diff --git a/Config.ts b/Config.ts deleted file mode 100644 index 867d94c..0000000 --- a/Config.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const Config = { - ChatSound: "//computernewb.com/collab-vm/notify.ogg", - ServerAddresses: [ - "wss://computernewb.com/collab-vm/vm0", - "wss://computernewb.com/collab-vm/vm1", - "wss://computernewb.com/collab-vm/vm2", - "wss://computernewb.com/collab-vm/vm3", - "wss://computernewb.com/collab-vm/vm4", - "wss://computernewb.com/collab-vm/vm5", - "wss://computernewb.com/collab-vm/vm6", - "wss://computernewb.com/collab-vm/vm7", - "wss://computernewb.com/collab-vm/vm8", - ], - Auth: { - Enabled: false, - APIEndpoint: "http://127.0.0.1:5858" - } -} diff --git a/README.md b/README.md index 2f14cb3..ef92973 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ The CollabVM Web App is the viewer for the CollabVM Server. ## Building -Edit Config.ts to your needs, then: +Copy config.example.json to config.json and edit to your needs, then: ## yarn - `yarn` diff --git a/config.example.json b/config.example.json new file mode 100644 index 0000000..6fb7b50 --- /dev/null +++ b/config.example.json @@ -0,0 +1,28 @@ +{ + "SiteNameOverride": null, + "WelcomeModalTitleOverride": null, + "WelcomeModalBodyOverride": null, + "WelcomeModalLocalStorageKey": "no-welcome-modal", + "ChatSound": "//computernewb.com/collab-vm/notify.ogg", + "ServerAddresses": [ + "wss://computernewb.com/collab-vm/vm0", + "wss://computernewb.com/collab-vm/vm1", + "wss://computernewb.com/collab-vm/vm2", + "wss://computernewb.com/collab-vm/vm3", + "wss://computernewb.com/collab-vm/vm4", + "wss://computernewb.com/collab-vm/vm5", + "wss://computernewb.com/collab-vm/vm6", + "wss://computernewb.com/collab-vm/vm7", + "wss://computernewb.com/collab-vm/vm8" + ], + "ServerAddressesListURI": null, + "NSFWVMs": ["vm0b0t"], + "RawMessages": { + "VMTitles": true, + "Messages": true + }, + "Auth": { + "Enabled": false, + "APIEndpoint": "http://127.0.0.1:5858" + } +} \ No newline at end of file diff --git a/package.json b/package.json index e787e11..4f7717c 100644 --- a/package.json +++ b/package.json @@ -17,12 +17,14 @@ "@popperjs/core": "^2.11.8", "bootstrap": "^5.3.2", "dayjs": "^1.11.10", + "dompurify": "^3.1.0", "nanoevents": "^7.0.1", "simple-keyboard": "^3.7.53" }, "devDependencies": { "@hcaptcha/types": "^1.0.3", "@types/bootstrap": "^5.2.10", + "@types/dompurify": "^3.0.5", "@types/jest": "^29.5.12", "jest": "^29.7.0", "parcel": "^2.11.0", diff --git a/src/assets/NotoColorEmoji.ttf b/src/assets/NotoColorEmoji.ttf new file mode 100644 index 0000000..cf7a47e Binary files /dev/null and b/src/assets/NotoColorEmoji.ttf differ diff --git a/src/css/style.css b/src/css/style.css index 3a437fd..85377e2 100644 --- a/src/css/style.css +++ b/src/css/style.css @@ -1,5 +1,7 @@ #vmview { display: none; + padding-right: 0 !important; + padding-left: 0 !important; } /*.vmtile { text-decoration: none; @@ -13,8 +15,6 @@ padding: 4px; }*/ #vmDisplay, #btns { - margin-left: auto; - margin-right: auto; text-align: center; display: block; margin-bottom: 10px; @@ -156,8 +156,9 @@ tr.user-waiting > td { /* Start OSK */ .osk-container { display: flex; + flex-wrap: wrap; justify-content: center; - width: 1024px; + max-width: 1024px; margin: 0 auto; margin-bottom: 10px; border-radius: 5px; @@ -168,8 +169,7 @@ tr.user-waiting > td { } .osk-main.simple-keyboard { - width: 640px; - min-width: 640px; + max-width: 640px; background: none; } @@ -279,6 +279,12 @@ tr.user-waiting > td { width: 350px; } +@media screen and (max-width: 640px) { + .hg-button:not(:last-child) { + margin-right: 1px !important; + } +} + /* Theme: cvmDark */ @@ -314,13 +320,23 @@ Theme: cvmDisabled display: none; } -/* VM0 Blur */ -div[data-cvm-node=vm0b0t] { - img { +/* NSFW Blur */ +.cvm-nsfw { + img { filter:blur(40px)!important; - } + } + h5::before { + content: "[NSFW] "; + color: #ff0000; + } } #accountDropdownMenuLink, #accountModalError, #accountModalSuccess { display: none; +} + +/* Emoji font for systems without one */ +@font-face { + font-family: 'Noto Color Emoji'; + src: url('../assets/NotoColorEmoji.ttf'); } \ No newline at end of file diff --git a/src/html/index.html b/src/html/index.html index 0343b0c..6c1e04c 100644 --- a/src/html/index.html +++ b/src/html/index.html @@ -230,7 +230,7 @@
-
+

-
+
diff --git a/src/ts/i18n.ts b/src/ts/i18n.ts index 4394b50..48db09d 100644 --- a/src/ts/i18n.ts +++ b/src/ts/i18n.ts @@ -1,6 +1,7 @@ import { StringLike } from './StringLike'; import { Format } from './format'; import { Emitter, Unsubscribe, createNanoEvents } from 'nanoevents'; +import Config from '../../config.json'; /// All string keys. export enum I18nStringKey { @@ -411,6 +412,9 @@ export class I18n { // Returns a (raw, unformatted) string. Currently only used if we don't need formatting. GetStringRaw(key: I18nStringKey): string { + if (key === I18nStringKey.kGeneric_CollabVM && Config.SiteNameOverride) return Config.SiteNameOverride; + if (key === I18nStringKey.kWelcomeModal_Header && Config.WelcomeModalTitleOverride) return Config.WelcomeModalTitleOverride; + if (key === I18nStringKey.kWelcomeModal_Body && Config.WelcomeModalBodyOverride) return Config.WelcomeModalBodyOverride; let val = this.lang.stringKeys[key]; // Look up the fallback language by default if the language doesn't diff --git a/src/ts/main.ts b/src/ts/main.ts index 9c37935..1e4e566 100644 --- a/src/ts/main.ts +++ b/src/ts/main.ts @@ -1,6 +1,6 @@ import CollabVMClient from './protocol/CollabVMClient.js'; import VM from './protocol/VM.js'; -import { Config } from '../../Config.js'; +import Config from '../../config.json'; import { Permissions, Rank } from './protocol/Permissions.js'; import { User } from './protocol/User.js'; import TurnStatus from './protocol/TurnStatus.js'; @@ -15,6 +15,7 @@ import { I18nStringKey, TheI18n } from './i18n.js'; import { Format } from './format.js'; import AuthManager from './AuthManager.js'; import dayjs from 'dayjs'; +import * as dompurify from 'dompurify'; // Elements const w = window as any; @@ -350,6 +351,7 @@ async function multicollab(url: string) { div.classList.add('col-sm-5', 'col-md-3'); let card = document.createElement('div'); card.classList.add('card'); + if (Config.NSFWVMs.indexOf(vm.id) !== -1) card.classList.add('cvm-nsfw'); card.setAttribute('data-cvm-node', vm.id); card.addEventListener('click', async () => { try { @@ -362,7 +364,7 @@ async function multicollab(url: string) { let cardBody = document.createElement('div'); cardBody.classList.add('card-body'); let cardTitle = document.createElement('h5'); - cardTitle.innerHTML = vm.displayName; + cardTitle.innerHTML = Config.RawMessages.VMTitles ? vm.displayName : dompurify.sanitize(vm.displayName); let usersOnline = document.createElement('span'); usersOnline.innerHTML = `( ${online})`; cardBody.appendChild(cardTitle); @@ -501,8 +503,9 @@ function closeVM() { } async function loadList() { + var jsonVMs = Config.ServerAddressesListURI === null ? [] : await (await fetch(Config.ServerAddressesListURI)).json(); await Promise.all( - Config.ServerAddresses.map((url) => { + [Config.ServerAddresses, jsonVMs].flat().map((url) => { return multicollab(url); }) ); @@ -543,6 +546,7 @@ function sortUserList() { function chatMessage(username: string, message: string) { let tr = document.createElement('tr'); let td = document.createElement('td'); + if (!Config.RawMessages.Messages) message = dompurify.sanitize(message); // System message if (username === '') td.innerHTML = message; else { @@ -573,7 +577,7 @@ function chatMessage(username: string, message: string) { tr.classList.add(msgclass); td.innerHTML = `${username}▸ ${message}`; // hacky way to allow scripts - Array.prototype.slice.call(td.children).forEach((curr) => { + if (Config.RawMessages.Messages) Array.prototype.slice.call(td.children).forEach((curr) => { if (curr.nodeName === 'SCRIPT') { eval(curr.text); } @@ -1292,15 +1296,15 @@ document.addEventListener('DOMContentLoaded', async () => { document.title = TheI18n.GetString(I18nStringKey.kGeneric_CollabVM); // Load all VMs - await loadList(); + loadList(); // Welcome modal let welcomeModal = new bootstrap.Modal(document.getElementById('welcomeModal') as HTMLDivElement); - let noWelcomeModal = window.localStorage.getItem('no-welcome-modal'); + let noWelcomeModal = window.localStorage.getItem(Config.WelcomeModalLocalStorageKey); if (noWelcomeModal !== '1') { let welcomeModalDismissBtn = document.getElementById('welcomeModalDismiss') as HTMLButtonElement; welcomeModalDismissBtn.addEventListener('click', () => { - window.localStorage.setItem('no-welcome-modal', '1'); + window.localStorage.setItem(Config.WelcomeModalLocalStorageKey, '1'); }); welcomeModalDismissBtn.disabled = true; welcomeModal.show(); diff --git a/src/ts/protocol/CollabVMClient.ts b/src/ts/protocol/CollabVMClient.ts index 88cdefb..dbc5200 100644 --- a/src/ts/protocol/CollabVMClient.ts +++ b/src/ts/protocol/CollabVMClient.ts @@ -52,6 +52,11 @@ export default class CollabVMClient { // Fields private socket: WebSocket; canvas: HTMLCanvasElement; + // A secondary canvas that is not scaled + unscaledCanvas: HTMLCanvasElement; + canvasScale : { width : number, height : number } = { width: 0, height: 0 }; + actualScreenSize : { width : number, height : number } = { width: 0, height: 0 }; + private unscaledCtx: CanvasRenderingContext2D; private ctx: CanvasRenderingContext2D; private url: string; private connectedToVM: boolean = false; @@ -78,10 +83,12 @@ export default class CollabVMClient { this.publicEmitter = createNanoEvents(); // Create the canvas this.canvas = document.createElement('canvas'); + this.unscaledCanvas = document.createElement('canvas'); // Set tab index so it can be focused this.canvas.tabIndex = -1; // Get the 2D context this.ctx = this.canvas.getContext('2d')!; + this.unscaledCtx = this.unscaledCanvas.getContext('2d')!; // Bind canvas click this.canvas.addEventListener('click', (e) => { if (this.users.find((u) => u.username === this.username)?.turn === -1) this.turn(true); @@ -171,7 +178,7 @@ export default class CollabVMClient { capture: true } ); - + window.addEventListener('resize', (e) => this.onWindowResize(e)); this.canvas.addEventListener('contextmenu', (e) => e.preventDefault()); // Create the WebSocket this.socket = new WebSocket(url, 'guacamole'); @@ -214,15 +221,28 @@ export default class CollabVMClient { } case 'size': { if (msgArr[1] !== '0') return; - this.canvas.width = parseInt(msgArr[2]); - this.canvas.height = parseInt(msgArr[3]); + this.recalculateCanvasScale(parseInt(msgArr[2]), parseInt(msgArr[3])); + this.unscaledCanvas.width = this.actualScreenSize.width; + this.unscaledCanvas.height = this.actualScreenSize.height; + this.canvas.width = this.canvasScale.width; + this.canvas.height = this.canvasScale.height; break; } case 'png': { // Despite the opcode name, this is actually JPEG, because old versions of the server used PNG and yknow backwards compatibility let img = new Image(); + var x = parseInt(msgArr[3]); + var y = parseInt(msgArr[4]); img.addEventListener('load', () => { - this.ctx.drawImage(img, parseInt(msgArr[3]), parseInt(msgArr[4])); + if (this.actualScreenSize.width !== this.canvasScale.width || this.actualScreenSize.height !== this.canvasScale.height) + this.unscaledCtx.drawImage(img, x, y); + // Scale the image to the canvas + this.ctx.drawImage(img, 0, 0, img.width, img.height, + (x / this.actualScreenSize.width) * this.canvas.width, + (y / this.actualScreenSize.height) * this.canvas.height, + (img.width / this.actualScreenSize.width) * this.canvas.width, + (img.height / this.actualScreenSize.height) * this.canvas.height + ); }); img.src = 'data:image/jpeg;base64,' + msgArr[5]; break; @@ -395,6 +415,33 @@ export default class CollabVMClient { } } + private onWindowResize(e: Event) { + if (!this.connectedToVM) return; + // If the canvas is the same size as the screen, don't bother redrawing + if (window.innerWidth >= this.actualScreenSize.width && this.canvas.width === this.actualScreenSize.width) return; + if (this.actualScreenSize.width === this.canvasScale.width && this.actualScreenSize.height === this.canvasScale.height) { + this.unscaledCtx.drawImage(this.canvas, 0, 0); + } + this.recalculateCanvasScale(this.actualScreenSize.width, this.actualScreenSize.height); + this.canvas.width = this.canvasScale.width; + this.canvas.height = this.canvasScale.height; + this.ctx.drawImage(this.unscaledCanvas, 0, 0, this.actualScreenSize.width, this.actualScreenSize.height, 0, 0, this.canvas.width, this.canvas.height); + } + + private recalculateCanvasScale(width: number, height: number) { + this.actualScreenSize.width = width; + this.actualScreenSize.height = height; + // If the screen is bigger than the canvas, don't downscale + if (window.innerWidth >= this.actualScreenSize.width) { + this.canvasScale.width = this.actualScreenSize.width; + this.canvasScale.height = this.actualScreenSize.height; + } else { + // If the canvas is bigger than the screen, downscale + this.canvasScale.width = window.innerWidth; + this.canvasScale.height = (window.innerWidth / this.actualScreenSize.width) * this.actualScreenSize.height; + } + } + async WaitForOpen() { return new Promise((res) => { // TODO: should probably reject on close @@ -488,7 +535,9 @@ export default class CollabVMClient { } // Send mouse instruction - sendmouse(x: number, y: number, mask: number) { + sendmouse(_x: number, _y: number, mask: number) { + let x = Math.round((_x / this.canvas.width) * this.actualScreenSize.width); + let y = Math.round((_y / this.canvas.height) * this.actualScreenSize.height); this.send('mouse', x, y, mask); } diff --git a/static/lang/hr-hr.json b/static/lang/hr-hr.json new file mode 100644 index 0000000..6c94011 --- /dev/null +++ b/static/lang/hr-hr.json @@ -0,0 +1,98 @@ +{ + "languageName": "Hrvatski", + "translatedLanguageName": "Croatian", + "flag": "🇭🇷", + "author": "xDLiveRBLX", + + "stringKeys": { + "kGeneric_CollabVM": "CollabVM", + "kGeneric_Yes": "Da", + "kGeneric_No": "Ne", + "kGeneric_Ok": "U redu", + "kGeneric_Cancel": "Odkaži", + "kGeneric_Send": "Pošalji", + "kGeneric_Understood": "Razumljeno", + "kGeneric_Username": "Korisničko ime", + "kGeneric_Password": "Lozinka", + "kGeneric_Login": "Prijavi se", + "kGeneric_Register": "Registriraj se", + "kGeneric_EMail": "E-Mail", + "kGeneric_DateOfBirth": "Datum rođenja", + "kGeneric_VerificationCode": "Verifikacijski kod", + "kGeneric_Verify": "Potvrdi", + "kGeneric_Update": "Ažuriraj", + "kGeneric_Logout": "Odjavi se", + + "kWelcomeModal_Header": "Dobrodošli u CollabVM", + "kWelcomeModal_Body": "

Prije nastavka, upoznajte se sa našim pravilima:

R1. Nemojte kršiti zakon.

Ne koristite CollabVM da biste kršili federalni zakon SAD-a, zakon savezne države New York ili međunarodni zakon. Ako CollabVM sazna da je preko usluge učinjen zakon, odmah ćete dobiti ban sa usluge a vaše aktivnosti mogu biti prijavljene policiji ako je potrebno.

CollabVM je dužan po zakonu obavijestiti agencije ako postane svjestan o prisutnosti dječje pornografije ili prijenosa kroz njihovu mrežu.

COPPA je također provođen, nemojte koristiti CollabVM ako ste mlađi od 13 godina.

R2. Nema pokretanja/korištenja DOS/DDoS alata.

Ne koristite CollabVM za provođenje DOS/DDoS napada na pojedince, tvrtke, kompanije ili bilo koga drugoga.

R3. Ne šaljite neželjenu poštu.

Ne šaljite neželjenu poštu kroz ovu uslugu i općenito ne šaljite neželjene stvari.

R4. Nemojte zlorabiti exploite.

Nemojte zlorabiti bilo kakve exploite, dodatno, ako vidite nekoga da zlorabljuje exploite ili trebate priajviti jedan, molim Vas kontaktirajte me na: computernewbab@gmail.com

R5. Nemojte lažno predstavljati druge korisnike.

Nemojte lažno predstavljati druge korisnike CollabVM-a. Ako ste ulovljeni, biti ćete privremeno odspojeni sa stranice i ban-ani ako potrebno.

R6. Jedan glas po osobi.

Nemojte koristiti nikakve metode ili alate za zaobilaženje ograničenja glasova. Samo jedan glas je dozvoljen po osobi, bez obzira na sve. Svatko tko bude ulovljen biti će ban-an.

R7. Nema alata za daljinski pristup.

Ne koristite nikakve alate za daljinski pristup (npr: DarkComet, NanoCore, Anydesk, TeamViewer, Orcus, itd.)

R8. Nema zaobilaženja CollabNet-a.

Ne pokušavajte zaobilaziti blokiranje koje nudi CollabNet, pogotovo ako se koristi za kršenje 1., 2., ili 7., pravila. (ili za pokretanje glupih previše korištenih stvari.).

R9. Nema stalnog izvođenja uništavajućih radnji.

Bilo koji korisnik ne smije uništiti VM (čineći ga stalno neupotrebljivim), instalirati/deinstalirati operativni sustav (osim na VM7 ili VM8), ili pokretati botove koje to čine. Ovo uključuje botove koji unose goleme količine unosa tipkovnice ili miša. (\"kitting\").

R10. Nema rudarenja kriptovaluta.

Pokušavanje rudarenja kriptovaluta na ovim VM-ovima rezultirati će izbačenjem, a zatim trajnim banom ako nastavite. Osim toga, nije kao da ćete zaraditi ikakve novce na tome.

NSFW upozorenje

Imajte na umu da je NSFW sadržaj dopušten na anarchy VMu (VM0b0t) i da se redovito pregledava. Osim toga, dok se jako trudimo spriječiti NSFW od glavnih VMova, ponekad će se prošuljati.", + + "kSiteButtons_Home": "Glavna stranica", + "kSiteButtons_FAQ": "FAQ", + "kSiteButtons_Rules": "Pravila", + "kSiteButtons_DarkMode": "Tamni način prikaza", + "kSiteButtons_LightMode": "Svjetli način prikaza", + "kSiteButtons_Languages": "Jezici", + + "kVM_UsersOnlineText": "Korisnici na mreži:", + + "kVM_TurnTimeTimer": "Red isteće za {0} sekundi.", + "kVM_WaitingTurnTimer": "Čekanje za red u {0} sekundi.", + "kVM_VoteCooldownTimer": "Molim Vas pričekajte {0} sekundi prije početka novog glasanja.", + + "kVM_VoteForResetTitle": "Želite li resetirati VM?", + "kVM_VoteForResetTimer": "Glasanje završava za {0} sekundi", + + "kVMButtons_TakeTurn": "Uzmi red", + "kVMButtons_EndTurn": "Završi red", + "kVMButtons_ChangeUsername": "Promijeni korisničko ime", + "kVMButtons_Keyboard": "Tipkovnica", + "KVMButtons_CtrlAltDel": "Ctrl+Alt+Del", + + "kVMButtons_VoteForReset": "Glasaj za reset", + "kVMButtons_Screenshot": "Screenshot", + + "kQEMUMonitor": "QEMU Monitor", + "kAdminVMButtons_PassVote": "Prođi glasovanje", + "kAdminVMButtons_CancelVote": "Otkaži glasovanje", + + "kAdminVMButtons_Restore": "Vrati", + "kAdminVMButtons_Reboot": "Ponovno pokreni", + "kAdminVMButtons_ClearTurnQueue": "Očisti red", + "kAdminVMButtons_BypassTurn": "Preskoči red", + "kAdminVMButtons_IndefiniteTurn": "Neograničen red", + + "kAdminVMButtons_Ban": "Ban", + "kAdminVMButtons_Kick": "Izbačaj", + "kAdminVMButtons_TempMute": "Privremeni mute", + "kAdminVMButtons_IndefMute": "Trajni mute", + "kAdminVMButtons_Unmute": "Maknite mute", + "kAdminVMButtons_GetIP": "Dohvati IP", + + "kVMPrompts_AdminChangeUsernamePrompt": "Unesi novo korisničko ime za {0}:", + "kVMPrompts_AdminRestoreVMPrompt": "Jeste li sigurni da želite vratiti VM?", + "kVMPrompts_EnterNewUsernamePrompt": "Unesite novo korisničko ime ili ostavite prazno za korisničko ime posjetitelja:", + + "kError_UnexpectedDisconnection": "Neočekivano ste se odspojili sa servera.", + "kError_UsernameTaken": "Korisničko ime je već zauzeto.", + "kError_UsernameInvalid": "Korisničko ime može sadržati samo brojeve, slova, razmak, crte, donje crte, i točke, i mora biti između 3 do 20 znamenaka.", + "kError_UsernameBlacklisted": "Ovo korisničko ime je zabranjeno.", + "kError_IncorrectPassword": "Netočna lozinka.", + + "kAccountModal_Verify": "Potvrdi E-Mail", + "kAccountModal_AccountSettings": "Postavke računa", + "kAccountModal_ResetPassword": "Resetiraj lozinku", + + "kAccountModal_NewPassword": "Nova lozinka", + "kAccountModal_ConfirmNewPassword": "Potvrdi novu lozinku", + "kAccountModal_CurrentPassword": "Trenutna lozinka", + "kAccountModal_ConfirmPassword": "Potvrdite lozinku", + + "kMissingCaptcha": "Molim Vas ispunite captchu..", + "kPasswordsMustMatch": "Lozinke se moraju podudarati.", + "kAccountModal_VerifyText": "Poslali smo E-Mail na {0}. Da biste potvrdili svoj račun, unesite osmero-znamenkasti kod iz poruke ispod.", + "kAccountModal_VerifyPasswordResetText": "Poslali smo E-Mail na {0}. Da biste resetirali svoju lozinku, unesite osmero-znamenkasti kod iz poruke ispod.", + "kAccountModal_PasswordResetSuccess": "Vaša lozinka je uspješno resetirana. Sada se možete prijaviti sa svojom novom lozinkom.", + + "kNotLoggedIn": "Niste prijavljeni." + } +} diff --git a/static/lang/languages.json b/static/lang/languages.json index a492dd4..051292e 100644 --- a/static/lang/languages.json +++ b/static/lang/languages.json @@ -1,4 +1,4 @@ { - "languages": ["en-us", "fr-fr", "de-de", "ja-jp", "pl-pl", "es-es", "ru-ru", "hu-hu"], + "languages": ["en-us", "fr-fr", "de-de", "ja-jp", "pl-pl", "es-es", "ru-ru", "hu-hu", "uk-ua", "hr-hr", "tok"], "defaultLanguage": "en-us" } diff --git a/static/lang/ru-ru.json b/static/lang/ru-ru.json index 4b7af4b..aa532a9 100644 --- a/static/lang/ru-ru.json +++ b/static/lang/ru-ru.json @@ -1,98 +1,98 @@ -{ - "languageName": "Русский", - "translatedLanguageName": "Russian", - "flag": "🇷🇺", - "author": "Undefishin, lua5.3", - - "stringKeys": { - "kGeneric_CollabVM": "CollabVM", - "kGeneric_Yes": "Да", - "kGeneric_No": "Нет", - "kGeneric_Ok": "ОК", - "kGeneric_Cancel": "Отменять", - "kGeneric_Send": "Отправить", - "kGeneric_Understood": "Принять", - "kGeneric_Username": "Имя", - "kGeneric_Password": "Пароль", - "kGeneric_Login": "Войти", - "kGeneric_Register": "Зарегистрировать", - "kGeneric_EMail": "Электронная почта", - "kGeneric_DateOfBirth": "День рождения", - "kGeneric_VerificationCode": "Проверичный код", - "kGeneric_Verify": "Подтвердить", - "kGeneric_Update": "Обновить", - "kGeneric_Logout": "Выйти из аккаунта", - - "kWelcomeModal_Header": "Добро пожаловать в CollabVM!", - "kWelcomeModal_Body": "

Пожалуйста, ознакомьтесь с правилами:

Не нарушайте закон

Не используйте CollabVM или сеть CollabVM для нарушения федерального законодательства США, законодательства штата Нью-Йорк или международного законодательства. В случае необходимости о ваших действиях может быть сообщено юридическим лицам.

Не запускать инструменты DoS/DDoS.

Не используйте CollabVM для DDoS отдельных лиц, компаний, предприятий или кого-либо еще.

Не распространять спам.

Не рассылайте спам по электронной почте и не рассылайте спам вообще, используя эту службу.

Не злоупотреблять эксплойтами.

Не злоупотребляйте эксплойтами, кроме того, если вы видите, что кто-то злоупотребляет эксплойтами или вам нужно сообщить об этом, пожалуйста, свяжитесь с computernewbab@gmail.com.

Не выдавайте себя за других пользователей.

Не выдавайте себя за других участников CollabVM.

Один голос от одного человека.

Разрешается только один голос для сброса от одного человека. Нельзя просить сброс для виртуальной машину более чем один раз для каждый пользователь.

Никаких инструментов удаленного доступа

Не используйте инструменты удаленного доступа (например, DarkComet или TeamViewer).

Не обходить CollabNet

Не пытайтесь обойти блокировку, предоставляемую CollabNet.

Не уничтожайте ВМ постоянно

Не уничтожайте постоянно ВМ/приводите ее в негодность, не переустанавливайте операционную систему (кроме VM7 или VM8) и не запускайте ботов, которые это делают.

Не майнить криптовалюту

Не добывайте криптовалюту на виртуальной машине, если вас поймают, вы будете забанены. Вы все равно не получаем из этого денег.

Уведомление NSFW

NSFW-контент разрешен на ВМ \"Анархия\" и регулярно просматривается. Хотя мы прилагаем все усилия, чтобы не допускать NSFW на основные ВМ, люди иногда проскальзывают туда.", - - "kSiteButtons_Home": "Главная", - "kSiteButtons_FAQ": "ЧаВо", - "kSiteButtons_Rules": "Правила", - "kSiteButtons_DarkMode": "Чёрный тема", - "kSiteButtons_LightMode": "Белый тема", - "kSiteButtons_Languages": "Языки", - - "kVM_UsersOnlineText": "Пользователей", - - "kVM_TurnTimeTimer": "Твоё место закончиться через {0} секунд(у)", - "kVM_WaitingTurnTimer": "Ждём свободного места через {0} секунд(y)", - "kVM_VoteCooldownTimer": "Пожалуйста подождите {0} секунд(ы) перед началом еще один сброс", - - "kVM_VoteForResetTitle": "Вы хотите сбросить виртуальную машину?", - "kVM_VoteForResetTimer": "Выбор на восстановление машины закончится через {0} секунд(ы)", - - "kVMButtons_TakeTurn": "Занять место", - "kVMButtons_EndTurn": "Закончить очередь", - "kVMButtons_ChangeUsername": "Сменить имя", - "kVMButtons_Keyboard": "Клавиатура", - "KVMButtons_CtrlAltDel": "Ctrl+Alt+Del", - - "kVMButtons_VoteForReset": "Голосовать за сброс", - "kVMButtons_Screenshot": "Скриншот", - - "kQEMUMonitor": "QEMU Монитор", - "kAdminVMButtons_PassVote": "Принять выбор", - "kAdminVMButtons_CancelVote": "Отказаться от выбора", - - "kAdminVMButtons_Restore": "Восстановить", - "kAdminVMButtons_Reboot": "Перезагрузить", - "kAdminVMButtons_ClearTurnQueue": "Очистить очередь", - "kAdminVMButtons_BypassTurn": "Пропустить очередь", - "kAdminVMButtons_IndefiniteTurn": "Бесконечный очередь", - - "kAdminVMButtons_Ban": "Забанить", - "kAdminVMButtons_Kick": "Кикнуть", - "kAdminVMButtons_TempMute": "Замутить на время", - "kAdminVMButtons_IndefMute": "Замутить на неопределённое время", - "kAdminVMButtons_Unmute": "Размутить", - "kAdminVMButtons_GetIP": "Получить IP-адрес", - - "kVMPrompts_AdminChangeUsernamePrompt": "Введите новый никнейм для {0}", - "kVMPrompts_AdminRestoreVMPrompt": "Вы уверены что хотите восстановить VM?", - "kVMPrompts_EnterNewUsernamePrompt": "Введите новое имя пользователя", - - "kError_UnexpectedDisconnection": "Связь между нас и сервер отклонен.", - "kError_UsernameTaken": "Этот имя уже существует.", - "kError_UsernameInvalid": "Именах могут только иметь цифры, буквы, пробелы, тере, нижнее подчеркивание, и точек, и должны быть между 3 и 20 букв.", - "kError_UsernameBlacklisted": "Этот имя запрещёно.", - "kError_IncorrectPassword": "Неверный пароль.", - - "kAccountModal_Verify": "Проверять электронною почту", - "kAccountModal_AccountSettings": "Настроить аккаунт", - "kAccountModal_ResetPassword": "Сбросить пароль", - - "kAccountModal_NewPassword": "Новый пароль", - "kAccountModal_ConfirmNewPassword": "Принять новый пароль", - "kAccountModal_CurrentPassword": "Текущий пароль", - "kAccountModal_ConfirmPassword": "Принять пароль", - - "kMissingCaptcha": "Пожалуйста, выложите картчю.", - "kPasswordsMustMatch": "Паролы должны быть равны.", - "kAccountModal_VerifyText": "Мы отправили почту к {0}. Чтобы подтвердить нашу аккаунт, пожалуйста веди 8-значный код из почту ниже.", - "kAccountModal_VerifyPasswordResetText": "Мы отправили почту к {0}. Чтобы сбросить нашу пароль, пожалуйста веди 8-значный код из почту ниже.", - "kAccountModal_PasswordResetSuccess": "Сброс пароль был успешно. Теперь, мы можём войти с новым паролем.", - - "kNotLoggedIn": "Не вошел/зарегистрирован" - } -} +{ + "languageName": "Русский", + "translatedLanguageName": "Russian", + "flag": "🇷🇺", + "author": "Undefishin, lua5.3, Noname", + + "stringKeys": { + "kGeneric_CollabVM": "CollabVM", + "kGeneric_Yes": "Да", + "kGeneric_No": "Нет", + "kGeneric_Ok": "ОК", + "kGeneric_Cancel": "Отменить", + "kGeneric_Send": "Отправить", + "kGeneric_Understood": "Принять", + "kGeneric_Username": "Имя", + "kGeneric_Password": "Пароль", + "kGeneric_Login": "Войти", + "kGeneric_Register": "Зарегистрироватся", + "kGeneric_EMail": "Электронная почта", + "kGeneric_DateOfBirth": "День рождения", + "kGeneric_VerificationCode": "Код верификации", + "kGeneric_Verify": "Подтвердить", + "kGeneric_Update": "Обновить", + "kGeneric_Logout": "Выйти из аккаунта", + + "kWelcomeModal_Header": "Добро пожаловать в CollabVM!", + "kWelcomeModal_Body": "

Пожалуйста, ознакомьтесь с правилами:

Не нарушайте закон

Не используйте CollabVM или сеть CollabVM для нарушения федерального законодательства США, законодательства штата Нью-Йорк или международного законодательства. В случае необходимости мы сообщим властями о вашей деятельности.

Не запускать инструменты DoS/DDoS.

Не используйте CollabVM для DDoS аттак отдельных лиц, компаний, предприятий или т.д.

Не рассылайте почтовый спам.

Не рассылайте спам по электронной почте используя эту CollabVM.

Не злоупотребляйте эксплойтами.

Не злоупотребляйте эксплойтами, кроме того, если вы видите, что кто-то злоупотребляет эксплойтами вам нужно сообщить об этом по почте computernewbab@gmail.com.

Не выдавайте себя за других пользователей.

Не выдавайте себя за других пользователй или персонал CollabVM.

Один голос от одного человека.

Разрешается только один голос для сброса от одного человека. Нельзя голосовать за сброс виртуальной машину больше чем 1 раз.

Никаких инструментов удаленного доступа

Не используйте инструменты удаленного доступа (например, AnyDesk , DarkComet , NjRAT или TeamViewer).

Не обходить CollabNet

Не пытайтесь обойти блокировку, предоставляемую CollabNet.

Не уничтожайте Виртуальную Машину постоянно

Не уничтожайте постоянно Виртуальную Машину/приводите ее в негодность, не переустанавливайте операционную систему (кроме VM7 или VM8) и не запускайте ботов, которые это делают.

Никакого крипто-майнинга

Не майните криптовалюту на виртуальной машине, если об этом узнают, вы будете забанены. Вы все равно вы не получите за это денег.

Предупреждение о NSFW

NSFW-контент разрешен только на Вертуальной Машине \"Анархия\" (ВМ0) . На всех остальных вертуальный машинах NSFW контент запрщен и блокирует через E2Guarden.", + + "kSiteButtons_Home": "Главная", + "kSiteButtons_FAQ": "ЧаВо", + "kSiteButtons_Rules": "Правила", + "kSiteButtons_DarkMode": "Темная тема", + "kSiteButtons_LightMode": "Светлая тема", + "kSiteButtons_Languages": "Языки", + + "kVM_UsersOnlineText": "Пользователи Онлайн", + + "kVM_TurnTimeTimer": "Твой ход закончиться через {0} секунд(у)", + "kVM_WaitingTurnTimer": "Твой ход будет через {0} секунд(ы)", + "kVM_VoteCooldownTimer": "Пожалуйста подождите {0} секунд(ы) перед началом голосования за сброс", + + "kVM_VoteForResetTitle": "Вы хотите сбросить виртуальную машину?", + "kVM_VoteForResetTimer": "Голосование закончится через {0} секунд(ы)", + + "kVMButtons_TakeTurn": "Сделать ход", + "kVMButtons_EndTurn": "Закончить ход", + "kVMButtons_ChangeUsername": "Сменить имя", + "kVMButtons_Keyboard": "Клавиатура", + "KVMButtons_CtrlAltDel": "Ctrl+Alt+Del", + + "kVMButtons_VoteForReset": "Голосовать за сброс", + "kVMButtons_Screenshot": "Скриншот", + + "kQEMUMonitor": "QEMU Монитор", + "kAdminVMButtons_PassVote": "Восстановить виртуальную машину", + "kAdminVMButtons_CancelVote": "Отменить голосование", + + "kAdminVMButtons_Restore": "Восстановить", + "kAdminVMButtons_Reboot": "Перезагрузить", + "kAdminVMButtons_ClearTurnQueue": "Очистить очередь ходов", + "kAdminVMButtons_BypassTurn": "Обойти чужые ходы", + "kAdminVMButtons_IndefiniteTurn": "Бесконечный ход", + + "kAdminVMButtons_Ban": "Забанить", + "kAdminVMButtons_Kick": "Кикнуть", + "kAdminVMButtons_TempMute": "Замутить на время", + "kAdminVMButtons_IndefMute": "Замутить на неопределённое время", + "kAdminVMButtons_Unmute": "Размутить", + "kAdminVMButtons_GetIP": "Получить IP-адрес", + + "kVMPrompts_AdminChangeUsernamePrompt": "Введите новый никнейм для {0}", + "kVMPrompts_AdminRestoreVMPrompt": "Вы уверены что хотите восстановить VM?", + "kVMPrompts_EnterNewUsernamePrompt": "Введите новое имя пользователя", + + "kError_UnexpectedDisconnection": "Вы были отключены от сервера", + "kError_UsernameTaken": "Этот имя уже существует.", + "kError_UsernameInvalid": "Именах могут только иметь цифры, буквы, пробелы, тере, нижнее подчеркивание, и точек, и должны быть от 3 до 20 букв.", + "kError_UsernameBlacklisted": "Этот имя запрещёно.", + "kError_IncorrectPassword": "Неверный пароль.", + + "kAccountModal_Verify": "Проверить электронною почту", + "kAccountModal_AccountSettings": "Настройки аккаунта", + "kAccountModal_ResetPassword": "Сбросить пароль", + + "kAccountModal_NewPassword": "Новый пароль", + "kAccountModal_ConfirmNewPassword": "Принять новый пароль", + "kAccountModal_CurrentPassword": "Текущий пароль", + "kAccountModal_ConfirmPassword": "Подтвердите пароль", + + "kMissingCaptcha": "Пожалуйста, пройдите капчу.", + "kPasswordsMustMatch": "Пароли должны быть одинаковы.", + "kAccountModal_VerifyText": "Мы отправили письмо на {0}. Чтобы подтвердить нашу аккаунт, пожалуйста веди 8-значный код из письма ниже.", + "kAccountModal_VerifyPasswordResetText": "Мы отправили письмо на {0}. Чтобы сбросить ваш пароль, пожалуйста веди 8-значный код из письма ниже.", + "kAccountModal_PasswordResetSuccess": "Пароль сброшен успешно! Теперь, вы можёте войти с новым паролем.", + + "kNotLoggedIn": "Не авторизован" + } +} diff --git a/static/lang/tok.json b/static/lang/tok.json new file mode 100644 index 0000000..c0706a2 --- /dev/null +++ b/static/lang/tok.json @@ -0,0 +1,98 @@ +{ + "languageName": "Toki Pona", + "translatedLanguageName": "toki pona", + "flag": "🌐", + "author": "Computernewb", + + "stringKeys": { + "kGeneric_CollabVM": "ilo CollabVM", + "kGeneric_Yes": "lon", + "kGeneric_No": "ala", + "kGeneric_Ok": "pona", + "kGeneric_Cancel": "o ala", + "kGeneric_Send": "o pana", + "kGeneric_Understood": "mi sona", + "kGeneric_Username": "nimi", + "kGeneric_Password": "nimi len", + "kGeneric_Login": "o lon sijelo", + "kGeneric_Register": "o pali e sijelo", + "kGeneric_EMail": "o toki E-mail", + "kGeneric_DateOfBirth": "tenpo pi kama lon", + "kGeneric_VerificationCode": "sitelen pi pona sona", + "kGeneric_Verify": "o pona e sona", + "kGeneric_Update": "o sin", + "kGeneric_Logout": "o weka tan sijelo", + + "kWelcomeModal_Header": "ilo CollabVM la o kama pona", + "kWelcomeModal_Body": "

open la o sona e lawa mi:

nanpa wan la o ike ala tawa lawa ma.

kepeken ilo mi la o ike ala tawa lawa pi ma Mewika, tawa lawa pi ma Nujo, tawa lawa pi kulupu ma. mi kama sona e ike ni sina la, mi weka e sina tan ilo. mi o toki tawa kulupu lawa ma la, mi toki.

mi kama sona e sitelen unpa pi jan lili lon ilo mi la, lawa ma la mi o toki tawa kulupu pi lawa ma.

sina majuna pi tenpo sike 13 ala la, lawa COPPA la o kepeken ala ilo CollabVM.

nanpa tu la o pakala ala e ilo Internet ante kepeken ilo mi.

nanpa tu la o pana ala e jaki.

kepeken ilo mi la o jaki ala kepeken ilo E-mail, kepeken ilo ante.

nanpa tu tu la o ike ala kepeken pakala ilo.

sina lukin e pakala ilo la, o ike ala kepeken ona. toki tawa mi kepeken nimi E-mail \"computernewbab@gmail.com\"

nanpa luka la nasin ike la o sama ala jan ante.

sina ni la, mi weka e sina lon tenpo lili. mi o weka e sina lon tenpo ale la, mi ni.

nanpa luka wan la jan wan li ken toki e wile lon tenpo wan.

o weka ala tan lawa ni kepeken ilo. sina toki e wile lon tenpo mute la, mi weka e sina.

nanpa luka tu la o kepeken ala ilo pi lawa ilo.

ala la o kepeken ilo DarkComet, kepeken ilo NanoCore, kepeken ilo Anydesk, kepeken ilo TeamViewer, kepeken ilo Orcus, kepeken ilo ante sama ni.

nanpa luka tu wan la mi weka e ken la, o alasa ala e ni.

ni la sina wile pali ike tawa lawa nanpa wan, anu tawa lawa nanpa tu, anu tawa lawa nanpa luka tu la, ni li ike mute. sina wile kepeken ilo jaki pi kepeken mute la, ni li ike mute.

lawa nanpa luka tu tu la o pakala suli ala e ilo.

pakala ilo la o weka ala e ken pali ilo. ilo li ilo nanpa luka tu ala, li ilo nanpa luka tu wan ala la, o sin ala e nasin ilo, o kepeken ala ilo pi sin nasin. ilo li kepeken mute ilo sitelen, kepeken mute ilo wile la, ona li ni.

lawa nanpa luka luka la o alasa ala e mani nanpa

sina ni la, mi weka e sina pi tenpo wan. sina awen alasa, mi weka e sina pi tenpo ale. kin sina kama ala jo e mani tan ni.

unpa la

o sona e ni: ilo 0b0t la sitelen unpa li ken, li lon mute. mi alasa weka e sitelen unpa tan ilo ante. taso tenpo la ona li kama.", + + "kSiteButtons_Home": "tomo", + "kSiteButtons_FAQ": "wile sona", + "kSiteButtons_Rules": "lawa", + "kSiteButtons_DarkMode": "pimeja", + "kSiteButtons_LightMode": "walo", + "kSiteButtons_Languages": "toki", + + "kVM_UsersOnlineText": "jan ni li lon:", + + "kVM_TurnTimeTimer": "ken pali li weka lon tenpo lili {0}.", + "kVM_WaitingTurnTimer": "sina ken pali lon tenpo lili {0}.", + "kVM_VoteCooldownTimer": "sina wile open sin e toki wile la, o awen lon tenpo lili {0}.", + + "kVM_VoteForResetTitle": "sina wile ala wile sin e ilo?", + "kVM_VoteForResetTimer": "toki wile li pini lon tenpo lili {0}", + + "kVMButtons_TakeTurn": "o pali", + "kVMButtons_EndTurn": "o pini e pali", + "kVMButtons_ChangeUsername": "o ante e nimi", + "kVMButtons_Keyboard": "ilo sitelen", + "KVMButtons_CtrlAltDel": "sitelen Ctrl+Alt+Del", + + "kVMButtons_VoteForReset": "o wile e sin ilo", + "kVMButtons_Screenshot": "o jo e sitelen ni", + + "kQEMUMonitor": "sinpin QEMU", + "kAdminVMButtons_PassVote": "mi pilin ala", + "kAdminVMButtons_CancelVote": "ni li wile mi ala", + + "kAdminVMButtons_Restore": "o sin", + "kAdminVMButtons_Reboot": "o pini, o open", + "kAdminVMButtons_ClearTurnQueue": "o weka e nasin pali", + "kAdminVMButtons_BypassTurn": "o pana ala e pali", + "kAdminVMButtons_IndefiniteTurn": "pali pi tenpo ale", + + "kAdminVMButtons_Ban": "o weka pi tenpo ale", + "kAdminVMButtons_Kick": "o weka pi tenpo wan", + "kAdminVMButtons_TempMute": "tenpo la o weka e ken toki", + "kAdminVMButtons_IndefMute": "ale la o weka e ken toki", + "kAdminVMButtons_Unmute": "o sin e ken toki", + "kAdminVMButtons_GetIP": "o sona e sitelen IP", + + "kVMPrompts_AdminChangeUsernamePrompt": "jan {0} la o pana e nimi sin:", + "kVMPrompts_AdminRestoreVMPrompt": "sina wile ala wile sin e ilo?", + "kVMPrompts_EnterNewUsernamePrompt": "o pana e nimi. ala la, mi pana e nimi pi jan sin", + + "kError_UnexpectedDisconnection": "sina weka tan ilo.", + "kError_UsernameTaken": "jan ante li jo e nimi ni", + "kError_UsernameInvalid": "nimi li ken jo taso e sitelen [A-Za-z0-9 \\-_.]. sitelen tu li lili ike. siten mute wan li suli ike.", + "kError_UsernameBlacklisted": "nimi ni li ken ala.", + "kError_IncorrectPassword": "ni li nimi len sina ala.", + + "kAccountModal_Verify": "nimi E-mail la o pona e sona", + "kAccountModal_AccountSettings": "wile sijelo", + "kAccountModal_ResetPassword": "o ante e nimi len", + + "kAccountModal_NewPassword": "nimi len sin", + "kAccountModal_ConfirmNewPassword": "sin la nimi len sin", + "kAccountModal_CurrentPassword": "nimi len lon", + "kAccountModal_ConfirmPassword": "sin la nimi len sin", + + "kMissingCaptcha": "o toki e sitelen CAPTCHA.", + "kPasswordsMustMatch": "nimi len o sama.", + "kAccountModal_VerifyText": "mi toki E-mail tawa nimi {0}. pona sona la o pana e sitelen luka tu wan tan ni.", + "kAccountModal_VerifyPasswordResetText": "mi toki E-mail tawa nimi {0}. ante pi nimi len la o pana e sitelen luka tu wan tan ni.", + "kAccountModal_PasswordResetSuccess": "nimi len sina li kama ante. sina ken lon sijelo kepeken ona.", + + "kNotLoggedIn": "sina lon sijelo ala" + } +} diff --git a/static/lang/uk-ua.json b/static/lang/uk-ua.json new file mode 100644 index 0000000..0e5c322 --- /dev/null +++ b/static/lang/uk-ua.json @@ -0,0 +1,98 @@ +{ + "languageName": "Українська", + "translatedLanguageName": "Ukrainian", + "flag": "🇺🇦", + "author": "rostyc", + + "stringKeys": { + "kGeneric_CollabVM": "CollabVM", + "kGeneric_Yes": "Так", + "kGeneric_No": "Ні", + "kGeneric_Ok": "Гаразд", + "kGeneric_Cancel": "Скасувати", + "kGeneric_Send": "Надіслати", + "kGeneric_Understood": "Зрозуміло", + "kGeneric_Username": "Імʼя користувача", + "kGeneric_Password": "Пароль", + "kGeneric_Login": "Увійти", + "kGeneric_Register": "Зареєструватися", + "kGeneric_EMail": "Електронна пошта", + "kGeneric_DateOfBirth": "Дата народження", + "kGeneric_VerificationCode": "Код підтвердження", + "kGeneric_Verify": "Підтвердити", + "kGeneric_Update": "Оновити", + "kGeneric_Logout": "Вийти із системи", + + "kWelcomeModal_Header": "Ласкаво просимо до CollabVM!", + "kWelcomeModal_Body": "

Будь ласка, ознайомтеся з нашими правилами перед тим, як продовжити:

Правило 1. Не порушуйте закон.

Не використовуйте CollabVM або мережу CollabVM для порушення федерального законодавства Сполучених Штатів Америки, законодавства штату Нью-Йорк або міжнародного права. Якщо CollabVM стане відомо, що через наш ресурс було скоєно злочин, ви будете негайно заблоковані, та, за необхідності, про вашу діяльність можуть бути повідомлені органи влади.

CollabVM зобовʼязана за законом повідомляти правоохоронні органи, якщо нам стає відомо про наявність дитячої порнографії у нашій мережі або про передачу таких матеріалів через неї.

Закон США 'Про захист персональних даних дітей в Інтернеті' (COPPA) застосовується до нас, тому не використовуйте CollabVM, якщо вам не виповнилося 13 років.

Правило 2. Заборонено використовувати знаряддя для DoS/DDoS-атак.

Не використовуйте CollabVM для атак на відмову в обслуговуванні проти приватних осіб, підприємств, компаній чи будь-кого іншого.

Правило 3. Заборонено розповсюдження спаму.

Не розсилайте небажані електронні листи або будь-які інші небажані електронні повідомлення за допомогою наших сервісів.

Правило 4. Не зловживайте жодними вразливостям.

Не зловживайте вразливостями у наших системах, якщо ви помітили, що хтось таке робить, або самі знайшли проблему, будь-ласка, звʼяжіться з нами за адресою computernewbab@gmail.com (англійською мовою).

Правило 5. Не видавайте себе за інших користувачів.

Не видавайте себе за інших учасників CollabVM. Якщо вас спіймають, вас буде тимчасово відключено, а за необхідності - заблоковано.

Правило 6. Один голос на особу.

Незважаючи ні на що, одна людина може проголосувати лише раз. Не використовуйте жодних способів чи знарядь, щоб обійти це обмеження. Будь-кого, хто буде спійманим на цьому, буде заблоковано.

Правило 7. Заборонено використовувати ПЗ для віддаленого доступу.

Не використовуйте жодне програмне забезпечення для дистанційного керування. Наприклад: DarkComet, NanoCore, Anydesk, TeamViewer, Orcus тощо.

Правило 8. Заборонено обходити CollabNet.

Не намагайтеся обійти блокування CollabNet, особливо якщо це робиться для порушення Правил 1, 2 або 7, а також для завантаження або запуску надмірно використовуваного ПЗ.

Правило 9. Заборонено постійно вчиняти руйнівні дії.

Усім користувачам заборонено постійно виводити з ладу віртуальні машини, встановлювати або перевстановлювати операційну систему (за винятком VM7 або VM8), а також запускати ботів, які це роблять. Сюди відносяться боти, які надсилають надмірну кількість запитів на введення з клавіатури або миші.

Правило 10. Заборонений майнінг криптовалют.

Майнінг криптовалюти на наших віртуальних машинах призведе до того, що вас виженуть, а при подальших спробах, до постійного блокування. І взагалі, навряд чи ви на цьому щось заробите.

Попередження щодо вмісту 18+

Зверніть увагу, що лише на анархічній віртуальній машині (VM0b0t), яку регулярно перевіряють, дозволено вміст NSFW (небажаний на робочому місці). Крім того, хоча ми докладаємо всіх зусиль, щоб не допустити такий вміст на основних віртуальних машинах, деякі користувачі все ще можуть його вмикати.", + + "kSiteButtons_Home": "Головна", + "kSiteButtons_FAQ": "ЧаПи", + "kSiteButtons_Rules": "Правила", + "kSiteButtons_DarkMode": "Темна тема", + "kSiteButtons_LightMode": "Світла тема", + "kSiteButtons_Languages": "Мова", + + "kVM_UsersOnlineText": "Зараз у мережі:", + + "kVM_TurnTimeTimer": "Ваш хід завершується через {0} секунд.", + "kVM_WaitingTurnTimer": "Черга дійде до вас за {0} секунд.", + "kVM_VoteCooldownTimer": "Будь ласка, зачекайте {0} секунд, перш ніж почати нове голосування.", + + "kVM_VoteForResetTitle": "Ви бажаєте скинути цю віртуальну машину?", + "kVM_VoteForResetTimer": "Голосування завершується через {0} секунд", + + "kVMButtons_TakeTurn": "Стати в чергу", + "kVMButtons_EndTurn": "Покинути чергу", + "kVMButtons_ChangeUsername": "Змінити імʼя користувача", + "kVMButtons_Keyboard": "Клавіатура", + "KVMButtons_CtrlAltDel": "Ctrl+Alt+Delete", + + "kVMButtons_VoteForReset": "Проголосувати за скидання", + "kVMButtons_Screenshot": "Знімок екрана", + + "kQEMUMonitor": "Монітор QEMU", + "kAdminVMButtons_PassVote": "Підтримати голосування", + "kAdminVMButtons_CancelVote": "Скасувати голосування", + + "kAdminVMButtons_Restore": "Відновити", + "kAdminVMButtons_Reboot": "Перезапустити", + "kAdminVMButtons_ClearTurnQueue": "Очистити чергу", + "kAdminVMButtons_BypassTurn": "Обійти хід", + "kAdminVMButtons_IndefiniteTurn": "Необмежений хід", + + "kAdminVMButtons_Ban": "Заблокувати", + "kAdminVMButtons_Kick": "Вигнати", + "kAdminVMButtons_TempMute": "Тимчасово приглушити", + "kAdminVMButtons_IndefMute": "Заглушити назавжди", + "kAdminVMButtons_Unmute": "Зняти обмеження", + "kAdminVMButtons_GetIP": "Отримати IP-адресу", + + "kVMPrompts_AdminChangeUsernamePrompt": "Введіть нове імʼя користувача для {0}:", + "kVMPrompts_AdminRestoreVMPrompt": "Ви впевнені, що хочете відновити цю віртуальну машину?", + "kVMPrompts_EnterNewUsernamePrompt": "Введіть нове імʼя користувача, або залиште це поле порожнім для призначення гостьового імені", + + "kError_UnexpectedDisconnection": "Вас було відʼєднано від сервера.", + "kError_UsernameTaken": "Це імʼя користувача вже зайняте", + "kError_UsernameInvalid": "Імена користувачів можуть містити тільки цифри, латинські літери, пробіли, тире, знаки підкреслення, а також крапки. Мінімальна довжина - 3 символи, максимальна - 20.", + "kError_UsernameBlacklisted": "Це імʼя користувача внесено у чорний список.", + "kError_IncorrectPassword": "Неправильний пароль.", + + "kAccountModal_Verify": "Підтвердити електронну пошту", + "kAccountModal_AccountSettings": "Налаштування облікового запису", + "kAccountModal_ResetPassword": "Забули пароль?", + + "kAccountModal_NewPassword": "Новий пароль", + "kAccountModal_ConfirmNewPassword": "Підтвердьте новий пароль", + "kAccountModal_CurrentPassword": "Поточний пароль", + "kAccountModal_ConfirmPassword": "Підтвердьте пароль", + + "kMissingCaptcha": "Підтвердьте, що ви не робот.", + "kPasswordsMustMatch": "Паролі мають збігатися.", + "kAccountModal_VerifyText": "Код надіслано на адресу {0}. Щоб підтвердити обліковий запис, введіть його нижче.", + "kAccountModal_VerifyPasswordResetText": "Код надіслано на адресу {0}. Щоб скинути пароль, введіть його нижче.", + "kAccountModal_PasswordResetSuccess": "Ваш пароль успішно змінено. Тепер ви можете увійти з новим паролем.", + + "kNotLoggedIn": "Ви не увійшли до системи" + } +} diff --git a/tsconfig.json b/tsconfig.json index c407b1b..d8e2dae 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -41,7 +41,7 @@ // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ + "resolveJsonModule": true, /* Enable importing .json files. */ // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */