Kinda i18n support, very early WIP
This commit is contained in:
parent
dd5af19ee9
commit
64a31c0daf
24 changed files with 1135 additions and 122 deletions
|
|
@ -1,16 +0,0 @@
|
||||||
import { defineAstroI18nConfig } from "astro-i18n"
|
|
||||||
|
|
||||||
export default defineAstroI18nConfig({
|
|
||||||
primaryLocale: "en", // default app locale
|
|
||||||
secondaryLocales: [], // other supported locales
|
|
||||||
fallbackLocale: "en", // fallback locale (on missing translation)
|
|
||||||
trailingSlash: "never", // "never" or "always"
|
|
||||||
run: "server", // "client+server" or "server"
|
|
||||||
showPrimaryLocale: false, // "/en/about" vs "/about"
|
|
||||||
translationLoadingRules: [], // per page group loading
|
|
||||||
translationDirectory: {}, // translation directory names
|
|
||||||
translations: {
|
|
||||||
|
|
||||||
}, // { [translation_group1]: { [locale1]: {}, ... } }
|
|
||||||
routes: {}, // { [secondary_locale1]: { about: "about-translated", ... } }
|
|
||||||
})
|
|
||||||
4
astro-i18next.config.ts
Normal file
4
astro-i18next.config.ts
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
export default {
|
||||||
|
defaultLocale: "en",
|
||||||
|
locales: ["en", "jp"],
|
||||||
|
};
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
import { defineConfig } from 'astro/config';
|
import { defineConfig } from 'astro/config';
|
||||||
|
import astroI18next from "astro-i18next";
|
||||||
|
|
||||||
import node from "@astrojs/node";
|
import node from "@astrojs/node";
|
||||||
|
|
||||||
// https://astro.build/config
|
// https://astro.build/config
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
|
integrations: [astroI18next()],
|
||||||
output: "hybrid",
|
output: "hybrid",
|
||||||
adapter: node({
|
adapter: node({
|
||||||
mode: "middleware",
|
mode: "middleware",
|
||||||
|
|
|
||||||
578
package-lock.json
generated
578
package-lock.json
generated
|
|
@ -14,10 +14,13 @@
|
||||||
"@tomphttp/bare-server-node": "^2.0.1",
|
"@tomphttp/bare-server-node": "^2.0.1",
|
||||||
"astro": "^4.1.1",
|
"astro": "^4.1.1",
|
||||||
"astro-i18n": "^2.2.4",
|
"astro-i18n": "^2.2.4",
|
||||||
|
"astro-i18next": "^1.0.0-beta.21",
|
||||||
"compression": "^1.7.4",
|
"compression": "^1.7.4",
|
||||||
"dotenv": "^16.3.1",
|
"dotenv": "^16.3.1",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
"i": "^0.3.7",
|
"i": "^0.3.7",
|
||||||
|
"i18next": "^23.7.18",
|
||||||
|
"i18next-browser-languagedetector": "^7.2.0",
|
||||||
"npm": "^10.2.5",
|
"npm": "^10.2.5",
|
||||||
"typescript": "^5.3.3"
|
"typescript": "^5.3.3"
|
||||||
}
|
}
|
||||||
|
|
@ -465,6 +468,17 @@
|
||||||
"@babel/core": "^7.0.0-0"
|
"@babel/core": "^7.0.0-0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@babel/runtime": {
|
||||||
|
"version": "7.23.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz",
|
||||||
|
"integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==",
|
||||||
|
"dependencies": {
|
||||||
|
"regenerator-runtime": "^0.14.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.9.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@babel/template": {
|
"node_modules/@babel/template": {
|
||||||
"version": "7.22.15",
|
"version": "7.22.15",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
|
||||||
|
|
@ -1414,6 +1428,26 @@
|
||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@proload/core": {
|
||||||
|
"version": "0.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@proload/core/-/core-0.3.3.tgz",
|
||||||
|
"integrity": "sha512-7dAFWsIK84C90AMl24+N/ProHKm4iw0akcnoKjRvbfHifJZBLhaDsDus1QJmhG12lXj4e/uB/8mB/0aduCW+NQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"deepmerge": "^4.2.2",
|
||||||
|
"escalade": "^3.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@proload/plugin-tsm": {
|
||||||
|
"version": "0.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@proload/plugin-tsm/-/plugin-tsm-0.2.1.tgz",
|
||||||
|
"integrity": "sha512-Ex1sL2BxU+g8MHdAdq9SZKz+pU34o8Zcl9PHWo2WaG9hrnlZme607PU6gnpoAYsDBpHX327+eu60wWUk+d/b+A==",
|
||||||
|
"dependencies": {
|
||||||
|
"tsm": "^2.1.4"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@proload/core": "^0.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||||
"version": "4.9.4",
|
"version": "4.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.4.tgz",
|
||||||
|
|
@ -2003,6 +2037,50 @@
|
||||||
"esbuild": "0.x"
|
"esbuild": "0.x"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/astro-i18next": {
|
||||||
|
"version": "1.0.0-beta.21",
|
||||||
|
"resolved": "https://registry.npmjs.org/astro-i18next/-/astro-i18next-1.0.0-beta.21.tgz",
|
||||||
|
"integrity": "sha512-1YPqwexumHpK/d9afEoi52CBFTu6k4MYv/oHjsaAasZDvFClU6U5VPttC/OgZcXRYggCM6ee2LOnyHqlmXOeLA==",
|
||||||
|
"dependencies": {
|
||||||
|
"@proload/core": "^0.3.3",
|
||||||
|
"@proload/plugin-tsm": "^0.2.1",
|
||||||
|
"i18next": "^22.4.10",
|
||||||
|
"i18next-browser-languagedetector": "^7.0.1",
|
||||||
|
"i18next-fs-backend": "^2.1.1",
|
||||||
|
"i18next-http-backend": "^2.1.1",
|
||||||
|
"iso-639-1": "^2.1.15",
|
||||||
|
"locale-emoji": "^0.3.0",
|
||||||
|
"pathe": "^1.1.0"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"astro-i18next": "dist/cli/index.js"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"astro": ">=1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/astro-i18next/node_modules/i18next": {
|
||||||
|
"version": "22.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz",
|
||||||
|
"integrity": "sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "individual",
|
||||||
|
"url": "https://locize.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "individual",
|
||||||
|
"url": "https://locize.com/i18next.html"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "individual",
|
||||||
|
"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/runtime": "^7.20.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/async-exit-hook": {
|
"node_modules/async-exit-hook": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
|
||||||
|
|
@ -2676,6 +2754,14 @@
|
||||||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||||
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
|
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
|
||||||
},
|
},
|
||||||
|
"node_modules/cross-fetch": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
|
||||||
|
"dependencies": {
|
||||||
|
"node-fetch": "^2.6.12"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/cross-spawn": {
|
"node_modules/cross-spawn": {
|
||||||
"version": "7.0.3",
|
"version": "7.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||||
|
|
@ -2734,6 +2820,14 @@
|
||||||
"url": "https://github.com/sponsors/wooorm"
|
"url": "https://github.com/sponsors/wooorm"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/deepmerge": {
|
||||||
|
"version": "4.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
|
||||||
|
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/define-data-property": {
|
"node_modules/define-data-property": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
|
||||||
|
|
@ -2931,6 +3025,306 @@
|
||||||
"@esbuild/win32-x64": "0.19.11"
|
"@esbuild/win32-x64": "0.19.11"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/esbuild-android-64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"android"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-android-arm64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"android"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-darwin-64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-darwin-arm64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-freebsd-64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"freebsd"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-freebsd-arm64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"freebsd"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-linux-32": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==",
|
||||||
|
"cpu": [
|
||||||
|
"ia32"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-linux-64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-linux-arm": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==",
|
||||||
|
"cpu": [
|
||||||
|
"arm"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-linux-arm64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-linux-mips64le": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==",
|
||||||
|
"cpu": [
|
||||||
|
"mips64el"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-linux-ppc64le": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==",
|
||||||
|
"cpu": [
|
||||||
|
"ppc64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-linux-riscv64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==",
|
||||||
|
"cpu": [
|
||||||
|
"riscv64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-linux-s390x": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==",
|
||||||
|
"cpu": [
|
||||||
|
"s390x"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-netbsd-64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"netbsd"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-openbsd-64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"openbsd"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-sunos-64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"sunos"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-windows-32": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==",
|
||||||
|
"cpu": [
|
||||||
|
"ia32"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-windows-64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-windows-arm64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/escalade": {
|
"node_modules/escalade": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
|
||||||
|
|
@ -3618,6 +4012,49 @@
|
||||||
"node": ">=0.4"
|
"node": ">=0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/i18next": {
|
||||||
|
"version": "23.7.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/i18next/-/i18next-23.7.18.tgz",
|
||||||
|
"integrity": "sha512-b9N2KjRCYQNlUvE1Kc83g8knyUkL5NiZQOp9BsTR/v/LXk6Fzz+doOzTg2/826XK28mCgBkYLNAtixjE58qpCw==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "individual",
|
||||||
|
"url": "https://locize.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "individual",
|
||||||
|
"url": "https://locize.com/i18next.html"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "individual",
|
||||||
|
"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/runtime": "^7.23.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/i18next-browser-languagedetector": {
|
||||||
|
"version": "7.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.0.tgz",
|
||||||
|
"integrity": "sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==",
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/runtime": "^7.23.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/i18next-fs-backend": {
|
||||||
|
"version": "2.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-2.3.1.tgz",
|
||||||
|
"integrity": "sha512-tvfXskmG/9o+TJ5Fxu54sSO5OkY6d+uMn+K6JiUGLJrwxAVfer+8V3nU8jq3ts9Pe5lXJv4b1N7foIjJ8Iy2Gg=="
|
||||||
|
},
|
||||||
|
"node_modules/i18next-http-backend": {
|
||||||
|
"version": "2.4.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.4.2.tgz",
|
||||||
|
"integrity": "sha512-wKrgGcaFQ4EPjfzBTjzMU0rbFTYpa0S5gv9N/d8WBmWS64+IgJb7cHddMvV+tUkse7vUfco3eVs2lB+nJhPo3w==",
|
||||||
|
"dependencies": {
|
||||||
|
"cross-fetch": "4.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/iconv-lite": {
|
"node_modules/iconv-lite": {
|
||||||
"version": "0.4.24",
|
"version": "0.4.24",
|
||||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
||||||
|
|
@ -3862,6 +4299,14 @@
|
||||||
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
|
||||||
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
|
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
|
||||||
},
|
},
|
||||||
|
"node_modules/iso-639-1": {
|
||||||
|
"version": "2.1.15",
|
||||||
|
"resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-2.1.15.tgz",
|
||||||
|
"integrity": "sha512-7c7mBznZu2ktfvyT582E2msM+Udc1EjOyhVRE/0ZsjD9LBtWSm23h3PtiRh2a35XoUsTQQjJXaJzuLjXsOdFDg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/js-tokens": {
|
"node_modules/js-tokens": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
||||||
|
|
@ -3955,6 +4400,11 @@
|
||||||
"js-yaml": "bin/js-yaml.js"
|
"js-yaml": "bin/js-yaml.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/locale-emoji": {
|
||||||
|
"version": "0.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/locale-emoji/-/locale-emoji-0.3.0.tgz",
|
||||||
|
"integrity": "sha512-JGm8+naU49CBDnH1jksS3LecPdfWQLxFgkLN6ZhYONKa850pJ0Xt8DPGJnYK0ZuJI8jTuiDDPCDtSL3nyacXwg=="
|
||||||
|
},
|
||||||
"node_modules/locate-path": {
|
"node_modules/locate-path": {
|
||||||
"version": "6.0.0",
|
"version": "6.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
|
||||||
|
|
@ -4964,6 +5414,25 @@
|
||||||
"url": "https://opencollective.com/unified"
|
"url": "https://opencollective.com/unified"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/node-fetch": {
|
||||||
|
"version": "2.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
|
||||||
|
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
|
||||||
|
"dependencies": {
|
||||||
|
"whatwg-url": "^5.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "4.x || >=6.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"encoding": "^0.1.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"encoding": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/node-releases": {
|
"node_modules/node-releases": {
|
||||||
"version": "2.0.14",
|
"version": "2.0.14",
|
||||||
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
|
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
|
||||||
|
|
@ -7974,6 +8443,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz",
|
||||||
"integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw=="
|
"integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw=="
|
||||||
},
|
},
|
||||||
|
"node_modules/pathe": {
|
||||||
|
"version": "1.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
|
||||||
|
"integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
|
||||||
|
},
|
||||||
"node_modules/picocolors": {
|
"node_modules/picocolors": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
|
||||||
|
|
@ -8248,6 +8722,11 @@
|
||||||
"node": ">=8.10.0"
|
"node": ">=8.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/regenerator-runtime": {
|
||||||
|
"version": "0.14.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
|
||||||
|
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
|
||||||
|
},
|
||||||
"node_modules/rehype": {
|
"node_modules/rehype": {
|
||||||
"version": "13.0.1",
|
"version": "13.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.1.tgz",
|
||||||
|
|
@ -9343,6 +9822,11 @@
|
||||||
"node": ">=0.6"
|
"node": ">=0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/tr46": {
|
||||||
|
"version": "0.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||||
|
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
|
||||||
|
},
|
||||||
"node_modules/trim-lines": {
|
"node_modules/trim-lines": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
|
||||||
|
|
@ -9386,6 +9870,86 @@
|
||||||
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
|
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
"node_modules/tsm": {
|
||||||
|
"version": "2.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/tsm/-/tsm-2.3.0.tgz",
|
||||||
|
"integrity": "sha512-++0HFnmmR+gMpDtKTnW3XJ4yv9kVGi20n+NfyQWB9qwJvTaIWY9kBmzek2YUQK5APTQ/1DTrXmm4QtFPmW9Rzw==",
|
||||||
|
"dependencies": {
|
||||||
|
"esbuild": "^0.15.16"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"tsm": "bin.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/tsm/node_modules/@esbuild/android-arm": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==",
|
||||||
|
"cpu": [
|
||||||
|
"arm"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"android"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/tsm/node_modules/@esbuild/linux-loong64": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==",
|
||||||
|
"cpu": [
|
||||||
|
"loong64"
|
||||||
|
],
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/tsm/node_modules/esbuild": {
|
||||||
|
"version": "0.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
|
||||||
|
"integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==",
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"bin": {
|
||||||
|
"esbuild": "bin/esbuild"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@esbuild/android-arm": "0.15.18",
|
||||||
|
"@esbuild/linux-loong64": "0.15.18",
|
||||||
|
"esbuild-android-64": "0.15.18",
|
||||||
|
"esbuild-android-arm64": "0.15.18",
|
||||||
|
"esbuild-darwin-64": "0.15.18",
|
||||||
|
"esbuild-darwin-arm64": "0.15.18",
|
||||||
|
"esbuild-freebsd-64": "0.15.18",
|
||||||
|
"esbuild-freebsd-arm64": "0.15.18",
|
||||||
|
"esbuild-linux-32": "0.15.18",
|
||||||
|
"esbuild-linux-64": "0.15.18",
|
||||||
|
"esbuild-linux-arm": "0.15.18",
|
||||||
|
"esbuild-linux-arm64": "0.15.18",
|
||||||
|
"esbuild-linux-mips64le": "0.15.18",
|
||||||
|
"esbuild-linux-ppc64le": "0.15.18",
|
||||||
|
"esbuild-linux-riscv64": "0.15.18",
|
||||||
|
"esbuild-linux-s390x": "0.15.18",
|
||||||
|
"esbuild-netbsd-64": "0.15.18",
|
||||||
|
"esbuild-openbsd-64": "0.15.18",
|
||||||
|
"esbuild-sunos-64": "0.15.18",
|
||||||
|
"esbuild-windows-32": "0.15.18",
|
||||||
|
"esbuild-windows-64": "0.15.18",
|
||||||
|
"esbuild-windows-arm64": "0.15.18"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/type-fest": {
|
"node_modules/type-fest": {
|
||||||
"version": "2.19.0",
|
"version": "2.19.0",
|
||||||
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
|
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
|
||||||
|
|
@ -9906,6 +10470,20 @@
|
||||||
"url": "https://github.com/sponsors/wooorm"
|
"url": "https://github.com/sponsors/wooorm"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/webidl-conversions": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
|
||||||
|
},
|
||||||
|
"node_modules/whatwg-url": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
|
||||||
|
"dependencies": {
|
||||||
|
"tr46": "~0.0.3",
|
||||||
|
"webidl-conversions": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/which": {
|
"node_modules/which": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,7 @@
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node .",
|
"start": "node .",
|
||||||
"build": "astro build",
|
"build": "astro build"
|
||||||
"i18n:extract": "astro-i18n extract",
|
|
||||||
"i18n:generate:pages": "astro-i18n generate:pages --purge",
|
|
||||||
"i18n:generate:types": "astro-i18n generate:types",
|
|
||||||
"i18n:sync": "npm run i18n:generate:pages && npm run i18n:generate:types"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/check": "^0.4.0",
|
"@astrojs/check": "^0.4.0",
|
||||||
|
|
@ -17,10 +13,13 @@
|
||||||
"@tomphttp/bare-server-node": "^2.0.1",
|
"@tomphttp/bare-server-node": "^2.0.1",
|
||||||
"astro": "^4.1.1",
|
"astro": "^4.1.1",
|
||||||
"astro-i18n": "^2.2.4",
|
"astro-i18n": "^2.2.4",
|
||||||
|
"astro-i18next": "^1.0.0-beta.21",
|
||||||
"compression": "^1.7.4",
|
"compression": "^1.7.4",
|
||||||
"dotenv": "^16.3.1",
|
"dotenv": "^16.3.1",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
"i": "^0.3.7",
|
"i": "^0.3.7",
|
||||||
|
"i18next": "^23.7.18",
|
||||||
|
"i18next-browser-languagedetector": "^7.2.0",
|
||||||
"npm": "^10.2.5",
|
"npm": "^10.2.5",
|
||||||
"typescript": "^5.3.3"
|
"typescript": "^5.3.3"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
5
public/locales/jp/translation.json
Normal file
5
public/locales/jp/translation.json
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"brand": "アルー",
|
||||||
|
"games": "ゲーム",
|
||||||
|
"settings": "設定"
|
||||||
|
}
|
||||||
|
|
@ -35,6 +35,7 @@ const { buttonNameDefault, dropdownList, id } = Astro.props;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
min-width: 140px;
|
min-width: 140px;
|
||||||
|
height: 50px;
|
||||||
}
|
}
|
||||||
.dropdown-menu {
|
.dropdown-menu {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,17 @@
|
||||||
---
|
---
|
||||||
import { t } from "astro-i18n"
|
import { getLangFromUrl, useTranslations } from "../i18n/utils"
|
||||||
|
const lang = getLangFromUrl(Astro.url);
|
||||||
|
const t = useTranslations(lang);
|
||||||
---
|
---
|
||||||
|
|
||||||
<div class="top-header">
|
<div class="top-header">
|
||||||
<div id="title-background" class="title-background">
|
<div id="title-background" class="title-background">
|
||||||
<div class="left">
|
<div class="left">
|
||||||
<a href="/" class="header-item">{t("nav.brand")}</a>
|
<a href={`/${lang}/`} class="header-item">{t("nav.brand")}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="right">
|
<div class="right">
|
||||||
<a href="/games/" class="header-item">Games</a>
|
<a href={`/${lang}/games/`} class="header-item">{t("nav.games")}</a>
|
||||||
<a href="/settings/" class="header-item">Settings</a>
|
<a href={`/${lang}/settings/`} class="header-item">{t("nav.settings")}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
206
src/env.d.ts
vendored
206
src/env.d.ts
vendored
|
|
@ -1 +1,205 @@
|
||||||
/// <reference types="astro/client" />
|
/// <reference types="astro/client" />
|
||||||
|
|
||||||
|
// ###> astro-i18n/type-generation ###
|
||||||
|
type PrimaryLocale = "en"
|
||||||
|
type SecondaryLocale = ""
|
||||||
|
type Locale = PrimaryLocale | SecondaryLocale
|
||||||
|
type RouteParameters = {"/games":undefined;"/":undefined;"/settings":undefined;"/404":undefined;}
|
||||||
|
type Route = keyof RouteParameters
|
||||||
|
type TranslationVariables = {"nav.brand":object|undefined;"nav.games":object|undefined;"nav.settings":object|undefined;}
|
||||||
|
type Translation = keyof TranslationVariables
|
||||||
|
type Environment = "none"|"node"|"browser"
|
||||||
|
declare module "astro-i18n" {
|
||||||
|
type GetStaticPathsProps = {paginate:Function;rss:Function}
|
||||||
|
type GetStaticPathsItem = {params:Record<string,number|string|undefined>;props?:Record<string,unknown>}
|
||||||
|
type DeepStringRecord = {[key: string]:string|DeepStringRecord}
|
||||||
|
type TranslationDirectory = {i18n?:string;pages?: string}
|
||||||
|
export type Translations = {[group: string]:{[locale: string]: DeepStringRecord}}
|
||||||
|
export type TranslationFormatters = {[formatterName: string]:(value:unknown,...args:unknown[])=>unknown}
|
||||||
|
export type TranslationLoadingRules = {groups:string[];routes: string[]}[]
|
||||||
|
export type SegmentTranslations = {[secondaryLocale: string]:{[segment: string]:string}}
|
||||||
|
export interface AstroI18nConfig {primaryLocale:string;secondaryLocales:string[];fallbackLocale:string;showPrimaryLocale:boolean;trailingSlash:"always"|"never";run:"server"|"client+server";translations:Translations;translationLoadingRules:TranslationLoadingRules;translationDirectory:TranslationDirectory;routes:SegmentTranslations;srcDir:string;}
|
||||||
|
/** Typed astro-i18n config definition. */
|
||||||
|
export function defineAstroI18nConfig(config: Partial<AstroI18nConfig>): Partial<AstroI18nConfig>
|
||||||
|
/** The `astro-i18n` middleware. */
|
||||||
|
export function useAstroI18n(
|
||||||
|
config?: Partial<AstroI18nConfig> | string,
|
||||||
|
formatters?: TranslationFormatters,
|
||||||
|
): (...args: any[]) => any
|
||||||
|
/** Workaround function to make astroI18n work inside getStaticPaths. This is because Astro's getStaticPaths runs before everything which doesn't allows astroI18n to update its state automatically. */
|
||||||
|
function createGetStaticPaths(
|
||||||
|
callback: (
|
||||||
|
props: GetStaticPathsProps,
|
||||||
|
) => GetStaticPathsItem[] | Promise<GetStaticPathsItem[]>,
|
||||||
|
): (props: GetStaticPathsProps & {
|
||||||
|
astroI18n?: {
|
||||||
|
locale: string;
|
||||||
|
};
|
||||||
|
}) => Promise<GetStaticPathsItem[]>
|
||||||
|
/**
|
||||||
|
* @param key The translation key, for example `"my.nested.translation.key"`.
|
||||||
|
* @param properties An object containing your interpolation variables and/or your variants, for example `{ variant: 3, interpolation: "text" }`.
|
||||||
|
* @param options `route`: Overrides the current route, you will be able to access that route's translations. `locale`: Overrides the current locale, this allows you to control which language you want to translate to. `fallbackLocale`: Overrides the fallback locale.
|
||||||
|
*/
|
||||||
|
export function t<T extends Translation>(
|
||||||
|
key: T | string & {},
|
||||||
|
...args: undefined extends TranslationVariables[T]
|
||||||
|
? [
|
||||||
|
properties?: keyof TranslationVariables extends T
|
||||||
|
? Record<string, unknown>
|
||||||
|
: TranslationVariables[T],
|
||||||
|
options?: {
|
||||||
|
route?: Route | string & {}
|
||||||
|
locale?: Locale | string & {}
|
||||||
|
fallbackLocale?: Locale | string & {}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
properties: TranslationVariables[T],
|
||||||
|
options?: {
|
||||||
|
route?: Route | string & {}
|
||||||
|
locale?: Locale | string & {}
|
||||||
|
fallbackLocale?: Locale | string & {}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
): string
|
||||||
|
/**
|
||||||
|
* @param route A route in any of the configured languages, for example `"/en/my/english/route/[param]"`.
|
||||||
|
* @param parameters An object containing your route parameters, for example `{ slug: "my-blog-post-slug" }`.
|
||||||
|
* @param options `targetLocale`: Overrides the target locale. `routeLocale`: Overrides the given route locale, this is useful if astro-i18n cannot figure out the route's locale. `showPrimaryLocale`: Overrides the showPrimaryLocale parameter. `query`: Adds these query parameters at the end of the translated route.
|
||||||
|
*/
|
||||||
|
export function l<T extends Route>(
|
||||||
|
route: T | string & {},
|
||||||
|
...args: T extends keyof RouteParameters
|
||||||
|
? undefined extends RouteParameters[T]
|
||||||
|
? [
|
||||||
|
parameters?: Record<string, string>,
|
||||||
|
options?: {
|
||||||
|
targetLocale?: string,
|
||||||
|
routeLocale?: string,
|
||||||
|
showPrimaryLocale?: string,
|
||||||
|
query?: Record<string, unknown>
|
||||||
|
}
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
parameters: RouteParameters[T],
|
||||||
|
options?: {
|
||||||
|
targetLocale?: string,
|
||||||
|
routeLocale?: string,
|
||||||
|
showPrimaryLocale?: string,
|
||||||
|
query?: Record<string, unknown>
|
||||||
|
}
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
parameters?: Record<string, string>,
|
||||||
|
options?: {
|
||||||
|
targetLocale?: string,
|
||||||
|
routeLocale?: string,
|
||||||
|
showPrimaryLocale?: string,
|
||||||
|
query?: Record<string, unknown>
|
||||||
|
}
|
||||||
|
]
|
||||||
|
): string
|
||||||
|
class AstroI18n {
|
||||||
|
/** The detected runtime environment. */
|
||||||
|
environment: Environment
|
||||||
|
/** The current page route. */
|
||||||
|
route: string
|
||||||
|
/** All page routes. For example: `["/", "/about", "/posts/[slug]"]` */
|
||||||
|
pages: string[]
|
||||||
|
/** The equivalent page for the current route. For example if route is equal to `"/posts/my-cool-cat"` this could return `"/posts/[slug]"`. */
|
||||||
|
page: string
|
||||||
|
/** The current page locale. */
|
||||||
|
locale: Locale
|
||||||
|
/** All configured locales. */
|
||||||
|
locales: Locale[]
|
||||||
|
/** The default/primary locale. */
|
||||||
|
primaryLocale: PrimaryLocale
|
||||||
|
/** Locales other than the default/primary one. */
|
||||||
|
secondaryLocales: SecondaryLocale[]
|
||||||
|
/** The fallback locale, when a translation is missing in a locale the fallback locale will be used to find a replacement. */
|
||||||
|
fallbackLocale: Locale
|
||||||
|
/** True when astro-i18n is initialized. */
|
||||||
|
isInitialized: boolean
|
||||||
|
/**
|
||||||
|
* @param key The translation key, for example `"my.nested.translation.key"`.
|
||||||
|
* @param properties An object containing your interpolation variables and/or your variants, for example `{ variant: 3, interpolation: "text" }`.
|
||||||
|
* @param options `route`: Overrides the current route, you will be able to access that route's translations. `locale`: Overrides the current locale, this allows you to control which language you want to translate to. `fallbackLocale`: Overrides the fallback locale.
|
||||||
|
*/
|
||||||
|
t<T extends Translation>(
|
||||||
|
key: T | string & {},
|
||||||
|
...args: undefined extends TranslationVariables[T]
|
||||||
|
? [
|
||||||
|
properties?: keyof TranslationVariables extends T
|
||||||
|
? Record<string, unknown>
|
||||||
|
: TranslationVariables[T],
|
||||||
|
options?: {
|
||||||
|
route?: Route | string & {}
|
||||||
|
locale?: Locale | string & {}
|
||||||
|
fallbackLocale?: Locale | string & {}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
properties: TranslationVariables[T],
|
||||||
|
options?: {
|
||||||
|
route?: Route | string & {}
|
||||||
|
locale?: Locale | string & {}
|
||||||
|
fallbackLocale?: Locale | string & {}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
): string
|
||||||
|
/**
|
||||||
|
* @param route A route in any of the configured languages, for example `"/en/my/english/route/[param]"`.
|
||||||
|
* @param parameters An object containing your route parameters, for example `{ slug: "my-blog-post-slug" }`.
|
||||||
|
* @param options `targetLocale`: Overrides the target locale. `routeLocale`: Overrides the given route locale, this is useful if astro-i18n cannot figure out the route's locale. `showPrimaryLocale`: Overrides the showPrimaryLocale parameter. `query`: Adds these query parameters at the end of the translated route.
|
||||||
|
*/
|
||||||
|
l<T extends Route>(
|
||||||
|
route: T | string & {},
|
||||||
|
...args: T extends keyof RouteParameters
|
||||||
|
? undefined extends RouteParameters[T]
|
||||||
|
? [
|
||||||
|
parameters?: Record<string, string>,
|
||||||
|
options?: {
|
||||||
|
targetLocale?: string,
|
||||||
|
routeLocale?: string,
|
||||||
|
showPrimaryLocale?: string,
|
||||||
|
query?: Record<string, unknown>
|
||||||
|
}
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
parameters: RouteParameters[T],
|
||||||
|
options?: {
|
||||||
|
targetLocale?: string,
|
||||||
|
routeLocale?: string,
|
||||||
|
showPrimaryLocale?: string,
|
||||||
|
query?: Record<string, unknown>
|
||||||
|
}
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
parameters?: Record<string, string>,
|
||||||
|
options?: {
|
||||||
|
targetLocale?: string,
|
||||||
|
routeLocale?: string,
|
||||||
|
showPrimaryLocale?: string,
|
||||||
|
query?: Record<string, unknown>
|
||||||
|
}
|
||||||
|
]
|
||||||
|
): string
|
||||||
|
/** Adds new translations at runtime. */
|
||||||
|
addTranslations(translations: Translations): this
|
||||||
|
/** Adds new translation formatters at runtime. */
|
||||||
|
addFormatters(translationFormatters: TranslationFormatters): this
|
||||||
|
/** Adds new translation loading rules at runtime. */
|
||||||
|
addTranslationLoadingRules(translationLoadingRules: TranslationLoadingRules): this
|
||||||
|
/** Adds new route segment translations at runtime. */
|
||||||
|
addRoutes(routes: SegmentTranslations): this
|
||||||
|
/** Tries to parse one of the configured locales out of the given route. If no configured locale is found it will return `null`. */
|
||||||
|
extractRouteLocale(route: string): string|null
|
||||||
|
/** Initializes astro-i18n on the server-side. */
|
||||||
|
initialize(config?: Partial<AstroI18nConfig> | string, formatters?: TranslationFormatters = {}): Promise<void>
|
||||||
|
/** Redirects the user to the given destination. */
|
||||||
|
redirect(destination: string | URL, status = 301)
|
||||||
|
}
|
||||||
|
export const astroI18n: AstroI18n
|
||||||
|
}
|
||||||
|
// ###< astro-i18n/type-generation ###
|
||||||
|
|
|
||||||
19
src/i18n/ui.ts
Normal file
19
src/i18n/ui.ts
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
export const languages = {
|
||||||
|
en: 'English',
|
||||||
|
jp: "日本語",
|
||||||
|
};
|
||||||
|
|
||||||
|
export const defaultLang = 'en';
|
||||||
|
|
||||||
|
export const ui = {
|
||||||
|
en: {
|
||||||
|
'nav.brand': 'Alu',
|
||||||
|
'nav.games': "Games",
|
||||||
|
'nav.settings': "Settings",
|
||||||
|
},
|
||||||
|
jp: {
|
||||||
|
'nav.brand': 'アルー',
|
||||||
|
'nav.games': "ゲーム",
|
||||||
|
'nav.settings': "設定",
|
||||||
|
},
|
||||||
|
} as const;
|
||||||
13
src/i18n/utils.ts
Normal file
13
src/i18n/utils.ts
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
import { ui, defaultLang } from './ui';
|
||||||
|
|
||||||
|
export function getLangFromUrl(url: URL) {
|
||||||
|
const [, lang] = url.pathname.split('/');
|
||||||
|
if (lang in ui) return lang as keyof typeof ui;
|
||||||
|
return defaultLang;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useTranslations(lang: keyof typeof ui) {
|
||||||
|
return function t(key: keyof typeof ui[typeof defaultLang]) {
|
||||||
|
return ui[lang][key] || ui[defaultLang][key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -9,8 +9,11 @@ interface Props {
|
||||||
}
|
}
|
||||||
|
|
||||||
const { title } = Astro.props;
|
const { title } = Astro.props;
|
||||||
|
|
||||||
|
import i18next from 'i18next';
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
|
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
import { sequence } from "astro/middleware"
|
|
||||||
import config from "../../astro-i18n.config.ts"
|
|
||||||
import { useAstroI18n } from "astro-i18n"
|
|
||||||
|
|
||||||
const astroI18n = useAstroI18n(
|
|
||||||
config,
|
|
||||||
undefined /* custom formatters */,
|
|
||||||
)
|
|
||||||
|
|
||||||
export const onRequest = sequence(astroI18n)
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
---
|
---
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout title="404 | Alu">
|
<Layout title="404 | Alu">
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
---
|
---
|
||||||
import Layout from "../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
import Footer from "../components/Footer.astro";
|
import GameItem from "../../components/GameItem.astro";
|
||||||
import GameItem from "../components/GameItem.astro";
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout title="Games | Alu">
|
<Layout title="Games | Alu">
|
||||||
64
src/pages/en/index.astro
Normal file
64
src/pages/en/index.astro
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
---
|
||||||
|
import Layout from "../../layouts/Layout.astro";
|
||||||
|
import UVRegistrar from "../../components/UVRegistrar.astro";
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title="Alu">
|
||||||
|
<div class="main-content">
|
||||||
|
<h1 class="title-text">Welcome to Alu</h1>
|
||||||
|
<form class="url-input-form" id="url-input-form">
|
||||||
|
<input class="url-input" type="text" placeholder="Search...">
|
||||||
|
<div id="loading-content">Loading...</div>
|
||||||
|
<div id="top-bar"></div>
|
||||||
|
<iframe title="proxy-iframe" id="proxy-frame"></iframe>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<UVRegistrar></UVRegistrar>
|
||||||
|
</Layout>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
form {
|
||||||
|
width: 30%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-text {
|
||||||
|
font-size: 38px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.url-input-form {
|
||||||
|
border: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.url-input {
|
||||||
|
display: block;
|
||||||
|
background: transparent url("/img/search.svg") no-repeat 13px center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.url-input {
|
||||||
|
background-color: #080808;
|
||||||
|
color: #D8DEE9;
|
||||||
|
border: 3px solid white;
|
||||||
|
border-radius: 30px;
|
||||||
|
padding: 15px;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
transition: 400ms ease-out;
|
||||||
|
outline: none;
|
||||||
|
font-family: 'Varela Round', sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.url-input::placeholder {
|
||||||
|
color: #D8DEE9;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loading-content {
|
||||||
|
color: white;
|
||||||
|
padding: 8px;
|
||||||
|
position: relative;
|
||||||
|
opacity: 0;
|
||||||
|
transition: 250ms ease-in-out;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
15
src/pages/en/settings.astro
Normal file
15
src/pages/en/settings.astro
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
---
|
||||||
|
import SettingsTablist from "../../components/SettingsTablist.astro";
|
||||||
|
import Layout from "../../layouts/Layout.astro";
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title="Settings | Alu">
|
||||||
|
<h1 class="title-text">Settings</h1>
|
||||||
|
<SettingsTablist />
|
||||||
|
</Layout>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
h1 {
|
||||||
|
font-size: 40px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -1,68 +1,26 @@
|
||||||
---
|
---
|
||||||
import Layout from '../layouts/Layout.astro';
|
import { ViewTransitions } from "astro:transitions";
|
||||||
import UVRegistrar from '../components/UVRegistrar.astro';
|
|
||||||
|
|
||||||
import { astroI18n, t } from "astro-i18n"
|
|
||||||
|
|
||||||
astroI18n.locale
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout title="Alu">
|
<!doctype html>
|
||||||
<div class="main-content">
|
<html lang="en">
|
||||||
<h1 class="title-text">Welcome to Alu</h1>
|
<head>
|
||||||
<form class="url-input-form" id="url-input-form">
|
<meta charset="UTF-8" />
|
||||||
<input class="url-input" type="text" placeholder="Search...">
|
<ViewTransitions />
|
||||||
<div id="loading-content">Loading...</div>
|
<script>
|
||||||
<div id="top-bar"></div>
|
switch (localStorage.getItem("alu__selectedLanguage")) {
|
||||||
<iframe title="proxy-iframe" id="proxy-frame"></iframe>
|
case "English":
|
||||||
</form>
|
window.location.href = "/en/";
|
||||||
</div>
|
break;
|
||||||
<UVRegistrar></UVRegistrar>
|
case "日本語":
|
||||||
</Layout>
|
window.location.href = "/jp/";
|
||||||
|
break;
|
||||||
<style>
|
default:
|
||||||
form {
|
window.location.href = "/en/";
|
||||||
width: 30%;
|
break;
|
||||||
}
|
}
|
||||||
|
</script>
|
||||||
.title-text {
|
</head>
|
||||||
font-size: 38px;
|
<body></body>
|
||||||
}
|
</html>
|
||||||
|
|
||||||
.url-input-form {
|
|
||||||
border: none;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.url-input {
|
|
||||||
display: block;
|
|
||||||
background: transparent url("/img/search.svg") no-repeat 13px center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.url-input {
|
|
||||||
background-color: #080808;
|
|
||||||
color: #D8DEE9;
|
|
||||||
border: 3px solid white;
|
|
||||||
border-radius: 30px;
|
|
||||||
padding: 15px;
|
|
||||||
width: 100%;
|
|
||||||
text-align: center;
|
|
||||||
transition: 400ms ease-out;
|
|
||||||
outline: none;
|
|
||||||
font-family: 'Varela Round', sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.url-input::placeholder {
|
|
||||||
color: #D8DEE9;
|
|
||||||
}
|
|
||||||
|
|
||||||
#loading-content {
|
|
||||||
color: white;
|
|
||||||
padding: 8px;
|
|
||||||
position: relative;
|
|
||||||
opacity: 0;
|
|
||||||
transition: 250ms ease-in-out;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
||||||
16
src/pages/jp/404.astro
Normal file
16
src/pages/jp/404.astro
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
---
|
||||||
|
import Layout from "../../layouts/Layout.astro";
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title="404 | Alu">
|
||||||
|
<div class="main-content error-page">
|
||||||
|
<h1>404!</h1>
|
||||||
|
<p>The content you have requested could not be found!</p>
|
||||||
|
</div>
|
||||||
|
</Layout>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.error-page {
|
||||||
|
color: white
|
||||||
|
}
|
||||||
|
</style>
|
||||||
92
src/pages/jp/games.astro
Normal file
92
src/pages/jp/games.astro
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
---
|
||||||
|
import Layout from "../../layouts/Layout.astro";
|
||||||
|
import GameItem from "../../components/GameItem.astro";
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title="Games | Alu">
|
||||||
|
<h1 class="title-text">Games</h1>
|
||||||
|
<div class="grid">
|
||||||
|
<GameItem name="1v1.lol" image="/games/1v1.lol/logo.png"></GameItem>
|
||||||
|
<GameItem name="2048" image="/games/2048/logo.png"></GameItem>
|
||||||
|
<GameItem name="The Backrooms" image="/games/backrooms/logo.png" slugName="backrooms"></GameItem>
|
||||||
|
<GameItem name="Baldi's Basics" image="/games/baldi/logo.png" slugName="baldi"></GameItem>
|
||||||
|
<GameItem name="Cannon Basketball 4" image="/games/cannon-basketball-4/logo.png" slugName="cannon-basketball-4"></GameItem>
|
||||||
|
<GameItem name="Cell Machine" image="/games/cell-machine/logo.png" slugName="cell-machine"></GameItem>
|
||||||
|
<GameItem name="Chrome Dino" image="/games/chrome-dino/logo.png" slugName="chrome-dino"></GameItem>
|
||||||
|
<GameItem name="Cookie Clicker" image="/games/cookie-clicker/logo.png" slugName="cookie-clicker"></GameItem>
|
||||||
|
<GameItem name="CSGO Clicker" image="/games/csgo-clicker/logo.png" slugName="csgo-clicker"></GameItem>
|
||||||
|
<GameItem name="Cut The Rope" image="/games/ctr/logo.png" slugName="ctr"></GameItem>
|
||||||
|
<GameItem name="Cut The Rope - Holiday" image="/games/ctr-holiday/logo.png" slugName="ctr-holiday"></GameItem>
|
||||||
|
<GameItem name="Cut The Rope - Time Travel" image="/games/ctr-tr/logo.png" slugName="ctr-tr"></GameItem>
|
||||||
|
<GameItem name="Death Run 3D" image="/games/death-run-3d/logo.png" slugName="death-run-3d"></GameItem>
|
||||||
|
<GameItem name="Doge Miner" image="/games/doge-miner/logo.png" slugName="doge-miner"></GameItem>
|
||||||
|
<GameItem name="Doodle Jump" image="/games/doodle-jump/logo.png" slugName="doodle-jump"></GameItem>
|
||||||
|
<GameItem name="doom" image="/games/doom/logo.png" slugName="doom"></GameItem>
|
||||||
|
<GameItem name="Draw The Hill" image="/games/draw-the-hill/logo.png" slugName="draw-the-hill"></GameItem>
|
||||||
|
<GameItem name="Evil Glitch" image="/games/evil-glitch/logo.png" slugName="evil-glitch"></GameItem>
|
||||||
|
<GameItem name="Fall Boys" image="/games/fall-boys/logo.png" slugName="fall-boys"></GameItem>
|
||||||
|
<GameItem name="Fireboy and Watergirl" image="/games/firewater/logo.png" slugName="firewater"></GameItem>
|
||||||
|
<GameItem name="Fireboy and Watergirl 2" image="/games/firewater2/logo.png" slugName="firewater2"></GameItem>
|
||||||
|
<GameItem name="Five Nights at Freddy's" image="/games/fnaf/logo.png" slugName="fnaf"></GameItem>
|
||||||
|
<GameItem name="Five Nights at Freddy's 2" image="/games/fnaf2/logo.png" slugName="fnaf2"></GameItem>
|
||||||
|
<GameItem name="Five Nights at Freddy's 3" image="/games/fnaf3/logo.png" slugName="fnaf3"></GameItem>
|
||||||
|
<GameItem name="Five Nights at Freddy's 4" image="/games/fnaf4/logo.png" slugName="fnaf4"></GameItem>
|
||||||
|
<GameItem name="Game Inside" image="/games/game-inside/logo.png" slugName="game-inside"></GameItem>
|
||||||
|
<GameItem name="Google Snake" image="/games/google-snake/logo.png" slugName="google-snake"></GameItem>
|
||||||
|
<GameItem name="Grindcraft" image="/games/grindcraft/logo.png" slugName="grindcraft"></GameItem>
|
||||||
|
<GameItem name="Idle Breakout" image="/games/idle-breakout/logo.png" slugName="idle-breakout"></GameItem>
|
||||||
|
<GameItem name="Just One Boss" image="/games/just-one-boss/logo.png" slugName="just-one-boss"></GameItem>
|
||||||
|
<GameItem name="Line Rider" image="/games/line-rider/logo.png" slugName="line-rider"></GameItem>
|
||||||
|
<GameItem name="Minecraft Classic" image="/games/minecraft-classic/logo.png" slugName="minecraft-classic"></GameItem>
|
||||||
|
<GameItem name="Minesweeper" image="/games/minesweeper/logo.png" slugName="minesweeper"></GameItem>
|
||||||
|
<GameItem name="Moto X3M" image="/games/moto-x3m/logo.png" slugName="moto-x3m"></GameItem>
|
||||||
|
<GameItem name="Moto X3M Pool Party" image="/games/moto-x3m-pool/logo.png" slugName="moto-x3m-pool"></GameItem>
|
||||||
|
<GameItem name="Moto X3M Spooky Land" image="/games/moto-x3m-spooky/logo.png" slugName="moto-x3m-spooky"></GameItem>
|
||||||
|
<GameItem name="Moto X3M Winter" image="/games/moto-x3m-winter/logo.png" slugName="moto-x3m-winter"></GameItem>
|
||||||
|
<GameItem name="osu!" image="/games/osu/logo.png" slugName="osu"></GameItem>
|
||||||
|
<GameItem name="Retro Bowl" image="/games/retro-bowl/logo.png" slugName="retro-bowl"></GameItem>
|
||||||
|
<GameItem name="Slope" image="/games/slope/logo.png" slugName="slope"></GameItem>
|
||||||
|
<GameItem name="Super Mario 64" image="/games/sm64/logo.png" slugName="sm64"></GameItem>
|
||||||
|
<GameItem name="Solitaire" image="/games/solitaire/logo.png" slugName="solitaire"></GameItem>
|
||||||
|
<GameItem name="Superhot" image="/games/superhot/logo.png" slugName="superhot"></GameItem>
|
||||||
|
<GameItem name="There is No Game" image="/games/there-is-no-game/logo.png" slugName="there-is-no-game"></GameItem>
|
||||||
|
<GameItem name="Ultima 6" image="/games/ul6/logo.png" slugName="ul6"></GameItem>
|
||||||
|
<GameItem name="Vex 3" image="/games/vex3/logo.png" slugName="vex3"></GameItem>
|
||||||
|
<GameItem name="Vex 4" image="/games/vex4/logo.png" slugName="vex4"></GameItem>
|
||||||
|
<GameItem name="Vex 5" image="/games/vex5/logo.png" slugName="vex5"></GameItem>
|
||||||
|
<GameItem name="Vex 6" image="/games/vex6/logo.png" slugName="vex6"></GameItem>
|
||||||
|
<GameItem name="World's Hardest Game" image="/games/worlds-hardest-game/logo.png" slugName="worlds-hardest-game"></GameItem>
|
||||||
|
<GameItem name="World's Hardest Game 2" image="/games/worlds-hardest-game-2/logo.png" slugName="worlds-hardest-game-2"></GameItem>
|
||||||
|
<GameItem name="You are Bezos" image="/games/you-are-bezos/logo.png" slugName="you-are-bezos"></GameItem>
|
||||||
|
</div>
|
||||||
|
</Layout>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
|
||||||
|
.grid {
|
||||||
|
color: var(--text-color);
|
||||||
|
margin-top: -10px;
|
||||||
|
height: max-content;
|
||||||
|
width: calc(100% - 60px);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
text-align: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 1rem;
|
||||||
|
margin-left: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 973px) {
|
||||||
|
.grid {
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 467px) {
|
||||||
|
.grid {
|
||||||
|
grid-template-columns: repeat(2, 1fr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
64
src/pages/jp/index.astro
Normal file
64
src/pages/jp/index.astro
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
---
|
||||||
|
import Layout from "../../layouts/Layout.astro";
|
||||||
|
import UVRegistrar from "../../components/UVRegistrar.astro";
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title="Alu">
|
||||||
|
<div class="main-content">
|
||||||
|
<h1 class="title-text">Welcome to Alu</h1>
|
||||||
|
<form class="url-input-form" id="url-input-form">
|
||||||
|
<input class="url-input" type="text" placeholder="Search...">
|
||||||
|
<div id="loading-content">Loading...</div>
|
||||||
|
<div id="top-bar"></div>
|
||||||
|
<iframe title="proxy-iframe" id="proxy-frame"></iframe>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<UVRegistrar></UVRegistrar>
|
||||||
|
</Layout>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
form {
|
||||||
|
width: 30%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-text {
|
||||||
|
font-size: 38px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.url-input-form {
|
||||||
|
border: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.url-input {
|
||||||
|
display: block;
|
||||||
|
background: transparent url("/img/search.svg") no-repeat 13px center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.url-input {
|
||||||
|
background-color: #080808;
|
||||||
|
color: #D8DEE9;
|
||||||
|
border: 3px solid white;
|
||||||
|
border-radius: 30px;
|
||||||
|
padding: 15px;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
transition: 400ms ease-out;
|
||||||
|
outline: none;
|
||||||
|
font-family: 'Varela Round', sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.url-input::placeholder {
|
||||||
|
color: #D8DEE9;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loading-content {
|
||||||
|
color: white;
|
||||||
|
padding: 8px;
|
||||||
|
position: relative;
|
||||||
|
opacity: 0;
|
||||||
|
transition: 250ms ease-in-out;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
20
src/pages/jp/settings.astro
Normal file
20
src/pages/jp/settings.astro
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
import { changeLanguage } from "i18next";
|
||||||
|
import Switch from "../../components/Switch.astro";
|
||||||
|
import SettingsTablist from "../../components/SettingsTablist.astro";
|
||||||
|
import Layout from "../../layouts/Layout.astro";
|
||||||
|
import ThemeLoader from "../../components/ThemeLoader.astro";
|
||||||
|
|
||||||
|
changeLanguage("en");
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title="Settings | Alu">
|
||||||
|
<h1 class="title-text">Settings</h1>
|
||||||
|
<SettingsTablist />
|
||||||
|
</Layout>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
h1 {
|
||||||
|
font-size: 40px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
---
|
|
||||||
import Switch from "../components/Switch.astro";
|
|
||||||
import SettingsTablist from "../components/SettingsTablist.astro";
|
|
||||||
import Layout from "../layouts/Layout.astro";
|
|
||||||
import ThemeLoader from "../components/ThemeLoader.astro";
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<Layout title="Settings | Alu">
|
|
||||||
<h1 class="title-text">Settings</h1>
|
|
||||||
<SettingsTablist />
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
h1 {
|
|
||||||
font-size: 40px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
Loading…
Add table
Reference in a new issue