diff --git a/src/Platform/Microsoft.Testing.Platform/Builder/ITestApplicationBuilder.cs b/src/Platform/Microsoft.Testing.Platform/Builder/ITestApplicationBuilder.cs
index 7ad9101abb..c10f371795 100644
--- a/src/Platform/Microsoft.Testing.Platform/Builder/ITestApplicationBuilder.cs
+++ b/src/Platform/Microsoft.Testing.Platform/Builder/ITestApplicationBuilder.cs
@@ -6,6 +6,7 @@
using Microsoft.Testing.Platform.Configurations;
using Microsoft.Testing.Platform.Extensions.TestFramework;
using Microsoft.Testing.Platform.Logging;
+using Microsoft.Testing.Platform.OutputDevice;
using Microsoft.Testing.Platform.TestHost;
using Microsoft.Testing.Platform.TestHostControllers;
using Microsoft.Testing.Platform.TestHostOrchestrator;
@@ -50,6 +51,12 @@ public interface ITestApplicationBuilder
[Experimental("TPEXP", UrlFormat = "https://aka.ms/testingplatform/diagnostics#{0}")]
ILoggingManager Logging { get; }
+ ///
+ /// Gets the output device manager that allows registering a custom output device.
+ ///
+ [Experimental("TPEXP", UrlFormat = "https://aka.ms/testingplatform/diagnostics#{0}")]
+ IOutputDeviceManager OutputDevice { get; }
+
///
/// Registers a test framework with the application builder.
///
diff --git a/src/Platform/Microsoft.Testing.Platform/Builder/TestApplicationBuilder.cs b/src/Platform/Microsoft.Testing.Platform/Builder/TestApplicationBuilder.cs
index 318ee9236d..fcd7378bbc 100644
--- a/src/Platform/Microsoft.Testing.Platform/Builder/TestApplicationBuilder.cs
+++ b/src/Platform/Microsoft.Testing.Platform/Builder/TestApplicationBuilder.cs
@@ -10,6 +10,7 @@
using Microsoft.Testing.Platform.Helpers;
using Microsoft.Testing.Platform.Hosts;
using Microsoft.Testing.Platform.Logging;
+using Microsoft.Testing.Platform.OutputDevice;
using Microsoft.Testing.Platform.Resources;
using Microsoft.Testing.Platform.Services;
using Microsoft.Testing.Platform.Telemetry;
@@ -68,6 +69,9 @@ internal TestApplicationBuilder(
[Experimental("TPEXP", UrlFormat = "https://aka.ms/testingplatform/diagnostics#{0}")]
public ILoggingManager Logging => _testHostBuilder.Logging;
+ [Experimental("TPEXP", UrlFormat = "https://aka.ms/testingplatform/diagnostics#{0}")]
+ public IOutputDeviceManager OutputDevice => _testHostBuilder.OutputDevice;
+
internal ITelemetryManager Telemetry => _testHostBuilder.Telemetry;
internal IToolsManager Tools => _testHostBuilder.Tools;
diff --git a/src/Platform/Microsoft.Testing.Platform/Hosts/ITestHostBuilder.cs b/src/Platform/Microsoft.Testing.Platform/Hosts/ITestHostBuilder.cs
index b21500548c..fbc9f88d69 100644
--- a/src/Platform/Microsoft.Testing.Platform/Hosts/ITestHostBuilder.cs
+++ b/src/Platform/Microsoft.Testing.Platform/Hosts/ITestHostBuilder.cs
@@ -7,6 +7,7 @@
using Microsoft.Testing.Platform.Configurations;
using Microsoft.Testing.Platform.Helpers;
using Microsoft.Testing.Platform.Logging;
+using Microsoft.Testing.Platform.OutputDevice;
using Microsoft.Testing.Platform.Telemetry;
using Microsoft.Testing.Platform.TestHost;
using Microsoft.Testing.Platform.TestHostControllers;
@@ -31,6 +32,8 @@ internal interface ITestHostBuilder
ITestHostOrchestratorManager TestHostOrchestrator { get; }
+ IOutputDeviceManager OutputDevice { get; }
+
ITelemetryManager Telemetry { get; }
IToolsManager Tools { get; }
diff --git a/src/Platform/Microsoft.Testing.Platform/Hosts/TestHostBuilder.cs b/src/Platform/Microsoft.Testing.Platform/Hosts/TestHostBuilder.cs
index 3ae70c9be3..7e8804cfde 100644
--- a/src/Platform/Microsoft.Testing.Platform/Hosts/TestHostBuilder.cs
+++ b/src/Platform/Microsoft.Testing.Platform/Hosts/TestHostBuilder.cs
@@ -47,6 +47,8 @@ internal sealed partial class TestHostBuilder(IFileSystem fileSystem, IRuntimeFe
public IToolsManager Tools { get; } = new ToolsManager();
+ public IOutputDeviceManager OutputDevice => _outputDisplay;
+
private readonly TestHostOrchestratorManager _testHostOrchestratorManager = new Extensions.TestHostOrchestrator.TestHostOrchestratorManager();
public ITestHostOrchestratorManager TestHostOrchestrator => _testHostOrchestratorManager;
diff --git a/src/Platform/Microsoft.Testing.Platform/OutputDevice/CustomOutputDeviceAdapter.cs b/src/Platform/Microsoft.Testing.Platform/OutputDevice/CustomOutputDeviceAdapter.cs
new file mode 100644
index 0000000000..5fca54be92
--- /dev/null
+++ b/src/Platform/Microsoft.Testing.Platform/OutputDevice/CustomOutputDeviceAdapter.cs
@@ -0,0 +1,39 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Microsoft.Testing.Platform.Extensions.OutputDevice;
+
+namespace Microsoft.Testing.Platform.OutputDevice;
+
+internal sealed class CustomOutputDeviceAdapter : IPlatformOutputDevice
+{
+ private readonly ICustomOutputDevice _customOutputDevice;
+
+ public CustomOutputDeviceAdapter(ICustomOutputDevice customOutputDevice)
+ => _customOutputDevice = customOutputDevice ?? throw new ArgumentNullException(nameof(customOutputDevice));
+
+ public string Uid => _customOutputDevice.Uid;
+
+ public string Version => _customOutputDevice.Version;
+
+ public string DisplayName => _customOutputDevice.DisplayName;
+
+ public string Description => _customOutputDevice.Description;
+
+ public Task IsEnabledAsync() => _customOutputDevice.IsEnabledAsync();
+
+ public Task DisplayBannerAsync(string? bannerMessage, CancellationToken cancellationToken)
+ => _customOutputDevice.DisplayBannerAsync(bannerMessage, cancellationToken);
+
+ public Task DisplayBeforeSessionStartAsync(CancellationToken cancellationToken)
+ => _customOutputDevice.DisplayBeforeSessionStartAsync(cancellationToken);
+
+ public Task DisplayAfterSessionEndRunAsync(CancellationToken cancellationToken)
+ => _customOutputDevice.DisplayAfterSessionEndRunAsync(cancellationToken);
+
+ public Task DisplayAsync(IOutputDeviceDataProducer producer, IOutputDeviceData data, CancellationToken cancellationToken)
+ => _customOutputDevice.DisplayAsync(producer, data, cancellationToken);
+
+ public Task HandleProcessRoleAsync(TestProcessRole processRole, CancellationToken cancellationToken)
+ => Task.CompletedTask;
+}
diff --git a/src/Platform/Microsoft.Testing.Platform/OutputDevice/ICustomOutputDevice.cs b/src/Platform/Microsoft.Testing.Platform/OutputDevice/ICustomOutputDevice.cs
new file mode 100644
index 0000000000..274b2a24b2
--- /dev/null
+++ b/src/Platform/Microsoft.Testing.Platform/OutputDevice/ICustomOutputDevice.cs
@@ -0,0 +1,51 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Microsoft.Testing.Platform.Extensions;
+using Microsoft.Testing.Platform.Extensions.OutputDevice;
+
+namespace Microsoft.Testing.Platform.OutputDevice;
+
+///
+/// Represents a custom output device that can be registered via
+///
+/// to replace the default terminal output of Microsoft.Testing.Platform.
+///
+///
+/// When server mode (JSON-RPC) is active, the platform still routes server output through its
+/// built-in server output device in parallel with the custom output device.
+///
+[Experimental("TPEXP", UrlFormat = "https://aka.ms/testingplatform/diagnostics#{0}")]
+public interface ICustomOutputDevice : IExtension
+{
+ ///
+ /// Displays the platform banner.
+ ///
+ /// An optional banner message. If , the implementation may render its own banner.
+ /// The cancellation token.
+ /// A task representing the asynchronous operation.
+ Task DisplayBannerAsync(string? bannerMessage, CancellationToken cancellationToken);
+
+ ///
+ /// Called before the test session starts.
+ ///
+ /// The cancellation token.
+ /// A task representing the asynchronous operation.
+ Task DisplayBeforeSessionStartAsync(CancellationToken cancellationToken);
+
+ ///
+ /// Called after the test session ends.
+ ///
+ /// The cancellation token.
+ /// A task representing the asynchronous operation.
+ Task DisplayAfterSessionEndRunAsync(CancellationToken cancellationToken);
+
+ ///
+ /// Displays the output data asynchronously.
+ ///
+ /// The data producer.
+ /// The output data.
+ /// The cancellation token.
+ /// A task representing the asynchronous operation.
+ Task DisplayAsync(IOutputDeviceDataProducer producer, IOutputDeviceData data, CancellationToken cancellationToken);
+}
diff --git a/src/Platform/Microsoft.Testing.Platform/OutputDevice/IOutputDeviceManager.cs b/src/Platform/Microsoft.Testing.Platform/OutputDevice/IOutputDeviceManager.cs
new file mode 100644
index 0000000000..94bfffba26
--- /dev/null
+++ b/src/Platform/Microsoft.Testing.Platform/OutputDevice/IOutputDeviceManager.cs
@@ -0,0 +1,27 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+namespace Microsoft.Testing.Platform.OutputDevice;
+
+///
+/// Manages the registration of a custom output device for Microsoft.Testing.Platform.
+///
+///
+/// Only one custom output device can be registered. Calling
+///
+/// more than once throws .
+///
+[Experimental("TPEXP", UrlFormat = "https://aka.ms/testingplatform/diagnostics#{0}")]
+public interface IOutputDeviceManager
+{
+ ///
+ /// Sets the custom output device factory. The factory is invoked once when the test host is built.
+ ///
+ /// A factory that builds the from the service provider.
+ ///
+ /// If the resolved reports itself as disabled via
+ /// , the platform falls back
+ /// to its default terminal output device.
+ ///
+ void SetOutputDevice(Func outputDeviceFactory);
+}
diff --git a/src/Platform/Microsoft.Testing.Platform/OutputDevice/OutputDeviceManager.cs b/src/Platform/Microsoft.Testing.Platform/OutputDevice/OutputDeviceManager.cs
index 74158f1b1f..d3c7feae77 100644
--- a/src/Platform/Microsoft.Testing.Platform/OutputDevice/OutputDeviceManager.cs
+++ b/src/Platform/Microsoft.Testing.Platform/OutputDevice/OutputDeviceManager.cs
@@ -2,20 +2,40 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using Microsoft.Testing.Platform.Logging;
-#if !NET7_0_OR_GREATER
using Microsoft.Testing.Platform.Resources;
-#endif
using Microsoft.Testing.Platform.ServerMode;
using Microsoft.Testing.Platform.Services;
namespace Microsoft.Testing.Platform.OutputDevice;
-internal sealed class PlatformOutputDeviceManager
+internal sealed class PlatformOutputDeviceManager : IOutputDeviceManager
{
private Func? _platformOutputDeviceFactory;
public void SetPlatformOutputDevice(Func platformOutputDeviceFactory)
- => _platformOutputDeviceFactory = platformOutputDeviceFactory ?? throw new ArgumentNullException(nameof(platformOutputDeviceFactory));
+ {
+ if (platformOutputDeviceFactory is null)
+ {
+ throw new ArgumentNullException(nameof(platformOutputDeviceFactory));
+ }
+
+ if (_platformOutputDeviceFactory is not null)
+ {
+ throw new InvalidOperationException(PlatformResources.PlatformOutputDeviceAlreadyRegisteredErrorMessage);
+ }
+
+ _platformOutputDeviceFactory = platformOutputDeviceFactory;
+ }
+
+ public void SetOutputDevice(Func outputDeviceFactory)
+ {
+ if (outputDeviceFactory is null)
+ {
+ throw new ArgumentNullException(nameof(outputDeviceFactory));
+ }
+
+ SetPlatformOutputDevice(serviceProvider => new CustomOutputDeviceAdapter(outputDeviceFactory(serviceProvider)));
+ }
internal async Task BuildAsync(ServiceProvider serviceProvider, bool useServerModeOutputDevice, bool isPipeProtocol)
{
diff --git a/src/Platform/Microsoft.Testing.Platform/PublicAPI/PublicAPI.Unshipped.txt b/src/Platform/Microsoft.Testing.Platform/PublicAPI/PublicAPI.Unshipped.txt
index 7dc5c58110..66cb69af28 100644
--- a/src/Platform/Microsoft.Testing.Platform/PublicAPI/PublicAPI.Unshipped.txt
+++ b/src/Platform/Microsoft.Testing.Platform/PublicAPI/PublicAPI.Unshipped.txt
@@ -1 +1,9 @@
#nullable enable
+Microsoft.Testing.Platform.Builder.ITestApplicationBuilder.OutputDevice.get -> Microsoft.Testing.Platform.OutputDevice.IOutputDeviceManager!
+[TPEXP]Microsoft.Testing.Platform.OutputDevice.ICustomOutputDevice
+[TPEXP]Microsoft.Testing.Platform.OutputDevice.ICustomOutputDevice.DisplayAfterSessionEndRunAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+[TPEXP]Microsoft.Testing.Platform.OutputDevice.ICustomOutputDevice.DisplayAsync(Microsoft.Testing.Platform.Extensions.OutputDevice.IOutputDeviceDataProducer! producer, Microsoft.Testing.Platform.OutputDevice.IOutputDeviceData! data, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+[TPEXP]Microsoft.Testing.Platform.OutputDevice.ICustomOutputDevice.DisplayBannerAsync(string? bannerMessage, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+[TPEXP]Microsoft.Testing.Platform.OutputDevice.ICustomOutputDevice.DisplayBeforeSessionStartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+[TPEXP]Microsoft.Testing.Platform.OutputDevice.IOutputDeviceManager
+[TPEXP]Microsoft.Testing.Platform.OutputDevice.IOutputDeviceManager.SetOutputDevice(System.Func! outputDeviceFactory) -> void
diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/PlatformResources.resx b/src/Platform/Microsoft.Testing.Platform/Resources/PlatformResources.resx
index 6d0728af08..a96646c4c2 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/PlatformResources.resx
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/PlatformResources.resx
@@ -826,4 +826,7 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix
Waiting for debugger to attach (TESTINGPLATFORM_WAIT_ATTACH_DEBUGGER=1) is not supported on wasi.{Locked="TESTINGPLATFORM_WAIT_ATTACH_DEBUGGER=1"}{Locked="wasi"}
+
+ A custom output device has already been registered.
+
diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.cs.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.cs.xlf
index a9b0fbe502..980dc71c55 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.cs.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.cs.xlf
@@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix
Dalším stisknutím kombinace kláves Ctrl+C vynutíte ukončení.{Locked="Ctrl+C"}
+
+ A custom output device has already been registered.
+ A custom output device has already been registered.
+
+ Process should have exited before we can determine this valueProces měl být ukončen před tím, než jsme mohli určit tuto hodnotu.
diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.de.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.de.xlf
index 4a3289c03d..67e617489d 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.de.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.de.xlf
@@ -663,6 +663,11 @@ Verwendet ein Argument als Zeitwert mit einem expliziten Einheitensuffix. Akzept
Drücken Sie erneut Ctrl+C, um das Beenden zu erzwingen.{Locked="Ctrl+C"}
+
+ A custom output device has already been registered.
+ A custom output device has already been registered.
+
+ Process should have exited before we can determine this valueDer Prozess hätte beendet werden müssen, bevor dieser Wert ermittelt werden kann
diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.es.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.es.xlf
index adb2809ee8..9dbf86a505 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.es.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.es.xlf
@@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix
Presione Ctrl+C de nuevo para forzar la salida.{Locked="Ctrl+C"}
+
+ A custom output device has already been registered.
+ A custom output device has already been registered.
+
+ Process should have exited before we can determine this valueEl proceso debería haberse terminado para poder determinar este valor
diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.fr.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.fr.xlf
index 73449fc7ba..37d44c2f9d 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.fr.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.fr.xlf
@@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix
Appuyez de nouveau sur Ctrl+C pour forcer la fermeture.{Locked="Ctrl+C"}
+
+ A custom output device has already been registered.
+ A custom output device has already been registered.
+
+ Process should have exited before we can determine this valueLe processus aurait dû s’arrêter avant que nous puissions déterminer cette valeur
diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.it.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.it.xlf
index fed4ca092e..66bbe57ca0 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.it.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.it.xlf
@@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix
Premere di nuovo Ctrl+C per forzare l'uscita.{Locked="Ctrl+C"}
+
+ A custom output device has already been registered.
+ A custom output device has already been registered.
+
+ Process should have exited before we can determine this valueIl processo dovrebbe essere terminato prima di poter determinare questo valore
diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ja.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ja.xlf
index 8b9d711f3d..d8c6475f35 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ja.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ja.xlf
@@ -664,6 +664,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix
強制終了するには、Ctrl+C キーをもう一度押してください。{Locked="Ctrl+C"}
+
+ A custom output device has already been registered.
+ A custom output device has already been registered.
+
+ Process should have exited before we can determine this valueこの値を決定する前にプロセスを終了する必要があります
diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ko.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ko.xlf
index de0fce2e9d..745cf14184 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ko.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ko.xlf
@@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix
강제 종료하려면 Ctrl+C를 한 번 더 누르세요.{Locked="Ctrl+C"}
+
+ A custom output device has already been registered.
+ A custom output device has already been registered.
+
+ Process should have exited before we can determine this value이 값을 결정하려면 프로세스가 종료되어야 합니다.
diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pl.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pl.xlf
index 39e6793c0d..c4ee06274b 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pl.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pl.xlf
@@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix
Naciśnij ponownie klawisze Ctrl+C, aby wymusić wyjście.{Locked="Ctrl+C"}
+
+ A custom output device has already been registered.
+ A custom output device has already been registered.
+
+ Process should have exited before we can determine this valueProces powinien zakończyć się przed ustaleniem tej wartości
diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pt-BR.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pt-BR.xlf
index 2d8ebfedc7..77c27c3916 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pt-BR.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pt-BR.xlf
@@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix
Pressione Ctrl+C de novo para forçar a saída.{Locked="Ctrl+C"}
+
+ A custom output device has already been registered.
+ A custom output device has already been registered.
+
+ Process should have exited before we can determine this valueO processo deve ter sido encerrado antes que possamos determinar esse valor
diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ru.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ru.xlf
index e4353902c8..5e8f6b501c 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ru.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ru.xlf
@@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix
Нажмите Ctrl+C еще раз, чтобы выполнить принудительный выход.{Locked="Ctrl+C"}
+
+ A custom output device has already been registered.
+ A custom output device has already been registered.
+
+ Process should have exited before we can determine this valueПроцесс должен быть завершен, прежде чем мы сможем определить это значение
diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.tr.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.tr.xlf
index c14460f934..977b1aa776 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.tr.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.tr.xlf
@@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix
Çıkmayı zorlamak için Ctrl+C tuşlarına yeniden basın.{Locked="Ctrl+C"}
+
+ A custom output device has already been registered.
+ A custom output device has already been registered.
+
+ Process should have exited before we can determine this valueBu değeri belirleyebilmemiz için süreçten çıkılmış olması gerekir
diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hans.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hans.xlf
index 52fe96d4d2..b48c9bd552 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hans.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hans.xlf
@@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix
再次按 Ctrl+C 强制退出。{Locked="Ctrl+C"}
+
+ A custom output device has already been registered.
+ A custom output device has already been registered.
+
+ Process should have exited before we can determine this value在我们确定此值之前,流程应该已退出
diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hant.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hant.xlf
index 87a7ed0d2d..7bbf5f492e 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hant.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hant.xlf
@@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix
再次按 Ctrl+C 以強制離開。{Locked="Ctrl+C"}
+
+ A custom output device has already been registered.
+ A custom output device has already been registered.
+
+ Process should have exited before we can determine this value在我們確定此值之前,流程應已結束