Skip to content

Commit f710ce0

Browse files
committed
Support entering custom languages in the preferred language chooser
1 parent ebfe57b commit f710ce0

File tree

2 files changed

+136
-31
lines changed

2 files changed

+136
-31
lines changed

.changeset/healthy-rabbits-poke.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"roo-cline": patch
3+
---
4+
5+
Allow users to choose a custom preferred language

webview-ui/src/components/prompts/PromptsView.tsx

Lines changed: 131 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,19 @@ import {
99
VSCodeRadioGroup,
1010
VSCodeRadio,
1111
} from "@vscode/webview-ui-toolkit/react"
12+
import { CaretSortIcon, CheckIcon } from "@radix-ui/react-icons"
13+
import {
14+
Button,
15+
Command,
16+
CommandGroup,
17+
CommandInput,
18+
CommandItem,
19+
CommandList,
20+
Popover,
21+
PopoverContent,
22+
PopoverTrigger,
23+
} from "@/components/ui"
24+
import { cn } from "@/lib/utils"
1225
import { useExtensionState } from "../../context/ExtensionStateContext"
1326
import {
1427
Mode,
@@ -66,6 +79,9 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
6679
const [testPrompt, setTestPrompt] = useState("")
6780
const [isEnhancing, setIsEnhancing] = useState(false)
6881
const [isDialogOpen, setIsDialogOpen] = useState(false)
82+
const [open, setOpen] = useState(false)
83+
const [isCustomLanguage, setIsCustomLanguage] = useState(false)
84+
const [customLanguage, setCustomLanguage] = useState("")
6985
const [selectedPromptContent, setSelectedPromptContent] = useState("")
7086
const [selectedPromptTitle, setSelectedPromptTitle] = useState("")
7187
const [isToolsEditMode, setIsToolsEditMode] = useState(false)
@@ -399,38 +415,88 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
399415
<div className="pb-5 border-b border-vscode-input-border">
400416
<div className="mb-5">
401417
<div className="font-bold mb-1">Preferred Language</div>
402-
<select
403-
value={preferredLanguage}
404-
onChange={(e) => {
405-
setPreferredLanguage(e.target.value)
406-
vscode.postMessage({
407-
type: "preferredLanguage",
408-
text: e.target.value,
409-
})
410-
}}
411-
className="w-full px-2 py-1 h-7 bg-vscode-input-background text-vscode-input-foreground border border-vscode-input-border rounded">
412-
<option value="English">English</option>
413-
<option value="Arabic">Arabic - العربية</option>
414-
<option value="Brazilian Portuguese">Portuguese - Português (Brasil)</option>
415-
<option value="Catalan">Catalan - Català</option>
416-
<option value="Czech">Czech - Čeština</option>
417-
<option value="French">French - Français</option>
418-
<option value="German">German - Deutsch</option>
419-
<option value="Hindi">Hindi - हिन्दी</option>
420-
<option value="Hungarian">Hungarian - Magyar</option>
421-
<option value="Italian">Italian - Italiano</option>
422-
<option value="Japanese">Japanese - 日本語</option>
423-
<option value="Korean">Korean - 한국어</option>
424-
<option value="Polish">Polish - Polski</option>
425-
<option value="Portuguese">Portuguese - Português (Portugal)</option>
426-
<option value="Russian">Russian - Русский</option>
427-
<option value="Simplified Chinese">Simplified Chinese - 简体中文</option>
428-
<option value="Spanish">Spanish - Español</option>
429-
<option value="Traditional Chinese">Traditional Chinese - 繁體中文</option>
430-
<option value="Turkish">Turkish - Türkçe</option>
431-
</select>
418+
<Popover open={open} onOpenChange={setOpen}>
419+
<PopoverTrigger asChild>
420+
<Button
421+
variant="combobox"
422+
role="combobox"
423+
aria-expanded={open}
424+
className="w-full justify-between">
425+
{preferredLanguage ?? "Select language..."}
426+
<CaretSortIcon className="opacity-50" />
427+
</Button>
428+
</PopoverTrigger>
429+
<PopoverContent align="start" className="p-0">
430+
<Command>
431+
<CommandInput placeholder="Search language..." className="h-9" />
432+
<CommandList>
433+
<CommandGroup>
434+
{[
435+
{ value: "English", label: "English" },
436+
{ value: "Arabic", label: "Arabic - العربية" },
437+
{
438+
value: "Brazilian Portuguese",
439+
label: "Portuguese - Português (Brasil)",
440+
},
441+
{ value: "Catalan", label: "Catalan - Català" },
442+
{ value: "Czech", label: "Czech - Čeština" },
443+
{ value: "French", label: "French - Français" },
444+
{ value: "German", label: "German - Deutsch" },
445+
{ value: "Hindi", label: "Hindi - हिन्दी" },
446+
{ value: "Hungarian", label: "Hungarian - Magyar" },
447+
{ value: "Italian", label: "Italian - Italiano" },
448+
{ value: "Japanese", label: "Japanese - 日本語" },
449+
{ value: "Korean", label: "Korean - 한국어" },
450+
{ value: "Polish", label: "Polish - Polski" },
451+
{ value: "Portuguese", label: "Portuguese - Português (Portugal)" },
452+
{ value: "Russian", label: "Russian - Русский" },
453+
{ value: "Simplified Chinese", label: "Simplified Chinese - 简体中文" },
454+
{ value: "Spanish", label: "Spanish - Español" },
455+
{
456+
value: "Traditional Chinese",
457+
label: "Traditional Chinese - 繁體中文",
458+
},
459+
{ value: "Turkish", label: "Turkish - Türkçe" },
460+
].map((language) => (
461+
<CommandItem
462+
key={language.value}
463+
value={language.value}
464+
onSelect={(value) => {
465+
setPreferredLanguage(value)
466+
vscode.postMessage({
467+
type: "preferredLanguage",
468+
text: value,
469+
})
470+
setOpen(false)
471+
}}>
472+
{language.label}
473+
<CheckIcon
474+
className={cn(
475+
"ml-auto",
476+
preferredLanguage === language.value
477+
? "opacity-100"
478+
: "opacity-0",
479+
)}
480+
/>
481+
</CommandItem>
482+
))}
483+
</CommandGroup>
484+
</CommandList>
485+
</Command>
486+
<div className="border-t border-[var(--vscode-input-border)]">
487+
<button
488+
className="w-full px-2 py-1.5 text-sm text-left hover:bg-[var(--vscode-list-hoverBackground)]"
489+
onClick={() => {
490+
setIsCustomLanguage(true)
491+
setOpen(false)
492+
}}>
493+
+ Choose another language
494+
</button>
495+
</div>
496+
</PopoverContent>
497+
</Popover>
432498
<p className="text-xs mt-1.5 text-vscode-descriptionForeground">
433-
Select the language that Cline should use for communication.
499+
Select the language that Roo should use for communication.
434500
</p>
435501
</div>
436502

@@ -1359,6 +1425,40 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
13591425
</div>
13601426
</div>
13611427
)}
1428+
{isCustomLanguage && (
1429+
<div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
1430+
<div className="bg-[var(--vscode-editor-background)] p-6 rounded-lg w-96">
1431+
<h3 className="text-lg font-semibold mb-4">Add Custom Language</h3>
1432+
<input
1433+
type="text"
1434+
className="w-full p-2 mb-4 bg-[var(--vscode-input-background)] text-[var(--vscode-input-foreground)] border border-[var(--vscode-input-border)] rounded"
1435+
placeholder="Enter language name"
1436+
value={customLanguage}
1437+
onChange={(e) => setCustomLanguage(e.target.value)}
1438+
/>
1439+
<div className="flex justify-end gap-2">
1440+
<Button variant="secondary" onClick={() => setIsCustomLanguage(false)}>
1441+
Cancel
1442+
</Button>
1443+
<Button
1444+
onClick={() => {
1445+
if (customLanguage.trim()) {
1446+
setPreferredLanguage(customLanguage.trim())
1447+
vscode.postMessage({
1448+
type: "preferredLanguage",
1449+
text: customLanguage.trim(),
1450+
})
1451+
setIsCustomLanguage(false)
1452+
setCustomLanguage("")
1453+
}
1454+
}}
1455+
disabled={!customLanguage.trim()}>
1456+
Add
1457+
</Button>
1458+
</div>
1459+
</div>
1460+
</div>
1461+
)}
13621462
</div>
13631463
)
13641464
}

0 commit comments

Comments
 (0)