From 96b49aa9aaab2ee784267161afdfdd75014bc1ce Mon Sep 17 00:00:00 2001 From: ildyria Date: Fri, 23 Oct 2026 19:21:55 +0200 Subject: [PATCH] fixes --- app/Console/Commands/RecomputeBuckets.php | 7 +- .../Admin/Maintenance/FulfillPreCompute.php | 2 +- .../Admin/Maintenance/RecomputeBuckets.php | 39 +++++++++++ .../Maintenance/RecomputeBucketsRequest.php | 25 +++++++ app/Services/BucketScheme.php | 18 +++-- .../092-bucketing-refactor/open-questions.md | 29 ++++++++ .../features/092-bucketing-refactor/plan.md | 12 +++- .../features/092-bucketing-refactor/spec.md | 11 +-- .../features/092-bucketing-refactor/tasks.md | 15 +++- lang/ar/maintenance.php | 18 +++-- lang/bg/maintenance.php | 18 +++-- lang/cz/maintenance.php | 18 +++-- lang/de/maintenance.php | 18 +++-- lang/el/maintenance.php | 18 +++-- lang/en/maintenance.php | 18 +++-- lang/es/maintenance.php | 18 +++-- lang/fa/maintenance.php | 18 +++-- lang/fr/maintenance.php | 18 +++-- lang/hu/maintenance.php | 18 +++-- lang/it/maintenance.php | 18 +++-- lang/ja/maintenance.php | 18 +++-- lang/nl/maintenance.php | 18 +++-- lang/no/maintenance.php | 18 +++-- lang/pl/maintenance.php | 18 +++-- lang/pt/maintenance.php | 18 +++-- lang/ru/maintenance.php | 18 +++-- lang/sk/maintenance.php | 18 +++-- lang/sv/maintenance.php | 18 +++-- lang/tr/maintenance.php | 18 +++-- lang/vi/maintenance.php | 18 +++-- lang/zh_CN/maintenance.php | 18 +++-- lang/zh_TW/maintenance.php | 18 +++-- resources/js/services/maintenance-service.ts | 3 + .../MaintenanceBackfillAlbumSizes.vue | 3 +- .../MaintenanceRecomputeBuckets.vue | 53 ++++++++++++++ resources/js/v7/views/admin/Maintenance.vue | 2 + .../MaintenanceBackfillAlbumSizes.vue | 3 +- .../MaintenanceRecomputeBuckets.vue | 37 ++++++++++ .../components/maintenance/MaintenanceRow.vue | 2 +- resources/js/v8/views/admin/Maintenance.vue | 4 +- routes/api_v2.php | 1 + tests/Feature_v3/Album/AlbumRootV3Test.php | 31 +++++++++ .../Maintenance/RecomputeBucketsTest.php | 69 +++++++++++++++++++ .../RecomputeBucketsCommandTest.php | 16 +++++ tests/Unit/Services/BucketSchemeTest.php | 13 ++++ 45 files changed, 654 insertions(+), 155 deletions(-) create mode 100644 app/Http/Controllers/Admin/Maintenance/RecomputeBuckets.php create mode 100644 app/Http/Requests/Maintenance/RecomputeBucketsRequest.php create mode 100644 resources/js/v7/components/maintenance/MaintenanceRecomputeBuckets.vue create mode 100644 resources/js/v8/components/maintenance/MaintenanceRecomputeBuckets.vue create mode 100644 tests/Feature_v3/Maintenance/RecomputeBucketsTest.php diff --git a/app/Console/Commands/RecomputeBuckets.php b/app/Console/Commands/RecomputeBuckets.php index 09e8a5152a2..894defd1f65 100644 --- a/app/Console/Commands/RecomputeBuckets.php +++ b/app/Console/Commands/RecomputeBuckets.php @@ -8,6 +8,8 @@ namespace App\Console\Commands; +use App\Events\AlbumListingCacheFlushRequested; +use App\Events\PhotoListingCacheFlushRequested; use App\Services\BucketKeyWriter; use Illuminate\Console\Command; use Illuminate\Support\Collection; @@ -17,7 +19,8 @@ /** * Rewrites `bucket_key` of every album, then of every `photo_album` row, * in the granularity-free format (FR-092-15), chunked by - * {@see BucketKeyWriter} (FR-092-14). + * {@see BucketKeyWriter} (FR-092-14), flushing the album, then the photo + * listings once their keys are written. */ class RecomputeBuckets extends Command { @@ -37,8 +40,10 @@ public function handle(BucketKeyWriter $writer): int $chunk_size = max(1, (int) $this->option('chunk')); $this->recompute('albums', DB::table('albums')->count(), fn (\Closure $on_chunk): int => $writer->writeAlbumKeys(fn ($query) => $query, $chunk_size, $on_chunk)); + AlbumListingCacheFlushRequested::dispatch(); $this->newLine(); $this->recompute('photo_album rows', DB::table('photo_album')->count(), fn (\Closure $on_chunk): int => $writer->writePhotoAlbumKeys(fn ($query) => $query, $chunk_size, $on_chunk)); + PhotoListingCacheFlushRequested::dispatch(); return Command::SUCCESS; } diff --git a/app/Http/Controllers/Admin/Maintenance/FulfillPreCompute.php b/app/Http/Controllers/Admin/Maintenance/FulfillPreCompute.php index 1d7419e304d..67b2e186e47 100644 --- a/app/Http/Controllers/Admin/Maintenance/FulfillPreCompute.php +++ b/app/Http/Controllers/Admin/Maintenance/FulfillPreCompute.php @@ -19,7 +19,7 @@ * FulfillPreCompute - Maintenance controller for backfilling album precomputed fields. * * This controller is equivalent to running the artisan command: - * php artisan lychee:recompute-album-fields + * php artisan lychee:recompute-album-stats * * It processes albums where ALL precomputed fields are null and dispatches * jobs to compute: diff --git a/app/Http/Controllers/Admin/Maintenance/RecomputeBuckets.php b/app/Http/Controllers/Admin/Maintenance/RecomputeBuckets.php new file mode 100644 index 00000000000..1a2ffdf7f5f --- /dev/null +++ b/app/Http/Controllers/Admin/Maintenance/RecomputeBuckets.php @@ -0,0 +1,39 @@ +kind !== self::DATE && $this->kind !== self::CREATED)) { + if (($this->kind !== self::DATE && $this->kind !== self::CREATED) || !self::isDateId($bucket_id)) { return $bucket_id; } @@ -364,6 +369,11 @@ private function whereSourceId($query, string $bucket_id): void }; } + private static function isDateId(string $bucket_id): bool + { + return preg_match(self::DATE_ID_PATTERN, $bucket_id) === 1; + } + /** * `[year, month, day, hour, precision]` of a date id (`Y`, `Y-m`, * `Y-m-d` or `Y-m-d-H`); missing parts read as the start of the period. diff --git a/docs/specs/4-architecture/features/092-bucketing-refactor/open-questions.md b/docs/specs/4-architecture/features/092-bucketing-refactor/open-questions.md index 0cbcdf3fa25..aafb6b3714b 100644 --- a/docs/specs/4-architecture/features/092-bucketing-refactor/open-questions.md +++ b/docs/specs/4-architecture/features/092-bucketing-refactor/open-questions.md @@ -14,6 +14,7 @@ Open questions for [Feature 092](spec.md). Log every high- and medium-impact que | ~~Q-092-06~~ | 092 – Bucketing refactor | Medium | Tag, person and search album listings now return `unknown` as every per-row album `bucket_id`, which no FR describes (A record it in FR-092-05 · B keep a computed id) | Resolved (Option A; owner, 2026-10-14; spec FR-092-05) | 2026-10-14 | 2026-10-14 | | ~~Q-092-07~~ | 092 – Bucketing refactor | Medium | FR-092-13 is silent on `sorting_photos_order`; no settings list flushes cached photo listings when it changes (A add it to the photo-listing flush · B leave out of scope) | Resolved (Option A; owner, 2026-10-14; spec FR-092-13, S-092-20) | 2026-10-14 | 2026-10-14 | | ~~Q-092-08~~ | 092 – Bucketing refactor | Low | How does the title date read `YYYYMMDD`? (A optional dashes `-?` · B a separate eight-digit branch) | Resolved (Option B; owner, 2026-10-14; spec FR-092-02, S-092-21) | 2026-10-14 | 2026-10-14 | +| ~~Q-092-09~~ | 092 – Bucketing refactor | Medium | Album listings read the stored keys with the new scheme as soon as `title_bucket_mode` or `sorting_albums_col` is saved, but the keys are rewritten only when the queued `RecomputeAllAlbumBucketsJob` runs (A rewrite album keys in the settings request · B queued job, listings unbucketed while it is pending · C accept the window, stop date-formatting non-date ids) | Resolved (Option C; owner, 2026-10-23; spec FR-092-08, FR-092-13, S-092-23) | 2026-10-23 | 2026-10-23 | ## Question Details @@ -156,3 +157,31 @@ Measured on SQLite 3.46 (scratchpad, synthetic data: 300,000 photos, one album w - ❌ Harder to read, branch reset is PCRE-only so JS reads different groups. **Resolution:** Option B (the owner first chose A, then switched to B). The owner also asked that every parser reject dates that are not on the calendar: `TimelineData::parseDateFromTitle()` no longer rolls `2023-13-01` over to January 2024 and `dateScrubber.ts` now checks the date, matching the `checkdate()` already in `BucketKeys` and `BucketKeyBackfill`. Recorded in FR-092-02 and S-092-21. + +### ~~Q-092-09~~ – Album listings between a settings change and the key rewrite + +**Context:** FR-092-13: saving `title_bucket_mode` or `sorting_albums_col` queues `RecomputeAllAlbumBucketsJob` on `low`. The read scheme (`BucketScheme::forAlbums()`) follows the new values on the next request, while `albums.bucket_key` still holds keys written for the old ones until a worker runs the job. Reproduced on a scratch instance (v8, struct-of-arrays, database queue, root sorted by title ascending, root timeline on, albums `2019-05 Paris`, `2020 Christmas`, `2021-07-14 Bastille`, `Alpha`, `alpha two`, `Bravo`, `Mountains`, `Zulu`): + +| Step | Root buckets (ids = labels unless noted) | +|------|------------------------------------------| +| `date_prefix`, job done | `2019`, `2020`, `2021`, `unknown` | +| `alphabetical` saved, job pending | `2`, `unknown` (first character of the date keys, titles without a date stay `unknown`) | +| job done | `2`, `a`, `b`, `m`, `z` | +| `date_prefix` saved, job pending | ids `2019`, `2020`, `2021`, `alph`, `brav`, `moun`, `zulu`; labels `2019`, `2020`, `2021`, `2000`, `2000`, `2000`, `2000` | + +The listing keeps the previous grouping (or shows `2000` labels: `BucketScheme::label()` formats any id of a date scheme as a date) until the worker reaches the job, which waits behind every job queued before it on `low`. The photo side has the same gap for `photo_title_bucket_mode` and `sorting_photos_col` (`RecomputeAllPhotoBucketsJob`). Album counts are small next to `photo_album` rows: on the owner's instance `lychee:recompute-buckets` logged 869 albums and 70,657 `photo_album` rows, the photo rows taking about 5 s. + +- **Option A (recommended):** Run `RecomputeAllAlbumBucketsJob` inside the settings request (`dispatchSync`) instead of queueing it; the photo side keeps its queued job. + - ✅ No gap for album listings: the response that confirms the save comes after the keys are written and the listings flushed. + - ✅ One-line change in `SettingsController`; the job and its tests stay. + - ❌ The settings request pays one upsert per 1,000 albums. + - ❌ The photo side keeps the gap. +- **Option B:** Keep the queued jobs; record a pending recompute when one is dispatched and clear it when the job finishes; while it is pending, album (and photo) listings answer `bucketable: false`. + - ✅ Covers albums and photos, no request-time cost. + - ❌ Headers disappear until a worker reaches the job (indefinitely on a worker that does not listen on `low`). + - ❌ New shared state between the settings request, the job and the cached listings. +- **Option C:** Accept the gap: FR-092-13 states that listings follow the previous grouping until the recompute job has run, and `BucketScheme::label()` returns ids that are not date-shaped as they are. + - ✅ Smallest change. + - ❌ The reported symptom stays until the worker runs the job. + +**Resolution:** Option C. FR-092-13 states that listings read the keys written for the previous values with the new scheme until the recompute job has run; FR-092-08 returns ids of a date scheme that are not date-shaped as they are. Scenario S-092-23. diff --git a/docs/specs/4-architecture/features/092-bucketing-refactor/plan.md b/docs/specs/4-architecture/features/092-bucketing-refactor/plan.md index 665a3b99fb0..f139d2dfb80 100644 --- a/docs/specs/4-architecture/features/092-bucketing-refactor/plan.md +++ b/docs/specs/4-architecture/features/092-bucketing-refactor/plan.md @@ -166,6 +166,15 @@ Prompts: "we also want to support YYYYMMDD", "why not make the - optional with ? - _Steps:_ tests first; the four `timeline_photo_date_format_*` keys join `PHOTO_LISTING_COARSE_FLUSH_CONFIGS`, the three `timeline_album_date_format_*` keys join `ALBUM_LISTING_COARSE_FLUSH_CONFIGS`; the child `buckets`/`data`/`rights` cache entries of `AlbumChildrenController` carry `albumListingGlobalTag()`, like the root ones. - _Commands:_ `php artisan test --filter=BucketSettingsV3Test`, `--filter=UpdateSettingsTest`, `make phpstan`, `vendor/bin/php-cs-fixer fix`. +17. **I16 – Ids written for another scheme (Q-092-09)** + - _Goal:_ FR-092-08, FR-092-13 (S-092-23): until a recompute job has run, a date scheme reads keys written for another scheme; ids that are not date-shaped are their own labels. + - _Steps:_ tests first in `BucketSchemeTest` and `AlbumRootV3Test`; `BucketScheme::label()` formats only date-shaped ids. + - _Commands:_ `php artisan test --filter=BucketSchemeTest`, `--filter=AlbumRootV3Test`, `make phpstan`, `vendor/bin/php-cs-fixer fix`. +18. **I17 – `lychee:recompute-buckets` flushes listings** + - _Goal:_ FR-092-15 (S-092-17): the command flushes the album and photo listing caches after rewriting their keys, like the two recompute jobs. + - _Steps:_ test first in `RecomputeBucketsCommandTest`; `RecomputeBuckets::handle()` dispatches `AlbumListingCacheFlushRequested` and `PhotoListingCacheFlushRequested`. + - _Commands:_ `php artisan test --filter=RecomputeBucketsCommandTest`, `make phpstan`, `vendor/bin/php-cs-fixer fix`. + ## Scenario Tracking | Scenario ID | Increment / Task reference | Notes | @@ -186,12 +195,13 @@ Prompts: "we also want to support YYYYMMDD", "why not make the - optional with ? | S-092-14 | I2 / T-092-02 | `BucketKeysTest` | | S-092-15 | I7, I8b / T-092-11, T-092-14 | both directions | | S-092-16 | I11 / T-092-19 | browser check | -| S-092-17 | I5 / T-092-08 | `RecomputeBucketsCommandTest` | +| S-092-17 | I5, I17 / T-092-08, T-092-27 | `RecomputeBucketsCommandTest` | | S-092-18 | I10 / T-092-18 | `ManagedCachePhotoListingInvalidatorTest` | | S-092-19 | I13 / T-092-22 | `AlbumKeysWriteTest` | | S-092-20 | I13 / T-092-23 | `BucketSettingsV3Test` | | S-092-21 | I14 / T-092-24 | `BucketKeysTest`, `TimelineDataTest` | | S-092-22 | I15 / T-092-25 | `BucketSettingsV3Test` | +| S-092-23 | I16 / T-092-26 | `BucketSchemeTest`, `AlbumRootV3Test` | ## Analysis Gate diff --git a/docs/specs/4-architecture/features/092-bucketing-refactor/spec.md b/docs/specs/4-architecture/features/092-bucketing-refactor/spec.md index 2d9e6d75b8e..02bfea1dd83 100644 --- a/docs/specs/4-architecture/features/092-bucketing-refactor/spec.md +++ b/docs/specs/4-architecture/features/092-bucketing-refactor/spec.md @@ -3,7 +3,7 @@ | Field | Value | |-------|-------| | Status | Testing | -| Last updated | 2026-10-15 | +| Last updated | 2026-10-23 | | Owners | ildyria | | Linked plan | [plan.md](plan.md) | | Linked tasks | [tasks.md](tasks.md) | @@ -54,14 +54,14 @@ The feature removes these defects: | FR-092-05 | The bucket id is a prefix of the key, by sort column: dates (`TAKEN_AT`, `CREATED_AT`, `MIN/MAX_TAKEN_AT`) → 4/7/10/13 characters for year/month/day/hour; title date → the same length capped at 10; alphabetical title → `photo_title_bucket_prefix_length` (photos) or `title_bucket_prefix_length` (albums) characters; `IS_HIGHLIGHTED`, `TYPE`, `RATING_AVG` → the whole key. Granularity resolves as today (album override, else the instance default). A `NULL` key is the `unknown` bucket. Regular-album photo listings and album children/root (`own` scope) listings apply it in SQL (`SUBSTR`) to the stored key. Album listings with no governing parent (tag, person, search) return `unknown` as every per-row album id. | Album at month granularity, key `2026-07-01-16` → id `2026-07`; switching the album to hour shows `2026-07-01-16` with no recompute. | — | — | none | Q-092-01, Q-092-06, G1 | | FR-092-06 | Tag, person and smart albums, and the Timeline, compute the bucket id in SQL from photo columns with the values FR-092-05 yields for the same photo: `taken_key`, `created_at`, `title_date_key`, `title_base`, `is_highlighted`, `type`, rounded `rating_avg`. The `buckets` tier groups in SQL; `ratios` and `details` windows filter in SQL; per-row ids in `ratios` come from the same expression. The Timeline keeps excluding photos without a value in its sort column. | A 60,000-photo tag album answers a window by reading only that window's rows. | — | — | none | Q-092-01, G3, D-092-04 | | FR-092-07 | Window filters for one or more bucket ids: date-shaped ids → half-open range on the key or column, `[id, next id of the same precision)`; alphabetical → prefix equality; `IS_HIGHLIGHTED`, `TYPE` → equality; `RATING_AVG` → `[r − 0.5, r + 0.5)` on `rating_avg` for non-stored sources; `unknown` → `NULL`. Rows of every source are ordered by `NULL` key last, then bucket id in the sort direction, then the effective sort criterion, so grouping `ratios` rows by id reproduces the `buckets` tier. | Window `2026-07` on a stored-key album is an index range on `(album_id, bucket_key)`. | — | — | none | Q-092-01 | -| FR-092-08 | Labels are formatted by the precision of each id, not by the configured granularity: 1/2/3/4 segments → `timeline_photo_date_format_year`/`_month`/`_day`/`_hour` (photos), 1/2/3 → `timeline_album_date_format_year`/`_month`/`_day` (albums). Alphabetical, `IS_HIGHLIGHTED`, `TYPE`, `RATING_AVG` ids and `unknown` are returned as is. Formatting uses `date()`/`mktime()`. | Title-sorted album at hour granularity → day ids with day labels. | — | — | none | D-092-01, D-092-02 | +| FR-092-08 | Labels are formatted by the precision of each id, not by the configured granularity: 1/2/3/4 segments → `timeline_photo_date_format_year`/`_month`/`_day`/`_hour` (photos), 1/2/3 → `timeline_album_date_format_year`/`_month`/`_day` (albums). Alphabetical, `IS_HIGHLIGHTED`, `TYPE`, `RATING_AVG` ids, `unknown`, and ids of a date scheme that are not date-shaped (`YYYY`, `YYYY-MM`, `YYYY-MM-DD`, `YYYY-MM-DD-HH`; keys written for another scheme, FR-092-13) are returned as is. Formatting uses `date()`/`mktime()`. | Title-sorted album at hour granularity → day ids with day labels. | — | — | none | D-092-01, D-092-02, Q-092-09 | | FR-092-09 | The regular-album photo `buckets` tier reads `photo_album` only. For a viewer without `may_administrate`, links to photos with `is_validated = false` owned by someone else (anyone, for a guest) are excluded through a subquery on `photos`. | Counts equal those of the joined query for admins, owners and guests. | — | — | none | G4, D-092-07 | | FR-092-10 | A change of a photo's `taken_at`, `created_at`, `title`, `is_highlighted`, `type` or `rating_avg` recomputes every `photo_album` key of that photo (`RecomputePhotoBucketsJob`), including through `lychee:takedate` and the bulk renamer. | `lychee:takedate` moves a photo to its new hour bucket. | — | — | none | D-092-06 | | FR-092-11 | A change of an album's `sorting_col` recomputes its `photo_album` keys (`RecomputeAlbumPhotoBucketsJob`). A change of only `sorting_order` or `photo_timeline` rewrites no key and flushes that album's cached photo listing. | Switching an album from day to hour granularity runs no job. | — | — | none | G1 | | FR-092-12 | A change of an album's `album_sorting_col` recomputes its direct children's keys (`RecomputeChildAlbumBucketsJob`). A change of only `album_sorting_order` or `album_timeline` rewrites no key and flushes the album's children listing. A change of an album's `title`, through `PATCH /Album` or the bulk renamer (`RenameAlbums`), recomputes that album's own `bucket_key` and flushes its parent's children listing. | The bulk renamer turns `Trip` into `2024-03 Trip` under a title-sorted parent → the album moves to the `2024-03` bucket. | — | — | none | G1, Q-092-04 | -| FR-092-13 | Settings: `sorting_photos_col` or `photo_title_bucket_mode` → every `photo_album` key is recomputed (`RecomputeAllPhotoBucketsJob`), then every cached photo listing is flushed; `timeline_photos_granularity`, `photo_title_bucket_prefix_length`, `sorting_photos_order` or a label format of FR-092-08 (`timeline_photo_date_format_year`/`_month`/`_day`/`_hour`) → every cached photo listing is flushed, no key rewritten. `sorting_albums_col` or `title_bucket_mode` → every album key is recomputed (`RecomputeAllAlbumBucketsJob`); `timeline_albums_granularity`, `title_bucket_prefix_length`, `sorting_albums_order` or `timeline_album_date_format_year`/`_month`/`_day` → no key rewritten, every cached album listing is flushed, the child `buckets`/`data`/`rights` tiers included. | Changing `timeline_photos_granularity` from day to hour shows hour buckets in every album inheriting the default; changing `timeline_photo_date_format_day` shows the new labels at once. | — | — | none | D-092-01, Q-092-07 | +| FR-092-13 | Settings: `sorting_photos_col` or `photo_title_bucket_mode` → every `photo_album` key is recomputed (`RecomputeAllPhotoBucketsJob`), then every cached photo listing is flushed; `timeline_photos_granularity`, `photo_title_bucket_prefix_length`, `sorting_photos_order` or a label format of FR-092-08 (`timeline_photo_date_format_year`/`_month`/`_day`/`_hour`) → every cached photo listing is flushed, no key rewritten. `sorting_albums_col` or `title_bucket_mode` → every album key is recomputed (`RecomputeAllAlbumBucketsJob`); `timeline_albums_granularity`, `title_bucket_prefix_length`, `sorting_albums_order` or `timeline_album_date_format_year`/`_month`/`_day` → no key rewritten, every cached album listing is flushed, the child `buckets`/`data`/`rights` tiers included. Until a recompute job has run, listings read the keys written for the previous values with the new scheme: they keep the previous grouping, and ids that are not date-shaped are their own labels (FR-092-08). | Changing `timeline_photos_granularity` from day to hour shows hour buckets in every album inheriting the default; changing `timeline_photo_date_format_day` shows the new labels at once. | — | — | none | D-092-01, Q-092-07, Q-092-09 | | FR-092-14 | Every bulk key write (jobs, `lychee:recompute-buckets`, migrations) writes at most 1,000 rows per statement. | A 60,000-photo album is recomputed in 60 statements. | — | — | none | D-092-05 | -| FR-092-15 | `lychee:recompute-buckets` rewrites every album key and every `photo_album` key in the FR-092-03/FR-092-04 format; `--chunk` sets the rows per statement (default 1,000). | — | `--chunk` below 1 reads as 1. | — | console progress | — | +| FR-092-15 | `lychee:recompute-buckets` rewrites every album key and every `photo_album` key in the FR-092-03/FR-092-04 format, then flushes every cached album listing and every cached photo listing, like `RecomputeAllAlbumBucketsJob` and `RecomputeAllPhotoBucketsJob`; `--chunk` sets the rows per statement (default 1,000). | — | `--chunk` below 1 reads as 1. | — | console progress | — | | FR-092-16 | Migrations add `photos.taken_key` (indexed) and `photos.title_date_key`, rename `photo_album.bucket_id` and `albums.bucket_id` to `bucket_key` (their composite indexes follow), then backfill `taken_key`, `title_date_key` and every bucket key, chunked, with self-contained helpers (`database/migrations/TemporaryModels/`). | Upgrading an instance shows correct buckets without running a command. | — | — | migration progress bar | Q-092-03 | | FR-092-17 | Timeline cache invalidation resolves a saved or deleted photo's Timeline bucket from its `taken_key` (`TAKEN_AT`) or `created_at` (`CREATED_AT`) at the current granularity, for the new and the previous value. | Editing a photo's date evicts only the old and new Timeline buckets. | — | — | none | FR-066-09 | | FR-092-18 | v8 date scrubber (Feature 071): a photo tile's `taken_at` day is its day in `taken_at_orig_tz`, matching the header buckets; `created_at` and album dates stay as stored. | Photo taken 23:30 UTC with zone `+02:00` → rail day and header bucket are the next day. | — | — | none | ADR-071-01, ADR-092-02 | @@ -106,12 +106,13 @@ Header bucket (hour) Rail day (before) Rail day (after) | S-092-14 | Title `2024-13-45 x` → `title_date_key` `NULL` → `unknown` bucket (FR-092-02). | | S-092-15 | `NULL` keys → `unknown` bucket last in both sort directions, for every source (FR-092-05, FR-092-07). | | S-092-16 | v8 album with the date scrubber, photo taken 23:30 UTC with zone `+02:00` → rail day equals the header bucket day (FR-092-18). | -| S-092-17 | `lychee:recompute-buckets` → every key in the FR-092-03/04 format (FR-092-15). | +| S-092-17 | `lychee:recompute-buckets` → every key in the FR-092-03/04 format; album and photo listing caches flushed (FR-092-15). | | S-092-18 | Photo date edited → the Timeline cache entries of the old and new buckets are evicted, others stay (FR-092-17). | | S-092-19 | Bulk renamer gives a child of a title-sorted (`date_prefix`) parent a dated title → the child's `bucket_key` becomes the title date and the parent's children listing is flushed (FR-092-12). | | S-092-20 | `sorting_photos_order` changed → every cached photo listing is flushed, no job dispatched (FR-092-13). | | S-092-21 | Title `20240315_123456` → `title_date_key` `2024-03-15`, album timeline and scrubber day `2024-03-15`; title `20241345 x` or `2023-12-32 x` → `NULL` in all three (FR-092-02). | | S-092-22 | A photo or album label format (`timeline_photo_date_format_*`, `timeline_album_date_format_*`) or `timeline_albums_granularity` changed → every cached photo or album listing, child-album tiers included, is flushed, no job dispatched; the next `buckets` request returns the new labels and ids (FR-092-08, FR-092-13). | +| S-092-23 | Root sorted by title, `title_bucket_mode` changed from `alphabetical` to `date_prefix`, recompute job not run yet → `buckets` ids `2019` and `alph` (titles `2019-05 Paris`, `Alpha`) with the same labels; after the job → `2019`, `unknown` (FR-092-08, FR-092-13). | ## Test Strategy diff --git a/docs/specs/4-architecture/features/092-bucketing-refactor/tasks.md b/docs/specs/4-architecture/features/092-bucketing-refactor/tasks.md index 7f6f3c1a9d5..c0493c43c12 100644 --- a/docs/specs/4-architecture/features/092-bucketing-refactor/tasks.md +++ b/docs/specs/4-architecture/features/092-bucketing-refactor/tasks.md @@ -162,8 +162,21 @@ _Last updated: 2026-10-15_ - `php artisan test --filter=UpdateSettingsTest` - `make phpstan` +- [x] T-092-26 – Ids written for another scheme are their own labels (F-092-08, F-092-13, S-092-23). + _Intent:_ test first in `BucketSchemeTest` (a date scheme labels `alph`, `2020-03 Tr` and `2` as is, date-shaped ids keep their formats) and `AlbumRootV3Test` (root sorted by title, alphabetical keys, `title_bucket_mode` switched to `date_prefix` without the job → ids and labels `2019`, `alph`; after the job → `2019`, `unknown`); then `BucketScheme::label()` formats only date-shaped ids (Q-092-09). + _Verification commands:_ + - `php artisan test --filter=BucketSchemeTest` + - `php artisan test --filter=AlbumRootV3Test` + - `make phpstan` + +- [x] T-092-27 – `lychee:recompute-buckets` flushes listings (F-092-15, S-092-17). + _Intent:_ test first in `RecomputeBucketsCommandTest` (the command dispatches `AlbumListingCacheFlushRequested` and `PhotoListingCacheFlushRequested`); then `RecomputeBuckets::handle()` dispatches both after the album and `photo_album` writes. + _Verification commands:_ + - `php artisan test --filter=RecomputeBucketsCommandTest` + - `make phpstan` + ## Notes / TODOs -- FR coverage: FR-01/02 → T-02…04, T-24; FR-03 → T-05, T-06; FR-04 → T-07; FR-05 → T-09…11, T-15; FR-06 → T-13, T-14; FR-07 → T-09, T-10, T-12, T-14; FR-08 → T-09…11, T-15; FR-09 → T-11; FR-10 → T-04, T-06; FR-11/12 → T-16, T-22; FR-13 → T-08, T-17, T-23, T-25; FR-14 → T-06…08; FR-15 → T-08; FR-16 → T-01; FR-17 → T-18; FR-18 → T-19. +- FR coverage: FR-01/02 → T-02…04, T-24; FR-03 → T-05, T-06; FR-04 → T-07; FR-05 → T-09…11, T-15; FR-06 → T-13, T-14; FR-07 → T-09, T-10, T-12, T-14; FR-08 → T-09…11, T-15, T-26; FR-09 → T-11; FR-10 → T-04, T-06; FR-11/12 → T-16, T-22; FR-13 → T-08, T-17, T-23, T-25, T-26; FR-14 → T-06…08; FR-15 → T-08, T-27; FR-16 → T-01; FR-17 → T-18; FR-18 → T-19. - Test classes in `tests/Feature_v2` are updated where they encode the old triggers; no new class is added there. - Drift gate, benchmark and adjustments: plan.md § Implementation Drift Gate. diff --git a/lang/ar/maintenance.php b/lang/ar/maintenance.php index 6b328c3410f..26fcafdf996 100644 --- a/lang/ar/maintenance.php +++ b/lang/ar/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'الطلبات القديمة', - 'description' => 'تم العثور على %d طلب قديم.

يُعتبر الطلب قديمًا إذا مر عليه أكثر من 14 يومًا، وليس له مستخدم مرتبط به، وهو إما لا يزال في انتظار الدفع أو لا يحتوي على أي عناصر.', + 'description' => 'تم العثور على %d طلب قديم.
يُعتبر الطلب قديمًا إذا مر عليه أكثر من 14 يومًا، وليس له مستخدم مرتبط به، وهو إما لا يزال في انتظار الدفع أو لا يحتوي على أي عناصر.', 'button' => 'حذف الطلبات القديمة', ], 'fulfill-orders' => [ 'title' => 'طلبات بانتظار التنفيذ', - 'description' => 'تم العثور على %d طلب يحتوي على محتوى لم يُتَح بعد.

انقر على الزر لتخصيص المحتوى عند الإمكان.', + 'description' => 'تم العثور على %d طلب يحتوي على محتوى لم يُتَح بعد.
انقر على الزر لتخصيص المحتوى عند الإمكان.', 'button' => 'تنفيذ الطلبات', ], 'fulfill-precompute' => [ 'title' => 'الحقول المحسوبة مسبقًا للألبومات', - 'description' => 'تم العثور على %d ألبوم تنقصه الحقول المحسوبة مسبقًا.

يعادل تشغيل الأمر: php artisan lychee:recompute-album-fields', + 'description' => 'تم العثور على %d ألبوم تنقصه الحقول المحسوبة مسبقًا.
يعادل تشغيل الأمر: php artisan lychee:recompute-album-stats', 'button' => 'حساب الحقول', ], 'flush-queue' => [ 'title' => 'تفريغ قائمة الانتظار', - 'description' => 'تم العثور على %d مهمة معلّقة في قائمة الانتظار.

تحذير: سيؤدي تفريغ قائمة الانتظار إلى حذف جميع المهام المعلّقة نهائيًا. لا يمكن التراجع عن هذا الإجراء.', + 'description' => 'تم العثور على %d مهمة معلّقة في قائمة الانتظار.
تحذير: سيؤدي تفريغ قائمة الانتظار إلى حذف جميع المهام المعلّقة نهائيًا. لا يمكن التراجع عن هذا الإجراء.', 'button' => 'تفريغ القائمة', ], 'backfill-album-sizes' => [ 'title' => 'إحصائيات حجم الألبومات', - 'description' => 'تم العثور على %d ألبوم بدون إحصائيات الحجم.

يعادل تشغيل الأمر: php artisan lychee:recompute-album-sizes', + 'description' => 'تم العثور على %d ألبوم بدون إحصائيات الحجم.
يعادل تشغيل الأمر: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'يعيد حساب إحصاءات حجم جميع الألبومات في الخلفية.
يعادل تشغيل الأمر: php artisan lychee:recompute-album-sizes', 'button' => 'حساب الأحجام', ], + 'recompute-buckets' => [ + 'title' => 'مجموعات الخط الزمني', + 'description' => 'يعيد حساب مجموعة الخط الزمني لكل ألبوم ولكل صورة، ثم يحدّث قوائم الألبومات والصور.
يعادل تشغيل الأمر: php artisan lychee:recompute-buckets', + 'button' => 'إعادة الحساب', + ], 'face_quality' => [ 'title' => 'مراجعة جودة الوجوه', @@ -130,7 +136,7 @@ 'selected_count' => ':count محدد', ], 'bulk-scan-faces' => [ - 'description' => 'تم العثور على %d صورة لم يتم فحصها بعد للتعرف على الوجوه.

يتطلب تشغيل خدمة الرؤية بالذكاء الاصطناعي (AI Vision).', + 'description' => 'تم العثور على %d صورة لم يتم فحصها بعد للتعرف على الوجوه.
يتطلب تشغيل خدمة الرؤية بالذكاء الاصطناعي (AI Vision).', ], 'run-clustering' => [ 'description' => 'تشغيل عملية تجميع الوجوه في خدمة الرؤية بالذكاء الاصطناعي (AI Vision). يقوم بتجميع الوجوه المكتشفة حسب التشابه لتتمكن من تعيينها للأشخاص.', diff --git a/lang/bg/maintenance.php b/lang/bg/maintenance.php index ccaae29102e..1f3f8d9592d 100644 --- a/lang/bg/maintenance.php +++ b/lang/bg/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Старо поръчки', - 'description' => 'Намерени са %d стари поръчки.

Стара поръчка е по-стара от 14 дни, няма свързан потребител и все още е в очакване на плащане или не съдържа артикули.', + 'description' => 'Намерени са %d стари поръчки.
Стара поръчка е по-стара от 14 дни, няма свързан потребител и все още е в очакване на плащане или не съдържа артикули.', 'button' => 'Изтрий старите поръчки', ], 'fulfill-orders' => [ 'title' => 'Поръчки за изпълнение', - 'description' => 'Намерени са %d поръчки със съдържание, което не е направено достъпно.

Кликнете бутона, за да разпределите съдържанието, когато е възможно.', + 'description' => 'Намерени са %d поръчки със съдържание, което не е направено достъпно.
Кликнете бутона, за да разпределите съдържанието, когато е възможно.', 'button' => 'Изпълни поръчките', ], 'fulfill-precompute' => [ 'title' => 'Предварително изчислени полета на албума', - 'description' => 'Намерени са %d албума с липсващи предварително изчислени полета.

Еквивалентно на изпълнение на: php artisan lychee:backfill-album-fields', + 'description' => 'Намерени са %d албума с липсващи предварително изчислени полета.
Еквивалентно на изпълнение на: php artisan lychee:recompute-album-stats', 'button' => 'Изчисли полетата', ], 'flush-queue' => [ 'title' => 'Изчисти опашката', - 'description' => 'Намерени са %d чакащи задачи в опашката.

ВНИМАНИЕ: Изчистването на опашката ще изтрие завинаги всички чакащи задачи. Това не може да бъде отменено.', + 'description' => 'Намерени са %d чакащи задачи в опашката.
ВНИМАНИЕ: Изчистването на опашката ще изтрие завинаги всички чакащи задачи. Това не може да бъде отменено.', 'button' => 'Изчисти опашката', ], 'backfill-album-sizes' => [ 'title' => 'Статистика за размера на албумите', - 'description' => 'Открити са %d албума без статистика за размера.

Еквивалентно на изпълнението на: php artisan lychee:recompute-album-sizes', + 'description' => 'Открити са %d албума без статистика за размера.
Еквивалентно на изпълнението на: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Преизчислява във фонов режим статистиката за размера на всички албуми.
Еквивалентно на изпълнението на: php artisan lychee:recompute-album-sizes', 'button' => 'Изчисли размерите', ], + 'recompute-buckets' => [ + 'title' => 'Групи на времевата линия', + 'description' => 'Преизчислява групата на времевата линия на всеки албум и всяка снимка, след което опреснява списъците с албуми и снимки.
Еквивалентно на командата: php artisan lychee:recompute-buckets', + 'button' => 'Преизчисли', + ], 'face_quality' => [ 'title' => 'Преглед на качеството на лицата', @@ -130,7 +136,7 @@ 'selected_count' => ':count избрани', ], 'bulk-scan-faces' => [ - 'description' => 'Открити са %d снимки, които все още не са сканирани за лицево разпознаване.

Изисква се услугата AI Vision да работи.', + 'description' => 'Открити са %d снимки, които все още не са сканирани за лицево разпознаване.
Изисква се услугата AI Vision да работи.', ], 'run-clustering' => [ 'description' => 'Стартира групирането на лица в услугата AI Vision. Откритите лица се групират по сходство, за да можете да ги свържете с хора.', diff --git a/lang/cz/maintenance.php b/lang/cz/maintenance.php index 3a94f1a6175..78912f6e08b 100644 --- a/lang/cz/maintenance.php +++ b/lang/cz/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Staré objednávky', - 'description' => 'Nalezeno %d starých objednávek.

Stará objednávka je starší než 14 dní, nemá přiřazeného uživatele a buď je stále v čekání na platbu, nebo neobsahuje žádné položky.', + 'description' => 'Nalezeno %d starých objednávek.
Stará objednávka je starší než 14 dní, nemá přiřazeného uživatele a buď je stále v čekání na platbu, nebo neobsahuje žádné položky.', 'button' => 'Odstranit staré objednávky', ], 'fulfill-orders' => [ 'title' => 'Objednávky k vyřízení', - 'description' => 'Nalezeno %d objednávek s obsahem, který nebyl zpřístupněn.

Klikněte na tlačítko a přiřaďte obsah, pokud je to možné.', + 'description' => 'Nalezeno %d objednávek s obsahem, který nebyl zpřístupněn.
Klikněte na tlačítko a přiřaďte obsah, pokud je to možné.', 'button' => 'Vyřídit objednávky', ], 'fulfill-precompute' => [ 'title' => 'Předpočítaná pole alb', - 'description' => 'Bylo nalezeno %d alb s chybějícími předpočítanými poli.

Odpovídá spuštění: php artisan lychee:recompute-album-fields', + 'description' => 'Bylo nalezeno %d alb s chybějícími předpočítanými poli.
Odpovídá spuštění: php artisan lychee:recompute-album-stats', 'button' => 'Vypočítat pole', ], 'flush-queue' => [ 'title' => 'Vyčistit frontu', - 'description' => 'Ve frontě bylo nalezeno %d čekajících úloh.

UPOZORNĚNÍ: Vyčištění fronty trvale odstraní všechny čekající úlohy. Tuto akci nelze vrátit zpět.', + 'description' => 'Ve frontě bylo nalezeno %d čekajících úloh.
UPOZORNĚNÍ: Vyčištění fronty trvale odstraní všechny čekající úlohy. Tuto akci nelze vrátit zpět.', 'button' => 'Vyčistit frontu', ], 'backfill-album-sizes' => [ 'title' => 'Statistiky velikosti alb', - 'description' => 'Nalezeno %d alb bez statistik velikosti.

Odpovídá spuštění: php artisan lychee:recompute-album-sizes', + 'description' => 'Nalezeno %d alb bez statistik velikosti.
Odpovídá spuštění: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Přepočítá na pozadí statistiky velikosti všech alb.
Odpovídá spuštění: php artisan lychee:recompute-album-sizes', 'button' => 'Přepočítat velikosti', ], + 'recompute-buckets' => [ + 'title' => 'Skupiny časové osy', + 'description' => 'Přepočítá skupinu časové osy každého alba a každé fotografie a poté obnoví seznamy alb a fotografií.
Odpovídá příkazu: php artisan lychee:recompute-buckets', + 'button' => 'Přepočítat', + ], 'face_quality' => [ 'title' => 'Kontrola kvality obličejů', @@ -130,7 +136,7 @@ 'selected_count' => 'Vybráno: :count', ], 'bulk-scan-faces' => [ - 'description' => 'Nalezeno %d fotografií, které dosud nebyly prohledány rozpoznáváním obličejů.

Vyžaduje spuštěnou službu AI Vision.', + 'description' => 'Nalezeno %d fotografií, které dosud nebyly prohledány rozpoznáváním obličejů.
Vyžaduje spuštěnou službu AI Vision.', ], 'run-clustering' => [ 'description' => 'Spustit shlukování obličejů ve službě AI Vision. Seskupí detekované obličeje podle podobnosti, abyste je mohli přiřadit osobám.', diff --git a/lang/de/maintenance.php b/lang/de/maintenance.php index 170c697371b..db4a060476a 100644 --- a/lang/de/maintenance.php +++ b/lang/de/maintenance.php @@ -70,29 +70,35 @@ ], 'old-orders' => [ 'title' => 'Alte Bestellungen', - 'description' => 'Es wurden %d alte Bestellungen gefunden.

Als „alt“ gelten Bestellungen, die älter als 14 Tage sind, keinem Benutzer zugeordnet wurden und entweder noch auf die Zahlung warten oder keine Artikel enthalten.', + 'description' => 'Es wurden %d alte Bestellungen gefunden.
Als „alt“ gelten Bestellungen, die älter als 14 Tage sind, keinem Benutzer zugeordnet wurden und entweder noch auf die Zahlung warten oder keine Artikel enthalten.', 'button' => 'Alte Bestellungen löschen', ], 'fulfill-orders' => [ 'title' => 'Offene Bestellungen', - 'description' => 'Es wurden %d Bestellungen gefunden, deren Inhalte noch nicht bereitgestellt wurden.

Klicken Sie auf die Schaltfläche, um Inhalte zuzuweisen, sofern möglich.', + 'description' => 'Es wurden %d Bestellungen gefunden, deren Inhalte noch nicht bereitgestellt wurden.
Klicken Sie auf die Schaltfläche, um Inhalte zuzuweisen, sofern möglich.', 'button' => 'Bestellungen abwickeln', ], 'fulfill-precompute' => [ 'title' => 'Vorberechnete Album-Felder', - 'description' => 'Es wurden %d Alben mit fehlenden vorberechneten Feldern gefunden.

Entspricht dem Befehl: php artisan lychee:recompute-album-fields', + 'description' => 'Es wurden %d Alben mit fehlenden vorberechneten Feldern gefunden.
Entspricht dem Befehl: php artisan lychee:recompute-album-stats', 'button' => 'Felder berechnen', ], 'flush-queue' => [ 'title' => 'Warteschlange leeren', - 'description' => 'Es befinden sich %d ausstehende Aufträge in der Warteschlange.

VORSICHT: Das Leeren der Warteschlange löscht alle ausstehenden Aufträge dauerhaft. Dies kann nicht rückgängig gemacht werden.', + 'description' => 'Es befinden sich %d ausstehende Aufträge in der Warteschlange.
VORSICHT: Das Leeren der Warteschlange löscht alle ausstehenden Aufträge dauerhaft. Dies kann nicht rückgängig gemacht werden.', 'button' => 'Warteschlange leeren', ], 'backfill-album-sizes' => [ 'title' => 'Album-Größenstatistik', - 'description' => 'Es wurden %d Alben ohne Größenstatistik gefunden.

Entspricht dem Befehl: php artisan lychee:recompute-album-sizes', + 'description' => 'Es wurden %d Alben ohne Größenstatistik gefunden.
Entspricht dem Befehl: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Berechnet die Größenstatistik aller Alben im Hintergrund neu.
Entspricht dem Befehl: php artisan lychee:recompute-album-sizes', 'button' => 'Größen berechnen', ], + 'recompute-buckets' => [ + 'title' => 'Zeitstrahl-Gruppen', + 'description' => 'Berechnet die Zeitstrahl-Gruppe jedes Albums und jedes Fotos neu und aktualisiert danach die Album- und Fotolisten.
Entspricht dem Befehl: php artisan lychee:recompute-buckets', + 'button' => 'Neu berechnen', + ], 'face_quality' => [ 'title' => 'Überprüfung der Bildqualität', 'description' => 'Überprüfen Sie die Gesichtserkennungen anhand des Qualitätswerts und verwerfen Sie Gesichter von geringer Qualität oder fehlerhafte Gesichter.', @@ -128,7 +134,7 @@ 'selected_count' => ':Anzahl der ausgewählten Elemente', ], 'bulk-scan-faces' => [ - 'description' => 'Es wurden %d Fotos gefunden, die noch nicht zur Gesichtserkennung gescannt wurden.

Hierfür muss der AI Vision-Dienst ausgeführt werden.', + 'description' => 'Es wurden %d Fotos gefunden, die noch nicht zur Gesichtserkennung gescannt wurden.
Hierfür muss der AI Vision-Dienst ausgeführt werden.', ], 'run-clustering' => [ 'description' => 'Lösen Sie die Gesichtsgruppierung im AI Vision-Dienst aus. Die erkannten Gesichter werden nach Ähnlichkeit gruppiert, sodass Sie sie bestimmten Personen zuordnen können.', diff --git a/lang/el/maintenance.php b/lang/el/maintenance.php index e543cb1107b..ae584155aa5 100644 --- a/lang/el/maintenance.php +++ b/lang/el/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Παλιές παραγγελίες', - 'description' => 'Βρέθηκαν %d παλιές παραγγελίες.

Παλιά θεωρείται μια παραγγελία παλαιότερη των 14 ημερών, χωρίς συσχετισμένο χρήστη, η οποία είτε εκκρεμεί ακόμη πληρωμή είτε δεν περιέχει κανένα αντικείμενο.', + 'description' => 'Βρέθηκαν %d παλιές παραγγελίες.
Παλιά θεωρείται μια παραγγελία παλαιότερη των 14 ημερών, χωρίς συσχετισμένο χρήστη, η οποία είτε εκκρεμεί ακόμη πληρωμή είτε δεν περιέχει κανένα αντικείμενο.', 'button' => 'Διαγραφή παλιών παραγγελιών', ], 'fulfill-orders' => [ 'title' => 'Παραγγελίες προς εκτέλεση', - 'description' => 'Βρέθηκαν %d παραγγελίες με περιεχόμενο που δεν έχει διατεθεί.

Πατήστε το κουμπί για να αντιστοιχιστεί περιεχόμενο όπου είναι δυνατόν.', + 'description' => 'Βρέθηκαν %d παραγγελίες με περιεχόμενο που δεν έχει διατεθεί.
Πατήστε το κουμπί για να αντιστοιχιστεί περιεχόμενο όπου είναι δυνατόν.', 'button' => 'Εκτέλεση παραγγελιών', ], 'fulfill-precompute' => [ 'title' => 'Προϋπολογισμένα πεδία άλμπουμ', - 'description' => 'Βρέθηκαν %d άλμπουμ με προϋπολογισμένα πεδία που λείπουν.

Ισοδυναμεί με την εκτέλεση: php artisan lychee:recompute-album-fields', + 'description' => 'Βρέθηκαν %d άλμπουμ με προϋπολογισμένα πεδία που λείπουν.
Ισοδυναμεί με την εκτέλεση: php artisan lychee:recompute-album-stats', 'button' => 'Υπολογισμός πεδίων', ], 'flush-queue' => [ 'title' => 'Εκκαθάριση ουράς', - 'description' => 'Βρέθηκαν %d εκκρεμείς εργασίες στην ουρά.

ΠΡΟΣΟΧΗ: Η εκκαθάριση της ουράς θα διαγράψει οριστικά όλες τις εκκρεμείς εργασίες. Η ενέργεια δεν μπορεί να αναιρεθεί.', + 'description' => 'Βρέθηκαν %d εκκρεμείς εργασίες στην ουρά.
ΠΡΟΣΟΧΗ: Η εκκαθάριση της ουράς θα διαγράψει οριστικά όλες τις εκκρεμείς εργασίες. Η ενέργεια δεν μπορεί να αναιρεθεί.', 'button' => 'Εκκαθάριση ουράς', ], 'backfill-album-sizes' => [ 'title' => 'Στατιστικά μεγέθους άλμπουμ', - 'description' => 'Βρέθηκαν %d άλμπουμ χωρίς στατιστικά μεγέθους.

Ισοδυναμεί με την εκτέλεση: php artisan lychee:recompute-album-sizes', + 'description' => 'Βρέθηκαν %d άλμπουμ χωρίς στατιστικά μεγέθους.
Ισοδυναμεί με την εκτέλεση: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Επανυπολογίζει στο παρασκήνιο τα στατιστικά μεγέθους όλων των άλμπουμ.
Ισοδυναμεί με την εκτέλεση: php artisan lychee:recompute-album-sizes', 'button' => 'Υπολογισμός μεγεθών', ], + 'recompute-buckets' => [ + 'title' => 'Ομάδες χρονολογίου', + 'description' => 'Επανυπολογίζει την ομάδα χρονολογίου κάθε άλμπουμ και κάθε φωτογραφίας και στη συνέχεια ανανεώνει τις λίστες άλμπουμ και φωτογραφιών.
Ισοδυναμεί με την εντολή: php artisan lychee:recompute-buckets', + 'button' => 'Επανυπολογισμός', + ], 'face_quality' => [ 'title' => 'Έλεγχος ποιότητας προσώπων', @@ -130,7 +136,7 @@ 'selected_count' => ':count επιλεγμένα', ], 'bulk-scan-faces' => [ - 'description' => 'Βρέθηκαν %d φωτογραφίες που δεν έχουν σαρωθεί ακόμη για αναγνώριση προσώπων.

Απαιτείται η υπηρεσία AI Vision να βρίσκεται σε λειτουργία.', + 'description' => 'Βρέθηκαν %d φωτογραφίες που δεν έχουν σαρωθεί ακόμη για αναγνώριση προσώπων.
Απαιτείται η υπηρεσία AI Vision να βρίσκεται σε λειτουργία.', ], 'run-clustering' => [ 'description' => 'Εκκίνηση ομαδοποίησης προσώπων στην υπηρεσία AI Vision. Ομαδοποιεί τα ανιχνευμένα πρόσωπα κατά ομοιότητα, ώστε να μπορείτε να τα αντιστοιχίσετε σε άτομα.', diff --git a/lang/en/maintenance.php b/lang/en/maintenance.php index 42a382d602b..3309f7171fe 100644 --- a/lang/en/maintenance.php +++ b/lang/en/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Old Orders', - 'description' => 'Found %d old orders.

An old order is older than 14 days, that have no associated user and are either still pending payment or have no items in them.', + 'description' => 'Found %d old orders.
An old order is older than 14 days, that have no associated user and are either still pending payment or have no items in them.', 'button' => 'Delete old orders', ], 'fulfill-orders' => [ 'title' => 'Orders to fulfill', - 'description' => 'Found %d orders with content that has not been made available.

Click on the button to assign content when possible.', + 'description' => 'Found %d orders with content that has not been made available.
Click on the button to assign content when possible.', 'button' => 'Fulfill orders', ], 'fulfill-precompute' => [ 'title' => 'Album Precomputed Fields', - 'description' => 'Found %d albums with missing precomputed fields.

Equivalent to running: php artisan lychee:recompute-album-fields', + 'description' => 'Found %d albums with missing precomputed fields.
Equivalent to running: php artisan lychee:recompute-album-stats', 'button' => 'Compute fields', ], 'flush-queue' => [ 'title' => 'Flush Queue', - 'description' => 'Found %d pending jobs in the queue.

CAUTION: Clearing the queue will permanently delete all pending jobs. This cannot be undone.', + 'description' => 'Found %d pending jobs in the queue.
CAUTION: Clearing the queue will permanently delete all pending jobs. This cannot be undone.', 'button' => 'Clear queue', ], 'backfill-album-sizes' => [ 'title' => 'Album Size Statistics', - 'description' => 'Found %d albums without size statistics.

Equivalent to running: php artisan lychee:recompute-album-sizes', + 'description' => 'Found %d albums without size statistics.
Equivalent to running: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Recompute the size statistics of every album in the background.
Equivalent to running: php artisan lychee:recompute-album-sizes', 'button' => 'Compute sizes', ], + 'recompute-buckets' => [ + 'title' => 'Timeline Buckets', + 'description' => 'Rewrite the timeline bucket of every album and photo, then refresh the album and photo listings.
Equivalent to running: php artisan lychee:recompute-buckets', + 'button' => 'Recompute', + ], 'face_quality' => [ 'title' => 'Face Quality Review', 'description' => 'Review face detections by quality score and dismiss low-quality or erroneous faces.', @@ -129,7 +135,7 @@ 'selected_count' => ':count selected', ], 'bulk-scan-faces' => [ - 'description' => 'Found %d photos that have not yet been scanned for facial recognition.

Requires the AI Vision service to be running.', + 'description' => 'Found %d photos that have not yet been scanned for facial recognition.
Requires the AI Vision service to be running.', ], 'run-clustering' => [ 'description' => 'Trigger face clustering in the AI Vision service. Groups detected faces by similarity so you can assign them to people.', diff --git a/lang/es/maintenance.php b/lang/es/maintenance.php index 8fce0a6c57a..3634ef12836 100644 --- a/lang/es/maintenance.php +++ b/lang/es/maintenance.php @@ -70,29 +70,35 @@ ], 'old-orders' => [ 'title' => 'Antiguas órdenes', - 'description' => 'Se han encontrado %d pedidos antiguos.

Un pedido antiguo es aquel que tiene más de 14 días de antigüedad, no tiene ningún usuario asociado y o bien sigue pendiente de pago o bien no contiene ningún artículo.', + 'description' => 'Se han encontrado %d pedidos antiguos.
Un pedido antiguo es aquel que tiene más de 14 días de antigüedad, no tiene ningún usuario asociado y o bien sigue pendiente de pago o bien no contiene ningún artículo.', 'button' => 'Eliminar pedidos antiguos', ], 'fulfill-orders' => [ 'title' => 'Pedidos pendientes de tramitar', - 'description' => 'Se han encontrado %d pedidos con contenido que aún no está disponible.

Haz clic en el botón para asignar el contenido cuando sea posible.', + 'description' => 'Se han encontrado %d pedidos con contenido que aún no está disponible.
Haz clic en el botón para asignar el contenido cuando sea posible.', 'button' => 'Tramitar pedidos', ], 'fulfill-precompute' => [ 'title' => 'Campos precalculados del álbum', - 'description' => 'Se encontraron %d álbumes con campos precalculados ausentes.

Equivale a ejecutar: php artisan lychee:recompute-album-fields', + 'description' => 'Se encontraron %d álbumes con campos precalculados ausentes.
Equivale a ejecutar: php artisan lychee:recompute-album-stats', 'button' => 'Cálculo de campos', ], 'flush-queue' => [ 'title' => 'Vaciar la cola', - 'description' => 'Se han encontrado %d trabajos pendientes en la cola.

PRECAUCIÓN: Al vaciar la cola se eliminarán de forma permanente todos los trabajos pendientes. Esta acción no se puede deshacer.', + 'description' => 'Se han encontrado %d trabajos pendientes en la cola.
PRECAUCIÓN: Al vaciar la cola se eliminarán de forma permanente todos los trabajos pendientes. Esta acción no se puede deshacer.', 'button' => 'Borrar cola', ], 'backfill-album-sizes' => [ 'title' => 'Estadísticas sobre el tamaño de los álbumes', - 'description' => 'Se encontraron %d álbumes sin estadísticas de tamaño.

Equivale a ejecutar: php artisan lychee:recompute-album-sizes', + 'description' => 'Se encontraron %d álbumes sin estadísticas de tamaño.
Equivale a ejecutar: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Recalcula en segundo plano las estadísticas de tamaño de todos los álbumes.
Equivale a ejecutar: php artisan lychee:recompute-album-sizes', 'button' => 'Tamaños de los servidores', ], + 'recompute-buckets' => [ + 'title' => 'Grupos de la línea de tiempo', + 'description' => 'Recalcula el grupo de la línea de tiempo de cada álbum y cada foto, y luego actualiza los listados de álbumes y fotos.
Equivale a ejecutar: php artisan lychee:recompute-buckets', + 'button' => 'Recalcular', + ], 'face_quality' => [ 'title' => 'Revisión de la calidad de las caras', 'description' => 'Revisa las detecciones de rostros según la puntuación de calidad y descarta los rostros de baja calidad o erróneos.', @@ -128,7 +134,7 @@ 'selected_count' => ':número de elementos seleccionados', ], 'bulk-scan-faces' => [ - 'description' => 'Se han encontrado %d fotos que aún no se han analizado para el reconocimiento facial.

Es necesario que el servicio AI Vision esté en ejecución.', + 'description' => 'Se han encontrado %d fotos que aún no se han analizado para el reconocimiento facial.
Es necesario que el servicio AI Vision esté en ejecución.', ], 'run-clustering' => [ 'description' => 'Activa la agrupación de rostros en el servicio AI Vision. Agrupa los rostros detectados por similitud para que puedas asignarlos a personas.', diff --git a/lang/fa/maintenance.php b/lang/fa/maintenance.php index f32b5fa0727..9c851e3cdaa 100644 --- a/lang/fa/maintenance.php +++ b/lang/fa/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'سفارش‌های قدیمی', - 'description' => '%d سفارش قدیمی یافت شد.

سفارش قدیمی، سفارشی است که بیش از ۱۴ روز از آن گذشته، کاربری به آن مرتبط نیست و یا هنوز در انتظار پرداخت است و یا هیچ موردی در آن وجود ندارد.', + 'description' => '%d سفارش قدیمی یافت شد.
سفارش قدیمی، سفارشی است که بیش از ۱۴ روز از آن گذشته، کاربری به آن مرتبط نیست و یا هنوز در انتظار پرداخت است و یا هیچ موردی در آن وجود ندارد.', 'button' => 'حذف سفارش‌های قدیمی', ], 'fulfill-orders' => [ 'title' => 'سفارش‌های در انتظار تکمیل', - 'description' => '%d سفارش با محتوایی که هنوز در دسترس قرار نگرفته یافت شد.

برای اختصاص محتوا در صورت امکان، روی دکمه کلیک کنید.', + 'description' => '%d سفارش با محتوایی که هنوز در دسترس قرار نگرفته یافت شد.
برای اختصاص محتوا در صورت امکان، روی دکمه کلیک کنید.', 'button' => 'تکمیل سفارش‌ها', ], 'fulfill-precompute' => [ 'title' => 'فیلدهای از پیش محاسبه‌شده آلبوم', - 'description' => '%d آلبوم با فیلدهای از پیش محاسبه‌شده گمشده یافت شد.

معادل اجرای دستور: php artisan lychee:recompute-album-fields', + 'description' => '%d آلبوم با فیلدهای از پیش محاسبه‌شده گمشده یافت شد.
معادل اجرای دستور: php artisan lychee:recompute-album-stats', 'button' => 'محاسبه فیلدها', ], 'flush-queue' => [ 'title' => 'پاک‌سازی صف', - 'description' => '%d وظیفه در حال انتظار در صف یافت شد.

احتیاط: پاک کردن صف تمام وظایف در انتظار را برای همیشه حذف می‌کند. این عمل قابل بازگشت نیست.', + 'description' => '%d وظیفه در حال انتظار در صف یافت شد.
احتیاط: پاک کردن صف تمام وظایف در انتظار را برای همیشه حذف می‌کند. این عمل قابل بازگشت نیست.', 'button' => 'پاک‌سازی صف', ], 'backfill-album-sizes' => [ 'title' => 'آمار اندازه آلبوم', - 'description' => '%d آلبوم بدون آمار اندازه یافت شد.

معادل اجرای دستور: php artisan lychee:recompute-album-sizes', + 'description' => '%d آلبوم بدون آمار اندازه یافت شد.
معادل اجرای دستور: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'آمار اندازهٔ همهٔ آلبوم‌ها را در پس‌زمینه دوباره محاسبه می‌کند.
معادل اجرای دستور: php artisan lychee:recompute-album-sizes', 'button' => 'محاسبه اندازه‌ها', ], + 'recompute-buckets' => [ + 'title' => 'گروه‌های خط زمانی', + 'description' => 'گروه خط زمانی هر آلبوم و هر عکس را دوباره محاسبه می‌کند و سپس فهرست آلبوم‌ها و عکس‌ها را تازه می‌کند.
معادل اجرای فرمان: php artisan lychee:recompute-buckets', + 'button' => 'محاسبهٔ دوباره', + ], 'face_quality' => [ 'title' => 'بررسی کیفیت چهره‌ها', @@ -130,7 +136,7 @@ 'selected_count' => ':count مورد انتخاب شد', ], 'bulk-scan-faces' => [ - 'description' => '%d عکس یافت شد که هنوز برای تشخیص چهره اسکن نشده‌اند.

نیازمند فعال بودن سرویس AI Vision است.', + 'description' => '%d عکس یافت شد که هنوز برای تشخیص چهره اسکن نشده‌اند.
نیازمند فعال بودن سرویس AI Vision است.', ], 'run-clustering' => [ 'description' => 'خوشه‌بندی چهره‌ها را در سرویس AI Vision آغاز کنید. چهره‌های شناسایی‌شده را بر اساس شباهت گروه‌بندی می‌کند تا بتوانید آن‌ها را به افراد اختصاص دهید.', diff --git a/lang/fr/maintenance.php b/lang/fr/maintenance.php index 310256f6f1e..b45ff2ff605 100644 --- a/lang/fr/maintenance.php +++ b/lang/fr/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Anciennes commandes', - 'description' => '%d anciennes commandes trouvées.

Une commande est considérée comme ancienne si elle date de plus de 14 jours, n’est associée à aucun utilisateur, et est soit toujours en attente de paiement, soit sans aucun article.', + 'description' => '%d anciennes commandes trouvées.
Une commande est considérée comme ancienne si elle date de plus de 14 jours, n’est associée à aucun utilisateur, et est soit toujours en attente de paiement, soit sans aucun article.', 'button' => 'Supprimer les anciennes commandes', ], 'fulfill-orders' => [ 'title' => 'Commandes à traiter', - 'description' => '%d commandes dont le contenu n’a pas encore été mis à disposition ont été trouvées.

Cliquez sur le bouton pour attribuer le contenu lorsque cela est possible.', + 'description' => '%d commandes dont le contenu n’a pas encore été mis à disposition ont été trouvées.
Cliquez sur le bouton pour attribuer le contenu lorsque cela est possible.', 'button' => 'Traiter les commandes', ], 'fulfill-precompute' => [ 'title' => 'Champs précalculés des albums', - 'description' => '%d albums avec des champs précalculés manquants ont été trouvés.

Équivaut à exécuter : php artisan lychee:recompute-album-fields', + 'description' => '%d albums avec des champs précalculés manquants ont été trouvés.
Équivaut à exécuter : php artisan lychee:recompute-album-stats', 'button' => 'Calculer les champs', ], 'flush-queue' => [ 'title' => 'Vider la file d’attente', - 'description' => '%d tâches en attente ont été trouvées dans la file.

ATTENTION : vider la file supprimera définitivement toutes les tâches en attente. Cette action est irréversible.', + 'description' => '%d tâches en attente ont été trouvées dans la file.
ATTENTION : vider la file supprimera définitivement toutes les tâches en attente. Cette action est irréversible.', 'button' => 'Vider la file', ], 'backfill-album-sizes' => [ 'title' => 'Statistiques de taille des albums', - 'description' => '%d albums sans statistiques de taille ont été trouvés.

Équivaut à exécuter : php artisan lychee:recompute-album-sizes', + 'description' => '%d albums sans statistiques de taille ont été trouvés.
Équivaut à exécuter : php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Recalcule en arrière-plan les statistiques de taille de tous les albums.
Équivaut à exécuter : php artisan lychee:recompute-album-sizes', 'button' => 'Calculer les tailles', ], + 'recompute-buckets' => [ + 'title' => 'Groupes de la chronologie', + 'description' => 'Recalcule le groupe chronologique de chaque album et de chaque photo, puis rafraîchit les listes des albums et des photos.
Équivaut à exécuter : php artisan lychee:recompute-buckets', + 'button' => 'Recalculer', + ], 'face_quality' => [ 'title' => 'Contrôle qualité des visages', @@ -130,7 +136,7 @@ 'selected_count' => ':count sélectionné(s)', ], 'bulk-scan-faces' => [ - 'description' => '%d photos n’ayant pas encore été analysées pour la reconnaissance faciale ont été trouvées.

Nécessite que le service AI Vision soit en cours d’exécution.', + 'description' => '%d photos n’ayant pas encore été analysées pour la reconnaissance faciale ont été trouvées.
Nécessite que le service AI Vision soit en cours d’exécution.', ], 'run-clustering' => [ 'description' => 'Déclenche le regroupement des visages dans le service AI Vision. Regroupe les visages détectés par similarité afin de pouvoir les attribuer à des personnes.', diff --git a/lang/hu/maintenance.php b/lang/hu/maintenance.php index 697a4467a21..9d958cbfbbb 100644 --- a/lang/hu/maintenance.php +++ b/lang/hu/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Régi rendelések', - 'description' => '%d régi rendelés található.

Régi rendelésnek számít az a 14 napnál régebbi rendelés, amelyhez nem tartozik felhasználó, és vagy még fizetésre vár, vagy nincs benne tétel.', + 'description' => '%d régi rendelés található.
Régi rendelésnek számít az a 14 napnál régebbi rendelés, amelyhez nem tartozik felhasználó, és vagy még fizetésre vár, vagy nincs benne tétel.', 'button' => 'Régi rendelések törlése', ], 'fulfill-orders' => [ 'title' => 'Teljesítendő rendelések', - 'description' => '%d rendelés található, amelynek tartalma még nem lett elérhetővé téve.

Kattintson a gombra a tartalom hozzárendeléséhez, ahol lehetséges.', + 'description' => '%d rendelés található, amelynek tartalma még nem lett elérhetővé téve.
Kattintson a gombra a tartalom hozzárendeléséhez, ahol lehetséges.', 'button' => 'Rendelések teljesítése', ], 'fulfill-precompute' => [ 'title' => 'Album előre számított mezői', - 'description' => '%d album található hiányzó előre számított mezőkkel.

Egyenértékű ennek futtatásával: php artisan lychee:recompute-album-fields', + 'description' => '%d album található hiányzó előre számított mezőkkel.
Egyenértékű ennek futtatásával: php artisan lychee:recompute-album-stats', 'button' => 'Mezők kiszámítása', ], 'flush-queue' => [ 'title' => 'Várólista ürítése', - 'description' => '%d függőben lévő feladat található a várólistában.

FIGYELEM: A várólista ürítése véglegesen törli az összes függőben lévő feladatot. Ez nem vonható vissza.', + 'description' => '%d függőben lévő feladat található a várólistában.
FIGYELEM: A várólista ürítése véglegesen törli az összes függőben lévő feladatot. Ez nem vonható vissza.', 'button' => 'Várólista ürítése', ], 'backfill-album-sizes' => [ 'title' => 'Albumméret-statisztikák', - 'description' => '%d album található méretstatisztika nélkül.

Egyenértékű ennek futtatásával: php artisan lychee:recompute-album-sizes', + 'description' => '%d album található méretstatisztika nélkül.
Egyenértékű ennek futtatásával: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'A háttérben újraszámolja az összes album méretstatisztikáját.
Egyenértékű ennek futtatásával: php artisan lychee:recompute-album-sizes', 'button' => 'Méretek kiszámítása', ], + 'recompute-buckets' => [ + 'title' => 'Idővonal-csoportok', + 'description' => 'Újraszámolja minden album és minden fénykép idővonal-csoportját, majd frissíti az album- és fényképlistákat.
Megfelel a következő parancsnak: php artisan lychee:recompute-buckets', + 'button' => 'Újraszámolás', + ], 'face_quality' => [ 'title' => 'Arcminőség áttekintése', @@ -130,7 +136,7 @@ 'selected_count' => ':count kijelölve', ], 'bulk-scan-faces' => [ - 'description' => '%d fénykép található, amelyet még nem vizsgáltak meg arcfelismeréssel.

Ehhez futnia kell az AI Vision szolgáltatásnak.', + 'description' => '%d fénykép található, amelyet még nem vizsgáltak meg arcfelismeréssel.
Ehhez futnia kell az AI Vision szolgáltatásnak.', ], 'run-clustering' => [ 'description' => 'Arccsoportosítás indítása az AI Vision szolgáltatásban. Hasonlóság alapján csoportosítja az észlelt arcokat, így személyekhez rendelheti őket.', diff --git a/lang/it/maintenance.php b/lang/it/maintenance.php index 3874a9832b3..c3f140d3842 100644 --- a/lang/it/maintenance.php +++ b/lang/it/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Ordini vecchi', - 'description' => 'Trovati %d ordini vecchi.

Un ordine è considerato vecchio se ha più di 14 giorni, non ha alcun utente associato ed è ancora in attesa di pagamento oppure non contiene articoli.', + 'description' => 'Trovati %d ordini vecchi.
Un ordine è considerato vecchio se ha più di 14 giorni, non ha alcun utente associato ed è ancora in attesa di pagamento oppure non contiene articoli.', 'button' => 'Elimina ordini vecchi', ], 'fulfill-orders' => [ 'title' => 'Ordini da evadere', - 'description' => 'Trovati %d ordini con contenuti non ancora resi disponibili.

Fai clic sul pulsante per assegnare i contenuti quando possibile.', + 'description' => 'Trovati %d ordini con contenuti non ancora resi disponibili.
Fai clic sul pulsante per assegnare i contenuti quando possibile.', 'button' => 'Evadi ordini', ], 'fulfill-precompute' => [ 'title' => 'Campi precalcolati degli album', - 'description' => 'Trovati %d album con campi precalcolati mancanti.

Equivale a eseguire: php artisan lychee:recompute-album-fields', + 'description' => 'Trovati %d album con campi precalcolati mancanti.
Equivale a eseguire: php artisan lychee:recompute-album-stats', 'button' => 'Calcola campi', ], 'flush-queue' => [ 'title' => 'Svuota coda', - 'description' => 'Trovati %d job in attesa nella coda.

ATTENZIONE: svuotare la coda eliminerà definitivamente tutti i job in attesa. L\'operazione non può essere annullata.', + 'description' => 'Trovati %d job in attesa nella coda.
ATTENZIONE: svuotare la coda eliminerà definitivamente tutti i job in attesa. L\'operazione non può essere annullata.', 'button' => 'Svuota coda', ], 'backfill-album-sizes' => [ 'title' => 'Statistiche dimensioni album', - 'description' => 'Trovati %d album senza statistiche sulle dimensioni.

Equivale a eseguire: php artisan lychee:recompute-album-sizes', + 'description' => 'Trovati %d album senza statistiche sulle dimensioni.
Equivale a eseguire: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Ricalcola in background le statistiche di dimensione di tutti gli album.
Equivale a eseguire: php artisan lychee:recompute-album-sizes', 'button' => 'Calcola dimensioni', ], + 'recompute-buckets' => [ + 'title' => 'Gruppi della cronologia', + 'description' => 'Ricalcola il gruppo della cronologia di ogni album e di ogni foto, poi aggiorna gli elenchi di album e foto.
Equivale a eseguire: php artisan lychee:recompute-buckets', + 'button' => 'Ricalcola', + ], 'face_quality' => [ 'title' => 'Revisione qualità volti', @@ -130,7 +136,7 @@ 'selected_count' => ':count selezionati', ], 'bulk-scan-faces' => [ - 'description' => 'Trovate %d foto non ancora analizzate per il riconoscimento facciale.

Richiede che il servizio AI Vision sia in esecuzione.', + 'description' => 'Trovate %d foto non ancora analizzate per il riconoscimento facciale.
Richiede che il servizio AI Vision sia in esecuzione.', ], 'run-clustering' => [ 'description' => 'Avvia il clustering dei volti nel servizio AI Vision. Raggruppa i volti rilevati per somiglianza, così puoi assegnarli alle persone.', diff --git a/lang/ja/maintenance.php b/lang/ja/maintenance.php index 504acd5c046..c2025fee4bd 100644 --- a/lang/ja/maintenance.php +++ b/lang/ja/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => '古い注文', - 'description' => '古い注文が %d 件見つかりました。

古い注文とは、14日以上経過し、関連付けられたユーザーがおらず、支払い待ちのままか商品が含まれていない注文です。', + 'description' => '古い注文が %d 件見つかりました。
古い注文とは、14日以上経過し、関連付けられたユーザーがおらず、支払い待ちのままか商品が含まれていない注文です。', 'button' => '古い注文を削除', ], 'fulfill-orders' => [ 'title' => '処理待ちの注文', - 'description' => 'コンテンツがまだ提供されていない注文が %d 件見つかりました。

ボタンをクリックすると、可能な場合にコンテンツを割り当てます。', + 'description' => 'コンテンツがまだ提供されていない注文が %d 件見つかりました。
ボタンをクリックすると、可能な場合にコンテンツを割り当てます。', 'button' => '注文を処理', ], 'fulfill-precompute' => [ 'title' => 'アルバムの事前計算フィールド', - 'description' => '事前計算フィールドが欠落しているアルバムが %d 件見つかりました。

次のコマンドの実行と同等です:php artisan lychee:recompute-album-fields', + 'description' => '事前計算フィールドが欠落しているアルバムが %d 件見つかりました。
次のコマンドの実行と同等です:php artisan lychee:recompute-album-stats', 'button' => 'フィールドを計算', ], 'flush-queue' => [ 'title' => 'キューをクリア', - 'description' => 'キューに保留中のジョブが %d 件見つかりました。

注意:キューをクリアすると、保留中のすべてのジョブが完全に削除されます。この操作は元に戻せません。', + 'description' => 'キューに保留中のジョブが %d 件見つかりました。
注意:キューをクリアすると、保留中のすべてのジョブが完全に削除されます。この操作は元に戻せません。', 'button' => 'キューをクリア', ], 'backfill-album-sizes' => [ 'title' => 'アルバムサイズ統計', - 'description' => 'サイズ統計のないアルバムが %d 件見つかりました。

次のコマンドの実行と同等です:php artisan lychee:recompute-album-sizes', + 'description' => 'サイズ統計のないアルバムが %d 件見つかりました。
次のコマンドの実行と同等です:php artisan lychee:recompute-album-sizes', + 'description_queue' => 'すべてのアルバムのサイズ統計をバックグラウンドで再計算します。
次のコマンドの実行と同等です:php artisan lychee:recompute-album-sizes', 'button' => 'サイズを計算', ], + 'recompute-buckets' => [ + 'title' => 'タイムラインのグループ', + 'description' => 'すべてのアルバムと写真のタイムライングループを再計算し、アルバムと写真の一覧を更新します。
次のコマンドと同等です: php artisan lychee:recompute-buckets', + 'button' => '再計算', + ], 'face_quality' => [ 'title' => '顔の品質レビュー', @@ -130,7 +136,7 @@ 'selected_count' => ':count 件選択中', ], 'bulk-scan-faces' => [ - 'description' => '顔認識のスキャンがまだ行われていない写真が %d 枚見つかりました。

AI Vision サービスが稼働している必要があります。', + 'description' => '顔認識のスキャンがまだ行われていない写真が %d 枚見つかりました。
AI Vision サービスが稼働している必要があります。', ], 'run-clustering' => [ 'description' => 'AI Vision サービスで顔のクラスタリングを実行します。検出された顔を類似度でグループ化し、人物に割り当てられるようにします。', diff --git a/lang/nl/maintenance.php b/lang/nl/maintenance.php index 2f33b5ecc7f..c018145a87a 100644 --- a/lang/nl/maintenance.php +++ b/lang/nl/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Oude Orders', - 'description' => '%d oude orders gevonden.

Een oude order is ouder dan 14 dagen, heeft geen gekoppelde gebruiker en is nog in afwachting van betaling of bevat geen items.', + 'description' => '%d oude orders gevonden.
Een oude order is ouder dan 14 dagen, heeft geen gekoppelde gebruiker en is nog in afwachting van betaling of bevat geen items.', 'button' => 'Verwijder oude orders', ], 'fulfill-orders' => [ 'title' => 'Af te handelen orders', - 'description' => '%d orders gevonden met inhoud die nog niet beschikbaar is gemaakt.

Klik op de knop om waar mogelijk inhoud toe te wijzen.', + 'description' => '%d orders gevonden met inhoud die nog niet beschikbaar is gemaakt.
Klik op de knop om waar mogelijk inhoud toe te wijzen.', 'button' => 'Orders afhandelen', ], 'fulfill-precompute' => [ 'title' => 'Vooraf berekende albumvelden', - 'description' => '%d albums gevonden met ontbrekende vooraf berekende velden.

Gelijk aan het uitvoeren van: php artisan lychee:recompute-album-fields', + 'description' => '%d albums gevonden met ontbrekende vooraf berekende velden.
Gelijk aan het uitvoeren van: php artisan lychee:recompute-album-stats', 'button' => 'Velden berekenen', ], 'flush-queue' => [ 'title' => 'Wachtrij leegmaken', - 'description' => '%d wachtende taken gevonden in de wachtrij.

LET OP: Het legen van de wachtrij verwijdert alle wachtende taken permanent. Dit kan niet ongedaan worden gemaakt.', + 'description' => '%d wachtende taken gevonden in de wachtrij.
LET OP: Het legen van de wachtrij verwijdert alle wachtende taken permanent. Dit kan niet ongedaan worden gemaakt.', 'button' => 'Wachtrij legen', ], 'backfill-album-sizes' => [ 'title' => 'Albumgroottestatistieken', - 'description' => '%d albums gevonden zonder groottestatistieken.

Gelijk aan het uitvoeren van: php artisan lychee:recompute-album-sizes', + 'description' => '%d albums gevonden zonder groottestatistieken.
Gelijk aan het uitvoeren van: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Berekent de groottestatistieken van alle albums op de achtergrond opnieuw.
Gelijk aan het uitvoeren van: php artisan lychee:recompute-album-sizes', 'button' => 'Groottes berekenen', ], + 'recompute-buckets' => [ + 'title' => 'Tijdlijngroepen', + 'description' => 'Berekent de tijdlijngroep van elk album en elke foto opnieuw en vernieuwt daarna de album- en fotolijsten.
Gelijk aan het uitvoeren van: php artisan lychee:recompute-buckets', + 'button' => 'Herberekenen', + ], 'face_quality' => [ 'title' => 'Beoordeling gezichtskwaliteit', @@ -130,7 +136,7 @@ 'selected_count' => ':count geselecteerd', ], 'bulk-scan-faces' => [ - 'description' => '%d foto’s gevonden die nog niet zijn gescand voor gezichtsherkenning.

Vereist dat de AI Vision-service actief is.', + 'description' => '%d foto’s gevonden die nog niet zijn gescand voor gezichtsherkenning.
Vereist dat de AI Vision-service actief is.', ], 'run-clustering' => [ 'description' => 'Start gezichtsclustering in de AI Vision-service. Groepeert gedetecteerde gezichten op gelijkenis zodat u ze aan personen kunt toewijzen.', diff --git a/lang/no/maintenance.php b/lang/no/maintenance.php index cda39d0529c..45063238953 100644 --- a/lang/no/maintenance.php +++ b/lang/no/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Gamle Ordre', - 'description' => 'Fant %d gamle bestillinger.

En gammel bestilling er eldre enn 14 dager, har ingen tilknyttet bruker, og venter enten fortsatt på betaling eller har ingen varer i seg.', + 'description' => 'Fant %d gamle bestillinger.
En gammel bestilling er eldre enn 14 dager, har ingen tilknyttet bruker, og venter enten fortsatt på betaling eller har ingen varer i seg.', 'button' => 'Slett gamle bestillinger', ], 'fulfill-orders' => [ 'title' => 'Bestillinger å fullføre', - 'description' => 'Fant %d bestillinger med innhold som ikke er gjort tilgjengelig.

Klikk på knappen for å tilordne innhold der det er mulig.', + 'description' => 'Fant %d bestillinger med innhold som ikke er gjort tilgjengelig.
Klikk på knappen for å tilordne innhold der det er mulig.', 'button' => 'Fullfør bestillinger', ], 'fulfill-precompute' => [ 'title' => 'Forhåndsberegnede albumfelt', - 'description' => 'Fant %d album med manglende forhåndsberegnede felt.

Tilsvarer å kjøre: php artisan lychee:recompute-album-fields', + 'description' => 'Fant %d album med manglende forhåndsberegnede felt.
Tilsvarer å kjøre: php artisan lychee:recompute-album-stats', 'button' => 'Beregn felt', ], 'flush-queue' => [ 'title' => 'Tøm kø', - 'description' => 'Fant %d ventende jobber i køen.

ADVARSEL: Tømming av køen vil permanent slette alle ventende jobber. Dette kan ikke angres.', + 'description' => 'Fant %d ventende jobber i køen.
ADVARSEL: Tømming av køen vil permanent slette alle ventende jobber. Dette kan ikke angres.', 'button' => 'Tøm kø', ], 'backfill-album-sizes' => [ 'title' => 'Albumstørrelsesstatistikk', - 'description' => 'Fant %d album uten størrelsesstatistikk.

Tilsvarer å kjøre: php artisan lychee:recompute-album-sizes', + 'description' => 'Fant %d album uten størrelsesstatistikk.
Tilsvarer å kjøre: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Beregner størrelsesstatistikken for alle album på nytt i bakgrunnen.
Tilsvarer å kjøre: php artisan lychee:recompute-album-sizes', 'button' => 'Beregn størrelser', ], + 'recompute-buckets' => [ + 'title' => 'Tidslinjegrupper', + 'description' => 'Beregner tidslinjegruppen for hvert album og hvert bilde på nytt, og oppdaterer deretter album- og bildelistene.
Tilsvarer kommandoen: php artisan lychee:recompute-buckets', + 'button' => 'Beregn på nytt', + ], 'face_quality' => [ 'title' => 'Gjennomgang av ansiktskvalitet', @@ -130,7 +136,7 @@ 'selected_count' => ':count valgt', ], 'bulk-scan-faces' => [ - 'description' => 'Fant %d bilder som ennå ikke er skannet for ansiktsgjenkjenning.

Krever at AI Vision-tjenesten kjører.', + 'description' => 'Fant %d bilder som ennå ikke er skannet for ansiktsgjenkjenning.
Krever at AI Vision-tjenesten kjører.', ], 'run-clustering' => [ 'description' => 'Utløs ansiktsklynging i AI Vision-tjenesten. Grupperer oppdagede ansikter etter likhet, slik at du kan tilordne dem til personer.', diff --git a/lang/pl/maintenance.php b/lang/pl/maintenance.php index 35ab1a6bad1..ddc3cda62ad 100644 --- a/lang/pl/maintenance.php +++ b/lang/pl/maintenance.php @@ -72,29 +72,35 @@ ], 'old-orders' => [ 'title' => 'Stare zamówienia', - 'description' => 'Znaleziono stare zamówienia: %d.

Stare zamówienie to zamówienie starsze niż 14 dni, bez przypisanego użytkownika, które nadal oczekuje na płatność lub nie zawiera żadnych pozycji.', + 'description' => 'Znaleziono stare zamówienia: %d.
Stare zamówienie to zamówienie starsze niż 14 dni, bez przypisanego użytkownika, które nadal oczekuje na płatność lub nie zawiera żadnych pozycji.', 'button' => 'Usuń stare zamówienia', ], 'fulfill-orders' => [ 'title' => 'Zamówienia do realizacji', - 'description' => 'Znaleziono zamówienia z treścią, która nie została jeszcze udostępniona: %d.

Kliknij przycisk, aby przypisać treść tam, gdzie to możliwe.', + 'description' => 'Znaleziono zamówienia z treścią, która nie została jeszcze udostępniona: %d.
Kliknij przycisk, aby przypisać treść tam, gdzie to możliwe.', 'button' => 'Zrealizuj zamówienia', ], 'fulfill-precompute' => [ 'title' => 'Wstępnie obliczone pola albumów', - 'description' => 'Znaleziono albumy z brakującymi wstępnie obliczonymi polami: %d.

Odpowiednik uruchomienia: php artisan lychee:recompute-album-fields', + 'description' => 'Znaleziono albumy z brakującymi wstępnie obliczonymi polami: %d.
Odpowiednik uruchomienia: php artisan lychee:recompute-album-stats', 'button' => 'Oblicz pola', ], 'flush-queue' => [ 'title' => 'Opróżnij kolejkę', - 'description' => 'Znaleziono oczekujące zadania w kolejce: %d.

UWAGA: Opróżnienie kolejki trwale usunie wszystkie oczekujące zadania. Tej operacji nie można cofnąć.', + 'description' => 'Znaleziono oczekujące zadania w kolejce: %d.
UWAGA: Opróżnienie kolejki trwale usunie wszystkie oczekujące zadania. Tej operacji nie można cofnąć.', 'button' => 'Wyczyść kolejkę', ], 'backfill-album-sizes' => [ 'title' => 'Statystyki rozmiarów albumów', - 'description' => 'Znaleziono albumy bez statystyk rozmiaru: %d.

Odpowiednik uruchomienia: php artisan lychee:recompute-album-sizes', + 'description' => 'Znaleziono albumy bez statystyk rozmiaru: %d.
Odpowiednik uruchomienia: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Przelicza w tle statystyki rozmiaru wszystkich albumów.
Odpowiednik uruchomienia: php artisan lychee:recompute-album-sizes', 'button' => 'Oblicz rozmiary', ], + 'recompute-buckets' => [ + 'title' => 'Grupy osi czasu', + 'description' => 'Przelicza grupę osi czasu każdego albumu i każdego zdjęcia, a następnie odświeża listy albumów i zdjęć.
Odpowiada poleceniu: php artisan lychee:recompute-buckets', + 'button' => 'Przelicz', + ], 'face_quality' => [ 'title' => 'Przegląd jakości twarzy', @@ -131,7 +137,7 @@ 'selected_count' => 'Zaznaczono: :count', ], 'bulk-scan-faces' => [ - 'description' => 'Znaleziono zdjęcia, które nie zostały jeszcze przeskanowane pod kątem rozpoznawania twarzy: %d.

Wymaga uruchomionej usługi AI Vision.', + 'description' => 'Znaleziono zdjęcia, które nie zostały jeszcze przeskanowane pod kątem rozpoznawania twarzy: %d.
Wymaga uruchomionej usługi AI Vision.', ], 'run-clustering' => [ 'description' => 'Uruchom grupowanie twarzy w usłudze AI Vision. Grupuje wykryte twarze według podobieństwa, aby można było przypisać je do osób.', diff --git a/lang/pt/maintenance.php b/lang/pt/maintenance.php index 6dd89460636..70a9dd1232e 100644 --- a/lang/pt/maintenance.php +++ b/lang/pt/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Encomendas antigas', - 'description' => 'Encontradas %d encomendas antigas.

Uma encomenda antiga tem mais de 14 dias, não tem utilizador associado e está ainda a aguardar pagamento ou não contém artigos.', + 'description' => 'Encontradas %d encomendas antigas.
Uma encomenda antiga tem mais de 14 dias, não tem utilizador associado e está ainda a aguardar pagamento ou não contém artigos.', 'button' => 'Eliminar encomendas antigas', ], 'fulfill-orders' => [ 'title' => 'Encomendas por concluir', - 'description' => 'Encontradas %d encomendas com conteúdo que ainda não foi disponibilizado.

Clique no botão para atribuir o conteúdo quando possível.', + 'description' => 'Encontradas %d encomendas com conteúdo que ainda não foi disponibilizado.
Clique no botão para atribuir o conteúdo quando possível.', 'button' => 'Concluir encomendas', ], 'fulfill-precompute' => [ 'title' => 'Campos pré-calculados dos álbuns', - 'description' => 'Encontrados %d álbuns com campos pré-calculados em falta.

Equivalente a executar: php artisan lychee:recompute-album-fields', + 'description' => 'Encontrados %d álbuns com campos pré-calculados em falta.
Equivalente a executar: php artisan lychee:recompute-album-stats', 'button' => 'Calcular campos', ], 'flush-queue' => [ 'title' => 'Esvaziar fila', - 'description' => 'Encontradas %d tarefas pendentes na fila.

ATENÇÃO: esvaziar a fila elimina permanentemente todas as tarefas pendentes. Esta ação não pode ser anulada.', + 'description' => 'Encontradas %d tarefas pendentes na fila.
ATENÇÃO: esvaziar a fila elimina permanentemente todas as tarefas pendentes. Esta ação não pode ser anulada.', 'button' => 'Esvaziar fila', ], 'backfill-album-sizes' => [ 'title' => 'Estatísticas de tamanho dos álbuns', - 'description' => 'Encontrados %d álbuns sem estatísticas de tamanho.

Equivalente a executar: php artisan lychee:recompute-album-sizes', + 'description' => 'Encontrados %d álbuns sem estatísticas de tamanho.
Equivalente a executar: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Recalcula em segundo plano as estatísticas de tamanho de todos os álbuns.
Equivalente a executar: php artisan lychee:recompute-album-sizes', 'button' => 'Calcular tamanhos', ], + 'recompute-buckets' => [ + 'title' => 'Grupos da linha do tempo', + 'description' => 'Recalcula o grupo da linha do tempo de cada álbum e de cada foto e depois atualiza as listagens de álbuns e fotos.
Equivale a executar: php artisan lychee:recompute-buckets', + 'button' => 'Recalcular', + ], 'face_quality' => [ 'title' => 'Revisão da qualidade dos rostos', @@ -130,7 +136,7 @@ 'selected_count' => ':count selecionado(s)', ], 'bulk-scan-faces' => [ - 'description' => 'Encontradas %d fotos que ainda não foram analisadas para reconhecimento facial.

Requer que o serviço AI Vision esteja em execução.', + 'description' => 'Encontradas %d fotos que ainda não foram analisadas para reconhecimento facial.
Requer que o serviço AI Vision esteja em execução.', ], 'run-clustering' => [ 'description' => 'Iniciar o agrupamento de rostos no serviço AI Vision. Agrupa os rostos detetados por semelhança para que os possa atribuir a pessoas.', diff --git a/lang/ru/maintenance.php b/lang/ru/maintenance.php index ac540671fee..e4b1bc34e02 100644 --- a/lang/ru/maintenance.php +++ b/lang/ru/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Старые заказы', - 'description' => 'Найдено старых заказов: %d.

Старый заказ — это заказ старше 14 дней, не связанный с пользователем и либо всё ещё ожидающий оплаты, либо не содержащий товаров.', + 'description' => 'Найдено старых заказов: %d.
Старый заказ — это заказ старше 14 дней, не связанный с пользователем и либо всё ещё ожидающий оплаты, либо не содержащий товаров.', 'button' => 'Удалить старые заказы', ], 'fulfill-orders' => [ 'title' => 'Заказы к выполнению', - 'description' => 'Найдено заказов с недоступным содержимым: %d.

Нажмите кнопку, чтобы назначить содержимое, когда это возможно.', + 'description' => 'Найдено заказов с недоступным содержимым: %d.
Нажмите кнопку, чтобы назначить содержимое, когда это возможно.', 'button' => 'Выполнить заказы', ], 'fulfill-precompute' => [ 'title' => 'Предвычисленные поля альбомов', - 'description' => 'Найдено альбомов с отсутствующими предвычисленными полями: %d.

Эквивалентно запуску: php artisan lychee:recompute-album-fields', + 'description' => 'Найдено альбомов с отсутствующими предвычисленными полями: %d.
Эквивалентно запуску: php artisan lychee:recompute-album-stats', 'button' => 'Вычислить поля', ], 'flush-queue' => [ 'title' => 'Очистка очереди', - 'description' => 'Найдено ожидающих задач в очереди: %d.

ВНИМАНИЕ: очистка очереди безвозвратно удалит все ожидающие задачи. Это действие нельзя отменить.', + 'description' => 'Найдено ожидающих задач в очереди: %d.
ВНИМАНИЕ: очистка очереди безвозвратно удалит все ожидающие задачи. Это действие нельзя отменить.', 'button' => 'Очистить очередь', ], 'backfill-album-sizes' => [ 'title' => 'Статистика размеров альбомов', - 'description' => 'Найдено альбомов без статистики размеров: %d.

Эквивалентно запуску: php artisan lychee:recompute-album-sizes', + 'description' => 'Найдено альбомов без статистики размеров: %d.
Эквивалентно запуску: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Пересчитывает в фоновом режиме статистику размера всех альбомов.
Эквивалентно запуску: php artisan lychee:recompute-album-sizes', 'button' => 'Вычислить размеры', ], + 'recompute-buckets' => [ + 'title' => 'Группы временной шкалы', + 'description' => 'Пересчитывает группу временной шкалы для каждого альбома и каждой фотографии, затем обновляет списки альбомов и фотографий.
Эквивалентно команде: php artisan lychee:recompute-buckets', + 'button' => 'Пересчитать', + ], 'face_quality' => [ 'title' => 'Проверка качества лиц', @@ -130,7 +136,7 @@ 'selected_count' => 'Выбрано: :count', ], 'bulk-scan-faces' => [ - 'description' => 'Найдено фотографий, ещё не просканированных для распознавания лиц: %d.

Требуется запущенный сервис AI Vision.', + 'description' => 'Найдено фотографий, ещё не просканированных для распознавания лиц: %d.
Требуется запущенный сервис AI Vision.', ], 'run-clustering' => [ 'description' => 'Запустить кластеризацию лиц в сервисе AI Vision. Группирует обнаруженные лица по сходству, чтобы вы могли назначить их людям.', diff --git a/lang/sk/maintenance.php b/lang/sk/maintenance.php index b953a9eab48..26dd617d7ed 100644 --- a/lang/sk/maintenance.php +++ b/lang/sk/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Staré objednávky', - 'description' => 'Nájdených %d starých objednávok.

Stará objednávka je staršia ako 14 dní, nemá priradeného používateľa a buď stále čaká na platbu, alebo neobsahuje žiadne položky.', + 'description' => 'Nájdených %d starých objednávok.
Stará objednávka je staršia ako 14 dní, nemá priradeného používateľa a buď stále čaká na platbu, alebo neobsahuje žiadne položky.', 'button' => 'Odstrániť staré objednávky', ], 'fulfill-orders' => [ 'title' => 'Objednávky na vybavenie', - 'description' => 'Nájdených %d objednávok s obsahom, ktorý ešte nebol sprístupnený.

Kliknutím na tlačidlo priradíte obsah, ak je to možné.', + 'description' => 'Nájdených %d objednávok s obsahom, ktorý ešte nebol sprístupnený.
Kliknutím na tlačidlo priradíte obsah, ak je to možné.', 'button' => 'Vybaviť objednávky', ], 'fulfill-precompute' => [ 'title' => 'Predpočítané polia albumov', - 'description' => 'Nájdených %d albumov s chýbajúcimi predpočítanými poliami.

Ekvivalent spustenia: php artisan lychee:recompute-album-fields', + 'description' => 'Nájdených %d albumov s chýbajúcimi predpočítanými poliami.
Ekvivalent spustenia: php artisan lychee:recompute-album-stats', 'button' => 'Vypočítať polia', ], 'flush-queue' => [ 'title' => 'Vyprázdniť frontu', - 'description' => 'Nájdených %d čakajúcich úloh vo fronte.

POZOR: Vyprázdnenie fronty natrvalo odstráni všetky čakajúce úlohy. Túto akciu nie je možné vrátiť späť.', + 'description' => 'Nájdených %d čakajúcich úloh vo fronte.
POZOR: Vyprázdnenie fronty natrvalo odstráni všetky čakajúce úlohy. Túto akciu nie je možné vrátiť späť.', 'button' => 'Vyprázdniť frontu', ], 'backfill-album-sizes' => [ 'title' => 'Štatistiky veľkosti albumov', - 'description' => 'Nájdených %d albumov bez štatistík veľkosti.

Ekvivalent spustenia: php artisan lychee:recompute-album-sizes', + 'description' => 'Nájdených %d albumov bez štatistík veľkosti.
Ekvivalent spustenia: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Prepočíta na pozadí štatistiky veľkosti všetkých albumov.
Ekvivalent spustenia: php artisan lychee:recompute-album-sizes', 'button' => 'Vypočítať veľkosti', ], + 'recompute-buckets' => [ + 'title' => 'Skupiny časovej osi', + 'description' => 'Prepočíta skupinu časovej osi každého albumu a každej fotografie a potom obnoví zoznamy albumov a fotografií.
Zodpovedá príkazu: php artisan lychee:recompute-buckets', + 'button' => 'Prepočítať', + ], 'face_quality' => [ 'title' => 'Kontrola kvality tvárí', @@ -130,7 +136,7 @@ 'selected_count' => 'Vybrané: :count', ], 'bulk-scan-faces' => [ - 'description' => 'Nájdených %d fotografií, ktoré ešte neboli skenované na rozpoznávanie tvárí.

Vyžaduje spustenú službu AI Vision.', + 'description' => 'Nájdených %d fotografií, ktoré ešte neboli skenované na rozpoznávanie tvárí.
Vyžaduje spustenú službu AI Vision.', ], 'run-clustering' => [ 'description' => 'Spustí zhlukovanie tvárí v službe AI Vision. Zoskupí rozpoznané tváre podľa podobnosti, aby ste ich mohli priradiť osobám.', diff --git a/lang/sv/maintenance.php b/lang/sv/maintenance.php index 2128cfb3560..6a4947e7ae7 100644 --- a/lang/sv/maintenance.php +++ b/lang/sv/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Gamla beställningar', - 'description' => 'Hittade %d gamla beställningar.

En gammal beställning är äldre än 14 dagar, saknar kopplad användare och väntar antingen fortfarande på betalning eller innehåller inga artiklar.', + 'description' => 'Hittade %d gamla beställningar.
En gammal beställning är äldre än 14 dagar, saknar kopplad användare och väntar antingen fortfarande på betalning eller innehåller inga artiklar.', 'button' => 'Radera gamla beställningar', ], 'fulfill-orders' => [ 'title' => 'Beställningar att leverera', - 'description' => 'Hittade %d beställningar med innehåll som inte har gjorts tillgängligt.

Klicka på knappen för att tilldela innehåll där det är möjligt.', + 'description' => 'Hittade %d beställningar med innehåll som inte har gjorts tillgängligt.
Klicka på knappen för att tilldela innehåll där det är möjligt.', 'button' => 'Leverera beställningar', ], 'fulfill-precompute' => [ 'title' => 'Förberäknade albumfält', - 'description' => 'Hittade %d album med saknade förberäknade fält.

Motsvarar att köra: php artisan lychee:recompute-album-fields', + 'description' => 'Hittade %d album med saknade förberäknade fält.
Motsvarar att köra: php artisan lychee:recompute-album-stats', 'button' => 'Beräkna fält', ], 'flush-queue' => [ 'title' => 'Töm kö', - 'description' => 'Hittade %d väntande jobb i kön.

VARNING: Om kön töms raderas alla väntande jobb permanent. Detta kan inte ångras.', + 'description' => 'Hittade %d väntande jobb i kön.
VARNING: Om kön töms raderas alla väntande jobb permanent. Detta kan inte ångras.', 'button' => 'Töm kö', ], 'backfill-album-sizes' => [ 'title' => 'Statistik över albumstorlek', - 'description' => 'Hittade %d album utan storleksstatistik.

Motsvarar att köra: php artisan lychee:recompute-album-sizes', + 'description' => 'Hittade %d album utan storleksstatistik.
Motsvarar att köra: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Beräknar om storleksstatistiken för alla album i bakgrunden.
Motsvarar att köra: php artisan lychee:recompute-album-sizes', 'button' => 'Beräkna storlekar', ], + 'recompute-buckets' => [ + 'title' => 'Tidslinjegrupper', + 'description' => 'Beräknar om tidslinjegruppen för varje album och varje foto och uppdaterar sedan album- och fotolistorna.
Motsvarar kommandot: php artisan lychee:recompute-buckets', + 'button' => 'Beräkna om', + ], 'face_quality' => [ 'title' => 'Granskning av ansiktskvalitet', @@ -130,7 +136,7 @@ 'selected_count' => ':count markerade', ], 'bulk-scan-faces' => [ - 'description' => 'Hittade %d foton som ännu inte har skannats för ansiktsigenkänning.

Kräver att AI Vision-tjänsten körs.', + 'description' => 'Hittade %d foton som ännu inte har skannats för ansiktsigenkänning.
Kräver att AI Vision-tjänsten körs.', ], 'run-clustering' => [ 'description' => 'Starta ansiktsklustring i AI Vision-tjänsten. Grupperar upptäckta ansikten efter likhet så att du kan tilldela dem till personer.', diff --git a/lang/tr/maintenance.php b/lang/tr/maintenance.php index b847edc48b0..d3d08f24b7f 100644 --- a/lang/tr/maintenance.php +++ b/lang/tr/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Eski Siparişler', - 'description' => '%d eski sipariş bulundu.

Eski sipariş; 14 günden eski olan, ilişkili bir kullanıcısı bulunmayan ve hâlâ ödeme bekleyen ya da hiç ürün içermeyen sipariştir.', + 'description' => '%d eski sipariş bulundu.
Eski sipariş; 14 günden eski olan, ilişkili bir kullanıcısı bulunmayan ve hâlâ ödeme bekleyen ya da hiç ürün içermeyen sipariştir.', 'button' => 'Eski siparişleri sil', ], 'fulfill-orders' => [ 'title' => 'Tamamlanacak siparişler', - 'description' => 'İçeriği henüz kullanıma sunulmamış %d sipariş bulundu.

Mümkün olduğunda içerik atamak için düğmeye tıklayın.', + 'description' => 'İçeriği henüz kullanıma sunulmamış %d sipariş bulundu.
Mümkün olduğunda içerik atamak için düğmeye tıklayın.', 'button' => 'Siparişleri tamamla', ], 'fulfill-precompute' => [ 'title' => 'Albümün Önceden Hesaplanan Alanları', - 'description' => 'Önceden hesaplanan alanları eksik %d albüm bulundu.

Şunu çalıştırmaya eşdeğerdir: php artisan lychee:recompute-album-fields', + 'description' => 'Önceden hesaplanan alanları eksik %d albüm bulundu.
Şunu çalıştırmaya eşdeğerdir: php artisan lychee:recompute-album-stats', 'button' => 'Alanları hesapla', ], 'flush-queue' => [ 'title' => 'Kuyruğu Temizle', - 'description' => 'Kuyrukta bekleyen %d iş bulundu.

DİKKAT: Kuyruğu temizlemek bekleyen tüm işleri kalıcı olarak siler. Bu işlem geri alınamaz.', + 'description' => 'Kuyrukta bekleyen %d iş bulundu.
DİKKAT: Kuyruğu temizlemek bekleyen tüm işleri kalıcı olarak siler. Bu işlem geri alınamaz.', 'button' => 'Kuyruğu temizle', ], 'backfill-album-sizes' => [ 'title' => 'Albüm Boyutu İstatistikleri', - 'description' => 'Boyut istatistikleri olmayan %d albüm bulundu.

Şunu çalıştırmaya eşdeğerdir: php artisan lychee:recompute-album-sizes', + 'description' => 'Boyut istatistikleri olmayan %d albüm bulundu.
Şunu çalıştırmaya eşdeğerdir: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Tüm albümlerin boyut istatistiklerini arka planda yeniden hesaplar.
Şunu çalıştırmaya eşdeğerdir: php artisan lychee:recompute-album-sizes', 'button' => 'Boyutları hesapla', ], + 'recompute-buckets' => [ + 'title' => 'Zaman çizelgesi grupları', + 'description' => 'Her albümün ve her fotoğrafın zaman çizelgesi grubunu yeniden hesaplar, ardından albüm ve fotoğraf listelerini yeniler.
Şu komuta eşdeğerdir: php artisan lychee:recompute-buckets', + 'button' => 'Yeniden hesapla', + ], 'face_quality' => [ 'title' => 'Yüz Kalitesi İncelemesi', @@ -130,7 +136,7 @@ 'selected_count' => ':count seçildi', ], 'bulk-scan-faces' => [ - 'description' => 'Henüz yüz tanıma için taranmamış %d fotoğraf bulundu.

AI Vision hizmetinin çalışıyor olması gerekir.', + 'description' => 'Henüz yüz tanıma için taranmamış %d fotoğraf bulundu.
AI Vision hizmetinin çalışıyor olması gerekir.', ], 'run-clustering' => [ 'description' => 'AI Vision hizmetinde yüz kümelemeyi başlatın. Algılanan yüzleri benzerliğe göre gruplar, böylece onları kişilere atayabilirsiniz.', diff --git a/lang/vi/maintenance.php b/lang/vi/maintenance.php index 9c42d0d72ba..5143878e4fa 100644 --- a/lang/vi/maintenance.php +++ b/lang/vi/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => 'Đơn hàng cũ', - 'description' => 'Tìm thấy %d đơn hàng cũ.

Đơn hàng cũ là đơn hàng đã quá 14 ngày, không gắn với người dùng nào và vẫn đang chờ thanh toán hoặc không có mặt hàng nào.', + 'description' => 'Tìm thấy %d đơn hàng cũ.
Đơn hàng cũ là đơn hàng đã quá 14 ngày, không gắn với người dùng nào và vẫn đang chờ thanh toán hoặc không có mặt hàng nào.', 'button' => 'Xóa đơn hàng cũ', ], 'fulfill-orders' => [ 'title' => 'Đơn hàng cần hoàn tất', - 'description' => 'Tìm thấy %d đơn hàng có nội dung chưa được cung cấp.

Nhấn nút để gán nội dung khi có thể.', + 'description' => 'Tìm thấy %d đơn hàng có nội dung chưa được cung cấp.
Nhấn nút để gán nội dung khi có thể.', 'button' => 'Hoàn tất đơn hàng', ], 'fulfill-precompute' => [ 'title' => 'Trường tính trước của album', - 'description' => 'Tìm thấy %d album thiếu trường tính trước.

Tương đương với việc chạy: php artisan lychee:recompute-album-fields', + 'description' => 'Tìm thấy %d album thiếu trường tính trước.
Tương đương với việc chạy: php artisan lychee:recompute-album-stats', 'button' => 'Tính các trường', ], 'flush-queue' => [ 'title' => 'Xóa hàng đợi', - 'description' => 'Tìm thấy %d tác vụ đang chờ trong hàng đợi.

CẢNH BÁO: Xóa hàng đợi sẽ xóa vĩnh viễn tất cả tác vụ đang chờ. Không thể hoàn tác thao tác này.', + 'description' => 'Tìm thấy %d tác vụ đang chờ trong hàng đợi.
CẢNH BÁO: Xóa hàng đợi sẽ xóa vĩnh viễn tất cả tác vụ đang chờ. Không thể hoàn tác thao tác này.', 'button' => 'Xóa hàng đợi', ], 'backfill-album-sizes' => [ 'title' => 'Thống kê dung lượng album', - 'description' => 'Tìm thấy %d album chưa có thống kê dung lượng.

Tương đương với việc chạy: php artisan lychee:recompute-album-sizes', + 'description' => 'Tìm thấy %d album chưa có thống kê dung lượng.
Tương đương với việc chạy: php artisan lychee:recompute-album-sizes', + 'description_queue' => 'Tính lại thống kê dung lượng của mọi album ở chế độ nền.
Tương đương với việc chạy: php artisan lychee:recompute-album-sizes', 'button' => 'Tính dung lượng', ], + 'recompute-buckets' => [ + 'title' => 'Nhóm dòng thời gian', + 'description' => 'Tính lại nhóm dòng thời gian của mọi album và mọi ảnh, sau đó làm mới danh sách album và ảnh.
Tương đương với lệnh: php artisan lychee:recompute-buckets', + 'button' => 'Tính lại', + ], 'face_quality' => [ 'title' => 'Đánh giá chất lượng khuôn mặt', @@ -130,7 +136,7 @@ 'selected_count' => 'Đã chọn :count', ], 'bulk-scan-faces' => [ - 'description' => 'Tìm thấy %d ảnh chưa được quét nhận diện khuôn mặt.

Yêu cầu dịch vụ AI Vision đang chạy.', + 'description' => 'Tìm thấy %d ảnh chưa được quét nhận diện khuôn mặt.
Yêu cầu dịch vụ AI Vision đang chạy.', ], 'run-clustering' => [ 'description' => 'Kích hoạt phân cụm khuôn mặt trong dịch vụ AI Vision. Nhóm các khuôn mặt được phát hiện theo độ tương đồng để bạn có thể gán chúng cho từng người.', diff --git a/lang/zh_CN/maintenance.php b/lang/zh_CN/maintenance.php index c89a72f89c1..d78613a3ee2 100644 --- a/lang/zh_CN/maintenance.php +++ b/lang/zh_CN/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => '旧订单', - 'description' => '发现 %d 个旧订单。

旧订单是指超过 14 天、没有关联用户,且仍在等待付款或不包含任何商品的订单。', + 'description' => '发现 %d 个旧订单。
旧订单是指超过 14 天、没有关联用户,且仍在等待付款或不包含任何商品的订单。', 'button' => '删除旧订单', ], 'fulfill-orders' => [ 'title' => '待履行订单', - 'description' => '发现 %d 个订单的内容尚未交付。

点击按钮以在可能时分配内容。', + 'description' => '发现 %d 个订单的内容尚未交付。
点击按钮以在可能时分配内容。', 'button' => '履行订单', ], 'fulfill-precompute' => [ 'title' => '相册预计算字段', - 'description' => '发现 %d 个相册缺少预计算字段。

等同于运行:php artisan lychee:recompute-album-fields', + 'description' => '发现 %d 个相册缺少预计算字段。
等同于运行:php artisan lychee:recompute-album-stats', 'button' => '计算字段', ], 'flush-queue' => [ 'title' => '清空队列', - 'description' => '队列中发现 %d 个待处理任务。

注意:清空队列将永久删除所有待处理任务。此操作无法撤销。', + 'description' => '队列中发现 %d 个待处理任务。
注意:清空队列将永久删除所有待处理任务。此操作无法撤销。', 'button' => '清空队列', ], 'backfill-album-sizes' => [ 'title' => '相册大小统计', - 'description' => '发现 %d 个相册没有大小统计数据。

等同于运行:php artisan lychee:recompute-album-sizes', + 'description' => '发现 %d 个相册没有大小统计数据。
等同于运行:php artisan lychee:recompute-album-sizes', + 'description_queue' => '在后台重新计算所有相册的大小统计。
等同于运行:php artisan lychee:recompute-album-sizes', 'button' => '计算大小', ], + 'recompute-buckets' => [ + 'title' => '时间线分组', + 'description' => '重新计算每个相册和每张照片的时间线分组,然后刷新相册和照片列表。
等同于运行:php artisan lychee:recompute-buckets', + 'button' => '重新计算', + ], 'face_quality' => [ 'title' => '人脸质量审核', @@ -130,7 +136,7 @@ 'selected_count' => '已选择 :count 项', ], 'bulk-scan-faces' => [ - 'description' => '发现 %d 张照片尚未进行人脸识别扫描。

需要 AI Vision 服务正在运行。', + 'description' => '发现 %d 张照片尚未进行人脸识别扫描。
需要 AI Vision 服务正在运行。', ], 'run-clustering' => [ 'description' => '在 AI Vision 服务中触发人脸聚类。按相似度对检测到的人脸进行分组,以便您将其分配给人物。', diff --git a/lang/zh_TW/maintenance.php b/lang/zh_TW/maintenance.php index 7913a8b4209..818fc95c4b5 100644 --- a/lang/zh_TW/maintenance.php +++ b/lang/zh_TW/maintenance.php @@ -71,29 +71,35 @@ ], 'old-orders' => [ 'title' => '舊訂單', - 'description' => '找到 %d 筆舊訂單。

舊訂單是指超過 14 天、沒有關聯使用者,且仍在等待付款或不含任何項目的訂單。', + 'description' => '找到 %d 筆舊訂單。
舊訂單是指超過 14 天、沒有關聯使用者,且仍在等待付款或不含任何項目的訂單。', 'button' => '刪除舊訂單', ], 'fulfill-orders' => [ 'title' => '待履行訂單', - 'description' => '找到 %d 筆內容尚未提供的訂單。

點擊按鈕即可在可行時指派內容。', + 'description' => '找到 %d 筆內容尚未提供的訂單。
點擊按鈕即可在可行時指派內容。', 'button' => '履行訂單', ], 'fulfill-precompute' => [ 'title' => '相簿預先計算欄位', - 'description' => '找到 %d 個缺少預先計算欄位的相簿。

等同於執行:php artisan lychee:recompute-album-fields', + 'description' => '找到 %d 個缺少預先計算欄位的相簿。
等同於執行:php artisan lychee:recompute-album-stats', 'button' => '計算欄位', ], 'flush-queue' => [ 'title' => '清空佇列', - 'description' => '佇列中有 %d 個待處理工作。

注意:清空佇列將永久刪除所有待處理工作,且無法復原。', + 'description' => '佇列中有 %d 個待處理工作。
注意:清空佇列將永久刪除所有待處理工作,且無法復原。', 'button' => '清空佇列', ], 'backfill-album-sizes' => [ 'title' => '相簿大小統計', - 'description' => '找到 %d 個沒有大小統計的相簿。

等同於執行:php artisan lychee:recompute-album-sizes', + 'description' => '找到 %d 個沒有大小統計的相簿。
等同於執行:php artisan lychee:recompute-album-sizes', + 'description_queue' => '在背景重新計算所有相簿的大小統計。
等同於執行:php artisan lychee:recompute-album-sizes', 'button' => '計算大小', ], + 'recompute-buckets' => [ + 'title' => '時間軸分組', + 'description' => '重新計算每個相簿和每張相片的時間軸分組,然後重新整理相簿和相片清單。
等同於執行:php artisan lychee:recompute-buckets', + 'button' => '重新計算', + ], 'face_quality' => [ 'title' => '臉孔品質審查', @@ -130,7 +136,7 @@ 'selected_count' => '已選取 :count 個', ], 'bulk-scan-faces' => [ - 'description' => '找到 %d 張尚未進行臉部辨識掃描的照片。

需要 AI Vision 服務正在執行。', + 'description' => '找到 %d 張尚未進行臉部辨識掃描的照片。
需要 AI Vision 服務正在執行。', ], 'run-clustering' => [ 'description' => '在 AI Vision 服務中啟動臉孔分群。依相似度將偵測到的臉孔分組,方便您將其指派給人物。', diff --git a/resources/js/services/maintenance-service.ts b/resources/js/services/maintenance-service.ts index bae8e944f3b..ba92118915b 100644 --- a/resources/js/services/maintenance-service.ts +++ b/resources/js/services/maintenance-service.ts @@ -128,6 +128,9 @@ const MaintenanceService = { backfillAlbumSizesDo(): Promise { return axios.post(`${Constants.getApiUrl()}Maintenance::backfillAlbumSizes`, {}); }, + recomputeBucketsDo(): Promise { + return axios.post(`${Constants.getApiUrl()}Maintenance::recomputeBuckets`, {}); + }, bulkScanFacesCheck(): Promise> { return axios.get(`${Constants.getApiUrl()}Maintenance::bulkScanFaces`, { data: {} }); }, diff --git a/resources/js/v7/components/maintenance/MaintenanceBackfillAlbumSizes.vue b/resources/js/v7/components/maintenance/MaintenanceBackfillAlbumSizes.vue index c2fa6c9024b..b24697e4de4 100644 --- a/resources/js/v7/components/maintenance/MaintenanceBackfillAlbumSizes.vue +++ b/resources/js/v7/components/maintenance/MaintenanceBackfillAlbumSizes.vue @@ -40,8 +40,9 @@ const loading = ref(false); const toast = useToast(); const description = computed(() => { + // -1: queued mode, every album is recomputed, there is no count to show. if (data.value === -1) { - return ""; + return trans("maintenance.backfill-album-sizes.description_queue"); } return sprintf(trans("maintenance.backfill-album-sizes.description"), data.value); }); diff --git a/resources/js/v7/components/maintenance/MaintenanceRecomputeBuckets.vue b/resources/js/v7/components/maintenance/MaintenanceRecomputeBuckets.vue new file mode 100644 index 00000000000..e523de106ff --- /dev/null +++ b/resources/js/v7/components/maintenance/MaintenanceRecomputeBuckets.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/resources/js/v7/views/admin/Maintenance.vue b/resources/js/v7/views/admin/Maintenance.vue index 97826d2d44f..ae67fcb829d 100644 --- a/resources/js/v7/views/admin/Maintenance.vue +++ b/resources/js/v7/views/admin/Maintenance.vue @@ -31,6 +31,7 @@ + @@ -65,6 +66,7 @@ import MaintenanceOldOrders from "@/v7/components/maintenance/MaintenanceOldOrde import MaintenanceFulfillOrders from "@/v7/components/maintenance/MaintenanceFulfillOrders.vue"; import MaintenanceFulfillPrecompute from "@/v7/components/maintenance/MaintenanceFulfillPrecompute.vue"; import MaintenanceBackfillAlbumSizes from "@/v7/components/maintenance/MaintenanceBackfillAlbumSizes.vue"; +import MaintenanceRecomputeBuckets from "@/v7/components/maintenance/MaintenanceRecomputeBuckets.vue"; import MaintenanceFlushQueue from "@/v7/components/maintenance/MaintenanceFlushQueue.vue"; import MaintenanceBulkScanFaces from "@/v7/components/maintenance/MaintenanceBulkScanFaces.vue"; import MaintenanceBulkScanNsfw from "@/v7/components/maintenance/MaintenanceBulkScanNsfw.vue"; diff --git a/resources/js/v8/components/maintenance/MaintenanceBackfillAlbumSizes.vue b/resources/js/v8/components/maintenance/MaintenanceBackfillAlbumSizes.vue index 3fd6a893984..587c2c45e37 100644 --- a/resources/js/v8/components/maintenance/MaintenanceBackfillAlbumSizes.vue +++ b/resources/js/v8/components/maintenance/MaintenanceBackfillAlbumSizes.vue @@ -25,8 +25,9 @@ const loading = ref(false); const toast = useAppToast(); const description = computed(() => { + // -1: queued mode, every album is recomputed, there is no count to show. if (data.value === -1) { - return ""; + return trans("maintenance.backfill-album-sizes.description_queue"); } return sprintf(trans("maintenance.backfill-album-sizes.description"), data.value); }); diff --git a/resources/js/v8/components/maintenance/MaintenanceRecomputeBuckets.vue b/resources/js/v8/components/maintenance/MaintenanceRecomputeBuckets.vue new file mode 100644 index 00000000000..fc4d93416bc --- /dev/null +++ b/resources/js/v8/components/maintenance/MaintenanceRecomputeBuckets.vue @@ -0,0 +1,37 @@ + + + diff --git a/resources/js/v8/components/maintenance/MaintenanceRow.vue b/resources/js/v8/components/maintenance/MaintenanceRow.vue index 18154a1acb2..ff2a8766caa 100644 --- a/resources/js/v8/components/maintenance/MaintenanceRow.vue +++ b/resources/js/v8/components/maintenance/MaintenanceRow.vue @@ -1,7 +1,7 @@