Compare commits

..

34 Commits

Author SHA1 Message Date
Alex The Bot
4027cba4eb Version v1.98.2 2024-03-11 14:17:12 +00:00
Mert
5bd597f14b fix(server): external library sync not working for large libraries (#7759) 2024-03-10 22:30:57 -04:00
Ghazi Tounsi
49d9051879 fix(mobile): archive desc sorting (#7822)
desc sort
2024-03-10 21:15:34 -05:00
DeclanE
e5978981f3 Fix: Disable 'As profile picture' option for videos in context menu a… (#7830)
* Fix: Disable 'As profile picture' option for videos in context menu asset-viewer-nav-bar.svelte

This commit modifies the context menu behavior to disable the "As profile picture" option when interacting with video assets. Previously, the option was available for all asset types, including videos, which could lead to confusion when this displayed an error.

With this change, the "As profile picture" option is conditionally rendered based on the asset type. If the asset is a video, the option is not displayed in the context menu.

This adjustment enhances the web experience by preventing users from attempting to set a video as their profile picture, which is not supported by the system.

Fixes: #7724

* Switched to check if photo instead of video
2024-03-10 18:32:27 -04:00
Sam Holton
d257cdcbbf feat(web): add sticky date headers for asset-date-group (#7824)
* feat(web): add sticky date headers for asset-date-group

* use existing classes
2024-03-10 15:32:05 -04:00
Daniel Dietzler
60c521101a chore(server): type checks for e2e (#7800)
type checks for e2e
2024-03-09 23:18:25 +00:00
Daniel Dietzler
11e7533a4d chore(server): user e2e: wait for user delete event (#7799)
* wait for user delete event

* fix update event names

* add test for hard deletion of user
2024-03-10 00:10:24 +01:00
Daniel Dietzler
ec8fb0be83 chore(server): remove unused storage repository variable from microservices app service (#7797)
remove unused storage repository from microservices app service
2024-03-09 16:06:31 -05:00
Alex
a6cd4b8427 chore(server): openapi (#7794)
* chore(server): openapi

* openapi
2024-03-09 14:01:52 -06:00
renovate[bot]
3bdd2612ce chore(deps): update typescript-eslint monorepo to v7.1.1 (#7790)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-09 13:33:11 -05:00
Jason Rasmussen
30b0b2474e refactor: asset e2e (#7769) 2024-03-09 12:51:58 -05:00
martin
8eb9dad989 fix: update e2e (#7710)
* fix: update e2e

* update package.json

* fix: version
2024-03-08 23:16:36 -05:00
Fynn Petersen-Frey
3f1d37e556 feat(server): hardware HDR tonemapping for RKMPP (#7655)
* feat(server): hardware HDR tonemapping for RKMPP

* review feedback
2024-03-08 21:17:26 -05:00
Ben McCann
ba55e867e0 perf: precompress and cache assets (#7757)
* perf: precompress and cache assets

* fix cache header

* use startswith

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
2024-03-08 21:15:38 -05:00
Alex
4fdb0835c9 chore: post release tasks 2024-03-08 19:08:33 -06:00
Alex The Bot
430561d692 Version v1.98.1 2024-03-08 23:44:13 +00:00
Alex
e8fb529026 fix(server): getAllAssets doesn't return all assets (#7752)
* fix(server): getAllAssets doesn't return all assets

* try reverting

* fix: archive and remove unused method

* update sql

* remove unused code

* linting
2024-03-08 17:16:32 -06:00
Sam Holton
7a4ae7d142 feat(server,web): add force delete to immediately remove user (#7681)
* feat(server,web): add force delete to immediately remove user

* update wording on force delete confirmation

* fix force delete css

* PR feedback

* cleanup user service delete for force

* adding user status column

* some cleanup and tests

* more test fixes

* run npm run sql:generate

* chore: cleanup and websocket

* chore: linting

* userRepository.restore

* removed bad color class from delete-confirm-dialoge

* additional confirmation for user force delete

* shorten confirmation message

---------

Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
2024-03-08 17:49:39 -05:00
Andrew Roberts
9cb0a1ffbf fix(web): modal password reset modal in dark mode (#7748)
* Fixed dark mode password reset success

* Fixed prettier issue
2024-03-08 14:05:15 -05:00
Michel Heusschen
fa32c6660c fix(web): album state after removing assets (#7745)
* fix(web): album state after removing assets

* refresh album on remove + simplify AlbumSummary
2024-03-08 14:03:37 -05:00
DeclanE
fe8c6b17a6 chore: rename "Library" to "External Library" in system settings (#7744)
* Change "Library" > "External Library" under system settings

This is intended to assist with any confusion regarding standard libraries

* Changed key from "library" to "external-library"

* Updated "Encode Clip" to "Smart Search"
2024-03-08 16:49:44 +00:00
Jason Rasmussen
89f6190fb0 refactor: search e2e (#7732) 2024-03-08 11:20:54 -05:00
Michel Heusschen
ffdd504008 refactor(web): admin and user signup forms (#7739) 2024-03-08 08:45:41 -05:00
dependabot[bot]
46597aac97 chore(deps): bump docker/build-push-action from 5.1.0 to 5.2.0 (#7737)
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5.1.0 to 5.2.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v5.1.0...v5.2.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-08 08:41:39 -05:00
mmomjian
9b27a09131 docs: Update DB queries (#7730) 2024-03-07 23:28:51 -05:00
Jason Rasmussen
a50f125dd1 refactor: api validators (boolean and date) (#7709)
* refactor: api validators (boolean and date)

* chore: open api

* revert: time bucket change
2024-03-07 22:59:02 -05:00
Alex
753842745d Localizely: Translations update (#7715)
chore(mobile): translation update
2024-03-07 20:56:05 -06:00
martyfuhry
21caa06fa2 fix(mobile): Fixes large and small image cache (#7726)
Fixes large and small image cache
2024-03-07 20:55:50 -06:00
aviv926
7a7475ed67 docs: Update External Libraries Guide (#7723) 2024-03-07 18:49:30 -05:00
Sam Holton
dbb6a8dc2a fix(server): remove shared links during user delete (#7696)
* fix(server): remove shared links during user delete

* add delete cascade for shared links
2024-03-07 17:21:23 -05:00
Jonathan Jogenfors
a5a27594b8 docs: admin-only library settings (#7716)
* document admin-only library settings

* renew library guide
2024-03-07 21:27:02 +00:00
Jason Rasmussen
661409bac7 feat(server): create a person with optional values (#7706)
* feat: create person dto

* chore: open api

* fix: e2e

* fix: web usage
2024-03-07 15:34:57 -05:00
Jonathan Jogenfors
f1a8e385e9 deps(server): CVE-2024-28176 (#7717)
bumpety bump
2024-03-07 15:34:10 -05:00
renovate[bot]
a623556762 chore(deps): update dependency @playwright/test to v1.42.1 (#7684)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-07 15:31:45 -05:00
219 changed files with 4017 additions and 4119 deletions

View File

@@ -87,7 +87,7 @@ jobs:
type=raw,value=latest,enable=${{ github.event_name == 'workflow_dispatch' }}
- name: Build and push image
uses: docker/build-push-action@v5.1.0
uses: docker/build-push-action@v5.2.0
with:
file: cli/Dockerfile
platforms: linux/amd64,linux/arm64

View File

@@ -121,7 +121,7 @@ jobs:
fi
- name: Build and push image
uses: docker/build-push-action@v5.1.0
uses: docker/build-push-action@v5.2.0
with:
context: ${{ matrix.context }}
file: ${{ matrix.file }}

View File

@@ -10,23 +10,6 @@ concurrency:
cancel-in-progress: true
jobs:
server-e2e-api:
name: Server (e2e-api)
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./server
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Run npm install
run: npm ci
- name: Run e2e tests
run: npm run e2e:api
server-e2e-jobs:
name: Server (e2e-jobs)
runs-on: ubuntu-latest
@@ -213,6 +196,10 @@ jobs:
run: npm run format
if: ${{ !cancelled() }}
- name: Run tsc
run: npm run check
if: ${{ !cancelled() }}
- name: Install Playwright Browsers
run: npx playwright install --with-deps chromium
if: ${{ !cancelled() }}

View File

@@ -19,9 +19,6 @@ pull-stage:
server-e2e-jobs:
docker compose -f ./server/e2e/docker-compose.server-e2e.yml up --renew-anon-volumes --abort-on-container-exit --exit-code-from immich-server --remove-orphans --build
server-e2e-api:
npm run e2e:api --prefix server
.PHONY: e2e
e2e:
docker compose -f ./e2e/docker-compose.yml up --build -V --remove-orphans

2
cli/package-lock.json generated
View File

@@ -46,7 +46,7 @@
},
"../open-api/typescript-sdk": {
"name": "@immich/sdk",
"version": "1.98.0",
"version": "1.98.2",
"dev": true,
"license": "GNU Affero General Public License version 3",
"devDependencies": {

View File

@@ -66,8 +66,8 @@ class Asset {
assetData: new File([await fs.openAsBlob(this.path)], basename(this.path)),
deviceAssetId: this.deviceAssetId,
deviceId: 'CLI',
fileCreatedAt: this.fileCreatedAt,
fileModifiedAt: this.fileModifiedAt,
fileCreatedAt: this.fileCreatedAt.toISOString(),
fileModifiedAt: this.fileModifiedAt.toISOString(),
isFavorite: String(false),
};
const formData = new FormData();

View File

@@ -1,9 +1,9 @@
version: "3.8"
# Configurations for hardware-accelerated transcoding
# Configurations for hardware-accelerated transcoding
# If using Unraid or another platform that doesn't allow multiple Compose files,
# you can inline the config for a backend by copying its contents
# you can inline the config for a backend by copying its contents
# into the immich-microservices service in the docker-compose.yml file.
# See https://immich.app/docs/features/hardware-transcoding for more info on using hardware transcoding.
@@ -38,6 +38,10 @@ services:
- /dev/dri:/dev/dri
- /dev/dma_heap:/dev/dma_heap
- /dev/mpp_service:/dev/mpp_service
#- /dev/mali0:/dev/mali0 # only required to enable OpenCL-accelerated HDR -> SDR tonemapping
volumes:
#- /etc/OpenCL:/etc/OpenCL:ro # only required to enable OpenCL-accelerated HDR -> SDR tonemapping
#- /usr/lib/aarch64-linux-gnu/libmali.so.1:/usr/lib/aarch64-linux-gnu/libmali.so.1:ro # only required to enable OpenCL-accelerated HDR -> SDR tonemapping
vaapi:
devices:

View File

@@ -42,6 +42,18 @@ You do not need to redo any transcoding jobs after enabling hardware acceleratio
- If you have an 11th gen CPU or older, then you may need to follow [these][jellyfin-lp] instructions as Low-Power mode is required
- Additionally, if the server specifically has an 11th gen CPU and is running kernel 5.15 (shipped with Ubuntu 22.04 LTS), then you will need to upgrade this kernel (from [Jellyfin docs][jellyfin-kernel-bug])
#### RKMPP
For RKMPP to work:
- You must have a supported Rockchip ARM SoC.
- Only RK3588 supports hardware tonemapping, other SoCs use slower software tonemapping while still using hardware encoding.
- Tonemapping requires `/usr/lib/aarch64-linux-gnu/libmali.so.1` to be present on your host system. Install [`libmali-valhall-g610-g6p0-gbm`][libmali-rockchip] and modify the [`hwaccel.transcoding.yml`][hw-file] file:
- under `rkmpp` uncomment the 3 lines required for OpenCL tonemapping by removing the `#` symbol at the beginning of each line
- `- /dev/mali0:/dev/mali0`
- `- /etc/OpenCL:/etc/OpenCL:ro`
- `- /usr/lib/aarch64-linux-gnu/libmali.so.1:/usr/lib/aarch64-linux-gnu/libmali.so.1:ro`
## Setup
#### Basic Setup
@@ -106,3 +118,4 @@ Once this is done, you can continue to step 3 of "Basic Setup".
[nvcr]: https://github.com/NVIDIA/nvidia-container-runtime/
[jellyfin-lp]: https://jellyfin.org/docs/general/administration/hardware-acceleration/intel/#configure-and-verify-lp-mode-on-linux
[jellyfin-kernel-bug]: https://jellyfin.org/docs/general/administration/hardware-acceleration/intel/#known-issues-and-limitations
[libmali-rockchip]: https://github.com/tsukumijima/libmali-rockchip/releases

View File

@@ -38,7 +38,7 @@ Note: Either a manual or scheduled library scan must have been performed to iden
In all above scan methods, Immich will check if any files are missing. This can happen if files are deleted, or if they are on a storage location that is currently unavailable, like a network drive that is not mounted, or a USB drive that has been unplugged. In order to prevent accidental deletion of assets, Immich will not immediately delete an asset from the library if the file is missing. Instead, the asset will be internally marked as offline and will still be visible in the main timeline. If the file is moved back to its original location and the library is scanned again, the asset will be restored.
Finally, files can be deleted from Immich via the `Remove Offline Files` job. This job can be found by the three dots menu for the associated external storage that was configured under user account settings > libraries (the same location described at [create external libraries](#create-external-libraries)). When this job is run, any assets marked as offline will then be removed from Immich. Run this job whenever files have been deleted from the file system and you want to remove them from Immich.
Finally, files can be deleted from Immich via the `Remove Offline Files` job. This job can be found by the three dots menu for the associated external storage that was configured under Administration > Libraries (the same location described at [create external libraries](#create-external-libraries)). When this job is run, any assets marked as offline will then be removed from Immich. Run this job whenever files have been deleted from the file system and you want to remove them from Immich.
### Import Paths
@@ -50,8 +50,6 @@ If the import paths are edited in a way that an external file is no longer in an
Sometimes, an external library will not scan correctly. This can happen if immich_server or immich_microservices can't access the files. Here are some things to check:
- Is the external path set correctly? Each import path must be contained in the external path.
- Make sure the external path does not contain spaces
- In the docker-compose file, are the volumes mounted correctly?
- Are the volumes identical between the `server` and `microservices` container?
- Are the import paths set correctly, and do they match the path set in docker-compose file?
@@ -61,18 +59,6 @@ Sometimes, an external library will not scan correctly. This can happen if immic
To validate that Immich can reach your external library, start a shell inside the container. Run `docker exec -it immich_microservices /bin/bash` to a bash shell. If your import path is `/data/import/photos`, check it with `ls /data/import/photos`. Do the same check for the `immich_server` container. If you cannot access this directory in both the `microservices` and `server` containers, Immich won't be able to import files.
### Security Considerations
:::caution
Please read and understand this section before setting external paths, as there are important security considerations.
:::
For security purposes, each Immich user is disallowed to add external files by default. This is to prevent devastating [path traversal attacks](https://owasp.org/www-community/attacks/Path_Traversal). An admin can allow individual users to use external path feature via the `external path` setting found in the admin panel. Without the external path restriction, a user can add any image or video file on the Immich host filesystem to be imported into Immich, potentially allowing sensitive data to be accessed. If you are running Immich as root in your Docker setup (which is the default), all external file reads are done with root privileges. This is particularly dangerous if the Immich host is a shared server.
With the `external path` set, a user is restricted to accessing external files to files or directories within that path. The Immich admin should still be careful not set the external path too generously. For example, `user1` wants to read their photos in to `/home/user1`. A lazy admin sets that user's external path to `/home/` since it "gets the job done". However, that user will then be able to read all photos in `/home/user2/private-photos`, too! Please set the external path as specific as possible. If multiple folders must be added, do this using the docker volume mount feature described below.
### Exclusion Patterns
By default, all files in the import paths will be added to the library. If there are files that should not be added, exclusion patterns can be used to exclude them. Exclusion patterns are glob patterns are matched against the full file path. If a file matches an exclusion pattern, it will not be added to the library. Exclusion patterns can be added in the Scan Settings page for each library. Under the hood, Immich uses the [glob](https://www.npmjs.com/package/glob) package to match patterns, so please refer to [their documentation](https://github.com/isaacs/node-glob#glob-primer) to see what patterns are supported.
@@ -145,27 +131,13 @@ The `ro` flag at the end only gives read-only access to the volumes. While Immic
_Remember to bring the container `docker compose down/up` to register the changes. Make sure you can see the mounted path in the container._
:::
### Set External Path
Only an admin can do this.
- Navigate to `Administration > Users` page on the web.
- Click on the user edit button.
- Set `/mnt/media` to be the external path. This folder will only contain the three folders that we want to import, so nothing else can be accessed.
:::note
Spaces in the internal path aren't currently supported.
You must import it as:
`..:/mnt/media/my-media:ro`
instead of
`..:/mnt/media/my media:ro`
:::
### Create External Libraries
- Click on your user name in the top right corner -> Account Settings
- Click on Libraries
These actions must be performed by the Immich administrator.
- Click on Administration -> Libraries
- Click on Create External Library
- Select which user owns the library, this can not be changed later
- Click the drop-down menu on the newly created library
- Click on Rename Library and rename it to "Christmas Trip"
- Click Edit Import Paths
@@ -176,7 +148,7 @@ NOTE: We have to use the `/mnt/media/christmas-trip` path and not the `/mnt/nas/
Next, we'll add an exclusion pattern to filter out raw files.
- Click the drop-down menu on the newly christmas library
- Click the drop-down menu on the newly-created Christmas library
- Click on Manage
- Click on Scan Settings
- Click on Add Exclusion Pattern

View File

@@ -13,7 +13,7 @@ Run `docker exec -it immich_postgres psql immich <DB_USERNAME>` to connect to th
## Assets
:::note
The `"originalFileName"` column is the name of the uploaded file _without_ the extension.
The `"originalFileName"` column is the name of the file at time of upload, including the extension.
:::
```sql title="Find by original filename"
@@ -40,6 +40,10 @@ SELECT * FROM "assets" where "livePhotoVideoId" IS NOT NULL;
SELECT "assets".* FROM "exif" LEFT JOIN "assets" ON "assets"."id" = "exif"."assetId" WHERE "exif"."assetId" IS NULL;
```
```sql title="size < 100,000 bytes, smallest to largest"
SELECT * FROM "assets" JOIN "exif" ON "assets"."id" = "exif"."assetId" WHERE "exif"."fileSizeInByte" < 100000 ORDER BY "exif"."fileSizeInByte" ASC;
```
```sql title="Without thumbnails"
SELECT * FROM "assets" WHERE "assets"."resizePath" IS NULL OR "assets"."webpPath" IS NULL;
```

View File

@@ -28,6 +28,10 @@ On my computer, for example, I use this path:
EXTERNAL_PATH=/home/tenino/photos
```
:::info EXTERNAL_PATH design
The design choice to put the EXTERNAL_PATH into .env rather than put two copies of the absolute path in the yml file in order to make everything easier, so if you have two copies of the same path that have to be kept in sync, then someday later when you move the data, update only one of the paths, without everything will break mysteriously.
:::
Restart Immich.
```
@@ -35,47 +39,26 @@ docker compose down
docker compose up -d
```
# Set the External Path
# Create the library
In the Immich web UI:
- click the **Administration** link in the upper right corner.
<img src={require('./img/administration-link.png').default} width="50%" title="Administration link" />
- Select the **Users** tab
<img src={require('./img/users-tab.png').default} width="50%" title="Users tab" />
- Select the **External Libraries** tab
<img src={require('./img/external-libraries.png').default} width="50%" title="External Libraries tab" />
- Select the **pencil** next to your user ID
<img src={require('./img/pencil.png').default} width="50%" title="Pencil" />
- Click the **Create Library** button
<img src={require('./img/create-external-library.png').default} width="50%" title="Create Library button" />
- Fill in the **External Path** field with `/usr/src/app/external`
<img src={require('./img/external-path.png').default} width="50%" title="External Path field" />
Notice this matches the path _inside the container_ where we mounted your photos.
The purpose of the external path field is for administrators who have multiple users
on their Immich instance. It lets you prevent other authorized users from
navigating to your external library.
# Import the library
In the Immich web UI:
- Click your user avatar in the upper-right corner (circle with your initials)
<img src={require('./img/user-avatar.png').default} width="50%" title="User avatar" />
- Click **Account Settings**
<img src={require('./img/account-settings.png').default} width="50%" title="Account Settings button" />
- Click to expand **Libraries**
<img src={require('./img/libraries-dropdown.png').default} width="50%" title="Libraries dropdown" />
- Click the **Create External Library** button
<img src={require('./img/create-external-library-button.png').default} width="50%" title="Create External Library button" />
- In the dialog, select which user should own the new library
<img src={require('./img/library-owner.png').default} width="50%" title="Library owner diaglog" />
- Click the three-dots menu and select **Edit Import Paths**
<img src={require('./img/edit-import-paths.png').default} width="50%" title="Edit Import Paths menu option" />
- Click \*_Add path_
- Click Add path
<img src={require('./img/add-path-button.png').default} width="50%" title="Add Path button" />
- Enter **/usr/src/app/external** as the path and click Add

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

112
e2e/package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "immich-e2e",
"version": "1.0.0",
"version": "1.98.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "immich-e2e",
"version": "1.0.0",
"version": "1.98.2",
"license": "GNU Affero General Public License version 3",
"devDependencies": {
"@immich/cli": "file:../cli",
@@ -79,7 +79,7 @@
},
"../open-api/typescript-sdk": {
"name": "@immich/sdk",
"version": "1.98.0",
"version": "1.98.2",
"dev": true,
"license": "GNU Affero General Public License version 3",
"devDependencies": {
@@ -923,12 +923,12 @@
}
},
"node_modules/@playwright/test": {
"version": "1.42.0",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.42.0.tgz",
"integrity": "sha512-2k1HzC28Fs+HiwbJOQDUwrWMttqSLUVdjCqitBOjdCD0svWOMQUVqrXX6iFD7POps6xXAojsX/dGBpKnjZctLA==",
"version": "1.42.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.42.1.tgz",
"integrity": "sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==",
"dev": true,
"dependencies": {
"playwright": "1.42.0"
"playwright": "1.42.1"
},
"bin": {
"playwright": "cli.js"
@@ -1274,16 +1274,16 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz",
"integrity": "sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz",
"integrity": "sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==",
"dev": true,
"dependencies": {
"@eslint-community/regexpp": "^4.5.1",
"@typescript-eslint/scope-manager": "7.1.0",
"@typescript-eslint/type-utils": "7.1.0",
"@typescript-eslint/utils": "7.1.0",
"@typescript-eslint/visitor-keys": "7.1.0",
"@typescript-eslint/scope-manager": "7.1.1",
"@typescript-eslint/type-utils": "7.1.1",
"@typescript-eslint/utils": "7.1.1",
"@typescript-eslint/visitor-keys": "7.1.1",
"debug": "^4.3.4",
"graphemer": "^1.4.0",
"ignore": "^5.2.4",
@@ -1309,15 +1309,15 @@
}
},
"node_modules/@typescript-eslint/parser": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz",
"integrity": "sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.1.tgz",
"integrity": "sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==",
"dev": true,
"dependencies": {
"@typescript-eslint/scope-manager": "7.1.0",
"@typescript-eslint/types": "7.1.0",
"@typescript-eslint/typescript-estree": "7.1.0",
"@typescript-eslint/visitor-keys": "7.1.0",
"@typescript-eslint/scope-manager": "7.1.1",
"@typescript-eslint/types": "7.1.1",
"@typescript-eslint/typescript-estree": "7.1.1",
"@typescript-eslint/visitor-keys": "7.1.1",
"debug": "^4.3.4"
},
"engines": {
@@ -1337,13 +1337,13 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz",
"integrity": "sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz",
"integrity": "sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "7.1.0",
"@typescript-eslint/visitor-keys": "7.1.0"
"@typescript-eslint/types": "7.1.1",
"@typescript-eslint/visitor-keys": "7.1.1"
},
"engines": {
"node": "^16.0.0 || >=18.0.0"
@@ -1354,13 +1354,13 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz",
"integrity": "sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz",
"integrity": "sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==",
"dev": true,
"dependencies": {
"@typescript-eslint/typescript-estree": "7.1.0",
"@typescript-eslint/utils": "7.1.0",
"@typescript-eslint/typescript-estree": "7.1.1",
"@typescript-eslint/utils": "7.1.1",
"debug": "^4.3.4",
"ts-api-utils": "^1.0.1"
},
@@ -1381,9 +1381,9 @@
}
},
"node_modules/@typescript-eslint/types": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.0.tgz",
"integrity": "sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz",
"integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==",
"dev": true,
"engines": {
"node": "^16.0.0 || >=18.0.0"
@@ -1394,13 +1394,13 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz",
"integrity": "sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz",
"integrity": "sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "7.1.0",
"@typescript-eslint/visitor-keys": "7.1.0",
"@typescript-eslint/types": "7.1.1",
"@typescript-eslint/visitor-keys": "7.1.1",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
@@ -1446,17 +1446,17 @@
}
},
"node_modules/@typescript-eslint/utils": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.0.tgz",
"integrity": "sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.1.tgz",
"integrity": "sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
"@types/json-schema": "^7.0.12",
"@types/semver": "^7.5.0",
"@typescript-eslint/scope-manager": "7.1.0",
"@typescript-eslint/types": "7.1.0",
"@typescript-eslint/typescript-estree": "7.1.0",
"@typescript-eslint/scope-manager": "7.1.1",
"@typescript-eslint/types": "7.1.1",
"@typescript-eslint/typescript-estree": "7.1.1",
"semver": "^7.5.4"
},
"engines": {
@@ -1471,12 +1471,12 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz",
"integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz",
"integrity": "sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "7.1.0",
"@typescript-eslint/types": "7.1.1",
"eslint-visitor-keys": "^3.4.1"
},
"engines": {
@@ -3869,12 +3869,12 @@
}
},
"node_modules/playwright": {
"version": "1.42.0",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.42.0.tgz",
"integrity": "sha512-Ko7YRUgj5xBHbntrgt4EIw/nE//XBHOKVKnBjO1KuZkmkhlbgyggTe5s9hjqQ1LpN+Xg+kHsQyt5Pa0Bw5XpvQ==",
"version": "1.42.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.42.1.tgz",
"integrity": "sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==",
"dev": true,
"dependencies": {
"playwright-core": "1.42.0"
"playwright-core": "1.42.1"
},
"bin": {
"playwright": "cli.js"
@@ -3887,9 +3887,9 @@
}
},
"node_modules/playwright-core": {
"version": "1.42.0",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.42.0.tgz",
"integrity": "sha512-0HD9y8qEVlcbsAjdpBaFjmaTHf+1FeIddy8VJLeiqwhcNqGCBe4Wp2e8knpqiYbzxtxarxiXyNDw2cG8sCaNMQ==",
"version": "1.42.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.42.1.tgz",
"integrity": "sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==",
"dev": true,
"bin": {
"playwright-core": "cli.js"

View File

@@ -1,6 +1,6 @@
{
"name": "immich-e2e",
"version": "1.0.0",
"version": "1.98.2",
"description": "",
"main": "index.js",
"type": "module",
@@ -12,7 +12,8 @@
"format": "prettier --check .",
"format:fix": "prettier --write .",
"lint": "eslint \"src/**/*.ts\" --max-warnings 0",
"lint:fix": "npm run lint -- --fix"
"lint:fix": "npm run lint -- --fix",
"check": "tsc --noEmit"
},
"keywords": [],
"author": "",

View File

@@ -92,7 +92,7 @@ describe('/album', () => {
}),
]);
await deleteUser({ id: user3.userId }, { headers: asBearerAuth(admin.accessToken) });
await deleteUser({ id: user3.userId, deleteUserDto: {} }, { headers: asBearerAuth(admin.accessToken) });
});
describe('GET /album', () => {

View File

@@ -2,20 +2,45 @@ import {
AssetFileUploadResponseDto,
AssetResponseDto,
AssetTypeEnum,
LibraryResponseDto,
LoginResponseDto,
SharedLinkType,
TimeBucketSize,
getAllLibraries,
getAssetInfo,
updateAssets,
} from '@immich/sdk';
import { exiftool } from 'exiftool-vendored';
import { DateTime } from 'luxon';
import { randomBytes } from 'node:crypto';
import { readFile, writeFile } from 'node:fs/promises';
import { basename, join } from 'node:path';
import { Socket } from 'socket.io-client';
import { createUserDto, uuidDto } from 'src/fixtures';
import { makeRandomImage } from 'src/generators';
import { errorDto } from 'src/responses';
import { app, tempDir, testAssetDir, utils } from 'src/utils';
import { app, asBearerAuth, tempDir, testAssetDir, utils } from 'src/utils';
import request from 'supertest';
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
const makeUploadDto = (options?: { omit: string }): Record<string, any> => {
const dto: Record<string, any> = {
deviceAssetId: 'example-image',
deviceId: 'TEST',
fileCreatedAt: new Date().toISOString(),
fileModifiedAt: new Date().toISOString(),
isFavorite: 'testing',
duration: '0:00:00.000000',
};
const omit = options?.omit;
if (omit) {
delete dto[omit];
}
return dto;
};
const TEN_TIMES = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
const locationAssetFilepath = `${testAssetDir}/metadata/gps-position/thompson-springs.jpg`;
@@ -35,34 +60,43 @@ const yesterday = today.minus({ days: 1 });
describe('/asset', () => {
let admin: LoginResponseDto;
let websocket: Socket;
let user1: LoginResponseDto;
let user2: LoginResponseDto;
let userStats: LoginResponseDto;
let timeBucketUser: LoginResponseDto;
let quotaUser: LoginResponseDto;
let statsUser: LoginResponseDto;
let stackUser: LoginResponseDto;
let user1Assets: AssetFileUploadResponseDto[];
let user2Assets: AssetFileUploadResponseDto[];
let assetLocation: AssetFileUploadResponseDto;
let ws: Socket;
let stackAssets: AssetFileUploadResponseDto[];
let locationAsset: AssetFileUploadResponseDto;
beforeAll(async () => {
await utils.resetDatabase();
admin = await utils.adminSetup({ onboarding: false });
[ws, user1, user2, userStats] = await Promise.all([
[websocket, user1, user2, statsUser, quotaUser, timeBucketUser, stackUser] = await Promise.all([
utils.connectWebsocket(admin.accessToken),
utils.userSetup(admin.accessToken, createUserDto.user1),
utils.userSetup(admin.accessToken, createUserDto.user2),
utils.userSetup(admin.accessToken, createUserDto.user3),
utils.userSetup(admin.accessToken, createUserDto.create('1')),
utils.userSetup(admin.accessToken, createUserDto.create('2')),
utils.userSetup(admin.accessToken, createUserDto.create('stats')),
utils.userSetup(admin.accessToken, createUserDto.userQuota),
utils.userSetup(admin.accessToken, createUserDto.create('time-bucket')),
utils.userSetup(admin.accessToken, createUserDto.create('stack')),
]);
// asset location
assetLocation = await utils.createAsset(admin.accessToken, {
locationAsset = await utils.createAsset(admin.accessToken, {
assetData: {
filename: 'thompson-springs.jpg',
bytes: await readFile(locationAssetFilepath),
},
});
await utils.waitForWebsocketEvent({ event: 'upload', assetId: assetLocation.id });
await utils.waitForWebsocketEvent({ event: 'assetUpload', id: locationAsset.id });
user1Assets = await Promise.all([
utils.createAsset(user1.accessToken),
@@ -80,22 +114,43 @@ describe('/asset', () => {
user2Assets = await Promise.all([utils.createAsset(user2.accessToken)]);
await Promise.all([
utils.createAsset(timeBucketUser.accessToken, { fileCreatedAt: new Date('1970-01-01').toISOString() }),
utils.createAsset(timeBucketUser.accessToken, { fileCreatedAt: new Date('1970-02-10').toISOString() }),
utils.createAsset(timeBucketUser.accessToken, { fileCreatedAt: new Date('1970-02-11').toISOString() }),
utils.createAsset(timeBucketUser.accessToken, { fileCreatedAt: new Date('1970-02-11').toISOString() }),
]);
for (const asset of [...user1Assets, ...user2Assets]) {
expect(asset.duplicate).toBe(false);
}
await Promise.all([
// stats
utils.createAsset(userStats.accessToken),
utils.createAsset(userStats.accessToken, { isFavorite: true }),
utils.createAsset(userStats.accessToken, { isArchived: true }),
utils.createAsset(userStats.accessToken, {
utils.createAsset(statsUser.accessToken),
utils.createAsset(statsUser.accessToken, { isFavorite: true }),
utils.createAsset(statsUser.accessToken, { isArchived: true }),
utils.createAsset(statsUser.accessToken, {
isArchived: true,
isFavorite: true,
assetData: { filename: 'example.mp4' },
}),
]);
// stacks
stackAssets = await Promise.all([
utils.createAsset(stackUser.accessToken),
utils.createAsset(stackUser.accessToken),
utils.createAsset(stackUser.accessToken),
utils.createAsset(stackUser.accessToken),
utils.createAsset(stackUser.accessToken),
]);
await updateAssets(
{ assetBulkUpdateDto: { stackParentId: stackAssets[0].id, ids: [stackAssets[1].id, stackAssets[2].id] } },
{ headers: asBearerAuth(stackUser.accessToken) },
);
const person1 = await utils.createPerson(user1.accessToken, {
name: 'Test Person',
});
@@ -106,7 +161,7 @@ describe('/asset', () => {
}, 30_000);
afterAll(() => {
utils.disconnectWebsocket(ws);
utils.disconnectWebsocket(websocket);
});
describe('GET /asset/:id', () => {
@@ -193,7 +248,7 @@ describe('/asset', () => {
it('should return stats of all assets', async () => {
const { status, body } = await request(app)
.get('/asset/statistics')
.set('Authorization', `Bearer ${userStats.accessToken}`);
.set('Authorization', `Bearer ${statsUser.accessToken}`);
expect(body).toEqual({ images: 3, videos: 1, total: 4 });
expect(status).toBe(200);
@@ -202,7 +257,7 @@ describe('/asset', () => {
it('should return stats of all favored assets', async () => {
const { status, body } = await request(app)
.get('/asset/statistics')
.set('Authorization', `Bearer ${userStats.accessToken}`)
.set('Authorization', `Bearer ${statsUser.accessToken}`)
.query({ isFavorite: true });
expect(status).toBe(200);
@@ -212,7 +267,7 @@ describe('/asset', () => {
it('should return stats of all archived assets', async () => {
const { status, body } = await request(app)
.get('/asset/statistics')
.set('Authorization', `Bearer ${userStats.accessToken}`)
.set('Authorization', `Bearer ${statsUser.accessToken}`)
.query({ isArchived: true });
expect(status).toBe(200);
@@ -222,7 +277,7 @@ describe('/asset', () => {
it('should return stats of all favored and archived assets', async () => {
const { status, body } = await request(app)
.get('/asset/statistics')
.set('Authorization', `Bearer ${userStats.accessToken}`)
.set('Authorization', `Bearer ${statsUser.accessToken}`)
.query({ isFavorite: true, isArchived: true });
expect(status).toBe(200);
@@ -232,7 +287,7 @@ describe('/asset', () => {
it('should return stats of all assets neither favored nor archived', async () => {
const { status, body } = await request(app)
.get('/asset/statistics')
.set('Authorization', `Bearer ${userStats.accessToken}`)
.set('Authorization', `Bearer ${statsUser.accessToken}`)
.query({ isFavorite: false, isArchived: false });
expect(status).toBe(200);
@@ -488,6 +543,35 @@ describe('/asset', () => {
});
describe('POST /asset/upload', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post(`/asset/upload`);
expect(body).toEqual(errorDto.unauthorized);
expect(status).toBe(401);
});
const invalid = [
{ should: 'require `deviceAssetId`', dto: { ...makeUploadDto({ omit: 'deviceAssetId' }) } },
{ should: 'require `deviceId`', dto: { ...makeUploadDto({ omit: 'deviceId' }) } },
{ should: 'require `fileCreatedAt`', dto: { ...makeUploadDto({ omit: 'fileCreatedAt' }) } },
{ should: 'require `fileModifiedAt`', dto: { ...makeUploadDto({ omit: 'fileModifiedAt' }) } },
{ should: 'require `duration`', dto: { ...makeUploadDto({ omit: 'duration' }) } },
{ should: 'throw if `isFavorite` is not a boolean', dto: { ...makeUploadDto(), isFavorite: 'not-a-boolean' } },
{ should: 'throw if `isVisible` is not a boolean', dto: { ...makeUploadDto(), isVisible: 'not-a-boolean' } },
{ should: 'throw if `isArchived` is not a boolean', dto: { ...makeUploadDto(), isArchived: 'not-a-boolean' } },
];
for (const { should, dto } of invalid) {
it(`should ${should}`, async () => {
const { status, body } = await request(app)
.post('/asset/upload')
.set('Authorization', `Bearer ${user1.accessToken}`)
.attach('assetData', makeRandomImage(), 'example.png')
.field(dto);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest());
});
}
const tests = [
{
input: 'formats/jpg/el_torcal_rocks.jpg',
@@ -601,7 +685,7 @@ describe('/asset', () => {
];
for (const { input, expected } of tests) {
it(`should generate a thumbnail for ${input}`, async () => {
it(`should upload and generate a thumbnail for ${input}`, async () => {
const filepath = join(testAssetDir, input);
const { id, duplicate } = await utils.createAsset(admin.accessToken, {
assetData: { bytes: await readFile(filepath), filename: basename(filepath) },
@@ -609,7 +693,7 @@ describe('/asset', () => {
expect(duplicate).toBe(false);
await utils.waitForWebsocketEvent({ event: 'upload', assetId: id });
await utils.waitForWebsocketEvent({ event: 'assetUpload', id: id });
const asset = await utils.getAssetInfo(admin.accessToken, id);
@@ -631,6 +715,57 @@ describe('/asset', () => {
expect(duplicate).toBe(true);
});
it("should not upload to another user's library", async () => {
const libraries = await getAllLibraries({}, { headers: asBearerAuth(admin.accessToken) });
const library = libraries.find((library) => library.ownerId === user1.userId) as LibraryResponseDto;
const { body, status } = await request(app)
.post('/asset/upload')
.set('Authorization', `Bearer ${admin.accessToken}`)
.field('libraryId', library.id)
.field('deviceAssetId', 'example-image')
.field('deviceId', 'e2e')
.field('fileCreatedAt', new Date().toISOString())
.field('fileModifiedAt', new Date().toISOString())
.field('duration', '0:00:00.000000')
.attach('assetData', makeRandomImage(), 'example.png');
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest('Not found or no asset.upload access'));
});
it('should update the used quota', async () => {
const { body, status } = await request(app)
.post('/asset/upload')
.set('Authorization', `Bearer ${quotaUser.accessToken}`)
.field('deviceAssetId', 'example-image')
.field('deviceId', 'e2e')
.field('fileCreatedAt', new Date().toISOString())
.field('fileModifiedAt', new Date().toISOString())
.attach('assetData', makeRandomImage(), 'example.jpg');
expect(body).toEqual({ id: expect.any(String), duplicate: false });
expect(status).toBe(201);
const { body: user } = await request(app).get('/user/me').set('Authorization', `Bearer ${quotaUser.accessToken}`);
expect(user).toEqual(expect.objectContaining({ quotaUsageInBytes: 70 }));
});
it('should not upload an asset if it would exceed the quota', async () => {
const { body, status } = await request(app)
.post('/asset/upload')
.set('Authorization', `Bearer ${quotaUser.accessToken}`)
.field('deviceAssetId', 'example-image')
.field('deviceId', 'e2e')
.field('fileCreatedAt', new Date().toISOString())
.field('fileModifiedAt', new Date().toISOString())
.attach('assetData', randomBytes(2014), 'example.jpg');
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest('Quota has been exceeded!'));
});
// These hashes were created by copying the image files to a Samsung phone,
// exporting the video from Samsung's stock Gallery app, and hashing them locally.
// This ensures that immich+exiftool are extracting the videos the same way Samsung does.
@@ -660,7 +795,7 @@ describe('/asset', () => {
},
});
await utils.waitForWebsocketEvent({ event: 'upload', assetId: response.id });
await utils.waitForWebsocketEvent({ event: 'assetUpload', id: response.id });
expect(response.duplicate).toBe(false);
@@ -675,7 +810,7 @@ describe('/asset', () => {
describe('GET /asset/thumbnail/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/asset/thumbnail/${assetLocation.id}`);
const { status, body } = await request(app).get(`/asset/thumbnail/${locationAsset.id}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@@ -683,12 +818,12 @@ describe('/asset', () => {
it('should not include gps data for webp thumbnails', async () => {
const { status, body, type } = await request(app)
.get(`/asset/thumbnail/${assetLocation.id}?format=WEBP`)
.get(`/asset/thumbnail/${locationAsset.id}?format=WEBP`)
.set('Authorization', `Bearer ${admin.accessToken}`);
await utils.waitForWebsocketEvent({
event: 'upload',
assetId: assetLocation.id,
event: 'assetUpload',
id: locationAsset.id,
});
expect(status).toBe(200);
@@ -702,7 +837,7 @@ describe('/asset', () => {
it('should not include gps data for jpeg thumbnails', async () => {
const { status, body, type } = await request(app)
.get(`/asset/thumbnail/${assetLocation.id}?format=JPEG`)
.get(`/asset/thumbnail/${locationAsset.id}?format=JPEG`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
@@ -717,7 +852,7 @@ describe('/asset', () => {
describe('GET /asset/file/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get(`/asset/thumbnail/${assetLocation.id}`);
const { status, body } = await request(app).get(`/asset/thumbnail/${locationAsset.id}`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
@@ -725,14 +860,14 @@ describe('/asset', () => {
it('should download the original', async () => {
const { status, body, type } = await request(app)
.get(`/asset/file/${assetLocation.id}`)
.get(`/asset/file/${locationAsset.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toBeDefined();
expect(type).toBe('image/jpeg');
const asset = await utils.getAssetInfo(admin.accessToken, assetLocation.id);
const asset = await utils.getAssetInfo(admin.accessToken, locationAsset.id);
const original = await readFile(locationAssetFilepath);
const originalChecksum = utils.sha1(original);
@@ -742,4 +877,376 @@ describe('/asset', () => {
expect(downloadChecksum).toBe(asset.checksum);
});
});
describe('GET /asset/map-marker', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/asset/map-marker');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
// TODO archive one of these assets
it('should get map markers for all non-archived assets', async () => {
const { status, body } = await request(app)
.get('/asset/map-marker')
.query({ isArchived: false })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toHaveLength(2);
expect(body).toEqual([
{
city: 'Palisade',
country: 'United States of America',
id: expect.any(String),
lat: expect.closeTo(39.115),
lon: expect.closeTo(-108.400_968),
state: 'Mesa County, Colorado',
},
{
city: 'Ralston',
country: 'United States of America',
id: expect.any(String),
lat: expect.closeTo(41.2203),
lon: expect.closeTo(-96.071_625),
state: 'Douglas County, Nebraska',
},
]);
});
// TODO archive one of these assets
it('should get all map markers', async () => {
const { status, body } = await request(app)
.get('/asset/map-marker')
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual([
{
city: 'Palisade',
country: 'United States of America',
id: expect.any(String),
lat: expect.closeTo(39.115),
lon: expect.closeTo(-108.400_968),
state: 'Mesa County, Colorado',
},
{
city: 'Ralston',
country: 'United States of America',
id: expect.any(String),
lat: expect.closeTo(41.2203),
lon: expect.closeTo(-96.071_625),
state: 'Douglas County, Nebraska',
},
]);
});
});
describe('GET /asset/time-buckets', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/asset/time-buckets').query({ size: TimeBucketSize.Month });
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should get time buckets by month', async () => {
const { status, body } = await request(app)
.get('/asset/time-buckets')
.set('Authorization', `Bearer ${timeBucketUser.accessToken}`)
.query({ size: TimeBucketSize.Month });
expect(status).toBe(200);
expect(body).toEqual(
expect.arrayContaining([
{ count: 3, timeBucket: '1970-02-01T00:00:00.000Z' },
{ count: 1, timeBucket: '1970-01-01T00:00:00.000Z' },
]),
);
});
it('should not allow access for unrelated shared links', async () => {
const sharedLink = await utils.createSharedLink(user1.accessToken, {
type: SharedLinkType.Individual,
assetIds: user1Assets.map(({ id }) => id),
});
const { status, body } = await request(app)
.get('/asset/time-buckets')
.query({ key: sharedLink.key, size: TimeBucketSize.Month });
expect(status).toBe(400);
expect(body).toEqual(errorDto.noPermission);
});
it('should get time buckets by day', async () => {
const { status, body } = await request(app)
.get('/asset/time-buckets')
.set('Authorization', `Bearer ${timeBucketUser.accessToken}`)
.query({ size: TimeBucketSize.Day });
expect(status).toBe(200);
expect(body).toEqual([
{ count: 2, timeBucket: '1970-02-11T00:00:00.000Z' },
{ count: 1, timeBucket: '1970-02-10T00:00:00.000Z' },
{ count: 1, timeBucket: '1970-01-01T00:00:00.000Z' },
]);
});
});
describe('GET /asset/time-bucket', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/asset/time-bucket').query({
size: TimeBucketSize.Month,
timeBucket: '1900-01-01T00:00:00.000Z',
});
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should handle 5 digit years', async () => {
const { status, body } = await request(app)
.get('/asset/time-bucket')
.query({ size: TimeBucketSize.Month, timeBucket: '+012345-01-01T00:00:00.000Z' })
.set('Authorization', `Bearer ${timeBucketUser.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual([]);
});
// TODO enable date string validation while still accepting 5 digit years
// it('should fail if time bucket is invalid', async () => {
// const { status, body } = await request(app)
// .get('/asset/time-bucket')
// .set('Authorization', `Bearer ${user1.accessToken}`)
// .query({ size: TimeBucketSize.Month, timeBucket: 'foo' });
// expect(status).toBe(400);
// expect(body).toEqual(errorDto.badRequest);
// });
it('should return time bucket', async () => {
const { status, body } = await request(app)
.get('/asset/time-bucket')
.set('Authorization', `Bearer ${timeBucketUser.accessToken}`)
.query({ size: TimeBucketSize.Month, timeBucket: '1970-02-10T00:00:00.000Z' });
expect(status).toBe(200);
expect(body).toEqual([]);
});
it('should return error if time bucket is requested with partners asset and archived', async () => {
const req1 = await request(app)
.get('/asset/time-buckets')
.set('Authorization', `Bearer ${timeBucketUser.accessToken}`)
.query({ size: TimeBucketSize.Month, withPartners: true, isArchived: true });
expect(req1.status).toBe(400);
expect(req1.body).toEqual(errorDto.badRequest());
const req2 = await request(app)
.get('/asset/time-buckets')
.set('Authorization', `Bearer ${user1.accessToken}`)
.query({ size: TimeBucketSize.Month, withPartners: true, isArchived: undefined });
expect(req2.status).toBe(400);
expect(req2.body).toEqual(errorDto.badRequest());
});
it('should return error if time bucket is requested with partners asset and favorite', async () => {
const req1 = await request(app)
.get('/asset/time-buckets')
.set('Authorization', `Bearer ${timeBucketUser.accessToken}`)
.query({ size: TimeBucketSize.Month, withPartners: true, isFavorite: true });
expect(req1.status).toBe(400);
expect(req1.body).toEqual(errorDto.badRequest());
const req2 = await request(app)
.get('/asset/time-buckets')
.set('Authorization', `Bearer ${timeBucketUser.accessToken}`)
.query({ size: TimeBucketSize.Month, withPartners: true, isFavorite: false });
expect(req2.status).toBe(400);
expect(req2.body).toEqual(errorDto.badRequest());
});
it('should return error if time bucket is requested with partners asset and trash', async () => {
const req = await request(app)
.get('/asset/time-buckets')
.set('Authorization', `Bearer ${user1.accessToken}`)
.query({ size: TimeBucketSize.Month, withPartners: true, isTrashed: true });
expect(req.status).toBe(400);
expect(req.body).toEqual(errorDto.badRequest());
});
});
describe('GET /asset', () => {
it('should return stack data', async () => {
const { status, body } = await request(app).get('/asset').set('Authorization', `Bearer ${stackUser.accessToken}`);
const stack = body.find((asset: AssetResponseDto) => asset.id === stackAssets[0].id);
expect(status).toBe(200);
expect(stack).toEqual(
expect.objectContaining({
stackCount: 3,
stack:
// Response includes children at the root level
expect.arrayContaining([
expect.objectContaining({ id: stackAssets[1].id }),
expect.objectContaining({ id: stackAssets[2].id }),
]),
}),
);
});
});
describe('PUT /asset', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put('/asset');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require a valid parent id', async () => {
const { status, body } = await request(app)
.put('/asset')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ stackParentId: uuidDto.invalid, ids: [stackAssets[0].id] });
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(['stackParentId must be a UUID']));
});
it('should require access to the parent', async () => {
const { status, body } = await request(app)
.put('/asset')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ stackParentId: stackAssets[3].id, ids: [user1Assets[0].id] });
expect(status).toBe(400);
expect(body).toEqual(errorDto.noPermission);
});
it('should add stack children', async () => {
const { status } = await request(app)
.put('/asset')
.set('Authorization', `Bearer ${stackUser.accessToken}`)
.send({ stackParentId: stackAssets[0].id, ids: [stackAssets[3].id] });
expect(status).toBe(204);
const asset = await getAssetInfo({ id: stackAssets[0].id }, { headers: asBearerAuth(stackUser.accessToken) });
expect(asset.stack).not.toBeUndefined();
expect(asset.stack).toEqual(expect.arrayContaining([expect.objectContaining({ id: stackAssets[3].id })]));
});
it('should remove stack children', async () => {
const { status } = await request(app)
.put('/asset')
.set('Authorization', `Bearer ${stackUser.accessToken}`)
.send({ removeParent: true, ids: [stackAssets[1].id] });
expect(status).toBe(204);
const asset = await getAssetInfo({ id: stackAssets[0].id }, { headers: asBearerAuth(stackUser.accessToken) });
expect(asset.stack).not.toBeUndefined();
expect(asset.stack).toEqual(
expect.arrayContaining([
expect.objectContaining({ id: stackAssets[2].id }),
expect.objectContaining({ id: stackAssets[3].id }),
]),
);
});
it('should remove all stack children', async () => {
const { status } = await request(app)
.put('/asset')
.set('Authorization', `Bearer ${stackUser.accessToken}`)
.send({ removeParent: true, ids: [stackAssets[2].id, stackAssets[3].id] });
expect(status).toBe(204);
const asset = await getAssetInfo({ id: stackAssets[0].id }, { headers: asBearerAuth(stackUser.accessToken) });
expect(asset.stack).toBeUndefined();
});
it('should merge stack children', async () => {
// create stack after previous test removed stack children
await updateAssets(
{ assetBulkUpdateDto: { stackParentId: stackAssets[0].id, ids: [stackAssets[1].id, stackAssets[2].id] } },
{ headers: asBearerAuth(stackUser.accessToken) },
);
const { status } = await request(app)
.put('/asset')
.set('Authorization', `Bearer ${stackUser.accessToken}`)
.send({ stackParentId: stackAssets[3].id, ids: [stackAssets[0].id] });
expect(status).toBe(204);
const asset = await getAssetInfo({ id: stackAssets[3].id }, { headers: asBearerAuth(stackUser.accessToken) });
expect(asset.stack).not.toBeUndefined();
expect(asset.stack).toEqual(
expect.arrayContaining([
expect.objectContaining({ id: stackAssets[0].id }),
expect.objectContaining({ id: stackAssets[1].id }),
expect.objectContaining({ id: stackAssets[2].id }),
]),
);
});
});
describe('PUT /asset/stack/parent', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put('/asset/stack/parent');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should require a valid id', async () => {
const { status, body } = await request(app)
.put('/asset/stack/parent')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ oldParentId: uuidDto.invalid, newParentId: uuidDto.invalid });
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest());
});
it('should require access', async () => {
const { status, body } = await request(app)
.put('/asset/stack/parent')
.set('Authorization', `Bearer ${user1.accessToken}`)
.send({ oldParentId: stackAssets[3].id, newParentId: stackAssets[0].id });
expect(status).toBe(400);
expect(body).toEqual(errorDto.noPermission);
});
it('should make old parent child of new parent', async () => {
const { status } = await request(app)
.put('/asset/stack/parent')
.set('Authorization', `Bearer ${stackUser.accessToken}`)
.send({ oldParentId: stackAssets[3].id, newParentId: stackAssets[0].id });
expect(status).toBe(200);
const asset = await getAssetInfo({ id: stackAssets[0].id }, { headers: asBearerAuth(stackUser.accessToken) });
// new parent
expect(asset.stack).not.toBeUndefined();
expect(asset.stack).toEqual(
expect.arrayContaining([
expect.objectContaining({ id: stackAssets[1].id }),
expect.objectContaining({ id: stackAssets[2].id }),
expect.objectContaining({ id: stackAssets[3].id }),
]),
);
});
});
});

View File

@@ -5,7 +5,14 @@ import { app, utils } from 'src/utils';
import request from 'supertest';
import { beforeAll, beforeEach, describe, expect, it } from 'vitest';
describe('/activity', () => {
const invalidBirthday = [
{ birthDate: 'false', response: 'birthDate must be a date string' },
{ birthDate: '123567', response: 'birthDate must be a date string' },
{ birthDate: 123_567, response: 'birthDate must be a date string' },
{ birthDate: new Date(9999, 0, 0).toISOString(), response: ['Birth date cannot be in the future'] },
];
describe('/person', () => {
let admin: LoginResponseDto;
let visiblePerson: PersonResponseDto;
let hiddenPerson: PersonResponseDto;
@@ -14,10 +21,6 @@ describe('/activity', () => {
beforeAll(async () => {
await utils.resetDatabase();
admin = await utils.adminSetup();
});
beforeEach(async () => {
await utils.resetDatabase(['person']);
[visiblePerson, hiddenPerson, multipleAssetsPerson] = await Promise.all([
utils.createPerson(admin.accessToken, {
@@ -141,6 +144,41 @@ describe('/activity', () => {
});
});
describe('POST /person', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post(`/person`);
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
for (const { birthDate, response } of invalidBirthday) {
it(`should not accept an invalid birth date [${birthDate}]`, async () => {
const { status, body } = await request(app)
.post(`/person`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ birthDate });
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(response));
});
}
it('should create a person', async () => {
const { status, body } = await request(app)
.post(`/person`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({
name: 'New Person',
birthDate: '1990-01-01T05:00:00.000Z',
});
expect(status).toBe(201);
expect(body).toMatchObject({
id: expect.any(String),
name: 'New Person',
birthDate: '1990-01-01T05:00:00.000Z',
});
});
});
describe('PUT /person/:id', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).put(`/person/${uuidDto.notFound}`);
@@ -163,24 +201,16 @@ describe('/activity', () => {
});
}
it('should not accept invalid birth dates', async () => {
for (const { birthDate, response } of [
{ birthDate: false, response: 'Not found or no person.write access' },
{ birthDate: 'false', response: ['birthDate must be a Date instance'] },
{
birthDate: '123567',
response: 'Not found or no person.write access',
},
{ birthDate: 123_567, response: 'Not found or no person.write access' },
]) {
for (const { birthDate, response } of invalidBirthday) {
it(`should not accept an invalid birth date [${birthDate}]`, async () => {
const { status, body } = await request(app)
.put(`/person/${uuidDto.notFound}`)
.put(`/person/${visiblePerson.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ birthDate });
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(response));
}
});
});
}
it('should update a date of birth', async () => {
const { status, body } = await request(app)
@@ -192,15 +222,8 @@ describe('/activity', () => {
});
it('should clear a date of birth', async () => {
// TODO ironically this uses the update endpoint to create the person
const person = await utils.createPerson(admin.accessToken, {
birthDate: new Date('1990-01-01').toISOString(),
});
expect(person.birthDate).toBeDefined();
const { status, body } = await request(app)
.put(`/person/${person.id}`)
.put(`/person/${visiblePerson.id}`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ birthDate: null });
expect(status).toBe(200);

View File

@@ -0,0 +1,451 @@
import { AssetFileUploadResponseDto, LoginResponseDto, deleteAssets } from '@immich/sdk';
import { DateTime } from 'luxon';
import { readFile } from 'node:fs/promises';
import { join } from 'node:path';
import { Socket } from 'socket.io-client';
import { errorDto } from 'src/responses';
import { app, asBearerAuth, testAssetDir, utils } from 'src/utils';
import request from 'supertest';
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
const today = DateTime.now();
describe('/search', () => {
let admin: LoginResponseDto;
let websocket: Socket;
let assetFalcon: AssetFileUploadResponseDto;
let assetDenali: AssetFileUploadResponseDto;
let assetCyclamen: AssetFileUploadResponseDto;
let assetNotocactus: AssetFileUploadResponseDto;
let assetSilver: AssetFileUploadResponseDto;
// let assetDensity: AssetFileUploadResponseDto;
// let assetPhiladelphia: AssetFileUploadResponseDto;
// let assetOrychophragmus: AssetFileUploadResponseDto;
// let assetRidge: AssetFileUploadResponseDto;
// let assetPolemonium: AssetFileUploadResponseDto;
// let assetWood: AssetFileUploadResponseDto;
let assetHeic: AssetFileUploadResponseDto;
let assetRocks: AssetFileUploadResponseDto;
let assetOneJpg6: AssetFileUploadResponseDto;
let assetOneHeic6: AssetFileUploadResponseDto;
let assetOneJpg5: AssetFileUploadResponseDto;
let assetGlarus: AssetFileUploadResponseDto;
let assetSprings: AssetFileUploadResponseDto;
let assetLast: AssetFileUploadResponseDto;
beforeAll(async () => {
await utils.resetDatabase();
admin = await utils.adminSetup();
websocket = await utils.connectWebsocket(admin.accessToken);
const files = [
{ filename: '/albums/nature/prairie_falcon.jpg' },
{ filename: '/formats/webp/denali.webp' },
{ filename: '/albums/nature/cyclamen_persicum.jpg', dto: { isFavorite: true } },
{ filename: '/albums/nature/notocactus_minimus.jpg' },
{ filename: '/albums/nature/silver_fir.jpg' },
{ filename: '/formats/heic/IMG_2682.heic' },
{ filename: '/formats/jpg/el_torcal_rocks.jpg' },
{ filename: '/formats/motionphoto/Samsung One UI 6.jpg' },
{ filename: '/formats/motionphoto/Samsung One UI 6.heic' },
{ filename: '/formats/motionphoto/Samsung One UI 5.jpg' },
{ filename: '/formats/raw/Nikon/D80/glarus.nef', dto: { isReadOnly: true } },
{ filename: '/metadata/gps-position/thompson-springs.jpg', dto: { isArchived: true } },
// used for search suggestions
{ filename: '/formats/png/density_plot.png' },
{ filename: '/formats/raw/Nikon/D700/philadelphia.nef' },
{ filename: '/albums/nature/orychophragmus_violaceus.jpg' },
{ filename: '/albums/nature/tanners_ridge.jpg' },
{ filename: '/albums/nature/polemonium_reptans.jpg' },
// last asset
{ filename: '/albums/nature/wood_anemones.jpg' },
];
const assets: AssetFileUploadResponseDto[] = [];
for (const { filename, dto } of files) {
const bytes = await readFile(join(testAssetDir, filename));
assets.push(
await utils.createAsset(admin.accessToken, {
deviceAssetId: `test-${filename}`,
assetData: { bytes, filename },
...dto,
}),
);
}
for (const asset of assets) {
await utils.waitForWebsocketEvent({ event: 'assetUpload', id: asset.id });
}
[
assetFalcon,
assetDenali,
assetCyclamen,
assetNotocactus,
assetSilver,
assetHeic,
assetRocks,
assetOneJpg6,
assetOneHeic6,
assetOneJpg5,
assetGlarus,
assetSprings,
// assetDensity,
// assetPhiladelphia,
// assetOrychophragmus,
// assetRidge,
// assetPolemonium,
// assetWood,
] = assets;
assetLast = assets.at(-1) as AssetFileUploadResponseDto;
await deleteAssets({ assetBulkDeleteDto: { ids: [assetSilver.id] } }, { headers: asBearerAuth(admin.accessToken) });
});
afterAll(async () => {
await utils.disconnectWebsocket(websocket);
});
describe('POST /search/metadata', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post('/search/metadata');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
const badTests = [
{
should: 'should reject page as a string',
dto: { page: 'abc' },
expected: ['page must not be less than 1', 'page must be an integer number'],
},
{
should: 'should reject page as a decimal',
dto: { page: 1.5 },
expected: ['page must be an integer number'],
},
{
should: 'should reject page as a negative number',
dto: { page: -10 },
expected: ['page must not be less than 1'],
},
{
should: 'should reject page as 0',
dto: { page: 0 },
expected: ['page must not be less than 1'],
},
{
should: 'should reject size as a string',
dto: { size: 'abc' },
expected: [
'size must not be greater than 1000',
'size must not be less than 1',
'size must be an integer number',
],
},
{
should: 'should reject an invalid size',
dto: { size: -1.5 },
expected: ['size must not be less than 1', 'size must be an integer number'],
},
...[
'isArchived',
'isFavorite',
'isReadOnly',
'isExternal',
'isEncoded',
'isMotion',
'isOffline',
'isVisible',
].map((value) => ({
should: `should reject ${value} not a boolean`,
dto: { [value]: 'immich' },
expected: [`${value} must be a boolean value`],
})),
];
for (const { should, dto, expected } of badTests) {
it(should, async () => {
const { status, body } = await request(app)
.post('/search/metadata')
.set('Authorization', `Bearer ${admin.accessToken}`)
.send(dto);
expect(status).toBe(400);
expect(body).toEqual(errorDto.badRequest(expected));
});
}
const searchTests = [
{
should: 'should get my assets',
deferred: () => ({ dto: { size: 1 }, assets: [assetLast] }),
},
{
should: 'should sort my assets in reverse',
deferred: () => ({ dto: { order: 'asc', size: 2 }, assets: [assetCyclamen, assetNotocactus] }),
},
{
should: 'should support pagination',
deferred: () => ({ dto: { order: 'asc', size: 1, page: 2 }, assets: [assetNotocactus] }),
},
{
should: 'should search by checksum (base64)',
deferred: () => ({ dto: { checksum: '9IXBDMjj9OrQb+1YMHprZJgZ/UQ=' }, assets: [assetCyclamen] }),
},
{
should: 'should search by checksum (hex)',
deferred: () => ({ dto: { checksum: 'f485c10cc8e3f4ead06fed58307a6b649819fd44' }, assets: [assetCyclamen] }),
},
{ should: 'should search by id', deferred: () => ({ dto: { id: assetCyclamen.id }, assets: [assetCyclamen] }) },
{
should: 'should search by isFavorite (true)',
deferred: () => ({ dto: { isFavorite: true }, assets: [assetCyclamen] }),
},
{
should: 'should search by isFavorite (false)',
deferred: () => ({ dto: { size: 1, isFavorite: false }, assets: [assetLast] }),
},
{
should: 'should search by isArchived (true)',
deferred: () => ({ dto: { isArchived: true }, assets: [assetSprings] }),
},
{
should: 'should search by isArchived (false)',
deferred: () => ({ dto: { size: 1, isArchived: false }, assets: [assetLast] }),
},
{
should: 'should search by isReadOnly (true)',
deferred: () => ({ dto: { isReadOnly: true }, assets: [assetGlarus] }),
},
{
should: 'should search by isReadOnly (false)',
deferred: () => ({ dto: { size: 1, isReadOnly: false }, assets: [assetLast] }),
},
{
should: 'should search by type (image)',
deferred: () => ({ dto: { size: 1, type: 'IMAGE' }, assets: [assetLast] }),
},
{
should: 'should search by type (video)',
deferred: () => ({
dto: { type: 'VIDEO' },
assets: [
// the three live motion photos
{ id: expect.any(String) },
{ id: expect.any(String) },
{ id: expect.any(String) },
],
}),
},
{
should: 'should search by trashedBefore',
deferred: () => ({ dto: { trashedBefore: today.plus({ hour: 1 }).toJSDate() }, assets: [assetSilver] }),
},
{
should: 'should search by trashedBefore (no results)',
deferred: () => ({ dto: { trashedBefore: today.minus({ days: 1 }).toJSDate() }, assets: [] }),
},
{
should: 'should search by trashedAfter',
deferred: () => ({ dto: { trashedAfter: today.minus({ hour: 1 }).toJSDate() }, assets: [assetSilver] }),
},
{
should: 'should search by trashedAfter (no results)',
deferred: () => ({ dto: { trashedAfter: today.plus({ hour: 1 }).toJSDate() }, assets: [] }),
},
{
should: 'should search by takenBefore',
deferred: () => ({ dto: { size: 1, takenBefore: today.plus({ hour: 1 }).toJSDate() }, assets: [assetLast] }),
},
{
should: 'should search by takenBefore (no results)',
deferred: () => ({ dto: { takenBefore: DateTime.fromObject({ year: 1234 }).toJSDate() }, assets: [] }),
},
{
should: 'should search by takenAfter',
deferred: () => ({
dto: { size: 1, takenAfter: DateTime.fromObject({ year: 1234 }).toJSDate() },
assets: [assetLast],
}),
},
{
should: 'should search by takenAfter (no results)',
deferred: () => ({ dto: { takenAfter: today.plus({ hour: 1 }).toJSDate() }, assets: [] }),
},
// {
// should: 'should search by originalPath',
// deferred: () => ({
// dto: { originalPath: asset1.originalPath },
// assets: [asset1],
// }),
// },
{
should: 'should search by originalFilename',
deferred: () => ({
dto: { originalFileName: 'rocks' },
assets: [assetRocks],
}),
},
{
should: 'should search by originalFilename with spaces',
deferred: () => ({
dto: { originalFileName: 'Samsung One', type: 'IMAGE' },
assets: [assetOneJpg5, assetOneJpg6, assetOneHeic6],
}),
},
{
should: 'should search by city',
deferred: () => ({ dto: { city: 'Ralston' }, assets: [assetHeic] }),
},
{
should: 'should search by state',
deferred: () => ({ dto: { state: 'Douglas County, Nebraska' }, assets: [assetHeic] }),
},
{
should: 'should search by country',
deferred: () => ({ dto: { country: 'United States of America' }, assets: [assetHeic] }),
},
{
should: 'should search by make',
deferred: () => ({ dto: { make: 'Canon' }, assets: [assetFalcon, assetDenali] }),
},
{
should: 'should search by model',
deferred: () => ({ dto: { model: 'Canon EOS 7D' }, assets: [assetDenali] }),
},
];
for (const { should, deferred } of searchTests) {
it(should, async () => {
const { assets, dto } = deferred();
const { status, body } = await request(app)
.post('/search/metadata')
.send(dto)
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body.assets).toBeDefined();
expect(Array.isArray(body.assets.items)).toBe(true);
for (const [i, asset] of assets.entries()) {
expect(body.assets.items[i]).toEqual(expect.objectContaining({ id: asset.id }));
}
expect(body.assets.items).toHaveLength(assets.length);
});
}
});
describe('POST /search/smart', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).post('/search/smart');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
});
describe('GET /search/explore', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/search/explore');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should get explore data', async () => {
const { status, body } = await request(app)
.get('/search/explore')
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toEqual([
{ fieldName: 'exifInfo.city', items: [] },
{ fieldName: 'smartInfo.tags', items: [] },
]);
});
});
describe('GET /search/places', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/search/places');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should get places', async () => {
const { status, body } = await request(app)
.get('/search/places?name=Paris')
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(Array.isArray(body)).toBe(true);
expect(body.length).toBeGreaterThan(10);
});
});
describe('GET /search/suggestions', () => {
it('should require authentication', async () => {
const { status, body } = await request(app).get('/search/suggestions');
expect(status).toBe(401);
expect(body).toEqual(errorDto.unauthorized);
});
it('should get suggestions for country', async () => {
const { status, body } = await request(app)
.get('/search/suggestions?type=country')
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toEqual(['United States of America']);
expect(status).toBe(200);
});
it('should get suggestions for state', async () => {
const { status, body } = await request(app)
.get('/search/suggestions?type=state')
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toEqual(['Douglas County, Nebraska', 'Mesa County, Colorado']);
expect(status).toBe(200);
});
it('should get suggestions for city', async () => {
const { status, body } = await request(app)
.get('/search/suggestions?type=city')
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toEqual(['Palisade', 'Ralston']);
expect(status).toBe(200);
});
it('should get suggestions for camera make', async () => {
const { status, body } = await request(app)
.get('/search/suggestions?type=camera-make')
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toEqual([
'Apple',
'Canon',
'FUJIFILM',
'NIKON CORPORATION',
'PENTAX Corporation',
'samsung',
'SONY',
]);
expect(status).toBe(200);
});
it('should get suggestions for camera model', async () => {
const { status, body } = await request(app)
.get('/search/suggestions?type=camera-model')
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toEqual([
'Canon EOS 7D',
'Canon EOS R5',
'DSLR-A550',
'FinePix S3Pro',
'iPhone 7',
'NIKON D700',
'NIKON D750',
'NIKON D80',
'PENTAX K10D',
'SM-F711N',
'SM-S906U',
'SM-T970',
]);
expect(status).toBe(200);
});
});
});

View File

@@ -86,7 +86,7 @@ describe('/shared-link', () => {
}),
]);
await deleteUser({ id: user2.userId }, { headers: asBearerAuth(admin.accessToken) });
await deleteUser({ id: user2.userId, deleteUserDto: {} }, { headers: asBearerAuth(admin.accessToken) });
});
describe('GET /shared-link', () => {

View File

@@ -38,7 +38,7 @@ describe('/trash', () => {
const { status } = await request(app).post('/trash/empty').set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(204);
await utils.waitForWebsocketEvent({ event: 'delete', assetId });
await utils.waitForWebsocketEvent({ event: 'assetDelete', id: assetId });
const after = await getAllAssets({}, { headers: asBearerAuth(admin.accessToken) });
expect(after.length).toBe(0);

View File

@@ -1,27 +1,37 @@
import { LoginResponseDto, deleteUser, getUserById } from '@immich/sdk';
import { Socket } from 'socket.io-client';
import { createUserDto, userDto } from 'src/fixtures';
import { errorDto } from 'src/responses';
import { app, asBearerAuth, utils } from 'src/utils';
import request from 'supertest';
import { beforeAll, describe, expect, it } from 'vitest';
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
describe('/user', () => {
let websocket: Socket;
describe('/server-info', () => {
let admin: LoginResponseDto;
let deletedUser: LoginResponseDto;
let userToDelete: LoginResponseDto;
let userToHardDelete: LoginResponseDto;
let nonAdmin: LoginResponseDto;
beforeAll(async () => {
await utils.resetDatabase();
admin = await utils.adminSetup({ onboarding: false });
[deletedUser, nonAdmin, userToDelete] = await Promise.all([
[websocket, deletedUser, nonAdmin, userToDelete, userToHardDelete] = await Promise.all([
utils.connectWebsocket(admin.accessToken),
utils.userSetup(admin.accessToken, createUserDto.user1),
utils.userSetup(admin.accessToken, createUserDto.user2),
utils.userSetup(admin.accessToken, createUserDto.user3),
utils.userSetup(admin.accessToken, createUserDto.user4),
]);
await deleteUser({ id: deletedUser.userId }, { headers: asBearerAuth(admin.accessToken) });
await deleteUser({ id: deletedUser.userId, deleteUserDto: {} }, { headers: asBearerAuth(admin.accessToken) });
});
afterAll(() => {
utils.disconnectWebsocket(websocket);
});
describe('GET /user', () => {
@@ -34,13 +44,14 @@ describe('/server-info', () => {
it('should get users', async () => {
const { status, body } = await request(app).get('/user').set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toEqual(200);
expect(body).toHaveLength(4);
expect(body).toHaveLength(5);
expect(body).toEqual(
expect.arrayContaining([
expect.objectContaining({ email: 'admin@immich.cloud' }),
expect.objectContaining({ email: 'user1@immich.cloud' }),
expect.objectContaining({ email: 'user2@immich.cloud' }),
expect.objectContaining({ email: 'user3@immich.cloud' }),
expect.objectContaining({ email: 'user4@immich.cloud' }),
]),
);
});
@@ -51,12 +62,13 @@ describe('/server-info', () => {
.query({ isAll: true })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toHaveLength(3);
expect(body).toHaveLength(4);
expect(body).toEqual(
expect.arrayContaining([
expect.objectContaining({ email: 'admin@immich.cloud' }),
expect.objectContaining({ email: 'user2@immich.cloud' }),
expect.objectContaining({ email: 'user3@immich.cloud' }),
expect.objectContaining({ email: 'user4@immich.cloud' }),
]),
);
});
@@ -68,13 +80,14 @@ describe('/server-info', () => {
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toHaveLength(4);
expect(body).toHaveLength(5);
expect(body).toEqual(
expect.arrayContaining([
expect.objectContaining({ email: 'admin@immich.cloud' }),
expect.objectContaining({ email: 'user1@immich.cloud' }),
expect.objectContaining({ email: 'user2@immich.cloud' }),
expect.objectContaining({ email: 'user3@immich.cloud' }),
expect.objectContaining({ email: 'user4@immich.cloud' }),
]),
);
});
@@ -138,13 +151,13 @@ describe('/server-info', () => {
.post(`/user`)
.send({
isAdmin: true,
email: 'user4@immich.cloud',
email: 'user5@immich.cloud',
password: 'password123',
name: 'Immich',
})
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toMatchObject({
email: 'user4@immich.cloud',
email: 'user5@immich.cloud',
isAdmin: false,
shouldChangePassword: true,
});
@@ -188,6 +201,22 @@ describe('/server-info', () => {
deletedAt: expect.any(String),
});
});
it('should hard delete user', async () => {
const { status, body } = await request(app)
.delete(`/user/${userToHardDelete.userId}`)
.send({ force: true })
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200);
expect(body).toMatchObject({
id: userToHardDelete.userId,
updatedAt: expect.any(String),
deletedAt: expect.any(String),
});
await utils.waitForWebsocketEvent({ event: 'userDelete', id: userToHardDelete.userId, timeout: 5000 });
});
});
describe('PUT /user', () => {

View File

@@ -21,6 +21,13 @@ export const signupDto = {
};
export const createUserDto = {
create(key: string) {
return {
email: `${key}@immich.cloud`,
name: `Generated User ${key}`,
password: `password-${key}`,
};
},
user1: {
email: 'user1@immich.cloud',
name: 'User 1',
@@ -36,6 +43,17 @@ export const createUserDto = {
name: 'User 3',
password: 'password123',
},
user4: {
email: 'user4@immich.cloud',
name: 'User 4',
password: 'password123',
},
userQuota: {
email: 'user-quota@immich.cloud',
name: 'User Quota',
password: 'password-quota',
quotaSizeInBytes: 512,
},
};
export const userDto = {

View File

@@ -76,6 +76,7 @@ export const signupResponseDto = {
memoriesEnabled: true,
quotaUsageInBytes: 0,
quotaSizeInBytes: null,
status: 'active',
},
};

View File

@@ -5,7 +5,7 @@ import {
CreateAssetDto,
CreateLibraryDto,
CreateUserDto,
PersonUpdateDto,
PersonCreateDto,
SharedLinkCreateDto,
ValidateLibraryDto,
createAlbum,
@@ -20,7 +20,6 @@ import {
login,
setAdminOnboarding,
signUpAdmin,
updatePerson,
validate,
} from '@immich/sdk';
import { BrowserContext } from '@playwright/test';
@@ -37,8 +36,8 @@ import { makeRandomImage } from 'src/generators';
import request from 'supertest';
type CliResponse = { stdout: string; stderr: string; exitCode: number | null };
type EventType = 'upload' | 'delete';
type WaitOptions = { event: EventType; assetId: string; timeout?: number };
type EventType = 'assetUpload' | 'assetDelete' | 'userDelete';
type WaitOptions = { event: EventType; id: string; timeout?: number };
type AdminSetupOptions = { onboarding?: boolean };
type AssetData = { bytes?: Buffer; filename: string };
@@ -79,20 +78,21 @@ export const immichCli = async (args: string[]) => {
let client: pg.Client | null = null;
const events: Record<EventType, Set<string>> = {
upload: new Set<string>(),
delete: new Set<string>(),
assetUpload: new Set<string>(),
assetDelete: new Set<string>(),
userDelete: new Set<string>(),
};
const callbacks: Record<string, () => void> = {};
const execPromise = promisify(exec);
const onEvent = ({ event, assetId }: { event: EventType; assetId: string }) => {
events[event].add(assetId);
const callback = callbacks[assetId];
const onEvent = ({ event, id }: { event: EventType; id: string }) => {
events[event].add(id);
const callback = callbacks[id];
if (callback) {
callback();
delete callbacks[assetId];
delete callbacks[id];
}
};
@@ -105,6 +105,8 @@ export const utils = {
}
tables = tables || [
// TODO e2e test for deleting a stack, since it is quite complex
'asset_stack',
'libraries',
'shared_links',
'person',
@@ -118,9 +120,17 @@ export const utils = {
'system_metadata',
];
for (const table of tables) {
await client.query(`DELETE FROM ${table} CASCADE;`);
const sql: string[] = [];
if (tables.includes('asset_stack')) {
sql.push('UPDATE "assets" SET "stackId" = NULL;');
}
for (const table of tables) {
sql.push(`DELETE FROM ${table} CASCADE;`);
}
await client.query(sql.join('\n'));
} catch (error) {
console.error('Failed to reset database', error);
throw error;
@@ -157,8 +167,9 @@ export const utils = {
return new Promise<Socket>((resolve) => {
websocket
.on('connect', () => resolve(websocket))
.on('on_upload_success', (data: AssetResponseDto) => onEvent({ event: 'upload', assetId: data.id }))
.on('on_asset_delete', (assetId: string) => onEvent({ event: 'delete', assetId }))
.on('on_upload_success', (data: AssetResponseDto) => onEvent({ event: 'assetUpload', id: data.id }))
.on('on_asset_delete', (assetId: string) => onEvent({ event: 'assetDelete', id: assetId }))
.on('on_user_delete', (userId: string) => onEvent({ event: 'userDelete', id: userId }))
.connect();
});
},
@@ -173,16 +184,17 @@ export const utils = {
}
},
waitForWebsocketEvent: async ({ event, assetId, timeout: ms }: WaitOptions): Promise<void> => {
waitForWebsocketEvent: async ({ event, id, timeout: ms }: WaitOptions): Promise<void> => {
console.log(`Waiting for ${event} [${id}]`);
const set = events[event];
if (set.has(assetId)) {
if (set.has(id)) {
return;
}
return new Promise<void>((resolve, reject) => {
const timeout = setTimeout(() => reject(new Error(`Timed out waiting for ${event} event`)), ms || 10_000);
callbacks[assetId] = () => {
callbacks[id] = () => {
clearTimeout(timeout);
resolve();
};
@@ -233,6 +245,10 @@ export const utils = {
const assetData = dto?.assetData?.bytes || makeRandomImage();
const filename = dto?.assetData?.filename || 'example.png';
if (dto?.assetData?.bytes) {
console.log(`Uploading ${filename}`);
}
const builder = request(app)
.post(`/asset/upload`)
.attach('assetData', assetData, filename)
@@ -252,16 +268,11 @@ export const utils = {
deleteAssets: (accessToken: string, ids: string[]) =>
deleteAssets({ assetBulkDeleteDto: { ids } }, { headers: asBearerAuth(accessToken) }),
createPerson: async (accessToken: string, dto?: PersonUpdateDto) => {
// TODO fix createPerson to accept a body
const person = await createPerson({ headers: asBearerAuth(accessToken) });
createPerson: async (accessToken: string, dto?: PersonCreateDto) => {
const person = await createPerson({ personCreateDto: dto || {} }, { headers: asBearerAuth(accessToken) });
await utils.setPersonThumbnail(person.id);
if (!dto) {
return person;
}
return updatePerson({ id: person.id, personUpdateDto: dto }, { headers: asBearerAuth(accessToken) });
return person;
},
createFace: async ({ assetId, personId }: { assetId: string; personId: string }) => {

View File

@@ -171,4 +171,6 @@ cython_debug/
.vscode
*.onnx
*.zip
*.zip
core

View File

@@ -1,6 +1,6 @@
[tool.poetry]
name = "machine-learning"
version = "1.98.0"
version = "1.98.2"
description = ""
authors = ["Hau Tran <alex.tran1502@gmail.com>"]
readme = "README.md"

View File

@@ -65,6 +65,7 @@ if [ "$CURRENT_SERVER" != "$NEXT_SERVER" ]; then
make open-api
npm --prefix open-api/typescript-sdk version "$SERVER_PUMP"
npm --prefix web version "$SERVER_PUMP"
npm --prefix e2e version "$SERVER_PUMP"
npm --prefix web i --package-lock-only
npm --prefix cli i --package-lock-only
npm --prefix e2e i --package-lock-only

View File

@@ -35,8 +35,8 @@ platform :android do
task: 'bundle',
build_type: 'Release',
properties: {
"android.injected.version.code" => 126,
"android.injected.version.name" => "1.98.0",
"android.injected.version.code" => 128,
"android.injected.version.name" => "1.98.2",
}
)
upload_to_play_store(skip_upload_apk: true, skip_upload_images: true, skip_upload_screenshots: true, aab: '../build/app/outputs/bundle/release/app-release.aab')

View File

@@ -5,17 +5,17 @@
<testcase classname="fastlane.lanes" name="0: default_platform" time="0.000266">
<testcase classname="fastlane.lanes" name="0: default_platform" time="0.000215">
</testcase>
<testcase classname="fastlane.lanes" name="1: bundleRelease" time="81.342186">
<testcase classname="fastlane.lanes" name="1: bundleRelease" time="77.732834">
</testcase>
<testcase classname="fastlane.lanes" name="2: upload_to_play_store" time="48.746195">
<testcase classname="fastlane.lanes" name="2: upload_to_play_store" time="37.34283">
</testcase>

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "DETALLS",
"exif_bottom_sheet_location": "UBICACIÓ",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Work in progress",
"experimental_settings_new_asset_list_title": "Enable experimental photo grid",
"experimental_settings_subtitle": "Use at your own risk!",

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "PODROBNOSTI",
"exif_bottom_sheet_location": "LOKALITA",
"exif_bottom_sheet_location_add": "Přidat polohu",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Zpracovávám",
"experimental_settings_new_asset_list_title": "Povolení experimentální mřížky fotografií",
"experimental_settings_subtitle": "Používejte na vlastní riziko!",

View File

@@ -35,8 +35,8 @@
"app_bar_signout_dialog_title": "Log ud",
"archive_page_no_archived_assets": "Ingen arkiverede elementer blev fundet",
"archive_page_title": "Arkivér ({})",
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_action_delete_err_read_only": "Kan ikke slette kun læselige elementer. Springer over",
"asset_action_share_err_offline": "Kan ikke hente offline element(er). Springer over",
"asset_list_layout_settings_dynamic_layout_title": "Dynamisk layout",
"asset_list_layout_settings_group_automatically": "Automatisk",
"asset_list_layout_settings_group_by": "Gruppér elementer pr. ",
@@ -150,7 +150,7 @@
"control_bottom_app_bar_share": "Del",
"control_bottom_app_bar_share_to": "Del til",
"control_bottom_app_bar_stack": "Stak",
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
"control_bottom_app_bar_trash_from_immich": "Flyt til papirkurv",
"control_bottom_app_bar_unarchive": "Afakivér",
"control_bottom_app_bar_unfavorite": "Fjern favorit",
"control_bottom_app_bar_upload": "Upload",
@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "DETALJER",
"exif_bottom_sheet_location": "LOKATION",
"exif_bottom_sheet_location_add": "Tilføj en placering",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Under udarbejdelse",
"experimental_settings_new_asset_list_title": "Aktiver eksperimentelt fotogitter",
"experimental_settings_subtitle": "Brug på eget ansvar!",
@@ -199,7 +200,7 @@
"home_page_archive_err_partner": "Kan endnu ikke arkivere partners elementer. Springer over",
"home_page_building_timeline": "Bygger tidslinjen",
"home_page_delete_err_partner": "Kan endnu ikke slette partners elementer. Springer over",
"home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
"home_page_delete_remote_err_local": "Lokale elementer i fjernsletningssektion. Springer over",
"home_page_favorite_err_local": "Kan endnu ikke gøre lokale elementer til favoritter. Springer over..",
"home_page_favorite_err_partner": "Kan endnu ikke tilføje partners elementer som favoritter. Springer over",
"home_page_first_time_notice": "Hvis det er din første gang i appen, bedes du vælge en sikkerhedskopi af albummer så tidlinjen kan blive fyldt med billeder og videoer fra albummerne.",
@@ -279,8 +280,8 @@
"map_zoom_to_see_photos": "Zoom ud for at vise billeder",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Bevægelsesbilleder",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"multiselect_grid_edit_date_time_err_read_only": "Kan ikke redigere datoen på kun læselige elementer. Springer over",
"multiselect_grid_edit_gps_err_read_only": "Kan ikke redigere lokation af kun læselige elementer. Springer over",
"notification_permission_dialog_cancel": "Annuller",
"notification_permission_dialog_content": "Gå til indstillinger for at slå notifikationer til.",
"notification_permission_dialog_settings": "Indstillinger",

View File

@@ -185,7 +185,7 @@
"exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "STANDORT",
"exif_bottom_sheet_location_add": "Aufnahmeort hinzufügen",
"exif_bottom_sheet_people": "PERSONEN",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "In Arbeit",
"experimental_settings_new_asset_list_title": "Experimentelles Fotogitter aktivieren",
"experimental_settings_subtitle": "Benutzung auf eigene Gefahr!",
@@ -477,4 +477,4 @@
"viewer_remove_from_stack": "Aus Stapel entfernen",
"viewer_stack_use_as_main_asset": "An Stapelanfang",
"viewer_unstack": "Stapel aufheben"
}
}

View File

@@ -477,4 +477,4 @@
"viewer_remove_from_stack": "Remove from Stack",
"viewer_stack_use_as_main_asset": "Use as Main Asset",
"viewer_unstack": "Un-Stack"
}
}

View File

@@ -1,6 +1,6 @@
{
"action_common_cancel": "Cancel",
"action_common_update": "Update",
"action_common_cancel": "Cancelar",
"action_common_update": "Actualizar",
"add_to_album_bottom_sheet_added": "Agregado a {album}",
"add_to_album_bottom_sheet_already_exists": "Ya se encuentra en {album}",
"advanced_settings_log_level_title": "Nivel de log: {}",
@@ -35,7 +35,7 @@
"app_bar_signout_dialog_title": "Cerrar sesión",
"archive_page_no_archived_assets": "No se encontraron recursos archivados",
"archive_page_title": "Archivo ({})",
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
"asset_action_delete_err_read_only": "No se pueden borrar los archivos de solo lectura. Saltando.",
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_list_layout_settings_dynamic_layout_title": "Diseño dinámico",
"asset_list_layout_settings_group_automatically": "Automatico",
@@ -142,15 +142,15 @@
"control_bottom_app_bar_archive": "Archivar",
"control_bottom_app_bar_create_new_album": "Crear nuevo álbum",
"control_bottom_app_bar_delete": "Eliminar",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_delete_from_immich": "Borrar de Immich",
"control_bottom_app_bar_delete_from_local": "Borrar del dispositivo",
"control_bottom_app_bar_edit_location": "Editar ubicación",
"control_bottom_app_bar_edit_time": "Editar fecha y hora",
"control_bottom_app_bar_favorite": "Favorito",
"control_bottom_app_bar_share": "Compartir",
"control_bottom_app_bar_share_to": "Enviar",
"control_bottom_app_bar_stack": "Apilar",
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
"control_bottom_app_bar_trash_from_immich": "Mover a la papelera",
"control_bottom_app_bar_unarchive": "Desarchivar",
"control_bottom_app_bar_unfavorite": "Unfavorite",
"control_bottom_app_bar_upload": "Subir",
@@ -165,9 +165,9 @@
"daily_title_text_date_year": "E dd de MMM, yyyy",
"date_format": "E d, LLL y • h:mm a",
"delete_dialog_alert": "Estos elementos serán eliminados permanentemente de Immich y de tu dispositivo",
"delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server",
"delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device",
"delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server",
"delete_dialog_alert_local": "Estas imágenes van a ser borradas de tu dispositivo, pero seguirán disponibles en el servidor Immich",
"delete_dialog_alert_local_non_backed_up": "Algunas de las imágenes no tienen copia de seguridad y serán borradas de forma permanente de tu dispositivo",
"delete_dialog_alert_remote": "Estas imágenes van a ser borradas de forma permanente del servidor Immich",
"delete_dialog_cancel": "Cancelar",
"delete_dialog_ok": "Eliminar",
"delete_dialog_ok_force": "Delete Anyway",
@@ -178,13 +178,14 @@
"delete_shared_link_dialog_title": "Eliminar enlace compartido",
"description_input_hint_text": "Agregar descripción...",
"description_input_submit_error": "Error al actualizar la descripción, verifica el registro para obtener más detalles",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_location_dialog_title": "Location",
"edit_date_time_dialog_date_time": "Fecha y Hora",
"edit_date_time_dialog_timezone": "Zona horaria",
"edit_location_dialog_title": "Ubicación",
"exif_bottom_sheet_description": "Agregar Descripción...",
"exif_bottom_sheet_details": "DETALLES",
"exif_bottom_sheet_location": "UBICACIÓN",
"exif_bottom_sheet_location_add": "Añadir ubicación",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Trabajo en progreso",
"experimental_settings_new_asset_list_title": "Habilitar cuadrícula fotográfica experimental",
"experimental_settings_subtitle": "Úsalo bajo tu responsabilidad",
@@ -220,13 +221,13 @@
"library_page_sort_most_oldest_photo": "Foto más antigua",
"library_page_sort_most_recent_photo": "Foto más reciente",
"library_page_sort_title": "Título del álbum",
"location_picker_choose_on_map": "Choose on map",
"location_picker_latitude": "Latitude",
"location_picker_latitude_error": "Enter a valid latitude",
"location_picker_latitude_hint": "Enter your latitude here",
"location_picker_longitude": "Longitude",
"location_picker_longitude_error": "Enter a valid longitude",
"location_picker_longitude_hint": "Enter your longitude here",
"location_picker_choose_on_map": "Elegir en el mapa",
"location_picker_latitude": "Latitud",
"location_picker_latitude_error": "Introduce una latitud válida",
"location_picker_latitude_hint": "Introduce tu latitud aquí",
"location_picker_longitude": "Longitud",
"location_picker_longitude_error": "Introduce una longitud válida",
"location_picker_longitude_hint": "Introduce tu longitud aquí",
"login_disabled": "El inicio de sesión ha sido desactivado",
"login_form_api_exception": "Excepción producida por API. Por favor, verifica el URL del servidor e inténtalo de nuevo.",
"login_form_back_button_text": "Atrás",
@@ -252,12 +253,12 @@
"login_form_server_error": "No se pudo conectar al servidor.",
"login_password_changed_error": "Hubo un error actualizando la contraseña",
"login_password_changed_success": "Contraseña cambiado con éxito",
"map_assets_in_bound": "{} photo",
"map_assets_in_bounds": "{} photos",
"map_assets_in_bound": "{} foto",
"map_assets_in_bounds": "{} fotos",
"map_cannot_get_user_location": "No se pudo obtener la posición del usuario",
"map_location_dialog_cancel": "Cancelar",
"map_location_dialog_yes": "Sí",
"map_location_picker_page_use_location": "Use this location",
"map_location_picker_page_use_location": "Usar esta ubicación",
"map_location_service_disabled_content": "Los servicios de ubicación deben estar activados para mostrar elementos de tu ubicación actual. Deseas activarlos ahora?",
"map_location_service_disabled_title": "Servicios de ubicación desactivados",
"map_no_assets_in_bounds": "No hay fotos en esta zona",
@@ -265,22 +266,22 @@
"map_no_location_permission_title": "Permisos de ubicación denegados",
"map_settings_dark_mode": "Modo oscuro",
"map_settings_date_range_option_all": "Todo",
"map_settings_date_range_option_day": "Past 24 hours",
"map_settings_date_range_option_days": "Past {} days",
"map_settings_date_range_option_year": "Past year",
"map_settings_date_range_option_years": "Past {} years",
"map_settings_date_range_option_day": "Últimas 24 horas",
"map_settings_date_range_option_days": "Últimos {} días",
"map_settings_date_range_option_year": "Último año",
"map_settings_date_range_option_years": "Últimos {} años",
"map_settings_dialog_cancel": "Cancelar",
"map_settings_dialog_save": "Guardar",
"map_settings_dialog_title": "Ajustes mapa",
"map_settings_include_show_archived": "Incluir archivados",
"map_settings_only_relative_range": "Rango de fechas",
"map_settings_only_show_favorites": "Mostrar solo favoritas",
"map_settings_theme_settings": "Map Theme",
"map_settings_theme_settings": "Apariencia del Mapa",
"map_zoom_to_see_photos": "Alejar para ver fotos",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Foto en Movimiento",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"multiselect_grid_edit_date_time_err_read_only": "No se puede cambiar la fecha de archivos de solo lectura. Saltando.",
"multiselect_grid_edit_gps_err_read_only": "No se puede cambiar la localización de archivos de solo lectura. Saltando.",
"notification_permission_dialog_cancel": "Cancelar",
"notification_permission_dialog_content": "Para activar las notificaciones, ve a Configuración y selecciona permitir.",
"notification_permission_dialog_settings": "Ajustes",
@@ -318,7 +319,7 @@
"profile_drawer_sign_out": "Cerrar Sesión",
"profile_drawer_trash": "Papelera",
"recently_added_page_title": "Recién Agregadas",
"scaffold_body_error_occurred": "Error occurred",
"scaffold_body_error_occurred": "Ha ocurrido un error",
"search_bar_hint": "Busca tus fotos",
"search_page_categories": "Categorías",
"search_page_favorites": "Favoritos",
@@ -330,9 +331,9 @@
"search_page_person_add_name_dialog_hint": "Nombre",
"search_page_person_add_name_dialog_save": "Guardar",
"search_page_person_add_name_dialog_title": "Añadir nombre",
"search_page_person_add_name_subtitle": "Find them fast by name with search",
"search_page_person_add_name_title": "Add a name",
"search_page_person_edit_name": "Edit name",
"search_page_person_add_name_subtitle": "Encuéntralos rápido buscando por nombre",
"search_page_person_add_name_title": "Añadir nombre",
"search_page_person_edit_name": "Cambiar nombre",
"search_page_places": "Lugares",
"search_page_recently_added": "Recién agregadas",
"search_page_screenshots": "Capturas de pantalla",
@@ -341,7 +342,7 @@
"search_page_videos": "Videos",
"search_page_view_all_button": "Ver todo",
"search_page_your_activity": "Tu actividad",
"search_page_your_map": "Your Map",
"search_page_your_map": "Tu Mapa",
"search_result_page_new_search_hint": "Nueva Busqueda",
"search_suggestion_list_smart_search_hint_1": "La búsqueda inteligente está habilitada por defecto, para buscar metadatos utiliza esta sintaxis ",
"search_suggestion_list_smart_search_hint_2": "m:tu-término-de-búsqueda",
@@ -381,17 +382,17 @@
"shared_album_activity_remove_title": "Eliminar Actividad",
"shared_album_activity_setting_subtitle": "Permitir que otros respondan",
"shared_album_activity_setting_title": "Comentarios y me gusta",
"shared_album_section_people_action_error": "Error leaving/removing from album",
"shared_album_section_people_action_leave": "Remove user from album",
"shared_album_section_people_action_remove_user": "Remove user from album",
"shared_album_section_people_owner_label": "Owner",
"shared_album_section_people_title": "PEOPLE",
"shared_album_section_people_action_error": "Error dejando/eliminando del album",
"shared_album_section_people_action_leave": "Eliminar usuario del album",
"shared_album_section_people_action_remove_user": "Eliminar usuario del album",
"shared_album_section_people_owner_label": "Propietario",
"shared_album_section_people_title": "GENTE",
"share_dialog_preparing": "Preparando...",
"shared_link_app_bar_title": "Enlaces compartidos",
"shared_link_clipboard_copied_massage": "Copied to clipboard",
"shared_link_clipboard_text": "Link: {}\nPassword: {}",
"shared_link_clipboard_copied_massage": "Copiado al portapapeles",
"shared_link_clipboard_text": "Enlace: {}\nContraseña: {}",
"shared_link_create_app_bar_title": "Crear enlace compartido",
"shared_link_create_error": "Error while creating shared link",
"shared_link_create_error": "Error creando el enlace compartido",
"shared_link_create_info": "Cualquier persona con el enlace puede ver las fotos seleccionadas",
"shared_link_create_submit_button": "Crear enlace",
"shared_link_edit_allow_download": "Permitir descargar a usuarios públicos",
@@ -401,32 +402,32 @@
"shared_link_edit_description": "Descripción",
"shared_link_edit_description_hint": "Introduce la descripción del enlace",
"shared_link_edit_expire_after": "Expirar después de",
"shared_link_edit_expire_after_option_day": "1 day",
"shared_link_edit_expire_after_option_days": "{} days",
"shared_link_edit_expire_after_option_hour": "1 hour",
"shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_expire_after_option_day": "1 día",
"shared_link_edit_expire_after_option_days": "{} días",
"shared_link_edit_expire_after_option_hour": "1 hora",
"shared_link_edit_expire_after_option_hours": "{} horas",
"shared_link_edit_expire_after_option_minute": "1 minuto",
"shared_link_edit_expire_after_option_minutes": "{} minutos",
"shared_link_edit_expire_after_option_never": "Nunca",
"shared_link_edit_password": "Contraseña",
"shared_link_edit_password_hint": "Introduce la contraseña del enlace",
"shared_link_edit_show_meta": "Mostrar metadatos",
"shared_link_edit_submit_button": "Actualizar enlace",
"shared_link_empty": "No tienes enlaces compartidos",
"shared_link_error_server_url_fetch": "Cannot fetch the server url",
"shared_link_expired": "Expired",
"shared_link_expires_day": "Expires in {} day",
"shared_link_expires_days": "Expires in {} days",
"shared_link_expires_hour": "Expires in {} hour",
"shared_link_expires_hours": "Expires in {} hours",
"shared_link_expires_minute": "Expires in {} minute",
"shared_link_error_server_url_fetch": "No se puede adquirir la URL del servidor",
"shared_link_expired": "Caducado",
"shared_link_expires_day": "Caduca en {} día",
"shared_link_expires_days": "Caduca en {} días",
"shared_link_expires_hour": "Caduca en {} hora",
"shared_link_expires_hours": "Caduca en {} horas",
"shared_link_expires_minute": "Caduca en {} minuto",
"shared_link_expires_minutes": "Caduca en {} minutos",
"shared_link_expires_never": "Expires ∞",
"shared_link_expires_second": "Expires in {} second",
"shared_link_expires_never": "Caduca ∞",
"shared_link_expires_second": "Caduca en {} segundo",
"shared_link_expires_seconds": "Caduca en {} segundos",
"shared_link_info_chip_download": "Download",
"shared_link_info_chip_download": "Descargar",
"shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Upload",
"shared_link_info_chip_upload": "Subir",
"shared_link_manage_links": "Administrar enlaces compartidos",
"share_done": "Hecho",
"share_invite": "Invitar al álbum",

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "DETALLES",
"exif_bottom_sheet_location": "UBICACIÓN",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Trabajo en progreso",
"experimental_settings_new_asset_list_title": "Habilitar cuadrícula fotográfica experimental",
"experimental_settings_subtitle": "Úsalo bajo tu responsabilidad",

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "DETALLES",
"exif_bottom_sheet_location": "UBICACIÓN",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Trabajo en progreso",
"experimental_settings_new_asset_list_title": "Habilitar cuadrícula fotográfica experimental",
"experimental_settings_subtitle": "Úsalo bajo tu responsabilidad",

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "TIEDOT",
"exif_bottom_sheet_location": "SIJAINTI",
"exif_bottom_sheet_location_add": "Lisää sijainti",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Työn alla",
"experimental_settings_new_asset_list_title": "Ota käyttöön kokeellinen kuvaruudukko",
"experimental_settings_subtitle": "Käyttö omalla vastuulla!",
@@ -199,7 +200,7 @@
"home_page_archive_err_partner": "Kumppanin kohteita ei voi arkistoida. Hypätään yli",
"home_page_building_timeline": "Rakennetaan aikajanaa",
"home_page_delete_err_partner": "Kumppanin kohteita ei voi poistaa.Hypätään yli",
"home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
"home_page_delete_remote_err_local": "Paikallisia kohteita etäkohdevalintojen joukossa, ohitetaan",
"home_page_favorite_err_local": "Paikallisten kohteiden lisääminen suosikkeihin ei ole mahdollista, ohitetaan",
"home_page_favorite_err_partner": "Kumppanin kohteita ei voi vielä merkitä suosikiksi. Hypätään yli",
"home_page_first_time_notice": "Jos käytät sovellusta ensimmäistä kertaa, muista valita varmuuskopioitavat albumi(t), jotta aikajanalla voi olla kuvia ja videoita.",

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "DÉTAILS",
"exif_bottom_sheet_location": "LOCALISATION",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "En cours de développement",
"experimental_settings_new_asset_list_title": "Activer la grille de photos expérimentale",
"experimental_settings_subtitle": "Utilisez à vos dépends !",

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "LOCATION",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Work in progress",
"experimental_settings_new_asset_list_title": "Enable experimental photo grid",
"experimental_settings_subtitle": "Use at your own risk!",

View File

@@ -1,74 +1,74 @@
{
"action_common_cancel": "Cancel",
"action_common_update": "Update",
"action_common_cancel": "Mégsem",
"action_common_update": "Frissít",
"add_to_album_bottom_sheet_added": "Hozzáadva a(z) {album} nevű albumhoz",
"add_to_album_bottom_sheet_already_exists": "Már eleme a(z) {album} nevű albumnak",
"advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_prefer_remote_subtitle": "Some devices are painfully slow to load thumbnails from assets on the device. Activate this setting to load remote images instead.",
"advanced_settings_prefer_remote_title": "Prefer remote images",
"advanced_settings_self_signed_ssl_subtitle": "Skips SSL certificate verification for the server endpoint. Required for self-signed certificates.",
"advanced_settings_self_signed_ssl_title": "Allow self-signed SSL certificates",
"advanced_settings_log_level_title": "Naplózás szintje: {}",
"advanced_settings_prefer_remote_subtitle": "Néhány eszköz fájdalmasan lassan tölti be az eszközön lévő elemeket. Ezzel a beállítással inkább a távoli képeket töltjük be helyette.",
"advanced_settings_prefer_remote_title": "Távoli képek preferálása",
"advanced_settings_self_signed_ssl_subtitle": "SSL tanúsítvány ellenőrzésének kihagyása a szerver végponthoz. Ehhez saját aláírt tanúsítványok szükségesek.",
"advanced_settings_self_signed_ssl_title": "Saját aláírt SSL tanúsítványok engedélyezése",
"advanced_settings_tile_subtitle": "Haladó felhasználói beállítások",
"advanced_settings_tile_title": "Haladó",
"advanced_settings_troubleshooting_subtitle": "További funkciók engedélyezése hibaelhárítás céljából",
"advanced_settings_troubleshooting_title": "Hibaelhárítás",
"album_info_card_backup_album_excluded": "EXCLUDED",
"album_info_card_backup_album_included": "INCLUDED",
"album_info_card_backup_album_excluded": "KIZÁRVA",
"album_info_card_backup_album_included": "BELEÉRTVE",
"album_thumbnail_card_item": "1 elem",
"album_thumbnail_card_items": "{} elem",
"album_thumbnail_card_shared": "· Megosztott",
"album_thumbnail_owned": "Tulajdonos",
"album_thumbnail_shared_by": "Megosztotta: {}",
"album_viewer_appbar_share_delete": "Album törlése",
"album_viewer_appbar_share_err_delete": "Hiba az album törlése közben",
"album_viewer_appbar_share_err_leave": "Hiba az albumból való kilépés közben",
"album_viewer_appbar_share_err_remove": "Hiba az elemek törlése közben",
"album_viewer_appbar_share_err_title": "Hiba az album átnevezése közben",
"album_viewer_appbar_share_err_delete": "Nem sikerült törölni az albumot",
"album_viewer_appbar_share_err_leave": "Nem sikerült kilépni az albumból",
"album_viewer_appbar_share_err_remove": "Néhány elemet nem sikerült törölni az albumból",
"album_viewer_appbar_share_err_title": "Nem sikerült átnevezni az albumot",
"album_viewer_appbar_share_leave": "Kilépés az albumból",
"album_viewer_appbar_share_remove": "Törlés az albumból",
"album_viewer_appbar_share_to": "Share To",
"album_viewer_appbar_share_remove": "Eltávolítás az albumból",
"album_viewer_appbar_share_to": "Megosztás Ide",
"album_viewer_page_share_add_users": "Felhasználók hozzáadása",
"all_people_page_title": "Emberek",
"all_videos_page_title": "Videók",
"app_bar_signout_dialog_content": "Are you sure you want to sign out?",
"app_bar_signout_dialog_ok": "Yes",
"app_bar_signout_dialog_title": "Sign out",
"archive_page_no_archived_assets": "Nem található archivált média",
"app_bar_signout_dialog_content": "Biztos, hogy ki szeretnél jelentkezni?",
"app_bar_signout_dialog_ok": "Igen",
"app_bar_signout_dialog_title": "Kijelentkezés",
"archive_page_no_archived_assets": "Nem található archivált elem",
"archive_page_title": "Archívum ({})",
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_list_layout_settings_dynamic_layout_title": "Dynamic layout",
"asset_action_delete_err_read_only": "Nem sikerült törölni a csak-olvasható elem(ek)et, így ezeket átugorjuk",
"asset_action_share_err_offline": "Nem sikerült betölteni az offline elem(ek)et, így ezeket kihagyjuk",
"asset_list_layout_settings_dynamic_layout_title": "Dinamikus elrendezés",
"asset_list_layout_settings_group_automatically": "Automatikus",
"asset_list_layout_settings_group_by": "Group assets by",
"asset_list_layout_settings_group_by_month": "Hónap",
"asset_list_layout_settings_group_by_month_day": "Hónap + nap",
"asset_list_settings_subtitle": "Photo grid layout settings",
"asset_list_settings_title": "Photo Grid",
"backup_album_selection_page_albums_device": "Az eszközön lévő albumok ({})",
"backup_album_selection_page_albums_tap": "Tap to include, double tap to exclude",
"backup_album_selection_page_assets_scatter": "Assets can scatter across multiple albums. Thus, albums can be included or excluded during the backup process.",
"backup_album_selection_page_select_albums": "Albumok kiválasztása",
"backup_album_selection_page_selection_info": "Selection Info",
"asset_list_layout_settings_group_by": "Elemek csoportosítása",
"asset_list_layout_settings_group_by_month": "hónapok szerint",
"asset_list_layout_settings_group_by_month_day": "hónap és nap szerint",
"asset_list_settings_subtitle": "Fotórács elrendezése",
"asset_list_settings_title": "Fotórács",
"backup_album_selection_page_albums_device": "Ezen az eszközön lévő albumok ({})",
"backup_album_selection_page_albums_tap": "Koppincs a hozzáadáshoz, duplán koppincs az eltávolításhoz",
"backup_album_selection_page_assets_scatter": "Egy elem több albumban is lehet. Ezért a mentéshez albumokat lehet hozzáadni vagy azokat a mentésből kihagyni.",
"backup_album_selection_page_select_albums": "Válassz albumokat",
"backup_album_selection_page_selection_info": "Összegzés",
"backup_album_selection_page_total_assets": "Összes egyedi elem",
"backup_all": "Összes",
"backup_background_service_backup_failed_message": "HIba a mentés közben. Újrapróbálkozás...",
"backup_background_service_connection_failed_message": "HIba a szerverhez való csatlakozás közben. Újrapróbálkozás...",
"backup_background_service_current_upload_notification": "Feltöltés {}",
"backup_background_service_default_notification": "Keresés új elemek után...",
"backup_background_service_default_notification": "Új elemek keresése...",
"backup_background_service_error_title": "Hiba mentés közben",
"backup_background_service_in_progress_notification": "Elemek mentés alatt..",
"backup_background_service_upload_failure_notification": "Hiba feltöltés közben {}",
"backup_controller_page_albums": "Albumok mentése",
"backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.",
"backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled",
"backup_controller_page_albums": "Albumok Mentése",
"backup_controller_page_background_app_refresh_disabled_content": "Engedélyezd a háttérben történő frissítést a Beállítások > Általános > Háttérben Frissítés menüpontban.",
"backup_controller_page_background_app_refresh_disabled_title": "Háttérben frissítés kikapcsolva",
"backup_controller_page_background_app_refresh_enable_button_text": "Beállítások megnyitása",
"backup_controller_page_background_battery_info_link": "Mutasd meg hogyan",
"backup_controller_page_background_battery_info_message": "For the best background backup experience, please disable any battery optimizations restricting background activity for Immich.\n\nSince this is device-specific, please lookup the required information for your device manufacturer.",
"backup_controller_page_background_battery_info_message": "A sikeres háttérben történő mentéshez kérjük, tiltsd le az Immich akkumulátor optimalizálását.\n\nMivel ezt a különféle eszközökön máshogy kell, ezért kérjük, az eszközöd gyártójától tudd meg, hogyan kell.",
"backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_battery_info_title": "Akkumulátoroptimalizálás",
"backup_controller_page_background_battery_info_title": "Akkumulátor optimalizálás",
"backup_controller_page_background_charging": "Csak töltés közben",
"backup_controller_page_background_configure_error": "Failed to configure the background service",
"backup_controller_page_background_delay": "Delay new assets backup: {}",
"backup_controller_page_background_configure_error": "Nem sikerült beállítani a háttér szolgáltatást",
"backup_controller_page_background_delay": "Új elemek mentésének késleltetése: {}",
"backup_controller_page_background_description": "Kapcsold be a háttérfolyamatot, hogy automatikusan mentsen elemeket az applikáció megnyitása nélkül",
"backup_controller_page_background_is_off": "Automatikus mentés a háttérben ki van kapcsolva",
"backup_controller_page_background_is_on": "Automatikus mentés a háttérben bekapcsolva",
@@ -78,63 +78,63 @@
"backup_controller_page_backup": "Mentés",
"backup_controller_page_backup_selected": "Kiválasztva:",
"backup_controller_page_backup_sub": "Mentett fotók és videók",
"backup_controller_page_cancel": "Megszakít",
"backup_controller_page_cancel": "Mégsem",
"backup_controller_page_created": "Létrehozva: {}",
"backup_controller_page_desc_backup": "Turn on foreground backup to automatically upload new assets to the server when opening the app.",
"backup_controller_page_desc_backup": "Ha engedélyezed az előtérben mentést, akkor az új elemek automatikusan feltöltődnek a szerverre, amikor megyitod az alkalmazást.",
"backup_controller_page_excluded": "Kivéve:",
"backup_controller_page_failed": "Sikertelen ({})",
"backup_controller_page_filename": "Fájlnév: {}[{}]",
"backup_controller_page_id": "Azonosító: {}",
"backup_controller_page_info": "Mentésinformációk",
"backup_controller_page_none_selected": "Egy sincs kiválasztva",
"backup_controller_page_remainder": "Maradék",
"backup_controller_page_remainder": "Hátralévő",
"backup_controller_page_remainder_sub": "Hátralévő fotók és videók a kijelöltek közül",
"backup_controller_page_select": "Kiválaszt",
"backup_controller_page_server_storage": "Szerver tárhely",
"backup_controller_page_start_backup": "Mentés elindítása",
"backup_controller_page_status_off": "Autoatikus mentés az előtérben kikapcsolva",
"backup_controller_page_status_on": "Autoatikus mentés az előtérben bekapcsolva",
"backup_controller_page_server_storage": "Szerver Tárhely",
"backup_controller_page_start_backup": "Mentés Elindítása",
"backup_controller_page_status_off": "Automatikus mentés az előtérben kikapcsolva",
"backup_controller_page_status_on": "Automatikus mentés az előtérben bekapcsolva",
"backup_controller_page_storage_format": "{} / {} felhasználva",
"backup_controller_page_to_backup": "Albumok amiket mentesz",
"backup_controller_page_total": "Összes",
"backup_controller_page_to_backup": "Mentésre kijelölt albumok",
"backup_controller_page_total": "Összesen",
"backup_controller_page_total_sub": "Minden egyedi fotó és videó a kijelölt albumokból",
"backup_controller_page_turn_off": "Turn off foreground backup",
"backup_controller_page_turn_on": "Turn on foreground backup",
"backup_controller_page_uploading_file_info": "Uploading file info",
"backup_controller_page_turn_off": "Előtérben mentés kikapcsolása",
"backup_controller_page_turn_on": "Előtérben mentés bekapcsolása",
"backup_controller_page_uploading_file_info": "Fájl információk feltöltése",
"backup_err_only_album": "Az utolsó albumot nem tudod törölni",
"backup_info_card_assets": "elemek",
"backup_manual_cancelled": "Megszakítva",
"backup_manual_failed": "Failed",
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
"backup_manual_failed": "Sikertelen",
"backup_manual_in_progress": "Feltöltés már folyamatban. Próbáld meg később",
"backup_manual_success": "Sikeres",
"backup_manual_title": "Upload status",
"backup_manual_title": "Feltöltés állapota",
"cache_settings_album_thumbnails": "Library page thumbnails ({} assets)",
"cache_settings_clear_cache_button": "Gyorsítótár törlése",
"cache_settings_clear_cache_button": "Gyorsítótár kiürítése",
"cache_settings_clear_cache_button_title": "Clears the app's cache. This will significantly impact the app's performance until the cache has rebuilt.",
"cache_settings_duplicated_assets_clear_button": "CLEAR",
"cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app",
"cache_settings_duplicated_assets_title": "Duplicated Assets ({})",
"cache_settings_image_cache_size": "Image cache size ({} assets)",
"cache_settings_statistics_album": "Library thumbnails",
"cache_settings_statistics_assets": "{} assets ({})",
"cache_settings_statistics_full": "Teljes képek",
"cache_settings_statistics_shared": "Shared album thumbnails",
"cache_settings_statistics_thumbnail": "Előnézeti képek",
"cache_settings_statistics_title": "Gyorsítótár által használt terület",
"cache_settings_subtitle": "Control the caching behaviour of the Immich mobile application",
"cache_settings_thumbnail_size": "Thumbnail cache size ({} assets)",
"cache_settings_tile_subtitle": "Control the local storage behaviour",
"cache_settings_tile_title": "Local Storage",
"cache_settings_title": "Gyorsítótár beállítások",
"cache_settings_duplicated_assets_clear_button": "KIÜRÍT",
"cache_settings_duplicated_assets_subtitle": "Fotók és videók, amiket az alkalmazás fekete listára tett",
"cache_settings_duplicated_assets_title": "Duplikált Elemek ({})",
"cache_settings_image_cache_size": "Kép gyorsítótár mérete ({} elem)",
"cache_settings_statistics_album": "Mappa bélyegképei",
"cache_settings_statistics_assets": "{} elem ({})",
"cache_settings_statistics_full": "Teljes méretű képek",
"cache_settings_statistics_shared": "Megosztott album bélyegképei",
"cache_settings_statistics_thumbnail": "Bélyegképek",
"cache_settings_statistics_title": "Gyorsítótár használata",
"cache_settings_subtitle": "Az Immich mobilalkalmazás gyorsítótár viselkedésének beállítása",
"cache_settings_thumbnail_size": "Bélyegkép gyorsítótár mérete ({} elem)",
"cache_settings_tile_subtitle": "Helyi tárhely viselkedésének beállítása",
"cache_settings_tile_title": "Helyi Tárhely",
"cache_settings_title": "Gyorsítótár Beállítások",
"change_password_form_confirm_password": "Jelszó Megerősítése",
"change_password_form_description": "Kedves {name}!\n\nMost jelentkezel be először a rendszerbe vagy más okból szükséfes a jelszavad meváltoztatása. Kérjük, add meg új jelszavad.",
"change_password_form_description": "Kedves {name}!\n\nMost jelentkezel be először a rendszerbe vagy más okból szükséges a jelszavad meváltoztatása. Kérjük, add meg új jelszavad.",
"change_password_form_new_password": "Új Jelszó",
"change_password_form_password_mismatch": "A két beírt jelszó nem egyezik",
"change_password_form_reenter_new_password": "Jelszó (még egyszer)",
"common_add_to_album": "Albumhoz ad",
"common_change_password": "Jelszócsere",
"common_create_new_album": "Új album létrehozása",
"common_server_error": "Kérjük, ellenőrizd a hálózati kapcsolatot, gondoskodj róla, hogy a szerver elérhető legyen, valamint az app és a szerver kompatibilis verziójú legyen.",
"common_server_error": "Kérjük, ellenőrizd a hálózati kapcsolatot, gondoskodj róla, hogy a szerver elérhető legyen, valamint az alkalmazás és a szerver kompatibilis verziójú legyen.",
"common_shared": "Megosztva",
"control_bottom_app_bar_add_to_album": "Hozzáadás az albumhoz",
"control_bottom_app_bar_album_info": "{} elem",
@@ -142,23 +142,23 @@
"control_bottom_app_bar_archive": "Archivál",
"control_bottom_app_bar_create_new_album": "Album létrehozása",
"control_bottom_app_bar_delete": "Törlés",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "Edit Date & Time",
"control_bottom_app_bar_delete_from_immich": "Törlés az Immich-ből",
"control_bottom_app_bar_delete_from_local": "Törlés az eszközről",
"control_bottom_app_bar_edit_location": "Hely Módosítása",
"control_bottom_app_bar_edit_time": "Dátum és Idő Módosítása",
"control_bottom_app_bar_favorite": "Kedvenc",
"control_bottom_app_bar_share": "Megosztás",
"control_bottom_app_bar_share_to": "Share To",
"control_bottom_app_bar_share_to": "Megosztás Ide",
"control_bottom_app_bar_stack": "Stack",
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
"control_bottom_app_bar_unarchive": "Archiválás megszüntetése",
"control_bottom_app_bar_unfavorite": "Unfavorite",
"control_bottom_app_bar_upload": "Upload",
"control_bottom_app_bar_trash_from_immich": "Lomtárba Helyez",
"control_bottom_app_bar_unarchive": "Nem Archivált",
"control_bottom_app_bar_unfavorite": "Nem Kedvenc",
"control_bottom_app_bar_upload": "Feltöltés",
"create_album_page_untitled": "Névtelen",
"create_shared_album_page_create": "Létrehoz",
"create_shared_album_page_share": "Megosztás",
"create_shared_album_page_share_add_assets": "ELEMEK HOZZÁADÁSA",
"create_shared_album_page_share_select_photos": "Fotók kiválasztása",
"create_shared_album_page_share_select_photos": "Fotók választása",
"curated_location_page_title": "Helyek",
"curated_object_page_title": "Dolgok",
"daily_title_text_date": "E, MMM dd",
@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "RÉSZLETEK",
"exif_bottom_sheet_location": "HELYSZÍN",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Fejlesztés alatt",
"experimental_settings_new_asset_list_title": "Enable experimental photo grid",
"experimental_settings_subtitle": "Csak saját felelősségre használd",
@@ -230,10 +231,10 @@
"login_disabled": "A bejelentkezés letiltva",
"login_form_api_exception": "API hiba. Kérljük, ellenőrid a szerver címét, majd próbáld újra.",
"login_form_back_button_text": "Back",
"login_form_button_text": "Belépés",
"login_form_email_hint": "teemailed@email.com",
"login_form_button_text": "Bejelentkezés",
"login_form_email_hint": "email@cimed.hu",
"login_form_endpoint_hint": "http://szerver-címe:port/api",
"login_form_endpoint_url": "Kiszolgáló végpont címe",
"login_form_endpoint_url": "Szerver címe",
"login_form_err_http": "Kérem, adjon meg egy http:// vagy https:// címet",
"login_form_err_invalid_email": "Érvénytelen email cím",
"login_form_err_invalid_url": "Érvénytelen cím",
@@ -346,7 +347,7 @@
"search_suggestion_list_smart_search_hint_1": "Az intelligens keresés alapértelmezetten be van kapcsolva, metaadatokat így kereshetsz",
"search_suggestion_list_smart_search_hint_2": "m:keresési-kifejezés",
"select_additional_user_for_sharing_page_suggestions": "Javaslatok",
"select_user_for_sharing_page_err_album": "Hiba az album létrehozása közben",
"select_user_for_sharing_page_err_album": "Nem sikerült létrehozni az albumot",
"select_user_for_sharing_page_share_suggestions": "Javaslatok",
"server_info_box_app_version": "Alkalmazás Verzió",
"server_info_box_latest_release": "Latest Version",
@@ -373,7 +374,7 @@
"settings_require_restart": "Kérlek indítsd újra az Immich-et hogy alkalmazd ezt a beállítást",
"share_add": "Hozzáadás",
"share_add_photos": "Fotók hozzáadása",
"share_add_title": "Cím hozzáadása",
"share_add_title": "Album neve",
"share_create_album": "Album létrehozása",
"shared_album_activities_input_disable": "Comment is disabled",
"shared_album_activities_input_hint": "Say something",
@@ -431,11 +432,11 @@
"share_done": "Done",
"share_invite": "Meghívás az albumba",
"sharing_page_album": "Megosztott albumok",
"sharing_page_description": "Hozzon létre megosztott albumokat, hogy megoszthasson fényképeket és videókat a hálózatában lévő emberekkel.",
"sharing_page_description": "Megosztott albumok létrehozásával fényképeket és videókatoszthatsz meg a hálózatodban lévő emberekkel.",
"sharing_page_empty_list": "ÜRES LISTA",
"sharing_silver_appbar_create_shared_album": "Megosztott album létrehozása",
"sharing_silver_appbar_shared_links": "Shared links",
"sharing_silver_appbar_share_partner": "Megosztás másokkal",
"sharing_silver_appbar_share_partner": "Megosztás partnerrel",
"tab_controller_nav_library": "Könyvtár",
"tab_controller_nav_photos": "Képek",
"tab_controller_nav_search": "Keresés",

View File

@@ -1,13 +1,13 @@
{
"action_common_cancel": "Cancel",
"action_common_update": "Update",
"action_common_cancel": "Annulla",
"action_common_update": "Aggiorna",
"add_to_album_bottom_sheet_added": "Aggiunto in {album}",
"add_to_album_bottom_sheet_already_exists": "Già presente in {album}",
"advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_log_level_title": "Livello log: {}",
"advanced_settings_prefer_remote_subtitle": "Alcuni dispositivi sono molto lenti a caricare le anteprime delle immagini dal dispositivo. Attivare questa impostazione per caricare invece le immagini remote.",
"advanced_settings_prefer_remote_title": "Preferisci immagini remote.",
"advanced_settings_self_signed_ssl_subtitle": "Skips SSL certificate verification for the server endpoint. Required for self-signed certificates.",
"advanced_settings_self_signed_ssl_title": "Allow self-signed SSL certificates",
"advanced_settings_self_signed_ssl_subtitle": "Salta la verifica dei certificati SSL del server. Richiesto con l'uso di certificati self-signed.",
"advanced_settings_self_signed_ssl_title": "Consenti certificati SSL self-signed",
"advanced_settings_tile_subtitle": "Impostazioni aggiuntive utenti",
"advanced_settings_tile_title": "Avanzato",
"advanced_settings_troubleshooting_subtitle": "Attiva funzioni addizionali per la risoluzione dei problemi",
@@ -35,7 +35,7 @@
"app_bar_signout_dialog_title": "Disconnetti",
"archive_page_no_archived_assets": "Nessuna oggetto archiviato",
"archive_page_title": "Archivia ({})",
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
"asset_action_delete_err_read_only": "Non posso eliminare degli elementi in sola lettura, ignorato",
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_list_layout_settings_dynamic_layout_title": "Layout dinamico",
"asset_list_layout_settings_group_automatically": "Automatico",
@@ -111,9 +111,9 @@
"cache_settings_album_thumbnails": "Anteprime pagine librerie ({} assets)",
"cache_settings_clear_cache_button": "Cancella cache",
"cache_settings_clear_cache_button_title": "Cancella la cache dell'app. Questo impatterà significativamente le prestazioni dell''app fino a quando la cache non sarà rigenerata.",
"cache_settings_duplicated_assets_clear_button": "CLEAR",
"cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app",
"cache_settings_duplicated_assets_title": "Duplicated Assets ({})",
"cache_settings_duplicated_assets_clear_button": "ELIMINA",
"cache_settings_duplicated_assets_subtitle": "Foto e video che sono nella black list dell'applicazione",
"cache_settings_duplicated_assets_title": "Elementi duplicati ({})",
"cache_settings_image_cache_size": "Dimensione cache delle foto ({} assets)",
"cache_settings_statistics_album": "Anteprime librerie",
"cache_settings_statistics_assets": "{} contenuti ({})",
@@ -142,15 +142,15 @@
"control_bottom_app_bar_archive": "Archivia",
"control_bottom_app_bar_create_new_album": "Crea nuovo album",
"control_bottom_app_bar_delete": "Elimina",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "Edit Date & Time",
"control_bottom_app_bar_delete_from_immich": "Elimina da Immich",
"control_bottom_app_bar_delete_from_local": "Elimina dal dispositivo",
"control_bottom_app_bar_edit_location": "Modifica posizione",
"control_bottom_app_bar_edit_time": "Modifica data e ora",
"control_bottom_app_bar_favorite": "Preferiti",
"control_bottom_app_bar_share": "Condividi",
"control_bottom_app_bar_share_to": "Share To",
"control_bottom_app_bar_stack": "Stack",
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
"control_bottom_app_bar_trash_from_immich": "Sposta nel cestino",
"control_bottom_app_bar_unarchive": "Rimuovi dagli archivi",
"control_bottom_app_bar_unfavorite": "Unfavorite",
"control_bottom_app_bar_upload": "Upload",
@@ -165,27 +165,27 @@
"daily_title_text_date_year": "E, dd MMM, yyyy",
"date_format": "E, d LLL, y • hh:mm",
"delete_dialog_alert": "Questi oggetti saranno cancellati definitivamente da Immich e dal tuo device",
"delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server",
"delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device",
"delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server",
"delete_dialog_alert_local": "Questi elementi verranno eliminati definitivamente dal dispositivo, ma saranno ancora disponibili sul server Immich",
"delete_dialog_alert_local_non_backed_up": "Alcuni degli elementi non sono stati caricati su Immich e saranno rimossi definitivamente dal tuo dispositivo",
"delete_dialog_alert_remote": "Questi elementi verranno eliminati permanentemente dal server Immich",
"delete_dialog_cancel": "Annulla",
"delete_dialog_ok": "Elimina",
"delete_dialog_ok_force": "Delete Anyway",
"delete_dialog_ok_force": "Elimina comunque",
"delete_dialog_title": "Cancella definitivamente",
"delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
"delete_local_dialog_ok_force": "Delete Anyway",
"delete_local_dialog_ok_backed_up_only": "Elimina solo quelli con backup",
"delete_local_dialog_ok_force": "Elimina comunque",
"delete_shared_link_dialog_content": "Sei sicuro di voler eliminare questo link condiviso?",
"delete_shared_link_dialog_title": "Elimina link condiviso",
"description_input_hint_text": "Aggiungi descrizione...",
"description_input_submit_error": "Errore modificare descrizione, controlli I log per maggiori dettagli",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_location_dialog_title": "Location",
"edit_date_time_dialog_date_time": "Data e ora",
"edit_date_time_dialog_timezone": "Fuso orario",
"edit_location_dialog_title": "Posizione",
"exif_bottom_sheet_description": "Aggiungi una descrizione...",
"exif_bottom_sheet_details": "DETTAGLI",
"exif_bottom_sheet_location": "POSIZIONE",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PERSONE",
"exif_bottom_sheet_location_add": "Aggiungi una posizione",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Work in progress",
"experimental_settings_new_asset_list_title": "Attiva griglia di foto sperimentale",
"experimental_settings_subtitle": "Usalo a tuo rischio!",
@@ -200,7 +200,7 @@
"home_page_archive_err_partner": "Can not archive partner assets, skipping",
"home_page_building_timeline": "Costruendo il Timeline",
"home_page_delete_err_partner": "Can not delete partner assets, skipping",
"home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
"home_page_delete_remote_err_local": "Immagini sul disco locale presenti pure nella selezione degli elementi remoti, skippando",
"home_page_favorite_err_local": "Non puoi aggiungere tra i preferiti le foto ancora non caricate",
"home_page_favorite_err_partner": "Can not favorite partner assets yet, skipping",
"home_page_first_time_notice": "Se è la prima volta che usi l'app, assicurati di scegliere gli album per avere il Timeline con immagini e video",
@@ -215,22 +215,22 @@
"library_page_favorites": "Preferiti",
"library_page_new_album": "Nuovo Album",
"library_page_sharing": "Condividendo",
"library_page_sort_asset_count": "Number of assets",
"library_page_sort_asset_count": "Numero di elementi",
"library_page_sort_created": "Creato il più recente",
"library_page_sort_last_modified": "Ultima modifica",
"library_page_sort_most_oldest_photo": "Oldest photo",
"library_page_sort_most_oldest_photo": "Foto più vecchia",
"library_page_sort_most_recent_photo": "Più recente",
"library_page_sort_title": "Titolo album",
"location_picker_choose_on_map": "Choose on map",
"location_picker_latitude": "Latitude",
"location_picker_latitude_error": "Enter a valid latitude",
"location_picker_latitude_hint": "Enter your latitude here",
"location_picker_longitude": "Longitude",
"location_picker_longitude_error": "Enter a valid longitude",
"location_picker_longitude_hint": "Enter your longitude here",
"location_picker_choose_on_map": "Scegli una mappa",
"location_picker_latitude": "Latitudine",
"location_picker_latitude_error": "Inserisci una latitudine valida",
"location_picker_latitude_hint": "Inserisci la tua latitudine qui",
"location_picker_longitude": "Longitudine",
"location_picker_longitude_error": "Inserisci una longitudine valida",
"location_picker_longitude_hint": "Inserisci la longitudine qui",
"login_disabled": "L'accesso è stato disattivato",
"login_form_api_exception": "API error, per favore ricontrolli URL del server e riprovi",
"login_form_back_button_text": "Back",
"login_form_back_button_text": "Indietro",
"login_form_button_text": "Login",
"login_form_email_hint": "tuaemail@email.com",
"login_form_endpoint_hint": "http://ip-del-tuo-server:port/api",
@@ -253,35 +253,35 @@
"login_form_server_error": "Non è possibile connettersi al server",
"login_password_changed_error": "C'è stato un errore durante l'aggiornamento della password",
"login_password_changed_success": "Password aggiornata con successo",
"map_assets_in_bound": "{} photo",
"map_assets_in_bounds": "{} photos",
"map_assets_in_bound": "{} foto",
"map_assets_in_bounds": "{} foto",
"map_cannot_get_user_location": "Cannot get user's location",
"map_location_dialog_cancel": "Annulla",
"map_location_dialog_yes": "Si",
"map_location_picker_page_use_location": "Use this location",
"map_location_service_disabled_content": "Location service needs to be enabled to display assets from your current location. Do you want to enable it now?",
"map_location_picker_page_use_location": "Usa questa posizione",
"map_location_service_disabled_content": "I servizi di geolocalizzazione devono essere attivati per visualizzare gli elementi per la tua posizione attuale. Vuoi attivarli adesso?",
"map_location_service_disabled_title": "Location Service disabled",
"map_no_assets_in_bounds": "Nessuna foto in questa zona",
"map_no_location_permission_content": "Location permission is needed to display assets from your current location. Do you want to allow it now?",
"map_no_location_permission_content": "L'accesso alla posizione è necessario per visualizzare gli elementi per la tua posizione attuale. Vuoi consentirlo adesso?",
"map_no_location_permission_title": "Location Permission denied",
"map_settings_dark_mode": "Modalità scura",
"map_settings_date_range_option_all": "All",
"map_settings_date_range_option_day": "Past 24 hours",
"map_settings_date_range_option_days": "Past {} days",
"map_settings_date_range_option_year": "Past year",
"map_settings_date_range_option_years": "Past {} years",
"map_settings_date_range_option_day": "Ultime 24 ore",
"map_settings_date_range_option_days": "Ultimi {} giorni",
"map_settings_date_range_option_year": "Ultimo anno",
"map_settings_date_range_option_years": "Ultimi {} anni",
"map_settings_dialog_cancel": "Cancel",
"map_settings_dialog_save": "Salva",
"map_settings_dialog_title": "Map Settings",
"map_settings_include_show_archived": "Include Archived",
"map_settings_only_relative_range": "Date range",
"map_settings_only_show_favorites": "Show Favorite Only",
"map_settings_theme_settings": "Map Theme",
"map_settings_theme_settings": "Tema della mappa",
"map_zoom_to_see_photos": "Zoom out to see photos",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Motion Foto",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"multiselect_grid_edit_date_time_err_read_only": "Non posso modificare la data degli elementi in sola lettura, ignorato",
"multiselect_grid_edit_gps_err_read_only": "Non posso modificare la posizione degli elementi in sola lettura, ignorato",
"notification_permission_dialog_cancel": "Annulla",
"notification_permission_dialog_content": "Per attivare le notifiche, vai alle Impostazioni e seleziona concedi",
"notification_permission_dialog_settings": "Impostazioni",
@@ -308,18 +308,18 @@
"permission_onboarding_permission_limited": "Permessi limitati. Perché Immich possa controllare e fare i backup di tutte le foto, concedere i permessi all'intera galleria dalle impostazioni ",
"permission_onboarding_request": "Immich richiede i permessi per vedere le tue foto e video",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_out_of_date_major": "Mobile App is out of date. Please update to the latest major version.",
"profile_drawer_client_out_of_date_minor": "Mobile App is out of date. Please update to the latest minor version.",
"profile_drawer_client_out_of_date_major": "L'applicazione non è aggiornata. Per favore aggiorna all'ultima versione principale.",
"profile_drawer_client_out_of_date_minor": "L'applicazione non è aggiornata. Per favore aggiorna all'ultima versione minore.",
"profile_drawer_client_server_up_to_date": "Client e server sono aggiornati",
"profile_drawer_documentation": "Documentazione",
"profile_drawer_github": "GitHub",
"profile_drawer_server_out_of_date_major": "Server is out of date. Please update to the latest major version.",
"profile_drawer_server_out_of_date_minor": "Server is out of date. Please update to the latest minor version.",
"profile_drawer_server_out_of_date_major": "Il server non è aggiornato. Per favore aggiorna all'ultima versione principale.",
"profile_drawer_server_out_of_date_minor": "Il server non è aggiornato. Per favore aggiorna all'ultima versione minore.",
"profile_drawer_settings": "Impostazioni ",
"profile_drawer_sign_out": "Logout",
"profile_drawer_trash": "Trash",
"recently_added_page_title": "Aggiunti di recente",
"scaffold_body_error_occurred": "Error occurred",
"scaffold_body_error_occurred": "Si è verificato un errore.",
"search_bar_hint": "Cerca le tue foto",
"search_page_categories": "Categoria",
"search_page_favorites": "Preferiti",
@@ -327,13 +327,13 @@
"search_page_no_objects": "Nessuna informazione relativa all'oggetto disponibile",
"search_page_no_places": "Nessun informazione sul luogo disponibile",
"search_page_people": "Persone",
"search_page_person_add_name_dialog_cancel": "Cancel",
"search_page_person_add_name_dialog_hint": "Name",
"search_page_person_add_name_dialog_save": "Save",
"search_page_person_add_name_dialog_title": "Add a name",
"search_page_person_add_name_dialog_cancel": "Annulla",
"search_page_person_add_name_dialog_hint": "Nome",
"search_page_person_add_name_dialog_save": "Salva",
"search_page_person_add_name_dialog_title": "Aggiungi un nome",
"search_page_person_add_name_subtitle": "Find them fast by name with search",
"search_page_person_add_name_title": "Add a name",
"search_page_person_edit_name": "Edit name",
"search_page_person_add_name_title": "Aggiungi un nome",
"search_page_person_edit_name": "Modifica nome",
"search_page_places": "Luoghi",
"search_page_recently_added": "Aggiunte di recente",
"search_page_screenshots": "Screenshot",
@@ -342,7 +342,7 @@
"search_page_videos": "Video",
"search_page_view_all_button": "Guarda tutto",
"search_page_your_activity": "Tua attività ",
"search_page_your_map": "Your Map",
"search_page_your_map": "La tua mappa",
"search_result_page_new_search_hint": "Nuova ricerca ",
"search_suggestion_list_smart_search_hint_1": "\nRicerca Smart è attiva di default, per usare la ricerca con i metadata usare la seguente sintassi",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
@@ -382,17 +382,17 @@
"shared_album_activity_remove_title": "Elimina attività",
"shared_album_activity_setting_subtitle": "Let others respond",
"shared_album_activity_setting_title": "Commenti e Mi piace",
"shared_album_section_people_action_error": "Error leaving/removing from album",
"shared_album_section_people_action_leave": "Remove user from album",
"shared_album_section_people_action_remove_user": "Remove user from album",
"shared_album_section_people_owner_label": "Owner",
"shared_album_section_people_title": "PEOPLE",
"shared_album_section_people_action_error": "Errore durante la rimozione/uscita dell'album",
"shared_album_section_people_action_leave": "Rimuovi utente dall'album",
"shared_album_section_people_action_remove_user": "Rimuovi utente dall'album",
"shared_album_section_people_owner_label": "Proprietario",
"shared_album_section_people_title": "PERSONE",
"share_dialog_preparing": "Preparo…",
"shared_link_app_bar_title": "Link condivisi",
"shared_link_clipboard_copied_massage": "Copied to clipboard",
"shared_link_clipboard_copied_massage": "Copiato negli appunti",
"shared_link_clipboard_text": "Link: {}\nPassword: {}",
"shared_link_create_app_bar_title": "Crea link di condivisione",
"shared_link_create_error": "Error while creating shared link",
"shared_link_create_error": "Si è verificato un errore durante la creazione del link condiviso",
"shared_link_create_info": "Consenti a chiunque abbia il link di vedere le foto selezionate",
"shared_link_create_submit_button": "Crea link di condivisione",
"shared_link_edit_allow_download": "Consenti ad utenti pubblici di scaricare i contenuti",
@@ -402,32 +402,32 @@
"shared_link_edit_description": "Descrizione",
"shared_link_edit_description_hint": "Inserisci la descrizione della condivisione",
"shared_link_edit_expire_after": "Scade dopo",
"shared_link_edit_expire_after_option_day": "1 day",
"shared_link_edit_expire_after_option_days": "{} days",
"shared_link_edit_expire_after_option_hour": "1 hour",
"shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_expire_after_option_day": "1 giorno",
"shared_link_edit_expire_after_option_days": "{} giorni",
"shared_link_edit_expire_after_option_hour": "1 ora",
"shared_link_edit_expire_after_option_hours": "{} ore",
"shared_link_edit_expire_after_option_minute": "1 minuto",
"shared_link_edit_expire_after_option_minutes": "{} minuti",
"shared_link_edit_expire_after_option_never": "Mai",
"shared_link_edit_password": "Password",
"shared_link_edit_password_hint": "Inserire la password di condivisione",
"shared_link_edit_show_meta": "Visualizza metadati",
"shared_link_edit_submit_button": "Aggiorna link",
"shared_link_empty": "Non hai alcun link condiviso",
"shared_link_error_server_url_fetch": "Cannot fetch the server url",
"shared_link_expired": "Expired",
"shared_link_expires_day": "Expires in {} day",
"shared_link_expires_days": "Expires in {} days",
"shared_link_expires_hour": "Expires in {} hour",
"shared_link_expires_hours": "Expires in {} hours",
"shared_link_expires_minute": "Expires in {} minute",
"shared_link_expires_minutes": "Expires in {} minutes",
"shared_link_expires_never": "Expires ∞",
"shared_link_expires_second": "Expires in {} second",
"shared_link_expires_seconds": "Expires in {} seconds",
"shared_link_info_chip_download": "Download",
"shared_link_expired": "Scaduto",
"shared_link_expires_day": "Scade tra {} giorno",
"shared_link_expires_days": "Scade tra {} giorni",
"shared_link_expires_hour": "Scade tra {} ora",
"shared_link_expires_hours": "Scade tra {} ore",
"shared_link_expires_minute": "Scade tra {} minuto",
"shared_link_expires_minutes": "Scade tra {} minuti",
"shared_link_expires_never": "Scadenza ∞",
"shared_link_expires_second": "Scade tra {} secondo",
"shared_link_expires_seconds": "Scade tra {} secondi",
"shared_link_info_chip_download": "Scarica",
"shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Upload",
"shared_link_info_chip_upload": "Carica",
"shared_link_manage_links": "Gestisci link condivisi",
"share_done": "Done",
"share_invite": "Invita nell'album ",
@@ -455,7 +455,7 @@
"trash_page_delete": "Elimina",
"trash_page_delete_all": "Elimina tutti",
"trash_page_empty_trash_btn": "Svuota cestino",
"trash_page_empty_trash_dialog_content": "Do you want to empty your trashed assets? These items will be permanently removed from Immich",
"trash_page_empty_trash_dialog_content": "Vuoi eliminare gli elementi nel cestino? Questi elementi saranno eliminati definitivamente da Immich",
"trash_page_empty_trash_dialog_ok": "Ok",
"trash_page_info": "Gli elementi cestinati saranno eliminati definitivamente dopo {} giorni",
"trash_page_no_assets": "Nessun elemento cestinato",
@@ -477,4 +477,4 @@
"viewer_remove_from_stack": "Rimuovi dalla pila",
"viewer_stack_use_as_main_asset": "Use as Main Asset",
"viewer_unstack": "Un-Stack"
}
}

View File

@@ -1,13 +1,13 @@
{
"action_common_cancel": "Cancel",
"action_common_update": "Update",
"action_common_cancel": "キャンセル",
"action_common_update": "更新",
"add_to_album_bottom_sheet_added": "{album}に追加",
"add_to_album_bottom_sheet_already_exists": "{album}に追加済み",
"advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_prefer_remote_subtitle": "Some devices are painfully slow to load thumbnails from assets on the device. Activate this setting to load remote images instead.",
"advanced_settings_prefer_remote_title": "Prefer remote images",
"advanced_settings_self_signed_ssl_subtitle": "Skips SSL certificate verification for the server endpoint. Required for self-signed certificates.",
"advanced_settings_self_signed_ssl_title": "Allow self-signed SSL certificates",
"advanced_settings_log_level_title": "ログレベル: {}",
"advanced_settings_prefer_remote_subtitle": "端末によっては端末上に存在するサムネイルのロードに非常に時間がかかります。このオプションをに有効にする事によってサーバーから直接画像をロードすることが可能です",
"advanced_settings_prefer_remote_title": "リモートを優先する",
"advanced_settings_self_signed_ssl_subtitle": "SSLのチェックをスキップする。Self-signedな署名で必要です",
"advanced_settings_self_signed_ssl_title": "Self-signed署名を許可する",
"advanced_settings_tile_subtitle": "追加ユーザー設定",
"advanced_settings_tile_title": "詳細設定",
"advanced_settings_troubleshooting_subtitle": "トラブルシューティング用の詳細設定をオンにする",
@@ -26,17 +26,17 @@
"album_viewer_appbar_share_err_title": "タイトル変更の失敗",
"album_viewer_appbar_share_leave": "アルバムから脱退",
"album_viewer_appbar_share_remove": "アルバムから削除",
"album_viewer_appbar_share_to": "Share To",
"album_viewer_appbar_share_to": "次の方々と共有します",
"album_viewer_page_share_add_users": "ユーザーを追加",
"all_people_page_title": "People",
"all_people_page_title": "ピープル",
"all_videos_page_title": "ビデオ",
"app_bar_signout_dialog_content": " サインアウトしますか?",
"app_bar_signout_dialog_ok": "はい",
"app_bar_signout_dialog_title": " サインアウト",
"archive_page_no_archived_assets": "アーカイブ済みの写真またはビデオがありません",
"archive_page_title": "アーカイブ({})",
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_action_delete_err_read_only": "読み取り専用の項目は削除できません。スキップします",
"asset_action_share_err_offline": "オフラインの項目をゲットできません。スキップします",
"asset_list_layout_settings_dynamic_layout_title": "ダイナミックレイアウト",
"asset_list_layout_settings_group_automatically": "自動",
"asset_list_layout_settings_group_by": "写真のグループ分け",
@@ -103,17 +103,17 @@
"backup_controller_page_uploading_file_info": "アップロード中のファイル",
"backup_err_only_album": "最低1つのアルバムを選択してください",
"backup_info_card_assets": "写真と動画",
"backup_manual_cancelled": "Cancelled",
"backup_manual_failed": "Failed",
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
"backup_manual_success": "Success",
"backup_manual_title": "Upload status",
"backup_manual_cancelled": "キャンセルされました",
"backup_manual_failed": "失敗",
"backup_manual_in_progress": "アップロードが進行中です。後でもう一度試してください",
"backup_manual_success": "成功",
"backup_manual_title": "アップロード状況",
"cache_settings_album_thumbnails": "ライブラリのサムネイル ({}枚)",
"cache_settings_clear_cache_button": "キャッシュをクリア",
"cache_settings_clear_cache_button_title": "キャッシュを削除(キャッシュ再生成までアプリのパフォーマンスが著しく低下)",
"cache_settings_duplicated_assets_clear_button": "CLEAR",
"cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app",
"cache_settings_duplicated_assets_title": "Duplicated Assets ({})",
"cache_settings_duplicated_assets_clear_button": "クリア",
"cache_settings_duplicated_assets_subtitle": "アプリがブラックリストに追加している項目",
"cache_settings_duplicated_assets_title": "{}項目が重複",
"cache_settings_image_cache_size": "キャッシュのサイズ ({}枚) ",
"cache_settings_statistics_album": "ライブラリのサムネイル",
"cache_settings_statistics_assets": "{} 枚 ({}枚中)",
@@ -123,8 +123,8 @@
"cache_settings_statistics_title": "キャッシュ",
"cache_settings_subtitle": "キャッシュの動作を変更する",
"cache_settings_thumbnail_size": "サムネイルのキャッシュのサイズ ({}枚)",
"cache_settings_tile_subtitle": "Control the local storage behaviour",
"cache_settings_tile_title": "Local Storage",
"cache_settings_tile_subtitle": "ローカルストレージの挙動を確認する",
"cache_settings_tile_title": "ローカルストレージ",
"cache_settings_title": "キャッシュの設定",
"change_password_form_confirm_password": "確定",
"change_password_form_description": "{name}さん こんにちは\n\nサーバーにアクセスするのが初めてか、パスワードリセットのリクエストがされました。新しいパスワードを入力してください",
@@ -142,18 +142,18 @@
"control_bottom_app_bar_archive": "アーカイブ",
"control_bottom_app_bar_create_new_album": "アルバムを作成",
"control_bottom_app_bar_delete": "削除",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "Edit Date & Time",
"control_bottom_app_bar_delete_from_immich": "Immichから削除",
"control_bottom_app_bar_delete_from_local": "端末から削除",
"control_bottom_app_bar_edit_location": "位置情報を編集",
"control_bottom_app_bar_edit_time": "日時を変更",
"control_bottom_app_bar_favorite": "お気に入り",
"control_bottom_app_bar_share": "共有",
"control_bottom_app_bar_share_to": "Share To",
"control_bottom_app_bar_stack": "Stack",
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
"control_bottom_app_bar_share_to": "次のユーザーに共有: ",
"control_bottom_app_bar_stack": "スタック",
"control_bottom_app_bar_trash_from_immich": "ゴミ箱に捨てる",
"control_bottom_app_bar_unarchive": "アーカイブを解除",
"control_bottom_app_bar_unfavorite": "Unfavorite",
"control_bottom_app_bar_upload": "Upload",
"control_bottom_app_bar_unfavorite": "お気に入りから外す",
"control_bottom_app_bar_upload": "アップロード",
"create_album_page_untitled": "タイトルなし",
"create_shared_album_page_create": "作成",
"create_shared_album_page_share": "共有",
@@ -165,26 +165,27 @@
"daily_title_text_date_year": "yyyy年 MM月 DD日, EE",
"date_format": "MM月 DD日, EE • hh時mm分",
"delete_dialog_alert": "サーバーとデバイスの両方から永久的に削除されます!",
"delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server",
"delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device",
"delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server",
"delete_dialog_alert_local": "選択された項目は端末から削除されますがImmichには残ります",
"delete_dialog_alert_local_non_backed_up": "Immichにバックアップされていない項目があります。それらの項目はデバイスからも永久に削除されます",
"delete_dialog_alert_remote": "選択された項目はImmichから永久に削除されます",
"delete_dialog_cancel": "キャンセル",
"delete_dialog_ok": "削除",
"delete_dialog_ok_force": "Delete Anyway",
"delete_dialog_ok_force": "削除します",
"delete_dialog_title": "永久的に削除",
"delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
"delete_local_dialog_ok_force": "Delete Anyway",
"delete_local_dialog_ok_backed_up_only": "バックアップ済みのみを削除",
"delete_local_dialog_ok_force": "削除します",
"delete_shared_link_dialog_content": "本当にこの共有リンクを消しますか?",
"delete_shared_link_dialog_title": "共有リンクを消す",
"description_input_hint_text": "説明を追加",
"description_input_submit_error": "説明の編集に失敗、詳細の確認はログで行ってください",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_location_dialog_title": "Location",
"edit_date_time_dialog_date_time": "日付と時間",
"edit_date_time_dialog_timezone": "タイムゾーン",
"edit_location_dialog_title": "位置情報",
"exif_bottom_sheet_description": "説明を追加",
"exif_bottom_sheet_details": "詳細",
"exif_bottom_sheet_location": "撮影場所",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_location_add": "位置情報を追加",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "製作途中(WIP)",
"experimental_settings_new_asset_list_title": "試験的なグリッドを有効化",
"experimental_settings_subtitle": "試験的機能につき自己責任で!",
@@ -194,42 +195,42 @@
"home_page_add_to_album_conflicts": "{album}に{added}枚写真を追加しました。追加済みの{failed}枚はスキップしました。",
"home_page_add_to_album_err_local": "まだアップロードされてない項目はアルバムに登録できません",
"home_page_add_to_album_success": "{album}に{added}枚写真を追加しました",
"home_page_album_err_partner": "Can not add partner assets to an album yet, skipping",
"home_page_album_err_partner": "まだパートナーの写真はアルバムに追加できません。スキップします(アップデート待ってね)",
"home_page_archive_err_local": "まだアップロードされてない項目はアーカイブできません",
"home_page_archive_err_partner": "Can not archive partner assets, skipping",
"home_page_archive_err_partner": "パートナーの写真はアーカイブできません。スキップします",
"home_page_building_timeline": "タイムライン構築中",
"home_page_delete_err_partner": "Can not delete partner assets, skipping",
"home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
"home_page_delete_err_partner": "パートナーの写真は削除できません。スキップします",
"home_page_delete_remote_err_local": "リモート削除の選択にローカルなアイテムが含まれています。スキップします",
"home_page_favorite_err_local": "まだアップロードされてない項目はお気に入り登録できません",
"home_page_favorite_err_partner": "Can not favorite partner assets yet, skipping",
"home_page_favorite_err_partner": "まだパートナーの写真をお気に入り登録できません。スキップします(アップデート待ってね)",
"home_page_first_time_notice": "はじめてアプリを使う場合、タイムラインに写真を表示するためにアルバムを選択してください",
"home_page_share_err_local": "Can not share local assets via link, skipping",
"home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping",
"home_page_share_err_local": "ローカルのみの項目をリンクで共有はできません。スキップします",
"home_page_upload_err_limit": "一回でアップロードできる写真の数は30枚です。スキップします",
"image_viewer_page_state_provider_download_error": "ダウンロード失敗",
"image_viewer_page_state_provider_download_success": "ダウンロード成功",
"image_viewer_page_state_provider_share_error": "Share Error",
"image_viewer_page_state_provider_share_error": "共有エラー",
"library_page_albums": "アルバム",
"library_page_archive": "アーカイブ",
"library_page_device_albums": "デバイス上のアルバム",
"library_page_favorites": "お気に入り",
"library_page_new_album": "新しいアルバム",
"library_page_sharing": "共有中",
"library_page_sort_asset_count": "Number of assets",
"library_page_sort_asset_count": "項目の数",
"library_page_sort_created": "作成日時",
"library_page_sort_last_modified": "Last modified",
"library_page_sort_most_oldest_photo": "Oldest photo",
"library_page_sort_most_recent_photo": "Most recent photo",
"library_page_sort_last_modified": "最終変更",
"library_page_sort_most_oldest_photo": "一番古い項目",
"library_page_sort_most_recent_photo": "最近の項目",
"library_page_sort_title": "アルバム名",
"location_picker_choose_on_map": "Choose on map",
"location_picker_latitude": "Latitude",
"location_picker_latitude_error": "Enter a valid latitude",
"location_picker_latitude_hint": "Enter your latitude here",
"location_picker_longitude": "Longitude",
"location_picker_longitude_error": "Enter a valid longitude",
"location_picker_longitude_hint": "Enter your longitude here",
"login_disabled": "Login has been disabled",
"location_picker_choose_on_map": "マップを選択",
"location_picker_latitude": "緯度",
"location_picker_latitude_error": "有効な緯度を入力してください",
"location_picker_latitude_hint": "緯度をここに入力",
"location_picker_longitude": "経度",
"location_picker_longitude_error": "有効な経度を入力してください",
"location_picker_longitude_hint": "経度をここに入力",
"login_disabled": "ログインは無効化されました",
"login_form_api_exception": "APIエラー。URLをチェックしてもう一度試してください",
"login_form_back_button_text": "Back",
"login_form_back_button_text": "戻る",
"login_form_button_text": "ログイン",
"login_form_email_hint": "hoge@email.com",
"login_form_endpoint_hint": "https://example.com:port/api",
@@ -242,7 +243,7 @@
"login_form_failed_get_oauth_server_config": "OAuthログインに失敗しました。サーバーのURLを確認してください。",
"login_form_failed_get_oauth_server_disable": "このサーバーではOAuthが使えません",
"login_form_failed_login": "ログインエラー。サーバーのURL・メールアドレス・パスワードを再確認してください。",
"login_form_handshake_exception": "There was an Handshake Exception with the server. Enable self-signed certificate support in the settings if you are using a self-signed certificate.",
"login_form_handshake_exception": "Handshake Exceptionエラー。self-signed署名を設定で有効にしてください",
"login_form_label_email": "メールアドレス",
"login_form_label_password": "パスワード",
"login_form_next_button": "次",
@@ -250,53 +251,53 @@
"login_form_save_login": "ログインを保持",
"login_form_server_empty": "URLを入力",
"login_form_server_error": "サーバーに接続できません",
"login_password_changed_error": "There was an error updating your password",
"login_password_changed_success": "Password updated successfully",
"map_assets_in_bound": "{} photo",
"map_assets_in_bounds": "{} photos",
"map_cannot_get_user_location": "Cannot get user's location",
"map_location_dialog_cancel": "Cancel",
"map_location_dialog_yes": "Yes",
"map_location_picker_page_use_location": "Use this location",
"map_location_service_disabled_content": "Location service needs to be enabled to display assets from your current location. Do you want to enable it now?",
"map_location_service_disabled_title": "Location Service disabled",
"map_no_assets_in_bounds": "No photos in this area",
"map_no_location_permission_content": "Location permission is needed to display assets from your current location. Do you want to allow it now?",
"map_no_location_permission_title": "Location Permission denied",
"map_settings_dark_mode": "Dark mode",
"map_settings_date_range_option_all": "All",
"map_settings_date_range_option_day": "Past 24 hours",
"map_settings_date_range_option_days": "Past {} days",
"map_settings_date_range_option_year": "Past year",
"map_settings_date_range_option_years": "Past {} years",
"map_settings_dialog_cancel": "Cancel",
"map_settings_dialog_save": "Save",
"map_settings_dialog_title": "Map Settings",
"map_settings_include_show_archived": "Include Archived",
"login_password_changed_error": "パスワードの変更でエラーが発生しました",
"login_password_changed_success": "パスワードの変更に成功",
"map_assets_in_bound": "{}項目",
"map_assets_in_bounds": "{}項目",
"map_cannot_get_user_location": "位置情報がゲットできません",
"map_location_dialog_cancel": "キャンセル",
"map_location_dialog_yes": "はい",
"map_location_picker_page_use_location": "この位置情報を使う",
"map_location_service_disabled_content": "現在地の項目を表示するには位置情報がオンである必要があります。有効化しますか?",
"map_location_service_disabled_title": "位置情報がオフです",
"map_no_assets_in_bounds": "このエリアに写真はありません",
"map_no_location_permission_content": "現在地の項目を表示するには位置情報へのアクセスが必要です。許可しますか?",
"map_no_location_permission_title": "位置情報へのアクセスが拒否されました",
"map_settings_dark_mode": "ダークモード",
"map_settings_date_range_option_all": "全て",
"map_settings_date_range_option_day": "過去24時間",
"map_settings_date_range_option_days": "過去{}日間",
"map_settings_date_range_option_year": "過去1年",
"map_settings_date_range_option_years": "過去{}年間",
"map_settings_dialog_cancel": "キャンセル",
"map_settings_dialog_save": "セーブ",
"map_settings_dialog_title": "マップの設定",
"map_settings_include_show_archived": "アーカイブ済みを含める",
"map_settings_only_relative_range": "Date range",
"map_settings_only_show_favorites": "Show Favorite Only",
"map_settings_theme_settings": "Map Theme",
"map_zoom_to_see_photos": "Zoom out to see photos",
"map_settings_only_show_favorites": "お気に入りのみを表示",
"map_settings_theme_settings": "マップの見た目",
"map_zoom_to_see_photos": "写真を見るにはズームアウト",
"monthly_title_text_date_format": "yyyy年 MM月",
"motion_photos_page_title": "モーションフォト",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"multiselect_grid_edit_date_time_err_read_only": "読み取り専用の項目の日付を変更できません",
"multiselect_grid_edit_gps_err_read_only": "読み取り専用の項目の位置情報を変更できません",
"notification_permission_dialog_cancel": "キャンセル",
"notification_permission_dialog_content": "通知を許可するには設定を開いてオンにしてください",
"notification_permission_dialog_settings": "設定",
"notification_permission_list_tile_content": "通知の許可 をオンにしてください",
"notification_permission_list_tile_enable_button": "通知をオンにする",
"notification_permission_list_tile_title": "通知の許可",
"partner_page_add_partner": "Add partner",
"partner_page_empty_message": "Your photos are not yet shared with any partner.",
"partner_page_no_more_users": "No more users to add",
"partner_page_partner_add_failed": "Failed to add partner",
"partner_page_select_partner": "Select partner",
"partner_page_shared_to_title": "Shared to",
"partner_page_stop_sharing_content": "{} will no longer be able to access your photos.",
"partner_page_stop_sharing_title": "Stop sharing your photos?",
"partner_page_title": "Partner",
"permission_onboarding_back": "Back",
"partner_page_add_partner": "パートナーを追加",
"partner_page_empty_message": "まだどのパートナーとも写真を共有してません",
"partner_page_no_more_users": "追加できるユーザーがもういません",
"partner_page_partner_add_failed": "パートナーの追加に失敗",
"partner_page_select_partner": "パートナーを選択",
"partner_page_shared_to_title": "次のユーザーと共有しす: ",
"partner_page_stop_sharing_content": "{}は写真へのアクセスができなくなります",
"partner_page_stop_sharing_title": "写真の共有を無効化しますか?",
"partner_page_title": "パートナー",
"permission_onboarding_back": "戻る",
"permission_onboarding_continue_anyway": "無視して続行",
"permission_onboarding_get_started": "はじめる",
"permission_onboarding_go_to_settings": "システム設定",
@@ -307,32 +308,32 @@
"permission_onboarding_permission_limited": "写真へのアクセスが制限されています。Immichに写真のバックアップと管理を行わせるにはシステム設定から写真と動画のアクセス権限を変更してください。",
"permission_onboarding_request": "Immichは写真へのアクセス許可が必要です",
"profile_drawer_app_logs": "ログ",
"profile_drawer_client_out_of_date_major": "Mobile App is out of date. Please update to the latest major version.",
"profile_drawer_client_out_of_date_minor": "Mobile App is out of date. Please update to the latest minor version.",
"profile_drawer_client_out_of_date_major": "アプリが更新されてません。最新のバージョンに更新してください",
"profile_drawer_client_out_of_date_minor": "アプリが更新されてません。最新のマイナーバージョンに更新してください",
"profile_drawer_client_server_up_to_date": "すべて最新です",
"profile_drawer_documentation": "Documentation",
"profile_drawer_documentation": "Immcihの説明書",
"profile_drawer_github": "GitHub",
"profile_drawer_server_out_of_date_major": "Server is out of date. Please update to the latest major version.",
"profile_drawer_server_out_of_date_minor": "Server is out of date. Please update to the latest minor version.",
"profile_drawer_server_out_of_date_major": "サーバーが更新されてません。最新のバージョンに更新してください",
"profile_drawer_server_out_of_date_minor": "サーバーが更新されてません。最新のマイナーバージョンに更新してください",
"profile_drawer_settings": "設定",
"profile_drawer_sign_out": "サインアウト",
"profile_drawer_trash": "Trash",
"profile_drawer_trash": "ゴミ箱",
"recently_added_page_title": "最近",
"scaffold_body_error_occurred": "Error occurred",
"scaffold_body_error_occurred": "エラーが発生しました",
"search_bar_hint": "写真を検索",
"search_page_categories": "カテゴリ",
"search_page_favorites": "お気に入り",
"search_page_motion_photos": "モーションフォト",
"search_page_no_objects": "被写体に関するデータがなし",
"search_page_no_places": "場所に関するデータなし",
"search_page_people": "People",
"search_page_person_add_name_dialog_cancel": "Cancel",
"search_page_person_add_name_dialog_hint": "Name",
"search_page_person_add_name_dialog_save": "Save",
"search_page_person_add_name_dialog_title": "Add a name",
"search_page_person_add_name_subtitle": "Find them fast by name with search",
"search_page_person_add_name_title": "Add a name",
"search_page_person_edit_name": "Edit name",
"search_page_people": "ピープル",
"search_page_person_add_name_dialog_cancel": "キャンセル",
"search_page_person_add_name_dialog_hint": "名前",
"search_page_person_add_name_dialog_save": "セーブ",
"search_page_person_add_name_dialog_title": "名前を追加",
"search_page_person_add_name_subtitle": "名前で検索して高速に探す",
"search_page_person_add_name_title": "名前を追加",
"search_page_person_edit_name": "名前を変更",
"search_page_places": "撮影地",
"search_page_recently_added": "最近追加",
"search_page_screenshots": "スクリーンショット",
@@ -341,7 +342,7 @@
"search_page_videos": "ビデオ",
"search_page_view_all_button": "すべて表示",
"search_page_your_activity": "アクティビティ",
"search_page_your_map": "Your Map",
"search_page_your_map": "あなたのマップ",
"search_result_page_new_search_hint": "検索",
"search_suggestion_list_smart_search_hint_1": "スマート検索はデフォルトでオンになっています。メタデータで検索を行う場合:",
"search_suggestion_list_smart_search_hint_2": "m:単語",
@@ -349,7 +350,7 @@
"select_user_for_sharing_page_err_album": "アルバム作成に失敗",
"select_user_for_sharing_page_share_suggestions": "ユーザ一覧",
"server_info_box_app_version": "アプリVer.",
"server_info_box_latest_release": "Latest Version",
"server_info_box_latest_release": "最新バージョン",
"server_info_box_server_url": " サーバのURL",
"server_info_box_server_version": "サーバーVer.",
"setting_image_viewer_help": "写真をタップするとサムネイル・中画質(要設定)・オリジナル(要設定)の順に読み込みます",
@@ -375,66 +376,66 @@
"share_add_photos": "写真を追加",
"share_add_title": "タイトルを追加",
"share_create_album": "アルバムを作成",
"shared_album_activities_input_disable": "Comment is disabled",
"shared_album_activities_input_hint": "Say something",
"shared_album_activity_remove_content": "Do you want to delete this activity?",
"shared_album_activity_remove_title": "Delete Activity",
"shared_album_activity_setting_subtitle": "Let others respond",
"shared_album_activity_setting_title": "Comments & likes",
"shared_album_section_people_action_error": "Error leaving/removing from album",
"shared_album_section_people_action_leave": "Remove user from album",
"shared_album_section_people_action_remove_user": "Remove user from album",
"shared_album_section_people_owner_label": "Owner",
"shared_album_section_people_title": "PEOPLE",
"shared_album_activities_input_disable": "コメントはオフになってます",
"shared_album_activities_input_hint": "何か書き込みましょう",
"shared_album_activity_remove_content": "このアクティビティを削除しますか",
"shared_album_activity_remove_title": "アクティビティを削除します",
"shared_album_activity_setting_subtitle": "他のユーザーの返信を許可する",
"shared_album_activity_setting_title": "お気に入りとコメント",
"shared_album_section_people_action_error": "アルバムからの退出に失敗",
"shared_album_section_people_action_leave": "ユーザーをアルバムから退出",
"shared_album_section_people_action_remove_user": "ユーザーをアルバムから退出",
"shared_album_section_people_owner_label": "オーナー",
"shared_album_section_people_title": "ピープル",
"share_dialog_preparing": "準備中",
"shared_link_app_bar_title": "共有リンク",
"shared_link_clipboard_copied_massage": "Copied to clipboard",
"shared_link_clipboard_text": "Link: {}\nPassword: {}",
"shared_link_clipboard_copied_massage": "クリップボードにコピーしました",
"shared_link_clipboard_text": "リンク: {}\nパスワード: {}",
"shared_link_create_app_bar_title": "共有リンクを作る",
"shared_link_create_error": "Error while creating shared link",
"shared_link_create_info": "Let anyone with the link see the selected photo(s)",
"shared_link_create_error": "共有用のリンク作成時にエラーが発生しました",
"shared_link_create_info": "誰でも写真を見れるようにする",
"shared_link_create_submit_button": "リンクを作る",
"shared_link_edit_allow_download": "Allow public user to download",
"shared_link_edit_allow_upload": "Allow public user to upload",
"shared_link_edit_allow_download": "写真のダウンロードの許可",
"shared_link_edit_allow_upload": "写真のアップロードを許可",
"shared_link_edit_app_bar_title": " リンクを編集する",
"shared_link_edit_change_expiry": "Change expiration time",
"shared_link_edit_description": " デスクリプション ",
"shared_link_edit_description_hint": "Enter the share description",
"shared_link_edit_expire_after": "Expire after",
"shared_link_edit_expire_after_option_day": "1 day",
"shared_link_edit_expire_after_option_days": "{} days",
"shared_link_edit_expire_after_option_hour": "1 hour",
"shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_change_expiry": "有効期限を変更",
"shared_link_edit_description": "概要欄",
"shared_link_edit_description_hint": "概要を追加",
"shared_link_edit_expire_after": "有効期限は",
"shared_link_edit_expire_after_option_day": "1",
"shared_link_edit_expire_after_option_days": "{}",
"shared_link_edit_expire_after_option_hour": "1時間",
"shared_link_edit_expire_after_option_hours": "{}時間",
"shared_link_edit_expire_after_option_minute": "1",
"shared_link_edit_expire_after_option_minutes": "{}",
"shared_link_edit_expire_after_option_never": "有効期限なし",
"shared_link_edit_password": " パスワード",
"shared_link_edit_password_hint": "共有パスワードを入力する",
"shared_link_edit_show_meta": " メタデータを見る",
"shared_link_edit_submit_button": "リンクをアップデートする",
"shared_link_empty": "共有リンクはありません ",
"shared_link_error_server_url_fetch": "Cannot fetch the server url",
"shared_link_expired": "Expired",
"shared_link_expires_day": "Expires in {} day",
"shared_link_expires_days": "Expires in {} days",
"shared_link_expires_hour": "Expires in {} hour",
"shared_link_expires_hours": "Expires in {} hours",
"shared_link_expires_minute": "Expires in {} minute",
"shared_link_expires_minutes": "Expires in {} minutes",
"shared_link_expires_never": "Expires ∞",
"shared_link_expires_second": "Expires in {} second",
"shared_link_expires_seconds": "Expires in {} seconds",
"shared_link_info_chip_download": "Download",
"shared_link_error_server_url_fetch": "サーバーのURLがゲットできません",
"shared_link_expired": "有効期限が切れました",
"shared_link_expires_day": "{}日間で切れます",
"shared_link_expires_days": "{}日間で有効期限が切れます",
"shared_link_expires_hour": "{}時間で切れます",
"shared_link_expires_hours": "{}時間で有効期限が切れます",
"shared_link_expires_minute": "{}分で切れます",
"shared_link_expires_minutes": "{}分で切れます",
"shared_link_expires_never": "有効期限はありません",
"shared_link_expires_second": "{}秒で切れます",
"shared_link_expires_seconds": "{}秒で切れます",
"shared_link_info_chip_download": "ダウンロード",
"shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Upload",
"shared_link_manage_links": "Manage Shared links",
"share_done": "Done",
"shared_link_info_chip_upload": "アップロード",
"shared_link_manage_links": "共有済みのリンクを管理",
"share_done": "完了",
"share_invite": "アルバムに招待",
"sharing_page_album": "共有アルバム",
"sharing_page_description": "共有アルバムを作成して同じネットワークにいる人たちに写真を共有",
"sharing_page_empty_list": "共有アルバムなし",
"sharing_silver_appbar_create_shared_album": "共有アルバムを作成",
"sharing_silver_appbar_shared_links": "Shared links",
"sharing_silver_appbar_shared_links": "共有リンク",
"sharing_silver_appbar_share_partner": "パートナーと共有",
"tab_controller_nav_library": "ライブラリ",
"tab_controller_nav_photos": "写真",
@@ -450,30 +451,30 @@
"theme_setting_theme_title": "テーマ",
"theme_setting_three_stage_loading_subtitle": "三段階読み込みを有効にするとパフォーマンスが改善する可能性がありますが、ネットワーク負荷が著しく増加します",
"theme_setting_three_stage_loading_title": "三段階読み込みをオンにする",
"translated_text_options": "Options",
"trash_page_delete": "Delete",
"trash_page_delete_all": "Delete All",
"trash_page_empty_trash_btn": "Empty trash",
"trash_page_empty_trash_dialog_content": "Do you want to empty your trashed assets? These items will be permanently removed from Immich",
"trash_page_empty_trash_dialog_ok": "Ok",
"trash_page_info": "Trashed items will be permanently deleted after {} days",
"trash_page_no_assets": "No trashed assets",
"trash_page_restore": "Restore",
"trash_page_restore_all": "Restore All",
"trash_page_select_assets_btn": "Select assets",
"trash_page_select_btn": "Select",
"trash_page_title": "Trash ({})",
"upload_dialog_cancel": "Cancel",
"upload_dialog_info": "Do you want to backup the selected Asset(s) to the server?",
"upload_dialog_ok": "Upload",
"upload_dialog_title": "Upload Asset",
"translated_text_options": "オプション",
"trash_page_delete": "削除",
"trash_page_delete_all": "全て削除",
"trash_page_empty_trash_btn": "コミ箱を空にする",
"trash_page_empty_trash_dialog_content": "ゴミ箱を空にしますか?選択された項目は完全に削除されます。この操作は取り消せません",
"trash_page_empty_trash_dialog_ok": "了解",
"trash_page_info": "ゴミ箱に移動したアイテムは{}日後に削除されます",
"trash_page_no_assets": "ゴミ箱は空です",
"trash_page_restore": "復元",
"trash_page_restore_all": "全て復元",
"trash_page_select_assets_btn": "項目を選択",
"trash_page_select_btn": "選択",
"trash_page_title": "削除({})",
"upload_dialog_cancel": "キャンセル",
"upload_dialog_info": "選択した項目のバックアップをしますか?",
"upload_dialog_ok": "アップロード",
"upload_dialog_title": "アップロード",
"version_announcement_overlay_ack": "了解",
"version_announcement_overlay_release_notes": "更新情報",
"version_announcement_overlay_text_1": "こんにちは、またはこんばんは!新しい",
"version_announcement_overlay_text_2": "のバージョンが公開中です。",
"version_announcement_overlay_text_3": "を確認してみてください。docker-composeや.envファイルが最新の状態に更新されているか、特にWatchTowerなどのツールを使ってDockerイメージを自動アップデートしてる人は確認してください。",
"version_announcement_overlay_title": "サーバーの新バージョンリリース\uD83C\uDF89",
"viewer_remove_from_stack": "Remove from Stack",
"viewer_stack_use_as_main_asset": "Use as Main Asset",
"viewer_unstack": "Un-Stack"
"viewer_remove_from_stack": "スタックから外す",
"viewer_stack_use_as_main_asset": "メインの画像として使用する",
"viewer_unstack": "スタックを解除"
}

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "상세정보",
"exif_bottom_sheet_location": "위치",
"exif_bottom_sheet_location_add": "위치 지정",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "진행중",
"experimental_settings_new_asset_list_title": "실험적 사진 그리드 적용",
"experimental_settings_subtitle": "문제시 책임지지 않습니다!",

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "INFORMĀCIJA",
"exif_bottom_sheet_location": "ATRAŠANĀS VIETA",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Izstrādes posmā",
"experimental_settings_new_asset_list_title": "Iespējot eksperimentālo fotorežģi",
"experimental_settings_subtitle": "Izmanto uzņemoties risku!",

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "LOCATION",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Work in progress",
"experimental_settings_new_asset_list_title": "Enable experimental photo grid",
"experimental_settings_subtitle": "Use at your own risk!",

View File

@@ -35,8 +35,8 @@
"app_bar_signout_dialog_title": "Logg ut",
"archive_page_no_archived_assets": "Ingen arkiverte objekter funnet",
"archive_page_title": "Arkiv ({})",
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_action_delete_err_read_only": "Kan ikke slette objekt(er) med kun lese-rettighet, hopper over",
"asset_action_share_err_offline": "Kan ikke hente offline objekt(er), hopper over",
"asset_list_layout_settings_dynamic_layout_title": "Dynamisk bildeorganisering",
"asset_list_layout_settings_group_automatically": "Automatisk",
"asset_list_layout_settings_group_by": "Grupper bilder etter",
@@ -142,15 +142,15 @@
"control_bottom_app_bar_archive": "Arkiver",
"control_bottom_app_bar_create_new_album": "Lag nytt album",
"control_bottom_app_bar_delete": "Slett",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_delete_from_immich": "Slett fra Immich",
"control_bottom_app_bar_delete_from_local": "Slett fra enhet",
"control_bottom_app_bar_edit_location": "Endre lokasjon",
"control_bottom_app_bar_edit_time": "Endre Dato og tid",
"control_bottom_app_bar_favorite": "Favoritt",
"control_bottom_app_bar_share": "Del",
"control_bottom_app_bar_share_to": "Del til",
"control_bottom_app_bar_stack": "Stable",
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
"control_bottom_app_bar_trash_from_immich": "Flytt til søppelkasse",
"control_bottom_app_bar_unarchive": "Fjern fra arkiv",
"control_bottom_app_bar_unfavorite": "Fjern favoritt",
"control_bottom_app_bar_upload": "Last opp",
@@ -165,15 +165,15 @@
"daily_title_text_date_year": "E, MMM dd, yyyy",
"date_format": "E, LLL d, y • h:mm a",
"delete_dialog_alert": "Disse objektene vil bli slettet permanent fra Immich og fra enheten din",
"delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server",
"delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device",
"delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server",
"delete_dialog_alert_local": "Disse objektene vil bli permanent slettet fra enheten din, men vil fortsatt være tilgjengelige fra Immich serveren",
"delete_dialog_alert_local_non_backed_up": "Noen av objektene er ikke sikkerhetskopiert til Immich og vil bli permanent fjernet fra enheten din",
"delete_dialog_alert_remote": "Disse objektene vil bli permanent slettet fra Immich serveren",
"delete_dialog_cancel": "Avbryt",
"delete_dialog_ok": "Slett",
"delete_dialog_ok_force": "Delete Anyway",
"delete_dialog_ok_force": "Slett uansett",
"delete_dialog_title": "Slett permanent",
"delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
"delete_local_dialog_ok_force": "Delete Anyway",
"delete_local_dialog_ok_backed_up_only": "Slett kun sikkerhetskopierte objekter",
"delete_local_dialog_ok_force": "Slett uansett",
"delete_shared_link_dialog_content": "Er du sikker på at du vil slette denne delte linken?",
"delete_shared_link_dialog_title": "Slett delt link",
"description_input_hint_text": "Legg til beskrivelse ...",
@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "DETALJER",
"exif_bottom_sheet_location": "PLASSERING",
"exif_bottom_sheet_location_add": "Legg til lokasjon",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Under utvikling",
"experimental_settings_new_asset_list_title": "Aktiver eksperimentell rutenettsvisning",
"experimental_settings_subtitle": "Bruk på egen risiko!",
@@ -199,7 +200,7 @@
"home_page_archive_err_partner": "Kan ikke arkivere partnerobjekter, hopper over",
"home_page_building_timeline": "Genererer tidslinjen",
"home_page_delete_err_partner": "Kan ikke slette partnerobjekter, hopper over",
"home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
"home_page_delete_remote_err_local": "Lokale objekter i fjernslettingsvalgene, hopper over",
"home_page_favorite_err_local": "Kan ikke sette favoritt på lokale objekter enda, hopper over",
"home_page_favorite_err_partner": "Kan ikke merke partnerobjekter som favoritt enda, hopper over",
"home_page_first_time_notice": "Hvis dette er første gangen du benytter appen, velg et album (eller flere) for sikkerhetskopiering, slik at tidslinjen kan fylles med dine bilder og videoer.",
@@ -275,12 +276,12 @@
"map_settings_include_show_archived": "Inkluder arkiverte",
"map_settings_only_relative_range": "Datoområde",
"map_settings_only_show_favorites": "Vis kun favoritter",
"map_settings_theme_settings": "Map Theme",
"map_settings_theme_settings": "Karttema",
"map_zoom_to_see_photos": "Zoom ut for å se bilder",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Bevegelige bilder",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"multiselect_grid_edit_date_time_err_read_only": "Kan ikke endre dato på objekt(er) med kun lese-rettigheter, hopper over",
"multiselect_grid_edit_gps_err_read_only": "Kan ikke endre lokasjon på objekt(er) med kun lese-rettigheter, hopper over",
"notification_permission_dialog_cancel": "Avbryt",
"notification_permission_dialog_content": "For å aktivere notifikasjoner, gå til Innstillinger og velg tillat.",
"notification_permission_dialog_settings": "Innstillinger",

View File

@@ -1,6 +1,6 @@
{
"action_common_cancel": "Annuleren",
"action_common_update": "Updaten",
"action_common_update": "Bijwerken",
"add_to_album_bottom_sheet_added": "Toegevoegd aan {album}",
"add_to_album_bottom_sheet_already_exists": "Staat al in {album}",
"advanced_settings_log_level_title": "Log niveau: {}",
@@ -26,17 +26,17 @@
"album_viewer_appbar_share_err_title": "Albumtitel wijzigen mislukt",
"album_viewer_appbar_share_leave": "Verlaat album",
"album_viewer_appbar_share_remove": "Verwijder uit album",
"album_viewer_appbar_share_to": "Deel Naar",
"album_viewer_appbar_share_to": "Delen met",
"album_viewer_page_share_add_users": "Gebruikers toevoegen",
"all_people_page_title": "Personen",
"all_videos_page_title": "Video's",
"app_bar_signout_dialog_content": "Weet je zeker dat je je wilt afmelden?",
"app_bar_signout_dialog_content": "Weet je zeker dat je wilt uitloggen?",
"app_bar_signout_dialog_ok": "Ja",
"app_bar_signout_dialog_title": "Log uit",
"archive_page_no_archived_assets": "Geen gearchiveerde assets gevonden",
"archive_page_title": "Archief ({})",
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_action_delete_err_read_only": "Kan alleen-lezen asset(s) niet verwijderen, overslaan",
"asset_action_share_err_offline": "Kan offline asset(s) niet ophalen, overslaan",
"asset_list_layout_settings_dynamic_layout_title": "Dynamische layout",
"asset_list_layout_settings_group_automatically": "Automatisch",
"asset_list_layout_settings_group_by": "Groupeer assets per",
@@ -104,7 +104,7 @@
"backup_err_only_album": "Kan het enige album niet verwijderen",
"backup_info_card_assets": "assets",
"backup_manual_cancelled": "Geannuleerd",
"backup_manual_failed": "Gefaald",
"backup_manual_failed": "Mislukt",
"backup_manual_in_progress": "Het uploaden is al bezig. Probeer het na een tijdje",
"backup_manual_success": "Succes",
"backup_manual_title": "Uploadstatus",
@@ -113,7 +113,7 @@
"cache_settings_clear_cache_button_title": "Wist de cache van de app. Dit zal de presentaties van de app aanzienlijk beïnvloeden totdat de cache opnieuw is opgebouwd.",
"cache_settings_duplicated_assets_clear_button": "MAAK VRIJ",
"cache_settings_duplicated_assets_subtitle": "Foto's en video's op de zwarte lijst van de app",
"cache_settings_duplicated_assets_title": "Gedupliceerde Assets ({})",
"cache_settings_duplicated_assets_title": "Gedupliceerde assets ({})",
"cache_settings_image_cache_size": "Grootte afbeeldingscache ({} assets)",
"cache_settings_statistics_album": "Bibliotheekthumbnails",
"cache_settings_statistics_assets": "{} assets ({})",
@@ -124,7 +124,7 @@
"cache_settings_subtitle": "Beheer het cachegedrag van de Immich app",
"cache_settings_thumbnail_size": "Thumbnail-cachegrootte ({} assets)",
"cache_settings_tile_subtitle": "Beheer het gedrag van lokale opslag",
"cache_settings_tile_title": "Lokale Opslag",
"cache_settings_tile_title": "Lokale opslag",
"cache_settings_title": "Cache-instellingen",
"change_password_form_confirm_password": "Bevestig wachtwoord",
"change_password_form_description": "Hallo {name},\n\nDit is ofwel de eerste keer dat je inlogt, of er is een verzoek gedaan om je wachtwoord te wijzigen. Vul hieronder een nieuw wachtwoord in.",
@@ -142,15 +142,15 @@
"control_bottom_app_bar_archive": "Archiveren",
"control_bottom_app_bar_create_new_album": "Nieuw album maken",
"control_bottom_app_bar_delete": "Verwijderen",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_edit_location": "Locatie Bewerken",
"control_bottom_app_bar_edit_time": "Datum & Tijd Bewerken",
"control_bottom_app_bar_delete_from_immich": "Verwijderen van Immich",
"control_bottom_app_bar_delete_from_local": "Verwijderen van apparaat",
"control_bottom_app_bar_edit_location": "Locatie bewerken",
"control_bottom_app_bar_edit_time": "Datum & tijd bewerken",
"control_bottom_app_bar_favorite": "Favoriet",
"control_bottom_app_bar_share": "Delen",
"control_bottom_app_bar_share_to": "Deel Naar",
"control_bottom_app_bar_share_to": "Delen met",
"control_bottom_app_bar_stack": "Stapel",
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
"control_bottom_app_bar_trash_from_immich": "Verplaatsen naar prullenbak",
"control_bottom_app_bar_unarchive": "Herstellen",
"control_bottom_app_bar_unfavorite": "Onfavoriet",
"control_bottom_app_bar_upload": "Uploaden",
@@ -165,26 +165,27 @@
"daily_title_text_date_year": "E dd MMM yyyy",
"date_format": "E d LLL y • H:mm",
"delete_dialog_alert": "Deze items zullen permanent verwijderd worden van Immich en je apparaat",
"delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server",
"delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device",
"delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server",
"delete_dialog_alert_local": "Deze items worden permanent verwijderd van je apparaat, maar blijven beschikbaar op de Immich server",
"delete_dialog_alert_local_non_backed_up": "Van sommige items is geen back-up gemaakt in Immich en zullen permanent van je apparaat worden verwijderd",
"delete_dialog_alert_remote": "Deze items worden permanent verwijderd van de Immich server",
"delete_dialog_cancel": "Annuleren",
"delete_dialog_ok": "Verwijderen",
"delete_dialog_ok_force": "Delete Anyway",
"delete_dialog_ok_force": "Toch verwijderen",
"delete_dialog_title": "Permanent verwijderen",
"delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
"delete_local_dialog_ok_force": "Delete Anyway",
"delete_local_dialog_ok_backed_up_only": "Verwijder alleen met back-up",
"delete_local_dialog_ok_force": "Toch verwijderen",
"delete_shared_link_dialog_content": "Weet je zeker dat je deze gedeelde link wilt verwijderen?",
"delete_shared_link_dialog_title": "Verwijder Gedeelde Link",
"delete_shared_link_dialog_title": "Verwijder gedeelde link",
"description_input_hint_text": "Beschrijving toevoegen...",
"description_input_submit_error": "Beschrijving bijwerken mislukt, controleer het logboek voor meer details",
"edit_date_time_dialog_date_time": "Datum en Tijd",
"edit_date_time_dialog_date_time": "Datum en tijd",
"edit_date_time_dialog_timezone": "Tijdzone",
"edit_location_dialog_title": "Locatie",
"exif_bottom_sheet_description": "Beschrijving toevoegen...",
"exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "LOCATIE",
"exif_bottom_sheet_location_add": "Locatie toevoegen",
"exif_bottom_sheet_people": "MENSEN",
"experimental_settings_new_asset_list_subtitle": "Werk in uitvoering",
"experimental_settings_new_asset_list_title": "Experimenteel fotoraster inschakelen",
"experimental_settings_subtitle": "Gebruik op eigen risico!",
@@ -199,7 +200,7 @@
"home_page_archive_err_partner": "Partner assets kunnen niet gearchiveerd worden, overslaan",
"home_page_building_timeline": "Tijdlijn opbouwen",
"home_page_delete_err_partner": "Partner assets kunnen niet verwijderd worden, overslaan",
"home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
"home_page_delete_remote_err_local": "Lokale assets staan in verwijder selectie externe assets, overslaan",
"home_page_favorite_err_local": "Lokale assets kunnen nog niet als favoriet worden aangemerkt, overslaan",
"home_page_favorite_err_partner": "Partner assets kunnen nog niet ge-favoriet worden, overslaan",
"home_page_first_time_notice": "Als dit de eerste keer is dat je de app gebruikt, zorg er dan voor dat je een back-up album kiest, zodat de tijdlijn gevuld kan worden met foto's en video's uit het album.",
@@ -259,10 +260,10 @@
"map_location_dialog_yes": "Ja",
"map_location_picker_page_use_location": "Gebruik deze locatie",
"map_location_service_disabled_content": "Locatie service moet ingeschakeld zijn om assets van je huidige locatie weer te geven. Wil je het nu inschakelen?",
"map_location_service_disabled_title": "Locatie Service uitgeschakeld",
"map_location_service_disabled_title": "Locatie service uitgeschakeld",
"map_no_assets_in_bounds": "Geen foto's in dit gebied",
"map_no_location_permission_content": "Locatie toestemming is nodig om assets van je huidige locatie weer te geven. Wil je het nu toestaan?",
"map_no_location_permission_title": "Locatie Toestemming geweigerd",
"map_no_location_permission_title": "Locatie toestemming geweigerd",
"map_settings_dark_mode": "Donkere modus",
"map_settings_date_range_option_all": "Alle",
"map_settings_date_range_option_day": "Afgelopen 24 uur",
@@ -270,17 +271,17 @@
"map_settings_date_range_option_year": "Afgelopen jaar",
"map_settings_date_range_option_years": "Afgelopen {} jaar",
"map_settings_dialog_cancel": "Annuleren",
"map_settings_dialog_save": "Sla op",
"map_settings_dialog_save": "Opslaan",
"map_settings_dialog_title": "Kaart Instellingen",
"map_settings_include_show_archived": "Weergeef Gearchiveerden",
"map_settings_include_show_archived": "Toon gearchiveerde",
"map_settings_only_relative_range": "Datum bereik",
"map_settings_only_show_favorites": "Toon enkel favorieten",
"map_settings_theme_settings": "Map Theme",
"map_settings_theme_settings": "Kaart thema",
"map_zoom_to_see_photos": "Zoom uit om foto's te zien",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Bewegende foto's",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"multiselect_grid_edit_date_time_err_read_only": "Kan datum van alleen-lezen asset(s) niet wijzigen, overslaan",
"multiselect_grid_edit_gps_err_read_only": "Kan locatie van alleen-lezen asset(s) niet wijzigen, overslaan",
"notification_permission_dialog_cancel": "Annuleren",
"notification_permission_dialog_content": "Om meldingen in te schakelen, ga naar Instellingen en selecteer toestaan.",
"notification_permission_dialog_settings": "Instellingen",
@@ -390,7 +391,7 @@
"shared_link_app_bar_title": "Gedeelde links",
"shared_link_clipboard_copied_massage": "Gekopieerd naar klembord",
"shared_link_clipboard_text": "Link: {}\nWachtwoord: {}",
"shared_link_create_app_bar_title": "Link maken om te delen",
"shared_link_create_app_bar_title": "Gedeelde link maken",
"shared_link_create_error": "Fout bij het maken van een gedeelde link",
"shared_link_create_info": "Laat iedereen met de link de geselecteerde foto(s) zien",
"shared_link_create_submit_button": "Link maken",
@@ -399,7 +400,7 @@
"shared_link_edit_app_bar_title": "Bewerk link",
"shared_link_edit_change_expiry": "Bewerk vervaltijd",
"shared_link_edit_description": "Beschrijving",
"shared_link_edit_description_hint": "Geef de deel beschrijving",
"shared_link_edit_description_hint": "Voer beschrijving voor de gedeelde link in",
"shared_link_edit_expire_after": "Verval na",
"shared_link_edit_expire_after_option_day": "1 dag",
"shared_link_edit_expire_after_option_days": "{} dagen",
@@ -409,9 +410,9 @@
"shared_link_edit_expire_after_option_minutes": "{} minuten",
"shared_link_edit_expire_after_option_never": "Nooit",
"shared_link_edit_password": "Wachtwoord",
"shared_link_edit_password_hint": "Voer het deel wachtwoord in",
"shared_link_edit_password_hint": "Voer wachtwoord voor de gedeelde link in",
"shared_link_edit_show_meta": "Toon metadata",
"shared_link_edit_submit_button": "Update link",
"shared_link_edit_submit_button": "Link bijwerken",
"shared_link_empty": "Je hebt geen gedeelde links",
"shared_link_error_server_url_fetch": "Kan de server url niet ophalen",
"shared_link_expired": "Verlopen",
@@ -452,19 +453,19 @@
"theme_setting_three_stage_loading_title": "Laden in drie fasen inschakelen",
"translated_text_options": "Opties",
"trash_page_delete": "Verwijderen",
"trash_page_delete_all": "Verwijder Alle",
"trash_page_delete_all": "Verwijder alle",
"trash_page_empty_trash_btn": "Leeg prullenbak",
"trash_page_empty_trash_dialog_content": "Wil je je weggegooide assets leegmaken? Deze items worden permanent verwijderd van Immich",
"trash_page_empty_trash_dialog_content": "Wil je de prullenbak leegmaken? Deze items worden permanent verwijderd van Immich",
"trash_page_empty_trash_dialog_ok": "Ok",
"trash_page_info": "Verwijderde items worden permanent verwijderd na {} dagen",
"trash_page_no_assets": "Geen verwijderde assets",
"trash_page_restore": "Herstellen",
"trash_page_restore_all": "Herstel Alle",
"trash_page_restore_all": "Herstel alle",
"trash_page_select_assets_btn": "Selecteer assets",
"trash_page_select_btn": "Selecteren",
"trash_page_title": "Prullenbak ({})",
"upload_dialog_cancel": "Annuleren",
"upload_dialog_info": "Wilt u een backup maken van de geselecteerde Asset(s) op de server?",
"upload_dialog_info": "Wil je een backup maken van de geselecteerde asset(s) op de server?",
"upload_dialog_ok": "Uploaden",
"upload_dialog_title": "Asset uploaden",
"version_announcement_overlay_ack": "Bevestig",

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "SZCZEGÓŁY",
"exif_bottom_sheet_location": "LOKALIZACJA",
"exif_bottom_sheet_location_add": "Dodaj lokalizację",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Praca w toku",
"experimental_settings_new_asset_list_title": "Włącz eksperymentalną układ zdjęć",
"experimental_settings_subtitle": "Używaj na własne ryzyko!",

View File

@@ -1,8 +1,8 @@
{
"action_common_cancel": "Cancel",
"action_common_update": "Update",
"add_to_album_bottom_sheet_added": "Added to {album}",
"add_to_album_bottom_sheet_already_exists": "Already in {album}",
"action_common_cancel": "Cancelar",
"action_common_update": "Atualizar",
"add_to_album_bottom_sheet_added": "Adicionar a {album}",
"add_to_album_bottom_sheet_already_exists": "Já pertence a {album}",
"advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_prefer_remote_subtitle": "Some devices are painfully slow to load thumbnails from assets on the device. Activate this setting to load remote images instead.",
"advanced_settings_prefer_remote_title": "Prefer remote images",
@@ -16,7 +16,7 @@
"album_info_card_backup_album_included": "INCLUÍDO",
"album_thumbnail_card_item": "1 item",
"album_thumbnail_card_items": "{} itens",
"album_thumbnail_card_shared": "Compartilhado",
"album_thumbnail_card_shared": " · Partilhado",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Shared by {}",
"album_viewer_appbar_share_delete": "Deletar álbum",
@@ -29,21 +29,21 @@
"album_viewer_appbar_share_to": "Share To",
"album_viewer_page_share_add_users": "Adicionar usuários",
"all_people_page_title": "People",
"all_videos_page_title": "Videos",
"app_bar_signout_dialog_content": "Are you sure you want to sign out?",
"all_videos_page_title": "Vídeos",
"app_bar_signout_dialog_content": "Tem a certeza que deseja sair?",
"app_bar_signout_dialog_ok": "Yes",
"app_bar_signout_dialog_title": "Sign out",
"app_bar_signout_dialog_title": "Sair",
"archive_page_no_archived_assets": "No archived assets found",
"archive_page_title": "Archive ({})",
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_list_layout_settings_dynamic_layout_title": "Dynamic layout",
"asset_action_delete_err_read_only": "Não é possível eliminar o(s) recurso(s) só de leitura, ignorando",
"asset_action_share_err_offline": "Não é possível obter recurso(s) offline, ignorando",
"asset_list_layout_settings_dynamic_layout_title": "Disposição dinâmica",
"asset_list_layout_settings_group_automatically": "Automatic",
"asset_list_layout_settings_group_by": "Group assets by",
"asset_list_layout_settings_group_by_month": "Month",
"asset_list_layout_settings_group_by_month_day": "Month + day",
"asset_list_settings_subtitle": "Configurações de layout da grade de fotos",
"asset_list_settings_title": "Grade de fotos",
"asset_list_layout_settings_group_by": "Agrupar recursos por",
"asset_list_layout_settings_group_by_month": "Mês",
"asset_list_layout_settings_group_by_month_day": "Mês + dia",
"asset_list_settings_subtitle": "Configurações de layout da grelha de fotos",
"asset_list_settings_title": "Grelha de fotos",
"backup_album_selection_page_albums_device": "Álbuns no dispositivo ({})",
"backup_album_selection_page_albums_tap": "Toque para incluir, duplo toque para exluir",
"backup_album_selection_page_assets_scatter": "Os itens podem estar espalhados por vários álbuns. Assim, os álbuns podem ser incluídos ou excluídos durante o processo de backup.",
@@ -90,11 +90,11 @@
"backup_controller_page_remainder": "Restante",
"backup_controller_page_remainder_sub": "Fotos e vídeos restantes para fazer backup da seleção",
"backup_controller_page_select": "Selecione",
"backup_controller_page_server_storage": "Espaço no Servidor",
"backup_controller_page_server_storage": "Armazenamento no servidor",
"backup_controller_page_start_backup": "Iniciar Backup",
"backup_controller_page_status_off": "Backup está desligado",
"backup_controller_page_status_on": "Backup está ligado",
"backup_controller_page_storage_format": "{} de {} usado",
"backup_controller_page_storage_format": "{} de {} usados",
"backup_controller_page_to_backup": "Álbuns para fazer backup",
"backup_controller_page_total": "Total",
"backup_controller_page_total_sub": "Todas as fotos e vídeos dos álbuns selecionados",
@@ -118,91 +118,92 @@
"cache_settings_statistics_album": "Miniaturas da biblioteca",
"cache_settings_statistics_assets": "{} itens ({})",
"cache_settings_statistics_full": "Imagens completas",
"cache_settings_statistics_shared": "Miniaturas de álbuns compartilhados",
"cache_settings_statistics_shared": "Miniaturas de álbuns partilhados",
"cache_settings_statistics_thumbnail": "Miniaturas",
"cache_settings_statistics_title": "Uso de cache",
"cache_settings_subtitle": "Controle o comportamento de cache do aplicativo Immich",
"cache_settings_thumbnail_size": "Tamanho do cache de miniaturas ({} itens)",
"cache_settings_tile_subtitle": "Control the local storage behaviour",
"cache_settings_tile_title": "Local Storage",
"cache_settings_tile_subtitle": "Controlar o comportamento do armazenamento local",
"cache_settings_tile_title": "Armazenamento local",
"cache_settings_title": "Configurações de cache",
"change_password_form_confirm_password": "Confirm Password",
"change_password_form_description": "Hi {name},\n\nThis is either the first time you are signing into the system or a request has been made to change your password. Please enter the new password below.",
"change_password_form_new_password": "New Password",
"change_password_form_password_mismatch": "Passwords do not match",
"change_password_form_reenter_new_password": "Re-enter New Password",
"common_add_to_album": "Add to album",
"common_change_password": "Change Password",
"common_create_new_album": "Create new album",
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
"change_password_form_confirm_password": "Confirme a senha",
"change_password_form_description": "Olá {name},\n\nÉ a primeira vez que entra no sistema ou foi-lhe pedido que alterasse a sua palavra-passe. Introduza a nova palavra-passe abaixo.",
"change_password_form_new_password": "Nova senha",
"change_password_form_password_mismatch": "As senhas não coincidem",
"change_password_form_reenter_new_password": "Re-introduza a nova senha",
"common_add_to_album": "Adicionar ao álbum",
"common_change_password": "Mudar a senha",
"common_create_new_album": "Criar novo álbum",
"common_server_error": "Verifique a sua ligação de rede, certifique-se de que o servidor está acessível e de que as versões da aplicação/servidor são compatíveis.",
"common_shared": "Shared",
"control_bottom_app_bar_add_to_album": "Adicionar ao álbum",
"control_bottom_app_bar_album_info": "{} itens",
"control_bottom_app_bar_album_info_shared": "{} itens · Compartilhado",
"control_bottom_app_bar_album_info_shared": "{} itens · Partilhado",
"control_bottom_app_bar_archive": "Archive",
"control_bottom_app_bar_create_new_album": "Criar novo álbum",
"control_bottom_app_bar_delete": "Deletar",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_delete_from_immich": "Apagar do Immich",
"control_bottom_app_bar_delete_from_local": "Apagar do dispositivo",
"control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "Edit Date & Time",
"control_bottom_app_bar_favorite": "Favorite",
"control_bottom_app_bar_share": "Compartilhar",
"control_bottom_app_bar_share": "Partilhar",
"control_bottom_app_bar_share_to": "Share To",
"control_bottom_app_bar_stack": "Stack",
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
"control_bottom_app_bar_trash_from_immich": "Mover para o lixo",
"control_bottom_app_bar_unarchive": "Unarchive",
"control_bottom_app_bar_unfavorite": "Unfavorite",
"control_bottom_app_bar_upload": "Upload",
"create_album_page_untitled": "Sem título",
"create_shared_album_page_create": "Criar",
"create_shared_album_page_share": "Compartilhar",
"create_shared_album_page_share": "Partilhar",
"create_shared_album_page_share_add_assets": "ADICIONAR ITENS",
"create_shared_album_page_share_select_photos": "Selecionar Fotos",
"curated_location_page_title": "Places",
"curated_object_page_title": "Things",
"curated_location_page_title": "Sítios",
"curated_object_page_title": "Objetos",
"daily_title_text_date": "E, MMM dd",
"daily_title_text_date_year": "E, MMM dd, yyyy",
"date_format": "E, LLL d, y • h:mm a",
"delete_dialog_alert": "Esses itens serão permanentemente deletados do Immich e do seu dispositivo",
"delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server",
"delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device",
"delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server",
"delete_dialog_alert_local": "Estes itens serão removidos permanentemente do seu dispositivo, mas continuarão disponíveis no servidor Immich",
"delete_dialog_alert_local_non_backed_up": "Alguns dos itens não estão guardados no Immich e serão removidos permanentemente do seu dispositivo",
"delete_dialog_alert_remote": "Estes itens serão permanentemente eliminados do servidor Immich",
"delete_dialog_cancel": "Cancelar",
"delete_dialog_ok": "Deletar",
"delete_dialog_ok_force": "Delete Anyway",
"delete_dialog_ok_force": "Apagar de qualquer forma",
"delete_dialog_title": "Deletar Permanentemente",
"delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
"delete_local_dialog_ok_force": "Delete Anyway",
"delete_local_dialog_ok_backed_up_only": "Eliminar apenas existentes na cópia de segurança",
"delete_local_dialog_ok_force": "Apagar de qualquer forma",
"delete_shared_link_dialog_content": "Are you sure you want to delete this shared link?",
"delete_shared_link_dialog_title": "Delete Shared Link",
"description_input_hint_text": "Add description...",
"description_input_submit_error": "Error updating description, check the log for more details",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_date_time_dialog_date_time": "Data e Hora",
"edit_date_time_dialog_timezone": "Fuso horário",
"edit_location_dialog_title": "Location",
"exif_bottom_sheet_description": "Adicionar Descrição...",
"exif_bottom_sheet_details": "DETALHES",
"exif_bottom_sheet_location": "LOCALIZAÇÃO",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Trabalho em andamento",
"experimental_settings_new_asset_list_title": "Ativar visualização de grade experimental",
"experimental_settings_new_asset_list_title": "Ativar visualização de grelha experimental",
"experimental_settings_subtitle": "Use por sua conta e risco!",
"experimental_settings_title": "Experimental",
"favorites_page_no_favorites": "No favorite assets found",
"favorites_page_title": "Favorites",
"favorites_page_title": "Favoritos",
"home_page_add_to_album_conflicts": "Ativos {added} adicionados ao álbum {album}. {failed} ativos já estão no álbum.",
"home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping",
"home_page_add_to_album_err_local": "Ainda não é possível adicionar recursos locais aos álbuns, ignorando",
"home_page_add_to_album_success": "Ativos {added} adicionados ao álbum {album}.",
"home_page_album_err_partner": "Can not add partner assets to an album yet, skipping",
"home_page_archive_err_local": "Can not archive local assets yet, skipping",
"home_page_archive_err_partner": "Can not archive partner assets, skipping",
"home_page_building_timeline": "Building the timeline",
"home_page_building_timeline": "A construir a timeline",
"home_page_delete_err_partner": "Can not delete partner assets, skipping",
"home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
"home_page_favorite_err_local": "Can not favorite local assets yet, skipping",
"home_page_delete_remote_err_local": "Recursos locais na seleção remota de eliminação, ignorando",
"home_page_favorite_err_local": "Ainda não é possível adicionar recursos locais favoritos, ignorando",
"home_page_favorite_err_partner": "Can not favorite partner assets yet, skipping",
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).",
"home_page_first_time_notice": "Se for a primeira vez que utiliza a aplicação, certifique-se de que escolhe um álbum ou álbuns de cópia de segurança, para que a linha cronológica possa preencher as fotografias e os vídeos no(s) álbum(s).",
"home_page_share_err_local": "Can not share local assets via link, skipping",
"home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping",
"image_viewer_page_state_provider_download_error": "Download Error",
@@ -210,16 +211,16 @@
"image_viewer_page_state_provider_share_error": "Share Error",
"library_page_albums": "Álbuns",
"library_page_archive": "Archive",
"library_page_device_albums": "Albums on Device",
"library_page_favorites": "Favorites",
"library_page_new_album": "Novo Album",
"library_page_sharing": "Sharing",
"library_page_sort_asset_count": "Number of assets",
"library_page_sort_created": "Created date",
"library_page_device_albums": "Álbuns no dispositivo",
"library_page_favorites": "Favoritos",
"library_page_new_album": "Novo álbum",
"library_page_sharing": "Partilhar",
"library_page_sort_asset_count": "Número de recursos",
"library_page_sort_created": "Data de criação",
"library_page_sort_last_modified": "Last modified",
"library_page_sort_most_oldest_photo": "Oldest photo",
"library_page_sort_most_oldest_photo": "Foto mais antiga",
"library_page_sort_most_recent_photo": "Most recent photo",
"library_page_sort_title": "Album title",
"library_page_sort_title": "Título do álbum",
"location_picker_choose_on_map": "Choose on map",
"location_picker_latitude": "Latitude",
"location_picker_latitude_error": "Enter a valid latitude",
@@ -228,8 +229,8 @@
"location_picker_longitude_error": "Enter a valid longitude",
"location_picker_longitude_hint": "Enter your longitude here",
"login_disabled": "Login has been disabled",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_back_button_text": "Back",
"login_form_api_exception": "Excepção de API. Verifique o URL do servidor e tente novamente.",
"login_form_back_button_text": "Voltar",
"login_form_button_text": "Login",
"login_form_email_hint": "seuemail@email.com",
"login_form_endpoint_hint": "http://ip-do-seu-servidor:porta/api",
@@ -245,15 +246,15 @@
"login_form_handshake_exception": "There was an Handshake Exception with the server. Enable self-signed certificate support in the settings if you are using a self-signed certificate.",
"login_form_label_email": "Email",
"login_form_label_password": "Senha",
"login_form_next_button": "Next",
"login_form_next_button": "Avançar",
"login_form_password_hint": "senha",
"login_form_save_login": "Permanecer logado",
"login_form_server_empty": "Enter a server URL.",
"login_form_server_error": "Could not connect to server.",
"login_form_server_empty": "Introduzir um URL de servidor.",
"login_form_server_error": "Não foi possível ligar ao servidor.",
"login_password_changed_error": "There was an error updating your password",
"login_password_changed_success": "Password updated successfully",
"map_assets_in_bound": "{} photo",
"map_assets_in_bounds": "{} photos",
"map_assets_in_bounds": "{} fotos",
"map_cannot_get_user_location": "Cannot get user's location",
"map_location_dialog_cancel": "Cancel",
"map_location_dialog_yes": "Yes",
@@ -264,83 +265,83 @@
"map_no_location_permission_content": "Location permission is needed to display assets from your current location. Do you want to allow it now?",
"map_no_location_permission_title": "Location Permission denied",
"map_settings_dark_mode": "Dark mode",
"map_settings_date_range_option_all": "All",
"map_settings_date_range_option_day": "Past 24 hours",
"map_settings_date_range_option_days": "Past {} days",
"map_settings_date_range_option_year": "Past year",
"map_settings_date_range_option_years": "Past {} years",
"map_settings_date_range_option_all": "Tudo",
"map_settings_date_range_option_day": "Últimas 24 horas",
"map_settings_date_range_option_days": "Últimos {} dias",
"map_settings_date_range_option_year": "Último ano",
"map_settings_date_range_option_years": "Últimos {} anos",
"map_settings_dialog_cancel": "Cancel",
"map_settings_dialog_save": "Save",
"map_settings_dialog_title": "Map Settings",
"map_settings_include_show_archived": "Include Archived",
"map_settings_only_relative_range": "Date range",
"map_settings_only_show_favorites": "Show Favorite Only",
"map_settings_theme_settings": "Map Theme",
"map_settings_theme_settings": "Tema do mapa",
"map_zoom_to_see_photos": "Zoom out to see photos",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Motion Photos",
"motion_photos_page_title": "Fotos com movimento",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"notification_permission_dialog_cancel": "Cancel",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_cancel": "Cancelar",
"notification_permission_dialog_content": "Para ativar as notificações, vá a Definições e selecione permitir.",
"notification_permission_dialog_settings": "Settings",
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
"notification_permission_list_tile_enable_button": "Enable Notifications",
"notification_permission_list_tile_title": "Notification Permission",
"partner_page_add_partner": "Add partner",
"notification_permission_list_tile_title": "Permissão de notificações",
"partner_page_add_partner": "Adicionar parceiro",
"partner_page_empty_message": "Your photos are not yet shared with any partner.",
"partner_page_no_more_users": "No more users to add",
"partner_page_partner_add_failed": "Failed to add partner",
"partner_page_select_partner": "Select partner",
"partner_page_select_partner": "Selecionar parceiro",
"partner_page_shared_to_title": "Shared to",
"partner_page_stop_sharing_content": "{} will no longer be able to access your photos.",
"partner_page_stop_sharing_title": "Stop sharing your photos?",
"partner_page_title": "Partner",
"permission_onboarding_back": "Back",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_continue_anyway": "Continuar de qualquer maneira",
"permission_onboarding_get_started": "Get started",
"permission_onboarding_go_to_settings": "Go to settings",
"permission_onboarding_grant_permission": "Grant permission",
"permission_onboarding_log_out": "Log out",
"permission_onboarding_permission_denied": "Permission denied. To use Immich, grant photo and video permissions in Settings.",
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"permission_onboarding_log_out": "Sair",
"permission_onboarding_permission_denied": "Permissão negada. Para utilizar o Immich, conceda permissões de fotografia e vídeo nas Definições.",
"permission_onboarding_permission_granted": "Autorização concedida! Está tudo pronto.",
"permission_onboarding_permission_limited": "Permissão limitada. Para permitir que o Immich faça cópias de segurança e gira toda a sua coleção de galerias, conceda permissões para fotografias e vídeos nas Definições.",
"permission_onboarding_request": "O Immich requer autorização para ver as suas fotografias e vídeos.",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_out_of_date_major": "Mobile App is out of date. Please update to the latest major version.",
"profile_drawer_client_out_of_date_minor": "Mobile App is out of date. Please update to the latest minor version.",
"profile_drawer_client_out_of_date_major": "A aplicação móvel está desatualizada. Atualize para a versão principal mais recente.",
"profile_drawer_client_out_of_date_minor": "A aplicação móvel está desatualizada. Por favor, atualize para a versão mais recente.",
"profile_drawer_client_server_up_to_date": "Cliente e Servidor atualizados",
"profile_drawer_documentation": "Documentation",
"profile_drawer_github": "GitHub",
"profile_drawer_server_out_of_date_major": "Server is out of date. Please update to the latest major version.",
"profile_drawer_server_out_of_date_minor": "Server is out of date. Please update to the latest minor version.",
"profile_drawer_server_out_of_date_major": "O servidor está desatualizado. Atualize para a versão principal mais recente.",
"profile_drawer_server_out_of_date_minor": "O servidor está desatualizado. Atualize para a versão mais recente.",
"profile_drawer_settings": "Configurações",
"profile_drawer_sign_out": "Sair",
"profile_drawer_trash": "Trash",
"recently_added_page_title": "Recently Added",
"scaffold_body_error_occurred": "Error occurred",
"recently_added_page_title": "Adicionado recentemente",
"scaffold_body_error_occurred": "Ocorreu um erro",
"search_bar_hint": "Busque suas fotos",
"search_page_categories": "Categories",
"search_page_favorites": "Favorites",
"search_page_motion_photos": "Motion Photos",
"search_page_favorites": "Favoritos",
"search_page_motion_photos": "Fotos com movimento",
"search_page_no_objects": "Nenhuma informação de objeto disponível",
"search_page_no_places": "Nenhuma informação de lugares disponível",
"search_page_no_places": "Nenhuma informação de sítios disponível",
"search_page_people": "People",
"search_page_person_add_name_dialog_cancel": "Cancel",
"search_page_person_add_name_dialog_hint": "Name",
"search_page_person_add_name_dialog_save": "Save",
"search_page_person_add_name_dialog_title": "Add a name",
"search_page_person_add_name_subtitle": "Find them fast by name with search",
"search_page_person_add_name_title": "Add a name",
"search_page_person_edit_name": "Edit name",
"search_page_places": "Lugares",
"search_page_recently_added": "Recently added",
"search_page_person_add_name_dialog_cancel": "Cancelar",
"search_page_person_add_name_dialog_hint": "Nome",
"search_page_person_add_name_dialog_save": "Guardar",
"search_page_person_add_name_dialog_title": "Adicionar um nome",
"search_page_person_add_name_subtitle": "Encontre-os rapidamente pelo nome com a pesquisa",
"search_page_person_add_name_title": "Adicionar um nome",
"search_page_person_edit_name": "Editar nome",
"search_page_places": "Sítios",
"search_page_recently_added": "Adicionado recentemente",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "Objetos",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_page_videos": "Vídeos",
"search_page_view_all_button": "Ver tudo",
"search_page_your_activity": "A sua atividade",
"search_page_your_map": "Your Map",
"search_result_page_new_search_hint": "Nova Busca",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
@@ -348,10 +349,10 @@
"select_additional_user_for_sharing_page_suggestions": "Sugestões",
"select_user_for_sharing_page_err_album": "Falha ao criar o álbum",
"select_user_for_sharing_page_share_suggestions": "Sugestões",
"server_info_box_app_version": "App Version",
"server_info_box_latest_release": "Latest Version",
"server_info_box_app_version": "Versão da app",
"server_info_box_latest_release": "Última versão",
"server_info_box_server_url": "Server URL",
"server_info_box_server_version": "Server Version",
"server_info_box_server_version": "Versão do servidor",
"setting_image_viewer_help": "O visualizador de detalhes carrega primeiro a miniatura pequena, depois carrega a visualização de tamanho médio (se ativado) e, finalmente, carrega o original (se ativado).",
"setting_image_viewer_original_subtitle": "Ative para carregar a imagem original em resolução total (grande!). Desative para reduzir o uso de dados (na rede e no cache do dispositivo).",
"setting_image_viewer_original_title": "Carregar imagem original",
@@ -381,65 +382,65 @@
"shared_album_activity_remove_title": "Delete Activity",
"shared_album_activity_setting_subtitle": "Let others respond",
"shared_album_activity_setting_title": "Comments & likes",
"shared_album_section_people_action_error": "Error leaving/removing from album",
"shared_album_section_people_action_leave": "Remove user from album",
"shared_album_section_people_action_remove_user": "Remove user from album",
"shared_album_section_people_action_error": "Erro ao sair/remover do álbum",
"shared_album_section_people_action_leave": "Remover utilizador do álbum",
"shared_album_section_people_action_remove_user": "Remover utilizador do álbum",
"shared_album_section_people_owner_label": "Owner",
"shared_album_section_people_title": "PEOPLE",
"share_dialog_preparing": "Preparando...",
"shared_link_app_bar_title": "Shared Links",
"shared_link_app_bar_title": "Links partilhados",
"shared_link_clipboard_copied_massage": "Copied to clipboard",
"shared_link_clipboard_text": "Link: {}\nPassword: {}",
"shared_link_create_app_bar_title": "Create link to share",
"shared_link_create_error": "Error while creating shared link",
"shared_link_create_info": "Let anyone with the link see the selected photo(s)",
"shared_link_create_submit_button": "Create link",
"shared_link_edit_allow_download": "Allow public user to download",
"shared_link_edit_allow_upload": "Allow public user to upload",
"shared_link_edit_allow_download": "Permitir que um utilizador público descarregue",
"shared_link_edit_allow_upload": "Permitir que um utilizador público carregue",
"shared_link_edit_app_bar_title": "Edit link",
"shared_link_edit_change_expiry": "Change expiration time",
"shared_link_edit_change_expiry": "Alterar o prazo de validade",
"shared_link_edit_description": "Description",
"shared_link_edit_description_hint": "Enter the share description",
"shared_link_edit_expire_after": "Expire after",
"shared_link_edit_expire_after_option_day": "1 day",
"shared_link_edit_expire_after_option_days": "{} days",
"shared_link_edit_expire_after_option_hour": "1 hour",
"shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_day": "1 dia",
"shared_link_edit_expire_after_option_days": "{} dias",
"shared_link_edit_expire_after_option_hour": "1 hora",
"shared_link_edit_expire_after_option_hours": "{} horas",
"shared_link_edit_expire_after_option_minute": "1 minuto",
"shared_link_edit_expire_after_option_minutes": "{} minutos",
"shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_password": "Password",
"shared_link_edit_password_hint": "Enter the share password",
"shared_link_edit_show_meta": "Show metadata",
"shared_link_edit_submit_button": "Update link",
"shared_link_empty": "You don't have any shared links",
"shared_link_edit_show_meta": "Mostrar metadados",
"shared_link_edit_submit_button": "Atualizar link",
"shared_link_empty": "Não tem links partilhados",
"shared_link_error_server_url_fetch": "Cannot fetch the server url",
"shared_link_expired": "Expired",
"shared_link_expires_day": "Expires in {} day",
"shared_link_expires_days": "Expires in {} days",
"shared_link_expires_hour": "Expires in {} hour",
"shared_link_expires_hours": "Expires in {} hours",
"shared_link_expires_minute": "Expires in {} minute",
"shared_link_expires_day": "Expira em {} dia",
"shared_link_expires_days": "Expira em {} dias",
"shared_link_expires_hour": "Expira em {} hora",
"shared_link_expires_hours": "Expira em {} horas",
"shared_link_expires_minute": "Expira em {} minuto",
"shared_link_expires_minutes": "Expires in {} minutes",
"shared_link_expires_never": "Expires ∞",
"shared_link_expires_second": "Expires in {} second",
"shared_link_expires_second": "Expira em {} segundo",
"shared_link_expires_seconds": "Expires in {} seconds",
"shared_link_info_chip_download": "Download",
"shared_link_info_chip_download": "Descarregar",
"shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Upload",
"shared_link_manage_links": "Manage Shared links",
"shared_link_manage_links": "Gerir links partilhados",
"share_done": "Done",
"share_invite": "Convidar para álbum",
"sharing_page_album": "Álbuns compartilhados",
"sharing_page_description": "Criar álbuns compartilhados para compartilhas fotos e vídeos com pessoas na sua rede.",
"sharing_page_album": "Álbuns partilhados",
"sharing_page_description": "Crie álbuns partilhados para partilhar fotografias e vídeos com pessoas da sua rede.",
"sharing_page_empty_list": "LISTA VAZIA",
"sharing_silver_appbar_create_shared_album": "Criar um álgum compartilhado",
"sharing_silver_appbar_create_shared_album": "Criar álbum partilhado",
"sharing_silver_appbar_shared_links": "Shared links",
"sharing_silver_appbar_share_partner": "Compartilhar com parceiro",
"sharing_silver_appbar_share_partner": "Partilhar com parceiro",
"tab_controller_nav_library": "Biblioteca",
"tab_controller_nav_photos": "Fotos",
"tab_controller_nav_search": "Buscar",
"tab_controller_nav_sharing": "Compartilhando",
"tab_controller_nav_search": "Procurar",
"tab_controller_nav_sharing": "Partilhar",
"theme_setting_asset_list_storage_indicator_title": "Mostrar indicador de armazenamento em blocos de ativos",
"theme_setting_asset_list_tiles_per_row_title": "Número de itens por linha ({})",
"theme_setting_dark_mode_switch": "Modo escuro",
@@ -467,11 +468,11 @@
"upload_dialog_info": "Do you want to backup the selected Asset(s) to the server?",
"upload_dialog_ok": "Upload",
"upload_dialog_title": "Upload Asset",
"version_announcement_overlay_ack": "Need Context",
"version_announcement_overlay_ack": "Aceitar",
"version_announcement_overlay_release_notes": "notas de lançamento",
"version_announcement_overlay_text_1": "Olá, há um novo lançamento de",
"version_announcement_overlay_text_2": "por favor, tome o seu tempo para visitar o",
"version_announcement_overlay_text_3": "e certifique-se de que a configuração do docker-compose e do .env estejam atualizadas para evitar configurações incorretas, especialmente se você usar o WatchTower ou qualquer mecanismo que lide com a atualização automática do aplicativo do servidor.",
"version_announcement_overlay_text_3": "e certifique-se de que a configuração do docker-compose e do .env estejam atualizadas para evitar configurações incorretas, especialmente se usar o WatchTower ou qualquer mecanismo que lide com a atualização automática do servidor.",
"version_announcement_overlay_title": "Nova versão do servidor disponível \uD83C\uDF89",
"viewer_remove_from_stack": "Remove from Stack",
"viewer_stack_use_as_main_asset": "Use as Main Asset",

View File

@@ -1,12 +1,12 @@
{
"action_common_cancel": "Cancel",
"action_common_update": "Update",
"action_common_cancel": "Отмена",
"action_common_update": "Обновить",
"add_to_album_bottom_sheet_added": "Добавлено в {album}",
"add_to_album_bottom_sheet_already_exists": "Уже в {album}",
"advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_prefer_remote_subtitle": "Некоторые устройства очень медленно загружают предпросмотр объектов, находящихся на устройстве. Активируйте эту настройку, чтобы вместо них загружались изображени с сервера.",
"advanced_settings_prefer_remote_subtitle": "Некоторые устройства очень медленно загружают предпросмотр объектов, находящихся на устройстве. Активируйте эту настройку, чтобы вместо них загружались изображения с сервера.",
"advanced_settings_prefer_remote_title": "Предпочитать фото на сервере",
"advanced_settings_self_signed_ssl_subtitle": "Пропускает проверку сертификата SSL для конечной точки сервера. Требуется для самоподписанных сертификатов.",
"advanced_settings_self_signed_ssl_subtitle": "Пропускает проверку SSL-сертификата сервера. Требуется для самоподписанных сертификатов.",
"advanced_settings_self_signed_ssl_title": "Разрешить самоподписанные SSL-сертификаты",
"advanced_settings_tile_subtitle": "Расширенные настройки пользователя",
"advanced_settings_tile_title": "Расширенные",
@@ -35,14 +35,14 @@
"app_bar_signout_dialog_title": "Выйти из системы",
"archive_page_no_archived_assets": "В архиве сейчас пусто",
"archive_page_title": "Архив ({})",
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_action_delete_err_read_only": "Невозможно удалить объект(ы) только для чтения, пропуск...",
"asset_action_share_err_offline": "Невозможно получить оффлайн-объект(ы), пропуск...",
"asset_list_layout_settings_dynamic_layout_title": "Динамическое расположение",
"asset_list_layout_settings_group_automatically": "Автоматически",
"asset_list_layout_settings_group_by": "Группировать объекты по:",
"asset_list_layout_settings_group_by_month": "Месяцу",
"asset_list_layout_settings_group_by_month_day": "Месяцу и дню",
"asset_list_settings_subtitle": "Настройки макета сетки фотографий",
"asset_list_settings_subtitle": "Настройка макета сетки фотографий",
"asset_list_settings_title": "Сетка фотографий",
"backup_album_selection_page_albums_device": "Альбомов на устройстве ({})",
"backup_album_selection_page_albums_tap": "Нажмите, чтобы включить, нажмите дважды, чтобы исключить",
@@ -65,7 +65,7 @@
"backup_controller_page_background_battery_info_link": "Показать как",
"backup_controller_page_background_battery_info_message": "Для наилучшего фонового резервного копирования отключите любые настройки оптимизации батареи, ограничивающие фоновую активность для Immich.\n\nПоскольку это зависит от устройства, найдите необходимую информацию для производителя вашего устройства.",
"backup_controller_page_background_battery_info_ok": "ОК",
"backup_controller_page_background_battery_info_title": "\nОптимизация батареи",
"backup_controller_page_background_battery_info_title": "Оптимизация батареи",
"backup_controller_page_background_charging": "Только во время зарядки",
"backup_controller_page_background_configure_error": "Не удалось настроить фоновую службу",
"backup_controller_page_background_delay": "Отложить резервное копирование новых объектов: {}",
@@ -112,8 +112,8 @@
"cache_settings_clear_cache_button": "Очистить кэш",
"cache_settings_clear_cache_button_title": "Очищает кэш приложения. Это значительно повлияет на производительность приложения, до тех пор, пока кэш не будет перестроен заново.",
"cache_settings_duplicated_assets_clear_button": "ОЧИСТИТЬ",
"cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app",
"cache_settings_duplicated_assets_title": "Дублированные ресурсы",
"cache_settings_duplicated_assets_subtitle": "Фото и видео, занесенные приложением в черный список",
"cache_settings_duplicated_assets_title": "Дублирующиеся объекты ({})",
"cache_settings_image_cache_size": "Размер кэша изображений ({} объектов)",
"cache_settings_statistics_album": "Миниатюры библиотеки",
"cache_settings_statistics_assets": "{} объектов ({})",
@@ -140,19 +140,19 @@
"control_bottom_app_bar_album_info": "{} файлов",
"control_bottom_app_bar_album_info_shared": "{} файлов · Общий",
"control_bottom_app_bar_archive": "Архив",
"control_bottom_app_bar_create_new_album": "\nСоздать новый альбом",
"control_bottom_app_bar_create_new_album": "Создать новый альбом",
"control_bottom_app_bar_delete": "Удалить",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_edit_location": "Изменить местоположение",
"control_bottom_app_bar_edit_time": "Изменить дату и время",
"control_bottom_app_bar_favorite": "Избранное",
"control_bottom_app_bar_delete_from_immich": "Удалить из Immich\n",
"control_bottom_app_bar_delete_from_local": "Удалить с устройства",
"control_bottom_app_bar_edit_location": "Редактировать местоположение",
"control_bottom_app_bar_edit_time": "Редактировать дату и время",
"control_bottom_app_bar_favorite": "В избранное",
"control_bottom_app_bar_share": "Поделиться",
"control_bottom_app_bar_share_to": "Поделиться",
"control_bottom_app_bar_stack": "Стек",
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
"control_bottom_app_bar_trash_from_immich": "Переместить в корзину",
"control_bottom_app_bar_unarchive": "Восстановить",
"control_bottom_app_bar_unfavorite": "Исключить из избранного",
"control_bottom_app_bar_unfavorite": "Удалить из избранного",
"control_bottom_app_bar_upload": "Загрузить",
"create_album_page_untitled": "Без названия",
"create_shared_album_page_create": "Создать",
@@ -165,26 +165,27 @@
"daily_title_text_date_year": "E, MMM dd, yyyy",
"date_format": "E, LLL d, y • h:mm a",
"delete_dialog_alert": "Эти элементы будут безвозвратно удалены из приложения, а также с вашего устройства",
"delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server",
"delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device",
"delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server",
"delete_dialog_alert_local": "Эти объекты будут безвозвратно удалены с Вашего устройства, но по-прежнему будут доступны на сервере Immich",
"delete_dialog_alert_local_non_backed_up": "Резервные копии некоторых объектов не были загружены в Immich и будут безвозвратно удалены с Вашего устройства",
"delete_dialog_alert_remote": "Эти объекты будут безвозвратно удалены с сервера Immich",
"delete_dialog_cancel": "Отменить",
"delete_dialog_ok": "Удалить",
"delete_dialog_ok_force": "Delete Anyway",
"delete_dialog_ok_force": "Все равно удалить",
"delete_dialog_title": "Удалить навсегда",
"delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
"delete_local_dialog_ok_force": "Delete Anyway",
"delete_local_dialog_ok_backed_up_only": "Удалить только резервные копии",
"delete_local_dialog_ok_force": "Все равно удалить",
"delete_shared_link_dialog_content": "Вы уверены, что хотите удалить эту общую ссылку?",
"delete_shared_link_dialog_title": "Удалить общую ссылку",
"description_input_hint_text": "Добавить описание...",
"description_input_submit_error": "Не удалось обновить описание, проверьте логи, чтобы узнать причину",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_location_dialog_title": "Location",
"edit_date_time_dialog_date_time": "Дата и время",
"edit_date_time_dialog_timezone": "Часовой пояс",
"edit_location_dialog_title": "Местоположение",
"exif_bottom_sheet_description": "Добавить описание...",
"exif_bottom_sheet_details": "ПОДРОБНОСТИ",
"exif_bottom_sheet_location": "МЕСТОПОЛОЖЕНИЕ",
"exif_bottom_sheet_location": "Местоположение",
"exif_bottom_sheet_location_add": "Добавить местоположение",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Ведутся работы",
"experimental_settings_new_asset_list_title": "Включить экспериментальную сетку фотографий",
"experimental_settings_subtitle": "Используйте на свой страх и риск!",
@@ -194,39 +195,39 @@
"home_page_add_to_album_conflicts": "Добавлено {added} объектов в альбом {album}. Объекты {failed} уже есть в альбоме.",
"home_page_add_to_album_err_local": "Пока нельзя добавлять локальные объекты в альбомы, пропускаем",
"home_page_add_to_album_success": "Добавлено {added} объектов в альбом {album}.",
"home_page_album_err_partner": "Пока не удается добавить партнерские активы в альбом, пропуск...",
"home_page_album_err_partner": "Пока не удается добавить объекты партнера в альбом, пропуск...",
"home_page_archive_err_local": "Пока невозможно добавить локальные объекты в архив, пропускаем",
"home_page_archive_err_partner": "Невозможно архивировать активы партнеров, пропуск...",
"home_page_archive_err_partner": "Невозможно архивировать объекты партнера, пропуск...",
"home_page_building_timeline": "Построение временной шкалы",
"home_page_delete_err_partner": "Невозможно удалить активы партнера, пропуск...",
"home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
"home_page_favorite_err_local": "Пока не удается добавить в избранное локальные объекты, пропускаем",
"home_page_favorite_err_partner": "Пока не удается выделить партнерские активы, пропуск...",
"home_page_delete_err_partner": "Невозможно удалить объекты партнера, пропуск...",
"home_page_delete_remote_err_local": "Локальные объект(ы) уже в процессе удаления с сервера, пропуск...",
"home_page_favorite_err_local": "Пока не удается добавить в избранное локальные объекты, пропуск...",
"home_page_favorite_err_partner": "Пока не удается добавить в избранное объекты партнера, пропуск...",
"home_page_first_time_notice": "Если вы используете приложение впервые, убедитесь, что вы выбрали резервный(е) альбом(ы), чтобы временная шкала могла заполнить фотографии и видео в альбоме(ах).",
"home_page_share_err_local": "Невозможно поделиться локальными данными по ссылке, пропуск...",
"home_page_upload_err_limit": "Вы можете выгрузить максимум 30 файлов за раз",
"image_viewer_page_state_provider_download_error": "Ошибка загрузки",
"image_viewer_page_state_provider_download_success": "Успешно загружено",
"image_viewer_page_state_provider_share_error": "Ошибка при публикации",
"image_viewer_page_state_provider_share_error": "Ошибка общего доступа",
"library_page_albums": "Альбомы",
"library_page_archive": "Архив",
"library_page_device_albums": "Альбомы на устройстве",
"library_page_favorites": "Избранное",
"library_page_new_album": "Новый альбом",
"library_page_sharing": "Общие",
"library_page_sort_asset_count": "Number of assets",
"library_page_sort_created": "По новизне",
"library_page_sort_asset_count": "Количество объектов",
"library_page_sort_created": "Недавно созданные",
"library_page_sort_last_modified": "Последнее изменение",
"library_page_sort_most_oldest_photo": "Oldest photo",
"library_page_sort_most_recent_photo": "Последняя фотография",
"library_page_sort_title": "По названию альбома",
"location_picker_choose_on_map": "Choose on map",
"location_picker_latitude": "Latitude",
"location_picker_latitude_error": "Enter a valid latitude",
"location_picker_latitude_hint": "Enter your latitude here",
"location_picker_longitude": "Longitude",
"location_picker_longitude_error": "Enter a valid longitude",
"location_picker_longitude_hint": "Enter your longitude here",
"library_page_sort_most_oldest_photo": "Самые старые фото",
"library_page_sort_most_recent_photo": "Самые последние фото",
"library_page_sort_title": "Название альбома",
"location_picker_choose_on_map": "Выбрать на карте",
"location_picker_latitude": "Широта",
"location_picker_latitude_error": "Укажите правильную широту",
"location_picker_latitude_hint": "Укажите широту",
"location_picker_longitude": "Долгота",
"location_picker_longitude_error": "Укажите правильную долготу",
"location_picker_longitude_hint": "Укажите долготу",
"login_disabled": "Вход отключен",
"login_form_api_exception": "Ошибка при попытке взаимодействия с сервером. Проверьте URL-адрес до него и попробуйте еще раз.",
"login_form_back_button_text": "Назад",
@@ -252,35 +253,35 @@
"login_form_server_error": "Нет соединения с сервером.",
"login_password_changed_error": "Произошла ошибка при обновлении пароля",
"login_password_changed_success": "Пароль успешно обновлен",
"map_assets_in_bound": "{} photo",
"map_assets_in_bounds": "{} photos",
"map_assets_in_bound": "{} фото",
"map_assets_in_bounds": "{} фото",
"map_cannot_get_user_location": "Невозможно получить местоположение пользователя",
"map_location_dialog_cancel": "Отмена",
"map_location_dialog_yes": "Да",
"map_location_picker_page_use_location": "Use this location",
"map_location_picker_page_use_location": "Это местоположение",
"map_location_service_disabled_content": "Для отображения объектов в данном месте необходимо включить службу определения местоположения. Хотите включить ее сейчас?",
"map_location_service_disabled_title": "Служба определения местоположения отключена",
"map_no_assets_in_bounds": "Нет фотографий в этой области",
"map_no_location_permission_content": "Для отображения объектов из текущего местоположения необходимо разрешение на определение местоположения. Хотите ли вы разрешить его сейчас?",
"map_no_location_permission_title": "Доступ к местоположению отклонен",
"map_settings_dark_mode": "Темный режим",
"map_settings_date_range_option_all": "All",
"map_settings_date_range_option_day": "Past 24 hours",
"map_settings_date_range_option_days": "Past {} days",
"map_settings_date_range_option_year": "Past year",
"map_settings_date_range_option_years": "Past {} years",
"map_settings_date_range_option_all": "Все",
"map_settings_date_range_option_day": "Прошлые 24 часа",
"map_settings_date_range_option_days": "Прошлые {} дней",
"map_settings_date_range_option_year": "Прошлый год",
"map_settings_date_range_option_years": "Прошлые {} года",
"map_settings_dialog_cancel": "Отмена",
"map_settings_dialog_save": "Сохранить",
"map_settings_dialog_title": "Настройки карты",
"map_settings_include_show_archived": "Включить архивные данные",
"map_settings_only_relative_range": "Период времени",
"map_settings_only_show_favorites": "Показать только избранное",
"map_settings_theme_settings": "Map Theme",
"map_settings_theme_settings": "Тема карты",
"map_zoom_to_see_photos": "Уменьшение масштаба для просмотра фотографий",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Динамические фото",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"multiselect_grid_edit_date_time_err_read_only": "Невозможно редактировать дату объектов только для чтения, пропуск...",
"multiselect_grid_edit_gps_err_read_only": "Невозможно редактировать местоположение объектов только для чтения, пропуск...",
"notification_permission_dialog_cancel": "Отмена",
"notification_permission_dialog_content": "Чтобы включить уведомления, перейдите в «Настройки» и выберите «Разрешить».",
"notification_permission_dialog_settings": "Настройки",
@@ -318,7 +319,7 @@
"profile_drawer_sign_out": "Выйти",
"profile_drawer_trash": "Корзина",
"recently_added_page_title": "Недавно добавленные",
"scaffold_body_error_occurred": "Error occurred",
"scaffold_body_error_occurred": "Возникла ошибка",
"search_bar_hint": "Поиск фотографий",
"search_page_categories": "Категории",
"search_page_favorites": "Избранное",
@@ -332,31 +333,31 @@
"search_page_person_add_name_dialog_title": "Добавить имя",
"search_page_person_add_name_subtitle": "Быстро найдите их по имени с помощью поиска",
"search_page_person_add_name_title": "Добавить имя",
"search_page_person_edit_name": "Изменить имя",
"search_page_person_edit_name": "Редактировать имя",
"search_page_places": "Места",
"search_page_recently_added": "Недавно добавленные",
"search_page_screenshots": "Скриншоты",
"search_page_screenshots": "Снимки экрана",
"search_page_selfies": "Селфи",
"search_page_things": "Предметы",
"search_page_videos": "Видео",
"search_page_view_all_button": "Посмотреть все",
"search_page_your_activity": "Ваша активность",
"search_page_your_activity": "Ваши действия",
"search_page_your_map": "Ваша карта",
"search_result_page_new_search_hint": "Новый поиск",
"search_suggestion_list_smart_search_hint_1": "Интеллектуальный поиск включен по умолчанию, для поиска метаданных используйте специальный синтаксис",
"search_suggestion_list_smart_search_hint_2": "m:ваш-запрос",
"search_suggestion_list_smart_search_hint_2": "m:ваш-поисковый-запрос",
"select_additional_user_for_sharing_page_suggestions": "Предложения",
"select_user_for_sharing_page_err_album": "\nНе удалось создать альбом",
"select_user_for_sharing_page_err_album": "Не удалось создать альбом",
"select_user_for_sharing_page_share_suggestions": "Предложения",
"server_info_box_app_version": "Версия приложения",
"server_info_box_latest_release": "Крайняя версия",
"server_info_box_latest_release": "Последняя версия",
"server_info_box_server_url": "URL сервера",
"server_info_box_server_version": "Версия сервера",
"setting_image_viewer_help": "Средство просмотра деталей сначала загружает маленькую миниатюру, затем загружает предварительный просмотр среднего размера (если включено) и, наконец, загружает оригинал (если включено).",
"setting_image_viewer_original_subtitle": "Включите загрузку оригинального изображения в полном разрешении (большое!). Отключите, чтобы уменьшить объем данных (как в сети, так и в кеше устройства).",
"setting_image_viewer_original_title": "Загрузить исходное изображение",
"setting_image_viewer_preview_subtitle": "Включите загрузку изображения среднего разрешения. Отключите, чтобы загрузить оригинал напрямую или использовать только миниатюру.",
"setting_image_viewer_preview_title": "Загрузить изображение для предварительного просмотра",
"setting_image_viewer_help": "Полноэкранный просмотрщик сначала загружает изображение для предпросмотра в низком разрешении, затем загружает изображение в уменьшенном разрешении относительно оригинала (если включено) и в конце концов загружает оригинал (если включено).",
"setting_image_viewer_original_subtitle": "Включите для загрузки исходного изображения в полном разрешении (большое!).\nОтключите, чтобы уменьшить объем данных (как сети, так и кэша устройства).",
"setting_image_viewer_original_title": "Загружать исходное изображение",
"setting_image_viewer_preview_subtitle": "Включите для загрузки изображения среднего разрешения.\nОтключите, чтобы загружать оригинал напрямую или использовать только миниатюру.",
"setting_image_viewer_preview_title": "Загружать изображение для предварительного просмотра",
"setting_notifications_notify_failures_grace_period": "Уведомлять об ошибках фонового резервного копирования: {}",
"setting_notifications_notify_hours": "{} часов",
"setting_notifications_notify_immediately": "немедленно",
@@ -365,7 +366,7 @@
"setting_notifications_notify_seconds": "{} секунд",
"setting_notifications_single_progress_subtitle": "Подробная информация о ходе загрузки для каждого объекта",
"setting_notifications_single_progress_title": "Показать ход выполнения фонового резервного копирования",
"setting_notifications_subtitle": "Настроить параметры уведомлений",
"setting_notifications_subtitle": "Настройка параметров уведомлени",
"setting_notifications_title": "Уведомления",
"setting_notifications_total_progress_subtitle": "Общий прогресс загрузки (выполнено/всего объектов)",
"setting_notifications_total_progress_title": "Показать общий прогресс фонового резервного копирования",
@@ -375,61 +376,61 @@
"share_add_photos": "Добавить фото",
"share_add_title": "Добавить название",
"share_create_album": "Создать альбом",
"shared_album_activities_input_disable": "Комментарий отключен",
"shared_album_activities_input_disable": "Комментирование отключено",
"shared_album_activities_input_hint": "Скажите что-нибудь",
"shared_album_activity_remove_content": "Хотите ли Вы удалить это действие?",
"shared_album_activity_remove_title": "Удалить действие",
"shared_album_activity_setting_subtitle": "Предоставьте другим возможность отвечать",
"shared_album_activity_remove_content": "Хотите ли Вы удалить это сообщение?",
"shared_album_activity_remove_title": "Удалить сообщение",
"shared_album_activity_setting_subtitle": "Разрешить другим отвечат",
"shared_album_activity_setting_title": "Комментарии и лайки",
"shared_album_section_people_action_error": "Error leaving/removing from album",
"shared_album_section_people_action_error": "Ошибка при выходе/удалении из альбома",
"shared_album_section_people_action_leave": "Удалить пользователя из альбома",
"shared_album_section_people_action_remove_user": "Удалить пользователя из альбома",
"shared_album_section_people_owner_label": "Owner",
"shared_album_section_people_title": "PEOPLE",
"shared_album_section_people_owner_label": "Владелец",
"shared_album_section_people_title": "ЛЮДИ",
"share_dialog_preparing": "Подготовка...",
"shared_link_app_bar_title": "Общие ссылки",
"shared_link_clipboard_copied_massage": "Скопировано в буфер обмена",
"shared_link_clipboard_text": "Link: {}\nPassword: {}",
"shared_link_create_app_bar_title": "Создать ссылку для совместного использования",
"shared_link_create_error": "Error while creating shared link",
"shared_link_create_info": "Позволить любому человеку, имеющему ссылку, увидеть выбранную фотографию (фотографии)",
"shared_link_clipboard_text": "Ссылка: {}\nПароль: {}",
"shared_link_create_app_bar_title": "Создать ссылку общего доступа",
"shared_link_create_error": "Ошибка при создании общей ссылки",
"shared_link_create_info": "Разрешить всем, у кого есть ссылка, просматривать выбранные фото",
"shared_link_create_submit_button": "Создать ссылку",
"shared_link_edit_allow_download": "Разрешить публичному пользователю скачивать",
"shared_link_edit_allow_download": "Разрешить публичному пользователю скачивать файлы",
"shared_link_edit_allow_upload": "Разрешить публичному пользователю загружать файлы",
"shared_link_edit_app_bar_title": "Редактировать ссылку",
"shared_link_edit_change_expiry": "Изменить срок действия доступа",
"shared_link_edit_description": "Описание",
"shared_link_edit_description_hint": "Введите описание совместного доступа",
"shared_link_edit_expire_after": "Истекает после",
"shared_link_edit_expire_after_option_day": "1 day",
"shared_link_edit_expire_after_option_days": "{} days",
"shared_link_edit_expire_after_option_hour": "1 hour",
"shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_description_hint": "Введите описание для общего доступа",
"shared_link_edit_expire_after": "Истекает через",
"shared_link_edit_expire_after_option_day": "1 день",
"shared_link_edit_expire_after_option_days": "{} дней",
"shared_link_edit_expire_after_option_hour": "1 час",
"shared_link_edit_expire_after_option_hours": "{} часов",
"shared_link_edit_expire_after_option_minute": "1 минуту",
"shared_link_edit_expire_after_option_minutes": "{} минут",
"shared_link_edit_expire_after_option_never": "Никогда",
"shared_link_edit_password": "Пароль",
"shared_link_edit_password_hint": "Введите пароль общего доступа",
"shared_link_edit_show_meta": "Показать метаданные",
"shared_link_edit_password_hint": "Введите пароль для общего доступа",
"shared_link_edit_show_meta": "Показывать метаданные",
"shared_link_edit_submit_button": "Обновить ссылку",
"shared_link_empty": "У вас нет общих ссылок",
"shared_link_error_server_url_fetch": "Cannot fetch the server url",
"shared_link_expired": "Expired",
"shared_link_expires_day": "Expires in {} day",
"shared_link_expires_days": "Expires in {} days",
"shared_link_expires_hour": "Expires in {} hour",
"shared_link_expires_hours": "Expires in {} hours",
"shared_link_expires_minute": "Expires in {} minute",
"shared_link_error_server_url_fetch": "Невозможно запросить URL с сервера",
"shared_link_expired": "Срок действия истек",
"shared_link_expires_day": "Истекает через {} день",
"shared_link_expires_days": "Истекает через {} дней",
"shared_link_expires_hour": "Истекает через {} час",
"shared_link_expires_hours": "Истекает через {} часов",
"shared_link_expires_minute": "Истекает через {} минуту",
"shared_link_expires_minutes": "Истекает через {} минут",
"shared_link_expires_never": "Expires ∞",
"shared_link_expires_second": "Expires in {} second",
"shared_link_expires_never": "Истекает ∞",
"shared_link_expires_second": "Истекает через {} секунду",
"shared_link_expires_seconds": "Истекает через {} секунд",
"shared_link_info_chip_download": "Download",
"shared_link_info_chip_download": "Скачать",
"shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Upload",
"shared_link_info_chip_upload": "Загрузить",
"shared_link_manage_links": "Управление общими ссылками",
"share_done": "Выполнено",
"share_invite": "\nПригласить в альбом",
"share_done": "Готово",
"share_invite": "Пригласить в альбом",
"sharing_page_album": "Общие альбомы",
"sharing_page_description": "Создавайте общие альбомы, чтобы делиться фотографиями и видео с людьми в вашей сети.",
"sharing_page_empty_list": "ПУСТОЙ СПИСОК",
@@ -443,10 +444,10 @@
"theme_setting_asset_list_storage_indicator_title": "Показать индикатор хранилища на плитках объектов",
"theme_setting_asset_list_tiles_per_row_title": "Количество объектов в строке ({})",
"theme_setting_dark_mode_switch": "Тёмная тема",
"theme_setting_image_viewer_quality_subtitle": "Настройка качества детального просмотра изображения",
"theme_setting_image_viewer_quality_subtitle": "Настройка качества просмотра полноэкранных изображения",
"theme_setting_image_viewer_quality_title": "Качество просмотра изображений",
"theme_setting_system_theme_switch": "Автоматически (Как в системе)",
"theme_setting_theme_subtitle": "Выберите настройки темы приложения",
"theme_setting_system_theme_switch": "Автоматически (как в системе)",
"theme_setting_theme_subtitle": "Настройка темы приложения",
"theme_setting_theme_title": "Тема",
"theme_setting_three_stage_loading_subtitle": "Трехэтапная загрузка может повысить производительность загрузки, но вызывает значительно более высокую нагрузку на сеть",
"theme_setting_three_stage_loading_title": "Включить трехэтапную загрузку",
@@ -454,10 +455,10 @@
"trash_page_delete": "Удалить",
"trash_page_delete_all": "Удалить все",
"trash_page_empty_trash_btn": "Очистить корзину",
"trash_page_empty_trash_dialog_content": "Вы хотите очистить свою корзину? Эти объекты будут навсегда удалены из Immich",
"trash_page_empty_trash_dialog_content": "Вы хотите очистить свою корзину? Эти объекты будут навсегда удалены из Immich.",
"trash_page_empty_trash_dialog_ok": "ОК",
"trash_page_info": "Удаленные элементы будут окончательно удалены через {} дней",
"trash_page_no_assets": "Отсутствие удаленных объектов",
"trash_page_no_assets": "Удаленные объекты отсутсвуют",
"trash_page_restore": "Восстановить",
"trash_page_restore_all": "Восстановить все",
"trash_page_select_assets_btn": "Выбранные объекты",
@@ -474,6 +475,6 @@
"version_announcement_overlay_text_3": " и убедитесь, что ваши настройки docker-compose и .env обновлены, чтобы предотвратить любые неправильные настройки, особенно если вы используете WatchTower или любой другой механизм, который обрабатывает обновление вашего серверного приложения автоматически.",
"version_announcement_overlay_title": "Доступна новая версия сервера \uD83C\uDF89",
"viewer_remove_from_stack": "Удалить из стека",
"viewer_stack_use_as_main_asset": "Использование в качестве основного объекта",
"viewer_stack_use_as_main_asset": "Использовать в качестве основного объекта",
"viewer_unstack": "Разобрать стек"
}

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "PODROBNOSTI",
"exif_bottom_sheet_location": "LOKALITA",
"exif_bottom_sheet_location_add": "Nastaviť polohu",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Prebiehajúca práca",
"experimental_settings_new_asset_list_title": "Povolenie experimentálnej mriežky fotografií",
"experimental_settings_subtitle": "Používajte na vlastné riziko!",

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "LOCATION",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Work in progress",
"experimental_settings_new_asset_list_title": "Enable experimental photo grid",
"experimental_settings_subtitle": "Use at your own risk!",

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "DETALJI",
"exif_bottom_sheet_location": "LOKACIJA",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "U izradi",
"experimental_settings_new_asset_list_title": "Aktiviraj eksperimentalni mrežni prikaz fotografija",
"experimental_settings_subtitle": "Koristiti na sopstvenu odgovornost!",

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "LOCATION",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Work in progress",
"experimental_settings_new_asset_list_title": "Enable experimental photo grid",
"experimental_settings_subtitle": "Use at your own risk!",

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "DETALJER",
"exif_bottom_sheet_location": "PLATS",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Under uppbyggnad",
"experimental_settings_new_asset_list_title": "Aktivera experimentellt fotorutnät",
"experimental_settings_subtitle": "Använd på egen risk!",

View File

@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "รายละเอียด",
"exif_bottom_sheet_location": "ตำแหน่ง",
"exif_bottom_sheet_location_add": "เพิ่มตำแหน่ง",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "กำลังพัฒนา",
"experimental_settings_new_asset_list_title": "Enable experimental photo grid",
"experimental_settings_subtitle": "Use at your own risk!",

View File

@@ -1,13 +1,13 @@
{
"action_common_cancel": "Cancel",
"action_common_update": "Update",
"action_common_cancel": "Скасувати",
"action_common_update": "Оновити",
"add_to_album_bottom_sheet_added": "Додати до {album}",
"add_to_album_bottom_sheet_already_exists": "Вже є в {album}",
"advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_prefer_remote_subtitle": "Деякі пристрої вельми повільно завантажують мініатюри із елементів на пристрої. Активуйте для завантаження віддалених мініатюр натомість.",
"advanced_settings_prefer_remote_title": "Перевага віддаленим зображенням",
"advanced_settings_self_signed_ssl_subtitle": "Пропускає SSL-сертифікат для точки доступу сервера. Потрібне для власноруч підписаних сертифікатів.",
"advanced_settings_self_signed_ssl_title": "Дозволити власноруч підписані SSL-сертифікати",
"advanced_settings_self_signed_ssl_subtitle": "Пропускає перевірку SSL-сертифіката сервера. Потрібне для самопідписаних сертифікатів.",
"advanced_settings_self_signed_ssl_title": "Дозволити самопідписані SSL-сертифікати",
"advanced_settings_tile_subtitle": "Розширені користувацькі налаштування",
"advanced_settings_tile_title": "Розширені",
"advanced_settings_troubleshooting_subtitle": "Увімкніть додаткові функції для усунення несправностей",
@@ -26,17 +26,17 @@
"album_viewer_appbar_share_err_title": "Не вдалося змінити назву альбому",
"album_viewer_appbar_share_leave": "Вийти з альбому",
"album_viewer_appbar_share_remove": "Видалити з альбому",
"album_viewer_appbar_share_to": "Share To",
"album_viewer_appbar_share_to": "Поділитися",
"album_viewer_page_share_add_users": "Додати користувачів",
"all_people_page_title": "Люди",
"all_videos_page_title": "Відео",
"app_bar_signout_dialog_content": "Are you sure you want to sign out?",
"app_bar_signout_dialog_ok": "Yes",
"app_bar_signout_dialog_title": "Sign out",
"app_bar_signout_dialog_content": "Ви впевнені, що бажаєте вийти з аккаунта?",
"app_bar_signout_dialog_ok": "Так",
"app_bar_signout_dialog_title": "Вийти з аккаунта",
"archive_page_no_archived_assets": "Немає архівних елементів",
"archive_page_title": "Архів ({})",
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_action_delete_err_read_only": "Неможливо видалити елемент(и) лише для читання, пропущено",
"asset_action_share_err_offline": "Неможливо отримати оффлайн-елемент(и), пропущено",
"asset_list_layout_settings_dynamic_layout_title": "Динамічне компонування",
"asset_list_layout_settings_group_automatically": "Автоматично",
"asset_list_layout_settings_group_by": "Групувати елементи по",
@@ -50,7 +50,7 @@
"backup_album_selection_page_select_albums": "Оберіть альбоми",
"backup_album_selection_page_selection_info": "Інформація про обране",
"backup_album_selection_page_total_assets": "Загальна кількість унікальних елементів",
"backup_all": "Все",
"backup_all": "Усі",
"backup_background_service_backup_failed_message": "Не вдалося зробити резервну копію елементів. Повторюю...",
"backup_background_service_connection_failed_message": "Не вдалося зв'язатися із сервером. Повторюю...",
"backup_background_service_current_upload_notification": "Завантажується {}",
@@ -65,7 +65,7 @@
"backup_controller_page_background_battery_info_link": "Покажіть мені як",
"backup_controller_page_background_battery_info_message": "Для найкращого фонового резервного копіювання вимкніть будь-яку оптимізацію акумулятора, яка обмежує фонову активність для Immich.\n\nСпосіб залежить від конкретного пристрою, тому шукайте необхідну інформацію у виробника вашого пристрою.",
"backup_controller_page_background_battery_info_ok": "ОК",
"backup_controller_page_background_battery_info_title": "Оптимізації акамулятора",
"backup_controller_page_background_battery_info_title": "Оптимізація батареї",
"backup_controller_page_background_charging": "Лише під час заряджання",
"backup_controller_page_background_configure_error": "Не вдалося налаштувати фоновий сервіс",
"backup_controller_page_background_delay": "Затримка перед резервним копіюванням нових елементів: {}",
@@ -111,9 +111,9 @@
"cache_settings_album_thumbnails": "Мініатюри сторінок бібліотеки ({} елементи)",
"cache_settings_clear_cache_button": "Очистити кеш",
"cache_settings_clear_cache_button_title": "Очищає кеш програми. Це суттєво знизить продуктивність програми, доки кеш не буде перебудовано.",
"cache_settings_duplicated_assets_clear_button": "CLEAR",
"cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app",
"cache_settings_duplicated_assets_title": "Duplicated Assets ({})",
"cache_settings_duplicated_assets_clear_button": "ОЧИСТИТИ",
"cache_settings_duplicated_assets_subtitle": "Фото та відео, занесені додатком у чорний список",
"cache_settings_duplicated_assets_title": "Дубльовані елементи ({})",
"cache_settings_image_cache_size": "Розмір кешованих зображень ({} елементи)",
"cache_settings_statistics_album": "Бібліотечні мініатюри",
"cache_settings_statistics_assets": "{} елементи ({})",
@@ -123,16 +123,16 @@
"cache_settings_statistics_title": "Використання кешу",
"cache_settings_subtitle": "Контролює кешування у мобільному застосунку",
"cache_settings_thumbnail_size": "Розмір кешованих мініатюр ({} елементи)",
"cache_settings_tile_subtitle": "Control the local storage behaviour",
"cache_settings_tile_title": "Local Storage",
"cache_settings_title": "Налаштування Кешування",
"cache_settings_tile_subtitle": "Керування поведінкою локального сховища",
"cache_settings_tile_title": "Локальне сховище",
"cache_settings_title": "Налаштування кешування",
"change_password_form_confirm_password": "Підтвердити пароль",
"change_password_form_description": "Привіт {name},\n\nВи або або вперше входите у систему, або було зроблено запит на зміну вашого пароля. \nВведіть ваш новий пароль.",
"change_password_form_new_password": "Новий Пароль",
"change_password_form_new_password": "Новий пароль",
"change_password_form_password_mismatch": "Паролі не співпадають",
"change_password_form_reenter_new_password": "Повторіть Новий Пароль",
"change_password_form_reenter_new_password": "Повторіть новий пароль",
"common_add_to_album": "Додати в альбом",
"common_change_password": "Змінити Пароль",
"common_change_password": "Змінити пароль",
"common_create_new_album": "Створити новий альбом",
"common_server_error": "Будь ласка, перевірте з'єднання, переконайтеся, що сервер доступний і версія програми/сервера сумісна.",
"common_shared": "Спільні",
@@ -142,18 +142,18 @@
"control_bottom_app_bar_archive": "Архівувати",
"control_bottom_app_bar_create_new_album": "Створити новий альбом",
"control_bottom_app_bar_delete": "Видалити",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "Edit Date & Time",
"control_bottom_app_bar_favorite": "Уподобати",
"control_bottom_app_bar_delete_from_immich": "Видалити з Immich",
"control_bottom_app_bar_delete_from_local": "Видалити з пристрою",
"control_bottom_app_bar_edit_location": "Редагувати місцезнаходження",
"control_bottom_app_bar_edit_time": "Редагувати дату та час",
"control_bottom_app_bar_favorite": "До улюблених",
"control_bottom_app_bar_share": "Поділитися",
"control_bottom_app_bar_share_to": "Share To",
"control_bottom_app_bar_stack": "Stack",
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
"control_bottom_app_bar_share_to": "Поділитися",
"control_bottom_app_bar_stack": "Стек",
"control_bottom_app_bar_trash_from_immich": "Перемістити до кошику",
"control_bottom_app_bar_unarchive": "Розархівувати",
"control_bottom_app_bar_unfavorite": "Unfavorite",
"control_bottom_app_bar_upload": "Upload",
"control_bottom_app_bar_unfavorite": "Видалити з улюблених",
"control_bottom_app_bar_upload": "Завантажити",
"create_album_page_untitled": "Без назви",
"create_shared_album_page_create": "Створити",
"create_shared_album_page_share": "Поділитися",
@@ -165,26 +165,27 @@
"daily_title_text_date_year": "E, MMM dd, yyyy",
"date_format": "E, LLL d, y • h:mm a",
"delete_dialog_alert": "Ці елементи будуть остаточно видалені з Immich та вашого пристрою",
"delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server",
"delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device",
"delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server",
"delete_dialog_alert_local": "Ці елементи будуть видалені видалені з Вашого пристрою, але залишаться доступними на сервері Immich",
"delete_dialog_alert_local_non_backed_up": "Резервні копії деяких елементів не були завантажені в Immich і будуть видалені видалені з Вашого пристрою",
"delete_dialog_alert_remote": "Ці елементи будуть назавжди видалені з сервера Immich",
"delete_dialog_cancel": "Скасувати",
"delete_dialog_ok": "Видалити",
"delete_dialog_ok_force": "Delete Anyway",
"delete_dialog_ok_force": "Все одно видалити",
"delete_dialog_title": "Видалити остаточно",
"delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
"delete_local_dialog_ok_force": "Delete Anyway",
"delete_shared_link_dialog_content": "Are you sure you want to delete this shared link?",
"delete_shared_link_dialog_title": "Delete Shared Link",
"delete_local_dialog_ok_backed_up_only": "Видалити лише резервні копії",
"delete_local_dialog_ok_force": "Все одно видалити",
"delete_shared_link_dialog_content": "Ви впевнені, що хочете видалити це спільне посилання?",
"delete_shared_link_dialog_title": "Видалити спільне посилання",
"description_input_hint_text": "Додати опис...",
"description_input_submit_error": "Помилка оновлення опису, перевірте логи для подробиць",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_location_dialog_title": "Location",
"edit_date_time_dialog_date_time": "Дата і час",
"edit_date_time_dialog_timezone": "Часовий пояс",
"edit_location_dialog_title": "Місцезнаходження",
"exif_bottom_sheet_description": "Додати опис...",
"exif_bottom_sheet_details": "ПОДРОБИЦІ",
"exif_bottom_sheet_location": "МІСЦЕ",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_location_add": "Додати місцезнаходження",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "В розробці",
"experimental_settings_new_asset_list_title": "Експериментальний макет знімків",
"experimental_settings_subtitle": "На власний ризик!",
@@ -194,42 +195,42 @@
"home_page_add_to_album_conflicts": "Додано {added} елементів у альбом {album}. {failed} елементів вже було в альбомі.",
"home_page_add_to_album_err_local": "Неможливо додати локальні елементи до альбомів, пропущено",
"home_page_add_to_album_success": "Додано {added} елементів у альбом {album}.",
"home_page_album_err_partner": "Can not add partner assets to an album yet, skipping",
"home_page_album_err_partner": "Поки що не вдається додати елементи партнера до альбому, пропущено",
"home_page_archive_err_local": "Поки що неможливо заархівувати локальні елементи, пропущено",
"home_page_archive_err_partner": "Can not archive partner assets, skipping",
"home_page_archive_err_partner": "Неможливо архівувати елементи партнера, пропущено",
"home_page_building_timeline": "Побудова хронології",
"home_page_delete_err_partner": "Can not delete partner assets, skipping",
"home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
"home_page_favorite_err_local": "Неможливо отримати улюблені локальні елементи, пропущено",
"home_page_favorite_err_partner": "Can not favorite partner assets yet, skipping",
"home_page_delete_err_partner": "Неможливо видалити елементи партнера, пропущено",
"home_page_delete_remote_err_local": "Локальні елемент(и) вже в процесі видалення з сервера, пропущено",
"home_page_favorite_err_local": "Поки що не можна додати до улюблених локальні елементи, пропущено",
"home_page_favorite_err_partner": "Поки що не можна додати до улюблених елементи партнера, пропущено",
"home_page_first_time_notice": "Якщо ви вперше користуєтеся програмою, переконайтеся, що ви вибрали альбоми для резервування, щоб могти заповнювати хронологію знімків та відео в альбомах.",
"home_page_share_err_local": "Can not share local assets via link, skipping",
"home_page_share_err_local": "Неможливо поділитися локальними елементами через посилання, пропущено",
"home_page_upload_err_limit": "Можна вантажити не більше 30 елементів водночас, пропущено",
"image_viewer_page_state_provider_download_error": "Помилка завантаження",
"image_viewer_page_state_provider_download_success": "Усіпшно завантажено",
"image_viewer_page_state_provider_share_error": "Share Error",
"image_viewer_page_state_provider_share_error": "Помилка спільного доступу",
"library_page_albums": "Альбоми",
"library_page_archive": "Архів",
"library_page_device_albums": "Альбоми на Пристрої",
"library_page_device_albums": "Альбоми на пристрої",
"library_page_favorites": "Улюблені",
"library_page_new_album": "Новий альбом",
"library_page_sharing": "Спільні",
"library_page_sort_asset_count": "Number of assets",
"library_page_sort_asset_count": "Кількість елементів",
"library_page_sort_created": "Нещодавно створені",
"library_page_sort_last_modified": "Last modified",
"library_page_sort_most_oldest_photo": "Oldest photo",
"library_page_sort_most_recent_photo": "Most recent photo",
"library_page_sort_last_modified": "Остання зміна",
"library_page_sort_most_oldest_photo": "Найдавніші фото",
"library_page_sort_most_recent_photo": "Найновіші фото",
"library_page_sort_title": "Назва альбому",
"location_picker_choose_on_map": "Choose on map",
"location_picker_latitude": "Latitude",
"location_picker_latitude_error": "Enter a valid latitude",
"location_picker_latitude_hint": "Enter your latitude here",
"location_picker_longitude": "Longitude",
"location_picker_longitude_error": "Enter a valid longitude",
"location_picker_longitude_hint": "Enter your longitude here",
"location_picker_choose_on_map": "Обрати на мапі",
"location_picker_latitude": "Широта",
"location_picker_latitude_error": "Вкажіть дійсну широту",
"location_picker_latitude_hint": "Вкажіть широту",
"location_picker_longitude": "Довгота",
"location_picker_longitude_error": "Вкажіть дійсну довготу",
"location_picker_longitude_hint": "Вкажіть довготу",
"login_disabled": "Авторизація була відключена",
"login_form_api_exception": "Помилка API. Перевірте адресу сервера і спробуйте знову",
"login_form_back_button_text": "Back",
"login_form_back_button_text": "Назад",
"login_form_button_text": "Увійти",
"login_form_email_hint": "youremail@email.com",
"login_form_endpoint_hint": "http://your-server-ip:port/api",
@@ -239,10 +240,10 @@
"login_form_err_invalid_url": "Хибний URL",
"login_form_err_leading_whitespace": "Пробіл на початку",
"login_form_err_trailing_whitespace": "Пробіл в кінці",
"login_form_failed_get_oauth_server_config": "Помилка входу через OAuth, перевірте адресу сервера\n",
"login_form_failed_get_oauth_server_disable": "OAuth недоступний на цьому сервері\n",
"login_form_failed_get_oauth_server_config": "Помилка входу через OAuth, перевірте адресу сервера",
"login_form_failed_get_oauth_server_disable": "OAuth недоступний на цьому сервері",
"login_form_failed_login": "Помилка входу, перевірте URL-адресу сервера, електронну пошту та пароль",
"login_form_handshake_exception": "There was an Handshake Exception with the server. Enable self-signed certificate support in the settings if you are using a self-signed certificate.",
"login_form_handshake_exception": "Виняток рукостискання з сервером. Увімкніть підтримку самопідписаного сертифіката в налаштуваннях, якщо ви використовуєте самопідписаний сертифікат.",
"login_form_label_email": "Електронна пошта",
"login_form_label_password": "Пароль",
"login_form_next_button": "Далі",
@@ -252,35 +253,35 @@
"login_form_server_error": "Неможливо з'єднатися із сервером",
"login_password_changed_error": "Помилка у оновлені вашого пароля",
"login_password_changed_success": "Пароль оновлено успішно",
"map_assets_in_bound": "{} photo",
"map_assets_in_bounds": "{} photos",
"map_cannot_get_user_location": "Не можу отримати місцеперебування",
"map_assets_in_bound": "{} фото",
"map_assets_in_bounds": "{} фото",
"map_cannot_get_user_location": "Не можу отримати місцезнаходження",
"map_location_dialog_cancel": "Скасувати",
"map_location_dialog_yes": "Так",
"map_location_picker_page_use_location": "Use this location",
"map_location_service_disabled_content": "Служба локації має бути ввімкненою, щоб відображати елементи з вашого поточного місцеперебування. Увімкнути її зараз?",
"map_location_service_disabled_title": "Служба місцеперебування вимкнена",
"map_location_picker_page_use_location": "Це місцезнаходження",
"map_location_service_disabled_content": "Служба локації має бути ввімкненою, щоб відображати елементи з вашого поточного місцезнаходження. Увімкнути її зараз?",
"map_location_service_disabled_title": "Служба місцезнаходження вимкнена",
"map_no_assets_in_bounds": "Немає знімків із цього місця",
"map_no_location_permission_content": "Потрібен дозвіл, аби показувати елементи із поточного місцеперебування. Надати його зараз?",
"map_no_location_permission_title": "Помилка доступу до місцеперебування",
"map_no_location_permission_content": "Потрібен дозвіл, аби показувати елементи із поточного місцезнаходження. Надати його зараз?",
"map_no_location_permission_title": "Помилка доступу до місцезнаходження",
"map_settings_dark_mode": "Темний режим",
"map_settings_date_range_option_all": "All",
"map_settings_date_range_option_day": "Past 24 hours",
"map_settings_date_range_option_days": "Past {} days",
"map_settings_date_range_option_year": "Past year",
"map_settings_date_range_option_years": "Past {} years",
"map_settings_date_range_option_all": "Усі",
"map_settings_date_range_option_day": "Минулі 24 години",
"map_settings_date_range_option_days": "Минулих {} днів",
"map_settings_date_range_option_year": "Минулий рік",
"map_settings_date_range_option_years": "Минулі {} роки",
"map_settings_dialog_cancel": "Скасувати",
"map_settings_dialog_save": "Зберегти",
"map_settings_dialog_title": "Налаштування мапи",
"map_settings_include_show_archived": "Include Archived",
"map_settings_only_relative_range": "Діапазон дат",
"map_settings_include_show_archived": "Включити архівні дані",
"map_settings_only_relative_range": "Проміжок часу",
"map_settings_only_show_favorites": "Лише улюбені",
"map_settings_theme_settings": "Map Theme",
"map_settings_theme_settings": "Тема карти",
"map_zoom_to_see_photos": "Зменшіть, аби переглянути знімки",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Рухомі Знімки",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"multiselect_grid_edit_date_time_err_read_only": "Неможливо редагувати дату елементів лише для читання, пропущено",
"multiselect_grid_edit_gps_err_read_only": "Неможливо редагувати місцезнаходження елементів лише для читання, пропущено",
"notification_permission_dialog_cancel": "Скасувати",
"notification_permission_dialog_content": "Щоб увімкнути сповіщення, перейдіть до Налаштувань і надайте дозвіл.",
"notification_permission_dialog_settings": "Налаштування",
@@ -296,7 +297,7 @@
"partner_page_stop_sharing_content": "{} втратить доступ до ваших знімків.",
"partner_page_stop_sharing_title": "Припинити надання ваших знімків?",
"partner_page_title": "Партнер",
"permission_onboarding_back": "Back",
"permission_onboarding_back": "Назад",
"permission_onboarding_continue_anyway": "Все одно продовжити",
"permission_onboarding_get_started": "Розпочати",
"permission_onboarding_go_to_settings": "Перейти до налаштувань",
@@ -307,56 +308,56 @@
"permission_onboarding_permission_limited": "Обмежений доступ. Аби дозволити Immich резервне копіювання та керування вашою галереєю, надайте доступ до знімків та відео у Налаштуваннях",
"permission_onboarding_request": "Immich потребує доступу до ваших знімків та відео.",
"profile_drawer_app_logs": "Журнал",
"profile_drawer_client_out_of_date_major": "Mobile App is out of date. Please update to the latest major version.",
"profile_drawer_client_out_of_date_minor": "Mobile App is out of date. Please update to the latest minor version.",
"profile_drawer_client_server_up_to_date": "Клієнт та Сервер — актуальні",
"profile_drawer_documentation": "Documentation",
"profile_drawer_client_out_of_date_major": "Мобільний додаток застарів. Будь ласка, оновіть до останньої мажорної версії.",
"profile_drawer_client_out_of_date_minor": "Мобільний додаток застарів. Будь ласка, оновіть до останньої мінорної версії.",
"profile_drawer_client_server_up_to_date": "Клієнт та сервер — актуальні",
"profile_drawer_documentation": "Документація",
"profile_drawer_github": "GitHub",
"profile_drawer_server_out_of_date_major": "Server is out of date. Please update to the latest major version.",
"profile_drawer_server_out_of_date_minor": "Server is out of date. Please update to the latest minor version.",
"profile_drawer_server_out_of_date_major": "Сервер застарів. Будь ласка, оновіть до останньої мажорної версії.",
"profile_drawer_server_out_of_date_minor": "Сервер застарів. Будь ласка, оновіть до останньої мінорної версії.",
"profile_drawer_settings": "Налаштування",
"profile_drawer_sign_out": "Вийти",
"profile_drawer_trash": "Trash",
"profile_drawer_trash": "Кошик",
"recently_added_page_title": "Нещодавні",
"scaffold_body_error_occurred": "Error occurred",
"scaffold_body_error_occurred": "Виникла помилка",
"search_bar_hint": "Шукати ваші знімки",
"search_page_categories": "Категорії",
"search_page_favorites": "Улюблені",
"search_page_motion_photos": "Рухомі Знімки",
"search_page_motion_photos": "Рухомі знімки",
"search_page_no_objects": "Немає інформації про об'єкти",
"search_page_no_places": "No Places Info Available",
"search_page_people": "People",
"search_page_person_add_name_dialog_cancel": "Cancel",
"search_page_person_add_name_dialog_hint": "Name",
"search_page_person_add_name_dialog_save": "Save",
"search_page_person_add_name_dialog_title": "Add a name",
"search_page_person_add_name_subtitle": "Find them fast by name with search",
"search_page_person_add_name_title": "Add a name",
"search_page_person_edit_name": "Edit name",
"search_page_places": "Places",
"search_page_recently_added": "Recently added",
"search_page_screenshots": "Screenshots",
"search_page_selfies": "Selfies",
"search_page_things": "Things",
"search_page_videos": "Videos",
"search_page_view_all_button": "View all",
"search_page_your_activity": "Your activity",
"search_page_your_map": "Your Map",
"search_result_page_new_search_hint": "New Search",
"search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ",
"search_suggestion_list_smart_search_hint_2": "m:your-search-term",
"select_additional_user_for_sharing_page_suggestions": "Suggestions",
"search_page_no_places": "Інформація про місця недоступна",
"search_page_people": "Люди",
"search_page_person_add_name_dialog_cancel": "Скасувати",
"search_page_person_add_name_dialog_hint": "Ім'я",
"search_page_person_add_name_dialog_save": "Зберегти",
"search_page_person_add_name_dialog_title": "Додати ім'я",
"search_page_person_add_name_subtitle": "Швидко знайдіть їх за назвою за допомогою пошуку",
"search_page_person_add_name_title": "Додати ім'я",
"search_page_person_edit_name": "Відредагувати ім'я",
"search_page_places": "Місця",
"search_page_recently_added": "Нещодавно додані",
"search_page_screenshots": "Знімки екрану",
"search_page_selfies": "Селфі",
"search_page_things": "Речі",
"search_page_videos": "Відео",
"search_page_view_all_button": "Переглянути усі",
"search_page_your_activity": "Ваші дії",
"search_page_your_map": "Ваша мапа",
"search_result_page_new_search_hint": "Новий пошук",
"search_suggestion_list_smart_search_hint_1": "Інтелектуальний пошук увімкнено за замовчуванням, для пошуку метаданих використовуйте синтаксис",
"search_suggestion_list_smart_search_hint_2": "m:ваш-пошуковий-термін",
"select_additional_user_for_sharing_page_suggestions": "Пропозиції",
"select_user_for_sharing_page_err_album": "Не вдалося створити альбом",
"select_user_for_sharing_page_share_suggestions": "Suggestions",
"server_info_box_app_version": "App Version",
"server_info_box_latest_release": "Latest Version",
"server_info_box_server_url": "Server URL",
"server_info_box_server_version": "Server Version",
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).",
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).",
"setting_image_viewer_original_title": "Завантажити оригінальне зображення",
"setting_image_viewer_preview_subtitle": "Увімкніть для завантаження зображення середньої роздільної здатності. Вимкніть або для можливості безпосереднього завантаження оригіналу, або для використання лише мініатюр.",
"setting_image_viewer_preview_title": "Завантажити попередній перегляд зображення",
"select_user_for_sharing_page_share_suggestions": "Пропозиції",
"server_info_box_app_version": "Версія додатка",
"server_info_box_latest_release": "Остання версія",
"server_info_box_server_url": "URL сервера",
"server_info_box_server_version": "Версія сервера",
"setting_image_viewer_help": "Повноекранний переглядач спочатку завантажує зображення для попереднього перегляду в низькій роздільній здатності, потім завантажує зображення в зменшеній роздільній здатності відносно оригіналу (якщо включено) і зрештою завантажує оригінал (якщо включено).",
"setting_image_viewer_original_subtitle": "Увімкніть для завантаження оригінального зображення з повною роздільною здатністю (велике!).\nВимкніть, щоб зменшити використання даних (мережі та кешу пристрою).",
"setting_image_viewer_original_title": "Завантажувати оригінальне зображення",
"setting_image_viewer_preview_subtitle": "Увімкніть для завантаження зображень середньої роздільної здатності.\nВимкніть для безпосереднього завантаження оригіналу або використовувати лише мініатюру.",
"setting_image_viewer_preview_title": "Завантажувати зображення попереднього перегляду",
"setting_notifications_notify_failures_grace_period": "Повідомити про помилки фонового резервного копіювання: {}",
"setting_notifications_notify_hours": "{} годин",
"setting_notifications_notify_immediately": "негайно",
@@ -365,9 +366,9 @@
"setting_notifications_notify_seconds": "{} секунд",
"setting_notifications_single_progress_subtitle": "Детальна інформація про хід завантаження для кожного елементу",
"setting_notifications_single_progress_title": "Показати хід фонового резервного копіювання",
"setting_notifications_subtitle": "Налаштуйте свої параметри сповіщень",
"setting_notifications_subtitle": "Налаштування параметрів сповіщень",
"setting_notifications_title": "Сповіщення",
"setting_notifications_total_progress_subtitle": "Загальний прогрес (готово/загалом)",
"setting_notifications_total_progress_subtitle": "Загальний прогрес (виконано/загалом)",
"setting_notifications_total_progress_title": "Показати загальний хід фонового резервного копіювання",
"setting_pages_app_bar_settings": "Налаштування",
"settings_require_restart": "Перезавантажте програму для застосування цього налаштування",
@@ -375,66 +376,66 @@
"share_add_photos": "Додати знімки",
"share_add_title": "Додати назву",
"share_create_album": "Створити альбом",
"shared_album_activities_input_disable": "Comment is disabled",
"shared_album_activities_input_hint": "Say something",
"shared_album_activity_remove_content": "Do you want to delete this activity?",
"shared_album_activity_remove_title": "Delete Activity",
"shared_album_activity_setting_subtitle": "Let others respond",
"shared_album_activity_setting_title": "Comments & likes",
"shared_album_section_people_action_error": "Error leaving/removing from album",
"shared_album_section_people_action_leave": "Remove user from album",
"shared_album_section_people_action_remove_user": "Remove user from album",
"shared_album_section_people_owner_label": "Owner",
"shared_album_section_people_title": "PEOPLE",
"shared_album_activities_input_disable": "Коментування вимкнено",
"shared_album_activities_input_hint": "Скажіть що-небудь",
"shared_album_activity_remove_content": "Ви бажаєте видалити це повідомлення?",
"shared_album_activity_remove_title": "Видалити повідомлення",
"shared_album_activity_setting_subtitle": "Дозволити іншим відповідати",
"shared_album_activity_setting_title": "Коментарі та лайки",
"shared_album_section_people_action_error": "Помилка виходу/видалення з альбому",
"shared_album_section_people_action_leave": "Видалити користувача з альбому",
"shared_album_section_people_action_remove_user": "Видалити користувача з альбому",
"shared_album_section_people_owner_label": "Власник",
"shared_album_section_people_title": "ЛЮДИ",
"share_dialog_preparing": "Підготовка...",
"shared_link_app_bar_title": "Shared Links",
"shared_link_clipboard_copied_massage": "Copied to clipboard",
"shared_link_clipboard_text": "Link: {}\nPassword: {}",
"shared_link_create_app_bar_title": "Create link to share",
"shared_link_create_error": "Error while creating shared link",
"shared_link_create_info": "Let anyone with the link see the selected photo(s)",
"shared_link_create_submit_button": "Create link",
"shared_link_edit_allow_download": "Allow public user to download",
"shared_link_edit_allow_upload": "Allow public user to upload",
"shared_link_edit_app_bar_title": "Edit link",
"shared_link_edit_change_expiry": "Change expiration time",
"shared_link_edit_description": "Description",
"shared_link_edit_description_hint": "Enter the share description",
"shared_link_edit_expire_after": "Expire after",
"shared_link_edit_expire_after_option_day": "1 day",
"shared_link_edit_expire_after_option_days": "{} days",
"shared_link_edit_expire_after_option_hour": "1 hour",
"shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_password": "Password",
"shared_link_edit_password_hint": "Enter the share password",
"shared_link_edit_show_meta": "Show metadata",
"shared_link_edit_submit_button": "Update link",
"shared_link_empty": "You don't have any shared links",
"shared_link_error_server_url_fetch": "Cannot fetch the server url",
"shared_link_expired": "Expired",
"shared_link_expires_day": "Expires in {} day",
"shared_link_expires_days": "Expires in {} days",
"shared_link_expires_hour": "Expires in {} hour",
"shared_link_expires_hours": "Expires in {} hours",
"shared_link_expires_minute": "Expires in {} minute",
"shared_link_expires_minutes": "Expires in {} minutes",
"shared_link_expires_never": "Expires ∞",
"shared_link_expires_second": "Expires in {} second",
"shared_link_expires_seconds": "Expires in {} seconds",
"shared_link_info_chip_download": "Download",
"shared_link_app_bar_title": "Спільні посилання",
"shared_link_clipboard_copied_massage": "Скопійовано в буфер обміну",
"shared_link_clipboard_text": "Посилання: {}\nПароль: {}",
"shared_link_create_app_bar_title": "Створити посилання спільного доступу",
"shared_link_create_error": "Помилка під час створення спільного посилання",
"shared_link_create_info": "Дозволити всім, хто має посилання, переглянути вибрані фото",
"shared_link_create_submit_button": "Створити посилання",
"shared_link_edit_allow_download": "Дозволити публічному користувачеві скачувати файли",
"shared_link_edit_allow_upload": "Дозволити публічному користувачеві завантажувати файли",
"shared_link_edit_app_bar_title": "Редагувати посилання",
"shared_link_edit_change_expiry": "Змінити термін дії",
"shared_link_edit_description": "Опис",
"shared_link_edit_description_hint": "Введіть опис для спільного доступу",
"shared_link_edit_expire_after": "Термін дії закінчується через",
"shared_link_edit_expire_after_option_day": "1 день",
"shared_link_edit_expire_after_option_days": "{} днів",
"shared_link_edit_expire_after_option_hour": "1 годину",
"shared_link_edit_expire_after_option_hours": "{} годин",
"shared_link_edit_expire_after_option_minute": "1 хвилину",
"shared_link_edit_expire_after_option_minutes": "{} хвилин",
"shared_link_edit_expire_after_option_never": "Ніколи",
"shared_link_edit_password": "Пароль",
"shared_link_edit_password_hint": "Введіть пароль для спільного доступу",
"shared_link_edit_show_meta": "Показувати метадані",
"shared_link_edit_submit_button": "Оновити посилання",
"shared_link_empty": "У вас немає спільних посилань",
"shared_link_error_server_url_fetch": "Неможливо запитати URL із сервера",
"shared_link_expired": "Закінчився термін дії",
"shared_link_expires_day": "Закінчується через {} день",
"shared_link_expires_days": "Закінчується через {} днів",
"shared_link_expires_hour": "Закінчується через {} годину",
"shared_link_expires_hours": "Закінчується через {} годин",
"shared_link_expires_minute": "Закінчується через {} хвилину",
"shared_link_expires_minutes": "Закінчується через {} хвилин",
"shared_link_expires_never": "Закінчується ∞",
"shared_link_expires_second": "Закінчується через {} секунду",
"shared_link_expires_seconds": "Закінчується через {} секунд",
"shared_link_info_chip_download": "Скачати",
"shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Upload",
"shared_link_manage_links": "Manage Shared links",
"share_done": "Done",
"shared_link_info_chip_upload": "Завантажити",
"shared_link_manage_links": "Керування спільними посиланнями",
"share_done": "Готово",
"share_invite": "Запросити в альбом",
"sharing_page_album": "Спільні альбоми",
"sharing_page_description": "Створюйте спільні альбоми, щоб ділитися знімками та відео з людьми у вашій мережі.",
"sharing_page_empty_list": "ПОРОЖНІЙ СПИСОК",
"sharing_silver_appbar_create_shared_album": "Створити спільний альбом",
"sharing_silver_appbar_shared_links": "Shared links",
"sharing_silver_appbar_shared_links": "Спільні посилання",
"sharing_silver_appbar_share_partner": "Поділитися з партнером",
"tab_controller_nav_library": "Бібліотека",
"tab_controller_nav_photos": "Знімки",
@@ -443,26 +444,26 @@
"theme_setting_asset_list_storage_indicator_title": "Показувати піктограму сховища на плитках елементів",
"theme_setting_asset_list_tiles_per_row_title": "Кількість елементів у рядку ({})",
"theme_setting_dark_mode_switch": "Темна тема",
"theme_setting_image_viewer_quality_subtitle": "Налаштувати якість перегляду повних зображень",
"theme_setting_image_viewer_quality_subtitle": "Налаштування якості перегляду повноекранних зображень",
"theme_setting_image_viewer_quality_title": "Якість перегляду зображень",
"theme_setting_system_theme_switch": "Автоматично (як система)",
"theme_setting_theme_subtitle": "Виберіть налаштування теми програми",
"theme_setting_system_theme_switch": "Автоматично (як у системі)",
"theme_setting_theme_subtitle": "Налаштування теми додатка",
"theme_setting_theme_title": "Тема",
"theme_setting_three_stage_loading_subtitle": "Триетапне завантаження може підвищити продуктивність завантаження, але спричинить значно більше навантаження на мережу",
"theme_setting_three_stage_loading_title": "Увімкнути триетапне завантаження",
"translated_text_options": "Налаштування",
"trash_page_delete": "Delete",
"trash_page_delete_all": "Delete All",
"trash_page_empty_trash_btn": "Empty trash",
"trash_page_empty_trash_dialog_content": "Do you want to empty your trashed assets? These items will be permanently removed from Immich",
"trash_page_empty_trash_dialog_ok": "Ok",
"trash_page_info": "Trashed items will be permanently deleted after {} days",
"trash_page_no_assets": "No trashed assets",
"trash_page_restore": "Restore",
"trash_page_restore_all": "Restore All",
"trash_page_select_assets_btn": "Select assets",
"trash_page_select_btn": "Select",
"trash_page_title": "Trash ({})",
"trash_page_delete": "Видалити",
"trash_page_delete_all": "Видалити усі",
"trash_page_empty_trash_btn": "Очистити кошик",
"trash_page_empty_trash_dialog_content": "Бажаєте очистити ваші елементи в кошику? Ці елементи буде остаточно видалено з Immich.",
"trash_page_empty_trash_dialog_ok": "OK",
"trash_page_info": "Поміщені у кошик елементи буде остаточно видалено через {} днів",
"trash_page_no_assets": "Віддалені елементи відсутні",
"trash_page_restore": "Відновити",
"trash_page_restore_all": "Відновити усі",
"trash_page_select_assets_btn": "Вибрані елементи",
"trash_page_select_btn": "Вибрати",
"trash_page_title": "Кошик ({})",
"upload_dialog_cancel": "Скасувати",
"upload_dialog_info": "Бажаєте створити резервну копію вибраних елементів на сервері?",
"upload_dialog_ok": "Завантажити",
@@ -473,7 +474,7 @@
"version_announcement_overlay_text_2": "знайдіть хвильку навідатися на ",
"version_announcement_overlay_text_3": "і переконайтеся, що ваші налаштування docker-compose та .env оновлені, аби запобігти будь-якій неправильній конфігурації, особливо, якщо ви використовуєте WatchTower або інший механізм, для автоматичних оновлень вашої серверної частини.",
"version_announcement_overlay_title": "Доступна нова версія сервера \uD83C\uDF89",
"viewer_remove_from_stack": "Remove from Stack",
"viewer_stack_use_as_main_asset": "Use as Main Asset",
"viewer_unstack": "Un-Stack"
"viewer_remove_from_stack": "Видалити зі стеку",
"viewer_stack_use_as_main_asset": "Використовувати як основний елементи",
"viewer_unstack": "Розібрати стек"
}

View File

@@ -1,9 +1,9 @@
{
"action_common_cancel": "Cancel",
"action_common_update": "Update",
"action_common_cancel": "Từ chối",
"action_common_update": "Cập nhật",
"add_to_album_bottom_sheet_added": "Thêm vào {album}",
"add_to_album_bottom_sheet_already_exists": "Đã có sẵn trong {album}",
"advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_log_level_title": "Phân loại nhật ký: {}",
"advanced_settings_prefer_remote_subtitle": "Trên một số thiết bị, việc tải hình thu nhỏ từ ảnh trên thiết bị diễn ra chậm. Kích hoạt cài đặt này để tải ảnh từ máy chủ.",
"advanced_settings_prefer_remote_title": "Ưu tiên ảnh từ máy chủ",
"advanced_settings_self_signed_ssl_subtitle": "Bỏ qua xác minh chứng chỉ SSL cho máy chủ cuối. Yêu cầu cho chứng chỉ tự ký.",
@@ -35,8 +35,8 @@
"app_bar_signout_dialog_title": "Đăng xuất",
"archive_page_no_archived_assets": "Không tìm thấy ảnh đã lưu trữ",
"archive_page_title": "Kho lưu trữ ({})",
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_action_delete_err_read_only": "Không thể xoá ảnh chỉ có quyền đọc, bỏ qua",
"asset_action_share_err_offline": "Không thể tải ảnh ngoại tuyến, bỏ qua",
"asset_list_layout_settings_dynamic_layout_title": "Bố cục động",
"asset_list_layout_settings_group_automatically": "Tự động",
"asset_list_layout_settings_group_by": " Nhóm ảnh theo",
@@ -111,9 +111,9 @@
"cache_settings_album_thumbnails": "Trang thư viện hình thu nhỏ ({} ảnh)",
"cache_settings_clear_cache_button": "Xoá bộ nhớ đệm",
"cache_settings_clear_cache_button_title": "Xóa bộ nhớ đệm của ứng dụng. Điều này sẽ ảnh hưởng đến hiệu suất của ứng dụng đến khi bộ nhớ đệm được tạo lại.",
"cache_settings_duplicated_assets_clear_button": "CLEAR",
"cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app",
"cache_settings_duplicated_assets_title": "Duplicated Assets ({})",
"cache_settings_duplicated_assets_clear_button": "XOÁ",
"cache_settings_duplicated_assets_subtitle": "Ảnh và video không được phép hiển thị trên ứng dụng",
"cache_settings_duplicated_assets_title": "Ảnh bị trùng lặp ({})",
"cache_settings_image_cache_size": "Kích thước bộ nhớ đệm ảnh ({} ảnh)",
"cache_settings_statistics_album": "Thư viện hình thu nhỏ",
"cache_settings_statistics_assets": "{} ảnh ({})",
@@ -142,17 +142,17 @@
"control_bottom_app_bar_archive": "Kho lưu trữ",
"control_bottom_app_bar_create_new_album": "Tạo album mới",
"control_bottom_app_bar_delete": "Xoá",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "Edit Date & Time",
"control_bottom_app_bar_delete_from_immich": "Xóa khỏi Immich",
"control_bottom_app_bar_delete_from_local": "Xóa khỏi thiết bị\n",
"control_bottom_app_bar_edit_location": "Chỉnh sửa vị trí",
"control_bottom_app_bar_edit_time": "Chỉnh sửa Ngày và Giờ",
"control_bottom_app_bar_favorite": "Yêu thích",
"control_bottom_app_bar_share": "Chia sẻ",
"control_bottom_app_bar_share_to": "Chia sẻ với",
"control_bottom_app_bar_stack": "Ngắn xếp",
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
"control_bottom_app_bar_stack": "Xếp nhóm",
"control_bottom_app_bar_trash_from_immich": "Di chuyển tới thùng rác",
"control_bottom_app_bar_unarchive": "Huỷ lưu trữ",
"control_bottom_app_bar_unfavorite": "Unfavorite",
"control_bottom_app_bar_unfavorite": "Bỏ yêu thích",
"control_bottom_app_bar_upload": "Tải lên",
"create_album_page_untitled": "Không tiêu đề",
"create_shared_album_page_create": "Tạo",
@@ -165,26 +165,27 @@
"daily_title_text_date_year": "E, MMM dd, yyyy",
"date_format": "E, LLL d, y • h:mm a",
"delete_dialog_alert": "Những mục này sẽ bị xóa vĩnh viễn khỏi Immich và thiết bị của bạn",
"delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server",
"delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device",
"delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server",
"delete_dialog_alert_local": "Những mục này sẽ bị xóa vĩnh viễn khỏi thiết bị của bạn nhưng vẫn còn lưu trữ trên máy chủ Immich",
"delete_dialog_alert_local_non_backed_up": "Một số mục chưa được sao lưu lên Immich và sẽ bị xóa vĩnh viễn khỏi thiết bị của bạn.",
"delete_dialog_alert_remote": "Những mục này sẽ bị xóa vĩnh viễn khỏi máy chủ Immich",
"delete_dialog_cancel": "Từ chối",
"delete_dialog_ok": "Xoá",
"delete_dialog_ok_force": "Delete Anyway",
"delete_dialog_ok_force": "Xóa Vĩnh Viễn",
"delete_dialog_title": "Xoá vĩnh viễn",
"delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
"delete_local_dialog_ok_force": "Delete Anyway",
"delete_local_dialog_ok_backed_up_only": "Xoá ảnh đã sao lưu",
"delete_local_dialog_ok_force": "Vẫn xoá",
"delete_shared_link_dialog_content": "Bạn có muốn xóa liên kết đã chia sẻ này không?",
"delete_shared_link_dialog_title": "Xoá liên kết đã chia sẻ",
"description_input_hint_text": "Thêm mô tả...",
"description_input_submit_error": "Cập nhật mô tả không thành công, vui lòng kiểm tra nhật ký để biết thêm chi tiết",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_location_dialog_title": "Location",
"edit_date_time_dialog_date_time": "Ngày và Giờ",
"edit_date_time_dialog_timezone": "Múi giờ",
"edit_location_dialog_title": "Vị trí",
"exif_bottom_sheet_description": "Thêm mô tả...",
"exif_bottom_sheet_details": "CHI TIẾT",
"exif_bottom_sheet_location": "VỊ TRÍ",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_location_add": "Thêm vị trí",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "Đang trong quá trình phát triển",
"experimental_settings_new_asset_list_title": "Bật lưới ảnh thử nghiệm",
"experimental_settings_subtitle": "Sử dụng có thể rủi ro!",
@@ -214,22 +215,22 @@
"library_page_favorites": "Ảnh yêu thích",
"library_page_new_album": "Album mới",
"library_page_sharing": "Chia sẻ",
"library_page_sort_asset_count": "Number of assets",
"library_page_sort_asset_count": "Số lượng ảnh",
"library_page_sort_created": "Mới tạo gần đây",
"library_page_sort_last_modified": "Sửa đổi lần cuối",
"library_page_sort_most_oldest_photo": "Oldest photo",
"library_page_sort_most_oldest_photo": "Ảnh cũ nhất",
"library_page_sort_most_recent_photo": "Ảnh gần đây nhất",
"library_page_sort_title": "Tiêu đề album",
"location_picker_choose_on_map": "Choose on map",
"location_picker_latitude": "Latitude",
"location_picker_latitude_error": "Enter a valid latitude",
"location_picker_latitude_hint": "Enter your latitude here",
"location_picker_longitude": "Longitude",
"location_picker_longitude_error": "Enter a valid longitude",
"location_picker_longitude_hint": "Enter your longitude here",
"location_picker_choose_on_map": "Chọn trên bản đồ",
"location_picker_latitude": "Vĩ độ",
"location_picker_latitude_error": "Nhập vĩ độ hợp lệ",
"location_picker_latitude_hint": "Nhập vĩ độ của bạn",
"location_picker_longitude": "Kinh độ",
"location_picker_longitude_error": "Nhập kinh độ hợp lệ",
"location_picker_longitude_hint": "Nhập kinh độ của bạn",
"login_disabled": "Đăng nhập bị vô hiệu hoá",
"login_form_api_exception": "Lỗi API. Vui lòng kiểm tra địa chỉ máy chủ và thử lại.",
"login_form_back_button_text": "Back",
"login_form_back_button_text": "Quay lại",
"login_form_button_text": "Đăng nhập",
"login_form_email_hint": "emailcuaban@email.com",
"login_form_endpoint_hint": "http://địa-chỉ-ip-máy-chủ-bạn:cổng/api",
@@ -252,35 +253,35 @@
"login_form_server_error": "Không thể kết nối tới máy chủ.",
"login_password_changed_error": "Thay đổi mật khẩu không thành công",
"login_password_changed_success": "Cập nhật mật khẩu thành công",
"map_assets_in_bound": "{} photo",
"map_assets_in_bounds": "{} photos",
"map_assets_in_bound": "{} ảnh",
"map_assets_in_bounds": "{} ảnh",
"map_cannot_get_user_location": "Không thể xác định vị trí của bạn",
"map_location_dialog_cancel": "Từ chối",
"map_location_dialog_yes": "Có",
"map_location_picker_page_use_location": "Use this location",
"map_location_picker_page_use_location": "Dùng vị trí này",
"map_location_service_disabled_content": "Cần bật dịch vụ định vị để hiển thị ảnh hoặc video từ vị trí hiện tại của bạn. Bạn có muốn bật nó ngay bây giờ không?",
"map_location_service_disabled_title": "Dịch vụ vị trí bị vô hiệu hoá",
"map_no_assets_in_bounds": "Không có ảnh trong khu vực này",
"map_no_location_permission_content": "Cần quyền truy cập vị trí để hiển thị ảnh từ vị trí hiện tại của bạn. Bạn có muốn cho phép ngay bây giờ không?",
"map_no_location_permission_title": "Ứng dụng không được phép truy cập vị trí",
"map_settings_dark_mode": "Chế độ tối",
"map_settings_date_range_option_all": "All",
"map_settings_date_range_option_day": "Past 24 hours",
"map_settings_date_range_option_days": "Past {} days",
"map_settings_date_range_option_year": "Past year",
"map_settings_date_range_option_years": "Past {} years",
"map_settings_date_range_option_all": "Tất cả",
"map_settings_date_range_option_day": "Trong vòng 24 giờ qua",
"map_settings_date_range_option_days": "Trong {} ngày qua",
"map_settings_date_range_option_year": "Năm ngoái",
"map_settings_date_range_option_years": "Trong {} năm qua",
"map_settings_dialog_cancel": "Từ chối",
"map_settings_dialog_save": "Lưu",
"map_settings_dialog_title": "Cài đặt bản đồ",
"map_settings_include_show_archived": "Bao gồm ảnh đã lưu trữ",
"map_settings_only_relative_range": "Khoảng thời gian",
"map_settings_only_show_favorites": "Chỉ hiển thị mục yêu thích",
"map_settings_theme_settings": "Map Theme",
"map_settings_theme_settings": "Giao diện bản đồ",
"map_zoom_to_see_photos": "Thu nhỏ để xem ảnh",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Ảnh động",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"multiselect_grid_edit_date_time_err_read_only": "Không thể chỉnh sửa ngày của ảnh chỉ có quyền đọc, bỏ qua",
"multiselect_grid_edit_gps_err_read_only": "Không thể chỉnh sửa vị trí của ảnh chỉ có quyền đọc, bỏ qua",
"notification_permission_dialog_cancel": "Từ chối",
"notification_permission_dialog_content": "Để bật thông báo, chuyển tới Cài đặt và chọn cho phép",
"notification_permission_dialog_settings": "Cài đặt",
@@ -307,18 +308,18 @@
"permission_onboarding_permission_limited": "Quyền truy cập vào ảnh của bạn bị hạn chế. Để Immich sao lưu và quản lý toàn bộ thư viện ảnh của bạn, hãy cấp quyền truy cập toàn bộ ảnh trong Cài đặt.",
"permission_onboarding_request": "Immich cần quyền để xem ảnh và video của bạn",
"profile_drawer_app_logs": "Nhật ký",
"profile_drawer_client_out_of_date_major": "Mobile App is out of date. Please update to the latest major version.",
"profile_drawer_client_out_of_date_minor": "Mobile App is out of date. Please update to the latest minor version.",
"profile_drawer_client_out_of_date_major": "Ứng dụng đã lỗi thời. Vui lòng cập nhật lên phiên bản chính mới nhất.",
"profile_drawer_client_out_of_date_minor": "Ứng dụng đã lỗi thời. Vui lòng cập nhật lên phiên bản phụ mới nhất.",
"profile_drawer_client_server_up_to_date": "Máy khách và máy chủ đã cập nhật",
"profile_drawer_documentation": "Tài liệu",
"profile_drawer_github": "GitHub",
"profile_drawer_server_out_of_date_major": "Server is out of date. Please update to the latest major version.",
"profile_drawer_server_out_of_date_minor": "Server is out of date. Please update to the latest minor version.",
"profile_drawer_server_out_of_date_major": "Máy chủ đã lỗi thời. Vui lòng cập nhật lên phiên bản chính mới nhất.",
"profile_drawer_server_out_of_date_minor": "Máy chủ đã lỗi thời. Vui lòng cập nhật lên phiên bản phụ mới nhất.",
"profile_drawer_settings": "Cài đặt",
"profile_drawer_sign_out": "Đăng xuất",
"profile_drawer_trash": "Thùng rác",
"recently_added_page_title": "Mới thêm gần đây",
"scaffold_body_error_occurred": "Error occurred",
"scaffold_body_error_occurred": "Xảy ra lỗi",
"search_bar_hint": "Tìm kiếm ảnh của bạn",
"search_page_categories": "Danh mục",
"search_page_favorites": "Ảnh yêu thích",
@@ -326,13 +327,13 @@
"search_page_no_objects": "Không có thông tin sự vật",
"search_page_no_places": "Không có thông tin địa điểm nào",
"search_page_people": "Mọi người",
"search_page_person_add_name_dialog_cancel": "Cancel",
"search_page_person_add_name_dialog_hint": "Name",
"search_page_person_add_name_dialog_save": "Save",
"search_page_person_add_name_dialog_title": "Add a name",
"search_page_person_add_name_subtitle": "Find them fast by name with search",
"search_page_person_add_name_title": "Add a name",
"search_page_person_edit_name": "Edit name",
"search_page_person_add_name_dialog_cancel": "Từ chối",
"search_page_person_add_name_dialog_hint": "Tên",
"search_page_person_add_name_dialog_save": "Lưu",
"search_page_person_add_name_dialog_title": "Thêm tên",
"search_page_person_add_name_subtitle": "Tìm nhanh theo tên với chức năng tìm kiếm",
"search_page_person_add_name_title": "Thêm tên",
"search_page_person_edit_name": "Chỉnh sửa tên",
"search_page_places": "Địa điểm",
"search_page_recently_added": "Mới thêm gần đây",
"search_page_screenshots": "Ảnh màn hình",
@@ -341,7 +342,7 @@
"search_page_videos": "Video",
"search_page_view_all_button": "Xem tất cả",
"search_page_your_activity": "Hoạt động của bạn",
"search_page_your_map": "Your Map",
"search_page_your_map": "Bản đồ của bạn",
"search_result_page_new_search_hint": "Tìm kiếm mới",
"search_suggestion_list_smart_search_hint_1": "Tìm kiếm thông minh được bật mặc định, để tìm kiếm siêu dữ liệu hãy sử dụng cú pháp",
"search_suggestion_list_smart_search_hint_2": "m:cụm-từ-tìm-kiếm-của-bạn",
@@ -381,17 +382,17 @@
"shared_album_activity_remove_title": "Xoá hoạt động",
"shared_album_activity_setting_subtitle": "Cho phép người khác phản hồi",
"shared_album_activity_setting_title": "Bình luận và lượt thích",
"shared_album_section_people_action_error": "Error leaving/removing from album",
"shared_album_section_people_action_leave": "Remove user from album",
"shared_album_section_people_action_remove_user": "Remove user from album",
"shared_album_section_people_owner_label": "Owner",
"shared_album_section_people_title": "PEOPLE",
"shared_album_section_people_action_error": "Lỗi khi xoá khỏi album",
"shared_album_section_people_action_leave": "Xóa người dùng khỏi album",
"shared_album_section_people_action_remove_user": "Xóa người dùng khỏi album",
"shared_album_section_people_owner_label": "Chủ sở hữu",
"shared_album_section_people_title": "MỌI NGƯỜI",
"share_dialog_preparing": "Đang xử lý...",
"shared_link_app_bar_title": "Đường liên kết chia sẻ",
"shared_link_clipboard_copied_massage": "Copied to clipboard",
"shared_link_clipboard_text": "Link: {}\nPassword: {}",
"shared_link_clipboard_copied_massage": "Đã sao chép tới bản ghi tạm",
"shared_link_clipboard_text": "Liên kết: {}\nMật khẩu: {}",
"shared_link_create_app_bar_title": "Tạo liên kết để chia sẻ",
"shared_link_create_error": "Error while creating shared link",
"shared_link_create_error": "Tạo liên kết chia sẻ không thành công",
"shared_link_create_info": "Cho phép bất cứ ai có liên kết xem (các) ảnh đã chọn",
"shared_link_create_submit_button": "Tạo liên kết",
"shared_link_edit_allow_download": "Cho phép bất cứ ai đều có thể tải xuống",
@@ -401,32 +402,32 @@
"shared_link_edit_description": "Mô tả",
"shared_link_edit_description_hint": "Nhập mô tả chia sẻ",
"shared_link_edit_expire_after": "Hết hạn sau",
"shared_link_edit_expire_after_option_day": "1 day",
"shared_link_edit_expire_after_option_days": "{} days",
"shared_link_edit_expire_after_option_hour": "1 hour",
"shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_expire_after_option_day": "1 ngày",
"shared_link_edit_expire_after_option_days": "{} ngày",
"shared_link_edit_expire_after_option_hour": "1 giờ",
"shared_link_edit_expire_after_option_hours": "{} giờ",
"shared_link_edit_expire_after_option_minute": "1 phút",
"shared_link_edit_expire_after_option_minutes": "{} phút",
"shared_link_edit_expire_after_option_never": "Không bao giờ",
"shared_link_edit_password": "Mật khẩu",
"shared_link_edit_password_hint": "Nhập mật khẩu chia sẻ",
"shared_link_edit_show_meta": "Hiện thị siêu dữ liệu",
"shared_link_edit_submit_button": "Cập nhật liên kết",
"shared_link_empty": "Bạn không có liên kết được chia sẻ nào",
"shared_link_error_server_url_fetch": "Cannot fetch the server url",
"shared_link_expired": "Expired",
"shared_link_expires_day": "Expires in {} day",
"shared_link_expires_days": "Expires in {} days",
"shared_link_expires_hour": "Expires in {} hour",
"shared_link_expires_hours": "Expires in {} hours",
"shared_link_expires_minute": "Expires in {} minute",
"shared_link_expires_minutes": "Expires in {} minutes",
"shared_link_expires_never": "Expires ∞",
"shared_link_expires_second": "Expires in {} second",
"shared_link_expires_seconds": "Expires in {} seconds",
"shared_link_info_chip_download": "Download",
"shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Upload",
"shared_link_error_server_url_fetch": "Không thể kết nối địa chỉ máy chủ",
"shared_link_expired": "Đã hết hạn",
"shared_link_expires_day": "Hết hạn trong {} ngày",
"shared_link_expires_days": "Hết hạn trong {} ngày",
"shared_link_expires_hour": "Hết hạn trong {} giờ",
"shared_link_expires_hours": "Hết hạn trong {} giờ",
"shared_link_expires_minute": "Hết hạn trong {} phút",
"shared_link_expires_minutes": "Hết hạn trong {} phút",
"shared_link_expires_never": "Hết hạn ∞\n",
"shared_link_expires_second": "Hết hạn trong {} giây",
"shared_link_expires_seconds": "Hết hạn trong {} giây",
"shared_link_info_chip_download": "Tải xuống",
"shared_link_info_chip_metadata": "Dữ liệu EXIF",
"shared_link_info_chip_upload": "Tải lên",
"shared_link_manage_links": "Quản lý liên kết được chia sẻ",
"share_done": "Hoàn tất",
"share_invite": "Mời vào album",
@@ -441,11 +442,11 @@
"tab_controller_nav_search": "Tìm kiếm",
"tab_controller_nav_sharing": "Chia sẻ",
"theme_setting_asset_list_storage_indicator_title": "Hiện thị trạng thái sao lưu ảnh trên hình thu nhỏ ",
"theme_setting_asset_list_tiles_per_row_title": "Số ảnh và video trên một dòng ({})",
"theme_setting_asset_list_tiles_per_row_title": "Số lượng ảnh trên một dòng ({})",
"theme_setting_dark_mode_switch": "Chế độ tối",
"theme_setting_image_viewer_quality_subtitle": "Điều chỉnh chất lượng của trình xem ảnh",
"theme_setting_image_viewer_quality_title": "Chất lượng trình xem ảnh",
"theme_setting_system_theme_switch": "Tư động (Theo cài đặt hệ thống)",
"theme_setting_system_theme_switch": "T động (Theo cài đặt hệ thống)",
"theme_setting_theme_subtitle": "Chọn cài đặt giao diện ứng dụng",
"theme_setting_theme_title": "Giao diện",
"theme_setting_three_stage_loading_subtitle": "Tải ba giai doạn có thể tăng hiệu năng tải ảnh nhưng sẽ tốn dữ liệu mạng đáng kể.",
@@ -473,7 +474,7 @@
"version_announcement_overlay_text_2": "vui lòng dành thời gian của bạn để đến thăm",
"version_announcement_overlay_text_3": "và đảm bảo cài đặt docker-compose và tệp .env của bạn đã cập nhật để tránh bất kỳ cấu hình sai sót, đặc biệt nếu bạn dùng WatchTower hoặc bất kỳ cơ chế nào xử lý việc cập nhật ứng dụng máy chủ của bạn tự động.",
"version_announcement_overlay_title": "Phiên bản máy chủ có bản cập nhật mới",
"viewer_remove_from_stack": "Loại bỏ khỏi ngăn xếp",
"viewer_stack_use_as_main_asset": "Sử dụng làm ảnh bìa ngăn xếp",
"viewer_unstack": "Hoàn tác ngăn xếp"
"viewer_remove_from_stack": "Xoá khỏi nhóm",
"viewer_stack_use_as_main_asset": "Đặt làm lựa chọn hàng đầu",
"viewer_unstack": "Huỷ xếp nhóm"
}

View File

@@ -80,7 +80,7 @@
"backup_controller_page_backup_sub": "已备份的照片和视频",
"backup_controller_page_cancel": "取消",
"backup_controller_page_created": "创建时间: {}",
"backup_controller_page_desc_backup": "打开前台备份,以在程序运行时自动备份。",
"backup_controller_page_desc_backup": "打开前台备份,以在程序运行时自动备份新项目。",
"backup_controller_page_excluded": "已排除:",
"backup_controller_page_failed": "失败({}",
"backup_controller_page_filename": "文件名称: {} [{}]",
@@ -121,7 +121,7 @@
"cache_settings_statistics_shared": "共享相册缩略图",
"cache_settings_statistics_thumbnail": "缩略图",
"cache_settings_statistics_title": "缓存使用情况",
"cache_settings_subtitle": "控制 Immich 的缓存行为",
"cache_settings_subtitle": "控制 Immich app 的缓存行为",
"cache_settings_thumbnail_size": "缩略图缓存大小({} 项)",
"cache_settings_tile_subtitle": "设置本地存储行为",
"cache_settings_tile_title": "本地存储",
@@ -134,7 +134,7 @@
"common_add_to_album": "添加到相册",
"common_change_password": "更改密码",
"common_create_new_album": "新建相册",
"common_server_error": "请检查您的网络连接,确保服务器可访问且该应用程序服务器版本兼容。",
"common_server_error": "请检查您的网络连接,确保服务器可访问且该应用程序服务器版本兼容。",
"common_shared": "共享",
"control_bottom_app_bar_add_to_album": "添加到相册",
"control_bottom_app_bar_album_info": "{} 项",
@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "详情",
"exif_bottom_sheet_location": "位置",
"exif_bottom_sheet_location_add": "添加位置信息",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "正在处理",
"experimental_settings_new_asset_list_title": "启用实验性照片网格",
"experimental_settings_subtitle": "使用风险自负!",
@@ -207,7 +208,7 @@
"home_page_upload_err_limit": "一次最多只能上传 30 个项目,跳过",
"image_viewer_page_state_provider_download_error": "下载出现错误",
"image_viewer_page_state_provider_download_success": "下载成功",
"image_viewer_page_state_provider_share_error": "共享错",
"image_viewer_page_state_provider_share_error": "共享错",
"library_page_albums": "相册",
"library_page_archive": "归档",
"library_page_device_albums": "设备上的相册",
@@ -248,7 +249,7 @@
"login_form_next_button": "下一个",
"login_form_password_hint": "密码",
"login_form_save_login": "保持登录",
"login_form_server_empty": "输入服务器地址",
"login_form_server_empty": "输入服务器地址",
"login_form_server_error": "无法连接到服务器。",
"login_password_changed_error": "更新密码时出错\n",
"login_password_changed_success": "密码更新成功",
@@ -267,7 +268,7 @@
"map_settings_date_range_option_all": "所有",
"map_settings_date_range_option_day": "过去24小时",
"map_settings_date_range_option_days": "{}天前",
"map_settings_date_range_option_year": "去年",
"map_settings_date_range_option_year": "1年前",
"map_settings_date_range_option_years": "{}年前",
"map_settings_dialog_cancel": "取消",
"map_settings_dialog_save": "保存",
@@ -343,7 +344,7 @@
"search_page_your_activity": "您的活动",
"search_page_your_map": "足迹",
"search_result_page_new_search_hint": "搜索新的",
"search_suggestion_list_smart_search_hint_1": "默认情况下启用智能搜索要搜索元数据,请使用相关语法",
"search_suggestion_list_smart_search_hint_1": "默认情况下启用智能搜索要搜索元数据,请使用相关语法",
"search_suggestion_list_smart_search_hint_2": "m:您的搜索关键词",
"select_additional_user_for_sharing_page_suggestions": "建议",
"select_user_for_sharing_page_err_album": "创建相册失败",

View File

@@ -80,7 +80,7 @@
"backup_controller_page_backup_sub": "已备份的照片和视频",
"backup_controller_page_cancel": "取消",
"backup_controller_page_created": "创建时间: {}",
"backup_controller_page_desc_backup": "打开前台备份,以在程序运行时自动备份。",
"backup_controller_page_desc_backup": "打开前台备份,以在程序运行时自动备份新项目。",
"backup_controller_page_excluded": "已排除:",
"backup_controller_page_failed": "失败({}",
"backup_controller_page_filename": "文件名称: {} [{}]",
@@ -121,7 +121,7 @@
"cache_settings_statistics_shared": "共享相册缩略图",
"cache_settings_statistics_thumbnail": "缩略图",
"cache_settings_statistics_title": "缓存使用情况",
"cache_settings_subtitle": "控制 Immich 的缓存行为",
"cache_settings_subtitle": "控制 Immich app 的缓存行为",
"cache_settings_thumbnail_size": "缩略图缓存大小({} 项)",
"cache_settings_tile_subtitle": "设置本地存储行为",
"cache_settings_tile_title": "本地存储",
@@ -134,7 +134,7 @@
"common_add_to_album": "添加到相册",
"common_change_password": "更改密码",
"common_create_new_album": "新建相册",
"common_server_error": "请检查您的网络连接,确保服务器可访问且该应用程序服务器版本兼容。",
"common_server_error": "请检查您的网络连接,确保服务器可访问且该应用程序服务器版本兼容。",
"common_shared": "共享",
"control_bottom_app_bar_add_to_album": "添加到相册",
"control_bottom_app_bar_album_info": "{} 项",
@@ -185,6 +185,7 @@
"exif_bottom_sheet_details": "详情",
"exif_bottom_sheet_location": "位置",
"exif_bottom_sheet_location_add": "添加位置信息",
"exif_bottom_sheet_people": "PEOPLE",
"experimental_settings_new_asset_list_subtitle": "正在处理",
"experimental_settings_new_asset_list_title": "启用实验性照片网格",
"experimental_settings_subtitle": "使用风险自负!",
@@ -192,7 +193,7 @@
"favorites_page_no_favorites": "未找到收藏项目",
"favorites_page_title": "收藏",
"home_page_add_to_album_conflicts": "已向相册 {album} 中添加 {added} 项。\n其中 {failed} 项在相册中已存在。",
"home_page_add_to_album_err_local": "暂不能将本地项目添加到相册中,跳过",
"home_page_add_to_album_err_local": "暂不能将本地项目添加到相册中,跳过",
"home_page_add_to_album_success": "已向相册 {album} 中添加 {added} 项。",
"home_page_album_err_partner": "暂无法将同伴的项目添加到相册,跳过",
"home_page_archive_err_local": "暂无法归档本地项目,跳过",
@@ -207,7 +208,7 @@
"home_page_upload_err_limit": "一次最多只能上传 30 个项目,跳过",
"image_viewer_page_state_provider_download_error": "下载出现错误",
"image_viewer_page_state_provider_download_success": "下载成功",
"image_viewer_page_state_provider_share_error": "共享错",
"image_viewer_page_state_provider_share_error": "共享错",
"library_page_albums": "相册",
"library_page_archive": "归档",
"library_page_device_albums": "设备上的相册",
@@ -248,7 +249,7 @@
"login_form_next_button": "下一个",
"login_form_password_hint": "密码",
"login_form_save_login": "保持登录",
"login_form_server_empty": "输入服务器地址",
"login_form_server_empty": "输入服务器地址",
"login_form_server_error": "无法连接到服务器。",
"login_password_changed_error": "更新密码时出错\n",
"login_password_changed_success": "密码更新成功",
@@ -267,7 +268,7 @@
"map_settings_date_range_option_all": "所有",
"map_settings_date_range_option_day": "过去24小时",
"map_settings_date_range_option_days": "{}天前",
"map_settings_date_range_option_year": "去年",
"map_settings_date_range_option_year": "1年前",
"map_settings_date_range_option_years": "{}年前",
"map_settings_dialog_cancel": "取消",
"map_settings_dialog_save": "保存",
@@ -343,7 +344,7 @@
"search_page_your_activity": "您的活动",
"search_page_your_map": "足迹",
"search_result_page_new_search_hint": "搜索新的",
"search_suggestion_list_smart_search_hint_1": "默认情况下启用智能搜索要搜索元数据,请使用相关语法",
"search_suggestion_list_smart_search_hint_1": "默认情况下启用智能搜索要搜索元数据,请使用相关语法",
"search_suggestion_list_smart_search_hint_2": "m:您的搜索关键词",
"select_additional_user_for_sharing_page_suggestions": "建议",
"select_user_for_sharing_page_err_album": "创建相册失败",

View File

@@ -180,4 +180,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: 64c9b5291666c0ca3caabdfe9865c141ac40321d
COCOAPODS: 1.11.3
COCOAPODS: 1.12.1

View File

@@ -379,7 +379,7 @@
CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 141;
CURRENT_PROJECT_VERSION = 143;
DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
@@ -515,7 +515,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 141;
CURRENT_PROJECT_VERSION = 143;
DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
@@ -543,7 +543,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 141;
CURRENT_PROJECT_VERSION = 143;
DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;

View File

@@ -55,11 +55,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.97.0</string>
<string>1.98.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>141</string>
<string>143</string>
<key>FLTEnableImpeller</key>
<true />
<key>ITSAppUsesNonExemptEncryption</key>

View File

@@ -19,7 +19,7 @@ platform :ios do
desc "iOS Beta"
lane :beta do
increment_version_number(
version_number: "1.98.0"
version_number: "1.98.2"
)
increment_build_number(
build_number: latest_testflight_build_number + 1,

View File

@@ -5,32 +5,32 @@
<testcase classname="fastlane.lanes" name="0: default_platform" time="0.000304">
<testcase classname="fastlane.lanes" name="0: default_platform" time="0.000228">
</testcase>
<testcase classname="fastlane.lanes" name="1: increment_version_number" time="0.272646">
<testcase classname="fastlane.lanes" name="1: increment_version_number" time="0.19012">
</testcase>
<testcase classname="fastlane.lanes" name="2: latest_testflight_build_number" time="3.560896">
<testcase classname="fastlane.lanes" name="2: latest_testflight_build_number" time="4.018704">
</testcase>
<testcase classname="fastlane.lanes" name="3: increment_build_number" time="0.235745">
<testcase classname="fastlane.lanes" name="3: increment_build_number" time="0.163831">
</testcase>
<testcase classname="fastlane.lanes" name="4: build_app" time="114.820395">
<testcase classname="fastlane.lanes" name="4: build_app" time="126.642495">
</testcase>
<testcase classname="fastlane.lanes" name="5: upload_to_testflight" time="68.950812">
<testcase classname="fastlane.lanes" name="5: upload_to_testflight" time="97.082963">
</testcase>

View File

@@ -17,6 +17,6 @@ final archiveProvider = StreamProvider<RenderList>((ref) {
.filter()
.isArchivedEqualTo(true)
.isTrashedEqualTo(false)
.sortByFileCreatedAt();
.sortByFileCreatedAtDesc();
return renderListGenerator(query, ref);
});

View File

@@ -1,5 +1,6 @@
import 'package:flutter/painting.dart';
import 'package:immich_mobile/modules/asset_viewer/image_providers/immich_local_image_provider.dart';
import 'package:immich_mobile/modules/asset_viewer/image_providers/immich_remote_image_provider.dart';
/// [ImageCache] that uses two caches for small and large images
/// so that a single large image does not evict all small iamges
@@ -31,9 +32,18 @@ final class CustomImageCache implements ImageCache {
_large.clearLiveImages();
}
/// Gets the cache for the given key
ImageCache _cacheForKey(Object key) =>
(key is ImmichLocalImageProvider || key is ImmichRemoteImageProvider)
? _large
: _small;
@override
bool containsKey(Object key) =>
(key is ImmichLocalImageProvider ? _large : _small).containsKey(key);
bool containsKey(Object key) {
// [ImmichLocalImageProvider] and [ImmichRemoteImageProvider] are both
// large size images while the other thumbnail providers are small
return _cacheForKey(key).containsKey(key);
}
@override
int get currentSize => _small.currentSize + _large.currentSize;
@@ -43,8 +53,7 @@ final class CustomImageCache implements ImageCache {
@override
bool evict(Object key, {bool includeLive = true}) =>
(key is ImmichLocalImageProvider ? _large : _small)
.evict(key, includeLive: includeLive);
_cacheForKey(key).evict(key, includeLive: includeLive);
@override
int get liveImageCount => _small.liveImageCount + _large.liveImageCount;
@@ -59,10 +68,9 @@ final class CustomImageCache implements ImageCache {
ImageStreamCompleter Function() loader, {
ImageErrorListener? onError,
}) =>
(key is ImmichLocalImageProvider ? _large : _small)
.putIfAbsent(key, loader, onError: onError);
_cacheForKey(key).putIfAbsent(key, loader, onError: onError);
@override
ImageCacheStatus statusForKey(Object key) =>
(key is ImmichLocalImageProvider ? _large : _small).statusForKey(key);
_cacheForKey(key).statusForKey(key);
}

View File

@@ -58,6 +58,7 @@ doc/CreateTagDto.md
doc/CreateUserDto.md
doc/CuratedLocationsResponseDto.md
doc/CuratedObjectsResponseDto.md
doc/DeleteUserDto.md
doc/DownloadApi.md
doc/DownloadArchiveInfo.md
doc/DownloadInfoDto.md
@@ -104,6 +105,7 @@ doc/PeopleResponseDto.md
doc/PeopleUpdateDto.md
doc/PeopleUpdateItem.md
doc/PersonApi.md
doc/PersonCreateDto.md
doc/PersonResponseDto.md
doc/PersonStatisticsResponseDto.md
doc/PersonUpdateDto.md
@@ -183,6 +185,7 @@ doc/UserApi.md
doc/UserAvatarColor.md
doc/UserDto.md
doc/UserResponseDto.md
doc/UserStatus.md
doc/ValidateAccessTokenResponseDto.md
doc/ValidateLibraryDto.md
doc/ValidateLibraryImportPathResponseDto.md
@@ -267,6 +270,7 @@ lib/model/create_tag_dto.dart
lib/model/create_user_dto.dart
lib/model/curated_locations_response_dto.dart
lib/model/curated_objects_response_dto.dart
lib/model/delete_user_dto.dart
lib/model/download_archive_info.dart
lib/model/download_info_dto.dart
lib/model/download_response_dto.dart
@@ -306,6 +310,7 @@ lib/model/path_type.dart
lib/model/people_response_dto.dart
lib/model/people_update_dto.dart
lib/model/people_update_item.dart
lib/model/person_create_dto.dart
lib/model/person_response_dto.dart
lib/model/person_statistics_response_dto.dart
lib/model/person_update_dto.dart
@@ -378,6 +383,7 @@ lib/model/usage_by_user_dto.dart
lib/model/user_avatar_color.dart
lib/model/user_dto.dart
lib/model/user_response_dto.dart
lib/model/user_status.dart
lib/model/validate_access_token_response_dto.dart
lib/model/validate_library_dto.dart
lib/model/validate_library_import_path_response_dto.dart
@@ -439,6 +445,7 @@ test/create_tag_dto_test.dart
test/create_user_dto_test.dart
test/curated_locations_response_dto_test.dart
test/curated_objects_response_dto_test.dart
test/delete_user_dto_test.dart
test/download_api_test.dart
test/download_archive_info_test.dart
test/download_info_dto_test.dart
@@ -485,6 +492,7 @@ test/people_response_dto_test.dart
test/people_update_dto_test.dart
test/people_update_item_test.dart
test/person_api_test.dart
test/person_create_dto_test.dart
test/person_response_dto_test.dart
test/person_statistics_response_dto_test.dart
test/person_update_dto_test.dart
@@ -564,6 +572,7 @@ test/user_api_test.dart
test/user_avatar_color_test.dart
test/user_dto_test.dart
test/user_response_dto_test.dart
test/user_status_test.dart
test/validate_access_token_response_dto_test.dart
test/validate_library_dto_test.dart
test/validate_library_import_path_response_dto_test.dart

View File

@@ -3,7 +3,7 @@ Immich API
This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 1.98.0
- API version: 1.98.2
- Build package: org.openapitools.codegen.languages.DartClientCodegen
## Requirements
@@ -264,6 +264,7 @@ Class | Method | HTTP request | Description
- [CreateUserDto](doc//CreateUserDto.md)
- [CuratedLocationsResponseDto](doc//CuratedLocationsResponseDto.md)
- [CuratedObjectsResponseDto](doc//CuratedObjectsResponseDto.md)
- [DeleteUserDto](doc//DeleteUserDto.md)
- [DownloadArchiveInfo](doc//DownloadArchiveInfo.md)
- [DownloadInfoDto](doc//DownloadInfoDto.md)
- [DownloadResponseDto](doc//DownloadResponseDto.md)
@@ -303,6 +304,7 @@ Class | Method | HTTP request | Description
- [PeopleResponseDto](doc//PeopleResponseDto.md)
- [PeopleUpdateDto](doc//PeopleUpdateDto.md)
- [PeopleUpdateItem](doc//PeopleUpdateItem.md)
- [PersonCreateDto](doc//PersonCreateDto.md)
- [PersonResponseDto](doc//PersonResponseDto.md)
- [PersonStatisticsResponseDto](doc//PersonStatisticsResponseDto.md)
- [PersonUpdateDto](doc//PersonUpdateDto.md)
@@ -375,6 +377,7 @@ Class | Method | HTTP request | Description
- [UserAvatarColor](doc//UserAvatarColor.md)
- [UserDto](doc//UserDto.md)
- [UserResponseDto](doc//UserResponseDto.md)
- [UserStatus](doc//UserStatus.md)
- [ValidateAccessTokenResponseDto](doc//ValidateAccessTokenResponseDto.md)
- [ValidateLibraryDto](doc//ValidateLibraryDto.md)
- [ValidateLibraryImportPathResponseDto](doc//ValidateLibraryImportPathResponseDto.md)

15
mobile/openapi/doc/DeleteUserDto.md generated Normal file
View File

@@ -0,0 +1,15 @@
# openapi.model.DeleteUserDto
## Load the model package
```dart
import 'package:openapi/api.dart';
```
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**force** | **bool** | | [optional]
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -22,6 +22,7 @@ Name | Type | Description | Notes
**quotaSizeInBytes** | **int** | |
**quotaUsageInBytes** | **int** | |
**shouldChangePassword** | **bool** | |
**status** | [**UserStatus**](UserStatus.md) | |
**storageLabel** | **String** | |
**updatedAt** | [**DateTime**](DateTime.md) | |

View File

@@ -22,7 +22,7 @@ Method | HTTP request | Description
# **createPerson**
> PersonResponseDto createPerson()
> PersonResponseDto createPerson(personCreateDto)
@@ -45,9 +45,10 @@ import 'package:openapi/api.dart';
//defaultApiClient.getAuthentication<HttpBearerAuth>('bearer').setAccessToken(yourTokenGeneratorFunction);
final api_instance = PersonApi();
final personCreateDto = PersonCreateDto(); // PersonCreateDto |
try {
final result = api_instance.createPerson();
final result = api_instance.createPerson(personCreateDto);
print(result);
} catch (e) {
print('Exception when calling PersonApi->createPerson: $e\n');
@@ -55,7 +56,10 @@ try {
```
### Parameters
This endpoint does not need any parameter.
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**personCreateDto** | [**PersonCreateDto**](PersonCreateDto.md)| |
### Return type
@@ -67,7 +71,7 @@ This endpoint does not need any parameter.
### HTTP request headers
- **Content-Type**: Not defined
- **Content-Type**: application/json
- **Accept**: application/json
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
@@ -110,7 +114,7 @@ try {
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**withHidden** | **bool**| | [optional] [default to false]
**withHidden** | **bool**| | [optional]
### Return type

17
mobile/openapi/doc/PersonCreateDto.md generated Normal file
View File

@@ -0,0 +1,17 @@
# openapi.model.PersonCreateDto
## Load the model package
```dart
import 'package:openapi/api.dart';
```
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**birthDate** | [**DateTime**](DateTime.md) | Person date of birth. Note: the mobile app cannot currently set the birth date to null. | [optional]
**isHidden** | **bool** | Person visibility | [optional]
**name** | **String** | Person name. | [optional]
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -8,7 +8,7 @@ import 'package:openapi/api.dart';
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**refreshAllFiles** | **bool** | | [optional] [default to false]
**refreshAllFiles** | **bool** | | [optional]
**refreshModifiedFiles** | **bool** | | [optional]
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -10,7 +10,7 @@ Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**albumId** | **String** | | [optional]
**allowDownload** | **bool** | | [optional] [default to true]
**allowUpload** | **bool** | | [optional] [default to false]
**allowUpload** | **bool** | | [optional]
**assetIds** | **List<String>** | | [optional] [default to const []]
**description** | **String** | | [optional]
**expiresAt** | [**DateTime**](DateTime.md) | | [optional]

View File

@@ -182,7 +182,7 @@ void (empty response body)
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **deleteUser**
> UserResponseDto deleteUser(id)
> UserResponseDto deleteUser(id, deleteUserDto)
@@ -206,9 +206,10 @@ import 'package:openapi/api.dart';
final api_instance = UserApi();
final id = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String |
final deleteUserDto = DeleteUserDto(); // DeleteUserDto |
try {
final result = api_instance.deleteUser(id);
final result = api_instance.deleteUser(id, deleteUserDto);
print(result);
} catch (e) {
print('Exception when calling UserApi->deleteUser: $e\n');
@@ -220,6 +221,7 @@ try {
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**id** | **String**| |
**deleteUserDto** | [**DeleteUserDto**](DeleteUserDto.md)| |
### Return type
@@ -231,7 +233,7 @@ Name | Type | Description | Notes
### HTTP request headers
- **Content-Type**: Not defined
- **Content-Type**: application/json
- **Accept**: application/json
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)

View File

@@ -21,6 +21,7 @@ Name | Type | Description | Notes
**quotaSizeInBytes** | **int** | |
**quotaUsageInBytes** | **int** | |
**shouldChangePassword** | **bool** | |
**status** | [**UserStatus**](UserStatus.md) | |
**storageLabel** | **String** | |
**updatedAt** | [**DateTime**](DateTime.md) | |

14
mobile/openapi/doc/UserStatus.md generated Normal file
View File

@@ -0,0 +1,14 @@
# openapi.model.UserStatus
## Load the model package
```dart
import 'package:openapi/api.dart';
```
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@@ -99,6 +99,7 @@ part 'model/create_tag_dto.dart';
part 'model/create_user_dto.dart';
part 'model/curated_locations_response_dto.dart';
part 'model/curated_objects_response_dto.dart';
part 'model/delete_user_dto.dart';
part 'model/download_archive_info.dart';
part 'model/download_info_dto.dart';
part 'model/download_response_dto.dart';
@@ -138,6 +139,7 @@ part 'model/path_type.dart';
part 'model/people_response_dto.dart';
part 'model/people_update_dto.dart';
part 'model/people_update_item.dart';
part 'model/person_create_dto.dart';
part 'model/person_response_dto.dart';
part 'model/person_statistics_response_dto.dart';
part 'model/person_update_dto.dart';
@@ -210,6 +212,7 @@ part 'model/usage_by_user_dto.dart';
part 'model/user_avatar_color.dart';
part 'model/user_dto.dart';
part 'model/user_response_dto.dart';
part 'model/user_status.dart';
part 'model/validate_access_token_response_dto.dart';
part 'model/validate_library_dto.dart';
part 'model/validate_library_import_path_response_dto.dart';

View File

@@ -17,18 +17,21 @@ class PersonApi {
final ApiClient apiClient;
/// Performs an HTTP 'POST /person' operation and returns the [Response].
Future<Response> createPersonWithHttpInfo() async {
/// Parameters:
///
/// * [PersonCreateDto] personCreateDto (required):
Future<Response> createPersonWithHttpInfo(PersonCreateDto personCreateDto,) async {
// ignore: prefer_const_declarations
final path = r'/person';
// ignore: prefer_final_locals
Object? postBody;
Object? postBody = personCreateDto;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
const contentTypes = <String>['application/json'];
return apiClient.invokeAPI(
@@ -42,8 +45,11 @@ class PersonApi {
);
}
Future<PersonResponseDto?> createPerson() async {
final response = await createPersonWithHttpInfo();
/// Parameters:
///
/// * [PersonCreateDto] personCreateDto (required):
Future<PersonResponseDto?> createPerson(PersonCreateDto personCreateDto,) async {
final response = await createPersonWithHttpInfo(personCreateDto,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}

View File

@@ -157,19 +157,21 @@ class UserApi {
/// Parameters:
///
/// * [String] id (required):
Future<Response> deleteUserWithHttpInfo(String id,) async {
///
/// * [DeleteUserDto] deleteUserDto (required):
Future<Response> deleteUserWithHttpInfo(String id, DeleteUserDto deleteUserDto,) async {
// ignore: prefer_const_declarations
final path = r'/user/{id}'
.replaceAll('{id}', id);
// ignore: prefer_final_locals
Object? postBody;
Object? postBody = deleteUserDto;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
const contentTypes = <String>['application/json'];
return apiClient.invokeAPI(
@@ -186,8 +188,10 @@ class UserApi {
/// Parameters:
///
/// * [String] id (required):
Future<UserResponseDto?> deleteUser(String id,) async {
final response = await deleteUserWithHttpInfo(id,);
///
/// * [DeleteUserDto] deleteUserDto (required):
Future<UserResponseDto?> deleteUser(String id, DeleteUserDto deleteUserDto,) async {
final response = await deleteUserWithHttpInfo(id, deleteUserDto,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}

View File

@@ -280,6 +280,8 @@ class ApiClient {
return CuratedLocationsResponseDto.fromJson(value);
case 'CuratedObjectsResponseDto':
return CuratedObjectsResponseDto.fromJson(value);
case 'DeleteUserDto':
return DeleteUserDto.fromJson(value);
case 'DownloadArchiveInfo':
return DownloadArchiveInfo.fromJson(value);
case 'DownloadInfoDto':
@@ -358,6 +360,8 @@ class ApiClient {
return PeopleUpdateDto.fromJson(value);
case 'PeopleUpdateItem':
return PeopleUpdateItem.fromJson(value);
case 'PersonCreateDto':
return PersonCreateDto.fromJson(value);
case 'PersonResponseDto':
return PersonResponseDto.fromJson(value);
case 'PersonStatisticsResponseDto':
@@ -502,6 +506,8 @@ class ApiClient {
return UserDto.fromJson(value);
case 'UserResponseDto':
return UserResponseDto.fromJson(value);
case 'UserStatus':
return UserStatusTypeTransformer().decode(value);
case 'ValidateAccessTokenResponseDto':
return ValidateAccessTokenResponseDto.fromJson(value);
case 'ValidateLibraryDto':

View File

@@ -136,6 +136,9 @@ String parameterToString(dynamic value) {
if (value is UserAvatarColor) {
return UserAvatarColorTypeTransformer().encode(value).toString();
}
if (value is UserStatus) {
return UserStatusTypeTransformer().encode(value).toString();
}
if (value is VideoCodec) {
return VideoCodecTypeTransformer().encode(value).toString();
}

View File

@@ -0,0 +1,107 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.12
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class DeleteUserDto {
/// Returns a new [DeleteUserDto] instance.
DeleteUserDto({
this.force,
});
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
bool? force;
@override
bool operator ==(Object other) => identical(this, other) || other is DeleteUserDto &&
other.force == force;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(force == null ? 0 : force!.hashCode);
@override
String toString() => 'DeleteUserDto[force=$force]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
if (this.force != null) {
json[r'force'] = this.force;
} else {
// json[r'force'] = null;
}
return json;
}
/// Returns a new [DeleteUserDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static DeleteUserDto? fromJson(dynamic value) {
if (value is Map) {
final json = value.cast<String, dynamic>();
return DeleteUserDto(
force: mapValueOfType<bool>(json, r'force'),
);
}
return null;
}
static List<DeleteUserDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <DeleteUserDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = DeleteUserDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, DeleteUserDto> mapFromJson(dynamic json) {
final map = <String, DeleteUserDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = DeleteUserDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of DeleteUserDto-objects as value to a dart map
static Map<String, List<DeleteUserDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<DeleteUserDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = DeleteUserDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
};
}

View File

@@ -27,6 +27,7 @@ class PartnerResponseDto {
required this.quotaSizeInBytes,
required this.quotaUsageInBytes,
required this.shouldChangePassword,
required this.status,
required this.storageLabel,
required this.updatedAt,
});
@@ -71,6 +72,8 @@ class PartnerResponseDto {
bool shouldChangePassword;
UserStatus status;
String? storageLabel;
DateTime updatedAt;
@@ -91,6 +94,7 @@ class PartnerResponseDto {
other.quotaSizeInBytes == quotaSizeInBytes &&
other.quotaUsageInBytes == quotaUsageInBytes &&
other.shouldChangePassword == shouldChangePassword &&
other.status == status &&
other.storageLabel == storageLabel &&
other.updatedAt == updatedAt;
@@ -111,11 +115,12 @@ class PartnerResponseDto {
(quotaSizeInBytes == null ? 0 : quotaSizeInBytes!.hashCode) +
(quotaUsageInBytes == null ? 0 : quotaUsageInBytes!.hashCode) +
(shouldChangePassword.hashCode) +
(status.hashCode) +
(storageLabel == null ? 0 : storageLabel!.hashCode) +
(updatedAt.hashCode);
@override
String toString() => 'PartnerResponseDto[avatarColor=$avatarColor, createdAt=$createdAt, deletedAt=$deletedAt, email=$email, id=$id, inTimeline=$inTimeline, isAdmin=$isAdmin, memoriesEnabled=$memoriesEnabled, name=$name, oauthId=$oauthId, profileImagePath=$profileImagePath, quotaSizeInBytes=$quotaSizeInBytes, quotaUsageInBytes=$quotaUsageInBytes, shouldChangePassword=$shouldChangePassword, storageLabel=$storageLabel, updatedAt=$updatedAt]';
String toString() => 'PartnerResponseDto[avatarColor=$avatarColor, createdAt=$createdAt, deletedAt=$deletedAt, email=$email, id=$id, inTimeline=$inTimeline, isAdmin=$isAdmin, memoriesEnabled=$memoriesEnabled, name=$name, oauthId=$oauthId, profileImagePath=$profileImagePath, quotaSizeInBytes=$quotaSizeInBytes, quotaUsageInBytes=$quotaUsageInBytes, shouldChangePassword=$shouldChangePassword, status=$status, storageLabel=$storageLabel, updatedAt=$updatedAt]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
@@ -153,6 +158,7 @@ class PartnerResponseDto {
// json[r'quotaUsageInBytes'] = null;
}
json[r'shouldChangePassword'] = this.shouldChangePassword;
json[r'status'] = this.status;
if (this.storageLabel != null) {
json[r'storageLabel'] = this.storageLabel;
} else {
@@ -184,6 +190,7 @@ class PartnerResponseDto {
quotaSizeInBytes: mapValueOfType<int>(json, r'quotaSizeInBytes'),
quotaUsageInBytes: mapValueOfType<int>(json, r'quotaUsageInBytes'),
shouldChangePassword: mapValueOfType<bool>(json, r'shouldChangePassword')!,
status: UserStatus.fromJson(json[r'status'])!,
storageLabel: mapValueOfType<String>(json, r'storageLabel'),
updatedAt: mapDateTime(json, r'updatedAt', r'')!,
);
@@ -245,6 +252,7 @@ class PartnerResponseDto {
'quotaSizeInBytes',
'quotaUsageInBytes',
'shouldChangePassword',
'status',
'storageLabel',
'updatedAt',
};

View File

@@ -0,0 +1,138 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.12
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class PersonCreateDto {
/// Returns a new [PersonCreateDto] instance.
PersonCreateDto({
this.birthDate,
this.isHidden,
this.name,
});
/// Person date of birth. Note: the mobile app cannot currently set the birth date to null.
DateTime? birthDate;
/// Person visibility
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
bool? isHidden;
/// Person name.
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
String? name;
@override
bool operator ==(Object other) => identical(this, other) || other is PersonCreateDto &&
other.birthDate == birthDate &&
other.isHidden == isHidden &&
other.name == name;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(birthDate == null ? 0 : birthDate!.hashCode) +
(isHidden == null ? 0 : isHidden!.hashCode) +
(name == null ? 0 : name!.hashCode);
@override
String toString() => 'PersonCreateDto[birthDate=$birthDate, isHidden=$isHidden, name=$name]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
if (this.birthDate != null) {
json[r'birthDate'] = _dateFormatter.format(this.birthDate!.toUtc());
} else {
// json[r'birthDate'] = null;
}
if (this.isHidden != null) {
json[r'isHidden'] = this.isHidden;
} else {
// json[r'isHidden'] = null;
}
if (this.name != null) {
json[r'name'] = this.name;
} else {
// json[r'name'] = null;
}
return json;
}
/// Returns a new [PersonCreateDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static PersonCreateDto? fromJson(dynamic value) {
if (value is Map) {
final json = value.cast<String, dynamic>();
return PersonCreateDto(
birthDate: mapDateTime(json, r'birthDate', r''),
isHidden: mapValueOfType<bool>(json, r'isHidden'),
name: mapValueOfType<String>(json, r'name'),
);
}
return null;
}
static List<PersonCreateDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <PersonCreateDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = PersonCreateDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, PersonCreateDto> mapFromJson(dynamic json) {
final map = <String, PersonCreateDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = PersonCreateDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of PersonCreateDto-objects as value to a dart map
static Map<String, List<PersonCreateDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<PersonCreateDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = PersonCreateDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
};
}

View File

@@ -13,11 +13,17 @@ part of openapi.api;
class ScanLibraryDto {
/// Returns a new [ScanLibraryDto] instance.
ScanLibraryDto({
this.refreshAllFiles = false,
this.refreshAllFiles,
this.refreshModifiedFiles,
});
bool refreshAllFiles;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
bool? refreshAllFiles;
///
/// Please note: This property should have been non-nullable! Since the specification file
@@ -35,7 +41,7 @@ class ScanLibraryDto {
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(refreshAllFiles.hashCode) +
(refreshAllFiles == null ? 0 : refreshAllFiles!.hashCode) +
(refreshModifiedFiles == null ? 0 : refreshModifiedFiles!.hashCode);
@override
@@ -43,7 +49,11 @@ class ScanLibraryDto {
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
if (this.refreshAllFiles != null) {
json[r'refreshAllFiles'] = this.refreshAllFiles;
} else {
// json[r'refreshAllFiles'] = null;
}
if (this.refreshModifiedFiles != null) {
json[r'refreshModifiedFiles'] = this.refreshModifiedFiles;
} else {
@@ -60,7 +70,7 @@ class ScanLibraryDto {
final json = value.cast<String, dynamic>();
return ScanLibraryDto(
refreshAllFiles: mapValueOfType<bool>(json, r'refreshAllFiles') ?? false,
refreshAllFiles: mapValueOfType<bool>(json, r'refreshAllFiles'),
refreshModifiedFiles: mapValueOfType<bool>(json, r'refreshModifiedFiles'),
);
}

View File

@@ -15,7 +15,7 @@ class SharedLinkCreateDto {
SharedLinkCreateDto({
this.albumId,
this.allowDownload = true,
this.allowUpload = false,
this.allowUpload,
this.assetIds = const [],
this.description,
this.expiresAt,
@@ -34,7 +34,13 @@ class SharedLinkCreateDto {
bool allowDownload;
bool allowUpload;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
bool? allowUpload;
List<String> assetIds;
@@ -77,7 +83,7 @@ class SharedLinkCreateDto {
// ignore: unnecessary_parenthesis
(albumId == null ? 0 : albumId!.hashCode) +
(allowDownload.hashCode) +
(allowUpload.hashCode) +
(allowUpload == null ? 0 : allowUpload!.hashCode) +
(assetIds.hashCode) +
(description == null ? 0 : description!.hashCode) +
(expiresAt == null ? 0 : expiresAt!.hashCode) +
@@ -96,7 +102,11 @@ class SharedLinkCreateDto {
// json[r'albumId'] = null;
}
json[r'allowDownload'] = this.allowDownload;
if (this.allowUpload != null) {
json[r'allowUpload'] = this.allowUpload;
} else {
// json[r'allowUpload'] = null;
}
json[r'assetIds'] = this.assetIds;
if (this.description != null) {
json[r'description'] = this.description;
@@ -128,7 +138,7 @@ class SharedLinkCreateDto {
return SharedLinkCreateDto(
albumId: mapValueOfType<String>(json, r'albumId'),
allowDownload: mapValueOfType<bool>(json, r'allowDownload') ?? true,
allowUpload: mapValueOfType<bool>(json, r'allowUpload') ?? false,
allowUpload: mapValueOfType<bool>(json, r'allowUpload'),
assetIds: json[r'assetIds'] is Iterable
? (json[r'assetIds'] as Iterable).cast<String>().toList(growable: false)
: const [],

View File

@@ -26,6 +26,7 @@ class UserResponseDto {
required this.quotaSizeInBytes,
required this.quotaUsageInBytes,
required this.shouldChangePassword,
required this.status,
required this.storageLabel,
required this.updatedAt,
});
@@ -62,6 +63,8 @@ class UserResponseDto {
bool shouldChangePassword;
UserStatus status;
String? storageLabel;
DateTime updatedAt;
@@ -81,6 +84,7 @@ class UserResponseDto {
other.quotaSizeInBytes == quotaSizeInBytes &&
other.quotaUsageInBytes == quotaUsageInBytes &&
other.shouldChangePassword == shouldChangePassword &&
other.status == status &&
other.storageLabel == storageLabel &&
other.updatedAt == updatedAt;
@@ -100,11 +104,12 @@ class UserResponseDto {
(quotaSizeInBytes == null ? 0 : quotaSizeInBytes!.hashCode) +
(quotaUsageInBytes == null ? 0 : quotaUsageInBytes!.hashCode) +
(shouldChangePassword.hashCode) +
(status.hashCode) +
(storageLabel == null ? 0 : storageLabel!.hashCode) +
(updatedAt.hashCode);
@override
String toString() => 'UserResponseDto[avatarColor=$avatarColor, createdAt=$createdAt, deletedAt=$deletedAt, email=$email, id=$id, isAdmin=$isAdmin, memoriesEnabled=$memoriesEnabled, name=$name, oauthId=$oauthId, profileImagePath=$profileImagePath, quotaSizeInBytes=$quotaSizeInBytes, quotaUsageInBytes=$quotaUsageInBytes, shouldChangePassword=$shouldChangePassword, storageLabel=$storageLabel, updatedAt=$updatedAt]';
String toString() => 'UserResponseDto[avatarColor=$avatarColor, createdAt=$createdAt, deletedAt=$deletedAt, email=$email, id=$id, isAdmin=$isAdmin, memoriesEnabled=$memoriesEnabled, name=$name, oauthId=$oauthId, profileImagePath=$profileImagePath, quotaSizeInBytes=$quotaSizeInBytes, quotaUsageInBytes=$quotaUsageInBytes, shouldChangePassword=$shouldChangePassword, status=$status, storageLabel=$storageLabel, updatedAt=$updatedAt]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
@@ -137,6 +142,7 @@ class UserResponseDto {
// json[r'quotaUsageInBytes'] = null;
}
json[r'shouldChangePassword'] = this.shouldChangePassword;
json[r'status'] = this.status;
if (this.storageLabel != null) {
json[r'storageLabel'] = this.storageLabel;
} else {
@@ -167,6 +173,7 @@ class UserResponseDto {
quotaSizeInBytes: mapValueOfType<int>(json, r'quotaSizeInBytes'),
quotaUsageInBytes: mapValueOfType<int>(json, r'quotaUsageInBytes'),
shouldChangePassword: mapValueOfType<bool>(json, r'shouldChangePassword')!,
status: UserStatus.fromJson(json[r'status'])!,
storageLabel: mapValueOfType<String>(json, r'storageLabel'),
updatedAt: mapDateTime(json, r'updatedAt', r'')!,
);
@@ -228,6 +235,7 @@ class UserResponseDto {
'quotaSizeInBytes',
'quotaUsageInBytes',
'shouldChangePassword',
'status',
'storageLabel',
'updatedAt',
};

View File

@@ -0,0 +1,88 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.12
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class UserStatus {
/// Instantiate a new enum with the provided [value].
const UserStatus._(this.value);
/// The underlying value of this enum member.
final String value;
@override
String toString() => value;
String toJson() => value;
static const active = UserStatus._(r'active');
static const removing = UserStatus._(r'removing');
static const deleted = UserStatus._(r'deleted');
/// List of all possible values in this [enum][UserStatus].
static const values = <UserStatus>[
active,
removing,
deleted,
];
static UserStatus? fromJson(dynamic value) => UserStatusTypeTransformer().decode(value);
static List<UserStatus> listFromJson(dynamic json, {bool growable = false,}) {
final result = <UserStatus>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = UserStatus.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
}
/// Transformation class that can [encode] an instance of [UserStatus] to String,
/// and [decode] dynamic data back to [UserStatus].
class UserStatusTypeTransformer {
factory UserStatusTypeTransformer() => _instance ??= const UserStatusTypeTransformer._();
const UserStatusTypeTransformer._();
String encode(UserStatus data) => data.value;
/// Decodes a [dynamic value][data] to a UserStatus.
///
/// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully,
/// then null is returned. However, if [allowNull] is false and the [dynamic value][data]
/// cannot be decoded successfully, then an [UnimplementedError] is thrown.
///
/// The [allowNull] is very handy when an API changes and a new enum value is added or removed,
/// and users are still using an old app with the old code.
UserStatus? decode(dynamic data, {bool allowNull = true}) {
if (data != null) {
switch (data) {
case r'active': return UserStatus.active;
case r'removing': return UserStatus.removing;
case r'deleted': return UserStatus.deleted;
default:
if (!allowNull) {
throw ArgumentError('Unknown enum value to decode: $data');
}
}
}
return null;
}
/// Singleton [UserStatusTypeTransformer] instance.
static UserStatusTypeTransformer? _instance;
}

View File

@@ -0,0 +1,27 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.12
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
import 'package:openapi/api.dart';
import 'package:test/test.dart';
// tests for DeleteUserDto
void main() {
// final instance = DeleteUserDto();
group('test DeleteUserDto', () {
// bool force
test('to test the property `force`', () async {
// TODO
});
});
}

View File

@@ -86,6 +86,11 @@ void main() {
// TODO
});
// UserStatus status
test('to test the property `status`', () async {
// TODO
});
// String storageLabel
test('to test the property `storageLabel`', () async {
// TODO

Some files were not shown because too many files have changed in this diff Show More