- {translate('auto.components.jira.connect.dialog.8090504a3e', 'Create a token in')}{' '}
-
- .
+ components={{
+ link: (
+
{supportsScopedTokens
diff --git a/src/renderer/src/components/jira-issue-workspace-actions.ts b/src/renderer/src/components/jira-issue-workspace-actions.ts
index 2e3287bb45a..137977559d6 100644
--- a/src/renderer/src/components/jira-issue-workspace-actions.ts
+++ b/src/renderer/src/components/jira-issue-workspace-actions.ts
@@ -11,6 +11,11 @@ import { applyJiraIssueKeyCasing } from '../../../shared/workspace-name'
import type { WorkspaceSeedNameOptions } from '../../../shared/workspace-name'
import { getJiraIssueKeyCasingSeedOptions } from '@/lib/jira-issue-key-casing'
import { buildJiraIssuePrompt } from './jira-prompt-templates'
+import {
+ issueCopiedMessage,
+ issueCopyFailedMessage,
+ type IssueCopyTarget
+} from './issue-copy-target-messages'
import type { JiraIssueWorkspaceAction } from './jira-issue-workspace-content'
export function useJiraIssueWorkspaceActions({
@@ -77,21 +82,16 @@ export function buildJiraBranchName(
)
}
-export async function copyJiraTextToClipboard(text: string, label: string): Promise {
+export async function copyJiraTextToClipboard(
+ text: string,
+ target: IssueCopyTarget
+): Promise {
try {
await window.api.ui.writeClipboardText(text)
- toast.success(
- translate('auto.components.JiraIssueWorkspace.2ff69a3545', '{{value0}} copied', {
- value0: label
- })
- )
+ toast.success(issueCopiedMessage(target))
return true
} catch {
- toast.error(
- translate('auto.components.JiraIssueWorkspace.6c41a9bcea', 'Failed to copy {{value0}}', {
- value0: label.toLowerCase()
- })
- )
+ toast.error(issueCopyFailedMessage(target))
return false
}
}
@@ -106,12 +106,12 @@ export function getJiraIssueWorkspaceActions(issue: JiraIssue): JiraIssueWorkspa
{
label: translate('auto.components.JiraIssueWorkspace.779bb91ee0', 'Copy URL'),
icon: Clipboard,
- action: () => void copyJiraTextToClipboard(issue.url, 'URL')
+ action: () => void copyJiraTextToClipboard(issue.url, 'url')
},
{
label: translate('auto.components.JiraIssueWorkspace.38839801e8', 'Copy key'),
icon: Clipboard,
- action: () => void copyJiraTextToClipboard(issue.key, 'Key')
+ action: () => void copyJiraTextToClipboard(issue.key, 'key')
},
{
label: translate(
@@ -122,13 +122,13 @@ export function getJiraIssueWorkspaceActions(issue: JiraIssue): JiraIssueWorkspa
action: () =>
void copyJiraTextToClipboard(
buildJiraBranchName(issue, getJiraIssueKeyCasingSeedOptions()),
- 'Branch name'
+ 'branchName'
)
},
{
label: translate('auto.components.JiraIssueWorkspace.0cc62bd690', 'Copy prompt'),
icon: Clipboard,
- action: () => void copyJiraTextToClipboard(buildJiraIssuePrompt(issue), 'Prompt')
+ action: () => void copyJiraTextToClipboard(buildJiraIssuePrompt(issue), 'prompt')
}
]
}
diff --git a/src/renderer/src/components/jira-list-columns.ts b/src/renderer/src/components/jira-list-columns.ts
index 8c6c7844f6b..9d755b660f2 100644
--- a/src/renderer/src/components/jira-list-columns.ts
+++ b/src/renderer/src/components/jira-list-columns.ts
@@ -1,5 +1,6 @@
import type { CSSProperties } from 'react'
import { translate } from '@/i18n/i18n'
+import { formatUiNarrowDuration } from '@/i18n/relative-time-format'
export type JiraListColumnId =
| 'key'
@@ -161,11 +162,18 @@ export function formatJiraEstimate(seconds: number | undefined): string {
return '–'
}
if (seconds === 0) {
- return '0m'
+ return formatUiNarrowDuration(0, 'minute')
}
const hours = Math.floor(seconds / 3600)
const minutes = Math.floor((seconds % 3600) / 60)
- return [hours ? `${hours}h` : '', minutes ? `${minutes}m` : ''].filter(Boolean).join(' ') || '<1m'
+ return (
+ [
+ hours ? formatUiNarrowDuration(hours, 'hour') : '',
+ minutes ? formatUiNarrowDuration(minutes, 'minute') : ''
+ ]
+ .filter(Boolean)
+ .join(' ') || `<${formatUiNarrowDuration(1, 'minute')}`
+ )
}
export function formatJiraStoryPoints(points: number | undefined): string {
diff --git a/src/renderer/src/components/landing-preflight-issues.ts b/src/renderer/src/components/landing-preflight-issues.ts
index 96992d4514d..9a7ba5fd7af 100644
--- a/src/renderer/src/components/landing-preflight-issues.ts
+++ b/src/renderer/src/components/landing-preflight-issues.ts
@@ -40,7 +40,7 @@ export function getLandingPreflightIssues(
'auto.components.Landing.b673e7cf1b',
'Git is required for Git projects, source control, and workspace management.'
),
- fixLabel: 'Install Git',
+ fixLabel: translate('auto.components.Landing.installGit', 'Install Git'),
fixUrl: 'https://git-scm.com/downloads'
})
}
@@ -58,7 +58,7 @@ export function getLandingPreflightIssues(
'auto.components.Landing.73e1ad4282',
'Orca uses the GitHub CLI (gh) to show pull requests, issues, and checks.'
),
- fixLabel: 'Install GitHub CLI',
+ fixLabel: translate('auto.components.Landing.installGitHubCli', 'Install GitHub CLI'),
fixUrl: 'https://cli.github.com',
dismissible: true
})
@@ -70,7 +70,7 @@ export function getLandingPreflightIssues(
'auto.components.Landing.00cee697c1',
'Run "gh auth login" in a terminal to connect your GitHub account.'
),
- fixLabel: 'Learn more',
+ fixLabel: translate('auto.components.Landing.learnMore', 'Learn more'),
fixUrl: 'https://cli.github.com/manual/gh_auth_login',
dismissible: true
})
diff --git a/src/renderer/src/components/linear-issue-activity.tsx b/src/renderer/src/components/linear-issue-activity.tsx
index 68a74583f3b..f088634fbfb 100644
--- a/src/renderer/src/components/linear-issue-activity.tsx
+++ b/src/renderer/src/components/linear-issue-activity.tsx
@@ -71,10 +71,20 @@ export function LinearIssueActivity({
className="size-5"
/>
- {issue.assignee?.displayName ??
- translate('auto.components.LinearIssueWorkspace.8a33c85e9c', 'Someone')}{' '}
- {translate('auto.components.LinearIssueWorkspace.fabbd3f974', 'updated the issue ·')}{' '}
- {formatLinearIssueRelativeTime(issue.updatedAt)}
+ {issue.assignee?.displayName
+ ? translate(
+ 'auto.components.LinearIssueWorkspace.namedUserUpdatedIssue',
+ '{{name}} updated the issue · {{time}}',
+ {
+ name: issue.assignee.displayName,
+ time: formatLinearIssueRelativeTime(issue.updatedAt)
+ }
+ )
+ : translate(
+ 'auto.components.LinearIssueWorkspace.someoneUpdatedIssue',
+ 'Someone updated the issue · {{time}}',
+ { time: formatLinearIssueRelativeTime(issue.updatedAt) }
+ )}
diff --git a/src/renderer/src/components/linear-issue-clipboard.ts b/src/renderer/src/components/linear-issue-clipboard.ts
index bc11eafc37f..88ec8bee012 100644
--- a/src/renderer/src/components/linear-issue-clipboard.ts
+++ b/src/renderer/src/components/linear-issue-clipboard.ts
@@ -1,20 +1,16 @@
import { toast } from 'sonner'
-import { translate } from '@/i18n/i18n'
+import {
+ issueCopiedMessage,
+ issueCopyFailedMessage,
+ type IssueCopyTarget
+} from './issue-copy-target-messages'
-export async function copyLinearIssueText(text: string, label: string): Promise