diff --git a/docusaurus.config.js b/docusaurus.config.js
index 89bfbadb..c6316a46 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -15,6 +15,8 @@ const config = {
botId: process.env.BOT_ID,
patToken: process.env.TOKEN
},
+ // Add client module for language detection
+ clientModules: [require.resolve('./src/clientModules/lang-redirect.js')],
markdown: {
hooks: {
onBrokenMarkdownLinks: 'warn',
@@ -76,7 +78,18 @@ const config = {
],
i18n: {
defaultLocale: 'en',
- locales: ['en', 'zh-CN'],
+ locales: ['en', 'zh-cn'],
+ localeConfigs: {
+ en: {
+ label: 'English',
+ htmlLang: 'en',
+ },
+ 'zh-cn': {
+ label: '中文',
+ htmlLang: 'zh-CN',
+ path: 'zh-CN',
+ },
+ },
},
themeConfig:
({
@@ -136,7 +149,7 @@ const config = {
},
{
label: 'News',
- to: 'news',
+ to: '/news',
},
{
label: 'Customer Stories',
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/detail-pg18-contributors.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/detail-pg18-contributors.mdx
index a44ddfab..aab84688 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/detail-pg18-contributors.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/detail-pg18-contributors.mdx
@@ -74,7 +74,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-deepin-cert.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-deepin-cert.mdx
index f8391809..c9d6ffd6 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-deepin-cert.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-deepin-cert.mdx
@@ -73,7 +73,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-deepseek-assistant.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-deepseek-assistant.mdx
index 2dda7848..dc015c53 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-deepseek-assistant.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-deepseek-assistant.mdx
@@ -76,7 +76,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-expert-advisory-committee.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-expert-advisory-committee.mdx
index f9612b6a..8f9bd814 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-expert-advisory-committee.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-expert-advisory-committee.mdx
@@ -82,7 +82,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-kylin-cert.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-kylin-cert.mdx
index fb14f44f..89fd827c 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-kylin-cert.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-kylin-cert.mdx
@@ -72,7 +72,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-loongarch-cert.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-loongarch-cert.mdx
index 8f103d3d..94656a75 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-loongarch-cert.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-loongarch-cert.mdx
@@ -74,7 +74,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-navicat.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-navicat.mdx
index be2fe5ef..d8395fe9 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-navicat.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-navicat.mdx
@@ -74,7 +74,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-ospp-2025.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-ospp-2025.mdx
index 9fad123e..e5be2ba6 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-ospp-2025.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-ospp-2025.mdx
@@ -76,7 +76,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
-
新闻动态 > 开源之夏 2025 结项
+
新闻动态 > 开源之夏 2025 结项
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-ospp-students.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-ospp-students.mdx
index 68925f9f..d073768e 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-ospp-students.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-ospp-students.mdx
@@ -76,7 +76,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-pku-course.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-pku-course.mdx
index f8b21055..5342e8d7 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-pku-course.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-pku-course.mdx
@@ -75,7 +75,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-2-released.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-2-released.mdx
index 09258209..14a362a4 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-2-released.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-2-released.mdx
@@ -75,7 +75,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-4-released.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-4-released.mdx
index 5b8a58ae..9c4a67d0 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-4-released.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-4-released.mdx
@@ -75,7 +75,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-5-released.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-5-released.mdx
index ef253201..fcae005c 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-5-released.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-5-released.mdx
@@ -75,7 +75,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-6-released.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-6-released.mdx
index db639a9e..e85f31b0 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-6-released.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v4-6-released.mdx
@@ -75,7 +75,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
-
新闻动态 > IvorySQL 4.6 发布
+
新闻动态 > IvorySQL 4.6 发布
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v5-0-released.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v5-0-released.mdx
index b1b1bb5e..11a0814e 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v5-0-released.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v5-0-released.mdx
@@ -75,7 +75,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
-
新闻动态 > IvorySQL 5.0 发布
+
新闻动态 > IvorySQL 5.0 发布
diff --git a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v5-1-released.mdx b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v5-1-released.mdx
index ca58a4ec..5d7060d1 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v5-1-released.mdx
+++ b/i18n/zh-CN/docusaurus-plugin-content-pages/news/ivorysql-v5-1-released.mdx
@@ -74,7 +74,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
-
新闻动态 > IvorySQL 5.1 发布
+
新闻动态 > IvorySQL 5.1 发布
diff --git a/src/clientModules/lang-redirect.js b/src/clientModules/lang-redirect.js
new file mode 100644
index 00000000..8be62aae
--- /dev/null
+++ b/src/clientModules/lang-redirect.js
@@ -0,0 +1,41 @@
+/**
+ * Docusaurus Client Module for Language Detection
+ * This module runs on the client side and handles browser language detection
+ */
+export function onRouteDidUpdate({ location, previousLocation }) {
+ // Only run on root path
+ if (location.pathname !== '/' && location.pathname !== '/index.html') {
+ return;
+ }
+
+ // Check if user has an existing locale preference (manual language selection)
+ const savedLocale = localStorage.getItem('docusaurus.locale');
+ if (savedLocale === 'en') {
+ // User explicitly chose English, respect it and don't redirect
+ return;
+ }
+
+ if (savedLocale === 'zh-CN') {
+ // User chose Chinese, no need to redirect
+ return;
+ }
+
+ // Check if this is the first visit to the root path in this session
+ if (sessionStorage.getItem('clientLangDetectionDone')) {
+ return;
+ }
+
+ // Detect browser language
+ const browserLang = navigator.language || navigator.userLanguage || '';
+
+ // Redirect Chinese users to Chinese version
+ if (browserLang.toLowerCase().startsWith('zh')) {
+ // Mark as done before redirecting to prevent loops
+ sessionStorage.setItem('clientLangDetectionDone', '1');
+ // Redirect Chinese users to Chinese version
+ window.location.replace('/zh-CN/');
+ } else {
+ // Mark as done for non-Chinese users too
+ sessionStorage.setItem('clientLangDetectionDone', '1');
+ }
+}
diff --git a/static/_redirects b/static/_redirects
index c16dd161..6fc32d85 100644
--- a/static/_redirects
+++ b/static/_redirects
@@ -1,4 +1,6 @@
# Redirect users from China to chinese version at /zh-CN.
-/ /zh-cn 302! Country=cn
-# Also users with Chinese language should be redirected to /zh-cn
-# / /zh-cn 302! Language=zh
+# Disabled - relying on client-side browser language detection instead
+# The ! flag causes forced redirects that prevent manual language switching
+# / /zh-CN 302 Country=cn
+# Also users with Chinese language should be redirected to /zh-CN
+# / /zh-CN 302 Language=zh