Localization Issues (#3653)

Co-authored-by: Amelia <77553571+Fesaa@users.noreply.github.com>
This commit is contained in:
Joe Milazzo 2025-03-19 07:08:12 -05:00 committed by GitHub
parent 98a2b9d3ed
commit 0f72f63b35
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 25 additions and 21 deletions

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.IO.Abstractions; using System.IO.Abstractions;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -2080,7 +2081,7 @@ public class SeriesServiceTests : AbstractDbTest
public async Task GetEstimatedChapterCreationDate_NextChapter_ChaptersMonthApart() public async Task GetEstimatedChapterCreationDate_NextChapter_ChaptersMonthApart()
{ {
await ResetDb(); await ResetDb();
var now = DateTime.Parse("2021-01-01"); // 10/31/2024 can trigger an edge case bug var now = DateTime.Parse("2021-01-01", CultureInfo.InvariantCulture); // 10/31/2024 can trigger an edge case bug
_context.Library.Add(new LibraryBuilder("Test LIb") _context.Library.Add(new LibraryBuilder("Test LIb")
.WithAppUser(new AppUserBuilder("majora2007", string.Empty).Build()) .WithAppUser(new AppUserBuilder("majora2007", string.Empty).Build())

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading.Tasks; using System.Threading.Tasks;

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -35,7 +36,7 @@ public static class MigrateInitialInstallData
{ {
var fi = directoryService.FileSystem.FileInfo.New(dbFile); var fi = directoryService.FileSystem.FileInfo.New(dbFile);
var setting = settings.First(s => s.Key == ServerSettingKey.FirstInstallDate); var setting = settings.First(s => s.Key == ServerSettingKey.FirstInstallDate);
setting.Value = fi.CreationTimeUtc.ToString(); setting.Value = fi.CreationTimeUtc.ToString(CultureInfo.InvariantCulture);
await dataContext.SaveChangesAsync(); await dataContext.SaveChangesAsync();
} }

View File

@ -100,7 +100,7 @@ public static class FilterFieldValueConverter
.ToList(), .ToList(),
FilterField.WantToRead => bool.Parse(value), FilterField.WantToRead => bool.Parse(value),
FilterField.ReadProgress => string.IsNullOrEmpty(value) ? 0f : value.AsFloat(), FilterField.ReadProgress => string.IsNullOrEmpty(value) ? 0f : value.AsFloat(),
FilterField.ReadingDate => DateTime.Parse(value), FilterField.ReadingDate => DateTime.Parse(value, CultureInfo.InvariantCulture),
FilterField.ReadLast => int.Parse(value), FilterField.ReadLast => int.Parse(value),
FilterField.Formats => value.Split(',') FilterField.Formats => value.Split(',')
.Select(x => (MangaFormat) Enum.Parse(typeof(MangaFormat), x)) .Select(x => (MangaFormat) Enum.Parse(typeof(MangaFormat), x))

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Globalization;
using System.IdentityModel.Tokens.Jwt; using System.IdentityModel.Tokens.Jwt;
using System.Linq; using System.Linq;
@ -19,7 +20,7 @@ public static class JwtHelper
var token = jwtHandler.ReadJwtToken(jwtToken); var token = jwtHandler.ReadJwtToken(jwtToken);
var exp = token.Claims.FirstOrDefault(c => c.Type == "exp")?.Value; var exp = token.Claims.FirstOrDefault(c => c.Type == "exp")?.Value;
if (long.TryParse(exp, out var expSeconds)) if (long.TryParse(exp, CultureInfo.InvariantCulture, out var expSeconds))
{ {
return DateTimeOffset.FromUnixTimeSeconds(expSeconds).UtcDateTime; return DateTimeOffset.FromUnixTimeSeconds(expSeconds).UtcDateTime;
} }

View File

@ -47,7 +47,7 @@ public class PdfComicInfoExtractor : IPdfComicInfoExtractor
{ {
if (string.IsNullOrEmpty(text)) return null; if (string.IsNullOrEmpty(text)) return null;
if (float.TryParse(text, out var value)) return value; if (float.TryParse(text, CultureInfo.InvariantCulture, out var value)) return value;
return null; return null;
} }
@ -58,7 +58,7 @@ public class PdfComicInfoExtractor : IPdfComicInfoExtractor
// Dates stored in the XMP metadata stream (PDF Spec 14.3.2) // Dates stored in the XMP metadata stream (PDF Spec 14.3.2)
// are stored in ISO 8601 format, which is handled by C# out of the box // are stored in ISO 8601 format, which is handled by C# out of the box
if (DateTime.TryParse(text, out var date)) return date; if (DateTime.TryParse(text, CultureInfo.InvariantCulture, out var date)) return date;
// Dates stored in the document information directory (PDF Spec 14.3.3) // Dates stored in the document information directory (PDF Spec 14.3.3)
// are stored in a proprietary format (PDF Spec 7.9.4) that needs to be // are stored in a proprietary format (PDF Spec 7.9.4) that needs to be
@ -71,7 +71,7 @@ public class PdfComicInfoExtractor : IPdfComicInfoExtractor
foreach(var format in _pdfDateFormats) foreach(var format in _pdfDateFormats)
{ {
if (DateTime.TryParseExact(text, format, null, System.Globalization.DateTimeStyles.None, out var pdfDate)) return pdfDate; if (DateTime.TryParseExact(text, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out var pdfDate)) return pdfDate;
} }
return null; return null;

View File

@ -1,5 +1,4 @@
using System; using System;
using System.Globalization;
using System.IO.Abstractions; using System.IO.Abstractions;
using System.Linq; using System.Linq;
using System.Security.Cryptography; using System.Security.Cryptography;

View File

@ -695,7 +695,7 @@ public class BookService : IBookService
var month = 0; var month = 0;
var day = 0; var day = 0;
if (string.IsNullOrEmpty(publicationDate)) return (year, month, day); if (string.IsNullOrEmpty(publicationDate)) return (year, month, day);
switch (DateTime.TryParse(publicationDate, out var date)) switch (DateTime.TryParse(publicationDate, CultureInfo.InvariantCulture, out var date))
{ {
case true: case true:
year = date.Year; year = date.Year;

View File

@ -70,7 +70,6 @@ public class FileService : IFileService
// Compute SHA hash // Compute SHA hash
var checksum = SHA256.HashData(Encoding.UTF8.GetBytes(content)); var checksum = SHA256.HashData(Encoding.UTF8.GetBytes(content));
return BitConverter.ToString(checksum).Replace("-", string.Empty).Equals(sha); return Convert.ToHexString(checksum).Equals(sha);
} }
} }

View File

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -1167,18 +1168,18 @@ public class ScrobblingService : IScrobblingService
var value = tokens[index]; var value = tokens[index];
if (typeof(T) == typeof(int?)) if (typeof(T) == typeof(int?))
{ {
if (int.TryParse(value, out var intValue)) if (int.TryParse(value, CultureInfo.InvariantCulture, out var intValue))
return (T)(object)intValue; return (T)(object)intValue;
} }
else if (typeof(T) == typeof(int)) else if (typeof(T) == typeof(int))
{ {
if (int.TryParse(value, out var intValue)) if (int.TryParse(value, CultureInfo.InvariantCulture, out var intValue))
return (T)(object)intValue; return (T)(object)intValue;
return default; return default;
} }
else if (typeof(T) == typeof(long?)) else if (typeof(T) == typeof(long?))
{ {
if (long.TryParse(value, out var longValue)) if (long.TryParse(value, CultureInfo.InvariantCulture, out var longValue))
return (T)(object)longValue; return (T)(object)longValue;
} }
else if (typeof(T) == typeof(string)) else if (typeof(T) == typeof(string))
@ -1187,7 +1188,7 @@ public class ScrobblingService : IScrobblingService
} }
} }
return default(T?); return default;
} }
/// <summary> /// <summary>

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@ -538,13 +539,13 @@ public class ReadingListService : IReadingListService
var maxPairs = Math.Max(arcs.Length, arcNumbers.Length); var maxPairs = Math.Max(arcs.Length, arcNumbers.Length);
for (var i = 0; i < maxPairs; i++) for (var i = 0; i < maxPairs; i++)
{ {
var arcNumber = int.MaxValue.ToString(); var arcNumber = int.MaxValue.ToString(CultureInfo.InvariantCulture);
if (arcNumbers.Length > i) if (arcNumbers.Length > i)
{ {
arcNumber = arcNumbers[i]; arcNumber = arcNumbers[i];
} }
if (string.IsNullOrEmpty(arcs[i]) || !int.TryParse(arcNumber, out _)) continue; if (string.IsNullOrEmpty(arcs[i]) || !int.TryParse(arcNumber, CultureInfo.InvariantCulture, out _)) continue;
data.Add(new Tuple<string, string>(arcs[i], arcNumber)); data.Add(new Tuple<string, string>(arcs[i], arcNumber));
} }

View File

@ -782,7 +782,7 @@ public class ProcessSeries : IProcessSeries
chapter.SortOrder = info.IssueOrder; chapter.SortOrder = info.IssueOrder;
} }
if (float.TryParse(chapter.Title, out _)) if (float.TryParse(chapter.Title, CultureInfo.InvariantCulture, out _))
{ {
// If we have float based chapters, first scan can have the chapter formatted as Chapter 0.2 - .2 as the title is wrong. // If we have float based chapters, first scan can have the chapter formatted as Chapter 0.2 - .2 as the title is wrong.
chapter.Title = chapter.GetNumberTitle(); chapter.Title = chapter.GetNumberTitle();

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text.Json; using System.Text.Json;
@ -253,7 +254,7 @@ public partial class VersionUpdaterService : IVersionUpdaterService
{ {
Version = version, Version = version,
PrNumber = prNumber, PrNumber = prNumber,
Date = DateTime.Parse(commit.Commit.Author.Date) Date = DateTime.Parse(commit.Commit.Author.Date, CultureInfo.InvariantCulture)
}); });
} }
} }

View File

@ -5,7 +5,6 @@
<Product>Kavita</Product> <Product>Kavita</Product>
<AssemblyVersion>0.8.5.11</AssemblyVersion> <AssemblyVersion>0.8.5.11</AssemblyVersion>
<NeutralLanguage>en</NeutralLanguage> <NeutralLanguage>en</NeutralLanguage>
<InvariantGlobalization>true</InvariantGlobalization>
<TieredPGO>true</TieredPGO> <TieredPGO>true</TieredPGO>
</PropertyGroup> </PropertyGroup>

View File

@ -129,7 +129,7 @@ export class ManageUserPreferencesComponent implements OnInit {
this.fontFamilies = this.bookService.getFontFamilies().map(f => f.title); this.fontFamilies = this.bookService.getFontFamilies().map(f => f.title);
this.cdRef.markForCheck(); this.cdRef.markForCheck();
this.localizationService.locales$.subscribe(res => { this.localizationService.getLocales().subscribe(res => {
this.locales = res; this.locales = res;
this.cdRef.markForCheck(); this.cdRef.markForCheck();