Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions csharp/Platform.Exceptions.Tests/InternationalizationTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
using System;
using System.Globalization;
using System.Threading;
using Xunit;

namespace Platform.Exceptions.Tests
{
/// <summary>
/// <para>Tests for internationalization functionality.</para>
/// <para>Тесты для функциональности интернационализации.</para>
/// </summary>
public class InternationalizationTests
{
/// <summary>
/// <para>Tests that exception messages are localized based on the current culture.</para>
/// <para>Проверяет, что сообщения исключений локализованы в соответствии с текущей культурой.</para>
/// </summary>
[Fact]
public void TestArgumentNullExceptionLocalization()
{
// Test English (default)
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
var englishException = Assert.Throws<ArgumentNullException>(() =>
Ensure.Always.ArgumentNotNull<string>(null, "testArg"));
Assert.Contains("Argument testArg is null", englishException.Message);

// Test Russian
Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU");
var russianException = Assert.Throws<ArgumentNullException>(() =>
Ensure.Always.ArgumentNotNull<string>(null, "testArg"));
Assert.Contains("Аргумент testArg равен null", russianException.Message);
}

/// <summary>
/// <para>Tests that argument criteria exception messages are localized.</para>
/// <para>Проверяет, что сообщения исключений критериев аргументов локализованы.</para>
/// </summary>
[Fact]
public void TestArgumentCriteriaExceptionLocalization()
{
// Test English (default)
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
var englishException = Assert.Throws<ArgumentException>(() =>
Ensure.Always.ArgumentMeetsCriteria("test", x => x.Length > 10, "shortArg"));
Assert.Contains("Argument shortArg does not meet the criteria", englishException.Message);

// Test Russian
Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU");
var russianException = Assert.Throws<ArgumentException>(() =>
Ensure.Always.ArgumentMeetsCriteria("test", x => x.Length > 10, "shortArg"));
Assert.Contains("Аргумент shortArg не соответствует критерию", russianException.Message);
}

/// <summary>
/// <para>Tests that exception formatting strings are localized.</para>
/// <para>Проверяет, что строки форматирования исключений локализованы.</para>
/// </summary>
[Fact]
public void TestExceptionFormattingLocalization()
{
// Test English (default)
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
var innerEx = new InvalidOperationException("Inner");
var outerEx = new Exception("Outer", innerEx);
var englishFormatted = outerEx.ToStringWithAllInnerExceptions();
Assert.Contains("Inner exception:", englishFormatted);

// Test Russian
Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU");
var russianFormatted = outerEx.ToStringWithAllInnerExceptions();
Assert.Contains("Внутреннее исключение:", russianFormatted);
}
}
}
4 changes: 2 additions & 2 deletions csharp/Platform.Exceptions/EnsureExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public static void ArgumentNotNull<TArgument>(this EnsureAlwaysExtensionRoot roo
/// <param name="argument"><para>The argument.</para><para>Аргумент.</para></param>
/// <param name="argumentName"><para>The argument's name.</para><para>Имя аргумента.</para></param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void ArgumentNotNull<TArgument>(this EnsureAlwaysExtensionRoot root, TArgument argument, string argumentName) where TArgument : class => ArgumentNotNull(root, argument, argumentName, $"Argument {argumentName} is null.");
public static void ArgumentNotNull<TArgument>(this EnsureAlwaysExtensionRoot root, TArgument argument, string argumentName) where TArgument : class => ArgumentNotNull(root, argument, argumentName, string.Format(Resources.ArgumentIsNull, argumentName));

/// <summary>
/// <para>Ensures that argument is not null. This check is performed regardless of the build configuration.</para>
Expand Down Expand Up @@ -84,7 +84,7 @@ public static void ArgumentMeetsCriteria<TArgument>(this EnsureAlwaysExtensionRo
/// <param name="predicate"><para>A predicate that determines whether the argument meets a criterion.</para><para>Предикат определяющий, соответствует ли аргумент критерию.</para></param>
/// <param name="argumentName"><para>The argument's name.</para><para>Имя аргумента.</para></param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void ArgumentMeetsCriteria<TArgument>(this EnsureAlwaysExtensionRoot root, TArgument argument, Predicate<TArgument> predicate, string argumentName) => ArgumentMeetsCriteria(root, argument, predicate, argumentName, $"Argument {argumentName} does not meet the criteria.");
public static void ArgumentMeetsCriteria<TArgument>(this EnsureAlwaysExtensionRoot root, TArgument argument, Predicate<TArgument> predicate, string argumentName) => ArgumentMeetsCriteria(root, argument, predicate, argumentName, string.Format(Resources.ArgumentDoesNotMeetCriteria, argumentName));

/// <summary>
/// <para>Ensures that the argument meets the criteria. This check is performed regardless of the build configuration.</para>
Expand Down
4 changes: 2 additions & 2 deletions csharp/Platform.Exceptions/ExceptionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public static class ExceptionExtensions
/// <para>Represents a string returned from <see cref="ToStringWithAllInnerExceptions(Exception)"/> in the event of an unsuccessful attempt to format an exception. This field is a constant.</para>
/// <para>Представляет строку выдаваемую из <see cref="ToStringWithAllInnerExceptions(Exception)"/> в случае неудачной попытки форматирования исключения. Это поле является константой.</para>
/// </summary>
public static readonly string ExceptionStringBuildingFailed = "Unable to format exception.";
public static readonly string ExceptionStringBuildingFailed = Resources.UnableToFormatException;

/// <summary>
/// <para>Ignores the exception, notifying the <see cref = "IgnoredExceptions" /> class about it.</para>
Expand Down Expand Up @@ -57,7 +57,7 @@ private static void BuildExceptionString(this StringBuilder sb, Exception except
if (exception.InnerException != null)
{
sb.Indent(level);
sb.AppendLine("Inner exception: ");
sb.AppendLine(Resources.InnerException);
sb.BuildExceptionString(exception.InnerException, level + 1);
}
sb.Indent(level);
Expand Down
20 changes: 18 additions & 2 deletions csharp/Platform.Exceptions/Platform.Exceptions.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<Description>LinksPlatform's Platform.Exceptions Class Library</Description>
<Copyright>Konstantin Diachenko</Copyright>
<AssemblyTitle>Platform.Exceptions</AssemblyTitle>
<VersionPrefix>0.5.0</VersionPrefix>
<VersionPrefix>0.6.0</VersionPrefix>
<Authors>Konstantin Diachenko</Authors>
<TargetFramework>net8</TargetFramework>
<AssemblyName>Platform.Exceptions</AssemblyName>
Expand All @@ -23,7 +23,7 @@
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<LangVersion>latest</LangVersion>
<PackageReleaseNotes>Update target framework from net7 to net8.</PackageReleaseNotes>
<PackageReleaseNotes>Added internationalization support for exception messages. Supports English and Russian languages.</PackageReleaseNotes>
<Nullable>enable</Nullable>
</PropertyGroup>

Expand All @@ -35,6 +35,22 @@
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All"/>
</ItemGroup>

<ItemGroup>
<EmbeddedResource Update="Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="Resources.ru.resx">
<DependentUpon>Resources.resx</DependentUpon>
</EmbeddedResource>
</ItemGroup>

<ItemGroup>
<Compile Update="Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>

</Project>
118 changes: 118 additions & 0 deletions csharp/Platform.Exceptions/Resources.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading