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 (
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": "이 에이전트는 이미지 붙여넣기를 지원하지 않습니다.",