From e161823a31a66ef87b945140aae2840d07ef5673 Mon Sep 17 00:00:00 2001 From: noeFly Date: Tue, 11 Feb 2025 22:55:19 +0800 Subject: [PATCH 01/43] =?UTF-8?q?fix:=20=F0=9F=90=9B=20=E4=BF=AE=E5=BE=A9?= =?UTF-8?q?=20Hexo=20=E4=B8=BB=E9=A1=8C=E4=B8=8B=20404=20=E9=A0=81?= =?UTF-8?q?=E9=9D=A2=E7=84=A1=E6=B3=95=E5=9C=A8=E5=9C=B0=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #3157 --- lib/lang/en-US.js | 5 +++-- lib/lang/fr-FR.js | 5 +++-- lib/lang/ja-JP.js | 5 +++-- lib/lang/tr-TR.js | 5 +++-- lib/lang/zh-CN.js | 5 +++-- lib/lang/zh-HK.js | 5 +++-- lib/lang/zh-TW.js | 5 +++-- themes/hexo/index.js | 3 ++- 8 files changed, 23 insertions(+), 15 deletions(-) diff --git a/lib/lang/en-US.js b/lib/lang/en-US.js index 1649c6d36af..7f1475521de 100644 --- a/lib/lang/en-US.js +++ b/lib/lang/en-US.js @@ -69,7 +69,8 @@ export default { WORD_COUNT: 'Words', READ_TIME: 'Read Time', NEXT_POST: 'Next', - PREV_POST: 'Prev' + PREV_POST: 'Prev', + NOT_FOUND: 'Page not found.' }, PAGINATION: { PREV: 'Prev', @@ -89,6 +90,6 @@ export default { EMAIL: 'Email' }, AI_SUMMARY: { - NAME: 'AI intelligent summary', + NAME: 'AI intelligent summary' } } diff --git a/lib/lang/fr-FR.js b/lib/lang/fr-FR.js index e507dc4b4ae..057a26c8862 100644 --- a/lib/lang/fr-FR.js +++ b/lib/lang/fr-FR.js @@ -38,7 +38,8 @@ export default { SUBMIT: 'Valider', POST_TIME: 'Date de publication', LAST_EDITED_TIME: 'Date de modification', - RECENT_COMMENTS: 'Nouveau commentaire' + RECENT_COMMENTS: 'Nouveau commentaire', + NOT_FOUND: '' }, PAGINATION: { PREV: 'PREV', @@ -53,6 +54,6 @@ export default { TOP: 'Haut' }, AI_SUMMARY: { - NAME: "Résumé intelligent par l'IA", + NAME: "Résumé intelligent par l'IA" } } diff --git a/lib/lang/ja-JP.js b/lib/lang/ja-JP.js index 7ce1270c343..6ab9edc08ba 100644 --- a/lib/lang/ja-JP.js +++ b/lib/lang/ja-JP.js @@ -45,7 +45,8 @@ export default { DEBUG_CLOSE: 'デバッグをオフにする', THEME_SWITCH: 'テーマの切り替え', ANNOUNCEMENT: 'お知らせ', - START_READING: '読み始める' + START_READING: '読み始める', + NOT_FOUND: '' }, PAGINATION: { PREV: '前のページ', @@ -60,6 +61,6 @@ export default { TOP: '上に戻る' }, AI_SUMMARY: { - NAME: 'AIインテリジェントサマリー', + NAME: 'AIインテリジェントサマリー' } } diff --git a/lib/lang/tr-TR.js b/lib/lang/tr-TR.js index 7b5ac6f735c..1a6ad03d586 100644 --- a/lib/lang/tr-TR.js +++ b/lib/lang/tr-TR.js @@ -40,7 +40,8 @@ export default { DEBUG_OPEN: 'Hata Ayıklama', DEBUG_CLOSE: 'Kapat', THEME_SWITCH: 'Temayı Değiştir', - ANNOUNCEMENT: 'Duyuru' + ANNOUNCEMENT: 'Duyuru', + NOT_FOUND: '' }, PAGINATION: { PREV: 'Önceki', @@ -55,6 +56,6 @@ export default { TOP: 'Yukarı' }, AI_SUMMARY: { - NAME: 'Yapay Zeka Akıllı Özet', + NAME: 'Yapay Zeka Akıllı Özet' } } diff --git a/lib/lang/zh-CN.js b/lib/lang/zh-CN.js index 265bb0c2f8f..3432a6b0dee 100644 --- a/lib/lang/zh-CN.js +++ b/lib/lang/zh-CN.js @@ -69,7 +69,8 @@ export default { WORD_COUNT: '字数', READ_TIME: '阅读时长', NEXT_POST: '下一篇', - PREV_POST: '上一篇' + PREV_POST: '上一篇', + NOT_FOUND: '页面未找到' }, PAGINATION: { PREV: '上页', @@ -89,6 +90,6 @@ export default { EMAIL: '邮箱' }, AI_SUMMARY: { - NAME: 'AI智能摘要', + NAME: 'AI智能摘要' } } diff --git a/lib/lang/zh-HK.js b/lib/lang/zh-HK.js index 5b6ff4dbc6b..43767bde146 100644 --- a/lib/lang/zh-HK.js +++ b/lib/lang/zh-HK.js @@ -39,7 +39,8 @@ export default { POST_TIME: '發表於', LAST_EDITED_TIME: '最後更新', NEXT_POST: '下一篇', - PREV_POST: '上一篇' + PREV_POST: '上一篇', + NOT_FOUND: '' }, PAGINATION: { PREV: '上一頁', @@ -54,6 +55,6 @@ export default { TOP: '回到頁頂' }, AI_SUMMARY: { - NAME: 'AI 智能摘要', + NAME: 'AI 智能摘要' } } diff --git a/lib/lang/zh-TW.js b/lib/lang/zh-TW.js index eae785ce796..64eb59debb9 100644 --- a/lib/lang/zh-TW.js +++ b/lib/lang/zh-TW.js @@ -69,7 +69,8 @@ export default { WORD_COUNT: '字數', READ_TIME: '閱讀時間', NEXT_POST: '下一篇', - PREV_POST: '上一篇' + PREV_POST: '上一篇', + NOT_FOUND: '未找到該頁面' }, PAGINATION: { PREV: '上一頁', @@ -89,6 +90,6 @@ export default { EMAIL: '電子信箱' }, AI_SUMMARY: { - NAME: 'AI 智慧摘要', + NAME: 'AI 智慧摘要' } } diff --git a/themes/hexo/index.js b/themes/hexo/index.js index c32310c0347..30d0fc461c9 100644 --- a/themes/hexo/index.js +++ b/themes/hexo/index.js @@ -330,6 +330,7 @@ const LayoutSlug = props => { */ const Layout404 = props => { const router = useRouter() + const { locale } = useGlobal() useEffect(() => { // 延时3秒如果加载失败就返回首页 setTimeout(() => { @@ -351,7 +352,7 @@ const Layout404 = props => { 404
-

页面未找到

+

{locale.COMMON.NOT_FOUND}

From 8df49a195daaafb9df0a855fed1d8c4b844ba49d Mon Sep 17 00:00:00 2001 From: noeFly Date: Wed, 12 Feb 2025 21:29:18 +0800 Subject: [PATCH 02/43] =?UTF-8?q?fix:=20=F0=9F=90=9B=20=E4=BF=AE=E5=BE=A9?= =?UTF-8?q?=20i18n=20=E7=84=A1=E6=B3=95=E5=A5=97=E7=94=A8=E8=AA=9E?= =?UTF-8?q?=E8=A8=80=E8=AE=8A=E9=AB=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修復 i18n 無法正確使用語言變體,轉而使用最靠近的語系翻譯 --- lib/global.js | 8 +------- lib/lang.js | 35 ++++++++++++----------------------- lib/notion/convertInnerUrl.js | 4 ++-- next.config.js | 12 ++++++++---- 4 files changed, 23 insertions(+), 36 deletions(-) diff --git a/lib/global.js b/lib/global.js index b9e84660efa..0bfbcfbdcd7 100644 --- a/lib/global.js +++ b/lib/global.js @@ -8,12 +8,7 @@ import { import { useUser } from '@clerk/nextjs' import { useRouter } from 'next/router' import { createContext, useContext, useEffect, useState } from 'react' -import { - generateLocaleDict, - initLocale, - redirectUserLang, - saveLangToLocalStorage -} from './lang' +import { generateLocaleDict, initLocale, redirectUserLang } from './lang' /** * 全局上下文 @@ -81,7 +76,6 @@ export function GlobalContextProvider(props) { function changeLang(lang) { if (lang) { - saveLangToLocalStorage(lang) updateLang(lang) updateLocale(generateLocaleDict(lang)) } diff --git a/lib/lang.js b/lib/lang.js index 9eda4da9cff..17a4189e533 100644 --- a/lib/lang.js +++ b/lib/lang.js @@ -8,6 +8,7 @@ import zhCN from './lang/zh-CN' import zhHK from './lang/zh-HK' import zhTW from './lang/zh-TW' import { extractLangPrefix } from './utils/pageId' +import { useRouter } from 'next/router' /** * 在这里配置所有支持的语言 @@ -70,15 +71,9 @@ export function generateLocaleDict(langString) { */ export function initLocale(locale, changeLang, updateLocale) { if (isBrowser) { - // 根据router中的locale对象判断当前语言:表现为前缀中包含 zh、en 等。 - let pathLocaleLang = null - if (locale === 'en' || locale === 'zh') { - pathLocaleLang = locale === 'en' ? 'en-US' : 'zh-CN' - } // 如果有query参数切换语言则优先 const queryLang = - getQueryVariable('locale') || getQueryVariable('lang') || pathLocaleLang - + getQueryVariable('locale') || getQueryVariable('lang') || locale if (queryLang) { const match = queryLang.match(/[a-zA-Z]{2}(?:-[a-zA-Z]{2})?/) if (match) { @@ -91,22 +86,6 @@ export function initLocale(locale, changeLang, updateLocale) { } } -/** - * 读取语言 - * @returns {*} - */ -export const loadLangFromLocalStorage = () => { - return localStorage.getItem('lang') -} - -/** - * 保存语言 - * @param newTheme - */ -export const saveLangToLocalStorage = lang => { - localStorage.setItem('lang', lang) -} - /** * 检测用户的预研偏好,跳转至对应的多语言网站 * @param {*} lang @@ -143,3 +122,13 @@ export const redirectUserLang = (lang, pageId) => { } } } + +/** + * 获取当前 Next.js 路由下的 locale + * @returns 当前路由下的 locale + */ +export function getCurrentLang() { + const router = useRouter() + let currentLang = router.locale + return currentLang +} diff --git a/lib/notion/convertInnerUrl.js b/lib/notion/convertInnerUrl.js index 017bebd13f8..c6a39dcfe90 100644 --- a/lib/notion/convertInnerUrl.js +++ b/lib/notion/convertInnerUrl.js @@ -1,6 +1,6 @@ import { idToUuid } from 'notion-utils' import { checkStrIsNotionId, getLastPartOfUrl, isBrowser } from '../utils' -import { loadLangFromLocalStorage } from '@/lib/lang' +import { getCurrentLang } from '@/lib/lang' /** * 处理页面内连接跳转: @@ -21,7 +21,7 @@ export const convertInnerUrl = allPages => { const { origin, pathname } = window.location; const currentURL = origin + pathname const currentPathLang = pathname.split('/').filter(Boolean)[0] - const lang = loadLangFromLocalStorage().split(/[-_]/)[0] + const lang = getCurrentLang const langPrefix = lang === currentPathLang ? '/' + lang : '' for (const anchorTag of allAnchorTags) { // url替换成slug diff --git a/next.config.js b/next.config.js index 658001ed83d..3b8d7135477 100644 --- a/next.config.js +++ b/next.config.js @@ -15,7 +15,7 @@ const themes = scanSubdirectories(path.resolve(__dirname, 'themes')) const locales = (function () { // 根据BLOG_NOTION_PAGE_ID 检查支持多少种语言数据. // 支持如下格式配置多个语言的页面id xxx,zh:xxx,en:xxx - const langs = [BLOG.LANG.slice(0, 2)] + const langs = [BLOG.LANG] if (BLOG.NOTION_PAGE_ID.indexOf(',') > 0) { const siteIds = BLOG.NOTION_PAGE_ID.split(',') for (let index = 0; index < siteIds.length; index++) { @@ -84,15 +84,19 @@ const nextConfig = { eslint: { ignoreDuringBuilds: true }, - output: process.env.EXPORT ? 'export' : process.env.NEXT_BUILD_STANDALONE === 'true' ? 'standalone' : undefined, + output: process.env.EXPORT + ? 'export' + : process.env.NEXT_BUILD_STANDALONE === 'true' + ? 'standalone' + : undefined, staticPageGenerationTimeout: 120, // 多语言, 在export时禁用 i18n: process.env.EXPORT ? undefined : { - defaultLocale: BLOG.LANG.slice(0, 2), + defaultLocale: BLOG.LANG, // 支持的所有多语言,按需填写即可 - locales + locales: locales }, images: { // 图片压缩 From 861b8a92e09b452010ac8801edb292b83ff8624c Mon Sep 17 00:00:00 2001 From: noeFly Date: Wed, 12 Feb 2025 21:30:47 +0800 Subject: [PATCH 03/43] =?UTF-8?q?refactor:=20=F0=9F=9A=A8=20Prettier=20?= =?UTF-8?q?=E8=87=AA=E5=8B=95=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/notion/convertInnerUrl.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/notion/convertInnerUrl.js b/lib/notion/convertInnerUrl.js index c6a39dcfe90..913fba9e14e 100644 --- a/lib/notion/convertInnerUrl.js +++ b/lib/notion/convertInnerUrl.js @@ -18,7 +18,7 @@ export const convertInnerUrl = allPages => { if (!allAnchorTags) { return } - const { origin, pathname } = window.location; + const { origin, pathname } = window.location const currentURL = origin + pathname const currentPathLang = pathname.split('/').filter(Boolean)[0] const lang = getCurrentLang @@ -50,4 +50,4 @@ export const convertInnerUrl = allPages => { } } } -} \ No newline at end of file +} From 86b59b6cfc569ea4f9d844712ded3f8304250da7 Mon Sep 17 00:00:00 2001 From: LooseLi <1329307562@qq.com> Date: Thu, 20 Mar 2025 11:50:12 +0800 Subject: [PATCH 04/43] =?UTF-8?q?fix(sitemap=E5=A4=9A=E4=BA=86=E4=B8=AA?= =?UTF-8?q?=E6=96=9C=E6=9D=A0=E5=AF=BC=E8=87=B4Google=20Search=20Console?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E8=87=AA=E5=8A=A8=E7=BC=96=E5=85=A5=E7=B4=A2?= =?UTF-8?q?=E5=BC=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/sitemap.xml.js | 6 +++++- pages/sitemap.xml.js | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/sitemap.xml.js b/lib/sitemap.xml.js index c847e57dc23..1ff513f74e5 100644 --- a/lib/sitemap.xml.js +++ b/lib/sitemap.xml.js @@ -6,7 +6,11 @@ import { siteConfig } from './config' * @param {*} param0 */ export async function generateSitemapXml({ allPages, NOTION_CONFIG }) { - const link = siteConfig('LINK', BLOG.LINK, NOTION_CONFIG) + let link = siteConfig('LINK', BLOG.LINK, NOTION_CONFIG) + // 确保链接不以斜杠结尾 + if (link && link.endsWith('/')) { + link = link.slice(0, -1) + } const urls = [ { loc: `${link}`, diff --git a/pages/sitemap.xml.js b/pages/sitemap.xml.js index e6b33bb2a19..06c21f4297a 100644 --- a/pages/sitemap.xml.js +++ b/pages/sitemap.xml.js @@ -38,6 +38,11 @@ export const getServerSideProps = async ctx => { } function generateLocalesSitemap(link, allPages, locale) { + // 确保链接不以斜杠结尾 + if (link && link.endsWith('/')) { + link = link.slice(0, -1) + } + if (locale && locale.length > 0 && locale.indexOf('/') !== 0) { locale = '/' + locale } From 379d0dbc044e2e7a7623dfeecfcd9b55f1832430 Mon Sep 17 00:00:00 2001 From: LooseLi <1329307562@qq.com> Date: Thu, 20 Mar 2025 14:03:46 +0800 Subject: [PATCH 05/43] =?UTF-8?q?fix(=E8=87=AA=E5=AE=9A=E4=B9=89=E5=A4=87?= =?UTF-8?q?=E6=A1=88=E9=93=BE=E6=8E=A5=E4=B8=8D=E7=94=9F=E6=95=88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- themes/fukasawa/components/SiteInfo.js | 2 +- themes/gitbook/components/Footer.js | 2 +- themes/heo/components/Footer.js | 3 ++- themes/matery/components/Footer.js | 2 +- themes/medium/components/Footer.js | 2 +- themes/movie/components/Footer.js | 2 +- themes/nav/components/Footer.js | 2 +- themes/next/components/Footer.js | 2 +- themes/photo/components/Footer.js | 2 +- 9 files changed, 10 insertions(+), 9 deletions(-) diff --git a/themes/fukasawa/components/SiteInfo.js b/themes/fukasawa/components/SiteInfo.js index 1052ae47bb5..0651c88cd9c 100644 --- a/themes/fukasawa/components/SiteInfo.js +++ b/themes/fukasawa/components/SiteInfo.js @@ -22,7 +22,7 @@ function SiteInfo({ title }) { {siteConfig('BEI_AN') && ( <> - + {siteConfig('BEI_AN')}
diff --git a/themes/gitbook/components/Footer.js b/themes/gitbook/components/Footer.js index b9929d64d04..cbf6df1403f 100644 --- a/themes/gitbook/components/Footer.js +++ b/themes/gitbook/components/Footer.js @@ -33,7 +33,7 @@ const Footer = ({ siteInfo }) => { {siteConfig('BEI_AN') && ( <> {' '} - + {siteConfig('BEI_AN')} diff --git a/themes/heo/components/Footer.js b/themes/heo/components/Footer.js index 2bd1bf64bb5..1a7e6fb8415 100644 --- a/themes/heo/components/Footer.js +++ b/themes/heo/components/Footer.js @@ -9,6 +9,7 @@ import SocialButton from './SocialButton' */ const Footer = () => { const BEI_AN = siteConfig('BEI_AN') + const BEI_AN_LINK = siteConfig('BEI_AN_LINK') const BIO = siteConfig('BIO') return (