You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(google-meet): force English Meet UI via hl=en so browser automation works on any locale
Replace the per-locale label regex approach with one seam: append hl=en to
every Meet URL the plugin opens (join + create), so the existing English DOM
matchers work regardless of the account/browser language. Live-verified on a
signed-in zh-TW profile: meeting pre-join and the /new redirect both honor
hl=en and keep it through navigation. Also match the 'Join here too'
switch-here dialog button and keep the created meeting link canonical by
stripping query/hash from meetingUri.
let mic = findCallControlButton(/^\\s*(?:(?:turn (?:off|on) microphone|(?:activar|desactivar) micrófono|(?:activer|désactiver) le micro|mikrofon (?:einschalten|ausschalten))\\b|關閉麥克風|開啟麥克風|关闭麦克风|开启麦克风|マイクを(?:オン|オフ))/i);
421
+
let mic = findCallControlButton(/^\\s*turn (?:off|on) microphone\\b/i);
if (!readOnly && allowMicrophone && mic && /(?:turn on microphone|開啟麥克風|开启麦克风|マイクをオン|activar micrófono|activer le micro|mikrofon einschalten)/i.test(buttonLabel(mic))) {
428
+
if (!readOnly && allowMicrophone && mic && /turn on microphone/i.test(buttonLabel(mic))) {
427
429
mic.click();
428
430
notes.push("Attempted to turn on the Meet microphone for talk-back mode.");
429
431
}
430
-
if (!readOnly && !allowMicrophone && mic && /(?:turn off microphone|關閉麥克風|关闭麦克风|マイクをオフ|desactivar micrófono|désactiver le micro|mikrofon ausschalten)/i.test(mic.getAttribute('aria-label') || text(mic))) {
432
+
if (!readOnly && !allowMicrophone && mic && /turn off microphone/i.test(mic.getAttribute('aria-label') || text(mic))) {
431
433
mic.click();
432
434
notes.push("Muted Meet microphone for observe-only mode.");
? findButton(/join now|ask to join|立即加入|要求加入|申請加入|申请加入|同时在?此处加入|同時在?這裡加入|Join here too|今すぐ参加|参加をリクエスト|こちらからも参加|unirse|solicitar unirse|rejoindre|participer|demander à participer|jetzt teilnehmen|teilnahme erbitten/i) || buttons.find(b => b.getAttribute('jsname') === 'Qx7uuf')
437
+
? findButton(/join now|ask to join|join here too/i)
436
438
: null;
437
439
if (join) join.click();
438
-
const microphoneChoice = findButton(/\\buse microphone\\b|使用麥克風|使用麦克风|マイクを使用|usar micrófono|utiliser le micro|mikrofon verwenden/i);
439
-
const noMicrophoneChoice = findButton(/\\b(continue|join|use) without (microphone|mic)\\b|\\bnot now\\b|不使用麥克風直接加入|不開啟麥克風直接加入|不使用麦克风直接加入|不开启麦克风直接加入|マイクなしで参加|unirse sin micrófono|continuer sans micro|ohne mikrofon teilnehmen/i);
if (/^(turn on captions|turn off captions|captions|開啟字幕|开启字幕|字幕をオン|字幕をオフ|關閉字幕|关闭字幕|activar subtítulos|desactivar subtítulos|activer les sous-titres|désactiver les sous-titres|untertitel einschalten|untertitel ausschalten)$/i.test(clean)) return;
526
+
if (/^(turn on captions|turn off captions|captions)$/i.test(clean)) return;
if (!/turn off captions|hide captions|關閉字幕|关闭字幕|字幕をオフ|desactivar subtítulos|désactiver les sous-titres|untertitel ausschalten/i.test(captionLabel)) {
555
+
if (!/turn off captions|hide captions/i.test(captionLabel)) {
554
556
captionButton.click();
555
557
notes.push("Attempted to enable Meet captions for observe-only transcript health.");
556
558
}
@@ -579,24 +581,24 @@ function meetStatusScript(params: {
579
581
lastCaptionText = last?.text;
580
582
recentTranscript = lines.slice(-5);
581
583
}
582
-
const lobbyWaiting = !inCall && /asking to be let in|you.?ll join when someone lets you in|waiting to be let in|ask to join|等待對方同意|等待主辦人同意|要求加入|等待批准|等待接纳|参加のリクエスト中|esperando|en attente|teilnahme angefragt/i.test(pageText);
583
-
const leaveReason = /you left the meeting|you.?ve left the meeting|removed from the meeting|you were removed|call ended|meeting ended|你已離開這場會議|通話已結束|會議已結束|你已离开这场会议|会議から退出しました|has salido|vous avez quitté|sie haben die besprechung verlassen/i.test(pageText)
584
-
? pageText.match(/you left the meeting|you.?ve left the meeting|removed from the meeting|you were removed|call ended|meeting ended|你已離開這場會議|通話已結束|會議已結束|你已离开这场会议|会議から退出しました|has salido|vous avez quitté|sie haben die besprechung verlassen/i)?.[0]
584
+
const lobbyWaiting = !inCall && /asking to be let in|you.?ll join when someone lets you in|waiting to be let in|ask to join/i.test(pageText);
585
+
const leaveReason = /you left the meeting|you.?ve left the meeting|removed from the meeting|you were removed|call ended|meeting ended/i.test(pageText)
586
+
? pageText.match(/you left the meeting|you.?ve left the meeting|removed from the meeting|you were removed|call ended|meeting ended/i)?.[0]
585
587
: undefined;
586
588
let manualActionReason;
587
589
let manualActionMessage;
588
-
if (!inCall && (host === "accounts.google.com" || /use your google account|to continue to google meet|choose an account|sign in to (join|continue)|使用您的 Google 帳戶|選擇帳戶|登入|使用您的 Google 帐户|选择帐户|登录|ログイン|iniciar sesión|se connecter|anmelden/i.test(pageText))) {
590
+
if (!inCall && (host === "accounts.google.com" || /use your google account|to continue to google meet|choose an account|sign in to (join|continue)/i.test(pageText))) {
589
591
manualActionReason = "google-login-required";
590
592
manualActionMessage = "Sign in to Google in the OpenClaw browser profile, then retry the Meet join.";
591
-
} else if (!inCall && /asking to be let in|you.?ll join when someone lets you in|waiting to be let in|ask to join|等待對方同意|等待主辦人同意|要求加入|等待批准|等待接纳|参加のリクエスト中|esperando|en attente|teilnahme angefragt/i.test(pageText)) {
593
+
} else if (!inCall && /asking to be let in|you.?ll join when someone lets you in|waiting to be let in|ask to join/i.test(pageText)) {
592
594
manualActionReason = "meet-admission-required";
593
595
manualActionMessage = "Admit the OpenClaw browser participant in Google Meet, then retry speech.";
594
596
} else if (permissionNeeded) {
595
597
manualActionReason = "meet-permission-required";
596
598
manualActionMessage = allowMicrophone
597
599
? "Allow microphone/camera/speaker permissions for Meet in the OpenClaw browser profile, then retry."
598
600
: "Join without microphone/camera permissions in the OpenClaw browser profile, then retry.";
599
-
} else if (!inCall && (allowMicrophone ? !microphoneChoice : !noMicrophoneChoice) && /do you want people to hear you in the meeting|你希望大家在會議中聽到你的聲音嗎|在会议中听到你的声音吗/i.test(pageText)) {
601
+
} else if (!inCall && (allowMicrophone ? !microphoneChoice : !noMicrophoneChoice) && /do you want people to hear you in the meeting/i.test(pageText)) {
micMuted: mic ? /(?:turn on microphone|開啟麥克風|开启麦克风|マイクをオン|activar micrófono|activer le micro|mikrofon einschalten)/i.test(buttonLabel(mic)) : undefined,
611
+
micMuted: mic ? /turn on microphone/i.test(buttonLabel(mic)) : undefined,
610
612
lobbyWaiting,
611
613
leaveReason,
612
614
captioning,
@@ -689,7 +691,7 @@ async function openMeetWithBrowserRequest(params: {
0 commit comments