feat(i18n): localize Avalonia view strings via loc:Tr markup

Extract ~165 hardcoded UI strings across islands, modals, planning and
shell views into en.json; replace with {loc:Tr} bindings.
This commit is contained in:
mika kuns
2026-06-03 12:05:08 +02:00
parent 070f5de1b1
commit 086c6f6c45
23 changed files with 573 additions and 259 deletions

View File

@@ -1,6 +1,7 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Islands.AgentStripView"
x:DataType="vm:DetailsIslandViewModel">
<Border Classes="agent-strip"
@@ -34,7 +35,7 @@
Classes="icon-btn"
Command="{Binding StopCommand}"
IsVisible="{Binding IsRunning}"
ToolTip.Tip="Stop agent"
ToolTip.Tip="{loc:Tr agent.stopTip}"
VerticalAlignment="Center">
<PathIcon Data="{StaticResource Icon.X}" Width="12" Height="12"
Foreground="{DynamicResource BloodBrush}"/>
@@ -42,19 +43,19 @@
<!-- Send to queue — only when idle -->
<Button Grid.Column="3"
Classes="btn accent"
Content="Send to queue"
Content="{loc:Tr agent.sendToQueue}"
Command="{Binding EnqueueCommand}"
IsVisible="{Binding IsIdle}"
ToolTip.Tip="Queue this task for the worker to pick up"
ToolTip.Tip="{loc:Tr agent.sendToQueueTip}"
VerticalAlignment="Center"
Padding="10,4"/>
<!-- Remove from queue — only when queued -->
<Button Grid.Column="3"
Classes="btn"
Content="Remove from queue"
Content="{loc:Tr agent.removeFromQueue}"
Command="{Binding DequeueCommand}"
IsVisible="{Binding IsQueued}"
ToolTip.Tip="Take this task back out of the queue"
ToolTip.Tip="{loc:Tr agent.removeFromQueueTip}"
VerticalAlignment="Center"
Padding="10,4"/>
</Grid>
@@ -64,7 +65,7 @@
IsVisible="{Binding WorktreePath, Converter={x:Static ObjectConverters.IsNotNull}}">
<TextBlock Grid.Column="0"
Classes="eyebrow"
Text="WORKTREE"
Text="{loc:Tr agent.worktreeLabel}"
Foreground="{DynamicResource TextFaintBrush}"
LetterSpacing="1.2"
VerticalAlignment="Center"
@@ -76,7 +77,7 @@
VerticalAlignment="Center"/>
<Button Grid.Column="2"
Classes="icon-btn"
ToolTip.Tip="Copy path"
ToolTip.Tip="{loc:Tr agent.copyPathTip}"
Click="OnCopyWorktreePathClick"
VerticalAlignment="Center">
<PathIcon Data="{StaticResource Icon.Copy}" Width="11" Height="11"/>
@@ -105,7 +106,7 @@
<Grid ColumnDefinitions="Auto,Auto,Auto,*">
<TextBlock Grid.Column="0"
Classes="eyebrow"
Text="DIFF"
Text="{loc:Tr agent.diffLabel}"
Foreground="{DynamicResource TextFaintBrush}"
LetterSpacing="1.2"
VerticalAlignment="Center"
@@ -136,27 +137,27 @@
<!-- Action buttons -->
<StackPanel Orientation="Horizontal" Spacing="6" Margin="0,4,0,0">
<Button Classes="btn" Content="Open diff" Command="{Binding OpenDiffCommand}"/>
<Button Classes="btn" Content="{loc:Tr agent.openDiff}" Command="{Binding OpenDiffCommand}"/>
<Button Classes="btn" Command="{Binding OpenWorktreeCommand}"
ToolTip.Tip="Open worktree in file explorer">
ToolTip.Tip="{loc:Tr agent.openWorktreeTip}">
<StackPanel Orientation="Horizontal" Spacing="6" VerticalAlignment="Center">
<PathIcon Data="{StaticResource Icon.ArrowOut}"
Width="11" Height="11"
Foreground="{DynamicResource TextDimBrush}"/>
<TextBlock Text="Worktree" VerticalAlignment="Center"/>
<TextBlock Text="{loc:Tr agent.worktreeBtn}" VerticalAlignment="Center"/>
</StackPanel>
</Button>
<Button Classes="btn accent"
Content="Continue"
Content="{loc:Tr agent.continue}"
Command="{Binding ContinueCommand}"
IsVisible="{Binding ShowContinue}"
ToolTip.Tip="Resume the last session and keep going"
ToolTip.Tip="{loc:Tr agent.continueTip}"
Padding="10,4"/>
<Button Classes="btn"
Content="Reset &amp; retry"
Content="{loc:Tr agent.resetAndRetry}"
Command="{Binding ResetAndRetryCommand}"
IsVisible="{Binding ShowResetAndRetry}"
ToolTip.Tip="Discard the worktree and re-queue the task to run from scratch"
ToolTip.Tip="{loc:Tr agent.resetAndRetryTip}"
Padding="10,4"/>
</StackPanel>

View File

@@ -3,6 +3,7 @@
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:islands="using:ClaudeDo.Ui.Views.Islands"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Islands.DetailsIslandView"
x:DataType="vm:DetailsIslandViewModel">
<DockPanel>
@@ -15,7 +16,7 @@
<Grid ColumnDefinitions="Auto,*,Auto">
<Button Grid.Column="0" Classes="icon-btn"
Command="{Binding DeleteTaskCommand}"
ToolTip.Tip="Delete task"
ToolTip.Tip="{loc:Tr details.deleteTaskTip}"
VerticalAlignment="Center">
<PathIcon Data="{StaticResource Icon.Trash}" Width="14" Height="14"
Foreground="{DynamicResource BloodBrush}"/>
@@ -27,7 +28,7 @@
VerticalAlignment="Center"/>
<Button Grid.Column="2" Classes="icon-btn"
Command="{Binding CloseDetailsCommand}"
ToolTip.Tip="Close"
ToolTip.Tip="{loc:Tr details.closeTip}"
VerticalAlignment="Center">
<PathIcon Data="{StaticResource Icon.X}" Width="14" Height="14"/>
</Button>
@@ -52,7 +53,7 @@
Text="{Binding TaskIdBadge}"
Margin="0,0,0,4"
Cursor="Hand"
ToolTip.Tip="Copy task ID"
ToolTip.Tip="{loc:Tr details.copyTaskIdTip}"
Tapped="OnTaskIdTapped"/>
<TextBox Text="{Binding EditableTitle, Mode=TwoWay}"
FontSize="{StaticResource FontSizeTaskTitle}" FontWeight="Medium"
@@ -67,14 +68,14 @@
Classes="icon-btn star-btn"
Classes.on="{Binding Task.IsStarred}"
Command="{Binding ToggleStarCommand}"
ToolTip.Tip="Star"
ToolTip.Tip="{loc:Tr details.starTip}"
VerticalAlignment="Top"
Margin="6,0,0,0">
<PathIcon Data="{StaticResource Icon.Star}" Width="14" Height="14"/>
</Button>
<Button Grid.Column="3" Classes="icon-btn"
ToolTip.Tip="Agent settings"
ToolTip.Tip="{loc:Tr details.agentSettingsTip}"
IsEnabled="{Binding IsAgentSectionEnabled}"
VerticalAlignment="Top"
Margin="6,0,0,0">
@@ -82,10 +83,10 @@
<Button.Flyout>
<Flyout Placement="BottomEdgeAlignedRight" ShowMode="Standard">
<StackPanel Width="340" Spacing="10" Margin="4">
<TextBlock Text="Agent settings (overrides)" FontWeight="SemiBold"/>
<TextBlock Text="{loc:Tr details.agentSettingsHeading}" FontWeight="SemiBold"/>
<StackPanel Spacing="2">
<TextBlock Classes="field-label" Text="Model"/>
<TextBlock Classes="field-label" Text="{loc:Tr details.modelLabel}"/>
<ComboBox ItemsSource="{Binding TaskModelOptions}"
SelectedItem="{Binding TaskModelSelection, Mode=TwoWay}"
HorizontalAlignment="Stretch"/>
@@ -95,14 +96,14 @@
</StackPanel>
<StackPanel Spacing="2">
<TextBlock Classes="field-label" Text="System prompt (appended)"/>
<TextBlock Classes="field-label" Text="{loc:Tr details.systemPromptLabel}"/>
<TextBox Text="{Binding TaskSystemPrompt, Mode=TwoWay}"
AcceptsReturn="True" TextWrapping="Wrap" MinHeight="70"
PlaceholderText="{Binding EffectiveSystemPromptHint}"/>
</StackPanel>
<StackPanel Spacing="2">
<TextBlock Classes="field-label" Text="Agent file"/>
<TextBlock Classes="field-label" Text="{loc:Tr details.agentFileLabel}"/>
<ComboBox ItemsSource="{Binding TaskAgentOptions}"
SelectedItem="{Binding TaskSelectedAgent, Mode=TwoWay}"
HorizontalAlignment="Stretch">
@@ -136,17 +137,17 @@
<Border Classes="section-divider"
IsVisible="{Binding Task.IsPlanningParent}">
<StackPanel Spacing="8">
<TextBlock Classes="section-label" Text="MERGE" Margin="0,0,0,2"/>
<TextBlock Classes="section-label" Text="{loc:Tr details.mergeLabel}" Margin="0,0,0,2"/>
<StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="Merge target"/>
<TextBlock Classes="field-label" Text="{loc:Tr details.mergeTargetLabel}"/>
<ComboBox ItemsSource="{Binding MergeTargetBranches}"
SelectedItem="{Binding SelectedMergeTarget, Mode=TwoWay}"
HorizontalAlignment="Stretch"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Spacing="8">
<Button Classes="btn" Content="Review combined diff"
<Button Classes="btn" Content="{loc:Tr details.reviewCombinedDiff}"
Command="{Binding ReviewCombinedDiffCommand}"/>
<Button Classes="btn" Content="Merge all subtasks"
<Button Classes="btn" Content="{loc:Tr details.mergeAllSubtasks}"
IsEnabled="{Binding CanMergeAll}"
Command="{Binding MergeAllCommand}"
ToolTip.Tip="{Binding MergeAllDisabledReason}"/>
@@ -161,9 +162,9 @@
<!-- Steps section -->
<Border Classes="section-divider">
<StackPanel Spacing="6">
<TextBlock Classes="section-label" Text="STEPS" Margin="0,0,0,2"/>
<TextBlock Classes="section-label" Text="{loc:Tr details.stepsLabel}" Margin="0,0,0,2"/>
<TextBox Text="{Binding NewSubtaskTitle, Mode=TwoWay}"
PlaceholderText="Add a step..."
PlaceholderText="{loc:Tr details.addStepPlaceholder}"
Padding="8"
Background="{DynamicResource Surface2Brush}"
BorderBrush="{DynamicResource LineBrush}"
@@ -240,14 +241,14 @@
<TextBlock Classes="meta"
Text="▸"
IsVisible="{Binding !IsDescriptionExpanded}"/>
<TextBlock Classes="section-label" Text="DETAILS"/>
<TextBlock Classes="section-label" Text="{loc:Tr details.detailsLabel}"/>
</StackPanel>
</Button>
<Button Grid.Column="2"
Classes="icon-btn"
Padding="6,2"
Margin="0,0,4,0"
ToolTip.Tip="Copy description to clipboard"
ToolTip.Tip="{loc:Tr details.copyDescriptionTip}"
IsVisible="{Binding IsDescriptionExpanded}"
Click="OnCopyDescriptionClick">
<PathIcon Data="{StaticResource Icon.Copy}" Width="11" Height="11"/>
@@ -256,17 +257,17 @@
Classes="btn"
Command="{Binding ToggleEditDescriptionCommand}"
Padding="8,3"
ToolTip.Tip="Toggle edit/preview"
ToolTip.Tip="{loc:Tr details.toggleEditPreviewTip}"
IsVisible="{Binding IsDescriptionEditorVisible}">
<TextBlock Text="Preview"/>
<TextBlock Text="{loc:Tr details.previewBtn}"/>
</Button>
<Button Grid.Column="3"
Classes="btn"
Command="{Binding ToggleEditDescriptionCommand}"
Padding="8,3"
ToolTip.Tip="Toggle edit/preview"
ToolTip.Tip="{loc:Tr details.toggleEditPreviewTip}"
IsVisible="{Binding IsDescriptionPreviewVisible}">
<TextBlock Text="Edit"/>
<TextBlock Text="{loc:Tr details.editBtn}"/>
</Button>
</Grid>
@@ -275,7 +276,7 @@
TextWrapping="Wrap"
MinHeight="80"
MaxHeight="320"
PlaceholderText="Add task details (markdown supported)..."
PlaceholderText="{loc:Tr details.descriptionPlaceholder}"
Padding="8"
FontFamily="{DynamicResource MonoFont}"
FontSize="{StaticResource FontSizeBody}"

View File

@@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:converters="using:ClaudeDo.Ui.Converters"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Islands.ListsIslandView"
x:DataType="vm:ListsIslandViewModel">
<DockPanel LastChildFill="True">
@@ -9,7 +10,7 @@
<!-- ── Header ── -->
<Border DockPanel.Dock="Top" Classes="island-header">
<StackPanel Spacing="4">
<TextBlock Classes="heading" Text="Lists"/>
<TextBlock Classes="heading" Text="{loc:Tr lists.heading}"/>
<!-- Search row -->
<Border Classes="search-wrap" Margin="0,8,0,12">
@@ -19,10 +20,10 @@
Foreground="{DynamicResource TextFaintBrush}"
Margin="2,0,0,0"/>
<TextBox Grid.Column="1" x:Name="SearchBox" Classes="search-inner"
PlaceholderText="Search tasks…"
PlaceholderText="{loc:Tr lists.searchPlaceholder}"
Text="{Binding SearchText, Mode=TwoWay}"/>
<Border Grid.Column="2" Classes="kbd" Margin="0,0,2,0">
<TextBlock Text="Ctrl K"/>
<TextBlock Text="{loc:Tr lists.searchKbd}"/>
</Border>
</Grid>
</Border>
@@ -57,7 +58,7 @@
<!-- More button -->
<Button Grid.Column="2" Classes="icon-btn" VerticalAlignment="Center"
Command="{Binding OpenSettingsCommand}"
ToolTip.Tip="Settings">
ToolTip.Tip="{loc:Tr lists.settingsTip}">
<PathIcon Data="{StaticResource Icon.MoreHorizontal}"
Width="14" Height="14"
Foreground="{DynamicResource TextMuteBrush}"/>
@@ -70,7 +71,7 @@
<StackPanel Margin="6,0,6,4">
<!-- SMART LISTS section -->
<TextBlock Classes="section-label" Text="SMART LISTS" Margin="10,10,10,4"/>
<TextBlock Classes="section-label" Text="{loc:Tr lists.smartListsLabel}" Margin="10,10,10,4"/>
<ItemsControl ItemsSource="{Binding SmartLists}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="vm:ListNavItemViewModel">
@@ -109,7 +110,7 @@
</ItemsControl>
<!-- MY LISTS section -->
<TextBlock Classes="section-label" Text="MY LISTS" Margin="10,10,10,4"/>
<TextBlock Classes="section-label" Text="{loc:Tr lists.myListsLabel}" Margin="10,10,10,4"/>
<ItemsControl ItemsSource="{Binding UserLists}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="vm:ListNavItemViewModel">
@@ -127,18 +128,18 @@
DragDrop.Drop="OnListDrop">
<Border.ContextMenu>
<ContextMenu>
<MenuItem Header="Settings..."
<MenuItem Header="{loc:Tr lists.contextSettings}"
Command="{Binding $parent[UserControl].((vm:ListsIslandViewModel)DataContext).OpenListSettingsCommand}"
CommandParameter="{Binding}"/>
<MenuItem Header="Worktrees"
<MenuItem Header="{loc:Tr lists.contextWorktrees}"
Command="{Binding $parent[UserControl].((vm:ListsIslandViewModel)DataContext).OpenWorktreesOverviewCommand}"
CommandParameter="{Binding}"/>
<Separator IsVisible="{Binding WorkingDir, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
<MenuItem Header="Open in Explorer"
<MenuItem Header="{loc:Tr lists.contextOpenExplorer}"
IsVisible="{Binding WorkingDir, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
Command="{Binding $parent[UserControl].((vm:ListsIslandViewModel)DataContext).OpenInExplorerCommand}"
CommandParameter="{Binding}"/>
<MenuItem Header="Open in Terminal"
<MenuItem Header="{loc:Tr lists.contextOpenTerminal}"
IsVisible="{Binding WorkingDir, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
Command="{Binding $parent[UserControl].((vm:ListsIslandViewModel)DataContext).OpenInTerminalCommand}"
CommandParameter="{Binding}"/>
@@ -191,14 +192,14 @@
Foreground="{DynamicResource TextMuteBrush}"
VerticalAlignment="Center"/>
<TextBlock Classes="body"
Text="New list"
Text="{loc:Tr lists.newList}"
Foreground="{DynamicResource TextMuteBrush}"
VerticalAlignment="Center"/>
</StackPanel>
</Button>
<Button Grid.Column="1" Classes="icon-btn" Margin="6,0,0,0"
Command="{Binding OpenRepoImportCommand}"
ToolTip.Tip="Add repos as lists">
ToolTip.Tip="{loc:Tr lists.addReposTip}">
<PathIcon Data="{StaticResource Icon.Folder}"
Width="14" Height="14"
Foreground="{DynamicResource TextMuteBrush}"/>

View File

@@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Islands.NotesEditorView"
x:DataType="vm:NotesEditorViewModel">
<DockPanel Margin="16">
@@ -9,14 +10,14 @@
<Button Classes="btn" Content="&#x2039;" Command="{Binding PrevDayCommand}"/>
<ctl:ThemedDatePicker SelectedDate="{Binding CurrentDate, Mode=TwoWay}"/>
<Button Classes="btn" Content="&#x203A;" Command="{Binding NextDayCommand}"/>
<Button Classes="btn" Content="Today" Command="{Binding TodayCommand}"/>
<Button Classes="btn" Content="{loc:Tr notes.today}" Command="{Binding TodayCommand}"/>
<TextBlock Classes="meta" VerticalAlignment="Center" Text="{Binding CurrentDayLabel}"/>
</StackPanel>
<DockPanel DockPanel.Dock="Top" Margin="0,12,0,8">
<Button DockPanel.Dock="Right" Classes="btn" Content="Add" Margin="8,0,0,0"
<Button DockPanel.Dock="Right" Classes="btn" Content="{loc:Tr notes.add}" Margin="8,0,0,0"
Command="{Binding AddBulletCommand}"/>
<TextBox PlaceholderText="New note&#x2026;" Text="{Binding NewBulletText}">
<TextBox PlaceholderText="{loc:Tr notes.newNotePlaceholder}" Text="{Binding NewBulletText}">
<TextBox.KeyBindings>
<KeyBinding Gesture="Enter" Command="{Binding AddBulletCommand}"/>
</TextBox.KeyBindings>
@@ -29,8 +30,8 @@
<DataTemplate x:DataType="vm:NoteBulletViewModel">
<Grid ColumnDefinitions="*,Auto,Auto" Margin="0,2" ColumnSpacing="6">
<TextBox Grid.Column="0" Text="{Binding Text}"/>
<Button Grid.Column="1" Classes="btn" Content="Save" Command="{Binding SaveCommand}"/>
<Button Grid.Column="2" Classes="btn" Content="Delete" Command="{Binding DeleteCommand}"/>
<Button Grid.Column="1" Classes="btn" Content="{loc:Tr notes.save}" Command="{Binding SaveCommand}"/>
<Button Grid.Column="2" Classes="btn" Content="{loc:Tr notes.delete}" Command="{Binding DeleteCommand}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>

View File

@@ -1,6 +1,7 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Islands.SessionTerminalView"
x:DataType="vm:DetailsIslandViewModel">
<Border Classes="terminal" Margin="18,8,18,0">
@@ -24,7 +25,7 @@
Margin="0,0,8,0" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal" Spacing="5" VerticalAlignment="Center">
<Ellipse VerticalAlignment="Center"/>
<TextBlock Text="LIVE" VerticalAlignment="Center"/>
<TextBlock Text="{loc:Tr session.chipLive}" VerticalAlignment="Center"/>
</StackPanel>
</Border>
<!-- DONE chip -->
@@ -33,7 +34,7 @@
Margin="0,0,8,0" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal" Spacing="5" VerticalAlignment="Center">
<Ellipse VerticalAlignment="Center" Fill="{DynamicResource MossBrush}"/>
<TextBlock Text="DONE" VerticalAlignment="Center"
<TextBlock Text="{loc:Tr session.chipDone}" VerticalAlignment="Center"
Foreground="{DynamicResource MossBrush}"/>
</StackPanel>
</Border>
@@ -43,7 +44,7 @@
Margin="0,0,8,0" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal" Spacing="5" VerticalAlignment="Center">
<Ellipse VerticalAlignment="Center" Fill="{DynamicResource BloodBrush}"/>
<TextBlock Text="FAILED" VerticalAlignment="Center"
<TextBlock Text="{loc:Tr session.chipFailed}" VerticalAlignment="Center"
Foreground="{DynamicResource BloodBrush}"/>
</StackPanel>
</Border>

View File

@@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Islands.TaskRowView"
x:DataType="vm:TaskRowViewModel">
<Grid>
@@ -32,38 +33,38 @@
Classes.done="{Binding Done}">
<Border.ContextMenu>
<ContextMenu>
<MenuItem Header="Send to queue"
<MenuItem Header="{loc:Tr tasks.ctxSendToQueue}"
IsVisible="{Binding CanSendToQueue}"
Click="OnSendToQueueClick"/>
<MenuItem Header="Remove from queue"
<MenuItem Header="{loc:Tr tasks.ctxRemoveFromQueue}"
IsVisible="{Binding CanRemoveFromQueue}"
Click="OnRemoveFromQueueClick"/>
<MenuItem Header="Cancel execution"
<MenuItem Header="{loc:Tr tasks.ctxCancelExecution}"
IsVisible="{Binding IsRunning}"
Click="OnCancelExecutionClick"/>
<Separator/>
<MenuItem Header="Mark as">
<MenuItem Header="Done" Tag="Done" Click="OnSetStatusClick"/>
<MenuItem Header="Cancelled" Tag="Cancelled" Click="OnSetStatusClick"/>
<MenuItem Header="{loc:Tr tasks.ctxMarkAs}">
<MenuItem Header="{loc:Tr tasks.ctxMarkDone}" Tag="Done" Click="OnSetStatusClick"/>
<MenuItem Header="{loc:Tr tasks.ctxMarkCancelled}" Tag="Cancelled" Click="OnSetStatusClick"/>
</MenuItem>
<Separator/>
<MenuItem Header="Run interactively"
<MenuItem Header="{loc:Tr tasks.ctxRunInteractively}"
Click="OnRunInteractivelyClick"/>
<MenuItem Header="Open planning Session"
<MenuItem Header="{loc:Tr tasks.ctxOpenPlanningSession}"
Click="OnOpenPlanningSessionClick"
IsVisible="{Binding CanOpenPlanningSession}"/>
<MenuItem Header="Resume planning Session"
<MenuItem Header="{loc:Tr tasks.ctxResumePlanningSession}"
Click="OnResumePlanningSessionClick"
IsVisible="{Binding CanResumeOrDiscardPlanning}"/>
<MenuItem Header="Discard planning session"
<MenuItem Header="{loc:Tr tasks.ctxDiscardPlanningSession}"
Click="OnDiscardPlanningSessionClick"
IsVisible="{Binding CanResumeOrDiscardPlanning}"/>
<MenuItem Header="Queue subtasks sequentially"
<MenuItem Header="{loc:Tr tasks.ctxQueueSubtasks}"
Click="OnQueuePlanningSubtasksClick"
IsVisible="{Binding CanQueuePlan}"/>
<Separator/>
<MenuItem Header="Schedule for..." Click="OnScheduleForClick"/>
<MenuItem Header="Clear schedule"
<MenuItem Header="{loc:Tr tasks.ctxScheduleFor}" Click="OnScheduleForClick"/>
<MenuItem Header="{loc:Tr tasks.ctxClearSchedule}"
IsVisible="{Binding HasSchedule}"
Click="OnClearScheduleClick"/>
</ContextMenu>
@@ -111,10 +112,10 @@
<StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="4"
VerticalAlignment="Center" Margin="4,0,0,0">
<Border Classes="badge draft" IsVisible="{Binding IsDraft}">
<TextBlock Text="DRAFT"/>
<TextBlock Text="{loc:Tr tasks.badgeDraft}"/>
</Border>
<Border Classes="badge planned" IsVisible="{Binding IsPlanned}">
<TextBlock Text="PLANNED"/>
<TextBlock Text="{loc:Tr tasks.badgePlanned}"/>
</Border>
<Border Classes="badge"
Classes.planning="{Binding IsPlanActive}"
@@ -141,24 +142,24 @@
<!-- Review actions (visible when WaitingForReview) -->
<StackPanel Orientation="Horizontal" Spacing="4"
IsVisible="{Binding IsWaitingForReview}">
<Button Classes="btn" Content="Approve" MinWidth="0" Padding="8,2"
ToolTip.Tip="Approve — mark Done"
<Button Classes="btn" Content="{loc:Tr tasks.approve}" MinWidth="0" Padding="8,2"
ToolTip.Tip="{loc:Tr tasks.approveTip}"
Click="OnApproveReviewClick"/>
<Button Classes="btn" Content="Reject" MinWidth="0" Padding="8,2"
ToolTip.Tip="Reject with feedback and re-run"
<Button Classes="btn" Content="{loc:Tr tasks.reject}" MinWidth="0" Padding="8,2"
ToolTip.Tip="{loc:Tr tasks.rejectTip}"
Click="OnRejectReviewClick"/>
<Button Classes="btn" Content="Park" MinWidth="0" Padding="8,2"
ToolTip.Tip="Send back to Idle for manual editing"
<Button Classes="btn" Content="{loc:Tr tasks.park}" MinWidth="0" Padding="8,2"
ToolTip.Tip="{loc:Tr tasks.parkTip}"
Click="OnParkReviewClick"/>
<Button Classes="btn" Content="Cancel" MinWidth="0" Padding="8,2"
ToolTip.Tip="Cancel this task"
<Button Classes="btn" Content="{loc:Tr tasks.cancel}" MinWidth="0" Padding="8,2"
ToolTip.Tip="{loc:Tr tasks.cancelTip}"
Click="OnCancelReviewClick"/>
</StackPanel>
<!-- Dequeue button (visible when row is Queued, or planning parent has queued subtasks) -->
<Button Classes="icon-btn dequeue-btn"
IsVisible="{Binding CanRemoveFromQueue}"
ToolTip.Tip="Remove from queue"
ToolTip.Tip="{loc:Tr tasks.removeFromQueueTip}"
Command="{Binding $parent[ItemsControl].((vm:TasksIslandViewModel)DataContext).RemoveFromQueueCommand}"
CommandParameter="{Binding}">
<PathIcon Width="10" Height="10" Data="{StaticResource Icon.X}"/>
@@ -226,10 +227,10 @@
BorderThickness="1" CornerRadius="10"
Padding="16" Width="300">
<StackPanel Spacing="12">
<TextBlock Classes="title" Text="Schedule task"/>
<TextBlock Classes="title" Text="{loc:Tr tasks.scheduleTitle}"/>
<StackPanel Spacing="6">
<TextBlock Classes="eyebrow" Text="WHEN"
<TextBlock Classes="eyebrow" Text="{loc:Tr tasks.scheduleWhen}"
Foreground="{DynamicResource TextDimBrush}" Opacity="0.6"/>
<ctl:ThemedDatePicker x:Name="ScheduleDate" ShowTime="True"
HorizontalAlignment="Stretch"/>
@@ -237,8 +238,8 @@
<StackPanel Orientation="Horizontal" Spacing="8"
HorizontalAlignment="Right" Margin="0,4,0,0">
<Button Classes="btn" Content="Cancel" Click="OnScheduleCancelClick" MinWidth="76"/>
<Button Content="Schedule" Classes="accent" Click="OnScheduleSetClick" MinWidth="76"/>
<Button Classes="btn" Content="{loc:Tr tasks.cancel}" Click="OnScheduleCancelClick" MinWidth="76"/>
<Button Content="{loc:Tr tasks.scheduleConfirm}" Classes="accent" Click="OnScheduleSetClick" MinWidth="76"/>
</StackPanel>
</StackPanel>
</Border>
@@ -258,18 +259,18 @@
BorderThickness="1" CornerRadius="10"
Padding="16" Width="320">
<StackPanel Spacing="12">
<TextBlock Classes="title" Text="Reject &amp; re-run"/>
<TextBlock Classes="title" Text="{loc:Tr tasks.rejectRerunTitle}"/>
<StackPanel Spacing="6">
<TextBlock Classes="eyebrow" Text="FEEDBACK FOR THE AGENT"
<TextBlock Classes="eyebrow" Text="{loc:Tr tasks.feedbackLabel}"
Foreground="{DynamicResource TextDimBrush}" Opacity="0.6"/>
<TextBox x:Name="RejectFeedback"
AcceptsReturn="True" TextWrapping="Wrap"
MinHeight="80" PlaceholderText="What should the agent fix?"/>
MinHeight="80" PlaceholderText="{loc:Tr tasks.feedbackPlaceholder}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Spacing="8"
HorizontalAlignment="Right" Margin="0,4,0,0">
<Button Classes="btn" Content="Cancel" Click="OnRejectCancelClick" MinWidth="76"/>
<Button Content="Re-run" Classes="accent" Click="OnRejectConfirmClick" MinWidth="76"/>
<Button Classes="btn" Content="{loc:Tr tasks.cancel}" Click="OnRejectCancelClick" MinWidth="76"/>
<Button Content="{loc:Tr tasks.rerun}" Classes="accent" Click="OnRejectConfirmClick" MinWidth="76"/>
</StackPanel>
</StackPanel>
</Border>

View File

@@ -3,6 +3,7 @@
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:islands="using:ClaudeDo.Ui.Views.Islands"
xmlns:converters="using:Avalonia.Data.Converters"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Islands.TasksIslandView"
x:DataType="vm:TasksIslandViewModel">
<DockPanel LastChildFill="True">
@@ -27,15 +28,15 @@
IsVisible="{Binding HasStatusPill}">
<TextBlock Text="{Binding StatusPill}"/>
</Border>
<Button Classes="icon-btn" Command="{Binding SortCommand}" ToolTip.Tip="Sort">
<Button Classes="icon-btn" Command="{Binding SortCommand}" ToolTip.Tip="{loc:Tr tasks.sortTip}">
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.Sort}"/>
</Button>
<Button Classes="icon-btn" Classes.active="{Binding IsShowingCompleted}"
Command="{Binding ToggleShowCompletedCommand}"
ToolTip.Tip="Show completed">
ToolTip.Tip="{loc:Tr tasks.showCompletedTip}">
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.Eye}"/>
</Button>
<Button Classes="icon-btn" Command="{Binding OpenListSettingsCommand}" ToolTip.Tip="List settings">
<Button Classes="icon-btn" Command="{Binding OpenListSettingsCommand}" ToolTip.Tip="{loc:Tr tasks.listSettingsTip}">
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.Settings}"/>
</Button>
</StackPanel>
@@ -50,7 +51,7 @@
Foreground="{DynamicResource TextFaintBrush}"/>
</Border>
<TextBox Grid.Column="1" x:Name="AddTaskBox" Classes="add-task-input"
PlaceholderText="Add a task…"
PlaceholderText="{loc:Tr tasks.addPlaceholder}"
Text="{Binding NewTaskTitle, Mode=TwoWay}"
VerticalAlignment="Center"
Margin="12,0,0,0">
@@ -60,7 +61,7 @@
</TextBox>
<Border Grid.Column="2" Classes="kbd kbd-enter" VerticalAlignment="Center"
IsVisible="{Binding #AddTaskBox.IsFocused}">
<TextBlock Text="ENTER"/>
<TextBlock Text="{loc:Tr tasks.enterKey}"/>
</Border>
</Grid>
</Border>
@@ -71,7 +72,7 @@
Margin="16,0,16,8"
IsVisible="{Binding ShowNotesRow}"
Command="{Binding OpenNotesCommand}"
Content="Notes (daily notes)"/>
Content="{loc:Tr tasks.notesPinnedRow}"/>
<!-- Task list -->
<ScrollViewer>
@@ -80,7 +81,7 @@
<!-- OVERDUE -->
<StackPanel IsVisible="{Binding HasOverdue}">
<TextBlock Classes="eyebrow section-label overdue"
Text="OVERDUE" Margin="14,14,14,6"/>
Text="{loc:Tr tasks.overdue}" Margin="14,14,14,6"/>
<ItemsControl ItemsSource="{Binding OverdueItems}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="vm:TaskRowViewModel">
@@ -104,7 +105,7 @@
<!-- TASKS -->
<StackPanel IsVisible="{Binding HasOpen}">
<TextBlock Classes="eyebrow section-label"
Text="TASKS" Margin="14,14,14,6"
Text="{loc:Tr tasks.tasks}" Margin="14,14,14,6"
IsVisible="{Binding ShowOpenLabel}"/>
<ItemsControl ItemsSource="{Binding OpenItems}">
<ItemsControl.ItemTemplate>
@@ -139,7 +140,7 @@
Text="{Binding CompletedHeader}" VerticalAlignment="Center"/>
<Button Grid.Column="1" Classes="icon-btn"
Command="{Binding ClearCompletedCommand}"
ToolTip.Tip="Clear all completed"
ToolTip.Tip="{loc:Tr tasks.clearCompletedTip}"
VerticalAlignment="Center">
<PathIcon Data="{StaticResource Icon.Trash}" Width="13" Height="13"
Foreground="{DynamicResource BloodBrush}"/>