Skip to content

Internationalization for SIM AI app with next-intl#3494

Open
Kallebe23 wants to merge 27 commits intosimstudioai:stagingfrom
Kallebe23:feat/sim-translations
Open

Internationalization for SIM AI app with next-intl#3494
Kallebe23 wants to merge 27 commits intosimstudioai:stagingfrom
Kallebe23:feat/sim-translations

Conversation

@Kallebe23
Copy link

Summary

Start internationalization of SIM AI app with next-intl

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation
  • Other: ___________

Testing

Tested locally, missing more tests for all features.

Checklist

  • Code follows project style guidelines
  • Self-reviewed my changes
  • Tests added/updated and passing
  • No new warnings introduced
  • I confirm that I have read and agree to the terms outlined in the Contributor License Agreement (CLA)

This is still in development, if you want to contribute, feel free to commit in the forked repo.

waleedlatif1 and others added 27 commits February 16, 2026 00:36
…stash, algolia tools; isolated-vm robustness improvements, tables backend (simstudioai#3271)

* feat(tools): advanced fields for youtube, vercel; added cloudflare and dataverse tools (simstudioai#3257)

* refactor(vercel): mark optional fields as advanced mode

Move optional/power-user fields behind the advanced toggle:
- List Deployments: project filter, target, state
- Create Deployment: project ID override, redeploy from, target
- List Projects: search
- Create/Update Project: framework, build/output/install commands
- Env Vars: variable type
- Webhooks: project IDs filter
- Checks: path, details URL
- Team Members: role filter
- All operations: team ID scope

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* style(youtube): mark optional params as advanced mode

Hide pagination, sort order, and filter fields behind the advanced
toggle for a cleaner default UX across all YouTube operations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* added advanced fields for vercel and youtube, added cloudflare and dataverse block

* addded desc for dataverse

* add more tools

* ack comment

* more

* ops

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat(tables): added tables (simstudioai#2867)

* updates

* required

* trashy table viewer

* updates

* updates

* filtering ui

* updates

* updates

* updates

* one input mode

* format

* fix lints

* improved errors

* updates

* updates

* chages

* doc strings

* breaking down file

* update comments with ai

* updates

* comments

* changes

* revert

* updates

* dedupe

* updates

* updates

* updates

* refactoring

* renames & refactors

* refactoring

* updates

* undo

* update db

* wand

* updates

* fix comments

* fixes

* simplify comments

* u[dates

* renames

* better comments

* validation

* updates

* updates

* updates

* fix sorting

* fix appearnce

* updating prompt to make it user sort

* rm

* updates

* rename

* comments

* clean comments

* simplicifcaiton

* updates

* updates

* refactor

* reduced type confusion

* undo

* rename

* undo changes

* undo

* simplify

* updates

* updates

* revert

* updates

* db updates

* type fix

* fix

* fix error handling

* updates

* docs

* docs

* updates

* rename

* dedupe

* revert

* uncook

* updates

* fix

* fix

* fix

* fix

* prepare merge

* readd migrations

* add back missed code

* migrate enrichment logic to general abstraction

* address bugbot concerns

* adhere to size limits for tables

* remove conflicting migration

* add back migrations

* fix tables auth

* fix permissive auth

* fix lint

* reran migrations

* migrate to use tanstack query for all server state

* update table-selector

* update names

* added tables to permission groups, updated subblock types

---------

Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
Co-authored-by: waleed <walif6@gmail.com>

* fix(snapshot): changed insert to upsert when concurrent identical child workflows are running (simstudioai#3259)

* fix(snapshot): changed insert to upsert when concurrent identical child workflows are running

* fixed ci tests failing

* fix(workflows): disallow duplicate workflow names at the same folder level (simstudioai#3260)

* feat(tools): added redis, upstash, algolia, and revenuecat (simstudioai#3261)

* feat(tools): added redis, upstash, algolia, and revenuecat

* ack comment

* feat(models): add gemini-3.1-pro-preview and update gemini-3-pro thinking levels (simstudioai#3263)

* fix(audit-log): lazily resolve actor name/email when missing (simstudioai#3262)

* fix(blocks): move type coercions from tools.config.tool to tools.config.params (simstudioai#3264)

* fix(blocks): move type coercions from tools.config.tool to tools.config.params

Number() coercions in tools.config.tool ran at serialization time before
variable resolution, destroying dynamic references like <block.result.count>
by converting them to NaN/null. Moved all coercions to tools.config.params
which runs at execution time after variables are resolved.

Fixed in 15 blocks: exa, arxiv, sentry, incidentio, wikipedia, ahrefs,
posthog, elasticsearch, dropbox, hunter, lemlist, spotify, youtube, grafana,
parallel. Also added mode: 'advanced' to optional exa fields.

Closes simstudioai#3258

* fix(blocks): address PR review — move remaining param mutations from tool() to params()

- Moved field mappings from tool() to params() in grafana, posthog,
  lemlist, spotify, dropbox (same dynamic reference bug)
- Fixed parallel.ts excerpts/full_content boolean logic
- Fixed parallel.ts search_queries empty case (must set undefined)
- Fixed elasticsearch.ts timeout not included when already ends with 's'
- Restored dropbox.ts tool() switch for proper default fallback

* fix(blocks): restore field renames to tool() for serialization-time validation

Field renames (e.g. personalApiKey→apiKey) must be in tool() because
validateRequiredFieldsBeforeExecution calls selectToolId()→tool() then
checks renamed field names on params. Only type coercions (Number(),
boolean) stay in params() to avoid destroying dynamic variable references.

* improvement(resolver): resovled empty sentinel to not pass through unexecuted valid refs to text inputs (simstudioai#3266)

* fix(blocks): add required constraint for serviceDeskId in JSM block (simstudioai#3268)

* fix(blocks): add required constraint for serviceDeskId in JSM block

* fix(blocks): rename custom field values to request field values in JSM create request

* fix(trigger): add isolated-vm support to trigger.dev container builds (simstudioai#3269)

Scheduled workflow executions running in trigger.dev containers were
failing to spawn isolated-vm workers because the native module wasn't
available in the container. This caused loop condition evaluation to
silently fail and exit after one iteration.

- Add isolated-vm to build.external and additionalPackages in trigger config
- Include isolated-vm-worker.cjs via additionalFiles for child process spawning
- Add fallback path resolution for worker file in trigger.dev environment

* fix(tables): hide tables from sidebar and block registry (simstudioai#3270)

* fix(tables): hide tables from sidebar and block registry

* fix(trigger): add isolated-vm support to trigger.dev container builds (simstudioai#3269)

Scheduled workflow executions running in trigger.dev containers were
failing to spawn isolated-vm workers because the native module wasn't
available in the container. This caused loop condition evaluation to
silently fail and exit after one iteration.

- Add isolated-vm to build.external and additionalPackages in trigger config
- Include isolated-vm-worker.cjs via additionalFiles for child process spawning
- Add fallback path resolution for worker file in trigger.dev environment

* lint

* fix(trigger): update node version to align with main app (simstudioai#3272)

* fix(build): fix corrupted sticky disk cache on blacksmith (simstudioai#3273)

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Lakee Sivaraya <71339072+lakeesiv@users.noreply.github.com>
Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
… fixes, removed retired models, hex integration
@cursor
Copy link

cursor bot commented Mar 9, 2026

PR Summary

Medium Risk
Touches many user-facing screens and makes RootLayout async while introducing NextIntlClientProvider, so missing messages/keys or provider config could cause runtime i18n errors or subtle hydration/UI regressions.

Overview
Adds initial next-intl integration by wrapping the app in NextIntlClientProvider (and converting RootLayout to async) so client/server components can call useTranslations/getTranslations.

Refactors major UI surfaces to be translatable: auth (login/signup/SSO/social + reset password), knowledge base (list, cards, modals, context menus, sort options), and logs (toolbar, dashboard, details, context menus, selectors) now use translation keys for all user-visible/aria text, including t.rich for terms/privacy notices and localized validation/error message hooks.

Also adds a sim-translations Claude rule doc and updates apps/sim/.gitignore to ignore certificates.

Written by Cursor Bugbot for commit 123a90e. This will update automatically on new commits. Configure here.

@vercel
Copy link

vercel bot commented Mar 9, 2026

@Kallebe23 is attempting to deploy a commit to the Sim Team on Vercel.

A member of the Team first needs to authorize it.

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 3 potential issues.

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

{filteredExecutions.map((workflow, idx) => {
const isSelected = expandedWorkflowId === workflow.workflowId
const isDeletedWorkflow = workflow.workflowName === DELETED_WORKFLOW_LABEL
const isDeletedWorkflow = workflow.workflowName === deletedWorkflow
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Translated string used for data comparison breaks non-English locales

High Severity

workflow.workflowName is server-side data (always the English string "Deleted Workflow"), but it's now compared against deletedWorkflow from useLogTranslations(), which returns a locale-dependent translated string. In any non-English locale, this comparison will never match, causing deleted workflows to not be recognized — they'll get the wrong color, won't be marked non-clickable (canToggle will be true), and clicking them will attempt to filter/expand a non-existent workflow.

Fix in Cursor Fix in Web

import { TooltipProvider } from '@/app/_shell/providers/tooltip-provider'
import { season } from '@/app/_styles/fonts/season/season'
import { NextIntlClientProvider } from 'next-intl'
import { cookies } from 'next/headers'
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused cookies import in root layout

Low Severity

The cookies import from next/headers was added but is never used anywhere in the file. This is dead code that was likely left over from an earlier iteration of the locale detection logic.

Fix in Cursor Fix in Web

latencySpikePercent?: number
costThresholdDollars?: number
inactivityHours?: number
errorCountThreshold?: number
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

formatAlertConfigLabel accepts t parameter but never uses it

Medium Severity

The formatAlertConfigLabel function was refactored to accept a t translation function parameter, but the function body still returns hardcoded English strings (e.g., "consecutive failures", "failure rate", "No activity"). The t parameter is completely unused, so alert rule labels in the notification UI will always display in English regardless of locale.

Fix in Cursor Fix in Web

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants