Empty folder

This commit is contained in:
tooomm 2026-03-28 13:01:04 +01:00
parent f3370a4f52
commit 8c5e971baf
335 changed files with 0 additions and 53402 deletions

View file

@ -1 +0,0 @@
# Future template for server admin configuration

View file

@ -1 +0,0 @@
ESLINT_NO_DEV_ERRORS=true

View file

@ -1 +0,0 @@
DISABLE_ESLINT_PLUGIN=true

View file

@ -1 +0,0 @@
CI=true

View file

@ -1,48 +0,0 @@
module.exports = {
"root": true,
"parser": "@typescript-eslint/parser",
"parserOptions": {"project": ["./tsconfig.json"]},
"plugins": [
"@typescript-eslint"
],
"ignorePatterns": ["node_modules/*", "build/*", "public/pb/*"],
"env": {
"jest": true
},
"rules": {
"array-bracket-spacing": ["error", "never"],
"arrow-spacing": ["error", {"before": true, "after": true}],
"block-spacing": ["error", "always"],
"brace-style": ["error", "1tbs", {"allowSingleLine": false}],
"comma-spacing": ["error", {"before": false, "after": true}],
"comma-style": ["error", "last"],
"computed-property-spacing": ["error", "never"],
"curly": ["error", "all"],
"dot-location": ["error", "property"],
"eol-last": ["error"],
"func-names": ["warn"],
"indent": ["error", 2, {"SwitchCase": 1}],
"key-spacing": ["error", {"beforeColon": false, "afterColon": true}],
"keyword-spacing": ["error"],
"linebreak-style": ["error", (process.platform === "win32" ? "windows" : "unix")],
"max-len": ["error", {"code": 140}],
"no-eq-null": ["off"],
"no-func-assign": ["error"],
"no-inline-comments": ["error"],
"no-mixed-spaces-and-tabs": ["error"],
"no-multi-spaces": ["error"],
"no-spaced-func": ["error"],
"no-trailing-spaces": ["error"],
"no-var": ["error"],
"object-curly-spacing": ["error", "always"],
"one-var": ["error", "never"],
"one-var-declaration-per-line": ["error"],
"quotes": ["error", "single"],
"semi-spacing": ["error", {"before": false, "after": true}],
"space-before-blocks": ["error"],
"space-before-function-paren": ["error", {"asyncArrow": "always", "anonymous": "never", "named": "never"}],
"space-in-parens": ["error", "never"],
"space-infix-ops": ["error"],
"space-unary-ops": ["error", {"words": true, "nonwords": false}]
}
}

27
webclient/.gitignore vendored
View file

@ -1,27 +0,0 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# generated ./src files
/src/proto-files.json
/src/server-props.json
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*

View file

@ -1 +0,0 @@
legacy-peer-deps=true

View file

@ -1,73 +0,0 @@
## Application Architecture
![Application Architecture](architecture.png?raw=true "Application Architecture")
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
## Available Scripts
In the project directory, you can run:
### `npm start`
Runs the app in the development mode.<br />
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
The page will reload if you make edits.<br />
You will also see any lint errors in the console.
### `npm test`
Launches the test runner in the interactive watch mode.<br />
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
### `npm run build`
Builds the app for production to the `build` folder.<br />
It correctly bundles React in production mode and optimizes the build for the best performance.
The build is minified and the filenames include the hashes.<br />
Your app is ready to be deployed!
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
### `npm run eject`
**Note: this is a one-way operation. Once you `eject`, you cant go back!**
If you arent satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point youre on your own.
You dont have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldnt feel obligated to use this feature. However we understand that this tool wouldnt be useful if you couldnt customize it when you are ready for it.
## Learn More
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
To learn React, check out the [React documentation](https://reactjs.org/).
## To-Do List
1) RefreshGuard modal
- there is no browser support for displaying custom output to window.onbeforeunload
- we should also display a custom modal explaining why they shouldnt refresh or navigate from the site
- ideally, the custom popup can be synced with the alert, so when the alert is closed, the modal closes too
2) Disable AutoScrollToBottom when the user has scrolled up
- when the user scrolls back to bottom, it should renable
- renable after a period of inactivity (3 minutes?)
3) Figure out how to type components w/ RouteComponentProps
- Component<RouteComponentProps<???, ???, ???>>
4) clear input onSubmit
5) figure out how to reflect server status changes in the ui
6) Account page
7) Register/Reset Password forms
8) Message User
9) Main Nav scheme

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

34786
webclient/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,94 +0,0 @@
{
"name": "webclient",
"version": "1.0.0",
"private": true,
"scripts": {
"prebuild": "node prebuild.js",
"prestart": "node prebuild.js",
"build": "react-scripts build",
"start": "react-scripts start",
"test": "react-scripts test",
"test:watch": "react-scripts test",
"eject": "react-scripts eject",
"lint": "eslint \"./**/*.{ts,tsx}\"",
"lint:fix": "eslint \"./**/*.{ts,tsx}\" --fix",
"golden": "npm run lint && npm run test",
"prepare": "cd .. && husky install",
"translate": "node prebuild.js -i18nOnly"
},
"dependencies": {
"@emotion/react": "^11.8.2",
"@emotion/styled": "^11.8.1",
"@mui/icons-material": "^5.5.1",
"@mui/material": "^5.5.1",
"crypto-js": "^4.2.0",
"dexie": "^3.2.2",
"final-form": "^4.20.6",
"final-form-set-field-touched": "^1.0.1",
"i18next": "^22.0.4",
"i18next-browser-languagedetector": "^7.0.0",
"i18next-icu": "^2.0.3",
"intl-messageformat": "^10.2.1",
"lodash": "^4.17.21",
"prop-types": "^15.8.1",
"protobufjs": "^7.2.4",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-final-form": "^6.5.8",
"react-final-form-listeners": "^1.0.3",
"react-i18next": "^12.0.0",
"react-redux": "^8.0.4",
"react-router-dom": "^6.2.2",
"react-scripts": "5.0.1",
"react-virtualized-auto-sizer": "^1.0.6",
"react-window": "^1.8.6",
"redux": "^4.1.2",
"redux-form": "^8.3.8",
"redux-thunk": "^2.4.1",
"rxjs": "^7.5.4",
"sanitize-html": "^2.7.3"
},
"devDependencies": {
"@babel/core": "^7.17.5",
"@mui/types": "^7.1.3",
"@testing-library/jest-dom": "^5.16.2",
"@testing-library/react": "^13.4.0",
"@types/jest": "29.2.0",
"@types/jquery": "^3.5.14",
"@types/lodash": "^4.14.179",
"@types/node": "18.11.7",
"@types/prop-types": "^15.7.4",
"@types/react": "18.0.24",
"@types/react-dom": "18.0.8",
"@types/react-redux": "^7.1.23",
"@types/react-router-dom": "^5.3.3",
"@types/react-virtualized-auto-sizer": "^1.0.1",
"@types/react-window": "^1.8.5",
"@types/redux-form": "^8.3.3",
"@typescript-eslint/eslint-plugin": "^5.14.0",
"@typescript-eslint/parser": "^5.14.0",
"fs-extra": "^10.0.1",
"husky": "^8.0.1",
"typescript": "^4.6.2"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"jest": {
"moduleNameMapper": {
"\\.(css|less)$": "identity-obj-proxy"
}
}
}

View file

@ -1,112 +0,0 @@
const fse = require('fs-extra');
const path = require('path');
const util = require('util');
const exec = util.promisify(require('child_process').exec);
const ROOT_DIR = './src';
const PUBLIC_DIR = './public';
const protoFilesDir = `${PUBLIC_DIR}/pb`;
const i18nDefaultFile = `${ROOT_DIR}/i18n-default.json`;
const serverPropsFile = `${ROOT_DIR}/server-props.json`;
const masterProtoFile = `${ROOT_DIR}/proto-files.json`;
const sharedFiles = [
['../libcockatrice_protocol/libcockatrice/protocol/pb', protoFilesDir],
['../cockatrice/resources/countries', `${ROOT_DIR}/images/countries`],
];
const i18nFileRegex = /\.i18n\.json$/;
const i18nOnly = process.argv.indexOf('-i18nOnly') > -1;
(async () => {
if (i18nOnly) {
await createI18NDefault();
return;
}
// make sure these files finish copying before master file is created
await copySharedFiles();
await createMasterProtoFile();
await createServerProps();
await createI18NDefault();
})();
async function copySharedFiles() {
try {
return await Promise.all(sharedFiles.map(([src, dest]) => fse.copy(src, dest, { overwrite: true })));
} catch (e) {
console.error(e);
process.exitCode = 1;
}
}
async function createMasterProtoFile() {
try {
fse.readdir(protoFilesDir, (err, files) => {
if (err) throw err;
fse.outputFile(masterProtoFile, JSON.stringify(files.filter(file => /\.proto$/.test(file))));
});
} catch (e) {
console.error(e);
process.exitCode = 1;
}
}
async function createServerProps() {
try {
fse.outputFile(serverPropsFile, JSON.stringify({
REACT_APP_VERSION: await getCommitHash(),
}));
} catch (e) {
console.error(e);
process.exitCode = 1;
}
}
async function createI18NDefault() {
try {
const files = getAllFiles(ROOT_DIR, i18nFileRegex);
const allJson = await Promise.all(files.map(file => fse.readJson(file)));
const rollup = allJson.reduce((acc, json) => {
const newKeys = Object.keys(json);
newKeys.forEach(key => {
if (acc[key]) {
throw new Error(`i18n key collision: ${key}\n${JSON.stringify(json)}`);
}
acc[key] = json[key];
});
return acc;
}, {});
fse.outputFile(i18nDefaultFile, JSON.stringify(rollup, null, 2));
} catch (e) {
console.error(e);
process.exitCode = 1;
}
}
async function getCommitHash() {
return (await exec('git rev-parse HEAD')).stdout.trim();
}
function getAllFiles(dirPath, regex = /./, allFiles = []) {
return fse.readdirSync(dirPath).reduce((files, file) => {
const filePath = dirPath + "/" + file;
if (fse.statSync(filePath).isDirectory()) {
files.concat(getAllFiles(filePath, regex, files));
} else if (regex.test(file)) {
files.push(path.join(__dirname, filePath));
}
return files;
}, allFiles);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View file

@ -1,44 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<link rel="stylesheet" type="text/css" href="%PUBLIC_URL%/reset.css">
<meta name="viewport" content="minimum-scale=1, initial-scale=1, width=device-width, shrink-to-fit=no" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Webatrice: A Cockatrice Web Client"
/>
<link rel="apple-touch-icon" href="logo192.png" />
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>Webatrice</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>

View file

@ -1,382 +0,0 @@
{
"Common": {
"language": "Deutsch (German)",
"disconnect": "Verbindung trennen",
"label": {
"confirmPassword": "Passwort bestätigen",
"confirmSure": "Sind Sie sicher?",
"country": "Land",
"delete": "Löschen",
"email": "E-Mail",
"hostName": "Name des Hosts",
"hostAddress": "Adresse des Hosts",
"password": "Passwort",
"passwordAgain": "Passwort Erneut",
"port": "Port",
"realName": "Richtiger Name",
"saveChanges": "Änderungen speichern",
"token": "Token",
"username": "Benutzername"
},
"validation": {
"minChars": "Mindestens {count} {count, plural, one {Zeichen} other {Zeichen}} benötigt",
"passwordsMustMatch": "Die Passwörter stimmen nicht überein",
"required": "Benötigt"
},
"countries": {
"AD": "Andorra",
"AE": "Vereinigte Arabische Emirate",
"AF": "Afghanistan",
"AG": "Antigua und Barbuda",
"AI": "Anguilla",
"AL": "Albanien",
"AM": "Armenien",
"AO": "Angola",
"AQ": "Antarktis",
"AR": "Argentinien",
"AS": "Amerikanisch-Samoa",
"AT": "Österreich",
"AU": "Australien",
"AW": "Aruba",
"AX": "Ålandinseln",
"AZ": "Aserbaidschan",
"BA": "Bosnien und Herzegowina",
"BB": "Barbados",
"BD": "Bangladesch",
"BE": "Belgien",
"BF": "Burkina Faso",
"BG": "Bulgarien",
"BH": "Bahrain",
"BI": "Burundi",
"BJ": "Benin",
"BL": "Saint-Barthélemy ",
"BM": "Bermuda",
"BN": "Brunei",
"BO": "Bolivien",
"BQ": "Bonaire, Sint Eustatius und Saba",
"BR": "Brasilien",
"BS": "Bahamas",
"BT": "Bhutan",
"BV": "Bouvetinsel",
"BW": "Botswana",
"BY": "Weißrussland",
"BZ": "Belize",
"CA": "Kanada",
"CC": "Kokosinseln",
"CD": "DR Kongo",
"CF": "Zentralafrikanische Republik",
"CG": "Republik Kongo",
"CH": "Schweiz",
"CI": "Elfenbeinküste",
"CK": "Cookinseln",
"CL": "Chile",
"CM": "Kamerun",
"CN": "China",
"CO": "Kolumbien",
"CR": "Costa Rica",
"CU": "Kuba",
"CV": "Kap Verde",
"CW": "Curaçao",
"CX": "Weihnachtsinsel",
"CY": "Zypern",
"CZ": "Tschechien",
"DE": "Deutschland",
"DJ": "Dschibuti",
"DK": "Dänemark",
"DM": "Dominica",
"DO": "Dominikanische Republik",
"DZ": "Algerien",
"EC": "Ecuador",
"EE": "Estland",
"EG": "Ägypten",
"EH": "Westsahara",
"ER": "Eritrea",
"ES": "Spanien",
"ET": "Äthiopien",
"FI": "Finnland",
"FJ": "Fiji",
"FK": "Falklandinseln",
"FM": "Mikronesien",
"FO": "Färöer",
"FR": "Frankreich",
"GA": "Gabun",
"GB": "Vereinigtes Königreich",
"GD": "Grenada",
"GE": "Georgien",
"GF": "Französisch-Guayana",
"GG": "Guernsey",
"GH": "Ghana",
"GI": "Gibraltar",
"GL": "Grönland",
"GM": "Gambia",
"GN": "Guinea",
"GP": "Guandeloupe",
"GQ": "Äquatorialguinea",
"GR": "Griechenland",
"GS": "Südgeorgien und die Südlichen Sandwichinseln",
"GT": "Guatemala",
"GU": "Guam",
"GW": "Guinea-Bissau",
"GY": "Guyana",
"HK": "Hongkong",
"HM": "Heard und McDonaldinseln",
"HN": "Honduras",
"HR": "Kroatien",
"HT": "Haiti",
"HU": "Ungarn",
"ID": "Indonesien",
"IE": "Irland",
"IL": "Israel",
"IM": "Insel Man",
"IN": "Indien",
"IO": " Britisches Territorium im Indischen Ozean",
"IQ": "Irak",
"IR": "Iran",
"IS": "Island",
"IT": "Italien",
"JE": "Jersey",
"JM": "Jamaika",
"JO": "Jordanien",
"JP": "Japan",
"KE": "Kenia",
"KG": "Kirgisistan",
"KH": "Kambodscha",
"KI": "Kiribati",
"KM": "Komoren",
"KN": "St. Kitts und Nevis",
"KP": "Nordkorea",
"KR": "Südkorea",
"KW": "Kuwait",
"KY": "Kaimaninseln",
"KZ": "Kasachstan",
"LA": "Laos",
"LB": "Libanon",
"LC": "St. Lucia",
"LI": "Liechtenstein",
"LK": "Sri Lanka",
"LR": "Liberia",
"LS": "Lesotho",
"LT": "Litauen",
"LU": "Luxemburg",
"LV": "Lettland",
"LY": "Libyen",
"MA": "Marokko",
"MC": "Monaco",
"MD": "Moldau",
"ME": "Montenegro",
"MF": "Saint-Martin (Französischer Teil)",
"MG": "Madagaskar",
"MH": "Marshallinseln",
"MK": "Nordmazedonien",
"ML": "Mali",
"MM": "Myanmar",
"MN": "Mongolei",
"MO": "Macau",
"MP": "Nördliche Marianen",
"MQ": "Martinique",
"MR": "Mauretanien",
"MS": "Montserrat",
"MT": "Malta",
"MU": "Mauritius",
"MV": "Malediven",
"MW": "Malawi",
"MX": "Mexiko",
"MY": "Malaysia",
"MZ": "Mosambik",
"NA": "Namibia",
"NC": "Neukaledonien",
"NE": "Niger",
"NF": "Norfolkinsel",
"NG": "Nigeria",
"NI": "Nicaragua",
"NL": "Niederlande",
"NO": "Norwegen",
"NP": "Nepal",
"NR": "Nauru",
"NU": "Niue",
"NZ": "Neuseeland",
"OM": "Oman",
"PA": "Panama",
"PE": "Peru",
"PF": "Französisch-Polynesien",
"PG": "Papua-Neuguinea",
"PH": "Philippinen",
"PK": "Pakistan",
"PL": "Polen",
"PM": "St. Pierre und Miquelon",
"PN": "Pitcairninseln",
"PR": "Puerto Rico",
"PS": "Palästina",
"PT": "Portugal",
"PW": "Palau",
"PY": "Paraguay",
"QA": "Katar",
"RE": "Réunion",
"RO": "Rumänien",
"RS": "Serbien",
"RU": "Russland",
"RW": "Ruanda",
"SA": "Saudi-Arabien",
"SB": "Salomonen",
"SC": "Seychellen",
"SD": "Sudan",
"SE": "Schweden",
"SG": "Singapur",
"SH": "St. Helena, Ascension und Tristan da Cunha",
"SI": "Slowenien",
"SJ": "Spitzbergen und Jan Mayen",
"SK": "Slowakei",
"SL": "Sierra Leone",
"SM": "San Marino",
"SN": "Senegal",
"SO": "Somalia",
"SR": "Suriname",
"SS": "Südsudan",
"ST": "São Tomé und Príncipe",
"SV": "El Salvador",
"SX": "Sint Maarten (Niederländischer Teil)",
"SY": "Syrien",
"SZ": "Eswatini",
"TC": "Turks- und Caicosinseln",
"TD": "Tschad",
"TF": "TAAF",
"TG": "Togo",
"TH": "Thailand",
"TJ": "Tadschikistan",
"TK": "Tokelau",
"TL": "Timor-Leste",
"TM": "Turkmenistan",
"TN": "Tunesien",
"TO": "Tonga",
"TR": "Türkei",
"TT": "Trinidad und Tobago",
"TV": "Tuvalu",
"TW": "Taiwan",
"TZ": "Tansania",
"UA": "Ukraine",
"UG": "Uganda",
"UM": "Kleinere abgelegene Inseln der Vereinigten Staaten",
"US": "Vereinigte Staaten von Amerika",
"UY": "Uruguay",
"UZ": "Usbekistan",
"VA": "Heiliger Stuhl",
"VC": "St. Vincent und die Grenadinen",
"VE": "Venezuela",
"VG": "Britische Jungferninseln",
"VI": "Amerikanische Jungferninseln",
"VN": "Vietnam",
"VU": "Vanuatu",
"WF": "Wallis und Futuna",
"WS": "Samoa",
"YE": "Jemen",
"YT": "Mayotte",
"XK": "Kosovo",
"ZA": "Südafrika",
"ZM": "Sambia",
"ZW": "Simbabwe",
"EU": "Europäische Union"
},
"languages": {
"en-US": "Englisch - US",
"fr": "Französisch",
"nl": "Niederländisch",
"pt_BR": "Portugiesisch - Brasilien"
}
},
"KnownHosts": {
"label": "Host",
"add": "Neuen Host hinzufügen",
"toast": "Host erfolgreich {mode, select, created {erstellt} deleted {gelöscht} other {bearbeitet}}."
},
"InitializeContainer": {
"title": "WUSSTEN SIE SCHON",
"subtitle": "<1>Cockatrice wird von Freiwilligen geleitet </1><1>die Kartenspiele lieben!</1>"
},
"LoginContainer": {
"header": {
"title": "Login",
"subtitle": "Ein plattformübergreifender, virtueller Tabletop für Multiplayer-Kartenspiele."
},
"footer": {
"registerPrompt": "Noch nicht registriert?",
"registerAction": "Einen Account erstellen",
"credit": "Cockatrice ist ein Open-Source-Projekt",
"version": "Version"
},
"content": {
"subtitle1": "Spielen Sie Kartenspiele im Multiplayer online.",
"subtitle2": "Plattformübergreifender, virtueller Tabletop für Kartenspiele im Multiplayer. Für immer kostenlos."
},
"toasts": {
"passwordResetSuccessToast": "Passwort erfolgreich zurückgesetzt",
"accountActivationSuccess": "Account erfolgreich aktiviert"
}
},
"UnsupportedContainer": {
"title": "Browser wird nicht unterstützt",
"subtitle1": "Bitte updaten Sie Ihren Browser und/oder überprüfen Sie Ihre Berechtigungen.",
"subtitle2": "Hinweis: Beim privaten Surfen werden bei einigen Browsern bestimmte Berechtigungen oder Funktionen deaktiviert."
},
"AccountActivationDialog": {
"title": "Aktivierung des Accounts",
"subtitle1": "Ihr Account wurde noch nicht aktiviert.",
"subtitle2": "Sie müssen das Aktivierungs-Token angeben, das Sie in der Aktivierungs-E-Mail erhalten haben."
},
"KnownHostDialog": {
"title": "{mode, select, edit {Bearbeiten} other {Hinzufügen}} Bekannter Host",
"subtitle": "Wenn Sie einen neuen Host hinzufügen, können Sie sich mit verschiedenen Servern verbinden. Geben Sie die unten stehenden Details in Ihre Hostliste ein."
},
"RegistrationDialog": {
"title": "Einen neuen Account erstellen"
},
"RequestPasswordResetDialog": {
"title": "Passwort-Zurücksetzung anfordern"
},
"ResetPasswordDialog": {
"title": "Passwort zurücksetzen"
},
"AccountActivationForm": {
"error": {
"failed": "Account-Aktivierung fehlgeschlagen"
},
"label": {
"activate": "Account aktivieren"
}
},
"KnownHostForm": {
"help": "Brauchen Sie Hilfe beim Hinzufügen eines neuen Hosts?",
"label": {
"add": "Host hinzufügen",
"find": "Host finden"
}
},
"LoginForm": {
"label": {
"autoConnect": "Automatisch verbinden",
"forgot": "Passwort vergessen",
"login": "Login",
"savePassword": "Passwort speichern",
"savedPassword": "Passwort gespeichert"
}
},
"RegisterForm": {
"label": {
"register": "Registrieren"
},
"toast": {
"registerSuccess": "Registrierung erfolgreich!"
}
},
"RequestPasswordResetForm": {
"error": "Anfrage zum Zurücksetzen des Passworts fehlgeschlagen",
"mfaEnabled": "Der Server hat Multi-Faktor-Authentifizierung aktiviert",
"request": "Rücksetzungs-Token anfordern",
"skipRequest": "Ich habe bereits ein Rücksetzungs-Token"
},
"ResetPasswordForm": {
"error": "Passwort-Zurücksetzung fehlgeschlagen",
"label": {
"reset": "Passwort zurücksetzen"
}
}
}

View file

@ -1,382 +0,0 @@
{
"Common": {
"language": "English",
"disconnect": "Disconnect",
"label": {
"confirmPassword": "Confirm Password",
"confirmSure": "Are you sure?",
"country": "Country",
"delete": "Delete",
"email": "Email",
"hostName": "Host Name",
"hostAddress": "Host Address",
"password": "Password",
"passwordAgain": "Password Again",
"port": "Port",
"realName": "Real Name",
"saveChanges": "Save Changes",
"token": "Token",
"username": "Username"
},
"validation": {
"minChars": "Minimum of {count} {count, plural, one {character} other {characters}} required",
"passwordsMustMatch": "Passwords don't match",
"required": "Required"
},
"countries": {
"AD": "Andorra",
"AE": "United Arab Emirates",
"AF": "Afghanistan",
"AG": "Antigua and Barbuda",
"AI": "Anguilla",
"AL": "Albania",
"AM": "Armenia",
"AO": "Angola",
"AQ": "Antarctica",
"AR": "Argentina",
"AS": "American Samoa",
"AT": "Austria",
"AU": "Australia",
"AW": "Aruba",
"AX": "Åland Islands",
"AZ": "Azerbaijan",
"BA": "Bosnia and Herzegovina",
"BB": "Barbados",
"BD": "Bangladesh",
"BE": "Belgium",
"BF": "Burkina Faso",
"BG": "Bulgaria",
"BH": "Bahrain",
"BI": "Burundi",
"BJ": "Benin",
"BL": "Saint Barthélemy",
"BM": "Bermuda",
"BN": "Brunei Darussalam",
"BO": "Bolivia",
"BQ": "Bonaire, Sint Eustatius and Saba",
"BR": "Brazil",
"BS": "Bahamas",
"BT": "Bhutan",
"BV": "Bouvet Island",
"BW": "Botswana",
"BY": "Belarus",
"BZ": "Belize",
"CA": "Canada",
"CC": "Cocos (Keeling) Islands",
"CD": "DR Congo",
"CF": "Central African Republic",
"CG": "Republic of the Congo",
"CH": "Switzerland",
"CI": "Ivory Coast",
"CK": "Cook Islands",
"CL": "Chile",
"CM": "Cameroon",
"CN": "China",
"CO": "Colombia",
"CR": "Costa Rica",
"CU": "Cuba",
"CV": "Cape Verde",
"CW": "Curaçao",
"CX": "Christmas Island",
"CY": "Cyprus",
"CZ": "Czechia",
"DE": "Germany",
"DJ": "Djibouti",
"DK": "Denmark",
"DM": "Dominica",
"DO": "Dominican Republic",
"DZ": "Algeria",
"EC": "Ecuador",
"EE": "Estonia",
"EG": "Egypt",
"EH": "Western Sahara",
"ER": "Eritrea",
"ES": "Spain",
"ET": "Ethiopia",
"FI": "Finland",
"FJ": "Fiji",
"FK": "Falkland Islands",
"FM": "Micronesia",
"FO": "Faroe Islands",
"FR": "France",
"GA": "Gabon",
"GB": "United Kingdom",
"GD": "Grenada",
"GE": "Georgia",
"GF": "French Guiana",
"GG": "Guernsey",
"GH": "Ghana",
"GI": "Gibraltar",
"GL": "Greenland",
"GM": "Gambia",
"GN": "Guinea",
"GP": "Guadeloupe",
"GQ": "Equatorial Guinea",
"GR": "Greece",
"GS": "South Georgia and the South Sandwich Islands",
"GT": "Guatemala",
"GU": "Guam",
"GW": "Guinea-Bissau",
"GY": "Guyana",
"HK": "Hong Kong",
"HM": "Heard Island and McDonald Islands",
"HN": "Honduras",
"HR": "Croatia",
"HT": "Haiti",
"HU": "Hungary",
"ID": "Indonesia",
"IE": "Ireland",
"IL": "Israel",
"IM": "Isle of Man",
"IN": "India",
"IO": "British Indian Ocean Territory",
"IQ": "Iraq",
"IR": "Iran",
"IS": "Iceland",
"IT": "Italy",
"JE": "Jersey",
"JM": "Jamaica",
"JO": "Jordan",
"JP": "Japan",
"KE": "Kenya",
"KG": "Kyrgyzstan",
"KH": "Cambodia",
"KI": "Kiribati",
"KM": "Comoros",
"KN": "Saint Kitts and Nevis",
"KP": "North Korea",
"KR": "South Korea",
"KW": "Kuwait",
"KY": "Cayman Islands",
"KZ": "Kazakhstan",
"LA": "Laos",
"LB": "Lebanon",
"LC": "Saint Lucia",
"LI": "Liechtenstein",
"LK": "Sri Lanka",
"LR": "Liberia",
"LS": "Lesotho",
"LT": "Lithuania",
"LU": "Luxembourg",
"LV": "Latvia",
"LY": "Libya",
"MA": "Morocco",
"MC": "Monaco",
"MD": "Moldova",
"ME": "Montenegro",
"MF": "Saint Martin (French part)",
"MG": "Madagascar",
"MH": "Marshall Islands",
"MK": "North Macedonia",
"ML": "Mali",
"MM": "Myanmar",
"MN": "Mongolia",
"MO": "Macao",
"MP": "Northern Mariana Islands",
"MQ": "Martinique",
"MR": "Mauritania",
"MS": "Montserrat",
"MT": "Malta",
"MU": "Mauritius",
"MV": "Maldives",
"MW": "Malawi",
"MX": "Mexico",
"MY": "Malaysia",
"MZ": "Mozambique",
"NA": "Namibia",
"NC": "New Caledonia",
"NE": "Niger",
"NF": "Norfolk Island",
"NG": "Nigeria",
"NI": "Nicaragua",
"NL": "Netherlands",
"NO": "Norway",
"NP": "Nepal",
"NR": "Nauru",
"NU": "Niue",
"NZ": "New Zealand",
"OM": "Oman",
"PA": "Panama",
"PE": "Peru",
"PF": "French Polynesia",
"PG": "Papua New Guinea",
"PH": "Philippines",
"PK": "Pakistan",
"PL": "Poland",
"PM": "Saint Pierre and Miquelon",
"PN": "Pitcairn",
"PR": "Puerto Rico",
"PS": "Palestine",
"PT": "Portugal",
"PW": "Palau",
"PY": "Paraguay",
"QA": "Qatar",
"RE": "Réunion",
"RO": "Romania",
"RS": "Serbia",
"RU": "Russia",
"RW": "Rwanda",
"SA": "Saudi Arabia",
"SB": "Solomon Islands",
"SC": "Seychelles",
"SD": "Sudan",
"SE": "Sweden",
"SG": "Singapore",
"SH": "Saint Helena, Ascension and Tristan da Cunha",
"SI": "Slovenia",
"SJ": "Svalbard and Jan Mayen",
"SK": "Slovakia",
"SL": "Sierra Leone",
"SM": "San Marino",
"SN": "Senegal",
"SO": "Somalia",
"SR": "Suriname",
"SS": "South Sudan",
"ST": "Sao Tome and Principe",
"SV": "El Salvador",
"SX": "Sint Maarten (Dutch part)",
"SY": "Syria",
"SZ": "Eswatini",
"TC": "Turks and Caicos Islands",
"TD": "Chad",
"TF": "TAAF",
"TG": "Togo",
"TH": "Thailand",
"TJ": "Tajikistan",
"TK": "Tokelau",
"TL": "Timor-Leste",
"TM": "Turkmenistan",
"TN": "Tunisia",
"TO": "Tonga",
"TR": "Turkey",
"TT": "Trinidad and Tobago",
"TV": "Tuvalu",
"TW": "Taiwan",
"TZ": "Tanzania",
"UA": "Ukraine",
"UG": "Uganda",
"UM": "United States Minor Outlying Islands",
"US": "United States",
"UY": "Uruguay",
"UZ": "Uzbekistan",
"VA": "Holy See",
"VC": "Saint Vincent and the Grenadines",
"VE": "Venezuela",
"VG": "British Virgin Islands",
"VI": "U.S. Virgin Islands",
"VN": "Viet Nam",
"VU": "Vanuatu",
"WF": "Wallis and Futuna",
"WS": "Samoa",
"YE": "Yemen",
"YT": "Mayotte",
"XK": "Kosovo",
"ZA": "South Africa",
"ZM": "Zambia",
"ZW": "Zimbabwe",
"EU": "European Union"
},
"languages": {
"en-US": "English - US",
"fr": "French",
"nl": "Dutch",
"pt_BR": "Portuguese - Brazil"
}
},
"KnownHosts": {
"label": "Host",
"add": "Add new host",
"toast": "Host successfully {mode, select, created {created} deleted {deleted} other {edited}}."
},
"InitializeContainer": {
"title": "DID YOU KNOW",
"subtitle": "<1>Cockatrice is run by volunteers</1><1>that love card games!</1>"
},
"LoginContainer": {
"header": {
"title": "Login",
"subtitle": "A cross-platform virtual tabletop for multiplayer card games."
},
"footer": {
"registerPrompt": "Not registered yet?",
"registerAction": "Create an account",
"credit": "Cockatrice is an open source project",
"version": "Version"
},
"content": {
"subtitle1": "Play multiplayer card games online.",
"subtitle2": "Cross-platform virtual tabletop for multiplayer card games. Forever free."
},
"toasts": {
"passwordResetSuccessToast": "Password Reset Successfully",
"accountActivationSuccess": "Account Activated Successfully"
}
},
"UnsupportedContainer": {
"title": "Unsupported Browser",
"subtitle1": "Please update your browser and/or check your permissions.",
"subtitle2": "Note: Private browsing causes some browsers to disable certain permissions or features."
},
"AccountActivationDialog": {
"title": "Account Activation",
"subtitle1": "Your account has not been activated yet.",
"subtitle2": "You need to provide the activation token received in the activation email."
},
"KnownHostDialog": {
"title": "{mode, select, edit {Edit} other {Add}} Known Host",
"subtitle": "Adding a new host allows you to connect to different servers. Enter the details below to your host list."
},
"RegistrationDialog": {
"title": "Create New Account"
},
"RequestPasswordResetDialog": {
"title": "Request Password Reset"
},
"ResetPasswordDialog": {
"title": "Reset Password"
},
"AccountActivationForm": {
"error": {
"failed": "Account activation failed"
},
"label": {
"activate": "Activate Account"
}
},
"KnownHostForm": {
"help": "Need help adding a new host?",
"label": {
"add": "Add Host",
"find": "Find Host"
}
},
"LoginForm": {
"label": {
"autoConnect": "Auto Connect",
"forgot": "Forgot Password",
"login": "Login",
"savePassword": "Save Password",
"savedPassword": "Saved Password"
}
},
"RegisterForm": {
"label": {
"register": "Register"
},
"toast": {
"registerSuccess": "Registration Successful!"
}
},
"RequestPasswordResetForm": {
"error": "Request password reset failed",
"mfaEnabled": "Server has multi-factor authentication enabled",
"request": "Request Reset Token",
"skipRequest": "I already have a reset token"
},
"ResetPasswordForm": {
"error": "Password reset failed",
"label": {
"reset": "Reset Password"
}
}
}

View file

@ -1,382 +0,0 @@
{
"Common": {
"language": "Español (Spanish)",
"disconnect": "Desconectar",
"label": {
"confirmPassword": "Confirmar contraseña",
"confirmSure": "¿Estás seguro?",
"country": "País",
"delete": "Borrar",
"email": "e-mail",
"hostName": "Nombre del servidor",
"hostAddress": "Dirección del servidor",
"password": "Contraseña",
"passwordAgain": "Contraseña de nuevo",
"port": "Puerto",
"realName": "Nombre real",
"saveChanges": "Guardar cambios",
"token": "Ficha",
"username": "Nombre de usuario"
},
"validation": {
"minChars": "Se requiere un mínimo de {conteo} {conteo, plural, un {carácter} otros {caracteres}}",
"passwordsMustMatch": "Las contraseñas no coinciden",
"required": "Requerido"
},
"countries": {
"AD": "Andorra",
"AE": "Emiratos Árabes Unidos",
"AF": "Afganistán",
"AG": "Antigua y Barbuda",
"AI": "Anguila",
"AL": "Albania",
"AM": "Armenia",
"AO": "Angola",
"AQ": "Antártida",
"AR": "Argentina",
"AS": "Samoa americana",
"AT": "Austria",
"AU": "Australia",
"AW": "Aruba",
"AX": "Islas Aland",
"AZ": "Azerbaiján",
"BA": "Bosnia y Herzegovina",
"BB": "Barbados",
"BD": "Bangladés",
"BE": "Bélgica",
"BF": "Burkina Faso",
"BG": "Bulgaria",
"BH": "Baréin",
"BI": "Burundi",
"BJ": "Benín",
"BL": "San Bartolomé",
"BM": "Bermuda",
"BN": "Brunei Darussalam",
"BO": "Bolivia",
"BQ": "Bonaire, San Eustaquio y Saba",
"BR": "Brasil",
"BS": "Bahamas",
"BT": "Bután",
"BV": "Isla Bouvet",
"BW": "Botswana",
"BY": "Belorrusia",
"BZ": "Belice",
"CA": "Canadá",
"CC": "Islas (Keeling) Cocos",
"CD": "República Democrática del Congo",
"CF": "República Centroafricana",
"CG": "República del Congo",
"CH": "Suiza",
"CI": "Costa de Marfil",
"CK": "Islas Cook",
"CL": "Chile",
"CM": "Camerún",
"CN": "China",
"CO": "Colombia",
"CR": "Costa Rica",
"CU": "Cuba",
"CV": "Cabo Verde",
"CW": "Curazao",
"CX": "Isla de Navidad",
"CY": "Chipre",
"CZ": "República Checa",
"DE": "Alemania",
"DJ": "Djibouti",
"DK": "Dinamarca",
"DM": "Dominica",
"DO": "República Dominicana",
"DZ": "Argelia",
"EC": "Ecuador",
"EE": "Estonia",
"EG": "Egipto",
"EH": "Sáhara Occidental",
"ER": "Eritrea",
"ES": "España",
"ET": "Etiopía",
"FI": "Finlandia",
"FJ": "Fiji",
"FK": "Islas Falkland",
"FM": "Micronesia",
"FO": "Islas Faroe",
"FR": "Francia",
"GA": "Gabón",
"GB": "Reino Unido",
"GD": "Granada",
"GE": "Georgia",
"GF": "Guinea Francesa",
"GG": "Guernsey",
"GH": "Ghana",
"GI": "Gibraltar",
"GL": "Greenland",
"GM": "Gambía",
"GN": "Guinea",
"GP": "Guadalupe",
"GQ": "Guinea Ecuatorial",
"GR": "Grecia",
"GS": "Georgia del Sur y las islas Sandwich del sur",
"GT": "Guatemala",
"GU": "Guam",
"GW": "Guinea-Bisáu",
"GY": "Guyana",
"HK": "Hong Kong",
"HM": "Islas Heard y McDonald",
"HN": "Honduras",
"HR": "Croacia",
"HT": "Haití",
"HU": "Hungría",
"ID": "Indonesia",
"IE": "Irlanda",
"IL": "Israel",
"IM": "Isla de Man",
"IN": "India",
"IO": "Territorio Británico del Océano Índico",
"IQ": "Irak",
"IR": "Irán",
"IS": "Groenlandia",
"IT": "Italia",
"JE": "Jersey",
"JM": "Jamaica",
"JO": "Jordania",
"JP": "Japón",
"KE": "Kenya",
"KG": "Kirguistán",
"KH": "Camboya",
"KI": "Kiribati",
"KM": "Comoras",
"KN": "San Cristóbal y Nieves",
"KP": "Corea la Buena-Norte",
"KR": "Corea la Mala-Sur",
"KW": "Kuwait",
"KY": "Islas Caimán",
"KZ": "Kazajistán",
"LA": "Laos",
"LB": "Líbano",
"LC": "Santa Lucía",
"LI": "Principado de Liechtenstein",
"LK": "Sri Lanka",
"LR": "Liberia",
"LS": "Lesoto",
"LT": "Lituania",
"LU": "Luxemburgo",
"LV": "Letonia",
"LY": "Libia",
"MA": "Marruecos",
"MC": "Mónaci",
"MD": "Moldavia",
"ME": "Montenegro",
"MF": "San Martín (Parte francesa)",
"MG": "Madagascar",
"MH": "Islas Marshall",
"MK": "Macedonia del Norte",
"ML": "Malí",
"MM": "Birmania",
"MN": "Mongolia",
"MO": "Macao",
"MP": "Islas Marianas del Norte",
"MQ": "Martinica",
"MR": "Mauritania",
"MS": "Montserrat",
"MT": "Malta",
"MU": "Mauricio",
"MV": "Maldivas",
"MW": "Malawi",
"MX": "México",
"MY": "Malasia",
"MZ": "Mozambique",
"NA": "Namibia",
"NC": "Nueva Caledonia",
"NE": "Nigeria",
"NF": "Isla Norfolk",
"NG": "Nigeria",
"NI": "Nicaragua",
"NL": "Países Bajos (Holanda)",
"NO": "Noruega",
"NP": "Nepal",
"NR": "Nauru",
"NU": "Niue",
"NZ": "Nueva Zelanda",
"OM": "Omán",
"PA": "Panamá",
"PE": "Perú",
"PF": "Polinesia Francesa",
"PG": "Papúa Nueva Guinea",
"PH": "Filipinas",
"PK": "Pakistán",
"PL": "Polonia",
"PM": "San Pedro y Miquelón",
"PN": "Islas Pitcairn",
"PR": "Puerto Rico",
"PS": "Palestina",
"PT": "Portugal",
"PW": "Palaos",
"PY": "Paraguay",
"QA": "Catar",
"RE": "Reunión",
"RO": "Rumanía",
"RS": "Serbia",
"RU": "Rusia",
"RW": "Ruanda",
"SA": "Arabia Saudí",
"SB": "Islas Salomón",
"SC": "Islas Seychelles",
"SD": "Sudán",
"SE": "Suecia",
"SG": "Singapur",
"SH": "Santa Elena, Ascensión y Tristán de Acuña",
"SI": "Eslovenia",
"SJ": "Svalbard y Jan Mayen",
"SK": "Eslovaquia",
"SL": "Sierra Leona",
"SM": "San Marino",
"SN": "Senegal",
"SO": "Somalia",
"SR": "Surinam",
"SS": "Sudán del Sur",
"ST": "Santo Tomé y Príncipe",
"SV": "El Salvador",
"SX": "Sint Maarten (Países Bajos-Holanda)",
"SY": "Siria",
"SZ": "Esuatini",
"TC": "Islas Turcas y Caicos",
"TD": "Chad",
"TF": "Las Tierras Australes y Antárticas Francesas (TAAF)",
"TG": "Togo",
"TH": "Tailandia",
"TJ": "Tayikistán",
"TK": "Tokelau",
"TL": "Timor Oriental",
"TM": "Turkmenistán",
"TN": "Túnez",
"TO": "Tonga",
"TR": "Turquía",
"TT": "Trinidad y Tobago",
"TV": "Tuvalu",
"TW": "Taiwán",
"TZ": "Tanzania",
"UA": "Ucrania",
"UG": "Uganda",
"UM": "Islas Ultramarinas Menores de Estados Unidos",
"US": "Estados Unidos",
"UY": "Uruguay",
"UZ": "Uzbekistán",
"VA": "Ciudad del Vaticano",
"VC": "San Vicente y las Granadinas",
"VE": "Venezuela",
"VG": "Islas Vírgenes Británicas",
"VI": "Islas Vírgenes Estadounidenses",
"VN": "Vietnam",
"VU": "Vanuatu",
"WF": "Wallis y Futuna",
"WS": "Samoa",
"YE": "Yemen",
"YT": "Mayotte",
"XK": "Kósovo",
"ZA": "Sudáfrica",
"ZM": "Zambia",
"ZW": "Zimbabue",
"EU": "Unión Europea"
},
"languages": {
"en-US": "Inglés - US",
"fr": "Francés",
"nl": "Holandés",
"pt_BR": " Portugués - Brasil"
}
},
"KnownHosts": {
"label": "IP",
"add": "Añadir nueva dirección IP",
"toast": "Dirección IP correcta {modo, seleccionar, creado {creado} eliminado {eliminado} otro {editado}}."
},
"InitializeContainer": {
"title": "¿LO SABÍAS?",
"subtitle": "<1>¡Cockatrice está buscando voluntarios</1><1> que amen los juegos de cartas!"
},
"LoginContainer": {
"header": {
"title": "Conectar",
"subtitle": "Un tablero de mesa multiplataforma para juegos de cartas multijugador."
},
"footer": {
"registerPrompt": "¿No estás registrado aún?",
"registerAction": "Crear una cuenta",
"credit": "Cockatrice es un proyecto de fuente abierta",
"version": "Versión"
},
"content": {
"subtitle1": "Juega juegos de cartas multijugador en línea.",
"subtitle2": "Tablero multiplataforma virtual para juegos de cartas multijugador. Siempre gratuito."
},
"toasts": {
"passwordResetSuccessToast": "Reinicio de contraseña exitoso",
"accountActivationSuccess": "Cuenta activada con éxito"
}
},
"UnsupportedContainer": {
"title": "Navegador sin apoyo",
"subtitle1": "Por favor actualiza tu navegador y/o comprueba tus permisos.",
"subtitle2": "Nota: Los navegadores privados pueden causar que los navegadores deshabiliten ciertos permisos o funciones."
},
"AccountActivationDialog": {
"title": "Activación de la cuenta",
"subtitle1": "Tu cuenta aún no ha sido activada.",
"subtitle2": "Necesitas comprobar el mensaje de activación recibido en el e-mail de activación."
},
"KnownHostDialog": {
"title": "{modo, seleccionar, editar {Editar} otro {Agregar}} IP conocida",
"subtitle": "Añadir una nueva dirección IP te permite conectarte a diferentes servidores. Introduce los detalles a continuación a tu lista de IPs."
},
"RegistrationDialog": {
"title": "Crear nueva cuenta"
},
"RequestPasswordResetDialog": {
"title": "Requiere reinicio de contraseña"
},
"ResetPasswordDialog": {
"title": "Reiniciar contraseña"
},
"AccountActivationForm": {
"error": {
"failed": "La activación de la cuenta falló"
},
"label": {
"activate": "Activar cuenta"
}
},
"KnownHostForm": {
"help": "¿Necesitas ayuda al añadir una nueva dirección IP?",
"label": {
"add": "Añadir dirección IP",
"find": "Encontrar dirección IP"
}
},
"LoginForm": {
"label": {
"autoConnect": "Conectarse automáticamente",
"forgot": "Contraseña olvidada",
"login": "Conectar",
"savePassword": "Guardar contraseña",
"savedPassword": "Contraseña guardada"
}
},
"RegisterForm": {
"label": {
"register": "Registrarse"
},
"toast": {
"registerSuccess": "¡Te has registrado correctamente!"
}
},
"RequestPasswordResetForm": {
"error": "Solicitud de restablecimiento de contraseña fallida",
"mfaEnabled": "El servidor tiene habilitada la autenticación multifactor",
"request": "Se requiere reiniciar el token",
"skipRequest": "Ya tengo un reinicio de token"
},
"ResetPasswordForm": {
"error": "El reinicio de la contraseña falló",
"label": {
"reset": "Reiniciar contraseña"
}
}
}

View file

@ -1,382 +0,0 @@
{
"Common": {
"language": "Suomi (Finnish)",
"disconnect": "Katkaise yhteys",
"label": {
"confirmPassword": "Vahvista salasana",
"confirmSure": "Oletko varma?",
"country": "Maa",
"delete": "Poista",
"email": "Sähköposti",
"hostName": "Isännän Nimi",
"hostAddress": "Isännän Osoite",
"password": "Salasana",
"passwordAgain": "Salasana uudelleen",
"port": "Portti",
"realName": "Oikea nimi",
"saveChanges": "Tallenna muutokset",
"token": "Tokeni",
"username": "Käyttäjänimi"
},
"validation": {
"minChars": "Minimum of {count} {count, plural, one {character} other {characters}} required",
"passwordsMustMatch": "Passwords don't match",
"required": "Required"
},
"countries": {
"AD": "Andorra",
"AE": "United Arab Emirates",
"AF": "Afghanistan",
"AG": "Antigua and Barbuda",
"AI": "Anguilla",
"AL": "Albania",
"AM": "Armenia",
"AO": "Angola",
"AQ": "Antarctica",
"AR": "Argentina",
"AS": "American Samoa",
"AT": "Austria",
"AU": "Australia",
"AW": "Aruba",
"AX": "Åland Islands",
"AZ": "Azerbaijan",
"BA": "Bosnia and Herzegovina",
"BB": "Barbados",
"BD": "Bangladesh",
"BE": "Belgium",
"BF": "Burkina Faso",
"BG": "Bulgaria",
"BH": "Bahrain",
"BI": "Burundi",
"BJ": "Benin",
"BL": "Saint Barthélemy",
"BM": "Bermuda",
"BN": "Brunei Darussalam",
"BO": "Bolivia",
"BQ": "Bonaire, Sint Eustatius and Saba",
"BR": "Brazil",
"BS": "Bahamas",
"BT": "Bhutan",
"BV": "Bouvet Island",
"BW": "Botswana",
"BY": "Belarus",
"BZ": "Belize",
"CA": "Canada",
"CC": "Cocos (Keeling) Islands",
"CD": "DR Congo",
"CF": "Central African Republic",
"CG": "Republic of the Congo",
"CH": "Switzerland",
"CI": "Ivory Coast",
"CK": "Cook Islands",
"CL": "Chile",
"CM": "Cameroon",
"CN": "China",
"CO": "Colombia",
"CR": "Costa Rica",
"CU": "Cuba",
"CV": "Cape Verde",
"CW": "Curaçao",
"CX": "Christmas Island",
"CY": "Cyprus",
"CZ": "Czechia",
"DE": "Germany",
"DJ": "Djibouti",
"DK": "Denmark",
"DM": "Dominica",
"DO": "Dominican Republic",
"DZ": "Algeria",
"EC": "Ecuador",
"EE": "Estonia",
"EG": "Egypt",
"EH": "Western Sahara",
"ER": "Eritrea",
"ES": "Spain",
"ET": "Ethiopia",
"FI": "Finland",
"FJ": "Fiji",
"FK": "Falkland Islands",
"FM": "Micronesia",
"FO": "Faroe Islands",
"FR": "France",
"GA": "Gabon",
"GB": "United Kingdom",
"GD": "Grenada",
"GE": "Georgia",
"GF": "French Guiana",
"GG": "Guernsey",
"GH": "Ghana",
"GI": "Gibraltar",
"GL": "Greenland",
"GM": "Gambia",
"GN": "Guinea",
"GP": "Guadeloupe",
"GQ": "Equatorial Guinea",
"GR": "Greece",
"GS": "South Georgia and the South Sandwich Islands",
"GT": "Guatemala",
"GU": "Guam",
"GW": "Guinea-Bissau",
"GY": "Guyana",
"HK": "Hong Kong",
"HM": "Heard Island and McDonald Islands",
"HN": "Honduras",
"HR": "Croatia",
"HT": "Haiti",
"HU": "Hungary",
"ID": "Indonesia",
"IE": "Ireland",
"IL": "Israel",
"IM": "Isle of Man",
"IN": "India",
"IO": "British Indian Ocean Territory",
"IQ": "Iraq",
"IR": "Iran",
"IS": "Iceland",
"IT": "Italy",
"JE": "Jersey",
"JM": "Jamaica",
"JO": "Jordan",
"JP": "Japan",
"KE": "Kenya",
"KG": "Kyrgyzstan",
"KH": "Cambodia",
"KI": "Kiribati",
"KM": "Comoros",
"KN": "Saint Kitts and Nevis",
"KP": "North Korea",
"KR": "South Korea",
"KW": "Kuwait",
"KY": "Cayman Islands",
"KZ": "Kazakhstan",
"LA": "Laos",
"LB": "Lebanon",
"LC": "Saint Lucia",
"LI": "Liechtenstein",
"LK": "Sri Lanka",
"LR": "Liberia",
"LS": "Lesotho",
"LT": "Lithuania",
"LU": "Luxembourg",
"LV": "Latvia",
"LY": "Libya",
"MA": "Morocco",
"MC": "Monaco",
"MD": "Moldova",
"ME": "Montenegro",
"MF": "Saint Martin (French part)",
"MG": "Madagascar",
"MH": "Marshall Islands",
"MK": "North Macedonia",
"ML": "Mali",
"MM": "Myanmar",
"MN": "Mongolia",
"MO": "Macao",
"MP": "Northern Mariana Islands",
"MQ": "Martinique",
"MR": "Mauritania",
"MS": "Montserrat",
"MT": "Malta",
"MU": "Mauritius",
"MV": "Maldives",
"MW": "Malawi",
"MX": "Mexico",
"MY": "Malaysia",
"MZ": "Mozambique",
"NA": "Namibia",
"NC": "New Caledonia",
"NE": "Niger",
"NF": "Norfolk Island",
"NG": "Nigeria",
"NI": "Nicaragua",
"NL": "Netherlands",
"NO": "Norway",
"NP": "Nepal",
"NR": "Nauru",
"NU": "Niue",
"NZ": "New Zealand",
"OM": "Oman",
"PA": "Panama",
"PE": "Peru",
"PF": "French Polynesia",
"PG": "Papua New Guinea",
"PH": "Philippines",
"PK": "Pakistan",
"PL": "Poland",
"PM": "Saint Pierre and Miquelon",
"PN": "Pitcairn",
"PR": "Puerto Rico",
"PS": "Palestine",
"PT": "Portugal",
"PW": "Palau",
"PY": "Paraguay",
"QA": "Qatar",
"RE": "Réunion",
"RO": "Romania",
"RS": "Serbia",
"RU": "Russia",
"RW": "Rwanda",
"SA": "Saudi Arabia",
"SB": "Solomon Islands",
"SC": "Seychelles",
"SD": "Sudan",
"SE": "Sweden",
"SG": "Singapore",
"SH": "Saint Helena, Ascension and Tristan da Cunha",
"SI": "Slovenia",
"SJ": "Svalbard and Jan Mayen",
"SK": "Slovakia",
"SL": "Sierra Leone",
"SM": "San Marino",
"SN": "Senegal",
"SO": "Somalia",
"SR": "Suriname",
"SS": "South Sudan",
"ST": "Sao Tome and Principe",
"SV": "El Salvador",
"SX": "Sint Maarten (Dutch part)",
"SY": "Syria",
"SZ": "Eswatini",
"TC": "Turks and Caicos Islands",
"TD": "Chad",
"TF": "TAAF",
"TG": "Togo",
"TH": "Thailand",
"TJ": "Tajikistan",
"TK": "Tokelau",
"TL": "Timor-Leste",
"TM": "Turkmenistan",
"TN": "Tunisia",
"TO": "Tonga",
"TR": "Turkey",
"TT": "Trinidad and Tobago",
"TV": "Tuvalu",
"TW": "Taiwan",
"TZ": "Tanzania",
"UA": "Ukraine",
"UG": "Uganda",
"UM": "United States Minor Outlying Islands",
"US": "United States",
"UY": "Uruguay",
"UZ": "Uzbekistan",
"VA": "Holy See",
"VC": "Saint Vincent and the Grenadines",
"VE": "Venezuela",
"VG": "British Virgin Islands",
"VI": "U.S. Virgin Islands",
"VN": "Viet Nam",
"VU": "Vanuatu",
"WF": "Wallis and Futuna",
"WS": "Samoa",
"YE": "Yemen",
"YT": "Mayotte",
"XK": "Kosovo",
"ZA": "South Africa",
"ZM": "Zambia",
"ZW": "Zimbabwe",
"EU": "European Union"
},
"languages": {
"en-US": "English - US",
"fr": "French",
"nl": "Dutch",
"pt_BR": "Portuguese - Brazil"
}
},
"KnownHosts": {
"label": "Isäntä",
"add": "Lisää isäntä",
"toast": "Host successfully {mode, select, created {created} deleted {deleted} other {edited}}."
},
"InitializeContainer": {
"title": "TIESITKÖ",
"subtitle": "<1>Cockatricea pyörittävät vapaaehtoiset</1><1>jotka rakastavat korttipelejä!</1>"
},
"LoginContainer": {
"header": {
"title": "Kirjaudu sisään",
"subtitle": "Järjestelmäriippumaton virtuaalinen pöytä moninpelikorttipelejä varten."
},
"footer": {
"registerPrompt": "Etkö ole vielä rekisteröitynyt?",
"registerAction": "Luo tili",
"credit": "Cockatrice on avoimen lähdekoodin projekti",
"version": "Versio"
},
"content": {
"subtitle1": "Pelaa moninpelikorttipelejä verkossa.",
"subtitle2": "Järjestelmäriippumaton virtuaalinen pöytä moninpelikorttipelejä varten. Ikuisesti ilmainen."
},
"toasts": {
"passwordResetSuccessToast": "Salasanan Nollaus Onnistui",
"accountActivationSuccess": "Tilin Aktivointi Onnistui"
}
},
"UnsupportedContainer": {
"title": "Selainta ei tueta",
"subtitle1": "Päivitä selain ja/tai tarksita käyttöoikeudet.",
"subtitle2": "Huomautus: Yksityinen selaaminen saa jotkin selaimet poistamaan tietyt käyttöoikeudet tai ominaisuudet käytöstä."
},
"AccountActivationDialog": {
"title": "Tilin Aktivointi",
"subtitle1": "Your account has not been activated yet.",
"subtitle2": "You need to provide the activation token received in the activation email."
},
"KnownHostDialog": {
"title": "{mode, select, edit {Edit} other {Add}} Known Host",
"subtitle": "Uuden isännän lisääminen mahdollistaa yhdistämisen eri palvelimiin. Lisää alla olevat tiedot isäntäluetteloosi."
},
"RegistrationDialog": {
"title": "Luo Tili"
},
"RequestPasswordResetDialog": {
"title": "Request Password Reset"
},
"ResetPasswordDialog": {
"title": "Nollaa Salasana"
},
"AccountActivationForm": {
"error": {
"failed": "Tilin aktivointi epäonnistui"
},
"label": {
"activate": "Aktivoi Tili"
}
},
"KnownHostForm": {
"help": "Tarvitsetko apua isännän lisäämisessä?",
"label": {
"add": "Lisää Isäntä",
"find": "Etsi Isäntä"
}
},
"LoginForm": {
"label": {
"autoConnect": "Auto Connect",
"forgot": "Forgot Password",
"login": "Kirjaudu sisään",
"savePassword": "Save Password",
"savedPassword": "Saved Password"
}
},
"RegisterForm": {
"label": {
"register": "Register"
},
"toast": {
"registerSuccess": "Registration Successful!"
}
},
"RequestPasswordResetForm": {
"error": "Request password reset failed",
"mfaEnabled": "Server has multi-factor authentication enabled",
"request": "Request Reset Token",
"skipRequest": "I already have a reset token"
},
"ResetPasswordForm": {
"error": "Password reset failed",
"label": {
"reset": "Nollaa Salasana"
}
}
}

View file

@ -1,382 +0,0 @@
{
"Common": {
"language": "Français (French)",
"disconnect": "Déconnecter",
"label": {
"confirmPassword": "Confirmer le mot de passe",
"confirmSure": "Êtes-vous sûr ?",
"country": "Pays",
"delete": "Effacer",
"email": "E-mail",
"hostName": "Nom d'hôte",
"hostAddress": "Adresse d'hôte",
"password": "Mot de passe",
"passwordAgain": "Mot de passe à nouveau",
"port": "Port",
"realName": "Nom réel",
"saveChanges": "Sauvegarder les changements",
"token": "Jeton",
"username": "Nom d'utilisateur"
},
"validation": {
"minChars": "Minimum de {count} {count, plural, one {caractère} other {caractères}} requis",
"passwordsMustMatch": "Les mots de passe ne correspondent pas.",
"required": "Requis"
},
"countries": {
"AD": "Andorre",
"AE": "Émirats arabes unis",
"AF": "Afghanistan",
"AG": "Antigua-et-Barbuda",
"AI": "Anguilla",
"AL": "Albanie",
"AM": "Arménie",
"AO": "Angola",
"AQ": "Antarctique",
"AR": "Argentine",
"AS": "Samoa américaines",
"AT": "Autriche",
"AU": "Australie",
"AW": "Aruba",
"AX": "Åland",
"AZ": "Azerbaijan",
"BA": "Bosnie-Herzégovine",
"BB": "Barbade",
"BD": "Bangladesh",
"BE": "Belgique",
"BF": "Burkina Faso",
"BG": "Bulgarie",
"BH": "Bahrain",
"BI": "Burundi",
"BJ": "Bénin",
"BL": "Saint Barthélemy",
"BM": "Bermudes",
"BN": "Brunéi Darussalam",
"BO": "Bolivie",
"BQ": "Pays-Bas caribéens",
"BR": "Brésil",
"BS": "Bahamas",
"BT": "Bhoutan",
"BV": "Île Bouvet",
"BW": "Botswana",
"BY": "Biélorussie",
"BZ": "Belize",
"CA": "Canada",
"CC": "Îles Cocos (Keeling)",
"CD": "République Démocratique du Congo",
"CF": "République Centrafricaine",
"CG": "République du Congo",
"CH": "Suisse",
"CI": "Côte d'Ivoire",
"CK": "Îles Cook",
"CL": "Chili",
"CM": "Cameroun",
"CN": "Chine",
"CO": "Colombie",
"CR": "Costa Rica",
"CU": "Cuba",
"CV": "Cap-Vert",
"CW": "Curaçao",
"CX": "Île Christmas",
"CY": "Chypre",
"CZ": "Tchéquie",
"DE": "Allemagne",
"DJ": "Djibouti",
"DK": "Danemark",
"DM": "Dominique",
"DO": "République dominicaine",
"DZ": "Algérie",
"EC": "Équateur",
"EE": "Estonie",
"EG": "Égypte",
"EH": "Sahara Occidental",
"ER": "Érythrée",
"ES": "Espagne",
"ET": "Éthiopie",
"FI": "Finlande",
"FJ": "Fidji",
"FK": "Îles Falkland",
"FM": "Micronésie",
"FO": "Îles Féroé",
"FR": "France",
"GA": "Gabon",
"GB": "Royaume-Uni",
"GD": "Grenade",
"GE": "Géorgie",
"GF": "Guyane Française",
"GG": "Guernsey",
"GH": "Ghana",
"GI": "Gibraltar",
"GL": "Groenland",
"GM": "Gambie",
"GN": "Guinée",
"GP": "Guadeloupe",
"GQ": "Guinée équatoriale",
"GR": "Grèce",
"GS": "Géorgie du Sud et les Îles Sandwich du Sud",
"GT": "Guatemala",
"GU": "Guam",
"GW": "Guinée-Bissau",
"GY": "Guyana",
"HK": "Hong Kong",
"HM": "Îles Heard et McDonald",
"HN": "Honduras",
"HR": "Croatie",
"HT": "Haïti",
"HU": "Hongrie",
"ID": "Indonésie",
"IE": "Irlande",
"IL": "Israël",
"IM": "Île de Man",
"IN": "Inde",
"IO": "Territoire britannique de l'océan Indien",
"IQ": "Irak",
"IR": "Iran",
"IS": "Islande",
"IT": "Italie",
"JE": "Jersey",
"JM": "Jamaïque",
"JO": "Jordanie",
"JP": "Japon",
"KE": "Kenya",
"KG": "Kirghizistan",
"KH": "Cambodge",
"KI": "Kiribati",
"KM": "Comores",
"KN": "Saint-Kitts-et-Nevis",
"KP": "République Populaire et Démocratique de Corée",
"KR": "Corée du Sud",
"KW": "Koweït",
"KY": "Îles Caïmans",
"KZ": "Kazakhstan",
"LA": "Laos",
"LB": "Liban",
"LC": "Sainte-Lucie",
"LI": "Liechtenstein",
"LK": "Sri Lanka",
"LR": "Liberia",
"LS": "Lesotho",
"LT": "Lituanie",
"LU": "Luxembourg",
"LV": "Lettonie",
"LY": "Lybie",
"MA": "Maroc",
"MC": "Monaco",
"MD": "Moldavie",
"ME": "Montenegro",
"MF": "Saint-Martin (Territoire Français)",
"MG": "Madagascar",
"MH": "Îles Marshall",
"MK": "Macédoine du Nord",
"ML": "Mali",
"MM": "Myanmar",
"MN": "Mongolie",
"MO": "Macao",
"MP": "Îles Mariannes du Nord",
"MQ": "Martinique",
"MR": "Mauritanie",
"MS": "Montserrat",
"MT": "Malte",
"MU": "Maurice",
"MV": "Maldives",
"MW": "Malawi",
"MX": "Mexique",
"MY": "Malaisie",
"MZ": "Mozambique",
"NA": "Namibie",
"NC": "Nouvelle Calédonie",
"NE": "Niger",
"NF": "Île Norfolk",
"NG": "Nigeria",
"NI": "Nicaragua",
"NL": "Pays-Bas",
"NO": "Norvège",
"NP": "Népal",
"NR": "Nauru",
"NU": "Niué",
"NZ": "Nouvelle-Zélande",
"OM": "Oman",
"PA": "Panama",
"PE": "Pérou",
"PF": "Polynésie Française",
"PG": "Papouasie-Nouvelle-Guinée",
"PH": "Philippines",
"PK": "Pakistan",
"PL": "Pologne",
"PM": "Saint Pierre et Miquelon",
"PN": "Îles Pitcairn",
"PR": "Porto Rico",
"PS": "Palestine",
"PT": "Portugal",
"PW": "Palaos",
"PY": "Paraguay",
"QA": "Qatar",
"RE": "La Réunion",
"RO": "Roumanie",
"RS": "Serbie",
"RU": "Russie",
"RW": "Rwanda",
"SA": "Arabie Saoudite",
"SB": "Îles Salomon",
"SC": "Seychelles",
"SD": "Soudan",
"SE": "Suède",
"SG": "Singapour",
"SH": "Sainte-Hélène",
"SI": "Slovénie",
"SJ": "Svalbard et Jan Mayen",
"SK": "Slovaquie",
"SL": "Sierra Leone",
"SM": "Saint-Marin",
"SN": "Sénégal",
"SO": "Somalie",
"SR": "Suriname",
"SS": "Soudan du Sud",
"ST": "Sao Tome et Principe",
"SV": "El Salvador",
"SX": "Sint Maarten (territoire des Pays-Bas)",
"SY": "Syrie",
"SZ": "Eswatini",
"TC": "Îles Turks et Caïques",
"TD": "Tchad",
"TF": "Terres australes et antarctiques françaises",
"TG": "Togo",
"TH": "Thailande",
"TJ": "Tajikistan",
"TK": "Tokelau",
"TL": "Timor-Leste",
"TM": "Turkmenistan",
"TN": "Tunisie",
"TO": "Tonga",
"TR": "Turquie",
"TT": "Trinité-et-Tobago",
"TV": "Tuvalu",
"TW": "Taïwan",
"TZ": "Tanzanie",
"UA": "Ukraine",
"UG": "Ouganda",
"UM": "Îles mineures éloignées des États-Unis",
"US": "États-Unis",
"UY": "Uruguay",
"UZ": "Ouzbekistan",
"VA": "Saint-Siège",
"VC": "Saint-Vincent et les Grenadines",
"VE": "Venezuela",
"VG": "Îles Vierges britanniques",
"VI": "Îles Vierges des États-Unis",
"VN": "Vietnam",
"VU": "Vanuatu",
"WF": "Wallis et Futuna",
"WS": "Samoa",
"YE": "Yemen",
"YT": "Mayotte",
"XK": "Kosovo",
"ZA": "Afrique du Sud",
"ZM": "Zambie",
"ZW": "Zimbabwe",
"EU": "Union Européenne"
},
"languages": {
"en-US": "Anglais - US",
"fr": "Français",
"nl": "Néerlandais",
"pt_BR": "Portugais - Brésil"
}
},
"KnownHosts": {
"label": "Hôte",
"add": "Ajouter un nouvel hôte",
"toast": "Hôte {mode, select, created {créé} deleted {effacé} other {édité}} avec succès."
},
"InitializeContainer": {
"title": "LE SAVIEZ-VOUS ?",
"subtitle": "<1>Cockatrice est géré par des volontaires</1><1>qui aiment les jeux de cartes !</1>"
},
"LoginContainer": {
"header": {
"title": "S'identifier",
"subtitle": "Un jeu de table virtuel multi-plate-forme pour jeux de cartes multijoueurs."
},
"footer": {
"registerPrompt": "Pas encore inscrit ?",
"registerAction": "Créer un compte",
"credit": "Cockatrice est un projet open source.",
"version": "Version"
},
"content": {
"subtitle1": "Jouer à des jeux de cartes multijoueurs en ligne.",
"subtitle2": "Jeu de table virtuel multi-plate-forme pour jeux de cartes multijoueurs. Gratuit pour toujours."
},
"toasts": {
"passwordResetSuccessToast": "Mot de passe réinitialisé avec succès",
"accountActivationSuccess": "Compte activé avec succès"
}
},
"UnsupportedContainer": {
"title": "Navigateur non supporté",
"subtitle1": "Veuillez mettre à jour votre navigateur et/ou vérifier vos permissions.",
"subtitle2": "Note : La navigation privée désactive certaines permissions ou fonctionnalités."
},
"AccountActivationDialog": {
"title": "Activation du compte",
"subtitle1": "Votre compte n'a pas encore été activé.",
"subtitle2": "Vous devez fournir le jeton d'activation reçu dans l'e-mail d'activation."
},
"KnownHostDialog": {
"title": "{mode, select, edit {Éditer} other {Ajouter}} un hôte connu",
"subtitle": "Ajouter un nouvel hôte vous permet de vous connecter à différents serveurs. Entrez les détails ci-dessous dans votre liste d'hôtes."
},
"RegistrationDialog": {
"title": "Créer un nouveau compte"
},
"RequestPasswordResetDialog": {
"title": "Demander une réinitialisation du mot de passe"
},
"ResetPasswordDialog": {
"title": "Réinitialiser le mot de passe"
},
"AccountActivationForm": {
"error": {
"failed": "L'activation du compte a échoué."
},
"label": {
"activate": "Activer le compte"
}
},
"KnownHostForm": {
"help": "Besoin d'aide pour ajouter un nouvel hôte ?",
"label": {
"add": "Ajouter un hôte",
"find": "Trouver un hôte"
}
},
"LoginForm": {
"label": {
"autoConnect": "Connexion automatique",
"forgot": "Mot de passe oublié",
"login": "S'identifier",
"savePassword": "Enregistrer le mot de passe",
"savedPassword": "Mot de passe enregistré"
}
},
"RegisterForm": {
"label": {
"register": "S'enregistrer"
},
"toast": {
"registerSuccess": "Enregistrement réussi !"
}
},
"RequestPasswordResetForm": {
"error": "La demande de réinitialisation du mot de passe a échoué.",
"mfaEnabled": "L'authentification multifacteur est activée sur ce serveur.",
"request": "Réinitialiser jeton",
"skipRequest": "Je possède déjà un jeton de réinitialisation."
},
"ResetPasswordForm": {
"error": "La réinitialisation du mot de passe a échoué.",
"label": {
"reset": "Réinitialiser le mot de passe"
}
}
}

View file

@ -1,382 +0,0 @@
{
"Common": {
"language": "Italiano (Italian)",
"disconnect": "Disconnetti",
"label": {
"confirmPassword": "Conferma Password",
"confirmSure": "Sei sicuro?",
"country": "Stato",
"delete": "Elimina",
"email": "Email",
"hostName": "Nome Host",
"hostAddress": "Indirizzo Host",
"password": "Password",
"passwordAgain": "Ripeti Password",
"port": "Porta",
"realName": "Nome reale",
"saveChanges": "Salva Cambiamenti",
"token": "Pedina",
"username": "Nome utente"
},
"validation": {
"minChars": "Minimo di {%n} carattere(i) richiesti",
"passwordsMustMatch": "Le password non coincidono.",
"required": "Richiesto"
},
"countries": {
"AD": "Andorra",
"AE": "Emirati Arabi Uniti",
"AF": "Afghanistan",
"AG": "Antigua e Barbuda",
"AI": "Anguilla",
"AL": "Albania",
"AM": "Armenia",
"AO": "Angola",
"AQ": "Antartide",
"AR": "Argentina",
"AS": "Samoa Americane",
"AT": "Austria",
"AU": "Australia",
"AW": "Aruba",
"AX": "Isole Åland",
"AZ": "Azerbaijan",
"BA": "Bosnia ed Erzegovina",
"BB": "Barbados",
"BD": "Bangledesh",
"BE": "Belgio",
"BF": "Burkina Faso",
"BG": "Bulgaria",
"BH": "Bahrein",
"BI": "Burundi",
"BJ": "Benin",
"BL": "Saint Barthélemy",
"BM": "Bermuda",
"BN": "Brunei",
"BO": "Bolivia",
"BQ": "Paesi Bassi Caraibici",
"BR": "Brasile",
"BS": "Bahamas",
"BT": "Bhutan",
"BV": "Isola Bouvet",
"BW": "Botswana",
"BY": "Bielorussia",
"BZ": "Belize",
"CA": "Canada",
"CC": "Isole Cocos (Keeling)",
"CD": "DR Congo",
"CF": "Repubblica Centrafricana",
"CG": "Repubblica del Congo",
"CH": "Svizzera",
"CI": "Costa D'Avorio",
"CK": "Isole Cook",
"CL": "Cile",
"CM": "Camerun",
"CN": "Cina",
"CO": "Colombia",
"CR": "Costa Rica",
"CU": "Cuba",
"CV": "Capo Verde",
"CW": "Curaçao",
"CX": "Isola Christmas",
"CY": "Cipro",
"CZ": "Repubblica Ceca",
"DE": "Germania",
"DJ": "Gibuti",
"DK": "Danimarca",
"DM": "Dominica",
"DO": "Repubblica Domenicana",
"DZ": "Algeria",
"EC": "Ecuador",
"EE": "Estonia",
"EG": "Egitto",
"EH": "Sahara Occidentale",
"ER": "Eritrea",
"ES": "Spagna",
"ET": "Etiopia",
"FI": "Finlandia",
"FJ": "Fiji",
"FK": "Isole Falkland",
"FM": "Micronesia",
"FO": "Isole Faroe",
"FR": "Francia",
"GA": "Gabon",
"GB": "Regno Unito",
"GD": "Grenada",
"GE": "Georgia",
"GF": "Guyana Francese",
"GG": "Guernsey",
"GH": "Ghana",
"GI": "Gibraltar",
"GL": "Groenlandia",
"GM": "Gambia",
"GN": "Guinea",
"GP": "Guadalupa",
"GQ": "Guinea Equatoriale",
"GR": "Grecia",
"GS": "Georgia del Sud e Isole Sandwich Australi",
"GT": "Guatemala",
"GU": "Guam",
"GW": "Guinea-Bissau",
"GY": "Guyana",
"HK": "Hong Kong",
"HM": "Isole Heard e McDonald",
"HN": "Honduras",
"HR": "Croazia",
"HT": "Haiti",
"HU": "Ungheria",
"ID": "Indonesia",
"IE": "Irlanda",
"IL": "Israele",
"IM": "Isola di Man",
"IN": "India",
"IO": "Territorio britannico dell'Oceano Indiano",
"IQ": "Iraq",
"IR": "Iran",
"IS": "Islanda",
"IT": "Italia",
"JE": "Jersey",
"JM": "Jamaica",
"JO": "Giordania",
"JP": "Giappone",
"KE": "Kenya",
"KG": "Kirghizistan",
"KH": "Cambogia",
"KI": "Kiribati",
"KM": "Comore",
"KN": "Saint Kitts e Nevis",
"KP": "Korea del Nord",
"KR": "Korea del Sud",
"KW": "Kuwait",
"KY": "Isole Cayman",
"KZ": "Kazakhstan",
"LA": "Laos",
"LB": "Lebano",
"LC": "Santa Lucia",
"LI": "Liechtenstein",
"LK": "Sri Lanka",
"LR": "Liberia",
"LS": "Lesotho",
"LT": "Lituania",
"LU": "Lussemburgo",
"LV": "Lettonia",
"LY": "Libia",
"MA": "Marocco",
"MC": "Monaco",
"MD": "Moldova",
"ME": "Montenegro",
"MF": "San Martino (parte Francese)",
"MG": "Madagascar",
"MH": "Isole Marshall",
"MK": "Macedonia del Nord",
"ML": "Mali",
"MM": "Birmania",
"MN": "Mongolia",
"MO": "Macao",
"MP": "Isole Marianne Settentrionali",
"MQ": "Martinica",
"MR": "Mauritania",
"MS": "Montserrat",
"MT": "Malta",
"MU": "Mauritius",
"MV": "Maldive",
"MW": "Malawi",
"MX": "Messico",
"MY": "Malesia",
"MZ": "Mozambico",
"NA": "Namibia",
"NC": "Nuova Caledonia",
"NE": "Niger",
"NF": "Isola Norfolk",
"NG": "Nigeria",
"NI": "Nicaragua",
"NL": "Paesi Bassi",
"NO": "Norvegia",
"NP": "Nepal",
"NR": "Nauru",
"NU": "Niue",
"NZ": "Nuova Zelanda",
"OM": "Oman",
"PA": "Panama",
"PE": "Peru",
"PF": "Polinesia Francese",
"PG": "Papua Nuova Guinea",
"PH": "Filippine",
"PK": "Pakistan",
"PL": "Polonia",
"PM": "Saint Pierre e Miquelon",
"PN": "Pitcairn",
"PR": "Porto Rico",
"PS": "Palestina",
"PT": "Portogallo",
"PW": "Palau",
"PY": "Paraguay",
"QA": "Qatar",
"RE": "La Riunione",
"RO": "Romania",
"RS": "Serbia",
"RU": "Russia",
"RW": "Rwanda",
"SA": "Arabia Saudita",
"SB": "Isole Salomone",
"SC": "Seychelles",
"SD": "Sudan",
"SE": "Svezia",
"SG": "Singapore",
"SH": "Sant'Elena, Ascensione e Tristan da Cunha",
"SI": "Slovenia",
"SJ": "Svalbard e Jan Mayen",
"SK": "Slovakia",
"SL": "Sierra Leone",
"SM": "San Marino",
"SN": "Senegal",
"SO": "Somalia",
"SR": "Suriname",
"SS": "Sud Sudan",
"ST": "Sao Tome e Principe",
"SV": "El Salvador",
"SX": "Sint Maarten (Parte Olandese)",
"SY": "Siria",
"SZ": "eSwatini",
"TC": "Turks e Caicos",
"TD": "Chad",
"TF": "TAAF",
"TG": "Togo",
"TH": "Thailand",
"TJ": "Tajikistan",
"TK": "Tokelau",
"TL": "Timor Est",
"TM": "Turkmenistan",
"TN": "Tunisia",
"TO": "Tonga",
"TR": "Turchia",
"TT": "Trinidad e Tobago",
"TV": "Tuvalu",
"TW": "Taiwan",
"TZ": "Tanzania",
"UA": "Ucraina",
"UG": "Uganda",
"UM": "Isole minori esterne degli Stati Uniti d'America",
"US": "Stati Uniti",
"UY": "Uruguay",
"UZ": "Uzbekistan",
"VA": "Vaticano",
"VC": "Saint Vincent e Grenadine",
"VE": "Venezuela",
"VG": "Isole Vergini britanniche",
"VI": "Isole Vergini americane",
"VN": "Viet Nam",
"VU": "Vanuatu",
"WF": "Wallis e Futuna",
"WS": "Samoa",
"YE": "Yemen",
"YT": "Mayotte",
"XK": "Kosovo",
"ZA": "Sud Africa",
"ZM": "Zambia",
"ZW": "Zimbabwe",
"EU": "Unione Europea"
},
"languages": {
"en-US": "Inglese - US",
"fr": "Francese",
"nl": "Olandese",
"pt_BR": "Portoghese - Brasile"
}
},
"KnownHosts": {
"label": "Host",
"add": "Aggiungi nuovo Host",
"toast": "Host {mode, select, created {creato} deleted {eliminato} other {modificato}} con successo."
},
"InitializeContainer": {
"title": "LO SAPEVI",
"subtitle": "<1>Cockatrice è gestita da volontari</1><1>che amano i giochi di carte!</1>"
},
"LoginContainer": {
"header": {
"title": "Accesso",
"subtitle": "Un portale digitale multi-piattaforma per giochi di carte multigiocatore"
},
"footer": {
"registerPrompt": "Non sei ancora registrato?",
"registerAction": "Crea un nuovo account",
"credit": "Cockatrice è un progetto open source",
"version": "Versione"
},
"content": {
"subtitle1": "Gioca online giochi di carte multigiocatore.",
"subtitle2": "Portale digitale multi-piattaforma per giochi di carte multigiocatore. Sempre gratis."
},
"toasts": {
"passwordResetSuccessToast": "Password reimpostata con successo",
"accountActivationSuccess": "Account attivato con successo"
}
},
"UnsupportedContainer": {
"title": "Browser non supportato",
"subtitle1": "Aggiornare il browser e/o controllare i permessi.",
"subtitle2": "Nota: la navigazione Privata può far si che il browser disabiliti certi permessi o funzionalità."
},
"AccountActivationDialog": {
"title": "Attivazione dell'account",
"subtitle1": "Il tuo account non è ancora stato attivato.",
"subtitle2": "È necessario fornire il codice ricevuto nell'e-mail di attivazione."
},
"KnownHostDialog": {
"title": "{modalità, seleziona, modifica {Modifica} altro {Aggiungi}} Host conosciuto",
"subtitle": "L'aggiunta di un nuovo host consente di connettersi a server diversi. Inserisci i dettagli di seguito nella lista degli host."
},
"RegistrationDialog": {
"title": "Crea un nuovo account"
},
"RequestPasswordResetDialog": {
"title": "Richiedi la reimpostazione della password"
},
"ResetPasswordDialog": {
"title": "Reimposta Password"
},
"AccountActivationForm": {
"error": {
"failed": "Attivazione dell'account non riuscita"
},
"label": {
"activate": "Attiva account"
}
},
"KnownHostForm": {
"help": "Hai bisogno di aiuto per aggiungere un nuovo host?",
"label": {
"add": "Aggiungi Host",
"find": "Trova Host"
}
},
"LoginForm": {
"label": {
"autoConnect": "Connessione automatica",
"forgot": "Password dimenticata",
"login": "Accesso",
"savePassword": "Salva Password",
"savedPassword": "Password salvata"
}
},
"RegisterForm": {
"label": {
"register": "Iscriviti"
},
"toast": {
"registerSuccess": "Iscrizione completata correttamente!"
}
},
"RequestPasswordResetForm": {
"error": "Richiesta reimpostazione password non riuscita",
"mfaEnabled": "Il server ha l'autenticazione a più fattori abilitata",
"request": "Richiedi il token di ripristino",
"skipRequest": "Ho già un token di ripristino"
},
"ResetPasswordForm": {
"error": "Reimpostazione della password non riuscita",
"label": {
"reset": "Reimposta Password"
}
}
}

View file

@ -1,382 +0,0 @@
{
"Common": {
"language": "Nederlands (Dutch)",
"disconnect": "Verbinding Verbreken",
"label": {
"confirmPassword": "Wachtwoord Bevestigen",
"confirmSure": "Weet je het zeker?",
"country": "Land",
"delete": "Verwijderen",
"email": "Email",
"hostName": "Hostnaam",
"hostAddress": "Hostaddres",
"password": "Wachtwoord",
"passwordAgain": "Wachtwoord Nogmaals",
"port": "Poort",
"realName": "Echte Naam",
"saveChanges": "Wijzigingen Opslaan",
"token": "Token",
"username": "Gebruikersnaam"
},
"validation": {
"minChars": "Minimum van {count} {count, plural, one {karakter} other {karakters}} verplicht",
"passwordsMustMatch": "Wachtwoorden komen niet overeen",
"required": "Verplicht"
},
"countries": {
"AD": "Andorra",
"AE": "United Arab Emirates",
"AF": "Afghanistan",
"AG": "Antigua and Barbuda",
"AI": "Anguilla",
"AL": "Albania",
"AM": "Armenia",
"AO": "Angola",
"AQ": "Antarctica",
"AR": "Argentina",
"AS": "American Samoa",
"AT": "Austria",
"AU": "Australia",
"AW": "Aruba",
"AX": "Åland Islands",
"AZ": "Azerbaijan",
"BA": "Bosnia and Herzegovina",
"BB": "Barbados",
"BD": "Bangladesh",
"BE": "Belgium",
"BF": "Burkina Faso",
"BG": "Bulgaria",
"BH": "Bahrain",
"BI": "Burundi",
"BJ": "Benin",
"BL": "Saint Barthélemy",
"BM": "Bermuda",
"BN": "Brunei Darussalam",
"BO": "Bolivia",
"BQ": "Bonaire, Sint Eustatius and Saba",
"BR": "Brazil",
"BS": "Bahamas",
"BT": "Bhutan",
"BV": "Bouvet Island",
"BW": "Botswana",
"BY": "Belarus",
"BZ": "Belize",
"CA": "Canada",
"CC": "Cocos (Keeling) Islands",
"CD": "DR Congo",
"CF": "Central African Republic",
"CG": "Republic of the Congo",
"CH": "Switzerland",
"CI": "Ivory Coast",
"CK": "Cook Islands",
"CL": "Chile",
"CM": "Cameroon",
"CN": "China",
"CO": "Colombia",
"CR": "Costa Rica",
"CU": "Cuba",
"CV": "Cape Verde",
"CW": "Curaçao",
"CX": "Christmas Island",
"CY": "Cyprus",
"CZ": "Czechia",
"DE": "Germany",
"DJ": "Djibouti",
"DK": "Denmark",
"DM": "Dominica",
"DO": "Dominican Republic",
"DZ": "Algeria",
"EC": "Ecuador",
"EE": "Estonia",
"EG": "Egypt",
"EH": "Western Sahara",
"ER": "Eritrea",
"ES": "Spain",
"ET": "Ethiopia",
"FI": "Finland",
"FJ": "Fiji",
"FK": "Falkland Islands",
"FM": "Micronesia",
"FO": "Faroe Islands",
"FR": "France",
"GA": "Gabon",
"GB": "United Kingdom",
"GD": "Grenada",
"GE": "Georgia",
"GF": "French Guiana",
"GG": "Guernsey",
"GH": "Ghana",
"GI": "Gibraltar",
"GL": "Greenland",
"GM": "Gambia",
"GN": "Guinea",
"GP": "Guadeloupe",
"GQ": "Equatorial Guinea",
"GR": "Greece",
"GS": "South Georgia and the South Sandwich Islands",
"GT": "Guatemala",
"GU": "Guam",
"GW": "Guinea-Bissau",
"GY": "Guyana",
"HK": "Hong Kong",
"HM": "Heard Island and McDonald Islands",
"HN": "Honduras",
"HR": "Croatia",
"HT": "Haiti",
"HU": "Hungary",
"ID": "Indonesia",
"IE": "Ireland",
"IL": "Israel",
"IM": "Isle of Man",
"IN": "India",
"IO": "British Indian Ocean Territory",
"IQ": "Iraq",
"IR": "Iran",
"IS": "Iceland",
"IT": "Italy",
"JE": "Jersey",
"JM": "Jamaica",
"JO": "Jordan",
"JP": "Japan",
"KE": "Kenya",
"KG": "Kyrgyzstan",
"KH": "Cambodia",
"KI": "Kiribati",
"KM": "Comoros",
"KN": "Saint Kitts and Nevis",
"KP": "North Korea",
"KR": "South Korea",
"KW": "Kuwait",
"KY": "Cayman Islands",
"KZ": "Kazakhstan",
"LA": "Laos",
"LB": "Lebanon",
"LC": "Saint Lucia",
"LI": "Liechtenstein",
"LK": "Sri Lanka",
"LR": "Liberia",
"LS": "Lesotho",
"LT": "Lithuania",
"LU": "Luxembourg",
"LV": "Latvia",
"LY": "Libya",
"MA": "Morocco",
"MC": "Monaco",
"MD": "Moldova",
"ME": "Montenegro",
"MF": "Saint Martin (French part)",
"MG": "Madagascar",
"MH": "Marshall Islands",
"MK": "North Macedonia",
"ML": "Mali",
"MM": "Myanmar",
"MN": "Mongolia",
"MO": "Macao",
"MP": "Northern Mariana Islands",
"MQ": "Martinique",
"MR": "Mauritania",
"MS": "Montserrat",
"MT": "Malta",
"MU": "Mauritius",
"MV": "Maldives",
"MW": "Malawi",
"MX": "Mexico",
"MY": "Malaysia",
"MZ": "Mozambique",
"NA": "Namibia",
"NC": "New Caledonia",
"NE": "Niger",
"NF": "Norfolk Island",
"NG": "Nigeria",
"NI": "Nicaragua",
"NL": "Netherlands",
"NO": "Norway",
"NP": "Nepal",
"NR": "Nauru",
"NU": "Niue",
"NZ": "New Zealand",
"OM": "Oman",
"PA": "Panama",
"PE": "Peru",
"PF": "French Polynesia",
"PG": "Papua New Guinea",
"PH": "Philippines",
"PK": "Pakistan",
"PL": "Poland",
"PM": "Saint Pierre and Miquelon",
"PN": "Pitcairn",
"PR": "Puerto Rico",
"PS": "Palestine",
"PT": "Portugal",
"PW": "Palau",
"PY": "Paraguay",
"QA": "Qatar",
"RE": "Réunion",
"RO": "Romania",
"RS": "Serbia",
"RU": "Russia",
"RW": "Rwanda",
"SA": "Saudi Arabia",
"SB": "Solomon Islands",
"SC": "Seychelles",
"SD": "Sudan",
"SE": "Sweden",
"SG": "Singapore",
"SH": "Saint Helena, Ascension and Tristan da Cunha",
"SI": "Slovenia",
"SJ": "Svalbard and Jan Mayen",
"SK": "Slovakia",
"SL": "Sierra Leone",
"SM": "San Marino",
"SN": "Senegal",
"SO": "Somalia",
"SR": "Suriname",
"SS": "South Sudan",
"ST": "Sao Tome and Principe",
"SV": "El Salvador",
"SX": "Sint Maarten (Dutch part)",
"SY": "Syria",
"SZ": "Eswatini",
"TC": "Turks and Caicos Islands",
"TD": "Chad",
"TF": "TAAF",
"TG": "Togo",
"TH": "Thailand",
"TJ": "Tajikistan",
"TK": "Tokelau",
"TL": "Timor-Leste",
"TM": "Turkmenistan",
"TN": "Tunisia",
"TO": "Tonga",
"TR": "Turkey",
"TT": "Trinidad and Tobago",
"TV": "Tuvalu",
"TW": "Taiwan",
"TZ": "Tanzania",
"UA": "Ukraine",
"UG": "Uganda",
"UM": "United States Minor Outlying Islands",
"US": "United States",
"UY": "Uruguay",
"UZ": "Uzbekistan",
"VA": "Holy See",
"VC": "Saint Vincent and the Grenadines",
"VE": "Venezuela",
"VG": "British Virgin Islands",
"VI": "U.S. Virgin Islands",
"VN": "Viet Nam",
"VU": "Vanuatu",
"WF": "Wallis and Futuna",
"WS": "Samoa",
"YE": "Yemen",
"YT": "Mayotte",
"XK": "Kosovo",
"ZA": "South Africa",
"ZM": "Zambia",
"ZW": "Zimbabwe",
"EU": "European Union"
},
"languages": {
"en-US": "English - US",
"fr": "French",
"nl": "Dutch",
"pt_BR": "Portuguese - Brazil"
}
},
"KnownHosts": {
"label": "Host",
"add": "Voeg nieuwe host toe",
"toast": "Host {mode, select created {toegevoegd} deleted {verwijderd} other {aangepast}}."
},
"InitializeContainer": {
"title": "WIST JE DAT",
"subtitle": "<1>Cockatrice word gerund door vrijwilligers</1><1>die van kaartspellen houden!</1>"
},
"LoginContainer": {
"header": {
"title": "Login",
"subtitle": "Een cross-platform virtual tabletop voor multiplayer kaartspellen."
},
"footer": {
"registerPrompt": "Nog niet geregistreerd?",
"registerAction": "Maak een account aan",
"credit": "Cockatrice is een open source project",
"version": "Versie"
},
"content": {
"subtitle1": "Speel multiplayer kaartspellen online.",
"subtitle2": "Cross-platform virtual tabletop voor multiplayer kaartspellen. Gratis en open source."
},
"toasts": {
"passwordResetSuccessToast": "Wachtwoord Opnieuw Ingesteld",
"accountActivationSuccess": "Account Succesvol Geactiveerd"
}
},
"UnsupportedContainer": {
"title": "Niet-ondersteunde Browser",
"subtitle1": "Update je browser en/of check je instellingen.",
"subtitle2": "Let op: Private browsing zorgt er voor dat sommige browsers bepaalde toestemmingen of functies uitschakelen."
},
"AccountActivationDialog": {
"title": "Account Activatie",
"subtitle1": "Je account is nog niet geactiveerd.",
"subtitle2": "Vul de activerings-token die je hebt ontvangen via de activerings-email in."
},
"KnownHostDialog": {
"title": "{mode, select, edit {Aanpassen} other {Toevoegen}} Bekende Host",
"subtitle": "Door een nieuwe host toe te voegen kun je verbinden met andere servers. Vul hieronder de gegevens in."
},
"RegistrationDialog": {
"title": "Maak Een Account Aan"
},
"RequestPasswordResetDialog": {
"title": "Opniew Wachtwoord Aanvragen"
},
"ResetPasswordDialog": {
"title": "Vraag Wachtwoord Opnieuw Aan"
},
"AccountActivationForm": {
"error": {
"failed": "Activering account mislukt"
},
"label": {
"activate": "Activeer Account"
}
},
"KnownHostForm": {
"help": "Hulp nodig met het toevoegen van een nieuwe host?",
"label": {
"add": "Voeg Host Toe",
"find": "Vind Host"
}
},
"LoginForm": {
"label": {
"autoConnect": "Verbind Automatisch",
"forgot": "Wachtwoord Vergeten",
"login": "Log in",
"savePassword": "Wachtwoord Opslaan",
"savedPassword": "Opgeslagen Wachtwoord"
}
},
"RegisterForm": {
"label": {
"register": "Registreer"
},
"toast": {
"registerSuccess": "Registratie Geslaagd!"
}
},
"RequestPasswordResetForm": {
"error": "Opniew wachtwoord aanvragen mislukt",
"mfaEnabled": "Server heeft multi-factor authenticatie ingeschakeld",
"request": "Vraag Reset Token Aan",
"skipRequest": "Ik heb al een reset token"
},
"ResetPasswordForm": {
"error": "Opnieuw wachtwoord aanvragen mislukt",
"label": {
"reset": "Vraag Wachtwoord Opnieuw Aan"
}
}
}

View file

@ -1,382 +0,0 @@
{
"Common": {
"language": "Polski (Polish)",
"disconnect": "Rozłącz",
"label": {
"confirmPassword": "Potwierdź Hasło",
"confirmSure": "Czy na pewno?",
"country": "Kraj",
"delete": "Usuń",
"email": "Email",
"hostName": "Nazwa Hosta",
"hostAddress": "Adres Hosta",
"password": "Hasło",
"passwordAgain": "Hasło Ponownie:",
"port": "Port",
"realName": "Prawdziwe Imię",
"saveChanges": "Zapisz zmiany",
"token": "Token",
"username": "Nazwa użytkownika"
},
"validation": {
"minChars": "Minimum of {count} {count, plural, one {character} other {characters}} required",
"passwordsMustMatch": "Hasła nie są zgodne.",
"required": "Wymagane"
},
"countries": {
"AD": "Andora",
"AE": "Zjednoczone Emiraty Arabskie",
"AF": "Afganistan",
"AG": "Antigua i Barbuda",
"AI": "Anguilla",
"AL": "Albania",
"AM": "Armenia",
"AO": "Angola",
"AQ": "Antarktyka",
"AR": "Argentyna",
"AS": "Samoa Amerykańskie",
"AT": "Austria",
"AU": "Australia",
"AW": "Aruba",
"AX": "Wyspy Alandzkie",
"AZ": "Azerbejdżan",
"BA": "Bośnia i Hercegowina",
"BB": "Barbados",
"BD": "Bangladesz",
"BE": "Belgia",
"BF": "Burkina Faso",
"BG": "Bułgaria",
"BH": "Bahrajn",
"BI": "Burundi",
"BJ": "Benin",
"BL": "Saint-Barthélemy",
"BM": "Bermudy",
"BN": "Brunei",
"BO": "Boliwia",
"BQ": "Bonaire, Sint Eustatius i Saba",
"BR": "Brazylia",
"BS": "Bahamy",
"BT": "Bhutan",
"BV": "Wyspa Bouveta",
"BW": "Botwsana",
"BY": "Białoruś",
"BZ": "Belize",
"CA": "Kanada",
"CC": "Wyspy Kokosowe",
"CD": "Demokratyczna Republika Kongo",
"CF": "Republika Środkowoafrykańska",
"CG": "Kongo",
"CH": "Szwajcaria",
"CI": "Wybrzeże Kości Słoniowej",
"CK": "Wyspa Cooka",
"CL": "Chile",
"CM": "Kamerun",
"CN": "Chiny",
"CO": "Kolumbia",
"CR": "Kostaryka",
"CU": "Kuba",
"CV": "Republika Zielonego Przylądka",
"CW": "Curaçao",
"CX": "Wyspa Bożego Narodzenia",
"CY": "Cypr",
"CZ": "Czechy",
"DE": "Niemcy",
"DJ": "Dżibuti",
"DK": "Dania",
"DM": "Dominika",
"DO": "Dominikana",
"DZ": "Algieria",
"EC": "Ekwador",
"EE": "Estonia",
"EG": "Egipt",
"EH": "Sahara Zachodnia",
"ER": "Erytrea",
"ES": "Hiszpania",
"ET": "Etiopia",
"FI": "Finlandia",
"FJ": "Fidżi",
"FK": "Falklandy",
"FM": "Mikronezja",
"FO": "Wyspy Owcze",
"FR": "Francja",
"GA": "Gabon",
"GB": "Wielka Brytania",
"GD": "Grenada",
"GE": "Gruzja",
"GF": "Gujana Francuska",
"GG": "Guernsey",
"GH": "Ghana",
"GI": "Gibraltar",
"GL": "Grenlandia",
"GM": "Gambia",
"GN": "Gwinea",
"GP": "Gwadelupa",
"GQ": "Gwinea Równikowa",
"GR": "Grecja",
"GS": "Georgia Południowa i Sandwich Południowy",
"GT": "Gwatemala",
"GU": "Guam",
"GW": "Gwinea Bissau",
"GY": "Gujana",
"HK": "Hongkong",
"HM": "Wyspy Heard i McDonalda",
"HN": "Honduras",
"HR": "Chorwacja",
"HT": "Haiti",
"HU": "Węgry",
"ID": "Indonezja",
"IE": "Irlandia",
"IL": "Israel",
"IM": "Wyspa Man",
"IN": "Indie",
"IO": "Brytyjskie Terytorium Oceanu Indyjskiego",
"IQ": "Irak",
"IR": "Iran",
"IS": "Islandia",
"IT": "Włochy",
"JE": "Jersey",
"JM": "Jamajka",
"JO": "Jordania",
"JP": "Japonia",
"KE": "Kenia",
"KG": "Kirgistan",
"KH": "Kambodża",
"KI": "Kiribati",
"KM": "Komory",
"KN": "Saint Kitts i Nevis",
"KP": "Korea Północna",
"KR": "Korea Południowa",
"KW": "Kuwejt",
"KY": "Kajmany",
"KZ": "Kazachstan",
"LA": "Laos",
"LB": "Liban",
"LC": "Saint Lucia",
"LI": "Liechtenstein",
"LK": "Sri Lanka",
"LR": "Liberia",
"LS": "Lesotho",
"LT": "Litwa",
"LU": "Luksemburg",
"LV": "Łotwa",
"LY": "Libia",
"MA": "Maroko",
"MC": "Monako",
"MD": "Mołdawia",
"ME": "Czarnogóra",
"MF": "Saint-Martin",
"MG": "Madagaskar",
"MH": "Wyspy Marshalla",
"MK": "Macedonia Północna",
"ML": "Mali",
"MM": "Mjanma",
"MN": "Mongolia",
"MO": "Makau",
"MP": "Mariany Północne",
"MQ": "Martynika",
"MR": "Mauretania",
"MS": "Montserrat",
"MT": "Malta",
"MU": "Mauritius",
"MV": "Malediwy",
"MW": "Malawi",
"MX": "Meksyk",
"MY": "Malezja",
"MZ": "Mozambik",
"NA": "Namibia",
"NC": "Nowa Kaledonia",
"NE": "Niger",
"NF": "Wyspa Norfolk",
"NG": "Nigeria",
"NI": "Nikaragua",
"NL": "Holandia",
"NO": "Norwegia",
"NP": "Nepal",
"NR": "Nauru",
"NU": "Niue",
"NZ": "Nowa Zelandia",
"OM": "Oman",
"PA": "Panama",
"PE": "Peru",
"PF": "Polinezja Francuska",
"PG": "Papua-Nowa Gwinea",
"PH": "Filipiny",
"PK": "Pakistan",
"PL": "Polska",
"PM": "Saint-Pierre i Miquelon",
"PN": "Pitcairn",
"PR": "Portoryko",
"PS": "Palestyna",
"PT": "Portugalia",
"PW": "Palau",
"PY": "Paragwaj",
"QA": "Katar",
"RE": "Reunion",
"RO": "Rumunia",
"RS": "Serbia",
"RU": "Rosja",
"RW": "Rwanda",
"SA": "Arabia Saudyjska",
"SB": "Wyspy Solomona",
"SC": "Seszele",
"SD": "Sudan",
"SE": "Szwecja",
"SG": "Singapur",
"SH": "Wyspa Świętej Heleny, Wyspa Wniebowstąpienia i Tristan da Cunha",
"SI": "Słowenia",
"SJ": "Svalbard i Jan Mayen",
"SK": "Słowacja",
"SL": "Sierra Leone",
"SM": "San Marino",
"SN": "Senegal",
"SO": "Somalia",
"SR": "Surinam",
"SS": "Sudan Południowy",
"ST": "Wyspy Świętego Tomasza i Książęca",
"SV": "Salwador",
"SX": "Sint Maarten",
"SY": "Syria",
"SZ": "Eswatini",
"TC": "Turks i Caicos",
"TD": "Czad",
"TF": "FTPA",
"TG": "Togo",
"TH": "Tajlandia",
"TJ": "Tadżykistan",
"TK": "Tokelau",
"TL": "Timor Wschodni",
"TM": "Turkmenistan",
"TN": "Tunezja",
"TO": "Tonga",
"TR": "Turcja",
"TT": "Trynidad i Tobago",
"TV": "Tuvalu",
"TW": "Tajwan",
"TZ": "Tanzania",
"UA": "Ukraina",
"UG": "Uganda",
"UM": "Dalekie Wyspy Mniejsze Stanów Zjednoczonych",
"US": "Stany Zjednoczone",
"UY": "Urugwaj",
"UZ": "Uzbekistan",
"VA": "Watykan",
"VC": "Saint Vincent i Grenadyny",
"VE": "Wenezuela",
"VG": "Brytyjskie Wyspy Dziewicze",
"VI": "Wyspy Dziewicze Stanów Zjednoczonych",
"VN": "Wietnam",
"VU": "Vanuatu",
"WF": "Wallis i Futuna",
"WS": "Samoa",
"YE": "Jemen",
"YT": "Majotta",
"XK": "Kosowo",
"ZA": "Południowa Afryka",
"ZM": "Zambia",
"ZW": "Zimbambwe",
"EU": "Unia Europejska"
},
"languages": {
"en-US": "Angielski - USA",
"fr": "Francuski",
"nl": "Holenderski",
"pt_BR": "Portugalski - Brazylia"
}
},
"KnownHosts": {
"label": "Host",
"add": "Dodaj nowego hosta",
"toast": "Host successfully {mode, select, created {created} deleted {deleted} other {edited}}."
},
"InitializeContainer": {
"title": "WIEDZIAŁEŚ",
"subtitle": "<1>Cockatrice jest prowadzony przez ochotników</1><1>którzy uwielbiają karcianki!</1>"
},
"LoginContainer": {
"header": {
"title": "Login",
"subtitle": "Wieloplatformowy wirtualny stół do wieloosobowych gier karcianych."
},
"footer": {
"registerPrompt": "Jeszcze nie zarejestrowany?",
"registerAction": "Stwórz konto",
"credit": "Cockatrice jest projektem open source",
"version": "Wersja"
},
"content": {
"subtitle1": "Graj wieloosobowe karcianki online.",
"subtitle2": "Wieloplatformowy wirtualny stół do wieloosobowych gier karcianych. Zawsze darmowy i wolny."
},
"toasts": {
"passwordResetSuccessToast": "Hasło Pomyślnie Zresetowany",
"accountActivationSuccess": "Konto Pomyślnie Aktywowane"
}
},
"UnsupportedContainer": {
"title": "Nieobsługiwana Przeglądarka",
"subtitle1": "Proszę zaktualizuj swoją przeglądarkę i/lub sprawdź jej uprawnienia.",
"subtitle2": "Przeglądanie prywatne może wyłączyć niektóre uprawnienia lub funkcje."
},
"AccountActivationDialog": {
"title": "Aktywacja Konta",
"subtitle1": "Twoje konto nie zostało jeszcze aktywowane.",
"subtitle2": "Musisz podać token aktywujący, otrzymany w wiadomości email."
},
"KnownHostDialog": {
"title": "{mode, select, edit {Edit} other {Add}} Known Host",
"subtitle": "Dodanie nowego hosta pozwoli Ci połączyć się z innymi serwerami. Podaj jego dane poniżej aby dodać go do listy."
},
"RegistrationDialog": {
"title": "Stwórz Nowe Konto"
},
"RequestPasswordResetDialog": {
"title": "Żądanie Resetu Hasła"
},
"ResetPasswordDialog": {
"title": "Zresetuj hasło"
},
"AccountActivationForm": {
"error": {
"failed": "Aktywacja konta zakończona niepowodzeniem"
},
"label": {
"activate": "Aktywuj Konto"
}
},
"KnownHostForm": {
"help": "Potrzebujesz pomocy z dodaniem nowego hosta?",
"label": {
"add": "Dodaj Hosta",
"find": "Znajdź Hosta"
}
},
"LoginForm": {
"label": {
"autoConnect": "Połącz automatycznie",
"forgot": "Zapomniałem hasła",
"login": "Login",
"savePassword": "Zapisz hasło",
"savedPassword": "Zapisane Hasło"
}
},
"RegisterForm": {
"label": {
"register": "Zarejestruj się"
},
"toast": {
"registerSuccess": "Rejestracja powiodła się!"
}
},
"RequestPasswordResetForm": {
"error": "Żądanie resetu hasła nie powiodło się.",
"mfaEnabled": "Serwer ma włączone uwierzytelnianie wielkoskładnikowe",
"request": "Zażądaj Token Resetu",
"skipRequest": "Mam już token resetu"
},
"ResetPasswordForm": {
"error": "Żądanie resetu hasła nie powiodło się.",
"label": {
"reset": "Zresetuj hasło"
}
}
}

View file

@ -1,382 +0,0 @@
{
"Common": {
"language": "Português do Brasil (Brazilian Portuguese)",
"disconnect": "Desconectar",
"label": {
"confirmPassword": "Confirmar senha",
"confirmSure": "Você tem certeza?",
"country": "País",
"delete": "Excluir",
"email": "Email",
"hostName": "Nome do host",
"hostAddress": "Endereço do host",
"password": "Senha",
"passwordAgain": "Senha novamente",
"port": "Porta",
"realName": "Nome Real",
"saveChanges": "Salvar Mudanças",
"token": "Ficha",
"username": "Nome de usuário"
},
"validation": {
"minChars": "Mínimo de {count} {count, plural, one {caractere} other {caracteres}} necessários",
"passwordsMustMatch": "As senhas não correspondem",
"required": "Campo obrigatório"
},
"countries": {
"AD": "Andorra",
"AE": "Emirados Árabes Unidos",
"AF": "Afeganistão",
"AG": "Antígua e Barbuda",
"AI": "Anguila",
"AL": "Albânia",
"AM": "Armênia",
"AO": "Angola",
"AQ": "Antártica",
"AR": "Argentina",
"AS": "Samoa Americana",
"AT": "Áustria",
"AU": "Austrália",
"AW": "Aruba",
"AX": "Ilhas Aland",
"AZ": "Azerbaijão",
"BA": "Bósnia e Herzegovina",
"BB": "Barbados",
"BD": "Bangladesh",
"BE": "Bélgica",
"BF": "Burquina Faso",
"BG": "Bulgária",
"BH": "Bahrein",
"BI": "Burundi",
"BJ": "Benim",
"BL": "São Bartolomeu",
"BM": "Bermudas",
"BN": "Brunei",
"BO": "Bolivia",
"BQ": "Bonaire, Santo Eustáquio e Saba",
"BR": "Brasil",
"BS": "Bahamas",
"BT": "Butão",
"BV": "Ilha Bouvet",
"BW": "Botsuana",
"BY": "Bielorrússia",
"BZ": "Belize",
"CA": "Canadá",
"CC": "Ilhas Cocos (Keeling)",
"CD": "RD Congo",
"CF": "República Centro-Africana",
"CG": "República do Congo",
"CH": "Suiça",
"CI": "Costa do Marfim",
"CK": "Ilhas Cook",
"CL": "Chile",
"CM": "Camarões",
"CN": "China",
"CO": "Colômbia",
"CR": "Costa Rica",
"CU": "Cuba",
"CV": "Cabo Verde",
"CW": "Curaçao",
"CX": "Ilha Christmas",
"CY": "Chipre",
"CZ": "Tchéquia",
"DE": "Alemanha",
"DJ": "Djibuti",
"DK": "Dinamarca",
"DM": "Dominica",
"DO": "República Dominicana",
"DZ": "Argélia",
"EC": "Equador",
"EE": "Estônia",
"EG": "Egito",
"EH": "Saara Ocidental",
"ER": "Eritreia",
"ES": "Espanha",
"ET": "Etiópia",
"FI": "Finlândia",
"FJ": "Fiji",
"FK": "Ilhas Malvinas",
"FM": "Micronésia",
"FO": "Ilhas Faroé",
"FR": "França",
"GA": "Gabão",
"GB": "Reino Unido",
"GD": "Granada",
"GE": "Geórgia",
"GF": "Guiana Francesa",
"GG": "Guernsey",
"GH": "Gana",
"GI": "Gibraltar",
"GL": "Groenlândia",
"GM": "Gâmbia",
"GN": "Guiné",
"GP": "Guadalupe",
"GQ": "Guiné Equatorial",
"GR": "Grécia",
"GS": "Ilhas Geórgia do Sul e Sandwich do Sul",
"GT": "Guatemala",
"GU": "Guam",
"GW": "Guiné-Bissau",
"GY": "Guiana",
"HK": "Hong Kong",
"HM": "Ilha Head e Ilhas McDonald",
"HN": "Honduras",
"HR": "Croácia",
"HT": "Haiti",
"HU": "Hungria",
"ID": "Indonésia",
"IE": "Irlanda",
"IL": "Israel",
"IM": "Ilha de Man",
"IN": "Índia",
"IO": "Território Britânico do Oceano Índico",
"IQ": "Iraque",
"IR": "Irã",
"IS": "Islândia",
"IT": "Itália",
"JE": "Jersey",
"JM": "Jamaica",
"JO": "Jordânia",
"JP": "Japão",
"KE": "Quênia",
"KG": "Quirguistão",
"KH": "Cambodja",
"KI": "Quiribati",
"KM": "Comores",
"KN": "São Cristóvão e Névis",
"KP": "Coréia do Norte",
"KR": "Coreia do Sul",
"KW": "Kuwait",
"KY": "Ilhas Cayman",
"KZ": "Cazaquistão",
"LA": "Laos",
"LB": "Líbano",
"LC": "Santa Lúcia",
"LI": "Liechtenstein",
"LK": "Sri Lanka",
"LR": "Libéria",
"LS": "Lesoto",
"LT": "Lituânia",
"LU": "Luxemburgo",
"LV": "Letônia",
"LY": "Líbia",
"MA": "Marrocos",
"MC": "Mônaco",
"MD": "Moldávia",
"ME": "Montenegro",
"MF": "São Martinho (França)",
"MG": "Madagáscar",
"MH": "Ilhas Marshall",
"MK": "Macedônia do Norte",
"ML": "Mali",
"MM": "Mianmar",
"MN": "Mongólia",
"MO": "Macau",
"MP": "Ilhas Marianas do Norte",
"MQ": "Martinica",
"MR": "Mauritânia",
"MS": "Monserrate",
"MT": "Malta",
"MU": "Ilhas Maurício",
"MV": "Maldivas",
"MW": "Malawi",
"MX": "México",
"MY": "Malásia",
"MZ": "Moçambique",
"NA": "Namíbia",
"NC": "Nova Caledônia",
"NE": "Níger",
"NF": "Ilha Norfolk",
"NG": "Nigéria",
"NI": "Nicarágua",
"NL": "Holanda",
"NO": "Noruega",
"NP": "Nepal",
"NR": "Nauru",
"NU": "Niue",
"NZ": "Nova Zelândia",
"OM": "Omã",
"PA": "Panamá",
"PE": "Peru",
"PF": "Polinésia Francesa",
"PG": "Papua Nova Guiné",
"PH": "Filipinas",
"PK": "Paquistão",
"PL": "Polônia",
"PM": "Saint-Pierre e Miquelon",
"PN": "Ilhas Pitcairn",
"PR": "Porto Rico",
"PS": "Palestina",
"PT": "Portugal",
"PW": "Palau",
"PY": "Paraguai",
"QA": "Catar",
"RE": "Ilha da Reunião",
"RO": "Romênia",
"RS": "Sérvia",
"RU": "Rússia",
"RW": "Ruanda",
"SA": "Arábia Saudita",
"SB": "Ilhas Salomão",
"SC": "Seychelles",
"SD": "Sudão",
"SE": "Suécia",
"SG": "Cingapura",
"SH": "Santa Helena, Ascensão e Tristão da Cunha",
"SI": "Eslovênia",
"SJ": "Svalbard e Jan Mayen",
"SK": "Eslováquia",
"SL": "Serra Leoa",
"SM": "San Marino",
"SN": "Senegal",
"SO": "Somália",
"SR": "Suriname",
"SS": "Sudão do Sul",
"ST": "São Tomé e Príncipe",
"SV": "El Salvador",
"SX": "São Martinho (Holanda)",
"SY": "Síria",
"SZ": "Essuatíni",
"TC": "Ilhas Turcas e Caicos",
"TD": "Chad",
"TF": "TAAF",
"TG": "Togo",
"TH": "Tailândia",
"TJ": "Tajiquistão",
"TK": "Tokelau",
"TL": "Timor-Leste",
"TM": "Turcomenistão",
"TN": "Tunísia",
"TO": "Tonga",
"TR": "Turquia",
"TT": "Trindade e Tobago",
"TV": "Tuvalu",
"TW": "Taiwan",
"TZ": "Tanzânia",
"UA": "Ucrânia",
"UG": "Uganda",
"UM": "Ilhas Menores Distantes dos Estados Unidos",
"US": "Estados Unidos",
"UY": "Uruguai",
"UZ": "Uzbequistão",
"VA": "Santa Sé",
"VC": "São Vicente e Granadinas",
"VE": "Venezuela",
"VG": "Ilhas Virgens Britânicas",
"VI": "Ilhas Virgens Americanas",
"VN": "Vietnã",
"VU": "Vanuatu",
"WF": "Wallis e Futuna",
"WS": "Samoa",
"YE": "Iêmen",
"YT": "Mayotte",
"XK": "Kosovo",
"ZA": "África do Sul",
"ZM": "Zâmbia",
"ZW": "Zimbábue",
"EU": "União Européia"
},
"languages": {
"en-US": "Inglês - EUA",
"fr": "Francês",
"nl": "Holandês",
"pt_BR": "Português - Brasil"
}
},
"KnownHosts": {
"label": "Servidor",
"add": "Adicionar novo servidor",
"toast": "Servidor {mode, select, created {criado} deleted {deletado} other {editado}} com sucesso."
},
"InitializeContainer": {
"title": "VOCÊ SABIA?",
"subtitle": "<1>O Cockatrice é administrado por voluntários</1><1>que adoram jogos de cartas!</1>"
},
"LoginContainer": {
"header": {
"title": "Login",
"subtitle": "Uma mesa virtual multiplataforma para jogos multijogador de carta."
},
"footer": {
"registerPrompt": "Não registrou ainda?",
"registerAction": "Crie uma conta",
"credit": "Cockatrice é um projeto de código aberto",
"version": "Versão"
},
"content": {
"subtitle1": "Jogue jogos multijogador de cartas online.",
"subtitle2": "Mesa virtual multiplataforma para jogos multijogador de carta. Gratuito para sempre."
},
"toasts": {
"passwordResetSuccessToast": "Senha redefinida com sucesso",
"accountActivationSuccess": "Conta ativada com sucesso"
}
},
"UnsupportedContainer": {
"title": "Navegador não suportado",
"subtitle1": "Por favor atualize seu navegador de internet e/ou check as permissões",
"subtitle2": "Observação: a navegação privada faz com que alguns navegadores desativem determinadas permissões ou recursos."
},
"AccountActivationDialog": {
"title": "Ativação da conta",
"subtitle1": "Sua conta ainda não foi ativada.",
"subtitle2": "Você precisa fornecer o código de ativação recebido por email."
},
"KnownHostDialog": {
"title": "{mode, select, edit {Editar} other {Adicionar}} servidor conhecido",
"subtitle": "Adicionar um novo host permite que você se conecte a diferentes servidores. Insira os detalhes abaixo em sua lista de hosts."
},
"RegistrationDialog": {
"title": "Criar Nova Conta"
},
"RequestPasswordResetDialog": {
"title": "Solicitar redefinição de senha"
},
"ResetPasswordDialog": {
"title": "Redefinir Senha"
},
"AccountActivationForm": {
"error": {
"failed": "Falha na activação de conta"
},
"label": {
"activate": "Ativar Conta"
}
},
"KnownHostForm": {
"help": "Necessita de ajuda para adicionar um novo host?",
"label": {
"add": "Adicionar Host",
"find": "Buscar Host"
}
},
"LoginForm": {
"label": {
"autoConnect": "Conectar Automaticamente",
"forgot": "Esqueci minha senha",
"login": "Login",
"savePassword": "Salvar Senha",
"savedPassword": "Salvar Senha"
}
},
"RegisterForm": {
"label": {
"register": "Registrar"
},
"toast": {
"registerSuccess": "Registro bem-sucedido"
}
},
"RequestPasswordResetForm": {
"error": "Falha na solicitação de redefinição de senha",
"mfaEnabled": "O servidor tem autenticação de multi-fator ativada",
"request": "Solicitar código de redefinição",
"skipRequest": "Eu já tenho um código de redefinição"
},
"ResetPasswordForm": {
"error": "Falha na redefinição de senha",
"label": {
"reset": "Redefinir Senha"
}
}
}

View file

@ -1,382 +0,0 @@
{
"Common": {
"language": "Русский (Russian)",
"disconnect": "Прервать подключение",
"label": {
"confirmPassword": "Подтверждение пароля:",
"confirmSure": "Вы уверены?",
"country": "Страна:",
"delete": "Удалить",
"email": "Адрес email:",
"hostName": "Наименование сервера",
"hostAddress": "Адрес сервера",
"password": "Пароль:",
"passwordAgain": "Подтверждение пароля:",
"port": "&Порт:",
"realName": "Настоящее имя:",
"saveChanges": "Сохранить изменения",
"token": "Фишка",
"username": "Имя пользователя:"
},
"validation": {
"minChars": "Как минимум {count} {count, plural, one {character} other {characters}} необходимо",
"passwordsMustMatch": "Введенные пароли не совпадают.",
"required": "Необходимо"
},
"countries": {
"AD": "Андорра",
"AE": "ОАЭ",
"AF": "Афганистан",
"AG": "Антигуа и Барбуда",
"AI": "Ангилья",
"AL": "Албания",
"AM": "Армения",
"AO": "Ангола",
"AQ": "Антарктика",
"AR": "Аргентина",
"AS": "Американское Самоа",
"AT": "Австрия",
"AU": "Австралия",
"AW": "Аруба",
"AX": "Аландские острова",
"AZ": "Азербайджан",
"BA": "Босния и Герцеговина",
"BB": "Барбадос",
"BD": "Бангладеш",
"BE": "Бельгия",
"BF": "Буркина Фасо",
"BG": "Болгария",
"BH": "Бахрейн",
"BI": "Бурунди",
"BJ": "Бенин",
"BL": "Сен-Бартелеми",
"BM": "Бермуды",
"BN": "Бруней",
"BO": "Боливия",
"BQ": "Бонэйр",
"BR": "Бразилия",
"BS": "Багамы",
"BT": "Бутан",
"BV": "Остров Буве",
"BW": "Ботсвана",
"BY": "Беларусь",
"BZ": "Белиз",
"CA": "Канада",
"CC": "Кокосовые острова",
"CD": "ДР Конго",
"CF": "ЦАР",
"CG": "Республика Конго",
"CH": "Швейцария",
"CI": "Кот-д'Ивуар",
"CK": "Острова Кука",
"CL": "Чили",
"CM": "Камерун",
"CN": "Китай",
"CO": "Колумбия",
"CR": "Коста-Рика",
"CU": "Куба",
"CV": "Кабо-Верде",
"CW": "Кюрасао",
"CX": "Остров Рождества",
"CY": "Кипр",
"CZ": "Чехия",
"DE": "Германия",
"DJ": "Джибути",
"DK": "Дания",
"DM": "Доминика",
"DO": "Доминиканская Республика",
"DZ": "Алжир",
"EC": "Эквадор",
"EE": "Эстония",
"EG": "Египет",
"EH": "Западная Сахара",
"ER": "Эритрея",
"ES": "Испания",
"ET": "Эфиопия",
"FI": "Финляндия",
"FJ": "Фиджи",
"FK": "Фолклендские острова",
"FM": "Микронезия",
"FO": "Фарерские о-ва",
"FR": "Франция",
"GA": "Габон",
"GB": "Великобритания",
"GD": "Гренада",
"GE": "Грузия",
"GF": "Французская Гвиана",
"GG": "Гернси",
"GH": "Гана",
"GI": "Гибралтар",
"GL": "Гренландия",
"GM": "Гамбия",
"GN": "Гвинея",
"GP": "Гваделупа",
"GQ": "Экваториальная Гвинея",
"GR": "Греция",
"GS": "Южная Георгия и Южные Сандвичевы острова",
"GT": "Гватемала",
"GU": "Гуам",
"GW": "Гвинея-Бисау",
"GY": "Гайана",
"HK": "Гонконг",
"HM": "Остров Херд и остров Макдональд",
"HN": "Гондурас",
"HR": "Хорватия",
"HT": "Гаити",
"HU": "Венгрия",
"ID": "Индонезия",
"IE": "Ирландия",
"IL": "Израиль",
"IM": "о-в Мэн",
"IN": "Индия",
"IO": "Британская территория в Индийском океане ",
"IQ": "Ирак",
"IR": "Иран",
"IS": "Исландия",
"IT": "Италия",
"JE": "Джерси",
"JM": "Ямайка",
"JO": "Иордания",
"JP": "Япония",
"KE": "Кения",
"KG": "Киргизия",
"KH": "Камбоджия",
"KI": "Кирибати",
"KM": "Коморы",
"KN": "Сент-Китс и Невис",
"KP": "Северная Корея",
"KR": "Южная Корея",
"KW": "Кувейт",
"KY": "Каймановы острова",
"KZ": "Казахстан",
"LA": "Лаос",
"LB": "Ливан",
"LC": "Сент-Люсия",
"LI": "Лихтенштейн",
"LK": "Шри-Ланка",
"LR": "Либерия",
"LS": "Лесото",
"LT": "Литва",
"LU": "Люксембург",
"LV": "Латвия",
"LY": "Ливия",
"MA": "Морокко",
"MC": "Монако",
"MD": "Молдавия",
"ME": "Черногория",
"MF": "Сен-Мартен (владение Франции)",
"MG": "Мадагарскар",
"MH": "Маршалловы о-ва",
"MK": "Северная Македония",
"ML": "Мали",
"MM": "Мьянма (Бирма)",
"MN": "Монголия",
"MO": "Макао",
"MP": "Северные Марианские о-ва",
"MQ": "Мартиника",
"MR": "Мавритания",
"MS": "Монтсеррат",
"MT": "Мальта",
"MU": "о. Маврикий",
"MV": "Мальдивы",
"MW": "Малави",
"MX": "Мексика",
"MY": "Малазия",
"MZ": "Мозамбик",
"NA": "Намибия",
"NC": "Новая Каледония",
"NE": "Нигер",
"NF": "Остров Норфолк",
"NG": "Нигерия",
"NI": "Никарагуа",
"NL": "Нидерланды",
"NO": "Норвегия",
"NP": "Непал",
"NR": "Науру",
"NU": "Ниуэ",
"NZ": "Новая Зеландия",
"OM": "Оман",
"PA": "Панама",
"PE": "Перу",
"PF": "Французская Полинезия",
"PG": "Папуа-Новая Гвинея",
"PH": "Филиппины",
"PK": "Пакистан",
"PL": "Польша",
"PM": "Сен-Пьер и Микелон",
"PN": "о-ва Питкэрн",
"PR": "Пуэрто-Рико",
"PS": "Палестина",
"PT": "Португалия",
"PW": "Палау",
"PY": "Парагва",
"QA": "Катар",
"RE": "Реюньон",
"RO": "Румыния",
"RS": "Сербия",
"RU": "Российская Федерация",
"RW": "Руанда",
"SA": "Саудовская Аравия",
"SB": "Соломоновы о-ва",
"SC": "Сейшелы",
"SD": "Судан",
"SE": "Швеция",
"SG": "Сингапур",
"SH": "о. Св. Елены",
"SI": "Словения",
"SJ": "Шпицберген и Ян-Майен",
"SK": "Словакия",
"SL": "Сьерра-Леоне",
"SM": "Сан-Марино",
"SN": "Сенегал",
"SO": "Сомали",
"SR": "Суринам",
"SS": "Южный Судан",
"ST": "Сан-Томе и Принсипи",
"SV": "Сальвадор",
"SX": "Синт-Мартен (Дания)",
"SY": "Сирия",
"SZ": "Эсватини",
"TC": "Острова Теркс и Кайкос",
"TD": "Чад",
"TF": "Французские Южные и Антарктические территории",
"TG": "Того",
"TH": "Тайланд",
"TJ": "Таджикистан",
"TK": "Токелау",
"TL": "Восточный Тимор",
"TM": "Туркмения",
"TN": "Тунис",
"TO": "Тонго",
"TR": "Турция",
"TT": "Тринидад и Тобаго",
"TV": "Тувалу",
"TW": "Тайвань",
"TZ": "Танзания",
"UA": "Украина",
"UG": "Уганда",
"UM": "Внешние малые о-ва (США)",
"US": "США",
"UY": "Уругвай",
"UZ": "Узбекистан",
"VA": "Святой Престол",
"VC": "Сент-Винсент и Гренадины",
"VE": "Венесуэла",
"VG": "Британские Виргинские острова",
"VI": "Американские Виргинские острова",
"VN": "Вьетнам",
"VU": "Вануату",
"WF": "о-ва Уоллис и Футуна",
"WS": "Самоа",
"YE": "Йемен",
"YT": "Майотта",
"XK": "Косово",
"ZA": "ЮАР",
"ZM": "Замбия",
"ZW": "Зимбабве",
"EU": "Европейский Союз"
},
"languages": {
"en-US": "Английский - США",
"fr": "Французский",
"nl": "Датский",
"pt_BR": "Португальский - Бразилия"
}
},
"KnownHosts": {
"label": "&Хост",
"add": "Добавить новый сервер",
"toast": "Сервер успешно {mode, select, created {created} deleted {deleted} other {edited}}."
},
"InitializeContainer": {
"title": "ЗНАЕТЕ ЛИ ВЫ",
"subtitle": "<1>Cockatrice поддерживается энтузиастами</1><1>которые любят карточные игры!</1>"
},
"LoginContainer": {
"header": {
"title": "Логин",
"subtitle": "Кросс-платформенный виртуальный стол для мультиплеерных ККИ"
},
"footer": {
"registerPrompt": "Ещё не зарегистрированы?",
"registerAction": "Создать учетную запись",
"credit": "Cockatrice - проект с открытым исходным кодом",
"version": "Версия"
},
"content": {
"subtitle1": "Играйте в мультиплеерные ККИ онлайн",
"subtitle2": "Кросс-платформенный виртуальный стол для мультиплеерных ККИ. Всегда будет бесплатным."
},
"toasts": {
"passwordResetSuccessToast": "Пароль сброшен успешно",
"accountActivationSuccess": "Учетная запись активирована успешно"
}
},
"UnsupportedContainer": {
"title": "Браузер не поддерживается",
"subtitle1": "Обновите бразуер и/или проверьте права доступа",
"subtitle2": "Обратите внимание, что использование анонимных браузеров может привести к неработоспособности некоторых фич и проблемами с правами доступа"
},
"AccountActivationDialog": {
"title": "Активация учетной записи",
"subtitle1": "Ваша учетная запись не активирована",
"subtitle2": "Ваш аккаунт пока не активирован. Вам необходимо следовать указаниям по активации, отправленным на ваш email"
},
"KnownHostDialog": {
"title": "{модифицировать, выбрать, редактировать {Edit} другой {Add}} известный хост",
"subtitle": "Добавление нового хоста позволит вам присоединяться к различным серверам. Введите данные о сервере в ваш список хостов"
},
"RegistrationDialog": {
"title": "Создать новый аккаунт"
},
"RequestPasswordResetDialog": {
"title": "Запросить сброс пароля"
},
"ResetPasswordDialog": {
"title": "Сбросить пароль"
},
"AccountActivationForm": {
"error": {
"failed": "Не удалось активировать аккаунт"
},
"label": {
"activate": "Активировать аккаунт"
}
},
"KnownHostForm": {
"help": "Нужна помощь в добавлении нового хоста?",
"label": {
"add": "Добавить хост",
"find": "Найти хост"
}
},
"LoginForm": {
"label": {
"autoConnect": "Автоматическое подключение",
"forgot": "Забыли пароль",
"login": "Логин",
"savePassword": "Сохранить пароль",
"savedPassword": "Сохранённый пароль"
}
},
"RegisterForm": {
"label": {
"register": "Зарегистрироваться"
},
"toast": {
"registerSuccess": "Регистрация прошла успешно!"
}
},
"RequestPasswordResetForm": {
"error": "Не удалось запросить сброс пароля",
"mfaEnabled": "На сервере включена многофакторная аутентификация",
"request": "Запросить токен сброса",
"skipRequest": "У меня уже есть токен сброса"
},
"ResetPasswordForm": {
"error": "Не удалось сбросить пароль",
"label": {
"reset": "Сбросить пароля"
}
}
}

View file

@ -1,382 +0,0 @@
{
"Common": {
"language": "Toki Pona",
"disconnect": "mi o weka tan kulupu",
"label": {
"confirmPassword": "nimi ken li pona ala pona",
"confirmSure": "ni li pona ala pona",
"country": "ma",
"delete": "mi o weka e ni",
"email": "nimi Email",
"hostName": "nimi pi ilo lawa",
"hostAddress": "ma pi ilo lawa",
"password": "nimi ken pi kama sina",
"passwordAgain": "o pana sin e nimi ken pi kama sina",
"port": "nanpa pi ilo lawa",
"realName": "nimi sina lon",
"saveChanges": "mi o awen e ante sina",
"token": "ijo lili",
"username": "nimi sina"
},
"validation": {
"minChars": "Minimum of {count} {count, plural, one {character} other {characters}} required",
"passwordsMustMatch": "nimi ken nanpa wan li sama ala nimi ken nanpa tu",
"required": "o ni"
},
"countries": {
"AD": "ma Antola",
"AE": "United Arab Emirates",
"AF": "ma Akanisan",
"AG": "Antigua and Barbuda",
"AI": "Anguilla",
"AL": "ma Sipe",
"AM": "ma Aja",
"AO": "ma Ankola",
"AQ": "ma Antasika",
"AR": "ma Alensina",
"AS": "American Samoa",
"AT": "ma Esalasi",
"AU": "ma Oselija",
"AW": "Aruba",
"AX": "Åland Islands",
"AZ": "Azerbaijan",
"BA": "Bosnia and Herzegovina",
"BB": "ma Papeto",
"BD": "ma Panla",
"BE": "ma Pesije",
"BF": "ma Pukinapaso",
"BG": "ma Pokasi",
"BH": "ma Palani",
"BI": "Burundi",
"BJ": "ma Penen",
"BL": "Saint Barthélemy",
"BM": "ma Pemuta",
"BN": "Brunei Darussalam",
"BO": "Bolivia",
"BQ": "Bonaire, Sint Eustatius and Saba",
"BR": "ma Pasila",
"BS": "ma Pawama",
"BT": "ma Putan",
"BV": "Bouvet Island",
"BW": "ma Posuwana",
"BY": "ma Pelalusi",
"BZ": "Belize",
"CA": "ma Kanata",
"CC": "Cocos (Keeling) Islands",
"CD": "ma DR Konko",
"CF": "ma Santapiken",
"CG": "ma Konko",
"CH": "ma Suwasi",
"CI": "ma Kowisa",
"CK": "Cook Islands",
"CL": "ma Sile",
"CM": "ma Kamelun",
"CN": "ma Sonko",
"CO": "Colombia",
"CR": "ma Kosalika",
"CU": "ma Kupa",
"CV": "Cape Verde",
"CW": "Curaçao",
"CX": "Christmas Island",
"CY": "ma Kiposi",
"CZ": "ma Seki",
"DE": "ma Tosi",
"DJ": "ma Sipusi",
"DK": "ma Tansi",
"DM": "ma Watukupuli",
"DO": "ma Tominika",
"DZ": "ma Sasali",
"EC": "ma Ekato",
"EE": "ma Esi",
"EG": "ma Masu",
"EH": "Western Sahara",
"ER": "ma Eliteja",
"ES": "ma Epanja",
"ET": "ma Isijopija",
"FI": "ma Sumi",
"FJ": "ma Pisi",
"FK": "Falkland Islands",
"FM": "Micronesia",
"FO": "Faroe Islands",
"FR": "ma Kanse",
"GA": "ma Kapon",
"GB": "ma Juke",
"GD": "ma Kenata",
"GE": "ma Katelo",
"GF": "French Guiana",
"GG": "Guernsey",
"GH": "ma Kana",
"GI": "Gibraltar",
"GL": "ma Kalalinuna",
"GM": "ma Kanpija",
"GN": "ma Kine",
"GP": "Guadeloupe",
"GQ": "ma Kinejekatolija",
"GR": "ma Elena",
"GS": "South Georgia and the South Sandwich Islands",
"GT": "ma Katemala",
"GU": "Guam",
"GW": "ma Kinepisa",
"GY": "Guyana",
"HK": "Hong Kong",
"HM": "Heard Island and McDonald Islands",
"HN": "ma Ontula",
"HR": "ma Lowasi",
"HT": "ma Awisi",
"HU": "ma Mosijo",
"ID": "ma Intonesija",
"IE": "ma Alan",
"IL": "ma Isale",
"IM": "Isle of Man",
"IN": "ma Palata",
"IO": "British Indian Ocean Territory",
"IQ": "Iraq",
"IR": "Iran",
"IS": "ma Isilan",
"IT": "ma Italija",
"JE": "Jersey",
"JM": "ma Sameka",
"JO": "ma Utun",
"JP": "ma Nijon",
"KE": "ma Kenja",
"KG": "Kyrgyzstan",
"KH": "ma Kanpusi",
"KI": "ma Kilipasi",
"KM": "ma Komo",
"KN": "Saint Kitts and Nevis",
"KP": "North Korea",
"KR": "ma Anku",
"KW": "ma Kuwasi",
"KY": "Cayman Islands",
"KZ": "Kazakhstan",
"LA": "Laos",
"LB": "ma Lunpan",
"LC": "Saint Lucia",
"LI": "ma Lisensan",
"LK": "ma Lanka",
"LR": "ma Lapewija",
"LS": "ma Lesoto",
"LT": "ma Lijatuwa",
"LU": "ma Lusepu",
"LV": "ma Lawi",
"LY": "ma Lipija",
"MA": "ma Malipe",
"MC": "Monaco",
"MD": "ma Motowa",
"ME": "Montenegro",
"MF": "Saint Martin (French part)",
"MG": "Madagascar",
"MH": "Marshall Islands",
"MK": "ma Maketonija",
"ML": "ma Mali",
"MM": "ma Mijama",
"MN": "Mongolia",
"MO": "Macao",
"MP": "Northern Mariana Islands",
"MQ": "Martinique",
"MR": "ma Mulitanija",
"MS": "Montserrat",
"MT": "Malta",
"MU": "ma Mowisi",
"MV": "Maldives",
"MW": "Malawi",
"MX": "ma Mesiko",
"MY": "ma Malasija",
"MZ": "ma Mosanpi",
"NA": "ma Namipija",
"NC": "New Caledonia",
"NE": "ma Nise",
"NF": "Norfolk Island",
"NG": "ma Naselija",
"NI": "Nicaragua",
"NL": "ma Netelan",
"NO": "ma Nosiki",
"NP": "Nepal",
"NR": "Nauru",
"NU": "Niue",
"NZ": "ma Nusilan",
"OM": "ma Uman",
"PA": "ma Panama",
"PE": "ma Pelu",
"PF": "French Polynesia",
"PG": "ma Papuwanijukini",
"PH": "ma Pilipina",
"PK": "ma Pakisan",
"PL": " ma Posuka",
"PM": "Saint Pierre and Miquelon",
"PN": "Pitcairn",
"PR": "Puerto Rico",
"PS": "ma Pilisin",
"PT": "ma Potuke",
"PW": "Palau",
"PY": "ma Palakawi",
"QA": "Qatar",
"RE": "Réunion",
"RO": "ma Lomani",
"RS": "ma Sopisi",
"RU": "ma Losi",
"RW": "ma Luwanta",
"SA": "ma Sawusi",
"SB": "Solomon Islands",
"SC": "Seychelles",
"SD": "ma Sutan",
"SE": "ma Wensa",
"SG": "Singapore",
"SH": "Saint Helena, Ascension and Tristan da Cunha",
"SI": "ma Lowensina",
"SJ": "Svalbard and Jan Mayen",
"SK": "ma Lowenki",
"SL": "ma Sijelalijon",
"SM": "ma Samalino",
"SN": "ma Seneka",
"SO": "ma Somalija",
"SR": "Suriname",
"SS": "South Sudan",
"ST": "Sao Tome and Principe",
"SV": "El Salvador",
"SX": "Sint Maarten (Dutch part)",
"SY": "ma Sulija",
"SZ": "Eswatini",
"TC": "Turks and Caicos Islands",
"TD": "ma Sate",
"TF": "TAAF",
"TG": "ma Toko",
"TH": "ma Tawi",
"TJ": "Tajikistan",
"TK": "Tokelau",
"TL": "Timor-Leste",
"TM": "Turkmenistan",
"TN": "ma Tunisi",
"TO": " ma Tona",
"TR": "ma Tuki",
"TT": "ma Sinita",
"TV": "ma Tuwalu",
"TW": "ma Tawan",
"TZ": "ma Tansanija",
"UA": "ma Ukawina",
"UG": "ma Ukanta",
"UM": "United States Minor Outlying Islands",
"US": "ma Mewika",
"UY": "ma Ulukawi",
"UZ": "Uzbekistan",
"VA": "Holy See",
"VC": "ma SVG",
"VE": "ma Penesuwela",
"VG": "British Virgin Islands",
"VI": "U.S. Virgin Islands",
"VN": "ma Wije",
"VU": "ma Wanuwatu",
"WF": "Wallis and Futuna",
"WS": "ma Samowa",
"YE": "ma Jamanija",
"YT": "Mayotte",
"XK": "Kosovo",
"ZA": "ma Setapika",
"ZM": "ma Sanpija",
"ZW": "ma Sinpapuwe",
"EU": "ma kulupu Elopa"
},
"languages": {
"en-US": "toki Inli",
"fr": "toki Kanse",
"nl": "toki Netelan",
"pt_BR": "toki Potuke pi ma Pasila"
}
},
"KnownHosts": {
"label": "ilo lawa",
"add": "mi o ken e ilo lawa sin",
"toast": "Host successfully {mode, select, created {created} deleted {deleted} other {edited}}."
},
"InitializeContainer": {
"title": "sina sona ala sona e ni:",
"subtitle": "<1>jan li pali e ilo Cockatrice lon wile taso!</1> <1>musi lipu li pona tawa ona!</1>"
},
"LoginContainer": {
"header": {
"title": "mi o kama e sina lon kulupu",
"subtitle": "ilo Cockatrice li ken e musi lipu ale. nasin mute ilo li ken lon ona."
},
"footer": {
"registerPrompt": "sina jo ala jo e sijelo kulupu?",
"registerAction": "mi o pali e sijelo kulupu sina",
"credit": "insa pi ilo Cockatrice li len ala",
"version": "nanpa ante"
},
"content": {
"subtitle1": "Play multiplayer card games online.",
"subtitle2": "Cross-platform virtual tabletop for multiplayer card games. Forever free."
},
"toasts": {
"passwordResetSuccessToast": "Password Reset Successfully",
"accountActivationSuccess": "Account Activated Successfully"
}
},
"UnsupportedContainer": {
"title": "Unsupported Browser",
"subtitle1": "Please update your browser and/or check your permissions.",
"subtitle2": "Note: Private browsing causes some browsers to disable certain permissions or features."
},
"AccountActivationDialog": {
"title": "Account Activation",
"subtitle1": "Your account has not been activated yet.",
"subtitle2": "You need to provide the activation token received in the activation email."
},
"KnownHostDialog": {
"title": "{mode, select, edit {Edit} other {Add}} Known Host",
"subtitle": "Adding a new host allows you to connect to different servers. Enter the details below to your host list."
},
"RegistrationDialog": {
"title": "Create New Account"
},
"RequestPasswordResetDialog": {
"title": "Request Password Reset"
},
"ResetPasswordDialog": {
"title": "mi o sin e nimi ken"
},
"AccountActivationForm": {
"error": {
"failed": "Account activation failed"
},
"label": {
"activate": "Activate Account"
}
},
"KnownHostForm": {
"help": "Need help adding a new host?",
"label": {
"add": "Add Host",
"find": "Find Host"
}
},
"LoginForm": {
"label": {
"autoConnect": "Auto Connect",
"forgot": "nimi ken pi kama sina li weka tan sona",
"login": "mi o kama e sina lon kulupu",
"savePassword": "mi o awen e nimi ken",
"savedPassword": "mi awen e nimi ken"
}
},
"RegisterForm": {
"label": {
"register": "Register"
},
"toast": {
"registerSuccess": "Registration Successful!"
}
},
"RequestPasswordResetForm": {
"error": "wile ante pi nimi ken li pakala",
"mfaEnabled": "Server has multi-factor authentication enabled",
"request": "Request Reset Token",
"skipRequest": "I already have a reset token"
},
"ResetPasswordForm": {
"error": "ante pi nimi ken li pakala",
"label": {
"reset": "mi o sin e nimi ken"
}
}
}

View file

@ -1,382 +0,0 @@
{
"Common": {
"language": "",
"disconnect": "斷開連線",
"label": {
"confirmPassword": "確認新密碼:",
"confirmSure": "你確定嗎?",
"country": "國家:",
"delete": "删除",
"email": "電郵:",
"hostName": "主機名稱",
"hostAddress": "主機地址",
"password": "密碼:",
"passwordAgain": "再次輸入密碼:",
"port": "端口:",
"realName": "實名:",
"saveChanges": "儲存變更",
"token": "令牌",
"username": "用戶名稱:"
},
"validation": {
"minChars": "最少需要{數目} {數目,眾數,單{字元}或其他{眾字元}}",
"passwordsMustMatch": "新舊密碼不一致.",
"required": "必須"
},
"countries": {
"AD": "安道爾",
"AE": "阿拉伯聯合大公國",
"AF": "阿富汗",
"AG": "安地卡及巴布達",
"AI": "安圭拉",
"AL": "阿爾巴尼亞",
"AM": "亞美尼亞",
"AO": "安哥拉",
"AQ": "南極洲",
"AR": "阿根廷",
"AS": "美屬薩摩亞",
"AT": "奧地利",
"AU": "澳洲",
"AW": "阿魯巴",
"AX": "奧蘭群島",
"AZ": "亞塞拜然",
"BA": "波士尼亞與赫塞哥維納",
"BB": "巴貝多",
"BD": "孟加拉",
"BE": "比利時",
"BF": "布吉納法索",
"BG": "保加利亞",
"BH": "巴林",
"BI": "蒲隆地",
"BJ": "貝南",
"BL": "聖巴泰勒米",
"BM": "百慕達",
"BN": "汶萊達魯薩蘭國",
"BO": "玻利維亞",
"BQ": "博內爾島、聖尤斯特歇斯島和薩巴島",
"BR": "巴西",
"BS": "巴哈馬",
"BT": "不丹",
"BV": "布韋島",
"BW": "波札那",
"BY": "白俄羅斯",
"BZ": "貝里斯",
"CA": "加拿大",
"CC": "科科斯(基林)群島",
"CD": "剛果民主共和國",
"CF": "中非共和國",
"CG": "剛果共和國",
"CH": "瑞士",
"CI": "科特迪瓦",
"CK": "庫克群島",
"CL": "智利",
"CM": "喀麥隆",
"CN": "中國",
"CO": "哥倫比亞",
"CR": "哥斯大黎加",
"CU": "古巴",
"CV": "維德角",
"CW": "庫拉索",
"CX": "聖誕島",
"CY": "賽普勒斯",
"CZ": "捷克",
"DE": "德國",
"DJ": "吉布地",
"DK": "丹麥",
"DM": "多明尼加",
"DO": "多明尼加共和國",
"DZ": "阿爾及利亞",
"EC": "厄瓜多",
"EE": "愛沙尼亞",
"EG": "埃及",
"EH": "西撒哈拉",
"ER": "厄利垂亞",
"ES": "西班牙",
"ET": "衣索比亞",
"FI": "芬蘭",
"FJ": "斐濟",
"FK": "福克蘭群島",
"FM": "密克羅尼西亞",
"FO": "法羅群島",
"FR": "法國",
"GA": "加彭",
"GB": "英國",
"GD": "格瑞那達",
"GE": "喬治亞",
"GF": "法屬圭亞那",
"GG": "根西島",
"GH": "迦納",
"GI": "直布羅陀",
"GL": "格陵蘭",
"GM": "Gambia",
"GN": "Guinea",
"GP": "Guadeloupe",
"GQ": "Equatorial Guinea",
"GR": "Greece",
"GS": "South Georgia and the South Sandwich Islands",
"GT": "Guatemala",
"GU": "Guam",
"GW": "Guinea-Bissau",
"GY": "Guyana",
"HK": "Hong Kong",
"HM": "Heard Island and McDonald Islands",
"HN": "Honduras",
"HR": "Croatia",
"HT": "Haiti",
"HU": "Hungary",
"ID": "Indonesia",
"IE": "Ireland",
"IL": "Israel",
"IM": "Isle of Man",
"IN": "India",
"IO": "British Indian Ocean Territory",
"IQ": "Iraq",
"IR": "Iran",
"IS": "Iceland",
"IT": "Italy",
"JE": "Jersey",
"JM": "Jamaica",
"JO": "Jordan",
"JP": "Japan",
"KE": "Kenya",
"KG": "Kyrgyzstan",
"KH": "Cambodia",
"KI": "Kiribati",
"KM": "Comoros",
"KN": "Saint Kitts and Nevis",
"KP": "North Korea",
"KR": "South Korea",
"KW": "Kuwait",
"KY": "Cayman Islands",
"KZ": "Kazakhstan",
"LA": "Laos",
"LB": "Lebanon",
"LC": "Saint Lucia",
"LI": "Liechtenstein",
"LK": "Sri Lanka",
"LR": "Liberia",
"LS": "Lesotho",
"LT": "Lithuania",
"LU": "Luxembourg",
"LV": "Latvia",
"LY": "Libya",
"MA": "Morocco",
"MC": "Monaco",
"MD": "Moldova",
"ME": "Montenegro",
"MF": "Saint Martin (French part)",
"MG": "Madagascar",
"MH": "Marshall Islands",
"MK": "North Macedonia",
"ML": "Mali",
"MM": "Myanmar",
"MN": "Mongolia",
"MO": "Macao",
"MP": "Northern Mariana Islands",
"MQ": "Martinique",
"MR": "Mauritania",
"MS": "Montserrat",
"MT": "Malta",
"MU": "Mauritius",
"MV": "Maldives",
"MW": "Malawi",
"MX": "Mexico",
"MY": "Malaysia",
"MZ": "Mozambique",
"NA": "Namibia",
"NC": "New Caledonia",
"NE": "Niger",
"NF": "Norfolk Island",
"NG": "Nigeria",
"NI": "Nicaragua",
"NL": "Netherlands",
"NO": "Norway",
"NP": "Nepal",
"NR": "Nauru",
"NU": "Niue",
"NZ": "New Zealand",
"OM": "Oman",
"PA": "Panama",
"PE": "Peru",
"PF": "French Polynesia",
"PG": "Papua New Guinea",
"PH": "Philippines",
"PK": "Pakistan",
"PL": "Poland",
"PM": "Saint Pierre and Miquelon",
"PN": "Pitcairn",
"PR": "Puerto Rico",
"PS": "Palestine",
"PT": "Portugal",
"PW": "Palau",
"PY": "Paraguay",
"QA": "Qatar",
"RE": "Réunion",
"RO": "Romania",
"RS": "Serbia",
"RU": "Russia",
"RW": "Rwanda",
"SA": "Saudi Arabia",
"SB": "Solomon Islands",
"SC": "Seychelles",
"SD": "Sudan",
"SE": "Sweden",
"SG": "Singapore",
"SH": "Saint Helena, Ascension and Tristan da Cunha",
"SI": "Slovenia",
"SJ": "Svalbard and Jan Mayen",
"SK": "Slovakia",
"SL": "Sierra Leone",
"SM": "San Marino",
"SN": "Senegal",
"SO": "Somalia",
"SR": "Suriname",
"SS": "South Sudan",
"ST": "Sao Tome and Principe",
"SV": "El Salvador",
"SX": "Sint Maarten (Dutch part)",
"SY": "Syria",
"SZ": "Eswatini",
"TC": "Turks and Caicos Islands",
"TD": "Chad",
"TF": "TAAF",
"TG": "Togo",
"TH": "Thailand",
"TJ": "Tajikistan",
"TK": "Tokelau",
"TL": "Timor-Leste",
"TM": "Turkmenistan",
"TN": "Tunisia",
"TO": "Tonga",
"TR": "Turkey",
"TT": "Trinidad and Tobago",
"TV": "Tuvalu",
"TW": "Taiwan",
"TZ": "Tanzania",
"UA": "Ukraine",
"UG": "Uganda",
"UM": "United States Minor Outlying Islands",
"US": "United States",
"UY": "Uruguay",
"UZ": "Uzbekistan",
"VA": "Holy See",
"VC": "Saint Vincent and the Grenadines",
"VE": "Venezuela",
"VG": "British Virgin Islands",
"VI": "U.S. Virgin Islands",
"VN": "Viet Nam",
"VU": "Vanuatu",
"WF": "Wallis and Futuna",
"WS": "Samoa",
"YE": "Yemen",
"YT": "Mayotte",
"XK": "Kosovo",
"ZA": "South Africa",
"ZM": "Zambia",
"ZW": "Zimbabwe",
"EU": "European Union"
},
"languages": {
"en-US": "English - US",
"fr": "French",
"nl": "Dutch",
"pt_BR": "Portuguese - Brazil"
}
},
"KnownHosts": {
"label": "Host",
"add": "Add new host",
"toast": "Host successfully {mode, select, created {created} deleted {deleted} other {edited}}."
},
"InitializeContainer": {
"title": "DID YOU KNOW",
"subtitle": "<1>Cockatrice is run by volunteers</1><1>that love card games!</1>"
},
"LoginContainer": {
"header": {
"title": "Login",
"subtitle": "A cross-platform virtual tabletop for multiplayer card games."
},
"footer": {
"registerPrompt": "Not registered yet?",
"registerAction": "Create an account",
"credit": "Cockatrice is an open source project",
"version": "Version"
},
"content": {
"subtitle1": "Play multiplayer card games online.",
"subtitle2": "Cross-platform virtual tabletop for multiplayer card games. Forever free."
},
"toasts": {
"passwordResetSuccessToast": "Password Reset Successfully",
"accountActivationSuccess": "Account Activated Successfully"
}
},
"UnsupportedContainer": {
"title": "Unsupported Browser",
"subtitle1": "Please update your browser and/or check your permissions.",
"subtitle2": "Note: Private browsing causes some browsers to disable certain permissions or features."
},
"AccountActivationDialog": {
"title": "Account Activation",
"subtitle1": "Your account has not been activated yet.",
"subtitle2": "You need to provide the activation token received in the activation email."
},
"KnownHostDialog": {
"title": "{mode, select, edit {Edit} other {Add}} Known Host",
"subtitle": "Adding a new host allows you to connect to different servers. Enter the details below to your host list."
},
"RegistrationDialog": {
"title": "Create New Account"
},
"RequestPasswordResetDialog": {
"title": "Request Password Reset"
},
"ResetPasswordDialog": {
"title": "Reset Password"
},
"AccountActivationForm": {
"error": {
"failed": "Account activation failed"
},
"label": {
"activate": "Activate Account"
}
},
"KnownHostForm": {
"help": "Need help adding a new host?",
"label": {
"add": "Add Host",
"find": "Find Host"
}
},
"LoginForm": {
"label": {
"autoConnect": "Auto Connect",
"forgot": "Forgot Password",
"login": "Login",
"savePassword": "Save Password",
"savedPassword": "Saved Password"
}
},
"RegisterForm": {
"label": {
"register": "Register"
},
"toast": {
"registerSuccess": "Registration Successful!"
}
},
"RequestPasswordResetForm": {
"error": "Request password reset failed",
"mfaEnabled": "Server has multi-factor authentication enabled",
"request": "Request Reset Token",
"skipRequest": "I already have a reset token"
},
"ResetPasswordForm": {
"error": "Password reset failed",
"label": {
"reset": "Reset Password"
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View file

@ -1,25 +0,0 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

View file

@ -1,4 +0,0 @@
# Ignore all files
*
# Except gitignore
!.gitignore

View file

@ -1,48 +0,0 @@
/* http://meyerweb.com/eric/tools/css/reset/
v2.0 | 20110126
License: none (public domain)
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}

View file

@ -1,2 +0,0 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *

View file

@ -1,19 +0,0 @@
import { AdminCommands } from 'websocket';
export class AdminService {
static adjustMod(userName: string, shouldBeMod?: boolean, shouldBeJudge?: boolean): void {
AdminCommands.adjustMod(userName, shouldBeMod, shouldBeJudge);
}
static reloadConfig(): void {
AdminCommands.reloadConfig();
}
static shutdownServer(reason: string, minutes: number): void {
AdminCommands.shutdownServer(reason, minutes);
}
static updateServerMessage(): void {
AdminCommands.updateServerMessage();
}
}

View file

@ -1,54 +0,0 @@
import { StatusEnum, User, WebSocketConnectReason, WebSocketConnectOptions } from 'types';
import { SessionCommands, webClient } from 'websocket';
export class AuthenticationService {
static login(options: WebSocketConnectOptions): void {
SessionCommands.connect(options, WebSocketConnectReason.LOGIN);
}
static testConnection(options: WebSocketConnectOptions): void {
SessionCommands.connect(options, WebSocketConnectReason.TEST_CONNECTION);
}
static register(options: WebSocketConnectOptions): void {
SessionCommands.connect(options, WebSocketConnectReason.REGISTER);
}
static activateAccount(options: WebSocketConnectOptions): void {
SessionCommands.connect(options, WebSocketConnectReason.ACTIVATE_ACCOUNT);
}
static resetPasswordRequest(options: WebSocketConnectOptions): void {
SessionCommands.connect(options, WebSocketConnectReason.PASSWORD_RESET_REQUEST);
}
static resetPasswordChallenge(options: WebSocketConnectOptions): void {
SessionCommands.connect(options, WebSocketConnectReason.PASSWORD_RESET_CHALLENGE);
}
static resetPassword(options: WebSocketConnectOptions): void {
SessionCommands.connect(options, WebSocketConnectReason.PASSWORD_RESET);
}
static disconnect(): void {
SessionCommands.disconnect();
}
static isConnected(state: number): boolean {
return state === StatusEnum.LOGGED_IN;
}
static isModerator(user: User): boolean {
const moderatorLevel = webClient.protobuf.controller.ServerInfo_User.UserLevelFlag.IsModerator;
// @TODO tell cockatrice not to do this so shittily
return (user.userLevel & moderatorLevel) === moderatorLevel;
}
static isAdmin() {
}
static connectionAttemptMade() {
return webClient.connectionAttemptMade;
}
}

View file

@ -1,29 +0,0 @@
import { ModeratorCommands } from 'websocket';
import { LogFilters } from 'types';
export class ModeratorService {
static banFromServer(minutes: number, userName?: string, address?: string, reason?: string,
visibleReason?: string, clientid?: string, removeMessages?: number): void {
ModeratorCommands.banFromServer(minutes, userName, address, reason, visibleReason, clientid, removeMessages);
}
static getBanHistory(userName: string): void {
ModeratorCommands.getBanHistory(userName);
}
static getWarnHistory(userName: string): void {
ModeratorCommands.getWarnHistory(userName);
}
static getWarnList(modName: string, userName: string, userClientid: string): void {
ModeratorCommands.getWarnList(modName, userName, userClientid);
}
static viewLogHistory(filters: LogFilters): void {
ModeratorCommands.viewLogHistory(filters);
}
static warnUser(userName: string, reason: string, clientid?: string, removeMessage?: boolean): void {
ModeratorCommands.warnUser(userName, reason, clientid, removeMessage);
}
}

View file

@ -1,15 +0,0 @@
import { RoomCommands, SessionCommands } from 'websocket';
export class RoomsService {
static joinRoom(roomId: number): void {
SessionCommands.joinRoom(roomId);
}
static leaveRoom(roomId: number): void {
RoomCommands.leaveRoom(roomId);
}
static roomSay(roomId: number, message: string): void {
RoomCommands.roomSay(roomId, message);
}
}

View file

@ -1,45 +0,0 @@
import { SessionCommands } from 'websocket';
import { common } from 'protobufjs';
import IBytesValue = common.IBytesValue;
export class SessionService {
static addToBuddyList(userName: string) {
SessionCommands.addToBuddyList(userName);
}
static removeFromBuddyList(userName: string) {
SessionCommands.removeFromBuddyList(userName);
}
static addToIgnoreList(userName: string) {
SessionCommands.addToIgnoreList(userName);
}
static removeFromIgnoreList(userName: string) {
SessionCommands.removeFromIgnoreList(userName);
}
static changeAccountPassword(oldPassword: string, newPassword: string, hashedNewPassword?: string): void {
SessionCommands.accountPassword(oldPassword, newPassword, hashedNewPassword);
}
static changeAccountDetails(passwordCheck: string, realName?: string, email?: string, country?: string): void {
SessionCommands.accountEdit(passwordCheck, realName, email, country);
}
static changeAccountImage(image: IBytesValue): void {
SessionCommands.accountImage(image);
}
static sendDirectMessage(userName: string, message: string): void {
SessionCommands.message(userName, message);
}
static getUserInfo(userName: string): void {
SessionCommands.getUserInfo(userName);
}
static getUserGames(userName: string): void {
SessionCommands.getGamesOfUser(userName);
}
}

View file

@ -1,5 +0,0 @@
export { AdminService } from './AdminService';
export { AuthenticationService } from './AuthenticationService';
export { ModeratorService } from './ModeratorService';
export { RoomsService } from './RoomsService';
export { SessionService } from './SessionService';

View file

@ -1,286 +0,0 @@
{
"Common": {
"language": "English",
"disconnect": "Disconnect",
"label": {
"confirmPassword": "Confirm Password",
"confirmSure": "Are you sure?",
"country": "Country",
"delete": "Delete",
"email": "Email",
"hostName": "Host Name",
"hostAddress": "Host Address",
"password": "Password",
"passwordAgain": "Password Again",
"port": "Port",
"realName": "Real Name",
"saveChanges": "Save Changes",
"token": "Token",
"username": "Username"
},
"validation": {
"minChars": "Minimum of {count} {count, plural, one {character} other {characters}} required",
"passwordsMustMatch": "Passwords don't match",
"required": "Required"
},
"countries": {
"AD": "Andorra",
"AE": "United Arab Emirates",
"AF": "Afghanistan",
"AG": "Antigua and Barbuda",
"AI": "Anguilla",
"AL": "Albania",
"AM": "Armenia",
"AO": "Angola",
"AQ": "Antarctica",
"AR": "Argentina",
"AS": "American Samoa",
"AT": "Austria",
"AU": "Australia",
"AW": "Aruba",
"AX": "Åland Islands",
"AZ": "Azerbaijan",
"BA": "Bosnia and Herzegovina",
"BB": "Barbados",
"BD": "Bangladesh",
"BE": "Belgium",
"BF": "Burkina Faso",
"BG": "Bulgaria",
"BH": "Bahrain",
"BI": "Burundi",
"BJ": "Benin",
"BL": "Saint Barthélemy",
"BM": "Bermuda",
"BN": "Brunei Darussalam",
"BO": "Bolivia",
"BQ": "Bonaire, Sint Eustatius and Saba",
"BR": "Brazil",
"BS": "Bahamas",
"BT": "Bhutan",
"BV": "Bouvet Island",
"BW": "Botswana",
"BY": "Belarus",
"BZ": "Belize",
"CA": "Canada",
"CC": "Cocos (Keeling) Islands",
"CD": "DR Congo",
"CF": "Central African Republic",
"CG": "Republic of the Congo",
"CH": "Switzerland",
"CI": "Ivory Coast",
"CK": "Cook Islands",
"CL": "Chile",
"CM": "Cameroon",
"CN": "China",
"CO": "Colombia",
"CR": "Costa Rica",
"CU": "Cuba",
"CV": "Cape Verde",
"CW": "Curaçao",
"CX": "Christmas Island",
"CY": "Cyprus",
"CZ": "Czechia",
"DE": "Germany",
"DJ": "Djibouti",
"DK": "Denmark",
"DM": "Dominica",
"DO": "Dominican Republic",
"DZ": "Algeria",
"EC": "Ecuador",
"EE": "Estonia",
"EG": "Egypt",
"EH": "Western Sahara",
"ER": "Eritrea",
"ES": "Spain",
"ET": "Ethiopia",
"FI": "Finland",
"FJ": "Fiji",
"FK": "Falkland Islands",
"FM": "Micronesia",
"FO": "Faroe Islands",
"FR": "France",
"GA": "Gabon",
"GB": "United Kingdom",
"GD": "Grenada",
"GE": "Georgia",
"GF": "French Guiana",
"GG": "Guernsey",
"GH": "Ghana",
"GI": "Gibraltar",
"GL": "Greenland",
"GM": "Gambia",
"GN": "Guinea",
"GP": "Guadeloupe",
"GQ": "Equatorial Guinea",
"GR": "Greece",
"GS": "South Georgia and the South Sandwich Islands",
"GT": "Guatemala",
"GU": "Guam",
"GW": "Guinea-Bissau",
"GY": "Guyana",
"HK": "Hong Kong",
"HM": "Heard Island and McDonald Islands",
"HN": "Honduras",
"HR": "Croatia",
"HT": "Haiti",
"HU": "Hungary",
"ID": "Indonesia",
"IE": "Ireland",
"IL": "Israel",
"IM": "Isle of Man",
"IN": "India",
"IO": "British Indian Ocean Territory",
"IQ": "Iraq",
"IR": "Iran",
"IS": "Iceland",
"IT": "Italy",
"JE": "Jersey",
"JM": "Jamaica",
"JO": "Jordan",
"JP": "Japan",
"KE": "Kenya",
"KG": "Kyrgyzstan",
"KH": "Cambodia",
"KI": "Kiribati",
"KM": "Comoros",
"KN": "Saint Kitts and Nevis",
"KP": "North Korea",
"KR": "South Korea",
"KW": "Kuwait",
"KY": "Cayman Islands",
"KZ": "Kazakhstan",
"LA": "Laos",
"LB": "Lebanon",
"LC": "Saint Lucia",
"LI": "Liechtenstein",
"LK": "Sri Lanka",
"LR": "Liberia",
"LS": "Lesotho",
"LT": "Lithuania",
"LU": "Luxembourg",
"LV": "Latvia",
"LY": "Libya",
"MA": "Morocco",
"MC": "Monaco",
"MD": "Moldova",
"ME": "Montenegro",
"MF": "Saint Martin (French part)",
"MG": "Madagascar",
"MH": "Marshall Islands",
"MK": "North Macedonia",
"ML": "Mali",
"MM": "Myanmar",
"MN": "Mongolia",
"MO": "Macao",
"MP": "Northern Mariana Islands",
"MQ": "Martinique",
"MR": "Mauritania",
"MS": "Montserrat",
"MT": "Malta",
"MU": "Mauritius",
"MV": "Maldives",
"MW": "Malawi",
"MX": "Mexico",
"MY": "Malaysia",
"MZ": "Mozambique",
"NA": "Namibia",
"NC": "New Caledonia",
"NE": "Niger",
"NF": "Norfolk Island",
"NG": "Nigeria",
"NI": "Nicaragua",
"NL": "Netherlands",
"NO": "Norway",
"NP": "Nepal",
"NR": "Nauru",
"NU": "Niue",
"NZ": "New Zealand",
"OM": "Oman",
"PA": "Panama",
"PE": "Peru",
"PF": "French Polynesia",
"PG": "Papua New Guinea",
"PH": "Philippines",
"PK": "Pakistan",
"PL": "Poland",
"PM": "Saint Pierre and Miquelon",
"PN": "Pitcairn",
"PR": "Puerto Rico",
"PS": "Palestine",
"PT": "Portugal",
"PW": "Palau",
"PY": "Paraguay",
"QA": "Qatar",
"RE": "Réunion",
"RO": "Romania",
"RS": "Serbia",
"RU": "Russia",
"RW": "Rwanda",
"SA": "Saudi Arabia",
"SB": "Solomon Islands",
"SC": "Seychelles",
"SD": "Sudan",
"SE": "Sweden",
"SG": "Singapore",
"SH": "Saint Helena, Ascension and Tristan da Cunha",
"SI": "Slovenia",
"SJ": "Svalbard and Jan Mayen",
"SK": "Slovakia",
"SL": "Sierra Leone",
"SM": "San Marino",
"SN": "Senegal",
"SO": "Somalia",
"SR": "Suriname",
"SS": "South Sudan",
"ST": "Sao Tome and Principe",
"SV": "El Salvador",
"SX": "Sint Maarten (Dutch part)",
"SY": "Syria",
"SZ": "Eswatini",
"TC": "Turks and Caicos Islands",
"TD": "Chad",
"TF": "TAAF",
"TG": "Togo",
"TH": "Thailand",
"TJ": "Tajikistan",
"TK": "Tokelau",
"TL": "Timor-Leste",
"TM": "Turkmenistan",
"TN": "Tunisia",
"TO": "Tonga",
"TR": "Turkey",
"TT": "Trinidad and Tobago",
"TV": "Tuvalu",
"TW": "Taiwan",
"TZ": "Tanzania",
"UA": "Ukraine",
"UG": "Uganda",
"UM": "United States Minor Outlying Islands",
"US": "United States",
"UY": "Uruguay",
"UZ": "Uzbekistan",
"VA": "Holy See",
"VC": "Saint Vincent and the Grenadines",
"VE": "Venezuela",
"VG": "British Virgin Islands",
"VI": "U.S. Virgin Islands",
"VN": "Viet Nam",
"VU": "Vanuatu",
"WF": "Wallis and Futuna",
"WS": "Samoa",
"YE": "Yemen",
"YT": "Mayotte",
"XK": "Kosovo",
"ZA": "South Africa",
"ZM": "Zambia",
"ZW": "Zimbabwe",
"EU": "European Union"
},
"languages": {
"en-US": "English - US",
"fr": "French",
"nl": "Dutch",
"pt_BR": "Portuguese - Brazil"
}
}
}

View file

@ -1,4 +0,0 @@
.card {
width: 100%;
height: 100%;
}

View file

@ -1,20 +0,0 @@
// eslint-disable-next-line
import React, { useMemo, useState } from 'react';
import { CardDTO } from 'services';
import './Card.css';
interface CardProps {
card: CardDTO;
}
const Card = ({ card }: CardProps) => {
const src = `https://api.scryfall.com/cards/${card?.identifiers?.scryfallId}?format=image`;
return card && (
<img className="card" src={src} alt={card?.name} />
);
}
export default Card;

View file

@ -1,45 +0,0 @@
.cardDetails {
padding: 10px;
width: calc(400px * .716);
font-size: 10px;
}
.cardDetails-card {
height: 400px;
margin: 0 auto;
}
.cardDetails-attribute {
display: flex;
justify-content: space-between;
align-items: baseline;
}
.cardDetails-attributes {
margin: 10px 0;
}
.cardDetails-attribute__label {
text-transform: uppercase;
font-size: 10px;
margin-right: 10px;
}
.cardDetails-attribute__value {
text-align: right;
}
.cardDetails-text {
font-size: 12px;
padding: 5px;
background: rgba(0, 0, 0, .15);
white-space: pre-line;
}
.cardDetails-text__flavor {
font-style: italic;
}
.cardDetails-text__current:not(:empty) + .cardDetails-text__flavor {
margin-top: 10px;
}

View file

@ -1,130 +0,0 @@
// eslint-disable-next-line
import React, { useMemo, useState } from 'react';
import { CardDTO } from 'services';
import Card from '../Card/Card';
import './CardDetails.css';
interface CardProps {
card: CardDTO;
}
// @TODO: add missing fields (loyalty, hand, etc)
const CardDetails = ({ card }: CardProps) => {
return (
<div className='cardDetails'>
<div className='cardDetails-card'>
<Card card={card} />
</div>
{
card && (
<div>
<div className='cardDetails-attributes'>
<div className='cardDetails-attribute'>
<span className='cardDetails-attribute__label'>Name:</span>
<span className='cardDetails-attribute__value'>{card.name}</span>
</div>
{
(!card.power && !card.toughness) ? null : (
<div className='cardDetails-attribute'>
<span className='cardDetails-attribute__label'>P/T:</span>
<span className='cardDetails-attribute__value'>{card.power || 0}/{card.toughness || 0}</span>
</div>
)
}
{
!card.manaCost ? null : (
<div className='cardDetails-attribute'>
<span className='cardDetails-attribute__label'>Cost:</span>
<span className='cardDetails-attribute__value'>{card.manaCost.replace(/\{|\}/g, '')}</span>
</div>
)
}
{
!card.convertedManaCost ? null : (
<div className='cardDetails-attribute'>
<span className='cardDetails-attribute__label'>CMC:</span>
<span className='cardDetails-attribute__value'>{card.convertedManaCost}</span>
</div>
)
}
{
!card.colorIdentity?.length ? null : (
<div className='cardDetails-attribute'>
<span className='cardDetails-attribute__label'>Identity:</span>
<span className='cardDetails-attribute__value'>{card.colorIdentity.join('')}</span>
</div>
)
}
{
!card.colors?.length ? null : (
<div className='cardDetails-attribute'>
<span className='cardDetails-attribute__label'>Color(s):</span>
<span className='cardDetails-attribute__value'>{card.colors.join('')}</span>
</div>
)
}
{
!card.types?.length ? null : (
<div className='cardDetails-attribute'>
<span className='cardDetails-attribute__label'>Main Type:</span>
<span className='cardDetails-attribute__value'>{card.types.join(', ')}</span>
</div>
)
}
{
!card.type ? null : (
<div className='cardDetails-attribute'>
<span className='cardDetails-attribute__label'>Type:</span>
<span className='cardDetails-attribute__value'>{card.type}</span>
</div>
)
}
{
!card.side ? null : (
<div className='cardDetails-attribute'>
<span className='cardDetails-attribute__label'>Side:</span>
<span className='cardDetails-attribute__value'>{card.side}</span>
</div>
)
}
{
!card.layout ? null : (
<div className='cardDetails-attribute'>
<span className='cardDetails-attribute__label'>Layout:</span>
<span className='cardDetails-attribute__value'>{card.layout}</span>
</div>
)
}
</div>
<div className='cardDetails-text'>
<div className='cardDetails-text__current'>
{card.text?.trim()}
</div>
<div className='cardDetails-text__flavor'>
{card.flavorText?.trim()}
</div>
</div>
</div>
)
}
</div>
);
}
export default CardDetails;

View file

@ -1,26 +0,0 @@
import React from 'react';
import Checkbox from '@mui/material/Checkbox';
import FormControlLabel from '@mui/material/FormControlLabel';
const CheckboxField = (props) => {
const { input: { value, onChange }, label, ...args } = props;
// @TODO this isnt unchecking properly
return (
<FormControlLabel
className="checkbox-field"
label={label}
control={
<Checkbox
{ ...args }
className="checkbox-field__box"
checked={!!value}
onChange={(e, checked) => onChange(checked)}
color="primary"
/>
}
/>
);
};
export default CheckboxField;

View file

@ -1,13 +0,0 @@
.CountryDropdown {
width: 100%;
}
.CountryDropdown-item {
display: flex;
align-items: center;
}
.CountryDropdown-item__image {
width: 1.5em;
margin-right: 1em;
}

View file

@ -1,56 +0,0 @@
import { useEffect, useState } from 'react';
import { Select, MenuItem } from '@mui/material';
import FormControl from '@mui/material/FormControl';
import InputLabel from '@mui/material/InputLabel';
import { useTranslation } from 'react-i18next';
import { useLocaleSort } from 'hooks';
import { Images } from 'images/Images';
import { countryCodes } from 'types';
import './CountryDropdown.css';
const CountryDropdown = ({ input: { onChange } }) => {
const [value, setValue] = useState('');
const { t } = useTranslation();
useEffect(() => onChange(value), [value]);
const translateCountry = country => t(`Common.countries.${country}`);
const sortedCountries = useLocaleSort(countryCodes, translateCountry);
return (
<FormControl size='small' variant='outlined' className='CountryDropdown'>
<InputLabel id='CountryDropdown-select'>Country</InputLabel>
<Select
id='CountryDropdown-select'
labelId='CountryDropdown-label'
label='Country'
margin='dense'
value={value}
fullWidth={true}
onChange={e => setValue(e.target.value as string)}
>
<MenuItem value={''} key={-1}>
<div className="CountryDropdown-item">
<span className="CountryDropdown-item__label">None</span>
</div>
</MenuItem>
{
sortedCountries.map((country, index:number) => (
<MenuItem value={country} key={index}>
<div className="CountryDropdown-item">
<img className="CountryDropdown-item__image" src={Images.Countries[country.toLowerCase()]} />
<span className="CountryDropdown-item__label">{translateCountry(country)}</span>
</div>
</MenuItem>
))
}
</Select>
</FormControl>
)
};
export default CountryDropdown;

View file

@ -1,24 +0,0 @@
import React from 'react';
import { connect } from 'react-redux';
import { Navigate } from 'react-router-dom';
import { ServerSelectors } from 'store';
import { RouteEnum } from 'types';
import { AuthenticationService } from 'api';
const AuthGuard = ({ state }: AuthGuardProps) => {
return !AuthenticationService.isConnected(state)
? <Navigate to={RouteEnum.LOGIN} />
: <div></div>;
};
interface AuthGuardProps {
state: number;
}
const mapStateToProps = state => ({
state: ServerSelectors.getState(state),
});
export default connect(mapStateToProps)(AuthGuard);

View file

@ -1,27 +0,0 @@
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { Navigate } from 'react-router-dom';
import { ServerSelectors } from 'store';
import { User } from 'types';
import { AuthenticationService } from 'api';
import { RouteEnum } from 'types';
class ModGuard extends Component<ModGuardProps> {
render() {
return !AuthenticationService.isModerator(this.props.user)
? <Navigate to={RouteEnum.SERVER} />
: '';
}
};
interface ModGuardProps {
user: User;
}
const mapStateToProps = state => ({
user: ServerSelectors.getUser(state),
});
export default connect(mapStateToProps)(ModGuard);

View file

@ -1,19 +0,0 @@
.input-action {
display: flex;
width: 100%;
align-items: center;
}
.input-action,
.input-action__item,
.input-action__submit {
padding: 5px;
}
.input-action__item {
width: 100%;
height: 100%;
}
.input-action__item > div {
margin: 0;
}

View file

@ -1,27 +0,0 @@
import React from 'react';
import { Field } from 'react-final-form'
import Button from '@mui/material/Button';
import { InputField } from 'components';
import './InputAction.css';
const InputAction = ({ action, label, name, validate, disabled }) => (
<div className="input-action">
<div className="input-action__item">
<Field label={label} name={name} component={InputField} validate={validate} />
</div>
<div className="input-action__submit">
<Button color="primary" variant="contained" type="submit" disabled={disabled}>
{action}
</Button>
</div>
</div>
);
InputAction.defaultProps = {
disabled: false,
validate: () => false,
}
export default InputAction;

View file

@ -1,20 +0,0 @@
.InputField {
position: relative;
}
.InputField-validation {
position: absolute;
top: 0;
right: 0;
transform: translateY(-50%);
font-weight: bold;
}
.InputField-error {
display: flex;
align-items: center;
}
.InputField-error svg {
margin-left: 4px;
}

View file

@ -1,60 +0,0 @@
import React from 'react';
import { styled } from '@mui/material/styles';
import TextField from '@mui/material/TextField';
import ErrorOutlinedIcon from '@mui/icons-material/ErrorOutlined';
import './InputField.css';
const PREFIX = 'InputField';
const classes = {
root: `${PREFIX}-root`
};
const Root = styled('div')(({ theme }) => ({
[`&.${classes.root}`]: {
'& .InputField-error': {
color: theme.palette.error.main
},
'& .InputField-warning': {
color: theme.palette.warning.main
},
},
}));
const InputField = ({ input, meta, ...args }) => {
const { touched, error, warning } = meta;
return (
<Root className={'InputField ' + classes.root}>
{ touched && (
<div className="InputField-validation">
{
(error &&
<div className="InputField-error">
{error}
<ErrorOutlinedIcon style={{ fontSize: 'small', fontWeight: 'bold' }} />
</div>
) ||
(warning && <div className="InputField-warning">{warning}</div>)
}
</div>
) }
<TextField
autoComplete='off'
{ ...input }
{ ...args }
className="rounded"
variant="outlined"
margin="dense"
size="small"
fullWidth={true}
/>
</Root>
);
};
export default InputField;

View file

@ -1,70 +0,0 @@
.KnownHosts {
}
.KnownHosts-form {
width: 100%;
position: relative;
}
.KnownHosts-item {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.KnownHosts-item__wrapper {
display: flex;
align-items: center;
}
.KnownHosts-item__label {
position: relative;
}
.KnownHosts-item__label svg {
display: none;
position: absolute;
left: -.1em;
top: 50%;
transform: translate(-100%, -50%);
font-size: .9em;
}
.KnownHosts-item__status {
display: none;
}
.KnownHosts-item__status svg {
margin-left: -5px;
margin-right: 5px;
}
.KnownHosts-validation {
position: absolute;
top: 0;
right: 0;
transform: translateY(-100%);
font-weight: bold;
}
.KnownHosts-error {
display: flex;
align-items: center;
}
.KnownHosts-error svg {
margin-left: 4px;
}
.KnownHosts .MuiSelect-select .KnownHosts-item__status {
display: flex;
}
.Mui-selected .KnownHosts-item__label svg {
display: block;
}
.MuiSelect-select .KnownHosts-item__edit {
display: none;
}

View file

@ -1,7 +0,0 @@
{
"KnownHosts": {
"label": "Host",
"add": "Add new host",
"toast": "Host successfully {mode, select, created {created} deleted {deleted} other {edited}}."
}
}

View file

@ -1,285 +0,0 @@
import { useCallback, useEffect, useState } from 'react';
import { styled } from '@mui/material/styles';
import { useTranslation } from 'react-i18next';
import { Select, MenuItem } from '@mui/material';
import Button from '@mui/material/Button';
import FormControl from '@mui/material/FormControl';
import IconButton from '@mui/material/IconButton';
import WifiTetheringIcon from '@mui/icons-material/WifiTethering';
import PortableWifiOffIcon from '@mui/icons-material/PortableWifiOff';
import InputLabel from '@mui/material/InputLabel';
import Check from '@mui/icons-material/Check';
import AddIcon from '@mui/icons-material/Add';
import EditRoundedIcon from '@mui/icons-material/Edit';
import ErrorOutlinedIcon from '@mui/icons-material/ErrorOutlined';
import { AuthenticationService } from 'api';
import { KnownHostDialog } from 'dialogs';
import { useReduxEffect } from 'hooks';
import { HostDTO } from 'services';
import { ServerTypes } from 'store';
import { DefaultHosts, Host, getHostPort } from 'types';
import Toast from 'components/Toast/Toast';
import './KnownHosts.css';
enum TestConnection {
TESTING = 'testing',
FAILED = 'failed',
SUCCESS = 'success',
}
const PREFIX = 'KnownHosts';
const classes = {
root: `${PREFIX}-root`
};
const Root = styled('div')(({ theme }) => ({
[`&.${classes.root}`]: {
'& .KnownHosts-error': {
color: theme.palette.error.main
},
'& .KnownHosts-warning': {
color: theme.palette.warning.main
},
'& .KnownHosts-item': {
[`& .${TestConnection.TESTING}`]: {
color: theme.palette.warning.main
},
[`& .${TestConnection.FAILED}`]: {
color: theme.palette.error.main
},
[`& .${TestConnection.SUCCESS}`]: {
color: theme.palette.success.main
}
}
}
}));
const KnownHosts = (props) => {
const { input: { onChange }, meta, disabled } = props;
const { touched, error, warning } = meta;
const { t } = useTranslation();
const [hostsState, setHostsState] = useState({
hosts: [],
selectedHost: {} as any,
});
const [dialogState, setDialogState] = useState({
open: false,
edit: null,
});
const [testingConnection, setTestingConnection] = useState<TestConnection>(null);
const [showCreateToast, setShowCreateToast] = useState(false);
const [showDeleteToast, setShowDeleteToast] = useState(false);
const [showEditToast, setShowEditToast] = useState(false);
const loadKnownHosts = useCallback(async () => {
const hosts = await HostDTO.getAll();
if (!hosts?.length) {
// @TODO: find a better pattern to seeding default data in indexedDB
await HostDTO.bulkAdd(DefaultHosts);
loadKnownHosts();
} else {
const selectedHost = hosts.find(({ lastSelected }) => lastSelected) || hosts[0];
setHostsState(s => ({ ...s, hosts, selectedHost }));
}
}, []);
useEffect(() => {
loadKnownHosts();
}, [loadKnownHosts]);
useEffect(() => {
const { hosts, selectedHost } = hostsState;
if (selectedHost?.id) {
updateLastSelectedHost(selectedHost.id).then(() => {
onChange(selectedHost);
});
}
}, [hostsState, onChange]);
useReduxEffect(() => {
setTestingConnection(TestConnection.SUCCESS);
}, ServerTypes.TEST_CONNECTION_SUCCESSFUL, []);
useReduxEffect(() => {
setTestingConnection(TestConnection.FAILED);
}, ServerTypes.TEST_CONNECTION_FAILED, []);
const selectHost = (selectedHost) => {
setHostsState(s => ({ ...s, selectedHost }));
};
const openAddKnownHostDialog = () => {
setDialogState(s => ({ ...s, open: true, edit: null }));
};
const openEditKnownHostDialog = (host: HostDTO) => {
setDialogState(s => ({ ...s, open: true, edit: host }));
};
const closeKnownHostDialog = () => {
setDialogState(s => ({ ...s, open: false }));
}
const handleDialogRemove = async ({ id }) => {
setHostsState(s => ({
...s,
hosts: s.hosts.filter(host => host.id !== id),
selectedHost: s.selectedHost.id === id ? s.hosts[0] : s.selectedHost,
}));
closeKnownHostDialog();
HostDTO.delete(id);
setShowDeleteToast(true)
};
const handleDialogSubmit = async ({ id, name, host, port }) => {
if (id) {
const hostDTO = await HostDTO.get(id);
hostDTO.name = name;
hostDTO.host = host;
hostDTO.port = port;
await hostDTO.save();
setHostsState(s => ({
...s,
hosts: s.hosts.map(h => h.id === id ? hostDTO : h),
selectedHost: hostDTO
}));
setShowEditToast(true)
} else {
const newHost: Host = { name, host, port, editable: true };
newHost.id = await HostDTO.add(newHost) as number;
setHostsState(s => ({
...s,
hosts: [...s.hosts, newHost],
selectedHost: newHost,
}));
setShowCreateToast(true)
}
closeKnownHostDialog();
};
const updateLastSelectedHost = (hostId): Promise<any[]> => {
testConnection();
return HostDTO.getAll().then(hosts =>
hosts.map(async host => {
if (host.id === hostId) {
host.lastSelected = true;
return await host.save();
}
if (host.lastSelected) {
host.lastSelected = false;
return await host.save();
}
return host;
})
);
};
const testConnection = () => {
setTestingConnection(TestConnection.TESTING);
const options = { ...getHostPort(hostsState.selectedHost) };
AuthenticationService.testConnection(options);
}
return (
<Root className={'KnownHosts ' + classes.root}>
<FormControl className='KnownHosts-form' size='small' variant='outlined'>
{ touched && (
<div className='KnownHosts-validation'>
{
(error &&
<div className='KnownHosts-error'>
{error}
<ErrorOutlinedIcon style={{ fontSize: 'small', fontWeight: 'bold' }} />
</div>
) ||
(warning && <div className='KnownHosts-warning'>{warning}</div>)
}
</div>
) }
<InputLabel id='KnownHosts-select'>{ t('KnownHosts.label') }</InputLabel>
<Select
id='KnownHosts-select'
labelId='KnownHosts-label'
label='Host'
margin='dense'
name='host'
value={hostsState.selectedHost}
fullWidth={true}
onChange={e => selectHost(e.target.value)}
disabled={disabled}
>
<Button value={hostsState.selectedHost} onClick={openAddKnownHostDialog}>
<span>{ t('KnownHosts.add') }</span>
<AddIcon fontSize='small' color='primary' />
</Button>
{
hostsState.hosts.map((host, index) => (
<MenuItem value={host} key={index}>
<div className='KnownHosts-item'>
<div className='KnownHosts-item__wrapper'>
<div className={'KnownHosts-item__status ' + testingConnection}>
{
testingConnection === TestConnection.FAILED
? <PortableWifiOffIcon fontSize="small" />
: <WifiTetheringIcon fontSize="small" />
}
</div>
<div className='KnownHosts-item__label'>
<Check />
<span>{host.name} ({ getHostPort(hostsState.hosts[index]).host }:{getHostPort(hostsState.hosts[index]).port})</span>
</div>
</div>
{ host.editable && (
<IconButton className='KnownHosts-item__edit' size='small' color='primary' onClick={(e) => {
openEditKnownHostDialog(hostsState.hosts[index]);
}}>
<EditRoundedIcon fontSize='small' />
</IconButton>
) }
</div>
</MenuItem>
))
}
</Select>
</FormControl>
<KnownHostDialog
isOpen={dialogState.open}
host={dialogState.edit}
onRemove={handleDialogRemove}
onSubmit={handleDialogSubmit}
handleClose={closeKnownHostDialog}
/>
<Toast open={showCreateToast} onClose={() => setShowCreateToast(false)}>{ t('KnownHosts.toast', { mode: 'created' }) }</Toast>
<Toast open={showDeleteToast} onClose={() => setShowDeleteToast(false)}>{ t('KnownHosts.toast', { mode: 'deleted' }) }</Toast>
<Toast open={showEditToast} onClose={() => setShowEditToast(false)}>{ t('KnownHosts.toast', { mode: 'edited' }) }</Toast>
</Root>
);
};
export default KnownHosts;

View file

@ -1,19 +0,0 @@
.LanguageDropdown {
}
.LanguageDropdown-item {
display: flex;
align-items: center;
}
.LanguageDropdown-item__image {
width: 1.5em;
}
.MuiSelect-select .LanguageDropdown-item__label {
display: none;
}
.MuiList-root .LanguageDropdown-item__image {
margin-right: 1em;
}

View file

@ -1,57 +0,0 @@
// eslint-disable-next-line
import React, { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Select, MenuItem } from '@mui/material';
import FormControl from '@mui/material/FormControl';
import InputLabel from '@mui/material/InputLabel';
import { Images } from 'images/Images';
import { Language, LanguageCountry, LanguageNative } from 'types';
import './LanguageDropdown.css';
const LanguageDropdown = () => {
const { t, i18n } = useTranslation();
const [language, setLanguage] = useState(i18n.resolvedLanguage);
useEffect(() => {
if (language !== i18n.resolvedLanguage) {
i18n.changeLanguage(language);
}
}, [language]);
return (
<FormControl size='small' variant='outlined' className='LanguageDropdown'>
<Select
id='LanguageDropdown-select'
margin='dense'
value={language}
fullWidth={true}
onChange={e => setLanguage(e.target.value as Language)}
>
{
Object.keys(Language).map((lang) => {
const country = LanguageCountry[lang];
return (
<MenuItem value={lang} key={lang}>
<div className="LanguageDropdown-item">
<img className="LanguageDropdown-item__image" src={Images.Countries[country]} />
<span className="LanguageDropdown-item__label">
{LanguageNative[lang]} {
LanguageNative[lang] !== t(`Common.languages.${lang}`) && (
<>({ t(`Common.languages.${lang}`) })</>
)
}
</span>
</div>
</MenuItem>
);
})
}
</Select>
</FormControl>
)
};
export default LanguageDropdown;

View file

@ -1,4 +0,0 @@
.callout {
font-weight: bold;
color: green;
}

View file

@ -1,94 +0,0 @@
// eslint-disable-next-line
import React, { useMemo, useState } from 'react';
import { styled } from '@mui/material/styles';
import Popover from '@mui/material/Popover';
import { CardDTO, TokenDTO } from 'services';
import CardDetails from '../CardDetails/CardDetails';
import TokenDetails from '../TokenDetails/TokenDetails';
import './CardCallout.css';
const PREFIX = 'CardCallout';
const classes = {
popover: `${PREFIX}-popover`,
popoverContent: `${PREFIX}-popoverContent`
};
const Root = styled('span')(({ theme }) => ({
[`& .${classes.popover}`]: {
pointerEvents: 'none',
},
[`& .${classes.popoverContent}`]: {
pointerEvents: 'none',
}
}));
const CardCallout = ({ name }) => {
const [card, setCard] = useState<CardDTO>(null);
const [token, setToken] = useState<TokenDTO>(null);
const [anchorEl, setAnchorEl] = useState<Element>(null);
useMemo(async () => {
const card = await CardDTO.get(name);
if (card) {
return setCard(card)
}
const token = await TokenDTO.get(name);
if (token) {
return setToken(token);
}
}, [name]);
const handlePopoverOpen = (event) => {
setAnchorEl(event.currentTarget);
};
const handlePopoverClose = () => {
setAnchorEl(null);
};
const open = Boolean(anchorEl);
return (
<Root className='callout'>
<span
onMouseEnter={handlePopoverOpen}
onMouseLeave={handlePopoverClose}
>{card?.name || token?.name?.value || name}</span>
{
(card || token) && (
<Popover
open={open}
anchorEl={anchorEl}
onClose={handlePopoverClose}
className={classes.popover}
classes={{
paper: classes.popoverContent,
}}
anchorOrigin={{
vertical: 'top',
horizontal: 'right',
}}
transformOrigin={{
vertical: 'bottom',
horizontal: 'left',
}}
>
<div className="callout-card">
{ card && (<CardDetails card={card} />) }
{ token && (<TokenDetails token={token} />) }
</div>
</Popover>
)
}
</Root>
);
};
export default CardCallout;

View file

@ -1,3 +0,0 @@
.link {
color: blue;
}

View file

@ -1,105 +0,0 @@
// eslint-disable-next-line
import React, { useEffect, useMemo, useState } from 'react';
import { NavLink, generatePath } from 'react-router-dom';
import {
RouteEnum,
URL_REGEX,
MESSAGE_SENDER_REGEX,
MENTION_REGEX,
CARD_CALLOUT_REGEX,
CALLOUT_BOUNDARY_REGEX,
} from 'types';
import CardCallout from './CardCallout';
import './Message.css';
const Message = ({ message: { message, messageType, timeOf, timeReceived } }) => (
<div className='message'>
<div className='message__detail'>
<ParsedMessage message={message} />
</div>
</div>
);
const ParsedMessage = ({ message }) => {
const [messageChunks, setMessageChunks] = useState(null);
const [name, setName] = useState(null);
useMemo(() => {
const name = message.match(MESSAGE_SENDER_REGEX);
if (name) {
setName(name[1]);
}
setMessageChunks(parseMessage(message));
}, [message]);
return (
<div>
{ name && (<strong><PlayerLink name={name} />:</strong>) }
{ messageChunks }
</div>
);
};
const PlayerLink = ({ name, label = name }) => (
<NavLink className="link" to={generatePath(RouteEnum.PLAYER, { name })}>
{label}
</NavLink>
);
function parseMessage(message) {
return message.replace(MESSAGE_SENDER_REGEX, '')
.split(CARD_CALLOUT_REGEX)
.filter(chunk => !!chunk)
.map(parseChunks);
}
function parseChunks(chunk, index) {
if (chunk.match(CARD_CALLOUT_REGEX)) {
const name = chunk.replace(CALLOUT_BOUNDARY_REGEX, '').trim();
return (<CardCallout name={name} key={index}></CardCallout>);
}
if (chunk.match(URL_REGEX)) {
return parseUrlChunk(chunk);
}
if (chunk.match(MENTION_REGEX)) {
return parseMentionChunk(chunk);
}
return chunk;
}
function parseUrlChunk(chunk) {
return chunk.split(URL_REGEX)
.filter(urlChunk => !!urlChunk)
.map((urlChunk, index) => {
if (urlChunk.match(URL_REGEX)) {
return (<a className='link' href={urlChunk} key={index} target='_blank' rel='noopener noreferrer'>{urlChunk}</a>);
}
return urlChunk;
});
}
function parseMentionChunk(chunk) {
return chunk.split(MENTION_REGEX)
.filter(mentionChunk => !!mentionChunk)
.map((mentionChunk, index) => {
const mention = mentionChunk.match(MENTION_REGEX);
if (mention) {
const name = mention[0].substr(1);
return (<PlayerLink name={name} label={mention} key={index} />);
}
return mentionChunk;
});
}
export default Message;

View file

@ -1,25 +0,0 @@
import React, { useEffect, useRef } from 'react';
const ScrollToBottomOnChanges = ({ content, changes }) => {
const messagesEndRef = useRef(null);
// @TODO (2)
const scrollToBottom = () => {
messagesEndRef.current.scrollIntoView({ behavior: 'smooth' })
}
useEffect(scrollToBottom, [changes]);
const styling = {
height: '100%'
};
return (
<div style={styling}>
{content}
<div ref={messagesEndRef} />
</div>
)
}
export default ScrollToBottomOnChanges;

View file

@ -1,4 +0,0 @@
.select-field label {
background: white;
padding: 0 5px;
}

View file

@ -1,30 +0,0 @@
import React from 'react';
import FormControl from '@mui/material/FormControl';
import InputLabel from '@mui/material/InputLabel';
import MenuItem from '@mui/material/MenuItem';
import Select from '@mui/material/Select';
import './SelectField.css';
const SelectField = ({ input, label, options, value }) => {
const id = label + '-select-field';
const labelId = id + '-label';
return (
<FormControl variant="outlined" margin="dense" className="select-field">
<InputLabel id={labelId}>{label}</InputLabel>
<Select
labelId={labelId}
id={id}
value={value}
{ ...input }
>{
options.map((option, index) => (
<MenuItem value={index} key={index}> { option } </MenuItem>
))
}</Select>
</FormControl>
);
};
export default SelectField;

View file

@ -1,37 +0,0 @@
.three-pane-layout,
.three-pane-layout .grid {
width: 100%;
height: 100%;
margin: 0;
}
.three-pane-layout .grid-main,
.three-pane-layout .grid-side {
height: 100%;
}
.three-pane-layout .grid-main {
display: flex;
flex-direction: column;
}
.three-pane-layout .grid-main__top {
max-height: 50%;
width: 100%;
padding-bottom: 20px;
flex-shrink: 0;
}
.three-pane-layout .grid-main__bottom {
height: 100%;
width: 100%;
flex-shrink: 1;
overflow: hidden;
}
.three-pane-layout .grid-main__top.fixedHeight,
.three-pane-layout .grid-main__bottom.fixedHeight {
height: 50%;
overflow: visible;
padding: 0 0 16px;
}

View file

@ -1,49 +0,0 @@
import { Component, CElement } from 'react';
import { connect } from 'react-redux';
import Grid from '@mui/material/Grid';
import Hidden from '@mui/material/Hidden';
import './ThreePaneLayout.css';
// @DEPRECATED
// This component sucks balls, dont use it. It will be removed sooner than later.
class ThreePaneLayout extends Component<ThreePaneLayoutProps> {
render() {
return (
<div className="three-pane-layout">
<Grid container rowSpacing={0} columnSpacing={2} className="grid">
<Grid item xs={12} md={9} lg={10} className="grid-main">
<Grid item className={
'grid-main__top'
+ (this.props.fixedHeight ? ' fixedHeight' : '')
}>
{this.props.top}
</Grid>
<Grid item className={
'grid-main__bottom'
+ (this.props.fixedHeight ? ' fixedHeight' : '')
}>
{this.props.bottom}
</Grid>
</Grid>
<Hidden mdDown>
<Grid item md={3} lg={2} className="grid-side">
{this.props.side}
</Grid>
</Hidden>
</Grid>
</div>
);
}
}
interface ThreePaneLayoutProps {
top: CElement<any, any>,
bottom: CElement<any, any>,
side?: CElement<any, any>,
fixedHeight?: boolean,
}
const mapStateToProps = state => ({});
export default connect(mapStateToProps)(ThreePaneLayout);

View file

@ -1,65 +0,0 @@
import * as React from 'react'
import ReactDOM from 'react-dom'
import Alert, { AlertProps } from '@mui/material/Alert';
import CheckCircleIcon from '@mui/icons-material/CheckCircle';
import Slide, { SlideProps } from '@mui/material/Slide';
import Snackbar from '@mui/material/Snackbar';
const iconMapping = {
success: <CheckCircleIcon />
}
function Toast(props) {
const { open, onClose, severity, autoHideDuration, children } = props
const rootElemRef = React.useRef(document.createElement('div'));
React.useEffect(() => {
document.body.appendChild(rootElemRef.current)
return () => {
rootElemRef.current.remove();
}
}, [rootElemRef])
const handleClose = (event?: React.SyntheticEvent, reason?: string) => {
if (reason === 'clickaway') {
return;
}
onClose(event);
};
const node = (
<Snackbar
open={open}
autoHideDuration={autoHideDuration}
onClose={handleClose}
TransitionComponent={TransitionLeft}
anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
>
<Alert onClose={handleClose} severity={severity} iconMapping={iconMapping}>
{children}
</Alert>
</Snackbar>
)
if (!rootElemRef.current) {
return null
}
return ReactDOM.createPortal(
node,
rootElemRef.current
);
}
Toast.defaultProps = {
severity: 'success',
// 10s wait before automatically dismissing the Toast.
autoHideDuration: 10000,
}
function TransitionLeft(props) {
return <Slide {...props} direction="left" />;
}
export default Toast

View file

@ -1,71 +0,0 @@
import { createContext, FC, PropsWithChildren, ReactChild, ReactNode, useContext, useEffect, useReducer, ContextType, Context } from 'react'
import { ACTIONS, initialState, reducer } from './reducer';
import Toast from './Toast'
interface ToastEntry {
isOpen: boolean,
children: ReactChild,
}
interface ToastState {
toasts: Map<string, ToastEntry>,
addToast: (key, children) => void,
openToast: (key) => void,
closeToast: (key) => void,
removeToast: (key) => void,
}
const ToastContext: Context<any> = createContext<ToastState>({
toasts: new Map<string, ToastEntry>(),
addToast: (key, children) => {},
openToast: (key) => {},
closeToast: (key) => {},
removeToast: (key) => {},
});
export const ToastProvider: FC<PropsWithChildren> = (props) => {
const { children } = props
const [state, dispatch] = useReducer(reducer, initialState)
const providerState = {
toasts: state.toasts,
addToast: (key, children) => dispatch({ type: ACTIONS.ADD_TOAST, payload: { key, children } }),
openToast: key => dispatch({ type: ACTIONS.OPEN_TOAST, payload: { key } }),
closeToast: key => dispatch({ type: ACTIONS.CLOSE_TOAST, payload: { key } }),
removeToast: key => dispatch({ type: ACTIONS.REMOVE_TOAST, payload: { key } }),
}
return (
<ToastContext.Provider value={providerState}>
{children}
<div>
{Array.from(state.toasts).map(([key, value]) => {
const { isOpen, children } = value;
return (
<Toast key={key} open={isOpen} onClose={() => dispatch({ type: ACTIONS.CLOSE_TOAST, payload: { key } })}>
{children}
</Toast>
)
})}
</div>
</ToastContext.Provider>
)
}
export interface ToastHookOptions {
key: string,
children: ReactNode
}
export function useToast<ToastHookOptions>({ key, children }) {
const { addToast, openToast, closeToast, removeToast } = useContext(ToastContext)
useEffect(() => {
addToast(key, children)
}, [])
return {
openToast: () => openToast(key),
closeToast: () => closeToast(key),
removeToast: () => removeToast(key),
}
}

View file

@ -1,8 +0,0 @@
import { useToast, ToastProvider } from './ToastContext';
import Toast from './Toast';
export {
Toast as default,
useToast,
ToastProvider,
}

View file

@ -1,61 +0,0 @@
export const ACTIONS = {
ADD_TOAST: 'ADD_TOAST',
OPEN_TOAST: 'OPEN_TOAST',
CLOSE_TOAST: 'CLOSE_TOAST',
REMOVE_TOAST: 'REMOVE_TOAST',
}
export const initialState = {
toasts: {}
}
export function reducer(state, { type, payload }) {
const { key, children } = payload;
switch (type) {
case ACTIONS.ADD_TOAST: {
return {
...state,
toasts: {
...state.toasts,
[key]: {
isOpen: false,
children,
},
},
};
}
case ACTIONS.OPEN_TOAST: {
return {
...state,
toasts: {
...state.toasts,
[key]: {
...state.toasts[key],
isOpen: true,
},
},
};
}
case ACTIONS.CLOSE_TOAST: {
return {
...state,
toasts: {
...state.toasts,
[key]: {
...state.toasts[key],
isOpen: false,
},
},
};
}
case ACTIONS.REMOVE_TOAST: {
const newState = { ...state };
delete newState.toasts[key];
return newState;
}
default:
throw Error('Please pick an available action')
}
}

View file

@ -1,4 +0,0 @@
.token {
width: 100%;
height: 100%;
}

View file

@ -1,19 +0,0 @@
// eslint-disable-next-line
import React, { useMemo, useState } from 'react';
import { TokenDTO } from 'services';
import './Token.css';
interface TokenProps {
token: TokenDTO;
}
const Token = ({ token }: TokenProps) => {
const set = Array.isArray(token?.set) ? token?.set[0] : token?.set;
return token && (
<img className="token" src={set?.picURL} alt={token?.name?.value} />
);
}
export default Token;

View file

@ -1,46 +0,0 @@
.tokenDetails {
padding: 10px;
width: calc(400px * .716);
font-size: 10px;
}
.tokenDetails-token {
height: 400px;
margin: 0 auto;
}
.tokenDetails-attribute {
display: flex;
justify-content: space-between;
align-items: baseline;
}
.tokenDetails-attributes {
margin-top: 10px;
}
.tokenDetails-attribute__label {
text-transform: uppercase;
font-size: 10px;
margin-right: 10px;
}
.tokenDetails-attribute__value {
text-align: right;
}
.tokenDetails-text {
font-size: 12px;
margin-top: 10px;
padding: 5px;
background: rgba(0, 0, 0, .15);
white-space: pre-line;
}
.tokenDetails-text__flavor {
font-style: italic;
}
.tokenDetails-text__current:not(:empty) + .tokenDetails-text__flavor {
margin-top: 10px;
}

View file

@ -1,86 +0,0 @@
// eslint-disable-next-line
import React, { useMemo, useState } from 'react';
import { TokenDTO } from 'services';
import Token from '../Token/Token';
import './TokenDetails.css';
interface TokenProps {
token: TokenDTO;
}
const TokenDetails = ({ token }: TokenProps) => {
const props = token?.prop?.value;
return (
<div className='tokenDetails'>
<div className='tokenDetails-token'>
<Token token={token} />
</div>
{
token && (
<div>
<div className='tokenDetails-attributes'>
<div className='tokenDetails-attribute'>
<span className='tokenDetails-attribute__label'>Name:</span>
<span className='tokenDetails-attribute__value'>{token.name?.value}</span>
</div>
{
(!props.pt?.value) ? null : (
<div className='tokenDetails-attribute'>
<span className='tokenDetails-attribute__label'>P/T:</span>
<span className='tokenDetails-attribute__value'>{props.pt.value}</span>
</div>
)
}
{
!props.colors?.value ? null : (
<div className='cardDetails-attribute'>
<span className='cardDetails-attribute__label'>Color(s):</span>
<span className='cardDetails-attribute__value'>{props.colors.value}</span>
</div>
)
}
{
!props.maintype?.value ? null : (
<div className='cardDetails-attribute'>
<span className='cardDetails-attribute__label'>Main Type:</span>
<span className='cardDetails-attribute__value'>{props.maintype.value}</span>
</div>
)
}
{
!props.type?.value ? null : (
<div className='cardDetails-attribute'>
<span className='cardDetails-attribute__label'>Type:</span>
<span className='cardDetails-attribute__value'>{props.type.value}</span>
</div>
)
}
</div>
{
!token.text?.value ? null : (
<div className='tokenDetails-text'>
<div className='tokenDetails-text__current'>
{token.text.value}
</div>
</div>
)
}
</div>
)
}
</div>
);
}
export default TokenDetails;

View file

@ -1,16 +0,0 @@
.user-display,
.user-display__link {
height: 100%;
width: 100%;
}
.user-display__details {
height: 100%;
display: flex;
align-items: center;
}
.user-display__country {
width: 1.1em;
margin-right: 0.4em;
}

View file

@ -1,150 +0,0 @@
// eslint-disable-next-line
import React, { Component } from "react";
import { connect } from 'react-redux';
import { NavLink, generatePath } from 'react-router-dom';
import Menu from '@mui/material/Menu';
import MenuItem from '@mui/material/MenuItem';
import { Images } from 'images/Images';
import { SessionService } from 'api';
import { ServerSelectors } from 'store';
import { RouteEnum, User } from 'types';
import './UserDisplay.css';
class UserDisplay extends Component<UserDisplayProps, UserDisplayState> {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
this.handleClose = this.handleClose.bind(this);
this.navigateToUserProfile = this.navigateToUserProfile.bind(this);
this.addToBuddyList = this.addToBuddyList.bind(this);
this.removeFromBuddyList = this.removeFromBuddyList.bind(this);
this.addToIgnoreList = this.addToIgnoreList.bind(this);
this.removeFromIgnoreList = this.removeFromIgnoreList.bind(this);
this.isABuddy = this.isABuddy.bind(this);
this.isIgnored = this.isIgnored.bind(this);
this.state = {
position: null
};
}
handleClick(event) {
event.preventDefault();
this.setState({
position: {
x: event.clientX + 2,
y: event.clientY + 4,
}
});
}
handleClose() {
this.setState({
position: null
});
}
navigateToUserProfile() {
this.handleClose();
}
addToBuddyList() {
SessionService.addToBuddyList(this.props.user.name);
this.handleClose();
}
removeFromBuddyList() {
SessionService.removeFromBuddyList(this.props.user.name);
this.handleClose();
}
addToIgnoreList() {
SessionService.addToIgnoreList(this.props.user.name);
this.handleClose();
}
removeFromIgnoreList() {
SessionService.removeFromIgnoreList(this.props.user.name);
this.handleClose();
}
isABuddy() {
return this.props.buddyList.filter(user => user.name === this.props.user.name).length;
}
isIgnored() {
return this.props.ignoreList.filter(user => user.name === this.props.user.name).length;
}
render() {
const { user } = this.props;
const { position } = this.state;
const { name, country } = user;
const isABuddy = this.isABuddy();
const isIgnored = this.isIgnored();
// console.log('user', name, !!isABuddy, !!isIgnored);
return (
<div className="user-display">
<NavLink to={generatePath(RouteEnum.PLAYER, { name })} className="plain-link">
<div className="user-display__details" onContextMenu={this.handleClick}>
<img className="user-display__country" src={Images.Countries[country]} alt={country}></img>
<div className="user-display__name single-line-ellipsis">{name}</div>
</div>
</NavLink>
<div className="user-display__menu">
<Menu
open={Boolean(position)}
onClose={this.handleClose}
anchorReference='anchorPosition'
anchorPosition={
position !== null
? { top: position.y, left: position.x }
: undefined
}
>
<NavLink to={generatePath(RouteEnum.PLAYER, { name })} className="user-display__link plain-link">
<MenuItem dense>Chat</MenuItem>
</NavLink>
{
!isABuddy
? (<MenuItem dense onClick={this.addToBuddyList}>Add to Buddy List</MenuItem>)
: (<MenuItem dense onClick={this.removeFromBuddyList}>Remove From Buddy List</MenuItem>)
}
{
!isIgnored
? (<MenuItem dense onClick={this.addToIgnoreList}>Add to Ignore List</MenuItem>)
: (<MenuItem dense onClick={this.removeFromIgnoreList}>Remove From Ignore List</MenuItem>)
}
</Menu>
</div>
</div>
);
}
}
interface UserDisplayProps {
user: User;
buddyList: User[];
ignoreList: User[];
}
interface UserDisplayState {
position: any;
}
const mapStateToProps = (state) => ({
buddyList: ServerSelectors.getBuddyList(state),
ignoreList: ServerSelectors.getIgnoreList(state)
});
export default connect(mapStateToProps)(UserDisplay);

View file

@ -1,3 +0,0 @@
.virtual-list {
height: 100%;
}

View file

@ -1,35 +0,0 @@
// eslint-disable-next-line
import React from "react";
import { FixedSizeList as List } from 'react-window';
import AutoSizer from 'react-virtualized-auto-sizer';
import './VirtualList.css';
const VirtualList = ({ items, itemKey, className = {}, size = 30 }) => (
<div className="virtual-list">
<AutoSizer>
{({ height, width }) => (
<List
className={`virtual-list__list ${className}`}
height={height}
width={width}
itemData={items}
itemCount={items.length}
itemSize={size}
itemKey={itemKey}
>
{Row}
</List>
)}
</AutoSizer>
</div>
);
const Row = ({ data, index, style }) => (
<div style={style}>
{data[index]}
</div>
);
export default VirtualList;

View file

@ -1,19 +0,0 @@
// Common components
export { default as Card } from './Card/Card';
export { default as CardDetails } from './CardDetails/CardDetails';
export { default as CountryDropdown } from './CountryDropdown/CountryDropdown';
export { default as InputField } from './InputField/InputField';
export { default as InputAction } from './InputAction/InputAction';
export { default as KnownHosts } from './KnownHosts/KnownHosts';
export { default as LanguageDropdown } from './LanguageDropdown/LanguageDropdown';
export { default as Message } from './Message/Message';
export { default as VirtualList } from './VirtualList/VirtualList';
export { default as UserDisplay } from './UserDisplay/UserDisplay';
export { default as ThreePaneLayout } from './ThreePaneLayout/ThreePaneLayout';
export { default as CheckboxField } from './CheckboxField/CheckboxField';
export { default as SelectField } from './SelectField/SelectField';
export { default as ScrollToBottomOnChanges } from './ScrollToBottomOnChanges/ScrollToBottomOnChanges';
// Guards
export { default as AuthGuard } from './Guard/AuthGuard';
export { default as ModGuard } from './Guard/ModGuard';

View file

@ -1,53 +0,0 @@
.account {
display: flex;
justify-content: space-between;
height: 100%;
padding: 5px;
}
.account-column {
display: flex;
flex-direction: column;
width: 33%;
}
.account-list {
display: flex;
flex-direction: column;
height: 100%;
padding: 20px;
}
.account-details {
display: flex;
flex-direction: column;
align-items: center;
padding: 20px;
}
.account-details__actions {
display: flex;
align-items: stretch;
justify-content: space-around;
width: 100%;
}
.account-details p {
margin-bottom: 10px;
}
.account-details button {
margin-top: 10px;
font-size: 10px;
}
.account-details > img {
width: 100%;
margin-bottom: 20px;
}
.account-details__lang {
margin-top: 20px;
}

View file

@ -1,120 +0,0 @@
// eslint-disable-next-line
import React, { Component } from "react";
import { useTranslation } from 'react-i18next';
import { connect } from 'react-redux';
import Button from '@mui/material/Button';
import ListItem from '@mui/material/ListItem';
import Paper from '@mui/material/Paper';
import { UserDisplay, VirtualList, AuthGuard, LanguageDropdown } from 'components';
import { AuthenticationService, SessionService } from 'api';
import { ServerSelectors } from 'store';
import { User } from 'types';
import Layout from 'containers/Layout/Layout';
import AddToBuddies from './AddToBuddies';
import AddToIgnore from './AddToIgnore';
import './Account.css';
const Account = (props: AccountProps) => {
const { buddyList, ignoreList, serverName, serverVersion, user } = props;
const { country, realName, name, userLevel, accountageSecs, avatarBmp } = user || {};
let url = URL.createObjectURL(new Blob([avatarBmp], { 'type': 'image/png' }));
const { t } = useTranslation();
const handleAddToBuddies = ({ userName }) => {
SessionService.addToBuddyList(userName);
};
const handleAddToIgnore = ({ userName }) => {
SessionService.addToIgnoreList(userName);
};
return (
<Layout className="account">
<AuthGuard />
<div className="account-column">
<Paper className="account-list">
<div className="">
Buddies Online: ?/{buddyList.length}
</div>
<VirtualList
itemKey={(index, data) => buddyList[index].name }
items={ buddyList.map(user => (
<ListItem button dense>
<UserDisplay user={user} />
</ListItem>
)) }
/>
<div className="" style={{ borderTop: '1px solid' }}>
<AddToBuddies onSubmit={handleAddToBuddies} />
</div>
</Paper>
</div>
<div className="account-column">
<Paper className="account-list overflow-scroll">
<div className="">
Ignored Users Online: ?/{ignoreList.length}
</div>
<VirtualList
itemKey={(index, data) => ignoreList[index].name }
items={ ignoreList.map(user => (
<ListItem button dense>
<UserDisplay user={user} />
</ListItem>
)) }
/>
<div className="" style={{ borderTop: '1px solid' }}>
<AddToIgnore onSubmit={handleAddToIgnore} />
</div>
</Paper>
</div>
<div className="account-column overflow-scroll">
<Paper className="account-details" style={{ margin: '0 0 5px 0' }}>
<img src={url} alt={name} />
<p><strong>{name}</strong></p>
<p>Location: ({country?.toUpperCase()})</p>
<p>User Level: {userLevel}</p>
<p>Account Age: {accountageSecs}</p>
<p>Real Name: {realName}</p>
<div className="account-details__actions">
<Button size="small" color="primary" variant="contained">Edit</Button>
<Button size="small" color="primary" variant="contained">Change<br />Password</Button>
<Button size="small" color="primary" variant="contained">Change<br />Avatar</Button>
</div>
</Paper>
<Paper className="account-details">
<p>Server Name: {serverName}</p>
<p>Server Version: {serverVersion}</p>
<Button color="primary" variant="contained" onClick={() => AuthenticationService.disconnect()}>{ t('Common.disconnect') }</Button>
<div className="account-details__lang">
<LanguageDropdown />
</div>
</Paper>
</div>
</Layout>
)
}
interface AccountProps {
buddyList: User[];
ignoreList: User[];
serverName: string;
serverVersion: string;
user: User;
}
const mapStateToProps = state => ({
buddyList: ServerSelectors.getBuddyList(state),
ignoreList: ServerSelectors.getIgnoreList(state),
serverName: ServerSelectors.getName(state),
serverVersion: ServerSelectors.getVersion(state),
user: ServerSelectors.getUser(state),
});
export default connect(mapStateToProps)(Account);

View file

@ -1,16 +0,0 @@
import React from 'react';
import { Form } from 'react-final-form'
import { InputAction } from 'components';
const AddToBuddies = ({ onSubmit }) => (
<Form onSubmit={values => onSubmit(values)}>
{({ handleSubmit }) => (
<form onSubmit={handleSubmit}>
<InputAction action="Add" label="Add to Buddies" name="userName" />
</form>
)}
</Form>
);
export default AddToBuddies;

View file

@ -1,16 +0,0 @@
import React from 'react';
import { Form } from 'react-final-form'
import { InputAction } from 'components';
const AddToIgnore = ({ onSubmit }) => (
<Form onSubmit={values => onSubmit(values)}>
{({ handleSubmit }) => (
<form onSubmit={handleSubmit}>
<InputAction action="Add" label="Add to Ignore" name="userName" />
</form>
)}
</Form>
);
export default AddToIgnore;

View file

@ -1,10 +0,0 @@
.AppShell,
.AppShell-routes {
height: 100%;
}
.AppShell {
display: flex;
flex-direction: column;
min-width: 768px;
}

View file

@ -1,42 +0,0 @@
import { Component, Suspense } from 'react';
import { Provider } from 'react-redux';
import { MemoryRouter as Router } from 'react-router-dom';
import CssBaseline from '@mui/material/CssBaseline';
import { store } from 'store';
import Routes from './AppShellRoutes';
import FeatureDetection from './FeatureDetection';
import './AppShell.css';
import { ToastProvider } from 'components/Toast'
class AppShell extends Component {
componentDidMount() {
// @TODO (1)
window.onbeforeunload = () => true;
}
handleContextMenu(event) {
event.preventDefault();
}
render() {
return (
<Suspense fallback="loading">
<Provider store={store}>
<CssBaseline />
<ToastProvider>
<div className="AppShell" onContextMenu={this.handleContextMenu}>
<Router>
<FeatureDetection />
<Routes />
</Router>
</div>
</ToastProvider>
</Provider>
</Suspense>
);
}
}
export default AppShell;

View file

@ -1,36 +0,0 @@
import React from 'react';
import { Navigate, Route, Routes } from 'react-router-dom';
import { RouteEnum } from 'types';
import {
Account,
Decks,
Game,
Player,
Room,
Server,
Login,
Logs,
Initialize,
Unsupported
} from 'containers';
const AppShellRoutes = () => (
<div className="AppShell-routes overflow-scroll">
<Routes>
<Route path='*' element={<Initialize />} />
<Route path={RouteEnum.ACCOUNT} element={<Account />} />
<Route path={RouteEnum.DECKS} element={<Decks />} />
<Route path={RouteEnum.GAME} element={<Game />} />
<Route path={RouteEnum.LOGS} element={<Logs />} />
<Route path={RouteEnum.PLAYER} element={<Player />} />
{<Route path={RouteEnum.ROOM} element={<Room />} />}
<Route path={RouteEnum.SERVER} element={<Server />} />
<Route path={RouteEnum.LOGIN} element={<Login />} />
<Route path={RouteEnum.UNSUPPORTED} element={<Unsupported />} />
</Routes>
</div>
);
export default AppShellRoutes;

View file

@ -1,26 +0,0 @@
import { useEffect, useState } from 'react';
import { Navigate } from 'react-router-dom';
import { dexieService } from 'services';
import { RouteEnum } from 'types';
const FeatureDetection = () => {
const [unsupported, setUnsupported] = useState(false);
useEffect(() => {
const features: Promise<any>[] = [
detectIndexedDB(),
];
Promise.all(features).catch((e) => setUnsupported(true));
}, []);
return unsupported
? <Navigate to={RouteEnum.UNSUPPORTED} />
: <></>;
function detectIndexedDB() {
return dexieService.testConnection();
}
};
export default FeatureDetection;

View file

@ -1,20 +0,0 @@
// eslint-disable-next-line
import React, { Component } from "react";
import { AuthGuard } from 'components/index';
import Layout from 'containers/Layout/Layout';
import './Decks.css';
class Decks extends Component {
render() {
return (
<Layout>
<AuthGuard />
<span>"Decks"</span>
</Layout>
)
}
}
export default Decks;

View file

@ -1,20 +0,0 @@
// eslint-disable-next-line
import React, { Component } from "react";
import { AuthGuard } from 'components';
import Layout from 'containers/Layout/Layout';
import './Game.css';
class Game extends Component {
render() {
return (
<Layout>
<AuthGuard />
<span>"Game"</span>
</Layout>
)
}
}
export default Game;

View file

@ -1,88 +0,0 @@
.Initialize {
position: relative;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
}
.Initialize img {
width: 60px;
}
h6.subtitle {
margin: 20px 0 10px;
}
.Initialize-graphics {
position: absolute;
height: 100%;
width: 100%;
overflow: hidden;
}
.Initialize-graphics__square {
position: absolute;
border: 2px solid;
opacity: .05;
}
.Initialize-graphics__bar {
position: absolute;
opacity: .05;
border-radius: 8px;
}
.Initialize-graphics__square.topLeft {
transform: rotate(27deg);
top: 38px;
left: 64px;
height: 134px;
width: 100px;
border-radius: 8px;
}
.Initialize-graphics__square.topRight {
transform: rotate(10deg);
top: 74px;
right: 62px;
height: 50px;
width: 66px;
border-radius: 20px;
}
.Initialize-graphics__square.bottomLeft {
transform: rotate(120deg);
bottom: 61px;
left: 66px;
height: 50px;
width: 66px;
border-radius: 20px;
}
.Initialize-graphics__square.bottomRight {
transform: rotate(-24deg);
bottom: 54px;
right: 0;
height: 88px;
width: 66px;
border-radius: 8px;
}
.Initialize-graphics__bar.bottomBar {
transform: rotate(30deg);
bottom: -4px;
left: -29px;
height: 50px;
width: 222px;
}
.Initialize-graphics__bar.topBar {
transform: rotate(-330deg);
top: 10px;
right: -49px;
height: 50px;
width: 222px;
}

View file

@ -1,6 +0,0 @@
{
"InitializeContainer": {
"title": "DID YOU KNOW",
"subtitle": "<1>Cockatrice is run by volunteers</1><1>that love card games!</1>"
}
}

View file

@ -1,71 +0,0 @@
import { useState } from 'react';
import { styled } from '@mui/material/styles';
import { useTranslation, Trans } from 'react-i18next';
import { connect } from 'react-redux';
import { Navigate } from 'react-router-dom';
import Typography from '@mui/material/Typography';
import { Images } from 'images';
import { ServerSelectors } from 'store';
import { RouteEnum } from 'types';
import Layout from 'containers/Layout/Layout';
import './Initialize.css';
const PREFIX = 'Initialize';
const classes = {
root: `${PREFIX}-root`
};
const Root = styled('div')(({ theme }) => ({
[`&.${classes.root}`]: {
'& .Initialize-graphics': {
color: theme.palette.primary.contrastText,
},
'& .Initialize-graphics__bar': {
backgroundColor: theme.palette.primary.contrastText,
},
}
}));
const Initialize = ({ initialized }: InitializeProps) => {
const { t } = useTranslation();
return initialized
? <Navigate to={RouteEnum.LOGIN} />
: (
<Layout>
<Root className={'Initialize ' + classes.root}>
<div className='Initialize-content'>
<img src={Images.Logo} alt="logo" />
<Typography variant="subtitle1" className='subtitle'>{ t('InitializeContainer.title') }</Typography>
<Trans i18nKey="InitializeContainer.subtitle">
<Typography variant="subtitle2"></Typography>
<Typography variant="subtitle2"></Typography>
</Trans>
</div>
<div className="Initialize-graphics">
<div className="topLeft Initialize-graphics__square" />
<div className="topRight Initialize-graphics__square" />
<div className="bottomRight Initialize-graphics__square" />
<div className="bottomLeft Initialize-graphics__square" />
<div className="topBar Initialize-graphics__bar" />
<div className="bottomBar Initialize-graphics__bar" />
</div>
</Root>
</Layout>
);
}
interface InitializeProps {
initialized: boolean;
}
const mapStateToProps = state => ({
initialized: ServerSelectors.getInitialized(state),
});
export default connect(mapStateToProps)(Initialize);

View file

@ -1,31 +0,0 @@
.layout {
height: 100%;
max-height: 100%;
width: 100%;
max-width: 100%;
display: flex;
flex-flow: row nowrap;
overflow: hidden;
}
.layout--no-height-limit {
height: initial;
max-height: initial;
}
.bottom-bar__container {
background: #555;
height: 50px;
width: 100%;
}
.page__body {
flex: 1;
max-height: calc(100% - 50px);
}
.page {
display: flex;
flex-flow: column;
width: 100%;
}

View file

@ -1,39 +0,0 @@
import LeftNav from './LeftNav';
import './Layout.css'
function Layout(props:LayoutProps) {
const { children, className, showNav = true, noHeightLimit = false } = props;
const containerClasses = ['layout']
if (noHeightLimit === true) {
containerClasses.push('layout--no-height-limit')
}
return (
<div className={containerClasses.join(' ')}>
{showNav && <LeftNav />}
<section className="page">
<div className={`page__body ${className}`}>
{children}
</div>
{showNav && <BottomBar />}
</section>
</div>
)
}
function BottomBar(props) {
return (
<div className="bottom-bar__container">
</div>
)
}
interface LayoutProps {
showNav?: boolean;
children: any;
className?: string;
noHeightLimit?: boolean
}
export default Layout;

View file

@ -1,128 +0,0 @@
.LeftNav__container {
background: #7033DB;
width: 100px;
min-width: 100px;
height: 100%;
}
.LeftNav__logo {
display: flex;
align-items: center;
justify-content: center;
padding: 16px 0;
}
.LeftNav__logo a {
line-height: 1;
}
.LeftNav__logo img {
height: 32px;
}
.LeftNav-content {
color: white;
}
.LeftNav-serverDetails {
font-size: 12px;
}
.LeftNav-server__indicator {
display: inline-block;
height: 12px;
width: 12px;
background: red;
border: 1px solid;
border-radius: 50%;
margin-left: 10px;
}
.LeftNav-nav {
}
.LeftNav-nav__links {
display: flex;
flex-flow: column;
align-items: center;
gap: 16px;
}
.LeftNav-nav__link {
position: relative;
height: 100%;
}
.LeftNav-nav__link:hover {
background: rgba(0, 0, 0, .125);
}
.LeftNav-nav__link:hover .LeftNav-nav__link-menu {
display: block;
}
.LeftNav-nav__link-btn {
display: flex;
height: 100%;
width: 100%;
align-items: center;
padding: 5px 20px;
font-weight: bold;
}
.LeftNav-nav__link-btn__icon {
margin-left: 5px;
}
.LeftNav-nav__link-menu {
display: none;
position: absolute;
bottom: 0;
transform: translateY(100%);
min-width: 150px;
background: #3f51b5;
box-shadow: 1px 1px 2px 0px black;
z-index: 1;
}
.LeftNav-nav__link-menu__item {
padding: 0 !important;
}
.LeftNav-nav__link-menu__btn {
padding: 6px 16px;
width: 100%;
color: white;
display: flex;
justify-content: space-between;
}
.LeftNav-nav__actions {
display: flex;
justify-content: center;
}
.LeftNav-nav__action {
}
.LeftNav-nav__action button {
color: white;
}
.temp-subnav__rooms {
display: flex;
align-items: center;
font-size: 10px;
padding: 5px;
}
.temp-chip {
margin-left: 5px;
text-decoration: none;
}
.temp-chip > div {
cursor: inherit;
}

View file

@ -1,195 +0,0 @@
import React, { useState, useEffect } from 'react';
import { connect } from 'react-redux';
import { NavLink, useNavigate, generatePath } from 'react-router-dom';
import IconButton from '@mui/material/IconButton';
import Menu from '@mui/material/Menu';
import MenuItem from '@mui/material/MenuItem';
import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';
import CloseIcon from '@mui/icons-material/Close';
import MailOutlineRoundedIcon from '@mui/icons-material/MailOutline';
import MenuRoundedIcon from '@mui/icons-material/MenuRounded';
import * as _ from 'lodash';
import { AuthenticationService, RoomsService } from 'api';
import { CardImportDialog } from 'dialogs';
import { Images } from 'images';
import { RoomsSelectors, ServerSelectors } from 'store';
import { Room, RouteEnum, User } from 'types';
import './LeftNav.css';
const LeftNav = ({ joinedRooms, serverState, user }: LeftNavProps) => {
const navigate = useNavigate();
const [state, setState] = useState<LeftNavState>({
anchorEl: null,
showCardImportDialog: false,
options: [],
});
useEffect(() => {
let options: string[] = [
'Account',
'Replays',
];
if (user && AuthenticationService.isModerator(user)) {
options = [
...options,
'Administration',
'Logs'
];
}
setState(s => ({ ...s, options }));
}, [user]);
const handleMenuOpen = (event) => {
setState(s => ({ ...s, anchorEl: event.target }));
}
const handleMenuItemClick = (option: string) => {
const route = RouteEnum[option.toUpperCase()];
navigate(generatePath(route));
}
const handleMenuClose = () => {
setState(s => ({ ...s, anchorEl: null }));
}
const leaveRoom = (event, roomId) => {
event.preventDefault();
RoomsService.leaveRoom(roomId);
};
const openImportCardWizard = () => {
setState(s => ({ ...s, showCardImportDialog: true }));
handleMenuClose();
}
const closeImportCardWizard = () => {
setState(s => ({ ...s, showCardImportDialog: false }));
}
return (
<div className="LeftNav__container">
<div>
<div className="LeftNav__logo">
<NavLink to={RouteEnum.SERVER}>
<img src={Images.Logo} alt="logo" />
</NavLink>
{ AuthenticationService.isConnected(serverState) && (
<span className="LeftNav-server__indicator"></span>
) }
</div>
{ AuthenticationService.isConnected(serverState) && (
<div className="LeftNav-content">
<nav className="LeftNav-nav">
<nav className="LeftNav-nav__links">
<div className="LeftNav-nav__link">
<NavLink
className="LeftNav-nav__link-btn"
to={
joinedRooms.length
? generatePath(RouteEnum.ROOM, { roomId: joinedRooms[0].roomId.toString() })
: RouteEnum.SERVER
}
>
Rooms
<ArrowDropDownIcon className="LeftNav-nav__link-btn__icon" fontSize="small" />
</NavLink>
<div className="LeftNav-nav__link-menu">
{joinedRooms.map(({ name, roomId }) => (
<div className="LeftNav-nav__link-menu__item" key={roomId}>
<NavLink className="LeftNav-nav__link-menu__btn" to={ generatePath(RouteEnum.ROOM, { roomId: roomId.toString() }) }>
{name}
<IconButton size="small" edge="end" onClick={event => leaveRoom(event, roomId)}>
<CloseIcon style={{ fontSize: 10, color: 'white' }} />
</IconButton>
</NavLink>
</div>
))}
</div>
</div>
<div className="LeftNav-nav__link">
<NavLink className="LeftNav-nav__link-btn" to={ RouteEnum.GAME }>
Games
<ArrowDropDownIcon className="LeftNav-nav__link-btn__icon" fontSize="small" />
</NavLink>
</div>
<div className="LeftNav-nav__link">
<NavLink className="LeftNav-nav__link-btn" to={ RouteEnum.DECKS }>
Decks
<ArrowDropDownIcon className="LeftNav-nav__link-btn__icon" fontSize="small" />
</NavLink>
</div>
</nav>
<div className="LeftNav-nav__actions">
<div className="LeftNav-nav__action">
<IconButton size="large">
<MailOutlineRoundedIcon style={{ color: 'inherit' }} />
</IconButton>
</div>
<div className="LeftNav-nav__action">
<IconButton onClick={handleMenuOpen} size="large">
<MenuRoundedIcon style={{ color: 'inherit' }} />
</IconButton>
<Menu
anchorEl={state.anchorEl}
keepMounted
open={!!state.anchorEl}
onClose={() => handleMenuClose()}
PaperProps={{
style: {
marginTop: '32px',
width: '20ch',
},
}}
>
{state.options.map((option) => (
<MenuItem key={option} onClick={(event) => handleMenuItemClick(option)}>
{option}
</MenuItem>
))}
<MenuItem key='Import Cards' onClick={(event) => openImportCardWizard()}>
Import Cards
</MenuItem>
</Menu>
</div>
</div>
</nav>
</div>
) }
</div>
<CardImportDialog
isOpen={state.showCardImportDialog}
handleClose={closeImportCardWizard}
></CardImportDialog>
</div>
);
}
interface LeftNavProps {
serverState: number;
server: string;
user: User;
joinedRooms: Room[];
showNav?: boolean;
}
interface LeftNavState {
anchorEl: Element;
showCardImportDialog: boolean;
options: string[];
}
const mapStateToProps = state => ({
serverState: ServerSelectors.getState(state),
server: ServerSelectors.getName(state),
user: ServerSelectors.getUser(state),
joinedRooms: RoomsSelectors.getJoinedRooms(state),
});
export default connect(mapStateToProps)(LeftNav);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Some files were not shown because too many files have changed in this diff Show more