// ==UserScript==
// @name Civitai中文翻译插件
// @namespace https://github.com/ling552/
// @version 0.1.1
// @description 将Civitai网站翻译为简体中文
// @author Ling
// @match https://civitai.com/*
// @grant none
// @license MIT
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
// 翻译词典
const translations = {
// 导航栏
'home': '首页',
'models': '模型',
'images': '图片',
'videos': '视频',
'posts': '帖子',
'articles': '文章',
'bounties': '悬赏',
'challenges': '挑战',
'events': '活动',
'updates': '更新',
'shop': '商店',
'More': '更多',
'Create': '创建',
'Sign In': '登录',
'Pro': '专业版',
//更多
'Image': '图片',
'Video': '视频',
'REMIX':'二次创作',
'Modifiers': '修改器',
'period': '周期',
'blur': '模糊',
'Blur': '模糊',
'mature':'成人',
'Select the levels of content you want to see': '选择要查看的内容级别',
'Browsing': '浏览',
'With X or XXX enabled, some content may be hidden.': '启用x或xxx时,可能会隐藏某些内容。',
'Learn': '学习',
'swap': '替换',
'Prompt': '提示词',
'Steps': '步数',
'Seed': '种子',
'Priority': '优先级',
'Aspect Ratio': '比例',
'Square': '方形',
'Sampler': '采样器',
'Fast': '快速',
'Random': '随机',
'Balanced': '平衡',
'High': '高',
'Precise': '精确',
'Workflow': '工作流',
'Claim': '声称',
'View generation queue': '视图生成队列',
'Quantity': '数量',
'Buzzing!': '活跃!',
'Additional Resources': '额外资源',
'No resources selected': '未选择资源',
'Generation Type': '创建类型',
'Reactions': '反应',
'Liked': '喜欢',
'Disliked' :'不喜欢',
'Favorited' :'收藏',
'Remix (with seed)' :'二次创作(带种子)',
'Background Removal' :'去除背景',
'Face fix' :'面部修复',
'Hi-res fix' :'高清修复',
'Upscale' :'放大',
'Variations (img2img)' :'变化(图像到图像)',
'Image To Video' :'图像转视频',
'Open in New Tab' :'在新界面打开',
'Save image to collection' :'保存图片到收藏',
'View Post' :'查看帖子',
'Report image' :'举报图片',
'Hide this image' :'隐藏此图片',
'Hide content from this user' :'隐藏此用户内容',
// 模型相关
'Featured Models': '精选模型',
'Explore all models': '浏览所有模型',
'A list of all featured models on the site.': '网站上所有精选模型的列表。',
'Highest Rated': '最高评分',
'Early Access': '抢先体验',
'Filters': '筛选器',
'Checkpoint': '检查点',
'LoRA': 'LoRA',
'base model': '基础模型',
'character': '角色',
'style': '风格',
'concept': '概念',
'clothing': '服装',
'poses': '姿势',
'background': '背景',
'tool': '工具',
'vehicle': '载具',
'buildings': '建筑',
'objects': '物体',
'assets': '素材',
'animal': '动物',
'action': '动作',
// 图片相关
'Featured Images': '精选图片',
'Explore all images': '浏览所有图片',
'All sorts of cool pictures created by our community, from simple shapes to detailed landscapes or human faces. A virtual canvas where you can unleash your creativity or get inspired.': '我们社区创建的各种酷图,从简单的形状到详细的风景或人脸。一个虚拟画布,您可以在这里释放创造力或获得灵感。',
'Get Featured': '获得推荐',
// 创作者相关
'Top Creators': '顶级创作者',
'View more': '查看更多',
'Creators (Flux)': '创作者 (Flux)',
'Creators (Pony)': '创作者 (Pony)',
'Creators (SDXL)': '创作者 (SDXL)',
'Creators': '创作者',
'New Creators': '新创作者',
'Guardians': '守护者',
'Writers': '作家',
'Comedians': '喜剧演员',
'Master Generators': '大师生成器',
'New Master Generators': '新大师生成器',
'Base Model Creators': '基础模型创作者',
'Style Creators': '风格创作者',
'Clothing Creators': '服装创作者',
'Character Creators': '角色创作者',
'Architecture Creators': '建筑创作者',
'Background Creators': '背景创作者',
'Poses Creators': '姿势创作者',
'Vehicle Creators': '载具创作者',
'Asset Creators': '素材创作者',
'Tool Creators': '工具创作者',
// 文章相关
'Featured Articles': '精选文章',
'Explore all articles': '浏览所有文章',
'Find information, guides and tutorials, analysis on particular topics and much more. From the community, for the community.': '查找信息、指南和教程、特定主题的分析等等。来自社区,服务社区。',
// 其他功能
'Buzz Beggars Board': 'Buzz求助板',
'Beg or Give': '求助或给予',
'Ran out of Buzz while playing? Or want to be generous? Jump in.': '游戏时Buzz用完了?或者想要慷慨一些?快来参与吧。',
'View auctions': '查看拍卖',
'On Socials': '社交媒体',
'The latest from us and collaborators in the community. Follow us to stay up to date with the latest updates.': '来自我们和社区合作者的最新消息。关注我们以了解最新更新。',
'All': '全部',
// 竞赛相关
'The Boomer Bamboozle Contest': 'Boomer困惑大赛',
'is live! Show us your most absurdly believable AI images and videos to win big! Live now until Sept. 30th!': '正在进行中!向我们展示您最荒诞但令人信服的AI图片和视频来赢得大奖!现在开始,截止到9月30日!',
'Read the rules': '阅读规则',
// 会员相关
'Become a Member to turn off ads today.': '今天就成为会员来关闭广告。',
'Do It': '立即行动',
// 页脚
'Terms of Service': '服务条款',
'Privacy': '隐私',
'Safety': '安全',
'Newsroom': '新闻室',
'API': 'API',
'Status': '状态',
'Education': '教育',
'Careers': '招聘',
'Support': '支持',
'Users': '用户',
'Collections': '收藏',
'Tools': '工具',
// 常用动作词
'Download': '下载',
'Upload': '上传',
'Save': '保存',
'Share': '分享',
'Like': '喜欢',
'Follow': '关注',
'Comment': '评论',
'Reply': '回复',
'Edit': '编辑',
'Delete': '删除',
'Report': '举报',
'Search': '搜索',
'Filter': '筛选',
'Sort': '排序',
'Load more': '加载更多',
'Show more': '显示更多',
'Show less': '显示更少',
'View all': '查看全部',
// 时间相关
'ago': '前',
'minute': '分钟',
'minutes': '分钟',
'hour': '小时',
'hours': '小时',
'day': '天',
'days': '天',
'week': '周',
'weeks': '周',
'month': '月',
'months': '月',
'year': '年',
'years': '年',
// 数量单位
'k': 'k',
'M': 'M',
'B': 'B',
// 模型类型和标签
'NSFW': 'NSFW',
'SFW': 'SFW',
'Anime': '动漫',
'Realistic': '写实',
'Fantasy': '奇幻',
'Sci-Fi': '科幻',
'Portrait': '肖像',
'Landscape': '风景',
'Abstract': '抽象',
'Digital Art': '数字艺术',
'Photography': '摄影',
'3D': '3D',
'2D': '2D'
};
// 扩展翻译
const additionalTranslations = {
'Loading': '加载中',
'Error': '错误',
'Success': '成功',
'Warning': '警告',
'Info': '信息',
'Close': '关闭',
'Cancel': '取消',
'Confirm': '确认',
'Yes': '是',
'No': '否',
'OK': '确定',
'Submit': '提交',
'Reset': '重置',
'Clear': '清除',
'Next': '下一个',
'Previous': '上一个',
'First': '第一个',
'Last': '最后一个',
'Page': '页面',
'of': '共',
'Results': '结果',
'No results found': '未找到结果',
'Try again': '重试',
'Refresh': '刷新',
'Settings': '设置',
'Profile': '个人资料',
'Account': '账户',
'Login': '登录',
'Register': '注册',
'Logout': '退出登录',
'Password': '密码',
'Email': '邮箱',
'Username': '用户名',
'Name': '姓名',
'Description': '描述',
'Title': '标题',
'Content': '内容',
'Category': '分类',
'Tag': '标签',
'Tags': '标签',
'Rating': '评分',
'Reviews': '评价',
'Comments': '评论',
'Replies': '回复',
'Votes': '投票',
'Views': '查看',
'Downloads': '下载',
'Favorites': '收藏',
'Bookmarks': '书签',
'History': '历史',
'Notifications': '通知',
'Messages': '消息',
'Inbox': '收件箱',
'Sent': '已发送',
'Draft': '草稿',
'Trash': '垃圾箱',
'Archive': '存档',
'Trending': '热门',
'Popular': '流行',
'Latest': '最新',
'Recent': '最近',
'Featured': '精选',
'Recommended': '推荐',
'Hot': '热门',
'New': '新',
'Top': '顶部',
'Best': '最佳',
'Quality': '质量',
'Size': '大小',
'Format': '格式',
'Resolution': '分辨率',
'Duration': '时长',
'Date': '日期',
'Time': '时间',
'Author': '作者',
'Creator': '创作者',
'Artist': '艺术家',
'Model': '模型',
'Version': '版本',
'Update': '更新',
'Changelog': '更新日志',
'License': '许可证',
'Copyright': '版权',
'Terms': '条款',
'Conditions': '条件',
'Agreement': '协议',
'Policy': '政策',
'Guidelines': '指南',
'Rules': '规则',
'Help': '帮助',
'FAQ': '常见问题',
'Documentation': '文档',
'Tutorial': '教程',
'Guide': '指南',
'Examples': '示例',
'Demo': '演示',
'Preview': '预览',
'Sample': '样本',
'Template': '模板',
'Theme': '主题',
'Layout': '布局',
'Design': '设计',
'Style': '样式',
'Color': '颜色',
'Font': '字体',
'Size': '大小',
'Width': '宽度',
'Height': '高度',
'Margin': '边距',
'Padding': '内边距',
'Border': '边框',
'Background': '背景',
'Foreground': '前景',
'Opacity': '透明度',
'Visibility': '可见性',
'Display': '显示',
'Position': '位置',
'Alignment': '对齐',
'Justify': '对齐',
'Center': '居中',
'Left': '左',
'Right': '右',
'Top': '顶部',
'Bottom': '底部',
'Middle': '中间',
'Start': '开始',
'End': '结束',
'Full': '完整',
'Half': '一半',
'Quarter': '四分之一',
'Third': '三分之一',
'Auto': '自动',
'Manual': '手动',
'Custom': '自定义',
'Default': '默认',
'None': '无',
'All': '全部',
'Any': '任意',
'Other': '其他',
'More': '更多',
'Less': '更少',
'Show': '显示',
'Hide': '隐藏',
'Open': '打开',
'Close': '关闭',
'Expand': '展开',
'Collapse': '折叠',
'Minimize': '最小化',
'Maximize': '最大化',
'Restore': '恢复',
'Toggle': '切换',
'Switch': '切换',
'Change': '更改',
'Modify': '修改',
'Add': '添加',
'Remove': '移除',
'Insert': '插入',
'Append': '追加',
'Prepend': '前置',
'Replace': '替换',
'Move': '移动',
'Copy': '复制',
'Cut': '剪切',
'Paste': '粘贴',
'Duplicate': '复制',
'Clone': '克隆',
'Import': '导入',
'Export': '导出',
'Backup': '备份',
'Restore': '恢复',
'Sync': '同步',
'Connect': '连接',
'Disconnect': '断开连接',
'Online': '在线',
'Offline': '离线',
'Available': '可用',
'Unavailable': '不可用',
'Active': '活跃',
'Inactive': '非活跃',
'Enabled': '启用',
'Disabled': '禁用',
'On': '开启',
'Off': '关闭',
'True': '真',
'False': '假',
'Valid': '有效',
'Invalid': '无效',
'Required': '必需',
'Optional': '可选',
'Empty': '空',
'Full': '满',
'Complete': '完成',
'Incomplete': '未完成',
'Finished': '已完成',
'Unfinished': '未完成',
'Done': '完成',
'Pending': '待处理',
'Processing': '处理中',
'Failed': '失败',
'Cancelled': '已取消',
'Expired': '已过期',
'Deleted': '已删除',
'Archived': '已存档',
'Published': '已发布',
'Unpublished': '未发布',
'Draft': '草稿',
'Private': '私人',
'Public': '公开',
'Shared': '共享',
'Personal': '个人',
'Professional': '专业',
'Business': '商业',
'Enterprise': '企业',
'Free': '免费',
'Premium': '高级',
'Pro': '专业版',
'Basic': '基础',
'Standard': '标准',
'Advanced': '高级',
'Expert': '专家',
'Beginner': '初学者',
'Intermediate': '中级',
'Level': '等级',
'Rank': '排名',
'Score': '分数',
'Points': '积分',
'Credits': '积分',
'Coins': '金币',
'Tokens': '代币',
'Balance': '余额',
'Wallet': '钱包',
'Payment': '支付',
'Purchase': '购买',
'Buy': '购买',
'Sell': '出售',
'Price': '价格',
'Cost': '成本',
'Value': '价值',
'Amount': '数量',
'Total': '总计',
'Subtotal': '小计',
'Tax': '税',
'Discount': '折扣',
'Coupon': '优惠券',
'Promotion': '促销',
'Offer': '优惠',
'Deal': '交易',
'Sale': '销售',
'Special': '特殊',
'Limited': '限制',
'Exclusive': '独家',
'Bonus': '奖金',
'Reward': '奖励',
'Gift': '礼品',
'Prize': '奖品',
'Winner': '获胜者',
'Contest': '竞赛',
'Competition': '比赛',
'Challenge': '挑战',
'Event': '活动',
'Campaign': '活动',
'Program': '计划',
'Project': '项目',
'Task': '任务',
'Job': '工作',
'Mission': '任务',
'Goal': '目标',
'Objective': '目标',
'Purpose': '目的',
'Reason': '原因',
'Cause': '原因',
'Effect': '影响',
'Result': '结果',
'Outcome': '结果',
'Consequence': '后果',
'Impact': '影响',
'Influence': '影响',
'Benefit': '好处',
'Advantage': '优势',
'Disadvantage': '劣势',
'Pros': '优点',
'Cons': '缺点',
'Positive': '正面',
'Negative': '负面',
'Good': '好',
'Bad': '坏',
'Better': '更好',
'Worse': '更差',
'Best': '最好',
'Worst': '最差',
'Excellent': '优秀',
'Great': '很好',
'Amazing': '惊人',
'Awesome': '棒',
'Fantastic': '太棒了',
'Wonderful': '精彩',
'Perfect': '完美',
'Outstanding': '杰出',
'Remarkable': '卓越',
'Impressive': '令人印象深刻',
'Brilliant': '聪明',
'Creative': '创意',
'Innovative': '创新',
'Original': '原创',
'Unique': '独特',
'Special': '特殊',
'Rare': '稀有',
'Common': '常见',
'Popular': '流行',
'Famous': '著名',
'Known': '知名',
'Unknown': '未知',
'Anonymous': '匿名',
'Guest': '访客',
'Member': '会员',
'User': '用户',
'Admin': '管理员',
'Moderator': '版主',
'Staff': '员工',
'Team': '团队',
'Group': '组',
'Community': '社区',
'Organization': '组织',
'Company': '公司',
'Brand': '品牌',
'Product': '产品',
'Service': '服务',
'Feature': '功能',
'Function': '功能',
'Capability': '能力',
'Ability': '能力',
'Skill': '技能',
'Talent': '天赋',
'Experience': '经验',
'Knowledge': '知识',
'Information': '信息',
'Data': '数据',
'Details': '详情',
'Specification': '规格',
'Requirements': '要求',
'Conditions': '条件',
'Criteria': '标准',
'Standards': '标准',
'Quality': '质量',
'Performance': '性能',
'Speed': '速度',
'Efficiency': '效率',
'Accuracy': '准确性',
'Precision': '精确',
'Reliability': '可靠性',
'Stability': '稳定性',
'Security': '安全',
'Privacy': '隐私',
'Protection': '保护',
'Safety': '安全',
'Risk': '风险',
'Danger': '危险',
'Warning': '警告',
'Alert': '警报',
'Notice': '通知',
'Announcement': '公告',
'News': '新闻',
'Update': '更新',
'Upgrade': '升级',
'Improvement': '改进',
'Enhancement': '增强',
'Optimization': '优化',
'Modification': '修改',
'Adjustment': '调整',
'Configuration': '配置',
'Setup': '设置',
'Installation': '安装',
'Download': '下载',
'Upload': '上传',
'Transfer': '传输',
'Share': '分享',
'Send': '发送',
'Receive': '接收',
'Get': '获取',
'Fetch': '获取',
'Retrieve': '检索',
'Access': '访问',
'Enter': '进入',
'Exit': '退出',
'Leave': '离开',
'Return': '返回',
'Back': '返回',
'Forward': '前进',
'Continue': '继续',
'Proceed': '继续',
'Stop': '停止',
'Pause': '暂停',
'Resume': '恢复',
'Restart': '重启',
'Reload': '重新加载',
'Refresh': '刷新',
'Update': '更新',
'Sync': '同步',
'Save': '保存',
'Load': '加载',
'Import': '导入',
'Export': '导出',
'Print': '打印',
'Preview': '预览',
'View': '查看',
'Show': '显示',
'Display': '显示',
'Present': '展示',
'Demonstrate': '演示',
'Explain': '解释',
'Describe': '描述',
'Define': '定义',
'Clarify': '澄清',
'Specify': '指定',
'Indicate': '指示',
'Point': '指向',
'Select': '选择',
'Choose': '选择',
'Pick': '选择',
'Decide': '决定',
'Determine': '确定',
'Set': '设置',
'Adjust': '调整',
'Modify': '修改',
'Change': '更改',
'Alter': '改变',
'Transform': '转换',
'Convert': '转换',
'Translate': '翻译',
'Interpret': '解释',
'Understand': '理解',
'Comprehend': '理解',
'Realize': '实现',
'Recognize': '识别',
'Identify': '识别',
'Locate': '定位',
'Find': '查找',
'Search': '搜索',
'Look': '查看',
'Seek': '寻找',
'Hunt': '搜寻',
'Explore': '探索',
'Discover': '发现',
'Uncover': '揭露',
'Reveal': '揭示',
'Expose': '暴露',
'Show': '显示',
'Hide': '隐藏',
'Conceal': '隐藏',
'Cover': '覆盖',
'Protect': '保护',
'Secure': '保护',
'Guard': '守护',
'Defend': '防御',
'Shield': '保护',
'Block': '阻挡',
'Prevent': '防止',
'Avoid': '避免',
'Escape': '逃避',
'Flee': '逃离',
'Run': '运行',
'Walk': '走',
'Move': '移动',
'Go': '去',
'Come': '来',
'Arrive': '到达',
'Depart': '离开',
'Travel': '旅行',
'Journey': '旅程',
'Trip': '旅行',
'Visit': '访问',
'Stay': '停留',
'Remain': '保持',
'Keep': '保持',
'Maintain': '维护',
'Preserve': '保存',
'Conserve': '保护',
'Protect': '保护',
'Care': '关心',
'Support': '支持',
'Help': '帮助',
'Assist': '协助',
'Aid': '帮助',
'Guide': '指导',
'Lead': '领导',
'Direct': '指导',
'Manage': '管理',
'Control': '控制',
'Handle': '处理',
'Deal': '处理',
'Treat': '处理',
'Process': '处理',
'Execute': '执行',
'Perform': '执行',
'Accomplish': '完成',
'Achieve': '实现',
'Reach': '达到',
'Attain': '获得',
'Obtain': '获得',
'Acquire': '获得',
'Gain': '获得',
'Earn': '赚取',
'Win': '赢得',
'Lose': '失去',
'Miss': '错过',
'Fail': '失败',
'Succeed': '成功',
'Pass': '通过',
'Complete': '完成',
'Finish': '完成',
'End': '结束',
'Conclude': '结束',
'Close': '关闭',
'Shut': '关闭',
'Open': '打开',
'Start': '开始',
'Begin': '开始',
'Commence': '开始',
'Initiate': '启动',
'Launch': '启动',
'Create': '创建',
'Make': '制作',
'Build': '构建',
'Construct': '建造',
'Develop': '开发',
'Design': '设计',
'Plan': '计划',
'Prepare': '准备',
'Ready': '准备',
'Set': '设置',
'Organize': '组织',
'Arrange': '安排',
'Schedule': '安排',
'Book': '预订',
'Reserve': '预留',
'Order': '订购',
'Request': '请求',
'Ask': '询问',
'Question': '问题',
'Answer': '答案',
'Reply': '回复',
'Respond': '回应',
'React': '反应',
'Interact': '交互',
'Communicate': '沟通',
'Talk': '谈话',
'Speak': '说话',
'Say': '说',
'Tell': '告诉',
'Inform': '通知',
'Notify': '通知',
'Alert': '提醒',
'Remind': '提醒',
'Warn': '警告',
'Advise': '建议',
'Suggest': '建议',
'Recommend': '推荐',
'Propose': '提议',
'Offer': '提供',
'Provide': '提供',
'Supply': '提供',
'Deliver': '交付',
'Give': '给予',
'Present': '赠送',
'Grant': '授予',
'Allow': '允许',
'Permit': '允许',
'Enable': '启用',
'Disable': '禁用',
'Activate': '激活',
'Deactivate': '停用',
'Turn on': '开启',
'Turn off': '关闭',
'Switch on': '打开',
'Switch off': '关闭'
};
// 站点定制翻译
const siteSpecificTranslations = {
// 顶部筛选/排序
'Everyone': '所有人',
'Following': '关注的人',
'Followed': '关注的人',
'Most Reactions': '最多互动',
'Most Reaction': '最多互动',
'Most Comments': '最多评论',
'Most Collected': '最多收藏',
'Most Buzz': '最多 Buzz',
// 创建菜单
'Generate': '生图',
'Post Images': '发布图片',
'Post Videos': '发布视频',
'Upload a Model': '上传模型',
'Train a LoRA': '训练 LoRA',
'Write an Article': '写文章',
'Create a Bounty': '创建悬赏',
// 侧边菜单
'Your Profile': '你的个人资料',
'Training': '训练',
'My': '我的',
'My Collections': '我的收藏',
'Liked Models': '喜欢的模型',
'Bookmarked Articles': '收藏的文章',
'My Bounties': '我的悬赏',
'Buzz Dashboard': 'Buzz仪表板',
'My Vault': '我的保险库',
'Leaderboard': '排行榜',
'Auctions': '拍卖',
'Knights': '骑士',
'Knights Update': '骑士更新',
'Download Link App': '下载 Link 应用',
'Link App': 'Link 应用',
'Creators You Follow': '你关注的创作者',
'Download History': '下载历史',
'Getting Started': '新手入门',
// 导航标签页
'Pro': '专业版',
'Buzz': 'Buzz',
'Sign In': '登录',
'Create': '创建',
'Models': '模型',
'Images': '图片',
'Videos': '视频',
'Articles': '文章',
'Bounties': '悬赏',
'Shop': '商店',
'Contests': '竞赛',
// 页面元素
'Contests': '竞赛',
'Contest': '竞赛',
'Competition': '比赛',
'Prize': '奖品',
'Reward': '奖励',
'Winner': '获胜者',
'Entry': '参赛作品',
'Entries': '参赛作品',
'Submission': '投稿',
'Submissions': '投稿',
'Deadline': '截止日期',
'Voting': '投票',
'Results': '结果',
// 创建下拉菜单
'Post Image': '发布图片',
'Post Video': '发布视频',
'Write Article': '写文章',
'Upload Model': '上传模型',
'Create Bounty': '创建悬赏',
'Train LoRA': '训练 LoRA',
// 分类标签(复数形式补充)
'WOMEN': '女性',
'Women': '女性',
'woman': '女性',
'MEN': '男性',
'Men': '男性',
'man': '男性',
'CLOTHING': '服装',
'Clothing': '服装',
'clothing': '服装',
'ANIME': '动漫',
'Anime': '动漫',
'anime': '动漫',
'OUTDOORS': '户外',
'Outdoors': '户外',
'outdoors': '户外',
'COMICS': '漫画',
'Comics': '漫画',
'comics': '漫画',
'PHOTOGRAPHY': '摄影',
'Photography': '摄影',
'photography': '摄影',
'COSTUME': '服饰',
'Costume': '服饰',
'costume': '服饰',
'SWIMWEAR': '游泳装',
'Swimwear': '游泳装',
'swimwear': '游泳装',
'ARMOR': '盔甲',
'Armor': '盔甲',
'armor': '盔甲',
'TRANSPORTATION': '交通工具',
'Transportation': '交通工具',
'transportation': '交通工具',
'ARCHITECTURE': '建筑',
'Architecture': '建筑',
'architecture': '建筑',
'CITY': '城市',
'City': '城市',
'city': '城市',
'CARTOON': '卡通',
'Cartoon': '卡通',
'cartoon': '卡通',
'CAR': '汽车',
'Car': '汽车',
'car': '汽车',
'FOOD': '食物',
'Food': '食物',
'food': '食物',
'ASTRONOMY': '天文',
'Astronomy': '天文',
'astronomy': '天文',
'MODERN ART': '现代艺术',
'Modern Art': '现代艺术',
'modern art': '现代艺术',
'CAT': '猫',
'Cat': '猫',
'cat': '猫',
'FANTASY': '奇幻',
'Fantasy': '奇幻',
'fantasy': '奇幻',
'NATURE': '自然',
'Nature': '自然',
'nature': '自然',
'PORTRAIT': '肖像',
'Portrait': '肖像',
'portrait': '肖像',
'LANDSCAPE': '风景',
'Landscape': '风景',
'landscape': '风景',
// 筛选器相关
'Filters': '筛选器',
'Filter': '筛选',
'Filter by': '筛选依据',
'Sort by': '排序依据',
'Sort': '排序',
'Order': '排序',
'Newest': '最新',
'Oldest': '最早',
'Latest': '最新',
'Recent': '最近',
'Popular': '热门',
'Trending': '趋势',
'Hot': '热门',
'Top': '热门',
'Best': '最佳',
'Highest Rated': '最高评分',
'Most Downloaded': '最多下载',
'Most Liked': '最多点赞',
'Most Commented': '最多评论',
'Most Viewed': '最多查看',
// 按钮和操作
'Download': '下载',
'Like': '点赞',
'Unlike': '取消点赞',
'Bookmark': '收藏',
'Unbookmark': '取消收藏',
'Share': '分享',
'Comment': '评论',
'Reply': '回复',
'Report': '举报',
'Flag': '标记',
'Follow': '关注',
'Unfollow': '取消关注',
'Subscribe': '订阅',
'Unsubscribe': '取消订阅',
'Block': '屏蔽',
'Unblock': '取消屏蔽',
'Edit': '编辑',
'Delete': '删除',
'Remove': '移除',
'Add': '添加',
'Upload': '上传',
'Submit': '提交',
'Publish': '发布',
'Draft': '草稿',
'Save': '保存',
'Cancel': '取消',
'Confirm': '确认',
'Apply': '应用',
'Reset': '重置',
'Clear': '清除',
// 状态和标签
'Published': '已发布',
'Unpublished': '未发布',
'Draft': '草稿',
'Pending': '待审核',
'Approved': '已批准',
'Rejected': '已拒绝',
'Featured': '精选',
'Sponsored': '赞助',
'Premium': '高级',
'Free': '免费',
'Paid': '付费',
'NSFW': 'NSFW',
'SFW': 'SFW',
'New': '新',
'Updated': '已更新',
'Hot': '热门',
'Trending': '趋势',
'Rising': '上升',
// 数量和统计
'views': '查看次数',
'likes': '点赞数',
'downloads': '下载次数',
'comments': '评论数',
'followers': '粉丝数',
'following': '关注数',
'bounties': '悬赏数',
'collections': '收藏数',
// 时间相关
'ago': '前',
'minute': '分钟',
'minutes': '分钟',
'hour': '小时',
'hours': '小时',
'day': '天',
'days': '天',
'week': '周',
'weeks': '周',
'month': '月',
'months': '月',
'year': '年',
'years': '年',
'just now': '刚刚',
'recently': '最近',
'today': '今天',
'yesterday': '昨天',
'tomorrow': '明天',
// 页面标题和描述
'Home': '首页',
'Browse': '浏览',
'Explore': '探索',
'Discover': '发现',
'Search': '搜索',
'Profile': '个人资料',
'Settings': '设置',
'Dashboard': '仪表板',
'Notifications': '通知',
'Messages': '消息',
'Help': '帮助',
'Support': '支持',
'About': '关于',
'Contact': '联系',
'Terms': '条款',
'Privacy': '隐私',
'Guidelines': '指南',
'Rules': '规则',
'FAQ': '常见问题'
};
// 合并所有翻译
const allTranslations = { ...translations, ...siteSpecificTranslations, ...additionalTranslations };
const lowerCaseTranslations = {};
for (const [k, v] of Object.entries(allTranslations)) {
lowerCaseTranslations[k.toLowerCase()] = v;
}
// 追加常见缺失词条(筛选/短语变体/所有格)
Object.assign(siteSpecificTranslations, {
'Filters': '筛选器',
'Filter by': '筛选依据',
'Sort by': '排序依据',
'Newest': '最新',
'Oldest': '最早',
// 创建菜单变体
'Upload a model': '上传模型',
'Upload model': '上传模型',
'Upload Model': '上传模型',
'Train LoRA': '训练 LoRA',
'Create Bounty': '创建悬赏'
});
Object.assign(additionalTranslations, {
'Your': '你的'
});
// 同步更新大小写映射
for (const [k, v] of Object.entries(siteSpecificTranslations)) lowerCaseTranslations[k.toLowerCase()] = v;
for (const [k, v] of Object.entries(additionalTranslations)) lowerCaseTranslations[k.toLowerCase()] = v;
const translationCache = new Map();
function translateText(text) {
if (!text || typeof text !== 'string') return text;
if (translationCache.has(text)) {
return translationCache.get(text);
}
let translatedText = text;
if (allTranslations[text]) {
translatedText = allTranslations[text];
} else if (lowerCaseTranslations[text.toLowerCase()]) {
translatedText = lowerCaseTranslations[text.toLowerCase()];
} else {
const words = text.split(/(\s+)/);
let hasTranslation = false;
for (let i = 0; i < words.length; i++) {
const raw = words[i];
const word = raw.trim();
if (!word) continue;
const lc = word.toLowerCase();
const repl = allTranslations[word] || lowerCaseTranslations[lc];
if (repl) {
words[i] = raw.replace(word, repl);
hasTranslation = true;
}
}
if (hasTranslation) {
translatedText = words.join('');
}
}
translationCache.set(text, translatedText);
return translatedText;
}
function tryTranslateCompoundPhraseForElement(node) {
if (!node || node.nodeType !== Node.ELEMENT_NODE) return false;
if (node.hasAttribute('data-civi-cn-compound')) return false; // 已处理
const combinedRaw = (node.textContent || '').trim();
if (!combinedRaw) return false;
if (combinedRaw.length > 80) return false;
if (!/\s/.test(combinedRaw)) return false;
const combinedNormalized = combinedRaw.replace(/\s+/g, ' ').trim();
const lookup = (s) => (allTranslations[s] || lowerCaseTranslations[s.toLowerCase()]);
let repl = lookup(combinedRaw);
if (!repl) repl = lookup(combinedNormalized);
if (!repl || repl === combinedRaw) return false;
const textNodes = [];
const walker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, null);
let current;
while ((current = walker.nextNode())) {
if ((current.textContent || '').trim() === '') continue;
textNodes.push(current);
}
if (textNodes.length === 0) return false;
textNodes[0].textContent = repl;
for (let i = 1; i < textNodes.length; i++) {
textNodes[i].textContent = '';
}
node.setAttribute('data-civi-cn-compound', '1');
return true;
}
function translateNode(node) {
if (node.nodeType === Node.TEXT_NODE) {
const originalText = node.textContent.trim();
if (originalText) {
const translatedText = translateText(originalText);
if (translatedText !== originalText) {
node.textContent = translatedText;
}
}
} else if (node.nodeType === Node.ELEMENT_NODE) {
const tagName = node.tagName.toLowerCase();
if (['script', 'style', 'noscript', 'code', 'pre'].includes(tagName)) {
return;
}
tryTranslateCompoundPhraseForElement(node);
const attributesToTranslate = ['title', 'alt', 'placeholder', 'aria-label'];
attributesToTranslate.forEach(attr => {
if (node.hasAttribute(attr)) {
const originalValue = node.getAttribute(attr);
const translatedValue = translateText(originalValue);
if (translatedValue !== originalValue) {
node.setAttribute(attr, translatedValue);
}
}
});
const childNodes = Array.from(node.childNodes);
childNodes.forEach(child => {
translateNode(child);
});
}
}
function translatePage() {
try {
translateNode(document.body);
} catch (error) {
console.warn('Civitai翻译脚本遇到错误:', error);
}
}
function debounce(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
}
const debouncedTranslate = debounce(translatePage, 500);
const observer = new MutationObserver((mutations) => {
let shouldTranslate = false;
mutations.forEach((mutation) => {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === Node.ELEMENT_NODE || node.nodeType === Node.TEXT_NODE) {
shouldTranslate = true;
}
});
} else if (mutation.type === 'characterData') {
shouldTranslate = true;
}
});
if (shouldTranslate) {
debouncedTranslate();
}
});
function initializeTranslation() {
translatePage();
observer.observe(document.body, {
childList: true,
subtree: true,
characterData: true,
attributes: false
});
let currentUrl = window.location.href;
const checkForUrlChange = () => {
if (window.location.href !== currentUrl) {
currentUrl = window.location.href;
setTimeout(() => {
translatePage();
}, 1000);
}
};
window.addEventListener('popstate', checkForUrlChange);
setInterval(checkForUrlChange, 2000);
const originalFetch = window.fetch;
window.fetch = function(...args) {
return originalFetch.apply(this, args).then((response) => {
setTimeout(debouncedTranslate, 1000);
return response;
});
};
console.log('Civitai中文翻译脚本已启动');
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initializeTranslation);
} else {
initializeTranslation();
}
const style = document.createElement('style');
style.textContent = `
/* 防止翻译过程中的闪烁 */
.translating {
opacity: 0.8;
}
`;
document.head.appendChild(style);
window.addEventListener('beforeunload', () => {
observer.disconnect();
});
if (window.location.href.includes('debug=true')) {
window.civitaiTranslate = {
translatePage,
translateText,
clearCache: () => translationCache.clear(),
cacheSize: () => translationCache.size
};
console.log('调试模式:可使用 window.civitaiTranslate 对象进行手动控制');
}
})();