diff --git a/.roo/rules-translate/001-general-rules.md b/.roo/rules-translate/001-general-rules.md index 61d232bbf7..bdb18bea64 100644 --- a/.roo/rules-translate/001-general-rules.md +++ b/.roo/rules-translate/001-general-rules.md @@ -1,6 +1,6 @@ # 1. SUPPORTED LANGUAGES AND LOCATION -- Localize all strings into the following locale files: ca, de, en, es, fr, hi, it, ja, ko, pl, pt-BR, ru, tr, vi, zh-CN, zh-TW +- Localize all strings into the following locale files: ca, de, en, es, fr, hi, it, ja, ko, nl, pl, pt-BR, ru, tr, vi, zh-CN, zh-TW - The VSCode extension has two main areas that require localization: - Core Extension: src/i18n/locales/ (extension backend) - WebView UI: webview-ui/src/i18n/locales/ (user interface) diff --git a/locales/nl/CODE_OF_CONDUCT.md b/locales/nl/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..1069d75223 --- /dev/null +++ b/locales/nl/CODE_OF_CONDUCT.md @@ -0,0 +1,77 @@ +# Gedragscode voor Bijdragers + +## Onze Belofte + +In het belang van het bevorderen van een open en gastvrije omgeving, beloven wij als +bijdragers en beheerders om deelname aan ons project en +onze gemeenschap een ervaring zonder intimidatie te maken voor iedereen, ongeacht leeftijd, lichaamsgrootte, +handicap, etniciteit, geslachtskenmerken, genderidentiteit en -expressie, +ervaringsniveau, opleiding, sociaaleconomische status, nationaliteit, persoonlijke +verschijning, ras, religie of seksuele identiteit en geaardheid. + +## Onze Standaarden + +Voorbeelden van gedrag dat bijdraagt aan het creëren van een positieve omgeving +zijn onder andere: + +- Gebruik van gastvrije en inclusieve taal +- Respect tonen voor verschillende standpunten en ervaringen +- Gracieus accepteren van constructieve kritiek +- Focussen op wat het beste is voor de gemeenschap +- Empathie tonen jegens andere leden van de gemeenschap + +Voorbeelden van onacceptabel gedrag van deelnemers zijn onder andere: + +- Het gebruik van geseksualiseerde taal of beelden en ongewenste seksuele aandacht of + avances +- Trollgedrag, beledigende/denigrerende opmerkingen en persoonlijke of politieke aanvallen +- Publieke of privé-intimidatie +- Het publiceren van andermans privé-informatie, zoals een fysiek of elektronisch + adres, zonder uitdrukkelijke toestemming +- Ander gedrag dat redelijkerwijs als ongepast kan worden beschouwd in een + professionele omgeving + +## Onze Verantwoordelijkheden + +Projectbeheerders zijn verantwoordelijk voor het verduidelijken van de normen voor acceptabel +gedrag en worden verwacht dat zij passende en eerlijke corrigerende maatregelen nemen als +reactie op elk geval van onacceptabel gedrag. + +Projectbeheerders hebben het recht en de verantwoordelijkheid om opmerkingen, commits, code, wiki-bewerkingen, +issues en andere bijdragen te verwijderen, te bewerken of af te wijzen +die niet in overeenstemming zijn met deze Gedragscode, of om een bijdrager tijdelijk of +permanent te verbannen voor ander gedrag dat zij als ongepast, +bedreigend, beledigend of schadelijk beschouwen. + +## Toepassingsgebied + +Deze Gedragscode is zowel van toepassing binnen projectruimten als in openbare ruimten +wanneer een individu het project of de gemeenschap vertegenwoordigt. Voorbeelden van +vertegenwoordiging van een project of gemeenschap zijn onder andere het gebruik van een officieel project-e-mailadres, +posten via een officieel social media-account of optreden als aangewezen +vertegenwoordiger bij een online of offline evenement. De vertegenwoordiging van een project kan +verder worden gedefinieerd en verduidelijkt door de projectbeheerders. + +## Handhaving + +Gevallen van beledigend, intimiderend of anderszins onacceptabel gedrag kunnen worden +gemeld door contact op te nemen met het projectteam via support@roocode.com. Alle klachten +zullen worden beoordeeld en onderzocht en zullen resulteren in een reactie die +noodzakelijk en gepast wordt geacht voor de omstandigheden. Het projectteam is +verplicht om vertrouwelijkheid te handhaven met betrekking tot de melder van een incident. +Meer details over specifieke handhavingsbeleid kunnen afzonderlijk worden gepubliceerd. + +Projectbeheerders die de Gedragscode niet te goeder trouw volgen of handhaven, +kunnen tijdelijke of permanente gevolgen ondervinden die worden bepaald door andere +leden van het projectleiderschap. + +## Toewijzing + +Deze Gedragscode is aangepast van de [Cline versie][cline_coc] van de [Contributor Covenant][homepage], versie 1.4, +beschikbaar op https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[cline_coc]: https://github.com/cline/cline/blob/main/CODE_OF_CONDUCT.md +[homepage]: https://www.contributor-covenant.org + +Voor antwoorden op veelgestelde vragen over deze gedragscode, zie +https://www.contributor-covenant.org/faq diff --git a/locales/nl/CONTRIBUTING.md b/locales/nl/CONTRIBUTING.md new file mode 100644 index 0000000000..97c82f555f --- /dev/null +++ b/locales/nl/CONTRIBUTING.md @@ -0,0 +1,50 @@ +# Bijdragen aan dit project + +We verwelkomen bijdragen van iedereen. Door bij te dragen aan dit project, ga je akkoord met de [gedragscode](CODE_OF_CONDUCT.md). Lees deze zorgvuldig door voordat je begint. + +## Hoe kan ik bijdragen? + +### Bugs melden + +Als je een bug hebt gevonden, meld deze dan via de [issue tracker](https://github.com/Githubguy132010/Roo-Code/issues). Zorg ervoor dat je de volgende informatie verstrekt: + +- Een duidelijke en beknopte beschrijving van de bug. +- Stappen om de bug te reproduceren. +- Verwacht gedrag. +- Wat er daadwerkelijk gebeurde. +- Eventuele relevante screenshots of logbestanden. + +### Functieverzoeken + +We staan open voor nieuwe functies en verbeteringen. Als je een idee hebt, open dan een [issue](https://github.com/Githubguy132010/Roo-Code/issues) en beschrijf je voorstel in detail. Zorg ervoor dat je de volgende informatie verstrekt: + +- Een duidelijke en beknopte beschrijving van de functie. +- Waarom deze functie nuttig zou zijn. +- Eventuele relevante voorbeelden of mockups. + +### Code bijdragen + +Als je code wilt bijdragen, volg dan deze stappen: + +1. Fork de repository. +2. Maak een nieuwe branch aan (`git checkout -b feature-naam`). +3. Commit je wijzigingen (`git commit -am 'Voeg nieuwe functie toe'`). +4. Push naar de branch (`git push origin feature-naam`). +5. Open een pull request. + +### Documentatie verbeteren + +We waarderen verbeteringen aan onze documentatie. Als je fouten hebt gevonden of suggesties hebt voor verbeteringen, open dan een [issue](https://github.com/Githubguy132010/Roo-Code/issues) of dien een pull request in. + +### Testen + +Testen zijn een belangrijk onderdeel van ons ontwikkelingsproces. Als je wilt helpen met testen, volg dan deze stappen: + +1. Fork de repository. +2. Maak een nieuwe branch aan (`git checkout -b test-naam`). +3. Schrijf je tests. +4. Commit je wijzigingen (`git commit -am 'Voeg nieuwe tests toe'`). +5. Push naar de branch (`git push origin test-naam`). +6. Open een pull request. + +Bedankt voor je bijdrage! diff --git a/locales/nl/README.md b/locales/nl/README.md new file mode 100644 index 0000000000..2fba1fd7c6 --- /dev/null +++ b/locales/nl/README.md @@ -0,0 +1,194 @@ +
+ + +Nederlands • [English](../../README.md) • [Català](../ca/README.md) • [Deutsch](../de/README.md) • [Español](../es/README.md) • [Français](../fr/README.md) • [हिन्दी](../hi/README.md) • [Italiano](../it/README.md) + + + + +[日本語](../ja/README.md) • [한국어](../ko/README.md) • [Polski](../pl/README.md) • [Português (BR)](../pt-BR/README.md) • [Türkçe](../tr/README.md) • [Tiếng Việt](../vi/README.md) • [简体中文](../zh-CN/README.md) • [繁體中文](../zh-TW/README.md) + + +
+
+
+

Roo Code (voorheen Roo Cline)

+

+ +

+

Verbind met ontwikkelaars, draag ideeën bij en blijf voorop met de nieuwste AI-gestuurde coderingstools.

+ + Join Discord + Join Reddit + +
+
+
+ +
+ +Download on VS Marketplace +Feature Requests +Rate & Review +Documentation + +
+ +**Roo Code** is een AI-gestuurde **autonome codeeragent** die in je editor leeft. Het kan: + +- Communiceren in natuurlijke taal +- Bestanden lezen en schrijven direct in je werkruimte +- Terminalcommando's uitvoeren +- Browseracties automatiseren +- Integreren met elke OpenAI-compatibele of aangepaste API/model +- Zijn “persoonlijkheid” en mogelijkheden aanpassen via **Custom Modes** + +Of je nu op zoek bent naar een flexibele codeerpartner, een systeemarchitect of gespecialiseerde rollen zoals een QA-engineer of productmanager, Roo Code kan je helpen efficiënter software te bouwen. + +Bekijk de [CHANGELOG](../../CHANGELOG.md) voor gedetailleerde updates en fixes. + +--- + +## 🎉 Roo Code 3.11 Uitgebracht + +Roo Code 3.11 brengt aanzienlijke prestatieverbeteringen en nieuwe functies! + +- Snelle Bewerking - Bewerking wordt nu veel sneller toegepast. Minder wachten, meer coderen. +- API-sleutel Saldi - Bekijk je OpenRouter- en Requesty-saldi in de instellingen. +- Projectniveau MCP-configuratie - Nu kun je het per project/werkruimte configureren. +- Verbeterde Gemini-ondersteuning - Slimmere herhalingen, verbeterde escapings, toegevoegd aan Vertex-provider. +- Instellingen Importeren/Exporteren - Maak eenvoudig een back-up of deel je configuratie over verschillende setups. + +--- + +## Wat Kan Roo Code Doen? + +- 🚀 **Code Genereren** vanuit natuurlijke taalbeschrijvingen +- 🔧 **Refactoreren & Debuggen** van bestaande code +- 📝 **Documentatie Schrijven & Bijwerken** +- 🤔 **Vragen Beantwoorden** over je codebase +- 🔄 **Automatiseren** van repetitieve taken +- 🏗️ **Nieuwe Bestanden en Projecten Maken** + +## Snel Starten + +1. [Installeer Roo Code](https://docs.roocode.com/getting-started/installing) +2. [Verbind Je AI-provider](https://docs.roocode.com/getting-started/connecting-api-provider) +3. [Probeer Je Eerste Taak](https://docs.roocode.com/getting-started/your-first-task) + +## Belangrijkste Functies + +### Meerdere Modi + +Roo Code past zich aan jouw behoeften aan met gespecialiseerde [modi](https://docs.roocode.com/basic-usage/using-modes): + +- **Code Mode:** Voor algemene coderingstaken +- **Architect Mode:** Voor planning en technische leiding +- **Ask Mode:** Voor het beantwoorden van vragen en het verstrekken van informatie +- **Debug Mode:** Voor systematische probleemdiagnose +- **[Custom Modes](https://docs.roocode.com/advanced-usage/custom-modes):** Maak onbeperkte gespecialiseerde persona's voor beveiligingsaudits, prestatieoptimalisatie, documentatie of andere taken + +### Slimme Tools + +Roo Code wordt geleverd met krachtige [tools](https://docs.roocode.com/basic-usage/how-tools-work) die kunnen: + +- Bestanden lezen en schrijven in je project +- Commando's uitvoeren in je VS Code-terminal +- Een webbrowser bedienen +- Externe tools gebruiken via [MCP (Model Context Protocol)](https://docs.roocode.com/advanced-usage/mcp) + +MCP breidt de mogelijkheden van Roo Code uit door je in staat te stellen onbeperkte aangepaste tools toe te voegen. Integreer met externe API's, verbind met databases of maak gespecialiseerde ontwikkeltools - MCP biedt het framework om de functionaliteit van Roo Code uit te breiden om aan jouw specifieke behoeften te voldoen. + +### Aanpassing + +Laat Roo Code werken zoals jij dat wilt met: + +- [Aangepaste Instructies](https://docs.roocode.com/advanced-usage/custom-instructions) voor gepersonaliseerd gedrag +- [Custom Modes](https://docs.roocode.com/advanced-usage/custom-modes) voor gespecialiseerde taken +- [Lokale Modellen](https://docs.roocode.com/advanced-usage/local-models) voor offline gebruik +- [Auto-Approval Instellingen](https://docs.roocode.com/advanced-usage/auto-approving-actions) voor snellere workflows + +## Bronnen + +### Documentatie + +- [Basisgebruiksgids](https://docs.roocode.com/basic-usage/the-chat-interface) +- [Geavanceerde Functies](https://docs.roocode.com/advanced-usage/auto-approving-actions) +- [Veelgestelde Vragen](https://docs.roocode.com/faq) + +### Community + +- **Discord:** [Word lid van onze Discord-server](https://discord.gg/roocode) voor realtime hulp en discussies +- **Reddit:** [Bezoek onze subreddit](https://www.reddit.com/r/RooCode) om ervaringen en tips te delen +- **GitHub:** Meld [problemen](https://github.com/RooVetGit/Roo-Code/issues) of vraag [functies](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) aan + +--- + +## Lokale Installatie & Ontwikkeling + +1. **Kloon** de repo: + +```sh +git clone https://github.com/RooVetGit/Roo-Code.git +``` + +2. **Installeer afhankelijkheden**: + +```sh +npm run install:all +``` + +3. **Start de webview (Vite/React-app met HMR)**: + +```sh +npm run dev +``` + +4. **Debuggen**: + Druk op `F5` (of **Run** → **Start Debugging**) in VSCode om een nieuwe sessie te openen met Roo Code geladen. + +Wijzigingen in de webview verschijnen onmiddellijk. Wijzigingen in de kernextensie vereisen een herstart van de extensiehost. + +Je kunt ook een .vsix bouwen en deze direct in VSCode installeren: + +```sh +npm run build +``` + +Een `.vsix`-bestand verschijnt in de `bin/`-map die kan worden geïnstalleerd met: + +```sh +code --install-extension bin/roo-cline-.vsix +``` + +We gebruiken [changesets](https://github.com/changesets/changesets) voor versiebeheer en publicatie. Bekijk onze `CHANGELOG.md` voor release-opmerkingen. + +--- + +## Disclaimer + +**Let op** dat Roo Code, Inc **geen** verklaringen of garanties geeft met betrekking tot enige code, modellen of andere tools die worden geleverd of beschikbaar worden gesteld in verband met Roo Code, enige bijbehorende tools van derden of enige resulterende outputs. Je neemt **alle risico's** die gepaard gaan met het gebruik van dergelijke tools of outputs; dergelijke tools worden geleverd op een **"AS IS"** en **"AS AVAILABLE"** basis. Dergelijke risico's kunnen onder meer omvatten, maar zijn niet beperkt tot, inbreuk op intellectueel eigendom, cyberkwetsbaarheden of -aanvallen, vooringenomenheid, onnauwkeurigheden, fouten, defecten, virussen, downtime, eigendomsverlies of -schade en/of persoonlijk letsel. Je bent zelf verantwoordelijk voor je gebruik van dergelijke tools of outputs (inclusief, maar niet beperkt tot, de wettigheid, geschiktheid en resultaten daarvan). + +--- + +## Bijdragen + +We houden van bijdragen uit de community! Begin door onze [CONTRIBUTING.md](../../CONTRIBUTING.md) te lezen. + +--- + +## Bijdragers + +Bedankt aan al onze bijdragers die hebben geholpen Roo Code beter te maken! + + + + + +## Licentie + +[Apache 2.0 © 2025 Roo Code, Inc.](../../LICENSE) + +--- + +**Geniet van Roo Code!** Of je het nu kort houdt of autonoom laat werken, we kunnen niet wachten om te zien wat je bouwt. Als je vragen of ideeën voor functies hebt, bezoek dan onze [Reddit-community](https://www.reddit.com/r/RooCode/) of [Discord](https://discord.gg/roocode). Veel codeerplezier! \ No newline at end of file diff --git a/package.nls.nl.json b/package.nls.nl.json new file mode 100644 index 0000000000..6563a1e022 --- /dev/null +++ b/package.nls.nl.json @@ -0,0 +1,33 @@ +{ + "extension.displayName": "Roo Code (voorheen Roo Cline)", + "extension.description": "Een compleet dev team van AI-agenten in je editor.", + "views.contextMenu.label": "Roo Code", + "views.terminalMenu.label": "Roo Code", + "views.activitybar.title": "Roo Code", + "command.newTask.title": "Nieuwe Taak", + "command.mcpServers.title": "MCP Servers", + "command.prompts.title": "Prompts", + "command.history.title": "Geschiedenis", + "command.openInEditor.title": "Openen in Editor", + "command.settings.title": "Instellingen", + "command.documentation.title": "Documentatie", + "command.openInNewTab.title": "Openen in Nieuw Tabblad", + "command.explainCode.title": "Code Uitleggen", + "command.fixCode.title": "Code Fixen", + "command.improveCode.title": "Code Verbeteren", + "command.addToContext.title": "Toevoegen aan Context", + "command.focusInput.title": "Focus Invoerveld", + "command.setCustomStoragePath.title": "Aangepast Opslagpad Instellen", + "command.terminal.addToContext.title": "Terminalinhoud Toevoegen aan Context", + "command.terminal.fixCommand.title": "Dit Commando Fixen", + "command.terminal.explainCommand.title": "Dit Commando Uitleggen", + "command.terminal.fixCommandInCurrentTask.title": "Dit Commando Fixen (Huidige Taak)", + "command.terminal.explainCommandInCurrentTask.title": "Dit Commando Uitleggen (Huidige Taak)", + "command.acceptInput.title": "Invoer/Suggestie Accepteren", + "configuration.title": "Roo Code", + "commands.allowedCommands.description": "Commando's die automatisch kunnen worden uitgevoerd wanneer 'Altijd uitvoerbewerkingen goedkeuren' is ingeschakeld", + "settings.vsCodeLmModelSelector.description": "Instellingen voor VSCode Language Model API", + "settings.vsCodeLmModelSelector.vendor.description": "De leverancier van het taalmodel (bijv. copilot)", + "settings.vsCodeLmModelSelector.family.description": "De familie van het taalmodel (bijv. gpt-4)", + "settings.customStoragePath.description": "Aangepast opslagpad. Laat leeg om de standaardlocatie te gebruiken. Ondersteunt absolute paden (bijv. 'D:\\RooCodeStorage')" +} diff --git a/src/i18n/locales/nl/common.json b/src/i18n/locales/nl/common.json new file mode 100644 index 0000000000..53607bc93d --- /dev/null +++ b/src/i18n/locales/nl/common.json @@ -0,0 +1,93 @@ +{ + "extension": { + "name": "Roo Code", + "description": "Een heel team van AI-ontwikkelaars in je editor." + }, + "number_format": { + "thousand_suffix": "k", + "million_suffix": "m", + "billion_suffix": "b" + }, + "welcome": "Welkom, {{name}}! Je hebt {{count}} meldingen.", + "items": { + "zero": "Geen items", + "one": "Eén item", + "other": "{{count}} items" + }, + "confirmation": { + "reset_state": "Weet je zeker dat je alle status en geheime opslag in de extensie wilt resetten? Dit kan niet ongedaan worden gemaakt.", + "delete_config_profile": "Weet je zeker dat je dit configuratieprofiel wilt verwijderen?", + "delete_custom_mode": "Weet je zeker dat je deze aangepaste modus wilt verwijderen?", + "delete_message": "Wat wil je verwijderen?", + "just_this_message": "Alleen dit bericht", + "this_and_subsequent": "Dit en alle volgende berichten" + }, + "errors": { + "invalid_mcp_config": "Ongeldig MCP-projectconfiguratieformaat", + "invalid_mcp_settings_format": "Ongeldig MCP-instellingen JSON-formaat. Zorg ervoor dat je instellingen het juiste JSON-formaat volgen.", + "invalid_mcp_settings_syntax": "Ongeldig MCP-instellingen JSON-formaat. Controleer je instellingenbestand op syntaxisfouten.", + "invalid_mcp_settings_validation": "Ongeldig MCP-instellingenformaat: {{errorMessages}}", + "failed_initialize_project_mcp": "Kan MCP-server van project niet initialiseren: {{error}}", + "invalid_data_uri": "Ongeldig data-URI-formaat", + "checkpoint_timeout": "Time-out bij poging om checkpoint te herstellen.", + "checkpoint_failed": "Kan checkpoint niet herstellen.", + "no_workspace": "Open eerst een projectmap", + "update_support_prompt": "Kan ondersteuningsprompt niet bijwerken", + "reset_support_prompt": "Kan ondersteuningsprompt niet resetten", + "enhance_prompt": "Kan prompt niet verbeteren", + "get_system_prompt": "Kan systeemprompt niet ophalen", + "search_commits": "Kan commits niet doorzoeken", + "save_api_config": "Kan API-configuratie niet opslaan", + "create_api_config": "Kan API-configuratie niet maken", + "rename_api_config": "Kan API-configuratie niet hernoemen", + "load_api_config": "Kan API-configuratie niet laden", + "delete_api_config": "Kan API-configuratie niet verwijderen", + "list_api_config": "Kan lijst met API-configuraties niet ophalen", + "update_server_timeout": "Kan server-time-out niet bijwerken", + "create_mcp_json": "Kan .roo/mcp.json niet maken of openen: {{error}}", + "hmr_not_running": "Lokale ontwikkelserver draait niet, HMR zal niet werken. Voer 'npm run dev' uit voordat je de extensie start om HMR in te schakelen.", + "retrieve_current_mode": "Fout: kan huidige modus niet ophalen uit status.", + "failed_delete_repo": "Kan bijbehorende schaduwrepository of -tak niet verwijderen: {{error}}", + "failed_remove_directory": "Kan taakmap niet verwijderen: {{error}}", + "custom_storage_path_unusable": "Aangepast opslagpad \"{{path}}\" is onbruikbaar, standaardpad wordt gebruikt", + "cannot_access_path": "Kan geen toegang krijgen tot pad {{path}}: {{error}}", + "failed_update_project_mcp": "Kan MCP-servers van project niet bijwerken" + }, + "warnings": { + "no_terminal_content": "Geen terminalinhoud geselecteerd", + "missing_task_files": "De bestanden van deze taak ontbreken. Wil je deze uit de takenlijst verwijderen?" + }, + "info": { + "no_changes": "Geen wijzigingen gevonden.", + "clipboard_copy": "Systeemprompt succesvol gekopieerd naar klembord", + "history_cleanup": "{{count}} taak/taken met ontbrekende bestanden uit geschiedenis opgeschoond.", + "mcp_server_restarting": "MCP-server {{serverName}} wordt opnieuw opgestart...", + "mcp_server_connected": "{{serverName}} MCP-server verbonden", + "mcp_server_deleted": "MCP-server verwijderd: {{serverName}}", + "mcp_server_not_found": "Server \"{{serverName}}\" niet gevonden in configuratie", + "custom_storage_path_set": "Aangepast opslagpad ingesteld: {{path}}", + "default_storage_path": "Teruggezet naar standaardopslagpad", + "settings_imported": "Instellingen succesvol geïmporteerd." + }, + "answers": { + "yes": "Ja", + "no": "Nee", + "cancel": "Annuleren", + "remove": "Verwijderen", + "keep": "Behouden" + }, + "tasks": { + "canceled": "Taakfout: Het is gestopt en geannuleerd door de gebruiker.", + "deleted": "Taakfout: Het is gestopt en verwijderd door de gebruiker." + }, + "storage": { + "prompt_custom_path": "Voer aangepast opslagpad voor gespreksgeschiedenis in, laat leeg om standaardlocatie te gebruiken", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "Voer een absoluut pad in (bijv. D:\\RooCodeStorage of /home/user/storage)", + "enter_valid_path": "Voer een geldig pad in" + }, + "input": { + "task_prompt": "Wat moet Roo doen?", + "task_placeholder": "Typ hier je taak" + } +} diff --git a/src/i18n/locales/nl/tools.json b/src/i18n/locales/nl/tools.json new file mode 100644 index 0000000000..12aa2234cb --- /dev/null +++ b/src/i18n/locales/nl/tools.json @@ -0,0 +1,9 @@ +{ + "readFile": { + "linesRange": " (regels {{start}}-{{end}})", + "linesFromToEnd": " (regels {{start}}-einde)", + "linesFromStartTo": " (regels 1-{{end}})", + "definitionsOnly": " (alleen definities)", + "maxLines": " (maximaal {{max}} regels)" + } +} diff --git a/webview-ui/package-lock.json b/webview-ui/package-lock.json index abd6901452..eaec7b79fd 100644 --- a/webview-ui/package-lock.json +++ b/webview-ui/package-lock.json @@ -23,6 +23,7 @@ "@radix-ui/react-tooltip": "^1.1.8", "@tailwindcss/vite": "^4.0.0", "@tanstack/react-query": "^5.68.0", + "@types/react-i18next": "^7.8.3", "@vscode/webview-ui-toolkit": "^1.4.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -65,8 +66,8 @@ "@testing-library/user-event": "^14.6.1", "@types/jest": "^27.5.2", "@types/node": "^18.0.0", - "@types/react": "^18.3.18", - "@types/react-dom": "^18.3.5", + "@types/react": "^18.3.20", + "@types/react-dom": "^18.3.6", "@types/shell-quote": "^1.7.5", "@types/testing-library__jest-dom": "^5.14.5", "@types/vscode-webview": "^1.57.5", @@ -7231,6 +7232,12 @@ "@types/unist": "*" } }, + "node_modules/@types/i18next": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@types/i18next/-/i18next-12.1.0.tgz", + "integrity": "sha512-qLyqTkp3ZKHsSoX8CNVYcTyTkxlm0aRCUpaUVetgkSlSpiNCdWryOgaYwgbO04tJIfLgBXPcy0tJ3Nl/RagllA==", + "license": "MIT" + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -7353,9 +7360,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", - "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "version": "18.3.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", + "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -7363,15 +7370,25 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", - "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "version": "18.3.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.6.tgz", + "integrity": "sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==", "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^18.0.0" } }, + "node_modules/@types/react-i18next": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@types/react-i18next/-/react-i18next-7.8.3.tgz", + "integrity": "sha512-VPopxbHXz/1Sjl+ljXQQchf6FHXaYLaH0a6TH6KnGOQGD4LzNbUVlofK26S30OIYfYibm8r/sAb2KeTst+AwTQ==", + "license": "MIT", + "dependencies": { + "@types/i18next": "*", + "@types/react": "*" + } + }, "node_modules/@types/resolve": { "version": "1.20.6", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", diff --git a/webview-ui/package.json b/webview-ui/package.json index 91ba3d76dc..7f7a403e57 100644 --- a/webview-ui/package.json +++ b/webview-ui/package.json @@ -32,6 +32,7 @@ "@radix-ui/react-tooltip": "^1.1.8", "@tailwindcss/vite": "^4.0.0", "@tanstack/react-query": "^5.68.0", + "@types/react-i18next": "^7.8.3", "@vscode/webview-ui-toolkit": "^1.4.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -74,8 +75,8 @@ "@testing-library/user-event": "^14.6.1", "@types/jest": "^27.5.2", "@types/node": "^18.0.0", - "@types/react": "^18.3.18", - "@types/react-dom": "^18.3.5", + "@types/react": "^18.3.20", + "@types/react-dom": "^18.3.6", "@types/shell-quote": "^1.7.5", "@types/testing-library__jest-dom": "^5.14.5", "@types/vscode-webview": "^1.57.5", diff --git a/webview-ui/src/components/chat/AutoApproveMenu.tsx b/webview-ui/src/components/chat/AutoApproveMenu.tsx index aaa30a0153..f0617b8a0d 100644 --- a/webview-ui/src/components/chat/AutoApproveMenu.tsx +++ b/webview-ui/src/components/chat/AutoApproveMenu.tsx @@ -1,4 +1,5 @@ -import { useCallback, useMemo, useState } from "react" +/// +import React, { useCallback, useMemo, useState, useEffect } from "react" import { Trans } from "react-i18next" import { VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react" @@ -11,7 +12,7 @@ interface AutoApproveMenuProps { style?: React.CSSProperties } -const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { +const AutoApproveMenu: React.FC = ({ style = {} }: AutoApproveMenuProps) => { const [isExpanded, setIsExpanded] = useState(false) const { @@ -80,18 +81,18 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { ], ) - const toggleExpanded = useCallback(() => setIsExpanded((prev) => !prev), []) + const toggleExpanded = useCallback(() => setIsExpanded((prev: boolean) => !prev), []) const toggles = useMemo( () => ({ - alwaysAllowReadOnly: alwaysAllowReadOnly, - alwaysAllowWrite: alwaysAllowWrite, - alwaysAllowExecute: alwaysAllowExecute, - alwaysAllowBrowser: alwaysAllowBrowser, - alwaysAllowMcp: alwaysAllowMcp, - alwaysAllowModeSwitch: alwaysAllowModeSwitch, - alwaysAllowSubtasks: alwaysAllowSubtasks, - alwaysApproveResubmit: alwaysApproveResubmit, + alwaysAllowReadOnly, + alwaysAllowWrite, + alwaysAllowExecute, + alwaysAllowBrowser, + alwaysAllowMcp, + alwaysAllowModeSwitch, + alwaysAllowSubtasks, + alwaysApproveResubmit, }), [ alwaysAllowReadOnly, @@ -105,10 +106,14 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { ], ) - const enabledActionsList = Object.entries(toggles) - .filter(([_key, value]) => !!value) - .map(([key]) => t(autoApproveSettingsConfig[key as AutoApproveSetting].labelKey)) - .join(", ") + const enabledActions = Object.values(toggles).filter(Boolean) + const hasEnabledActions = enabledActions.length > 0 + const enabledActionsList = hasEnabledActions + ? Object.entries(toggles) + .filter(([_key, value]) => !!value) + .map(([key]) => t(autoApproveSettingsConfig[key as AutoApproveSetting].labelKey)) + .join(", ") + : t("chat:autoApprove.none") const handleOpenSettings = useCallback( () => @@ -116,6 +121,14 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { [], ) + // Auto-uncheck if no actions are enabled + useEffect(() => { + if (autoApprovalEnabled && !hasEnabledActions) { + setAutoApprovalEnabled(false) + vscode.postMessage({ type: "autoApprovalEnabled", bool: false }) + } + }, [autoApprovalEnabled, hasEnabledActions, setAutoApprovalEnabled]) + return (
{ cursor: "pointer", }} onClick={toggleExpanded}> -
e.stopPropagation()}> +
e.stopPropagation()}> { - const newValue = !(autoApprovalEnabled ?? false) - setAutoApprovalEnabled(newValue) - vscode.postMessage({ type: "autoApprovalEnabled", bool: newValue }) + if (!isExpanded) { + const newValue = !(autoApprovalEnabled ?? false) + if (newValue && !hasEnabledActions) { + return // Prevent checking if no actions enabled + } + setAutoApprovalEnabled(newValue) + vscode.postMessage({ type: "autoApprovalEnabled", bool: newValue }) + } }} + disabled={isExpanded || (!autoApprovalEnabled && !hasEnabledActions)} />
{ flex: 1, minWidth: 0, }}> - {enabledActionsList || t("chat:autoApprove.none")} + {enabledActionsList} +import React, { HTMLAttributes } from "react" import { X } from "lucide-react" +import type { KeyboardEvent } from "react" import { useAppTranslation } from "@/i18n/TranslationContext" import { VSCodeTextField, VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" @@ -9,7 +11,7 @@ import { Button, Slider } from "@/components/ui" import { SetCachedStateField } from "./types" import { SectionHeader } from "./SectionHeader" import { Section } from "./Section" -import { AutoApproveToggle } from "./AutoApproveToggle" +import { AutoApproveToggle, AutoApproveSetting, autoApproveSettingsConfig } from "./AutoApproveToggle" type AutoApproveSettingsProps = HTMLAttributes & { alwaysAllowReadOnly?: boolean @@ -24,7 +26,7 @@ type AutoApproveSettingsProps = HTMLAttributes & { alwaysAllowModeSwitch?: boolean alwaysAllowSubtasks?: boolean alwaysAllowExecute?: boolean - allowedCommands?: string[] + allowedCommands?: readonly string[] setCachedStateField: SetCachedStateField< | "alwaysAllowReadOnly" | "alwaysAllowReadOnlyOutsideWorkspace" @@ -42,40 +44,84 @@ type AutoApproveSettingsProps = HTMLAttributes & { > } -export const AutoApproveSettings = ({ - alwaysAllowReadOnly, - alwaysAllowReadOnlyOutsideWorkspace, - alwaysAllowWrite, - alwaysAllowWriteOutsideWorkspace, - writeDelayMs, - alwaysAllowBrowser, - alwaysApproveResubmit, - requestDelaySeconds, - alwaysAllowMcp, - alwaysAllowModeSwitch, - alwaysAllowSubtasks, - alwaysAllowExecute, - allowedCommands, +export const AutoApproveSettings: React.FC = ({ + alwaysAllowReadOnly = false, + alwaysAllowReadOnlyOutsideWorkspace = false, + alwaysAllowWrite = false, + alwaysAllowWriteOutsideWorkspace = false, + writeDelayMs = 0, + alwaysAllowBrowser = false, + alwaysApproveResubmit = false, + requestDelaySeconds = 5, + alwaysAllowMcp = false, + alwaysAllowModeSwitch = false, + alwaysAllowSubtasks = false, + alwaysAllowExecute = false, + allowedCommands = [], setCachedStateField, ...props -}: AutoApproveSettingsProps) => { +}) => { const { t } = useAppTranslation() - const [commandInput, setCommandInput] = useState("") + const [commandInput, setCommandInput] = React.useState("") - const handleAddCommand = () => { - const currentCommands = allowedCommands ?? [] + const hasEnabledActions = [ + alwaysAllowReadOnly, + alwaysAllowWrite, + alwaysAllowBrowser, + alwaysApproveResubmit, + alwaysAllowMcp, + alwaysAllowModeSwitch, + alwaysAllowSubtasks, + alwaysAllowExecute + ].some(Boolean) + + const enabledActionsList = hasEnabledActions + ? Object.entries({ + alwaysAllowReadOnly, + alwaysAllowWrite, + alwaysAllowBrowser, + alwaysApproveResubmit, + alwaysAllowMcp, + alwaysAllowModeSwitch, + alwaysAllowSubtasks, + alwaysAllowExecute + }) + .filter(([_, value]) => !!value) + .map(([key]) => t(autoApproveSettingsConfig[key as AutoApproveSetting].labelKey)) + .join(", ") + : t("chat:autoApprove.none") - if (commandInput && !currentCommands.includes(commandInput)) { - const newCommands = [...currentCommands, commandInput] + const handleAddCommand = () => { + if (commandInput && !allowedCommands.includes(commandInput)) { + const newCommands = [...(allowedCommands as string[]), commandInput] setCachedStateField("allowedCommands", newCommands) setCommandInput("") vscode.postMessage({ type: "allowedCommands", commands: newCommands }) } } + const handleCheckboxChange = (field: keyof Omit>) => + (e: Event | React.FormEvent) => { + const target = (e as CustomEvent)?.detail?.target || (e.target as HTMLInputElement) + setCachedStateField(field, target.checked) + } + + const handleInputChange = (e: Event | React.FormEvent) => { + const target = (e as CustomEvent)?.detail?.target || (e.target as HTMLInputElement) + setCommandInput(target.value) + } + + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === "Enter") { + e.preventDefault() + handleAddCommand() + } + } + return (
- +
{t("settings:sections.autoApprove")}
@@ -83,22 +129,30 @@ export const AutoApproveSettings = ({
- setCachedStateField(key, value)} - /> +
+
+ {t("settings:autoApprove.status")} + + {enabledActionsList} + +
+ + setCachedStateField(key, value)} /> +
{/* ADDITIONAL SETTINGS */} {alwaysAllowReadOnly && ( -
+
{t("settings:autoApprove.readOnly.label")}
@@ -106,9 +160,7 @@ export const AutoApproveSettings = ({
- setCachedStateField("alwaysAllowReadOnlyOutsideWorkspace", e.target.checked) - } + onChange={handleCheckboxChange("alwaysAllowReadOnlyOutsideWorkspace")} data-testid="always-allow-readonly-outside-workspace-checkbox"> {t("settings:autoApprove.readOnly.outsideWorkspace.label")} @@ -122,7 +174,7 @@ export const AutoApproveSettings = ({ )} {alwaysAllowWrite && ( -
+
{t("settings:autoApprove.write.label")}
@@ -130,9 +182,7 @@ export const AutoApproveSettings = ({
- setCachedStateField("alwaysAllowWriteOutsideWorkspace", e.target.checked) - } + onChange={handleCheckboxChange("alwaysAllowWriteOutsideWorkspace")} data-testid="always-allow-write-outside-workspace-checkbox"> {t("settings:autoApprove.write.outsideWorkspace.label")} @@ -149,7 +199,7 @@ export const AutoApproveSettings = ({ max={5000} step={100} value={[writeDelayMs]} - onValueChange={([value]) => setCachedStateField("writeDelayMs", value)} + onValueChange={([value]: number[]) => setCachedStateField("writeDelayMs", value)} data-testid="write-delay-slider" /> {writeDelayMs}ms @@ -162,7 +212,7 @@ export const AutoApproveSettings = ({ )} {alwaysApproveResubmit && ( -
+
{t("settings:autoApprove.retry.label")}
@@ -174,7 +224,7 @@ export const AutoApproveSettings = ({ max={100} step={1} value={[requestDelaySeconds]} - onValueChange={([value]) => setCachedStateField("requestDelaySeconds", value)} + onValueChange={([value]: number[]) => setCachedStateField("requestDelaySeconds", value)} data-testid="request-delay-slider" /> {requestDelaySeconds}s @@ -187,7 +237,7 @@ export const AutoApproveSettings = ({ )} {alwaysAllowExecute && ( -
+
{t("settings:autoApprove.execute.label")}
@@ -205,13 +255,8 @@ export const AutoApproveSettings = ({
setCommandInput(e.target.value)} - onKeyDown={(e: any) => { - if (e.key === "Enter") { - e.preventDefault() - handleAddCommand() - } - }} + onInput={handleInputChange} + onKeyDown={handleKeyDown} placeholder={t("settings:autoApprove.execute.commandPlaceholder")} className="grow" data-testid="command-input" @@ -222,13 +267,13 @@ export const AutoApproveSettings = ({
- {(allowedCommands ?? []).map((cmd, index) => ( + {allowedCommands.map((cmd: string, index: number) => (