Merge branch 'main' into ocr

# Conflicts:
#	mobile/openapi/README.md
This commit is contained in:
CoderKang 2025-09-13 20:24:28 +08:00
commit d61de59f15
138 changed files with 1698 additions and 903 deletions

View file

@ -26,7 +26,7 @@ services:
env_file: !reset [] env_file: !reset []
init: init:
env_file: !reset [] env_file: !reset []
command: sh -c 'find /data -maxdepth 1 ! -path "/data/postgres" -type d -exec chown ${UID:-1000}:${GID:-1000} {} + 2>/dev/null || true; for path in /usr/src/app/.pnpm-store /usr/src/app/server/node_modules /usr/src/app/server/dist /usr/src/app/.github/node_modules /usr/src/app/cli/node_modules /usr/src/app/docs/node_modules /usr/src/app/e2e/node_modules /usr/src/app/open-api/typescript-sdk/node_modules /usr/src/app/web/.svelte-kit /usr/src/app/web/coverage /usr/src/app/node_modules /usr/src/app/web/node_modules; do [ -e "$$path" ] && chown -R ${UID:-1000}:${GID:-1000} "$$path" || true; done' command: sh -c 'find /data -maxdepth 1 ! -path "/data/postgres" -type d -exec chown ${UID:-0}:${GID:-0} {} + 2>/dev/null || true; for path in /usr/src/app/.pnpm-store /usr/src/app/server/node_modules /usr/src/app/server/dist /usr/src/app/.github/node_modules /usr/src/app/cli/node_modules /usr/src/app/docs/node_modules /usr/src/app/e2e/node_modules /usr/src/app/open-api/typescript-sdk/node_modules /usr/src/app/web/.svelte-kit /usr/src/app/web/coverage /usr/src/app/node_modules /usr/src/app/web/node_modules; do [ -e "$$path" ] && chown -R ${UID:-0}:${GID:-0} "$$path" || true; done'
immich-machine-learning: immich-machine-learning:
env_file: !reset [] env_file: !reset []
database: database:

View file

@ -35,7 +35,7 @@ jobs:
needs: [get_body, should_run] needs: [get_body, should_run]
if: ${{ needs.should_run.outputs.should_run == 'true' }} if: ${{ needs.should_run.outputs.should_run == 'true' }}
container: container:
image: yshavit/mdq:0.9.0@sha256:4399483ca857fb1a7ed28a596f754c7373e358647de31ce14b79a27c91e1e35e image: ghcr.io/immich-app/mdq:main@sha256:1669c75a5542333ff6b03c13d5fd259ea8d798188b84d5d99093d62e4542eb05
outputs: outputs:
checked: ${{ steps.get_checkbox.outputs.checked }} checked: ${{ steps.get_checkbox.outputs.checked }}
steps: steps:

View file

@ -1,8 +1,15 @@
name: Merge translations name: Merge translations
on: on:
workflow_call:
workflow_dispatch: workflow_dispatch:
workflow_call:
secrets:
PUSH_O_MATIC_APP_ID:
required: true
PUSH_O_MATIC_APP_KEY:
required: true
WEBLATE_TOKEN:
required: true
permissions: {} permissions: {}
@ -84,7 +91,7 @@ jobs:
# So we clean up no matter what # So we clean up no matter what
set +e set +e
for i in {1..10}; do for i in {1..100}; do
if gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json state | jq -e '.state == "MERGED"'; then if gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json state | jq -e '.state == "MERGED"'; then
echo "PR merged" echo "PR merged"
exit 0 exit 0

View file

@ -1,12 +1,20 @@
name: Weblate checks name: Weblate checks
on: on:
pull_request_review:
pull_request: pull_request:
branches: [main] branches: [main]
types:
- opened
- synchronize
- ready_for_review
- auto_merge_enabled
- auto_merge_disabled
permissions: {} permissions: {}
env:
BOT_NAME: immich-push-o-matic
jobs: jobs:
pre-job: pre-job:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@ -39,7 +47,7 @@ jobs:
GH_TOKEN: ${{ github.token }} GH_TOKEN: ${{ github.token }}
run: | run: |
# Then check for APPROVED by the bot, if absent fail # Then check for APPROVED by the bot, if absent fail
gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json reviews | jq -e '.reviews | map(select(.author.login == "github-actions[bot]" and .state == "APPROVED")) | length > 0' \ gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json reviews | jq -e '.reviews | map(select(.author.login == env.BOT_NAME and .state == "APPROVED")) | length > 0' \
|| (echo "The push-o-matic bot has not approved this PR yet" && exit 1) || (echo "The push-o-matic bot has not approved this PR yet" && exit 1)
success-check-lock: success-check-lock:

View file

@ -1,5 +1,6 @@
/.github/ @bo0tzz /.github/ @bo0tzz
/docker/ @bo0tzz /docker/ @bo0tzz
/server/ @danieldietzler /server/ @danieldietzler
/web/ @danieldietzler
/machine-learning/ @mertalev /machine-learning/ @mertalev
/e2e/ @danieldietzler /e2e/ @danieldietzler

View file

@ -70,11 +70,9 @@ VOLUME_DIRS = \
# Helper function to chown, on error suggest remediation and exit # Helper function to chown, on error suggest remediation and exit
define safe_chown define safe_chown
if chown $(2) $(or $(UID),1000):$(or $(GID),1000) "$(1)" 2>/dev/null; then \ CURRENT_OWNER=$$(stat -c '%u:%g' "$(1)" 2>/dev/null || echo "none"); \
true; \ DESIRED_OWNER="$(or $(UID),0):$(or $(GID),0)"; \
else \ if [ "$$CURRENT_OWNER" != "$$DESIRED_OWNER" ] && ! chown -v $(2) $$DESIRED_OWNER "$(1)" 2>/dev/null; then \
STATUS=$$?; echo "Exit code: $$STATUS $(1)"; \
echo "$$STATUS $(1)"; \
echo "Permission denied when changing owner of volumes and upload location. Try running 'sudo make prepare-volumes' first."; \ echo "Permission denied when changing owner of volumes and upload location. Try running 'sudo make prepare-volumes' first."; \
exit 1; \ exit 1; \
fi; fi;

View file

@ -1,6 +1,6 @@
{ {
"name": "@immich/cli", "name": "@immich/cli",
"version": "2.2.88", "version": "2.2.89",
"description": "Command Line Interface (CLI) for Immich", "description": "Command Line Interface (CLI) for Immich",
"type": "module", "type": "module",
"exports": "./dist/index.js", "exports": "./dist/index.js",

View file

@ -21,7 +21,7 @@ services:
# extends: # extends:
# file: hwaccel.transcoding.yml # file: hwaccel.transcoding.yml
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding # service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
user: '${UID:-1000}:${GID:-1000}' user: '${UID:-0}:${GID:-0}'
build: build:
context: ../ context: ../
dockerfile: server/Dockerfile dockerfile: server/Dockerfile
@ -82,7 +82,7 @@ services:
image: immich-web-dev:latest image: immich-web-dev:latest
# Needed for rootless docker setup, see https://github.com/moby/moby/issues/45919 # Needed for rootless docker setup, see https://github.com/moby/moby/issues/45919
# user: 0:0 # user: 0:0
user: '${UID:-1000}:${GID:-1000}' user: '${UID:-0}:${GID:-0}'
build: build:
context: ../ context: ../
dockerfile: server/Dockerfile dockerfile: server/Dockerfile
@ -189,7 +189,7 @@ services:
env_file: env_file:
- .env - .env
user: 0:0 user: 0:0
command: sh -c 'find /data -maxdepth 1 -type d -exec chown ${UID:-1000}:${GID:-1000} {} + 2>/dev/null || true; for path in /usr/src/app/.pnpm-store /usr/src/app/server/node_modules /usr/src/app/server/dist /usr/src/app/.github/node_modules /usr/src/app/cli/node_modules /usr/src/app/docs/node_modules /usr/src/app/e2e/node_modules /usr/src/app/open-api/typescript-sdk/node_modules /usr/src/app/web/.svelte-kit /usr/src/app/web/coverage /usr/src/app/node_modules /usr/src/app/web/node_modules; do [ -e "$$path" ] && chown -R ${UID:-1000}:${GID:-1000} "$$path" || true; done' command: sh -c 'find /data -maxdepth 1 -type d -exec chown ${UID:-0}:${GID:-0} {} + 2>/dev/null || true; for path in /usr/src/app/.pnpm-store /usr/src/app/server/node_modules /usr/src/app/server/dist /usr/src/app/.github/node_modules /usr/src/app/cli/node_modules /usr/src/app/docs/node_modules /usr/src/app/e2e/node_modules /usr/src/app/open-api/typescript-sdk/node_modules /usr/src/app/web/.svelte-kit /usr/src/app/web/coverage /usr/src/app/node_modules /usr/src/app/web/node_modules; do [ -e "$$path" ] && chown -R ${UID:-0}:${GID:-0} "$$path" || true; done'
volumes: volumes:
- pnpm-store:/usr/src/app/.pnpm-store - pnpm-store:/usr/src/app/.pnpm-store
- server-node_modules:/usr/src/app/server/node_modules - server-node_modules:/usr/src/app/server/node_modules

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View file

@ -1,6 +1,6 @@
# Tags # Tags
Immich supports hierarchical tags, with the ability to read existing tags from the `TagList` and `Keywords` EXIF properties. Any changes to tags made through Immich are also written back to a [sidecar](/docs/features/xmp-sidecars) file. You can re-run the metadata extraction jobs for all assets to import your existing tags. Immich supports hierarchical tags, with the ability to read existing tags from the XMP `TagsList` field and IPTC `Keywords` field. Any changes to tags made through Immich are also written back to a [sidecar](/docs/features/xmp-sidecars) file. You can re-run the metadata extraction jobs for all assets to import your existing tags.
## Enable tags feature ## Enable tags feature

View file

@ -1,13 +1,68 @@
# XMP Sidecars # XMP Sidecars
Immich can ingest XMP sidecars on file upload (via the CLI) as well as detect new sidecars that are placed in the filesystem for existing images. Immich supports XMP sidecar files — external `.xmp` files that store metadata for an image or video in XML format. During the metadata extraction job Immich will read & import metadata from `.xmp` files, and during the Sidecar Write job it will _write_ metadata back to `.xmp`.
<img src={require('./img/xmp-sidecars.webp').default} title='XMP sidecars' /> :::tip
Tools like Lightroom, Darktable, digiKam and other applications can also be configured to write changes to `.xmp` files, in order to avoid modifying the original file.
:::
XMP sidecars are external XML files that contain metadata related to media files. Many applications read and write these files either exclusively or in addition to the metadata written to image files. They can be a powerful tool for editing and storing metadata of a media file without modifying the media file itself. When Immich receives or detects an XMP sidecar for a media file, it will attempt to extract the metadata from both the sidecar as well as the media file. It will prioritize the metadata for fields in the sidecar but will fall back and use the metadata in the media file if necessary. ## Metadata Fields
When importing files via the CLI bulk uploader or parsing photo metadata for external libraries, Immich will automatically detect XMP sidecar files as files that exist next to the original media file. Immich will look files that have the same name as the photo, but with the `.xmp` file extension. The same name can either include the photo's file extension or without the photo's file extension. For example, for a photo named `PXL_20230401_203352928.MP.jpg`, Immich will look for an XMP file named either `PXL_20230401_203352928.MP.jpg.xmp` or `PXL_20230401_203352928.MP.xmp`. If both `PXL_20230401_203352928.MP.jpg.xmp` and `PXL_20230401_203352928.MP.xmp` are present, Immich will prefer `PXL_20230401_203352928.MP.jpg.xmp`. Immich does not support _all_ metadata fields. Below is a table showing what fields Immich can _read_ and _write_. It's important to note that writes do not replace the entire file contents, but are merged together with any existing fields.
There are 2 administrator jobs associated with sidecar files: `SYNC` and `DISCOVER`. The sync job will re-scan all media with existing sidecar files and queue them for a metadata refresh. This is a great use case when third-party applications are used to modify the metadata of media. The discover job will attempt to scan the filesystem for new sidecar files for all media that does not currently have a sidecar file associated with it. :::info
Immich automatically queues a Sidecar Write job after editing the description, rating, or updating tags.
:::
<img src={require('./img/sidecar-jobs.webp').default} title='Sidecar Administrator Jobs' /> | Metadata | Immich writes to XMP | Immich reads from XMP |
| --------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Description** | `dc:description`, `tiff:ImageDescription` | `dc:description`, `tiff:ImageDescription` |
| **Rating** | `xmp:Rating` | `xmp:Rating` |
| **DateTime** | `exif:DateTimeOriginal`, `photoshop:DateCreated` | In prioritized order:<br/>`exif:SubSecDateTimeOriginal`<br/>`exif:DateTimeOriginal`<br/>`xmp:SubSecCreateDate`<br/>`xmp:CreateDate`<br/>`xmp:CreationDate`<br/>`xmp:MediaCreateDate`<br/>`xmp:SubSecMediaCreateDate`<br/>`xmp:DateTimeCreated` |
| **Location** | `exif:GPSLatitude`, `exif:GPSLongitude` | `exif:GPSLatitude`, `exif:GPSLongitude` |
| **Tags** | `digiKam:TagsList` | In prioritized order: <br/>`digiKam:TagsList`<br/>`lr:HierarchicalSubject`<br/>`IPTC:Keywords` |
:::note
All other fields (e.g. `Creator`, `Source`, IPTC, Lightroom edits) remain in the `.xmp` file and are **not searchable** in Immich.
:::
## File Naming Rules
A sidecar must share the base name of the media file:
- ✅ `IMG_0001.jpg.xmp` ← preferred
- ✅ `IMG_0001.xmp` ← fallback
- ❌ `myphoto_meta.xmp` ← not recognized
If both `.jpg.xmp` and `.xmp` are present, Immich uses the **`.jpg.xmp`** file.
## CLI Support
1. **Detect** Immich looks for a `.xmp` file placed next to each media file during upload.
2. **Copy** Both the media and the sidecar file are copied into Immichs internal library folder.
The sidecar is renamed to match the internal filename template, e.g.:
`upload/library/<user>/YYYY/YYYY-MM-DD/IMG_0001.jpg`
`upload/library/<user>/YYYY/YYYY-MM-DD/IMG_0001.jpg.xmp`
3. **Extract** Selected metadata (title, description, date, rating, tags) is parsed from the sidecar and saved to the database.
4. **Write-back** If you later update tags, rating, or description in the web UI, Immich will update **both** the database _and_ the copied `.xmp` file to stay in sync.
## External Library (Mounted Folder) Support
1. **Detect** The `DISCOVER` job automatically associates `.xmp` files that sit next to existing media files in your mounted folder. No files are moved or renamed.
2. **Extract** Immich reads and saves the same metadata fields from the sidecar to the database.
3. **Write-back** If Immich has **write access** to the mount, any future metadata edits (e.g., rating or tags) are also written back to the original `.xmp` file on disk.
:::danger
If the mount is **read-only**, Immich cannot update either the sidecar **or** the database — **metadata edits will silently fail** with no warning see issue [#10538](https://github.com/immich-app/immich/issues/10538) for more details.
:::
## Admin Jobs
Immich provides two admin jobs for managing sidecars:
| Job | What it does |
| ---------- | ------------------------------------------------------------------------------------------------- |
| `DISCOVER` | Finds new `.xmp` files next to media that dont already have one linked |
| `SYNC` | Re-reads existing `.xmp` files and refreshes metadata in the database (e.g. after external edits) |
![Sidecar Admin Jobs](./img/sidecar-jobs.webp)

View file

@ -1,4 +1,8 @@
[ [
{
"label": "v1.142.0",
"url": "https://v1.142.0.archive.immich.app"
},
{ {
"label": "v1.141.1", "label": "v1.141.1",
"url": "https://v1.141.1.archive.immich.app" "url": "https://v1.141.1.archive.immich.app"

View file

@ -1,6 +1,6 @@
{ {
"name": "immich-e2e", "name": "immich-e2e",
"version": "1.141.1", "version": "1.142.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"type": "module", "type": "module",

View file

@ -592,8 +592,6 @@
"backup_setting_subtitle": "ادارة اعدادات التحميل في الخلفية والمقدمة", "backup_setting_subtitle": "ادارة اعدادات التحميل في الخلفية والمقدمة",
"backup_settings_subtitle": "إدارة إعدادات التحميل", "backup_settings_subtitle": "إدارة إعدادات التحميل",
"backward": "الى الوراء", "backward": "الى الوراء",
"beta_sync": "حالة المزامنة التجريبية",
"beta_sync_subtitle": "ادارة نظام المزامنة الجديد",
"biometric_auth_enabled": "المصادقة البايومترية مفعله", "biometric_auth_enabled": "المصادقة البايومترية مفعله",
"biometric_locked_out": "لقد قفلت عنك المصادقة البيومترية", "biometric_locked_out": "لقد قفلت عنك المصادقة البيومترية",
"biometric_no_options": "لا توجد خيارات بايومترية متوفرة", "biometric_no_options": "لا توجد خيارات بايومترية متوفرة",

View file

@ -28,6 +28,8 @@
"add_to_album": "Дадаць у альбом", "add_to_album": "Дадаць у альбом",
"add_to_album_bottom_sheet_added": "Дададзена да {album}", "add_to_album_bottom_sheet_added": "Дададзена да {album}",
"add_to_album_bottom_sheet_already_exists": "Ужо знаходзіцца ў {album}", "add_to_album_bottom_sheet_already_exists": "Ужо знаходзіцца ў {album}",
"add_to_albums": "Дадаць у альбомы",
"add_to_albums_count": "Дадаць у альбомы ({count})",
"add_to_shared_album": "Дадаць у агульны альбом", "add_to_shared_album": "Дадаць у агульны альбом",
"add_url": "Дадаць URL", "add_url": "Дадаць URL",
"added_to_archive": "Дададзена ў архіў", "added_to_archive": "Дададзена ў архіў",
@ -399,8 +401,14 @@
"purchase_button_buy": "Купіць", "purchase_button_buy": "Купіць",
"purchase_button_buy_immich": "Купіць Immich", "purchase_button_buy_immich": "Купіць Immich",
"purchase_button_select": "Выбраць", "purchase_button_select": "Выбраць",
"readonly_mode_disabled": "Выключаны рэжым толькі для чытання",
"readonly_mode_enabled": "Уключаны рэжым толькі для чытання", "readonly_mode_enabled": "Уключаны рэжым толькі для чытання",
"reassign": "Перапрызначыць", "reassign": "Перапрызначыць",
"reassing_hint": "Прыпісаць выбраныя актывы існуючай асобе",
"recent": "Нядаўні",
"recent-albums": "Нядаўнія альбомы",
"recent_searches": "Нядаўнія пошукі",
"recently_added": "Нядаўна дададзена",
"remove": "Выдаліць", "remove": "Выдаліць",
"remove_from_album": "Выдаліць з альбома", "remove_from_album": "Выдаліць з альбома",
"remove_from_favorites": "Выдаліць з абраных", "remove_from_favorites": "Выдаліць з абраных",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Управлявай настройките за архивиране в активен и фонов режим", "backup_setting_subtitle": "Управлявай настройките за архивиране в активен и фонов режим",
"backup_settings_subtitle": "Управление на настройките за качване", "backup_settings_subtitle": "Управление на настройките за качване",
"backward": "Назад", "backward": "Назад",
"beta_sync": "Статус на бета синхронизацията",
"beta_sync_subtitle": "Управление на новата система за синхронизация",
"biometric_auth_enabled": "Включена биометрично удостоверяване", "biometric_auth_enabled": "Включена биометрично удостоверяване",
"biometric_locked_out": "Няма достъп до биометрично удостоверяване", "biometric_locked_out": "Няма достъп до биометрично удостоверяване",
"biometric_no_options": "Няма биометрична автентикация", "biometric_no_options": "Няма биометрична автентикация",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "За да работи тази функция зарежда външни ресурси от Google.", "gcast_enabled_description": "За да работи тази функция зарежда външни ресурси от Google.",
"general": "Общи", "general": "Общи",
"geolocation_instruction_all_have_location": "Всички обекти от тази дата вече имат данни за местоположение. Опитайте да включите показване на всички обекти или изберете друга дата",
"geolocation_instruction_location": "Изберете обект с GPS координати за да използвате тях или изберете място директно от картата", "geolocation_instruction_location": "Изберете обект с GPS координати за да използвате тях или изберете място директно от картата",
"geolocation_instruction_no_date": "Изберете дата за да управлявате данните за локация на снимките и видеата от тази дата",
"geolocation_instruction_no_photos": "Не са намерени снимки или видеа от тази дата. Изберете друга дата",
"get_help": "Помощ", "get_help": "Помощ",
"get_wifiname_error": "Неуспешно получаване името на Wi-Fi мрежата. Моля, убедете се, че са предоставени нужните разрешения на приложението и има връзка с Wi-Fi", "get_wifiname_error": "Неуспешно получаване името на Wi-Fi мрежата. Моля, убедете се, че са предоставени нужните разрешения на приложението и има връзка с Wi-Fi",
"getting_started": "Как да започнем", "getting_started": "Как да започнем",
@ -1417,6 +1412,8 @@
"open_the_search_filters": "Отвари филтрите за търсене", "open_the_search_filters": "Отвари филтрите за търсене",
"options": "Настройки", "options": "Настройки",
"or": "или", "or": "или",
"organize_into_albums": "Organitzar per àlbums",
"organize_into_albums_description": "Posar les fotos existents dins dels àlbums fent servir la configuració de sincronització",
"organize_your_library": "Организиране на вашата библиотека", "organize_your_library": "Организиране на вашата библиотека",
"original": "оригинал", "original": "оригинал",
"other": "Други", "other": "Други",
@ -1557,6 +1554,7 @@
"purchase_server_description_2": "Статус на поддръжник", "purchase_server_description_2": "Статус на поддръжник",
"purchase_server_title": "Сървър", "purchase_server_title": "Сървър",
"purchase_settings_server_activated": "Продуктовият ключ на сървъра се управлява от администратора", "purchase_settings_server_activated": "Продуктовият ключ на сървъра се управлява от администратора",
"query_asset_id": "Buscar item per ID",
"queue_status": "В опашка {count} от {total}", "queue_status": "В опашка {count} от {total}",
"rating": "Оценка със звезди", "rating": "Оценка със звезди",
"rating_clear": "Изчисти оценката", "rating_clear": "Изчисти оценката",
@ -1735,7 +1733,7 @@
"select_user_for_sharing_page_err_album": "Създаването на албум не бе успешно", "select_user_for_sharing_page_err_album": "Създаването на албум не бе успешно",
"selected": "Избрано", "selected": "Избрано",
"selected_count": "{count, plural, other {# избрани}}", "selected_count": "{count, plural, other {# избрани}}",
"selected_gps_coordinates": "избрани GPS координати", "selected_gps_coordinates": "Избрани GPS координати",
"send_message": "Изпратете съобщение", "send_message": "Изпратете съобщение",
"send_welcome_email": "Изпратете имейл за добре дошли", "send_welcome_email": "Изпратете имейл за добре дошли",
"server_endpoint": "Адрес на сървъра", "server_endpoint": "Адрес на сървъра",
@ -1846,10 +1844,8 @@
"shift_to_permanent_delete": "Натиснете ⇧, за да изтриете завинаги елемента", "shift_to_permanent_delete": "Натиснете ⇧, за да изтриете завинаги елемента",
"show_album_options": "Показване опции за албум", "show_album_options": "Показване опции за албум",
"show_albums": "Покажи албуми", "show_albums": "Покажи албуми",
"show_all_assets": "Покажи всичко",
"show_all_people": "Покажи всички хора", "show_all_people": "Покажи всички хора",
"show_and_hide_people": "Показване и скриване на хора", "show_and_hide_people": "Показване и скриване на хора",
"show_assets_without_location": "Покажи обекти без координати",
"show_file_location": "Покажи местоположението на файла", "show_file_location": "Покажи местоположението на файла",
"show_gallery": "Покажи галерия", "show_gallery": "Покажи галерия",
"show_hidden_people": "Показване на скритите хора", "show_hidden_people": "Показване на скритите хора",
@ -2034,7 +2030,6 @@
"use_biometric": "Използвай биометрия", "use_biometric": "Използвай биометрия",
"use_current_connection": "използвай текущата връзка", "use_current_connection": "използвай текущата връзка",
"use_custom_date_range": "Използвайте собствен диапазон от дати вместо това", "use_custom_date_range": "Използвайте собствен диапазон от дати вместо това",
"use_this_location": "Избери това място",
"user": "Потребител", "user": "Потребител",
"user_has_been_deleted": "Този потребител е премахнат.", "user_has_been_deleted": "Този потребител е премахнат.",
"user_id": "Потребител ИД", "user_id": "Потребител ИД",
@ -2077,6 +2072,7 @@
"view_next_asset": "Преглед на следващия файл", "view_next_asset": "Преглед на следващия файл",
"view_previous_asset": "Преглед на предишния файл", "view_previous_asset": "Преглед на предишния файл",
"view_qr_code": "Виж QR кода", "view_qr_code": "Виж QR кода",
"view_similar_photos": "Виж подобни снимки",
"view_stack": "Покажи в стек", "view_stack": "Покажи в стек",
"view_user": "Виж потребителя", "view_user": "Виж потребителя",
"viewer_remove_from_stack": "Премахване от опашката", "viewer_remove_from_stack": "Премахване от опашката",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Gestiona la configuració de càrrega en segon pla i en primer pla", "backup_setting_subtitle": "Gestiona la configuració de càrrega en segon pla i en primer pla",
"backup_settings_subtitle": "Administra la configuració de pujada", "backup_settings_subtitle": "Administra la configuració de pujada",
"backward": "Enrere", "backward": "Enrere",
"beta_sync": "Estat de la sincronització beta",
"beta_sync_subtitle": "Administra el nou sistema de sincronització",
"biometric_auth_enabled": "Autentificació biomètrica activada", "biometric_auth_enabled": "Autentificació biomètrica activada",
"biometric_locked_out": "Esteu bloquejats fora de l'autenticació biomètrica", "biometric_locked_out": "Esteu bloquejats fora de l'autenticació biomètrica",
"biometric_no_options": "No hi ha opcions biomètriques disponibles", "biometric_no_options": "No hi ha opcions biomètriques disponibles",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Aquesta funció carrega recursos externs de Google per funcionar.", "gcast_enabled_description": "Aquesta funció carrega recursos externs de Google per funcionar.",
"general": "General", "general": "General",
"geolocation_instruction_all_have_location": "Tots els actius d'aquesta data ja tenen dades d'ubicació. Prova de mostrar tots els actius o selecciona una data diferent",
"geolocation_instruction_location": "Fes click en un element amb coordinades GPS per utilitzar la seva ubicació o selecciona una ubicació des del mapa", "geolocation_instruction_location": "Fes click en un element amb coordinades GPS per utilitzar la seva ubicació o selecciona una ubicació des del mapa",
"geolocation_instruction_no_date": "Seleccioneu una data per gestionar dades d'ubicació per a fotos i vídeos d'aquest dia",
"geolocation_instruction_no_photos": "Cap foto o vídeo trobats per a aquesta data. Selecciona una data diferent",
"get_help": "Aconseguir ajuda", "get_help": "Aconseguir ajuda",
"get_wifiname_error": "No s'ha pogut obtenir el nom de la Wi-Fi. Assegureu-vos que heu concedit els permisos necessaris i que esteu connectat a una xarxa Wi-Fi", "get_wifiname_error": "No s'ha pogut obtenir el nom de la Wi-Fi. Assegureu-vos que heu concedit els permisos necessaris i que esteu connectat a una xarxa Wi-Fi",
"getting_started": "Començant", "getting_started": "Començant",
@ -1206,7 +1201,7 @@
"library_options": "Opcions de biblioteca", "library_options": "Opcions de biblioteca",
"library_page_device_albums": "Àlbums al Dispositiu", "library_page_device_albums": "Àlbums al Dispositiu",
"library_page_new_album": "Nou àlbum", "library_page_new_album": "Nou àlbum",
"library_page_sort_asset_count": "Nombre d'elements", "library_page_sort_asset_count": "Quantitat d'elements",
"library_page_sort_created": "Creat més recentment", "library_page_sort_created": "Creat més recentment",
"library_page_sort_last_modified": "Darrera modificació", "library_page_sort_last_modified": "Darrera modificació",
"library_page_sort_title": "Títol de l'àlbum", "library_page_sort_title": "Títol de l'àlbum",
@ -1417,6 +1412,8 @@
"open_the_search_filters": "Obriu els filtres de cerca", "open_the_search_filters": "Obriu els filtres de cerca",
"options": "Opcions", "options": "Opcions",
"or": "o", "or": "o",
"organize_into_albums": "Organitzar en àlbums",
"organize_into_albums_description": "Posar fotos existents en àlbums utilitzant la configuració de sincronització actual",
"organize_your_library": "Organitzeu la llibreria", "organize_your_library": "Organitzeu la llibreria",
"original": "original", "original": "original",
"other": "Altres", "other": "Altres",
@ -1557,6 +1554,7 @@
"purchase_server_description_2": "Estat del contribuent", "purchase_server_description_2": "Estat del contribuent",
"purchase_server_title": "Servidor", "purchase_server_title": "Servidor",
"purchase_settings_server_activated": "La clau de producte del servidor la gestiona l'administrador", "purchase_settings_server_activated": "La clau de producte del servidor la gestiona l'administrador",
"query_asset_id": "Consulta d'identificació d'actius",
"queue_status": "En cua {count}/{total}", "queue_status": "En cua {count}/{total}",
"rating": "Valoració", "rating": "Valoració",
"rating_clear": "Esborrar valoració", "rating_clear": "Esborrar valoració",
@ -1735,7 +1733,7 @@
"select_user_for_sharing_page_err_album": "Error al crear l'àlbum", "select_user_for_sharing_page_err_album": "Error al crear l'àlbum",
"selected": "Seleccionat", "selected": "Seleccionat",
"selected_count": "{count, plural, one {# seleccionat} other {# seleccionats}}", "selected_count": "{count, plural, one {# seleccionat} other {# seleccionats}}",
"selected_gps_coordinates": "seleccio de coordinades GPS", "selected_gps_coordinates": "Seleccio de coordinades GPS",
"send_message": "Envia missatge", "send_message": "Envia missatge",
"send_welcome_email": "Envia correu de benvinguda", "send_welcome_email": "Envia correu de benvinguda",
"server_endpoint": "Endpoint de Servidor", "server_endpoint": "Endpoint de Servidor",
@ -1846,10 +1844,8 @@
"shift_to_permanent_delete": "premeu ⇧ per suprimir el recurs permanentment", "shift_to_permanent_delete": "premeu ⇧ per suprimir el recurs permanentment",
"show_album_options": "Mostra les opcions d'àlbum", "show_album_options": "Mostra les opcions d'àlbum",
"show_albums": "Mostrar àlbums", "show_albums": "Mostrar àlbums",
"show_all_assets": "Mostrar tots els elements",
"show_all_people": "Veure totes les persones", "show_all_people": "Veure totes les persones",
"show_and_hide_people": "Mostra i amaga persones", "show_and_hide_people": "Mostra i amaga persones",
"show_assets_without_location": "Mostra els elements sense ubicació",
"show_file_location": "Mostra l'ubicació del fitxer", "show_file_location": "Mostra l'ubicació del fitxer",
"show_gallery": "Mostra la galeria", "show_gallery": "Mostra la galeria",
"show_hidden_people": "Mostra persones ocultes", "show_hidden_people": "Mostra persones ocultes",
@ -1879,7 +1875,7 @@
"slideshow_settings": "Configuració de diapositives", "slideshow_settings": "Configuració de diapositives",
"sort_albums_by": "Ordena àlbums per...", "sort_albums_by": "Ordena àlbums per...",
"sort_created": "Data de creació", "sort_created": "Data de creació",
"sort_items": "Nombre d'elements", "sort_items": "Quantitat d'elements",
"sort_modified": "Data de modificació", "sort_modified": "Data de modificació",
"sort_newest": "Foto més nova", "sort_newest": "Foto més nova",
"sort_oldest": "Foto més antiga", "sort_oldest": "Foto més antiga",
@ -2034,7 +2030,6 @@
"use_biometric": "Empra biometria", "use_biometric": "Empra biometria",
"use_current_connection": "utilitzar la connexió actual", "use_current_connection": "utilitzar la connexió actual",
"use_custom_date_range": "Fes servir un rang de dates personalitzat", "use_custom_date_range": "Fes servir un rang de dates personalitzat",
"use_this_location": "Fes clic per utilitzar la ubicació",
"user": "Usuari", "user": "Usuari",
"user_has_been_deleted": "Aquest usuari ha sigut eliminat.", "user_has_been_deleted": "Aquest usuari ha sigut eliminat.",
"user_id": "ID d'usuari", "user_id": "ID d'usuari",
@ -2077,6 +2072,7 @@
"view_next_asset": "Mostra el següent element", "view_next_asset": "Mostra el següent element",
"view_previous_asset": "Mostra l'element anterior", "view_previous_asset": "Mostra l'element anterior",
"view_qr_code": "Veure codi QR", "view_qr_code": "Veure codi QR",
"view_similar_photos": "Veure fotos similars",
"view_stack": "Veure la pila", "view_stack": "Veure la pila",
"view_user": "Veure Usuari", "view_user": "Veure Usuari",
"viewer_remove_from_stack": "Elimina de la pila", "viewer_remove_from_stack": "Elimina de la pila",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Správa nastavení zálohování na pozadí a na popředí", "backup_setting_subtitle": "Správa nastavení zálohování na pozadí a na popředí",
"backup_settings_subtitle": "Správa nastavení nahrávání", "backup_settings_subtitle": "Správa nastavení nahrávání",
"backward": "Pozpátku", "backward": "Pozpátku",
"beta_sync": "Stav synchronizace (beta)",
"beta_sync_subtitle": "Správa nového systému synchronizace",
"biometric_auth_enabled": "Biometrické ověřování je povoleno", "biometric_auth_enabled": "Biometrické ověřování je povoleno",
"biometric_locked_out": "Jste vyloučeni z biometrického ověřování", "biometric_locked_out": "Jste vyloučeni z biometrického ověřování",
"biometric_no_options": "Biometrické možnosti nejsou k dispozici", "biometric_no_options": "Biometrické možnosti nejsou k dispozici",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Tato funkce načítá externí zdroje z Googlu, aby mohla fungovat.", "gcast_enabled_description": "Tato funkce načítá externí zdroje z Googlu, aby mohla fungovat.",
"general": "Obecné", "general": "Obecné",
"geolocation_instruction_all_have_location": "Všechny položky k tomuto datu již mají údaje o poloze. Zkuste zobrazit všechny položky nebo vyberte jiné datum",
"geolocation_instruction_location": "Klikněte na položku s GPS souřadnicemi, abyste mohli použít její polohu, nebo vyberte polohu přímo z mapy", "geolocation_instruction_location": "Klikněte na položku s GPS souřadnicemi, abyste mohli použít její polohu, nebo vyberte polohu přímo z mapy",
"geolocation_instruction_no_date": "Vyberte datum, abyste mohli spravovat údaje o poloze pro fotografie a videa z daného dne",
"geolocation_instruction_no_photos": "Pro tento den nebyly nalezeny žádné fotografie ani videa. Vyberte jiné datum pro jejich zobrazení",
"get_help": "Získat pomoc", "get_help": "Získat pomoc",
"get_wifiname_error": "Nepodařilo se získat název Wi-Fi. Zkontrolujte, zda jste udělili potřebná oprávnění a zda jste připojeni k Wi-Fi síti", "get_wifiname_error": "Nepodařilo se získat název Wi-Fi. Zkontrolujte, zda jste udělili potřebná oprávnění a zda jste připojeni k Wi-Fi síti",
"getting_started": "Začínáme", "getting_started": "Začínáme",
@ -1520,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "Mobilní aplikace je zastaralá. Aktualizujte ji na nejnovější verzi.", "profile_drawer_client_out_of_date_minor": "Mobilní aplikace je zastaralá. Aktualizujte ji na nejnovější verzi.",
"profile_drawer_client_server_up_to_date": "Klient a server jsou aktuální", "profile_drawer_client_server_up_to_date": "Klient a server jsou aktuální",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Režim pouze pro čtení je aktivován. Dvojitým klepnutím na ikonu avatara uživatele režim ukončíte.", "profile_drawer_readonly_mode": "Režim jen pro čtení. Ukončíte ho dlouhým podržením ikony avataru.",
"profile_drawer_server_out_of_date_major": "Server je zastaralý. Aktualizujte na nejnovější hlavní verzi.", "profile_drawer_server_out_of_date_major": "Server je zastaralý. Aktualizujte na nejnovější hlavní verzi.",
"profile_drawer_server_out_of_date_minor": "Server je zastaralý. Aktualizujte je na nejnovější verzi.", "profile_drawer_server_out_of_date_minor": "Server je zastaralý. Aktualizujte je na nejnovější verzi.",
"profile_image_of_user": "Profilový obrázek uživatele {user}", "profile_image_of_user": "Profilový obrázek uživatele {user}",
@ -1645,6 +1640,7 @@
"restore_user": "Obnovit uživatele", "restore_user": "Obnovit uživatele",
"restored_asset": "Položka obnovena", "restored_asset": "Položka obnovena",
"resume": "Pokračovat", "resume": "Pokračovat",
"resume_paused_jobs": "Pokračovat {count, plural, one {v # pozastavené úloze} few {ve # pozastavených úlohách} other {v # pozastavených úlohách}}",
"retry_upload": "Opakování nahrávání", "retry_upload": "Opakování nahrávání",
"review_duplicates": "Kontrola duplicit", "review_duplicates": "Kontrola duplicit",
"review_large_files": "Kontrola velkých souborů", "review_large_files": "Kontrola velkých souborů",
@ -1849,10 +1845,8 @@
"shift_to_permanent_delete": "stiskněte ⇧ pro trvalé odstranění položky", "shift_to_permanent_delete": "stiskněte ⇧ pro trvalé odstranění položky",
"show_album_options": "Zobrazit možnosti alba", "show_album_options": "Zobrazit možnosti alba",
"show_albums": "Zobrazit alba", "show_albums": "Zobrazit alba",
"show_all_assets": "Zobrazit všechny položky",
"show_all_people": "Zobrazit všechny lidi", "show_all_people": "Zobrazit všechny lidi",
"show_and_hide_people": "Zobrazit a skrýt osoby", "show_and_hide_people": "Zobrazit a skrýt osoby",
"show_assets_without_location": "Zobrazit položky bez polohy",
"show_file_location": "Zobrazit umístění souboru", "show_file_location": "Zobrazit umístění souboru",
"show_gallery": "Zobrazit galerii", "show_gallery": "Zobrazit galerii",
"show_hidden_people": "Zobrazit skryté lidi", "show_hidden_people": "Zobrazit skryté lidi",
@ -1923,6 +1917,8 @@
"sync_albums_manual_subtitle": "Synchronizovat všechna nahraná videa a fotografie do vybraných záložních alb", "sync_albums_manual_subtitle": "Synchronizovat všechna nahraná videa a fotografie do vybraných záložních alb",
"sync_local": "Synchronizovat místní", "sync_local": "Synchronizovat místní",
"sync_remote": "Synchronizovat vzdálené", "sync_remote": "Synchronizovat vzdálené",
"sync_status": "Stav synchronizace",
"sync_status_subtitle": "Zobrazit a spravovat synchronizační systém",
"sync_upload_album_setting_subtitle": "Vytvořit a nahrát fotografie a videa do vybraných alb na Immich", "sync_upload_album_setting_subtitle": "Vytvořit a nahrát fotografie a videa do vybraných alb na Immich",
"tag": "Značka", "tag": "Značka",
"tag_assets": "Přiřadit značku", "tag_assets": "Přiřadit značku",
@ -1982,6 +1978,7 @@
"trash_page_select_assets_btn": "Vybrat položky", "trash_page_select_assets_btn": "Vybrat položky",
"trash_page_title": "Koš ({count})", "trash_page_title": "Koš ({count})",
"trashed_items_will_be_permanently_deleted_after": "Smazané položky budou trvale odstraněny po {days, plural, one {# dni} other {# dnech}}.", "trashed_items_will_be_permanently_deleted_after": "Smazané položky budou trvale odstraněny po {days, plural, one {# dni} other {# dnech}}.",
"troubleshoot": "Diagnostika",
"type": "Typ", "type": "Typ",
"unable_to_change_pin_code": "Nelze změnit PIN kód", "unable_to_change_pin_code": "Nelze změnit PIN kód",
"unable_to_setup_pin_code": "Nelze nastavit PIN kód", "unable_to_setup_pin_code": "Nelze nastavit PIN kód",
@ -2037,7 +2034,6 @@
"use_biometric": "Použít biometrické údaje", "use_biometric": "Použít biometrické údaje",
"use_current_connection": "použít aktuální připojení", "use_current_connection": "použít aktuální připojení",
"use_custom_date_range": "Použít vlastní rozsah dat", "use_custom_date_range": "Použít vlastní rozsah dat",
"use_this_location": "Klikněte pro použití polohy",
"user": "Uživatel", "user": "Uživatel",
"user_has_been_deleted": "Tento uživatel byl smazán.", "user_has_been_deleted": "Tento uživatel byl smazán.",
"user_id": "ID uživatele", "user_id": "ID uživatele",

View file

@ -1,8 +1,8 @@
{ {
"about": "Om", "about": "Om os",
"account": "Konto", "account": "Konto",
"account_settings": "Kontoindstillinger", "account_settings": "Kontoindstillinger",
"acknowledge": "Godkend", "acknowledge": "Anerkendelse",
"action": "Handling", "action": "Handling",
"action_common_update": "Opdater", "action_common_update": "Opdater",
"actions": "Handlinger", "actions": "Handlinger",
@ -597,8 +597,6 @@
"backup_setting_subtitle": "Administrer indstillnger for upload i forgrund og baggrund", "backup_setting_subtitle": "Administrer indstillnger for upload i forgrund og baggrund",
"backup_settings_subtitle": "Håndtere upload indstillinger", "backup_settings_subtitle": "Håndtere upload indstillinger",
"backward": "Baglæns", "backward": "Baglæns",
"beta_sync": "Beta synkroniseringsstatus",
"beta_sync_subtitle": "Håndter det nye synkroniseringssystem",
"biometric_auth_enabled": "Biometrisk adgangskontrol slået til", "biometric_auth_enabled": "Biometrisk adgangskontrol slået til",
"biometric_locked_out": "Du er låst ude af biometrisk adgangskontrol", "biometric_locked_out": "Du er låst ude af biometrisk adgangskontrol",
"biometric_no_options": "Ingen biometrisk adgangskontrol tilgængelig", "biometric_no_options": "Ingen biometrisk adgangskontrol tilgængelig",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Denne funktion indlæser eksterne ressourcer fra Google for at virke.", "gcast_enabled_description": "Denne funktion indlæser eksterne ressourcer fra Google for at virke.",
"general": "Generel", "general": "Generel",
"geolocation_instruction_all_have_location": "Alle objekter for denne dato har allerede lokations-data. Prøv at vise alle objekter eller vælg en anden dato",
"geolocation_instruction_location": "Klik på et objekt med GPS-koordinater for at bruge dettes position, eller vælg position direkte på kortet", "geolocation_instruction_location": "Klik på et objekt med GPS-koordinater for at bruge dettes position, eller vælg position direkte på kortet",
"geolocation_instruction_no_date": "Vælg en dato, for at administrere lokationsdata på billeder og videoer fra den dag",
"geolocation_instruction_no_photos": "Ingen fotos eller videoer fundet for den dato. Vælg en anden dato for at vise dem",
"get_help": "Få hjælp", "get_help": "Få hjælp",
"get_wifiname_error": "Kunne ikke hente Wi-Fi-navn. Sørg for, at du har givet de nødvendige tilladelser og er forbundet til et Wi-Fi-netværk", "get_wifiname_error": "Kunne ikke hente Wi-Fi-navn. Sørg for, at du har givet de nødvendige tilladelser og er forbundet til et Wi-Fi-netværk",
"getting_started": "Kom godt i gang", "getting_started": "Kom godt i gang",
@ -1417,6 +1412,8 @@
"open_the_search_filters": "Åbn søgefiltre", "open_the_search_filters": "Åbn søgefiltre",
"options": "Handlinger", "options": "Handlinger",
"or": "eller", "or": "eller",
"organize_into_albums": "Organiser i album",
"organize_into_albums_description": "Sæt eksisterende billeder i albummer ved hjælp af aktuelle synkroniseringsindstillinger",
"organize_your_library": "Organisér dit bibliotek", "organize_your_library": "Organisér dit bibliotek",
"original": "original", "original": "original",
"other": "Andet", "other": "Andet",
@ -1425,7 +1422,7 @@
"other_variables": "Andre variable", "other_variables": "Andre variable",
"owned": "Egne", "owned": "Egne",
"owner": "Ejer", "owner": "Ejer",
"partner": "Partner", "partner": "Partnerpartner",
"partner_can_access": "{partner} kan tilgå", "partner_can_access": "{partner} kan tilgå",
"partner_can_access_assets": "Alle dine billeder og videoer, bortset fra dem i Arkivet og Slettet", "partner_can_access_assets": "Alle dine billeder og videoer, bortset fra dem i Arkivet og Slettet",
"partner_can_access_location": "Stedet, hvor dine billeder blev taget", "partner_can_access_location": "Stedet, hvor dine billeder blev taget",
@ -1475,7 +1472,7 @@
"permission_onboarding_permission_granted": "Tilladelse givet! Du er nu klar.", "permission_onboarding_permission_granted": "Tilladelse givet! Du er nu klar.",
"permission_onboarding_permission_limited": "Tilladelse begrænset. For at lade Immich lave sikkerhedskopi og styre hele dit galleri, skal der gives tilladelse til billeder og videoer i indstillinger.", "permission_onboarding_permission_limited": "Tilladelse begrænset. For at lade Immich lave sikkerhedskopi og styre hele dit galleri, skal der gives tilladelse til billeder og videoer i indstillinger.",
"permission_onboarding_request": "Immich kræver tilliadelse til at se dine billeder og videoer.", "permission_onboarding_request": "Immich kræver tilliadelse til at se dine billeder og videoer.",
"person": "Person", "person": "Personperson",
"person_age_months": "{months, plural, one {# month} other {# months}} gammel", "person_age_months": "{months, plural, one {# month} other {# months}} gammel",
"person_age_year_months": "1 år, {months, plural, one {# month} other {# months}} gammel", "person_age_year_months": "1 år, {months, plural, one {# month} other {# months}} gammel",
"person_age_years": "{years, plural, other {# years}} gammel", "person_age_years": "{years, plural, other {# years}} gammel",
@ -1518,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "Mobilapp er forældet. Opdater venligst til den nyeste mindre version.", "profile_drawer_client_out_of_date_minor": "Mobilapp er forældet. Opdater venligst til den nyeste mindre version.",
"profile_drawer_client_server_up_to_date": "Klient og server er ajour", "profile_drawer_client_server_up_to_date": "Klient og server er ajour",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Skrivebeskyttet tilstand aktiveret. Dobbeltklik på bruger avatar ikonet for at afslutte.", "profile_drawer_readonly_mode": "Skrivebeskyttet tilstand aktiveret. Lang tryk på bruger avatar ikonet for at afslutte.",
"profile_drawer_server_out_of_date_major": "Server er forældet. Opdater venligst til den nyeste større version.", "profile_drawer_server_out_of_date_major": "Server er forældet. Opdater venligst til den nyeste større version.",
"profile_drawer_server_out_of_date_minor": "Server er forældet. Opdater venligst til den nyeste mindre version.", "profile_drawer_server_out_of_date_minor": "Server er forældet. Opdater venligst til den nyeste mindre version.",
"profile_image_of_user": "Profilbillede af {user}", "profile_image_of_user": "Profilbillede af {user}",
@ -1557,6 +1554,7 @@
"purchase_server_description_2": "Supporterstatus", "purchase_server_description_2": "Supporterstatus",
"purchase_server_title": "Server", "purchase_server_title": "Server",
"purchase_settings_server_activated": "Serverens produktnøgle administreres af administratoren", "purchase_settings_server_activated": "Serverens produktnøgle administreres af administratoren",
"query_asset_id": "Forespørgsels Asset ID",
"queue_status": "Kø {count}/{total}", "queue_status": "Kø {count}/{total}",
"rating": "Stjernebedømmelse", "rating": "Stjernebedømmelse",
"rating_clear": "Nulstil vurdering", "rating_clear": "Nulstil vurdering",
@ -1642,6 +1640,7 @@
"restore_user": "Gendan bruger", "restore_user": "Gendan bruger",
"restored_asset": "Gendannet mediefilen", "restored_asset": "Gendannet mediefilen",
"resume": "Genoptag", "resume": "Genoptag",
"resume_paused_jobs": "Fortsæt {count, plural, one {# paused job} other {# paused jobs}}",
"retry_upload": "Forsøg upload igen", "retry_upload": "Forsøg upload igen",
"review_duplicates": "Gennemgå dubletter", "review_duplicates": "Gennemgå dubletter",
"review_large_files": "Gennemgå store filer", "review_large_files": "Gennemgå store filer",
@ -1735,7 +1734,7 @@
"select_user_for_sharing_page_err_album": "Fejlede i at oprette et nyt album", "select_user_for_sharing_page_err_album": "Fejlede i at oprette et nyt album",
"selected": "Valgt", "selected": "Valgt",
"selected_count": "{count, plural, one {# valgt} other {# valgte}}", "selected_count": "{count, plural, one {# valgt} other {# valgte}}",
"selected_gps_coordinates": "Valgte GPS-koordinater", "selected_gps_coordinates": "Udvalgte GPS Koordinater",
"send_message": "Send besked", "send_message": "Send besked",
"send_welcome_email": "Send velkomstemail", "send_welcome_email": "Send velkomstemail",
"server_endpoint": "Server endepunkt", "server_endpoint": "Server endepunkt",
@ -1846,10 +1845,8 @@
"shift_to_permanent_delete": "tryk på ⇧ for at slette aktiv permanent", "shift_to_permanent_delete": "tryk på ⇧ for at slette aktiv permanent",
"show_album_options": "Vis albumindstillinger", "show_album_options": "Vis albumindstillinger",
"show_albums": "Vis albummer", "show_albums": "Vis albummer",
"show_all_assets": "Vis alle objekter",
"show_all_people": "Vis alle personer", "show_all_people": "Vis alle personer",
"show_and_hide_people": "Vis & skjul personer", "show_and_hide_people": "Vis & skjul personer",
"show_assets_without_location": "Vis objekter uden lokation",
"show_file_location": "Vis filplacering", "show_file_location": "Vis filplacering",
"show_gallery": "Vis galleri", "show_gallery": "Vis galleri",
"show_hidden_people": "Vis skjulte personer", "show_hidden_people": "Vis skjulte personer",
@ -1898,7 +1895,7 @@
"start_date": "Startdato", "start_date": "Startdato",
"state": "Stat", "state": "Stat",
"status": "Status", "status": "Status",
"stop_casting": "Stop casting", "stop_casting": "Stop støbning",
"stop_motion_photo": "Stopmotionbillede", "stop_motion_photo": "Stopmotionbillede",
"stop_photo_sharing": "Stop med at dele dine billeder?", "stop_photo_sharing": "Stop med at dele dine billeder?",
"stop_photo_sharing_description": "{partner} vil ikke længere kunne tilgå dine billeder.", "stop_photo_sharing_description": "{partner} vil ikke længere kunne tilgå dine billeder.",
@ -1920,6 +1917,8 @@
"sync_albums_manual_subtitle": "Synkroniser alle uploadet billeder og videoer til de valgte backupalbummer", "sync_albums_manual_subtitle": "Synkroniser alle uploadet billeder og videoer til de valgte backupalbummer",
"sync_local": "Synkroniser lokalt", "sync_local": "Synkroniser lokalt",
"sync_remote": "Synkroniser eksternt", "sync_remote": "Synkroniser eksternt",
"sync_status": "Synkroniserings Status",
"sync_status_subtitle": "Se og administrér synkroniseringssystemet",
"sync_upload_album_setting_subtitle": "Opret og upload dine billeder og videoer til de valgte albummer i Immich", "sync_upload_album_setting_subtitle": "Opret og upload dine billeder og videoer til de valgte albummer i Immich",
"tag": "Tag", "tag": "Tag",
"tag_assets": "Tag mediefiler", "tag_assets": "Tag mediefiler",
@ -1979,6 +1978,7 @@
"trash_page_select_assets_btn": "Vælg elementer", "trash_page_select_assets_btn": "Vælg elementer",
"trash_page_title": "Papirkurv ({count})", "trash_page_title": "Papirkurv ({count})",
"trashed_items_will_be_permanently_deleted_after": "Mediefiler i skraldespanden vil blive slettet permanent efter {days, plural, one {# dag} other {# dage}}.", "trashed_items_will_be_permanently_deleted_after": "Mediefiler i skraldespanden vil blive slettet permanent efter {days, plural, one {# dag} other {# dage}}.",
"troubleshoot": "Fejlfinding",
"type": "Type", "type": "Type",
"unable_to_change_pin_code": "Kunne ikke ændre PIN kode", "unable_to_change_pin_code": "Kunne ikke ændre PIN kode",
"unable_to_setup_pin_code": "Kunne ikke sætte PIN kode", "unable_to_setup_pin_code": "Kunne ikke sætte PIN kode",
@ -2034,7 +2034,6 @@
"use_biometric": "Brug biometrisk", "use_biometric": "Brug biometrisk",
"use_current_connection": "brug nuværende forbindelse", "use_current_connection": "brug nuværende forbindelse",
"use_custom_date_range": "Brug tilpasset datointerval i stedet", "use_custom_date_range": "Brug tilpasset datointerval i stedet",
"use_this_location": "Klik for at benytte lokationen",
"user": "Bruger", "user": "Bruger",
"user_has_been_deleted": "Denne bruger er slettet.", "user_has_been_deleted": "Denne bruger er slettet.",
"user_id": "Bruger-ID", "user_id": "Bruger-ID",
@ -2077,6 +2076,7 @@
"view_next_asset": "Se næste medie", "view_next_asset": "Se næste medie",
"view_previous_asset": "Se forrige medie", "view_previous_asset": "Se forrige medie",
"view_qr_code": "Vis QR kode", "view_qr_code": "Vis QR kode",
"view_similar_photos": "Se lignende billeder",
"view_stack": "Vis stak", "view_stack": "Vis stak",
"view_user": "Vis bruger", "view_user": "Vis bruger",
"viewer_remove_from_stack": "Fjern fra stak", "viewer_remove_from_stack": "Fjern fra stak",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Verwaltung der Upload-Einstellungen im Hintergrund und im Vordergrund", "backup_setting_subtitle": "Verwaltung der Upload-Einstellungen im Hintergrund und im Vordergrund",
"backup_settings_subtitle": "Upload-Einstellungen verwalten", "backup_settings_subtitle": "Upload-Einstellungen verwalten",
"backward": "Rückwärts", "backward": "Rückwärts",
"beta_sync": "Status der Beta-Synchronisierung",
"beta_sync_subtitle": "Verwalte das neue Synchronisierungssystem",
"biometric_auth_enabled": "Biometrische Authentifizierung aktiviert", "biometric_auth_enabled": "Biometrische Authentifizierung aktiviert",
"biometric_locked_out": "Du bist von der biometrischen Authentifizierung ausgeschlossen", "biometric_locked_out": "Du bist von der biometrischen Authentifizierung ausgeschlossen",
"biometric_no_options": "Keine biometrischen Optionen verfügbar", "biometric_no_options": "Keine biometrischen Optionen verfügbar",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Diese Funktion lädt externe Quellen von Google, um zu funktionieren.", "gcast_enabled_description": "Diese Funktion lädt externe Quellen von Google, um zu funktionieren.",
"general": "Allgemein", "general": "Allgemein",
"geolocation_instruction_all_have_location": "Alle Dateien für dieses Daten enthalten bereits Standortangaben. Versuche alle Dateien anzuzeigen oder wähle ein anderes Datum",
"geolocation_instruction_location": "Klicke auf eine Datei mit GPS Koordinaten um diesen Standort zu verwenden oder wähle einen Standort direkt auf der Karte", "geolocation_instruction_location": "Klicke auf eine Datei mit GPS Koordinaten um diesen Standort zu verwenden oder wähle einen Standort direkt auf der Karte",
"geolocation_instruction_no_date": "Wähle ein Datum um die Standortangaben der Fotos und Videos dieses Datums zu verwalten",
"geolocation_instruction_no_photos": "Keine Fotos oder Videos an diesem Datum gefunden. Wähle ein anderes Datum",
"get_help": "Hilfe erhalten", "get_help": "Hilfe erhalten",
"get_wifiname_error": "WLAN-Name konnte nicht ermittelt werden. Vergewissere dich, dass die erforderlichen Berechtigungen erteilt wurden und du mit einem WLAN-Netzwerk verbunden bist", "get_wifiname_error": "WLAN-Name konnte nicht ermittelt werden. Vergewissere dich, dass die erforderlichen Berechtigungen erteilt wurden und du mit einem WLAN-Netzwerk verbunden bist",
"getting_started": "Erste Schritte", "getting_started": "Erste Schritte",
@ -1645,6 +1640,7 @@
"restore_user": "Nutzer wiederherstellen", "restore_user": "Nutzer wiederherstellen",
"restored_asset": "Datei wiederhergestellt", "restored_asset": "Datei wiederhergestellt",
"resume": "Fortsetzen", "resume": "Fortsetzen",
"resume_paused_jobs": "{count, plural, one {# Aufgabe fortsetzen } other {# Aufgaben fortsetzen}}",
"retry_upload": "Upload wiederholen", "retry_upload": "Upload wiederholen",
"review_duplicates": "Duplikate überprüfen", "review_duplicates": "Duplikate überprüfen",
"review_large_files": "Große Dateien überprüfen", "review_large_files": "Große Dateien überprüfen",
@ -1849,10 +1845,8 @@
"shift_to_permanent_delete": "Drücke ⇧, um die Datei endgültig zu löschen", "shift_to_permanent_delete": "Drücke ⇧, um die Datei endgültig zu löschen",
"show_album_options": "Album-Optionen anzeigen", "show_album_options": "Album-Optionen anzeigen",
"show_albums": "Alben anzeigen", "show_albums": "Alben anzeigen",
"show_all_assets": "Alle Dateien anzeigen",
"show_all_people": "Alle Personen anzeigen", "show_all_people": "Alle Personen anzeigen",
"show_and_hide_people": "Personen ein- & ausblenden", "show_and_hide_people": "Personen ein- & ausblenden",
"show_assets_without_location": "Zeige Dateien ohne Ortsangabe",
"show_file_location": "Dateispeicherort anzeigen", "show_file_location": "Dateispeicherort anzeigen",
"show_gallery": "Galerie anzeigen", "show_gallery": "Galerie anzeigen",
"show_hidden_people": "Ausgeblendete Personen anzeigen", "show_hidden_people": "Ausgeblendete Personen anzeigen",
@ -2037,7 +2031,6 @@
"use_biometric": "Biometrie verwenden", "use_biometric": "Biometrie verwenden",
"use_current_connection": "aktuelle Verbindung verwenden", "use_current_connection": "aktuelle Verbindung verwenden",
"use_custom_date_range": "Stattdessen einen benutzerdefinierten Datumsbereich verwenden", "use_custom_date_range": "Stattdessen einen benutzerdefinierten Datumsbereich verwenden",
"use_this_location": "Klicken um Ort zu verwenden",
"user": "Nutzer", "user": "Nutzer",
"user_has_been_deleted": "Dieser Benutzer wurde gelöscht.", "user_has_been_deleted": "Dieser Benutzer wurde gelöscht.",
"user_id": "Nutzer-ID", "user_id": "Nutzer-ID",

View file

@ -594,8 +594,6 @@
"backup_setting_subtitle": "Διαχείριση ρυθμίσεων μεταφόρτωσης στο παρασκήνιο και στο προσκήνιο", "backup_setting_subtitle": "Διαχείριση ρυθμίσεων μεταφόρτωσης στο παρασκήνιο και στο προσκήνιο",
"backup_settings_subtitle": "Διαχείριση των ρυθμίσεων μεταφόρτωσης", "backup_settings_subtitle": "Διαχείριση των ρυθμίσεων μεταφόρτωσης",
"backward": "Προς τα πίσω", "backward": "Προς τα πίσω",
"beta_sync": "Κατάσταση Συγχρονισμού Beta (δοκιμαστική)",
"beta_sync_subtitle": "Διαχείριση του νέου συστήματος συγχρονισμού",
"biometric_auth_enabled": "Βιομετρική ταυτοποίηση ενεργοποιήθηκε", "biometric_auth_enabled": "Βιομετρική ταυτοποίηση ενεργοποιήθηκε",
"biometric_locked_out": "Είστε κλειδωμένοι εκτός της βιομετρικής ταυτοποίησης", "biometric_locked_out": "Είστε κλειδωμένοι εκτός της βιομετρικής ταυτοποίησης",
"biometric_no_options": "Δεν υπάρχουν διαθέσιμοι τρόποι βιομετρικής ταυτοποίησης", "biometric_no_options": "Δεν υπάρχουν διαθέσιμοι τρόποι βιομετρικής ταυτοποίησης",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Administra las configuraciones de respaldo en segundo y primer plano", "backup_setting_subtitle": "Administra las configuraciones de respaldo en segundo y primer plano",
"backup_settings_subtitle": "Configura las opciones de subida", "backup_settings_subtitle": "Configura las opciones de subida",
"backward": "Retroceder", "backward": "Retroceder",
"beta_sync": "Estado de Sincronización Beta",
"beta_sync_subtitle": "Administrar el nuevo sistema de sincronización",
"biometric_auth_enabled": "Autentificación biométrica habilitada", "biometric_auth_enabled": "Autentificación biométrica habilitada",
"biometric_locked_out": "Estás bloqueado de la autentificación biométrica", "biometric_locked_out": "Estás bloqueado de la autentificación biométrica",
"biometric_no_options": "Sin opciones biométricas disponibles", "biometric_no_options": "Sin opciones biométricas disponibles",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Esta funcionalidad carga recursos externos desde Google para poder funcionar.", "gcast_enabled_description": "Esta funcionalidad carga recursos externos desde Google para poder funcionar.",
"general": "General", "general": "General",
"geolocation_instruction_all_have_location": "Todos los assets de esta fecha ya tienen datos de ubicación. Prueba mostrando todos los assets o selecciona otra fecha",
"geolocation_instruction_location": "Da click en un asset con coordenadas GPS para usar su ubicacion, o selecciona una ubicacion directamente en el mapa", "geolocation_instruction_location": "Da click en un asset con coordenadas GPS para usar su ubicacion, o selecciona una ubicacion directamente en el mapa",
"geolocation_instruction_no_date": "Seleccione una fecha para administrar los datos de ubicación de las fotos y los videos de ese día",
"geolocation_instruction_no_photos": "No se encontraron fotos ni vídeos para esta fecha. Seleccione otra fecha para mostrarlos",
"get_help": "Solicitar ayuda", "get_help": "Solicitar ayuda",
"get_wifiname_error": "No se pudo obtener el nombre de la red Wi-Fi. Asegúrate de haber concedido los permisos necesarios y de estar conectado a una red Wi-Fi", "get_wifiname_error": "No se pudo obtener el nombre de la red Wi-Fi. Asegúrate de haber concedido los permisos necesarios y de estar conectado a una red Wi-Fi",
"getting_started": "Comenzamos", "getting_started": "Comenzamos",
@ -1417,10 +1412,12 @@
"open_the_search_filters": "Abre los filtros de búsqueda", "open_the_search_filters": "Abre los filtros de búsqueda",
"options": "Opciones", "options": "Opciones",
"or": "o", "or": "o",
"organize_into_albums": "Organizar en álbumes",
"organize_into_albums_description": "Añade fotos existentes en álbumes usando la configuración actual de sincronización",
"organize_your_library": "Organiza tu biblioteca", "organize_your_library": "Organiza tu biblioteca",
"original": "original", "original": "original",
"other": "Otro", "other": "Otro",
"other_devices": "Otro dispositivo", "other_devices": "Otros dispositivos",
"other_entities": "Otras entidades", "other_entities": "Otras entidades",
"other_variables": "Otras variables", "other_variables": "Otras variables",
"owned": "Propios", "owned": "Propios",
@ -1557,6 +1554,7 @@
"purchase_server_description_2": "Estado del soporte", "purchase_server_description_2": "Estado del soporte",
"purchase_server_title": "Servidor", "purchase_server_title": "Servidor",
"purchase_settings_server_activated": "La clave del producto del servidor la administra el administrador", "purchase_settings_server_activated": "La clave del producto del servidor la administra el administrador",
"query_asset_id": "Consultar ID de elemento",
"queue_status": "Poniendo en cola {count}/{total}", "queue_status": "Poniendo en cola {count}/{total}",
"rating": "Valoración", "rating": "Valoración",
"rating_clear": "Borrar calificación", "rating_clear": "Borrar calificación",
@ -1623,7 +1621,7 @@
"require_password": "Contraseña requerida", "require_password": "Contraseña requerida",
"require_user_to_change_password_on_first_login": "Requerir que el usuario cambie la contraseña en el primer inicio de sesión", "require_user_to_change_password_on_first_login": "Requerir que el usuario cambie la contraseña en el primer inicio de sesión",
"rescan": "Volver a escanear", "rescan": "Volver a escanear",
"reset": "Reiniciar", "reset": "Restablecer",
"reset_password": "Restablecer la contraseña", "reset_password": "Restablecer la contraseña",
"reset_people_visibility": "Restablecer la visibilidad de las personas", "reset_people_visibility": "Restablecer la visibilidad de las personas",
"reset_pin_code": "Restablecer PIN", "reset_pin_code": "Restablecer PIN",
@ -1642,6 +1640,7 @@
"restore_user": "Restaurar usuario", "restore_user": "Restaurar usuario",
"restored_asset": "Archivo restaurado", "restored_asset": "Archivo restaurado",
"resume": "Continuar", "resume": "Continuar",
"resume_paused_jobs": "Reanudar {count, plural, one {# tarea en pausa} other {# tareas en pausa}}",
"retry_upload": "Reintentar subida", "retry_upload": "Reintentar subida",
"review_duplicates": "Revisar duplicados", "review_duplicates": "Revisar duplicados",
"review_large_files": "Revisar archivos grandes", "review_large_files": "Revisar archivos grandes",
@ -1735,7 +1734,7 @@
"select_user_for_sharing_page_err_album": "Fallo al crear el álbum", "select_user_for_sharing_page_err_album": "Fallo al crear el álbum",
"selected": "Seleccionado", "selected": "Seleccionado",
"selected_count": "{count, plural, one {# seleccionado} other {# seleccionados}}", "selected_count": "{count, plural, one {# seleccionado} other {# seleccionados}}",
"selected_gps_coordinates": "coordenadas gps seleccionadas", "selected_gps_coordinates": "Coordenadas GPS seleccionadas",
"send_message": "Enviar mensaje", "send_message": "Enviar mensaje",
"send_welcome_email": "Enviar correo de bienvenida", "send_welcome_email": "Enviar correo de bienvenida",
"server_endpoint": "Punto final del servidor", "server_endpoint": "Punto final del servidor",
@ -1846,10 +1845,8 @@
"shift_to_permanent_delete": "presiona ⇧ para eliminar permanentemente el archivo", "shift_to_permanent_delete": "presiona ⇧ para eliminar permanentemente el archivo",
"show_album_options": "Mostrar opciones del álbum", "show_album_options": "Mostrar opciones del álbum",
"show_albums": "Mostrar álbumes", "show_albums": "Mostrar álbumes",
"show_all_assets": "Mostrar todos los assets",
"show_all_people": "Mostrar todas las personas", "show_all_people": "Mostrar todas las personas",
"show_and_hide_people": "Mostrar y ocultar personas", "show_and_hide_people": "Mostrar y ocultar personas",
"show_assets_without_location": "Mostrar assets sin ubicación",
"show_file_location": "Mostrar carpeta del archivo", "show_file_location": "Mostrar carpeta del archivo",
"show_gallery": "Ver galería", "show_gallery": "Ver galería",
"show_hidden_people": "Mostrar personas ocultas", "show_hidden_people": "Mostrar personas ocultas",
@ -2034,7 +2031,6 @@
"use_biometric": "Uso biométrico", "use_biometric": "Uso biométrico",
"use_current_connection": "Usar conexión actual", "use_current_connection": "Usar conexión actual",
"use_custom_date_range": "Usa un intervalo de fechas personalizado", "use_custom_date_range": "Usa un intervalo de fechas personalizado",
"use_this_location": "Click para usar ubicación",
"user": "Usuario", "user": "Usuario",
"user_has_been_deleted": "Este usuario ha sido eliminado.", "user_has_been_deleted": "Este usuario ha sido eliminado.",
"user_id": "Id. de usuario", "user_id": "Id. de usuario",
@ -2077,6 +2073,7 @@
"view_next_asset": "Mostrar siguiente elemento", "view_next_asset": "Mostrar siguiente elemento",
"view_previous_asset": "Mostrar elemento anterior", "view_previous_asset": "Mostrar elemento anterior",
"view_qr_code": "Ver código QR", "view_qr_code": "Ver código QR",
"view_similar_photos": "Ver fotografías similares",
"view_stack": "Ver Pila", "view_stack": "Ver Pila",
"view_user": "Ver Usuario", "view_user": "Ver Usuario",
"viewer_remove_from_stack": "Quitar de la pila", "viewer_remove_from_stack": "Quitar de la pila",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Halda taustal ja esiplaanil üleslaadimise seadeid", "backup_setting_subtitle": "Halda taustal ja esiplaanil üleslaadimise seadeid",
"backup_settings_subtitle": "Halda üleslaadimise seadeid", "backup_settings_subtitle": "Halda üleslaadimise seadeid",
"backward": "Tagasi", "backward": "Tagasi",
"beta_sync": "Beeta sünkroonimise staatus",
"beta_sync_subtitle": "Halda uut sünkroonimissüsteemi",
"biometric_auth_enabled": "Biomeetriline autentimine lubatud", "biometric_auth_enabled": "Biomeetriline autentimine lubatud",
"biometric_locked_out": "Biomeetriline autentimine on blokeeritud", "biometric_locked_out": "Biomeetriline autentimine on blokeeritud",
"biometric_no_options": "Biomeetrilisi valikuid ei ole", "biometric_no_options": "Biomeetrilisi valikuid ei ole",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "See funktsionaalsus laadib töötamiseks Google'st väliseid ressursse.", "gcast_enabled_description": "See funktsionaalsus laadib töötamiseks Google'st väliseid ressursse.",
"general": "Üldine", "general": "Üldine",
"geolocation_instruction_all_have_location": "Kõigil selle kuupäevaga üksustel on juba asukoht. Proovi kuvada kõiki üksuseid või vali teine kuupäev",
"geolocation_instruction_location": "Klõpsa GPS-koordinaatidega üksusel, et kasutada selle asukohta, või vali asukoht otse kaardilt", "geolocation_instruction_location": "Klõpsa GPS-koordinaatidega üksusel, et kasutada selle asukohta, või vali asukoht otse kaardilt",
"geolocation_instruction_no_date": "Vali kuupäev, et kõigi selle kuupäevaga fotode ja videote asukohti hallata",
"geolocation_instruction_no_photos": "Selle kuupäevaga fotosid ja videosid ei leitud. Vali mõni muu kuupäev",
"get_help": "Küsi abi", "get_help": "Küsi abi",
"get_wifiname_error": "WiFi-võrgu nime ei õnnestunud lugeda. Veendu, et oled andnud vajalikud load ja oled WiFi-võrguga ühendatud", "get_wifiname_error": "WiFi-võrgu nime ei õnnestunud lugeda. Veendu, et oled andnud vajalikud load ja oled WiFi-võrguga ühendatud",
"getting_started": "Alustamine", "getting_started": "Alustamine",
@ -1520,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "Mobiilirakendus on aegunud. Palun uuenda uusimale väikesele versioonile.", "profile_drawer_client_out_of_date_minor": "Mobiilirakendus on aegunud. Palun uuenda uusimale väikesele versioonile.",
"profile_drawer_client_server_up_to_date": "Klient ja server on uuendatud", "profile_drawer_client_server_up_to_date": "Klient ja server on uuendatud",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Kirjutuskaitserežiim sisse lülitatud. Väljumiseks topeltpuuduta avatari ikooni.", "profile_drawer_readonly_mode": "Kirjutuskaitserežiim sisse lülitatud. Väljumiseks puuduta pikalt avatari ikooni.",
"profile_drawer_server_out_of_date_major": "Server on aegunud. Palun uuenda uusimale suurele versioonile.", "profile_drawer_server_out_of_date_major": "Server on aegunud. Palun uuenda uusimale suurele versioonile.",
"profile_drawer_server_out_of_date_minor": "Server on aegunud. Palun uuenda uusimale väikesele versioonile.", "profile_drawer_server_out_of_date_minor": "Server on aegunud. Palun uuenda uusimale väikesele versioonile.",
"profile_image_of_user": "Kasutaja {user} profiilipilt", "profile_image_of_user": "Kasutaja {user} profiilipilt",
@ -1644,6 +1639,7 @@
"restore_user": "Taasta kasutaja", "restore_user": "Taasta kasutaja",
"restored_asset": "Üksus taastatud", "restored_asset": "Üksus taastatud",
"resume": "Jätka", "resume": "Jätka",
"resume_paused_jobs": "Jätka {count, plural, one {# peatatud tööde} other {# peatatud töödet}}",
"retry_upload": "Proovi üleslaadimist uuesti", "retry_upload": "Proovi üleslaadimist uuesti",
"review_duplicates": "Vaata duplikaadid läbi", "review_duplicates": "Vaata duplikaadid läbi",
"review_large_files": "Vaata suured failid läbi", "review_large_files": "Vaata suured failid läbi",
@ -1848,10 +1844,8 @@
"shift_to_permanent_delete": "vajuta ⇧, et üksus jäädavalt kustutada", "shift_to_permanent_delete": "vajuta ⇧, et üksus jäädavalt kustutada",
"show_album_options": "Näita albumi valikuid", "show_album_options": "Näita albumi valikuid",
"show_albums": "Näita albumeid", "show_albums": "Näita albumeid",
"show_all_assets": "Kuva kõik üksused",
"show_all_people": "Näita kõiki isikuid", "show_all_people": "Näita kõiki isikuid",
"show_and_hide_people": "Näita ja peida isikuid", "show_and_hide_people": "Näita ja peida isikuid",
"show_assets_without_location": "Kuva ilma asukohata üksused",
"show_file_location": "Näita faili asukohta", "show_file_location": "Näita faili asukohta",
"show_gallery": "Näita galeriid", "show_gallery": "Näita galeriid",
"show_hidden_people": "Kuva peidetud inimesed", "show_hidden_people": "Kuva peidetud inimesed",
@ -1922,6 +1916,8 @@
"sync_albums_manual_subtitle": "Sünkrooni kõik üleslaaditud videod ja fotod valitud varundusalbumitesse", "sync_albums_manual_subtitle": "Sünkrooni kõik üleslaaditud videod ja fotod valitud varundusalbumitesse",
"sync_local": "Sünkrooni lokaalsed üksused", "sync_local": "Sünkrooni lokaalsed üksused",
"sync_remote": "Sünkrooni kaugüksused", "sync_remote": "Sünkrooni kaugüksused",
"sync_status": "Sünkroonimise staatus",
"sync_status_subtitle": "Vaata ja halda sünkroonimissüsteemi",
"sync_upload_album_setting_subtitle": "Loo ja laadi oma pildid ja videod üles Immich'isse valitud albumitesse", "sync_upload_album_setting_subtitle": "Loo ja laadi oma pildid ja videod üles Immich'isse valitud albumitesse",
"tag": "Silt", "tag": "Silt",
"tag_assets": "Sildista üksuseid", "tag_assets": "Sildista üksuseid",
@ -1959,7 +1955,9 @@
"to_change_password": "Muuda parool", "to_change_password": "Muuda parool",
"to_favorite": "Lemmik", "to_favorite": "Lemmik",
"to_login": "Logi sisse", "to_login": "Logi sisse",
"to_multi_select": "vali mitu",
"to_parent": "Tase üles", "to_parent": "Tase üles",
"to_select": "vali",
"to_trash": "Prügikasti", "to_trash": "Prügikasti",
"toggle_settings": "Kuva/peida seaded", "toggle_settings": "Kuva/peida seaded",
"total": "Kokku", "total": "Kokku",
@ -1979,6 +1977,7 @@
"trash_page_select_assets_btn": "Vali üksused", "trash_page_select_assets_btn": "Vali üksused",
"trash_page_title": "Prügikast ({count})", "trash_page_title": "Prügikast ({count})",
"trashed_items_will_be_permanently_deleted_after": "Prügikasti tõstetud üksused kustutatakse jäädavalt {days, plural, one {# päeva} other {# päeva}} pärast.", "trashed_items_will_be_permanently_deleted_after": "Prügikasti tõstetud üksused kustutatakse jäädavalt {days, plural, one {# päeva} other {# päeva}} pärast.",
"troubleshoot": "Tõrkeotsing",
"type": "Tüüp", "type": "Tüüp",
"unable_to_change_pin_code": "PIN-koodi muutmine ebaõnnestus", "unable_to_change_pin_code": "PIN-koodi muutmine ebaõnnestus",
"unable_to_setup_pin_code": "PIN-koodi seadistamine ebaõnnestus", "unable_to_setup_pin_code": "PIN-koodi seadistamine ebaõnnestus",
@ -2034,7 +2033,6 @@
"use_biometric": "Kasuta biomeetriat", "use_biometric": "Kasuta biomeetriat",
"use_current_connection": "kasuta praegust ühendust", "use_current_connection": "kasuta praegust ühendust",
"use_custom_date_range": "Kasuta kohandatud kuupäevavahemikku", "use_custom_date_range": "Kasuta kohandatud kuupäevavahemikku",
"use_this_location": "Klõpsa asukoha kasutamiseks",
"user": "Kasutaja", "user": "Kasutaja",
"user_has_been_deleted": "See kasutaja on kustutatud.", "user_has_been_deleted": "See kasutaja on kustutatud.",
"user_id": "Kasutaja ID", "user_id": "Kasutaja ID",

View file

@ -38,6 +38,58 @@
"admin": { "admin": {
"add_exclusion_pattern_description": "Gehitu baztertze patroiak. *, ** eta ? karakterak erabil ditzazkezu (globbing). Adibideak: \"Raw\" izeneko edozein direktorioko fitxategi guztiak baztertzeko, erabili \"**/Raw/**\". \".tif\" amaitzen diren fitxategi guztiak baztertzeko, erabili \"**/*.tif\". Bide absolutu bat baztertzeko, erabili \"/baztertu/beharreko/bidea/**\".", "add_exclusion_pattern_description": "Gehitu baztertze patroiak. *, ** eta ? karakterak erabil ditzazkezu (globbing). Adibideak: \"Raw\" izeneko edozein direktorioko fitxategi guztiak baztertzeko, erabili \"**/Raw/**\". \".tif\" amaitzen diren fitxategi guztiak baztertzeko, erabili \"**/*.tif\". Bide absolutu bat baztertzeko, erabili \"/baztertu/beharreko/bidea/**\".",
"admin_user": "Administradore erabiltzailea", "admin_user": "Administradore erabiltzailea",
"image_quality": "Kalitatea" "authentication_settings": "Segurtasun Ezarpenak",
} "authentication_settings_description": "Kudeatu pasahitza, OAuth edo beste segurtasun konfigurazio bat",
"authentication_settings_disable_all": "Seguru zaude saioa hasteko modu guztiak desgaitu nahi dituzula? Saioa hastea guztiz desgaitua izango da.",
"authentication_settings_reenable": "Berriro gaitzeko, erabili <link>Server Command</link>.",
"backup_onboarding_footer": "Immich-en babes kopiei buruzko informazio gehiago nahi baduzu, mesedez irakurri <link>dokumentazioa</link>.",
"backup_onboarding_title": "Babes Kopiak",
"confirm_delete_library": "Seguru zaude {library} ezabatu nahi duzula?",
"confirm_email_below": "Konfirmatzeko, idatzi \"{email}\" azpian",
"confirm_reprocess_all_faces": "Seguru zaude aurpegi guztiak berriro prozesatu nahi dituzula? Erabakiak jendearen izenak ere borratuko ditu.",
"confirm_user_password_reset": "Seguru zaude {user}-ren pasahitza berrezarri nahi duzula?",
"confirm_user_pin_code_reset": "Seguru zaude {user}-ren PIN kodea berrezarri nahi duzula?",
"create_job": "Gehitu zeregina",
"disable_login": "Desgaitu saio hastea",
"face_detection": "Aurpegi detekzioa",
"failed_job_command": "{command} komandoak hutsegin du {job} zereginerako",
"image_format": "Formatua",
"image_format_description": "WebP ereduak JPEG baino fitxategi txikiagoak sortzen ditu, baina motelagoa da kodifikatzen.",
"image_preview_title": "Aurreikusiaen Konfigurazioa",
"image_quality": "Kalitatea",
"image_settings": "Argazkien Konfigurazioa",
"image_thumbnail_title": "Argazki Txikien Konfigurazioa",
"job_created": "Zeregina sortuta",
"job_settings": "Zereginaren konfigurazioa",
"job_status": "Zereginaren Egoera",
"machine_learning_smart_search_enabled": "Gaitu bilaketa arina",
"manage_log_settings": "Kudeatu erregistroen konfigurazioa",
"map_dark_style": "Beltz estiloa",
"map_gps_settings": "Mapa eta GPS Konfigurazioa",
"map_light_style": "Zuri estiloa",
"map_settings": "Mapa",
"metadata_faces_import_setting": "Gaitu aurpegien inportazioa",
"metadata_settings": "Metadata Konfigurazioa",
"metadata_settings_description": "Kudeatu metadaten konfigurazioa",
"migration_job": "Migrazio"
},
"advanced_settings_readonly_mode_title": "Irakurri-bakarrik Modua",
"apply_count": "Ezarri ({count, number})",
"assets_added_to_albums_count": "Gehituta {assetTotal, plural, one {# asset} other {# assets}} to {albumTotal, plural, one {# album} other {# albums}}",
"assets_cannot_be_added_to_albums": "{count, plural, one {Asset} other {Assets}} ezin izan da albumetara gehitu",
"assets_were_part_of_albums_count": "{count, plural, one {Asset was} other {Assets were}} dagoeneko albumean dago",
"first": "Lehenengo «Lehenik»",
"gps": "GPS",
"gps_missing": "Ez dago GPS",
"last": "Azkena",
"like": "Gustoko",
"manage_geolocation": "Kudeatu kokapena",
"organize_into_albums": "Albumetan antolatu",
"query_asset_id": "Aztertu aukeratutako ID-a",
"readonly_mode_disabled": "Irakurri-bakarrik modua desgaituta",
"readonly_mode_enabled": "Irakurri-bakarrik modua gaituta",
"selected_gps_coordinates": "GPS Koordenadak Aukeratuta",
"sort_newest": "Argazkirik berriena",
"to_select": "aukeratzeko",
"view_similar_photos": "Ikusi antzeko argazkiak"
} }

View file

@ -396,6 +396,7 @@
"advanced_settings_prefer_remote_title": "Suosi etäkuvia", "advanced_settings_prefer_remote_title": "Suosi etäkuvia",
"advanced_settings_proxy_headers_subtitle": "Määritä välityspalvelimen otsikot(proxy headers), jotka Immichin tulisi lähettää jokaisen verkkopyynnön mukana", "advanced_settings_proxy_headers_subtitle": "Määritä välityspalvelimen otsikot(proxy headers), jotka Immichin tulisi lähettää jokaisen verkkopyynnön mukana",
"advanced_settings_proxy_headers_title": "Välityspalvelimen otsikot", "advanced_settings_proxy_headers_title": "Välityspalvelimen otsikot",
"advanced_settings_readonly_mode_subtitle": "Aktivoi vain luku -tilan, jolloin valokuvia voi ainoastaan selata. Toiminnot kuten useiden kuvien valitseminen, jakaminen, siirtäminen toistolaitteelle ja poistaminen ovat pois käytöstä. Laita vain luku -tila päälle tai pois päältä päävalikon käyttäjäkuvakkeesta",
"advanced_settings_readonly_mode_title": "Vain luku -tila", "advanced_settings_readonly_mode_title": "Vain luku -tila",
"advanced_settings_self_signed_ssl_subtitle": "Ohita SSL sertifikaattivarmennus palvelimen päätepisteellä. Vaaditaan self-signed -sertifikaateissa.", "advanced_settings_self_signed_ssl_subtitle": "Ohita SSL sertifikaattivarmennus palvelimen päätepisteellä. Vaaditaan self-signed -sertifikaateissa.",
"advanced_settings_self_signed_ssl_title": "Salli self-signed SSL -sertifikaatit", "advanced_settings_self_signed_ssl_title": "Salli self-signed SSL -sertifikaatit",
@ -462,6 +463,7 @@
"app_bar_signout_dialog_title": "Kirjaudu ulos", "app_bar_signout_dialog_title": "Kirjaudu ulos",
"app_settings": "Sovellusasetukset", "app_settings": "Sovellusasetukset",
"appears_in": "Esiintyy albumeissa", "appears_in": "Esiintyy albumeissa",
"apply_count": "Aseta {count, number}",
"archive": "Arkisto", "archive": "Arkisto",
"archive_action_prompt": "{count} lisätty arkistoon", "archive_action_prompt": "{count} lisätty arkistoon",
"archive_or_unarchive_photo": "Arkistoi kuva tai palauta arkistosta", "archive_or_unarchive_photo": "Arkistoi kuva tai palauta arkistosta",
@ -595,8 +597,6 @@
"backup_setting_subtitle": "Hallinnoi aktiivisia ja taustalla olevia lähetysasetuksia", "backup_setting_subtitle": "Hallinnoi aktiivisia ja taustalla olevia lähetysasetuksia",
"backup_settings_subtitle": "Hallitse lähetysasetuksia", "backup_settings_subtitle": "Hallitse lähetysasetuksia",
"backward": "Taaksepäin", "backward": "Taaksepäin",
"beta_sync": "Betasynkronoinnin tila",
"beta_sync_subtitle": "Hallitse uutta synkronointijärjestelmää",
"biometric_auth_enabled": "Biometrinen tunnistautuminen käytössä", "biometric_auth_enabled": "Biometrinen tunnistautuminen käytössä",
"biometric_locked_out": "Sinulta on evätty pääsy biometriseen tunnistautumiseen", "biometric_locked_out": "Sinulta on evätty pääsy biometriseen tunnistautumiseen",
"biometric_no_options": "Ei biometrisiä vaihtoehtoja", "biometric_no_options": "Ei biometrisiä vaihtoehtoja",
@ -1074,6 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Ominaisuus lataa ulkoisia resursseja Googlelta toimiakseen.", "gcast_enabled_description": "Ominaisuus lataa ulkoisia resursseja Googlelta toimiakseen.",
"general": "Yleinen", "general": "Yleinen",
"geolocation_instruction_location": "Napsauta kuvaa, jossa on GPS-koordinaatit, käyttääksesi sen sijaintia, tai valitse sijainti suoraan kartalta",
"get_help": "Hae apua", "get_help": "Hae apua",
"get_wifiname_error": "Wi-Fi-verkon nimen hakeminen epäonnistui. Varmista, että olet myöntänyt tarvittavat käyttöoikeudet ja että olet yhteydessä Wi-Fi-verkkoon", "get_wifiname_error": "Wi-Fi-verkon nimen hakeminen epäonnistui. Varmista, että olet myöntänyt tarvittavat käyttöoikeudet ja että olet yhteydessä Wi-Fi-verkkoon",
"getting_started": "Aloittaminen", "getting_started": "Aloittaminen",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Ajuster les paramètres d'envoi au premier et en arrière-plan", "backup_setting_subtitle": "Ajuster les paramètres d'envoi au premier et en arrière-plan",
"backup_settings_subtitle": "Gérer les paramètres de téléversement", "backup_settings_subtitle": "Gérer les paramètres de téléversement",
"backward": "Arrière", "backward": "Arrière",
"beta_sync": "Statut de la synchronisation béta",
"beta_sync_subtitle": "Gérer le nouveau système de synchronisation",
"biometric_auth_enabled": "Authentification biométrique activée", "biometric_auth_enabled": "Authentification biométrique activée",
"biometric_locked_out": "L'authentification biométrique est verrouillé", "biometric_locked_out": "L'authentification biométrique est verrouillé",
"biometric_no_options": "Aucune option biométrique disponible", "biometric_no_options": "Aucune option biométrique disponible",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Diffusion Google Cast", "gcast_enabled": "Diffusion Google Cast",
"gcast_enabled_description": "Cette fonctionnalité charge des ressources externes depuis Google pour fonctionner.", "gcast_enabled_description": "Cette fonctionnalité charge des ressources externes depuis Google pour fonctionner.",
"general": "Général", "general": "Général",
"geolocation_instruction_all_have_location": "Tous les médias pour cette date ont déjà des données de localisation. Essayez d'afficher tous les médias ou sélectionnez une date différente",
"geolocation_instruction_location": "Cliquez sur un média avec des coordonnées GPS pour utiliser sa localisation, ou bien sélectionnez une localisation directement sur la carte", "geolocation_instruction_location": "Cliquez sur un média avec des coordonnées GPS pour utiliser sa localisation, ou bien sélectionnez une localisation directement sur la carte",
"geolocation_instruction_no_date": "Sélectionnez une date pour gérer les données de localisation pour les photos et vidéos de ce jour",
"geolocation_instruction_no_photos": "Aucune photo ou vidéo trouvée pour cette date. Sélectionnez une date différente pour en afficher",
"get_help": "Obtenir de l'aide", "get_help": "Obtenir de l'aide",
"get_wifiname_error": "Impossible d'obtenir le nom du réseau wifi. Assurez-vous d'avoir donné les permissions nécessaires à l'application et que vous êtes connecté à un réseau wifi", "get_wifiname_error": "Impossible d'obtenir le nom du réseau wifi. Assurez-vous d'avoir donné les permissions nécessaires à l'application et que vous êtes connecté à un réseau wifi",
"getting_started": "Commencer", "getting_started": "Commencer",
@ -1520,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "L'application mobile est obsolète. Veuillez effectuer la mise à jour vers la dernière version mineure.", "profile_drawer_client_out_of_date_minor": "L'application mobile est obsolète. Veuillez effectuer la mise à jour vers la dernière version mineure.",
"profile_drawer_client_server_up_to_date": "Le client et le serveur sont à jour", "profile_drawer_client_server_up_to_date": "Le client et le serveur sont à jour",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Mode lecture seule activé. Faites un appui double sur l'image de l'utilisateur pour quitter.", "profile_drawer_readonly_mode": "Mode lecture seule activé. Faites un appui long sur l'image de l'utilisateur pour quitter.",
"profile_drawer_server_out_of_date_major": "Le serveur est obsolète. Veuillez mettre à jour vers la dernière version majeure.", "profile_drawer_server_out_of_date_major": "Le serveur est obsolète. Veuillez mettre à jour vers la dernière version majeure.",
"profile_drawer_server_out_of_date_minor": "Le serveur est obsolète. Veuillez mettre à jour vers la dernière version mineure.", "profile_drawer_server_out_of_date_minor": "Le serveur est obsolète. Veuillez mettre à jour vers la dernière version mineure.",
"profile_image_of_user": "Image de profil de {user}", "profile_image_of_user": "Image de profil de {user}",
@ -1559,7 +1554,7 @@
"purchase_server_description_2": "Statut de contributeur", "purchase_server_description_2": "Statut de contributeur",
"purchase_server_title": "Serveur", "purchase_server_title": "Serveur",
"purchase_settings_server_activated": "La clé du produit pour le Serveur est gérée par l'administrateur", "purchase_settings_server_activated": "La clé du produit pour le Serveur est gérée par l'administrateur",
"query_asset_id": "ID du média requis", "query_asset_id": "Obtenir l'ID du média",
"queue_status": "{count}/{total} en file d'attente", "queue_status": "{count}/{total} en file d'attente",
"rating": "Étoile d'évaluation", "rating": "Étoile d'évaluation",
"rating_clear": "Effacer l'évaluation", "rating_clear": "Effacer l'évaluation",
@ -1645,6 +1640,7 @@
"restore_user": "Restaurer l'utilisateur", "restore_user": "Restaurer l'utilisateur",
"restored_asset": "Média restauré", "restored_asset": "Média restauré",
"resume": "Reprendre", "resume": "Reprendre",
"resume_paused_jobs": "Reprendre {count, plural, one {la tâche en cours} other {les # tâches en cours}}",
"retry_upload": "Réessayer l'envoi", "retry_upload": "Réessayer l'envoi",
"review_duplicates": "Consulter les doublons", "review_duplicates": "Consulter les doublons",
"review_large_files": "Consulter les fichiers volumineux", "review_large_files": "Consulter les fichiers volumineux",
@ -1849,10 +1845,8 @@
"shift_to_permanent_delete": "appuyez sur ⇧ pour supprimer définitivement le média", "shift_to_permanent_delete": "appuyez sur ⇧ pour supprimer définitivement le média",
"show_album_options": "Afficher les options de l'album", "show_album_options": "Afficher les options de l'album",
"show_albums": "Montrer les albums", "show_albums": "Montrer les albums",
"show_all_assets": "Montrer tous les médias",
"show_all_people": "Montrer toutes les personnes", "show_all_people": "Montrer toutes les personnes",
"show_and_hide_people": "Afficher / Masquer les personnes", "show_and_hide_people": "Afficher / Masquer les personnes",
"show_assets_without_location": "Montrer les médias sans localisation",
"show_file_location": "Afficher l'emplacement du fichier", "show_file_location": "Afficher l'emplacement du fichier",
"show_gallery": "Afficher la galerie", "show_gallery": "Afficher la galerie",
"show_hidden_people": "Afficher les personnes masquées", "show_hidden_people": "Afficher les personnes masquées",
@ -1923,6 +1917,8 @@
"sync_albums_manual_subtitle": "Synchroniser toutes les vidéos et photos envoyées dans les albums sélectionnés", "sync_albums_manual_subtitle": "Synchroniser toutes les vidéos et photos envoyées dans les albums sélectionnés",
"sync_local": "Synchronisation locale", "sync_local": "Synchronisation locale",
"sync_remote": "Synchronisation à distance", "sync_remote": "Synchronisation à distance",
"sync_status": "Statut de synchronisation",
"sync_status_subtitle": "Consulter et gérer le système de synchronisation",
"sync_upload_album_setting_subtitle": "Créez et envoyez vos photos et vidéos dans les albums sélectionnés sur Immich", "sync_upload_album_setting_subtitle": "Créez et envoyez vos photos et vidéos dans les albums sélectionnés sur Immich",
"tag": "Étiquette", "tag": "Étiquette",
"tag_assets": "Étiqueter les médias", "tag_assets": "Étiqueter les médias",
@ -1982,6 +1978,7 @@
"trash_page_select_assets_btn": "Sélectionner les éléments", "trash_page_select_assets_btn": "Sélectionner les éléments",
"trash_page_title": "Corbeille ({count})", "trash_page_title": "Corbeille ({count})",
"trashed_items_will_be_permanently_deleted_after": "Les éléments dans la corbeille seront supprimés définitivement après {days, plural, one {# jour} other {# jours}}.", "trashed_items_will_be_permanently_deleted_after": "Les éléments dans la corbeille seront supprimés définitivement après {days, plural, one {# jour} other {# jours}}.",
"troubleshoot": "Dépannage",
"type": "Type", "type": "Type",
"unable_to_change_pin_code": "Impossible de changer le code PIN", "unable_to_change_pin_code": "Impossible de changer le code PIN",
"unable_to_setup_pin_code": "Impossible de définir le code PIN", "unable_to_setup_pin_code": "Impossible de définir le code PIN",
@ -2037,7 +2034,6 @@
"use_biometric": "Utiliser l'authentification biométrique", "use_biometric": "Utiliser l'authentification biométrique",
"use_current_connection": "Utiliser le réseau actuel", "use_current_connection": "Utiliser le réseau actuel",
"use_custom_date_range": "Utilisez une plage de date personnalisée à la place", "use_custom_date_range": "Utilisez une plage de date personnalisée à la place",
"use_this_location": "Cliquez pour utiliser la localisation",
"user": "Utilisateur", "user": "Utilisateur",
"user_has_been_deleted": "Cet utilisateur à été supprimé.", "user_has_been_deleted": "Cet utilisateur à été supprimé.",
"user_id": "ID Utilisateur", "user_id": "ID Utilisateur",
@ -2080,7 +2076,7 @@
"view_next_asset": "Voir le média suivant", "view_next_asset": "Voir le média suivant",
"view_previous_asset": "Voir le média précédent", "view_previous_asset": "Voir le média précédent",
"view_qr_code": "Voir le QR code", "view_qr_code": "Voir le QR code",
"view_similar_photos": "Voir les photos similaires", "view_similar_photos": "Afficher les photos similaires",
"view_stack": "Afficher la pile", "view_stack": "Afficher la pile",
"view_user": "Voir l'utilisateur", "view_user": "Voir l'utilisateur",
"viewer_remove_from_stack": "Retirer de la pile", "viewer_remove_from_stack": "Retirer de la pile",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "ניהול הגדרות העלאת רקע וחזית", "backup_setting_subtitle": "ניהול הגדרות העלאת רקע וחזית",
"backup_settings_subtitle": "נהל הגדרות העלאה", "backup_settings_subtitle": "נהל הגדרות העלאה",
"backward": "אחורה", "backward": "אחורה",
"beta_sync": "סטטוס סנכרון (בטא)",
"beta_sync_subtitle": "נהל את מערכת הסנכרון החדשה",
"biometric_auth_enabled": "אימות ביומטרי הופעל", "biometric_auth_enabled": "אימות ביומטרי הופעל",
"biometric_locked_out": "גישה לאימות הביומטרי נחסמה", "biometric_locked_out": "גישה לאימות הביומטרי נחסמה",
"biometric_no_options": "אין אפשרויות זמינות עבור אימות ביומטרי", "biometric_no_options": "אין אפשרויות זמינות עבור אימות ביומטרי",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "תכונה זאת טוענת משאבים חיצוניים מגוגל בכדי לפעול.", "gcast_enabled_description": "תכונה זאת טוענת משאבים חיצוניים מגוגל בכדי לפעול.",
"general": "כללי", "general": "כללי",
"geolocation_instruction_all_have_location": "לכל הפריטים עבור תאריך זה כבר יש נתוני מיקום. נסה להציג את כל הפריטים או בחר תאריך אחר",
"geolocation_instruction_location": "לחץ על פריט עם קואורדינטות GPS כדי להשתמש במיקומו, או בחר מיקום ישירות מהמפה", "geolocation_instruction_location": "לחץ על פריט עם קואורדינטות GPS כדי להשתמש במיקומו, או בחר מיקום ישירות מהמפה",
"geolocation_instruction_no_date": "בחר תאריך כדי לנהל נתוני מיקום עבור תמונות וסרטונים מאותו יום",
"geolocation_instruction_no_photos": "לא נמצאו תמונות או סרטונים עבור תאריך זה. בחר תאריך אחר כדי להציג אותם",
"get_help": "קבל עזרה", "get_help": "קבל עזרה",
"get_wifiname_error": "לא היה ניתן לקבל את שם האינטרנט האלחוטי שלך. יש לודא שהענקת את ההרשאות הדרושות ושאת/ה מחובר/ת לרשת אינטרנט אלחוטי", "get_wifiname_error": "לא היה ניתן לקבל את שם האינטרנט האלחוטי שלך. יש לודא שהענקת את ההרשאות הדרושות ושאת/ה מחובר/ת לרשת אינטרנט אלחוטי",
"getting_started": "תחילת העבודה", "getting_started": "תחילת העבודה",
@ -1846,10 +1841,8 @@
"shift_to_permanent_delete": "לחץ ⇧ כדי למחוק תמונה לצמיתות", "shift_to_permanent_delete": "לחץ ⇧ כדי למחוק תמונה לצמיתות",
"show_album_options": "הצג אפשרויות אלבום", "show_album_options": "הצג אפשרויות אלבום",
"show_albums": "הצג אלבומים", "show_albums": "הצג אלבומים",
"show_all_assets": "הצג את כל הפריטים",
"show_all_people": "הצג את כל האנשים", "show_all_people": "הצג את כל האנשים",
"show_and_hide_people": "הצג & הסתר אנשים", "show_and_hide_people": "הצג & הסתר אנשים",
"show_assets_without_location": "הצג פריטים ללא מיקום",
"show_file_location": "הצג את מיקום הקובץ", "show_file_location": "הצג את מיקום הקובץ",
"show_gallery": "הצג גלריה", "show_gallery": "הצג גלריה",
"show_hidden_people": "הצג אנשים מוסתרים", "show_hidden_people": "הצג אנשים מוסתרים",
@ -2034,7 +2027,6 @@
"use_biometric": "השתמש באימות ביומטרי", "use_biometric": "השתמש באימות ביומטרי",
"use_current_connection": "השתמש בחיבור נוכחי", "use_current_connection": "השתמש בחיבור נוכחי",
"use_custom_date_range": "השתמש בטווח תאריכים מותאם במקום", "use_custom_date_range": "השתמש בטווח תאריכים מותאם במקום",
"use_this_location": "לחץ כדי להשתמש במיקום",
"user": "משתמש", "user": "משתמש",
"user_has_been_deleted": "משתמש זה נמחק.", "user_has_been_deleted": "משתמש זה נמחק.",
"user_id": "מזהה משתמש", "user_id": "מזהה משתמש",

View file

@ -585,8 +585,6 @@
"backup_setting_subtitle": "पृष्ठभूमि और अग्रभूमि अपलोड सेटिंग प्रबंधित करें", "backup_setting_subtitle": "पृष्ठभूमि और अग्रभूमि अपलोड सेटिंग प्रबंधित करें",
"backup_settings_subtitle": "अपलोड सेटिंग्स संभालें", "backup_settings_subtitle": "अपलोड सेटिंग्स संभालें",
"backward": "पिछला", "backward": "पिछला",
"beta_sync": "बीटा सिंक स्थिति",
"beta_sync_subtitle": "नए सिंक सिस्टम का प्रबंधन करें",
"biometric_auth_enabled": "बायोमेट्रिक प्रमाणीकरण सक्षम", "biometric_auth_enabled": "बायोमेट्रिक प्रमाणीकरण सक्षम",
"biometric_locked_out": "आप बायोमेट्रिक प्रमाणीकरण से बाहर हैं", "biometric_locked_out": "आप बायोमेट्रिक प्रमाणीकरण से बाहर हैं",
"biometric_no_options": "कोई बायोमेट्रिक विकल्प उपलब्ध नहीं है", "biometric_no_options": "कोई बायोमेट्रिक विकल्प उपलब्ध नहीं है",

View file

@ -594,8 +594,6 @@
"backup_setting_subtitle": "Upravljajte postavkama učitavanja u pozadini i prvom planu", "backup_setting_subtitle": "Upravljajte postavkama učitavanja u pozadini i prvom planu",
"backup_settings_subtitle": "Upravljaj postavkama slanja", "backup_settings_subtitle": "Upravljaj postavkama slanja",
"backward": "Unazad", "backward": "Unazad",
"beta_sync": "Beta status sinkronizacije",
"beta_sync_subtitle": "Upravljaj novim sustavom sinkronizacije",
"biometric_auth_enabled": "Biometrijska autentikacija omogućena", "biometric_auth_enabled": "Biometrijska autentikacija omogućena",
"biometric_locked_out": "Zaključani ste iz biometrijske autentikacije", "biometric_locked_out": "Zaključani ste iz biometrijske autentikacije",
"biometric_no_options": "Nema dostupnih biometrijskih opcija", "biometric_no_options": "Nema dostupnih biometrijskih opcija",

View file

@ -594,8 +594,6 @@
"backup_setting_subtitle": "A háttérben és előtérben mentés beállításainak kezelése", "backup_setting_subtitle": "A háttérben és előtérben mentés beállításainak kezelése",
"backup_settings_subtitle": "Feltöltés beállításai", "backup_settings_subtitle": "Feltöltés beállításai",
"backward": "Visszafele", "backward": "Visszafele",
"beta_sync": "Béta Szinkronizálás Állapota",
"beta_sync_subtitle": "Az új szinkronizálási rendszer kezelése",
"biometric_auth_enabled": "Biometrikus azonosítás engedélyezve", "biometric_auth_enabled": "Biometrikus azonosítás engedélyezve",
"biometric_locked_out": "Ki vagy zárva a biometrikus azonosításból", "biometric_locked_out": "Ki vagy zárva a biometrikus azonosításból",
"biometric_no_options": "Nincsen elérhető biometrikus azonosítás", "biometric_no_options": "Nincsen elérhető biometrikus azonosítás",

View file

@ -28,7 +28,9 @@
"add_to_album": "Tambahkan ke album", "add_to_album": "Tambahkan ke album",
"add_to_album_bottom_sheet_added": "Ditambahkan ke {album}", "add_to_album_bottom_sheet_added": "Ditambahkan ke {album}",
"add_to_album_bottom_sheet_already_exists": "Sudah ada di {album}", "add_to_album_bottom_sheet_already_exists": "Sudah ada di {album}",
"add_to_album_toggle": "Masukkan ke {album} / Batalkan dari {album}",
"add_to_albums": "Tambahkan ke album", "add_to_albums": "Tambahkan ke album",
"add_to_albums_count": "Tambahkan ke album ({count})",
"add_to_shared_album": "Tambahkan ke album terbagi", "add_to_shared_album": "Tambahkan ke album terbagi",
"add_url": "Tambahkan URL", "add_url": "Tambahkan URL",
"added_to_archive": "Ditambahkan ke arsip", "added_to_archive": "Ditambahkan ke arsip",
@ -394,6 +396,8 @@
"advanced_settings_prefer_remote_title": "Prioritaskan gambar dari server", "advanced_settings_prefer_remote_title": "Prioritaskan gambar dari server",
"advanced_settings_proxy_headers_subtitle": "Tentukan header proxy yang harus dikirim Immich dengan setiap permintaan jaringan", "advanced_settings_proxy_headers_subtitle": "Tentukan header proxy yang harus dikirim Immich dengan setiap permintaan jaringan",
"advanced_settings_proxy_headers_title": "Tajuk Proksi", "advanced_settings_proxy_headers_title": "Tajuk Proksi",
"advanced_settings_readonly_mode_subtitle": "Mengaktifkan mode baca-saja, di mana foto hanya bisa dilihat. Fitur seperti memilih banyak foto, berbagi, cast, dan hapus akan dinonaktifkan. Mode baca-saja bisa diaktifkan/nonaktifkan lewat avatar pengguna di layar utama",
"advanced_settings_readonly_mode_title": "Mode Baca-Saja",
"advanced_settings_self_signed_ssl_subtitle": "Melewati verifikasi sertifikat SSL untuk titik akhir server. Diperlukan untuk sertifikat yang ditandatangani sendiri.", "advanced_settings_self_signed_ssl_subtitle": "Melewati verifikasi sertifikat SSL untuk titik akhir server. Diperlukan untuk sertifikat yang ditandatangani sendiri.",
"advanced_settings_self_signed_ssl_title": "Izinkan sertifikat SSL yang ditandatangani sendiri", "advanced_settings_self_signed_ssl_title": "Izinkan sertifikat SSL yang ditandatangani sendiri",
"advanced_settings_sync_remote_deletions_subtitle": "Hapus atau pulihkan aset pada perangkat ini secara otomatis ketika tindakan dilakukan di web", "advanced_settings_sync_remote_deletions_subtitle": "Hapus atau pulihkan aset pada perangkat ini secara otomatis ketika tindakan dilakukan di web",
@ -459,6 +463,7 @@
"app_bar_signout_dialog_title": "Keluar akun", "app_bar_signout_dialog_title": "Keluar akun",
"app_settings": "Pengaturan Aplikasi", "app_settings": "Pengaturan Aplikasi",
"appears_in": "Muncul dalam", "appears_in": "Muncul dalam",
"apply_count": "Terapkan ({count, number})",
"archive": "Arsip", "archive": "Arsip",
"archive_action_prompt": "{count} telah ditambahkan ke Arsip", "archive_action_prompt": "{count} telah ditambahkan ke Arsip",
"archive_or_unarchive_photo": "Arsipkan atau batalkan pengarsipan foto", "archive_or_unarchive_photo": "Arsipkan atau batalkan pengarsipan foto",
@ -498,7 +503,9 @@
"assets": "Aset", "assets": "Aset",
"assets_added_count": "{count, plural, one {# aset} other {# aset}} ditambahkan", "assets_added_count": "{count, plural, one {# aset} other {# aset}} ditambahkan",
"assets_added_to_album_count": "Ditambahkan {count, plural, one {# aset} other {# aset}} ke album", "assets_added_to_album_count": "Ditambahkan {count, plural, one {# aset} other {# aset}} ke album",
"assets_added_to_albums_count": "Ditambahkan {assetTotal, plural, one {# aset} other {# aset}} ke {albumTotal, plural, one {# album} other {# album}}",
"assets_cannot_be_added_to_album_count": "{count, plural, one {Asset} other {Assets}} tidak dapat ditambahkan ke album", "assets_cannot_be_added_to_album_count": "{count, plural, one {Asset} other {Assets}} tidak dapat ditambahkan ke album",
"assets_cannot_be_added_to_albums": "{count, plural, one {Aset} other {Aset}} tidak dapat ditambahkan ke album mana pun",
"assets_count": "{count, plural, one {# aset} other {# aset}}", "assets_count": "{count, plural, one {# aset} other {# aset}}",
"assets_deleted_permanently": "{count} aset dihapus secara permanen", "assets_deleted_permanently": "{count} aset dihapus secara permanen",
"assets_deleted_permanently_from_server": "{count} aset dihapus secara permanen dari server Immich", "assets_deleted_permanently_from_server": "{count} aset dihapus secara permanen dari server Immich",
@ -515,6 +522,7 @@
"assets_trashed_count": "{count, plural, one {# aset} other {# aset}} dibuang ke sampah", "assets_trashed_count": "{count, plural, one {# aset} other {# aset}} dibuang ke sampah",
"assets_trashed_from_server": "{count} aset dipindahkan ke sampah dari server Immich", "assets_trashed_from_server": "{count} aset dipindahkan ke sampah dari server Immich",
"assets_were_part_of_album_count": "{count, plural, one {Aset telah} other {Aset telah}} menjadi bagian dari album", "assets_were_part_of_album_count": "{count, plural, one {Aset telah} other {Aset telah}} menjadi bagian dari album",
"assets_were_part_of_albums_count": "{count, plural, one {Aset sudah} other {Aset sudah}} ada di album",
"authorized_devices": "Perangkat Terautentikasi", "authorized_devices": "Perangkat Terautentikasi",
"automatic_endpoint_switching_subtitle": "Sambungkan secara lokal melalui Wi-Fi yang telah ditetapkan saat tersedia, dan gunakan koneksi alternatif lain", "automatic_endpoint_switching_subtitle": "Sambungkan secara lokal melalui Wi-Fi yang telah ditetapkan saat tersedia, dan gunakan koneksi alternatif lain",
"automatic_endpoint_switching_title": "Peralihan URL otomatis", "automatic_endpoint_switching_title": "Peralihan URL otomatis",
@ -589,8 +597,6 @@
"backup_setting_subtitle": "Kelola pengaturan unggahan latar belakang dan latar depan", "backup_setting_subtitle": "Kelola pengaturan unggahan latar belakang dan latar depan",
"backup_settings_subtitle": "Kelola pengaturan unggahan", "backup_settings_subtitle": "Kelola pengaturan unggahan",
"backward": "Maju", "backward": "Maju",
"beta_sync": "Status proses sinkronisasi versi beta",
"beta_sync_subtitle": "Kelola sistem sinkronisasi baru",
"biometric_auth_enabled": "Autentikasi biometrik diaktifkan", "biometric_auth_enabled": "Autentikasi biometrik diaktifkan",
"biometric_locked_out": "Anda terkunci oleh autentikasi biometrik", "biometric_locked_out": "Anda terkunci oleh autentikasi biometrik",
"biometric_no_options": "Opsi biometrik tidak tersedia", "biometric_no_options": "Opsi biometrik tidak tersedia",
@ -1057,6 +1063,7 @@
"filter_people": "Saring orang", "filter_people": "Saring orang",
"filter_places": "Saring tempat", "filter_places": "Saring tempat",
"find_them_fast": "Temukan dengan cepat berdasarkan nama dengan pencarian", "find_them_fast": "Temukan dengan cepat berdasarkan nama dengan pencarian",
"first": "Pertama",
"fix_incorrect_match": "Perbaiki pencocokan salah", "fix_incorrect_match": "Perbaiki pencocokan salah",
"folder": "Berkas", "folder": "Berkas",
"folder_not_found": "Berkas tidak ditemukan", "folder_not_found": "Berkas tidak ditemukan",
@ -1067,12 +1074,15 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Fitur ini memuat sumber daya eksternal dari Google agar dapat berfungsi.", "gcast_enabled_description": "Fitur ini memuat sumber daya eksternal dari Google agar dapat berfungsi.",
"general": "Umum", "general": "Umum",
"geolocation_instruction_location": "Klik aset yang memiliki koordinat GPS untuk menggunakan lokasinya, atau pilih lokasi langsung dari peta",
"get_help": "Dapatkan Bantuan", "get_help": "Dapatkan Bantuan",
"get_wifiname_error": "Tidak dapat mendapatkan nama Wi-Fi. Pastikan Anda telah memberikan izin yang diperlukan dan terhubung ke jaringan Wi-Fi", "get_wifiname_error": "Tidak dapat mendapatkan nama Wi-Fi. Pastikan Anda telah memberikan izin yang diperlukan dan terhubung ke jaringan Wi-Fi",
"getting_started": "Memulai", "getting_started": "Memulai",
"go_back": "Kembali", "go_back": "Kembali",
"go_to_folder": "Pergi ke folder", "go_to_folder": "Pergi ke folder",
"go_to_search": "Pergi ke pencarian", "go_to_search": "Pergi ke pencarian",
"gps": "GPS",
"gps_missing": "Tidak ada GPS",
"grant_permission": "Izinkan", "grant_permission": "Izinkan",
"group_albums_by": "Kelompokkan album berdasarkan...", "group_albums_by": "Kelompokkan album berdasarkan...",
"group_country": "Kelompokkan berdasarkan negara", "group_country": "Kelompokkan berdasarkan negara",
@ -1178,6 +1188,7 @@
"language_search_hint": "Mencari Bahasa...", "language_search_hint": "Mencari Bahasa...",
"language_setting_description": "Pilih bahasa Anda yang disukai", "language_setting_description": "Pilih bahasa Anda yang disukai",
"large_files": "File Besar", "large_files": "File Besar",
"last": "Terakhir",
"last_seen": "Terakhir dilihat", "last_seen": "Terakhir dilihat",
"latest_version": "Versi Terkini", "latest_version": "Versi Terkini",
"latitude": "Lintang", "latitude": "Lintang",
@ -1196,6 +1207,7 @@
"library_page_sort_title": "Judul album", "library_page_sort_title": "Judul album",
"licenses": "Lisensi", "licenses": "Lisensi",
"light": "Terang", "light": "Terang",
"like": "Suka",
"like_deleted": "Suka dihapus", "like_deleted": "Suka dihapus",
"link_motion_video": "Tautan video gerak", "link_motion_video": "Tautan video gerak",
"link_to_oauth": "Tautkan ke OAuth", "link_to_oauth": "Tautkan ke OAuth",
@ -1254,6 +1266,7 @@
"main_branch_warning": "Anda menggunakan versi pengembangan; kami sangat menyarankan menggunakan versi rilis!", "main_branch_warning": "Anda menggunakan versi pengembangan; kami sangat menyarankan menggunakan versi rilis!",
"main_menu": "Menu utama", "main_menu": "Menu utama",
"make": "Merek", "make": "Merek",
"manage_geolocation": "Atur lokasi",
"manage_shared_links": "Kelola tautan terbagi", "manage_shared_links": "Kelola tautan terbagi",
"manage_sharing_with_partners": "Kelola pembagian dengan partner", "manage_sharing_with_partners": "Kelola pembagian dengan partner",
"manage_the_app_settings": "Kelola pengaturan aplikasi", "manage_the_app_settings": "Kelola pengaturan aplikasi",
@ -1399,6 +1412,8 @@
"open_the_search_filters": "Buka saringan pencarian", "open_the_search_filters": "Buka saringan pencarian",
"options": "Opsi", "options": "Opsi",
"or": "atau", "or": "atau",
"organize_into_albums": "Atur ke dalam album",
"organize_into_albums_description": "Masukkan foto lama ke album sesuai pengaturan sinkronisasi",
"organize_your_library": "Kelola pustaka Anda", "organize_your_library": "Kelola pustaka Anda",
"original": "asli", "original": "asli",
"other": "Lainnya", "other": "Lainnya",
@ -1458,9 +1473,9 @@
"permission_onboarding_permission_limited": "Izin dibatasi. Agai Immich dapat mencadangkan dan mengatur seluruh koleksi galeri, izinkan akses foto dan video pada Setelan.", "permission_onboarding_permission_limited": "Izin dibatasi. Agai Immich dapat mencadangkan dan mengatur seluruh koleksi galeri, izinkan akses foto dan video pada Setelan.",
"permission_onboarding_request": "Immich memerlukan izin untuk melihat foto dan video kamu.", "permission_onboarding_request": "Immich memerlukan izin untuk melihat foto dan video kamu.",
"person": "Orang", "person": "Orang",
"person_age_months": "{months} bulan", "person_age_months": "{months, plural, one {# bulan} other {# bulan}} old",
"person_age_year_months": "1 tahun, {months} bulan", "person_age_year_months": "1 year, {months, plural, one {# bulan} other {# bulan}} old",
"person_age_years": "{years} tahun", "person_age_years": "{years, plural, other {# tahun}} old",
"person_birthdate": "Lahir pada {date}", "person_birthdate": "Lahir pada {date}",
"person_hidden": "{name}{hidden, select, true { (tersembunyi)} other {}}", "person_hidden": "{name}{hidden, select, true { (tersembunyi)} other {}}",
"photo_shared_all_users": "Sepertinya Anda membagikan foto Anda dengan semua pengguna atau Anda tidak memiliki pengguna siapa pun untuk dibagikan.", "photo_shared_all_users": "Sepertinya Anda membagikan foto Anda dengan semua pengguna atau Anda tidak memiliki pengguna siapa pun untuk dibagikan.",
@ -1500,6 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "Versi app seluler ini sudah kedaluwarsa. Silakan perbarui ke versi minor terbaru.", "profile_drawer_client_out_of_date_minor": "Versi app seluler ini sudah kedaluwarsa. Silakan perbarui ke versi minor terbaru.",
"profile_drawer_client_server_up_to_date": "Klien dan server menjalankan versi terbaru", "profile_drawer_client_server_up_to_date": "Klien dan server menjalankan versi terbaru",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Mode baca-saja aktif. Ketuk dua kali ikon avatar pengguna untuk keluar.",
"profile_drawer_server_out_of_date_major": "Versi server ini telah kedaluwarsa. Silakan perbarui ke versi major terbaru.", "profile_drawer_server_out_of_date_major": "Versi server ini telah kedaluwarsa. Silakan perbarui ke versi major terbaru.",
"profile_drawer_server_out_of_date_minor": "Versi server ini telah kedaluwarsa. Silakan perbarui ke versi minor terbaru.", "profile_drawer_server_out_of_date_minor": "Versi server ini telah kedaluwarsa. Silakan perbarui ke versi minor terbaru.",
"profile_image_of_user": "Foto profil dari {user}", "profile_image_of_user": "Foto profil dari {user}",
@ -1538,6 +1554,7 @@
"purchase_server_description_2": "Status pendukung", "purchase_server_description_2": "Status pendukung",
"purchase_server_title": "Server", "purchase_server_title": "Server",
"purchase_settings_server_activated": "Kunci produk server dikelola oleh admin", "purchase_settings_server_activated": "Kunci produk server dikelola oleh admin",
"query_asset_id": "ID Aset Kueri",
"queue_status": "Antrian {count}/{total}", "queue_status": "Antrian {count}/{total}",
"rating": "Peringkat bintang", "rating": "Peringkat bintang",
"rating_clear": "Hapus peringkat", "rating_clear": "Hapus peringkat",
@ -1545,6 +1562,8 @@
"rating_description": "Tampilkan peringkat EXIF pada panel info", "rating_description": "Tampilkan peringkat EXIF pada panel info",
"reaction_options": "Opsi reaksi", "reaction_options": "Opsi reaksi",
"read_changelog": "Baca Log Perubahan", "read_changelog": "Baca Log Perubahan",
"readonly_mode_disabled": "Mode baca-saja dimatikan",
"readonly_mode_enabled": "Mode baca-saja diaktifkan",
"reassign": "Tetapkan ulang", "reassign": "Tetapkan ulang",
"reassigned_assets_to_existing_person": "Menetapkan ulang {count, plural, one {# aset} other {# aset}} kepada {name, select, null {orang yang sudah ada} other {{name}}}", "reassigned_assets_to_existing_person": "Menetapkan ulang {count, plural, one {# aset} other {# aset}} kepada {name, select, null {orang yang sudah ada} other {{name}}}",
"reassigned_assets_to_new_person": "Menetapkan ulang {count, plural, one {# aset} other {# aset}} kepada orang baru", "reassigned_assets_to_new_person": "Menetapkan ulang {count, plural, one {# aset} other {# aset}} kepada orang baru",
@ -1714,6 +1733,7 @@
"select_user_for_sharing_page_err_album": "Gagal membuat album", "select_user_for_sharing_page_err_album": "Gagal membuat album",
"selected": "Dipilih", "selected": "Dipilih",
"selected_count": "{count, plural, other {# dipilih}}", "selected_count": "{count, plural, other {# dipilih}}",
"selected_gps_coordinates": "Koordinat GPS yang dipilih",
"send_message": "Kirim pesan", "send_message": "Kirim pesan",
"send_welcome_email": "Kirim surel selamat datang", "send_welcome_email": "Kirim surel selamat datang",
"server_endpoint": "Endpoint server", "server_endpoint": "Endpoint server",
@ -1857,6 +1877,7 @@
"sort_created": "Tanggal dibuat", "sort_created": "Tanggal dibuat",
"sort_items": "Jumlah item", "sort_items": "Jumlah item",
"sort_modified": "Tanggal diubah", "sort_modified": "Tanggal diubah",
"sort_newest": "Foto terbaru",
"sort_oldest": "Foto terlawas", "sort_oldest": "Foto terlawas",
"sort_people_by_similarity": "Urutkan orang berdasarkan kemiripan", "sort_people_by_similarity": "Urutkan orang berdasarkan kemiripan",
"sort_recent": "Foto paling terkini", "sort_recent": "Foto paling terkini",
@ -1932,7 +1953,9 @@
"to_change_password": "Ubah kata sandi", "to_change_password": "Ubah kata sandi",
"to_favorite": "Favorit", "to_favorite": "Favorit",
"to_login": "Log masuk", "to_login": "Log masuk",
"to_multi_select": "untuk memilih beberapa",
"to_parent": "Ke induk", "to_parent": "Ke induk",
"to_select": "untuk memilih",
"to_trash": "Sampah", "to_trash": "Sampah",
"toggle_settings": "Saklar pengaturan", "toggle_settings": "Saklar pengaturan",
"total": "Jumlah", "total": "Jumlah",
@ -1982,6 +2005,7 @@
"unstacked_assets_count": "Penumpukan {count, plural, one {# aset} other {# aset}} dibatalkan", "unstacked_assets_count": "Penumpukan {count, plural, one {# aset} other {# aset}} dibatalkan",
"untagged": "Tidak ditandai", "untagged": "Tidak ditandai",
"up_next": "Berikutnya", "up_next": "Berikutnya",
"update_location_action_prompt": "Perbarui lokasi {count} aset yang dipilih dengan:",
"updated_at": "Diperbarui", "updated_at": "Diperbarui",
"updated_password": "Kata sandi diperbarui", "updated_password": "Kata sandi diperbarui",
"upload": "Unggah", "upload": "Unggah",
@ -2048,6 +2072,7 @@
"view_next_asset": "Tampilkan aset berikutnya", "view_next_asset": "Tampilkan aset berikutnya",
"view_previous_asset": "Tampilkan aset sebelumnya", "view_previous_asset": "Tampilkan aset sebelumnya",
"view_qr_code": "Tampilkan kode QR", "view_qr_code": "Tampilkan kode QR",
"view_similar_photos": "Lihat foto yang mirip",
"view_stack": "Tampilkan Tumpukan", "view_stack": "Tampilkan Tumpukan",
"view_user": "Lihat Pengguna", "view_user": "Lihat Pengguna",
"viewer_remove_from_stack": "Keluarkan dari Tumpukan", "viewer_remove_from_stack": "Keluarkan dari Tumpukan",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Gestisci le impostazioni di upload in primo piano e in background", "backup_setting_subtitle": "Gestisci le impostazioni di upload in primo piano e in background",
"backup_settings_subtitle": "Gestisci le impostazioni di caricamento", "backup_settings_subtitle": "Gestisci le impostazioni di caricamento",
"backward": "Indietro", "backward": "Indietro",
"beta_sync": "Status sincronizzazione beta",
"beta_sync_subtitle": "Gestisci il nuovo sistema di sincronizzazione",
"biometric_auth_enabled": "Autenticazione biometrica attivata", "biometric_auth_enabled": "Autenticazione biometrica attivata",
"biometric_locked_out": "Sei stato bloccato dall'autenticazione biometrica", "biometric_locked_out": "Sei stato bloccato dall'autenticazione biometrica",
"biometric_no_options": "Nessuna opzione biometrica disponibile", "biometric_no_options": "Nessuna opzione biometrica disponibile",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast Abilitato", "gcast_enabled": "Google Cast Abilitato",
"gcast_enabled_description": "Questa funzione carica risorse esterne da Google per poter funzionare.", "gcast_enabled_description": "Questa funzione carica risorse esterne da Google per poter funzionare.",
"general": "Generale", "general": "Generale",
"geolocation_instruction_all_have_location": "Tutte le risorse per questa data hanno già dati sulla posizione. Prova a mostrare tutte le risorse o seleziona una data diversa",
"geolocation_instruction_location": "Fai clic su una risorsa con coordinate GPS per utilizzare la sua posizione oppure seleziona una posizione direttamente dalla mappa", "geolocation_instruction_location": "Fai clic su una risorsa con coordinate GPS per utilizzare la sua posizione oppure seleziona una posizione direttamente dalla mappa",
"geolocation_instruction_no_date": "Seleziona una data per gestire i dati sulla posizione per foto e video di quel giorno",
"geolocation_instruction_no_photos": "Nessuna foto o video trovato per questa data. Seleziona una data diversa per visualizzarli",
"get_help": "Chiedi Aiuto", "get_help": "Chiedi Aiuto",
"get_wifiname_error": "Non sono riuscito a recuperare il nome della rete Wi-Fi. Accertati di aver concesso i permessi necessari e di essere connesso ad una rete Wi-Fi", "get_wifiname_error": "Non sono riuscito a recuperare il nome della rete Wi-Fi. Accertati di aver concesso i permessi necessari e di essere connesso ad una rete Wi-Fi",
"getting_started": "Iniziamo", "getting_started": "Iniziamo",
@ -1417,6 +1412,8 @@
"open_the_search_filters": "Apri filtri di ricerca", "open_the_search_filters": "Apri filtri di ricerca",
"options": "Opzioni", "options": "Opzioni",
"or": "o", "or": "o",
"organize_into_albums": "Organizza all'interno degli albums",
"organize_into_albums_description": "Inserisci le foto esistenti all'interno degli albums utilizzando le attuale impostazioni di sincronizzazione",
"organize_your_library": "Organizza la tua libreria", "organize_your_library": "Organizza la tua libreria",
"original": "originale", "original": "originale",
"other": "Altro", "other": "Altro",
@ -1557,6 +1554,7 @@
"purchase_server_description_2": "Stato di Contributore", "purchase_server_description_2": "Stato di Contributore",
"purchase_server_title": "Server", "purchase_server_title": "Server",
"purchase_settings_server_activated": "La chiave del prodotto del server è gestita dall'amministratore", "purchase_settings_server_activated": "La chiave del prodotto del server è gestita dall'amministratore",
"query_asset_id": "Esegui una query sull'ID dell'asset",
"queue_status": "Messi in coda {count}/{total}", "queue_status": "Messi in coda {count}/{total}",
"rating": "Valutazione a stelle", "rating": "Valutazione a stelle",
"rating_clear": "Crea valutazione", "rating_clear": "Crea valutazione",
@ -1642,6 +1640,7 @@
"restore_user": "Ripristina utente", "restore_user": "Ripristina utente",
"restored_asset": "Asset ripristinato", "restored_asset": "Asset ripristinato",
"resume": "Riprendi", "resume": "Riprendi",
"resume_paused_jobs": "Riprendi {count, plural, one {# processo in pausa} other {# i processi in pausa}}",
"retry_upload": "Riprova caricamento", "retry_upload": "Riprova caricamento",
"review_duplicates": "Esamina duplicati", "review_duplicates": "Esamina duplicati",
"review_large_files": "Revisiona file pesanti", "review_large_files": "Revisiona file pesanti",
@ -1735,7 +1734,7 @@
"select_user_for_sharing_page_err_album": "Impossibile nel creare l'album", "select_user_for_sharing_page_err_album": "Impossibile nel creare l'album",
"selected": "Selezionato", "selected": "Selezionato",
"selected_count": "{count, plural, one {# selezionato} other {# selezionati}}", "selected_count": "{count, plural, one {# selezionato} other {# selezionati}}",
"selected_gps_coordinates": "coordinate GPS selezionate", "selected_gps_coordinates": "Coordinate GPS selezionate",
"send_message": "Manda messaggio", "send_message": "Manda messaggio",
"send_welcome_email": "Invia email di benvenuto", "send_welcome_email": "Invia email di benvenuto",
"server_endpoint": "Server endpoint", "server_endpoint": "Server endpoint",
@ -1846,10 +1845,8 @@
"shift_to_permanent_delete": "premi ⇧ per cancellare definitivamente l'asset", "shift_to_permanent_delete": "premi ⇧ per cancellare definitivamente l'asset",
"show_album_options": "Mostra opzioni album", "show_album_options": "Mostra opzioni album",
"show_albums": "Mostra gli album", "show_albums": "Mostra gli album",
"show_all_assets": "Mostra tutte le risorse",
"show_all_people": "Mostra tutte le persone", "show_all_people": "Mostra tutte le persone",
"show_and_hide_people": "Mostra & nascondi persone", "show_and_hide_people": "Mostra & nascondi persone",
"show_assets_without_location": "Mostra risorse senza posizione",
"show_file_location": "Mostra percorso file", "show_file_location": "Mostra percorso file",
"show_gallery": "Mostra galleria", "show_gallery": "Mostra galleria",
"show_hidden_people": "Mostra persone nascoste", "show_hidden_people": "Mostra persone nascoste",
@ -2034,7 +2031,6 @@
"use_biometric": "Usa biometrica", "use_biometric": "Usa biometrica",
"use_current_connection": "usa la connessione attuale", "use_current_connection": "usa la connessione attuale",
"use_custom_date_range": "Altrimenti utilizza un intervallo date personalizzato", "use_custom_date_range": "Altrimenti utilizza un intervallo date personalizzato",
"use_this_location": "Clicca per usare la posizione",
"user": "Utente", "user": "Utente",
"user_has_been_deleted": "L'utente è stato rimosso.", "user_has_been_deleted": "L'utente è stato rimosso.",
"user_id": "ID utente", "user_id": "ID utente",
@ -2077,6 +2073,7 @@
"view_next_asset": "Visualizza risorsa successiva", "view_next_asset": "Visualizza risorsa successiva",
"view_previous_asset": "Visualizza risorsa precedente", "view_previous_asset": "Visualizza risorsa precedente",
"view_qr_code": "Visualizza Codice QR", "view_qr_code": "Visualizza Codice QR",
"view_similar_photos": "Visualizza le foto simili",
"view_stack": "Visualizza Raggruppamento", "view_stack": "Visualizza Raggruppamento",
"view_user": "Visualizza Utente", "view_user": "Visualizza Utente",
"viewer_remove_from_stack": "Rimuovi dalla pila", "viewer_remove_from_stack": "Rimuovi dalla pila",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "アップロードに関する設定", "backup_setting_subtitle": "アップロードに関する設定",
"backup_settings_subtitle": "アップロード設定を管理", "backup_settings_subtitle": "アップロード設定を管理",
"backward": "新しい方へ", "backward": "新しい方へ",
"beta_sync": "同期の状態",
"beta_sync_subtitle": "同期の仕組みを管理",
"biometric_auth_enabled": "生体認証を有効化しました", "biometric_auth_enabled": "生体認証を有効化しました",
"biometric_locked_out": "生体認証により、アクセスできません", "biometric_locked_out": "生体認証により、アクセスできません",
"biometric_no_options": "生体認証を利用できません", "biometric_no_options": "生体認証を利用できません",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "この機能は動作のためにGoogleのリソースを読み込みます。", "gcast_enabled_description": "この機能は動作のためにGoogleのリソースを読み込みます。",
"general": "一般", "general": "一般",
"geolocation_instruction_all_have_location": "この日付のすべての項目に位置情報がすでについています。すべての項目を表示を試みるか別の日付を選択してください",
"geolocation_instruction_location": "位置情報付きの項目をクリックして、その位置情報を利用します。あるいは、地図上の地点を直接選ぶことも可能です", "geolocation_instruction_location": "位置情報付きの項目をクリックして、その位置情報を利用します。あるいは、地図上の地点を直接選ぶことも可能です",
"geolocation_instruction_no_date": "日付を選択して、その日の写真や動画の位置情報を管理しましょう",
"geolocation_instruction_no_photos": "この日付に写真や動画が無いようです。別の日付を選択してみてください",
"get_help": "助けを求める", "get_help": "助けを求める",
"get_wifiname_error": "Wi-Fiの名前(SSID)が入手できませんでした。Wi-Fiに繋がってるのと必要な権限を許可したか確認してください", "get_wifiname_error": "Wi-Fiの名前(SSID)が入手できませんでした。Wi-Fiに繋がってるのと必要な権限を許可したか確認してください",
"getting_started": "はじめる", "getting_started": "はじめる",
@ -1417,6 +1412,8 @@
"open_the_search_filters": "検索フィルタを開く", "open_the_search_filters": "検索フィルタを開く",
"options": "オプション", "options": "オプション",
"or": "または", "or": "または",
"organize_into_albums": "アルバムに追加して整理する",
"organize_into_albums_description": "既存の写真を、現在の同期設定に基づきアルバムに追加する",
"organize_your_library": "ライブラリを整理", "organize_your_library": "ライブラリを整理",
"original": "オリジナル", "original": "オリジナル",
"other": "その他", "other": "その他",
@ -1476,9 +1473,9 @@
"permission_onboarding_permission_limited": "写真へのアクセスが制限されています。Immichが写真のバックアップと管理を行うには、システム設定から写真と動画のアクセス権限を変更してください。", "permission_onboarding_permission_limited": "写真へのアクセスが制限されています。Immichが写真のバックアップと管理を行うには、システム設定から写真と動画のアクセス権限を変更してください。",
"permission_onboarding_request": "Immichは写真へのアクセス許可が必要です", "permission_onboarding_request": "Immichは写真へのアクセス許可が必要です",
"person": "人物", "person": "人物",
"person_age_months": "{months, plural, one {# ヶ月} other {# ヶ月}}", "person_age_months": "生後 {months, plural, one {# ヶ月} other {# ヶ月}}",
"person_age_year_months": "1 , {months, plural, one {# ヶ月} other {# ヶ月}}", "person_age_year_months": "1 歳と, {months, plural, one {# ヶ月} other {# ヶ月}}",
"person_age_years": "{years, plural, other {# 年}}前", "person_age_years": "{years, plural, other {# 歳}}",
"person_birthdate": "{date}生まれ", "person_birthdate": "{date}生まれ",
"person_hidden": "{name}{hidden, select, true { (非表示)} other {}}", "person_hidden": "{name}{hidden, select, true { (非表示)} other {}}",
"photo_shared_all_users": "写真をすべてのユーザーと共有したか、共有するユーザーがいないようです。", "photo_shared_all_users": "写真をすべてのユーザーと共有したか、共有するユーザーがいないようです。",
@ -1557,6 +1554,7 @@
"purchase_server_description_2": "サポーターの状態", "purchase_server_description_2": "サポーターの状態",
"purchase_server_title": "サーバー", "purchase_server_title": "サーバー",
"purchase_settings_server_activated": "サーバーのプロダクトキーは管理者に管理されています", "purchase_settings_server_activated": "サーバーのプロダクトキーは管理者に管理されています",
"query_asset_id": "順番待ちの項目ID",
"queue_status": "順番待ち中 {count}/{total}", "queue_status": "順番待ち中 {count}/{total}",
"rating": "星での評価", "rating": "星での評価",
"rating_clear": "評価を取り消す", "rating_clear": "評価を取り消す",
@ -1846,10 +1844,8 @@
"shift_to_permanent_delete": "⇧を押してアセットを完全に削除", "shift_to_permanent_delete": "⇧を押してアセットを完全に削除",
"show_album_options": "アルバム設定を表示", "show_album_options": "アルバム設定を表示",
"show_albums": "アルバムを表示", "show_albums": "アルバムを表示",
"show_all_assets": "すべての項目を表示",
"show_all_people": "全ての人物を表示", "show_all_people": "全ての人物を表示",
"show_and_hide_people": "人物を表示/非表示", "show_and_hide_people": "人物を表示/非表示",
"show_assets_without_location": "位置情報無しの項目を表示",
"show_file_location": "ファイルの場所を表示", "show_file_location": "ファイルの場所を表示",
"show_gallery": "ギャラリーを表示", "show_gallery": "ギャラリーを表示",
"show_hidden_people": "非表示の人物を表示", "show_hidden_people": "非表示の人物を表示",
@ -2028,13 +2024,12 @@
"upload_success": "アップロード成功、新しくアップロードされたアセットを見るにはページを更新してください。", "upload_success": "アップロード成功、新しくアップロードされたアセットを見るにはページを更新してください。",
"upload_to_immich": "Immichにアップロード ({count})", "upload_to_immich": "Immichにアップロード ({count})",
"uploading": "アップロード中", "uploading": "アップロード中",
"uploading_media": "メディアをアップロード", "uploading_media": "メディアをアップロード",
"url": "URL", "url": "URL",
"usage": "使用容量", "usage": "使用容量",
"use_biometric": "生体認証をご利用ください", "use_biometric": "生体認証をご利用ください",
"use_current_connection": "現在の接続情報を使用", "use_current_connection": "現在の接続情報を使用",
"use_custom_date_range": "代わりにカスタム日付範囲を使用", "use_custom_date_range": "代わりにカスタム日付範囲を使用",
"use_this_location": "クリックして位置情報を使う",
"user": "ユーザー", "user": "ユーザー",
"user_has_been_deleted": "このユーザーは削除されました", "user_has_been_deleted": "このユーザーは削除されました",
"user_id": "ユーザーID", "user_id": "ユーザーID",
@ -2077,6 +2072,7 @@
"view_next_asset": "次のアセットを見る", "view_next_asset": "次のアセットを見る",
"view_previous_asset": "前のアセットを見る", "view_previous_asset": "前のアセットを見る",
"view_qr_code": "QRコードを見る", "view_qr_code": "QRコードを見る",
"view_similar_photos": "類似する写真を見る",
"view_stack": "ビュースタック", "view_stack": "ビュースタック",
"view_user": "ユーザーを見る", "view_user": "ユーザーを見る",
"viewer_remove_from_stack": "スタックから外す", "viewer_remove_from_stack": "スタックから外す",

View file

@ -596,8 +596,6 @@
"backup_setting_subtitle": "백그라운드 및 포그라운드 백업 설정을 관리합니다.", "backup_setting_subtitle": "백그라운드 및 포그라운드 백업 설정을 관리합니다.",
"backup_settings_subtitle": "업로드 설정을 관리합니다.", "backup_settings_subtitle": "업로드 설정을 관리합니다.",
"backward": "뒤로", "backward": "뒤로",
"beta_sync": "동기화 (베타) 상태",
"beta_sync_subtitle": "새 동기화 시스템의 설정을 관리합니다.",
"biometric_auth_enabled": "생체 인증이 활성화되었습니다.", "biometric_auth_enabled": "생체 인증이 활성화되었습니다.",
"biometric_locked_out": "생체 인증이 일시적으로 비활성화되었습니다.", "biometric_locked_out": "생체 인증이 일시적으로 비활성화되었습니다.",
"biometric_no_options": "사용 가능한 생체 인증 옵션 없음", "biometric_no_options": "사용 가능한 생체 인증 옵션 없음",

View file

@ -391,8 +391,6 @@
"backup_options_page_title": "Dublēšanas iestatījumi", "backup_options_page_title": "Dublēšanas iestatījumi",
"backup_settings_subtitle": "Pārvaldīt augšupielādes iestatījumus", "backup_settings_subtitle": "Pārvaldīt augšupielādes iestatījumus",
"backward": "Atpakaļejoši", "backward": "Atpakaļejoši",
"beta_sync": "Beta Sinhronizācijas statuss",
"beta_sync_subtitle": "Pārvaldīt jauno sinhronizācijas sistēmu",
"biometric_auth_enabled": "Ieslēgta biometriskā autentifikācija", "biometric_auth_enabled": "Ieslēgta biometriskā autentifikācija",
"biometric_locked_out": "Biometriskā autentifikācija tev ir bloķēta", "biometric_locked_out": "Biometriskā autentifikācija tev ir bloķēta",
"biometric_no_options": "Nav pieejamas biometriskās autentifikācijas iespējas", "biometric_no_options": "Nav pieejamas biometriskās autentifikācijas iespējas",
@ -1163,7 +1161,7 @@
"select_trash_all": "Atzīmēt visus dzēšanai", "select_trash_all": "Atzīmēt visus dzēšanai",
"select_user_for_sharing_page_err_album": "Neizdevās izveidot albumu", "select_user_for_sharing_page_err_album": "Neizdevās izveidot albumu",
"selected": "Izvēlētie", "selected": "Izvēlētie",
"selected_gps_coordinates": "izvēlētās ģeogrāfiskās koordinātas", "selected_gps_coordinates": "Izvēlētās ģeogrāfiskās koordinātas",
"server_info_box_app_version": "Aplikācijas Versija", "server_info_box_app_version": "Aplikācijas Versija",
"server_info_box_server_url": "Servera URL", "server_info_box_server_url": "Servera URL",
"server_online": "Serveris tiešsaistē", "server_online": "Serveris tiešsaistē",
@ -1190,6 +1188,7 @@
"setting_notifications_total_progress_subtitle": "Kopējais augšupielādes progress (pabeigti/kopējie faili)", "setting_notifications_total_progress_subtitle": "Kopējais augšupielādes progress (pabeigti/kopējie faili)",
"setting_notifications_total_progress_title": "Rādīt fona dublējuma kopējo progresu", "setting_notifications_total_progress_title": "Rādīt fona dublējuma kopējo progresu",
"setting_video_viewer_looping_title": "Cikliski", "setting_video_viewer_looping_title": "Cikliski",
"setting_video_viewer_original_video_subtitle": "Straumējot video no servera, izmantot oriģinālu, pat ja ir pieejama pārkodēšana. Tas var izraisīt buferēšanu. Lokāli pieejamie video tiek atskaņoti oriģinālajā kvalitātē, neatkarīgi no šīs iestatījuma.",
"settings": "Iestatījumi", "settings": "Iestatījumi",
"settings_require_restart": "Lūdzu, restartējiet Immich, lai lietotu šo iestatījumu", "settings_require_restart": "Lūdzu, restartējiet Immich, lai lietotu šo iestatījumu",
"setup_pin_code": "Uzstādīt PIN kodu", "setup_pin_code": "Uzstādīt PIN kodu",
@ -1245,7 +1244,6 @@
"sharing_silver_appbar_share_partner": "Dalīties ar partneri", "sharing_silver_appbar_share_partner": "Dalīties ar partneri",
"show_album_options": "Rādīt albuma iespējas", "show_album_options": "Rādīt albuma iespējas",
"show_albums": "Rādīt albumus", "show_albums": "Rādīt albumus",
"show_all_assets": "Rādīt visus failus",
"show_all_people": "Rādīt visas personas", "show_all_people": "Rādīt visas personas",
"show_and_hide_people": "Rādīt un slēpt personas", "show_and_hide_people": "Rādīt un slēpt personas",
"show_file_location": "Rādīt faila atrašanās vietu", "show_file_location": "Rādīt faila atrašanās vietu",
@ -1404,6 +1402,7 @@
"view_next_asset": "Skatīt nākamo failu", "view_next_asset": "Skatīt nākamo failu",
"view_previous_asset": "Skatīt iepriekšējo failu", "view_previous_asset": "Skatīt iepriekšējo failu",
"view_qr_code": "Skatīt QR kodu", "view_qr_code": "Skatīt QR kodu",
"view_similar_photos": "Skatīt līdzīgas fotogrāfijas",
"view_stack": "Apskatīt kaudzi", "view_stack": "Apskatīt kaudzi",
"view_user": "Apskatīt lietotāju", "view_user": "Apskatīt lietotāju",
"viewer_remove_from_stack": "Noņemt no Steka", "viewer_remove_from_stack": "Noņemt no Steka",

View file

@ -28,6 +28,8 @@
"add_to_album": "संग्रहात टाका", "add_to_album": "संग्रहात टाका",
"add_to_album_bottom_sheet_added": "{album} मध्ये जोडले गेले", "add_to_album_bottom_sheet_added": "{album} मध्ये जोडले गेले",
"add_to_album_bottom_sheet_already_exists": "आधीच {album} मध्ये आहे", "add_to_album_bottom_sheet_already_exists": "आधीच {album} मध्ये आहे",
"add_to_album_toggle": "अल्बमसाठी निवड टॉगल करा",
"add_to_albums": "अल्बममध्ये जोडा",
"add_to_shared_album": "सामायिक संग्रहात टाका", "add_to_shared_album": "सामायिक संग्रहात टाका",
"add_url": "URL प्रविष्ट करा", "add_url": "URL प्रविष्ट करा",
"added_to_archive": "संग्रहित केले", "added_to_archive": "संग्रहित केले",
@ -572,8 +574,6 @@
"backup_setting_subtitle": "बॅकग्राउंड आणि फोरग्राउंड अपलोड सेटिंग्ज व्यवस्थापित करा", "backup_setting_subtitle": "बॅकग्राउंड आणि फोरग्राउंड अपलोड सेटिंग्ज व्यवस्थापित करा",
"backup_settings_subtitle": "अपलोड सेटिंग्ज व्यवस्थापित करा", "backup_settings_subtitle": "अपलोड सेटिंग्ज व्यवस्थापित करा",
"backward": "मागासलेले", "backward": "मागासलेले",
"beta_sync": "बीटा सिंक स्थिती",
"beta_sync_subtitle": "नवीन सिंक प्रणाली व्यवस्थापित करा",
"biometric_auth_enabled": "बायोमेट्रिक प्रमाणीकरण चालू आहे", "biometric_auth_enabled": "बायोमेट्रिक प्रमाणीकरण चालू आहे",
"biometric_locked_out": "आपण बायोमेट्रिक प्रमाणीकरणापासून लॉक आहात", "biometric_locked_out": "आपण बायोमेट्रिक प्रमाणीकरणापासून लॉक आहात",
"biometric_no_options": "कोणतेही बायोमेट्रिक पर्याय उपलब्ध नाहीत", "biometric_no_options": "कोणतेही बायोमेट्रिक पर्याय उपलब्ध नाहीत",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Administrer opplastingsinnstillinger for bakgrunn og forgrunn", "backup_setting_subtitle": "Administrer opplastingsinnstillinger for bakgrunn og forgrunn",
"backup_settings_subtitle": "Håndter opplastingsinnstillinger", "backup_settings_subtitle": "Håndter opplastingsinnstillinger",
"backward": "Bakover", "backward": "Bakover",
"beta_sync": "Beta synkroniseringsstatus",
"beta_sync_subtitle": "Håndter det nye synkroniseringssystemet",
"biometric_auth_enabled": "Biometrisk autentisering aktivert", "biometric_auth_enabled": "Biometrisk autentisering aktivert",
"biometric_locked_out": "Du er låst ute av biometrisk verifisering", "biometric_locked_out": "Du er låst ute av biometrisk verifisering",
"biometric_no_options": "Ingen biometriske valg tilgjengelige", "biometric_no_options": "Ingen biometriske valg tilgjengelige",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Denne funksjonen laster eksterne ressurser fra Google for å fungere.", "gcast_enabled_description": "Denne funksjonen laster eksterne ressurser fra Google for å fungere.",
"general": "Generelt", "general": "Generelt",
"geolocation_instruction_all_have_location": "Alle objekter for denne datoen har allerede lokasjonsdata. Prøv å vise alle objekter eller velg en annen dato",
"geolocation_instruction_location": "Klikk på et objekt med GPS-koordinater for å bruke posisjonen, eller velg en posisjon direkte fra kartet", "geolocation_instruction_location": "Klikk på et objekt med GPS-koordinater for å bruke posisjonen, eller velg en posisjon direkte fra kartet",
"geolocation_instruction_no_date": "Velg en dato for å administrere posisjonsdata for bilder og videoer fra den dagen",
"geolocation_instruction_no_photos": "Ingen bilder eller videoer funnet for denne datoen. Velg en annen dato for å vise dem",
"get_help": "Få Hjelp", "get_help": "Få Hjelp",
"get_wifiname_error": "Kunne ikke hente Wi-Fi-navnet. Sørg for at du har gitt de nødvendige tillatelsene og er koblet til et Wi-Fi-nettverk", "get_wifiname_error": "Kunne ikke hente Wi-Fi-navnet. Sørg for at du har gitt de nødvendige tillatelsene og er koblet til et Wi-Fi-nettverk",
"getting_started": "Kom i gang", "getting_started": "Kom i gang",
@ -1645,6 +1640,7 @@
"restore_user": "Gjenopprett bruker", "restore_user": "Gjenopprett bruker",
"restored_asset": "Gjenopprettet ressurs", "restored_asset": "Gjenopprettet ressurs",
"resume": "Fortsett", "resume": "Fortsett",
"resume_paused_jobs": "Fortsett {count, plural, one {# paused job} other {# paused jobs}}",
"retry_upload": "Prøv opplasting på nytt", "retry_upload": "Prøv opplasting på nytt",
"review_duplicates": "Gjennomgå duplikater", "review_duplicates": "Gjennomgå duplikater",
"review_large_files": "Se gjennom store filer", "review_large_files": "Se gjennom store filer",
@ -1849,10 +1845,8 @@
"shift_to_permanent_delete": "trykk ⇧ for å slette eiendeler permanent", "shift_to_permanent_delete": "trykk ⇧ for å slette eiendeler permanent",
"show_album_options": "Vis albumalternativer", "show_album_options": "Vis albumalternativer",
"show_albums": "Vis album", "show_albums": "Vis album",
"show_all_assets": "Via alle objekter",
"show_all_people": "Vis alle mennesker", "show_all_people": "Vis alle mennesker",
"show_and_hide_people": "Vis og skjul personer", "show_and_hide_people": "Vis og skjul personer",
"show_assets_without_location": "Vis objekter uten lokasjon",
"show_file_location": "Vis filplassering", "show_file_location": "Vis filplassering",
"show_gallery": "Vis galleri", "show_gallery": "Vis galleri",
"show_hidden_people": "Vis skjulte personer", "show_hidden_people": "Vis skjulte personer",
@ -2037,7 +2031,6 @@
"use_biometric": "Bruk biometri", "use_biometric": "Bruk biometri",
"use_current_connection": "bruk nåværende tilkobling", "use_current_connection": "bruk nåværende tilkobling",
"use_custom_date_range": "Bruk egendefinert datoperiode i stedet", "use_custom_date_range": "Bruk egendefinert datoperiode i stedet",
"use_this_location": "Trykk for å bruke lokasjon",
"user": "Bruker", "user": "Bruker",
"user_has_been_deleted": "Denne brukeren har blitt slettet.", "user_has_been_deleted": "Denne brukeren har blitt slettet.",
"user_id": "Bruker ID", "user_id": "Bruker ID",

View file

@ -293,7 +293,7 @@
"theme_settings_description": "Beheer het uiterlijk van de Immich webinterface", "theme_settings_description": "Beheer het uiterlijk van de Immich webinterface",
"thumbnail_generation_job": "Thumbnail genereren", "thumbnail_generation_job": "Thumbnail genereren",
"thumbnail_generation_job_description": "Genereer grote, kleine en vervaagde thumbnails voor ieder item, en genereer thumbnails voor iedere persoon", "thumbnail_generation_job_description": "Genereer grote, kleine en vervaagde thumbnails voor ieder item, en genereer thumbnails voor iedere persoon",
"transcoding_acceleration_api": "Acceleration API", "transcoding_acceleration_api": "Versnelling API",
"transcoding_acceleration_api_description": "De API die met je apparaat zal communiceren om transcodering te versnellen. Deze instelling is 'best effort': wanneer fouten optreden wordt teruggevallen op softwaretranscodering. VP9 kan wel of niet werken, afhankelijk van je hardware.", "transcoding_acceleration_api_description": "De API die met je apparaat zal communiceren om transcodering te versnellen. Deze instelling is 'best effort': wanneer fouten optreden wordt teruggevallen op softwaretranscodering. VP9 kan wel of niet werken, afhankelijk van je hardware.",
"transcoding_acceleration_nvenc": "NVENC (vereist NVIDIA GPU)", "transcoding_acceleration_nvenc": "NVENC (vereist NVIDIA GPU)",
"transcoding_acceleration_qsv": "Quick Sync (vereist 7e generatie Intel CPU of nieuwer)", "transcoding_acceleration_qsv": "Quick Sync (vereist 7e generatie Intel CPU of nieuwer)",
@ -312,7 +312,7 @@
"transcoding_codecs_learn_more": "Om meer te leren over de terminologie die hier wordt gebruikt, bekijk de FFmpeg documentatie voor <h264-link>H.264 codec</h264-link>, <hevc-link>HEVC codec</hevc-link> en <vp9-link>VP9 codec</vp9-link>.", "transcoding_codecs_learn_more": "Om meer te leren over de terminologie die hier wordt gebruikt, bekijk de FFmpeg documentatie voor <h264-link>H.264 codec</h264-link>, <hevc-link>HEVC codec</hevc-link> en <vp9-link>VP9 codec</vp9-link>.",
"transcoding_constant_quality_mode": "Constante kwaliteit modus", "transcoding_constant_quality_mode": "Constante kwaliteit modus",
"transcoding_constant_quality_mode_description": "ICQ is beter dan CQP, maar sommige hardware versnellingsmethodes ondersteunen deze modus niet. Als u deze optie instelt, wordt de voorkeur gegeven aan de opgegeven modus bij gebruik van op kwaliteit gebaseerde encoding. Deze optie wordt genegeerd door NVENC omdat het ICQ niet ondersteunt.", "transcoding_constant_quality_mode_description": "ICQ is beter dan CQP, maar sommige hardware versnellingsmethodes ondersteunen deze modus niet. Als u deze optie instelt, wordt de voorkeur gegeven aan de opgegeven modus bij gebruik van op kwaliteit gebaseerde encoding. Deze optie wordt genegeerd door NVENC omdat het ICQ niet ondersteunt.",
"transcoding_constant_rate_factor": "Constant rate factor (-crf)", "transcoding_constant_rate_factor": "Constant tarief factor (-ctf)",
"transcoding_constant_rate_factor_description": "Niveau voor videokwaliteit. Typische waarden zijn 23 voor H.264, 28 voor HEVC, 31 voor VP9 en 35 voor AV1. Lager is beter, maar produceert grotere bestanden.", "transcoding_constant_rate_factor_description": "Niveau voor videokwaliteit. Typische waarden zijn 23 voor H.264, 28 voor HEVC, 31 voor VP9 en 35 voor AV1. Lager is beter, maar produceert grotere bestanden.",
"transcoding_disabled_description": "Transcodeer geen video's. Het afspelen kan op sommige clients niet meer werken", "transcoding_disabled_description": "Transcodeer geen video's. Het afspelen kan op sommige clients niet meer werken",
"transcoding_encoding_options": "Coderings Opties", "transcoding_encoding_options": "Coderings Opties",
@ -325,7 +325,7 @@
"transcoding_max_b_frames_description": "Hogere waarden verbeteren de compressie efficiëntie, maar vertragen de codering. Is mogelijk niet compatibel met hardwareversnelling op oudere apparaten. 0 schakelt B-frames uit, terwijl -1 deze waarde automatisch instelt.", "transcoding_max_b_frames_description": "Hogere waarden verbeteren de compressie efficiëntie, maar vertragen de codering. Is mogelijk niet compatibel met hardwareversnelling op oudere apparaten. 0 schakelt B-frames uit, terwijl -1 deze waarde automatisch instelt.",
"transcoding_max_bitrate": "Maximum bitrate", "transcoding_max_bitrate": "Maximum bitrate",
"transcoding_max_bitrate_description": "Het instellen van een maximale bitrate kan de bestandsgrootte voorspelbaarder maken, tegen geringe kosten voor de kwaliteit. Bij 720p zijn de typische waarden 2600 kbit/s voor VP9 of HEVC, of 4500 kbit/s voor H.264. Uitgeschakeld indien ingesteld op 0.", "transcoding_max_bitrate_description": "Het instellen van een maximale bitrate kan de bestandsgrootte voorspelbaarder maken, tegen geringe kosten voor de kwaliteit. Bij 720p zijn de typische waarden 2600 kbit/s voor VP9 of HEVC, of 4500 kbit/s voor H.264. Uitgeschakeld indien ingesteld op 0.",
"transcoding_max_keyframe_interval": "Maximum keyframe interval", "transcoding_max_keyframe_interval": "Maximale keyframe interval",
"transcoding_max_keyframe_interval_description": "Stelt de maximale frameafstand tussen keyframes in. Lagere waarden verslechteren de compressie efficiëntie, maar verbeteren de zoektijden en kunnen de kwaliteit verbeteren in scènes met snelle bewegingen. 0 stelt deze waarde automatisch in.", "transcoding_max_keyframe_interval_description": "Stelt de maximale frameafstand tussen keyframes in. Lagere waarden verslechteren de compressie efficiëntie, maar verbeteren de zoektijden en kunnen de kwaliteit verbeteren in scènes met snelle bewegingen. 0 stelt deze waarde automatisch in.",
"transcoding_optimal_description": "Video's met een hogere resolutie dan de doelresolutie of niet in een geaccepteerd formaat", "transcoding_optimal_description": "Video's met een hogere resolutie dan de doelresolutie of niet in een geaccepteerd formaat",
"transcoding_policy": "Transcode beleid", "transcoding_policy": "Transcode beleid",
@ -341,7 +341,7 @@
"transcoding_settings_description": "Beheer welke videos worden getranscodeerd en hoe ze worden verwerkt", "transcoding_settings_description": "Beheer welke videos worden getranscodeerd en hoe ze worden verwerkt",
"transcoding_target_resolution": "Target resolutie", "transcoding_target_resolution": "Target resolutie",
"transcoding_target_resolution_description": "Hogere resoluties kunnen meer details behouden, maar het coderen ervan duurt langer, de bestandsgrootte is groter en de app reageert mogelijk minder snel.", "transcoding_target_resolution_description": "Hogere resoluties kunnen meer details behouden, maar het coderen ervan duurt langer, de bestandsgrootte is groter en de app reageert mogelijk minder snel.",
"transcoding_temporal_aq": "Temporal AQ", "transcoding_temporal_aq": "Tijdelijke AQ",
"transcoding_temporal_aq_description": "Alleen van toepassing op NVENC. Verhoogt de kwaliteit van scènes met veel details en weinig beweging. Is mogelijk niet compatibel met oudere apparaten.", "transcoding_temporal_aq_description": "Alleen van toepassing op NVENC. Verhoogt de kwaliteit van scènes met veel details en weinig beweging. Is mogelijk niet compatibel met oudere apparaten.",
"transcoding_threads": "Threads", "transcoding_threads": "Threads",
"transcoding_threads_description": "Hogere waarden leiden tot snellere codering, maar laten minder ruimte over voor de server om andere taken te verwerken terwijl deze actief is. Deze waarde mag niet groter zijn dan het aantal CPU cores. Maximaliseert het gebruik als deze is ingesteld op 0.", "transcoding_threads_description": "Hogere waarden leiden tot snellere codering, maar laten minder ruimte over voor de server om andere taken te verwerken terwijl deze actief is. Deze waarde mag niet groter zijn dan het aantal CPU cores. Maximaliseert het gebruik als deze is ingesteld op 0.",
@ -597,8 +597,6 @@
"backup_setting_subtitle": "Beheer achtergrond en voorgrond uploadinstellingen", "backup_setting_subtitle": "Beheer achtergrond en voorgrond uploadinstellingen",
"backup_settings_subtitle": "Beheer upload instellingen", "backup_settings_subtitle": "Beheer upload instellingen",
"backward": "Achteruit", "backward": "Achteruit",
"beta_sync": "Beta Sync Status",
"beta_sync_subtitle": "Beheer het nieuwe synchronisatiesysteem",
"biometric_auth_enabled": "Biometrische authenticatie ingeschakeld", "biometric_auth_enabled": "Biometrische authenticatie ingeschakeld",
"biometric_locked_out": "Biometrische authenticatie is vergrendeld", "biometric_locked_out": "Biometrische authenticatie is vergrendeld",
"biometric_no_options": "Geen biometrische opties beschikbaar", "biometric_no_options": "Geen biometrische opties beschikbaar",
@ -837,7 +835,7 @@
"download_sucess_android": "Het bestand is gedownload naar DCIM/Immich", "download_sucess_android": "Het bestand is gedownload naar DCIM/Immich",
"download_waiting_to_retry": "Wachten om opnieuw te proberen", "download_waiting_to_retry": "Wachten om opnieuw te proberen",
"downloading": "Downloaden", "downloading": "Downloaden",
"downloading_asset_filename": "Item {filename} downloaden...", "downloading_asset_filename": "Downloading asset {filename}",
"downloading_media": "Media aan het downloaden", "downloading_media": "Media aan het downloaden",
"drop_files_to_upload": "Zet bestanden ergens neer om ze te uploaden", "drop_files_to_upload": "Zet bestanden ergens neer om ze te uploaden",
"duplicates": "Duplicaten", "duplicates": "Duplicaten",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Deze functie gebruikt externe bronnen van Google om te kunnen werken.", "gcast_enabled_description": "Deze functie gebruikt externe bronnen van Google om te kunnen werken.",
"general": "Algemeen", "general": "Algemeen",
"geolocation_instruction_all_have_location": "Alle items voor deze datum hebben al locatiegegevens. Probeer alle items te tonen of selecteer een andere datum",
"geolocation_instruction_location": "Klik op een item met GPS coördinaten om de locatie te gebruiken, of selecteer een locatie direct vanaf de kaart", "geolocation_instruction_location": "Klik op een item met GPS coördinaten om de locatie te gebruiken, of selecteer een locatie direct vanaf de kaart",
"geolocation_instruction_no_date": "Selecteer een datum om locatiegegevens te beheren voor foto's en video's van die dag",
"geolocation_instruction_no_photos": "Geen foto's of video's gevonden voor deze datum. Selecteer een andere datum om ze te tonen",
"get_help": "Krijg hulp", "get_help": "Krijg hulp",
"get_wifiname_error": "Kon de WiFi-naam niet ophalen. Zorg ervoor dat je de benodigde machtigingen hebt verleend en verbonden bent met een WiFi-netwerk", "get_wifiname_error": "Kon de WiFi-naam niet ophalen. Zorg ervoor dat je de benodigde machtigingen hebt verleend en verbonden bent met een WiFi-netwerk",
"getting_started": "Aan de slag", "getting_started": "Aan de slag",
@ -1417,6 +1412,8 @@
"open_the_search_filters": "Open de zoekfilters", "open_the_search_filters": "Open de zoekfilters",
"options": "Opties", "options": "Opties",
"or": "of", "or": "of",
"organize_into_albums": "Organiseren in albums",
"organize_into_albums_description": "Bestaande foto's in albums plaatsen met de huidige synchronisatie-instellingen",
"organize_your_library": "Organiseer je bibliotheek", "organize_your_library": "Organiseer je bibliotheek",
"original": "origineel", "original": "origineel",
"other": "Overige", "other": "Overige",
@ -1513,7 +1510,7 @@
"primary": "Primair", "primary": "Primair",
"privacy": "Privacy", "privacy": "Privacy",
"profile": "Profiel", "profile": "Profiel",
"profile_drawer_app_logs": "Logboek", "profile_drawer_app_logs": "Logs",
"profile_drawer_client_out_of_date_major": "Mobiele app is verouderd. Werk bij naar de nieuwste hoofdversie.", "profile_drawer_client_out_of_date_major": "Mobiele app is verouderd. Werk bij naar de nieuwste hoofdversie.",
"profile_drawer_client_out_of_date_minor": "Mobiele app is verouderd. Werk bij naar de nieuwste subversie.", "profile_drawer_client_out_of_date_minor": "Mobiele app is verouderd. Werk bij naar de nieuwste subversie.",
"profile_drawer_client_server_up_to_date": "App en server zijn up-to-date", "profile_drawer_client_server_up_to_date": "App en server zijn up-to-date",
@ -1525,7 +1522,7 @@
"profile_picture_set": "Profielfoto ingesteld.", "profile_picture_set": "Profielfoto ingesteld.",
"public_album": "Openbaar album", "public_album": "Openbaar album",
"public_share": "Openbare deellink", "public_share": "Openbare deellink",
"purchase_account_info": "Supporter", "purchase_account_info": "Ondersteuner",
"purchase_activated_subtitle": "Bedankt voor het ondersteunen van Immich en open-source software", "purchase_activated_subtitle": "Bedankt voor het ondersteunen van Immich en open-source software",
"purchase_activated_time": "Geactiveerd op {date}", "purchase_activated_time": "Geactiveerd op {date}",
"purchase_activated_title": "Je licentiesleutel is succesvol geactiveerd", "purchase_activated_title": "Je licentiesleutel is succesvol geactiveerd",
@ -1557,6 +1554,7 @@
"purchase_server_description_2": "Supporterstatus", "purchase_server_description_2": "Supporterstatus",
"purchase_server_title": "Server", "purchase_server_title": "Server",
"purchase_settings_server_activated": "De licentiesleutel van de server wordt beheerd door de beheerder", "purchase_settings_server_activated": "De licentiesleutel van de server wordt beheerd door de beheerder",
"query_asset_id": "Query Asset ID",
"queue_status": "Wachtrij {count}/{total}", "queue_status": "Wachtrij {count}/{total}",
"rating": "Sterwaardering", "rating": "Sterwaardering",
"rating_clear": "Waardering verwijderen", "rating_clear": "Waardering verwijderen",
@ -1695,7 +1693,7 @@
"search_page_motion_photos": "Bewegende foto's", "search_page_motion_photos": "Bewegende foto's",
"search_page_no_objects": "Geen objectgegevens beschikbaar", "search_page_no_objects": "Geen objectgegevens beschikbaar",
"search_page_no_places": "Geen locatiegegevens beschikbaar", "search_page_no_places": "Geen locatiegegevens beschikbaar",
"search_page_screenshots": "Screenshots", "search_page_screenshots": "Schermafbeelding",
"search_page_search_photos_videos": "Zoek naar je foto's en video's", "search_page_search_photos_videos": "Zoek naar je foto's en video's",
"search_page_selfies": "Selfies", "search_page_selfies": "Selfies",
"search_page_things": "Dingen", "search_page_things": "Dingen",
@ -1735,7 +1733,7 @@
"select_user_for_sharing_page_err_album": "Album aanmaken mislukt", "select_user_for_sharing_page_err_album": "Album aanmaken mislukt",
"selected": "Geselecteerd", "selected": "Geselecteerd",
"selected_count": "{count, plural, other {# geselecteerd}}", "selected_count": "{count, plural, other {# geselecteerd}}",
"selected_gps_coordinates": "geselecteerde GPS coördinaten", "selected_gps_coordinates": "Geselecteerde GPS Coördinaten",
"send_message": "Bericht versturen", "send_message": "Bericht versturen",
"send_welcome_email": "Stuur welkomstmail", "send_welcome_email": "Stuur welkomstmail",
"server_endpoint": "Server-URL", "server_endpoint": "Server-URL",
@ -1846,10 +1844,8 @@
"shift_to_permanent_delete": "druk op ⇧ om items permanent te verwijderen", "shift_to_permanent_delete": "druk op ⇧ om items permanent te verwijderen",
"show_album_options": "Toon albumopties", "show_album_options": "Toon albumopties",
"show_albums": "Toon albums", "show_albums": "Toon albums",
"show_all_assets": "Toon alle items",
"show_all_people": "Toon alle mensen", "show_all_people": "Toon alle mensen",
"show_and_hide_people": "Toon & verberg mensen", "show_and_hide_people": "Toon & verberg mensen",
"show_assets_without_location": "Toon items zonder locatie",
"show_file_location": "Toon bestandslocatie", "show_file_location": "Toon bestandslocatie",
"show_gallery": "Toon galerij", "show_gallery": "Toon galerij",
"show_hidden_people": "Verbogen mensen weergeven", "show_hidden_people": "Verbogen mensen weergeven",
@ -2034,7 +2030,6 @@
"use_biometric": "Gebruik biometrische authenticatie", "use_biometric": "Gebruik biometrische authenticatie",
"use_current_connection": "gebruik huidige verbinding", "use_current_connection": "gebruik huidige verbinding",
"use_custom_date_range": "Gebruik in plaats daarvan een aangepast datumbereik", "use_custom_date_range": "Gebruik in plaats daarvan een aangepast datumbereik",
"use_this_location": "Klik om locatie te gebruiken",
"user": "Gebruiker", "user": "Gebruiker",
"user_has_been_deleted": "Deze gebruiker is verwijderd.", "user_has_been_deleted": "Deze gebruiker is verwijderd.",
"user_id": "Gebruikers ID", "user_id": "Gebruikers ID",
@ -2077,6 +2072,7 @@
"view_next_asset": "Bekijk volgende item", "view_next_asset": "Bekijk volgende item",
"view_previous_asset": "Bekijk vorige item", "view_previous_asset": "Bekijk vorige item",
"view_qr_code": "QR-code bekijken", "view_qr_code": "QR-code bekijken",
"view_similar_photos": "Bekijk vergelijkbare foto's",
"view_stack": "Bekijk stapel", "view_stack": "Bekijk stapel",
"view_user": "Bekijk gebruiker", "view_user": "Bekijk gebruiker",
"viewer_remove_from_stack": "Verwijder van Stapel", "viewer_remove_from_stack": "Verwijder van Stapel",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Zarządzaj ustawieniami przesyłania w tle i na pierwszym planie", "backup_setting_subtitle": "Zarządzaj ustawieniami przesyłania w tle i na pierwszym planie",
"backup_settings_subtitle": "Zarządzanie ustawieniami przesyłania", "backup_settings_subtitle": "Zarządzanie ustawieniami przesyłania",
"backward": "Do tyłu", "backward": "Do tyłu",
"beta_sync": "Status synchronizacji w wersji Beta",
"beta_sync_subtitle": "Zarządzaj nowym systemem synchronizacji",
"biometric_auth_enabled": "Włączono logowanie biometryczne", "biometric_auth_enabled": "Włączono logowanie biometryczne",
"biometric_locked_out": "Uwierzytelnianie biometryczne jest dla Ciebie zablokowane", "biometric_locked_out": "Uwierzytelnianie biometryczne jest dla Ciebie zablokowane",
"biometric_no_options": "Brak możliwości biometrii", "biometric_no_options": "Brak możliwości biometrii",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Ta funkcja , aby działać, ładuje zewnętrzne zasoby z Google.", "gcast_enabled_description": "Ta funkcja , aby działać, ładuje zewnętrzne zasoby z Google.",
"general": "Ogólne", "general": "Ogólne",
"geolocation_instruction_all_have_location": "Wszystkie zasoby z tego dnia mają już dane o lokalizacji. Spróbuj wyświetlić wszystkie zasoby lub wybierz inną datę",
"geolocation_instruction_location": "Kliknij na zasób z współrzędnymi GPS, aby użyć jego lokalizacji, lub wybierz lokalizację bezpośrednio z mapy", "geolocation_instruction_location": "Kliknij na zasób z współrzędnymi GPS, aby użyć jego lokalizacji, lub wybierz lokalizację bezpośrednio z mapy",
"geolocation_instruction_no_date": "Wybierz datę, aby zarządzać danymi o lokalizacji dla zdjęć i filmów z tego dnia",
"geolocation_instruction_no_photos": "Nie znaleziono żadnych zdjęć ani filmów dla tej daty. Wybierz inną datę, aby je wyświetlić",
"get_help": "Pomoc", "get_help": "Pomoc",
"get_wifiname_error": "Nie można uzyskać nazwy Wi-Fi. Upewnij się, że udzieliłeś niezbędnych uprawnień i jesteś połączony z siecią Wi-Fi", "get_wifiname_error": "Nie można uzyskać nazwy Wi-Fi. Upewnij się, że udzieliłeś niezbędnych uprawnień i jesteś połączony z siecią Wi-Fi",
"getting_started": "Pierwsze kroki", "getting_started": "Pierwsze kroki",
@ -1417,6 +1412,8 @@
"open_the_search_filters": "Otwórz filtry wyszukiwania", "open_the_search_filters": "Otwórz filtry wyszukiwania",
"options": "Opcje", "options": "Opcje",
"or": "lub", "or": "lub",
"organize_into_albums": "Uporządkuj w albumy",
"organize_into_albums_description": "Umieść istniejące zdjęcia w albumach przy użyciu bieżących ustawień synchronizacji",
"organize_your_library": "Organizuj swoją bibliotekę", "organize_your_library": "Organizuj swoją bibliotekę",
"original": "oryginalny", "original": "oryginalny",
"other": "Inne", "other": "Inne",
@ -1518,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "Aplikacja mobilna jest nieaktualna. Zaktualizuj do najnowszej pomniejszej wersji.", "profile_drawer_client_out_of_date_minor": "Aplikacja mobilna jest nieaktualna. Zaktualizuj do najnowszej pomniejszej wersji.",
"profile_drawer_client_server_up_to_date": "Klient i serwer są aktualne", "profile_drawer_client_server_up_to_date": "Klient i serwer są aktualne",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Włączono tryb tylko do odczytu. Aby wyjść, należy dwukrotnie dotknąć ikony awatara użytkownika.", "profile_drawer_readonly_mode": "Włączono tryb tylko do odczytu. Aby wyjść, naciśnij i przytrzymaj ikonę awatara użytkownika.",
"profile_drawer_server_out_of_date_major": "Serwer jest nieaktualny. Zaktualizuj do najnowszej głównej wersji.", "profile_drawer_server_out_of_date_major": "Serwer jest nieaktualny. Zaktualizuj do najnowszej głównej wersji.",
"profile_drawer_server_out_of_date_minor": "Serwer jest nieaktualny. Zaktualizuj do najnowszej pomniejszej wersji.", "profile_drawer_server_out_of_date_minor": "Serwer jest nieaktualny. Zaktualizuj do najnowszej pomniejszej wersji.",
"profile_image_of_user": "Zdjęcie profilowe {user}", "profile_image_of_user": "Zdjęcie profilowe {user}",
@ -1557,6 +1554,7 @@
"purchase_server_description_2": "Status wspierającego", "purchase_server_description_2": "Status wspierającego",
"purchase_server_title": "Serwer", "purchase_server_title": "Serwer",
"purchase_settings_server_activated": "Klucz produktu serwera jest zarządzany przez administratora", "purchase_settings_server_activated": "Klucz produktu serwera jest zarządzany przez administratora",
"query_asset_id": "Zapytanie o ID zasobu",
"queue_status": "Kolejkowanie {count}/{total}", "queue_status": "Kolejkowanie {count}/{total}",
"rating": "Ocena gwiazdkowa", "rating": "Ocena gwiazdkowa",
"rating_clear": "Wyczyść ocenę", "rating_clear": "Wyczyść ocenę",
@ -1642,6 +1640,7 @@
"restore_user": "Przywróć użytkownika", "restore_user": "Przywróć użytkownika",
"restored_asset": "Przywrócony zasób", "restored_asset": "Przywrócony zasób",
"resume": "Wznów", "resume": "Wznów",
"resume_paused_jobs": "Wznów {count, plural, one {# wstrzymane zadanie} few {# wstrzymane zadania} other {# wstrzymanych zadań}}",
"retry_upload": "Prześlij ponownie", "retry_upload": "Prześlij ponownie",
"review_duplicates": "Przejrzyj duplikaty", "review_duplicates": "Przejrzyj duplikaty",
"review_large_files": "Przejrzyj duże pliki", "review_large_files": "Przejrzyj duże pliki",
@ -1735,7 +1734,7 @@
"select_user_for_sharing_page_err_album": "Nie udało się utworzyć albumu", "select_user_for_sharing_page_err_album": "Nie udało się utworzyć albumu",
"selected": "Zaznaczone", "selected": "Zaznaczone",
"selected_count": "{count, plural, other {# wybrane}}", "selected_count": "{count, plural, other {# wybrane}}",
"selected_gps_coordinates": "wybrane współrzędne GPS", "selected_gps_coordinates": "Wybrane Współrzędne GPS",
"send_message": "Wyślij wiadomość", "send_message": "Wyślij wiadomość",
"send_welcome_email": "Wyślij e-mail powitalny", "send_welcome_email": "Wyślij e-mail powitalny",
"server_endpoint": "Punkt końcowy serwera", "server_endpoint": "Punkt końcowy serwera",
@ -1846,10 +1845,8 @@
"shift_to_permanent_delete": "naciśnij ⇧, aby trwale usunąć zasób", "shift_to_permanent_delete": "naciśnij ⇧, aby trwale usunąć zasób",
"show_album_options": "Pokaż opcje albumu", "show_album_options": "Pokaż opcje albumu",
"show_albums": "Pokaż albumy", "show_albums": "Pokaż albumy",
"show_all_assets": "Pokaż wszystkie zasoby",
"show_all_people": "Pokaż wszystkie osoby", "show_all_people": "Pokaż wszystkie osoby",
"show_and_hide_people": "Pokaż lub ukryj osoby", "show_and_hide_people": "Pokaż lub ukryj osoby",
"show_assets_without_location": "Pokaż zasoby bez lokalizacji",
"show_file_location": "Pokaż ścieżkę pliku", "show_file_location": "Pokaż ścieżkę pliku",
"show_gallery": "Wyświetl galerię", "show_gallery": "Wyświetl galerię",
"show_hidden_people": "Pokaż ukryte osoby", "show_hidden_people": "Pokaż ukryte osoby",
@ -1920,6 +1917,8 @@
"sync_albums_manual_subtitle": "Zsynchronizuj wszystkie przesłane filmy i zdjęcia z wybranymi albumami z włączoną kopią zapasową", "sync_albums_manual_subtitle": "Zsynchronizuj wszystkie przesłane filmy i zdjęcia z wybranymi albumami z włączoną kopią zapasową",
"sync_local": "Synchronizacja lokalna", "sync_local": "Synchronizacja lokalna",
"sync_remote": "Synchronizacja zdalna", "sync_remote": "Synchronizacja zdalna",
"sync_status": "Stan synchronizacji",
"sync_status_subtitle": "Wyświetl i zarządzaj systemem synchronizacji",
"sync_upload_album_setting_subtitle": "Twórz i przesyłaj swoje zdjęcia i filmy do wybranych albumów w Immich", "sync_upload_album_setting_subtitle": "Twórz i przesyłaj swoje zdjęcia i filmy do wybranych albumów w Immich",
"tag": "Etykieta", "tag": "Etykieta",
"tag_assets": "Ustaw etykiety zasobów", "tag_assets": "Ustaw etykiety zasobów",
@ -1979,6 +1978,7 @@
"trash_page_select_assets_btn": "Wybierz zasoby", "trash_page_select_assets_btn": "Wybierz zasoby",
"trash_page_title": "Kosz ({count})", "trash_page_title": "Kosz ({count})",
"trashed_items_will_be_permanently_deleted_after": "Wyrzucone zasoby zostaną trwale usunięte po {days, plural, one {jednym dniu} other {# dniach}}.", "trashed_items_will_be_permanently_deleted_after": "Wyrzucone zasoby zostaną trwale usunięte po {days, plural, one {jednym dniu} other {# dniach}}.",
"troubleshoot": "Rozwiąż problemy",
"type": "Typ", "type": "Typ",
"unable_to_change_pin_code": "Nie można zmienić kodu PIN", "unable_to_change_pin_code": "Nie można zmienić kodu PIN",
"unable_to_setup_pin_code": "Nie można ustawić kodu PIN", "unable_to_setup_pin_code": "Nie można ustawić kodu PIN",
@ -2034,7 +2034,6 @@
"use_biometric": "Użyj biometrii", "use_biometric": "Użyj biometrii",
"use_current_connection": "użyj bieżącego połączenia", "use_current_connection": "użyj bieżącego połączenia",
"use_custom_date_range": "Zamiast tego użyj niestandardowego zakresu dat", "use_custom_date_range": "Zamiast tego użyj niestandardowego zakresu dat",
"use_this_location": "Kliknij, aby użyć lokalizacji",
"user": "Użytkownik", "user": "Użytkownik",
"user_has_been_deleted": "Ten użytkownik został usunięty.", "user_has_been_deleted": "Ten użytkownik został usunięty.",
"user_id": "ID użytkownika", "user_id": "ID użytkownika",
@ -2077,6 +2076,7 @@
"view_next_asset": "Wyświetl następny zasób", "view_next_asset": "Wyświetl następny zasób",
"view_previous_asset": "Wyświetl poprzedni zasób", "view_previous_asset": "Wyświetl poprzedni zasób",
"view_qr_code": "Pokaż kod QR", "view_qr_code": "Pokaż kod QR",
"view_similar_photos": "Zobacz podobne zdjęcia",
"view_stack": "Zobacz Ułożenie", "view_stack": "Zobacz Ułożenie",
"view_user": "Wyświetl użytkownika", "view_user": "Wyświetl użytkownika",
"viewer_remove_from_stack": "Usuń ze stosu", "viewer_remove_from_stack": "Usuń ze stosu",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Gerenciar as configurações de envio em primeiro e segundo plano", "backup_setting_subtitle": "Gerenciar as configurações de envio em primeiro e segundo plano",
"backup_settings_subtitle": "Gerir definições de carregamento", "backup_settings_subtitle": "Gerir definições de carregamento",
"backward": "Para trás", "backward": "Para trás",
"beta_sync": "Estado de Sincronização Beta",
"beta_sync_subtitle": "Gerir o novo sistema de sincronização",
"biometric_auth_enabled": "Autenticação biométrica ativada", "biometric_auth_enabled": "Autenticação biométrica ativada",
"biometric_locked_out": "Está impedido de utilizar a autenticação biométrica", "biometric_locked_out": "Está impedido de utilizar a autenticação biométrica",
"biometric_no_options": "Sem opções biométricas disponíveis", "biometric_no_options": "Sem opções biométricas disponíveis",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Esta funcionalidade requer o carregamento de recursos externos da Google para poder funcionar.", "gcast_enabled_description": "Esta funcionalidade requer o carregamento de recursos externos da Google para poder funcionar.",
"general": "Geral", "general": "Geral",
"geolocation_instruction_all_have_location": "Todos os activos desta data já possuem dados de localização. Tente exibir todos os ativos ou seleccione uma data diferente",
"geolocation_instruction_location": "Clique num ativo com coordenadas GPS para usar a sua localização ou seleccione um local diretamente do mapa", "geolocation_instruction_location": "Clique num ativo com coordenadas GPS para usar a sua localização ou seleccione um local diretamente do mapa",
"geolocation_instruction_no_date": "Seleccione uma data para gerir os dados de localização de fotos e vídeos daquele dia",
"geolocation_instruction_no_photos": "Nenhuma foto ou vídeo encontrado para esta data. Seleccione uma data diferente para exibi-los",
"get_help": "Obter Ajuda", "get_help": "Obter Ajuda",
"get_wifiname_error": "Não foi possível obter o nome do Wi-Fi. Verifique se concedeu as permissões necessárias e se está conectado a uma rede Wi-Fi", "get_wifiname_error": "Não foi possível obter o nome do Wi-Fi. Verifique se concedeu as permissões necessárias e se está conectado a uma rede Wi-Fi",
"getting_started": "Primeiros Passos", "getting_started": "Primeiros Passos",
@ -1846,10 +1841,8 @@
"shift_to_permanent_delete": "Pressione ⇧ para eliminar o ficheiro permanentemente", "shift_to_permanent_delete": "Pressione ⇧ para eliminar o ficheiro permanentemente",
"show_album_options": "Exibir opções do álbum", "show_album_options": "Exibir opções do álbum",
"show_albums": "Mostrar álbuns", "show_albums": "Mostrar álbuns",
"show_all_assets": "Mostrar todos os recursos",
"show_all_people": "Mostrar todas as pessoas", "show_all_people": "Mostrar todas as pessoas",
"show_and_hide_people": "Mostrar & ocultar pessoas", "show_and_hide_people": "Mostrar & ocultar pessoas",
"show_assets_without_location": "Mostrar recursos sem localização",
"show_file_location": "Exibir localização do ficheiro", "show_file_location": "Exibir localização do ficheiro",
"show_gallery": "Exibir galeria", "show_gallery": "Exibir galeria",
"show_hidden_people": "Exibir pessoas ocultadas", "show_hidden_people": "Exibir pessoas ocultadas",
@ -2034,7 +2027,6 @@
"use_biometric": "Utilizar dados biométricos", "use_biometric": "Utilizar dados biométricos",
"use_current_connection": "usar conexão atual", "use_current_connection": "usar conexão atual",
"use_custom_date_range": "Utilizar um intervalo de datas personalizado", "use_custom_date_range": "Utilizar um intervalo de datas personalizado",
"use_this_location": "Clique para usar a localização",
"user": "Utilizador", "user": "Utilizador",
"user_has_been_deleted": "Este utilizador for eliminado.", "user_has_been_deleted": "Este utilizador for eliminado.",
"user_id": "ID do utilizador", "user_id": "ID do utilizador",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Gerenciar as configurações de envio em primeiro e segundo plano", "backup_setting_subtitle": "Gerenciar as configurações de envio em primeiro e segundo plano",
"backup_settings_subtitle": "Gerenciar configurações de envio", "backup_settings_subtitle": "Gerenciar configurações de envio",
"backward": "Para trás", "backward": "Para trás",
"beta_sync": "Status da sincronização Beta",
"beta_sync_subtitle": "Configurar o novo sistema de sincronização",
"biometric_auth_enabled": "Autenticação por biometria ativada", "biometric_auth_enabled": "Autenticação por biometria ativada",
"biometric_locked_out": "Sua autenticação por biometria está bloqueada", "biometric_locked_out": "Sua autenticação por biometria está bloqueada",
"biometric_no_options": "Não há opções de biometria disponíveis", "biometric_no_options": "Não há opções de biometria disponíveis",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Esta funcionalidade carrega recursos externos do Google para funcionar.", "gcast_enabled_description": "Esta funcionalidade carrega recursos externos do Google para funcionar.",
"general": "Geral", "general": "Geral",
"geolocation_instruction_all_have_location": "Todos arquivos nesta data já possuem dados de localização. Tente exibir todos os arquivos ou selecione uma data diferente",
"geolocation_instruction_location": "Selecione um arquivo com as coordenadas de GPS desejada, ou selecione a localização diretamente no mapa", "geolocation_instruction_location": "Selecione um arquivo com as coordenadas de GPS desejada, ou selecione a localização diretamente no mapa",
"geolocation_instruction_no_date": "Selecione uma data para gerenciar os dados de localização das fotos e vídeos daquele dia",
"geolocation_instruction_no_photos": "Nenhuma foto ou vídeo encontrado nesta data. Selecione uma data diferente para ser exibida",
"get_help": "Obter Ajuda", "get_help": "Obter Ajuda",
"get_wifiname_error": "Não foi possível obter o nome do Wi-Fi. Verifique se concedeu as permissões necessárias e se está conectado a uma rede Wi-Fi", "get_wifiname_error": "Não foi possível obter o nome do Wi-Fi. Verifique se concedeu as permissões necessárias e se está conectado a uma rede Wi-Fi",
"getting_started": "Primeiros passos", "getting_started": "Primeiros passos",
@ -1417,6 +1412,8 @@
"open_the_search_filters": "Abre os filtros de pesquisa", "open_the_search_filters": "Abre os filtros de pesquisa",
"options": "Opções", "options": "Opções",
"or": "ou", "or": "ou",
"organize_into_albums": "Organizar em álbuns",
"organize_into_albums_description": "Colocar imagens existentes em álbuns usando as configurações de sincronização atuais",
"organize_your_library": "Organize sua biblioteca", "organize_your_library": "Organize sua biblioteca",
"original": "original", "original": "original",
"other": "Outro", "other": "Outro",
@ -1557,6 +1554,7 @@
"purchase_server_description_2": "Status de Contribuidor", "purchase_server_description_2": "Status de Contribuidor",
"purchase_server_title": "Servidor", "purchase_server_title": "Servidor",
"purchase_settings_server_activated": "A chave do produto para servidor é gerenciada pelo administrador", "purchase_settings_server_activated": "A chave do produto para servidor é gerenciada pelo administrador",
"query_asset_id": "Consultar ID do Ativo",
"queue_status": "Na fila {count} de {total}", "queue_status": "Na fila {count} de {total}",
"rating": "Estrelas", "rating": "Estrelas",
"rating_clear": "Limpar classificação", "rating_clear": "Limpar classificação",
@ -1735,7 +1733,7 @@
"select_user_for_sharing_page_err_album": "Falha ao criar álbum", "select_user_for_sharing_page_err_album": "Falha ao criar álbum",
"selected": "Selecionados", "selected": "Selecionados",
"selected_count": "{count, plural, one {# selecionado} other {# selecionados}}", "selected_count": "{count, plural, one {# selecionado} other {# selecionados}}",
"selected_gps_coordinates": "selecione as coordenadas de GPS", "selected_gps_coordinates": "Coordenadas de GPS Selecionada",
"send_message": "Enviar mensagem", "send_message": "Enviar mensagem",
"send_welcome_email": "Enviar E-mail de boas vindas", "send_welcome_email": "Enviar E-mail de boas vindas",
"server_endpoint": "URL do servidor", "server_endpoint": "URL do servidor",
@ -1846,10 +1844,8 @@
"shift_to_permanent_delete": "pressione ⇧ para excluir permanentemente o arquivo", "shift_to_permanent_delete": "pressione ⇧ para excluir permanentemente o arquivo",
"show_album_options": "Exibir opções do álbum", "show_album_options": "Exibir opções do álbum",
"show_albums": "Exibir álbuns", "show_albums": "Exibir álbuns",
"show_all_assets": "Ver todos arquivos",
"show_all_people": "Mostrar todas as pessoas", "show_all_people": "Mostrar todas as pessoas",
"show_and_hide_people": "Mostrar & ocultar pessoas", "show_and_hide_people": "Mostrar & ocultar pessoas",
"show_assets_without_location": "Ver arquivos sem localização",
"show_file_location": "Exibir local do arquivo", "show_file_location": "Exibir local do arquivo",
"show_gallery": "Exibir galeria", "show_gallery": "Exibir galeria",
"show_hidden_people": "Exibir pessoas ocultadas", "show_hidden_people": "Exibir pessoas ocultadas",
@ -2034,7 +2030,6 @@
"use_biometric": "Usar biometria", "use_biometric": "Usar biometria",
"use_current_connection": "usar conexão atual", "use_current_connection": "usar conexão atual",
"use_custom_date_range": "Usar intervalo de datas personalizado", "use_custom_date_range": "Usar intervalo de datas personalizado",
"use_this_location": "Clique para marcar o local",
"user": "Usuário", "user": "Usuário",
"user_has_been_deleted": "Este usuário foi excluído.", "user_has_been_deleted": "Este usuário foi excluído.",
"user_id": "ID do usuário", "user_id": "ID do usuário",
@ -2077,6 +2072,7 @@
"view_next_asset": "Ver próximo arquivo", "view_next_asset": "Ver próximo arquivo",
"view_previous_asset": "Ver arquivo anterior", "view_previous_asset": "Ver arquivo anterior",
"view_qr_code": "Ver QR Code", "view_qr_code": "Ver QR Code",
"view_similar_photos": "Ver fotos similares",
"view_stack": "Ver grupo", "view_stack": "Ver grupo",
"view_user": "Visualizar usuário", "view_user": "Visualizar usuário",
"viewer_remove_from_stack": "Remover do grupo", "viewer_remove_from_stack": "Remover do grupo",

View file

@ -595,8 +595,6 @@
"backup_setting_subtitle": "Schimbă opțiuni pentru backup în prim-plan și în fundal", "backup_setting_subtitle": "Schimbă opțiuni pentru backup în prim-plan și în fundal",
"backup_settings_subtitle": "Gestionați setările de încărcare", "backup_settings_subtitle": "Gestionați setările de încărcare",
"backward": "În sens invers", "backward": "În sens invers",
"beta_sync": "Starea sincronizării Beta",
"beta_sync_subtitle": "Gestionați noul sistem de sincronizare",
"biometric_auth_enabled": "Autentificare biometrică activată", "biometric_auth_enabled": "Autentificare biometrică activată",
"biometric_locked_out": "Sunteți blocați de la autentificare biometrică", "biometric_locked_out": "Sunteți blocați de la autentificare biometrică",
"biometric_no_options": "Nu sunt disponibile opțiuni biometrice", "biometric_no_options": "Nu sunt disponibile opțiuni biometrice",

View file

@ -35,7 +35,7 @@
"add_url": "Добавить URL", "add_url": "Добавить URL",
"added_to_archive": "Добавлено в архив", "added_to_archive": "Добавлено в архив",
"added_to_favorites": "Добавлено в избранное", "added_to_favorites": "Добавлено в избранное",
"added_to_favorites_count": "Добавлено{count, number} в избранное", "added_to_favorites_count": "{count, plural, one {# объект добавлен} many {# объектов добавлено} other {# объекта добавлено}} в избранное",
"admin": { "admin": {
"add_exclusion_pattern_description": "Добавьте шаблоны исключений. Поддерживаются символы подстановки *, ** и ?. Чтобы игнорировать все файлы в любом каталоге с именем \"Raw\", укажите \"**/Raw/**\". Чтобы игнорировать все файлы, заканчивающиеся на \".tif\", используйте \"**/*.tif\". Чтобы игнорировать путь целиком, укажите \"/path/to/ignore/**\".", "add_exclusion_pattern_description": "Добавьте шаблоны исключений. Поддерживаются символы подстановки *, ** и ?. Чтобы игнорировать все файлы в любом каталоге с именем \"Raw\", укажите \"**/Raw/**\". Чтобы игнорировать все файлы, заканчивающиеся на \".tif\", используйте \"**/*.tif\". Чтобы игнорировать путь целиком, укажите \"/path/to/ignore/**\".",
"admin_user": "Администратор", "admin_user": "Администратор",
@ -409,7 +409,7 @@
"age_year_months": "1 год {months, plural, one {# месяц} many {# месяцев} other {# месяца}}", "age_year_months": "1 год {months, plural, one {# месяц} many {# месяцев} other {# месяца}}",
"age_years": "{years, plural, one {# год} many {# лет} other {# года}}", "age_years": "{years, plural, one {# год} many {# лет} other {# года}}",
"album_added": "Альбом добавлен", "album_added": "Альбом добавлен",
"album_added_notification_setting_description": "Получать уведомление по электронной почте, когда вы добавлены к общему альбому", "album_added_notification_setting_description": "Получать уведомление по электронной почте, когда вам предоставили доступ в общий альбом",
"album_cover_updated": "Обложка альбома обновлена", "album_cover_updated": "Обложка альбома обновлена",
"album_delete_confirmation": "Вы уверены, что хотите удалить альбом {album}?", "album_delete_confirmation": "Вы уверены, что хотите удалить альбом {album}?",
"album_delete_confirmation_description": "Если альбом был общим, другие пользователи больше не смогут получить к нему доступ.", "album_delete_confirmation_description": "Если альбом был общим, другие пользователи больше не смогут получить к нему доступ.",
@ -426,7 +426,7 @@
"album_search_not_found": "Не найдено альбомов по вашему запросу", "album_search_not_found": "Не найдено альбомов по вашему запросу",
"album_share_no_users": "Нет доступных пользователей, с которыми можно поделиться альбомом.", "album_share_no_users": "Нет доступных пользователей, с которыми можно поделиться альбомом.",
"album_updated": "Альбом обновлён", "album_updated": "Альбом обновлён",
"album_updated_setting_description": "Получать уведомление по электронной почте при добавлении новых ресурсов в общий альбом", "album_updated_setting_description": "Получать уведомление по электронной почте при добавлении новых объектов в общий альбом",
"album_user_left": "Вы покинули {album}", "album_user_left": "Вы покинули {album}",
"album_user_removed": "Пользователь {user} удален", "album_user_removed": "Пользователь {user} удален",
"album_viewer_appbar_delete_confirm": "Вы уверены, что хотите удалить альбом из своей учетной записи?", "album_viewer_appbar_delete_confirm": "Вы уверены, что хотите удалить альбом из своей учетной записи?",
@ -448,7 +448,7 @@
"all_albums": "Все альбомы", "all_albums": "Все альбомы",
"all_people": "Все люди", "all_people": "Все люди",
"all_videos": "Все видео", "all_videos": "Все видео",
"allow_dark_mode": "Разрешить темный режим", "allow_dark_mode": "Разрешить тёмный режим",
"allow_edits": "Разрешить редактирование", "allow_edits": "Разрешить редактирование",
"allow_public_user_to_download": "Разрешить скачивание", "allow_public_user_to_download": "Разрешить скачивание",
"allow_public_user_to_upload": "Разрешить добавление файлов", "allow_public_user_to_upload": "Разрешить добавление файлов",
@ -544,7 +544,7 @@
"backup_background_service_current_upload_notification": "Загружается {filename}", "backup_background_service_current_upload_notification": "Загружается {filename}",
"backup_background_service_default_notification": "Поиск новых объектов…", "backup_background_service_default_notification": "Поиск новых объектов…",
"backup_background_service_error_title": "Ошибка резервного копирования", "backup_background_service_error_title": "Ошибка резервного копирования",
"backup_background_service_in_progress_notification": "Резервное копирование ваших объектов…", "backup_background_service_in_progress_notification": "Резервное копирование объектов…",
"backup_background_service_upload_failure_notification": "Ошибка загрузки {filename}", "backup_background_service_upload_failure_notification": "Ошибка загрузки {filename}",
"backup_controller_page_albums": "Резервное копирование альбомов", "backup_controller_page_albums": "Резервное копирование альбомов",
"backup_controller_page_background_app_refresh_disabled_content": "Включите фоновое обновление приложения в Настройки > Общие > Фоновое обновление приложений, чтобы использовать фоновое резервное копирование.", "backup_controller_page_background_app_refresh_disabled_content": "Включите фоновое обновление приложения в Настройки > Общие > Фоновое обновление приложений, чтобы использовать фоновое резервное копирование.",
@ -597,8 +597,6 @@
"backup_setting_subtitle": "Настройка активного и фонового резервного копирования", "backup_setting_subtitle": "Настройка активного и фонового резервного копирования",
"backup_settings_subtitle": "Настройка загрузки объектов", "backup_settings_subtitle": "Настройка загрузки объектов",
"backward": "Назад", "backward": "Назад",
"beta_sync": "Статус синхронизации",
"beta_sync_subtitle": "Управление новой системой синхронизации",
"biometric_auth_enabled": "Биометрическая аутентификация включена", "biometric_auth_enabled": "Биометрическая аутентификация включена",
"biometric_locked_out": "Вам закрыт доступ к биометрической аутентификации", "biometric_locked_out": "Вам закрыт доступ к биометрической аутентификации",
"biometric_no_options": "Биометрическая аутентификация недоступна", "biometric_no_options": "Биометрическая аутентификация недоступна",
@ -637,8 +635,8 @@
"cannot_merge_people": "Невозможно объединить людей", "cannot_merge_people": "Невозможно объединить людей",
"cannot_undo_this_action": "Это действие нельзя отменить!", "cannot_undo_this_action": "Это действие нельзя отменить!",
"cannot_update_the_description": "Невозможно обновить описание", "cannot_update_the_description": "Невозможно обновить описание",
"cast": "Транслировать", "cast": "Трансляция",
"cast_description": "Настройка доступных целей трансляции", "cast_description": "Выбор доступных способов для трансляции",
"change_date": "Изменить дату", "change_date": "Изменить дату",
"change_description": "Изменить описание", "change_description": "Изменить описание",
"change_display_order": "Изменить порядок отображения", "change_display_order": "Изменить порядок отображения",
@ -827,7 +825,7 @@
"download_failed": "Загрузка не удалась", "download_failed": "Загрузка не удалась",
"download_finished": "Загрузка окончена", "download_finished": "Загрузка окончена",
"download_include_embedded_motion_videos": "Встроенные видео", "download_include_embedded_motion_videos": "Встроенные видео",
"download_include_embedded_motion_videos_description": "Включить видео, встроенные в живые фото, в виде отдельного файла", "download_include_embedded_motion_videos_description": "Сохранять видео, встроенные в живые фото, в виде отдельных файлов",
"download_notfound": "Загрузка не найдена", "download_notfound": "Загрузка не найдена",
"download_paused": "Загрузка приостановлена", "download_paused": "Загрузка приостановлена",
"download_settings": "Скачивание", "download_settings": "Скачивание",
@ -1070,16 +1068,13 @@
"folder": "Папка", "folder": "Папка",
"folder_not_found": "Папка не найдена", "folder_not_found": "Папка не найдена",
"folders": "Папки", "folders": "Папки",
"folders_feature_description": "Просмотр папок с фотографиями и видео в файловой системе", "folders_feature_description": "Просмотр папок с фото и видео в файловой системе",
"forgot_pin_code_question": "Забыли PIN-код?", "forgot_pin_code_question": "Забыли PIN-код?",
"forward": "Вперёд", "forward": "Вперёд",
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Этот функционал требует загрузки внешних ресурсов с серверов Google.", "gcast_enabled_description": "Для работы требуется загрузка внешних ресурсов с серверов Google.",
"general": "Общие", "general": "Общие",
"geolocation_instruction_all_have_location": "Все объекты в этом периоде уже содержат данные о местоположении. Включите отображение всех объектов или укажите другой период.",
"geolocation_instruction_location": "Выберите объект с имеющимися координатами, чтобы использовать их, либо вручную укажите место на карте", "geolocation_instruction_location": "Выберите объект с имеющимися координатами, чтобы использовать их, либо вручную укажите место на карте",
"geolocation_instruction_no_date": "Укажите дату для управления координатами мест съёмки за этот день",
"geolocation_instruction_no_photos": "Не найдено объектов в этом периоде. Укажите другую дату.",
"get_help": "Получить помощь", "get_help": "Получить помощь",
"get_wifiname_error": "Не удалось получить имя Wi-Fi сети. Убедитесь, что вы подключены к сети и предоставили приложению необходимые разрешения", "get_wifiname_error": "Не удалось получить имя Wi-Fi сети. Убедитесь, что вы подключены к сети и предоставили приложению необходимые разрешения",
"getting_started": "Старт", "getting_started": "Старт",
@ -1117,14 +1112,14 @@
"home_page_add_to_album_conflicts": "Добавлено {added} медиа в альбом {album}. {failed} медиа уже в альбоме.", "home_page_add_to_album_conflicts": "Добавлено {added} медиа в альбом {album}. {failed} медиа уже в альбоме.",
"home_page_add_to_album_err_local": "Пока нельзя добавлять локальные объекты в альбомы, пропуск", "home_page_add_to_album_err_local": "Пока нельзя добавлять локальные объекты в альбомы, пропуск",
"home_page_add_to_album_success": "Добавлено {added} медиа в альбом {album}.", "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_local": "Пока нельзя добавить локальные файлы в архив, пропуск",
"home_page_archive_err_partner": "Невозможно архивировать медиа партнера, пропуск", "home_page_archive_err_partner": "Невозможно добавить объекты партнёра в архив, пропуск",
"home_page_building_timeline": "Построение хронологии", "home_page_building_timeline": "Построение хронологии",
"home_page_delete_err_partner": "Невозможно удалить медиа партнера, пропуск", "home_page_delete_err_partner": "Невозможно удалить объекты партнёра, пропуск",
"home_page_delete_remote_err_local": "Невозможно удалить локальные файлы с сервера, пропуск", "home_page_delete_remote_err_local": "Невозможно удалить локальные файлы с сервера, пропуск",
"home_page_favorite_err_local": "Пока нельзя добавить в избранное локальные файлы, пропуск", "home_page_favorite_err_local": "Пока нельзя добавить в избранное локальные файлы, пропуск",
"home_page_favorite_err_partner": "Пока нельзя добавить в избранное медиа партнера, пропуск", "home_page_favorite_err_partner": "Невозможно добавить объекты партнёра в избранное, пропуск",
"home_page_first_time_notice": "Перед началом использования приложения выберите альбом с объектами для резервного копирования, чтобы они отобразились на временной шкале", "home_page_first_time_notice": "Перед началом использования приложения выберите альбом с объектами для резервного копирования, чтобы они отобразились на временной шкале",
"home_page_locked_error_local": "Невозможно переместить локальные объекты в личную папку, пропуск", "home_page_locked_error_local": "Невозможно переместить локальные объекты в личную папку, пропуск",
"home_page_locked_error_partner": "Невозможно переместить объекты партнёра в личную папку, пропуск", "home_page_locked_error_partner": "Невозможно переместить объекты партнёра в личную папку, пропуск",
@ -1159,8 +1154,8 @@
"in_albums": "В {count, plural, one {# альбоме} other {# альбомах}}", "in_albums": "В {count, plural, one {# альбоме} other {# альбомах}}",
"in_archive": "В архиве", "in_archive": "В архиве",
"include_archived": "Отображать архив", "include_archived": "Отображать архив",
"include_shared_albums": "Включать общие альбомы", "include_shared_albums": "Включать объекты общих альбомов",
"include_shared_partner_assets": "Включать общие ресурсы партнера", "include_shared_partner_assets": "Включать объекты партнёров",
"individual_share": "Индивидуальная подборка", "individual_share": "Индивидуальная подборка",
"individual_shares": "Подборки", "individual_shares": "Подборки",
"info": "Информация", "info": "Информация",
@ -1221,7 +1216,7 @@
"loading": "Загрузка", "loading": "Загрузка",
"loading_search_results_failed": "Загрузка результатов поиска не удалась", "loading_search_results_failed": "Загрузка результатов поиска не удалась",
"local": "На устройстве", "local": "На устройстве",
"local_asset_cast_failed": "Невозможно транслировать объект, который ещё не загружен на сервер", "local_asset_cast_failed": "Невозможна трансляция объектов, которые ещё не загружены на сервер",
"local_assets": "Объекты на устройстве", "local_assets": "Объекты на устройстве",
"local_network": "Локальная сеть", "local_network": "Локальная сеть",
"local_network_sheet_info": "Приложение будет подключаться к серверу по этому адресу, когда устройство подключено к выбранной Wi-Fi сети", "local_network_sheet_info": "Приложение будет подключаться к серверу по этому адресу, когда устройство подключено к выбранной Wi-Fi сети",
@ -1273,7 +1268,7 @@
"make": "Производитель", "make": "Производитель",
"manage_geolocation": "Управление местами съёмки", "manage_geolocation": "Управление местами съёмки",
"manage_shared_links": "Управление публичными ссылками", "manage_shared_links": "Управление публичными ссылками",
"manage_sharing_with_partners": "Управление обменом информацией с партнерами. Эта функция позволяет вашему партнеру видеть ваши фотографии и видеозаписи, кроме тех, которые находятся в Архиве и Корзине", "manage_sharing_with_partners": "Функция совместного доступа к фото и видео, позволяющая видеть все объекты партнёров, а также предоставлять доступ к своим",
"manage_the_app_settings": "Управление настройками приложения", "manage_the_app_settings": "Управление настройками приложения",
"manage_your_account": "Управление учётной записью", "manage_your_account": "Управление учётной записью",
"manage_your_api_keys": "Управление API ключами для взаимодействия с другими программами", "manage_your_api_keys": "Управление API ключами для взаимодействия с другими программами",
@ -1372,7 +1367,7 @@
"no_duplicates_found": "Дубликатов не обнаружено.", "no_duplicates_found": "Дубликатов не обнаружено.",
"no_exif_info_available": "Нет доступной информации exif", "no_exif_info_available": "Нет доступной информации exif",
"no_explore_results_message": "Загружайте больше фотографий, чтобы наслаждаться вашей коллекцией.", "no_explore_results_message": "Загружайте больше фотографий, чтобы наслаждаться вашей коллекцией.",
"no_favorites_message": "Добавляйте в избранное, чтобы быстро найти свои лучшие фотографии и видео", "no_favorites_message": "Добавляйте объекты в избранное, чтобы быстрее находить свои лучшие фото и видео",
"no_libraries_message": "Создайте внешнюю библиотеку для просмотра в Immich сторонних фотографий и видео", "no_libraries_message": "Создайте внешнюю библиотеку для просмотра в Immich сторонних фотографий и видео",
"no_locked_photos_message": "Фото и видео, перемещенные в личную папку, скрыты и не отображаются при просмотре библиотеки.", "no_locked_photos_message": "Фото и видео, перемещенные в личную папку, скрыты и не отображаются при просмотре библиотеки.",
"no_name": "Нет имени", "no_name": "Нет имени",
@ -1427,18 +1422,18 @@
"other_variables": "Другие переменные", "other_variables": "Другие переменные",
"owned": "Мои", "owned": "Мои",
"owner": "Владелец", "owner": "Владелец",
"partner": "Партнер", "partner": "Партнёр",
"partner_can_access": "{partner} имеет доступ", "partner_can_access": "Пользователю {partner} доступны",
"partner_can_access_assets": "Все ваши фотографии и видеозаписи, кроме тех, которые находятся в Архиве и Корзине", "partner_can_access_assets": "Все ваши фото и видео, кроме тех, что находятся в архиве и корзине",
"partner_can_access_location": "Местоположение, где были сделаны ваши фотографии", "partner_can_access_location": "Места, где были сделаны ваши фото и видео",
"partner_list_user_photos": "Фотографии пользователя {user}", "partner_list_user_photos": "Фото и видео пользователя {user}",
"partner_list_view_all": "Посмотреть все", "partner_list_view_all": "Посмотреть все",
"partner_page_empty_message": "У вашего партнёра еще нет доступа к вашим фото.", "partner_page_empty_message": "Вы пока никому из партнёров не предоставили доступ к своим фото и видео.",
"partner_page_no_more_users": "Выбраны все доступные пользователи", "partner_page_no_more_users": "Выбраны все доступные пользователи",
"partner_page_partner_add_failed": "Не удалось добавить партнёра", "partner_page_partner_add_failed": "Не удалось добавить партнёра",
"partner_page_select_partner": "Выбрать партнёра", "partner_page_select_partner": "Выбрать партнёра",
"partner_page_shared_to_title": "Поделиться с...", "partner_page_shared_to_title": "Поделиться с...",
"partner_page_stop_sharing_content": "Пользователь {partner} больше не сможет получить доступ к вашим фото.", "partner_page_stop_sharing_content": "Пользователь {partner} больше не будет иметь доступ к вашим фото и видео.",
"partner_sharing": "Совместное использование", "partner_sharing": "Совместное использование",
"partners": "Партнёры", "partners": "Партнёры",
"password": "Пароль", "password": "Пароль",
@ -1458,7 +1453,7 @@
"pending": "Ожидает", "pending": "Ожидает",
"people": "Люди", "people": "Люди",
"people_edits_count": "{count, plural, one {Изменён # человек} many {Изменено # человек} other {Изменено # человека}}", "people_edits_count": "{count, plural, one {Изменён # человек} many {Изменено # человек} other {Изменено # человека}}",
"people_feature_description": "Просмотр фотографий и видео, сгруппированных по людям", "people_feature_description": "Просмотр фото и видео, сгруппированных по людям",
"people_sidebar_description": "Отображать пункт меню \"Люди\" в боковой панели", "people_sidebar_description": "Отображать пункт меню \"Люди\" в боковой панели",
"permanent_deletion_warning": "Предупреждение об удалении", "permanent_deletion_warning": "Предупреждение об удалении",
"permanent_deletion_warning_setting_description": "Предупреждать перед безвозвратным удалением объектов", "permanent_deletion_warning_setting_description": "Предупреждать перед безвозвратным удалением объектов",
@ -1520,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "Версия мобильного приложения устарела. Пожалуйста, обновите его.", "profile_drawer_client_out_of_date_minor": "Версия мобильного приложения устарела. Пожалуйста, обновите его.",
"profile_drawer_client_server_up_to_date": "Клиент и сервер обновлены", "profile_drawer_client_server_up_to_date": "Клиент и сервер обновлены",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Включён режим «только просмотр». Дважды коснитесь значка аватара пользователя, чтобы выйти.", "profile_drawer_readonly_mode": "Включён режим «только просмотр». Удерживайте значок аватара пользователя для отключения.",
"profile_drawer_server_out_of_date_major": "Версия сервера устарела. Пожалуйста, обновите его.", "profile_drawer_server_out_of_date_major": "Версия сервера устарела. Пожалуйста, обновите его.",
"profile_drawer_server_out_of_date_minor": "Версия сервера устарела. Пожалуйста, обновите его.", "profile_drawer_server_out_of_date_minor": "Версия сервера устарела. Пожалуйста, обновите его.",
"profile_image_of_user": "Изображение профиля {user}", "profile_image_of_user": "Изображение профиля {user}",
@ -1561,10 +1556,10 @@
"purchase_settings_server_activated": "Ключом продукта управляет администратор сервера", "purchase_settings_server_activated": "Ключом продукта управляет администратор сервера",
"query_asset_id": "Идентификатор исходного объекта", "query_asset_id": "Идентификатор исходного объекта",
"queue_status": "В очереди {count}/{total}", "queue_status": "В очереди {count}/{total}",
"rating": "Рейтинг звёзд", "rating": "Рейтинг",
"rating_clear": "Очистить рейтинг", "rating_clear": "Очистить рейтинг",
"rating_count": "{count, plural, one {# звезда} many {# звезд} other {# звезды}}", "rating_count": "{count, plural, one {# звезда} many {# звезд} other {# звезды}}",
"rating_description": "Показывать рейтинг в панели информации", "rating_description": "Система оценки объектов в панели информации",
"reaction_options": "Опции реакций", "reaction_options": "Опции реакций",
"read_changelog": "Прочитать список изменений", "read_changelog": "Прочитать список изменений",
"readonly_mode_disabled": "Режим «только просмотр» отключён", "readonly_mode_disabled": "Режим «только просмотр» отключён",
@ -1645,6 +1640,7 @@
"restore_user": "Восстановить пользователя", "restore_user": "Восстановить пользователя",
"restored_asset": "Восстановленный объект", "restored_asset": "Восстановленный объект",
"resume": "Продолжить", "resume": "Продолжить",
"resume_paused_jobs": "Возобновить выполнение {count, plural, one {# задачи} other {# задач}}",
"retry_upload": "Повторить загрузку", "retry_upload": "Повторить загрузку",
"review_duplicates": "Разбор дубликатов", "review_duplicates": "Разбор дубликатов",
"review_large_files": "Обзор больших файлов", "review_large_files": "Обзор больших файлов",
@ -1800,7 +1796,7 @@
"shared_by": "Поделился", "shared_by": "Поделился",
"shared_by_user": "Владелец: {user}", "shared_by_user": "Владелец: {user}",
"shared_by_you": "Вы поделились", "shared_by_you": "Вы поделились",
"shared_from_partner": "Фото от {partner}", "shared_from_partner": "Пользователь {partner} предоставил вам доступ",
"shared_intent_upload_button_progress_text": "{current} / {total} Загружено", "shared_intent_upload_button_progress_text": "{current} / {total} Загружено",
"shared_link_app_bar_title": "Публичные ссылки", "shared_link_app_bar_title": "Публичные ссылки",
"shared_link_clipboard_copied_massage": "Скопировано в буфер обмена", "shared_link_clipboard_copied_massage": "Скопировано в буфер обмена",
@ -1837,7 +1833,7 @@
"shared_links_description": "Делитесь фотографиями и видео по ссылке", "shared_links_description": "Делитесь фотографиями и видео по ссылке",
"shared_photos_and_videos_count": "{assetCount, plural, other {# фото и видео.}}", "shared_photos_and_videos_count": "{assetCount, plural, other {# фото и видео.}}",
"shared_with_me": "Доступные мне", "shared_with_me": "Доступные мне",
"shared_with_partner": "Совместно с {partner}", "shared_with_partner": "Вы предоставили доступ пользователю {partner}",
"sharing": "Общие", "sharing": "Общие",
"sharing_enter_password": "Пожалуйста, введите пароль для просмотра этой страницы.", "sharing_enter_password": "Пожалуйста, введите пароль для просмотра этой страницы.",
"sharing_page_album": "Общие альбомы", "sharing_page_album": "Общие альбомы",
@ -1849,15 +1845,13 @@
"shift_to_permanent_delete": "нажмите ⇧ чтобы удалить объект навсегда", "shift_to_permanent_delete": "нажмите ⇧ чтобы удалить объект навсегда",
"show_album_options": "Показать параметры альбома", "show_album_options": "Показать параметры альбома",
"show_albums": "Показать альбомы", "show_albums": "Показать альбомы",
"show_all_assets": "Показать все объекты",
"show_all_people": "Показать всех людей", "show_all_people": "Показать всех людей",
"show_and_hide_people": "Показать и скрыть людей", "show_and_hide_people": "Показать и скрыть людей",
"show_assets_without_location": "Показать объекты без координат",
"show_file_location": "Показать расположение файла", "show_file_location": "Показать расположение файла",
"show_gallery": "Показать галерею", "show_gallery": "Показать галерею",
"show_hidden_people": "Показать скрытых людей", "show_hidden_people": "Показать скрытых людей",
"show_in_timeline": "Показать на временной шкале", "show_in_timeline": "Показать на временной шкале",
"show_in_timeline_setting_description": "Показывайте фото и видео этого пользователя в своей ленте", "show_in_timeline_setting_description": "Отображать фото и видео этого пользователя на своей временной шкале",
"show_keyboard_shortcuts": "Показать сочетания клавиш", "show_keyboard_shortcuts": "Показать сочетания клавиш",
"show_metadata": "Показывать метаданные", "show_metadata": "Показывать метаданные",
"show_or_hide_info": "Показать или скрыть информацию", "show_or_hide_info": "Показать или скрыть информацию",
@ -1871,7 +1865,7 @@
"show_supporter_badge_description": "Показать значок поддержки", "show_supporter_badge_description": "Показать значок поддержки",
"shuffle": "Перемешать", "shuffle": "Перемешать",
"sidebar": "Боковая панель", "sidebar": "Боковая панель",
"sidebar_display_description": "Показывать ссылку на представление в боковой панели", "sidebar_display_description": "Отображать раздел на боковой панели",
"sign_out": "Выход", "sign_out": "Выход",
"sign_up": "Зарегистрироваться", "sign_up": "Зарегистрироваться",
"size": "Размер", "size": "Размер",
@ -1903,9 +1897,9 @@
"status": "Состояние", "status": "Состояние",
"stop_casting": "Остановить трансляцию", "stop_casting": "Остановить трансляцию",
"stop_motion_photo": "Покадровая анимация", "stop_motion_photo": "Покадровая анимация",
"stop_photo_sharing": "Закрыть доступ партнёра к вашим фото?", "stop_photo_sharing": "Закрыть доступ партнёру?",
"stop_photo_sharing_description": "{partner} больше не сможет получить доступ к вашим фотографиям.", "stop_photo_sharing_description": "Пользователь {partner} больше не имеет доступа к вашим фотографиям.",
"stop_sharing_photos_with_user": "Прекратить делиться своими фотографиями с этим пользователем", "stop_sharing_photos_with_user": "Прекратить делиться своими фото и видео с этим пользователем",
"storage": "Хранилище", "storage": "Хранилище",
"storage_label": "Метка хранилища", "storage_label": "Метка хранилища",
"storage_quota": "Квота хранилища", "storage_quota": "Квота хранилища",
@ -1923,6 +1917,8 @@
"sync_albums_manual_subtitle": "Синхронизировать все загруженные фото и видео в выбранные альбомы для резервного копирования", "sync_albums_manual_subtitle": "Синхронизировать все загруженные фото и видео в выбранные альбомы для резервного копирования",
"sync_local": "Синхронизировать локально", "sync_local": "Синхронизировать локально",
"sync_remote": "Синхронизация с сервером", "sync_remote": "Синхронизация с сервером",
"sync_status": "Статус синхронизации",
"sync_status_subtitle": "Просмотр и управление системой синхронизации",
"sync_upload_album_setting_subtitle": "Создавайте и загружайте свои фотографии и видео в выбранные альбомы на сервер Immich", "sync_upload_album_setting_subtitle": "Создавайте и загружайте свои фотографии и видео в выбранные альбомы на сервер Immich",
"tag": "Тег", "tag": "Тег",
"tag_assets": "Добавить теги", "tag_assets": "Добавить теги",
@ -1937,7 +1933,7 @@
"template": "Шаблон", "template": "Шаблон",
"theme": "Тема", "theme": "Тема",
"theme_selection": "Выбор темы", "theme_selection": "Выбор темы",
"theme_selection_description": "Автоматически устанавливать тему в зависимости от системных настроек вашего браузера", "theme_selection_description": "Автоматически устанавливать светлую или тёмную тему в зависимости от настроек вашего браузера",
"theme_setting_asset_list_storage_indicator_title": "Показать индикатор хранилища на плитках объектов", "theme_setting_asset_list_storage_indicator_title": "Показать индикатор хранилища на плитках объектов",
"theme_setting_asset_list_tiles_per_row_title": "Количество объектов в строке ({count})", "theme_setting_asset_list_tiles_per_row_title": "Количество объектов в строке ({count})",
"theme_setting_colorful_interface_subtitle": "Добавить оттенок к фону.", "theme_setting_colorful_interface_subtitle": "Добавить оттенок к фону.",
@ -1982,6 +1978,7 @@
"trash_page_select_assets_btn": "Выбранные объекты", "trash_page_select_assets_btn": "Выбранные объекты",
"trash_page_title": "Корзина ({count})", "trash_page_title": "Корзина ({count})",
"trashed_items_will_be_permanently_deleted_after": "Объекты, хранящиеся в корзине более {days, plural, one {# дня} other {# дней}}, удаляются автоматически.", "trashed_items_will_be_permanently_deleted_after": "Объекты, хранящиеся в корзине более {days, plural, one {# дня} other {# дней}}, удаляются автоматически.",
"troubleshoot": "Решение проблем",
"type": "Тип", "type": "Тип",
"unable_to_change_pin_code": "Ошибка при изменении PIN-кода", "unable_to_change_pin_code": "Ошибка при изменении PIN-кода",
"unable_to_setup_pin_code": "Ошибка при создании PIN-кода", "unable_to_setup_pin_code": "Ошибка при создании PIN-кода",
@ -2037,7 +2034,6 @@
"use_biometric": "Использовать биометрию", "use_biometric": "Использовать биометрию",
"use_current_connection": "Использовать текущее подключение", "use_current_connection": "Использовать текущее подключение",
"use_custom_date_range": "Использовать пользовательский диапазон дат", "use_custom_date_range": "Использовать пользовательский диапазон дат",
"use_this_location": "Выбрать это место",
"user": "Пользователь", "user": "Пользователь",
"user_has_been_deleted": "Этот пользователь был удалён.", "user_has_been_deleted": "Этот пользователь был удалён.",
"user_id": "ID пользователя", "user_id": "ID пользователя",
@ -2076,7 +2072,7 @@
"view_in_timeline": "Показать на временной шкале", "view_in_timeline": "Показать на временной шкале",
"view_link": "Показать ссылку", "view_link": "Показать ссылку",
"view_links": "Показать ссылки", "view_links": "Показать ссылки",
"view_name": "Посмотреть", "view_name": "Вид",
"view_next_asset": "Показать следующий объект", "view_next_asset": "Показать следующий объект",
"view_previous_asset": "Показать предыдущий объект", "view_previous_asset": "Показать предыдущий объект",
"view_qr_code": "Посмотреть QR код", "view_qr_code": "Посмотреть QR код",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Spravovať nastavenia odosielania na pozadí a v popredí", "backup_setting_subtitle": "Spravovať nastavenia odosielania na pozadí a v popredí",
"backup_settings_subtitle": "Spravovať nastavenia nahrávania", "backup_settings_subtitle": "Spravovať nastavenia nahrávania",
"backward": "Dozadu", "backward": "Dozadu",
"beta_sync": "Stav synchronizácie verzie Beta",
"beta_sync_subtitle": "Spravovať nový systém synchronizácie",
"biometric_auth_enabled": "Biometrické overovanie je povolené", "biometric_auth_enabled": "Biometrické overovanie je povolené",
"biometric_locked_out": "Ste vymknutí z biometrického overovania", "biometric_locked_out": "Ste vymknutí z biometrického overovania",
"biometric_no_options": "Nie sú k dispozícii žiadne biometrické možnosti", "biometric_no_options": "Nie sú k dispozícii žiadne biometrické možnosti",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Táto funkcia načítava externé zdroje zo spoločnosti Google, aby mohla fungovať.", "gcast_enabled_description": "Táto funkcia načítava externé zdroje zo spoločnosti Google, aby mohla fungovať.",
"general": "Všeobecné", "general": "Všeobecné",
"geolocation_instruction_all_have_location": "Všetky položky pre tento dátum už majú údaje o polohe. Skúste zobraziť všetky položky alebo vyberte iný dátum",
"geolocation_instruction_location": "Kliknite na položku s GPS súradnicami, aby ste použili jej polohu, alebo vyberte polohu priamo z mapy", "geolocation_instruction_location": "Kliknite na položku s GPS súradnicami, aby ste použili jej polohu, alebo vyberte polohu priamo z mapy",
"geolocation_instruction_no_date": "Vyberte dátum, aby ste mohli spravovať údaje o polohe pre fotografie a videá z daného dňa",
"geolocation_instruction_no_photos": "Pre tento dátum neboli nájdené žiadne fotografie ani videá. Vyberte iný dátum, aby sa zobrazili",
"get_help": "Získať pomoc", "get_help": "Získať pomoc",
"get_wifiname_error": "Nepodarilo sa získať názov Wi-Fi siete. Uistite sa, že ste udelili potrebné oprávnenia a ste pripojení k sieti Wi-Fi", "get_wifiname_error": "Nepodarilo sa získať názov Wi-Fi siete. Uistite sa, že ste udelili potrebné oprávnenia a ste pripojení k sieti Wi-Fi",
"getting_started": "Začíname", "getting_started": "Začíname",
@ -1520,7 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "Mobilná aplikácia je zastaralá. Prosím aktualizujte na najnovšiu verziu.", "profile_drawer_client_out_of_date_minor": "Mobilná aplikácia je zastaralá. Prosím aktualizujte na najnovšiu verziu.",
"profile_drawer_client_server_up_to_date": "Klient a server sú aktuálne", "profile_drawer_client_server_up_to_date": "Klient a server sú aktuálne",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Režim iba na čítanie je aktivovaný. Dvojitým ťuknutím na ikonu obrázku používateľa režim opustíte.", "profile_drawer_readonly_mode": "Režim iba na čítanie je aktivovaný. Dlhým stlačením ikony obrázku používateľa režim opustíte.",
"profile_drawer_server_out_of_date_major": "Server je zastaralý. Prosím aktualizujte na najnovšiu verziu.", "profile_drawer_server_out_of_date_major": "Server je zastaralý. Prosím aktualizujte na najnovšiu verziu.",
"profile_drawer_server_out_of_date_minor": "Server je zastaralý. Prosím aktualizujte na najnovšiu verziu.", "profile_drawer_server_out_of_date_minor": "Server je zastaralý. Prosím aktualizujte na najnovšiu verziu.",
"profile_image_of_user": "Profilový obrázok používateľa {user}", "profile_image_of_user": "Profilový obrázok používateľa {user}",
@ -1645,6 +1640,7 @@
"restore_user": "Navrátiť používateľa", "restore_user": "Navrátiť používateľa",
"restored_asset": "Navrátená položka", "restored_asset": "Navrátená položka",
"resume": "Pokračovať", "resume": "Pokračovať",
"resume_paused_jobs": "Pokračovať v {count, plural, one {# pozastavenej úlohe} other {# pozastavených úlohách}}",
"retry_upload": "Zopakovať nahrávanie", "retry_upload": "Zopakovať nahrávanie",
"review_duplicates": "Preskúmať duplikáty", "review_duplicates": "Preskúmať duplikáty",
"review_large_files": "Skontrolovať veľké súbory", "review_large_files": "Skontrolovať veľké súbory",
@ -1849,10 +1845,8 @@
"shift_to_permanent_delete": "stlačte ⇧ na trvalé vymazanie položky", "shift_to_permanent_delete": "stlačte ⇧ na trvalé vymazanie položky",
"show_album_options": "Zobraziť možnosti albumu", "show_album_options": "Zobraziť možnosti albumu",
"show_albums": "Zobraziť albumy", "show_albums": "Zobraziť albumy",
"show_all_assets": "Zobraziť všetky položky",
"show_all_people": "Zobraziť všetkých ľudí", "show_all_people": "Zobraziť všetkých ľudí",
"show_and_hide_people": "Zobraziť a skryť ľudí", "show_and_hide_people": "Zobraziť a skryť ľudí",
"show_assets_without_location": "Zobraziť položky bez polohy",
"show_file_location": "Zobraziť umiestnenie súboru", "show_file_location": "Zobraziť umiestnenie súboru",
"show_gallery": "Zobraziť galériu", "show_gallery": "Zobraziť galériu",
"show_hidden_people": "Zobraziť skrytých ľudí", "show_hidden_people": "Zobraziť skrytých ľudí",
@ -1923,6 +1917,8 @@
"sync_albums_manual_subtitle": "Synchronizujte všetky nahrané videá a fotografie s vybranými záložnými albumami", "sync_albums_manual_subtitle": "Synchronizujte všetky nahrané videá a fotografie s vybranými záložnými albumami",
"sync_local": "Synchronizovať lokálne", "sync_local": "Synchronizovať lokálne",
"sync_remote": "Synchronizovať vzdialené", "sync_remote": "Synchronizovať vzdialené",
"sync_status": "Stav synchronizácie",
"sync_status_subtitle": "Zobraziť a spravovať systém synchronizácie",
"sync_upload_album_setting_subtitle": "Vytvárajte a nahrávajte svoje fotografie a videá do vybraných albumov na Immich", "sync_upload_album_setting_subtitle": "Vytvárajte a nahrávajte svoje fotografie a videá do vybraných albumov na Immich",
"tag": "Štítok", "tag": "Štítok",
"tag_assets": "Pridať štítky", "tag_assets": "Pridať štítky",
@ -1982,6 +1978,7 @@
"trash_page_select_assets_btn": "Vybrať médiá", "trash_page_select_assets_btn": "Vybrať médiá",
"trash_page_title": "Kôš ({count})", "trash_page_title": "Kôš ({count})",
"trashed_items_will_be_permanently_deleted_after": "Položky v koši sa natrvalo vymažú po {days, plural, one {# dni} other {# dňoch}}.", "trashed_items_will_be_permanently_deleted_after": "Položky v koši sa natrvalo vymažú po {days, plural, one {# dni} other {# dňoch}}.",
"troubleshoot": "Riešenie problémov",
"type": "Typ", "type": "Typ",
"unable_to_change_pin_code": "Nie je možné zmeniť PIN kód", "unable_to_change_pin_code": "Nie je možné zmeniť PIN kód",
"unable_to_setup_pin_code": "Nie je možné nastaviť PIN kód", "unable_to_setup_pin_code": "Nie je možné nastaviť PIN kód",
@ -2037,7 +2034,6 @@
"use_biometric": "Použiť biometrické údaje", "use_biometric": "Použiť biometrické údaje",
"use_current_connection": "použiť aktuálne pripojenie", "use_current_connection": "použiť aktuálne pripojenie",
"use_custom_date_range": "Použiť radšej vlastný rozsah dátumov", "use_custom_date_range": "Použiť radšej vlastný rozsah dátumov",
"use_this_location": "Kliknutím použite polohu",
"user": "Používateľ", "user": "Používateľ",
"user_has_been_deleted": "Tento používateľ bol vymazaný.", "user_has_been_deleted": "Tento používateľ bol vymazaný.",
"user_id": "ID používateľa", "user_id": "ID používateľa",

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Upravljaj nastavitve nalaganja v ozadju in ospredju", "backup_setting_subtitle": "Upravljaj nastavitve nalaganja v ozadju in ospredju",
"backup_settings_subtitle": "Upravljanje nastavitev nalaganja", "backup_settings_subtitle": "Upravljanje nastavitev nalaganja",
"backward": "Nazaj", "backward": "Nazaj",
"beta_sync": "Stanje sinhronizacije beta različice",
"beta_sync_subtitle": "Upravljanje novega sistema sinhronizacije",
"biometric_auth_enabled": "Biometrična avtentikacija omogočena", "biometric_auth_enabled": "Biometrična avtentikacija omogočena",
"biometric_locked_out": "Biometrična avtentikacija vam je onemogočena", "biometric_locked_out": "Biometrična avtentikacija vam je onemogočena",
"biometric_no_options": "Biometrične možnosti niso na voljo", "biometric_no_options": "Biometrične možnosti niso na voljo",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Ta funkcija za delovanje nalaga zunanje vire iz Googla.", "gcast_enabled_description": "Ta funkcija za delovanje nalaga zunanje vire iz Googla.",
"general": "Splošno", "general": "Splošno",
"geolocation_instruction_all_have_location": "Vsa sredstva za ta datum že imajo podatke o lokaciji. Poskusite prikazati vsa sredstva ali izberite drug datum",
"geolocation_instruction_location": "Kliknite na sredstvo z GPS koordinatami, da uporabite njegovo lokacijo, ali pa izberite lokacijo neposredno na zemljevidu", "geolocation_instruction_location": "Kliknite na sredstvo z GPS koordinatami, da uporabite njegovo lokacijo, ali pa izberite lokacijo neposredno na zemljevidu",
"geolocation_instruction_no_date": "Izberite datum za upravljanje podatkov o lokaciji za fotografije in videoposnetke s tega dne",
"geolocation_instruction_no_photos": "Za ta datum ni bilo najdenih fotografij ali videoposnetkov. Izberite drug datum, da jih prikažete",
"get_help": "Poiščite pomoč", "get_help": "Poiščite pomoč",
"get_wifiname_error": "Imena Wi-Fi ni bilo mogoče dobiti. Prepričajte se, da ste podelili potrebna dovoljenja in ste povezani v omrežje Wi-Fi", "get_wifiname_error": "Imena Wi-Fi ni bilo mogoče dobiti. Prepričajte se, da ste podelili potrebna dovoljenja in ste povezani v omrežje Wi-Fi",
"getting_started": "Začetek", "getting_started": "Začetek",
@ -1645,6 +1640,7 @@
"restore_user": "Obnovi uporabnika", "restore_user": "Obnovi uporabnika",
"restored_asset": "Obnovljeno sredstvo", "restored_asset": "Obnovljeno sredstvo",
"resume": "Nadaljuj", "resume": "Nadaljuj",
"resume_paused_jobs": "Nadaljuj {count, plural, one {# zaustavljeno opravilo} two {# zaustavljeni opravili} few {# zaustavljena opravila} other {# zaustavljenih opravil}}",
"retry_upload": "Poskusite znova naložiti", "retry_upload": "Poskusite znova naložiti",
"review_duplicates": "Pregled dvojnikov", "review_duplicates": "Pregled dvojnikov",
"review_large_files": "Pregled velikih datotek", "review_large_files": "Pregled velikih datotek",
@ -1849,10 +1845,8 @@
"shift_to_permanent_delete": "pritisni ⇧ za trajno brisanje sredstva", "shift_to_permanent_delete": "pritisni ⇧ za trajno brisanje sredstva",
"show_album_options": "Prikaži možnosti albuma", "show_album_options": "Prikaži možnosti albuma",
"show_albums": "Prikaži albume", "show_albums": "Prikaži albume",
"show_all_assets": "Prikaži vsa sredstva",
"show_all_people": "Prikaži vse osebe", "show_all_people": "Prikaži vse osebe",
"show_and_hide_people": "Prikaži & skrij osebe", "show_and_hide_people": "Prikaži & skrij osebe",
"show_assets_without_location": "Prikaži sredstva brez lokacije",
"show_file_location": "Pokaži lokacijo datoteke", "show_file_location": "Pokaži lokacijo datoteke",
"show_gallery": "Prikaži galerijo", "show_gallery": "Prikaži galerijo",
"show_hidden_people": "Prikaži skrite osebe", "show_hidden_people": "Prikaži skrite osebe",
@ -2037,7 +2031,6 @@
"use_biometric": "Uporabite biometrične podatke", "use_biometric": "Uporabite biometrične podatke",
"use_current_connection": "uporabi trenutno povezavo", "use_current_connection": "uporabi trenutno povezavo",
"use_custom_date_range": "Namesto tega uporabite časovno obdobje po meri", "use_custom_date_range": "Namesto tega uporabite časovno obdobje po meri",
"use_this_location": "Kliknite za uporabo lokacije",
"user": "Uporabnik", "user": "Uporabnik",
"user_has_been_deleted": "Ta uporabnik je bil izbrisan.", "user_has_been_deleted": "Ta uporabnik je bil izbrisan.",
"user_id": "ID uporabnika", "user_id": "ID uporabnika",

View file

@ -1 +1,59 @@
{} {
"about": "Rreth",
"account": "Llogari",
"account_settings": "Cilësimet e Llogarisë",
"acknowledge": "Prano",
"action": "Aksion",
"action_common_update": "Përditëso",
"actions": "Aksione",
"active": "Aktiv",
"activity": "Aktivitet",
"activity_changed": "Aktiviteti është {enabled, select, true {aktivizuar} other {çaktivizuar}}",
"add": "Shto",
"add_a_description": "Shto një përshkrim",
"add_a_location": "Shto një vendndodhje",
"add_a_name": "Shto një emër",
"add_a_title": "Shto një titull",
"add_birthday": "Shto një ditëlindje",
"add_endpoint": "Shto një endpoint",
"add_exclusion_pattern": "Shto model përjashtimi",
"add_import_path": "Shto vënd importimi",
"add_location": "Shto vendndodhje",
"add_more_users": "Shto më shumë përdorues",
"add_partner": "Shto partner",
"add_path": "Shto path",
"add_photos": "Shto foto",
"add_tag": "Shto tag",
"add_to": "Shto në…",
"add_to_album": "Shto në album",
"add_to_album_bottom_sheet_added": "Shtuar në {album}",
"add_to_album_bottom_sheet_already_exists": "Existon në {album}",
"add_to_album_toggle": "Aktivizo/çaktivizo zgjedhjen për {album}",
"add_to_albums": "Shto në albume",
"add_to_albums_count": "Shto në albume ({count})",
"add_to_shared_album": "Shto në album të hapur",
"add_url": "Shto URL",
"added_to_archive": "Shtuar në arkiv",
"added_to_favorites": "Shtuar tek të preferuarat",
"added_to_favorites_count": "Shtuar {count, number} në të preferuarat",
"admin": {
"add_exclusion_pattern_description": "Shto modele përjashtimi. Mbështetet globimi duke përdorur *, ** dhe ?. Për të injoruar të gjithë skedarët në çdo drejtori të quajtur \"Raw\", përdorni \"**/Raw/**\". Për të injoruar të gjithë skedarët që mbarojnë me \".tif\", përdorni \"**/*.tif\". Për të injoruar një shteg absolut, përdorni \"/path/to/ignore/**\".",
"admin_user": "Përdorues Administrator",
"asset_offline_description": "Ky aset i bibliotekës së jashtme nuk gjendet më në disk dhe është zhvendosur në koshin e plehrave. Nëse skedari është zhvendosur brenda bibliotekës, kontrolloni kronologjinë tuaj për asetin e ri përkatës. Për të rivendosur këtë aset, sigurohuni që shtegu i skedarit më poshtë të jetë i arritshëm nga Immich dhe skanoni bibliotekën.",
"authentication_settings": "Cilësimet e vërtetimit të përdoruesit",
"authentication_settings_description": "Manaxho passwordin, OAuth, dhe cilësime të tjera të",
"authentication_settings_disable_all": "Je i sigurt që dëshiron të çaktivizosh të gjitha metodat e hyrjes? Hyrja do të çaktivizohet plotësisht.",
"authentication_settings_reenable": "Për ta riaktivizuar, përdorni një <link>Komandë Serveri</link>.",
"background_task_job": "Detyrat në Sfond",
"backup_database": "Krijo demp të databaseit",
"backup_database_enable_description": "Aktivizo demp-et e bazës së të dhënave",
"backup_keep_last_amount": "Sasia e deponive të mëparshme për t'u mbajtur",
"backup_onboarding_1_description": "kopje në cloud ose në një vendndodhje tjetër fizike.",
"backup_onboarding_2_description": "kopje lokale në pajisje të ndryshme. Kjo përfshin skedarët kryesorë dhe një kopje rezervë të këtyre skedarëve lokalisht.",
"backup_onboarding_3_description": "kopje totale të të dhënave tuaja, duke përfshirë skedarët origjinalë. Kjo përfshin 1 kopje jashtë faqes dhe 2 kopje lokale.",
"backup_onboarding_description": "Rekomandohet një strategji <backblaze-link>3-2-1 për ruajtjen e të dhënave tuaja. Duhet të ruani kopje të fotove/videove të ngarkuara, si dhe të bazës së të dhënave të Immich për një zgjidhje gjithëpërfshirëse të ruajtjes së të dhënave.",
"backup_onboarding_footer": "Për më shumë informacion për të krijuar një kopje rezervë të Immich, ju lutem referouni tek <link>dokumentimi</link>.",
"backup_onboarding_parts_title": "Një kopje rezervë 3-2-1 ka:",
"backup_onboarding_title": "Kopje rezervë"
}
}

View file

@ -597,8 +597,6 @@
"backup_setting_subtitle": "Hantera inställningar för för- och bakgrundsuppladdning", "backup_setting_subtitle": "Hantera inställningar för för- och bakgrundsuppladdning",
"backup_settings_subtitle": "Hantera uppladdningsinställningar", "backup_settings_subtitle": "Hantera uppladdningsinställningar",
"backward": "Bakåt", "backward": "Bakåt",
"beta_sync": "Synkroniseringsstatus(BETA)",
"beta_sync_subtitle": "Hantera det nya synkroniseringssystemet",
"biometric_auth_enabled": "Biometrisk autentisering aktiverad", "biometric_auth_enabled": "Biometrisk autentisering aktiverad",
"biometric_locked_out": "Du är utelåst från biometrisk autentisering", "biometric_locked_out": "Du är utelåst från biometrisk autentisering",
"biometric_no_options": "Inga biometriska alternativ tillgängliga", "biometric_no_options": "Inga biometriska alternativ tillgängliga",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Denna funktion läser in externa resurser från Google för att fungera.", "gcast_enabled_description": "Denna funktion läser in externa resurser från Google för att fungera.",
"general": "Allmänt", "general": "Allmänt",
"geolocation_instruction_all_have_location": "Alla tillgångar för detta datum har redan platsdata. Försök att visa alla tillgångar eller välj ett annat datum",
"geolocation_instruction_location": "Klicka på en tillgång med GPS-koordinater för att använda dess plats, eller välj en plats direkt från kartan", "geolocation_instruction_location": "Klicka på en tillgång med GPS-koordinater för att använda dess plats, eller välj en plats direkt från kartan",
"geolocation_instruction_no_date": "Välj ett datum för att hantera platsdata för foton och videor från den dagen",
"geolocation_instruction_no_photos": "Inga foton eller videor hittades för detta datum. Välj ett annat datum för att visa dem",
"get_help": "Få hjälp", "get_help": "Få hjälp",
"get_wifiname_error": "Kunde inte hämta Wi-Fi-namn. Säkerställ att du tillåtit nödvändiga rättigheter och är ansluten till ett Wi-Fi-nätverk", "get_wifiname_error": "Kunde inte hämta Wi-Fi-namn. Säkerställ att du tillåtit nödvändiga rättigheter och är ansluten till ett Wi-Fi-nätverk",
"getting_started": "Komma igång", "getting_started": "Komma igång",
@ -1645,6 +1640,7 @@
"restore_user": "Återställ användare", "restore_user": "Återställ användare",
"restored_asset": "Återställ tillgång", "restored_asset": "Återställ tillgång",
"resume": "Återuppta", "resume": "Återuppta",
"resume_paused_jobs": "Återuppta {count, plural, one {# pausat jobb} other {# pausade jobb}}",
"retry_upload": "Ladda upp igen", "retry_upload": "Ladda upp igen",
"review_duplicates": "Granska dubbletter", "review_duplicates": "Granska dubbletter",
"review_large_files": "Granska stora filer", "review_large_files": "Granska stora filer",
@ -1849,10 +1845,8 @@
"shift_to_permanent_delete": "tryck på ⇧ för att permanent radera tillgången", "shift_to_permanent_delete": "tryck på ⇧ för att permanent radera tillgången",
"show_album_options": "Visa albumalternativ", "show_album_options": "Visa albumalternativ",
"show_albums": "Visa album", "show_albums": "Visa album",
"show_all_assets": "Visa alla tillgångar",
"show_all_people": "Visa alla personer", "show_all_people": "Visa alla personer",
"show_and_hide_people": "Visa & göm personer", "show_and_hide_people": "Visa & göm personer",
"show_assets_without_location": "Visa tillgångar utan plats",
"show_file_location": "Visa sökväg", "show_file_location": "Visa sökväg",
"show_gallery": "Visa galleri", "show_gallery": "Visa galleri",
"show_hidden_people": "Visa gömda personer", "show_hidden_people": "Visa gömda personer",
@ -2037,7 +2031,6 @@
"use_biometric": "Använd biometri", "use_biometric": "Använd biometri",
"use_current_connection": "Använd aktuell anslutning", "use_current_connection": "Använd aktuell anslutning",
"use_custom_date_range": "Använd anpassat datumintervall istället", "use_custom_date_range": "Använd anpassat datumintervall istället",
"use_this_location": "Klicka för att använda plats",
"user": "Användare", "user": "Användare",
"user_has_been_deleted": "Den här användaren har raderats.", "user_has_been_deleted": "Den här användaren har raderats.",
"user_id": "Användar-ID", "user_id": "Användar-ID",

View file

@ -167,6 +167,8 @@
"map_settings": "மேப் & ஜிபிஎஸ் (GPS) அமைப்புகள்", "map_settings": "மேப் & ஜிபிஎஸ் (GPS) அமைப்புகள்",
"map_settings_description": "மேப் அமைப்புகளை நிர்வகிக்கவும்", "map_settings_description": "மேப் அமைப்புகளை நிர்வகிக்கவும்",
"map_style_description": "style.json மேப் தீமுக்கான URL", "map_style_description": "style.json மேப் தீமுக்கான URL",
"memory_cleanup_job": "நினைவகத்தை சுத்தம் செய்தல்",
"memory_generate_job": "நினைவக உருவாக்கம்",
"metadata_extraction_job": "மெட்டாடேட்டாவைப் பிரித்தெடுக்கவும்", "metadata_extraction_job": "மெட்டாடேட்டாவைப் பிரித்தெடுக்கவும்",
"metadata_extraction_job_description": "ஜிபிஎஸ் மற்றும் தெளிவுத்திறன் போன்ற ஒவ்வொரு சொத்திலிருந்தும் மெட்டாடேட்டா தகவலைப் பிரித்தெடுக்கவும்", "metadata_extraction_job_description": "ஜிபிஎஸ் மற்றும் தெளிவுத்திறன் போன்ற ஒவ்வொரு சொத்திலிருந்தும் மெட்டாடேட்டா தகவலைப் பிரித்தெடுக்கவும்",
"metadata_faces_import_setting": "முக இறக்குமதியை இயக்கவும்", "metadata_faces_import_setting": "முக இறக்குமதியை இயக்கவும்",
@ -175,6 +177,20 @@
"metadata_settings_description": "மேனிலை தரவு அமைப்புகளை நிர்வகிக்கவும்", "metadata_settings_description": "மேனிலை தரவு அமைப்புகளை நிர்வகிக்கவும்",
"migration_job": "இடம்பெயர்தல்", "migration_job": "இடம்பெயர்தல்",
"migration_job_description": "புகைப்படங்கள் மற்றும் முகங்களுக்கான சிறுபடங்களை (தம்ப்னெயில்) சமீபத்திய கோப்புறை அமைப்பிற்கு மாற்றவும்", "migration_job_description": "புகைப்படங்கள் மற்றும் முகங்களுக்கான சிறுபடங்களை (தம்ப்னெயில்) சமீபத்திய கோப்புறை அமைப்பிற்கு மாற்றவும்",
"nightly_tasks_cluster_faces_setting_description": "புதிதாகக் கண்டறியப்பட்ட முகங்களில் முக அங்கீகாரத்தை இயக்கு",
"nightly_tasks_cluster_new_faces_setting": "புதிய முகங்களைக் தொகுதிபடுத்து",
"nightly_tasks_database_cleanup_setting": "தரவுத்தளத்தை சுத்தம் செய்யும் பணிகள்",
"nightly_tasks_database_cleanup_setting_description": "தரவுத்தளத்திலிருந்து பழைய, காலாவதியான தரவை சுத்தம் செய்யவும்",
"nightly_tasks_generate_memories_setting": "நினைவுகளை உருவாக்கு",
"nightly_tasks_generate_memories_setting_description": "சொத்துக்களிலிருந்து புதிய நினைவுகளை உருவாக்கு",
"nightly_tasks_missing_thumbnails_setting": "விடுபட்ட சிறுபடங்களை உருவாக்கு",
"nightly_tasks_missing_thumbnails_setting_description": "சிறுபட உருவாக்கத்திற்காக சிறுபடங்கள் இல்லாமல் சொத்துக்களை வரிசைப்படுத்தவும்",
"nightly_tasks_settings": "இரவு நேரப் பணிகள் அமைப்புகள்",
"nightly_tasks_settings_description": "இரவு நேர பணிகளை நிர்வகி",
"nightly_tasks_start_time_setting": "தொடக்க நேரம்",
"nightly_tasks_start_time_setting_description": "சர்வர் இரவு நேர பணிகளை இயக்கத் தொடங்கும் நேரம்",
"nightly_tasks_sync_quota_usage_setting": "ஒத்திசைவு ஒதுக்கீடு பயன்பாடு",
"nightly_tasks_sync_quota_usage_setting_description": "தற்போதைய பயன்பாட்டின் அடிப்படையில், பயனர் சேமிப்பக ஒதுக்கீட்டைப் புதுப்பிக்கவும்",
"no_paths_added": "ஃபோல்ட்டர் பாதைகள் சேர்க்கப்படவில்லை", "no_paths_added": "ஃபோல்ட்டர் பாதைகள் சேர்க்கப்படவில்லை",
"no_pattern_added": "பேட்டர்ன்் சேர்க்கப்படவில்லை", "no_pattern_added": "பேட்டர்ன்் சேர்க்கப்படவில்லை",
"note_apply_storage_label_previous_assets": "குறிப்பு: முன்பு பதிவேற்றிய படங்களுக்கு சேமிப்பக லேபிளைப் பயன்படுத்த, இதை இயக்கவும்", "note_apply_storage_label_previous_assets": "குறிப்பு: முன்பு பதிவேற்றிய படங்களுக்கு சேமிப்பக லேபிளைப் பயன்படுத்த, இதை இயக்கவும்",
@ -200,11 +216,14 @@
"oauth_auto_register": "தானியங்கு பதிவு", "oauth_auto_register": "தானியங்கு பதிவு",
"oauth_auto_register_description": "OAuth உடன் உள்நுழைந்த பிறகு தானாகவே புதிய பயனர்களைப் பதிவுசெய்யவும்", "oauth_auto_register_description": "OAuth உடன் உள்நுழைந்த பிறகு தானாகவே புதிய பயனர்களைப் பதிவுசெய்யவும்",
"oauth_button_text": "பட்டன் உரை", "oauth_button_text": "பட்டன் உரை",
"oauth_client_secret_description": "அவசியம், OAuth வழங்குநரால் PKCE (குறியீட்டுப் பரிமாற்றத்திற்கான ஆதார விசை) ஆதரிக்கப்படாவிட்டால்",
"oauth_enable_description": "OAuth மூலம் உள்நுழைக", "oauth_enable_description": "OAuth மூலம் உள்நுழைக",
"oauth_mobile_redirect_uri": "மொபைல் வழிமாற்று URI", "oauth_mobile_redirect_uri": "மொபைல் வழிமாற்று URI",
"oauth_mobile_redirect_uri_override": "மொபைல் வழிமாற்று URI மேலெழுதுதல்", "oauth_mobile_redirect_uri_override": "மொபைல் வழிமாற்று URI மேலெழுதுதல்",
"oauth_mobile_redirect_uri_override_description": "'app.immich:/' தவறான வழிமாற்று URI ஆக இருக்கும்போது இயக்கவும்.", "oauth_mobile_redirect_uri_override_description": "''{callback}'' போன்ற மொபைல் URI ஐ OAuth வழங்குநர் அனுமதிக்காதபோது இயக்கவும்",
"oauth_settings": "Oauth", "oauth_role_claim": "பதவி உரிமைகோரல்",
"oauth_role_claim_description": "இந்தக் கோரிக்கையின் இருப்பின் அடிப்படையில் தானாகவே நிர்வாகி அணுகலை வழங்கவும். கோரிக்கையில் 'பயனர்' அல்லது 'நிர்வாகி' இருக்கலாம்.",
"oauth_settings": "ஓஆத்",
"oauth_settings_description": "OAuth உள்நுழைவு அமைப்புகளை நிர்வகிக்கவும்", "oauth_settings_description": "OAuth உள்நுழைவு அமைப்புகளை நிர்வகிக்கவும்",
"oauth_settings_more_details": "இந்த அம்சத்தைப் பற்றிய கூடுதல் விவரங்களுக்கு, <link>டாக்ஸ்</link> ஐப் பார்க்கவும்.", "oauth_settings_more_details": "இந்த அம்சத்தைப் பற்றிய கூடுதல் விவரங்களுக்கு, <link>டாக்ஸ்</link> ஐப் பார்க்கவும்.",
"oauth_storage_label_claim": "சேமிப்பக லேபிள் உரிமைகோரல்", "oauth_storage_label_claim": "சேமிப்பக லேபிள் உரிமைகோரல்",
@ -212,7 +231,9 @@
"oauth_storage_quota_claim": "சேமிப்பக ஒதுக்கீடு உரிமைகோரல்", "oauth_storage_quota_claim": "சேமிப்பக ஒதுக்கீடு உரிமைகோரல்",
"oauth_storage_quota_claim_description": "இந்த உரிமைகோரலின் மதிப்பிற்கு பயனரின் சேமிப்பக ஒதுக்கீட்டை தானாக அமைக்கவும்.", "oauth_storage_quota_claim_description": "இந்த உரிமைகோரலின் மதிப்பிற்கு பயனரின் சேமிப்பக ஒதுக்கீட்டை தானாக அமைக்கவும்.",
"oauth_storage_quota_default": "இயல்புநிலை சேமிப்பக ஒதுக்கீடு (GiB)", "oauth_storage_quota_default": "இயல்புநிலை சேமிப்பக ஒதுக்கீடு (GiB)",
"oauth_storage_quota_default_description": "GiB இல் உள்ள ஒதுக்கீடு எந்த உரிமைகோரலும் வழங்கப்படாதபோது பயன்படுத்தப்படும் (வரம்பற்ற ஒதுக்கீட்டிற்கு 0 ஐ உள்ளிடவும்).", "oauth_storage_quota_default_description": "GiB இல் உள்ள ஒதுக்கீடு எந்த உரிமைகோரலும் வழங்கப்படாதபோது பயன்படுத்தப்படும் .",
"oauth_timeout": "கோரிக்கை நேரம் முடிந்தது",
"oauth_timeout_description": "கோரிக்கைகளுக்கான காலக்கெடு மில்லி வினாடிகளில்",
"password_enable_description": "மின்னஞ்சல் மற்றும் கடவுச்சொல் மூலம் உள்நுழையவும்", "password_enable_description": "மின்னஞ்சல் மற்றும் கடவுச்சொல் மூலம் உள்நுழையவும்",
"password_settings": "கடவுச்சொல் உள்நுழைவு", "password_settings": "கடவுச்சொல் உள்நுழைவு",
"password_settings_description": "கடவுச்சொல் உள்நுழைவு அமைப்புகளை நிர்வகிக்கவும்", "password_settings_description": "கடவுச்சொல் உள்நுழைவு அமைப்புகளை நிர்வகிக்கவும்",
@ -250,6 +271,7 @@
"storage_template_migration_info": "டெம்ப்ளேட் மாற்றங்கள் புதிய படங்களுக்கு மட்டுமே பொருந்தும். முன்பு பதிவேற்றிய படங்களுக்கு டெம்ப்ளேட்டைப் பயன்படுத்த, <link>{job}</link> ஐ இயக்கவும்.", "storage_template_migration_info": "டெம்ப்ளேட் மாற்றங்கள் புதிய படங்களுக்கு மட்டுமே பொருந்தும். முன்பு பதிவேற்றிய படங்களுக்கு டெம்ப்ளேட்டைப் பயன்படுத்த, <link>{job}</link> ஐ இயக்கவும்.",
"storage_template_migration_job": "ஸ்டோரேஜ் டெம்ப்ளேட் இடம்பெயர்வு வேலை", "storage_template_migration_job": "ஸ்டோரேஜ் டெம்ப்ளேட் இடம்பெயர்வு வேலை",
"storage_template_more_details": "இந்த அம்சத்தைப் பற்றிய கூடுதல் விவரங்களுக்கு, <template-link>Storage Template</template-link> மற்றும் அதன் <implications-link>தாக்கங்கள்</implications-link> ஐப் பார்க்கவும்", "storage_template_more_details": "இந்த அம்சத்தைப் பற்றிய கூடுதல் விவரங்களுக்கு, <template-link>Storage Template</template-link> மற்றும் அதன் <implications-link>தாக்கங்கள்</implications-link> ஐப் பார்க்கவும்",
"storage_template_onboarding_description_v2": "இயக்கப்பட்டால், இந்த அம்சம் பயனர் வரையறுக்கப்பட்ட டெம்ப்ளேட்டின் அடிப்படையில் கோப்புகளை தானாக ஒழுங்கமைக்கும். மேலும் தகவலுக்கு, <link>ஆவணங்கள்</link> ஐப் பார்க்கவும்.",
"storage_template_path_length": "தோராயமான பாதை நீள வரம்பு: <b>{length, number}</b>/{limit, number}", "storage_template_path_length": "தோராயமான பாதை நீள வரம்பு: <b>{length, number}</b>/{limit, number}",
"storage_template_settings": "ஸ்டோரேஜ் டெம்ப்ளேட்", "storage_template_settings": "ஸ்டோரேஜ் டெம்ப்ளேட்",
"storage_template_settings_description": "பதிவேற்ற புகைப்படங்களின் கோப்புறை அமைப்பு மற்றும் கோப்பு பெயரை நிர்வகிக்கவும்", "storage_template_settings_description": "பதிவேற்ற புகைப்படங்களின் கோப்புறை அமைப்பு மற்றும் கோப்பு பெயரை நிர்வகிக்கவும்",
@ -293,6 +315,8 @@
"transcoding_constant_rate_factor": "நிலையான வீத காரணி (-crf)", "transcoding_constant_rate_factor": "நிலையான வீத காரணி (-crf)",
"transcoding_constant_rate_factor_description": "வீடியோ தர நிலை. வழக்கமான மதிப்புகள் H.264 க்கு 23, HEVC க்கு 28, VP9 க்கு 31, மற்றும் AV1 க்கு 35 ஆகும். குறைவானது சிறந்தது, ஆனால் பெரிய கோப்புகளை உருவாக்குகிறது.", "transcoding_constant_rate_factor_description": "வீடியோ தர நிலை. வழக்கமான மதிப்புகள் H.264 க்கு 23, HEVC க்கு 28, VP9 க்கு 31, மற்றும் AV1 க்கு 35 ஆகும். குறைவானது சிறந்தது, ஆனால் பெரிய கோப்புகளை உருவாக்குகிறது.",
"transcoding_disabled_description": "எந்த வீடியோக்களையும் டிரான்ச்கோட் செய்யாதீர்கள், சில வாடிக்கையாளர்களின் பிளேபேக்கை உடைக்கலாம்", "transcoding_disabled_description": "எந்த வீடியோக்களையும் டிரான்ச்கோட் செய்யாதீர்கள், சில வாடிக்கையாளர்களின் பிளேபேக்கை உடைக்கலாம்",
"transcoding_encoding_options": "குறியீட்டு விருப்பங்கள்",
"transcoding_encoding_options_description": "குறியிடப்பட்ட வீடியோக்களுக்கான கோடெக்குகள், தெளிவுத்திறன், தரம் மற்றும் பிற விருப்பங்களை அமைக்கவும்",
"transcoding_hardware_acceleration": "வன்பொருள் முடுக்கம்", "transcoding_hardware_acceleration": "வன்பொருள் முடுக்கம்",
"transcoding_hardware_acceleration_description": "சோதனை; மிக வேகமாக, ஆனால் அதே பிட்ரேட்டில் குறைந்த தகுதி இருக்கும்", "transcoding_hardware_acceleration_description": "சோதனை; மிக வேகமாக, ஆனால் அதே பிட்ரேட்டில் குறைந்த தகுதி இருக்கும்",
"transcoding_hardware_decoding": "வன்பொருள் டிகோடிங்", "transcoding_hardware_decoding": "வன்பொருள் டிகோடிங்",
@ -304,6 +328,8 @@
"transcoding_max_keyframe_interval": "அதிகபட்ச கீஃப்ரேம் இடைவெளி", "transcoding_max_keyframe_interval": "அதிகபட்ச கீஃப்ரேம் இடைவெளி",
"transcoding_max_keyframe_interval_description": "கீஃப்ரேம்களுக்கு இடையில் அதிகபட்ச பிரேம் தூரத்தை அமைக்கிறது. குறைந்த மதிப்புகள் சுருக்க செயல்திறனை மோசமாக்குகின்றன, ஆனால் தேடல் நேரங்களை மேம்படுத்துகின்றன, மேலும் வேகமான இயக்கத்துடன் காட்சிகளில் தரத்தை மேம்படுத்தலாம். 0 இந்த மதிப்பை தானாக அமைக்கிறது.", "transcoding_max_keyframe_interval_description": "கீஃப்ரேம்களுக்கு இடையில் அதிகபட்ச பிரேம் தூரத்தை அமைக்கிறது. குறைந்த மதிப்புகள் சுருக்க செயல்திறனை மோசமாக்குகின்றன, ஆனால் தேடல் நேரங்களை மேம்படுத்துகின்றன, மேலும் வேகமான இயக்கத்துடன் காட்சிகளில் தரத்தை மேம்படுத்தலாம். 0 இந்த மதிப்பை தானாக அமைக்கிறது.",
"transcoding_optimal_description": "இலக்கு தீர்மானத்தை விட உயர்ந்த வீடியோக்கள் அல்லது ஏற்றுக்கொள்ளப்பட்ட வடிவத்தில் இல்லை", "transcoding_optimal_description": "இலக்கு தீர்மானத்தை விட உயர்ந்த வீடியோக்கள் அல்லது ஏற்றுக்கொள்ளப்பட்ட வடிவத்தில் இல்லை",
"transcoding_policy": "குறிமாற்றக் கொள்கை",
"transcoding_policy_description": "ஒரு வீடியோ எப்போது குறிமாற்றம் செய்யப்படும் என்பதை அமைக்கவும்",
"transcoding_preferred_hardware_device": "விருப்பமான வன்பொருள் சாதனம்", "transcoding_preferred_hardware_device": "விருப்பமான வன்பொருள் சாதனம்",
"transcoding_preferred_hardware_device_description": "VAAPI மற்றும் QSV க்கு மட்டுமே பொருந்தும். வன்பொருள் டிரான்ச்கோடிங்கிற்கு பயன்படுத்தப்படும் ட்ரை முனையை அமைக்கிறது.", "transcoding_preferred_hardware_device_description": "VAAPI மற்றும் QSV க்கு மட்டுமே பொருந்தும். வன்பொருள் டிரான்ச்கோடிங்கிற்கு பயன்படுத்தப்படும் ட்ரை முனையை அமைக்கிறது.",
"transcoding_preset_preset": "முன்னமைக்கப்பட்ட (-பிரசெட்)", "transcoding_preset_preset": "முன்னமைக்கப்பட்ட (-பிரசெட்)",
@ -312,6 +338,7 @@
"transcoding_reference_frames_description": "கொடுக்கப்பட்ட சட்டகத்தை சுருக்கும்போது குறிப்பிட வேண்டிய பிரேம்களின் எண்ணிக்கை. அதிக மதிப்புகள் சுருக்க செயல்திறனை மேம்படுத்துகின்றன, ஆனால் குறியாக்கத்தை மெதுவாக்குகின்றன. 0 இந்த மதிப்பை தானாக அமைக்கிறது.", "transcoding_reference_frames_description": "கொடுக்கப்பட்ட சட்டகத்தை சுருக்கும்போது குறிப்பிட வேண்டிய பிரேம்களின் எண்ணிக்கை. அதிக மதிப்புகள் சுருக்க செயல்திறனை மேம்படுத்துகின்றன, ஆனால் குறியாக்கத்தை மெதுவாக்குகின்றன. 0 இந்த மதிப்பை தானாக அமைக்கிறது.",
"transcoding_required_description": "ஏற்றுக்கொள்ளப்பட்ட வடிவத்தில் இல்லாத வீடியோக்கள் மட்டுமே", "transcoding_required_description": "ஏற்றுக்கொள்ளப்பட்ட வடிவத்தில் இல்லாத வீடியோக்கள் மட்டுமே",
"transcoding_settings": "வீடியோ டிரான்ச்கோடிங் அமைப்புகள்", "transcoding_settings": "வீடியோ டிரான்ச்கோடிங் அமைப்புகள்",
"transcoding_settings_description": "எந்த வீடியோக்களை டிரான்ஸ்கோட் செய்ய வேண்டும், அவற்றை எவ்வாறு செயலாக்க வேண்டும் என்பதை நிர்வகிக்கவும்",
"transcoding_target_resolution": "இலக்கு தீர்மானம்", "transcoding_target_resolution": "இலக்கு தீர்மானம்",
"transcoding_target_resolution_description": "அதிக தீர்மானங்கள் அதிக விவரங்களை பாதுகாக்க முடியும், ஆனால் குறியாக்க அதிக நேரம் எடுக்கும், பெரிய கோப்பு அளவுகளைக் கொண்டிருக்கலாம், மேலும் பயன்பாட்டு மறுமொழியைக் குறைக்கலாம்.", "transcoding_target_resolution_description": "அதிக தீர்மானங்கள் அதிக விவரங்களை பாதுகாக்க முடியும், ஆனால் குறியாக்க அதிக நேரம் எடுக்கும், பெரிய கோப்பு அளவுகளைக் கொண்டிருக்கலாம், மேலும் பயன்பாட்டு மறுமொழியைக் குறைக்கலாம்.",
"transcoding_temporal_aq": "தம்போர்ல்", "transcoding_temporal_aq": "தம்போர்ல்",
@ -324,18 +351,23 @@
"transcoding_transcode_policy_description": "ஒரு வீடியோ எப்போது மாற்றப்பட வேண்டும் என்பதற்கான கொள்கை. எச்.டி.ஆர் வீடியோக்கள் எப்போதும் டிரான்ச்கோட் செய்யப்படும் (டிரான்ச்கோடிங் முடக்கப்பட்டிருந்தால் தவிர).", "transcoding_transcode_policy_description": "ஒரு வீடியோ எப்போது மாற்றப்பட வேண்டும் என்பதற்கான கொள்கை. எச்.டி.ஆர் வீடியோக்கள் எப்போதும் டிரான்ச்கோட் செய்யப்படும் (டிரான்ச்கோடிங் முடக்கப்பட்டிருந்தால் தவிர).",
"transcoding_two_pass_encoding": "இரண்டு-பாச் குறியாக்கம்", "transcoding_two_pass_encoding": "இரண்டு-பாச் குறியாக்கம்",
"transcoding_two_pass_encoding_setting_description": "சிறந்த குறியாக்கப்பட்ட வீடியோக்களை உருவாக்க இரண்டு பாச்களில் டிரான்ச்கோட். மேக்ச் பிட்ரேட் இயக்கப்பட்டிருக்கும்போது (H.264 மற்றும் HEVC உடன் வேலை செய்ய இது தேவைப்படுகிறது), இந்த பயன்முறை அதிகபட்ச பிட்ரேட்டை அடிப்படையாகக் கொண்ட பிட்ரேட் வரம்பைப் பயன்படுத்துகிறது மற்றும் CRF ஐ புறக்கணிக்கிறது. VP9 ஐப் பொறுத்தவரை, அதிகபட்ச பிட்ரேட் முடக்கப்பட்டிருந்தால் CRF ஐப் பயன்படுத்தலாம்.", "transcoding_two_pass_encoding_setting_description": "சிறந்த குறியாக்கப்பட்ட வீடியோக்களை உருவாக்க இரண்டு பாச்களில் டிரான்ச்கோட். மேக்ச் பிட்ரேட் இயக்கப்பட்டிருக்கும்போது (H.264 மற்றும் HEVC உடன் வேலை செய்ய இது தேவைப்படுகிறது), இந்த பயன்முறை அதிகபட்ச பிட்ரேட்டை அடிப்படையாகக் கொண்ட பிட்ரேட் வரம்பைப் பயன்படுத்துகிறது மற்றும் CRF ஐ புறக்கணிக்கிறது. VP9 ஐப் பொறுத்தவரை, அதிகபட்ச பிட்ரேட் முடக்கப்பட்டிருந்தால் CRF ஐப் பயன்படுத்தலாம்.",
"transcoding_video_codec": "வீடியோ கோடெக்",
"transcoding_video_codec_description": "VP9 அதிக செயல்திறன் மற்றும் வலை பொருந்தக்கூடிய தன்மையைக் கொண்டுள்ளது, ஆனால் டிரான்ச்கோடிற்கு அதிக நேரம் எடுக்கும். HEVC இதேபோல் செயல்படுகிறது, ஆனால் குறைந்த வலை பொருந்தக்கூடிய தன்மையைக் கொண்டுள்ளது. H.264 பரவலாக இணக்கமானது மற்றும் டிரான்ச்கோடு விரைவானது, ஆனால் மிகப் பெரிய கோப்புகளை உருவாக்குகிறது. ஏ.வி 1 மிகவும் திறமையான கோடெக் ஆனால் பழைய சாதனங்களில் உதவி இல்லை.", "transcoding_video_codec_description": "VP9 அதிக செயல்திறன் மற்றும் வலை பொருந்தக்கூடிய தன்மையைக் கொண்டுள்ளது, ஆனால் டிரான்ச்கோடிற்கு அதிக நேரம் எடுக்கும். HEVC இதேபோல் செயல்படுகிறது, ஆனால் குறைந்த வலை பொருந்தக்கூடிய தன்மையைக் கொண்டுள்ளது. H.264 பரவலாக இணக்கமானது மற்றும் டிரான்ச்கோடு விரைவானது, ஆனால் மிகப் பெரிய கோப்புகளை உருவாக்குகிறது. ஏ.வி 1 மிகவும் திறமையான கோடெக் ஆனால் பழைய சாதனங்களில் உதவி இல்லை.",
"trash_enabled_description": "குப்பை அம்சங்களை இயக்கவும்", "trash_enabled_description": "குப்பை அம்சங்களை இயக்கவும்",
"trash_number_of_days": "நாட்களின் எண்ணிக்கை", "trash_number_of_days": "நாட்களின் எண்ணிக்கை",
"trash_number_of_days_description": "சொத்துக்களை நிரந்தரமாக அகற்றுவதற்கு முன் குப்பைத்தொட்டியில் வைத்திருக்க நாட்கள் எண்ணிக்கை", "trash_number_of_days_description": "சொத்துக்களை நிரந்தரமாக அகற்றுவதற்கு முன் குப்பைத்தொட்டியில் வைத்திருக்க நாட்கள் எண்ணிக்கை",
"trash_settings": "குப்பை அமைப்புகள்", "trash_settings": "குப்பை அமைப்புகள்",
"trash_settings_description": "குப்பை அமைப்புகளை நிர்வகிக்கவும்", "trash_settings_description": "குப்பை அமைப்புகளை நிர்வகிக்கவும்",
"unlink_all_oauth_accounts": "அனைத்து OAuth கணக்குகளின் இணைப்பையும் நீக்கு",
"unlink_all_oauth_accounts_description": "புதிய வழங்குநருக்கு மாறுவதற்கு முன், அனைத்து OAuth கணக்குகளின் இணைப்பையும் நீக்க நினைவில் கொள்ளுங்கள்.",
"unlink_all_oauth_accounts_prompt": "எல்லா OAuth கணக்குகளின் இணைப்பையும் நீக்க விரும்புகிறீர்களா? இது ஒவ்வொரு பயனருக்கும் OAuth ஐடியை மீட்டமைக்கும், மேலும் இதை திரும்பப் பெறு முடியாது.",
"user_cleanup_job": "பயனர் தூய்மைப்படுத்துதல்", "user_cleanup_job": "பயனர் தூய்மைப்படுத்துதல்",
"user_delete_delay": "<b> {user} </b> இன் கணக்கு மற்றும் சொத்துக்கள் {தாமதம், பன்மை, ஒன்று {# நாள்} மற்ற {# நாட்கள்}} இல் நிரந்தர நீக்க திட்டமிடப்படும்.", "user_delete_delay": "<b> {user} </b> இன் கணக்கு மற்றும் சொத்துக்கள் {தாமதம், பன்மை, ஒன்று {# நாள்} மற்ற {# நாட்கள்}} இல் நிரந்தர நீக்க திட்டமிடப்படும்.",
"user_delete_delay_settings": "தாமதத்தை நீக்கு", "user_delete_delay_settings": "தாமதத்தை நீக்கு",
"user_delete_delay_settings_description": "எண் of days after நீக்கும் பெறுநர் permanently நீக்கு a user's account and assets. நீக்குவதற்கு தயாராக இருக்கும் பயனர்களைச் சரிபார்க்க பயனர் நீக்குதல் வேலை நள்ளிரவில் இயங்குகிறது. இந்த அமைப்பில் மாற்றங்கள் அடுத்த மரணதண்டனையில் மதிப்பீடு செய்யப்படும்.", "user_delete_delay_settings_description": "எண் of days after நீக்கும் பெறுநர் permanently நீக்கு a user's account and assets. நீக்குவதற்கு தயாராக இருக்கும் பயனர்களைச் சரிபார்க்க பயனர் நீக்குதல் வேலை நள்ளிரவில் இயங்குகிறது. இந்த அமைப்பில் மாற்றங்கள் அடுத்த மரணதண்டனையில் மதிப்பீடு செய்யப்படும்.",
"user_delete_immediately": "<b> {user} </b> இன் கணக்கு மற்றும் சொத்துக்கள் நிரந்தர நீக்குதலுக்காக வரிசையில் நிற்கப்படும் <b> உடனடியாக </b>.", "user_delete_immediately": "<b> {user} </b> இன் கணக்கு மற்றும் சொத்துக்கள் நிரந்தர நீக்குதலுக்காக வரிசையில் நிற்கப்படும் <b> உடனடியாக </b>.",
"user_delete_immediately_checkbox": "உடனடியாக நீக்க பயனர் மற்றும் சொத்துக்கள்", "user_delete_immediately_checkbox": "உடனடியாக நீக்க பயனர் மற்றும் சொத்துக்கள்",
"user_details": "பயனர் விவரங்கள்",
"user_management": "பயனர் மேலாண்மை", "user_management": "பயனர் மேலாண்மை",
"user_password_has_been_reset": "பயனரின் கடவுச்சொல் மீட்டமைக்கப்பட்டுள்ளது:", "user_password_has_been_reset": "பயனரின் கடவுச்சொல் மீட்டமைக்கப்பட்டுள்ளது:",
"user_password_reset_description": "தயவுசெய்து தற்காலிக கடவுச்சொல்லை பயனருக்கு வழங்கவும், அவர்களின் அடுத்த உள்நுழைவில் கடவுச்சொல்லை மாற்ற வேண்டும் என்று அவர்களுக்குத் தெரிவிக்கவும்.", "user_password_reset_description": "தயவுசெய்து தற்காலிக கடவுச்சொல்லை பயனருக்கு வழங்கவும், அவர்களின் அடுத்த உள்நுழைவில் கடவுச்சொல்லை மாற்ற வேண்டும் என்று அவர்களுக்குத் தெரிவிக்கவும்.",
@ -355,6 +387,18 @@
"admin_password": "நிர்வாகி கடவுச்சொல்", "admin_password": "நிர்வாகி கடவுச்சொல்",
"administration": "நிர்வாகம்", "administration": "நிர்வாகம்",
"advanced": "மேம்பட்ட", "advanced": "மேம்பட்ட",
"advanced_settings_beta_timeline_subtitle": "புதிய பயன்பாட்டு அனுபவத்தை முயற்சிக்கவும்",
"advanced_settings_beta_timeline_title": "பீட்டா காலவரிசை",
"advanced_settings_enable_alternate_media_filter_subtitle": "மாற்று அளவுகோல்களின் அடிப்படையில் ஒத்திசைவின் போது மீடியாவை வடிகட்ட இந்த விருப்பத்தைப் பயன்படுத்தவும். எல்லா ஆல்பங்களையும் ஆப்ஸ் கண்டறிவதில் சிக்கல்கள் இருந்தால் மட்டுமே இதை முயற்சிக்கவும்.",
"advanced_settings_enable_alternate_media_filter_title": "[பரிசோதனைக்கு உட்பட்டது] மாற்று சாதன ஆல்ப ஒத்திசைவு வடிப்பானைப் பயன்படுத்தவும்",
"advanced_settings_log_level_title": "பதிவு நிலை: {level}",
"advanced_settings_prefer_remote_subtitle": "சில சாதனங்கள் உள் சொத்துக்களிலிருந்து சிறுபடங்களை ஏற்றுவதில் மிகவும் மெதுவாக இருக்கும். அதற்கு பதிலாக சர்வர் படங்களை ஏற்ற இந்த அமைப்பைச் செயல்படுத்தவும்.",
"advanced_settings_prefer_remote_title": "ரிமோட் படங்களுக்கு முன்னுரிமை கொடு",
"advanced_settings_proxy_headers_title": "ப்ராக்ஸி தலைப்புகள்",
"advanced_settings_readonly_mode_subtitle": "புகைப்படங்களை மட்டும் பார்க்கக்கூடிய படிக்க மட்டும் பயன்முறையை இயக்குகிறது, பல படங்களைத் தேர்ந்தெடுப்பது, பகிர்தல், அனுப்புதல், நீக்குதல் போன்ற அனைத்தும் முடக்கப்பட்டுள்ளன. பிரதான திரையில் இருந்து பயனர் அவதார் வழியாக படிக்க மட்டும் என்பதை இயக்கு/முடக்கு",
"advanced_settings_readonly_mode_title": "படிக்க மட்டுமேயான பயன்முறை",
"advanced_settings_self_signed_ssl_title": "சுய கையொப்பமிட்ட SSL சான்றிதழ்களை அனுமதி",
"advanced_settings_sync_remote_deletions_subtitle": "இணையத்தில் நடவடிக்கை எடுக்கப்படும்போது, இந்தச் சாதனத்தில் உள்ள ஒரு சொத்தை தானாகவே நீக்கவும் அல்லது மீட்டெடுக்கவும்",
"age_months": "அகவை {மாதங்கள், பன்மை, ஒன்று {# மாதம்} மற்ற {# மாதங்கள்}}", "age_months": "அகவை {மாதங்கள், பன்மை, ஒன்று {# மாதம்} மற்ற {# மாதங்கள்}}",
"age_year_months": "அகவை 1 அகவை, {மாதங்கள், பன்மை, ஒன்று {# மாதம்} மற்ற {# மாதங்கள்}}", "age_year_months": "அகவை 1 அகவை, {மாதங்கள், பன்மை, ஒன்று {# மாதம்} மற்ற {# மாதங்கள்}}",
"age_years": "{ஆண்டுகள், பன்மை, பிற {வயது #}}", "age_years": "{ஆண்டுகள், பன்மை, பிற {வயது #}}",
@ -1269,12 +1313,21 @@
"upload_status_errors": "பிழைகள்", "upload_status_errors": "பிழைகள்",
"upload_status_uploaded": "பதிவேற்றப்பட்டது", "upload_status_uploaded": "பதிவேற்றப்பட்டது",
"upload_success": "வெற்றியைப் பதிவேற்றவும், புதிய பதிவேற்ற சொத்துக்களைக் காண பக்கத்தைப் புதுப்பிக்கவும்.", "upload_success": "வெற்றியைப் பதிவேற்றவும், புதிய பதிவேற்ற சொத்துக்களைக் காண பக்கத்தைப் புதுப்பிக்கவும்.",
"upload_to_immich": "இம்மிச்சிற்கு பதிவேற்று ({count})",
"uploading": "பதிவேற்றுகிறது",
"uploading_media": "மீடியாவைப் பதிவேற்றுகிறது",
"url": "முகவரி", "url": "முகவரி",
"usage": "பயன்பாடு", "usage": "பயன்பாடு",
"use_biometric": "பயோமெட்ரிக்கைப் பயன்படுத்தவும்",
"use_current_connection": "தற்போதைய இணைப்பைப் பயன்படுத்தவும்",
"use_custom_date_range": "அதற்கு பதிலாக தனிப்பயன் தேதி வரம்பைப் பயன்படுத்தவும்", "use_custom_date_range": "அதற்கு பதிலாக தனிப்பயன் தேதி வரம்பைப் பயன்படுத்தவும்",
"user": "பயனர்", "user": "பயனர்",
"user_has_been_deleted": "இந்தப் பயனர் நீக்கப்பட்டார்.",
"user_id": "பயனர் ஐடி", "user_id": "பயனர் ஐடி",
"user_liked": "{user} விரும்பினார் {வகை, தேர்ந்தெடு, புகைப்படம் {this photo} வீடியோ {this video} சொத்து {this asset} பிற {it}}", "user_liked": "{user} விரும்பினார் {வகை, தேர்ந்தெடு, புகைப்படம் {this photo} வீடியோ {this video} சொத்து {this asset} பிற {it}}",
"user_pin_code_settings": "பின் குறியீடு",
"user_pin_code_settings_description": "உங்கள் பின் குறியீட்டை நிர்வகிக்கவும்",
"user_privacy": "பயனர் தனியுரிமை",
"user_purchase_settings": "வாங்க", "user_purchase_settings": "வாங்க",
"user_purchase_settings_description": "உங்கள் வாங்குதலை நிர்வகிக்கவும்", "user_purchase_settings_description": "உங்கள் வாங்குதலை நிர்வகிக்கவும்",
"user_role_set": "{user} {பாத்திரமாக அமைக்கவும்", "user_role_set": "{user} {பாத்திரமாக அமைக்கவும்",
@ -1283,12 +1336,14 @@
"user_usage_stats_description": "கணக்கு உபயோகப் புள்ளிவிவரங்களைப் பார்க்க", "user_usage_stats_description": "கணக்கு உபயோகப் புள்ளிவிவரங்களைப் பார்க்க",
"username": "பயனர்பெயர்", "username": "பயனர்பெயர்",
"users": "பயனர்கள்", "users": "பயனர்கள்",
"users_added_to_album_count": "ஆல்பத்தில் {எண்ணிக்கை, பன்மை, ஒன்று{# user} மற்றவை{# users}} சேர்க்கப்பட்டது",
"utilities": "பயன்பாடுகள்", "utilities": "பயன்பாடுகள்",
"validate": "சரிபார்க்கவும்", "validate": "சரிபார்க்கவும்",
"validate_endpoint_error": "தயவுசெய்து ஒரு செல்லுபடியாகும் URL ஐ உள்ளிடவும்",
"variables": "மாறிகள்", "variables": "மாறிகள்",
"version": "பதிப்பு", "version": "பதிப்பு",
"version_announcement_closing": "உங்கள் நண்பர், அலெக்ச்", "version_announcement_closing": "உங்கள் நண்பர், அலெக்ச்",
"version_announcement_message": "ஆய்! இம்மியின் புதிய பதிப்பு கிடைக்கிறது. எந்தவொரு தவறான கருத்துக்களையும் தடுக்க உங்கள் அமைப்பு புதுப்பித்த நிலையில் இருப்பதை உறுதிசெய்ய <இணைப்பு> வெளியீட்டுக் குறிப்புகள் </இணைப்பு> ஐப் படிக்க சிறிது நேரம் ஒதுக்குங்கள், குறிப்பாக நீங்கள் காவற்கோபுரத்தைப் பயன்படுத்தினால் அல்லது உங்கள் இம்மிச் நிகழ்வை தானாகவே புதுப்பிப்பதைக் கையாளும் எந்தவொரு பொறிமுறையையும் பயன்படுத்தினால்.", "version_announcement_message": "வணக்கம்! இம்மியின் புதிய பதிப்பு கிடைக்கிறது. எந்தவொரு தவறான கருத்துக்களையும் தடுக்க உங்கள் அமைப்பு புதுப்பித்த நிலையில் இருப்பதை உறுதிசெய்ய <link> வெளியீட்டுக் குறிப்புகள் </link> ஐப் படிக்க சிறிது நேரம் ஒதுக்குங்கள், குறிப்பாக நீங்கள் காவற்கோபுரத்தைப் பயன்படுத்தினால் அல்லது உங்கள் இம்மிச் நிகழ்வை தானாகவே புதுப்பிப்பதைக் கையாளும் எந்தவொரு பொறிமுறையையும் பயன்படுத்தினால்.",
"version_history": "பதிப்பு வரலாறு", "version_history": "பதிப்பு வரலாறு",
"version_history_item": "{version} இல் {date} நிறுவப்பட்டது", "version_history_item": "{version} இல் {date} நிறுவப்பட்டது",
"video": "ஒளிதோற்றம்", "video": "ஒளிதோற்றம்",
@ -1300,21 +1355,32 @@
"view_album": "ஆல்பத்தைக் காண்க", "view_album": "ஆல்பத்தைக் காண்க",
"view_all": "அனைத்தையும் காண்க", "view_all": "அனைத்தையும் காண்க",
"view_all_users": "அனைத்து பயனர்களையும் காண்க", "view_all_users": "அனைத்து பயனர்களையும் காண்க",
"view_details": "விவரங்களைப் பார்",
"view_in_timeline": "காலவரிசையில் காண்க", "view_in_timeline": "காலவரிசையில் காண்க",
"view_link": "இணைப்பைக் காண்க",
"view_links": "இணைப்புகளைக் காண்க", "view_links": "இணைப்புகளைக் காண்க",
"view_name": "பார்வை", "view_name": "பார்வை",
"view_next_asset": "அடுத்த சொத்தை காண்க", "view_next_asset": "அடுத்த சொத்தை காண்க",
"view_previous_asset": "முந்தைய சொத்தைப் பார்க்கவும்", "view_previous_asset": "முந்தைய சொத்தைப் பார்க்கவும்",
"view_qr_code": "QR குறியீட்டைக் காட்டு",
"view_similar_photos": "இதே போன்ற புகைப்படங்களைக் காட்டு",
"view_stack": "காண்க அடுக்கு", "view_stack": "காண்க அடுக்கு",
"view_user": "பயனரைப் பார்க்கவும்",
"viewer_remove_from_stack": "அடுக்கிலிருந்து அகற்று",
"viewer_stack_use_as_main_asset": "பிரதான சொத்தாகப் பயன்படுத்தவும்",
"viewer_unstack": "அடுக்கை நீக்கு",
"visibility_changed": "{எண்ணிக்கை, பன்மை, ஒன்று {# நபர்} மற்ற {# நபர்கள்} க்கு க்கு தெரிவுநிலை மாற்றப்பட்டது", "visibility_changed": "{எண்ணிக்கை, பன்மை, ஒன்று {# நபர்} மற்ற {# நபர்கள்} க்கு க்கு தெரிவுநிலை மாற்றப்பட்டது",
"waiting": "காத்திருக்கிறது", "waiting": "காத்திருக்கிறது",
"warning": "எச்சரிக்கை", "warning": "எச்சரிக்கை",
"week": "வாரம்", "week": "வாரம்",
"welcome": "வரவேற்கிறோம்", "welcome": "வரவேற்கிறோம்",
"welcome_to_immich": "இம்மிச்சிற்கு வருக", "welcome_to_immich": "இம்மிச்சிற்கு வருக",
"wifi_name": "வைஃபை பெயர்",
"wrong_pin_code": "தவறான பின் குறியீடு",
"year": "ஆண்டு", "year": "ஆண்டு",
"years_ago": "{ஆண்டுகள், பன்மை, ஒன்று {# ஆண்டு} மற்ற {# ஆண்டுகள்}}} முன்பு", "years_ago": "{ஆண்டுகள், பன்மை, ஒன்று {# ஆண்டு} மற்ற {# ஆண்டுகள்}}} முன்பு",
"yes": "ஆம்", "yes": "ஆம்",
"you_dont_have_any_shared_links": "உங்களிடம் பகிரப்பட்ட இணைப்புகள் எதுவும் இல்லை", "you_dont_have_any_shared_links": "உங்களிடம் பகிரப்பட்ட இணைப்புகள் எதுவும் இல்லை",
"your_wifi_name": "உங்கள் வைஃபை பெயர்",
"zoom_image": "பெரிதாக்க படம்" "zoom_image": "பெரிதாக்க படம்"
} }

View file

@ -11,7 +11,7 @@
"activity_changed": "Etkinlik {enabled, select, true {etkin} other {devre dışı}}", "activity_changed": "Etkinlik {enabled, select, true {etkin} other {devre dışı}}",
"add": "Ekle", "add": "Ekle",
"add_a_description": "Açıklama ekle", "add_a_description": "Açıklama ekle",
"add_a_location": "Lokasyon ekle", "add_a_location": "Konum ekle",
"add_a_name": "İsim ekle", "add_a_name": "İsim ekle",
"add_a_title": "Başlık ekle", "add_a_title": "Başlık ekle",
"add_birthday": "Doğum günü ekle", "add_birthday": "Doğum günü ekle",
@ -28,6 +28,7 @@
"add_to_album": "Albüme ekle", "add_to_album": "Albüme ekle",
"add_to_album_bottom_sheet_added": "{album} albümüne eklendi", "add_to_album_bottom_sheet_added": "{album} albümüne eklendi",
"add_to_album_bottom_sheet_already_exists": "Zaten {album} albümüne ekli", "add_to_album_bottom_sheet_already_exists": "Zaten {album} albümüne ekli",
"add_to_album_toggle": "{album} için seçimi değiştir",
"add_to_albums": "Albümlere ekle", "add_to_albums": "Albümlere ekle",
"add_to_albums_count": "{count} albümlerine ekle", "add_to_albums_count": "{count} albümlerine ekle",
"add_to_shared_album": "Paylaşılan albüme ekle", "add_to_shared_album": "Paylaşılan albüme ekle",
@ -44,7 +45,7 @@
"authentication_settings_disable_all": "Tüm giriş yöntemlerini devre dışı bırakmak istediğinize emin misiniz? Giriş yapma fonksiyonu tamamen devre dışı bırakılacak.", "authentication_settings_disable_all": "Tüm giriş yöntemlerini devre dışı bırakmak istediğinize emin misiniz? Giriş yapma fonksiyonu tamamen devre dışı bırakılacak.",
"authentication_settings_reenable": "Yeniden aktif etmek için <link>Sunucu Komutu</link>'nu kullanın.", "authentication_settings_reenable": "Yeniden aktif etmek için <link>Sunucu Komutu</link>'nu kullanın.",
"background_task_job": "Arka Plan Görevleri", "background_task_job": "Arka Plan Görevleri",
"backup_database": "Veritabanı yığını oluştur", "backup_database": "Veritabanı Yığını Oluştur",
"backup_database_enable_description": "Veritabanı yığınlarını etkinleştir", "backup_database_enable_description": "Veritabanı yığınlarını etkinleştir",
"backup_keep_last_amount": "Tutulması gereken geçmiş yığını miktarı", "backup_keep_last_amount": "Tutulması gereken geçmiş yığını miktarı",
"backup_onboarding_1_description": "bulutta veya başka bir fiziksel konumda bulunan yedek kopya.", "backup_onboarding_1_description": "bulutta veya başka bir fiziksel konumda bulunan yedek kopya.",
@ -54,7 +55,7 @@
"backup_onboarding_footer": "Immich'i yedekleme hakkında daha fazla bilgi için lütfen <link>belgelere</link> bakın.", "backup_onboarding_footer": "Immich'i yedekleme hakkında daha fazla bilgi için lütfen <link>belgelere</link> bakın.",
"backup_onboarding_parts_title": "3-2-1 yedekleme şunları içerir:", "backup_onboarding_parts_title": "3-2-1 yedekleme şunları içerir:",
"backup_onboarding_title": "Yedeklemeler", "backup_onboarding_title": "Yedeklemeler",
"backup_settings": "Veritabanı yığını ayarları", "backup_settings": "Veritabanı Yığını Ayarları",
"backup_settings_description": "Veritabanı döküm ayarlarını yönet.", "backup_settings_description": "Veritabanı döküm ayarlarını yönet.",
"cleared_jobs": "{job} için işler temizlendi", "cleared_jobs": "{job} için işler temizlendi",
"config_set_by_file": "Ayarlar şuanda config dosyası tarafından ayarlanmıştır", "config_set_by_file": "Ayarlar şuanda config dosyası tarafından ayarlanmıştır",
@ -395,6 +396,8 @@
"advanced_settings_prefer_remote_title": "Uzak görüntüleri tercih et", "advanced_settings_prefer_remote_title": "Uzak görüntüleri tercih et",
"advanced_settings_proxy_headers_subtitle": "Immich'in her ağ isteğiyle birlikte göndermesi gereken proxy header'ları tanımlayın", "advanced_settings_proxy_headers_subtitle": "Immich'in her ağ isteğiyle birlikte göndermesi gereken proxy header'ları tanımlayın",
"advanced_settings_proxy_headers_title": "Proxy Header'lar", "advanced_settings_proxy_headers_title": "Proxy Header'lar",
"advanced_settings_readonly_mode_subtitle": "Fotoğrafların yalnızca görüntülenebildiği salt okunur modu etkinleştirir; birden fazla görüntü seçme, paylaşma, aktarma, silme gibi işlemler devre dışı bırakılır. Ana ekrandan kullanıcı avatarı aracılığıyla salt okunur modu Etkinleştirin/Devre dışı bırakın",
"advanced_settings_readonly_mode_title": "Salt okunur Mod",
"advanced_settings_self_signed_ssl_subtitle": "Sunucu uç noktası için SSL sertifika doğrulamasını atlar. Kendinden imzalı sertifikalar için gereklidir.", "advanced_settings_self_signed_ssl_subtitle": "Sunucu uç noktası için SSL sertifika doğrulamasını atlar. Kendinden imzalı sertifikalar için gereklidir.",
"advanced_settings_self_signed_ssl_title": "Kendi kendine imzalanmış SSL sertifikalarına izin ver", "advanced_settings_self_signed_ssl_title": "Kendi kendine imzalanmış SSL sertifikalarına izin ver",
"advanced_settings_sync_remote_deletions_subtitle": "Web üzerinde işlem yapıldığında, bu aygıttaki varlığı otomatik olarak sil veya geri yükle", "advanced_settings_sync_remote_deletions_subtitle": "Web üzerinde işlem yapıldığında, bu aygıttaki varlığı otomatik olarak sil veya geri yükle",
@ -460,6 +463,7 @@
"app_bar_signout_dialog_title": ıkış", "app_bar_signout_dialog_title": ıkış",
"app_settings": "Uygulama Ayarları", "app_settings": "Uygulama Ayarları",
"appears_in": "Şurada görünür", "appears_in": "Şurada görünür",
"apply_count": "Uygula ({count, number})",
"archive": "Arşiv", "archive": "Arşiv",
"archive_action_prompt": "{count} arşive eklendi", "archive_action_prompt": "{count} arşive eklendi",
"archive_or_unarchive_photo": "Fotoğrafı arşivle/arşivden çıkar", "archive_or_unarchive_photo": "Fotoğrafı arşivle/arşivden çıkar",
@ -499,7 +503,9 @@
"assets": "Varlıklar", "assets": "Varlıklar",
"assets_added_count": "{count, plural, one {# varlık eklendi} other {# varlık eklendi}}", "assets_added_count": "{count, plural, one {# varlık eklendi} other {# varlık eklendi}}",
"assets_added_to_album_count": "{count, plural, one {# varlık} other {# varlık}} albüme eklendi", "assets_added_to_album_count": "{count, plural, one {# varlık} other {# varlık}} albüme eklendi",
"assets_added_to_albums_count": "Eklendi {assetTotal, plural, one {# asset} other {# assets}} to {albumTotal, plural, one {# album} other {# albums}}",
"assets_cannot_be_added_to_album_count": "{count, plural, one {Varlık} other {Varlıklar}} albüme eklenemiyor", "assets_cannot_be_added_to_album_count": "{count, plural, one {Varlık} other {Varlıklar}} albüme eklenemiyor",
"assets_cannot_be_added_to_albums": "{count, plural, one {Asset} other {Assets}} hiçbir albüme eklenemez",
"assets_count": "{count, plural, one {# varlık} other {# varlıklar}}", "assets_count": "{count, plural, one {# varlık} other {# varlıklar}}",
"assets_deleted_permanently": "{count} öğe kalıcı olarak silindi", "assets_deleted_permanently": "{count} öğe kalıcı olarak silindi",
"assets_deleted_permanently_from_server": "{count} öğe kalıcı olarak Immich sunucusundan silindi", "assets_deleted_permanently_from_server": "{count} öğe kalıcı olarak Immich sunucusundan silindi",
@ -516,6 +522,7 @@
"assets_trashed_count": "{count, plural, one {# varlık} other {# varlıklar}} çöp kutusuna taşındı", "assets_trashed_count": "{count, plural, one {# varlık} other {# varlıklar}} çöp kutusuna taşındı",
"assets_trashed_from_server": "{count} öğe Immich sunucusunda çöpe atıldı", "assets_trashed_from_server": "{count} öğe Immich sunucusunda çöpe atıldı",
"assets_were_part_of_album_count": "{count, plural, one {Varlık zaten} other {Varlıklar zaten}} albümün parçasıydı", "assets_were_part_of_album_count": "{count, plural, one {Varlık zaten} other {Varlıklar zaten}} albümün parçasıydı",
"assets_were_part_of_albums_count": "{count, plural, one {Asset was} other {Assets were}} albümlerin zaten bir parçası",
"authorized_devices": "Yetki Verilmiş Cihazlar", "authorized_devices": "Yetki Verilmiş Cihazlar",
"automatic_endpoint_switching_subtitle": "Belirlenmiş Wi-Fi ağına bağlıyken yerel olarak bağlanıp başka yerlerde alternatif bağlantıyı kullan", "automatic_endpoint_switching_subtitle": "Belirlenmiş Wi-Fi ağına bağlıyken yerel olarak bağlanıp başka yerlerde alternatif bağlantıyı kullan",
"automatic_endpoint_switching_title": "Otomatik URL değiştirme", "automatic_endpoint_switching_title": "Otomatik URL değiştirme",
@ -590,8 +597,6 @@
"backup_setting_subtitle": "Arka planda ve ön planda yükleme ayarlarını düzenle", "backup_setting_subtitle": "Arka planda ve ön planda yükleme ayarlarını düzenle",
"backup_settings_subtitle": "Yükleme ayarlarını yönet", "backup_settings_subtitle": "Yükleme ayarlarını yönet",
"backward": "Geriye doğru", "backward": "Geriye doğru",
"beta_sync": "Beta Senkronizasyon Durumu",
"beta_sync_subtitle": "Yeni senkronizasyon sistemini yönetin",
"biometric_auth_enabled": "Biyometrik kimlik doğrulama etkin", "biometric_auth_enabled": "Biyometrik kimlik doğrulama etkin",
"biometric_locked_out": "Biyometrik kimlik doğrulaması kilitli", "biometric_locked_out": "Biyometrik kimlik doğrulaması kilitli",
"biometric_no_options": "Biyometrik seçenek yok", "biometric_no_options": "Biyometrik seçenek yok",
@ -843,6 +848,7 @@
"edit_date": "Tarihi Düzenle", "edit_date": "Tarihi Düzenle",
"edit_date_and_time": "Tarih ve zamanı düzenleyin", "edit_date_and_time": "Tarih ve zamanı düzenleyin",
"edit_date_and_time_action_prompt": "{count} tarih ve zaman düzenlendi", "edit_date_and_time_action_prompt": "{count} tarih ve zaman düzenlendi",
"edit_date_and_time_by_offset": "Tarihi ofset ile değiştir",
"edit_date_and_time_by_offset_interval": "Yeni tarih aralığı: {from}'dan {to}'a kadar", "edit_date_and_time_by_offset_interval": "Yeni tarih aralığı: {from}'dan {to}'a kadar",
"edit_description": "Açıklamayı düzenle", "edit_description": "Açıklamayı düzenle",
"edit_description_prompt": "Lütfen yeni bir açıklama seçin:", "edit_description_prompt": "Lütfen yeni bir açıklama seçin:",
@ -1068,12 +1074,15 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "Bu özellik, çalışabilmek için Google'dan harici kaynaklar yükler.", "gcast_enabled_description": "Bu özellik, çalışabilmek için Google'dan harici kaynaklar yükler.",
"general": "Genel", "general": "Genel",
"geolocation_instruction_location": "GPS koordinatları olan bir varlığı tıklayarak konumunu kullanın veya haritadan doğrudan bir konum seçin",
"get_help": "Yardım Al", "get_help": "Yardım Al",
"get_wifiname_error": "Wi-Fi adı alınamadı. Gerekli izinleri verdiğinizden ve bir Wi-Fi ağına bağlı olduğunuzdan emin olun", "get_wifiname_error": "Wi-Fi adı alınamadı. Gerekli izinleri verdiğinizden ve bir Wi-Fi ağına bağlı olduğunuzdan emin olun",
"getting_started": "Başlarken", "getting_started": "Başlarken",
"go_back": "Geri git", "go_back": "Geri git",
"go_to_folder": "Klasöre git", "go_to_folder": "Klasöre git",
"go_to_search": "Aramaya git", "go_to_search": "Aramaya git",
"gps": "GPS",
"gps_missing": "GPS yok",
"grant_permission": "İzin ver", "grant_permission": "İzin ver",
"group_albums_by": "Albümleri gruplandır...", "group_albums_by": "Albümleri gruplandır...",
"group_country": "Ülkeye göre grupla", "group_country": "Ülkeye göre grupla",
@ -1111,7 +1120,7 @@
"home_page_delete_remote_err_local": "Uzaktan silme seçimindeki yerel öğeler atlanıyor", "home_page_delete_remote_err_local": "Uzaktan silme seçimindeki yerel öğeler atlanıyor",
"home_page_favorite_err_local": "Yerel ögeler henüz gözdelere eklenemiyor, atlanıyor", "home_page_favorite_err_local": "Yerel ögeler henüz gözdelere eklenemiyor, atlanıyor",
"home_page_favorite_err_partner": "Ortak ögeleri henüz gözdelere eklenemiyor, atlanıyor", "home_page_favorite_err_partner": "Ortak ögeleri henüz gözdelere eklenemiyor, atlanıyor",
"home_page_first_time_notice": "Uygulamayı ilk kez kullanıyorsanız, zaman çizelgesinin albümlerdeki fotoğraf ve videolar ile oluşturulabilmesi için lütfen yedekleme için albüm(ler) seçtiğinizden emin olun.", "home_page_first_time_notice": "Uygulamayı ilk kez kullanıyorsanız, zaman çizelgesinin albümlerdeki fotoğraf ve videolar ile oluşturulabilmesi için lütfen yedekleme için albüm seçtiğinizden emin olun",
"home_page_locked_error_local": "Yerel varlıklar kilitli klasöre taşınamıyor, atlanıyor", "home_page_locked_error_local": "Yerel varlıklar kilitli klasöre taşınamıyor, atlanıyor",
"home_page_locked_error_partner": "Ortak varlıklar kilitli klasöre taşınamıyor, atlanıyor", "home_page_locked_error_partner": "Ortak varlıklar kilitli klasöre taşınamıyor, atlanıyor",
"home_page_share_err_local": "Yerel öğeler bağlantı ile paylaşılamaz, atlanıyor", "home_page_share_err_local": "Yerel öğeler bağlantı ile paylaşılamaz, atlanıyor",
@ -1243,10 +1252,10 @@
"login_form_handshake_exception": "Sunucuda bir El Sıkışma İstisnası vardı. Kendi kendine imzalanmış bir sertifika kullanıyorsanız, ayarlar menüsünden kendi kendine imzalanmış sertifikalara izin verin.", "login_form_handshake_exception": "Sunucuda bir El Sıkışma İstisnası vardı. Kendi kendine imzalanmış bir sertifika kullanıyorsanız, ayarlar menüsünden kendi kendine imzalanmış sertifikalara izin verin.",
"login_form_password_hint": "parola", "login_form_password_hint": "parola",
"login_form_save_login": "Oturum açık kalsın", "login_form_save_login": "Oturum açık kalsın",
"login_form_server_empty": "Sunucu URL'si girin", "login_form_server_empty": "Sunucu URL'si girin.",
"login_form_server_error": "Sunucuya bağlanılamadı.", "login_form_server_error": "Sunucuya bağlanılamadı.",
"login_has_been_disabled": "Giriş devre dışı bırakıldı.", "login_has_been_disabled": "Giriş devre dışı bırakıldı.",
"login_password_changed_error": "Parolanız güncellenirken bir hata oluştu.", "login_password_changed_error": "Parolanız güncellenirken bir hata oluştu",
"login_password_changed_success": "Parola güncellendi", "login_password_changed_success": "Parola güncellendi",
"logout_all_device_confirmation": "Tüm cihazlarda oturum kapatmak istediğinizden emin misiniz?", "logout_all_device_confirmation": "Tüm cihazlarda oturum kapatmak istediğinizden emin misiniz?",
"logout_this_device_confirmation": "Bu cihazda oturum kapatmak istediğinizden emin misiniz?", "logout_this_device_confirmation": "Bu cihazda oturum kapatmak istediğinizden emin misiniz?",
@ -1257,6 +1266,7 @@
"main_branch_warning": "Geliştirme sürümü kullanıyorsunuz. Yayınlanan bir sürüm kullanmanızı önemle tavsiye ederiz!", "main_branch_warning": "Geliştirme sürümü kullanıyorsunuz. Yayınlanan bir sürüm kullanmanızı önemle tavsiye ederiz!",
"main_menu": "Ana menü", "main_menu": "Ana menü",
"make": "Marka", "make": "Marka",
"manage_geolocation": "Konumu yönet",
"manage_shared_links": "Paylaşılan bağlantıları yönet", "manage_shared_links": "Paylaşılan bağlantıları yönet",
"manage_sharing_with_partners": "Ortaklarla paylaşımı yönet", "manage_sharing_with_partners": "Ortaklarla paylaşımı yönet",
"manage_the_app_settings": "Uygulama ayarlarını yönet", "manage_the_app_settings": "Uygulama ayarlarını yönet",
@ -1265,7 +1275,7 @@
"manage_your_devices": "Cihazlarınızı yönetin", "manage_your_devices": "Cihazlarınızı yönetin",
"manage_your_oauth_connection": "OAuth bağlantınızı yönetin", "manage_your_oauth_connection": "OAuth bağlantınızı yönetin",
"map": "Harita", "map": "Harita",
"map_assets_in_bounds": "{count} fotoğraf", "map_assets_in_bounds": "{count, plural, =0 {Bu alanda fotoğraf yok} one {# photo} other {# photos}}",
"map_cannot_get_user_location": "Kullanıcının konumu alınamıyor", "map_cannot_get_user_location": "Kullanıcının konumu alınamıyor",
"map_location_dialog_yes": "Evet", "map_location_dialog_yes": "Evet",
"map_location_picker_page_use_location": "Bu konumu kullan", "map_location_picker_page_use_location": "Bu konumu kullan",
@ -1383,6 +1393,7 @@
"oauth": "OAuth", "oauth": "OAuth",
"official_immich_resources": "Resmi Immich Kaynakları", "official_immich_resources": "Resmi Immich Kaynakları",
"offline": "Çevrim dışı", "offline": "Çevrim dışı",
"offset": "Ofset",
"ok": "Tamam", "ok": "Tamam",
"oldest_first": "Eski olan önce", "oldest_first": "Eski olan önce",
"on_this_device": "Bu cihazda", "on_this_device": "Bu cihazda",
@ -1401,6 +1412,8 @@
"open_the_search_filters": "Arama filtrelerini aç", "open_the_search_filters": "Arama filtrelerini aç",
"options": "Seçenekler", "options": "Seçenekler",
"or": "veya", "or": "veya",
"organize_into_albums": "Albümler halinde düzenle",
"organize_into_albums_description": "Mevcut senkronizasyon ayarlarını kullanarak mevcut fotoğrafları albümlere ekleyin",
"organize_your_library": "Kütüphanenizi düzenleyin", "organize_your_library": "Kütüphanenizi düzenleyin",
"original": "orijinal", "original": "orijinal",
"other": "Diğer", "other": "Diğer",
@ -1460,6 +1473,8 @@
"permission_onboarding_permission_limited": "Sınırlı izin. Immich'in tüm fotoğrav ve videolarınızı yedeklemesine ve yönetmesine izin vermek için Ayarlar'da fotoğraf ve video izinlerini verin.", "permission_onboarding_permission_limited": "Sınırlı izin. Immich'in tüm fotoğrav ve videolarınızı yedeklemesine ve yönetmesine izin vermek için Ayarlar'da fotoğraf ve video izinlerini verin.",
"permission_onboarding_request": "Immich'in fotoğraflarınızı ve videolarınızı görüntüleyebilmesi için izne ihtiyacı var.", "permission_onboarding_request": "Immich'in fotoğraflarınızı ve videolarınızı görüntüleyebilmesi için izne ihtiyacı var.",
"person": "Kişi", "person": "Kişi",
"person_age_months": "{months, plural, one {# month} other {# months}} eski",
"person_age_year_months": "1 yıl, {months, plural, one {# month} other {# months}} eski",
"person_age_years": "{years, plural, other {# sene}} önce", "person_age_years": "{years, plural, other {# sene}} önce",
"person_birthdate": "{date} tarihinde doğdu", "person_birthdate": "{date} tarihinde doğdu",
"person_hidden": "{name}{hidden, select, true { (gizli)} other {}}", "person_hidden": "{name}{hidden, select, true { (gizli)} other {}}",
@ -1500,6 +1515,7 @@
"profile_drawer_client_out_of_date_minor": "Mobil uygulama güncel değil. Lütfen en son sürüme güncelleyin.", "profile_drawer_client_out_of_date_minor": "Mobil uygulama güncel değil. Lütfen en son sürüme güncelleyin.",
"profile_drawer_client_server_up_to_date": "Uygulama ve sunucu güncel", "profile_drawer_client_server_up_to_date": "Uygulama ve sunucu güncel",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Salt okunur mod etkinleştirildi. Çıkmak için kullanıcı avatar simgesine iki kez dokunun.",
"profile_drawer_server_out_of_date_major": "Sunucu güncel değil. Lütfen en son ana sürüme güncelleyin.", "profile_drawer_server_out_of_date_major": "Sunucu güncel değil. Lütfen en son ana sürüme güncelleyin.",
"profile_drawer_server_out_of_date_minor": "Sunucu güncel değil. Lütfen en son sürüme güncelleyin.", "profile_drawer_server_out_of_date_minor": "Sunucu güncel değil. Lütfen en son sürüme güncelleyin.",
"profile_image_of_user": "{user} kullanıcısının profil resmi", "profile_image_of_user": "{user} kullanıcısının profil resmi",
@ -1538,6 +1554,7 @@
"purchase_server_description_2": "Destekçi statüsü", "purchase_server_description_2": "Destekçi statüsü",
"purchase_server_title": "Sunucu", "purchase_server_title": "Sunucu",
"purchase_settings_server_activated": "Sunucu ürün anahtarı, yönetici tarafından yönetilir", "purchase_settings_server_activated": "Sunucu ürün anahtarı, yönetici tarafından yönetilir",
"query_asset_id": "Varlık Kimliği Sorgulama",
"queue_status": "Sırada {count}/{total}", "queue_status": "Sırada {count}/{total}",
"rating": "Derecelendirme", "rating": "Derecelendirme",
"rating_clear": "Derecelendirmeyi temizle", "rating_clear": "Derecelendirmeyi temizle",
@ -1545,6 +1562,8 @@
"rating_description": "EXIF derecelendirmesini bilgi panelinde göster", "rating_description": "EXIF derecelendirmesini bilgi panelinde göster",
"reaction_options": "Tepki seçenekleri", "reaction_options": "Tepki seçenekleri",
"read_changelog": "Değişiklik günlüğünü oku", "read_changelog": "Değişiklik günlüğünü oku",
"readonly_mode_disabled": "Salt okunur mod devre dışı",
"readonly_mode_enabled": "Salt okunur mod etkin",
"reassign": "Yeniden ata", "reassign": "Yeniden ata",
"reassigned_assets_to_existing_person": "{count, plural, one {# dosya} other {# dosya}} {name, select, null {mevcut bir kişiye} other {{name}}} atandı", "reassigned_assets_to_existing_person": "{count, plural, one {# dosya} other {# dosya}} {name, select, null {mevcut bir kişiye} other {{name}}} atandı",
"reassigned_assets_to_new_person": "{count, plural, one {# dosya} other {# dosya}} yeni bir kişiye atandı", "reassigned_assets_to_new_person": "{count, plural, one {# dosya} other {# dosya}} yeni bir kişiye atandı",
@ -1687,7 +1706,7 @@
"search_result_page_new_search_hint": "Yeni Arama", "search_result_page_new_search_hint": "Yeni Arama",
"search_settings": "Ayarları ara", "search_settings": "Ayarları ara",
"search_state": "Eyalet/İl ara...", "search_state": "Eyalet/İl ara...",
"search_suggestion_list_smart_search_hint_1": "Akıllı arama varsayılan olarak etkindir, meta verileri aramak için syntax kullanın", "search_suggestion_list_smart_search_hint_1": "Akıllı arama varsayılan olarak etkindir, meta verileri aramak için şu sözdizimini kullanın ",
"search_suggestion_list_smart_search_hint_2": "m:meta-veri-araması", "search_suggestion_list_smart_search_hint_2": "m:meta-veri-araması",
"search_tags": "Etiketleri ara...", "search_tags": "Etiketleri ara...",
"search_timezone": "Saat dilimi ara...", "search_timezone": "Saat dilimi ara...",
@ -1714,6 +1733,7 @@
"select_user_for_sharing_page_err_album": "Albüm oluşturulamadı", "select_user_for_sharing_page_err_album": "Albüm oluşturulamadı",
"selected": "Seçildi", "selected": "Seçildi",
"selected_count": "{count, plural, other {# seçildi}}", "selected_count": "{count, plural, other {# seçildi}}",
"selected_gps_coordinates": "Seçilen GPS Koordinatları",
"send_message": "Mesaj gönder", "send_message": "Mesaj gönder",
"send_welcome_email": "Hoş geldin e-postası gönder", "send_welcome_email": "Hoş geldin e-postası gönder",
"server_endpoint": "Sunucu Uç Noktası", "server_endpoint": "Sunucu Uç Noktası",
@ -1896,7 +1916,7 @@
"sync_albums_manual_subtitle": "Yüklenmiş fotoğraf ve videoları yedekleme için seçili albümler ile eşzamanlayın", "sync_albums_manual_subtitle": "Yüklenmiş fotoğraf ve videoları yedekleme için seçili albümler ile eşzamanlayın",
"sync_local": "Yerel Senkronizasyon", "sync_local": "Yerel Senkronizasyon",
"sync_remote": "Uzaktan Senkronizasyon", "sync_remote": "Uzaktan Senkronizasyon",
"sync_upload_album_setting_subtitle": "Seçili albümleri Immich'te oluşturun ve içindekileri Immich'e yükleyin.", "sync_upload_album_setting_subtitle": "Fotoğraflarınızı ve videolarınızı oluşturun ve Immich'te seçtiğiniz albümlere yükleyin",
"tag": "Etiket", "tag": "Etiket",
"tag_assets": "Dosyaları etiketle", "tag_assets": "Dosyaları etiketle",
"tag_created": "Etiket oluşturuldu: {tag}", "tag_created": "Etiket oluşturuldu: {tag}",
@ -1922,7 +1942,7 @@
"theme_setting_system_primary_color_title": "Sistem rengini kullan", "theme_setting_system_primary_color_title": "Sistem rengini kullan",
"theme_setting_system_theme_switch": "Otomatik (sistem ayarına göre)", "theme_setting_system_theme_switch": "Otomatik (sistem ayarına göre)",
"theme_setting_theme_subtitle": "Uygulama teması seç", "theme_setting_theme_subtitle": "Uygulama teması seç",
"theme_setting_three_stage_loading_subtitle": "Üç aşamalı yükleme, yükleme performansını artırabilir ancak önemli ölçüde daha yüksek ağ yüküne sebep olur.", "theme_setting_three_stage_loading_subtitle": "Üç aşamalı yükleme, yükleme performansını artırabilir ancak önemli ölçüde daha yüksek ağ yüküne sebep olur",
"theme_setting_three_stage_loading_title": "Üç aşamalı yüklemeyi etkinleştir", "theme_setting_three_stage_loading_title": "Üç aşamalı yüklemeyi etkinleştir",
"they_will_be_merged_together": "Birlikte birleştirilecekler", "they_will_be_merged_together": "Birlikte birleştirilecekler",
"third_party_resources": "Üçüncü taraf kaynaklar", "third_party_resources": "Üçüncü taraf kaynaklar",
@ -1985,6 +2005,7 @@
"unstacked_assets_count": "{count, plural, one {# dosya} other {# dosya}} yığını kaldırıldı", "unstacked_assets_count": "{count, plural, one {# dosya} other {# dosya}} yığını kaldırıldı",
"untagged": "Etiketlenmemiş", "untagged": "Etiketlenmemiş",
"up_next": "Sıradaki", "up_next": "Sıradaki",
"update_location_action_prompt": "Seçilen {count} varlığın konumunu şu şekilde güncelleyin:",
"updated_at": "Güncellenme", "updated_at": "Güncellenme",
"updated_password": "Şifreyi güncelle", "updated_password": "Şifreyi güncelle",
"upload": "Yükle", "upload": "Yükle",
@ -2051,6 +2072,7 @@
"view_next_asset": "Sonraki dosyayı görüntüle", "view_next_asset": "Sonraki dosyayı görüntüle",
"view_previous_asset": "Önceki dosyayı görüntüle", "view_previous_asset": "Önceki dosyayı görüntüle",
"view_qr_code": "QR kodu görüntüle", "view_qr_code": "QR kodu görüntüle",
"view_similar_photos": "Benzer fotoğrafları görüntüle",
"view_stack": "Yığını görüntüle", "view_stack": "Yığını görüntüle",
"view_user": "Kullanıcıyı Görüntüle", "view_user": "Kullanıcıyı Görüntüle",
"viewer_remove_from_stack": "Yığından Kaldır", "viewer_remove_from_stack": "Yığından Kaldır",

View file

@ -39,7 +39,7 @@
"admin": { "admin": {
"add_exclusion_pattern_description": "Додайте шаблони виключень. Підстановка з використанням *, ** та ? підтримується. Для ігнорування всіх файлів у будь-якому каталозі з ім'ям «Raw», використовуйте \"**/Raw/**\". Для ігнорування всіх файлів, що закінчуються на \".tif\", використовуйте \"**/*.tif\". Для ігнорування абсолютного шляху використовуйте \"/path/to/ignore/**\".", "add_exclusion_pattern_description": "Додайте шаблони виключень. Підстановка з використанням *, ** та ? підтримується. Для ігнорування всіх файлів у будь-якому каталозі з ім'ям «Raw», використовуйте \"**/Raw/**\". Для ігнорування всіх файлів, що закінчуються на \".tif\", використовуйте \"**/*.tif\". Для ігнорування абсолютного шляху використовуйте \"/path/to/ignore/**\".",
"admin_user": "Адміністратор", "admin_user": "Адміністратор",
"asset_offline_description": "Цей файл зовнішньої бібліотеки не знайдено на диску і був переміщений до смітника. Якщо файл був переміщений у межах бібліотеки, перевірте свою стрічку на наявність нового відповідного файлу. Щоб відновити цей файл, переконайтеся, що шлях до файлу доступний для Immich, і проскануйте бібліотеку.", "asset_offline_description": "Цей файл зовнішньої бібліотеки не знайдено на диску і був переміщений до кошика. Якщо файл був переміщений у межах бібліотеки, перевірте свою стрічку на наявність нового відповідного файлу. Щоб відновити цей файл, переконайтеся, що шлях до файлу доступний для Immich, і проскануйте бібліотеку.",
"authentication_settings": "Налаштування аутентифікації", "authentication_settings": "Налаштування аутентифікації",
"authentication_settings_description": "Управління паролями, OAuth та іншими налаштуваннями аутентифікації", "authentication_settings_description": "Управління паролями, OAuth та іншими налаштуваннями аутентифікації",
"authentication_settings_disable_all": "Ви впевнені, що хочете вимкнути всі методи входу? Вхід буде повністю вимкнений.", "authentication_settings_disable_all": "Ви впевнені, що хочете вимкнути всі методи входу? Вхід буде повністю вимкнений.",
@ -70,14 +70,14 @@
"cron_expression_description": "Встановіть інтервал сканування, використовуючи формат cron. Для отримання додаткової інформації зверніться до напр. <link>Crontab Guru</link>", "cron_expression_description": "Встановіть інтервал сканування, використовуючи формат cron. Для отримання додаткової інформації зверніться до напр. <link>Crontab Guru</link>",
"cron_expression_presets": "Попередні налаштування cron виразів", "cron_expression_presets": "Попередні налаштування cron виразів",
"disable_login": "Вимкнути вхід", "disable_login": "Вимкнути вхід",
"duplicate_detection_job_description": "Запустити машинне навчання на активах для виявлення схожих зображень. Залежить від інтелектуального пошуку", "duplicate_detection_job_description": "Запустити машинне навчання на ресурсах для виявлення схожих зображень. Використовує інтелектуальний пошук",
"exclusion_pattern_description": "Шаблони виключень дозволяють ігнорувати файли та папки під час сканування вашої бібліотеки. Це корисно, якщо у вас є папки, які містять файли, які ви не хочете імпортувати, наприклад, RAW-файли.", "exclusion_pattern_description": "Шаблони виключень дозволяють ігнорувати файли та папки під час сканування вашої бібліотеки. Це корисно, якщо у вас є папки, які містять файли, які ви не хочете імпортувати, наприклад, RAW-файли.",
"external_library_management": "Керування зовнішніми бібліотеками", "external_library_management": "Керування зовнішніми бібліотеками",
"face_detection": "Виявлення обличчя", "face_detection": "Виявлення обличчя",
"face_detection_description": "Виявлення облич на медіафайлах за допомогою машинного навчання. Для відео обробляється лише ескіз. \"Оновити\" повторно обробляє всі файли. \"Скинути\" додатково очищає всі поточні дані про обличчя. \"Відсутні\" ставить у чергу файли, які ще не були оброблені. Виявлені обличчя будуть поставлені в чергу для розпізнавання після завершення виявлення, групуючи їх у вже існуючих або нових людей.", "face_detection_description": "Виявлення облич на медіафайлах за допомогою машинного навчання. Для відео обробляється лише ескіз. \"Оновити\" повторно обробляє всі файли. \"Скинути\" додатково очищає всі поточні дані про обличчя. \"Відсутні\" ставить у чергу файли, які ще не були оброблені. Виявлені обличчя будуть поставлені в чергу для розпізнавання після завершення виявлення, групуючи їх у вже існуючих або нових людей.",
"facial_recognition_job_description": "Групування виявлених облич у людей. Цей крок виконується після завершення виявлення облич. \"Скинути\" повторно кластеризує всі обличчя. \"Відсутні\" ставить у чергу обличчя, яким ще не призначено людину.", "facial_recognition_job_description": "Групування виявлених облич у людей. Цей крок виконується після завершення виявлення облич. \"Скинути\" повторно кластеризує всі обличчя. \"Відсутні\" ставить у чергу обличчя, яким ще не призначено людину.",
"failed_job_command": "Команда {command} не виконалася для завдання: {job}", "failed_job_command": "Команда {command} не виконалася для завдання: {job}",
"force_delete_user_warning": "ПОПЕРЕДЖЕННЯ: Це негайно призведе до видалення користувача і всіх активів. Цю дію не можна скасувати, і файли не можна буде відновити.", "force_delete_user_warning": "ПОПЕРЕДЖЕННЯ: Це негайно призведе до видалення користувача і всіх ресурсів. Цю дію не можна скасувати, і файли не можна буде відновити.",
"image_format": "Формат", "image_format": "Формат",
"image_format_description": "Формат WebP виробляє меньші файлів, ніж JPEG, але його кодування вимагає більше часу.", "image_format_description": "Формат WebP виробляє меньші файлів, ніж JPEG, але його кодування вимагає більше часу.",
"image_fullsize_description": "Повнорозмірне зображення з видаленими метаданими, які використовуються під час збільшення", "image_fullsize_description": "Повнорозмірне зображення з видаленими метаданими, які використовуються під час збільшення",
@ -261,7 +261,7 @@
"sidecar_job_description": "Виявлення або синхронізація метаданих додатків з файлової системи", "sidecar_job_description": "Виявлення або синхронізація метаданих додатків з файлової системи",
"slideshow_duration_description": "Кількість секунд для відображення кожного зображення", "slideshow_duration_description": "Кількість секунд для відображення кожного зображення",
"smart_search_job_description": "Запуск машинного навчання для ресурсів для підтримки розумного пошуку", "smart_search_job_description": "Запуск машинного навчання для ресурсів для підтримки розумного пошуку",
"storage_template_date_time_description": "Позначка часу створення активу використовується для інформації про дату й час", "storage_template_date_time_description": "Позначка часу створення ресурсу використовується для інформації про дату й час",
"storage_template_date_time_sample": "Час вибірки {date}", "storage_template_date_time_sample": "Час вибірки {date}",
"storage_template_enable_description": "Ввімкнути механізм шаблонів сховища", "storage_template_enable_description": "Ввімкнути механізм шаблонів сховища",
"storage_template_hash_verification_enabled": "Увімкнено перевірку хешу", "storage_template_hash_verification_enabled": "Увімкнено перевірку хешу",
@ -353,11 +353,11 @@
"transcoding_two_pass_encoding_setting_description": "Транскодування за двома проходами для отримання кращих закодованих відео. Коли ввімкнено максимальний бітрейт (необхідний для роботи з H.264 та HEVC), цей режим використовує діапазон бітрейту, заснований на максимальному бітрейті, і ігнорує CRF. Для VP9 можна використовувати CRF, якщо вимкнено максимальний бітрейт.", "transcoding_two_pass_encoding_setting_description": "Транскодування за двома проходами для отримання кращих закодованих відео. Коли ввімкнено максимальний бітрейт (необхідний для роботи з H.264 та HEVC), цей режим використовує діапазон бітрейту, заснований на максимальному бітрейті, і ігнорує CRF. Для VP9 можна використовувати CRF, якщо вимкнено максимальний бітрейт.",
"transcoding_video_codec": "Відеокодек", "transcoding_video_codec": "Відеокодек",
"transcoding_video_codec_description": "VP9 має високу ефективність і сумісність з вебом, але потребує більше часу на транскодування. HEVC працює схоже, але має меншу сумісність з вебом. H.264 має широку сумісність і швидко транскодується, але створює значно більші файли. AV1 - найефективніший кодек, але не підтримується на старіших пристроях.", "transcoding_video_codec_description": "VP9 має високу ефективність і сумісність з вебом, але потребує більше часу на транскодування. HEVC працює схоже, але має меншу сумісність з вебом. H.264 має широку сумісність і швидко транскодується, але створює значно більші файли. AV1 - найефективніший кодек, але не підтримується на старіших пристроях.",
"trash_enabled_description": "Увімкнення смітника", "trash_enabled_description": "Увімкнення кошика",
"trash_number_of_days": "Кількість днів", "trash_number_of_days": "Кількість днів",
"trash_number_of_days_description": "Кількість днів, щоб залишити ресурси в смітнику перед остаточним їх видаленням", "trash_number_of_days_description": "Кількість днів, протягом якої залишати ресурси в кошику перед їх остаточним видаленням",
"trash_settings": "Налаштування смітника", "trash_settings": "Налаштування кошика",
"trash_settings_description": "Керування налаштуваннями смітника", "trash_settings_description": "Керування налаштуваннями кошика",
"unlink_all_oauth_accounts": "Від’єднати всі облікові записи OAuth", "unlink_all_oauth_accounts": "Від’єднати всі облікові записи OAuth",
"unlink_all_oauth_accounts_description": "Не забудьте від’єднати всі облікові записи OAuth перед переходом до нового постачальника.", "unlink_all_oauth_accounts_description": "Не забудьте від’єднати всі облікові записи OAuth перед переходом до нового постачальника.",
"unlink_all_oauth_accounts_prompt": "Ви впевнені, що хочете від’єднати всі облікові записи OAuth? Це скине ідентифікатор OAuth для кожного користувача, і цю дію не можна буде скасувати.", "unlink_all_oauth_accounts_prompt": "Ви впевнені, що хочете від’єднати всі облікові записи OAuth? Це скине ідентифікатор OAuth для кожного користувача, і цю дію не можна буде скасувати.",
@ -389,7 +389,7 @@
"advanced": "Розширені", "advanced": "Розширені",
"advanced_settings_beta_timeline_subtitle": "Випробуйте новий інтерфейс застосунку", "advanced_settings_beta_timeline_subtitle": "Випробуйте новий інтерфейс застосунку",
"advanced_settings_beta_timeline_title": "Бета-версія стрічки", "advanced_settings_beta_timeline_title": "Бета-версія стрічки",
"advanced_settings_enable_alternate_media_filter_subtitle": "Використовуйте цей варіант для фільтрації медіафайлів під час синхронізації за альтернативними критеріями. Спробуйте це, якщо у вас виникають проблеми з тим, що додаток не виявляє всі альбоми.", "advanced_settings_enable_alternate_media_filter_subtitle": "Використовуйте цей варіант для фільтрації медіафайлів під час синхронізації за альтернативними критеріями. Спробуйте це, якщо у вас виникають проблеми з тим, що застосунок не виявляє всі альбоми.",
"advanced_settings_enable_alternate_media_filter_title": "[ЕКСПЕРИМЕНТАЛЬНИЙ] Використовуйте альтернативний фільтр синхронізації альбомів пристрою", "advanced_settings_enable_alternate_media_filter_title": "[ЕКСПЕРИМЕНТАЛЬНИЙ] Використовуйте альтернативний фільтр синхронізації альбомів пристрою",
"advanced_settings_log_level_title": "Рівень логування: {level}", "advanced_settings_log_level_title": "Рівень логування: {level}",
"advanced_settings_prefer_remote_subtitle": "Деякі пристрої вельми повільно завантажують мініатюри із елементів на пристрої. Активуйте цей параметр, щоб завантажувати зображення з серверу.", "advanced_settings_prefer_remote_subtitle": "Деякі пристрої вельми повільно завантажують мініатюри із елементів на пристрої. Активуйте цей параметр, щоб завантажувати зображення з серверу.",
@ -491,11 +491,11 @@
"asset_list_layout_sub_title": "Розмітка", "asset_list_layout_sub_title": "Розмітка",
"asset_list_settings_subtitle": "Налаштування вигляду сітки фото", "asset_list_settings_subtitle": "Налаштування вигляду сітки фото",
"asset_list_settings_title": "Фото-сітка", "asset_list_settings_title": "Фото-сітка",
"asset_offline": "Актив вимкнено", "asset_offline": "Ресурс офлайн",
"asset_offline_description": "Цей зовнішній актив більше не знайдено на диску. Будь ласка, зверніться до адміністратора Immich за допомогою.", "asset_offline_description": "Цей зовнішній ресурс більше не знайдено на диску. Будь ласка, зверніться до адміністратора Immich за допомогою.",
"asset_restored_successfully": "Елемент успішно відновлено", "asset_restored_successfully": "Елемент успішно відновлено",
"asset_skipped": "Пропущено", "asset_skipped": "Пропущено",
"asset_skipped_in_trash": "У смітнику", "asset_skipped_in_trash": "У кошику",
"asset_uploaded": "Завантажено", "asset_uploaded": "Завантажено",
"asset_uploading": "Завантаження…", "asset_uploading": "Завантаження…",
"asset_viewer_settings_subtitle": "Керуйте налаштуваннями переглядача галереї", "asset_viewer_settings_subtitle": "Керуйте налаштуваннями переглядача галереї",
@ -503,26 +503,26 @@
"assets": "елементи", "assets": "елементи",
"assets_added_count": "Додано {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}", "assets_added_count": "Додано {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}",
"assets_added_to_album_count": "Додано {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}} до альбому", "assets_added_to_album_count": "Додано {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}} до альбому",
"assets_added_to_albums_count": "Додано {assetTotal, plural, one {# актив} other {# активи}} до {albumTotal, plural, one {# альбом} other {# альбом}}", "assets_added_to_albums_count": "Додано {assetTotal, plural, one {# ресурс} other {# ресурси}} до {albumTotal, plural, one {# альбом} other {# альбом}}",
"assets_cannot_be_added_to_album_count": "{count, plural, one {Ресурс} other {Ресурси}} не можна додати до альбому", "assets_cannot_be_added_to_album_count": "{count, plural, one {Ресурс} other {Ресурси}} не можна додати до альбому",
"assets_cannot_be_added_to_albums": "{count, plural, one {Актив} other {Активи}} не можна додати до жодного з альбомів", "assets_cannot_be_added_to_albums": "{count, plural, one {Елемент} other {Елементи}} не можна додати до жодного з альбомів",
"assets_count": "{count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}", "assets_count": "{count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}",
"assets_deleted_permanently": "{count} елемент(и) остаточно видалено", "assets_deleted_permanently": "{count} елемент(и) остаточно видалено",
"assets_deleted_permanently_from_server": "{count} елемент(и) видалено назавжди з сервера Immich", "assets_deleted_permanently_from_server": "{count} елемент(и) видалено назавжди з сервера Immich",
"assets_downloaded_failed": "{count, plural, one {Завантажено # файл — {error} файл не вдалося} other {Завантажено # файлів — {error} файлів не вдалося}}", "assets_downloaded_failed": "{count, plural, one {Завантажено # файл — {error} файл не вдалося} other {Завантажено # файлів — {error} файлів не вдалося}}",
"assets_downloaded_successfully": "{count, plural, one {Успішно завантажено # файл} other {Успішно завантажено # файлів}}", "assets_downloaded_successfully": "{count, plural, one {Успішно завантажено # файл} other {Успішно завантажено # файлів}}",
"assets_moved_to_trash_count": "Переміщено {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}} у смітник", "assets_moved_to_trash_count": "Переміщено {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}} у кошик",
"assets_permanently_deleted_count": "Остаточно видалено {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}", "assets_permanently_deleted_count": "Остаточно видалено {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}",
"assets_removed_count": "Вилучено {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}", "assets_removed_count": "Вилучено {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}",
"assets_removed_permanently_from_device": "{count} елемент(и) видалені назавжди з вашого пристрою", "assets_removed_permanently_from_device": "{count} елемент(и) видалені назавжди з вашого пристрою",
"assets_restore_confirmation": "Ви впевнені, що хочете відновити всі свої активи з смітника? Цю дію не можна скасувати! Зверніть увагу, що будь-які офлайн-активи не можуть бути відновлені таким чином.", "assets_restore_confirmation": "Ви впевнені, що хочете відновити всі свої елементи з кошика? Цю дію не можна скасувати! Зверніть увагу, що жодні офлайн ресурси не можуть бути відновлені таким чином.",
"assets_restored_count": "Відновлено {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}", "assets_restored_count": "Відновлено {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}",
"assets_restored_successfully": "{count} елемент(и) успішно відновлено", "assets_restored_successfully": "{count} елемент(и) успішно відновлено",
"assets_trashed": "{count} елемент(и) поміщено до кошика", "assets_trashed": "{count} елемент(и) поміщено до кошика",
"assets_trashed_count": "Поміщено в смітник {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}", "assets_trashed_count": "Поміщено в кошик {count, plural, one {# ресурс} few {# ресурси} other {# ресурсів}}",
"assets_trashed_from_server": "{count} елемент(и) поміщено до кошика на сервері Immich", "assets_trashed_from_server": "{count} елемент(и) поміщено до кошика на сервері Immich",
"assets_were_part_of_album_count": "{count, plural, one {Ресурс був} few {Ресурси були} other {Ресурси були}} вже частиною альбому", "assets_were_part_of_album_count": "{count, plural, one {Ресурс був} few {Ресурси були} other {Ресурси були}} вже частиною альбому",
"assets_were_part_of_albums_count": "{count, plural, one {Актив був} other {Активи були}} вже є частиною альбомів", "assets_were_part_of_albums_count": "{count, plural, one {Елемент вже був} other {Елементи вже були}} частиною альбомів",
"authorized_devices": "Авторизовані пристрої", "authorized_devices": "Авторизовані пристрої",
"automatic_endpoint_switching_subtitle": "Підключатися локально через зазначену Wi-Fi мережу, коли це можливо, і використовувати альтернативні з'єднання в інших випадках", "automatic_endpoint_switching_subtitle": "Підключатися локально через зазначену Wi-Fi мережу, коли це можливо, і використовувати альтернативні з'єднання в інших випадках",
"automatic_endpoint_switching_title": "Автоматичне перемикання URL", "automatic_endpoint_switching_title": "Автоматичне перемикання URL",
@ -597,8 +597,6 @@
"backup_setting_subtitle": "Управління налаштуваннями завантаження у фоновому та активному режимі", "backup_setting_subtitle": "Управління налаштуваннями завантаження у фоновому та активному режимі",
"backup_settings_subtitle": "Керування налаштуваннями завантаження", "backup_settings_subtitle": "Керування налаштуваннями завантаження",
"backward": "Зворотній", "backward": "Зворотній",
"beta_sync": "Стан бета-синхронізації",
"beta_sync_subtitle": "Налаштування нової системи синхронізації",
"biometric_auth_enabled": "Біометрична автентифікація увімкнена", "biometric_auth_enabled": "Біометрична автентифікація увімкнена",
"biometric_locked_out": "Вам закрито доступ до біометричної автентифікації", "biometric_locked_out": "Вам закрито доступ до біометричної автентифікації",
"biometric_no_options": "Біометричні параметри недоступні", "biometric_no_options": "Біометричні параметри недоступні",
@ -611,12 +609,12 @@
"build_image": "Версія збірки", "build_image": "Версія збірки",
"bulk_delete_duplicates_confirmation": "Ви впевнені, що хочете масово видалити {count, plural, one {# дубльований ресурс} few {# дубльовані ресурси} other {# дубльованих ресурсів}}? Це дія залишить найбільший ресурс у кожній групі і остаточно видалить всі інші дублікати. Цю дію неможливо скасувати!", "bulk_delete_duplicates_confirmation": "Ви впевнені, що хочете масово видалити {count, plural, one {# дубльований ресурс} few {# дубльовані ресурси} other {# дубльованих ресурсів}}? Це дія залишить найбільший ресурс у кожній групі і остаточно видалить всі інші дублікати. Цю дію неможливо скасувати!",
"bulk_keep_duplicates_confirmation": "Ви впевнені, що хочете залишити {count, plural, one {# дубльований ресурс} few {# дубльовані ресурси} other {# дубльованих ресурсів}}? Це дозволить вирішити всі групи дублікатів без видалення чого-небудь.", "bulk_keep_duplicates_confirmation": "Ви впевнені, що хочете залишити {count, plural, one {# дубльований ресурс} few {# дубльовані ресурси} other {# дубльованих ресурсів}}? Це дозволить вирішити всі групи дублікатів без видалення чого-небудь.",
"bulk_trash_duplicates_confirmation": "Ви впевнені, що хочете викинути в смітник {count, plural, one {# дубльований ресурс} few {# дубльовані ресурси} other {# дубльованих ресурсів}} масово? Це залишить найбільший ресурс у кожній групі і викине в смітник всі інші дублікати.", "bulk_trash_duplicates_confirmation": "Ви впевнені, що хочете викинути в кошик {count, plural, one {# дубльований ресурс} few {# дубльовані ресурси} other {# дубльованих ресурсів}} масово? Це залишить найбільший ресурс у кожній групі і викине в кошик всі інші дублікати.",
"buy": "Придбайте Immich", "buy": "Придбайте Immich",
"cache_settings_clear_cache_button": "Очистити кеш", "cache_settings_clear_cache_button": "Очистити кеш",
"cache_settings_clear_cache_button_title": "Очищає кеш програми. Це суттєво знизить продуктивність програми, доки кеш не буде перебудовано.", "cache_settings_clear_cache_button_title": "Очищає кеш програми. Це суттєво знизить продуктивність програми, доки кеш не буде перебудовано.",
"cache_settings_duplicated_assets_clear_button": "ОЧИСТИТИ", "cache_settings_duplicated_assets_clear_button": "ОЧИСТИТИ",
"cache_settings_duplicated_assets_subtitle": "Фото та відео, які додаток ігнорує", "cache_settings_duplicated_assets_subtitle": "Фото та відео, які ігноруються застосунком",
"cache_settings_duplicated_assets_title": "Дубльовані елементи ({count})", "cache_settings_duplicated_assets_title": "Дубльовані елементи ({count})",
"cache_settings_statistics_album": "Бібліотечні мініатюри", "cache_settings_statistics_album": "Бібліотечні мініатюри",
"cache_settings_statistics_full": "Повнорзомірні зображення", "cache_settings_statistics_full": "Повнорзомірні зображення",
@ -656,9 +654,9 @@
"change_pin_code": "Змінити PIN-код", "change_pin_code": "Змінити PIN-код",
"change_your_password": "Змініть свій пароль", "change_your_password": "Змініть свій пароль",
"changed_visibility_successfully": "Видимість успішно змінено", "changed_visibility_successfully": "Видимість успішно змінено",
"check_corrupt_asset_backup": "Перевірити на пошкоджені резервні копії активів", "check_corrupt_asset_backup": "Перевірити на пошкоджені резервні копії ресурсів",
"check_corrupt_asset_backup_button": "Виконати перевірку", "check_corrupt_asset_backup_button": "Виконати перевірку",
"check_corrupt_asset_backup_description": "Запустіть цю перевірку лише через Wi-Fi та після того, як всі активи будуть завантажені на сервер. Процес може зайняти кілька хвилин.", "check_corrupt_asset_backup_description": "Запустити цю перевірку лише через Wi-Fi та після того, як всі ресурси будуть завантажені на сервер. Процес може зайняти кілька хвилин.",
"check_logs": "Перевірити журнали", "check_logs": "Перевірити журнали",
"choose_matching_people_to_merge": "Виберіть людей для об'єднання", "choose_matching_people_to_merge": "Виберіть людей для об'єднання",
"city": "Місто", "city": "Місто",
@ -691,7 +689,7 @@
"completed": "Завершено", "completed": "Завершено",
"confirm": "Підтвердіть", "confirm": "Підтвердіть",
"confirm_admin_password": "Підтвердити пароль адміністратора", "confirm_admin_password": "Підтвердити пароль адміністратора",
"confirm_delete_face": "Ви впевнені, що хочете видалити обличчя {name} з активу?", "confirm_delete_face": "Ви впевнені, що хочете видалити обличчя {name} з елементу?",
"confirm_delete_shared_link": "Ви впевнені, що хочете видалити це спільне посилання?", "confirm_delete_shared_link": "Ви впевнені, що хочете видалити це спільне посилання?",
"confirm_keep_this_delete_others": "Усі інші ресурси в стеку буде видалено, окрім цього ресурсу. Ви впевнені, що хочете продовжити?", "confirm_keep_this_delete_others": "Усі інші ресурси в стеку буде видалено, окрім цього ресурсу. Ви впевнені, що хочете продовжити?",
"confirm_new_pin_code": "Підтвердьте новий PIN-код", "confirm_new_pin_code": "Підтвердьте новий PIN-код",
@ -732,7 +730,7 @@
"create_link_to_share_description": "Дозволити перегляд вибраних фотографій за посиланням будь-кому", "create_link_to_share_description": "Дозволити перегляд вибраних фотографій за посиланням будь-кому",
"create_new": "СТВОРИТИ НОВИЙ", "create_new": "СТВОРИТИ НОВИЙ",
"create_new_person": "Створити нову особу", "create_new_person": "Створити нову особу",
"create_new_person_hint": "Призначити обраним активам нову особу", "create_new_person_hint": "Призначити обраним елементам нову особу",
"create_new_user": "Створити нового користувача", "create_new_user": "Створити нового користувача",
"create_shared_album_page_share_add_assets": "ДОДАТИ ЕЛЕМЕНТИ", "create_shared_album_page_share_add_assets": "ДОДАТИ ЕЛЕМЕНТИ",
"create_shared_album_page_share_select_photos": "Вибрати фото", "create_shared_album_page_share_select_photos": "Вибрати фото",
@ -797,7 +795,7 @@
"delete_tag_confirmation_prompt": "Ви впевнені, що хочете видалити тег {tagName}?", "delete_tag_confirmation_prompt": "Ви впевнені, що хочете видалити тег {tagName}?",
"delete_user": "Видалити користувача", "delete_user": "Видалити користувача",
"deleted_shared_link": "Видалено загальне посилання", "deleted_shared_link": "Видалено загальне посилання",
"deletes_missing_assets": "Видаляє активи, які відсутні на диску", "deletes_missing_assets": "Видаляє ресурси, які відсутні на диску",
"description": "Опис", "description": "Опис",
"description_input_hint_text": "Додати опис...", "description_input_hint_text": "Додати опис...",
"description_input_submit_error": "Помилка оновлення опису, перевірте логи для подробиць", "description_input_submit_error": "Помилка оновлення опису, перевірте логи для подробиць",
@ -877,8 +875,8 @@
"email": "Електронна пошта", "email": "Електронна пошта",
"email_notifications": "Сповіщення ел. поштою", "email_notifications": "Сповіщення ел. поштою",
"empty_folder": "Ця папка порожня", "empty_folder": "Ця папка порожня",
"empty_trash": "Очистити смітник", "empty_trash": "Очистити кошик",
"empty_trash_confirmation": "Ви впевнені, що хочете очистити смітник? Це остаточно видалить всі ресурси в смітнику з Immich.\nЦю дію не можна скасувати!", "empty_trash_confirmation": "Ви впевнені, що хочете очистити кошик? Це остаточно видалить всі ресурси в кошику з Immich.\nЦю дію не можна скасувати!",
"enable": "Увімкнути", "enable": "Увімкнути",
"enable_backup": "Увімкнути резервне копіювання", "enable_backup": "Увімкнути резервне копіювання",
"enable_biometric_auth_description": "Введіть свій PIN-код, щоб увімкнути біометричну автентифікацію", "enable_biometric_auth_description": "Введіть свій PIN-код, щоб увімкнути біометричну автентифікацію",
@ -890,7 +888,7 @@
"enter_your_pin_code_subtitle": "Введіть свій PIN-код, щоб отримати доступ до особистої папки", "enter_your_pin_code_subtitle": "Введіть свій PIN-код, щоб отримати доступ до особистої папки",
"error": "Помилка", "error": "Помилка",
"error_change_sort_album": "Не вдалося змінити порядок сортування альбому", "error_change_sort_album": "Не вдалося змінити порядок сортування альбому",
"error_delete_face": "Помилка при видаленні обличчя з активу", "error_delete_face": "Помилка при видаленні обличчя з елементу",
"error_loading_image": "Помилка завантаження зображення", "error_loading_image": "Помилка завантаження зображення",
"error_saving_image": "Помилка: {error}", "error_saving_image": "Помилка: {error}",
"error_tag_face_bounding_box": "Помилка під час позначення обличчя не вдалося отримати координати рамки", "error_tag_face_bounding_box": "Помилка під час позначення обличчя не вдалося отримати координати рамки",
@ -967,7 +965,7 @@
"unable_to_download_files": "Неможливо завантажити файли", "unable_to_download_files": "Неможливо завантажити файли",
"unable_to_edit_exclusion_pattern": "Не вдалося редагувати шаблон виключення", "unable_to_edit_exclusion_pattern": "Не вдалося редагувати шаблон виключення",
"unable_to_edit_import_path": "Неможливо відредагувати шлях імпорту", "unable_to_edit_import_path": "Неможливо відредагувати шлях імпорту",
"unable_to_empty_trash": "Неможливо очистити смітник", "unable_to_empty_trash": "Неможливо очистити кошик",
"unable_to_enter_fullscreen": "Неможливо увійти в повноекранний режим", "unable_to_enter_fullscreen": "Неможливо увійти в повноекранний режим",
"unable_to_exit_fullscreen": "Неможливо вийти з повноекранного режиму", "unable_to_exit_fullscreen": "Неможливо вийти з повноекранного режиму",
"unable_to_get_comments_number": "Не вдалося отримати кількість коментарів", "unable_to_get_comments_number": "Не вдалося отримати кількість коментарів",
@ -991,7 +989,7 @@
"unable_to_reset_password": "Не вдається скинути пароль", "unable_to_reset_password": "Не вдається скинути пароль",
"unable_to_reset_pin_code": "Неможливо скинути PIN-код", "unable_to_reset_pin_code": "Неможливо скинути PIN-код",
"unable_to_resolve_duplicate": "Не вдається вирішити дублікат", "unable_to_resolve_duplicate": "Не вдається вирішити дублікат",
"unable_to_restore_assets": "Неможливо відновити активи", "unable_to_restore_assets": "Неможливо відновити елементи",
"unable_to_restore_trash": "Не вдалося відновити вміст", "unable_to_restore_trash": "Не вдалося відновити вміст",
"unable_to_restore_user": "Не вдається відновити користувача", "unable_to_restore_user": "Не вдається відновити користувача",
"unable_to_save_album": "Не вдається зберегти альбом", "unable_to_save_album": "Не вдається зберегти альбом",
@ -1005,7 +1003,7 @@
"unable_to_set_feature_photo": "Не вдалося встановити фотографію на обкладинку", "unable_to_set_feature_photo": "Не вдалося встановити фотографію на обкладинку",
"unable_to_set_profile_picture": "Не вдається встановити зображення профілю", "unable_to_set_profile_picture": "Не вдається встановити зображення профілю",
"unable_to_submit_job": "Не вдалося відправити завдання", "unable_to_submit_job": "Не вдалося відправити завдання",
"unable_to_trash_asset": "Неможливо вилучити актив", "unable_to_trash_asset": "Неможливо видалити елемент",
"unable_to_unlink_account": "Не вдається відв'язати обліковий запис", "unable_to_unlink_account": "Не вдається відв'язати обліковий запис",
"unable_to_unlink_motion_video": "Не вдається від'єднати рухоме відео", "unable_to_unlink_motion_video": "Не вдається від'єднати рухоме відео",
"unable_to_update_album_cover": "Неможливо оновити обкладинку альбому", "unable_to_update_album_cover": "Неможливо оновити обкладинку альбому",
@ -1043,7 +1041,7 @@
"external": "Зовнішні", "external": "Зовнішні",
"external_libraries": "Зовнішні бібліотеки", "external_libraries": "Зовнішні бібліотеки",
"external_network": "Зовнішня мережа", "external_network": "Зовнішня мережа",
"external_network_sheet_info": "Коли ви не підключені до переважної мережі Wi-Fi, додаток підключатиметься до сервера через першу з наведених нижче URL-адрес, яку він зможе досягти, починаючи зверху вниз", "external_network_sheet_info": "Коли ви не підключені до обраної мережі Wi-Fi, застосунок підключатиметься до сервера через першу з наведених нижче URL-адрес, яку він зможе досягти, починаючи зверху вниз",
"face_unassigned": "Не призначено", "face_unassigned": "Не призначено",
"failed": "Не вдалося", "failed": "Не вдалося",
"failed_to_authenticate": "Помилка автентифікації", "failed_to_authenticate": "Помилка автентифікації",
@ -1076,10 +1074,7 @@
"gcast_enabled": "Google Cast'", "gcast_enabled": "Google Cast'",
"gcast_enabled_description": "Ця функція завантажує зовнішні ресурси з Google для своєї роботи.", "gcast_enabled_description": "Ця функція завантажує зовнішні ресурси з Google для своєї роботи.",
"general": "Загальні", "general": "Загальні",
"geolocation_instruction_all_have_location": "Усі об’єкти для цієї дати вже мають дані про місцезнаходження. Спробуйте показати всі об’єкти або виберіть іншу дату",
"geolocation_instruction_location": "Натисніть на об'єкт із GPS-координатами, щоб використати його місцезнаходження, або виберіть місцезнаходження безпосередньо на карті", "geolocation_instruction_location": "Натисніть на об'єкт із GPS-координатами, щоб використати його місцезнаходження, або виберіть місцезнаходження безпосередньо на карті",
"geolocation_instruction_no_date": "Виберіть дату для керування даними про місцезнаходження для фотографій і відео за цей день",
"geolocation_instruction_no_photos": "Для цієї дати не знайдено фотографій чи відео. Виберіть іншу дату, щоб показати їх",
"get_help": "Отримати допомогу", "get_help": "Отримати допомогу",
"get_wifiname_error": "Не вдалося отримати назву Wi-Fi. Переконайтеся, що ви надали необхідні дозволи та підключені до Wi-Fi мережі", "get_wifiname_error": "Не вдалося отримати назву Wi-Fi. Переконайтеся, що ви надали необхідні дозволи та підключені до Wi-Fi мережі",
"getting_started": "Початок", "getting_started": "Початок",
@ -1160,7 +1155,7 @@
"in_archive": "В архіві", "in_archive": "В архіві",
"include_archived": "Відображати архів", "include_archived": "Відображати архів",
"include_shared_albums": "Включити спільні альбоми", "include_shared_albums": "Включити спільні альбоми",
"include_shared_partner_assets": "Включайте спільні партнерські активи", "include_shared_partner_assets": "Включайте спільні партнерські ресурси",
"individual_share": "Індивідуальний доступ", "individual_share": "Індивідуальний доступ",
"individual_shares": "Окремі спільні доступи", "individual_shares": "Окремі спільні доступи",
"info": "Інформація", "info": "Інформація",
@ -1224,7 +1219,7 @@
"local_asset_cast_failed": "Неможливо транслювати ресурс, який не завантажено на сервер", "local_asset_cast_failed": "Неможливо транслювати ресурс, який не завантажено на сервер",
"local_assets": "Локальні фото та відео", "local_assets": "Локальні фото та відео",
"local_network": "Локальна мережа", "local_network": "Локальна мережа",
"local_network_sheet_info": "Додаток підключатиметься до сервера через цей URL, коли використовується вказана Wi-Fi мережа", "local_network_sheet_info": "Застосунок підключатиметься до сервера через цей URL, коли використовується вказана Wi-Fi мережа",
"location_permission": "Дозвіл до місцезнаходження", "location_permission": "Дозвіл до місцезнаходження",
"location_permission_content": "Щоб перемикати мережі у фоновому режимі, Immich має завжди мати доступ до точної геолокації, щоб зчитувати назву Wi-Fi мережі", "location_permission_content": "Щоб перемикати мережі у фоновому режимі, Immich має завжди мати доступ до точної геолокації, щоб зчитувати назву Wi-Fi мережі",
"location_picker_choose_on_map": "Обрати на мапі", "location_picker_choose_on_map": "Обрати на мапі",
@ -1335,9 +1330,9 @@
"move_to_lock_folder_action_prompt": "{count} додано до захищеної теки", "move_to_lock_folder_action_prompt": "{count} додано до захищеної теки",
"move_to_locked_folder": "Перемістити до особистої папки", "move_to_locked_folder": "Перемістити до особистої папки",
"move_to_locked_folder_confirmation": "Ці фото та відео буде видалено зі всіх альбомів і їх можна буде переглядати лише в особистій папці", "move_to_locked_folder_confirmation": "Ці фото та відео буде видалено зі всіх альбомів і їх можна буде переглядати лише в особистій папці",
"moved_to_archive": "Переміщено {count, plural, one {# актив} other {# активів}} в архів", "moved_to_archive": "Переміщено {count, plural, one {# елемент} other {# елементів}} в архів",
"moved_to_library": "Переміщено {count, plural, one {# актив} other {# активів}} в бібліотеку", "moved_to_library": "Переміщено {count, plural, one {# елемент} other {# елементів}} в бібліотеку",
"moved_to_trash": "Перенесено до смітника", "moved_to_trash": "Перенесено до кошика",
"multiselect_grid_edit_date_time_err_read_only": "Неможливо редагувати дату елементів лише для читання, пропущено", "multiselect_grid_edit_date_time_err_read_only": "Неможливо редагувати дату елементів лише для читання, пропущено",
"multiselect_grid_edit_gps_err_read_only": "Неможливо редагувати місцезнаходження елементів лише для читання, пропущено", "multiselect_grid_edit_gps_err_read_only": "Неможливо редагувати місцезнаходження елементів лише для читання, пропущено",
"mute_memories": "Приглушити спогади", "mute_memories": "Приглушити спогади",
@ -1516,11 +1511,11 @@
"privacy": "Конфіденційність", "privacy": "Конфіденційність",
"profile": "Профіль", "profile": "Профіль",
"profile_drawer_app_logs": "Журнал", "profile_drawer_app_logs": "Журнал",
"profile_drawer_client_out_of_date_major": "Мобільний додаток застарів. Будь ласка, оновіть до останньої мажорної версії.", "profile_drawer_client_out_of_date_major": "Мобільний застосунок застарів. Будь ласка, оновіть до останньої мажорної версії.",
"profile_drawer_client_out_of_date_minor": "Мобільний додаток застарів. Будь ласка, оновіть до останньої мінорної версії.", "profile_drawer_client_out_of_date_minor": "Мобільний застосунок застарів. Будь ласка, оновіть до останньої мінорної версії.",
"profile_drawer_client_server_up_to_date": "Клієнт та сервер — актуальні", "profile_drawer_client_server_up_to_date": "Клієнт та сервер — актуальні",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "Режим лише для читання ввімкнено. Двічі торкніться значка аватара користувача, щоб вийти.", "profile_drawer_readonly_mode": "Режим лише для читання ввімкнено. Щоб вийти, довго натисніть значок аватара користувача.",
"profile_drawer_server_out_of_date_major": "Сервер застарів. Будь ласка, оновіть до останньої мажорної версії.", "profile_drawer_server_out_of_date_major": "Сервер застарів. Будь ласка, оновіть до останньої мажорної версії.",
"profile_drawer_server_out_of_date_minor": "Сервер застарів. Будь ласка, оновіть до останньої мінорної версії.", "profile_drawer_server_out_of_date_minor": "Сервер застарів. Будь ласка, оновіть до останньої мінорної версії.",
"profile_image_of_user": "Зображення профілю {user}", "profile_image_of_user": "Зображення профілю {user}",
@ -1617,7 +1612,7 @@
"removed_from_favorites_count": "{count, plural, other {Видалено #}} з обраних", "removed_from_favorites_count": "{count, plural, other {Видалено #}} з обраних",
"removed_memory": "Видалена пам'ять", "removed_memory": "Видалена пам'ять",
"removed_photo_from_memory": "Фото видалене з пам'яті", "removed_photo_from_memory": "Фото видалене з пам'яті",
"removed_tagged_assets": "Видалено тег із {count, plural, one {# активу} other {# активів}}", "removed_tagged_assets": "Видалено тег із {count, plural, one {# елементу} other {# елементів}}",
"rename": "Перейменувати", "rename": "Перейменувати",
"repair": "Ремонт", "repair": "Ремонт",
"repair_no_results_message": "Невідстежувані та відсутні файли будуть відображені тут", "repair_no_results_message": "Невідстежувані та відсутні файли будуть відображені тут",
@ -1641,10 +1636,11 @@
"resolved_all_duplicates": "Усі дублікати усунуто", "resolved_all_duplicates": "Усі дублікати усунуто",
"restore": "Відновити", "restore": "Відновити",
"restore_all": "Відновити все", "restore_all": "Відновити все",
"restore_trash_action_prompt": "{count} відновлено зі смітника", "restore_trash_action_prompt": "{count} відновлено з кошика",
"restore_user": "Відновити користувача", "restore_user": "Відновити користувача",
"restored_asset": "Відновлений актив", "restored_asset": "Відновлений ресурс",
"resume": "Продовжити", "resume": "Продовжити",
"resume_paused_jobs": "Резюме {count, plural, one {# призупинене завдання} other {# призупинені завдання}}",
"retry_upload": "Повторити завантаження", "retry_upload": "Повторити завантаження",
"review_duplicates": "Переглянути дублікати", "review_duplicates": "Переглянути дублікати",
"review_large_files": "Перегляд великих файлів", "review_large_files": "Перегляд великих файлів",
@ -1849,10 +1845,8 @@
"shift_to_permanent_delete": "натисніть ⇧ щоб видалити об'єкт назавжди", "shift_to_permanent_delete": "натисніть ⇧ щоб видалити об'єкт назавжди",
"show_album_options": "Показати параметри альбому", "show_album_options": "Показати параметри альбому",
"show_albums": "Показувати альбоми", "show_albums": "Показувати альбоми",
"show_all_assets": "Показати всі ресурси",
"show_all_people": "Показати всіх людей", "show_all_people": "Показати всіх людей",
"show_and_hide_people": "Показати та приховати людей", "show_and_hide_people": "Показати та приховати людей",
"show_assets_without_location": "Показати активи без місцезнаходження",
"show_file_location": "Показати розташування файлу", "show_file_location": "Показати розташування файлу",
"show_gallery": "Показати галерею", "show_gallery": "Показати галерею",
"show_hidden_people": "Показати прихованих людей", "show_hidden_people": "Показати прихованих людей",
@ -1923,6 +1917,8 @@
"sync_albums_manual_subtitle": "Синхронізувати всі завантажені фото та відео у вибрані альбоми для резервного копіювання", "sync_albums_manual_subtitle": "Синхронізувати всі завантажені фото та відео у вибрані альбоми для резервного копіювання",
"sync_local": "Синхронізувати на пристрої", "sync_local": "Синхронізувати на пристрої",
"sync_remote": "Синхронізувати з сервером", "sync_remote": "Синхронізувати з сервером",
"sync_status": "Стан синхронізації",
"sync_status_subtitle": "Перегляд та керування системою синхронізації",
"sync_upload_album_setting_subtitle": "Створюйте та завантажуйте свої фотографії та відео до вибраних альбомів на сервер Immich", "sync_upload_album_setting_subtitle": "Створюйте та завантажуйте свої фотографії та відео до вибраних альбомів на сервер Immich",
"tag": "Тег", "tag": "Тег",
"tag_assets": "Додати теги", "tag_assets": "Додати теги",
@ -1931,7 +1927,7 @@
"tag_not_found_question": "Не вдається знайти тег? <link>Створити новий тег.</link>", "tag_not_found_question": "Не вдається знайти тег? <link>Створити новий тег.</link>",
"tag_people": "Тег людей", "tag_people": "Тег людей",
"tag_updated": "Оновлено тег: {tag}", "tag_updated": "Оновлено тег: {tag}",
"tagged_assets": "Позначено тегом {count, plural, one {# актив} other {# активи}}", "tagged_assets": "Позначено тегом {count, plural, one {# ресурс} other {# ресурси}}",
"tags": "Теги", "tags": "Теги",
"tap_to_run_job": "Торкніться, щоб запустити завдання", "tap_to_run_job": "Торкніться, щоб запустити завдання",
"template": "Шаблон", "template": "Шаблон",
@ -1963,25 +1959,26 @@
"to_multi_select": "для багаторазового вибору", "to_multi_select": "для багаторазового вибору",
"to_parent": "Повернутись назад", "to_parent": "Повернутись назад",
"to_select": "вибрати", "to_select": "вибрати",
"to_trash": "Смітник", "to_trash": "Кошик",
"toggle_settings": "Перемикання налаштувань", "toggle_settings": "Перемикання налаштувань",
"total": "Усього", "total": "Усього",
"total_usage": "Загальне використання", "total_usage": "Загальне використання",
"trash": "Смітник", "trash": "Кошик",
"trash_action_prompt": "{count} переміщено до смітника", "trash_action_prompt": "{count} переміщено до кошика",
"trash_all": "Видалити все", "trash_all": "Видалити все",
"trash_count": "Видалити {count, number}", "trash_count": "Видалити {count, number}",
"trash_delete_asset": "Смітник/Видалити ресурс", "trash_delete_asset": "У кошик/Видалити ресурс",
"trash_emptied": "Кошик очищений", "trash_emptied": "Кошик очищено",
"trash_no_results_message": "Тут з'являтимуться видалені фото та відео.", "trash_no_results_message": "Тут з'являтимуться видалені фото та відео.",
"trash_page_delete_all": "Видалити усі", "trash_page_delete_all": "Видалити усе",
"trash_page_empty_trash_dialog_content": "Ви хочете очистити кошик? Ці елементи будуть остаточно видалені з Immich", "trash_page_empty_trash_dialog_content": "Ви хочете очистити кошик? Ці елементи будуть остаточно видалені з Immich",
"trash_page_info": "Поміщені у кошик елементи буде остаточно видалено через {days} днів", "trash_page_info": "Поміщені у кошик елементи буде остаточно видалено через {days} днів",
"trash_page_no_assets": "Віддалені елементи відсутні", "trash_page_no_assets": "Видалені елементи відсутні",
"trash_page_restore_all": "Відновити усі", "trash_page_restore_all": "Відновити усе",
"trash_page_select_assets_btn": "Вибрані елементи", "trash_page_select_assets_btn": "Вибрати елементи",
"trash_page_title": "Кошик ({count})", "trash_page_title": "Кошик ({count})",
"trashed_items_will_be_permanently_deleted_after": "Видалені елементи будуть остаточно видалені через {days, plural, one {# день} few {# дні} many {# днів} other {# днів}}.", "trashed_items_will_be_permanently_deleted_after": "Видалені елементи будуть остаточно видалені через {days, plural, one {# день} few {# дні} many {# днів} other {# днів}}.",
"troubleshoot": "Виправлення неполадок",
"type": "Тип", "type": "Тип",
"unable_to_change_pin_code": "Неможливо змінити PIN-код", "unable_to_change_pin_code": "Неможливо змінити PIN-код",
"unable_to_setup_pin_code": "Неможливо налаштувати PIN-код", "unable_to_setup_pin_code": "Неможливо налаштувати PIN-код",
@ -2037,7 +2034,6 @@
"use_biometric": "Використовувати біометрію", "use_biometric": "Використовувати біометрію",
"use_current_connection": "використовувати поточне підключення", "use_current_connection": "використовувати поточне підключення",
"use_custom_date_range": "Використовувати користувацький діапазон дат", "use_custom_date_range": "Використовувати користувацький діапазон дат",
"use_this_location": "Натисніть, щоб використовувати місцезнаходження",
"user": "Користувач", "user": "Користувач",
"user_has_been_deleted": "Користувача видалено.", "user_has_been_deleted": "Користувача видалено.",
"user_id": "ID Користувача", "user_id": "ID Користувача",

View file

@ -558,8 +558,6 @@
"backup_setting_subtitle": "Quản lý cài đặt tải lên ở chế độ nền và khi đang mở", "backup_setting_subtitle": "Quản lý cài đặt tải lên ở chế độ nền và khi đang mở",
"backup_settings_subtitle": "Cài đặt việc tải lên", "backup_settings_subtitle": "Cài đặt việc tải lên",
"backward": "Lùi lại", "backward": "Lùi lại",
"beta_sync": "Trạng thái đồng bộ Beta",
"beta_sync_subtitle": "Hệ thống đồng mới",
"biometric_auth_enabled": "Đã bật xác thực sinh trắc học", "biometric_auth_enabled": "Đã bật xác thực sinh trắc học",
"biometric_locked_out": "Bạn đã bị khóa xác thực bằng sinh trắc học", "biometric_locked_out": "Bạn đã bị khóa xác thực bằng sinh trắc học",
"biometric_no_options": "Không có tùy chọn bằng sinh trắc học", "biometric_no_options": "Không có tùy chọn bằng sinh trắc học",

View file

@ -579,7 +579,7 @@
"backup_controller_page_start_backup": "開始備份", "backup_controller_page_start_backup": "開始備份",
"backup_controller_page_status_off": "前台自動備份已關閉", "backup_controller_page_status_off": "前台自動備份已關閉",
"backup_controller_page_status_on": "前台自動備份已開啟", "backup_controller_page_status_on": "前台自動備份已開啟",
"backup_controller_page_storage_format": "{used} 中的 {total} 已使用", "backup_controller_page_storage_format": "{used} / {total} 已使用",
"backup_controller_page_to_backup": "要備份的相簿", "backup_controller_page_to_backup": "要備份的相簿",
"backup_controller_page_total_sub": "已選取相簿中的所有不重複的照片與影片", "backup_controller_page_total_sub": "已選取相簿中的所有不重複的照片與影片",
"backup_controller_page_turn_off": "關閉前台備份", "backup_controller_page_turn_off": "關閉前台備份",
@ -596,8 +596,6 @@
"backup_setting_subtitle": "管理背景與前台上傳設定", "backup_setting_subtitle": "管理背景與前台上傳設定",
"backup_settings_subtitle": "管理上傳設定", "backup_settings_subtitle": "管理上傳設定",
"backward": "由舊至新", "backward": "由舊至新",
"beta_sync": "測試版同步狀態",
"beta_sync_subtitle": "管理新的同步系統",
"biometric_auth_enabled": "生物辨識驗證已啟用", "biometric_auth_enabled": "生物辨識驗證已啟用",
"biometric_locked_out": "您已被鎖定無法使用生物辨識驗證", "biometric_locked_out": "您已被鎖定無法使用生物辨識驗證",
"biometric_no_options": "沒有生物辨識選項可用", "biometric_no_options": "沒有生物辨識選項可用",
@ -1075,10 +1073,7 @@
"gcast_enabled": "Google Cast", "gcast_enabled": "Google Cast",
"gcast_enabled_description": "此功能需要從 Google 載入外部資源才能正常運作。", "gcast_enabled_description": "此功能需要從 Google 載入外部資源才能正常運作。",
"general": "一般", "general": "一般",
"geolocation_instruction_all_have_location": "此日期的所有項目已具有位置資料。請嘗試顯示所有項目或選擇其他日期",
"geolocation_instruction_location": "點擊具有 GPS 座標的項目以使用其位置,或直接從地圖中選擇地點", "geolocation_instruction_location": "點擊具有 GPS 座標的項目以使用其位置,或直接從地圖中選擇地點",
"geolocation_instruction_no_date": "選擇日期以管理該天的照片和影片位置資料",
"geolocation_instruction_no_photos": "此日期沒有找到照片或影片。請選擇其他日期以顯示",
"get_help": "線上求助", "get_help": "線上求助",
"get_wifiname_error": "無法取得 Wi-Fi 名稱。請確認您已授予必要的權限,並已連接至 Wi-Fi 網路", "get_wifiname_error": "無法取得 Wi-Fi 名稱。請確認您已授予必要的權限,並已連接至 Wi-Fi 網路",
"getting_started": "開始使用", "getting_started": "開始使用",
@ -1475,7 +1470,7 @@
"person": "人物", "person": "人物",
"person_age_months": "{months, plural, one {# 個月} other {# 個月}}前", "person_age_months": "{months, plural, one {# 個月} other {# 個月}}前",
"person_age_year_months": "1 年 {months, plural, one {# 個月} other {# 個月}}前", "person_age_year_months": "1 年 {months, plural, one {# 個月} other {# 個月}}前",
"person_age_years": "{years, plural, other {# 年}}前", "person_age_years": "{years, plural, other {# 歲}}",
"person_birthdate": "生於 {date}", "person_birthdate": "生於 {date}",
"person_hidden": "{name}{hidden, select, true {(隱藏)} other {}}", "person_hidden": "{name}{hidden, select, true {(隱藏)} other {}}",
"photo_shared_all_users": "看來您與所有使用者分享了照片,或沒有其他使用者可供分享。", "photo_shared_all_users": "看來您與所有使用者分享了照片,或沒有其他使用者可供分享。",
@ -1843,10 +1838,8 @@
"shift_to_permanent_delete": "按 ⇧ 永久刪除檔案", "shift_to_permanent_delete": "按 ⇧ 永久刪除檔案",
"show_album_options": "顯示相簿選項", "show_album_options": "顯示相簿選項",
"show_albums": "顯示相簿", "show_albums": "顯示相簿",
"show_all_assets": "顯示所有項目",
"show_all_people": "顯示所有人物", "show_all_people": "顯示所有人物",
"show_and_hide_people": "顯示與隱藏人物", "show_and_hide_people": "顯示與隱藏人物",
"show_assets_without_location": "顯示沒有地點的項目",
"show_file_location": "顯示文件位置", "show_file_location": "顯示文件位置",
"show_gallery": "顯示畫廊", "show_gallery": "顯示畫廊",
"show_hidden_people": "顯示隱藏的人物", "show_hidden_people": "顯示隱藏的人物",
@ -2028,7 +2021,6 @@
"use_biometric": "使用生物辨識", "use_biometric": "使用生物辨識",
"use_current_connection": "使用目前的連線", "use_current_connection": "使用目前的連線",
"use_custom_date_range": "改用自訂日期範圍", "use_custom_date_range": "改用自訂日期範圍",
"use_this_location": "點擊以使用位置",
"user": "使用者", "user": "使用者",
"user_has_been_deleted": "此用戶已被刪除。", "user_has_been_deleted": "此用戶已被刪除。",
"user_id": "使用者 ID", "user_id": "使用者 ID",

View file

@ -605,8 +605,6 @@
"backup_setting_subtitle": "管理后台和前台上传设置", "backup_setting_subtitle": "管理后台和前台上传设置",
"backup_settings_subtitle": "管理上传设置", "backup_settings_subtitle": "管理上传设置",
"backward": "后退", "backward": "后退",
"beta_sync": "测试版同步状态",
"beta_sync_subtitle": "管理新的同步系统",
"biometric_auth_enabled": "生物识别身份验证已启用", "biometric_auth_enabled": "生物识别身份验证已启用",
"biometric_locked_out": "您被锁定在生物识别身份验证之外", "biometric_locked_out": "您被锁定在生物识别身份验证之外",
"biometric_no_options": "没有可用的生物识别选项", "biometric_no_options": "没有可用的生物识别选项",
@ -1084,10 +1082,7 @@
"gcast_enabled": "Google Cast 投屏", "gcast_enabled": "Google Cast 投屏",
"gcast_enabled_description": "该功能需要加载来自 Google 的外部资源。", "gcast_enabled_description": "该功能需要加载来自 Google 的外部资源。",
"general": "通用", "general": "通用",
"geolocation_instruction_all_have_location": "此日期的所有资产都已具有位置数据。尝试显示所有资产或选择其他日期",
"geolocation_instruction_location": "点击带有GPS坐标的资产以使用其位置或直接从地图上选择位置", "geolocation_instruction_location": "点击带有GPS坐标的资产以使用其位置或直接从地图上选择位置",
"geolocation_instruction_no_date": "选择一个日期来管理当天照片和视频的位置数据",
"geolocation_instruction_no_photos": "没有找到此日期的照片或视频。选择其他日期显示它们",
"get_help": "获取帮助", "get_help": "获取帮助",
"get_wifiname_error": "无法获取 Wi-Fi 名称。确保已授予必要的权限,并已连接到 Wi-Fi 网络", "get_wifiname_error": "无法获取 Wi-Fi 名称。确保已授予必要的权限,并已连接到 Wi-Fi 网络",
"getting_started": "入门", "getting_started": "入门",
@ -1529,7 +1524,7 @@
"profile_drawer_client_out_of_date_minor": "客户端有小版本升级,请尽快升级至最新版。", "profile_drawer_client_out_of_date_minor": "客户端有小版本升级,请尽快升级至最新版。",
"profile_drawer_client_server_up_to_date": "客户端和服务端都是最新的", "profile_drawer_client_server_up_to_date": "客户端和服务端都是最新的",
"profile_drawer_github": "GitHub", "profile_drawer_github": "GitHub",
"profile_drawer_readonly_mode": "只读模式已启用。双击用户头像图标退出。", "profile_drawer_readonly_mode": "只读模式已启用。长按用户头像图标退出。",
"profile_drawer_server_out_of_date_major": "服务端有大版本升级,请尽快升级至最新版。", "profile_drawer_server_out_of_date_major": "服务端有大版本升级,请尽快升级至最新版。",
"profile_drawer_server_out_of_date_minor": "服务端有小版本升级,请尽快升级至最新版。", "profile_drawer_server_out_of_date_minor": "服务端有小版本升级,请尽快升级至最新版。",
"profile_image_of_user": "{user}的个人资料图片", "profile_image_of_user": "{user}的个人资料图片",
@ -1654,6 +1649,7 @@
"restore_user": "恢复用户", "restore_user": "恢复用户",
"restored_asset": "已恢复项目", "restored_asset": "已恢复项目",
"resume": "继续", "resume": "继续",
"resume_paused_jobs": "继续 {count, plural, one {# 已暂停的作业} other {# 已暂停的作业}}",
"retry_upload": "重新上传", "retry_upload": "重新上传",
"review_duplicates": "检查重复项", "review_duplicates": "检查重复项",
"review_large_files": "查看大文件", "review_large_files": "查看大文件",
@ -1861,10 +1857,8 @@
"shift_to_permanent_delete": "按住 ⇧ Shift 键永久删除项目", "shift_to_permanent_delete": "按住 ⇧ Shift 键永久删除项目",
"show_album_options": "显示相册选项", "show_album_options": "显示相册选项",
"show_albums": "显示相册", "show_albums": "显示相册",
"show_all_assets": "显示所有资产",
"show_all_people": "显示所有人物", "show_all_people": "显示所有人物",
"show_and_hide_people": "显示和隐藏人物", "show_and_hide_people": "显示和隐藏人物",
"show_assets_without_location": "显示不带GPS定位的资产",
"show_file_location": "显示文件位置", "show_file_location": "显示文件位置",
"show_gallery": "显示图库", "show_gallery": "显示图库",
"show_hidden_people": "显示隐藏人物", "show_hidden_people": "显示隐藏人物",
@ -1935,6 +1929,8 @@
"sync_albums_manual_subtitle": "将所有上传的视频和照片同步到选定的备份相册", "sync_albums_manual_subtitle": "将所有上传的视频和照片同步到选定的备份相册",
"sync_local": "同步本地", "sync_local": "同步本地",
"sync_remote": "同步远程", "sync_remote": "同步远程",
"sync_status": "同步状态",
"sync_status_subtitle": "查看和管理同步系统",
"sync_upload_album_setting_subtitle": "创建照片和视频并上传到 Immich 上的选定相册中", "sync_upload_album_setting_subtitle": "创建照片和视频并上传到 Immich 上的选定相册中",
"tag": "标签", "tag": "标签",
"tag_assets": "标记项目", "tag_assets": "标记项目",
@ -1994,6 +1990,7 @@
"trash_page_select_assets_btn": "选择项目", "trash_page_select_assets_btn": "选择项目",
"trash_page_title": "回收站 ({count})", "trash_page_title": "回收站 ({count})",
"trashed_items_will_be_permanently_deleted_after": "回收站中的项目将在{days, plural, one {#天} other {#天}}后被永久删除。", "trashed_items_will_be_permanently_deleted_after": "回收站中的项目将在{days, plural, one {#天} other {#天}}后被永久删除。",
"troubleshoot": "故障排除",
"type": "类型", "type": "类型",
"unable_to_change_pin_code": "无法修改PIN码", "unable_to_change_pin_code": "无法修改PIN码",
"unable_to_setup_pin_code": "无法设置PIN码", "unable_to_setup_pin_code": "无法设置PIN码",
@ -2049,7 +2046,6 @@
"use_biometric": "使用生物识别", "use_biometric": "使用生物识别",
"use_current_connection": "使用当前连接", "use_current_connection": "使用当前连接",
"use_custom_date_range": "自定义日期范围", "use_custom_date_range": "自定义日期范围",
"use_this_location": "单击以使用此位置",
"user": "用户", "user": "用户",
"user_has_been_deleted": "此用户已被删除。", "user_has_been_deleted": "此用户已被删除。",
"user_id": "用户 ID", "user_id": "用户 ID",

View file

@ -134,6 +134,13 @@ custom_lint:
dart_code_metrics: dart_code_metrics:
rules: rules:
- banned-usage:
entries:
- name: debugPrint
description: Use dPrint instead of debugPrint for proper tree-shaking in release builds.
exclude-paths:
- 'lib/utils/debug_print.dart'
severity: perf
# All rules from "recommended" preset # All rules from "recommended" preset
# Show potential errors # Show potential errors
# - avoid-cascade-after-if-null # - avoid-cascade-after-if-null

View file

@ -5,6 +5,8 @@ import android.os.Build
import android.os.ext.SdkExtensions import android.os.ext.SdkExtensions
import app.alextran.immich.background.BackgroundWorkerApiImpl import app.alextran.immich.background.BackgroundWorkerApiImpl
import app.alextran.immich.background.BackgroundWorkerFgHostApi import app.alextran.immich.background.BackgroundWorkerFgHostApi
import app.alextran.immich.connectivity.ConnectivityApi
import app.alextran.immich.connectivity.ConnectivityApiImpl
import app.alextran.immich.images.ThumbnailApi import app.alextran.immich.images.ThumbnailApi
import app.alextran.immich.images.ThumbnailsImpl import app.alextran.immich.images.ThumbnailsImpl
import app.alextran.immich.sync.NativeSyncApi import app.alextran.immich.sync.NativeSyncApi
@ -34,6 +36,7 @@ class MainActivity : FlutterFragmentActivity() {
NativeSyncApi.setUp(messenger, nativeSyncApiImpl) NativeSyncApi.setUp(messenger, nativeSyncApiImpl)
ThumbnailApi.setUp(messenger, ThumbnailsImpl(ctx)) ThumbnailApi.setUp(messenger, ThumbnailsImpl(ctx))
BackgroundWorkerFgHostApi.setUp(messenger, BackgroundWorkerApiImpl(ctx)) BackgroundWorkerFgHostApi.setUp(messenger, BackgroundWorkerApiImpl(ctx))
ConnectivityApi.setUp(messenger, ConnectivityApiImpl(ctx))
} }
} }
} }

View file

@ -111,6 +111,7 @@ interface BackgroundWorkerFgHostApi {
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ /** Generated interface from Pigeon that represents a handler of messages from Flutter. */
interface BackgroundWorkerBgHostApi { interface BackgroundWorkerBgHostApi {
fun onInitialized() fun onInitialized()
fun showNotification(title: String, content: String)
fun close() fun close()
companion object { companion object {
@ -138,6 +139,25 @@ interface BackgroundWorkerBgHostApi {
channel.setMessageHandler(null) channel.setMessageHandler(null)
} }
} }
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.immich_mobile.BackgroundWorkerBgHostApi.showNotification$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { message, reply ->
val args = message as List<Any?>
val titleArg = args[0] as String
val contentArg = args[1] as String
val wrapped: List<Any?> = try {
api.showNotification(titleArg, contentArg)
listOf(null)
} catch (exception: Throwable) {
BackgroundWorkerPigeonUtils.wrapError(exception)
}
reply.reply(wrapped)
}
} else {
channel.setMessageHandler(null)
}
}
run { run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.immich_mobile.BackgroundWorkerBgHostApi.close$separatedMessageChannelSuffix", codec) val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.immich_mobile.BackgroundWorkerBgHostApi.close$separatedMessageChannelSuffix", codec)
if (api != null) { if (api != null) {

View file

@ -1,18 +1,27 @@
package app.alextran.immich.background package app.alextran.immich.background
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context import android.content.Context
import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
import android.os.Build
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.os.PowerManager
import android.util.Log import android.util.Log
import androidx.core.app.NotificationCompat
import androidx.work.ForegroundInfo
import androidx.work.ListenableWorker import androidx.work.ListenableWorker
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import app.alextran.immich.MainActivity import app.alextran.immich.MainActivity
import app.alextran.immich.R
import com.google.common.util.concurrent.ListenableFuture import com.google.common.util.concurrent.ListenableFuture
import com.google.common.util.concurrent.SettableFuture import com.google.common.util.concurrent.SettableFuture
import io.flutter.FlutterInjector import io.flutter.FlutterInjector
import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.FlutterEngine
import io.flutter.embedding.engine.dart.DartExecutor import io.flutter.embedding.engine.dart.DartExecutor
import io.flutter.embedding.engine.loader.FlutterLoader import io.flutter.embedding.engine.loader.FlutterLoader
import java.util.concurrent.TimeUnit
private const val TAG = "BackgroundWorker" private const val TAG = "BackgroundWorker"
@ -40,15 +49,32 @@ class BackgroundWorker(context: Context, params: WorkerParameters) :
/// Flag to track whether the background task has completed to prevent duplicate completions /// Flag to track whether the background task has completed to prevent duplicate completions
private var isComplete = false private var isComplete = false
private val notificationManager =
ctx.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
private var foregroundFuture: ListenableFuture<Void>? = null
init { init {
if (!loader.initialized()) { if (!loader.initialized()) {
loader.startInitialization(ctx) loader.startInitialization(ctx)
} }
} }
companion object {
private const val NOTIFICATION_CHANNEL_ID = "immich::background_worker::notif"
private const val NOTIFICATION_ID = 100
}
override fun startWork(): ListenableFuture<Result> { override fun startWork(): ListenableFuture<Result> {
Log.i(TAG, "Starting background upload worker") Log.i(TAG, "Starting background upload worker")
val notificationChannel = NotificationChannel(
NOTIFICATION_CHANNEL_ID,
NOTIFICATION_CHANNEL_ID,
NotificationManager.IMPORTANCE_LOW
)
notificationManager.createNotificationChannel(notificationChannel)
loader.ensureInitializationCompleteAsync(ctx, null, Handler(Looper.getMainLooper())) { loader.ensureInitializationCompleteAsync(ctx, null, Handler(Looper.getMainLooper())) {
engine = FlutterEngine(ctx) engine = FlutterEngine(ctx)
@ -82,6 +108,34 @@ class BackgroundWorker(context: Context, params: WorkerParameters) :
flutterApi?.onAndroidUpload { handleHostResult(it) } flutterApi?.onAndroidUpload { handleHostResult(it) }
} }
// TODO: Move this to a separate NotificationManager class
override fun showNotification(title: String, content: String) {
val notification = NotificationCompat.Builder(applicationContext, NOTIFICATION_CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setOnlyAlertOnce(true)
.setOngoing(true)
.setTicker(title)
.setContentTitle(title)
.setContentText(content)
.build()
if (isIgnoringBatteryOptimizations()) {
foregroundFuture = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
setForegroundAsync(
ForegroundInfo(
NOTIFICATION_ID,
notification,
FOREGROUND_SERVICE_TYPE_DATA_SYNC
)
)
} else {
setForegroundAsync(ForegroundInfo(NOTIFICATION_ID, notification))
}
} else {
notificationManager.notify(NOTIFICATION_ID, notification)
}
}
override fun close() { override fun close() {
if (isComplete) { if (isComplete) {
return return
@ -95,6 +149,8 @@ class BackgroundWorker(context: Context, params: WorkerParameters) :
} }
} }
waitForForegroundPromotion()
Handler(Looper.getMainLooper()).postDelayed({ Handler(Looper.getMainLooper()).postDelayed({
complete(Result.failure()) complete(Result.failure())
}, 5000) }, 5000)
@ -135,6 +191,32 @@ class BackgroundWorker(context: Context, params: WorkerParameters) :
engine?.destroy() engine?.destroy()
engine = null engine = null
flutterApi = null flutterApi = null
notificationManager.cancel(NOTIFICATION_ID)
waitForForegroundPromotion()
completionHandler.set(success) completionHandler.set(success)
} }
/**
* Returns `true` if the app is ignoring battery optimizations
*/
private fun isIgnoringBatteryOptimizations(): Boolean {
val powerManager = ctx.getSystemService(Context.POWER_SERVICE) as PowerManager
return powerManager.isIgnoringBatteryOptimizations(ctx.packageName)
}
/**
* Calls to setForegroundAsync() that do not complete before completion of a ListenableWorker will signal an IllegalStateException
* https://android-review.googlesource.com/c/platform/frameworks/support/+/1262743
* Wait for a short period of time for the foreground promotion to complete before completing the worker
*/
private fun waitForForegroundPromotion() {
val foregroundFuture = this.foregroundFuture
if (foregroundFuture != null && !foregroundFuture.isCancelled && !foregroundFuture.isDone) {
try {
foregroundFuture.get(500, TimeUnit.MILLISECONDS)
} catch (e: Exception) {
// ignored, there is nothing to be done
}
}
}
} }

View file

@ -0,0 +1,116 @@
// Autogenerated from Pigeon (v26.0.0), do not edit directly.
// See also: https://pub.dev/packages/pigeon
@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass")
package app.alextran.immich.connectivity
import android.util.Log
import io.flutter.plugin.common.BasicMessageChannel
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.EventChannel
import io.flutter.plugin.common.MessageCodec
import io.flutter.plugin.common.StandardMethodCodec
import io.flutter.plugin.common.StandardMessageCodec
import java.io.ByteArrayOutputStream
import java.nio.ByteBuffer
private object ConnectivityPigeonUtils {
fun wrapResult(result: Any?): List<Any?> {
return listOf(result)
}
fun wrapError(exception: Throwable): List<Any?> {
return if (exception is FlutterError) {
listOf(
exception.code,
exception.message,
exception.details
)
} else {
listOf(
exception.javaClass.simpleName,
exception.toString(),
"Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception)
)
}
}
}
/**
* Error class for passing custom error details to Flutter via a thrown PlatformException.
* @property code The error code.
* @property message The error message.
* @property details The error details. Must be a datatype supported by the api codec.
*/
class FlutterError (
val code: String,
override val message: String? = null,
val details: Any? = null
) : Throwable()
enum class NetworkCapability(val raw: Int) {
CELLULAR(0),
WIFI(1),
VPN(2),
UNMETERED(3);
companion object {
fun ofRaw(raw: Int): NetworkCapability? {
return values().firstOrNull { it.raw == raw }
}
}
}
private open class ConnectivityPigeonCodec : StandardMessageCodec() {
override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? {
return when (type) {
129.toByte() -> {
return (readValue(buffer) as Long?)?.let {
NetworkCapability.ofRaw(it.toInt())
}
}
else -> super.readValueOfType(type, buffer)
}
}
override fun writeValue(stream: ByteArrayOutputStream, value: Any?) {
when (value) {
is NetworkCapability -> {
stream.write(129)
writeValue(stream, value.raw)
}
else -> super.writeValue(stream, value)
}
}
}
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
interface ConnectivityApi {
fun getCapabilities(): List<NetworkCapability>
companion object {
/** The codec used by ConnectivityApi. */
val codec: MessageCodec<Any?> by lazy {
ConnectivityPigeonCodec()
}
/** Sets up an instance of `ConnectivityApi` to handle messages through the `binaryMessenger`. */
@JvmOverloads
fun setUp(binaryMessenger: BinaryMessenger, api: ConnectivityApi?, messageChannelSuffix: String = "") {
val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else ""
val taskQueue = binaryMessenger.makeBackgroundTaskQueue()
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.immich_mobile.ConnectivityApi.getCapabilities$separatedMessageChannelSuffix", codec, taskQueue)
if (api != null) {
channel.setMessageHandler { _, reply ->
val wrapped: List<Any?> = try {
listOf(api.getCapabilities())
} catch (exception: Throwable) {
ConnectivityPigeonUtils.wrapError(exception)
}
reply.reply(wrapped)
}
} else {
channel.setMessageHandler(null)
}
}
}
}
}

View file

@ -0,0 +1,39 @@
package app.alextran.immich.connectivity
import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.net.wifi.WifiManager
class ConnectivityApiImpl(context: Context) : ConnectivityApi {
private val connectivityManager =
context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
private val wifiManager =
context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
override fun getCapabilities(): List<NetworkCapability> {
val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
?: return emptyList()
val hasWifi = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
val hasCellular = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
val hasVpn = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)
val isUnmetered = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
return buildList {
if (hasWifi) add(NetworkCapability.WIFI)
if (hasCellular) add(NetworkCapability.CELLULAR)
if (hasVpn) {
add(NetworkCapability.VPN)
if (!hasWifi && !hasCellular) {
if (wifiManager.isWifiEnabled) add(NetworkCapability.WIFI)
// If VPN is active, but neither WIFI nor CELLULAR is reported as active,
// assume CELLULAR if WIFI is not enabled
else add(NetworkCapability.CELLULAR)
}
}
if (isUnmetered) add(NetworkCapability.UNMETERED)
}
}
}

View file

@ -35,8 +35,8 @@ platform :android do
task: 'bundle', task: 'bundle',
build_type: 'Release', build_type: 'Release',
properties: { properties: {
"android.injected.version.code" => 3013, "android.injected.version.code" => 3014,
"android.injected.version.name" => "1.141.1", "android.injected.version.name" => "1.142.0",
} }
) )
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') 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

@ -18,6 +18,8 @@
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
B21E34AA2E5AFD2B0031FDB9 /* BackgroundWorkerApiImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = B21E34A92E5AFD210031FDB9 /* BackgroundWorkerApiImpl.swift */; }; B21E34AA2E5AFD2B0031FDB9 /* BackgroundWorkerApiImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = B21E34A92E5AFD210031FDB9 /* BackgroundWorkerApiImpl.swift */; };
B21E34AC2E5B09190031FDB9 /* BackgroundWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B21E34AB2E5B09100031FDB9 /* BackgroundWorker.swift */; }; B21E34AC2E5B09190031FDB9 /* BackgroundWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B21E34AB2E5B09100031FDB9 /* BackgroundWorker.swift */; };
B25D377A2E72CA15008B6CA7 /* Connectivity.g.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25D37782E72CA15008B6CA7 /* Connectivity.g.swift */; };
B25D377C2E72CA26008B6CA7 /* ConnectivityApiImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25D377B2E72CA20008B6CA7 /* ConnectivityApiImpl.swift */; };
B2BE315F2E5E5229006EEF88 /* BackgroundWorker.g.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2BE315E2E5E5229006EEF88 /* BackgroundWorker.g.swift */; }; B2BE315F2E5E5229006EEF88 /* BackgroundWorker.g.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2BE315E2E5E5229006EEF88 /* BackgroundWorker.g.swift */; };
D218389C4A4C4693F141F7D1 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 886774DBDDE6B35BF2B4F2CD /* Pods_Runner.framework */; }; D218389C4A4C4693F141F7D1 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 886774DBDDE6B35BF2B4F2CD /* Pods_Runner.framework */; };
F02538E92DFBCBDD008C3FA3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; F02538E92DFBCBDD008C3FA3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
@ -97,6 +99,8 @@
B1FBA9EE014DE20271B0FE77 /* Pods-ShareExtension.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShareExtension.profile.xcconfig"; path = "Target Support Files/Pods-ShareExtension/Pods-ShareExtension.profile.xcconfig"; sourceTree = "<group>"; }; B1FBA9EE014DE20271B0FE77 /* Pods-ShareExtension.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShareExtension.profile.xcconfig"; path = "Target Support Files/Pods-ShareExtension/Pods-ShareExtension.profile.xcconfig"; sourceTree = "<group>"; };
B21E34A92E5AFD210031FDB9 /* BackgroundWorkerApiImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundWorkerApiImpl.swift; sourceTree = "<group>"; }; B21E34A92E5AFD210031FDB9 /* BackgroundWorkerApiImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundWorkerApiImpl.swift; sourceTree = "<group>"; };
B21E34AB2E5B09100031FDB9 /* BackgroundWorker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundWorker.swift; sourceTree = "<group>"; }; B21E34AB2E5B09100031FDB9 /* BackgroundWorker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundWorker.swift; sourceTree = "<group>"; };
B25D37782E72CA15008B6CA7 /* Connectivity.g.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Connectivity.g.swift; sourceTree = "<group>"; };
B25D377B2E72CA20008B6CA7 /* ConnectivityApiImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectivityApiImpl.swift; sourceTree = "<group>"; };
B2BE315E2E5E5229006EEF88 /* BackgroundWorker.g.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundWorker.g.swift; sourceTree = "<group>"; }; B2BE315E2E5E5229006EEF88 /* BackgroundWorker.g.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundWorker.g.swift; sourceTree = "<group>"; };
E0E99CDC17B3EB7FA8BA2332 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; }; E0E99CDC17B3EB7FA8BA2332 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
F0B57D382DF764BD00DC5BCC /* WidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = WidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; F0B57D382DF764BD00DC5BCC /* WidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = WidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
@ -243,6 +247,7 @@
97C146F01CF9000F007C117D /* Runner */ = { 97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
B25D37792E72CA15008B6CA7 /* Connectivity */,
B21E34A62E5AF9760031FDB9 /* Background */, B21E34A62E5AF9760031FDB9 /* Background */,
B2CF7F8C2DDE4EBB00744BF6 /* Sync */, B2CF7F8C2DDE4EBB00744BF6 /* Sync */,
FA9973382CF6DF4B000EF859 /* Runner.entitlements */, FA9973382CF6DF4B000EF859 /* Runner.entitlements */,
@ -271,6 +276,15 @@
path = Background; path = Background;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
B25D37792E72CA15008B6CA7 /* Connectivity */ = {
isa = PBXGroup;
children = (
B25D377B2E72CA20008B6CA7 /* ConnectivityApiImpl.swift */,
B25D37782E72CA15008B6CA7 /* Connectivity.g.swift */,
);
path = Connectivity;
sourceTree = "<group>";
};
FAC6F8B62D287F120078CB2F /* ShareExtension */ = { FAC6F8B62D287F120078CB2F /* ShareExtension */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -558,7 +572,9 @@
65F32F31299BD2F800CE9261 /* BackgroundServicePlugin.swift in Sources */, 65F32F31299BD2F800CE9261 /* BackgroundServicePlugin.swift in Sources */,
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
B21E34AC2E5B09190031FDB9 /* BackgroundWorker.swift in Sources */, B21E34AC2E5B09190031FDB9 /* BackgroundWorker.swift in Sources */,
B25D377A2E72CA15008B6CA7 /* Connectivity.g.swift in Sources */,
FEAFA8732E4D42F4001E47FE /* Thumbhash.swift in Sources */, FEAFA8732E4D42F4001E47FE /* Thumbhash.swift in Sources */,
B25D377C2E72CA26008B6CA7 /* ConnectivityApiImpl.swift in Sources */,
FED3B1962E253E9B0030FD97 /* ThumbnailsImpl.swift in Sources */, FED3B1962E253E9B0030FD97 /* ThumbnailsImpl.swift in Sources */,
B21E34AA2E5AFD2B0031FDB9 /* BackgroundWorkerApiImpl.swift in Sources */, B21E34AA2E5AFD2B0031FDB9 /* BackgroundWorkerApiImpl.swift in Sources */,
FED3B1972E253E9B0030FD97 /* Thumbnails.g.swift in Sources */, FED3B1972E253E9B0030FD97 /* Thumbnails.g.swift in Sources */,
@ -689,7 +705,7 @@
CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219; CURRENT_PROJECT_VERSION = 223;
CUSTOM_GROUP_ID = group.app.immich.share; CUSTOM_GROUP_ID = group.app.immich.share;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
@ -833,7 +849,7 @@
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219; CURRENT_PROJECT_VERSION = 223;
CUSTOM_GROUP_ID = group.app.immich.share; CUSTOM_GROUP_ID = group.app.immich.share;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
@ -863,7 +879,7 @@
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219; CURRENT_PROJECT_VERSION = 223;
CUSTOM_GROUP_ID = group.app.immich.share; CUSTOM_GROUP_ID = group.app.immich.share;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
@ -897,7 +913,7 @@
CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements; CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219; CURRENT_PROJECT_VERSION = 223;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17; GCC_C_LANGUAGE_STANDARD = gnu17;
@ -940,7 +956,7 @@
CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements; CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219; CURRENT_PROJECT_VERSION = 223;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17; GCC_C_LANGUAGE_STANDARD = gnu17;
@ -980,7 +996,7 @@
CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements; CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219; CURRENT_PROJECT_VERSION = 223;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17; GCC_C_LANGUAGE_STANDARD = gnu17;
@ -1019,7 +1035,7 @@
CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219; CURRENT_PROJECT_VERSION = 223;
CUSTOM_GROUP_ID = group.app.immich.share; CUSTOM_GROUP_ID = group.app.immich.share;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
@ -1063,7 +1079,7 @@
CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219; CURRENT_PROJECT_VERSION = 223;
CUSTOM_GROUP_ID = group.app.immich.share; CUSTOM_GROUP_ID = group.app.immich.share;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
@ -1104,7 +1120,7 @@
CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219; CURRENT_PROJECT_VERSION = 223;
CUSTOM_GROUP_ID = group.app.immich.share; CUSTOM_GROUP_ID = group.app.immich.share;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;

View file

@ -114,6 +114,7 @@ class BackgroundWorkerFgHostApiSetup {
/// Generated protocol from Pigeon that represents a handler of messages from Flutter. /// Generated protocol from Pigeon that represents a handler of messages from Flutter.
protocol BackgroundWorkerBgHostApi { protocol BackgroundWorkerBgHostApi {
func onInitialized() throws func onInitialized() throws
func showNotification(title: String, content: String) throws
func close() throws func close() throws
} }
@ -136,6 +137,22 @@ class BackgroundWorkerBgHostApiSetup {
} else { } else {
onInitializedChannel.setMessageHandler(nil) onInitializedChannel.setMessageHandler(nil)
} }
let showNotificationChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.BackgroundWorkerBgHostApi.showNotification\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
if let api = api {
showNotificationChannel.setMessageHandler { message, reply in
let args = message as! [Any?]
let titleArg = args[0] as! String
let contentArg = args[1] as! String
do {
try api.showNotification(title: titleArg, content: contentArg)
reply(wrapResult(nil))
} catch {
reply(wrapError(error))
}
}
} else {
showNotificationChannel.setMessageHandler(nil)
}
let closeChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.BackgroundWorkerBgHostApi.close\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec) let closeChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.BackgroundWorkerBgHostApi.close\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
if let api = api { if let api = api {
closeChannel.setMessageHandler { _, reply in closeChannel.setMessageHandler { _, reply in

View file

@ -119,6 +119,10 @@ class BackgroundWorker: BackgroundWorkerBgHostApi {
}) })
} }
func showNotification(title: String, content: String) throws {
// No-op on iOS for the time being
}
/** /**
* Cancels the currently running background task, either due to timeout or external request. * Cancels the currently running background task, either due to timeout or external request.
* Sends a cancel signal to the Flutter side and sets up a fallback timer to ensure * Sends a cancel signal to the Flutter side and sets up a fallback timer to ensure

View file

@ -0,0 +1,129 @@
// Autogenerated from Pigeon (v26.0.0), do not edit directly.
// See also: https://pub.dev/packages/pigeon
import Foundation
#if os(iOS)
import Flutter
#elseif os(macOS)
import FlutterMacOS
#else
#error("Unsupported platform.")
#endif
private func wrapResult(_ result: Any?) -> [Any?] {
return [result]
}
private func wrapError(_ error: Any) -> [Any?] {
if let pigeonError = error as? PigeonError {
return [
pigeonError.code,
pigeonError.message,
pigeonError.details,
]
}
if let flutterError = error as? FlutterError {
return [
flutterError.code,
flutterError.message,
flutterError.details,
]
}
return [
"\(error)",
"\(type(of: error))",
"Stacktrace: \(Thread.callStackSymbols)",
]
}
private func isNullish(_ value: Any?) -> Bool {
return value is NSNull || value == nil
}
private func nilOrValue<T>(_ value: Any?) -> T? {
if value is NSNull { return nil }
return value as! T?
}
enum NetworkCapability: Int {
case cellular = 0
case wifi = 1
case vpn = 2
case unmetered = 3
}
private class ConnectivityPigeonCodecReader: FlutterStandardReader {
override func readValue(ofType type: UInt8) -> Any? {
switch type {
case 129:
let enumResultAsInt: Int? = nilOrValue(self.readValue() as! Int?)
if let enumResultAsInt = enumResultAsInt {
return NetworkCapability(rawValue: enumResultAsInt)
}
return nil
default:
return super.readValue(ofType: type)
}
}
}
private class ConnectivityPigeonCodecWriter: FlutterStandardWriter {
override func writeValue(_ value: Any) {
if let value = value as? NetworkCapability {
super.writeByte(129)
super.writeValue(value.rawValue)
} else {
super.writeValue(value)
}
}
}
private class ConnectivityPigeonCodecReaderWriter: FlutterStandardReaderWriter {
override func reader(with data: Data) -> FlutterStandardReader {
return ConnectivityPigeonCodecReader(data: data)
}
override func writer(with data: NSMutableData) -> FlutterStandardWriter {
return ConnectivityPigeonCodecWriter(data: data)
}
}
class ConnectivityPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable {
static let shared = ConnectivityPigeonCodec(readerWriter: ConnectivityPigeonCodecReaderWriter())
}
/// Generated protocol from Pigeon that represents a handler of messages from Flutter.
protocol ConnectivityApi {
func getCapabilities() throws -> [NetworkCapability]
}
/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`.
class ConnectivityApiSetup {
static var codec: FlutterStandardMessageCodec { ConnectivityPigeonCodec.shared }
/// Sets up an instance of `ConnectivityApi` to handle messages through the `binaryMessenger`.
static func setUp(binaryMessenger: FlutterBinaryMessenger, api: ConnectivityApi?, messageChannelSuffix: String = "") {
let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : ""
#if os(iOS)
let taskQueue = binaryMessenger.makeBackgroundTaskQueue?()
#else
let taskQueue: FlutterTaskQueue? = nil
#endif
let getCapabilitiesChannel = taskQueue == nil
? FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.ConnectivityApi.getCapabilities\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
: FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.ConnectivityApi.getCapabilities\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec, taskQueue: taskQueue)
if let api = api {
getCapabilitiesChannel.setMessageHandler { _, reply in
do {
let result = try api.getCapabilities()
reply(wrapResult(result))
} catch {
reply(wrapError(error))
}
}
} else {
getCapabilitiesChannel.setMessageHandler(nil)
}
}
}

View file

@ -0,0 +1,6 @@
class ConnectivityApiImpl: ConnectivityApi {
func getCapabilities() throws -> [NetworkCapability] {
[]
}
}

View file

@ -80,7 +80,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.140.0</string> <string>1.142.0</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleURLTypes</key> <key>CFBundleURLTypes</key>
@ -107,7 +107,7 @@
</dict> </dict>
</array> </array>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>219</string> <string>223</string>
<key>FLTEnableImpeller</key> <key>FLTEnableImpeller</key>
<true/> <true/>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>

View file

@ -22,7 +22,7 @@ platform :ios do
path: "./Runner.xcodeproj", path: "./Runner.xcodeproj",
) )
increment_version_number( increment_version_number(
version_number: "1.141.1" version_number: "1.142.0"
) )
increment_build_number( increment_build_number(
build_number: latest_testflight_build_number + 1, build_number: latest_testflight_build_number + 1,

View file

@ -1,10 +1,15 @@
import 'dart:async'; import 'dart:async';
import 'dart:io';
import 'dart:ui'; import 'dart:ui';
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
import 'package:cancellation_token_http/http.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/extensions/network_capability_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/intl_keys.g.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/logger_db.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/logger_db.repository.dart';
import 'package:immich_mobile/platform/background_worker_api.g.dart'; import 'package:immich_mobile/platform/background_worker_api.g.dart';
@ -13,17 +18,20 @@ import 'package:immich_mobile/providers/background_sync.provider.dart';
import 'package:immich_mobile/providers/backup/drift_backup.provider.dart'; import 'package:immich_mobile/providers/backup/drift_backup.provider.dart';
import 'package:immich_mobile/providers/db.provider.dart'; import 'package:immich_mobile/providers/db.provider.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
import 'package:immich_mobile/providers/infrastructure/platform.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/repositories/file_media.repository.dart'; import 'package:immich_mobile/repositories/file_media.repository.dart';
import 'package:immich_mobile/services/app_settings.service.dart'; import 'package:immich_mobile/services/app_settings.service.dart';
import 'package:immich_mobile/services/auth.service.dart'; import 'package:immich_mobile/services/auth.service.dart';
import 'package:immich_mobile/services/localization.service.dart'; import 'package:immich_mobile/services/localization.service.dart';
import 'package:immich_mobile/services/server_info.service.dart';
import 'package:immich_mobile/services/upload.service.dart'; import 'package:immich_mobile/services/upload.service.dart';
import 'package:immich_mobile/utils/bootstrap.dart'; import 'package:immich_mobile/utils/bootstrap.dart';
import 'package:immich_mobile/utils/http_ssl_options.dart'; import 'package:immich_mobile/utils/http_ssl_options.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:worker_manager/worker_manager.dart'; import 'package:worker_manager/worker_manager.dart';
import 'package:immich_mobile/utils/debug_print.dart';
class BackgroundWorkerFgService { class BackgroundWorkerFgService {
final BackgroundWorkerFgHostApi _foregroundHostApi; final BackgroundWorkerFgHostApi _foregroundHostApi;
@ -42,6 +50,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
final Drift _drift; final Drift _drift;
final DriftLogger _driftLogger; final DriftLogger _driftLogger;
final BackgroundWorkerBgHostApi _backgroundHostApi; final BackgroundWorkerBgHostApi _backgroundHostApi;
final CancellationToken _cancellationToken = CancellationToken();
final Logger _logger = Logger('BackgroundWorkerBgService'); final Logger _logger = Logger('BackgroundWorkerBgService');
bool _isCleanedUp = false; bool _isCleanedUp = false;
@ -87,6 +96,13 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
configureFileDownloaderNotifications(); configureFileDownloaderNotifications();
if (Platform.isAndroid) {
await _backgroundHostApi.showNotification(
IntlKeys.uploading_media.t(),
IntlKeys.backup_background_service_in_progress_notification.t(),
);
}
// Notify the host that the background worker service has been initialized and is ready to use // Notify the host that the background worker service has been initialized and is ready to use
_backgroundHostApi.onInitialized(); _backgroundHostApi.onInitialized();
} catch (error, stack) { } catch (error, stack) {
@ -102,7 +118,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
final sw = Stopwatch()..start(); final sw = Stopwatch()..start();
await _syncAssets(hashTimeout: Duration(minutes: _isBackupEnabled ? 3 : 6)); await _syncAssets(hashTimeout: Duration(minutes: _isBackupEnabled ? 3 : 6));
await _handleBackup(processBulk: false); await _handleBackup();
sw.stop(); sw.stop();
_logger.info("Android background processing completed in ${sw.elapsed.inSeconds}s"); _logger.info("Android background processing completed in ${sw.elapsed.inSeconds}s");
@ -144,7 +160,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
try { try {
await _cleanup(); await _cleanup();
} catch (error, stack) { } catch (error, stack) {
debugPrint('Failed to cleanup background worker: $error with stack: $stack'); dPrint(() => 'Failed to cleanup background worker: $error with stack: $stack');
} }
} }
@ -154,28 +170,36 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
} }
try { try {
final backgroundSyncManager = _ref.read(backgroundSyncProvider);
_isCleanedUp = true; _isCleanedUp = true;
_ref.dispose();
_cancellationToken.cancel();
_logger.info("Cleaning up background worker"); _logger.info("Cleaning up background worker");
final cleanupFutures = [ final cleanupFutures = [
workerManager.dispose(), workerManager.dispose().catchError((_) async {
// Discard any errors on the dispose call
return;
}),
_drift.close(), _drift.close(),
_driftLogger.close(), _driftLogger.close(),
_ref.read(backgroundSyncProvider).cancel(), backgroundSyncManager.cancel(),
_ref.read(backgroundSyncProvider).cancelLocal(), backgroundSyncManager.cancelLocal(),
]; ];
if (_isar.isOpen) { if (_isar.isOpen) {
cleanupFutures.add(_isar.close()); cleanupFutures.add(_isar.close());
} }
_ref.dispose();
await Future.wait(cleanupFutures); await Future.wait(cleanupFutures);
_logger.info("Background worker resources cleaned up"); _logger.info("Background worker resources cleaned up");
} catch (error, stack) { } catch (error, stack) {
debugPrint('Failed to cleanup background worker: $error with stack: $stack'); dPrint(() => 'Failed to cleanup background worker: $error with stack: $stack');
} }
} }
Future<void> _handleBackup({bool processBulk = true}) async { Future<void> _handleBackup() async {
await runZonedGuarded(
() async {
if (!_isBackupEnabled || _isCleanedUp) { if (!_isBackupEnabled || _isCleanedUp) {
_logger.info("[_handleBackup 1] Backup is disabled. Skipping backup routine"); _logger.info("[_handleBackup 1] Backup is disabled. Skipping backup routine");
return; return;
@ -189,19 +213,27 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
return; return;
} }
if (processBulk) {
_logger.info("[_handleBackup 4] Resume backup from background"); _logger.info("[_handleBackup 4] Resume backup from background");
if (Platform.isIOS) {
return _ref.read(driftBackupProvider.notifier).handleBackupResume(currentUser.id); return _ref.read(driftBackupProvider.notifier).handleBackupResume(currentUser.id);
} }
final activeTask = await _ref.read(uploadServiceProvider).getActiveTasks(currentUser.id); final canPing = await _ref.read(serverInfoServiceProvider).ping();
if (activeTask.isNotEmpty) { if (!canPing) {
_logger.info("[_handleBackup 5] Resuming backup for active tasks from background"); _logger.warning("[_handleBackup 5] Server is not reachable. Skipping backup from background");
await _ref.read(uploadServiceProvider).resumeBackup(); return;
} else {
_logger.info("[_handleBackup 6] Starting serial backup for new tasks from background");
await _ref.read(uploadServiceProvider).startBackupSerial(currentUser.id);
} }
final networkCapabilities = await _ref.read(connectivityApiProvider).getCapabilities();
return _ref
.read(uploadServiceProvider)
.startBackupWithHttpClient(currentUser.id, networkCapabilities.hasWifi, _cancellationToken);
},
(error, stack) {
dPrint(() => "Error in backup zone $error, $stack");
},
);
} }
Future<void> _syncAssets({Duration? hashTimeout}) async { Future<void> _syncAssets({Duration? hashTimeout}) async {

View file

@ -1,11 +1,11 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/models/log.model.dart'; import 'package:immich_mobile/domain/models/log.model.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/infrastructure/repositories/log.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/log.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/store.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/store.repository.dart';
import 'package:immich_mobile/utils/debug_print.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
/// Service responsible for handling application logging. /// Service responsible for handling application logging.
@ -66,13 +66,12 @@ class LogService {
} }
void _handleLogRecord(LogRecord r) { void _handleLogRecord(LogRecord r) {
if (kDebugMode) { dPrint(
debugPrint( () =>
'[${r.level.name}] [${r.time}] [${r.loggerName}] ${r.message}' '[${r.level.name}] [${r.time}] [${r.loggerName}] ${r.message}'
'${r.error == null ? '' : '\nError: ${r.error}'}' '${r.error == null ? '' : '\nError: ${r.error}'}'
'${r.stackTrace == null ? '' : '\nStack: ${r.stackTrace}'}', '${r.stackTrace == null ? '' : '\nStack: ${r.stackTrace}'}',
); );
}
final record = LogMessage( final record = LogMessage(
message: r.message, message: r.message,

View file

@ -1,7 +1,7 @@
import 'package:flutter/foundation.dart';
import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/domain/models/user.model.dart';
import 'package:immich_mobile/infrastructure/repositories/partner.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/partner.repository.dart';
import 'package:immich_mobile/repositories/partner_api.repository.dart'; import 'package:immich_mobile/repositories/partner_api.repository.dart';
import 'package:immich_mobile/utils/debug_print.dart';
class DriftPartnerService { class DriftPartnerService {
final DriftPartnerRepository _driftPartnerRepository; final DriftPartnerRepository _driftPartnerRepository;
@ -30,7 +30,7 @@ class DriftPartnerService {
Future<void> toggleShowInTimeline(String partnerId, String userId) async { Future<void> toggleShowInTimeline(String partnerId, String userId) async {
final partner = await _driftPartnerRepository.getPartner(partnerId, userId); final partner = await _driftPartnerRepository.getPartner(partnerId, userId);
if (partner == null) { if (partner == null) {
debugPrint("Partner not found: $partnerId for user: $userId"); dPrint(() => "Partner not found: $partnerId for user: $userId");
return; return;
} }

View file

@ -1,4 +1,3 @@
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/album/local_album.model.dart'; import 'package:immich_mobile/domain/models/album/local_album.model.dart';
import 'package:immich_mobile/infrastructure/repositories/local_album.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/local_album.repository.dart';
@ -6,6 +5,7 @@ import 'package:immich_mobile/infrastructure/repositories/remote_album.repositor
import 'package:immich_mobile/providers/infrastructure/album.provider.dart'; import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
import 'package:immich_mobile/repositories/drift_album_api_repository.dart'; import 'package:immich_mobile/repositories/drift_album_api_repository.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:immich_mobile/utils/debug_print.dart';
final syncLinkedAlbumServiceProvider = Provider( final syncLinkedAlbumServiceProvider = Provider(
(ref) => SyncLinkedAlbumService( (ref) => SyncLinkedAlbumService(
@ -100,7 +100,7 @@ class SyncLinkedAlbumService {
/// Creates a new remote album and links it to the local album /// Creates a new remote album and links it to the local album
Future<void> _createAndLinkNewRemoteAlbum(LocalAlbum localAlbum) async { Future<void> _createAndLinkNewRemoteAlbum(LocalAlbum localAlbum) async {
debugPrint("Creating new remote album for local album: ${localAlbum.name}"); dPrint(() => "Creating new remote album for local album: ${localAlbum.name}");
final newRemoteAlbum = await _albumApiRepository.createDriftAlbum(localAlbum.name, assetIds: []); final newRemoteAlbum = await _albumApiRepository.createDriftAlbum(localAlbum.name, assetIds: []);
await _remoteAlbumRepository.create(newRemoteAlbum, []); await _remoteAlbumRepository.create(newRemoteAlbum, []);
return _localAlbumRepository.linkRemoteAlbum(localAlbum.id, newRemoteAlbum.id); return _localAlbumRepository.linkRemoteAlbum(localAlbum.id, newRemoteAlbum.id);

View file

@ -1,9 +1,10 @@
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/domain/services/sync_linked_album.service.dart'; import 'package:immich_mobile/domain/services/sync_linked_album.service.dart';
import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/entities/store.entity.dart';
Future<void> syncLinkedAlbumsIsolated(ProviderContainer ref) { Future<void> syncLinkedAlbumsIsolated(ProviderContainer ref) {
final user = ref.read(currentUserProvider); final user = Store.tryGet(StoreKey.currentUser);
if (user == null) { if (user == null) {
return Future.value(); return Future.value();
} }

View file

@ -0,0 +1,8 @@
import 'package:immich_mobile/platform/connectivity_api.g.dart';
extension NetworkCapabilitiesGetters on List<NetworkCapability> {
bool get hasCellular => contains(NetworkCapability.cellular);
bool get hasWifi => contains(NetworkCapability.wifi);
bool get hasVpn => contains(NetworkCapability.vpn);
bool get isUnmetered => contains(NetworkCapability.unmetered);
}

View file

@ -1,6 +1,7 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:intl/message_format.dart'; import 'package:intl/message_format.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:immich_mobile/utils/debug_print.dart';
extension StringTranslateExtension on String { extension StringTranslateExtension on String {
String t({BuildContext? context, Map<String, Object>? args}) { String t({BuildContext? context, Map<String, Object>? args}) {
@ -39,7 +40,7 @@ String _translateHelper(BuildContext? context, String key, [Map<String, Object>?
? MessageFormat(translatedMessage, locale: Intl.defaultLocale ?? 'en').format(args) ? MessageFormat(translatedMessage, locale: Intl.defaultLocale ?? 'en').format(args)
: translatedMessage; : translatedMessage;
} catch (e) { } catch (e) {
debugPrint('Translation failed for key "$key". Error: $e'); dPrint(() => 'Translation failed for key "$key". Error: $e');
return key; return key;
} }
} }

View file

@ -595,7 +595,7 @@ extension on String {
GroupAssetsBy.none => throw ArgumentError("GroupAssetsBy.none is not supported for date formatting"), GroupAssetsBy.none => throw ArgumentError("GroupAssetsBy.none is not supported for date formatting"),
}; };
try { try {
return DateFormat(format).parse(this); return DateFormat(format, 'en').parse(this);
} catch (e) { } catch (e) {
throw FormatException("Invalid date format: $this", e); throw FormatException("Invalid date format: $this", e);
} }

View file

@ -39,6 +39,7 @@ import 'package:intl/date_symbol_data_local.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:timezone/data/latest.dart'; import 'package:timezone/data/latest.dart';
import 'package:worker_manager/worker_manager.dart'; import 'package:worker_manager/worker_manager.dart';
import 'package:immich_mobile/utils/debug_print.dart';
void main() async { void main() async {
ImmichWidgetsBinding(); ImmichWidgetsBinding();
@ -69,9 +70,9 @@ Future<void> initApp() async {
if (kReleaseMode && Platform.isAndroid) { if (kReleaseMode && Platform.isAndroid) {
try { try {
await FlutterDisplayMode.setHighRefreshRate(); await FlutterDisplayMode.setHighRefreshRate();
debugPrint("Enabled high refresh mode"); dPrint(() => "Enabled high refresh mode");
} catch (e) { } catch (e) {
debugPrint("Error setting high refresh rate: $e"); dPrint(() => "Error setting high refresh rate: $e");
} }
} }
@ -126,23 +127,23 @@ class ImmichAppState extends ConsumerState<ImmichApp> with WidgetsBindingObserve
void didChangeAppLifecycleState(AppLifecycleState state) { void didChangeAppLifecycleState(AppLifecycleState state) {
switch (state) { switch (state) {
case AppLifecycleState.resumed: case AppLifecycleState.resumed:
debugPrint("[APP STATE] resumed"); dPrint(() => "[APP STATE] resumed");
ref.read(appStateProvider.notifier).handleAppResume(); ref.read(appStateProvider.notifier).handleAppResume();
break; break;
case AppLifecycleState.inactive: case AppLifecycleState.inactive:
debugPrint("[APP STATE] inactive"); dPrint(() => "[APP STATE] inactive");
ref.read(appStateProvider.notifier).handleAppInactivity(); ref.read(appStateProvider.notifier).handleAppInactivity();
break; break;
case AppLifecycleState.paused: case AppLifecycleState.paused:
debugPrint("[APP STATE] paused"); dPrint(() => "[APP STATE] paused");
ref.read(appStateProvider.notifier).handleAppPause(); ref.read(appStateProvider.notifier).handleAppPause();
break; break;
case AppLifecycleState.detached: case AppLifecycleState.detached:
debugPrint("[APP STATE] detached"); dPrint(() => "[APP STATE] detached");
ref.read(appStateProvider.notifier).handleAppDetached(); ref.read(appStateProvider.notifier).handleAppDetached();
break; break;
case AppLifecycleState.hidden: case AppLifecycleState.hidden:
debugPrint("[APP STATE] hidden"); dPrint(() => "[APP STATE] hidden");
ref.read(appStateProvider.notifier).handleAppHidden(); ref.read(appStateProvider.notifier).handleAppHidden();
break; break;
} }
@ -200,7 +201,7 @@ class ImmichAppState extends ConsumerState<ImmichApp> with WidgetsBindingObserve
@override @override
initState() { initState() {
super.initState(); super.initState();
initApp().then((_) => debugPrint("App Init Completed")); initApp().then((_) => dPrint(() => "App Init Completed"));
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
// needs to be delayed so that EasyLocalization is working // needs to be delayed so that EasyLocalization is working
if (Store.isBetaTimelineEnabled) { if (Store.isBetaTimelineEnabled) {

View file

@ -12,7 +12,6 @@ import 'package:immich_mobile/widgets/settings/asset_viewer_settings/asset_viewe
import 'package:immich_mobile/widgets/settings/backup_settings/backup_settings.dart'; import 'package:immich_mobile/widgets/settings/backup_settings/backup_settings.dart';
import 'package:immich_mobile/widgets/settings/backup_settings/drift_backup_settings.dart'; import 'package:immich_mobile/widgets/settings/backup_settings/drift_backup_settings.dart';
import 'package:immich_mobile/widgets/settings/beta_sync_settings/sync_status_and_actions.dart'; import 'package:immich_mobile/widgets/settings/beta_sync_settings/sync_status_and_actions.dart';
import 'package:immich_mobile/widgets/settings/beta_timeline_list_tile.dart';
import 'package:immich_mobile/widgets/settings/language_settings.dart'; import 'package:immich_mobile/widgets/settings/language_settings.dart';
import 'package:immich_mobile/widgets/settings/networking_settings/networking_settings.dart'; import 'package:immich_mobile/widgets/settings/networking_settings/networking_settings.dart';
import 'package:immich_mobile/widgets/settings/notification_setting.dart'; import 'package:immich_mobile/widgets/settings/notification_setting.dart';
@ -20,7 +19,6 @@ import 'package:immich_mobile/widgets/settings/preference_settings/preference_se
import 'package:immich_mobile/widgets/settings/settings_card.dart'; import 'package:immich_mobile/widgets/settings/settings_card.dart';
enum SettingSection { enum SettingSection {
beta('sync_status', Icons.sync_outlined, "sync_status_subtitle"),
advanced('advanced', Icons.build_outlined, "advanced_settings_tile_subtitle"), advanced('advanced', Icons.build_outlined, "advanced_settings_tile_subtitle"),
assetViewer('asset_viewer_settings_title', Icons.image_outlined, "asset_viewer_settings_subtitle"), assetViewer('asset_viewer_settings_title', Icons.image_outlined, "asset_viewer_settings_subtitle"),
backup('backup', Icons.cloud_upload_outlined, "backup_settings_subtitle"), backup('backup', Icons.cloud_upload_outlined, "backup_settings_subtitle"),
@ -28,14 +26,14 @@ enum SettingSection {
networking('networking_settings', Icons.wifi, "networking_subtitle"), networking('networking_settings', Icons.wifi, "networking_subtitle"),
notifications('notifications', Icons.notifications_none_rounded, "setting_notifications_subtitle"), notifications('notifications', Icons.notifications_none_rounded, "setting_notifications_subtitle"),
preferences('preferences_settings_title', Icons.interests_outlined, "preferences_settings_subtitle"), preferences('preferences_settings_title', Icons.interests_outlined, "preferences_settings_subtitle"),
timeline('asset_list_settings_title', Icons.auto_awesome_mosaic_outlined, "asset_list_settings_subtitle"); timeline('asset_list_settings_title', Icons.auto_awesome_mosaic_outlined, "asset_list_settings_subtitle"),
beta('sync_status', Icons.sync_outlined, "sync_status_subtitle");
final String title; final String title;
final String subtitle; final String subtitle;
final IconData icon; final IconData icon;
Widget get widget => switch (this) { Widget get widget => switch (this) {
SettingSection.beta => const _BetaLandscapeToggle(),
SettingSection.advanced => const AdvancedSettings(), SettingSection.advanced => const AdvancedSettings(),
SettingSection.assetViewer => const AssetViewerSettings(), SettingSection.assetViewer => const AssetViewerSettings(),
SettingSection.backup => SettingSection.backup =>
@ -45,6 +43,7 @@ enum SettingSection {
SettingSection.notifications => const NotificationSetting(), SettingSection.notifications => const NotificationSetting(),
SettingSection.preferences => const PreferenceSetting(), SettingSection.preferences => const PreferenceSetting(),
SettingSection.timeline => const AssetListSettings(), SettingSection.timeline => const AssetListSettings(),
SettingSection.beta => const SyncStatusAndActions(),
}; };
const SettingSection(this.title, this.icon, this.subtitle); const SettingSection(this.title, this.icon, this.subtitle);
@ -59,7 +58,7 @@ class SettingsPage extends StatelessWidget {
context.locale; context.locale;
return Scaffold( return Scaffold(
appBar: AppBar(centerTitle: false, title: const Text('settings').tr()), appBar: AppBar(centerTitle: false, title: const Text('settings').tr()),
body: context.isMobile ? const _MobileLayout() : const _TabletLayout(), body: context.isMobile ? const SafeArea(child: _MobileLayout()) : const SafeArea(child: _TabletLayout()),
); );
} }
} }
@ -72,7 +71,6 @@ class _MobileLayout extends StatelessWidget {
.expand( .expand(
(setting) => setting == SettingSection.beta (setting) => setting == SettingSection.beta
? [ ? [
const BetaTimelineListTile(),
if (Store.isBetaTimelineEnabled) if (Store.isBetaTimelineEnabled)
SettingsCard( SettingsCard(
icon: Icons.sync_outlined, icon: Icons.sync_outlined,
@ -93,7 +91,7 @@ class _MobileLayout extends StatelessWidget {
.toList(); .toList();
return ListView( return ListView(
physics: const ClampingScrollPhysics(), physics: const ClampingScrollPhysics(),
padding: const EdgeInsets.only(top: 10.0, bottom: 56), padding: const EdgeInsets.only(top: 10.0, bottom: 16),
children: [...settings], children: [...settings],
); );
} }
@ -134,21 +132,6 @@ class _TabletLayout extends HookWidget {
} }
} }
class _BetaLandscapeToggle extends HookWidget {
const _BetaLandscapeToggle();
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
const SizedBox(height: 100, child: BetaTimelineListTile()),
if (Store.isBetaTimelineEnabled) const Expanded(child: SyncStatusAndActions()),
],
);
}
}
@RoutePage() @RoutePage()
class SettingsSubPage extends StatelessWidget { class SettingsSubPage extends StatelessWidget {
const SettingsSubPage(this.section, {super.key}); const SettingsSubPage(this.section, {super.key});
@ -158,9 +141,14 @@ class SettingsSubPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
context.locale; context.locale;
return Scaffold( return SafeArea(
bottom: true,
top: false,
right: true,
child: Scaffold(
appBar: AppBar(centerTitle: false, title: Text(section.title).tr()), appBar: AppBar(centerTitle: false, title: Text(section.title).tr()),
body: section.widget, body: section.widget,
),
); );
} }
} }

View file

@ -142,6 +142,29 @@ class BackgroundWorkerBgHostApi {
} }
} }
Future<void> showNotification(String title, String content) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.immich_mobile.BackgroundWorkerBgHostApi.showNotification$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[title, content]);
final List<Object?>? pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
throw _createConnectionError(pigeonVar_channelName);
} else if (pigeonVar_replyList.length > 1) {
throw PlatformException(
code: pigeonVar_replyList[0]! as String,
message: pigeonVar_replyList[1] as String?,
details: pigeonVar_replyList[2],
);
} else {
return;
}
}
Future<void> close() async { Future<void> close() async {
final String pigeonVar_channelName = final String pigeonVar_channelName =
'dev.flutter.pigeon.immich_mobile.BackgroundWorkerBgHostApi.close$pigeonVar_messageChannelSuffix'; 'dev.flutter.pigeon.immich_mobile.BackgroundWorkerBgHostApi.close$pigeonVar_messageChannelSuffix';

View file

@ -0,0 +1,87 @@
// Autogenerated from Pigeon (v26.0.0), do not edit directly.
// See also: https://pub.dev/packages/pigeon
// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers
import 'dart:async';
import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List;
import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer;
import 'package:flutter/services.dart';
PlatformException _createConnectionError(String channelName) {
return PlatformException(
code: 'channel-error',
message: 'Unable to establish connection on channel: "$channelName".',
);
}
enum NetworkCapability { cellular, wifi, vpn, unmetered }
class _PigeonCodec extends StandardMessageCodec {
const _PigeonCodec();
@override
void writeValue(WriteBuffer buffer, Object? value) {
if (value is int) {
buffer.putUint8(4);
buffer.putInt64(value);
} else if (value is NetworkCapability) {
buffer.putUint8(129);
writeValue(buffer, value.index);
} else {
super.writeValue(buffer, value);
}
}
@override
Object? readValueOfType(int type, ReadBuffer buffer) {
switch (type) {
case 129:
final int? value = readValue(buffer) as int?;
return value == null ? null : NetworkCapability.values[value];
default:
return super.readValueOfType(type, buffer);
}
}
}
class ConnectivityApi {
/// Constructor for [ConnectivityApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
ConnectivityApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''})
: pigeonVar_binaryMessenger = binaryMessenger,
pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';
final BinaryMessenger? pigeonVar_binaryMessenger;
static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();
final String pigeonVar_messageChannelSuffix;
Future<List<NetworkCapability>> getCapabilities() async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.immich_mobile.ConnectivityApi.getCapabilities$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
final List<Object?>? pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
throw _createConnectionError(pigeonVar_channelName);
} else if (pigeonVar_replyList.length > 1) {
throw PlatformException(
code: pigeonVar_replyList[0]! as String,
message: pigeonVar_replyList[1] as String?,
details: pigeonVar_replyList[2],
);
} else if (pigeonVar_replyList[0] == null) {
throw PlatformException(
code: 'null-error',
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (pigeonVar_replyList[0] as List<Object?>?)!.cast<NetworkCapability>();
}
}
}

View file

@ -10,6 +10,7 @@ import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart';
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart'; import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
import 'package:immich_mobile/utils/debug_print.dart';
@RoutePage() @RoutePage()
class DriftPartnerDetailPage extends StatelessWidget { class DriftPartnerDetailPage extends StatelessWidget {
@ -68,7 +69,7 @@ class _InfoBoxState extends ConsumerState<_InfoBox> {
_inTimeline = !_inTimeline; _inTimeline = !_inTimeline;
}); });
} catch (error, stack) { } catch (error, stack) {
debugPrint("Failed to toggle in timeline: $error $stack"); dPrint(() => "Failed to toggle in timeline: $error $stack");
ImmichToast.show( ImmichToast.show(
context: context, context: context,
toastType: ToastType.error, toastType: ToastType.error,

View file

@ -14,9 +14,10 @@ import 'package:immich_mobile/presentation/widgets/action_buttons/unfavorite_act
import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart'; import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart';
import 'package:immich_mobile/providers/cast.provider.dart'; import 'package:immich_mobile/providers/cast.provider.dart';
import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart'; import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart';
import 'package:immich_mobile/providers/infrastructure/readonly_mode.provider.dart';
import 'package:immich_mobile/providers/infrastructure/current_album.provider.dart'; import 'package:immich_mobile/providers/infrastructure/current_album.provider.dart';
import 'package:immich_mobile/providers/infrastructure/readonly_mode.provider.dart';
import 'package:immich_mobile/providers/routes.provider.dart'; import 'package:immich_mobile/providers/routes.provider.dart';
import 'package:immich_mobile/providers/tab.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/routing/router.dart';
@ -38,8 +39,9 @@ class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget {
final isReadonlyModeEnabled = ref.watch(readonlyModeProvider); final isReadonlyModeEnabled = ref.watch(readonlyModeProvider);
final previousRouteName = ref.watch(previousRouteNameProvider); final previousRouteName = ref.watch(previousRouteNameProvider);
final tabRoute = ref.watch(tabProvider);
final showViewInTimelineButton = final showViewInTimelineButton =
previousRouteName != TabShellRoute.name && (previousRouteName != TabShellRoute.name || tabRoute == TabEnum.search) &&
previousRouteName != AssetViewerRoute.name && previousRouteName != AssetViewerRoute.name &&
previousRouteName != null; previousRouteName != null;

View file

@ -43,7 +43,7 @@ class ArchiveBottomSheet extends ConsumerWidget {
const EditDateTimeActionButton(source: ActionSource.timeline), const EditDateTimeActionButton(source: ActionSource.timeline),
const EditLocationActionButton(source: ActionSource.timeline), const EditLocationActionButton(source: ActionSource.timeline),
const MoveToLockFolderActionButton(source: ActionSource.timeline), const MoveToLockFolderActionButton(source: ActionSource.timeline),
const StackActionButton(source: ActionSource.timeline), if (multiselect.selectedAssets.length > 1) const StackActionButton(source: ActionSource.timeline),
], ],
if (multiselect.hasLocal) ...[ if (multiselect.hasLocal) ...[
const DeleteLocalActionButton(source: ActionSource.timeline), const DeleteLocalActionButton(source: ActionSource.timeline),

View file

@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/archive_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/archive_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/delete_permanent_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/delete_local_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/delete_local_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/delete_permanent_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/download_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/download_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/edit_date_time_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/edit_date_time_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/edit_location_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/edit_location_action_button.widget.dart';
@ -43,7 +43,7 @@ class FavoriteBottomSheet extends ConsumerWidget {
const EditDateTimeActionButton(source: ActionSource.timeline), const EditDateTimeActionButton(source: ActionSource.timeline),
const EditLocationActionButton(source: ActionSource.timeline), const EditLocationActionButton(source: ActionSource.timeline),
const MoveToLockFolderActionButton(source: ActionSource.timeline), const MoveToLockFolderActionButton(source: ActionSource.timeline),
const StackActionButton(source: ActionSource.timeline), if (multiselect.selectedAssets.length > 1) const StackActionButton(source: ActionSource.timeline),
], ],
if (multiselect.hasLocal) ...[ if (multiselect.hasLocal) ...[
const DeleteLocalActionButton(source: ActionSource.timeline), const DeleteLocalActionButton(source: ActionSource.timeline),

View file

@ -104,7 +104,7 @@ class _GeneralBottomSheetState extends ConsumerState<GeneralBottomSheet> {
const EditDateTimeActionButton(source: ActionSource.timeline), const EditDateTimeActionButton(source: ActionSource.timeline),
const EditLocationActionButton(source: ActionSource.timeline), const EditLocationActionButton(source: ActionSource.timeline),
const MoveToLockFolderActionButton(source: ActionSource.timeline), const MoveToLockFolderActionButton(source: ActionSource.timeline),
const StackActionButton(source: ActionSource.timeline), if (multiselect.selectedAssets.length > 1) const StackActionButton(source: ActionSource.timeline),
isTrashEnable isTrashEnable
? const TrashActionButton(source: ActionSource.timeline) ? const TrashActionButton(source: ActionSource.timeline)
: const DeletePermanentActionButton(source: ActionSource.timeline), : const DeletePermanentActionButton(source: ActionSource.timeline),

View file

@ -1,12 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/domain/models/album/album.model.dart'; import 'package:immich_mobile/domain/models/album/album.model.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/archive_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/archive_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/delete_permanent_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/delete_local_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/delete_local_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/delete_permanent_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/download_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/download_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/edit_date_time_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/edit_date_time_action_button.widget.dart';
import 'package:immich_mobile/presentation/widgets/action_buttons/edit_location_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/edit_location_action_button.widget.dart';
@ -100,7 +100,7 @@ class _RemoteAlbumBottomSheetState extends ConsumerState<RemoteAlbumBottomSheet>
const EditDateTimeActionButton(source: ActionSource.timeline), const EditDateTimeActionButton(source: ActionSource.timeline),
const EditLocationActionButton(source: ActionSource.timeline), const EditLocationActionButton(source: ActionSource.timeline),
const MoveToLockFolderActionButton(source: ActionSource.timeline), const MoveToLockFolderActionButton(source: ActionSource.timeline),
const StackActionButton(source: ActionSource.timeline), if (multiselect.selectedAssets.length > 1) const StackActionButton(source: ActionSource.timeline),
], ],
if (multiselect.hasLocal) ...[ if (multiselect.hasLocal) ...[
const DeleteLocalActionButton(source: ActionSource.timeline), const DeleteLocalActionButton(source: ActionSource.timeline),

View file

@ -8,6 +8,7 @@ import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/providers/infrastructure/people.provider.dart'; import 'package:immich_mobile/providers/infrastructure/people.provider.dart';
import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart';
import 'package:scroll_date_picker/scroll_date_picker.dart'; import 'package:scroll_date_picker/scroll_date_picker.dart';
import 'package:immich_mobile/utils/debug_print.dart';
class DriftPersonBirthdayEditForm extends ConsumerStatefulWidget { class DriftPersonBirthdayEditForm extends ConsumerStatefulWidget {
final DriftPerson person; final DriftPerson person;
@ -36,7 +37,7 @@ class _DriftPersonNameEditFormState extends ConsumerState<DriftPersonBirthdayEdi
context.pop<DateTime>(_selectedDate); context.pop<DateTime>(_selectedDate);
} }
} catch (error) { } catch (error) {
debugPrint('Error updating birthday: $error'); dPrint(() => 'Error updating birthday: $error');
if (!context.mounted) { if (!context.mounted) {
return; return;

View file

@ -7,6 +7,7 @@ import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/providers/infrastructure/people.provider.dart'; import 'package:immich_mobile/providers/infrastructure/people.provider.dart';
import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart';
import 'package:immich_mobile/utils/debug_print.dart';
class DriftPersonNameEditForm extends ConsumerStatefulWidget { class DriftPersonNameEditForm extends ConsumerStatefulWidget {
final DriftPerson person; final DriftPerson person;
@ -34,7 +35,7 @@ class _DriftPersonNameEditFormState extends ConsumerState<DriftPersonNameEditFor
context.pop<String>(newName); context.pop<String>(newName);
} }
} catch (error) { } catch (error) {
debugPrint('Error updating name: $error'); dPrint(() => 'Error updating name: $error');
if (!context.mounted) { if (!context.mounted) {
return; return;

View file

@ -1,4 +1,3 @@
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
@ -13,6 +12,7 @@ import 'package:immich_mobile/services/etag.service.dart';
import 'package:immich_mobile/services/exif.service.dart'; import 'package:immich_mobile/services/exif.service.dart';
import 'package:immich_mobile/services/sync.service.dart'; import 'package:immich_mobile/services/sync.service.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:immich_mobile/utils/debug_print.dart';
final assetProvider = StateNotifierProvider<AssetNotifier, bool>((ref) { final assetProvider = StateNotifierProvider<AssetNotifier, bool>((ref) {
return AssetNotifier( return AssetNotifier(
@ -68,7 +68,7 @@ class AssetNotifier extends StateNotifier<bool> {
} }
final bool newRemote = await _assetService.refreshRemoteAssets(); final bool newRemote = await _assetService.refreshRemoteAssets();
final bool newLocal = await _albumService.refreshDeviceAlbums(); final bool newLocal = await _albumService.refreshDeviceAlbums();
debugPrint("changedUsers: $changedUsers, newRemote: $newRemote, newLocal: $newLocal"); dPrint(() => "changedUsers: $changedUsers, newRemote: $newRemote, newLocal: $newLocal");
if (newRemote) { if (newRemote) {
_ref.invalidate(memoryFutureProvider); _ref.invalidate(memoryFutureProvider);
} }

View file

@ -1,4 +1,3 @@
import 'package:flutter/foundation.dart';
import 'package:flutter_udid/flutter_udid.dart'; import 'package:flutter_udid/flutter_udid.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/constants/constants.dart';
@ -18,6 +17,7 @@ import 'package:immich_mobile/services/widget.service.dart';
import 'package:immich_mobile/utils/hash.dart'; import 'package:immich_mobile/utils/hash.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:openapi/api.dart'; import 'package:openapi/api.dart';
import 'package:immich_mobile/utils/debug_print.dart';
final authProvider = StateNotifierProvider<AuthNotifier, AuthState>((ref) { final authProvider = StateNotifierProvider<AuthNotifier, AuthState>((ref) {
return AuthNotifier( return AuthNotifier(
@ -150,10 +150,7 @@ class AuthNotifier extends StateNotifier<AuthState> {
_log.severe("Error getting user information from the server [API EXCEPTION]", stackTrace); _log.severe("Error getting user information from the server [API EXCEPTION]", stackTrace);
} catch (error, stackTrace) { } catch (error, stackTrace) {
_log.severe("Error getting user information from the server [CATCH ALL]", error, stackTrace); _log.severe("Error getting user information from the server [CATCH ALL]", error, stackTrace);
dPrint(() => "Error getting user information from the server [CATCH ALL] $error $stackTrace");
if (kDebugMode) {
debugPrint("Error getting user information from the server [CATCH ALL] $error $stackTrace");
}
} }
// If the user is null, the login was not successful // If the user is null, the login was not successful

View file

@ -2,8 +2,6 @@ import 'dart:io';
import 'package:cancellation_token_http/http.dart'; import 'package:cancellation_token_http/http.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/album.entity.dart'; import 'package:immich_mobile/entities/album.entity.dart';
@ -33,6 +31,7 @@ import 'package:immich_mobile/utils/diff.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:photo_manager/photo_manager.dart' show PMProgressHandler; import 'package:photo_manager/photo_manager.dart' show PMProgressHandler;
import 'package:immich_mobile/utils/debug_print.dart';
final backupProvider = StateNotifierProvider<BackupNotifier, BackUpState>((ref) { final backupProvider = StateNotifierProvider<BackupNotifier, BackUpState>((ref) {
return BackupNotifier( return BackupNotifier(
@ -286,7 +285,7 @@ class BackupNotifier extends StateNotifier<BackUpState> {
state = state.copyWith(selectedBackupAlbums: selectedAlbums, excludedBackupAlbums: excludedAlbums); state = state.copyWith(selectedBackupAlbums: selectedAlbums, excludedBackupAlbums: excludedAlbums);
log.info("_getBackupAlbumsInfo: Found ${availableAlbums.length} available albums"); log.info("_getBackupAlbumsInfo: Found ${availableAlbums.length} available albums");
debugPrint("_getBackupAlbumsInfo takes ${stopwatch.elapsedMilliseconds}ms"); dPrint(() => "_getBackupAlbumsInfo takes ${stopwatch.elapsedMilliseconds}ms");
} }
/// ///
@ -428,7 +427,7 @@ class BackupNotifier extends StateNotifier<BackUpState> {
/// Invoke backup process /// Invoke backup process
Future<void> startBackupProcess() async { Future<void> startBackupProcess() async {
debugPrint("Start backup process"); dPrint(() => "Start backup process");
assert(state.backupProgress == BackUpProgressEnum.idle); assert(state.backupProgress == BackUpProgressEnum.idle);
state = state.copyWith(backupProgress: BackUpProgressEnum.inProgress); state = state.copyWith(backupProgress: BackUpProgressEnum.inProgress);

View file

@ -4,7 +4,6 @@ import 'dart:convert';
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/models/album/local_album.model.dart'; import 'package:immich_mobile/domain/models/album/local_album.model.dart';
@ -14,6 +13,7 @@ import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/services/upload.service.dart'; import 'package:immich_mobile/services/upload.service.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:immich_mobile/utils/debug_print.dart';
class EnqueueStatus { class EnqueueStatus {
final int enqueueCount; final int enqueueCount;
@ -329,16 +329,16 @@ class DriftBackupNotifier extends StateNotifier<DriftBackupState> {
} }
Future<void> cancel() async { Future<void> cancel() async {
debugPrint("Canceling backup tasks..."); dPrint(() => "Canceling backup tasks...");
state = state.copyWith(enqueueCount: 0, enqueueTotalCount: 0, isCanceling: true); state = state.copyWith(enqueueCount: 0, enqueueTotalCount: 0, isCanceling: true);
final activeTaskCount = await _uploadService.cancelBackup(); final activeTaskCount = await _uploadService.cancelBackup();
if (activeTaskCount > 0) { if (activeTaskCount > 0) {
debugPrint("$activeTaskCount tasks left, continuing to cancel..."); dPrint(() => "$activeTaskCount tasks left, continuing to cancel...");
await cancel(); await cancel();
} else { } else {
debugPrint("All tasks canceled successfully."); dPrint(() => "All tasks canceled successfully.");
// Clear all upload items when cancellation is complete // Clear all upload items when cancellation is complete
state = state.copyWith(isCanceling: false, uploadItems: {}); state = state.copyWith(isCanceling: false, uploadItems: {});
} }

View file

@ -30,6 +30,7 @@ import 'package:immich_mobile/widgets/common/immich_toast.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:photo_manager/photo_manager.dart' show PMProgressHandler; import 'package:photo_manager/photo_manager.dart' show PMProgressHandler;
import 'package:immich_mobile/utils/debug_print.dart';
final manualUploadProvider = StateNotifierProvider<ManualUploadNotifier, ManualUploadState>((ref) { final manualUploadProvider = StateNotifierProvider<ManualUploadNotifier, ManualUploadState>((ref) {
return ManualUploadNotifier( return ManualUploadNotifier(
@ -216,7 +217,7 @@ class ManualUploadNotifier extends StateNotifier<ManualUploadState> {
); );
if (uploadAssets.isEmpty) { if (uploadAssets.isEmpty) {
debugPrint("[_startUpload] No Assets to upload - Abort Process"); dPrint(() => "[_startUpload] No Assets to upload - Abort Process");
_backupProvider.updateBackupProgress(BackUpProgressEnum.idle); _backupProvider.updateBackupProgress(BackUpProgressEnum.idle);
return false; return false;
} }
@ -294,10 +295,10 @@ class ManualUploadNotifier extends StateNotifier<ManualUploadState> {
} }
} else { } else {
openAppSettings(); openAppSettings();
debugPrint("[_startUpload] Do not have permission to the gallery"); dPrint(() => "[_startUpload] Do not have permission to the gallery");
} }
} catch (e) { } catch (e) {
debugPrint("ERROR _startUpload: ${e.toString()}"); dPrint(() => "ERROR _startUpload: ${e.toString()}");
hasErrors = true; hasErrors = true;
} finally { } finally {
_backupProvider.updateBackupProgress(BackUpProgressEnum.idle); _backupProvider.updateBackupProgress(BackUpProgressEnum.idle);
@ -340,7 +341,7 @@ class ManualUploadNotifier extends StateNotifier<ManualUploadState> {
// waits until it has stopped to start the backup. // waits until it has stopped to start the backup.
final bool hasLock = await ref.read(backgroundServiceProvider).acquireLock(); final bool hasLock = await ref.read(backgroundServiceProvider).acquireLock();
if (!hasLock) { if (!hasLock) {
debugPrint("[uploadAssets] could not acquire lock, exiting"); dPrint(() => "[uploadAssets] could not acquire lock, exiting");
ImmichToast.show( ImmichToast.show(
context: context, context: context,
msg: "failed".tr(), msg: "failed".tr(),
@ -355,18 +356,18 @@ class ManualUploadNotifier extends StateNotifier<ManualUploadState> {
// check if backup is already in process - then return // check if backup is already in process - then return
if (_backupProvider.backupProgress == BackUpProgressEnum.manualInProgress) { if (_backupProvider.backupProgress == BackUpProgressEnum.manualInProgress) {
debugPrint("[uploadAssets] Manual upload is already running - abort"); dPrint(() => "[uploadAssets] Manual upload is already running - abort");
showInProgress = true; showInProgress = true;
} }
if (_backupProvider.backupProgress == BackUpProgressEnum.inProgress) { if (_backupProvider.backupProgress == BackUpProgressEnum.inProgress) {
debugPrint("[uploadAssets] Auto Backup is already in progress - abort"); dPrint(() => "[uploadAssets] Auto Backup is already in progress - abort");
showInProgress = true; showInProgress = true;
return false; return false;
} }
if (_backupProvider.backupProgress == BackUpProgressEnum.inBackground) { if (_backupProvider.backupProgress == BackUpProgressEnum.inBackground) {
debugPrint("[uploadAssets] Background backup is running - abort"); dPrint(() => "[uploadAssets] Background backup is running - abort");
showInProgress = true; showInProgress = true;
} }

View file

@ -1,6 +1,7 @@
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/services/background_worker.service.dart'; import 'package:immich_mobile/domain/services/background_worker.service.dart';
import 'package:immich_mobile/platform/background_worker_api.g.dart'; import 'package:immich_mobile/platform/background_worker_api.g.dart';
import 'package:immich_mobile/platform/connectivity_api.g.dart';
import 'package:immich_mobile/platform/native_sync_api.g.dart'; import 'package:immich_mobile/platform/native_sync_api.g.dart';
import 'package:immich_mobile/platform/thumbnail_api.g.dart'; import 'package:immich_mobile/platform/thumbnail_api.g.dart';
@ -8,4 +9,6 @@ final backgroundWorkerFgServiceProvider = Provider((_) => BackgroundWorkerFgServ
final nativeSyncApiProvider = Provider<NativeSyncApi>((_) => NativeSyncApi()); final nativeSyncApiProvider = Provider<NativeSyncApi>((_) => NativeSyncApi());
final connectivityApiProvider = Provider<ConnectivityApi>((_) => ConnectivityApi());
final thumbnailApi = ThumbnailApi(); final thumbnailApi = ThumbnailApi();

View file

@ -7,11 +7,12 @@ import 'package:immich_mobile/theme/theme_data.dart';
import 'package:immich_mobile/theme/dynamic_theme.dart'; import 'package:immich_mobile/theme/dynamic_theme.dart';
import 'package:immich_mobile/providers/app_settings.provider.dart'; import 'package:immich_mobile/providers/app_settings.provider.dart';
import 'package:immich_mobile/services/app_settings.service.dart'; import 'package:immich_mobile/services/app_settings.service.dart';
import 'package:immich_mobile/utils/debug_print.dart';
final immichThemeModeProvider = StateProvider<ThemeMode>((ref) { final immichThemeModeProvider = StateProvider<ThemeMode>((ref) {
final themeMode = ref.watch(appSettingsServiceProvider).getSetting(AppSettingsEnum.themeMode); final themeMode = ref.watch(appSettingsServiceProvider).getSetting(AppSettingsEnum.themeMode);
debugPrint("Current themeMode $themeMode"); dPrint(() => "Current themeMode $themeMode");
if (themeMode == ThemeMode.light.name) { if (themeMode == ThemeMode.light.name) {
return ThemeMode.light; return ThemeMode.light;
@ -26,12 +27,12 @@ final immichThemePresetProvider = StateProvider<ImmichColorPreset>((ref) {
final appSettingsProvider = ref.watch(appSettingsServiceProvider); final appSettingsProvider = ref.watch(appSettingsServiceProvider);
final primaryColorPreset = appSettingsProvider.getSetting(AppSettingsEnum.primaryColor); final primaryColorPreset = appSettingsProvider.getSetting(AppSettingsEnum.primaryColor);
debugPrint("Current theme preset $primaryColorPreset"); dPrint(() => "Current theme preset $primaryColorPreset");
try { try {
return ImmichColorPreset.values.firstWhere((e) => e.name == primaryColorPreset); return ImmichColorPreset.values.firstWhere((e) => e.name == primaryColorPreset);
} catch (e) { } catch (e) {
debugPrint("Theme preset $primaryColorPreset not found. Applying default preset."); dPrint(() => "Theme preset $primaryColorPreset not found. Applying default preset.");
appSettingsProvider.setSetting(AppSettingsEnum.primaryColor, defaultColorPresetName); appSettingsProvider.setSetting(AppSettingsEnum.primaryColor, defaultColorPresetName);
return defaultColorPreset; return defaultColorPreset;
} }

View file

@ -1,10 +1,10 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:immich_mobile/domain/services/user.service.dart'; import 'package:immich_mobile/domain/services/user.service.dart';
import 'package:immich_mobile/providers/infrastructure/user.provider.dart'; import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
import 'package:immich_mobile/utils/debug_print.dart';
enum UploadProfileStatus { idle, loading, success, failure } enum UploadProfileStatus { idle, loading, success, failure }
@ -67,7 +67,7 @@ class UploadProfileImageNotifier extends StateNotifier<UploadProfileImageState>
var profileImagePath = await _userService.createProfileImage(file.name, await file.readAsBytes()); var profileImagePath = await _userService.createProfileImage(file.name, await file.readAsBytes());
if (profileImagePath != null) { if (profileImagePath != null) {
debugPrint("Successfully upload profile image"); dPrint(() => "Successfully upload profile image");
state = state.copyWith(status: UploadProfileStatus.success, profileImagePath: profileImagePath); state = state.copyWith(status: UploadProfileStatus.success, profileImagePath: profileImagePath);
return true; return true;
} }

View file

@ -2,8 +2,6 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/entities/asset.entity.dart';
@ -20,6 +18,7 @@ import 'package:immich_mobile/utils/debounce.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:openapi/api.dart'; import 'package:openapi/api.dart';
import 'package:socket_io_client/socket_io_client.dart'; import 'package:socket_io_client/socket_io_client.dart';
import 'package:immich_mobile/utils/debug_print.dart';
enum PendingAction { assetDelete, assetUploaded, assetHidden, assetTrash } enum PendingAction { assetDelete, assetUploaded, assetHidden, assetTrash }
@ -105,7 +104,7 @@ class WebsocketNotifier extends StateNotifier<WebsocketState> {
headers["Authorization"] = "Basic ${base64.encode(utf8.encode(endpoint.userInfo))}"; headers["Authorization"] = "Basic ${base64.encode(utf8.encode(endpoint.userInfo))}";
} }
debugPrint("Attempting to connect to websocket"); dPrint(() => "Attempting to connect to websocket");
// Configure socket transports must be specified // Configure socket transports must be specified
Socket socket = io( Socket socket = io(
endpoint.origin, endpoint.origin,
@ -121,12 +120,12 @@ class WebsocketNotifier extends StateNotifier<WebsocketState> {
); );
socket.onConnect((_) { socket.onConnect((_) {
debugPrint("Established Websocket Connection"); dPrint(() => "Established Websocket Connection");
state = WebsocketState(isConnected: true, socket: socket, pendingChanges: state.pendingChanges); state = WebsocketState(isConnected: true, socket: socket, pendingChanges: state.pendingChanges);
}); });
socket.onDisconnect((_) { socket.onDisconnect((_) {
debugPrint("Disconnect to Websocket Connection"); dPrint(() => "Disconnect to Websocket Connection");
state = WebsocketState(isConnected: false, socket: null, pendingChanges: state.pendingChanges); state = WebsocketState(isConnected: false, socket: null, pendingChanges: state.pendingChanges);
}); });
@ -150,13 +149,13 @@ class WebsocketNotifier extends StateNotifier<WebsocketState> {
socket.on('on_config_update', _handleOnConfigUpdate); socket.on('on_config_update', _handleOnConfigUpdate);
socket.on('on_new_release', _handleReleaseUpdates); socket.on('on_new_release', _handleReleaseUpdates);
} catch (e) { } catch (e) {
debugPrint("[WEBSOCKET] Catch Websocket Error - ${e.toString()}"); dPrint(() => "[WEBSOCKET] Catch Websocket Error - ${e.toString()}");
} }
} }
} }
void disconnect() { void disconnect() {
debugPrint("Attempting to disconnect from websocket"); dPrint(() => "Attempting to disconnect from websocket");
_batchedAssetUploadReady.clear(); _batchedAssetUploadReady.clear();
@ -200,7 +199,7 @@ class WebsocketNotifier extends StateNotifier<WebsocketState> {
} }
void listenUploadEvent() { void listenUploadEvent() {
debugPrint("Start listening to event on_upload_success"); dPrint(() => "Start listening to event on_upload_success");
state.socket?.on('on_upload_success', _handleOnUploadSuccess); state.socket?.on('on_upload_success', _handleOnUploadSuccess);
} }

View file

@ -1,7 +1,21 @@
import 'dart:convert';
import 'dart:io';
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
import 'package:flutter/material.dart'; import 'package:cancellation_token_http/http.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:logging/logging.dart';
import 'package:immich_mobile/utils/debug_print.dart';
class UploadTaskWithFile {
final File file;
final UploadTask task;
const UploadTaskWithFile({required this.file, required this.task});
}
final uploadRepositoryProvider = Provider((ref) => UploadRepository()); final uploadRepositoryProvider = Provider((ref) => UploadRepository());
@ -31,7 +45,7 @@ class UploadRepository {
return FileDownloader().enqueue(task); return FileDownloader().enqueue(task);
} }
Future<void> enqueueBackgroundAll(List<UploadTask> tasks) { Future<List<bool>> enqueueBackgroundAll(List<UploadTask> tasks) {
return FileDownloader().enqueueAll(tasks); return FileDownloader().enqueueAll(tasks);
} }
@ -65,13 +79,65 @@ class UploadRepository {
FileDownloader().database.allRecordsWithStatus(TaskStatus.paused, group: kBackupGroup), FileDownloader().database.allRecordsWithStatus(TaskStatus.paused, group: kBackupGroup),
]); ]);
debugPrint(""" dPrint(
() =>
"""
Upload Info: Upload Info:
Enqueued: ${enqueuedTasks.length} Enqueued: ${enqueuedTasks.length}
Running: ${runningTasks.length} Running: ${runningTasks.length}
Canceled: ${canceledTasks.length} Canceled: ${canceledTasks.length}
Waiting: ${waitingTasks.length} Waiting: ${waitingTasks.length}
Paused: ${pausedTasks.length} Paused: ${pausedTasks.length}
"""); """,
);
}
Future<void> backupWithDartClient(Iterable<UploadTaskWithFile> tasks, CancellationToken cancelToken) async {
final httpClient = Client();
final String savedEndpoint = Store.get(StoreKey.serverEndpoint);
Logger logger = Logger('UploadRepository');
for (final candidate in tasks) {
if (cancelToken.isCancelled) {
logger.warning("Backup was cancelled by the user");
break;
}
try {
final fileStream = candidate.file.openRead();
final assetRawUploadData = MultipartFile(
"assetData",
fileStream,
candidate.file.lengthSync(),
filename: candidate.task.filename,
);
final baseRequest = MultipartRequest('POST', Uri.parse('$savedEndpoint/assets'));
baseRequest.headers.addAll(candidate.task.headers);
baseRequest.fields.addAll(candidate.task.fields);
baseRequest.files.add(assetRawUploadData);
final response = await httpClient.send(baseRequest, cancellationToken: cancelToken);
final responseBody = jsonDecode(await response.stream.bytesToString());
if (![200, 201].contains(response.statusCode)) {
final error = responseBody;
logger.warning(
"Error(${error['statusCode']}) uploading ${candidate.task.filename} | Created on ${candidate.task.fields["fileCreatedAt"]} | ${error['error']}",
);
continue;
}
} on CancelledException {
logger.warning("Backup was cancelled by the user");
break;
} catch (error, stackTrace) {
logger.warning("Error backup asset: ${error.toString()}: $stackTrace");
continue;
}
}
} }
} }

View file

@ -1,5 +1,5 @@
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:flutter/foundation.dart'; import 'package:immich_mobile/utils/debug_print.dart';
/// Guards against duplicate navigation to this route /// Guards against duplicate navigation to this route
class DuplicateGuard extends AutoRouteGuard { class DuplicateGuard extends AutoRouteGuard {
@ -8,7 +8,7 @@ class DuplicateGuard extends AutoRouteGuard {
void onNavigation(NavigationResolver resolver, StackRouter router) async { void onNavigation(NavigationResolver resolver, StackRouter router) async {
// Duplicate navigation // Duplicate navigation
if (resolver.route.name == router.current.name) { if (resolver.route.name == router.current.name) {
debugPrint('DuplicateGuard: Preventing duplicate route navigation for ${resolver.route.name}'); dPrint(() => 'DuplicateGuard: Preventing duplicate route navigation for ${resolver.route.name}');
resolver.next(false); resolver.next(false);
} else { } else {
resolver.next(true); resolver.next(true);

View file

@ -3,7 +3,6 @@ import 'dart:collection';
import 'dart:io'; import 'dart:io';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/domain/models/user.model.dart';
@ -24,6 +23,7 @@ import 'package:immich_mobile/services/entity.service.dart';
import 'package:immich_mobile/services/sync.service.dart'; import 'package:immich_mobile/services/sync.service.dart';
import 'package:immich_mobile/utils/hash.dart'; import 'package:immich_mobile/utils/hash.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:immich_mobile/utils/debug_print.dart';
final albumServiceProvider = Provider( final albumServiceProvider = Provider(
(ref) => AlbumService( (ref) => AlbumService(
@ -124,7 +124,7 @@ class AlbumService {
} finally { } finally {
_localCompleter.complete(changes); _localCompleter.complete(changes);
} }
debugPrint("refreshDeviceAlbums took ${sw.elapsedMilliseconds}ms"); dPrint(() => "refreshDeviceAlbums took ${sw.elapsedMilliseconds}ms");
return changes; return changes;
} }
@ -172,7 +172,7 @@ class AlbumService {
} finally { } finally {
_remoteCompleter.complete(changes); _remoteCompleter.complete(changes);
} }
debugPrint("refreshRemoteAlbums took ${sw.elapsedMilliseconds}ms"); dPrint(() => "refreshRemoteAlbums took ${sw.elapsedMilliseconds}ms");
return changes; return changes;
} }
@ -220,7 +220,7 @@ class AlbumService {
return AlbumAddAssetsResponse(alreadyInAlbum: result.duplicates, successfullyAdded: addedAssets.length); return AlbumAddAssetsResponse(alreadyInAlbum: result.duplicates, successfullyAdded: addedAssets.length);
} catch (e) { } catch (e) {
debugPrint("Error addAssets ${e.toString()}"); dPrint(() => "Error addAssets ${e.toString()}");
} }
return null; return null;
} }
@ -242,7 +242,7 @@ class AlbumService {
await _albumRepository.update(album); await _albumRepository.update(album);
return true; return true;
} catch (e) { } catch (e) {
debugPrint("Error setActivityEnabled ${e.toString()}"); dPrint(() => "Error setActivityEnabled ${e.toString()}");
} }
return false; return false;
} }
@ -271,7 +271,7 @@ class AlbumService {
} }
return true; return true;
} catch (e) { } catch (e) {
debugPrint("Error deleteAlbum ${e.toString()}"); dPrint(() => "Error deleteAlbum ${e.toString()}");
} }
return false; return false;
} }
@ -281,7 +281,7 @@ class AlbumService {
await _albumApiRepository.removeUser(album.remoteId!, userId: "me"); await _albumApiRepository.removeUser(album.remoteId!, userId: "me");
return true; return true;
} catch (e) { } catch (e) {
debugPrint("Error leaveAlbum ${e.toString()}"); dPrint(() => "Error leaveAlbum ${e.toString()}");
return false; return false;
} }
} }
@ -293,7 +293,7 @@ class AlbumService {
await _updateAssets(album.id, remove: toRemove.toList()); await _updateAssets(album.id, remove: toRemove.toList());
return true; return true;
} catch (e) { } catch (e) {
debugPrint("Error removeAssetFromAlbum ${e.toString()}"); dPrint(() => "Error removeAssetFromAlbum ${e.toString()}");
} }
return false; return false;
} }
@ -310,7 +310,7 @@ class AlbumService {
return true; return true;
} catch (error) { } catch (error) {
debugPrint("Error removeUser ${error.toString()}"); dPrint(() => "Error removeUser ${error.toString()}");
return false; return false;
} }
} }
@ -327,7 +327,7 @@ class AlbumService {
return true; return true;
} catch (error) { } catch (error) {
debugPrint("Error addUsers ${error.toString()}"); dPrint(() => "Error addUsers ${error.toString()}");
} }
return false; return false;
} }
@ -340,7 +340,7 @@ class AlbumService {
await _albumRepository.update(album); await _albumRepository.update(album);
return true; return true;
} catch (e) { } catch (e) {
debugPrint("Error changeTitleAlbum ${e.toString()}"); dPrint(() => "Error changeTitleAlbum ${e.toString()}");
return false; return false;
} }
} }
@ -353,7 +353,7 @@ class AlbumService {
await _albumRepository.update(album); await _albumRepository.update(album);
return true; return true;
} catch (e) { } catch (e) {
debugPrint("Error changeDescriptionAlbum ${e.toString()}"); dPrint(() => "Error changeDescriptionAlbum ${e.toString()}");
return false; return false;
} }
} }

View file

@ -3,7 +3,6 @@ import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart'; import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/entities/store.entity.dart';
@ -11,6 +10,7 @@ import 'package:immich_mobile/utils/url_helper.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:openapi/api.dart'; import 'package:openapi/api.dart';
import 'package:immich_mobile/utils/user_agent.dart'; import 'package:immich_mobile/utils/user_agent.dart';
import 'package:immich_mobile/utils/debug_print.dart';
class ApiService implements Authentication { class ApiService implements Authentication {
late ApiClient _apiClient; late ApiClient _apiClient;
@ -155,7 +155,7 @@ class ApiService implements Authentication {
return endpoint; return endpoint;
} }
} catch (e) { } catch (e) {
debugPrint("Could not locate /.well-known/immich at $baseUrl"); dPrint(() => "Could not locate /.well-known/immich at $baseUrl");
} }
return ""; return "";

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