From 1492ae07d20245585ab86756e19bf494529db2b8 Mon Sep 17 00:00:00 2001 From: radishzzz Date: Sun, 16 Mar 2025 23:54:03 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20refactor:=20optimize=20i18n=20lo?= =?UTF-8?q?gic=20functions=20and=20function=20naming?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pnpm-lock.yaml | 96 ++++++------ public/image/og-screenshot.png | Bin 36062 -> 0 bytes src/components/Widgets/LanguageSwitcher.astro | 6 +- src/i18n/lang.ts | 40 +---- src/i18n/path.ts | 147 +++++++----------- src/layouts/Head.astro | 2 +- src/utils/page.ts | 1 + 7 files changed, 118 insertions(+), 174 deletions(-) delete mode 100644 public/image/og-screenshot.png diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 35c51c9..ffea9ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1103,58 +1103,58 @@ packages: peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 - '@unrs/rspack-resolver-binding-darwin-arm64@1.1.1': - resolution: {integrity: sha512-myn6gHyM77Y6XXGls9Wkfuu+yexGkmhPBDmBUkThrbkXtHq38vsr7o1Dyzruiqtt/okSs0tFF9P77kI6wWF9iQ==} + '@unrs/rspack-resolver-binding-darwin-arm64@1.1.2': + resolution: {integrity: sha512-bQx2L40UF5XxsXwkD26PzuspqUbUswWVbmclmUC+c83Cv/EFrFJ1JaZj5Q5jyYglKGOtyIWY/hXTCdWRN9vT0Q==} cpu: [arm64] os: [darwin] - '@unrs/rspack-resolver-binding-darwin-x64@1.1.1': - resolution: {integrity: sha512-A/5xK8zb8lJlom+mznrp9YA8lYzHjD2QcUdQ3PkWha8x996fPjSns4ilNYHW+eGXFcEAnfVwf78q9vYf59JJmA==} + '@unrs/rspack-resolver-binding-darwin-x64@1.1.2': + resolution: {integrity: sha512-dMi9a7//BsuPTnhWEDxmdKZ6wxQlPnAob8VSjefGbKX/a+pHfTaX1pm/jv2VPdarP96IIjCKPatJS/TtLQeGQA==} cpu: [x64] os: [darwin] - '@unrs/rspack-resolver-binding-freebsd-x64@1.1.1': - resolution: {integrity: sha512-Ew3bqEa8roijTPUS8xvb1X4K8S//rw6oDGKPhwQ8WoABVrrGZtMKlUEfH1+zBduJZtJAbpiDebFhh9OEoFM9Lw==} + '@unrs/rspack-resolver-binding-freebsd-x64@1.1.2': + resolution: {integrity: sha512-RiBZQ+LSORQObfhV1yH7jGz+4sN3SDYtV53jgc8tUVvqdqVDaUm1KA3zHLffmoiYNGrYkE3sSreGC+FVpsB4Vg==} cpu: [x64] os: [freebsd] - '@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.1.1': - resolution: {integrity: sha512-9Mm53MmrXQHfrUFotM19407A/9GjtdXyo9GkF7W1pb/ZXS7j7GTpruj8txWdaQrlxg0yjhjJst/xuNMbBFi1hQ==} + '@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.1.2': + resolution: {integrity: sha512-IyKIFBtOvuPCJt1WPx9e9ovTGhZzrIbW11vWzw4aPmx3VShE+YcMpAldqQubdCep0UVKZyFt+2hQDQZwFiJ4jg==} cpu: [arm] os: [linux] - '@unrs/rspack-resolver-binding-linux-arm64-gnu@1.1.1': - resolution: {integrity: sha512-yXs9e7hk7LzNT7LFwG6pxSnzVt6feC1SjFJM6naIRgFI8/4KngY8BUjM/Xx7rCS4Iz6FnCVIolpSrNqsRHpRrg==} + '@unrs/rspack-resolver-binding-linux-arm64-gnu@1.1.2': + resolution: {integrity: sha512-RfYtlCtJrv5i6TO4dSlpbyOJX9Zbhmkqrr9hjDfr6YyE5KD0ywLRzw8UjXsohxG1XWgRpb2tvPuRYtURJwbqWg==} cpu: [arm64] os: [linux] - '@unrs/rspack-resolver-binding-linux-arm64-musl@1.1.1': - resolution: {integrity: sha512-5i/Jq2Bb3He0JYCLOBzLxj+eX57rip2fOQUZX4i7H/ReZm9U64vVmWGNq7HlC0kNGo5AhGtRXCg5HbsBiBsyBw==} + '@unrs/rspack-resolver-binding-linux-arm64-musl@1.1.2': + resolution: {integrity: sha512-MaITzkoqsn1Rm3+YnplubgAQEfOt+2jHfFvuFhXseUfcfbxe8Zyc3TM7LKwgv7mRVjIl+/yYN5JqL0cjbnhAnQ==} cpu: [arm64] os: [linux] - '@unrs/rspack-resolver-binding-linux-x64-gnu@1.1.1': - resolution: {integrity: sha512-gAUWCEvtLGoKn2+dPrWXqE2xMfUjyvsUDa1+8yjKnyEqfGCyKcyaSSWkXq7k2VQnS5XxOThQJPPnZol4EOBxpw==} + '@unrs/rspack-resolver-binding-linux-x64-gnu@1.1.2': + resolution: {integrity: sha512-Nu981XmzQqis/uB3j4Gi3p5BYCd/zReU5zbJmjMrEH7IIRH0dxZpdOmS/+KwEk6ao7Xd8P2D2gDHpHD/QTp0aQ==} cpu: [x64] os: [linux] - '@unrs/rspack-resolver-binding-linux-x64-musl@1.1.1': - resolution: {integrity: sha512-o1Ik61ahhy+UHIWQB3t/kGwOUPmECbyXVuiW6D/ieKUWslspGE6qjFnyDxWqj9bDGsgjlbl/+O5QabXuAdUsJQ==} + '@unrs/rspack-resolver-binding-linux-x64-musl@1.1.2': + resolution: {integrity: sha512-xJupeDvaRpV0ADMuG1dY9jkOjhUzTqtykvchiU2NldSD+nafSUcMWnoqzNUx7HGiqbTMOw9d9xT8ZiFs+6ZFyQ==} cpu: [x64] os: [linux] - '@unrs/rspack-resolver-binding-wasm32-wasi@1.1.1': - resolution: {integrity: sha512-uGqUQlEe9NUtw/VQOVLpuEPD6RBNmdUoGSHH8lGfKI5B3xHZYZ7nhKW38JeAnK9IymFJQpsyMHZXAyFR+NK8iw==} + '@unrs/rspack-resolver-binding-wasm32-wasi@1.1.2': + resolution: {integrity: sha512-un6X/xInks+KEgGpIHFV8BdoODHRohaDRvOwtjq+FXuoI4Ga0P6sLRvf4rPSZDvoMnqUhZtVNG0jG9oxOnrrLQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/rspack-resolver-binding-win32-arm64-msvc@1.1.1': - resolution: {integrity: sha512-UfpkOv54SOqD/TyzGIVCPQHSuXIVjeIIbMqrhl06695Sjlu5ls4Wxq6nllofC3Igak4h5ovulGvLLH/GRMdVYQ==} + '@unrs/rspack-resolver-binding-win32-arm64-msvc@1.1.2': + resolution: {integrity: sha512-2lCFkeT1HYUb/OOStBS1m67aZOf9BQxRA+Wf/xs94CGgzmoQt7H4V/BrkB/GSGKsudXjkiwt2oHNkHiowAS90A==} cpu: [arm64] os: [win32] - '@unrs/rspack-resolver-binding-win32-x64-msvc@1.1.1': - resolution: {integrity: sha512-oBZjxVKfLVQxCdFDbafibNtJQKhT6DTW5FcNM25Vay86Yi7Mw4ftYg5NknR70WxM5qSNXIOgTHgzEUFfZ3Q7JA==} + '@unrs/rspack-resolver-binding-win32-x64-msvc@1.1.2': + resolution: {integrity: sha512-EYfya5HCQ/8Yfy7rvAAX2rGytu81+d/CIhNCbZfNKLQ690/qFsdEeTXRsMQW1afHoluMM50PsjPYu8ndy8fSQg==} cpu: [x64] os: [win32] @@ -3145,8 +3145,8 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rspack-resolver@1.1.1: - resolution: {integrity: sha512-SwTjuIOS9jIYViQpYiDOmLTf/nuP6j9fz9VSxdNyIFiFaivEt6TOO5z0qQAwVloTz8RqjbPAzhVr1isiyHNRHw==} + rspack-resolver@1.1.2: + resolution: {integrity: sha512-eHhz+9JWHFdbl/CVVqEP6kviLFZqw1s0MWxLdsGMtUKUspSO3SERptPohmrUIC9jT1bGV9Bd3+r8AmWbdfNAzQ==} run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -4898,39 +4898,39 @@ snapshots: transitivePeerDependencies: - vue - '@unrs/rspack-resolver-binding-darwin-arm64@1.1.1': + '@unrs/rspack-resolver-binding-darwin-arm64@1.1.2': optional: true - '@unrs/rspack-resolver-binding-darwin-x64@1.1.1': + '@unrs/rspack-resolver-binding-darwin-x64@1.1.2': optional: true - '@unrs/rspack-resolver-binding-freebsd-x64@1.1.1': + '@unrs/rspack-resolver-binding-freebsd-x64@1.1.2': optional: true - '@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.1.1': + '@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.1.2': optional: true - '@unrs/rspack-resolver-binding-linux-arm64-gnu@1.1.1': + '@unrs/rspack-resolver-binding-linux-arm64-gnu@1.1.2': optional: true - '@unrs/rspack-resolver-binding-linux-arm64-musl@1.1.1': + '@unrs/rspack-resolver-binding-linux-arm64-musl@1.1.2': optional: true - '@unrs/rspack-resolver-binding-linux-x64-gnu@1.1.1': + '@unrs/rspack-resolver-binding-linux-x64-gnu@1.1.2': optional: true - '@unrs/rspack-resolver-binding-linux-x64-musl@1.1.1': + '@unrs/rspack-resolver-binding-linux-x64-musl@1.1.2': optional: true - '@unrs/rspack-resolver-binding-wasm32-wasi@1.1.1': + '@unrs/rspack-resolver-binding-wasm32-wasi@1.1.2': dependencies: '@napi-rs/wasm-runtime': 0.2.7 optional: true - '@unrs/rspack-resolver-binding-win32-arm64-msvc@1.1.1': + '@unrs/rspack-resolver-binding-win32-arm64-msvc@1.1.2': optional: true - '@unrs/rspack-resolver-binding-win32-x64-msvc@1.1.1': + '@unrs/rspack-resolver-binding-win32-x64-msvc@1.1.2': optional: true '@vitest/eslint-plugin@1.1.37(@typescript-eslint/utils@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)': @@ -5761,7 +5761,7 @@ snapshots: eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.10.0 picomatch: 4.0.2 - rspack-resolver: 1.1.1 + rspack-resolver: 1.1.2 semver: 7.7.1 stable-hash: 0.0.5 tslib: 2.8.1 @@ -7672,19 +7672,19 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.35.0 fsevents: 2.3.3 - rspack-resolver@1.1.1: + rspack-resolver@1.1.2: optionalDependencies: - '@unrs/rspack-resolver-binding-darwin-arm64': 1.1.1 - '@unrs/rspack-resolver-binding-darwin-x64': 1.1.1 - '@unrs/rspack-resolver-binding-freebsd-x64': 1.1.1 - '@unrs/rspack-resolver-binding-linux-arm-gnueabihf': 1.1.1 - '@unrs/rspack-resolver-binding-linux-arm64-gnu': 1.1.1 - '@unrs/rspack-resolver-binding-linux-arm64-musl': 1.1.1 - '@unrs/rspack-resolver-binding-linux-x64-gnu': 1.1.1 - '@unrs/rspack-resolver-binding-linux-x64-musl': 1.1.1 - '@unrs/rspack-resolver-binding-wasm32-wasi': 1.1.1 - '@unrs/rspack-resolver-binding-win32-arm64-msvc': 1.1.1 - '@unrs/rspack-resolver-binding-win32-x64-msvc': 1.1.1 + '@unrs/rspack-resolver-binding-darwin-arm64': 1.1.2 + '@unrs/rspack-resolver-binding-darwin-x64': 1.1.2 + '@unrs/rspack-resolver-binding-freebsd-x64': 1.1.2 + '@unrs/rspack-resolver-binding-linux-arm-gnueabihf': 1.1.2 + '@unrs/rspack-resolver-binding-linux-arm64-gnu': 1.1.2 + '@unrs/rspack-resolver-binding-linux-arm64-musl': 1.1.2 + '@unrs/rspack-resolver-binding-linux-x64-gnu': 1.1.2 + '@unrs/rspack-resolver-binding-linux-x64-musl': 1.1.2 + '@unrs/rspack-resolver-binding-wasm32-wasi': 1.1.2 + '@unrs/rspack-resolver-binding-win32-arm64-msvc': 1.1.2 + '@unrs/rspack-resolver-binding-win32-x64-msvc': 1.1.2 run-parallel@1.2.0: dependencies: diff --git a/public/image/og-screenshot.png b/public/image/og-screenshot.png deleted file mode 100644 index 4ca8c30300429f86ec3a7a69ab72ed2d4f8c37b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36062 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 Q1RRa2@%2BC91V~D4I-c_QUCw| diff --git a/src/components/Widgets/LanguageSwitcher.astro b/src/components/Widgets/LanguageSwitcher.astro index 805ddc1..55ef9a7 100644 --- a/src/components/Widgets/LanguageSwitcher.astro +++ b/src/components/Widgets/LanguageSwitcher.astro @@ -1,5 +1,5 @@ --- -import { getNextLangUrl, getNextSupportedLangUrl } from '@/i18n/path' +import { getNextGlobalLangPath, getNextSupportedLangPath } from '@/i18n/path' import { isPostPage, isTagPage } from '@/utils/page' interface Props { @@ -16,8 +16,8 @@ const useSupportedLangs = isPost || (isTag && supportedLangs.length > 0) // Choose a language switch list according to the page type const nextUrl = useSupportedLangs - ? getNextSupportedLangUrl(currentPath, supportedLangs) // Switch between supported languages - : getNextLangUrl(currentPath) // Switch between all languages + ? getNextSupportedLangPath(currentPath, supportedLangs) // Switch between supported languages + : getNextGlobalLangPath(currentPath) // Switch between all languages --- path.startsWith(`/${lang}/`), ) - return secondaryLang || defaultLocale + return currentLang || defaultLocale } -/** - * 获取下一个语言代码 - * @param currentLang 当前语言代码 - * @returns 下一个语言代码 - */ -export function getNextLang(currentLang: string): string { - // 获取默认语言和所有支持的语言 - // 直接使用导入的变量 - - // 找到当前语言在列表中的索引 +// Get the next language code in the global language cycle +export function getNextGlobalLang(currentLang: string): string { + // Get index of current language const currentIndex = allLocales.indexOf(currentLang) - - // 如果当前语言不在列表中,返回默认语言 if (currentIndex === -1) { return defaultLocale } - // 计算下一个语言的索引(循环) + // Calculate and return next language in cycle const nextIndex = (currentIndex + 1) % allLocales.length - - // 返回下一个语言代码 return allLocales[nextIndex] } - -/** - * 获取文章支持的语言 - * @param lang 文章的语言属性 - * @returns 支持的语言数组 - */ -export function getSupportedLangs(lang?: string): string[] { - // 直接使用导入的变量 - - // 如果指定了语言且不为空 - if (lang && typeof lang === 'string' && lang.trim() !== '') { - return [lang] - } - - // 否则返回所有支持的语言 - return allLocales -} diff --git a/src/i18n/path.ts b/src/i18n/path.ts index 191a993..8b83dbb 100644 --- a/src/i18n/path.ts +++ b/src/i18n/path.ts @@ -1,5 +1,5 @@ import { defaultLocale, moreLocales } from '@/config' -import { getLangFromPath, getNextLang } from '@/i18n/lang' +import { getLangFromPath, getNextGlobalLang } from '@/i18n/lang' import { cleanPath } from '@/utils/page' // Generates a localized path based on current language @@ -15,96 +15,67 @@ export function getLocalizedPath(path: string, currentLang?: string) { } /** - * 构建下一个语言的URL - * @param currentPath 当前页面路径 - * @param currentLang 当前语言代码 - * @param nextLang 下一个语言代码 - * @returns 下一个语言的URL + * Build path for next language + * @param currentPath Current page path + * @param currentLang Current language code + * @param nextLang Next language code to switch to + * @returns Path for next language */ -export function buildNextLangUrl(currentPath: string, currentLang: string, nextLang: string): string { - // 直接使用导入的变量 - let nextUrl = '' - - if (nextLang === defaultLocale) { - // 如果下一个是默认语言,移除语言代码 - nextUrl = currentPath.replace(`/${currentLang}`, '') || '/' - } - else { - // 如果当前是默认语言(没有语言代码在路径中) - if (currentLang === defaultLocale) { - // 在路径前添加新的语言代码 - nextUrl = `/${nextLang}${currentPath}` - } - else { - // 替换当前语言代码为新的语言代码 - nextUrl = currentPath.replace(`/${currentLang}`, `/${nextLang}`) - } - } - - // 确保URL格式正确 - if (nextUrl === '') - nextUrl = '/' - - // 确保非根路径的URL末尾有斜杠 - if (nextUrl !== '/' && !nextUrl.endsWith('/')) { - nextUrl = `${nextUrl}/` - } - - return nextUrl -} - -/** - * 直接从当前路径获取下一个语言的URL - * @param currentPath 当前页面路径 - * @returns 下一个语言的URL - */ -export function getNextLangUrl(currentPath: string): string { - // 从路径提取当前语言 - const currentLang = getLangFromPath(currentPath) - - // 获取下一个语言 - const nextLang = getNextLang(currentLang) - - // 构建下一个语言的URL - return buildNextLangUrl(currentPath, currentLang, nextLang) -} - -/** - * 根据支持的语言列表获取下一个语言的URL - * @param currentPath 当前路径 - * @param supportedLangs 文章支持的语言列表 - * @returns 下一个可用语言的URL - */ -export function getNextSupportedLangUrl(currentPath: string, supportedLangs: string[]): string { - // 从路径提取当前语言 - const currentLang = getLangFromPath(currentPath) - - // 如果没有提供支持的语言或列表为空,使用普通的语言切换 - if (!supportedLangs || supportedLangs.length === 0) { - return getNextLangUrl(currentPath) - } - - // 确保supportedLangs按照allLocales的顺序排序 - const sortedLangs = [...supportedLangs].sort((a, b) => { - // 使用导入的allLocales变量 - const allLocales = [defaultLocale, ...moreLocales] - return allLocales.indexOf(a) - allLocales.indexOf(b) - }) - - // 找到当前语言在支持的语言中的索引 - const currentIndex = sortedLangs.indexOf(currentLang) - - // 如果当前语言不在支持的语言中,或者路径是根路径,返回第一个支持的语言 - if (currentIndex === -1 || currentPath === '/') { - const nextLang = sortedLangs[0] - // 如果下一个语言是默认语言,返回根路径 +export function buildNextLangPath(currentPath: string, currentLang: string, nextLang: string): string { + if (currentPath === '/') { return nextLang === defaultLocale ? '/' : `/${nextLang}/` } - // 计算下一个语言的索引 - const nextIndex = (currentIndex + 1) % sortedLangs.length - const nextLang = sortedLangs[nextIndex] + // Build path based on language change + const nextPath = (() => { + if (nextLang === defaultLocale) { + return currentPath.replace(`/${currentLang}`, '') || '/' + } - // 构建下一个语言的URL - return buildNextLangUrl(currentPath, currentLang, nextLang) + if (currentLang === defaultLocale) { + return `/${nextLang}${currentPath}` + } + + return currentPath.replace(`/${currentLang}`, `/${nextLang}`) + })() + + return nextPath.endsWith('/') ? nextPath : `${nextPath}/` +} + +/** + * Get next language path from global language list + * @param currentPath Current page path + * @returns Path for next supported language + */ +export function getNextGlobalLangPath(currentPath: string): string { + const currentLang = getLangFromPath(currentPath) + const nextLang = getNextGlobalLang(currentLang) + return buildNextLangPath(currentPath, currentLang, nextLang) +} + +/** + * Get next language path from supported language list + * @param currentPath Current page path + * @param supportedLangs List of supported language codes + * @returns Path for next supported language + */ +export function getNextSupportedLangPath(currentPath: string, supportedLangs: string[]): string { + if (!supportedLangs.length) { + return getNextGlobalLangPath(currentPath) + } + + // Sort supported languages by global priority + const langPriority = new Map( + [defaultLocale, ...moreLocales].map((lang, index) => [lang, index]), + ) + const sortedLangs = [...supportedLangs].sort( + (a, b) => langPriority.get(a)! - langPriority.get(b)!, + ) + + // Get current language and next in cycle + const currentLang = getLangFromPath(currentPath) + const currentIndex = sortedLangs.indexOf(currentLang) + const nextLang = sortedLangs[(currentIndex + 1) % sortedLangs.length] + + return buildNextLangPath(currentPath, currentLang, nextLang) } diff --git a/src/layouts/Head.astro b/src/layouts/Head.astro index 209abc0..0446ed8 100644 --- a/src/layouts/Head.astro +++ b/src/layouts/Head.astro @@ -31,7 +31,7 @@ const pageImage = postSlug ? `${url}/og/${postSlug}.png` : apiflashKey ? `https://api.apiflash.com/v1/urltoimage?access_key=${apiflashKey}&url=${url}${langCode}&format=png&width=1500&height=788&ttl=86400&wait_until=network_idle&no_tracking=true` - : `/public/image/og-screenshot.png` + : `https://api.apiflash.com/v1/urltoimage?access_key=02a837b6188f4ba0a7fd9fbeff03a83e&url=https://retypeset.radishzz.cc${langCode}&format=png&width=1500&height=788&ttl=604800&wait_until=network_idle&no_tracking=true` --- diff --git a/src/utils/page.ts b/src/utils/page.ts index d26b5d1..b281c59 100644 --- a/src/utils/page.ts +++ b/src/utils/page.ts @@ -6,6 +6,7 @@ import { getLocalizedPath } from '@/i18n/path' export function cleanPath(path: string) { return path.replace(/^\/|\/$/g, '') } + // Checks if the current path is the home/post/tag/about page export function isHomePage(path: string) { const clean = cleanPath(path)