mirror of
https://github.com/handsomezhuzhu/AeroStart.git
synced 2026-02-20 20:10:15 +00:00
♻️ refactor: reorganize project structure and centralize search engine config
- Move all source files from root to src/ directory for better organization - Create src/config/searchEngines.ts to centralize search engine configurations - Define unified SearchEngineConfig interface - Support both JSONP and Fetch request methods - Implement response parsers for Google, Baidu, Bing, DuckDuckGo, and Bilibili - Refactor src/utils/suggestions.ts to use centralized config - Simplify code from 126 lines to 81 lines - Support hybrid JSONP/Fetch mode (Bilibili uses Fetch via Vite proxy) - Remove duplicate URL construction and parsing logic - Update path alias configuration - Change @/* from ./* to ./src/* in tsconfig.json - Update vite.config.ts alias to point to ./src - Add Bilibili proxy configuration in vite.config.ts for development - Remove Bilibili rewrites from vercel.json (use Vite proxy instead) - Add @vercel/node to devDependencies - Remove unused files: README.md, i18n/README.md, metadata.json, vite-env.d.ts 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
45
src/i18n/I18nContext.tsx
Normal file
45
src/i18n/I18nContext.tsx
Normal file
@@ -0,0 +1,45 @@
|
||||
import React, { createContext, useContext, ReactNode } from 'react';
|
||||
import { Language, Translation } from './types';
|
||||
import { en } from './locales/en';
|
||||
import { zh } from './locales/zh';
|
||||
|
||||
interface I18nContextType {
|
||||
language: Language;
|
||||
t: Translation;
|
||||
setLanguage: (lang: Language) => void;
|
||||
}
|
||||
|
||||
const I18nContext = createContext<I18nContextType | undefined>(undefined);
|
||||
|
||||
const translations: Record<Language, Translation> = {
|
||||
en,
|
||||
zh,
|
||||
};
|
||||
|
||||
interface I18nProviderProps {
|
||||
children: ReactNode;
|
||||
language: Language;
|
||||
onLanguageChange: (lang: Language) => void;
|
||||
}
|
||||
|
||||
export const I18nProvider: React.FC<I18nProviderProps> = ({
|
||||
children,
|
||||
language,
|
||||
onLanguageChange
|
||||
}) => {
|
||||
const t = translations[language];
|
||||
|
||||
return (
|
||||
<I18nContext.Provider value={{ language, t, setLanguage: onLanguageChange }}>
|
||||
{children}
|
||||
</I18nContext.Provider>
|
||||
);
|
||||
};
|
||||
|
||||
export const useTranslation = () => {
|
||||
const context = useContext(I18nContext);
|
||||
if (!context) {
|
||||
throw new Error('useTranslation must be used within an I18nProvider');
|
||||
}
|
||||
return context;
|
||||
};
|
||||
4
src/i18n/index.ts
Normal file
4
src/i18n/index.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
export * from './types';
|
||||
export * from './I18nContext';
|
||||
export { en } from './locales/en';
|
||||
export { zh } from './locales/zh';
|
||||
95
src/i18n/locales/en.ts
Normal file
95
src/i18n/locales/en.ts
Normal file
@@ -0,0 +1,95 @@
|
||||
import { Translation } from '../types';
|
||||
|
||||
export const en: Translation = {
|
||||
// Common
|
||||
settings: 'Settings',
|
||||
appearance: 'Appearance',
|
||||
searchEngines: 'Search Engines',
|
||||
|
||||
// Theme Settings
|
||||
themeColor: 'Theme Color',
|
||||
showSeconds: 'Show Seconds',
|
||||
use24HourFormat: '24-Hour Format',
|
||||
maskBlurEffect: 'Mask Blur Effect',
|
||||
searchHistory: 'Search History',
|
||||
backgroundBlur: 'Background Blur',
|
||||
searchBoxOpacity: 'Search Box Opacity',
|
||||
|
||||
// Wallpaper Settings
|
||||
wallpaperSettings: 'Wallpaper Settings',
|
||||
uploadImageVideo: 'Upload Image/Video',
|
||||
enterImageVideoUrl: 'Enter image or video URL...',
|
||||
apply: 'Apply',
|
||||
cover: 'Cover',
|
||||
contain: 'Contain',
|
||||
fill: 'Fill',
|
||||
repeat: 'Repeat',
|
||||
center: 'Center',
|
||||
deleteWallpaper: 'Delete wallpaper',
|
||||
|
||||
// Search Engine Manager
|
||||
addCustomEngine: 'Add Custom Engine',
|
||||
editSearchEngine: 'Edit Search Engine',
|
||||
name: 'Name',
|
||||
searchUrl: 'Search URL (use %s or append directly)',
|
||||
svgIconCode: 'SVG Icon Code',
|
||||
optional: 'optional',
|
||||
preview: 'Preview',
|
||||
cancel: 'Cancel',
|
||||
save: 'Save',
|
||||
add: 'Add',
|
||||
current: 'Current',
|
||||
setDefault: 'Set Default',
|
||||
edit: 'Edit',
|
||||
delete: 'Delete',
|
||||
|
||||
// Search Box
|
||||
search: 'Search',
|
||||
searchOn: 'Search on',
|
||||
recentSearches: 'Recent Searches',
|
||||
clearHistory: 'Clear History',
|
||||
|
||||
// Context Menu
|
||||
copy: 'Copy',
|
||||
cut: 'Cut',
|
||||
paste: 'Paste',
|
||||
|
||||
// Error Boundary
|
||||
somethingWentWrong: 'Something went wrong',
|
||||
errorMessage: 'The application encountered an unexpected error. Please try refreshing the page or resetting the app.',
|
||||
retry: 'Retry',
|
||||
refreshPage: 'Refresh Page',
|
||||
|
||||
// Toast Messages
|
||||
searchEngineDeleted: 'Search engine deleted',
|
||||
searchEngineUpdated: 'Search engine updated successfully',
|
||||
newSearchEngineAdded: 'New search engine added',
|
||||
duplicateEngineName: 'This search engine name already exists, please use a different name',
|
||||
customWallpaperApplied: 'Custom wallpaper applied',
|
||||
wallpaperUploaded: 'Wallpaper uploaded and applied successfully',
|
||||
wallpaperDeleted: 'Custom wallpaper deleted',
|
||||
fileSizeExceeded: 'File size cannot exceed 3.5MB. Consider using URL method instead.',
|
||||
unsupportedFileType: 'Unsupported file type. Only supports: JPEG, PNG, GIF, WebP, SVG, MP4, WebM, OGG',
|
||||
fileContentMismatch: 'File content does not match type',
|
||||
storageFull: 'Insufficient storage space! File too large to save. Consider using URL method.',
|
||||
invalidUrlFormat: 'Invalid URL format',
|
||||
unsupportedProtocol: 'Only HTTP or HTTPS protocol links are supported',
|
||||
invalidSearchUrl: 'Generated search URL is invalid',
|
||||
copyFailed: 'Copy failed',
|
||||
cutFailed: 'Cut failed',
|
||||
cannotReadClipboard: 'Cannot read clipboard',
|
||||
|
||||
// Clock
|
||||
monday: 'Monday',
|
||||
tuesday: 'Tuesday',
|
||||
wednesday: 'Wednesday',
|
||||
thursday: 'Thursday',
|
||||
friday: 'Friday',
|
||||
saturday: 'Saturday',
|
||||
sunday: 'Sunday',
|
||||
|
||||
// Language
|
||||
language: 'Language',
|
||||
english: 'English',
|
||||
chinese: '简体中文',
|
||||
};
|
||||
95
src/i18n/locales/zh.ts
Normal file
95
src/i18n/locales/zh.ts
Normal file
@@ -0,0 +1,95 @@
|
||||
import { Translation } from '../types';
|
||||
|
||||
export const zh: Translation = {
|
||||
// Common
|
||||
settings: '设置',
|
||||
appearance: '外观',
|
||||
searchEngines: '搜索引擎',
|
||||
|
||||
// Theme Settings
|
||||
themeColor: '主题颜色',
|
||||
showSeconds: '显示秒数',
|
||||
use24HourFormat: '24小时制',
|
||||
maskBlurEffect: '遮罩层毛玻璃',
|
||||
searchHistory: '搜索历史记录',
|
||||
backgroundBlur: '背景模糊度',
|
||||
searchBoxOpacity: '搜索框不透明度',
|
||||
|
||||
// Wallpaper Settings
|
||||
wallpaperSettings: '壁纸设置',
|
||||
uploadImageVideo: '上传图片/视频',
|
||||
enterImageVideoUrl: '输入图片或视频链接...',
|
||||
apply: '应用',
|
||||
cover: '填充',
|
||||
contain: '适应',
|
||||
fill: '拉伸',
|
||||
repeat: '平铺',
|
||||
center: '居中',
|
||||
deleteWallpaper: '删除壁纸',
|
||||
|
||||
// Search Engine Manager
|
||||
addCustomEngine: '添加自定义引擎',
|
||||
editSearchEngine: '编辑搜索引擎',
|
||||
name: '名称',
|
||||
searchUrl: '搜索 URL (使用 %s 或直接结尾)',
|
||||
svgIconCode: 'SVG 图标代码',
|
||||
optional: '可选',
|
||||
preview: '预览',
|
||||
cancel: '取消',
|
||||
save: '保存',
|
||||
add: '添加',
|
||||
current: '当前使用',
|
||||
setDefault: '设为默认',
|
||||
edit: '编辑',
|
||||
delete: '删除',
|
||||
|
||||
// Search Box
|
||||
search: 'Search',
|
||||
searchOn: 'Search on',
|
||||
recentSearches: '最近搜索',
|
||||
clearHistory: '清空历史记录',
|
||||
|
||||
// Context Menu
|
||||
copy: '复制',
|
||||
cut: '剪切',
|
||||
paste: '粘贴',
|
||||
|
||||
// Error Boundary
|
||||
somethingWentWrong: '出错了',
|
||||
errorMessage: '应用遇到了一个意外错误。请尝试刷新页面或重置应用。',
|
||||
retry: '重试',
|
||||
refreshPage: '刷新页面',
|
||||
|
||||
// Toast Messages
|
||||
searchEngineDeleted: '搜索引擎已删除',
|
||||
searchEngineUpdated: '搜索引擎更新成功',
|
||||
newSearchEngineAdded: '新搜索引擎已添加',
|
||||
duplicateEngineName: '该搜索引擎名称已存在,请使用其他名称',
|
||||
customWallpaperApplied: '自定义壁纸已应用',
|
||||
wallpaperUploaded: '壁纸上传并应用成功',
|
||||
wallpaperDeleted: '自定义壁纸已删除',
|
||||
fileSizeExceeded: '文件大小不能超过 3.5MB。建议使用URL方式添加。',
|
||||
unsupportedFileType: '不支持的文件类型。仅支持:JPEG, PNG, GIF, WebP, SVG, MP4, WebM, OGG',
|
||||
fileContentMismatch: '文件内容与类型不匹配',
|
||||
storageFull: '存储空间不足!文件过大,无法保存。建议使用 URL 方式。',
|
||||
invalidUrlFormat: '无效的 URL 格式',
|
||||
unsupportedProtocol: '仅支持 HTTP 或 HTTPS 协议的链接',
|
||||
invalidSearchUrl: '生成的搜索 URL 无效',
|
||||
copyFailed: '复制失败',
|
||||
cutFailed: '剪切失败',
|
||||
cannotReadClipboard: '无法读取剪贴板',
|
||||
|
||||
// Clock
|
||||
monday: '星期一',
|
||||
tuesday: '星期二',
|
||||
wednesday: '星期三',
|
||||
thursday: '星期四',
|
||||
friday: '星期五',
|
||||
saturday: '星期六',
|
||||
sunday: '星期日',
|
||||
|
||||
// Language
|
||||
language: '语言',
|
||||
english: 'English',
|
||||
chinese: '简体中文',
|
||||
};
|
||||
95
src/i18n/types.ts
Normal file
95
src/i18n/types.ts
Normal file
@@ -0,0 +1,95 @@
|
||||
export type Language = 'en' | 'zh';
|
||||
|
||||
export interface Translation {
|
||||
// Common
|
||||
settings: string;
|
||||
appearance: string;
|
||||
searchEngines: string;
|
||||
|
||||
// Theme Settings
|
||||
themeColor: string;
|
||||
showSeconds: string;
|
||||
use24HourFormat: string;
|
||||
maskBlurEffect: string;
|
||||
searchHistory: string;
|
||||
backgroundBlur: string;
|
||||
searchBoxOpacity: string;
|
||||
|
||||
// Wallpaper Settings
|
||||
wallpaperSettings: string;
|
||||
uploadImageVideo: string;
|
||||
enterImageVideoUrl: string;
|
||||
apply: string;
|
||||
cover: string;
|
||||
contain: string;
|
||||
fill: string;
|
||||
repeat: string;
|
||||
center: string;
|
||||
deleteWallpaper: string;
|
||||
|
||||
// Search Engine Manager
|
||||
addCustomEngine: string;
|
||||
editSearchEngine: string;
|
||||
name: string;
|
||||
searchUrl: string;
|
||||
svgIconCode: string;
|
||||
optional: string;
|
||||
preview: string;
|
||||
cancel: string;
|
||||
save: string;
|
||||
add: string;
|
||||
current: string;
|
||||
setDefault: string;
|
||||
edit: string;
|
||||
delete: string;
|
||||
|
||||
// Search Box
|
||||
search: string;
|
||||
searchOn: string;
|
||||
recentSearches: string;
|
||||
clearHistory: string;
|
||||
|
||||
// Context Menu
|
||||
copy: string;
|
||||
cut: string;
|
||||
paste: string;
|
||||
|
||||
// Error Boundary
|
||||
somethingWentWrong: string;
|
||||
errorMessage: string;
|
||||
retry: string;
|
||||
refreshPage: string;
|
||||
|
||||
// Toast Messages
|
||||
searchEngineDeleted: string;
|
||||
searchEngineUpdated: string;
|
||||
newSearchEngineAdded: string;
|
||||
duplicateEngineName: string;
|
||||
customWallpaperApplied: string;
|
||||
wallpaperUploaded: string;
|
||||
wallpaperDeleted: string;
|
||||
fileSizeExceeded: string;
|
||||
unsupportedFileType: string;
|
||||
fileContentMismatch: string;
|
||||
storageFull: string;
|
||||
invalidUrlFormat: string;
|
||||
unsupportedProtocol: string;
|
||||
invalidSearchUrl: string;
|
||||
copyFailed: string;
|
||||
cutFailed: string;
|
||||
cannotReadClipboard: string;
|
||||
|
||||
// Clock
|
||||
monday: string;
|
||||
tuesday: string;
|
||||
wednesday: string;
|
||||
thursday: string;
|
||||
friday: string;
|
||||
saturday: string;
|
||||
sunday: string;
|
||||
|
||||
// Language
|
||||
language: string;
|
||||
english: string;
|
||||
chinese: string;
|
||||
}
|
||||
Reference in New Issue
Block a user