@context!.Title
@shortedSpanId
@@ -65,15 +65,15 @@
-
+
-
+
+
@@ -186,19 +187,20 @@
-
-
@{
var isServerOrConsumer = context.Span.Kind == OtlpSpanKind.Server || context.Span.Kind == OtlpSpanKind.Consumer;
@@ -112,12 +112,12 @@
+ Value="@GetSpanIcon(context.Span)"/>
}
@if (context.IsError)
{
-
+
}
@GetResourceName(context.Span.Source)
@if (context.HasUninstrumentedPeer)
@@ -139,9 +139,10 @@
icon = new Icons.Filled.Size16.ArrowCircleRight();
}
}
-
+
@context.UninstrumentedPeer
}
@@ -149,8 +150,8 @@
-
@* First column starts at 0. We don't want to display the smallest unit (0μs) because that looks odd. Use the unit from the next column *@
@@ -166,7 +167,7 @@
@DurationFormatter.FormatDuration(trace.Duration / 4 * 3)
- @DurationFormatter.FormatDuration(trace.Duration)
+
- @ControlStringsLoc[nameof(ControlsStrings.ViewAction)]
+ @ControlStringsLoc[nameof(ControlsStrings.ViewAction)]
-
diff --git a/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor.cs b/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor.cs
index a393f3f9f1..b2319dbdd1 100644
--- a/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor.cs
+++ b/src/Aspire.Dashboard/Components/Pages/TraceDetail.razor.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
+using Aspire.Dashboard.Components.Resize;
using Aspire.Dashboard.Model;
using Aspire.Dashboard.Model.Otlp;
using Aspire.Dashboard.Otlp.Model;
@@ -15,6 +16,10 @@ namespace Aspire.Dashboard.Components.Pages;
public partial class TraceDetail : ComponentBase
{
+ private const string NameColumn = nameof(NameColumn);
+ private const string TicksColumn = nameof(TicksColumn);
+ private const string DetailsColumn = nameof(DetailsColumn);
+
private readonly List _peerChangesSubscriptions = new();
private OtlpTrace? _trace;
private Subscription? _tracesSubscription;
@@ -23,6 +28,7 @@ public partial class TraceDetail : ComponentBase
private List _applications = default!;
private readonly List _collapsedSpanIds = [];
private string? _elementIdBeforeDetailsViewOpened;
+ private GridColumnManager _manager = null!;
[Parameter]
public required string TraceId { get; set; }
@@ -46,8 +52,20 @@ public partial class TraceDetail : ComponentBase
[Inject]
public required NavigationManager NavigationManager { get; init; }
+ [Inject]
+ public required DimensionManager DimensionManager { get; init; }
+
+ [CascadingParameter]
+ public required ViewportInformation ViewportInformation { get; set; }
+
protected override void OnInitialized()
{
+ _manager = new GridColumnManager([
+ new GridColumn(Name: NameColumn, DesktopWidth: "4fr", MobileWidth: "4fr"),
+ new GridColumn(Name: TicksColumn, DesktopWidth: "12fr", MobileWidth: "12fr"),
+ new GridColumn(Name: DetailsColumn, DesktopWidth: "85px", MobileWidth: null)
+ ], DimensionManager);
+
foreach (var resolver in OutgoingPeerResolvers)
{
_peerChangesSubscriptions.Add(resolver.OnPeerChanges(async () =>
diff --git a/src/Aspire.Dashboard/Components/Pages/Traces.razor b/src/Aspire.Dashboard/Components/Pages/Traces.razor
index 438d51288c..c64c254524 100644
--- a/src/Aspire.Dashboard/Components/Pages/Traces.razor
+++ b/src/Aspire.Dashboard/Components/Pages/Traces.razor
@@ -41,18 +41,21 @@
ResizableColumns="true"
ItemsProvider="@GetData"
TGridItem="OtlpTrace"
- GridTemplateColumns="2fr 3fr 0.8fr 0.8fr 0.5fr"
+ GridTemplateColumns="@_manager.GetGridTemplateColumns()"
ShowHover="true"
OnRowClick="@(r => r.ExecuteOnDefault(d => NavigationManager.NavigateTo(DashboardUrls.TraceDetailUrl(d.TraceId))))"
Class="enable-row-click">
-
+
+ @FormatHelpers.FormatTimeWithOptionalDate(TimeProvider, context.FirstSpan.StartTime, MillisecondsDisplay.Truncated)
+
+
@OtlpHelpers.ToShortenedId(context.TraceId)
-
+
@foreach (var item in context.Spans.GroupBy(s => s.Source).OrderBy(g => g.Min(s => s.StartTime)))
@@ -88,10 +91,7 @@
-
- @FormatHelpers.FormatTimeWithOptionalDate(TimeProvider, context.FirstSpan.StartTime, MillisecondsDisplay.Truncated)
-
-
+
-
-
+
@ControlsStringsLoc[nameof(ControlsStrings.ViewAction)]
diff --git a/src/Aspire.Dashboard/Components/Pages/Traces.razor.cs b/src/Aspire.Dashboard/Components/Pages/Traces.razor.cs
index 93806ecd65..8a1fd0064a 100644
--- a/src/Aspire.Dashboard/Components/Pages/Traces.razor.cs
+++ b/src/Aspire.Dashboard/Components/Pages/Traces.razor.cs
@@ -21,6 +21,12 @@ namespace Aspire.Dashboard.Components.Pages;
public partial class Traces : IPageWithSessionAndUrlState
{
+ private const string TimestampColumn = nameof(TimestampColumn);
+ private const string NameColumn = nameof(NameColumn);
+ private const string SpansColumn = nameof(SpansColumn);
+ private const string DurationColumn = nameof(DurationColumn);
+ private const string DetailsColumn = nameof(DetailsColumn);
+
private SelectViewModel _allApplication = null!;
private TotalItemsFooter _totalItemsFooter = default!;
@@ -32,6 +38,7 @@ public partial class Traces : IPageWithSessionAndUrlState "Traces_PageState";
public string BasePath => DashboardUrls.TracesBasePath;
@@ -68,7 +75,7 @@ public partial class Traces : IPageWithSessionAndUrlState
protected override Task OnInitializedAsync()
{
- _allApplication = new SelectViewModel { Id = null, Name = ControlsStringsLoc[nameof(ControlsStrings.All)] };
+ _manager = new GridColumnManager([
+ new GridColumn(Name: TimestampColumn, DesktopWidth: "0.8fr", MobileWidth: "0.8fr"),
+ new GridColumn(Name: NameColumn, DesktopWidth: "2fr", MobileWidth: "2fr"),
+ new GridColumn(Name: SpansColumn, DesktopWidth: "3fr"),
+ new GridColumn(Name: DurationColumn, DesktopWidth: "0.8fr"),
+ new GridColumn(Name: DetailsColumn, DesktopWidth: "0.5fr", MobileWidth: "1fr")
+ ], DimensionManager);
+
+ _allApplication = new SelectViewModel { Id = null, Name = ControlsStringsLoc[name: nameof(ControlsStrings.All)] };
PageViewModel = new TracesPageViewModel { SelectedApplication = _allApplication };
UpdateApplications();
- _applicationsSubscription = TelemetryRepository.OnNewApplications(() => InvokeAsync(() =>
+ _applicationsSubscription = TelemetryRepository.OnNewApplications(callback: () => InvokeAsync(workItem: () =>
{
UpdateApplications();
StateHasChanged();
diff --git a/src/Aspire.Dashboard/Components/Resize/BrowserDimensionWatcher.razor.cs b/src/Aspire.Dashboard/Components/Resize/BrowserDimensionWatcher.razor.cs
index b2f590097e..fc1d9e025f 100644
--- a/src/Aspire.Dashboard/Components/Resize/BrowserDimensionWatcher.razor.cs
+++ b/src/Aspire.Dashboard/Components/Resize/BrowserDimensionWatcher.razor.cs
@@ -8,6 +8,15 @@ namespace Aspire.Dashboard.Components.Resize;
public class BrowserDimensionWatcher : ComponentBase
{
+ // Set our mobile cutoff at 768 pixels, which is ~medium tablet size
+ private const int MobileCutoffPixelWidth = 768;
+
+ // A small enough height that the filters button takes up too much of the vertical space on screen
+ private const int LowHeightCutoffPixelWidth = 400;
+
+ // Very close to the minimum width we need to support (320px)
+ private const int LowWidthCutoffPixelWidth = 350;
+
[Parameter]
public ViewportInformation? ViewportInformation { get; set; }
@@ -26,6 +35,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
{
var viewport = await JS.InvokeAsync("window.getWindowDimensions");
ViewportInformation = GetViewportInformation(viewport);
+ DimensionManager.InvokeOnBrowserDimensionsChanged(ViewportInformation);
await ViewportInformationChanged.InvokeAsync(ViewportInformation);
await JS.InvokeVoidAsync("window.listenToWindowResize", DotNetObjectReference.Create(this));
@@ -39,27 +49,28 @@ public async Task OnResizeAsync(ViewportSize viewportSize)
{
var newViewportInformation = GetViewportInformation(viewportSize);
- if (newViewportInformation.IsDesktop != ViewportInformation!.IsDesktop || newViewportInformation.IsUltraLowHeight != ViewportInformation.IsUltraLowHeight)
+ if (newViewportInformation.IsDesktop != ViewportInformation!.IsDesktop
+ || newViewportInformation.IsUltraLowHeight != ViewportInformation.IsUltraLowHeight
+ || newViewportInformation.IsUltraLowWidth != ViewportInformation.IsUltraLowWidth)
{
ViewportInformation = newViewportInformation;
DimensionManager.IsResizing = true;
-
+ // A re-render happens on components after ViewportInformationChanged is invoked
+ // we should invoke OnBrowserDimensionsChanged first so that listeners of it
+ // that are outside of the UI tree have the current viewport kind internally when components
+ // call them
+ DimensionManager.InvokeOnBrowserDimensionsChanged(newViewportInformation);
await ViewportInformationChanged.InvokeAsync(newViewportInformation);
- DimensionManager.InvokeOnBrowserDimensionsChanged();
-
DimensionManager.IsResizing = false;
}
}
private static ViewportInformation GetViewportInformation(ViewportSize viewportSize)
{
- return new ViewportInformation(IsDesktop: viewportSize.Width > 768, IsUltraLowHeight: viewportSize.Height < 400);
+ return new ViewportInformation(
+ IsDesktop: viewportSize.Width > MobileCutoffPixelWidth,
+ IsUltraLowHeight: viewportSize.Height < LowHeightCutoffPixelWidth,
+ IsUltraLowWidth: viewportSize.Width < LowWidthCutoffPixelWidth);
}
-
- public static ViewportInformation Create(int height, int width)
- {
- return new ViewportInformation(IsDesktop: width > 768, IsUltraLowHeight: height < 400);
- }
-
public record ViewportSize(int Width, int Height);
}
diff --git a/src/Aspire.Dashboard/Components/Resize/DimensionManager.cs b/src/Aspire.Dashboard/Components/Resize/DimensionManager.cs
index f6a558e1e7..7b5758d150 100644
--- a/src/Aspire.Dashboard/Components/Resize/DimensionManager.cs
+++ b/src/Aspire.Dashboard/Components/Resize/DimensionManager.cs
@@ -5,12 +5,22 @@ namespace Aspire.Dashboard.Components.Resize;
public class DimensionManager
{
- public event EventHandler? OnBrowserDimensionsChanged;
+ private ViewportInformation? _viewportInformation;
+ public event BrowserDimensionsChangedEventHandler? OnBrowserDimensionsChanged;
public bool IsResizing { get; set; }
+ public ViewportInformation ViewportInformation => _viewportInformation ?? throw new ArgumentNullException(nameof(_viewportInformation));
- internal void InvokeOnBrowserDimensionsChanged()
+ internal void InvokeOnBrowserDimensionsChanged(ViewportInformation newViewportInformation)
{
- OnBrowserDimensionsChanged?.Invoke(this, EventArgs.Empty);
+ _viewportInformation = newViewportInformation;
+ OnBrowserDimensionsChanged?.Invoke(this, new BrowserDimensionsChangedEventArgs(newViewportInformation));
}
}
+
+public delegate void BrowserDimensionsChangedEventHandler(object sender, BrowserDimensionsChangedEventArgs e);
+
+public class BrowserDimensionsChangedEventArgs(ViewportInformation viewportInformation) : EventArgs
+{
+ public ViewportInformation ViewportInformation { get; } = viewportInformation;
+}
diff --git a/src/Aspire.Dashboard/Components/Resize/ViewportInformation.cs b/src/Aspire.Dashboard/Components/Resize/ViewportInformation.cs
index 95921a5dae..40bae76388 100644
--- a/src/Aspire.Dashboard/Components/Resize/ViewportInformation.cs
+++ b/src/Aspire.Dashboard/Components/Resize/ViewportInformation.cs
@@ -3,9 +3,12 @@
namespace Aspire.Dashboard.Components.Resize;
-/// Set our mobile cutoff at 768 pixels, which is ~medium tablet size
+/// Whether the viewport is desktop-sized
/// Ultra low height is users with very high zooms and/or very low resolutions,
/// where the height is significantly constrained. In these cases, the users need the entire main page content
/// (toolbar, title, main content, footer) to be scrollable, rather than just the main content.
///
-public record ViewportInformation(bool IsDesktop, bool IsUltraLowHeight);
+/// Ultra low width means users with extremely constricted viewport widths, requiring
+/// the disabling of horizontal space-intensive non-essential features such as the copy button in GridValue, so as
+/// to preserve maximum space for content.
+public record ViewportInformation(bool IsDesktop, bool IsUltraLowHeight, bool IsUltraLowWidth);
diff --git a/src/Aspire.Dashboard/Components/ResourcesGridColumns/GridColumnManager.cs b/src/Aspire.Dashboard/Components/ResourcesGridColumns/GridColumnManager.cs
new file mode 100644
index 0000000000..c63760b301
--- /dev/null
+++ b/src/Aspire.Dashboard/Components/ResourcesGridColumns/GridColumnManager.cs
@@ -0,0 +1,54 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Aspire.Dashboard.Components.Resize;
+using Aspire.Dashboard.Model;
+
+namespace Aspire.Dashboard.Components;
+
+public class GridColumnManager
+{
+ private readonly GridColumn[] _columns;
+ private readonly DimensionManager _dimensionManager;
+
+ public GridColumnManager(GridColumn[] columns, DimensionManager dimensionManager)
+ {
+ if (columns.DistinctBy(c => c.Name, StringComparers.GridColumn).Count() != columns.Length)
+ {
+ throw new InvalidOperationException("There are duplicate columns");
+ }
+
+ _columns = columns;
+ _dimensionManager = dimensionManager;
+ }
+
+ public bool IsColumnVisible(string columnId)
+ {
+ return GetColumnWidth(_columns.First(column => column.Name == columnId)) is not null;
+ }
+
+ private string? GetColumnWidth(GridColumn column)
+ {
+ if (column.IsVisible is not null && !column.IsVisible())
+ {
+ return null;
+ }
+
+ if (_dimensionManager.ViewportInformation.IsDesktop)
+ {
+ return column.DesktopWidth;
+ }
+
+ return column.MobileWidth;
+ }
+
+ public string GetGridTemplateColumns()
+ {
+ var visibleColumns = _columns
+ .Select(GetColumnWidth)
+ .Where(s => s is not null)
+ .Select(s => s!);
+
+ return string.Join(" ", visibleColumns);
+ }
+}
diff --git a/src/Aspire.Dashboard/Model/GridColumn.cs b/src/Aspire.Dashboard/Model/GridColumn.cs
new file mode 100644
index 0000000000..76126685fc
--- /dev/null
+++ b/src/Aspire.Dashboard/Model/GridColumn.cs
@@ -0,0 +1,6 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Aspire.Dashboard.Model;
+
+public record GridColumn(string Name, string? DesktopWidth, string? MobileWidth = null, Func? IsVisible = null);
diff --git a/src/Aspire.Dashboard/Resources/ConsoleLogs.Designer.cs b/src/Aspire.Dashboard/Resources/ConsoleLogs.Designer.cs
index 2e9f0775bb..7a432d8905 100644
--- a/src/Aspire.Dashboard/Resources/ConsoleLogs.Designer.cs
+++ b/src/Aspire.Dashboard/Resources/ConsoleLogs.Designer.cs
@@ -11,46 +11,32 @@ namespace Aspire.Dashboard.Resources {
using System;
- /// Console logs
+
+ Select resource
+
{0} console logs
{0} is an application name
diff --git a/src/Aspire.Dashboard/Resources/Layout.resx b/src/Aspire.Dashboard/Resources/Layout.resx
index 6334ad62be..37aa54cb09 100644
--- a/src/Aspire.Dashboard/Resources/Layout.resx
+++ b/src/Aspire.Dashboard/Resources/Layout.resx
@@ -169,6 +169,6 @@
Telemetry endpoint is unsecured
- View Filters
+ View filters
diff --git a/src/Aspire.Dashboard/Resources/Metrics.Designer.cs b/src/Aspire.Dashboard/Resources/Metrics.Designer.cs
index ead368c287..1dff7713ac 100644
--- a/src/Aspire.Dashboard/Resources/Metrics.Designer.cs
+++ b/src/Aspire.Dashboard/Resources/Metrics.Designer.cs
@@ -1,7 +1,6 @@
//------------------------------------------------------------------------------
//
// This code was generated by a tool.
-// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@@ -12,46 +11,32 @@ namespace Aspire.Dashboard.Resources {
using System;
- ///
-
@@ -169,4 +169,7 @@
Instrument
-
\ No newline at end of file
+
+ View attributes
+
+
diff --git a/src/Aspire.Dashboard/Resources/TraceDetail.Designer.cs b/src/Aspire.Dashboard/Resources/TraceDetail.Designer.cs
index 81936250d4..c3c568d089 100644
--- a/src/Aspire.Dashboard/Resources/TraceDetail.Designer.cs
+++ b/src/Aspire.Dashboard/Resources/TraceDetail.Designer.cs
@@ -11,46 +11,32 @@ namespace Aspire.Dashboard.Resources {
using System;
- /// Trace details
+
+ Name
+
diff --git a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.cs.xlf b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.cs.xlf
index dc747c725b..71ff710e05 100644
--- a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.cs.xlf
+++ b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.cs.xlf
@@ -42,6 +42,11 @@
Protokoly konzoly aplikace {0}
{0} is an application name
+
+
+ Select resource
+
+
Neznámý stav
diff --git a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.de.xlf b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.de.xlf
index ce1eff95a8..1d478a3c1e 100644
--- a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.de.xlf
+++ b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.de.xlf
@@ -42,6 +42,11 @@
{0} Konsolenprotokolle
{0} is an application name
+
+
+ Select resource
+
+
Unbekannter Status
diff --git a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.es.xlf b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.es.xlf
index bbc079e07d..12e8eedd7e 100644
--- a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.es.xlf
+++ b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.es.xlf
@@ -42,6 +42,11 @@
Registros de consola de {0}
{0} is an application name
+
+
+ Select resource
+
+
Estado desconocido
diff --git a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.fr.xlf b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.fr.xlf
index 96e8a0ebcf..92ca1d99be 100644
--- a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.fr.xlf
+++ b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.fr.xlf
@@ -42,6 +42,11 @@
Journaux de console {0}
{0} is an application name
+
+
+ Select resource
+
+
État inconnu
diff --git a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.it.xlf b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.it.xlf
index 889560e104..ffe6d72831 100644
--- a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.it.xlf
+++ b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.it.xlf
@@ -42,6 +42,11 @@
{0} log della console
{0} is an application name
+
+
+ Select resource
+
+
Stato sconosciuto
diff --git a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.ja.xlf b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.ja.xlf
index 72247b7c62..6f9f9144b3 100644
--- a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.ja.xlf
+++ b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.ja.xlf
@@ -42,6 +42,11 @@
{0} のコンソール ログ
{0} is an application name
+
+
+ Select resource
+
+
不明な状態
diff --git a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.ko.xlf b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.ko.xlf
index 0efc83b96a..e4beb729a4 100644
--- a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.ko.xlf
+++ b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.ko.xlf
@@ -42,6 +42,11 @@
{0} 콘솔 로그
{0} is an application name
+
+
+ Select resource
+
+
알 수 없는 상태
diff --git a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.pl.xlf b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.pl.xlf
index c3ed26dd39..16f00fe21f 100644
--- a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.pl.xlf
+++ b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.pl.xlf
@@ -42,6 +42,11 @@
Dzienniki konsoli: {0}
{0} is an application name
+
+
+ Select resource
+
+
Nieznany stan
diff --git a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.pt-BR.xlf b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.pt-BR.xlf
index 606808b219..ec00ab58a0 100644
--- a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.pt-BR.xlf
+++ b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.pt-BR.xlf
@@ -42,6 +42,11 @@
{0} logs do console
{0} is an application name
+
+
+ Select resource
+
+
Estado desconhecido
diff --git a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.ru.xlf b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.ru.xlf
index 940dcd238f..2e9293f689 100644
--- a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.ru.xlf
+++ b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.ru.xlf
@@ -42,6 +42,11 @@
Журналов консоли: {0}
{0} is an application name
+
+
+ Select resource
+
+
Неизвестное состояние
diff --git a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.tr.xlf b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.tr.xlf
index dc66f8bf0a..32920cbbb0 100644
--- a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.tr.xlf
+++ b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.tr.xlf
@@ -42,6 +42,11 @@
{0} konsol günlükleri
{0} is an application name
+
+
+ Select resource
+
+
Bilinmeyen durum
diff --git a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.zh-Hans.xlf b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.zh-Hans.xlf
index 28b7c3eaf9..52a5f279b5 100644
--- a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.zh-Hans.xlf
+++ b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.zh-Hans.xlf
@@ -42,6 +42,11 @@
{0} 控制台日志
{0} is an application name
+
+
+ Select resource
+
+
未知状态
diff --git a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.zh-Hant.xlf b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.zh-Hant.xlf
index 6889615f68..0504acd6e2 100644
--- a/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.zh-Hant.xlf
+++ b/src/Aspire.Dashboard/Resources/xlf/ConsoleLogs.zh-Hant.xlf
@@ -42,6 +42,11 @@
{0} 主控台記錄
{0} is an application name
+
+
+ Select resource
+
+
未知狀態
diff --git a/src/Aspire.Dashboard/Resources/xlf/Layout.cs.xlf b/src/Aspire.Dashboard/Resources/xlf/Layout.cs.xlf
index f03f21573a..d2f6cfd03a 100644
--- a/src/Aspire.Dashboard/Resources/xlf/Layout.cs.xlf
+++ b/src/Aspire.Dashboard/Resources/xlf/Layout.cs.xlf
@@ -88,8 +88,8 @@
-
- View Filters
+
+ View filters
@if (ViewportInformation.IsDesktop)
{
@@ -110,8 +110,7 @@
}