Walks the v2 polish punch list against MainWindow. - Theme button tooltip is now "Theme (System / Dark / Light)" per the v2 shape brief, replacing the previous "Toggle theme (Ctrl+T)". - Participants table column widths match spec: Output 130px (was 150), ISO pill 100px (was 110). The 24px state LED, 110px audio meter, and 52px row height already matched. The 106px Preview thumbnail column and 32px gear-button column are intentional deviations (live thumbs were restored at 4944de5; per-ISO override gear added at the same time) and are now called out in the column-spec comment so a future reader doesn't try to "fix" them. - Empty-state placeholder finally renders when ParticipantCount == 0: mono sentence "no ndi sources yet — open teams and start a meeting" + a tertiary Refresh discovery button — exactly the copy specified by the shape brief's empty-states section. CountToVisibilityConverter is now declared in MainWindow.Resources (it shipped as a class but was never registered). - OnClosing wraps WindowStateStore.Save in a try/catch so a serialization or filesystem fault on shutdown can never block the window from closing. Save itself already swallows its own IO errors; this is defense-in-depth for anything that escapes. - MessageBox copy in MainWindow.xaml.cs (Hide/show Teams, Launch Teams, Stop Teams) moves to Properties/Strings.resx + a hand-written Properties/Strings.Designer.cs accessor. ResourceManager reads it by basename "TeamsISO.App.Properties.Strings"; LogicalName is set on the EmbeddedResource so the manifest name is predictable regardless of how MSBuild would otherwise compute it. Future-localization seam. OnLaunchTeamsRightClick's confirmation dialog is intentional — it guards a destructive mid-show action — and the code-behind comment now says so; the palette also offers Stop Teams as the keyboard surface, so the right-click affordance isn't the only one. Build clean (0 warnings, 0 errors); 160 tests still pass (56 App + 104 Engine, Category!=ndi&requires!=ndi filter). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
36 lines
1.6 KiB
C#
36 lines
1.6 KiB
C#
// Hand-written strongly-typed accessor for Properties/Strings.resx. Kept
|
|
// out of Visual Studio's "ResXFileCodeGenerator" auto-regeneration loop
|
|
// so the .csproj stays simple and the file doesn't churn on every save.
|
|
// If you add a key in Strings.resx, add a matching property here.
|
|
|
|
// The compiler treats `*.Designer.cs` as auto-generated and refuses
|
|
// nullable annotations without an explicit directive — opt in.
|
|
#nullable enable
|
|
|
|
using System.Globalization;
|
|
using System.Resources;
|
|
|
|
namespace TeamsISO.App.Properties;
|
|
|
|
internal static class Strings
|
|
{
|
|
private static readonly ResourceManager ResourceManager = new(
|
|
baseName: "TeamsISO.App.Properties.Strings",
|
|
assembly: typeof(Strings).Assembly);
|
|
|
|
public static CultureInfo? Culture { get; set; }
|
|
|
|
private static string Get(string key) =>
|
|
ResourceManager.GetString(key, Culture) ?? string.Empty;
|
|
|
|
public static string HideShowTeams_Title => Get(nameof(HideShowTeams_Title));
|
|
public static string HideShowTeams_NotRunning_Message => Get(nameof(HideShowTeams_NotRunning_Message));
|
|
|
|
public static string LaunchTeams_Title => Get(nameof(LaunchTeams_Title));
|
|
public static string LaunchTeams_Failed_MessageFormat => Get(nameof(LaunchTeams_Failed_MessageFormat));
|
|
|
|
public static string StopTeams_Title => Get(nameof(StopTeams_Title));
|
|
public static string StopTeams_Confirm_Message => Get(nameof(StopTeams_Confirm_Message));
|
|
public static string StopTeams_NoneResponded => Get(nameof(StopTeams_NoneResponded));
|
|
public static string StopTeams_AskedFormat => Get(nameof(StopTeams_AskedFormat));
|
|
}
|