Compare commits

...

104 Commits

Author SHA1 Message Date
Alex Tran
1efcac0946 Pump Patch 2022-12-11 14:25:51 -06:00
Matthias Rupp
415550f16d fix(server): Allow access to assets in shared album owned by current user (#1094)
* fix(server): Allow access to assets in shared album owned by current user

* Fix sql query

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2022-12-11 14:24:06 -06:00
Alex
aa554a9e77 [Localizely] Translations update (#1091) 2022-12-11 06:53:40 -06:00
Alex
2876c7ff97 Fix(server) Microservice didn't trigger to remove user (#1090) 2022-12-10 18:01:29 -06:00
Alex
651f56370a [Localizely] Translations update (#1089) 2022-12-10 15:15:06 -06:00
Alex Tran
950adeebbf Update language list in localizely 2022-12-10 15:08:25 -06:00
Alex Tran
4e33a52290 Update Localizely.yml 2022-12-10 15:04:37 -06:00
Alex Tran
f2cc7c2873 Fix(server) fix cannot change user password from mobile app due to first and last name property don't get passed from the app 2022-12-10 10:36:41 -06:00
Alex Tran
9c01ca1080 Added correct page title for admin sub pages 2022-12-10 09:23:02 -06:00
Alex Tran
09103dc981 Fixed upsert new DeviceInfo with null isAutoBackup property 2022-12-10 08:36:21 -06:00
Alex Tran
f096910abc Fix release note 2022-12-09 21:54:58 -06:00
Jason Rasmussen
242165485d fix(server): unique email database constraint (#1082) 2022-12-09 21:16:25 -06:00
Alex Tran
e6904ca884 api spec sync 2022-12-09 21:15:53 -06:00
Jason Rasmussen
5a792cc821 chore(docs): spelling (#1081) 2022-12-09 18:39:50 -05:00
Alex
0633eaf68c Pump 2022-12-09 15:19:22 -06:00
Jason Rasmussen
40afa3695a docs: server commands (#1079) 2022-12-09 14:54:19 -06:00
Jason Rasmussen
14889e7d85 fix(server): require local admin account (#1070) 2022-12-09 14:53:11 -06:00
Jason Rasmussen
3bb103c6b6 fix(server): link 'immich' (#1080) 2022-12-09 14:52:56 -06:00
Jason Rasmussen
5e680551b9 feat(server,web): migrate oauth settings from env to system config (#1061) 2022-12-09 14:51:42 -06:00
Jason Rasmussen
cefdd86b7f refactor(server): device info service (#1071)
* refactor(server): device info service

* use upsertDeviceInfo in mobile app

* fix: return types and dedupe code

Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
2022-12-08 09:57:07 -06:00
Matt
b8e26a2112 unraid guide no longer external (#1074)
Co-authored-by: Matt Farrell <mfarrell@squareup.com>
2022-12-08 09:54:06 -06:00
Jason Rasmussen
58a149990d refactor(server): server version logging (#1073)
* refactor(server): server version logging

* chore: server => microservices
2022-12-08 09:53:18 -06:00
Fynn Petersen-Frey
c23b2479f7 feat(mobile): configurable background backup delay (#1068)
let's the user configure how much to delay the trigger for running the backup whenever assets are changed on the device
2022-12-08 09:51:36 -06:00
bo0tzz
a97b761eda Add generated openapi docs to website (#1067)
* Add generated openapi docs to website

* Uppercase API link in navbar

* fix(docs): open api empty summary (#1069)

* feat(docs): Use /docs/api path for swagger docs

* Sync api version to be the same as the server

* Update version

Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2022-12-07 21:57:34 -06:00
Alex
1adf8ff6b6 chore(web) Update SvelteKit (#1066)
* Update sveltekit

* Update sveltekit

* Update correct preloading attribute
2022-12-06 18:08:08 -06:00
Alex Tran
b5a5363a6a Fixed openapi generation command for mobile 2022-12-06 16:10:04 -06:00
Alex
f91bdc2785 fix(server) added TagResponseDto for TagController (#1065)
* fix(server) added TagResponseDto for TagController

* Added userId to DTO
2022-12-06 15:46:13 -06:00
Alex
db34f2f7fd fix(server) fix correct MIME type for Nikon NEF (#1060) 2022-12-05 12:05:02 -06:00
Alex
5de8ea162d feat(server) Tagging system (#1046) 2022-12-05 11:56:44 -06:00
Alex
6e2763b72c Fix plural 2022-12-05 10:52:21 -06:00
Alex
966d99217a fix(web) fix test (#1059) 2022-12-04 22:51:22 -06:00
Alex
5d140145c1 Update README.md 2022-12-04 17:15:41 -06:00
Alex
fcf3b0b672 Update README_zh_CN.md
Add information about community maintained readme
2022-12-04 17:15:14 -06:00
Matthias Rupp
e8bbad6772 feat(server): Per user asset access control (#993)
* Limit asset access to owner

* Check public albums for asset

* Clean up

* Fix test

* Rename repository method

* Simplify control flow

* Revert "Simplify control flow"

This reverts commit 7bc3cbf687.

* Revert Makefile change
2022-12-04 11:42:36 -06:00
Kiel Hurley
5f2b75997f feat(web): Localize dates and numbers (#1056) 2022-12-04 09:35:20 -06:00
chen3stones
426ce77f1c chore(): add Chinese README file (#1058)
Co-authored-by: chen3stones <chen3stones@outlook.com>
2022-12-03 22:03:29 -06:00
Fynn Petersen-Frey
83c7434eb5 feat(mobile): enable zoom of preview images & reuse cached thumbnails (#1049) 2022-12-03 21:59:39 -06:00
Jason Rasmussen
99854e90be feat(server): link via profile.sub (#1055) 2022-12-03 21:59:24 -06:00
Fynn Petersen-Frey
424b11cf50 feat(mobile): configure detail viewer asset loading (#1044) 2022-12-02 14:55:10 -06:00
Alex Tran
da87b1256c Release mobile hotfix 2022-12-01 23:16:22 -06:00
Alex
a3971543b5 fix(mobile): Start up from splash screen does not trigger foreground backup (#1042) 2022-12-01 09:20:53 -06:00
Alex
a384798779 Up version for release 2022-11-30 11:18:06 -06:00
Alex
d31eddf32f chore(mobile) Improve mobile UI (#1038) 2022-11-30 10:58:07 -06:00
Fynn Petersen-Frey
1068c4ad23 feat(server,web): activate ETags for all API endpoints and asset serving (#1031)
This greatly reduces the network traffic by app/web.
2022-11-29 15:45:47 -06:00
Alex
cbc979263e chore(mobile): Improve readability of logs page (#1033) 2022-11-28 14:14:22 -06:00
Fynn Petersen-Frey
765181bbc0 chore(mobile): improve CSV log export (#1032) 2022-11-28 10:17:27 -06:00
Fynn Petersen-Frey
d82dec9773 fix(mobile): fix cache invalidation on logout (#1030)
await all the cache-invalidation operations during logout and catch errors to actually perform all operations.
2022-11-28 10:01:09 -06:00
Alex
024177515d feat(mobile) Add in app logging to show app's log information (#1014) 2022-11-27 14:34:19 -06:00
Alex Tran
fb3b36a569 Added test for user.service 2022-11-26 15:09:06 -06:00
Alex
614743c8f4 fix(server): Prevent delete admin user (#1023) 2022-11-26 15:02:23 -06:00
Fynn Petersen-Frey
47f5e4134e feat(mobile): use cached asset info if unchanged instead of downloading all assets (#1017)
* feat(mobile): use cached asset info if unchanged instead of downloading all assets

This adds an HTTP ETag to the getAllAssets endpoint and client-side support in the app.
If locally cache content is identical to the content on the server, the potentially large list of all assets does not need to be downloaded.

* use ts import instead of require
2022-11-26 10:16:02 -06:00
denck007
efa7b3ba54 Fix(web): navbar color overlap and scroll bar incorrect z index (#1018)
* fix(web): Navbar color overlaps tall images

* fix(web): Scroll bar date behind navbar when scrubbing (fixes issue #757)
2022-11-25 20:52:01 -06:00
Alex
1e9d67ec39 Up mobile version for hotfix release 2022-11-24 15:50:18 -06:00
Alex
80d0ddca9a fix(mobile): Fix not able to show device asset on Android 13 (#1016) 2022-11-24 15:47:55 -06:00
Kiel Hurley
976d347623 feat(server,web,mobile): Use binary prefixes for data sizes (#1009) 2022-11-24 11:39:27 -06:00
Alex Tran
df0a059a02 Up patch version 2022-11-21 20:26:03 -06:00
Alex
cc697486fc fix(server): Deleted shared users cause problem with album retrival and creation (#1002)
* fix(server): Deleted shared users cause problem with album retrival and creation

* Remove dead code
2022-11-21 20:24:56 -06:00
Alex
2227a6f5f3 Added custom buildscript for XCodeCloud 2022-11-21 13:54:30 -06:00
Alex
a9320f06e8 Added v1.36 release note to website 2022-11-21 12:53:25 -06:00
Alex
39b7ab66d4 chore(mobile): clean up linter problems (#1000) 2022-11-21 06:13:14 -06:00
Alex Tran
bc9ee1d611 Added hotfix release note 2022-11-21 05:41:44 -06:00
Alex
56ce747ffc fix(mobile): freeze on splash screen due to accessing bad state (#998) 2022-11-21 05:29:43 -06:00
Alex
a2f3b2199a fix(server): Admin user not created (#996) 2022-11-20 23:25:03 -06:00
Alex Tran
88b8d34aa6 Update .env.example file 2022-11-20 16:44:33 -06:00
Alex Tran
21fd08e0fb Update Readme 2022-11-20 14:42:09 -06:00
Alex Tran
37a4f4a39f Update redirect picture in documentation 2022-11-20 14:18:53 -06:00
Alex Tran
9d2c30298e Added changelog for mobile 2022-11-20 14:11:33 -06:00
Alex Tran
6f5d60fb62 Up version for release 2022-11-20 13:13:27 -06:00
Alex
41ffa0c015 fix(server): Server freezes when getting statistic (#994)
* fix(server): Server freezes when getting statistic
* remove dead code
2022-11-20 13:09:31 -06:00
Alex
b3e51cc849 feat(mobile) Add OAuth Login On Mobile (#990)
* Added return type for oauth/callback

* Remove console.log

* Redirect app

* Wording

* Added loading state change

* Added OAuth login on mobile

* Return correct status for  correct redirection

* Auto discovery OAuth Login
2022-11-20 11:43:10 -06:00
Alex Tran
e01e4e6530 Fixed motion play icon in light mode mobile 2022-11-19 15:23:49 -06:00
Alex Tran
6ed072f67b Added migration needed for OIDC 2022-11-18 23:22:27 -06:00
Alex
8bc64be77b feat: support iOS LivePhoto backup (#950) 2022-11-18 23:12:54 -06:00
Brandon Rothweiler
83e2cabbcc Update contribution-guidelines.md (#985) 2022-11-16 23:30:58 -06:00
Alex
7de7619fd1 Update contribution-guidelines.md 2022-11-16 23:15:26 -06:00
bo0tzz
afae5fd972 web(feat): Add support for actions when clicking notifications (#966)
* feat(web): Add button to close notification popups

* feat(web): Add support for actions on notification click

* feat(web): Open CLI docs when clicking asset upload count message

* test(web): Add action field to notification-card tests

* chore(web): Formatting

* feat(web): Allow HTML in notification message

* feat(web): Do not use link element in file upload count notification

* feat(web): Prevent notification discard button from triggering action

* feat(web): Add noop action support for notifications

* chore(web): Remove unused function argument
2022-11-16 23:11:15 -06:00
bo0tzz
70cd313082 Add navbar button to copy image (#961)
* Add navbar button to copy image

* Use global event for copy image

* merge upstream

* Fixed missing required props

* feat(web): Show notification after copying image to clipboard

* chore(web): Fix typescript error

* chore(web): Formatting

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2022-11-16 15:04:37 -06:00
Alex
e799f35dd2 chore(server) refactor serveFile and downloadFile endpoint (#978) 2022-11-16 00:11:16 -06:00
Kiel Hurley
1db255fd3e Disallow all robots (#977)
Blank `Disallow` disallows nothing
2022-11-15 21:36:04 -06:00
Jason Rasmussen
909e4820d6 chore(web,mobile): update github repo url (#974) 2022-11-15 20:30:44 -06:00
be bright
4727671c79 Update Korean translation with the latest version. (#971) 2022-11-15 09:52:24 -06:00
Jason Rasmussen
f2f255e6e6 feat(server): multi archive downloads (#956) 2022-11-15 09:51:56 -06:00
Jason Rasmussen
b5d75e2016 feat(server,web): system config for admin (#959)
* feat: add admin config module for user configured config, uses it for ffmpeg

* feat: add api endpoint to retrieve admin config settings and values

* feat: add settings panel to admin page on web (wip)

* feat: add api endpoint to update the admin config

* chore: re-generate openapi spec after rebase

* refactor: move from admin config to system config naming

* chore: move away from UseGuards to new @Authenticated decorator

* style: dark mode styling for lists and fix conflicting colors

* wip: 2 column design, no edit button

* refactor: system config

* chore: generate open api

* chore: rm broken test

* chore: cleanup types

* refactor: config module names

Co-authored-by: Zack Pollard <zackpollard@ymail.com>
Co-authored-by: Zack Pollard <zack.pollard@moonpig.com>
2022-11-14 22:39:32 -06:00
Jason Rasmussen
d3c35ec9c5 feat(server,web): OIDC Implementation (#884)
* chore: merge

* feat: nullable password

* feat: server debugger

* chore: regenerate api

* feat: auto-register flag

* refactor: oauth endpoints

* chore: regenerate api

* fix: default scope configuration

* refactor: pass in redirect uri from client

* chore: docs

* fix: bugs

* refactor: auth services and user repository

* fix: select password

* fix: tests

* fix: get signing algorithm from discovery document

* refactor: cookie constants

* feat: oauth logout

* test: auth services

* fix: query param check

* fix: regenerate open-api
2022-11-14 20:24:25 -06:00
Devin Buhl
d476656789 feat(ci): Push images to GitHub Container Registry (#964)
* feat(ci): Push images to GitHub Container Registry

* fix up tag

* fix typo

* use github.repository_owner
2022-11-13 08:32:50 -06:00
Fynn Petersen-Frey
8d0ff974e1 refactor(mobile): tidy-up dependencies, remove unused, replace rarely used ones (#948) 2022-11-11 11:52:02 -06:00
Alex
33ded2a174 Update README.md 2022-11-11 09:41:39 -06:00
Alex
277af33ab0 Update automatic-backup.md
Fixed incorrect sentence idea
2022-11-10 22:44:04 -06:00
Jason Rasmussen
2e4c005ad9 refactor: multistage builds (#955) 2022-11-10 22:22:17 -06:00
Alex
739bed737e Added database migration info to docs 2022-11-10 09:30:32 -06:00
bo0tzz
a1a7e6ac06 Small docs site tweaks (#954)
* Add yarn.lock to .gitignore

* Tweak announcementBar message

* Add demo link to docs homepage

* chore(docs): logo-meaning page cleanup

* chore(docs): support page cleanup

* chore(docs): tech-stack page cleanup

* chore(docs): requirements page cleanup

* Update main README warning to match docs site

* Add clearer documentation link to main README

* chore(docs): one-step-install page cleanup

* chore(docs): Security: remove example JWT_SECRET value

* chore(docs): recommended-install page cleanup

* chore(docs): portainer-install page cleanup

* chore(docs): unraid-install page cleanup
2022-11-10 08:20:23 -06:00
Alex Tran
c3348bd068 Fixed Dockerfile not working in dev 2022-11-09 23:34:35 -06:00
Jason Rasmussen
cc61729f01 build(server): use github-action cache (#949)
* build(server): prune dependencies in docker builder

* fix: e2e tests

* refactor: dockerfile step order

* fix: vips build dependency

* feat: use caching
2022-11-09 19:53:21 -06:00
Christian Paul
b457bfbd4e typo(android-feature-note): Reserve geocoding -> Reverse geocoding (#946)
* Typo: Reserve geocoding -> Reverse geocoding

https://en.wikipedia.org/wiki/Reverse_geocoding

* Update mobile/android/fastlane/metadata/android/en-US/full_description.txt
2022-11-09 10:17:43 -06:00
Jason Rasmussen
1877834fd1 fix(web): broken unit tests (#947) 2022-11-09 10:32:12 -05:00
Alex Tran
afdfd1863f Adjusting dark mode color on the web admin panel 2022-11-09 05:42:06 -06:00
Ian
f6aba0f9ec feat(deployment) Allow overriding service host and ports with env variables (#930)
* Add proxy changes

* Add web changes

* Add microservices changes

* Add examples

* Add header comment to nginx config

* Use URLs instead of host and port
2022-11-09 05:11:32 -06:00
Alex
66640ebfeb Up version for release 2022-11-08 14:34:47 -06:00
Alex
9057e4b7d0 Update documentation 2022-11-08 14:22:42 -06:00
Matthias Rupp
0deb8f4090 Add equals and hashcode to Asset 2022-11-08 19:02:02 +01:00
Fynn Petersen-Frey
1633af7af6 feat(mobile): show local assets (#905)
* introduce Asset as composition of AssetResponseDTO and AssetEntity

* filter out duplicate assets (that are both local and remote, take only remote for now)

* only allow remote images to be added to albums

* introduce ImmichImage to render Asset using local or remote data

* optimized deletion of local assets

* local video file playback

* allow multiple methods to wait on background service finished

* skip local assets when adding to album from home screen

* fix and optimize delete

* show gray box placeholder for local assets

* add comments

* fix bug: duplicate assets in state after onNewAssetUploaded
2022-11-08 11:00:24 -06:00
Jason Rasmussen
99da181cfc feat(web): favorite an asset (#939)
* feat(web): favorite an asset

* fix: test and linting

* fix: asset dto type
2022-11-08 10:20:36 -06:00
Jason Rasmussen
8a9b0347bb fix(server): increase json body payload limit (#941) 2022-11-08 09:24:49 -06:00
Zeeshan Khan
fe4b307fe6 feat(server,web): Delete and restore user from the admin portal (#935)
* delete and restore user from admin UI

* addressed review comments and fix e2e test

* added cron job to delete user, and some formatting changes

* addressed review comments

* adding missing queue registration
2022-11-07 15:53:47 -06:00
469 changed files with 23721 additions and 7454 deletions

13
.gitattributes vendored Normal file
View File

@@ -0,0 +1,13 @@
mobile/openapi/**/*.md -diff -merge
mobile/openapi/**/*.md linguist-generated=true
mobile/openapi/**/*.dart -diff -merge
mobile/openapi/**/*.dart linguist-generated=true
web/src/api/open-api/**/*.md -diff -merge
web/src/api/open-api/**/*.md linguist-generated=true
web/src/api/open-api/**/*.ts -diff -merge
web/src/api/open-api/**/*.ts linguist-generated=true
mobile/openapi/.openapi-generator/FILES -diff -merge
mobile/openapi/.openapi-generator/FILES linguist-generated=true

View File

@@ -26,6 +26,12 @@ jobs:
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Immich Mono Repo - name: Build and push Immich Mono Repo
uses: docker/build-push-action@v3.2.0 uses: docker/build-push-action@v3.2.0
with: with:
@@ -33,8 +39,11 @@ jobs:
file: ./server/Dockerfile file: ./server/Dockerfile
platforms: linux/arm/v7,linux/amd64,linux/arm64 platforms: linux/arm/v7,linux/amd64,linux/arm64
push: true push: true
cache-from: type=gha
cache-to: type=gha,mode=max
tags: | tags: |
altran1502/immich-server:latest altran1502/immich-server:latest
ghcr.io/${{ github.repository_owner }}/immich-server:latest
build_and_push_machine_learning_latest: build_and_push_machine_learning_latest:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -54,6 +63,12 @@ jobs:
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Push Machine Learning - name: Build and Push Machine Learning
uses: docker/build-push-action@v3.2.0 uses: docker/build-push-action@v3.2.0
with: with:
@@ -61,8 +76,11 @@ jobs:
file: ./machine-learning/Dockerfile file: ./machine-learning/Dockerfile
platforms: linux/arm/v7,linux/amd64,linux/arm64 platforms: linux/arm/v7,linux/amd64,linux/arm64
push: true push: true
cache-from: type=gha
cache-to: type=gha,mode=max
tags: | tags: |
altran1502/immich-machine-learning:latest altran1502/immich-machine-learning:latest
ghcr.io/${{ github.repository_owner }}/immich-machine-learning:latest
build_and_push_web_latest: build_and_push_web_latest:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -81,6 +99,12 @@ jobs:
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Push Web - name: Build and Push Web
uses: docker/build-push-action@v3.2.0 uses: docker/build-push-action@v3.2.0
with: with:
@@ -91,6 +115,7 @@ jobs:
push: true push: true
tags: | tags: |
altran1502/immich-web:latest altran1502/immich-web:latest
ghcr.io/${{ github.repository_owner }}/immich-web:latest
build_and_push_nginx_latest: build_and_push_nginx_latest:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -109,6 +134,12 @@ jobs:
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Push Proxy - name: Build and Push Proxy
uses: docker/build-push-action@v3.2.0 uses: docker/build-push-action@v3.2.0
with: with:
@@ -118,3 +149,4 @@ jobs:
push: true push: true
tags: | tags: |
altran1502/immich-proxy:latest altran1502/immich-proxy:latest
ghcr.io/${{ github.repository_owner }}/immich-proxy:latest

View File

@@ -27,6 +27,13 @@ jobs:
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
if: ${{ github.repository == 'immich-app/immich' }}
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Immich Mono Repo - name: Build and push Immich Mono Repo
uses: docker/build-push-action@v3.2.0 uses: docker/build-push-action@v3.2.0
with: with:
@@ -34,9 +41,13 @@ jobs:
file: ./server/Dockerfile file: ./server/Dockerfile
platforms: linux/arm/v7,linux/amd64,linux/arm64 platforms: linux/arm/v7,linux/amd64,linux/arm64
push: ${{ github.event_name == 'pull_request' && github.repository == 'immich-app/immich' }} push: ${{ github.event_name == 'pull_request' && github.repository == 'immich-app/immich' }}
cache-from: type=gha
cache-to: type=gha,mode=max
tags: | tags: |
altran1502/immich-server:staging altran1502/immich-server:staging
altran1502/immich-server:${{ github.event.pull_request.number }} altran1502/immich-server:${{ github.event.pull_request.number }}
ghcr.io/${{ github.repository_owner }}/immich-server:staging
ghcr.io/${{ github.repository_owner }}/immich-server:${{ github.event.pull_request.number }}
build_and_push_machine_learning_staging: build_and_push_machine_learning_staging:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -57,6 +68,13 @@ jobs:
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
if: ${{ github.repository == 'immich-app/immich' }}
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Push Machine Learning - name: Build and Push Machine Learning
uses: docker/build-push-action@v3.2.0 uses: docker/build-push-action@v3.2.0
with: with:
@@ -64,9 +82,13 @@ jobs:
file: ./machine-learning/Dockerfile file: ./machine-learning/Dockerfile
platforms: linux/arm/v7,linux/amd64,linux/arm64 platforms: linux/arm/v7,linux/amd64,linux/arm64
push: ${{ github.event_name == 'pull_request' && github.repository == 'immich-app/immich' }} push: ${{ github.event_name == 'pull_request' && github.repository == 'immich-app/immich' }}
cache-from: type=gha
cache-to: type=gha,mode=max
tags: | tags: |
altran1502/immich-machine-learning:staging altran1502/immich-machine-learning:staging
altran1502/immich-machine-learning:${{ github.event.pull_request.number }} altran1502/immich-machine-learning:${{ github.event.pull_request.number }}
ghcr.io/${{ github.repository_owner }}/immich-machine-learning:staging
ghcr.io/${{ github.repository_owner }}/immich-machine-learning:${{ github.event.pull_request.number }}
build_and_push_web_staging: build_and_push_web_staging:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -86,6 +108,13 @@ jobs:
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
if: ${{ github.repository == 'immich-app/immich' }}
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Push Web - name: Build and Push Web
uses: docker/build-push-action@v3.2.0 uses: docker/build-push-action@v3.2.0
with: with:
@@ -97,6 +126,8 @@ jobs:
tags: | tags: |
altran1502/immich-web:staging altran1502/immich-web:staging
altran1502/immich-web:${{ github.event.pull_request.number }} altran1502/immich-web:${{ github.event.pull_request.number }}
ghcr.io/${{ github.repository_owner }}/immich-web:staging
ghcr.io/${{ github.repository_owner }}/immich-web:${{ github.event.pull_request.number }}
build_and_push_nginx_staging: build_and_push_nginx_staging:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -116,6 +147,13 @@ jobs:
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
if: ${{ github.repository == 'immich-app/immich' }}
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Push Proxy - name: Build and Push Proxy
uses: docker/build-push-action@v3.2.0 uses: docker/build-push-action@v3.2.0
with: with:
@@ -126,3 +164,5 @@ jobs:
tags: | tags: |
altran1502/immich-proxy:staging altran1502/immich-proxy:staging
altran1502/immich-proxy:${{ github.event.pull_request.number }} altran1502/immich-proxy:${{ github.event.pull_request.number }}
ghcr.io/${{ github.repository_owner }}/immich-proxy:staging
ghcr.io/${{ github.repository_owner }}/immich-proxy:${{ github.event.pull_request.number }}

View File

@@ -12,12 +12,12 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
with: with:
ref: "main" ref: 'main'
fetch-depth: 0 fetch-depth: 0
- name: "Get Previous tag" - name: 'Get Previous tag'
id: previoustag id: previoustag
uses: "WyriHaximus/github-action-get-previous-tag@v1" uses: 'WyriHaximus/github-action-get-previous-tag@v1'
with: with:
fallback: latest fallback: latest
@@ -34,6 +34,13 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push immich-server release - name: Build and push immich-server release
uses: docker/build-push-action@v3.2.0 uses: docker/build-push-action@v3.2.0
with: with:
@@ -41,9 +48,13 @@ jobs:
file: ./server/Dockerfile file: ./server/Dockerfile
platforms: linux/arm/v7,linux/amd64,linux/arm64 platforms: linux/arm/v7,linux/amd64,linux/arm64
push: ${{ github.event_name != 'pull_request' }} push: ${{ github.event_name != 'pull_request' }}
cache-from: type=gha
cache-to: type=gha,mode=max
tags: | tags: |
altran1502/immich-server:${{ steps.previoustag.outputs.tag }} altran1502/immich-server:${{ steps.previoustag.outputs.tag }}
altran1502/immich-server:release altran1502/immich-server:release
ghcr.io/${{ github.repository_owner }}/immich-server:${{ steps.previoustag.outputs.tag }}
ghcr.io/${{ github.repository_owner }}/immich-server:release
build_and_push_machine_learning_release: build_and_push_machine_learning_release:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -52,9 +63,9 @@ jobs:
uses: actions/checkout@v3 uses: actions/checkout@v3
with: with:
fetch-depth: 0 fetch-depth: 0
- name: "Get Previous tag" - name: 'Get Previous tag'
id: previoustag id: previoustag
uses: "WyriHaximus/github-action-get-previous-tag@v1" uses: 'WyriHaximus/github-action-get-previous-tag@v1'
with: with:
fallback: latest fallback: latest
- name: Set up QEMU - name: Set up QEMU
@@ -67,6 +78,12 @@ jobs:
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Push Machine Learning - name: Build and Push Machine Learning
uses: docker/build-push-action@v3.2.0 uses: docker/build-push-action@v3.2.0
with: with:
@@ -74,9 +91,13 @@ jobs:
file: ./machine-learning/Dockerfile file: ./machine-learning/Dockerfile
platforms: linux/arm/v7,linux/amd64,linux/arm64 platforms: linux/arm/v7,linux/amd64,linux/arm64
push: true push: true
cache-from: type=gha
cache-to: type=gha,mode=max
tags: | tags: |
altran1502/immich-machine-learning:${{ steps.previoustag.outputs.tag }} altran1502/immich-machine-learning:${{ steps.previoustag.outputs.tag }}
altran1502/immich-machine-learning:release altran1502/immich-machine-learning:release
ghcr.io/${{ github.repository_owner }}/immich-machine-learning:${{ steps.previoustag.outputs.tag }}
ghcr.io/${{ github.repository_owner }}/immich-machine-learning:release
build_and_push_web_release: build_and_push_web_release:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -84,12 +105,12 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
with: with:
ref: "main" ref: 'main'
fetch-depth: 0 fetch-depth: 0
- name: "Get Previous tag" - name: 'Get Previous tag'
id: previoustag id: previoustag
uses: "WyriHaximus/github-action-get-previous-tag@v1" uses: 'WyriHaximus/github-action-get-previous-tag@v1'
with: with:
fallback: latest fallback: latest
@@ -106,6 +127,13 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push immich-web release - name: Build and push immich-web release
uses: docker/build-push-action@v3.2.0 uses: docker/build-push-action@v3.2.0
with: with:
@@ -117,6 +145,8 @@ jobs:
tags: | tags: |
altran1502/immich-web:${{ steps.previoustag.outputs.tag }} altran1502/immich-web:${{ steps.previoustag.outputs.tag }}
altran1502/immich-web:release altran1502/immich-web:release
ghcr.io/${{ github.repository_owner }}/immich-web:${{ steps.previoustag.outputs.tag }}
ghcr.io/${{ github.repository_owner }}/immich-web:release
build_and_push_nginx_release: build_and_push_nginx_release:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -124,12 +154,12 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
with: with:
ref: "main" ref: 'main'
fetch-depth: 0 fetch-depth: 0
- name: "Get Previous tag" - name: 'Get Previous tag'
id: previoustag id: previoustag
uses: "WyriHaximus/github-action-get-previous-tag@v1" uses: 'WyriHaximus/github-action-get-previous-tag@v1'
with: with:
fallback: latest fallback: latest
@@ -146,6 +176,13 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push immich-proxy release - name: Build and push immich-proxy release
uses: docker/build-push-action@v3.2.0 uses: docker/build-push-action@v3.2.0
with: with:
@@ -156,3 +193,5 @@ jobs:
tags: | tags: |
altran1502/immich-proxy:release altran1502/immich-proxy:release
altran1502/immich-proxy:${{ steps.previoustag.outputs.tag }} altran1502/immich-proxy:${{ steps.previoustag.outputs.tag }}
ghcr.io/${{ github.repository_owner }}/immich-proxy:${{ steps.previoustag.outputs.tag }}
ghcr.io/${{ github.repository_owner }}/immich-proxy:release

View File

@@ -4,6 +4,9 @@ dev:
dev-new: dev-new:
rm -rf ./server/dist && docker compose -f ./docker/docker-compose.dev.yml up --remove-orphans rm -rf ./server/dist && docker compose -f ./docker/docker-compose.dev.yml up --remove-orphans
dev-new-update:
rm -rf ./server/dist && docker compose -f ./docker/docker-compose.dev.yml up --build -V --remove-orphans
dev-update: dev-update:
rm -rf ./server/dist && docker-compose -f ./docker/docker-compose.dev.yml up --build -V --remove-orphans rm -rf ./server/dist && docker-compose -f ./docker/docker-compose.dev.yml up --build -V --remove-orphans
@@ -27,3 +30,6 @@ prod-scale:
api: api:
cd ./server && npm run api:generate cd ./server && npm run api:generate
attach-server:
docker exec -it docker_immich-server_1 sh

View File

@@ -1,9 +0,0 @@
# TODO
Server scenario with web
[ ] 1 user exist without admin right -> make admin on first check
[ ] 2 users exist without admin right -> ask user to choose which account will be the admin
[ X ] No users exist -> prompt signup form for Admin

View File

@@ -17,12 +17,15 @@
<img src="design/immich-screenshots.png" title="Main Screenshot"> <img src="design/immich-screenshots.png" title="Main Screenshot">
</a> </a>
<br/> <br/>
<p align="center">
<a href="README_zh_CN.md">中文</a>
</p>
## Disclaimer ## Disclaimer
- ⚠️ The project is under **very active** development. - ⚠️ The project is under **very active** development.
- ⚠️ Expect bugs and breaking changes. - ⚠️ Expect bugs and breaking changes.
- ⚠️ **Do not use as a single source to store of your photos and videos!** - ⚠️ **Do not use the app as the only way to store your photos and videos!**
## Content ## Content
@@ -35,6 +38,10 @@
- [Support The Project](#support-the-project) - [Support The Project](#support-the-project)
- [Known Issues](#known-issues) - [Known Issues](#known-issues)
## Documentation
You can find the main documentation, including installation guides, at https://immich.app/.
## Demo ## Demo
You can access the web demo at https://demo.immich.app You can access the web demo at https://demo.immich.app
@@ -68,7 +75,9 @@ Spec: Free-tier Oracle VM - Amsterdam - 2.4Ghz quad-core ARM64 CPU, 24GB RAM
| Search by metadata, objects and image tags | Yes | No | | Search by metadata, objects and image tags | Yes | No |
| Administrative functions (user management) | N/A | Yes | | Administrative functions (user management) | N/A | Yes |
| Background backup | Android | N/A | | Background backup | Android | N/A |
| Virtual scroll | N/A | Yes | | Virtual scroll | Yes | Yes |
| OAuth Support | Yes | Yes |
| LivePhotos Backup and Playback (iOS only) | Yes | Yes |
# Support the project # Support the project

115
README_zh_CN.md Normal file
View File

@@ -0,0 +1,115 @@
<p align="center">
<br/>
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/license-MIT-green.svg?color=3F51B5&style=for-the-badge&label=License&logoColor=000000&labelColor=ececec" alt="License: MIT"></a>
<a href="https://discord.gg/D8JsnBEuKb">
<img src="https://img.shields.io/discord/979116623879368755.svg?label=Discord&logo=Discord&style=for-the-badge&logoColor=000000&labelColor=ececec" atl="Discord"/>
</a>
<br/>
<br/>
</p>
<p align="center">
<img src="design/immich-logo.svg" width="150" title="Login With Custom URL">
</p>
<h3 align="center">Immich - 高性能的自托管照片和视频备份方案</h3>
<p align="center">
请注意: 此README不是由Immich团队维护, 这意味着它在某一时间点不会被更新,因为我们是依靠贡献者来更新的。感谢理解。
</p>
<br/>
<a href="https://immich.app">
<img src="design/immich-screenshots.png" title="Main Screenshot">
</a>
<br/>
<p align="center">
<a href="README.md">English</a>
</p>
## 免责声明
- ⚠️ 本项目正在 **非常活跃** 的开发中。
- ⚠️ 可能存在bug或者重大变更。
- ⚠️ **不要把本软件作为你存储照片或视频的唯一方式!**
## 目录
- [官方文档](https://immich.app/docs/overview/introduction)
- [示例](#示例)
- [功能特性](#功能特性)
- [介绍](https://immich.app/docs/overview/introduction)
- [安装](https://immich.app/docs/installation/requirements)
- [贡献指南](https://immich.app/docs/contribution-guidelines)
- [支持本项目](#support-the-project)
- [已知问题](#known-issues)
## 官方文档
你可以在 https://immich.app/ 找到包含安装手册的官方文档.
## 示例
你可以在 https://demo.immich.app 访问示例.
在移动端, 你可以使用 `https://demo.immich.app/api`获取`服务终端链接`
```bash title="示例认证信息"
认证信息
邮箱: demo@immich.app
密码: demo
```
```
规格: 甲骨文免费虚拟机套餐-阿姆斯特丹 4核 2.4Ghz ARM64 CPU, 24GB RAM。
```
# 功能特性
| 功能特性 | 移动端 | 网页端 |
| ------------------------------------------- | ------- | --- |
| 上传并查看照片和视频 | 是 | 是 |
| 软件运行时自动备份 | 是 | N/A |
| 选择需要备份的相册 | 是 | N/A |
| 下载照片和视频到本地 | 是 | 是 |
| 多用户支持 | 是 | 是 |
| 相册 | 是 | 是 |
| 共享相册 | 是 | 是 |
| 可拖动的快速导航栏 | 是 | 是 |
| 支持RAW格式 (HEIC, HEIF, DNG, Apple ProRaw) | 是 | 是 |
| 元数据视图 (EXIF, 地图) | 是 | 是 |
| 通过元数据、对象和标签进行搜索 | 是 | No |
| 管理功能 (用户管理) | N/A | 是 |
| 后台备份 | Android | N/A |
| 虚拟滚动 | 是 | 是 |
| OAuth支持 | 是 | 是 |
| 实时照片备份和查看 (仅iOS) | 是 | 是 |
# 支持本项目
我已经致力于本项目并且将我会持续更新文档、新增功能和修复问题。但是我不能一个人走下去,所以我需要你给予我走下去的动力。
就像我主页里面 [selfhosted.show - In the episode 'The-organization-must-not-be-name is a Hostile Actor'](https://selfhosted.show/79?t=1418) 说的一样,这是我和团队的一项艰巨的任务。我希望某一天我能够全职开发本项目,在此我希望你们能够助我梦想成真。
如果你使用了本项目一段时间,并且觉得上面的话有道理,那么请你按照如下方式帮助我吧。
## 捐赠
- [按月捐赠](https://github.com/sponsors/alextran1502) via GitHub Sponsors
- [一次捐赠](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502) via Github Sponsors
# 已知问题
## TensorFlow 构建问题
_这是一个针对于Proxmox的已知问题_
TensorFlow 不能运行在很旧的CPU架构上, 需要运行在AVX和AVX2指令集的CPU上。如果你在docker-compose的命令行中遇到了 `illegal instruction core dump`的错误, 通过如下命令检查你的CPU flag寄存器然后确保你能够看到`AVX`和`AVX2`的字样:
```bash
more /proc/cpuinfo | grep flags
```
如果你在Proxmox中运行虚拟机, 虚拟机中没有启用flag寄存器。
你需要在虚拟机的硬件面板中把CPU类型从`kvm64`改为`host`。
`Hardware > Processors > Edit > Advanced > Type (dropdown menu) > host`

View File

@@ -23,7 +23,9 @@ REDIS_HOSTNAME=immich_redis
# REDIS_SOCKET= # REDIS_SOCKET=
################################################################################### ###################################################################################
# Upload File Config # Upload File Location
#
# This is the location where uploaded files are stored.
################################################################################### ###################################################################################
UPLOAD_LOCATION=absolute_location_on_your_machine_where_you_want_to_store_the_backup UPLOAD_LOCATION=absolute_location_on_your_machine_where_you_want_to_store_the_backup
@@ -36,19 +38,17 @@ LOG_LEVEL=simple
################################################################################### ###################################################################################
# JWT SECRET # JWT SECRET
################################################################################### #
# This JWT_SECRET is used to sign the authentication keys for user login # This JWT_SECRET is used to sign the authentication keys for user login
# You should set it to a long randomly generated value # You should set it to a long randomly generated value
# You can use this command to generate one: openssl rand -base64 128 # You can use this command to generate one: openssl rand -base64 128
###################################################################################
JWT_SECRET= JWT_SECRET=
################################################################################### ###################################################################################
# Reverse Geocoding # Reverse Geocoding
#################################################################################### #
# DISABLE_REVERSE_GEOCODING=false
# Reverse geocoding is done locally which has a small impact on memory usage # Reverse geocoding is done locally which has a small impact on memory usage
# This memory usage can be altered by changing the REVERSE_GEOCODING_PRECISION variable # This memory usage can be altered by changing the REVERSE_GEOCODING_PRECISION variable
# This ranges from 0-3 with 3 being the most precise # This ranges from 0-3 with 3 being the most precise
@@ -56,14 +56,44 @@ JWT_SECRET=
# 2 - Cities > 1000 population: ~150MB RAM # 2 - Cities > 1000 population: ~150MB RAM
# 1 - Cities > 5000 population: ~80MB RAM # 1 - Cities > 5000 population: ~80MB RAM
# 0 - Cities > 15000 population: ~40MB RAM # 0 - Cities > 15000 population: ~40MB RAM
####################################################################################
# DISABLE_REVERSE_GEOCODING=false
# REVERSE_GEOCODING_PRECISION=3 # REVERSE_GEOCODING_PRECISION=3
#################################################################################### ####################################################################################
# WEB - Optional # WEB - Optional
#
# Custom message on the login page, should be written in HTML form.
# For example:
# PUBLIC_LOGIN_PAGE_MESSAGE="This is a demo instance of Immich.<br><br>Email: <i>demo@demo.de</i><br>Password: <i>demo</i>"
#################################################################################### ####################################################################################
# Custom message on the login page, should be written in HTML form.
# For example PUBLIC_LOGIN_PAGE_MESSAGE="This is a demo instance of Immich.<br><br>Email: <i>demo@demo.de</i><br>Password: <i>demo</i>"
PUBLIC_LOGIN_PAGE_MESSAGE= PUBLIC_LOGIN_PAGE_MESSAGE=
####################################################################################
# Alternative Service Addresses - Optional
#
# This is an advanced feature for users who may be running their immich services on different hosts.
# It will not change which address or port that services bind to within their containers, but it will change where other services look for their peers.
# Note: immich-microservices is bound to 3002, but no references are made
####################################################################################
# IMMICH_WEB_URL=http://immich-web:3000
# IMMICH_SERVER_URL=http://immich-server:3001
# IMMICH_MACHINE_LEARNING_URL=http://immich-machine-learning:3003
####################################################################################
# OAuth Setting - Optional
#
# These setting will enable OAuth login for your instance of Immich
# Folow the instructions in the page https://immich.app/docs/usage/oauth to set up your OAuth provider
####################################################################################
# OAUTH_ENABLED=false
# OAUTH_ISSUER_URL=
# OAUTH_CLIENT_ID=
# OAUTH_CLIENT_SECRET=
# OAUTH_BUTTON_TEXT=Login with OAuth
# OAUTH_AUTO_REGISTER=true
# OAUTH_SCOPE="openid profile email"

View File

@@ -68,6 +68,9 @@ services:
command: npm run dev --host command: npm run dev --host
env_file: env_file:
- .env - .env
environment:
# Rename these values for svelte public interface
- PUBLIC_IMMICH_SERVER_URL=${IMMICH_SERVER_URL}
ports: ports:
- 3000:3000 - 3000:3000
- 24678:24678 - 24678:24678
@@ -100,6 +103,10 @@ services:
immich-proxy: immich-proxy:
container_name: immich_proxy container_name: immich_proxy
image: immich-proxy-dev:latest image: immich-proxy-dev:latest
environment:
# Make sure these values get passed through from the env file
- IMMICH_SERVER_URL
- IMMICH_WEB_URL
build: build:
context: ../nginx context: ../nginx
dockerfile: Dockerfile dockerfile: Dockerfile

View File

@@ -47,6 +47,9 @@ services:
entrypoint: ["/bin/sh", "./entrypoint.sh"] entrypoint: ["/bin/sh", "./entrypoint.sh"]
env_file: env_file:
- .env - .env
environment:
# Rename these values for svelte public interface
- PUBLIC_IMMICH_SERVER_URL=${IMMICH_SERVER_URL}
restart: always restart: always
redis: redis:
@@ -71,6 +74,10 @@ services:
immich-proxy: immich-proxy:
container_name: immich_proxy container_name: immich_proxy
image: altran1502/immich-proxy:staging image: altran1502/immich-proxy:staging
environment:
# Make sure these values get passed through from the env file
- IMMICH_SERVER_URL
- IMMICH_WEB_URL
ports: ports:
- 2283:8080 - 2283:8080
logging: logging:

View File

@@ -1,4 +1,4 @@
version: "3.8" version: '3.8'
services: services:
immich-server-test: immich-server-test:
@@ -9,7 +9,7 @@ services:
target: builder target: builder
command: npm run test:e2e command: npm run test:e2e
expose: expose:
- "3000" - '3000'
volumes: volumes:
- ../server:/usr/src/app - ../server:/usr/src/app
- /usr/src/app/node_modules - /usr/src/app/node_modules

View File

@@ -47,6 +47,9 @@ services:
entrypoint: ["/bin/sh", "./entrypoint.sh"] entrypoint: ["/bin/sh", "./entrypoint.sh"]
env_file: env_file:
- .env - .env
environment:
# Rename these values for svelte public interface
- PUBLIC_IMMICH_SERVER_URL=${IMMICH_SERVER_URL}
restart: always restart: always
redis: redis:
@@ -71,6 +74,10 @@ services:
immich-proxy: immich-proxy:
container_name: immich_proxy container_name: immich_proxy
image: altran1502/immich-proxy:release image: altran1502/immich-proxy:release
environment:
# Make sure these values get passed through from the env file
- IMMICH_SERVER_URL
- IMMICH_WEB_URL
ports: ports:
- 2283:8080 - 2283:8080
logging: logging:

1
docs/.gitignore vendored
View File

@@ -18,3 +18,4 @@
npm-debug.log* npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*
yarn.lock

View File

@@ -1,12 +0,0 @@
---
slug: first-blog-post
title: First Blog Post
authors:
name: Gao Wei
title: Docusaurus Core Team
url: https://github.com/wgao19
image_url: https://github.com/wgao19.png
tags: [hola, docusaurus]
---
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

View File

@@ -1,44 +0,0 @@
---
slug: long-blog-post
title: Long Blog Post
authors: endi
tags: [hello, docusaurus]
---
This is the summary of a very long blog post,
Use a `<!--` `truncate` `-->` comment to limit blog post size in the list view.
<!--truncate-->
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

View File

@@ -1,20 +0,0 @@
---
slug: mdx-blog-post
title: MDX Blog Post
authors: [slorber]
tags: [docusaurus]
---
Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/).
:::tip
Use the power of React to create interactive blog posts.
```js
<button onClick={() => alert('button clicked!')}>Click me!</button>
```
<button onClick={() => alert('button clicked!')}>Click me!</button>
:::

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

View File

@@ -1,25 +0,0 @@
---
slug: welcome
title: Welcome
authors: [slorber, yangshun]
tags: [facebook, hello, docusaurus]
---
[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog).
Simply add Markdown files (or folders) to the `blog` directory.
Regular blog authors can be added to `authors.yml`.
The blog post date can be extracted from filenames, such as:
- `2019-05-30-welcome.md`
- `2019-05-30-welcome/index.md`
A blog post folder can be convenient to co-locate blog post images:
![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg)
The blog supports tags as well!
**And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config.

View File

@@ -1,17 +1,5 @@
endi: alextran:
name: Endilie Yacop Sucipto name: Alex Tran
title: Maintainer of Docusaurus title: Maintainer of Immich
url: https://github.com/endiliey url: https://github.com/alextran1502
image_url: https://github.com/endiliey.png image_url: https://github.com/alextran1502.png
yangshun:
name: Yangshun Tay
title: Front End Engineer @ Facebook
url: https://github.com/yangshun
image_url: https://github.com/yangshun.png
slorber:
name: Sébastien Lorber
title: Docusaurus maintainer
url: https://sebastienlorber.com
image_url: https://github.com/slorber.png

View File

@@ -0,0 +1,114 @@
---
slug: release-1-36
title: Release v1.36.0
authors: [alextran]
tags: [release]
date: 2022-11-10
---
Hello everyone, it is my pleasure to deliver the new release of Immich to you. The team has been working hard to bring you the new features and improvements. This release includes some big features that the community has been asking since the beginning of Immich. We hope you will enjoy it.
Some notable features are:
- [OAuth integration](#livephoto-ios-support-)
- [LivePhoto support on iOS](#oauth-integration-)
- User config system
<!--truncate-->
## LivePhoto iOS Support 🎉
LivePhoto on iOS is now supported in Immich.
The motion part will now be uploaded and can be played on the mobile app and the web.
:::caution
- The server and the app has to be on version **1.36.x** for the application to work correctly.
- Previous uploaded photos will not be updated automatically, you will have to remove and reupload them if you want to keep the LivePhoto functionality.
:::
<img
src="https://media.giphy.com/media/fTrGceZd7t1ewi8ESc/giphy.gif"
width="100%"
style={{
borderRadius: "10px",
boxShadow:
"rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px",
}}
title="LivePhoto playback on the web"
/>
## OAuth Integration 🎉
I want to borrow this chance to express my gratitude to [@EnricoBilla](https://github.com/EnricoBilla), who has been the trailblazer for this feature since the beginning days of Immich. His PR has sparked ideas, suggestions, and discussion among the team member on how to integrate this feature successfully into the app. Thank you so much for your work and your time.
OAuth is now integrated into the system. Please follow the guide [here](https://immich.app/docs/usage/oauth) to set up your OAuth integration
After setting up the correct environment variables in the `.env` file, as shown below
| Key | Type | Default | Description |
| ------------------- | ------- | -------------------- | ------------------------------------------------------------------------- |
| OAUTH_ENABLED | boolean | false | Enable/disable OAuth2 |
| OAUTH_ISSUER_URL | URL | (required) | Required. Self-discovery URL for client |
| OAUTH_CLIENT_ID | string | (required) | Required. Client ID |
| OAUTH_CLIENT_SECRET | string | (required) | Required. Client Secret |
| OAUTH_SCOPE | string | openid email profile | Full list of scopes to send with the request (space delimited) |
| OAUTH_AUTO_REGISTER | boolean | true | When true, will automatically register a user the first time they sign in |
| OAUTH_BUTTON_TEXT | string | Login with OAuth | Text for the OAuth button on the web |
```bash title="Authentik Example"
OAUTH_ENABLED=true
OAUTH_ISSUER_URL=http://10.1.15.216:9000/application/o/immich-test/
OAUTH_CLIENT_ID=30596v8f78a4b6a97d5985c3076b6b4c4d12ddc33
OAUTH_CLIENT_SECRET=50f1eafdec353b95b1c638db390db4ab67ef035a51212dbec2f56175e2eb272b5d572c099176e6fe116ecf47ffdd544bgdb9e2edc588307ee0339d25eeccd88
OAUTH_BUTTON_TEXT=Login with Authentik
```
The web will have the option to sign in with OAuth.
<img
src="https://user-images.githubusercontent.com/27055614/202923726-f43fa148-47f5-4182-8f29-b0b87e4586fa.png"
width="50%"
title="Web Sign in with OAuth"
style={{
borderRadius: "10px",
boxShadow:
"rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px",
}}
/>
The mobile app will check if the server has OAuth enabled before displaying the OAuth
sign-in button.
<img
src="https://media.giphy.com/media/3iy3SaNkVYtlkEiw06/giphy.gif"
title="Mobile sign in with OAuth"
style={{
borderRadius: "10px",
boxShadow:
"rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px",
}}
/>
## Support
<img
src="https://media.giphy.com/media/LStqgGESXW8XnuCv5y/giphy.gif"
width="300"
style={{
borderRadius: "10px",
boxShadow:
"rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px",
}}
title="Support the project"
/>
If you find the project helpful and it helps you in some ways, you can support the project [one time](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502) or [monthly](https://github.com/sponsors/alextran1502) from GitHub Sponsor
It is a great way to let me know that you want me to continue developing and working on this project for years to come.
## Details
For more details, please check out the [release note](https://github.com/immich-app/immich/releases/tag/v1.36.0_55-dev)

View File

@@ -3,3 +3,23 @@ sidebar_position: 6
--- ---
# FAQ # FAQ
### What is the difference between the cloud icon on the mobile app?
| Icon | Description |
| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| ![cloud](/img/cloud.svg) | Asset is only available in the cloud and was uploaded from some other device (like the web client) or was deleted from this device after upload |
| ![cloud-cross](/img/cloud-off.svg) | Asset is only available locally and has not yet been backed up |
| ![cloud-done](/img/cloud-done.svg) | Asset was uploaded from this device and is now backed up in the cloud/server and still available in original on the device |
### How can I sync an existing directory with Immich's server?
Immich doesn't have the mechanism to sync an existing directory with the server. There is however, a helper CLI tool to help you bulk upload the existing photos and videos to the server. You can find the guide to use the CLI tool [here](/docs/usage/bulk-upload.md).
### Why doesn't Immich watch an existing photo gallery directory?
The initial approach of Immich is to become a backup tool, primarily for mobile device usage. Thus, all the assets must be uploaded from the mobile client. The app was architectured to perform that job well.
### How can I reset the admin password?
The admin password can be reset by running the [reset-admin-password](/docs/usage/server-commands) command on the immich-server.

View File

@@ -20,14 +20,23 @@ This environment includes the following services:
All the services are packaged to run as with single Docker Compose command. All the services are packaged to run as with single Docker Compose command.
After cloning the project, from the root directory run ### Instructions
1. Clone the project repo.
2. Run `cp docker/.env.example docker/.env`.
3. Edit `docker/.env` to provide values for the required variables `UPLOAD_LOCATION` and `JWT_SECRET`.
4. From the root directory, run:
```bash title="Start development server" ```bash title="Start development server"
make dev # required Makefile installed on the system. make dev # required Makefile installed on the system.
``` ```
5. Access the dev instance in your browser at http://localhost:2283, or connect via the mobile app.
All the services will be started with hot-reloading enabled for a quick feedback loop. All the services will be started with hot-reloading enabled for a quick feedback loop.
You can access the web from `http://your-machine-ip:2283` or `http://localhost:2283` and access the server from the mobile app at `http://your-machine-ip:2283/api`
### Mobile app ### Mobile app
The mobile app `(/mobile)` will required Flutter toolchain to be installed on your system. The mobile app `(/mobile)` will required Flutter toolchain to be installed on your system.
@@ -80,3 +89,15 @@ OpenAPI is used to generate the client (Typescript, Dart) SDK. `openapi-generato
npm run api:generate # Run from the `server` directory npm run api:generate # Run from the `server` directory
``` ```
You can find the generated client SDK in the `web/src/api` for Typescript SDK and `mobile/openapi` for Dart SDK. You can find the generated client SDK in the `web/src/api` for Typescript SDK and `mobile/openapi` for Dart SDK.
## Database migrations
After making any changes in the `server/libs/database/src/entities`, a database migration need to run in order to register the changes in the database. Follow the steps below to create a new migration.
1. Attached to the server container shell.
2. Run
```bash
npm run typeorm -- migration:generate ./libs/database/src/<migration-name> -d libs/database/src/config/database.config.ts
```
3. Check if the migration file makes sense.
4. Move the migration file to folder `server/libs/database/src/migrations` in your code editor.

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -22,7 +22,7 @@ The script will perform the following actions:
The web application will be available at `http://<machine-ip-address>:2283`, and the server URL for the mobile app will be `http://<machine-ip-address>:2283/api` The web application will be available at `http://<machine-ip-address>:2283`, and the server URL for the mobile app will be `http://<machine-ip-address>:2283/api`
The directory which is used to store the backup file is `./immich-app/immich-data` relative to the current directory. The directory which is used to store the library files is `./immich-data` relative to the current directory.
:::tip :::tip
For more information on how to use the application, please refer to the [Post Installation](/docs/usage/post-installation) guide. For more information on how to use the application, please refer to the [Post Installation](/docs/usage/post-installation) guide.

View File

@@ -9,7 +9,7 @@ Install Immich using Portainer's Stack feature.
1. Go to "**Stacks**" in the left sidebar. 1. Go to "**Stacks**" in the left sidebar.
2. Click on "**Add stack**". 2. Click on "**Add stack**".
3. Give the stack a name (i.e. Immich), and select "**Web Editor**" as the build method. 3. Give the stack a name (i.e. Immich), and select "**Web Editor**" as the build method.
4. Copy the content of the `docker-compose.yml` file from the [GitHub repository](https://raw.githubusercontent.com/immich-app/immich/main/docker/docker-compose.yml) 4. Copy the content of the `docker-compose.yml` file from the [GitHub repository](https://raw.githubusercontent.com/immich-app/immich/main/docker/docker-compose.yml).
5. Replace `.env` with `stack.env` for all containers that need to use environment variables in the web editor. 5. Replace `.env` with `stack.env` for all containers that need to use environment variables in the web editor.
<img <img
@@ -28,7 +28,7 @@ Install Immich using Portainer's Stack feature.
alt="Dot Env Example" alt="Dot Env Example"
/> />
9. Copy the content of the `.env.example` file from the [GitHub repository](https://raw.githubusercontent.com/immich-app/immich/main/docker/.env.example) and paste to the editor. 9. Copy the content of the `.env.example` file from the [GitHub repository](https://raw.githubusercontent.com/immich-app/immich/main/docker/.env.example) and paste into the editor.
10. Switch back to "**Simple Mode**". 10. Switch back to "**Simple Mode**".
<img <img
@@ -39,8 +39,8 @@ Install Immich using Portainer's Stack feature.
/> />
* Populate custom database information if necessary. * Populate custom database information if necessary.
* Populate `UPLOAD_LOCATION` as prefered location for storing backup assets. * Populate `UPLOAD_LOCATION` with your preferred location for storing backup assets.
* Populate a secret value for `JWT_SECRET`, you can use the command below to generate a secured key * Populate a secret value for `JWT_SECRET`. You can use the command below to generate a secure key:
```bash title="Generate secure JWT_SECRET key" ```bash title="Generate secure JWT_SECRET key"
openssl rand -base64 128 openssl rand -base64 128

View File

@@ -69,9 +69,7 @@ LOG_LEVEL=simple
# This JWT_SECRET is used to sign the authentication keys for user login # This JWT_SECRET is used to sign the authentication keys for user login
# You should set it to a long randomly generated value # You should set it to a long randomly generated value
# You can use this command to generate one: openssl rand -base64 128 # You can use this command to generate one: openssl rand -base64 128
JWT_SECRET=kWPdavjCECB0yoXgUHA/vpwpIKdCi/4ODVLIOe9WIi6AQlFfjWEuIVhWT3DtJE+T JWT_SECRET=
CTckJnpwGgSK5AoqD+A8DZKsHCRdfVnlQIVqqmyR8isZTcxL5DWYQUSDRzyOO5OA
ZRUTE63FxiYhrRoe/y1yr5mV1osGy6mm6NZW8T2Tjwc=
################################################################################### ###################################################################################
# Reverse Geocoding # Reverse Geocoding
@@ -102,8 +100,8 @@ PUBLIC_LOGIN_PAGE_MESSAGE="My Family Photos and Videos Backup Server"
</details> </details>
* Populate custom database information if necessary. * Populate custom database information if necessary.
* Populate `UPLOAD_LOCATION` as prefered location for storing backup assets. * Populate `UPLOAD_LOCATION` with your preferred location for storing backup assets.
* Populate a secret value for `JWT_SECRET`, you can use the command below to generate a secure key * Populate a secret value for `JWT_SECRET`. You can use the command below to generate a secure key:
```bash title="Command to generate secure JWT_SECRET key" ```bash title="Command to generate secure JWT_SECRET key"
openssl rand -base64 128 openssl rand -base64 128

View File

@@ -12,14 +12,14 @@ Hardware and software requirements for Immich
- [Docker Compose](https://docs.docker.com/compose/install/) - [Docker Compose](https://docs.docker.com/compose/install/)
:::info Podman :::info Podman
You can also use Podman to run the application. However, additional configurations might be required on your end. You can also use Podman to run the application. However, additional configuration might be required on your end.
::: :::
## Hardware ## Hardware
- **OS**: Preferred unix-based operating system (Ubuntu, Debian, MacOS...etc). Windows works too, with [Docker Desktop on Windows](https://docs.docker.com/desktop/install/windows-install/) - **OS**: Preferred unix-based operating system (Ubuntu, Debian, MacOS, etc). Windows works too, with [Docker Desktop on Windows](https://docs.docker.com/desktop/install/windows-install/)
- **Ram**: At least 2GB, preferred 4GB. - **RAM**: At least 2GB, preferred 4GB.
- **Core**: At least 2 cores, preferred 4 cores. - **CPU**: At least 2 cores, preferred 4 cores.
## Installation methods ## Installation methods

View File

@@ -4,12 +4,104 @@ sidebar_position: 5
# Unraid # Unraid
Install Immich on Unraid. Install Immich on Unraid using the [Docker Compose Manager](https://forums.unraid.net/topic/114415-plugin-docker-compose-manager/) plugin from the Unraid Community Apps.
:::info
- Guide was written using Unraid v6.11.1
- Requires you to have installed the plugin: [Docker Compose Manager](https://forums.unraid.net/topic/114415-plugin-docker-compose-manager/)
- An Unraid share created for your images
- There has been a [report](https://forums.unraid.net/topic/130006-errortraps-traps-node27707-trap-invalid-opcode-ip14fcfc8d03c0-sp7fff32889dd8-more/#comment-1189395) of this not working if your Unraid server doesn't support AVX _(e.g. using a T610)_
:::info Community contribution
Please follow this community contributed [article](https://mfaz.dev/posts/immich-unraid/) to install Immich on Unraid.
::: :::
1. Go to "**Plugins**" and click on "**Compose.Manager**"
2. Click "**Add New Stack**" and when prompted for a label enter "**Immich**"
<img
src={require('./img/unraid01.webp').default}
width="70%"
alt="Select Plugins > Compose.Manager > Add New Stack > Label it Immich"
/>
3. Select the cog ⚙️ next to Immich then click "**Edit Stack**"
4. Click "**Compose File**" and then paste the entire contents of the [Immich Docker Compose](https://raw.githubusercontent.com/immich-app/immich/main/docker/docker-compose.yml) file into the Unraid editor
<details >
<summary>Using an existing Postgres container? Click me! Otherwise proceed to step 5.</summary>
<ul>
<li>Comment out the database service</li>
<img
src={require('./img/unraid02.png').default}
width="50%"
alt="Comment out database service in the compose file"
/>
<li>Comment out the database dependency for <b>each service</b> <i>(example in screenshot below only shows 2 of the services - ensure you do this for all services)</i></li>
<img
src={require('./img/unraid03.png').default}
width="50%"
alt="Comment out every reference to the database service in the compose file"
/>
<li>Comment out the volumes</li>
<img
src={require('./img/unraid04.png').default}
width="20%"
alt="Comment out database volume"
/>
</ul>
</details>
5. Click "**Save Changes**", you will be promoted to edit stack UI labels, just leave this blank and click "**Ok**"
6. Select the cog ⚙️ next to Immich, click "**Edit Stack**", then click "**Env File**"
7. Past the entire contents of the [Immich .env.example](https://raw.githubusercontent.com/immich-app/immich/main/docker/.env.example) file into the Unraid editor, then **before saving** edit the following:
- `JWT_SECRET`: Generate a unique secret and paste the value here > Can be generated by either typing `openssl rand -base64 128` in your terminal or copying from [uuidgenerator](https://www.uuidgenerator.net/version1)
- `UPLOAD_LOCATION`: Create a folder in your Images Unraid share and place the **absolute** location here > For example my _"images"_ share has a folder within it called _"immich"_. If I browse to this directory in the terminal and type `pwd` the output is `/mnt/user/images/immich`. This is the exact value I need to enter as my `UPLOAD_LOCATION`
<img
src={require('./img/unraid05.webp').default}
width="70%"
alt="Absolute location of where you want immich images stored"
/>
<details >
<summary>Using an existing Postgres container? Click me! Otherwise proceed to step 8.</summary>
<p>Update the following database variables as relevant to your Postgres container:</p>
<ul>
<li><code>DB_HOSTNAME</code></li>
<li><code>DB_USERNAME</code></li>
<li><code>DB_PASSWORD</code></li>
<li><code>DB_DATABASE_NAME</code></li>
<li><code>DB_PORT</code></li>
</ul>
</details>
8. Click "**Save Changes**" followed by "**Compose Up**" and Unraid will begin to create the Immich containers in a popup window. Once complete you will see a message on the popup window stating _"Connection Closed"_. Click "**Done**" and go to the Unraid "**Docker**" page
> Note: This can take several minutes depending on your Internet speed and Unraid hardware
9. Once on the Docker page you will see several Immich containers, one of them will be labelled `immich_proxy` and will have a port mapping. Visit the `IP:PORT` displayed in your web browser and you should see the Immich admin setup page.
<img
src={require('./img/unraid06.webp').default}
width="80%"
alt="Go to Docker Tab and visit the address listed next to immich-proxy"
/>
<details >
<summary>Using the Unraid Docker Folders plugin? Click me! Otherwise you're complete!</summary>
<p>If you are using the Docker Folders plugin go the Docker tab and select "<b>New Folder</b>".<br />Label it <i>"Immich"</i> and use the logo from the <a href="https://immich.app/">Immich homepage</a> <i>(right click the logo, "Save As", and reupload to Unraid)</i><br />Then simply select all the Immich related containers before clicking "<b>Submit</b>"</p>
<img
src={require('./img/unraid07.webp').default}
width="80%"
alt="Go to Docker Tab and visit the address listed next to immich-proxy"
/>
<img
src={require('./img/unraid08.webp').default}
width="90%"
alt="Go to Docker Tab and visit the address listed next to immich-proxy"
/>
</details>
:::tip :::tip
For more information on how to use the application, please refer to the [Post Installation](/docs/usage/post-installation) guide. For more information on how to use the application once installed, please refer to the [Post Installation](/docs/usage/post-installation) guide.
::: :::

View File

@@ -10,7 +10,7 @@ I really like the Japanese culture, especially the books, history, and food. The
![Oda_emblem](https://user-images.githubusercontent.com/27055614/182044504-a5ed33a8-5640-42de-b359-18fdbee9fb90.svg) ![Oda_emblem](https://user-images.githubusercontent.com/27055614/182044504-a5ed33a8-5640-42de-b359-18fdbee9fb90.svg)
One of my favorite books is [Taikō](https://www.goodreads.com/book/show/336228.Taiko), it is the story about a prominent figure in the history of Japan, [Toyotomy Hideyoshi](https://www.britannica.com/biography/Toyotomi-Hideyoshi). He came from nothing, and through his resilience and wonderful mind, he has become one of the most powerful rulers in Japan's history. I enjoy his personality and the way he moved through life. One of my favorite books is [Taikō](https://www.goodreads.com/book/show/336228.Taiko), it is a story about a prominent figure in the history of Japan, [Toyotomy Hideyoshi](https://www.britannica.com/biography/Toyotomi-Hideyoshi). He came from nothing, and through his resilience and wonderful mind, he has become one of the most powerful rulers in Japan's history. I enjoy his personality and the way he moved through life.
The color is an adaptation of **_App-Which-Must-Not-Be-Named_**'s color scheme, with an extra color (pink) to complete the flower's fifth petal. The petal layers are the same color scheme as the main layer rotating back and forth to "bring the flower to life." The color is an adaptation of **_App-Which-Must-Not-Be-Named_**'s color scheme, with an extra color (pink) to complete the flower's fifth petal. The petal layers are the same color scheme as the main layer rotating back and forth to "bring the flower to life."

View File

@@ -6,7 +6,7 @@ sidebar_position: 3
I've committed to this project, and I will not stop. I will keep updating the docs, adding new features, and fixing bugs. But I can't do it alone, so I need your help to give me additional motivation to keep going. I've committed to this project, and I will not stop. I will keep updating the docs, adding new features, and fixing bugs. But I can't do it alone, so I need your help to give me additional motivation to keep going.
As our hosts in the [selfhosted.show - In the episode 'The-organization-must-not-be-name is a Hostile Actor'](https://selfhosted.show/79?t=1418) said, this is a massive undertaking; what the team and I are doing. I would love to someday be able to do this full-time, and I am asking for your help to make that happen. As our hosts in the [selfhosted.show - In the episode 'The-organization-which-must-not-be-named is a Hostile Actor'](https://selfhosted.show/79?t=1418) said, this is a massive undertaking that the team and I are doing. I would love to someday be able to do this full-time, and I am asking for your help to make that happen.
If you feel like this is the right cause and the app is something you see yourself using for a long time, please consider supporting the project with the options below. If you feel like this is the right cause and the app is something you see yourself using for a long time, please consider supporting the project with the options below.

View File

@@ -4,7 +4,7 @@ sidebar_position: 4
# Technology stack # Technology stack
The app is built with the following technologies The app is built with the following technologies:
## Frontend ## Frontend
* [Flutter](https://flutter.dev/) for the mobile app * [Flutter](https://flutter.dev/) for the mobile app

View File

@@ -1,5 +1,5 @@
{ {
"label": "How to use the application", "label": "Usage",
"position": 3, "position": 3,
"link": { "link": {
"type": "generated-index", "type": "generated-index",

View File

@@ -31,5 +31,5 @@ A native Android notification shows up when the background upload is in progress
:::note :::note
* The app must be in the background for the backup worker to start running. * The app must be in the background for the backup worker to start running.
* It is a well-known problem that some Android models are very strict with battery optimization settings, which can cause a problem with the background worker. Please visit [Don't kill my app](https://dontkillmyapp.com/) for a guide on disabling this setting on your phone. * It is a well-known problem that some Android models are very strict with battery optimization settings, which can cause a problem with the background worker. Please visit [Don't kill my app](https://dontkillmyapp.com/) for a guide on disabling this setting on your phone.
* If you reopen the app and the first page you see is the backup page, the counts will reflect the background uploaded result. You have to navigate out of the page and come back to see the updated counts. * If you reopen the app and the first page you see is the backup page, the counts will not reflect the background uploaded result. You have to navigate out of the page and come back to see the updated counts.
::: :::

View File

@@ -8,17 +8,19 @@ You can use the CLI to upload an existing gallery to the Immich server
[Immich CLI Repository](https://github.com/immich-app/CLI) [Immich CLI Repository](https://github.com/immich-app/CLI)
## Requirements ## Requirements
* Node.js 16 or above
* Npm - Node.js 16 or above
- Npm
## Installation ## Installation
```bash ```bash
npm i -g immich npm i -g immich
``` ```
## Quick Start ## Quick Start
Specify user's credentials, Immich's server address and port, and the directory you would like to upload videos/photos from. Specify user's credentials, Immich's server address and port, and the directory you would like to upload videos/photos from.
```bash ```bash
@@ -58,10 +60,9 @@ immich upload --email testuser@email.com --password password --server http://192
### Run from source ### Run from source
```bash title="Clone Repository" ```bash title="Clone Repository"
git clone https://github.com/alextran1502/immich-cli git clone https://github.com/immich-app/CLI
``` ```
```bash title="Install dependencies" ```bash title="Install dependencies"
npm install npm install
``` ```

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

66
docs/docs/usage/oauth.md Normal file
View File

@@ -0,0 +1,66 @@
---
sidebar_position: 5
---
# OAuth Authentication
This page contains details about using OAuth 2 in Immich.
## Overview
Immich supports 3rd party authentication via [OpenID Connect][oidc] (OIDC), an identity layer built on top of OAuth2. OIDC is supported by most identity providers, including:
- [Authentik](https://goauthentik.io/integrations/sources/oauth/#openid-connect)
- [Authelia](https://www.authelia.com/configuration/identity-providers/open-id-connect/)
- [Okta](https://www.okta.com/openid-connect/)
- [Google](https://developers.google.com/identity/openid-connect/openid-connect)
## Prerequisites
Before enabling OAuth in Immich, a new client application needs to be configured in the 3rd-party authentication server. While the specifics of this setup vary from provider to provider, the general approach should be the same.
1. Create a new (Client) Application
1. The **Provider** type should be `OpenID Connect` or `OAuth2`
2. The **Client type** should be `Confidential`
3. The **Application** type should be `Web`
4. The **Grant** type should be `Authorization Code`
2. Configure Redirect URIs/Origins
The **Sign-in redirect URIs** should include:
- All URLs that will be used to access the login page of the Immich web client (eg. `http://localhost:2283/auth/login`, `http://192.168.0.200:2283/auth/login`, `https://immich.example.com/auth/login`)
- Mobile app redirect URL `app.immich:/`
:::caution
You **MUST** include `app.immich:/` as the redirect URI for iOS and Android mobile app to work properly.
**Authentik example**
<img src={require('./img/authentik-redirect.png').default} title="Authentik Redirection URL" width="80%" />
:::
## Enable OAuth
Once you have a new OAuth client application configured, Immich can be configured using the Administration Settings page, available on the web (Administration -> Settings).
| Setting | Type | Default | Description |
| ------------------- | ------- | -------------------- | ------------------------------------------------------------------------- |
| OAuth enabled | boolean | false | Enable/disable OAuth2 |
| OAuth issuer URL | URL | (required) | Required. Self-discovery URL for client (from previous step) |
| OAuth client ID | string | (required) | Required. Client ID (from previous step) |
| OAuth client secret | string | (required) | Required. Client Secret (previous step) |
| OAuth scope | string | openid email profile | Full list of scopes to send with the request (space delimited) |
| OAuth button text | string | Login with OAuth | Text for the OAuth button on the web |
| OAuth auto register | boolean | true | When true, will automatically register a user the first time they sign in |
:::info
The Issuer URL should look something like the following, and return a valid json document.
- `https://accounts.google.com/.well-known/openid-configuration`
- `http://localhost:9000/application/o/immich/.well-known/openid-configuration`
The `.well-known/openid-configuration` part of the url is optional and will be automatically added during discovery.
:::
[oidc]: https://openid.net/connect/

View File

@@ -0,0 +1,25 @@
---
sidebar_position: 5
---
# Server Commands
The `immich-server` docker image comes preinstalled with an administrative CLI that supports the following commands:
| Command | Description |
| ----------------------------- | ------------------------------------- |
| `immich help` | Display help |
| `immich reset-admin-password` | Reset the password for the admin user |
## How to run a command
To run a command, connect to the container and then execute it. For example:
```bash
docker exec -it immich-server_1 sh
/usr/src/app$ immich reset-admin-password
? Please choose a new password (optional) immich-is-awesome-unlike-this-password
New password:
immich-is-awesome-unlike-this-password
```

View File

@@ -30,8 +30,8 @@ const config = {
presets: [ presets: [
[ [
"classic", "docusaurus-preset-openapi",
/** @type {import('@docusaurus/preset-classic').Options} */ /** @type {import('docusaurus-preset-openapi').Options} */
({ ({
docs: { docs: {
showLastUpdateAuthor: true, showLastUpdateAuthor: true,
@@ -42,6 +42,10 @@ const config = {
// Remove this to remove the "edit this page" links. // Remove this to remove the "edit this page" links.
editUrl: "https://github.com/immich-app/immich/tree/main/docs/", editUrl: "https://github.com/immich-app/immich/tree/main/docs/",
}, },
api: {
path: "../server/immich-openapi-specs.json",
routeBasePath: "/docs/api"
},
// blog: { // blog: {
// showReadingTime: true, // showReadingTime: true,
// editUrl: "https://github.com/immich-app/immich/tree/main/docs/", // editUrl: "https://github.com/immich-app/immich/tree/main/docs/",
@@ -58,7 +62,7 @@ const config = {
({ ({
announcementBar: { announcementBar: {
id: "site_announcement_immich", id: "site_announcement_immich",
content: `⚠️ The project is under <strong>very active</strong> development. Expect bugs and changes. Do not use as a <strong>single source</strong> to store of your photos and videos!`, content: `⚠️ The project is under <strong>very active</strong> development. Expect bugs and changes. Do not use it as <strong>the only way</strong> to store your photos and videos!`,
backgroundColor: "#593f00", backgroundColor: "#593f00",
textColor: "#ffefc9", textColor: "#ffefc9",
isCloseable: false, isCloseable: false,
@@ -80,7 +84,12 @@ const config = {
position: "right", position: "right",
label: "Documentation", label: "Documentation",
}, },
// { to: "/blog", label: "Blog", position: "right" }, {
to: "/docs/api",
position: "right",
label: "API"
},
{ to: "/blog", label: "Blog", position: "right" },
{ {
href: "https://github.com/immich-app/immich", href: "https://github.com/immich-app/immich",
label: "GitHub", label: "GitHub",

2742
docs/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -19,9 +19,11 @@
"@docusaurus/preset-classic": "2.1.0", "@docusaurus/preset-classic": "2.1.0",
"@mdx-js/react": "^1.6.22", "@mdx-js/react": "^1.6.22",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"docusaurus-preset-openapi": "^0.6.3",
"prism-react-renderer": "^1.3.5", "prism-react-renderer": "^1.3.5",
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2" "react-dom": "^17.0.2",
"url": "^0.11.0"
}, },
"devDependencies": { "devDependencies": {
"@docusaurus/module-type-aliases": "2.1.0", "@docusaurus/module-type-aliases": "2.1.0",

View File

@@ -54,3 +54,13 @@
.introButton:hover { .introButton:hover {
color: #000000; color: #000000;
} }
.demoButton {
background-color: aquamarine;
color: #000000;
border-radius: 50px;
}
.demoButton:hover {
color: #000000;
}

View File

@@ -40,6 +40,15 @@ function HomepageHeader() {
Installation Installation
</Link> </Link>
</div> </div>
<div className={styles.buttons}>
<Link
className={clsx("button button--lg", styles.demoButton)}
to="https://demo.immich.app/"
>
Demo
</Link>
</div>
</div> </div>
<img src="/img/immich-screenshots.webp" alt="logo" /> <img src="/img/immich-screenshots.webp" alt="logo" />

1
docs/static/img/cloud-done.svg vendored Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="48" width="48" fill="#4250af"><path d="M12.65 39q-4 0-6.825-2.825T3 29.3q0-3.7 2.5-6.475Q8 20.05 11.6 19.7q.75-4.65 4.275-7.65 3.525-3 8.225-3 5.2 0 8.825 3.775Q36.55 16.6 36.55 21.9v1.9h.6q3.3-.1 5.575 2.075Q45 28.05 45 31.4q0 3.1-2.25 5.35Q40.5 39 37.4 39Zm7.95-6.2q.3 0 .55-.125.25-.125.5-.325l8.95-9q.3-.3.325-.75.025-.45-.325-.75-.3-.35-.75-.35t-.75.35l-8.45 8.4-4.05-4.05q-.3-.25-.75-.275-.45-.025-.75.275-.35.35-.35.8 0 .45.35.75l4.55 4.6q.2.2.45.325t.5.125Zm-7.95 3.95H37.4q2.2 0 3.775-1.575Q42.75 33.6 42.75 31.4t-1.575-3.75Q39.6 26.1 37.4 26.1h-3.1v-4.2q0-4.4-3.025-7.5-3.025-3.1-7.375-3.1-4.3 0-7.35 3.1t-3.05 7.5h-1q-2.95 0-5.1 2.15-2.15 2.15-2.15 5.3 0 3.1 2.175 5.25t5.225 2.15ZM24 24Z"/></svg>

After

Width:  |  Height:  |  Size: 756 B

1
docs/static/img/cloud-off.svg vendored Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="48" width="48" fill="#4250af"><path d="m42.15 37.1-1.8-1.8q1.15-.8 1.775-1.8t.625-2.4q0-2.1-1.525-3.625T37.55 25.95H34.3V21.9q0-4.3-3.025-7.275-3.025-2.975-7.325-2.975-1.4 0-2.925.425T18.2 13.45l-1.6-1.65q1.8-1.3 3.6-1.85t3.7-.55q5.25 0 8.95 3.7 3.7 3.7 3.7 8.9v1.75h.6q3.3-.05 5.575 2.05Q45 27.9 45 31.1q0 1.55-.675 3.2-.675 1.65-2.175 2.8Zm-1.75 6.55-5-5.05H12.55q-4.05 0-6.8-2.725T3 29.1q0-3.85 2.525-6.4 2.525-2.55 6.075-2.9.05-.75.375-1.875T12.8 16L5.55 8.75q-.3-.3-.325-.775Q5.2 7.5 5.55 7.15q.35-.35.8-.35.45 0 .8.35l34.9 34.9q.3.3.325.775.025.475-.325.825-.35.35-.825.35t-.825-.35Zm-27.85-7.3h20.6L14.6 17.8q-.55.85-.825 1.975Q13.5 20.9 13.5 22h-.95q-3.05 0-5.175 2T5.25 29q0 3.05 2.125 5.2 2.125 2.15 5.175 2.15ZM29.3 24.4ZM23.85 27Z"/></svg>

After

Width:  |  Height:  |  Size: 799 B

1
docs/static/img/cloud.svg vendored Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="48" width="48" fill="#4250af"><path d="M12.65 39q-4 0-6.825-2.825T3 29.3q0-3.65 2.45-6.45 2.45-2.8 6.15-3.15.75-4.65 4.275-7.65 3.525-3 8.225-3 5.2 0 8.825 3.775Q36.55 16.6 36.55 21.9v1.9h.6q3.3-.1 5.575 2.075Q45 28.05 45 31.4q0 3.1-2.25 5.35Q40.5 39 37.4 39Zm0-2.25H37.4q2.2 0 3.775-1.575Q42.75 33.6 42.75 31.4t-1.575-3.75Q39.6 26.1 37.4 26.1h-3.1v-4.2q0-4.4-3.025-7.5-3.025-3.1-7.375-3.1-4.3 0-7.35 3.1t-3.05 7.5h-.95q-3.05 0-5.175 2.15t-2.125 5.3q0 3.05 2.175 5.225t5.225 2.175ZM24 24Z"/></svg>

After

Width:  |  Height:  |  Size: 545 B

View File

@@ -1,26 +1,19 @@
config_version: 1.0 config_version: 1.0
project_id: ead34689-ec52-41d9-b675-09bc85a6cbd7 project_id: ead34689-ec52-41d9-b675-09bc85a6cbd7
file_type: json file_type: json
branch: main
upload: upload:
files: files:
- file: mobile/assets/i18n/en-US.json - file: mobile/assets/i18n/en-US.json
locale_code: en-US locale_code: en-US
- file: mobile/assets/i18n/de-DE.json
locale_code: de-DE
- file: mobile/assets/i18n/fr-FR.json
locale_code: fr-FR
- file: mobile/assets/i18n/it-IT.json
locale_code: it-IT
- file: mobile/assets/i18n/nl-NL.json
locale_code: nl-NL
- file: mobile/assets/i18n/ko-KR.json
locale_code: ko-KR
- file: mobile/assets/i18n/da-DK.json
locale_code: da-DK
download: download:
params:
export_empty_as: main
files: files:
- file: mobile/assets/i18n/en-US.json - file: mobile/assets/i18n/en-US.json
locale_code: en-US locale_code: en-US
- file: mobile/assets/i18n/da-DK.json
locale_code: da-DK
- file: mobile/assets/i18n/de-DE.json - file: mobile/assets/i18n/de-DE.json
locale_code: de-DE locale_code: de-DE
- file: mobile/assets/i18n/fr-FR.json - file: mobile/assets/i18n/fr-FR.json
@@ -31,5 +24,13 @@ download:
locale_code: nl-NL locale_code: nl-NL
- file: mobile/assets/i18n/ko-KR.json - file: mobile/assets/i18n/ko-KR.json
locale_code: ko-KR locale_code: ko-KR
- file: mobile/assets/i18n/da-DK.json - file: mobile/assets/i18n/es-ES.json
locale_code: da-DK locale_code: es-ES
- file: mobile/assets/i18n/fi-FI.json
locale_code: fi-FI
- file: mobile/assets/i18n/ja-JP.json
locale_code: ja-JP
- file: mobile/assets/i18n/pt-BR.json
locale_code: pt-BR
- file: mobile/assets/i18n/pl-PL.json
locale_code: pl-PL

View File

@@ -1,43 +1,42 @@
# Build stage
FROM node:16-bullseye-slim as builder FROM node:16-bullseye-slim as builder
ARG DEBIAN_FRONTEND=noninteractive ARG DEBIAN_FRONTEND=noninteractive
WORKDIR /usr/src/app WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN apt-get update RUN apt-get update
RUN apt-get install gcc g++ make cmake python3 python3-pip ffmpeg -y RUN apt-get install gcc g++ make cmake python3 python3-pip ffmpeg -y
COPY package.json package-lock.json ./
RUN npm ci RUN npm ci
RUN npm rebuild @tensorflow/tfjs-node --build-from-source RUN npm rebuild @tensorflow/tfjs-node --build-from-source
COPY . . COPY . .
FROM builder as prod
RUN npm run build RUN npm run build
RUN npm prune --omit=dev
# Prod stage
FROM node:16-bullseye-slim FROM node:16-bullseye-slim
ARG DEBIAN_FRONTEND=noninteractive ARG DEBIAN_FRONTEND=noninteractive
WORKDIR /usr/src/app WORKDIR /usr/src/app
COPY package.json package-lock.json ./ RUN apt-get update \
COPY entrypoint.sh ./
RUN mkdir -p /usr/src/app/dist \
&& mkdir -p /usr/src/app/node_modules \
&& apt-get update \
&& apt-get install -y ffmpeg \ && apt-get install -y ffmpeg \
&& rm -rf /var/cache/apt/lists && rm -rf /var/cache/apt/lists
COPY --from=builder /usr/src/app/node_modules ./node_modules COPY --from=prod /usr/src/app/node_modules ./node_modules
COPY --from=builder /usr/src/app/dist ./dist COPY --from=prod /usr/src/app/dist ./dist
RUN npm prune --production COPY package.json package-lock.json ./
COPY entrypoint.sh ./
# CMD [ "node", "dist/main" ] # CMD [ "node", "dist/main" ]

View File

@@ -33,7 +33,7 @@ if (keystorePropertiesFile.exists()) {
android { android {
compileSdkVersion flutter.compileSdkVersion compileSdkVersion 33
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
@@ -52,7 +52,7 @@ android {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "app.alextran.immich" applicationId "app.alextran.immich"
minSdkVersion 23 minSdkVersion 23
targetSdkVersion flutter.targetSdkVersion targetSdkVersion 33
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName
} }

View File

@@ -12,21 +12,35 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name="com.linusu.flutter_web_auth.CallbackActivity"
android:exported="true">
<intent-filter android:label="flutter_web_auth">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="app.immich" />
</intent-filter>
</activity>
<!-- Don't delete the meta-data below. <!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data android:name="flutterEmbedding" android:value="2" /> <meta-data android:name="flutterEmbedding" android:value="2" />
<!-- Disables default WorkManager initialization to use our custom initialization --> <!-- Disables default WorkManager initialization to use our custom initialization -->
<provider <provider
android:name="androidx.startup.InitializationProvider" android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup" android:authorities="${applicationId}.androidx-startup"
tools:node="remove"> tools:node="remove"></provider>
</provider>
</application> </application>
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- If you want to read images-->
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- If you want to read videos-->
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <!-- If you want to read audio-->
<queries> <queries>
<intent> <intent>

View File

@@ -54,7 +54,9 @@ class BackgroundServicePlugin : FlutterPlugin, MethodChannel.MethodCallHandler {
val args = call.arguments<ArrayList<*>>()!! val args = call.arguments<ArrayList<*>>()!!
val requireUnmeteredNetwork = args.get(0) as Boolean val requireUnmeteredNetwork = args.get(0) as Boolean
val requireCharging = args.get(1) as Boolean val requireCharging = args.get(1) as Boolean
ContentObserverWorker.configureWork(ctx, requireUnmeteredNetwork, requireCharging) val triggerUpdateDelay = (args.get(2) as Number).toLong()
val triggerMaxDelay = (args.get(3) as Number).toLong()
ContentObserverWorker.configureWork(ctx, requireUnmeteredNetwork, requireCharging, triggerUpdateDelay, triggerMaxDelay)
result.success(true) result.success(true)
} }
"disable" -> { "disable" -> {

View File

@@ -134,13 +134,13 @@ class BackupWorker(ctx: Context, params: WorkerParameters) : ListenableWorker(ct
} }
private fun stopEngine(result: Result?) { private fun stopEngine(result: Result?) {
clearBackgroundNotification()
engine?.destroy()
engine = null
if (result != null) { if (result != null) {
Log.d(TAG, "stopEngine result=${result}") Log.d(TAG, "stopEngine result=${result}")
resolvableFuture.set(result) resolvableFuture.set(result)
} }
engine?.destroy()
engine = null
clearBackgroundNotification()
waitOnSetForegroundAsync() waitOnSetForegroundAsync()
} }

View File

@@ -37,6 +37,8 @@ class ContentObserverWorker(ctx: Context, params: WorkerParameters) : Worker(ctx
const val SHARED_PREF_SERVICE_ENABLED = "serviceEnabled" const val SHARED_PREF_SERVICE_ENABLED = "serviceEnabled"
const val SHARED_PREF_REQUIRE_WIFI = "requireWifi" const val SHARED_PREF_REQUIRE_WIFI = "requireWifi"
const val SHARED_PREF_REQUIRE_CHARGING = "requireCharging" const val SHARED_PREF_REQUIRE_CHARGING = "requireCharging"
const val SHARED_PREF_TRIGGER_UPDATE_DELAY = "triggerUpdateDelay"
const val SHARED_PREF_TRIGGER_MAX_DELAY = "triggerMaxDelay"
private const val TASK_NAME_OBSERVER = "immich/ContentObserver" private const val TASK_NAME_OBSERVER = "immich/ContentObserver"
@@ -62,12 +64,16 @@ class ContentObserverWorker(ctx: Context, params: WorkerParameters) : Worker(ctx
*/ */
fun configureWork(context: Context, fun configureWork(context: Context,
requireWifi: Boolean = false, requireWifi: Boolean = false,
requireCharging: Boolean = false) { requireCharging: Boolean = false,
triggerUpdateDelay: Long = 5000,
triggerMaxDelay: Long = 50000) {
context.getSharedPreferences(BackupWorker.SHARED_PREF_NAME, Context.MODE_PRIVATE) context.getSharedPreferences(BackupWorker.SHARED_PREF_NAME, Context.MODE_PRIVATE)
.edit() .edit()
.putBoolean(SHARED_PREF_SERVICE_ENABLED, true) .putBoolean(SHARED_PREF_SERVICE_ENABLED, true)
.putBoolean(SHARED_PREF_REQUIRE_WIFI, requireWifi) .putBoolean(SHARED_PREF_REQUIRE_WIFI, requireWifi)
.putBoolean(SHARED_PREF_REQUIRE_CHARGING, requireCharging) .putBoolean(SHARED_PREF_REQUIRE_CHARGING, requireCharging)
.putLong(SHARED_PREF_TRIGGER_UPDATE_DELAY, triggerUpdateDelay)
.putLong(SHARED_PREF_TRIGGER_MAX_DELAY, triggerMaxDelay)
.apply() .apply()
BackupWorker.updateBackupWorker(context, requireWifi, requireCharging) BackupWorker.updateBackupWorker(context, requireWifi, requireCharging)
} }
@@ -106,12 +112,14 @@ class ContentObserverWorker(ctx: Context, params: WorkerParameters) : Worker(ctx
} }
private fun enqueueObserverWorker(context: Context, policy: ExistingWorkPolicy) { private fun enqueueObserverWorker(context: Context, policy: ExistingWorkPolicy) {
val sp = context.getSharedPreferences(BackupWorker.SHARED_PREF_NAME, Context.MODE_PRIVATE)
val constraints = Constraints.Builder() val constraints = Constraints.Builder()
.addContentUriTrigger(MediaStore.Images.Media.INTERNAL_CONTENT_URI, true) .addContentUriTrigger(MediaStore.Images.Media.INTERNAL_CONTENT_URI, true)
.addContentUriTrigger(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true) .addContentUriTrigger(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true)
.addContentUriTrigger(MediaStore.Video.Media.INTERNAL_CONTENT_URI, true) .addContentUriTrigger(MediaStore.Video.Media.INTERNAL_CONTENT_URI, true)
.addContentUriTrigger(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true) .addContentUriTrigger(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true)
.setTriggerContentUpdateDelay(5000, TimeUnit.MILLISECONDS) .setTriggerContentUpdateDelay(sp.getLong(SHARED_PREF_TRIGGER_UPDATE_DELAY, 5000), TimeUnit.MILLISECONDS)
.setTriggerContentMaxDelay(sp.getLong(SHARED_PREF_TRIGGER_MAX_DELAY, 50000), TimeUnit.MILLISECONDS)
.build() .build()
val work = OneTimeWorkRequest.Builder(ContentObserverWorker::class.java) val work = OneTimeWorkRequest.Builder(ContentObserverWorker::class.java)

View File

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

View File

@@ -0,0 +1 @@
* Local assets are now shown in the app

View File

@@ -0,0 +1,3 @@
* Added OAuth login option
* Tidy-up dependencies, remove unused, replace rarely used ones
* Added view LivePhotos feature

View File

@@ -0,0 +1,2 @@
* Fixed freezed splash screen
* Fixed OIDC redirect but not logging in

View File

@@ -0,0 +1,2 @@
* Show human readable file size in detail view
* Fix permission issue on Android 33

View File

@@ -0,0 +1,6 @@
* Use binary prefixes for data sizes
* Fix not able to show device asset on Android 13
* Use cached asset info if unchanged instead of downloading all assets
* Add in-app logging
* Add search mechanism to album selection page
* Improve UI

View File

@@ -0,0 +1 @@
* Fixed foreground backup not triggered on app relaunch

View File

@@ -0,0 +1,2 @@
* Improve data usage on loading asset
* Add background backup delay

View File

@@ -15,7 +15,7 @@ Once set up, this app can be used as photo and video backup solution directly fr
* Object detection based on COCO SSD. * Object detection based on COCO SSD.
* Search assets based on tags and exif data (lens, make, model, orientation) * Search assets based on tags and exif data (lens, make, model, orientation)
* Upload assets from your local computer/server using <a href='https://www.npmjs.com/package/immich' target='_blank' rel='nofollow'>immich cli tools</a> * Upload assets from your local computer/server using <a href='https://www.npmjs.com/package/immich' target='_blank' rel='nofollow'>immich cli tools</a>
* [Optional] Reserve geocoding using Mapbox (Generous free-tier of 100,000 search/month) * Reverse geocoding from image exif data
* Show asset's location information on map (OpenStreetMap). * Show asset's location information on map (OpenStreetMap).
* Show curated places on the search page * Show curated places on the search page
* Show curated objects on the search page * Show curated objects on the search page

View File

@@ -5,17 +5,17 @@
<testcase classname="fastlane.lanes" name="0: default_platform" time="0.000233"> <testcase classname="fastlane.lanes" name="0: default_platform" time="0.000201">
</testcase> </testcase>
<testcase classname="fastlane.lanes" name="1: bundleRelease" time="61.699536"> <testcase classname="fastlane.lanes" name="1: bundleRelease" time="63.132489">
</testcase> </testcase>
<testcase classname="fastlane.lanes" name="2: upload_to_play_store" time="46.210553"> <testcase classname="fastlane.lanes" name="2: upload_to_play_store" time="38.15883">
</testcase> </testcase>

View File

@@ -1,3 +1,3 @@
This is a client app for Immich Server and you will need to run/manage the server on your own in order to use the app. This is a client app for Immich Server and you will need to run/manage the server on your own in order to use the app.
Github URL: https://github.com/alextran1502/immich Github URL: https://github.com/immich-app/immich

View File

@@ -1,6 +1,9 @@
{ {
"album_info_card_backup_album_excluded": "EKSKLUDERET", "album_info_card_backup_album_excluded": "EKSKLUDERET",
"album_info_card_backup_album_included": "INKLUDERET", "album_info_card_backup_album_included": "INKLUDERET",
"album_thumbnail_card_item": "1 genstand",
"album_thumbnail_card_items": "{} genstande",
"album_thumbnail_card_shared": ". Delt",
"album_viewer_appbar_share_delete": "Slet album", "album_viewer_appbar_share_delete": "Slet album",
"album_viewer_appbar_share_err_delete": "Fejlede sletning af album", "album_viewer_appbar_share_err_delete": "Fejlede sletning af album",
"album_viewer_appbar_share_err_leave": "Fejlede i at forlade album", "album_viewer_appbar_share_err_leave": "Fejlede i at forlade album",
@@ -9,6 +12,8 @@
"album_viewer_appbar_share_leave": "Forlad album", "album_viewer_appbar_share_leave": "Forlad album",
"album_viewer_appbar_share_remove": "Fjern fra album", "album_viewer_appbar_share_remove": "Fjern fra album",
"album_viewer_page_share_add_users": "Tilføj brugere", "album_viewer_page_share_add_users": "Tilføj brugere",
"asset_list_settings_subtitle": "Indstillinger for billedgitterlayout",
"asset_list_settings_title": "Billedgitter",
"backup_album_selection_page_albums_device": "Albummer på enhed ({})", "backup_album_selection_page_albums_device": "Albummer på enhed ({})",
"backup_album_selection_page_albums_tap": "Tryk en gang for at inkludere, tryk to gange for at ekskludere", "backup_album_selection_page_albums_tap": "Tryk en gang for at inkludere, tryk to gange for at ekskludere",
"backup_album_selection_page_assets_scatter": "Elementer kan være spredt på tværs af flere albummer. Albummer kan således inkluderes eller udelukkes under sikkerhedskopieringsprocessen.", "backup_album_selection_page_assets_scatter": "Elementer kan være spredt på tværs af flere albummer. Albummer kan således inkluderes eller udelukkes under sikkerhedskopieringsprocessen.",
@@ -16,7 +21,27 @@
"backup_album_selection_page_selection_info": "Oplysninger om valgte", "backup_album_selection_page_selection_info": "Oplysninger om valgte",
"backup_album_selection_page_total_assets": "Samlede unikke elementer", "backup_album_selection_page_total_assets": "Samlede unikke elementer",
"backup_all": "Alt", "backup_all": "Alt",
"backup_controller_page_albums": "Sikkerhedskopier albummer", "backup_background_service_backup_failed_message": "Backup af billeder og videoer fejlede. Forsøger igen...",
"backup_background_service_connection_failed_message": "Forbindelsen til serveren blev tabt. Forsøger igen...",
"backup_background_service_current_upload_notification": "Uploader {}",
"backup_background_service_default_notification": "Checking for new assets…",
"backup_background_service_error_title": "Fejl med backup",
"backup_background_service_in_progress_notification": "Tager backup af dine billeder og videoer...",
"backup_background_service_upload_failure_notification": "Failed to upload {}",
"backup_controller_page_albums": "Sikkerhedskopiér albummer",
"backup_controller_page_background_battery_info_link": "Vis mig hvordan",
"backup_controller_page_background_battery_info_message": "For den bedste oplevelse med baggrundsbackup, bør du slå batterioptimering, der begrænder baggrundsaktivitet, fra.\n\nSiden dette er afhængigt af enheden, bør du undersøge denne information leveret af din enheds producent.",
"backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_battery_info_title": "Batterioptimering",
"backup_controller_page_background_charging": "Kun under opladning",
"backup_controller_page_background_configure_error": "Fejlede konfigureringen af baggrundsbackup",
"backup_controller_page_background_delay": "Delay new assets backup: {}",
"backup_controller_page_background_description": "Slå baggrundsbackup til, for automatisk at tage backup af nye billeder og videoer, uden at skulle åbne appen",
"backup_controller_page_background_is_off": "Automatisk baggrundsbackup er slået fra",
"backup_controller_page_background_is_on": "Automatisk baggrundsbackup er slået til",
"backup_controller_page_background_turn_off": "Slå baggrundsbackup fra",
"backup_controller_page_background_turn_on": "Slå baggrundsbackup til",
"backup_controller_page_background_wifi": "Kun med WiFi",
"backup_controller_page_backup": "Sikkerhedskopier", "backup_controller_page_backup": "Sikkerhedskopier",
"backup_controller_page_backup_selected": "Valgte: ", "backup_controller_page_backup_selected": "Valgte: ",
"backup_controller_page_backup_sub": "Sikkerhedskopierede billeder og videoer", "backup_controller_page_backup_sub": "Sikkerhedskopierede billeder og videoer",
@@ -45,7 +70,27 @@
"backup_controller_page_uploading_file_info": "Uploader filinformation", "backup_controller_page_uploading_file_info": "Uploader filinformation",
"backup_err_only_album": "Kan ikke slette det eneste album", "backup_err_only_album": "Kan ikke slette det eneste album",
"backup_info_card_assets": "elementer", "backup_info_card_assets": "elementer",
"cache_settings_album_thumbnails": "Biblioteksminiaturebilleder ({} billeder og videoer)",
"cache_settings_clear_cache_button": "Fjern cache",
"cache_settings_clear_cache_button_title": "Fjern appens cache. Dette vil i stor grad påvirke appens ydeevne indtil cachen er genopbygget.",
"cache_settings_image_cache_size": "Størrelse af billedecache ({} billeder og videoer)",
"cache_settings_statistics_album": "Biblioteksminiaturer",
"cache_settings_statistics_assets": "{} billeder og videoer ({})",
"cache_settings_statistics_full": "Fulde billeder",
"cache_settings_statistics_shared": "Miniaturebilleder til delte albummer",
"cache_settings_statistics_thumbnail": "Miniaturebilleder",
"cache_settings_statistics_title": "Cacheforbrug",
"cache_settings_subtitle": "Håndter cache-adfærden for Immich-appen.",
"cache_settings_thumbnail_size": "Størrelse af miniaturebillede cache ({} billeder og videoer)",
"cache_settings_title": "Cache-indstillinger",
"control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} items",
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
"control_bottom_app_bar_create_new_album": "Create new album",
"control_bottom_app_bar_delete": "Slet", "control_bottom_app_bar_delete": "Slet",
"control_bottom_app_bar_share": "Del",
"create_album_page_untitled": "Uden titel",
"create_shared_album_page_create": "Opret",
"create_shared_album_page_share": "Del", "create_shared_album_page_share": "Del",
"create_shared_album_page_share_add_assets": "TILFØJ ELEMENT", "create_shared_album_page_share_add_assets": "TILFØJ ELEMENT",
"create_shared_album_page_share_select_photos": "Vælg billeder", "create_shared_album_page_share_select_photos": "Vælg billeder",
@@ -59,6 +104,14 @@
"exif_bottom_sheet_description": "Tilføj beskrivelse...", "exif_bottom_sheet_description": "Tilføj beskrivelse...",
"exif_bottom_sheet_details": "DETALJER", "exif_bottom_sheet_details": "DETALJER",
"exif_bottom_sheet_location": "LOKATION", "exif_bottom_sheet_location": "LOKATION",
"experimental_settings_new_asset_list_subtitle": "Under udarbejdelse",
"experimental_settings_new_asset_list_title": "Aktiver eksperimentelt fotogitter",
"experimental_settings_subtitle": "Brug på eget ansvar!",
"experimental_settings_title": "Eksperimentelle",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
"library_page_albums": "Albummer",
"library_page_new_album": "Nyt album",
"login_form_button_text": "Log ind", "login_form_button_text": "Log ind",
"login_form_email_hint": "din-email@email.com", "login_form_email_hint": "din-email@email.com",
"login_form_endpoint_hint": "http://din-server-ip:port/api", "login_form_endpoint_hint": "http://din-server-ip:port/api",
@@ -67,13 +120,17 @@
"login_form_err_invalid_email": "Ugyldig email", "login_form_err_invalid_email": "Ugyldig email",
"login_form_err_leading_whitespace": "Mellemrum før", "login_form_err_leading_whitespace": "Mellemrum før",
"login_form_err_trailing_whitespace": "Mellemrum efter", "login_form_err_trailing_whitespace": "Mellemrum efter",
"login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL",
"login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server",
"login_form_failed_login": "Der opstod en vejl ved at logge ind. Tjek server URL, email og kodeordet", "login_form_failed_login": "Der opstod en vejl ved at logge ind. Tjek server URL, email og kodeordet",
"login_form_label_email": "Email", "login_form_label_email": "Email",
"login_form_label_password": "Kodeord", "login_form_label_password": "Kodeord",
"login_form_password_hint": "kodeord", "login_form_password_hint": "kodeord",
"login_form_save_login": "Forbliv logget ind", "login_form_save_login": "Forbliv logget ind",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_server_up_to_date": "Klient og server er ajour", "profile_drawer_client_server_up_to_date": "Klient og server er ajour",
"profile_drawer_settings": "Indstillinger",
"profile_drawer_sign_out": "Log ud", "profile_drawer_sign_out": "Log ud",
"search_bar_hint": "Søg i dine billeder", "search_bar_hint": "Søg i dine billeder",
"search_page_no_objects": "Ingen elementer er tilgængelige", "search_page_no_objects": "Ingen elementer er tilgængelige",
@@ -84,19 +141,50 @@
"select_additional_user_for_sharing_page_suggestions": "Anbefalinger", "select_additional_user_for_sharing_page_suggestions": "Anbefalinger",
"select_user_for_sharing_page_err_album": "Fejlede i at oprette et nyt album", "select_user_for_sharing_page_err_album": "Fejlede i at oprette et nyt album",
"select_user_for_sharing_page_share_suggestions": "Anbefalinger", "select_user_for_sharing_page_share_suggestions": "Anbefalinger",
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).",
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).",
"setting_image_viewer_original_title": "Load original image",
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.",
"setting_image_viewer_preview_title": "Load preview image",
"setting_notifications_notify_failures_grace_period": "Giv besked om baggrundsbackupfejl: {}",
"setting_notifications_notify_hours": "{} timer",
"setting_notifications_notify_immediately": "med det samme",
"setting_notifications_notify_minutes": "{} minutter",
"setting_notifications_notify_never": "aldrig",
"setting_notifications_notify_seconds": "{} seconds",
"setting_notifications_single_progress_subtitle": "Detaljeret uploadstatus pr. billed og video",
"setting_notifications_single_progress_title": "Vis detaljeret baggrundsuploadstatus",
"setting_notifications_subtitle": "Tilpas dine notifikationspræferencer",
"setting_notifications_title": "Notifikationer",
"setting_notifications_total_progress_subtitle": "Samlet uploadstatus (færdige/samlede billeder og videoer)",
"setting_notifications_total_progress_title": "Vis samlet baggrundsuploadstatus",
"setting_pages_app_bar_settings": "Indstillinger",
"settings_require_restart": "Genstart venligst Immich for at anvende denne ændring",
"share_add": "Tilføj", "share_add": "Tilføj",
"share_add_photos": "Tilføj billeder", "share_add_photos": "Tilføj billeder",
"share_add_title": "Tilføj en titel", "share_add_title": "Tilføj en titel",
"share_create_album": "Opret album", "share_create_album": "Opret album",
"share_dialog_preparing": "Forbereder...",
"share_invite": "Inviter til album", "share_invite": "Inviter til album",
"sharing_page_album": "Delt albums", "sharing_page_album": "Delt albums",
"sharing_page_description": "Opret delte albummer for at dele billeder og video med personer på dit netværk.", "sharing_page_description": "Opret delte albummer for at dele billeder og video med personer på dit netværk.",
"sharing_page_empty_list": "TOM LISTE", "sharing_page_empty_list": "TOM LISTE",
"sharing_silver_appbar_create_shared_album": "Opret delt album", "sharing_silver_appbar_create_shared_album": "Opret delt album",
"sharing_silver_appbar_share_partner": "Del med partner", "sharing_silver_appbar_share_partner": "Del med partner",
"tab_controller_nav_library": "Bibliotek",
"tab_controller_nav_photos": "Billeder", "tab_controller_nav_photos": "Billeder",
"tab_controller_nav_search": "Søg", "tab_controller_nav_search": "Søg",
"tab_controller_nav_sharing": "Deling", "tab_controller_nav_sharing": "Deling",
"theme_setting_asset_list_storage_indicator_title": "Vis opbevaringsindikator på filer",
"theme_setting_asset_list_tiles_per_row_title": "Antal billeder og videoer per række ({})",
"theme_setting_dark_mode_switch": "Mørk tilstand",
"theme_setting_image_viewer_quality_subtitle": "Juster kvaliteten i billedfremviseren",
"theme_setting_image_viewer_quality_title": "Billedfremviserkvalitet",
"theme_setting_system_theme_switch": "Automatisk (Følg systemindstillinger)",
"theme_setting_theme_subtitle": "Vælg appens temaindstilling",
"theme_setting_theme_title": "Tema",
"theme_setting_three_stage_loading_subtitle": "Tre-trins indlæsning kan øge ydeevnen, men kan ligeledes føre til højere netværksbelastning",
"theme_setting_three_stage_loading_title": "Slå tre-trins indlæsning til",
"version_announcement_overlay_ack": "Vedkend", "version_announcement_overlay_ack": "Vedkend",
"version_announcement_overlay_release_notes": "udgivelsesnoter", "version_announcement_overlay_release_notes": "udgivelsesnoter",
"version_announcement_overlay_text_1": "Hej vej, der er en ny version af", "version_announcement_overlay_text_1": "Hej vej, der er en ny version af",

View File

@@ -12,6 +12,8 @@
"album_viewer_appbar_share_leave": "Album verlassen", "album_viewer_appbar_share_leave": "Album verlassen",
"album_viewer_appbar_share_remove": "Entferne vom Album", "album_viewer_appbar_share_remove": "Entferne vom Album",
"album_viewer_page_share_add_users": "Nutzer hinzufügen", "album_viewer_page_share_add_users": "Nutzer hinzufügen",
"asset_list_settings_subtitle": "Photo grid layout settings",
"asset_list_settings_title": "Photo Grid",
"backup_album_selection_page_albums_device": "Alben auf dem Gerät ({})", "backup_album_selection_page_albums_device": "Alben auf dem Gerät ({})",
"backup_album_selection_page_albums_tap": "Tippen um einzuschließen, doppelt tippen um zu entfernen", "backup_album_selection_page_albums_tap": "Tippen um einzuschließen, doppelt tippen um zu entfernen",
"backup_album_selection_page_assets_scatter": "Elemente können sich über mehrere Alben verteilen. Daher können diese vor der Sicherung eingeschlossen oder ausgeschlossen werden", "backup_album_selection_page_assets_scatter": "Elemente können sich über mehrere Alben verteilen. Daher können diese vor der Sicherung eingeschlossen oder ausgeschlossen werden",
@@ -19,12 +21,31 @@
"backup_album_selection_page_selection_info": "Auswahl", "backup_album_selection_page_selection_info": "Auswahl",
"backup_album_selection_page_total_assets": "Elemente", "backup_album_selection_page_total_assets": "Elemente",
"backup_all": "Alle", "backup_all": "Alle",
"backup_background_service_backup_failed_message": "Failed to backup assets. Retrying…",
"backup_background_service_connection_failed_message": "Failed to connect to the server. Retrying…",
"backup_background_service_current_upload_notification": "Uploading {}",
"backup_background_service_default_notification": "Suche nach neuen assets…",
"backup_background_service_error_title": "Backup error",
"backup_background_service_in_progress_notification": "Backing up your assets…",
"backup_background_service_upload_failure_notification": "Failed to upload {}",
"backup_controller_page_albums": "Gesicherte Alben", "backup_controller_page_albums": "Gesicherte Alben",
"backup_controller_page_background_battery_info_link": "Show me how",
"backup_controller_page_background_battery_info_message": "For the best background backup experience, please disable any battery optimizations restricting background activity for Immich.\n\nSince this is device-specific, please lookup the required information for your device manufacturer.",
"backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_battery_info_title": "Battery optimizations",
"backup_controller_page_background_charging": "Only while charging",
"backup_controller_page_background_configure_error": "Failed to configure the background service",
"backup_controller_page_background_delay": "Delay new assets backup: {}",
"backup_controller_page_background_description": "Turn on the background service to automatically backup any new assets without needing to open the app",
"backup_controller_page_background_is_off": "Automatic background backup is off",
"backup_controller_page_background_is_on": "Automatic background backup is on",
"backup_controller_page_background_turn_off": "Turn off background service",
"backup_controller_page_background_turn_on": "Turn on background service",
"backup_controller_page_background_wifi": "Only on WiFi",
"backup_controller_page_backup": "Sicherung", "backup_controller_page_backup": "Sicherung",
"backup_controller_page_backup_selected": "Ausgewählt: ", "backup_controller_page_backup_selected": "Ausgewählt: ",
"backup_controller_page_backup_sub": "Gesicherte Fotos und Videos", "backup_controller_page_backup_sub": "Gesicherte Fotos und Videos",
"backup_controller_page_cancel": "Abbrechen", "backup_controller_page_cancel": "Abbrechen",
"backup_background_service_default_notification": "Suche nach neuen assets…",
"backup_controller_page_created": "Erstellt: {}", "backup_controller_page_created": "Erstellt: {}",
"backup_controller_page_desc_backup": "Aktiviere die Sicherung um Elemente automatisch auf den Server zu laden.", "backup_controller_page_desc_backup": "Aktiviere die Sicherung um Elemente automatisch auf den Server zu laden.",
"backup_controller_page_excluded": "Ausgeschlossen: ", "backup_controller_page_excluded": "Ausgeschlossen: ",
@@ -49,6 +70,23 @@
"backup_controller_page_uploading_file_info": "Informationen", "backup_controller_page_uploading_file_info": "Informationen",
"backup_err_only_album": "Das einzige Album kann nicht entfernt werden", "backup_err_only_album": "Das einzige Album kann nicht entfernt werden",
"backup_info_card_assets": "Elemente", "backup_info_card_assets": "Elemente",
"cache_settings_album_thumbnails": "Library page thumbnails ({} assets)",
"cache_settings_clear_cache_button": "Clear cache",
"cache_settings_clear_cache_button_title": "Clears the app's cache. This will significantly impact the app's performance until the cache has rebuilt.",
"cache_settings_image_cache_size": "Image cache size ({} assets)",
"cache_settings_statistics_album": "Library thumbnails",
"cache_settings_statistics_assets": "{} assets ({})",
"cache_settings_statistics_full": "Full images",
"cache_settings_statistics_shared": "Shared album thumbnails",
"cache_settings_statistics_thumbnail": "Vorschaubilder",
"cache_settings_statistics_title": "Cache usage",
"cache_settings_subtitle": "Control the caching behaviour of the Immich mobile application",
"cache_settings_thumbnail_size": "Thumbnail cache size ({} assets)",
"cache_settings_title": "Caching Settings",
"control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} items",
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
"control_bottom_app_bar_create_new_album": "Create new album",
"control_bottom_app_bar_delete": "Löschen", "control_bottom_app_bar_delete": "Löschen",
"control_bottom_app_bar_share": "Teilen", "control_bottom_app_bar_share": "Teilen",
"create_album_page_untitled": "Unbenannt", "create_album_page_untitled": "Unbenannt",
@@ -66,6 +104,12 @@
"exif_bottom_sheet_description": "Beschreibung hinzufügen...", "exif_bottom_sheet_description": "Beschreibung hinzufügen...",
"exif_bottom_sheet_details": "DETAILS", "exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "STANDORT", "exif_bottom_sheet_location": "STANDORT",
"experimental_settings_new_asset_list_subtitle": "In Arbeit",
"experimental_settings_new_asset_list_title": "Enable experimental photo grid",
"experimental_settings_subtitle": "Use at your own risk!",
"experimental_settings_title": "Experimentell",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
"library_page_albums": "Alben", "library_page_albums": "Alben",
"library_page_new_album": "Neues Album", "library_page_new_album": "Neues Album",
"login_form_button_text": "Anmelden", "login_form_button_text": "Anmelden",
@@ -76,12 +120,15 @@
"login_form_err_invalid_email": "Ungültige E-Mail", "login_form_err_invalid_email": "Ungültige E-Mail",
"login_form_err_leading_whitespace": "Führendes Leerzichen", "login_form_err_leading_whitespace": "Führendes Leerzichen",
"login_form_err_trailing_whitespace": "Folgendes Leerzeichen", "login_form_err_trailing_whitespace": "Folgendes Leerzeichen",
"login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL",
"login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server",
"login_form_failed_login": "Error logging you in, check server url, email and password", "login_form_failed_login": "Error logging you in, check server url, email and password",
"login_form_label_email": "E-Mail", "login_form_label_email": "E-Mail",
"login_form_label_password": "Passwort", "login_form_label_password": "Passwort",
"login_form_password_hint": "password", "login_form_password_hint": "password",
"login_form_save_login": "Angemeldet bleiben", "login_form_save_login": "Angemeldet bleiben",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_server_up_to_date": "App und Server sind aktuell", "profile_drawer_client_server_up_to_date": "App und Server sind aktuell",
"profile_drawer_settings": "Einstellungen", "profile_drawer_settings": "Einstellungen",
"profile_drawer_sign_out": "Abmelden", "profile_drawer_sign_out": "Abmelden",
@@ -94,7 +141,25 @@
"select_additional_user_for_sharing_page_suggestions": "Vorschläge", "select_additional_user_for_sharing_page_suggestions": "Vorschläge",
"select_user_for_sharing_page_err_album": "Album konnte nicht erstellt werden", "select_user_for_sharing_page_err_album": "Album konnte nicht erstellt werden",
"select_user_for_sharing_page_share_suggestions": "Suggestions", "select_user_for_sharing_page_share_suggestions": "Suggestions",
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).",
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).",
"setting_image_viewer_original_title": "Load original image",
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.",
"setting_image_viewer_preview_title": "Load preview image",
"setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}",
"setting_notifications_notify_hours": "{} hours",
"setting_notifications_notify_immediately": "immediately",
"setting_notifications_notify_minutes": "{} minutes",
"setting_notifications_notify_never": "never",
"setting_notifications_notify_seconds": "{} seconds",
"setting_notifications_single_progress_subtitle": "Detaillierte Upload Informationen für jedes Element.",
"setting_notifications_single_progress_title": "Show background backup detail progress",
"setting_notifications_subtitle": "Adjust your notification preferences",
"setting_notifications_title": "Notifications",
"setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)",
"setting_notifications_total_progress_title": "Show background backup total progress",
"setting_pages_app_bar_settings": "Einstellungen", "setting_pages_app_bar_settings": "Einstellungen",
"settings_require_restart": "Bitte starte Immich neu, um diese Einstellung anzuwenden.",
"share_add": "Hinzufügen", "share_add": "Hinzufügen",
"share_add_photos": "Fotos hinzufügen", "share_add_photos": "Fotos hinzufügen",
"share_add_title": "Titel hinzufügen", "share_add_title": "Titel hinzufügen",
@@ -110,6 +175,8 @@
"tab_controller_nav_photos": "Fotos", "tab_controller_nav_photos": "Fotos",
"tab_controller_nav_search": "Suche", "tab_controller_nav_search": "Suche",
"tab_controller_nav_sharing": "Teilen", "tab_controller_nav_sharing": "Teilen",
"theme_setting_asset_list_storage_indicator_title": "Show storage indicator on asset tiles",
"theme_setting_asset_list_tiles_per_row_title": "Number of assets per row ({})",
"theme_setting_dark_mode_switch": "Dunkler Modus", "theme_setting_dark_mode_switch": "Dunkler Modus",
"theme_setting_image_viewer_quality_subtitle": "Einstellen der Qualität des Detailbildbetrachters", "theme_setting_image_viewer_quality_subtitle": "Einstellen der Qualität des Detailbildbetrachters",
"theme_setting_image_viewer_quality_title": "Qualität des Bildbetrachters", "theme_setting_image_viewer_quality_title": "Qualität des Bildbetrachters",

View File

@@ -17,7 +17,7 @@
"backup_album_selection_page_albums_device": "Albums on device ({})", "backup_album_selection_page_albums_device": "Albums on device ({})",
"backup_album_selection_page_albums_tap": "Tap to include, double tap to exclude", "backup_album_selection_page_albums_tap": "Tap to include, double tap to exclude",
"backup_album_selection_page_assets_scatter": "Assets can scatter across multiple albums. Thus, albums can be included or excluded during the backup process.", "backup_album_selection_page_assets_scatter": "Assets can scatter across multiple albums. Thus, albums can be included or excluded during the backup process.",
"backup_album_selection_page_select_albums": "Select Albums", "backup_album_selection_page_select_albums": "Select albums",
"backup_album_selection_page_selection_info": "Selection Info", "backup_album_selection_page_selection_info": "Selection Info",
"backup_album_selection_page_total_assets": "Total unique assets", "backup_album_selection_page_total_assets": "Total unique assets",
"backup_all": "All", "backup_all": "All",
@@ -35,6 +35,7 @@
"backup_controller_page_background_battery_info_title": "Battery optimizations", "backup_controller_page_background_battery_info_title": "Battery optimizations",
"backup_controller_page_background_charging": "Only while charging", "backup_controller_page_background_charging": "Only while charging",
"backup_controller_page_background_configure_error": "Failed to configure the background service", "backup_controller_page_background_configure_error": "Failed to configure the background service",
"backup_controller_page_background_delay": "Delay new assets backup: {}",
"backup_controller_page_background_description": "Turn on the background service to automatically backup any new assets without needing to open the app", "backup_controller_page_background_description": "Turn on the background service to automatically backup any new assets without needing to open the app",
"backup_controller_page_background_is_off": "Automatic background backup is off", "backup_controller_page_background_is_off": "Automatic background backup is off",
"backup_controller_page_background_is_on": "Automatic background backup is on", "backup_controller_page_background_is_on": "Automatic background backup is on",
@@ -82,6 +83,10 @@
"cache_settings_subtitle": "Control the caching behaviour of the Immich mobile application", "cache_settings_subtitle": "Control the caching behaviour of the Immich mobile application",
"cache_settings_thumbnail_size": "Thumbnail cache size ({} assets)", "cache_settings_thumbnail_size": "Thumbnail cache size ({} assets)",
"cache_settings_title": "Caching Settings", "cache_settings_title": "Caching Settings",
"control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} items",
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
"control_bottom_app_bar_create_new_album": "Create new album",
"control_bottom_app_bar_delete": "Delete", "control_bottom_app_bar_delete": "Delete",
"control_bottom_app_bar_share": "Share", "control_bottom_app_bar_share": "Share",
"create_album_page_untitled": "Untitled", "create_album_page_untitled": "Untitled",
@@ -99,6 +104,12 @@
"exif_bottom_sheet_description": "Add Description...", "exif_bottom_sheet_description": "Add Description...",
"exif_bottom_sheet_details": "DETAILS", "exif_bottom_sheet_details": "DETAILS",
"exif_bottom_sheet_location": "LOCATION", "exif_bottom_sheet_location": "LOCATION",
"experimental_settings_new_asset_list_subtitle": "Work in progress",
"experimental_settings_new_asset_list_title": "Enable experimental photo grid",
"experimental_settings_subtitle": "Use at your own risk!",
"experimental_settings_title": "Experimental",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
"library_page_albums": "Albums", "library_page_albums": "Albums",
"library_page_new_album": "New album", "library_page_new_album": "New album",
"login_form_button_text": "Login", "login_form_button_text": "Login",
@@ -109,12 +120,15 @@
"login_form_err_invalid_email": "Invalid Email", "login_form_err_invalid_email": "Invalid Email",
"login_form_err_leading_whitespace": "Leading whitespace", "login_form_err_leading_whitespace": "Leading whitespace",
"login_form_err_trailing_whitespace": "Trailing whitespace", "login_form_err_trailing_whitespace": "Trailing whitespace",
"login_form_failed_login": "Error logging you in, check server url, email and password", "login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL",
"login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server",
"login_form_failed_login": "Error logging you in, check server URL, email and password",
"login_form_label_email": "Email", "login_form_label_email": "Email",
"login_form_label_password": "Password", "login_form_label_password": "Password",
"login_form_password_hint": "password", "login_form_password_hint": "password",
"login_form_save_login": "Stay logged in", "login_form_save_login": "Stay logged in",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_server_up_to_date": "Client and Server are up-to-date", "profile_drawer_client_server_up_to_date": "Client and Server are up-to-date",
"profile_drawer_settings": "Settings", "profile_drawer_settings": "Settings",
"profile_drawer_sign_out": "Sign Out", "profile_drawer_sign_out": "Sign Out",
@@ -127,18 +141,25 @@
"select_additional_user_for_sharing_page_suggestions": "Suggestions", "select_additional_user_for_sharing_page_suggestions": "Suggestions",
"select_user_for_sharing_page_err_album": "Failed to create album", "select_user_for_sharing_page_err_album": "Failed to create album",
"select_user_for_sharing_page_share_suggestions": "Suggestions", "select_user_for_sharing_page_share_suggestions": "Suggestions",
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).",
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).",
"setting_image_viewer_original_title": "Load original image",
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.",
"setting_image_viewer_preview_title": "Load preview image",
"setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}", "setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}",
"setting_notifications_notify_hours": "{} hours", "setting_notifications_notify_hours": "{} hours",
"setting_notifications_notify_immediately": "immediately", "setting_notifications_notify_immediately": "immediately",
"setting_notifications_notify_minutes": "{} minutes", "setting_notifications_notify_minutes": "{} minutes",
"setting_notifications_notify_never": "never", "setting_notifications_notify_never": "never",
"setting_notifications_notify_seconds": "{} seconds",
"setting_notifications_single_progress_subtitle": "Detailed upload progress information per asset",
"setting_notifications_single_progress_title": "Show background backup detail progress",
"setting_notifications_subtitle": "Adjust your notification preferences", "setting_notifications_subtitle": "Adjust your notification preferences",
"setting_notifications_title": "Notifications", "setting_notifications_title": "Notifications",
"setting_notifications_total_progress_title": "Show background backup total progress",
"setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)", "setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)",
"setting_notifications_single_progress_title": "Show background backup detail progress", "setting_notifications_total_progress_title": "Show background backup total progress",
"setting_notifications_single_progress_subtitle": "Detailed upload progress information per asset",
"setting_pages_app_bar_settings": "Settings", "setting_pages_app_bar_settings": "Settings",
"settings_require_restart": "Please restart Immich to apply this setting",
"share_add": "Add", "share_add": "Add",
"share_add_photos": "Add photos", "share_add_photos": "Add photos",
"share_add_title": "Add a title", "share_add_title": "Add a title",
@@ -169,13 +190,5 @@
"version_announcement_overlay_text_1": "Hi friend, there is a new release of", "version_announcement_overlay_text_1": "Hi friend, there is a new release of",
"version_announcement_overlay_text_2": "please take your time to visit the ", "version_announcement_overlay_text_2": "please take your time to visit the ",
"version_announcement_overlay_text_3": " and ensure your docker-compose and .env setup is up-to-date to prevent any misconfigurations, especially if you use WatchTower or any mechanism that handles updating your server application automatically.", "version_announcement_overlay_text_3": " and ensure your docker-compose and .env setup is up-to-date to prevent any misconfigurations, especially if you use WatchTower or any mechanism that handles updating your server application automatically.",
"version_announcement_overlay_title": "New Server Version Available \uD83C\uDF89", "version_announcement_overlay_title": "New Server Version Available \uD83C\uDF89"
"experimental_settings_title": "Experimental",
"experimental_settings_subtitle": "Use at your own risk!",
"control_bottom_app_bar_add_to_album": "Add to album",
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
"control_bottom_app_bar_album_info": "{} items",
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
"control_bottom_app_bar_create_new_album": "Create new album"
} }

View File

@@ -1,6 +1,9 @@
{ {
"album_info_card_backup_album_excluded": "EXCLUIDOS", "album_info_card_backup_album_excluded": "EXCLUIDOS",
"album_info_card_backup_album_included": "INCLUIDOS", "album_info_card_backup_album_included": "INCLUIDOS",
"album_thumbnail_card_item": "1 item",
"album_thumbnail_card_items": "{} items",
"album_thumbnail_card_shared": " · Shared",
"album_viewer_appbar_share_delete": "Eliminar álbum ", "album_viewer_appbar_share_delete": "Eliminar álbum ",
"album_viewer_appbar_share_err_delete": "No ha podido eliminar el álbum", "album_viewer_appbar_share_err_delete": "No ha podido eliminar el álbum",
"album_viewer_appbar_share_err_leave": "No ha podido dejar el álbum", "album_viewer_appbar_share_err_leave": "No ha podido dejar el álbum",
@@ -9,6 +12,8 @@
"album_viewer_appbar_share_leave": "Abandonar álbum ", "album_viewer_appbar_share_leave": "Abandonar álbum ",
"album_viewer_appbar_share_remove": "Eliminar del álbum ", "album_viewer_appbar_share_remove": "Eliminar del álbum ",
"album_viewer_page_share_add_users": "Añadir usuarios", "album_viewer_page_share_add_users": "Añadir usuarios",
"asset_list_settings_subtitle": "Photo grid layout settings",
"asset_list_settings_title": "Photo Grid",
"backup_album_selection_page_albums_device": "Álbumes en el dispositivo ({})", "backup_album_selection_page_albums_device": "Álbumes en el dispositivo ({})",
"backup_album_selection_page_albums_tap": "Toque para incluir, doble toque para excluir", "backup_album_selection_page_albums_tap": "Toque para incluir, doble toque para excluir",
"backup_album_selection_page_assets_scatter": "Los activos pueden dispersarse en varios álbumes. De este modo, los álbumes pueden ser incluidos o excluidos durante el proceso de copia de seguridad.", "backup_album_selection_page_assets_scatter": "Los activos pueden dispersarse en varios álbumes. De este modo, los álbumes pueden ser incluidos o excluidos durante el proceso de copia de seguridad.",
@@ -16,13 +21,37 @@
"backup_album_selection_page_selection_info": "Información sobre la Selección", "backup_album_selection_page_selection_info": "Información sobre la Selección",
"backup_album_selection_page_total_assets": "Total de activos únicos", "backup_album_selection_page_total_assets": "Total de activos únicos",
"backup_all": "Todos", "backup_all": "Todos",
"backup_background_service_backup_failed_message": "Failed to backup assets. Retrying…",
"backup_background_service_connection_failed_message": "Failed to connect to the server. Retrying…",
"backup_background_service_current_upload_notification": "Uploading {}",
"backup_background_service_default_notification": "Checking for new assets…",
"backup_background_service_error_title": "Backup error",
"backup_background_service_in_progress_notification": "Backing up your assets…",
"backup_background_service_upload_failure_notification": "Failed to upload {}",
"backup_controller_page_albums": "Álbumes de copia de seguridad", "backup_controller_page_albums": "Álbumes de copia de seguridad",
"backup_controller_page_background_battery_info_link": "Show me how",
"backup_controller_page_background_battery_info_message": "For the best background backup experience, please disable any battery optimizations restricting background activity for Immich.\n\nSince this is device-specific, please lookup the required information for your device manufacturer.",
"backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_battery_info_title": "Battery optimizations",
"backup_controller_page_background_charging": "Only while charging",
"backup_controller_page_background_configure_error": "Failed to configure the background service",
"backup_controller_page_background_delay": "Delay new assets backup: {}",
"backup_controller_page_background_description": "Turn on the background service to automatically backup any new assets without needing to open the app",
"backup_controller_page_background_is_off": "Automatic background backup is off",
"backup_controller_page_background_is_on": "Automatic background backup is on",
"backup_controller_page_background_turn_off": "Turn off background service",
"backup_controller_page_background_turn_on": "Turn on background service",
"backup_controller_page_background_wifi": "Only on WiFi",
"backup_controller_page_backup": "Copia de Seguridad", "backup_controller_page_backup": "Copia de Seguridad",
"backup_controller_page_backup_selected": "Seleccionado:", "backup_controller_page_backup_selected": "Seleccionado:",
"backup_controller_page_backup_sub": "Copia de seguridad de fotos y vídeos", "backup_controller_page_backup_sub": "Copia de seguridad de fotos y vídeos",
"backup_controller_page_cancel": "Cancelar", "backup_controller_page_cancel": "Cancelar",
"backup_controller_page_created": "Created on: {}",
"backup_controller_page_desc_backup": "Active la copia de seguridad para cargar automáticamente los nuevos activos al servidor.", "backup_controller_page_desc_backup": "Active la copia de seguridad para cargar automáticamente los nuevos activos al servidor.",
"backup_controller_page_excluded": "Excluido:", "backup_controller_page_excluded": "Excluido:",
"backup_controller_page_failed": "Failed ({})",
"backup_controller_page_filename": "File name: {} [{}]",
"backup_controller_page_id": "ID: {}",
"backup_controller_page_info": "Información de la Copia de Seguridad", "backup_controller_page_info": "Información de la Copia de Seguridad",
"backup_controller_page_none_selected": "Ninguno seleccionado", "backup_controller_page_none_selected": "Ninguno seleccionado",
"backup_controller_page_remainder": "Remanente", "backup_controller_page_remainder": "Remanente",
@@ -38,9 +67,30 @@
"backup_controller_page_total_sub": "Todas las fotos y vídeos únicos de los álbumes seleccionados", "backup_controller_page_total_sub": "Todas las fotos y vídeos únicos de los álbumes seleccionados",
"backup_controller_page_turn_off": "Apagar la copia de seguridad", "backup_controller_page_turn_off": "Apagar la copia de seguridad",
"backup_controller_page_turn_on": "Activar la copia de seguridad", "backup_controller_page_turn_on": "Activar la copia de seguridad",
"backup_controller_page_uploading_file_info": "Uploading file info",
"backup_err_only_album": "No se puede eliminar el único álbum", "backup_err_only_album": "No se puede eliminar el único álbum",
"backup_info_card_assets": "activos", "backup_info_card_assets": "activos",
"cache_settings_album_thumbnails": "Library page thumbnails ({} assets)",
"cache_settings_clear_cache_button": "Clear cache",
"cache_settings_clear_cache_button_title": "Clears the app's cache. This will significantly impact the app's performance until the cache has rebuilt.",
"cache_settings_image_cache_size": "Image cache size ({} assets)",
"cache_settings_statistics_album": "Library thumbnails",
"cache_settings_statistics_assets": "{} assets ({})",
"cache_settings_statistics_full": "Full images",
"cache_settings_statistics_shared": "Shared album thumbnails",
"cache_settings_statistics_thumbnail": "Thumbnails",
"cache_settings_statistics_title": "Cache usage",
"cache_settings_subtitle": "Control the caching behaviour of the Immich mobile application",
"cache_settings_thumbnail_size": "Thumbnail cache size ({} assets)",
"cache_settings_title": "Caching Settings",
"control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} items",
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
"control_bottom_app_bar_create_new_album": "Create new album",
"control_bottom_app_bar_delete": "Eliminar", "control_bottom_app_bar_delete": "Eliminar",
"control_bottom_app_bar_share": "Share",
"create_album_page_untitled": "Untitled",
"create_shared_album_page_create": "Create",
"create_shared_album_page_share": "Compartir", "create_shared_album_page_share": "Compartir",
"create_shared_album_page_share_add_assets": "AÑADIR ACTIVOS", "create_shared_album_page_share_add_assets": "AÑADIR ACTIVOS",
"create_shared_album_page_share_select_photos": "Seleccionar Fotos", "create_shared_album_page_share_select_photos": "Seleccionar Fotos",
@@ -54,6 +104,14 @@
"exif_bottom_sheet_description": "Añadir Descripción...", "exif_bottom_sheet_description": "Añadir Descripción...",
"exif_bottom_sheet_details": "DETALLES", "exif_bottom_sheet_details": "DETALLES",
"exif_bottom_sheet_location": "LOCALZACIÓN", "exif_bottom_sheet_location": "LOCALZACIÓN",
"experimental_settings_new_asset_list_subtitle": "Work in progress",
"experimental_settings_new_asset_list_title": "Enable experimental photo grid",
"experimental_settings_subtitle": "Use at your own risk!",
"experimental_settings_title": "Experimental",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
"library_page_albums": "Albums",
"library_page_new_album": "New album",
"login_form_button_text": "Iniciar Sesión", "login_form_button_text": "Iniciar Sesión",
"login_form_email_hint": "tucorreo@correo.com", "login_form_email_hint": "tucorreo@correo.com",
"login_form_endpoint_hint": "http://tu-ip-de-servidor:puerto/api", "login_form_endpoint_hint": "http://tu-ip-de-servidor:puerto/api",
@@ -62,33 +120,71 @@
"login_form_err_invalid_email": "Correo electrónico no válido", "login_form_err_invalid_email": "Correo electrónico no válido",
"login_form_err_leading_whitespace": "Espacio en blanco inicial", "login_form_err_leading_whitespace": "Espacio en blanco inicial",
"login_form_err_trailing_whitespace": "Espacio en blanco al final", "login_form_err_trailing_whitespace": "Espacio en blanco al final",
"login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL",
"login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server",
"login_form_failed_login": "Error logging you in, check server URL, email and password",
"login_form_label_email": "Correo", "login_form_label_email": "Correo",
"login_form_label_password": "Contraseña", "login_form_label_password": "Contraseña",
"login_form_password_hint": "contraseña", "login_form_password_hint": "contraseña",
"login_form_save_login": "Mantener la sesión iniciada", "login_form_save_login": "Mantener la sesión iniciada",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_server_up_to_date": "El Cliente y el Servidor están actualizados", "profile_drawer_client_server_up_to_date": "El Cliente y el Servidor están actualizados",
"profile_drawer_settings": "Settings",
"profile_drawer_sign_out": "Cerrar Sesión", "profile_drawer_sign_out": "Cerrar Sesión",
"search_bar_hint": "Busca tus fotos", "search_bar_hint": "Busca tus fotos",
"search_page_no_objects": "No Objects Info Available",
"search_page_no_places": "No hay información de lugares disponibles", "search_page_no_places": "No hay información de lugares disponibles",
"search_page_places": "Lugares", "search_page_places": "Lugares",
"search_page_things": "Cosas", "search_page_things": "Cosas",
"search_result_page_new_search_hint": "Nueva Busqueda", "search_result_page_new_search_hint": "Nueva Busqueda",
"select_additional_user_for_sharing_page_suggestions": "Sugerencias", "select_additional_user_for_sharing_page_suggestions": "Sugerencias",
"select_user_for_sharing_page_err_album": "Fallo al crear el álbum", "select_user_for_sharing_page_err_album": "Fallo al crear el álbum",
"select_user_for_sharing_page_share_suggestions": "Suggestions",
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).",
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).",
"setting_image_viewer_original_title": "Load original image",
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.",
"setting_image_viewer_preview_title": "Load preview image",
"setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}",
"setting_notifications_notify_hours": "{} hours",
"setting_notifications_notify_immediately": "immediately",
"setting_notifications_notify_minutes": "{} minutes",
"setting_notifications_notify_never": "never",
"setting_notifications_notify_seconds": "{} seconds",
"setting_notifications_single_progress_subtitle": "Detailed upload progress information per asset",
"setting_notifications_single_progress_title": "Show background backup detail progress",
"setting_notifications_subtitle": "Adjust your notification preferences",
"setting_notifications_title": "Notifications",
"setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)",
"setting_notifications_total_progress_title": "Show background backup total progress",
"setting_pages_app_bar_settings": "Settings",
"settings_require_restart": "Please restart Immich to apply this setting",
"share_add": "Añadir", "share_add": "Añadir",
"share_add_photos": "Añadir fotos", "share_add_photos": "Añadir fotos",
"share_add_title": "Añadir un título", "share_add_title": "Añadir un título",
"share_create_album": "Crear álbum", "share_create_album": "Crear álbum",
"share_dialog_preparing": "Preparing...",
"share_invite": "Invitar al álbum", "share_invite": "Invitar al álbum",
"sharing_page_album": "Álbumes compartidos", "sharing_page_album": "Álbumes compartidos",
"sharing_page_description": "Crea álbumes compartidos para compartir fotos y vídeos con las personas de tu red.", "sharing_page_description": "Crea álbumes compartidos para compartir fotos y vídeos con las personas de tu red.",
"sharing_page_empty_list": "LISTA VACIA", "sharing_page_empty_list": "LISTA VACIA",
"sharing_silver_appbar_create_shared_album": "Crear un álbum compartido", "sharing_silver_appbar_create_shared_album": "Crear un álbum compartido",
"sharing_silver_appbar_share_partner": "Compartir con el compañero", "sharing_silver_appbar_share_partner": "Compartir con el compañero",
"tab_controller_nav_library": "Library",
"tab_controller_nav_photos": "Fotos", "tab_controller_nav_photos": "Fotos",
"tab_controller_nav_search": "Buscar", "tab_controller_nav_search": "Buscar",
"tab_controller_nav_sharing": "Compartiendo", "tab_controller_nav_sharing": "Compartiendo",
"theme_setting_asset_list_storage_indicator_title": "Show storage indicator on asset tiles",
"theme_setting_asset_list_tiles_per_row_title": "Number of assets per row ({})",
"theme_setting_dark_mode_switch": "Dark mode",
"theme_setting_image_viewer_quality_subtitle": "Adjust the quality of the detail image viewer",
"theme_setting_image_viewer_quality_title": "Image viewer quality",
"theme_setting_system_theme_switch": "Automatic (Follow system setting)",
"theme_setting_theme_subtitle": "Choose the app's theme setting",
"theme_setting_theme_title": "Theme",
"theme_setting_three_stage_loading_subtitle": "Three-stage loading might increase the loading performance but causes significantly higher network load",
"theme_setting_three_stage_loading_title": "Enable three-stage loading",
"version_announcement_overlay_ack": "Reconocer", "version_announcement_overlay_ack": "Reconocer",
"version_announcement_overlay_release_notes": "notas de versión", "version_announcement_overlay_release_notes": "notas de versión",
"version_announcement_overlay_text_1": "Hola amigo, hay una nueva versión de", "version_announcement_overlay_text_1": "Hola amigo, hay una nueva versión de",

View File

@@ -1,6 +1,9 @@
{ {
"album_info_card_backup_album_excluded": "JÄTETTY POIS", "album_info_card_backup_album_excluded": "JÄTETTY POIS",
"album_info_card_backup_album_included": "SISÄLLYTETTY", "album_info_card_backup_album_included": "SISÄLLYTETTY",
"album_thumbnail_card_item": "1 kohde",
"album_thumbnail_card_items": "{} kohdetta",
"album_thumbnail_card_shared": "Jaettu",
"album_viewer_appbar_share_delete": "Poista albumi", "album_viewer_appbar_share_delete": "Poista albumi",
"album_viewer_appbar_share_err_delete": "Albumin poistaminen epäonnistui", "album_viewer_appbar_share_err_delete": "Albumin poistaminen epäonnistui",
"album_viewer_appbar_share_err_leave": "Albumista poistuminen epäonnistui", "album_viewer_appbar_share_err_leave": "Albumista poistuminen epäonnistui",
@@ -9,6 +12,8 @@
"album_viewer_appbar_share_leave": "Poistu albumista", "album_viewer_appbar_share_leave": "Poistu albumista",
"album_viewer_appbar_share_remove": "Poista albumista", "album_viewer_appbar_share_remove": "Poista albumista",
"album_viewer_page_share_add_users": "Lisää käyttäjiä", "album_viewer_page_share_add_users": "Lisää käyttäjiä",
"asset_list_settings_subtitle": "Kuvaruudukon asettelu",
"asset_list_settings_title": "Kuvaruudukko",
"backup_album_selection_page_albums_device": "Laitteen albumit ({})", "backup_album_selection_page_albums_device": "Laitteen albumit ({})",
"backup_album_selection_page_albums_tap": "Napauta sisällyttääksesi, kaksoisnapauta jättääksesi pois", "backup_album_selection_page_albums_tap": "Napauta sisällyttääksesi, kaksoisnapauta jättääksesi pois",
"backup_album_selection_page_assets_scatter": "Kohteet voivat olla hajaantuneina useisiin albumeihin. Albumeita voidaan sisällyttää varmuuskopiointiin tai jättää siitä pois.", "backup_album_selection_page_assets_scatter": "Kohteet voivat olla hajaantuneina useisiin albumeihin. Albumeita voidaan sisällyttää varmuuskopiointiin tai jättää siitä pois.",
@@ -16,7 +21,27 @@
"backup_album_selection_page_selection_info": "Valintatiedot", "backup_album_selection_page_selection_info": "Valintatiedot",
"backup_album_selection_page_total_assets": "Uniikkeja kohteita yhteensä", "backup_album_selection_page_total_assets": "Uniikkeja kohteita yhteensä",
"backup_all": "Kaikki", "backup_all": "Kaikki",
"backup_background_service_backup_failed_message": "Kohteiden varmuuskopiointi epäonnistui. Yritetään uudelleen...",
"backup_background_service_connection_failed_message": "Palvelimeen ei saatu yhteyttä. Yritetään uudelleen...",
"backup_background_service_current_upload_notification": "Lähetetään {}",
"backup_background_service_default_notification": "Tarkistetaan uusia kohteita...",
"backup_background_service_error_title": "Virhe varmuuskopioinnissa",
"backup_background_service_in_progress_notification": "Varmuuskopioidaan kohteita...",
"backup_background_service_upload_failure_notification": "Lähetys palvelimelle epäonnistui {}",
"backup_controller_page_albums": "Varmuuskopioi albumit", "backup_controller_page_albums": "Varmuuskopioi albumit",
"backup_controller_page_background_battery_info_link": "Näytä minulle miten",
"backup_controller_page_background_battery_info_message": "Kytke pois päältä kaikki Immichin taustatyöskentelyyn liittyvät akun optimoinnit, jotta varmistat taustavarmuuskopioinnin parhaan mahdollisen toiminnan.\n\nKoska tämä on laitekohtaista, tarkista tarvittavat toimet laitevalmistajan ohjeista.",
"backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_battery_info_title": "Akun optimointi",
"backup_controller_page_background_charging": "Vain laitteen ollessa kytkettynä laturiin",
"backup_controller_page_background_configure_error": "Taustapalvelun asettaminen epäonnistui",
"backup_controller_page_background_delay": "Delay new assets backup: {}",
"backup_controller_page_background_description": "Kytke taustapalvelu päälle varmuuskopioidaksesi uudet kohteet automaattisesti, ilman sovelluksen avaamista",
"backup_controller_page_background_is_off": "Automaattinen varmuuskopiointi taustalla on pois päältä",
"backup_controller_page_background_is_on": "Automaattinen varmuuskopiointi taustalla on päällä",
"backup_controller_page_background_turn_off": "Kytke taustapalvelu pois päältä",
"backup_controller_page_background_turn_on": "Kytke taustapalvelu päälle",
"backup_controller_page_background_wifi": "Vain WiFi-verkossa",
"backup_controller_page_backup": "Varmuuskopioitu", "backup_controller_page_backup": "Varmuuskopioitu",
"backup_controller_page_backup_selected": "Valittu:", "backup_controller_page_backup_selected": "Valittu:",
"backup_controller_page_backup_sub": "Varmuuskopioidut kuvat ja videot", "backup_controller_page_backup_sub": "Varmuuskopioidut kuvat ja videot",
@@ -45,10 +70,33 @@
"backup_controller_page_uploading_file_info": "Tiedostojen lähetystiedot", "backup_controller_page_uploading_file_info": "Tiedostojen lähetystiedot",
"backup_err_only_album": "Vähintään yhden albumin tulee olla valittuna", "backup_err_only_album": "Vähintään yhden albumin tulee olla valittuna",
"backup_info_card_assets": "kohdetta", "backup_info_card_assets": "kohdetta",
"cache_settings_album_thumbnails": "Kirjastosivun esikatselukuvat ({} kohdetta)",
"cache_settings_clear_cache_button": "Tyhjennä välimuisti",
"cache_settings_clear_cache_button_title": "Tyhjennä sovelluksen välimuisti. Tämä vaikuttaa merkittävästi sovelluksen suorituskykyyn, kunnes välimuisti on rakennettu uudelleen.",
"cache_settings_image_cache_size": "Kuvien välimuistin koko ({} kohdetta)",
"cache_settings_statistics_album": "Kirjaston esikatselukuvat",
"cache_settings_statistics_assets": "{} kohdetta ({})",
"cache_settings_statistics_full": "Täysikokoiset kuvat",
"cache_settings_statistics_shared": "Jaettujen albumien esikatselukuvat",
"cache_settings_statistics_thumbnail": "Esikatselukuvat",
"cache_settings_statistics_title": "Välimuistin käyttö",
"cache_settings_subtitle": "Hallitse Immich-mobiilisovelluksen välimuistin käyttöä",
"cache_settings_thumbnail_size": "Esikatselukuvien välimuistin koko ({} kohdetta)",
"cache_settings_title": "Välimuistin asetukset",
"control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} items",
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
"control_bottom_app_bar_create_new_album": "Create new album",
"control_bottom_app_bar_delete": "Poista", "control_bottom_app_bar_delete": "Poista",
"control_bottom_app_bar_share": "Jaa",
"create_album_page_untitled": "Nimetön",
"create_shared_album_page_create": "Luo",
"create_shared_album_page_share": "Jaa", "create_shared_album_page_share": "Jaa",
"create_shared_album_page_share_add_assets": "LISÄÄ KOHTEITA", "create_shared_album_page_share_add_assets": "LISÄÄ KOHTEITA",
"create_shared_album_page_share_select_photos": "Valitse kuvat", "create_shared_album_page_share_select_photos": "Valitse kuvat",
"daily_title_text_date": "E, MMM dd",
"daily_title_text_date_year": "E, MMM dd, yyyy",
"date_format": "E, LLL d, y • h:mm a",
"delete_dialog_alert": "Nämä kohteet poistetaan pysyvästi Immich:stä ja laitteeltasi", "delete_dialog_alert": "Nämä kohteet poistetaan pysyvästi Immich:stä ja laitteeltasi",
"delete_dialog_cancel": "Peruuta", "delete_dialog_cancel": "Peruuta",
"delete_dialog_ok": "Poista", "delete_dialog_ok": "Poista",
@@ -56,6 +104,14 @@
"exif_bottom_sheet_description": "Lisää kuvaus…", "exif_bottom_sheet_description": "Lisää kuvaus…",
"exif_bottom_sheet_details": "TIEDOT", "exif_bottom_sheet_details": "TIEDOT",
"exif_bottom_sheet_location": "SIJAINTI", "exif_bottom_sheet_location": "SIJAINTI",
"experimental_settings_new_asset_list_subtitle": "Työn alla",
"experimental_settings_new_asset_list_title": "Ota käyttöön kokeellinen kuvaruudukko",
"experimental_settings_subtitle": "Käyttö omalla vastuulla!",
"experimental_settings_title": "Kokeellinen",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
"library_page_albums": "Albumit",
"library_page_new_album": "Uusi albumi",
"login_form_button_text": "Kirjaudu", "login_form_button_text": "Kirjaudu",
"login_form_email_hint": "sahkopostisi@esimerkki.fi", "login_form_email_hint": "sahkopostisi@esimerkki.fi",
"login_form_endpoint_hint": "http://palvelimesi-osoite:portti/api", "login_form_endpoint_hint": "http://palvelimesi-osoite:portti/api",
@@ -64,12 +120,17 @@
"login_form_err_invalid_email": "Virheellinen sähköpostiosoite", "login_form_err_invalid_email": "Virheellinen sähköpostiosoite",
"login_form_err_leading_whitespace": "Alussa välilyönti", "login_form_err_leading_whitespace": "Alussa välilyönti",
"login_form_err_trailing_whitespace": "Lopussa välilyönti", "login_form_err_trailing_whitespace": "Lopussa välilyönti",
"login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL",
"login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server",
"login_form_failed_login": "Virhe kirjautumisessa. Tarkista palvelimen URL, sähköpostiosoite ja salasana.", "login_form_failed_login": "Virhe kirjautumisessa. Tarkista palvelimen URL, sähköpostiosoite ja salasana.",
"login_form_label_email": "Sähköposti", "login_form_label_email": "Sähköposti",
"login_form_label_password": "Salasana", "login_form_label_password": "Salasana",
"login_form_password_hint": "salasana", "login_form_password_hint": "salasana",
"login_form_save_login": "Pysy kirjautuneena", "login_form_save_login": "Pysy kirjautuneena",
"monthly_title_text_date_format": "MMMM y",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_server_up_to_date": "Asiakassovellus ja palvelin ovat ajan tasalla", "profile_drawer_client_server_up_to_date": "Asiakassovellus ja palvelin ovat ajan tasalla",
"profile_drawer_settings": "Asetukset",
"profile_drawer_sign_out": "Kirjaudu ulos", "profile_drawer_sign_out": "Kirjaudu ulos",
"search_bar_hint": "Etsi kuvia", "search_bar_hint": "Etsi kuvia",
"search_page_no_objects": "Objektitietoja ei ole saatavilla", "search_page_no_objects": "Objektitietoja ei ole saatavilla",
@@ -80,19 +141,50 @@
"select_additional_user_for_sharing_page_suggestions": "Ehdotukset", "select_additional_user_for_sharing_page_suggestions": "Ehdotukset",
"select_user_for_sharing_page_err_album": "Albumin luonti epäonnistui", "select_user_for_sharing_page_err_album": "Albumin luonti epäonnistui",
"select_user_for_sharing_page_share_suggestions": "Ehdotukset", "select_user_for_sharing_page_share_suggestions": "Ehdotukset",
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).",
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).",
"setting_image_viewer_original_title": "Load original image",
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.",
"setting_image_viewer_preview_title": "Load preview image",
"setting_notifications_notify_failures_grace_period": "Ilmoita taustavarmuuskopioinnin epäonnistumisista: {}",
"setting_notifications_notify_hours": "{} tunnin välein",
"setting_notifications_notify_immediately": "heti",
"setting_notifications_notify_minutes": "{} minuutin välein",
"setting_notifications_notify_never": "ei koskaan",
"setting_notifications_notify_seconds": "{} seconds",
"setting_notifications_single_progress_subtitle": "Yksityiskohtainen tieto palvelimelle lähettämisen edistymisestä kohteittain",
"setting_notifications_single_progress_title": "Näytä taustavarmuuskopioinnin eidstminen",
"setting_notifications_subtitle": "Ilmoitusasetusten määrittely",
"setting_notifications_title": "Ilmoitukset",
"setting_notifications_total_progress_subtitle": "Lähetyksen yleinen edistyminen (kohteita lähetetty/yhteensä)",
"setting_notifications_total_progress_title": "Näytä taustavarmuuskopioinnin kokonaisedistyminen",
"setting_pages_app_bar_settings": "Asetukset",
"settings_require_restart": "Käynnistä Immich uudelleen ottaaksesti tämän asetuksen käyttöön",
"share_add": "Lisää", "share_add": "Lisää",
"share_add_photos": "Lisää kuvia", "share_add_photos": "Lisää kuvia",
"share_add_title": "Lisää nimi", "share_add_title": "Lisää nimi",
"share_create_album": "Luo albumi", "share_create_album": "Luo albumi",
"share_dialog_preparing": "Valmistellaan...",
"share_invite": "Kutsu albumiin", "share_invite": "Kutsu albumiin",
"sharing_page_album": "Jaetut albumit", "sharing_page_album": "Jaetut albumit",
"sharing_page_description": "Luo jaettuja albumeja jakaaksesi kuvia ja videoita läheisillesi.", "sharing_page_description": "Luo jaettuja albumeja jakaaksesi kuvia ja videoita läheisillesi.",
"sharing_page_empty_list": "TYHJÄ LISTA", "sharing_page_empty_list": "TYHJÄ LISTA",
"sharing_silver_appbar_create_shared_album": "Luo jaettu albumi", "sharing_silver_appbar_create_shared_album": "Luo jaettu albumi",
"sharing_silver_appbar_share_partner": "Jaa kumppanille", "sharing_silver_appbar_share_partner": "Jaa kumppanille",
"tab_controller_nav_library": "Kirjasto",
"tab_controller_nav_photos": "Kuvat", "tab_controller_nav_photos": "Kuvat",
"tab_controller_nav_search": "Haku", "tab_controller_nav_search": "Haku",
"tab_controller_nav_sharing": "Jakaminen", "tab_controller_nav_sharing": "Jakaminen",
"theme_setting_asset_list_storage_indicator_title": "Näytä tallennustilainidikaattori kohteiden kuvakkeissa",
"theme_setting_asset_list_tiles_per_row_title": "Kohteiden määrä rivillä ({})",
"theme_setting_dark_mode_switch": "Tumma teema",
"theme_setting_image_viewer_quality_subtitle": "Säädä kuvien katselun laatua",
"theme_setting_image_viewer_quality_title": "Kuvien katseluohjelman laatu",
"theme_setting_system_theme_switch": "Automaattinen (seuraa järjestelmän asetusta)",
"theme_setting_theme_subtitle": "Valitse sovelluksen teema-asetukset",
"theme_setting_theme_title": "Teema",
"theme_setting_three_stage_loading_subtitle": "Kolmivaiheinen lataaminen saattaa parantaa latauksen suorituskykyä, mutta lisää kaistankäyttöä huomattavasti.",
"theme_setting_three_stage_loading_title": "Ota kolmivaiheinen lataus käyttöön",
"version_announcement_overlay_ack": "Tiedostan", "version_announcement_overlay_ack": "Tiedostan",
"version_announcement_overlay_release_notes": "julkaisutiedoissa", "version_announcement_overlay_release_notes": "julkaisutiedoissa",
"version_announcement_overlay_text_1": "Hei, kaveri! Uusi palvelinversio on saatavilla sovelluksesta", "version_announcement_overlay_text_1": "Hei, kaveri! Uusi palvelinversio on saatavilla sovelluksesta",

View File

@@ -12,6 +12,8 @@
"album_viewer_appbar_share_leave": "Quitter l'album", "album_viewer_appbar_share_leave": "Quitter l'album",
"album_viewer_appbar_share_remove": "Retirer de l'album", "album_viewer_appbar_share_remove": "Retirer de l'album",
"album_viewer_page_share_add_users": "Ajouter des utilisateurs", "album_viewer_page_share_add_users": "Ajouter des utilisateurs",
"asset_list_settings_subtitle": "Paramètres de disposition de la grille de photos",
"asset_list_settings_title": "Grille de photos",
"backup_album_selection_page_albums_device": "Albums sur l'appareil ({})", "backup_album_selection_page_albums_device": "Albums sur l'appareil ({})",
"backup_album_selection_page_albums_tap": "Tapez pour inclure, tapez deux fois pour exclure", "backup_album_selection_page_albums_tap": "Tapez pour inclure, tapez deux fois pour exclure",
"backup_album_selection_page_assets_scatter": "Les éléments peuvent être répartis sur plusieurs albums. De ce fait, les albums peuvent être inclus ou exclus pendant le processus de sauvegarde.", "backup_album_selection_page_assets_scatter": "Les éléments peuvent être répartis sur plusieurs albums. De ce fait, les albums peuvent être inclus ou exclus pendant le processus de sauvegarde.",
@@ -19,7 +21,27 @@
"backup_album_selection_page_selection_info": "Informations sur la sélection", "backup_album_selection_page_selection_info": "Informations sur la sélection",
"backup_album_selection_page_total_assets": "Total des éléments uniques", "backup_album_selection_page_total_assets": "Total des éléments uniques",
"backup_all": "Tout", "backup_all": "Tout",
"backup_background_service_backup_failed_message": "Échec de la sauvegarde des éléments. Nouvelle tentative...",
"backup_background_service_connection_failed_message": "Impossible de se connecter au serveur. Nouvelle tentative...",
"backup_background_service_current_upload_notification": "Transfert {}",
"backup_background_service_default_notification": "Recherche de nouveaux éléments...",
"backup_background_service_error_title": "Erreur de sauvegarde",
"backup_background_service_in_progress_notification": "Sauvegarde de vos éléments...",
"backup_background_service_upload_failure_notification": "Impossible de transférer {}",
"backup_controller_page_albums": "Sauvegarder les albums", "backup_controller_page_albums": "Sauvegarder les albums",
"backup_controller_page_background_battery_info_link": "Montrez-moi comment",
"backup_controller_page_background_battery_info_message": "Pour une expérience optimale de la sauvegarde en arrière-plan, veuillez désactiver toute optimisation de la batterie limitant l'activité en arrière-plan pour Immich.\n\nÉtant donné que cela est spécifique à chaque appareil, veuillez consulter les informations requises pour le fabricant de votre appareil.",
"backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_battery_info_title": "Optimisation de la batterie",
"backup_controller_page_background_charging": "Seulement pendant la charge",
"backup_controller_page_background_configure_error": "Échec de la configuration du service d'arrière-plan",
"backup_controller_page_background_delay": "Delay new assets backup: {}",
"backup_controller_page_background_description": "Activez le service d'arrière-plan pour sauvegarder automatiquement tous les nouveaux éléments sans avoir à ouvrir l'application.",
"backup_controller_page_background_is_off": "La sauvegarde automatique en arrière-plan est désactivée",
"backup_controller_page_background_is_on": "La sauvegarde automatique en arrière-plan est activée",
"backup_controller_page_background_turn_off": "Désactiver le service d'arrière-plan",
"backup_controller_page_background_turn_on": "Activer le service d'arrière-plan",
"backup_controller_page_background_wifi": "Uniquement en WiFi",
"backup_controller_page_backup": "Sauvegardé", "backup_controller_page_backup": "Sauvegardé",
"backup_controller_page_backup_selected": "Sélectionné : ", "backup_controller_page_backup_selected": "Sélectionné : ",
"backup_controller_page_backup_sub": "Photos et vidéos sauvegardées", "backup_controller_page_backup_sub": "Photos et vidéos sauvegardées",
@@ -45,9 +67,26 @@
"backup_controller_page_total_sub": "Toutes les photos et vidéos uniques des albums sélectionnés", "backup_controller_page_total_sub": "Toutes les photos et vidéos uniques des albums sélectionnés",
"backup_controller_page_turn_off": "Désactiver la sauvegarde", "backup_controller_page_turn_off": "Désactiver la sauvegarde",
"backup_controller_page_turn_on": "Activer la sauvegarde", "backup_controller_page_turn_on": "Activer la sauvegarde",
"backup_controller_page_uploading_file_info": "Envoi d'informations sur le fichier", "backup_controller_page_uploading_file_info": "Transfert des informations du fichier",
"backup_err_only_album": "Impossible de retirer le seul album", "backup_err_only_album": "Impossible de retirer le seul album",
"backup_info_card_assets": "éléments", "backup_info_card_assets": "éléments",
"cache_settings_album_thumbnails": "Miniatures de la page bibliothèque ({} éléments)",
"cache_settings_clear_cache_button": "Effacer le cache",
"cache_settings_clear_cache_button_title": "Efface le cache de l'application. Cela aura un impact significatif sur les performances de l'application jusqu'à ce que le cache soit reconstruit.",
"cache_settings_image_cache_size": "Taille du cache des images ({} éléments)",
"cache_settings_statistics_album": "Miniatures de la bibliothèque",
"cache_settings_statistics_assets": "{} éléments ({})",
"cache_settings_statistics_full": "Images complètes",
"cache_settings_statistics_shared": "Miniatures d'albums partagés",
"cache_settings_statistics_thumbnail": "Miniatures",
"cache_settings_statistics_title": "Utilisation du cache",
"cache_settings_subtitle": "Contrôler le comportement de mise en cache de l'application mobile Immich",
"cache_settings_thumbnail_size": "Taille du cache des miniatures ({} éléments)",
"cache_settings_title": "Paramètres de mise en cache",
"control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} items",
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
"control_bottom_app_bar_create_new_album": "Create new album",
"control_bottom_app_bar_delete": "Supprimer", "control_bottom_app_bar_delete": "Supprimer",
"control_bottom_app_bar_share": "Partager", "control_bottom_app_bar_share": "Partager",
"create_album_page_untitled": "Sans titre", "create_album_page_untitled": "Sans titre",
@@ -65,6 +104,12 @@
"exif_bottom_sheet_description": "Ajouter une description...", "exif_bottom_sheet_description": "Ajouter une description...",
"exif_bottom_sheet_details": "DÉTAILS", "exif_bottom_sheet_details": "DÉTAILS",
"exif_bottom_sheet_location": "LOCALISATION", "exif_bottom_sheet_location": "LOCALISATION",
"experimental_settings_new_asset_list_subtitle": "En cours de développement",
"experimental_settings_new_asset_list_title": "Activez la grille de photos expérimentale",
"experimental_settings_subtitle": "Utilisez à vos dépends !",
"experimental_settings_title": "Expérimental",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
"library_page_albums": "Albums", "library_page_albums": "Albums",
"library_page_new_album": "Nouvel album", "library_page_new_album": "Nouvel album",
"login_form_button_text": "Connexion", "login_form_button_text": "Connexion",
@@ -75,12 +120,15 @@
"login_form_err_invalid_email": "Email invalide", "login_form_err_invalid_email": "Email invalide",
"login_form_err_leading_whitespace": "Espace en début de ligne", "login_form_err_leading_whitespace": "Espace en début de ligne",
"login_form_err_trailing_whitespace": "Espace de fin de ligne", "login_form_err_trailing_whitespace": "Espace de fin de ligne",
"login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL",
"login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server",
"login_form_failed_login": "Erreur de connexion, vérifiez l'url du serveur, l'email et le mot de passe", "login_form_failed_login": "Erreur de connexion, vérifiez l'url du serveur, l'email et le mot de passe",
"login_form_label_email": "Email", "login_form_label_email": "Email",
"login_form_label_password": "Mot de passe", "login_form_label_password": "Mot de passe",
"login_form_password_hint": "mot de passe", "login_form_password_hint": "mot de passe",
"login_form_save_login": "Rester connecté", "login_form_save_login": "Rester connecté",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_server_up_to_date": "Le client et le serveur sont à jour", "profile_drawer_client_server_up_to_date": "Le client et le serveur sont à jour",
"profile_drawer_settings": "Paramètres", "profile_drawer_settings": "Paramètres",
"profile_drawer_sign_out": "Se déconnecter", "profile_drawer_sign_out": "Se déconnecter",
@@ -93,6 +141,25 @@
"select_additional_user_for_sharing_page_suggestions": "Suggestions", "select_additional_user_for_sharing_page_suggestions": "Suggestions",
"select_user_for_sharing_page_err_album": "Échec de la création de l'album", "select_user_for_sharing_page_err_album": "Échec de la création de l'album",
"select_user_for_sharing_page_share_suggestions": "Suggestions", "select_user_for_sharing_page_share_suggestions": "Suggestions",
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).",
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).",
"setting_image_viewer_original_title": "Load original image",
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.",
"setting_image_viewer_preview_title": "Load preview image",
"setting_notifications_notify_failures_grace_period": "Notifier les échecs de la sauvegarde en arrière-plan : {}",
"setting_notifications_notify_hours": "{} heures",
"setting_notifications_notify_immediately": "immédiatement",
"setting_notifications_notify_minutes": "{} minutes",
"setting_notifications_notify_never": "jamais",
"setting_notifications_notify_seconds": "{} seconds",
"setting_notifications_single_progress_subtitle": "Informations détaillées sur la progression du transfert par élément",
"setting_notifications_single_progress_title": "Afficher la progression du détail de la sauvegarde en arrière-plan",
"setting_notifications_subtitle": "Ajustez vos préférences de notification",
"setting_notifications_title": "Notifications",
"setting_notifications_total_progress_subtitle": "Progrès global du transfert (effectué/total des éléments)",
"setting_notifications_total_progress_title": "Afficher la progression totale de la sauvegarde en arrière-plan",
"setting_pages_app_bar_settings": "Paramètres",
"settings_require_restart": "Veuillez redémarrer Immich pour appliquer ce paramètre",
"share_add": "Ajouter", "share_add": "Ajouter",
"share_add_photos": "Ajouter des photos", "share_add_photos": "Ajouter des photos",
"share_add_title": "Ajouter un titre", "share_add_title": "Ajouter un titre",
@@ -108,6 +175,16 @@
"tab_controller_nav_photos": "Photos", "tab_controller_nav_photos": "Photos",
"tab_controller_nav_search": "Recherche", "tab_controller_nav_search": "Recherche",
"tab_controller_nav_sharing": "Partage", "tab_controller_nav_sharing": "Partage",
"theme_setting_asset_list_storage_indicator_title": "Afficher l'indicateur de stockage sur les tuiles des éléments",
"theme_setting_asset_list_tiles_per_row_title": "Nombre d'éléments par ligne ({})",
"theme_setting_dark_mode_switch": "Mode sombre",
"theme_setting_image_viewer_quality_subtitle": "Ajustez la qualité de la visionneuse d'images détaillées",
"theme_setting_image_viewer_quality_title": "Qualité de la visualisation des images",
"theme_setting_system_theme_switch": "Automatique (suivre les paramètres du système)",
"theme_setting_theme_subtitle": "Choisissez le thème de l'application",
"theme_setting_theme_title": "Thème",
"theme_setting_three_stage_loading_subtitle": "Le chargement en trois étapes peut améliorer les performances de chargement, mais entraîne une augmentation significative de la charge du réseau.",
"theme_setting_three_stage_loading_title": "Activer le chargement en trois étapes",
"version_announcement_overlay_ack": "Confirmer", "version_announcement_overlay_ack": "Confirmer",
"version_announcement_overlay_release_notes": "notes de mise à jour", "version_announcement_overlay_release_notes": "notes de mise à jour",
"version_announcement_overlay_text_1": "Bonjour, une nouvelle version de", "version_announcement_overlay_text_1": "Bonjour, une nouvelle version de",

View File

@@ -5,10 +5,10 @@
"album_thumbnail_card_items": "{} elementi", "album_thumbnail_card_items": "{} elementi",
"album_thumbnail_card_shared": "Condiviso", "album_thumbnail_card_shared": "Condiviso",
"album_viewer_appbar_share_delete": "Elimina album ", "album_viewer_appbar_share_delete": "Elimina album ",
"album_viewer_appbar_share_err_delete": "Errore nel cancellare l'album ", "album_viewer_appbar_share_err_delete": "Impossibile cancellare l'album ",
"album_viewer_appbar_share_err_leave": "Errore nel lasciare l'album ", "album_viewer_appbar_share_err_leave": "Impossibile lasciare l'album ",
"album_viewer_appbar_share_err_remove": "Ci sono problemi nel rimuovere oggetti dall'album ", "album_viewer_appbar_share_err_remove": "Ci sono problemi nel rimuovere oggetti dall'album ",
"album_viewer_appbar_share_err_title": "Errore nel cambiare il titolo dell'album ", "album_viewer_appbar_share_err_title": "Impossibile cambiare il titolo dell'album ",
"album_viewer_appbar_share_leave": "Lascia album", "album_viewer_appbar_share_leave": "Lascia album",
"album_viewer_appbar_share_remove": "Rimuovere dall'album ", "album_viewer_appbar_share_remove": "Rimuovere dall'album ",
"album_viewer_page_share_add_users": "Aggiungi utenti", "album_viewer_page_share_add_users": "Aggiungi utenti",
@@ -21,22 +21,23 @@
"backup_album_selection_page_selection_info": "Informazioni sulla selezione ", "backup_album_selection_page_selection_info": "Informazioni sulla selezione ",
"backup_album_selection_page_total_assets": "Numero totale di oggetti unici", "backup_album_selection_page_total_assets": "Numero totale di oggetti unici",
"backup_all": "Tutti", "backup_all": "Tutti",
"backup_background_service_backup_failed_message": "Impossibile caricare contenuti. Nuovo tentativo…", "backup_background_service_backup_failed_message": "Impossibile caricare i contenuti. Riprovo…",
"backup_background_service_connection_failed_message": "Impossibile connettersi al server. Nuovo tentativo…", "backup_background_service_connection_failed_message": "Impossibile connettersi al server. Riprovo…",
"backup_background_service_current_upload_notification": "Caricamento {}", "backup_background_service_current_upload_notification": "Caricamento {}",
"backup_background_service_default_notification": "Verifica di nuovi contenuti…", "backup_background_service_default_notification": "Ricerca di nuovi contenuti…",
"backup_background_service_error_title": "Errore di Backup", "backup_background_service_error_title": "Errore di Backup",
"backup_background_service_in_progress_notification": "Backing dei tuoi contenuti…", "backup_background_service_in_progress_notification": "Backing dei tuoi contenuti…",
"backup_background_service_upload_failure_notification": "Impossibile caricare {}", "backup_background_service_upload_failure_notification": "Impossibile caricare {}",
"backup_controller_page_albums": "Backup Album", "backup_controller_page_albums": "Backup Album",
"backup_controller_page_background_battery_info_link": "Mostrami come", "backup_controller_page_background_battery_info_link": "Mostrami come",
"backup_controller_page_background_battery_info_message": "Per una migliore esperienza di backup, disabilita le ottimisazioni della batteria per l'app Immich.\n\nDal momento che è una funzionalità specifica del dispositivo, per favore consulta il manuale del produttore.", "backup_controller_page_background_battery_info_message": "Per una migliore esperienza di backup, disabilita le ottimizzazioni della batteria per l'app Immich.\n\nDal momento che è una funzionalità specifica del dispositivo, per favore consulta il manuale del produttore.",
"backup_controller_page_background_battery_info_ok": "OK", "backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_battery_info_title": "Ottimizzazioni batteria", "backup_controller_page_background_battery_info_title": "Ottimizzazioni batteria",
"backup_controller_page_background_charging": "Solo durante la ricarica", "backup_controller_page_background_charging": "Solo durante la ricarica",
"backup_controller_page_background_configure_error": "Impossibile configurare i servizi in background", "backup_controller_page_background_configure_error": "Impossibile configurare i servizi in background",
"backup_controller_page_background_description": "Abilita i servizi in background per sincronizzare tutti i nuovi contenuti senza la necessità di aprire l'app", "backup_controller_page_background_delay": "Ritarda il backup di nuovi elementi: {}",
"backup_controller_page_background_is_off": "Backup automatico spento", "backup_controller_page_background_description": "Abilita i servizi in background per fare il backup di tutti i nuovi contenuti senza la necessità di aprire l'app",
"backup_controller_page_background_is_off": "Backup automatico disattivato",
"backup_controller_page_background_is_on": "Backup automatico attivo", "backup_controller_page_background_is_on": "Backup automatico attivo",
"backup_controller_page_background_turn_off": "Disabilita servizi in background", "backup_controller_page_background_turn_off": "Disabilita servizi in background",
"backup_controller_page_background_turn_on": "Abilita servizi in background", "backup_controller_page_background_turn_on": "Abilita servizi in background",
@@ -66,12 +67,12 @@
"backup_controller_page_total_sub": "Tutte le foto e i video unici caricati dagli album selezionati ", "backup_controller_page_total_sub": "Tutte le foto e i video unici caricati dagli album selezionati ",
"backup_controller_page_turn_off": "Disattiva backup", "backup_controller_page_turn_off": "Disattiva backup",
"backup_controller_page_turn_on": "Attiva backup ", "backup_controller_page_turn_on": "Attiva backup ",
"backup_controller_page_uploading_file_info": "Info sul file caricato", "backup_controller_page_uploading_file_info": "Caricando informazioni sul file",
"backup_err_only_album": "Non è possibile rimuovere l'unico album", "backup_err_only_album": "Non è possibile rimuovere l'unico album",
"backup_info_card_assets": "oggetti ", "backup_info_card_assets": "oggetti ",
"cache_settings_album_thumbnails": "Anteprime pagine librerie ({} assets)", "cache_settings_album_thumbnails": "Anteprime pagine librerie ({} assets)",
"cache_settings_clear_cache_button": "Cancella cache", "cache_settings_clear_cache_button": "Cancella cache",
"cache_settings_clear_cache_button_title": "Cancella cache app. Questo impatterà sulle prestazioni applicative fino a quando la cache non sarà rigenerata.", "cache_settings_clear_cache_button_title": "Cancella la cache dell'app. Questo impatterà significativamente le prestazioni dell''app fino a quando la cache non sarà rigenerata.",
"cache_settings_image_cache_size": "Dimensione cache foto ({} assets)", "cache_settings_image_cache_size": "Dimensione cache foto ({} assets)",
"cache_settings_statistics_album": "Anteprime librerie", "cache_settings_statistics_album": "Anteprime librerie",
"cache_settings_statistics_assets": "{} contenuti ({})", "cache_settings_statistics_assets": "{} contenuti ({})",
@@ -79,9 +80,13 @@
"cache_settings_statistics_shared": "Anteprime album condivisi", "cache_settings_statistics_shared": "Anteprime album condivisi",
"cache_settings_statistics_thumbnail": "Anteprime", "cache_settings_statistics_thumbnail": "Anteprime",
"cache_settings_statistics_title": "Uso della cache", "cache_settings_statistics_title": "Uso della cache",
"cache_settings_subtitle": "Controlla il comportamento della cache", "cache_settings_subtitle": "Controlla il comportamento della cache dell'applicazione mobile immich",
"cache_settings_thumbnail_size": "Dimensione cache anteprime ({} assets)", "cache_settings_thumbnail_size": "Dimensione cache anteprime ({} assets)",
"cache_settings_title": "Impostazioni della Cache", "cache_settings_title": "Impostazioni della Cache",
"control_bottom_app_bar_add_to_album": "Aggiungi all'album",
"control_bottom_app_bar_album_info": "{} elementi",
"control_bottom_app_bar_album_info_shared": "{} elementi · Condivisi",
"control_bottom_app_bar_create_new_album": "Crea nuovo album",
"control_bottom_app_bar_delete": "Elimina", "control_bottom_app_bar_delete": "Elimina",
"control_bottom_app_bar_share": "Condividi", "control_bottom_app_bar_share": "Condividi",
"create_album_page_untitled": "Senza titolo", "create_album_page_untitled": "Senza titolo",
@@ -99,22 +104,31 @@
"exif_bottom_sheet_description": "Aggiungi una descrizione...", "exif_bottom_sheet_description": "Aggiungi una descrizione...",
"exif_bottom_sheet_details": "DETTAGLI", "exif_bottom_sheet_details": "DETTAGLI",
"exif_bottom_sheet_location": "POSIZIONE", "exif_bottom_sheet_location": "POSIZIONE",
"experimental_settings_new_asset_list_subtitle": "Work in progress",
"experimental_settings_new_asset_list_title": "Attiva griglia di foto sperimentale",
"experimental_settings_subtitle": "Usalo a tuo rischio!",
"experimental_settings_title": "Sperimentale",
"home_page_add_to_album_conflicts": "Aggiunti {added} elementi all'album {album}. {failed} elementi erano già presenti nell'album.",
"home_page_add_to_album_success": "Aggiunti {added} elementi all'album {album}",
"library_page_albums": "Album", "library_page_albums": "Album",
"library_page_new_album": "Nuovo Album", "library_page_new_album": "Nuovo Album",
"login_form_button_text": "Login", "login_form_button_text": "Login",
"login_form_email_hint": "tuaemail@email.com", "login_form_email_hint": "tuaemail@email.com",
"login_form_endpoint_hint": "http://tuo-ip-del-server:port/api", "login_form_endpoint_hint": "http://ip-del-tuo-server:port/api",
"login_form_endpoint_url": "Server Endpoint URL", "login_form_endpoint_url": "Server Endpoint URL",
"login_form_err_http": "Per favore specificare http:// o https://", "login_form_err_http": "Per favore specificare http:// o https://",
"login_form_err_invalid_email": "Email non valida", "login_form_err_invalid_email": "Email non valida",
"login_form_err_leading_whitespace": "Spazio bianco all'inizio ", "login_form_err_leading_whitespace": "Whitespace all'inizio ",
"login_form_err_trailing_whitespace": "Spazio bianco alla fine", "login_form_err_trailing_whitespace": "Whitespace alla fine",
"login_form_failed_get_oauth_server_config": "Errore di login usando OAuth, controlla l'URL del server",
"login_form_failed_get_oauth_server_disable": "OAuth non è disponibile su questo server",
"login_form_failed_login": "Errore nel login, controlla URL del server e le credenziali (email e password)", "login_form_failed_login": "Errore nel login, controlla URL del server e le credenziali (email e password)",
"login_form_label_email": "Email", "login_form_label_email": "Email",
"login_form_label_password": "Password", "login_form_label_password": "Password",
"login_form_password_hint": "password ", "login_form_password_hint": "password ",
"login_form_save_login": "Rimani connesso ", "login_form_save_login": "Rimani connesso ",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_server_up_to_date": "Client e server sono aggiornati", "profile_drawer_client_server_up_to_date": "Client e server sono aggiornati",
"profile_drawer_settings": "Impostazioni ", "profile_drawer_settings": "Impostazioni ",
"profile_drawer_sign_out": "Logout", "profile_drawer_sign_out": "Logout",
@@ -125,24 +139,35 @@
"search_page_things": "Oggetti", "search_page_things": "Oggetti",
"search_result_page_new_search_hint": "Nuova ricerca ", "search_result_page_new_search_hint": "Nuova ricerca ",
"select_additional_user_for_sharing_page_suggestions": "Suggerimenti ", "select_additional_user_for_sharing_page_suggestions": "Suggerimenti ",
"select_user_for_sharing_page_err_album": "Errore nel creare l'album ", "select_user_for_sharing_page_err_album": "Impossibile nel creare l'album ",
"select_user_for_sharing_page_share_suggestions": "Suggerimenti", "select_user_for_sharing_page_share_suggestions": "Suggerimenti",
"setting_image_viewer_help": "Il visualizzatore dettagliato carica una piccola thumbnail per prima, per poi caricare un immagine di media grandezza (se abilitato). Ed infine carica l'originale (se abilitato).",
"setting_image_viewer_original_subtitle": "Abilita per caricare l'immagine originale a risoluzione massima (grande!). Disabilita per ridurre l'utilizzo di banda (sia sul network che nella cache del dispositivo).",
"setting_image_viewer_original_title": "Carica l'immagine originale",
"setting_image_viewer_preview_subtitle": "Abilita per caricare un'immagine a risoluzione media.\nDisabilita per caricare direttamente l'immagine originale o usare la thumbnail.",
"setting_image_viewer_preview_title": "Carica immagine di preview",
"setting_notifications_notify_failures_grace_period": "Notifica caricamenti falliti in background: {}", "setting_notifications_notify_failures_grace_period": "Notifica caricamenti falliti in background: {}",
"setting_notifications_notify_hours": "{} Ore", "setting_notifications_notify_hours": "{} ore",
"setting_notifications_notify_immediately": "Immediatamente", "setting_notifications_notify_immediately": "immediatamente",
"setting_notifications_notify_minutes": "{} Minuti", "setting_notifications_notify_minutes": "{} minuti",
"setting_notifications_notify_never": "Mai", "setting_notifications_notify_never": "mai",
"setting_notifications_notify_seconds": "{} secondi",
"setting_notifications_single_progress_subtitle": "Informazioni dettagliate sul caricamento dell'immagine",
"setting_notifications_single_progress_title": "Mostra dettagli del processo di backup in background",
"setting_notifications_subtitle": "Cambia le impostazioni di notifica", "setting_notifications_subtitle": "Cambia le impostazioni di notifica",
"setting_notifications_title": "Notifiche", "setting_notifications_title": "Notifiche",
"setting_notifications_total_progress_subtitle": "Progresso di caricamento generale (eseguiti/totale)",
"setting_notifications_total_progress_title": "Mostra il progresso di backup totale in background",
"setting_pages_app_bar_settings": "Impostazioni", "setting_pages_app_bar_settings": "Impostazioni",
"settings_require_restart": "Si prega di riavviare Immich perché vengano applicate le impostazioni",
"share_add": "Aggiungi", "share_add": "Aggiungi",
"share_add_photos": "Aggiungi foto", "share_add_photos": "Aggiungi foto",
"share_add_title": "Aggiungi un titolo ", "share_add_title": "Aggiungi un titolo ",
"share_create_album": "Crea album", "share_create_album": "Crea album",
"share_dialog_preparing": "Preparo…", "share_dialog_preparing": "Preparo…",
"share_invite": "Invitare nell'album ", "share_invite": "Invita nell'album ",
"sharing_page_album": "Album condivisi", "sharing_page_album": "Album condivisi",
"sharing_page_description": "Crea un album condiviso per condividere foto e video con persone nel tuo network", "sharing_page_description": "Crea un album condiviso per condividere foto e video con persone sul tuo network",
"sharing_page_empty_list": "LISTA VUOTA", "sharing_page_empty_list": "LISTA VUOTA",
"sharing_silver_appbar_create_shared_album": "Crea album condiviso", "sharing_silver_appbar_create_shared_album": "Crea album condiviso",
"sharing_silver_appbar_share_partner": "Condividi con il partner", "sharing_silver_appbar_share_partner": "Condividi con il partner",
@@ -155,15 +180,15 @@
"theme_setting_dark_mode_switch": "Dark mode", "theme_setting_dark_mode_switch": "Dark mode",
"theme_setting_image_viewer_quality_subtitle": "Cambia la qualità del dettaglio dell'immagine", "theme_setting_image_viewer_quality_subtitle": "Cambia la qualità del dettaglio dell'immagine",
"theme_setting_image_viewer_quality_title": "Qualità immagine", "theme_setting_image_viewer_quality_title": "Qualità immagine",
"theme_setting_system_theme_switch": "Automatico (Vai alle impostazioni di sistema)", "theme_setting_system_theme_switch": "Automatico (Segue le impostazioni di sistema)",
"theme_setting_theme_subtitle": "Scegli un'impostazione per il tema", "theme_setting_theme_subtitle": "Scegli un'impostazione per il tema dell'app",
"theme_setting_theme_title": "Tema", "theme_setting_theme_title": "Tema",
"theme_setting_three_stage_loading_subtitle": "Il caricamento in 3 stage aumenterà le performance di caricamento ma anche il consumo di banda", "theme_setting_three_stage_loading_subtitle": "Il caricamento a tre stage aumenterà le performance di caricamento ma anche il consumo di banda",
"theme_setting_three_stage_loading_title": "Abilita il caricamento a tre stage", "theme_setting_three_stage_loading_title": "Abilita il caricamento a tre stage",
"version_announcement_overlay_ack": "Riconosci ", "version_announcement_overlay_ack": "Presa visione",
"version_announcement_overlay_release_notes": "note di rilascio ", "version_announcement_overlay_release_notes": "note di rilascio ",
"version_announcement_overlay_text_1": "Ciao amico, c'è una nuova versione di", "version_announcement_overlay_text_1": "Ciao, c'è una nuova versione di",
"version_announcement_overlay_text_2": "per favore prenditi il tuo tempo per controllare il", "version_announcement_overlay_text_2": "per favore prenditi il tuo tempo per visitare il",
"version_announcement_overlay_text_3": "e verifica che il tuo docker-compose e il file .env siano aggiornati per impedire qualsiasi errore nella configurazione, specialmente se utilizzate WatchTower o altri strumenti per l'aggiornamento automatico delle immagini docker.", "version_announcement_overlay_text_3": "e verifica che il tuo docker-compose e il file .env siano aggiornati per impedire qualsiasi errore di configurazione, specialmente se utilizzate WatchTower o altri strumenti per l'aggiornamento automatico dell'applicativo",
"version_announcement_overlay_title": "Nuova versione del server disponibile! \uD83C\uDF89" "version_announcement_overlay_title": "Nuova versione del server disponibile \uD83C\uDF89"
} }

View File

@@ -1,6 +1,9 @@
{ {
"album_info_card_backup_album_excluded": "除外", "album_info_card_backup_album_excluded": "除外",
"album_info_card_backup_album_included": "選択", "album_info_card_backup_album_included": "選択",
"album_thumbnail_card_item": "項目数: 1",
"album_thumbnail_card_items": "項目数: {}",
"album_thumbnail_card_shared": "共有済み",
"album_viewer_appbar_share_delete": "アルバムを削除", "album_viewer_appbar_share_delete": "アルバムを削除",
"album_viewer_appbar_share_err_delete": "削除に失敗...", "album_viewer_appbar_share_err_delete": "削除に失敗...",
"album_viewer_appbar_share_err_leave": "退会に失敗...", "album_viewer_appbar_share_err_leave": "退会に失敗...",
@@ -9,17 +12,39 @@
"album_viewer_appbar_share_leave": "アルバムから退会", "album_viewer_appbar_share_leave": "アルバムから退会",
"album_viewer_appbar_share_remove": "アルバムから除外", "album_viewer_appbar_share_remove": "アルバムから除外",
"album_viewer_page_share_add_users": "ユーザーを追加", "album_viewer_page_share_add_users": "ユーザーを追加",
"asset_list_settings_subtitle": "グリッドに関する設定",
"asset_list_settings_title": "グリッド",
"backup_album_selection_page_albums_device": "端末上のアルバム数は {} だよ", "backup_album_selection_page_albums_device": "端末上のアルバム数は {} だよ",
"backup_album_selection_page_albums_tap": "タップで選択、ダブルタップで除外だよ", "backup_album_selection_page_albums_tap": "タップで選択、ダブルタップで除外だよ",
"backup_album_selection_page_assets_scatter": "写真がいろんなアルバムに登録されてる事があるから、アルバムを含めたり除外したりしてどの写真を保存するか選択できるよ。", "backup_album_selection_page_assets_scatter": "同じ写真がいろんなアルバムに登録されてる事があるから、アルバムを含めたり除外したりしてどの写真を保存するか選択できるよ。",
"backup_album_selection_page_select_albums": "アルバムを選択", "backup_album_selection_page_select_albums": "アルバムを選択",
"backup_album_selection_page_selection_info": "選択、又は除外されてるアルバム", "backup_album_selection_page_selection_info": "選択、又は除外されてるアルバム",
"backup_album_selection_page_total_assets": "選択されたアルバムの写真と動画の数", "backup_album_selection_page_total_assets": "選択されたアルバムの写真と動画の数",
"backup_all": "全て", "backup_all": "全て",
"backup_background_service_backup_failed_message": "アップロードに失敗しました。リトライ中",
"backup_background_service_connection_failed_message": "サーバーに接続できません。リトライ中",
"backup_background_service_current_upload_notification": " {} をアップロード中",
"backup_background_service_default_notification": "新しい写真をチェックしています",
"backup_background_service_error_title": "バックアップエラー",
"backup_background_service_in_progress_notification": "バックアップ中",
"backup_background_service_upload_failure_notification": "{} のアップロードに失敗",
"backup_controller_page_albums": "アルバム", "backup_controller_page_albums": "アルバム",
"backup_controller_page_backup": "バックアップ", "backup_controller_page_background_battery_info_link": "方法を見る",
"backup_controller_page_backup_selected": "選択されてる:", "backup_controller_page_background_battery_info_message": "バックグラウンドバックアップが正常に動作するためにImmichに適用されてるバッテリーの最適化と自動調整をオフにしてね。\n\n端末によって方法が変わるから各々調べてね",
"backup_controller_page_backup_sub": "バックアップされた写真と動画の数だよ", "backup_controller_page_background_battery_info_ok": "了解",
"backup_controller_page_background_battery_info_title": "バッテリーの最適化",
"backup_controller_page_background_charging": "充電中のみに行う",
"backup_controller_page_background_configure_error": "バックグラウンドサービスの構築に失敗しました",
"backup_controller_page_background_delay": "Delay new assets backup: {}",
"backup_controller_page_background_description": "バックグラウンドバックアップをオンにしてアプリを開かなくても自動で画像をアップロードするようにします",
"backup_controller_page_background_is_off": "自動バックグラウンドバックアップはオフになってます",
"backup_controller_page_background_is_on": "自動バックグラウンドバックアップはオンになってます",
"backup_controller_page_background_turn_off": "バックグラウンドサービスをオフにする",
"backup_controller_page_background_turn_on": "バックグラウンドサービスをオンにする",
"backup_controller_page_background_wifi": "WiFi接続中のみに行う",
"backup_controller_page_backup": "バックアップ済み",
"backup_controller_page_backup_selected": "選択済み:",
"backup_controller_page_backup_sub": "バックアップされた写真と動画の数",
"backup_controller_page_cancel": "キャンセルするよ", "backup_controller_page_cancel": "キャンセルするよ",
"backup_controller_page_created": "{} に作成されたよ", "backup_controller_page_created": "{} に作成されたよ",
"backup_controller_page_desc_backup": "ONにすれば自動的に新しい写真などがバックアップされるようになるよ", "backup_controller_page_desc_backup": "ONにすれば自動的に新しい写真などがバックアップされるようになるよ",
@@ -29,29 +54,49 @@
"backup_controller_page_id": "ID: {}", "backup_controller_page_id": "ID: {}",
"backup_controller_page_info": "バックアップ情報", "backup_controller_page_info": "バックアップ情報",
"backup_controller_page_none_selected": "何も選んでないよ", "backup_controller_page_none_selected": "何も選んでないよ",
"backup_controller_page_remainder": "リマインダー", "backup_controller_page_remainder": "残り",
"backup_controller_page_remainder_sub": "残りの写真と動画の数だよ", "backup_controller_page_remainder_sub": "残りの写真と動画の数",
"backup_controller_page_select": "選択", "backup_controller_page_select": "選択",
"backup_controller_page_server_storage": "サーバーの容量", "backup_controller_page_server_storage": "サーバーの容量",
"backup_controller_page_start_backup": "バックアップを開始するよ", "backup_controller_page_start_backup": "バックアップを開始",
"backup_controller_page_status_off": "バックアップがOFFになってるよ", "backup_controller_page_status_off": "バックアップがOFFよ",
"backup_controller_page_status_on": "バックアップがONになってるよ", "backup_controller_page_status_on": "バックアップがONよ",
"backup_controller_page_storage_format": "{}中、 {}を使用中だよ", "backup_controller_page_storage_format": "使用済み: {}/{}",
"backup_controller_page_to_backup": "バックアップされるアルバム", "backup_controller_page_to_backup": "バックアップされるアルバム",
"backup_controller_page_total": "トータル", "backup_controller_page_total": "トータル",
"backup_controller_page_total_sub": "選択されたアルバムの写真と動画の数だよ", "backup_controller_page_total_sub": "選択されたアルバムの写真と動画の数",
"backup_controller_page_turn_off": "バックアップOFF", "backup_controller_page_turn_off": "バックアップOFF",
"backup_controller_page_turn_on": "バックアップON", "backup_controller_page_turn_on": "バックアップON",
"backup_controller_page_uploading_file_info": "アップロードされてるファイルに関する情報", "backup_controller_page_uploading_file_info": "アップロードされてるファイルに関する情報",
"backup_err_only_album": "唯一のアルバムを除する事はできないよ", "backup_err_only_album": "唯一のアルバムを除する事はできないよ",
"backup_info_card_assets": "写真と動画", "backup_info_card_assets": "写真と動画",
"cache_settings_album_thumbnails": "ライブラリのサムネイル ({}枚)",
"cache_settings_clear_cache_button": "キャッシュをクリア",
"cache_settings_clear_cache_button_title": "キャッシュを削除するけど、キャッシュを作り直すまでアプリのパフォーマンスが著しく低下するよ",
"cache_settings_image_cache_size": "キャッシュのサイズ ({}枚) ",
"cache_settings_statistics_album": "ライブラリのサムネイル",
"cache_settings_statistics_assets": "{} 枚 ({}枚中)",
"cache_settings_statistics_full": "フル画像",
"cache_settings_statistics_shared": "共有アルバムのサムネイル",
"cache_settings_statistics_thumbnail": "サムネイル",
"cache_settings_statistics_title": "キャッシュ",
"cache_settings_subtitle": "キャッシュの動作を変更できるよ",
"cache_settings_thumbnail_size": "サムネイルのキャッシュのサイズ ({}枚)",
"cache_settings_title": "キャッシュの設定",
"control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} items",
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
"control_bottom_app_bar_create_new_album": "Create new album",
"control_bottom_app_bar_delete": "削除", "control_bottom_app_bar_delete": "削除",
"control_bottom_app_bar_share": "共有",
"create_album_page_untitled": "タイトル無し",
"create_shared_album_page_create": "作成",
"create_shared_album_page_share": "共有", "create_shared_album_page_share": "共有",
"create_shared_album_page_share_add_assets": "写真や動画を追加", "create_shared_album_page_share_add_assets": "写真を追加",
"create_shared_album_page_share_select_photos": "写真を選択", "create_shared_album_page_share_select_photos": "写真を選択",
"daily_title_text_date": "E, MM月 dd日", "daily_title_text_date": "MM月 DD日, EE",
"daily_title_text_date_year": "E, yyyy年 MM月 dd日", "daily_title_text_date_year": "yyyy年 MM月 DD日, EE",
"date_format": "E, MM月 dd日 • hh時mm分", "date_format": "MM月 DD日, EE • hh時mm分",
"delete_dialog_alert": "サーバーからも端末からも永久的に削除されるけど良いの?", "delete_dialog_alert": "サーバーからも端末からも永久的に削除されるけど良いの?",
"delete_dialog_cancel": "キャンセル", "delete_dialog_cancel": "キャンセル",
"delete_dialog_ok": "削除", "delete_dialog_ok": "削除",
@@ -59,6 +104,14 @@
"exif_bottom_sheet_description": "概要を追加", "exif_bottom_sheet_description": "概要を追加",
"exif_bottom_sheet_details": "詳細な情報", "exif_bottom_sheet_details": "詳細な情報",
"exif_bottom_sheet_location": "撮影地", "exif_bottom_sheet_location": "撮影地",
"experimental_settings_new_asset_list_subtitle": "進行中",
"experimental_settings_new_asset_list_title": "試験的なグリッドを有効",
"experimental_settings_subtitle": "試験的だから自己責任でね",
"experimental_settings_title": "試験的",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
"library_page_albums": "アルバム",
"library_page_new_album": "新しいアルバム",
"login_form_button_text": "ログイン", "login_form_button_text": "ログイン",
"login_form_email_hint": "example@email.com", "login_form_email_hint": "example@email.com",
"login_form_endpoint_hint": "https://example.com:port/api", "login_form_endpoint_hint": "https://example.com:port/api",
@@ -67,36 +120,71 @@
"login_form_err_invalid_email": "メールアドレスが有効じゃないよ", "login_form_err_invalid_email": "メールアドレスが有効じゃないよ",
"login_form_err_leading_whitespace": "最初に半角スペースが含まれてるよ", "login_form_err_leading_whitespace": "最初に半角スペースが含まれてるよ",
"login_form_err_trailing_whitespace": "最後に半角スペースが含まれてるよ", "login_form_err_trailing_whitespace": "最後に半角スペースが含まれてるよ",
"login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL",
"login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server",
"login_form_failed_login": "ログインエラー。サーバーのURL、メールアドレスとパスワードを再確認してね", "login_form_failed_login": "ログインエラー。サーバーのURL、メールアドレスとパスワードを再確認してね",
"login_form_label_email": "メールアドレス", "login_form_label_email": "メールアドレス",
"login_form_label_password": "パスワード", "login_form_label_password": "パスワード",
"login_form_password_hint": "パスワード", "login_form_password_hint": "パスワード",
"login_form_save_login": "ログインしたままにする", "login_form_save_login": "ログインしたままにする",
"monthly_title_text_date_format": "yyyy年 MM月", "monthly_title_text_date_format": "yyyy年 MM月",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_server_up_to_date": "サーバーとクライアント、両方最新バージョンだよ", "profile_drawer_client_server_up_to_date": "サーバーとクライアント、両方最新バージョンだよ",
"profile_drawer_settings": "設定",
"profile_drawer_sign_out": "サインアウト", "profile_drawer_sign_out": "サインアウト",
"search_bar_hint": "写真を検索", "search_bar_hint": "写真を検索",
"search_page_no_objects": "被写体に関するデータがないよ", "search_page_no_objects": "被写体に関するデータがな",
"search_page_no_places": "場所に関するデータがないよ", "search_page_no_places": "場所に関するデータがな",
"search_page_places": "撮影地", "search_page_places": "撮影地",
"search_page_things": "カテゴリ", "search_page_things": "カテゴリ",
"search_result_page_new_search_hint": "検索", "search_result_page_new_search_hint": "検索",
"select_additional_user_for_sharing_page_suggestions": "ユーザーリスト", "select_additional_user_for_sharing_page_suggestions": "ユーザーリスト",
"select_user_for_sharing_page_err_album": "アルバム作成に失敗...", "select_user_for_sharing_page_err_album": "アルバム作成に失敗...",
"select_user_for_sharing_page_share_suggestions": "ユーザーの一覧だよ", "select_user_for_sharing_page_share_suggestions": "ユーザーの一覧",
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).",
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).",
"setting_image_viewer_original_title": "Load original image",
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.",
"setting_image_viewer_preview_title": "Load preview image",
"setting_notifications_notify_failures_grace_period": "バックアップ失敗の通知: {}",
"setting_notifications_notify_hours": "{}時間後",
"setting_notifications_notify_immediately": "すぐに行う",
"setting_notifications_notify_minutes": "{}分後",
"setting_notifications_notify_never": "行わない",
"setting_notifications_notify_seconds": "{} seconds",
"setting_notifications_single_progress_subtitle": "アップロード中の写真の詳細",
"setting_notifications_single_progress_title": "バックグランドバックアップの詳細を表示",
"setting_notifications_subtitle": "通知設定を変更する",
"setting_notifications_title": "通知",
"setting_notifications_total_progress_subtitle": "アップロードの進行状況 (完了済み/全体) ",
"setting_notifications_total_progress_title": "バックグラウンドバックアップの進行状況を表示",
"setting_pages_app_bar_settings": "設定",
"settings_require_restart": "設定の適用にImmichの再起動が必要だよ",
"share_add": "追加", "share_add": "追加",
"share_add_photos": "写真を追加", "share_add_photos": "写真を追加",
"share_add_title": "タイトルを追加", "share_add_title": "タイトルを追加",
"share_create_album": "アルバムを作成", "share_create_album": "アルバムを作成",
"share_dialog_preparing": "準備中...ちょっと待ってね",
"share_invite": "アルバムに参加", "share_invite": "アルバムに参加",
"sharing_page_album": "共有アルバム", "sharing_page_album": "共有アルバム",
"sharing_page_description": "共有アルバムを作成して同じネットワークにいる仲間に写真を共有してみよう!", "sharing_page_description": "共有アルバムを作成して同じネットワークにいる人たちに写真を共有してみよう!",
"sharing_page_empty_list": "誰も居ないね ( T_T)(^-^ ) ドンマイ", "sharing_page_empty_list": "共有アルバムが無いよ",
"sharing_silver_appbar_create_shared_album": "共有アルバムを作成", "sharing_silver_appbar_create_shared_album": "共有アルバムを作成",
"sharing_silver_appbar_share_partner": "パートナーと共有", "sharing_silver_appbar_share_partner": "パートナーと共有",
"tab_controller_nav_library": "ライブラリ",
"tab_controller_nav_photos": "写真", "tab_controller_nav_photos": "写真",
"tab_controller_nav_search": "検索", "tab_controller_nav_search": "検索",
"tab_controller_nav_sharing": "共有", "tab_controller_nav_sharing": "共有",
"theme_setting_asset_list_storage_indicator_title": "ストレージに関する情報を表示",
"theme_setting_asset_list_tiles_per_row_title": "一列のの写真の数: {} ",
"theme_setting_dark_mode_switch": "ダークモード",
"theme_setting_image_viewer_quality_subtitle": "画像ビューワの画質の設定",
"theme_setting_image_viewer_quality_title": "画像ビューワ",
"theme_setting_system_theme_switch": "自動 (端末の設定を反映) ",
"theme_setting_theme_subtitle": "アプリの見た目の設定",
"theme_setting_theme_title": "テーマ",
"theme_setting_three_stage_loading_subtitle": "三段階読み込みを有効にするとパフォーマンスが改善する可能性があるけど、データ使用量が凄く増えるよ",
"theme_setting_three_stage_loading_title": "三段階読み込みをオンにする",
"version_announcement_overlay_ack": "了解", "version_announcement_overlay_ack": "了解",
"version_announcement_overlay_release_notes": "更新情報", "version_announcement_overlay_release_notes": "更新情報",
"version_announcement_overlay_text_1": "こんにちは、又はこんばんは!新しい", "version_announcement_overlay_text_1": "こんにちは、又はこんばんは!新しい",

View File

@@ -1,6 +1,9 @@
{ {
"album_info_card_backup_album_excluded": "제외됨", "album_info_card_backup_album_excluded": "제외됨",
"album_info_card_backup_album_included": "포함됨", "album_info_card_backup_album_included": "포함됨",
"album_thumbnail_card_item": "1개 항목",
"album_thumbnail_card_items": "{}개 항목",
"album_thumbnail_card_shared": " · 공유",
"album_viewer_appbar_share_delete": "앨범 삭제", "album_viewer_appbar_share_delete": "앨범 삭제",
"album_viewer_appbar_share_err_delete": "앨범 삭제 실패", "album_viewer_appbar_share_err_delete": "앨범 삭제 실패",
"album_viewer_appbar_share_err_leave": "앨범에서 나가지 못했습니다", "album_viewer_appbar_share_err_leave": "앨범에서 나가지 못했습니다",
@@ -9,6 +12,8 @@
"album_viewer_appbar_share_leave": "앨범 나가기", "album_viewer_appbar_share_leave": "앨범 나가기",
"album_viewer_appbar_share_remove": "앨범에서 제거", "album_viewer_appbar_share_remove": "앨범에서 제거",
"album_viewer_page_share_add_users": "사용자 추가", "album_viewer_page_share_add_users": "사용자 추가",
"asset_list_settings_subtitle": "사진 배열 레이아웃 설정",
"asset_list_settings_title": "사진 배열",
"backup_album_selection_page_albums_device": "기기의 앨범({})", "backup_album_selection_page_albums_device": "기기의 앨범({})",
"backup_album_selection_page_albums_tap": "포함하려면 탭하고 제외하려면 두 번 탭하세요", "backup_album_selection_page_albums_tap": "포함하려면 탭하고 제외하려면 두 번 탭하세요",
"backup_album_selection_page_assets_scatter": "미디어파일은 여러 앨범에 분산될 수 있습니다. 따라서 백업 프로세스 중에 앨범에서 포함하거나 제외할 수 있습니다.", "backup_album_selection_page_assets_scatter": "미디어파일은 여러 앨범에 분산될 수 있습니다. 따라서 백업 프로세스 중에 앨범에서 포함하거나 제외할 수 있습니다.",
@@ -16,25 +21,29 @@
"backup_album_selection_page_selection_info": "선택 정보", "backup_album_selection_page_selection_info": "선택 정보",
"backup_album_selection_page_total_assets": "총 미디어파일 수", "backup_album_selection_page_total_assets": "총 미디어파일 수",
"backup_all": "모두", "backup_all": "모두",
"backup_background_service_default_notification": "새 미디어파일 확인중...",
"backup_background_service_upload_failure_notification": "{} 업로드 실패",
"backup_background_service_in_progress_notification": "미디어파일 백업 중...",
"backup_background_service_current_upload_notification": "{} 업로드 중",
"backup_background_service_error_title": "백업 오류",
"backup_background_service_connection_failed_message": "서버에 연결하지 못했습니다. 다시 시도하는 중...",
"backup_background_service_backup_failed_message": "미디어파일을 백업하지 못했습니다. 다시 시도하는 중...", "backup_background_service_backup_failed_message": "미디어파일을 백업하지 못했습니다. 다시 시도하는 중...",
"backup_background_service_connection_failed_message": "서버에 연결하지 못했습니다. 다시 시도하는 중...",
"backup_background_service_current_upload_notification": "{} 업로드 중",
"backup_background_service_default_notification": "새 미디어파일 확인중...",
"backup_background_service_error_title": "백업 오류",
"backup_background_service_in_progress_notification": "미디어파일 백업 중...",
"backup_background_service_upload_failure_notification": "{} 업로드 실패",
"backup_controller_page_albums": "백업대상", "backup_controller_page_albums": "백업대상",
"backup_controller_page_background_battery_info_link": "사용 가이드",
"backup_controller_page_background_battery_info_message": "최상의 백업 환경을 위해 Immich 앱의 백그라운드 활동을 제한하는 배터리 최적화기능을 꺼주세요.\n\n휴대폰마다 설정방법이 다르므로 제조업체별로 설정방법을 확인하세요.",
"backup_controller_page_background_battery_info_ok": "확인",
"backup_controller_page_background_battery_info_title": "배터리 최적화",
"backup_controller_page_background_charging": "충전 중일 때만",
"backup_controller_page_background_configure_error": "백그라운드 서비스를 구성하지 못했습니다",
"backup_controller_page_background_description": "백그라운드 서비스를 켜서 앱을 열지 않고도 새 미디어파일을 자동으로 백업합니다.",
"backup_controller_page_background_is_off": "자동 백그라운드 백업이 꺼져 있습니다",
"backup_controller_page_background_is_on": "자동 백그라운드 백업이 켜져 있습니다",
"backup_controller_page_background_turn_off": "백그라운드 서비스 끄기",
"backup_controller_page_background_turn_on": "백그라운드 서비스 켜기",
"backup_controller_page_background_wifi": "WiFi에서만",
"backup_controller_page_backup": "백업", "backup_controller_page_backup": "백업",
"backup_controller_page_backup_selected": "선택됨: ", "backup_controller_page_backup_selected": "선택됨: ",
"backup_controller_page_backup_sub": "백업된 사진 및 비디오", "backup_controller_page_backup_sub": "백업된 사진 및 비디오",
"backup_controller_page_background_description": "백그라운드 서비스를 켜서 앱을 열지 않고도 새 미디어파일을 자동으로 백업합니다.",
"backup_controller_page_background_wifi": "WiFi에서만",
"backup_controller_page_background_charging": "충전 중일 때만",
"backup_controller_page_background_is_on": "자동 백그라운드 백업이 켜져 있습니다",
"backup_controller_page_background_is_off": "자동 백그라운드 백업이 꺼져 있습니다",
"backup_controller_page_background_turn_on": "백그라운드 서비스 켜기",
"backup_controller_page_background_turn_off": "백그라운드 서비스 끄기",
"backup_controller_page_background_configure_error": "백그라운드 서비스를 구성하지 못했습니다",
"backup_controller_page_cancel": "취소", "backup_controller_page_cancel": "취소",
"backup_controller_page_created": "생성일: {}", "backup_controller_page_created": "생성일: {}",
"backup_controller_page_desc_backup": "새 미디어파일을 서버에 자동으로 업로드하려면 백업을 켜주세요.", "backup_controller_page_desc_backup": "새 미디어파일을 서버에 자동으로 업로드하려면 백업을 켜주세요.",
@@ -60,9 +69,28 @@
"backup_controller_page_uploading_file_info": "파일 정보 업로드 중", "backup_controller_page_uploading_file_info": "파일 정보 업로드 중",
"backup_err_only_album": "유일한 앨범은 제거할 수 없습니다", "backup_err_only_album": "유일한 앨범은 제거할 수 없습니다",
"backup_info_card_assets": "미디어", "backup_info_card_assets": "미디어",
"cache_settings_album_thumbnails": "라이브러리 페이지 썸네일 ({} 미디어)",
"cache_settings_clear_cache_button": "캐시 지우기",
"cache_settings_clear_cache_button_title": "앱의 캐시를 지웁니다. 이 작업은 캐시가 다시 빌드될 때까지 앱의 성능에 상당한 영향을 미칩니다.",
"cache_settings_image_cache_size": "이미재 캐시 크기 ({} 미디어)",
"cache_settings_statistics_album": "라이브러리 썸네일",
"cache_settings_statistics_assets": "{} 미디어 ({})",
"cache_settings_statistics_full": "전체 이미지",
"cache_settings_statistics_shared": "공유 앨범 썸네일",
"cache_settings_statistics_thumbnail": "썸네일",
"cache_settings_statistics_title": "캐시 사용률",
"cache_settings_subtitle": "Immich 앱의 캐싱 동작 제어",
"cache_settings_thumbnail_size": "썸네일 캐시 크기 ({} 미디어)",
"cache_settings_title": "캐시 설정",
"control_bottom_app_bar_add_to_album": "앨범에 추가",
"control_bottom_app_bar_album_info": "{} 항목",
"control_bottom_app_bar_album_info_shared": "{} 항목 · 공유됨",
"control_bottom_app_bar_create_new_album": "앨범 생성",
"control_bottom_app_bar_delete": "삭제", "control_bottom_app_bar_delete": "삭제",
"create_shared_album_page_share": "공유", "control_bottom_app_bar_share": "공유",
"create_album_page_untitled": "제목없음",
"create_shared_album_page_create": "만들기", "create_shared_album_page_create": "만들기",
"create_shared_album_page_share": "공유",
"create_shared_album_page_share_add_assets": "사진 추가", "create_shared_album_page_share_add_assets": "사진 추가",
"create_shared_album_page_share_select_photos": "사진 선택", "create_shared_album_page_share_select_photos": "사진 선택",
"daily_title_text_date": "E, M월 d일", "daily_title_text_date": "E, M월 d일",
@@ -75,6 +103,12 @@
"exif_bottom_sheet_description": "설명 추가...", "exif_bottom_sheet_description": "설명 추가...",
"exif_bottom_sheet_details": "상세정보", "exif_bottom_sheet_details": "상세정보",
"exif_bottom_sheet_location": "위치", "exif_bottom_sheet_location": "위치",
"experimental_settings_subtitle": "문제시 책임지지 않습니다!",
"experimental_settings_title": "실험적기능",
"home_page_add_to_album_conflicts": "{album} 앨범에 {added} 미디어를 추가했습니다. {failed} 이미 앨범에 있는 항목입니다.",
"home_page_add_to_album_success": "{album} 앨범에 {added} 미디어를 추가했습니다. ",
"library_page_albums": "앨범",
"library_page_new_album": "새 앨범",
"login_form_button_text": "로그인", "login_form_button_text": "로그인",
"login_form_email_hint": "youremail@email.com", "login_form_email_hint": "youremail@email.com",
"login_form_endpoint_hint": "https://your-server-ip:port/api", "login_form_endpoint_hint": "https://your-server-ip:port/api",
@@ -90,8 +124,8 @@
"login_form_save_login": "로그인상태 유지", "login_form_save_login": "로그인상태 유지",
"monthly_title_text_date_format": "y년 M월", "monthly_title_text_date_format": "y년 M월",
"profile_drawer_client_server_up_to_date": "클라이언트와 서버가 최신 상태입니다", "profile_drawer_client_server_up_to_date": "클라이언트와 서버가 최신 상태입니다",
"profile_drawer_sign_out": "로그아웃",
"profile_drawer_settings": "설정", "profile_drawer_settings": "설정",
"profile_drawer_sign_out": "로그아웃",
"search_bar_hint": "사진 검색", "search_bar_hint": "사진 검색",
"search_page_no_objects": "발견된 사물이\n없습니다", "search_page_no_objects": "발견된 사물이\n없습니다",
"search_page_no_places": "발견된 장소가\n없습니다", "search_page_no_places": "발견된 장소가\n없습니다",
@@ -101,52 +135,47 @@
"select_additional_user_for_sharing_page_suggestions": "초대 가능한 사용자 제안", "select_additional_user_for_sharing_page_suggestions": "초대 가능한 사용자 제안",
"select_user_for_sharing_page_err_album": "앨범 생성 실패", "select_user_for_sharing_page_err_album": "앨범 생성 실패",
"select_user_for_sharing_page_share_suggestions": "초대 가능한 사용자 제안", "select_user_for_sharing_page_share_suggestions": "초대 가능한 사용자 제안",
"setting_notifications_notify_failures_grace_period": "백그라운드 백업 실패 알림: {}",
"setting_notifications_notify_hours": "{}시간 뒤",
"setting_notifications_notify_immediately": "즉시",
"setting_notifications_notify_minutes": "{}분 뒤",
"setting_notifications_notify_never": "알리지 않음",
"setting_notifications_single_progress_subtitle": "미디어별 상세 진행률 표시",
"setting_notifications_single_progress_title": "백그라운드 작업 세부 진행률 표시",
"setting_notifications_subtitle": "알림 기본 설정 조정",
"setting_notifications_title": "알림",
"setting_notifications_total_progress_subtitle": "전체 업로드 진행률(완료/전체)",
"setting_notifications_total_progress_title": "백그라운드 작업 전체 진행률 표시",
"setting_pages_app_bar_settings": "설정",
"share_add": "추가", "share_add": "추가",
"share_add_photos": "사진 추가", "share_add_photos": "사진 추가",
"share_add_title": "새 앨범제목", "share_add_title": "새 앨범제목",
"share_create_album": "앨범 만들기", "share_create_album": "앨범 만들기",
"share_dialog_preparing": "준비중...",
"share_invite": "앨범에 초대", "share_invite": "앨범에 초대",
"sharing_page_album": "공유앨범", "sharing_page_album": "공유앨범",
"sharing_page_description": "공유앨범을 만들어 다른 사용자들과 사진 및 비디오를 공유합니다.", "sharing_page_description": "공유앨범을 만들어 다른 사용자들과 사진 및 비디오를 공유합니다.",
"sharing_page_empty_list": "공유앨범 없음", "sharing_page_empty_list": "공유앨범 없음",
"sharing_silver_appbar_create_shared_album": "공유앨범 만들기", "sharing_silver_appbar_create_shared_album": "공유앨범 만들기",
"sharing_silver_appbar_share_partner": "파트너와 공유", "sharing_silver_appbar_share_partner": "파트너와 공유",
"tab_controller_nav_library": "라이브러리",
"tab_controller_nav_photos": "사진", "tab_controller_nav_photos": "사진",
"tab_controller_nav_search": "검색", "tab_controller_nav_search": "검색",
"tab_controller_nav_sharing": "공유", "tab_controller_nav_sharing": "공유",
"tab_controller_nav_library": "라이브러리", "theme_setting_asset_list_storage_indicator_title": "미디어 타일에 스토리지 싱크여부 표시",
"theme_setting_asset_list_tiles_per_row_title": "한 줄에 표시할 미디어 수 ({})",
"theme_setting_dark_mode_switch": "다크모드",
"theme_setting_image_viewer_quality_subtitle": "디테일 이미지 뷰어 품질 조정",
"theme_setting_image_viewer_quality_title": "이미지 뷰어 품질",
"theme_setting_system_theme_switch": "자동(시스템 설정에 따름)",
"theme_setting_theme_subtitle": "앱테마 선택",
"theme_setting_theme_title": "테마",
"theme_setting_three_stage_loading_subtitle": "이 기능은 로딩 성능을 향상시킬 수 있지만 훨씬 더 많은 데이터를 사용합니다.",
"theme_setting_three_stage_loading_title": "3단계 로딩 활성화",
"version_announcement_overlay_ack": "승인", "version_announcement_overlay_ack": "승인",
"version_announcement_overlay_release_notes": "릴리스 정보", "version_announcement_overlay_release_notes": "릴리스 정보",
"version_announcement_overlay_text_1": "안녕하세요!", "version_announcement_overlay_text_1": "안녕하세요!",
"version_announcement_overlay_text_2": "앱에 새로운 업데이트가 있습니다!", "version_announcement_overlay_text_2": "앱에 새로운 업데이트가 있습니다!",
"version_announcement_overlay_text_3": "특히 WatchTower 또는 서버 응용 프로그램 자동 업데이트를 처리하는 메커니즘을 사용하는 경우 잘못된 구성을 방지하기 위해 docker-compose 및 .env 설정이 최신 상태인지 확인하세요.", "version_announcement_overlay_text_3": "특히 WatchTower 또는 서버 응용 프로그램 자동 업데이트를 처리하는 메커니즘을 사용하는 경우 잘못된 구성을 방지하기 위해 docker-compose 및 .env 설정이 최신 상태인지 확인하세요.",
"version_announcement_overlay_title": "새 서버 버전 사용 가능 \uD83C\uDF89", "version_announcement_overlay_title": "새 서버 버전 사용 가능 🎉"
"album_thumbnail_card_item": "1개 항목",
"album_thumbnail_card_items": "{}개 항목",
"album_thumbnail_card_shared": " · 공유",
"library_page_albums": "앨범",
"library_page_new_album": "새 앨범",
"create_album_page_untitled": "제목없음",
"share_dialog_preparing": "준비중...",
"control_bottom_app_bar_share": "공유",
"setting_pages_app_bar_settings": "설정",
"theme_setting_theme_title": "테마",
"theme_setting_theme_subtitle": "앱테마 선택",
"theme_setting_system_theme_switch": "자동(시스템 설정에 따름)",
"theme_setting_dark_mode_switch": "다크모드",
"theme_setting_image_viewer_quality_title": "이미지 뷰어 품질",
"theme_setting_image_viewer_quality_subtitle": "디테일 이미지 뷰어 품질 조정",
"theme_setting_three_stage_loading_title": "3단계 로딩 활성화",
"theme_setting_three_stage_loading_subtitle": "이 기능은 로딩 성능을 향상시킬 수 있지만 훨씬 더 많은 데이터를 사용합니다.",
"asset_list_settings_title": "사진 배열",
"asset_list_settings_subtitle": "사진 배열 레이아웃 설정",
"theme_setting_asset_list_storage_indicator_title": "미디어 타일에 스토리지 싱크여부 표시",
"theme_setting_asset_list_tiles_per_row_title": "한 줄에 표시할 미디어 수 ({})",
"setting_notifications_title": "알림",
"setting_notifications_subtitle": "알림 기본 설정 조정",
"setting_notifications_notify_failures_grace_period": "백그라운드 백업 실패 알림: {}",
"setting_notifications_notify_immediately": "즉시",
"setting_notifications_notify_minutes": "{}분 뒤",
"setting_notifications_notify_hours": "{}시간 뒤",
"setting_notifications_notify_never": "알리지 않음"
} }

View File

@@ -1,6 +1,9 @@
{ {
"album_info_card_backup_album_excluded": "WYKLUCZONE", "album_info_card_backup_album_excluded": "WYKLUCZONE",
"album_info_card_backup_album_included": "WŁĄCZONE", "album_info_card_backup_album_included": "WŁĄCZONE",
"album_thumbnail_card_item": "1 pozycja",
"album_thumbnail_card_items": "{} pozycje",
"album_thumbnail_card_shared": "Udostępniony",
"album_viewer_appbar_share_delete": "Usuń album", "album_viewer_appbar_share_delete": "Usuń album",
"album_viewer_appbar_share_err_delete": "Nie udało się usunąć albumu", "album_viewer_appbar_share_err_delete": "Nie udało się usunąć albumu",
"album_viewer_appbar_share_err_leave": "Nie udało się wyjść z albumu", "album_viewer_appbar_share_err_leave": "Nie udało się wyjść z albumu",
@@ -9,6 +12,8 @@
"album_viewer_appbar_share_leave": "Opuść album", "album_viewer_appbar_share_leave": "Opuść album",
"album_viewer_appbar_share_remove": "Usuń z albumu", "album_viewer_appbar_share_remove": "Usuń z albumu",
"album_viewer_page_share_add_users": "Dodaj użytkowników", "album_viewer_page_share_add_users": "Dodaj użytkowników",
"asset_list_settings_subtitle": "Ustawienia układu siatki zdjęć",
"asset_list_settings_title": "Siatka Zdjęć",
"backup_album_selection_page_albums_device": "Albumy na urządzeniu ({})", "backup_album_selection_page_albums_device": "Albumy na urządzeniu ({})",
"backup_album_selection_page_albums_tap": "Stuknij, aby włączyć, stuknij dwukrotnie, aby wykluczyć", "backup_album_selection_page_albums_tap": "Stuknij, aby włączyć, stuknij dwukrotnie, aby wykluczyć",
"backup_album_selection_page_assets_scatter": "Pliki mogą być rozproszone w wielu albumach. Dzięki temu albumy mogą być włączane lub wyłączane podczas procesu tworzenia kopii zapasowej.", "backup_album_selection_page_assets_scatter": "Pliki mogą być rozproszone w wielu albumach. Dzięki temu albumy mogą być włączane lub wyłączane podczas procesu tworzenia kopii zapasowej.",
@@ -16,13 +21,33 @@
"backup_album_selection_page_selection_info": "Info o wyborze", "backup_album_selection_page_selection_info": "Info o wyborze",
"backup_album_selection_page_total_assets": "Łącznie unikalnych plików", "backup_album_selection_page_total_assets": "Łącznie unikalnych plików",
"backup_all": "Wszystkie", "backup_all": "Wszystkie",
"backup_background_service_backup_failed_message": "Nie udało się wykonać kopii zapasowej zasobów. Próbuję ponownie...",
"backup_background_service_connection_failed_message": "Nie udało się połączyć z serwerem. Próbuję ponownie...",
"backup_background_service_current_upload_notification": "Wysyłanie {}",
"backup_background_service_default_notification": "Sprawdzanie nowych zasobów...",
"backup_background_service_error_title": "Błąd kopii zapasowej",
"backup_background_service_in_progress_notification": "Tworzę kopię twoich zasobów...",
"backup_background_service_upload_failure_notification": "Nie udało się przesłać {}",
"backup_controller_page_albums": "Backup Albumów", "backup_controller_page_albums": "Backup Albumów",
"backup_controller_page_backup": "Backup", "backup_controller_page_background_battery_info_link": "Pokaż mi jak",
"backup_controller_page_background_battery_info_message": "Aby uzyskać najlepsze rezultaty podczas tworzenia kopii zapasowej w tle, należy wyłączyć wszelkie optymalizacje baterii ograniczające aktywność w tle dla Immich w urządzeniu.\n\nPonieważ jest to zależne od urządzenia, proszę sprawdzić wymagane informacje dla producenta urządzenia.",
"backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_battery_info_title": "Optymalizacja Baterii",
"backup_controller_page_background_charging": "Tylko podczas ładowania",
"backup_controller_page_background_configure_error": "Nie udało się skonfigurować usługi w tle",
"backup_controller_page_background_delay": "Delay new assets backup: {}",
"backup_controller_page_background_description": "Włącz usługę w tle, aby automatycznie tworzyć kopie zapasowe wszelkich nowych zasobów bez konieczności otwierania aplikacji",
"backup_controller_page_background_is_off": "Automatyczna kopia zapasowa w tle jest wyłączona",
"backup_controller_page_background_is_on": "Automatyczna kopia zapasowa w tle jest włączona",
"backup_controller_page_background_turn_off": "Wyłącz usługę w tle",
"backup_controller_page_background_turn_on": "Włącz usługę w tle",
"backup_controller_page_background_wifi": "Tylko na WiFi",
"backup_controller_page_backup": "Kopia Zapasowa",
"backup_controller_page_backup_selected": "Zaznaczone: ", "backup_controller_page_backup_selected": "Zaznaczone: ",
"backup_controller_page_backup_sub": "Tworzenie kopii zapasowych zdjęć i filmów", "backup_controller_page_backup_sub": "Tworzenie kopii zapasowych zdjęć i filmów",
"backup_controller_page_cancel": "Anuluj", "backup_controller_page_cancel": "Anuluj",
"backup_controller_page_created": "Utworzony na: {}", "backup_controller_page_created": "Utworzony na: {}",
"backup_controller_page_desc_backup": "Włącz backup, aby automatycznie przesyłać nowe zasoby na serwer.", "backup_controller_page_desc_backup": "Włącz kopię zapasową, aby automatycznie przesyłać nowe zasoby na serwer.",
"backup_controller_page_excluded": "Wykluczone: ", "backup_controller_page_excluded": "Wykluczone: ",
"backup_controller_page_failed": "Nieudane ({})", "backup_controller_page_failed": "Nieudane ({})",
"backup_controller_page_filename": "Nazwa pliku: {} [{}]", "backup_controller_page_filename": "Nazwa pliku: {} [{}]",
@@ -33,21 +58,41 @@
"backup_controller_page_remainder_sub": "Pozostałe zdjęcia i albumy do wykonania kopii zapasowej z wyboru", "backup_controller_page_remainder_sub": "Pozostałe zdjęcia i albumy do wykonania kopii zapasowej z wyboru",
"backup_controller_page_select": "Zaznacz", "backup_controller_page_select": "Zaznacz",
"backup_controller_page_server_storage": "Pamięć Serwera", "backup_controller_page_server_storage": "Pamięć Serwera",
"backup_controller_page_start_backup": "Rozpocznij Backup", "backup_controller_page_start_backup": "Rozpocznij Kopię Zapasową",
"backup_controller_page_status_off": "Backup jest wyłączony", "backup_controller_page_status_off": "Kopia Zapasowa jest wyłaczona",
"backup_controller_page_status_on": "Backup jest włączony", "backup_controller_page_status_on": "Kopia Zapasowa jest włączona",
"backup_controller_page_storage_format": "{} z {} wykorzystanych", "backup_controller_page_storage_format": "{} z {} wykorzystanych",
"backup_controller_page_to_backup": "Albumy do backupu", "backup_controller_page_to_backup": "Albumy do backupu",
"backup_controller_page_total": "Łącznie", "backup_controller_page_total": "Łącznie",
"backup_controller_page_total_sub": "Wszystkie unikalne zdjęcia i filmy z wybranych albumów", "backup_controller_page_total_sub": "Wszystkie unikalne zdjęcia i filmy z wybranych albumów",
"backup_controller_page_turn_off": "Wyłącz Backup", "backup_controller_page_turn_off": "Wyłącz Kopię Zapasową",
"backup_controller_page_turn_on": "Włącz Backup", "backup_controller_page_turn_on": "Włącz Kopię Zapasową",
"backup_controller_page_uploading_file_info": "Przesyłanie informacji o pliku", "backup_controller_page_uploading_file_info": "Przesyłanie informacji o pliku",
"backup_err_only_album": "Nie można usunąć tylko i wyłącznie albumu", "backup_err_only_album": "Nie można usunąć tylko i wyłącznie albumu",
"backup_info_card_assets": "pliki", "backup_info_card_assets": "zasoby",
"cache_settings_album_thumbnails": "Miniatury stron bibliotek ({} zasobów)",
"cache_settings_clear_cache_button": "Wyczyść Cache",
"cache_settings_clear_cache_button_title": "Czyści pamięć podręczną aplikacji. Wpłynie to znacząco na wydajność aplikacji, dopóki pamięć podręczna nie zostanie odbudowana.",
"cache_settings_image_cache_size": "Rozmiar pamięci podręcznej obrazów ({} zasobów)",
"cache_settings_statistics_album": "Biblioteka miniatur",
"cache_settings_statistics_assets": "{} zasoby ({})",
"cache_settings_statistics_full": "Pełne Zdjęcia",
"cache_settings_statistics_shared": "Udostępnione miniatury albumów",
"cache_settings_statistics_thumbnail": "Miniatury",
"cache_settings_statistics_title": "Użycie Cache",
"cache_settings_subtitle": "Kontrolowanie zachowania buforowania aplikacji mobilnej Immich",
"cache_settings_thumbnail_size": "Rozmiar pamięci podręcznej miniatur ({} zasobów)",
"cache_settings_title": "Ustawienia Buforowania",
"control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} items",
"control_bottom_app_bar_album_info_shared": "{} items · Shared",
"control_bottom_app_bar_create_new_album": "Create new album",
"control_bottom_app_bar_delete": "Usuń", "control_bottom_app_bar_delete": "Usuń",
"control_bottom_app_bar_share": "Udostępnij",
"create_album_page_untitled": "Bez tytułu",
"create_shared_album_page_create": "Utwórz",
"create_shared_album_page_share": "Udostępnij", "create_shared_album_page_share": "Udostępnij",
"create_shared_album_page_share_add_assets": "DODAJ PLIKI", "create_shared_album_page_share_add_assets": "DODAJ ZASOBY",
"create_shared_album_page_share_select_photos": "Zaznacz Zdjęcia", "create_shared_album_page_share_select_photos": "Zaznacz Zdjęcia",
"daily_title_text_date": "E, MMM dd", "daily_title_text_date": "E, MMM dd",
"daily_title_text_date_year": "E, MMM dd, yyyy", "daily_title_text_date_year": "E, MMM dd, yyyy",
@@ -56,24 +101,36 @@
"delete_dialog_cancel": "Anuluj", "delete_dialog_cancel": "Anuluj",
"delete_dialog_ok": "Usuń", "delete_dialog_ok": "Usuń",
"delete_dialog_title": "Usuń trwale", "delete_dialog_title": "Usuń trwale",
"exif_bottom_sheet_description": "Dodaj opis...", "exif_bottom_sheet_description": "Dodaj Opis...",
"exif_bottom_sheet_details": "SZCZEGÓŁY", "exif_bottom_sheet_details": "SZCZEGÓŁY",
"exif_bottom_sheet_location": "LOKALIZACJA", "exif_bottom_sheet_location": "LOKALIZACJA",
"experimental_settings_new_asset_list_subtitle": "Work in progress",
"experimental_settings_new_asset_list_title": "Enable experimental photo grid",
"experimental_settings_subtitle": "Use at your own risk!",
"experimental_settings_title": "Experimental",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
"library_page_albums": "Albumy",
"library_page_new_album": "Nowy album",
"login_form_button_text": "Login", "login_form_button_text": "Login",
"login_form_email_hint": "twojmail@email.com", "login_form_email_hint": "twojmail@email.com",
"login_form_endpoint_hint": "http://ip-twojego-serwera:port/api", "login_form_endpoint_hint": "http://ip-twojego-serwera:port/api",
"login_form_endpoint_url": "URL Serwera", "login_form_endpoint_url": "URL Serwera",
"login_form_err_http": "Proszę określić http:// lub https://", "login_form_err_http": "Proszę określić http:// lub https://",
"login_form_err_invalid_email": "Niepoprawny emaill", "login_form_err_invalid_email": "Niepoprawny Email",
"login_form_err_leading_whitespace": "Białe znaki", "login_form_err_leading_whitespace": "Białe znaki",
"login_form_err_trailing_whitespace": "Białe znaki po przecinku", "login_form_err_trailing_whitespace": "Białe znaki po przecinku",
"login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL",
"login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server",
"login_form_failed_login": "Błąd logowania, sprawdź adres url serwera, email i hasło.", "login_form_failed_login": "Błąd logowania, sprawdź adres url serwera, email i hasło.",
"login_form_label_email": "Email", "login_form_label_email": "Email",
"login_form_label_password": "Hasło", "login_form_label_password": "Hasło",
"login_form_password_hint": "hasło", "login_form_password_hint": "hasło",
"login_form_save_login": "Pozostań zalogowany", "login_form_save_login": "Pozostań zalogowany",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_server_up_to_date": "Klient i serwer są aktualne", "profile_drawer_client_server_up_to_date": "Klient i serwer są aktualne",
"profile_drawer_settings": "Ustawienia",
"profile_drawer_sign_out": "Wyloguj się", "profile_drawer_sign_out": "Wyloguj się",
"search_bar_hint": "Szukaj swoich zdjęć", "search_bar_hint": "Szukaj swoich zdjęć",
"search_page_no_objects": "Brak informacji o obiektach", "search_page_no_objects": "Brak informacji o obiektach",
@@ -84,20 +141,51 @@
"select_additional_user_for_sharing_page_suggestions": "Propozycje", "select_additional_user_for_sharing_page_suggestions": "Propozycje",
"select_user_for_sharing_page_err_album": "Nie udało się utworzyć albumu", "select_user_for_sharing_page_err_album": "Nie udało się utworzyć albumu",
"select_user_for_sharing_page_share_suggestions": "Propozycje", "select_user_for_sharing_page_share_suggestions": "Propozycje",
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).",
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).",
"setting_image_viewer_original_title": "Load original image",
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.",
"setting_image_viewer_preview_title": "Load preview image",
"setting_notifications_notify_failures_grace_period": "Powiadomienie o awariach kopii zapasowych w tle: {}",
"setting_notifications_notify_hours": "{} godzin",
"setting_notifications_notify_immediately": "natychmiast",
"setting_notifications_notify_minutes": "{} minut",
"setting_notifications_notify_never": "nigdy",
"setting_notifications_notify_seconds": "{} seconds",
"setting_notifications_single_progress_subtitle": "Detailed upload progress information per asset",
"setting_notifications_single_progress_title": "Show background backup detail progress",
"setting_notifications_subtitle": "Dostosuj preferencje powiadomień",
"setting_notifications_title": "Powiadomienia",
"setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)",
"setting_notifications_total_progress_title": "Show background backup total progress",
"setting_pages_app_bar_settings": "Ustawienia",
"settings_require_restart": "Please restart Immich to apply this setting",
"share_add": "Dodaj", "share_add": "Dodaj",
"share_add_photos": "Dodaj zdjęcia", "share_add_photos": "Dodaj zdjęcia",
"share_add_title": "Dodaj tytuł", "share_add_title": "Dodaj tytuł",
"share_create_album": "Utwórz album", "share_create_album": "Utwórz album",
"share_dialog_preparing": "Przygotowywanie...",
"share_invite": "Zaproś do albumu", "share_invite": "Zaproś do albumu",
"sharing_page_album": "Udostępnione albumy", "sharing_page_album": "Udostępnione albumy",
"sharing_page_description": "Twórz wspóldzielone albumy, aby udostępniać zdjęcia i filmy osobom w sieci.", "sharing_page_description": "Twórz wspóldzielone albumy, aby udostępniać zdjęcia i filmy osobom w sieci.",
"sharing_page_empty_list": "PUSTA LISTA", "sharing_page_empty_list": "PUSTA LISTA",
"sharing_silver_appbar_create_shared_album": "Utwórz współdzielony album", "sharing_silver_appbar_create_shared_album": "Utwórz współdzielony album",
"sharing_silver_appbar_share_partner": "Udostępnij partnerce/partnerowi", "sharing_silver_appbar_share_partner": "Udostępnij partnerce/partnerowi",
"tab_controller_nav_library": "Biblioteka",
"tab_controller_nav_photos": "Zdjęcia", "tab_controller_nav_photos": "Zdjęcia",
"tab_controller_nav_search": "Szukaj", "tab_controller_nav_search": "Szukaj",
"tab_controller_nav_sharing": "Udostępnianie", "tab_controller_nav_sharing": "Udostępnianie",
"version_announcement_overlay_ack": "Potwierdzenie", "theme_setting_asset_list_storage_indicator_title": "Pokaż wskaźnik przechowywania na kafelkach zasobów",
"theme_setting_asset_list_tiles_per_row_title": "Number of assets per row ({})",
"theme_setting_dark_mode_switch": "Ciemny Motyw",
"theme_setting_image_viewer_quality_subtitle": "Dostosuj jakość podglądu szczegółowości",
"theme_setting_image_viewer_quality_title": "Jakość przeglądania obrazów",
"theme_setting_system_theme_switch": "Automatyczny (Postępuj zgodnie z ustawieniami systemu)",
"theme_setting_theme_subtitle": "Wybierz ustawienia motywu aplikacji",
"theme_setting_theme_title": "Motyw",
"theme_setting_three_stage_loading_subtitle": "Trójstopniowe ładowanie może zwiększyć wydajność ładowania, ale powoduje znacznie większe obciążenie sieci",
"theme_setting_three_stage_loading_title": "Włączenie trójstopniowego ładowania",
"version_announcement_overlay_ack": "Potwierdzam",
"version_announcement_overlay_release_notes": "informacje o wydaniu", "version_announcement_overlay_release_notes": "informacje o wydaniu",
"version_announcement_overlay_text_1": "Cześć przyjacielu, jest nowe wydanie", "version_announcement_overlay_text_1": "Cześć przyjacielu, jest nowe wydanie",
"version_announcement_overlay_text_2": "prosimy o poświęcenie czasu na odwiedzenie ", "version_announcement_overlay_text_2": "prosimy o poświęcenie czasu na odwiedzenie ",

Binary file not shown.

View File

@@ -3,6 +3,8 @@ PODS:
- flutter_udid (0.0.1): - flutter_udid (0.0.1):
- Flutter - Flutter
- SAMKeychain - SAMKeychain
- flutter_web_auth (0.5.0):
- Flutter
- fluttertoast (0.0.2): - fluttertoast (0.0.2):
- Flutter - Flutter
- Toast - Toast
@@ -37,6 +39,7 @@ PODS:
DEPENDENCIES: DEPENDENCIES:
- Flutter (from `Flutter`) - Flutter (from `Flutter`)
- flutter_udid (from `.symlinks/plugins/flutter_udid/ios`) - flutter_udid (from `.symlinks/plugins/flutter_udid/ios`)
- flutter_web_auth (from `.symlinks/plugins/flutter_web_auth/ios`)
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
@@ -60,6 +63,8 @@ EXTERNAL SOURCES:
:path: Flutter :path: Flutter
flutter_udid: flutter_udid:
:path: ".symlinks/plugins/flutter_udid/ios" :path: ".symlinks/plugins/flutter_udid/ios"
flutter_web_auth:
:path: ".symlinks/plugins/flutter_web_auth/ios"
fluttertoast: fluttertoast:
:path: ".symlinks/plugins/fluttertoast/ios" :path: ".symlinks/plugins/fluttertoast/ios"
image_picker_ios: image_picker_ios:
@@ -86,6 +91,7 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS: SPEC CHECKSUMS:
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
flutter_udid: 0848809dbed4c055175747ae6a45a8b4f6771e1c flutter_udid: 0848809dbed4c055175747ae6a45a8b4f6771e1c
flutter_web_auth: c25208760459cec375a3c39f6a8759165ca0fa4d
fluttertoast: 16fbe6039d06a763f3533670197d01fc73459037 fluttertoast: 16fbe6039d06a763f3533670197d01fc73459037
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
image_picker_ios: b786a5dcf033a8336a657191401bfdf12017dabb image_picker_ios: b786a5dcf033a8336a657191401bfdf12017dabb

View File

@@ -360,7 +360,7 @@
CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 68; CURRENT_PROJECT_VERSION = 74;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@@ -495,7 +495,7 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 68; CURRENT_PROJECT_VERSION = 74;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@@ -522,7 +522,7 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 68; CURRENT_PROJECT_VERSION = 74;
DEVELOPMENT_TEAM = 2F67MQ8R79; DEVELOPMENT_TEAM = 2F67MQ8R79;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;

View File

@@ -17,11 +17,11 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.34.0</string> <string>1.37.1</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>68</string> <string>74</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true /> <true />
<key>MGLMapboxMetricsEnabledSettingShownInApp</key> <key>MGLMapboxMetricsEnabledSettingShownInApp</key>

View File

@@ -0,0 +1,23 @@
#!/bin/sh
# The default execution directory of this script is the ci_scripts directory.
cd $CI_WORKSPACE/mobile
# Install Flutter using git.
git clone https://github.com/flutter/flutter.git --depth 1 -b stable $HOME/flutter
export PATH="$PATH:$HOME/flutter/bin"
# Install Flutter artifacts for iOS (--ios), or macOS (--macos) platforms.
flutter precache --ios
# Install Flutter dependencies.
flutter pub get
# Install CocoaPods using Homebrew.
HOMEBREW_NO_AUTO_UPDATE=1 # disable homebrew's automatic updates.
brew install cocoapods
# Install CocoaPods dependencies.
cd ios && pod install # run `pod install` in the `ios` directory.
exit 0

View File

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

View File

@@ -5,32 +5,29 @@
<testcase classname="fastlane.lanes" name="0: default_platform" time="0.000304"> <testcase classname="fastlane.lanes" name="0: default_platform" time="0.000334">
</testcase> </testcase>
<testcase classname="fastlane.lanes" name="1: increment_version_number" time="0.606546"> <testcase classname="fastlane.lanes" name="1: increment_version_number" time="1.671363">
</testcase> </testcase>
<testcase classname="fastlane.lanes" name="2: latest_testflight_build_number" time="3.706234"> <testcase classname="fastlane.lanes" name="2: latest_testflight_build_number" time="7.167423">
</testcase> </testcase>
<testcase classname="fastlane.lanes" name="3: increment_build_number" time="0.657686"> <testcase classname="fastlane.lanes" name="3: increment_build_number" time="0.654653">
</testcase> </testcase>
<testcase classname="fastlane.lanes" name="4: build_app" time="68.78265"> <testcase classname="fastlane.lanes" name="4: build_app" time="29.319346">
</testcase> <failure message="/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/actions/actions_helper.rb:67:in `execute_action&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/runner.rb:255:in `block in execute_action&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/runner.rb:229:in `chdir&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/runner.rb:229:in `execute_action&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/runner.rb:157:in `trigger_action_by_name&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/fast_file.rb:159:in `method_missing&apos;&#10;Fastfile:27:in `block (2 levels) in parsing_binding&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/lane.rb:33:in `call&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/runner.rb:49:in `block in execute&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/runner.rb:45:in `chdir&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/runner.rb:45:in `execute&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/lane_manager.rb:47:in `cruise_lane&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/command_line_handler.rb:36:in `handle&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/commands_generator.rb:110:in `block (2 levels) in run&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/commander-4.6.0/lib/commander/command.rb:187:in `call&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/commander-4.6.0/lib/commander/command.rb:157:in `run&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/commander-4.6.0/lib/commander/runner.rb:444:in `run_active_command&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb:124:in `run!&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/commander-4.6.0/lib/commander/delegates.rb:18:in `run!&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/commands_generator.rb:354:in `run&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/commands_generator.rb:43:in `start&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/fastlane/lib/fastlane/cli_tools_distributor.rb:123:in `take_off&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/gems/fastlane-2.210.1/bin/fastlane:23:in `&lt;top (required)&gt;&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/bin/fastlane:25:in `load&apos;&#10;/usr/local/Cellar/fastlane/2.210.1/libexec/bin/fastlane:25:in `&lt;main&gt;&apos;&#10;&#10;Error building the application - see the log above" />
<testcase classname="fastlane.lanes" name="5: upload_to_testflight" time="60.883182">
</testcase> </testcase>

View File

@@ -4,6 +4,7 @@ const String accessTokenKey = "immichBoxAccessTokenKey"; // Key 1
const String deviceIdKey = 'immichBoxDeviceIdKey'; // Key 2 const String deviceIdKey = 'immichBoxDeviceIdKey'; // Key 2
const String isLoggedInKey = 'immichIsLoggedInKey'; // Key 3 const String isLoggedInKey = 'immichIsLoggedInKey'; // Key 3
const String serverEndpointKey = 'immichBoxServerEndpoint'; // Key 4 const String serverEndpointKey = 'immichBoxServerEndpoint'; // Key 4
const String assetEtagKey = 'immichAssetEtagKey'; // Key 5
// Login Info // Login Info
const String hiveLoginInfoBox = "immichLoginInfoBox"; // Box const String hiveLoginInfoBox = "immichLoginInfoBox"; // Box
@@ -25,7 +26,11 @@ const String backgroundBackupInfoBox = "immichBackgroundBackupInfoBox"; // Box
const String backupFailedSince = "immichBackupFailedSince"; // Key 1 const String backupFailedSince = "immichBackupFailedSince"; // Key 1
const String backupRequireWifi = "immichBackupRequireWifi"; // Key 2 const String backupRequireWifi = "immichBackupRequireWifi"; // Key 2
const String backupRequireCharging = "immichBackupRequireCharging"; // Key 3 const String backupRequireCharging = "immichBackupRequireCharging"; // Key 3
const String backupTriggerDelay = "immichBackupTriggerDelay"; // Key 4
// Duplicate asset // Duplicate asset
const String duplicatedAssetsBox = "immichDuplicatedAssetsBox"; // Box const String duplicatedAssetsBox = "immichDuplicatedAssetsBox"; // Box
const String duplicatedAssetsKey = "immichDuplicatedAssetsKey"; // Key 1 const String duplicatedAssetsKey = "immichDuplicatedAssetsKey"; // Key 1
// In app logger
const String immichLoggerBox = "immichInAppLogger"; // Box

View File

@@ -16,11 +16,13 @@ import 'package:immich_mobile/modules/login/models/hive_saved_login_info.model.d
import 'package:immich_mobile/modules/login/providers/authentication.provider.dart'; import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/routing/router.dart';
import 'package:immich_mobile/routing/tab_navigation_observer.dart'; import 'package:immich_mobile/routing/tab_navigation_observer.dart';
import 'package:immich_mobile/shared/models/immich_logger_message.model.dart';
import 'package:immich_mobile/shared/providers/app_state.provider.dart'; import 'package:immich_mobile/shared/providers/app_state.provider.dart';
import 'package:immich_mobile/shared/providers/asset.provider.dart'; import 'package:immich_mobile/shared/providers/asset.provider.dart';
import 'package:immich_mobile/shared/providers/release_info.provider.dart'; import 'package:immich_mobile/shared/providers/release_info.provider.dart';
import 'package:immich_mobile/shared/providers/server_info.provider.dart'; import 'package:immich_mobile/shared/providers/server_info.provider.dart';
import 'package:immich_mobile/shared/providers/websocket.provider.dart'; import 'package:immich_mobile/shared/providers/websocket.provider.dart';
import 'package:immich_mobile/shared/services/immich_logger.service.dart';
import 'package:immich_mobile/shared/views/immich_loading_overlay.dart'; import 'package:immich_mobile/shared/views/immich_loading_overlay.dart';
import 'package:immich_mobile/shared/views/version_announcement_overlay.dart'; import 'package:immich_mobile/shared/views/version_announcement_overlay.dart';
import 'package:immich_mobile/utils/immich_app_theme.dart'; import 'package:immich_mobile/utils/immich_app_theme.dart';
@@ -31,14 +33,18 @@ void main() async {
Hive.registerAdapter(HiveSavedLoginInfoAdapter()); Hive.registerAdapter(HiveSavedLoginInfoAdapter());
Hive.registerAdapter(HiveBackupAlbumsAdapter()); Hive.registerAdapter(HiveBackupAlbumsAdapter());
Hive.registerAdapter(HiveDuplicatedAssetsAdapter()); Hive.registerAdapter(HiveDuplicatedAssetsAdapter());
Hive.registerAdapter(ImmichLoggerMessageAdapter());
await Future.wait([ await Future.wait([
Hive.openBox<ImmichLoggerMessage>(immichLoggerBox),
Hive.openBox(userInfoBox), Hive.openBox(userInfoBox),
Hive.openBox<HiveSavedLoginInfo>(hiveLoginInfoBox), Hive.openBox<HiveSavedLoginInfo>(hiveLoginInfoBox),
Hive.openBox<HiveBackupAlbums>(hiveBackupInfoBox),
Hive.openBox(hiveGithubReleaseInfoBox), Hive.openBox(hiveGithubReleaseInfoBox),
Hive.openBox(userSettingInfoBox), Hive.openBox(userSettingInfoBox),
Hive.openBox<HiveDuplicatedAssets>(duplicatedAssetsBox), if (!Platform.isAndroid) Hive.openBox<HiveBackupAlbums>(hiveBackupInfoBox),
if (!Platform.isAndroid)
Hive.openBox<HiveDuplicatedAssets>(duplicatedAssetsBox),
if (!Platform.isAndroid) Hive.openBox(backgroundBackupInfoBox),
EasyLocalization.ensureInitialized(), EasyLocalization.ensureInitialized(),
]); ]);
@@ -56,6 +62,9 @@ void main() async {
} }
} }
// Initialize Immich Logger Service
ImmichLogger().init();
runApp( runApp(
EasyLocalization( EasyLocalization(
supportedLocales: locales, supportedLocales: locales,
@@ -86,8 +95,8 @@ class ImmichAppState extends ConsumerState<ImmichApp>
var isAuthenticated = ref.watch(authenticationProvider).isAuthenticated; var isAuthenticated = ref.watch(authenticationProvider).isAuthenticated;
if (isAuthenticated) { if (isAuthenticated) {
ref.read(backupProvider.notifier).resumeBackup();
ref.read(backgroundServiceProvider).resumeServiceIfEnabled(); ref.read(backgroundServiceProvider).resumeServiceIfEnabled();
ref.watch(backupProvider.notifier).resumeBackup();
ref.watch(assetProvider.notifier).getAllAsset(); ref.watch(assetProvider.notifier).getAllAsset();
ref.watch(serverInfoProvider.notifier).getServerVersion(); ref.watch(serverInfoProvider.notifier).getServerVersion();
} }

View File

@@ -1,10 +1,9 @@
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:openapi/api.dart';
class AssetSelectionPageResult { class AssetSelectionPageResult {
final Set<AssetResponseDto> selectedNewAsset; final Set<Asset> selectedNewAsset;
final Set<AssetResponseDto> selectedAdditionalAsset; final Set<Asset> selectedAdditionalAsset;
final bool isAlbumExist; final bool isAlbumExist;
AssetSelectionPageResult({ AssetSelectionPageResult({
@@ -14,8 +13,8 @@ class AssetSelectionPageResult {
}); });
AssetSelectionPageResult copyWith({ AssetSelectionPageResult copyWith({
Set<AssetResponseDto>? selectedNewAsset, Set<Asset>? selectedNewAsset,
Set<AssetResponseDto>? selectedAdditionalAsset, Set<Asset>? selectedAdditionalAsset,
bool? isAlbumExist, bool? isAlbumExist,
}) { }) {
return AssetSelectionPageResult( return AssetSelectionPageResult(

View File

@@ -1,12 +1,11 @@
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:openapi/api.dart';
class AssetSelectionState { class AssetSelectionState {
final Set<String> selectedMonths; final Set<String> selectedMonths;
final Set<AssetResponseDto> selectedNewAssetsForAlbum; final Set<Asset> selectedNewAssetsForAlbum;
final Set<AssetResponseDto> selectedAdditionalAssetsForAlbum; final Set<Asset> selectedAdditionalAssetsForAlbum;
final Set<AssetResponseDto> selectedAssetsInAlbumViewer; final Set<Asset> selectedAssetsInAlbumViewer;
final bool isMultiselectEnable; final bool isMultiselectEnable;
/// Indicate the asset selection page is navigated from existing album /// Indicate the asset selection page is navigated from existing album
@@ -22,9 +21,9 @@ class AssetSelectionState {
AssetSelectionState copyWith({ AssetSelectionState copyWith({
Set<String>? selectedMonths, Set<String>? selectedMonths,
Set<AssetResponseDto>? selectedNewAssetsForAlbum, Set<Asset>? selectedNewAssetsForAlbum,
Set<AssetResponseDto>? selectedAdditionalAssetsForAlbum, Set<Asset>? selectedAdditionalAssetsForAlbum,
Set<AssetResponseDto>? selectedAssetsInAlbumViewer, Set<Asset>? selectedAssetsInAlbumViewer,
bool? isMultiselectEnable, bool? isMultiselectEnable,
bool? isAlbumExist, bool? isAlbumExist,
}) { }) {

View File

@@ -1,6 +1,7 @@
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/modules/album/services/album.service.dart'; import 'package:immich_mobile/modules/album/services/album.service.dart';
import 'package:immich_mobile/modules/album/services/album_cache.service.dart'; import 'package:immich_mobile/modules/album/services/album_cache.service.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:openapi/api.dart'; import 'package:openapi/api.dart';
class AlbumNotifier extends StateNotifier<List<AlbumResponseDto>> { class AlbumNotifier extends StateNotifier<List<AlbumResponseDto>> {
@@ -13,7 +14,6 @@ class AlbumNotifier extends StateNotifier<List<AlbumResponseDto>> {
} }
getAllAlbums() async { getAllAlbums() async {
if (await _albumCacheService.isValid() && state.isEmpty) { if (await _albumCacheService.isValid() && state.isEmpty) {
state = await _albumCacheService.get(); state = await _albumCacheService.get();
} }
@@ -34,7 +34,7 @@ class AlbumNotifier extends StateNotifier<List<AlbumResponseDto>> {
Future<AlbumResponseDto?> createAlbum( Future<AlbumResponseDto?> createAlbum(
String albumTitle, String albumTitle,
Set<AssetResponseDto> assets, Set<Asset> assets,
) async { ) async {
AlbumResponseDto? album = AlbumResponseDto? album =
await _albumService.createAlbum(albumTitle, assets, []); await _albumService.createAlbum(albumTitle, assets, []);

View File

@@ -1,7 +1,6 @@
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/modules/album/models/asset_selection_state.model.dart'; import 'package:immich_mobile/modules/album/models/asset_selection_state.model.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:openapi/api.dart';
class AssetSelectionNotifier extends StateNotifier<AssetSelectionState> { class AssetSelectionNotifier extends StateNotifier<AssetSelectionState> {
AssetSelectionNotifier() AssetSelectionNotifier()
@@ -22,15 +21,15 @@ class AssetSelectionNotifier extends StateNotifier<AssetSelectionState> {
void removeAssetsInMonth( void removeAssetsInMonth(
String removedMonth, String removedMonth,
List<AssetResponseDto> assetsInMonth, List<Asset> assetsInMonth,
) { ) {
Set<AssetResponseDto> currentAssetList = state.selectedNewAssetsForAlbum; Set<Asset> currentAssetList = state.selectedNewAssetsForAlbum;
Set<String> currentMonthList = state.selectedMonths; Set<String> currentMonthList = state.selectedMonths;
currentMonthList currentMonthList
.removeWhere((selectedMonth) => selectedMonth == removedMonth); .removeWhere((selectedMonth) => selectedMonth == removedMonth);
for (AssetResponseDto asset in assetsInMonth) { for (Asset asset in assetsInMonth) {
currentAssetList.removeWhere((e) => e.id == asset.id); currentAssetList.removeWhere((e) => e.id == asset.id);
} }
@@ -40,7 +39,7 @@ class AssetSelectionNotifier extends StateNotifier<AssetSelectionState> {
); );
} }
void addAdditionalAssets(List<AssetResponseDto> assets) { void addAdditionalAssets(List<Asset> assets) {
state = state.copyWith( state = state.copyWith(
selectedAdditionalAssetsForAlbum: { selectedAdditionalAssetsForAlbum: {
...state.selectedAdditionalAssetsForAlbum, ...state.selectedAdditionalAssetsForAlbum,
@@ -49,7 +48,7 @@ class AssetSelectionNotifier extends StateNotifier<AssetSelectionState> {
); );
} }
void addAllAssetsInMonth(String month, List<AssetResponseDto> assetsInMonth) { void addAllAssetsInMonth(String month, List<Asset> assetsInMonth) {
state = state.copyWith( state = state.copyWith(
selectedMonths: {...state.selectedMonths, month}, selectedMonths: {...state.selectedMonths, month},
selectedNewAssetsForAlbum: { selectedNewAssetsForAlbum: {
@@ -59,7 +58,7 @@ class AssetSelectionNotifier extends StateNotifier<AssetSelectionState> {
); );
} }
void addNewAssets(List<AssetResponseDto> assets) { void addNewAssets(List<Asset> assets) {
state = state.copyWith( state = state.copyWith(
selectedNewAssetsForAlbum: { selectedNewAssetsForAlbum: {
...state.selectedNewAssetsForAlbum, ...state.selectedNewAssetsForAlbum,
@@ -68,20 +67,20 @@ class AssetSelectionNotifier extends StateNotifier<AssetSelectionState> {
); );
} }
void removeSelectedNewAssets(List<AssetResponseDto> assets) { void removeSelectedNewAssets(List<Asset> assets) {
Set<AssetResponseDto> currentList = state.selectedNewAssetsForAlbum; Set<Asset> currentList = state.selectedNewAssetsForAlbum;
for (AssetResponseDto asset in assets) { for (Asset asset in assets) {
currentList.removeWhere((e) => e.id == asset.id); currentList.removeWhere((e) => e.id == asset.id);
} }
state = state.copyWith(selectedNewAssetsForAlbum: currentList); state = state.copyWith(selectedNewAssetsForAlbum: currentList);
} }
void removeSelectedAdditionalAssets(List<AssetResponseDto> assets) { void removeSelectedAdditionalAssets(List<Asset> assets) {
Set<AssetResponseDto> currentList = state.selectedAdditionalAssetsForAlbum; Set<Asset> currentList = state.selectedAdditionalAssetsForAlbum;
for (AssetResponseDto asset in assets) { for (Asset asset in assets) {
currentList.removeWhere((e) => e.id == asset.id); currentList.removeWhere((e) => e.id == asset.id);
} }
@@ -109,7 +108,7 @@ class AssetSelectionNotifier extends StateNotifier<AssetSelectionState> {
); );
} }
void addAssetsInAlbumViewer(List<AssetResponseDto> assets) { void addAssetsInAlbumViewer(List<Asset> assets) {
state = state.copyWith( state = state.copyWith(
selectedAssetsInAlbumViewer: { selectedAssetsInAlbumViewer: {
...state.selectedAssetsInAlbumViewer, ...state.selectedAssetsInAlbumViewer,
@@ -118,10 +117,10 @@ class AssetSelectionNotifier extends StateNotifier<AssetSelectionState> {
); );
} }
void removeAssetsInAlbumViewer(List<AssetResponseDto> assets) { void removeAssetsInAlbumViewer(List<Asset> assets) {
Set<AssetResponseDto> currentList = state.selectedAssetsInAlbumViewer; Set<Asset> currentList = state.selectedAssetsInAlbumViewer;
for (AssetResponseDto asset in assets) { for (Asset asset in assets) {
currentList.removeWhere((e) => e.id == asset.id); currentList.removeWhere((e) => e.id == asset.id);
} }

View File

@@ -2,10 +2,12 @@ import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/modules/album/services/album.service.dart'; import 'package:immich_mobile/modules/album/services/album.service.dart';
import 'package:immich_mobile/modules/album/services/album_cache.service.dart'; import 'package:immich_mobile/modules/album/services/album_cache.service.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:openapi/api.dart'; import 'package:openapi/api.dart';
class SharedAlbumNotifier extends StateNotifier<List<AlbumResponseDto>> { class SharedAlbumNotifier extends StateNotifier<List<AlbumResponseDto>> {
SharedAlbumNotifier(this._sharedAlbumService, this._sharedAlbumCacheService) : super([]); SharedAlbumNotifier(this._sharedAlbumService, this._sharedAlbumCacheService)
: super([]);
final AlbumService _sharedAlbumService; final AlbumService _sharedAlbumService;
final SharedAlbumCacheService _sharedAlbumCacheService; final SharedAlbumCacheService _sharedAlbumCacheService;
@@ -16,7 +18,7 @@ class SharedAlbumNotifier extends StateNotifier<List<AlbumResponseDto>> {
Future<AlbumResponseDto?> createSharedAlbum( Future<AlbumResponseDto?> createSharedAlbum(
String albumName, String albumName,
Set<AssetResponseDto> assets, Set<Asset> assets,
List<String> sharedUserIds, List<String> sharedUserIds,
) async { ) async {
try { try {

View File

@@ -2,6 +2,7 @@ import 'dart:async';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/shared/models/asset.dart';
import 'package:immich_mobile/shared/providers/api.provider.dart'; import 'package:immich_mobile/shared/providers/api.provider.dart';
import 'package:immich_mobile/shared/services/api.service.dart'; import 'package:immich_mobile/shared/services/api.service.dart';
import 'package:openapi/api.dart'; import 'package:openapi/api.dart';
@@ -29,7 +30,7 @@ class AlbumService {
Future<AlbumResponseDto?> createAlbum( Future<AlbumResponseDto?> createAlbum(
String albumName, String albumName,
Set<AssetResponseDto> assets, Iterable<Asset> assets,
List<String> sharedUserIds, List<String> sharedUserIds,
) async { ) async {
try { try {
@@ -65,10 +66,13 @@ class AlbumService {
} }
Future<AlbumResponseDto?> createAlbumWithGeneratedName( Future<AlbumResponseDto?> createAlbumWithGeneratedName(
Set<AssetResponseDto> assets, Iterable<Asset> assets,
) async { ) async {
return createAlbum( return createAlbum(
_getNextAlbumName(await getAlbums(isShared: false)), assets, []); _getNextAlbumName(await getAlbums(isShared: false)),
assets,
[],
);
} }
Future<AlbumResponseDto?> getAlbumDetail(String albumId) async { Future<AlbumResponseDto?> getAlbumDetail(String albumId) async {
@@ -81,7 +85,7 @@ class AlbumService {
} }
Future<AddAssetsResponseDto?> addAdditionalAssetToAlbum( Future<AddAssetsResponseDto?> addAdditionalAssetToAlbum(
Set<AssetResponseDto> assets, Iterable<Asset> assets,
String albumId, String albumId,
) async { ) async {
try { try {

View File

@@ -1,5 +1,3 @@
import 'dart:math';
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
@@ -21,8 +19,38 @@ class AlbumThumbnailCard extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var box = Hive.box(userInfoBox); var box = Hive.box(userInfoBox);
var cardSize = MediaQuery.of(context).size.width / 2 - 18;
var isDarkMode = Theme.of(context).brightness == Brightness.dark;
final cardSize = MediaQuery.of(context).size.width / 2 - 18; buildEmptyThumbnail() {
return Container(
decoration: BoxDecoration(
color: isDarkMode ? Colors.grey[800] : Colors.grey[200],
),
child: SizedBox(
height: cardSize,
width: cardSize,
child: const Center(
child: Icon(Icons.no_photography),
),
),
);
}
buildAlbumThumbnail() {
return CachedNetworkImage(
width: cardSize,
height: cardSize,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 200),
imageUrl: getAlbumThumbnailUrl(
album,
type: ThumbnailFormat.JPEG,
),
httpHeaders: {"Authorization": "Bearer ${box.get(accessTokenKey)}"},
cacheKey: getAlbumThumbNailCacheKey(album, type: ThumbnailFormat.JPEG),
);
}
return GestureDetector( return GestureDetector(
onTap: () { onTap: () {
@@ -35,19 +63,9 @@ class AlbumThumbnailCard extends StatelessWidget {
children: [ children: [
ClipRRect( ClipRRect(
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
child: CachedNetworkImage( child: album.albumThumbnailAssetId == null
memCacheHeight: max(400, cardSize.toInt() * 3), ? buildEmptyThumbnail()
width: cardSize, : buildAlbumThumbnail(),
height: cardSize,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 200),
imageUrl:
getAlbumThumbnailUrl(album, type: ThumbnailFormat.JPEG),
httpHeaders: {
"Authorization": "Bearer ${box.get(accessTokenKey)}"
},
cacheKey: "${album.albumThumbnailAssetId}",
),
), ),
Padding( Padding(
padding: const EdgeInsets.only(top: 8.0), padding: const EdgeInsets.only(top: 8.0),

View File

@@ -34,7 +34,7 @@ class AlbumViewerAppbar extends HookConsumerWidget with PreferredSizeWidget {
final newAlbumTitle = ref.watch(albumViewerProvider).editTitleText; final newAlbumTitle = ref.watch(albumViewerProvider).editTitleText;
final isEditAlbum = ref.watch(albumViewerProvider).isEditAlbum; final isEditAlbum = ref.watch(albumViewerProvider).isEditAlbum;
void _onDeleteAlbumPressed(String albumId) async { void onDeleteAlbumPressed(String albumId) async {
ImmichLoadingOverlayController.appLoader.show(); ImmichLoadingOverlayController.appLoader.show();
bool isSuccess = bool isSuccess =
@@ -62,7 +62,7 @@ class AlbumViewerAppbar extends HookConsumerWidget with PreferredSizeWidget {
ImmichLoadingOverlayController.appLoader.hide(); ImmichLoadingOverlayController.appLoader.hide();
} }
void _onLeaveAlbumPressed(String albumId) async { void onLeaveAlbumPressed(String albumId) async {
ImmichLoadingOverlayController.appLoader.show(); ImmichLoadingOverlayController.appLoader.show();
bool isSuccess = bool isSuccess =
@@ -84,7 +84,7 @@ class AlbumViewerAppbar extends HookConsumerWidget with PreferredSizeWidget {
ImmichLoadingOverlayController.appLoader.hide(); ImmichLoadingOverlayController.appLoader.hide();
} }
void _onRemoveFromAlbumPressed(String albumId) async { void onRemoveFromAlbumPressed(String albumId) async {
ImmichLoadingOverlayController.appLoader.show(); ImmichLoadingOverlayController.appLoader.show();
bool isSuccess = bool isSuccess =
@@ -110,7 +110,7 @@ class AlbumViewerAppbar extends HookConsumerWidget with PreferredSizeWidget {
ImmichLoadingOverlayController.appLoader.hide(); ImmichLoadingOverlayController.appLoader.hide();
} }
_buildBottomSheetActionButton() { buildBottomSheetActionButton() {
if (isMultiSelectionEnable) { if (isMultiSelectionEnable) {
if (albumInfo.ownerId == userId) { if (albumInfo.ownerId == userId) {
return ListTile( return ListTile(
@@ -119,7 +119,7 @@ class AlbumViewerAppbar extends HookConsumerWidget with PreferredSizeWidget {
'album_viewer_appbar_share_remove', 'album_viewer_appbar_share_remove',
style: TextStyle(fontWeight: FontWeight.bold), style: TextStyle(fontWeight: FontWeight.bold),
).tr(), ).tr(),
onTap: () => _onRemoveFromAlbumPressed(albumId), onTap: () => onRemoveFromAlbumPressed(albumId),
); );
} else { } else {
return const SizedBox(); return const SizedBox();
@@ -132,7 +132,7 @@ class AlbumViewerAppbar extends HookConsumerWidget with PreferredSizeWidget {
'album_viewer_appbar_share_delete', 'album_viewer_appbar_share_delete',
style: TextStyle(fontWeight: FontWeight.bold), style: TextStyle(fontWeight: FontWeight.bold),
).tr(), ).tr(),
onTap: () => _onDeleteAlbumPressed(albumId), onTap: () => onDeleteAlbumPressed(albumId),
); );
} else { } else {
return ListTile( return ListTile(
@@ -141,13 +141,13 @@ class AlbumViewerAppbar extends HookConsumerWidget with PreferredSizeWidget {
'album_viewer_appbar_share_leave', 'album_viewer_appbar_share_leave',
style: TextStyle(fontWeight: FontWeight.bold), style: TextStyle(fontWeight: FontWeight.bold),
).tr(), ).tr(),
onTap: () => _onLeaveAlbumPressed(albumId), onTap: () => onLeaveAlbumPressed(albumId),
); );
} }
} }
} }
void _buildBottomSheet() { void buildBottomSheet() {
showModalBottomSheet( showModalBottomSheet(
backgroundColor: Theme.of(context).scaffoldBackgroundColor, backgroundColor: Theme.of(context).scaffoldBackgroundColor,
isScrollControlled: false, isScrollControlled: false,
@@ -157,7 +157,7 @@ class AlbumViewerAppbar extends HookConsumerWidget with PreferredSizeWidget {
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
_buildBottomSheetActionButton(), buildBottomSheetActionButton(),
], ],
), ),
); );
@@ -165,7 +165,7 @@ class AlbumViewerAppbar extends HookConsumerWidget with PreferredSizeWidget {
); );
} }
_buildLeadingButton() { buildLeadingButton() {
if (isMultiSelectionEnable) { if (isMultiSelectionEnable) {
return IconButton( return IconButton(
onPressed: () => ref onPressed: () => ref
@@ -204,7 +204,7 @@ class AlbumViewerAppbar extends HookConsumerWidget with PreferredSizeWidget {
return AppBar( return AppBar(
elevation: 0, elevation: 0,
leading: _buildLeadingButton(), leading: buildLeadingButton(),
title: isMultiSelectionEnable title: isMultiSelectionEnable
? Text('${selectedAssetsInAlbum.length}') ? Text('${selectedAssetsInAlbum.length}')
: null, : null,
@@ -212,7 +212,7 @@ class AlbumViewerAppbar extends HookConsumerWidget with PreferredSizeWidget {
actions: [ actions: [
IconButton( IconButton(
splashRadius: 25, splashRadius: 25,
onPressed: _buildBottomSheet, onPressed: buildBottomSheet,
icon: const Icon(Icons.more_horiz_rounded), icon: const Icon(Icons.more_horiz_rounded),
), ),
], ],

View File

@@ -1,18 +1,15 @@
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/hive_box.dart';
import 'package:immich_mobile/modules/login/providers/authentication.provider.dart'; import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
import 'package:immich_mobile/modules/album/providers/asset_selection.provider.dart'; import 'package:immich_mobile/modules/album/providers/asset_selection.provider.dart';
import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/routing/router.dart';
import 'package:immich_mobile/utils/image_url_builder.dart'; import 'package:immich_mobile/shared/models/asset.dart';
import 'package:openapi/api.dart'; import 'package:immich_mobile/shared/ui/immich_image.dart';
class AlbumViewerThumbnail extends HookConsumerWidget { class AlbumViewerThumbnail extends HookConsumerWidget {
final AssetResponseDto asset; final Asset asset;
final List<AssetResponseDto> assetList; final List<Asset> assetList;
final bool showStorageIndicator; final bool showStorageIndicator;
const AlbumViewerThumbnail({ const AlbumViewerThumbnail({
@@ -24,15 +21,13 @@ class AlbumViewerThumbnail extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
var box = Hive.box(userInfoBox);
var thumbnailRequestUrl = getThumbnailUrl(asset);
var deviceId = ref.watch(authenticationProvider).deviceId; var deviceId = ref.watch(authenticationProvider).deviceId;
final selectedAssetsInAlbumViewer = final selectedAssetsInAlbumViewer =
ref.watch(assetSelectionProvider).selectedAssetsInAlbumViewer; ref.watch(assetSelectionProvider).selectedAssetsInAlbumViewer;
final isMultiSelectionEnable = final isMultiSelectionEnable =
ref.watch(assetSelectionProvider).isMultiselectEnable; ref.watch(assetSelectionProvider).isMultiselectEnable;
_viewAsset() { viewAsset() {
AutoRouter.of(context).push( AutoRouter.of(context).push(
GalleryViewerRoute( GalleryViewerRoute(
asset: asset, asset: asset,
@@ -52,18 +47,18 @@ class AlbumViewerThumbnail extends HookConsumerWidget {
} }
} }
_enableMultiSelection() { enableMultiSelection() {
ref.watch(assetSelectionProvider.notifier).enableMultiselection(); ref.watch(assetSelectionProvider.notifier).enableMultiselection();
ref ref
.watch(assetSelectionProvider.notifier) .watch(assetSelectionProvider.notifier)
.addAssetsInAlbumViewer([asset]); .addAssetsInAlbumViewer([asset]);
} }
_disableMultiSelection() { disableMultiSelection() {
ref.watch(assetSelectionProvider.notifier).disableMultiselection(); ref.watch(assetSelectionProvider.notifier).disableMultiselection();
} }
_buildVideoLabel() { buildVideoLabel() {
return Positioned( return Positioned(
top: 5, top: 5,
right: 5, right: 5,
@@ -85,7 +80,7 @@ class AlbumViewerThumbnail extends HookConsumerWidget {
); );
} }
_buildAssetStoreLocationIcon() { buildAssetStoreLocationIcon() {
return Positioned( return Positioned(
right: 10, right: 10,
bottom: 5, bottom: 5,
@@ -99,7 +94,7 @@ class AlbumViewerThumbnail extends HookConsumerWidget {
); );
} }
_buildAssetSelectionIcon() { buildAssetSelectionIcon() {
bool isSelected = selectedAssetsInAlbumViewer.contains(asset); bool isSelected = selectedAssetsInAlbumViewer.contains(asset);
return Positioned( return Positioned(
@@ -117,41 +112,21 @@ class AlbumViewerThumbnail extends HookConsumerWidget {
); );
} }
_buildThumbnailImage() { buildThumbnailImage() {
return Container( return Container(
decoration: BoxDecoration(border: drawBorderColor()), decoration: BoxDecoration(border: drawBorderColor()),
child: CachedNetworkImage( child: ImmichImage(asset, width: 300, height: 300),
cacheKey: asset.id,
width: 300,
height: 300,
memCacheHeight: 200,
fit: BoxFit.cover,
imageUrl: thumbnailRequestUrl,
httpHeaders: {"Authorization": "Bearer ${box.get(accessTokenKey)}"},
fadeInDuration: const Duration(milliseconds: 250),
progressIndicatorBuilder: (context, url, downloadProgress) =>
Transform.scale(
scale: 0.2,
child: CircularProgressIndicator(value: downloadProgress.progress),
),
errorWidget: (context, url, error) {
return Icon(
Icons.image_not_supported_outlined,
color: Theme.of(context).primaryColor,
);
},
),
); );
} }
_handleSelectionGesture() { handleSelectionGesture() {
if (selectedAssetsInAlbumViewer.contains(asset)) { if (selectedAssetsInAlbumViewer.contains(asset)) {
ref ref
.watch(assetSelectionProvider.notifier) .watch(assetSelectionProvider.notifier)
.removeAssetsInAlbumViewer([asset]); .removeAssetsInAlbumViewer([asset]);
if (selectedAssetsInAlbumViewer.isEmpty) { if (selectedAssetsInAlbumViewer.isEmpty) {
_disableMultiSelection(); disableMultiSelection();
} }
} else { } else {
ref ref
@@ -161,14 +136,14 @@ class AlbumViewerThumbnail extends HookConsumerWidget {
} }
return GestureDetector( return GestureDetector(
onTap: isMultiSelectionEnable ? _handleSelectionGesture : _viewAsset, onTap: isMultiSelectionEnable ? handleSelectionGesture : viewAsset,
onLongPress: _enableMultiSelection, onLongPress: enableMultiSelection,
child: Stack( child: Stack(
children: [ children: [
_buildThumbnailImage(), buildThumbnailImage(),
if (showStorageIndicator) _buildAssetStoreLocationIcon(), if (showStorageIndicator) buildAssetStoreLocationIcon(),
if (asset.type != AssetTypeEnum.IMAGE) _buildVideoLabel(), if (!asset.isImage) buildVideoLabel(),
if (isMultiSelectionEnable) _buildAssetSelectionIcon(), if (isMultiSelectionEnable) buildAssetSelectionIcon(),
], ],
), ),
); );

View File

@@ -1,10 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/modules/album/ui/selection_thumbnail_image.dart'; import 'package:immich_mobile/modules/album/ui/selection_thumbnail_image.dart';
import 'package:openapi/api.dart'; import 'package:immich_mobile/shared/models/asset.dart';
class AssetGridByMonth extends HookConsumerWidget { class AssetGridByMonth extends HookConsumerWidget {
final List<AssetResponseDto> assetGroup; final List<Asset> assetGroup;
const AssetGridByMonth({Key? key, required this.assetGroup}) const AssetGridByMonth({Key? key, required this.assetGroup})
: super(key: key); : super(key: key);
@override @override

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