diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index efc8c952..ff564dd7 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -20,7 +20,7 @@ module.exports = {
"plugin:vue/vue3-recommended",
"prettier",
],
- plugins: ["@typescript-eslint"],
+ plugins: ["@typescript-eslint", "vue", "@intlify/vue-i18n"],
rules: {
"vue/multi-word-component-names": "off",
"vue/component-api-style": ["warn", ["script-setup"]],
@@ -28,5 +28,23 @@ module.exports = {
"vue/define-props-declaration": ["error", "type-based"],
"vue/no-undef-components": "error",
"vue/no-useless-mustaches": "error",
+ "@intlify/vue-i18n/no-raw-text": [
+ "error",
+ {
+ attributes: {
+ "/.+/": [
+ "alt",
+ "aria-label",
+ "aria-placeholder",
+ "aria-roledescription",
+ "aria-valuetext",
+ "label",
+ "placeholder",
+ "title",
+ ],
+ },
+ ignorePattern: "^\\W+$",
+ },
+ ],
},
};
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
index 43115fc2..7fe31df4 100644
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -37,6 +37,7 @@ class Kernel extends HttpKernel
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
+ \App\Http\Middleware\LocalizeResponse::class,
\App\Http\Middleware\HandleInertiaRequests::class,
\Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets::class,
],
diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php
index e9a7c833..e1ffb05d 100644
--- a/app/Http/Middleware/HandleInertiaRequests.php
+++ b/app/Http/Middleware/HandleInertiaRequests.php
@@ -35,6 +35,8 @@ public function share(Request $request): array
{
return array_merge(parent::share($request), [
'competitions' => fn () => $request->input('edition')?->competitions ?? [],
+ 'locale' => app()->getLocale(),
+ 'fallbackLocale' => config('app.fallback_locale'),
]);
}
}
diff --git a/app/Http/Middleware/LocalizeResponse.php b/app/Http/Middleware/LocalizeResponse.php
new file mode 100644
index 00000000..3bf3eabe
--- /dev/null
+++ b/app/Http/Middleware/LocalizeResponse.php
@@ -0,0 +1,31 @@
+header('Accept-Language');
+
+ foreach (explode(',', $acceptLanguage) as $language) {
+ [$language] = explode(';', $language);
+
+ if (in_array($language, ['en-US', 'pt-PT'])) {
+ app()->setLocale($language);
+ break;
+ }
+ }
+
+ return $next($request);
+ }
+}
diff --git a/package-lock.json b/package-lock.json
index 39e59fe5..4858dbfa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,5 +1,5 @@
{
- "name": "website-sinf-2023",
+ "name": "html",
"lockfileVersion": 2,
"requires": true,
"packages": {
@@ -13,6 +13,7 @@
},
"devDependencies": {
"@inertiajs/vue3": "^1.0.11",
+ "@intlify/eslint-plugin-vue-i18n": "^2.0.0",
"@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/forms": "^0.5.6",
"@tailwindcss/typography": "^0.5.9",
@@ -74,6 +75,18 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@babel/runtime": {
+ "version": "7.23.1",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz",
+ "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==",
+ "dev": true,
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@esbuild/linux-x64": {
"version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
@@ -220,6 +233,98 @@
"url": "https://github.com/sponsors/kazupon"
}
},
+ "node_modules/@intlify/eslint-plugin-vue-i18n": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@intlify/eslint-plugin-vue-i18n/-/eslint-plugin-vue-i18n-2.0.0.tgz",
+ "integrity": "sha512-ECBD0TvQNa56XKyuM6FPIGAAl7MP6ODcgjBQJrzucNxcTb8fYTWmZ+xgBuvmvAtA0iE0D4Wp18UMild2N0bGyw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/eslintrc": "^1.2.0",
+ "@intlify/core-base": "^9.1.9",
+ "@intlify/message-compiler": "^9.1.9",
+ "debug": "^4.3.1",
+ "glob": "^8.0.0",
+ "ignore": "^5.0.5",
+ "is-language-code": "^3.1.0",
+ "js-yaml": "^4.0.0",
+ "json5": "^2.1.3",
+ "jsonc-eslint-parser": "^2.0.0",
+ "lodash": "^4.17.11",
+ "parse5": "^7.0.0",
+ "semver": "^7.3.4",
+ "vue-eslint-parser": "^9.0.0",
+ "yaml-eslint-parser": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@intlify/eslint-plugin-vue-i18n/node_modules/@eslint/eslintrc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
+ "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.4.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@intlify/eslint-plugin-vue-i18n/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@intlify/eslint-plugin-vue-i18n/node_modules/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@intlify/eslint-plugin-vue-i18n/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@intlify/message-compiler": {
"version": "9.4.1",
"resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.4.1.tgz",
@@ -1496,6 +1601,18 @@
"integrity": "sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ==",
"dev": true
},
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/esbuild": {
"version": "0.18.20",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
@@ -2164,6 +2281,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-language-code": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-language-code/-/is-language-code-3.1.0.tgz",
+ "integrity": "sha512-zJdQ3QTeLye+iphMeK3wks+vXSRFKh68/Pnlw7aOfApFSEIOhYa8P9vwwa6QrImNNBMJTiL1PpYF0f4BxDuEgA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.14.0"
+ }
+ },
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -2221,6 +2347,36 @@
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"dev": true
},
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonc-eslint-parser": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.3.0.tgz",
+ "integrity": "sha512-9xZPKVYp9DxnM3sd1yAsh/d59iIaswDkai8oTxbursfKYbg/ibjX0IzFt35+VZ8iEW453TVTXztnRvYUQlAfUQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.5.0",
+ "eslint-visitor-keys": "^3.0.0",
+ "espree": "^9.0.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ }
+ },
"node_modules/laravel-vite-plugin": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.8.0.tgz",
@@ -2636,6 +2792,18 @@
"node": ">=6"
}
},
+ "node_modules/parse5": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+ "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
+ "dev": true,
+ "dependencies": {
+ "entities": "^4.4.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -3023,6 +3191,12 @@
"node": ">=8.10.0"
}
},
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
+ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==",
+ "dev": true
+ },
"node_modules/resolve": {
"version": "1.22.2",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
@@ -3672,6 +3846,23 @@
"node": ">= 14"
}
},
+ "node_modules/yaml-eslint-parser": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz",
+ "integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.0.0",
+ "lodash": "^4.17.21",
+ "yaml": "^2.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ }
+ },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
@@ -3724,6 +3915,15 @@
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.0.tgz",
"integrity": "sha512-DA65VCJRetcFmJnt9/hEmRvXNCwk0V86dxG6p6N13hzDazaLRjGdTGPGgjxZOtLuFgWzOSRX4grybmRXwQ9bSg=="
},
+ "@babel/runtime": {
+ "version": "7.23.1",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz",
+ "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==",
+ "dev": true,
+ "requires": {
+ "regenerator-runtime": "^0.14.0"
+ }
+ },
"@esbuild/linux-x64": {
"version": "0.18.20",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
@@ -3824,6 +4024,81 @@
"@intlify/shared": "9.4.1"
}
},
+ "@intlify/eslint-plugin-vue-i18n": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@intlify/eslint-plugin-vue-i18n/-/eslint-plugin-vue-i18n-2.0.0.tgz",
+ "integrity": "sha512-ECBD0TvQNa56XKyuM6FPIGAAl7MP6ODcgjBQJrzucNxcTb8fYTWmZ+xgBuvmvAtA0iE0D4Wp18UMild2N0bGyw==",
+ "dev": true,
+ "requires": {
+ "@eslint/eslintrc": "^1.2.0",
+ "@intlify/core-base": "^9.1.9",
+ "@intlify/message-compiler": "^9.1.9",
+ "debug": "^4.3.1",
+ "glob": "^8.0.0",
+ "ignore": "^5.0.5",
+ "is-language-code": "^3.1.0",
+ "js-yaml": "^4.0.0",
+ "json5": "^2.1.3",
+ "jsonc-eslint-parser": "^2.0.0",
+ "lodash": "^4.17.11",
+ "parse5": "^7.0.0",
+ "semver": "^7.3.4",
+ "vue-eslint-parser": "^9.0.0",
+ "yaml-eslint-parser": "^1.0.0"
+ },
+ "dependencies": {
+ "@eslint/eslintrc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
+ "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.4.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ }
+ },
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "dependencies": {
+ "minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ }
+ }
+ }
+ }
+ },
"@intlify/message-compiler": {
"version": "9.4.1",
"resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.4.1.tgz",
@@ -4679,6 +4954,12 @@
"integrity": "sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ==",
"dev": true
},
+ "entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true
+ },
"esbuild": {
"version": "0.18.20",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
@@ -5168,6 +5449,15 @@
"is-extglob": "^2.1.1"
}
},
+ "is-language-code": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-language-code/-/is-language-code-3.1.0.tgz",
+ "integrity": "sha512-zJdQ3QTeLye+iphMeK3wks+vXSRFKh68/Pnlw7aOfApFSEIOhYa8P9vwwa6QrImNNBMJTiL1PpYF0f4BxDuEgA==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.14.0"
+ }
+ },
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -5213,6 +5503,24 @@
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"dev": true
},
+ "json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true
+ },
+ "jsonc-eslint-parser": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.3.0.tgz",
+ "integrity": "sha512-9xZPKVYp9DxnM3sd1yAsh/d59iIaswDkai8oTxbursfKYbg/ibjX0IzFt35+VZ8iEW453TVTXztnRvYUQlAfUQ==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.5.0",
+ "eslint-visitor-keys": "^3.0.0",
+ "espree": "^9.0.0",
+ "semver": "^7.3.5"
+ }
+ },
"laravel-vite-plugin": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.8.0.tgz",
@@ -5512,6 +5820,15 @@
"callsites": "^3.0.0"
}
},
+ "parse5": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+ "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
+ "dev": true,
+ "requires": {
+ "entities": "^4.4.0"
+ }
+ },
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -5706,6 +6023,12 @@
"picomatch": "^2.2.1"
}
},
+ "regenerator-runtime": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
+ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==",
+ "dev": true
+ },
"resolve": {
"version": "1.22.2",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
@@ -6121,6 +6444,17 @@
"integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==",
"dev": true
},
+ "yaml-eslint-parser": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz",
+ "integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^3.0.0",
+ "lodash": "^4.17.21",
+ "yaml": "^2.0.0"
+ }
+ },
"yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index 88a33a31..a2d0fd73 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,7 @@
},
"devDependencies": {
"@inertiajs/vue3": "^1.0.11",
+ "@intlify/eslint-plugin-vue-i18n": "^2.0.0",
"@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/forms": "^0.5.6",
"@tailwindcss/typography": "^0.5.9",
diff --git a/resources/js/Components/Footer.vue b/resources/js/Components/Footer.vue
index ccf98b4f..1a451802 100644
--- a/resources/js/Components/Footer.vue
+++ b/resources/js/Components/Footer.vue
@@ -66,8 +66,8 @@ const contacts = [
Copyright © 2023
- NIAEFEUP , todos os direitos
- reservados
+ NIAEFEUP ,
+ {{ $t("components.footer.copyrightNotice") }}
diff --git a/resources/js/Components/Home/SponsorBanner.vue b/resources/js/Components/Home/SponsorBanner.vue
index f701aeb2..4541401b 100644
--- a/resources/js/Components/Home/SponsorBanner.vue
+++ b/resources/js/Components/Home/SponsorBanner.vue
@@ -79,7 +79,7 @@ const getSize = (tier: string) => {
- Em breve...
+ {{ $t("general.soon") }}
@@ -113,7 +113,7 @@ const getSize = (tier: string) => {
- Em breve...
+ {{ $t("general.soon") }}
diff --git a/resources/js/Components/Navbar.vue b/resources/js/Components/Navbar.vue
index 0dcb433b..d2b2543d 100644
--- a/resources/js/Components/Navbar.vue
+++ b/resources/js/Components/Navbar.vue
@@ -20,27 +20,21 @@ type Routes = Record;
const homeSections: Routes = {
aboutus: {
- label: "Sobre nós",
+ label: "components.navbar.navLinks.aboutus",
},
- speakers: { label: "Speakers" },
- sponsors: { label: "Patrocínios" },
+ speakers: { label: "components.navbar.navLinks.speakers" },
+ sponsors: { label: "components.navbar.navLinks.sponsors" },
};
const pageRoutes: Routes = {
- // aboutus: {
- // label: "Sobre nós",
- // },
- // speakers: { label: "Speakers" },
program: {
- label: "Programa",
+ label: "components.navbar.navLinks.program",
_query: {
day: 1,
},
},
- shop: { label: "Loja" },
- team: { label: "Equipa" },
- // sponsors: { label: "Patrocínios" },
- // contacts: { label: "Contactos" },
+ shop: { label: "components.navbar.navLinks.shop" },
+ team: { label: "components.navbar.navLinks.team" },
};
const editionRoutes = [2022, 2021, 2020, 2019, 2018];
@@ -75,7 +69,7 @@ const isAdmin = computed(() => {
- {{ label }}
+ {{ $t(label) }}
@@ -84,7 +78,7 @@ const isAdmin = computed(() => {
@@ -100,7 +94,7 @@ const isAdmin = computed(() => {
"
:active="page === route().current()"
>
- {{ label }}
+ {{ $t(label) }}
{
width="32"
>
- Competições
+ {{
+ $t("components.navbar.competitions")
+ }}
{
- Perfil
+ {{
+ $t(
+ "components.navbar.profileDropdown.profile",
+ )
+ }}
- Administração
+ {{
+ $t(
+ "components.navbar.profileDropdown.admin",
+ )
+ }}
- Logout
+ {{
+ $t(
+ "components.navbar.profileDropdown.logout",
+ )
+ }}
diff --git a/resources/js/Components/Program/ProgramDayPanel.vue b/resources/js/Components/Program/ProgramDayPanel.vue
index d6b547a6..9402687f 100644
--- a/resources/js/Components/Program/ProgramDayPanel.vue
+++ b/resources/js/Components/Program/ProgramDayPanel.vue
@@ -57,7 +57,7 @@ onMounted(() => {
data-type="talk"
@click="toggle"
>
- Palestras
+ {{ $t("events.talks") }}
{
data-type="activity"
@click="toggle"
>
- Atividades
+ {{ $t("pages.event.workshops") }}
{
data-type="stand"
@click="toggle"
>
- Bancas
+ {{ $t("pages.event.stands") }}
@@ -84,7 +84,9 @@ onMounted(() => {
{{ day.theme }}
- Em breve...
+
+ {{ $t("general.soon") }}
+
diff --git a/resources/js/Components/Program/TimeLine/StandDisplay.vue b/resources/js/Components/Program/TimeLine/StandDisplay.vue
index d75cea61..808bf9cb 100644
--- a/resources/js/Components/Program/TimeLine/StandDisplay.vue
+++ b/resources/js/Components/Program/TimeLine/StandDisplay.vue
@@ -37,7 +37,7 @@ const platSponsorStands = stands.filter(
Platinum
-
+
-import ApplicationLogo from "@/Components/ApplicationLogo.vue";
-
-
-
-
-
-
-
-
- Welcome to your Jetstream application!
-
-
-
- Laravel Jetstream provides a beautiful, robust starting point
- for your next Laravel application. Laravel is designed to help
- you build your application using a development environment that
- is simple, powerful, and enjoyable. We believe you should love
- expressing your creativity through programming, so we have spent
- time carefully crafting the Laravel ecosystem to be a breath of
- fresh air. We hope you love it.
-
-
-
-
-
-
-
-
- Laravel has wonderful documentation covering every aspect of
- the framework. Whether you're new to the framework or have
- previous experience, we recommend reading all of the
- documentation from beginning to end.
-
-
-
-
- Explore the documentation
-
-
-
-
-
-
-
-
-
-
-
-
- Laracasts offers thousands of video tutorials on Laravel,
- PHP, and JavaScript development. Check them out, see for
- yourself, and massively level up your development skills in
- the process.
-
-
-
-
- Start watching Laracasts
-
-
-
-
-
-
-
-
-
-
-
-
- Laravel Jetstream is built with Tailwind, an amazing utility
- first CSS framework that doesn't get in your way. You'll be
- amazed how easily you can build and maintain fresh, modern
- designs with this wonderful framework at your fingertips.
-
-
-
-
-
-
-
-
-
- Authentication
-
-
-
-
- Authentication and registration views are included with
- Laravel Jetstream, as well as support for user email
- verification and resetting forgotten passwords. So, you're
- free to get started with what matters most: building your
- application.
-
-
-
-
-
diff --git a/resources/js/Pages/Competition.vue b/resources/js/Pages/Competition.vue
index e60d0a5b..9f5e92ef 100644
--- a/resources/js/Pages/Competition.vue
+++ b/resources/js/Pages/Competition.vue
@@ -22,7 +22,7 @@ const regulationTextParts = computed(() => {
-
+
diff --git a/resources/js/Pages/Dashboard.vue b/resources/js/Pages/Dashboard.vue
deleted file mode 100644
index 5e5f3d90..00000000
--- a/resources/js/Pages/Dashboard.vue
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
- Dashboard
-
-
-
-
-
-
diff --git a/resources/js/Pages/Error.vue b/resources/js/Pages/Error.vue
index 8170d183..51e5cd89 100644
--- a/resources/js/Pages/Error.vue
+++ b/resources/js/Pages/Error.vue
@@ -32,26 +32,26 @@ const description = computed(() => {
id="svg-1"
class="absolute left-[7%] w-36 animate-2023-maintenance-jump opacity-50 max-ml:hidden"
src="/../images/cy-sinf.svg"
- alt="Stylized SINF logo"
+ :alt="$t('general.sinfLogoAlt')"
/>
{
text-size="text-xl"
@click="goBack()"
>
- Regressar
+ {{ $t("pages.error.back") }}
-
Mais informações
+
{{ $t("pages.error.moreInfo") }}
geral@sinf.pt
diff --git a/resources/js/Pages/Event.vue b/resources/js/Pages/Event.vue
index e69870b3..eaca7954 100644
--- a/resources/js/Pages/Event.vue
+++ b/resources/js/Pages/Event.vue
@@ -48,7 +48,7 @@ const colorPicker = () => {
-
+
{
- Dia
- {{ event.event_day ? $d(event.event_day.date, "day") : "" }}
- @
- {{ event.time_start ? formatTimeString(event.time_start) : "" }}
- - {{ event.room }}
+
+ Dia
+ {{ $d(event.event_day.date, "day") }}
+ @
+ {{
+ event.event_day
+ ? formatTimeString(event.time_start)
+ : ""
+ }}
+ - {{ event.room }}
+
+ N/A
@@ -102,21 +109,21 @@ const colorPicker = () => {
class="flex w-full flex-col items-center gap-4 place-self-center py-24"
>
- Vemo-nos lá!
- Ainda não te inscreveste na SINF!
+ {{ $t("pages.event.seeYou") }}
+ {{
+ $t("pages.event.notEnrolled")
+ }}
- Vamos a isto?
+ {{ $t("pages.event.callToAction") }}
- Ainda temos
+ {{ $t("pages.event.spots.pre") }}
{{ event.capacity - (event.enrollments?.length ?? 0) }}
- lugares.
+ {{ $t("pages.event.spots.pos", event.capacity) }}
- Evento esgotado!
+ {{ $t("pages.event.full") }}
-
+
- semana_de_informática
+
+ {{ $t("semana_de_informática") }}
{{
days.length > 0
? formattedDate(
- $d(new Date(days[0].date), "long"),
+ $d(new Date(days[0].date), "longYear"),
$t("general.to"),
- $d(new Date(days[days.length - 1].date), "long"),
+ $d(
+ new Date(days[days.length - 1].date),
+ "longYear",
+ ),
)
- : ""
+ : undefined
}}
@@ -129,13 +133,13 @@ const formattedDate = (
id="aboutus"
class="absolute -top-9 left-[calc(50%-88.2415px)] border border-solid border-black bg-2023-red p-3 text-3xl font-bold text-white shadow-md shadow-2023-bg"
>
- Sobre nós
+ {{ $t("pages.home.aboutUs.label") }}
- {{ $t("homePage.aboutUsText1") }}
+ {{ $t("pages.home.aboutUs.text1") }}
- {{ $t("homePage.aboutUsText2") }}
+ {{ $t("pages.home.aboutUs.text2") }}
@@ -143,7 +147,7 @@ const formattedDate = (
- Este ano temos...
+ {{ $t("pages.home.thisYear") }}
- {{ days.length }} dias
- {{ standCount }} bancas
- {{ talkCount }} palestras
{{ activityCount }} atividades {{ days.length }} {{ $t("events.days") }}
+
{{ standCount }} {{ $t("events.stalls") }}
+
{{ talkCount }} {{ $t("events.talks") }}
+
{{ activityCount }} {{ $t("events.workshops") }}
@@ -168,7 +178,7 @@ const formattedDate = (
- Muitas novidades para ti! Está quase...
+ {{ $t("pages.home.comingSoonNews") }}
@@ -180,7 +190,7 @@ const formattedDate = (
- Oradores
+ {{ $t("pages.home.speakers") }}
@@ -189,7 +199,7 @@ const formattedDate = (
- Em breve...
+ {{ $t("general.soon") }}
@@ -199,21 +209,21 @@ const formattedDate = (
- Patrocínios
+ {{ $t("pages.home.sponsors.label") }}
diff --git a/resources/js/Pages/Maintenance.vue b/resources/js/Pages/Maintenance.vue
index 111a8de5..4ed6d64f 100644
--- a/resources/js/Pages/Maintenance.vue
+++ b/resources/js/Pages/Maintenance.vue
@@ -4,8 +4,7 @@ import { OhVueIcon } from "oh-vue-icons";
-
-
+
2023 {{ 2023 }}
- semana_de_informática
+ {{ $t("semana_de_informática") }}
- 25 a 31 de outubro
+ {{ $t("pages.maintenance.date") }}
- Estamos a preparar mais uma edição da SINF!
-
+ >
- Revê a edição do último ano aqui!
+ {{ $t("pages.maintenance.prepareEdition") }}
- Contacta-nos!
+ {{ $t("pages.maintenance.contactUs") }}
();
-
+
diff --git a/resources/js/Pages/Profile/Show.vue b/resources/js/Pages/Profile/Show.vue
index ae86b814..d7b79b95 100644
--- a/resources/js/Pages/Profile/Show.vue
+++ b/resources/js/Pages/Profile/Show.vue
@@ -39,7 +39,7 @@ const buttons = {
-
+
+
();
- Programa
+ {{ $t("pages.program.header") }}
();
{{
- new Intl.DateTimeFormat("pt-PT", {
- month: "long",
- day: "2-digit",
- }).format(new Date(eventDay.date))
+ $d(new Date(eventDay.date), "long")
}}
- Em breve...
+ {{ $t("general.soon") }}
diff --git a/resources/js/Pages/Shop.vue b/resources/js/Pages/Shop.vue
index 3eb1651e..4438a9ee 100644
--- a/resources/js/Pages/Shop.vue
+++ b/resources/js/Pages/Shop.vue
@@ -11,7 +11,7 @@ defineProps();
-
+
();
- Loja
+ {{ $t("pages.shop.header") }}
();
- Em breve...
+ {{ $t("general.soon") }}
diff --git a/resources/js/Pages/Team.vue b/resources/js/Pages/Team.vue
index 318a2126..780ce149 100644
--- a/resources/js/Pages/Team.vue
+++ b/resources/js/Pages/Team.vue
@@ -19,7 +19,7 @@ const colors: Array = [
-
+
= [
- Equipa
+ {{ $t("pages.team.header") }}
= [
- Em breve...
+ {{ $t("general.soon") }}
diff --git a/resources/js/Pages/Welcome.vue b/resources/js/Pages/Welcome.vue
deleted file mode 100644
index 5de9ae3c..00000000
--- a/resources/js/Pages/Welcome.vue
+++ /dev/null
@@ -1,367 +0,0 @@
-
-
-
-
-
-
-
- Dashboard
-
-
- Log in
-
- Register
-
-
-
-
-
-
-
-
-
-
-
-
-
- Documentation
-
-
-
- Laravel has wonderful documentation covering
- every aspect of the framework. Whether you are a
- newcomer or have prior experience with Laravel,
- we recommend reading our documentation from
- beginning to end.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Laracasts
-
-
-
- Laracasts offers thousands of video tutorials on
- Laravel, PHP, and JavaScript development. Check
- them out, see for yourself, and massively level
- up your development skills in the process.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Laravel News
-
-
-
- Laravel News is a community driven portal and
- newsletter aggregating all of the latest and
- most important news in the Laravel ecosystem,
- including new package releases and tutorials.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Vibrant Ecosystem
-
-
-
- Laravel's robust library of first-party tools
- and libraries, such as
- Forge ,
- Vapor ,
- Nova , and
- Envoyer
- help you take your projects to the next level.
- Pair them with powerful open source libraries
- like
- Cashier ,
- Dusk ,
- Echo ,
- Horizon ,
- Sanctum ,
- Telescope , and more.
-
-
-
-
-
-
-
-
-
-
- Laravel v{{ laravelVersion }} (PHP v{{ phpVersion }})
-
-
-
-
-
-
-
diff --git a/resources/js/Types/PageProps.ts b/resources/js/Types/PageProps.ts
index 3afcc20f..de6fc94a 100644
--- a/resources/js/Types/PageProps.ts
+++ b/resources/js/Types/PageProps.ts
@@ -23,4 +23,6 @@ export default interface MyPageProps {
};
canResetPassword: boolean;
competitions: Competition[];
+ locale: string;
+ fallbackLocale: string;
}
diff --git a/resources/js/app.ts b/resources/js/app.ts
index 49640c20..218caadc 100644
--- a/resources/js/app.ts
+++ b/resources/js/app.ts
@@ -8,7 +8,7 @@ import { createVfm } from "vue-final-modal";
import { ZiggyVue } from "ziggy";
import { addIcons } from "oh-vue-icons";
import { createI18n } from "vue-i18n";
-import messages from "./messages";
+import config from "./localization";
const vfm = createVfm();
@@ -25,53 +25,7 @@ addIcons(
const appName =
window.document.getElementsByTagName("title")[0]?.innerText || "Laravel";
-const i18n = createI18n({
- legacy: false,
- globalInjection: true,
- locale: "pt",
- fallbackLocale: "en",
- messages,
- datetimeFormats: {
- en: {
- short: {
- year: "numeric",
- month: "numeric",
- day: "numeric",
- },
- long: {
- year: "numeric",
- month: "long",
- day: "numeric",
- },
- day: {
- day: "numeric",
- },
- hourMinute: {
- hour: "numeric",
- minute: "numeric",
- },
- },
- pt: {
- short: {
- year: "numeric",
- month: "numeric",
- day: "numeric",
- },
- long: {
- year: "numeric",
- month: "long",
- day: "numeric",
- },
- day: {
- day: "numeric",
- },
- hourMinute: {
- hour: "numeric",
- minute: "numeric",
- },
- },
- },
-});
+const i18n = createI18n(config);
createInertiaApp({
title: (title) => `${title} - ${appName}`,
diff --git a/resources/js/localization/index.ts b/resources/js/localization/index.ts
new file mode 100644
index 00000000..c435b461
--- /dev/null
+++ b/resources/js/localization/index.ts
@@ -0,0 +1,296 @@
+import type { I18nOptions } from "vue-i18n";
+
+const messages = {
+ en: {
+ pages: {
+ home: {
+ title: "Home",
+ comingSoonNews: "A lot of news. Don't miss out...",
+ aboutUs: {
+ label: "About us",
+ text1: "SINF (Semana de Informática), organized by NIAEFEUP (Núcleo de Informática da Associação de Estudantes da Faculdade de Engenharia da Universidade do Porto), was created with the purpose of allowing students to, regardless of their degree, develop their skills in the various fields related to Informatics, promoting their interaction with the corporate world through a series of social gatherings.",
+ text2: "2023's edition runs through the 25th until the 31st of october. Participants are presented with talks and workshops where they can directly contact with several technologies and concepts that do not integrate their academic journey, therefore focusing on their technical skills. Besides this, there are also a pitch, mock interview sessions and company visits, nurturing the contact between participants and nationally and internationally acclaimed businesses, and as such developing their soft skills",
+ },
+ thisYear: "This year we have...",
+ speakers: "Speakers",
+ sponsors: {
+ label: "Sponsors",
+ tier: {
+ plat: "Platinum",
+ gold: "Gold",
+ silver: "Silver",
+ },
+ },
+ },
+ program: {
+ title: "Program",
+ header: "Program",
+ },
+ maintenance: {
+ title: "Coming soon...",
+ date: "25th - 31th october",
+ prepareEdition: "We are preparing another year of SINF",
+ contactUs: "Contact us",
+ },
+ event: {
+ title: "Event",
+ join: "Join",
+ callToAction: "Let's do this?",
+ seeYou: "See you there!",
+ notEnrolled: "You still haven't enrolled for SINF!",
+ spots: {
+ pre: "We still have",
+ pos: "spot | spots",
+ },
+ full: "Full attendance",
+ stands: "Stands",
+ workshops: "Workshops",
+ },
+ competition: {
+ title: "Competition",
+ rules: "Rules",
+ callToAction: "Let's do this?",
+ join: "Join!",
+ },
+ profile: {
+ title: "Profile",
+ },
+ team: {
+ title: "Team",
+ header: "Team",
+ },
+ error: {
+ back: "Back",
+ moreInfo: "More info",
+ },
+ shop: {
+ title: "Shop",
+ header: "Shop",
+ },
+ },
+ components: {
+ program: {},
+ navbar: {
+ navLinks: {
+ aboutus: "About Us",
+ speakers: "Speakers",
+ program: "Program",
+ team: "Team",
+ sponsors: "Sponsors",
+ contacts: "Contacts",
+ shop: "Shop",
+ },
+ competitions: "Competitions",
+ profileDropdown: {
+ profile: "Profile",
+ admin: "Admin Dashboard",
+ logout: "Logout",
+ },
+ },
+ footer: {
+ copyrightNotice: "all rights reserved",
+ },
+ },
+ events: {
+ days: "days",
+ stalls: "stalls",
+ talks: "talks",
+ workshops: "workshops",
+ },
+ general: {
+ to: "to",
+ sinfLogoAlt: "Stylized SINF logo",
+ soon: "Coming soon...",
+ },
+ models: {
+ admin: "Admin | Admins",
+ company: "Company | Companies",
+ competition: "Competition | Competitions",
+ competitionTeam: "Competition Team | Competition Teams",
+ department: "Department | Departments",
+ edition: "Edition | Editions",
+ enrollment: "Enrollment | Enrollments",
+ event: "Event | Events",
+ eventDay: "Event Day | Event Days",
+ participant: "Participant | Participants",
+ product: "Product | Products",
+ quest: "Quest | Quests",
+ slot: "Quest Slot | Quest Slots",
+ socialMedia: "Social Media | Social Media",
+ speaker: "Speaker | Speakers",
+ sponsor: "Sponsor | Sponsors",
+ staff: "Staff | Staff",
+ stand: "Stand | Stands",
+ user: "User | Users",
+ eventType: "Event Type | Event Types",
+ },
+ },
+ pt: {
+ pages: {
+ home: {
+ title: "Página Principal",
+ comingSoonNews: "Muitas novidades para ti! Está quase...",
+ aboutUs: {
+ label: "Sobre nós",
+ text1: "A Semana de Informática (SINF), organizada pelo Núcleo de Informática da Associação de Estudantes da Faculdade de Engenharia da Universidade do Porto (NIAEFEUP), foi criada com o intuito de permitir aos estudantes, independentemente do curso, desenvolver as suas capacidades nas diversas áreas da Informática, promovendo a sua interação com o mundo empresarial através de eventos sociais.",
+ text2: "A edição de 2023 decorre entre os dias 25 e 31 de outubro. Os participantes têm a seu dispor palestras e workshops onde entrarão em contacto com diversas tecnologias e conceitos que não intervêm no percurso académico, focando-se portanto nas skills técnicas, assim como um pitch, sessões de entrevistas e visitas a empresas, fomentando o seu contacto com empresas de topo a nível nacional e internacional, podendo desenvolver as suas soft skills.",
+ },
+ thisYear: "Este ano temos...",
+ speakers: "Palestrantes",
+ sponsors: {
+ label: "Patrocínios", // Parceiros ?
+ tier: {
+ plat: "Platina",
+ gold: "Ouro",
+ silver: "Prata",
+ },
+ },
+ },
+ program: {
+ title: "Programa",
+ header: "Programa",
+ },
+ maintenance: {
+ title: "Brevemente...",
+ date: "25 a 31 de outubro",
+ prepareEdition: "Estamos a preparar mais uma edição da SINF!",
+ contactUs: "Contacta-nos!",
+ },
+ event: {
+ title: "Evento",
+ join: "Inscreve-te",
+ callToAction: "Vamos a isto?",
+ seeYou: "Vemo-nos na lá!",
+ notEnrolled: "Ainda não te inscreveste na SINF!",
+ spots: {
+ pre: "Ainda temos",
+ pos: "lugar | lugares",
+ },
+ full: "Evento esgotado",
+ stands: "Bancas",
+ workshops: "Atividades",
+ },
+ competition: {
+ title: "Competição",
+ rules: "Regulamento",
+ callToAction: "Vamos a isto?",
+ join: "Participar!",
+ },
+ profile: {
+ title: "Perfil",
+ },
+ team: {
+ title: "Equipa",
+ header: "Equipa",
+ },
+ error: {
+ back: "Voltar",
+ moreInfo: "Mais informações",
+ },
+ shop: {
+ title: "Loja",
+ header: "Loja",
+ },
+ },
+ components: {
+ program: {},
+ navbar: {
+ navLinks: {
+ aboutus: "Sobre nós",
+ speakers: "Palestrantes",
+ program: "Programa",
+ team: "Equipa",
+ sponsors: "Patrocínios",
+ contacts: "Contactos",
+ shop: "Loja",
+ },
+ competitions: "Competições",
+ profileDropdown: {
+ profile: "Perfil",
+ admin: "Administração",
+ logout: "Logout",
+ },
+ },
+ footer: {
+ copyrightNotice: "todos os direitos reservados",
+ },
+ },
+ events: {
+ days: "dias",
+ stalls: "bancas",
+ talks: "palestras",
+ workshops: "workshops",
+ },
+ general: {
+ to: "a",
+ sinfLogoAlt: "Logótipo da SINF",
+ soon: "Em breve...",
+ },
+ models: {
+ admin: "Administrador | Administradores",
+ company: "Empresa | Empresas",
+ competition: "Competição | Competições",
+ competitionTeam: "Equipa de Competição | Equipas de Competição",
+ department: "Departamento | Departamentos",
+ edition: "Edição | Edições",
+ enrollment: "Inscrição | Inscrições",
+ event: "Evento | Eventos",
+ eventDay: "Dia de Evento | Dias de Evento",
+ participant: "Participante | Participantes",
+ product: "Produto | Produtos",
+ quest: "Tarefa | Tarefas",
+ slot: "Encaixe de Tarefa | Encaixes de Tarefa",
+ socialMedia: "Redes Sociais | Redes Sociais",
+ speaker: "Orador | Oradores",
+ sponsor: "Patrocinador | Patrocinadores",
+ staff: "Staff | Staff",
+ stand: "Banca | Bancas",
+ user: "Utilizador | Utilizadores",
+ eventType: "Tipo de Evento | Tipos de Evento",
+ },
+ },
+};
+
+const config: I18nOptions = {
+ legacy: false,
+ globalInjection: true,
+ locale: "pt",
+ fallbackLocale: "en",
+ messages,
+ datetimeFormats: {
+ en: {
+ short: {
+ year: "numeric",
+ month: "numeric",
+ day: "numeric",
+ },
+ long: {
+ month: "long",
+ day: "numeric",
+ },
+ longYear: {
+ year: "numeric",
+ month: "long",
+ day: "numeric",
+ },
+ },
+ pt: {
+ short: {
+ year: "numeric",
+ month: "numeric",
+ day: "numeric",
+ },
+ long: {
+ month: "long",
+ day: "numeric",
+ },
+ longYear: {
+ year: "numeric",
+ month: "long",
+ day: "numeric",
+ },
+ },
+ },
+};
+
+export default config;
diff --git a/resources/js/messages.ts b/resources/js/messages.ts
deleted file mode 100644
index 59da2396..00000000
--- a/resources/js/messages.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-const messages = {
- en: {
- homePage: {
- aboutUsText1: "Buh",
- aboutUsText2: "Bimb",
- },
- general: {
- to: "to",
- },
- models: {
- admin: "Admin | Admins",
- company: "Company | Companies",
- competition: "Competition | Competitions",
- competitionTeam: "Competition Team | Competition Teams",
- department: "Department | Departments",
- edition: "Edition | Editions",
- enrollment: "Enrollment | Enrollments",
- event: "Event | Events",
- eventDay: "Event Day | Event Days",
- participant: "Participant | Participants",
- product: "Product | Products",
- quest: "Quest | Quests",
- slot: "Quest Slot | Quest Slots",
- socialMedia: "Social Media | Social Media",
- speaker: "Speaker | Speakers",
- sponsor: "Sponsor | Sponsors",
- staff: "Staff | Staff",
- stand: "Stand | Stands",
- user: "User | Users",
- eventType: "Event Type | Event Types",
- },
- },
- pt: {
- homePage: {
- aboutUsText1:
- "A Semana de Informática (SINF), organizada pelo Núcleo de Informática da Associação de Estudantes da Faculdade de Engenharia da Universidade do Porto (NIAEFEUP), foi criada com o intuito de permitir aos participantes desenvolver as suas capacidades nas diversas áreas da Informática, promovendo a sua interação com o mundo empresarial através de eventos sociais.",
- aboutUsText2:
- "A edição de 2023 decorre entre os dias 25 e 31 de outubro. Os participantes têm a seu dispor palestras e workshops onde entrarão em contacto com diversas tecnologias e conceitos que não intervêm no percurso académico, focando-se portanto nas skills técnicas, assim como um pitch, sessões de entrevistas e visitas a empresas, fomentando o seu contacto com empresas de topo a nível nacional e internacional, podendo desenvolver as suas soft skills.",
- },
- general: {
- to: "a",
- },
- models: {
- admin: "Administrador | Administradores",
- company: "Empresa | Empresas",
- competition: "Competição | Competições",
- competitionTeam: "Equipa de Competição | Equipas de Competição",
- department: "Departamento | Departamentos",
- edition: "Edição | Edições",
- enrollment: "Inscrição | Inscrições",
- event: "Evento | Eventos",
- eventDay: "Dia de Evento | Dias de Evento",
- participant: "Participante | Participantes",
- product: "Produto | Produtos",
- quest: "Tarefa | Tarefas",
- slot: "Encaixe de Tarefa | Encaixes de Tarefa",
- socialMedia: "Redes Sociais | Redes Sociais",
- speaker: "Orador | Oradores",
- sponsor: "Patrocinador | Patrocinadores",
- staff: "Staff | Staff",
- stand: "Banca | Bancas",
- user: "Utilizador | Utilizadores",
- eventType: "Tipo de Evento | Tipos de Evento",
- },
- },
-};
-
-export default messages;
diff --git a/routes/web.php b/routes/web.php
index 72a2cc61..2c1f3eed 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -64,10 +64,6 @@
Route::middleware(['auth:sanctum', config('jetstream.auth_session'), 'verified'])->group(
function () {
- Route::get('/dashboard', function () {
- return Inertia::render('Dashboard');
- })->name('dashboard');
-
Route::put('/enroll', [EnrollmentController::class, 'store'])
->name('enroll');