i18n(ui): English UI labels for weekly report and notes (report body stays German)
This commit is contained in:
@@ -72,16 +72,16 @@ public sealed partial class WeeklyReportModalViewModel : ViewModelBase
|
|||||||
[RelayCommand(CanExecute = nameof(CanGenerate))]
|
[RelayCommand(CanExecute = nameof(CanGenerate))]
|
||||||
private async Task Generate()
|
private async Task Generate()
|
||||||
{
|
{
|
||||||
if (!RangeValid) { StatusMessage = "Ungültiger Zeitraum."; return; }
|
if (!RangeValid) { StatusMessage = "Invalid date range."; return; }
|
||||||
IsBusy = true;
|
IsBusy = true;
|
||||||
StatusMessage = "Bericht wird erstellt…";
|
StatusMessage = "Generating report…";
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ReportMarkdown = await _worker.GenerateWeekReportAsync(
|
ReportMarkdown = await _worker.GenerateWeekReportAsync(
|
||||||
DateOnly.FromDateTime(StartDate!.Value), DateOnly.FromDateTime(EndDate!.Value));
|
DateOnly.FromDateTime(StartDate!.Value), DateOnly.FromDateTime(EndDate!.Value));
|
||||||
StatusMessage = "";
|
StatusMessage = "";
|
||||||
}
|
}
|
||||||
catch (Exception ex) { StatusMessage = $"Fehler: {ex.Message}"; }
|
catch (Exception ex) { StatusMessage = $"Error: {ex.Message}"; }
|
||||||
finally { IsBusy = false; }
|
finally { IsBusy = false; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,14 +9,14 @@
|
|||||||
<Button Classes="btn" Content="‹" Command="{Binding PrevDayCommand}"/>
|
<Button Classes="btn" Content="‹" Command="{Binding PrevDayCommand}"/>
|
||||||
<ctl:ThemedDatePicker SelectedDate="{Binding CurrentDate, Mode=TwoWay}"/>
|
<ctl:ThemedDatePicker SelectedDate="{Binding CurrentDate, Mode=TwoWay}"/>
|
||||||
<Button Classes="btn" Content="›" Command="{Binding NextDayCommand}"/>
|
<Button Classes="btn" Content="›" Command="{Binding NextDayCommand}"/>
|
||||||
<Button Classes="btn" Content="Heute" Command="{Binding TodayCommand}"/>
|
<Button Classes="btn" Content="Today" Command="{Binding TodayCommand}"/>
|
||||||
<TextBlock Classes="meta" VerticalAlignment="Center" Text="{Binding CurrentDayLabel}"/>
|
<TextBlock Classes="meta" VerticalAlignment="Center" Text="{Binding CurrentDayLabel}"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<DockPanel DockPanel.Dock="Top" Margin="0,12,0,8">
|
<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="Add" Margin="8,0,0,0"
|
||||||
Command="{Binding AddBulletCommand}"/>
|
Command="{Binding AddBulletCommand}"/>
|
||||||
<TextBox PlaceholderText="Neue Notiz…" Text="{Binding NewBulletText}">
|
<TextBox PlaceholderText="New note…" Text="{Binding NewBulletText}">
|
||||||
<TextBox.KeyBindings>
|
<TextBox.KeyBindings>
|
||||||
<KeyBinding Gesture="Enter" Command="{Binding AddBulletCommand}"/>
|
<KeyBinding Gesture="Enter" Command="{Binding AddBulletCommand}"/>
|
||||||
</TextBox.KeyBindings>
|
</TextBox.KeyBindings>
|
||||||
@@ -29,8 +29,8 @@
|
|||||||
<DataTemplate x:DataType="vm:NoteBulletViewModel">
|
<DataTemplate x:DataType="vm:NoteBulletViewModel">
|
||||||
<Grid ColumnDefinitions="*,Auto,Auto" Margin="0,2" ColumnSpacing="6">
|
<Grid ColumnDefinitions="*,Auto,Auto" Margin="0,2" ColumnSpacing="6">
|
||||||
<TextBox Grid.Column="0" Text="{Binding Text}"/>
|
<TextBox Grid.Column="0" Text="{Binding Text}"/>
|
||||||
<Button Grid.Column="1" Classes="btn" Content="Speichern" Command="{Binding SaveCommand}"/>
|
<Button Grid.Column="1" Classes="btn" Content="Save" Command="{Binding SaveCommand}"/>
|
||||||
<Button Grid.Column="2" Classes="btn" Content="Löschen" Command="{Binding DeleteCommand}"/>
|
<Button Grid.Column="2" Classes="btn" Content="Delete" Command="{Binding DeleteCommand}"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</ItemsControl.ItemTemplate>
|
</ItemsControl.ItemTemplate>
|
||||||
|
|||||||
@@ -71,7 +71,7 @@
|
|||||||
Margin="16,0,16,8"
|
Margin="16,0,16,8"
|
||||||
IsVisible="{Binding ShowNotesRow}"
|
IsVisible="{Binding ShowNotesRow}"
|
||||||
Command="{Binding OpenNotesCommand}"
|
Command="{Binding OpenNotesCommand}"
|
||||||
Content="Notizen (Tagesnotizen)"/>
|
Content="Notes (daily notes)"/>
|
||||||
|
|
||||||
<!-- Task list -->
|
<!-- Task list -->
|
||||||
<ScrollViewer>
|
<ScrollViewer>
|
||||||
|
|||||||
@@ -65,7 +65,7 @@
|
|||||||
Command="{Binding RestartWorkerCommand}"/>
|
Command="{Binding RestartWorkerCommand}"/>
|
||||||
<MenuItem Header="Worktrees…"
|
<MenuItem Header="Worktrees…"
|
||||||
Command="{Binding OpenWorktreesOverviewGlobalCommand}"/>
|
Command="{Binding OpenWorktreesOverviewGlobalCommand}"/>
|
||||||
<MenuItem Header="Wochenbericht…" Command="{Binding OpenWeeklyReportCommand}"/>
|
<MenuItem Header="Weekly Report…" Command="{Binding OpenWeeklyReportCommand}"/>
|
||||||
<MenuItem Header="About…" Command="{Binding OpenAboutCommand}"/>
|
<MenuItem Header="About…" Command="{Binding OpenAboutCommand}"/>
|
||||||
<MenuItem Header="Add repos as lists…" Command="{Binding OpenRepoImportCommand}"/>
|
<MenuItem Header="Add repos as lists…" Command="{Binding OpenRepoImportCommand}"/>
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
|
|||||||
@@ -79,19 +79,19 @@
|
|||||||
Opacity="0.6" FontSize="12"/>
|
Opacity="0.6" FontSize="12"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel Spacing="4">
|
<StackPanel Spacing="4">
|
||||||
<TextBlock Classes="field-label" Text="Bericht: ausgeschlossene Pfade (einer pro Zeile)"/>
|
<TextBlock Classes="field-label" Text="Report: excluded paths (one per line)"/>
|
||||||
<TextBox AcceptsReturn="True" MinHeight="60" Text="{Binding General.ReportExcludedPaths, Mode=TwoWay}"/>
|
<TextBox AcceptsReturn="True" MinHeight="60" Text="{Binding General.ReportExcludedPaths, Mode=TwoWay}"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel Spacing="4">
|
<StackPanel Spacing="4">
|
||||||
<TextBlock Classes="field-label" Text="Standup-Wochentag"/>
|
<TextBlock Classes="field-label" Text="Standup weekday"/>
|
||||||
<ComboBox SelectedIndex="{Binding General.StandupWeekday, Mode=TwoWay}" HorizontalAlignment="Left">
|
<ComboBox SelectedIndex="{Binding General.StandupWeekday, Mode=TwoWay}" HorizontalAlignment="Left">
|
||||||
<ComboBoxItem>Sonntag</ComboBoxItem>
|
<ComboBoxItem>Sunday</ComboBoxItem>
|
||||||
<ComboBoxItem>Montag</ComboBoxItem>
|
<ComboBoxItem>Monday</ComboBoxItem>
|
||||||
<ComboBoxItem>Dienstag</ComboBoxItem>
|
<ComboBoxItem>Tuesday</ComboBoxItem>
|
||||||
<ComboBoxItem>Mittwoch</ComboBoxItem>
|
<ComboBoxItem>Wednesday</ComboBoxItem>
|
||||||
<ComboBoxItem>Donnerstag</ComboBoxItem>
|
<ComboBoxItem>Thursday</ComboBoxItem>
|
||||||
<ComboBoxItem>Freitag</ComboBoxItem>
|
<ComboBoxItem>Friday</ComboBoxItem>
|
||||||
<ComboBoxItem>Samstag</ComboBoxItem>
|
<ComboBoxItem>Saturday</ComboBoxItem>
|
||||||
</ComboBox>
|
</ComboBox>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
|
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
|
||||||
x:Class="ClaudeDo.Ui.Views.Modals.WeeklyReportModalView"
|
x:Class="ClaudeDo.Ui.Views.Modals.WeeklyReportModalView"
|
||||||
x:DataType="vm:WeeklyReportModalViewModel"
|
x:DataType="vm:WeeklyReportModalViewModel"
|
||||||
Title="Wochenbericht"
|
Title="Weekly Report"
|
||||||
Width="820" Height="640"
|
Width="820" Height="640"
|
||||||
WindowDecorations="None"
|
WindowDecorations="None"
|
||||||
ExtendClientAreaToDecorationsHint="True"
|
ExtendClientAreaToDecorationsHint="True"
|
||||||
@@ -14,16 +14,16 @@
|
|||||||
<KeyBinding Gesture="Escape" Command="{Binding CloseCommand}"/>
|
<KeyBinding Gesture="Escape" Command="{Binding CloseCommand}"/>
|
||||||
</Window.KeyBindings>
|
</Window.KeyBindings>
|
||||||
|
|
||||||
<ctl:ModalShell Title="WOCHENBERICHT" CloseCommand="{Binding CloseCommand}">
|
<ctl:ModalShell Title="WEEKLY REPORT" CloseCommand="{Binding CloseCommand}">
|
||||||
<DockPanel Margin="20,16">
|
<DockPanel Margin="20,16">
|
||||||
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Spacing="8">
|
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Spacing="8">
|
||||||
<TextBlock Classes="meta" Text="Von" VerticalAlignment="Center"/>
|
<TextBlock Classes="meta" Text="From" VerticalAlignment="Center"/>
|
||||||
<ctl:ThemedDatePicker SelectedDate="{Binding StartDate}"/>
|
<ctl:ThemedDatePicker SelectedDate="{Binding StartDate}"/>
|
||||||
<TextBlock Classes="meta" Text="Bis" VerticalAlignment="Center"/>
|
<TextBlock Classes="meta" Text="To" VerticalAlignment="Center"/>
|
||||||
<ctl:ThemedDatePicker SelectedDate="{Binding EndDate}"/>
|
<ctl:ThemedDatePicker SelectedDate="{Binding EndDate}"/>
|
||||||
<Button Classes="btn" Content="Erstellen" Command="{Binding GenerateCommand}"
|
<Button Classes="btn" Content="Generate" Command="{Binding GenerateCommand}"
|
||||||
IsVisible="{Binding EmptyStateVisible}"/>
|
IsVisible="{Binding EmptyStateVisible}"/>
|
||||||
<Button Classes="btn" Content="Neu erstellen" Command="{Binding GenerateCommand}"
|
<Button Classes="btn" Content="Regenerate" Command="{Binding GenerateCommand}"
|
||||||
IsVisible="{Binding HasReport}"/>
|
IsVisible="{Binding HasReport}"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
Text="{Binding StatusMessage}"/>
|
Text="{Binding StatusMessage}"/>
|
||||||
|
|
||||||
<TextBlock DockPanel.Dock="Top" Classes="meta" Margin="0,16"
|
<TextBlock DockPanel.Dock="Top" Classes="meta" Margin="0,16"
|
||||||
Text='Noch kein Bericht für diesen Zeitraum. Klicke „Erstellen“.'
|
Text='No report for this range yet. Click “Generate”.'
|
||||||
IsVisible="{Binding EmptyStateVisible}"/>
|
IsVisible="{Binding EmptyStateVisible}"/>
|
||||||
|
|
||||||
<ScrollViewer IsVisible="{Binding HasReport}">
|
<ScrollViewer IsVisible="{Binding HasReport}">
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ namespace ClaudeDo.Worker.Report;
|
|||||||
public sealed class WeekReportService : IWeekReportService
|
public sealed class WeekReportService : IWeekReportService
|
||||||
{
|
{
|
||||||
private static readonly string[] DefaultExcludes = { @"C:\Private" };
|
private static readonly string[] DefaultExcludes = { @"C:\Private" };
|
||||||
private const string NoActivity = "_Keine Aktivität in diesem Zeitraum._";
|
private const string NoActivity = "_No activity in this period._";
|
||||||
|
|
||||||
private readonly IClaudeHistoryReader _reader;
|
private readonly IClaudeHistoryReader _reader;
|
||||||
private readonly IDbContextFactory<ClaudeDoDbContext> _dbFactory;
|
private readonly IDbContextFactory<ClaudeDoDbContext> _dbFactory;
|
||||||
@@ -72,7 +72,7 @@ public sealed class WeekReportService : IWeekReportService
|
|||||||
var args = $"-p --output-format stream-json --verbose --permission-mode auto --model {safeModel}";
|
var args = $"-p --output-format stream-json --verbose --permission-mode auto --model {safeModel}";
|
||||||
var result = await _claude.RunAsync(args, prompt, Path.GetTempPath(), _ => Task.CompletedTask, ct);
|
var result = await _claude.RunAsync(args, prompt, Path.GetTempPath(), _ => Task.CompletedTask, ct);
|
||||||
if (!result.IsSuccess)
|
if (!result.IsSuccess)
|
||||||
throw new InvalidOperationException(result.ErrorMarkdown ?? "Claude konnte den Bericht nicht erzeugen.");
|
throw new InvalidOperationException(result.ErrorMarkdown ?? "Claude could not generate the report.");
|
||||||
markdown = result.ResultMarkdown!;
|
markdown = result.ResultMarkdown!;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public class WeekReportServiceTests : IDisposable
|
|||||||
var md = await svc.GenerateAsync(Start, End);
|
var md = await svc.GenerateAsync(Start, End);
|
||||||
|
|
||||||
Assert.Equal(0, claude.Calls);
|
Assert.Equal(0, claude.Calls);
|
||||||
Assert.Contains("Keine Aktivität", md);
|
Assert.Contains("No activity", md);
|
||||||
using var ctx = _db.CreateContext();
|
using var ctx = _db.CreateContext();
|
||||||
Assert.NotNull(await new WeekReportRepository(ctx).GetByRangeAsync(Start, End));
|
Assert.NotNull(await new WeekReportRepository(ctx).GetByRangeAsync(Start, End));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user