diff options
| -rw-r--r-- | Directory.Packages.props | 3 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/BaseItem.cs | 8 | ||||
| -rw-r--r-- | src/Jellyfin.Extensions/Jellyfin.Extensions.csproj | 1 | ||||
| -rw-r--r-- | src/Jellyfin.Extensions/StringExtensions.cs | 14 |
4 files changed, 24 insertions, 2 deletions
diff --git a/Directory.Packages.props b/Directory.Packages.props index 093193e60..1f853ef73 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -19,6 +19,7 @@ <PackageVersion Include="EFCoreSecondLevelCacheInterceptor" Version="4.2.3" /> <PackageVersion Include="FsCheck.Xunit" Version="2.16.6" /> <PackageVersion Include="HarfBuzzSharp.NativeAssets.Linux" Version="7.3.0.1" /> + <PackageVersion Include="ICU4N.Transliterator" Version="60.1.0-alpha.356" /> <PackageVersion Include="IDisposableAnalyzers" Version="4.0.7" /> <PackageVersion Include="Jellyfin.XmlTv" Version="10.8.0" /> <PackageVersion Include="libse" Version="3.6.13" /> @@ -88,4 +89,4 @@ <PackageVersion Include="Xunit.SkippableFact" Version="1.4.13" /> <PackageVersion Include="xunit" Version="2.7.0" /> </ItemGroup> -</Project> +</Project>
\ No newline at end of file diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 0867cafb9..cb9a8cad8 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -964,7 +964,13 @@ namespace MediaBrowser.Controller.Entities AppendChunk(builder, isDigitChunk, name.Slice(chunkStart)); // logger.LogDebug("ModifySortChunks Start: {0} End: {1}", name, builder.ToString()); - return builder.ToString().RemoveDiacritics(); + var result = builder.ToString().RemoveDiacritics(); + if (!result.All(char.IsAscii)) + { + result = result.Transliterated(); + } + + return result; } public BaseItem GetParent() diff --git a/src/Jellyfin.Extensions/Jellyfin.Extensions.csproj b/src/Jellyfin.Extensions/Jellyfin.Extensions.csproj index c91f5d008..98b567e30 100644 --- a/src/Jellyfin.Extensions/Jellyfin.Extensions.csproj +++ b/src/Jellyfin.Extensions/Jellyfin.Extensions.csproj @@ -29,6 +29,7 @@ <ItemGroup> <PackageReference Include="Diacritics" /> + <PackageReference Include="ICU4N.Transliterator" /> </ItemGroup> </Project> diff --git a/src/Jellyfin.Extensions/StringExtensions.cs b/src/Jellyfin.Extensions/StringExtensions.cs index 9d8afc23c..8cfebd594 100644 --- a/src/Jellyfin.Extensions/StringExtensions.cs +++ b/src/Jellyfin.Extensions/StringExtensions.cs @@ -1,5 +1,6 @@ using System; using System.Text.RegularExpressions; +using ICU4N.Text; namespace Jellyfin.Extensions { @@ -8,6 +9,9 @@ namespace Jellyfin.Extensions /// </summary> public static partial class StringExtensions { + private static readonly Lazy<Transliterator> _transliterator = new(() => Transliterator.GetInstance( + "Any-Latin; Latin-Ascii; Lower; NFD; [:Nonspacing Mark:] Remove; [:Punctuation:] Remove;")); + // Matches non-conforming unicode chars // https://mnaoumov.wordpress.com/2014/06/14/stripping-invalid-characters-from-utf-16-strings/ @@ -96,5 +100,15 @@ namespace Jellyfin.Extensions return haystack[(pos + 1)..]; } + + /// <summary> + /// Returns a transliterated string which only contain ascii characters. + /// </summary> + /// <param name="text">The string to act on.</param> + /// <returns>The transliterated string.</returns> + public static string Transliterated(this string text) + { + return _transliterator.Value.Transliterate(text); + } } } |
