Files
doc_ai_frontend/src/lib/translations.ts
yoge dceb775a1b feat: replace all marketing home components with reference landing design
- Extract landing.css (scoped under .marketing-page) from texpixel-landing.html
- Add Lora + JetBrains Mono fonts to index.html
- Update MarketingLayout with .marketing-page wrapper and glow blobs
- Replace MarketingNavbar with reference design (auth-aware user menu)
- Replace HeroSection with mock window + cycling LaTeX typing effect
- Replace FeaturesSection, PricingSection, Footer with reference designs
- Add ProductSuiteSection, ShowcaseSection, TestimonialsSection (carousel), DocsSeoSection
- Add useScrollReveal hook for intersection-based fade-in animations
- Update HomePage to wire all sections in correct order
- Remove obsolete HowItWorksSection and ContactSection
- Remove dead contact key from marketing.nav translations

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 15:57:39 +08:00

346 lines
13 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export const translations = {
en: {
common: {
upload: 'Upload',
history: 'History',
login: 'Login / Register',
logout: 'Logout',
loading: 'Loading...',
processing: 'Processing...',
cancel: 'Cancel',
copy: 'Copy',
copied: 'Copied!',
download: 'Download',
export: 'Export',
preview: 'Preview',
email: 'Email',
contactUs: 'Contact Us',
reward: 'Reward',
qqGroup: 'QQ Group (Click to Copy)',
guide: 'User Guide',
click: 'Click',
drop: 'Drop',
paste: 'Paste',
},
navbar: {
rewardTitle: 'WeChat Reward',
rewardThanks: 'Thank you for your support and encouragement ❤️',
rewardSubtitle: 'Your support is our motivation for continuous updates',
},
sidebar: {
title: 'Formula Recognize',
subtitle: 'Support handwriting and printed formulas',
uploadInstruction: 'Click, Drop, or Paste a file to start parsing',
pleaseLogin: 'Please login to view history',
noHistory: 'No history records',
noMore: 'No more records',
historyHeader: 'History',
},
uploadModal: {
title: 'Upload File',
supportFormats: 'Support JPG, PNG, PDF format',
},
resultPanel: {
waitingTitle: 'Waiting for recognition result',
waitingSubtitle: 'After uploading the file, Texpixel will automatically recognize and display the result here',
analyzing: 'Analyzing...',
waitingQueue: 'Waiting in queue...',
queueSubtitle: 'Your file is in the queue, please wait.',
processingSubtitle: 'Texpixel is processing your file, this may take a moment.',
markdown: 'Markdown',
},
auth: {
signIn: 'Login',
signUp: 'Register',
signInTitle: 'Login Account',
signUpTitle: 'Register Account',
email: 'Email',
password: 'Password',
error: 'Error',
genericError: 'An error occurred, please try again',
hasAccount: 'Already have an account? Login',
noAccount: 'No account? Register',
continueWithGoogle: 'Google',
emailHint: 'Used only for sign-in and history sync.',
emailRequired: 'Please enter your email address.',
emailInvalid: 'Please enter a valid email address.',
passwordRequired: 'Please enter your password.',
passwordHint: 'Use at least 6 characters. Letters and numbers are recommended.',
confirmPassword: 'Confirm Password',
passwordMismatch: 'The two passwords do not match.',
oauthRedirecting: 'Redirecting to Google...',
oauthExchanging: 'Completing Google sign-in...',
invalidOAuthState: 'Invalid OAuth state, please retry.',
oauthFailed: 'Google sign-in failed, please retry.',
},
export: {
title: 'Export',
categories: {
code: 'Code',
image: 'Image',
file: 'File',
},
failed: 'Export failed, please try again',
imageFailed: 'Failed to generate image',
noContent: 'Mixed text and formulas do not support LaTeX/MathML export. Please download DOCX format instead.',
noContentShort: 'Not supported for mixed content',
},
guide: {
next: 'Next',
prev: 'Back',
finish: 'Finish',
skip: 'Skip',
step1Title: 'Upload Area',
step1Content: 'Click or drag and drop your formula images/PDFs here to start recognition.',
step2Title: 'File History',
step2Content: 'Your recognized files will appear here. Login to sync across devices.',
step3Title: 'Preview Area',
step3Content: 'The original file you uploaded will be displayed here for comparison.',
step4Title: 'Recognition Result',
step4Content: 'The recognition results (Markdown/LaTeX) will be shown here.',
stepExportTitle: 'Export Result',
stepExportContent: 'You can export the recognition results to various formats such as Markdown, LaTeX, Word, or Image.',
},
alerts: {
taskTimeout: 'Task timeout: Recognition took too long.',
networkError: 'Task timeout or network error.',
uploadFailed: 'Upload failed',
},
marketing: {
nav: {
home: 'Home',
docs: 'Docs',
blog: 'Blog',
pricing: 'Pricing',
launchApp: 'Launch App',
},
hero: {
title: 'Convert Math Formulas to LaTeX in Seconds',
subtitle: 'AI-powered OCR for handwritten and printed mathematical formulas. Get LaTeX, MathML, and Markdown output instantly.',
cta: 'Try It Free',
ctaSecondary: 'Learn More',
},
features: {
title: 'Features',
subtitle: 'Everything you need for formula recognition',
handwriting: 'Handwriting Recognition',
handwritingDesc: 'Accurately recognize handwritten math formulas from photos or scans',
multiFormat: 'Multi-Format Output',
multiFormatDesc: 'Export to LaTeX, MathML, Markdown, Word, and more',
pdf: 'PDF Support',
pdfDesc: 'Upload PDF documents and extract formulas automatically',
batch: 'Batch Processing',
batchDesc: 'Process multiple files at once for maximum efficiency',
accuracy: 'High Accuracy',
accuracyDesc: 'Powered by advanced AI models for industry-leading accuracy',
free: 'Free to Start',
freeDesc: 'Get started with free uploads, no credit card required',
},
howItWorks: {
title: 'How It Works',
step1: 'Upload',
step1Desc: 'Upload an image or PDF containing math formulas',
step2: 'Recognize',
step2Desc: 'Our AI analyzes and recognizes the formulas',
step3: 'Export',
step3Desc: 'Copy or export results in your preferred format',
},
pricing: {
title: 'Pricing',
subtitle: 'Choose the plan that fits your needs',
free: 'Free',
pro: 'Pro',
enterprise: 'Enterprise',
monthly: '/month',
custom: 'Custom',
getStarted: 'Get Started',
comingSoon: 'Coming Soon',
contactUs: 'Contact Us',
popular: 'Most Popular',
freeFeatures: ['3 uploads/day', 'LaTeX & Markdown output', 'Community support'],
proFeatures: ['Unlimited uploads', 'All export formats', 'Priority processing', 'API access'],
enterpriseFeatures: ['Custom volume', 'Dedicated support', 'SLA guarantee', 'On-premise option'],
},
footer: {
tagline: 'AI-powered math formula recognition',
product: 'Product',
resources: 'Resources',
contactTitle: 'Contact',
},
},
},
zh: {
common: {
upload: '上传',
history: '历史记录',
login: '登录 / 注册',
logout: '退出登录',
loading: '加载中...',
processing: '处理中...',
cancel: '取消',
copy: '复制',
copied: '已复制!',
download: '下载',
export: '导出',
preview: '预览',
email: '邮箱',
contactUs: '联系我们',
reward: '赞赏',
qqGroup: 'QQ 群 (点击复制)',
guide: '使用引导',
click: '点击',
drop: '拖拽',
paste: '粘贴',
},
navbar: {
rewardTitle: '微信赞赏码',
rewardThanks: '感谢您的支持与鼓励 ❤️',
rewardSubtitle: '您的支持是我们持续更新的动力',
},
sidebar: {
title: '文档识别',
subtitle: '支持手写和印刷体文档识别',
uploadInstruction: '点击、拖拽或粘贴文件开始解析',
pleaseLogin: '请登录后查看历史记录',
noHistory: '暂无历史记录',
noMore: '没有更多记录了',
historyHeader: '历史记录',
},
uploadModal: {
title: '上传文件',
supportFormats: '支持 JPG, PNG 格式',
},
resultPanel: {
waitingTitle: '等待识别结果',
waitingSubtitle: '上传文件后TexPixel 将自动识别并在此显示结果',
analyzing: '解析中...',
waitingQueue: '排队中...',
queueSubtitle: '您的文件正在排队,请稍候。',
processingSubtitle: 'TexPixel 正在处理您的文件,请稍候。',
markdown: 'Markdown',
},
auth: {
signIn: '登录',
signUp: '注册',
signInTitle: '登录账号',
signUpTitle: '注册账号',
email: '邮箱',
password: '密码',
error: '错误',
genericError: '发生错误,请重试',
hasAccount: '已有账号?去登录',
noAccount: '没有账号?去注册',
continueWithGoogle: 'Google',
emailHint: '仅用于登录和同步记录。',
emailRequired: '请输入邮箱地址。',
emailInvalid: '请输入有效的邮箱地址。',
passwordRequired: '请输入密码。',
passwordHint: '密码至少 6 位,建议使用字母和数字组合。',
confirmPassword: '确认密码',
passwordMismatch: '两次输入的密码不一致。',
oauthRedirecting: '正在跳转 Google...',
oauthExchanging: '正在完成 Google 登录...',
invalidOAuthState: 'OAuth 状态校验失败,请重试',
oauthFailed: 'Google 登录失败,请重试',
},
export: {
title: '导出',
categories: {
code: '代码',
image: '图片',
file: '文件',
},
failed: '导出失败,请重试',
imageFailed: '生成图片失败',
noContent: '混合文字内容不支持 LaTeX/MathML 导出,请下载 DOCX 文件。',
noContentShort: '混合内容不支持',
},
guide: {
next: '下一步',
prev: '上一步',
finish: '完成',
skip: '跳过',
step1Title: '上传区域',
step1Content: '点击此处或将公式/文档图片 粘贴或者拖拽到这里开始识别。',
step2Title: '历史记录',
step2Content: '识别过的文件会显示在这里。登录后可以跨设备同步。',
step3Title: '预览区域',
step3Content: '这里会显示您上传的原始文件,方便对比。',
step4Title: '识别结果',
step4Content: '这里会显示识别出的 Markdown/LaTeX 结果。',
stepExportTitle: '导出结果',
stepExportContent: '您可以将识别结果导出为多种格式,如 Markdown、LaTeX、Word 或图片。',
},
alerts: {
taskTimeout: '任务超时:识别时间过长。',
networkError: '任务超时或网络错误。',
uploadFailed: '上传失败',
},
marketing: {
nav: {
home: '首页',
docs: '文档',
blog: '博客',
pricing: '价格',
launchApp: '启动应用',
},
hero: {
title: '数学公式秒级转换为 LaTeX',
subtitle: 'AI 驱动的手写和印刷体数学公式识别,即时输出 LaTeX、MathML 和 Markdown。',
cta: '免费试用',
ctaSecondary: '了解更多',
},
features: {
title: '功能特性',
subtitle: '公式识别所需的一切',
handwriting: '手写识别',
handwritingDesc: '精准识别照片或扫描件中的手写数学公式',
multiFormat: '多格式输出',
multiFormatDesc: '导出为 LaTeX、MathML、Markdown、Word 等格式',
pdf: 'PDF 支持',
pdfDesc: '上传 PDF 文档,自动提取公式',
batch: '批量处理',
batchDesc: '一次处理多个文件,效率最大化',
accuracy: '高精度',
accuracyDesc: '由先进 AI 模型驱动,行业领先的识别精度',
free: '免费开始',
freeDesc: '免费上传体验,无需信用卡',
},
howItWorks: {
title: '使用流程',
step1: '上传',
step1Desc: '上传包含数学公式的图片或 PDF',
step2: '识别',
step2Desc: '我们的 AI 分析并识别公式',
step3: '导出',
step3Desc: '复制或导出为你喜欢的格式',
},
pricing: {
title: '价格方案',
subtitle: '选择适合您的方案',
free: '免费版',
pro: '专业版',
enterprise: '企业版',
monthly: '/月',
custom: '定制',
getStarted: '开始使用',
comingSoon: '即将推出',
contactUs: '联系我们',
popular: '最受欢迎',
freeFeatures: ['每日 3 次上传', 'LaTeX 和 Markdown 输出', '社区支持'],
proFeatures: ['无限上传', '所有导出格式', '优先处理', 'API 访问'],
enterpriseFeatures: ['自定义用量', '专属支持', 'SLA 保障', '私有部署选项'],
},
footer: {
tagline: 'AI 驱动的数学公式识别',
product: '产品',
resources: '资源',
contactTitle: '联系方式',
},
},
}
};
export type Language = 'en' | 'zh';
export type TranslationKey = typeof translations.en;