Compare commits

..

13 commits

Author SHA1 Message Date
GitHub Action
ef2640b5fc Update OpenAPI documentation 2025-07-05 22:20:01 +00:00
majora2007
76fd7ab4ce Bump versions by dotnet-bump-version. 2025-07-05 22:18:52 +00:00
Joe Milazzo
08c52b4281
No More Sort Prefixes (#3895) 2025-07-05 15:18:11 -07:00
GitHub Action
9eadf956fb Update OpenAPI documentation 2025-07-05 19:53:05 +00:00
Joe Milazzo
eab3d7a207
v0.8.7 - Comic Metadata Downloading, Reading Profiles, Browse by Genre and More (#3888) 2025-07-05 12:51:19 -07:00
Weblate (bot)
1389eb6320
[skip ci] Weblate Changes (#3893)
Co-authored-by: Dark77 <Dark77@pobox.sk>
Co-authored-by: Gregory.Open <gregory.open@proton.me>
Co-authored-by: Mateusz <mateuszvx8.96@gmail.com>
Co-authored-by: 안세훈 <on9686@gmail.com>
2025-07-05 12:30:06 -07:00
Weblate (bot)
8deb96cf48
[skip ci] Weblate Changes (#3885)
Co-authored-by: Gregory.Open <gregory.open@proton.me>
2025-07-02 15:38:26 -07:00
Weblate (bot)
ff17908400
[skip ci] Weblate Changes (#3883)
Co-authored-by: Duarte Silva <smallflake@protonmail.com>
Co-authored-by: Gregory.Open <gregory.open@proton.me>
Co-authored-by: Havokdan <havokdan@yahoo.com.br>
Co-authored-by: lin49931104 <a82122794@gmail.com>
2025-06-30 05:20:19 -07:00
Weblate (bot)
e5d949161e
[skip ci] Weblate Changes (#3877)
Co-authored-by: Adam Havránek <adamhavra@seznam.cz>
Co-authored-by: Duarte Silva <smallflake@protonmail.com>
Co-authored-by: Frozehunter <frozehunter@me.com>
Co-authored-by: Lyrq <lyrq.ku@gmail.com>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
2025-06-28 12:20:04 -07:00
GitHub Action
6d4e207b65 Update OpenAPI documentation 2025-06-28 16:46:53 +00:00
majora2007
3ac816eaf7 Bump versions by dotnet-bump-version. 2025-06-28 16:45:47 +00:00
Fesaa
d909e03baf
A few more bug fixes (#3876)
Co-authored-by: Joseph Milazzo <joseph.v.milazzo@gmail.com>
2025-06-28 09:45:02 -07:00
Weblate (bot)
4b9bbc5d78
[skip ci] Weblate Changes (#3855)
Co-authored-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
Co-authored-by: Ascyra <czebeczauer@gmail.com>
Co-authored-by: Dark77 <Dark77@pobox.sk>
Co-authored-by: Frozehunter <frozehunter@me.com>
Co-authored-by: Havokdan <havokdan@yahoo.com.br>
Co-authored-by: N'Num Yutthaphon Inchaiya <yutthaphon30667@gmail.com>
Co-authored-by: lin49931104 <a82122794@gmail.com>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Co-authored-by: 안세훈 <on9686@gmail.com>
2025-06-26 16:16:45 -07:00
65 changed files with 10059 additions and 466 deletions

View file

@ -28,7 +28,7 @@ body:
label: Kavita Version Number - If you don't see your version number listed, please update Kavita and see if your issue still persists.
multiple: false
options:
- 0.8.6.2 - Stable
- 0.8.7 - Stable
- Nightly Testing Branch
validations:
required: true

View file

@ -0,0 +1,178 @@
using API.Helpers;
using Xunit;
namespace API.Tests.Helpers;
public class BookSortTitlePrefixHelperTests
{
[Theory]
[InlineData("The Avengers", "Avengers")]
[InlineData("A Game of Thrones", "Game of Thrones")]
[InlineData("An American Tragedy", "American Tragedy")]
public void TestEnglishPrefixes(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("El Quijote", "Quijote")]
[InlineData("La Casa de Papel", "Casa de Papel")]
[InlineData("Los Miserables", "Miserables")]
[InlineData("Las Vegas", "Vegas")]
[InlineData("Un Mundo Feliz", "Mundo Feliz")]
[InlineData("Una Historia", "Historia")]
public void TestSpanishPrefixes(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("Le Petit Prince", "Petit Prince")]
[InlineData("La Belle et la Bête", "Belle et la Bête")]
[InlineData("Les Misérables", "Misérables")]
[InlineData("Un Amour de Swann", "Amour de Swann")]
[InlineData("Une Vie", "Vie")]
[InlineData("Des Souris et des Hommes", "Souris et des Hommes")]
public void TestFrenchPrefixes(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("Der Herr der Ringe", "Herr der Ringe")]
[InlineData("Die Verwandlung", "Verwandlung")]
[InlineData("Das Kapital", "Kapital")]
[InlineData("Ein Sommernachtstraum", "Sommernachtstraum")]
[InlineData("Eine Geschichte", "Geschichte")]
public void TestGermanPrefixes(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("Il Nome della Rosa", "Nome della Rosa")]
[InlineData("La Divina Commedia", "Divina Commedia")]
[InlineData("Lo Hobbit", "Hobbit")]
[InlineData("Gli Ultimi", "Ultimi")]
[InlineData("Le Città Invisibili", "Città Invisibili")]
[InlineData("Un Giorno", "Giorno")]
[InlineData("Una Notte", "Notte")]
public void TestItalianPrefixes(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("O Alquimista", "Alquimista")]
[InlineData("A Moreninha", "Moreninha")]
[InlineData("Os Lusíadas", "Lusíadas")]
[InlineData("As Meninas", "Meninas")]
[InlineData("Um Defeito de Cor", "Defeito de Cor")]
[InlineData("Uma História", "História")]
public void TestPortuguesePrefixes(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("", "")] // Empty string returns empty
[InlineData("Book", "Book")] // Single word, no change
[InlineData("Avengers", "Avengers")] // No prefix, no change
public void TestNoPrefixCases(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("The", "The")] // Just a prefix word alone
[InlineData("A", "A")] // Just single letter prefix alone
[InlineData("Le", "Le")] // French prefix alone
public void TestPrefixWordAlone(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("THE AVENGERS", "AVENGERS")] // All caps
[InlineData("the avengers", "avengers")] // All lowercase
[InlineData("The AVENGERS", "AVENGERS")] // Mixed case
[InlineData("tHe AvEnGeRs", "AvEnGeRs")] // Random case
public void TestCaseInsensitivity(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("Then Came You", "Then Came You")] // "The" + "n" = not a prefix
[InlineData("And Then There Were None", "And Then There Were None")] // "An" + "d" = not a prefix
[InlineData("Elsewhere", "Elsewhere")] // "El" + "sewhere" = not a prefix (no space)
[InlineData("Lesson Plans", "Lesson Plans")] // "Les" + "son" = not a prefix (no space)
[InlineData("Theory of Everything", "Theory of Everything")] // "The" + "ory" = not a prefix
public void TestFalsePositivePrefixes(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("The ", "The ")] // Prefix with only space after - returns original
[InlineData("La ", "La ")] // Same for other languages
[InlineData("El ", "El ")] // Same for Spanish
public void TestPrefixWithOnlySpaceAfter(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("The Multiple Spaces", " Multiple Spaces")] // Doesn't trim extra spaces from remainder
[InlineData("Le Petit Prince", " Petit Prince")] // Leading space preserved in remainder
public void TestSpaceHandling(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("The The Matrix", "The Matrix")] // Removes first "The", leaves second
[InlineData("A A Clockwork Orange", "A Clockwork Orange")] // Removes first "A", leaves second
[InlineData("El El Cid", "El Cid")] // Spanish version
public void TestRepeatedPrefixes(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("L'Étranger", "L'Étranger")] // French contraction - no space, no change
[InlineData("D'Artagnan", "D'Artagnan")] // Contraction - no space, no change
[InlineData("The-Matrix", "The-Matrix")] // Hyphen instead of space - no change
[InlineData("The.Avengers", "The.Avengers")] // Period instead of space - no change
public void TestNonSpaceSeparators(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("三国演义", "三国演义")] // Chinese - no processing due to CJK detection
[InlineData("한국어", "한국어")] // Korean - not in CJK range, would be processed normally
public void TestCjkLanguages(string inputString, string expected)
{
// NOTE: These don't do anything, I am waiting for user input on if these are needed
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("नमस्ते दुनिया", "नमस्ते दुनिया")] // Hindi - not CJK, processed normally
[InlineData("مرحبا بالعالم", "مرحبا بالعالم")] // Arabic - not CJK, processed normally
[InlineData("שלום עולם", "שלום עולם")] // Hebrew - not CJK, processed normally
public void TestNonLatinNonCjkScripts(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
[Theory]
[InlineData("в мире", "мире")] // Russian "в" (in) - should be removed
[InlineData("на столе", "столе")] // Russian "на" (on) - should be removed
[InlineData("с друзьями", "друзьями")] // Russian "с" (with) - should be removed
public void TestRussianPrefixes(string inputString, string expected)
{
Assert.Equal(expected, BookSortTitlePrefixHelper.GetSortTitle(inputString));
}
}

View file

@ -973,34 +973,26 @@ public class ScannerServiceTests : AbstractDbTest
Assert.Contains(postLib.Series, x => x.Name == "Futoku No Guild");
}
#region Just Parsing Tests
[Fact]
public async Task Special_WithTitle_HasTitleSet()
public async Task ScanLibrary_SortName_NoPrefix()
{
const string testcase = "Series with Just a Special - Manga.json";
const string testcase = "Series with Prefix - Book.json";
// Get the first file and generate a ComicInfo
var infos = new Dictionary<string, ComicInfo>();
infos.Add("just a bunch of junk.cbz", new ComicInfo()
{
Series = "test",
Title = "Special Title",
Format = "Special"
});
var library = await _scannerHelper.GenerateScannerData(testcase);
var library = await _scannerHelper.GenerateScannerData(testcase, infos);
library.RemovePrefixForSortName = true;
UnitOfWork.LibraryRepository.Update(library);
await UnitOfWork.CommitAsync();
var scanner = _scannerHelper.CreateServices();
await scanner.ScanLibrary(library.Id);
var postLib = await UnitOfWork.LibraryRepository.GetLibraryForIdAsync(library.Id, LibraryIncludes.Series);
// Validate that there are 2 series
Assert.NotNull(postLib);
Assert.Equal(1, postLib.Series.Count);
Assert.Equal("test", postLib.Series.First().Name);
Assert.Equal("Special Title", postLib.Series.First().Volumes[0].Chapters[0].Title);
Assert.Equal("The Avengers", postLib.Series.First().Name);
Assert.Equal("Avengers", postLib.Series.First().SortName);
}
#endregion
}

View file

@ -1,3 +0,0 @@
[
"test/just a bunch of junk.cbz"
]

View file

@ -0,0 +1,3 @@
[
"The Avengers/The Avengers vol 1.pdf"
]

View file

@ -9,6 +9,7 @@ using API.DTOs;
using API.DTOs.SeriesDetail;
using API.Entities;
using API.Entities.Enums;
using API.Entities.MetadataMatching;
using API.Entities.Person;
using API.Extensions;
using API.Helpers;
@ -208,6 +209,7 @@ public class ChapterController : BaseApiController
if (chapter.AgeRating != dto.AgeRating)
{
chapter.AgeRating = dto.AgeRating;
chapter.KPlusOverrides.Remove(MetadataSettingField.AgeRating);
}
dto.Summary ??= string.Empty;
@ -215,6 +217,7 @@ public class ChapterController : BaseApiController
if (chapter.Summary != dto.Summary.Trim())
{
chapter.Summary = dto.Summary.Trim();
chapter.KPlusOverrides.Remove(MetadataSettingField.ChapterSummary);
}
if (chapter.Language != dto.Language)
@ -230,11 +233,13 @@ public class ChapterController : BaseApiController
if (chapter.TitleName != dto.TitleName)
{
chapter.TitleName = dto.TitleName;
chapter.KPlusOverrides.Remove(MetadataSettingField.ChapterTitle);
}
if (chapter.ReleaseDate != dto.ReleaseDate)
{
chapter.ReleaseDate = dto.ReleaseDate;
chapter.KPlusOverrides.Remove(MetadataSettingField.ChapterReleaseDate);
}
if (!string.IsNullOrEmpty(dto.ISBN) && ArticleNumberHelper.IsValidIsbn10(dto.ISBN) ||
@ -333,6 +338,8 @@ public class ChapterController : BaseApiController
_unitOfWork
);
// TODO: Only remove field if changes were made
chapter.KPlusOverrides.Remove(MetadataSettingField.ChapterPublisher);
// Update publishers
await PersonHelper.UpdateChapterPeopleAsync(
chapter,

View file

@ -6,6 +6,7 @@ using API.Data;
using API.Data.Repositories;
using API.DTOs.Koreader;
using API.Entities;
using API.Extensions;
using API.Services;
using Kavita.Common;
using Microsoft.AspNetCore.Identity;
@ -94,7 +95,7 @@ public class KoreaderController : BaseApiController
{
var userId = await GetUserId(apiKey);
var response = await _koreaderService.GetProgress(ebookHash, userId);
_logger.LogDebug("Koreader response progress: {Progress}", response.Progress);
_logger.LogDebug("Koreader response progress for User ({UserId}): {Progress}", userId, response.Progress.Sanitize());
return Ok(response);
}

View file

@ -624,6 +624,8 @@ public class LibraryController : BaseApiController
library.AllowScrobbling = dto.AllowScrobbling;
library.AllowMetadataMatching = dto.AllowMetadataMatching;
library.EnableMetadata = dto.EnableMetadata;
library.RemovePrefixForSortName = dto.RemovePrefixForSortName;
library.LibraryFileTypes = dto.FileGroupTypes
.Select(t => new LibraryFileTypeGroup() {FileTypeGroup = t, LibraryId = library.Id})
.Distinct()

View file

@ -14,6 +14,7 @@ using API.DTOs.Recommendation;
using API.DTOs.SeriesDetail;
using API.Entities;
using API.Entities.Enums;
using API.Entities.MetadataMatching;
using API.Extensions;
using API.Helpers;
using API.Services;
@ -224,6 +225,7 @@ public class SeriesController : BaseApiController
needsRefreshMetadata = true;
series.CoverImage = null;
series.CoverImageLocked = false;
series.Metadata.KPlusOverrides.Remove(MetadataSettingField.Covers);
_logger.LogDebug("[SeriesCoverImageBug] Setting Series Cover Image to null: {SeriesId}", series.Id);
series.ResetColorScape();

View file

@ -6,6 +6,7 @@ using API.Data;
using API.Data.Repositories;
using API.DTOs.Uploads;
using API.Entities.Enums;
using API.Entities.MetadataMatching;
using API.Extensions;
using API.Services;
using API.Services.Tasks.Metadata;
@ -112,8 +113,10 @@ public class UploadController : BaseApiController
series.CoverImage = filePath;
series.CoverImageLocked = lockState;
series.Metadata.KPlusOverrides.Remove(MetadataSettingField.Covers);
_imageService.UpdateColorScape(series);
_unitOfWork.SeriesRepository.Update(series);
_unitOfWork.SeriesRepository.Update(series.Metadata);
if (_unitOfWork.HasChanges())
{
@ -277,6 +280,7 @@ public class UploadController : BaseApiController
chapter.CoverImage = filePath;
chapter.CoverImageLocked = lockState;
chapter.KPlusOverrides.Remove(MetadataSettingField.ChapterCovers);
_unitOfWork.ChapterRepository.Update(chapter);
var volume = await _unitOfWork.VolumeRepository.GetVolumeAsync(chapter.VolumeId);
if (volume != null)

View file

@ -70,4 +70,8 @@ public sealed record LibraryDto
/// Allow Kavita to read metadata (ComicInfo.xml, Epub, PDF)
/// </summary>
public bool EnableMetadata { get; set; } = true;
/// <summary>
/// Should Kavita remove sort articles "The" for the sort name
/// </summary>
public bool RemovePrefixForSortName { get; set; } = false;
}

View file

@ -30,6 +30,8 @@ public sealed record UpdateLibraryDto
public bool AllowMetadataMatching { get; init; }
[Required]
public bool EnableMetadata { get; init; }
[Required]
public bool RemovePrefixForSortName { get; init; }
/// <summary>
/// What types of files to allow the scanner to pickup
/// </summary>

View file

@ -4,7 +4,6 @@ using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using API.DTOs.KavitaPlus.Metadata;
using API.Entities;
using API.Entities.Enums;
using API.Entities.Enums.UserPreferences;
@ -18,7 +17,6 @@ using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.Diagnostics;
namespace API.Data;
@ -43,7 +41,7 @@ public sealed class DataContext : IdentityDbContext<AppUser, AppRole, int,
public DbSet<ServerSetting> ServerSetting { get; set; } = null!;
public DbSet<AppUserPreferences> AppUserPreferences { get; set; } = null!;
public DbSet<SeriesMetadata> SeriesMetadata { get; set; } = null!;
[Obsolete]
[Obsolete("Use AppUserCollection")]
public DbSet<CollectionTag> CollectionTag { get; set; } = null!;
public DbSet<AppUserBookmark> AppUserBookmark { get; set; } = null!;
public DbSet<ReadingList> ReadingList { get; set; } = null!;
@ -72,7 +70,7 @@ public sealed class DataContext : IdentityDbContext<AppUser, AppRole, int,
public DbSet<ExternalSeriesMetadata> ExternalSeriesMetadata { get; set; } = null!;
public DbSet<ExternalRecommendation> ExternalRecommendation { get; set; } = null!;
public DbSet<ManualMigrationHistory> ManualMigrationHistory { get; set; } = null!;
[Obsolete]
[Obsolete("Use IsBlacklisted field on Series")]
public DbSet<SeriesBlacklist> SeriesBlacklist { get; set; } = null!;
public DbSet<AppUserCollection> AppUserCollection { get; set; } = null!;
public DbSet<ChapterPeople> ChapterPeople { get; set; } = null!;
@ -286,6 +284,22 @@ public sealed class DataContext : IdentityDbContext<AppUser, AppRole, int,
v => JsonSerializer.Serialize(v, JsonSerializerOptions.Default),
v => JsonSerializer.Deserialize<List<int>>(v, JsonSerializerOptions.Default) ?? new List<int>())
.HasColumnType("TEXT");
builder.Entity<SeriesMetadata>()
.Property(sm => sm.KPlusOverrides)
.HasConversion(
v => JsonSerializer.Serialize(v, JsonSerializerOptions.Default),
v => JsonSerializer.Deserialize<IList<MetadataSettingField>>(v, JsonSerializerOptions.Default) ??
new List<MetadataSettingField>())
.HasColumnType("TEXT")
.HasDefaultValue(new List<MetadataSettingField>());
builder.Entity<Chapter>()
.Property(sm => sm.KPlusOverrides)
.HasConversion(
v => JsonSerializer.Serialize(v, JsonSerializerOptions.Default),
v => JsonSerializer.Deserialize<IList<MetadataSettingField>>(v, JsonSerializerOptions.Default) ?? new List<MetadataSettingField>())
.HasColumnType("TEXT")
.HasDefaultValue(new List<MetadataSettingField>());
}
#nullable enable

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,40 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace API.Data.Migrations
{
/// <inheritdoc />
public partial class TrackKavitaPlusMetadata : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "KPlusOverrides",
table: "SeriesMetadata",
type: "TEXT",
nullable: true,
defaultValue: "[]");
migrationBuilder.AddColumn<string>(
name: "KPlusOverrides",
table: "Chapter",
type: "TEXT",
nullable: true,
defaultValue: "[]");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "KPlusOverrides",
table: "SeriesMetadata");
migrationBuilder.DropColumn(
name: "KPlusOverrides",
table: "Chapter");
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace API.Data.Migrations
{
/// <inheritdoc />
public partial class LibraryRemoveSortPrefix : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<bool>(
name: "RemovePrefixForSortName",
table: "Library",
type: "INTEGER",
nullable: false,
defaultValue: false);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "RemovePrefixForSortName",
table: "Library");
}
}
}

View file

@ -1,6 +1,8 @@
// <auto-generated />
using System;
using System.Collections.Generic;
using API.Data;
using API.Entities.MetadataMatching;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
@ -957,6 +959,11 @@ namespace API.Data.Migrations
b.Property<bool>("IsSpecial")
.HasColumnType("INTEGER");
b.Property<string>("KPlusOverrides")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasDefaultValue("[]");
b.Property<string>("Language")
.HasColumnType("TEXT");
@ -1334,6 +1341,9 @@ namespace API.Data.Migrations
b.Property<string>("PrimaryColor")
.HasColumnType("TEXT");
b.Property<bool>("RemovePrefixForSortName")
.HasColumnType("INTEGER");
b.Property<string>("SecondaryColor")
.HasColumnType("TEXT");
@ -1683,6 +1693,11 @@ namespace API.Data.Migrations
b.Property<bool>("InkerLocked")
.HasColumnType("INTEGER");
b.Property<string>("KPlusOverrides")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasDefaultValue("[]");
b.Property<string>("Language")
.HasColumnType("TEXT");

View file

@ -387,8 +387,8 @@ public class PersonRepository : IPersonRepository
return await _context.Person
.Includes(includes)
.Where(p => EF.Functions.Like(p.Name, $"%{searchQuery}%")
|| p.Aliases.Any(pa => EF.Functions.Like(pa.Alias, $"%{searchQuery}%")))
.Where(p => EF.Functions.Like(p.NormalizedName, $"%{searchQuery}%")
|| p.Aliases.Any(pa => EF.Functions.Like(pa.NormalizedAlias, $"%{searchQuery}%")))
.ProjectTo<PersonDto>(_mapper.ConfigurationProvider)
.ToListAsync();
}

View file

@ -82,6 +82,7 @@ public interface ISeriesRepository
void Attach(Series series);
void Attach(SeriesRelation relation);
void Update(Series series);
void Update(SeriesMetadata seriesMetadata);
void Remove(Series series);
void Remove(IEnumerable<Series> series);
void Detach(Series series);
@ -219,6 +220,11 @@ public class SeriesRepository : ISeriesRepository
_context.Entry(series).State = EntityState.Modified;
}
public void Update(SeriesMetadata seriesMetadata)
{
_context.Entry(seriesMetadata).State = EntityState.Modified;
}
public void Remove(Series series)
{
_context.Series.Remove(series);

View file

@ -4,13 +4,14 @@ using System.Globalization;
using API.Entities.Enums;
using API.Entities.Interfaces;
using API.Entities.Metadata;
using API.Entities.MetadataMatching;
using API.Entities.Person;
using API.Extensions;
using API.Services.Tasks.Scanner.Parser;
namespace API.Entities;
public class Chapter : IEntityDate, IHasReadTimeEstimate, IHasCoverImage
public class Chapter : IEntityDate, IHasReadTimeEstimate, IHasCoverImage, IHasKPlusMetadata
{
public int Id { get; set; }
/// <summary>
@ -126,6 +127,11 @@ public class Chapter : IEntityDate, IHasReadTimeEstimate, IHasCoverImage
public string WebLinks { get; set; } = string.Empty;
public string ISBN { get; set; } = string.Empty;
/// <summary>
/// Tracks which metadata has been set by K+
/// </summary>
public IList<MetadataSettingField> KPlusOverrides { get; set; } = [];
/// <summary>
/// (Kavita+) Average rating from Kavita+ metadata
/// </summary>
@ -188,7 +194,7 @@ public class Chapter : IEntityDate, IHasReadTimeEstimate, IHasCoverImage
MinNumber = Parser.DefaultChapterNumber;
MaxNumber = Parser.DefaultChapterNumber;
}
Title = IsSpecial
Title = (IsSpecial && info.Format is MangaFormat.Epub or MangaFormat.Pdf)
? info.Title
: Parser.RemoveExtensionIfSupported(Range);

View file

@ -0,0 +1,12 @@
using System.Collections.Generic;
using API.Entities.MetadataMatching;
namespace API.Entities.Interfaces;
public interface IHasKPlusMetadata
{
/// <summary>
/// Tracks which metadata has been set by K+
/// </summary>
public IList<MetadataSettingField> KPlusOverrides { get; set; }
}

View file

@ -52,6 +52,10 @@ public class Library : IEntityDate, IHasCoverImage
/// Should Kavita read metadata files from the library
/// </summary>
public bool EnableMetadata { get; set; } = true;
/// <summary>
/// Should Kavita remove sort articles "The" for the sort name
/// </summary>
public bool RemovePrefixForSortName { get; set; } = false;
public DateTime Created { get; set; }

View file

@ -4,13 +4,14 @@ using System.ComponentModel.DataAnnotations;
using System.Linq;
using API.Entities.Enums;
using API.Entities.Interfaces;
using API.Entities.MetadataMatching;
using API.Entities.Person;
using Microsoft.EntityFrameworkCore;
namespace API.Entities.Metadata;
[Index(nameof(Id), nameof(SeriesId), IsUnique = true)]
public class SeriesMetadata : IHasConcurrencyToken
public class SeriesMetadata : IHasConcurrencyToken, IHasKPlusMetadata
{
public int Id { get; set; }
@ -42,6 +43,10 @@ public class SeriesMetadata : IHasConcurrencyToken
/// </summary>
/// <remarks>This is not populated from Chapters of the Series</remarks>
public string WebLinks { get; set; } = string.Empty;
/// <summary>
/// Tracks which metadata has been set by K+
/// </summary>
public IList<MetadataSettingField> KPlusOverrides { get; set; } = [];
#region Locks

View file

@ -0,0 +1,21 @@
using API.Entities.Interfaces;
using API.Entities.MetadataMatching;
namespace API.Extensions;
public static class IHasKPlusMetadataExtensions
{
public static bool HasSetKPlusMetadata(this IHasKPlusMetadata hasKPlusMetadata, MetadataSettingField field)
{
return hasKPlusMetadata.KPlusOverrides.Contains(field);
}
public static void AddKPlusOverride(this IHasKPlusMetadata hasKPlusMetadata, MetadataSettingField field)
{
if (hasKPlusMetadata.KPlusOverrides.Contains(field)) return;
hasKPlusMetadata.KPlusOverrides.Add(field);
}
}

View file

@ -0,0 +1,101 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
namespace API.Helpers;
/// <summary>
/// Responsible for parsing book titles "The man on the street" and removing the prefix -> "man on the street".
/// </summary>
/// <remarks>This code is performance sensitive</remarks>
public static class BookSortTitlePrefixHelper
{
private static readonly Dictionary<string, byte> PrefixLookup;
private static readonly Dictionary<char, List<string>> PrefixesByFirstChar;
static BookSortTitlePrefixHelper()
{
var prefixes = new[]
{
// English
"the", "a", "an",
// Spanish
"el", "la", "los", "las", "un", "una", "unos", "unas",
// French
"le", "la", "les", "un", "une", "des",
// German
"der", "die", "das", "den", "dem", "ein", "eine", "einen", "einer",
// Italian
"il", "lo", "la", "gli", "le", "un", "uno", "una",
// Portuguese
"o", "a", "os", "as", "um", "uma", "uns", "umas",
// Russian (transliterated common ones)
"в", "на", "с", "к", "от", "для",
};
// Build lookup structures
PrefixLookup = new Dictionary<string, byte>(prefixes.Length, StringComparer.OrdinalIgnoreCase);
PrefixesByFirstChar = new Dictionary<char, List<string>>();
foreach (var prefix in prefixes)
{
PrefixLookup[prefix] = 1;
var firstChar = char.ToLowerInvariant(prefix[0]);
if (!PrefixesByFirstChar.TryGetValue(firstChar, out var list))
{
list = [];
PrefixesByFirstChar[firstChar] = list;
}
list.Add(prefix);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static ReadOnlySpan<char> GetSortTitle(ReadOnlySpan<char> title)
{
if (title.IsEmpty) return title;
// Fast detection of script type by first character
var firstChar = title[0];
// CJK Unicode ranges - no processing needed for most cases
if ((firstChar >= 0x4E00 && firstChar <= 0x9FFF) || // CJK Unified
(firstChar >= 0x3040 && firstChar <= 0x309F) || // Hiragana
(firstChar >= 0x30A0 && firstChar <= 0x30FF)) // Katakana
{
return title;
}
var firstSpaceIndex = title.IndexOf(' ');
if (firstSpaceIndex <= 0) return title;
var potentialPrefix = title.Slice(0, firstSpaceIndex);
// Fast path: check if first character could match any prefix
firstChar = char.ToLowerInvariant(potentialPrefix[0]);
if (!PrefixesByFirstChar.ContainsKey(firstChar))
return title;
// Only do the expensive lookup if first character matches
if (PrefixLookup.ContainsKey(potentialPrefix.ToString()))
{
var remainder = title.Slice(firstSpaceIndex + 1);
return remainder.IsEmpty ? title : remainder;
}
return title;
}
/// <summary>
/// Removes the sort prefix
/// </summary>
/// <param name="title"></param>
/// <returns></returns>
public static string GetSortTitle(string title)
{
var result = GetSortTitle(title.AsSpan());
return result.ToString();
}
}

View file

@ -39,7 +39,9 @@ public class ChapterBuilder : IEntityBuilder<Chapter>
return builder.WithNumber(Parser.RemoveExtensionIfSupported(info.Chapters)!)
.WithRange(specialTreatment ? info.Filename : info.Chapters)
.WithTitle(info.Title ?? string.Empty) // NOTE: This originally had duplicate logic. I moved it further up int the pipeline.
.WithTitle(specialTreatment && info.Format is MangaFormat.Epub or MangaFormat.Pdf
? info.Title
: specialTitle ?? string.Empty)
.WithIsSpecial(specialTreatment);
}

View file

@ -207,5 +207,7 @@
"sidenav-stream-only-delete-smart-filter": "Nur Smart-Filter-Streams können aus der Seitennavigation gelöscht werden",
"dashboard-stream-only-delete-smart-filter": "Nur Smart-Filter-Streams können aus dem Dashboard gelöscht werden",
"smart-filter-system-name": "Du kannst den Namen eines vom System bereitgestellten Streams nicht verwenden",
"smart-filter-name-required": "Name des Smart Filters erforderlich"
"smart-filter-name-required": "Name des Smart Filters erforderlich",
"aliases-have-overlap": "Ein oder mehrere Aliasnamen sind mit anderen Personen identisch und können nicht aktualisiert werden",
"generated-reading-profile-name": "Erstellt aus {0}"
}

View file

@ -207,5 +207,7 @@
"sidenav-stream-only-delete-smart-filter": "Seuls les flux de filtres intelligents peuvent être supprimés de la SideNav",
"dashboard-stream-only-delete-smart-filter": "Seuls les flux de filtres intelligents peuvent être supprimés du tableau de bord",
"smart-filter-name-required": "Nom du filtre intelligent requis",
"smart-filter-system-name": "Vous ne pouvez pas utiliser le nom d'un flux fourni par le système"
"smart-filter-system-name": "Vous ne pouvez pas utiliser le nom d'un flux fourni par le système",
"aliases-have-overlap": "Un ou plusieurs alias se chevauchent avec d'autres personnes et ne peuvent pas être mis à jour",
"generated-reading-profile-name": "Généré à partir de {0}"
}

View file

@ -196,5 +196,9 @@
"check-scrobbling-tokens": "Ellenőrizd a Feldolgozó tokeneket",
"process-scrobbling-events": "Feldolgozó események feldolgozása",
"process-processed-scrobbling-events": "A feldolgozott Feldolgozó események felolgozása",
"generic-cover-volume-save": "Nem lehet borítóképet menteni a kötethez"
"generic-cover-volume-save": "Nem lehet borítóképet menteni a kötethez",
"person-doesnt-exist": "A személy nem létezik",
"person-name-required": "A személy neve kötelező, és nem lehet üres",
"email-taken": "Az e-mail már használatban van",
"person-name-unique": "A személy nevének egyedinek kell lennie"
}

View file

@ -207,5 +207,7 @@
"dashboard-stream-only-delete-smart-filter": "대시보드에서 스마트 필터 스트림만 삭제할 수 있습니다",
"sidenav-stream-only-delete-smart-filter": "사이드 메뉴에서 스마트 필터 스트림만 삭제할 수 있습니다",
"smart-filter-name-required": "스마트 필터 이름이 필요합니다",
"smart-filter-system-name": "시스템 제공 스트림 이름은 사용할 수 없습니다"
"smart-filter-system-name": "시스템 제공 스트림 이름은 사용할 수 없습니다",
"aliases-have-overlap": "하나 이상의 별명이 다른 사용자와 중복되어 업데이트할 수 없습니다",
"generated-reading-profile-name": "{0}(으)로부터 생성됨"
}

View file

@ -207,5 +207,7 @@
"smart-filter-name-required": "Inteligentny filtr wymaga nazwy",
"sidenav-stream-only-delete-smart-filter": "Tylko inteligentne filtry mogą zostać usunięte z panelu bocznego",
"dashboard-stream-only-delete-smart-filter": "Tylko inteligentne strumienie filtrów może zostać usunięte z głównego panelu",
"smart-filter-system-name": "Nie można użyć nazwy systemu dostarczanego strumieniem"
"smart-filter-system-name": "Nie można użyć nazwy systemu dostarczanego strumieniem",
"aliases-have-overlap": "Jeden lub więcej aliasów pokrywa się z innymi osobami, nie można ich zaktualizować",
"generated-reading-profile-name": "Wygenerowano z {0}"
}

View file

@ -207,5 +207,7 @@
"sidenav-stream-only-delete-smart-filter": "Apenas os filtros inteligentes podem ser removidos da Navegação Lateral",
"dashboard-stream-only-delete-smart-filter": "Apenas os filtros inteligentes podem ser removidos do painel",
"smart-filter-system-name": "Não pode usar o nome de um fluxo disponibilizado pelo sistema",
"smart-filter-name-required": "Nome requerido para o filtro inteligente"
"smart-filter-name-required": "Nome requerido para o filtro inteligente",
"aliases-have-overlap": "Um ou mais pseudónimos sobrepõem-se com outras pessoas, não vai ser possível atualizar",
"generated-reading-profile-name": "Gerado de {0}"
}

View file

@ -1,5 +1,5 @@
{
"disabled-account": "Váš účet je zakázaný. Kontaktujte správcu servera.",
"disabled-account": "Váš účet je deaktivovaný. Kontaktujte správcu servera.",
"register-user": "Niečo sa pokazilo pri registrácii užívateľa",
"confirm-email": "Najprv musíte potvrdiť svoj e-mail",
"locked-out": "Boli ste zamknutí z dôvodu veľkého počtu neúspešných pokusov o prihlásenie. Počkajte 10 minút.",
@ -88,5 +88,126 @@
"generic-device-create": "Pri vytváraní zariadenia sa vyskytla chyba",
"series-doesnt-exist": "Séria neexistuje",
"volume-doesnt-exist": "Zväzok neexistuje",
"library-name-exists": "Názov knižnice už existuje. Prosím, vyberte si pre daný server jedinečný názov."
"library-name-exists": "Názov knižnice už existuje. Prosím, vyberte si pre daný server jedinečný názov.",
"cache-file-find": "Nepodarilo sa nájsť obrázok vo vyrovnávacej pamäti. Znova načítajte a skúste to znova.",
"name-required": "Názov nemôže byť prázdny",
"valid-number": "Musí to byť platné číslo strany",
"duplicate-bookmark": "Duplicitný záznam záložky už existuje",
"reading-list-permission": "Nemáte povolenia na tento zoznam na čítanie alebo zoznam neexistuje",
"reading-list-position": "Nepodarilo sa aktualizovať pozíciu",
"reading-list-updated": "Aktualizované",
"reading-list-item-delete": "Položku(y) sa nepodarilo odstrániť",
"reading-list-deleted": "Zoznam na čítanie bol odstránený",
"generic-reading-list-delete": "Pri odstraňovaní zoznamu na čítanie sa vyskytol problém",
"generic-reading-list-update": "Pri aktualizácii zoznamu na čítanie sa vyskytol problém",
"generic-reading-list-create": "Pri vytváraní zoznamu na čítanie sa vyskytol problém",
"reading-list-doesnt-exist": "Zoznam na čítanie neexistuje",
"series-restricted": "Používateľ nemá prístup k tejto sérii",
"generic-scrobble-hold": "Pri pauznutí funkcie sa vyskytla chyba",
"libraries-restricted": "Používateľ nemá prístup k žiadnym knižniciam",
"no-series": "Nepodarilo sa získať sériu pre knižnicu",
"no-series-collection": "Nepodarilo sa získať sériu pre kolekciu",
"generic-series-delete": "Pri odstraňovaní série sa vyskytol problém",
"generic-series-update": "Pri aktualizácii série sa vyskytla chyba",
"series-updated": "Úspešne aktualizované",
"update-metadata-fail": "Nepodarilo sa aktualizovať metadáta",
"age-restriction-not-applicable": "Bez obmedzenia",
"generic-relationship": "Pri aktualizácii vzťahov sa vyskytol problém",
"job-already-running": "Úloha už beží",
"encode-as-warning": "Nedá sa konvertovať do formátu PNG. Pre obaly použite možnosť Obnoviť obaly. Záložky a favicony sa nedajú spätne zakódovať.",
"ip-address-invalid": "IP adresa „{0}“ je neplatná",
"bookmark-dir-permissions": "Adresár záložiek nemá správne povolenia pre použitie v aplikácii Kavita",
"total-backups": "Celkový počet záloh musí byť medzi 1 a 30",
"total-logs": "Celkový počet protokolov musí byť medzi 1 a 30",
"stats-permission-denied": "Nemáte oprávnenie zobraziť si štatistiky iného používateľa",
"url-not-valid": "URL nevracia platný obrázok alebo vyžaduje autorizáciu",
"url-required": "Na použitie musíte zadať URL adresu",
"generic-cover-series-save": "Obrázok obálky sa nepodarilo uložiť do série",
"generic-cover-collection-save": "Obrázok obálky sa nepodarilo uložiť do kolekcie",
"generic-cover-reading-list-save": "Obrázok obálky sa nepodarilo uložiť do zoznamu na čítanie",
"generic-cover-chapter-save": "Obrázok obálky sa nepodarilo uložiť do kapitoly",
"generic-cover-library-save": "Obrázok obálky sa nepodarilo uložiť do knižnice",
"generic-cover-person-save": "Obrázok obálky sa nepodarilo uložiť k tejto osobe",
"generic-cover-volume-save": "Obrázok obálky sa nepodarilo uložiť do zväzku",
"access-denied": "Nemáte prístup",
"reset-chapter-lock": "Nepodarilo sa resetovať zámok obalu pre kapitolu",
"generic-user-delete": "Používateľa sa nepodarilo odstrániť",
"generic-user-pref": "Pri ukladaní predvolieb sa vyskytol problém",
"opds-disabled": "OPDS nie je na tomto serveri povolený",
"on-deck": "Pokračovať v čítaní",
"browse-on-deck": "Prehliadať pokračovanie v čítaní",
"recently-added": "Nedávno pridané",
"want-to-read": "Chcem čítať",
"browse-want-to-read": "Prehliadať Chcem si prečítať",
"browse-recently-added": "Prehliadať nedávno pridané",
"reading-lists": "Zoznamy na čítanie",
"browse-reading-lists": "Prehliadať podľa zoznamov na čítanie",
"libraries": "Všetky knižnice",
"browse-libraries": "Prehliadať podľa knižníc",
"collections": "Všetky kolekcie",
"browse-collections": "Prehliadať podľa kolekcií",
"more-in-genre": "Viac v žánri {0}",
"browse-more-in-genre": "Prezrite si viac v {0}",
"recently-updated": "Nedávno aktualizované",
"browse-recently-updated": "Prehliadať nedávno aktualizované",
"smart-filters": "Inteligentné filtre",
"external-sources": "Externé zdroje",
"browse-external-sources": "Prehliadať externé zdroje",
"browse-smart-filters": "Prehliadať podľa inteligentných filtrov",
"reading-list-restricted": "Zoznam na čítanie neexistuje alebo k nemu nemáte prístup",
"query-required": "Musíte zadať parameter dopytu",
"search": "Hľadať",
"search-description": "Vyhľadávanie sérií, zbierok alebo zoznamov na čítanie",
"favicon-doesnt-exist": "Favicon neexistuje",
"smart-filter-doesnt-exist": "Inteligentný filter neexistuje",
"smart-filter-already-in-use": "Existuje existujúci stream s týmto inteligentným filtrom",
"dashboard-stream-doesnt-exist": "Stream dashboardu neexistuje",
"sidenav-stream-doesnt-exist": "SideNav Stream neexistuje",
"external-source-already-exists": "Externý zdroj už existuje",
"external-source-required": "Vyžaduje sa kľúč API a Host",
"external-source-doesnt-exist": "Externý zdroj neexistuje",
"external-source-already-in-use": "S týmto externým zdrojom existuje stream",
"sidenav-stream-only-delete-smart-filter": "Z bočného panela SideNav je možné odstrániť iba streamy inteligentných filtrov",
"dashboard-stream-only-delete-smart-filter": "Z ovládacieho panela je možné odstrániť iba streamy inteligentných filtrov",
"smart-filter-name-required": "Názov inteligentného filtra je povinný",
"smart-filter-system-name": "Nemôžete použiť názov streamu poskytnutého systémom",
"not-authenticated": "Používateľ nie je overený",
"unable-to-register-k+": "Licenciu sa nepodarilo zaregistrovať z dôvodu chyby. Kontaktujte podporu Kavita+",
"unable-to-reset-k+": "Licenciu Kavita+ sa nepodarilo resetovať z dôvodu chyby. Kontaktujte podporu Kavita+",
"anilist-cred-expired": "Prihlasovacie údaje AniList vypršali alebo chýbajú",
"scrobble-bad-payload": "Nesprávne údaje od poskytovateľa Scrobblovania",
"theme-doesnt-exist": "Súbor témy chýba alebo je neplatný",
"bad-copy-files-for-download": "Súbory sa nepodarilo skopírovať do dočasného adresára na stiahnutie archívu.",
"generic-create-temp-archive": "Pri vytváraní dočasného archívu sa vyskytla chyba",
"epub-malformed": "Súbor je nesprávne naformátovaný! Nedá sa prečítať.",
"epub-html-missing": "Zodpovedajúci súbor HTML pre túto stránku sa nenašiel",
"collection-tag-title-required": "Názov kolekcie nemôže byť prázdny",
"reading-list-title-required": "Názov zoznamu na čítanie nemôže byť prázdny",
"collection-tag-duplicate": "Kolekcia s týmto názvom už existuje",
"device-duplicate": "Zariadenie s týmto názvom už existuje",
"device-not-created": "Toto zariadenie ešte neexistuje. Najprv ho vytvorte",
"send-to-permission": "Nie je možné odoslať súbory iné ako EPUB alebo PDF na zariadenia, pretože nie sú podporované na Kindle",
"progress-must-exist": "Pokrok musí byť u používateľa k dispozícii",
"reading-list-name-exists": "Zoznam na prečítanie s týmto menom už existuje",
"user-no-access-library-from-series": "Používateľ nemá prístup do knižnice, do ktorej táto séria patrí",
"series-restricted-age-restriction": "Používateľ si nemôže pozrieť túto sériu z dôvodu vekového obmedzenia",
"kavitaplus-restricted": "Toto je obmedzené iba na Kavita+",
"aliases-have-overlap": "Jeden alebo viacero aliasov sa prekrýva s inými osobami, nie je možné ich aktualizovať",
"volume-num": "Zväzok {0}",
"book-num": "Kniha {0}",
"issue-num": "Problém {0}{1}",
"chapter-num": "Kapitola {0}",
"check-updates": "Skontrolovať aktualizácie",
"license-check": "Kontrola licencie",
"process-scrobbling-events": "Udalosti procesu scrobblovania",
"report-stats": "Štatistiky hlásení",
"check-scrobbling-tokens": "Skontrolujte Tokeny Scrobblingu",
"cleanup": "Čistenie",
"process-processed-scrobbling-events": "Spracovať udalosti scrobblovania",
"remove-from-want-to-read": "Upratanie listu Chcem si prečítať",
"scan-libraries": "Skenovanie knižníc",
"kavita+-data-refresh": "Obnovenie údajov Kavita+",
"backup": "Záloha",
"update-yearly-stats": "Aktualizovať ročné štatistiky",
"generated-reading-profile-name": "Vygenerované z {0}"
}

View file

@ -202,5 +202,12 @@
"want-to-read": "படிக்க விரும்புகிறேன்",
"browse-want-to-read": "உலாவு படிக்க விரும்புகிறது",
"browse-recently-added": "உலாவு அண்மைக் காலத்தில் சேர்க்கப்பட்டது",
"reading-lists": "பட்டியல்களைப் படித்தல்"
"reading-lists": "பட்டியல்களைப் படித்தல்",
"sidenav-stream-only-delete-smart-filter": "சைடனாவிலிருந்து அறிவுள்ள வடிகட்டி நீரோடைகளை மட்டுமே நீக்க முடியும்",
"dashboard-stream-only-delete-smart-filter": "டாச்போர்டில் இருந்து அறிவுள்ள வடிகட்டி ச்ட்ரீம்களை மட்டுமே நீக்க முடியும்",
"smart-filter-name-required": "அறிவுள்ள வடிகட்டி பெயர் தேவை",
"smart-filter-system-name": "வழங்கப்பட்ட ச்ட்ரீமின் பெயரை நீங்கள் பயன்படுத்த முடியாது",
"kavitaplus-restricted": "இது கவிதா+ க்கு மட்டுமே",
"aliases-have-overlap": "ஒன்று அல்லது அதற்கு மேற்பட்ட மாற்றுப்பெயர்கள் மற்றவர்களுடன் ஒன்றுடன் ஒன்று உள்ளன, புதுப்பிக்க முடியாது",
"generated-reading-profile-name": "{0 இருந்து இலிருந்து உருவாக்கப்பட்டது"
}

View file

@ -193,7 +193,7 @@
"update-yearly-stats": "更新年度統計",
"invalid-email": "使用者檔案中的電子郵件無效。請查看日誌以獲得任何連結。",
"browse-external-sources": "瀏覽外部來源",
"sidenav-stream-doesnt-exist": "側邊導覽串流不存在",
"sidenav-stream-doesnt-exist": "側邊導覽列的串流不存在",
"smart-filter-already-in-use": "已存在具有此智慧篩選器的串流",
"external-source-already-exists": "外部來源已存在",
"generic-cover-volume-save": "無法保存封面圖片",
@ -201,5 +201,13 @@
"person-doesnt-exist": "此人不存在",
"person-name-required": "名稱為必填欄位,且不得留空",
"person-name-unique": "名稱不得重複",
"person-image-doesnt-exist": "CoversDB 中不存在此人"
"person-image-doesnt-exist": "CoversDB 中不存在此人",
"email-taken": "電子郵件已被使用",
"sidenav-stream-only-delete-smart-filter": "只有智慧篩選器可以從側邊導覽列中刪除",
"dashboard-stream-only-delete-smart-filter": "只有智慧篩選器串流可以從儀表板中刪除",
"smart-filter-name-required": "智慧篩選器名稱名稱不可為空",
"smart-filter-system-name": "您不能使用系統保留的串流名稱",
"kavitaplus-restricted": "此功能僅限 Kavita+ 使用",
"aliases-have-overlap": "一個或多個別名與其他人物重複,無法更新",
"generated-reading-profile-name": "由 {0} 生成"
}

View file

@ -2,6 +2,7 @@ using System.Threading.Tasks;
using API.Data;
using API.DTOs.Koreader;
using API.DTOs.Progress;
using API.Extensions;
using API.Helpers;
using API.Helpers.Builders;
using Kavita.Common;
@ -39,7 +40,7 @@ public class KoreaderService : IKoreaderService
/// <param name="userId"></param>
public async Task SaveProgress(KoreaderBookDto koreaderBookDto, int userId)
{
_logger.LogDebug("Saving Koreader progress for {UserId}: {KoreaderProgress}", userId, koreaderBookDto.Progress);
_logger.LogDebug("Saving Koreader progress for User ({UserId}): {KoreaderProgress}", userId, koreaderBookDto.Progress.Sanitize());
var file = await _unitOfWork.MangaFileRepository.GetByKoreaderHash(koreaderBookDto.Document);
if (file == null) throw new KavitaException(await _localizationService.Translate(userId, "file-missing"));

View file

@ -16,6 +16,7 @@ using API.DTOs.Scrobbling;
using API.DTOs.SeriesDetail;
using API.Entities;
using API.Entities.Enums;
using API.Entities.Interfaces;
using API.Entities.Metadata;
using API.Entities.MetadataMatching;
using API.Entities.Person;
@ -526,6 +527,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (madeMetadataModification)
{
_unitOfWork.SeriesRepository.Update(series);
_unitOfWork.SeriesRepository.Update(series.Metadata);
}
}
catch (Exception ex)
@ -782,7 +784,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (externalCharacters == null || externalCharacters.Count == 0) return false;
if (series.Metadata.CharacterLocked && !settings.HasOverride(MetadataSettingField.People))
if (series.Metadata.CharacterLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.People))
{
return false;
}
@ -849,7 +851,7 @@ public class ExternalMetadataService : IExternalMetadataService
}
}
series.Metadata.AddKPlusOverride(MetadataSettingField.People);
return true;
}
@ -864,7 +866,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (upstreamArtists.Count == 0) return false;
if (series.Metadata.CoverArtistLocked && !settings.HasOverride(MetadataSettingField.People))
if (series.Metadata.CoverArtistLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.People))
{
return false;
}
@ -907,6 +909,7 @@ public class ExternalMetadataService : IExternalMetadataService
await DownloadAndSetPersonCovers(upstreamArtists);
series.Metadata.AddKPlusOverride(MetadataSettingField.People);
return true;
}
@ -920,7 +923,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (upstreamWriters.Count == 0) return false;
if (series.Metadata.WriterLocked && !settings.HasOverride(MetadataSettingField.People))
if (series.Metadata.WriterLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.People))
{
return false;
}
@ -963,7 +966,7 @@ public class ExternalMetadataService : IExternalMetadataService
await _unitOfWork.CommitAsync();
await DownloadAndSetPersonCovers(upstreamWriters);
series.Metadata.AddKPlusOverride(MetadataSettingField.People);
return true;
}
@ -973,7 +976,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (!settings.EnableTags || processedTags.Count == 0) return false;
if (series.Metadata.TagsLocked && !settings.HasOverride(MetadataSettingField.Tags))
if (series.Metadata.TagsLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.Tags))
{
return false;
}
@ -990,6 +993,11 @@ public class ExternalMetadataService : IExternalMetadataService
madeModification = true;
}, () => series.Metadata.TagsLocked = true);
if (madeModification)
{
series.Metadata.AddKPlusOverride(MetadataSettingField.Tags);
}
return madeModification;
}
@ -1014,7 +1022,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (!settings.EnableGenres || processedGenres.Count == 0) return false;
if (series.Metadata.GenresLocked && !settings.HasOverride(MetadataSettingField.Genres))
if (series.Metadata.GenresLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.Genres))
{
return false;
}
@ -1035,6 +1043,12 @@ public class ExternalMetadataService : IExternalMetadataService
{
if (series.Metadata.Genres.FirstOrDefault(g => g.NormalizedTitle == genre.NormalizedTitle) != null) continue;
series.Metadata.Genres.Add(genre);
madeModification = true;
}
if (madeModification)
{
series.Metadata.AddKPlusOverride(MetadataSettingField.Genres);
}
return madeModification;
@ -1044,7 +1058,7 @@ public class ExternalMetadataService : IExternalMetadataService
{
if (!settings.EnablePublicationStatus) return false;
if (series.Metadata.PublicationStatusLocked && !settings.HasOverride(MetadataSettingField.PublicationStatus))
if (series.Metadata.PublicationStatusLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.PublicationStatus))
{
return false;
}
@ -1058,6 +1072,7 @@ public class ExternalMetadataService : IExternalMetadataService
series.Metadata.PublicationStatus = status;
series.Metadata.PublicationStatusLocked = true;
series.Metadata.AddKPlusOverride(MetadataSettingField.PublicationStatus);
return true;
}
catch (Exception ex)
@ -1071,7 +1086,7 @@ public class ExternalMetadataService : IExternalMetadataService
private bool UpdateAgeRating(Series series, MetadataSettingsDto settings, IEnumerable<string> allExternalTags)
{
if (series.Metadata.AgeRatingLocked && !settings.HasOverride(MetadataSettingField.AgeRating))
if (series.Metadata.AgeRatingLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.AgeRating))
{
return false;
}
@ -1087,6 +1102,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (series.Metadata.AgeRating <= ageRating)
{
series.Metadata.AgeRating = ageRating;
series.Metadata.AddKPlusOverride(MetadataSettingField.AgeRating);
return true;
}
}
@ -1127,7 +1143,10 @@ public class ExternalMetadataService : IExternalMetadataService
madeModification = UpdateChapterTitle(chapter, settings, potentialMatch.Title, series.Name) || madeModification;
madeModification = UpdateChapterSummary(chapter, settings, potentialMatch.Summary) || madeModification;
madeModification = UpdateChapterReleaseDate(chapter, settings, potentialMatch.ReleaseDate) || madeModification;
madeModification = await UpdateChapterPublisher(chapter, settings, potentialMatch.Publisher) || madeModification;
var hasUpdatedPublisher = await UpdateChapterPublisher(chapter, settings, potentialMatch.Publisher);
if (hasUpdatedPublisher) chapter.AddKPlusOverride(MetadataSettingField.ChapterPublisher);
madeModification = hasUpdatedPublisher || madeModification;
madeModification = await UpdateChapterPeople(chapter, settings, PersonRole.CoverArtist, potentialMatch.Artists) || madeModification;
madeModification = await UpdateChapterPeople(chapter, settings, PersonRole.Writer, potentialMatch.Writers) || madeModification;
@ -1245,17 +1264,18 @@ public class ExternalMetadataService : IExternalMetadataService
if (string.IsNullOrEmpty(summary)) return false;
if (chapter.SummaryLocked && !settings.HasOverride(MetadataSettingField.ChapterSummary))
if (chapter.SummaryLocked && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterSummary))
{
return false;
}
if (!string.IsNullOrWhiteSpace(summary) && !settings.HasOverride(MetadataSettingField.ChapterSummary))
if (!string.IsNullOrWhiteSpace(summary) && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterSummary))
{
return false;
}
chapter.Summary = StringHelper.RemoveSourceInDescription(StringHelper.SquashBreaklines(summary));
chapter.AddKPlusOverride(MetadataSettingField.ChapterSummary);
return true;
}
@ -1265,17 +1285,18 @@ public class ExternalMetadataService : IExternalMetadataService
if (string.IsNullOrEmpty(title)) return false;
if (chapter.TitleNameLocked && !settings.HasOverride(MetadataSettingField.ChapterTitle))
if (chapter.TitleNameLocked && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterTitle))
{
return false;
}
if (!title.Contains(seriesName) && !settings.HasOverride(MetadataSettingField.ChapterTitle))
if (!title.Contains(seriesName) && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterTitle))
{
return false;
}
chapter.TitleName = title;
chapter.AddKPlusOverride(MetadataSettingField.ChapterTitle);
return true;
}
@ -1285,17 +1306,18 @@ public class ExternalMetadataService : IExternalMetadataService
if (releaseDate == null || releaseDate == DateTime.MinValue) return false;
if (chapter.ReleaseDateLocked && !settings.HasOverride(MetadataSettingField.ChapterReleaseDate))
if (chapter.ReleaseDateLocked && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterReleaseDate))
{
return false;
}
if (!settings.HasOverride(MetadataSettingField.ChapterReleaseDate))
if (!HasForceOverride(settings, chapter, MetadataSettingField.ChapterReleaseDate))
{
return false;
}
chapter.ReleaseDate = releaseDate.Value;
chapter.AddKPlusOverride(MetadataSettingField.ChapterReleaseDate);
return true;
}
@ -1305,12 +1327,12 @@ public class ExternalMetadataService : IExternalMetadataService
if (string.IsNullOrEmpty(publisher)) return false;
if (chapter.PublisherLocked && !settings.HasOverride(MetadataSettingField.ChapterPublisher))
if (chapter.PublisherLocked && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterPublisher))
{
return false;
}
if (!string.IsNullOrWhiteSpace(publisher) && !settings.HasOverride(MetadataSettingField.ChapterPublisher))
if (!string.IsNullOrWhiteSpace(publisher) && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterPublisher))
{
return false;
}
@ -1332,7 +1354,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (string.IsNullOrEmpty(coverUrl)) return false;
if (chapter.CoverImageLocked && !settings.HasOverride(MetadataSettingField.ChapterCovers))
if (chapter.CoverImageLocked && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterCovers))
{
return false;
}
@ -1343,6 +1365,7 @@ public class ExternalMetadataService : IExternalMetadataService
}
await DownloadChapterCovers(chapter, coverUrl);
chapter.AddKPlusOverride(MetadataSettingField.ChapterCovers);
return true;
}
@ -1352,7 +1375,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (staff?.Count == 0) return false;
if (chapter.IsPersonRoleLocked(role) && !settings.HasOverride(MetadataSettingField.People))
if (chapter.IsPersonRoleLocked(role) && !HasForceOverride(settings, chapter, MetadataSettingField.People))
{
return false;
}
@ -1401,7 +1424,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (string.IsNullOrEmpty(externalMetadata.CoverUrl)) return false;
if (series.CoverImageLocked && !settings.HasOverride(MetadataSettingField.Covers))
if (series.CoverImageLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.Covers))
{
return false;
}
@ -1412,8 +1435,7 @@ public class ExternalMetadataService : IExternalMetadataService
}
await DownloadSeriesCovers(series, externalMetadata.CoverUrl);
series.Metadata.AddKPlusOverride(MetadataSettingField.Covers);
return true;
}
@ -1424,17 +1446,18 @@ public class ExternalMetadataService : IExternalMetadataService
if (!externalMetadata.StartDate.HasValue) return false;
if (series.Metadata.ReleaseYearLocked && !settings.HasOverride(MetadataSettingField.StartDate))
if (series.Metadata.ReleaseYearLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.StartDate))
{
return false;
}
if (series.Metadata.ReleaseYear != 0 && !settings.HasOverride(MetadataSettingField.StartDate))
if (series.Metadata.ReleaseYear != 0 && !HasForceOverride(settings, series.Metadata, MetadataSettingField.StartDate))
{
return false;
}
series.Metadata.ReleaseYear = externalMetadata.StartDate.Value.Year;
series.Metadata.AddKPlusOverride(MetadataSettingField.StartDate);
return true;
}
@ -1442,12 +1465,12 @@ public class ExternalMetadataService : IExternalMetadataService
{
if (!settings.EnableLocalizedName) return false;
if (series.LocalizedNameLocked && !settings.HasOverride(MetadataSettingField.LocalizedName))
if (series.LocalizedNameLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.LocalizedName))
{
return false;
}
if (!string.IsNullOrWhiteSpace(series.LocalizedName) && !settings.HasOverride(MetadataSettingField.LocalizedName))
if (!string.IsNullOrWhiteSpace(series.LocalizedName) && !HasForceOverride(settings, series.Metadata, MetadataSettingField.LocalizedName))
{
return false;
}
@ -1473,6 +1496,7 @@ public class ExternalMetadataService : IExternalMetadataService
}
series.Metadata.AddKPlusOverride(MetadataSettingField.LocalizedName);
return true;
}
@ -1482,17 +1506,18 @@ public class ExternalMetadataService : IExternalMetadataService
if (string.IsNullOrEmpty(externalMetadata.Summary)) return false;
if (series.Metadata.SummaryLocked && !settings.HasOverride(MetadataSettingField.Summary))
if (series.Metadata.SummaryLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.Summary))
{
return false;
}
if (!string.IsNullOrWhiteSpace(series.Metadata.Summary) && !settings.HasOverride(MetadataSettingField.Summary))
if (!string.IsNullOrWhiteSpace(series.Metadata.Summary) && !HasForceOverride(settings, series.Metadata, MetadataSettingField.Summary))
{
return false;
}
series.Metadata.Summary = StringHelper.RemoveSourceInDescription(StringHelper.SquashBreaklines(externalMetadata.Summary));
series.Metadata.AddKPlusOverride(MetadataSettingField.Summary);
return true;
}
@ -1511,7 +1536,8 @@ public class ExternalMetadataService : IExternalMetadataService
{
try
{
await _coverDbService.SetSeriesCoverByUrl(series, coverUrl, false, true);
// Only choose the better image if we're overriding a user provided cover
await _coverDbService.SetSeriesCoverByUrl(series, coverUrl, false, !series.Metadata.HasSetKPlusMetadata(MetadataSettingField.Covers));
}
catch (Exception ex)
{
@ -1883,4 +1909,10 @@ public class ExternalMetadataService : IExternalMetadataService
return null;
}
private static bool HasForceOverride(MetadataSettingsDto settings, IHasKPlusMetadata kPlusMetadata,
MetadataSettingField field)
{
return settings.HasOverride(field) || kPlusMetadata.HasSetKPlusMetadata(field);
}
}

View file

@ -53,7 +53,6 @@ public class WantToReadSyncService : IWantToReadSyncService
try
{
// TODO: K+ can technically throw an exception when rate limit occurs or token is dead. We need to handle.
_logger.LogInformation("Syncing want to read for user: {UserName}", user.UserName);
var wantToReadSeries =
await (

View file

@ -11,7 +11,9 @@ using API.DTOs.Person;
using API.DTOs.SeriesDetail;
using API.Entities;
using API.Entities.Enums;
using API.Entities.Interfaces;
using API.Entities.Metadata;
using API.Entities.MetadataMatching;
using API.Entities.Person;
using API.Extensions;
using API.Helpers;
@ -120,23 +122,27 @@ public class SeriesService : ISeriesService
{
series.Metadata.ReleaseYear = updateSeriesMetadataDto.SeriesMetadata.ReleaseYear;
series.Metadata.ReleaseYearLocked = true;
series.Metadata.KPlusOverrides.Remove(MetadataSettingField.StartDate);
}
if (series.Metadata.PublicationStatus != updateSeriesMetadataDto.SeriesMetadata.PublicationStatus)
{
series.Metadata.PublicationStatus = updateSeriesMetadataDto.SeriesMetadata.PublicationStatus;
series.Metadata.PublicationStatusLocked = true;
series.Metadata.KPlusOverrides.Remove(MetadataSettingField.PublicationStatus);
}
if (string.IsNullOrEmpty(updateSeriesMetadataDto.SeriesMetadata.Summary))
{
updateSeriesMetadataDto.SeriesMetadata.Summary = string.Empty;
series.Metadata.KPlusOverrides.Remove(MetadataSettingField.Summary);
}
if (series.Metadata.Summary != updateSeriesMetadataDto.SeriesMetadata.Summary.Trim())
{
series.Metadata.Summary = updateSeriesMetadataDto.SeriesMetadata?.Summary.Trim() ?? string.Empty;
series.Metadata.SummaryLocked = true;
series.Metadata.KPlusOverrides.Remove(MetadataSettingField.Summary);
}
if (series.Metadata.Language != updateSeriesMetadataDto.SeriesMetadata?.Language)
@ -195,6 +201,7 @@ public class SeriesService : ISeriesService
series.Metadata.AgeRating = updateSeriesMetadataDto.SeriesMetadata?.AgeRating ?? AgeRating.Unknown;
series.Metadata.AgeRatingLocked = true;
await _readingListService.UpdateReadingListAgeRatingForSeries(series.Id, series.Metadata.AgeRating);
series.Metadata.KPlusOverrides.Remove(MetadataSettingField.AgeRating);
}
else
{
@ -206,6 +213,7 @@ public class SeriesService : ISeriesService
if (updatedRating > series.Metadata.AgeRating)
{
series.Metadata.AgeRating = updatedRating;
series.Metadata.KPlusOverrides.Remove(MetadataSettingField.AgeRating);
}
}
}
@ -319,6 +327,7 @@ public class SeriesService : ISeriesService
return true;
}
_unitOfWork.SeriesRepository.Update(series.Metadata);
await _unitOfWork.CommitAsync();
// Trigger code to clean up tags, collections, people, etc

View file

@ -128,7 +128,6 @@ public abstract class DefaultParser(IDirectoryService directoryService) : IDefau
info.IsSpecial = true;
info.Chapters = Parser.DefaultChapter;
info.Volumes = Parser.SpecialVolume;
info.Title = !string.IsNullOrEmpty(info.ComicInfo.Title) ? info.ComicInfo.Title : info.Title;
}
// Patch is SeriesSort from ComicInfo

View file

@ -126,13 +126,17 @@ public class ProcessSeries : IProcessSeries
series.Format = firstParsedInfo.Format;
}
var removePrefix = library.RemovePrefixForSortName;
var sortName = removePrefix ? BookSortTitlePrefixHelper.GetSortTitle(series.Name) : series.Name;
if (string.IsNullOrEmpty(series.SortName))
{
series.SortName = series.Name;
series.SortName = sortName;
}
if (!series.SortNameLocked)
{
series.SortName = series.Name;
series.SortName = sortName;
if (!string.IsNullOrEmpty(firstParsedInfo.SeriesSort))
{
series.SortName = firstParsedInfo.SeriesSort;

View file

@ -3,7 +3,7 @@
<TargetFramework>net9.0</TargetFramework>
<Company>kavitareader.com</Company>
<Product>Kavita</Product>
<AssemblyVersion>0.8.6.19</AssemblyVersion>
<AssemblyVersion>0.8.7.1</AssemblyVersion>
<NeutralLanguage>en</NeutralLanguage>
<TieredPGO>true</TieredPGO>
</PropertyGroup>

View file

@ -32,6 +32,7 @@ export interface Library {
allowScrobbling: boolean;
allowMetadataMatching: boolean;
enableMetadata: boolean;
removePrefixForSortName: boolean;
collapseSeriesRelationships: boolean;
libraryFileTypes: Array<FileTypeGroup>;
excludePatterns: Array<string>;

View file

@ -81,10 +81,6 @@ export class SeriesService {
return this.httpClient.post<string>(this.baseUrl + 'series/delete-multiple', {seriesIds}, TextResonse).pipe(map(s => s === "true"));
}
updateRating(seriesId: number, userRating: number) {
return this.httpClient.post(this.baseUrl + 'series/update-rating', {seriesId, userRating});
}
updateSeries(model: any) {
return this.httpClient.post(this.baseUrl + 'series/update', model);
}

View file

@ -78,6 +78,7 @@ export class ExternalRatingComponent implements OnInit {
modalRef.componentInstance.userRating = this.userRating;
modalRef.componentInstance.seriesId = this.seriesId;
modalRef.componentInstance.hasUserRated = this.hasUserRated;
modalRef.componentInstance.chapterId = this.chapterId;
modalRef.closed.subscribe((updated: {hasUserRated: boolean, userRating: number}) => {
this.userRating = updated.userRating;

View file

@ -5,6 +5,7 @@ import {Breakpoint} from "../../../shared/_services/utility.service";
import {NgxStarsModule} from "ngx-stars";
import {ThemeService} from "../../../_services/theme.service";
import {SeriesService} from "../../../_services/series.service";
import {ReviewService} from "../../../_services/review.service";
@Component({
selector: 'app-rating-modal',
@ -20,7 +21,7 @@ export class RatingModalComponent {
protected readonly modal = inject(NgbActiveModal);
protected readonly themeService = inject(ThemeService);
protected readonly seriesService = inject(SeriesService);
protected readonly reviewService = inject(ReviewService);
protected readonly cdRef = inject(ChangeDetectorRef);
protected readonly Breakpoint = Breakpoint;
@ -28,14 +29,16 @@ export class RatingModalComponent {
@Input({required: true}) userRating!: number;
@Input({required: true}) seriesId!: number;
@Input({required: true}) hasUserRated!: boolean;
@Input() chapterId: number | undefined;
starColor = this.themeService.getCssVariable('--rating-star-color');
updateRating(rating: number) {
this.seriesService.updateRating(this.seriesId, rating).subscribe(() => {
this.reviewService.updateRating(this.seriesId, rating, this.chapterId).subscribe(() => {
this.userRating = rating;
this.hasUserRated = true;
this.cdRef.markForCheck();
this.close();
});
}

View file

@ -190,7 +190,7 @@ export class FilterUtilitiesService {
switch (type) {
case 'series':
return [
FilterField.SeriesName, FilterField.Summary, FilterField.Path, FilterField.FilePath, PersonFilterField.Name
FilterField.SeriesName, FilterField.Summary, FilterField.Path, FilterField.FilePath
] as unknown as T[];
case 'person':
return [

View file

@ -127,6 +127,16 @@
</app-setting-item>
</div>
<div class="row g-0 mt-4 mb-4">
<app-setting-switch [title]="t('remove-prefix-for-sortname-label')" [subtitle]="t('remove-prefix-for-sortname-tooltip')">
<ng-template #switch>
<div class="form-check form-switch float-end">
<input type="checkbox" id="remove-prefix-for-sortname" role="switch" formControlName="removePrefixForSortName" class="form-check-input">
</div>
</ng-template>
</app-setting-switch>
</div>
<div class="row g-0 mt-4 mb-4">
<app-setting-switch [title]="t('enable-metadata-label')" [subtitle]="t('enable-metadata-tooltip')">
<ng-template #switch>

View file

@ -115,6 +115,7 @@ export class LibrarySettingsModalComponent implements OnInit {
allowMetadataMatching: new FormControl<boolean>(true, { nonNullable: true, validators: [] }),
collapseSeriesRelationships: new FormControl<boolean>(false, { nonNullable: true, validators: [] }),
enableMetadata: new FormControl<boolean>(true, { nonNullable: true, validators: [] }), // required validator doesn't check value, just if true
removePrefixForSortName: new FormControl<boolean>(false, { nonNullable: true, validators: [] }),
});
selectedFolders: string[] = [];
@ -273,7 +274,8 @@ export class LibrarySettingsModalComponent implements OnInit {
this.libraryForm.get('allowScrobbling')?.setValue(this.IsKavitaPlusEligible ? this.library.allowScrobbling : false);
this.libraryForm.get('allowMetadataMatching')?.setValue(this.IsMetadataDownloadEligible ? this.library.allowMetadataMatching : false);
this.libraryForm.get('excludePatterns')?.setValue(this.excludePatterns ? this.library.excludePatterns : false);
this.libraryForm.get('enableMetadata')?.setValue(this.library.enableMetadata, true);
this.libraryForm.get('enableMetadata')?.setValue(this.library.enableMetadata);
this.libraryForm.get('removePrefixForSortName')?.setValue(this.library.removePrefixForSortName);
this.selectedFolders = this.library.folders;
this.madeChanges = false;

View file

@ -50,7 +50,9 @@
"generate-scrobble-events": "Zpětné plnění Události",
"token-expired": "Platnost vašeho tokenu AniListu vypršela! Události Scrobbling nebudou zpracovány, dokud je neobnovíte na stránce Účty.",
"not-read-warning": "Upstream poskytovatelé si vždy ponechají nejvyšší počet",
"scrobbling-disabled": "Skroblování je v nastavení účtu zakázáno."
"scrobbling-disabled": "Skroblování je v nastavení účtu zakázáno.",
"select-all-label": "Vybrat vše",
"delete-selected-label": "Odstranit vybrané"
},
"scrobble-event-type-pipe": {
"chapter-read": "Pokrok ve čtení",
@ -854,7 +856,9 @@
"file-type-group-tooltip": "Jaké typy souborů by měla Kavita vyhledávat. Například Archiv bude zahrnovat všechny soubory cb*, zip, rar atd.",
"exclude-patterns-tooltip": "Konfigurace sady vzorů (syntaxe Glob), které bude Kavita při skenování adresářů porovnávat a vylučovat z výsledků skeneru.",
"allow-metadata-matching-label": "Povolit přiřazování metadat",
"allow-metadata-matching-tooltip": "Měla by Kavita stáhnout metadata pro série v rámci této knihovny. K tomu dojde pouze v případě, že má server aktivní předplatné Kavita+."
"allow-metadata-matching-tooltip": "Měla by Kavita stáhnout metadata pro série v rámci této knihovny. K tomu dojde pouze v případě, že má server aktivní předplatné Kavita+.",
"enable-metadata-label": "Povolit metadata (ComicInfo/Epub/PDF)",
"enable-metadata-tooltip": "Povolit Kavitě číst soubory metadat, které přepisují analýzu názvů souborů."
},
"reader-settings": {
"font-family-label": "{{manage-reading-profiles.font-family-label}}",
@ -2436,7 +2440,8 @@
"confirm-delete-multiple-volumes": "Jste si jisti, že chcete odstranit {{count}} svazků? Soubory na disku se tím nezmění.",
"series-added-want-to-read": "Série přidána ze seznamu Chci číst",
"series-bound-to-reading-profile": "Série vázaná na čtenářský profil {{name}}",
"library-bound-to-reading-profile": "Knihovna vázaná na čtenářský profil {{name}}"
"library-bound-to-reading-profile": "Knihovna vázaná na čtenářský profil {{name}}",
"external-match-rate-error": "Kavita vyčerpala limit pro vyhledávání {{seriesName}}. Zkuste to znovu za 5 minut."
},
"preferences": {
"split-right-to-left": "Rozdělit zprava doleva",

View file

@ -50,7 +50,9 @@
"special": "{{entity-title.special}}",
"token-expired": "Ihr AniList-Token ist abgelaufen! Scrobbling-Ereignisse werden nicht verarbeitet, bis Sie auf der Seite Konten erneuert haben.",
"generate-scrobble-events": "Backfill Ereignisse",
"scrobbling-disabled": "Scrobbeln ist in deinen Kontoeinstellungen deaktiviert."
"scrobbling-disabled": "Scrobbeln ist in deinen Kontoeinstellungen deaktiviert.",
"select-all-label": "Alles auswählen",
"delete-selected-label": "Markiertes löschen"
},
"scrobble-event-type-pipe": {
"chapter-read": "Lesefortschritt",
@ -83,7 +85,7 @@
},
"user-preferences": {
"title": "Benutzer Dashboard",
"pref-description": "Dies sind globale Einstellungen, die an Ihr Konto gebunden sind.",
"pref-description": "Dies sind globale Einstellungen, die mit Ihrem Konto verknüpft sind. Die Reader-Einstellungen befinden sich in den Leseprofilen.",
"account-tab": "{{tabs.account-tab}}",
"preferences-tab": "{{tabs.preferences-tab}}",
"theme-tab": "{{tabs.theme-tab}}",
@ -803,7 +805,8 @@
"more": "Mehr",
"customize": "{{settings.customize}}",
"edit": "{{common.edit}}",
"cancel-edit": "Schließen Neu ordnen"
"cancel-edit": "Schließen Neu ordnen",
"browse-people": "Personen suchen"
},
"library-settings-modal": {
"close": "{{common.close}}",
@ -856,7 +859,9 @@
"exclude-patterns-tooltip": "Konfigurieren Sie eine Reihe von Mustern (Glob-Syntax), die Kavita beim Scannen von Verzeichnissen abgleichen und von den Ergebnissen des Scanners ausschließen soll.",
"help": "{{common.help}}",
"allow-metadata-matching-tooltip": "Sollte Kavita Metadaten für Serien in dieser Bibliothek herunterladen. Dies geschieht nur, wenn der Server über ein aktives Kavita+-Abonnement verfügt.",
"allow-metadata-matching-label": "Erlaube Metadatenabgleich"
"allow-metadata-matching-label": "Erlaube Metadatenabgleich",
"enable-metadata-label": "Metadaten aktivieren (ComicInfo/Epub/PDF)",
"enable-metadata-tooltip": "Erlauben Sie Kavita, Metadaten-Dateien zu lesen, die Dateinamenanalyse überschreiben."
},
"file-type-group-pipe": {
"archive": "Archive",
@ -870,24 +875,24 @@
"margin-label": "{{manage-reading-profiles.margin-book-label}}",
"reset-to-defaults": "Auf Standardwerte zurücksetzen",
"reader-settings-title": "Reader-Einstellungen",
"reading-direction-label": "{{user-preferences.reading-direction-book-label}}",
"reading-direction-label": "{{manage-reading-profiles.reading-direction-book-label}}",
"right-to-left": "Von rechts nach links",
"left-to-right": "Von links nach rechts",
"horizontal": "Horizontal",
"vertical": "Vertikal",
"writing-style-label": "{{user-preferences.writing-style-label}}",
"writing-style-label": "{{manage-reading-profiles.writing-style-label}}",
"writing-style-tooltip": "Ändert die Richtung des Textes. Horizontal ist von links nach rechts, vertikal von oben nach unten.",
"tap-to-paginate-label": "Paginierung antippen",
"tap-to-paginate-tooltip": "Klicken Sie auf die Ränder des Bildschirms, um zu paginieren",
"on": "An",
"off": "Aus",
"immersive-mode-label": "{{user-preferences.immersive-mode-label}}",
"immersive-mode-label": "{{manage-reading-profiles.immersive-mode-label}}",
"immersive-mode-tooltip": "Dadurch wird das Menü nach einem Klick auf das Reader-Dokument ausgeblendet und das Tippen zum Paginieren eingeschaltet",
"fullscreen-label": "Vollbild",
"fullscreen-tooltip": "Reader in den Vollbildmodus versetzen",
"exit": "Beenden",
"enter": "Enter",
"layout-mode-label": "{{user-preferences.layout-mode-book-label}}",
"layout-mode-label": "{{manage-reading-profiles.layout-mode-book-label}}",
"layout-mode-tooltip": "Blättern: Spiegelt die epub-Datei (in der Regel eine lange Bildlaufseite pro Kapitel).<br/>1 Spalte: Erzeugt jeweils eine einzelne virtuelle Seite.<br/>2 Spalten: Erstellt zwei virtuelle Seiten gleichzeitig, die nebeneinander angeordnet sind.",
"layout-mode-option-scroll": "Scrollen",
"layout-mode-option-1col": "1 Reihe",
@ -1471,7 +1476,9 @@
"all-filters": "Intelligente Filter",
"nav-link-header": "Navigation Optionen",
"close": "{{common.close}}",
"person-aka-status": "Entspricht einem Alias"
"person-aka-status": "Entspricht einem Alias",
"browse-genres": "Genres durchsuchen",
"browse-tags": "Tags durchsuchen"
},
"promoted-icon": {
"promoted": "{{common.promoted}}"
@ -1673,7 +1680,10 @@
"release-year": "Jahr der Veröffentlichung",
"read-progress": "Zuletzt gelesen",
"average-rating": "Durchschnittliche Bewertung",
"random": "Zufällig"
"random": "Zufällig",
"person-series-count": "Anzahl der Serien",
"person-name": "Name",
"person-chapter-count": "Anzahl der Kapitel"
},
"edit-series-modal": {
"title": "{{seriesName}} Einzelheiten",
@ -2029,8 +2039,7 @@
"collections": "{{side-nav.collections}}",
"reading-lists": "{{side-nav.reading-lists}}",
"bookmarks": "{{side-nav.bookmarks}}",
"all-series": "{{side-nav.all-series}}",
"browse-authors": "{{side-nav.browse-authors}}"
"all-series": "{{side-nav.all-series}}"
},
"filter-field-pipe": {
"age-rating": "{{metadata-fields.age-rating-title}}",
@ -2208,7 +2217,8 @@
"confirm-delete-multiple-volumes": "Sind sie sicher, dass Sie {{count}} Bände löschen wollen? Die Dateien auf der Festplatte werden dadurch nicht verändert.",
"series-bound-to-reading-profile": "Serie gebunden an Leseprofil {{name}}",
"library-bound-to-reading-profile": "Bibliothek, verknüpft mit Leseprofil {{name}}",
"series-added-want-to-read": "Serie aus der Liste „Möchte lesen“ hinzugefügt"
"series-added-want-to-read": "Serie aus der Liste „Möchte lesen“ hinzugefügt",
"external-match-rate-error": "Die Rate für die Suche nach {{seriesName}} ist abgelaufen. Versuch's in 5 Minuten nochmal."
},
"read-time-pipe": {
"less-than-hour": "<1 Stunde",
@ -2409,7 +2419,8 @@
"volume-nums": "Bände",
"author-count": "{{num}} Autoren",
"no-data": "Keine Daten",
"chapter-count": "{{num}} Kapitel"
"chapter-count": "{{num}} Kapitel",
"issue-count": "{{num}} Probleme"
},
"confirm": {
"alert": "Alarm",
@ -2528,7 +2539,9 @@
"actions-header": "Aktionen",
"match-alt": "Entspricht {{seriesName}}",
"dont-match-status-label": "{{dont-match-label}}",
"no-data": "{{common.no-data}}"
"no-data": "{{common.no-data}}",
"matched-state-label": "Match-Status",
"library-type": "Bibliotheksart"
},
"manage-user-tokens": {
"description": "Die Token von Benutzern, die Scrobbeln verwenden, müssen gelegentlich erneuert werden. Kavita sendet ihnen automatisch eine E-Mail, wenn eine E-Mail-Adresse eingerichtet ist und sie eine gültige E-Mail-Adresse haben.",
@ -2633,7 +2646,7 @@
},
"manage-reading-profiles": {
"description": "Nicht alle Ihre Serien können auf dieselbe Weise gelesen werden. Richten Sie daher für jede Bibliothek oder Serie separate Leseprofile ein, damit Sie so nahtlos wie möglich zu Ihrer Serie zurückkehren können.",
"extra-tip": "Weisen Sie Leseprofile über das Aktionsmenü in Serien und Bibliotheken oder in großen Mengen zu. Wenn Sie die Einstellungen in einem Reader ändern, wird ein verstecktes Profil erstellt, das Ihre Auswahl für diese Serie speichert (nicht für PDFs). Dieses Profil wird entfernt, wenn Sie der Serie eines Ihrer eigenen Leseprofile zuweisen oder aktualisieren.",
"extra-tip": "Lese-Profile kannst du über das Aktionsmenü in Serien und Bibliotheken oder für mehrere gleichzeitig festlegen. Wenn du die Einstellungen in einem Reader änderst, wird ein verstecktes Profil erstellt, das deine Auswahl für diese Serie speichert (nicht für PDFs). Dieses Profil wird gelöscht, wenn du der Serie eines deiner eigenen Lese-Profile zuweist. Mehr Infos findest du auf der",
"tap-to-paginate-tooltip": "Sollten die Seiten des E-Book-Reader-Bildschirms durch Antippen umblätterbar sein vorherige/nächste Seite",
"show-screen-hints-tooltip": "Zeige eine Überlagerung an, um den Bereich und die Richtung der Paginierung besser zu verstehen",
"font-size-book-tooltip": "Prozentuale Skalierung für die Schriftart im Buch",
@ -2694,7 +2707,10 @@
"pdf-theme-label": "Theme",
"pdf-theme-tooltip": "Farbschema des Readers",
"reading-profile-series-settings-title": "Serie",
"reading-profile-library-settings-title": "Bibliothek"
"reading-profile-library-settings-title": "Bibliothek",
"wiki-title": "Wiki",
"disable-width-override-label": "Breitenüberschreibung deaktivieren",
"disable-width-override-tooltip": "Verhindere, dass die Breitenüberschreibung wirksam wird, wenn dein Bildschirm mindestens den konfigurierten Haltepunkt erreicht oder kleiner ist"
},
"bulk-set-reading-profile-modal": {
"no-data": "Es wurden noch keine Sammlungen erstellt",
@ -2706,5 +2722,57 @@
"known-for-title": "Bekannt für",
"src": "Person zusammenführen",
"merge-warning": "Wenn Sie fortfahren, wird die ausgewählte Person entfernt. Der Name der ausgewählten Person wird als Alias hinzugefügt und alle ihre Rollen werden übertragen."
},
"browse-people": {
"title": "Personen suchen",
"author-count": "{{num}} Personen",
"roles-label": "Rollen",
"sort-label": "Sortieren",
"name-label": "Name",
"issue-count-label": "Anzahl der Ausgabe",
"series-count-label": "Anzahl der Serien"
},
"browse-genres": {
"title": "Genres durchsuchen",
"genre-count": "{{num}} Genres"
},
"breakpoint-pipe": {
"never": "Niemals",
"tablet": "Tablet",
"desktop": "Desktop",
"mobile": "Mobil"
},
"browse-title-pipe": {
"user-rating": "{{value}} Sternebewertung",
"tag": "Hat Tag {{value}}",
"translator": "Übersetzt von {{value}}",
"character": "Hat den Charakter {{value}}",
"inker": "Inked von {{value}}",
"penciller": "Gezeichnet von {{value}}",
"writer": "Verfasst von {{value}}",
"genre": "Hat Genre {{value}}",
"library": "Innerhalb der Bibliothek {{value}}",
"publisher": "Veröffentlicht von {{value}}",
"editor": "Von {{value}} bearbeitet",
"artist": "Gezeichnet von {{value}}",
"letterer": "Letter von {{value}}",
"colorist": "Gefärbt durch {{value}}",
"format": "Format von {{value}}",
"release-year": "Veröffentlicht in {{value}}",
"imprint": "Imprint von {{value}}",
"location": "An {{value}} Standorten",
"team": "Team {{value}}",
"publication-status": "{{value}} Werke",
"age-rating": "Bewertet mit {{value}}"
},
"browse-tags": {
"title": "Tags durchsuchen",
"genre-count": "{{num}} Tags"
},
"generic-filter-field-pipe": {
"person-name": "Name",
"person-series-count": "Anzahl der Serien",
"person-chapter-count": "Kapitelanzahl",
"person-role": "Rolle"
}
}

View file

@ -1131,6 +1131,8 @@
"include-in-search-tooltip": "Should series and any derived information (genres, people, files) from the library be included in search results.",
"enable-metadata-label": "Enable Metadata (ComicInfo/Epub/PDF)",
"enable-metadata-tooltip": "Allow Kavita to read metadata files which override filename parsing.",
"remove-prefix-for-sortname-label": "Remove common prefixes for Sort Name",
"remove-prefix-for-sortname-tooltip": "Kavita will remove common prefixes like 'The', 'A', 'An' from titles for sort name. Does not override set metadata.",
"force-scan": "Force Scan",
"force-scan-tooltip": "This will force a scan on the library, treating like a fresh scan",
"reset": "{{common.reset}}",

View file

@ -50,7 +50,9 @@
"special": "{{entity-title.special}}",
"token-expired": "Votre jeton AniList a expiré! Les événements de scrobbling ne seront pas pris en compte tant que vous n'aurez pas renouvelé votre compte sur la page Comptes.",
"scrobbling-disabled": "Le suivi de lecture est désactivé dans les paramètres de votre compte.",
"generate-scrobble-events": "Rattraper les Événements"
"generate-scrobble-events": "Rattraper les Événements",
"select-all-label": "Sélectionner tout",
"delete-selected-label": "Supprimer la sélection"
},
"scrobble-event-type-pipe": {
"chapter-read": "Progression de la lecture",
@ -83,7 +85,7 @@
},
"user-preferences": {
"title": "Tableau de bord Utilisateur",
"pref-description": "Voici les paramètres globaux liés à votre compte.",
"pref-description": "Voici les paramètres globaux liés à votre compte. Les paramètres du lecteur se trouvent dans les profils de lecture.",
"account-tab": "{{tabs.account-tab}}",
"preferences-tab": "{{tabs.preferences-tab}}",
"theme-tab": "{{tabs.theme-tab}}",
@ -629,7 +631,10 @@
"incognito-mode-label": "Navigation privée",
"next": "Suivant",
"previous": "Précédent",
"go-to-page-prompt": "Il y a {{totalPages}} pages. À quelle page voulez-vous aller ?"
"go-to-page-prompt": "Il y a {{totalPages}} pages. À quelle page voulez-vous aller ?",
"go-to-first-page": "Aller à la première page",
"go-to-section": "Aller à la section",
"go-to-section-prompt": "Il y a {{totalSections}} sections au total. Dans quelle section voulez-vous aller?"
},
"personal-table-of-contents": {
"no-data": "Rien n'a encore été mis en marque-page",
@ -655,7 +660,7 @@
"success": "Succès !"
},
"confirm-reset-password": {
"title": "Réinitialisation du mot de passe",
"title": "Réinitialiser le mot de passe",
"description": "Saisir un nouveau mot de passe",
"password-label": "{{common.password}}",
"required-field": "{{validation.required-field}}",
@ -677,7 +682,7 @@
"series-detail": {
"page-settings-title": "Paramètres des pages",
"close": "{{common.close}}",
"layout-mode-label": "{{user-preferences.layout-mode-book-label}}",
"layout-mode-label": "{{manage-reading-profiles.layout-mode-book-label}}",
"layout-mode-option-card": "Carte",
"layout-mode-option-list": "Liste",
"continue-from": "Continuer {{title}}",
@ -728,7 +733,7 @@
"more-alt": "Plus",
"time-left-alt": "Temps restant",
"time-to-read-alt": "{{sort-field-pipe.time-to-read}}",
"scrobbling-tooltip": "{{settings.scrobbling}}: {{value}}",
"scrobbling-tooltip": "{{settings.scrobbling}} : {{value}}",
"publication-status-title": "Publication",
"publication-status-tooltip": "État de la publication",
"on": "{{reader-settings.on}}",
@ -764,7 +769,8 @@
"entry-label": "Voir les détails",
"kavita-tooltip": "Votre évaluation + évaluation globale",
"kavita-rating-title": "Votre évaluation",
"close": "{{common.close}}"
"close": "{{common.close}}",
"critic": "{{review-card.critic}}"
},
"badge-expander": {
"more-items": "et {{count}} de plus"
@ -800,7 +806,8 @@
"more": "Plus",
"customize": "{{settings.customize}}",
"edit": "{{common.edit}}",
"cancel-edit": "Fermer la réorganisation"
"cancel-edit": "Fermer la réorganisation",
"browse-people": "Parcourir les personnes"
},
"library-settings-modal": {
"close": "{{common.close}}",
@ -853,7 +860,9 @@
"exclude-patterns-tooltip": "Configurez un ensemble de modèles (syntaxe Global) que Kavita fera correspondre lors du scan des répertoires et exclura des résultats du scanner.",
"help": "{{common.help}}",
"allow-metadata-matching-label": "Permettre la correspondance des métadonnées",
"allow-metadata-matching-tooltip": "Kavita doit-il télécharger les métadonnées des séries de cette bibliothèque? Cela ne se produira que si le serveur dispose d'un abonnement actif à Kavita+."
"allow-metadata-matching-tooltip": "Kavita doit-il télécharger les métadonnées des séries de cette bibliothèque? Cela ne se produira que si le serveur dispose d'un abonnement actif à Kavita+.",
"enable-metadata-label": "Activer les métadonnées (ComicInfo/Epub/PDF)",
"enable-metadata-tooltip": "Permet à Kavita de lire les fichiers de métadonnées. Ceux-ci remplacent l'analyse des noms de fichiers."
},
"file-type-group-pipe": {
"archive": "Archive",
@ -863,30 +872,30 @@
},
"reader-settings": {
"general-settings-title": "Réglages généraux",
"font-family-label": "{{user-preferences.font-family-label}}",
"font-size-label": "{{user-preferences.font-size-book-label}}",
"line-spacing-label": "{{user-preferences.line-height-book-label}}",
"margin-label": "{{user-preferences.margin-book-label}}",
"font-family-label": "{{manage-reading-profiles.font-family-label}}",
"font-size-label": "{{manage-reading-profiles.font-size-book-label}}",
"line-spacing-label": "{{manage-reading-profiles.line-height-book-label}}",
"margin-label": "{{manage-reading-profiles.margin-book-label}}",
"reset-to-defaults": "Réinitialiser les paramètres par défaut",
"reader-settings-title": "Paramètres de lecture",
"reading-direction-label": "{{user-preferences.reading-direction-book-label}}",
"reading-direction-label": "{{manage-reading-profiles.reading-direction-book-label}}",
"right-to-left": "De droite à gauche",
"left-to-right": "De gauche à droite",
"horizontal": "Horizontal",
"vertical": "Vertical",
"writing-style-label": "{{user-preferences.writing-style-label}}",
"writing-style-label": "{{manage-reading-profiles.writing-style-label}}",
"writing-style-tooltip": "Change la direction du texte. L'horizontale est de gauche à droite, la verticale de haut en bas.",
"tap-to-paginate-label": "Appuyez sur Pagination",
"tap-to-paginate-tooltip": "Cliquez sur les bords de l'écran pour paginer",
"on": "Activé",
"off": "Désactivé",
"immersive-mode-label": "{{user-preferences.immersive-mode-label}}",
"immersive-mode-label": "{{manage-reading-profiles.immersive-mode-label}}",
"immersive-mode-tooltip": "Cela masquera le menu après un clic sur le document en lecture et activera le toucher pour lister les pages",
"fullscreen-label": "Plein écran",
"fullscreen-tooltip": "Mettre le lecteur en plein écran",
"exit": "Sortir",
"enter": "Entrer",
"layout-mode-label": "{{user-preferences.layout-mode-book-label}}",
"layout-mode-label": "{{manage-reading-profiles.layout-mode-book-label}}",
"layout-mode-tooltip": "Défilement: met en miroir le fichier epub (généralement une longue page défilante par chapitre).<br/>1 colonne: crée une seule page virtuelle à la fois.<br/>2 colonnes: crée deux pages virtuelles à la fois disposées côte à côte.",
"layout-mode-option-scroll": "Faire défiler",
"layout-mode-option-1col": "1 Colonne",
@ -895,7 +904,15 @@
"theme-dark": "Sombre",
"theme-black": "Noir",
"theme-white": "Blanc",
"theme-paper": "Papier"
"theme-paper": "Papier",
"update-parent": "Enregistrer dans {{name}}",
"loading": "chargement",
"create-new": "Nouveau profil à partir d'un profil implicite",
"create-new-tooltip": "Créez un nouveau profil gérable à partir de votre profil implicite actuel",
"reading-profile-updated": "Profil de lecture mis à jour",
"reading-profile-promoted": "Profil de lecture promu",
"line-spacing-min-label": "1x",
"line-spacing-max-label": "2.5x"
},
"table-of-contents": {
"no-data": "Ce livre n'a pas de table des matières définie dans les métadonnées ou dans un fichier toc"
@ -1336,7 +1353,8 @@
"admin-email-history": "Historique des e-mails",
"admin-matched-metadata": "Métadonnées correspondantes",
"admin-manage-tokens": "Gérer les jetons utilisateur",
"admin-metadata": "Gérer les métadonnées"
"admin-metadata": "Gérer les métadonnées",
"reading-profiles": "Profils de lecture"
},
"collection-detail": {
"no-data": "Il n'y a pas d'éléments. Essayez d'ajouter une série.",
@ -1460,7 +1478,10 @@
"logout": "Déconnexion",
"all-filters": "Filtres intelligents",
"nav-link-header": "Options de navigation",
"close": "{{common.close}}"
"close": "{{common.close}}",
"person-aka-status": "Correspond à un alias",
"browse-genres": "Parcourir les genres",
"browse-tags": "Parcourir les étiquettes"
},
"promoted-icon": {
"promoted": "{{common.promoted}}"
@ -1592,9 +1613,9 @@
"height": "Hauteur",
"width": "Largeur",
"width-override-label": "Remplacement de la largeur",
"off": "Désactivé",
"off": "{{reader-settings.off}}",
"original": "Original",
"auto-close-menu-label": "{{user-preferences.auto-close-menu-label}}",
"auto-close-menu-label": "{{manage-reading-profiles.auto-close-menu-label}}",
"swipe-enabled-label": "Balayage activé",
"enable-comic-book-label": "Imiter le comportement de la bande dessinée",
"brightness-label": "Luminosité",
@ -1606,7 +1627,13 @@
"no-next-chapter": "Pas de prochain chapitre",
"no-prev-chapter": "Pas de chapitre précédent",
"emulate-comic-book-label": "{{manage-reading-profiles.emulate-comic-book-label}}",
"series-progress": "Progression de la série : {{percentage}}"
"series-progress": "Progression de la série : {{percentage}}",
"update-parent": "{{reader-settings.update-parent}}",
"loading": "{{reader-settings.loading}}",
"create-new": "{{reader-settings.create-new}}",
"create-new-tooltip": "{{reader-settings.create-new-tooltip}}",
"reading-profile-updated": "Profil de lecture mis à jour",
"reading-profile-promoted": "Profil de lecture promu"
},
"metadata-filter": {
"filter-title": "{{common.filter}}",
@ -1663,7 +1690,10 @@
"release-year": "Année de sortie",
"read-progress": "Dernière lecture",
"average-rating": "Note moyenne",
"random": "Aléatoire"
"random": "Aléatoire",
"person-name": "Nom",
"person-series-count": "Nombre de séries",
"person-chapter-count": "Nombre de chapitres"
},
"edit-series-modal": {
"title": "{{seriesName}} Détails",
@ -1800,8 +1830,8 @@
"cover-image-tab": "{{tabs.cover-tab}}",
"tasks-tab": "{{tabs.tasks-tab}}",
"info-tab": "{{tabs.info-tab}}",
"pages-label": "{{edit-chapter-modal.pages-count}}",
"words-label": "{{edit-chapter-modal.length-title}}",
"pages-label": "{{edit-chapter-modal.pages-label}}",
"words-label": "{{edit-chapter-modal.words-label}}",
"pages-count": "{{edit-chapter-modal.pages-count}}",
"words-count": "{{edit-chapter-modal.words-count}}",
"reading-time-label": "{{edit-chapter-modal.reading-time-label}}",
@ -2022,7 +2052,7 @@
"reading-lists": "{{side-nav.reading-lists}}",
"bookmarks": "{{side-nav.bookmarks}}",
"all-series": "{{side-nav.all-series}}",
"browse-authors": "{{side-nav.browse-authors}}"
"browse-authors": "{{side-nav.browse-people}}"
},
"filter-field-pipe": {
"age-rating": "{{metadata-fields.age-rating-title}}",
@ -2141,7 +2171,7 @@
"load-prev-chapter": "Précédent(e) {{entity}} chargé(e)",
"account-registration-complete": "Enregistrement du compte terminé",
"account-migration-complete": "Migration des comptes terminée",
"password-reset": "Réinitialisation du mot de passe",
"password-reset": "Réinitialiser le mot de passe",
"password-updated": "Le mot de passe a été mis à jour",
"forced-scan-queued": "Une recherche forcée a été lancée pour {{name}}",
"library-created": "Bibliothèque créée avec succès. Un scan a été lancé.",
@ -2196,7 +2226,12 @@
"bulk-delete-libraries": "Êtes vous sûr de vouloir supprimer {{count}} bibliothèque(s)?",
"webtoon-override": "Passage en mode Webtoon en raison d'images représentant un webtoon.",
"match-success": "Séries avec la bonne correspondance",
"scrobble-gen-init": "Mise en attente d'une tâche pour générer des événements de scrobble à partir de l'historique de lecture et des évaluations, en les synchronisant avec les services connectés."
"scrobble-gen-init": "Mise en attente d'une tâche pour générer des événements de scrobble à partir de l'historique de lecture et des évaluations, en les synchronisant avec les services connectés.",
"series-added-want-to-read": "Série ajoutée à la liste \"A lire\"",
"confirm-delete-multiple-volumes": "Êtes-vous sûr de vouloir supprimer les {{count}} volumes? Cela ne modifiera pas les fichiers sur le disque.",
"series-bound-to-reading-profile": "Série liée au Profil de lecture {{nom}}",
"library-bound-to-reading-profile": "Bibliothèque liée au Profil de lecture {{nom}}",
"external-match-rate-error": "Kavita a pris trop de temps en cherchant {{seriesName}}. Réessayez dans 5 minutes."
},
"read-time-pipe": {
"less-than-hour": "<1 Heure",
@ -2269,7 +2304,16 @@
"copy-settings": "Copier les paramètres depuis",
"match-tooltip": "Associer les séries manuellement avec Kavita+",
"match": "Correspondance",
"reorder": "Réorganiser"
"reorder": "Réorganiser",
"reading-profiles": "Profils de lecture",
"set-reading-profile": "Définir le profil de lecture",
"set-reading-profile-tooltip": "Lier un profil de lecture à cette bibliothèque",
"clear-reading-profile": "Effacer le Profil de lecture",
"clear-reading-profile-tooltip": "Efface le Profil de lecture pour cette bibliothèque",
"cleared-profile": "Profil de lecture effacé",
"rename": "Renommer",
"rename-tooltip": "Renommer le filtre intelligent",
"merge": "Fusionner"
},
"preferences": {
"left-to-right": "De gauche à droite",
@ -2388,14 +2432,16 @@
"volume-nums": "Volumes",
"author-count": "{{num}} Auteurs",
"chapter-count": "{{num}} chapitres",
"no-data": "Aucune donnée"
"no-data": "Aucune donnée",
"issue-count": "{{num}} Numéros"
},
"confirm": {
"alert": "Alerte",
"confirm": "Confirmer",
"ok": "Ok",
"cancel": "{{common.cancel}}",
"info": "Info"
"info": "Info",
"prompt": "Question"
},
"person-detail": {
"all-roles": "Roles",
@ -2403,7 +2449,9 @@
"known-for-title": "Connu pour",
"individual-role-title": "En tant que {{role}}",
"browse-person-title": "Toutes les œuvres de {{name}}",
"anilist-url": "{{edit-person-modal.anilist-tooltip}}"
"anilist-url": "{{edit-person-modal.anilist-tooltip}}",
"aka-title": "Également connu sous le nom de ",
"no-info": "Aucune information sur cette personne"
},
"edit-person-modal": {
"save": "{{common.save}}",
@ -2426,7 +2474,11 @@
"required-field": "{{validations.required-field}}",
"cover-image-description": "{{edit-series-modal.cover-image-description}}",
"cover-image-description-extra": "Vous pouvez également télécharger une couverture à partir de CoversDB, si elle est disponible.",
"download-coversdb": "Télécharger à partir de CoversDB"
"download-coversdb": "Télécharger à partir de CoversDB",
"aliases-tab": "Alias",
"aliases-label": "Modifier les alias",
"alias-overlap": "Cet alias pointe déjà vers une autre personne ou est le nom de cette personne, envisagez de les fusionner.",
"aliases-tooltip": "Lorsqu'une série est étiquetée avec l'alias d'une personne, cette personne est attribuée plutôt que d'en créer une nouvelle. Lorsque vous supprimez un alias, vous devez rescanner la série pour que la modification soit prise en compte."
},
"changelog-update-item": {
"added": "Ajouté",
@ -2447,7 +2499,7 @@
"description": "Sélectionnez une correspondance pour recâbler les métadonnées de Kavita+ et régénérer les événements de scrobbling. L'option Ne pas faire correspondre peut être utilisée pour empêcher Kavita de faire correspondre les métadonnées et le scrobbler.",
"close": "{{common.close}}",
"save": "{{common.save}}",
"query-tooltip": "Entrez le nom de la série, l'URL AniList/MyAnimeList. Les URL utiliseront une recherche directe.",
"query-tooltip": "Entrez le nom de la série, l'URL AniList/MyAnimeList/ComicBookRoundup. Les URL utiliseront une recherche directe.",
"dont-match-tooltip": "Exclure cette série de la correspondance et du scrobbling",
"dont-match-label": "Ne pas correspondre",
"search": "Recherche",
@ -2492,7 +2544,9 @@
"library-name-header": "Bibliothèque",
"match-alt": "Correspondance {{seriesName}}",
"actions-header": "Actions",
"dont-match-status-label": "{{dont-match-label}}"
"dont-match-status-label": "{{dont-match-label}}",
"library-type": "Type de bibliothèque",
"matched-state-label": "État de correspondance"
},
"manage-metadata-settings": {
"enable-relations-label": "Relations",
@ -2538,14 +2592,21 @@
"enable-chapter-title-label": "Titre",
"enable-chapter-release-date-label": "Date de diffusion",
"enable-chapter-summary-tooltip": "{{manage-metadata-settings.summary-tooltip}}",
"enable-chapter-summary-label": "{{manage-metadata-settings.summary-label}}"
"enable-chapter-summary-label": "{{manage-metadata-settings.summary-label}}",
"enable-chapter-release-date-tooltip": "Permettre la saisie de la date de publication d'un chapitre ou d'un numéro",
"enable-chapter-publisher-label": "Éditeur",
"enable-chapter-publisher-tooltip": "Permettre la saisie de l'éditeur des chapitres ou des numéros",
"enable-chapter-cover-label": "Couverture du chapitre",
"chapter-header": "Champs du chapitre",
"enable-chapter-cover-tooltip": "Permettre de définir la couverture d'un chapitre ou d'un numéro"
},
"match-series-result-item": {
"chapter-count": "{{common.chapter-count}}",
"updating-metadata-status": "Mise à jour des métadonnées",
"volume-count": "{{server-stats.volume-count}}",
"releasing": "Sorties",
"details": "Voir la page"
"details": "Voir la page",
"issue-count": "{{common.issue-count}}"
},
"metadata-setting-field-pipe": {
"age-rating": "{{metadata-fields.age-rating-title}}",
@ -2556,7 +2617,12 @@
"summary": "{{filter-field-pipe.summary}}",
"publication-status": "{{edit-series-modal.publication-status-title}}",
"tags": "{{metadata-fields.tags-title}}",
"localized-name": "{{edit-series-modal.localized-name-label}}"
"localized-name": "{{edit-series-modal.localized-name-label}}",
"chapter-release-date": "Date de publication (Chapitre)",
"chapter-summary": "Résumé (Chapitre)",
"chapter-covers": "Couvertures (Chapitre)",
"chapter-publisher": "{{person-role-pipe.publisher}} (Chapitre)",
"chapter-title": "Titre (Chapitre)"
},
"email-history": {
"not-sent-tooltip": "Non envoyé",
@ -2597,5 +2663,155 @@
"review-label": "Avis",
"title": "Editer Avis",
"min-length": "L'avis doit faire au moins {{count}} caractères"
},
"browse-people": {
"title": "Parcourir les personnes",
"author-count": "{{num}} Personnes",
"cover-image-description": "{{edit-series-modal.cover-image-description}}",
"issue-count": "{{common.issue-count}}",
"series-count": "{{common.series-count}}",
"roles-label": "Rôles",
"sort-label": "Trier",
"name-label": "Nom",
"issue-count-label": "Nombre de numéros",
"series-count-label": "Nombre de séries"
},
"browse-genres": {
"title": "Parcourir les genres",
"genre-count": "{{num}} Genres",
"issue-count": "{{common.issue-count}}",
"series-count": "{{common.series-count}}"
},
"browse-tags": {
"title": "Parcourir les étiquettes",
"genre-count": "{{num}} Etiquettes",
"issue-count": "{{common.issue-count}}",
"series-count": "{{common.series-count}}"
},
"bulk-set-reading-profile-modal": {
"title": "Définir le profil de lecture",
"close": "{{common.close}}",
"filter-label": "{{common.filter}}",
"clear": "{{common.clear}}",
"no-data": "Aucune collection n'a encore été créée",
"loading": "{{common.loading}}",
"create": "{{common.create}}",
"bound": "Liaison"
},
"merge-person-modal": {
"title": "{{personName}}",
"close": "{{common.close}}",
"save": "{{common.save}}",
"src": "Fusionner une personne",
"merge-warning": "Si vous poursuivez, la personne sélectionnée sera supprimée. Le nom de la personne sélectionnée sera ajouté en tant qu'alias et tous ses rôles seront transférés.",
"alias-title": "Nouveaux alias",
"known-for-title": "Connu pour"
},
"browse-title-pipe": {
"publication-status": "{{value}} travaux",
"age-rating": "Noté {{value}}",
"user-rating": "{{value}} classement par étoiles",
"tag": "Étiquette {{value}}",
"translator": "Traduit par {{value}}",
"character": "Possède le caractère {{value}}",
"publisher": "Publié par {{value}}",
"editor": "Edité par {{value}}",
"artist": "Dessiné par {{value}}",
"letterer": "Lettré par {{value}}",
"colorist": "Coloré par {{value}}",
"inker": "Encré par {{value}}",
"penciller": "Crayonné par {{value}}",
"writer": "Ecrit par {{value}}",
"genre": "Genre {{value}}",
"library": "Au sein de la bibliothèque {{value}}",
"format": "Format de {{value}}",
"release-year": "Publié en {{value}}",
"imprint": "Empreinte de {{value}}",
"team": "Équipe {{value}}",
"location": "Localisation {{value}}"
},
"generic-filter-field-pipe": {
"person-role": "Rôle",
"person-name": "Nom",
"person-series-count": "Nombre de séries",
"person-chapter-count": "Nombre de chapitres"
},
"breakpoint-pipe": {
"never": "Jamais",
"mobile": "Mobile",
"tablet": "Tablette",
"desktop": "Bureau"
},
"manage-reading-profiles": {
"description": "Toutes vos séries ne peuvent pas être lues de la même manière, établissez des profils de lecture distincts par bibliothèque ou par série pour vous permettre de vous replonger dans vos séries aussi facilement que possible.",
"extra-tip": "Attribuez des profils de lecture via le menu d'action sur les séries et les bibliothèques, ou en vrac. Lorsque vous modifiez les paramètres d'une liseuse, un profil caché est créé pour mémoriser vos choix pour cette série (pas pour les pdf). Ce profil est supprimé lorsque vous attribuez l'un de vos propres profils de lecture à la série. Pour plus d'informations, consultez la page",
"profiles-title": "Vos profils de lecture",
"default-profile": "Défaut",
"add-tooltip": "Votre nouveau profil sera sauvegardé après avoir été modifié",
"make-default": "Défini comme valeur par défaut",
"no-selected": "Aucun profil sélectionné",
"confirm": "Êtes-vous sûr de vouloir supprimer le profil de lecture {{name}}?",
"selection-tip": "Sélectionnez un profil dans la liste ou créez-en un nouveau en haut à droite",
"image-reader-settings-title": "Lecteur d'images",
"reading-direction-label": "Sens de lecture",
"reading-direction-tooltip": "Sens dans lequel il faut cliquer pour passer à la page suivante. De droite à gauche signifie que vous cliquez sur le côté gauche de l'écran pour passer à la page suivante.",
"scaling-option-label": "Options de mise à l'échelle",
"scaling-option-tooltip": "Comment adapter l'image à votre écran.",
"page-splitting-label": "Fractionnement des pages",
"page-splitting-tooltip": "Comment diviser une image en pleine largeur (signifie que les images de gauche et de droite sont combinées)",
"reading-mode-label": "Mode lecture",
"reading-mode-tooltip": "Modifier le lecteur pour qu'il soit paginé verticalement, horizontalement ou qu'il ait un défilement infini",
"layout-mode-label": "Mode de présentation",
"layout-mode-tooltip": "Rendre une seule image à l'écran ou deux images côte à côte",
"background-color-label": "Couleur de fond",
"background-color-tooltip": "Couleur d'arrière-plan du lecteur d'images",
"auto-close-menu-label": "Menu de fermeture automatique",
"auto-close-menu-tooltip": "Le menu doit-il se fermer automatiquement",
"show-screen-hints-label": "Afficher les conseils à l'écran",
"show-screen-hints-tooltip": "Afficher une superposition pour aider à comprendre la zone et le sens de pagination",
"emulate-comic-book-label": "S'inspirer de la bande dessinée",
"emulate-comic-book-tooltip": "Applique un effet d'ombre pour imiter la lecture d'un livre",
"add": "{{common.add}}",
"wiki-title": "wiki",
"swipe-to-paginate-label": "Balayer pour paginer",
"swipe-to-paginate-tooltip": "Le balayage de l'écran doit-il déclencher l'affichage de la page suivante ou précédente",
"allow-auto-webtoon-reader-label": "Mode de lecture automatique des webtoons",
"allow-auto-webtoon-reader-tooltip": "Passez en mode \"Webtoon Reader\" si les pages ressemblent à un webtoon. Des faux positifs peuvent se produire.",
"width-override-label": "{{manga-reader.width-override-label}}",
"width-override-tooltip": "Remplacer la largeur des images dans le lecteur",
"disable-width-override-label": "Désactiver la surcharge de la largeur",
"reset": "{{common.reset}}",
"disable-width-override-tooltip": "Empêcher la surcharge de la largeur de prendre effet lorsque l'écran est plus petit ou égal au point de rupture configuré",
"book-reader-settings-title": "Lecteur de livres",
"tap-to-paginate-label": "Tapez pour paginer",
"tap-to-paginate-tooltip": "Les côtés de l'écran du lecteur de livres devraient-ils permettre d'appuyer dessus pour passer à la page précédente/suivante",
"immersive-mode-label": "Mode immersif",
"immersive-mode-tooltip": "Cela permet de masquer le menu derrière un clic sur le document de lecture et d'activer la fonction de pagination",
"reading-direction-book-label": "Sens de lecture",
"reading-direction-book-tooltip": "Sens dans lequel cliquer pour passer à la page suivante. De droite à gauche signifie que vous cliquez sur le côté gauche de l'écran pour passer à la page suivante.",
"font-family-label": "Famille de polices",
"font-family-tooltip": "Famille de polices à charger. Défaut chargera la police par défaut du livre",
"writing-style-label": "Style d'écriture",
"writing-style-tooltip": "Change la direction du texte. L'horizontale va de gauche à droite, la verticale va de haut en bas.",
"layout-mode-book-label": "Mode de présentation",
"layout-mode-book-tooltip": "Comment le contenu doit être présenté. Le défilement correspond à l'emballage du livre. 1 ou 2 colonnes s'adapte à la hauteur de l'appareil et contient 1 ou 2 colonnes de texte par page",
"color-theme-book-label": "Thème de couleur",
"color-theme-book-tooltip": "Quel thème de couleur appliquer au contenu et au menu du lecteur de livres",
"font-size-book-label": "Taille de la police",
"font-size-book-tooltip": "Pourcentage de l'échelle à appliquer à la police dans le livre",
"line-height-book-label": "Espacement des lignes",
"line-height-book-tooltip": "Quel est l'espacement entre les lignes du livre",
"margin-book-label": "Marge",
"margin-book-tooltip": "L'espacement de chaque côté de l'écran. Ce paramètre est remplacé par 0 sur les appareils mobiles, quel que soit ce paramètre.",
"pdf-reader-settings-title": "Lecteur PDF",
"pdf-scroll-mode-label": "Mode défilement",
"pdf-scroll-mode-tooltip": "Mode de défilement des pages. Vertical/Horizontal et Taper pour paginer (pas de défilement)",
"pdf-spread-mode-label": "Mode d'expansion",
"pdf-spread-mode-tooltip": "Comment les pages doivent être mises en page. Simple ou double (paire/impaire)",
"pdf-theme-label": "Thème",
"pdf-theme-tooltip": "Couleur du thème du lecteur",
"reading-profile-series-settings-title": "Série",
"reading-profile-library-settings-title": "Bibliothèque",
"delete": "{{common.delete}}"
}
}

View file

@ -50,7 +50,9 @@
"special": "{{entity-title.special}}",
"generate-scrobble-events": "Imeachtaí Aislíonta",
"token-expired": "Tá do chomhartha AniList imithe in éag! Ní phróiseálfar imeachtaí scrobála go dtí go ndéanfaidh tú athnuachan ar leathanach na gCuntas.",
"scrobbling-disabled": "Tá scrobbling díchumasaithe ar do Shocruithe Cuntais."
"scrobbling-disabled": "Tá scrobbling díchumasaithe ar do Shocruithe Cuntais.",
"select-all-label": "Roghnaigh gach rud",
"delete-selected-label": "Scrios na roghanna"
},
"scrobble-event-type-pipe": {
"chapter-read": "Dul Chun Cinn léitheoireachta",
@ -858,7 +860,9 @@
"exclude-patterns-tooltip": "Cumraigh sraith patrúin (comhréir Glob) a mheaitseálann Kavita nuair a scanadh eolairí agus eisiamh ó thorthaí Scanóir.",
"help": "{{common.help}}",
"allow-metadata-matching-tooltip": "Ar cheart do Kavita meiteashonraí a íoslódáil do Shraith laistigh den Leabharlann seo. Ní tharlóidh sé seo ach amháin má tá Síntiús gníomhach Kavita+ ag an bhfreastalaí.",
"allow-metadata-matching-label": "Ceadaigh Meaitseáil Meiteashonraí"
"allow-metadata-matching-label": "Ceadaigh Meaitseáil Meiteashonraí",
"enable-metadata-tooltip": "Lig do Kavita comhaid meiteashonraí a léamh a sháraíonn parsáil ainm comhaid.",
"enable-metadata-label": "Cumasaigh Meiteashonraí (ComicInfo/Epub/PDF)"
},
"file-type-group-pipe": {
"archive": "Cartlann",
@ -2226,7 +2230,8 @@
"confirm-delete-multiple-volumes": "An bhfuil tú cinnte gur mian leat {{count}} imleabhar a scriosadh? Ní athróidh sé comhaid ar an diosca.",
"series-added-want-to-read": "Sraith curtha leis ón liosta Ar Mhaith Leat Léamh",
"series-bound-to-reading-profile": "Sraith atá ceangailte le Próifíl Léitheoireachta {{name}}",
"library-bound-to-reading-profile": "Leabharlann ceangailte le Próifíl Léitheoireachta {{name}}"
"library-bound-to-reading-profile": "Leabharlann ceangailte le Próifíl Léitheoireachta {{name}}",
"external-match-rate-error": "Rith Kavita as an ráta ag cuardach {{seriesName}}. Déan iarracht arís i gceann 5 nóiméad."
},
"read-time-pipe": {
"less-than-hour": "<1 Uair",

View file

@ -5,10 +5,10 @@
"password": "{{common.password}}",
"password-validation": "{{validation.password-validation}}",
"forgot-password": "Elfelejtett jelszó?",
"submit": "{{common.submit}}"
"submit": "{{common.submit}}Bejelentkezés"
},
"dashboard": {
"no-libraries": "Még nincs könyvtár beálltva. Állíts be egyet a",
"no-libraries": "Még nincs könyvtár beálltva. \nÁllíts be egyet a",
"server-settings-link": "Szerver beállítások",
"not-granted": "Nincs hozzáférésed semmilyen könyvtárhoz.",
"on-deck-title": "A fedélzeten",
@ -37,7 +37,7 @@
"series-header": "Sorozat",
"data-header": "Adat",
"is-processed-header": "Feldolgozva",
"no-data": "Nincs adat",
"no-data": "Nincs adat{{common.no-data}}",
"volume-and-chapter-num": "Kötet {{v}} Fejezet {{n}}",
"volume-num": "Kötet {{num}}",
"chapter-num": "Fejezet {{num}}",
@ -48,7 +48,9 @@
"special": "{{entity-title.special}}",
"scrobbling-disabled": "A scrobbling ki van kapcsolva a Fiók beállításaidban.",
"description": "Itt található minden a fiókodhoz tartozó srobble esemény. Ahhoz, hogy az események létrejöjjenek, be kell állítanod egy scrobble szolgáltatót. A feldolgozott események egy hónap után törlődnek. Ha vannak fel nem dolgozott események, azok adatait valószínűleg nem sikerült egyeztetni a feltöltés során. Ilyen esetben vedd fel a kapcsolatot az adminoddal, hogy javításra kerüljenek.",
"token-expired": "Az AniList tokened lejárt! A scrobble események nem kerülnek feldolgozásra, amíg a Fiókok oldalon nem frissíted."
"token-expired": "Az AniList tokened lejárt! A scrobble események nem kerülnek feldolgozásra, amíg a Fiókok oldalon nem frissíted.",
"select-all-label": "Összes kijelölése",
"delete-selected-label": "Kijelölt(ek) törlése"
},
"scrobble-event-type-pipe": {
"chapter-read": "Olvasás folyamata",
@ -107,10 +109,16 @@
"success-toast": "Felhasználó beállításai frissítve",
"locale-label": "Nyelv",
"anilist-scrobbling-label": "AniList Scrobbling",
"want-to-read-sync-label": "Olvasási várólista szinkronizálás"
"want-to-read-sync-label": "Olvasási várólista szinkronizálás",
"clients-opds-url-label": "OPDS URL",
"clients-api-key-label": "API Kulcs",
"share-series-reviews-label": "Sorozatértékelés megosztása"
},
"user-holds": {
"no-data": "{{typeahead.no-data}}"
"no-data": "{{typeahead.no-data}}",
"series-name-header": "{{manage-matched-metadata.series-name-header}}",
"created-header": "{{manage-media-issues.created-header}}",
"delete-label": "{{common.remove}}"
},
"theme-manager": {
"download": "{{changelog.download}}",
@ -118,20 +126,40 @@
"delete": "{{common.delete}}",
"drag-n-drop": "{{cover-image-chooser.drag-n-drop}}",
"upload": "{{cover-image-chooser.upload}}",
"add": "{{common.add}}"
"add": "{{common.add}}",
"title": "Téma menedzser",
"set-default": "Alapértelmezett",
"updated-toastr": "A webhely alapértelmezett beállításai {{name}}-re frissültek",
"active-theme": "Aktív",
"upload-continued": "css fájl",
"site-themes": "Webhelytémák",
"downloaded": "Letöltött",
"applied": "Alkalmaz",
"preview-title": "Előnézet",
"default-theme": "Alapértelmezett",
"downloadable": "Letölthető"
},
"restriction-selector": {
"age-rating-label": "{{metadata-fields.age-rating-title}}"
"age-rating-label": "{{metadata-fields.age-rating-title}}",
"title": "Korhatár besorolás",
"not-applicable-for-admins": "Ez nem vonatkozik az adminokra.",
"no-restriction": "Nincs korlátozás"
},
"site-theme-provider-pipe": {
"custom": "{{device-platform-pipe.custom}}"
"custom": "{{device-platform-pipe.custom}}",
"system": "Rendszer"
},
"manage-devices": {
"add": "{{common.add}}",
"delete": "{{common.delete}}",
"edit": "{{common.edit}}",
"no-data": "{{typeahead.no-data}}",
"actions-header": "{{manage-users.actions-header}}"
"actions-header": "{{manage-users.actions-header}}",
"title": "Eszközkezelő",
"devices-title": "Eszközök",
"email-label": "Email",
"name-label": "Név",
"no-devices": "Még nincsenek beállítva eszközök"
},
"edit-device-modal": {
"device-name-label": "{{manage-devices.name-label}}",
@ -149,7 +177,12 @@
"edit": "{{common.edit}}",
"cancel": "{{common.cancel}}",
"save": "{{common.save}}",
"required-field": "{{validation.required-field}}"
"required-field": "{{validation.required-field}}",
"new-password-label": "Új jelszó",
"current-password-label": "Jelenlegi jelszó",
"confirm-password-label": "Jelszó megerősítése",
"passwords-must-match": "A jelszavaknak egyeznie kell",
"permission-error": "Nincs jogosultsága a jelszó megváltoztatására. Forduljon a szerver adminisztrátorához."
},
"change-email": {
"required-field": "{{validation.required-field}}",
@ -157,7 +190,13 @@
"reset": "{{common.reset}}",
"edit": "{{common.edit}}",
"cancel": "{{common.cancel}}",
"save": "{{common.save}}"
"save": "{{common.save}}",
"current-password-label": "Jelenlegi jelszó",
"email-not-confirmed": "Ez az e-mail nincs megerősítve",
"email-confirmed": "Ezt az e-mailt megerősítették",
"setup-user-account": "Felhasználói fiók beállítása",
"email-label": "Új e-mail",
"email-updated-title": "E-mail frissítve"
},
"change-age-restriction": {
"reset": "{{common.reset}}",
@ -750,5 +789,11 @@
"min-length": "A kritika minimum {{count}} karakter hosszúságú kell legyen",
"delete": "{{common.delete}}",
"required": "{{validation.required-field}}"
},
"theme": {
"theme-dark": "Sötét",
"theme-black": "Fekete",
"theme-paper": "Papír",
"theme-white": "Fehér"
}
}

View file

@ -50,7 +50,9 @@
"special": "{{entity-title.special}}",
"scrobbling-disabled": "계정 설정에서 스크로블링이 비활성화되어 있습니다.",
"generate-scrobble-events": "채우기 이벤트",
"token-expired": "AniList 토큰이 만료되었습니다! 계정 페이지에서 갱신하기 전까지는 Scrobbling 이벤트가 처리되지 않습니다."
"token-expired": "AniList 토큰이 만료되었습니다! 계정 페이지에서 갱신하기 전까지는 Scrobbling 이벤트가 처리되지 않습니다.",
"select-all-label": "모두 선택",
"delete-selected-label": "선택 취소"
},
"scrobble-event-type-pipe": {
"chapter-read": "읽기 진행률",
@ -83,7 +85,7 @@
},
"user-preferences": {
"title": "사용자 대시보드",
"pref-description": "계정에 연결된 전역 설정입니다.",
"pref-description": "계정에 연결된 전역 설정입니다. 리더 설정은 읽기 프로필에 있습니다.",
"account-tab": "{{tabs.account-tab}}",
"preferences-tab": "{{tabs.preferences-tab}}",
"theme-tab": "{{tabs.theme-tab}}",
@ -611,7 +613,7 @@
"page-label": "페이지",
"pagination-header": "섹션",
"go-to-page": "페이지로 이동",
"go-to-last-page": "마지막 페이지로 이동",
"go-to-last-page": "마지막 페이지로",
"prev-page": "이전 페이지",
"next-page": "다음 페이지",
"prev-chapter": "이전 챕터/볼륨",
@ -629,7 +631,10 @@
"incognito-mode-label": "시크릿 모드",
"next": "다음",
"previous": "이전",
"go-to-page-prompt": "{{totalPages}} 페이지가 있습니다. 어떤 페이지로 이동하시겠습니까?"
"go-to-page-prompt": "{{totalPages}} 페이지가 있습니다. 어떤 페이지로 이동하시겠습니까?",
"go-to-first-page": "첫 페이지로",
"go-to-section": "섹션으로 이동",
"go-to-section-prompt": "{{totalSections}} 섹션이 있습니다. 어떤 섹션으로 이동하시겠습니까?"
},
"personal-table-of-contents": {
"no-data": "아직 북마크된 항목 없음",
@ -677,7 +682,7 @@
"series-detail": {
"page-settings-title": "페이지 설정",
"close": "{{common.close}}",
"layout-mode-label": "{{user-preferences.layout-mode-book-label}}",
"layout-mode-label": "{{manage-reading-profiles.layout-mode-book-label}}",
"layout-mode-option-card": "카드",
"layout-mode-option-list": "리스트",
"continue-from": "계속읽기 {{title}}",
@ -801,7 +806,8 @@
"more": "더 보기",
"customize": "{{settings.customize}}",
"edit": "{{common.edit}}",
"cancel-edit": "재정렬 닫기"
"cancel-edit": "재정렬 닫기",
"browse-people": "사용자 탐색"
},
"library-settings-modal": {
"close": "{{common.close}}",
@ -854,7 +860,8 @@
"exclude-patterns-tooltip": "디렉터리를 스캔할 때 Kavita가 일치시킬 패턴 집합(Glob 구문)을 구성하고, 스캐너 결과에서 제외할 수 있도록 설정하세요.",
"help": "{{common.help}}",
"allow-metadata-matching-tooltip": "Kavita가 이 라이브러리 내의 시리즈에 대한 메타데이터를 다운로드해야 합니까? 이는 서버에 활성 Kavita+ 구독이 있는 경우에만 발생합니다.",
"allow-metadata-matching-label": "메타데이터 일치 허용"
"allow-metadata-matching-label": "메타데이터 일치 허용",
"enable-metadata-label": "메타데이터 활성화 (ComicInfo/Epub/PDF)"
},
"file-type-group-pipe": {
"archive": "아카이브",
@ -864,30 +871,30 @@
},
"reader-settings": {
"general-settings-title": "일반 설정",
"font-family-label": "{{user-preferences.font-family-label}}",
"font-size-label": "{{user-preferences.font-size-book-label}}",
"line-spacing-label": "{{user-preferences.line-height-book-label}}",
"margin-label": "{{user-preferences.margin-book-label}}",
"font-family-label": "{{manage-reading-profiles.font-family-label}}",
"font-size-label": "{{manage-reading-profiles.font-size-book-label}}",
"line-spacing-label": "{{manage-reading-profiles.line-height-book-label}}",
"margin-label": "{{manage-reading-profiles.margin-book-label}}",
"reset-to-defaults": "기본값으로 재설정",
"reader-settings-title": "리더 설정",
"reading-direction-label": "{{user-preferences.reading-direction-book-label}}",
"reading-direction-label": "{{manage-reading-profiles.reading-direction-book-label}}",
"right-to-left": "오른쪽에서 왼쪽",
"left-to-right": "왼쪽에서 오른쪽",
"horizontal": "가로",
"vertical": "세로",
"writing-style-label": "{{user-preferences.writing-style-label}}",
"writing-style-label": "{{manage-reading-profiles.writing-style-label}}",
"writing-style-tooltip": "텍스트의 방향을 변경합니다. 가로는 왼쪽에서 오른쪽으로, 세로는 위에서 아래로.",
"tap-to-paginate-label": "탭 해서 페이지 넘김",
"tap-to-paginate-tooltip": "화면 가장자리를 클릭하여 페이지를 넘김",
"on": "켜기",
"off": "끄기",
"immersive-mode-label": "{{user-preferences.immersive-mode-label}}",
"immersive-mode-label": "{{manage-reading-profiles.immersive-mode-label}}",
"immersive-mode-tooltip": "이렇게 하면 리더 문서를 클릭하면 메뉴가 숨겨지고 탭하여 페이지 넘김이 켜집니다",
"fullscreen-label": "전체 화면",
"fullscreen-tooltip": "리더를 전체 화면 모드로 전환",
"exit": "끄기",
"enter": "켜기",
"layout-mode-label": "{{user-preferences.layout-mode-book-label}}",
"layout-mode-label": "{{manage-reading-profiles.layout-mode-book-label}}",
"layout-mode-tooltip": "스크롤: epub 파일을 미러링합니다(일반적으로 장당 하나의 긴 스크롤 페이지).<br/>1열: 한 번에 하나의 가상 페이지를 생성합니다.<br/>2열: 한 번에 두 개의 가상 페이지를 나란히 생성합니다.",
"layout-mode-option-scroll": "스크롤",
"layout-mode-option-1col": "1열",
@ -896,7 +903,10 @@
"theme-dark": "다크",
"theme-black": "블랙",
"theme-white": "화이트",
"theme-paper": "종이"
"theme-paper": "종이",
"update-parent": "{{name}}(으)로 저장",
"line-spacing-min-label": "1x",
"line-spacing-max-label": "2.5x"
},
"table-of-contents": {
"no-data": "이 책에는 메타데이터 또는 toc 파일에 설정된 목차가 없습니다"
@ -1593,9 +1603,9 @@
"height": "높이",
"width": "너비",
"width-override-label": "너비 재지정",
"off": "끄기",
"off": "{{reader-settings.off}}",
"original": "원본",
"auto-close-menu-label": "{{user-preferences.auto-close-menu-label}}",
"auto-close-menu-label": "{{manage-reading-profiles.auto-close-menu-label}}",
"swipe-enabled-label": "스와이프 사용",
"enable-comic-book-label": "만화책 에뮬레이션",
"brightness-label": "밝기",
@ -1606,8 +1616,12 @@
"layout-mode-switched": "이중 레이아웃을 렌더링할 공간이 부족하여 레이아웃 모드가 단일로 전환됨",
"no-next-chapter": "다음 챕터 없음",
"no-prev-chapter": "이전 챕터 없음",
"emulate-comic-book-label": "{{user-preferences.emulate-comic-book-label}}",
"series-progress": "시리즈 진행률: {{percentage}}"
"emulate-comic-book-label": "{{manage-reading-profiles.emulate-comic-book-label}}",
"series-progress": "시리즈 진행률: {{percentage}}",
"create-new": "{{reader-settings.create-new}}",
"update-parent": "{{reader-settings.update-parent}}",
"loading": "{{reader-settings.loading}}",
"create-new-tooltip": "{{reader-settings.create-new-tooltip}}"
},
"metadata-filter": {
"filter-title": "{{common.filter}}",
@ -1664,7 +1678,8 @@
"release-year": "출시 연도",
"read-progress": "마지막으로 읽음",
"average-rating": "평균 평점",
"random": "랜덤"
"random": "랜덤",
"person-name": "이름"
},
"edit-series-modal": {
"title": "{{seriesName}} 세부정보",
@ -1801,8 +1816,8 @@
"cover-image-tab": "{{tabs.cover-tab}}",
"tasks-tab": "{{tabs.tasks-tab}}",
"info-tab": "{{tabs.info-tab}}",
"pages-label": "{{edit-chapter-modal.pages-count}}",
"words-label": "{{edit-chapter-modal.length-title}}",
"pages-label": "{{edit-chapter-modal.pages-label}}",
"words-label": "{{edit-chapter-modal.words-label}}",
"pages-count": "{{edit-chapter-modal.pages-count}}",
"words-count": "{{edit-chapter-modal.words-count}}",
"reading-time-label": "{{edit-chapter-modal.reading-time-label}}",
@ -2023,7 +2038,7 @@
"reading-lists": "{{side-nav.reading-lists}}",
"bookmarks": "{{side-nav.bookmarks}}",
"all-series": "{{side-nav.all-series}}",
"browse-authors": "{{side-nav.browse-authors}}"
"browse-authors": "{{side-nav.browse-people}}"
},
"filter-field-pipe": {
"age-rating": "{{metadata-fields.age-rating-title}}",
@ -2198,7 +2213,8 @@
"webtoon-override": "웹툰을 나타내는 이미지가 있어 웹툰 모드로 전환합니다.",
"match-success": "시리즈가 올바르게 일치함",
"confirm-delete-multiple-volumes": "{{count}}개의 볼륨을 삭제하시겠습니까? 디스크의 파일은 수정되지 않습니다.",
"scrobble-gen-init": "과거 열람 이력 및 평가를 추적하는 이벤트를 생성하여 연결된 서비스와 동기화하는 기능을 작업 예정 목록에 추가하였습니다."
"scrobble-gen-init": "과거 열람 이력 및 평가를 추적하는 이벤트를 생성하여 연결된 서비스와 동기화하는 기능을 작업 예정 목록에 추가하였습니다.",
"series-added-want-to-read": "읽고 싶어요 목록에 추가된 시리즈"
},
"read-time-pipe": {
"less-than-hour": "<1시간",
@ -2273,7 +2289,10 @@
"match-tooltip": "Kavita+에서 시리즈를 수동으로 일치시키기",
"reorder": "정렬 변경",
"rename": "이름 변경",
"rename-tooltip": "스마트 필터 이름 변경"
"rename-tooltip": "스마트 필터 이름 변경",
"reading-profiles": "읽기 프로필",
"set-reading-profile": "읽기 프로필 설정",
"merge": "병합"
},
"preferences": {
"left-to-right": "왼쪽에서 오른쪽",
@ -2407,7 +2426,8 @@
"browse-person-title": "{{name}}의 모든 작품",
"all-roles": "역할",
"browse-person-by-role-title": "{{role}}로서의 {{name}}의 모든 작품",
"anilist-url": "{{edit-person-modal.anilist-tooltip}}"
"anilist-url": "{{edit-person-modal.anilist-tooltip}}",
"no-info": "이 사람에 대한 정보 없음"
},
"edit-person-modal": {
"general-tab": "{{edit-series-modal.general-tab}}",
@ -2430,7 +2450,9 @@
"anilist-tooltip": "https://anilist.co/staff/{AniListId}/",
"hardcover-id-label": "Hardcover Id",
"hardcover-tooltip": "https://hardcover.app/authors/{HardcoverId}",
"description-label": "설명"
"description-label": "설명",
"aliases-label": "별명 편집",
"aliases-tab": "별명"
},
"changelog-update-item": {
"known-issues": "알려진 문제",
@ -2475,7 +2497,9 @@
"status-header": "상태",
"series-name-header": "시리즈",
"blacklist-status-label": "수동 일치 필요",
"all-status-label": "모두"
"all-status-label": "모두",
"matched-state-label": "일치 상태",
"library-type": "라이브러리 유형"
},
"manage-user-tokens": {
"username-header": "사용자 이름",
@ -2548,7 +2572,7 @@
"close": "{{common.close}}",
"query-label": "쿼리",
"no-results": "일치하는 항목을 찾을 수 없습니다. 지원되는 공급자의 URL을 추가하고 다시 시도해 보세요.",
"query-tooltip": "시리즈 이름, AniList/MyAnimeList url을 입력하세요. url은 직접 조회를 사용합니다."
"query-tooltip": "시리즈 이름, AniList/MyAnimeList/ComicBookRoundup URL을 입력하세요. URL은 직접 조회를 사용합니다."
},
"match-series-result-item": {
"volume-count": "{{server-stats.volume-count}}",
@ -2613,5 +2637,44 @@
"delete": "{{common.delete}}",
"min-length": "리뷰는 최소 {{count}}자 이상이어야 합니다",
"required": "{{validation.required-field}}"
},
"browse-people": {
"author-count": "{{num}} 사용자",
"cover-image-description": "{{edit-series-modal.cover-image-description}}",
"roles-label": "역할",
"sort-label": "정렬",
"series-count": "{{common.series-count}}",
"title": "사용자 탐색",
"issue-count": "{{common.issue-count}}",
"name-label": "이름"
},
"merge-person-modal": {
"save": "{{common.save}}",
"merge-warning": "진행할 경우, 선택된 사용자가 제거됩니다. 선택된 사용자의 이름은 별명으로 추가되며, 모든 역할이 이전됩니다.",
"src": "사용자 병합",
"alias-title": "새 별명",
"close": "{{common.close}}",
"title": "{{personName}}"
},
"bulk-set-reading-profile-modal": {
"loading": "{{common.loading}}",
"clear": "{{common.clear}}",
"filter-label": "{{common.filter}}",
"close": "{{common.close}}",
"create": "{{common.create}}",
"title": "읽기 프로필 설정"
},
"manage-reading-profiles": {
"reset": "{{common.reset}}"
},
"browse-genres": {
"series-count": "{{common.series-count}}",
"issue-count": "{{common.issue-count}}"
},
"browse-tags": {
"title": "태그 탐색",
"series-count": "{{common.series-count}}",
"issue-count": "{{common.issue-count}}",
"genre-count": "{{num}} 태그"
}
}

View file

@ -50,7 +50,9 @@
"special": "{{entity-title.special}}",
"scrobbling-disabled": "Scrobbling jest wyłączony w opcjach twojego Konta.",
"token-expired": "Twój token AniList wygasł! Scrobbling nie będzie przetwarzany do momentu jego odnowienia na stronie Konta.",
"generate-scrobble-events": "Wydarzenia Backfill"
"generate-scrobble-events": "Wydarzenia Backfill",
"select-all-label": "Zaznacz wszystko",
"delete-selected-label": "Usuń zaznaczone"
},
"scrobble-event-type-pipe": {
"chapter-read": "Postęp czytania",
@ -72,7 +74,8 @@
"your-review": "To twoja recenzja",
"external-review": "Recenzja zewnętrzna",
"local-review": "Recenzja lokalna",
"rating-percentage": "Ocena {{r}}%"
"rating-percentage": "Ocena {{r}}%",
"critic": "krytyk"
},
"want-to-read": {
"title": "Chcę przeczytać",
@ -82,7 +85,7 @@
},
"user-preferences": {
"title": "Panel użytkownika",
"pref-description": "To są ustawienia globalne, które powiązane są z twoim kontem.",
"pref-description": "To są ustawienia globalne, które powiązane są z twoim kontem. Ustawienia czytnika znajdują się w Profilach czytania.",
"account-tab": "{{tabs.account-tab}}",
"preferences-tab": "{{tabs.preferences-tab}}",
"theme-tab": "{{tabs.theme-tab}}",
@ -410,7 +413,7 @@
},
"relationship-pipe": {
"adaptation": "Adaptacja",
"alternative-setting": "Alternatywne miejsce akcji",
"alternative-setting": "Alternatywne uniwersum",
"alternative-version": "Alternatywna wersja",
"character": "Postać",
"contains": "Zawiera",
@ -418,18 +421,18 @@
"other": "Inne",
"prequel": "Prequel",
"sequel": "Sequel",
"side-story": "Opowieść poboczna",
"spin-off": "Spin Off",
"parent": "Rodzic",
"edition": "Edycja",
"annual": "Coroczny"
"side-story": "Historia poboczna",
"spin-off": "Spin-off",
"parent": "Główna historia",
"edition": "Wersja wydania",
"annual": "Wydanie roczne"
},
"publication-status-pipe": {
"ongoing": "W trakcie",
"hiatus": "Hiatus",
"completed": "Zakończono",
"hiatus": "Wstrzymano",
"completed": "Zakończono (kompletne)",
"cancelled": "Anulowano",
"ended": "Zakończono"
"ended": "Zakończono (niekompletne)"
},
"person-role-pipe": {
"artist": "Artysta",
@ -628,7 +631,10 @@
"incognito-mode-label": "Tryb incognito",
"next": "Dalej",
"previous": "Poprzedni",
"go-to-page-prompt": "Jest {{totalPages}} stron. Na jaką stronę chcesz przejść?"
"go-to-page-prompt": "Jest {{totalPages}} stron. Na jaką stronę chcesz przejść?",
"go-to-first-page": "Idź do pierwszej strony",
"go-to-section": "Idź do sekcji",
"go-to-section-prompt": "Znajduje się {{totalSections}} sekcji. Do której sekcji chcesz przejść?"
},
"personal-table-of-contents": {
"no-data": "Nie dodano jeszcze nic do zakładek",
@ -676,7 +682,7 @@
"series-detail": {
"page-settings-title": "Ustawienia strony",
"close": "{{common.close}}",
"layout-mode-label": "{{user-preferences.layout-mode-book-label}}",
"layout-mode-label": "{{manage-reading-profiles.layout-mode-book-label}}",
"layout-mode-option-card": "Karta",
"layout-mode-option-list": "Lista",
"continue-from": "Kontynuuj {{title}}",
@ -763,7 +769,8 @@
"entry-label": "Zobacz szczegóły",
"kavita-tooltip": "Twoja ocena + ogólna",
"kavita-rating-title": "Twoja ocena",
"close": "{{common.close}}"
"close": "{{common.close}}",
"critic": "{{review-card.critic}}"
},
"badge-expander": {
"more-items": "i {{count}} więcej"
@ -799,7 +806,8 @@
"more": "Więcej",
"customize": "{{settings.customize}}",
"edit": "{{common.edit}}",
"cancel-edit": "Zamknij zmianę kolejności"
"cancel-edit": "Zamknij zmianę kolejności",
"browse-people": "Przeglądaj osoby"
},
"library-settings-modal": {
"close": "{{common.close}}",
@ -852,7 +860,9 @@
"exclude-patterns-tooltip": "Skonfiguruj zestaw wzorców (składnia Glob) które Kavita będzie dopasowywać podczas skanowania katalogów i wykluczać z wyników skanera.",
"help": "{{common.help}}",
"allow-metadata-matching-tooltip": "Czy Kavita powinna pobrać metadane dla serii w tej bibliotece.Nastąpi to tylko wtedy, gdy serwer ma aktywną subskrypcję Kavita+.",
"allow-metadata-matching-label": "Zezwól na dopasowywanie metadanych"
"allow-metadata-matching-label": "Zezwól na dopasowywanie metadanych",
"enable-metadata-label": "Włącz metadane (ComicInfo/Epub/PDF)",
"enable-metadata-tooltip": "Umożliwienie Kavicie odczytywania plików metadanych, które zastępują parsowanie nazw plików."
},
"file-type-group-pipe": {
"archive": "Archiwum",
@ -862,39 +872,47 @@
},
"reader-settings": {
"general-settings-title": "Ustawienia ogólne",
"font-family-label": "{{user-preferences.font-family-label}}",
"font-size-label": "{{user-preferences.font-size-book-label}}",
"line-spacing-label": "{{user-preferences.line-height-book-label}}",
"margin-label": "{{user-preferences.margin-book-label}}",
"font-family-label": "{{manage-reading-profiles.font-family-label}}",
"font-size-label": "{{manage-reading-profiles.font-size-book-label}}",
"line-spacing-label": "{{manage-reading-profiles.line-height-book-label}}",
"margin-label": "{{manage-reading-profiles.margin-book-label}}",
"reset-to-defaults": "Przywróć ustawienia domyślne",
"reader-settings-title": "Ustawienia czytnika",
"reading-direction-label": "{{user-preferences.reading-direction-book-label}}",
"reading-direction-label": "{{manage-reading-profiles.reading-direction-book-label}}",
"right-to-left": "Od prawej do lewej",
"left-to-right": "Od lewej do prawej",
"horizontal": "Poziomo",
"vertical": "Pionowo",
"writing-style-label": "{{user-preferences.writing-style-label}}",
"writing-style-label": "{{manage-reading-profiles.writing-style-label}}",
"writing-style-tooltip": "Zmienia kierunek tekstu. Poziomo od lewej do prawej, pionowo od góry do dołu.",
"tap-to-paginate-label": "Stuknij aby zmienić stronę",
"tap-to-paginate-tooltip": "Kliknij przy krawędzi ekranu, aby zmienić stronę",
"on": "Wł.",
"off": "Wył.",
"immersive-mode-label": "{{user-preferences.immersive-mode-label}}",
"immersive-mode-label": "{{manage-reading-profiles.immersive-mode-label}}",
"immersive-mode-tooltip": "Spowoduje to ukrycie menu po kliknięciu czytnika i włączenie funkcji podziału na strony",
"fullscreen-label": "Pełny ekran",
"fullscreen-tooltip": "Przełącz czytnik w tryb pełnoekranowy",
"exit": "Wyjdź",
"enter": "Wejdź",
"layout-mode-label": "{{user-preferences.layout-mode-book-label}}",
"layout-mode-label": "{{manage-reading-profiles.layout-mode-book-label}}",
"layout-mode-tooltip": "Scroll: Lustrzane odbicie pliku epub (zwykle jedna długa przewijana strona na rozdział).<br/>1 Kolumna: Tworzy pojedynczą stronę wirtualną naraz.<br/>2 Kolumny:Tworzy jednocześnie dwie wirtualne strony ułożone obok siebie.",
"layout-mode-option-scroll": "Przewijanie",
"layout-mode-option-1col": "1 Kolumna",
"layout-mode-option-2col": "2 Kolumny",
"color-theme-title": "Motyw kolorów",
"color-theme-title": "Kolor motywu",
"theme-dark": "Ciemny",
"theme-black": "Czarny",
"theme-white": "Biały",
"theme-paper": "Papier"
"theme-paper": "Papier",
"update-parent": "Zapisz do {{name}}",
"loading": "ładowanie",
"create-new": "Nowy profil z domyślnego",
"create-new-tooltip": "Utwórz nowy zarządzalny profil na podstawie obecnego domyślnego profilu",
"reading-profile-updated": "Zaktualizowano profil czytelnika",
"reading-profile-promoted": "Promowany profil czytelniczy",
"line-spacing-min-label": "1x",
"line-spacing-max-label": "2.5x"
},
"table-of-contents": {
"no-data": "Ta książka nie ma spisu treści ustawionego w metadanych ani pliku toc"
@ -1335,7 +1353,8 @@
"admin-manage-tokens": "Zarządzanie tokenami użytkownika",
"admin-metadata": "Zarządzaj metadanymi",
"scrobble-holds": "Wstrzymane pozycje scrobblowania",
"admin-email-history": "Historia e-mail"
"admin-email-history": "Historia e-mail",
"reading-profiles": "Profil czytelniczy"
},
"collection-detail": {
"no-data": "Brak elementów. Spróbuj dodać serię.",
@ -1459,7 +1478,10 @@
"logout": "Wyloguj",
"all-filters": "Inteligentne filtry",
"nav-link-header": "Opcje Nawigacji",
"close": "{{common.close}}"
"close": "{{common.close}}",
"person-aka-status": "Pasuje do aliasu",
"browse-genres": "Przeglądaj gatunki",
"browse-tags": "Przeglądaj tagi"
},
"promoted-icon": {
"promoted": "{{common.promoted}}"
@ -1591,9 +1613,9 @@
"height": "Wysokość",
"width": "Szerokość",
"width-override-label": "Nadpisanie szerokości",
"off": "Wył.",
"off": "{{reader-settings.off}}",
"original": "Oryginał",
"auto-close-menu-label": "{{user-preferences.auto-close-menu-label}}",
"auto-close-menu-label": "{{manage-reading-profiles.auto-close-menu-label}}",
"swipe-enabled-label": "Włączone przeciąganie",
"enable-comic-book-label": "Naśladuj komiks",
"brightness-label": "Jasność",
@ -1604,8 +1626,14 @@
"layout-mode-switched": "Tryb układu został przełączony na Pojedynczy z powodu niewystarczającej ilości miejsca do renderowania podwójnego układu",
"no-next-chapter": "Brak następnego rozdziału",
"no-prev-chapter": "Brak poprzedniego rozdziału",
"emulate-comic-book-label": "{{user-preferences.emulate-comic-book-label}}",
"series-progress": "Postęp serii: {{percentage}}"
"emulate-comic-book-label": "{{manage-reading-profiles.emulate-comic-book-label}}",
"series-progress": "Postęp serii: {{percentage}}",
"update-parent": "{{reader-settings.update-parent}}",
"loading": "{{reader-settings.loading}}",
"create-new": "{{reader-settings.create-new}}",
"create-new-tooltip": "{{reader-settings.create-new-tooltip}}",
"reading-profile-updated": "Profil czytelniczy zaktualizowany",
"reading-profile-promoted": "Promowany profil czytelniczy"
},
"metadata-filter": {
"filter-title": "{{common.filter}}",
@ -1662,7 +1690,10 @@
"release-year": "Rok wydania",
"read-progress": "Ostatnio czytano",
"average-rating": "Średnia ocena",
"random": "Losowe"
"random": "Losowe",
"person-name": "Nazwa",
"person-series-count": "Liczba serii",
"person-chapter-count": "Liczba rozdziałów"
},
"edit-series-modal": {
"title": "{{seriesName}} szczegóły",
@ -1799,8 +1830,8 @@
"cover-image-tab": "{{tabs.cover-tab}}",
"tasks-tab": "{{tabs.tasks-tab}}",
"info-tab": "{{tabs.info-tab}}",
"pages-label": "{{edit-chapter-modal.pages-count}}",
"words-label": "{{edit-chapter-modal.length-title}}",
"pages-label": "{{edit-chapter-modal.pages-label}}",
"words-label": "{{edit-chapter-modal.words-label}}",
"pages-count": "{{edit-chapter-modal.pages-count}}",
"words-count": "{{edit-chapter-modal.words-count}}",
"reading-time-label": "{{edit-chapter-modal.reading-time-label}}",
@ -2021,7 +2052,7 @@
"reading-lists": "{{side-nav.reading-lists}}",
"bookmarks": "{{side-nav.bookmarks}}",
"all-series": "{{side-nav.all-series}}",
"browse-authors": "{{side-nav.browse-authors}}"
"browse-authors": "{{side-nav.browse-people}}"
},
"filter-field-pipe": {
"age-rating": "{{metadata-fields.age-rating-title}}",
@ -2196,7 +2227,11 @@
"bulk-delete-libraries": "Jesteś pewien że chcesz usunąć {{count}} bibliotek?",
"match-success": "Seria dopasowana prawidłowo",
"scrobble-gen-init": "Ustawiono w kolejce zadanie generowania zdarzeń scrobble na podstawie wcześniejszej historii czytania i ocen, synchronizując je z połączonymi usługami.",
"confirm-delete-multiple-volumes": "Czy na pewno chcesz usunąć {{count}} tomów? Nie spowoduje to modyfikacji plików na dysku."
"confirm-delete-multiple-volumes": "Czy na pewno chcesz usunąć {{count}} tomów? Nie spowoduje to modyfikacji plików na dysku.",
"series-added-want-to-read": "Seria dodana z listy Chcę przeczytać",
"series-bound-to-reading-profile": "Seria powiązana z profilem czytelniczym {{name}}",
"library-bound-to-reading-profile": "Biblioteka powiązana z profilem czytelniczym {{name}}",
"external-match-rate-error": "Kavicie skończyła się liczba wyszukiwań {{seriesName}}. Spróbuj ponownie za 5 minut."
},
"read-time-pipe": {
"less-than-hour": "<1 godzina",
@ -2269,7 +2304,16 @@
"import-mal-stack": "Importuj MAL Stack",
"match-tooltip": "Dopasuj serię ręcznie z Kavita+",
"match": "Dopasuj",
"reorder": "Zmień kolejność"
"reorder": "Zmień kolejność",
"reading-profiles": "Profile Czytelnicze",
"set-reading-profile": "Ustaw profil czytelniczy",
"set-reading-profile-tooltip": "Powiąż profil czytelnika z tą biblioteką",
"clear-reading-profile": "Wyczyść profil czytelniczy",
"clear-reading-profile-tooltip": "Wyczyść profil czytelniczy z tej biblioteki",
"cleared-profile": "Wyczyść profil czytelniczy",
"rename": "Zmień nazwę",
"rename-tooltip": "Zmień nazwę filtru inteligentnego",
"merge": "Scal"
},
"preferences": {
"left-to-right": "Od lewej do prawej",
@ -2388,7 +2432,8 @@
"volume-nums": "Tomy",
"author-count": "{{num}} autorów",
"no-data": "Brak danych",
"chapter-count": "{{num}} Rozdziałów"
"chapter-count": "{{num}} Rozdziałów",
"issue-count": "{{num}} Wydań"
},
"person-detail": {
"all-roles": "Role",
@ -2396,14 +2441,17 @@
"browse-person-title": "Wszystkie dzieła {{name}}",
"individual-role-title": "Jako {{role}}",
"browse-person-by-role-title": "Wszystkie dzieła {{name}} jako {{role}}",
"anilist-url": "{{edit-person-modal.anilist-tooltip}}"
"anilist-url": "{{edit-person-modal.anilist-tooltip}}",
"aka-title": "Znany również jako ",
"no-info": "Brak informacji o tej osobie"
},
"confirm": {
"confirm": "Potwierdź",
"alert": "Uwaga",
"info": "Informacje",
"cancel": "{{common.cancel}}",
"ok": "Ok"
"ok": "Ok",
"prompt": "Pytanie"
},
"edit-person-modal": {
"role-label": "Rola",
@ -2426,7 +2474,11 @@
"download-coversdb": "Pobierz z CoversDB",
"name-label": "{{edit-series-modal.name-label}}",
"required-field": "{{validations.required-field}}",
"cover-image-description": "{{edit-series-modal.cover-image-description}}"
"cover-image-description": "{{edit-series-modal.cover-image-description}}",
"aliases-tab": "Pseudonimy",
"aliases-label": "Edytuj pseudonimy",
"alias-overlap": "Ten pseudonim wskazuje już na inną osobę lub jest imieniem tej osoby, rozważ ich połączenie.",
"aliases-tooltip": "Gdy seria jest oznaczona pseudonimem osoby, osoba jest przypisywana zamiast tworzenia nowej osoby. Po usunięciu aliasu konieczne będzie ponowne przeskanowanie serii, aby zmiana została uwzględniona."
},
"changelog-update-item": {
"added": "Dodano",
@ -2471,7 +2523,9 @@
"all-status-label": "Wyszystko",
"match-alt": "Dopasuj {{seriesName}}",
"dont-match-label": "Nie pasuję",
"status-header": "tatus"
"status-header": "tatus",
"library-type": "Typ biblioteki",
"matched-state-label": "Dopasuj stan"
},
"manage-metadata-settings": {
"derive-publication-status-tooltip": "Umożliwienie uzyskania statusu publikacji na podstawie łącznej liczby rozdziałów/tomów.",
@ -2512,7 +2566,18 @@
"add-age-rating-mapping-label": "Dodaj filtr klasyfikacji wiekowej",
"add-field-mapping-label": "Dodaj mapowanie pola",
"overrides-label": "Zastąpienia",
"overrides-description": "Zezwól Kavicie na zapisywanie w zablokowanych polach."
"overrides-description": "Zezwól Kavicie na zapisywanie w zablokowanych polach.",
"enable-chapter-title-label": "Tytuł",
"enable-chapter-title-tooltip": "Zezwól na wpisanie tytułu rozdziału/wydania",
"enable-chapter-summary-label": "{{manage-metadata-settings.summary-label}}",
"enable-chapter-summary-tooltip": "{{manage-metadata-settings.summary-tooltip}}",
"enable-chapter-release-date-label": "Data wydania",
"enable-chapter-release-date-tooltip": "Zezwól na wpisanie daty wydania rozdziału/wydania",
"enable-chapter-publisher-label": "Wydawca",
"enable-chapter-publisher-tooltip": "Zezwól na wpisanie wydawcy rozdziału/wydania",
"enable-chapter-cover-label": "Okładka rozdziału",
"enable-chapter-cover-tooltip": "Zezwól na ustawienie okładki rozdziału/wydania",
"chapter-header": "Pola rozdziału"
},
"match-series-modal": {
"description": "Wybierz dopasowanie, aby przekierować metadane Kavita+ i zregenerować zdarzenia scrobblowania.Opcja Nie dopasowuj może być użyta do ograniczenia dopasowywania metadanych i scrobblowania przez Kavita+.",
@ -2523,7 +2588,7 @@
"title": "Dopasuj {{seriesName}}",
"query-label": "Zapytanie",
"close": "{{common.close}}",
"query-tooltip": "Wprowadź nazwę serii, adres URL AniList/MyAnimeList. Adresy URL będą użyte do bezpośredniego wyszukiwania.",
"query-tooltip": "Wprowadź nazwę serii, adres URL AniList/MyAnimeList//ComicBookRoundup. Adresy URL będą użyte do bezpośredniego wyszukiwania.",
"search": "Szukaj"
},
"manage-user-tokens": {
@ -2540,7 +2605,8 @@
"releasing": "Wydawane",
"updating-metadata-status": "Aktualizacja metadanych",
"details": "Pokaż stronę",
"chapter-count": "{{common.chapter-count}}"
"chapter-count": "{{common.chapter-count}}",
"issue-count": "{{common.issue-count}}"
},
"metadata-setting-field-pipe": {
"genres": "{{metadata-fields.genres-title}}",
@ -2551,7 +2617,12 @@
"covers": "Okładki",
"age-rating": "{{metadata-fields.age-rating-title}}",
"tags": "{{metadata-fields.tags-title}}",
"localized-name": "{{edit-series-modal.localized-name-label}}"
"localized-name": "{{edit-series-modal.localized-name-label}}",
"chapter-release-date": "Data wydania (rozdział)",
"chapter-summary": "Podsumowanie (Rozdział)",
"chapter-covers": "Okładki (Rozdział)",
"chapter-publisher": "{{person-role-pipe.publisher}} (Rozdział)",
"chapter-title": "Tytuł (Rozdział)"
},
"email-history": {
"sent-header": "Udane",
@ -2579,5 +2650,168 @@
"warning": "Ostrzeżenie",
"critical": "Krytyczne",
"trace": "Ślad"
},
"reviews": {
"user-reviews-local": "Lokalne recenzje",
"user-reviews-plus": "Zewnętrzne recenzje"
},
"review-modal": {
"title": "Edytuj recenzję",
"review-label": "Recenzja",
"close": "{{common.close}}",
"save": "{{common.save}}",
"delete": "{{common.delete}}",
"min-length": "Recenzja musi zawierać co najmniej {{count}} znaków",
"required": "{{validation.required-field}}"
},
"browse-people": {
"title": "Przeglądaj osoby",
"author-count": "{{num}} Osób",
"cover-image-description": "{{edit-series-modal.cover-image-description}}",
"issue-count": "{{common.issue-count}}",
"series-count": "{{common.series-count}}",
"roles-label": "Role",
"sort-label": "Sortuj",
"name-label": "Nazwa",
"issue-count-label": "Liczba wydań",
"series-count-label": "Liczba serii"
},
"browse-genres": {
"title": "Przeglądaj gatunki",
"genre-count": "{{num}} Gatunków",
"issue-count": "{{common.issue-count}}",
"series-count": "{{common.series-count}}"
},
"browse-tags": {
"title": "Przeglądaj tagi",
"genre-count": "{{num}} Tagów",
"issue-count": "{{common.issue-count}}",
"series-count": "{{common.series-count}}"
},
"bulk-set-reading-profile-modal": {
"title": "Ustaw profil czytelniczy",
"close": "{{common.close}}",
"filter-label": "{{common.filter}}",
"clear": "{{common.clear}}",
"no-data": "Nie utworzono jeszcze żadnych kolekcji",
"loading": "{{common.loading}}",
"create": "{{common.create}}",
"bound": "Powiązany"
},
"merge-person-modal": {
"title": "{{personName}}",
"close": "{{common.close}}",
"save": "{{common.save}}",
"src": "Połącz osoby",
"merge-warning": "Kontynuacja spowoduje usunięcie wybranej osoby. Imię i nazwisko wybranej osoby zostanie dodane jako pseudonim, a wszystkie jej role zostaną przeniesione.",
"alias-title": "Nowy pseudonim",
"known-for-title": "Znany z"
},
"browse-title-pipe": {
"publication-status": "{{value}} działa",
"age-rating": "Przeznaczony dla {{value}}",
"user-rating": "{{value}} gwiazdek",
"tag": "Ma {{value}} tagów",
"translator": "Przetłumaczone przez {{value}}",
"character": "Posiada postać {{value}}",
"publisher": "Wydany przez {{value}}",
"editor": "Edytowany przez {{value}}",
"artist": "Rysowany przez {{value}}",
"letterer": "Literowany przez {{value}}",
"colorist": "Kolorowany przez {{value}}",
"inker": "Tuszowany przez {{value}}",
"writer": "Napisany przez {{value}}",
"genre": "Ma gatunek {{value}}",
"library": "Wewnątrz {{value}} biblioteki",
"format": "Format {{value}}",
"release-year": "Wydano w {{value}}",
"imprint": "Imprint {{value}}",
"team": "Zespół {{value}}",
"location": "W {{value}} lokalizacji",
"penciller": "Nakreślone ołówkiem przez {{value}}"
},
"generic-filter-field-pipe": {
"person-role": "Rola",
"person-name": "Nazwa",
"person-series-count": "Liczba serii",
"person-chapter-count": "Liczba rozdziałów"
},
"breakpoint-pipe": {
"never": "Nigdy",
"tablet": "Tablet",
"desktop": "Komputer stacjonarny",
"mobile": "Mobilny"
},
"manage-reading-profiles": {
"description": "Nie wszystkie serie mogą być czytane w ten sam sposób, skonfiguruj odrębne profile czytelnicze dla każdej biblioteki lub serii, aby powrót do serii był jak najbardziej płynny.",
"extra-tip": "Przypisywanie profili czytelniczych za pomocą menu akcji w seriach i bibliotekach lub zbiorczo. Podczas zmiany ustawień w czytniku tworzony jest ukryty profil, który zapamiętuje wybory dla danej serii (nie dla plików PDF). Profil ten jest usuwany po przypisaniu jednego z własnych profili czytania do serii. Więcej informacji można znaleźć na",
"wiki-title": "wiki",
"profiles-title": "Twoje profile czytelnicze",
"default-profile": "Domyślny",
"add": "{{common.add}}",
"add-tooltip": "Nowy profil zostanie zapisany po wprowadzeniu w nim zmian",
"make-default": "Ustaw jako domyślny",
"no-selected": "Nie wybrano profilu",
"confirm": "Czy na pewno chcesz usunąć profil czytelniczy {{name}}?",
"selection-tip": "Wybierz profil z listy lub utwórz nowy w prawym górnym rogu",
"image-reader-settings-title": "Czytnik obrazów",
"reading-direction-label": "Kierunek czytania",
"reading-direction-tooltip": "Kierunek kliknięcia, aby przejść do następnej strony. Od prawej do lewej oznacza kliknięcie po lewej stronie ekranu, aby przejść do następnej strony.",
"scaling-option-label": "Opcje skalowania",
"scaling-option-tooltip": "Jak przeskalować obraz do ekranu.",
"page-splitting-label": "Dzielenie stron",
"page-splitting-tooltip": "Jak podzielić obraz o pełnej szerokości (tj. obrazy lewy i prawy są połączone)?",
"reading-mode-label": "Tryb czytania",
"reading-mode-tooltip": "Zmień czytnik, aby przewijał strony pionowo, poziomo lub w nieskończoność",
"layout-mode-label": "Tryb układu",
"layout-mode-tooltip": "Wyświetl pojedynczy obraz na ekranie lub dwóch obrazów obok siebie",
"background-color-label": "Kolor tła",
"background-color-tooltip": "Kolor tła czytnika obrazów",
"auto-close-menu-label": "Automatycznie zamknij menu",
"auto-close-menu-tooltip": "Czy menu powinno się automatycznie zamykać?",
"show-screen-hints-label": "Wyświetl podpowiedzi",
"show-screen-hints-tooltip": "Wyświetlanie nakładki ułatwiającej zrozumienie obszaru i kierunku przewijania stron",
"emulate-comic-book-label": "Naśladuj komiks",
"emulate-comic-book-tooltip": "Stosuje efekt cienia, aby naśladować czytanie z książki",
"swipe-to-paginate-label": "Przesuń, aby zmienić stronę",
"swipe-to-paginate-tooltip": "Czy przesunięcie palcem po ekranie powinno powodować przejście do następnej lub poprzedniej strony?",
"allow-auto-webtoon-reader-label": "Automatyczny tryb czytnika Webtoon",
"allow-auto-webtoon-reader-tooltip": "Przełącz się w tryb Webtoon Reader, jeśli strony wyglądają jak webtoon. Mogą wystąpić fałszywie pozytywne wyniki.",
"width-override-label": "{{manga-reader.width-override-label}}",
"width-override-tooltip": "Zastąp szerokość obrazów w czytniku",
"disable-width-override-label": "Wyłącz zastępowanie szerokości",
"disable-width-override-tooltip": "Zapobieganie zastępowaniu szerokości, gdy ekran ma co najmniej skonfigurowany punkt podziału lub jest mniejszy",
"reset": "{{common.reset}}",
"book-reader-settings-title": "Czytnik książek",
"tap-to-paginate-label": "Stuknij, aby zmienić stronę",
"tap-to-paginate-tooltip": "Czy boki ekranu czytnika książek powinny umożliwiać dotknięcie go w celu przejścia do poprzedniej/następnej strony?",
"immersive-mode-label": "Tryb immersyjny",
"immersive-mode-tooltip": "Spowoduje to ukrycie menu za kliknięciem dokumentu czytnika i włączenie funkcji przewijania stron",
"reading-direction-book-label": "Kierunek czytania",
"reading-direction-book-tooltip": "Kierunek kliknięcia, aby przejść do następnej strony. Od prawej do lewej oznacza kliknięcie po lewej stronie ekranu, aby przejść do następnej strony.",
"font-family-label": "Rodzina fontów",
"font-family-tooltip": "Rodzina fontów do załadowania. Domyślna spowoduje załadowanie domyślnego fontu książki",
"writing-style-label": "Styl pisania",
"writing-style-tooltip": "Zmienia kierunek tekstu. Poziomo od lewej do prawej, pionowo od góry do dołu.",
"layout-mode-book-label": "Tryb układu",
"layout-mode-book-tooltip": "Jak powinna być ułożona treść. Przewijanie jest zgodne z układem książki. 1 lub 2 kolumny pasują do wysokości urządzenia i mieszczą 1 lub 2 kolumny tekstu na stronę",
"color-theme-book-label": "Kolor motywu",
"color-theme-book-tooltip": "Jaki motyw kolorystyczny zastosować do treści i menu czytnika książek?",
"font-size-book-label": "Wielkość fontu",
"font-size-book-tooltip": "Procent skalowania zastosowany do fontu w książce",
"line-height-book-label": "Odstęp między wierszami",
"line-height-book-tooltip": "Jak duże odstępy między wierszami książki",
"margin-book-label": "Margines",
"margin-book-tooltip": "Odstępy po każdej stronie ekranu. Na urządzeniach mobilnych wartość ta zostanie zastąpiona wartością 0, niezależnie od tego ustawienia.",
"pdf-reader-settings-title": "Czytnik PDF",
"pdf-scroll-mode-label": "Tryb przewijania",
"pdf-scroll-mode-tooltip": "Sposób przewijania stron. Pionowo/poziomo i dotknij, aby przewinąć (bez przewijania)",
"pdf-spread-mode-label": "Tryb stron",
"pdf-spread-mode-tooltip": "Jak powinny być ułożone strony. Pojedyncze lub podwójne (nieparzyste/parzyste)",
"pdf-theme-label": "Motyw",
"pdf-theme-tooltip": "Kolor motywu czytnika",
"reading-profile-series-settings-title": "Serie",
"reading-profile-library-settings-title": "Biblioteka",
"delete": "{{common.delete}}"
}
}

View file

@ -50,7 +50,9 @@
"special": "{{entity-title.special}}",
"token-expired": "O token do AniList expirou! Os eventos de scrobbling não serão processados até que o token seja refrescado na página Contas.",
"scrobbling-disabled": "O scrobbling está desabilitado nas suas Definições de Conta.",
"generate-scrobble-events": "Eventos de Scrobbling"
"generate-scrobble-events": "Eventos de Scrobbling",
"select-all-label": "Selecionar tudo",
"delete-selected-label": "Apagar selecionado"
},
"scrobble-event-type-pipe": {
"chapter-read": "Leitura Efetuada",
@ -72,7 +74,8 @@
"your-review": "Esta é a sua crítica",
"external-review": "Crítica externa",
"local-review": "Crítica Local",
"rating-percentage": "Classificação {{r}}%"
"rating-percentage": "Classificação {{r}}%",
"critic": "crítico"
},
"want-to-read": {
"title": "Leituras Futuras",
@ -82,7 +85,7 @@
},
"user-preferences": {
"title": "Painel do Utilizador",
"pref-description": "Estas definições globais estão ligadas à sua conta.",
"pref-description": "Estas definições globais estão ligadas à sua conta. As definições do Leitor estão nos Perfis de Leitura.",
"account-tab": "{{tabs.account-tab}}",
"preferences-tab": "{{tabs.preferences-tab}}",
"theme-tab": "{{tabs.theme-tab}}",
@ -628,7 +631,10 @@
"incognito-mode-label": "Modo Incógnito",
"next": "Seguinte",
"previous": "Anterior",
"go-to-page-prompt": "Existem {{totalPages}} páginas. Para que página deseja ir?"
"go-to-page-prompt": "Existem {{totalPages}} páginas. Para que página deseja ir?",
"go-to-first-page": "Ir para a primeira página",
"go-to-section": "Ir para secção",
"go-to-section-prompt": "Existem {{totalSections}} secções. Para que secção deseja ir?"
},
"personal-table-of-contents": {
"no-data": "Ainda não existem marcadores",
@ -676,7 +682,7 @@
"series-detail": {
"page-settings-title": "Definições de Página",
"close": "{{common.close}}",
"layout-mode-label": "{{user-preferences.layout-mode-book-label}}",
"layout-mode-label": "{{manage-reading-profiles.layout-mode-book-label}}",
"layout-mode-option-card": "Cartão",
"layout-mode-option-list": "Lista",
"continue-from": "Continuar {{title}}",
@ -763,7 +769,8 @@
"entry-label": "Ver detalhes",
"kavita-tooltip": "A Sua Classificação + Geral",
"kavita-rating-title": "A Sua Classificação",
"close": "{{common.close}}"
"close": "{{common.close}}",
"critic": "{{review-card.critic}}"
},
"badge-expander": {
"more-items": "e mais {{count}}"
@ -799,7 +806,8 @@
"more": "Mais",
"customize": "{{settings.customize}}",
"edit": "{{common.edit}}",
"cancel-edit": "Fechar Reordenar"
"cancel-edit": "Fechar Reordenar",
"browse-people": "Explorar Pessoas"
},
"library-settings-modal": {
"close": "{{common.close}}",
@ -814,7 +822,7 @@
"library-name-unique": "O nome da biblioteca tem de ser único",
"last-scanned-label": "Último Scan:",
"type-label": "Tipo",
"type-tooltip": "O tipo de biblioteca indica como os nomes dos ficheiros são processados e se o UI mostra Capítulos (Manga) vs Números (BDs). Verifique o wiki para mais detalhes relativamente às diferenças entre os dois tipos de bibliotecas.",
"type-tooltip": "O tipo de biblioteca indica como os nomes dos ficheiros são processados e se o UI mostra Capítulos (Manga) vs Edições (BDs). Verifique o wiki para mais detalhes relativamente às diferenças entre os dois tipos de bibliotecas.",
"kavitaplus-eligible-label": "Kavita+ Elegível",
"kavitaplus-eligible-tooltip": "Suporta as funcionalidades de metadados do Kavita+ ou Scrobbling",
"folder-description": "Adicione pastas à sua biblioteca",
@ -852,7 +860,9 @@
"exclude-patterns-tooltip": "Configura um conjunto de padrões (sintaxe Glob) que o Kavita irá excluir dos resultados da analise de directorias.",
"help": "{{common.help}}",
"allow-metadata-matching-label": "Permitir Correspondência de Metadados",
"allow-metadata-matching-tooltip": "Se o Kavita deve descarregar metadados para as Séries nesta Biblioteca. Isto irá acontecer apenas se o servidor tiver uma subscrição Kavita+ ativa."
"allow-metadata-matching-tooltip": "Se o Kavita deve descarregar metadados para as Séries nesta Biblioteca. Isto irá acontecer apenas se o servidor tiver uma subscrição Kavita+ ativa.",
"enable-metadata-label": "Permitir Metadados (ComicInfo/Epub/PDF)",
"enable-metadata-tooltip": "Permitir que o Kavita use metadados que substituem a análise dos nomes dos ficheiros."
},
"file-type-group-pipe": {
"archive": "Arquivo",
@ -862,30 +872,30 @@
},
"reader-settings": {
"general-settings-title": "Definições Gerais",
"font-family-label": "{{user-preferences.font-family-label}}",
"font-size-label": "{{user-preferences.font-size-book-label}}",
"line-spacing-label": "{{user-preferences.line-height-book-label}}",
"margin-label": "{{user-preferences.margin-book-label}}",
"font-family-label": "{{manage-reading-profiles.font-family-label}}",
"font-size-label": "{{manage-reading-profiles.font-size-book-label}}",
"line-spacing-label": "{{manage-reading-profiles.line-height-book-label}}",
"margin-label": "{{manage-reading-profiles.margin-book-label}}",
"reset-to-defaults": "Repor Definições por Defeito",
"reader-settings-title": "Definições do Leitor",
"reading-direction-label": "{{user-preferences.reading-direction-book-label}}",
"reading-direction-label": "{{manage-reading-profiles.reading-direction-book-label}}",
"right-to-left": "Direita para a Esquerda",
"left-to-right": "Esquerda para a Direita",
"horizontal": "Horizontal",
"vertical": "Vertical",
"writing-style-label": "{{user-preferences.writing-style-label}}",
"writing-style-label": "{{manage-reading-profiles.writing-style-label}}",
"writing-style-tooltip": "Altera a direção do texto. Horizontal é da esquerda para direita, veritcal é do topo para o fundo.",
"tap-to-paginate-label": "Paginação por Toque",
"tap-to-paginate-tooltip": "Clicar as extremidades do ecrã para paginar",
"on": "Ligado",
"off": "Desligado",
"immersive-mode-label": "{{user-preferences.immersive-mode-label}}",
"immersive-mode-label": "{{manage-reading-profiles.immersive-mode-label}}",
"immersive-mode-tooltip": "Esta opção ocultará o menu ao clicar no documento e ligará o Toque para Paginar",
"fullscreen-label": "Ecrã Completo",
"fullscreen-tooltip": "Colocar o leitor em modo ecrã completo",
"exit": "Sair",
"enter": "Entrar",
"layout-mode-label": "{{user-preferences.layout-mode-book-label}}",
"layout-mode-label": "{{manage-reading-profiles.layout-mode-book-label}}",
"layout-mode-tooltip": "Scroll: Espelha o ficheiro epub (geralmente é uma página longa por capítulo).<br/>1 Coluna: Cria uma única página virtual.<br/>2 Colunas: Cria duas páginas virtuais que são dispostas lado a lado.",
"layout-mode-option-scroll": "Scroll",
"layout-mode-option-1col": "1 Coluna",
@ -894,7 +904,15 @@
"theme-dark": "Escuro",
"theme-black": "Preto",
"theme-white": "Branco",
"theme-paper": "Papel"
"theme-paper": "Papel",
"update-parent": "Gravar para {{name}}",
"loading": "a carregar",
"create-new": "Novo perfil implícito",
"create-new-tooltip": "Crie um novo perfil a partir do seu perfil implícito atual",
"reading-profile-updated": "Perfil de leitura atualizado",
"reading-profile-promoted": "Perfil de leitura promovido",
"line-spacing-min-label": "1x",
"line-spacing-max-label": "2.5x"
},
"table-of-contents": {
"no-data": "Este livro não tem um Indíce definido nos metadados ou um ficheiro toc"
@ -1335,7 +1353,8 @@
"admin-matched-metadata": "Metadados com Correspondência",
"admin-manage-tokens": "Gerir Tokens de Utilizador",
"scrobble-holds": "Pausas de Scrobble",
"admin-metadata": "Gerir Metadados"
"admin-metadata": "Gerir Metadados",
"reading-profiles": "Perfis de Leitura"
},
"collection-detail": {
"no-data": "Não existem itens. Tente adicionar uma série.",
@ -1459,7 +1478,10 @@
"logout": "Terminar Sessão",
"all-filters": "Filtros Inteligentes",
"nav-link-header": "Opções de Navegação",
"close": "{{common.close}}"
"close": "{{common.close}}",
"person-aka-status": "Corresponde um pseudónimo",
"browse-genres": "Explorar Géneros",
"browse-tags": "Explorar Etiquetas"
},
"promoted-icon": {
"promoted": "{{common.promoted}}"
@ -1591,9 +1613,9 @@
"height": "Altura",
"width": "Largura",
"width-override-label": "Sobrepor Largura",
"off": "Desligado",
"off": "{{reader-settings.off}}",
"original": "Original",
"auto-close-menu-label": "{{user-preferences.auto-close-menu-label}}",
"auto-close-menu-label": "{{manage-reading-profiles.auto-close-menu-label}}",
"swipe-enabled-label": "Deslizar Ativado",
"enable-comic-book-label": "Emular livro de BD",
"brightness-label": "Brilho",
@ -1604,8 +1626,14 @@
"layout-mode-switched": "O modo de layout foi mudado para Individual por não haver espaço suficiente para mostrar o layout duplo",
"no-next-chapter": "Não há Capítulo Seguinte",
"no-prev-chapter": "Não há Capítulo Anterior",
"emulate-comic-book-label": "{{user-preferences.emulate-comic-book-label}}",
"series-progress": "Progresso da Série: {{percentage}}"
"emulate-comic-book-label": "{{manage-reading-profiles.emulate-comic-book-label}}",
"series-progress": "Progresso da Série: {{percentage}}",
"update-parent": "{{reader-settings.update-parent}}",
"loading": "{{reader-settings.loading}}",
"create-new": "{{reader-settings.create-new}}",
"create-new-tooltip": "{{reader-settings.create-new-tooltip}}",
"reading-profile-updated": "Perfil de leitura atualizado",
"reading-profile-promoted": "Perfil de leitura promovido"
},
"metadata-filter": {
"filter-title": "{{common.filter}}",
@ -1662,7 +1690,10 @@
"release-year": "Ano de Lançamento",
"read-progress": "Última Leitura",
"average-rating": "Classificação Média",
"random": "Aleatório"
"random": "Aleatório",
"person-name": "Nome",
"person-series-count": "Número de Séries",
"person-chapter-count": "Número de Capítulos"
},
"edit-series-modal": {
"title": "Detalhes de {{seriesName}}",
@ -1799,8 +1830,8 @@
"cover-image-tab": "{{tabs.cover-tab}}",
"tasks-tab": "{{tabs.tasks-tab}}",
"info-tab": "{{tabs.info-tab}}",
"pages-label": "{{edit-chapter-modal.pages-count}}",
"words-label": "{{edit-chapter-modal.length-title}}",
"pages-label": "{{edit-chapter-modal.pages-label}}",
"words-label": "{{edit-chapter-modal.words-label}}",
"pages-count": "{{edit-chapter-modal.pages-count}}",
"words-count": "{{edit-chapter-modal.words-count}}",
"reading-time-label": "{{edit-chapter-modal.reading-time-label}}",
@ -2021,7 +2052,7 @@
"reading-lists": "{{side-nav.reading-lists}}",
"bookmarks": "{{side-nav.bookmarks}}",
"all-series": "{{side-nav.all-series}}",
"browse-authors": "{{side-nav.browse-authors}}"
"browse-authors": "{{side-nav.browse-people}}"
},
"filter-field-pipe": {
"age-rating": "{{metadata-fields.age-rating-title}}",
@ -2195,7 +2226,12 @@
"bulk-delete-libraries": "Tem a certeza que deseja eliminar {{count}} bibliotecas?",
"match-success": "Séries correspondidas com sucesso",
"webtoon-override": "O modo Webtoon vai ser usado porque as imagens representam um webtoon.",
"scrobble-gen-init": "Foi colocada uma tarefa em fila para gerar eventos de scrobble a partir do historial de leitura e classificações existentes, sincronizando-as com os serviços que estão configurados."
"scrobble-gen-init": "Foi colocada uma tarefa em fila para gerar eventos de scrobble a partir do historial de leitura e classificações existentes, sincronizando-as com os serviços que estão configurados.",
"series-added-want-to-read": "Série adicionada da lista Leituras Futuras",
"confirm-delete-multiple-volumes": "Tem a certeza que deseja apagar {{count}} volumes? Os ficheiros em disco não serão alterados.",
"series-bound-to-reading-profile": "Série vinculada ao Perfil de Leitura {{name}}",
"library-bound-to-reading-profile": "Biblioteca vinculada ao Perfil de Leitura {{name}}",
"external-match-rate-error": "O Kavita ficou sem taxa à procura de {{seriesName}}. Tente novamente em 5 minutos."
},
"read-time-pipe": {
"less-than-hour": "<1 Hora",
@ -2268,7 +2304,16 @@
"copy-settings": "Copiar Definições De",
"match": "Correspondência",
"match-tooltip": "Fazer a associação manual das Séries com o Kavita+",
"reorder": "Reordenar"
"reorder": "Reordenar",
"reading-profiles": "Perfis de Leitura",
"set-reading-profile": "Escolher Perfil de Leitura",
"set-reading-profile-tooltip": "Vincular um Perfil de Leitura a esta Biblioteca",
"clear-reading-profile": "Limpar Perfil de Leitura",
"clear-reading-profile-tooltip": "Limpar Perfil de Leitura para esta Biblioteca",
"cleared-profile": "Perfil de Leitura Limpo",
"rename": "Renomear",
"rename-tooltip": "Renomear o Filtro Inteligente",
"merge": "Juntar"
},
"preferences": {
"left-to-right": "Esquerda para Direita",
@ -2373,7 +2418,7 @@
"series-count": "{{num}} Séries",
"item-count": "{{num}} Itens",
"book-num": "Livro",
"issue-hash-num": "Número #",
"issue-hash-num": "Edição #",
"issue-num": "Número",
"chapter-num": "Capítulo",
"volume-num": "Volume",
@ -2382,19 +2427,21 @@
"issue-num-shorthand": "#{{num}}",
"volume-num-shorthand": "Vol {{num}}",
"book-nums": "Livros",
"issue-nums": "Números",
"issue-nums": "Edições",
"chapter-nums": "Capítulos",
"volume-nums": "Volumes",
"author-count": "{{num}} Autores",
"chapter-count": "{{num}} Capítulos",
"no-data": "Sem Dados"
"no-data": "Sem Dados",
"issue-count": "{{num}} Edições"
},
"confirm": {
"alert": "Alerta",
"confirm": "Confirmar",
"cancel": "{{common.cancel}}",
"info": "Informação",
"ok": "Ok"
"ok": "Ok",
"prompt": "Questão"
},
"person-detail": {
"all-roles": "Funções",
@ -2402,7 +2449,9 @@
"individual-role-title": "Como um {{role}}",
"browse-person-title": "Todos as Obras de {{name}}",
"known-for-title": "Conhecido Por",
"anilist-url": "{{edit-person-modal.anilist-tooltip}}"
"anilist-url": "{{edit-person-modal.anilist-tooltip}}",
"aka-title": "Também conhecido como ",
"no-info": "Sem informação sobre esta Pessoa"
},
"edit-person-modal": {
"cover-image-description": "{{edit-series-modal.cover-image-description}}",
@ -2425,7 +2474,11 @@
"cover-image-description-extra": "Em alternativa pode descarregar uma capa a partir do CoversDB, se disponível.",
"anilist-tooltip": "https://anilist.co/staff/{AniListId}/",
"asin-tooltip": "https://www.amazon.com/stores/J.K.-Rowling/author/{ASIN}",
"download-coversdb": "Descarregar de CoversDB"
"download-coversdb": "Descarregar de CoversDB",
"aliases-tab": "Pseudónimos",
"aliases-label": "Editar pseudónimos",
"alias-overlap": "Este pseudónimo refere-se a outra pessoa ou é o nome desta pessoa, considere juntar as duas pessoas.",
"aliases-tooltip": "Quando uma série é etiquetada com o pseudónimo de uma pessoa, essa pessoa é associada à serie em vez de ser criada uma pessoa nova. Quando um pseudónimo for apagado, será necessário voltar a analisar a série para que essa alteração tenha efeito."
},
"changelog-update-item": {
"fixed": "Corrigido",
@ -2443,7 +2496,7 @@
},
"match-series-modal": {
"search": "Pesquisa",
"query-tooltip": "Introduza o nome da série, e o url do AniList/MyAnimeList. Os Urls irão usar uma pesquisa direta.",
"query-tooltip": "Introduza o nome da série, e o url do AniList/MyAnimeList/ComicBookRoundup. Os Urls irão usar uma pesquisa direta.",
"save": "{{common.save}}",
"title": "Corresponder {{seriesName}}",
"close": "{{common.close}}",
@ -2472,7 +2525,8 @@
"chapter-count": "{{common.chapter-count}}",
"details": "Ver página",
"updating-metadata-status": "Metadados em Atualização",
"releasing": "Em Lançamento"
"releasing": "Em Lançamento",
"issue-count": "{{common.issue-count}}"
},
"email-history": {
"description": "Aqui pode encontrar todos os emails enviados pelo Kavita, e para que utilizadores.",
@ -2508,7 +2562,9 @@
"dont-match-status-label": "{{dont-match-label}}",
"library-name-header": "Biblioteca",
"actions-header": "Ações",
"match-alt": "Corresponder {{seriesName}}"
"match-alt": "Corresponder {{seriesName}}",
"library-type": "Tipo de Biblioteca",
"matched-state-label": "Estado da Correspondência"
},
"manage-metadata-settings": {
"description": "O Kavita+ tem a capacidade de descarregar e escrever alguns metadados na base de dados. Esta página permite selecionar o que está abrangido.",
@ -2549,7 +2605,18 @@
"first-last-name-label": "Convenção Primeiro Nome/Sobrenome",
"first-last-name-tooltip": "Certificar que os nomes das Pessoas são escritos pela ordem Primeiro Nome e depois Sobrenome",
"overrides-label": "Substituições",
"person-roles-label": "Papéis"
"person-roles-label": "Papéis",
"enable-chapter-title-label": "Título",
"enable-chapter-title-tooltip": "Permitir que o Título do Capítulo/Edição seja gravado",
"enable-chapter-summary-label": "{{manage-metadata-settings.summary-label}}",
"enable-chapter-summary-tooltip": "{{manage-metadata-settings.summary-tooltip}}",
"enable-chapter-release-date-label": "Data de Lançamento",
"enable-chapter-release-date-tooltip": "Permitir que a Data de Lançamento do Capítulo/Edição seja gravado",
"enable-chapter-publisher-label": "Editora",
"enable-chapter-publisher-tooltip": "Permitir que o Editor do Capítulo/Edição seja gravado",
"enable-chapter-cover-label": "Capa do Capítulo",
"enable-chapter-cover-tooltip": "Permitir que a Capa do Capítulo/Editor seja definida",
"chapter-header": "Campos do Capítulo"
},
"metadata-setting-field-pipe": {
"people": "{{tabs.people-tab}}",
@ -2560,7 +2627,12 @@
"localized-name": "{{edit-series-modal.localized-name-label}}",
"publication-status": "{{edit-series-modal.publication-status-title}}",
"covers": "Capas",
"start-date": "{{manage-metadata-settings.enable-start-date-label}}"
"start-date": "{{manage-metadata-settings.enable-start-date-label}}",
"chapter-release-date": "Data de Lançamento (Capítulo)",
"chapter-summary": "Sumário (Capítulo)",
"chapter-covers": "Capas (Capítulo)",
"chapter-publisher": "{{person-role-pipe.publisher}} (Capítulo)",
"chapter-title": "Título (Capítulo)"
},
"role-localized-pipe": {
"admin": "Administrador",
@ -2578,5 +2650,168 @@
"trace": "Rastrear",
"warning": "Aviso",
"critical": "Crítico"
},
"manage-reading-profiles": {
"reset": "{{common.reset}}",
"description": "Nem todas as séries podem ser lidas da mesma maneira, defina perfis de leitura distintos por biblioteca ou séries para que o regresso às suas séries seja o mais simples possível.",
"extra-tip": "Atribua perfis de leitura a partir do menu de ações nas séries ou bibliotecas, ou em massa. Quando alterar definições num leitor, é criado um perfil escondido que memoriza as suas escolhas para essa série (não se aplica a pdfs). Este perfil é removido quando atribui o seu próprio perfil de leitura à série. Pode encontrar mais informação no",
"wiki-title": "wiki",
"profiles-title": "Os seus perfis de leitura",
"default-profile": "Por Defeito",
"add": "{{common.add}}",
"add-tooltip": "O seu novo perfil será gravado depois de lhe fazer qualquer alteração",
"make-default": "Definir por defeito",
"no-selected": "Nenhum perfil selecionado",
"confirm": "Tem a certeza que deseja eliminar o perfil de leitura {{name}}?",
"selection-tip": "Selecione um perfil da lista ou crie um novo à direita no topo",
"image-reader-settings-title": "Leitor de Imagens",
"reading-direction-label": "Direção de Leitura",
"reading-direction-tooltip": "Direção em que deve clicar para ir para a página seguinte. Direita para Esquerda significa que se clica no lado esquerdo do ecrã para ir para a página seguinte.",
"scaling-option-label": "Opções de Escala",
"scaling-option-tooltip": "Como a imagem é dimensionada no seu ecrã.",
"page-splitting-label": "Divisão de Páginas",
"page-splitting-tooltip": "Como dividir uma imagem que ocupa a largura toda (p.e., a imagem da esquerda e direita estão juntas)",
"reading-mode-label": "Modo de Leitura",
"reading-mode-tooltip": "Alterar o leitor para paginar verticalmente, horizontalmente ou para ter scroll infinito",
"layout-mode-label": "Modo de Layout",
"layout-mode-tooltip": "Mostrar apenas uma imagem no ecrã ou duas imagens lado a lado",
"background-color-label": "Cor de fundo",
"background-color-tooltip": "Cor de fundo do Leitor de Imagens",
"auto-close-menu-label": "Fechar Menu Automaticamente",
"auto-close-menu-tooltip": "Se o menu deve fechar automaticamente",
"show-screen-hints-label": "Mostrar Dicas no Ecrã",
"show-screen-hints-tooltip": "Mostrar dicas no ecrã que ajudam a compreender a área e direção de paginação",
"emulate-comic-book-label": "Emular livro de banda desenhada",
"emulate-comic-book-tooltip": "Aplica um efeito de sombra para emular a leitura a partir de um livro físico",
"swipe-to-paginate-label": "Deslizar para Paginar",
"swipe-to-paginate-tooltip": "Se o gesto de deslizar no ecrã causa que as páginas seguinte ou anterior sejam mostradas",
"allow-auto-webtoon-reader-label": "Modo Leitor Webtoon Automático",
"allow-auto-webtoon-reader-tooltip": "Muda para o modo Leitor Webtoon se as páginas indicam que é um webtoon. Podem acontecer falsos positivos.",
"width-override-label": "{{manga-reader.width-override-label}}",
"width-override-tooltip": "Substituir a largura das imagens no leitor",
"disable-width-override-label": "Desabilitar a substituição da largura",
"disable-width-override-tooltip": "Evitar que a substituição da largura tenha efeito quando o seu ecrã está configurado com o valor mínimo aceite",
"book-reader-settings-title": "Leitor de Livros",
"tap-to-paginate-label": "Tocar par Paginar",
"tap-to-paginate-tooltip": "Se as laterais do leitor de livros permitem que o toque mostre a página anterior/seguinte",
"immersive-mode-label": "Modo Imersivo",
"immersive-mode-tooltip": "Irá esconder o menu quando se clicar no documento e ligar o toque para paginar",
"reading-direction-book-label": "Direção de Leitura",
"reading-direction-book-tooltip": "Direção a clicar para ir para a página seguinte. Direita para Esquerda significa que se tem de clicar no lado esquerdo do ecrã para ir para a página seguinte.",
"font-family-label": "Família de Font",
"font-family-tooltip": "Família de fonts que vai ser carregada. Por defeito é carregada a font usada pelo livro",
"writing-style-label": "Estilo de Escrita",
"writing-style-tooltip": "Muda a direção do texto. A direção horizontal é da esquerda para direita, vertical é do topo para o fundo.",
"layout-mode-book-label": "Modo de Layout",
"layout-mode-book-tooltip": "Como o conteúdo deve ser disposto. O modo Scroll é como o livro define. O modo 1 ou 2 Colunas, ajusta-se à altura do dispositivo e tenta mostrar 1 ou 2 colunas de texto por página",
"color-theme-book-label": "Tema de Cores",
"color-theme-book-tooltip": "Que tema de cores deve ser aplicado ao conteúdo e menu do leitor de livros",
"font-size-book-label": "Tamanho da Font",
"font-size-book-tooltip": "Percentagem de dimensionamento que vai ser aplicado à font do livro",
"line-height-book-label": "Espaçamento entre Linhas",
"line-height-book-tooltip": "O espaçamento que existe entre linhas do livro",
"margin-book-label": "Margem",
"margin-book-tooltip": "Quando espaçamento existe de cada lado do ecrã. Esta opção será colocada a 0 em dispositivos móveis independentemente do valor que é aqui colocado.",
"pdf-reader-settings-title": "Leitor de PDF",
"pdf-scroll-mode-label": "Modo de Scroll",
"pdf-scroll-mode-tooltip": "Como é feito o scroll pelas páginas. Vertical/Horizontal e Tocar para Paginar (sem scroll)",
"pdf-spread-mode-label": "Modo de Layout",
"pdf-spread-mode-tooltip": "Como as páginas devem ser dispostas. Individual ou dupla (ímpar/par)",
"pdf-theme-label": "Tema",
"pdf-theme-tooltip": "O tema de cores do leitor",
"reading-profile-series-settings-title": "Séries",
"reading-profile-library-settings-title": "Biblioteca",
"delete": "{{common.delete}}"
},
"reviews": {
"user-reviews-local": "Criticas Locais",
"user-reviews-plus": "Criticas Externas"
},
"review-modal": {
"title": "Editar Crítica",
"review-label": "Crítica",
"close": "{{common.close}}",
"save": "{{common.save}}",
"delete": "{{common.delete}}",
"min-length": "A crítica tem de ter no mínimo {{count}} caracteres",
"required": "{{validation.required-field}}"
},
"browse-people": {
"title": "Explorar Pessoas",
"author-count": "{{num}} Pessoas",
"cover-image-description": "{{edit-series-modal.cover-image-description}}",
"issue-count": "{{common.issue-count}}",
"series-count": "{{common.series-count}}",
"roles-label": "Funções",
"sort-label": "Ordenar",
"name-label": "Nome",
"issue-count-label": "Número de Edições",
"series-count-label": "Número de Séries"
},
"browse-genres": {
"title": "Explorar Géneros",
"genre-count": "{{num}} Géneros",
"issue-count": "{{common.issue-count}}",
"series-count": "{{common.series-count}}"
},
"browse-tags": {
"title": "Explorar Etiquetas",
"genre-count": "{{num}} Etiquetas",
"issue-count": "{{common.issue-count}}",
"series-count": "{{common.series-count}}"
},
"bulk-set-reading-profile-modal": {
"title": "Definir perfil de leitura",
"close": "{{common.close}}",
"filter-label": "{{common.filter}}",
"clear": "{{common.clear}}",
"no-data": "Ainda não foram criadas coleções",
"loading": "{{common.loading}}",
"create": "{{common.create}}",
"bound": "Vinculado"
},
"merge-person-modal": {
"title": "{{personName}}",
"close": "{{common.close}}",
"save": "{{common.save}}",
"src": "Juntar Pessoa",
"merge-warning": "Se continuar, a pessoa selecionada será removida. O nome da pessoa selecionada será adicionada como pseudónimo e todas as suas funções serão transferidas.",
"alias-title": "Novos pseudónimos",
"known-for-title": "Conhecido por"
},
"browse-title-pipe": {
"publication-status": "{{value}} trabalhos",
"age-rating": "Avaliado com {{value}}",
"user-rating": "{{value}} classificação em estrelas",
"tag": "Tem Etiqueta {{value}}",
"translator": "Traduzido por {{value}}",
"character": "Tem o personagem {{value}}",
"publisher": "Publicado por {{value}}",
"editor": "Editado por {{value}}",
"artist": "Desenhado por {{value}}",
"letterer": "Com letras de {{value}}",
"colorist": "Colorido por {{value}}",
"inker": "Arte-finalizado por {{value}}",
"penciller": "Desenhado por {{value}}",
"writer": "Escrito por {{value}}",
"genre": "Tem o Género {{value}}",
"library": "Dentro da biblioteca {{value}}",
"format": "Formato de {{value}}",
"release-year": "Lançado em {{value}}",
"imprint": "Impressão de {{value}}",
"team": "Equipa {{value}}",
"location": "Na localização {{value}}"
},
"generic-filter-field-pipe": {
"person-role": "Função",
"person-name": "Nome",
"person-series-count": "Número de Séries",
"person-chapter-count": "Número de Capítulos"
},
"breakpoint-pipe": {
"never": "Nunca",
"mobile": "Móvel",
"tablet": "Tablet",
"desktop": "Desktop"
}
}

View file

@ -50,7 +50,9 @@
"special": "{{entity-title.special}}",
"generate-scrobble-events": "Eventos de Preenchimento",
"token-expired": "Seu token AniList expirou! Os eventos de scrobbling não serão processados até que você renove na página Contas.",
"scrobbling-disabled": "O scrobbling está desativado nas configurações da sua conta."
"scrobbling-disabled": "O scrobbling está desativado nas configurações da sua conta.",
"select-all-label": "Selecionar tudo",
"delete-selected-label": "Excluir selecionado(s)"
},
"scrobble-event-type-pipe": {
"chapter-read": "Progresso da Leitura",
@ -820,7 +822,7 @@
"library-name-unique": "O nome da biblioteca deve ser exclusivo",
"last-scanned-label": "Último Escaneamento:",
"type-label": "Tipo",
"type-tooltip": "O tipo de biblioteca determina como os nomes dos arquivos são analisados e se a IU mostra Capítulos (mangá) versus Números (quadrinhos). Verifique o wiki para obter mais detalhes sobre as diferenças entre os tipos de biblioteca.",
"type-tooltip": "O tipo de biblioteca determina como os nomes dos arquivos são analisados e se a IU mostra Capítulos (mangá) versus Edições (quadrinhos). Verifique o wiki para obter mais detalhes sobre as diferenças entre os tipos de biblioteca.",
"kavitaplus-eligible-label": "Kavita+ Elegível",
"kavitaplus-eligible-tooltip": "Kavita+ suporta as capacidades de metadados ou Scrobbling",
"folder-description": "Adicionar pastas à sua biblioteca",
@ -858,7 +860,9 @@
"exclude-patterns-tooltip": "Configure um conjunto de padrões (sintaxe Glob) que Kavita corresponderá ao verificar diretórios e excluirá dos resultados do Scanner.",
"help": "{{common.help}}",
"allow-metadata-matching-label": "Permitir Correspondência de Metadados",
"allow-metadata-matching-tooltip": "Deve o Kavita baixar os metadados para Séries nesta Biblioteca. Isso só ocorrerá se o servidor tiver uma Assinatura Kavita+ ativa."
"allow-metadata-matching-tooltip": "Deve o Kavita baixar os metadados para Séries nesta Biblioteca. Isso só ocorrerá se o servidor tiver uma Assinatura Kavita+ ativa.",
"enable-metadata-label": "Habilitar metadados (ComicInfo/Epub/PDF)",
"enable-metadata-tooltip": "Permitir que o Kavita leia arquivos de metadados que substituem a análise de nomes de arquivos."
},
"file-type-group-pipe": {
"archive": "Arquivo",
@ -1149,7 +1153,7 @@
"log-label": "Dias de Registros",
"log-tooltip": "O número de registros a serem mantidos. O padrão é 30, o mínimo é 1 e o máximo é 30.",
"logging-level-label": "Nível de Registro",
"logging-level-tooltip": "Use a depuração para ajudar a identificar problemas. A depuração pode consumir muito espaço em disco.",
"logging-level-tooltip": "Use a depuração para identificar problemas. A depuração pode consumir muito espaço em disco.",
"cache-size-label": "Tamanho do Cache",
"cache-size-tooltip": "A quantidade de memória permitida para cache de APIs pesadas. O padrão é 75 MB.",
"on-deck-last-progress-label": "Última Leitura Na Estante (dias)",
@ -1541,7 +1545,7 @@
"import-description": "Para começar, importe um arquivo .cbl. O Kavita executará várias verificações antes de importar. Algumas etapas bloquearão o avanço devido a problemas com o arquivo.",
"validate-description": "Todos os arquivos foram validados para verificar se há alguma operação a ser feita na lista. Quaisquer listas que falharam não passarão para a próxima etapa. Corrija os arquivos CBL e tente novamente.",
"validate-warning": "Existem problemas com o CBL que impedirão uma importação. Corrija esses problemas e tente novamente.",
"validate-no-issue-description": "Nenhum problema encontrado com CBL, pressione próximo.",
"validate-no-issue-description": "Nenhum problema encontrado com CBL, pressione seguinte.",
"dry-run-description": "Esta é uma simulação e mostra o que acontecerá se você pressionar Avançar e executar a importação. Todas as falhas não serão importadas.",
"prev": "Anterior",
"import": "Importar",
@ -1757,7 +1761,7 @@
"chapter-title": "Capítulo",
"volume-num": "{{common.volume-num}}",
"highest-count-tooltip": "Número mais alto encontrado em todos os ComicInfo da Série",
"max-issue-tooltip": "Campo Máx. de Número ou Volume de todos ComicInfo nas Séries",
"max-issue-tooltip": "Campo Máx. de Edições ou Volume de todos ComicInfo nas Séries",
"force-refresh": "Forçar Atualização",
"force-refresh-tooltip": "Forçar a atualização de metadados externos do Kavita+",
"loose-leaf-volume": "Capítulos de Folhas Soltas",
@ -2189,7 +2193,7 @@
"confirm-library-delete": "Tem certeza de que deseja excluir a biblioteca {{name}}? Você não pode desfazer esta ação.",
"confirm-library-type-change": "Alterar o tipo de biblioteca acionará uma nova verificação com regras de análise diferentes e poderá levar à recriação de séries e, portanto, você poderá perder progresso e marcadores. Você deve fazer backup antes de fazer isso. Tem certeza de que deseja continuar?",
"confirm-download-size": "O {{entityType}} é {{size}}. Você tem certeza que quer continuar?",
"confirm-download-size-ios": "O iOS tem problemas para baixar arquivos maiores que 200 MB; esse download pode não ser concluído.",
"confirm-download-size-ios": "O iOS tem problemas para baixar arquivos maiores que 200 MB, esse download pode não ser concluído.",
"list-doesnt-exist": "Esta lista não existe",
"confirm-delete-smart-filter": "Tem certeza de que deseja excluir este Filtro Inteligente?",
"smart-filter-deleted": "Filtro Inteligente Excluído",
@ -2226,7 +2230,8 @@
"confirm-delete-multiple-volumes": "Tem certeza de que deseja excluir {{count}} volumes? Isso não modificará os arquivos no disco.",
"series-added-want-to-read": "Série adicionada da lista Quero Ler",
"library-bound-to-reading-profile": "Biblioteca vinculada ao Perfil de Leitura {{name}}",
"series-bound-to-reading-profile": "Série vinculada ao Perfil de Leitura {{name}}"
"series-bound-to-reading-profile": "Série vinculada ao Perfil de Leitura {{name}}",
"external-match-rate-error": "Kavita ficou sem taxa ao procurar {{seriesName}}. Tente novamente em 5 minutos."
},
"read-time-pipe": {
"less-than-hour": "<1 Hora",
@ -2413,8 +2418,8 @@
"series-count": "{{num}} Séries",
"item-count": "{{num}} Itens",
"book-num": "Livro",
"issue-hash-num": "Número #",
"issue-num": "Número",
"issue-hash-num": "Edição #",
"issue-num": "Edição",
"chapter-num": "Capítulo",
"volume-num": "Volume",
"chapter-num-shorthand": "Cap. {{num}}",
@ -2603,15 +2608,15 @@
"overrides-label": "Substituir",
"enable-chapter-title-label": "Título",
"enable-chapter-publisher-label": "Editora",
"enable-chapter-publisher-tooltip": "Permitir que a Editora do Capítulo/Número seja salvo",
"enable-chapter-publisher-tooltip": "Permitir que a Editora do Capítulo/Edição seja salvo",
"enable-chapter-cover-label": "Capa do Capítulo",
"enable-chapter-cover-tooltip": "Permitir que a Capa do Capítulo/Número seja definida",
"enable-chapter-cover-tooltip": "Permitir que a Capa do Capítulo/Edição seja definida",
"chapter-header": "Campos de Capítulo",
"enable-chapter-title-tooltip": "Permitir que o Título do Capítulo/Número seja salvo",
"enable-chapter-title-tooltip": "Permitir que o Título do Capítulo/Edição seja salvo",
"enable-chapter-summary-label": "{{manage-metadata-settings.summary-label}}",
"enable-chapter-summary-tooltip": "{{manage-metadata-settings.summary-tooltip}}",
"enable-chapter-release-date-label": "Data de Lançamento",
"enable-chapter-release-date-tooltip": "Permitir que a Data de Lançamento do Capítulo/Número seja salvo"
"enable-chapter-release-date-tooltip": "Permitir que a Data de Lançamento do Capítulo/Edição seja salvo"
},
"metadata-setting-field-pipe": {
"publication-status": "{{edit-series-modal.publication-status-title}}",

View file

@ -50,7 +50,9 @@
"volume-num": "Zväzok {{num}}",
"generate-scrobble-events": "Záložné udalosti",
"token-expired": "Platnosť vášho tokenu AniList vypršala! Scrobbling udalosti sa spracujú až po obnovení na stránke Účty.",
"scrobbling-disabled": "Scrobblovanie je zakázané v nastaveniach vášho účtu."
"scrobbling-disabled": "Scrobblovanie je zakázané v nastaveniach vášho účtu.",
"select-all-label": "Vybrať všetko",
"delete-selected-label": "Odstrániť vybraté"
},
"scrobble-event-type-pipe": {
"chapter-read": "Pokrok v čítaní",
@ -787,7 +789,7 @@
},
"side-nav": {
"home": "Domov",
"want-to-read": "Chcem čítať",
"want-to-read": "Obľúbené",
"collections": "Zbierky",
"reading-lists": "Čítacie Zoznamy",
"bookmarks": "Záložky",
@ -800,7 +802,8 @@
"more": "Viac",
"customize": "{{settings.customize}}",
"edit": "{{common.edit}}",
"cancel-edit": "Zavrieť zmenu poradia"
"cancel-edit": "Zavrieť zmenu poradia",
"browse-people": "Prehľadávať ľudí"
},
"library-settings-modal": {
"close": "{{common.close}}",
@ -853,7 +856,9 @@
"type-tooltip": "Typ knižnice určuje, ako sa analyzujú názvy súborov a či používateľské rozhranie zobrazuje kapitoly (manga) vs. čísla (komiksy). Viac podrobností o rozdieloch medzi typmi knižníc nájdete na wiki.",
"kavitaplus-eligible-label": "Kavita+ Oprávnené",
"allow-metadata-matching-label": "Povoliť zhodu metadát",
"allow-metadata-matching-tooltip": "Mala by Kavita stiahnuť metadáta pre série v rámci tejto knižnice. Toto sa uskutoční len vtedy, ak má server aktívne predplatné Kavita+."
"allow-metadata-matching-tooltip": "Mala by Kavita stiahnuť metadáta pre série v rámci tejto knižnice. Toto sa uskutoční len vtedy, ak má server aktívne predplatné Kavita+.",
"enable-metadata-label": "Povoliť metadáta (ComicInfo/Epub/PDF)",
"enable-metadata-tooltip": "Povoliť Kavite čítať súbory s metadátami, ktoré prepíšu analýzu názvov súborov."
},
"file-type-group-pipe": {
"archive": "Archív",
@ -1461,7 +1466,9 @@
"all-filters": "Smart Filtre",
"close": "{{common.close}}",
"nav-link-header": "Možnosti navigácie",
"person-aka-status": "Zhoduje sa s aliasom"
"person-aka-status": "Zhoduje sa s aliasom",
"browse-tags": "Prehľadávať značky",
"browse-genres": "Prehľadávať žánre"
},
"promoted-icon": {
"promoted": "{{common.promoted}}"
@ -1500,7 +1507,7 @@
"title": "MAL záujmy Stack Importovanie",
"nothing-found": "Nič sa nenašlo",
"description": "Importujte svoje MAL záujmy Stacks a vytvorte zbierky v rámci Kavita",
"restack-count": "{{num}} Restacks",
"restack-count": "{{num}} Restackov",
"track": "Skladba"
},
"edit-chapter-progress": {
@ -1646,7 +1653,10 @@
"release-year": "Rok vydania",
"read-progress": "Naposledy čítané",
"average-rating": "Priemerné hodnotenie",
"random": "Náhodný"
"random": "Náhodný",
"person-chapter-count": "Počet kapitol",
"person-name": "Meno",
"person-series-count": "Počet sérií"
},
"edit-series-modal": {
"title": "Podrobnosti o {{seriesName}}",
@ -1993,7 +2003,7 @@
"reading-lists": "{{side-nav.reading-lists}}",
"bookmarks": "{{side-nav.bookmarks}}",
"all-series": "{{side-nav.all-series}}",
"browse-authors": "{{side-nav.browse-authors}}"
"browse-authors": "{{side-nav.browse-people}}"
},
"filter-field-pipe": {
"age-rating": "{{metadata-fields.age-rating-title}}",
@ -2066,7 +2076,7 @@
"series-added-to-collection": "Séria bola pridaná do zbierky {{collectionName}}",
"no-series-collection-warning": "POZOR! Nie sú vybraté žiadne série, uložením sa zbierka odstráni. Ste si istý, že chcete pokračovať?",
"collection-updated": "Zbierka bola aktualizovaná",
"reading-list-deleted": "Zoznam na čítanie bol odstránený",
"reading-list-deleted": "Zoznam na čítanie bo zmazaný",
"reading-list-updated": "Zoznam na čítanie bol aktualizovaný",
"confirm-delete-reading-list": "Naozaj chcete vymazať zoznam na čítanie? Toto nie je možné vrátiť späť.",
"item-removed": "Položka bola odstránená",
@ -2171,7 +2181,8 @@
"library-bound-to-reading-profile": "Knižnica prepojená s čitateľským profilom {{name}}",
"scrobble-gen-init": "Zaradená úloha na generovanie udalostí Scrobblingu z histórie čítania a hodnotení v minulosti a ich synchronizáciu s pripojenými službami.",
"series-added-want-to-read": "Séria bola pridaná zo zoznamu Chcem si prečítať",
"series-bound-to-reading-profile": "Séria viazaná na čitateľský profil {{name}}"
"series-bound-to-reading-profile": "Séria viazaná na čitateľský profil {{name}}",
"external-match-rate-error": "Kavite došla sadzba pri hľadaní {{seriesName}}. Skúste to znova o 5 minút."
},
"actionable": {
"scan-library": "Skenovať knižnicu",
@ -2338,7 +2349,8 @@
"volume-nums": "Zväzky",
"issue-nums": "Vydania",
"chapter-count": "{{num}} kapitol",
"no-data": "Žiadne údaje"
"no-data": "Žiadne údaje",
"issue-count": "{{num}} Problémov"
},
"person-detail": {
"all-roles": "Roly",
@ -2511,7 +2523,9 @@
"library-name-header": "Knižnica",
"actions-header": "Akcie",
"dont-match-status-label": "{{dont-match-label}}",
"match-alt": "Zhoda {{seriesName}}"
"match-alt": "Zhoda {{seriesName}}",
"matched-state-label": "Stav zhody",
"library-type": "Typ knižnice"
},
"match-series-modal": {
"description": "Vyberte zhodu na opätovné prepojenie metadát Kavita+ a regeneráciu scrobble udalostí. \"Nezhoda\" sa dá použiť na obmedzenie Kavity v zhode metadát a scrobblingu.",
@ -2680,7 +2694,7 @@
"selection-tip": "Vyberte profil zo zoznamu alebo si vytvorte nový v pravom hornom rohu",
"font-size-book-tooltip": "Percentuálna zmena mierky, ktorá sa má použiť na písmo v knihe",
"line-height-book-tooltip": "Aké medzery medzi riadkami v knihe",
"extra-tip": "Priraďte čitateľské profily prostredníctvom ponuky akcií v sériách a knižniciach alebo hromadne. Pri zmene nastavení v čítačke sa vytvorí skrytý profil, ktorý si pamätá vaše voľby pre danú sériu (nie pre súbory PDF). Tento profil sa odstráni, keď k sérii priradíte alebo aktualizujete jeden z vlastných čitateľských profilov.",
"extra-tip": "Priraďte čitateľské profily prostredníctvom ponuky akcií v sériách a knižniciach alebo hromadne. Pri zmene nastavení v čítačke sa vytvorí skrytý profil, ktorý si pamätá vaše voľby pre danú sériu (nie pre súbory PDF). Tento profil sa odstráni, keď k sérii priradíte jeden z vlastných čitateľských profilov. Viac informácií nájdete na",
"default-profile": "Predvolené",
"add-tooltip": "Váš nový profil bude uložený po vykonaní zmien",
"make-default": "Nastaviť ako predvolené",
@ -2713,7 +2727,10 @@
"font-family-tooltip": "Skupina písiem, ktoré sa majú načítať. Predvolené načíta predvolené písmo knihy",
"color-theme-book-tooltip": "Akú farebnú tému použiť na obsah a ponuku čítačky kníh",
"reading-mode-label": "Režim čítania",
"pdf-theme-label": "Téma"
"pdf-theme-label": "Téma",
"wiki-title": "wiki",
"disable-width-override-tooltip": "Zabráňte tomu, aby sa prepísanie šírky prejavilo, keď je obrazovka aspoň na úrovni nakonfigurovaného bodu zlomu alebo menšia",
"disable-width-override-label": "Zakázať prepísanie šírky"
},
"bulk-set-reading-profile-modal": {
"close": "{{common.close}}",
@ -2737,5 +2754,64 @@
"delete": "{{common.delete}}",
"min-length": "Recenzia musí mať aspoň {{count}} znakov",
"required": "{{validation.required-field}}"
},
"browse-people": {
"title": "Prehľadávať ľudí",
"name-label": "Meno",
"series-count-label": "Počet sérií",
"roles-label": "Roly",
"sort-label": "Usporiadať",
"issue-count": "{{common.issue-count}}",
"series-count": "{{common.series-count}}",
"cover-image-description": "{{edit-series-modal.cover-image-description}}",
"issue-count-label": "Počet vydaní",
"author-count": "{{num}} Ľudia"
},
"browse-genres": {
"title": "Prehľadávať žánre",
"genre-count": "{{num}} Žánrov",
"issue-count": "{{common.issue-count}}",
"series-count": "{{common.series-count}}"
},
"browse-tags": {
"genre-count": "Značky ({{num}})",
"series-count": "{{common.series-count}}",
"title": "Prehľadávať značky",
"issue-count": "{{common.issue-count}}"
},
"browse-title-pipe": {
"user-rating": "Hodnotenie hviezdičkami: {{value}}",
"translator": "Preložil/a {{value}}",
"character": "Má charakter {{value}}",
"publisher": "Publikované {{value}}",
"editor": "Upravené {{value}}",
"colorist": "Kolorizované {{value}}",
"inker": "Tlačené {{value}}",
"penciller": "Kreslené {{value}}",
"writer": "Napísal/a {{value}}",
"letterer": "Spísané {{value}}",
"format": "Formát {{value}}",
"release-year": "Vydané v {{value}}",
"imprint": "Odtlačok {{value}}",
"publication-status": "{{value}} funguje",
"age-rating": "Hodnotené ako {{value}}",
"tag": "Má značku {{value}}",
"genre": "Má žáner {{value}}",
"team": "Tím {{value}}",
"location": "V lokalite {{value}}",
"artist": "Nakreslené {{value}}",
"library": "V knižnici {{value}}"
},
"generic-filter-field-pipe": {
"person-name": "Meno",
"person-series-count": "Počet sérií",
"person-chapter-count": "Počet kapitol",
"person-role": "Rola"
},
"breakpoint-pipe": {
"never": "Nikdy",
"mobile": "Mobil",
"tablet": "Tablet",
"desktop": "Desktop"
}
}

View file

@ -5,15 +5,16 @@
"password": "{{common.password}}",
"password-validation": "{{validation.password-validation}}",
"forgot-password": "ลืมรหัสผ่าน?",
"submit": "ตกลง"
"submit": "เข้าสู่ระบบ"
},
"dashboard": {
"no-libraries": "ยังไม่ได้ตั้งค่ารายการหนังสือ กรุณาตั้งค่าใน",
"server-settings-link": "ตั้งค่าเซิฟเวอร์",
"not-granted": "คุณไม่ได้มีสิทธิ์ในการเข้าถึงรายการหนังสือ",
"no-libraries": "ยังไม่ได้ตั้งค่าห้องสมุด สร้างใหม่เพิ่มใน",
"server-settings-link": "ตั้งค่าเซิร์ฟเวอร์",
"not-granted": "คุณไม่ได้มีสิทธิ์ในการเข้าถึงห้องสมุด",
"on-deck-title": "กำลังอ่าน",
"recently-updated-title": "ซีรี่ย์ที่เพิ่งอัพเดท",
"recently-added-title": "ซีรี่ย์ใหม่"
"recently-updated-title": "เรื่องที่อัพเดทล่าสุด",
"recently-added-title": "เรื่องที่เพิ่มใหม่",
"more-in-genre-title": "ดูเพิ่มใน {{genre}}"
},
"edit-user": {
"edit": "{{common.edit}}",
@ -22,32 +23,36 @@
"required": "{{validation.required-field}}",
"email": "{{common.email}}",
"cancel": "{{common.cancel}}",
"saving": "กำลังบันทึก…",
"update": "อัปเดท"
"saving": "กำลังจัดเก็บ…",
"update": "อัพเดท",
"invalid-email-warning": "อีเมล์ที่ไม่ถูกต้องจะปิดกั้นบางฟังก์ชั่นของ Kavita",
"account-detail-title": "รายละเอียดบัญชี"
},
"user-scrobble-history": {
"title": "ประวัติการทำ Scrobble",
"description": "ที่นี่คุณสามารถดูรายการ Scrobble ที่เกิดขึ้นภายใต้บัญชีคุณได้ โดยรายการจะเกิดขึ้นก็ต่อเมื่อคุณได้ตั้งค่า Scrobble เรียบร้อยแล้ว รายการต่างๆ จะถูกลบเมื่อผ่านไปหนึ่งเดือน ถ้ามีรายการที่ยังไม่ถูกประมวลผล นั่นหมายความว่าอาจเกิดปัญหาที่ต้นทาง กรุณาติดต่อผู้ดูแลระบบเพื่อแก้ไขปัญหานี้",
"filter-label": "{{common.filter}}",
"created-header": "สร้างแล้ว",
"created-header": "สร้างเมื่อ",
"last-modified-header": "แก้ไขล่าสุด",
"type-header": "ชนิด",
"series-header": "ซีรีส์",
"type-header": "ประเภท",
"series-header": "เรื่อง",
"data-header": "ข้อมูล",
"is-processed-header": "กำลังดำเนินการ",
"no-data": "ไม่มีข้อมูล",
"volume-and-chapter-num": "เล่มที่ {{v}} บทที่ {{n}}",
"no-data": "{{common.no-data}}",
"volume-and-chapter-num": "เล่มที่ {{v}} ตอนที่ {{n}}",
"volume-num": "เล่มที่ {{num}}",
"chapter-num": "บทที่ {{num}}",
"rating": "เรตติ้ง {{r}}",
"chapter-num": "ตอนที่ {{num}}",
"rating": "คะแนน {{r}}",
"not-applicable": "ไม่สามารถใช้ได้",
"processed": "ดำเนินการ",
"not-processed": "ยังไม่ได้ประมวลผล",
"special": "{{entity-title.special}}"
"special": "{{entity-title.special}}",
"select-all-label": "เลือกทั้งหมด",
"delete-selected-label": "ลบที่เลือก"
},
"scrobble-event-type-pipe": {
"chapter-read": "ความคืบหน้าการอ่าน",
"score-updated": "อัปเดทเรตติ้ง",
"score-updated": "อัพเดทคะแนน",
"want-to-read-add": "ต้องการอ่าน: เพิ่ม",
"want-to-read-remove": "ต้องการอ่าน: นำออก",
"review": "อัปเดทรีวิว"

View file

@ -50,7 +50,9 @@
"special": "{{entity-title.special}}",
"token-expired": "您的 AniList 令牌已过期!除非您在“帐户”页面续订,否则不会处理 Scrobbling 事件。",
"generate-scrobble-events": "回填事件",
"scrobbling-disabled": "您的帐户设置中已禁用 Scrobbling。"
"scrobbling-disabled": "您的帐户设置中已禁用 Scrobbling。",
"select-all-label": "全选",
"delete-selected-label": "删除选定项"
},
"scrobble-event-type-pipe": {
"chapter-read": "阅读进度",
@ -858,7 +860,9 @@
"exclude-patterns-tooltip": "配置一组模式Glob语法Kavita 将在扫描目录时匹配这些模式,并将其从扫描程序结果中排除。",
"help": "{{common.help}}",
"allow-metadata-matching-label": "允许元数据匹配",
"allow-metadata-matching-tooltip": "Kavita 是否应下载此库中系列的元数据。仅当服务器具有有效的 Kavita+ 订阅时才会发生这种情况。"
"allow-metadata-matching-tooltip": "Kavita 是否应下载此库中系列的元数据。仅当服务器具有有效的 Kavita+ 订阅时才会发生这种情况。",
"enable-metadata-label": "启用元数据ComicInfo/Epub/PDF",
"enable-metadata-tooltip": "允许 Kavita 读取覆盖文件名解析的元数据文件。"
},
"file-type-group-pipe": {
"archive": "档案",
@ -988,7 +992,7 @@
},
"edit-series-relation": {
"description-part-1": "不确定添加哪一种关联?请查看",
"description-part-2": "维基百科的提示。",
"description-part-2": "Wiki 提示。",
"target-series": "目标系列",
"relationship": "关联",
"remove": "{{common.remove}}",
@ -1019,7 +1023,7 @@
},
"manage-media-issues": {
"description-part-1": "此列表包含在扫描或读取媒体期间发现的问题。您可以随时清除它并使用资料库(强制)扫描进行分析。一些常见错误及其含义的列表可在以下位置找到 ",
"description-part-2": "维基百科。",
"description-part-2": "wiki.",
"filter-label": "{{common.filter}}",
"clear-alerts": "清除警报",
"file-header": "文件",
@ -2226,7 +2230,8 @@
"confirm-delete-multiple-volumes": "您确定要删除这 {{count}} 个卷吗?这不会修改磁盘上的文件。",
"series-added-want-to-read": "从“想读”列表中添加的系列",
"series-bound-to-reading-profile": "系列绑定到阅读配置文件 {{name}}",
"library-bound-to-reading-profile": "资料库绑定到阅读配置文件 {{name}}"
"library-bound-to-reading-profile": "资料库绑定到阅读配置文件 {{name}}",
"external-match-rate-error": "Kavita 查找 {{seriesName}} 的速度已超出范围。请过 5 分钟再试。"
},
"read-time-pipe": {
"less-than-hour": "<1 小时",
@ -2736,7 +2741,7 @@
"reset": "{{common.reset}}",
"selection-tip": "从列表中选择一个配置文件,或在右上角创建一个新的配置文件",
"add-tooltip": "您的新配置文件将在更改后保存",
"wiki-title": "维基百科",
"wiki-title": "wiki",
"disable-width-override-label": "禁用宽度覆盖",
"disable-width-override-tooltip": "当屏幕尺寸至少等于或小于配置的断点时,防止宽度覆盖生效"
},

File diff suppressed because it is too large Load diff

View file

@ -2,12 +2,12 @@
"openapi": "3.0.4",
"info": {
"title": "Kavita",
"description": "Kavita provides a set of APIs that are authenticated by JWT. JWT token can be copied from local storage. Assume all fields of a payload are required. Built against v0.8.6.18",
"description": "Kavita provides a set of APIs that are authenticated by JWT. JWT token can be copied from local storage. Assume all fields of a payload are required. Built against v0.8.7.0",
"license": {
"name": "GPL-3.0",
"url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE"
},
"version": "0.8.6.18"
"version": "0.8.7.0"
},
"servers": [
{
@ -18338,6 +18338,32 @@
"type": "string",
"nullable": true
},
"kPlusOverrides": {
"type": "array",
"items": {
"enum": [
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14
],
"type": "integer",
"description": "Represents which field that can be written to as an override when already locked",
"format": "int32"
},
"description": "Tracks which metadata has been set by K+",
"nullable": true
},
"averageExternalRating": {
"type": "number",
"description": "(Kavita+) Average rating from Kavita+ metadata",
@ -21345,6 +21371,10 @@
"type": "boolean",
"description": "Should Kavita read metadata files from the library"
},
"removePrefixForSortName": {
"type": "boolean",
"description": "Should Kavita remove sort articles \"The\" for the sort name"
},
"created": {
"type": "string",
"format": "date-time"
@ -21507,6 +21537,10 @@
"enableMetadata": {
"type": "boolean",
"description": "Allow Kavita to read metadata (ComicInfo.xml, Epub, PDF)"
},
"removePrefixForSortName": {
"type": "boolean",
"description": "Should Kavita remove sort articles \"The\" for the sort name"
}
},
"additionalProperties": false
@ -24431,6 +24465,32 @@
"description": "A Comma-separated list of strings representing links from the series",
"nullable": true
},
"kPlusOverrides": {
"type": "array",
"items": {
"enum": [
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14
],
"type": "integer",
"description": "Represents which field that can be written to as an override when already locked",
"format": "int32"
},
"description": "Tracks which metadata has been set by K+",
"nullable": true
},
"languageLocked": {
"type": "boolean"
},
@ -26386,6 +26446,7 @@
"manageCollections",
"manageReadingLists",
"name",
"removePrefixForSortName",
"type"
],
"type": "object",
@ -26440,6 +26501,9 @@
"enableMetadata": {
"type": "boolean"
},
"removePrefixForSortName": {
"type": "boolean"
},
"fileGroupTypes": {
"type": "array",
"items": {