fix(i18n): localize hardcoded UI surfaces#9069
Conversation
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 Walkthrough📝 Walkthrough✨ Finishing Touches🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e16877a88b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| <InputView | ||
| label={t("localized_ui.editor.url")} | ||
| placeholder={t("localized_ui.editor.enter_or_paste_url")} | ||
| value={localUrl} | ||
| onChange={setLocalUrl} | ||
| /> |
There was a problem hiding this comment.
Restore initial focus to the link URL field
The link popover no longer focuses the URL input when it opens, because the autoFocus path was removed and there is no replacement focus logic. In keyboard-driven flows (e.g., selecting text and opening the link editor), users now keep focus in the editor and their next keystrokes can modify document content instead of the URL field, while Enter handling in the popover may not trigger until the user manually clicks into it.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 18
🧹 Nitpick comments (1)
apps/space/components/account/auth-forms/password.tsx (1)
84-91: ⚡ Quick winSimplify the double negation for better readability.
The logic is correct but uses double negation (
!(...)) which makes it harder to understand. Consider rewriting to express disabled states directly:♻️ Suggested refactor for clarity
const isButtonDisabled = useMemo( () => - !( - !isSubmitting && - !!passwordFormData.password && - (mode === EAuthModes.SIGN_UP - ? getPasswordStrength(passwordFormData.password) === E_PASSWORD_STRENGTH.STRENGTH_VALID && - passwordFormData.password === passwordFormData.confirm_password - : true) - ), + isSubmitting || + !passwordFormData.password || + (mode === EAuthModes.SIGN_UP && + (getPasswordStrength(passwordFormData.password) !== E_PASSWORD_STRENGTH.STRENGTH_VALID || + passwordFormData.password !== passwordFormData.confirm_password)), [isSubmitting, mode, passwordFormData.confirm_password, passwordFormData.password] );🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/space/components/account/auth-forms/password.tsx` around lines 84 - 91, The current expression uses an outer negation around a complex condition; replace it with a direct disabled boolean by removing the leading ! and flipping internal logic: compute disabled as isSubmitting OR missing password OR (when mode === EAuthModes.SIGN_UP, the password strength is not E_PASSWORD_STRENGTH.STRENGTH_VALID OR passwordFormData.password !== passwordFormData.confirm_password); reference the variables isSubmitting, passwordFormData, mode, EAuthModes.SIGN_UP, getPasswordStrength and E_PASSWORD_STRENGTH.STRENGTH_VALID to locate and update the condition.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/core/components/onboarding/steps/workspace/join-invites.tsx`:
- Line 57: The submit guard currently uses && and should return early when there
are no invitations or when the selected invitation has no role; change the
condition in the submit handler from using && to || so that if
invitationsRespond.length <= 0 || !selectedInvitation?.role the function returns
immediately (look for the line referencing invitationsRespond and
selectedInvitation?.role in join-invites.tsx).
In `@packages/editor/src/core/components/links/link-edit-view.tsx`:
- Line 142: The element in LinkEditView
(packages/editor/src/core/components/links/link-edit-view.tsx) currently has
role="presentation" but is keyboard-focusable (tabIndex={0}), has onKeyDown, and
contains inputs/buttons; remove the role="presentation" attribute from that
container so it retains its semantic accessibility, or replace it with an
appropriate role (e.g., role="dialog") and add a matching aria-label/translation
key (e.g., localized_ui.editor.edit_link) to provide screen-reader context;
ensure the container keeps its existing tabIndex and keyboard handlers after the
change.
In `@packages/i18n/src/locales/cs/translations.ts`:
- Around line 2660-2741: The localized_ui block (keys localized_ui.editor,
localized_ui.workspace_invitation, localized_ui.space_auth,
localized_ui.onboarding) contains English strings and must be translated into
Czech; update each value under these objects in
packages/i18n/src/locales/cs/translations.ts with proper Czech translations
(match the same keys exactly), using the existing cs file style and other locale
files (e.g., en) as reference to ensure placeholders like {workspaceName} and
{seconds}s are preserved.
In `@packages/i18n/src/locales/de/translations.ts`:
- Around line 2690-2771: The localized_ui block in the de translations (keys:
localized_ui.editor, localized_ui.workspace_invitation, localized_ui.space_auth,
localized_ui.onboarding) still contains English strings; replace those English
values with their proper German translations (preserving interpolation tokens
like {workspaceName} and {seconds}s exactly), matching the semantics from the
source/en locale, and ensure no keys are removed or renamed; after translating,
run the i18n validation/linting to catch formatting or missing-key issues.
In `@packages/i18n/src/locales/es/translations.ts`:
- Around line 2773-2777: The two remaining English onboarding strings should be
translated to Spanish: replace the value for the set_password key with a Spanish
phrase like "Establecer una contraseña" (or "Crear una contraseña") and replace
the value for the continue key with "Continuar" in the translations object so
the es locale is fully localized; update the entries for set_password and
continue in the translations.ts file accordingly.
In `@packages/i18n/src/locales/id/translations.ts`:
- Around line 2696-2777: The localized_ui block currently contains English text;
replace all English strings in localized_ui.editor,
localized_ui.workspace_invitation, localized_ui.space_auth, and
localized_ui.onboarding with their appropriate Indonesian translations (preserve
interpolation tokens like {workspaceName} and {seconds}s), ensuring keys such as
url, enter_or_paste_url, invited_to_workspace, accept, email_invalid,
passwords_dont_match, create_profile_title, name_required, continue,
invite_team_title, and related keys are translated consistently with the rest of
the file and maintain existing punctuation and placeholders.
In `@packages/i18n/src/locales/it/translations.ts`:
- Around line 2706-2787: The localized_ui block contains English strings (keys:
localized_ui.editor, localized_ui.workspace_invitation, localized_ui.space_auth,
localized_ui.onboarding) that must be replaced with Italian translations; update
each value to its Italian equivalent (e.g., "Enter or paste URL" -> "Inserisci o
incolla l'URL", "Invitation not found" -> "Invito non trovato", "Email is
invalid" -> "Email non valida", "Create your profile." -> "Crea il tuo
profilo.", etc.) across the localized_ui object so all UI flows (editor,
invitation, auth, onboarding) present Italian text; keep keys unchanged and
preserve interpolation tokens like {workspaceName} and {seconds}s.
In `@packages/i18n/src/locales/ja/translations.ts`:
- Around line 2684-2765: The localized_ui block (keys: localized_ui, editor,
workspace_invitation, space_auth, onboarding) currently contains English copy
and must be replaced with proper Japanese translations; update each string value
under those keys to Japanese (or wire them to existing ja translation helpers)
so auth/onboarding/invitation/editor flows show Japanese text, ensuring
placeholders like {workspaceName} and {seconds} are preserved exactly.
In `@packages/i18n/src/locales/ko/translations.ts`:
- Around line 2670-2751: The localized_ui block is still in English; translate
all string values under localized_ui (specifically the editor,
workspace_invitation, space_auth, and onboarding objects) into Korean so the
Korean locale renders correctly; update each property (e.g.,
localized_ui.editor.url, localized_ui.workspace_invitation.invited_to_workspace,
localized_ui.space_auth.email_invalid,
localized_ui.onboarding.create_profile_title, etc.) with appropriate Korean
text, keeping any interpolation tokens like {workspaceName} or {seconds}s intact
and preserving keys and punctuation.
In `@packages/i18n/src/locales/pl/translations.ts`:
- Around line 2663-2744: The localized_ui block contains English strings instead
of Polish; update all values under localized_ui (specifically in the editor,
workspace_invitation, space_auth, and onboarding objects) to Polish translations
consistent with the rest of the file (e.g., change editor.url to "Adres URL",
editor.enter_or_paste_url to "Wprowadź lub wklej adres URL", editor.remove_link
to "Usuń link", and similarly translate every English value in
workspace_invitation, space_auth, and onboarding) so the file provides Polish
text for the keys in localized_ui.
In `@packages/i18n/src/locales/pt-BR/translations.ts`:
- Around line 2708-2789: The localized_ui block contains English strings instead
of Portuguese; update all values under localized_ui.editor,
localized_ui.workspace_invitation, localized_ui.space_auth, and
localized_ui.onboarding to Brazilian Portuguese equivalents (e.g.,
enter_or_paste_url => "Digite ou cole o URL", remove_link => "Remover link",
invited_to_workspace => "Você foi convidado para {workspaceName}", email_invalid
=> "E-mail inválido", create_profile_title => "Crie seu perfil.", etc.) ensuring
grammar and placeholders ({workspaceName}, {seconds}s) are preserved and
consistent with the surrounding pt-BR translations.
In `@packages/i18n/src/locales/ro/translations.ts`:
- Around line 2701-2782: The localized_ui block contains English strings that
must be translated to Romanian; replace each English value under
localized_ui.editor (e.g., localized_ui.editor.url,
localized_ui.editor.enter_or_paste_url,
localized_ui.editor.enter_text_to_display, localized_ui.editor.remove_link),
localized_ui.workspace_invitation (all keys like invitation_not_found,
invited_to_workspace, description, accept, ignore, already_member,
continue_to_home, inactive_title, empty_project_link, sign_in_to_continue,
star_on_github, join_community), localized_ui.space_auth (keys like email,
email_invalid, clear_email, password, set_password, enter_password,
confirm_password, passwords_dont_match, continue, go_to_workspace,
sign_in_with_unique_code, create_account, unique_code, paste_code_sent,
resend_in, requesting_new_code, resend, sending_code) and
localized_ui.onboarding (keys like create_profile_title,
create_profile_description, change_image, upload_image, name, name_required,
name_within_50, enter_full_name, set_password, optional, passwords_do_not_match,
passwords_match, continue, invite_team_title, invite_team_description,
invalid_email, success, invitations_sent, error, add_another, do_later,
join_invites_title, unified_description, create_new_workspace,
no_invitations_found, you_are_invited, accept_invites, continue_to_workspace,
or, create_own_workspace, workspace_creation_disabled, create_workspace_title,
enter_workspace_name, join_existing_workspace) with accurate Romanian
translations preserving interpolation placeholders like {workspaceName} and
{seconds}s and matching existing style/punctuation used elsewhere in the
translations file.
In `@packages/i18n/src/locales/ru/translations.ts`:
- Around line 2922-3003: The localized_ui block was left in English; translate
all strings under localized_ui (keys: editor, workspace_invitation, space_auth,
onboarding) into Russian (Cyrillic) to match the rest of the file; update values
for editor.url, editor.enter_or_paste_url, editor.text,
editor.enter_text_to_display, editor.remove_link and every key inside
workspace_invitation, space_auth, and onboarding with proper Russian phrases
(e.g., "URL-адрес" for url) while preserving the same keys and interpolation
tokens like {workspaceName} and {seconds}s.
In `@packages/i18n/src/locales/sk/translations.ts`:
- Around line 2661-2742: The localized_ui block in the sk translations is still
in English; replace the English strings under localized_ui (including nested
keys editor, workspace_invitation, space_auth, onboarding, etc.) with their
Slovak translations so the sk locale is fully localized; update each value for
keys like editor.url, editor.enter_or_paste_url,
workspace_invitation.invited_to_workspace, space_auth.email,
space_auth.password, onboarding.create_profile_title,
onboarding.invite_team_title, etc., ensuring placeholders like {workspaceName}
and {seconds} and pluralization remain intact.
In `@packages/i18n/src/locales/tr-TR/translations.ts`:
- Around line 2672-2753: The tr-TR translations under the new localized_ui block
(keys: localized_ui.editor, localized_ui.workspace_invitation,
localized_ui.space_auth, localized_ui.onboarding) are still English; replace
each English string with the correct Turkish translation while preserving
interpolation tokens (e.g., {workspaceName}, {seconds}s) and
punctuation/formatting; update every value in those nested objects so the UI
surfaces are fully localized in Turkish and run the locale linter/validation
after changes.
In `@packages/i18n/src/locales/ua/translations.ts`:
- Around line 2914-2995: The new Ukrainian locale adds an English-filled object
localized_ui (keys: editor, workspace_invitation, space_auth, onboarding) which
causes mixed-language UI; replace the English strings with proper Ukrainian
translations for every key under localized_ui (e.g., localized_ui.editor.url,
localized_ui.workspace_invitation.invited_to_workspace,
localized_ui.space_auth.email_invalid,
localized_ui.onboarding.create_profile_title, etc.), ensuring placeholders like
{workspaceName} and {seconds} are preserved and that pluralization/grammar
matches Ukrainian where needed, then run locale linting/tests to verify no
missing keys or format issues.
In `@packages/i18n/src/locales/vi-VN/translations.ts`:
- Around line 2695-2776: The new localized_ui namespace in the vi-VN
translations currently contains English placeholders; replace all English
strings under localized_ui (including nested keys editor, workspace_invitation,
space_auth, onboarding and their properties like enter_or_paste_url,
invited_to_workspace, email_invalid, create_profile_title, etc.) with proper
Vietnamese translations so the onboarding/auth/workspace-invitation flows show
Vietnamese text; ensure placeholders like {workspaceName} and {seconds} are
preserved and validate pluralization/grammar matches existing keys.
In `@packages/i18n/src/locales/zh-TW/translations.ts`:
- Line 2661: The zh-TW translations file contains Simplified Chinese characters
in the localized_ui section (e.g., key already_member and many keys around the
team invitation/onboarding blocks); update all Simplified forms to their
Traditional Chinese equivalents (examples: 经→經, 继续→繼續, 码/登录→碼/登入, 创建账号→創建帳號,
后/发送→後/發送, 请求/验证码→請求/驗證碼, 这/显示给/信息→這/顯示給/資訊, 必须/个/字符/以内→必須/個/字元/以內, 输入→輸入,
错误/队友/协作→錯誤/隊友/協作). Search within
packages/i18n/src/locales/zh-TW/translations.ts for the localized_ui block and
the listed keys (already_member and surrounding onboarding/invite keys) and
replace Simplified characters with the Traditional counterparts consistently
across all affected strings.
---
Nitpick comments:
In `@apps/space/components/account/auth-forms/password.tsx`:
- Around line 84-91: The current expression uses an outer negation around a
complex condition; replace it with a direct disabled boolean by removing the
leading ! and flipping internal logic: compute disabled as isSubmitting OR
missing password OR (when mode === EAuthModes.SIGN_UP, the password strength is
not E_PASSWORD_STRENGTH.STRENGTH_VALID OR passwordFormData.password !==
passwordFormData.confirm_password); reference the variables isSubmitting,
passwordFormData, mode, EAuthModes.SIGN_UP, getPasswordStrength and
E_PASSWORD_STRENGTH.STRENGTH_VALID to locate and update the condition.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: b6208dca-6a44-4e8a-8e65-18bcb8c57d63
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (33)
apps/space/components/account/auth-forms/email.tsxapps/space/components/account/auth-forms/password.tsxapps/space/components/account/auth-forms/unique-code.tsxapps/web/app/(all)/workspace-invitations/page.tsxapps/web/core/components/onboarding/invitations.tsxapps/web/core/components/onboarding/invite-members.tsxapps/web/core/components/onboarding/steps/profile/root.tsxapps/web/core/components/onboarding/steps/profile/set-password.tsxapps/web/core/components/onboarding/steps/team/root.tsxapps/web/core/components/onboarding/steps/usecase/root.tsxapps/web/core/components/onboarding/steps/workspace/create.tsxapps/web/core/components/onboarding/steps/workspace/join-invites.tsxpackages/editor/package.jsonpackages/editor/src/core/components/links/link-edit-view.tsxpackages/i18n/src/locales/cs/translations.tspackages/i18n/src/locales/de/translations.tspackages/i18n/src/locales/en/translations.tspackages/i18n/src/locales/es/translations.tspackages/i18n/src/locales/fr/translations.tspackages/i18n/src/locales/id/translations.tspackages/i18n/src/locales/it/translations.tspackages/i18n/src/locales/ja/translations.tspackages/i18n/src/locales/ko/translations.tspackages/i18n/src/locales/pl/translations.tspackages/i18n/src/locales/pt-BR/translations.tspackages/i18n/src/locales/ro/translations.tspackages/i18n/src/locales/ru/translations.tspackages/i18n/src/locales/sk/translations.tspackages/i18n/src/locales/tr-TR/translations.tspackages/i18n/src/locales/ua/translations.tspackages/i18n/src/locales/vi-VN/translations.tspackages/i18n/src/locales/zh-CN/translations.tspackages/i18n/src/locales/zh-TW/translations.ts
Co-authored-by: Codex <noreply@openai.com>
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/i18n/src/locales/pl/translations.ts`:
- Around line 2677-2721: The Polish translations use infinitive forms and some
incorrect phrasing for CTAs; update the keys accept, ignore, continue_to_home,
and other action labels (space_auth.continue, space_auth.continue_to_home,
onboarding.continue, and similar) to imperative Polish forms (e.g.,
"Zaakceptuj", "Ignoruj", "Przejdź do strony głównej" or "Przejdź do domu",
"Kontynuuj") and correct mistranslations like "Jedź dalej do domu" to a natural
imperative; scan nearby action labels in the same file section (space_auth and
onboarding) and replace any other infinitives (e.g., "Kontynuować", "Prześlij"
vs "Prześlij" — ensure consistent imperative) so all button-like strings use
concise imperative phrasing.
- Around line 2676-2743: The locale mixes "obszar roboczy" and "przestrzeń
robocza"; update the Polish translations that use "obszar roboczy" to the
consistent term "przestrzeń robocza" (e.g., change values for keys like
go_to_workspace, join_invites_title, create_new_workspace,
continue_to_workspace, enter_workspace_name, join_existing_workspace,
workspace_creation_disabled, create_workspace_title, already_member and any
surrounding phrases such as the top descriptive string) so all localized_ui
entries use "przestrzeń robocza" consistently while preserving surrounding
punctuation and interpolation placeholders (like {workspaceName}).
In `@packages/i18n/src/locales/zh-TW/translations.ts`:
- Line 2685: The translation for the key resend_in uses a non‑localized
"{seconds}s" token; update the value for resend_in to use a localized countdown
phrase that places the {seconds} placeholder in natural Chinese (Traditional)
wording (e.g., include a full-width or localized "秒" with appropriate
spacing/particles such as "在 {seconds} 秒後重新傳送" or "在 {seconds} 秒內重新傳送") so it
matches the locale’s existing style and grammar; update the translations.ts
entry for resend_in accordingly and ensure the placeholder remains "{seconds}"
so existing interpolation logic continues to work.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 7c66f6c9-feba-4575-bc28-8b040cdd4a0f
📒 Files selected for processing (22)
apps/space/components/account/auth-forms/password.tsxapps/web/core/components/onboarding/steps/workspace/join-invites.tsxpackages/editor/src/core/components/links/link-edit-view.tsxpackages/i18n/src/locales/cs/translations.tspackages/i18n/src/locales/de/translations.tspackages/i18n/src/locales/en/translations.tspackages/i18n/src/locales/es/translations.tspackages/i18n/src/locales/fr/translations.tspackages/i18n/src/locales/id/translations.tspackages/i18n/src/locales/it/translations.tspackages/i18n/src/locales/ja/translations.tspackages/i18n/src/locales/ko/translations.tspackages/i18n/src/locales/pl/translations.tspackages/i18n/src/locales/pt-BR/translations.tspackages/i18n/src/locales/ro/translations.tspackages/i18n/src/locales/ru/translations.tspackages/i18n/src/locales/sk/translations.tspackages/i18n/src/locales/tr-TR/translations.tspackages/i18n/src/locales/ua/translations.tspackages/i18n/src/locales/vi-VN/translations.tspackages/i18n/src/locales/zh-CN/translations.tspackages/i18n/src/locales/zh-TW/translations.ts
✅ Files skipped from review due to trivial changes (5)
- packages/i18n/src/locales/es/translations.ts
- packages/i18n/src/locales/en/translations.ts
- packages/i18n/src/locales/ro/translations.ts
- packages/i18n/src/locales/it/translations.ts
- packages/i18n/src/locales/zh-CN/translations.ts
🚧 Files skipped from review as they are similar to previous changes (14)
- packages/i18n/src/locales/ko/translations.ts
- packages/i18n/src/locales/ua/translations.ts
- packages/i18n/src/locales/fr/translations.ts
- packages/i18n/src/locales/ru/translations.ts
- packages/i18n/src/locales/id/translations.ts
- packages/editor/src/core/components/links/link-edit-view.tsx
- packages/i18n/src/locales/tr-TR/translations.ts
- packages/i18n/src/locales/cs/translations.ts
- packages/i18n/src/locales/vi-VN/translations.ts
- packages/i18n/src/locales/sk/translations.ts
- apps/web/core/components/onboarding/steps/workspace/join-invites.tsx
- packages/i18n/src/locales/de/translations.ts
- apps/space/components/account/auth-forms/password.tsx
- packages/i18n/src/locales/ja/translations.ts
| "Twój obszar roboczy to miejsce, w którym będziesz tworzyć projekty, współpracować nad elementami pracy i organizować różne strumienie pracy na swoim koncie Plane.", | ||
| accept: "Przyjąć", | ||
| ignore: "Ignorować", | ||
| already_member: "Jesteś już członkiem {workspaceName}", | ||
| continue_to_home: "Jedź dalej do domu", | ||
| inactive_title: "Ten link z zaproszeniem nie jest już aktywny.", | ||
| empty_project_link: "Lub zacznij od pustego projektu", | ||
| sign_in_to_continue: "Zaloguj się, aby kontynuować", | ||
| star_on_github: "Oznacz nas na GitHub", | ||
| join_community: "Dołącz do naszej społeczności aktywnych twórców", | ||
| }, | ||
| space_auth: { | ||
| email: "E-mail", | ||
| email_invalid: "Adres e-mail jest nieprawidłowy", | ||
| clear_email: "Wyczyść e-mail", | ||
| password: "Hasło", | ||
| set_password: "Ustaw hasło", | ||
| enter_password: "Wprowadź hasło", | ||
| confirm_password: "Potwierdź hasło", | ||
| passwords_dont_match: "Hasła nie pasują", | ||
| continue: "Kontynuować", | ||
| go_to_workspace: "Przejdź do obszaru roboczego", | ||
| sign_in_with_unique_code: "Zaloguj się za pomocą unikalnego kodu", | ||
| create_account: "Utwórz konto", | ||
| unique_code: "Unikalny kod", | ||
| paste_code_sent: "Wklej kod przesłany na Twój adres e-mail", | ||
| resend_in: "Wyślij ponownie za {seconds}s", | ||
| requesting_new_code: "Prośba o nowy kod", | ||
| resend: "Wyślij ponownie", | ||
| sending_code: "Wysyłanie kodu", | ||
| }, | ||
| onboarding: { | ||
| create_profile_title: "Utwórz swój profil.", | ||
| create_profile_description: "Tak będziesz wyglądać w Plane.", | ||
| change_image: "Zmień obraz", | ||
| upload_image: "Prześlij obraz", | ||
| name: "Nazwa", | ||
| name_required: "Imię i nazwisko jest wymagane", | ||
| name_within_50: "Nazwa musi zawierać maksymalnie 50 znaków.", | ||
| enter_full_name: "Wpisz swoje pełne imię i nazwisko", | ||
| set_password: "Ustaw hasło", | ||
| optional: "Fakultatywny", | ||
| passwords_do_not_match: "Hasła nie pasują", | ||
| passwords_match: "Hasła się zgadzają", | ||
| continue: "Kontynuować", | ||
| invite_team_title: "Zaproś swoich kolegów z drużyny", | ||
| invite_team_description: | ||
| "Praca w Plane najlepiej przebiega z Twoim zespołem. Zaproś ich teraz, aby wykorzystali cały potencjał Plane.", | ||
| invalid_email: "To nie wygląda na adres e-mail.", | ||
| success: "Sukces!", | ||
| invitations_sent: "Zaproszenia wysłane pomyślnie.", | ||
| error: "Błąd!", | ||
| add_another: "Dodaj kolejny", | ||
| do_later: "Zrobię to później", | ||
| join_invites_title: "Dołącz do zaproszeń lub utwórz obszar roboczy", | ||
| unified_description: "Cała Twoja praca — ujednolicona.", | ||
| create_new_workspace: "Utwórz nowy obszar roboczy", | ||
| no_invitations_found: "Nie znaleziono zaproszeń", | ||
| you_are_invited: "Zapraszamy!", | ||
| accept_invites: "Zaakceptuj zaproszenia do współpracy ze swoim zespołem.", | ||
| continue_to_workspace: "Przejdź do obszaru roboczego", | ||
| or: "Lub", | ||
| create_own_workspace: "Stwórz własną przestrzeń do pracy", | ||
| workspace_creation_disabled: | ||
| "Wygląda na to, że nie masz żadnych zaproszeń do obszaru roboczego, a administrator Twojej instancji ograniczył tworzenie nowych obszarów roboczych. Poproś właściciela lub administratora obszaru roboczego, aby najpierw zaprosił Cię do obszaru roboczego, a następnie wróć do tego ekranu, aby dołączyć.", | ||
| create_workspace_title: "Stwórz swoje miejsce do pracy", | ||
| enter_workspace_name: "Wprowadź nazwę obszaru roboczego", | ||
| join_existing_workspace: "Dołącz do istniejącego obszaru roboczego", |
There was a problem hiding this comment.
Standardize “workspace” term to przestrzeń robocza across localized_ui.
New strings mix obszar roboczy with the rest of this locale, which already consistently uses przestrzeń robocza. This will feel inconsistent in UI copy (e.g., go_to_workspace, join_invites_title, create_new_workspace, continue_to_workspace, enter_workspace_name, join_existing_workspace).
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/i18n/src/locales/pl/translations.ts` around lines 2676 - 2743, The
locale mixes "obszar roboczy" and "przestrzeń robocza"; update the Polish
translations that use "obszar roboczy" to the consistent term "przestrzeń
robocza" (e.g., change values for keys like go_to_workspace, join_invites_title,
create_new_workspace, continue_to_workspace, enter_workspace_name,
join_existing_workspace, workspace_creation_disabled, create_workspace_title,
already_member and any surrounding phrases such as the top descriptive string)
so all localized_ui entries use "przestrzeń robocza" consistently while
preserving surrounding punctuation and interpolation placeholders (like
{workspaceName}).
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bc78612a6a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| title={t("localized_ui.onboarding.usecase_title")} | ||
| description={t("localized_ui.onboarding.usecase_description")} |
There was a problem hiding this comment.
Add missing localized_ui keys used by use-case onboarding
This step now calls translation keys like localized_ui.onboarding.usecase_title, usecase_description, select_one_or_more, select_at_least_one, skip, profile_setup_completed, and profile_setup_failed, but those keys are not defined in the locale dictionaries (including packages/i18n/src/locales/en/translations.ts). As a result, users will see raw key strings instead of readable copy in the onboarding UI and toast/validation messages. Please add these keys to the localized_ui.onboarding section across locales (or switch these calls to existing keys).
Useful? React with 👍 / 👎.
…ex <noreply@openai.com>
There was a problem hiding this comment.
Actionable comments posted: 17
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
apps/space/components/issues/issue-layouts/properties/labels.tsx (1)
68-72:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winComplete the localization for the multi-label case.
Lines 68 and 71 still contain hardcoded English text that should be localized for consistency with the rest of this PR. The tooltip heading "Labels" and the label count display need translation keys.
🌐 Proposed fix to localize remaining strings
- <div - className={`cursor-not-allowed" flex h-full flex-shrink-0 items-center rounded-sm border-[0.5px] border-strong px-2.5 py-1 text-11`} - > - <Tooltip position="top" tooltipHeading="Labels" tooltipContent={labelsString}> + <div className="flex h-full flex-shrink-0 items-center rounded-sm border-[0.5px] border-strong px-2.5 py-1 text-11"> + <Tooltip position="top" tooltipHeading={t("labels")} tooltipContent={labelsString}> <div className="flex h-full items-center gap-1.5 text-secondary"> <span className="h-2 w-2 flex-shrink-0 rounded-full bg-accent-primary" /> - {`${labels.length} Labels`} + {t("localized_ui.space_public.label_count", { count: labels.length })} </div> </Tooltip> </div>Note: You'll need to add the
label_countkey to your locale files (e.g.,"{{count}} Labels"in English).🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/space/components/issues/issue-layouts/properties/labels.tsx` around lines 68 - 72, The Tooltip heading "Labels" and the hardcoded `${labels.length} Labels` string must be localized: replace the literal "Labels" passed to Tooltip's tooltipHeading and the label count display (currently using labelsString and `${labels.length} Labels`) with i18n lookups (e.g., use the translation key "label_count" with the count interpolation) so the Tooltip and count use the locale-aware text; update references around Tooltip, tooltipHeading, labelsString and the place rendering `${labels.length} Labels` to call the translation function (and ensure you add the "label_count" key to locale files).apps/web/core/components/inbox/content/inbox-issue-mobile-header.tsx (1)
179-185:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winAlign duplicate-permission translation key with desktop header.
This mobile action uses
localized_ui.inbox.errors.mark_duplicate_permission_plural, while the desktop header useslocalized_ui.inbox.errors.mark_duplicate_permissionfor the same workflow. Please standardize to one key to avoid missing/fallback translations across surfaces.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/core/components/inbox/content/inbox-issue-mobile-header.tsx` around lines 179 - 185, The mobile header uses the plural translation key but should match the desktop header; update the t(...) call inside the CustomMenu.MenuItem onClick (where handleActionWithPermission is invoked and setSelectDuplicateIssue is used) to use "localized_ui.inbox.errors.mark_duplicate_permission" instead of "localized_ui.inbox.errors.mark_duplicate_permission_plural" so both surfaces reference the same translation key.apps/web/core/components/inbox/sidebar/root.tsx (1)
90-117:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winExpose the selected tab state on tab buttons.
The switch to
<button>is good, but screen readers still can’t detect which tab is active.Proposed fix
<button type="button" key={option?.key} + aria-pressed={currentTab === option?.key} className={cn( `relative flex h-full cursor-pointer items-center gap-1 px-3 text-13 font-medium transition-all`, currentTab === option?.key ? `text-accent-primary` : `hover:text-secondary` )}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/core/components/inbox/sidebar/root.tsx` around lines 90 - 117, The tab buttons are not exposing selection to assistive tech; update the button (the element using currentTab and option?.key that calls handleCurrentTab) to act as an accessible tab by adding role="tab", aria-selected={currentTab === option?.key}, and a tabIndex of 0 when selected and -1 when not (so keyboard focus follows selection), and add an aria-controls attribute pointing to the corresponding panel id (e.g. `intake-tab-${option?.key}`) so screen readers can associate the tab with its panel; keep the existing onClick logic (handleCurrentTab and router.push) unchanged and ensure corresponding panels use matching id values.
🧹 Nitpick comments (3)
packages/i18n/src/locales/ja/translations.ts (1)
2688-2751: 🏗️ Heavy liftPolish the Japanese copy to match standard UI terminology.
Several labels read as literal translations rather than natural JP UI terms (e.g., Line 2688, Line 2730, Line 2750, Line 2767). Please normalize these to the same glossary style already used in this locale so editor/auth/onboarding actions feel consistent.
Also applies to: 2767-2768
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/ja/translations.ts` around lines 2688 - 2751, The Japanese strings in this translations object use literal translations and should be normalized to the project's standard UI glossary: update keys such as text, menu_items.text, menu_items.h3 (and other menu_items entries like divider, bold, italic), and standalone labels like clear_contents, view_in_full_screen, view_image_in_full_screen to use natural JP UI terms (e.g., "テキスト" for text, "見出し3" -> "見出し 3" or the project's established heading style, "区切り" or the repo's chosen term for divider, "太字" for bold, "斜体" for italic, "全画面表示" for full screen, "内容をクリア" for clear contents, etc.). Replace each literal phrase to match the existing locale glossary elsewhere in this file (follow surrounding translations for wording/spacing conventions) so editor/menu/onboarding labels are consistent.apps/space/components/issues/peek-overview/issue-properties.tsx (1)
51-61: ⚡ Quick winHandle clipboard write failures explicitly.
copyTextToClipboard(...).then(...)has no rejection path. If clipboard access fails, this can produce an unhandled promise rejection and no user feedback/logging.Proposed refactor
- const handleCopyLink = () => { + const handleCopyLink = async () => { const urlToCopy = window.location.href; - - copyTextToClipboard(urlToCopy).then(() => { + try { + await copyTextToClipboard(urlToCopy); setToast({ type: TOAST_TYPE.INFO, title: t("localized_ui.space_public.link_copied"), message: t("localized_ui.space_public.work_item_link_copied"), }); - return undefined; - }); + } catch (error) { + console.error("Failed to copy issue link:", error); + } };As per coding guidelines "Use try-catch with proper error types and log errors appropriately for error handling".
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/space/components/issues/peek-overview/issue-properties.tsx` around lines 51 - 61, The handleCopyLink function currently calls copyTextToClipboard(urlToCopy).then(...) with no rejection handling; update handleCopyLink to handle clipboard write failures by using a try/catch (or adding a .catch) around copyTextToClipboard so any errors are caught, log the error (using the same logger/context) and call setToast with an error type (TOAST_TYPE.ERROR) and an appropriate localized title/message to inform the user of the failure; ensure you reference handleCopyLink and copyTextToClipboard and preserve the existing success toast behavior.apps/web/core/components/inbox/modals/create-modal/issue-description.tsx (1)
119-120: ⚡ Quick winPreserve the original duplication error as
causefor parity with upload flow.Right now the duplicate path drops root-cause context.
Proposed fix
- } catch { - throw new Error(t("localized_ui.inbox.errors.asset_duplication_failed")); + } catch (error) { + throw new Error(t("localized_ui.inbox.errors.asset_duplication_failed"), { cause: error }); }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web/core/components/inbox/modals/create-modal/issue-description.tsx` around lines 119 - 120, In the catch block inside issue-description.tsx where you currently do `catch { throw new Error(t("localized_ui.inbox.errors.asset_duplication_failed")) }`, preserve the original caught error as the cause so the root-cause context isn't lost (matching the upload flow). Change the catch to capture the error (e.g., `catch (err)`) and rethrow using the Error constructor with the cause option (`new Error(..., { cause: err })`) so downstream logging and debugging can access the original error.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/core/components/inbox/content/inbox-issue-header.tsx`:
- Around line 160-164: The delete handler handleInboxIssueDelete currently
awaits deleteInboxIssue(...) with no error handling; wrap the await call in a
try/catch, log the error and surface a user-facing failure (e.g., show a toast
or set an error state) so the UI doesn't silently fail, and only call
router.push(...) when the delete succeeds (preserve the isNotificationEmbed
check). Ensure you reference deleteInboxIssue and router.push and keep existing
guards (inboxIssue, currentInboxIssueId) intact.
In `@apps/web/core/components/inbox/inbox-filter/applied-filters/date.tsx`:
- Around line 75-93: The two icon-only buttons inside the Tag component (the
per-option remove button that calls handleInboxIssueFilters(filterKey,
handleFilterValue(optionDetail?.value)) and the final clear button that calls
clearFilter) lack accessible names; add accessible labels by providing either an
aria-label or aria-labelledby on both buttons that describe their actions (e.g.,
"Remove {optionDetail.label}" or "Clear filters") so screen readers announce
meaningful text; keep the CloseIcon visual unchanged and ensure the labels use
optionDetail (or filterKey) to make the per-item label specific.
In `@apps/web/core/components/inbox/inbox-filter/applied-filters/label.tsx`:
- Around line 46-63: The icon-only remove and clear buttons in the label filter
need accessible names so screen readers can identify them; update the two button
elements that call handleInboxIssueFilters("labels", handleFilterValue(value))
and clearFilter to include descriptive accessible labels (e.g., aria-label or
aria-labelledby or include visually hidden text) like "Remove label {value}" for
the per-label button and "Clear all labels" for the clear button, ensuring the
label references the current value for the per-item button and that CloseIcon
remains purely presentational (aria-hidden if needed).
In `@apps/web/core/components/inbox/inbox-filter/applied-filters/state.tsx`:
- Around line 43-60: Add accessible names to the icon-only buttons by adding
aria-label attributes: for the per-option remove button that calls
handleInboxIssueFilters("state", handleFilterValue(optionDetail?.id)) add an
aria-label like `Remove ${optionDetail?.label || optionDetail?.id} filter`
(reference: optionDetail, handleInboxIssueFilters, handleFilterValue,
CloseIcon), and for the global clear button that calls clearFilter add an
aria-label such as `Clear state filters` (reference: clearFilter, CloseIcon);
ensure the labels are descriptive and use optionDetail properties when available
so screen readers get a meaningful name.
In `@apps/web/core/components/inbox/inbox-filter/applied-filters/status.tsx`:
- Around line 43-49: The status remove button is an icon-only control lacking an
accessible name; update the button element that calls
handleInboxIssueFilters("status", handleFilterValue(optionDetail?.status)) to
include a localized aria-label (e.g., via the app's i18n function or translation
hook) that clearly describes the action like "Remove status filter" and ensure
it uses the current status value if needed for clarity; keep CloseIcon as the
visual but add the aria-label on the button so assistive tech can identify the
action.
In `@apps/web/core/components/inbox/inbox-filter/filters/date.tsx`:
- Around line 76-81: The modal title always uses the created_date translation;
update the FilterHeader title prop to use the passed-in label (or switch on
filterKey) so updated_at filters show the correct heading: replace the hardcoded
t("localized_ui.inbox.filters.created_date") usage with label ||
t("localized_ui.inbox.filters.created_date") (or conditional on filterKey ===
"updated_at" to use the updated translation) when constructing the title in the
FilterHeader component.
In `@apps/web/core/components/inbox/modals/create-modal/create-root.tsx`:
- Around line 162-190: The current single try/catch treats failures in
updateBulkProjectAssetsUploadStatus the same as createInboxIssue failures,
risking duplicate issue creation; split the logic so you first await
createInboxIssue (function createInboxIssue) inside its own try block and handle
success path (router.push/handleModalClose or clearEditor/setFormData, setToast
success) immediately, then if uploadedAssetIds.length > 0 call
fileService.updateBulkProjectAssetsUploadStatus inside a separate try/catch so
asset-sync errors are caught and handled independently (log the error, set a
distinct toast indicating "issue created but assets failed to sync" and preserve
uploadedAssetIds for retry) instead of reverting the overall success flow;
ensure setFormSubmitting(false) still runs after both operations and that
uploadedAssetIds are only cleared on successful asset-sync.
- Around line 235-243: The button wrapping the ToggleSwitch doesn't expose its
on/off state to assistive tech; update the element that toggles (the button
using setCreateMore and createMore) to include an accessible state attribute
such as aria-pressed={createMore} (and an appropriate aria-label or
aria-labelledby if needed), and ensure the ToggleSwitch inner component is inert
to screen readers (e.g., aria-hidden) if the button is the accessible control;
keep the existing onClick that calls setCreateMore(prev => !prev) and preserve
tabIndex from getIndex("create_more").
In `@packages/i18n/src/locales/cs/translations.ts`:
- Around line 2705-2708: The translation for localized_ui.editor.alignment.right
is incorrect ("Právo"); update the value in translations.ts for the alignment
object key right to the correct Czech term "Vpravo" so it reads:
localized_ui.editor.alignment.right = "Vpravo".
- Around line 2855-2857: Replace the incorrect fixed string for
sidebar.label_count with an ICU-style pluralized message that uses Czech plural
categories: map "one" to "štítek", "few" to "štítky", and "other" to "štítků",
and include the count variable in the output so the correct form is chosen for
0,1,2-4,5+ values; update the value of sidebar.label_count accordingly in
packages/i18n/src/locales/cs/translations.ts.
In `@packages/i18n/src/locales/de/translations.ts`:
- Around line 2887-2889: The sidebar.label_count translation currently returns a
fixed string "{count}-Etiketten" which is incorrect for singular; replace it
with an ICU pluralized form so German uses "Etikett" for one and "Etiketten"
otherwise (e.g. use the plural syntax for sidebar.label_count: {count, plural,
one {# Etikett} other {# Etiketten}}) so the translations.ts entry handles
singular vs. plural correctly.
In `@packages/i18n/src/locales/it/translations.ts`:
- Around line 2720-2754: The Italian translation file contains several
mistranslated UI labels that change UX meaning; update the incorrect strings
(e.g., replace alignment.right "Giusto" with "Destra", table "Tavolo" with
"Tabella", continue "Continuare" with the imperative/UX form "Continua", sign_in
"Registrazione" with the correct action "Accedi", select_work_item "Seleziona
oggetto di lavoro" with a clearer "Seleziona elemento di lavoro" or
context-appropriate term, and fix the public_board_not_found message to a
natural Italian sentence) by locating and editing the corresponding keys
(alignment.right, table, continue, sign_in, select_work_item,
public_board_not_found and similar keys in ranges ~2786-2830 and 2902-2931) to
use proper UI verbs/nouns and consistent concise phrasing across
editor/auth/public pages.
In `@packages/i18n/src/locales/ko/translations.ts`:
- Around line 2683-2690: Several editor/command labels in the Korean
translations are mistranslated (e.g., code: "암호", bold: "용감한"); update the
affected keys in the listed ranges to standard Korean UI/editor terms: replace
code -> "코드" (or "코드 블록" where appropriate), bold -> "굵게", italic -> "기울임",
underline -> "밑줄", strikethrough -> "취소선", link -> "링크", duplicate -> "중복 생성"
(or "복제" if you prefer consistency), and any other command keys in the ranges
2705-2710, 2729-2738, 2749-2754, 2769-2771 to their usual Korean UI equivalents
so the labels reflect the correct editor actions (use the existing keys like
code and bold to locate and update the strings).
In `@packages/i18n/src/locales/pt-BR/translations.ts`:
- Around line 2752-2775: Fix incorrect semantic translations in the translations
object: change alignment.right from "Certo" to "Direita", change
menu_items.table from "Mesa" to "Tabela", and change menu_items.bold from
"Audacioso" to "Negrito" so the editor labels reflect standard Portuguese UI
terminology (update the values under alignment.right, menu_items.table, and
menu_items.bold).
In `@packages/i18n/src/locales/ro/translations.ts`:
- Around line 2738-2764: Update the Romanian editor translations to correct
contextual meanings: replace the value for clear_contents in the translations
object (clear_contents) with a proper action phrase such as "Golire conținut"
(or "Golește conținutul"), change alignment.right (currently "Corect") to the
direction "Dreapta", and change menu_items.table (currently "Masă") to "Tabel"
so it denotes an editor table rather than furniture; modify these string values
in the translations.ts file where clear_contents, alignment.right, and
menu_items.table are defined.
In `@packages/i18n/src/locales/ru/translations.ts`:
- Around line 2933-2995: Update incorrect Russian UI labels in the translations:
replace menu_items.link value "Связь" with the noun "Ссылка"; change
alignment.right value "Верно" to the alignment direction "Справа"; change
menu_items.table value "Стол" to the UI term "Таблица"; and change
menu_items.bold value "Смелый" to the text style "Жирный". Locate and edit the
string literals for menu_items.link, alignment.right, menu_items.table, and
menu_items.bold in the translations.ts snippet and update their values
accordingly.
In `@packages/i18n/src/locales/sk/translations.ts`:
- Around line 2698-2733: Replace several incorrect/unidiomatic Slovak
translations in the locale object: change clear_contents from "Prehľadný obsah"
to "Vymazať obsah"; change alignment.right from "Správne" to directional
"Vpravo"; change underline from the imperative "Podčiarknite" to the
adjective/noun "Podčiarknuté"; and normalize casing for code and italic to match
neighboring labels (use "Kód" for code and "Kurzíva" for italic) so all
menu_items entries are consistent. Locate and update the keys clear_contents,
alignment.right, underline, code, and italic in the translations object
accordingly.
---
Outside diff comments:
In `@apps/space/components/issues/issue-layouts/properties/labels.tsx`:
- Around line 68-72: The Tooltip heading "Labels" and the hardcoded
`${labels.length} Labels` string must be localized: replace the literal "Labels"
passed to Tooltip's tooltipHeading and the label count display (currently using
labelsString and `${labels.length} Labels`) with i18n lookups (e.g., use the
translation key "label_count" with the count interpolation) so the Tooltip and
count use the locale-aware text; update references around Tooltip,
tooltipHeading, labelsString and the place rendering `${labels.length} Labels`
to call the translation function (and ensure you add the "label_count" key to
locale files).
In `@apps/web/core/components/inbox/content/inbox-issue-mobile-header.tsx`:
- Around line 179-185: The mobile header uses the plural translation key but
should match the desktop header; update the t(...) call inside the
CustomMenu.MenuItem onClick (where handleActionWithPermission is invoked and
setSelectDuplicateIssue is used) to use
"localized_ui.inbox.errors.mark_duplicate_permission" instead of
"localized_ui.inbox.errors.mark_duplicate_permission_plural" so both surfaces
reference the same translation key.
In `@apps/web/core/components/inbox/sidebar/root.tsx`:
- Around line 90-117: The tab buttons are not exposing selection to assistive
tech; update the button (the element using currentTab and option?.key that calls
handleCurrentTab) to act as an accessible tab by adding role="tab",
aria-selected={currentTab === option?.key}, and a tabIndex of 0 when selected
and -1 when not (so keyboard focus follows selection), and add an aria-controls
attribute pointing to the corresponding panel id (e.g.
`intake-tab-${option?.key}`) so screen readers can associate the tab with its
panel; keep the existing onClick logic (handleCurrentTab and router.push)
unchanged and ensure corresponding panels use matching id values.
---
Nitpick comments:
In `@apps/space/components/issues/peek-overview/issue-properties.tsx`:
- Around line 51-61: The handleCopyLink function currently calls
copyTextToClipboard(urlToCopy).then(...) with no rejection handling; update
handleCopyLink to handle clipboard write failures by using a try/catch (or
adding a .catch) around copyTextToClipboard so any errors are caught, log the
error (using the same logger/context) and call setToast with an error type
(TOAST_TYPE.ERROR) and an appropriate localized title/message to inform the user
of the failure; ensure you reference handleCopyLink and copyTextToClipboard and
preserve the existing success toast behavior.
In `@apps/web/core/components/inbox/modals/create-modal/issue-description.tsx`:
- Around line 119-120: In the catch block inside issue-description.tsx where you
currently do `catch { throw new
Error(t("localized_ui.inbox.errors.asset_duplication_failed")) }`, preserve the
original caught error as the cause so the root-cause context isn't lost
(matching the upload flow). Change the catch to capture the error (e.g., `catch
(err)`) and rethrow using the Error constructor with the cause option (`new
Error(..., { cause: err })`) so downstream logging and debugging can access the
original error.
In `@packages/i18n/src/locales/ja/translations.ts`:
- Around line 2688-2751: The Japanese strings in this translations object use
literal translations and should be normalized to the project's standard UI
glossary: update keys such as text, menu_items.text, menu_items.h3 (and other
menu_items entries like divider, bold, italic), and standalone labels like
clear_contents, view_in_full_screen, view_image_in_full_screen to use natural JP
UI terms (e.g., "テキスト" for text, "見出し3" -> "見出し 3" or the project's established
heading style, "区切り" or the repo's chosen term for divider, "太字" for bold, "斜体"
for italic, "全画面表示" for full screen, "内容をクリア" for clear contents, etc.). Replace
each literal phrase to match the existing locale glossary elsewhere in this file
(follow surrounding translations for wording/spacing conventions) so
editor/menu/onboarding labels are consistent.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 1eddde72-114f-4820-b9d3-b515db9458e7
📒 Files selected for processing (53)
apps/space/components/common/powered-by.tsxapps/space/components/instance/instance-failure-view.tsxapps/space/components/issues/filters/root.tsxapps/space/components/issues/issue-layouts/error.tsxapps/space/components/issues/issue-layouts/issue-layout-HOC.tsxapps/space/components/issues/issue-layouts/properties/labels.tsxapps/space/components/issues/navbar/user-avatar.tsxapps/space/components/issues/peek-overview/comment/add-comment.tsxapps/space/components/issues/peek-overview/issue-activity.tsxapps/space/components/issues/peek-overview/issue-properties.tsxapps/space/components/ui/not-found.tsxapps/web/ce/components/projects/settings/intake/header.tsxapps/web/core/components/inbox/content/inbox-issue-header.tsxapps/web/core/components/inbox/content/inbox-issue-mobile-header.tsxapps/web/core/components/inbox/content/issue-properties.tsxapps/web/core/components/inbox/content/issue-root.tsxapps/web/core/components/inbox/inbox-filter/applied-filters/date.tsxapps/web/core/components/inbox/inbox-filter/applied-filters/label.tsxapps/web/core/components/inbox/inbox-filter/applied-filters/root.tsxapps/web/core/components/inbox/inbox-filter/applied-filters/state.tsxapps/web/core/components/inbox/inbox-filter/applied-filters/status.tsxapps/web/core/components/inbox/inbox-filter/filters/date.tsxapps/web/core/components/inbox/inbox-filter/filters/filter-selection.tsxapps/web/core/components/inbox/inbox-filter/filters/labels.tsxapps/web/core/components/inbox/inbox-filter/filters/members.tsxapps/web/core/components/inbox/inbox-filter/filters/state.tsxapps/web/core/components/inbox/inbox-filter/filters/status.tsxapps/web/core/components/inbox/inbox-filter/root.tsxapps/web/core/components/inbox/modals/create-modal/create-root.tsxapps/web/core/components/inbox/modals/create-modal/issue-description.tsxapps/web/core/components/inbox/modals/create-modal/issue-properties.tsxapps/web/core/components/inbox/modals/select-duplicate.tsxapps/web/core/components/inbox/sidebar/inbox-list-item.tsxapps/web/core/components/inbox/sidebar/root.tsxpackages/i18n/src/locales/cs/translations.tspackages/i18n/src/locales/de/translations.tspackages/i18n/src/locales/en/translations.tspackages/i18n/src/locales/es/translations.tspackages/i18n/src/locales/fr/translations.tspackages/i18n/src/locales/id/translations.tspackages/i18n/src/locales/it/translations.tspackages/i18n/src/locales/ja/translations.tspackages/i18n/src/locales/ko/translations.tspackages/i18n/src/locales/pl/translations.tspackages/i18n/src/locales/pt-BR/translations.tspackages/i18n/src/locales/ro/translations.tspackages/i18n/src/locales/ru/translations.tspackages/i18n/src/locales/sk/translations.tspackages/i18n/src/locales/tr-TR/translations.tspackages/i18n/src/locales/ua/translations.tspackages/i18n/src/locales/vi-VN/translations.tspackages/i18n/src/locales/zh-CN/translations.tspackages/i18n/src/locales/zh-TW/translations.ts
✅ Files skipped from review due to trivial changes (4)
- packages/i18n/src/locales/tr-TR/translations.ts
- packages/i18n/src/locales/vi-VN/translations.ts
- packages/i18n/src/locales/en/translations.ts
- packages/i18n/src/locales/id/translations.ts
🚧 Files skipped from review as they are similar to previous changes (2)
- packages/i18n/src/locales/es/translations.ts
- packages/i18n/src/locales/zh-CN/translations.ts
| const handleInboxIssueDelete = async () => { | ||
| if (!inboxIssue || !currentInboxIssueId) return; | ||
| await deleteInboxIssue(workspaceSlug, projectId, currentInboxIssueId).then(() => { | ||
| if (!isNotificationEmbed) router.push(`/${workspaceSlug}/projects/${projectId}/intake`); | ||
| }); | ||
| await deleteInboxIssue(workspaceSlug, projectId, currentInboxIssueId); | ||
| if (!isNotificationEmbed) router.push(`/${workspaceSlug}/projects/${projectId}/intake`); | ||
| }; |
There was a problem hiding this comment.
Guard inbox-delete with try/catch and user-facing failure handling.
deleteInboxIssue(...) is an external async mutation and its failure path is currently unhandled. Wrap it so rejected deletes don't silently fail.
Proposed fix
const handleInboxIssueDelete = async () => {
if (!inboxIssue || !currentInboxIssueId) return;
- await deleteInboxIssue(workspaceSlug, projectId, currentInboxIssueId);
- if (!isNotificationEmbed) router.push(`/${workspaceSlug}/projects/${projectId}/intake`);
+ try {
+ await deleteInboxIssue(workspaceSlug, projectId, currentInboxIssueId);
+ if (!isNotificationEmbed) router.push(`/${workspaceSlug}/projects/${projectId}/intake`);
+ } catch (error) {
+ setToast({
+ type: TOAST_TYPE.ERROR,
+ title: t("common.error.label"),
+ message: t("localized_ui.inbox.toasts.delete_failed"),
+ });
+ console.error("Failed to delete inbox issue:", error);
+ }
};As per coding guidelines "Use try-catch with proper error types and log errors appropriately for error handling".
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| const handleInboxIssueDelete = async () => { | |
| if (!inboxIssue || !currentInboxIssueId) return; | |
| await deleteInboxIssue(workspaceSlug, projectId, currentInboxIssueId).then(() => { | |
| if (!isNotificationEmbed) router.push(`/${workspaceSlug}/projects/${projectId}/intake`); | |
| }); | |
| await deleteInboxIssue(workspaceSlug, projectId, currentInboxIssueId); | |
| if (!isNotificationEmbed) router.push(`/${workspaceSlug}/projects/${projectId}/intake`); | |
| }; | |
| const handleInboxIssueDelete = async () => { | |
| if (!inboxIssue || !currentInboxIssueId) return; | |
| try { | |
| await deleteInboxIssue(workspaceSlug, projectId, currentInboxIssueId); | |
| if (!isNotificationEmbed) router.push(`/${workspaceSlug}/projects/${projectId}/intake`); | |
| } catch (error) { | |
| setToast({ | |
| type: TOAST_TYPE.ERROR, | |
| title: t("common.error.label"), | |
| message: t("localized_ui.inbox.toasts.delete_failed"), | |
| }); | |
| console.error("Failed to delete inbox issue:", error); | |
| } | |
| }; |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/web/core/components/inbox/content/inbox-issue-header.tsx` around lines
160 - 164, The delete handler handleInboxIssueDelete currently awaits
deleteInboxIssue(...) with no error handling; wrap the await call in a
try/catch, log the error and surface a user-facing failure (e.g., show a toast
or set an error state) so the UI doesn't silently fail, and only call
router.push(...) when the delete succeeds (preserve the isNotificationEmbed
check). Ensure you reference deleteInboxIssue and router.push and keep existing
guards (inboxIssue, currentInboxIssueId) intact.
| <button | ||
| type="button" | ||
| className="relative flex h-3 w-3 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden text-tertiary transition-all hover:text-secondary" | ||
| onClick={() => handleInboxIssueFilters(filterKey, handleFilterValue(optionDetail?.value))} | ||
| > | ||
| <CloseIcon className={`h-3 w-3`} /> | ||
| </div> | ||
| </button> | ||
| </div> | ||
| ); | ||
| })} | ||
|
|
||
| <div | ||
| <button | ||
| type="button" | ||
| className="relative flex h-3 w-3 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden text-tertiary transition-all hover:text-secondary" | ||
| onClick={clearFilter} | ||
| > | ||
| <CloseIcon className={`h-3 w-3`} /> | ||
| </div> | ||
| </button> | ||
| </Tag> |
There was a problem hiding this comment.
Add accessible names to icon-only filter action buttons.
At Line 75 and Line 86, the controls are semantic buttons now (great), but both are icon-only and currently have no accessible name. Screen readers will announce generic “button,” making remove/clear actions ambiguous.
Suggested fix
<button
type="button"
+ aria-label={t("localized_ui.inbox.filters.remove_selected_date_filter")}
className="relative flex h-3 w-3 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden text-tertiary transition-all hover:text-secondary"
onClick={() => handleInboxIssueFilters(filterKey, handleFilterValue(optionDetail?.value))}
>
@@
<button
type="button"
+ aria-label={t("localized_ui.inbox.filters.clear_date_filters")}
className="relative flex h-3 w-3 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden text-tertiary transition-all hover:text-secondary"
onClick={clearFilter}
>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <button | |
| type="button" | |
| className="relative flex h-3 w-3 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden text-tertiary transition-all hover:text-secondary" | |
| onClick={() => handleInboxIssueFilters(filterKey, handleFilterValue(optionDetail?.value))} | |
| > | |
| <CloseIcon className={`h-3 w-3`} /> | |
| </div> | |
| </button> | |
| </div> | |
| ); | |
| })} | |
| <div | |
| <button | |
| type="button" | |
| className="relative flex h-3 w-3 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden text-tertiary transition-all hover:text-secondary" | |
| onClick={clearFilter} | |
| > | |
| <CloseIcon className={`h-3 w-3`} /> | |
| </div> | |
| </button> | |
| </Tag> | |
| <button | |
| type="button" | |
| aria-label={t("localized_ui.inbox.filters.remove_selected_date_filter")} | |
| className="relative flex h-3 w-3 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden text-tertiary transition-all hover:text-secondary" | |
| onClick={() => handleInboxIssueFilters(filterKey, handleFilterValue(optionDetail?.value))} | |
| > | |
| <CloseIcon className={`h-3 w-3`} /> | |
| </button> | |
| </div> | |
| ); | |
| })} | |
| <button | |
| type="button" | |
| aria-label={t("localized_ui.inbox.filters.clear_date_filters")} | |
| className="relative flex h-3 w-3 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden text-tertiary transition-all hover:text-secondary" | |
| onClick={clearFilter} | |
| > | |
| <CloseIcon className={`h-3 w-3`} /> | |
| </button> | |
| </Tag> |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/web/core/components/inbox/inbox-filter/applied-filters/date.tsx` around
lines 75 - 93, The two icon-only buttons inside the Tag component (the
per-option remove button that calls handleInboxIssueFilters(filterKey,
handleFilterValue(optionDetail?.value)) and the final clear button that calls
clearFilter) lack accessible names; add accessible labels by providing either an
aria-label or aria-labelledby on both buttons that describe their actions (e.g.,
"Remove {optionDetail.label}" or "Clear filters") so screen readers announce
meaningful text; keep the CloseIcon visual unchanged and ensure the labels use
optionDetail (or filterKey) to make the per-item label specific.
| <button | ||
| type="button" | ||
| className="relative flex h-3 w-3 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden text-tertiary transition-all hover:text-secondary" | ||
| onClick={() => handleInboxIssueFilters("labels", handleFilterValue(value))} | ||
| > | ||
| <CloseIcon className={`h-3 w-3`} /> | ||
| </div> | ||
| </button> | ||
| </div> | ||
| ); | ||
| })} | ||
|
|
||
| <div | ||
| <button | ||
| type="button" | ||
| className="relative flex h-3 w-3 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden text-tertiary transition-all hover:text-secondary" | ||
| onClick={clearFilter} | ||
| > | ||
| <CloseIcon className={`h-3 w-3`} /> | ||
| </div> | ||
| </button> |
There was a problem hiding this comment.
Expose accessible labels for the label-filter remove/clear buttons.
At Line 46 and Line 57, both actions are icon-only buttons without accessible names, so assistive tech users cannot distinguish intent.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/web/core/components/inbox/inbox-filter/applied-filters/label.tsx` around
lines 46 - 63, The icon-only remove and clear buttons in the label filter need
accessible names so screen readers can identify them; update the two button
elements that call handleInboxIssueFilters("labels", handleFilterValue(value))
and clearFilter to include descriptive accessible labels (e.g., aria-label or
aria-labelledby or include visually hidden text) like "Remove label {value}" for
the per-label button and "Clear all labels" for the clear button, ensuring the
label references the current value for the per-item button and that CloseIcon
remains purely presentational (aria-hidden if needed).
| <button | ||
| type="button" | ||
| className="relative flex h-3 w-3 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden text-tertiary transition-all hover:text-secondary" | ||
| onClick={() => handleInboxIssueFilters("state", handleFilterValue(optionDetail?.id))} | ||
| > | ||
| <CloseIcon className={`h-3 w-3`} /> | ||
| </div> | ||
| </button> | ||
| </div> | ||
| ); | ||
| })} | ||
|
|
||
| <div | ||
| <button | ||
| type="button" | ||
| className="relative flex h-3 w-3 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden text-tertiary transition-all hover:text-secondary" | ||
| onClick={clearFilter} | ||
| > | ||
| <CloseIcon className={`h-3 w-3`} /> | ||
| </div> | ||
| </button> |
There was a problem hiding this comment.
Add aria-label for state filter icon buttons.
At Line 43 and Line 54, icon-only buttons still need an accessible name for screen readers.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/web/core/components/inbox/inbox-filter/applied-filters/state.tsx` around
lines 43 - 60, Add accessible names to the icon-only buttons by adding
aria-label attributes: for the per-option remove button that calls
handleInboxIssueFilters("state", handleFilterValue(optionDetail?.id)) add an
aria-label like `Remove ${optionDetail?.label || optionDetail?.id} filter`
(reference: optionDetail, handleInboxIssueFilters, handleFilterValue,
CloseIcon), and for the global clear button that calls clearFilter add an
aria-label such as `Clear state filters` (reference: clearFilter, CloseIcon);
ensure the labels are descriptive and use optionDetail properties when available
so screen readers get a meaningful name.
| <button | ||
| type="button" | ||
| className="relative flex h-3 w-3 flex-shrink-0 cursor-pointer items-center justify-center overflow-hidden text-tertiary transition-all hover:text-secondary" | ||
| onClick={() => handleInboxIssueFilters("status", handleFilterValue(optionDetail?.status))} | ||
| > | ||
| <CloseIcon className={`h-3 w-3`} /> | ||
| </div> | ||
| </button> |
There was a problem hiding this comment.
Status remove control needs an accessible name.
At Line 43, this icon-only button should include an aria-label (localized) so assistive tech can identify the action.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/web/core/components/inbox/inbox-filter/applied-filters/status.tsx`
around lines 43 - 49, The status remove button is an icon-only control lacking
an accessible name; update the button element that calls
handleInboxIssueFilters("status", handleFilterValue(optionDetail?.status)) to
include a localized aria-label (e.g., via the app's i18n function or translation
hook) that clearly describes the action like "Remove status filter" and ensure
it uses the current status value if needed for clarity; keep CloseIcon as the
visual but add the aria-label on the button so assistive tech can identify the
action.
…reply@openai.com>
There was a problem hiding this comment.
Actionable comments posted: 5
♻️ Duplicate comments (14)
packages/i18n/src/locales/it/translations.ts (2)
2756-2756:⚠️ Potential issue | 🟠 Major | ⚡ Quick winMistranslated UI labels persist from previous review.
Several action labels use incorrect Italian translations that were flagged in an earlier review but remain unfixed:
- Line 2789:
right: "Giusto"→ should be"Destra"(direction, not moral correctness)- Line 2804:
table: "Tavolo"→ should be"Tabella"(data table, not furniture)- Line 2756:
delete: "Eliminare"→ should be"Elimina"(imperative form for UI button)- Lines 2823, 2842, 2865:
continue: "Continuare"→ should be"Continua"(imperative form)- Line 2961:
sign_in: "Registrazione"→ should be"Accedi"("Registrazione" means registration, not sign-in)- Line 2938:
select_work_item: "Seleziona oggetto di lavoro"→ consider"Seleziona elemento di lavoro"for consistency- Line 2966:
public_board_not_found: "Il consiglio pubblico non esiste. Si prega di controllare URL."→ awkward phrasing; consider"La bacheca pubblica non esiste. Controlla l'URL."Also applies to: 2789-2789, 2804-2804, 2823-2823, 2842-2842, 2865-2865, 2938-2938, 2961-2961, 2966-2966
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/it/translations.ts` at line 2756, The Italian translation file has several incorrect labels; update the values for the specified keys: change delete from "Eliminare" to "Elimina", right from "Giusto" to "Destra", table from "Tavolo" to "Tabella", all continue occurrences (keys named continue) from "Continuare" to "Continua", sign_in from "Registrazione" to "Accedi", select_work_item from "Seleziona oggetto di lavoro" to "Seleziona elemento di lavoro" for consistency, and public_board_not_found from "Il consiglio pubblico non esiste. Si prega di controllare URL." to a clearer "La bacheca pubblica non esiste. Controlla l'URL."; locate and update the string values for the keys delete, right, table, continue, sign_in, select_work_item, and public_board_not_found in translations.ts.
2711-2711:⚠️ Potential issue | 🟠 Major | ⚡ Quick winEnglish text remains in Italian locale file.
Multiple strings in the
localized_uisection are still in English instead of Italian, which will cause Italian users to see English UI text. Examples include:
- Line 2711: "Sorry, the page you are looking for cannot be found..."
- Lines 2720-2722: "Projects act as the foundation for goal-driven work..."
- Lines 2730-2731, 2736-2737, 2740-2741: Additional English descriptions
This issue was previously identified and marked as addressed, but the English text persists in the current code.
Also applies to: 2720-2722, 2730-2731, 2736-2737, 2740-2741
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/it/translations.ts` at line 2711, In the localized_ui section of translations.ts several strings are still in English; replace each English sentence with the correct Italian translation (e.g., replace "Sorry, the page you are looking for cannot be found. It may have been removed, renamed, or is temporarily unavailable." and the other English descriptions at the same localized_ui block such as "Projects act as the foundation for goal-driven work..." and the other listed lines) so the localized_ui object contains Italian text for all entries; ensure you update every remaining English string in that localized_ui block (the exact English phrases shown in the review) with accurate Italian equivalents and keep surrounding punctuation and key names unchanged.packages/i18n/src/locales/cs/translations.ts (5)
2672-2676:⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift
localized_ui.projects_empty_stateblock remains in English.This section is still English instead of Czech, breaking localization for Czech users on project empty state screens.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/cs/translations.ts` around lines 2672 - 2676, The projects empty-state entries (keys no_projects_yet, description, learn_more, start_first_project) in the localized_ui.projects_empty_state block are still in English; replace those English strings with their proper Czech translations (update the values for no_projects_yet, description, learn_more, and start_first_project in translations.ts) ensuring idiomatic Czech phrasing and preserving punctuation and key names exactly.
2660-2666:⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift
localized_ui.not_foundblock remains in English.This section is still English instead of Czech, breaking localization for Czech users on 404 pages.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/cs/translations.ts` around lines 2660 - 2666, The localized_ui.not_found block is still in English; update the Czech translations for the keys in that object (localized_ui.not_found.alt, .title, .description, and .go_to_home) with proper Czech strings so the 404 page is fully localized—replace the English "404 - Stránka nenalezena", "Jejda! Něco se pokazilo.", the English description sentence, and "Přejít domů" if needed with accurate Czech phrasing for alt, title, description and go_to_home respectively, preserving existing key names and string types.
2687-2695:⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift
localized_ui.workspace_accessdescriptions remain in English.Critical workspace access messaging (not found, unauthorized, permission errors) is still in English instead of Czech.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/cs/translations.ts` around lines 2687 - 2695, The workspace_access translations contain English strings for not_found_description and not_authorized_description; update those keys inside the workspace_access object (not_found_description, not_authorized_description) to their Czech equivalents, ensuring phrasing matches surrounding keys (e.g., "Pracovní prostor nenalezen" style) and preserve surrounding keys like not_found_title, visit_profile, not_authorized_title, and check_pending_invites; keep punctuation and string formatting consistent with the file's other translations.
2891-2893:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winUse Czech plural forms for label counts.
label_countuses a fixed string that's grammatically incorrect for many counts (e.g., 1, 5+).Proposed fix
sidebar: { - label_count: "{count} štítky", + label_count: "{count, plural, one{# štítek} few{# štítky} other{# štítků}}", },🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/cs/translations.ts` around lines 2891 - 2893, The sidebar.label_count currently uses a fixed string and must be replaced with a Czech pluralized message using ICU plural categories (one, few, other) so counts like 1 / 2–4 / 5+ are grammatically correct; update the label_count value in packages/i18n/src/locales/cs/translations.ts to an ICU plural pattern (using {count, plural, one {...} few {...} other {...}}) that returns the correct forms for "štítek", "štítky", and "štítků" respectively and ensure any code that passes the count uses the same variable name (count) as in the pattern.
2740-2744:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winFix mistranslation of right alignment label.
localized_ui.editor.alignment.rightis currentlyPrávo(meaning "law/rights"), not "right aligned".Proposed fix
alignment: { left: "Vlevo", center: "Centrum", - right: "Právo", + right: "Vpravo", },🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/cs/translations.ts` around lines 2740 - 2744, The label for right alignment is mistranslated: update the value of localized_ui.editor.alignment.right (currently "Právo") to the correct Czech term "Vpravo" so it conveys "right (aligned)"; locate the alignment object in the translations.ts where alignment.left/center/right are defined and replace the string for right accordingly.packages/i18n/src/locales/de/translations.ts (4)
2923-2925:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winUse pluralized German forms for label counts.
label_countstill uses a fixed string format that doesn't handle singular/plural correctly.Proposed fix
sidebar: { - label_count: "{count}-Etiketten", + label_count: "{count, plural, one{# Etikett} other{# Etiketten}}", },🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/de/translations.ts` around lines 2923 - 2925, The current sidebar.label_count uses a fixed string and doesn't handle German singular/plural; replace its value with a pluralized ICU-style or i18n plural form so counts render correctly (e.g. use "{count, plural, one {# Etikett} other {# Etiketten}}" or the project's plural object shape) and ensure the key remains sidebar.label_count so the i18n runtime picks the correct form based on the numeric count.
2713-2725:⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift
localized_ui.workspace_accessdescriptions remain in English.Critical workspace access messaging (not found, unauthorized, permission errors) is still in English instead of German.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/de/translations.ts` around lines 2713 - 2725, Update the German translations under localized_ui.workspace_access so the English descriptions are translated to German: replace not_found_description and not_authorized_description (and any other English strings in workspace_access such as view_other_pages if present) with proper German text; locate the object named localized_ui.workspace_access and edit the values for not_found_description and not_authorized_description to their German equivalents while keeping the key names unchanged.
2702-2706:⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift
localized_ui.projects_empty_stateblock remains in English.This section is still English instead of German, breaking localization for German users on project empty state screens.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/de/translations.ts` around lines 2702 - 2706, The localized_ui.projects_empty_state entries (keys no_projects_yet, description, learn_more, start_first_project) are still in English; replace their string values with proper German translations so the German locale is consistent (update the values for no_projects_yet, description, learn_more, start_first_project under localized_ui.projects_empty_state to German equivalents). Ensure the translations are idiomatic and preserve the original meaning/tone and keep formatting consistent with surrounding entries.
2690-2696:⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift
localized_ui.not_foundblock remains in English.This section is still English instead of German, breaking localization for German users on 404 pages.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/de/translations.ts` around lines 2690 - 2696, The localized_ui.not_found block is still in English; update the German translations for the keys in that object (localized_ui.not_found.alt, .title, .description, and .go_to_home) to proper German text so the 404 page displays German strings (replace the English sentences with their German equivalents, keeping the same keys and value types).packages/i18n/src/locales/ro/translations.ts (2)
2706-2717:⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift
localized_uistill contains English copy in Romanian locale.Several user-facing strings are still English (e.g., Line 2706, Line 2715-Line 2717, Line 2725-Line 2726, Line 2731, Line 2735), so
rorenders mixed-language UI.Suggested direction
- description: - "Sorry, the page you are looking for cannot be found. It may have been removed, renamed, or is temporarily unavailable.", + description: + "Ne pare rău, pagina pe care o cauți nu poate fi găsită. Este posibil să fi fost eliminată, redenumită sau să fie temporar indisponibilă.", ... - learn_more: "Learn more about projects", - start_first_project: "Start your first project", + learn_more: "Află mai multe despre proiecte", + start_first_project: "Începe primul tău proiect",Also applies to: 2725-2736
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/ro/translations.ts` around lines 2706 - 2717, The Romanian locale contains untranslated English strings; update the affected translation keys in translations.ts so the UI is fully Romanian: replace workspace_views.page_title's placeholder string and the keys go_to_home, projects_empty_state.no_projects_yet, projects_empty_state.description, projects_empty_state.learn_more, and projects_empty_state.start_first_project (and any other entries around lines 2706–2736) with proper Romanian translations; ensure placeholders like {workspaceName} remain intact and preserve message punctuation and interpolation tokens when replacing the English text.
2774-2785:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winFix contextually incorrect Romanian editor labels.
Line 2774, Line 2784, and Line 2799 currently change intended UI meaning (
clear, alignment direction, and editor table).Suggested fix
- clear_contents: "Conținutul clar", + clear_contents: "Șterge conținutul", ... - right: "Corect", + right: "Dreapta", ... - table: "Masă", + table: "Tabel",Also applies to: 2799-2799
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/ro/translations.ts` around lines 2774 - 2785, The Romanian strings for several editor labels are contextually wrong: change clear_contents from "Conținutul clar" to a proper imperative like "Șterge conținutul", fix alignment.right (currently "Corect") to "Dreapta", and review the nearby table/editor label around the same block (the table-related key near line 2799) and replace its literal/incorrect translation with the correct Romanian verb phrase (e.g., "Șterge tabelul" or the appropriate imperative for that action); update keys shown here such as clear_contents and alignment.right (and the table/editor label key near header_row/header_column) accordingly.packages/i18n/src/locales/es/translations.ts (1)
2725-2737:⚠️ Potential issue | 🟠 Major | 🏗️ Heavy liftSpanish
localized_uistill ships English strings.There are still untranslated English messages in user-visible paths (e.g., Line 2726, Line 2735-Line 2737, Line 2745-Line 2746, Line 2751, Line 2755), causing mixed-language UX in
es.Also applies to: 2745-2756
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/es/translations.ts` around lines 2725 - 2737, The Spanish locale file contains English text for several keys (e.g., top-level keys description and go_to_home, workspace_views.page_title, and the projects_empty_state keys no_projects_yet, description, learn_more, start_first_project); replace these English strings with their proper Spanish translations so the es translations.ts no longer ships user-visible English; update the string values for description, go_to_home, workspace_views.page_title, projects_empty_state.no_projects_yet, projects_empty_state.description, projects_empty_state.learn_more, and projects_empty_state.start_first_project (and any other remaining English entries in that block) ensuring grammar and placeholders (like {workspaceName}) are preserved.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/core/layouts/auth-layout/workspace-wrapper.tsx`:
- Around line 164-172: The sign-out icon button lacks an accessible name; update
the button rendered alongside Tooltip/LogOut so it exposes an explicit
accessible label (e.g., add aria-label or aria-labelledby) using the localized
string from t("sign_out") so screen readers can announce the control; ensure the
attribute is placed on the button element that calls handleSignOut (the same
button that wraps Tooltip and LogOut).
In `@packages/i18n/src/locales/es/translations.ts`:
- Around line 2782-2805: Update the incorrect Spanish UI strings in
translations.ts: change the value for key retry from "Rever" to "Reintentar";
change alignment.right from "Bien" to "Derecha"; correct the table-related label
(key table or similar occurrences at the referenced locations) from "Mesa" to
"Tabla"; also review and replace awkward zoom_in "Dar un golpe de zoom" with a
natural term like "Acercar" if present. Locate and edit these keys (retry,
alignment.right, table, zoom_in) in the file (including the other occurrences
noted around the indicated ranges) so the UI actions use proper Spanish terms.
In `@packages/i18n/src/locales/zh-CN/translations.ts`:
- Around line 2924-3147: This block contains mistranslations that change UI
meaning; run a native-speaker pass and correct the specific keys: change
editor.alignment.right from "正确的" to a proper UI label like "右对齐" (or "右"),
menu_items.table from "桌子" to "表格", menu_items.divider from "分频器" to "分隔符" or
"分割线", menu_items.bold/italic/underline etc. if awkward keep concise UI terms,
inbox.filters.status from "地位" to "状态", and space_public.powered_by from "供电" to
a natural phrase like "提供支持" or "由 … 提供"; review the entire
editor/menu_items/alignment/inbox/space_public groups for other semantic errors
and update strings to concise, standard Chinese UI wording.
In `@packages/propel/src/banner/banner.tsx`:
- Line 89: The dismiss button in the Banner component is missing an explicit
type and defaults to "submit", which can inadvertently submit surrounding forms;
update the JSX for the button that uses handleDismiss, dismissStyling, and
dismissLabel to include type="button" so it will not trigger form submission.
In `@packages/propel/src/spinners/circular-spinner.tsx`:
- Line 15: The Spinner's label prop is defaulting to the hardcoded English
string "Loading..." (see label in CircularSpinner / Spinner component), which
breaks i18n; either remove the default to make label required (update the
SpinnerProps type and the CircularSpinner/Spinner component signature so callers
must pass a localized string), or import the project's translation function
(e.g., t or i18n.t) and use it to compute the default label inside
CircularSpinner (replace the literal "Loading..." with t('loading') or
equivalent), or add a JSDoc note on the label prop making it explicit that
callers must pass localized text—pick one approach and update SpinnerProps, the
CircularSpinner component, and any docs accordingly.
---
Duplicate comments:
In `@packages/i18n/src/locales/cs/translations.ts`:
- Around line 2672-2676: The projects empty-state entries (keys no_projects_yet,
description, learn_more, start_first_project) in the
localized_ui.projects_empty_state block are still in English; replace those
English strings with their proper Czech translations (update the values for
no_projects_yet, description, learn_more, and start_first_project in
translations.ts) ensuring idiomatic Czech phrasing and preserving punctuation
and key names exactly.
- Around line 2660-2666: The localized_ui.not_found block is still in English;
update the Czech translations for the keys in that object
(localized_ui.not_found.alt, .title, .description, and .go_to_home) with proper
Czech strings so the 404 page is fully localized—replace the English "404 -
Stránka nenalezena", "Jejda! Něco se pokazilo.", the English description
sentence, and "Přejít domů" if needed with accurate Czech phrasing for alt,
title, description and go_to_home respectively, preserving existing key names
and string types.
- Around line 2687-2695: The workspace_access translations contain English
strings for not_found_description and not_authorized_description; update those
keys inside the workspace_access object (not_found_description,
not_authorized_description) to their Czech equivalents, ensuring phrasing
matches surrounding keys (e.g., "Pracovní prostor nenalezen" style) and preserve
surrounding keys like not_found_title, visit_profile, not_authorized_title, and
check_pending_invites; keep punctuation and string formatting consistent with
the file's other translations.
- Around line 2891-2893: The sidebar.label_count currently uses a fixed string
and must be replaced with a Czech pluralized message using ICU plural categories
(one, few, other) so counts like 1 / 2–4 / 5+ are grammatically correct; update
the label_count value in packages/i18n/src/locales/cs/translations.ts to an ICU
plural pattern (using {count, plural, one {...} few {...} other {...}}) that
returns the correct forms for "štítek", "štítky", and "štítků" respectively and
ensure any code that passes the count uses the same variable name (count) as in
the pattern.
- Around line 2740-2744: The label for right alignment is mistranslated: update
the value of localized_ui.editor.alignment.right (currently "Právo") to the
correct Czech term "Vpravo" so it conveys "right (aligned)"; locate the
alignment object in the translations.ts where alignment.left/center/right are
defined and replace the string for right accordingly.
In `@packages/i18n/src/locales/de/translations.ts`:
- Around line 2923-2925: The current sidebar.label_count uses a fixed string and
doesn't handle German singular/plural; replace its value with a pluralized
ICU-style or i18n plural form so counts render correctly (e.g. use "{count,
plural, one {# Etikett} other {# Etiketten}}" or the project's plural object
shape) and ensure the key remains sidebar.label_count so the i18n runtime picks
the correct form based on the numeric count.
- Around line 2713-2725: Update the German translations under
localized_ui.workspace_access so the English descriptions are translated to
German: replace not_found_description and not_authorized_description (and any
other English strings in workspace_access such as view_other_pages if present)
with proper German text; locate the object named localized_ui.workspace_access
and edit the values for not_found_description and not_authorized_description to
their German equivalents while keeping the key names unchanged.
- Around line 2702-2706: The localized_ui.projects_empty_state entries (keys
no_projects_yet, description, learn_more, start_first_project) are still in
English; replace their string values with proper German translations so the
German locale is consistent (update the values for no_projects_yet, description,
learn_more, start_first_project under localized_ui.projects_empty_state to
German equivalents). Ensure the translations are idiomatic and preserve the
original meaning/tone and keep formatting consistent with surrounding entries.
- Around line 2690-2696: The localized_ui.not_found block is still in English;
update the German translations for the keys in that object
(localized_ui.not_found.alt, .title, .description, and .go_to_home) to proper
German text so the 404 page displays German strings (replace the English
sentences with their German equivalents, keeping the same keys and value types).
In `@packages/i18n/src/locales/es/translations.ts`:
- Around line 2725-2737: The Spanish locale file contains English text for
several keys (e.g., top-level keys description and go_to_home,
workspace_views.page_title, and the projects_empty_state keys no_projects_yet,
description, learn_more, start_first_project); replace these English strings
with their proper Spanish translations so the es translations.ts no longer ships
user-visible English; update the string values for description, go_to_home,
workspace_views.page_title, projects_empty_state.no_projects_yet,
projects_empty_state.description, projects_empty_state.learn_more, and
projects_empty_state.start_first_project (and any other remaining English
entries in that block) ensuring grammar and placeholders (like {workspaceName})
are preserved.
In `@packages/i18n/src/locales/it/translations.ts`:
- Line 2756: The Italian translation file has several incorrect labels; update
the values for the specified keys: change delete from "Eliminare" to "Elimina",
right from "Giusto" to "Destra", table from "Tavolo" to "Tabella", all continue
occurrences (keys named continue) from "Continuare" to "Continua", sign_in from
"Registrazione" to "Accedi", select_work_item from "Seleziona oggetto di lavoro"
to "Seleziona elemento di lavoro" for consistency, and public_board_not_found
from "Il consiglio pubblico non esiste. Si prega di controllare URL." to a
clearer "La bacheca pubblica non esiste. Controlla l'URL."; locate and update
the string values for the keys delete, right, table, continue, sign_in,
select_work_item, and public_board_not_found in translations.ts.
- Line 2711: In the localized_ui section of translations.ts several strings are
still in English; replace each English sentence with the correct Italian
translation (e.g., replace "Sorry, the page you are looking for cannot be found.
It may have been removed, renamed, or is temporarily unavailable." and the other
English descriptions at the same localized_ui block such as "Projects act as the
foundation for goal-driven work..." and the other listed lines) so the
localized_ui object contains Italian text for all entries; ensure you update
every remaining English string in that localized_ui block (the exact English
phrases shown in the review) with accurate Italian equivalents and keep
surrounding punctuation and key names unchanged.
In `@packages/i18n/src/locales/ro/translations.ts`:
- Around line 2706-2717: The Romanian locale contains untranslated English
strings; update the affected translation keys in translations.ts so the UI is
fully Romanian: replace workspace_views.page_title's placeholder string and the
keys go_to_home, projects_empty_state.no_projects_yet,
projects_empty_state.description, projects_empty_state.learn_more, and
projects_empty_state.start_first_project (and any other entries around lines
2706–2736) with proper Romanian translations; ensure placeholders like
{workspaceName} remain intact and preserve message punctuation and interpolation
tokens when replacing the English text.
- Around line 2774-2785: The Romanian strings for several editor labels are
contextually wrong: change clear_contents from "Conținutul clar" to a proper
imperative like "Șterge conținutul", fix alignment.right (currently "Corect") to
"Dreapta", and review the nearby table/editor label around the same block (the
table-related key near line 2799) and replace its literal/incorrect translation
with the correct Romanian verb phrase (e.g., "Șterge tabelul" or the appropriate
imperative for that action); update keys shown here such as clear_contents and
alignment.right (and the table/editor label key near header_row/header_column)
accordingly.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: b6f11fa2-c574-4790-87ba-37ba76d134b3
📒 Files selected for processing (30)
apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/activity/page.tsxapps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsxapps/web/app/(all)/[workspaceSlug]/(projects)/sidebar.tsxapps/web/app/(all)/[workspaceSlug]/(projects)/stickies/page.tsxapps/web/app/(all)/[workspaceSlug]/(projects)/workspace-views/page.tsxapps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/page.tsxapps/web/app/not-found.tsxapps/web/core/components/stickies/modal/stickies.tsxapps/web/core/layouts/auth-layout/workspace-wrapper.tsxpackages/i18n/src/locales/cs/translations.tspackages/i18n/src/locales/de/translations.tspackages/i18n/src/locales/en/translations.tspackages/i18n/src/locales/es/translations.tspackages/i18n/src/locales/fr/translations.tspackages/i18n/src/locales/id/translations.tspackages/i18n/src/locales/it/translations.tspackages/i18n/src/locales/ja/translations.tspackages/i18n/src/locales/ko/translations.tspackages/i18n/src/locales/pl/translations.tspackages/i18n/src/locales/pt-BR/translations.tspackages/i18n/src/locales/ro/translations.tspackages/i18n/src/locales/ru/translations.tspackages/i18n/src/locales/sk/translations.tspackages/i18n/src/locales/tr-TR/translations.tspackages/i18n/src/locales/ua/translations.tspackages/i18n/src/locales/vi-VN/translations.tspackages/i18n/src/locales/zh-CN/translations.tspackages/i18n/src/locales/zh-TW/translations.tspackages/propel/src/banner/banner.tsxpackages/propel/src/spinners/circular-spinner.tsx
✅ Files skipped from review due to trivial changes (7)
- apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/activity/page.tsx
- apps/web/app/(all)/[workspaceSlug]/(projects)/workspace-views/page.tsx
- packages/i18n/src/locales/vi-VN/translations.ts
- packages/i18n/src/locales/tr-TR/translations.ts
- packages/i18n/src/locales/en/translations.ts
- packages/i18n/src/locales/id/translations.ts
- packages/i18n/src/locales/sk/translations.ts
🚧 Files skipped from review as they are similar to previous changes (6)
- packages/i18n/src/locales/pl/translations.ts
- packages/i18n/src/locales/ru/translations.ts
- packages/i18n/src/locales/zh-TW/translations.ts
- packages/i18n/src/locales/fr/translations.ts
- packages/i18n/src/locales/ua/translations.ts
- packages/i18n/src/locales/pt-BR/translations.ts
| height?: string; | ||
| width?: string; | ||
| className?: string | undefined; | ||
| label?: string; |
There was a problem hiding this comment.
Consider whether the hardcoded English default aligns with i18n goals.
The label parameter defaults to "Loading...", which remains a hardcoded English string. While this provides a sensible fallback, any component using <Spinner /> without an explicit label will display English text regardless of the user's locale.
In an i18n-focused PR that localizes hardcoded UI surfaces, you may want to either:
- Make
labelrequired (remove the default), forcing callers to provide localized text - Import and use a translation function to localize the default value within this component
- Document that callers must provide localized labels when using the spinner
The current approach works if the team's convention is that all callers will provide localized strings, but it creates a potential gap if the default is ever relied upon.
Also applies to: 18-18, 39-39
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/propel/src/spinners/circular-spinner.tsx` at line 15, The Spinner's
label prop is defaulting to the hardcoded English string "Loading..." (see label
in CircularSpinner / Spinner component), which breaks i18n; either remove the
default to make label required (update the SpinnerProps type and the
CircularSpinner/Spinner component signature so callers must pass a localized
string), or import the project's translation function (e.g., t or i18n.t) and
use it to compute the default label inside CircularSpinner (replace the literal
"Loading..." with t('loading') or equivalent), or add a JSDoc note on the label
prop making it explicit that callers must pass localized text—pick one approach
and update SpinnerProps, the CircularSpinner component, and any docs
accordingly.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8836325718
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| placeholder="name@company.com" | ||
| className={`h-10 w-full border-0 disable-autofill-style placeholder:text-placeholder autofill:bg-danger-subtle focus:bg-none active:bg-transparent`} | ||
| autoComplete="off" | ||
| autoFocus | ||
| ref={inputRef} | ||
| /> |
There was a problem hiding this comment.
Restore initial focus to the auth email input
The email form no longer autofocuses its primary input, so users who open Space auth and immediately type or press Enter must first click into the field. This is a workflow regression from the previous behavior and affects keyboard-first sign-in/sign-up flows across the first auth step; please restore autoFocus (or equivalent mount-time focus logic) on the initial email field.
Useful? React with 👍 / 👎.
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (2)
packages/i18n/src/locales/pt-BR/translations.ts (2)
2791-2791:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winEditor labels use semantically incorrect Portuguese terms.
right,table, andboldare currently translated with words that don’t match common editor terminology.Direct replacements
- right: "Certo", + right: "Direita", @@ - table: "Mesa", + table: "Tabela", @@ - bold: "Audacioso", + bold: "Negrito",Also applies to: 2806-2806, 2810-2810
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/pt-BR/translations.ts` at line 2791, The translations object contains semantically incorrect Portuguese values for the editor labels: replace the value for the key "right" (currently "Certo") with a proper alignment label such as "Direita" or "Alinhar à direita", replace "table" with "Tabela", and replace "bold" with "Negrito" in the translations.ts file (update the entries for keys "right", "table", and "bold" around the existing lines ~2791, ~2806, ~2810 so the labels reflect standard Portuguese editor terminology).
2713-2713:⚠️ Potential issue | 🟠 Major | ⚡ Quick winPT-BR locale still contains multiple English UI strings.
Several newly added
localized_uivalues are still English, so Portuguese users will get mixed-language screens on not-found/access/empty-state paths.Suggested fix pattern (apply similarly to remaining English entries)
- description: - "Sorry, the page you are looking for cannot be found. It may have been removed, renamed, or is temporarily unavailable.", + description: + "Desculpe, a página que você está procurando não pode ser encontrada. Ela pode ter sido removida, renomeada ou estar temporariamente indisponível.", @@ - description: - "Projects act as the foundation for goal-driven work. They let you manage your teams, tasks, and everything you need to get things done.", - learn_more: "Learn more about projects", - start_first_project: "Start your first project", + description: + "Os projetos são a base do trabalho orientado por objetivos. Eles permitem gerenciar equipes, tarefas e tudo o que você precisa para avançar.", + learn_more: "Saiba mais sobre projetos", + start_first_project: "Inicie seu primeiro projeto",Also applies to: 2722-2724, 2732-2733, 2738-2738, 2742-2742
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/pt-BR/translations.ts` at line 2713, The PT-BR translations file contains several English UI strings under localized_ui entries (e.g., the "Sorry, the page you are looking for cannot be found..." string and other entries around the same block), causing mixed-language UI; update each affected localized_ui value to the correct Portuguese text (apply consistent Portuguese phrasing for not-found/access/empty-state messages) by replacing the English literals with their Portuguese equivalents in packages/i18n/src/locales/pt-BR/translations.ts for the entries around the reported areas (the string shown and the entries at the nearby positions noted in the comment: 2722–2724, 2732–2733, 2738, 2742), ensuring pluralization and punctuation match other PT-BR strings.
🧹 Nitpick comments (5)
apps/space/app/error.tsx (1)
24-32: ⚡ Quick winUse one rich translation key for the full sentence (including punctuation).
Building the sentence from
prefix + middle + forum + "."constrains word order and punctuation per locale. Prefer a single translation key with placeholders/rich interpolation for the support and forum links so each language can control full grammar naturally.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/space/app/error.tsx` around lines 24 - 32, Replace the concatenated pieces in apps/space/app/error.tsx that call t("localized_ui.space_public.error_description_prefix"), t("localized_ui.space_public.error_description_middle") and t("localized_ui.space_public.forum") with a single rich translation key (e.g. "localized_ui.space_public.error_description_full") that contains the whole sentence and placeholders for the support and forum links; update the JSX to render that single key via the i18n rich-text interpolation or Trans-style mechanism using the existing t function so the support anchor and forum anchor are passed as placeholders, removing the current string concatenation to allow full locale control of word order and punctuation.packages/i18n/src/locales/pt-BR/translations.ts (1)
2975-2976: ⚡ Quick winUse ICU plurals for count-based labels.
These strings can render ungrammatical singular forms (e.g.,
1 módulos).Plural-safe variant
- modules_count: "{count} módulos", - labels_count: "{count} etiquetas", + modules_count: "{count, plural, one{# módulo} other{# módulos}}", + labels_count: "{count, plural, one{# etiqueta} other{# etiquetas}}",🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/i18n/src/locales/pt-BR/translations.ts` around lines 2975 - 2976, modules_count and labels_count currently interpolate raw counts and produce incorrect singular forms (e.g., "1 módulos"); update these entries in translations.ts to use ICU plural syntax so singular/plural (and other plural categories) are handled correctly. Replace modules_count and labels_count values with ICU plural strings that branch on count (e.g., one {# módulo} other {# módulos}) ensuring you keep the placeholder name {count} and preserve existing interpolation semantics used by the i18n runtime.apps/space/components/issues/reactions/issue-vote-reactions.tsx (1)
133-133: ⚡ Quick winAdd optional chaining for consistency.
Line 91 uses optional chaining (
r.actor_details?.display_name) but line 133 does not. This inconsistency could cause a runtime error ifactor_detailsis undefined.🛡️ Proposed fix
- .map((r) => r.actor_details.display_name) + .map((r) => r.actor_details?.display_name)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/space/components/issues/reactions/issue-vote-reactions.tsx` at line 133, The mapping over reaction objects uses r.actor_details.display_name without optional chaining which can throw if actor_details is undefined; update the map callback (the .map((r) => r.actor_details.display_name) expression in issue-vote-reactions.tsx) to use optional chaining (r.actor_details?.display_name) so it safely returns undefined when actor_details is missing and remains consistent with the earlier usage of r.actor_details?.display_name.apps/space/components/issues/issue-layouts/utils.tsx (1)
182-182: ⚡ Quick winConsider replacing
anywith explicit type.The
assigneeColumnsarray is typed asany, which bypasses type safety. Consider defining an explicit return type forgetAssigneeColumnsthat matches theIGroupByColumnstructure.💡 Suggested improvement
- const assigneeColumns: any = members.map((memberInfo) => ({ + const assigneeColumns: IGroupByColumn[] = members.map((memberInfo) => ({ id: memberInfo.id, name: memberInfo?.member__display_name || "", icon: <Avatar name={memberInfo?.member__display_name} src={undefined} size="md" />, payload: { assignee_ids: [memberInfo.id] }, }));🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/space/components/issues/issue-layouts/utils.tsx` at line 182, Replace the loose any on assigneeColumns with an explicit type matching the expected IGroupByColumn array: update the getAssigneeColumns function signature to return IGroupByColumn[] (or a more specific union if needed) and type assigneeColumns as IGroupByColumn[]; ensure each object created in the members.map call conforms to the IGroupByColumn properties (rename or add missing fields, adjust property types) so the compiler enforces correct structure for assigneeColumns and the function return.apps/space/components/issues/issue-layouts/kanban/default.tsx (1)
74-77: ⚡ Quick winConsider using a single translation key instead of string concatenation.
The pattern
${t("common.all")} ${t("work_items")}concatenates two translation strings, which may cause word-order issues in languages with different syntax (e.g., languages where "work items" might precede "all").Consider using a single translation key like
t("common.all_work_items")or using i18next interpolation for better i18n support.This pattern also appears in
apps/space/components/issues/issue-layouts/list/default.tsx(lines 65-68) andapps/space/components/issues/issue-layouts/kanban/swimlanes.tsx(lines 75-77).🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/space/components/issues/issue-layouts/kanban/default.tsx` around lines 74 - 77, Replace the string-concatenation `${t("common.all")} ${t("work_items")}` used when building groupList (in the getGroupByColumns call) with a single translation key or an i18next interpolation (e.g., t("common.all_work_items") or t("common.all_x", { what: t("work_items") })) to preserve word order in other languages; apply the same change to the identical patterns found in the list layout and kanban swimlanes where getGroupByColumns (or equivalent grouping calls) currently concatenate translations.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/space/app/not-found.tsx`:
- Around line 7-29: The NotFound component uses translation keys
localized_ui.space_public.something_went_wrong,
localized_ui.space_public.not_found_title, and
localized_ui.space_public.not_found_hint via useTranslation's t but those keys
are missing; add these three keys with appropriate translated strings to every
locale translations.ts (all 19 files) under the localized_ui.space_public object
so t(...) resolves at runtime, keeping key names identical to what's used in
NotFound and ensuring each locale has a sensible fallback/translation.
---
Duplicate comments:
In `@packages/i18n/src/locales/pt-BR/translations.ts`:
- Line 2791: The translations object contains semantically incorrect Portuguese
values for the editor labels: replace the value for the key "right" (currently
"Certo") with a proper alignment label such as "Direita" or "Alinhar à direita",
replace "table" with "Tabela", and replace "bold" with "Negrito" in the
translations.ts file (update the entries for keys "right", "table", and "bold"
around the existing lines ~2791, ~2806, ~2810 so the labels reflect standard
Portuguese editor terminology).
- Line 2713: The PT-BR translations file contains several English UI strings
under localized_ui entries (e.g., the "Sorry, the page you are looking for
cannot be found..." string and other entries around the same block), causing
mixed-language UI; update each affected localized_ui value to the correct
Portuguese text (apply consistent Portuguese phrasing for
not-found/access/empty-state messages) by replacing the English literals with
their Portuguese equivalents in packages/i18n/src/locales/pt-BR/translations.ts
for the entries around the reported areas (the string shown and the entries at
the nearby positions noted in the comment: 2722–2724, 2732–2733, 2738, 2742),
ensuring pluralization and punctuation match other PT-BR strings.
---
Nitpick comments:
In `@apps/space/app/error.tsx`:
- Around line 24-32: Replace the concatenated pieces in apps/space/app/error.tsx
that call t("localized_ui.space_public.error_description_prefix"),
t("localized_ui.space_public.error_description_middle") and
t("localized_ui.space_public.forum") with a single rich translation key (e.g.
"localized_ui.space_public.error_description_full") that contains the whole
sentence and placeholders for the support and forum links; update the JSX to
render that single key via the i18n rich-text interpolation or Trans-style
mechanism using the existing t function so the support anchor and forum anchor
are passed as placeholders, removing the current string concatenation to allow
full locale control of word order and punctuation.
In `@apps/space/components/issues/issue-layouts/kanban/default.tsx`:
- Around line 74-77: Replace the string-concatenation `${t("common.all")}
${t("work_items")}` used when building groupList (in the getGroupByColumns call)
with a single translation key or an i18next interpolation (e.g.,
t("common.all_work_items") or t("common.all_x", { what: t("work_items") })) to
preserve word order in other languages; apply the same change to the identical
patterns found in the list layout and kanban swimlanes where getGroupByColumns
(or equivalent grouping calls) currently concatenate translations.
In `@apps/space/components/issues/issue-layouts/utils.tsx`:
- Line 182: Replace the loose any on assigneeColumns with an explicit type
matching the expected IGroupByColumn array: update the getAssigneeColumns
function signature to return IGroupByColumn[] (or a more specific union if
needed) and type assigneeColumns as IGroupByColumn[]; ensure each object created
in the members.map call conforms to the IGroupByColumn properties (rename or add
missing fields, adjust property types) so the compiler enforces correct
structure for assigneeColumns and the function return.
In `@apps/space/components/issues/reactions/issue-vote-reactions.tsx`:
- Line 133: The mapping over reaction objects uses r.actor_details.display_name
without optional chaining which can throw if actor_details is undefined; update
the map callback (the .map((r) => r.actor_details.display_name) expression in
issue-vote-reactions.tsx) to use optional chaining
(r.actor_details?.display_name) so it safely returns undefined when
actor_details is missing and remains consistent with the earlier usage of
r.actor_details?.display_name.
In `@packages/i18n/src/locales/pt-BR/translations.ts`:
- Around line 2975-2976: modules_count and labels_count currently interpolate
raw counts and produce incorrect singular forms (e.g., "1 módulos"); update
these entries in translations.ts to use ICU plural syntax so singular/plural
(and other plural categories) are handled correctly. Replace modules_count and
labels_count values with ICU plural strings that branch on count (e.g., one {#
módulo} other {# módulos}) ensuring you keep the placeholder name {count} and
preserve existing interpolation semantics used by the i18n runtime.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: ffea1a4e-eea5-4e3d-8bb1-8fc3c9a5afcb
📒 Files selected for processing (44)
apps/space/app/error.tsxapps/space/app/not-found.tsxapps/space/components/account/auth-forms/auth-header.tsxapps/space/components/account/auth-forms/auth-root.tsxapps/space/components/account/terms-and-conditions.tsxapps/space/components/account/user-logged-in.tsxapps/space/components/issues/filters/labels.tsxapps/space/components/issues/filters/selection.tsxapps/space/components/issues/filters/state.tsxapps/space/components/issues/issue-layouts/kanban/default.tsxapps/space/components/issues/issue-layouts/kanban/swimlanes.tsxapps/space/components/issues/issue-layouts/list/default.tsxapps/space/components/issues/issue-layouts/properties/all-properties.tsxapps/space/components/issues/issue-layouts/properties/cycle.tsxapps/space/components/issues/issue-layouts/properties/due-date.tsxapps/space/components/issues/issue-layouts/properties/labels.tsxapps/space/components/issues/issue-layouts/properties/member.tsxapps/space/components/issues/issue-layouts/properties/modules.tsxapps/space/components/issues/issue-layouts/properties/priority.tsxapps/space/components/issues/issue-layouts/properties/state.tsxapps/space/components/issues/issue-layouts/utils.tsxapps/space/components/issues/peek-overview/comment/comment-detail-card.tsxapps/space/components/issues/peek-overview/header.tsxapps/space/components/issues/reactions/issue-vote-reactions.tsxapps/space/hooks/oauth/core.tsxpackages/i18n/src/locales/cs/translations.tspackages/i18n/src/locales/de/translations.tspackages/i18n/src/locales/en/translations.tspackages/i18n/src/locales/es/translations.tspackages/i18n/src/locales/fr/translations.tspackages/i18n/src/locales/id/translations.tspackages/i18n/src/locales/it/translations.tspackages/i18n/src/locales/ja/translations.tspackages/i18n/src/locales/ko/translations.tspackages/i18n/src/locales/pl/translations.tspackages/i18n/src/locales/pt-BR/translations.tspackages/i18n/src/locales/ro/translations.tspackages/i18n/src/locales/ru/translations.tspackages/i18n/src/locales/sk/translations.tspackages/i18n/src/locales/tr-TR/translations.tspackages/i18n/src/locales/ua/translations.tspackages/i18n/src/locales/vi-VN/translations.tspackages/i18n/src/locales/zh-CN/translations.tspackages/i18n/src/locales/zh-TW/translations.ts
✅ Files skipped from review due to trivial changes (6)
- packages/i18n/src/locales/zh-CN/translations.ts
- packages/i18n/src/locales/tr-TR/translations.ts
- packages/i18n/src/locales/it/translations.ts
- packages/i18n/src/locales/id/translations.ts
- packages/i18n/src/locales/fr/translations.ts
- packages/i18n/src/locales/en/translations.ts
🚧 Files skipped from review as they are similar to previous changes (13)
- apps/space/components/issues/issue-layouts/properties/labels.tsx
- packages/i18n/src/locales/ko/translations.ts
- packages/i18n/src/locales/vi-VN/translations.ts
- packages/i18n/src/locales/ru/translations.ts
- packages/i18n/src/locales/ja/translations.ts
- packages/i18n/src/locales/de/translations.ts
- packages/i18n/src/locales/cs/translations.ts
- packages/i18n/src/locales/es/translations.ts
- packages/i18n/src/locales/ua/translations.ts
- packages/i18n/src/locales/sk/translations.ts
- packages/i18n/src/locales/zh-TW/translations.ts
- packages/i18n/src/locales/ro/translations.ts
- packages/i18n/src/locales/pl/translations.ts
| import { useTranslation } from "@plane/i18n"; | ||
| // assets | ||
| import SomethingWentWrongImage from "@/app/assets/something-went-wrong.svg?url"; | ||
|
|
||
| function NotFound() { | ||
| const { t } = useTranslation(); | ||
| return ( | ||
| <div className="grid h-screen w-screen place-items-center bg-surface-1"> | ||
| <div className="text-center"> | ||
| <div className="mx-auto grid size-32 place-items-center rounded-full md:size-52"> | ||
| <div className="grid size-16 place-items-center md:size-32"> | ||
| <img src={SomethingWentWrongImage} alt="Something went wrong" width={128} height={128} /> | ||
| <img | ||
| src={SomethingWentWrongImage} | ||
| alt={t("localized_ui.space_public.something_went_wrong")} | ||
| width={128} | ||
| height={128} | ||
| /> | ||
| </div> | ||
| </div> | ||
| <h1 className="mt-8 text-18 font-semibold md:mt-12 md:text-24">That didn{"'"}t work</h1> | ||
| <p className="mt-2 text-13 md:mt-4 md:text-14"> | ||
| Check the URL you are entering in the browser{"'"}s address bar and try again. | ||
| </p> | ||
| <h1 className="mt-8 text-18 font-semibold md:mt-12 md:text-24"> | ||
| {t("localized_ui.space_public.not_found_title")} | ||
| </h1> | ||
| <p className="mt-2 text-13 md:mt-4 md:text-14">{t("localized_ui.space_public.not_found_hint")}</p> |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Description: Verify that all three translation keys exist in locale files
# Expected locales per PR summary
LOCALES="cs de en es fr id it ja ko pl pt-BR ro ru sk tr-TR ua vi-VN zh-CN zh-TW"
echo "Checking for translation keys in locale files..."
echo "Keys to verify: something_went_wrong, not_found_title, not_found_hint"
echo ""
# Search for the keys in locale files
rg -n --type=ts -g 'packages/i18n/src/locales/*/translations.ts' \
-A 2 'space_public.*:\s*\{' | head -100
echo ""
echo "Verifying each key appears in locale files:"
for key in "something_went_wrong" "not_found_title" "not_found_hint"; do
echo ""
echo "=== Checking $key ==="
count=$(rg -c --type=ts -g 'packages/i18n/src/locales/*/translations.ts' "\"$key\":" | wc -l)
echo "Found in $count locale files"
if [ "$count" -lt 19 ]; then
echo "⚠️ Expected in 19 locale files but found in $count"
fi
doneRepository: makeplane/plane
Length of output: 6187
Translation keys something_went_wrong, not_found_title, and not_found_hint are not defined in any locale files.
The code references these three translation keys under localized_ui.space_public.*, but they do not exist in any of the 19 locale files (packages/i18n/src/locales/{cs,de,en,es,fr,id,it,ja,ko,pl,pt-BR,ro,ru,sk,tr-TR,ua,vi-VN,zh-CN,zh-TW}/translations.ts). This will cause missing translations at runtime. Add these keys to all 19 locale files before merging.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@apps/space/app/not-found.tsx` around lines 7 - 29, The NotFound component
uses translation keys localized_ui.space_public.something_went_wrong,
localized_ui.space_public.not_found_title, and
localized_ui.space_public.not_found_hint via useTranslation's t but those keys
are missing; add these three keys with appropriate translated strings to every
locale translations.ts (all 19 files) under the localized_ui.space_public object
so t(...) resolves at runtime, keeping key names identical to what's used in
NotFound and ensuring each locale has a sensible fallback/translation.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e84bc5da7e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| disabled={!isEditable} | ||
| projectId={projectId?.toString() ?? ""} | ||
| placeholder="Add assignees" | ||
| placeholder={t("work_item.add.assignee")} |
There was a problem hiding this comment.
Use existing issue.add keys for inbox property placeholders
The new placeholders call t("work_item.add.assignee")/t("work_item.add.due_date"), but that namespace does not exist in locale bundles (the existing keys are under issue.add.*). In TranslationStore.t, missing keys fall back to returning the key literal, so users will see raw strings like work_item.add.assignee in the assignee and due-date controls instead of readable text.
Useful? React with 👍 / 👎.
| return ( | ||
| <div className="relative"> | ||
| <FiltersDropdown title="Filters" placement="bottom-end"> | ||
| <FiltersDropdown title={t("filters")} placement="bottom-end"> |
There was a problem hiding this comment.
Replace missing filters key with a defined translation path
This changed the dropdown title to t("filters"), but there is no top-level filters key in the loaded locale dictionaries. Because missing translations resolve to the key string, the button label will display filters verbatim across locales. Use an existing key such as common.filters (or add a real filters entry) to avoid a visible i18n regression.
Useful? React with 👍 / 👎.
| </div> | ||
| ) : ( | ||
| <span className="text-13 text-secondary">Empty</span> | ||
| <span className="text-13 text-secondary">{t("common.empty")}</span> |
There was a problem hiding this comment.
Avoid missing common.empty translation in issue peek due-date
The fallback label now uses t("common.empty"), but common.empty is not defined in the locale resources. In issues without a due date, this renders the raw key text instead of a user-facing label. Reuse an existing key (for example common.none) or add common.empty across locales.
Useful? React with 👍 / 👎.
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/i18n/src/locales/fr/translations.ts`:
- Line 2721: The fr translations file contains several English strings in the
localized_ui entries (e.g., the "Sorry, the page you are looking for cannot be
found..." string and others around the same block) — replace each of those
English strings with their proper French translations in the localized_ui
array/object so the French locale is fully localized; locate the translations.ts
export (the localized_ui / translations object for 'fr') and update the
offending entries (the sentence at the reported location plus the strings around
it) to their correct French equivalents, keeping the same keys/array positions
and punctuation.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 9ed950e4-0613-44f3-b829-2e244b244819
📒 Files selected for processing (50)
apps/space/app/error.tsxapps/space/app/not-found.tsxapps/space/components/account/auth-forms/auth-header.tsxapps/space/components/account/auth-forms/auth-root.tsxapps/space/components/account/auth-forms/email.tsxapps/space/components/account/terms-and-conditions.tsxapps/space/components/account/user-logged-in.tsxapps/space/components/issues/filters/labels.tsxapps/space/components/issues/filters/root.tsxapps/space/components/issues/filters/selection.tsxapps/space/components/issues/filters/state.tsxapps/space/components/issues/issue-layouts/kanban/default.tsxapps/space/components/issues/issue-layouts/kanban/swimlanes.tsxapps/space/components/issues/issue-layouts/list/default.tsxapps/space/components/issues/issue-layouts/properties/all-properties.tsxapps/space/components/issues/issue-layouts/properties/cycle.tsxapps/space/components/issues/issue-layouts/properties/due-date.tsxapps/space/components/issues/issue-layouts/properties/labels.tsxapps/space/components/issues/issue-layouts/properties/member.tsxapps/space/components/issues/issue-layouts/properties/modules.tsxapps/space/components/issues/issue-layouts/properties/priority.tsxapps/space/components/issues/issue-layouts/properties/state.tsxapps/space/components/issues/issue-layouts/utils.tsxapps/space/components/issues/peek-overview/comment/comment-detail-card.tsxapps/space/components/issues/peek-overview/header.tsxapps/space/components/issues/peek-overview/issue-properties.tsxapps/space/components/issues/reactions/issue-vote-reactions.tsxapps/space/hooks/oauth/core.tsxapps/web/core/components/inbox/content/issue-properties.tsxapps/web/core/layouts/auth-layout/workspace-wrapper.tsxpackages/i18n/src/locales/cs/translations.tspackages/i18n/src/locales/de/translations.tspackages/i18n/src/locales/en/translations.tspackages/i18n/src/locales/es/translations.tspackages/i18n/src/locales/fr/translations.tspackages/i18n/src/locales/id/translations.tspackages/i18n/src/locales/it/translations.tspackages/i18n/src/locales/ja/translations.tspackages/i18n/src/locales/ko/translations.tspackages/i18n/src/locales/pl/translations.tspackages/i18n/src/locales/pt-BR/translations.tspackages/i18n/src/locales/ro/translations.tspackages/i18n/src/locales/ru/translations.tspackages/i18n/src/locales/sk/translations.tspackages/i18n/src/locales/tr-TR/translations.tspackages/i18n/src/locales/ua/translations.tspackages/i18n/src/locales/vi-VN/translations.tspackages/i18n/src/locales/zh-CN/translations.tspackages/i18n/src/locales/zh-TW/translations.tspackages/propel/src/banner/banner.tsx
✅ Files skipped from review due to trivial changes (8)
- apps/space/components/account/user-logged-in.tsx
- packages/i18n/src/locales/ro/translations.ts
- packages/i18n/src/locales/en/translations.ts
- packages/i18n/src/locales/id/translations.ts
- packages/i18n/src/locales/it/translations.ts
- packages/i18n/src/locales/vi-VN/translations.ts
- packages/i18n/src/locales/zh-CN/translations.ts
- packages/i18n/src/locales/pt-BR/translations.ts
🚧 Files skipped from review as they are similar to previous changes (41)
- apps/space/components/issues/filters/root.tsx
- apps/space/app/not-found.tsx
- apps/space/components/issues/peek-overview/comment/comment-detail-card.tsx
- apps/space/components/issues/issue-layouts/properties/state.tsx
- apps/space/components/issues/issue-layouts/properties/all-properties.tsx
- apps/space/components/issues/issue-layouts/properties/cycle.tsx
- packages/propel/src/banner/banner.tsx
- apps/space/app/error.tsx
- apps/space/components/issues/filters/state.tsx
- apps/space/components/issues/issue-layouts/properties/member.tsx
- apps/space/components/issues/issue-layouts/properties/priority.tsx
- apps/space/components/issues/issue-layouts/list/default.tsx
- apps/space/components/issues/issue-layouts/properties/due-date.tsx
- apps/space/components/issues/issue-layouts/kanban/default.tsx
- apps/space/components/issues/filters/selection.tsx
- apps/space/components/issues/peek-overview/issue-properties.tsx
- apps/web/core/components/inbox/content/issue-properties.tsx
- apps/space/hooks/oauth/core.tsx
- apps/space/components/issues/issue-layouts/kanban/swimlanes.tsx
- apps/space/components/issues/reactions/issue-vote-reactions.tsx
- apps/web/core/layouts/auth-layout/workspace-wrapper.tsx
- apps/space/components/account/auth-forms/email.tsx
- apps/space/components/issues/issue-layouts/properties/labels.tsx
- apps/space/components/account/auth-forms/auth-root.tsx
- apps/space/components/issues/filters/labels.tsx
- apps/space/components/account/auth-forms/auth-header.tsx
- packages/i18n/src/locales/es/translations.ts
- packages/i18n/src/locales/ua/translations.ts
- apps/space/components/issues/peek-overview/header.tsx
- apps/space/components/account/terms-and-conditions.tsx
- apps/space/components/issues/issue-layouts/properties/modules.tsx
- packages/i18n/src/locales/zh-TW/translations.ts
- packages/i18n/src/locales/pl/translations.ts
- packages/i18n/src/locales/ko/translations.ts
- packages/i18n/src/locales/ru/translations.ts
- packages/i18n/src/locales/de/translations.ts
- packages/i18n/src/locales/sk/translations.ts
- packages/i18n/src/locales/tr-TR/translations.ts
- packages/i18n/src/locales/ja/translations.ts
- packages/i18n/src/locales/cs/translations.ts
- apps/space/components/issues/issue-layouts/utils.tsx
Co-authored-by: Codex <noreply@openai.com>
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 059867a49c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| name="password" | ||
| value={passwordFormData.password} | ||
| onChange={(e) => handleFormChange("password", e.target.value)} | ||
| placeholder="Enter password" | ||
| placeholder={t("localized_ui.space_auth.enter_password")} | ||
| className="h-10 w-full border border-subtle !bg-surface-1 pr-12 disable-autofill-style placeholder:text-placeholder" | ||
| onFocus={() => setIsPasswordInputFocused(true)} | ||
| onBlur={() => setIsPasswordInputFocused(false)} | ||
| autoComplete="off" | ||
| autoFocus | ||
| /> |
There was a problem hiding this comment.
Restore mount-time focus for password entry
The password step no longer sets initial focus on its primary input after autoFocus was removed, so users who submit the email step and immediately start typing are left with focus on the prior element instead of the password field. This regresses keyboard-first sign-in/sign-up flows and can cause Enter/typing to behave unexpectedly until the user clicks into the input.
Useful? React with 👍 / 👎.
| placeholder="123456" | ||
| className="h-10 w-full border border-subtle !bg-surface-1 pr-12 disable-autofill-style placeholder:text-placeholder" | ||
| autoComplete="off" | ||
| autoFocus | ||
| /> |
There was a problem hiding this comment.
Restore initial focus on unique-code input
The unique-code form also lost its input autofocus in this change, so when users switch to the OTP step they cannot immediately paste or type the code without first clicking the field. That is a direct usability regression for the email-code auth path and slows down the primary verification flow.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/i18n/src/locales/zh-TW/translations.ts`:
- Line 2780: The translation for the key unique_code in the space_auth flow uses
"獨特的程式碼" which is inconsistent with surrounding keys that use "唯一代碼"/"代碼";
update the value of unique_code in
packages/i18n/src/locales/zh-TW/translations.ts to use the same terminology
(e.g., "唯一代碼") so the space_auth glossary is consistent with nearby keys like
those using "唯一代碼" or "代碼".
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: d6885e5e-c101-4f87-9286-ff4deb5da863
📒 Files selected for processing (17)
packages/i18n/src/locales/cs/translations.tspackages/i18n/src/locales/de/translations.tspackages/i18n/src/locales/es/translations.tspackages/i18n/src/locales/fr/translations.tspackages/i18n/src/locales/id/translations.tspackages/i18n/src/locales/it/translations.tspackages/i18n/src/locales/ja/translations.tspackages/i18n/src/locales/ko/translations.tspackages/i18n/src/locales/pl/translations.tspackages/i18n/src/locales/ro/translations.tspackages/i18n/src/locales/ru/translations.tspackages/i18n/src/locales/sk/translations.tspackages/i18n/src/locales/tr-TR/translations.tspackages/i18n/src/locales/ua/translations.tspackages/i18n/src/locales/vi-VN/translations.tspackages/i18n/src/locales/zh-CN/translations.tspackages/i18n/src/locales/zh-TW/translations.ts
✅ Files skipped from review due to trivial changes (10)
- packages/i18n/src/locales/tr-TR/translations.ts
- packages/i18n/src/locales/ko/translations.ts
- packages/i18n/src/locales/it/translations.ts
- packages/i18n/src/locales/ru/translations.ts
- packages/i18n/src/locales/id/translations.ts
- packages/i18n/src/locales/ro/translations.ts
- packages/i18n/src/locales/cs/translations.ts
- packages/i18n/src/locales/ua/translations.ts
- packages/i18n/src/locales/zh-CN/translations.ts
- packages/i18n/src/locales/vi-VN/translations.ts
🚧 Files skipped from review as they are similar to previous changes (6)
- packages/i18n/src/locales/sk/translations.ts
- packages/i18n/src/locales/de/translations.ts
- packages/i18n/src/locales/fr/translations.ts
- packages/i18n/src/locales/ja/translations.ts
- packages/i18n/src/locales/pl/translations.ts
- packages/i18n/src/locales/es/translations.ts
Co-authored-by: Codex <noreply@openai.com>
Description
This PR improves Plane's existing i18n coverage by completing Simplified Chinese translations, moving several hardcoded non-admin UI surfaces behind translation keys, and translating the new
localized_uinamespace across every existing locale in this repository.Scope notes:
cs,de,en,es,fr,id,it,ja,ko,pl,pt-BR,ro,ru,sk,tr-TR,ua,vi-VN,zh-CN, andzh-TW.Changes:
localized_uitranslation group across all 19 locale files.All work itemsandNone@plane/i18nas an editor workspace dependency so editor UI text can follow the selected language.localized_uiblocks instead of leaving English fallback textaria-labelType of Change
Screenshots and Media (if applicable)
Not included. This is a text/i18n wiring change; affected screens render the same layout with localized copy.
Test Scenarios
pnpm installpnpm fix:formatpnpm turbo run check:lint --filter=web --filter=space --filter=@plane/i18n --filter=@plane/editor --filter=@plane/propelpnpm turbo run check:types --filter=@plane/i18n --filter=@plane/editor --filter=web --filter=space --filter=@plane/propelpnpm checklocalized_ui.*key set; current check reports 19 locales and 641localized_uikeys.localized_uiblocks no longer use English fallback values except intentionally shared product/provider labels.license/clais passing; CodeRabbit re-review is still in progress.References
Related to existing zh-CN/i18n work in #8866 and #8910.
Summary by CodeRabbit
New Features
Style / Accessibility
Chores