diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ba8178..9743451 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,9 +10,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - [added various key shortcuts across the entire app (#2)](https://github.com/Timtam/hitster/issues/2) +- [added a how to play section on the welcome page (#11)](https://github.com/Timtam/hitster/issues/11) ### Changed +- [restyled the slot selector UI to look much nicer for sighted folk (#13)](https://github.com/Timtam/hitster/issues/13) - updated Rust to 1.83 - added and fixed some hits diff --git a/client/package-lock.json b/client/package-lock.json index 7dbacc5..d950484 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -13,7 +13,6 @@ "@uidotdev/usehooks": "^2.4.1", "boolify-string": "^2.0.2", "bootstrap": "^5.3.3", - "classnames": "^2.5.1", "deepcopy": "^2.1.0", "detect-browser": "^5.3.0", "howler": "^2.2.4", @@ -41,6 +40,7 @@ "@eslint/compat": "^1.2.4", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.16.0", + "@modyfi/vite-plugin-yaml": "^1.1.0", "@types/boolify-string": "^0.0.32", "@types/howler": "^2.2.11", "@types/react": "^18.2.56", @@ -50,17 +50,20 @@ "@typescript-eslint/eslint-plugin": "^8.18.0", "@typescript-eslint/parser": "^8.18.0", "@vitejs/plugin-react-swc": "^3.5.0", + "cli-glob": "^0.1.0", "eslint": "^9.16.0", "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.5", "globals": "^15.13.0", "prettier": "^3.2.5", "prettier-plugin-organize-imports": "^4.1.0", + "run-script-os": "^1.1.6", "typescript": "^5.2.2", "vite": "^6.0.3", "vite-plugin-checker": "^0.8.0", "vite-plugin-filter-replace": "^0.1.13", - "vite-tsconfig-paths": "^5.1.4" + "vite-tsconfig-paths": "^5.1.4", + "yaml-sort": "^2.1.0" } }, "node_modules/@babel/code-frame": { @@ -732,6 +735,21 @@ "integrity": "sha512-hJXuBH9rlI8m/AznnZe178MxmmqhgZPNQPgvXeJ7HXziJvq0WBYsHGepL2VRuIxZ4J1LrBr+Hc+z4EK+tRQFGA==", "license": "MIT" }, + "node_modules/@modyfi/vite-plugin-yaml": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@modyfi/vite-plugin-yaml/-/vite-plugin-yaml-1.1.0.tgz", + "integrity": "sha512-L26xfzkSo1yamODCAtk/ipVlL6OEw2bcJ92zunyHu8zxi7+meV0zefA9xscRMDCsMY8xL3C3wi3DhMiPxcbxbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "5.1.0", + "js-yaml": "4.1.0", + "tosource": "2.0.0-alpha.3" + }, + "peerDependencies": { + "vite": "^3.2.7 || ^4.0.5 || ^5.0.5" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -858,6 +876,29 @@ "react": ">=16.14.0" } }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.28.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", @@ -1964,6 +2005,36 @@ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "license": "MIT" }, + "node_modules/cli-glob": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cli-glob/-/cli-glob-0.1.0.tgz", + "integrity": "sha512-s+EkSbSO1/Dfg1oT6HBAub/7SeZY/YR0/g3JmoQtRZMFxqjojdzKye39RQqyik9TrbufV5onot4hCnNr1Dz5TA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es6-promise": "^3.0.2", + "glob": "^6.0.1", + "minimist": "^1.2.0" + }, + "bin": { + "glob": "bin/cli-glob" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2099,6 +2170,20 @@ "csstype": "^3.0.2" } }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true, + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.24.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", @@ -2139,6 +2224,16 @@ "@esbuild/win32-x64": "0.24.0" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2345,6 +2440,13 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2510,6 +2612,34 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -2679,6 +2809,25 @@ "node": ">=0.8.19" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -2717,6 +2866,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2896,6 +3055,16 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ml-array-sum": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/ml-array-sum/-/ml-array-sum-1.1.6.tgz", @@ -2970,6 +3139,16 @@ "node": ">=0.10.0" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3043,6 +3222,16 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -3419,6 +3608,16 @@ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "license": "MIT" }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3503,6 +3702,17 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/run-script-os": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/run-script-os/-/run-script-os-1.1.6.tgz", + "integrity": "sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==", + "dev": true, + "license": "MIT", + "bin": { + "run-os": "index.js", + "run-script-os": "index.js" + } + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -3573,6 +3783,21 @@ "node": ">=0.10.0" } }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -3638,6 +3863,15 @@ "node": ">=8.0" } }, + "node_modules/tosource": { + "version": "2.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/tosource/-/tosource-2.0.0-alpha.3.tgz", + "integrity": "sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/ts-api-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", @@ -4075,6 +4309,102 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yaml-sort": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/yaml-sort/-/yaml-sort-2.1.0.tgz", + "integrity": "sha512-iiGmT3MvzfHYY7hepMdx1a2tCG6ltHRF8fSGGE4zwxPLNo2tD0KHjwLRtWThBYT71F5qTWObo6pKdZ9UYHHD5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^4.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "yaml-sort": "yaml-sort.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/client/package.json b/client/package.json index d30ce01..d224790 100644 --- a/client/package.json +++ b/client/package.json @@ -4,6 +4,10 @@ "version": "0.1.0", "type": "module", "scripts": { + "yaml-sort": "run-script-os", + "yaml-sort:win32": "for %f in (src/locale/*.yml) do npx yaml-sort --indent 4 -i \"src/locale/%f\"", + "yaml-sort:default": "for file in src/locale/*.yml; do npx yaml-sort --indent 4 -i \"src/locale/$file\"; done", + "format": "npm run yaml-sort && npx prettier --write .", "dev": "vite", "build": "tsc && vite build", "build-dev": "tsc && vite build --sourcemap true --minify false", @@ -17,7 +21,6 @@ "@uidotdev/usehooks": "^2.4.1", "boolify-string": "^2.0.2", "bootstrap": "^5.3.3", - "classnames": "^2.5.1", "deepcopy": "^2.1.0", "detect-browser": "^5.3.0", "howler": "^2.2.4", @@ -45,6 +48,7 @@ "@eslint/compat": "^1.2.4", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.16.0", + "@modyfi/vite-plugin-yaml": "^1.1.0", "@types/boolify-string": "^0.0.32", "@types/howler": "^2.2.11", "@types/react": "^18.2.56", @@ -54,16 +58,24 @@ "@typescript-eslint/eslint-plugin": "^8.18.0", "@typescript-eslint/parser": "^8.18.0", "@vitejs/plugin-react-swc": "^3.5.0", + "cli-glob": "^0.1.0", "eslint": "^9.16.0", "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.5", "globals": "^15.13.0", "prettier": "^3.2.5", "prettier-plugin-organize-imports": "^4.1.0", + "run-script-os": "^1.1.6", "typescript": "^5.2.2", "vite": "^6.0.3", "vite-plugin-checker": "^0.8.0", "vite-plugin-filter-replace": "^0.1.13", - "vite-tsconfig-paths": "^5.1.4" + "vite-tsconfig-paths": "^5.1.4", + "yaml-sort": "^2.1.0" + }, + "overrides": { + "@modyfi/vite-plugin-yaml": { + "vite": "$vite" + } } } diff --git a/client/src/i18n.ts b/client/src/i18n.ts index 325a42d..7c02c3f 100644 --- a/client/src/i18n.ts +++ b/client/src/i18n.ts @@ -1,8 +1,8 @@ import i18n from "i18next" import LanguageDetector from "i18next-browser-languagedetector" import { initReactI18next } from "react-i18next" -import de from "./locale/de.json" -import en from "./locale/en.json" +import de from "./locale/de.yml" +import en from "./locale/en.yml" i18n.use(LanguageDetector) .use(initReactI18next) @@ -12,7 +12,7 @@ i18n.use(LanguageDetector) escapeValue: false, }, resources: { - en: { ...en }, - de: { ...de }, + en: { translation: { ...en } }, + de: { translation: { ...de } }, }, // Where we're gonna put translations' files }) diff --git a/client/src/locale/de.json b/client/src/locale/de.json deleted file mode 100644 index f0c57f6..0000000 --- a/client/src/locale/de.json +++ /dev/null @@ -1,185 +0,0 @@ -{ - "translation": { - "navigation": "Navigation", - "gameLobby": "Spielelobby", - "loggedInAs": "Angemeldet als {{username}}", - "knownAs": "Du bist derzeit bekannt als {{username}}", - "logout": "Abmelden", - "deleteAccount": "Benutzerkonto löschen", - "notLoggedIn": "Nicht angemeldet", - "login": "Anmelden", - "register": "Registrieren", - "language": "Sprache", - "username": "Benutzername", - "password": "Passwort", - "registrationSuccessful": "Du wurdest erfolgreich registriert und angemeldet.", - "repeatPassword": "Passwort wiederholen", - "createNewGame": "Spiel erstellen", - "gameId": "Spiel ID", - "player_one": "Spieler", - "player_other": "Spieler", - "state": "Status", - "open": "geöffnet", - "running": "läuft", - "noHitAvailable": "Kein Hit verfügbar", - "stopHit": "Hit stoppen", - "playHit": "Hit abspielen", - "playOrStopHit": "Hit abspielen oder stoppen", - "playOrStopHitShortcut": "Alt+Umschalt+H", - "and": "und", - "gameNotStarted": "Das Spiel hat noch nicht begonnen.", - "waitingForPlayerHeading_one": "Du wartest noch auf <0>{{player}}", - "waitingForPlayerHeading_other": "Du wartest noch auf <0>{{player}}", - "youGuessHeading": "Na endlich, jetzt bist du mit Raten dran!", - "otherGuessHeading": "Du rätst jetzt für <0>{{player}}", - "youInterceptHeading": "Du kannst einschreiten und eine andere Vermutung äußern, denk jedoch daran, es wird dich einen Chip kosten", - "otherInterceptHeading": "Du kannst jetzt für <0>{{player}} eine andere Vermutung äußern", - "confirmHeading": "Du musst nun bestätigen, ob <0>{{player}} den Titel und Interpreten korrekt erraten hat. Sei fair!", - "confirmText": "Hat <0>{{player}} den Titel und Interpreten korrekt erraten?", - "no": "Nein", - "noShortcut": "Alt+Umschalt+N", - "yes": "Ja", - "yesShortcut": "Alt+Umschalt+Y", - "guessText": "Wo, glaubst du, gehört dieser Hit hin?", - "waitingText": "Dies sind die Möglichkeiten:", - "dontIntercept": "Keine Vermutung äußern", - "beforeYear": "vor {{year}}", - "afterYear": "nach {{year}}", - "betweenYears": "von {{year1}} bis {{year2}}", - "submitGuess": "Vermutung abschicken", - "submitGuessShortcut": "Alt+Umschalt+Enter", - "selectSlotFirst": "Wähle erst eine Möglichkeit", - "cannotSubmitGuess": "Du kannst derzeit keine Vermutung abgeben", - "game_one": "Spiel", - "gameActions": "Spielaktionen:", - "leaveGame": "Spiel verlassen", - "leaveGameShortcut": "Alt+Umschalt+Q", - "joinGame": "Spiel beitreten", - "joinGameShortcut": "Alt+Umschalt+J", - "stopGame": "Spiel stoppen", - "stopGameShortcut": "Alt+Umschalt+S", - "startGame": "Spiel starten", - "startGameShortcut": "Alt+Umschalt+S", - "name": "Name", - "token_one": "Chip", - "token_other": "Chips", - "hit_one": "Hit", - "hit_other": "Hits", - "startGameNotEnoughPlayers": "Ein Spiel benötigt mindestens zwei Mitspieler", - "creator": "Ersteller", - "close": "Schließen", - "hitsForPlayer": "Hits für {{player}}", - "artist": "Interpret", - "title": "Titel", - "year": "Jahr", - "hitHeading": "Was zum Hit?", - "hitNoGameRunning": "Derzeit läuft kein Spiel, also gibt es auch keinen Hit für dich!", - "hitUnknown": "Der Hit ist derzeit unbekannt, du musst wohl warten, bis er aufgedeckt wird.", - "hitRevealed": "<0>{{player}} hat Recht! Das ist <1>{{title}} von <2>{{artist}} aus dem Jahr <3>{{year}}. Der Hit stammt aus dem <4>{{pack}} Pack. Du kannst dir den Hit jetzt in voller Länge anhören.", - "hitRevealedBelonging": "<0>{{player}} hat Recht! Das ist <1>{{title}} von <2>{{artist}} aus dem Jahr <3>{{year}}. Der Hit ist bekannt aus <4>{{belongs_to}} und stammt aus dem <5>{{pack}} Pack. Du kannst dir den Hit jetzt in voller Länge anhören.", - "otherSkippedHit": "<0>{{player}} hat diesen Hit übersprungen. Das war <1>{{title}} von <2>{{artist}} aus dem Jahr <3>{{year}}. Der Hit stammt aus dem <4>{{pack}} Pack.", - "otherSkippedHitBelonging": "<0>{{player}} hat diesen Hit übersprungen. Das war <1>{{title}} von <2>{{artist}} aus dem Jahr <3>{{year}}. Der Hit ist bekannt aus <4>{{belongs_to}} und stammt aus dem <5>{{pack}} Pack.", - "youSkippedHit": "Du hast diesen Hit übersprungen. Das war <0>{{title}} von <1>{{artist}} aus dem Jahr <2>{{year}}. Der Hit stammt aus dem <3>{{pack}} Pack.", - "youSkippedHitBelonging": "Du hast diesen Hit übersprungen! Das war <0>{{title}} von <1>{{artist}} aus dem Jahr <2>{{year}}. Der Hit ist bekannt aus <3>{{belongs_to}} und stammt aus dem <4>{{pack}} Pack.", - "otherClaimedHit": "<0>{{player}} hat sich einen Hit genommen. Das war <1>{{title}} von <2>{{artist}} aus dem Jahr <3>{{year}}. Der Hit stammt aus dem <4>{{pack}} Pack.", - "otherClaimedHitBelonging": "<0>{{player}} hat sich einen Hit genommen. Das war <1>{{title}} von <2>{{artist}} aus dem Jahr <3>{{year}}. Der Hit ist bekannt aus <4>{{belongs_to}} und stammt aus dem <5>{{pack}} Pack.", - "youClaimedHit": "Du hast dir einen Hit genommen. Das war <0>{{title}} von <1>{{artist}} aus dem Jahr <2>{{year}}. Der Hit stammt aus dem <3>{{pack}} Pack.", - "youClaimedHitBelonging": "Du hast dir einen Hit genommen. Das war <0>{{title}} von <1>{{artist}} aus dem Jahr <2>{{year}}. Der Hit ist bekannt aus <3>{{belongs_to}} und stammt aus dem <4>{{pack}} Pack.", - "skipHit": "Überspringe diesen Hit, indem du einen Chip bezahlst", - "skipHitShortcut": "Alt+Umschalt+I", - "skipHitNotGuessing": "Nur der Zugspieler kann einen Hit überspringen", - "skipHitNoToken": "Du musst einen Chip bezahlen können, um einen Hit zu überspringen", - "cannotSkipHit": "Du kannst derzeit keinen Hit überspringen", - "claimHit": "Nimm dir einen Hit, indem du drei Chips bezahlst", - "claimHitNoToken": "Du musst drei Chips bezahlen können, um dir einen Hit nehmen zu können", - "cannotClaimHit": "Du kannst dir derzeit keinen Hit nehmen", - "noone": "niemand", - "settings": "Einstellungen", - "musicVolume": "Musiklautstärke", - "volume": "Lautstärke", - "gameEnded": "Das Spiel ist vorbei!", - "youWin": "Gratulation, du hast das Spiel gewonnen!", - "otherWins": "{{player}} hat dieses Spiel gewonnen!", - "nooneWins": "Niemand hat dieses Spiel gewonnen.", - "finalScore": "Hier sind die finalen Ergebnisse:", - "cancel": "Abbrechen", - "gameSettings": "Spieleinstellungen", - "gameSettingsShortcut": "Alt+Umschalt+E", - "gameSettingsHitGoal": "Wie viele Hits muss ein Spieler erraten, um das Spiel zu gewinnen?", - "goal": "Ziel", - "gameSettingsStartTokens": "Wie viele Chips bekommt jeder Spieler zu Beginn des Spiels?", - "startTokens": "Start-Chips", - "gameSettingsHitDuration": "Wie viele Sekunden eines Hits werden zu jeder Spielrunde abgespielt?", - "hitDuration": "Abspielzeit der Hits", - "gameSettingsRememberHits": "Sollen Hits zwischen den Spielen gespeichert werden, damit so selten wie möglich doppelte Hits erraten werden müssen?", - "rememberHits": "Hits zwischen Spielen speichern?", - "gameSettingsNotOpen": "Das Spiel muss gestoppt sein, um die Spieleinstellungen zu ändern", - "loading": "Lädt, bitte warten...", - "pack_one": "Pack", - "pack_other": "Packs", - "gameSettingsPacks": "Wähle alle die Packs aus, welche in diesem Spiel genutzt werden sollen:", - "save": "Speichern", - "sfxVolume": "Lautstärke der Sound Effekte", - "publicGame": "Öffentliches Spiel", - "publicGameShortcut": "Alt+Umschalt+U", - "privateGame": "Privates Spiel", - "privateGameShortcut": "Alt+Umschalt+R", - "localGame": "Lokales Spiel", - "localGameShortcut": "Alt+Umschalt+L", - "addPlayer": "Lokalen Spieler hinzufügen", - "addPlayerNotLocalGame": "Du kannst lokale Spieler nur in einem lokalen Spiel hinzufügen", - "addPlayerNotWaiting": "Du kannst lokale Spieler nur hinzufügen, während das Spiel gestoppt ist", - "kick": "Kicken", - "mode": "Modus", - "Public": "öffentlich", - "Private": "privat", - "Local": "lokal", - "welcome": "Willkommen", - "welcomeText": "Willkommen zum inoffiziellen Hitster Online-Kartenspiel! Hier gilt es zu raten, wann ein bestimmter Song veröffentlicht wurde, aber keine Angst, es ist nicht so schwer wie es sich anhört. Aber lies doch einfach weiter.", - "features": "Funktionen", - "packsFeature": "insgesamt {{hits}} Hits in {{packs}} Packs, welche du erraten kannst", - "accessibilityFeature": "entwickelt mit Fokus auf Barrierefreiheit, sodass sehbehinderte und sehende Spieler gemeinsam spielen können", - "colorSchemesFeature": "entscheide dich für ein helles oder dunkles Farbschema, oder passe dich automatisch deinem verwendeten Gerät an", - "publicAndPrivateGamesFeature": "spiele ein öffentliches Spiel mit jedem verfügbaren Spieler, oder ein privates Spiel mit deinen Freunden", - "localGamesFeature": "spiele ein lokales Spiel mit Freunden und Familie, genau wie das Kartenspiel, nur ohne Karten", - "noRegistrationFeature": "keine Registrierung notwendig, einfach ein Spiel erstellen und los geht's", - "cardCorrectionFeature": "das originale Kartenspiel beinhaltet einige kleine Fehler, wir beheben diese sofort", - "howToPlay": "Wie wird gespielt?", - "allRightsReserved": "Alle Rechte vorbehalten", - "sourceCodeAvailableAt": "Quellcode verfügbar auf <0>GitHub", - "version": "Version: {{version}}", - "ownedBy": "Diese inoffizielle Version basiert auf dem originalen Hitster-Kartenspiel, welches <0>Koninklijke Jumbo B.V. gehört.", - "issue": "Für Lob, Kritik oder Fehlermeldungen, eröffnen Sie bitte ein <0>Issue auf GitHub.", - "mainMenu": "Hauptmenü", - "selectAll": "Alles auswählen", - "youJoinedGame": "Du bist dem Spiel beigetreten", - "otherJoinedGame": "{{player}} ist dem Spiel beigetreten", - "youLeftGame": "Du hast das Spiel verlassen", - "otherLeftGame": "{{player}} hat das Spiel verlassen", - "guessNothing": "{{player}} behauptet nichts Gegenteiliges", - "guess": "{{player}} vermutet: {{guess}}", - "youReceivedToken": "Du hast einen Token erhalten, da du Künstler und Titel dieses Hits wusstest", - "otherReceivedToken": "{{player}} hat einen Token erhalten, da der Künstler und Titel dieses Hits genannt wurde", - "changelog": "Änderungsverlauf", - "colorScheme": "Farbschema", - "automatic": "Automatisch", - "light": "Hell", - "dark": "Dunkel", - "keyboardShortcut_one": "Tastenkombination", - "keyboardShortcut_other": "Tastenkombinationen", - "section": "Abschnitt", - "action": "Aktion", - "game": "Spiel", - "confirmYes": "Titel und Interpret des Hits wurde richtig erraten", - "confirmNo": "Titel und Interpret des Hits wurde nicht richtig erraten", - "selectPreviousSlot": "Vorherigen Slot auswählen", - "selectPreviousSlotShortcut": "Alt+Umschalt+Pfeil nach oben", - "selectNextSlot": "Nächsten Slot auswählen", - "selectNextSlotShortcut": "Alt+Umschalt+Pfeil nach unten", - "selectNoSlot": "Keinen Slot auswählen", - "selectNoSlotShortcut": "Alt+Umschalt+Rücktaste", - "playerStatsNotification": "{{player}}: {{hits}} Hits, {{tokens}} Chips", - "speakPlayerInfo": "Sprich wichtige Informationen zu Spieler {{player}}", - "speakPlayerInfoShortcut": "Alt+Umschalt+{{player}}" - } -} diff --git a/client/src/locale/de.yml b/client/src/locale/de.yml new file mode 100644 index 0000000..b81b7ee --- /dev/null +++ b/client/src/locale/de.yml @@ -0,0 +1,275 @@ +Local: lokal +Private: privat +Public: öffentlich +action: Aktion +addPlayer: Lokalen Spieler hinzufügen +addPlayerNotLocalGame: Du kannst lokale Spieler nur in einem lokalen Spiel hinzufügen +addPlayerNotWaiting: Du kannst lokale Spieler nur hinzufügen, während das Spiel gestoppt ist +afterYear: nach {{year}} +allRightsReserved: Alle Rechte vorbehalten +and: und +artist: Interpret +automatic: Automatisch +beforeYear: vor {{year}} +betweenYears: von {{year1}} bis {{year2}} +cancel: Abbrechen +cannotClaimHit: Du kannst dir derzeit keinen Hit nehmen +cannotSkipHit: Du kannst derzeit keinen Hit überspringen +cannotSubmitGuess: Du kannst derzeit keine Vermutung abgeben +changelog: Änderungsverlauf +claimHit: Nimm dir einen Hit, indem du drei Chips bezahlst +claimHitNoToken: Du musst drei Chips bezahlen können, um dir einen Hit nehmen zu können +close: Schließen +colorScheme: Farbschema +confirmHeading: >- + Du musst nun bestätigen, ob <0>{{player}} den Titel und Interpreten + korrekt erraten hat. Sei fair! +confirmNo: Titel und Interpret des Hits wurde nicht richtig erraten +confirmText: Hat <0>{{player}} den Titel und Interpreten korrekt erraten? +confirmYes: Titel und Interpret des Hits wurde richtig erraten +createNewGame: Spiel erstellen +creator: Ersteller +dark: Dunkel +deleteAccount: Benutzerkonto löschen +dontIntercept: Keine Vermutung äußern +features: Funktionen +featuresList: > + <0>keine Registrierung notwendig, einfach ein Spiel erstellen und los + geht's + + <0>spiele ein öffentliches Spiel mit jedem verfügbaren Spieler, oder ein + privates Spiel mit deinen Freunden + + <0>spiele ein lokales Spiel mit Freunden und Familie, genau wie das + Kartenspiel, nur ohne Karten + + <0>insgesamt {{hits}} Hits in {{packs}} Packs, welche du erraten kannst + + <0>das originale Kartenspiel beinhaltet einige kleine Fehler, wir beheben + diese sofort + + <0>entwickelt mit Fokus auf Barrierefreiheit, sodass sehbehinderte und + sehende Spieler gemeinsam spielen können + + <0>entscheide dich für ein helles oder dunkles Farbschema, oder passe dich + automatisch deinem verwendeten Gerät an +finalScore: "Hier sind die finalen Ergebnisse:" +game: Spiel +gameActions: "Spielaktionen:" +gameEnded: Das Spiel ist vorbei! +gameId: Spiel ID +gameLobby: Spielelobby +gameNotStarted: Das Spiel hat noch nicht begonnen. +gameSettings: Spieleinstellungen +gameSettingsHitDuration: Wie viele Sekunden eines Hits werden zu jeder Spielrunde abgespielt? +gameSettingsHitGoal: Wie viele Hits muss ein Spieler erraten, um das Spiel zu gewinnen? +gameSettingsNotOpen: Das Spiel muss gestoppt sein, um die Spieleinstellungen zu ändern +gameSettingsPacks: "Wähle alle die Packs aus, welche in diesem Spiel genutzt werden sollen:" +gameSettingsRememberHits: >- + Sollen Hits zwischen den Spielen gespeichert werden, damit so selten wie + möglich doppelte Hits erraten werden müssen? +gameSettingsShortcut: Alt+Umschalt+E +gameSettingsStartTokens: Wie viele Chips bekommt jeder Spieler zu Beginn des Spiels? +game_one: Spiel +goal: Ziel +guess: "{{player}} vermutet: {{guess}}" +guessNothing: "{{player}} behauptet nichts Gegenteiliges" +guessText: Wo, glaubst du, gehört dieser Hit hin? +hitDuration: Abspielzeit der Hits +hitHeading: Was zum Hit? +hitNoGameRunning: Derzeit läuft kein Spiel, also gibt es auch keinen Hit für dich! +hitRevealed: >- + <0>{{player}} hat Recht! Das ist <1>{{title}} von <2>{{artist}} + aus dem Jahr <3>{{year}}. Der Hit stammt aus dem <4>{{pack}} Pack. + Du kannst dir den Hit jetzt in voller Länge anhören. +hitRevealedBelonging: >- + <0>{{player}} hat Recht! Das ist <1>{{title}} von <2>{{artist}} + aus dem Jahr <3>{{year}}. Der Hit ist bekannt aus <4>{{belongs_to}} + und stammt aus dem <5>{{pack}} Pack. Du kannst dir den Hit jetzt in + voller Länge anhören. +hitUnknown: Der Hit ist derzeit unbekannt, du musst wohl warten, bis er aufgedeckt wird. +hit_one: Hit +hit_other: Hits +hitsForPlayer: Hits für {{player}} +howToPlay: Wie wird gespielt? +issue: >- + Für Lob, Kritik oder Fehlermeldungen, eröffnen Sie bitte ein <0>Issue auf + GitHub. +joinGame: Spiel beitreten +joinGameShortcut: Alt+Umschalt+J +keyboardShortcut_one: Tastenkombination +keyboardShortcut_other: Tastenkombinationen +kick: Kicken +knownAs: Du bist derzeit bekannt als {{username}} +language: Sprache +leaveGame: Spiel verlassen +leaveGameShortcut: Alt+Umschalt+Q +light: Hell +loading: Lädt, bitte warten... +localGame: Lokales Spiel +localGameShortcut: Alt+Umschalt+L +loggedInAs: Angemeldet als {{username}} +login: Anmelden +logout: Abmelden +mainMenu: Hauptmenü +manualAdvanced: > + Hast du dich schon mit den grundlegenden Regeln von Hitster vertraut + gemacht? Perfekt, denn dies ist eine Liste mit erweiterten Funktionen und + Einstellungen, mit welchen du dein Spiel schwieriger oder einfacher machen + kannst. + + +manualAdvancedTitle: Fortgeschritten +manualBasic: > + So wird gespielt: + +
    +
  1. Zu Beginn des Spiels erhält jeder Spieler einen zufällig ausgewählten Hit, der für alle sichtbar ist. Jeder Hit enthält den Namen des Liedes, die Künstler und das Veröffentlichungsjahr. Zu einigen Hits gibt es auch noch zusätzliche Fakten, wie z. B. einen Film oder eine Serie, mit dem oder der das Lied in Verbindung gebracht wird.
  2. +
  3. Jede Runde beginnt damit, dass ein zufälliger Hit gezogen wird, ohne dass jemand die dazugehörigen Informationen sehen kann. Alle Spieler hören den Song 20 Sekunden lang. Bist du der Spieler, der gerade an der Reihe ist, gilt es zu erraten, ob der gerade gespielte Song vor oder nach deinem ersten Hit veröffentlicht wurde. Liegst du mit deiner Vermutung des Veröffentlichungsjahres richtig, wird dieser Hit am Ende der Runde zu deiner Sammlung hinzugefügt, nachdem dessen Details aufgedeckt wurden. Die Hits in deiner Sammlung sind, wie auf einer Zeitleiste, die aus den Veröffentlichungsjahren der Songs besteht, immer in chronologischer Reihenfolge angeordnet. Je mehr Songs du sammelst, desto kürzer werden die Abstände zwischen den einzelnen Hits, was bedeutet, dass du bei jedem weiteren Rateversuch präziser sein musst als beim letzten Mal.
  4. +
  5. Wenn du an der Reihe bist, kannst du dir einen Chip verdienen, wenn du zwei zusätzliche Fakten zum gerade gespielten Song nennst. Das können zum Beispiel der Titel, die Künstler, eine Serie, ein Film oder etwas anderes sein, wodurch der Song bekannt ist. Du verdienst dir einen Chip, wenn du zwei richtige Fakten genannt hast. Der Mitspieler, der nach dir an der Reihe ist, überprüft die Richtigkeit dieser Details und gibt dir einen Chip, falls beide richtig sind, oder eben nicht, wenn mindestens einer der beiden falsch ist. Die Chips können in den folgenden Runden benutzt werden, um bei Rateversuchen von anderen Spielern eine gegenteilige Meinung zu äußern oder Songs zu überspringen, die du nicht kennst.
  6. +
  7. Nachdem du deine Vermutung zum Erscheinungsjahr abgegeben hast, können deine Mitspieler dir entweder zustimmen oder, wenn ein Mitspieler anderer Meinung ist, einen Chip benutzen, um eine andere Vermutung abzugeben. Sei dabei aber schnell, denn der erste Spieler, der seine Vermutung richtig abgibt, gewinnt den Hit.
  8. +
  9. Am Ende jeder Runde wird das Geheimnis um den Song gelüftet. Der Spieler, der richtig geraten hat, fügt den Hit zu seiner Zeitleiste hinzu. Der aktuelle Spieler hat dabei immer Vorrang. Kleines Beispiel: Du bist an der Reihe und vermutest, dass der Hit vor 1988 veröffentlicht wurde, ein Mitspieler denkt eher, dass er nach 1988 veröffentlicht wurde. Bei der Auflösung stellt sich heraus, dass der Hit genau 1988 veröffentlicht wurde. Weil du an der Reihe bist, gewinnst du den Hit.
  10. +
  11. Wer zuerst 10 Hits gesammelt hat, gewinnt das Spiel.
  12. +
+ + Wenn dir das Spiel gefällt und du schon weißt, wie es funktioniert, dann + schau dir doch einfach die erweiterten Funktionen an, indem du die + Registerkarten wechselst. +manualBasicTitle: Einfach +mode: Modus +musicVolume: Musiklautstärke +name: Name +navigation: Navigation +"no": Nein +noHitAvailable: Kein Hit verfügbar +noShortcut: Alt+Umschalt+N +noone: niemand +nooneWins: Niemand hat dieses Spiel gewonnen. +notLoggedIn: Nicht angemeldet +open: geöffnet +otherClaimedHit: >- + <0>{{player}} hat sich einen Hit genommen. Das war <1>{{title}} von + <2>{{artist}} aus dem Jahr <3>{{year}}. Der Hit stammt aus dem + <4>{{pack}} Pack. +otherClaimedHitBelonging: >- + <0>{{player}} hat sich einen Hit genommen. Das war <1>{{title}} von + <2>{{artist}} aus dem Jahr <3>{{year}}. Der Hit ist bekannt aus + <4>{{belongs_to}} und stammt aus dem <5>{{pack}} Pack. +otherGuessHeading: Du rätst jetzt für <0>{{player}} +otherInterceptHeading: Du kannst jetzt für <0>{{player}} eine andere Vermutung äußern +otherJoinedGame: "{{player}} ist dem Spiel beigetreten" +otherLeftGame: "{{player}} hat das Spiel verlassen" +otherReceivedToken: >- + {{player}} hat einen Token erhalten, da der Künstler und Titel dieses Hits + genannt wurde +otherSkippedHit: >- + <0>{{player}} hat diesen Hit übersprungen. Das war <1>{{title}} von + <2>{{artist}} aus dem Jahr <3>{{year}}. Der Hit stammt aus dem + <4>{{pack}} Pack. +otherSkippedHitBelonging: >- + <0>{{player}} hat diesen Hit übersprungen. Das war <1>{{title}} von + <2>{{artist}} aus dem Jahr <3>{{year}}. Der Hit ist bekannt aus + <4>{{belongs_to}} und stammt aus dem <5>{{pack}} Pack. +otherWins: "{{player}} hat dieses Spiel gewonnen!" +ownedBy: >- + Diese inoffizielle Version basiert auf dem originalen Hitster-Kartenspiel, + welches <0>Koninklijke Jumbo B.V. gehört. +pack_one: Pack +pack_other: Packs +password: Passwort +playHit: Hit abspielen +playOrStopHit: Hit abspielen oder stoppen +playOrStopHitShortcut: Alt+Umschalt+H +playerStatsNotification: "{{player}}: {{hits}} Hits, {{tokens}} Chips" +player_one: Spieler +player_other: Spieler +privateGame: Privates Spiel +privateGameShortcut: Alt+Umschalt+R +publicGame: Öffentliches Spiel +publicGameShortcut: Alt+Umschalt+U +register: Registrieren +registrationSuccessful: Du wurdest erfolgreich registriert und angemeldet. +rememberHits: Hits zwischen Spielen speichern? +repeatPassword: Passwort wiederholen +running: läuft +save: Speichern +section: Abschnitt +selectAll: Alles auswählen +selectNextSlot: Nächsten Slot auswählen +selectNextSlotShortcut: Alt+Umschalt+Pfeil nach unten +selectNoSlot: Keinen Slot auswählen +selectNoSlotShortcut: Alt+Umschalt+Rücktaste +selectPreviousSlot: Vorherigen Slot auswählen +selectPreviousSlotShortcut: Alt+Umschalt+Pfeil nach oben +selectSlotFirst: Wähle erst eine Möglichkeit +settings: Einstellungen +sfxVolume: Lautstärke der Sound Effekte +skipHit: Überspringe diesen Hit, indem du einen Chip bezahlst +skipHitNoToken: Du musst einen Chip bezahlen können, um einen Hit zu überspringen +skipHitNotGuessing: Nur der Zugspieler kann einen Hit überspringen +skipHitShortcut: Alt+Umschalt+I +sourceCodeAvailableAt: Quellcode verfügbar auf <0>GitHub +speakPlayerInfo: Sprich wichtige Informationen zu Spieler {{player}} +speakPlayerInfoShortcut: Alt+Umschalt+{{player}} +startGame: Spiel starten +startGameNotEnoughPlayers: Ein Spiel benötigt mindestens zwei Mitspieler +startGameShortcut: Alt+Umschalt+S +startTokens: Start-Chips +state: Status +stopGame: Spiel stoppen +stopGameShortcut: Alt+Umschalt+S +stopHit: Hit stoppen +submitGuess: Vermutung abschicken +submitGuessShortcut: Alt+Umschalt+Enter +title: Titel +token_one: Chip +token_other: Chips +username: Benutzername +version: "Version: {{version}}" +volume: Lautstärke +waitingForPlayerHeading_one: Du wartest noch auf <0>{{player}} +waitingForPlayerHeading_other: Du wartest noch auf <0>{{player}} +waitingText: "Dies sind die Möglichkeiten:" +welcome: Willkommen +welcomeText: >- + Willkommen zum inoffiziellen Hitster Online-Kartenspiel! Hier gilt es zu + raten, wann ein bestimmter Song veröffentlicht wurde, aber keine Angst, es + ist nicht so schwer wie es sich anhört. Aber lies doch einfach weiter. +year: Jahr +"yes": Ja +yesShortcut: Alt+Umschalt+Y +youClaimedHit: >- + Du hast dir einen Hit genommen. Das war <0>{{title}} von + <1>{{artist}} aus dem Jahr <2>{{year}}. Der Hit stammt aus dem + <3>{{pack}} Pack. +youClaimedHitBelonging: >- + Du hast dir einen Hit genommen. Das war <0>{{title}} von + <1>{{artist}} aus dem Jahr <2>{{year}}. Der Hit ist bekannt aus + <3>{{belongs_to}} und stammt aus dem <4>{{pack}} Pack. +youGuessHeading: Na endlich, jetzt bist du mit Raten dran! +youInterceptHeading: >- + Du kannst einschreiten und eine andere Vermutung äußern, denk jedoch daran, + es wird dich einen Chip kosten +youJoinedGame: Du bist dem Spiel beigetreten +youLeftGame: Du hast das Spiel verlassen +youReceivedToken: Du hast einen Token erhalten, da du Künstler und Titel dieses Hits wusstest +youSkippedHit: >- + Du hast diesen Hit übersprungen. Das war <0>{{title}} von + <1>{{artist}} aus dem Jahr <2>{{year}}. Der Hit stammt aus dem + <3>{{pack}} Pack. +youSkippedHitBelonging: >- + Du hast diesen Hit übersprungen! Das war <0>{{title}} von + <1>{{artist}} aus dem Jahr <2>{{year}}. Der Hit ist bekannt aus + <3>{{belongs_to}} und stammt aus dem <4>{{pack}} Pack. +youWin: Gratulation, du hast das Spiel gewonnen! diff --git a/client/src/locale/en.json b/client/src/locale/en.json deleted file mode 100644 index fb18764..0000000 --- a/client/src/locale/en.json +++ /dev/null @@ -1,185 +0,0 @@ -{ - "translation": { - "navigation": "Navigation", - "gameLobby": "Game Lobby", - "loggedInAs": "Logged in as {{username}}", - "knownAs": "You are currently known as {{username}}", - "logout": "Logout", - "deleteAccount": "Delete account", - "notLoggedIn": "Not logged in", - "login": "Login", - "register": "Register", - "language": "Language", - "username": "Username", - "password": "Password", - "registrationSuccessful": "You've been registered and logged in successfully.", - "repeatPassword": "Repeat password", - "createNewGame": "Create new game", - "gameId": "Game ID", - "player_one": "Player", - "player_other": "Players", - "state": "State", - "open": "Open", - "running": "Running", - "noHitAvailable": "No hit available", - "stopHit": "Stop hit", - "playHit": "Play hit", - "playOrStopHit": "Play or stop hit", - "playOrStopHitShortcut": "Alt+Shift+H", - "and": "and", - "gameNotStarted": "The game hasn't started yet.", - "waitingForPlayerHeading_one": "You are waiting for <0>{{player}} to make their move", - "waitingForPlayerHeading_other": "You are waiting for <0>{{player}} to make their move", - "youGuessHeading": "Finally, its your turn to guess!", - "otherGuessHeading": "You're now guessing for <0>{{player}}", - "youInterceptHeading": "You can now step in and make another guess, but be aware, it'll cost you one token!", - "otherInterceptHeading": "You can now make another guess for <0>{{player}}", - "confirmHeading": "You now need to confirm if <0>{{player}} guessed title and artist of the song correctly. Be fair!", - "confirmText": "Did <0>{{player}} guess artist and title correctly?", - "no": "No", - "noShortcut": "Alt+Shift+N", - "yes": "Yes", - "yesShortcut": "Alt+Shift+Y", - "guessText": "Where do you think this hit belongs?", - "waitingText": "These are the possible slots:", - "dontIntercept": "Don't intercept", - "beforeYear": "before {{year}}", - "afterYear": "after {{year}}", - "betweenYears": "between {{year1}} and {{year2}}", - "submitGuess": "Submit guess", - "submitGuessShortcut": "Alt+Shift+Return", - "selectSlotFirst": "Select a slot first", - "cannotSubmitGuess": "You cannot submit a guess right now", - "game_one": "Game", - "gameActions": "Game actions:", - "leaveGame": "Leave game", - "leaveGameShortcut": "Alt+Shift+Q", - "joinGame": "Join game", - "joinGameShortcut": "Alt+Shift+J", - "stopGame": "Stop game", - "stopGameShortcut": "Alt+Shift+S", - "startGame": "Start game", - "startGameShortcut": "Alt+Shift+S", - "name": "Name", - "token_one": "Token", - "token_other": "Tokens", - "hit_one": "Hit", - "hit_other": "Hits", - "startGameNotEnoughPlayers": "At least two players must be part of a game", - "creator": "creator", - "close": "Close", - "hitsForPlayer": "Hits for {{player}}", - "artist": "Artist", - "title": "Title", - "year": "Year", - "hitHeading": "What the hit?", - "hitNoGameRunning": "No game is currently running, so no hit for you!", - "hitUnknown": "The hit is currently unknown, you'll have to wait for it to be revealed.", - "hitRevealed": "<0>{{player}} is right! This is <1>{{title}} by <2>{{artist}} from <3>{{year}}. This song belongs to the <4>{{pack}} pack. You can now play it at full length.", - "hitRevealedBelonging": "<0>{{player}} is right! This is <1>{{title}} by <2>{{artist}} from <3>{{year}}. You might know this song from <4>{{belongs_to}} and it belongs to the <4>{{pack}} pack. You can now play it at full length.", - "otherSkippedHit": "<0>{{player}} skipped this hit! This was <1>{{title}} by <2>{{artist}} from <3>{{year}}. This song belongs to the <4>{{pack}} pack.", - "otherSkippedHitBelonging": "<0>{{player}} skipped this hit! This was <1>{{title}} by <2>{{artist}} from <3>{{year}}. You might know this song from <4>{{belongs_to}} and it belongs to the <4>{{pack}} pack.", - "youSkippedHit": "You skipped this hit. This was <0>{{title}} by <1>{{artist}} from <2>{{year}}. This song belongs to the <3>{{pack}} pack.", - "youSkippedHitBelonging": "You skipped this hit. This was <0>{{title}} by <1>{{artist}} from <2>{{year}}. You might know this song from <3>{{belongs_to}} and it belongs to the <3>{{pack}} pack.", - "otherClaimedHit": "<0>{{player}} claimed a hit. This was <1>{{title}} by <2>{{artist}} from <3>{{year}}. This song belongs to the <4>{{pack}} pack.", - "otherClaimedHitBelonging": "<0>{{player}} claimed a hit. This was <1>{{title}} by <2>{{artist}} from <3>{{year}}. You might know this song from <4>{{belongs_to}} and it belongs to the <4>{{pack}} pack.", - "youClaimedHit": "You claimed a hit. This was <0>{{title}} by <1>{{artist}} from <2>{{year}}. This song belongs to the <3>{{pack}} pack.", - "youClaimedHitBelonging": "You claimed a hit. This was <0>{{title}} by <1>{{artist}} from <2>{{year}}. You might know this song from <3>{{belongs_to}} and it belongs to the <3>{{pack}} pack.", - "skipHit": "Skip this hit by paying one token", - "skipHitShortcut": "Alt+Shift+I", - "skipHitNotGuessing": "Only the guessing player can skip a hit", - "skipHitNoToken": "You need to pay a token to skip a hit", - "cannotSkipHit": "You cannot skip a hit right now", - "claimHit": "Claim a hit by paying 3 tokens", - "claimHitNoToken": "You need to pay 3 tokens to claim a hit", - "cannotClaimHit": "You cannot claim a hit right now", - "noone": "noone", - "settings": "Settings", - "musicVolume": "Music volume", - "volume": "Volume", - "gameEnded": "The game ended!", - "youWin": "Congratulations, you are the winner!", - "otherWins": "{{player}} is the winner of this game!", - "nooneWins": "Noone won this game.", - "finalScore": "And here are the final results:", - "cancel": "Cancel", - "gameSettings": "Game settings", - "gameSettingsShortcut": "Alt+Shift+E", - "gameSettingsHitGoal": "How many hits do the players need to guess correctly in order to win?", - "goal": "Goal", - "gameSettingsStartTokens": "How many tokens should every player get when starting a game?", - "startTokens": "Start tokens", - "gameSettingsHitDuration": "How many seconds of a hit will every player hear when guessing?", - "hitDuration": "Hit duration", - "gameSettingsRememberHits": "Should hits be remembered across games to prevent duplicates for as long as possible?", - "rememberHits": "Remember hits across games?", - "gameSettingsNotOpen": "The game needs to be stopped to change its settings", - "loading": "Loading...", - "pack_one": "Pack", - "pack_other": "Packs", - "gameSettingsPacks": "Check all the packs you want to use in this game:", - "save": "Save", - "sfxVolume": "SFX Volume", - "publicGame": "Public game", - "publicGameShortcut": "Alt+Shift+U", - "privateGame": "Private game", - "privateGameShortcut": "Alt+Shift+R", - "localGame": "Local game", - "localGameShortcut": "Alt+Shift+L", - "addPlayer": "Add local player", - "addPlayerNotLocalGame": "You can only add local players in a local game", - "addPlayerNotWaiting": "You can only add local players while the game is stopped", - "kick": "Kick", - "mode": "Mode", - "Public": "public", - "Private": "private", - "Local": "local", - "welcome": "Welcome", - "welcomeText": "Welcome to the unofficial Hitster online card game! Here you will try to guess when a certain song was released, but don't worry, its not as hard as it sounds. Read on to find out what its all about.", - "features": "Features", - "packsFeature": "a total of {{hits}} hits in {{packs}} packs available for you to guess", - "accessibilityFeature": "developed with screen reader accessibility in mind, so that sighted and visually impaired people can play together", - "colorSchemesFeature": "support light and dark mode, and respect your device's settings by default", - "publicAndPrivateGamesFeature": "play a public game to play with everyone who's currently available, or play a private game for just you and your friends", - "localGamesFeature": "play a local game with friends and family, just like the card game, but you don't need to have the cards around", - "noRegistrationFeature": "no registration necessary, just create a game and play", - "cardCorrectionFeature": "the original card game contains some tiny mistakes on the cards, but we fix them immediately", - "howToPlay": "How to play the game", - "allRightsReserved": "All rights reserved", - "sourceCodeAvailableAt": "Source Code available at <0>GitHub", - "version": "Version: {{version}}", - "ownedBy": "This unofficial version is based on the original Hitster card game which is owned by <0>Koninklijke Jumbo B.V..", - "issue": "For bug reports and general feedback please open a <0>GitHub issue.", - "mainMenu": "Main menu", - "selectAll": "Select all", - "youJoinedGame": "You joined the game", - "otherJoinedGame": "{{player}} joined the game", - "youLeftGame": "You left the game", - "otherLeftGame": "{{player}} left the game", - "guessNothing": "{{player}} doesn't intercept", - "guess": "{{player}} guesses: {{guess}}", - "youReceivedToken": "You received a token for guessing artist and title of this hit correctly", - "otherReceivedToken": "{{player}} received a token for guessing artist and title of this hit correctly", - "changelog": "Changelog", - "colorScheme": "Color scheme", - "automatic": "Automatic", - "light": "Light", - "dark": "Dark", - "keyboardShortcut_one": "Keyboard shortcut", - "keyboardShortcut_other": "Keyboard shortcuts", - "section": "Abschnitt", - "action": "Aktion", - "game": "Game", - "confirmYes": "title and artist of the hit was guessed correctly", - "confirmNo": "title and artist of the hit was guessed incorrectly", - "selectPreviousSlot": "Select previous slot", - "selectPreviousSlotShortcut": "Alt+Shift+Up arrow", - "selectNextSlot": "Select next slot", - "selectNextSlotShortcut": "Alt+Shift+Down arrow", - "selectNoSlot": "Select no slot", - "selectNoSlotShortcut": "Alt+Shift+Backspace", - "playerStatsNotification": "{{player}}: {{hits}} hits, {{tokens}} tokens", - "speakPlayerInfo": "Speak important information about player {{player}}", - "speakPlayerInfoShortcut": "Alt+Shift+{{player}}" - } -} diff --git a/client/src/locale/en.yml b/client/src/locale/en.yml new file mode 100644 index 0000000..d422663 --- /dev/null +++ b/client/src/locale/en.yml @@ -0,0 +1,270 @@ +Local: local +Private: private +Public: public +action: Aktion +addPlayer: Add local player +addPlayerNotLocalGame: You can only add local players in a local game +addPlayerNotWaiting: You can only add local players while the game is stopped +afterYear: after {{year}} +allRightsReserved: All rights reserved +and: and +artist: Artist +automatic: Automatic +beforeYear: before {{year}} +betweenYears: between {{year1}} and {{year2}} +cancel: Cancel +cannotClaimHit: You cannot claim a hit right now +cannotSkipHit: You cannot skip a hit right now +cannotSubmitGuess: You cannot submit a guess right now +changelog: Changelog +claimHit: Claim a hit by paying 3 tokens +claimHitNoToken: You need to pay 3 tokens to claim a hit +close: Close +colorScheme: Color scheme +confirmHeading: >- + You now need to confirm if <0>{{player}} guessed title and artist of the + song correctly. Be fair! +confirmNo: title and artist of the hit was guessed incorrectly +confirmText: Did <0>{{player}} guess artist and title correctly? +confirmYes: title and artist of the hit was guessed correctly +createNewGame: Create new game +creator: creator +dark: Dark +deleteAccount: Delete account +dontIntercept: Don't intercept +features: Features +featuresList: > + <0>no registration necessary, just create a game and play + + <0>play a public game to play with everyone who's currently available, or + play a private game for just you and your friends + + <0>play a local game with friends and family, just like the card game, but + you don't need to have the cards around + + <0>a total of {{hits}} hits in {{packs}} packs available for you to + guess + + <0>the original card game contains some tiny mistakes on the cards, but we + fix them immediately + + <0>developed with screen reader accessibility in mind, so that sighted and + visually impaired people can play together + + <0>support light and dark mode, and respect your device's settings by + default +finalScore: "And here are the final results:" +game: Game +gameActions: "Game actions:" +gameEnded: The game ended! +gameId: Game ID +gameLobby: Game Lobby +gameNotStarted: The game hasn't started yet. +gameSettings: Game settings +gameSettingsHitDuration: How many seconds of a hit will every player hear when guessing? +gameSettingsHitGoal: How many hits do the players need to guess correctly in order to win? +gameSettingsNotOpen: The game needs to be stopped to change its settings +gameSettingsPacks: "Check all the packs you want to use in this game:" +gameSettingsRememberHits: >- + Should hits be remembered across games to prevent duplicates for as long as + possible? +gameSettingsShortcut: Alt+Shift+E +gameSettingsStartTokens: How many tokens should every player get when starting a game? +game_one: Game +goal: Goal +guess: "{{player}} guesses: {{guess}}" +guessNothing: "{{player}} doesn't intercept" +guessText: Where do you think this hit belongs? +hitDuration: Hit duration +hitHeading: What's the hit? +hitNoGameRunning: No game running, no hit for you! +hitRevealed: >- + <0>{{player}} is right! This is <1>{{title}} by <2>{{artist}} + from <3>{{year}}. This song belongs to the <4>{{pack}} pack. You can + now play it at full length. +hitRevealedBelonging: >- + <0>{{player}} is right! This is <1>{{title}} by <2>{{artist}} + from <3>{{year}}. You might know this song from <4>{{belongs_to}} + and it belongs to the <4>{{pack}} pack. You can now play it at full + length. +hitUnknown: The hit is currently unknown, you'll have to wait for it to be revealed. +hit_one: Hit +hit_other: Hits +hitsForPlayer: Hits for {{player}} +howToPlay: How to play the game +issue: For bug reports and general feedback please open a <0>GitHub issue. +joinGame: Join game +joinGameShortcut: Alt+Shift+J +keyboardShortcut_one: Keyboard shortcut +keyboardShortcut_other: Keyboard shortcuts +kick: Kick +knownAs: You are currently known as {{username}} +language: Language +leaveGame: Leave game +leaveGameShortcut: Alt+Shift+Q +light: Light +loading: Loading... +localGame: Local game +localGameShortcut: Alt+Shift+L +loggedInAs: Logged in as {{username}} +login: Login +logout: Logout +mainMenu: Main menu +manualAdvanced: > + Are you familiar with the basic rules of Hitster yet? Great, because this is + a list of advanced features and settings you can configure to make your game + more difficult, or easier, just as you like. + + +manualAdvancedTitle: Advanced +manualBasic: > + This is how you play the game: + +
    +
  1. You start the game with one randomly dealt hit card, visible to all players. Each hit card displays the name of a song, the artist and the year it was released. Some hit cards also include additional information, like a film or series the song is associated with.
  2. +
  3. Each round begins with the computer drawing a random hit card, nobody sees what's on it. Everyone listens to the song on the hidden hit card for 20 seconds. During your turn, you have to guess whether this mystery hit that's playing was released before or after the song on the first card you've been dealt. If you're correct about when the song was released, the hit you've identified will get added to your collection at the end of the round when its details are revealed. Your collection is always arranged in chronological order like a timeline of when hits were released, so as your collection grows, the time periods between the hits in your collection get narrower, meaning each subsequent guess you make will need to be more specific than the last.
  4. +
  5. During your turn, you can win a token by calling out two additional facts about the hit that's playing. Typical examples are the song title, artist, a series, film or anything else that the song is known for. Any combination of facts can win a token, so long as there are two facts you've called out and they're both true. The player that comes after you confirms the accuracy of any additional facts you've offered, awarding your token if both were correct, or denying your token if either fact can't be verified. In future rounds, tokens can be spent on intercepting other players, or skipping hits that you don't recognize.
  6. +
  7. After you've entered your guess at when the hidden hit was released, the other players will either agree with you, or if any other player has a different opinion, they can pay one token to intercept. Be quick with your interceptions, the first player to correctly identify when the hidden hit was released wins that card.
  8. +
  9. Each round ends with the hidden hit being revealed. The player who guessed correctly gets to add the hit to their timeline, with the turn player taking precedence. For example, imagine it's your turn and you guess that the hidden hit was released before 1988. Another player intercepts and guesses it was released after 1988. When the hit is revealed, it turns out it was actually released in exactly 1988. It was your turn, so you would win that card.
  10. +
  11. The first player to collect 10 hit cards wins the game.
  12. +
+ + + If you enjoy the game and already know how it works, feel free to check out + the advanced features by switching tabs. +manualBasicTitle: Basic +mode: Mode +musicVolume: Music volume +name: Name +navigation: Navigation +"no": "No" +noHitAvailable: No hit available +noShortcut: Alt+Shift+N +noone: noone +nooneWins: Noone won this game. +notLoggedIn: Not logged in +open: Open +otherClaimedHit: >- + <0>{{player}} claimed a hit. This was <1>{{title}} by + <2>{{artist}} from <3>{{year}}. This song belongs to the + <4>{{pack}} pack. +otherClaimedHitBelonging: >- + <0>{{player}} claimed a hit. This was <1>{{title}} by + <2>{{artist}} from <3>{{year}}. You might know this song from + <4>{{belongs_to}} and it belongs to the <4>{{pack}} pack. +otherGuessHeading: You're now guessing for <0>{{player}} +otherInterceptHeading: You can now make another guess for <0>{{player}} +otherJoinedGame: "{{player}} joined the game" +otherLeftGame: "{{player}} left the game" +otherReceivedToken: >- + {{player}} received a token for guessing artist and title of this hit + correctly +otherSkippedHit: >- + <0>{{player}} skipped this hit! This was <1>{{title}} by + <2>{{artist}} from <3>{{year}}. This song belongs to the + <4>{{pack}} pack. +otherSkippedHitBelonging: >- + <0>{{player}} skipped this hit! This was <1>{{title}} by + <2>{{artist}} from <3>{{year}}. You might know this song from + <4>{{belongs_to}} and it belongs to the <4>{{pack}} pack. +otherWins: "{{player}} is the winner of this game!" +ownedBy: >- + This unofficial version is based on the original Hitster card game which is + owned by <0>Koninklijke Jumbo B.V.. +pack_one: Pack +pack_other: Packs +password: Password +playHit: Play hit +playOrStopHit: Play or stop hit +playOrStopHitShortcut: Alt+Shift+H +playerStatsNotification: "{{player}}: {{hits}} hits, {{tokens}} tokens" +player_one: Player +player_other: Players +privateGame: Private game +privateGameShortcut: Alt+Shift+R +publicGame: Public game +publicGameShortcut: Alt+Shift+U +register: Register +registrationSuccessful: You've been registered and logged in successfully. +rememberHits: Remember hits across games? +repeatPassword: Repeat password +running: Running +save: Save +section: Abschnitt +selectAll: Select all +selectNextSlot: Select next slot +selectNextSlotShortcut: Alt+Shift+Down arrow +selectNoSlot: Select no slot +selectNoSlotShortcut: Alt+Shift+Backspace +selectPreviousSlot: Select previous slot +selectPreviousSlotShortcut: Alt+Shift+Up arrow +selectSlotFirst: Select a slot first +settings: Settings +sfxVolume: SFX Volume +skipHit: Skip this hit by paying one token +skipHitNoToken: You need to pay a token to skip a hit +skipHitNotGuessing: Only the guessing player can skip a hit +skipHitShortcut: Alt+Shift+I +sourceCodeAvailableAt: Source Code available at <0>GitHub +speakPlayerInfo: Speak important information about player {{player}} +speakPlayerInfoShortcut: Alt+Shift+{{player}} +startGame: Start game +startGameNotEnoughPlayers: At least two players must be part of a game +startGameShortcut: Alt+Shift+S +startTokens: Start tokens +state: State +stopGame: Stop game +stopGameShortcut: Alt+Shift+S +stopHit: Stop hit +submitGuess: Submit guess +submitGuessShortcut: Alt+Shift+Return +title: Title +token_one: Token +token_other: Tokens +username: Username +version: "Version: {{version}}" +volume: Volume +waitingForPlayerHeading_one: You are waiting for <0>{{player}} to make their move +waitingForPlayerHeading_other: You are waiting for <0>{{player}} to make their move +waitingText: "These are the possible slots:" +welcome: Welcome +welcomeText: >- + Welcome to the unofficial Hitster online card game! Here you will try to + guess when a certain song was released, but don't worry, its not as hard as + it sounds. Read on to find out what its all about. +year: Year +"yes": "Yes" +yesShortcut: Alt+Shift+Y +youClaimedHit: >- + You claimed a hit. This was <0>{{title}} by <1>{{artist}} from + <2>{{year}}. This song belongs to the <3>{{pack}} pack. +youClaimedHitBelonging: >- + You claimed a hit. This was <0>{{title}} by <1>{{artist}} from + <2>{{year}}. You might know this song from <3>{{belongs_to}} and it + belongs to the <3>{{pack}} pack. +youGuessHeading: Finally, its your turn to guess! +youInterceptHeading: >- + You can now step in and make another guess, but be aware, it'll cost you one + token! +youJoinedGame: You joined the game +youLeftGame: You left the game +youReceivedToken: You received a token for guessing artist and title of this hit correctly +youSkippedHit: >- + You skipped this hit. This was <0>{{title}} by <1>{{artist}} from + <2>{{year}}. This song belongs to the <3>{{pack}} pack. +youSkippedHitBelonging: >- + You skipped this hit. This was <0>{{title}} by <1>{{artist}} from + <2>{{year}}. You might know this song from <3>{{belongs_to}} and it + belongs to the <3>{{pack}} pack. +youWin: Congratulations, you are the winner! diff --git a/client/src/pages/welcome.tsx b/client/src/pages/welcome.tsx index 9937011..b7e7527 100644 --- a/client/src/pages/welcome.tsx +++ b/client/src/pages/welcome.tsx @@ -2,7 +2,9 @@ import sum from "ml-array-sum" import { useEffect, useState } from "react" import Modal from "react-bootstrap/Modal" import Spinner from "react-bootstrap/Spinner" -import { useTranslation } from "react-i18next" +import Tab from "react-bootstrap/Tab" +import Tabs from "react-bootstrap/Tabs" +import { Trans, useTranslation } from "react-i18next" import HitService from "../services/hits.service" export function Welcome({ @@ -44,20 +46,37 @@ export function Welcome({

{t("welcomeText")}

{t("features")}

{t("howToPlay")}

+ + + , li:
  • }} + /> + + + {" "} + , li:
  • }} + /> + + ) ) : ( diff --git a/client/tsconfig.json b/client/tsconfig.json index 4b40d8a..d83f291 100644 --- a/client/tsconfig.json +++ b/client/tsconfig.json @@ -18,7 +18,8 @@ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + "types": ["@modyfi/vite-plugin-yaml/modules"] }, "include": ["src"], "references": [{ "path": "./tsconfig.node.json" }] diff --git a/client/vite.config.ts b/client/vite.config.ts index 76bd7aa..0ec78ac 100644 --- a/client/vite.config.ts +++ b/client/vite.config.ts @@ -1,4 +1,5 @@ import gitVersion from "@corteks/gitversion" +import ViteYaml from "@modyfi/vite-plugin-yaml" import react from "@vitejs/plugin-react-swc" import { defineConfig, splitVendorChunkPlugin } from "vite" import checker from "vite-plugin-checker" @@ -25,6 +26,7 @@ export default defineConfig(async () => { return { plugins: [ + ViteYaml(), react(), viteTsconfigPaths(), checker({