Files
openchamber/packages/ui/src/lib/i18n/messages/linear-panel.i18n.ts
T
Alex Kutas 49f0a9e62f OPE-296: Add linear integration for starting sessions from issues (#3235)
* feat(linear): start sessions from Linear issues
Authorize a Linear workspace on this OpenChamber server, map teams to
projects, attach an issue from chat, start a session or worktree from an
issue, and post started/completed/failed comments that open the session.
Hidden in VS Code.

* feat(linear): connect more than one Linear workspace

Store each OAuth grant on this OpenChamber server and keep one current, so Settings can add and switch workspaces without dropping the others. Project mapping is per workspace. Remove the Linear button next to New Chat; start-from-issue stays on New Worktree.

* feat(linear): add a right-hand issues panel

Browse and filter issues in the rail, open a card to change status or start a session, and collapse search plus most filters to icons on a narrow panel.

* feat(linear): open issues in the rail and filter by Linear status

The rail icon only shows after Linear is connected. Clicking a Linear row on work status opens the panel. Status options match the card, including Done, Canceled, and Duplicate. The Integrations experimental warning sits under Third-party integrations.

* fix(linear): use stable OAuth callback broker

* fix(chat): preview Linear issue attachments

The context switch missed linear-issue, so tsc treated the preview helpers as incomplete.

* fix(ui): restore Linear i18n parity and the #2903 sync harness

Turkish was missing the Linear dictionaries, and the subagent test still wrapped only SyncContext after reads moved to SyncRuntimeContext.

* fix(linear): drop changelog hunks and close review races

Keep changelogs out of this PR, restore CodeMirror ranges, ignore stale Linear list pages, and leave a persisted Linear tab open until auth has actually resolved.

* fix(linear): tint active issue filters and clear them in one click

* fix(markdown): read escaped brackets as text, not display math

`\[...\]` is display math in LaTeX and an escaped bracket pair in
CommonMark. The block tokenizer claimed every `\[`, so prose like
`[title \[Bug\] more](url)` was handed to KaTeX: "Bug" rendered as a
centered formula and the block token split the paragraph, tearing the
link into three pieces. Linear, GitHub and any other source that escapes
brackets the way CommonMark requires hit this.

Display math now has to own its line — `\[` starts one and `\]` ends
one. A formula on its own line still renders; `\[` mid-sentence stays an
escape, which is what CommonMark says it is and what prose almost always
means. Inline `\(...\)` keeps the same ambiguity, but inline math is
legitimately mid-sentence, so there is no position to judge it by.

Covered by regression tests, including the verbatim comment body that
surfaced this.

* feat(linear): make session status comments opt-in and public-only

A status comment lands in a Linear workspace the whole team reads, and
the link it carried pointed at whatever origin started the session —
usually loopback or a LAN address. Everyone but its author got a dead
link, and nobody had agreed to the comments in the first place.

Comments are now off until the user turns them on in Settings ->
Integrations -> Linear, and the check lives on the server: the event hub
posts completed and failure without going through the interface, so a
client-side gate would not hold. When the resolved origin is not
publicly reachable the server posts nothing at all rather than a link
only its author can open; `isPublicSessionOrigin` rejects loopback,
private LAN, carrier-grade NAT, link-local and single-label hosts. The
desktop deep-link origin is gone with it, since no one else can follow
one either.

The comment body also dropped the session title. It repeated the issue
the comment already sits on, and issue titles routinely carry brackets
("[Bug] ...") that broke the markdown link. The body is now one short
link, and `sessionTitle` is gone from the route, client and types.

Also caps the dedupe file at the newest 500 sessions; it grew forever.

* fix(linear): match the pull request panel and clear review findings

Comments in the Linear panel now render as the same avatar timeline the
pull request panel uses, with the shared time-format preference instead
of a raw locale string. Comment authors carry `avatarUrl`, which the
GraphQL selection was not requesting.

Review findings from the same pass:

- `status-runtime.js` hand-rolled `typeof` narrowing and failed the
  vendored anti-slop lint; it now parses through `parse.js` like every
  other file in the module.
- `useLinearAuthStore` turned any failed request into `connected: false`
  with `hasChecked: true`. Since the rail icon, the composer entry and
  the worktree option all gate on `connected === true`, one network blip
  hid Linear for the rest of the session, and Settings only re-checked
  when it had never checked. It now keeps the last known status and
  leaves `hasChecked` false so the next caller retries.
- `LinearIssuesView` (1096 lines) was a static import in `ContextPanel`,
  shipping in the main bundle although its rail icon stays hidden until
  a workspace is connected. It is lazy now, like `GitView`.
- Dropped dead code: the unused port helpers left over from the loopback
  callback, two re-exported default values nothing read, and a redundant
  export in `linkedIssues`.
- Integrations is no longer badged beta.
2026-08-30 02:18:40 +03:00

628 lines
40 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/** Linear context-rail panel strings — merged into each locale's main dictionary. */
export const linearPanelI18n = {
en: {
'contextPanel.mode.linear': 'Linear',
'contextRail.surface.linear.description': 'Browse Linear issues, change status, and start a session',
'contextPanel.linear.actions.backToList': 'Back to issues',
'contextPanel.linear.actions.startSession': 'Start session',
'contextPanel.linear.actions.closeIssue': 'Close issue',
'contextPanel.linear.actions.closeSearch': 'Close search',
'contextPanel.linear.label.status': 'Status',
'contextPanel.linear.label.team': 'Team',
'contextPanel.linear.label.assignee': 'Assignee',
'contextPanel.linear.label.unassigned': 'Unassigned',
'contextPanel.linear.label.priority': 'Priority',
'contextPanel.linear.label.labels': 'Labels',
'contextPanel.linear.priority.none': 'No priority',
'contextPanel.linear.priority.urgent': 'Urgent',
'contextPanel.linear.priority.high': 'High',
'contextPanel.linear.priority.medium': 'Medium',
'contextPanel.linear.priority.low': 'Low',
'contextPanel.linear.label.comments': 'Comments',
'contextPanel.linear.label.statusAria': 'Linear issue status',
'contextPanel.linear.label.workspace': 'Workspace',
'contextPanel.linear.label.workspaceAria': 'Linear workspace',
'contextPanel.linear.filter.statusAria': 'Filter issues by status',
'contextPanel.linear.filter.assigneeAria': 'Filter issues by assignee',
'contextPanel.linear.filter.teamAria': 'Filter issues by team',
'contextPanel.linear.filter.priorityAria': 'Filter issues by priority',
'contextPanel.linear.filter.searchAria': 'Search issues',
'contextPanel.linear.filter.clear': 'Clear',
'contextPanel.linear.filter.clearAria': 'Clear issue filters',
'contextPanel.linear.filter.status.all': 'All',
'contextPanel.linear.filter.status.backlog': 'Backlog',
'contextPanel.linear.filter.status.todo': 'To Do',
'contextPanel.linear.filter.status.started': 'In Progress',
'contextPanel.linear.filter.status.inReview': 'In Review',
'contextPanel.linear.filter.status.completed': 'Done',
'contextPanel.linear.filter.status.canceled': 'Canceled',
'contextPanel.linear.filter.status.duplicate': 'Duplicate',
'contextPanel.linear.filter.assignee.any': 'Anyone',
'contextPanel.linear.filter.assignee.me': 'Assigned to me',
'contextPanel.linear.filter.team.all': 'All teams',
'contextPanel.linear.filter.priority.all': 'All priorities',
'contextPanel.linear.empty.noDescription': 'No description',
'contextPanel.linear.empty.noComments': 'No comments',
'contextPanel.linear.empty.noMatchingIssues': 'No issues match these filters',
'contextPanel.linear.loading.issue': 'Loading issue…',
'contextPanel.linear.toast.statusUpdated': 'Issue status updated',
'contextPanel.linear.toast.statusUpdateFailed': 'Could not update issue status',
'contextPanel.linear.toast.closeFailed': 'Could not close issue',
'contextPanel.linear.toast.workspaceSwitched': 'Switched Linear workspace',
'contextPanel.linear.toast.workspaceSwitchFailed': 'Could not switch Linear workspace',
'contextPanel.linear.error.noCompletedState': 'This team has no completed status',
},
de: {
'contextPanel.mode.linear': 'Linear',
'contextRail.surface.linear.description': 'Linear-Issues durchsuchen, Status ändern und eine Sitzung starten',
'contextPanel.linear.actions.backToList': 'Zurück zu den Issues',
'contextPanel.linear.actions.startSession': 'Sitzung starten',
'contextPanel.linear.actions.closeIssue': 'Issue schließen',
'contextPanel.linear.actions.closeSearch': 'Suche schließen',
'contextPanel.linear.label.status': 'Status',
'contextPanel.linear.label.team': 'Team',
'contextPanel.linear.label.assignee': 'Zugewiesen',
'contextPanel.linear.label.unassigned': 'Nicht zugewiesen',
'contextPanel.linear.label.priority': 'Priorität',
'contextPanel.linear.label.labels': 'Kennzeichnungen',
'contextPanel.linear.priority.none': 'Keine Priorität',
'contextPanel.linear.priority.urgent': 'Dringend',
'contextPanel.linear.priority.high': 'Hoch',
'contextPanel.linear.priority.medium': 'Mittel',
'contextPanel.linear.priority.low': 'Niedrig',
'contextPanel.linear.label.comments': 'Kommentare',
'contextPanel.linear.label.statusAria': 'Status des Linear-Issues',
'contextPanel.linear.label.workspace': 'Arbeitsbereich',
'contextPanel.linear.label.workspaceAria': 'Linear-Workspace',
'contextPanel.linear.filter.statusAria': 'Issues nach Status filtern',
'contextPanel.linear.filter.assigneeAria': 'Issues nach Zuweisung filtern',
'contextPanel.linear.filter.teamAria': 'Issues nach Team filtern',
'contextPanel.linear.filter.priorityAria': 'Issues nach Priorität filtern',
'contextPanel.linear.filter.searchAria': 'Issues durchsuchen',
'contextPanel.linear.filter.clear': 'Zurücksetzen',
'contextPanel.linear.filter.clearAria': 'Issue-Filter zurücksetzen',
'contextPanel.linear.filter.status.all': 'Alle',
'contextPanel.linear.filter.status.backlog': 'Warteliste',
'contextPanel.linear.filter.status.todo': 'Zu tun',
'contextPanel.linear.filter.status.started': 'In Bearbeitung',
'contextPanel.linear.filter.status.inReview': 'In Prüfung',
'contextPanel.linear.filter.status.completed': 'Erledigt',
'contextPanel.linear.filter.status.canceled': 'Abgebrochen',
'contextPanel.linear.filter.status.duplicate': 'Duplikat',
'contextPanel.linear.filter.assignee.any': 'Alle Personen',
'contextPanel.linear.filter.assignee.me': 'Mir zugewiesen',
'contextPanel.linear.filter.team.all': 'Alle Teams',
'contextPanel.linear.filter.priority.all': 'Alle Prioritäten',
'contextPanel.linear.empty.noDescription': 'Keine Beschreibung',
'contextPanel.linear.empty.noComments': 'Keine Kommentare',
'contextPanel.linear.empty.noMatchingIssues': 'Keine Issues passen zu diesen Filtern',
'contextPanel.linear.loading.issue': 'Issue wird geladen…',
'contextPanel.linear.toast.statusUpdated': 'Issue-Status aktualisiert',
'contextPanel.linear.toast.statusUpdateFailed': 'Issue-Status konnte nicht aktualisiert werden',
'contextPanel.linear.toast.closeFailed': 'Issue konnte nicht geschlossen werden',
'contextPanel.linear.toast.workspaceSwitched': 'Linear-Workspace gewechselt',
'contextPanel.linear.toast.workspaceSwitchFailed': 'Linear-Workspace konnte nicht gewechselt werden',
'contextPanel.linear.error.noCompletedState': 'Dieses Team hat keinen erledigten Status',
},
fr: {
'contextPanel.mode.linear': 'Linear',
'contextRail.surface.linear.description': 'Parcourir les tickets Linear, changer le statut et démarrer une session',
'contextPanel.linear.actions.backToList': 'Retour aux tickets',
'contextPanel.linear.actions.startSession': 'Démarrer une session',
'contextPanel.linear.actions.closeIssue': 'Fermer le ticket',
'contextPanel.linear.actions.closeSearch': 'Fermer la recherche',
'contextPanel.linear.label.status': 'Statut',
'contextPanel.linear.label.team': 'Équipe',
'contextPanel.linear.label.assignee': 'Assigné',
'contextPanel.linear.label.unassigned': 'Non assigné',
'contextPanel.linear.label.priority': 'Priorité',
'contextPanel.linear.label.labels': 'Libellés',
'contextPanel.linear.priority.none': 'Sans priorité',
'contextPanel.linear.priority.urgent': 'Urgente',
'contextPanel.linear.priority.high': 'Haute',
'contextPanel.linear.priority.medium': 'Moyenne',
'contextPanel.linear.priority.low': 'Basse',
'contextPanel.linear.label.comments': 'Commentaires',
'contextPanel.linear.label.statusAria': 'Statut du ticket Linear',
'contextPanel.linear.label.workspace': 'Espace de travail',
'contextPanel.linear.label.workspaceAria': 'Espace de travail Linear',
'contextPanel.linear.filter.statusAria': 'Filtrer les tickets par statut',
'contextPanel.linear.filter.assigneeAria': 'Filtrer les tickets par assigné',
'contextPanel.linear.filter.teamAria': 'Filtrer les tickets par équipe',
'contextPanel.linear.filter.priorityAria': 'Filtrer les tickets par priorité',
'contextPanel.linear.filter.searchAria': 'Rechercher des tickets',
'contextPanel.linear.filter.clear': 'Effacer',
'contextPanel.linear.filter.clearAria': 'Effacer les filtres des tickets',
'contextPanel.linear.filter.status.all': 'Tous',
'contextPanel.linear.filter.status.backlog': 'Liste d’attente',
'contextPanel.linear.filter.status.todo': 'À faire',
'contextPanel.linear.filter.status.started': 'En cours',
'contextPanel.linear.filter.status.inReview': 'En revue',
'contextPanel.linear.filter.status.completed': 'Terminé',
'contextPanel.linear.filter.status.canceled': 'Annulé',
'contextPanel.linear.filter.status.duplicate': 'Doublon',
'contextPanel.linear.filter.assignee.any': 'Tout le monde',
'contextPanel.linear.filter.assignee.me': 'Assignés à moi',
'contextPanel.linear.filter.team.all': 'Toutes les équipes',
'contextPanel.linear.filter.priority.all': 'Toutes les priorités',
'contextPanel.linear.empty.noDescription': 'Aucune description',
'contextPanel.linear.empty.noComments': 'Aucun commentaire',
'contextPanel.linear.empty.noMatchingIssues': 'Aucun ticket ne correspond à ces filtres',
'contextPanel.linear.loading.issue': 'Chargement du ticket…',
'contextPanel.linear.toast.statusUpdated': 'Statut du ticket mis à jour',
'contextPanel.linear.toast.statusUpdateFailed': 'Impossible de mettre à jour le statut du ticket',
'contextPanel.linear.toast.closeFailed': 'Impossible de fermer le ticket',
'contextPanel.linear.toast.workspaceSwitched': 'Workspace Linear modifié',
'contextPanel.linear.toast.workspaceSwitchFailed': 'Impossible de changer de workspace Linear',
'contextPanel.linear.error.noCompletedState': 'Cette équipe n’a pas de statut terminé',
},
es: {
'contextPanel.mode.linear': 'Linear',
'contextRail.surface.linear.description': 'Explora issues de Linear, cambia el estado e inicia una sesión',
'contextPanel.linear.actions.backToList': 'Volver a los issues',
'contextPanel.linear.actions.startSession': 'Iniciar sesión',
'contextPanel.linear.actions.closeIssue': 'Cerrar issue',
'contextPanel.linear.actions.closeSearch': 'Cerrar búsqueda',
'contextPanel.linear.label.status': 'Estado',
'contextPanel.linear.label.team': 'Equipo',
'contextPanel.linear.label.assignee': 'Asignado',
'contextPanel.linear.label.unassigned': 'Sin asignar',
'contextPanel.linear.label.priority': 'Prioridad',
'contextPanel.linear.label.labels': 'Etiquetas',
'contextPanel.linear.priority.none': 'Sin prioridad',
'contextPanel.linear.priority.urgent': 'Urgente',
'contextPanel.linear.priority.high': 'Alta',
'contextPanel.linear.priority.medium': 'Media',
'contextPanel.linear.priority.low': 'Baja',
'contextPanel.linear.label.comments': 'Comentarios',
'contextPanel.linear.label.statusAria': 'Estado del issue de Linear',
'contextPanel.linear.label.workspace': 'Espacio de trabajo',
'contextPanel.linear.label.workspaceAria': 'Espacio de trabajo de Linear',
'contextPanel.linear.filter.statusAria': 'Filtrar issues por estado',
'contextPanel.linear.filter.assigneeAria': 'Filtrar issues por asignado',
'contextPanel.linear.filter.teamAria': 'Filtrar issues por equipo',
'contextPanel.linear.filter.priorityAria': 'Filtrar issues por prioridad',
'contextPanel.linear.filter.searchAria': 'Buscar issues',
'contextPanel.linear.filter.clear': 'Borrar',
'contextPanel.linear.filter.clearAria': 'Borrar filtros de issues',
'contextPanel.linear.filter.status.all': 'Todos',
'contextPanel.linear.filter.status.backlog': 'Lista de espera',
'contextPanel.linear.filter.status.todo': 'Por hacer',
'contextPanel.linear.filter.status.started': 'En curso',
'contextPanel.linear.filter.status.inReview': 'En revisión',
'contextPanel.linear.filter.status.completed': 'Hecho',
'contextPanel.linear.filter.status.canceled': 'Cancelado',
'contextPanel.linear.filter.status.duplicate': 'Duplicado',
'contextPanel.linear.filter.assignee.any': 'Cualquiera',
'contextPanel.linear.filter.assignee.me': 'Asignados a mí',
'contextPanel.linear.filter.team.all': 'Todos los equipos',
'contextPanel.linear.filter.priority.all': 'Todas las prioridades',
'contextPanel.linear.empty.noDescription': 'Sin descripción',
'contextPanel.linear.empty.noComments': 'Sin comentarios',
'contextPanel.linear.empty.noMatchingIssues': 'Ningún issue coincide con estos filtros',
'contextPanel.linear.loading.issue': 'Cargando issue…',
'contextPanel.linear.toast.statusUpdated': 'Estado del issue actualizado',
'contextPanel.linear.toast.statusUpdateFailed': 'No se pudo actualizar el estado del issue',
'contextPanel.linear.toast.closeFailed': 'No se pudo cerrar el issue',
'contextPanel.linear.toast.workspaceSwitched': 'Workspace de Linear cambiado',
'contextPanel.linear.toast.workspaceSwitchFailed': 'No se pudo cambiar el workspace de Linear',
'contextPanel.linear.error.noCompletedState': 'Este equipo no tiene un estado completado',
},
ja: {
'contextPanel.mode.linear': 'Linear',
'contextRail.surface.linear.description': 'Linear の Issue を一覧し、状態を変えてセッションを開始します',
'contextPanel.linear.actions.backToList': 'Issue 一覧に戻る',
'contextPanel.linear.actions.startSession': 'セッションを開始',
'contextPanel.linear.actions.closeIssue': 'Issue をクローズ',
'contextPanel.linear.actions.closeSearch': '検索を閉じる',
'contextPanel.linear.label.status': '状態',
'contextPanel.linear.label.team': 'チーム',
'contextPanel.linear.label.assignee': '担当者',
'contextPanel.linear.label.unassigned': '未割り当て',
'contextPanel.linear.label.priority': '優先度',
'contextPanel.linear.label.labels': 'ラベル',
'contextPanel.linear.priority.none': '優先度なし',
'contextPanel.linear.priority.urgent': '緊急',
'contextPanel.linear.priority.high': '高',
'contextPanel.linear.priority.medium': '中',
'contextPanel.linear.priority.low': '低',
'contextPanel.linear.label.comments': 'コメント',
'contextPanel.linear.label.statusAria': 'Linear Issue の状態',
'contextPanel.linear.label.workspace': 'ワークスペース',
'contextPanel.linear.label.workspaceAria': 'Linear ワークスペース',
'contextPanel.linear.filter.statusAria': '状態で Issue を絞り込む',
'contextPanel.linear.filter.assigneeAria': '担当者で Issue を絞り込む',
'contextPanel.linear.filter.teamAria': 'チームで Issue を絞り込む',
'contextPanel.linear.filter.priorityAria': '優先度で Issue を絞り込む',
'contextPanel.linear.filter.searchAria': 'Issue を検索',
'contextPanel.linear.filter.clear': 'クリア',
'contextPanel.linear.filter.clearAria': 'Issue フィルターをクリア',
'contextPanel.linear.filter.status.all': 'すべて',
'contextPanel.linear.filter.status.backlog': 'バックログ',
'contextPanel.linear.filter.status.todo': '未着手',
'contextPanel.linear.filter.status.started': '進行中',
'contextPanel.linear.filter.status.inReview': 'レビュー中',
'contextPanel.linear.filter.status.completed': '完了',
'contextPanel.linear.filter.status.canceled': 'キャンセル',
'contextPanel.linear.filter.status.duplicate': '重複',
'contextPanel.linear.filter.assignee.any': '全員',
'contextPanel.linear.filter.assignee.me': '自分に割り当て',
'contextPanel.linear.filter.team.all': 'すべてのチーム',
'contextPanel.linear.filter.priority.all': 'すべての優先度',
'contextPanel.linear.empty.noDescription': '説明はありません',
'contextPanel.linear.empty.noComments': 'コメントはありません',
'contextPanel.linear.empty.noMatchingIssues': 'この条件に合う Issue はありません',
'contextPanel.linear.loading.issue': 'Issue を読み込み中…',
'contextPanel.linear.toast.statusUpdated': 'Issue の状態を更新しました',
'contextPanel.linear.toast.statusUpdateFailed': 'Issue の状態を更新できませんでした',
'contextPanel.linear.toast.closeFailed': 'Issue をクローズできませんでした',
'contextPanel.linear.toast.workspaceSwitched': 'Linear ワークスペースを切り替えました',
'contextPanel.linear.toast.workspaceSwitchFailed': 'Linear ワークスペースを切り替えられませんでした',
'contextPanel.linear.error.noCompletedState': 'このチームには完了ステータスがありません',
},
ko: {
'contextPanel.mode.linear': 'Linear',
'contextRail.surface.linear.description': 'Linear 이슈를 보고 상태를 바꾼 뒤 세션을 시작합니다',
'contextPanel.linear.actions.backToList': '이슈 목록으로',
'contextPanel.linear.actions.startSession': '세션 시작',
'contextPanel.linear.actions.closeIssue': '이슈 닫기',
'contextPanel.linear.actions.closeSearch': '검색 닫기',
'contextPanel.linear.label.status': '상태',
'contextPanel.linear.label.team': '팀',
'contextPanel.linear.label.assignee': '담당자',
'contextPanel.linear.label.unassigned': '담당자 없음',
'contextPanel.linear.label.priority': '우선순위',
'contextPanel.linear.label.labels': '레이블',
'contextPanel.linear.priority.none': '우선순위 없음',
'contextPanel.linear.priority.urgent': '긴급',
'contextPanel.linear.priority.high': '높음',
'contextPanel.linear.priority.medium': '보통',
'contextPanel.linear.priority.low': '낮음',
'contextPanel.linear.label.comments': '댓글',
'contextPanel.linear.label.statusAria': 'Linear 이슈 상태',
'contextPanel.linear.label.workspace': '워크스페이스',
'contextPanel.linear.label.workspaceAria': 'Linear 워크스페이스',
'contextPanel.linear.filter.statusAria': '상태로 이슈 필터',
'contextPanel.linear.filter.assigneeAria': '담당자로 이슈 필터',
'contextPanel.linear.filter.teamAria': '팀으로 이슈 필터',
'contextPanel.linear.filter.priorityAria': '우선순위로 이슈 필터',
'contextPanel.linear.filter.searchAria': '이슈 검색',
'contextPanel.linear.filter.clear': '지우기',
'contextPanel.linear.filter.clearAria': '이슈 필터 지우기',
'contextPanel.linear.filter.status.all': '전체',
'contextPanel.linear.filter.status.backlog': '백로그',
'contextPanel.linear.filter.status.todo': '할 일',
'contextPanel.linear.filter.status.started': '작업 중',
'contextPanel.linear.filter.status.inReview': '검토 중',
'contextPanel.linear.filter.status.completed': '완료',
'contextPanel.linear.filter.status.canceled': '취소됨',
'contextPanel.linear.filter.status.duplicate': '중복',
'contextPanel.linear.filter.assignee.any': '누구나',
'contextPanel.linear.filter.assignee.me': '내게 할당됨',
'contextPanel.linear.filter.team.all': '모든 팀',
'contextPanel.linear.filter.priority.all': '모든 우선순위',
'contextPanel.linear.empty.noDescription': '설명이 없습니다',
'contextPanel.linear.empty.noComments': '댓글이 없습니다',
'contextPanel.linear.empty.noMatchingIssues': '이 필터에 맞는 이슈가 없습니다',
'contextPanel.linear.loading.issue': '이슈를 불러오는 중…',
'contextPanel.linear.toast.statusUpdated': '이슈 상태를 업데이트했습니다',
'contextPanel.linear.toast.statusUpdateFailed': '이슈 상태를 업데이트하지 못했습니다',
'contextPanel.linear.toast.closeFailed': '이슈를 닫지 못했습니다',
'contextPanel.linear.toast.workspaceSwitched': 'Linear 워크스페이스를 전환했습니다',
'contextPanel.linear.toast.workspaceSwitchFailed': 'Linear 워크스페이스를 전환하지 못했습니다',
'contextPanel.linear.error.noCompletedState': '이 팀에는 완료 상태가 없습니다',
},
pl: {
'contextPanel.mode.linear': 'Linear',
'contextRail.surface.linear.description': 'Przeglądaj zgłoszenia Linear, zmieniaj status i uruchamiaj sesję',
'contextPanel.linear.actions.backToList': 'Wróć do zgłoszeń',
'contextPanel.linear.actions.startSession': 'Uruchom sesję',
'contextPanel.linear.actions.closeIssue': 'Zamknij zgłoszenie',
'contextPanel.linear.actions.closeSearch': 'Zamknij wyszukiwanie',
'contextPanel.linear.label.status': 'Status',
'contextPanel.linear.label.team': 'Zespół',
'contextPanel.linear.label.assignee': 'Przypisane',
'contextPanel.linear.label.unassigned': 'Nieprzypisane',
'contextPanel.linear.label.priority': 'Priorytet',
'contextPanel.linear.label.labels': 'Etykiety',
'contextPanel.linear.priority.none': 'Brak priorytetu',
'contextPanel.linear.priority.urgent': 'Pilne',
'contextPanel.linear.priority.high': 'Wysoki',
'contextPanel.linear.priority.medium': 'Średni',
'contextPanel.linear.priority.low': 'Niski',
'contextPanel.linear.label.comments': 'Komentarze',
'contextPanel.linear.label.statusAria': 'Status zgłoszenia Linear',
'contextPanel.linear.label.workspace': 'Obszar roboczy',
'contextPanel.linear.label.workspaceAria': 'Workspace Linear',
'contextPanel.linear.filter.statusAria': 'Filtruj zgłoszenia według statusu',
'contextPanel.linear.filter.assigneeAria': 'Filtruj zgłoszenia według osoby',
'contextPanel.linear.filter.teamAria': 'Filtruj zgłoszenia według zespołu',
'contextPanel.linear.filter.priorityAria': 'Filtruj zgłoszenia według priorytetu',
'contextPanel.linear.filter.searchAria': 'Szukaj zgłoszeń',
'contextPanel.linear.filter.clear': 'Wyczyść',
'contextPanel.linear.filter.clearAria': 'Wyczyść filtry zgłoszeń',
'contextPanel.linear.filter.status.all': 'Wszystkie',
'contextPanel.linear.filter.status.backlog': 'Lista oczekujących',
'contextPanel.linear.filter.status.todo': 'Do zrobienia',
'contextPanel.linear.filter.status.started': 'W toku',
'contextPanel.linear.filter.status.inReview': 'W recenzji',
'contextPanel.linear.filter.status.completed': 'Ukończone',
'contextPanel.linear.filter.status.canceled': 'Anulowane',
'contextPanel.linear.filter.status.duplicate': 'Duplikat',
'contextPanel.linear.filter.assignee.any': 'Ktokolwiek',
'contextPanel.linear.filter.assignee.me': 'Przypisane do mnie',
'contextPanel.linear.filter.team.all': 'Wszystkie zespoły',
'contextPanel.linear.filter.priority.all': 'Wszystkie priorytety',
'contextPanel.linear.empty.noDescription': 'Brak opisu',
'contextPanel.linear.empty.noComments': 'Brak komentarzy',
'contextPanel.linear.empty.noMatchingIssues': 'Żadne zgłoszenie nie pasuje do tych filtrów',
'contextPanel.linear.loading.issue': 'Wczytywanie zgłoszenia…',
'contextPanel.linear.toast.statusUpdated': 'Zaktualizowano status zgłoszenia',
'contextPanel.linear.toast.statusUpdateFailed': 'Nie udało się zaktualizować statusu zgłoszenia',
'contextPanel.linear.toast.closeFailed': 'Nie udało się zamknąć zgłoszenia',
'contextPanel.linear.toast.workspaceSwitched': 'Przełączono workspace Linear',
'contextPanel.linear.toast.workspaceSwitchFailed': 'Nie udało się przełączyć workspace Linear',
'contextPanel.linear.error.noCompletedState': 'Ten zespół nie ma statusu ukończenia',
},
'pt-BR': {
'contextPanel.mode.linear': 'Linear',
'contextRail.surface.linear.description': 'Navegue pelas issues do Linear, altere o status e inicie uma sessão',
'contextPanel.linear.actions.backToList': 'Voltar às issues',
'contextPanel.linear.actions.startSession': 'Iniciar sessão',
'contextPanel.linear.actions.closeIssue': 'Fechar issue',
'contextPanel.linear.actions.closeSearch': 'Fechar pesquisa',
'contextPanel.linear.label.status': 'Status',
'contextPanel.linear.label.team': 'Equipe',
'contextPanel.linear.label.assignee': 'Responsável',
'contextPanel.linear.label.unassigned': 'Sem responsável',
'contextPanel.linear.label.priority': 'Prioridade',
'contextPanel.linear.label.labels': 'Etiquetas',
'contextPanel.linear.priority.none': 'Sem prioridade',
'contextPanel.linear.priority.urgent': 'Urgente',
'contextPanel.linear.priority.high': 'Alta',
'contextPanel.linear.priority.medium': 'Média',
'contextPanel.linear.priority.low': 'Baixa',
'contextPanel.linear.label.comments': 'Comentários',
'contextPanel.linear.label.statusAria': 'Status da issue do Linear',
'contextPanel.linear.label.workspace': 'Espaço de trabalho',
'contextPanel.linear.label.workspaceAria': 'Workspace do Linear',
'contextPanel.linear.filter.statusAria': 'Filtrar issues por status',
'contextPanel.linear.filter.assigneeAria': 'Filtrar issues por responsável',
'contextPanel.linear.filter.teamAria': 'Filtrar issues por equipe',
'contextPanel.linear.filter.priorityAria': 'Filtrar issues por prioridade',
'contextPanel.linear.filter.searchAria': 'Pesquisar issues',
'contextPanel.linear.filter.clear': 'Limpar',
'contextPanel.linear.filter.clearAria': 'Limpar filtros de issues',
'contextPanel.linear.filter.status.all': 'Todas',
'contextPanel.linear.filter.status.backlog': 'Lista de espera',
'contextPanel.linear.filter.status.todo': 'A fazer',
'contextPanel.linear.filter.status.started': 'Em andamento',
'contextPanel.linear.filter.status.inReview': 'Em revisão',
'contextPanel.linear.filter.status.completed': 'Concluído',
'contextPanel.linear.filter.status.canceled': 'Cancelado',
'contextPanel.linear.filter.status.duplicate': 'Duplicado',
'contextPanel.linear.filter.assignee.any': 'Qualquer pessoa',
'contextPanel.linear.filter.assignee.me': 'Atribuídas a mim',
'contextPanel.linear.filter.team.all': 'Todas as equipes',
'contextPanel.linear.filter.priority.all': 'Todas as prioridades',
'contextPanel.linear.empty.noDescription': 'Sem descrição',
'contextPanel.linear.empty.noComments': 'Sem comentários',
'contextPanel.linear.empty.noMatchingIssues': 'Nenhuma issue corresponde a estes filtros',
'contextPanel.linear.loading.issue': 'Carregando issue…',
'contextPanel.linear.toast.statusUpdated': 'Status da issue atualizado',
'contextPanel.linear.toast.statusUpdateFailed': 'Não foi possível atualizar o status da issue',
'contextPanel.linear.toast.closeFailed': 'Não foi possível fechar a issue',
'contextPanel.linear.toast.workspaceSwitched': 'Workspace do Linear alterado',
'contextPanel.linear.toast.workspaceSwitchFailed': 'Não foi possível alternar o workspace do Linear',
'contextPanel.linear.error.noCompletedState': 'Esta equipe não tem um status de concluído',
},
uk: {
'contextPanel.mode.linear': 'Linear',
'contextRail.surface.linear.description': 'Переглядайте Linear issue, змінюйте статус і запускайте сесію',
'contextPanel.linear.actions.backToList': 'Назад до issues',
'contextPanel.linear.actions.startSession': 'Почати сесію',
'contextPanel.linear.actions.closeIssue': 'Закрити issue',
'contextPanel.linear.actions.closeSearch': 'Закрити пошук',
'contextPanel.linear.label.status': 'Статус',
'contextPanel.linear.label.team': 'Команда',
'contextPanel.linear.label.assignee': 'Виконавець',
'contextPanel.linear.label.unassigned': 'Не призначено',
'contextPanel.linear.label.priority': 'Пріоритет',
'contextPanel.linear.label.labels': 'Мітки',
'contextPanel.linear.priority.none': 'Без пріоритету',
'contextPanel.linear.priority.urgent': 'Терміновий',
'contextPanel.linear.priority.high': 'Високий',
'contextPanel.linear.priority.medium': 'Середній',
'contextPanel.linear.priority.low': 'Низький',
'contextPanel.linear.label.comments': 'Коментарі',
'contextPanel.linear.label.statusAria': 'Статус Linear issue',
'contextPanel.linear.label.workspace': 'Робочий простір',
'contextPanel.linear.label.workspaceAria': 'Робочий простір Linear',
'contextPanel.linear.filter.statusAria': 'Фільтрувати issues за статусом',
'contextPanel.linear.filter.assigneeAria': 'Фільтрувати issues за виконавцем',
'contextPanel.linear.filter.teamAria': 'Фільтрувати issues за командою',
'contextPanel.linear.filter.priorityAria': 'Фільтрувати issues за пріоритетом',
'contextPanel.linear.filter.searchAria': 'Шукати issues',
'contextPanel.linear.filter.clear': 'Скинути',
'contextPanel.linear.filter.clearAria': 'Скинути фільтри issues',
'contextPanel.linear.filter.status.all': 'Усі',
'contextPanel.linear.filter.status.backlog': 'Беклог',
'contextPanel.linear.filter.status.todo': 'До виконання',
'contextPanel.linear.filter.status.started': 'У роботі',
'contextPanel.linear.filter.status.inReview': 'На перегляді',
'contextPanel.linear.filter.status.completed': 'Готово',
'contextPanel.linear.filter.status.canceled': 'Скасовано',
'contextPanel.linear.filter.status.duplicate': 'Дублікат',
'contextPanel.linear.filter.assignee.any': 'Будь-хто',
'contextPanel.linear.filter.assignee.me': 'Призначені мені',
'contextPanel.linear.filter.team.all': 'Усі команди',
'contextPanel.linear.filter.priority.all': 'Усі пріоритети',
'contextPanel.linear.empty.noDescription': 'Немає опису',
'contextPanel.linear.empty.noComments': 'Немає коментарів',
'contextPanel.linear.empty.noMatchingIssues': 'Немає issues за цими фільтрами',
'contextPanel.linear.loading.issue': 'Завантаження issue…',
'contextPanel.linear.toast.statusUpdated': 'Статус issue оновлено',
'contextPanel.linear.toast.statusUpdateFailed': 'Не вдалося оновити статус issue',
'contextPanel.linear.toast.closeFailed': 'Не вдалося закрити issue',
'contextPanel.linear.toast.workspaceSwitched': 'Перемкнуто Linear workspace',
'contextPanel.linear.toast.workspaceSwitchFailed': 'Не вдалося перемкнути Linear workspace',
'contextPanel.linear.error.noCompletedState': 'У цієї команди немає статусу completed',
},
'zh-CN': {
'contextPanel.mode.linear': 'Linear',
'contextRail.surface.linear.description': '浏览 Linear Issue、更改状态并开始会话',
'contextPanel.linear.actions.backToList': '返回 Issue 列表',
'contextPanel.linear.actions.startSession': '开始会话',
'contextPanel.linear.actions.closeIssue': '关闭 Issue',
'contextPanel.linear.actions.closeSearch': '关闭搜索',
'contextPanel.linear.label.status': '状态',
'contextPanel.linear.label.team': '团队',
'contextPanel.linear.label.assignee': '负责人',
'contextPanel.linear.label.unassigned': '未指派',
'contextPanel.linear.label.priority': '优先级',
'contextPanel.linear.label.labels': '标签',
'contextPanel.linear.priority.none': '无优先级',
'contextPanel.linear.priority.urgent': '紧急',
'contextPanel.linear.priority.high': '高',
'contextPanel.linear.priority.medium': '中',
'contextPanel.linear.priority.low': '低',
'contextPanel.linear.label.comments': '评论',
'contextPanel.linear.label.statusAria': 'Linear Issue 状态',
'contextPanel.linear.label.workspace': '工作区',
'contextPanel.linear.label.workspaceAria': 'Linear 工作区',
'contextPanel.linear.filter.statusAria': '按状态筛选 Issue',
'contextPanel.linear.filter.assigneeAria': '按负责人筛选 Issue',
'contextPanel.linear.filter.teamAria': '按团队筛选 Issue',
'contextPanel.linear.filter.priorityAria': '按优先级筛选 Issue',
'contextPanel.linear.filter.searchAria': '搜索 Issue',
'contextPanel.linear.filter.clear': '清除',
'contextPanel.linear.filter.clearAria': '清除 Issue 筛选',
'contextPanel.linear.filter.status.all': '全部',
'contextPanel.linear.filter.status.backlog': '待办池',
'contextPanel.linear.filter.status.todo': '待办',
'contextPanel.linear.filter.status.started': '进行中',
'contextPanel.linear.filter.status.inReview': '审核中',
'contextPanel.linear.filter.status.completed': '已完成',
'contextPanel.linear.filter.status.canceled': '已取消',
'contextPanel.linear.filter.status.duplicate': '重复',
'contextPanel.linear.filter.assignee.any': '任何人',
'contextPanel.linear.filter.assignee.me': '指派给我',
'contextPanel.linear.filter.team.all': '所有团队',
'contextPanel.linear.filter.priority.all': '所有优先级',
'contextPanel.linear.empty.noDescription': '没有描述',
'contextPanel.linear.empty.noComments': '没有评论',
'contextPanel.linear.empty.noMatchingIssues': '没有符合这些筛选条件的 Issue',
'contextPanel.linear.loading.issue': '正在加载 Issue…',
'contextPanel.linear.toast.statusUpdated': '已更新 Issue 状态',
'contextPanel.linear.toast.statusUpdateFailed': '无法更新 Issue 状态',
'contextPanel.linear.toast.closeFailed': '无法关闭 Issue',
'contextPanel.linear.toast.workspaceSwitched': '已切换 Linear 工作区',
'contextPanel.linear.toast.workspaceSwitchFailed': '无法切换 Linear 工作区',
'contextPanel.linear.error.noCompletedState': '此团队没有已完成状态',
},
'zh-TW': {
'contextPanel.mode.linear': 'Linear',
'contextRail.surface.linear.description': '瀏覽 Linear Issue、變更狀態並開始會話',
'contextPanel.linear.actions.backToList': '返回 Issue 列表',
'contextPanel.linear.actions.startSession': '開始會話',
'contextPanel.linear.actions.closeIssue': '關閉 Issue',
'contextPanel.linear.actions.closeSearch': '關閉搜尋',
'contextPanel.linear.label.status': '狀態',
'contextPanel.linear.label.team': '團隊',
'contextPanel.linear.label.assignee': '負責人',
'contextPanel.linear.label.unassigned': '未指派',
'contextPanel.linear.label.priority': '優先級',
'contextPanel.linear.label.labels': '標籤',
'contextPanel.linear.priority.none': '無優先級',
'contextPanel.linear.priority.urgent': '緊急',
'contextPanel.linear.priority.high': '高',
'contextPanel.linear.priority.medium': '中',
'contextPanel.linear.priority.low': '低',
'contextPanel.linear.label.comments': '留言',
'contextPanel.linear.label.statusAria': 'Linear Issue 狀態',
'contextPanel.linear.label.workspace': '工作區',
'contextPanel.linear.label.workspaceAria': 'Linear 工作區',
'contextPanel.linear.filter.statusAria': '依狀態篩選 Issue',
'contextPanel.linear.filter.assigneeAria': '依負責人篩選 Issue',
'contextPanel.linear.filter.teamAria': '依團隊篩選 Issue',
'contextPanel.linear.filter.priorityAria': '依優先級篩選 Issue',
'contextPanel.linear.filter.searchAria': '搜尋 Issue',
'contextPanel.linear.filter.clear': '清除',
'contextPanel.linear.filter.clearAria': '清除 Issue 篩選',
'contextPanel.linear.filter.status.all': '全部',
'contextPanel.linear.filter.status.backlog': '待辦池',
'contextPanel.linear.filter.status.todo': '待辦',
'contextPanel.linear.filter.status.started': '進行中',
'contextPanel.linear.filter.status.inReview': '審核中',
'contextPanel.linear.filter.status.completed': '已完成',
'contextPanel.linear.filter.status.canceled': '已取消',
'contextPanel.linear.filter.status.duplicate': '重複',
'contextPanel.linear.filter.assignee.any': '任何人',
'contextPanel.linear.filter.assignee.me': '指派給我',
'contextPanel.linear.filter.team.all': '所有團隊',
'contextPanel.linear.filter.priority.all': '所有優先級',
'contextPanel.linear.empty.noDescription': '沒有描述',
'contextPanel.linear.empty.noComments': '沒有留言',
'contextPanel.linear.empty.noMatchingIssues': '沒有符合這些篩選條件的 Issue',
'contextPanel.linear.loading.issue': '正在載入 Issue…',
'contextPanel.linear.toast.statusUpdated': '已更新 Issue 狀態',
'contextPanel.linear.toast.statusUpdateFailed': '無法更新 Issue 狀態',
'contextPanel.linear.toast.closeFailed': '無法關閉 Issue',
'contextPanel.linear.toast.workspaceSwitched': '已切換 Linear 工作區',
'contextPanel.linear.toast.workspaceSwitchFailed': '無法切換 Linear 工作區',
'contextPanel.linear.error.noCompletedState': '此團隊沒有已完成狀態',
},
tr: {
'contextPanel.mode.linear': 'Linear',
'contextRail.surface.linear.description': "Linear issue'larını incele, durumu değiştir ve session başlat",
'contextPanel.linear.actions.backToList': 'Issue listesine dön',
'contextPanel.linear.actions.startSession': 'Session başlat',
'contextPanel.linear.actions.closeIssue': "Issue'u kapat",
'contextPanel.linear.actions.closeSearch': 'Aramayı kapat',
'contextPanel.linear.label.status': 'Durum',
'contextPanel.linear.label.team': 'Ekip',
'contextPanel.linear.label.assignee': 'Atanan',
'contextPanel.linear.label.unassigned': 'Atanmamış',
'contextPanel.linear.label.priority': 'Öncelik',
'contextPanel.linear.label.labels': 'Etiketler',
'contextPanel.linear.priority.none': 'Öncelik yok',
'contextPanel.linear.priority.urgent': 'Acil',
'contextPanel.linear.priority.high': 'Yüksek',
'contextPanel.linear.priority.medium': 'Orta',
'contextPanel.linear.priority.low': 'Düşük',
'contextPanel.linear.label.comments': 'Yorumlar',
'contextPanel.linear.label.statusAria': 'Linear issue durumu',
'contextPanel.linear.label.workspace': 'Çalışma alanı',
'contextPanel.linear.label.workspaceAria': 'Linear çalışma alanı',
'contextPanel.linear.filter.statusAria': "Issue'ları duruma göre süz",
'contextPanel.linear.filter.assigneeAria': "Issue'ları atanan kişiye göre süz",
'contextPanel.linear.filter.teamAria': "Issue'ları ekibe göre süz",
'contextPanel.linear.filter.priorityAria': "Issue'ları önceliğe göre süz",
'contextPanel.linear.filter.searchAria': "Issue'larda ara",
'contextPanel.linear.filter.clear': 'Temizle',
'contextPanel.linear.filter.clearAria': "Issue filtrelerini temizle",
'contextPanel.linear.filter.status.all': 'Tümü',
'contextPanel.linear.filter.status.backlog': 'Bekleme listesi',
'contextPanel.linear.filter.status.todo': 'Yapılacak',
'contextPanel.linear.filter.status.started': 'Devam ediyor',
'contextPanel.linear.filter.status.inReview': 'İncelemede',
'contextPanel.linear.filter.status.completed': 'Bitti',
'contextPanel.linear.filter.status.canceled': 'İptal',
'contextPanel.linear.filter.status.duplicate': 'Yinelenen',
'contextPanel.linear.filter.assignee.any': 'Herkes',
'contextPanel.linear.filter.assignee.me': 'Bana atananlar',
'contextPanel.linear.filter.team.all': 'Tüm ekipler',
'contextPanel.linear.filter.priority.all': 'Tüm öncelikler',
'contextPanel.linear.empty.noDescription': 'Açıklama yok',
'contextPanel.linear.empty.noComments': 'Yorum yok',
'contextPanel.linear.empty.noMatchingIssues': 'Bu süzgeçlere uyan issue yok',
'contextPanel.linear.loading.issue': 'Issue yükleniyor…',
'contextPanel.linear.toast.statusUpdated': 'Issue durumu güncellendi',
'contextPanel.linear.toast.statusUpdateFailed': 'Issue durumu güncellenemedi',
'contextPanel.linear.toast.closeFailed': 'Issue kapatılamadı',
'contextPanel.linear.toast.workspaceSwitched': 'Linear çalışma alanı değiştirildi',
'contextPanel.linear.toast.workspaceSwitchFailed': 'Linear çalışma alanı değiştirilemedi',
'contextPanel.linear.error.noCompletedState': 'Bu ekibin tamamlandı durumu yok',
},
} as const;