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 f63eb424cb..7ab2450ae7 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 b487d11f1c..35c050887e 100644
--- a/src/Platform/Microsoft.Testing.Platform/OutputDevice/OutputDeviceManager.cs
+++ b/src/Platform/Microsoft.Testing.Platform/OutputDevice/OutputDeviceManager.cs
@@ -2,25 +2,43 @@
// 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)
{
- // TODO: SetPlatformOutputDevice isn't public yet.
- // Before exposing it, do we want to pass the "useServerModeOutputDevice" info to it?
IPlatformOutputDevice nonServerOutputDevice = _platformOutputDeviceFactory is null
? GetDefaultTerminalOutputDevice(serviceProvider)
: _platformOutputDeviceFactory(serviceProvider);
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 942c03e448..5af906eb4b 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/PlatformResources.resx
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/PlatformResources.resx
@@ -794,4 +794,7 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is
Waiting for debugger to attach (TESTINGPLATFORM_WAIT_ATTACH_DEBUGGER=1) is not supported on 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 b025a84e67..351c7ffead 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.cs.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.cs.xlf
@@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is
Může mít jenom jeden argument jako řetězec ve formátu <value>[h|m|s], kde value je hodnota datového typu float.
+
+ 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 4e4540fd19..a3052fe7db 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.de.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.de.xlf
@@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is
Nimmt ein Argument als Zeichenfolge im Format <value>[h|m|s], wobei "value" auf "float" festgelegt ist.
+
+ 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 90f8df9670..d02bb0cbe5 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.es.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.es.xlf
@@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is
Toma un argumento como cadena con el formato <value>[h|m|s] donde 'value' es float.
+
+ 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 e85b3dd053..35529cdcc6 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.fr.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.fr.xlf
@@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is
Prend un argument sous forme de chaîne au format <value>[h|m|s] où « value » est float.
+
+ 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 dab5720fb9..295014bd4b 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.it.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.it.xlf
@@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is
Acquisisce un argomento come stringa nel formato <value>[h|m|s] dove 'value' è float.
+
+ 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 89044004aa..b119f57a56 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ja.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ja.xlf
@@ -686,6 +686,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is
1 つの引数を文字列として <value>[h|m|s] の形式で使用します。この場合、'value' は float です。
+
+ 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 e16040049c..ed6309e0ed 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ko.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ko.xlf
@@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is
'value'가 float인 <value>[h|m|s] 형식의 문자열로 인수 하나를 사용합니다.
+
+ 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 1cdea07349..829a8b7e0d 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pl.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pl.xlf
@@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is
Pobiera jeden argument jako ciąg w formacie <value>[h|m|s], gdzie element „value” ma wartość zmiennoprzecinkową.
+
+ 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 f4128481d8..2ea86dfaed 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
@@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is
Recebe um argumento como cadeia de caracteres no formato <valor>[h|m|s] em que 'valor' é float.
+
+ 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 781042a36c..d75afb47ec 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ru.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ru.xlf
@@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is
Принимает один аргумент в виде строки в формате <value>[h|m|s], где "value" — число с плавающей точкой.
+
+ 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 f48a8db2a4..32f957b268 100644
--- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.tr.xlf
+++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.tr.xlf
@@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is
Bir bağımsız değişkeni, 'value' değerinin kayan olduğu <value>[h|m|s] biçiminde dize olarak alır.
+
+ 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 0924db6031..97dc2e6c05 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
@@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is
获取一个字符串形式的参数,格式为 <value>[h|m|s],其中 "value" 为浮点型。
+
+ 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 5a35249a2d..bd9c0678ee 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
@@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is
將一個引數作為字串,格式為 <value>[h|m|s],其中 'value' 為 float。
+
+ 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在我們確定此值之前,流程應已結束