From c79e1c097b7bc57da8468c94a7422d8933e55ff5 Mon Sep 17 00:00:00 2001
From: mors <176447100+mors119@users.noreply.github.com>
Date: Fri, 4 Sep 2026 07:07:42 +0900
Subject: [PATCH] fix(i18n): localize remaining onboarding UI
Reviewed and approved by Codex.
---
.../onboarding/IntegrationsStep.tsx | 32 +++++++++++----
.../components/onboarding/OnboardingFlow.tsx | 40 +++++++++++++++----
.../OnboardingSkipConfirmationDialog.tsx | 8 +++-
.../src/components/onboarding/ThemeStep.tsx | 6 +--
.../onboarding/use-onboarding-flow-actions.ts | 11 ++++-
src/renderer/src/i18n/locales/en.json | 35 ++++++++++++++++
src/renderer/src/i18n/locales/ko.json | 35 ++++++++++++++++
7 files changed, 144 insertions(+), 23 deletions(-)
diff --git a/src/renderer/src/components/onboarding/IntegrationsStep.tsx b/src/renderer/src/components/onboarding/IntegrationsStep.tsx
index 161ea88a9f5..c65e68099f8 100644
--- a/src/renderer/src/components/onboarding/IntegrationsStep.tsx
+++ b/src/renderer/src/components/onboarding/IntegrationsStep.tsx
@@ -211,17 +211,33 @@ export function LinearRow(props: { compact?: boolean } = {}): React.JSX.Element
onOpenChange={setDialogOpen}
overlayClassName="z-[110]"
contentClassName="z-[120]"
- connectLabel="Add Linear access"
+ connectLabel={translate(
+ 'auto.components.onboarding.IntegrationsStep.04ef416712',
+ 'Add Linear access'
+ )}
/>
>
)
}
const CAPABILITIES = [
- 'Start a workspace from any GitHub issue or pull request, prefilled with its title and context',
- 'Browse GitHub issues and pull requests in the Tasks view without leaving Orca',
- 'See issue state, review status, and CI checks on every worktree',
- 'Read, comment on, and merge pull requests without leaving Orca'
+ {
+ key: 'components.onboarding.integrations.capabilities.startWorkspaceFromIssue',
+ fallback:
+ 'Start a workspace from any GitHub issue or pull request, prefilled with its title and context'
+ },
+ {
+ key: 'components.onboarding.integrations.capabilities.browseIssues',
+ fallback: 'Browse GitHub issues and pull requests in the Tasks view without leaving Orca'
+ },
+ {
+ key: 'components.onboarding.integrations.capabilities.reviewStatus',
+ fallback: 'See issue state, review status, and CI checks on every worktree'
+ },
+ {
+ key: 'components.onboarding.integrations.capabilities.managePullRequests',
+ fallback: 'Read, comment on, and merge pull requests without leaving Orca'
+ }
] as const
export function IntegrationsStep(): React.JSX.Element {
@@ -234,10 +250,10 @@ export function IntegrationsStep(): React.JSX.Element {
return (
- {CAPABILITIES.map((line) => (
- -
+ {CAPABILITIES.map(({ key, fallback }) => (
+
-
- {line}
+ {translate(key, fallback)}
))}
diff --git a/src/renderer/src/components/onboarding/OnboardingFlow.tsx b/src/renderer/src/components/onboarding/OnboardingFlow.tsx
index 9e82e42547c..c57e2556014 100644
--- a/src/renderer/src/components/onboarding/OnboardingFlow.tsx
+++ b/src/renderer/src/components/onboarding/OnboardingFlow.tsx
@@ -90,11 +90,31 @@ const stepCopy = {
} as const
const stepTooltipLabels = {
- agent: 'Default Agent',
- theme: 'Appearance',
- windows_terminal: 'Windows Terminal',
- notifications: 'Notifications',
- integrations: 'Integrations'
+ agent: {
+ get value() {
+ return translate('components.onboarding.flow.stepTooltip.agent', 'Default Agent')
+ }
+ },
+ theme: {
+ get value() {
+ return translate('components.onboarding.flow.stepTooltip.theme', 'Appearance')
+ }
+ },
+ windows_terminal: {
+ get value() {
+ return translate('components.onboarding.flow.stepTooltip.windowsTerminal', 'Windows Terminal')
+ }
+ },
+ notifications: {
+ get value() {
+ return translate('components.onboarding.flow.stepTooltip.notifications', 'Notifications')
+ }
+ },
+ integrations: {
+ get value() {
+ return translate('components.onboarding.flow.stepTooltip.integrations', 'Integrations')
+ }
+ }
} as const
type OnboardingFlowProps = {
@@ -113,7 +133,10 @@ export default function OnboardingFlow({
const shouldShowSkipToProjectSetup = currentStep.id !== 'notifications'
const shouldShowFooterBusy = Boolean(busyLabel)
const footerPrimaryLabel =
- busyLabel ?? (currentStep.id === 'notifications' ? 'Add your first project' : 'Continue')
+ busyLabel ??
+ (currentStep.id === 'notifications'
+ ? translate('components.onboarding.flow.actions.addFirstProject', 'Add your first project')
+ : translate('components.onboarding.flow.actions.continue', 'Continue'))
const [skipConfirmOpen, setSkipConfirmOpen] = useState(false)
const skipConfirmAdvancedViaRef = useRef<'button' | 'keyboard'>('button')
const { next: flowNext, dismissOnboarding: flowDismissOnboarding } = flow
@@ -218,6 +241,7 @@ export default function OnboardingFlow({
{flow.progressSteps.map(({ step, index: realStepIndex }, progressIdx) => {
const isActive = realStepIndex === stepIndex
const isDone = realStepIndex < stepIndex
+ const stepTooltipLabel = stepTooltipLabels[step.id].value
return (
@@ -236,14 +260,14 @@ export default function OnboardingFlow({
aria-label={translate(
'auto.components.onboarding.OnboardingFlow.adaa0aa627',
'Go to onboarding step {{value0}}: {{value1}}',
- { value0: progressIdx + 1, value1: stepTooltipLabels[step.id] }
+ { value0: progressIdx + 1, value1: stepTooltipLabel }
)}
aria-current={isActive ? 'step' : undefined}
onClick={() => flow.jumpToStep(realStepIndex)}
/>
- {stepTooltipLabels[step.id]}
+ {stepTooltipLabel}
)
diff --git a/src/renderer/src/components/onboarding/OnboardingSkipConfirmationDialog.tsx b/src/renderer/src/components/onboarding/OnboardingSkipConfirmationDialog.tsx
index 1a721a6d774..6851ea83399 100644
--- a/src/renderer/src/components/onboarding/OnboardingSkipConfirmationDialog.tsx
+++ b/src/renderer/src/components/onboarding/OnboardingSkipConfirmationDialog.tsx
@@ -22,8 +22,12 @@ export const ONBOARDING_SKIP_CONFIRMATION_COPY = {
"It won't take long!"
)
},
- skipLabel: 'Skip',
- keepGoingLabel: 'No, keep going'
+ get skipLabel() {
+ return translate('components.onboarding.skipConfirmation.skip', 'Skip')
+ },
+ get keepGoingLabel() {
+ return translate('components.onboarding.skipConfirmation.keepGoing', 'No, keep going')
+ }
} as const
export function OnboardingSkipConfirmationDialog(props: {
diff --git a/src/renderer/src/components/onboarding/ThemeStep.tsx b/src/renderer/src/components/onboarding/ThemeStep.tsx
index bb797a12a6e..0929aba0d59 100644
--- a/src/renderer/src/components/onboarding/ThemeStep.tsx
+++ b/src/renderer/src/components/onboarding/ThemeStep.tsx
@@ -195,19 +195,19 @@ export function ThemeStep({ theme, onThemeChange, settings, updateSettings }: Th
{
id: 'system',
label: translate('auto.components.onboarding.ThemeStep.827ea7b4a2', 'System'),
- hint: 'Match OS',
+ hint: translate('components.onboarding.theme.hints.system', 'Match OS'),
icon: Monitor
},
{
id: 'dark',
label: translate('auto.components.onboarding.ThemeStep.fa7b673ea9', 'Dark'),
- hint: 'Easy on the eyes',
+ hint: translate('components.onboarding.theme.hints.dark', 'Easy on the eyes'),
icon: Moon
},
{
id: 'light',
label: translate('auto.components.onboarding.ThemeStep.ad192706e6', 'Light'),
- hint: 'Bright & crisp',
+ hint: translate('components.onboarding.theme.hints.light', 'Bright & crisp'),
icon: Sun
}
]
diff --git a/src/renderer/src/components/onboarding/use-onboarding-flow-actions.ts b/src/renderer/src/components/onboarding/use-onboarding-flow-actions.ts
index 9216de04e61..9fac360b162 100644
--- a/src/renderer/src/components/onboarding/use-onboarding-flow-actions.ts
+++ b/src/renderer/src/components/onboarding/use-onboarding-flow-actions.ts
@@ -117,7 +117,12 @@ export function useOnboardingFlowActions({
if (result.ok) {
trackCurrentStepCompleted(advancedVia)
if (currentStep.id === 'notifications') {
- setBusyLabel('Opening Add Project...')
+ setBusyLabel(
+ translate(
+ 'components.onboarding.flow.actions.openingAddProject',
+ 'Opening Add Project...'
+ )
+ )
const closed = await closeWith('completed', ONBOARDING_FINAL_STEP, 'add_project_modal')
if (closed) {
openModal('add-repo')
@@ -190,7 +195,9 @@ export function useOnboardingFlowActions({
const stepId = currentStep.id
const stepNumber = currentStep.stepNumber
const valueKind = currentStep.valueKind
- setBusyLabel('Opening Add Project...')
+ setBusyLabel(
+ translate('components.onboarding.flow.actions.openingAddProject', 'Opening Add Project...')
+ )
try {
const closed = await closeWith('completed', ONBOARDING_FINAL_STEP, 'add_project_modal')
if (!closed) {
diff --git a/src/renderer/src/i18n/locales/en.json b/src/renderer/src/i18n/locales/en.json
index 712df329873..57db52974bd 100644
--- a/src/renderer/src/i18n/locales/en.json
+++ b/src/renderer/src/i18n/locales/en.json
@@ -16820,6 +16820,41 @@
}
},
"components": {
+ "onboarding": {
+ "flow": {
+ "stepTooltip": {
+ "agent": "Default Agent",
+ "theme": "Appearance",
+ "windowsTerminal": "Windows Terminal",
+ "notifications": "Notifications",
+ "integrations": "Integrations"
+ },
+ "actions": {
+ "addFirstProject": "Add your first project",
+ "continue": "Continue",
+ "openingAddProject": "Opening Add Project..."
+ }
+ },
+ "skipConfirmation": {
+ "skip": "Skip",
+ "keepGoing": "No, keep going"
+ },
+ "theme": {
+ "hints": {
+ "system": "Match OS",
+ "dark": "Easy on the eyes",
+ "light": "Bright & crisp"
+ }
+ },
+ "integrations": {
+ "capabilities": {
+ "startWorkspaceFromIssue": "Start a workspace from any GitHub issue or pull request, prefilled with its title and context",
+ "browseIssues": "Browse GitHub issues and pull requests in the Tasks view without leaving Orca",
+ "reviewStatus": "See issue state, review status, and CI checks on every worktree",
+ "managePullRequests": "Read, comment on, and merge pull requests without leaving Orca"
+ }
+ }
+ },
"jiraUserPicker": {
"select": "Select {{value0}}",
"search": "Search users",
diff --git a/src/renderer/src/i18n/locales/ko.json b/src/renderer/src/i18n/locales/ko.json
index 47d9e48fd26..d05754d176e 100644
--- a/src/renderer/src/i18n/locales/ko.json
+++ b/src/renderer/src/i18n/locales/ko.json
@@ -14616,6 +14616,41 @@
}
},
"components": {
+ "onboarding": {
+ "flow": {
+ "stepTooltip": {
+ "agent": "기본 Agent",
+ "theme": "테마",
+ "windowsTerminal": "Windows 터미널",
+ "notifications": "알림",
+ "integrations": "연동"
+ },
+ "actions": {
+ "addFirstProject": "첫 프로젝트 추가",
+ "continue": "계속",
+ "openingAddProject": "프로젝트 추가 화면을 여는 중…"
+ }
+ },
+ "skipConfirmation": {
+ "skip": "건너뛰기",
+ "keepGoing": "아니요, 계속하기"
+ },
+ "theme": {
+ "hints": {
+ "system": "OS 설정에 맞춤",
+ "dark": "눈이 편안한 화면",
+ "light": "밝고 선명한 화면"
+ }
+ },
+ "integrations": {
+ "capabilities": {
+ "startWorkspaceFromIssue": "GitHub 이슈나 PR에서 제목과 컨텍스트가 미리 채워진 워크스페이스를 시작합니다",
+ "browseIssues": "Orca를 떠나지 않고 작업 화면에서 GitHub 이슈와 PR을 탐색합니다",
+ "reviewStatus": "모든 워크트리에서 이슈 상태, 리뷰 상태 및 CI 체크를 확인합니다",
+ "managePullRequests": "Orca를 떠나지 않고 PR을 읽고, 댓글을 달고, 병합합니다"
+ }
+ }
+ },
"native-chat": {
"composer": {
"imageUnsupported": "이 에이전트는 이미지 붙여넣기를 지원하지 않습니다.",