mirror of
https://github.com/immich-app/immich.git
synced 2026-06-17 04:12:16 -07:00
Compare commits
43 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0e2604a0fd | |||
| 8d30cfa2ce | |||
| c9aa9ba711 | |||
| 7cf904acbe | |||
| 983a005709 | |||
| cda499f2b5 | |||
| 12b7cd066b | |||
| 83b4dc1733 | |||
| a9d64b30ad | |||
| 3927eb6755 | |||
| 27cfa0e788 | |||
| 76c042abc7 | |||
| 0f49bcbd27 | |||
| df4a708aed | |||
| 34f78e3fd4 | |||
| 3c2296b818 | |||
| 805ca1a2bf | |||
| 9ee412110f | |||
| 010220d588 | |||
| 10fddf2d51 | |||
| d307ab60ca | |||
| ce59cc9241 | |||
| 1fa034125c | |||
| 8036dc4b8c | |||
| 54895fb10e | |||
| e70a1163f3 | |||
| a23a7c69ae | |||
| f21a753aff | |||
| cc8d3b4107 | |||
| 622a330d82 | |||
| 5e8744a568 | |||
| b633cc4f04 | |||
| a9ee6a7ce9 | |||
| c273ccf2e2 | |||
| 5f1a180d1a | |||
| cc54de87aa | |||
| a97e5999e4 | |||
| 46631b3786 | |||
| 5a3be158b9 | |||
| b21af78454 | |||
| abd62d9295 | |||
| e31d4aa909 | |||
| 43b2d04e2c |
@@ -12,10 +12,6 @@ on:
|
||||
default: 'development'
|
||||
type: string
|
||||
secrets:
|
||||
PUSH_O_MATIC_APP_CLIENT_ID:
|
||||
required: true
|
||||
PUSH_O_MATIC_APP_KEY:
|
||||
required: true
|
||||
KEY_JKS:
|
||||
required: true
|
||||
ALIAS:
|
||||
@@ -95,7 +91,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
working_directory: ./mobile
|
||||
@@ -221,7 +217,7 @@ jobs:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
working_directory: ./mobile
|
||||
@@ -241,7 +237,7 @@ jobs:
|
||||
run: flutter build ios --config-only --no-codesign
|
||||
|
||||
- name: Setup Ruby
|
||||
uses: ruby/setup-ruby@afeafc3d1ab54a631816aba4c914a0081c12ff2f # v1.310.0
|
||||
uses: ruby/setup-ruby@12fd324f1d0b43274fdc8130f6980590a667c455 # v1.312.0
|
||||
with:
|
||||
ruby-version: '3.3'
|
||||
bundler-cache: true
|
||||
|
||||
@@ -25,7 +25,7 @@ jobs:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Check for breaking API changes
|
||||
uses: oasdiff/oasdiff-action/breaking@a8c7f0e5649d20d623edb5b38446d3ab3d82d43c # v0.0.53
|
||||
uses: oasdiff/oasdiff-action/breaking@3530478ec30f84adedbfeb28f0d9527a290f50a9 # v0.0.57
|
||||
with:
|
||||
base: https://raw.githubusercontent.com/${{ github.repository }}/main/open-api/immich-openapi-specs.json
|
||||
revision: open-api/immich-openapi-specs.json
|
||||
@@ -42,7 +42,7 @@ jobs:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ github.token }}
|
||||
working_directory: ./mobile
|
||||
|
||||
@@ -43,7 +43,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ jobs:
|
||||
needs: [get_body, should_run]
|
||||
if: ${{ needs.should_run.outputs.should_run == 'true' }}
|
||||
container:
|
||||
image: ghcr.io/immich-app/mdq:main@sha256:e73f60195b39748c4876f23e3e6cd22a68a9754acec8aef1fd6979fd52cd2c9f
|
||||
image: ghcr.io/immich-app/mdq:main@sha256:2a64c7f045cb7b580fbdf3614d7d1805f5775fec453e3d1023764180efa8c70b
|
||||
outputs:
|
||||
checked: ${{ steps.get_checkbox.outputs.checked }}
|
||||
steps:
|
||||
|
||||
@@ -132,7 +132,7 @@ jobs:
|
||||
suffixes: '-rocm'
|
||||
platforms: linux/amd64
|
||||
runner-mapping: '{"linux/amd64": "pokedex-large"}'
|
||||
uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@db54dcf16fbb12c43479a23749ceea0ad1b4a704 # multi-runner-build-workflow-v3.0.0
|
||||
uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@50dc3a14f0606ecd8fc28d78d3a3c655115ab695 # multi-runner-build-workflow-v3.1.0
|
||||
permissions:
|
||||
contents: read
|
||||
actions: read
|
||||
@@ -155,7 +155,7 @@ jobs:
|
||||
name: Build and Push Server
|
||||
needs: pre-job
|
||||
if: ${{ fromJSON(needs.pre-job.outputs.should_run).server == true }}
|
||||
uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@db54dcf16fbb12c43479a23749ceea0ad1b4a704 # multi-runner-build-workflow-v3.0.0
|
||||
uses: immich-app/devtools/.github/workflows/multi-runner-build.yml@50dc3a14f0606ecd8fc28d78d3a3c655115ab695 # multi-runner-build-workflow-v3.1.0
|
||||
permissions:
|
||||
contents: read
|
||||
actions: read
|
||||
|
||||
@@ -66,7 +66,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
||||
@@ -50,6 +50,7 @@ jobs:
|
||||
outputs:
|
||||
ref: ${{ steps.push-tag.outputs.commit_long_sha }}
|
||||
version: ${{ steps.output.outputs.version }}
|
||||
rc: ${{ steps.output.outputs.rc }}
|
||||
permissions: {} # No job-level permissions are needed because it uses the app-token
|
||||
steps:
|
||||
- id: token
|
||||
@@ -66,7 +67,7 @@ jobs:
|
||||
ref: main
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
@@ -81,7 +82,13 @@ jobs:
|
||||
run: pnpm --silent release -s "${SERVER_BUMP}" -m "${MOBILE_BUMP}"
|
||||
|
||||
- id: output
|
||||
run: echo "version=$IMMICH_VERSION" >> $GITHUB_OUTPUT
|
||||
run: |
|
||||
echo "version=$IMMICH_VERSION" >> $GITHUB_OUTPUT
|
||||
if [[ "$IMMICH_VERSION" =~ -rc\.[0-9]+$ ]]; then
|
||||
echo "rc=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "rc=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Commit and tag
|
||||
id: push-tag
|
||||
@@ -99,8 +106,6 @@ jobs:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
secrets:
|
||||
PUSH_O_MATIC_APP_CLIENT_ID: ${{ secrets.PUSH_O_MATIC_APP_CLIENT_ID }}
|
||||
PUSH_O_MATIC_APP_KEY: ${{ secrets.PUSH_O_MATIC_APP_KEY }}
|
||||
KEY_JKS: ${{ secrets.KEY_JKS }}
|
||||
ALIAS: ${{ secrets.ALIAS }}
|
||||
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
|
||||
@@ -147,6 +152,7 @@ jobs:
|
||||
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0
|
||||
with:
|
||||
draft: true
|
||||
prerelease: ${{ needs.bump_version.outputs.rc }}
|
||||
tag_name: ${{ needs.bump_version.outputs.version }}
|
||||
token: ${{ steps.generate-token.outputs.token }}
|
||||
generate_release_notes: true
|
||||
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
working_directory: ./mobile
|
||||
|
||||
+14
-14
@@ -87,7 +87,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
@@ -115,7 +115,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
@@ -146,7 +146,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
@@ -177,7 +177,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
@@ -221,7 +221,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
@@ -259,7 +259,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
@@ -287,7 +287,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
@@ -337,7 +337,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
@@ -370,7 +370,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
@@ -589,7 +589,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
working_directory: ./mobile
|
||||
@@ -627,7 +627,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
@@ -658,7 +658,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
@@ -709,7 +709,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
@@ -767,7 +767,7 @@ jobs:
|
||||
token: ${{ steps.token.outputs.token }}
|
||||
|
||||
- name: Setup Mise
|
||||
uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2
|
||||
uses: immich-app/devtools/actions/use-mise@3bca63ca3c15020293b36b51737a3ee2c773340b # use-mise-action-v3.1.0
|
||||
with:
|
||||
github_token: ${{ steps.token.outputs.token }}
|
||||
|
||||
|
||||
+4
-1
@@ -1,5 +1,8 @@
|
||||
# @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html
|
||||
|
||||
[[tools.wrangler]]
|
||||
version = "4.66.0"
|
||||
version = "4.98.0"
|
||||
backend = "npm:wrangler"
|
||||
|
||||
[tools.wrangler.options]
|
||||
allow_builds = '["esbuild", "sharp", "workerd"]'
|
||||
|
||||
+1
-1
@@ -28,4 +28,4 @@ run = "prettier --write ."
|
||||
run = "wrangler pages deploy build --project-name=${PROJECT_NAME} --branch=${BRANCH_NAME}"
|
||||
|
||||
[tools]
|
||||
wrangler = "4.98.0"
|
||||
wrangler = "4.100.0"
|
||||
|
||||
Vendored
+2
-2
@@ -1,7 +1,7 @@
|
||||
[
|
||||
{
|
||||
"label": "v3.0.0-rc.0",
|
||||
"url": "https://docs.v3.0.0-rc.0.archive.immich.app"
|
||||
"label": "v3.0.0-rc.1",
|
||||
"url": "https://docs.v3.0.0-rc.1.archive.immich.app"
|
||||
},
|
||||
{
|
||||
"label": "v2.7.5",
|
||||
|
||||
+2
-3
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "immich-e2e",
|
||||
"version": "3.0.0-rc.0",
|
||||
"version": "3.0.0-rc.1",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"type": "module",
|
||||
@@ -32,7 +32,7 @@
|
||||
"@playwright/test": "^1.44.1",
|
||||
"@socket.io/component-emitter": "^3.1.2",
|
||||
"@types/luxon": "^3.4.2",
|
||||
"@types/node": "^24.12.4",
|
||||
"@types/node": "^24.13.2",
|
||||
"@types/pg": "^8.15.1",
|
||||
"@types/pngjs": "^6.0.4",
|
||||
"@types/supertest": "^7.0.0",
|
||||
@@ -54,7 +54,6 @@
|
||||
"typescript": "^6.0.0",
|
||||
"typescript-eslint": "^8.28.0",
|
||||
"utimes": "^5.2.1",
|
||||
"vite-tsconfig-paths": "^6.1.1",
|
||||
"vitest": "^4.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ import { AssetVisibility, LoginResponseDto } from '@immich/sdk';
|
||||
import { readFile } from 'node:fs/promises';
|
||||
import { basename, join } from 'node:path';
|
||||
import { Socket } from 'socket.io-client';
|
||||
import { createUserDto } from 'src/fixtures';
|
||||
import { errorDto } from 'src/responses';
|
||||
import { app, testAssetDir, utils } from 'src/utils';
|
||||
import request from 'supertest';
|
||||
@@ -9,28 +10,48 @@ import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
||||
|
||||
describe('/map', () => {
|
||||
let websocket: Socket;
|
||||
let partnerWebsocket: Socket;
|
||||
let admin: LoginResponseDto;
|
||||
let partner: LoginResponseDto;
|
||||
let partnerArchivedAssetId: string;
|
||||
let adminArchivedAssetId: string;
|
||||
|
||||
beforeAll(async () => {
|
||||
await utils.resetDatabase();
|
||||
admin = await utils.adminSetup({ onboarding: false });
|
||||
partner = await utils.userSetup(admin.accessToken, createUserDto.user1);
|
||||
|
||||
websocket = await utils.connectWebsocket(admin.accessToken);
|
||||
partnerWebsocket = await utils.connectWebsocket(partner.accessToken);
|
||||
|
||||
const files = ['formats/heic/IMG_2682.heic', 'metadata/gps-position/thompson-springs.jpg'];
|
||||
const adminFiles = ['formats/heic/IMG_2682.heic', 'metadata/gps-position/thompson-springs.jpg'];
|
||||
const adminArchivedFile = 'metadata/dates/datetimeoriginal-gps.jpg';
|
||||
const partnerFile = 'metadata/gps-position/thompson-springs.jpg';
|
||||
utils.resetEvents();
|
||||
const uploadFile = async (input: string) => {
|
||||
const uploadFile = async (accessToken: string, input: string) => {
|
||||
const filepath = join(testAssetDir, input);
|
||||
const { id } = await utils.createAsset(admin.accessToken, {
|
||||
const { id } = await utils.createAsset(accessToken, {
|
||||
assetData: { bytes: await readFile(filepath), filename: basename(filepath) },
|
||||
});
|
||||
await utils.waitForWebsocketEvent({ event: 'assetUpload', id });
|
||||
return id;
|
||||
};
|
||||
await Promise.all(files.map((f) => uploadFile(f)));
|
||||
await Promise.all(adminFiles.map((f) => uploadFile(admin.accessToken, f)));
|
||||
[adminArchivedAssetId, partnerArchivedAssetId] = await Promise.all([
|
||||
uploadFile(admin.accessToken, adminArchivedFile),
|
||||
uploadFile(partner.accessToken, partnerFile),
|
||||
]);
|
||||
|
||||
await Promise.all([
|
||||
utils.archiveAssets(admin.accessToken, [adminArchivedAssetId]),
|
||||
utils.archiveAssets(partner.accessToken, [partnerArchivedAssetId]),
|
||||
utils.createPartner(partner.accessToken, admin.userId),
|
||||
]);
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
utils.disconnectWebsocket(websocket);
|
||||
utils.disconnectWebsocket(partnerWebsocket);
|
||||
});
|
||||
|
||||
describe('GET /map/markers', () => {
|
||||
@@ -40,7 +61,6 @@ describe('/map', () => {
|
||||
expect(body).toEqual(errorDto.unauthorized);
|
||||
});
|
||||
|
||||
// TODO archive one of these assets
|
||||
it('should get map markers for all non-archived assets', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/map/markers')
|
||||
@@ -69,7 +89,28 @@ describe('/map', () => {
|
||||
]);
|
||||
});
|
||||
|
||||
// TODO archive one of these assets
|
||||
it('should not expose partner archived asset locations', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/map/markers')
|
||||
.query({ withPartners: true, isArchived: true })
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
|
||||
expect(status).toBe(200);
|
||||
const ids = body.map((m: { id: string }) => m.id);
|
||||
expect(ids).not.toContain(partnerArchivedAssetId);
|
||||
expect(ids).toContain(adminArchivedAssetId);
|
||||
});
|
||||
|
||||
it('should include own archived asset locations', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/map/markers')
|
||||
.query({ isArchived: true })
|
||||
.set('Authorization', `Bearer ${admin.accessToken}`);
|
||||
|
||||
expect(status).toBe(200);
|
||||
expect(body.map((m: { id: string }) => m.id)).toContain(adminArchivedAssetId);
|
||||
});
|
||||
|
||||
it('should get all map markers', async () => {
|
||||
const { status, body } = await request(app)
|
||||
.get('/map/markers')
|
||||
|
||||
@@ -95,7 +95,7 @@ describe('/server', () => {
|
||||
major: expect.any(Number),
|
||||
minor: expect.any(Number),
|
||||
patch: expect.any(Number),
|
||||
prerelease: null,
|
||||
prerelease: expect.anything(),
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import tsconfigPaths from 'vite-tsconfig-paths';
|
||||
import { defineConfig } from 'vitest/config';
|
||||
|
||||
const skipDockerSetup = process.env.VITEST_DISABLE_DOCKER_SETUP === 'true';
|
||||
@@ -24,5 +23,7 @@ export default defineConfig({
|
||||
maxWorkers: 1,
|
||||
isolate: false,
|
||||
},
|
||||
plugins: [tsconfigPaths()],
|
||||
resolve: {
|
||||
tsconfigPaths: true,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import tsconfigPaths from 'vite-tsconfig-paths';
|
||||
import { defineConfig } from 'vitest/config';
|
||||
|
||||
const skipDockerSetup = process.env.VITEST_DISABLE_DOCKER_SETUP === 'true';
|
||||
@@ -24,5 +23,7 @@ export default defineConfig({
|
||||
maxWorkers: 1,
|
||||
isolate: false,
|
||||
},
|
||||
plugins: [tsconfigPaths()],
|
||||
resolve: {
|
||||
tsconfigPaths: true,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
"cron_expression_description": "اضبط الفاصل الزمني للفحص باستخدام تنسيق cron. لمزيد من المعلومات يُرجى الرجوع إلى <link>Crontab Guru</link> على سبيل المثال",
|
||||
"cron_expression_presets": "الإعدادات المسبقة لتعبير Cron",
|
||||
"disable_login": "تعطيل تسجيل الدخول",
|
||||
"download_csv": "حمل CSV",
|
||||
"duplicate_detection_job_description": "بدء التعلم الآلي على المحتوى للعثور على الصور المتشابهة. يعتمد على البحث الذكي",
|
||||
"exclusion_pattern_description": "تتيح لك أنماط الاستبعاد تجاهل الملفات والمجلدات عند فحص مكتبتك. يعد هذا مفيدًا إذا كان لديك مجلدات تحتوي على ملفات لا تريد استيرادها، مثل ملفات RAW.",
|
||||
"export_config_as_json_description": "تحميل اعدادات النظام الحالية كملف بصيغة JSON",
|
||||
@@ -191,6 +192,10 @@
|
||||
"maintenance_delete_backup": "حذف النسخ الاحتياطي",
|
||||
"maintenance_delete_backup_description": "هذا الملف سيتم حذفه بشكل لا رجعه فيه.",
|
||||
"maintenance_delete_error": "فشل حذف النسخ الاحتياطي.",
|
||||
"maintenance_integrity_check_all": "تحديد الكل",
|
||||
"maintenance_integrity_checksum_mismatch": "عدم تطابق رمز التحقق",
|
||||
"maintenance_integrity_missing_file": "الملفات المفقودة",
|
||||
"maintenance_integrity_missing_file_job": "التحقق من الملفات المفقودة",
|
||||
"maintenance_restore_backup": "استعادة النسخ الاحتياطي",
|
||||
"maintenance_restore_backup_description": "سيتم مسح بيانات Immich واستعادتها من النسخة الاحتياطي المختار. سيتم إنشاء نسخة احتياطية قبل المتابعة.",
|
||||
"maintenance_restore_backup_different_version": "هذا النسخ الاحتياطي تم انشائه باستخدام اصدار مختلف من Immich!",
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
"cron_expression_description": "Задайце інтэрвал сканавання, выкарыстоўваючы фармат cron. Для атрымання дадатковай інфармацыі, звярніцеся, напрыклад, да <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Прадустаноўкі выразаў Cron",
|
||||
"disable_login": "Адключыць уваход",
|
||||
"download_csv": "Спампаваць CSV",
|
||||
"duplicate_detection_job_description": "Запусціць машыннае навучанне на аб’ектах для выяўлення падобных відарысаў. Залежыць ад Smart Search",
|
||||
"exclusion_pattern_description": "Шаблоны выключэння дазваляюць ігнараваць файлы і папкі пры сканаванні вашай бібліятэкі. Гэта карысна, калі ў вас ёсць папкі, якія змяшчаюць файлы, якія вы не хочаце імпартаваць, напрыклад, файлы RAW.",
|
||||
"export_config_as_json_description": "Захаваць бягучую канфігурацыю сістэмы ў файл JSON",
|
||||
@@ -191,6 +192,13 @@
|
||||
"maintenance_delete_backup": "Выдаліць рэзервовую копію",
|
||||
"maintenance_delete_backup_description": "Гэты файл будзе беззваротна выдалены.",
|
||||
"maintenance_delete_error": "Не атрымалася выдаліць рэзервовую копію.",
|
||||
"maintenance_integrity_check_all": "Праверыць усе",
|
||||
"maintenance_integrity_checksum_mismatch": "Несупадзенне кантрольнай сумы",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Праверка на несупадзенне кантрольных сум",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Абнавіць справаздачы аб несупадзенні кантрольных сум",
|
||||
"maintenance_integrity_missing_file": "Адсутныя файлы",
|
||||
"maintenance_integrity_missing_file_job": "Праверка наяўнасці адсутных файлаў",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Абнавіць справаздачы аб адсутных файлах",
|
||||
"maintenance_restore_backup": "Аднавіць рэзервовую копію",
|
||||
"maintenance_restore_backup_description": "Immich будзе сцёрты і адноўлены з абранай рэзервовай копіі. Перад працягам будзе створана рэзервовая копія.",
|
||||
"maintenance_restore_backup_different_version": "Гэтая рэзервовая копія была створана з для іншай версіі Immich!",
|
||||
|
||||
+14
-12
@@ -2273,23 +2273,23 @@
|
||||
"sort_created": "Дата на създаване",
|
||||
"sort_items": "Брой елементи",
|
||||
"sort_modified": "Дата на промяна",
|
||||
"sort_newest": "Най-нови снимки",
|
||||
"sort_oldest": "Най-старата снимка",
|
||||
"sort_newest": "Най-нова снимка",
|
||||
"sort_oldest": "Най-стара снимка",
|
||||
"sort_people_by_similarity": "Сортиране на хора по прилика",
|
||||
"sort_recent": "Най-новата снимка",
|
||||
"sort_recent": "Най-скорошна снимка",
|
||||
"sort_title": "Заглавие",
|
||||
"source": "Код",
|
||||
"stack": "Събери",
|
||||
"stack": "Групирай",
|
||||
"stack_action_prompt": "{count} са групирани",
|
||||
"stack_duplicates": "Подреждане на дубликати",
|
||||
"stack_select_one_photo": "Избери една главна снимка за събраните снимки",
|
||||
"stack_selected_photos": "Подреждане на избрани снимки",
|
||||
"stacked_assets_count": "Събрани {count, plural, one {# елемент} other {# елементи}}",
|
||||
"stacktrace": "Следа на събраните",
|
||||
"start": "Старт",
|
||||
"stack_duplicates": "Групирай дубликати",
|
||||
"stack_select_one_photo": "Избери главна снимка за групировката",
|
||||
"stack_selected_photos": "Групиране на избрани снимки",
|
||||
"stacked_assets_count": "Групиран(и) {count, plural, one {# елемент} other {# елементи}}",
|
||||
"stacktrace": "Проследяване на стека (stacktrace)",
|
||||
"start": "Начало",
|
||||
"start_date": "Начална дата",
|
||||
"start_date_before_end_date": "Началната дата трябва да бъде преди крайната дата",
|
||||
"state": "Щат",
|
||||
"state": "Област (щат)",
|
||||
"status": "Статус",
|
||||
"step_delete": "Премахни стъпката",
|
||||
"step_delete_confirm": "Сигурни ли сте, че искате да премахнете тази стъпка?",
|
||||
@@ -2389,11 +2389,13 @@
|
||||
"trash_page_title": "В коша ({count})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "Изхвърлените в кошчето елементи ще бъдат изтрити за постоянно след {days, plural, one {# ден} other {# дни}}.",
|
||||
"trigger": "Тригер",
|
||||
"trigger_asset_metadata_extraction": "Извличане на метаданни от елементи",
|
||||
"trigger_asset_metadata_extraction_description": "Задействан, когато EXIF метаданните от даден елемент са извлечени",
|
||||
"trigger_asset_uploaded": "Качване на файлове",
|
||||
"trigger_asset_uploaded_description": "Сработва при зареждане на нов обект",
|
||||
"trigger_description": "Събитие, което стартира работния процес",
|
||||
"trigger_person_recognized": "Разпознато е лице",
|
||||
"trigger_person_recognized_description": "Сработва при разпознаване на лице",
|
||||
"trigger_person_recognized_description": "Задействан при разпознаване на лице",
|
||||
"trigger_type": "Тип на тригера",
|
||||
"troubleshoot": "Отстраняване на проблеми",
|
||||
"type": "Тип",
|
||||
|
||||
+24
-1
@@ -79,6 +79,7 @@
|
||||
"cron_expression_description": "Estableix l'interval d'escaneig amb el format cron. Per obtenir més informació, consulteu, p.e <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Ajustos predefinits d'expressions Cron",
|
||||
"disable_login": "Deshabiliteu l'inici de sessió",
|
||||
"download_csv": "Descarregar CSV",
|
||||
"duplicate_detection_job_description": "Executa l'aprenentatge automàtic en els elements per a detectar imatges semblants. Fa servir la cerca intel·ligent",
|
||||
"exclusion_pattern_description": "Els patrons d'exclusió permeten ignorar fitxers i carpetes quan escanegeu una llibreria. Això és útil si teniu carpetes que contenen fitxer que no voleu importar, com els fitxers RAW.",
|
||||
"export_config_as_json_description": "Baixa la configuració actual del sistema com a fitxer JSON",
|
||||
@@ -191,6 +192,17 @@
|
||||
"maintenance_delete_backup": "Elimina la còpia de seguretat",
|
||||
"maintenance_delete_backup_description": "Aquest fitxer s'eliminarà de forma permanent.",
|
||||
"maintenance_delete_error": "No s'ha pogut suprimir la còpia de seguretat.",
|
||||
"maintenance_integrity_check_all": "Verificar tot",
|
||||
"maintenance_integrity_checksum_mismatch": "Checksum incorrecte",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Comprovar checksums",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Actualitzar errors de checksums",
|
||||
"maintenance_integrity_missing_file": "Manquen fitxers",
|
||||
"maintenance_integrity_missing_file_job": "Verificar fitxers que falten",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Refrescar informe de fitxers desapareguts",
|
||||
"maintenance_integrity_report": "Informe Integritat",
|
||||
"maintenance_integrity_untracked_file": "Arxius no rastrejats",
|
||||
"maintenance_integrity_untracked_file_job": "Consulta de fitxers no rastrejats",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Actualitza els informes de fitxers no rastrejats",
|
||||
"maintenance_restore_backup": "Restaura la còpia de seguretat",
|
||||
"maintenance_restore_backup_description": "Immich s'esborrarà i es restaurarà des de la còpia de seguretat escollida. Es crearà una còpia de seguretat abans de continuar.",
|
||||
"maintenance_restore_backup_different_version": "Aquesta còpia de seguretat s'ha creat amb una versió diferent d'Immich!",
|
||||
@@ -915,6 +927,8 @@
|
||||
"deduplicate_all": "Desduplica-ho tot",
|
||||
"default_locale": "Configuració regional predeterminada",
|
||||
"default_locale_description": "Format de dades i números en funció de la configuració local",
|
||||
"default_quality_subtitle": "Qualitat utilitzada a l’hora de tocar la compartició. Premeu el botó de compartir per triar cada vegada.",
|
||||
"default_share_quality": "Qualitat de comparticio per defecte",
|
||||
"delete": "Esborrar",
|
||||
"delete_action_confirmation_message": "Segur que vols eliminar aquest recurs? Aquesta acció el mourà a la paperera del servidor, i et preguntarà si el vols eliminar localment",
|
||||
"delete_action_prompt": "{count} eliminats",
|
||||
@@ -1224,6 +1238,7 @@
|
||||
"failed": "Fallat",
|
||||
"failed_count": "Fallits: {count}",
|
||||
"failed_to_authenticate": "No s'ha pogut autenticar",
|
||||
"failed_to_delete_file": "No s'ha pogut esborrar el fitxer",
|
||||
"failed_to_load_assets": "Error carregant recursos",
|
||||
"failed_to_load_folder": "No s'ha pogut carregar la carpeta",
|
||||
"favorite": "Preferit",
|
||||
@@ -1354,6 +1369,7 @@
|
||||
"individual_share": "Compartit individualment",
|
||||
"individual_shares": "Espais individuals",
|
||||
"info": "Informació",
|
||||
"integrity_checks": "Verificacions d'integritat",
|
||||
"interval": {
|
||||
"day_at_onepm": "Cada dia a les 13h",
|
||||
"hours": "Cada {hours, plural, one {hour} other {{hours, number} hours}}",
|
||||
@@ -1426,6 +1442,7 @@
|
||||
"linked_oauth_account": "Compte OAuth enllaçat",
|
||||
"list": "Llista",
|
||||
"live": "En viu",
|
||||
"load_more": "Carregar més",
|
||||
"loading": "Carregant",
|
||||
"loading_search_results_failed": "No s'han pogut carregar els resultats de la cerca",
|
||||
"local": "Local",
|
||||
@@ -2084,6 +2101,7 @@
|
||||
"select_person": "Seleccionar persona",
|
||||
"select_person_to_tag": "Selecciona una persona per etiquetar",
|
||||
"select_photos": "Tria fotografies",
|
||||
"select_quality": "Selecciona qualitat",
|
||||
"select_trash_all": "Envia la selecció a la paperera",
|
||||
"select_user_for_sharing_page_err_album": "Error al crear l'àlbum",
|
||||
"selected": "Seleccionat",
|
||||
@@ -2147,6 +2165,8 @@
|
||||
"share_assets_selected": "{count} seleccionats",
|
||||
"share_dialog_preparing": "S'està preparant...",
|
||||
"share_link": "Compartir Enllaç",
|
||||
"share_original": "Ús original (gran)",
|
||||
"share_preview": "Ús de la miniatura (petit)",
|
||||
"shared": "Compartit",
|
||||
"shared_album_activities_input_disable": "Els comentaris estan desactivats",
|
||||
"shared_album_activity_remove_content": "Voleu eliminar aquesta activitat?",
|
||||
@@ -2248,6 +2268,7 @@
|
||||
"slideshow_repeat_description": "Torna al principi quan acaba la presentació de diapositives",
|
||||
"slideshow_settings": "Configuració de diapositives",
|
||||
"smart_album": "Àlbum inteŀligent",
|
||||
"some_assets_already_have_a_location_warning": "Alguns dels actius seleccionats ja tenen una ubicació",
|
||||
"sort_albums_by": "Ordena àlbums per...",
|
||||
"sort_created": "Data de creació",
|
||||
"sort_items": "Quantitat d'elements",
|
||||
@@ -2368,11 +2389,13 @@
|
||||
"trash_page_title": "Paperera ({count})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "Els elements que s'enviïn a la paperera s'eliminaran permanentment després de {days, plural, one {# dia} other {# dies}}.",
|
||||
"trigger": "Disparador",
|
||||
"trigger_asset_metadata_extraction": "Extracció de metadades d'actius",
|
||||
"trigger_asset_metadata_extraction_description": "Disparat quan s'extreuen les metadades EXIF d'un actiu",
|
||||
"trigger_asset_uploaded": "Càrrega de Mitjans",
|
||||
"trigger_asset_uploaded_description": "Es dispara quan un nou mitjà es puge al servidor",
|
||||
"trigger_description": "L'esdeveniment que inicia l'automatització",
|
||||
"trigger_person_recognized": "Persona identificada",
|
||||
"trigger_person_recognized_description": "Es dispara quan es detecta una persona",
|
||||
"trigger_person_recognized_description": "Disparat quan es reconeix una persona",
|
||||
"trigger_type": "Tipus de disparador",
|
||||
"troubleshoot": "Solució de problemes",
|
||||
"type": "Tipus",
|
||||
|
||||
+2
-2
@@ -2390,12 +2390,12 @@
|
||||
"trashed_items_will_be_permanently_deleted_after": "Smazané položky budou trvale odstraněny po {days, plural, one {# dni} other {# dnech}}.",
|
||||
"trigger": "Spouštěč",
|
||||
"trigger_asset_metadata_extraction": "Extrakce metadat položek",
|
||||
"trigger_asset_metadata_extraction_description": "Spustí se při extrakci EXIF údajů z mediálního souboru",
|
||||
"trigger_asset_metadata_extraction_description": "Spustí se při extrakci EXIF metadat z mediálního souboru",
|
||||
"trigger_asset_uploaded": "Nahrání položky",
|
||||
"trigger_asset_uploaded_description": "Spustí se při nahrání nového souboru",
|
||||
"trigger_description": "Událost, která spustí pracovní postup",
|
||||
"trigger_person_recognized": "Osoba rozpoznána",
|
||||
"trigger_person_recognized_description": "Spustí se, když je objevena osoba",
|
||||
"trigger_person_recognized_description": "Spustí se, když je rozpoznána osoba",
|
||||
"trigger_type": "Typ spouštěče",
|
||||
"troubleshoot": "Diagnostika",
|
||||
"type": "Typ",
|
||||
|
||||
+9
-7
@@ -9,7 +9,7 @@
|
||||
"actions": "Aktionen",
|
||||
"active": "Aktiv",
|
||||
"active_count": "Aktive: {count}",
|
||||
"activity": "Ansicht",
|
||||
"activity": "Aktivität",
|
||||
"activity_changed": "Aktivität ist {enabled, select, true {aktiviert} other {deaktiviert}}",
|
||||
"add": "Hinzufügen",
|
||||
"add_a_description": "Beschreibung hinzufügen",
|
||||
@@ -55,7 +55,7 @@
|
||||
"background_task_job": "Hintergrundaufgaben",
|
||||
"backup_database": "Datenbanksicherung erstellen",
|
||||
"backup_database_enable_description": "Datenbank regelmäßig sichern",
|
||||
"backup_keep_last_amount": "Anzahl der aufzubewahrenden früheren Sicherungen",
|
||||
"backup_keep_last_amount": "Anzahl der zu speichernden vorherigen Sicherungen",
|
||||
"backup_onboarding_1_description": "Offsite-Kopie in der Cloud oder an einem anderen physischen Ort.",
|
||||
"backup_onboarding_2_description": "Lokale Kopien auf verschiedenen Geräten. Dazu gehören die Hauptdateien und eine lokale Sicherung dieser Dateien.",
|
||||
"backup_onboarding_3_description": "Kopien deiner Daten inklusive Originaldateien. Dies umfasst 1 Kopie an einem anderen Ort und 2 lokale Kopien.",
|
||||
@@ -311,8 +311,8 @@
|
||||
"paths_validated_successfully": "Alle Pfade erfolgreich überprüft",
|
||||
"person_cleanup_job": "Personen aufräumen",
|
||||
"queue_details": "Warteschlangendetails",
|
||||
"queues": "Auftrags-Warteschlangen",
|
||||
"queues_page_description": "Auftragswarteschlangen-Adminseite",
|
||||
"queues": "Auftrags-Schlangen",
|
||||
"queues_page_description": "Auftragsschlangen-Adminseite",
|
||||
"quota_size_gib": "Kontingent (GiB)",
|
||||
"refreshing_all_libraries": "Alle Bibliotheken aktualisieren",
|
||||
"registration": "Admin-Registrierung",
|
||||
@@ -562,7 +562,7 @@
|
||||
"app_download_links": "App Download-Links",
|
||||
"app_settings": "App-Einstellungen",
|
||||
"app_stores": "App Stores",
|
||||
"app_update_available": "App Update verfügbar",
|
||||
"app_update_available": "App-Update verfügbar",
|
||||
"appears_in": "Enthalten in",
|
||||
"apply_count": "Anwenden ({count, number})",
|
||||
"archive": "Archiv",
|
||||
@@ -2166,7 +2166,7 @@
|
||||
"share_dialog_preparing": "Vorbereiten...",
|
||||
"share_link": "Link teilen",
|
||||
"share_original": "Original verwenden (groß)",
|
||||
"share_preview": "Verwenden Sie Thumbnail (klein)",
|
||||
"share_preview": "Thumbnail verwenden (klein)",
|
||||
"shared": "Geteilt",
|
||||
"shared_album_activities_input_disable": "Kommentare sind deaktiviert",
|
||||
"shared_album_activity_remove_content": "Möchtest du diese Aktivität entfernen?",
|
||||
@@ -2395,7 +2395,7 @@
|
||||
"trigger_asset_uploaded_description": "Löst aus, wenn eine neue Datei hochgeladen wurde",
|
||||
"trigger_description": "Ein Ereignis, das den Workflow startet",
|
||||
"trigger_person_recognized": "Person erkannt",
|
||||
"trigger_person_recognized_description": "Löst aus, wenn eine Person erkannt wird",
|
||||
"trigger_person_recognized_description": "Löst aus, wenn eine Person erkannt wurde",
|
||||
"trigger_type": "Auslöser-Typ",
|
||||
"troubleshoot": "Fehler beheben",
|
||||
"type": "Typ",
|
||||
@@ -2437,6 +2437,7 @@
|
||||
"updated_password": "Passwort aktualisiert",
|
||||
"upload": "Hochladen",
|
||||
"upload_concurrency": "Parallelität beim Hochladen",
|
||||
"upload_day_count": "{date}: {count, plural, one {# Upload} other {# Uploads}}",
|
||||
"upload_details": "Upload Details",
|
||||
"upload_dialog_info": "Willst du die ausgewählten Elemente auf dem Server sichern?",
|
||||
"upload_dialog_title": "Element hochladen",
|
||||
@@ -2453,6 +2454,7 @@
|
||||
"uploading": "Wird hochgeladen",
|
||||
"uploading_media": "Medien werden hochgeladen",
|
||||
"uploads": "Uploads",
|
||||
"uploads_count": "{count, plural, one {# Upload} other {# Uploads}}",
|
||||
"url": "URL",
|
||||
"usage": "Verwendung",
|
||||
"use_biometric": "Biometrie verwenden",
|
||||
|
||||
@@ -189,18 +189,23 @@
|
||||
"machine_learning_smart_search_enabled": "Enable smart search",
|
||||
"machine_learning_smart_search_enabled_description": "If disabled, images will not be encoded for smart search.",
|
||||
"machine_learning_url_description": "The URL of the machine learning server. If more than one URL is provided, each server will be attempted one-at-a-time until one responds successfully, in order from first to last. Servers that don't respond will be temporarily ignored until they come back online.",
|
||||
"maintenance_backup_management": "Backup management",
|
||||
"maintenance_delete_backup": "Delete Backup",
|
||||
"maintenance_delete_backup_description": "This file will be irrevocably deleted.",
|
||||
"maintenance_delete_error": "Failed to delete backup.",
|
||||
"maintenance_integrity_check": "Check",
|
||||
"maintenance_integrity_check_all": "Check All",
|
||||
"maintenance_integrity_checksum_mismatch": "Checksum Mismatch",
|
||||
"maintenance_integrity_checksum_mismatch_description": "Files whose on-disk checksum mismatches the checksum Immich has stored in its database.",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Check for checksum mismatches",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Refresh checksum mismatch reports",
|
||||
"maintenance_integrity_missing_file": "Missing Files",
|
||||
"maintenance_integrity_missing_file_description": "Files that Immich has tracked in its database but do not exist on the file system.",
|
||||
"maintenance_integrity_missing_file_job": "Check for missing files",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Refresh missing file reports",
|
||||
"maintenance_integrity_report": "Integrity Report",
|
||||
"maintenance_integrity_untracked_file": "Untracked Files",
|
||||
"maintenance_integrity_untracked_file_description": "Files in Immich's directories that Immich does not have any record of.",
|
||||
"maintenance_integrity_untracked_file_job": "Check for untracked files",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Refresh untracked file reports",
|
||||
"maintenance_restore_backup": "Restore Backup",
|
||||
|
||||
+2561
File diff suppressed because it is too large
Load Diff
+7
-2
@@ -189,18 +189,23 @@
|
||||
"machine_learning_smart_search_enabled": "Habilitar búsqueda inteligente",
|
||||
"machine_learning_smart_search_enabled_description": "Al desactivarlo las imágenes no se procesarán para usar la búsqueda inteligente.",
|
||||
"machine_learning_url_description": "La URL del servidor de aprendizaje automático. Si se proporciona más de una URL se intentará acceder a cada servidor sucesivamente hasta que uno responda correctamente en el orden especificado. Los servidores que no respondan serán ignorados temporalmente hasta que vuelvan a estar en línea.",
|
||||
"maintenance_backup_management": "Gestión de respaldos",
|
||||
"maintenance_delete_backup": "Eliminar copia de seguridad",
|
||||
"maintenance_delete_backup_description": "Este archivo será eliminado de forma permanente.",
|
||||
"maintenance_delete_error": "Fallo al eliminar la copia de seguridad.",
|
||||
"maintenance_integrity_check": "Verificar",
|
||||
"maintenance_integrity_check_all": "Comprobar todo",
|
||||
"maintenance_integrity_checksum_mismatch": "Discrepancia de checksum",
|
||||
"maintenance_integrity_checksum_mismatch_description": "Archivos cuya suma de verificación en disco no coincide con la suma de verificación que Immich tiene almacenada en su base de datos.",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Comprobar las discrepancias de checksum",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Actualizar reportes de discrepancia de checksum",
|
||||
"maintenance_integrity_missing_file": "Archivos faltantes",
|
||||
"maintenance_integrity_missing_file_description": "Archivos que Immich ha rastreado en su base de datos pero que no existen en el sistema de archivos.",
|
||||
"maintenance_integrity_missing_file_job": "Comprueba archivos faltantes",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Actualizar informes de archivos faltantes",
|
||||
"maintenance_integrity_report": "Informe de integridad",
|
||||
"maintenance_integrity_untracked_file": "Archivos no rastreados",
|
||||
"maintenance_integrity_untracked_file_description": "Archivos en los directorios de Immich de los que Immich no tiene ningún registro.",
|
||||
"maintenance_integrity_untracked_file_job": "Comprobar archivos no rastreados",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Actualizar informes de archivos no rastreados",
|
||||
"maintenance_restore_backup": "Restaurar copia de seguridad",
|
||||
@@ -2390,12 +2395,12 @@
|
||||
"trashed_items_will_be_permanently_deleted_after": "Los elementos en la papelera serán eliminados permanentemente tras {days, plural, one {# día} other {# días}}.",
|
||||
"trigger": "Disparador",
|
||||
"trigger_asset_metadata_extraction": "Extracción de metadatos de los elementos",
|
||||
"trigger_asset_metadata_extraction_description": "Se activa cuando se extraen los datos EXIF de un elemento",
|
||||
"trigger_asset_metadata_extraction_description": "Se activa cuando se extraigan los datos EXIF de un elemento",
|
||||
"trigger_asset_uploaded": "Recurso subido",
|
||||
"trigger_asset_uploaded_description": "Se activa cuando se carga un nuevo recurso",
|
||||
"trigger_description": "Un evento que inicia el flujo de trabajo",
|
||||
"trigger_person_recognized": "Persona reconocida",
|
||||
"trigger_person_recognized_description": "Se activa cuando se detecta una persona",
|
||||
"trigger_person_recognized_description": "Se activa cuando se reconoce una persona",
|
||||
"trigger_type": "Tipo de disparador",
|
||||
"troubleshoot": "Solucionar problemas",
|
||||
"type": "Tipo",
|
||||
|
||||
+9
-4
@@ -8,7 +8,7 @@
|
||||
"action_description": "Un ensemble d'actions applicables sur des médias filtrés",
|
||||
"actions": "Actions",
|
||||
"active": "En cours",
|
||||
"active_count": "Actif : {count}",
|
||||
"active_count": "En cours : {count}",
|
||||
"activity": "Activité",
|
||||
"activity_changed": "Activité {enabled, select, true {activée} other {désactivée}}",
|
||||
"add": "Ajouter",
|
||||
@@ -189,19 +189,24 @@
|
||||
"machine_learning_smart_search_enabled": "Activer la recherche intelligente",
|
||||
"machine_learning_smart_search_enabled_description": "Si cette option est désactivée, les images ne seront pas encodées pour la recherche intelligente.",
|
||||
"machine_learning_url_description": "L’URL du serveur d'apprentissage automatique. Si plusieurs URL sont fournies, chaque serveur sera essayé un par un jusqu’à ce que l’un d’eux réponde avec succès, dans l’ordre de la première à la dernière. Les serveurs ne répondant pas seront temporairement ignorés jusqu'à ce qu'ils soient de nouveau opérationnels.",
|
||||
"maintenance_backup_management": "Gestion des sauvegardes",
|
||||
"maintenance_delete_backup": "Supprimer la sauvegarde",
|
||||
"maintenance_delete_backup_description": "Ce fichier sera définitivement supprimé.",
|
||||
"maintenance_delete_error": "Échec de la suppression de la sauvegarde.",
|
||||
"maintenance_integrity_check": "Vérifier",
|
||||
"maintenance_integrity_check_all": "Tout cocher",
|
||||
"maintenance_integrity_checksum_mismatch": "Non correspondance de la somme de contrôle",
|
||||
"maintenance_integrity_checksum_mismatch_description": "Fichiers dont la somme de contrôle sur le disque ne correspond pas à celle stockée dans la base de données d'Immich.",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Vérifier la correspondance de la somme de contrôle",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Rafraîchir les rapports de correspondance de la somme de contrôle",
|
||||
"maintenance_integrity_missing_file": "Fichiers manquants",
|
||||
"maintenance_integrity_missing_file_description": "Fichiers suivis dans la base de données d'Immich mais inexistants sur le système de fichiers.",
|
||||
"maintenance_integrity_missing_file_job": "Détecter les fichiers manquants",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Rafraîchir les rapports sur les fichiers manquants",
|
||||
"maintenance_integrity_report": "Rapport d'intégrité",
|
||||
"maintenance_integrity_untracked_file": "Fichiers non suivis",
|
||||
"maintenance_integrity_untracked_file_job": "Détecter les fichiers non suivis",
|
||||
"maintenance_integrity_untracked_file_description": "Fichiers présents dans les répertoires d'Immich mais absents de la base de données.",
|
||||
"maintenance_integrity_untracked_file_job": "Vérifier les fichiers non suivis",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Rafraîchir les rapports de fichiers non suivis",
|
||||
"maintenance_restore_backup": "Restaurer la sauvegarde",
|
||||
"maintenance_restore_backup_description": "Immich sera effacé et restauré à partir de la sauvegarde choisie. Une sauvegarde sera créée avant de continuer.",
|
||||
@@ -2390,12 +2395,12 @@
|
||||
"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}}.",
|
||||
"trigger": "Déclencheur",
|
||||
"trigger_asset_metadata_extraction": "Extraction des métadonnées du média",
|
||||
"trigger_asset_metadata_extraction_description": "Déclenché quand les données EXIF d'un média sont extraites",
|
||||
"trigger_asset_metadata_extraction_description": "Déclenché quand les métadonnées EXIF d'un média sont extraites",
|
||||
"trigger_asset_uploaded": "Téléversement du média",
|
||||
"trigger_asset_uploaded_description": "Déclenché lorsqu'un nouveau média est téléversé",
|
||||
"trigger_description": "Un événement qui active le flux de traitement",
|
||||
"trigger_person_recognized": "Personne reconnue",
|
||||
"trigger_person_recognized_description": "Déclenché lorsqu'une personne est détectée",
|
||||
"trigger_person_recognized_description": "Déclenché lorsqu'une personne est reconnue",
|
||||
"trigger_type": "Type de déclencheur",
|
||||
"troubleshoot": "Dépannage",
|
||||
"type": "Type",
|
||||
|
||||
+24
-1
@@ -79,6 +79,7 @@
|
||||
"cron_expression_description": "Socraigh an t-eatramh scanadh ag baint úsáide as an bhformáid cron. Le haghaidh tuilleadh eolais féach ar m.sh. <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Réamhshocruithe léirithe Cron",
|
||||
"disable_login": "Díchumasaigh logáil isteach",
|
||||
"download_csv": "Íoslódáil CSV",
|
||||
"duplicate_detection_job_description": "Rith foghlaim meaisín ar shócmhainní chun íomhánna comhchosúla a bhrath. Braitheann sé ar Chuardach Cliste",
|
||||
"exclusion_pattern_description": "Le patrúin eisiaimh, is féidir leat neamhaird a dhéanamh de chomhaid agus fillteáin agus tú ag scanadh do leabharlann. Tá sé seo úsáideach má tá fillteáin agat ina bhfuil comhaid nach mian leat a allmhairiú, amhail comhaid RAW.",
|
||||
"export_config_as_json_description": "Íoslódáil cumraíocht reatha an chórais mar chomhad JSON",
|
||||
@@ -191,6 +192,17 @@
|
||||
"maintenance_delete_backup": "Scrios Cúltaca",
|
||||
"maintenance_delete_backup_description": "Scriosfar an comhad seo go neamh-inchúlghairthe.",
|
||||
"maintenance_delete_error": "Theip ar an gcúltaca a scriosadh.",
|
||||
"maintenance_integrity_check_all": "Seiceáil Gach Rud",
|
||||
"maintenance_integrity_checksum_mismatch": "Mí-chomhoiriúnacht suime seiceála",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Seiceáil le haghaidh mí-oiriúnuithe suime seiceála",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Athnuachan tuairiscí mí-oiriúnachta suime seiceála",
|
||||
"maintenance_integrity_missing_file": "Comhaid ar Iarraidh",
|
||||
"maintenance_integrity_missing_file_job": "Seiceáil le haghaidh comhaid atá ar iarraidh",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Athnuachan tuairiscí ar chomhaid atá ar iarraidh",
|
||||
"maintenance_integrity_report": "Tuarascáil Ionracais",
|
||||
"maintenance_integrity_untracked_file": "Comhaid Gan Rianú",
|
||||
"maintenance_integrity_untracked_file_job": "Seiceáil le haghaidh comhaid neamhrianaithe",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Athnuachan tuarascálacha comhad neamhrianaithe",
|
||||
"maintenance_restore_backup": "Athchóirigh Cúltaca",
|
||||
"maintenance_restore_backup_description": "Scriosfar agus athchóireofar Immich ón gcúltaca roghnaithe. Cruthófar cúltaca sula leanfar ar aghaidh.",
|
||||
"maintenance_restore_backup_different_version": "Cruthaíodh an cúltaca seo le leagan difriúil de Immich!",
|
||||
@@ -915,6 +927,8 @@
|
||||
"deduplicate_all": "Dídhúblaigh Gach Rud",
|
||||
"default_locale": "Logán Réamhshocraithe",
|
||||
"default_locale_description": "Formáidigh dátaí agus uimhreacha bunaithe ar shuíomh do bhrabhsálaí",
|
||||
"default_quality_subtitle": "Cáilíocht a úsáidtear agus tú ag tapáil ar an gcnaipe 'roinn'. Brúigh an cnaipe 'roinn' ar feadh tamaill le roghnú gach uair.",
|
||||
"default_share_quality": "Cáilíocht réamhshocraithe roinnte",
|
||||
"delete": "Scrios",
|
||||
"delete_action_confirmation_message": "An bhfuil tú cinnte gur mian leat an tsócmhainn seo a scriosadh? Bogfaidh an gníomh seo an tsócmhainn go dtí bruscar an fhreastalaí agus fiafróidh sé díot an mian leat í a scriosadh go háitiúil",
|
||||
"delete_action_prompt": "{count} scriosta",
|
||||
@@ -1224,6 +1238,7 @@
|
||||
"failed": "Theip air",
|
||||
"failed_count": "Theip ar: {count}",
|
||||
"failed_to_authenticate": "Theip ar fhíordheimhniú",
|
||||
"failed_to_delete_file": "Theip ar an gcomhad a scriosadh",
|
||||
"failed_to_load_assets": "Theip ar shócmhainní a lódáil",
|
||||
"failed_to_load_folder": "Theip ar an bhfillteán a luchtú",
|
||||
"favorite": "Ceanán",
|
||||
@@ -1354,6 +1369,7 @@
|
||||
"individual_share": "Sciar aonair",
|
||||
"individual_shares": "Scaireanna aonair",
|
||||
"info": "Eolas",
|
||||
"integrity_checks": "Seiceálacha Ionracais",
|
||||
"interval": {
|
||||
"day_at_onepm": "Gach lá ag 1pm",
|
||||
"hours": "Gach {hours, plural, one {uair an chloig} other {{hours, number} uair an chloig}}",
|
||||
@@ -1426,6 +1442,7 @@
|
||||
"linked_oauth_account": "Cuntas OAuth nasctha",
|
||||
"list": "Liosta",
|
||||
"live": "Beo",
|
||||
"load_more": "Luchtaigh Tuilleadh",
|
||||
"loading": "Ag luchtú",
|
||||
"loading_search_results_failed": "Theip ar lódáil na dtorthaí cuardaigh",
|
||||
"local": "Áitiúil",
|
||||
@@ -2084,6 +2101,7 @@
|
||||
"select_person": "Roghnaigh duine",
|
||||
"select_person_to_tag": "Roghnaigh duine le clibeáil",
|
||||
"select_photos": "Roghnaigh grianghraif",
|
||||
"select_quality": "Roghnaigh cáilíocht",
|
||||
"select_trash_all": "Roghnaigh gach rud sa bhruscar",
|
||||
"select_user_for_sharing_page_err_album": "Theip ar albam a chruthú",
|
||||
"selected": "Roghnaithe",
|
||||
@@ -2147,6 +2165,8 @@
|
||||
"share_assets_selected": "{count} roghnaithe",
|
||||
"share_dialog_preparing": "Ag ullmhú...",
|
||||
"share_link": "Comhroinn an Nasc",
|
||||
"share_original": "Úsáid an bunleagan (mór)",
|
||||
"share_preview": "Úsáid mionsamhail (beag)",
|
||||
"shared": "Roinnte",
|
||||
"shared_album_activities_input_disable": "Tá trácht díchumasaithe",
|
||||
"shared_album_activity_remove_content": "Ar mhaith leat an ghníomhaíocht seo a scriosadh?",
|
||||
@@ -2248,6 +2268,7 @@
|
||||
"slideshow_repeat_description": "Lúb ar ais go dtí an tús nuair a chríochnaíonn an sleamhnán",
|
||||
"slideshow_settings": "Socruithe sleamhnán",
|
||||
"smart_album": "Albam cliste",
|
||||
"some_assets_already_have_a_location_warning": "Tá suíomh ag cuid de na sócmhainní roghnaithe cheana féin",
|
||||
"sort_albums_by": "Sórtáil albaim de réir...",
|
||||
"sort_created": "Dáta cruthaithe",
|
||||
"sort_items": "Líon na míreanna",
|
||||
@@ -2368,11 +2389,13 @@
|
||||
"trash_page_title": "Bruscar ({count})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "Scriosfar míreanna atá curtha sa bhruscar go buan i ndiaidh {days, plural, one {# lá} other {# laethanta}}.",
|
||||
"trigger": "Spriocdhíriú",
|
||||
"trigger_asset_metadata_extraction": "Eastóscadh Meiteashonraí Sócmhainní",
|
||||
"trigger_asset_metadata_extraction_description": "Spreagtha nuair a bhaintear meiteashonraí EXIF sócmhainne",
|
||||
"trigger_asset_uploaded": "Uaslódáil Sócmhainní",
|
||||
"trigger_asset_uploaded_description": "Spreagtha nuair a uaslódálfar sócmhainn nua",
|
||||
"trigger_description": "Imeacht a chuireann tús leis an sreabhadh oibre",
|
||||
"trigger_person_recognized": "Duine Aitheanta",
|
||||
"trigger_person_recognized_description": "Spreagtar nuair a bhraitear duine",
|
||||
"trigger_person_recognized_description": "Spreagtar nuair a aithnítear duine",
|
||||
"trigger_type": "Cineál spreagthóra",
|
||||
"troubleshoot": "Fabhtcheartaigh",
|
||||
"type": "Cineál",
|
||||
|
||||
+6
-4
@@ -189,9 +189,11 @@
|
||||
"machine_learning_smart_search_enabled": "Okos keresés engedélyezése",
|
||||
"machine_learning_smart_search_enabled_description": "Ha ki van kapcsolva, a képek nem lesznek átalakítva Okos kereséshez.",
|
||||
"machine_learning_url_description": "Gépi tanulás szerver URL címe. Ha többi, mint egy URL van megadva, mindegyik szervert egyenként próbálja meg, amíg az egyik sikeresen nem válaszol, sorrendben az elsőtől az utólsóig. A nem elérhető szervereket átmenetileg figyelmen kívül lesznek hagyva, amíg újra online nem lesznek.",
|
||||
"maintenance_backup_management": "backup kezelés",
|
||||
"maintenance_delete_backup": "Biztonsági mentés törlése",
|
||||
"maintenance_delete_backup_description": "A fájl törlése nem visszafordítható.",
|
||||
"maintenance_delete_error": "A biztonsági mentés törlése sikertelen volt.",
|
||||
"maintenance_integrity_check": "Ellenőrizze",
|
||||
"maintenance_integrity_check_all": "Mind ellenőrzése",
|
||||
"maintenance_integrity_checksum_mismatch": "Ellenőrzőösszeg-eltérés",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Az ellenőrzőösszegek eltéréseinek ellenőrzése",
|
||||
@@ -2020,13 +2022,13 @@
|
||||
"search_albums": "Albumok keresése",
|
||||
"search_by_context": "Keresés tartalom alapján",
|
||||
"search_by_description": "Keresés leírás alapján",
|
||||
"search_by_description_example": "Túrázós nap Szapában",
|
||||
"search_by_description_example": "Például: túrázós nap a hegyekben",
|
||||
"search_by_filename": "Keresés fájlnév vagy kiterjesztés alapján",
|
||||
"search_by_filename_example": "például IMG_1234.JPG vagy PNG",
|
||||
"search_by_full_path": "Keresés teljes elérési út vagy mappa alapján",
|
||||
"search_by_full_path_example": "/Jancsi/Projektek/3D_nyomtatás/2026-07-01 – kereshetsz a Projektek, 3D, Nyomtatás, 2026 stb. kifejezésekre.",
|
||||
"search_by_ocr": "Keresés szövegfelismeréssel (OCR)",
|
||||
"search_by_ocr_example": "Latte",
|
||||
"search_by_ocr_example": "Például: számla",
|
||||
"search_camera_lens_model": "Keresés objektívmodell alapján...",
|
||||
"search_camera_make": "Kameragyártó keresése...",
|
||||
"search_camera_model": "Kameramodell keresése...",
|
||||
@@ -2308,7 +2310,7 @@
|
||||
"submit": "Beküldés",
|
||||
"success": "Siker",
|
||||
"suggestions": "Javaslatok",
|
||||
"sunrise_on_the_beach": "Napkelte a tengerparton",
|
||||
"sunrise_on_the_beach": "Például: napfelkelte a tengerparton",
|
||||
"support": "Támogatás",
|
||||
"support_and_feedback": "Támogatás és visszajelzés",
|
||||
"support_third_party_description": "Az Immich telepítésedet egy harmadik fél csomagolta. Mivel elképzelhető, hogy az esetlegesen felmerülő problémákat ez a csomag okozza, ezért kérjük, először velük közöld a problémákat az alábbi linkek segítségével.",
|
||||
@@ -2393,7 +2395,7 @@
|
||||
"trigger_asset_metadata_extraction_description": "A művelet akkor indult el, amikor az elem EXIF-adatai kinyerésre kerültek",
|
||||
"trigger_asset_uploaded": "Elem feltöltés",
|
||||
"trigger_asset_uploaded_description": "Új elem feltöltésekor indul el",
|
||||
"trigger_description": "Egy esemény, ami elindítja a folyamatot",
|
||||
"trigger_description": "A munkafolyamatot elindító esemény",
|
||||
"trigger_person_recognized": "Személy felismerve",
|
||||
"trigger_person_recognized_description": "Személy felismerésekor indul el",
|
||||
"trigger_type": "Feltétel típusa",
|
||||
|
||||
+29
-1
@@ -79,6 +79,7 @@
|
||||
"cron_expression_description": "Tetapkan interval pemindaian menggunakan format cron. Untuk informasi lebih lanjut, silakan merujuk misalnya ke <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Prasetel ekspresi cron",
|
||||
"disable_login": "Nonaktifkan log masuk",
|
||||
"download_csv": "Unduh CSV",
|
||||
"duplicate_detection_job_description": "Jalankan pembelajaran mesin pada aset untuk mendeteksi gambar yang serupa. Bergantung pada Pencarian Cerdas",
|
||||
"exclusion_pattern_description": "Pola pengecualian dapat digunakan untuk mengabaikan file dan folder ketika memindai pustaka Anda. Ini berguna jika Anda memiliki folder yang berisi file yang tidak ingin diimpor, seperti file RAW.",
|
||||
"export_config_as_json_description": "Unduh konfigurasi sistem saat ini sebagai file JSON",
|
||||
@@ -188,9 +189,25 @@
|
||||
"machine_learning_smart_search_enabled": "Aktifkan pencarian cerdas",
|
||||
"machine_learning_smart_search_enabled_description": "Jika dinonaktifkan, gambar tidak akan dienkode untuk pencarian cerdas.",
|
||||
"machine_learning_url_description": "URL server pembelajaran mesin. Jika lebih dari satu URL disediakan, setiap server akan dicoba satu per satu hingga salah satu berhasil merespons, dari urutan pertama sampai terakhir. Server yang tidak merespons akan diabaikan sementara hingga kembali online.",
|
||||
"maintenance_backup_management": "Pengelolaan cadangan",
|
||||
"maintenance_delete_backup": "Hapus Cadangan",
|
||||
"maintenance_delete_backup_description": "File ini akan dihapus secara permanen.",
|
||||
"maintenance_delete_error": "Gagal menghapus cadangan.",
|
||||
"maintenance_integrity_check": "Periksa",
|
||||
"maintenance_integrity_check_all": "Periksa Semua",
|
||||
"maintenance_integrity_checksum_mismatch": "Checksum Tidak Cocok",
|
||||
"maintenance_integrity_checksum_mismatch_description": "File yang checksum di penyimpanannya tidak cocok dengan checksum yang disimpan Immich di basis data.",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Periksa ketidakcocokan checksum",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Segarkan laporan ketidakcocokan checksum",
|
||||
"maintenance_integrity_missing_file": "File Hilang",
|
||||
"maintenance_integrity_missing_file_description": "File yang dilacak Immich di basis datanya tetapi tidak ada di sistem file.",
|
||||
"maintenance_integrity_missing_file_job": "Periksa file yang hilang",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Segarkan laporan file yang hilang",
|
||||
"maintenance_integrity_report": "Laporan Integritas",
|
||||
"maintenance_integrity_untracked_file": "File Tidak Terlacak",
|
||||
"maintenance_integrity_untracked_file_description": "File di direktori Immich yang tidak memiliki catatan apa pun di Immich.",
|
||||
"maintenance_integrity_untracked_file_job": "Periksa file yang tidak terlacak",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Segarkan laporan file yang tidak terlacak",
|
||||
"maintenance_restore_backup": "Memulihkan Cadangan",
|
||||
"maintenance_restore_backup_description": "Immich akan dihapus dan dipulihkan dari cadangan yang dipilih. Sebuah cadangan akan dibuat sebelum dilanjutkan.",
|
||||
"maintenance_restore_backup_different_version": "Cadangan ini dibuat dengan versi Immich yang berbeda!",
|
||||
@@ -915,6 +932,8 @@
|
||||
"deduplicate_all": "Hapus semua duplikat",
|
||||
"default_locale": "Bahasa Default",
|
||||
"default_locale_description": "Sesuaikan format tanggal dan angka sesuai dengan pengaturan wilayah browser Anda",
|
||||
"default_quality_subtitle": "Kualitas yang digunakan saat mengetuk bagikan. Tekan lama tombol bagikan untuk memilih setiap kali.",
|
||||
"default_share_quality": "Kualitas bagikan default",
|
||||
"delete": "Hapus",
|
||||
"delete_action_confirmation_message": "Yakin ingin menghapus aset ini? Tindakan ini akan memindahkan aset ke tempat sampah pada server dan akan mengkonfirmasi apakah Anda ingin menghapusnya juga secara lokal",
|
||||
"delete_action_prompt": "{count} item telah dihapus",
|
||||
@@ -1224,6 +1243,7 @@
|
||||
"failed": "Gagal",
|
||||
"failed_count": "Gagal: {count}",
|
||||
"failed_to_authenticate": "Autentikasi gagal",
|
||||
"failed_to_delete_file": "Gagal menghapus file",
|
||||
"failed_to_load_assets": "Gagal memuat aset",
|
||||
"failed_to_load_folder": "Gagal memuat folder",
|
||||
"favorite": "Favorit",
|
||||
@@ -1354,6 +1374,7 @@
|
||||
"individual_share": "Bagikan individu",
|
||||
"individual_shares": "Pembagian individu",
|
||||
"info": "Info",
|
||||
"integrity_checks": "Pemeriksaan Integritas",
|
||||
"interval": {
|
||||
"day_at_onepm": "Setiap hari pada 13.00",
|
||||
"hours": "Setiap {hours, plural, one {jam} other {{hours, number} jam}}",
|
||||
@@ -1426,6 +1447,7 @@
|
||||
"linked_oauth_account": "Akun OAuth tertaut",
|
||||
"list": "Daftar",
|
||||
"live": "Langsung",
|
||||
"load_more": "Muat Lebih Banyak",
|
||||
"loading": "Memuat",
|
||||
"loading_search_results_failed": "Pemuatan hasil pencarian gagal",
|
||||
"local": "Lokal",
|
||||
@@ -2084,6 +2106,7 @@
|
||||
"select_person": "Pilih orang",
|
||||
"select_person_to_tag": "Pilih orang untuk diberi tag",
|
||||
"select_photos": "Pilih foto",
|
||||
"select_quality": "Pilih kualitas",
|
||||
"select_trash_all": "Pilih buang semua",
|
||||
"select_user_for_sharing_page_err_album": "Gagal membuat album",
|
||||
"selected": "Dipilih",
|
||||
@@ -2147,6 +2170,8 @@
|
||||
"share_assets_selected": "{count} dipilih",
|
||||
"share_dialog_preparing": "Menyiapkan...",
|
||||
"share_link": "Bagikan Tautan",
|
||||
"share_original": "Gunakan versi asli (besar)",
|
||||
"share_preview": "Gunakan thumbnail (kecil)",
|
||||
"shared": "Dibagikan",
|
||||
"shared_album_activities_input_disable": "Komentar dinonaktifkan",
|
||||
"shared_album_activity_remove_content": "Ingin menghapus aktivitas ini?",
|
||||
@@ -2248,6 +2273,7 @@
|
||||
"slideshow_repeat_description": "Ulangi dari awal saat salindia berakhir",
|
||||
"slideshow_settings": "Pengaturan salindia",
|
||||
"smart_album": "Album cerdas",
|
||||
"some_assets_already_have_a_location_warning": "Sebagian aset yang dipilih sudah memiliki lokasi",
|
||||
"sort_albums_by": "Urutkan album berdasarkan...",
|
||||
"sort_created": "Tanggal dibuat",
|
||||
"sort_items": "Jumlah item",
|
||||
@@ -2368,11 +2394,13 @@
|
||||
"trash_page_title": "Sampah ({count})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "Item yang dibuang akan dihapus secara permanen setelah {days, plural, one {# hari} other {# hari}}.",
|
||||
"trigger": "Pemicu",
|
||||
"trigger_asset_metadata_extraction": "Ekstraksi Metadata Aset",
|
||||
"trigger_asset_metadata_extraction_description": "Dipicu saat metadata EXIF dari sebuah aset diekstrak",
|
||||
"trigger_asset_uploaded": "Unggah Aset",
|
||||
"trigger_asset_uploaded_description": "Terpicu saat aset baru telah diunggah",
|
||||
"trigger_description": "Sebuah peristiwa yang memicu alur kerja",
|
||||
"trigger_person_recognized": "Orang Dikenali",
|
||||
"trigger_person_recognized_description": "Terpicu saat seseorang terdeteksi",
|
||||
"trigger_person_recognized_description": "Dipicu saat seseorang dikenali",
|
||||
"trigger_type": "Tipe pemicu",
|
||||
"troubleshoot": "Pemecahan Masalah",
|
||||
"type": "Jenis",
|
||||
|
||||
+44
-36
@@ -19,13 +19,13 @@
|
||||
"add_action": "Aggiungi azione",
|
||||
"add_action_description": "Fare clic per aggiungere un'azione da eseguire",
|
||||
"add_assets": "Aggiungi risorse",
|
||||
"add_birthday": "Aggiungi compleanno",
|
||||
"add_endpoint": "Aggiungi un endpoint",
|
||||
"add_exclusion_pattern": "Aggiungi un pattern di esclusione",
|
||||
"add_birthday": "Aggiungi un compleanno",
|
||||
"add_endpoint": "Aggiungi endpoint",
|
||||
"add_exclusion_pattern": "Aggiungi pattern di esclusione",
|
||||
"add_location": "Aggiungi posizione",
|
||||
"add_more_users": "Aggiungi altri utenti",
|
||||
"add_partner": "Aggiungi partner",
|
||||
"add_path": "Aggiungi un percorso",
|
||||
"add_path": "Aggiungi percorso",
|
||||
"add_photos": "Aggiungi foto",
|
||||
"add_step": "Aggiungi passo",
|
||||
"add_tag": "Aggiungi tag",
|
||||
@@ -195,8 +195,13 @@
|
||||
"maintenance_integrity_check_all": "Verifica Tutto",
|
||||
"maintenance_integrity_checksum_mismatch": "I checksum non corrispondono",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Verifica corrispondenza dei checksum",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Aggiorna report corrispondenze dei checksum",
|
||||
"maintenance_integrity_missing_file": "File mancanti",
|
||||
"maintenance_integrity_missing_file_job": "Verifica file mancanti",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Aggiorna report sui file mancanti",
|
||||
"maintenance_integrity_report": "Report di integrità",
|
||||
"maintenance_integrity_untracked_file": "File non tracciati",
|
||||
"maintenance_integrity_untracked_file_job": "Verifica presenza file non tracciati",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Aggiorna il report dei file non tracciati",
|
||||
"maintenance_restore_backup": "Ripristina backup",
|
||||
"maintenance_restore_backup_description": "Immich verrà cancellato e ripristinato dal backup scelto. Prima di procedere, verrà creato un backup.",
|
||||
@@ -1107,10 +1112,10 @@
|
||||
"failed_to_update_notification_status": "Impossibile aggiornare lo stato delle notifiche",
|
||||
"incorrect_email_or_password": "Email o password non corretta",
|
||||
"library_folder_already_exists": "Questo path di importazione esiste già.",
|
||||
"page_not_found": "Impossibile trovare la pagina",
|
||||
"page_not_found": "Pagina non trovata",
|
||||
"paths_validation_failed": "{paths, plural, one {La convalida di # percorso non è riuscita} other {La convalida di # percorsi non è riuscita}}",
|
||||
"profile_picture_transparent_pixels": "Le foto profilo non possono avere pixel trasparenti. Riprova ingrandendo e/o muovendo l'immagine.",
|
||||
"quota_higher_than_disk_size": "Hai impostato un limite più alto della dimensione del disco",
|
||||
"quota_higher_than_disk_size": "Hai impostato una quota più alta della dimensione del disco",
|
||||
"something_went_wrong": "Qualcosa è andato storto",
|
||||
"unable_to_add_album_users": "Impossibile aggiungere utenti all'album",
|
||||
"unable_to_add_assets_to_shared_link": "Impossibile aggiungere le risorse al link condiviso",
|
||||
@@ -1123,55 +1128,55 @@
|
||||
"unable_to_change_album_user_role": "Impossibile modificare il ruolo dell'utente nell'album",
|
||||
"unable_to_change_date": "Impossibile modificare la data",
|
||||
"unable_to_change_description": "Impossibile modificare la descrizione",
|
||||
"unable_to_change_favorite": "Errore durante il cambio di stato preferito della risorsa",
|
||||
"unable_to_change_favorite": "Impossibile modificare lo stato preferito della risorsa",
|
||||
"unable_to_change_location": "Impossibile modificare posizione",
|
||||
"unable_to_change_password": "Impossibile modificare password",
|
||||
"unable_to_change_visibility": "Errore durante la modifica della visibilità per {count, plural, one {# persona} other {# persone}}",
|
||||
"unable_to_complete_oauth_login": "Errore durante l'accesso tramite OAuth",
|
||||
"unable_to_change_visibility": "Impossibile modificare la visibilità per {count, plural, one {# persona} other {# persone}}",
|
||||
"unable_to_complete_oauth_login": "Impossibile accedere tramite OAuth",
|
||||
"unable_to_connect": "Impossibile connettersi",
|
||||
"unable_to_copy_to_clipboard": "Impossibile copiare negli appunti, assicurati di aver aperto la pagina in https",
|
||||
"unable_to_create": "Impossibile creare la sequenza",
|
||||
"unable_to_create_admin_account": "Impossibile creare un account admin",
|
||||
"unable_to_create_admin_account": "Impossibile creare un account amministratore",
|
||||
"unable_to_create_api_key": "Impossibile creare una nuova chiave API",
|
||||
"unable_to_create_library": "Impossibile creare la libreria",
|
||||
"unable_to_create_user": "Impossibile creare utente",
|
||||
"unable_to_delete_album": "Impossibile cancellare album",
|
||||
"unable_to_delete_asset": "Impossibile cancellare la risorsa",
|
||||
"unable_to_create_user": "Impossibile creare l'utente",
|
||||
"unable_to_delete_album": "Impossibile eliminare l'album",
|
||||
"unable_to_delete_asset": "Impossibile eliminare la risorsa",
|
||||
"unable_to_delete_assets": "Errore durante l'eliminazione delle risorse",
|
||||
"unable_to_delete_exclusion_pattern": "Impossibile cancellare pattern di esclusione",
|
||||
"unable_to_delete_shared_link": "Impossibile cancellare link condiviso",
|
||||
"unable_to_delete_user": "Impossibile cancellare utente",
|
||||
"unable_to_delete_exclusion_pattern": "Impossibile eliminare il pattern di esclusione",
|
||||
"unable_to_delete_shared_link": "Impossibile eliminare il link condiviso",
|
||||
"unable_to_delete_user": "Impossibile eliminare l'utente",
|
||||
"unable_to_delete_workflow": "Impossibile eliminare la sequenza",
|
||||
"unable_to_download_files": "Impossibile scaricare i file",
|
||||
"unable_to_edit_exclusion_pattern": "Impossibile modificare pattern di esclusione",
|
||||
"unable_to_edit_exclusion_pattern": "Impossibile modificare il pattern di esclusione",
|
||||
"unable_to_empty_trash": "Impossibile svuotare il cestino",
|
||||
"unable_to_enter_fullscreen": "Impossibile aprire l'applicazione a schermo intero",
|
||||
"unable_to_exit_fullscreen": "Impossibile uscire dallo schermo intero",
|
||||
"unable_to_get_comments_number": "Impossibile ottenere il numero di commenti",
|
||||
"unable_to_get_shared_link": "Impossibile ottenere il link condivisibile",
|
||||
"unable_to_hide_person": "Impossibile nascondere persona",
|
||||
"unable_to_hide_person": "Impossibile nascondere la persona",
|
||||
"unable_to_link_motion_video": "Impossibile collegare video in movimento",
|
||||
"unable_to_link_oauth_account": "Impossibile collegare l'account OAuth",
|
||||
"unable_to_log_out_all_devices": "Impossibile eseguire il logout da tutti i dispositivi",
|
||||
"unable_to_log_out_device": "Impossibile eseguire il logout dal dispositivo",
|
||||
"unable_to_login_with_oauth": "Impossibile effettuare l'accesso tramite OAuth",
|
||||
"unable_to_play_video": "Impossibile riprodurre il video",
|
||||
"unable_to_reassign_assets_existing_person": "Errore durante la riassegnazione delle risorse a {name, select, null {una persona esistente} other {{name}}}",
|
||||
"unable_to_reassign_assets_new_person": "Errore durante la riassegnazione delle risorse ad una nuova persona",
|
||||
"unable_to_reassign_assets_existing_person": "Impossibile riassegnare le risorse a {name, select, null {una persona esistente} other {{name}}}",
|
||||
"unable_to_reassign_assets_new_person": "Impossibile riassegnare le risorse ad una nuova persona",
|
||||
"unable_to_refresh_user": "Impossibile aggiornare l'utente",
|
||||
"unable_to_remove_album_users": "Impossibile rimuovere gli utenti dall'album",
|
||||
"unable_to_remove_api_key": "Impossibile rimuovere la chiave API",
|
||||
"unable_to_remove_assets_from_shared_link": "Errore durante la rimozione delle risorse dal link condiviso",
|
||||
"unable_to_remove_library": "Impossibile rimuovere libreria",
|
||||
"unable_to_remove_assets_from_shared_link": "Impossibile rimuovere le risorse dal link condiviso",
|
||||
"unable_to_remove_library": "Impossibile rimuovere la libreria",
|
||||
"unable_to_remove_partner": "Impossibile rimuovere compagno",
|
||||
"unable_to_remove_reaction": "Impossibile rimuovere reazione",
|
||||
"unable_to_remove_reaction": "Impossibile rimuovere la reazione",
|
||||
"unable_to_reset_password": "Impossibile reimpostare la password",
|
||||
"unable_to_reset_pin_code": "Impossibile resettare il codice PIN",
|
||||
"unable_to_reset_pin_code": "Impossibile reimpostare il codice PIN",
|
||||
"unable_to_resolve_duplicate": "Impossibile risolvere duplicato",
|
||||
"unable_to_restore_assets": "Impossibile ripristinare le risorse",
|
||||
"unable_to_restore_trash": "Impossibile ripristinare cestino",
|
||||
"unable_to_restore_user": "Impossibile ripristinare utente",
|
||||
"unable_to_save_album": "Impossibile salvare album",
|
||||
"unable_to_restore_trash": "Impossibile ripristinare il cestino",
|
||||
"unable_to_restore_user": "Impossibile ripristinare l'utente",
|
||||
"unable_to_save_album": "Impossibile salvare l'album",
|
||||
"unable_to_save_api_key": "Impossibile salvare chiave API",
|
||||
"unable_to_save_date_of_birth": "Impossible salvare la data di nascita",
|
||||
"unable_to_save_name": "Impossibile salvare il nome",
|
||||
@@ -1186,7 +1191,7 @@
|
||||
"unable_to_trash_asset": "Impossibile cestinare la risorsa",
|
||||
"unable_to_unlink_account": "Impossibile scollegare l'account",
|
||||
"unable_to_unlink_motion_video": "Impossibile scollegare video in movimento",
|
||||
"unable_to_update_album_cover": "Errore durante l'aggiornamento della copertina dell'album",
|
||||
"unable_to_update_album_cover": "Impossibile aggiornare la copertina dell'album",
|
||||
"unable_to_update_album_info": "Impossibile aggiornare le informazioni sull'album",
|
||||
"unable_to_update_library": "Impossibile aggiornare la libreria",
|
||||
"unable_to_update_location": "Impossibile aggiornare la posizione",
|
||||
@@ -1199,7 +1204,7 @@
|
||||
"errors_text": "Errori",
|
||||
"exclusion_pattern": "Pattern di esclusione",
|
||||
"exif": "Exif",
|
||||
"exif_bottom_sheet_description": "Aggiungi una descrizione...",
|
||||
"exif_bottom_sheet_description": "Aggiungi descrizione...",
|
||||
"exif_bottom_sheet_description_error": "Errore durante l'aggiornamento della descrizione",
|
||||
"exif_bottom_sheet_details": "DETTAGLI",
|
||||
"exif_bottom_sheet_location": "POSIZIONE",
|
||||
@@ -1240,7 +1245,7 @@
|
||||
"favorite_action_prompt": "{count} elementi aggiunti ai preferiti",
|
||||
"favorite_or_unfavorite_photo": "Aggiungi o rimuovi foto da preferiti",
|
||||
"favorites": "Preferiti",
|
||||
"favorites_page_no_favorites": "Nessun preferito",
|
||||
"favorites_page_no_favorites": "Nessuna risorsa preferita trovata",
|
||||
"feature_photo_updated": "Foto in evidenza aggiornata",
|
||||
"features": "Funzionalità",
|
||||
"features_in_development": "Funzionalità in fase di sviluppo",
|
||||
@@ -1266,16 +1271,16 @@
|
||||
"folders_feature_description": "Navigare la visualizzazione a cartelle per le foto e i video sul file system",
|
||||
"forgot_pin_code_question": "Hai dimenticato il tuo PIN?",
|
||||
"forward": "Avanti",
|
||||
"free_up_space": "Libera Spazio",
|
||||
"free_up_space": "Libera spazio",
|
||||
"free_up_space_description": "Sposta le foto e i video del tuo dispositivo nel cestino per liberare spazio. Le copie sul server rimarranno al sicuro.",
|
||||
"free_up_space_settings_subtitle": "Libera spazio sul dispositivo",
|
||||
"full_path": "Percorso completo: {path}",
|
||||
"full_path_or_folder": "Percorso assoluto o Cartella",
|
||||
"gcast_enabled": "Google Cast Abilitato",
|
||||
"full_path_or_folder": "Percorso assoluto o cartella",
|
||||
"gcast_enabled": "Google Cast",
|
||||
"gcast_enabled_description": "Questa funzione carica risorse esterne da Google per poter funzionare.",
|
||||
"general": "Generale",
|
||||
"geolocation_instruction_location": "Fai clic su una risorsa con coordinate GPS per utilizzare la sua posizione oppure seleziona una posizione direttamente dalla mappa",
|
||||
"get_help": "Chiedi Aiuto",
|
||||
"get_help": "Chiedi aiuto",
|
||||
"get_people_error": "Errore nel ritrovare le persone",
|
||||
"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",
|
||||
@@ -1288,7 +1293,7 @@
|
||||
"group_albums_by": "Raggruppa album in base a...",
|
||||
"group_country": "Raggruppa per paese",
|
||||
"group_no": "Nessun raggruppamento",
|
||||
"group_owner": "Raggruppa in base al proprietario",
|
||||
"group_owner": "Raggruppa per proprietario",
|
||||
"group_places_by": "Raggruppa posti per...",
|
||||
"group_year": "Raggruppa per anno",
|
||||
"haptic_feedback_switch": "Abilita feedback aptico",
|
||||
@@ -1437,6 +1442,7 @@
|
||||
"linked_oauth_account": "Account OAuth collegato",
|
||||
"list": "Lista",
|
||||
"live": "Live",
|
||||
"load_more": "Carica di più",
|
||||
"loading": "Caricamento",
|
||||
"loading_search_results_failed": "Impossibile caricare i risultati della ricerca",
|
||||
"local": "Locale",
|
||||
@@ -2383,11 +2389,13 @@
|
||||
"trash_page_title": "Cestino ({count})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "Gli elementi cestinati saranno eliminati definitivamente dopo {days, plural, one {# giorno} other {# giorni}}.",
|
||||
"trigger": "Evento di attivazione",
|
||||
"trigger_asset_metadata_extraction": "Estrazione dei metadati delle risorse",
|
||||
"trigger_asset_metadata_extraction_description": "Attivato quando i metadati EXIF di una risorsa vengono estratti",
|
||||
"trigger_asset_uploaded": "Caricamento risorsa",
|
||||
"trigger_asset_uploaded_description": "Attivato quando una nuova risorsa viene caricata",
|
||||
"trigger_description": "Un evento che attiva la sequenza",
|
||||
"trigger_person_recognized": "Persona Riconosciuta",
|
||||
"trigger_person_recognized_description": "Attivato quando è rilevata una persona",
|
||||
"trigger_person_recognized_description": "Attivato quando è riconosciuta una persona",
|
||||
"trigger_type": "Tipo di trigger",
|
||||
"troubleshoot": "Risoluzione dei problemi",
|
||||
"type": "Tipo",
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
"cron_expression_description": "cron形式で実行タイミングを設定します。詳しくは <link>Crontab Guru</link> を参照してください",
|
||||
"cron_expression_presets": "スケジュール(プリセット)",
|
||||
"disable_login": "ログインを無効にする",
|
||||
"download_csv": "CSVファイルをダウンロード",
|
||||
"duplicate_detection_job_description": "機械学習を用いて類似画像の検出を行います。(スマートサーチに依存)",
|
||||
"exclusion_pattern_description": "除外パターンを使用すると、ライブラリをスキャンする際にファイルやフォルダを無視することができます。RAWファイルなど、インポートしたくないファイルを含むフォルダがある場合に便利です。",
|
||||
"export_config_as_json_description": "現在のシステムコンフィグをJSONファイルとしてダウンロード",
|
||||
@@ -188,9 +189,16 @@
|
||||
"machine_learning_smart_search_enabled": "スマートサーチを有効にします",
|
||||
"machine_learning_smart_search_enabled_description": "無効にすると、画像はスマートサーチ用にエンコードされません。",
|
||||
"machine_learning_url_description": "機械学習サーバーのURL。複数のURLが設定された場合は1つずつサーバーが正常に応答するまで接続を試みます。応答のないサーバーはオンラインになるまで一時的に無視されます。",
|
||||
"maintenance_backup_management": "バックアップの管理",
|
||||
"maintenance_delete_backup": "バックアップを削除",
|
||||
"maintenance_delete_backup_description": "このファイルは不可逆的に削除されます。",
|
||||
"maintenance_delete_error": "バックアップの削除に失敗しました。",
|
||||
"maintenance_integrity_check": "チェックする",
|
||||
"maintenance_integrity_check_all": "すべてチェック",
|
||||
"maintenance_integrity_checksum_mismatch": "チェックサム不一致",
|
||||
"maintenance_integrity_checksum_mismatch_description": "ディスク上のチェックサムが、Immichのデータベースに保存されているチェックサムと一致しないファイル。",
|
||||
"maintenance_integrity_checksum_mismatch_job": "チェックサム不一致を検出する",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "チェックサム不一致レポートを再生成",
|
||||
"maintenance_restore_backup": "バックアップを復元",
|
||||
"maintenance_restore_backup_description": "現在のImmichは削除され、選択したバックアップから復元されます。続行前にバックアップが作成されます。",
|
||||
"maintenance_restore_backup_different_version": "このバックアップは異なるバージョンのImmichにより作成されたものです!",
|
||||
|
||||
+103
-5
@@ -79,6 +79,7 @@
|
||||
"cron_expression_description": "Cron 표현식으로 스캔 주기를 설정합니다. 자세한 내용은 <link>Crontab Guru</link>를 확인하세요.",
|
||||
"cron_expression_presets": "Cron 표현식 프리셋",
|
||||
"disable_login": "로그인 비활성화",
|
||||
"download_csv": "CSV 다운로드",
|
||||
"duplicate_detection_job_description": "기계 학습으로 유사한 이미지를 감지합니다. 스마트 검색이 활성화되어 있어야 합니다.",
|
||||
"exclusion_pattern_description": "라이브러리 스캔에서 제외할 파일이나 폴더 규칙을 설정합니다. 가져오지 않을 파일(RAW 파일 등)이 포함된 폴더가 있을 때 사용합니다.",
|
||||
"export_config_as_json_description": "현재 시스템 구성을 JSON 파일로 다운로드합니다.",
|
||||
@@ -191,6 +192,17 @@
|
||||
"maintenance_delete_backup": "백업 삭제",
|
||||
"maintenance_delete_backup_description": "이 파일이 영구적으로 삭제됩니다.",
|
||||
"maintenance_delete_error": "백업 삭제에 실패했습니다.",
|
||||
"maintenance_integrity_check_all": "전체선택",
|
||||
"maintenance_integrity_checksum_mismatch": "체크섬 불일치",
|
||||
"maintenance_integrity_checksum_mismatch_job": "파일 무결성 검사",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "무결성 오류 보고서 새로고침",
|
||||
"maintenance_integrity_missing_file": "누락된 파일",
|
||||
"maintenance_integrity_missing_file_job": "누락된 파일 확인",
|
||||
"maintenance_integrity_missing_file_refresh_job": "누락된 파일 보고서 새로고침",
|
||||
"maintenance_integrity_report": "무결성 보고서",
|
||||
"maintenance_integrity_untracked_file": "추적되지 않은 파일",
|
||||
"maintenance_integrity_untracked_file_job": "추적되지 않은 파일 확인",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "추적되지 않은 파일 보고서 새로고침",
|
||||
"maintenance_restore_backup": "백업 복원",
|
||||
"maintenance_restore_backup_description": "Immich가 초기화된 후 선택한 백업으로 복원됩니다. 계속하기 전에 백업이 자동으로 생성됩니다.",
|
||||
"maintenance_restore_backup_different_version": "이 백업은 다른 버전의 Immich에서 생성되었습니다!",
|
||||
@@ -305,6 +317,8 @@
|
||||
"refreshing_all_libraries": "모든 라이브러리를 새로고침합니다.",
|
||||
"registration": "관리자 등록",
|
||||
"registration_description": "첫 번째 사용자이므로 관리자 권한이 부여됩니다. 관리 작업 및 사용자 생성이 가능합니다.",
|
||||
"release_channel_release_candidate": "릴리스 후보 버전",
|
||||
"release_channel_stable": "안정화 버전",
|
||||
"remove_failed_jobs": "실패한 작업 삭제",
|
||||
"require_password_change_on_login": "최초 로그인 시 비밀번호 변경 요구",
|
||||
"reset_settings_to_default": "설정을 기본값으로 복원",
|
||||
@@ -399,6 +413,10 @@
|
||||
"transcoding_preferred_hardware_device_description": "(VAAPI 및 QSV인 경우) 하드웨어 트랜스코딩에 사용할 dri 노드를 지정합니다.",
|
||||
"transcoding_preset_preset": "프리셋 (-preset)",
|
||||
"transcoding_preset_preset_description": "압축 속도를 설정합니다. 동일 비트레이트에서 느린 속도를 선택하면 상대적으로 파일 크기가 감소하며 품질이 향상됩니다. VP9는 'faster' 이상의 속도를 무시합니다.",
|
||||
"transcoding_realtime": "실시간 트랜스코딩 [실험 기능]",
|
||||
"transcoding_realtime_description": "동영상 스트리밍 중 실시간 트랜스코딩을 수행합니다. 이를 통해 재생 중 화질을 변경할 수 있지만, 서버 성능에 따라 재생 지연이나 끊김 현상이 발생할 수 있습니다.",
|
||||
"transcoding_realtime_enabled": "실시간 트랜스코딩 활성화",
|
||||
"transcoding_realtime_enabled_description": "이 기능을 비활성화하면 새로운 실시간 트랜스코딩 작업을 시작할 수 없습니다.",
|
||||
"transcoding_reference_frames": "참조 프레임 수",
|
||||
"transcoding_reference_frames_description": "특정 프레임을 압축할 때 참조할 프레임 수를 설정합니다. 값을 높이면 압축 효율이 향상되지만 인코딩 속도가 느려집니다. 0을 입력하면 자동으로 설정합니다.",
|
||||
"transcoding_required_description": "허용 포맷이 아닌 동영상만 트랜스코딩",
|
||||
@@ -442,6 +460,8 @@
|
||||
"user_settings_description": "사용자 설정을 관리합니다.",
|
||||
"user_successfully_removed": "사용자 {email}님이 성공적으로 삭제되었습니다.",
|
||||
"users_page_description": "관리자 사용자 페이지",
|
||||
"version_check_channel": "배포 채널",
|
||||
"version_check_channel_description": "버전 업데이트 알림을 받을 배포 채널을 선택하세요",
|
||||
"version_check_enabled_description": "버전 확인 활성화",
|
||||
"version_check_implications": "주기적으로 {server}에 요청을 보내 새 버전을 확인합니다.",
|
||||
"version_check_settings": "버전 확인",
|
||||
@@ -562,6 +582,7 @@
|
||||
"asset_added_to_album": "앨범에 추가되었습니다.",
|
||||
"asset_adding_to_album": "앨범에 추가 중…",
|
||||
"asset_created": "자산 생성됨",
|
||||
"asset_day_count": "{date}: 자산 {count}개",
|
||||
"asset_description_updated": "항목 설명이 업데이트되었습니다.",
|
||||
"asset_filename_is_offline": "{filename} 항목 누락됨",
|
||||
"asset_has_unassigned_faces": "항목에 할당되지 않은 얼굴이 있음",
|
||||
@@ -691,6 +712,7 @@
|
||||
"backup_settings_subtitle": "업로드 설정을 관리합니다.",
|
||||
"backup_upload_details_page_more_details": "탭하여 상세보기",
|
||||
"backward": "뒤로",
|
||||
"battery_optimization_backup_reliability": "배터리 최적화를 해제하면 백그라운드 백업이 더욱 안정적으로 동작할 수 있습니다",
|
||||
"biometric_auth_enabled": "생체 인증이 활성화되었습니다.",
|
||||
"biometric_locked_out": "생체 인증이 일시적으로 비활성화되었습니다.",
|
||||
"biometric_no_options": "사용 가능한 생체 인증 옵션 없음",
|
||||
@@ -698,6 +720,7 @@
|
||||
"birthdate_saved": "생년월일이 저장되었습니다.",
|
||||
"birthdate_set_description": "생년월일은 사진 촬영 당시 인물의 나이를 계산하는 데 사용됩니다.",
|
||||
"blurred_background": "흐린 배경",
|
||||
"browse_templates": "템플릿 둘러보기",
|
||||
"bugs_and_feature_requests": "버그 제보 & 기능 요청",
|
||||
"build": "빌드",
|
||||
"build_image": "빌드 이미지",
|
||||
@@ -731,6 +754,7 @@
|
||||
"cannot_update_the_description": "설명을 변경할 수 없습니다.",
|
||||
"cast": "캐스트",
|
||||
"cast_description": "사용 가능한 캐스트 기기 구성",
|
||||
"change": "변경",
|
||||
"change_date": "날짜 변경",
|
||||
"change_description": "설명 변경",
|
||||
"change_display_order": "표시 순서 변경",
|
||||
@@ -759,6 +783,7 @@
|
||||
"check_corrupt_asset_backup_description": "이 검사는 모든 항목이 백업된 후 Wi-Fi가 연결된 상태에서만 실행하세요. 이 작업은 몇 분 정도 소요될 수 있습니다.",
|
||||
"check_logs": "로그 확인",
|
||||
"checksum": "체크섬",
|
||||
"choose": "선택",
|
||||
"choose_matching_people_to_merge": "병합할 인물 선택",
|
||||
"city": "도시",
|
||||
"cleanup_confirm_description": "Immich 서버에서 안전하게 백업된 항목 {count}개({date} 이전에 생성됨)를 찾았습니다. 이 기기에서 로컬 복사복을 삭제하시겠습니까?",
|
||||
@@ -776,7 +801,7 @@
|
||||
"clear": "지우기",
|
||||
"clear_all": "모두 지우기",
|
||||
"clear_all_recent_searches": "검색 기록 전체 삭제",
|
||||
"clear_failed_count": "명확한 실패 ({count})",
|
||||
"clear_failed_count": "실패 항목 삭제 ({count})",
|
||||
"clear_file_cache": "파일 캐시 지우기",
|
||||
"clear_message": "메시지 지우기",
|
||||
"clear_value": "값 지우기",
|
||||
@@ -808,6 +833,7 @@
|
||||
"comments_are_disabled": "댓글이 비활성화되었습니다.",
|
||||
"common_create_new_album": "앨범 생성",
|
||||
"completed": "완료됨",
|
||||
"configuration": "설정",
|
||||
"confirm": "확인",
|
||||
"confirm_admin_password": "관리자 비밀번호 확인",
|
||||
"confirm_delete_face": "항목에서 {name}의 얼굴을 삭제하시겠습니까?",
|
||||
@@ -836,6 +862,7 @@
|
||||
"copy_error": "오류 복사",
|
||||
"copy_file_path": "파일 경로 복사",
|
||||
"copy_image": "이미지 복사",
|
||||
"copy_json": "JSON 복사",
|
||||
"copy_link": "링크 복사",
|
||||
"copy_link_to_clipboard": "링크를 클립보드에 복사",
|
||||
"copy_password": "비밀번호 복사",
|
||||
@@ -894,12 +921,14 @@
|
||||
"date_of_birth": "생년월일",
|
||||
"date_of_birth_saved": "생년월일이 저장되었습니다.",
|
||||
"date_range": "날짜 범위",
|
||||
"date_time_original": "날짜/시간 고유",
|
||||
"date_time_original": "원본 촬영 일시",
|
||||
"day": "일",
|
||||
"days": "일",
|
||||
"deduplicate_all": "모두 삭제",
|
||||
"default_locale": "기본 로케일",
|
||||
"default_locale_description": "브라우저 로케일 설정에 따라 날짜 및 숫자 형식을 지정합니다",
|
||||
"default_quality_subtitle": "공유 시 사용할 기본 화질입니다. 공유 버튼을 길게 누르면 매번 화질을 선택할 수 있습니다.",
|
||||
"default_share_quality": "기본 공유 화질",
|
||||
"delete": "삭제",
|
||||
"delete_action_confirmation_message": "이 항목을 삭제하시겠습니까? 서버에서는 항목을 휴지통으로 이동시키며, 로컬에서도 삭제할 것인지 확인 메시지가 표시됩니다.",
|
||||
"delete_action_prompt": "{count}개 항목 삭제됨",
|
||||
@@ -973,7 +1002,10 @@
|
||||
"downloading_asset_filename": "{filename} 다운로드 중...",
|
||||
"downloading_from_icloud": "iCloud에서 다운로드 중",
|
||||
"downloading_media": "미디어 다운로드 중",
|
||||
"drag_to_reorder": "드래그하여 순서 변경",
|
||||
"drop_files_to_upload": "아무 곳에나 파일을 드롭하여 업로드",
|
||||
"duplicate": "복제",
|
||||
"duplicate_workflow": "워크플로우 복제",
|
||||
"duplicates": "비슷한 항목",
|
||||
"duplicates_description": "각 그룹을 확인하고, 비슷한 항목을 선택해 삭제 여부를 결정하세요.",
|
||||
"duration": "기간",
|
||||
@@ -1075,6 +1107,7 @@
|
||||
"failed_to_remove_product_key": "제품 키 제거에 실패했습니다.",
|
||||
"failed_to_reset_pin_code": "PIN 코드 초기화 실패",
|
||||
"failed_to_stack_assets": "항목 스택에 실패했습니다.",
|
||||
"failed_to_tag_assets": "항목에 태그를 추가하지 못했습니다",
|
||||
"failed_to_unstack_assets": "항목 스택 풀기에 실패했습니다.",
|
||||
"failed_to_update_notification_status": "알림 상태 업데이트 실패",
|
||||
"incorrect_email_or_password": "잘못된 이메일 또는 비밀번호",
|
||||
@@ -1200,10 +1233,12 @@
|
||||
"external_libraries": "외부 라이브러리",
|
||||
"external_network": "외부 네트워크",
|
||||
"external_network_sheet_info": "선호하는 Wi-Fi 네트워크에 연결되어 있지 않은 경우, 앱은 아래 나열된 URL 중 위에서부터 순서대로 사용 가능한 첫 번째 URL을 사용하여 연결합니다.",
|
||||
"f_number": "조리개 값(F값)",
|
||||
"face_unassigned": "알 수 없음",
|
||||
"failed": "실패함",
|
||||
"failed_count": "실패: {count}",
|
||||
"failed_to_authenticate": "인증에 실패했습니다.",
|
||||
"failed_to_delete_file": "파일을 삭제하지 못했습니다",
|
||||
"failed_to_load_assets": "항목 로드 실패",
|
||||
"failed_to_load_folder": "폴더 로드 실패",
|
||||
"favorite": "즐겨찾기",
|
||||
@@ -1229,6 +1264,7 @@
|
||||
"find_them_fast": "이름으로 검색하여 빠르게 찾기",
|
||||
"first": "첫 번째",
|
||||
"fix_incorrect_match": "잘못된 분류 수정",
|
||||
"focal_length": "초점 거리",
|
||||
"folder": "폴더",
|
||||
"folder_not_found": "폴더를 찾을 수 없음",
|
||||
"folders": "폴더",
|
||||
@@ -1333,6 +1369,7 @@
|
||||
"individual_share": "개인 공유",
|
||||
"individual_shares": "개별 공유",
|
||||
"info": "정보",
|
||||
"integrity_checks": "무결성 검사",
|
||||
"interval": {
|
||||
"day_at_onepm": "매일 오후 1시",
|
||||
"hours": "매 {hours, plural, one {시간} other {{hours, number}시간}}",
|
||||
@@ -1349,6 +1386,7 @@
|
||||
"ios_debug_info_no_sync_yet": "백그라운드 동기화 작업이 아직 실행되지 않음",
|
||||
"ios_debug_info_processes_queued": "{count, plural, one {백그라운드 작업 {count}개 대기 중} other {백그라운드 작업 {count}개 대기 중}}",
|
||||
"ios_debug_info_processing_ran_at": "{dateTime}에 처리됨",
|
||||
"iso": "ISO",
|
||||
"items_count": "{count, plural, one {#개} other {#개}} 항목",
|
||||
"jobs": "작업",
|
||||
"json_editor": "JSON 편집기",
|
||||
@@ -1379,6 +1417,7 @@
|
||||
"leave": "나가기",
|
||||
"leave_album": "앨범에서 나가기",
|
||||
"lens_model": "카메라 렌즈 모델",
|
||||
"less": "간략히 보기",
|
||||
"let_others_respond": "다른 사용자의 반응 허용",
|
||||
"level": "레벨",
|
||||
"library": "라이브러리",
|
||||
@@ -1402,6 +1441,8 @@
|
||||
"link_to_oauth": "OAuth에 연결",
|
||||
"linked_oauth_account": "OAuth 계정이 연결되었습니다.",
|
||||
"list": "목록",
|
||||
"live": "라이브",
|
||||
"load_more": "더 불러오기",
|
||||
"loading": "로드 중",
|
||||
"loading_search_results_failed": "검색 결과 로드 실패",
|
||||
"local": "로컬",
|
||||
@@ -1526,10 +1567,32 @@
|
||||
"media_chrome": {
|
||||
"auto": "자동",
|
||||
"captions": "자막",
|
||||
"closed_captions": "닫힌 캡션",
|
||||
"captions_off": "해제",
|
||||
"closed_captions": "자막(Cc)",
|
||||
"decode_error": "디코딩 오류",
|
||||
"disable_captions": "자막 끄기",
|
||||
"enable_captions": "자막 켜기",
|
||||
"enter_fullscreen_mode": "전체 화면으로 보기",
|
||||
"exit_fullscreen_mode": "전체 화면 종료",
|
||||
"loop": "반복",
|
||||
"media_error_description": "미디어 오류가 발생하여 재생을 계속할 수 없습니다. 파일이 손상되었거나 브라우저에서 지원하지 않는 형식일 수 있습니다.",
|
||||
"media_loading": "미디어 로딩 중",
|
||||
"mute": "음소거",
|
||||
"network_error": "Network 오류",
|
||||
"not_supported_error": "Source 지원되지 않음",
|
||||
"network_error_description": "네트워크 오류로 인해 미디어 다운로드에 실패했습니다.",
|
||||
"not_supported_error": "지원되지 않는 소스",
|
||||
"playback_rate": "재생 속도",
|
||||
"playback_rate_current": "현재 재생 속도",
|
||||
"playback_rate_value": "재생 속도 {playbackRate}",
|
||||
"playback_time": "재생 시간",
|
||||
"quality": "화질",
|
||||
"second": "초",
|
||||
"seconds": "초",
|
||||
"time_value_of_total_time": "{currentTime} (총 {totalTime})",
|
||||
"time_value_remaining": "{time} 남음",
|
||||
"unmute": "음소거 해제",
|
||||
"unsupported_error_description": "알 수 없는 오류가 발생했습니다. 서버 또는 네트워크에 문제가 있거나 브라우저에서 해당 형식을 지원하지 않을 수 있습니다.",
|
||||
"video_not_loaded_unknown_time": "동영상을 불러오지 못했습니다. 재생 시간을 확인할 수 없습니다.",
|
||||
"video_player": "비디오 플레이어",
|
||||
"volume": "볼륨"
|
||||
},
|
||||
@@ -1549,6 +1612,8 @@
|
||||
"merge_people_prompt": "인물들을 병합하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
|
||||
"merge_people_successfully": "선택한 인물을 합쳤습니다.",
|
||||
"merged_people_count": "인물 {count, plural, one {#명} other {#명}}을 합쳤습니다.",
|
||||
"minFaces": "최소 인식 얼굴 수",
|
||||
"minFaces_description": "인물 목록에 표시되기 위해 필요한 최소 얼굴 인식 횟수를 설정합니다",
|
||||
"minimize": "최소화",
|
||||
"minute": "분",
|
||||
"minutes": "분",
|
||||
@@ -1561,6 +1626,7 @@
|
||||
"modify_date": "수정일",
|
||||
"month": "월",
|
||||
"more": "더보기",
|
||||
"motion": "모션 사진",
|
||||
"move": "이동",
|
||||
"move_down": "아래로 이동",
|
||||
"move_off_locked_folder": "잠금 폴더에서 해제",
|
||||
@@ -1634,6 +1700,7 @@
|
||||
"no_results": "결과 없음",
|
||||
"no_results_description": "동의어 또는 더 일반적인 단어를 사용해 보세요.",
|
||||
"no_shared_albums_message": "앨범을 만들어 주변 사람들과 사진 및 동영상을 공유하세요.",
|
||||
"no_steps": "아직 추가된 단계가 없습니다",
|
||||
"no_uploads_in_progress": "진행 중인 업로드 없음",
|
||||
"none": "None",
|
||||
"not_allowed": "허용되지 않음",
|
||||
@@ -1642,6 +1709,7 @@
|
||||
"not_selected": "선택되지 않음",
|
||||
"notes": "참고",
|
||||
"nothing_here_yet": "아직 아무것도 없음",
|
||||
"notification_backup_reliability": "백그라운드 백업의 안정성을 높이려면 알림을 활성화하세요",
|
||||
"notification_permission_dialog_content": "알림을 활성화하려면 설정에서 알림 권한을 허용하세요.",
|
||||
"notification_permission_list_tile_content": "알림을 활성화하려면 권한을 부여하세요.",
|
||||
"notification_permission_list_tile_enable_button": "알림 활성화",
|
||||
@@ -1772,6 +1840,7 @@
|
||||
"play_transcoded_video": "트랜스코딩 동영상 재생",
|
||||
"please_auth_to_access": "계속 진행하려면 인증하세요.",
|
||||
"plugin_method_filter_type": "필터",
|
||||
"plugin_method_filter_type_description": "이 메서드는 이벤트를 필터링하며, 특정 조건에서 다음 단계가 실행되지 않도록 할 수 있습니다",
|
||||
"port": "포트",
|
||||
"preferences_settings_subtitle": "앱 개인 설정을 관리합니다.",
|
||||
"preferences_settings_title": "개인 설정",
|
||||
@@ -1793,6 +1862,7 @@
|
||||
"profile_drawer_readonly_mode": "읽기 전용 모드 활성화. 사용자 아이콘을 길게 눌러 해제할 수 있습니다.",
|
||||
"profile_image_of_user": "{user}님의 프로필 이미지",
|
||||
"profile_picture_set": "프로필 사진이 설정되었습니다.",
|
||||
"projection_type": "표시 방식",
|
||||
"public_album": "공개 앨범",
|
||||
"public_share": "모든 사용자와 공유",
|
||||
"purchase_account_info": "서포터",
|
||||
@@ -1953,6 +2023,8 @@
|
||||
"search_by_description_example": "동해안에서 맞이한 새해 일출",
|
||||
"search_by_filename": "파일명 또는 확장자로 검색",
|
||||
"search_by_filename_example": "예: IMG_1234.JPG 또는 PNG",
|
||||
"search_by_full_path": "전체 경로 또는 폴더로 검색",
|
||||
"search_by_full_path_example": "예: /John/Projects/3D_Printing/2026-07-01 Projects, 3D, Printing, 2026 등 경로에 포함된 단어로 검색할 수 있습니다.",
|
||||
"search_by_ocr": "OCR로 검색",
|
||||
"search_by_ocr_example": "라떼",
|
||||
"search_camera_lens_model": "렌즈 모델 검색...",
|
||||
@@ -2029,6 +2101,7 @@
|
||||
"select_person": "사람 선택",
|
||||
"select_person_to_tag": "태그할 인물을 선택하세요.",
|
||||
"select_photos": "사진 선택",
|
||||
"select_quality": "화질 선택",
|
||||
"select_trash_all": "모두 삭제",
|
||||
"select_user_for_sharing_page_err_album": "앨범을 생성하지 못했습니다.",
|
||||
"selected": "선택됨",
|
||||
@@ -2092,6 +2165,8 @@
|
||||
"share_assets_selected": "{count}개 선택됨",
|
||||
"share_dialog_preparing": "준비 중...",
|
||||
"share_link": "공유 링크",
|
||||
"share_original": "원본 사용 (고해상도)",
|
||||
"share_preview": "썸네일 사용 (저해상도)",
|
||||
"shared": "공유됨",
|
||||
"shared_album_activities_input_disable": "댓글이 비활성화되었습니다",
|
||||
"shared_album_activity_remove_content": "이 활동을 삭제하시겠습니까?",
|
||||
@@ -2160,7 +2235,9 @@
|
||||
"show_in_timeline": "타임라인에 표시",
|
||||
"show_in_timeline_setting_description": "타임라인에 이 사용자의 사진과 동영상을 표시",
|
||||
"show_keyboard_shortcuts": "키보드 단축키 표시",
|
||||
"show_less": "접기",
|
||||
"show_metadata": "메타데이터 표시",
|
||||
"show_more_fields": "필드 {count}개 더 보기",
|
||||
"show_or_hide_info": "정보 표시 또는 숨기기",
|
||||
"show_password": "비밀번호 표시",
|
||||
"show_person_options": "인물 옵션 표시",
|
||||
@@ -2168,6 +2245,7 @@
|
||||
"show_schema": "스키마 표시",
|
||||
"show_search_options": "검색 옵션 표시",
|
||||
"show_shared_links": "공유 링크 표시",
|
||||
"show_slideshow_metadata_overlay": "이미지 정보 표시",
|
||||
"show_slideshow_transition": "슬라이드 전환 표시",
|
||||
"show_supporter_badge": "서포터 배지",
|
||||
"show_supporter_badge_description": "서포터 배지 표시",
|
||||
@@ -2183,9 +2261,14 @@
|
||||
"skip_to_folders": "폴더로 건너뛰기",
|
||||
"skip_to_tags": "태그로 건너뛰기",
|
||||
"slideshow": "슬라이드 쇼",
|
||||
"slideshow_metadata_overlay_mode": "표시할 정보",
|
||||
"slideshow_metadata_overlay_mode_description_only": "설명만 보기",
|
||||
"slideshow_metadata_overlay_mode_full": "전체 표시",
|
||||
"slideshow_repeat": "슬라이드 쇼 반복",
|
||||
"slideshow_repeat_description": "슬라이드 쇼가 끝나면 처음으로 되돌아갑니다",
|
||||
"slideshow_settings": "슬라이드 쇼 설정",
|
||||
"smart_album": "스마트 앨범",
|
||||
"some_assets_already_have_a_location_warning": "선택한 항목 중 일부에는 이미 위치 정보가 있습니다",
|
||||
"sort_albums_by": "다음으로 앨범 정렬...",
|
||||
"sort_created": "생성된 날짜",
|
||||
"sort_items": "항목 수",
|
||||
@@ -2208,6 +2291,11 @@
|
||||
"start_date_before_end_date": "시작일은 종료일보다 이전이어야 합니다",
|
||||
"state": "지역",
|
||||
"status": "상태",
|
||||
"step_delete": "단계 삭제",
|
||||
"step_delete_confirm": "이 단계를 삭제하시겠습니까?",
|
||||
"step_details": "단계 상세 정보",
|
||||
"steps": "단계",
|
||||
"steps_count": "단계 {count}개",
|
||||
"stop_casting": "캐스팅 중단",
|
||||
"stop_motion_photo": "모션 포토 정지",
|
||||
"stop_photo_sharing": "공유를 중단하시겠습니까?",
|
||||
@@ -2301,7 +2389,9 @@
|
||||
"trash_page_title": "휴지통 ({count})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "휴지통으로 이동된 항목은 {days, plural, one {#일} other {#일}} 후 영구적으로 삭제됩니다.",
|
||||
"trigger": "트리거",
|
||||
"trigger_asset_uploaded": "자산 업로드됨",
|
||||
"trigger_asset_metadata_extraction": "미디어 메타데이터 추출",
|
||||
"trigger_asset_metadata_extraction_description": "사진 또는 동영상의 EXIF 메타데이터가 추출될 때 발생합니다",
|
||||
"trigger_asset_uploaded": "미디어 업로드 완료",
|
||||
"trigger_asset_uploaded_description": "새로운 에셋이 업로드될 때 트리거됩니다",
|
||||
"trigger_description": "워크플로우를 시작하는 이벤트",
|
||||
"trigger_person_recognized": "신원 확인됨",
|
||||
@@ -2347,6 +2437,7 @@
|
||||
"updated_password": "비밀번호가 변경되었습니다.",
|
||||
"upload": "업로드",
|
||||
"upload_concurrency": "업로드 동시성",
|
||||
"upload_day_count": "{date}: {count}건 업로드",
|
||||
"upload_details": "업로드 상세",
|
||||
"upload_dialog_info": "선택한 항목을 서버에 백업하시겠습니까?",
|
||||
"upload_dialog_title": "항목 업로드",
|
||||
@@ -2362,6 +2453,8 @@
|
||||
"upload_to_immich": "Immich에 업로드 ({count})",
|
||||
"uploading": "업로드 중",
|
||||
"uploading_media": "미디어 업로드 중...",
|
||||
"uploads": "업로드",
|
||||
"uploads_count": "{count}건 업로드",
|
||||
"url": "URL",
|
||||
"usage": "사용량",
|
||||
"use_biometric": "생체 인증 사용",
|
||||
@@ -2369,6 +2462,7 @@
|
||||
"use_browser_locale_description": "브라우저 로케일 기반 날짜, 시간, 숫자 형식",
|
||||
"use_current_connection": "현재 네트워크 사용",
|
||||
"use_custom_date_range": "대신 맞춤 기간 사용",
|
||||
"use_template": "템플릿 사용",
|
||||
"user": "사용자",
|
||||
"user_has_been_deleted": "이 사용자는 삭제되었습니다.",
|
||||
"user_id": "사용자 ID",
|
||||
@@ -2398,6 +2492,7 @@
|
||||
"video": "동영상",
|
||||
"video_hover_setting": "섬네일 영상 미리보기",
|
||||
"video_hover_setting_description": "섬네일 위에 마우스를 올리면 미리보기를 재생합니다. 비활성화해도 재생 아이콘에 마우스를 올려 미리볼 수 있습니다.",
|
||||
"video_quality": "동영상 화질",
|
||||
"videos": "동영상",
|
||||
"videos_count": "동영상 {count, plural, one {#개} other {#개}}",
|
||||
"videos_only": "동영상만",
|
||||
@@ -2430,8 +2525,10 @@
|
||||
"week": "주",
|
||||
"welcome": "환영합니다",
|
||||
"welcome_to_immich": "환영합니다",
|
||||
"when": "실행 조건",
|
||||
"width": "너비",
|
||||
"wifi_name": "W-Fi 이름",
|
||||
"workflow": "작업 프로세스",
|
||||
"workflow_delete_prompt": "이 워크플로를 정말로 삭제하시겠습니까?",
|
||||
"workflow_deleted": "워크플로가 삭제되었습니다",
|
||||
"workflow_description": "워크플로 설명",
|
||||
@@ -2441,6 +2538,7 @@
|
||||
"workflow_name": "워크플로 이름",
|
||||
"workflow_navigation_prompt": "변경 사항을 저장하지 않고 이동하시겠습니까?",
|
||||
"workflow_summary": "워크플로우 요약",
|
||||
"workflow_templates": "자동화 템플릿",
|
||||
"workflow_update_success": "워크플로가 성공적으로 업데이트되었습니다",
|
||||
"workflow_updated": "워크플로가 업데이트되었습니다",
|
||||
"workflows": "워크플로",
|
||||
|
||||
+41
-1
@@ -79,6 +79,7 @@
|
||||
"cron_expression_description": "Nustatyti skenavimo intervalą naudojant cron formatą. Norėdami gauti daugiau informacijos žiūrėkite <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Išankstiniai Cron nustatymai",
|
||||
"disable_login": "Išjungti prisijungimą",
|
||||
"download_csv": "Parsisiųsti CSV",
|
||||
"duplicate_detection_job_description": "Vykdyti mašininį mokymąsi panašių vaizdų aptikimui. Priklauso nuo išmaniosios paieškos",
|
||||
"exclusion_pattern_description": "Išimčių šablonai leidžia nepaisyti failų ir aplankų skenuojant jūsų biblioteką. Tai yra naudinga, jei turite aplankų su failais, kurių nenorite importuoti, pavyzdžiui, RAW failai.",
|
||||
"export_config_as_json_description": "Atsisiųskite dabartinę sistemos konfigūraciją kaip JSON failą",
|
||||
@@ -191,6 +192,17 @@
|
||||
"maintenance_delete_backup": "Ištrinti atsarginę kopiją",
|
||||
"maintenance_delete_backup_description": "Šis failas bus negrįžtamai ištrintas.",
|
||||
"maintenance_delete_error": "Nepavyko ištrinti atsarginės kopijos.",
|
||||
"maintenance_integrity_check_all": "Tikrinti Visus",
|
||||
"maintenance_integrity_checksum_mismatch": "Checksum neatitikimas",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Tikrinti checksum neatitikimų",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Atnaujinti checksum neatitikimo ataskaitas",
|
||||
"maintenance_integrity_missing_file": "Trūkstami failai",
|
||||
"maintenance_integrity_missing_file_job": "Tikrinti, ar nėra trūkstamų failų",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Atnaujinti trūkstamų failų ataskaitas",
|
||||
"maintenance_integrity_report": "Vientisumo Ataskaita",
|
||||
"maintenance_integrity_untracked_file": "Nesekami Failai",
|
||||
"maintenance_integrity_untracked_file_job": "Patikrinti, ar nėra nesekamų failų",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Atnaujinti nesekamų failų ataskaitas",
|
||||
"maintenance_restore_backup": "Atstatyti atsarginę kopiją",
|
||||
"maintenance_restore_backup_description": "Immich bus ištrintas ir atkurtas iš pasirinktos atsarginės kopijos. Prieš tęsiant bus sukurta atsarginė kopija.",
|
||||
"maintenance_restore_backup_different_version": "Ši atsarginė kopija buvo sukurta su skirtinga Immich versija!",
|
||||
@@ -306,6 +318,7 @@
|
||||
"registration": "Administratoriaus registracija",
|
||||
"registration_description": "Kadangi esate pirmasis šio sistemos naudotojas, jums bus priskirta administratoriaus rolė, ir būsite atsakingas už administracines užduotis ir papildomų naudotojų kūrimą.",
|
||||
"release_channel_release_candidate": "Išleidimo kandidatas",
|
||||
"release_channel_stable": "Stabili",
|
||||
"remove_failed_jobs": "Pašalinti nepavykusius darbus",
|
||||
"require_password_change_on_login": "Reikalauti, kad naudotojas pasikeistų slaptažodį po pirmojo prisijungimo",
|
||||
"reset_settings_to_default": "Atstatyti nustatymus į numatytuosius",
|
||||
@@ -400,6 +413,10 @@
|
||||
"transcoding_preferred_hardware_device_description": "Galioja tik VAAPI ir QSV. Nustato dri mazgą aparatiniam perkodavimui.",
|
||||
"transcoding_preset_preset": "Iš anksto nustatytas (-preset)",
|
||||
"transcoding_preset_preset_description": "Kompresijos greitis. Siekiant tam tikro bitrate lėtesnis apdorojimas lems mažesnius failų dydžius ir padidins kokybę. VP9 ignoruos greičius virš \"gretesnis\" lygio.",
|
||||
"transcoding_realtime": "Realaus laiko transkodavimas [EKSPERIMENTINIS]",
|
||||
"transcoding_realtime_description": "Leidžia transkoduoti realiuoju laiku, kai vaizdo įrašas transliuojamas. Įgalina kokybės perjungimą, tačiau, priklausomai nuo serverio galimybių, atkūrimas gali strigti ar būti uždelstas.",
|
||||
"transcoding_realtime_enabled": "Įgalinti transkodavimą realiuoju laiku",
|
||||
"transcoding_realtime_enabled_description": "Jei išjungta, serveris atsisakys pradėti naujas transkodavimo sesijas realiuoju laiku.",
|
||||
"transcoding_reference_frames": "Nuorodiniai kadrai",
|
||||
"transcoding_reference_frames_description": "Kadrų, į kuriuos reikia remtis suspaudžiant duotą kadrą, skaičius. Aukštesnė reikšmė pagerina suspaudimo efektyvumą, bet sulėtina užkodavimą. 0 - nustato reikšmę automatiškai.",
|
||||
"transcoding_required_description": "Tik nepalaikomo formato vaizdo įrašai",
|
||||
@@ -443,6 +460,8 @@
|
||||
"user_settings_description": "Valdyti naudotojo nustatymus",
|
||||
"user_successfully_removed": "Naudotojas {email} sėkmingai pašalintas.",
|
||||
"users_page_description": "Administratorių vartotojų puslapis",
|
||||
"version_check_channel": "Išleidimo kanalas",
|
||||
"version_check_channel_description": "Pasirinkite leidimo kanalą, kurio versijų pranešimus norite gauti",
|
||||
"version_check_enabled_description": "Įgalinti versijų tikrinimą",
|
||||
"version_check_implications": "Versijų tikrinimas reikalauja periodiškos komunikacijos su {server}",
|
||||
"version_check_settings": "Versijos tikrinimas",
|
||||
@@ -563,6 +582,7 @@
|
||||
"asset_added_to_album": "Pridėta į albumą",
|
||||
"asset_adding_to_album": "Pridedama į albumą…",
|
||||
"asset_created": "Elementas sukurtas",
|
||||
"asset_day_count": "{date}: {count, plural, one {# elementas} few {# elementai} other {# elementų}}",
|
||||
"asset_description_updated": "Elemento aprašymas buvo atnaujintas",
|
||||
"asset_filename_is_offline": "Elementas {filename} nepasiekiamas",
|
||||
"asset_has_unassigned_faces": "Elementas turi nepriskirtų veidų",
|
||||
@@ -692,6 +712,7 @@
|
||||
"backup_settings_subtitle": "Tvarkyti įkėlimo nustatymus",
|
||||
"backup_upload_details_page_more_details": "Bakstelėkite detalesnei informacijai",
|
||||
"backward": "Atgalinis",
|
||||
"battery_optimization_backup_reliability": "Išjungus akumuliatoriaus optimizavimą, galima pagerinti foninio atsarginio kopijavimo patikimumą",
|
||||
"biometric_auth_enabled": "Biometrinis autentifikavimas įgalintas",
|
||||
"biometric_locked_out": "Jūs esate užblokuotas biometrinio autentifikavimo funkcijai",
|
||||
"biometric_no_options": "Nėra galimų biometrinių nustatymų",
|
||||
@@ -906,6 +927,8 @@
|
||||
"deduplicate_all": "Šalinti visus dublikatus",
|
||||
"default_locale": "Numatytoji Vietovė",
|
||||
"default_locale_description": "Formatuoti datas ir skaičius pagal savo naršyklės lokalę",
|
||||
"default_quality_subtitle": "Kokybė, naudojama paliečiant bendrinimą. Kiekvieną kartą pasirinksite paspaudę ir ilgai spausdami bendrinimo mygtuką.",
|
||||
"default_share_quality": "Numatytoji bendrinimo kokybė",
|
||||
"delete": "Ištrinti",
|
||||
"delete_action_confirmation_message": "Ar tikrai norite ištrinti šį elementą? Šis veiksmas perkels elementą į serverio šiukšliadėžę ir paklaus ar norite ištrinti vietiniame įrenginyje",
|
||||
"delete_action_prompt": "{count} ištrinta",
|
||||
@@ -1215,6 +1238,7 @@
|
||||
"failed": "Įvyko klaida",
|
||||
"failed_count": "Nepavykę: {count}",
|
||||
"failed_to_authenticate": "Nepavyko autentifikuoti",
|
||||
"failed_to_delete_file": "Nepavyko ištrinti failo",
|
||||
"failed_to_load_assets": "Nepavyko įkelti elementų",
|
||||
"failed_to_load_folder": "Nepavyko įkelti katalogą",
|
||||
"favorite": "Mėgstamiausias",
|
||||
@@ -1345,6 +1369,7 @@
|
||||
"individual_share": "Pavienis pasidalinimas",
|
||||
"individual_shares": "Pavieniai pasidalinimai",
|
||||
"info": "Informacija",
|
||||
"integrity_checks": "Vientisumo Patikrinimai",
|
||||
"interval": {
|
||||
"day_at_onepm": "Kiekvieną dieną 13:00",
|
||||
"hours": "Kas{hours, plural, one {valandą} few {#valandas} other {{hours, number} valandų}}",
|
||||
@@ -1392,6 +1417,7 @@
|
||||
"leave": "Išeiti",
|
||||
"leave_album": "Palikti albumą",
|
||||
"lens_model": "Lęšių modelis",
|
||||
"less": "Mažiau",
|
||||
"let_others_respond": "Leisti kitiems reaguoti",
|
||||
"level": "Lygis",
|
||||
"library": "Biblioteka",
|
||||
@@ -1416,6 +1442,7 @@
|
||||
"linked_oauth_account": "Susieta OAuth paskyra",
|
||||
"list": "Sąrašas",
|
||||
"live": "Tiesiogiai",
|
||||
"load_more": "Įkelti Daugiau",
|
||||
"loading": "Kraunama",
|
||||
"loading_search_results_failed": "Nepavyko užkrauti paieškos rezultatų",
|
||||
"local": "Vietinis",
|
||||
@@ -1585,6 +1612,8 @@
|
||||
"merge_people_prompt": "Ar norite sujungti šiuos asmenis? Šis veiksmas yra negrįžtamas.",
|
||||
"merge_people_successfully": "Asmenys sėkmingai sujungti",
|
||||
"merged_people_count": "{count, plural, one {Sujungtas # asmuo} few {Sujungti # asmenys} other {Sujungta # asmenų}}",
|
||||
"minFaces": "Minimalus veidų skaičius",
|
||||
"minFaces_description": "Minimalus atpažintų veidų skaičius, kad būtų rodomas asmuo",
|
||||
"minimize": "Sumažinti",
|
||||
"minute": "Minutė",
|
||||
"minutes": "Minutės",
|
||||
@@ -1680,6 +1709,7 @@
|
||||
"not_selected": "Nepasirinkta",
|
||||
"notes": "Pastabos",
|
||||
"nothing_here_yet": "Kol kas tuščia",
|
||||
"notification_backup_reliability": "Įjunkite pranešimus, kad pagerintumėte foninių atsarginių kopijų patikimumą",
|
||||
"notification_permission_dialog_content": "Pranešimų įgalinimui eikite į Nustatymus ir pasirinkite Leisti.",
|
||||
"notification_permission_list_tile_content": "Suteikti leidimą pranešimų įgalinimui.",
|
||||
"notification_permission_list_tile_enable_button": "Įjungti pranešimus",
|
||||
@@ -2071,6 +2101,7 @@
|
||||
"select_person": "Pasirinkti asmenį",
|
||||
"select_person_to_tag": "Pasirinkti asmenį žymai",
|
||||
"select_photos": "Pasirinkti nuotraukas",
|
||||
"select_quality": "Pasirinkite kokybę",
|
||||
"select_trash_all": "Visus pažymėti \"Išmesti\"",
|
||||
"select_user_for_sharing_page_err_album": "Nepavyko sukurti albumo",
|
||||
"selected": "Pasirinkta",
|
||||
@@ -2134,6 +2165,8 @@
|
||||
"share_assets_selected": "{count} pažymėta",
|
||||
"share_dialog_preparing": "Ruošiama...",
|
||||
"share_link": "Bendrinti nuorodą",
|
||||
"share_original": "Naudoti originalą (didelį)",
|
||||
"share_preview": "Naudoti miniatiūrą (mažą)",
|
||||
"shared": "Bendrinami",
|
||||
"shared_album_activities_input_disable": "Komentarai išjungti",
|
||||
"shared_album_activity_remove_content": "Ar norite ištrinti šią veiklą?",
|
||||
@@ -2235,6 +2268,7 @@
|
||||
"slideshow_repeat_description": "Pradėti iš pradžių, kai skaidrės baigiasi",
|
||||
"slideshow_settings": "Skaidrių peržiūros nustatymai",
|
||||
"smart_album": "Išmanus albumas",
|
||||
"some_assets_already_have_a_location_warning": "Kai kurie pasirinkti elementai jau turi vietovę",
|
||||
"sort_albums_by": "Rikiuoti albumus pagal...",
|
||||
"sort_created": "Sukūrimo data",
|
||||
"sort_items": "Elementų skaičių",
|
||||
@@ -2355,11 +2389,13 @@
|
||||
"trash_page_title": "Šiukšlių ({count})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "Į šiukšliadėžę perkelti elementai bus visam laikui ištrinti po {days, plural, one {# dienos} other {# dienų}}.",
|
||||
"trigger": "Trigeris",
|
||||
"trigger_asset_metadata_extraction": "Elemento Metaduomenų Ištraukimas",
|
||||
"trigger_asset_metadata_extraction_description": "Suaktyvinama, kai išgaunami elemento EXIF metaduomenys",
|
||||
"trigger_asset_uploaded": "Elemento Išsiuntimas",
|
||||
"trigger_asset_uploaded_description": "Pradės, kai naujas elementas bus išsiųstas",
|
||||
"trigger_description": "Įvykis, kuris pradeda darbo eigą",
|
||||
"trigger_person_recognized": "Asmuo Atpažintas",
|
||||
"trigger_person_recognized_description": "Pradės, kai asmuo yra aptiktas",
|
||||
"trigger_person_recognized_description": "Suaktyvinama, kai asmuo yra atpažintas",
|
||||
"trigger_type": "Trigerio tipas",
|
||||
"troubleshoot": "Šalinti triktis",
|
||||
"type": "Tipas",
|
||||
@@ -2401,6 +2437,7 @@
|
||||
"updated_password": "Slaptažodis atnaujintas",
|
||||
"upload": "Įkelti",
|
||||
"upload_concurrency": "Įkėlimo lygiagretumas",
|
||||
"upload_day_count": "{date}: {count, plural, one {# išsiuntimas} few {# išsiuntimai} other {# išsiuntimų}}",
|
||||
"upload_details": "Įkėlimo Detalės",
|
||||
"upload_dialog_info": "Ar norite sukurti pasirinkto(-ų) turinio(-ų) atsarginę kopiją serveryje?",
|
||||
"upload_dialog_title": "Įkelti turinį",
|
||||
@@ -2416,6 +2453,8 @@
|
||||
"upload_to_immich": "Įkelti į Immich ({count})",
|
||||
"uploading": "Įkeliama",
|
||||
"uploading_media": "Įkeliama medija",
|
||||
"uploads": "Išsiuntimai",
|
||||
"uploads_count": "{count, plural, one {# išsiuntimas} few {# išsiuntimai} other {# išsiuntimų}}",
|
||||
"url": "URL",
|
||||
"usage": "Naudojimas",
|
||||
"use_biometric": "Naudoti biometriją",
|
||||
@@ -2453,6 +2492,7 @@
|
||||
"video": "Vaizdo įrašas",
|
||||
"video_hover_setting": "Paleisti vaizdo įrašo miniatiūrą užvedus pele",
|
||||
"video_hover_setting_description": "Atkurti vaizdo įrašo miniatiūrą, kai pelė užvedama ant elemento. Net ir išjungus, atkūrimą galima pradėti užvedus pelės žymeklį ant atkūrimo piktogramos.",
|
||||
"video_quality": "Vaizdo įrašo kokybė",
|
||||
"videos": "Video",
|
||||
"videos_count": "{count, plural, one {# vaizdo įrašas} few {# vaizdo įrašai} other {# vaizdo įrašų}}",
|
||||
"videos_only": "Tik Video",
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
"add_partner": "Pievienot partneri",
|
||||
"add_path": "Pievienot ceļu",
|
||||
"add_photos": "Pievienot fotoattēlus",
|
||||
"add_step": "Pievienot soli",
|
||||
"add_tag": "Pievienot atzīmi",
|
||||
"add_to": "Pievienot…",
|
||||
"add_to_album": "Pievienot albumam",
|
||||
@@ -78,6 +79,7 @@
|
||||
"cron_expression_description": "Iestatiet skenēšanas intervālu, izmantojot cron formātu. Papildu informācijai skatiet, piemēram, <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Cron izteiksmju sagataves",
|
||||
"disable_login": "Atspējot pieteikšanos",
|
||||
"download_csv": "Lejupielādēt CSV",
|
||||
"duplicate_detection_job_description": "Analizēt failus ar mašīnmācīšanos, lai noteiktu līdzīgus attēlus. Šī funkcija izmanto viedo meklēšanu",
|
||||
"exclusion_pattern_description": "Izslēgšanas šabloni ļauj ignorēt failus un mapes, skenējot bibliotēku. Tas ir noderīgi, ja jums ir mapes, kas satur failus, kurus nevēlaties importēt, piemēram, RAW failus.",
|
||||
"export_config_as_json_description": "Lejupielādēt pašreizējo sistēmas konfigurāciju kā JSON failu",
|
||||
@@ -190,6 +192,7 @@
|
||||
"maintenance_delete_backup": "Dzēst rezerves kopiju",
|
||||
"maintenance_delete_backup_description": "Šis fails tiks neatgriezeniski dzēsts.",
|
||||
"maintenance_delete_error": "Neizdevās dzēst rezerves kopiju.",
|
||||
"maintenance_integrity_report": "Integritātes pārbaude",
|
||||
"maintenance_restore_backup": "Atjaunot no rezerves kopijas",
|
||||
"maintenance_restore_backup_description": "Immich dati tiks dzēsti un atjaunoti no izvēlētā dublējuma. Tiks izveidots dublējums pirms turpinājuma.",
|
||||
"maintenance_restore_backup_different_version": "Šī rezerves kopija tika izveidota ar citu Immich versiju!",
|
||||
|
||||
@@ -479,6 +479,17 @@
|
||||
"downloading": "Memuat turun",
|
||||
"search_by_description": "Carian secara huraian",
|
||||
"search_by_description_example": "Hari mendaki di Sapa",
|
||||
"some_assets_already_have_a_location_warning": "Beberapa aset yang dipilih telah memiliki lokasi",
|
||||
"sort_albums_by": "Susun album mengikut...",
|
||||
"sort_created": "Tarikh dicipta",
|
||||
"sort_items": "Bilanganitem",
|
||||
"sort_modified": "Tarikh diubah",
|
||||
"sort_newest": "Foto terbaru",
|
||||
"sort_oldest": "Foto Tertua",
|
||||
"sort_people_by_similarity": "Susun orang mengikut kesamaan",
|
||||
"sort_recent": "Foto paling terbaru",
|
||||
"sort_title": "Tajuk",
|
||||
"source": "Sumber",
|
||||
"text_recognition": "Pengecaman teks",
|
||||
"theme": "Tema",
|
||||
"theme_selection": "Pemilihan tema",
|
||||
|
||||
+24
-2
@@ -192,6 +192,17 @@
|
||||
"maintenance_delete_backup": "Slett sikkerhetskopi",
|
||||
"maintenance_delete_backup_description": "Denne filen vil bli permanent slettet.",
|
||||
"maintenance_delete_error": "Feilet ved sletting av sikkerhetskopi.",
|
||||
"maintenance_integrity_check_all": "Velg alle",
|
||||
"maintenance_integrity_checksum_mismatch": "Sjekksum er feil",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Sjekk for feilede sjekksummer",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Oppdater feilede sjekksum rapporter",
|
||||
"maintenance_integrity_missing_file": "Manglende filer",
|
||||
"maintenance_integrity_missing_file_job": "Sjekk etter manglende filer",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Oppdater rapporten for manglende filer",
|
||||
"maintenance_integrity_report": "Integritetsrapport",
|
||||
"maintenance_integrity_untracked_file": "Usporede filer",
|
||||
"maintenance_integrity_untracked_file_job": "Sjekk etter usporede filer",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Oppdater rapporten for usporede filer",
|
||||
"maintenance_restore_backup": "Gjenopprett Sikkerhetskopi",
|
||||
"maintenance_restore_backup_description": "Immich vil bli sletter og gjenopprettet fra en valgt sikkerhetskopi. En sikkerhetskopi vil utføres før handlingen fortsetter.",
|
||||
"maintenance_restore_backup_different_version": "Denne sikkerhetskopien ble laget med en annen versjon av Immich!",
|
||||
@@ -434,7 +445,7 @@
|
||||
"unlink_all_oauth_accounts_description": "Husk å koble fra alle OAuth-kontoer før du migrerer til ny leverandør.",
|
||||
"unlink_all_oauth_accounts_prompt": "Vil du virkelig koble fra alle OAuth-kontoer? Dette vil nullstille OAuth ID for hver bruker, og kan ikke angres.",
|
||||
"user_cleanup_job": "Bruker opprydning",
|
||||
"user_delete_delay": "<b>{user}</b>s konto og elementer vil legges i kø for permanent sletting om {delay, plural, one {# dag} other {# dager}}.",
|
||||
"user_delete_delay": "<b>{user}</b>'s konto og elementer vil legges i kø for permanent sletting om {delay, plural, one {# dag} other {# dager}}.",
|
||||
"user_delete_delay_settings": "Sletteforsinkelse",
|
||||
"user_delete_delay_settings_description": "Antall dager etter fjerning før en brukerkonto og dens filer permanent slettes. Brukerfjerningsjobben kjører ved midnatt for å sjekke etter brukere som er klare for sletting. Endringer i denne innstillingen vil bli evaluert ved neste utførelse.",
|
||||
"user_delete_immediately": "<b>{user}</b>s konto og elementer vil bli lagt i kø for permanent sletting <b>umiddelbart</b>.",
|
||||
@@ -443,7 +454,7 @@
|
||||
"user_management": "Brukeradministrasjon",
|
||||
"user_password_has_been_reset": "Passordet til brukeren har blitt tilbakestilt:",
|
||||
"user_password_reset_description": "Vennligst oppgi det midlertidige passordet til brukeren og informer dem om at de må endre passordet ved neste pålogging.",
|
||||
"user_restore_description": "<b>{user}</b>s konto vil bli gjenopprettet.",
|
||||
"user_restore_description": "<b>{user}</b>'s konto vil bli gjenopprettet.",
|
||||
"user_restore_scheduled_removal": "Gjenopprett bruker - planlagt sletting den {date, date, long}",
|
||||
"user_settings": "Brukerinnstillinger",
|
||||
"user_settings_description": "Administrer brukerinnstillinger",
|
||||
@@ -916,6 +927,8 @@
|
||||
"deduplicate_all": "De-dupliser alle",
|
||||
"default_locale": "Standardspråk",
|
||||
"default_locale_description": "Formater datoer og tall basert på din nettlesers språkinnstillinger",
|
||||
"default_quality_subtitle": "Kvalitet brukt når du trykker på del. Trykk lenge på deleknappen for å velge hver gang.",
|
||||
"default_share_quality": "Standard delingskvalitet",
|
||||
"delete": "Slett",
|
||||
"delete_action_confirmation_message": "Vil du virkelig slette dette elementet? Dette vil flytte elementet til papirkurven og vil gi deg beskjed om du vil slette det lokalt",
|
||||
"delete_action_prompt": "{count} slettet",
|
||||
@@ -1225,6 +1238,7 @@
|
||||
"failed": "Mislyktes",
|
||||
"failed_count": "Feilede: {count}",
|
||||
"failed_to_authenticate": "Kunne ikke autentisere",
|
||||
"failed_to_delete_file": "Feilet sletting av fil",
|
||||
"failed_to_load_assets": "Mislyktes med å laste fil",
|
||||
"failed_to_load_folder": "Kunne ikke laste inn mappe",
|
||||
"favorite": "Favoritt",
|
||||
@@ -1355,6 +1369,7 @@
|
||||
"individual_share": "Individuell deling",
|
||||
"individual_shares": "Individuelle delinger",
|
||||
"info": "Info",
|
||||
"integrity_checks": "Integritetssjekker",
|
||||
"interval": {
|
||||
"day_at_onepm": "Hver dag klokken 13:00",
|
||||
"hours": "Hver {hours, plural, one {time} other {{hours, number} timer}}",
|
||||
@@ -1427,6 +1442,7 @@
|
||||
"linked_oauth_account": "Lenket til OAuth-konto",
|
||||
"list": "Liste",
|
||||
"live": "Direkte",
|
||||
"load_more": "Last mer",
|
||||
"loading": "Laster",
|
||||
"loading_search_results_failed": "Klarte ikke å laste inn søkeresultater",
|
||||
"local": "Lokal",
|
||||
@@ -2085,6 +2101,7 @@
|
||||
"select_person": "Valgt person",
|
||||
"select_person_to_tag": "Velg en person å tagge",
|
||||
"select_photos": "Velg bilder",
|
||||
"select_quality": "Velg kvalitet",
|
||||
"select_trash_all": "Velg å flytte alt til papirkurven",
|
||||
"select_user_for_sharing_page_err_album": "Mislyktes ved oppretting av album",
|
||||
"selected": "Valgt",
|
||||
@@ -2148,6 +2165,8 @@
|
||||
"share_assets_selected": "{count} valgt",
|
||||
"share_dialog_preparing": "Forbereder ...",
|
||||
"share_link": "Del link",
|
||||
"share_original": "Bruk original (stor)",
|
||||
"share_preview": "Bruk miniatyrbilde (lite)",
|
||||
"shared": "Delt",
|
||||
"shared_album_activities_input_disable": "Kommenterer er deaktivert",
|
||||
"shared_album_activity_remove_content": "Vil du slette denne aktiviteten?",
|
||||
@@ -2249,6 +2268,7 @@
|
||||
"slideshow_repeat_description": "Gå tilbake til begynnelsen når lysbildeserien er slutt",
|
||||
"slideshow_settings": "Lysbildefremvisning innstillinger",
|
||||
"smart_album": "Smartalbum",
|
||||
"some_assets_already_have_a_location_warning": "Noen av de valgte objektene har allerede en lokasjon",
|
||||
"sort_albums_by": "Sorter album etter...",
|
||||
"sort_created": "Dato opprettet",
|
||||
"sort_items": "Antall enheter",
|
||||
@@ -2369,6 +2389,8 @@
|
||||
"trash_page_title": "Søppelbøtte ({count})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "Elementer i papirkurven vil bli permanent slettet etter {days, plural, one {# dag} other {# dager}}.",
|
||||
"trigger": "Utløser",
|
||||
"trigger_asset_metadata_extraction": "Hent ut metadata fra objekter",
|
||||
"trigger_asset_metadata_extraction_description": "Trigges når EXIF metadata fra ett objekt blir uthentet",
|
||||
"trigger_asset_uploaded": "Last opp objekt",
|
||||
"trigger_asset_uploaded_description": "Utløser når ett nytt objekt er lastet opp",
|
||||
"trigger_description": "En hendelse som utløser arbeidsflyten",
|
||||
|
||||
+14
-9
@@ -63,8 +63,8 @@
|
||||
"backup_onboarding_footer": "Raadpleeg de <link>documentatie</link> voor meer informatie over het maken van back-ups van Immich.",
|
||||
"backup_onboarding_parts_title": "Een 3-2-1 back-up omvat:",
|
||||
"backup_onboarding_title": "Back-ups",
|
||||
"backup_settings": "Database dump instellingen",
|
||||
"backup_settings_description": "Beheer database dump instellingen.",
|
||||
"backup_settings": "Database back-up instellingen",
|
||||
"backup_settings_description": "Beheer database back-up instellingen.",
|
||||
"cleared_jobs": "Taken gewist voor: {job}",
|
||||
"config_set_by_file": "Instellingen worden momenteel beheerd door een configuratiebestand",
|
||||
"confirm_delete_library": "Weet je zeker dat je de bibliotheek {library} wilt verwijderen?",
|
||||
@@ -189,31 +189,36 @@
|
||||
"machine_learning_smart_search_enabled": "Slim zoeken inschakelen",
|
||||
"machine_learning_smart_search_enabled_description": "Indien uitgeschakeld, worden afbeeldingen niet verwerkt voor slim zoeken.",
|
||||
"machine_learning_url_description": "De URL van de machine learning server. Als er meer dan één URL is opgegeven, wordt elke server geprobeerd totdat er een succesvol reageert, op volgorde van eerste tot laatste. Servers die geen reactie geven zullen tijdelijk genegeerd worden tot zij terug online komen.",
|
||||
"maintenance_backup_management": "Back-upbeheer",
|
||||
"maintenance_delete_backup": "Backup verwijderen",
|
||||
"maintenance_delete_backup_description": "Dit bestand wordt onomkeerbaar verwijderd.",
|
||||
"maintenance_delete_error": "Backup verwijderen mislukt.",
|
||||
"maintenance_integrity_check": "Controleer",
|
||||
"maintenance_integrity_check_all": "Alles checken",
|
||||
"maintenance_integrity_checksum_mismatch": "Controlegetalafwijking",
|
||||
"maintenance_integrity_checksum_mismatch_description": "Bestanden waarvan het controlegetal afwijkt van het getal dat Immich in de database heeft opgeslagen.",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Controleer op afwijkingen in controlegetallen",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Rapport over controlegetalafwijkingen vernieuwen",
|
||||
"maintenance_integrity_missing_file": "Ontbrekende bestanden",
|
||||
"maintenance_integrity_missing_file_description": "Bestanden die in de database zijn opgeslagen, maar in het bestandssysteem niet bestaan.",
|
||||
"maintenance_integrity_missing_file_job": "Controleer op ontbrekende bestanden",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Rapport over ontbrekende bestanden vernieuwen",
|
||||
"maintenance_integrity_report": "Integriteitsstatus",
|
||||
"maintenance_integrity_untracked_file": "Zwerfbestanden",
|
||||
"maintenance_integrity_untracked_file_description": "Bestanden die in Immich' mappen voorkomen, maar niet in de database geregistreerd zijn.",
|
||||
"maintenance_integrity_untracked_file_job": "Controleer op zwerfbestanden",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Rapport over zwerfbestanden vernieuwen",
|
||||
"maintenance_restore_backup": "Backup herstellen",
|
||||
"maintenance_restore_backup_description": "Immich wordt gereset en hersteld vanaf de gekozen backup. Er wordt een backup gemaakt voor deze actie uitgevoerd wordt.",
|
||||
"maintenance_restore_backup_different_version": "Deze backup is gemaakt met een andere versie van Immich!",
|
||||
"maintenance_restore_backup_unknown_version": "Kan versie van backup niet bepalen.",
|
||||
"maintenance_restore_database_backup": "Database backup terugzetten",
|
||||
"maintenance_restore_database_backup_description": "Een eerdere versie van de database terugzetten door middel van een backup bestand",
|
||||
"maintenance_restore_database_backup": "Database back-up terugzetten",
|
||||
"maintenance_restore_database_backup_description": "Een eerdere versie van de database terugzetten door middel van een back-up bestand",
|
||||
"maintenance_settings": "Onderhoud",
|
||||
"maintenance_settings_description": "Zet Immich in onderhoudsmodus.",
|
||||
"maintenance_start": "Onderhoudsmodus activeren",
|
||||
"maintenance_start_error": "Onderhoudsmodus starten mislukt.",
|
||||
"maintenance_upload_backup": "Upload database backup bestand",
|
||||
"maintenance_upload_backup": "Upload database back-up",
|
||||
"maintenance_upload_backup_error": "Kon backup niet uploaden, is het een .sql/.sql.gz bestand?",
|
||||
"manage_concurrency": "Beheer gelijktijdigheid",
|
||||
"manage_concurrency_description": "Navigeer naar de takenpagina om de gelijktijdigheid van taken te beheren",
|
||||
@@ -1500,7 +1505,7 @@
|
||||
"loop_videos_description": "Inschakelen om video's automatisch te herhalen in de detailweergave.",
|
||||
"main_branch_warning": "Je gebruikt een ontwikkelingsversie. We raden je ten zeerste aan een releaseversie te gebruiken!",
|
||||
"main_menu": "Hoofdmenu",
|
||||
"maintenance_action_restore": "Database herstellen",
|
||||
"maintenance_action_restore": "Database wordt hersteld",
|
||||
"maintenance_description": "Immich is in de <link>onderhoudsmodus</link> gezet.",
|
||||
"maintenance_end": "Onderhoudsmodus beëindigen",
|
||||
"maintenance_end_error": "Onderhoudsmodus beëindigen mislukt.",
|
||||
@@ -1508,7 +1513,7 @@
|
||||
"maintenance_restore_from_backup": "Herstellen vanaf backup",
|
||||
"maintenance_restore_library": "Bibliotheek herstellen",
|
||||
"maintenance_restore_library_confirm": "Als dit er goed uit ziet ga dan verder om de backup terug te zetten!",
|
||||
"maintenance_restore_library_description": "Database herstellen",
|
||||
"maintenance_restore_library_description": "Database wordt hersteld",
|
||||
"maintenance_restore_library_folder_has_files": "{folder} heeft {count} map(pen)",
|
||||
"maintenance_restore_library_folder_no_files": "{folder} mist bestanden!",
|
||||
"maintenance_restore_library_folder_pass": "leesbaar en schrijfbaar",
|
||||
@@ -1518,8 +1523,8 @@
|
||||
"maintenance_restore_library_hint_regenerate_later": "Deze kun je later opnieuw genereren in de instellingen",
|
||||
"maintenance_restore_library_hint_storage_template_missing_files": "Gebruik je een opslagtemplate? Je mist misschien bestanden",
|
||||
"maintenance_restore_library_loading": "Integriteitscontrole en heuristieken laden…",
|
||||
"maintenance_task_backup": "Backup van bestaande database maken…",
|
||||
"maintenance_task_migrations": "Bezig met database migraties…",
|
||||
"maintenance_task_backup": "Back-up van bestaande database maken…",
|
||||
"maintenance_task_migrations": "Bezig met databasemigraties…",
|
||||
"maintenance_task_restore": "De gekozen backup terugzetten…",
|
||||
"maintenance_task_rollback": "Terugzetten backup mislukt, herstelpunt terugzetten…",
|
||||
"maintenance_title": "Tijdelijk niet beschikbaar",
|
||||
|
||||
+9
-4
@@ -189,18 +189,23 @@
|
||||
"machine_learning_smart_search_enabled": "Włącz inteligentne wyszukiwanie",
|
||||
"machine_learning_smart_search_enabled_description": "Jeżeli wyłączone, obrazy nie będą przygotowywane do inteligentnego wyszukiwania.",
|
||||
"machine_learning_url_description": "URL serwera uczenia maszynowego. Jeżeli podano więcej niż jeden URL, do każdego serwera po kolei będzie wysłane żądanie dopóki chociaż jeden nie odpowie, w kolejności od pierwszego do ostatniego. Serwery które nie odpowiedzą, zostaną tymczasowo ignorowane aż do momentu ich przejścia w stan online.",
|
||||
"maintenance_backup_management": "Zarządzanie kopiami zapasowymi",
|
||||
"maintenance_delete_backup": "Usuń kopię zapasową",
|
||||
"maintenance_delete_backup_description": "Ten plik zostanie nieodwracalnie usunięty.",
|
||||
"maintenance_delete_error": "Nie udało się usunąć kopii zapasowej.",
|
||||
"maintenance_integrity_check": "Sprawdź",
|
||||
"maintenance_integrity_check_all": "Sprawdź wszystko",
|
||||
"maintenance_integrity_checksum_mismatch": "Niezgodność sumy kontrolnej",
|
||||
"maintenance_integrity_checksum_mismatch_description": "Pliki, których suma kontrolna na dysku nie zgadza się z sumą kontrolną przechowywaną przez Immich w bazie danych.",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Sprawdź, czy nie występują rozbieżności w sumach kontrolnych",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Odśwież raporty dotyczące niezgodności sum kontrolnych",
|
||||
"maintenance_integrity_missing_file": "Brakujące pliki",
|
||||
"maintenance_integrity_missing_file_description": "Pliki, które Immich zlokalizował w swojej bazie danych, ale które nie istnieją w systemie plików.",
|
||||
"maintenance_integrity_missing_file_job": "Sprawdź, czy nie brakuje żadnych plików",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Odśwież raporty dotyczące brakujących plików",
|
||||
"maintenance_integrity_report": "Raport dotyczący integralności",
|
||||
"maintenance_integrity_untracked_file": "Pliki nieśledzone",
|
||||
"maintenance_integrity_untracked_file_description": "Pliki znajdujące się w katalogach Immicha, o których Immich nie ma żadnych informacji.",
|
||||
"maintenance_integrity_untracked_file_job": "Sprawdź, czy są pliki, które nie są śledzone",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Odśwież raporty dotyczące plików, które nie są śledzone",
|
||||
"maintenance_restore_backup": "Przywróć kopię zapasową",
|
||||
@@ -2165,8 +2170,8 @@
|
||||
"share_assets_selected": "Wybrano {count}",
|
||||
"share_dialog_preparing": "Przygotowywanie…",
|
||||
"share_link": "Udostępnij link",
|
||||
"share_original": "Użyj orginału (dużej)",
|
||||
"share_preview": "Użyj miniatury (małej)",
|
||||
"share_original": "Użyj orginału (duży)",
|
||||
"share_preview": "Użyj miniatury (mała)",
|
||||
"shared": "Udostępnione",
|
||||
"shared_album_activities_input_disable": "Komentarz jest wyłączony",
|
||||
"shared_album_activity_remove_content": "Czy chcesz usunąć tę aktywność?",
|
||||
@@ -2390,12 +2395,12 @@
|
||||
"trashed_items_will_be_permanently_deleted_after": "Wyrzucone zasoby zostaną trwale usunięte po {days, plural, one {jednym dniu} other {# dniach}}.",
|
||||
"trigger": "Wyzwalacz",
|
||||
"trigger_asset_metadata_extraction": "Ekstrakcja metadanych zasobów",
|
||||
"trigger_asset_metadata_extraction_description": "Wyzwalane, gdy wyodrębniony zostanie plik EXIF zasobu",
|
||||
"trigger_asset_metadata_extraction_description": "Wyzwalane po wyodrębnieniu metadanych EXIF z zasobu",
|
||||
"trigger_asset_uploaded": "Przesyłanie zasobu",
|
||||
"trigger_asset_uploaded_description": "Wyzwalane gdy przesłany zostanie nowy zasób",
|
||||
"trigger_description": "Wydarzenie, które uruchamia przepływ pracy",
|
||||
"trigger_person_recognized": "Osoba rozpoznana",
|
||||
"trigger_person_recognized_description": "Wyzwalane gdy zostanie wykryta osoba",
|
||||
"trigger_person_recognized_description": "Wyzwalane gdy osoba zostanie rozpoznana",
|
||||
"trigger_type": "Rodzaj wyzwalacza",
|
||||
"troubleshoot": "Rozwiąż problemy",
|
||||
"type": "Typ",
|
||||
|
||||
+24
-1
@@ -79,6 +79,7 @@
|
||||
"cron_expression_description": "Definir o intervalo de análise utilizando o formato Cron. Para mais informações, por favor consulte o <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Predefinições das expressões Cron",
|
||||
"disable_login": "Desativar inicio de sessão",
|
||||
"download_csv": "Descarregar CSV",
|
||||
"duplicate_detection_job_description": "Executa a aprendizagem de máquina em ficheiros para detetar imagens semelhantes. Depende da Pesquisa Inteligente",
|
||||
"exclusion_pattern_description": "Os padrões de exclusão permitem ignorar ficheiros e pastas ao analisar a sua biblioteca. Isto é útil se tiver pastas que contenham ficheiros que não deseja importar, como ficheiros RAW.",
|
||||
"export_config_as_json_description": "Descarregar a configuração atual do sistema como um ficheiro JSON",
|
||||
@@ -191,6 +192,17 @@
|
||||
"maintenance_delete_backup": "Eliminar Cópia de Segurança",
|
||||
"maintenance_delete_backup_description": "Este ficheiro irá ser apagado para sempre.",
|
||||
"maintenance_delete_error": "Ocorreu um erro ao eliminar a cópia de segurança.",
|
||||
"maintenance_integrity_check_all": "Verificar tudo",
|
||||
"maintenance_integrity_checksum_mismatch": "Checksum não corresponde",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Verificar se existem erros de checksum",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Atualizar relatórios de erros de checksum",
|
||||
"maintenance_integrity_missing_file": "Ficheiros em falta",
|
||||
"maintenance_integrity_missing_file_job": "Verificar se existem ficheiros em falta",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Atualizar relatórios de ficheiros em falta",
|
||||
"maintenance_integrity_report": "Relatório de integridade",
|
||||
"maintenance_integrity_untracked_file": "Ficheiros não monitorizados",
|
||||
"maintenance_integrity_untracked_file_job": "Verificar se existem ficheiros não monitorizados",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Atualizar relatórios de ficheiros não monitorizados",
|
||||
"maintenance_restore_backup": "Restaurar Cópia de Segurança",
|
||||
"maintenance_restore_backup_description": "O Immich irá ser apagado e de seguida restaurado a partir da cópia de segurança selecionada. Irá ser criada uma cópia de segurança antes de continuar.",
|
||||
"maintenance_restore_backup_different_version": "Esta cópia de segurança foi criada com uma versão diferente do Immich!",
|
||||
@@ -915,6 +927,8 @@
|
||||
"deduplicate_all": "Remover todos os duplicados",
|
||||
"default_locale": "Localização Padrão",
|
||||
"default_locale_description": "Formatar datas e números baseados na definição de localização do navegador",
|
||||
"default_quality_subtitle": "Qualidade utilizada ao tocar no botão de partilhar. Toque e segure no botão de partilhar para escolher a qualidade a cada vez.",
|
||||
"default_share_quality": "Qualidade de partilha padrão",
|
||||
"delete": "Eliminar",
|
||||
"delete_action_confirmation_message": "Tem a certeza de que quer eliminar este ficheiro? Está ação irá mover o ficheiro para a reciclagem do servidor e perguntar se quer apagá-lo localmente",
|
||||
"delete_action_prompt": "{count} eliminados",
|
||||
@@ -1224,6 +1238,7 @@
|
||||
"failed": "Ocorreu um erro",
|
||||
"failed_count": "Falhadas: {count}",
|
||||
"failed_to_authenticate": "Não foi possível autenticar",
|
||||
"failed_to_delete_file": "Ocorreu um erro ao eliminar ficheiro",
|
||||
"failed_to_load_assets": "Ocorreu um erro ao carregar ficheiros",
|
||||
"failed_to_load_folder": "Ocorreu um erro ao carregar a pasta",
|
||||
"favorite": "Favorito",
|
||||
@@ -1354,6 +1369,7 @@
|
||||
"individual_share": "Partilha individual",
|
||||
"individual_shares": "Partilhas individuais",
|
||||
"info": "Informações",
|
||||
"integrity_checks": "Verificações de integridade",
|
||||
"interval": {
|
||||
"day_at_onepm": "Todos os dias, às 13:00",
|
||||
"hours": "A cada {hours, plural, one {hora} other {{hours, number} horas}}",
|
||||
@@ -1426,6 +1442,7 @@
|
||||
"linked_oauth_account": "Conta OAuth Associada",
|
||||
"list": "Lista",
|
||||
"live": "Em direto",
|
||||
"load_more": "Carregar Mais",
|
||||
"loading": "A Carregar",
|
||||
"loading_search_results_failed": "Ocorreu um erro ao carregar os resultados da pesquisa",
|
||||
"local": "Local",
|
||||
@@ -2084,6 +2101,7 @@
|
||||
"select_person": "Selecionar pessoa",
|
||||
"select_person_to_tag": "Selecione uma pessoa para etiquetar",
|
||||
"select_photos": "Selecionar fotos",
|
||||
"select_quality": "Escolha a qualidade",
|
||||
"select_trash_all": "Selecionar todos para reciclagem",
|
||||
"select_user_for_sharing_page_err_album": "Ocorreu um erro ao criar o álbum",
|
||||
"selected": "Selecionados",
|
||||
@@ -2147,6 +2165,8 @@
|
||||
"share_assets_selected": "{count} selecionados",
|
||||
"share_dialog_preparing": "Preparando...",
|
||||
"share_link": "Partilhar ligação",
|
||||
"share_original": "Utilizar original (grande)",
|
||||
"share_preview": "Utilizar miniatura (pequeno)",
|
||||
"shared": "Partilhado",
|
||||
"shared_album_activities_input_disable": "Comentários desativados",
|
||||
"shared_album_activity_remove_content": "Deseja apagar esta atividade?",
|
||||
@@ -2248,6 +2268,7 @@
|
||||
"slideshow_repeat_description": "Repetir do inicio quando a apresentação acabar",
|
||||
"slideshow_settings": "Definições de apresentação",
|
||||
"smart_album": "Álbum inteligente",
|
||||
"some_assets_already_have_a_location_warning": "Alguns dos ficheiros selecionados já possuem localização",
|
||||
"sort_albums_by": "Ordenar álbuns por...",
|
||||
"sort_created": "Data de criação",
|
||||
"sort_items": "Número de itens",
|
||||
@@ -2368,11 +2389,13 @@
|
||||
"trash_page_title": "Reciclagem ({count})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "Os itens da reciclagem são eliminados permanentemente após {days, plural, one {# dia} other {# dias}}.",
|
||||
"trigger": "Ativador",
|
||||
"trigger_asset_metadata_extraction": "Extração de Metadados do Ficheiro",
|
||||
"trigger_asset_metadata_extraction_description": "Acionado quando os metadados EXIF de um ficheiro forem extraídos",
|
||||
"trigger_asset_uploaded": "Carregamento de ficheiro",
|
||||
"trigger_asset_uploaded_description": "Ativado quando um novo ficheiro é carregado",
|
||||
"trigger_description": "Um evento que irá começar o fluxo de trabalho",
|
||||
"trigger_person_recognized": "Pessoa Reconhecida",
|
||||
"trigger_person_recognized_description": "Ativado quando uma pessoa for detetada",
|
||||
"trigger_person_recognized_description": "Acionado quando uma pessoa for reconhecida",
|
||||
"trigger_type": "Tipo de ativador",
|
||||
"troubleshoot": "Diagnosticar problemas",
|
||||
"type": "Tipo",
|
||||
|
||||
+3
-1
@@ -2389,11 +2389,13 @@
|
||||
"trash_page_title": "Lixeira ({count})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "Os itens da lixeira serão deletados permanentemente após {days, plural, one {# dia} other {# dias}}.",
|
||||
"trigger": "Gatilho",
|
||||
"trigger_asset_metadata_extraction": "Extrair Metadado do item",
|
||||
"trigger_asset_metadata_extraction_description": "Acionado quando o metadado EXIF de um item for extraído",
|
||||
"trigger_asset_uploaded": "Arquivo enviado",
|
||||
"trigger_asset_uploaded_description": "Acionado quando um novo arquivo é enviado",
|
||||
"trigger_description": "Um evento que dá início ao fluxo",
|
||||
"trigger_person_recognized": "Pessoa reconhecida",
|
||||
"trigger_person_recognized_description": "Acionado quando uma pessoa é detectada",
|
||||
"trigger_person_recognized_description": "Acionado quando uma pessoa é reconhecida",
|
||||
"trigger_type": "Tipo de gatilho",
|
||||
"troubleshoot": "Diagnosticar",
|
||||
"type": "Tipo",
|
||||
|
||||
+6
-1
@@ -189,18 +189,23 @@
|
||||
"machine_learning_smart_search_enabled": "Включить интеллектуальный поиск",
|
||||
"machine_learning_smart_search_enabled_description": "При отключении этой функции изображения не будут кодироваться для интеллектуального поиска.",
|
||||
"machine_learning_url_description": "URL-адрес сервера машинного обучения. Если указано несколько, запросы будут отправляться по очереди на каждый, пока от одного из них не будет получен успешный ответ. Серверы, которые не отвечают, будут временно игнорироваться до тех пор, пока не станут снова доступны.",
|
||||
"maintenance_backup_management": "Управление резервным копированием",
|
||||
"maintenance_delete_backup": "Удалить резервную копию",
|
||||
"maintenance_delete_backup_description": "Эта резервная копия будет безвозвратно удалена.",
|
||||
"maintenance_delete_error": "Не удалось удалить резервную копию.",
|
||||
"maintenance_integrity_check": "Проверить",
|
||||
"maintenance_integrity_check_all": "Проверить все",
|
||||
"maintenance_integrity_checksum_mismatch": "Ошибки контрольных сумм",
|
||||
"maintenance_integrity_checksum_mismatch_description": "Файлы, контрольная сумма которых не совпадает с контрольной суммой, хранящейся в базе данных Immich.",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Проверка соответствия контрольных сумм",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Обновить количество ошибок контрольных сумм",
|
||||
"maintenance_integrity_missing_file": "Отсутствующие файлы",
|
||||
"maintenance_integrity_missing_file_description": "Файлы, записи о которых имеются в базе данных Immich, но сами файлы отсутствуют на диске.",
|
||||
"maintenance_integrity_missing_file_job": "Проверка наличия отсутствующих файлов",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Обновить количество отсутствующих файлов",
|
||||
"maintenance_integrity_report": "Проверка целостности",
|
||||
"maintenance_integrity_untracked_file": "Неотслеживаемые файлы",
|
||||
"maintenance_integrity_untracked_file_description": "Файлы, находящиеся в каталогах Immich, но о которых в базе данных Immich нет никаких сведений.",
|
||||
"maintenance_integrity_untracked_file_job": "Проверка наличия неотслеживаемых файлов",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Обновить количество неотслеживаемых файлов",
|
||||
"maintenance_restore_backup": "Восстановить резервную копию",
|
||||
@@ -2390,7 +2395,7 @@
|
||||
"trashed_items_will_be_permanently_deleted_after": "Объекты, хранящиеся в корзине более {days, plural, one {# дня} other {# дней}}, удаляются автоматически.",
|
||||
"trigger": "Триггер",
|
||||
"trigger_asset_metadata_extraction": "Извлечение метаданных объекта",
|
||||
"trigger_asset_metadata_extraction_description": "Срабатывает при извлечении EXIF-данных объекта",
|
||||
"trigger_asset_metadata_extraction_description": "Срабатывает при извлечении EXIF метаданных объекта",
|
||||
"trigger_asset_uploaded": "Загрузка объекта",
|
||||
"trigger_asset_uploaded_description": "Срабатывает при загрузке нового объекта",
|
||||
"trigger_description": "Событие, которое запускает сценарий",
|
||||
|
||||
+4
-4
@@ -114,7 +114,7 @@
|
||||
"image_thumbnail_quality_description": "Kvalita miniatúry v stupnici od 1 do 100. Vyššia hodnota znamená lepšiu kvalitu, ale produkuje väčšie súbory a môže znížiť odozvu aplikácie.",
|
||||
"image_thumbnail_title": "Miniatúry",
|
||||
"import_config_from_json_description": "Importovať konfiguráciu systému nahraním konfiguračného súboru JSON",
|
||||
"job_concurrency": "Súbežnosť úlohy - {job}",
|
||||
"job_concurrency": "Súbežné úlohy - {job}",
|
||||
"job_created": "Úloha bola vytvorená",
|
||||
"job_not_concurrency_safe": "Táto úloha nie je bezpečná pre súbežné spracovanie.",
|
||||
"job_settings": "Úlohy",
|
||||
@@ -2390,12 +2390,12 @@
|
||||
"trashed_items_will_be_permanently_deleted_after": "Položky v koši sa natrvalo vymažú po {days, plural, one {# dni} other {# dňoch}}.",
|
||||
"trigger": "Spúšťač",
|
||||
"trigger_asset_metadata_extraction": "Extrakcia metadát položky",
|
||||
"trigger_asset_metadata_extraction_description": "Spustí sa pri extrakcii údajov EXIF z mediálneho súboru",
|
||||
"trigger_asset_metadata_extraction_description": "Spustí sa pri extrakcii EXIF metadát z mediálneho súboru",
|
||||
"trigger_asset_uploaded": "Nahranie položiek",
|
||||
"trigger_asset_uploaded_description": "Spustí sa pri nahratí novej položky",
|
||||
"trigger_description": "Udalosť, ktorá spustí pracovný postup",
|
||||
"trigger_person_recognized": "Osoba bola rozpoznaná",
|
||||
"trigger_person_recognized_description": "Spustí sa, keď bude objavená osoba",
|
||||
"trigger_person_recognized_description": "Spustí sa, keď sa rozpozná osoba",
|
||||
"trigger_type": "Typ spúšťača",
|
||||
"troubleshoot": "Riešenie problémov",
|
||||
"type": "Typ",
|
||||
@@ -2496,7 +2496,7 @@
|
||||
"videos": "Videá",
|
||||
"videos_count": "{count, plural, one {# Video} few {# Videá} other {# Videí}}",
|
||||
"videos_only": "Iba videá",
|
||||
"view": "Zobrazenie",
|
||||
"view": "Zobraziť",
|
||||
"view_album": "Zobraziť Album",
|
||||
"view_all": "Zobraziť všetky",
|
||||
"view_all_users": "Zobraziť všetkých používateľov",
|
||||
|
||||
+179
-1
@@ -146,7 +146,185 @@
|
||||
"machine_learning_availability_checks_enabled": "Aktivizo kontrollet e disponueshmërisë",
|
||||
"machine_learning_availability_checks_interval": "Kontrolli i intervalit",
|
||||
"machine_learning_availability_checks_interval_description": "Intervali në milisekonda midis kontrolleve të disponueshmërisë",
|
||||
"machine_learning_availability_checks_timeout": "Kërko timeout"
|
||||
"machine_learning_availability_checks_timeout": "Kërko timeout",
|
||||
"machine_learning_availability_checks_timeout_description": "Kohëzgjatja në milisekonda për kontrollet e disponueshmërisë",
|
||||
"machine_learning_clip_model": "Modeli CLIP",
|
||||
"machine_learning_clip_model_description": "Emri i një modeli CLIP është listuar <link>këtu</link>. Vini re se duhet ta riekzekutoni punën 'Kërkim i Mençur' për të gjitha imazhet pas ndryshimit të një modeli.",
|
||||
"machine_learning_duplicate_detection": "Zbulimi i dublikatave",
|
||||
"machine_learning_duplicate_detection_enabled": "Aktivizo zbulimin e dublikatave",
|
||||
"machine_learning_duplicate_detection_enabled_description": "Nëse çaktivizohet, asetet saktësisht identike do të hiqen nga dublikimet.",
|
||||
"machine_learning_duplicate_detection_setting_description": "Përdorni ngulitje CLIP për të gjetur dublikata të mundshme",
|
||||
"machine_learning_enabled": "Aktivizo të mësuarit automatik",
|
||||
"machine_learning_enabled_description": "Nëse çaktivizohet, të gjitha veçoritë e ML do të çaktivizohen pavarësisht nga cilësimet e mëposhtme.",
|
||||
"machine_learning_facial_recognition": "Njohja e fytyrës",
|
||||
"machine_learning_facial_recognition_description": "Zbuloni, njihni dhe gruponi fytyrat në imazhe",
|
||||
"machine_learning_facial_recognition_model": "Modeli i njohjes së fytyrës",
|
||||
"machine_learning_facial_recognition_model_description": "Modelet renditen në rend zbritës të madhësisë. Modelet më të mëdha janë më të ngadalta dhe përdorin më shumë memorie, por japin rezultate më të mira. Vini re se duhet ta riekzekutoni punën e Zbulimit të Fytyrës për të gjitha imazhet pas ndryshimit të një modeli.",
|
||||
"machine_learning_facial_recognition_setting": "Aktivizo njohjen e fytyrës",
|
||||
"machine_learning_facial_recognition_setting_description": "Nëse çaktivizohet, imazhet nuk do të kodohen për njohjen e fytyrës dhe nuk do të popullojnë seksionin e Njerëzve në faqen Eksploro.",
|
||||
"machine_learning_max_detection_distance": "Distanca maksimale e zbulimit",
|
||||
"machine_learning_max_detection_distance_description": "Distanca maksimale midis dy imazheve për t'i konsideruar ato si dublikate, duke filluar nga 0.001-0.1. Vlerat më të larta do të zbulojnë më shumë dublikate, por mund të rezultojnë në pozitive të rreme.",
|
||||
"machine_learning_max_recognition_distance": "Distanca maksimale e njohjes",
|
||||
"machine_learning_max_recognition_distance_description": "Distanca maksimale midis dy fytyrave për t'u konsideruar i njëjti person, varion nga 0-2. Ulja e kësaj distance mund të parandalojë etiketimin e dy personave si i njëjti person, ndërsa rritja e saj mund të parandalojë etiketimin e të njëjtit person si dy persona të ndryshëm. Vini re se është më e lehtë të bashkoni dy persona sesa të ndani një person në dy, prandaj zgjidhni një prag më të ulët kur është e mundur.",
|
||||
"machine_learning_min_detection_score": "Rezultati minimal i zbulimit",
|
||||
"machine_learning_min_detection_score_description": "Rezultati minimal i besimit për një fytyrë që do të zbulohet është nga 0-1. Vlerat më të ulëta do të zbulojnë më shumë fytyra, por mund të rezultojnë në rezultate të rreme pozitive.",
|
||||
"machine_learning_min_recognized_faces": "Fytyrat minimale të njohura",
|
||||
"machine_learning_min_recognized_faces_description": "Numri minimal i fytyrave të njohura që duhet të krijohet për një person. Rritja e kësaj e bën Njohjen e Fytyrës më të saktë me koston e rritjes së mundësisë që një fytyrë të mos i caktohet një personi.",
|
||||
"machine_learning_ocr": "OCR",
|
||||
"machine_learning_ocr_description": "Përdorni të mësuarit automatik për të njohur tekstin në imazhe",
|
||||
"machine_learning_ocr_enabled": "Aktivizo OCR-në",
|
||||
"machine_learning_ocr_enabled_description": "Nëse çaktivizohet, imazhet nuk do t'i nënshtrohen njohjes së tekstit.",
|
||||
"machine_learning_ocr_max_resolution": "Rezolucioni maksimal",
|
||||
"machine_learning_ocr_max_resolution_description": "Pamjet paraprake mbi këtë rezolucion do të ndryshohen në madhësi duke ruajtur raportin e aspektit. Vlerat më të larta janë më të sakta, por kërkojnë më shumë kohë për t'u përpunuar dhe përdorin më shumë memorie.",
|
||||
"machine_learning_ocr_min_detection_score": "Rezultati minimal i zbulimit",
|
||||
"machine_learning_ocr_min_detection_score_description": "Rezultati minimal i besimit për tekstin që duhet zbuluar është nga 0-1. Vlerat më të ulëta do të zbulojnë më shumë tekst, por mund të rezultojnë në pozitive të rreme.",
|
||||
"machine_learning_ocr_min_recognition_score": "Rezultati minimal i njohjes",
|
||||
"machine_learning_ocr_min_score_recognition_description": "Rezultati minimal i besimit për tekstin e zbuluar që duhet të njihet nga 0-1. Vlerat më të ulëta do të njohin më shumë tekst, por mund të rezultojnë në pozitive të rreme.",
|
||||
"machine_learning_ocr_model": "Modeli OCR",
|
||||
"machine_learning_ocr_model_description": "Modelet e serverit janë më të sakta se modelet mobile, por kërkojnë më shumë kohë për t'u përpunuar dhe përdorin më shumë memorie.",
|
||||
"machine_learning_settings": "Cilësimet e të Mësuarit Automatik",
|
||||
"machine_learning_settings_description": "Menaxho veçoritë dhe cilësimet e të mësuarit automatik",
|
||||
"machine_learning_smart_search": "Kërkim i Mençur",
|
||||
"machine_learning_smart_search_description": "Kërko për imazhe semantikisht duke përdorur ngulitje CLIP",
|
||||
"machine_learning_smart_search_enabled": "Aktivizo kërkimin inteligjent",
|
||||
"machine_learning_smart_search_enabled_description": "Nëse çaktivizohet, imazhet nuk do të kodohen për kërkim inteligjent.",
|
||||
"machine_learning_url_description": "URL-ja e serverit të të mësuarit automatik. Nëse jepet më shumë se një URL, secili server do të provohet një nga një derisa njëri të përgjigjet me sukses, në rend nga i pari tek i fundit. Serverët që nuk përgjigjen do të injorohen përkohësisht derisa të kthehen në linjë.",
|
||||
"maintenance_delete_backup": "Fshi kopjen rezervë",
|
||||
"maintenance_delete_backup_description": "Ky skedar do të fshihet në mënyrë të pakthyeshme.",
|
||||
"maintenance_delete_error": "Fshirja e kopjes rezervë dështoi.",
|
||||
"maintenance_integrity_check_all": "Kontrollo të gjitha",
|
||||
"maintenance_integrity_checksum_mismatch": "Mospërputhje e shumës së kontrollit",
|
||||
"maintenance_integrity_checksum_mismatch_job": "Kontrolloni për mospërputhje të shumës së kontrollit",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "Rifresko raportet e mospërputhjes së shumës së kontrollit",
|
||||
"maintenance_integrity_missing_file": "Skedarët që mungojnë",
|
||||
"maintenance_integrity_missing_file_job": "Kontrolloni për skedarë që mungojnë",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Rifresko raportet e skedarëve që mungojnë",
|
||||
"maintenance_integrity_report": "Raporti i Integritetit",
|
||||
"maintenance_integrity_untracked_file": "Skedarët e Pagjurmuar",
|
||||
"maintenance_integrity_untracked_file_job": "Kontrolloni për skedarë të pagjurmuar",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "Rifresko raportet e skedarëve të pagjurmuar",
|
||||
"maintenance_restore_backup": "Rivendos rezervën",
|
||||
"maintenance_restore_backup_description": "Immich do të fshihet dhe do të rikthehet nga kopja rezervë e zgjedhur. Një kopje rezervë do të krijohet përpara se të vazhdohet.",
|
||||
"maintenance_restore_backup_different_version": "Ky kopje rezervë u krijua me një version të ndryshëm të Immich!",
|
||||
"maintenance_restore_backup_unknown_version": "Nuk mund të përcaktohej versioni i rezervimit.",
|
||||
"maintenance_restore_database_backup": "Rivendos kopjen rezervë të bazës së të dhënave",
|
||||
"maintenance_restore_database_backup_description": "Rikthim në një gjendje më të hershme të bazës së të dhënave duke përdorur një skedar rezervë",
|
||||
"maintenance_settings": "Mirëmbajtje",
|
||||
"maintenance_settings_description": "Vendos Immich në modalitetin e mirëmbajtjes.",
|
||||
"maintenance_start": "Kaloni në modalitetin e mirëmbajtjes",
|
||||
"maintenance_start_error": "Dështoi në nisjen e modalitetit të mirëmbajtjes.",
|
||||
"maintenance_upload_backup": "Ngarko skedarin rezervë të bazës së të dhënave",
|
||||
"maintenance_upload_backup_error": "Nuk mund të ngarkohet kopja rezervë, a është një skedar .sql/.sql.gz?",
|
||||
"manage_concurrency": "Menaxho Konkurrencën",
|
||||
"manage_concurrency_description": "Shko te faqja e punëve për të menaxhuar paralelisht punën",
|
||||
"manage_log_settings": "Menaxho cilësimet e regjistrit",
|
||||
"map_dark_style": "Stil i errët",
|
||||
"map_enable_description": "Aktivizo veçoritë e hartës",
|
||||
"map_gps_settings": "Cilësimet e Hartës dhe GPS-it",
|
||||
"map_gps_settings_description": "Menaxho Cilësimet e Hartës dhe GPS-it (Gjeokodimi i Anasjelltë)",
|
||||
"map_implications": "Funksioni i hartës mbështetet në një shërbim të jashtëm me pllaka (tiles.immich.cloud)",
|
||||
"map_light_style": "Stil i lehtë",
|
||||
"map_manage_reverse_geocoding_settings": "Menaxho cilësimet e <link>Gjeokodimit të kundërt</link>",
|
||||
"map_reverse_geocoding": "Gjeokodimi i kundërt",
|
||||
"map_reverse_geocoding_enable_description": "Aktivizo gjeokodimin e kundërt",
|
||||
"map_reverse_geocoding_settings": "Cilësimet e Gjeokodimit të Anasjelltë",
|
||||
"map_settings": "Hartë",
|
||||
"map_settings_description": "Menaxho cilësimet e hartës",
|
||||
"map_style_description": "URL-ja e një teme harte style.json",
|
||||
"memory_cleanup_job": "Pastrimi i kujtesës",
|
||||
"memory_generate_job": "Gjenerimi i kujtesës",
|
||||
"metadata_extraction_job": "Ekstraktoni metadatat",
|
||||
"metadata_extraction_job_description": "Nxirrni informacionin e meta-tadatave nga çdo aset, siç janë GPS, fytyrat dhe rezolucioni",
|
||||
"metadata_faces_import_setting": "Aktivizo importimin e fytyrës",
|
||||
"metadata_faces_import_setting_description": "Importo fytyrat nga të dhënat EXIF të imazhit dhe skedarët e karrocës anësore",
|
||||
"metadata_settings": "Cilësimet e meta të dhënave",
|
||||
"metadata_settings_description": "Menaxho cilësimet e meta-të dhënave",
|
||||
"migration_job": "Migrimi",
|
||||
"migration_job_description": "Migro miniaturat për asetet dhe fytyrat në strukturën më të fundit të dosjeve",
|
||||
"nightly_tasks_cluster_faces_setting_description": "Ekzekutoni njohjen e fytyrës në fytyrat e zbuluara rishtazi",
|
||||
"nightly_tasks_cluster_new_faces_setting": "Grumbulloni fytyra të reja",
|
||||
"nightly_tasks_database_cleanup_setting": "Detyrat e pastrimit të bazës së të dhënave",
|
||||
"nightly_tasks_database_cleanup_setting_description": "Pastroni të dhënat e vjetra dhe të skaduara nga baza e të dhënave",
|
||||
"nightly_tasks_generate_memories_setting": "Gjeneroni kujtime",
|
||||
"nightly_tasks_generate_memories_setting_description": "Krijo kujtime të reja nga asetet",
|
||||
"nightly_tasks_missing_thumbnails_setting": "Gjenero miniaturat që mungojnë",
|
||||
"nightly_tasks_missing_thumbnails_setting_description": "Vendosni në radhë asetet pa miniatura për gjenerimin e miniaturave",
|
||||
"nightly_tasks_settings": "Cilësimet e Detyrave të Natës",
|
||||
"nightly_tasks_settings_description": "Menaxho detyrat e natës",
|
||||
"nightly_tasks_start_time_setting": "Ora e fillimit",
|
||||
"nightly_tasks_start_time_setting_description": "Koha në të cilën serveri fillon të ekzekutojë detyrat e natës",
|
||||
"nightly_tasks_sync_quota_usage_setting": "Përdorimi i kuotës së sinkronizimit",
|
||||
"nightly_tasks_sync_quota_usage_setting_description": "Përditëso kuotën e ruajtjes së përdoruesit, bazuar në përdorimin aktual",
|
||||
"no_paths_added": "Nuk janë shtuar shtigje",
|
||||
"no_pattern_added": "Nuk është shtuar asnjë model",
|
||||
"note_apply_storage_label_previous_assets": "Shënim: Për të aplikuar Etiketën e Ruajtjes në asetet e ngarkuara më parë, ekzekutoni",
|
||||
"note_cannot_be_changed_later": "SHËNIM: Kjo nuk mund të ndryshohet më vonë!",
|
||||
"notification_email_from_address": "Adresa nga",
|
||||
"notification_email_from_address_description": "Adresa e email-it të dërguesit, për shembull: \"Immich Photo Server <noreply@example.com>\". Sigurohuni që të përdorni një adresë nga e cila lejoheni të dërgoni email-e.",
|
||||
"notification_email_host_description": "Strehuesi i serverit të email-it (p.sh. smtp.immich.app)",
|
||||
"notification_email_ignore_certificate_errors": "Injoro gabimet e certifikatës",
|
||||
"notification_email_ignore_certificate_errors_description": "Injoroni gabimet e validimit të certifikatës TLS (nuk rekomandohet)",
|
||||
"notification_email_password_description": "Fjalëkalimi që duhet përdorur gjatë autentifikimit me serverin e email-it",
|
||||
"notification_email_port_description": "Porta e serverit të email-it (p.sh. 25, 465 ose 587)",
|
||||
"notification_email_secure": "SMTPS",
|
||||
"notification_email_secure_description": "Përdorni SMTPS (SMTP mbi TLS)",
|
||||
"notification_email_sent_test_email_button": "Dërgo email-in e provës dhe ruaj",
|
||||
"notification_email_setting_description": "Cilësimet për dërgimin e njoftimeve me email",
|
||||
"notification_email_test_email": "Dërgo email testimi",
|
||||
"notification_email_test_email_failed": "Dërgimi i email-it të testimit dështoi, kontrolloni vlerat tuaja",
|
||||
"notification_email_test_email_sent": "Një email provë është dërguar te {email}. Ju lutemi kontrolloni kutinë tuaj hyrëse.",
|
||||
"notification_email_username_description": "Emri i përdoruesit që do të përdoret gjatë autentifikimit me serverin e email-it",
|
||||
"notification_enable_email_notifications": "Aktivizo njoftimet me email",
|
||||
"notification_settings": "Cilësimet e njoftimeve",
|
||||
"notification_settings_description": "Menaxho cilësimet e njoftimeve, duke përfshirë email-in",
|
||||
"oauth_allow_insecure_requests": "Lejo kërkesa të pasigurta",
|
||||
"oauth_allow_insecure_requests_description": "KUJDES: Kjo çaktivizon validimin e certifikatës TLS për kërkesat OAuth dhe mund t'ju ekspozojë ndaj sulmeve MITM.",
|
||||
"oauth_auto_launch": "Nisja automatike",
|
||||
"oauth_auto_launch_description": "Filloni automatikisht rrjedhën e hyrjes në OAuth sapo të shkoni në faqen e hyrjes",
|
||||
"oauth_auto_register": "Regjistrim automatik",
|
||||
"oauth_auto_register_description": "Regjistro automatikisht përdoruesit e rinj pas hyrjes me OAuth",
|
||||
"oauth_button_text": "Teksti i butonit",
|
||||
"oauth_client_secret_description": "E detyrueshme për klient konfidencial, ose nëse PKCE (Çelësi i Provës për Shkëmbimin e Kodit) nuk mbështetet për klientin publik.",
|
||||
"oauth_enable_description": "Kyçu me OAuth",
|
||||
"oauth_end_session_url_description": "Ridrejto përdoruesin në këtë URI kur të dalë.",
|
||||
"oauth_mobile_redirect_uri": "URL-ja e ridrejtimit për celular",
|
||||
"oauth_mobile_redirect_uri_override": "Mbivendosja e URI-së së ridrejtimit celular",
|
||||
"oauth_mobile_redirect_uri_override_description": "Aktivizo kur ofruesi i OAuth nuk lejon një URI celular, si p.sh. ''{callback}''",
|
||||
"oauth_prompt_description": "Parametri i kërkesës (p.sh. select_account, login, consent)",
|
||||
"oauth_role_claim": "Pretendimi për Rol",
|
||||
"oauth_role_claim_description": "Jep automatikisht akses administratori bazuar në praninë e këtij pretendimi. Pretendimi mund të ketë ose 'përdorues' ose 'administrator'.",
|
||||
"oauth_settings": "OAuth",
|
||||
"oauth_settings_description": "Menaxho cilësimet e hyrjes në OAuth",
|
||||
"oauth_settings_more_details": "Për më shumë detaje rreth kësaj veçorie, referojuni <link>dokumenteve</link>.",
|
||||
"oauth_storage_label_claim": "Pretendimi për etiketën e ruajtjes",
|
||||
"oauth_storage_label_claim_description": "Cakto automatikisht etiketën e ruajtjes së përdoruesit në vlerën e këtij pretendimi.",
|
||||
"oauth_storage_quota_claim": "Pretendim për kuotën e ruajtjes së të dhënave",
|
||||
"oauth_storage_quota_claim_description": "Cakto automatikisht kuotën e ruajtjes së përdoruesit në vlerën e këtij pretendimi.",
|
||||
"oauth_storage_quota_default": "Kuota e parazgjedhur e ruajtjes (GiB)",
|
||||
"oauth_storage_quota_default_description": "Kuota në GiB do të përdoret kur nuk paraqitet asnjë kërkesë.",
|
||||
"oauth_timeout": "Kërkesë për skadimin e kohës",
|
||||
"oauth_timeout_description": "Kohëzgjatja e pritjes për kërkesat në milisekonda",
|
||||
"ocr_job_description": "Përdorni të mësuarit automatik për të njohur tekstin në imazhe",
|
||||
"password_enable_description": "Kyçu me email dhe fjalëkalim",
|
||||
"password_settings": "Fjalëkalimi Hyrje",
|
||||
"password_settings_description": "Menaxho cilësimet e hyrjes me fjalëkalim",
|
||||
"paths_validated_successfully": "Të gjitha shtigjet u validuan me sukses",
|
||||
"person_cleanup_job": "Pastrim personash",
|
||||
"queue_details": "Detajet e radhës",
|
||||
"queues": "Radhët e Punës",
|
||||
"queues_page_description": "Faqja e radhëve të punës së administratorit",
|
||||
"quota_size_gib": "Madhësia e Kuotës (GiB)",
|
||||
"refreshing_all_libraries": "Duke rifreskuar të gjitha bibliotekat",
|
||||
"registration": "Regjistrimi i Administratorit",
|
||||
"registration_description": "Meqenëse jeni përdoruesi i parë në sistem, do të caktoheni si Administrator dhe do të jeni përgjegjës për detyrat administrative, dhe përdorues të tjerë do të krijohen nga ju.",
|
||||
"release_channel_release_candidate": "Kandidat për lirim",
|
||||
"release_channel_stable": "I Qëndrueshëm",
|
||||
"remove_failed_jobs": "Hiq punët e dështuara",
|
||||
"require_password_change_on_login": "Kërkon që përdoruesi të ndryshojë fjalëkalimin në hyrjen e parë",
|
||||
"reset_settings_to_default": "Rivendos cilësimet në ato të parazgjedhura",
|
||||
"reset_settings_to_recent_saved": "Rivendos cilësimet në cilësimet e ruajtura së fundmi",
|
||||
"scanning_library": "Duke skanuar bibliotekën",
|
||||
"search_jobs": "Kërko punë…"
|
||||
},
|
||||
"download_original": "Shkarko origjinalin",
|
||||
"download_paused": "Shkarkimi u pezullua",
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
"cron_expression_description": "Установіть інтервал сканування у форматі cron. Додаткова інформація: <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Шаблони Cron-виразів",
|
||||
"disable_login": "Вимкнути вхід",
|
||||
"download_csv": "Завантажити CSV",
|
||||
"duplicate_detection_job_description": "Виконати машинне навчання для виявлення схожих зображень. Потребує розумного пошуку",
|
||||
"exclusion_pattern_description": "Шаблони винятків дають змогу ігнорувати файли та папки під час сканування бібліотеки. Це корисно для папок із небажаними для імпорту файлами, наприклад файлами RAW.",
|
||||
"export_config_as_json_description": "Завантажити поточну конфігурацію системи у форматі JSON",
|
||||
@@ -191,6 +192,11 @@
|
||||
"maintenance_delete_backup": "Видалити резервну копію",
|
||||
"maintenance_delete_backup_description": "Цей файл буде безповоротно видалено.",
|
||||
"maintenance_delete_error": "Не вдалося видалити резервну копію.",
|
||||
"maintenance_integrity_check_all": "Перевірити все",
|
||||
"maintenance_integrity_checksum_mismatch": "Контрольна сума не сходиться",
|
||||
"maintenance_integrity_missing_file": "Файли що відсутні",
|
||||
"maintenance_integrity_missing_file_job": "Перевірка відсутніх файлів",
|
||||
"maintenance_integrity_missing_file_refresh_job": "Оновити звіт про відсутні файли",
|
||||
"maintenance_restore_backup": "Відновити резервну копію",
|
||||
"maintenance_restore_backup_description": "Immich буде стерто та відновлено з вибраної резервної копії. Перед продовженням буде створено резервну копію.",
|
||||
"maintenance_restore_backup_different_version": "Цю резервну копію було створено за допомогою іншої версії Immich!",
|
||||
|
||||
+115
-29
@@ -7,8 +7,8 @@
|
||||
"action_common_update": "更新",
|
||||
"action_description": "針對篩選後嘅資源執行嘅一系列動作",
|
||||
"actions": "動作",
|
||||
"active": "正在處理",
|
||||
"active_count": "正在處理:{count}",
|
||||
"active": "處理緊",
|
||||
"active_count": "處理緊:{count}",
|
||||
"activity": "活動",
|
||||
"activity_changed": "活動已{enabled, select, true {啟動} other {停止}}",
|
||||
"add": "加",
|
||||
@@ -17,7 +17,7 @@
|
||||
"add_a_name": "加一個姓名",
|
||||
"add_a_title": "加一個標題",
|
||||
"add_action": "加動作",
|
||||
"add_action_description": "點擊以加動作",
|
||||
"add_action_description": "撳呢度加動作",
|
||||
"add_assets": "加資源",
|
||||
"add_birthday": "加一個生日",
|
||||
"add_endpoint": "加端點",
|
||||
@@ -29,21 +29,21 @@
|
||||
"add_photos": "加多張相片",
|
||||
"add_step": "加步驟",
|
||||
"add_tag": "加標籤",
|
||||
"add_to": "加至…",
|
||||
"add_to_album": "加至相簿",
|
||||
"add_to_album_bottom_sheet_added": "已加至{album}",
|
||||
"add_to_album_bottom_sheet_already_exists": "已在 {album} 中",
|
||||
"add_to_album_bottom_sheet_some_local_assets": "無法加部分本機資源至相簿",
|
||||
"add_to_album_toggle": "選擇{album}相簿",
|
||||
"add_to_albums": "加至相簿",
|
||||
"add_to_albums_count": "加 ({count}) 個項目至相簿",
|
||||
"add_to_bottom_bar": "加至",
|
||||
"add_to_shared_album": "加至共享相簿",
|
||||
"add_to": "加到…",
|
||||
"add_to_album": "加到相簿",
|
||||
"add_to_album_bottom_sheet_added": "已加到{album}",
|
||||
"add_to_album_bottom_sheet_already_exists": "已經喺 {album} 中",
|
||||
"add_to_album_bottom_sheet_some_local_assets": "加唔到一啲本機資源到相簿",
|
||||
"add_to_album_toggle": "揀 {album} 相簿",
|
||||
"add_to_albums": "加到相簿",
|
||||
"add_to_albums_count": "加 ({count}) 個項目到相簿",
|
||||
"add_to_bottom_bar": "加到",
|
||||
"add_to_shared_album": "加到共享相簿",
|
||||
"add_upload_to_stack": "新增上傳到堆疊",
|
||||
"add_url": "加網址",
|
||||
"added_to_archive": "已添至封存",
|
||||
"added_to_favorites": "已加至最愛",
|
||||
"added_to_favorites_count": "已加{count, number} 個項目至最愛",
|
||||
"added_to_archive": "已加咗入封存",
|
||||
"added_to_favorites": "已加咗到最愛",
|
||||
"added_to_favorites_count": "已加咗{count, number} 個項目到最愛",
|
||||
"admin": {
|
||||
"add_exclusion_pattern_description": "添加排除模式。支持使用 *、** 同? 嘅萬用字元比對 (Globbing)。例如,使用「**/Raw/**」忽略任何raw檔案,或者已「**/*.tif」忽略全部以「.tif」結尾的檔案;如果要忽略特定嘅絕對路徑請使用「/path/to/ignore/**」。",
|
||||
"admin_user": "管理員用戶",
|
||||
@@ -79,6 +79,7 @@
|
||||
"cron_expression_description": "使用 Cron 格式嚟設定掃描嘅間隔。更多嘅資訊請查閱 <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Cron 表達式預設選項",
|
||||
"disable_login": "停止使用登入",
|
||||
"download_csv": "下載CSV檔案",
|
||||
"duplicate_detection_job_description": "運用機械學習,依靠智慧搜尋嚟偵測相似嘅相片",
|
||||
"exclusion_pattern_description": "你可以用排除模式喺掃描媒體庫時忽略特定嘅檔案同資料夾。喺某啲資料夾有你唔想加入嘅檔案(例如RAW相)嘅情況下呢個功能將會好有用。",
|
||||
"export_config_as_json_description": "將目前嘅系統設定下載為 JSON 檔案",
|
||||
@@ -100,7 +101,7 @@
|
||||
"image_prefer_wide_gamut": "傾向廣色域",
|
||||
"image_prefer_wide_gamut_setting_description": "使用 Display P3 製作縮圖:可以更好地保留廣色域影像嘅鮮豔度,但係喺舊裝置同舊版瀏覽器上,影像呈現嘅效果可能會有所唔同。sRGB 影像會保留為 sRGB,以避免色彩偏移。",
|
||||
"image_preview_description": "中等尺寸嘅圖片,用嚟檢視單一影像同埋機器學習",
|
||||
"image_preview_quality_description": "從1-100選擇預覽嘅質素。數值越高越品質好,但會產生較大嘅檔案同影響app嘅反應速度。設定低嘅數值有機會影響機器學習嘅品質。",
|
||||
"image_preview_quality_description": "從1-100揀預覽嘅質素。數值越高越品質好,但會產生較大嘅檔案同影響app嘅反應速度。設定低嘅數值有機會影響機器學習嘅品質。",
|
||||
"image_preview_title": "預覽設定",
|
||||
"image_progressive": "逐步",
|
||||
"image_progressive_description": "對 JPEG 圖片採用漸進式編碼,以實現漸進式載入顯示。呢個選項唔會影響 WebP 圖片。",
|
||||
@@ -114,15 +115,15 @@
|
||||
"image_thumbnail_title": "縮圖設定",
|
||||
"import_config_from_json_description": "透過上傳 JSON 設定嚟導入系統設定",
|
||||
"job_concurrency": "{job} 並行數",
|
||||
"job_created": "已建立任務",
|
||||
"job_created": "建立咗任務",
|
||||
"job_not_concurrency_safe": "呢個任務唔支援並行執行。",
|
||||
"job_settings": "任務設定",
|
||||
"job_settings_description": "管理任務並行數",
|
||||
"jobs_delayed": "{jobCount, plural, other {# 個任務推遲}}",
|
||||
"jobs_failed": "{jobCount, plural, other {# 個任務失敗}}",
|
||||
"jobs_over_time": "任務數量趨勢",
|
||||
"library_created": "已建立媒體庫:{library}",
|
||||
"library_deleted": "媒體庫已刪除",
|
||||
"library_created": "建立咗媒體庫:{library}",
|
||||
"library_deleted": "媒體庫刪除咗",
|
||||
"library_details": "媒體庫詳細資訊",
|
||||
"library_folder_description": "指定要導入嘅文件夾。系統將會掃描呢個文件夾(包含子文件夾)中所有嘅相同埋影片。",
|
||||
"library_remove_exclusion_pattern_prompt": "係唔係確定要移除呢個排除模式?",
|
||||
@@ -133,7 +134,7 @@
|
||||
"library_settings": "外部媒體庫",
|
||||
"library_settings_description": "管理外部媒體庫設定",
|
||||
"library_tasks_description": "掃描外部媒體庫以搵出新增同埋變更嘅文件",
|
||||
"library_updated": "已更新媒體庫",
|
||||
"library_updated": "更新咗媒體庫",
|
||||
"library_watching_enable_description": "監視外部媒體庫嘅檔案變化",
|
||||
"library_watching_settings": "媒體庫監控 [實驗性]",
|
||||
"library_watching_settings_description": "自動監控檔案嘅變化",
|
||||
@@ -166,6 +167,21 @@
|
||||
"machine_learning_max_recognition_distance": "最大識別距離",
|
||||
"machine_learning_max_recognition_distance_description": "判斷兩個面孔是否屬於同一人嘅最大距離,範圍由 0 到 2。降低呢個數值可以避免將兩個人誤判為同一人,而提高此數值可以避免將同一個人誤判為兩個人。請注意,合併兩個人比將一個人拆分成兩個人更容易,因此建議盡可能選擇較低嘅數值。",
|
||||
"machine_learning_min_detection_score": "最低偵測分數",
|
||||
"machine_learning_min_detection_score_description": "臉孔偵測最低信心嘅分數,範圍係 0 到 1。低啲嘅數值會偵測到多啲面孔,但可能會唔啱。",
|
||||
"machine_learning_min_recognized_faces": "最低嘅面孔辨識數量",
|
||||
"machine_learning_min_recognized_faces_description": "建立新人物需要嘅最低已辨識面孔數量。提高呢個數值會令面孔辨識更精確,但同時會大啲機會指派唔到面孔俾任何人物。",
|
||||
"machine_learning_ocr": "文字辨識(OCR)",
|
||||
"machine_learning_ocr_description": "用機械學習辨識相裏面嘅文字",
|
||||
"machine_learning_ocr_enabled": "用文字識別(OCR)",
|
||||
"machine_learning_ocr_enabled_description": "如果唔用,相唔會進行文字辨識。",
|
||||
"machine_learning_ocr_max_resolution": "最大解析度",
|
||||
"machine_learning_ocr_max_resolution_description": "解析度高過此值嘅預覽相片會喺保持長寬比例嘅情況下調整大細。數值越高越準確,但係處理時間會更長,同埋會用更多記憶體。",
|
||||
"machine_learning_ocr_min_detection_score": "最低檢測分數",
|
||||
"machine_learning_ocr_min_detection_score_description": "文字偵測嘅最低信心分數,範圍係 0 至 1。較低嘅數值會偵測到多啲文字,但可能會唔啱。",
|
||||
"machine_learning_ocr_min_recognition_score": "最低辨識分數",
|
||||
"machine_learning_ocr_min_score_recognition_description": "已偵測到文字偵測嘅最低信心分數,範圍係 0 至 1。較低嘅數值會偵測到多啲字,但可能會唔啱。",
|
||||
"machine_learning_ocr_model": "OCR 模型",
|
||||
"machine_learning_ocr_model_description": "伺服器嘅模型比行動裝置嘅模型準確啲,但係處理時間長啲,同埋會用多啲記憶體。",
|
||||
"machine_learning_settings": "機器學習設定",
|
||||
"machine_learning_settings_description": "管理機器學習嘅功能同埋設定",
|
||||
"machine_learning_smart_search": "智能搜尋",
|
||||
@@ -173,13 +189,29 @@
|
||||
"machine_learning_smart_search_enabled": "啟用智慧搜尋",
|
||||
"machine_learning_smart_search_enabled_description": "如果停用,相片唔會進行智能搜尋編碼。",
|
||||
"machine_learning_url_description": "機器學習伺服器嘅 URL。如果你提供多個 URL,系統會逐一嘗試,直到有一個成功回應為止(由前到後)。未回應嘅伺服器將被暫時忽略,直到佢重新上線為止。",
|
||||
"maintenance_backup_management": "管理備份",
|
||||
"maintenance_delete_backup": "刪除備份",
|
||||
"maintenance_delete_backup_description": "此檔案將被永久刪除。",
|
||||
"maintenance_delete_error": "刪除備份失敗。",
|
||||
"maintenance_integrity_check": "檢查",
|
||||
"maintenance_integrity_check_all": "全部檢查",
|
||||
"maintenance_integrity_checksum_mismatch": "檢查碼唔對",
|
||||
"maintenance_integrity_checksum_mismatch_description": "檔案嘅總和檢查碼同資料庫嘅唔對。",
|
||||
"maintenance_integrity_checksum_mismatch_job": "檢查有冇檢查碼唔對",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "刷新檢查碼唔對報告",
|
||||
"maintenance_integrity_missing_file": "搵唔到檔案",
|
||||
"maintenance_integrity_missing_file_description": "喺資料庫追蹤緊,但喺檔案系統唔見嘅檔案。",
|
||||
"maintenance_integrity_missing_file_job": "檢查唔見嘅檔案",
|
||||
"maintenance_integrity_missing_file_refresh_job": "刷新唔見檔案報告",
|
||||
"maintenance_integrity_report": "完整性報告",
|
||||
"maintenance_integrity_untracked_file": "未追蹤嘅檔案",
|
||||
"maintenance_integrity_untracked_file_description": "喺 Immich 目錄裏面,但冇任何紀錄嘅檔案。",
|
||||
"maintenance_integrity_untracked_file_job": "檢查未追蹤嘅檔案",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "刷新未追蹤檔案報告",
|
||||
"maintenance_restore_backup": "還原備份",
|
||||
"maintenance_restore_backup_description": "Immich 的資料將會被清除,並還原你揀嘅備份。喺繼續操作前,系統會先建立目前嘅資料備份。",
|
||||
"maintenance_restore_backup_different_version": "呢個備份係由不同版本嘅 Immich 所建立!",
|
||||
"maintenance_restore_backup_unknown_version": "無法確定備份版本。",
|
||||
"maintenance_restore_backup_unknown_version": "確定唔到備份版本。",
|
||||
"maintenance_restore_database_backup": "還原資料庫備份",
|
||||
"maintenance_restore_database_backup_description": "使用備份文件將數據庫還原到較早嘅狀態",
|
||||
"maintenance_settings": "維修",
|
||||
@@ -199,6 +231,7 @@
|
||||
"map_light_style": "淺色風格",
|
||||
"map_manage_reverse_geocoding_settings": "管理 <link>逆向地理編碼</link> 嘅設定",
|
||||
"map_reverse_geocoding": "反向地理編碼",
|
||||
"map_reverse_geocoding_enable_description": "用反向地理編碼",
|
||||
"map_reverse_geocoding_settings": "反向地理編碼設定",
|
||||
"map_settings": "地圖",
|
||||
"map_settings_description": "管理地圖設定",
|
||||
@@ -206,14 +239,67 @@
|
||||
"memory_cleanup_job": "回憶清理",
|
||||
"memory_generate_job": "產生回憶",
|
||||
"metadata_extraction_job": "抽取元數據",
|
||||
"metadata_extraction_job_description": "喺每個項目中抽取元數據資訊,例如 GPS、臉孔同埋解析度"
|
||||
"metadata_extraction_job_description": "喺每個項目中抽取元數據資訊,例如 GPS、臉孔同埋解析度",
|
||||
"metadata_faces_import_setting": "啟用面孔匯入",
|
||||
"metadata_faces_import_setting_description": "由相片 EXIF 資料同附屬檔案匯入面孔",
|
||||
"metadata_settings": "詮釋資料設定",
|
||||
"metadata_settings_description": "管理詮釋資料設定",
|
||||
"migration_job": "遷移",
|
||||
"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": "冇新增咗嘅路徑",
|
||||
"queue_details": "隊列資訊",
|
||||
"queues": "任務隊列",
|
||||
"queues_page_description": "管理員任務隊列頁面",
|
||||
"quota_size_gib": "配額大細(GiB)",
|
||||
"refreshing_all_libraries": "重新整理緊所有媒體庫",
|
||||
"registration": "管理者註冊",
|
||||
"registration_description": "由於您係系統上第一個使用者,您會被指派為系統管理員,並負責管理相關事務,之後其餘嘅使用者都由您建立。",
|
||||
"release_channel_release_candidate": "候選發布版",
|
||||
"release_channel_stable": "稳定版",
|
||||
"remove_failed_jobs": "移除失敗任務",
|
||||
"require_password_change_on_login": "要求使用者喺第一次登入時改密碼",
|
||||
"reset_settings_to_default": "將設定重設到預設值",
|
||||
"reset_settings_to_recent_saved": "將設定重設到最近儲存嘅設定",
|
||||
"scanning_library": "掃描緊媒體庫",
|
||||
"search_jobs": "搵緊任務…",
|
||||
"send_welcome_email": "傳送歡迎電郵",
|
||||
"server_external_domain_settings": "外部網域",
|
||||
"server_external_domain_settings_description": "外部超連結的網域",
|
||||
"server_public_users": "公開使用者",
|
||||
"server_public_users_description": "將使用者加到共享相簿時,會列出所有使用者(姓名同電郵)。如果唔用,淨係管理員先可以睇到使用者清單。",
|
||||
"server_settings": "伺服器設定",
|
||||
"server_settings_description": "管理伺服器設定",
|
||||
"server_stats_page_description": "管理伺服器統計頁面",
|
||||
"server_welcome_message": "歡迎訊息",
|
||||
"server_welcome_message_description": "喺登入頁面顯示嘅訊息。",
|
||||
"settings_page_description": "管理設定頁面",
|
||||
"sidecar_job": "附屬檔案詮釋資料",
|
||||
"sidecar_job_description": "由檔案系統偵測或者同步附屬檔案詮釋資料",
|
||||
"slideshow_duration_description": "每張相展示嘅秒數",
|
||||
"smart_search_job_description": "對項目做機械學習,之後可以用智慧搜尋",
|
||||
"storage_template_date_time_description": "檔案的建立時間會用喺日期同時間資訊",
|
||||
"storage_template_date_time_sample": "抽樣時間 {date}"
|
||||
},
|
||||
"main_menu": "主選單",
|
||||
"maintenance_action_restore": "還原緊數據庫",
|
||||
"onboarding_user_welcome_description": "我哋而家開始喇!",
|
||||
"onboarding_welcome_user": "歡迎,{user}",
|
||||
"online": "已上線",
|
||||
"only_favorites": "只顯示最愛",
|
||||
"only_favorites": "淨係顯示最愛",
|
||||
"open": "開",
|
||||
"open_in_map_view": "用地圖開",
|
||||
"open_in_openstreetmap": "用 OpenStreetMap 開",
|
||||
@@ -231,10 +317,10 @@
|
||||
"wrong_pin_code": "PIN 碼唔啱",
|
||||
"year": "年",
|
||||
"years_ago": "{years, plural, one {#年} other {#年}}前",
|
||||
"yes": "是",
|
||||
"you_dont_have_any_shared_links": "你無共享連結",
|
||||
"your_wifi_name": "你嘅 Wi-Fi 名稱",
|
||||
"zero_to_clear_rating": "按0以清除資源評級",
|
||||
"yes": "係",
|
||||
"you_dont_have_any_shared_links": "您冇任何嘅共享連結",
|
||||
"your_wifi_name": "您嘅 Wi-Fi 名稱",
|
||||
"zero_to_clear_rating": "撳 0 清除資源嘅評級",
|
||||
"zoom_image": "縮放相片",
|
||||
"zoom_to_bounds": "縮放至邊界"
|
||||
"zoom_to_bounds": "縮放到邊界"
|
||||
}
|
||||
|
||||
+29
-1
@@ -79,6 +79,7 @@
|
||||
"cron_expression_description": "使用Cron格式设置扫描间隔。更多信息请参考 <link>Crontab Guru</link> 等网站",
|
||||
"cron_expression_presets": "Cron表达式预设",
|
||||
"disable_login": "禁用登录",
|
||||
"download_csv": "下载CSV文件",
|
||||
"duplicate_detection_job_description": "运行机器学习来检测相似图像,此功能依赖于智能搜索",
|
||||
"exclusion_pattern_description": "排除规则允许您在扫描资源库时忽略特定的文件和文件夹。如果您有某些包含不希望导入的文件(例如 RAW 格式文件)的文件夹,此功能将非常有用。",
|
||||
"export_config_as_json_description": "将当前系统配置下载为 JSON 文件",
|
||||
@@ -188,9 +189,25 @@
|
||||
"machine_learning_smart_search_enabled": "启用智能搜索",
|
||||
"machine_learning_smart_search_enabled_description": "若禁用,图片将不会被编码以用于智能搜索。",
|
||||
"machine_learning_url_description": "机器学习服务器的 URL。若提供多个 URL,系统将按从前往后的顺序逐个尝试连接,直至有服务器成功响应为止。未能响应的服务器将被暂时忽略,直至其恢复在线。",
|
||||
"maintenance_backup_management": "备份管理",
|
||||
"maintenance_delete_backup": "删除备份",
|
||||
"maintenance_delete_backup_description": "此文件将被永久删除。",
|
||||
"maintenance_delete_error": "删除备份失败。",
|
||||
"maintenance_integrity_check": "检查",
|
||||
"maintenance_integrity_check_all": "检查全部",
|
||||
"maintenance_integrity_checksum_mismatch": "校验和不匹配",
|
||||
"maintenance_integrity_checksum_mismatch_description": "文件的校验与数据库的不匹配。",
|
||||
"maintenance_integrity_checksum_mismatch_job": "校验和不匹配检查",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "刷新校验和不匹配报告",
|
||||
"maintenance_integrity_missing_file": "缺失文件",
|
||||
"maintenance_integrity_missing_file_description": "已在数据库中追踪,但档案系统中并不存在的文件。",
|
||||
"maintenance_integrity_missing_file_job": "检查缺失文件",
|
||||
"maintenance_integrity_missing_file_refresh_job": "刷新缺失文件报告",
|
||||
"maintenance_integrity_report": "完整性报告",
|
||||
"maintenance_integrity_untracked_file": "未跟踪文件",
|
||||
"maintenance_integrity_untracked_file_description": "在 Immich 的目录中,但没有任何纪录的文件。",
|
||||
"maintenance_integrity_untracked_file_job": "检查未跟踪文件",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "刷新未跟踪文件报告",
|
||||
"maintenance_restore_backup": "恢复备份",
|
||||
"maintenance_restore_backup_description": "Immich数据将被清除,并从选定的备份中恢复。在继续之前,将先创建一个当前数据的备份。",
|
||||
"maintenance_restore_backup_different_version": "此备份是由不同版本的 Immich 创建的!",
|
||||
@@ -915,6 +932,8 @@
|
||||
"deduplicate_all": "删除所有重复项",
|
||||
"default_locale": "默认语言",
|
||||
"default_locale_description": "根据您的浏览器区域格式化日期和数字",
|
||||
"default_quality_subtitle": "点击分享时使用的画质。长按分享按钮可每次手动选择。",
|
||||
"default_share_quality": "默认分享画质",
|
||||
"delete": "删除",
|
||||
"delete_action_confirmation_message": "您确定要删除此素材吗?此操作会将该素材移至服务器的回收站,并提示您是否将其在本地设备上删除",
|
||||
"delete_action_prompt": "已删除 {count} 项",
|
||||
@@ -1224,6 +1243,7 @@
|
||||
"failed": "失败",
|
||||
"failed_count": "失败: {count}次",
|
||||
"failed_to_authenticate": "身份验证失败",
|
||||
"failed_to_delete_file": "文件删除失败",
|
||||
"failed_to_load_assets": "照片/视频加载失败",
|
||||
"failed_to_load_folder": "文件夹加载失败",
|
||||
"favorite": "收藏",
|
||||
@@ -1354,6 +1374,7 @@
|
||||
"individual_share": "单独分享",
|
||||
"individual_shares": "单独分享",
|
||||
"info": "信息",
|
||||
"integrity_checks": "完整性检查",
|
||||
"interval": {
|
||||
"day_at_onepm": "每天下午 1 点",
|
||||
"hours": "每隔 {hours, plural, one {小时} other {{hours, number} 小时}}",
|
||||
@@ -1426,6 +1447,7 @@
|
||||
"linked_oauth_account": "已绑定的 OAuth 账户",
|
||||
"list": "列表",
|
||||
"live": "在线",
|
||||
"load_more": "加载更多",
|
||||
"loading": "加载中",
|
||||
"loading_search_results_failed": "加载搜索结果失败",
|
||||
"local": "本地",
|
||||
@@ -2084,6 +2106,7 @@
|
||||
"select_person": "选择人物",
|
||||
"select_person_to_tag": "选择要标记的人物",
|
||||
"select_photos": "选择照片",
|
||||
"select_quality": "选择画质",
|
||||
"select_trash_all": "全部删除",
|
||||
"select_user_for_sharing_page_err_album": "创建相簿失败",
|
||||
"selected": "已选择",
|
||||
@@ -2147,6 +2170,8 @@
|
||||
"share_assets_selected": "{count}已选择",
|
||||
"share_dialog_preparing": "准备中...",
|
||||
"share_link": "分享链接",
|
||||
"share_original": "使用原图(大)",
|
||||
"share_preview": "使用缩略图(小)",
|
||||
"shared": "共享",
|
||||
"shared_album_activities_input_disable": "评论已禁用",
|
||||
"shared_album_activity_remove_content": "是否删除此活动?",
|
||||
@@ -2248,6 +2273,7 @@
|
||||
"slideshow_repeat_description": "幻灯片结束后循环播放",
|
||||
"slideshow_settings": "放映设置",
|
||||
"smart_album": "智能相册",
|
||||
"some_assets_already_have_a_location_warning": "部分所选项目已有位置信息",
|
||||
"sort_albums_by": "相簿排序...",
|
||||
"sort_created": "创建日期",
|
||||
"sort_items": "项目数量",
|
||||
@@ -2368,11 +2394,13 @@
|
||||
"trash_page_title": "回收站 ({count})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "回收站中的项目将在{days, plural, one {#天} other {#天}}后被永久删除。",
|
||||
"trigger": "触发条件",
|
||||
"trigger_asset_metadata_extraction": "资源元数据提取",
|
||||
"trigger_asset_metadata_extraction_description": "当资源的EXIF元数据被提取时触发",
|
||||
"trigger_asset_uploaded": "资产上传",
|
||||
"trigger_asset_uploaded_description": "当上传新项目时触发",
|
||||
"trigger_description": "启动工作流的事件",
|
||||
"trigger_person_recognized": "人物已识别",
|
||||
"trigger_person_recognized_description": "当检测到人物时触发",
|
||||
"trigger_person_recognized_description": "当识别到人物时触发",
|
||||
"trigger_type": "触发类型",
|
||||
"troubleshoot": "故障排除",
|
||||
"type": "类型",
|
||||
|
||||
+87
-6
@@ -27,7 +27,8 @@
|
||||
"add_partner": "新增親友",
|
||||
"add_path": "新增路徑",
|
||||
"add_photos": "加入相片",
|
||||
"add_tag": "加入標籤",
|
||||
"add_step": "添加步驟",
|
||||
"add_tag": "新增標籤",
|
||||
"add_to": "加入至…",
|
||||
"add_to_album": "加入到相簿",
|
||||
"add_to_album_bottom_sheet_added": "已新增至 {album}",
|
||||
@@ -78,6 +79,7 @@
|
||||
"cron_expression_description": "使用 Cron 格式設定掃描間隔。更多資訊請參閱 <link>Crontab Guru</link>",
|
||||
"cron_expression_presets": "Cron 表達式預設值",
|
||||
"disable_login": "停用登入",
|
||||
"download_csv": "下載CSV檔案",
|
||||
"duplicate_detection_job_description": "針對資產執行機器學習以偵測相似圖片。需依賴「智慧搜尋」功能",
|
||||
"exclusion_pattern_description": "排除模式可讓您在掃描媒體庫時忽略特定檔案與資料夾。若某些資料夾包含您不想匯入的檔案(例如 RAW 檔),此功能將非常有用。",
|
||||
"export_config_as_json_description": "將目前系統設定下載為 JSON 檔案",
|
||||
@@ -187,9 +189,25 @@
|
||||
"machine_learning_smart_search_enabled": "啟用智慧搜尋",
|
||||
"machine_learning_smart_search_enabled_description": "若停用,影像將不會進行智慧搜尋編碼。",
|
||||
"machine_learning_url_description": "機器學習伺服器的 URL。若提供多個 URL,系統會依序逐一嘗試,直到其中一臺成功回應為止(由前到後)。未回應的伺服器將被暫時忽略,直到其重新上線。",
|
||||
"maintenance_backup_management": "管理備份",
|
||||
"maintenance_delete_backup": "刪除備份",
|
||||
"maintenance_delete_backup_description": "此檔案將被永久刪除且無法復原。",
|
||||
"maintenance_delete_error": "刪除備份失敗。",
|
||||
"maintenance_integrity_check": "檢查",
|
||||
"maintenance_integrity_check_all": "全部檢查",
|
||||
"maintenance_integrity_checksum_mismatch": "檢查碼不符",
|
||||
"maintenance_integrity_checksum_mismatch_description": "檔案的總和檢查碼與資料庫的不符。",
|
||||
"maintenance_integrity_checksum_mismatch_job": "檢查有否檢查碼不符",
|
||||
"maintenance_integrity_checksum_mismatch_refresh_job": "刷新檢查碼不符報告",
|
||||
"maintenance_integrity_missing_file": "缺失檔案",
|
||||
"maintenance_integrity_missing_file_description": "已在資料庫中追蹤,但檔案系統中並不存在的檔案。",
|
||||
"maintenance_integrity_missing_file_job": "檢查缺失檔案",
|
||||
"maintenance_integrity_missing_file_refresh_job": "刷新缺失檔案報告",
|
||||
"maintenance_integrity_report": "完整性報告",
|
||||
"maintenance_integrity_untracked_file": "未追蹤檔案",
|
||||
"maintenance_integrity_untracked_file_description": "在 Immich 的目錄中,但沒有任何紀錄的檔案。",
|
||||
"maintenance_integrity_untracked_file_job": "檢查未追蹤檔案",
|
||||
"maintenance_integrity_untracked_file_refresh_job": "刷新未追蹤檔案報告",
|
||||
"maintenance_restore_backup": "還原備份",
|
||||
"maintenance_restore_backup_description": "Immich 的資料將被清除,並從選取的備份還原。在繼續操作前,系統會先建立目前的資料備份。",
|
||||
"maintenance_restore_backup_different_version": "此備份是由不同版本的 Immich 所建立!",
|
||||
@@ -299,11 +317,13 @@
|
||||
"person_cleanup_job": "清理人物",
|
||||
"queue_details": "佇列資訊",
|
||||
"queues": "任務佇列",
|
||||
"queues_page_description": "管理員任務佇列頁面",
|
||||
"queues_page_description": "管理員任務序列頁面",
|
||||
"quota_size_gib": "配額大小(GiB)",
|
||||
"refreshing_all_libraries": "正在重新整理所有媒體庫",
|
||||
"registration": "管理者註冊",
|
||||
"registration_description": "由於您是系統上的第一位使用者,您將被指派為系統管理員,並負責管理相關事務,後續的其他使用者也將由您建立。",
|
||||
"release_channel_release_candidate": "候選發布版",
|
||||
"release_channel_stable": "稳定版",
|
||||
"remove_failed_jobs": "移除失敗任務",
|
||||
"require_password_change_on_login": "要求使用者在首次登入時變更密碼",
|
||||
"reset_settings_to_default": "將設定重設為預設值",
|
||||
@@ -398,6 +418,10 @@
|
||||
"transcoding_preferred_hardware_device_description": "僅適用於 VAAPI 和 QSV。設定用於硬體轉碼的 dri 節點。",
|
||||
"transcoding_preset_preset": "預設值(-preset)",
|
||||
"transcoding_preset_preset_description": "壓縮速度。較慢的預設值可產生體積較小的檔案,並在指定位元率時提升品質。VP9 會忽略高於「faster」的設定。",
|
||||
"transcoding_realtime": "即時轉碼 [實驗性功能]",
|
||||
"transcoding_realtime_description": "允許在影片串流傳輸(播放)的同時即時進行轉碼。此功能支援動態切換畫質,但根據伺服器效能的不同,可能會導致較高的播放延遲或畫面卡頓。",
|
||||
"transcoding_realtime_enabled": "啟用即時轉碼",
|
||||
"transcoding_realtime_enabled_description": "如果停用,伺服器將拒絕啟動新的即時轉碼工作階段。",
|
||||
"transcoding_reference_frames": "參考幀",
|
||||
"transcoding_reference_frames_description": "在壓縮特定幀時所參考的幀數量。數值越高可提升壓縮效率,但會降低編碼速度。設為 0 則自動決定此數值。",
|
||||
"transcoding_required_description": "僅限格式不被接受的影片",
|
||||
@@ -441,6 +465,8 @@
|
||||
"user_settings_description": "管理使用者設定",
|
||||
"user_successfully_removed": "已成功刪除使用者 {email}。",
|
||||
"users_page_description": "管理使用者頁面",
|
||||
"version_check_channel": "發佈渠道",
|
||||
"version_check_channel_description": "選擇您想要接收版本更新公告的發布渠道",
|
||||
"version_check_enabled_description": "啟用版本檢查",
|
||||
"version_check_implications": "版本檢查功能仰賴與 {server} 的定期通訊",
|
||||
"version_check_settings": "版本檢查",
|
||||
@@ -561,6 +587,7 @@
|
||||
"asset_added_to_album": "已新增至相簿",
|
||||
"asset_adding_to_album": "新增到相簿…",
|
||||
"asset_created": "項目已建立",
|
||||
"asset_day_count": "{date}: {count, plural, one {# 個資源} other {# 個資源}}",
|
||||
"asset_description_updated": "項目說明已更新",
|
||||
"asset_filename_is_offline": "項目 {filename} 已離線",
|
||||
"asset_has_unassigned_faces": "項目有未指派的臉孔",
|
||||
@@ -690,6 +717,7 @@
|
||||
"backup_settings_subtitle": "管理上傳設定",
|
||||
"backup_upload_details_page_more_details": "點擊查看更多詳細資訊",
|
||||
"backward": "由舊至新",
|
||||
"battery_optimization_backup_reliability": "停用最佳化電池充電可提高背景備份的可靠性",
|
||||
"biometric_auth_enabled": "生物辨識驗證已啟用",
|
||||
"biometric_locked_out": "生物辨識驗證已被鎖定",
|
||||
"biometric_no_options": "沒有生物辨識選項可用",
|
||||
@@ -697,6 +725,7 @@
|
||||
"birthdate_saved": "出生日期儲存成功",
|
||||
"birthdate_set_description": "出生日期用於計算此人在相片拍攝時的年齡。",
|
||||
"blurred_background": "背景模糊",
|
||||
"browse_templates": "瀏覽範本",
|
||||
"bugs_and_feature_requests": "錯誤及功能請求",
|
||||
"build": "建置編號",
|
||||
"build_image": "建置映像",
|
||||
@@ -730,6 +759,7 @@
|
||||
"cannot_update_the_description": "無法更新描述",
|
||||
"cast": "投放",
|
||||
"cast_description": "設定可用的投放裝置",
|
||||
"change": "更改",
|
||||
"change_date": "變更日期",
|
||||
"change_description": "變更描述",
|
||||
"change_display_order": "變更顯示順序",
|
||||
@@ -758,6 +788,7 @@
|
||||
"check_corrupt_asset_backup_description": "僅在已連線至 Wi-Fi 且所有項目已完成備份後執行此檢查。此程式可能需要數分鐘。",
|
||||
"check_logs": "檢查紀錄",
|
||||
"checksum": "校驗碼",
|
||||
"choose": "選擇",
|
||||
"choose_matching_people_to_merge": "選擇要合併的相符人物",
|
||||
"city": "城市",
|
||||
"cleanup_confirm_description": "Immich 發現有 {count} 個項目(建立於 {date} 之前)已安全備份至伺服器。是否要從此裝置中刪除本機副本?",
|
||||
@@ -775,6 +806,7 @@
|
||||
"clear": "清空",
|
||||
"clear_all": "全部清除",
|
||||
"clear_all_recent_searches": "清除所有最近的搜尋",
|
||||
"clear_failed_count": "清除失敗 ({count})",
|
||||
"clear_file_cache": "清除檔案快取",
|
||||
"clear_message": "清除訊息",
|
||||
"clear_value": "清除值",
|
||||
@@ -806,6 +838,7 @@
|
||||
"comments_are_disabled": "留言已停用",
|
||||
"common_create_new_album": "建立新相簿",
|
||||
"completed": "已完成",
|
||||
"configuration": "設定",
|
||||
"confirm": "確認",
|
||||
"confirm_admin_password": "確認管理員密碼",
|
||||
"confirm_delete_face": "您確定要從該項目中刪除 {name} 的臉孔嗎?",
|
||||
@@ -820,6 +853,7 @@
|
||||
"contain": "等比內縮",
|
||||
"context": "脈絡",
|
||||
"continue": "繼續",
|
||||
"control_bottom_app_bar_add_tags": "新增標籤",
|
||||
"control_bottom_app_bar_create_new_album": "建立新相簿",
|
||||
"control_bottom_app_bar_delete_from_immich": "從 Immich 伺服器中刪除",
|
||||
"control_bottom_app_bar_delete_from_local": "從裝置中刪除",
|
||||
@@ -833,6 +867,7 @@
|
||||
"copy_error": "複製錯誤",
|
||||
"copy_file_path": "複製檔案路徑",
|
||||
"copy_image": "複製圖片",
|
||||
"copy_json": "複製 JSON",
|
||||
"copy_link": "複製連結",
|
||||
"copy_link_to_clipboard": "複製連結到剪貼簿",
|
||||
"copy_password": "複製密碼",
|
||||
@@ -891,11 +926,14 @@
|
||||
"date_of_birth": "出生日期",
|
||||
"date_of_birth_saved": "出生日期儲存成功",
|
||||
"date_range": "日期範圍",
|
||||
"date_time_original": "原始日期/時間",
|
||||
"day": "日",
|
||||
"days": "日",
|
||||
"deduplicate_all": "刪除所有重複項目",
|
||||
"default_locale": "預設語言",
|
||||
"default_locale_description": "使用你的瀏覽器區域以格式日期和數字",
|
||||
"default_quality_subtitle": "點擊分享時使用的畫質。長按分享按鈕可每次手動選擇。",
|
||||
"default_share_quality": "預設分享畫質",
|
||||
"delete": "刪除",
|
||||
"delete_action_confirmation_message": "您確定要刪除此項目嗎?此動作會將該項目移至伺服器的垃圾桶,並詢問您是否要在本機同步刪除",
|
||||
"delete_action_prompt": "{count} 個已刪除",
|
||||
@@ -969,7 +1007,10 @@
|
||||
"downloading_asset_filename": "正在下載項目 {filename}",
|
||||
"downloading_from_icloud": "正從 iCloud 下載",
|
||||
"downloading_media": "正在下載媒體",
|
||||
"drag_to_reorder": "拖曳以重新排序",
|
||||
"drop_files_to_upload": "將檔案拖放到任何位置以上傳",
|
||||
"duplicate": "複製",
|
||||
"duplicate_workflow": "複製工作流程",
|
||||
"duplicates": "重複項目",
|
||||
"duplicates_description": "逐一檢查每個群組,並標示其中是否有重複項目。",
|
||||
"duration": "顯示時長",
|
||||
@@ -1071,6 +1112,7 @@
|
||||
"failed_to_remove_product_key": "移除產品金鑰失敗",
|
||||
"failed_to_reset_pin_code": "重設 PIN 碼失敗",
|
||||
"failed_to_stack_assets": "項目堆疊失敗",
|
||||
"failed_to_tag_assets": "標記資源失敗",
|
||||
"failed_to_unstack_assets": "解除項目堆疊失敗",
|
||||
"failed_to_update_notification_status": "無法更新通知狀態",
|
||||
"incorrect_email_or_password": "電子郵件或密碼錯誤",
|
||||
@@ -1190,15 +1232,18 @@
|
||||
"export_as_json": "匯出為 JSON",
|
||||
"export_database": "匯出資料庫",
|
||||
"export_database_description": "匯出 SQLite 資料庫",
|
||||
"exposure_time": "曝光時間",
|
||||
"extension": "副檔名",
|
||||
"external": "外部",
|
||||
"external_libraries": "外部媒體庫",
|
||||
"external_network": "外部網路",
|
||||
"external_network_sheet_info": "若未連網至偏好的 Wi-Fi,將依清單從上到下選擇可連線的伺服器網址",
|
||||
"f_number": "光圈值",
|
||||
"face_unassigned": "未指派",
|
||||
"failed": "失敗",
|
||||
"failed_count": "失敗:{count}",
|
||||
"failed_to_authenticate": "身份驗證失敗",
|
||||
"failed_to_delete_file": "無法刪除檔案",
|
||||
"failed_to_load_assets": "項目載入失敗",
|
||||
"failed_to_load_folder": "無法載入資料夾",
|
||||
"favorite": "收藏",
|
||||
@@ -1224,6 +1269,7 @@
|
||||
"find_them_fast": "透過搜尋姓名快速找到他們",
|
||||
"first": "第一個",
|
||||
"fix_incorrect_match": "修復不相符的",
|
||||
"focal_length": "焦距",
|
||||
"folder": "資料夾",
|
||||
"folder_not_found": "找不到資料夾",
|
||||
"folders": "資料夾",
|
||||
@@ -1328,6 +1374,7 @@
|
||||
"individual_share": "個別分享",
|
||||
"individual_shares": "個別分享",
|
||||
"info": "資訊",
|
||||
"integrity_checks": "完整性檢查",
|
||||
"interval": {
|
||||
"day_at_onepm": "每天下午 1 點",
|
||||
"hours": "每 {hours, plural, one {小時} other {{hours, number} 小時}}",
|
||||
@@ -1344,6 +1391,7 @@
|
||||
"ios_debug_info_no_sync_yet": "尚未執行任何背景同步任務",
|
||||
"ios_debug_info_processes_queued": "{count, plural, one {{count} 個背景程式已排程} other {{count} 個背景程式已排程}}",
|
||||
"ios_debug_info_processing_ran_at": "於 {dateTime} 執行處理",
|
||||
"iso": "ISO",
|
||||
"items_count": "{count, plural, one {# 個項目} other {# 個項目}}",
|
||||
"jobs": "任務",
|
||||
"json_editor": "JSON 編輯器",
|
||||
@@ -1374,6 +1422,7 @@
|
||||
"leave": "離開",
|
||||
"leave_album": "離開相簿",
|
||||
"lens_model": "鏡頭型號",
|
||||
"less": "收起",
|
||||
"let_others_respond": "允許他人回覆",
|
||||
"level": "等級",
|
||||
"library": "媒體庫",
|
||||
@@ -1397,7 +1446,8 @@
|
||||
"link_to_oauth": "連結 OAuth",
|
||||
"linked_oauth_account": "已連結 OAuth 帳號",
|
||||
"list": "清單",
|
||||
"live": "Live",
|
||||
"live": "線上",
|
||||
"load_more": "載入更多",
|
||||
"loading": "載入中",
|
||||
"loading_search_results_failed": "載入搜尋結果失敗",
|
||||
"local": "本機",
|
||||
@@ -1567,6 +1617,8 @@
|
||||
"merge_people_prompt": "您要合併這些人物嗎?此操作無法撤銷。",
|
||||
"merge_people_successfully": "成功合併人物",
|
||||
"merged_people_count": "已合併 {count, plural, other {# 位人物}}",
|
||||
"minFaces": "最少人臉數",
|
||||
"minFaces_description": "顯示該人物所需的最少已識別人臉數量",
|
||||
"minimize": "最小化",
|
||||
"minute": "分",
|
||||
"minutes": "分鐘",
|
||||
@@ -1576,9 +1628,10 @@
|
||||
"mobile_app": "行動應用程式",
|
||||
"mobile_app_download_onboarding_note": "請使用以下選項下載隨附的行動應用程式",
|
||||
"model": "型號",
|
||||
"modify_date": "修改日期",
|
||||
"month": "月",
|
||||
"more": "更多",
|
||||
"motion": "Motion",
|
||||
"motion": "動作",
|
||||
"move": "移動",
|
||||
"move_down": "向下移動",
|
||||
"move_off_locked_folder": "移出「已上鎖的資料夾」",
|
||||
@@ -1652,6 +1705,7 @@
|
||||
"no_results": "沒有結果",
|
||||
"no_results_description": "試試同義詞或更通用的關鍵字吧",
|
||||
"no_shared_albums_message": "建立共享相簿以分享相片與影片",
|
||||
"no_steps": "未添加任何步驟",
|
||||
"no_uploads_in_progress": "沒有正在上傳的項目",
|
||||
"none": "無",
|
||||
"not_allowed": "不允許",
|
||||
@@ -1660,6 +1714,7 @@
|
||||
"not_selected": "未選取",
|
||||
"notes": "提示",
|
||||
"nothing_here_yet": "暫無訊息",
|
||||
"notification_backup_reliability": "啟用通知可提高背景備份的可靠性",
|
||||
"notification_permission_dialog_content": "開啟通知,請前往「設定」,並選擇「允許」。",
|
||||
"notification_permission_list_tile_content": "開啟通知權限。",
|
||||
"notification_permission_list_tile_enable_button": "開啟通知",
|
||||
@@ -1697,6 +1752,7 @@
|
||||
"organize_into_albums": "整理成相簿",
|
||||
"organize_into_albums_description": "使用目前同步設定將現有相片放入相簿",
|
||||
"organize_your_library": "整理您的相簿",
|
||||
"orientation": "方向",
|
||||
"original": "原圖",
|
||||
"other": "其他",
|
||||
"other_devices": "其他裝置",
|
||||
@@ -1788,6 +1844,8 @@
|
||||
"play_original_video_setting_description": "優先播放原始影片而非轉碼後的影片。若原始項目不相容,可能無法正常播放。",
|
||||
"play_transcoded_video": "播放轉碼影片",
|
||||
"please_auth_to_access": "請進行身份驗證才能存取",
|
||||
"plugin_method_filter_type": "篩選",
|
||||
"plugin_method_filter_type_description": "此方法可篩選事件,並有條件地阻止後續步驟執行",
|
||||
"port": "連接埠",
|
||||
"preferences_settings_subtitle": "管理應用程式偏好設定",
|
||||
"preferences_settings_title": "偏好設定",
|
||||
@@ -1809,6 +1867,7 @@
|
||||
"profile_drawer_readonly_mode": "唯讀模式已啟用。長按使用者個人圖示即可關閉。",
|
||||
"profile_image_of_user": "{user} 的個人資料圖片",
|
||||
"profile_picture_set": "已設定個人資料圖片。",
|
||||
"projection_type": "投影類型",
|
||||
"public_album": "公開相簿",
|
||||
"public_share": "公開分享",
|
||||
"purchase_account_info": "支持者",
|
||||
@@ -2047,6 +2106,7 @@
|
||||
"select_person": "選取人物",
|
||||
"select_person_to_tag": "選擇要標記的人物",
|
||||
"select_photos": "選相片",
|
||||
"select_quality": "選擇畫質",
|
||||
"select_trash_all": "全部刪除",
|
||||
"select_user_for_sharing_page_err_album": "建立相簿失敗",
|
||||
"selected": "已選取",
|
||||
@@ -2110,6 +2170,8 @@
|
||||
"share_assets_selected": "已選取 {count} 項",
|
||||
"share_dialog_preparing": "正在準備...",
|
||||
"share_link": "分享連結",
|
||||
"share_original": "使用原圖 (大)",
|
||||
"share_preview": "使用縮圖(小)",
|
||||
"shared": "共享",
|
||||
"shared_album_activities_input_disable": "留言功能已停用",
|
||||
"shared_album_activity_remove_content": "您確定要刪除此活動嗎?",
|
||||
@@ -2178,7 +2240,9 @@
|
||||
"show_in_timeline": "在時間軸中顯示",
|
||||
"show_in_timeline_setting_description": "在您的時間軸中顯示這位使用者的相片和影片",
|
||||
"show_keyboard_shortcuts": "顯示鍵盤快捷鍵",
|
||||
"show_less": "收起",
|
||||
"show_metadata": "顯示詮釋資料",
|
||||
"show_more_fields": "{count, plural, one {顯示 # 個更多字段} other {顯示 # 個更多字段}}",
|
||||
"show_or_hide_info": "顯示或隱藏資訊",
|
||||
"show_password": "顯示密碼",
|
||||
"show_person_options": "顯示人物選項",
|
||||
@@ -2208,6 +2272,8 @@
|
||||
"slideshow_repeat": "重複投影片",
|
||||
"slideshow_repeat_description": "循環播放",
|
||||
"slideshow_settings": "幻燈片設定",
|
||||
"smart_album": "智能相簿",
|
||||
"some_assets_already_have_a_location_warning": "部分所選項目已有位置資訊",
|
||||
"sort_albums_by": "相簿排序依據...",
|
||||
"sort_created": "建立日期",
|
||||
"sort_items": "項目數量",
|
||||
@@ -2230,6 +2296,11 @@
|
||||
"start_date_before_end_date": "開始日期必須早於結束日期",
|
||||
"state": "地區",
|
||||
"status": "狀態",
|
||||
"step_delete": "刪除步驟",
|
||||
"step_delete_confirm": "確定要刪除此步驟嗎?",
|
||||
"step_details": "步驟詳情",
|
||||
"steps": "步驟",
|
||||
"steps_count": "{count, plural, one {# 個步驟} other {# 個步驟}}",
|
||||
"stop_casting": "停止投放",
|
||||
"stop_motion_photo": "停止動態相片",
|
||||
"stop_photo_sharing": "要停止分享您的相片嗎?",
|
||||
@@ -2323,11 +2394,13 @@
|
||||
"trash_page_title": "垃圾桶 ({count})",
|
||||
"trashed_items_will_be_permanently_deleted_after": "垃圾桶中的項目會在 {days, plural, other {# 天}}後永久刪除。",
|
||||
"trigger": "觸發",
|
||||
"trigger_asset_uploaded": "項目已上傳",
|
||||
"trigger_asset_metadata_extraction": "資源後設資料提取",
|
||||
"trigger_asset_metadata_extraction_description": "當資源的EXIF後設資料被提取時觸發",
|
||||
"trigger_asset_uploaded": "上傳項目",
|
||||
"trigger_asset_uploaded_description": "在上傳新項目時觸發",
|
||||
"trigger_description": "觸發工作流程的事件",
|
||||
"trigger_person_recognized": "已辨識人物",
|
||||
"trigger_person_recognized_description": "偵測到人物時觸發",
|
||||
"trigger_person_recognized_description": "識別到人物時觸發",
|
||||
"trigger_type": "觸發類型",
|
||||
"troubleshoot": "疑難排解",
|
||||
"type": "類型",
|
||||
@@ -2369,6 +2442,7 @@
|
||||
"updated_password": "已更新密碼",
|
||||
"upload": "上傳",
|
||||
"upload_concurrency": "上傳並行數",
|
||||
"upload_day_count": "{date}: {count, plural, one {# 個上傳} other {# 個上傳}}",
|
||||
"upload_details": "上傳詳細資訊",
|
||||
"upload_dialog_info": "是否要將所選項目備份到伺服器?",
|
||||
"upload_dialog_title": "上傳項目",
|
||||
@@ -2384,6 +2458,8 @@
|
||||
"upload_to_immich": "上傳至 Immich ({count})",
|
||||
"uploading": "上傳中",
|
||||
"uploading_media": "項目上傳中",
|
||||
"uploads": "上傳",
|
||||
"uploads_count": "{count, plural, one {# 個上傳} other {# 個上傳}}",
|
||||
"url": "網址",
|
||||
"usage": "用量",
|
||||
"use_biometric": "使用生物辨識",
|
||||
@@ -2391,6 +2467,7 @@
|
||||
"use_browser_locale_description": "根據你瀏覽器的語言和地區設定來更改日期,時間和數字的格式",
|
||||
"use_current_connection": "使用目前的連線",
|
||||
"use_custom_date_range": "改用自訂日期範圍",
|
||||
"use_template": "使用範本",
|
||||
"user": "使用者",
|
||||
"user_has_been_deleted": "此使用者已被刪除。",
|
||||
"user_id": "使用者 ID",
|
||||
@@ -2420,6 +2497,7 @@
|
||||
"video": "影片",
|
||||
"video_hover_setting": "滑鼠懸停時播放影片預覽",
|
||||
"video_hover_setting_description": "當滑鼠停在項目上時播放影片縮圖。即使停用此功能,仍可透過將滑鼠停在播放圖示上來開始播放。",
|
||||
"video_quality": "影片畫質",
|
||||
"videos": "影片",
|
||||
"videos_count": "{count, plural, other {# 部影片}}",
|
||||
"videos_only": "只允許影片",
|
||||
@@ -2452,8 +2530,10 @@
|
||||
"week": "週",
|
||||
"welcome": "歡迎",
|
||||
"welcome_to_immich": "歡迎使用 Immich",
|
||||
"when": "當",
|
||||
"width": "寬度",
|
||||
"wifi_name": "Wi-Fi 名稱",
|
||||
"workflow": "工作流程",
|
||||
"workflow_delete_prompt": "確定要刪除此工作流程嗎?",
|
||||
"workflow_deleted": "工作流程已刪除",
|
||||
"workflow_description": "工作流程說明",
|
||||
@@ -2463,6 +2543,7 @@
|
||||
"workflow_name": "工作流程名稱",
|
||||
"workflow_navigation_prompt": "您確定要不儲存變更就離開嗎?",
|
||||
"workflow_summary": "工作流程摘要",
|
||||
"workflow_templates": "工作流程範本",
|
||||
"workflow_update_success": "已成功更新工作流程",
|
||||
"workflow_updated": "工作流程已更新",
|
||||
"workflows": "工作流程",
|
||||
|
||||
@@ -48,14 +48,14 @@ FROM python:3.13-slim-trixie@sha256:f82c96458eedc847b233e582eb31336f4954b39cae02
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install --no-install-recommends -yqq ocl-icd-libopencl1 wget && \
|
||||
wget -nv https://github.com/intel/intel-graphics-compiler/releases/download/v2.34.4/intel-igc-core-2_2.34.4+21428_amd64.deb && \
|
||||
wget -nv https://github.com/intel/intel-graphics-compiler/releases/download/v2.34.4/intel-igc-opencl-2_2.34.4+21428_amd64.deb && \
|
||||
wget -nv https://github.com/intel/compute-runtime/releases/download/26.18.38308.1/intel-opencl-icd_26.18.38308.1-0_amd64.deb && \
|
||||
wget -nv https://github.com/intel/intel-graphics-compiler/releases/download/v2.36.3/intel-igc-core-2_2.36.3+21719_amd64.deb && \
|
||||
wget -nv https://github.com/intel/intel-graphics-compiler/releases/download/v2.36.3/intel-igc-opencl-2_2.36.3+21719_amd64.deb && \
|
||||
wget -nv https://github.com/intel/compute-runtime/releases/download/26.22.38646.4/intel-opencl-icd_26.22.38646.4-0_amd64.deb && \
|
||||
wget -nv https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17537.24/intel-igc-core_1.0.17537.24_amd64.deb && \
|
||||
wget -nv https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17537.24/intel-igc-opencl_1.0.17537.24_amd64.deb && \
|
||||
wget -nv https://github.com/intel/compute-runtime/releases/download/24.35.30872.36/intel-opencl-icd-legacy1_24.35.30872.36_amd64.deb && \
|
||||
# TODO: Figure out how to get renovate to manage this differently versioned libigdgmm file
|
||||
wget -nv https://github.com/intel/compute-runtime/releases/download/26.18.38308.1/libigdgmm12_22.10.0_amd64.deb && \
|
||||
wget -nv https://github.com/intel/compute-runtime/releases/download/26.22.38646.4/libigdgmm12_22.10.0_amd64.deb && \
|
||||
dpkg -i *.deb && \
|
||||
rm *.deb && \
|
||||
apt-get remove wget -yqq && \
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "immich-ml"
|
||||
version = "3.0.0rc0"
|
||||
version = "3.0.0rc1"
|
||||
description = ""
|
||||
authors = [{ name = "Hau Tran", email = "alex.tran1502@gmail.com" }]
|
||||
requires-python = ">=3.11,<4.0"
|
||||
|
||||
Generated
+1
-1
@@ -974,7 +974,7 @@ wheels = [
|
||||
|
||||
[[package]]
|
||||
name = "immich-ml"
|
||||
version = "3.0.0rc0"
|
||||
version = "3.0.0rc1"
|
||||
source = { editable = "." }
|
||||
dependencies = [
|
||||
{ name = "aiocache" },
|
||||
|
||||
@@ -82,6 +82,69 @@ url_api = "https://api.github.com/repos/extism/js-pdk/releases/assets/353224133"
|
||||
version = "7.1.3-6"
|
||||
backend = "github:jellyfin/jellyfin-ffmpeg"
|
||||
|
||||
[tools."github:jellyfin/jellyfin-ffmpeg".options]
|
||||
asset_pattern = "jellyfin-ffmpeg_*_portable_linuxarm64-gpl.tar.xz"
|
||||
|
||||
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.linux-arm64"]
|
||||
checksum = "sha256:bea03c670e8cc5bfe9edc0c5d624d4735421610cef5e808db93e7d8596952886"
|
||||
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_linuxarm64-gpl.tar.xz"
|
||||
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/409048876"
|
||||
|
||||
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.linux-arm64-musl"]
|
||||
checksum = "sha256:bea03c670e8cc5bfe9edc0c5d624d4735421610cef5e808db93e7d8596952886"
|
||||
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_linuxarm64-gpl.tar.xz"
|
||||
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/409048876"
|
||||
|
||||
[[tools."github:jellyfin/jellyfin-ffmpeg"]]
|
||||
version = "7.1.3-6"
|
||||
backend = "github:jellyfin/jellyfin-ffmpeg"
|
||||
|
||||
[tools."github:jellyfin/jellyfin-ffmpeg".options]
|
||||
asset_pattern = "jellyfin-ffmpeg_*_portable_linux64-gpl.tar.xz"
|
||||
|
||||
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.linux-x64"]
|
||||
checksum = "sha256:39e99a7927468a6abec5f65d00f55010e8ff2ae3c2605294f179c94f6ae21af2"
|
||||
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_linux64-gpl.tar.xz"
|
||||
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/409048879"
|
||||
|
||||
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.linux-x64-musl"]
|
||||
checksum = "sha256:39e99a7927468a6abec5f65d00f55010e8ff2ae3c2605294f179c94f6ae21af2"
|
||||
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_linux64-gpl.tar.xz"
|
||||
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/409048879"
|
||||
|
||||
[[tools."github:jellyfin/jellyfin-ffmpeg"]]
|
||||
version = "7.1.3-6"
|
||||
backend = "github:jellyfin/jellyfin-ffmpeg"
|
||||
|
||||
[tools."github:jellyfin/jellyfin-ffmpeg".options]
|
||||
asset_pattern = "jellyfin-ffmpeg_*_portable_macarm64-gpl.tar.xz"
|
||||
|
||||
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.macos-arm64"]
|
||||
checksum = "sha256:e024d5e78d5414e75f0181036cd21373fafb9270c72894dfd7dbda2572439820"
|
||||
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_macarm64-gpl.tar.xz"
|
||||
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/408995838"
|
||||
|
||||
[[tools."github:jellyfin/jellyfin-ffmpeg"]]
|
||||
version = "7.1.3-6"
|
||||
backend = "github:jellyfin/jellyfin-ffmpeg"
|
||||
|
||||
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.windows-x64"]
|
||||
checksum = "sha256:7b7168149689610296f3a187c717056ce0786cc125a31caf28056737e9ba1cc1"
|
||||
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_win64-clang-gpl.zip"
|
||||
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/409036094"
|
||||
|
||||
[[tools."github:jellyfin/jellyfin-ffmpeg"]]
|
||||
version = "7.1.3-6"
|
||||
backend = "github:jellyfin/jellyfin-ffmpeg"
|
||||
|
||||
[tools."github:jellyfin/jellyfin-ffmpeg".options]
|
||||
asset_pattern = "jellyfin-ffmpeg_*_portable_mac64-gpl.tar.xz"
|
||||
|
||||
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.macos-x64"]
|
||||
checksum = "sha256:066ede9774aaae97a18098aaeea8b7e0d286653eb8618f640476e99c59a536c2"
|
||||
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_mac64-gpl.tar.xz"
|
||||
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/408995889"
|
||||
|
||||
[[tools."github:webassembly/binaryen"]]
|
||||
version = "version_124"
|
||||
backend = "github:webassembly/binaryen"
|
||||
@@ -145,6 +208,33 @@ url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c55847602
|
||||
checksum = "sha256:b6c17e747ae78cdd6de4d7532b3164b277daee97c007d3eaa2b39cca99882664"
|
||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_windows-x64_bin.zip"
|
||||
|
||||
[[tools.java]]
|
||||
version = "21.0.2"
|
||||
backend = "core:java"
|
||||
|
||||
[tools.java.options]
|
||||
shorthand_vendor = "openjdk"
|
||||
|
||||
[tools.java."platforms.linux-arm64"]
|
||||
checksum = "sha256:08db1392a48d4eb5ea5315cf8f18b89dbaf36cda663ba882cf03c704c9257ec2"
|
||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-aarch64_bin.tar.gz"
|
||||
|
||||
[tools.java."platforms.linux-x64"]
|
||||
checksum = "sha256:a2def047a73941e01a73739f92755f86b895811afb1f91243db214cff5bdac3f"
|
||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-x64_bin.tar.gz"
|
||||
|
||||
[tools.java."platforms.macos-arm64"]
|
||||
checksum = "sha256:b3d588e16ec1e0ef9805d8a696591bd518a5cea62567da8f53b5ce32d11d22e4"
|
||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_macos-aarch64_bin.tar.gz"
|
||||
|
||||
[tools.java."platforms.macos-x64"]
|
||||
checksum = "sha256:8fd09e15dc406387a0aba70bf5d99692874e999bf9cd9208b452b5d76ac922d3"
|
||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_macos-x64_bin.tar.gz"
|
||||
|
||||
[tools.java."platforms.windows-x64"]
|
||||
checksum = "sha256:b6c17e747ae78cdd6de4d7532b3164b277daee97c007d3eaa2b39cca99882664"
|
||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_windows-x64_bin.zip"
|
||||
|
||||
[[tools.node]]
|
||||
version = "24.15.0"
|
||||
backend = "core:node"
|
||||
@@ -214,37 +304,37 @@ checksum = "sha256:27323f70c875b8251bfd7e61a4cffc3ebff4e56ed1e611b955016f0c70773
|
||||
url = "https://github.com/opentofu/opentofu/releases/download/v1.11.6/tofu_1.11.6_windows_amd64.tar.gz"
|
||||
|
||||
[[tools.pnpm]]
|
||||
version = "11.5.2"
|
||||
version = "11.6.0"
|
||||
backend = "aqua:pnpm/pnpm"
|
||||
|
||||
[tools.pnpm."platforms.linux-arm64"]
|
||||
checksum = "sha256:7fef0c74081135d777754fccf25272f698e504b26ba0568504846c0cea402f8f"
|
||||
url = "https://github.com/pnpm/pnpm/releases/download/v11.5.2/pnpm-linux-arm64.tar.gz"
|
||||
checksum = "sha256:2fec653ff6dadab340d1c3d2214688a7451cc471f39710839440b293ca7c53b0"
|
||||
url = "https://github.com/pnpm/pnpm/releases/download/v11.6.0/pnpm-linux-arm64.tar.gz"
|
||||
provenance = "github-attestations"
|
||||
|
||||
[tools.pnpm."platforms.linux-arm64-musl"]
|
||||
checksum = "sha256:843beed7bca760276d29f8950ca219600995d345dbc93fad8150b3e5f83b74d4"
|
||||
url = "https://github.com/pnpm/pnpm/releases/download/v11.5.2/pnpm-linux-arm64-musl.tar.gz"
|
||||
checksum = "sha256:56a78c08cf22adf29e7dacb6f7f100139731693863d20fb94a7883463a62169e"
|
||||
url = "https://github.com/pnpm/pnpm/releases/download/v11.6.0/pnpm-linux-arm64-musl.tar.gz"
|
||||
provenance = "github-attestations"
|
||||
|
||||
[tools.pnpm."platforms.linux-x64"]
|
||||
checksum = "sha256:2033a702618c8576dc6bb0f6adb3a67ab506031351ddd59ca50d1bcaf5d13dc5"
|
||||
url = "https://github.com/pnpm/pnpm/releases/download/v11.5.2/pnpm-linux-x64.tar.gz"
|
||||
checksum = "sha256:74d64c1646385fb21691f32f0ab6aca1a9f5c829ba54d3cda3a24838a228e68c"
|
||||
url = "https://github.com/pnpm/pnpm/releases/download/v11.6.0/pnpm-linux-x64.tar.gz"
|
||||
provenance = "github-attestations"
|
||||
|
||||
[tools.pnpm."platforms.linux-x64-musl"]
|
||||
checksum = "sha256:0b794b23461c7475f7ffc29c4945692838b51ddadd857a2ace8edf0018798305"
|
||||
url = "https://github.com/pnpm/pnpm/releases/download/v11.5.2/pnpm-linux-x64-musl.tar.gz"
|
||||
checksum = "sha256:7a0c463a09d912fba6b7d9eca0a946bc228ea50f3015a05c09a29e7e85a932d7"
|
||||
url = "https://github.com/pnpm/pnpm/releases/download/v11.6.0/pnpm-linux-x64-musl.tar.gz"
|
||||
provenance = "github-attestations"
|
||||
|
||||
[tools.pnpm."platforms.macos-arm64"]
|
||||
checksum = "sha256:54993dae26bea0f3c1b0e15f9427f6f6a86827d56f32d1d1554d8cda59a62399"
|
||||
url = "https://github.com/pnpm/pnpm/releases/download/v11.5.2/pnpm-darwin-arm64.tar.gz"
|
||||
checksum = "sha256:87c901635a14481fb30566a3749041134ffd4317bc6fe866c345b69fdf9b6b85"
|
||||
url = "https://github.com/pnpm/pnpm/releases/download/v11.6.0/pnpm-darwin-arm64.tar.gz"
|
||||
provenance = "github-attestations"
|
||||
|
||||
[tools.pnpm."platforms.windows-x64"]
|
||||
checksum = "sha256:b3ddff2c2bf87d3996fadf074bac58cd2259f718a17912a04ae930e3775b30e9"
|
||||
url = "https://github.com/pnpm/pnpm/releases/download/v11.5.2/pnpm-win32-x64.zip"
|
||||
checksum = "sha256:91c753435542b04859c689304fae0dd64eba6b40937cfa426a48485b712e4e9c"
|
||||
url = "https://github.com/pnpm/pnpm/releases/download/v11.6.0/pnpm-win32-x64.zip"
|
||||
provenance = "github-attestations"
|
||||
|
||||
[[tools.terragrunt]]
|
||||
|
||||
@@ -16,7 +16,7 @@ config_roots = [
|
||||
|
||||
[tools]
|
||||
node = "24.15.0"
|
||||
pnpm = "11.5.2"
|
||||
pnpm = "11.6.0"
|
||||
terragrunt = "1.0.3"
|
||||
opentofu = "1.11.6"
|
||||
"npm:oazapfts" = "7.5.0"
|
||||
|
||||
@@ -22,8 +22,8 @@ platform :android do
|
||||
task: 'bundle',
|
||||
build_type: 'Release',
|
||||
properties: {
|
||||
"android.injected.version.code" => 3048,
|
||||
"android.injected.version.name" => "3.0.0-rc.0",
|
||||
"android.injected.version.code" => 3049,
|
||||
"android.injected.version.name" => "3.0.0-rc.1",
|
||||
}
|
||||
)
|
||||
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', track: 'beta')
|
||||
@@ -35,8 +35,8 @@ platform :android do
|
||||
task: 'bundle',
|
||||
build_type: 'Release',
|
||||
properties: {
|
||||
"android.injected.version.code" => 3048,
|
||||
"android.injected.version.name" => "3.0.0-rc.0",
|
||||
"android.injected.version.code" => 3049,
|
||||
"android.injected.version.name" => "3.0.0-rc.1",
|
||||
}
|
||||
)
|
||||
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')
|
||||
|
||||
@@ -15,8 +15,10 @@ const Map<String, Locale> locales = {
|
||||
'Czech (cs)': Locale('cs'),
|
||||
'Danish (da)': Locale('da'),
|
||||
'Dutch (nl)': Locale('nl'),
|
||||
'English (United Kingdom) (en_GB)': Locale('en', 'GB'),
|
||||
'Estonian (et)': Locale('et'),
|
||||
'Filipino (tl)': Locale('tl'),
|
||||
'Filipino (fil)': Locale('fil'),
|
||||
'Filipino (Tagalog) (tl)': Locale('tl'),
|
||||
'Finnish (fi)': Locale('fi'),
|
||||
'French (fr)': Locale('fr'),
|
||||
'Galician (gl)': Locale('gl'),
|
||||
|
||||
@@ -142,7 +142,6 @@ class AppConfig {
|
||||
.cleanupCutoffDaysAgo => cleanup.cutoffDaysAgo,
|
||||
.cleanupDefaultsInitialized => cleanup.defaultsInitialized,
|
||||
.shareFileType => share.fileType,
|
||||
.slideshowTransition => slideshow.transition,
|
||||
.slideshowRepeat => slideshow.repeat,
|
||||
.slideshowDuration => slideshow.duration,
|
||||
.slideshowLook => slideshow.look,
|
||||
@@ -196,7 +195,6 @@ class AppConfig {
|
||||
.cleanupCutoffDaysAgo => copyWith(cleanup: cleanup.copyWith(cutoffDaysAgo: value as int)),
|
||||
.cleanupDefaultsInitialized => copyWith(cleanup: cleanup.copyWith(defaultsInitialized: value as bool)),
|
||||
.shareFileType => copyWith(share: share.copyWith(fileType: value as ShareAssetType)),
|
||||
.slideshowTransition => copyWith(slideshow: slideshow.copyWith(transition: value as bool)),
|
||||
.slideshowRepeat => copyWith(slideshow: slideshow.copyWith(repeat: value as bool)),
|
||||
.slideshowDuration => copyWith(slideshow: slideshow.copyWith(duration: value as int)),
|
||||
.slideshowLook => copyWith(slideshow: slideshow.copyWith(look: value as SlideshowLook)),
|
||||
|
||||
@@ -1,48 +1,38 @@
|
||||
import 'package:immich_mobile/constants/enums.dart';
|
||||
|
||||
class SlideshowConfig {
|
||||
final bool transition;
|
||||
final bool repeat;
|
||||
final int duration;
|
||||
final SlideshowLook look;
|
||||
final SlideshowDirection direction;
|
||||
|
||||
const SlideshowConfig({
|
||||
this.transition = true,
|
||||
this.repeat = true,
|
||||
this.duration = 5,
|
||||
this.look = SlideshowLook.contain,
|
||||
this.look = SlideshowLook.blurredBackground,
|
||||
this.direction = SlideshowDirection.forward,
|
||||
});
|
||||
|
||||
SlideshowConfig copyWith({
|
||||
bool? transition,
|
||||
bool? repeat,
|
||||
int? duration,
|
||||
SlideshowLook? look,
|
||||
SlideshowDirection? direction,
|
||||
}) => SlideshowConfig(
|
||||
transition: transition ?? this.transition,
|
||||
repeat: repeat ?? this.repeat,
|
||||
duration: duration ?? this.duration,
|
||||
look: look ?? this.look,
|
||||
direction: direction ?? this.direction,
|
||||
);
|
||||
SlideshowConfig copyWith({bool? repeat, int? duration, SlideshowLook? look, SlideshowDirection? direction}) =>
|
||||
SlideshowConfig(
|
||||
repeat: repeat ?? this.repeat,
|
||||
duration: duration ?? this.duration,
|
||||
look: look ?? this.look,
|
||||
direction: direction ?? this.direction,
|
||||
);
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) =>
|
||||
identical(this, other) ||
|
||||
(other is SlideshowConfig &&
|
||||
other.transition == transition &&
|
||||
other.repeat == repeat &&
|
||||
other.duration == duration &&
|
||||
other.look == look &&
|
||||
other.direction == direction);
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(transition, repeat, duration, look, direction);
|
||||
int get hashCode => Object.hash(repeat, duration, look, direction);
|
||||
|
||||
@override
|
||||
String toString() =>
|
||||
'SlideshowConfig(transition: $transition, repeat: $repeat, duration: $duration, look: $look, direction: $direction)';
|
||||
String toString() => 'SlideshowConfig(repeat: $repeat, duration: $duration, look: $look, direction: $direction)';
|
||||
}
|
||||
|
||||
@@ -70,7 +70,6 @@ enum SettingsKey<T> {
|
||||
shareFileType<ShareAssetType>(codec: _EnumCodec(ShareAssetType.values)),
|
||||
|
||||
// Slideshow
|
||||
slideshowTransition<bool>(),
|
||||
slideshowRepeat<bool>(),
|
||||
slideshowDuration<int>(),
|
||||
slideshowLook<SlideshowLook>(codec: _EnumCodec(SlideshowLook.values)),
|
||||
|
||||
@@ -104,6 +104,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
|
||||
Future<void> onAndroidUpload(int? maxMinutes) async {
|
||||
final hashTimeout = Duration(minutes: _isBackupEnabled ? 3 : 6);
|
||||
final backupTimeout = maxMinutes != null ? Duration(minutes: maxMinutes - 1) : null;
|
||||
await _optimizeDB();
|
||||
return _backgroundLoop(
|
||||
hashTimeout: hashTimeout,
|
||||
backupTimeout: backupTimeout,
|
||||
@@ -123,6 +124,11 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
|
||||
return;
|
||||
}
|
||||
|
||||
// Only for Background Processing tasks
|
||||
if (maxSeconds == null) {
|
||||
await _optimizeDB();
|
||||
}
|
||||
|
||||
// Run sync local, sync remote, hash and backup concurrently so the bg
|
||||
// refresh task (20s budget) can make progress on all four instead of
|
||||
// racing them sequentially. Phases are independent at the data layer:
|
||||
@@ -193,6 +199,14 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _optimizeDB() async {
|
||||
try {
|
||||
await (_drift.optimize(allTables: true), _driftLogger.optimize()).wait;
|
||||
} catch (error, stack) {
|
||||
dPrint(() => "Error during background worker optimize: $error, $stack");
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _cleanup() async {
|
||||
await runZonedGuarded(_handleCleanup, (error, stack) {
|
||||
dPrint(() => "Error during background worker cleanup: $error, $stack");
|
||||
@@ -221,7 +235,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
|
||||
if (nativeSyncApi != null) nativeSyncApi.cancelHashing(),
|
||||
]);
|
||||
await workerManagerPatch.dispose().catchError((_) async {});
|
||||
await Future.wait([LogService.I.dispose(), Store.dispose(), _drift.optimize(allTables: true)]);
|
||||
await Future.wait([LogService.I.dispose(), Store.dispose()]);
|
||||
await _drift.close();
|
||||
await _driftLogger.close();
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@ import 'package:immich_mobile/domain/services/store.service.dart';
|
||||
import 'package:immich_mobile/infrastructure/repositories/local_album.repository.dart';
|
||||
import 'package:immich_mobile/infrastructure/repositories/remote_album.repository.dart';
|
||||
import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
|
||||
import 'package:immich_mobile/providers/infrastructure/cancel.provider.dart';
|
||||
import 'package:immich_mobile/providers/infrastructure/store.provider.dart';
|
||||
import 'package:immich_mobile/repositories/drift_album_api_repository.dart';
|
||||
import 'package:immich_mobile/utils/debug_print.dart';
|
||||
@@ -19,7 +18,6 @@ final syncLinkedAlbumServiceProvider = Provider(
|
||||
ref.watch(remoteAlbumRepository),
|
||||
ref.watch(driftAlbumApiRepositoryProvider),
|
||||
ref.watch(storeServiceProvider),
|
||||
cancellation: ref.watch(cancellationProvider),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -28,19 +26,17 @@ class SyncLinkedAlbumService {
|
||||
final DriftRemoteAlbumRepository _remoteAlbumRepository;
|
||||
final DriftAlbumApiRepository _albumApiRepository;
|
||||
final StoreService _storeService;
|
||||
final Completer<void>? _cancellation;
|
||||
|
||||
SyncLinkedAlbumService(
|
||||
this._localAlbumRepository,
|
||||
this._remoteAlbumRepository,
|
||||
this._albumApiRepository,
|
||||
this._storeService, {
|
||||
this._cancellation,
|
||||
});
|
||||
this._storeService,
|
||||
);
|
||||
|
||||
final _log = Logger("SyncLinkedAlbumService");
|
||||
|
||||
Future<void> syncLinkedAlbums(String userId) async {
|
||||
Future<void> syncLinkedAlbums(String userId, {Completer<void>? cancellation}) async {
|
||||
final selectedAlbums = await _localAlbumRepository.getBackupAlbums();
|
||||
|
||||
await Future.wait(
|
||||
@@ -64,7 +60,7 @@ class SyncLinkedAlbumService {
|
||||
final album = await _albumApiRepository.addAssets(
|
||||
remoteAlbum.id,
|
||||
assetIds,
|
||||
abortTrigger: _cancellation?.future,
|
||||
abortTrigger: cancellation?.future,
|
||||
);
|
||||
await _remoteAlbumRepository.addAssets(remoteAlbum.id, album.added);
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ 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/entities/store.entity.dart';
|
||||
import 'package:immich_mobile/providers/infrastructure/cancel.provider.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
|
||||
Future<void> syncLinkedAlbumsIsolated(ProviderContainer ref) {
|
||||
@@ -10,5 +11,7 @@ Future<void> syncLinkedAlbumsIsolated(ProviderContainer ref) {
|
||||
Logger("SyncLinkedAlbum").warning("No user logged in, skipping linked album sync");
|
||||
return Future.value();
|
||||
}
|
||||
return ref.read(syncLinkedAlbumServiceProvider).syncLinkedAlbums(user.id);
|
||||
return ref
|
||||
.read(syncLinkedAlbumServiceProvider)
|
||||
.syncLinkedAlbums(user.id, cancellation: ref.read(cancellationProvider));
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'package:drift/drift.dart';
|
||||
import 'package:drift_sqlite_async/drift_sqlite_async.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/log.entity.dart';
|
||||
import 'package:immich_mobile/infrastructure/repositories/logger_db.repository.drift.dart';
|
||||
import 'package:immich_mobile/utils/debug_print.dart';
|
||||
import 'package:sqlite_async/sqlite_async.dart';
|
||||
|
||||
@DriftDatabase(tables: [LogMessageEntity])
|
||||
@@ -13,6 +14,14 @@ class DriftLogger extends $DriftLogger {
|
||||
@override
|
||||
int get schemaVersion => 1;
|
||||
|
||||
Future<void> optimize() async {
|
||||
try {
|
||||
await customStatement('PRAGMA optimize=0x10002');
|
||||
} catch (error) {
|
||||
dPrint(() => 'Failed to optimize logger database: $error');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
MigrationStrategy get migration => MigrationStrategy(
|
||||
beforeOpen: (details) async {
|
||||
|
||||
@@ -25,8 +25,8 @@ class DriftMemoryRepository extends DriftDatabaseRepository {
|
||||
])
|
||||
..where(_db.memoryEntity.ownerId.equals(ownerId))
|
||||
..where(_db.memoryEntity.deletedAt.isNull())
|
||||
..where(_db.memoryEntity.showAt.isSmallerOrEqualValue(localUtc))
|
||||
..where(_db.memoryEntity.hideAt.isBiggerOrEqualValue(localUtc))
|
||||
..where(_db.memoryEntity.showAt.isNull() | _db.memoryEntity.showAt.isSmallerOrEqualValue(localUtc))
|
||||
..where(_db.memoryEntity.hideAt.isNull() | _db.memoryEntity.hideAt.isBiggerOrEqualValue(localUtc))
|
||||
..orderBy([OrderingTerm.desc(_db.memoryEntity.memoryAt), OrderingTerm.asc(_db.remoteAssetEntity.createdAt)]);
|
||||
|
||||
final rows = await query.get();
|
||||
|
||||
@@ -33,7 +33,9 @@ class DriftSlideshowPage extends ConsumerStatefulWidget {
|
||||
ConsumerState<DriftSlideshowPage> createState() => _DriftSlideshowPageState();
|
||||
}
|
||||
|
||||
class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
||||
class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> with SingleTickerProviderStateMixin {
|
||||
static const double _kenBurnsZoom = 0.1;
|
||||
|
||||
late SlideshowConfig _config;
|
||||
late final PageController _pageController;
|
||||
late final Stopwatch _stopwatch;
|
||||
@@ -43,6 +45,12 @@ class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
||||
bool _paused = false;
|
||||
bool _showAppBar = false;
|
||||
|
||||
late final AnimationController _crossfadeController;
|
||||
late final Animation<double> _crossfadeOpacity;
|
||||
int? _crossfadeFromIndex;
|
||||
int? _crossfadeToIndex;
|
||||
int _zoomCycle = 0;
|
||||
|
||||
@override
|
||||
initState() {
|
||||
super.initState();
|
||||
@@ -50,6 +58,8 @@ class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
||||
final asset = ref.read(assetViewerProvider).currentAsset;
|
||||
_index = asset == null ? 0 : widget.timeline.getIndex(asset.heroTag) ?? 0;
|
||||
_pageController = PageController(initialPage: _index);
|
||||
_crossfadeController = AnimationController(vsync: this, duration: Durations.extralong2);
|
||||
_crossfadeOpacity = Tween<double>(begin: 1.0, end: 0.0).animate(_crossfadeController);
|
||||
_stopwatch = Stopwatch();
|
||||
_createTimer();
|
||||
_updateNextIndex();
|
||||
@@ -64,6 +74,7 @@ class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
||||
_timer.cancel();
|
||||
_stopwatch.stop();
|
||||
_pageController.dispose();
|
||||
_crossfadeController.dispose();
|
||||
unawaited(WakelockPlus.disable());
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
|
||||
super.dispose();
|
||||
@@ -150,11 +161,64 @@ class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
||||
await widget.timeline.preloadAssets(_nextIndex);
|
||||
}
|
||||
|
||||
if (_config.direction == SlideshowDirection.shuffle || !_config.transition) {
|
||||
_pageController.jumpToPage(_nextIndex);
|
||||
_crossFadeToPage(_nextIndex);
|
||||
}
|
||||
|
||||
void _crossFadeToPage(int page) {
|
||||
final previousIndex = _index;
|
||||
_pageController.jumpToPage(page);
|
||||
setState(() {
|
||||
_crossfadeFromIndex = previousIndex;
|
||||
_crossfadeToIndex = page;
|
||||
});
|
||||
_crossfadeController.forward(from: 0.0).whenComplete(() {
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_crossfadeFromIndex = null;
|
||||
_crossfadeToIndex = null;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Widget _getCrossfadeLayer(BuildContext context, int index, {required bool isIncoming}) {
|
||||
final asset = widget.timeline.getAssetSafe(index);
|
||||
|
||||
final Widget child;
|
||||
if (isIncoming && asset?.isImage == true) {
|
||||
child = _getPhotoView(context, index);
|
||||
} else {
|
||||
unawaited(_pageController.animateToPage(_nextIndex, duration: Durations.long2, curve: Curves.easeIn));
|
||||
final zoomOut = isIncoming ? _zoomCycle.isOdd : _zoomCycle.isEven;
|
||||
final zoom = isIncoming ? (zoomOut ? 1.0 : 0.0) : (zoomOut ? 0.0 : 1.0);
|
||||
child = _getCrossfadeChild(context, index, zoom);
|
||||
}
|
||||
|
||||
return Stack(
|
||||
fit: StackFit.expand,
|
||||
children: [if (_config.look == SlideshowLook.blurredBackground) _getBlur(context, index), child],
|
||||
);
|
||||
}
|
||||
|
||||
Widget _getCrossfadeChild(BuildContext context, int index, double zoom) {
|
||||
final asset = widget.timeline.getAssetSafe(index);
|
||||
|
||||
if (asset == null) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
final scale = _config.look == SlideshowLook.cover
|
||||
? PhotoViewComputedScale.covered
|
||||
: PhotoViewComputedScale.contained;
|
||||
|
||||
return PhotoView(
|
||||
imageProvider: getFullImageProvider(asset, size: context.sizeData),
|
||||
index: index,
|
||||
disableScaleGestures: true,
|
||||
gaplessPlayback: true,
|
||||
filterQuality: FilterQuality.high,
|
||||
initialScale: scale * (1.0 + zoom * _kenBurnsZoom),
|
||||
controller: PhotoViewController(),
|
||||
);
|
||||
}
|
||||
|
||||
void _createTimer() {
|
||||
@@ -172,6 +236,7 @@ class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
||||
|
||||
setState(() {
|
||||
_index = page;
|
||||
_zoomCycle++;
|
||||
|
||||
if (!asset.isImage) {
|
||||
_paused = false;
|
||||
@@ -268,7 +333,7 @@ class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
||||
final imageProvider = getFullImageProvider(asset, size: context.sizeData);
|
||||
|
||||
if (asset.isImage) {
|
||||
final zoomOut = index % 2 == 1;
|
||||
final zoomOut = _zoomCycle.isOdd;
|
||||
final elapsed = _stopwatch.elapsedMilliseconds;
|
||||
final duration = _config.duration * 1000;
|
||||
final progress = zoomOut ? 1.0 - elapsed / duration.toDouble() : elapsed / duration.toDouble();
|
||||
@@ -289,7 +354,7 @@ class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
||||
disableScaleGestures: true,
|
||||
gaplessPlayback: true,
|
||||
filterQuality: FilterQuality.high,
|
||||
initialScale: scale * (1.0 + value / 10.0),
|
||||
initialScale: scale * (1.0 + value * _kenBurnsZoom),
|
||||
controller: PhotoViewController(),
|
||||
onTapUp: (_, _, _) => _onTapUp(),
|
||||
),
|
||||
@@ -356,20 +421,43 @@ class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
||||
extendBody: true,
|
||||
extendBodyBehindAppBar: true,
|
||||
backgroundColor: Colors.black,
|
||||
body: PhotoViewGestureDetectorScope(
|
||||
axis: Axis.horizontal,
|
||||
child: PageView.builder(
|
||||
controller: _pageController,
|
||||
physics: const FastClampingScrollPhysics(),
|
||||
itemCount: widget.timeline.totalAssets,
|
||||
onPageChanged: _pageChanged,
|
||||
itemBuilder: (context, index) => Stack(
|
||||
children: [
|
||||
if (_config.look == SlideshowLook.blurredBackground) _getBlur(context, index),
|
||||
_getPhotoView(context, index),
|
||||
],
|
||||
body: Stack(
|
||||
children: [
|
||||
PhotoViewGestureDetectorScope(
|
||||
axis: Axis.horizontal,
|
||||
child: PageView.builder(
|
||||
controller: _pageController,
|
||||
physics: const FastClampingScrollPhysics(),
|
||||
itemCount: widget.timeline.totalAssets,
|
||||
onPageChanged: _pageChanged,
|
||||
itemBuilder: (context, index) => Stack(
|
||||
children: [
|
||||
if (_config.look == SlideshowLook.blurredBackground) _getBlur(context, index),
|
||||
_getPhotoView(context, index),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
if (_crossfadeFromIndex != null && _crossfadeToIndex != null)
|
||||
Positioned.fill(
|
||||
child: IgnorePointer(
|
||||
child: Stack(
|
||||
fit: StackFit.expand,
|
||||
children: [
|
||||
const ColoredBox(color: Colors.black),
|
||||
FadeTransition(
|
||||
opacity: _crossfadeController,
|
||||
child: _getCrossfadeLayer(context, _crossfadeToIndex!, isIncoming: true),
|
||||
),
|
||||
FadeTransition(
|
||||
opacity: _crossfadeOpacity,
|
||||
child: _getCrossfadeLayer(context, _crossfadeFromIndex!, isIncoming: false),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -6,10 +6,12 @@ import 'package:flutter/material.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:immich_mobile/constants/enums.dart';
|
||||
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
||||
import 'package:immich_mobile/domain/models/settings_key.dart';
|
||||
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
||||
import 'package:immich_mobile/generated/translations.g.dart';
|
||||
import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_button.widget.dart';
|
||||
import 'package:immich_mobile/providers/asset_viewer/asset_viewer.provider.dart';
|
||||
import 'package:immich_mobile/providers/infrastructure/action.provider.dart';
|
||||
import 'package:immich_mobile/providers/infrastructure/settings.provider.dart';
|
||||
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
|
||||
@@ -51,7 +53,9 @@ class _SharePreparingDialog extends StatelessWidget {
|
||||
}
|
||||
|
||||
class _ShareFileTypeDialog extends StatelessWidget {
|
||||
const _ShareFileTypeDialog();
|
||||
final bool showPreview;
|
||||
|
||||
const _ShareFileTypeDialog({this.showPreview = true});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -66,11 +70,12 @@ class _ShareFileTypeDialog extends StatelessWidget {
|
||||
title: Text(context.t.share_original),
|
||||
onTap: () => context.pop(ShareAssetType.original),
|
||||
),
|
||||
ListTile(
|
||||
leading: const Icon(Icons.photo_size_select_large_rounded),
|
||||
title: Text(context.t.share_preview),
|
||||
onTap: () => context.pop(ShareAssetType.preview),
|
||||
),
|
||||
if (showPreview)
|
||||
ListTile(
|
||||
leading: const Icon(Icons.photo_size_select_large_rounded),
|
||||
title: Text(context.t.share_preview),
|
||||
onTap: () => context.pop(ShareAssetType.preview),
|
||||
),
|
||||
],
|
||||
),
|
||||
actions: [TextButton(onPressed: () => context.pop(), child: Text(context.t.cancel))],
|
||||
@@ -85,6 +90,16 @@ class ShareActionButton extends ConsumerWidget {
|
||||
|
||||
const ShareActionButton({super.key, required this.source, this.iconOnly = false, this.menuItem = false});
|
||||
|
||||
Set<BaseAsset> _getSelectedAssets(WidgetRef ref) {
|
||||
return switch (source) {
|
||||
ActionSource.timeline => ref.read(multiSelectProvider).selectedAssets,
|
||||
ActionSource.viewer => switch (ref.read(assetViewerProvider).currentAsset) {
|
||||
BaseAsset asset => {asset},
|
||||
null => const {},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
void _onTap(BuildContext context, WidgetRef ref) async {
|
||||
if (!context.mounted) {
|
||||
return;
|
||||
@@ -99,9 +114,14 @@ class ShareActionButton extends ConsumerWidget {
|
||||
return;
|
||||
}
|
||||
|
||||
// only show preview option when at least one of the assets is not a video
|
||||
// we cant share previews of videos
|
||||
final assets = _getSelectedAssets(ref);
|
||||
final showPreview = assets.isEmpty || assets.any((asset) => !asset.isVideo);
|
||||
|
||||
final fileType = await showDialog<ShareAssetType>(
|
||||
context: context,
|
||||
builder: (_) => const _ShareFileTypeDialog(),
|
||||
builder: (_) => _ShareFileTypeDialog(showPreview: showPreview),
|
||||
useRootNavigator: false,
|
||||
);
|
||||
|
||||
|
||||
@@ -23,7 +23,9 @@ class MapBottomSheet extends StatelessWidget {
|
||||
resizeOnScroll: false,
|
||||
actions: [],
|
||||
backgroundColor: context.themeData.colorScheme.surface,
|
||||
slivers: [const SliverFillRemaining(hasScrollBody: true, child: _ScopedMapTimeline())],
|
||||
slivers: [
|
||||
const SliverFillRemaining(hasScrollBody: false, child: SizedBox(height: 0, child: _ScopedMapTimeline())),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,9 +110,6 @@ class _FixedSegmentRow extends ConsumerWidget {
|
||||
final timelineService = ref.read(timelineServiceProvider);
|
||||
final isDynamicLayout = columnCount <= (context.isMobile ? 2 : 3);
|
||||
|
||||
if (isScrubbing) {
|
||||
return _buildPlaceholder(context);
|
||||
}
|
||||
if (timelineService.hasRange(assetIndex, assetCount)) {
|
||||
return _buildAssetRow(
|
||||
context,
|
||||
@@ -122,6 +119,10 @@ class _FixedSegmentRow extends ConsumerWidget {
|
||||
);
|
||||
}
|
||||
|
||||
if (isScrubbing) {
|
||||
return _buildPlaceholder(context);
|
||||
}
|
||||
|
||||
return FutureBuilder<List<BaseAsset>>(
|
||||
future: timelineService.loadAssets(assetIndex, assetCount),
|
||||
builder: (context, snapshot) {
|
||||
|
||||
@@ -21,8 +21,8 @@ import 'package:immich_mobile/presentation/widgets/timeline/scrubber.widget.dart
|
||||
import 'package:immich_mobile/presentation/widgets/timeline/segment.model.dart';
|
||||
import 'package:immich_mobile/presentation/widgets/timeline/timeline.state.dart';
|
||||
import 'package:immich_mobile/presentation/widgets/timeline/timeline_drag_region.dart';
|
||||
import 'package:immich_mobile/providers/infrastructure/settings.provider.dart';
|
||||
import 'package:immich_mobile/providers/infrastructure/readonly_mode.provider.dart';
|
||||
import 'package:immich_mobile/providers/infrastructure/settings.provider.dart';
|
||||
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
||||
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
|
||||
import 'package:immich_mobile/widgets/common/immich_sliver_app_bar.dart';
|
||||
@@ -181,10 +181,13 @@ class _SliverTimelineState extends ConsumerState<_SliverTimeline> {
|
||||
void _onEvent(Event event) {
|
||||
switch (event) {
|
||||
case ScrollToTopEvent():
|
||||
ref.read(timelineStateProvider.notifier).setScrubbing(true);
|
||||
_scrollController
|
||||
.animateTo(0, duration: const Duration(milliseconds: 250), curve: Curves.easeInOut)
|
||||
.whenComplete(() => ref.read(timelineStateProvider.notifier).setScrubbing(false));
|
||||
{
|
||||
final timelineState = ref.read(timelineStateProvider.notifier);
|
||||
timelineState.setScrubbing(true);
|
||||
_scrollController
|
||||
.animateTo(0, duration: const Duration(milliseconds: 250), curve: Curves.easeInOut)
|
||||
.whenComplete(() => timelineState.setScrubbing(false));
|
||||
}
|
||||
|
||||
case ScrollToDateEvent scrollToDateEvent:
|
||||
_scrollToDate(scrollToDateEvent.date);
|
||||
@@ -249,6 +252,7 @@ class _SliverTimelineState extends ConsumerState<_SliverTimeline> {
|
||||
}
|
||||
|
||||
void _scrollToDate(DateTime date) {
|
||||
final timelineState = ref.read(timelineStateProvider.notifier);
|
||||
final asyncSegments = ref.read(timelineSegmentProvider);
|
||||
asyncSegments.whenData((segments) {
|
||||
// Find the segment that contains assets from the target date
|
||||
@@ -275,16 +279,16 @@ class _SliverTimelineState extends ConsumerState<_SliverTimeline> {
|
||||
if (fallbackSegment != null) {
|
||||
// Scroll to the segment with a small offset to show the header
|
||||
final targetOffset = fallbackSegment.startOffset - 50;
|
||||
ref.read(timelineStateProvider.notifier).setScrubbing(true);
|
||||
timelineState.setScrubbing(true);
|
||||
_scrollController
|
||||
.animateTo(
|
||||
targetOffset.clamp(0.0, _scrollController.position.maxScrollExtent),
|
||||
duration: const Duration(milliseconds: 500),
|
||||
curve: Curves.easeInOut,
|
||||
)
|
||||
.whenComplete(() => ref.read(timelineStateProvider.notifier).setScrubbing(false));
|
||||
.whenComplete(() => timelineState.setScrubbing(false));
|
||||
} else {
|
||||
ref.read(timelineStateProvider.notifier).setScrubbing(false);
|
||||
timelineState.setScrubbing(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -301,19 +305,19 @@ class _SliverTimelineState extends ConsumerState<_SliverTimeline> {
|
||||
void _stopDrag() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
// Update the physics post frame to prevent sudden change in physics on iOS.
|
||||
setState(() {
|
||||
_scrollPhysics = null;
|
||||
});
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_scrollPhysics = null;
|
||||
});
|
||||
}
|
||||
});
|
||||
setState(() {
|
||||
_dragging = false;
|
||||
_draggedAssets.clear();
|
||||
});
|
||||
// Reset the scrolling state after a small delay to allow bottom sheet to expand again
|
||||
final timelineState = ref.read(timelineStateProvider.notifier);
|
||||
Future.delayed(const Duration(milliseconds: 300), () {
|
||||
if (mounted) {
|
||||
ref.read(timelineStateProvider.notifier).setScrolling(false);
|
||||
}
|
||||
timelineState.setScrolling(false);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -285,7 +285,9 @@ class AssetMediaRepository {
|
||||
return 0;
|
||||
}
|
||||
|
||||
final shareFile = switch (fileType) {
|
||||
final effectiveFileType = asset.isVideo ? ShareAssetType.original : fileType;
|
||||
|
||||
final shareFile = switch (effectiveFileType) {
|
||||
ShareAssetType.original => await _getOriginalShareFile(
|
||||
asset,
|
||||
cancelCompleter: cancelCompleter,
|
||||
|
||||
@@ -70,7 +70,10 @@ class DeepLinkService {
|
||||
|
||||
if (assetRegex.hasMatch(path)) {
|
||||
final assetId = assetRegex.firstMatch(path)?.group(1) ?? '';
|
||||
return _buildAssetDeepLink(assetId, ref);
|
||||
// /albums/<albumId>/photos/<assetId> links carry the album context,
|
||||
// which drives the like/comment UI in the viewer
|
||||
final albumId = albumRegex.firstMatch(path)?.group(1);
|
||||
return _buildAssetDeepLink(assetId, ref, albumId: albumId);
|
||||
}
|
||||
if (albumRegex.hasMatch(path)) {
|
||||
final albumId = albumRegex.firstMatch(path)?.group(1) ?? '';
|
||||
@@ -107,16 +110,19 @@ class DeepLinkService {
|
||||
return DriftMemoryRoute(memories: memories, memoryIndex: 0);
|
||||
}
|
||||
|
||||
Future<PageRouteInfo?> _buildAssetDeepLink(String assetId, WidgetRef ref) async {
|
||||
Future<PageRouteInfo?> _buildAssetDeepLink(String assetId, WidgetRef ref, {String? albumId}) async {
|
||||
final asset = await _betaAssetService.getRemoteAsset(assetId);
|
||||
if (asset == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final album = albumId != null ? await _betaRemoteAlbumService.get(albumId) : null;
|
||||
|
||||
AssetViewer.setAsset(ref, asset);
|
||||
return AssetViewerRoute(
|
||||
initialIndex: 0,
|
||||
timelineService: _betaTimelineFactory.fromAssets([asset], TimelineOrigin.deepLink),
|
||||
currentAlbum: album,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -50,9 +50,10 @@ class ImmichToast {
|
||||
),
|
||||
),
|
||||
positionedToastBuilder: (context, child, gravity) {
|
||||
final isTop = gravity == ToastGravity.TOP;
|
||||
return Positioned(
|
||||
top: gravity == ToastGravity.TOP ? 150 : null,
|
||||
bottom: gravity == ToastGravity.BOTTOM ? 150 : null,
|
||||
top: isTop ? 150 : null,
|
||||
bottom: isTop ? null : 150 + MediaQuery.of(context).viewInsets.bottom,
|
||||
left: MediaQuery.of(context).size.width / 2 - 150,
|
||||
right: MediaQuery.of(context).size.width / 2 - 150,
|
||||
child: IgnorePointer(child: child),
|
||||
|
||||
@@ -16,15 +16,11 @@ class SlideshowSettings extends HookConsumerWidget {
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final slideshow = ref.read(appConfigProvider).slideshow;
|
||||
final useTransition = useState(slideshow.transition);
|
||||
final useRepeat = useState(slideshow.repeat);
|
||||
final useDuration = useState(slideshow.duration);
|
||||
final useLook = useState(slideshow.look);
|
||||
final useDirection = useState(slideshow.direction);
|
||||
|
||||
useValueChanged<bool, void>(useTransition.value, (_, __) {
|
||||
ref.read(settingsProvider).write(.slideshowTransition, useTransition.value);
|
||||
});
|
||||
useValueChanged<bool, void>(useRepeat.value, (_, __) {
|
||||
ref.read(settingsProvider).write(.slideshowRepeat, useRepeat.value);
|
||||
});
|
||||
@@ -45,11 +41,6 @@ class SlideshowSettings extends HookConsumerWidget {
|
||||
title: 'slideshow'.t(context: context),
|
||||
icon: Icons.slideshow_outlined,
|
||||
),
|
||||
SettingsSwitchListTile(
|
||||
valueNotifier: useTransition,
|
||||
title: "show_slideshow_transition".t(context: context),
|
||||
enabled: useDirection.value != SlideshowDirection.shuffle,
|
||||
),
|
||||
SettingsSwitchListTile(
|
||||
valueNotifier: useRepeat,
|
||||
title: "slideshow_repeat".t(context: context),
|
||||
|
||||
@@ -64,6 +64,76 @@ checksum = "sha256:f133470daa3fb0427f039b424392af7e917d7e7db6b556aa2a968ab0e3158
|
||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-windows-release.zip"
|
||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543660"
|
||||
|
||||
[[tools."github:CQLabs/homebrew-dcm"]]
|
||||
version = "1.37.0"
|
||||
backend = "github:CQLabs/homebrew-dcm"
|
||||
|
||||
[tools."github:CQLabs/homebrew-dcm".options]
|
||||
asset_pattern = "dcm-linux-arm-release.zip"
|
||||
|
||||
[tools."github:CQLabs/homebrew-dcm"."platforms.linux-arm64"]
|
||||
checksum = "sha256:253da2512b149913dfe345bf9a62a79acb2d730f66e71162ba4a92dfc4224b82"
|
||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-linux-arm-release.zip"
|
||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543838"
|
||||
|
||||
[tools."github:CQLabs/homebrew-dcm"."platforms.linux-arm64-musl"]
|
||||
checksum = "sha256:253da2512b149913dfe345bf9a62a79acb2d730f66e71162ba4a92dfc4224b82"
|
||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-linux-arm-release.zip"
|
||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543838"
|
||||
|
||||
[[tools."github:CQLabs/homebrew-dcm"]]
|
||||
version = "1.37.0"
|
||||
backend = "github:CQLabs/homebrew-dcm"
|
||||
|
||||
[tools."github:CQLabs/homebrew-dcm".options]
|
||||
asset_pattern = "dcm-linux-x64-release.zip"
|
||||
|
||||
[tools."github:CQLabs/homebrew-dcm"."platforms.linux-x64"]
|
||||
checksum = "sha256:477e086d4099c12f21e5ccd83b005d5fb945dd4cac4fd127fd9a08d7649af1cf"
|
||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-linux-x64-release.zip"
|
||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543797"
|
||||
|
||||
[tools."github:CQLabs/homebrew-dcm"."platforms.linux-x64-musl"]
|
||||
checksum = "sha256:477e086d4099c12f21e5ccd83b005d5fb945dd4cac4fd127fd9a08d7649af1cf"
|
||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-linux-x64-release.zip"
|
||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543797"
|
||||
|
||||
[[tools."github:CQLabs/homebrew-dcm"]]
|
||||
version = "1.37.0"
|
||||
backend = "github:CQLabs/homebrew-dcm"
|
||||
|
||||
[tools."github:CQLabs/homebrew-dcm".options]
|
||||
asset_pattern = "dcm-macos-x64-release.zip"
|
||||
|
||||
[tools."github:CQLabs/homebrew-dcm"."platforms.macos-x64"]
|
||||
checksum = "sha256:e56cb99872be7445a4de1d37e5438ca70e3bcd83be7a2b9b385e3538881f8068"
|
||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-macos-x64-release.zip"
|
||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543727"
|
||||
|
||||
[[tools."github:CQLabs/homebrew-dcm"]]
|
||||
version = "1.37.0"
|
||||
backend = "github:CQLabs/homebrew-dcm"
|
||||
|
||||
[tools."github:CQLabs/homebrew-dcm".options]
|
||||
asset_pattern = "dcm-windows-release.zip"
|
||||
|
||||
[tools."github:CQLabs/homebrew-dcm"."platforms.windows-x64"]
|
||||
checksum = "sha256:f133470daa3fb0427f039b424392af7e917d7e7db6b556aa2a968ab0e31587da"
|
||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-windows-release.zip"
|
||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543660"
|
||||
|
||||
[[tools."github:CQLabs/homebrew-dcm"]]
|
||||
version = "1.37.0"
|
||||
backend = "github:CQLabs/homebrew-dcm"
|
||||
|
||||
[tools."github:CQLabs/homebrew-dcm".options]
|
||||
asset_pattern = "dcm-macos-arm-release.zip"
|
||||
|
||||
[tools."github:CQLabs/homebrew-dcm"."platforms.macos-arm64"]
|
||||
checksum = "sha256:30bede64367d09067093cc57af6ec9496d7717898138ded5cb98a16ac8dd9d93"
|
||||
url = "https://github.com/CQLabs/homebrew-dcm/releases/download/1.37.0/dcm-macos-arm-release.zip"
|
||||
url_api = "https://api.github.com/repos/CQLabs/homebrew-dcm/releases/assets/404543757"
|
||||
|
||||
[[tools.java]]
|
||||
version = "21.0.2"
|
||||
backend = "core:java"
|
||||
@@ -87,3 +157,30 @@ url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c55847602
|
||||
[tools.java."platforms.windows-x64"]
|
||||
checksum = "sha256:b6c17e747ae78cdd6de4d7532b3164b277daee97c007d3eaa2b39cca99882664"
|
||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_windows-x64_bin.zip"
|
||||
|
||||
[[tools.java]]
|
||||
version = "21.0.2"
|
||||
backend = "core:java"
|
||||
|
||||
[tools.java.options]
|
||||
shorthand_vendor = "openjdk"
|
||||
|
||||
[tools.java."platforms.linux-arm64"]
|
||||
checksum = "sha256:08db1392a48d4eb5ea5315cf8f18b89dbaf36cda663ba882cf03c704c9257ec2"
|
||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-aarch64_bin.tar.gz"
|
||||
|
||||
[tools.java."platforms.linux-x64"]
|
||||
checksum = "sha256:a2def047a73941e01a73739f92755f86b895811afb1f91243db214cff5bdac3f"
|
||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-x64_bin.tar.gz"
|
||||
|
||||
[tools.java."platforms.macos-arm64"]
|
||||
checksum = "sha256:b3d588e16ec1e0ef9805d8a696591bd518a5cea62567da8f53b5ce32d11d22e4"
|
||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_macos-aarch64_bin.tar.gz"
|
||||
|
||||
[tools.java."platforms.macos-x64"]
|
||||
checksum = "sha256:8fd09e15dc406387a0aba70bf5d99692874e999bf9cd9208b452b5d76ac922d3"
|
||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_macos-x64_bin.tar.gz"
|
||||
|
||||
[tools.java."platforms.windows-x64"]
|
||||
checksum = "sha256:b6c17e747ae78cdd6de4d7532b3164b277daee97c007d3eaa2b39cca99882664"
|
||||
url = "https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_windows-x64_bin.zip"
|
||||
|
||||
Generated
+1
-1
@@ -3,7 +3,7 @@ Immich API
|
||||
|
||||
This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
|
||||
|
||||
- API version: 3.0.0-rc.0
|
||||
- API version: 3.0.0-rc.1
|
||||
- Generator version: 7.22.0
|
||||
- Build package: org.openapitools.codegen.languages.DartClientCodegen
|
||||
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@ class AssetBulkUpdateDto {
|
||||
///
|
||||
Optional<String?> dateTimeOriginal;
|
||||
|
||||
/// Relative time offset in seconds
|
||||
/// Relative time offset in minutes
|
||||
///
|
||||
/// Minimum value: -9007199254740991
|
||||
/// Maximum value: 9007199254740991
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ class AssetBulkUploadCheckItem {
|
||||
/// Base64 or hex encoded SHA1 hash
|
||||
String checksum;
|
||||
|
||||
/// Asset ID
|
||||
/// Client-side identifier echoed in the response to match results to inputs (e.g. filename)
|
||||
String id;
|
||||
|
||||
@override
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ name: immich_mobile
|
||||
description: Immich - selfhosted backup media file on mobile phone
|
||||
|
||||
publish_to: 'none'
|
||||
version: 3.0.0-rc.0+3048
|
||||
version: 3.0.0-rc.1+3049
|
||||
|
||||
environment:
|
||||
sdk: '>=3.12.0 <4.0.0'
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:immich_mobile/domain/services/sync_linked_album.service.dart';
|
||||
import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
|
||||
import 'package:immich_mobile/providers/infrastructure/store.provider.dart';
|
||||
import 'package:immich_mobile/repositories/drift_album_api_repository.dart';
|
||||
|
||||
import '../../infrastructure/repository.mock.dart';
|
||||
import '../service.mock.dart';
|
||||
|
||||
void main() {
|
||||
// A container with the service's deps overridden but cancellationProvider left
|
||||
// alone, i.e. the root (main) isolate, where cancellationProvider has no
|
||||
// override and throws if read. The UI reads this provider here.
|
||||
ProviderContainer rootContainer() {
|
||||
final container = ProviderContainer(
|
||||
overrides: [
|
||||
localAlbumRepository.overrideWithValue(MockLocalAlbumRepository()),
|
||||
remoteAlbumRepository.overrideWithValue(MockRemoteAlbumRepository()),
|
||||
driftAlbumApiRepositoryProvider.overrideWithValue(MockDriftAlbumApiRepository()),
|
||||
storeServiceProvider.overrideWithValue(MockStoreService()),
|
||||
],
|
||||
);
|
||||
addTearDown(container.dispose);
|
||||
return container;
|
||||
}
|
||||
|
||||
// Regression for #29125 (Sync Albums toggle) and #29119 (can't leave the album
|
||||
// selection screen): #28694 made the provider watch cancellationProvider, so
|
||||
// reading it off the isolate threw. The cancellation now lives on the isolate
|
||||
// call path, not the provider, so the UI can build it.
|
||||
test('builds on the root isolate without a cancellationProvider override', () {
|
||||
final container = rootContainer();
|
||||
|
||||
expect(() => container.read(syncLinkedAlbumServiceProvider), returnsNormally);
|
||||
expect(container.read(syncLinkedAlbumServiceProvider), isA<SyncLinkedAlbumService>());
|
||||
});
|
||||
|
||||
test('manageLinkedAlbums runs from the UI without a cancellation signal', () {
|
||||
final service = rootContainer().read(syncLinkedAlbumServiceProvider);
|
||||
|
||||
expect(service.manageLinkedAlbums(const [], 'user-1'), completes);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:immich_mobile/infrastructure/repositories/memory.repository.dart';
|
||||
|
||||
import '../repository_context.dart';
|
||||
|
||||
void main() {
|
||||
late MediumRepositoryContext ctx;
|
||||
late DriftMemoryRepository sut;
|
||||
|
||||
setUp(() {
|
||||
ctx = MediumRepositoryContext();
|
||||
sut = DriftMemoryRepository(ctx.db);
|
||||
});
|
||||
|
||||
tearDown(() async {
|
||||
await ctx.dispose();
|
||||
});
|
||||
|
||||
group('getAll', () {
|
||||
// #24745: memories created via the API have no showAt/hideAt. before the fix
|
||||
// the window filter (show_at <= now AND hide_at >= now) drops them because a
|
||||
// NULL comparison is never true.
|
||||
test('includes a memory with null showAt/hideAt', () async {
|
||||
final user = await ctx.newUser();
|
||||
final asset = await ctx.newRemoteAsset(ownerId: user.id);
|
||||
final memory = await ctx.newMemory(ownerId: user.id);
|
||||
await ctx.newMemoryAsset(memoryId: memory.id, assetId: asset.id);
|
||||
|
||||
final result = await sut.getAll(user.id);
|
||||
|
||||
expect(result, hasLength(1));
|
||||
expect(result.first.id, memory.id);
|
||||
expect(result.first.assets.single.id, asset.id);
|
||||
});
|
||||
|
||||
test('includes a memory whose window covers today', () async {
|
||||
final user = await ctx.newUser();
|
||||
final asset = await ctx.newRemoteAsset(ownerId: user.id);
|
||||
final now = DateTime.now().toUtc();
|
||||
final memory = await ctx.newMemory(
|
||||
ownerId: user.id,
|
||||
showAt: now.subtract(const Duration(days: 10)),
|
||||
hideAt: now.add(const Duration(days: 10)),
|
||||
);
|
||||
await ctx.newMemoryAsset(memoryId: memory.id, assetId: asset.id);
|
||||
|
||||
final result = await sut.getAll(user.id);
|
||||
|
||||
expect(result.map((m) => m.id), [memory.id]);
|
||||
});
|
||||
|
||||
test('excludes a memory whose hideAt is in the past', () async {
|
||||
final user = await ctx.newUser();
|
||||
final asset = await ctx.newRemoteAsset(ownerId: user.id);
|
||||
final now = DateTime.now().toUtc();
|
||||
final memory = await ctx.newMemory(
|
||||
ownerId: user.id,
|
||||
showAt: now.subtract(const Duration(days: 20)),
|
||||
hideAt: now.subtract(const Duration(days: 10)),
|
||||
);
|
||||
await ctx.newMemoryAsset(memoryId: memory.id, assetId: asset.id);
|
||||
|
||||
final result = await sut.getAll(user.id);
|
||||
|
||||
expect(result, isEmpty);
|
||||
});
|
||||
|
||||
test('excludes a memory whose showAt is in the future', () async {
|
||||
final user = await ctx.newUser();
|
||||
final asset = await ctx.newRemoteAsset(ownerId: user.id);
|
||||
final now = DateTime.now().toUtc();
|
||||
final memory = await ctx.newMemory(
|
||||
ownerId: user.id,
|
||||
showAt: now.add(const Duration(days: 10)),
|
||||
hideAt: now.add(const Duration(days: 20)),
|
||||
);
|
||||
await ctx.newMemoryAsset(memoryId: memory.id, assetId: asset.id);
|
||||
|
||||
final result = await sut.getAll(user.id);
|
||||
|
||||
expect(result, isEmpty);
|
||||
});
|
||||
|
||||
test('includes a memory with showAt in the past and null hideAt', () async {
|
||||
final user = await ctx.newUser();
|
||||
final asset = await ctx.newRemoteAsset(ownerId: user.id);
|
||||
final now = DateTime.now().toUtc();
|
||||
final memory = await ctx.newMemory(ownerId: user.id, showAt: now.subtract(const Duration(days: 10)));
|
||||
await ctx.newMemoryAsset(memoryId: memory.id, assetId: asset.id);
|
||||
|
||||
final result = await sut.getAll(user.id);
|
||||
|
||||
expect(result.map((m) => m.id), [memory.id]);
|
||||
});
|
||||
|
||||
test('excludes a memory with null showAt and hideAt in the past', () async {
|
||||
final user = await ctx.newUser();
|
||||
final asset = await ctx.newRemoteAsset(ownerId: user.id);
|
||||
final now = DateTime.now().toUtc();
|
||||
final memory = await ctx.newMemory(ownerId: user.id, hideAt: now.subtract(const Duration(days: 10)));
|
||||
await ctx.newMemoryAsset(memoryId: memory.id, assetId: asset.id);
|
||||
|
||||
final result = await sut.getAll(user.id);
|
||||
|
||||
expect(result, isEmpty);
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -3,11 +3,14 @@ import 'package:drift/native.dart';
|
||||
import 'package:immich_mobile/domain/models/album/album.model.dart';
|
||||
import 'package:immich_mobile/domain/models/album/local_album.model.dart';
|
||||
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
||||
import 'package:immich_mobile/domain/models/memory.model.dart';
|
||||
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/asset_face.entity.drift.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/local_album.entity.drift.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/local_album_asset.entity.drift.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/local_asset.entity.drift.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/memory.entity.drift.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/memory_asset.entity.drift.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/partner.entity.drift.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/person.entity.drift.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/remote_album.entity.drift.dart';
|
||||
@@ -309,4 +312,37 @@ class MediumRepositoryContext {
|
||||
Future<void> newLocalAlbumAsset({required String albumId, required String assetId}) => db
|
||||
.into(db.localAlbumAssetEntity)
|
||||
.insert(LocalAlbumAssetEntityCompanion(albumId: .new(albumId), assetId: .new(assetId)));
|
||||
|
||||
Future<MemoryEntityData> newMemory({
|
||||
String? id,
|
||||
String? ownerId,
|
||||
MemoryTypeEnum? type,
|
||||
int? year,
|
||||
DateTime? memoryAt,
|
||||
DateTime? showAt,
|
||||
DateTime? hideAt,
|
||||
DateTime? deletedAt,
|
||||
bool? isSaved,
|
||||
}) async {
|
||||
id ??= TestUtils.uuid();
|
||||
return db
|
||||
.into(db.memoryEntity)
|
||||
.insertReturning(
|
||||
MemoryEntityCompanion(
|
||||
id: .new(id),
|
||||
ownerId: .new(TestUtils.uuid(ownerId)),
|
||||
type: .new(type ?? MemoryTypeEnum.onThisDay),
|
||||
data: .new(MemoryData(year: year ?? 2020).toJson()),
|
||||
isSaved: .new(isSaved ?? false),
|
||||
memoryAt: .new(TestUtils.date(memoryAt)),
|
||||
showAt: .new(showAt),
|
||||
hideAt: .new(hideAt),
|
||||
deletedAt: .new(deletedAt),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> newMemoryAsset({required String memoryId, required String assetId}) => db
|
||||
.into(db.memoryAssetEntity)
|
||||
.insert(MemoryAssetEntityCompanion(memoryId: .new(memoryId), assetId: .new(assetId)));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
import 'package:auto_route/auto_route.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.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/timeline.model.dart';
|
||||
import 'package:immich_mobile/domain/services/asset.service.dart';
|
||||
import 'package:immich_mobile/domain/services/memory.service.dart';
|
||||
import 'package:immich_mobile/domain/services/people.service.dart';
|
||||
import 'package:immich_mobile/domain/services/remote_album.service.dart';
|
||||
import 'package:immich_mobile/domain/services/timeline.service.dart';
|
||||
import 'package:immich_mobile/providers/asset_viewer/asset_viewer.provider.dart';
|
||||
import 'package:immich_mobile/routing/router.dart';
|
||||
import 'package:immich_mobile/services/deep_link.service.dart';
|
||||
import 'package:mocktail/mocktail.dart';
|
||||
|
||||
class MockTimelineFactory extends Mock implements TimelineFactory {}
|
||||
|
||||
class MockAssetService extends Mock implements AssetService {}
|
||||
|
||||
class MockRemoteAlbumService extends Mock implements RemoteAlbumService {}
|
||||
|
||||
class MockDriftMemoryService extends Mock implements DriftMemoryService {}
|
||||
|
||||
class MockDriftPeopleService extends Mock implements DriftPeopleService {}
|
||||
|
||||
class MockPlatformDeepLink extends Mock implements PlatformDeepLink {}
|
||||
|
||||
class MockWidgetRef extends Mock implements WidgetRef {}
|
||||
|
||||
class MockAssetViewerStateNotifier extends Mock implements AssetViewerStateNotifier {}
|
||||
|
||||
const _assetId = 'aaaaaaaa-1111-2222-3333-bbbbbbbbbbbb';
|
||||
const _albumId = 'cccccccc-4444-5555-6666-dddddddddddd';
|
||||
|
||||
final _asset = RemoteAsset(
|
||||
id: _assetId,
|
||||
name: 'photo.jpg',
|
||||
ownerId: 'user-1',
|
||||
checksum: 'checksum-1',
|
||||
type: AssetType.image,
|
||||
createdAt: DateTime(2026, 6, 12),
|
||||
updatedAt: DateTime(2026, 6, 12),
|
||||
isEdited: false,
|
||||
);
|
||||
|
||||
final _album = RemoteAlbum(
|
||||
id: _albumId,
|
||||
name: 'Shared Album',
|
||||
ownerId: 'user-1',
|
||||
description: '',
|
||||
createdAt: DateTime(2026, 6, 12),
|
||||
updatedAt: DateTime(2026, 6, 12),
|
||||
isActivityEnabled: true,
|
||||
isShared: true,
|
||||
order: AlbumAssetOrder.asc,
|
||||
assetCount: 1,
|
||||
ownerName: 'Owner',
|
||||
);
|
||||
|
||||
void main() {
|
||||
late MockTimelineFactory timelineFactory;
|
||||
late MockAssetService assetService;
|
||||
late MockRemoteAlbumService remoteAlbumService;
|
||||
late MockWidgetRef ref;
|
||||
late List<TimelineService> createdTimelineServices;
|
||||
late DeepLinkService sut;
|
||||
|
||||
setUp(() {
|
||||
timelineFactory = MockTimelineFactory();
|
||||
assetService = MockAssetService();
|
||||
remoteAlbumService = MockRemoteAlbumService();
|
||||
ref = MockWidgetRef();
|
||||
createdTimelineServices = [];
|
||||
|
||||
when(() => timelineFactory.fromAssets(any(), TimelineOrigin.deepLink)).thenAnswer((invocation) {
|
||||
final assets = List<BaseAsset>.from(invocation.positionalArguments[0] as List<BaseAsset>);
|
||||
final timelineService = TimelineService((
|
||||
assetSource: (index, count) async => assets.skip(index).take(count).toList(),
|
||||
bucketSource: () => Stream.value([Bucket(assetCount: assets.length)]),
|
||||
origin: TimelineOrigin.deepLink,
|
||||
));
|
||||
createdTimelineServices.add(timelineService);
|
||||
return timelineService;
|
||||
});
|
||||
|
||||
when(() => ref.read(assetViewerProvider.notifier)).thenReturn(MockAssetViewerStateNotifier());
|
||||
|
||||
sut = DeepLinkService(
|
||||
timelineFactory,
|
||||
assetService,
|
||||
remoteAlbumService,
|
||||
MockDriftMemoryService(),
|
||||
MockDriftPeopleService(),
|
||||
null,
|
||||
);
|
||||
|
||||
addTearDown(() async {
|
||||
for (final timelineService in createdTimelineServices) {
|
||||
await timelineService.dispose();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
PlatformDeepLink link(String path) {
|
||||
final deepLink = MockPlatformDeepLink();
|
||||
when(() => deepLink.uri).thenReturn(Uri.parse('https://my.immich.app$path'));
|
||||
return deepLink;
|
||||
}
|
||||
|
||||
test('album photo link carries the album into the viewer route', () async {
|
||||
when(() => assetService.getRemoteAsset(_assetId)).thenAnswer((_) async => _asset);
|
||||
when(() => remoteAlbumService.get(_albumId)).thenAnswer((_) async => _album);
|
||||
|
||||
final route = await sut.handleMyImmichApp(link('/albums/$_albumId/photos/$_assetId'), ref);
|
||||
|
||||
expect(route, isA<AssetViewerRoute>());
|
||||
expect((route!.args as AssetViewerRouteArgs).currentAlbum, _album);
|
||||
});
|
||||
|
||||
test('still opens the viewer when the album cannot be resolved', () async {
|
||||
when(() => assetService.getRemoteAsset(_assetId)).thenAnswer((_) async => _asset);
|
||||
when(() => remoteAlbumService.get(_albumId)).thenAnswer((_) async => null);
|
||||
|
||||
final route = await sut.handleMyImmichApp(link('/albums/$_albumId/photos/$_assetId'), ref);
|
||||
|
||||
expect(route, isA<AssetViewerRoute>());
|
||||
expect((route!.args as AssetViewerRouteArgs).currentAlbum, isNull);
|
||||
});
|
||||
|
||||
test('plain photo link has no album', () async {
|
||||
when(() => assetService.getRemoteAsset(_assetId)).thenAnswer((_) async => _asset);
|
||||
|
||||
final route = await sut.handleMyImmichApp(link('/photos/$_assetId'), ref);
|
||||
|
||||
expect(route, isA<AssetViewerRoute>());
|
||||
expect((route!.args as AssetViewerRouteArgs).currentAlbum, isNull);
|
||||
verifyNever(() => remoteAlbumService.get(any()));
|
||||
});
|
||||
}
|
||||
@@ -16197,7 +16197,7 @@
|
||||
"info": {
|
||||
"title": "Immich",
|
||||
"description": "Immich API",
|
||||
"version": "3.0.0-rc.0",
|
||||
"version": "3.0.0-rc.1",
|
||||
"contact": {}
|
||||
},
|
||||
"tags": [
|
||||
@@ -16868,7 +16868,7 @@
|
||||
"type": "string"
|
||||
},
|
||||
"dateTimeRelative": {
|
||||
"description": "Relative time offset in seconds",
|
||||
"description": "Relative time offset in minutes",
|
||||
"maximum": 9007199254740991,
|
||||
"minimum": -9007199254740991,
|
||||
"type": "integer"
|
||||
@@ -16965,7 +16965,7 @@
|
||||
"type": "string"
|
||||
},
|
||||
"id": {
|
||||
"description": "Asset ID",
|
||||
"description": "Client-side identifier echoed in the response to match results to inputs (e.g. filename)",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
@@ -18490,7 +18490,6 @@
|
||||
"properties": {
|
||||
"cronExpression": {
|
||||
"description": "Cron expression",
|
||||
"pattern": "(((\\d+,)+\\d+|(\\d+(\\/|-)\\d+)|\\d+|\\*) ?){5,7}",
|
||||
"type": "string"
|
||||
},
|
||||
"enabled": {
|
||||
@@ -25677,7 +25676,6 @@
|
||||
"properties": {
|
||||
"cronExpression": {
|
||||
"description": "Cron expression for when the integrity check should run",
|
||||
"pattern": "(((\\d+,)+\\d+|(\\d+(\\/|-)\\d+)|\\d+|\\*) ?){5,7}",
|
||||
"type": "string"
|
||||
},
|
||||
"enabled": {
|
||||
@@ -25710,7 +25708,6 @@
|
||||
"properties": {
|
||||
"cronExpression": {
|
||||
"description": "Cron expression for when the integrity check should run",
|
||||
"pattern": "(((\\d+,)+\\d+|(\\d+(\\/|-)\\d+)|\\d+|\\*) ?){5,7}",
|
||||
"type": "string"
|
||||
},
|
||||
"enabled": {
|
||||
@@ -25810,7 +25807,6 @@
|
||||
"properties": {
|
||||
"cronExpression": {
|
||||
"description": "Cron expression",
|
||||
"pattern": "(((\\d+,)+\\d+|(\\d+(\\/|-)\\d+)|\\d+|\\*) ?){5,7}",
|
||||
"type": "string"
|
||||
},
|
||||
"enabled": {
|
||||
|
||||
+3
-3
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "immich-monorepo",
|
||||
"version": "3.0.0-rc.0",
|
||||
"version": "3.0.0-rc.1",
|
||||
"description": "Monorepo for Immich",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
@@ -11,12 +11,12 @@
|
||||
"release": "./misc/release/pump-version.sh",
|
||||
"pump": "node ./misc/release/pump-wrapper.js"
|
||||
},
|
||||
"packageManager": "pnpm@11.5.2",
|
||||
"packageManager": "pnpm@11.6.0",
|
||||
"engines": {
|
||||
"pnpm": ">=10.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^24.12.4",
|
||||
"@types/node": "^24.13.2",
|
||||
"prettier": "^3.8.3",
|
||||
"prettier-plugin-sort-json": "^4.2.0",
|
||||
"semver": "^7.8.1",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@immich/cli",
|
||||
"version": "3.0.0-rc.0",
|
||||
"version": "3.0.0-rc.1",
|
||||
"description": "Command Line Interface (CLI) for Immich",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -25,7 +25,7 @@
|
||||
"@types/lodash-es": "^4.17.12",
|
||||
"@types/micromatch": "^4.0.9",
|
||||
"@types/mock-fs": "^4.13.1",
|
||||
"@types/node": "^24.12.4",
|
||||
"@types/node": "^24.13.2",
|
||||
"@vitest/coverage-v8": "^4.0.0",
|
||||
"byte-size": "^9.0.0",
|
||||
"cli-progress": "^3.12.0",
|
||||
|
||||
@@ -13,5 +13,5 @@
|
||||
"oidc-provider": "^9.0.0",
|
||||
"tsx": "^4.20.6"
|
||||
},
|
||||
"packageManager": "pnpm@11.5.2"
|
||||
"packageManager": "pnpm@11.6.0"
|
||||
}
|
||||
|
||||
@@ -24,11 +24,11 @@
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "GNU Affero General Public License version 3",
|
||||
"packageManager": "pnpm@11.5.2",
|
||||
"packageManager": "pnpm@11.6.0",
|
||||
"devDependencies": {
|
||||
"@extism/js-pdk": "^1.1.1",
|
||||
"@immich/sdk": "workspace:*",
|
||||
"@types/node": "^24.12.4",
|
||||
"@types/node": "^24.13.2",
|
||||
"esbuild": "^0.28.0",
|
||||
"tsc-alias": "^1.8.16",
|
||||
"typescript": "^5.9.3"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@immich/sdk",
|
||||
"version": "3.0.0-rc.0",
|
||||
"version": "3.0.0-rc.1",
|
||||
"description": "Auto-generated TypeScript SDK for the Immich API",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -24,7 +24,7 @@
|
||||
"@oazapfts/runtime": "^1.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^24.12.4",
|
||||
"@types/node": "^24.13.2",
|
||||
"typescript": "^6.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* Immich
|
||||
* 3.0.0-rc.0
|
||||
* 3.0.0-rc.1
|
||||
* DO NOT MODIFY - This file has been generated using oazapfts.
|
||||
* See https://www.npmjs.com/package/oazapfts
|
||||
*/
|
||||
@@ -673,7 +673,7 @@ export type AssetMediaResponseDto = {
|
||||
export type AssetBulkUpdateDto = {
|
||||
/** Original date and time */
|
||||
dateTimeOriginal?: string;
|
||||
/** Relative time offset in seconds */
|
||||
/** Relative time offset in minutes */
|
||||
dateTimeRelative?: number;
|
||||
/** Asset description */
|
||||
description?: string;
|
||||
@@ -696,7 +696,7 @@ export type AssetBulkUpdateDto = {
|
||||
export type AssetBulkUploadCheckItem = {
|
||||
/** Base64 or hex encoded SHA1 hash */
|
||||
checksum: string;
|
||||
/** Asset ID */
|
||||
/** Client-side identifier echoed in the response to match results to inputs (e.g. filename) */
|
||||
id: string;
|
||||
};
|
||||
export type AssetBulkUploadCheckDto = {
|
||||
|
||||
Generated
+2998
-2953
File diff suppressed because it is too large
Load Diff
@@ -65,3 +65,5 @@ preferWorkspacePackages: true
|
||||
injectWorkspacePackages: true
|
||||
shamefullyHoist: false
|
||||
verifyDepsBeforeRun: install
|
||||
minimumReleaseAgeExclude:
|
||||
- '@immich/ui@0.81.1'
|
||||
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
FROM ghcr.io/immich-app/base-server-dev:202606021219@sha256:63fa91aa011f6f2921dd32fe6d1be8d637e9bd7f3e3dd0c8e446afb31b282af4 AS builder
|
||||
FROM ghcr.io/immich-app/base-server-dev:202606161235@sha256:9f88b07acc8b7bf37a1dd3d5a19193f664443eaaab4e08e9f9341414c5e4b23f AS builder
|
||||
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0 \
|
||||
CI=1 \
|
||||
COREPACK_HOME=/tmp \
|
||||
@@ -80,7 +80,7 @@ RUN --mount=type=cache,id=pnpm-packages,target=/buildcache/pnpm-store \
|
||||
--mount=type=cache,id=mise-tools-${TARGETPLATFORM},target=/buildcache/mise \
|
||||
mise //:plugins
|
||||
|
||||
FROM ghcr.io/immich-app/base-server-prod:202606021219@sha256:6ef9ef5859492149af770a6c884b5e2ddbaeef99f8885ea5f2d9f73625a3d9ec
|
||||
FROM ghcr.io/immich-app/base-server-prod:202606161235@sha256:c6d59e3923f548d29a212b4dc51b6281a722cfa1da7972a009c0f3830f5762d6
|
||||
|
||||
WORKDIR /usr/src/app
|
||||
ENV NODE_ENV=production \
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# dev build
|
||||
FROM ghcr.io/immich-app/base-server-dev:202606021219@sha256:63fa91aa011f6f2921dd32fe6d1be8d637e9bd7f3e3dd0c8e446afb31b282af4 AS dev
|
||||
FROM ghcr.io/immich-app/base-server-dev:202606161235@sha256:9f88b07acc8b7bf37a1dd3d5a19193f664443eaaab4e08e9f9341414c5e4b23f AS dev
|
||||
|
||||
|
||||
COPY --from=ghcr.io/jdx/mise:2026.5.18@sha256:5bb3311994fa78cef307ca3077cdb18f9551da0886371fc26ea91ab56220ffc5 /usr/local/bin/mise /usr/local/bin/mise
|
||||
|
||||
+10
-10
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "immich",
|
||||
"version": "3.0.0-rc.0",
|
||||
"version": "3.0.0-rc.1",
|
||||
"description": "",
|
||||
"author": "",
|
||||
"private": true,
|
||||
@@ -49,14 +49,14 @@
|
||||
"@nestjs/websockets": "^11.0.4",
|
||||
"@opentelemetry/api": "^1.9.0",
|
||||
"@opentelemetry/context-async-hooks": "^2.0.0",
|
||||
"@opentelemetry/exporter-prometheus": "^0.218.0",
|
||||
"@opentelemetry/instrumentation-http": "^0.218.0",
|
||||
"@opentelemetry/instrumentation-ioredis": "^0.66.0",
|
||||
"@opentelemetry/instrumentation-nestjs-core": "^0.64.0",
|
||||
"@opentelemetry/instrumentation-pg": "^0.70.0",
|
||||
"@opentelemetry/exporter-prometheus": "^0.219.0",
|
||||
"@opentelemetry/instrumentation-http": "^0.219.0",
|
||||
"@opentelemetry/instrumentation-ioredis": "^0.67.0",
|
||||
"@opentelemetry/instrumentation-nestjs-core": "^0.65.0",
|
||||
"@opentelemetry/instrumentation-pg": "^0.71.0",
|
||||
"@opentelemetry/resources": "^2.0.1",
|
||||
"@opentelemetry/sdk-metrics": "^2.0.1",
|
||||
"@opentelemetry/sdk-node": "^0.218.0",
|
||||
"@opentelemetry/sdk-node": "^0.219.0",
|
||||
"@opentelemetry/semantic-conventions": "^1.34.0",
|
||||
"@react-email/components": "^1.0.0",
|
||||
"@react-email/render": "^2.0.0",
|
||||
@@ -84,7 +84,7 @@
|
||||
"jose": "^6.0.0",
|
||||
"js-yaml": "^4.1.0",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
"kysely": "0.28.17",
|
||||
"kysely": "0.29.2",
|
||||
"kysely-postgres-js": "^3.0.0",
|
||||
"lodash": "^4.17.21",
|
||||
"luxon": "^3.4.2",
|
||||
@@ -116,7 +116,7 @@
|
||||
"ua-parser-js": "^2.0.0",
|
||||
"uuid": "^14.0.0",
|
||||
"validator": "^13.12.0",
|
||||
"zod": "4.3.6"
|
||||
"zod": "4.4.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^10.0.0",
|
||||
@@ -138,7 +138,7 @@
|
||||
"@types/luxon": "^3.6.2",
|
||||
"@types/mock-fs": "^4.13.1",
|
||||
"@types/multer": "^2.0.0",
|
||||
"@types/node": "^24.12.4",
|
||||
"@types/node": "^24.13.2",
|
||||
"@types/nodemailer": "^8.0.0",
|
||||
"@types/picomatch": "^4.0.0",
|
||||
"@types/pngjs": "^6.0.5",
|
||||
|
||||
@@ -58,7 +58,7 @@ const AssetMediaCreateSchema = AssetMediaBaseSchema.extend({
|
||||
|
||||
const AssetBulkUploadCheckItemSchema = z
|
||||
.object({
|
||||
id: z.string().describe('Asset ID'),
|
||||
id: z.string().describe('Client-side identifier echoed in the response to match results to inputs (e.g. filename)'),
|
||||
checksum: z.string().describe('Base64 or hex encoded SHA1 hash'),
|
||||
})
|
||||
.meta({ id: 'AssetBulkUploadCheckItem' });
|
||||
|
||||
@@ -41,7 +41,7 @@ const UpdateAssetBaseSchema = z
|
||||
const AssetBulkUpdateBaseSchema = UpdateAssetBaseSchema.extend({
|
||||
ids: z.array(z.uuidv4()).describe('Asset IDs to update'),
|
||||
duplicateId: z.string().nullish().describe('Duplicate ID'),
|
||||
dateTimeRelative: z.int().optional().describe('Relative time offset in seconds'),
|
||||
dateTimeRelative: z.int().optional().describe('Relative time offset in minutes'),
|
||||
timeZone: z.string().optional().describe('Time zone (IANA timezone)'),
|
||||
});
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { validateCronExpression } from 'cron';
|
||||
import { createZodDto } from 'nestjs-zod';
|
||||
import { SystemConfig } from 'src/config';
|
||||
import {
|
||||
@@ -43,7 +44,16 @@ const JobSettingsSchema = z
|
||||
|
||||
const cronExpressionSchema = z
|
||||
.string()
|
||||
.regex(/(((\d+,)+\d+|(\d+(\/|-)\d+)|\d+|\*) ?){5,7}/, 'Invalid cron expression')
|
||||
.superRefine((value, ctx) => {
|
||||
const validated = validateCronExpression(value);
|
||||
if (!validated.valid) {
|
||||
ctx.addIssue({
|
||||
code: 'custom',
|
||||
message: `Invalid cron expression. ${validated.error?.message ?? ''}`,
|
||||
input: value,
|
||||
});
|
||||
}
|
||||
})
|
||||
.describe('Cron expression');
|
||||
|
||||
const DatabaseBackupSchema = z
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user