From b5e45893cf4f0a885cb992a8b67041e1273f6972 Mon Sep 17 00:00:00 2001 From: zhengqi zhang <770166635@qq.com> Date: Wed, 10 May 2023 10:15:46 +0800 Subject: [PATCH 1/5] Add internationalization to documents --- .eslintrc.js | 1 + astro-i18next.config.ts | 5 + astro.config.ts | 2 + package-lock.json | 204 ++++++++++-- package.json | 1 + public/locales/en/translation.json | 87 +++++ public/locales/zh/translation.json | 87 +++++ src/components/Footer/NewsletterCTA.tsx | 3 +- .../Footer/NewsletterSignupForm.tsx | 5 +- src/components/Header/Header.astro | 12 +- src/components/LeftSidebar/LeftSidebar.astro | 17 +- src/config/menu.ts | 10 + src/config/sidebar.ts | 306 +++++++++--------- src/config/site.ts | 2 +- src/features/landing/components/SearchCTA.tsx | 4 +- src/features/landing/sections/HeroCTA.astro | 3 +- src/features/landing/sections/LinksCTA.astro | 13 +- .../landing/sections/NewUserCTA.astro | 5 +- src/features/landing/sections/NodesCTA.astro | 7 +- .../landing/sections/ResourcesCTA.astro | 6 +- .../landing/sections/TutorialsCTA.astro | 7 +- src/layouts/MainLayout.astro | 2 + src/pages/404.astro | 3 + src/pages/[...redirect].astro | 5 +- .../developers/alpha-testnet-contracts.md | 1 + src/pages/developers/developer-quickstart.md | 1 + .../ethereum-and-alpha-testnet-differences.md | 1 + .../guides/contract-deployment-tutorial.md | 1 + src/pages/developers/index.mdx | 1 + src/pages/developers/integrations.md | 1 + src/pages/getting-started/overview.md | 1 + src/pages/index.astro | 3 + src/pages/learn/index.mdx | 1 + src/pages/search-index.astro | 10 +- src/pages/technology/index.mdx | 1 + src/pages/user-guide/bridge.mdx | 1 + src/pages/user-guide/common-errors.md | 1 + src/pages/user-guide/faucet.md | 1 + src/pages/user-guide/index.md | 1 + src/pages/user-guide/setup.md | 1 + src/pages/user-guide/transfer-tokens.md | 1 + src/pages/zh/404.astro | 34 ++ src/pages/zh/[...redirect].astro | 30 ++ .../zh/developers/alpha-testnet-contracts.md | 68 ++++ .../zh/developers/developer-quickstart.md | 181 +++++++++++ .../ethereum-and-alpha-testnet-differences.md | 88 +++++ .../guides/contract-deployment-tutorial.md | 85 +++++ src/pages/zh/developers/index.mdx | 62 ++++ src/pages/zh/developers/integrations.md | 64 ++++ src/pages/zh/getting-started/overview.md | 149 +++++++++ src/pages/zh/index.astro | 25 ++ src/pages/zh/learn/index.mdx | 98 ++++++ src/pages/zh/search-index.astro | 42 +++ src/pages/zh/technology/index.mdx | 8 + src/pages/zh/user-guide/bridge.mdx | 95 ++++++ src/pages/zh/user-guide/common-errors.md | 40 +++ src/pages/zh/user-guide/faucet.md | 22 ++ src/pages/zh/user-guide/images/bridge1.png | Bin 0 -> 394497 bytes src/pages/zh/user-guide/images/bridge2.png | Bin 0 -> 434566 bytes src/pages/zh/user-guide/images/bridge3.png | Bin 0 -> 739661 bytes src/pages/zh/user-guide/images/bridge4.png | Bin 0 -> 445983 bytes src/pages/zh/user-guide/images/bridge5.png | Bin 0 -> 401958 bytes src/pages/zh/user-guide/images/bridge6.png | Bin 0 -> 481609 bytes src/pages/zh/user-guide/images/bridge7.png | Bin 0 -> 540366 bytes src/pages/zh/user-guide/images/bridge8.png | Bin 0 -> 480011 bytes src/pages/zh/user-guide/index.md | 34 ++ src/pages/zh/user-guide/setup.md | 31 ++ src/pages/zh/user-guide/transfer-tokens.md | 17 + 68 files changed, 1782 insertions(+), 216 deletions(-) create mode 100644 astro-i18next.config.ts create mode 100644 public/locales/en/translation.json create mode 100644 public/locales/zh/translation.json create mode 100644 src/pages/zh/404.astro create mode 100644 src/pages/zh/[...redirect].astro create mode 100644 src/pages/zh/developers/alpha-testnet-contracts.md create mode 100644 src/pages/zh/developers/developer-quickstart.md create mode 100644 src/pages/zh/developers/ethereum-and-alpha-testnet-differences.md create mode 100644 src/pages/zh/developers/guides/contract-deployment-tutorial.md create mode 100644 src/pages/zh/developers/index.mdx create mode 100644 src/pages/zh/developers/integrations.md create mode 100644 src/pages/zh/getting-started/overview.md create mode 100644 src/pages/zh/index.astro create mode 100644 src/pages/zh/learn/index.mdx create mode 100644 src/pages/zh/search-index.astro create mode 100644 src/pages/zh/technology/index.mdx create mode 100644 src/pages/zh/user-guide/bridge.mdx create mode 100644 src/pages/zh/user-guide/common-errors.md create mode 100644 src/pages/zh/user-guide/faucet.md create mode 100644 src/pages/zh/user-guide/images/bridge1.png create mode 100644 src/pages/zh/user-guide/images/bridge2.png create mode 100644 src/pages/zh/user-guide/images/bridge3.png create mode 100644 src/pages/zh/user-guide/images/bridge4.png create mode 100644 src/pages/zh/user-guide/images/bridge5.png create mode 100644 src/pages/zh/user-guide/images/bridge6.png create mode 100644 src/pages/zh/user-guide/images/bridge7.png create mode 100644 src/pages/zh/user-guide/images/bridge8.png create mode 100644 src/pages/zh/user-guide/index.md create mode 100644 src/pages/zh/user-guide/setup.md create mode 100644 src/pages/zh/user-guide/transfer-tokens.md diff --git a/.eslintrc.js b/.eslintrc.js index 8b940b611..41111af8d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -12,6 +12,7 @@ module.exports = { }, plugins: ["@typescript-eslint", "prettier"], rules: { + "no-unused-expressions": "off", "prettier/prettier": [2], }, } diff --git a/astro-i18next.config.ts b/astro-i18next.config.ts new file mode 100644 index 000000000..80e867419 --- /dev/null +++ b/astro-i18next.config.ts @@ -0,0 +1,5 @@ +/** @type {import('astro-i18next').AstroI18nextConfig} */ +export default { + defaultLocale: "en", + locales: ["en", "zh"], +} diff --git a/astro.config.ts b/astro.config.ts index 5c51ca7e9..dda7ba0f8 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -1,6 +1,7 @@ import { defineConfig } from "astro/config" import preact from "@astrojs/preact" import react from "@astrojs/react" +import astroI18next from "astro-i18next" import { astroCallouts } from "./integrations/astro-callouts" import { solidityRemixCode } from "./integrations/solidity-remix" import { youtubeEmbed } from "./integrations/youtube-embed" @@ -39,6 +40,7 @@ export default defineConfig({ // Useful if you need to define and/or import your own custom `base.css`. config: { applyBaseStyles: false }, }), + astroI18next(), ], markdown: { drafts: true, diff --git a/package-lock.json b/package-lock.json index 80fc978ae..b64491341 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@astrojs/prism": "^1.0.2", "@astrojs/tailwind": "^2.1.3", "@nanostores/preact": "^0.3.1", + "astro-i18next": "^1.0.0-beta.21", "clipboard": "^2.0.11", "ethers": "^5.7.2", "focus-trap-react": "^10.0.0", @@ -773,11 +774,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", - "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", "dependencies": { - "regenerator-runtime": "^0.13.10" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" @@ -4190,6 +4191,28 @@ "npm": ">=6.14.0" } }, + "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/node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -5615,6 +5638,14 @@ "devOptional": true, "peer": true }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -10130,6 +10161,49 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/i18next": { + "version": "22.4.15", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.15.tgz", + "integrity": "sha512-yYudtbFrrmWKLEhl6jvKUYyYunj4bTBCe2qIUYAxbXoPusY7YmdwPvOE6fx6UIfWvmlbCWDItr7wIs8KEBZ5Zg==", + "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/i18next-browser-languagedetector": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.0.1.tgz", + "integrity": "sha512-Pa5kFwaczXJAeHE56CHG2aWzFBMJNUNghf0Pm4SwSrEMps/PTKqW90EYWlIvhuYStf3Sn1K0vw+gH3+TLdkH1g==", + "dependencies": { + "@babel/runtime": "^7.19.4" + } + }, + "node_modules/i18next-fs-backend": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-2.1.1.tgz", + "integrity": "sha512-FTnj+UmNgT3YRml5ruRv0jMZDG7odOL/OP5PF5mOqvXud2vHrPOOs68Zdk6iqzL47cnnM0ZVkK2BAvpFeDJToA==" + }, + "node_modules/i18next-http-backend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.2.0.tgz", + "integrity": "sha512-Z4sM7R6tzdLknSPER9GisEBxKPg5FkI07UrQniuroZmS15PHQrcCPLyuGKj8SS68tf+O2aEDYSUnmy1TZqZSbw==", + "dependencies": { + "cross-fetch": "3.1.5" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -10909,6 +10983,14 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "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/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -11419,6 +11501,11 @@ "node": ">=4" } }, + "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": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -13558,7 +13645,6 @@ "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -14074,6 +14160,11 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", + "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==" + }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -15018,9 +15109,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", @@ -18122,8 +18213,7 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/trim-lines": { "version": "3.0.1", @@ -19192,14 +19282,12 @@ "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==", - "dev": true + "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==", - "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -20201,11 +20289,11 @@ } }, "@babel/runtime": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", - "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", "requires": { - "regenerator-runtime": "^0.13.10" + "regenerator-runtime": "^0.13.11" } }, "@babel/template": { @@ -22783,6 +22871,22 @@ } } }, + "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==", + "requires": { + "@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" + } + }, "async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", @@ -23851,6 +23955,14 @@ "devOptional": true, "peer": true }, + "cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "requires": { + "node-fetch": "2.6.7" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -27082,6 +27194,35 @@ "integrity": "sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg==", "dev": true }, + "i18next": { + "version": "22.4.15", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.15.tgz", + "integrity": "sha512-yYudtbFrrmWKLEhl6jvKUYyYunj4bTBCe2qIUYAxbXoPusY7YmdwPvOE6fx6UIfWvmlbCWDItr7wIs8KEBZ5Zg==", + "requires": { + "@babel/runtime": "^7.20.6" + } + }, + "i18next-browser-languagedetector": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.0.1.tgz", + "integrity": "sha512-Pa5kFwaczXJAeHE56CHG2aWzFBMJNUNghf0Pm4SwSrEMps/PTKqW90EYWlIvhuYStf3Sn1K0vw+gH3+TLdkH1g==", + "requires": { + "@babel/runtime": "^7.19.4" + } + }, + "i18next-fs-backend": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-2.1.1.tgz", + "integrity": "sha512-FTnj+UmNgT3YRml5ruRv0jMZDG7odOL/OP5PF5mOqvXud2vHrPOOs68Zdk6iqzL47cnnM0ZVkK2BAvpFeDJToA==" + }, + "i18next-http-backend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.2.0.tgz", + "integrity": "sha512-Z4sM7R6tzdLknSPER9GisEBxKPg5FkI07UrQniuroZmS15PHQrcCPLyuGKj8SS68tf+O2aEDYSUnmy1TZqZSbw==", + "requires": { + "cross-fetch": "3.1.5" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -27607,6 +27748,11 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "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==" + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -27999,6 +28145,11 @@ } } }, + "locale-emoji": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/locale-emoji/-/locale-emoji-0.3.0.tgz", + "integrity": "sha512-JGm8+naU49CBDnH1jksS3LecPdfWQLxFgkLN6ZhYONKa850pJ0Xt8DPGJnYK0ZuJI8jTuiDDPCDtSL3nyacXwg==" + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -29484,7 +29635,6 @@ "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, "requires": { "whatwg-url": "^5.0.0" } @@ -29845,6 +29995,11 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pathe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", + "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==" + }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -30512,9 +30667,9 @@ "peer": true }, "regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regexp.prototype.flags": { "version": "1.4.3", @@ -32895,8 +33050,7 @@ "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "trim-lines": { "version": "3.0.1", @@ -33647,14 +33801,12 @@ "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==", - "dev": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" diff --git a/package.json b/package.json index 744211bc8..a610bdcf5 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@astrojs/prism": "^1.0.2", "@astrojs/tailwind": "^2.1.3", "@nanostores/preact": "^0.3.1", + "astro-i18next": "^1.0.0-beta.21", "clipboard": "^2.0.11", "ethers": "^5.7.2", "focus-trap-react": "^10.0.0", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json new file mode 100644 index 000000000..f6a2aae06 --- /dev/null +++ b/public/locales/en/translation.json @@ -0,0 +1,87 @@ +{ + "landing": { + "test": "test", + "search": { + "title": "Welcome to the Scroll Documentation", + "placeholder": "Search Scroll documentation..." + }, + "newUserCTA": { + "title": "New to Scroll and ZK Rollups?", + "description": "Learn the basics in the Getting Started Guide." + }, + "resourcesCTA": { + "title": "Useful resources" + }, + "nodesCTA": { + "title": "Need to run your own Scroll Node?", + "description": "See the Node Operator’s Guide to learn about starting and maintaining Scroll Nodes.", + "buttonText": "Node Operator’s Guide" + }, + "TutorialsCTA": { + "title": "Watch tutorials", + "description": "Learn more about the technology we are building. We're constantly uploading new videos to our YouTube channel.", + "buttonText": "Watch tutorials" + }, + "LinksCTA": { + "card1": { + "title": "Need integration support?", + "description": "Talk to an expert once we TODO: a url" + }, + "card2": { + "title": "Discord", + "description": "Join the community" + }, + "card3": { + "title": "TODO: Discourse", + "description": "Really, join the community" + } + }, + "NewsletterCTA": { + "title": "Stay updated on the latest Scroll news", + "placeholder": "Enter your email address", + "buttonText": "Sign up" + } + }, + "sidebar": { + "gettingStarted": { + "gettingStarted": "Getting Started", + "overview": "Overview", + "alphaTestnet": "Alpha Testnet", + "userGuide": "User Guide", + "setup": "Setup", + "faucet": "Faucet", + "bridge": "Bridge", + "transferTokens": "Transfer Tokens", + "commonErrors": "Common Errors", + "rollupExplorer": "Rollup Explorer", + "alphaBlockExplorer": "Alpha Block Explorer", + "goerliBlockExplorer": "Goerli Block Explorer", + "community": "Community", + "communityForum": "Community Forum" + }, + "developers": { + "developers": "Developers", + "buildingOnScroll": "Building on Scroll", + "developerQuickstart": "Developer Quickstart", + "alphaTestnetContracts": "Alpha Testnet Contracts", + "integrations": "Integrations", + "ethereum&AlphaTestnetDifferences": "Ethereum & Alpha Testnet Differences", + "guides": "Guides", + "contractDeploymentTutorial": "Contract Deployment Tutorial", + "resources": "Resources", + "rollupExplorer": "Rollup Explorer", + "alphaBlockExplorer": "Alpha Block Explorer", + "goerliBlockExplorer": "Goerli Block Explorer" + }, + "technology": { + "overview": "Overview", + "scrollArchitecture": "Scroll Architecture" + }, + "learn": { + "zkEVMOverview": "zkEVM Overview" + }, + "infrastructure": { + "introduction": "Introduction" + } + } +} diff --git a/public/locales/zh/translation.json b/public/locales/zh/translation.json new file mode 100644 index 000000000..d5e86f7a0 --- /dev/null +++ b/public/locales/zh/translation.json @@ -0,0 +1,87 @@ +{ + "landing": { + "test": "test", + "search": { + "title": "欢迎使用Scroll文档", + "placeholder": "搜索Scroll文档..." + }, + "newUserCTA": { + "title": "Scroll 和 ZK Rollups 的新手?", + "description": "在入门指南中学习基础知识。" + }, + "resourcesCTA": { + "title": "有用的资源" + }, + "nodesCTA": { + "title": "需要运行自己的Scroll节点?", + "description": "请参阅节点操作员指南以了解有关启动和维护Scroll节点的信息。", + "buttonText": "节点操作员指南" + }, + "TutorialsCTA": { + "title": "观看教程", + "description": "详细了解我们正在构建的技术。 我们不断将新视频上传到我们的 YouTube 频道。", + "buttonText": "观看教程" + }, + "LinksCTA": { + "card1": { + "title": "需要集成支持?", + "description": "TODO 后与专家交谈:一个 url" + }, + "card2": { + "title": "Discord", + "description": "加入社区" + }, + "card3": { + "title": "TODO: Discourse", + "description": "真的,加入社区" + } + }, + "NewsletterCTA": { + "title": "随时了解最新的 Scroll 新闻", + "placeholder": "输入你的电子邮箱地址", + "buttonText": "报名" + } + }, + "sidebar": { + "gettingStarted": { + "gettingStarted": "入门", + "overview": "概述", + "alphaTestnet": "Alpha测试网络", + "userGuide": "用户指南", + "setup": "设置", + "faucet": "水龙头", + "bridge": "桥接器", + "transferTokens": "转移代币", + "commonErrors": "常见错误", + "rollupExplorer": "Rollup浏览器", + "alphaBlockExplorer": "Alpha块浏览器", + "goerliBlockExplorer": "Goerli块浏览器", + "community": "社区", + "communityForum": "社区论坛" + }, + "developers": { + "developers": "开发者", + "buildingOnScroll": "构建Scroll应用", + "developerQuickstart": "开发者快速入门", + "alphaTestnetContracts": "Alpha测试网络合约", + "integrations": "集成", + "ethereum&AlphaTestnetDifferences": "以太坊与Alpha测试网络的区别", + "guides": "指南", + "contractDeploymentTutorial": "合约部署教程", + "resources": "资源", + "rollupExplorer": "Rollup浏览器", + "alphaBlockExplorer": "Alpha块浏览器", + "goerliBlockExplorer": "Goerli块浏览器" + }, + "technology": { + "overview": "概述", + "scrollArchitecture": "Scroll架构" + }, + "learn": { + "zkEVMOverview": "zkEVM概述" + }, + "infrastructure": { + "introduction": "介绍" + } + } +} diff --git a/src/components/Footer/NewsletterCTA.tsx b/src/components/Footer/NewsletterCTA.tsx index 932a90d18..4bcfd92ca 100644 --- a/src/components/Footer/NewsletterCTA.tsx +++ b/src/components/Footer/NewsletterCTA.tsx @@ -2,11 +2,12 @@ import "./NewsletterCTA.css" import { NewsletterSignupForm } from "./NewsletterSignupForm" +import { t } from "i18next" export type NewsletterCTAProps = { title?: string } -export const NewsletterCTA = ({ title = "Stay updated on the latest Scroll news" }: NewsletterCTAProps) => { +export const NewsletterCTA = ({ title = t("landing.NewsletterCTA.title") }: NewsletterCTAProps) => { return (

{title}

diff --git a/src/components/Footer/NewsletterSignupForm.tsx b/src/components/Footer/NewsletterSignupForm.tsx index 81c32427a..da9887158 100644 --- a/src/components/Footer/NewsletterSignupForm.tsx +++ b/src/components/Footer/NewsletterSignupForm.tsx @@ -6,6 +6,7 @@ import button from "../../styles/design-system/button.module.css" import { clsx } from "~/lib" import jsonp from "jsonp" import toQueryString from "to-querystring" +import { t } from "i18next" const TAG_1 = "Developers" const TAG_2 = "Developer Docs" @@ -63,7 +64,7 @@ export const NewsletterSignupForm = () => { maxLength={256} name="Email" data-name="Email" - placeholder="Enter your email address" + placeholder={t("landing.NewsletterCTA.placeholder")} onChange={() => setIsError(false)} id="Email" required @@ -71,7 +72,7 @@ export const NewsletterSignupForm = () => { diff --git a/src/components/Header/Header.astro b/src/components/Header/Header.astro index 5ec0fcc03..d11c2584b 100644 --- a/src/components/Header/Header.astro +++ b/src/components/Header/Header.astro @@ -4,6 +4,10 @@ import { Frontmatter, MENU } from "../../config/index" import SkipToContent from "./SkipToContent.astro" import SidebarToggle from "./SidebarToggle.tsx" import Search from "./Search/Search.tsx" +import { LanguageSelector } from "astro-i18next/components" +import { localizePath } from "astro-i18next" +import i18next from "i18next" + import NotificationBanner from "~/features/notifications/components/NotificationBanner.astro" export type Props = { @@ -23,13 +27,13 @@ const section = frontmatter?.section ?? ""