feat: add deploy script

This commit is contained in:
liuyuanchuang
2026-01-26 07:10:58 +08:00
parent 42850c4460
commit 7c5409a6c7
4 changed files with 253 additions and 0 deletions

View File

@@ -1,5 +1,6 @@
import React, { createContext, useContext, useState, useEffect } from 'react';
import { translations, Language, TranslationKey } from '../lib/translations';
import { detectLanguageByIP } from '../lib/ipLocation';
interface LanguageContextType {
language: Language;
@@ -10,12 +11,36 @@ interface LanguageContextType {
const LanguageContext = createContext<LanguageContextType | undefined>(undefined);
export const LanguageProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
// 初始化语言:优先使用 localStorage否则使用浏览器语言作为临时值
const [language, setLanguageState] = useState<Language>(() => {
const saved = localStorage.getItem('language');
if (saved === 'en' || saved === 'zh') return saved;
// 临时使用浏览器语言后续会被IP检测覆盖如果没有保存的语言
return navigator.language.startsWith('zh') ? 'zh' : 'en';
});
// 检测IP地理位置并设置语言仅在首次加载且没有保存的语言时
useEffect(() => {
const saved = localStorage.getItem('language');
// 如果用户已经手动选择过语言则不进行IP检测
if (saved === 'en' || saved === 'zh') {
return;
}
// 异步检测IP并设置语言
detectLanguageByIP()
.then((detectedLang) => {
setLanguageState(detectedLang);
// 注意:这里不保存到 localStorage让用户首次访问时使用IP检测的结果
// 如果用户手动切换语言,才会保存到 localStorage
})
.catch((error) => {
// IP检测失败时保持使用浏览器语言检测的结果
console.warn('Failed to detect language by IP:', error);
});
}, []); // 仅在组件挂载时执行一次
const setLanguage = (lang: Language) => {
setLanguageState(lang);
localStorage.setItem('language', lang);