go-proxy-bingai/web/js/index.js

401 lines
20 KiB
JavaScript
Raw Normal View History

2023-05-03 11:30:10 +08:00
const sydConvTranslation = {
actionBarPlaceholder: '有问题尽管问我...',
actionBarAriaLabel: '询问必应',
actionBarComposeButton: '新主题',
actionBarNewChatButtonDesktop: '开始新聊天',
actionBarNewChatButtonMobile: '新建聊天',
actionBarOngoingConvPlaceholder: '键入消息',
captchaTitle: '验证身份',
captchaDescription: '若要继续,请在下图中输入字符。',
captchaPlaceholder: '输入字符...',
captchaPlaceholderError: '抱歉,请重试。',
next: '下一步',
cancel: '取消',
feedbackAccessed: '访问时间',
feedbackSource: '源: 与必应的对话,',
feedbackShareConversationQuery: '什么是新版必应?',
messageLearnMore: '了解详细信息:',
letsChat: '我们聊天吧',
pause: '暂停',
play: '开始游戏',
speechFailedRecognitionError: '抱歉,我无法收听你的声音,因为语音服务器已关闭,请稍后再试。',
speechListening: '我听着呢...',
speechLoading: '正在等待音频...',
speechMediaNotReachableError: '很抱歉,我无法收听你的声音,因为你没有可用的麦克风。',
speechNoPermissionError: '你需要启用麦克风,我才能听到你的声音。',
speechAudioPlaybackError: '出错了。',
stop: '停止',
welcomeContainerPrivacyStatement: '隐私声明',
welcomeContainerUseTerms: '使用条款',
welcomeMessageItemContent1: '我可以为我挑剔的只吃橙色食物的孩子做什么饭?',
welcomeMessageItemContent2: '销量最高的 3 种宠物吸尘器有哪些优点和缺点?',
welcomeMessageItemContent3: '以海盗的口吻写一首关于外太空鳄鱼的俳句',
welcomeMessageItemTitle1: '🧐 提出复杂问题',
welcomeMessageItemTitle2: '🙌获取更好的答案',
welcomeMessageItemTitle3: '🎨 获得创意灵感',
welcomeMessageItemLabel4: '更多创意中的新增功能:',
warmWelcomeTitle: '欢迎使用新必应',
welcomeSubtitleText: '由 AI 支持的网页版 Copilot',
workToggleDescription: '以及你的结果包括哪些内容',
feedbackFirstMessage: '非常抱歉没有帮助到你。是否可以详细说明你不喜欢的方面?',
feedbackPromptMessage: '感谢提醒。请提供反馈,以便必应团队可以查看。',
feedbackPromptGiveFeedback: '提供反馈',
feedbackPromptGiveFeedbackAriaLabel: '提供反馈',
feedbackPromptReportAConcern: '报告问题',
feedbackPromptPositive: '很高兴你喜欢这个答案!',
feedbackFormTitleText: '为什么这不起作用?',
feedbackFormInputDefaultText: '在此处添加更多详细信息。为了帮助保护你的隐私,请不要填入你的姓名或电子邮件地址等个人信息。',
feedbackFormLegalText: '是否有法律或政策问题?',
feedbackFormReportAConcern: '报告问题',
feedbackFormNotificationTitleText: '反馈已提交',
feedbackFormNotificationBodyText: '感谢你帮助必应改进!',
serpFeedbackFormTitleText: '请帮助我们改进体验',
serpFeedbackFormInputDefaultText: '在此处输入反馈。为了帮助保护你的隐私,请不要填入你的姓名或电子邮件地址等个人信息。',
serpFeedbackFormScreenshot: '包括此屏幕截图',
submit: '提交',
metaInternalSearchQuery: '正在搜索: `{0}`',
metaInternalLoaderMessage: '正在为你生成答案...',
compliantMetaInternalLoaderMessage: '从 {0} 生成安全答案',
messageSharedContent: '共享内容',
clickToView: '单击以查看',
more: '更多',
expand: '展开',
welcomeTertiaryTitleText: '使用 AI 的强大功能从 Web 中查找答案、创建书面内容等。',
actionBarTextInputAriaLabel: '询问必应',
seeMore: '查看更多',
seeLess: '查看更少',
raiSuggestions: '这是什么?',
actionBarStopStreamingAriaLabel: '停止流式传输',
actionBarTextInputModeButtonAriaLabel: '文本输入模式',
actionBarSpeechInputModeButtonAriaLabel: '启用语音输入模式',
actionBarSubmitButtonAriaLabel: '提交',
actionBarCancelSpeechInputButtonAriaLabel: '取消语音输入/读出',
actionBarEditModeButtonAriaLabel: '编辑模式',
actionBarSpeechBtnStartListeningAriaLabel: '开始聆听',
actionBarSpeechBtnStopListeningAriaLabel: '停止侦听',
actionBarSpeechBtnStopReadoutAriaLabel: '停止读出',
feedbackLikeButtonAriaLabel: '点赞',
feedbackDislikeButtonAriaLabel: '取消点赞',
feedbackOffensiveButtonAriaLabel: '标记为冒犯性',
feedbackCopyButtonAriaLabel: '复制',
feedbackExportButtonAriaLabel: '导出',
feedbackExportPdfButtonAriaLabel: 'PDF',
feedbackExportTextButtonAriaLabel: 'Text',
feedbackExportWordButtonAriaLabel: 'Word',
feedbackShareButtonAriaLabel: '共享',
messageSentAriaLabelPrefix: '已发送电子邮件',
messageReceivedAriaLabelPrefix: '已收到消息',
messageAttributionsCollapseBtnAriaLabel: '折叠',
newTopicGreet1: '谢谢你帮我理清头绪! 我现在能帮你做什么?',
newTopicGreet2: '谢谢你! 知道你什么时候准备好继续前进总是很有帮助的。我现在能为你回答什么问题?',
newTopicGreet3: '重新开始总是很棒。问我任何问题!',
newTopicGreet4: '当然,我很乐意重新开始。我现在可以为你提供哪些帮助?',
newTopicGreet5: '好了,我已经为新的对话重置了我的大脑。你现在想聊些什么?',
newTopicGreet6: '没问题,很高兴你喜欢上一次对话。让我们转到一个新主题。你想要了解有关哪些内容的详细信息?',
newTopicGreet7: '当然,我已准备好进行新的挑战。我现在可以为你做什么?',
newTopicGreet8: '好的,我已清理好板子,可以重新开始了。我可以帮助你探索什么?',
newTopicGreet9: '明白了,我已经抹去了过去,专注于现在。我们现在应该探索什么?',
newTopicGreet10: '很好,让我们来更改主题。你在想什么?',
newTopicGreet11: '好了,我已经为新的对话擦拭干净板子了。现在我可以和你聊些什么呢?',
newTopicGreet12: '不用担心,我很高兴尝试一些新内容。我现在可以为你回答什么问题?',
newTopicSugg1: '教我一个新单词',
newTopicSugg2: '如何设定可实现的目标?',
newTopicSugg3: '教我有关登月的信息',
newTopicSugg4: '世界上最小的哺乳动物是什么?',
newTopicSugg5: '最深的海洋是哪个?',
newTopicSugg6: '一年有多少小时?',
newTopicSugg7: '我想学习一项新技能',
newTopicSugg8: '让我大笑',
newTopicSugg9: '有什么新闻?',
newTopicSugg10: '给我看鼓舞人心的名言',
newTopicSugg11: '给我说个笑话',
newTopicSugg12: '我需要有关家庭作业的帮助',
newTopicSugg13: '寻找非虚构作品',
newTopicSugg14: '激励我!',
newTopicSugg15: '向我显示食谱',
newTopicSugg16: '如何创建预算?',
newTopicSugg17: '教我一个新单词',
newTopicSugg18: '天气如何?',
newTopicSugg19: '我想学习一项新技能',
newTopicSugg20: '宇宙是如何开始的?',
newTopicSugg21: '为什么人类需要睡眠?',
newTopicSugg22: '如何制作蛋糕?',
newTopicSugg23: '火烈鸟为何为粉色?',
newTopicSugg24: '全息影像的工作原理是什么?',
newTopicSugg25: '金字塔是如何建成的?',
newUserGreet: '你好,我是必应。我使用 AI 为你的问题寻找答案,帮助你撰写内容,并以各种风格解释事情。今天我能如何帮助你呢?',
newUserSugg1: '写一首诗 ',
newUserSugg2: '搜索视频',
newUserSugg3: '创作歌曲',
repeatUserGreet: '欢迎回来。很高兴再次见到你。我今天能为你提供哪些帮助?',
repeatUserSugg1: '写一首诗',
repeatUserSugg2: '谁创建了你?',
repeatUserSugg3: '做个小测验',
creativeGreet: '好吧!这就是创造力。我能帮什么忙?',
balancedGreet: '听起来不错,我们可以在趣事和事实中寻找平衡。如何提供帮助?',
preciseGreet: '感谢聊天。今天我能帮你吗?',
creativeSugg1: '给雷雨写一封情书',
creativeSugg2: '我可以为好友做些什么?',
creativeSugg3: '告诉我的星座',
balancedSugg1: '蜜蜂如何酿蜜?',
balancedSugg2: '我需要帮助制定计划',
balancedSugg3: '为我提供有关新爱好的想法',
preciseSugg1: '谁发明语言?',
preciseSugg2: '谁第一个发现南极洲?',
preciseSugg3: '我需要帮助做研究',
close: '关闭',
newTopicPrompt: '通过新主题,可以开始与必应就任何主题进行全新对话',
typingIndicatorStopRespondingAriaLabel: '停止响应',
welcomeLearnSegment0: '必应由 AI 提供支持,因此可能出现意外和错误。请确保核对事实,并',
welcomeLearnSegment1: '让我们一起学习。必应由 AI 提供支持,因此可能出现意外和错误。请确保核对事实,并 ',
welcomeLearnSegment2: '共享反馈 ',
welcomeLearnSegment3: '以便我们可以学习和改进!',
actionBarSuspendConvPlaceHolder: '已为挂起的帐户禁用消息传递',
notiReConnect: '出错了。',
notiChatEnd: '聊天主题已结束。',
notiRestartChat: '在 {0} 小时内开始新主题',
notificationAttemptingToReconnect: 'Attempting to reconnect...',
notificationProcessing: 'One moment while we try to connect',
sydneySapphireCopyToClipboardText: '已复制到剪贴板。',
sydneySapphireUpsellContent: '现在就获取使用新 AI 驱动的必应应用程序吧!',
sydneySapphireWelcomeText: '欢迎回来! 下面是此页面的一些内容。',
sydneySapphireConsentTitleText: '使用新必应提升浏览',
sydneySapphireConsentMessageText: '允许 Microsoft 访问你的浏览器 Web 内容,以便使用 AI 生成的摘要和新必应的热点功能更好地个性化你的体验。了解更多信息',
sydneySapphireConsentConfirmText: '确认',
sydneySapphireConsentDenyText: '拒绝',
typingIndicatorStopStreamingAriaLabel: '停止流式传输',
sydneyCarouselCollapse: '折叠',
sydneyCarouselTitle: '最近的聊天主题',
messageActionsCopy: '复制',
messageActionsCopying: '正在复制',
messageActionsCopied: '已复制',
messageActionsCopyError: '错误',
messageActionsExportPdf: 'PDF',
messageActionsExportText: 'Text',
messageActionsExportWord: 'Word',
messageActionsReport: '报告',
tooltipPositive: '点赞',
tooltipNegative: '取消点赞',
tooltipShare: '共享',
tooltipExport: '导出',
tooltipMore: '更多',
tooltipSendToPhone: '在手机上继续',
mobileUpsellMessage1: '扫描此 QR 码以在移动必应应用上继续此对话',
mobileUpsellTitle1: '在手机上继续',
sydneySapphireUpsellConsentTitle: '是否继续从桌面聊天?',
sydneySapphireUpsellConsentMessage: '你在其他设备上有一个活动的必应聊天。是否要继续此对话?',
sydneySapphireUpsellConsentConfirm: '是',
sydneySapphireUpsellConsentDeny: '不,谢谢',
actionBarAutoSuggestTab: '选项卡',
actionBarAutoSuggestTap: '点击',
actionBarKeyboardHint: '输入',
feedbackShareAnswer: '查看此必应答案',
feedbackShareGenerated: '查看我使用必应生成的内容',
feedbackShareTitleFormat: '{0} | {1}',
serpfeedback: '反馈',
shareConversation: '共享整个对话',
speechAuthenticationError: '身份验证失败。请稍后重试。',
speechUnknownError: '出错了。',
refresh: '刷新',
feedbackShareContent: '下面是我使用新的必应(全球首个 AI支持的应答引擎生成的答案。单击可查看完整答案然后请你也来试一试。',
preview: '预览',
toneSelectorDescription: '选择对话样式',
toneSelectorCreative: '有创造力',
toneSelectorCreativeModifier: '更多',
toneSelectorBalanced: '平衡',
toneSelectorBalancedModifier: '更多',
toneSelectorPrecise: '精确',
toneSelectorPreciseModifier: '更多',
toneSelectorMoreCreative: 'More\\r\\nCreative',
toneSelectorMoreBalanced: 'More\\r\\nBalanced',
toneSelectorMorePrecise: 'More\\r\\nPrecise',
notificationMaxTurnsPerDay: '很抱歉,你已达到可在 24 小时内发送到必应的邮件限制。请稍后回来查看!',
notificationMaxTurnsPerConversation: '很抱歉,此对话已达到其限制。使用“扫除”按钮清除此内容并进行更多聊天。',
notificationMaxTurnsForMuidUsers: '你已达到今天的对话限制。',
notificationUnauthorizedMuidUsersCta: '登录以继续你的聊天。',
notificationChatEnterMuidUsers: '登录以提出更多问题并进行更长的对话。',
muidUsersTermsCond1: '通过单击“开始使用”,并继续与必应交互,即表示你接受',
muidUsersTermsCond2: '并确认你已查看',
muidUserGetStartedText: '开始使用',
welcomeMobSugg1: '必应如何使用 AI?',
welcomeMobSugg2: '必应还可以做什么?',
welcomeMobSugg3: '科技领域的最新消息是什么?',
of: '共',
notificationResetConversation: '很抱歉,似乎出现错误。',
notificationResetConversationCta: '让我们重新开始吧。',
toneSelectorCreativeTooltip: '清除对话并开始原创和富有想象力的聊天',
toneSelectorBalancedTooltip: '清除对话并开始一个信息丰富且友好的聊天',
toneSelectorPreciseTooltip: '清除对话并开始简洁直截了当的聊天',
toneSelectorSuppressedTooltip: '暂时不可用。请稍后再试!',
notificationDisengaged: '也许该换个新话题了。',
notificationDisengagedCta: '',
notificationForbidden: '很抱歉,你似乎不再有权访问此功能。请几天后再次查看。',
notificationTooManyRequests: '很抱歉,现在需求量非常大。请稍后重试。',
notificationUnauthorized: '很抱歉,你似乎已注销。',
notificationUnauthorizedCta: '请重新登录。',
notificationMessageError: '上一条消息似乎已中断。',
notificationSharedTip: '此对话\u003cstrong\u003e“{0}”\u003c/strong\u003e已于 {1} 与你共享',
mmAnswerPrompt1: '我总算给你找到了一些东西! 看一看。',
mmAnswerPrompt2: '我终于找到了一些东西! 这是你要找的吗?',
mmAnswerPrompt3: '抱歉搞混了,我确实给你找到了一些东西。给你!',
mmAnswerPrompt4: '嘿! 我确实找到了一些东西,这是你想要的吗?',
mmAnswerPrompt5: '看! 我找到了一些适合你的内容。',
mmAnswerPrompt6: '等等,在这里! 抱歉弄乱了,看一下吧。',
mmAnswerPrompt7: '我找到你要的媒体了! 抱歉耽搁了。',
signInCta: '登录 ',
signInDescription: ' 以提出更多问题并进行更长的对话',
exportSuccessToastTitle: '已导出文件。某些格式和图像可能无法导出。',
exportedFileUserTitle: '用户',
exportedFileBotTitle: '必应',
copyCodeSuccessToastTitle: '已复制到剪贴板',
copyCodeButtonTooltip: '复制',
threadsSharedOnDate: '于 {0} 共享',
threadsMore: '更多',
threadsExportPanelTitle: '选择格式',
threadsExportPanelAriaLabel: '选择',
threadsCancel: '取消',
threadsChatHistory: '聊天记录',
threadsConfirm: '确认',
threadsDaysAgo: '{0} 天前',
threadsDefaultChatName: '无标题的聊天',
threadsDelete: '删除',
threadsDescription: '我们最近添加了自动保存聊天到由必应 AI 支持的 copilot。你的所有聊天都在桌面和移动设备上漫游以便你可以轻松地从你离开的位置继续。',
threadsDescriptionNote: '请注意,除非专门保存,否则所有聊天将在 90 天内自动删除。',
threadsEdit: '重命名',
threadsLoad: '加载聊天',
threadsMinimizeRecent: '最小化最近的聊天',
threadsMinimizeSaved: '最小化保存的聊天',
threadsPreview: '预览',
threadsPreviewText: '跳回最近聊天',
threadsRecentTitle: '最近的活动',
threadsSavedTitle: '已保存',
threadsSeeAllRecent: '查看所有最近的聊天',
threadsSeeAllSaved: '查看所有保存的聊天',
threadsTitle: '聊天',
threadsYesterday: '昨天',
webPageContextPrefix: 'Site visited',
zeroInputSuggestionFallback1: '哪款咖啡研磨机评价最好?',
zeroInputSuggestionFallback2: '对于一个预算有限的六口之家来说,会首选哪三款车型?',
zeroInputSuggestionFallback3: '写一个我的同事会觉得有趣的笑话',
zeroInputSuggestionFallback4: '下一流行趋势是什么?我应该在哪里购物可以找到它?',
zeroInputSuggestionFallback5: '撰写关于鱼和青蛙寻找爱的原创寓言故事',
zeroInputSuggestionFallback6: '创建一个表,帮助我计划接下来两周的就餐',
zeroInputSuggestionFallback7: '为具有讽刺风格的新社交媒体平台创建一个口号',
zeroInputSuggestionCategory1: '商店',
zeroInputSuggestionCategory2: '比较',
zeroInputSuggestionCategory3: '大笑',
zeroInputSuggestionCategory4: '聊天',
zeroInputSuggestionCategory5: '写入',
zeroInputSuggestionCategory6: '组织',
zeroInputSuggestionCategory7: '创建',
};
const toneSelectorTranslation = {
description: '选择对话样式',
notificationResetConversationCta: '让我们重新开始吧。',
preview: '预览',
};
let _cib;
Object.defineProperty(window, 'CIB', {
get() {
return _cib;
},
set(newValue) {
Object.assign(newValue.config.features, {
enableResponseToneSelector: true,
enableResponseToneColorThemes: true,
});
Object.assign(newValue.config.sydney, {
responseToneOptions: ['Creative', 'Balanced', 'Precise'],
});
newValue.vm.toneSelector.tone = 'Balanced';
Object.assign(newValue.config.strings, sydConvTranslation);
Object.assign(newValue.vm.toneSelector.strings, toneSelectorTranslation);
_cib = newValue;
},
});
function getCookie(name) {
const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return v ? v[2] : null;
}
function setCookie(name, value, minutes = 0, path = '/', domain = '') {
let cookie = name + '=' + value + ';path=' + path;
if (domain) {
cookie += ';domain=' + domain;
}
if (minutes > 0) {
const d = new Date();
d.setTime(d.getTime() + minutes * 60 * 1000);
cookie += ';expires=' + d.toUTCString();
}
document.cookie = cookie;
}
async function registerSW() {
if ('serviceWorker' in navigator && workbox) {
const wb = new workbox.Workbox('sw.js');
wb.addEventListener('activated', (event) => {
// console.log(`离线就绪 : `);
// console.log(`activated : `, event);
// console.log(`activated isUpdate : `, event.isUpdate);
if (event.isUpdate) {
// 更新
console.log(`sw 有更新reload() `);
wb.messageSkipWaiting();
window.location.reload(true);
}
});
wb.addEventListener('waiting', (event) => {
console.log(`waiting : `, event);
});
wb.addEventListener('externalwaiting', (event) => {
console.log(`externalwaiting : `, event);
});
const swRegistration = await wb.register({ immediate: false });
const swVersion = await wb.messageSW({ type: 'GET_VERSION' });
console.log('Service Worker Version:', swVersion);
}
}
document.addEventListener('DOMContentLoaded', function () {
registerSW();
// todo 反馈暂时无法使用,先移除
document
.querySelector('cib-serp')
.shadowRoot.querySelector('cib-conversation')
.shadowRoot.querySelector('cib-welcome-container')
.shadowRoot.querySelector('.learn-tog-item')
.remove();
document.querySelector('cib-serp').shadowRoot.querySelector('cib-serp-feedback').remove();
// 移除顶部背景遮挡
document.querySelector('cib-serp').shadowRoot.querySelector('cib-conversation').shadowRoot.querySelector('.scroller > .top').style.display = 'none';
// 移除顶部边距
document.querySelector('cib-serp').shadowRoot.querySelector('cib-conversation').shadowRoot.querySelector('.scroller > .scroller-positioner > .content').style.paddingTop = 0;
// 用户 cookie
const userCookieName = '_U';
const userCookieVal = getCookie(userCookieName);
const chatLoginBgEle = document.querySelector('.chat-login-bg');
if (!userCookieVal) {
chatLoginBgEle.style.display = 'flex';
} else {
document.querySelector('.chat-login-inp-cookie').value = userCookieVal;
}
document.querySelector('.chat-login-btn-save').onclick = function () {
const cookie = document.querySelector('.chat-login-inp-cookie').value;
if (cookie) {
setCookie(userCookieName, cookie, 7 * 24 * 60);
chatLoginBgEle.style.display = 'none';
}
};
document.querySelector('.nav__title-setting').onclick = function () {
chatLoginBgEle.style.display = 'flex';
};
});