@@ -180,8 +180,11 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
180180 // (it could be a say that followed).
181181 const [ clineAsk , setClineAsk ] = useState < ClineAsk | undefined > ( undefined )
182182 const [ enableButtons , setEnableButtons ] = useState < boolean > ( false )
183- const [ primaryButtonText , setPrimaryButtonText ] = useState < string | undefined > ( undefined )
184- const [ secondaryButtonText , setSecondaryButtonText ] = useState < string | undefined > ( undefined )
183+ // Translation keys rather than labels, so an open prompt follows a UI language change.
184+ const [ primaryButtonKey , setPrimaryButtonKey ] = useState < string | undefined > ( undefined )
185+ const [ secondaryButtonKey , setSecondaryButtonKey ] = useState < string | undefined > ( undefined )
186+ const primaryButtonText = primaryButtonKey ? t ( primaryButtonKey ) : undefined
187+ const secondaryButtonText = secondaryButtonKey ? t ( secondaryButtonKey ) : undefined
185188 const [ _didClickCancel , setDidClickCancel ] = useState ( false )
186189 const virtuosoRef = useRef < VirtuosoHandle > ( null )
187190 const [ expandedRows , setExpandedRows ] = useState < Record < number , boolean > > ( { } )
@@ -314,16 +317,16 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
314317 setSendingDisabled ( true )
315318 setClineAsk ( "api_req_failed" )
316319 setEnableButtons ( true )
317- setPrimaryButtonText ( t ( "chat:retry.title" ) )
318- setSecondaryButtonText ( t ( "chat:startNewTask.title" ) )
320+ setPrimaryButtonKey ( "chat:retry.title" )
321+ setSecondaryButtonKey ( "chat:startNewTask.title" )
319322 break
320323 case "mistake_limit_reached" :
321324 playSound ( "progress_loop" )
322325 setSendingDisabled ( false )
323326 setClineAsk ( "mistake_limit_reached" )
324327 setEnableButtons ( true )
325- setPrimaryButtonText ( t ( "chat:proceedAnyways.title" ) )
326- setSecondaryButtonText ( t ( "chat:startNewTask.title" ) )
328+ setPrimaryButtonKey ( "chat:proceedAnyways.title" )
329+ setSecondaryButtonKey ( "chat:startNewTask.title" )
327330 break
328331 case "followup" :
329332 setSendingDisabled ( isPartial )
@@ -333,8 +336,8 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
333336 // We have no buttons for this tool, so no problem having them "enabled"
334337 // to workaround this issue. See #1358.
335338 setEnableButtons ( true )
336- setPrimaryButtonText ( undefined )
337- setSecondaryButtonText ( undefined )
339+ setPrimaryButtonKey ( undefined )
340+ setSecondaryButtonKey ( undefined )
338341 break
339342 case "tool" :
340343 setSendingDisabled ( isPartial )
@@ -346,66 +349,66 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
346349 case "appliedDiff" :
347350 case "newFileCreated" :
348351 if ( tool . batchDiffs && Array . isArray ( tool . batchDiffs ) ) {
349- setPrimaryButtonText ( t ( "chat:edit-batch.approve.title" ) )
350- setSecondaryButtonText ( t ( "chat:edit-batch.deny.title" ) )
352+ setPrimaryButtonKey ( "chat:edit-batch.approve.title" )
353+ setSecondaryButtonKey ( "chat:edit-batch.deny.title" )
351354 } else {
352- setPrimaryButtonText ( t ( "chat:save.title" ) )
353- setSecondaryButtonText ( t ( "chat:reject.title" ) )
355+ setPrimaryButtonKey ( "chat:save.title" )
356+ setSecondaryButtonKey ( "chat:reject.title" )
354357 }
355358 break
356359 case "generateImage" :
357- setPrimaryButtonText ( t ( "chat:save.title" ) )
358- setSecondaryButtonText ( t ( "chat:reject.title" ) )
360+ setPrimaryButtonKey ( "chat:save.title" )
361+ setSecondaryButtonKey ( "chat:reject.title" )
359362 break
360363 case "finishTask" :
361- setPrimaryButtonText ( t ( "chat:completeSubtaskAndReturn" ) )
362- setSecondaryButtonText ( undefined )
364+ setPrimaryButtonKey ( "chat:completeSubtaskAndReturn" )
365+ setSecondaryButtonKey ( undefined )
363366 break
364367 case "readFile" :
365368 if ( tool . batchFiles && Array . isArray ( tool . batchFiles ) ) {
366- setPrimaryButtonText ( t ( "chat:read-batch.approve.title" ) )
367- setSecondaryButtonText ( t ( "chat:read-batch.deny.title" ) )
369+ setPrimaryButtonKey ( "chat:read-batch.approve.title" )
370+ setSecondaryButtonKey ( "chat:read-batch.deny.title" )
368371 } else {
369- setPrimaryButtonText ( t ( "chat:approve.title" ) )
370- setSecondaryButtonText ( t ( "chat:reject.title" ) )
372+ setPrimaryButtonKey ( "chat:approve.title" )
373+ setSecondaryButtonKey ( "chat:reject.title" )
371374 }
372375 break
373376 case "listFilesTopLevel" :
374377 case "listFilesRecursive" :
375378 if ( tool . batchDirs && Array . isArray ( tool . batchDirs ) ) {
376- setPrimaryButtonText ( t ( "chat:list-batch.approve.title" ) )
377- setSecondaryButtonText ( t ( "chat:list-batch.deny.title" ) )
379+ setPrimaryButtonKey ( "chat:list-batch.approve.title" )
380+ setSecondaryButtonKey ( "chat:list-batch.deny.title" )
378381 } else {
379- setPrimaryButtonText ( t ( "chat:approve.title" ) )
380- setSecondaryButtonText ( t ( "chat:reject.title" ) )
382+ setPrimaryButtonKey ( "chat:approve.title" )
383+ setSecondaryButtonKey ( "chat:reject.title" )
381384 }
382385 break
383386 default :
384- setPrimaryButtonText ( t ( "chat:approve.title" ) )
385- setSecondaryButtonText ( t ( "chat:reject.title" ) )
387+ setPrimaryButtonKey ( "chat:approve.title" )
388+ setSecondaryButtonKey ( "chat:reject.title" )
386389 break
387390 }
388391 break
389392 case "command" :
390393 setSendingDisabled ( isPartial )
391394 setClineAsk ( "command" )
392395 setEnableButtons ( ! isPartial )
393- setPrimaryButtonText ( t ( "chat:runCommand.title" ) )
394- setSecondaryButtonText ( t ( "chat:reject.title" ) )
396+ setPrimaryButtonKey ( "chat:runCommand.title" )
397+ setSecondaryButtonKey ( "chat:reject.title" )
395398 break
396399 case "command_output" :
397400 setSendingDisabled ( false )
398401 setClineAsk ( "command_output" )
399402 setEnableButtons ( true )
400- setPrimaryButtonText ( t ( "chat:proceedWhileRunning.title" ) )
401- setSecondaryButtonText ( t ( "chat:killCommand.title" ) )
403+ setPrimaryButtonKey ( "chat:proceedWhileRunning.title" )
404+ setSecondaryButtonKey ( "chat:killCommand.title" )
402405 break
403406 case "use_mcp_server" :
404407 setSendingDisabled ( isPartial )
405408 setClineAsk ( "use_mcp_server" )
406409 setEnableButtons ( ! isPartial )
407- setPrimaryButtonText ( t ( "chat:approve.title" ) )
408- setSecondaryButtonText ( t ( "chat:reject.title" ) )
410+ setPrimaryButtonKey ( "chat:approve.title" )
411+ setSecondaryButtonKey ( "chat:reject.title" )
409412 break
410413 case "completion_result" :
411414 // Extension waiting for feedback, but we can just present a new task button.
@@ -417,8 +420,8 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
417420 setSendingDisabled ( isPartial )
418421 setClineAsk ( "completion_result" )
419422 setEnableButtons ( ! isPartial )
420- setPrimaryButtonText ( t ( "chat:startNewTask.title" ) )
421- setSecondaryButtonText ( undefined )
423+ setPrimaryButtonKey ( "chat:startNewTask.title" )
424+ setSecondaryButtonKey ( undefined )
422425 break
423426 case "resume_task" :
424427 setSendingDisabled ( false )
@@ -434,20 +437,20 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
434437 ( msg ) => msg . ask === "completion_result" || msg . say === "completion_result" ,
435438 )
436439 if ( isCompletedSubtask ) {
437- setPrimaryButtonText ( t ( "chat:startNewTask.title" ) )
438- setSecondaryButtonText ( undefined )
440+ setPrimaryButtonKey ( "chat:startNewTask.title" )
441+ setSecondaryButtonKey ( undefined )
439442 } else {
440- setPrimaryButtonText ( t ( "chat:resumeTask.title" ) )
441- setSecondaryButtonText ( t ( "chat:terminate.title" ) )
443+ setPrimaryButtonKey ( "chat:resumeTask.title" )
444+ setSecondaryButtonKey ( "chat:terminate.title" )
442445 }
443446 setDidClickCancel ( false ) // special case where we reset the cancel button state
444447 break
445448 case "resume_completed_task" :
446449 setSendingDisabled ( false )
447450 setClineAsk ( "resume_completed_task" )
448451 setEnableButtons ( true )
449- setPrimaryButtonText ( t ( "chat:startNewTask.title" ) )
450- setSecondaryButtonText ( undefined )
452+ setPrimaryButtonKey ( "chat:startNewTask.title" )
453+ setSecondaryButtonKey ( undefined )
451454 setDidClickCancel ( false )
452455 break
453456 }
@@ -471,8 +474,8 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
471474 // handlers (handleSendMessage, handlePrimaryButtonClick, etc.).
472475 setClineAsk ( undefined )
473476 setEnableButtons ( false )
474- setPrimaryButtonText ( undefined )
475- setSecondaryButtonText ( undefined )
477+ setPrimaryButtonKey ( undefined )
478+ setSecondaryButtonKey ( undefined )
476479 break
477480 case "api_req_finished" :
478481 case "error" :
@@ -485,8 +488,8 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
485488 if ( lastMessage . partial !== true && clineAskRef . current === "command_output" ) {
486489 setClineAsk ( undefined )
487490 setEnableButtons ( false )
488- setPrimaryButtonText ( undefined )
489- setSecondaryButtonText ( undefined )
491+ setPrimaryButtonKey ( undefined )
492+ setSecondaryButtonKey ( undefined )
490493 }
491494 break
492495 case "mcp_server_request_started" :
@@ -506,19 +509,19 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
506509 ( msg ) => msg . ask === "completion_result" || msg . say === "completion_result" ,
507510 )
508511 if ( hasCompletionResult ) {
509- setPrimaryButtonText ( t ( "chat:startNewTask.title" ) )
510- setSecondaryButtonText ( undefined )
512+ setPrimaryButtonKey ( "chat:startNewTask.title" )
513+ setSecondaryButtonKey ( undefined )
511514 }
512515 }
513- } , [ clineAsk , currentTaskItem ?. parentTaskId , messages , t ] )
516+ } , [ clineAsk , currentTaskItem ?. parentTaskId , messages ] )
514517
515518 useEffect ( ( ) => {
516519 if ( messages . length === 0 ) {
517520 setSendingDisabled ( false )
518521 setClineAsk ( undefined )
519522 setEnableButtons ( false )
520- setPrimaryButtonText ( undefined )
521- setSecondaryButtonText ( undefined )
523+ setPrimaryButtonKey ( undefined )
524+ setSecondaryButtonKey ( undefined )
522525 }
523526 } , [ messages . length ] )
524527
@@ -630,8 +633,8 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
630633 setClineAsk ( undefined )
631634 setEnableButtons ( false )
632635 // Do not reset mode here as it should persist.
633- // setPrimaryButtonText (undefined)
634- // setSecondaryButtonText (undefined)
636+ // setPrimaryButtonKey (undefined)
637+ // setSecondaryButtonKey (undefined)
635638 } , [ ] )
636639
637640 /**
@@ -773,8 +776,8 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
773776 setSendingDisabled ( true )
774777 setClineAsk ( undefined )
775778 setEnableButtons ( false )
776- setPrimaryButtonText ( undefined )
777- setSecondaryButtonText ( undefined )
779+ setPrimaryButtonKey ( undefined )
780+ setSecondaryButtonKey ( undefined )
778781 } , [ ] )
779782
780783 // This logic depends on the useEffect[messages] above to set clineAsk,
@@ -1781,23 +1784,23 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
17811784 { primaryButtonText && (
17821785 < StandardTooltip
17831786 content = {
1784- primaryButtonText === t ( "chat:retry.title" )
1787+ primaryButtonKey === "chat:retry.title"
17851788 ? t ( "chat:retry.tooltip" )
1786- : primaryButtonText === t ( "chat:save.title" )
1789+ : primaryButtonKey === "chat:save.title"
17871790 ? t ( "chat:save.tooltip" )
1788- : primaryButtonText === t ( "chat:approve.title" )
1791+ : primaryButtonKey === "chat:approve.title"
17891792 ? t ( "chat:approve.tooltip" )
1790- : primaryButtonText === t ( "chat:runCommand.title" )
1793+ : primaryButtonKey === "chat:runCommand.title"
17911794 ? t ( "chat:runCommand.tooltip" )
1792- : primaryButtonText === t ( "chat:startNewTask.title" )
1795+ : primaryButtonKey === "chat:startNewTask.title"
17931796 ? t ( "chat:startNewTask.tooltip" )
1794- : primaryButtonText === t ( "chat:resumeTask.title" )
1797+ : primaryButtonKey === "chat:resumeTask.title"
17951798 ? t ( "chat:resumeTask.tooltip" )
1796- : primaryButtonText ===
1797- t ( "chat:proceedAnyways.title" )
1799+ : primaryButtonKey ===
1800+ "chat:proceedAnyways.title"
17981801 ? t ( "chat:proceedAnyways.tooltip" )
1799- : primaryButtonText ===
1800- t ( "chat:proceedWhileRunning.title" )
1802+ : primaryButtonKey ===
1803+ "chat:proceedWhileRunning.title"
18011804 ? t ( "chat:proceedWhileRunning.tooltip" )
18021805 : primaryButtonText
18031806 } >
@@ -1817,13 +1820,13 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
18171820 { secondaryButtonText && (
18181821 < StandardTooltip
18191822 content = {
1820- secondaryButtonText === t ( "chat:startNewTask.title" )
1823+ secondaryButtonKey === "chat:startNewTask.title"
18211824 ? t ( "chat:startNewTask.tooltip" )
1822- : secondaryButtonText === t ( "chat:reject.title" )
1825+ : secondaryButtonKey === "chat:reject.title"
18231826 ? t ( "chat:reject.tooltip" )
1824- : secondaryButtonText === t ( "chat:terminate.title" )
1827+ : secondaryButtonKey === "chat:terminate.title"
18251828 ? t ( "chat:terminate.tooltip" )
1826- : secondaryButtonText === t ( "chat:killCommand.title" )
1829+ : secondaryButtonKey === "chat:killCommand.title"
18271830 ? t ( "chat:killCommand.tooltip" )
18281831 : secondaryButtonText
18291832 } >
0 commit comments