From bc8eef1353fb73c93e1779f6f2dfa858771c0c9a Mon Sep 17 00:00:00 2001 From: Fesaa <77553571+Fesaa@users.noreply.github.com> Date: Sun, 18 Jan 2026 23:38:42 +0100 Subject: [PATCH] v0.8.9.1 Hotfix (#4376) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Joe Milazzo Co-authored-by: Weblate (bot) Co-authored-by: Adam Havránek Co-authored-by: Aindriú Mac Giolla Eoin Co-authored-by: Christophorus Daniel Tegar P Co-authored-by: Frozehunter Co-authored-by: Gregory.Open Co-authored-by: Havokdan Co-authored-by: Kovács Gábor Co-authored-by: karigane <169052233+karigane-cha@users.noreply.github.com> Co-authored-by: lin49931104 Co-authored-by: Максим Горпиніч Co-authored-by: 無情天 Co-authored-by: 안세훈 --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- API.Tests/AbstractDbTest.cs | 2 + .../Services/CollectionTagServiceTests.cs | 4 +- .../Services/ReadingHistoryServiceTests.cs | 6 +- API/Controllers/AccountController.cs | 2 +- API/Controllers/BaseApiController.cs | 5 + API/Controllers/PluginController.cs | 10 +- API/I18N/ja.json | 4 +- API/I18N/zh_Hant.json | 5 +- .../AuthKeyAuthenticationHandler.cs | 3 +- API/Services/Reading/ReaderService.cs | 4 +- API/Services/SiteThemeService.cs | 8 +- Kavita.Common/Kavita.Common.csproj | 4 +- UI/Web/src/app/_services/theme.service.ts | 13 +- .../manage-media-issues.component.html | 2 +- .../manage-media-issues.component.ts | 33 +- .../manage-scrobble-errors.component.ts | 31 +- .../manga-reader/manga-reader.component.ts | 4 +- .../file-breakdown-stats.component.html | 13 +- .../file-breakdown-stats.component.ts | 68 +- .../publication-status-stats.component.html | 4 +- .../publication-status-stats.component.ts | 36 +- .../manage-user-preferences.component.ts | 11 +- UI/Web/src/assets/langs/ca.json | 1 - UI/Web/src/assets/langs/cs.json | 4 +- UI/Web/src/assets/langs/de.json | 14 +- UI/Web/src/assets/langs/es.json | 1 - UI/Web/src/assets/langs/fr.json | 58 +- UI/Web/src/assets/langs/ga.json | 4 +- UI/Web/src/assets/langs/hu.json | 83 ++- UI/Web/src/assets/langs/id.json | 32 + UI/Web/src/assets/langs/it.json | 1 - UI/Web/src/assets/langs/ja.json | 661 +++++++++++++----- UI/Web/src/assets/langs/ko.json | 3 +- UI/Web/src/assets/langs/pl.json | 1 - UI/Web/src/assets/langs/pt.json | 1 - UI/Web/src/assets/langs/pt_BR.json | 4 +- UI/Web/src/assets/langs/sk.json | 1 - UI/Web/src/assets/langs/sv.json | 1 - UI/Web/src/assets/langs/ta.json | 3 +- UI/Web/src/assets/langs/tr.json | 3 - UI/Web/src/assets/langs/uk.json | 4 +- UI/Web/src/assets/langs/vi.json | 1 - UI/Web/src/assets/langs/zh_Hans.json | 4 +- UI/Web/src/assets/langs/zh_Hant.json | 607 +++++++++++++--- 45 files changed, 1279 insertions(+), 487 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 5810eb749..a289354d6 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -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.9 - Stable + - 0.8.9.1 - Stable - Nightly Testing Branch validations: required: true diff --git a/API.Tests/AbstractDbTest.cs b/API.Tests/AbstractDbTest.cs index 0303e4204..79fa075c8 100644 --- a/API.Tests/AbstractDbTest.cs +++ b/API.Tests/AbstractDbTest.cs @@ -57,6 +57,8 @@ public abstract class AbstractDbTest(ITestOutputHelper testOutputHelper): Abstra GlobalConfiguration.Configuration.UseInMemoryStorage(); var unitOfWork = new UnitOfWork(_context, mapper, null); + _context.ChangeTracker.Clear(); + return (unitOfWork, _context, mapper); } diff --git a/API.Tests/Services/CollectionTagServiceTests.cs b/API.Tests/Services/CollectionTagServiceTests.cs index 9bf1111ee..e6b0b5000 100644 --- a/API.Tests/Services/CollectionTagServiceTests.cs +++ b/API.Tests/Services/CollectionTagServiceTests.cs @@ -8,11 +8,13 @@ using API.Data.Repositories; using API.DTOs.Collection; using API.Entities; using API.Entities.Enums; +using API.Extensions.QueryExtensions; using API.Helpers.Builders; using API.Services; using API.Services.Plus; using API.SignalR; using Kavita.Common; +using Microsoft.EntityFrameworkCore; using NSubstitute; using Xunit; using Xunit.Abstractions; @@ -516,7 +518,7 @@ public class CollectionTagServiceTests(ITestOutputHelper outputHelper): Abstract // Add a third series with a different age rating var s3 = new SeriesBuilder("Series 3").WithMetadata(new SeriesMetadataBuilder().WithAgeRating(AgeRating.PG).Build()).Build(); - context.Library.First().Series.Add(s3); + context.Library.Includes(LibraryIncludes.Series).First().Series.Add(s3); await unitOfWork.CommitAsync(); // Add series 3 to tag 2 diff --git a/API.Tests/Services/ReadingHistoryServiceTests.cs b/API.Tests/Services/ReadingHistoryServiceTests.cs index d0deda52e..c1c340429 100644 --- a/API.Tests/Services/ReadingHistoryServiceTests.cs +++ b/API.Tests/Services/ReadingHistoryServiceTests.cs @@ -2,10 +2,12 @@ using System; using System.Linq; using System.Threading.Tasks; using API.Data; +using API.Data.Repositories; using API.DTOs.Progress; using API.Entities; using API.Entities.Enums; using API.Entities.Progress; +using API.Extensions.QueryExtensions; using API.Helpers.Builders; using API.Services.Reading; using Microsoft.EntityFrameworkCore; @@ -30,7 +32,7 @@ public class ReadingHistoryServiceTests(ITestOutputHelper testOutputHelper) : Ab var service = Setup(dataContext); // Setup data - var lib = await dataContext.Library.FirstAsync(); + var lib = await dataContext.Library.Includes(LibraryIncludes.Series).FirstAsync(); lib.Series.Add(new SeriesBuilder("Test") .WithVolume(new VolumeBuilder("1").WithChapter(new ChapterBuilder("1").WithPages(2).Build()).Build()) .Build()); @@ -72,7 +74,7 @@ public class ReadingHistoryServiceTests(ITestOutputHelper testOutputHelper) : Ab var service = Setup(dataContext); // Setup data - var lib = await dataContext.Library.FirstAsync(); + var lib = await dataContext.Library.Includes(LibraryIncludes.Series).FirstAsync(); lib.Series.Add(new SeriesBuilder("Test") .WithVolume(new VolumeBuilder("1").WithChapter(new ChapterBuilder("1").WithPages(2).Build()).Build()) .Build()); diff --git a/API/Controllers/AccountController.cs b/API/Controllers/AccountController.cs index 302302e6a..b142d628e 100644 --- a/API/Controllers/AccountController.cs +++ b/API/Controllers/AccountController.cs @@ -88,7 +88,7 @@ public class AccountController : BaseApiController /// Returns true if OIDC authentication cookies are present and the /// scheme has been registered /// - /// Makes not guarantee about their validity + /// Makes no guarantee about their validity /// [AllowAnonymous] [HttpGet("oidc-authenticated")] diff --git a/API/Controllers/BaseApiController.cs b/API/Controllers/BaseApiController.cs index d32eb1eca..87e9b9f42 100644 --- a/API/Controllers/BaseApiController.cs +++ b/API/Controllers/BaseApiController.cs @@ -37,6 +37,11 @@ public class BaseApiController : ControllerBase /// Warning! Username's can contain .. and /, do not use folders or filenames explicitly with the Username protected string? Username => UserContext.GetUsername(); + /// + /// Returns the auth key used for authentication, null if a different authentication method was used + /// + protected string? AuthKey => User.Claims.FirstOrDefault(c => c.Type == "AuthKey")?.Value; + /// /// Returns a physical file with proper HTTP caching headers and ETag support. /// Automatically handles conditional requests (If-None-Match) returning 304 Not Modified when appropriate. diff --git a/API/Controllers/PluginController.cs b/API/Controllers/PluginController.cs index 7f10b8016..469bb8ebb 100644 --- a/API/Controllers/PluginController.cs +++ b/API/Controllers/PluginController.cs @@ -81,8 +81,14 @@ public class PluginController(IUnitOfWork unitOfWork, ITokenService tokenService /// Will always return null if the Auth Key does not belong to this account /// [HttpGet("authkey-expires")] - public async Task> GetAuthKeyExpiration([Required] string authKey) + public async Task> GetAuthKeyExpiration() { - return Ok(await unitOfWork.UserRepository.GetAuthKeyExpiration(authKey, UserId)); + var authKey = AuthKey; + if (string.IsNullOrEmpty(authKey)) + return BadRequest(); + + var exp = await unitOfWork.UserRepository.GetAuthKeyExpiration(authKey, UserId); + + return Ok(new { ExpiresAt = exp?.ToUniversalTime() }); } } diff --git a/API/I18N/ja.json b/API/I18N/ja.json index 156fcdce3..97bddcb5a 100644 --- a/API/I18N/ja.json +++ b/API/I18N/ja.json @@ -30,7 +30,7 @@ "generic-user-update": "ユーザーの更新時に例外が発生しました", "generic-user-email-update": "ユーザーのメールアドレスを更新できません。ログを確認してください。", "collection-updated": "コレクションは正常に更新されました", - "critical-email-migration": "メール移行中に問題が発生しました。サポートに連絡してください", + "critical-email-migration": "メール移行中に問題が発生しました。サポートにお問い合わせください", "invalid-email": "ユーザーに登録されているメールアドレスは無効です。リンクについてはログをご確認ください。", "user-already-invited": "ユーザーは既にこのメールで招待されていますが、まだ招待を承諾していません。", "collection-doesnt-exist": "コレクションは存在しません", @@ -202,7 +202,7 @@ "client-device-doesnt-exist": "クライアントデバイスが存在しません", "kavitaplus-restricted": "これは Kavita+ のみに制限されています", "aliases-have-overlap": "1 つ以上のエイリアスが他の人物と重複しているため、更新できません", - "sidenav-stream-only-delete-smart-filter": "サイドナビから削除できるのはスマートフィルターストリームのみです", + "sidenav-stream-only-delete-smart-filter": "サイドナビゲーションから削除できるのはスマートフィルターストリームのみです", "dashboard-stream-only-delete-smart-filter": "ダッシュボードから削除できるのはスマートフィルターストリームのみです", "smart-filter-name-required": "スマートフィルター名が必要です", "smart-filter-system-name": "システム提供のストリーム名は使用できません", diff --git a/API/I18N/zh_Hant.json b/API/I18N/zh_Hant.json index 31d4b69f6..a751cc579 100644 --- a/API/I18N/zh_Hant.json +++ b/API/I18N/zh_Hant.json @@ -209,5 +209,8 @@ "smart-filter-system-name": "您不能使用系統保留的串流名稱", "kavitaplus-restricted": "此功能僅限 Kavita+ 使用", "aliases-have-overlap": "一個或多個別名與其他人物重複,無法更新", - "generated-reading-profile-name": "由 {0} 生成" + "generated-reading-profile-name": "由 {0} 生成", + "oidc-managed": "無法編輯受 OIDC 管理的使用者資料。", + "cannot-change-identity-provider-original-user": "無法變更原始管理員帳號的身分驗證提供者", + "download-not-allowed": "使用者不具備下載權限" } diff --git a/API/Middleware/AuthKeyAuthenticationHandler.cs b/API/Middleware/AuthKeyAuthenticationHandler.cs index e77770404..bb0bc6c3a 100644 --- a/API/Middleware/AuthKeyAuthenticationHandler.cs +++ b/API/Middleware/AuthKeyAuthenticationHandler.cs @@ -86,7 +86,8 @@ private readonly IUnitOfWork _unitOfWork; { new(ClaimTypes.NameIdentifier, user.Id.ToString()), new(JwtRegisteredClaimNames.Name, user.Username), - new("AuthType", nameof(AuthenticationType.AuthKey)) + new("AuthType", nameof(AuthenticationType.AuthKey)), + new("AuthKey", apiKey), }; if (user.Roles != null && user.Roles.Any()) diff --git a/API/Services/Reading/ReaderService.cs b/API/Services/Reading/ReaderService.cs index ea2b82526..34b9769a6 100644 --- a/API/Services/Reading/ReaderService.cs +++ b/API/Services/Reading/ReaderService.cs @@ -884,7 +884,7 @@ public class ReaderService(IUnitOfWork unitOfWork, ILogger logger Func isValidPrevChapter) { var daysSinceLastProgress = (DateTime.UtcNow - lastProgress).Days; - var reReadForTime = daysSinceLastProgress != 0 && daysSinceLastProgress > userPreferences.PromptForRereadsAfter; + var reReadForTime = userPreferences.PromptForRereadsAfter != 0 && daysSinceLastProgress > userPreferences.PromptForRereadsAfter; // Next up chapter has progress, re-read if it's fully read or long ago if (continuePoint.PagesRead > 0) @@ -956,7 +956,7 @@ public class ReaderService(IUnitOfWork unitOfWork, ILogger logger } var daysSinceLastProgress = (DateTime.UtcNow - lastProgress.Value).Days; - var reReadForTime = daysSinceLastProgress != 0 && daysSinceLastProgress > userPreferences.PromptForRereadsAfter; + var reReadForTime = userPreferences.PromptForRereadsAfter != 0 && daysSinceLastProgress > userPreferences.PromptForRereadsAfter; // Prompt if fully read or long ago return new RereadDto diff --git a/API/Services/SiteThemeService.cs b/API/Services/SiteThemeService.cs index 1a01e6b3a..6a22f724b 100644 --- a/API/Services/SiteThemeService.cs +++ b/API/Services/SiteThemeService.cs @@ -505,7 +505,13 @@ public class ThemeService : IThemeService _directoryService.FileSystem.Path.Join(_directoryService.SiteThemeDirectory, theme.FileName); var newLocation = _directoryService.FileSystem.Path.Join(_directoryService.TempDirectory, theme.FileName); - _directoryService.CopyFileToDirectory(existingLocation, newLocation); + + if (!_directoryService.FileSystem.File.Exists(newLocation)) + { + _logger.LogInformation("Copying Deleted theme file ({FileName}) to config/temp, it will be removed at midnight", theme.FileName); + _directoryService.CopyFileToDirectory(existingLocation, newLocation); + } + _directoryService.DeleteFiles([existingLocation]); } catch (Exception) { /* Swallow */ } diff --git a/Kavita.Common/Kavita.Common.csproj b/Kavita.Common/Kavita.Common.csproj index 545abc576..45f6805a1 100644 --- a/Kavita.Common/Kavita.Common.csproj +++ b/Kavita.Common/Kavita.Common.csproj @@ -3,7 +3,7 @@ net10.0 kavitareader.com Kavita - 0.8.9.0 + 0.8.9.1 en true @@ -20,4 +20,4 @@ - \ No newline at end of file + diff --git a/UI/Web/src/app/_services/theme.service.ts b/UI/Web/src/app/_services/theme.service.ts index 8a1d3191c..9f924d481 100644 --- a/UI/Web/src/app/_services/theme.service.ts +++ b/UI/Web/src/app/_services/theme.service.ts @@ -283,12 +283,15 @@ export class ThemeService { this.themeCache.forEach(theme => { this.document.body.classList.remove(theme.selector); - if (theme.provider === ThemeProvider.System) return; + + // TODO: BUG: We aren't removing the old style tags, thus some style conflict can occur (switch theme, delete button might be green). + // We need to remove the old style tags, however this brought instability in v0.8.9. I removed this for hotfix, let's revisit it later. // Remove the injected style (unless it's Dark) - const styleElem = this.document.querySelector('style#theme-' + theme.name); - if (styleElem) { - this.renderer.removeChild(this.document.head, styleElem); - } + // if (theme.provider === ThemeProvider.System) return; + // const styleElem = this.document.querySelector('style#theme-' + theme.name); + // if (styleElem) { + // this.renderer.removeChild(this.document.head, styleElem); + // } }); } diff --git a/UI/Web/src/app/admin/manage-media-issues/manage-media-issues.component.html b/UI/Web/src/app/admin/manage-media-issues/manage-media-issues.component.html index 5e5baaffe..8af295d9f 100644 --- a/UI/Web/src/app/admin/manage-media-issues/manage-media-issues.component.html +++ b/UI/Web/src/app/admin/manage-media-issues/manage-media-issues.component.html @@ -19,7 +19,7 @@ (); - @ViewChildren(SortableHeader) headers!: QueryList>; private readonly serverService = inject(ServerService); private readonly messageHub = inject(MessageHubService); @@ -46,8 +40,6 @@ export class ManageMediaIssuesComponent implements OnInit { protected readonly WikiLink = WikiLink; messageHubUpdate$ = this.messageHub.messages$.pipe(takeUntilDestroyed(this.destroyRef), filter(m => m.event === EVENTS.ScanSeries), shareReplay()); - currentSort = new BehaviorSubject>({column: 'extension', direction: 'asc'}); - currentSort$: Observable> = this.currentSort.asObservable(); data: Array = []; isLoading = true; @@ -57,19 +49,8 @@ export class ManageMediaIssuesComponent implements OnInit { trackBy = (idx: number, item: KavitaMediaError) => `${item.filePath}` ngOnInit(): void { - this.loadData(); - this.messageHubUpdate$.subscribe(_ => this.loadData()); - - this.currentSort$.subscribe(sortConfig => { - this.data = (sortConfig.column) ? this.data.sort((a: KavitaMediaError, b: KavitaMediaError) => { - if (sortConfig.column === '') return 0; - const res = compare(a[sortConfig.column], b[sortConfig.column]); - return sortConfig.direction === 'asc' ? res : -res; - }) : this.data; - this.cdRef.markForCheck(); - }); } diff --git a/UI/Web/src/app/admin/manage-scrobble-errors/manage-scrobble-errors.component.ts b/UI/Web/src/app/admin/manage-scrobble-errors/manage-scrobble-errors.component.ts index 06307f4d5..eaa8f87e1 100644 --- a/UI/Web/src/app/admin/manage-scrobble-errors/manage-scrobble-errors.component.ts +++ b/UI/Web/src/app/admin/manage-scrobble-errors/manage-scrobble-errors.component.ts @@ -7,15 +7,12 @@ import { inject, OnInit, Output, - QueryList, - ViewChildren + signal } from '@angular/core'; import {FormControl, FormGroup, ReactiveFormsModule} from "@angular/forms"; -import {compare, SortableHeader, SortEvent} from "../../_single-module/table/_directives/sortable-header.directive"; -import {KavitaMediaError} from "../_models/media-error"; import {EVENTS, MessageHubService} from "../../_services/message-hub.service"; import {takeUntilDestroyed} from "@angular/core/rxjs-interop"; -import {BehaviorSubject, filter, Observable, shareReplay} from "rxjs"; +import {filter, shareReplay} from "rxjs"; import {ScrobblingService} from "../../_services/scrobbling.service"; import {ScrobbleError} from "../../_models/scrobbling/scrobble-error"; @@ -47,17 +44,14 @@ export class ManageScrobbleErrorsComponent implements OnInit { private readonly seriesService = inject(SeriesService); private readonly actionService = inject(ActionService); - @Output() scrobbleCount = new EventEmitter(); - @ViewChildren(SortableHeader) headers!: QueryList>; - messageHubUpdate$ = this.messageHub.messages$.pipe(takeUntilDestroyed(this.destroyRef), filter(m => m.event === EVENTS.ScanSeries), shareReplay()); - currentSort = new BehaviorSubject>({column: 'created', direction: 'asc'}); - currentSort$: Observable> = this.currentSort.asObservable(); + messageHubUpdate$ = this.messageHub.messages$.pipe(takeUntilDestroyed(this.destroyRef), + filter(m => m.event === EVENTS.ScanSeries), shareReplay()); data: Array = []; - isLoading = true; + isLoading = signal(true); formGroup = new FormGroup({ filter: new FormControl('', []) }); @@ -65,27 +59,16 @@ export class ManageScrobbleErrorsComponent implements OnInit { ngOnInit() { - this.loadData(); - this.messageHubUpdate$.subscribe(_ => this.loadData()); - - this.currentSort$.subscribe(sortConfig => { - this.data = (sortConfig.column) ? this.data.sort((a: ScrobbleError, b: ScrobbleError) => { - if (sortConfig.column === '') return 0; - const res = compare(a[sortConfig.column], b[sortConfig.column]); - return sortConfig.direction === 'asc' ? res : -res; - }) : this.data; - this.cdRef.markForCheck(); - }); } loadData() { - this.isLoading = true; + this.isLoading.set(true); this.cdRef.markForCheck(); this.scrobbleService.getScrobbleErrors().subscribe(d => { this.data = d; - this.isLoading = false; + this.isLoading.set(false); this.scrobbleCount.emit(d.length); this.cdRef.detectChanges(); }); diff --git a/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.ts b/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.ts index 54a9fd216..1975dc9fa 100644 --- a/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.ts +++ b/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.ts @@ -1688,8 +1688,8 @@ export class MangaReaderComponent implements OnInit, AfterViewInit, OnDestroy { tempPageNum = this.pageNum + 1; } - // We need to avoid calling this on first load - if (!this.incognitoMode && !this.bookmarkMode() && !this.inSetup) { + // We need to avoid calling this on first load (except if the chapter only has one page) + if (!this.incognitoMode && !this.bookmarkMode() && (!this.inSetup || this.maxPages === 1)) { this.readerService.saveProgress(this.libraryId, this.seriesId, this.volumeId, this.chapterId, tempPageNum).subscribe(() => {/* No operation */}); } } diff --git a/UI/Web/src/app/statistics/_components/file-breakdown-stats/file-breakdown-stats.component.html b/UI/Web/src/app/statistics/_components/file-breakdown-stats/file-breakdown-stats.component.html index db528d121..23d07b654 100644 --- a/UI/Web/src/app/statistics/_components/file-breakdown-stats/file-breakdown-stats.component.html +++ b/UI/Web/src/app/statistics/_components/file-breakdown-stats/file-breakdown-stats.component.html @@ -4,18 +4,15 @@ {{t('format-tooltip')}} - @let files = (files$ | async) || []; - - @if (files.length > 0) { - + @if (files().length > 0) { + @@ -71,7 +68,7 @@
- {{t('total-file-size-title')}}: {{((rawData$ | async)?.totalFileSize || 0) | bytes}} + {{t('total-file-size-title')}}: {{ totalSize() | bytes}}
@@ -114,7 +111,7 @@
- {{t('total-file-size-title')}}: {{((rawData$ | async)?.totalFileSize || 0) | bytes}} + {{t('total-file-size-title')}}: {{ totalSize() | bytes}}
diff --git a/UI/Web/src/app/statistics/_components/file-breakdown-stats/file-breakdown-stats.component.ts b/UI/Web/src/app/statistics/_components/file-breakdown-stats/file-breakdown-stats.component.ts index 8983ab1f9..b91a97945 100644 --- a/UI/Web/src/app/statistics/_components/file-breakdown-stats/file-breakdown-stats.component.ts +++ b/UI/Web/src/app/statistics/_components/file-breakdown-stats/file-breakdown-stats.component.ts @@ -1,23 +1,9 @@ -import { - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - DestroyRef, - inject, - QueryList, - TemplateRef, - ViewChild, - ViewChildren -} from '@angular/core'; +import {ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, OnInit, signal,} from '@angular/core'; import {ReactiveFormsModule} from '@angular/forms'; -import {BehaviorSubject, combineLatest, map, Observable, shareReplay} from 'rxjs'; +import {tap} from 'rxjs'; import {StatisticsService} from 'src/app/_services/statistics.service'; -import {compare, SortableHeader, SortEvent} from 'src/app/_single-module/table/_directives/sortable-header.directive'; -import {FileExtension, FileExtensionBreakdown} from '../../_models/file-breakdown'; -import {PieDataItem} from '../../_models/pie-data-item'; -import {takeUntilDestroyed} from "@angular/core/rxjs-interop"; -import {AsyncPipe} from '@angular/common'; -import {TranslocoDirective, TranslocoService} from "@jsverse/transloco"; +import {FileExtension} from '../../_models/file-breakdown'; +import {TranslocoDirective} from "@jsverse/transloco"; import {NgbTooltip} from "@ng-bootstrap/ng-bootstrap"; import {NgxDatatableModule} from "@siemens/ngx-datatable"; import {MangaFormatPipe} from "../../../_pipes/manga-format.pipe"; @@ -31,53 +17,31 @@ import {StatsNoDataComponent} from "../../../common/stats-no-data/stats-no-data. templateUrl: './file-breakdown-stats.component.html', styleUrls: ['./file-breakdown-stats.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, - imports: [NgbTooltip, ReactiveFormsModule, AsyncPipe, TranslocoDirective, NgxDatatableModule, MangaFormatPipe, BytesPipe, CompactNumberPipe, ResponsiveTableComponent, StatsNoDataComponent] + imports: [NgbTooltip, ReactiveFormsModule, TranslocoDirective, NgxDatatableModule, MangaFormatPipe, BytesPipe, CompactNumberPipe, ResponsiveTableComponent, StatsNoDataComponent] }) -export class FileBreakdownStatsComponent { +export class FileBreakdownStatsComponent implements OnInit { - private readonly destroyRef = inject(DestroyRef); private readonly cdRef = inject(ChangeDetectorRef); - @ViewChildren(SortableHeader) headers!: QueryList>; - @ViewChild('modalTable') modalTable!: TemplateRef; - - rawData$!: Observable; - files$!: Observable>; - vizData2$!: Observable>; - - currentSort = new BehaviorSubject>({column: 'extension', direction: 'asc'}); - currentSort$: Observable> = this.currentSort.asObservable(); + files = signal([]); + totalSize = signal(0); view: [number, number] = [700, 400]; downloadInProgress: {[key: string]: boolean} = {}; private readonly statService = inject(StatisticsService); - private readonly translocoService = inject(TranslocoService); trackByExtension = (_: number, item: FileExtension) => item.extension + '_' + item.totalFiles; - constructor() { - this.rawData$ = this.statService.getFileBreakdown().pipe(takeUntilDestroyed(this.destroyRef), shareReplay()); - - this.files$ = combineLatest([this.currentSort$, this.rawData$]).pipe( - map(([sortConfig, data]) => { - return {sortConfig, fileBreakdown: data.fileBreakdown}; - }), - map(({ sortConfig, fileBreakdown }) => { - return (sortConfig.column) ? fileBreakdown.sort((a: FileExtension, b: FileExtension) => { - if (sortConfig.column === '') return 0; - const res = compare(a[sortConfig.column], b[sortConfig.column]); - return sortConfig.direction === 'asc' ? res : -res; - }) : fileBreakdown; - }), - takeUntilDestroyed(this.destroyRef) - ); - - - this.vizData2$ = this.files$.pipe(takeUntilDestroyed(this.destroyRef), map(data => data.map(d => { - return {name: d.extension || this.translocoService.translate('file-breakdown-stats.not-classified'), value: d.totalFiles, extra: d.totalSize}; - }))); + ngOnInit() { + this.statService.getFileBreakdown().pipe( + tap(res => { + // Using sort props breaks the table for some users; https://github.com/Kareadita/Kavita/issues/4365 + this.files.set(res.fileBreakdown.sort((a, b) => b.totalFiles - a.totalFiles)); + this.totalSize.set(res.totalFileSize); + }) + ).subscribe(); } diff --git a/UI/Web/src/app/statistics/_components/publication-status-stats/publication-status-stats.component.html b/UI/Web/src/app/statistics/_components/publication-status-stats/publication-status-stats.component.html index 3b719c6dc..e62da962a 100644 --- a/UI/Web/src/app/statistics/_components/publication-status-stats/publication-status-stats.component.html +++ b/UI/Web/src/app/statistics/_components/publication-status-stats/publication-status-stats.component.html @@ -2,7 +2,7 @@
{{t('title')}}
- @let statuses = (publicationStatues$ | async) || []; + @let statuses = publicationStatues(); @if (statuses.length > 0) { @@ -38,7 +38,7 @@
-
{{t('year-header')}}
+
{{t('status-header')}}
{{item.name}}
diff --git a/UI/Web/src/app/statistics/_components/publication-status-stats/publication-status-stats.component.ts b/UI/Web/src/app/statistics/_components/publication-status-stats/publication-status-stats.component.ts index 840521734..26f964849 100644 --- a/UI/Web/src/app/statistics/_components/publication-status-stats/publication-status-stats.component.ts +++ b/UI/Web/src/app/statistics/_components/publication-status-stats/publication-status-stats.component.ts @@ -1,11 +1,8 @@ -import {ChangeDetectionStrategy, Component, DestroyRef, inject, QueryList, ViewChildren} from '@angular/core'; +import {ChangeDetectionStrategy, Component, inject, signal} from '@angular/core'; import {FormControl, ReactiveFormsModule} from '@angular/forms'; -import {BehaviorSubject, combineLatest, map, Observable} from 'rxjs'; import {StatisticsService} from 'src/app/_services/statistics.service'; -import {compare, SortableHeader, SortEvent} from 'src/app/_single-module/table/_directives/sortable-header.directive'; import {PieDataItem} from '../../_models/pie-data-item'; -import {takeUntilDestroyed} from "@angular/core/rxjs-interop"; -import {AsyncPipe, DecimalPipe} from '@angular/common'; +import {DecimalPipe} from '@angular/common'; import {TranslocoDirective} from "@jsverse/transloco"; import {ResponsiveTableComponent} from "../../../shared/_components/responsive-table/responsive-table.component"; import { @@ -21,38 +18,19 @@ import {StatsNoDataComponent} from "../../../common/stats-no-data/stats-no-data. templateUrl: './publication-status-stats.component.html', styleUrls: ['./publication-status-stats.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, - imports: [ReactiveFormsModule, AsyncPipe, DecimalPipe, TranslocoDirective, ResponsiveTableComponent, DatatableComponent, DataTableColumnDirective, DataTableColumnHeaderDirective, DataTableColumnCellDirective, StatsNoDataComponent] + imports: [ReactiveFormsModule, DecimalPipe, TranslocoDirective, ResponsiveTableComponent, DatatableComponent, DataTableColumnDirective, DataTableColumnHeaderDirective, DataTableColumnCellDirective, StatsNoDataComponent] }) export class PublicationStatusStatsComponent { private readonly statService = inject(StatisticsService); - - @ViewChildren(SortableHeader) headers!: QueryList>; - - publicationStatues$!: Observable>; - - currentSort = new BehaviorSubject>({column: 'value', direction: 'asc'}); - currentSort$: Observable> = this.currentSort.asObservable(); - + publicationStatues = signal>([]); view: [number, number] = [700, 400]; - - private readonly destroyRef = inject(DestroyRef); - formControl: FormControl = new FormControl(true, []); - readonly trackByIdentity = (_: number, item: PieDataItem) => item.name + '_' + item.value; - constructor() { - this.publicationStatues$ = combineLatest([this.currentSort$, this.statService.getPublicationStatus()]).pipe( - map(([sortConfig, data]) => { - return (sortConfig.column) ? data.sort((a: PieDataItem, b: PieDataItem) => { - if (sortConfig.column === '') return 0; - const res = compare(a[sortConfig.column], b[sortConfig.column]); - return sortConfig.direction === 'asc' ? res : -res; - }) : data; - }), - takeUntilDestroyed(this.destroyRef) - ); + this.statService.getPublicationStatus().subscribe(status => { + this.publicationStatues.set(status); + }); } } diff --git a/UI/Web/src/app/user-settings/manga-user-preferences/manage-user-preferences.component.ts b/UI/Web/src/app/user-settings/manga-user-preferences/manage-user-preferences.component.ts index b2cb53139..aae6ea48e 100644 --- a/UI/Web/src/app/user-settings/manga-user-preferences/manage-user-preferences.component.ts +++ b/UI/Web/src/app/user-settings/manga-user-preferences/manage-user-preferences.component.ts @@ -5,7 +5,14 @@ import {AccountService} from "../../_services/account.service"; import {Title} from "@angular/platform-browser"; import {Router} from "@angular/router"; import {LocalizationService} from "../../_services/localization.service"; -import {FormArray, FormControl, FormGroup, NonNullableFormBuilder, ReactiveFormsModule} from "@angular/forms"; +import { + FormArray, + FormControl, + FormGroup, + NonNullableFormBuilder, + ReactiveFormsModule, + Validators +} from "@angular/forms"; import {User} from "../../_models/user/user"; import {KavitaLocale} from "../../_models/metadata/language"; import {takeUntilDestroyed} from "@angular/core/rxjs-interop"; @@ -162,7 +169,7 @@ export class ManageUserPreferencesComponent implements OnInit { bookReaderHighlightSlots: this.fb.array(pref.bookReaderHighlightSlots.map(s => this.fb.control(s))), colorScapeEnabled: this.fb.control(pref.colorScapeEnabled), dataSaver: this.fb.control(pref.dataSaver), - promptForRereadsAfter: this.fb.control(pref.promptForRereadsAfter), + promptForRereadsAfter: this.fb.control(pref.promptForRereadsAfter, [Validators.required]), // Required allows 0, but not null aniListScrobblingEnabled: this.fb.control(pref.aniListScrobblingEnabled), wantToReadSync: this.fb.control(pref.wantToReadSync), diff --git a/UI/Web/src/assets/langs/ca.json b/UI/Web/src/assets/langs/ca.json index 502097b57..a6c108850 100644 --- a/UI/Web/src/assets/langs/ca.json +++ b/UI/Web/src/assets/langs/ca.json @@ -259,7 +259,6 @@ "publication-status-stats": { "visualisation-label": "Visualització", "data-table-label": "Taula de dades", - "year-header": "Any", "count-header": "Recompte", "title": "Estat de publicació" }, diff --git a/UI/Web/src/assets/langs/cs.json b/UI/Web/src/assets/langs/cs.json index ca820e53d..149a40b9e 100644 --- a/UI/Web/src/assets/langs/cs.json +++ b/UI/Web/src/assets/langs/cs.json @@ -2207,8 +2207,8 @@ "title": "Stav publikace", "data-table-label": "Datová tabulka", "count-header": "Počet", - "year-header": "Rok", - "no-data": "{{common.no-data}}" + "no-data": "{{common.no-data}}", + "status-header": "{{manage-matched-metadata.status-header}}" }, "email-history": { "template-header": "Šablona", diff --git a/UI/Web/src/assets/langs/de.json b/UI/Web/src/assets/langs/de.json index 7bce37184..b543a6436 100644 --- a/UI/Web/src/assets/langs/de.json +++ b/UI/Web/src/assets/langs/de.json @@ -1855,9 +1855,9 @@ "title": "Status der Veröffentlichung", "visualisation-label": "Visualisierung", "data-table-label": "Daten-Tabelle", - "year-header": "Jahr", "count-header": "Zähler", - "no-data": "{{common.no-data}}" + "no-data": "{{common.no-data}}", + "status-header": "{{manage-matched-metadata.status-header}}" }, "series-preview-drawer": { "staff-label": "Team", @@ -2421,7 +2421,7 @@ "volume-nums": "Bände", "no-data": "Keine Daten", "chapter-count": "{{num}} Kapitel", - "issue-count": "{{num}} Probleme", + "issue-count": "{{num}} Ausgaben", "unknown": "Unbekannt", "roles": "Rollen", "libraries": "Bibliotheken", @@ -3193,7 +3193,7 @@ "avg-reading-per-week-label": "Durchschnitt pro Woche:", "stats-title": "Ein Blick auf {{username}}s Reise durch {{libraryName}}", "no-reviews": "Noch keine Bewertungen", - "total-reads-badge": "{{reads}} Liest", + "total-reads-badge": "{{reads}} Gelesen", "k+-badge": "K+ Abonnent", "overview-tab": "{{tabs.overview-tab}}", "stats-tab": "{{tabs.stats-tab}}", @@ -3208,13 +3208,13 @@ "profile-stat-bar": { "books-read-label": "Gelesene Bücher", "books-read-tooltip": "Gelesene Bücher: {{count}}", - "comics-read-label": "Comics lesen", + "comics-read-label": "Gelesene Comics", "comics-read-tooltip": "Gelesene Comics: {{count}}", "pages-read-label": "Gelesene Seiten", "pages-read-tooltip": "Gelesen Seiten: {{count}}", "words-read-label": "Gelesene Wörter", "words-read-tooltip": "Gelesene Wörter: {{count}}", - "authors-read-label": "Autoren Lesen", + "authors-read-label": "Gelesene Autoren", "authors-read-tooltip": "Autoren gelesen: {{count}}", "reviews-label": "Bewertungen", "reviews-tooltip": "Bewertungen: {{count}}", @@ -3295,7 +3295,7 @@ "moderate-activity-alt": "Moderate Aktivität", "good-activity-alt": "Gute Aktivität", "high-activity-alt": "Hohe Aktivität", - "aggregated-count": "Sie haben im {{year}} {{totalPages}} Seiten und {{totalWords}} Wörter gelesen" + "aggregated-count": "Sie haben {{totalPages}} Seiten und {{totalWords}} Wörter im Jahr {{year}} gelesen" }, "reading-pace": { "title-books": "Lesetempo: Bücher", diff --git a/UI/Web/src/assets/langs/es.json b/UI/Web/src/assets/langs/es.json index 4e4ed3026..0b85c81dd 100644 --- a/UI/Web/src/assets/langs/es.json +++ b/UI/Web/src/assets/langs/es.json @@ -1707,7 +1707,6 @@ "title": "Estado de publicación", "visualisation-label": "Visualización", "data-table-label": "Tabla de datos", - "year-header": "Año", "count-header": "Recuento" }, "series-preview-drawer": { diff --git a/UI/Web/src/assets/langs/fr.json b/UI/Web/src/assets/langs/fr.json index 586775733..a5590a5a8 100644 --- a/UI/Web/src/assets/langs/fr.json +++ b/UI/Web/src/assets/langs/fr.json @@ -1259,7 +1259,8 @@ "pending-tooltip": "Cet utilisateur n'a pas validé son e-mail", "all-libraries": "Toutes les Bibliothèques", "identity-provider-oidc-tooltip": "OIDC", - "identity-provider-native-tooltip": "Natif" + "identity-provider-native-tooltip": "Natif", + "profile-link-alt": "Profil" }, "edit-collection-tags": { "title": "Modifier la collection {{collectionName}}", @@ -1417,7 +1418,8 @@ "active-events-title": "Événements actifs :", "no-data": "Il ne se passe pas grand-chose ici", "left-to-process": "Reste à traiter : {{leftToProcess}} / {{totalToProcess}}", - "download-in-queue": "{{num}} téléchargements dans la file d'attente" + "download-in-queue": "{{num}} téléchargements dans la file d'attente", + "reading-now": "{{num}} en cours de lecture" }, "shortcuts-modal": { "title": "Raccourcis clavier", @@ -1604,7 +1606,8 @@ "create-new-tooltip": "{{reader-settings.create-new-tooltip}}", "reading-profile-updated": "Profil de lecture mis à jour", "reading-profile-promoted": "Profil de lecture promu", - "page-offset-label": "Décalage de page" + "page-offset-label": "Décalage de page", + "offset-only-double": "Le décalage de page ne peut être utilisé qu'avec la mise en page double" }, "metadata-filter": { "filter-title": "{{common.filter}}", @@ -1829,7 +1832,8 @@ "not-classified": "Non classé", "total-file-size-title": "Taille totale du fichier :", "download-file-for-extension-header": "Rapport de téléchargement", - "download-file-for-extension-alt": "Télécharger les fichiers Rapport pour {{extension}}" + "download-file-for-extension-alt": "Télécharger les fichiers Rapport pour {{extension}}", + "no-data": "{{common.no-data}}" }, "reading-activity": { "title": "Activité de lecture", @@ -1851,8 +1855,9 @@ "title": "État de la publication", "visualisation-label": "Visualisation", "data-table-label": "Table de données", - "year-header": "Année", - "count-header": "Compter" + "count-header": "Compter", + "status-header": "{{manage-matched-metadata.status-header}}", + "no-data": "{{common.no-data}}" }, "series-preview-drawer": { "staff-label": "Équipe", @@ -2202,7 +2207,8 @@ "confirm-force-delete-font": "Cette police est actuellement utilisée. Vous voulez forcer la suppression ? Cela obligera les utilisateurs à retourner à la police Par défaut.", "font-in-use": "Ne peut pas supprimer car la police est utilisée par un ou plusieurs utilisateurs.", "k+-resend-welcome-email-success": "Un email a été envoyé à votre email Kavita+", - "confirm-delete-auth-key": "Êtes-vous sûr de vouloir supprimer cette clé d'authentification ?" + "confirm-delete-auth-key": "Êtes-vous sûr de vouloir supprimer cette clé d'authentification ?", + "profile-unauthorized": "Cet utilisateur ne partage pas son profil" }, "read-time-pipe": { "less-than-hour": "<1 Heure", @@ -2371,7 +2377,8 @@ "smart-filters-tab": "Filtres intelligents", "annotations-tab": "Annotations", "overview-tab": "Aperçu", - "management-tab": "Gestion" + "management-tab": "Gestion", + "activity-tab": "Activité" }, "common": { "reset-to-default": "Réinitialiser aux valeurs par défaut", @@ -2828,7 +2835,8 @@ "page-calc-method-label": "{{reader-settings.page-calc-method-label}}", "page-calc-method-tooltip": "{{reader-settings.page-calc-method-tooltip}}", "set-devices": "Configurer les appareils", - "select-devices-for": "Configurer les appareils pour {{name}}" + "select-devices-for": "Configurer les appareils pour {{name}}", + "breakpoint-pipe-never": "{{breakpoint-pipe.never}}" }, "oidc": { "title": "OIDC Callback", @@ -3074,7 +3082,8 @@ "reviews-tab": "{{tabs.reviews-tab}}", "no-reviews": "Pas encore d'avis", "total-reads-badge": "{{reads}} Lectures", - "k+-badge": "K+ Abonné" + "k+-badge": "K+ Abonné", + "activity-tab": "{{tabs.activity-tab}}" }, "reread-modal": { "title": "(Re)Lecture", @@ -3269,14 +3278,15 @@ "reading-time": "Temps de lecture", "pages": "Pages", "words": "Mots", - "chapters": "Chapitres", + "chapters": "Chapitres terminés", "no-activity-alt": "Aucune activité", "no-activity-tooltip": "Aucune activité de lecture le {{date}}.", "all-time": "{{time-periods.all-time}}", "low-activity-alt": "Peu d'activité", "moderate-activity-alt": "Activité moyenne", "good-activity-alt": "Bonne activité", - "high-activity-alt": "Forte activité" + "high-activity-alt": "Forte activité", + "aggregated-count": "Vous avez lu {{totalPages}} pages et {{totalWords}} mots en {{year}}" }, "reading-pace": { "title-books": "Rythme de lecture : Livres", @@ -3303,7 +3313,8 @@ "during-entire-life-server": "depuis le début", "during-year": "durant {{year}}", "during-from-to": "de {{startYear}} à {{endYear}}", - "during-select": "Sélectionnez une plage horaire" + "during-select": "Sélectionnez une plage horaire", + "close": "{{common.close}}" }, "client-device-type-pipe": { "mobile": "Mobile", @@ -3378,5 +3389,26 @@ }, "list-select-modal": { "hidden": "{{amount}} éléments masqués en raison d'un état invalide" + }, + "profile-activity": { + "time-filter-title": "Activité de {{username}} via", + "pages-count": "{{series-detail.pages-count}}", + "no-data": "{{common.no-data}}", + "duration": "Durée", + "words-count": "{{series-detail.words-count}}", + "pages-read": "{{reading-pace.pages-read}}", + "words-read": "{{reading-pace.words-read}}", + "time": "Temps", + "info-alt": "Plus d'info", + "today": "Aujourd'hui", + "yesterday": "Hier", + "pagination-label": "Pagination des activités", + "page-info": "Page {{current}} sur {{total}} ({{items}} enregistrements au total)" + }, + "user-stats-info-cards": { + "pages-read-by-year-title": "Pages lues par an", + "pages-count": "{{num}} pages", + "words-read-by-year-title": "Mots lus par an", + "words-count": "{{num}} mots" } } diff --git a/UI/Web/src/assets/langs/ga.json b/UI/Web/src/assets/langs/ga.json index 854f12230..ee6e4bce6 100644 --- a/UI/Web/src/assets/langs/ga.json +++ b/UI/Web/src/assets/langs/ga.json @@ -1855,9 +1855,9 @@ "title": "Stádas Foilseacháin", "visualisation-label": "Amharcléiriú", "data-table-label": "Tábla Sonraí", - "year-header": "Bliain", "count-header": "Comhaireamh", - "no-data": "{{common.no-data}}" + "no-data": "{{common.no-data}}", + "status-header": "{{manage-matched-metadata.status-header}}" }, "series-preview-drawer": { "staff-label": "Foireann", diff --git a/UI/Web/src/assets/langs/hu.json b/UI/Web/src/assets/langs/hu.json index c4b5e4157..0ba1b4c05 100644 --- a/UI/Web/src/assets/langs/hu.json +++ b/UI/Web/src/assets/langs/hu.json @@ -224,7 +224,7 @@ "valid-email": "{{validation.valid-email}}", "title": "E-mail eszköz szerkesztése", "email-tooltip": "Ezt az e-mail címet fogjuk használni a fájl Küldés funkcióval történő fogadásához", - "device-platform-label": "Eszközplatform" + "device-platform-label": "{{manage-devices.platform-label}}" }, "change-password": { "password-label": "{{common.password}}", @@ -468,7 +468,9 @@ "email-label": "{{common.email}}", "required-field": "{{common.required-field}}", "valid-email": "{{common.valid-email}}", - "password-validation": "{{validation.password-validation}}" + "password-validation": "{{validation.password-validation}}", + "title": "Nyilvántartás", + "description": "Töltsd ki az űrlapot a regisztráció befejezéséhez" }, "confirm-reset-password": { "password-label": "{{common.password}}", @@ -1364,7 +1366,12 @@ "roles-claim-tooltip": "Az az igény, amelyet Kavita a szerepkörök kinyerésére fog használni. Hagyja üresen az alapértelmezett érték használatához.", "custom-scopes-label": "Egyéni hatókörök", "custom-scopes-tooltip": "További hatókörök, amelyeket bejelentkezéskor az OIDC-szolgáltatótól kell kérni. Több hatókör esetén vesszővel válassza el őket. A helytelen értékek megakadályozhatják a bejelentkezést.", - "provision-accounts-label": "Céltartalék számlák" + "provision-accounts-label": "Céltartalék számlák", + "reset-label": "Azonosítók visszaállítása", + "reset-tooltip": "Külső azonosító visszaállítása az összes felhasználóról, ezzel visszaállíthatja a Kavita felhasználói és az identitásszolgáltatója közötti kapcsolatokat", + "reset-confirm": "Biztosan vissza szeretné állítani az összes felhasználó külső azonosítóját?", + "reset-success": "Külső azonosítók visszaállítása minden felhasználó számára, újbóli hitelesítés a linkeléshez", + "auto-save-required": "Fontos beállításokat módosítottál, automatikus mentés a megőrzésük érdekében" }, "manage-auth-keys": { "clients-opds-url-label": "{{user-preferences.clients-opds-url-label}}", @@ -1446,7 +1453,7 @@ "client-device-card": { "auth-type-label": "Hitelesítési típus", "browser-label": "Böngésző", - "platform-label": "Platform", + "platform-label": "{{manage-devices.platform-label}}", "screen-label": "Képernyő", "version-label": "Alkalmazás verziója", "first-seen-label": "Első megtekintés", @@ -1582,7 +1589,8 @@ "series-header": "Sorozatmezők", "tags-header": "Címkék", "source-genre-tags-placeholder": "Forrás műfaja/címke", - "dest-genre-tags-placeholder": "Cél műfaj/címke" + "dest-genre-tags-placeholder": "Cél műfaj/címke", + "people-header": "Emberek" }, "reading-progress-status-pipe": { "progress-incognito": "Folytatás inkognitómódban", @@ -1617,7 +1625,7 @@ "downloading-status": "Letöltés…" }, "api-key": { - "copy": "Másolat" + "copy": "{{book-line-overlay.copy}}" }, "most-active-users": { "title": "Legaktívabb olvasók", @@ -1704,7 +1712,9 @@ "side-story": "Melléktörténet", "parent": "Szülő", "edition": "Kiadás", - "annual": "Évi" + "annual": "Évi", + "doujinshi": "Doujinshi", + "spin-off": "Szétválasztás" }, "publication-status-pipe": { "ongoing": "Folyamatban lévő", @@ -1745,7 +1755,9 @@ "mature": "Érett", "rating-pending": "Értékelés függőben", "teen": "Tini", - "not-applicable": "Nem alkalmazható" + "not-applicable": "Nem alkalmazható", + "mature-17-plus": "17+ éves kortól", + "x18-plus": "18+ éves kortól" }, "cover-image-size": { "default": "Alapértelmezett (320x455)", @@ -1851,7 +1863,9 @@ "close": "{{common.close}}", "no-data": "{{common.no-data}}", "page-num-label": "{{book-reader.page-num-label}}", - "load-bookmark": "Töltés" + "load-bookmark": "Töltés", + "image-header": "Kép", + "text-header": "Szöveg" }, "badge-expander": { "more-items": "és még {{count}}" @@ -1903,5 +1917,56 @@ "epub": "Epub", "pdf": "Pdf", "image": "Kép" + }, + "time-frame-label": { + "overall": "Átfogó", + "week": "Ezen a héten", + "month": "Ebben a hónapban", + "year": "Idén" + }, + "page-chapter-label-pipe": { + "page-only": "— {{pageNumber}}. oldal", + "full": "— {{pageNumber}}. oldal, \"{{chapterTitle}}\" fejezet" + }, + "view-toc-drawer": { + "title": "Tartalomjegyzék", + "close": "{{common.close}}", + "toc-header": "Könyv", + "personal-header": "Személyes" + }, + "epub-setting-drawer": { + "title": "Könyvbeállítások", + "close": "{{common.close}}" + }, + "highlight-bar": { + "add-new-color-alt": "Egyéni szín hozzáadása", + "slot-label": "Kiemelt hely {{slot}}", + "edit": "{{common.edit}}", + "close": "{{common.close}}" + }, + "book-reader": { + "page-label": "Oldal", + "skip-header": "Ugrás a fő tartalomra", + "loading-book": "Könyv betöltése…", + "go-back": "Vissza", + "close-reader-alt": "Olvasó bezárása", + "incognito-mode-alt": "Az inkognitómód be van kapcsolva. Kapcsolja be a kikapcsoláshoz.", + "incognito-mode-label": "Inkognitó mód", + "next": "Következő", + "previous": "Előző", + "go-to-page": "Ugrás az oldalra", + "go-to-page-prompt": "{{totalPages}} oldal van. Melyik oldalra szeretne ugrani? Az oldal az 1-gyel kezdődik.", + "page-num-label": "Oldal {{page}}", + "completion-label": "{{percent}} kész", + "force-selected-one-column": "Az elrendezési mód egy oszlopra váltott, mert nincs elég hely a két oszlop megjelenítéséhez", + "forced-vertical-switch": "Az elrendezési mód átváltott, mivel a két oszlopos elrendezés nem működik függőleges írásstílussal" + }, + "personal-table-of-contents": { + "no-data": "Még semmi sincs könyvjelzőzve", + "page-title": "Oldal {{page}}", + "chapter-and-page-title": "{{chapterTitle}}. fejezet, {{page}}. oldal", + "delete": "Törölje a(z) {{bookmarkName}} könyvjelzőt", + "no-match": "Nincsenek könyvjelzők, amelyek megfelelnek a szűrőnek", + "filter-label": "{{common.filter}}" } } diff --git a/UI/Web/src/assets/langs/id.json b/UI/Web/src/assets/langs/id.json index d0373d356..41046569a 100644 --- a/UI/Web/src/assets/langs/id.json +++ b/UI/Web/src/assets/langs/id.json @@ -669,5 +669,37 @@ }, "actionable": { "clear": "{{common.clear}}" + }, + "oidc": { + "error-loading-info": "Terjadi kesalahan saat memuat informasi OIDC, hubungi administrator Anda", + "timeout": "Waktu resolusi OIDC telah habis atau terjadi sebuah kesalahan" + }, + "manage-oidc-connect": { + "save": "{{common.save}}", + "reset-label": "Setel ulang id", + "reset-tooltip": "Atur ulang id eksternal dari semua pengguna, gunakan ini untuk mengatur ulang tautan antara pengguna di Kavita dan penyedia identitas Anda", + "reset-confirm": "Apakah Anda yakin ingin mengatur ulang id eksternal dari semua pengguna?", + "reset-success": "id eksternal direset untuk semua pengguna, lakukan autentikasi ulang untuk menautkan", + "save-success": "Pengaturan OIDC Anda berhasil diperbarui", + "notice": "Pemberitahuan", + "restart-required": "Mengubah penyedia atau pengaturan lanjutan memerlukan mulai ulang Kavita secara manual agar perubahan berlaku.", + "auto-save-required": "Anda telah mengubah pengaturan penting, simpan otomatis agar perubahan tersebut tetap tersimpan", + "provider-title": "Penyedia", + "provider-tooltip": "Pengaturan penyedia mengharuskan Anda untuk mengklik Simpan secara manual. Kavita harus dikonfigurasi sebagai klien rahasia dan memerlukan URL pengalihan. Lihat wiki untuk detail lebih lanjut.", + "behavior-title": "Perilaku", + "other-field-required": "{{validation.other-field-required}}", + "other-field-invalid": "{{validation.other-field-invalid}}", + "invalid-uri": "{{validation.invalid-uri}}", + "tls-required": "Penyedia OIDC harus menggunakan TLS (https)", + "manual-save-label": "Mengubah pengaturan penyedia memerlukan penyimpanan manual", + "authority-label": "Otoritas", + "authority-tooltip": "URL ke penyedia OIDC Anda, jangan menyertakan jalur .well-known/openid-configuration", + "client-id-label": "Client ID", + "client-id-tooltip": "ClientID yang diatur di penyedia OIDC Anda, bisa berupa apa saja", + "secret-label": "Client secret", + "secret-tooltip": "Kode rahasia yang dihasilkan oleh penyedia OIDC Anda, tidak akan ditampilkan setelah diatur", + "provision-accounts-label": "Akun penyediaan", + "provision-accounts-tooltip": "Buat akun baru secara otomatis saat masuk melalui OIDC jika akun tersebut tidak dapat dicocokkan dengan akun yang sudah ada", + "require-verified-email-label": "Membutuhkan email terverifikasi" } } diff --git a/UI/Web/src/assets/langs/it.json b/UI/Web/src/assets/langs/it.json index 170d953b1..eaf3a7116 100644 --- a/UI/Web/src/assets/langs/it.json +++ b/UI/Web/src/assets/langs/it.json @@ -1704,7 +1704,6 @@ "title": "Stato Pubblicazione", "visualisation-label": "Visualizzazione", "data-table-label": "Tabella Dati", - "year-header": "Anno", "count-header": "Contare" }, "series-preview-drawer": { diff --git a/UI/Web/src/assets/langs/ja.json b/UI/Web/src/assets/langs/ja.json index b689cd0b4..0e3d8fc3b 100644 --- a/UI/Web/src/assets/langs/ja.json +++ b/UI/Web/src/assets/langs/ja.json @@ -75,7 +75,7 @@ }, "review-card-modal": { "close": "{{common.close}}", - "user-review": "{{username}}さんのレビュー", + "user-review": "{{username}} さんのレビュー", "external-mod": "(外部)", "go-to-review": "レビューする" }, @@ -104,24 +104,24 @@ "smart-filters-tab": "{{tabs.smart-filters-tab}}", "success-toast": "ユーザー環境設定を更新しました", "global-settings-title": "グローバル設定", - "page-layout-mode-label": "ページレイアウトモード", + "page-layout-mode-label": "ページ表示モード", "page-layout-mode-tooltip": "シリーズ詳細ページでアイテムをカード形式またはリスト形式で表示します。", "locale-label": "地域", - "locale-tooltip": "Kavita が使用すべき言語", + "locale-tooltip": "Kavita で使用する言語を選択します", "blur-unread-summaries-label": "未読をぼかす", - "blur-unread-summaries-tooltip": "読んでない巻や章のあらすじをぼかします(ネタバレを避けるため)", + "blur-unread-summaries-tooltip": "ネタバレを避けるために、未読の巻または章のあらすじをぼかします", "prompt-on-download-label": "ダウンロード時にプロンプトを表示する", "prompt-on-download-tooltip": "ダウンロードサイズが {{size}}MB を超えるとプロンプトを表示します", "disable-animations-label": "アニメーションを無効化", "disable-animations-tooltip": "サイト内のアニメーションをオフにします。e-ink 端末 (電子ペーパー) で役立ちます。", "collapse-series-relationships-label": "シリーズ関係を折りたたむ", - "collapse-series-relationships-tooltip": "Kavita は、関係性のないシリーズを表示するか、もしくは親作品 / 前日譚を表示します", - "share-series-reviews-label": "レビューを共有する", + "collapse-series-relationships-tooltip": "Kavita は、関係性のないシリーズを表示するか、もしくは親作品 / 前編を表示します", + "share-series-reviews-label": "レビューを共有", "share-series-reviews-tooltip": "このサーバー上の他のユーザーに自分のレビューを公開します", "clients-opds-alert": "このサーバーでは OPDS が有効になっていません。Mihon ユーザーには影響はありません。", "clients-opds-description": "すべてのサードパーティクライアントは、OPDS 認証キーまたは下記の接続 URL のいずれかを使用します。これらはパスワードのようなものですので、公開しないでください。", "clients-opds-url-label": "OPDS URL", - "clients-opds-url-tooltip": "サポートされている OPDS クライアントのリストを参照してください: ", + "clients-opds-url-tooltip": "サポートされている OPDS クライアントのリスト: ", "reset": "{{common.reset}}", "save": "{{common.save}}", "kavitaplus-settings-title": "Kavita+", @@ -132,7 +132,7 @@ "social-settings-title": "ソーシャル設定", "highlight-bar-label": "注釈のハイライトカラー", "highlight-bar-tooltip": "この色設定はすべての本で共有されます", - "colorscape-label": "ColorScape を使用", + "colorscape-label": "色空間を使用する", "data-saver-label": "データセーバー", "data-saver-tooltip": "自動プリフェッチを防止することでデータ使用量を最小限に抑えます (例: PDF リーダー)", "social-include-unknowns-tooltip": "年齢制限が未設定のシリーズや章でもソーシャル機能を有効にします", @@ -142,9 +142,9 @@ "opds-settings-title": "OPDS 設定", "colorscape-tooltip": "ダイナミックグラデーション機能を有効 / 無効にするグローバルトグルです。テーマ設定を上書きします", "prompt-for-rereads-after-label": "再読み込みを促す", - "share-annotations-label": "注釈を共有する", + "share-annotations-label": "注釈を共有", "share-annotations-tooltip": "このサーバー上の他のユーザーに注釈を表示できるようにします", - "view-other-annotations-label": "共有された注釈を表示する", + "view-other-annotations-label": "共有された注釈を表示", "view-other-annotations-tooltip": "読書中に他のユーザーの注釈を表示します", "social-libraries-label": "ソーシャルライブラリ", "social-libraries-tooltip": "ソーシャル機能を有効にするライブラリです。選択しない場合は、すべての場所でソーシャル機能が有効になります。特定の機能をどの場所でも使用しない場合は、無効にしてください。", @@ -323,7 +323,7 @@ "type-header": "入力", "name-header": "名前", "cancel": "{{common.cancel}}", - "share": "シェア", + "share": "共有", "help": "{{common.help}}" }, "library-access-modal": { @@ -381,7 +381,7 @@ "years": "{{value}} 年" }, "time-ago-pipe": { - "never": "もう質問しない", + "never": "一度もない", "just-now": "たったいま", "min-ago": "1 分前", "mins-ago": "{{value}} 分前", @@ -398,7 +398,7 @@ "adaptation": "適応する", "alternative-setting": "代替の設定", "alternative-version": "かわりのバージョン", - "character": "キャラクター", + "character": "キャラクターデザイン", "contains": "含む", "doujinshi": "同人誌", "other": "その他", @@ -418,18 +418,18 @@ "ended": "完結" }, "person-role-pipe": { - "artist": "作家", - "character": "キャラクター原案", - "colorist": "カラリスト", + "artist": "作画 / 著者", + "character": "キャラクターデザイン", + "colorist": "彩色 (カラー)", "editor": "編集", - "inker": "線画担当", - "letterer": "レタラー", - "penciller": "下書き", + "inker": "ペン入れ / インカー", + "letterer": "文字入れ (レタリング)", + "penciller": "下書き (線画)", "publisher": "出版社", - "writer": "筆者", + "writer": "原作 / 脚本 (ストーリー)", "other": "その他", - "imprint": "インプリント", - "translator": "翻訳者", + "imprint": "レーベル (インプリント)", + "translator": "翻訳", "team": "{{filter-field-pipe.team}}", "location": "{{filter-field-pipe.location}}" }, @@ -710,23 +710,24 @@ "metadata-fields": { "collections-title": "{{side-nav.collections}}", "reading-lists-title": "{{side-nav.reading-lists}}", - "writers-title": "筆者", + "writers-title": "原作 / 脚本 (ストーリー)", "genres-title": "ジャンル", "tags-title": "タグ", "language-title": "言語", "age-rating-title": "年齢制限", - "cover-artists-title": "作家", - "characters-title": "キャラクター", - "colorists-title": "カラーリスト", - "editors-title": "編集者", - "inkers-title": "インカー", - "letterers-title": "レタラー", - "translators-title": "翻訳者", - "pencillers-title": "ペンシラー", + "cover-artists-title": "作画 / 著者", + "characters-title": "キャラクターデザイン", + "colorists-title": "彩色 (カラー)", + "editors-title": "編集", + "inkers-title": "ペン入れ / インカー", + "letterers-title": "文字入れ (レタリング)", + "translators-title": "翻訳", + "pencillers-title": "下書き (線画)", "publishers-title": "出版社", "locations-title": "場所", - "teams-title": "チーム", - "links-title": "Web リンク" + "teams-title": "制作チーム", + "links-title": "Web リンク", + "imprints-title": "レーベル (インプリント)" }, "external-rating": { "close": "{{common.close}}", @@ -770,7 +771,7 @@ "customize": "{{settings.customize}}", "edit": "{{common.edit}}", "browse-people": "人物を表示", - "cancel-edit": "並べ替えをキャンセル" + "cancel-edit": "再配列をキャンセル" }, "library-settings-modal": { "close": "{{common.close}}", @@ -785,14 +786,14 @@ "library-name-unique": "ライブラリ名は一意である必要があります", "last-scanned-label": "最終スキャン:", "type-label": "タイプ", - "type-tooltip": "ライブラリのタイプは、ファイル名の解析方法と、UI に「章(マンガ)」と「号(コミック)」のどちらを表示するかを決定します。ライブラリのタイプ間の違いについては、Wiki をご確認ください。", + "type-tooltip": "ライブラリのタイプは、ファイル名の解析方法と、UI に「章(マンガ)」と「号(コミック)」のどちらを表示するかを決定します。ライブラリのタイプ間の違いについては、Wiki をご覧ください。", "kavitaplus-eligible-label": "Kavita+ 対象", "kavitaplus-eligible-tooltip": "Kavita+ メタデータ機能および / または Scrobbling をサポートします", "folder-description": "ライブラリにフォルダーを追加する", "browse": "メディアフォルダーを参照する", - "help-us-part-1": "従ってください ", + "help-us-part-1": "メディアの命名と整理方法の ", "help-us-part-2": "ガイド", - "help-us-part-3": "メディアに名前を付けて整理します。", + "help-us-part-3": "に従ってください。", "naming-conventions-part-1": "Kavita には ", "naming-conventions-part-2": "フォルダーの要件があります。", "naming-conventions-part-3": "このリンクを確認して、正しく従っていることを確認してください。そうでない場合、スキャンでファイルが表示されない可能性があります。", @@ -818,14 +819,14 @@ "save": "{{common.save}}", "required-field": "{{validation.required-field}}", "file-type-group-label": "ファイルの種類", - "file-type-group-tooltip": "Kavita がスキャンする種類のファイル。例えば、アーカイブには cb*、zip、rar などのすべてのファイルが含まれます。", + "file-type-group-tooltip": "Kavita がスキャンするファイル形式を選択します。例えば、アーカイブには cb*、zip、rar などのすべてのファイルが含まれます。", "exclude-patterns-label": "除外パターン", "exclude-patterns-tooltip": "Kavita がディレクトリをスキャンする際に一致させるパターン (Glob 構文) のセットを設定し、スキャナーの結果から除外します。", "help": "{{common.help}}", "files-at-root-warning": "1 つ以上のフォルダーの直下にファイルが存在します。Kavita はこれをサポートしていません。", "allow-metadata-matching-label": "メタデータのマッチングを許可する", "allow-metadata-matching-tooltip": "Kavita+ サブスクリプションがアクティブな場合、このライブラリ内のシリーズのメタデータをダウンロードします。", - "enable-metadata-label": "メタデータを有効にする (ComicInfo/Epub/PDF)", + "enable-metadata-label": "メタデータを有効にする (ComicInfo/EPUB/PDF)", "enable-metadata-tooltip": "ファイル名の解析を上書きするメタデータファイルを Kavita が読み取れるようにします。", "remove-prefix-for-sortname-label": "ソート名の共通プレフィックスを削除する", "remove-prefix-for-sortname-tooltip": "Kavita は、ソート名のタイトルから「The」、「A」、「An」などの一般的な接頭辞を削除します。設定されたメタデータは上書きされません。", @@ -836,7 +837,7 @@ }, "file-type-group-pipe": { "archive": "アーカイブ", - "epub": "Epub", + "epub": "EPUB", "pdf": "PDF", "image": "画像" }, @@ -855,12 +856,12 @@ "vertical": "垂直", "writing-style-label": "{{user-preferences.writing-style-label}}", "writing-style-tooltip": "テキストの方向を変更します。水平は横書き、垂直は縦書きです。", - "tap-to-paginate-label": "タップによるページ送り", - "tap-to-paginate-tooltip": "画面の端をクリックしてページ送りする", + "tap-to-paginate-label": "タップでページ移動", + "tap-to-paginate-tooltip": "画面の端をタップしてページをめくります", "on": "オン", "off": "オフ", "immersive-mode-label": "{{manage-reading-profiles.immersive-mode-label}}", - "immersive-mode-tooltip": "これにより、リーダードキュメント上のクリックでメニューが非表示になり、タップでページ送りが有効になります", + "immersive-mode-tooltip": "これにより、リーダードキュメントのクリックでメニューが非表示になり、タップでページ移動が有効になります", "fullscreen-label": "フルスクリーン", "fullscreen-tooltip": "フルスクリーンモード", "exit": "終了", @@ -890,8 +891,8 @@ "bookmarks": { "title": "{{side-nav.bookmarks}}", "series-count": "{{common.series-count}}", - "no-data": "ブックマークがありません。作成してください", - "no-data-2": "1", + "no-data": "ブックマークがありません。作成してみましょう", + "no-data-2": "Wiki で作成方法を確認", "confirm-delete": "複数のシリーズのブックマークをすべて削除してもよろしいですか? この操作は元に戻せません。", "confirm-single-delete": "{{seriesName}} のすべてのブックマークを削除してもよろしいですか? この操作は元に戻せません。", "delete-success": "ブックマークが削除されました", @@ -1021,7 +1022,7 @@ "host-label": "ホスト", "host-tooltip": "メールサーバーの送信 /SMTP アドレス", "port-label": "PORT", - "username-label": "ユーザーネーム", + "username-label": "ユーザー名", "username-tooltip": "ホストに対して認証するために使用されるユーザー名", "password-label": "パスワード", "enable-ssl-label": "メールサーバーで SSL を使用する", @@ -1057,7 +1058,8 @@ "folder-count": "{{num}} 個のフォルダー", "bulk-copy-to": "{{libraryName}} から設定をコピーするライブラリを選択してください", "include-type-tooltip": "自動スキャンは行われません。次回のスキャンでは、解析の違いによりシリーズのずれが発生する可能性があります", - "bulk-action-label": "一括アクション" + "bulk-action-label": "一括アクション", + "include-type-label": "ライブラリの種類をコピーに含める" }, "copy-settings-from-library-modal": { "close": "{{common.close}}", @@ -1102,7 +1104,8 @@ "comment-header": "コメント", "edit-header": "編集", "edit-item-alt": "{{seriesName}} を編集", - "title": "Scrobbling エラー" + "title": "Scrobbling エラー", + "no-data": "問題はありません" }, "default-date-pipe": { "never": "もう質問しない" @@ -1110,7 +1113,7 @@ "manage-settings": { "notice": "お知らせ:", "restart-required": "ポート、ベース URL、キャッシュサイズ、または IP アドレスを変更するには、変更を反映させるために Kavita を手動で再起動する必要があります。", - "base-url-label": "ベースURL", + "base-url-label": "ベース URL", "base-url-tooltip": "Kavita をベース URL (例: yourdomain.com/kavita) でホストする場合は、こちらを使用してください。非ルートユーザーを使用した Docker ではサポートされていません。", "ip-address-label": "IPアドレス", "ip-address-tooltip": "サーバーがリッスンする IP アドレスのカンマ区切りリスト。Docker 上で実行している場合は固定値です。変更を反映するには再起動が必要です。", @@ -1121,7 +1124,7 @@ "log-label": "ログの日数", "log-tooltip": "保持するログの数です。デフォルトは 30、最小値は 1、最大値は 30 です。", "logging-level-label": "ログレベル", - "logging-level-tooltip": "問題を特定するためにはデバッグを使用してください。デバッグはディスク容量を大量に消費する可能性があります。", + "logging-level-tooltip": "問題を特定するためには Debug を使用してください。Debug はディスク容量を大量に消費する可能性があります。", "cache-size-label": "キャッシュサイズ", "cache-size-tooltip": "負荷の高い API をキャッシュするメモリ量。 デフォルトは 75 MBです。", "on-deck-last-progress-label": "「最近読んでいる本」最後の進捗からの日数", @@ -1326,7 +1329,8 @@ "custom-key-binds": "キーバインド", "cbl-import": "CBL 読書リスト", "mal-stack-import": "MAL スタック", - "admin-public-metadata": "メタデータの管理" + "admin-public-metadata": "メタデータの管理", + "scrobble-holds": "Scrobble を保留" }, "collection-detail": { "no-data": "項目がありません。シリーズを追加してみてください。", @@ -1339,26 +1343,26 @@ "all-collections": { "title": "コレクション", "item-count": "{{common.item-count}}", - "no-data": "コレクションはありません.", - "create-one-part-1": "作成を試みる", - "create-one-part-2": "1" + "no-data": "コレクションはありません。", + "create-one-part-1": "作成してみましょう", + "create-one-part-2": "Wiki で作成方法を確認" }, "carousel-reel": { "prev-items": "前の項目", "next-items": "次の項目" }, "draggable-ordered-list": { - "instructions-alt": "リオーダーの入力に数値を入力すると、その項目はその位置に挿入され、他のすべての項目の順序が更新されます。", - "reorder-label": "再設定", + "instructions-alt": "再配列の入力フィールドに番号を入力すると、その場所にアイテムが挿入され、他のすべてのアイテムの順序が更新されます。", + "reorder-label": "再配列", "bulk-select-label": "バルク選択項目", "remove-item-alt": "アイテムを削除" }, "reading-lists": { "title": "読書リスト", "item-count": "{{common.item-count}}", - "no-data": "読書リストはありません.", - "create-one-part-1": "作ってみる", - "create-one-part-2": "1" + "no-data": "読書リストはありません。", + "create-one-part-1": "作成してみましょう", + "create-one-part-2": "Wiki で作成方法を確認" }, "reading-list-item": { "remove": "{{common.remove}}", @@ -1396,7 +1400,7 @@ "items-title": "項目", "edit-label": "編集モード", "date-range-title": "日付範囲", - "reorder-alt": "アイテムの並べ替え", + "reorder-alt": "項目の再配列", "dnd-warning": "ドラッグ & ドロップ機能はモバイルデバイスでは利用できません。また、読書リストの項目数が 100 を超える場合も利用できません。" }, "events-widget": { @@ -1497,7 +1501,8 @@ "restack-count": "{{num}} 件の再スタック", "description": "MAL 興味スタックをインポートし、Kavita 内でコレクションを作成します", "title": "MAL 興味スタックをインポート", - "nothing-found": "何も見つかりません" + "nothing-found": "何も見つかりません", + "track": "追跡" }, "import-cbl-modal": { "close": "{{common.close}}", @@ -1568,7 +1573,7 @@ "unbookmark-page-tooltip": "ページのブックマークを解除", "bookmarks-title": "ブックマーク", "first-time-reading-manga": "いつでも画像をタップしてメニューを開くことができます。異なる設定を構成したり、進行バーをクリックしてページに移動したりできます。画像の側面をタップして次の/前のページに移動できます。", - "layout-mode-switched": "レイアウトモードが見開きレイアウトをレンダリングするのに十分な余白がないため、単一レイアウトに切り替えられました。", + "layout-mode-switched": "見開き表示をレンダリングするのに十分な余白がないため、表示モードが単ページ表示に切り替えられました", "no-next-chapter": "次の章はありません", "no-prev-chapter": "前の章はありません", "emulate-comic-book-label": "{{manage-reading-profiles.emulate-comic-book-label}}", @@ -1577,7 +1582,12 @@ "loading": "{{reader-settings.loading}}", "create-new": "{{reader-settings.create-new}}", "create-new-tooltip": "{{reader-settings.create-new-tooltip}}", - "off": "{{reader-settings.off}}" + "off": "{{reader-settings.off}}", + "page-offset-label": "ページオフセット (見開きの調整)", + "reading-profile-updated": "読書プロフィールを更新しました", + "reading-profile-promoted": "読書プロフィールを昇格しました", + "width-override-label": "幅の上書き", + "offset-only-double": "ページオフセットは、見開き表示でのみ使用できます" }, "metadata-filter": { "filter-title": "{{common.filter}}", @@ -1594,16 +1604,16 @@ "collections-label": "コレクション", "genres-label": "{{metadata-fields.genres-title}}", "tags-label": "{{metadata-fields.tags-title}}", - "cover-artist-label": "カバーアーティスト", - "writer-label": "作者", + "cover-artist-label": "表紙イラスト", + "writer-label": "原作 / 脚本 (ストーリー)", "publisher-label": "出版社", - "penciller-label": "下書き", - "letterer-label": "レタリング", - "inker-label": "インカー", - "editor-label": "編集者", - "colorist-label": "カラーリスト", - "character-label": "キャラクター原案", - "translator-label": "翻訳者", + "penciller-label": "下書き (線画)", + "letterer-label": "文字入れ (レタリング)", + "inker-label": "ペン入れ / インカー", + "editor-label": "編集", + "colorist-label": "彩色 (カラー)", + "character-label": "キャラクターデザイン", + "translator-label": "翻訳", "read-progress-label": "読書進捗", "unread": "未読", "read": "読む", @@ -1622,7 +1632,11 @@ "unit-reading-date": "日付", "unit-average-rating": "Kavita+の外部評価, パーセント", "unit-reading-progress": "パーセント", - "unit-user-rating": "星 0.0 - 5.0" + "unit-user-rating": "星 0.0 - 5.0", + "unit-read-last": "今日からの日数", + "disclaimer-highlight-slots": "このフィールドを使用すると、自分の注釈のみが表示されます", + "unit-file-size": "GB, MB, KB, B", + "disclaimer-file-size": "ファイルサイズには単位を含める必要があります" }, "sort-field-pipe": { "sort-name": "ソート名", @@ -1632,7 +1646,15 @@ "time-to-read": "読む時間", "release-year": "出版年", "read-progress": "最後に読んだ", - "average-rating": "平均評価" + "average-rating": "平均評価", + "annotation-color": "色", + "random": "ランダム", + "user-rating": "私の評価", + "person-name": "名前", + "person-series-count": "シリーズ数", + "person-chapter-count": "章数", + "annotation-owner": "所有者", + "annotation-series": "シリーズ名" }, "edit-series-modal": { "title": "{{seriesName}} の詳細", @@ -1694,15 +1716,17 @@ "pages-title": "{{edit-chapter-modal.pages-label}}", "chapter-title": "章", "volume-num": "{{common.volume-num}}", - "highest-count-tooltip": "シリーズ内のすべてのComicInfoで見つかった最大カウント", - "max-issue-tooltip": "シリーズ内のComicInfoの全てから最大のIssueまたはVolumeフィールドを取得します。", + "highest-count-tooltip": "ComicInfo から最大の総数を取得して適用", + "max-issue-tooltip": "ComicInfo から最大号数または巻数を取得して適用します", "release-year-validation": "{{validation.year-validation}}", "volumes-title": "{{tab.volumes-tab}}", "specials-volume": "特装版", "no-data": "{{common.no-data}}", "lowest-folder-path-title": "最下位フォルダーパス", "folder-path-tooltip": "すべてのシリーズファイルを含むライブラリルートからの最上位のパス", - "lowest-folder-path-tooltip": "すべてのシリーズファイルを含むライブラリルートからの最下位のパス" + "lowest-folder-path-tooltip": "すべてのシリーズファイルを含むライブラリルートからの最下位のパス", + "total-words-title": "総文字数", + "loose-leaf-volume": "個別の章" }, "edit-chapter-modal": { "close": "{{common.close}}", @@ -1741,7 +1765,19 @@ "last-read-label": "{{sort-field-pipe.read-progress}}", "pages-count": "{{series-detail.pages-count}}", "words-count": "{{series-detail.words-count}}", - "range-hours": "{{value}} {{hourWord}}" + "range-hours": "{{value}} {{hourWord}}", + "title": "編集", + "title-label": "タイトル", + "sort-order-label": "並べ替え順", + "isbn-label": "ISBN", + "release-date-label": "公開", + "pages-label": "ページ", + "words-label": "長さ", + "reading-time-label": "読書時間", + "date-added-label": "追加日", + "id-label": "ID", + "read-time-label": "読書時間", + "files-label": "ファイル" }, "edit-volume-modal": { "close": "{{common.close}}", @@ -1757,7 +1793,8 @@ "size-label": "{{edit-chapter-modal.size-label}}", "id-label": "{{edit-chapter-modal.id-label}}", "files-label": "{{edit-chapter-modal.files-label}}", - "cover-image-description": "{{edit-series-modal.cover-image-description}}" + "cover-image-description": "{{edit-series-modal.cover-image-description}}", + "title": "編集" }, "day-breakdown": { "title": "日別の内訳", @@ -1781,7 +1818,7 @@ "reading-activity": { "title": "読書アクティビティ", "legend-label": "フォーマット", - "x-axis-label": "タイム", + "x-axis-label": "時間", "y-axis-label": "読書時間", "no-data": "読書の進捗がありません", "time-frame-label": "時間枠", @@ -1791,15 +1828,16 @@ "last-90-days": "{{time-periods.last-90-days}}", "last-year": "{{time-periods.last-year}}", "all-time": "{{time-periods.all-time}}", - "all-users": "すべてのユーザー" + "all-users": "すべてのユーザー", + "select-user-alt": "フィルタリングするユーザーを選択" }, "publication-status-stats": { "title": "出版状況", "visualisation-label": "可視化", "data-table-label": "データテーブル", - "year-header": "年", "count-header": "カウント", - "no-data": "{{common.no-data}}" + "no-data": "{{common.no-data}}", + "status-header": "{{manage-matched-metadata.status-header}}" }, "series-preview-drawer": { "staff-label": "スタッフ", @@ -1812,7 +1850,8 @@ "provided-by-label": "提供:" }, "next-expected-card": { - "title": "~{{date}}" + "title": "~{{date}}", + "upcoming-title": "まもなく" }, "server-stats": { "total-series-label": "総シリーズ", @@ -1846,7 +1885,14 @@ "genres": "{{metadata-fields.genres-title}}", "stats-tab": "{{tabs.stats-tab}}", "management-tab": "{{tabs.management-tab}}", - "popular-person-title": "人気の {{role}}" + "popular-person-title": "人気の {{role}}", + "stats-title": "発見", + "users": "ユーザー", + "readers": "読者", + "popular-decades-title": "人気の年代", + "popular-reading-lists-title": "最も読まれている読書リスト", + "popular-genres-title": "人気ジャンル", + "popular-tags-title": "人気のタグ" }, "errors": { "series-doesnt-exist": "このシリーズはもう存在しません", @@ -1862,7 +1908,29 @@ "invalid-confirmation-email": "確認メールアドレスが無効です", "invalid-password-reset-url": "パスワードリセット URL が無効です", "oidc": { - "role-not-assigned": "このアプリケーションにアクセスするために必要な役割が割り当てられていません" + "role-not-assigned": "このアプリケーションにアクセスするために必要な役割が割り当てられていません", + "creating-user": "新規ユーザーの作成に失敗しました。管理者にお問い合わせください", + "missing-external-id": "OIDC は有効な識別子を返しませんでした", + "missing-email": "OIDC は有効なメールを返しませんでした", + "email-not-verified": "OIDC 経由でログインするには、メールアドレスを認証する必要があります", + "no-account": "一致するアカウントが見つかりません", + "disabled-account": "このアカウントは無効です。管理者にお問い合わせください", + "failed-to-update-email": "メールアドレスの更新に失敗しました", + "failed-to-update-username": "ユーザー名の更新に失敗しました", + "email-in-use": "メールアドレスは既に別のアカウントで使用されています", + "syncing-user": "OIDC からのアカウント同期に失敗しました。管理者にお問い合わせください" + }, + "delete-theme-in-use": "テーマは現在少なくとも 1 人のユーザーによって使用されているため、削除できません", + "theme-manual-upload": "手動アップロードからテーマを作成する際に問題が発生しました", + "theme-already-in-use": "その名前のテーマは既に存在します", + "delete-font-in-use": "フォントは現在少なくとも 1 人のユーザーによって使用されているため、削除できません", + "font-manual-upload": "手動アップロードからフォントを作成する際に問題が発生しました", + "font-already-in-use": "その名前のフォントは既に存在します", + "upload-too-large": "ファイルが大きすぎてアップロードできません。小さい画像を選択してもう一度お試しください。", + "invalid-form": "送信しようとしているフォームにエラーが含まれています", + "import-fields": { + "non-unique-fields": "フィールドマッピングに一意の ID がありません。インポートファイルを修正してください", + "non-unique-age-ratings": "年齢制限のマッピングキーが一意ではありません。インポートファイルを修正してください" } }, "metadata-builder": { @@ -1874,9 +1942,10 @@ "customize-dashboard-modal": { "title-smart-filters": "スマートフィルター", "dashboard": "ダッシュボード", - "sidenav": "サイドナビ", + "sidenav": "サイドナビゲーション", "external-sources": "外部ソース", - "smart-filters": "スマートフィルター" + "smart-filters": "スマートフィルター", + "description": "再配列、表示 / 非表示の切り替え、スマートフィルターや外部ソースをホームページまたはサイドナビゲーションにバインドすることで、Kavita のさまざまな要素をカスタマイズできます。" }, "customize-dashboard-streams": { "no-data": "すべてのスマートフィルターはダッシュボードに追加されたかまだ作成されていません。", @@ -1886,8 +1955,8 @@ "smart-filter-title": "{{customize-dashboard-modal.title-smart-filters}}" }, "customize-sidenav-streams": { - "no-data": "すべてのスマートフィルターはサイドバーに追加されたかまだ作成されていません。", - "no-data-external-source": "すべての外部ソースはサイドバーに追加されたかまだ作成されていません。", + "no-data": "すべてのスマートフィルターはサイドナビゲーションに追加されたかまだ作成されていません。", + "no-data-external-source": "すべての外部ソースはサイドナビゲーションに追加されたかまだ作成されていません。", "add": "{{common.add}}", "filter": "{{common.filter}}", "clear": "{{common.clear}}", @@ -1915,7 +1984,10 @@ "edit": "{{common.edit}}", "save": "{{common.save}}", "errored": "フィルターにエンコードエラーがあります。再作成する必要があります。", - "edit-smart-filter": "{{name}} を編集" + "edit-smart-filter": "{{name}} を編集", + "name-label": "名前", + "required-field": "スマートフィルターには名前が必要です", + "filter-name-unique": "スマートフィルター名は一意である必要があります" }, "edit-external-source-item": { "not-unique": "外部ソースはこのホストに存在します。 重複していないことを確認してください", @@ -1946,17 +2018,17 @@ "age-rating": "{{metadata-fields.age-rating-title}}", "characters": "{{metadata-fields.characters-title}}", "collection-tags": "コレクションタグ", - "colorist": "カラーリスト", + "colorist": "彩色 (カラー)", "cover-artist": "{{person-role-pipe.artist}}", - "editor": "編集者", + "editor": "編集", "formats": "フォーマット", "genres": "{{metadata-fields.genres-title}}", - "inker": "インカー", + "inker": "ペン入れ / インカー", "languages": "言語", "libraries": "{{common.libraries}}", - "letterer": "レタラー", + "letterer": "文字入れ (レタリング)", "publication-status": "出版状況", - "penciller": "下書き", + "penciller": "下書き (線画)", "publisher": "出版社", "read-progress": "読書進捗", "read-time": "読書時間", @@ -1964,7 +2036,7 @@ "series-name": "シリーズ名", "summary": "要約", "tags": "{{metadata-fields.tags-title}}", - "translators": "翻訳者", + "translators": "翻訳", "user-rating": "ユーザー評価", "writers": "{{metadata-fields.writers-title}}", "path": "パス", @@ -1972,7 +2044,11 @@ "want-to-read": "後で読む", "read-date": "読書日付", "average-rating": "平均評価", - "location": "ロケーション" + "location": "ロケーション", + "read-last": "最終閲覧", + "file-size": "ファイルサイズ", + "team": "制作チーム", + "imprint": "レーベル (インプリント)" }, "filter-comparison-pipe": { "begins-with": "はじめに", @@ -1990,14 +2066,15 @@ "is-after": "後です", "is-in-last": "最後まで", "is-not-in-last": "最後ではない", - "must-contains": "含まれている必要があります" + "must-contains": "含まれている必要があります", + "is-empty": "空です" }, "toasts": { "no-pages": "ページがありません。Kavita はこのアーカイブを読み取ることができませんでした。", "scan-queued": "{{name}} のスキャンがキューに追加されました", "server-settings-updated": "サーバー設定が更新されました", - "reset-ip-address": "IPアドレスのリセット", - "reset-base-url": "ベースURLのリセット", + "reset-ip-address": "IP アドレスのリセット", + "reset-base-url": "ベース URL のリセット", "unauthorized-1": "このページを表示する権限がありません。", "no-updates": "更新はありません", "confirm-delete-user": "このユーザーを削除してもよろしいですか?", @@ -2075,7 +2152,7 @@ "confirm-delete-multiple-chapters": "{{count}} 章 / 巻を削除してもよろしいですか? ディスク上のファイルは変更されません。", "confirm-delete-multiple-volumes": "{{count}} 個のボリュームを削除してもよろしいですか? ディスク上のファイルは変更されません。", "reading-lists-deleted": "読書リストを削除しました", - "generate-colorscape-queued": "{{name}} のカラースケープを生成しました", + "generate-colorscape-queued": "{{name}} の色空間を生成しました", "series-added-want-to-read": "「後で読む」リストからシリーズを追加しました", "confirm-delete-chapter": "この章を削除してもよろしいですか? ディスク上のファイルは変更されません。", "confirm-delete-volume": "この巻を削除してもよろしいですか? ディスク上のファイルは変更されません。", @@ -2085,7 +2162,33 @@ "library-bound-to-reading-profile": "ライブラリは {{amount}} 件の読書プロフィールに関連付けられています", "external-match-rate-error": "Kavita は {{seriesName}} を検索中にレート制限に到達しました。5 分後にもう一度お試しください。", "person-image-downloaded": "人物の画像がダウンロードされ、適用されました。", - "bulk-covers": "複数のライブラリの表紙を更新すると、処理に時間がかかる場合があります。続行してもよろしいですか?" + "bulk-covers": "複数のライブラリの表紙を更新すると、処理に時間がかかる場合があります。続行してもよろしいですか?", + "profile-unauthorized": "このユーザーはプロフィールを共有していません", + "collection-not-owned": "このコレクションの所有者ではありません", + "collections-promoted": "コレクションを昇格しました", + "collections-unpromoted": "コレクションを降格しました", + "reading-list-promoted": "読書リストを昇格しました", + "reading-list-unpromoted": "読書リストを降格しました", + "confirm-delete-collections": "複数のコレクションを削除してもよろしいですか?", + "collections-deleted": "コレクションを削除しました", + "chapter-deleted": "章を削除しました", + "volume-deleted": "巻を削除しました", + "pdf-book-mode-screen-size": "画面が小さすぎてブックモードにできません", + "stack-imported": "スタックをインポートしました", + "confirm-delete-theme": "このテーマを削除すると、ディスクからも削除されます。削除前に一時ディレクトリから取得することができます。", + "mal-token-required": "MAL トークンが必要です。ユーザー設定で設定してください", + "confirm-reset-server-settings": "設定を初期状態にリセットします。続行してもよろしいですか?", + "must-select-library": "少なくとも 1 つのライブラリを選択する必要があります", + "bulk-scan": "複数のライブラリのスキャンは順次処理されます。ライブラリのサイズによっては、処理に長時間かかる場合や、処理が完了しない場合があります。", + "match-success": "シリーズが正しく一致しました", + "k+-resend-welcome-email-success": "Kavita+ のメールアドレスにメールが送信されました", + "confirm-delete-bookmark": "このブックマークを削除してもよろしいですか?", + "confirm-delete-annotation": "この注釈を削除してもよろしいですか?", + "confirm-delete-font": "このフォントを削除すると、ディスクからも削除されます。削除前に一時ディレクトリから取得することができます。", + "confirm-force-delete-font": "このフォントは現在使用中です。強制的に削除しますか?削除すると、デフォルトのフォントに戻ります。", + "font-in-use": "フォントは 1 人以上のユーザーによって使用されているため、削除できません。", + "scrobble-gen-init": "過去の読書履歴と評価から Scrobble イベントを生成し、接続されたサービスと同期するジョブをキューに追加しました。", + "webtoon-override": "Webtoon を検知しました。Webtoon モードに切り替えます。" }, "actionable": { "scan-library": "ライブラリのスキャン", @@ -2113,8 +2216,8 @@ "import-cbl": "CBL をインポート", "read": "読む", "customize": "カスタマイズ", - "mark-visible": "可視としてマーク", - "mark-invisible": "目に見えないマーク", + "mark-visible": "表示可能としてマーク", + "mark-invisible": "非表示としてマーク", "back-to": "{{action}} に戻る", "title": "操作", "view-series-tooltip": "TODO", @@ -2135,14 +2238,45 @@ "remove-from-want-to-read-tooltip": "シリーズを「後で読む」から削除します", "reading-profiles": "読書プロフィール", "set-reading-profile": "読書プロフィールを設定", - "generate-colorscape-tooltip": "カラースケープと不足している表紙を生成します" + "generate-colorscape-tooltip": "ColorScape と不足している表紙を生成します", + "generate-colorscape": "色空間を生成", + "customize-tooltip": "TODO", + "mark-visible-tooltip": "TODO", + "mark-invisible-tooltip": "TODO", + "new-collection": "新しいコレクション", + "multiple-selections": "複数選択", + "copy-settings": "設定のコピー元", + "match": "マッチ", + "match-tooltip": "Kavita+ で手動でシリーズをマッチします", + "rename": "名前を変更", + "rename-tooltip": "スマートフィルターの名前を変更します", + "export": "エクスポート", + "merge": "マージ", + "like": "いいね", + "unlike": "いいねを削除", + "edit-device-name": "名前を編集", + "unpromote-tooltip": "表示を自分のアカウントのみに制限します", + "promote": "昇格", + "promote-tooltip": "項目をすべてのユーザーに表示します", + "unpromote": "降格", + "set-reading-profile-tooltip": "このライブラリに読書プロフィールを関連付けます", + "clear-reading-profile": "読書プロフィールを削除", + "clear-reading-profile-tooltip": "このライブラリの読書プロフィールを削除します", + "mark-as-unread-tooltip": "進捗状況を未読としてマークします", + "analyze-files-tooltip": "ファイルの拡張子の種類とサイズを分析します", + "settings-tooltip": "設定または詳細設定を表示します", + "edit-tooltip": "設定または詳細設定を編集します", + "mark-as-read-tooltip": "進捗状況を既読としてマークします", + "reorder": "再配列", + "cleared-profile": "読書プロフィールを削除しました", + "remove-from-on-deck-tooltip": "最近読んでいる本からシリーズを表示しないようにします" }, "preferences": { "left-to-right": "左から右へ", "right-to-left": "右から左へ", "horizontal": "水平", "vertical": "垂直", - "automatic": "オートマチック", + "automatic": "自動", "fit-to-height": "高さに合わせる", "fit-to-width": "幅に合わせる", "original": "オリジナル", @@ -2153,11 +2287,11 @@ "double": "見開き", "double-manga": "見開き (マンガ)", "scroll": "スクロール", - "1-column": "1行", - "2-column": "2行", + "1-column": "1 行", + "2-column": "2 行", "cards": "カード", "list": "リスト", - "up-to-down": "ダウンまで", + "up-to-down": "上から下へ", "pdf-book": "本", "pdf-multiple": "デフォルト", "pdf-horizontal": "水平スクロール", @@ -2166,7 +2300,7 @@ "pdf-odd": "奇数", "pdf-light": "ライト", "pdf-none": "無し", - "pdf-page": "タップでページ送り", + "pdf-page": "タップでページ移動", "pdf-vertical": "垂直スクロール", "split-right-to-left": "右から左に分割", "split-left-to-right": "左から右に分割" @@ -2206,7 +2340,7 @@ "email": "メールアドレス", "read": "読む", "loading": "読み込み中…", - "username": "ユーザーネーム", + "username": "ユーザー名", "password": "パスワード", "promoted": "昇格", "select-all": "全選択", @@ -2324,7 +2458,7 @@ "enable-relations-label": "関係", "enable-relations-tooltip": "シリーズの関係を 追加 できるようにします。", "enable-people-label": "人物", - "enable-people-tooltip": "人物 (登場人物、作家など) を 追加 できます。すべての人物には画像が含まれます。", + "enable-people-tooltip": "人物 (キャラクターデザイン、原作者など) を追加できます。すべての人物には画像が含まれます。", "enable-genres-tooltip": "シリーズジャンルの書き込みを許可します。", "enable-tags-tooltip": "シリーズタグの書き込みを許可します。", "enable-extended-metadata-processing-label": "拡張メタデータ処理", @@ -2359,7 +2493,8 @@ "field-mapping-title": "フィールドマッピング", "field-mapping-description": "ジャンル / タグフィールドで見つかった特定の文字列にルールを設定し、ジャンル / タグの新しい文字列にマッピングします。また、必要に応じてソースリストから削除することもできます。マッチングは正規化され、大文字と小文字は区別されません。最初に一致した値が使用されます。ジャンル / タグの書き込みが有効になっている場合にのみ適用されます。", "first-last-name-label": "姓と名の命名規則", - "blacklist-tooltip": "このリスト内の項目は、ジャンルとタグの処理の両方から除外されます。ここに、記述したくないジャンル/タグを追加してください。カンマ区切りで指定してください。" + "blacklist-tooltip": "このリスト内の項目は、ジャンルとタグの処理の両方から除外されます。ここに、記述したくないジャンル/タグを追加してください。カンマ区切りで指定してください。", + "whitelist-tooltip": "タグには、このリスト内の文字列のみを記入できます。文字列はカンマで区切られていることを確認してください。" }, "reviews": { "user-reviews-local": "ローカルレビュー", @@ -2408,7 +2543,7 @@ "require-verified-email-label": "メール認証を必須にする", "save-success": "OIDC 設定が正常に更新されました", "restart-required": "プロバイダーまたは詳細設定を変更した場合、変更を反映させるためには Kavita を手動で再起動する必要があります。", - "provider-tooltip": "プロバイダー設定では、手動で「保存」をクリックする必要があります。Kavita は機密クライアントとして設定する必要があり、リダイレクト URL が必要です。詳細は wiki を参照してください。", + "provider-tooltip": "プロバイダー設定では、手動で「保存」をクリックする必要があります。Kavita は機密クライアントとして設定する必要があり、リダイレクト URL が必要です。詳細は wiki をご覧ください。", "manual-save-label": "プロバイダー設定の変更には手動での保存が必要です", "authority-label": "権限", "authority-tooltip": "OIDC プロバイダーの URL です。.well-known/openid-configuration のパスは含めないでください", @@ -2481,7 +2616,7 @@ "url-label": "URL", "back": "戻る", "load": "ロード", - "description": "Kavita の EPUB リーダーにはいくつかのフォントが組み込まれていますが、ここで独自のフォントを追加できます。ファイルをアップロードするか、Google Fonts の URL を使用してください。詳細は wiki をご確認ください。", + "description": "Kavita の EPUB リーダーにはいくつかのフォントが組み込まれていますが、ここで独自のフォントを追加できます。ファイルをアップロードするか、Google Fonts の URL を使用してください。詳細は wiki をご覧ください。", "enter-an-url-pre-title": "{{url}} を入力", "preview-default": "ファイルまたは Google Fonts の URL から独自のフォントをアップロードします", "no-preview": "このフォントはプレビューできません。書籍のデフォルトスタイルが適用されます。", @@ -2629,7 +2764,7 @@ "hidden": "{{amount}} 件のプロフィールが無効な状態のため非表示になっています", "title": "読書プロフィールを設定", "no-data": "まだコレクションは作成されていません", - "bound": "関連付けられた", + "bound": "関連付け", "warning-duplicate": "選択したデバイスは重複しています。これは許可されていません" }, "email-history": { @@ -2653,23 +2788,59 @@ "configure-step": "設定", "conflicts-step": "衝突を解決する", "finalize-step": "確定", - "finalize-title": "設定をプレビューし、保存を押してインポートを完了します" + "finalize-title": "設定をプレビューし、保存を押してインポートを完了します", + "import-description": "自分または他のユーザーがエクスポートしたファイルをアップロードして、現在の設定を置き換えたり、現在の設定とマージしたりします。", + "merge": "マージ", + "import-mode-tooltip": "置換は現在の設定を無視し、マージは設定した方法で競合を解決しようとします", + "replace": "置換", + "select-files-warning": "続行するには JSON ファイルをアップロードする必要があります", + "invalid-file": "ファイルの解析に失敗しました。入力内容を確認してください", + "file-no-valid-content": "インポートしたファイルには処理を行うために必要なデータが含まれていません", + "whitelist-label": "ホワイトリストタグ", + "blacklist-label": "ブラックリストタグ", + "age-ratings-label": "年齢区分マッピング", + "field-mappings-label": "フィールドマッピング", + "age-ratings-conflicts-tooltip": "使用する年齢区分を決定します", + "import-mode-label": "インポートモード", + "resolution-label": "競合の解決", + "resolution-tooltip": "Kavita が競合をどのように処理するかを決定します", + "manual": "手動", + "to-pick": "解決策を選択", + "keep": "維持", + "field-mappings-conflicts-tooltip": "使用する宛先結果を選択してください" }, "merge-person-modal": { "title": "{{personName}}", "close": "{{common.close}}", "save": "{{common.save}}", "merge-warning": "続行すると、選択した人物が削除されます。選択した人物の名前がエイリアスとして追加され、その人物のすべての役割が移行されます。", - "src": "人物を合併", + "src": "人物をマージ", "alias-title": "新しいエイリアス", "known-for-title": "代表作" }, "confirm": { - "cancel": "{{common.cancel}}" + "cancel": "{{common.cancel}}", + "alert": "警告", + "confirm": "確認", + "info": "情報", + "ok": "OK", + "prompt": "質問" }, "generic-filter-field-pipe": { "series": "{{tabs.series-tab}}", - "person-role": "役割" + "person-role": "役割", + "annotation-highlights": "ハイライトカラー", + "person-name": "名前", + "person-series-count": "シリーズ数", + "person-chapter-count": "章数", + "average-rating": "平均評価", + "annotation-owner": "所有者", + "annotation-series": "シリーズ名", + "annotation-spoiler": "ネタバレ", + "annotation-comment": "注釈テキスト", + "annotation-selection": "テキストを強調表示", + "annotation-likes": "いいね", + "annotation-liked-by": "いいねした人" }, "metadata-setting-field-pipe": { "age-rating": "{{metadata-fields.age-rating-title}}", @@ -2697,11 +2868,11 @@ "reading-profile-library-settings-title": "ライブラリ", "pdf-scroll-mode-label": "スクロールモード", "reading-profile-series-settings-title": "シリーズ", - "pdf-scroll-mode-tooltip": "ページのスクロール方法です。縦 / 横とタップしてページ送り (スクロールなし)", + "pdf-scroll-mode-tooltip": "ページのスクロール方法を設定します。縦 / 横とタップでページ移動 (スクロールなし)", "pdf-theme-label": "テーマ", "pdf-theme-tooltip": "リーダーのカラーテーマ", - "pdf-spread-mode-label": "スプレッドモード", - "pdf-spread-mode-tooltip": "ページのレイアウト方法です。単ページまたは見開き (奇数 / 偶数ページ)", + "pdf-spread-mode-label": "見開き表示", + "pdf-spread-mode-tooltip": "ページのレイアウト方法を選択します。単一ページ、または見開き (奇数 / 偶数ページ) から設定可能です", "pdf-reader-settings-title": "PDF リーダー", "confirm": "読書プロフィール {{name}} を削除してもよろしいですか?", "select-devices-for": "{{name}} のデバイスを設定する", @@ -2720,21 +2891,49 @@ "line-height-book-tooltip": "本の行間のスペースを設定します", "margin-book-label": "余白", "margin-book-tooltip": "画面の両端の余白の大きさを設定します。モバイルデバイスでは、この設定に関係なく 0 に設定されます。", - "wiki-title": "Wiki", + "wiki-title": "Wiki をご覧ください。", "profiles-title": "あなたの読書プロフィール", "default-profile": "デフォルト", "book-reader-settings-title": "書籍リーダー", - "tap-to-paginate-label": "タップしてページ区切り", + "tap-to-paginate-label": "タップでページ移動", "show-screen-hints-label": "画面にヒントを表示", "show-screen-hints-tooltip": "ページ区切りの領域と方向を理解するのに役立つオーバーレイを表示します", "emulate-comic-book-tooltip": "本物の本を読んでいるような影の効果を適用します", - "emulate-comic-book-label": "コミック本の陰影を再現", + "emulate-comic-book-label": "漫画本の陰影を再現", "immersive-mode-label": "没入モード", - "immersive-mode-tooltip": "これにより、リーダードキュメントのクリックの背後にあるメニューが非表示になり、タップしてページ区切りがオンになります", - "swipe-to-paginate-label": "スワイプしてページ送り", - "swipe-to-paginate-tooltip": "画面をスワイプして次 / 前のページに切り替えるかどうかを設定します", + "immersive-mode-tooltip": "これにより、リーダードキュメントのクリックでメニューが非表示になり、タップでページ移動が有効になります", + "swipe-to-paginate-label": "スワイプでページ移動", + "swipe-to-paginate-tooltip": "画面をスワイプして前後のページに移動するかどうかを設定します", "allow-auto-webtoon-reader-label": "自動 Webtoon リーダーモード", - "allow-auto-webtoon-reader-tooltip": "ページが Webtoon のように見える場合は、Webtoon リーダーモードに切り替えてください。誤検出が発生する可能性があります。" + "allow-auto-webtoon-reader-tooltip": "ページが Webtoon のように見える場合は、Webtoon リーダーモードに切り替えてください。誤検出が発生する可能性があります。", + "scaling-option-label": "スケーリングオプション", + "extra-tip": "シリーズやライブラリのアクションメニューから、または一括で読書プロフィールを割り当てます。リーダーで設定を変更すると、PDF を除いたそのシリーズの設定を記憶する非表示のプロフィールが作成されます。このプロフィールは、シリーズに独自の読書プロフィールを割り当てると削除されます。詳細については、", + "description": "すべてのシリーズを同じ方法で読めるとは限りません。ライブラリ / シリーズ / デバイスごとに異なる読書プロフィールを設定し、シリーズに戻るときにシームレスな体験を実現しましょう。", + "add-tooltip": "プロフィールの変更後、新しいプロフィールが保存されます", + "make-default": "デフォルトとして設定", + "no-selected": "プロフィールが選択されていません", + "selection-tip": "リストからプロフィールを選択するか、右上で新しいプロフィールを作成します", + "set-devices": "デバイスの設定", + "image-reader-settings-title": "画像リーダー", + "reading-direction-label": "読む方向", + "reading-direction-tooltip": "ページ送りの方向を選択します。「右から左へ」は、画面の左側をクリックして次のページに進むことを意味します。", + "background-color-label": "背景色", + "background-color-tooltip": "画像リーダーの背景色", + "scaling-option-tooltip": "画像を画面に合わせて拡大縮小する方法を選択します。", + "page-splitting-label": "ページ分割", + "page-splitting-tooltip": "左右が結合された「見開き画像」の分割方法を選択します", + "reading-mode-label": "読書モード", + "reading-mode-tooltip": "リーダーの表示設定を「縦めくり」、「横めくり」、または「連続スクロール」に変更します", + "layout-mode-label": "レイアウトモード", + "layout-mode-tooltip": "表示形式を「単ページ」か「見開き」から選択できます。見開き時は、漫画の閲覧に最適な「右開きレイアウト」の設定も可能です", + "auto-close-menu-label": "メニューを自動的に閉じる", + "auto-close-menu-tooltip": "メニューを自動的に閉じるかどうかを設定します", + "reading-direction-book-label": "読む方向", + "reading-direction-book-tooltip": "ページ送りの方向を設定します。「右から左へ」は、画面の左側をクリックして次のページに進むことを意味します。", + "tap-to-paginate-tooltip": "画面の両端をタップしてページをめくるかどうかを選択します", + "width-override-tooltip": "リーダー内の画像を横幅に合わせます", + "disable-width-override-label": "幅の上書きを無効にする", + "disable-width-override-tooltip": "画面が指定のサイズ (ブレークポイント) 以上、または以下の場合は、幅の上書き設定を適用しません" }, "manage-auth-keys": { "auth-keys-title": "APIキーの管理", @@ -2753,7 +2952,7 @@ "actions-label": "アクション", "rotate": "循環", "image-only": "画像", - "add-auth-key": "新しい" + "add-auth-key": "追加" }, "reread-modal": { "cancel": "{{common.cancel}}", @@ -2798,7 +2997,9 @@ "created-alt": "作成済み" }, "profile-overview": { - "want-to-read": "{{side-nav.want-to-read}}" + "want-to-read": "{{side-nav.want-to-read}}", + "currently-reading": "現在読書中", + "just-finished-reading": "読み終わった" }, "server-devices": { "client-devices-header": "{{manage-devices.client-devices-header}}", @@ -2871,66 +3072,112 @@ }, "files-over-time": { "no-data": "{{common.no-data}}", - "most-files": "{{date}} に {{count}} 個のファイルが追加されました" + "most-files": "{{date}} に {{count}} 個のファイルが追加されました", + "title": "時間の経過とともに追加されたファイル" }, "profile": { - "title": "{{username}} のプロフィール", - "stats-title": "{{username}} の {{libraryName}} における軌跡を振り返ってみましょう", + "title": "{{username}} さんのプロフィール", + "stats-title": "{{username}} さんの {{libraryName}} における軌跡を振り返ってみましょう", "overview-tab": "{{tabs.overview-tab}}", "stats-tab": "{{tabs.stats-tab}}", "reviews-tab": "{{tabs.reviews-tab}}", "activity-tab": "{{tabs.activity-tab}}", - "total-reads-badge": "{{reads}} 回読書" + "total-reads-badge": "{{reads}} 回読書", + "time-reading-label": "総読書時間:", + "avg-reading-per-week-label": "週平均:", + "last-read-label": "最終閲覧:", + "no-reviews": "まだレビューはありません", + "k+-badge": "K+ 加入者", + "joined-label": "登録:" }, "profile-stat-bar": { - "books-read-tooltip": "読んだ本: {{count}} 冊", + "books-read-tooltip": "読書数: {{count}} 冊", "comics-read-tooltip": "読んだコミック: {{count}} 冊", "pages-read-tooltip": "読んだページ数: {{count}} ページ", "words-read-tooltip": "読んだ文字数: {{count}} 文字", "authors-read-tooltip": "読んだ著者: {{count}}", "reviews-tooltip": "レビュー: {{count}} 件", - "ratings-tooltip": "評価: {{count}} 件" + "ratings-tooltip": "評価: {{count}} 件", + "books-read-label": "読んだ冊数", + "comics-read-label": "読んだコミック", + "pages-read-label": "読んだページ数", + "words-read-label": "読んだ文字数", + "authors-read-label": "読んだ著者", + "reviews-label": "レビュー", + "ratings-label": "評価" }, "profile-activity": { - "time-filter-title": "{{username}} の活動を通じて", + "time-filter-title": "{{username}} さんの活動を通じて", "pages-count": "{{series-detail.pages-count}}", "words-count": "{{series-detail.words-count}}", "no-data": "{{common.no-data}}", "pages-read": "{{reading-pace.pages-read}}", "words-read": "{{reading-pace.words-read}}", - "page-info": "{{current}} / {{total}} ページ (合計 {{items}} 件)" + "page-info": "{{current}} / {{total}} ページ (合計 {{items}} 件)", + "duration": "期間", + "time": "時間", + "info-alt": "詳細情報", + "today": "今日", + "yesterday": "昨日", + "pagination-label": "アクティビティの表示設定" }, "user-stats-info-cards": { "pages-count": "{{num}} ページ", - "words-count": "{{num}} 文字" + "words-count": "{{num}} 文字", + "pages-read-by-year-title": "年間の読書ページ数", + "words-read-by-year-title": "年間に読んだ文字数" }, "preferred-format": { - "sub-title": "{{name}} は {{format}} で読むことを好みます", - "no-data": "{{common.no-data}}" + "sub-title": "{{name}} は {{format}} でよく読みます", + "no-data": "{{common.no-data}}", + "title": "よく読むフォーマット" }, "favorite-authors": { "sub-title": "{{name}} の最も読まれている著者は {{author}} で、合計 {{count}} 回読まれています", - "no-data": "{{common.no-data}}" + "no-data": "{{common.no-data}}", + "title": "最も読まれている著者" }, "page-spread": { - "sub-title": "{{username}} は {{highestBucket}} ページ間の章を読みました", + "sub-title": "{{username}} さんは、1 章あたり {{highestBucket}} ページ程度の本をよく読んでいます", "no-data": "{{common.no-data}}", "data-type": "{{data}} 章", "data-of": "章の {{percentage}}%", - "range": "ページ範囲: {{range}}" + "range": "ページ範囲: {{range}}", + "title": "章毎のページ数" }, "browse-title-pipe": { "imprint": "{{value}} の印刷", - "team": "チーム {{value}}", - "location": "{{value}} の場所" + "team": "制作チーム {{value}}", + "location": "{{value}} の場所", + "colorist": "{{value}} によって色付けされました", + "publication-status": "{{value}} 作品", + "age-rating": "評価 {{value}}", + "user-rating": "{{value}} つ星評価", + "tag": "タグ {{value}} があります", + "translator": "{{value}} によって翻訳されました", + "character": "{{value}} 文字あります", + "publisher": "{{value}} によって出版されました", + "editor": "{{value}} によって編集されました", + "artist": "{{value}} によって描画されました", + "letterer": "{{value}} によって文字入れされました", + "inker": "{{value}} によってペン入れされました", + "penciller": "{{value}} によって下書きされました", + "writer": "{{value}} によって書かれました", + "genre": "ジャンル {{value}} があります", + "library": "{{value}} のライブラリ内にあります", + "format": "{{value}} の形式", + "release-year": "{{value}} に発売" }, "genre-breakdown": { "no-data": "{{common.no-data}}", - "missing": "{{amount}} 個のシリーズにジャンルがありません" + "missing": "{{amount}} 個のシリーズにジャンルがありません", + "title": "最も読まれているジャンル", + "sub-title": "{{name}} が一番多く読んだジャンルは {{mostUsed}} です" }, "reads-by-month": { - "sub-title": "{{username}} は {{year}} {{month}} に最も多く読み、{{reads}} 章を読みました", - "no-data": "{{common.no-data}}" + "sub-title": "{{username}} さんは、{{year}} {{month}} に最も多く読み、{{reads}} 章を読みました", + "no-data": "{{common.no-data}}", + "title": "月別総読書数" }, "avg-time-reading-by-hour": { "most-time-spend-reading": "{{name}} は、{{startHour}} から {{endHour}} までの間に、平均 {{amount}} 分間読書に費やしています", @@ -2942,27 +3189,61 @@ "no-data": "{{common.no-data}}", "data-type": "{{data}} 章", "data-of": "章の {{percentage}}%", - "range": "文字数の範囲: {{range}}" + "range": "文字数の範囲: {{range}}", + "title": "章毎の文字数", + "sub-title": "{{username}} さんは、1 章あたり {{highestBucket}} 文字程度の本をよく読んでいます" }, "tag-breakdown": { "no-data": "{{common.no-data}}", - "missing": "{{amount}} 個のシリーズにタグがありません" + "missing": "{{amount}} 個のシリーズにタグがありません", + "sub-title": "{{name}} が一番多く読んだタグは {{mostUsed}} です", + "title": "最も読まれたタグ" }, "reading-pace": { "no-data": "{{common.no-data}}", - "sub-title-books": "{{username}} は {{count}} 日に 1 冊のペースで本を読みます", - "sub-title-comics": "{{username}} は {{count}} 日に 1 冊のペースでコミックを読みます" + "sub-title-books": "{{username}} さんは、{{count}} 日に 1 冊のペースで本を読みます", + "sub-title-comics": "{{username}} さんは、{{count}} 日に 1 冊のペースでコミックを読みます", + "disclaimer-books": "EPUB/PDF に適用", + "title-books": "読書ペース: 本", + "title-comics": "読書ペース: コミック", + "hours-read": "読書時間", + "pages-read": "読んだページ数", + "words-read": "読んだ文字数", + "books-read": "読んだ冊数", + "comics-read": "読んだコミック数", + "per-year": "年間", + "per-month": "月間", + "per-day": "1 日あたり", + "disclaimer-comics": "画像 / アーカイブに適用" }, "activity-graph": { "all-time": "{{time-periods.all-time}}", "aggregated-count": "{{year}} に {{totalPages}} ページ、{{totalWords}} 文字を読みました", - "no-activity-tooltip": "{{date}} に読書アクティビティはありませんでした。" + "no-activity-tooltip": "{{date}} に読書アクティビティはありませんでした。", + "title": "読書活動", + "day-of-week-alt": "曜日", + "less": "少ない", + "more": "多い", + "reading-time": "読書時間", + "pages": "ページ数", + "words": "文字数", + "no-activity-alt": "アクティビティなし", + "low-activity-alt": "低活動", + "moderate-activity-alt": "中程度の活動", + "good-activity-alt": "良い活動", + "high-activity-alt": "高活動", + "chapters": "読み終わった章" }, "smart-time-picker": { "during-year": "{{year}} の間に", "during-from-to": "{{startYear}} から {{endYear}} まで", "close": "{{common.close}}", - "during-select": "時間範囲を選択" + "during-select": "時間範囲を選択", + "forever": "永久", + "select-year": "年を選択", + "custom-range": "カスタム範囲", + "during-entire-life-profile": "全期間", + "during-entire-life-server": "最初から" }, "client-device-type-pipe": { "Unknown": "{{common.unknown}}", @@ -3057,7 +3338,34 @@ "full-read-incognito": "シークレットモードでもう一度読む" }, "keybind-setting-description-pipe": { - "key-bind-title-navigate-to-settings": "設定を開く" + "key-bind-title-navigate-to-settings": "設定を開く", + "key-bind-tooltip-navigate-to-settings": "リーダーを開くことなく設定を開きます", + "key-bind-title-open-search": "検索を開く", + "key-bind-tooltip-open-search": "上部の検索バーを開きます", + "key-bind-title-navigate-to-scrobbling": "Scrobbling を開く", + "key-bind-tooltip-navigate-to-scrobbling": "Scrobbling タブの設定ページを開きます", + "key-bind-title-toggle-fullscreen": "全画面表示を切り替える", + "key-bind-tooltip-toggle-fullscreen": "F11 の代替", + "key-bind-title-bookmark-page": "現在のページをブックマークに追加する", + "key-bind-tooltip-bookmark-page": "表示されている画像をブックマークとして保存します", + "key-bind-title-open-help": "ヘルプメニューを開く", + "key-bind-tooltip-open-help": "関連するすべてのキーバインドを含むヘルプモーダルを開きます", + "key-bind-title-go-to": "ページへ移動", + "key-bind-tooltip-go-to": "ページを切り替えるためのプロンプトを開きます", + "key-bind-tooltip-escape": "今の操作画面を閉じます", + "key-bind-title-escape": "閉じる", + "key-bind-title-toggle-menu": "メニューの開閉", + "key-bind-tooltip-toggle-menu": "リーダーメニューを開閉します", + "key-bind-title-page-left": "左へ移動", + "key-bind-tooltip-page-left": "1 ページ左へ移動します", + "key-bind-title-page-right": "右へ移動", + "key-bind-tooltip-page-right": "1 ページ右へ移動します", + "key-bind-title-page-up": "前のページ (上)", + "key-bind-tooltip-page-up": "1 ページ前に戻ります (または、上に移動します)", + "key-bind-title-page-down": "次のページ (下)", + "key-bind-tooltip-page-down": "1 ページ次に進みます (または、下に移動します)", + "key-bind-title-offset-double-page": "見開きの切り替え", + "key-bind-tooltip-offset-double-page": "見開き表示のページ割りを 1 ページ分ずらして調整します。漫画の見開き表示に役立ちます" }, "pdf-layout-mode-pipe": { "single": "単ページ", @@ -3068,6 +3376,39 @@ "pdf-scroll-mode-pipe": { "vertical": "垂直", "horizontal": "水平", - "page": "タップしてページ区切り" + "page": "タップでページ移動", + "wrapped": "画面幅に応じたページの自動詰め込み表示" + }, + "breakpoint-pipe": { + "mobile": "モバイル", + "tablet": "タブレット", + "desktop": "デスクトップ", + "never": "無し" + }, + "log-level-pipe": { + "debug": "Debug", + "information": "Information", + "trace": "Trace", + "warning": "Warning", + "critical": "Critical" + }, + "server-activity": { + "no-data": "ここには何もありません" + }, + "activity-card": { + "total-pages-label": "総ページ数", + "total-words-label": "総文字数", + "total-chapters-label": "章", + "started-label": "開始", + "view-label": "表示" + }, + "profile-review-list": { + "no-data": "レビューがないか、レビューが共有されていません", + "filter-label": "シリーズで絞り込む", + "clear-rating-alt": "評価フィルターを削除" + }, + "profile-image": { + "edit-image-alt": "画像を編集", + "reset-image-alt": "画像をリセット" } } diff --git a/UI/Web/src/assets/langs/ko.json b/UI/Web/src/assets/langs/ko.json index 1d46fedd8..a0c2c58ab 100644 --- a/UI/Web/src/assets/langs/ko.json +++ b/UI/Web/src/assets/langs/ko.json @@ -1851,7 +1851,6 @@ "title": "출판현황", "visualisation-label": "시각화", "data-table-label": "데이터 테이블", - "year-header": "년", "count-header": "카운트" }, "series-preview-drawer": { @@ -3267,7 +3266,7 @@ "reading-time": "읽은 시간", "pages": "페이지", "words": "단어", - "chapters": "챕터", + "chapters": "완결된 챕터", "no-activity-tooltip": "{{date}}에는 독서 활동이 없습니다.", "no-activity-alt": "활동 없음", "all-time": "{{time-periods.all-time}}", diff --git a/UI/Web/src/assets/langs/pl.json b/UI/Web/src/assets/langs/pl.json index 3e448cafc..c9750665a 100644 --- a/UI/Web/src/assets/langs/pl.json +++ b/UI/Web/src/assets/langs/pl.json @@ -1823,7 +1823,6 @@ "title": "Status publikacji", "visualisation-label": "Wizualizacja", "data-table-label": "Tabela danych", - "year-header": "Rok", "count-header": "Liczba", "no-data": "{{common.no-data}}" }, diff --git a/UI/Web/src/assets/langs/pt.json b/UI/Web/src/assets/langs/pt.json index 402474a4c..54e5f76a4 100644 --- a/UI/Web/src/assets/langs/pt.json +++ b/UI/Web/src/assets/langs/pt.json @@ -1855,7 +1855,6 @@ "title": "Estado de Publicação", "visualisation-label": "Visualização", "data-table-label": "Tabela de Dados", - "year-header": "Ano", "count-header": "Contador", "no-data": "{{common.no-data}}" }, diff --git a/UI/Web/src/assets/langs/pt_BR.json b/UI/Web/src/assets/langs/pt_BR.json index 7bd247cdb..9e497b2cd 100644 --- a/UI/Web/src/assets/langs/pt_BR.json +++ b/UI/Web/src/assets/langs/pt_BR.json @@ -1855,9 +1855,9 @@ "title": "Situação da Publicação", "visualisation-label": "Visualização", "data-table-label": "Tabela de Dados", - "year-header": "Ano", "count-header": "Número", - "no-data": "{{common.no-data}}" + "no-data": "{{common.no-data}}", + "status-header": "{{manage-matched-metadata.status-header}}" }, "series-preview-drawer": { "staff-label": "Pessoal", diff --git a/UI/Web/src/assets/langs/sk.json b/UI/Web/src/assets/langs/sk.json index 2fcf5b65c..73ac19943 100644 --- a/UI/Web/src/assets/langs/sk.json +++ b/UI/Web/src/assets/langs/sk.json @@ -1787,7 +1787,6 @@ "title": "Stav publikácie", "visualisation-label": "Vizualizácia", "data-table-label": "Tabuľka údajov", - "year-header": "Rok", "count-header": "Počet" }, "series-preview-drawer": { diff --git a/UI/Web/src/assets/langs/sv.json b/UI/Web/src/assets/langs/sv.json index 43ddcf792..6634c58d6 100644 --- a/UI/Web/src/assets/langs/sv.json +++ b/UI/Web/src/assets/langs/sv.json @@ -2333,7 +2333,6 @@ }, "publication-status-stats": { "data-table-label": "Datatabell", - "year-header": "År", "visualisation-label": "Visualisering", "count-header": "Antal", "title": "Publikationsstatus" diff --git a/UI/Web/src/assets/langs/ta.json b/UI/Web/src/assets/langs/ta.json index 3737f0c64..5201743d7 100644 --- a/UI/Web/src/assets/langs/ta.json +++ b/UI/Web/src/assets/langs/ta.json @@ -1326,8 +1326,7 @@ "count-header": "எண்ணுங்கள்", "title": "வெளியீட்டு நிலை", "visualisation-label": "காட்சிப்படுத்தல்", - "data-table-label": "தரவு அட்டவணை", - "year-header": "ஆண்டு" + "data-table-label": "தரவு அட்டவணை" }, "settings": { "admin-users": "பயனர்கள்", diff --git a/UI/Web/src/assets/langs/tr.json b/UI/Web/src/assets/langs/tr.json index 33772b886..c72bfb3b5 100644 --- a/UI/Web/src/assets/langs/tr.json +++ b/UI/Web/src/assets/langs/tr.json @@ -1236,9 +1236,6 @@ "fields-to-import": "Ayarlar", "merge": "Birleştir" }, - "publication-status-stats": { - "year-header": "Yıl" - }, "browse-genres": { "genre-count": "{{num}} Tür" }, diff --git a/UI/Web/src/assets/langs/uk.json b/UI/Web/src/assets/langs/uk.json index f7b9818cd..6a075a177 100644 --- a/UI/Web/src/assets/langs/uk.json +++ b/UI/Web/src/assets/langs/uk.json @@ -2528,9 +2528,9 @@ "title": "Статус публікації", "visualisation-label": "Візуалізація", "data-table-label": "Таблиця даних", - "year-header": "Рік", "count-header": "Кількість", - "no-data": "{{common.no-data}}" + "no-data": "{{common.no-data}}", + "status-header": "{{manage-matched-metadata.status-header}}" }, "next-expected-card": { "title": "~{{date}}", diff --git a/UI/Web/src/assets/langs/vi.json b/UI/Web/src/assets/langs/vi.json index 35f24a373..63fe17a68 100644 --- a/UI/Web/src/assets/langs/vi.json +++ b/UI/Web/src/assets/langs/vi.json @@ -2164,7 +2164,6 @@ "scrobbling-tab": "Scrobbling" }, "publication-status-stats": { - "year-header": "Năm", "title": "Tình Trạng Xuất Bản", "count-header": "Đếm", "visualisation-label": "Hình Ảnh Hóa", diff --git a/UI/Web/src/assets/langs/zh_Hans.json b/UI/Web/src/assets/langs/zh_Hans.json index 1a3e5fdb2..1feda36ba 100644 --- a/UI/Web/src/assets/langs/zh_Hans.json +++ b/UI/Web/src/assets/langs/zh_Hans.json @@ -1855,9 +1855,9 @@ "title": "出版状态", "visualisation-label": "可视化", "data-table-label": "数据表格", - "year-header": "年份", "count-header": "数量", - "no-data": "{{common.no-data}}" + "no-data": "{{common.no-data}}", + "status-header": "{{manage-matched-metadata.status-header}}" }, "series-preview-drawer": { "staff-label": "工作人员", diff --git a/UI/Web/src/assets/langs/zh_Hant.json b/UI/Web/src/assets/langs/zh_Hant.json index cc67ec108..5a6a50660 100644 --- a/UI/Web/src/assets/langs/zh_Hant.json +++ b/UI/Web/src/assets/langs/zh_Hant.json @@ -5,7 +5,8 @@ "password": "{{common.password}}", "password-validation": "{{validation.password-validation}}", "forgot-password": "忘記密碼?", - "submit": "登入" + "submit": "登入", + "oidc": "OpenID Connect" }, "dashboard": { "no-libraries": "目前尚未設置任何書庫。請在這裡創建一些", @@ -26,12 +27,20 @@ "saving": "儲存…", "update": "更新", "account-detail-title": "帳戶詳細資訊", - "invalid-email-warning": "無效的電子郵件會使 Kavita 的某些功能無法運作" + "invalid-email-warning": "無效的電子郵件會使 Kavita 的某些功能無法運作", + "warning-read-only": "唯讀帳號的權限受限", + "notice": "警告!", + "out-of-sync": "此使用者是透過 OIDC 建立。若啟用了「同步使用者」設定,對此帳號所做的任何變更都可能會被覆蓋。", + "oidc-managed": "此使用者由 OIDC 管理。若需進行任何變更,請聯繫您的 OIDC 管理員。", + "identity-provider": "身分提供者", + "identity-provider-tooltip": "Kavita 使用者永遠不會與 OIDC 帳號進行同步。", + "libraries-label": "{{common.libraries}}", + "roles-label": "{{common.roles}}" }, "user-scrobble-history": { "title": "Scrobble歷史", "description": "在這裡您可以找到與您帳戶關聯的所有Scrobble事件。為了使事件存在,您必須設定scrobble事件提供程式,所有已處理的事件將在一個月後清除。如果存在未處理的事件,這些事件很可能無法在上游形成匹配。請聯繫您的管理員進行修正。", - "not-read-warning": "遠端將始終保持最高數量", + "not-read-warning": "上游提供者將始終保留最高進度", "filter-label": "{{common.filter}}", "created-header": "創建", "last-modified-header": "上一次修改", @@ -84,7 +93,7 @@ "no-items-filtered": "沒有項目符合您當前的過濾條件。" }, "user-preferences": { - "title": "用戶儀表板", + "title": "使用者面板", "pref-description": "這些是與您帳號綁定的全域設定,閱讀器的相關設定請至「閱讀設定檔」中調整。", "account-tab": "{{tabs.account-tab}}", "preferences-tab": "{{tabs.preferences-tab}}", @@ -93,24 +102,24 @@ "stats-tab": "{{tabs.stats-tab}}", "scrobbling-tab": "{{tabs.scrobbling-tab}}", "smart-filters-tab": "{{tabs.smart-filters-tab}}", - "success-toast": "更新用戶偏好", + "success-toast": "使用者偏好設定已更新", "global-settings-title": "全域設定", "page-layout-mode-label": "頁面佈局模式", "page-layout-mode-tooltip": "在系列詳細信息頁面上將項目顯示為卡片或列表視圖。", "locale-label": "本地", - "locale-tooltip": "Kavita使用的語言", + "locale-tooltip": "Kavita 使用的語言", "blur-unread-summaries-label": "模糊未讀摘要", - "blur-unread-summaries-tooltip": "模糊沒有閱讀進度的捲或章節的摘要文本(避免劇透)", + "blur-unread-summaries-tooltip": "模糊沒有閱讀進度的卷或章節的摘要文本(避免劇透)", "prompt-on-download-label": "下載時提示", - "prompt-on-download-tooltip": "下載大小超過{{size}}MB時提示", + "prompt-on-download-tooltip": "下載大小超過 {{size}}MB 時提示", "disable-animations-label": "禁用動畫", "disable-animations-tooltip": "關閉網站中的動畫,對於電子書閱讀器很有用。", "collapse-series-relationships-label": "摺疊系列關聯", "collapse-series-relationships-tooltip": "Kavita是否展示沒有關聯的系列或前傳", "share-series-reviews-label": "分享系列評論", - "share-series-reviews-tooltip": "是否對其他用戶顯示您對系列的評論", - "clients-opds-alert": "此伺服器上未啟用 OPDS。 這不會影響 Tachiyomi 用戶。", - "clients-opds-description": "所有第三方客戶端都將使用 API 密鑰或下面的連接 URL。 這些就像密碼一樣,請保密。", + "share-series-reviews-tooltip": "允許其他使用者看到您的評論", + "clients-opds-alert": "此伺服器上未啟用 OPDS。 這不會影響 Mihon 使用者。", + "clients-opds-description": "所有第三方客戶端都將使用下方的 OPDS 驗證金鑰或連線網址。這些資訊等同於密碼,請務必妥善保密。", "clients-opds-url-tooltip": "查看支持的 OPDS 客户端列表: ", "reset": "{{common.reset}}", "save": "{{common.save}}", @@ -119,18 +128,45 @@ "anilist-scrobbling-tooltip": "允許 Kavita 單向同步閱讀進度與評分至 AniList", "want-to-read-sync-label": "想讀清單同步", "want-to-read-sync-tooltip": "允許 Kavita 根據 AniList 和 MAL 的待讀清單系列,新增項目到您的「想讀」中", - "anilist-scrobbling-label": "AniList Scrobbling" + "anilist-scrobbling-label": "AniList Scrobbling", + "font-tab": "字型", + "social-settings-title": "社群設定", + "opds-settings-title": "OPDS 設定", + "highlight-bar-label": "註解顏色", + "highlight-bar-tooltip": "這些色彩將套用於所有書籍", + "colorscape-label": "使用 ColorScape", + "colorscape-tooltip": "全域開關,用於啟用或停用動態漸層功能。此設定會覆蓋主題設定", + "data-saver-label": "數據節省模式", + "data-saver-tooltip": "停用自動預先載入以節省資料流量(例如 PDF 閱讀器)", + "prompt-for-rereads-after-label": "重讀提示", + "prompt-for-rereads-after-tooltip": "若自 X 天前起無閱讀進度,則顯示重讀提示。設定為 0 則完全停用。", + "share-annotations-label": "分享註解", + "share-annotations-tooltip": "允許其他使用者看到您的註解", + "view-other-annotations-label": "查看共享註解", + "view-other-annotations-tooltip": "在閱讀時查看其他使用者的註解", + "social-libraries-label": "社交書庫", + "social-libraries-tooltip": "應啟用社交功能的書庫。若不選擇,則代表在所有書庫啟用社交功能。若您完全不想使用某些功能,請將其停用。", + "social-max-age-rating-label": "最高年齡分級", + "social-max-age-rating-tooltip": "社交功能適用的最高年齡分級", + "social-include-unknowns-label": "包含未知分級", + "social-include-unknowns-tooltip": "針對年齡分級未知的系列與章節啟用社交功能", + "social-share-profile-label": "分享個人檔案", + "social-share-profile-tooltip": "允許向伺服器內的其他成員分享您的閱讀活動資訊", + "embed-progress-indicator-label": "嵌入進度指示器", + "embed-progress-indicator-tooltip": "在標題中嵌入進度指示器", + "include-continue-from-label": "包含「繼續閱讀」入口", + "include-continue-from-tooltip": "在 OPDS 欄位中插入「從 X 繼續」入口,以便直接回到上次閱讀位置(模擬 Kavita 的「繼續閱讀」按鈕功能)" }, "user-holds": { "title": "暫停 Scrobble", - "description": "這個清單由用戶管理,其中包含不會同步到外部服務的系列。你可以隨時將任何系列從此清單中移除。一旦移除,下次該系列發生任何 Scrobble 事件(例如:閱讀進度、評分或想讀狀態變更),就會立即觸發同步功能。", + "description": "這個清單由使用者管理,其中包含不會同步到外部服務的系列。你可以隨時將任何系列從此清單中移除。一旦移除,下次該系列發生任何 Scrobble 事件(例如:閱讀進度、評分或想讀狀態變更),就會立即觸發同步功能。", "no-data": "{{typeahead.no-data}}", "series-name-header": "{{manage-matched-metadata.series-name-header}}", "delete-label": "{{common.remove}}", "created-header": "{{manage-media-issues.created-header}}" }, "theme-manager": { - "description": "Kavita 支援變更自訂顏色,找到一個符合您需求的配色方案,或者自己創建一個並分享。主題可以應用於您的帳戶,或應用於所有帳戶中。", + "description": "Kavita 提供多種色彩選擇,找到一個符合您需求的配色方案,或者自己創建一個並分享。主題可以應用於您的帳戶,或應用於所有帳戶中。", "set-default": "預設設定", "default-theme": "預設", "download": "{{changelog.download}}", @@ -162,7 +198,7 @@ "age-rating-label": "{{metadata-fields.age-rating-title}}", "no-restriction": "沒有限制", "include-unknowns-label": "包括未知物", - "include-unknowns-tooltip": "如果勾選,將允許未知項目與年齡限制一起使用。這可能導致未標記的媒體洩漏給具有年齡限制的用戶。" + "include-unknowns-tooltip": "如果勾選,將允許未知項目與年齡限制一起使用。這可能導致未標記的媒體洩漏給具有年齡限制的使用者。" }, "site-theme-provider-pipe": { "system": "系統", @@ -170,16 +206,19 @@ }, "manage-devices": { "title": "裝置管理員", - "description": "本部分供您設置無法通過網路瀏覽器連接到 Kavita 且具有接受文件的電子信箱地址的裝置。", + "description": "本部分供您設置無法直接連線至 Kavita 且具有接受文件的電子信箱地址的裝置。", "platform-label": "平台", "email-label": "電子郵件", - "email-setup-alert": "想要將文件發送到您的裝置嗎?請先讓管理員設定電子郵件!", + "email-setup-alert": "想要將文件發送到您的信箱嗎?請先讓管理員設定電子郵件!", "add": "{{common.add}}", "delete": "{{common.delete}}", "edit": "{{common.edit}}", "no-data": "{{typeahead.no-data}}", "actions-header": "{{manage-users.actions-header}}", - "name-label": "名稱" + "name-label": "名稱", + "warning": "警告", + "client-devices-header": "用戶端裝置", + "sendto-device-header": "郵件接收裝置" }, "edit-device-modal": { "device-name-label": "{{manage-devices.name-label}}", @@ -190,8 +229,8 @@ "required-field": "{{validation.required-field}}", "valid-email": "{{validation.valid-email}}", "email-tooltip": "此電子郵件將用於“發送至”,可透過此功能接收文件", - "device-platform-label": "設備平台", - "title": "編輯裝置" + "device-platform-label": "{{manage-devices.platform-label}}", + "title": "編輯郵件接收裝置" }, "change-password": { "password-label": "{{common.password}}", @@ -228,10 +267,10 @@ "save": "{{common.save}}" }, "api-key": { - "copy": "複製" + "copy": "{{book-line-overlay.copy}}" }, "scrobbling-providers": { - "title": "Scrobbling供應商", + "title": "Scrobbling 提供者", "requires": "此功能需要有效的{{product}}授權", "token-valid": "授權憑證有效", "token-expired": "授權憑證已過期", @@ -239,12 +278,12 @@ "token-set": "設定授權憑證", "generate": "產生", "generic-instructions": "填寫有關不同外部服務的信息,以便讓 Kavita+ 能夠與它們互動。", - "instructions": "初次使用的用戶請點擊下方的「{{scrobbling-providers.generate}}」,以允許 Kavita+ 和 {{service}} 進行通訊。授權程式後,請將取得的憑證複製並貼到下方的輸入框中。您可以隨時重新產生新的憑證。", - "mal-instructions": "Kavita 使用 MAL 客戶端 ID 進行身份驗證。為 Kavita 創建一個新的客戶端,一旦批准,提供客戶端 ID 和您的用戶名稱。", + "instructions": "使用者初次使用請點擊下方的「{{scrobbling-providers.generate}}」,以允許 Kavita+ 和 {{service}} 進行通訊。授權程式後,請將取得的憑證複製並貼到下方的輸入框中。您可以隨時重新產生新的憑證。", + "mal-instructions": "Kavita 使用 MAL 客戶端 ID 進行身分驗證。為 Kavita 創建一個新的客戶端,一旦批准,提供客戶端 ID 和您的使用者名稱。", "scrobbling-applicable-label": "可以進行 Scrobbling", "token-input-label": "{{service}} 授權憑證填寫處", "mal-token-input-label": "MAL 客戶端 ID", - "mal-username-input-label": "MAL 用戶名稱", + "mal-username-input-label": "MAL 使用者名稱", "edit": "{{common.edit}}", "cancel": "{{common.cancel}}", "save": "{{common.save}}", @@ -271,7 +310,7 @@ "open-filtered-search": "對 {{item}} 進行篩選搜索" }, "role-selector": { - "title": "角色", + "title": "{{common.roles}}", "deselect-all": "{{common.deselect-all}}", "select-all": "{{common.select-all}}" }, @@ -403,7 +442,7 @@ }, "library-type-pipe": { "book": "書籍", - "comic": "漫畫(舊版)", + "comic": "漫畫(彈性佈局)", "manga": "漫畫(日漫)", "comicVine": "漫畫", "image": "圖片", @@ -470,17 +509,19 @@ "setup-user-account-tooltip": "複製此內容並粘貼到新選項卡中,您可能需要登出。", "invite-url-label": "邀請網址", "setup-user-account": "設定使用者帳戶", - "title": "邀請用戶", - "setup-user-title": "用戶已邀請", + "title": "邀請使用者", + "setup-user-title": "已邀請使用者", "invite": "邀請", "inviting": "正在邀請…", - "setup-user-description": "您可以使用下面的鏈接為您的用戶設置帳戶,或使用複製按鈕。您可能需要在使用該鏈接註冊新用戶之前登出。", - "description": "通過輸入用戶的電子郵件邀請他們加入您的伺服器。他們將收到一封電子郵件來創建帳戶。為了使這一功能正常運作,您必須在 電子郵件 選項卡中設置主機名稱和電子郵件,否則將會顯示一個連結供您代為設置。

電子郵件不需要是有效的。" + "setup-user-description": "您可以使用下面的鏈接為您的使用者設置帳戶,或使用複製按鈕。您可能需要在使用該鏈接註冊之前登出。", + "description": "通過輸入使用者的電子郵件邀請他們加入您的伺服器。他們將收到一封電子郵件來創建帳戶。為了使這一功能正常運作,您必須在 電子郵件 選項卡中設置主機名稱和電子郵件,否則將會顯示一個連結供您代為設置。

電子郵件不需要是有效的。", + "libraries-label": "{{common.libraries}}", + "roles-label": "{{common.roles}}" }, "library-selector": { "select-all": "{{common.select-all}}", "deselect-all": "{{common.deselect-all}}", - "title": "書庫", + "title": "{{common.libraries}}", "no-data": "尚未設定書庫。" }, "license": { @@ -504,9 +545,9 @@ "no-license-key": "沒有授權金鑰", "activate-description": "輸入用於註冊Stripe的授權金鑰和電子郵件", "activate-license-label": "授權金鑰", - "activate-discordId-label": "Discord 用戶 ID", + "activate-discordId-label": "Discord 使用者 ID", "activate-discordId-tooltip": "將您的 Discord 帳戶與 Kavita+ 連結。這將授予您訪問隱藏頻道的權限,以幫助塑造 Kavita。", - "discord-validation": "這不是有效的 Discord 用戶 ID。您的用戶 ID 不是您的 Discord 用戶名。", + "discord-validation": "這不是有效的 Discord 使用者 ID。您的使用者 ID 不是您的 Discord 使用者名。", "kavita+-desc-part-2": "「進階福利」", "kavita+-desc-part-3": "就在今天!", "kavita+-desc-part-1": "Kavita+ 是一項加值訂閱服務,能為此 Kavita 實例上的所有使用者解鎖更多功能。立即購買訂閱,享受 ", @@ -532,7 +573,13 @@ "total-subbed-months-label": "總訂閱月數", "overwrite": "覆寫", "k+-already-registered-header": "授權已被註冊", - "k+-unlocked": "Kavita+ 已解鎖!" + "k+-unlocked": "Kavita+ 已解鎖!", + "kavita+-warning": "Kavita+ 是獨立於 Kavita 之外的服務。若在解除安裝前未先取消訂閱,系統將會持續計費。", + "cancel-label": "取消訂閱", + "cancel-tooltip": "取消您的訂閱並刪除 Kavita 內的授權金鑰。", + "resend-license-email": "將授權金鑰傳送至電子郵件", + "resend-license-email-tooltip": "重新將 Kavita+ 授權金鑰傳送至電子郵件。授權金鑰必須與此伺服器綁定後方可生效。", + "supportId-label": "支援 ID" }, "book-line-overlay": { "copy": "複製", @@ -540,7 +587,8 @@ "required-field": "{{common.required-field}}", "save": "{{common.save}}", "bookmark": "書籤", - "bookmark-label": "書籤名稱" + "bookmark-label": "書籤名稱", + "annotate": "註解" }, "book-reader": { "incognito-mode-label": "無痕模式", @@ -551,7 +599,7 @@ "skip-header": "跳轉至主要內容", "next": "下一個", "previous": "上一個", - "go-to-page-prompt": "一共有 {{totalPages}} 頁,您想要跳轉到哪一頁?", + "go-to-page-prompt": "共有 {{totalPages}} 頁。您想前往哪一頁?頁碼從 1 開始。", "loading-book": "正在加載書籍…" }, "confirm-email": { @@ -626,7 +674,9 @@ "time-left-alt": "剩餘時間", "publication-status-tooltip": "出版狀態", "on": "{{reader-settings.on}}", - "off": "{{reader-settings.off}}" + "off": "{{reader-settings.off}}", + "annotations-tab": "{{tabs.annotations-tab}}", + "loading": "{{common.loading}}" }, "metadata-fields": { "collections-title": "{{side-nav.collections}}", @@ -727,7 +777,7 @@ "help-us-part-1": "請依照 ", "manage-reading-list-tooltip": "Kavita 可以用 ComicInfo.xml 或 opf 文件中的 StoryArc、StoryArcNumber 和 AlternativeSeries、AlternativeCount 標籤來創建書單", "allow-scrobbling-label": "允許Scrobbling", - "allow-scrobbling-tooltip": "是否允許Kavita將閱讀事件、想讀狀態、評分和評論記錄至已配置的Scrobble服務提供商?這僅在伺服器具有有效的 Kavita+ 訂閱時才會生效。", + "allow-scrobbling-tooltip": "是否允許Kavita將閱讀事件、想讀狀態、評分和評論記錄至已配置的Scrobble服務提供者?這僅在伺服器具有有效的 Kavita+ 訂閱時才會生效。", "folder-watching-tooltip": "覆蓋此書庫的伺服器資料夾監控。如果關閉此功能,則不會監控此書庫包含的資料夾。如果多個書庫共享同一資料夾,那麼這些資料夾仍可能被監控。在每次觸發掃描之前,需等待10分鐘。", "include-in-dashboard-tooltip": "是否應將書庫中的系列包含在儀表板上? 這會影響所有串流,例如「繼續閱讀」、「最近更新」、「最近新增」或任何自訂新增的內容。", "force-scan": "強制掃描", @@ -901,8 +951,8 @@ "host-name-validation": "主機名稱必須以 http(s) 開頭,且不能以 / 結尾", "host-tooltip": "您電子郵件伺服器的發送/SMTP地址", "host-label": "主機", - "username-label": "用戶名", - "username-tooltip": "用於對主機進行身份驗證的用戶名", + "username-label": "使用者名稱", + "username-tooltip": "用於對主機進行身份驗證的使用者名稱", "customized-templates-label": "自訂模板", "gmail-label": "Gmail", "outlook-label": "Outlook", @@ -927,7 +977,7 @@ "select-all": "{{common.select-all}}", "cancel": "{{common.cancel}}", "apply": "{{common.apply}}", - "title": "書庫", + "title": "{{common.libraries}}", "last-scanned-title": "上次掃描時間", "type-title": "類型", "scan-library": "掃描書庫", @@ -972,7 +1022,7 @@ }, "manage-scrobble-errors": { "filter-label": "{{common.filter}}", - "description": "此列表包含在 scrobbling 期間發現的問題。您可以隨時清除它,並等待下一次 scrobble 上傳以查看。如果有未知的系列,您最好更正系列名稱或本地化系列名稱,或者添加提供商的網絡連結。", + "description": "此列表包含在 scrobbling 期間發現的問題。您可以隨時清除它,並等待下一次 scrobble 上傳以查看。如果有未知的系列,您最好更正系列名稱或本地化系列名稱,或者添加提供者的網絡連結。", "edit-item-alt": "編輯 {{seriesName}}", "clear-errors": "清除錯誤", "created-header": "創建", @@ -1019,7 +1069,7 @@ "on-deck-last-chapter-add-tooltip": "最近有新增章節的書籍將自動加入「繼續閱讀」,超過天數沒有新增章節將從「繼續閱讀」中移除。", "folder-watching-label": "資料夾監控", "enable-folder-watching": "啟用資料夾監控", - "opds-tooltip": "若開啟此功能,將允許所有用戶使用 OPDS 從伺服器閱讀和下載內容。", + "opds-tooltip": "若開啟此功能,將允許所有使用者透過 OPDS 從伺服器閱讀和下載內容。", "restart-required": "更改連接埠、基礎網址、快取大小或 IP 位址後,需要手動重新啟動 Kavita 才能生效。", "port-tooltip": "伺服器所監聽的連接埠。如果您是在 Docker 上運行,則此項無法更改。變動後需要重新啟動才能生效。", "backup-tooltip": "保留備份的天數。默認為 30,最少為 1,最多為 30。", @@ -1027,7 +1077,7 @@ "log-label": "日誌保留天數", "logging-level-label": "日誌級別", "cache-size-label": "快取大小", - "base-url-tooltip": "如果您希望在基礎網址上托管 Kavita,例如:yourdomain.com/kavita,請使用此選項。此功能在使用非root用戶的 Docker 環境中不支援。", + "base-url-tooltip": "若您想將 Kavita 架設在基本網址(Base URL)下,請使用此選項(例如:yourdomain.com/kavita)。在 Docker 環境中,若使用非 Root 使用者則不支援此功能。", "backup-label": "備份保留天數", "on-deck-last-progress-tooltip": "最近閱讀進度有變動的書籍將自動加入「繼續閱讀」,超過天數未閱讀將從「繼續閱讀」中移除。", "folder-watching-tooltip": "允許 Kavita 監控書庫資料夾,以檢測變更,並在變更發生時自動觸發掃描。這使內容能在不手動觸發掃描或等待夜間掃描的情況下更新。掃描觸發前將始終等待 10 分鐘。", @@ -1043,7 +1093,7 @@ "convert-media-task-desc": "執行一個長時間運行的任務,將所有由Kavita管理的媒體轉換為目標編碼。這個過程較慢(特別是在ARM設備上)。", "adhoc-tasks-title": "臨時任務", "last-executed-header": "上次執行時間", - "clean-up-want-to-read-task-desc": "移除用戶已閱讀完、在“想讀”清單中且出版狀態為“已完成”的系列。每 24 小時運行一次。", + "clean-up-want-to-read-task-desc": "移除「想讀」清單中已讀完且出版狀態為「已完結」的系列。此操作每 24 小時執行一次。", "check-for-updates-task": "檢查更新", "library-scan-label": "書庫掃描", "library-scan-tooltip": "Kavita 要多久掃描並刷新一次書庫文件的元數據。", @@ -1085,7 +1135,7 @@ "cleanup-tooltip": "Kavita 要多久執行一次清理任務。這可能會佔用大量資源,通常應該在午夜進行", "clean-up-task": "一般清理", "clean-up-task-success": "清理完成", - "clean-up-task-desc": "執行伺服器上的夜間清理任務。可能會消耗大量資源,建議不要在有活躍用戶或掃描時執行。每24小時運行一次。" + "clean-up-task-desc": "執行伺服器的例行夜間清理作業。此操作較為耗費系統資源,建議避免在有活躍使用者或正在執行掃描時執行。每 24 小時執行一次。" }, "manage-users": { "edit-user-tooltip": "編輯", @@ -1095,21 +1145,24 @@ "online-now-tooltip": "目前在線", "sharing-header": "分享", "actions-header": "操作", - "pending-tooltip": "這個用戶尚未驗證其電子郵件", - "delete-user-tooltip": "刪除用戶", + "pending-tooltip": "這個使用者尚未驗證其電子郵件", + "delete-user-tooltip": "刪除使用者", "change-password-tooltip": "更改密碼", "resend-invite-tooltip": "重新發送邀請", "change-password-alt": "更改 {{user}} 的密碼", - "edit-user-alt": "編輯用戶 {{user}}", - "setup-user-tooltip": "設定用戶", - "setup-user-alt": "設定用戶{{user}}", - "no-data": "沒有其他用戶。", + "edit-user-alt": "編輯使用者 {{user}}", + "setup-user-tooltip": "設定使用者", + "setup-user-alt": "設定使用者{{user}}", + "no-data": "沒有其他使用者。", "last-active-header": "最後登錄", "name-header": "名稱", - "roles-header": "權限", + "roles-header": "{{common.roles}}", "too-many-libraries": "很多", - "delete-user-alt": "刪除用戶{{user}}", - "all-libraries": "所有書庫" + "delete-user-alt": "刪除使用者 {{user}}", + "all-libraries": "所有書庫", + "identity-provider-native-tooltip": "原生", + "profile-link-alt": "個人資料", + "identity-provider-oidc-tooltip": "OIDC" }, "edit-collection-tags": { "required-field": "{{validation.required-field}}", @@ -1133,7 +1186,7 @@ "promote-tooltip": "「推廣」 指的是該標籤將對伺服器上的所有使用者可見,而不僅限於管理員帳戶。即使標籤被推廣,所有帶有此標籤的系列仍然會受到使用者存取限制的約束。", "promote-label": "推廣", "title": "編輯 {{collectionName}} 收藏", - "last-sync-tooltip": "Kavita 每天都會與上游内容提供商同步資料。" + "last-sync-tooltip": "Kavita 每天會與上游收藏提供者進行同步。" }, "library-recommended": { "on-deck": "{{dashboard.on-deck-title}}", @@ -1163,7 +1216,7 @@ "account-section-title": "帳戶", "admin-statistics": "統計", "admin-media": "媒體", - "admin-users": "用戶", + "admin-users": "使用者", "admin-general": "通用", "account": "帳戶", "scrobbling": "Scrobbling", @@ -1171,11 +1224,13 @@ "cbl-import": "CBL 書單", "info-section-title": "資訊", "reading-profiles": "閱讀設定檔", - "admin-manage-tokens": "管理用戶憑證", + "admin-manage-tokens": "管理使用者憑證", "scrobble-holds": "暫停 Scrobble", "admin-email-history": "電子郵件紀錄", "admin-metadata": "管理元資料", - "admin-matched-metadata": "匹配的元資料" + "admin-matched-metadata": "匹配的元資料", + "admin-oidc": "OpenID Connect", + "font": "Epub 字型" }, "collection-detail": { "item-count": "{{common.item-count}}", @@ -1235,17 +1290,18 @@ "date-range-title": "日期範圍", "edit-label": "編輯模式", "reorder-alt": "重新排序項目", - "dnd-warning": "在行動裝置上或當書單超過 100 項時,將無法使用拖放功能。" + "dnd-warning": "在行動裝置上或當書單超過 100 項時,將無法使用拖放功能。", + "loading-alt": "{{pdf-reader.loading-message}}" }, "events-widget": { "close": "{{common.close}}", - "left-to-process": "待處理:{{leftToProcess}}", + "left-to-process": "待處理:{{leftToProcess}}/{{totalToProcess}}", "download-in-queue": "{{num}} 個下載在排隊中", "active-events-title": "活躍事件:", "title-alt": "活動", "dismiss-all": "忽略全部", "downloading-item": "正在下載 {{item}}", - "users-online-count": "{{num}} 位用戶在線", + "users-online-count": "{{num}} 位使用者在線", "no-data": "沒有任何內容", "update-available": "有可用的更新", "more-info": "點擊以獲取更多資訊" @@ -1259,7 +1315,8 @@ "prev-page": "返回上一頁", "go-to": "打開“跳轉到頁面”對話框", "bookmark": "為當前頁面添加書籤", - "double-click": "雙擊" + "double-click": "雙擊", + "offset-double-page": "{{keybind-setting-description-pipe.key-bind-title-offset-double-page}}" }, "grouped-typeahead": { "genres": "{{metadata-fields.genres-title}}", @@ -1270,10 +1327,11 @@ "collections": "收藏", "tags": "標籤", "people": "人物", - "libraries": "書庫", + "libraries": "{{common.libraries}}", "include-extras": "包含章節與檔案", "chapters": "章節", - "files": "檔案" + "files": "檔案", + "annotations": "{{tabs.annotations-tab}}" }, "nav-header": { "help": "{{common.help}}", @@ -1312,7 +1370,7 @@ "close": "{{common.close}}", "save": "{{common.save}}", "required-field": "{{validation.required-field}}", - "promote-tooltip": "推廣意味著該收藏可以在伺服器範圍內被看到,而不僅限於您個人。此收藏中的所有系列仍將受到用戶訪問限制。", + "promote-tooltip": "推廣意味著該收藏可以在伺服器範圍內被看到,而不僅限於您個人。此收藏中的所有系列仍將受到使用者訪問限制。", "name-unique-validation": "名稱必須唯一", "summary-label": "摘要", "title": "編輯書單: {{name}}", @@ -1426,7 +1484,7 @@ "unread": "未讀", "descending-alt": "降序", "limit-label": "數量限制", - "libraries-label": "書庫", + "libraries-label": "{{common.libraries}}", "colorist-label": "上色師", "ascending-alt": "升序", "character-label": "角色", @@ -1512,7 +1570,8 @@ "total-items-title": "總項目數", "folder-path-tooltip": "書庫根目錄下,包含系列所有檔案的最高路徑", "lowest-folder-path-title": "最低資料夾路徑", - "total-words-title": "總字數" + "total-words-title": "總字數", + "no-data": "{{common.no-data}}" }, "edit-chapter-modal": { "close": "{{common.close}}", @@ -1562,8 +1621,8 @@ "isbn-label": "ISBN", "pages-label": "頁數", "words-label": "長度", - "pages-count": "{{num}} 頁", - "words-count": "{{num}} 字" + "pages-count": "{{series-detail.pages-count}}", + "words-count": "{{series-detail.words-count}}" }, "edit-volume-modal": { "close": "{{common.close}}", @@ -1594,7 +1653,8 @@ "data-table-label": "數據表", "format-tooltip": "“未分類”表示Kavita尚未掃描某些檔案。這通常發生在v0.7之前已存在的舊資料上。你可能需要透過書庫設定中的強制掃描來解決。", "visualisation-label": "可視化", - "total-files-header": "檔案總數" + "total-files-header": "檔案總數", + "no-data": "{{common.no-data}}" }, "reading-activity": { "title": "閱讀記錄", @@ -1603,20 +1663,22 @@ "y-axis-label": "閱讀時數", "no-data": "沒有閱讀進度", "time-frame-label": "時間範圍", - "all-users": "所有用戶", + "all-users": "所有使用者", "this-week": "{{time-periods.this-week}}", "last-7-days": "{{time-periods.last-7-days}}", "last-30-days": "{{time-periods.last-30-days}}", "last-90-days": "{{time-periods.last-90-days}}", "last-year": "{{time-periods.last-year}}", - "all-time": "{{time-periods.all-time}}" + "all-time": "{{time-periods.all-time}}", + "select-user-alt": "篩選使用者" }, "publication-status-stats": { "title": "出版狀態", "count-header": "數量", - "year-header": "年", "visualisation-label": "可視化", - "data-table-label": "數據表" + "data-table-label": "數據表", + "status-header": "{{manage-matched-metadata.status-header}}", + "no-data": "{{common.no-data}}" }, "series-preview-drawer": { "tags-label": "{{filter-field-pipe.tags}}", @@ -1644,7 +1706,7 @@ "total-files-tooltip": "總檔案數:{{count}}", "reads": "次閱讀", "series-count": "{{num}} 個系列", - "most-active-users-title": "最活躍的用戶", + "most-active-users-title": "最活躍的使用者", "popular-series-title": "熱門系列", "people-count": "{{num}} 個人物", "total-volumes-label": "總卷數", @@ -1657,12 +1719,15 @@ "genre-count": "{{num}} 種類型", "tag-count": "{{num}} 個標籤", "total-people-tooltip": "人物總數:{{count}}", - "people": "人物" + "people": "人物", + "users": "使用者", + "stats-tab": "{{tabs.stats-tab}}", + "management-tab": "{{tabs.management-tab}}" }, "errors": { - "user-not-auth": "用戶未通過認證", + "user-not-auth": "使用者未通過認證", "collection-invalid-access": "您無法訪問此標籤所屬的任何書庫,或此收藏無效", - "delete-theme-in-use": "該主題目前正被至少一位用戶使用,無法刪除", + "delete-theme-in-use": "該主題目前正被至少一位使用者套用,無法刪除", "theme-manual-upload": "手動上傳的主題,創建時出現問題", "theme-already-in-use": "存在相同名稱的主題", "generic": "發生了意外的錯誤", @@ -1674,7 +1739,16 @@ "series-doesnt-exist": "該系列已不存在", "download": "下載此檔案時出現問題或您沒有下載權限", "not-found": "該網址不存在", - "invalid-confirmation-url": "無效的確認網址" + "invalid-confirmation-url": "無效的確認網址", + "delete-font-in-use": "該字型目前正被至少一位使用者套用,無法刪除", + "oidc": { + "creating-user": "無法建立新使用者,請聯繫管理員", + "failed-to-update-username": "無法更新使用者名稱", + "syncing-user": "無法從 OIDC 同步您的帳號,請聯繫管理員", + "disabled-account": "此帳號已被停用,請聯繫管理員" + }, + "font-manual-upload": "手動上傳並建立字型時發生問題", + "font-already-in-use": "已存在同名的字型" }, "customize-dashboard-modal": { "title-smart-filters": "智慧篩選器", @@ -1777,12 +1851,12 @@ "inker": "勾線師", "summary": "摘要", "translators": "翻譯", - "user-rating": "用戶評分", + "user-rating": "使用者評分", "file-path": "檔案路徑", "penciller": "草稿師", "languages": "語言", "path": "路徑", - "libraries": "書庫", + "libraries": "{{common.libraries}}", "series-name": "系列名稱", "read-last": "最後閱讀" }, @@ -1841,7 +1915,7 @@ "mark-invisible": "標記為隱藏", "mark-invisible-tooltip": "TODO", "unpromote": "取消推廣", - "promote-tooltip": "將該項目設為所有用戶可見", + "promote-tooltip": "將該項目設為所有使用者可見", "multiple-selections": "多選", "back-to": "返回{{action}}", "title": "操作", @@ -1886,7 +1960,7 @@ "submit": "提交", "loading": "載入中…", "email": "電子郵件", - "username": "用戶名", + "username": "使用者名稱", "password": "密碼", "promoted": "推廣", "deselect-all": "取消全選", @@ -1947,7 +2021,7 @@ "reading-list-promoted": "書單已推廣", "reading-list-unpromoted": "書單已取消推廣", "confirm-delete-theme": "移除此主題將從硬碟中刪除它。在移除之前,您可以從臨時目錄中獲取它", - "mal-token-required": "需要 MAL 授權憑證,請在用戶設定中配置", + "mal-token-required": "需要 MAL 授權憑證,請在使用者設定中配置", "chapter-deleted": "章節已刪除", "volume-deleted": "卷已刪除", "reading-list-deleted": "已刪除書單", @@ -1972,13 +2046,13 @@ "series-deleted": "系列已刪除", "confirm-download-size": "該 {{entityType}} 的大小為 {{size}}。您確定要繼續嗎?", "load-prev-chapter": "上一個 {{entity}} 已加載", - "confirm-delete-user": "您確定要刪除此用戶嗎?", + "confirm-delete-user": "您確定要刪除此使用者嗎?", "confirm-delete-multiple-series": "您確定要刪除{{count}}個系列嗎?這不會修改硬碟上的檔案。", "anilist-token-updated": "已更新 AniList 授權憑證", "confirm-delete-smart-filter": "您確定要刪除此智慧篩選器?", "copied-to-clipboard": "已複製到剪貼簿", "confirm-library-delete": "您確定要刪除“{{name}}”嗎?此操作無法撤銷。", - "anilist-token-expired": "您的 AniList 授權憑證已過期。在您於「用戶設定」>「帳戶」中重新生成之前,將無法處理紀錄功能", + "anilist-token-expired": "您的 AniList 授權憑證已過期。在您於「使用者設定」>「帳戶」中重新生成之前,將無法處理紀錄功能", "confirm-delete-reading-list": "您確定要刪除書單嗎?此操作無法撤銷。", "select-files-warning": "您需要先選擇文件才能繼續操作", "entity-read": "{{name}}已標記為已讀", @@ -2014,13 +2088,17 @@ "confirm-delete-multiple-chapters": "您確定要刪除 {{count}} 章節/卷嗎?這不會修改硬碟上的檔案。", "bulk-delete-libraries": "您確定要刪除 {{count}} 個書庫嗎?", "confirm-delete-multiple-volumes": "您確定要刪除 {{count}} 個卷嗎?這不會修改磁碟上的檔案。", - "series-bound-to-reading-profile": "系列已綁定至閱讀設定 {{name}}", - "library-bound-to-reading-profile": "書庫已綁定至閱讀設定 {{name}}", + "series-bound-to-reading-profile": "系列已綁定至 {{amount}} 個閱讀設定檔", + "library-bound-to-reading-profile": "書庫已綁定至 {{amount}} 個閱讀設定檔", "scrobble-gen-init": "已將任務排入隊列,以根據過去的閱讀記錄和評分產生 scrobble 事件,並同步到已連接的服務。", "series-added-want-to-read": "系列已加入「想讀」", "webtoon-override": "偵測到圖片為條漫風格,正在切換到條漫模式。", "external-match-rate-error": "Kavita 查詢 {{seriesName}} 時,已超出查詢頻率限制。請於 5 分鐘後再試。", - "match-success": "系列匹配正確" + "match-success": "系列匹配正確", + "confirm-force-delete-font": "此字型目前正在使用中。確定要強制刪除嗎?這將會強制所有使用者恢復使用「預設字型」。", + "font-in-use": "由於有一位或多位使用者正套用此字型,因此無法刪除。", + "profile-unauthorized": "此使用者未公開其個人資料", + "confirm-delete-font": "移除此字型將會從磁碟中將其刪除。在移除之前,您可以先從暫存目錄中將檔案取回。" }, "changelog": { "installed": "已安裝", @@ -2065,7 +2143,8 @@ }, "personal-table-of-contents": { "no-data": "尚未有任何書籤", - "delete": "刪除{{bookmarkName}}" + "delete": "刪除{{bookmarkName}}", + "filter-label": "{{common.filter}}" }, "confirm-email-change": { "non-confirm-description": "請稍等,正在驗證您更新後的電子郵件地址。", @@ -2277,7 +2356,7 @@ "year-validation": "這必須是一個有效的年份,大於 1000 且長度為 4 個字元" }, "person-detail": { - "all-roles": "身份", + "all-roles": "{{common.roles}}", "known-for-title": "代表作品", "individual-role-title": "作為{{role}}", "browse-person-title": "{{name}}的所有作品", @@ -2293,7 +2372,7 @@ "name-label": "{{edit-series-modal.name-label}}", "hardcover-id-label": "Hardcover Id", "mal-id-label": "MAL Id", - "required-field": "{{validations.required-field}}", + "required-field": "{{validation.required-field}}", "cover-image-description": "{{edit-series-modal.cover-image-description}}", "anilist-id-label": "AniList Id", "asin-label": "ASIN", @@ -2369,7 +2448,7 @@ "layout-mode-book-tooltip": "選擇內容的顯示方式。「捲動」會依書籍原始排版顯示;「單欄」或「雙欄」會根據裝置高度調整,一頁顯示一或兩欄文字", "line-height-book-label": "行距", "line-height-book-tooltip": "書籍中行與行之間的間距大小", - "font-size-book-tooltip": "套用於書籍字體的縮放百分比", + "font-size-book-tooltip": "套用於書籍字型的縮放百分比", "pdf-theme-label": "主題", "pdf-scroll-mode-tooltip": "設定您瀏覽頁面的方式。可選擇垂直/水平捲動,或點擊翻頁(不捲動)", "pdf-spread-mode-label": "跨頁模式", @@ -2386,14 +2465,17 @@ "immersive-mode-label": "沉浸模式", "reading-direction-book-label": "翻頁方向", "reading-direction-book-tooltip": "點擊畫面哪個方向會翻到下一頁。「由右至左」意味著您單擊屏幕左側以移至下一頁。", - "font-family-label": "字型", - "font-family-tooltip": "選擇要使用的字型。若選擇「Default」,將採用書籍內建字型", + "font-family-label": "字型家族", + "font-family-tooltip": "選擇要使用的字型家族。若選擇「Default」,將採用書籍內建的字型", "writing-style-label": "書寫方向", "writing-style-tooltip": "變更文字的書寫方向。橫排為由左至右,直排為由上至下。", "color-theme-book-tooltip": "設定要應用於書籍閱讀器內容和選單的顏色主題", - "font-size-book-label": "字體大小", + "font-size-book-label": "字型大小", "margin-book-tooltip": "設定螢幕左右兩側的間距大小。但在行動裝置上,不管設定為多少,間距都會被強制設為 0。", - "margin-book-label": "邊距" + "margin-book-label": "邊距", + "page-calc-method-label": "{{reader-settings.page-calc-method-label}}", + "page-calc-method-tooltip": "{{reader-settings.page-calc-method-tooltip}}", + "breakpoint-pipe-never": "{{breakpoint-pipe.never}}" }, "manage-matched-metadata": { "matched-state-label": "匹配狀態", @@ -2416,7 +2498,7 @@ }, "browse-people": { "series-count": "{{common.series-count}}", - "roles-label": "角色", + "roles-label": "{{common.roles}}", "sort-label": "排序", "issue-count-label": "作品數", "series-count-label": "系列數", @@ -2501,10 +2583,10 @@ "enable-start-date-label": "開始日期", "enable-people-tooltip": "允許 新增.人物(角色、作者等)。所有人物都包含圖片。", "whitelist-tooltip": "只允許寫入此清單中的特定字串作為標籤。 請確保這些字串以逗號分隔。", - "age-rating-mapping-description": "左側清單中的任何字串,如果存在於類型或標籤中,將設定該系列的年齡分級。", + "age-rating-mapping-description": "若在「類型」或「標籤」中發現左側列出的任何字串,系統將會自動設定該系列的年齡分級。比對過程已經過正規化且不分大小寫;若符合多項規則,將採用最高(最嚴格)的年齡分級。", "remove-source-tag-label": "移除來源標籤", "genre": "類型", - "field-mapping-description": "設定規則,將在「類型 (Genre)」或「標籤 (Tag)」欄位中找到的特定字串,對應到新的「類型」或「標籤」,並可選擇是否從原始清單中移除。此功能僅在啟用「類型/標籤」寫入時才適用。", + "field-mapping-description": "針對在「類型」或「標籤」欄位中發現的特定字串設定規則,將其映射至「類型」或「標籤」中的新字串,並可選擇是否從來源清單中移除。比對過程已經過正規化且不分大小寫,系統將採用第一個符合的值。此功能僅在啟用了寫入「類型/標籤」時適用。", "overrides-label": "覆寫", "chapter-header": "章節欄位", "field-mapping-title": "欄位對應", @@ -2513,7 +2595,22 @@ "add-field-mapping-label": "新增欄位對應", "first-last-name-label": "名/姓 命名方式", "overrides-description": "允許 Kavita 寫入鎖定的欄位。", - "person-roles-label": "角色" + "person-roles-label": "{{common.roles}}", + "enable-extended-metadata-processing-tooltip": "是否應針對從 ComicInfo 擷取或透過 UI 新增的「類型」與「標籤」,套用黑名單、白名單、分級映射及欄位映射規則進行處理。", + "k+-warning": "下方設定與 K+ 頁面同步共享。您可以在任一處進行修改", + "export-settings": "匯出", + "export-tooltip": "匯出您的黑名單、白名單、分級以及欄位映射", + "export-file-name": "Kavita 元資料設定匯出 (Export.json)", + "import-settings": "匯入", + "import-tooltip": "匯入您自己或他人的設定", + "enable-extended-metadata-processing-label": "擴充元數據處理", + "remove-age-rating-mapping-label": "移除年齡分級映射", + "remove-field-mapping-label": "移除欄位映射", + "series-header": "系列欄位", + "people-header": "人員", + "tags-header": "標籤", + "source-genre-tags-placeholder": "來源類型/標籤", + "dest-genre-tags-placeholder": "目標類型/標籤" }, "merge-person-modal": { "title": "{{personName}}", @@ -2557,8 +2654,8 @@ "no-data": "{{common.no-data}}", "token-set-label": "設定授權憑證", "anilist-header": "AniList", - "description": "有設定同步憑證的用戶,可能需要不時地更新憑證。如果用戶有設定電子郵件,並且提供的是有效信箱,Kavita 會在憑證需要更新時自動發送電子郵件通知。", - "username-header": "用戶名", + "description": "有設定同步憑證(Scrobbling Tokens)的使用者,可能需要不時地更新憑證。如果使用者有設定電子郵件,並且提供的是有效信箱,Kavita 會在憑證需要更新時自動發送電子郵件通知。", + "username-header": "使用者名稱", "expires-label": "到期日: {{date}}" }, "email-history": { @@ -2635,12 +2732,310 @@ "person-name": "名稱", "person-role": "角色", "person-chapter-count": "章數", - "person-series-count": "系列數" + "person-series-count": "系列數", + "series": "{{tabs.series-tab}}" }, "breakpoint-pipe": { "desktop": "桌面版", "never": "從不", "mobile": "手機", "tablet": "平板" + }, + "manage-oidc-connect": { + "reset-tooltip": "重設所有使用者的外部 ID,這將會重設 Kavita 使用者與您的身分提供者(Identity Provider)之間的連結", + "reset-confirm": "確定要重設所有使用者的外部 ID 嗎?", + "reset-success": "已重設所有使用者的外部 ID,請重新驗證身分以進行連結", + "sync-user-settings-label": "將使用者設定與 OIDC 角色同步", + "sync-user-settings-tooltip": "透過 OIDC 建立的使用者將完全由身分提供者管理,包含其角色、媒體庫存取權限及年齡分級。若停用此選項,使用者在帳號建立後將無法存取任何內容。詳情請參閱說明文件。", + "disable-password-authentication-tooltip": "擁有管理員角色的使用者不受此限制", + "defaults-requirement": "當「同步使用者設定」功能關閉時,透過 OIDC 註冊的使用者將採用下列設定", + "default-age-restriction-tooltip": "顯示給新使用者的最高年齡分級", + "save": "{{common.save}}", + "reset-label": "重置 ID", + "save-success": "已成功更新您的 OIDC 設定", + "notice": "注意", + "restart-required": "更改提供者或進階設定後,必須手動重新啟動 Kavita 才能生效。", + "auto-save-required": "您已變更關鍵設定,系統已自動儲存以確保變更生效", + "provider-title": "提供者", + "provider-tooltip": "提供者設定需要您手動點擊「儲存」。Kavita 必須設定為機密客戶端,並需要設定重導向 URL。更多詳情請參考 wiki。", + "tls-required": "OIDC 提供者必須使用 TLS (HTTPS)", + "manual-save-label": "更改提供者設定後,必須手動儲存", + "authority-tooltip": "您的 OIDC 提供者網址,請勿包含 .well-known/openid-configuration 路徑", + "client-id-tooltip": "在您的 OIDC 提供者中設定的用戶端 ID (ClientID),可以為任意值", + "secret-tooltip": "由您的 OIDC 提供者所產生的密鑰,設定後將不再顯示", + "auto-login-tooltip": "開啟登入畫面時,自動重新導向至 OIDC 提供者", + "provider-name-label": "提供者名稱", + "provider-name-tooltip": "在登入畫面上顯示的名稱", + "custom-scopes-tooltip": "登入期間向 OIDC 提供者要求取得的額外權限範圍 (Scopes)。若有多個權限範圍,請以逗號分隔。輸入錯誤的值可能會導致無法登入。", + "behavior-title": "行為", + "other-field-required": "{{validation.other-field-required}}", + "other-field-invalid": "{{validation.other-field-invalid}}", + "invalid-uri": "{{validation.invalid-uri}}", + "no-restriction": "{{restriction-selector.no-restriction}}", + "default-roles-label": "{{common.roles}}", + "default-libraries-label": "{{common.libraries}}", + "client-id-label": "客戶端 ID", + "authority-label": "驗證中心", + "secret-label": "客戶端密鑰", + "provision-accounts-label": "配置帳號", + "provision-accounts-tooltip": "如果透過 OIDC 登入時找不到對應的帳號,自動建立新帳號", + "require-verified-email-label": "強制驗證電子郵件", + "require-verified-email-tooltip": "建立新帳號或與現有帳號匹配時,需進行電子郵件驗證。若新建立的帳號已驗證電子郵件,Kavita 將自動完成驗證。", + "auto-login-label": "自動登入", + "disable-password-authentication-label": "停用密碼驗證", + "defaults-title": "預設值", + "default-include-unknowns-label": "包含「未知」", + "default-include-unknowns-tooltip": "包含未知的年齡分級", + "default-age-restriction-label": "年齡分級", + "advanced-title": "進階設定", + "advanced-tooltip": "僅在您了解其影響的情況下修改這些。", + "roles-prefix-label": "角色前綴", + "roles-prefix-tooltip": "Kavita 將僅採計以此前綴開頭的角色。", + "roles-claim-label": "角色聲明", + "roles-claim-tooltip": "Kavita 將用於提取角色的聲明 (Claim)。留空將使用預設值。", + "custom-scopes-label": "自定義範圍" + }, + "most-active-users": { + "title": "最活躍讀者", + "no-data": "此時段內無閱讀活動" + }, + "active-user-card": { + "total-hours": "總計 {{duration}}", + "comics-count": "{{count}} 本漫畫", + "books-count": "{{count}} 本書籍" + }, + "profile": { + "title": "{{username}} 的個人資料", + "stats-title": "回顧 {{username}} 在 {{libraryName}} 中的閱讀足跡", + "overview-tab": "{{tabs.overview-tab}}", + "stats-tab": "{{tabs.stats-tab}}", + "reviews-tab": "{{tabs.reviews-tab}}", + "activity-tab": "{{tabs.activity-tab}}" + }, + "profile-activity": { + "time-filter-title": "{{username}} 的閱讀活動記錄", + "pages-count": "{{series-detail.pages-count}}", + "words-count": "{{series-detail.words-count}}", + "no-data": "{{common.no-data}}", + "pages-read": "{{reading-pace.pages-read}}", + "words-read": "{{reading-pace.words-read}}" + }, + "user-stats-info-cards": { + "pages-read-by-year-title": "歷年閱讀頁數", + "pages-count": "{{num}} 頁", + "words-read-by-year-title": "歷年閱讀字數", + "words-count": "{{num}} 字" + }, + "page-spread": { + "sub-title": "{{username}} 閱讀的章節頁數大多在 {{highestBucket}} 頁之間", + "no-data": "{{common.no-data}}" + }, + "word-spread": { + "sub-title": "{{username}} 閱讀的章節字數大多在 {{highestBucket}} 字之間", + "no-data": "{{common.no-data}}" + }, + "reads-by-month": { + "sub-title": "{{username}} 在 {{year}} 年 {{month}} 月的閱讀量最高,共讀完了 {{reads}} 個章節", + "no-data": "{{common.no-data}}" + }, + "reading-pace": { + "sub-title-books": "{{username}} 平均每 {{count}} 天讀完一本書", + "sub-title-comics": "{{username}} 平均每 {{count}} 天讀完一本漫畫", + "no-data": "{{common.no-data}}" + }, + "identity-provider-pipe": { + "kavita": "Kavita", + "oidc": "OpenID Connect" + }, + "oidc": { + "title": "OIDC 回呼", + "login": "返回登入畫面", + "error-loading-info": "載入 OIDC 資訊時發生錯誤,請聯繫管理員", + "timeout": "OIDC 解析逾時或發生錯誤" + }, + "manage-auth-keys": { + "delete": "{{common.delete}}", + "clients-opds-url-label": "{{user-preferences.clients-opds-url-label}}", + "clients-opds-alert": "{{user-preferences.clients-opds-alert}}", + "clients-opds-description": "{{user-preferences.clients-opds-description}}", + "clients-opds-url-tooltip": "{{user-preferences.clients-opds-url-tooltip}}", + "copy-key": "{{common.copy}}", + "auth-keys-title": "管理授權金鑰", + "name-label": "名稱", + "key-label": "金鑰", + "expires-label": "到期", + "last-accessed-label": "最後存取時間", + "actions-label": "操作", + "rotate": "輪換", + "opds": "OPDS", + "image-only": "圖片", + "add-auth-key": "新增", + "description": "授權金鑰(Auth Key)的作用等同於密碼。輪換金鑰將使所有現有的用戶端失效。" + }, + "create-auth-key": { + "required-field": "{{validations.required-field}}", + "total-key-length": "總金鑰長度:{{length}}", + "cancel": "{{common.cancel}}", + "close": "{{common.close}}", + "save": "{{common.save}}", + "create-title": "建立授權金鑰", + "rotate-title": "輪換授權金鑰", + "name-label": "名稱", + "key-length-label": "金鑰長度", + "expiration-label": "到期", + "never": "從不" + }, + "reread-modal": { + "cancel": "{{common.cancel}}", + "title": "重讀", + "description-full-read": "您已經讀完 {{name}} 了!要重新開始閱讀嗎?", + "description-time-passed": "距離您上次閱讀 {{name}} 已經過 {{days}} 天了,需要複習一下內容嗎?", + "continue": "從上次停下的地方繼續", + "reread": "重新開始", + "read-incognito": "無痕閱讀" + }, + "multi-check-box-form": { + "no-data": "{{typeahead.no-data}}", + "select-all": "全選", + "deselect-all": "取消全選" + }, + "font-manager": { + "add": "{{common.add}}", + "drag-n-drop": "{{cover-image-chooser.drag-n-drop}}", + "upload": "{{cover-image-chooser.upload}}", + "delete": "{{common.delete}}", + "description": "Kavita 的 EPUB 閱讀器內建了數種字型,您也可以在此新增自訂字型。請上傳檔案或使用 Google Fonts 網址。如需詳細資訊,請參閱 wiki。", + "enter-an-url-pre-title": "輸入 {{url}}", + "url": "網址", + "upload-continued": "字型檔", + "preview-default": "透過檔案或 Google Fonts 網址上傳您的自訂字型", + "url-label": "網址", + "filter-system-fonts-label": "篩選系統字型", + "back": "返回", + "load": "載入", + "no-preview": "無法預覽此字型,將採用書籍的預設字型樣式。", + "brown-fox": "天地玄黃,宇宙洪荒。The quick brown fox jumps over the lazy dog" + }, + "server-devices": { + "client-devices-header": "{{manage-devices.client-devices-header}}", + "no-data": "{{common.no-data}}", + "client-devices-this-month-header": "本月用戶端裝置", + "client-devices-mobile-vs-pc-header": "本月行動裝置與電腦使用比例" + }, + "client-device-card": { + "platform-label": "{{manage-devices.platform-label}}", + "save": "{{common.save}}", + "auth-type-label": "身分驗證類型", + "browser-label": "瀏覽器", + "screen-label": "螢幕", + "version-label": "應用程式版本", + "first-seen-label": "首次上線", + "last-seen-label": "最後上線", + "active": "活躍", + "local": "本機" + }, + "annotation-card": { + "page-num": "{{book-reader.page-num-label}}", + "location-tooltip": "{{library}} - {{series}}", + "contains-spoilers-label": "劇透", + "view-in-reader-label": "在閱讀器中查看", + "liked": "包含您在內,共 {{amount}} 人按讚", + "not-liked": "共 {{amount}} 人按讚,您尚未按讚" + }, + "view-annotations-drawer": { + "title": "{{tabs.annotations-tab}}", + "close": "{{common.close}}", + "no-data": "{{common.no-data}}", + "filter-label": "篩選註解" + }, + "view-edit-annotation-drawer": { + "contains-spoilers-label": "{{annotation-card.contains-spoilers-label}}", + "view-title": "查看註解", + "edit-title": "編輯註解", + "create-title": "新增註解", + "create": "新增", + "edit": "編輯", + "delete": "刪除" + }, + "view-bookmark-drawer": { + "close": "{{common.close}}", + "no-data": "{{common.no-data}}", + "page-num-label": "{{book-reader.page-num-label}}" + }, + "view-toc-drawer": { + "close": "{{common.close}}" + }, + "epub-setting-drawer": { + "close": "{{common.close}}" + }, + "highlight-bar": { + "edit": "{{common.edit}}", + "close": "{{common.close}}" + }, + "client-device-platform-pipe": { + "unknown": "{{client-device-auth-type-pipe.unknown}}" + }, + "client-device-client-type-pipe": { + "unknown": "{{client-device-auth-type-pipe.unknown}}" + }, + "import-mappings": { + "prev": "{{import-cbl-modal.prev}}", + "import": "{{import-cbl-modal.import}}", + "next": "{{import-cbl-modal.next}}", + "save": "{{common.save}}" + }, + "files-over-time": { + "no-data": "{{common.no-data}}" + }, + "preferred-format": { + "no-data": "{{common.no-data}}" + }, + "favorite-authors": { + "no-data": "{{common.no-data}}" + }, + "tag-breakdown": { + "no-data": "{{common.no-data}}" + }, + "genre-breakdown": { + "no-data": "{{common.no-data}}" + }, + "avg-time-reading-by-hour": { + "no-data": "{{common.no-data}}" + }, + "profile-overview": { + "want-to-read": "{{side-nav.want-to-read}}" + }, + "activity-graph": { + "all-time": "{{time-periods.all-time}}" + }, + "smart-time-picker": { + "close": "{{common.close}}" + }, + "client-device-type-pipe": { + "Unknown": "{{common.unknown}}" + }, + "review-list-item": { + "by-label": "By", + "created-alt": "建立時間" + }, + "time-frame-label": { + "overall": "總體", + "week": "本週", + "month": "本月", + "year": "今年" + }, + "duration-pipe": { + "seconds": "{{num}} 秒", + "minutes": "{{num}} 分鐘", + "hours": "{{num}} 小時", + "combo": "{{hour}} 小時 {{min}} 分鐘" + }, + "library-type-subtitle-pipe": { + "book": "通用圖書庫。", + "comic": "「漫畫」支援單一系列內的「卷」分組與「合訂本」。不支援在同一系列中存放多個連載週期。", + "manga": "「日漫」支援「卷」分組,並可處理部分散圖(圖片檔)配置。", + "comicVine": "嚴謹的「漫畫」基於 Comic Vine 元數據實作,並整合專業工具支援。", + "image": "散裝圖片僅提供有限支援。檔案結構必須嚴格遵循 wiki 說明文件。", + "lightNovel": "「輕小說」具備專為輕小說優化的特殊處理機制" } }