Files
huly-platform/plugins/tracker-assets/lang/ja.json
T
63e28dc964 feat(tracker): Gantt chart for the issue tracker (#10992)
* feat(tracker): Gantt chart for the issue tracker

Builds on the merged search/filter rework (#10998). Introduces @hcengineering/gantt, a dependency-free scheduling/zoom/drag/viewport engine package (with a neutral GanttDependency contract), and wires the tracker-specific adapter, Svelte UI, model schema, dependency-shift notifications and sanity coverage in tracker-resources.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>

* fix(tracker): source Gantt holidays from HR and scope confirm-gate per view

Follow-up to review feedback on #10992:

- Confirm-gate: the module-global flag is replaced by a createConfirmGate()
  factory - one instance per mounted GanttView, so two Gantt views mounted at
  once in the same JS context no longer block each other's pointer input. A
  two-instance independence test guards the regression.

- Sidebar sorting: the stale deadline cast is dropped and issue.deadline is
  read directly (the field was added to the Issue model in this PR).

- HR holidays: the per-project WorkingDaysConfig.holidays field duplicated the
  workspace-wide hr.class.PublicHoliday concept and could drift from the real
  HR calendar. It is removed. WorkingDaysConfig now carries only the weekday
  mask and an optional holidayDepartment. The tracker adapter resolves holidays
  for the selected department plus all ancestors up to hr.ids.Head, matching
  HR's existing inheritance semantics (hr-resources ScheduleView). A missing or
  invalid reference falls back to company-wide (root) holidays; unrelated
  departments are never included. The ancestor walk is cycle/missing-parent
  safe.

  A small WorkingDaysEditor in the existing project create/edit dialog lets
  users with the existing project permission enable the mode, choose weekdays,
  and select an HR department (default: Company-wide). It persists through the
  existing project create/update transaction paths (createDoc on create,
  client.update on edit) and uses $unset when the mode is disabled. At least
  one working day must stay active.

  Calendar loading is explicit via a CalendarStateMachine: project-scoped drag,
  resize, cascade, keyboard-shift and auto-schedule mutations stay disabled
  until both the project config and the holiday data have loaded. A monotonic
  generation ticket (bumped synchronously on project switch) is re-checked
  immediately before every calendar-dependent date commit, so work started in
  one project can never persist after a switch to another. The all-projects
  view has no single project calendar, so calendar-dependent edits are
  read-only there; display, selection, the context menu and the manual
  date-picker (which does no calendar arithmetic and takes no mutation ticket)
  stay available.

  This depends on the lightweight @hcengineering/hr model package, but not on
  hr-resources; the tracker adapter uses hr.class.* and hr.ids.Head at runtime,
  and actual HR model presence is checked through the hierarchy - without the
  HR model, holidays resolve to an empty set. The @hcengineering/gantt engine
  package stays domain-neutral (no @hcengineering imports, no runtime deps).

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>

* fix(gantt): measure FS gap-preservation floor in working days

The finish-to-start gap-preservation floor in the cascade scheduler mixed
two time measures: the FS snap anchor is working-calendar aware, but the
floor added a raw calendar-millisecond start-side delta. With an active
working calendar the two diverge, so dragging a predecessor over a weekend
over-shifted the successor across non-working days (a Fri->Mon body drag is
3 calendar days but only 1 working day, and could even land a successor on
a Saturday).

Measure the floor on the DUE side in working days instead: translate the
predecessor's shift via the new workingDayDelta helper and advance the
floor base with addWorkingDays over the calendar. A day-granular resize
gate (utcMidnight comparison, not a raw === 0 test) arms the floor only on
a start-DAY move, so a pure due-resize stays a pure snap even when the
stored issue carries a time-of-day on the cascade-commit path. The floor
base is normalized via utcMidnight(targetAnchor). The legacy path
(cfg === undefined) stays byte-identical to today's raw-ms floor. A
left-resize in working-days mode now correctly no-ops the floor (the due,
and thus the FS gap, did not move) instead of shifting on the raw start
delta.

Engine: add workingDayDelta (signed, half-open from-exclusive/to-inclusive
working-day step count) and export the previously-private utcMidnight from
packages/gantt/src/working-days.ts. The engine stays domain-neutral (no
@hcengineering imports, empty dependencies).

Adds engine and adapter test coverage: workingDayDelta cases and the full
FS floor matrix (right-resize no-push, weekend-spanner body drag, floor
wins over snap, holiday in the floor path, floor-dominant multi-hop chain,
negative delta, legacy no-cfg, SS pure-snap, raw time-of-day right-resize,
direct left-resize).

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>

---------

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Co-authored-by: Michael Uray <michaeluray@users.noreply.github.com>
2026-08-27 20:24:38 +07:00

313 lines
16 KiB
JSON

{
"string": {
"TrackerApplication": "トラッカー",
"Projects": "あなたのプロジェクト",
"More": "その他",
"Default": "デフォルト",
"MakeDefault": "デフォルトに設定",
"Delete": "削除",
"Open": "開く",
"Members": "メンバー",
"Inbox": "受信箱",
"MyIssues": "自分のイシュー",
"ViewIssue": "イシューを表示",
"IssueCreated": "イシューが作成されました",
"Issues": "イシュー",
"Views": "ビュー",
"Active": "アクティブ",
"AllIssues": "すべてのイシュー",
"ActiveIssues": "アクティブなイシュー",
"BacklogIssues": "バックログ",
"Backlog": "バックログ",
"Board": "ボード",
"Components": "コンポーネント",
"AllComponents": "すべて",
"BacklogComponents": "バックログ",
"ActiveComponents": "アクティブ",
"ClosedComponents": "完了",
"NewComponent": "新しいコンポーネント",
"CreateComponent": "コンポーネントを作成",
"ComponentNamePlaceholder": "コンポーネント名",
"ComponentDescriptionPlaceholder": "説明 (オプション)",
"ComponentLead": "リーダー",
"ComponentMembers": "メンバー",
"StartDate": "開始日",
"TargetDate": "目標日",
"Planned": "計画済み",
"InProgress": "進行中",
"Paused": "一時停止",
"Completed": "完了",
"Canceled": "キャンセル",
"CreateProject": "プロジェクトを作成",
"NewProject": "新しいプロジェクト",
"ProjectTitle": "プロジェクトタイトル",
"ProjectTitlePlaceholder": "新しいプロジェクト",
"UsedInIssueIDs": "イシューIDで使用",
"Identifier": "識別子",
"Import": "インポート",
"ProjectIdentifier": "プロジェクト識別子",
"IdentifierExists": "プロジェクト識別子はすでに存在します",
"ProjectIdentifierPlaceholder": "PRJCT",
"ChooseIcon": "アイコンを選択",
"AddIssue": "イシューを追加",
"NewIssue": "新しいイシュー",
"NewIssuePlaceholder": "新規",
"ResumeDraft": "下書きを再開",
"SaveIssue": "イシューを作成",
"SetPriority": "優先度を設定\u2026",
"SetStatus": "ステータスを設定\u2026",
"SelectIssue": "イシューを選択",
"Priority": "優先度",
"NoPriority": "優先度なし",
"Urgent": "緊急",
"High": "高",
"Medium": "中",
"Low": "低",
"Unassigned": "未割り当て",
"Back": "戻る",
"List": "リスト",
"NumberLabels": "{count, plural, =0 {ラベルなし} =1 {1 ラベル} other {# ラベル}}",
"CategoryBacklog": "バックログ",
"CategoryUnstarted": "未着手",
"CategoryStarted": "開始",
"CategoryCompleted": "完了",
"CategoryCanceled": "キャンセル",
"Title": "タイトル",
"Name": "名前",
"Description": "説明",
"Status": "ステータス",
"Number": "番号",
"Assignee": "担当者",
"AssignTo": "担当者を設定...",
"AssignedTo": "{value} に割り当て",
"Parent": "親イシュー",
"SetParent": "親イシューを設定\u2026",
"ChangeParent": "親イシューを変更\u2026",
"RemoveParent": "親イシューを削除",
"OpenParent": "親イシューを開く",
"SubIssues": "子イシュー",
"SubIssuesList": "子イシュー ({subIssues})",
"OpenSubIssues": "子イシューを開く",
"AddSubIssues": "子イシューを追加",
"BlockedBy": "ブロックされている",
"RelatedTo": "関連する",
"Comments": "コメント",
"Attachments": "添付ファイル",
"Labels": "ラベル",
"Component": "コンポーネント",
"Space": "",
"SetDueDate": "期日を設定\u2026",
"ChangeDueDate": "期日を変更\u2026",
"ModificationDate": "更新日 {value}",
"Project": "プロジェクト",
"Issue": "イシュー",
"SubIssue": "子イシュー",
"Document": "",
"DocumentIcon": "",
"DocumentColor": "",
"Rank": "ランク",
"TypeIssuePriority": "イシューの優先度",
"IssueTitlePlaceholder": "イシューのタイトル",
"SubIssueTitlePlaceholder": "子イシューのタイトル",
"IssueDescriptionPlaceholder": "説明を追加\u2026",
"SubIssueDescriptionPlaceholder": "子イシューの説明を追加",
"AddIssueTooltip": "イシューを追加...",
"NewIssueDialogClose": "このダイアログを閉じますか?",
"NewIssueDialogCloseNote": "すべての変更は失われます",
"RemoveComponentDialogClose": "コンポーネントを削除しますか?",
"RemoveComponentDialogCloseNote": "本当にこのコンポーネントを削除しますか?この操作は元に戻せません",
"Grouping": "グループ化",
"Ordering": "順序",
"CompletedIssues": "完了したイシュー",
"NoGrouping": "グループ化なし",
"NoAssignee": "担当者なし",
"LastUpdated": "最終更新日",
"DueDate": "期日",
"IssueStartDate": "開始日",
"GanttDependency": "Dependency",
"GanttLag": "Lag",
"Manual": "手動",
"All": "すべて",
"PastWeek": "先週",
"PastMonth": "先月",
"CopyIssueUrl": "イシューのURLをクリップボードにコピー",
"CopyIssueId": "イシューIDをクリップボードにコピー",
"CopyIssueBranch": "Gitブランチ名をクリップボードにコピー",
"CopyIssueTitle": "イシューのタイトルをクリップボードにコピー",
"AssetLabel": "アセット",
"AddToComponent": "コンポーネントに追加\u2026",
"MoveToComponent": "コンポーネントに移動\u2026",
"NoComponent": "コンポーネントなし",
"ComponentLeadTitle": "コンポーネントリーダー",
"ComponentMembersTitle": "コンポーネントメンバー",
"ComponentLeadSearchPlaceholder": "コンポーネントリーダーを設定\u2026",
"ComponentMembersSearchPlaceholder": "コンポーネントメンバーを変更\u2026",
"MoveToProject": "プロジェクトに移動",
"Duplicate": "複製",
"GotoIssues": "イシューへ移動",
"GotoActive": "アクティブなイシューへ移動",
"GotoBacklog": "バックログへ移動",
"GotoComponents": "コンポーネントへ移動",
"GotoMyIssues": "自分のイシューへ移動",
"GotoTrackerApplication": "トラッカーアプリケーションに切り替え",
"CreatedOne": "作成済み",
"MoveIssues": "イシューを移動",
"MoveIssuesDescription": "イシューを移動するプロジェクトを選択します",
"ManageAttributes": "属性を管理",
"KeepOriginalAttributes": "元の属性を保持",
"KeepOriginalAttributesTooltip": "元のイシューステータスとコンポーネントは新しいプロジェクトに保持されます",
"SelectReplacement": "次のアイテムは新しいプロジェクトで利用できません。代替を選択してください。",
"MissingItem": "不足しているアイテム",
"Replacement": "代替",
"Original": "オリジナル",
"OriginalDescription": "このセクションのアイテムは新しいプロジェクトで作成されます",
"Relations": "関連",
"RemoveRelation": "関連を削除...",
"AddBlockedBy": "ブロックされているとしてマーク...",
"AddIsBlocking": "ブロックしているとしてマーク...",
"AddRelatedIssue": "別のイシューを参照...",
"RelatedIssue": "関連するイシュー {id} - {title}",
"BlockedIssue": "ブロックされているイシュー {id} - {title}",
"BlockingIssue": "ブロックしているイシュー {id} - {title}",
"BlockedBySearchPlaceholder": "ブロックされているとしてマークするイシューを検索...",
"IsBlockingSearchPlaceholder": "ブロックしているとしてマークするイシューを検索...",
"RelatedIssueSearchPlaceholder": "参照するイシューを検索...",
"Blocks": "ブロック",
"Related": "関連",
"RelatedIssues": "関連するイシュー",
"EditIssue": "{title} を編集",
"EditWorkflowStatuses": "イシューステータスを編集",
"EditProject": "プロジェクトを編集",
"DeleteProject": "プロジェクトを削除",
"ArchiveProjectName": "プロジェクト {name} をアーカイブしますか?",
"ArchiveProjectConfirm": "このプロジェクトをアーカイブしますか?",
"DeleteProjectConfirm": "このプロジェクトとすべてのイシューを削除しますか?",
"ProjectHasIssues": "このプロジェクトには既存のイシューがあります。アーカイブしてもよろしいですか?",
"ManageWorkflowStatuses": "プロジェクトタイプを管理",
"AddWorkflowStatus": "イシューステータスを追加",
"EditWorkflowStatus": "イシューステータスを編集",
"DeleteWorkflowStatus": "イシューステータスを削除",
"DeleteWorkflowStatusConfirm": "\"{status}\" ステータスを削除しますか?",
"DeleteWorkflowStatusErrorDescription": "\"{status}\" ステータスには {count, plural, =1 {1 イシュー} other {# イシュー}} が割り当てられています。移動先のステータスを選択してください",
"Save": "保存",
"IncludeItemsThatMatch": "一致するアイテムを含める",
"AnyFilter": "いずれかのフィルター",
"AllFilters": "すべてのフィルター",
"NoDescription": "説明なし",
"SearchIssue": "タスクを検索...",
"StatusHistory": "状態履歴",
"NewSubIssue": "子イシューを追加...",
"AddLabel": "ラベルを追加",
"DeleteIssue": "{issueCount, plural, =1 {イシュー} other {イシュー}} を削除",
"DeleteIssueConfirm": "{issueCount, plural, =1 {イシュー} other {イシュー}}{subIssueCount, plural, =0 {?} =1 { と子イシュー?} other { と子イシュー?}} を削除しますか?",
"Milestone": "マイルストーン",
"NoMilestone": "マイルストーンなし",
"MoveToMilestone": "マイルストーンを選択",
"Milestones": "マイルストーン",
"AllMilestones": "すべて",
"PlannedMilestones": "計画済み",
"ActiveMilestones": "アクティブ",
"ClosedMilestones": "完了",
"AddToMilestone": "マイルストーンに追加",
"MilestoneNamePlaceholder": "マイルストーン名",
"NewMilestone": "新しいマイルストーン",
"CreateMilestone": "作成",
"MoveAndDeleteMilestone": "イシューを {newMilestone} に移動し、{deleteMilestone} を削除",
"MoveAndDeleteMilestoneConfirm": "マイルストーンを削除し、イシューを別のマイルストーンに移動しますか?",
"Estimation": "見積もり",
"ReportedTime": "消費時間",
"RemainingTime": "残り時間",
"TimeSpendReports": "時間消費レポート",
"TimeSpendReport": "時間",
"TimeSpendReportAdd": "時間レポートを追加",
"TimeSpendReportDate": "日付",
"TimeSpendReportValue": "消費時間",
"TimeSpendReportValueTooltip": "消費時間 (時間)",
"TimeSpendReportDescription": "説明",
"TimeSpendDays": "{value}日",
"TimeSpendHours": "{value}時間",
"TimeSpendMinutes": "{value}分",
"ChildEstimation": "子イシューの見積もり",
"ChildReportedTime": "子イシューの時間",
"CapacityValue": "うち {value}日",
"NewRelatedIssue": "新しい関連イシュー",
"RelatedIssuesNotFound": "関連イシューが見つかりません",
"AddedReference": "参照を追加",
"AddedAsBlocked": "ブロックされているとしてマーク",
"AddedAsBlocking": "ブロックしているとしてマーク",
"IssueTemplate": "テンプレート",
"IssueTemplates": "テンプレート",
"NewProcess": "新しいテンプレート",
"SaveProcess": "テンプレートを保存",
"NoIssueTemplate": "テンプレートなし",
"TemplateReplace": "新しいテンプレートを適用しますか?",
"TemplateReplaceConfirm": "すべてのフィールドが新しいテンプレートの値で上書きされます",
"Apply": "適用",
"CurrentWorkDay": "現在の営業日",
"PreviousWorkDay": "前の営業日",
"TimeReportDayTypeLabel": "時間レポートの日種別を選択",
"DefaultAssignee": "イシューのデフォルトの担当者",
"SevenHoursLength": "7時間",
"EightHoursLength": "8時間",
"HourLabel": "時間",
"MinuteLabel": "分",
"Saved": "保存済み...",
"CreatedIssue": "イシューを作成しました",
"CreatedSubIssue": "子イシューを作成しました",
"ChangeStatus": "ステータスを変更",
"ConfigLabel": "トラッカー",
"ConfigDescription": "作業項目を管理し、すべてのジョブを完了するための拡張機能。",
"NoStatusFound": "一致するステータスが見つかりません",
"CreateMissingStatus": "不足しているステータスを作成",
"UnsetParent": "親イシューが設定されなくなります",
"AllProjects": "すべてのプロジェクト",
"IssueNotificationTitle": "{issueTitle}",
"IssueNotificationBody": "{senderName} が更新しました",
"IssueNotificationChanged": "{senderName} が {property} を変更しました",
"IssueNotificationChangedProperty": "{senderName} が {property} を \"{newValue}\" に変更しました",
"IssueNotificationMessage": "{senderName}: {message}",
"PreviousAssigned": "以前に割り当てられた",
"IssueAssignedToYou": "あなたに割り当てられました",
"RelatedIssueTargetDescription": "クラスまたはスペースの関連イシュープロジェクトターゲット",
"MapRelatedIssues": "関連イシューのデフォルトプロジェクトを構成",
"DefaultIssueStatus": "デフォルトのイシューステータス",
"IssueStatus": "ステータス",
"Extensions": "拡張機能",
"UnsetParentIssue": "親イシューの設定を解除",
"ForbidCreateProjectPermission": "プロジェクト作成禁止",
"ForbidCreateProjectPermissionDescription": "ユーザーが新しいプロジェクトを作成することを禁止します",
"AllowCreatingIssues": "イシューの作成を許可",
"Day": "Day",
"Week": "Week",
"Month": "Month",
"Quarter": "Quarter",
"Gantt": "Gantt",
"GanttShowIssueCode": "Show issue code",
"GanttShowTitle": "Show title",
"GanttShowStatus": "Show status",
"GanttToday": "Today",
"GanttJumpToStart": "Jump to start",
"GanttJumpToEnd": "Jump to end",
"GanttJumpToDate": "Jump to date",
"GanttPreviousPeriod": "Previous period",
"GanttNextPeriod": "Next period",
"GanttScrollLeftToBar": "Scroll left to bar",
"GanttScrollRightToBar": "Scroll right to bar",
"GanttExpand": "Expand",
"GanttCollapse": "Collapse",
"GanttCornerNoOpInSwimlane": "No effect in group-by mode",
"ModeSelectorDisabledByFilter": "ステータスはアクティブなフィルターで制御されています。このショートカットを使用するにはステータスフィルターを解除してください。",
"ShowQuickModeSelector": "クイックフィルター:すべて / アクティブ / バックログ",
"SearchScopeLabel": "検索対象…",
"SearchScopeTitle": "タイトルのみ",
"SearchScopeTitleDescription": "タイトル + 説明",
"SearchScopeAll": "タイトル + 説明 + コメント",
"SearchHighlight": "検索結果をハイライト表示",
"SearchEmptyTitle": "\"{query}\" に一致するイシューが見つかりません",
"SearchEmptyActiveFilters": "アクティブなフィルター:{filters}",
"SearchEmptyClearFilters": "フィルターなしで検索",
"SearchEmptyAllProjects": "すべてのプロジェクトを検索"
},
"status": {}
}