Compare commits

...

8 Commits

Author SHA1 Message Date
github-actions
31dd15ce8a chore: version v1.129.0 2025-03-05 19:47:50 +00:00
Alex
6108587c8b fix(web): show tags timeline (#16617)
* fix(web): show tags timeline

* fix(web): show tags timeline
2025-03-05 13:36:56 -06:00
Alex
3e50f668d9 feat(mobile): add catalan i18n (#16616)
* feat(mobile): Add Catalan

* refactor

* fix: load correct file

* chore: remove unused language files
2025-03-05 11:47:31 -06:00
Daniel Dietzler
9b82617e22 docs: 60k stars! (#16618)
60k stars! 
2025-03-05 11:40:45 -06:00
Alex
76cb32d8d0 chore(mobile): translations update (#16615)
chore(mobile): translation update
2025-03-05 16:33:41 +00:00
Yaros
e8f3348833 fix(mobile): Fixed zh-Hans not persisting (#16608)
Fixed zh-Hans not persisting
2025-03-05 09:56:00 -06:00
Zack Pollard
9922c8de59 fix: storage template failure after re-upload and previous fail (#16611)
fix: storage template breaks when files are re-uploaded after a move failure
2025-03-05 15:00:37 +00:00
shenlong
3f4bbab4eb fix: isar crash on resume from app detach (#16599)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-03-05 08:28:40 -06:00
42 changed files with 495 additions and 196 deletions

6
cli/package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "@immich/cli",
"version": "2.2.52",
"version": "2.2.53",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@immich/cli",
"version": "2.2.52",
"version": "2.2.53",
"license": "GNU Affero General Public License version 3",
"dependencies": {
"chokidar": "^4.0.3",
@@ -55,7 +55,7 @@
},
"../open-api/typescript-sdk": {
"name": "@immich/sdk",
"version": "1.128.0",
"version": "1.129.0",
"dev": true,
"license": "GNU Affero General Public License version 3",
"dependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "@immich/cli",
"version": "2.2.52",
"version": "2.2.53",
"description": "Command Line Interface (CLI) for Immich",
"type": "module",
"exports": "./dist/index.js",
@@ -72,4 +72,4 @@
"volta": {
"node": "22.14.0"
}
}
}

View File

@@ -242,6 +242,13 @@ const roadmap: Item[] = [
];
const milestones: Item[] = [
{
icon: mdiStar,
iconColor: 'gold',
title: '60,000 Stars',
description: 'Reached 60K Stars on GitHub!',
getDateLabel: withLanguage(new Date(2025, 2, 4)),
},
withRelease({
icon: mdiLinkEdit,
iconColor: 'crimson',

View File

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

13
e2e/package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "immich-e2e",
"version": "1.128.0",
"version": "1.129.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "immich-e2e",
"version": "1.128.0",
"version": "1.129.0",
"license": "GNU Affero General Public License version 3",
"devDependencies": {
"@eslint/eslintrc": "^3.1.0",
@@ -45,13 +45,15 @@
},
"../cli": {
"name": "@immich/cli",
"version": "2.2.52",
"version": "2.2.53",
"dev": true,
"license": "GNU Affero General Public License version 3",
"dependencies": {
"chokidar": "^4.0.3",
"fast-glob": "^3.3.2",
"fastq": "^1.17.1",
"lodash-es": "^4.17.21"
"lodash-es": "^4.17.21",
"micromatch": "^4.0.8"
},
"bin": {
"immich": "dist/index.js"
@@ -63,6 +65,7 @@
"@types/byte-size": "^8.1.0",
"@types/cli-progress": "^3.11.0",
"@types/lodash-es": "^4.17.12",
"@types/micromatch": "^4.0.9",
"@types/mock-fs": "^4.13.1",
"@types/node": "^22.13.5",
"@typescript-eslint/eslint-plugin": "^8.15.0",
@@ -92,7 +95,7 @@
},
"../open-api/typescript-sdk": {
"name": "@immich/sdk",
"version": "1.128.0",
"version": "1.129.0",
"dev": true,
"license": "GNU Affero General Public License version 3",
"dependencies": {

View File

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

View File

@@ -66,8 +66,8 @@ download:
locale_code: es-MX
- file: mobile/assets/i18n/sv-FI.json
locale_code: sv-FI
- file: mobile/assets/i18n/ca-CA.json
locale_code: ca-CA
- file: mobile/assets/i18n/ca.json
locale_code: ca
- file: mobile/assets/i18n/hu-HU.json
locale_code: hu-HU
- file: mobile/assets/i18n/lv-LV.json

View File

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

View File

@@ -70,6 +70,7 @@ custom_lint:
- lib/infrastructure/repositories/{store,db,log}.repository.dart
- lib/providers/infrastructure/db.provider.dart
# acceptable exceptions for the time being (until Isar is fully replaced)
- lib/providers/app_life_cycle.provider.dart
- integration_test/test_utils/general_helper.dart
- lib/main.dart
- lib/pages/album/album_asset_selection.page.dart

View File

@@ -35,8 +35,8 @@ platform :android do
task: 'bundle',
build_type: 'Release',
properties: {
"android.injected.version.code" => 186,
"android.injected.version.name" => "1.128.0",
"android.injected.version.code" => 187,
"android.injected.version.name" => "1.129.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')

View File

@@ -1,24 +1,35 @@
{
"action_common_cancel": "Cancel·la",
"action_common_update": "Actualitza",
"add_to_album_bottom_sheet_added": "S'ha afegit a {album}",
"add_to_album_bottom_sheet_already_exists": "Ja es troba en {album}",
"action_common_back": "Enrere",
"action_common_cancel": "Cancel·lar",
"action_common_clear": "Buida",
"action_common_confirm": "Confirmar",
"action_common_save": "Desa",
"action_common_select": "Selecciona",
"action_common_update": "Actualitzar",
"add_a_name": "Afegeix un nom",
"add_endpoint": "afegir endpoint",
"add_to_album_bottom_sheet_added": "Added to {album}",
"add_to_album_bottom_sheet_already_exists": "Already in {album}",
"advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_prefer_remote_subtitle": "Some devices are painfully slow to load thumbnails from assets on the device. Activate this setting to load remote images instead.",
"advanced_settings_prefer_remote_title": "Prefereix imatges remotes",
"advanced_settings_proxy_headers_subtitle": "Definiu les capçaleres de proxy que Immich per enviar amb cada sol·licitud de xarxa",
"advanced_settings_proxy_headers_title": "Capçaleres de proxy",
"advanced_settings_self_signed_ssl_subtitle": "Skips SSL certificate verification for the server endpoint. Required for self-signed certificates.",
"advanced_settings_self_signed_ssl_title": "Allow self-signed SSL certificates",
"advanced_settings_tile_subtitle": "Configuració avançada",
"advanced_settings_tile_subtitle": "Advanced user's settings",
"advanced_settings_tile_title": "Avançat",
"advanced_settings_troubleshooting_subtitle": "Enable additional features for troubleshooting",
"advanced_settings_troubleshooting_title": "Resolució de problemes",
"album_info_card_backup_album_excluded": "Exclosos",
"album_info_card_backup_album_included": "Inclosos",
"album_thumbnail_card_item": "1 element",
"album_thumbnail_card_items": "{} elements",
"album_thumbnail_card_shared": " · Compartit",
"albums": "Àlbums",
"album_thumbnail_card_item": "1 item",
"album_thumbnail_card_items": "{} items",
"album_thumbnail_card_shared": " · Shared",
"album_thumbnail_owned": "Owned",
"album_thumbnail_shared_by": "Compartit per {}",
"album_viewer_appbar_delete_confirm": "Confirmes que vols suprimir aquest àlbum del teu compte?",
"album_viewer_appbar_share_delete": "Esborra l'àlbum",
"album_viewer_appbar_share_err_delete": "Error al esborrar l'àlbum",
"album_viewer_appbar_share_err_leave": "Error al sortir de l'àlbum",
@@ -28,25 +39,39 @@
"album_viewer_appbar_share_remove": "Treu de l'àlbum",
"album_viewer_appbar_share_to": "Share To",
"album_viewer_page_share_add_users": "Afegeix usuaris",
"all": "Tot",
"all_people_page_title": "Persones",
"all_videos_page_title": "Vídeos",
"app_bar_signout_dialog_content": "Are you sure you want to sign out?",
"app_bar_signout_dialog_ok": "Yes",
"app_bar_signout_dialog_title": "Sign out",
"archived": "Arxivat",
"archive_page_no_archived_assets": "No s'ha trobat res arxivat",
"archive_page_title": "Arxiu({})",
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_list_group_by_sub_title": "Group by",
"asset_action_delete_err_read_only": "No es poden esborrar el fitxer(s) de només lectura, ometent",
"asset_action_share_err_offline": "No s'ha pogut obtenir el fitxer(s) sense connexió, ometent",
"asset_list_group_by_sub_title": "Agrupar per",
"asset_list_layout_settings_dynamic_layout_title": "Dynamic layout",
"asset_list_layout_settings_group_automatically": "Automàtic",
"asset_list_layout_settings_group_by": "Group assets by",
"asset_list_layout_settings_group_by_month": "Month",
"asset_list_layout_settings_group_by_month_day": "Month + day",
"asset_list_layout_sub_title": "Layout",
"asset_list_layout_sub_title": "Disseny",
"asset_list_settings_subtitle": "Photo grid layout settings",
"asset_list_settings_title": "Photo Grid",
"asset_viewer_settings_title": "Asset Viewer",
"asset_restored_successfully": "Element recuperat correctament",
"assets_deleted_permanently": "{} element(s) esborrats permanentment",
"assets_deleted_permanently_from_server": "{} element(s) esborrats permanentment del servidor d'Immich",
"assets_removed_permanently_from_device": "{} element(s) esborrat permanentment del dispositiu",
"assets_restored_successfully": "{} element(s) recuperats correctament",
"assets_trashed": "{} element(s) enviat a la paperera",
"assets_trashed_from_server": "{} element(s) enviat a la paperera del servidor d'Immich",
"asset_viewer_settings_subtitle": "Gestiona la configuració del visualitzador de la galeria",
"asset_viewer_settings_title": "Visor d'arxius",
"automatic_endpoint_switching_subtitle": "Connecteu-vos localment a través de la Wi-Fi designada quan estigui disponible i utilitzeu connexions alternatives en altres llocs",
"automatic_endpoint_switching_title": "Canvi automàtic d'URL",
"background_location_permission": "Permís d'ubicació en segon pla",
"background_location_permission_content": "Per canviar de xarxa quan s'executa en segon pla, Immich ha de *sempre* tenir accés a la ubicació precisa perquè l'aplicació pugui llegir el nom de la xarxa Wi-Fi",
"backup_album_selection_page_albums_device": "Àlbums al dispositiu ({})",
"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.",
@@ -108,9 +133,11 @@
"backup_info_card_assets": "elements",
"backup_manual_cancelled": "Cancelled",
"backup_manual_failed": "Failed",
"backup_manual_in_progress": "Upload already in progress. Try after some time",
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
"backup_manual_success": "Success",
"backup_manual_title": "Upload status",
"backup_options_page_title": "Opcions de còpia de seguretat",
"backup_setting_subtitle": "Gestiona la configuració de càrrega en segon pla i en primer pla",
"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.",
@@ -129,73 +156,136 @@
"cache_settings_tile_subtitle": "Control the local storage behaviour",
"cache_settings_tile_title": "Local Storage",
"cache_settings_title": "Configuració de la memòria cau",
"cancel": "Cancel·la",
"canceled": "Cancel·lat",
"change_display_order": "Canvia l'ordre de visualització",
"change_password_form_confirm_password": "Confirma la contrasenya",
"change_password_form_description": "Hi {name},\n\nThis is either the first time you are signing into the system or a request has been made to change your password. Please enter the new password below.",
"change_password_form_new_password": "New Password",
"change_password_form_password_mismatch": "Passwords do not match",
"change_password_form_reenter_new_password": "Re-enter New Password",
"check_corrupt_asset_backup": "Comprovar les còpies de seguretat corruptes",
"check_corrupt_asset_backup_button": "Realitzar comprovació",
"check_corrupt_asset_backup_description": "Executeu aquesta comprovació només mitjançant Wi-Fi i un cop s'hagi fet una còpia de seguretat de tots els actius. El procediment pot trigar uns minuts.",
"client_cert_dialog_msg_confirm": "OK",
"client_cert_enter_password": "Introdueix la contrasenya",
"client_cert_import": "Importar",
"client_cert_import_success_msg": "S'ha importat el certificat del client",
"client_cert_invalid_msg": "Fitxer de certificat no vàlid o contrasenya incorrecta",
"client_cert_remove": "Eliminar",
"client_cert_remove_msg": "S'ha eliminat el certificat del client",
"client_cert_subtitle": "Només admet el format PKCS12 (.p12, .pfx). La importació/eliminació de certificats només està disponible abans d'iniciar sessió",
"client_cert_title": "Certificat de client SSL",
"common_add_to_album": "Add to album",
"common_change_password": "Change Password",
"common_create_new_album": "Crea un àlbum nou",
"common_server_error": "Please check your network connection, make sure the server is reachable and app/server versions are compatible.",
"common_shared": "Compartit",
"completed": "Completat",
"contextual_search": "Sortida del sol a la platja",
"control_bottom_app_bar_add_to_album": "Add to album",
"control_bottom_app_bar_album_info": "{} elements",
"control_bottom_app_bar_album_info_shared": "{} elements - Compartits",
"control_bottom_app_bar_archive": "Arxiu",
"control_bottom_app_bar_create_new_album": "Crea un àlbum nou",
"control_bottom_app_bar_delete": "Esborra",
"control_bottom_app_bar_delete_from_immich": "Delete from Immich",
"control_bottom_app_bar_delete_from_local": "Delete from device",
"control_bottom_app_bar_delete_from_immich": "Suprimeix del Immich",
"control_bottom_app_bar_delete_from_local": "Suprimeix del dispositiu",
"control_bottom_app_bar_download": "Descarrega",
"control_bottom_app_bar_edit": "Edita",
"control_bottom_app_bar_edit_location": "Edit Location",
"control_bottom_app_bar_edit_time": "Edit Date & Time",
"control_bottom_app_bar_favorite": "Preferit",
"control_bottom_app_bar_share": "Share",
"control_bottom_app_bar_share_to": "Share To",
"control_bottom_app_bar_stack": "Stack",
"control_bottom_app_bar_trash_from_immich": "Move to Trash",
"control_bottom_app_bar_trash_from_immich": "Mou a paperera",
"control_bottom_app_bar_unarchive": "Desarxiva",
"control_bottom_app_bar_unfavorite": "Unfavorite",
"control_bottom_app_bar_upload": "Upload",
"create_album": "Crear àlbum",
"create_album_page_untitled": "Untitled",
"create_new": "CREAR NOU",
"create_shared_album_page_create": "Create",
"create_shared_album_page_share": "Comparteix",
"create_shared_album_page_share_add_assets": "AFEGEIX ELEMENTS",
"create_shared_album_page_share_select_photos": "Escull fotografies",
"crop": "Retalla",
"curated_location_page_title": "Localitzacions",
"curated_object_page_title": "Coses",
"current_server_address": "Current server address",
"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": "These items will be permanently deleted from Immich and from your device",
"delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server",
"delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device",
"delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server",
"delete_dialog_alert_local": "Aquests elements s'eliminaran permanentment del vostre dispositiu, però encara estaran disponibles al servidor Immich",
"delete_dialog_alert_local_non_backed_up": "Alguns dels elements no tenen còpia de seguretat a Immich i s'eliminaran permanentment del dispositiu",
"delete_dialog_alert_remote": "Aquests elements s'eliminaran permanentment del servidor Immich",
"delete_dialog_cancel": "Cancel·la",
"delete_dialog_ok": "Esborra",
"delete_dialog_ok_force": "Delete Anyway",
"delete_dialog_ok_force": "Suprimeix de totes maneres",
"delete_dialog_title": "Esborra permanentment",
"delete_local_dialog_ok_backed_up_only": "Delete Backed Up Only",
"delete_local_dialog_ok_force": "Delete Anyway",
"delete_local_dialog_ok_backed_up_only": "Esborrar només les que tinguin còpia de seguretat",
"delete_local_dialog_ok_force": "Suprimeix de totes maneres",
"delete_shared_link_dialog_content": "Are you sure you want to delete this shared link?",
"delete_shared_link_dialog_title": "Delete Shared Link",
"description_input_hint_text": "Afegeix descripció...",
"description_input_submit_error": "Error updating description, check the log for more details",
"edit_date_time_dialog_date_time": "Date and Time",
"edit_date_time_dialog_timezone": "Timezone",
"edit_location_dialog_title": "Location",
"description_search": "Jornada de senderisme a Sapa",
"download_canceled": "Descàrrega cancel·lada",
"download_complete": "Descàrrega completada",
"download_enqueue": "Descàrrega en cua",
"download_error": "Error de descàrrega",
"download_failed": "Descàrrega ha fallat",
"download_filename": "arxiu: {}",
"download_finished": "Descàrrega acabada",
"downloading": "Descarregant...",
"downloading_media": "Descàrrega multimèdia",
"download_notfound": "No s'ha trobat la descàrrega",
"download_paused": "Descàrrega pausada",
"download_started": "Descàrrega ha començat",
"download_sucess": "Descarregat amb èxit",
"download_sucess_android": "El multimedia s'ha descarregat a DCIM/Immich",
"download_waiting_to_retry": "Esperant per tornar-ho a intentar",
"edit_date_time_dialog_date_time": "Data i Hora",
"edit_date_time_dialog_search_timezone": "Cerca zona horària...",
"edit_date_time_dialog_timezone": "Zona horària",
"edit_image_title": "Editar",
"edit_location_dialog_title": "Ubicació",
"end_date": "Data final",
"enqueued": "En cua",
"enter_wifi_name": "Introdueix el nom de WiFi",
"error_change_sort_album": "No s'ha pogut canviar l'ordre d'ordenació dels àlbums",
"error_saving_image": "Error: {}",
"exif_bottom_sheet_description": "Afegeix descripció",
"exif_bottom_sheet_details": "DETALLS",
"exif_bottom_sheet_location": "UBICACIÓ",
"exif_bottom_sheet_location_add": "Add a location",
"exif_bottom_sheet_people": "PEOPLE",
"exif_bottom_sheet_person_add_person": "Add name",
"exif_bottom_sheet_people": "PERSONES",
"exif_bottom_sheet_person_add_person": "Afegir nom",
"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",
"external_network": "Xarxa externa",
"external_network_sheet_info": "Quan no estigui a la xarxa WiFi preferida, l'aplicació es connectarà al servidor mitjançant el primer dels URL següents a què pot arribar, començant de dalt a baix.",
"failed": "Fallat",
"favorites": "Favorits",
"favorites_page_no_favorites": "No s'han trobat preferits",
"favorites_page_title": "Favorites",
"filename_search": "Nom o extensió del fitxer",
"filter": "Filtrar",
"get_wifiname_error": "No s'ha pogut obtenir el nom de la Wi-Fi. Assegureu-vos que heu concedit els permisos necessaris i que esteu connectat a una xarxa Wi-Fi",
"grant_permission": "Grant permission",
"haptic_feedback_switch": "Activa la resposta hàptica",
"haptic_feedback_title": "Resposta Hàptica",
"header_settings_add_header_tip": "Afegeix Capçalera",
"header_settings_field_validator_msg": "El valor no pot estar buit",
"header_settings_header_name_input": "Nom de la capçalera",
"header_settings_header_value_input": "Valor de la capçalera",
"header_settings_page_title": "Capçaleres de proxy",
"headers_settings_tile_subtitle": "Definiu les capçaleres de proxy que l'aplicació hauria d'enviar amb cada sol·licitud de xarxa",
"headers_settings_tile_title": "Custom proxy headers",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.",
"home_page_add_to_album_err_local": "Can not add local assets to albums yet, skipping",
"home_page_add_to_album_success": "Added {added} assets to album {album}.",
@@ -204,16 +294,22 @@
"home_page_archive_err_partner": "Can not archive partner assets, skipping",
"home_page_building_timeline": "Building the timeline",
"home_page_delete_err_partner": "Can not delete partner assets, skipping",
"home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping",
"home_page_delete_remote_err_local": "Elements locals a la selecció d'eliminació remota, ometent",
"home_page_favorite_err_local": "Can not favorite local assets yet, skipping",
"home_page_favorite_err_partner": "Can not favorite partner assets yet, skipping",
"home_page_first_time_notice": "If this is your first time using the app, please make sure to choose a backup album(s) so that the timeline can populate photos and videos in the album(s).",
"home_page_share_err_local": "Can not share local assets via link, skipping",
"home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping",
"ignore_icloud_photos": "Ignora fotos d'iCloud",
"ignore_icloud_photos_description": "Les fotos emmagatzemades a iCloud no es penjaran al servidor Immich",
"image_saved_successfully": "Imatge desada",
"image_viewer_page_state_provider_download_error": "Download Error",
"image_viewer_page_state_provider_download_started": "Download Started",
"image_viewer_page_state_provider_download_started": "Descàrrega començada",
"image_viewer_page_state_provider_download_success": "Download Success",
"image_viewer_page_state_provider_share_error": "Share Error",
"invalid_date": "Data invàlida",
"invalid_date_format": "Format de data invàlid",
"library": "Llibreria",
"library_page_albums": "Àlbums",
"library_page_archive": "Arxiu",
"library_page_device_albums": "Àlbums al Dispositiu",
@@ -226,13 +322,17 @@
"library_page_sort_most_oldest_photo": "Oldest photo",
"library_page_sort_most_recent_photo": "Most recent photo",
"library_page_sort_title": "Album title",
"location_picker_choose_on_map": "Choose on map",
"location_picker_latitude": "Latitude",
"location_picker_latitude_error": "Enter a valid latitude",
"local_network": "Xarxa local",
"local_network_sheet_info": "L'aplicació es connectarà al servidor mitjançant aquest URL quan utilitzeu la xarxa Wi-Fi especificada",
"location_permission": "Permís d'ubicació",
"location_permission_content": "Per utilitzar la funció de canvi automàtic, Immich necessita un permís de ubicació precisa perquè pugui llegir el nom de la xarxa WiFi actual",
"location_picker_choose_on_map": "Escollir en el mapa",
"location_picker_latitude": "Latitud",
"location_picker_latitude_error": "Introdueix una latitud vàlida",
"location_picker_latitude_hint": "Enter your latitude here",
"location_picker_longitude": "Longitude",
"location_picker_longitude_error": "Enter a valid longitude",
"location_picker_longitude_hint": "Enter your longitude here",
"location_picker_longitude": "Longitud",
"location_picker_longitude_error": "Introdueix una longitud vàlida",
"location_picker_longitude_hint": "Introdueix aquí la longitud",
"login_disabled": "Login has been disabled",
"login_form_api_exception": "API exception. Please check the server URL and try again.",
"login_form_back_button_text": "Back",
@@ -258,12 +358,12 @@
"login_form_server_error": "Could not connect to server.",
"login_password_changed_error": "There was an error updating your password",
"login_password_changed_success": "Password updated successfully",
"map_assets_in_bound": "{} photo",
"map_assets_in_bounds": "{} photos",
"map_assets_in_bound": "{} foto",
"map_assets_in_bounds": "{} fotos",
"map_cannot_get_user_location": "Cannot get user's location",
"map_location_dialog_cancel": "Cancel",
"map_location_dialog_yes": "Yes",
"map_location_picker_page_use_location": "Use this location",
"map_location_picker_page_use_location": "Utilitzar aquesta ubicació",
"map_location_service_disabled_content": "Location service needs to be enabled to display assets from your current location. Do you want to enable it now?",
"map_location_service_disabled_title": "Location Service disabled",
"map_no_assets_in_bounds": "No photos in this area",
@@ -271,32 +371,44 @@
"map_no_location_permission_title": "Location Permission denied",
"map_settings_dark_mode": "Dark mode",
"map_settings_date_range_option_all": "All",
"map_settings_date_range_option_day": "Past 24 hours",
"map_settings_date_range_option_days": "Past {} days",
"map_settings_date_range_option_year": "Past year",
"map_settings_date_range_option_years": "Past {} years",
"map_settings_date_range_option_day": "Últimes 24 hores",
"map_settings_date_range_option_days": "Darrers {} dies",
"map_settings_date_range_option_year": "Any passat",
"map_settings_date_range_option_years": "Darrers {} anys",
"map_settings_dialog_cancel": "Cancel",
"map_settings_dialog_save": "Save",
"map_settings_dialog_title": "Map Settings",
"map_settings_include_show_archived": "Include Archived",
"map_settings_include_show_partners": "Incloure companys",
"map_settings_only_relative_range": "Date range",
"map_settings_only_show_favorites": "Show Favorite Only",
"map_settings_theme_settings": "Map Theme",
"map_settings_theme_settings": "Tema del Mapa",
"map_zoom_to_see_photos": "Zoom out to see photos",
"memories_all_caught_up": "All caught up",
"memories_check_back_tomorrow": "Check back tomorrow for more memories",
"memories_start_over": "Start Over",
"memories_swipe_to_close": "Swipe up to close",
"memories_all_caught_up": "Posat al dia",
"memories_check_back_tomorrow": "Torna demà per veure més records",
"memories_start_over": "Torna a començar",
"memories_swipe_to_close": "Llisca per tancar",
"memories_year_ago": "Fa un any",
"memories_years_ago": "Fa {} anys",
"monthly_title_text_date_format": "MMMM y",
"motion_photos_page_title": "Motion Photos",
"multiselect_grid_edit_date_time_err_read_only": "Cannot edit date of read only asset(s), skipping",
"multiselect_grid_edit_gps_err_read_only": "Cannot edit location of read only asset(s), skipping",
"multiselect_grid_edit_date_time_err_read_only": "No es pot canviar la data del fitxer(s) de només lectura, ometent",
"multiselect_grid_edit_gps_err_read_only": "No es pot canviar la localització de fitxers de només lectura. Saltant.",
"my_albums": "Els meus àlbums",
"networking_settings": "Xarxes",
"networking_subtitle": "Gestiona la configuració del endpoint del servidor",
"no_assets_to_show": "No hi ha elements per mostrar",
"no_name": "Sense nom",
"notification_permission_dialog_cancel": "Cancel·la",
"notification_permission_dialog_content": "To enable notifications, go to Settings and select allow.",
"notification_permission_dialog_settings": "Configuració",
"notification_permission_list_tile_content": "Grant permission to enable notifications.",
"notification_permission_list_tile_enable_button": "Activa les notificacions",
"notification_permission_list_tile_title": "Notification Permission",
"not_selected": "No seleccionat",
"on_this_device": "En aquest dispositiu",
"partner_list_user_photos": "fotos de {user}",
"partner_list_view_all": "Veure tot",
"partner_page_add_partner": "Afegeix company",
"partner_page_empty_message": "Your photos are not yet shared with any partner.",
"partner_page_no_more_users": "No more users to add",
@@ -306,6 +418,9 @@
"partner_page_stop_sharing_content": "{} will no longer be able to access your photos.",
"partner_page_stop_sharing_title": "Stop sharing your photos?",
"partner_page_title": "Company",
"partners": "Companys",
"paused": "Pausat",
"people": "Persones",
"permission_onboarding_back": "Back",
"permission_onboarding_continue_anyway": "Continue anyway",
"permission_onboarding_get_started": "Get started",
@@ -316,7 +431,9 @@
"permission_onboarding_permission_granted": "Permission granted! You are all set.",
"permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.",
"permission_onboarding_request": "Immich requires permission to view your photos and videos.",
"preferences_settings_title": "Preferences",
"places": "Llocs",
"preferences_settings_subtitle": "Gestiona les preferències de l'aplicació",
"preferences_settings_title": "Preferències",
"profile_drawer_app_logs": "Logs",
"profile_drawer_client_out_of_date_major": "Mobile App is out of date. Please update to the latest major version.",
"profile_drawer_client_out_of_date_minor": "Mobile App is out of date. Please update to the latest minor version.",
@@ -328,9 +445,44 @@
"profile_drawer_settings": "Settings",
"profile_drawer_sign_out": "Tanca la sessió",
"profile_drawer_trash": "Trash",
"recently_added": "Afegit recentment",
"recently_added_page_title": "Recently Added",
"scaffold_body_error_occurred": "Error occurred",
"save": "Desa",
"save_to_gallery": "Desa a galeria",
"scaffold_body_error_occurred": "S'ha produït un error",
"search_albums": "Cerca àlbums",
"search_bar_hint": "Search your photos",
"search_filter_apply": "Aplicar filtre",
"search_filter_camera": "Càmera",
"search_filter_camera_make": "Marca",
"search_filter_camera_model": "Model",
"search_filter_camera_title": "Selecciona el tipus de càmera",
"search_filter_contextual": "Cerca per contexte",
"search_filter_date": "Data",
"search_filter_date_interval": "{start} a {end}",
"search_filter_date_title": "Selecciona un rang de dates",
"search_filter_description": "Cerca per descripció",
"search_filter_display_option_archive": "Arxivat",
"search_filter_display_option_favorite": "Favorit",
"search_filter_display_option_not_in_album": "No en àlbum",
"search_filter_display_options": "Opcions de Visualització",
"search_filter_display_options_title": "Opcions de visualització",
"search_filter_filename": "Cerca pel nom del fitxer",
"search_filter_location": "Ubicació",
"search_filter_location_city": "Ciutat",
"search_filter_location_country": "País",
"search_filter_location_state": "Estat",
"search_filter_location_title": "Selecciona l'ubicació",
"search_filter_media_type": "Tipus de multimèdia",
"search_filter_media_type_all": "Tot",
"search_filter_media_type_image": "Imatge",
"search_filter_media_type_title": "Selecciona tipus de multimèdia",
"search_filter_media_type_video": "Vídeo",
"search_filter_people": "Persones",
"search_filter_people_hint": "Filtra persones",
"search_filter_people_title": "Selecciona persones",
"search_no_more_result": "No més resultats",
"search_no_result": "No s'han trobat resultats, proveu un terme de cerca o una combinació diferents",
"search_page_categories": "Categories",
"search_page_favorites": "Preferides",
"search_page_motion_photos": "Fotografies animades",
@@ -347,6 +499,7 @@
"search_page_places": "Llocs",
"search_page_recently_added": "Afegit recentment",
"search_page_screenshots": "Captures de pantalla",
"search_page_search_photos_videos": "Cerca les teves fotos i vídeos",
"search_page_selfies": "Autofotos",
"search_page_things": "Coses",
"search_page_videos": "Videos",
@@ -359,6 +512,7 @@
"select_additional_user_for_sharing_page_suggestions": "Suggeriments",
"select_user_for_sharing_page_err_album": "Error al crear l'àlbum",
"select_user_for_sharing_page_share_suggestions": "Suggestions",
"server_endpoint": "Endpoint de Servidor",
"server_info_box_app_version": "Versió de l'aplicació",
"server_info_box_latest_release": "Latest Version",
"server_info_box_server_url": "Server URL",
@@ -368,6 +522,10 @@
"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_image_viewer_title": "Imatges",
"setting_languages_apply": "Aplicar",
"setting_languages_subtitle": "Canvia el llenguatge de l'aplicació",
"setting_languages_title": "Idiomes",
"setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}",
"setting_notifications_notify_hours": "{} hours",
"setting_notifications_notify_immediately": "immediately",
@@ -382,9 +540,15 @@
"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",
"setting_video_viewer_looping_subtitle": "Habilita per reproduir automàticament un vídeo al visualitzador de detalls.",
"setting_video_viewer_looping_title": "Bucle",
"setting_video_viewer_original_video_subtitle": "Quan reproduïu un vídeo des del servidor, reproduïu l'original encara que hi hagi una transcodificació disponible. Pot conduir a l'amortització. Els vídeos disponibles localment es reprodueixen en qualitat original independentment d'aquesta configuració.",
"setting_video_viewer_original_video_title": "Força el vídeo original",
"setting_video_viewer_title": "Vídeos",
"share_add": "Afegeix",
"share_add_photos": "Afegeix fotografies",
"share_add_title": "Afegeix un títol",
"share_assets_selected": "{} seleccionats",
"share_create_album": "Crea un àlbum",
"shared_album_activities_input_disable": "Comment is disabled",
"shared_album_activities_input_hint": "Say something",
@@ -398,6 +562,7 @@
"shared_album_section_people_owner_label": "Owner",
"shared_album_section_people_title": "PEOPLE",
"share_dialog_preparing": "Preparing...",
"shared_intent_upload_button_progress_text": "{} / {} Pujat",
"shared_link_app_bar_title": "Shared Links",
"shared_link_clipboard_copied_massage": "Copied to clipboard",
"shared_link_clipboard_text": "Link: {}\nPassword: {}",
@@ -412,13 +577,15 @@
"shared_link_edit_description": "Description",
"shared_link_edit_description_hint": "Enter the share description",
"shared_link_edit_expire_after": "Expire after",
"shared_link_edit_expire_after_option_day": "1 day",
"shared_link_edit_expire_after_option_days": "{} days",
"shared_link_edit_expire_after_option_hour": "1 hour",
"shared_link_edit_expire_after_option_hours": "{} hours",
"shared_link_edit_expire_after_option_minute": "1 minute",
"shared_link_edit_expire_after_option_minutes": "{} minutes",
"shared_link_edit_expire_after_option_day": "1 dia",
"shared_link_edit_expire_after_option_days": "{} dies",
"shared_link_edit_expire_after_option_hour": "1 hora",
"shared_link_edit_expire_after_option_hours": "{} hores",
"shared_link_edit_expire_after_option_minute": "1 minut",
"shared_link_edit_expire_after_option_minutes": "{} minuts",
"shared_link_edit_expire_after_option_months": "{} mesos",
"shared_link_edit_expire_after_option_never": "Never",
"shared_link_edit_expire_after_option_year": "any {}",
"shared_link_edit_password": "Password",
"shared_link_edit_password_hint": "Enter the share password",
"shared_link_edit_show_meta": "Show metadata",
@@ -426,65 +593,89 @@
"shared_link_empty": "You don't have any shared links",
"shared_link_error_server_url_fetch": "Cannot fetch the server url",
"shared_link_expired": "Expired",
"shared_link_expires_day": "Expires in {} day",
"shared_link_expires_days": "Expires in {} days",
"shared_link_expires_hour": "Expires in {} hour",
"shared_link_expires_hours": "Expires in {} hours",
"shared_link_expires_minute": "Expires in {} minute",
"shared_link_expires_day": "Caduca d'aquí a {} dia",
"shared_link_expires_days": "Caduca d'aquí a {} dies",
"shared_link_expires_hour": "Caduca d'aquí a {} hora",
"shared_link_expires_hours": "Caduca d'aquí a {} hores",
"shared_link_expires_minute": "Caduca d'aquí a {} minut",
"shared_link_expires_minutes": "Expires in {} minutes",
"shared_link_expires_never": "Expires ∞",
"shared_link_expires_second": "Expires in {} second",
"shared_link_expires_second": "Caduca d'aquí a {} segon",
"shared_link_expires_seconds": "Expires in {} seconds",
"shared_link_info_chip_download": "Baixa",
"shared_link_individual_shared": "Individual compartit",
"shared_link_info_chip_download": "Download",
"shared_link_info_chip_metadata": "EXIF",
"shared_link_info_chip_upload": "Puja",
"shared_link_manage_links": "Manage Shared links",
"share_done": "Fet",
"shared_link_public_album": "Àlbum públic",
"shared_links": "Enllaços compartits",
"share_done": "Done",
"shared_with_me": "Compartit amb mi",
"share_invite": "Convida a l'àlbum",
"sharing_page_album": "Àlbums compartits",
"sharing_page_album": "Shared albums",
"sharing_page_description": "Create shared albums to share photos and videos with people in your network.",
"sharing_page_empty_list": "EMPTY LIST",
"sharing_silver_appbar_create_shared_album": "Crea àlbum compartit",
"sharing_silver_appbar_shared_links": "Shared links",
"sharing_silver_appbar_share_partner": "Comparteix amb un company",
"tab_controller_nav_library": "Bibilioteca",
"tab_controller_nav_photos": "Fotos",
"start_date": "Data inicial",
"sync": "Sincronitzar",
"sync_albums": "Sincronitzar àlbums",
"sync_albums_manual_subtitle": "Sincronitza tots els vídeos i fotos penjats amb els àlbums de còpia de seguretat seleccionats",
"sync_upload_album_setting_subtitle": "Creeu i pugeu les seves fotos i vídeos als àlbums seleccionats a Immich",
"tab_controller_nav_library": "Library",
"tab_controller_nav_photos": "Fotografies",
"tab_controller_nav_search": "Cerca",
"tab_controller_nav_sharing": "Compartint",
"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": "Modes fosc",
"theme_setting_colorful_interface_subtitle": "Apliqueu color primari a les superfícies de fons.",
"theme_setting_colorful_interface_title": "Interfície colorida",
"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_primary_color_subtitle": "Trieu un color per a les accions i els accents principals.",
"theme_setting_primary_color_title": "Color primari",
"theme_setting_system_primary_color_title": "Utilitza color de sistema",
"theme_setting_system_theme_switch": "Automatic (Follow system setting)",
"theme_setting_theme_subtitle": "Choose the app's theme setting",
"theme_setting_theme_title": "Tema",
"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",
"translated_text_options": "Options",
"trash_page_delete": "Elimina",
"trash_page_delete_all": "Elimina-ho tot",
"trash_page_empty_trash_btn": "Buida la paperera",
"trash": "Paperera",
"trash_emptied": "Paperera buidada",
"trash_page_delete": "Delete",
"trash_page_delete_all": "Delete All",
"trash_page_empty_trash_btn": "Empty trash",
"trash_page_empty_trash_dialog_content": "Do you want to empty your trashed assets? These items will be permanently removed from Immich",
"trash_page_empty_trash_dialog_ok": "Ok",
"trash_page_info": "Trashed items will be permanently deleted after {} days",
"trash_page_no_assets": "No trashed assets",
"trash_page_restore": "Recupera",
"trash_page_restore_all": "Recupera-ho tot",
"trash_page_restore": "Restore",
"trash_page_restore_all": "Restore All",
"trash_page_select_assets_btn": "Select assets",
"trash_page_select_btn": "Select",
"trash_page_title": "Trash ({})",
"upload_dialog_cancel": "Cancel·la",
"upload": "Puja",
"upload_dialog_cancel": "Cancel",
"upload_dialog_info": "Do you want to backup the selected Asset(s) to the server?",
"upload_dialog_ok": "Upload",
"upload_dialog_title": "Upload Asset",
"uploading": "Pujant",
"upload_to_immich": "Puja a Immich ({})",
"use_current_connection": "utilitzar la connexió actual",
"validate_endpoint_error": "Per favor introdueix un URL vàlid",
"version_announcement_overlay_ack": "Acknowledge",
"version_announcement_overlay_release_notes": "release notes",
"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_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",
"videos": "Vídeos",
"viewer_remove_from_stack": "Remove from Stack",
"viewer_stack_use_as_main_asset": "Use as Main Asset",
"viewer_unstack": "Un-Stack"
}
"viewer_unstack": "Un-Stack",
"wifi_name": "Nom WiFi",
"your_wifi_name": "El teu nom WiFi"
}

View File

@@ -133,7 +133,7 @@
"backup_info_card_assets": "assets",
"backup_manual_cancelled": "Cancelled",
"backup_manual_failed": "Failed",
"backup_manual_in_progress": "Upload already in progress. Try after some time",
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
"backup_manual_success": "Success",
"backup_manual_title": "Upload status",
"backup_options_page_title": "Backup options",
@@ -678,4 +678,4 @@
"viewer_unstack": "Un-Stack",
"wifi_name": "WiFi Name",
"your_wifi_name": "Your WiFi name"
}
}

View File

@@ -133,7 +133,7 @@
"backup_info_card_assets": "assets",
"backup_manual_cancelled": "Cancelled",
"backup_manual_failed": "Failed",
"backup_manual_in_progress": "Upload already in progress. Try after some time",
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
"backup_manual_success": "Success",
"backup_manual_title": "Upload status",
"backup_options_page_title": "Backup options",
@@ -678,4 +678,4 @@
"viewer_unstack": "Un-Stack",
"wifi_name": "WiFi Name",
"your_wifi_name": "Your WiFi name"
}
}

View File

@@ -133,7 +133,7 @@
"backup_info_card_assets": "assets",
"backup_manual_cancelled": "Cancelled",
"backup_manual_failed": "Failed",
"backup_manual_in_progress": "Upload already in progress. Try after some time",
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
"backup_manual_success": "Success",
"backup_manual_title": "Upload status",
"backup_options_page_title": "Backup options",
@@ -678,4 +678,4 @@
"viewer_unstack": "स्टैक रद्द करें",
"wifi_name": "WiFi Name",
"your_wifi_name": "Your WiFi name"
}
}

View File

@@ -133,7 +133,7 @@
"backup_info_card_assets": "assets",
"backup_manual_cancelled": "Cancelled",
"backup_manual_failed": "Failed",
"backup_manual_in_progress": "Upload already in progress. Try after some time",
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
"backup_manual_success": "Success",
"backup_manual_title": "Upload status",
"backup_options_page_title": "Backup options",
@@ -678,4 +678,4 @@
"viewer_unstack": "Un-Stack",
"wifi_name": "WiFi Name",
"your_wifi_name": "Your WiFi name"
}
}

View File

@@ -133,7 +133,7 @@
"backup_info_card_assets": "assets",
"backup_manual_cancelled": "Cancelled",
"backup_manual_failed": "Failed",
"backup_manual_in_progress": "Upload already in progress. Try after some time",
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
"backup_manual_success": "Success",
"backup_manual_title": "Upload status",
"backup_options_page_title": "Backup options",
@@ -678,4 +678,4 @@
"viewer_unstack": "Un-Stack",
"wifi_name": "WiFi Name",
"your_wifi_name": "Your WiFi name"
}
}

View File

@@ -133,7 +133,7 @@
"backup_info_card_assets": "assets",
"backup_manual_cancelled": "Cancelled",
"backup_manual_failed": "Failed",
"backup_manual_in_progress": "Upload already in progress. Try after some time",
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
"backup_manual_success": "Success",
"backup_manual_title": "Upload status",
"backup_options_page_title": "Backup options",
@@ -678,4 +678,4 @@
"viewer_unstack": "Un-Stack",
"wifi_name": "WiFi Name",
"your_wifi_name": "Your WiFi name"
}
}

View File

@@ -133,7 +133,7 @@
"backup_info_card_assets": "zapisi",
"backup_manual_cancelled": "Cancelled",
"backup_manual_failed": "Failed",
"backup_manual_in_progress": "Upload already in progress. Try after some time",
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
"backup_manual_success": "Success",
"backup_manual_title": "Upload status",
"backup_options_page_title": "Backup options",
@@ -678,4 +678,4 @@
"viewer_unstack": "Un-Stack",
"wifi_name": "WiFi Name",
"your_wifi_name": "Your WiFi name"
}
}

View File

@@ -133,7 +133,7 @@
"backup_info_card_assets": "assets",
"backup_manual_cancelled": "Cancelled",
"backup_manual_failed": "Failed",
"backup_manual_in_progress": "Upload already in progress. Try after some time",
"backup_manual_in_progress": "Upload already in progress. Try after sometime",
"backup_manual_success": "Success",
"backup_manual_title": "Upload status",
"backup_options_page_title": "Backup options",
@@ -678,4 +678,4 @@
"viewer_unstack": "Un-Stack",
"wifi_name": "WiFi Name",
"your_wifi_name": "Your WiFi name"
}
}

View File

@@ -7,10 +7,10 @@
"action_common_select": "Вибрати",
"action_common_update": "Оновити",
"add_a_name": "Додати ім'я",
"add_endpoint": "Add endpoint",
"add_endpoint": "Додати кінцеву точку",
"add_to_album_bottom_sheet_added": "Додано до {album}",
"add_to_album_bottom_sheet_already_exists": "Вже є в {album}",
"advanced_settings_log_level_title": "Log level: {}",
"advanced_settings_log_level_title": "Рівень логування: {}",
"advanced_settings_prefer_remote_subtitle": "Деякі пристрої вельми повільно завантажують мініатюри із елементів на пристрої. Активуйте для завантаження віддалених мініатюр натомість.",
"advanced_settings_prefer_remote_title": "Перевага віддаленим зображенням",
"advanced_settings_proxy_headers_subtitle": "Визначте заголовки проксі-сервера, які Immich має надсилати з кожним мережевим запитом.",
@@ -66,12 +66,12 @@
"assets_restored_successfully": "{} елемент(и) успішно відновлено",
"assets_trashed": "{} елемент(и) поміщено до кошика",
"assets_trashed_from_server": "{} елемент(и) поміщено до кошика на сервері Immich",
"asset_viewer_settings_subtitle": "Manage your gallery viewer settings",
"asset_viewer_settings_subtitle": "Керуйте налаштуваннями переглядача галереї",
"asset_viewer_settings_title": "Переглядач зображень",
"automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere",
"automatic_endpoint_switching_title": "Automatic URL switching",
"background_location_permission": "Background location permission",
"background_location_permission_content": "In order to switch networks when running in the background, Immich must *always* have precise location access so the app can read the Wi-Fi network's name",
"automatic_endpoint_switching_subtitle": "Підключатися локально через зазначену Wi-Fi мережу, коли це можливо, і використовувати альтернативні з'єднання в інших випадках",
"automatic_endpoint_switching_title": "Автоматичне перемикання URL",
"background_location_permission": "Дозвіл до місцезнаходження у фоні",
"background_location_permission_content": "Щоб перемикати мережі у фоновому режимі, Immich має *завжди* мати доступ до точної геолокації, щоб зчитувати назву Wi-Fi мережі",
"backup_album_selection_page_albums_device": "Альбоми на пристрої ({})",
"backup_album_selection_page_albums_tap": "Торкніться, щоб включити,\nторкніться двічі, щоб виключити",
"backup_album_selection_page_assets_scatter": "Елементи можуть належати до кількох альбомів водночас. Таким чином, альбоми можуть бути включені або вилучені під час резервного копіювання.",
@@ -119,7 +119,7 @@
"backup_controller_page_remainder_sub": "Решта знімків та відео для резервного копіювання з вибраних",
"backup_controller_page_select": "Вибрати",
"backup_controller_page_server_storage": "Сховище сервера",
"backup_controller_page_start_backup": "Почати Резервне Копіювання",
"backup_controller_page_start_backup": "Почати резервне копіювання",
"backup_controller_page_status_off": "Автоматичне резервне копіювання в активному режимі вимкнено",
"backup_controller_page_status_on": "Автоматичне резервне копіювання в активному режимі ввімкнено",
"backup_controller_page_storage_format": "{} із {} спожито",
@@ -137,7 +137,7 @@
"backup_manual_success": "Успіх",
"backup_manual_title": "Стан завантаження",
"backup_options_page_title": "Резервне копіювання",
"backup_setting_subtitle": "Manage background and foreground upload settings",
"backup_setting_subtitle": "Управління налаштуваннями завантаження у фоновому та активному режимі",
"cache_settings_album_thumbnails": "Мініатюри сторінок бібліотеки ({} елементи)",
"cache_settings_clear_cache_button": "Очистити кеш",
"cache_settings_clear_cache_button_title": "Очищає кеш програми. Це суттєво знизить продуктивність програми, доки кеш не буде перебудовано.",
@@ -156,17 +156,17 @@
"cache_settings_tile_subtitle": "Керування поведінкою локального сховища",
"cache_settings_tile_title": "Локальне сховище",
"cache_settings_title": "Налаштування кешування",
"cancel": "Cancel",
"canceled": "Canceled",
"change_display_order": "Change display order",
"cancel": "Скасувати",
"canceled": "Скасовано",
"change_display_order": "Змінити порядок відображення",
"change_password_form_confirm_password": "Підтвердити пароль",
"change_password_form_description": "Привіт {name},\n\nВи або або вперше входите у систему, або було зроблено запит на зміну вашого пароля. \nВведіть ваш новий пароль.",
"change_password_form_new_password": "Новий пароль",
"change_password_form_password_mismatch": "Паролі не співпадають",
"change_password_form_reenter_new_password": "Повторіть новий пароль",
"check_corrupt_asset_backup": "Check for corrupt asset backups",
"check_corrupt_asset_backup_button": "Perform check",
"check_corrupt_asset_backup_description": "Run this check only over Wi-Fi and once all assets have been backed-up. The procedure might take a few minutes.",
"check_corrupt_asset_backup": "Перевірити на пошкоджені резервні копії активів",
"check_corrupt_asset_backup_button": "Виконати перевірку",
"check_corrupt_asset_backup_description": "Запустіть цю перевірку лише через Wi-Fi та після того, як всі активи будуть завантажені на сервер. Процес може зайняти кілька хвилин.",
"client_cert_dialog_msg_confirm": "OK",
"client_cert_enter_password": "Введіть пароль",
"client_cert_import": "Імпорт",
@@ -181,7 +181,7 @@
"common_create_new_album": "Створити новий альбом",
"common_server_error": "Будь ласка, перевірте з'єднання, переконайтеся, що сервер доступний і версія програми/сервера сумісна.",
"common_shared": "Спільні",
"completed": "Completed",
"completed": "Завершено",
"contextual_search": "Схід сонця на пляжі",
"control_bottom_app_bar_add_to_album": "Додати у альбом",
"control_bottom_app_bar_album_info": "{} елементи",
@@ -199,7 +199,7 @@
"control_bottom_app_bar_share": "Поділитися",
"control_bottom_app_bar_share_to": "Поділитися",
"control_bottom_app_bar_stack": "Стек",
"control_bottom_app_bar_trash_from_immich": "Перемістити до кошика",
"control_bottom_app_bar_trash_from_immich": "До кошика",
"control_bottom_app_bar_unarchive": "Розархівувати",
"control_bottom_app_bar_unfavorite": "Видалити з улюблених",
"control_bottom_app_bar_upload": "Завантажити",
@@ -213,7 +213,7 @@
"crop": "Кадрувати",
"curated_location_page_title": "Місця",
"curated_object_page_title": "Речі",
"current_server_address": "Current server address",
"current_server_address": "Поточна адреса сервера",
"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",
@@ -231,7 +231,7 @@
"delete_shared_link_dialog_title": "Видалити спільне посилання",
"description_input_hint_text": "Додати опис...",
"description_input_submit_error": "Помилка оновлення опису, перевірте логи для подробиць",
"description_search": "Hiking day in Sapa",
"description_search": "День походу в Сапі",
"download_canceled": "Завантаження скасовано",
"download_complete": "Завантаження закінчено",
"download_enqueue": "Завантаження поставлено в чергу",
@@ -248,14 +248,14 @@
"download_sucess_android": "Медіафайли завантажено в DCIM/Immich",
"download_waiting_to_retry": "Очікування повторної спроби",
"edit_date_time_dialog_date_time": "Дата і час",
"edit_date_time_dialog_search_timezone": "Search timezone...",
"edit_date_time_dialog_search_timezone": "Пошук часової зони...",
"edit_date_time_dialog_timezone": "Часовий пояс",
"edit_image_title": "Редагувати",
"edit_location_dialog_title": "Місцезнаходження",
"end_date": "End date",
"enqueued": "Enqueued",
"enter_wifi_name": "Enter WiFi name",
"error_change_sort_album": "Failed to change album sort order",
"end_date": "Дата завершення",
"enqueued": "У черзі",
"enter_wifi_name": "Введіть назву WiFi",
"error_change_sort_album": "Не вдалося змінити порядок сортування альбому",
"error_saving_image": "Помилка: {}",
"exif_bottom_sheet_description": "Додати опис...",
"exif_bottom_sheet_details": "ПОДРОБИЦІ",
@@ -267,16 +267,16 @@
"experimental_settings_new_asset_list_title": "Експериментальний макет знімків",
"experimental_settings_subtitle": "На власний ризик!",
"experimental_settings_title": "Експериментальні",
"external_network": "External network",
"external_network_sheet_info": "When not on the preferred WiFi network, the app will connect to the server through the first of the below URLs it can reach, starting from top to bottom",
"failed": "Failed",
"external_network": "Зовнішня мережа",
"external_network_sheet_info": "Коли ви не підключені до переважної мережі WiFi, додаток підключатиметься до сервера через першу з наведених нижче URL-адрес, яку він зможе досягти, починаючи зверху вниз",
"failed": "Не вдалося",
"favorites": "Вибране",
"favorites_page_no_favorites": "Немає улюблених елементів",
"favorites_page_title": "Улюблені",
"filename_search": "Ім'я або розширення файлу",
"filter": "Фільтр",
"get_wifiname_error": "Could not get Wi-Fi name. Make sure you have granted the necessary permissions and are connected to a Wi-Fi network",
"grant_permission": "Grant permission",
"get_wifiname_error": "Не вдалося отримати назву Wi-Fi. Переконайтеся, що ви надали необхідні дозволи та підключені до Wi-Fi мережі",
"grant_permission": "Надати дозвіл",
"haptic_feedback_switch": "Увімкнути тактильну віддачу",
"haptic_feedback_title": "Тактильна віддача",
"header_settings_add_header_tip": "Додати заголовок",
@@ -322,10 +322,10 @@
"library_page_sort_most_oldest_photo": "Найдавніші фото",
"library_page_sort_most_recent_photo": "Найновіші фото",
"library_page_sort_title": "Назва альбому",
"local_network": "Local network",
"local_network_sheet_info": "The app will connect to the server through this URL when using the specified Wi-Fi network",
"location_permission": "Location permission",
"location_permission_content": "In order to use the auto-switching feature, Immich needs precise location permission so it can read the current WiFi network's name",
"local_network": "Локальна мережа",
"local_network_sheet_info": "Додаток підключатиметься до сервера через цей URL, коли використовується вказана Wi-Fi мережа",
"location_permission": "Дозвіл до місцезнаходження",
"location_permission_content": "Щоб перемикати мережі у фоновому режимі, Immich має *завжди* мати доступ до точної геолокації, щоб зчитувати назву Wi-Fi мережі",
"location_picker_choose_on_map": "Обрати на мапі",
"location_picker_latitude": "Широта",
"location_picker_latitude_error": "Вкажіть дійсну широту",
@@ -395,8 +395,8 @@
"multiselect_grid_edit_date_time_err_read_only": "Неможливо редагувати дату елементів лише для читання, пропущено",
"multiselect_grid_edit_gps_err_read_only": "Неможливо редагувати місцезнаходження елементів лише для читання, пропущено",
"my_albums": "Мої альбоми",
"networking_settings": "Networking",
"networking_subtitle": "Manage the server endpoint settings",
"networking_settings": "Мережеві налаштування",
"networking_subtitle": "Керування налаштуваннями кінцевої точки сервера",
"no_assets_to_show": "Елементи відсутні",
"no_name": "Без імені",
"notification_permission_dialog_cancel": "Скасувати",
@@ -405,7 +405,7 @@
"notification_permission_list_tile_content": "Надати дозвіл для сповіщень.",
"notification_permission_list_tile_enable_button": "Увімкнути Сповіщення",
"notification_permission_list_tile_title": "Дозвіл на Сповіщення",
"not_selected": "Not selected",
"not_selected": "Не вибрано",
"on_this_device": "На цьому пристрої",
"partner_list_user_photos": "Фотографії {user}",
"partner_list_view_all": "Переглянути усі",
@@ -419,7 +419,7 @@
"partner_page_stop_sharing_title": "Припинити надання ваших знімків?",
"partner_page_title": "Партнер",
"partners": "\nПартнери",
"paused": "Paused",
"paused": "Призупинено",
"people": "Люди",
"permission_onboarding_back": "Назад",
"permission_onboarding_continue_anyway": "Все одно продовжити",
@@ -432,7 +432,7 @@
"permission_onboarding_permission_limited": "Обмежений доступ. Аби дозволити Immich резервне копіювання та керування вашою галереєю, надайте доступ до знімків та відео у Налаштуваннях",
"permission_onboarding_request": "Immich потребує доступу до ваших знімків та відео.",
"places": "Місця",
"preferences_settings_subtitle": "Manage the app's preferences",
"preferences_settings_subtitle": "Керування налаштуваннями додатку",
"preferences_settings_title": "Параметри",
"profile_drawer_app_logs": "Журнал",
"profile_drawer_client_out_of_date_major": "Мобільний додаток застарів. Будь ласка, оновіть до останньої мажорної версії.",
@@ -447,7 +447,7 @@
"profile_drawer_trash": "Кошик",
"recently_added": "Нещодавно додані",
"recently_added_page_title": "Нещодавні",
"save": "Save",
"save": "Зберегти",
"save_to_gallery": "Зберегти в галерею",
"scaffold_body_error_occurred": "Виникла помилка",
"search_albums": "Пошук альбому",
@@ -457,17 +457,17 @@
"search_filter_camera_make": "Виробник",
"search_filter_camera_model": "Модель",
"search_filter_camera_title": "Виберіть тип камери",
"search_filter_contextual": "Search by context",
"search_filter_contextual": "Пошук за контекстом",
"search_filter_date": "Дата",
"search_filter_date_interval": "{start} до {end}",
"search_filter_date_title": "Виберіть діапазон дат",
"search_filter_description": "Search by description",
"search_filter_description": "Пошук за описом",
"search_filter_display_option_archive": "Архів",
"search_filter_display_option_favorite": "Улюблені",
"search_filter_display_option_not_in_album": "Не в альбомі",
"search_filter_display_options": "Параметри відображення",
"search_filter_display_options_title": "Параметри відображення",
"search_filter_filename": "Search by file name",
"search_filter_filename": "Пошук за назвою файлу",
"search_filter_location": "Місцезнаходження",
"search_filter_location_city": "Місто",
"search_filter_location_country": "Країна",
@@ -479,10 +479,10 @@
"search_filter_media_type_title": "Виберіть тип носія",
"search_filter_media_type_video": "Відео",
"search_filter_people": "Люди",
"search_filter_people_hint": "Filter people",
"search_filter_people_hint": "Фільтрувати за людьми",
"search_filter_people_title": "Виберіть людей",
"search_no_more_result": "No more results",
"search_no_result": "No results found, try a different search term or combination",
"search_no_more_result": "Більше результатів немає",
"search_no_result": "Результатів не знайдено, спробуйте інший запит або комбінацію",
"search_page_categories": "Категорії",
"search_page_favorites": "Улюблені",
"search_page_motion_photos": "Рухомі знімки",
@@ -499,7 +499,7 @@
"search_page_places": "Місця",
"search_page_recently_added": "Нещодавно додані",
"search_page_screenshots": "Знімки екрану",
"search_page_search_photos_videos": "Search for your photos and videos",
"search_page_search_photos_videos": "Шукайте ваші фото та відео",
"search_page_selfies": "Селфі",
"search_page_things": "Речі",
"search_page_videos": "Відео",
@@ -512,7 +512,7 @@
"select_additional_user_for_sharing_page_suggestions": "Пропозиції",
"select_user_for_sharing_page_err_album": "Не вдалося створити альбом",
"select_user_for_sharing_page_share_suggestions": "Пропозиції",
"server_endpoint": "Server Endpoint",
"server_endpoint": "Кінцева точка сервера",
"server_info_box_app_version": "Версія додатка",
"server_info_box_latest_release": "Остання версія",
"server_info_box_server_url": "URL сервера",
@@ -524,7 +524,7 @@
"setting_image_viewer_preview_title": "Завантажувати зображення попереднього перегляду",
"setting_image_viewer_title": "Зображення",
"setting_languages_apply": "Застосувати",
"setting_languages_subtitle": "Change the app's language",
"setting_languages_subtitle": "Змінити мову додатку",
"setting_languages_title": "Мова",
"setting_notifications_notify_failures_grace_period": "Повідомити про помилки фонового резервного копіювання: {}",
"setting_notifications_notify_hours": "{} годин",
@@ -542,8 +542,8 @@
"settings_require_restart": "Перезавантажте програму для застосування цього налаштування",
"setting_video_viewer_looping_subtitle": "Увімкнути циклічне відтворення відео",
"setting_video_viewer_looping_title": "Циклічне відтворення",
"setting_video_viewer_original_video_subtitle": "When streaming a video from the server, play the original even when a transcode is available. May lead to buffering. Videos available locally are played in original quality regardless of this setting.",
"setting_video_viewer_original_video_title": "Force original video",
"setting_video_viewer_original_video_subtitle": "При трансляції відео з сервера відтворювати оригінал, навіть якщо доступна транскодування. Може призвести до буферизації. Відео, доступні локально, відтворюються в оригінальній якості, незважаючи на це налаштування.",
"setting_video_viewer_original_video_title": "Примусово відтворювати оригінальне відео",
"setting_video_viewer_title": "Відео",
"share_add": "Додати",
"share_add_photos": "Додати знімки",
@@ -562,7 +562,7 @@
"shared_album_section_people_owner_label": "Власник",
"shared_album_section_people_title": "ЛЮДИ",
"share_dialog_preparing": "Підготовка...",
"shared_intent_upload_button_progress_text": "{} / {} Uploaded",
"shared_intent_upload_button_progress_text": "{} / {} Завантажено",
"shared_link_app_bar_title": "Спільні посилання",
"shared_link_clipboard_copied_massage": "Скопійовано в буфер обміну",
"shared_link_clipboard_text": "Посилання: {}\nПароль: {}",
@@ -618,7 +618,7 @@
"sharing_silver_appbar_create_shared_album": "Створити спільний альбом",
"sharing_silver_appbar_shared_links": "Спільні посилання",
"sharing_silver_appbar_share_partner": "Поділитися з партнером",
"start_date": "Start date",
"start_date": "Дата початку",
"sync": "Синхронізувати",
"sync_albums": "Синхронізувати альбоми",
"sync_albums_manual_subtitle": "Синхронізувати всі завантажені фото та відео у вибрані альбоми для резервного копіювання",
@@ -657,15 +657,15 @@
"trash_page_select_assets_btn": "Вибрані елементи",
"trash_page_select_btn": "Вибрати",
"trash_page_title": "Кошик ({})",
"upload": "Upload",
"upload": "Завантажити",
"upload_dialog_cancel": "Скасувати",
"upload_dialog_info": "Бажаєте створити резервну копію вибраних елементів на сервері?",
"upload_dialog_ok": "Завантажити",
"upload_dialog_title": "Завантажити Елементи",
"uploading": "Uploading",
"upload_to_immich": "Upload to Immich ({})",
"use_current_connection": "use current connection",
"validate_endpoint_error": "Please enter a valid URL",
"uploading": "Завантаження",
"upload_to_immich": "Завантажити в Immich ({})",
"use_current_connection": "використовувати поточне підключення",
"validate_endpoint_error": "Будь ласка, введіть дійсну URL-адресу",
"version_announcement_overlay_ack": "Прийняти",
"version_announcement_overlay_release_notes": "примітки до випуску",
"version_announcement_overlay_text_1": "Вітаємо, є новий випуск ",
@@ -676,6 +676,6 @@
"viewer_remove_from_stack": "Видалити зі стеку",
"viewer_stack_use_as_main_asset": "Використовувати як основний елементи",
"viewer_unstack": "Розібрати стек",
"wifi_name": "WiFi Name",
"your_wifi_name": "Your WiFi name"
"wifi_name": "Назва WiFi",
"your_wifi_name": "Ваша назва WiFi"
}

View File

@@ -19,7 +19,7 @@ platform :ios do
desc "iOS Release"
lane :release do
increment_version_number(
version_number: "1.128.0"
version_number: "1.129.0"
)
increment_build_number(
build_number: latest_testflight_build_number + 1,

View File

@@ -5,7 +5,7 @@ const Map<String, Locale> locales = {
'English (en_US)': Locale('en', 'US'),
// Additional locales
'Arabic (ar_JO)': Locale('ar', 'JO'),
'Catalan (ca_CA)': Locale('ca', 'CA'),
'Catalan (ca)': Locale('ca'),
'Chinese (zh_CN)': Locale('zh', 'CN'),
'Chinese Simplified (zh_Hans)': Locale('zh', 'Hans'),
'Chinese TW (zh_TW)': Locale('zh', 'TW'),

View File

@@ -1,5 +1,6 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/interfaces/log.interface.dart';
import 'package:immich_mobile/domain/interfaces/store.interface.dart';
@@ -91,12 +92,13 @@ class LogService {
}
/// Flush pending log messages to persistent storage
Future<void> flush() async {
void flush() {
if (_flushTimer == null) {
return;
}
_flushTimer!.cancel();
await _flushBufferToDatabase();
// TODO: Rename enable this after moving to sqlite - #16504
// await _flushBufferToDatabase();
}
Future<void> dispose() {
@@ -106,6 +108,10 @@ class LogService {
}
void _writeLogToDatabase(LogRecord r) {
if (kDebugMode) {
debugPrint('[${r.level.name}] [${r.time}] ${r.message}');
}
final record = LogMessage(
message: r.message,
level: r.level.toLogLevel(),

View File

@@ -17,6 +17,7 @@ import 'package:immich_mobile/providers/server_info.provider.dart';
import 'package:immich_mobile/providers/tab.provider.dart';
import 'package:immich_mobile/providers/websocket.provider.dart';
import 'package:immich_mobile/services/background.service.dart';
import 'package:isar/isar.dart';
import 'package:permission_handler/permission_handler.dart';
enum AppLifeCycleEnum {
@@ -114,11 +115,13 @@ class AppLifeCycleNotifier extends StateNotifier<AppLifeCycleEnum> {
_ref.read(websocketProvider.notifier).disconnect();
}
unawaited(LogService.I.flush());
LogService.I.flush();
}
void handleAppDetached() {
Future<void> handleAppDetached() async {
state = AppLifeCycleEnum.detached;
LogService.I.flush();
await Isar.getInstance()?.close();
// no guarantee this is called at all
_ref.read(manualUploadProvider.notifier).cancelBackup();
}

View File

@@ -3,7 +3,7 @@ Immich API
This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 1.128.0
- API version: 1.129.0
- Generator version: 7.8.0
- Build package: org.openapitools.codegen.languages.DartClientCodegen

View File

@@ -394,10 +394,10 @@ packages:
dependency: "direct main"
description:
name: easy_localization
sha256: fa59bcdbbb911a764aa6acf96bbb6fa7a5cf8234354fc45ec1a43a0349ef0201
sha256: "0f5239c7b8ab06c66440cfb0e9aa4b4640429c6668d5a42fe389c5de42220b12"
url: "https://pub.dev"
source: hosted
version: "3.0.7"
version: "3.0.7+1"
easy_logger:
dependency: transitive
description:

View File

@@ -2,7 +2,7 @@ name: immich_mobile
description: Immich - selfhosted backup media file on mobile phone
publish_to: 'none'
version: 1.128.0+186
version: 1.129.0+187
environment:
sdk: '>=3.3.0 <4.0.0'
@@ -34,7 +34,7 @@ dependencies:
url_launcher: ^6.2.4
http: ^1.1.0
cancellation_token_http: ^2.0.0
easy_localization: ^3.0.3
easy_localization: ^3.0.7+1
share_plus: ^10.0.0
flutter_displaymode: ^0.6.0
scrollable_positioned_list: ^0.3.8

View File

@@ -7655,7 +7655,7 @@
"info": {
"title": "Immich",
"description": "Immich API",
"version": "1.128.0",
"version": "1.129.0",
"contact": {}
},
"tags": [],

View File

@@ -1,12 +1,12 @@
{
"name": "@immich/sdk",
"version": "1.128.0",
"version": "1.129.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@immich/sdk",
"version": "1.128.0",
"version": "1.129.0",
"license": "GNU Affero General Public License version 3",
"dependencies": {
"@oazapfts/runtime": "^1.0.2"

View File

@@ -1,6 +1,6 @@
{
"name": "@immich/sdk",
"version": "1.128.0",
"version": "1.129.0",
"description": "Auto-generated TypeScript SDK for the Immich API",
"type": "module",
"main": "./build/index.js",

View File

@@ -1,6 +1,6 @@
/**
* Immich
* 1.128.0
* 1.129.0
* DO NOT MODIFY - This file has been generated using oazapfts.
* See https://www.npmjs.com/package/oazapfts
*/

View File

@@ -1,12 +1,12 @@
{
"name": "immich",
"version": "1.128.0",
"version": "1.129.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "immich",
"version": "1.128.0",
"version": "1.129.0",
"license": "GNU Affero General Public License version 3",
"dependencies": {
"@nestjs/bullmq": "^11.0.1",

View File

@@ -1,6 +1,6 @@
{
"name": "immich",
"version": "1.128.0",
"version": "1.129.0",
"description": "",
"author": "",
"private": true,

View File

@@ -10,7 +10,7 @@ export class MoveEntity {
@PrimaryGeneratedColumn('uuid')
id!: string;
@Column({ type: 'varchar' })
@Column({ type: 'uuid' })
entityId!: string;
@Column({ type: 'varchar' })

View File

@@ -0,0 +1,26 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
export class MoveHistoryUuidEntityId1741179334403 implements MigrationInterface {
name = 'MoveHistoryUuidEntityId1741179334403';
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "move_history" ALTER COLUMN "entityId" TYPE uuid USING "entityId"::uuid;`);
await queryRunner.query(`delete from "move_history"
where
"move_history"."entityId" not in (
select
"id"
from
"assets"
where
"assets"."id" = "move_history"."entityId"
)
and "move_history"."pathType" = 'original'
`)
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "move_history" ALTER COLUMN "entityId" TYPE character varying`);
}
}

View File

@@ -15,3 +15,22 @@ where
"id" = $1
returning
*
-- MoveRepository.cleanMoveHistory
delete from "move_history"
where
"move_history"."entityId" not in (
select
"id"
from
"assets"
where
"assets"."id" = "move_history"."entityId"
)
and "move_history"."pathType" = 'original'
-- MoveRepository.cleanMoveHistorySingle
delete from "move_history"
where
"move_history"."pathType" = 'original'
and "entityId" = $1

View File

@@ -1,10 +1,10 @@
import { Injectable } from '@nestjs/common';
import { Insertable, Kysely, Updateable } from 'kysely';
import { Insertable, Kysely, sql, Updateable } from 'kysely';
import { InjectKysely } from 'nestjs-kysely';
import { DB, MoveHistory } from 'src/db';
import { DummyValue, GenerateSql } from 'src/decorators';
import { MoveEntity } from 'src/entities/move.entity';
import { PathType } from 'src/enum';
import { AssetPathType, PathType } from 'src/enum';
export type MoveCreate = Pick<MoveEntity, 'oldPath' | 'newPath' | 'entityId' | 'pathType'> & Partial<MoveEntity>;
@@ -47,4 +47,28 @@ export class MoveRepository {
.returningAll()
.executeTakeFirstOrThrow() as unknown as Promise<MoveEntity>;
}
@GenerateSql()
async cleanMoveHistory(): Promise<void> {
await this.db
.deleteFrom('move_history')
.where((eb) =>
eb(
'move_history.entityId',
'not in',
eb.selectFrom('assets').select('id').whereRef('assets.id', '=', 'move_history.entityId'),
),
)
.where('move_history.pathType', '=', sql.lit(AssetPathType.ORIGINAL))
.execute();
}
@GenerateSql()
async cleanMoveHistorySingle(assetId: string): Promise<void> {
await this.db
.deleteFrom('move_history')
.where('move_history.pathType', '=', sql.lit(AssetPathType.ORIGINAL))
.where('entityId', '=', assetId)
.execute();
}
}

View File

@@ -152,6 +152,7 @@ export class StorageTemplateService extends BaseService {
this.logger.log('Storage template migration disabled, skipping');
return JobStatus.SKIPPED;
}
await this.moveRepository.cleanMoveHistory();
const assetPagination = usePagination(JOBS_ASSET_PAGINATION_SIZE, (pagination) =>
this.assetRepository.getAll(pagination, { withExif: true, withArchived: true }),
);
@@ -175,6 +176,12 @@ export class StorageTemplateService extends BaseService {
return JobStatus.SUCCESS;
}
@OnEvent({ name: 'asset.delete' })
async handleMoveHistoryCleanup({ assetId }: ArgOf<'asset.delete'>) {
this.logger.debug(`Cleaning up move history for asset ${assetId}`);
await this.moveRepository.cleanMoveHistorySingle(assetId);
}
async moveAsset(asset: AssetEntity, metadata: MoveAssetMetadata) {
if (asset.isExternal || StorageCore.isAndroidMotionPath(asset.originalPath)) {
// External assets are not affected by storage template

View File

@@ -8,5 +8,7 @@ export const newMoveRepositoryMock = (): Mocked<RepositoryInterface<MoveReposito
getByEntity: vitest.fn(),
update: vitest.fn(),
delete: vitest.fn(),
cleanMoveHistory: vitest.fn(),
cleanMoveHistorySingle: vitest.fn(),
};
};

6
web/package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "immich-web",
"version": "1.128.0",
"version": "1.129.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "immich-web",
"version": "1.128.0",
"version": "1.129.0",
"license": "GNU Affero General Public License version 3",
"dependencies": {
"@formatjs/icu-messageformat-parser": "^2.9.8",
@@ -80,7 +80,7 @@
},
"../open-api/typescript-sdk": {
"name": "@immich/sdk",
"version": "1.128.0",
"version": "1.129.0",
"license": "GNU Affero General Public License version 3",
"dependencies": {
"@oazapfts/runtime": "^1.0.2"

View File

@@ -1,6 +1,6 @@
{
"name": "immich-web",
"version": "1.128.0",
"version": "1.129.0",
"license": "GNU Affero General Public License version 3",
"scripts": {
"dev": "vite dev --host 0.0.0.0 --port 3000",

View File

@@ -423,6 +423,12 @@ export class AssetStore {
this.setOptions(options);
return;
}
// Make sure to re-initialize if the tagId changes
if (this.options.tagId === options.tagId) {
this.setOptions(options);
return;
}
// TODO: don't call updateObjects frequently after
// init - cancelation of the initialize tasks isn't
// performed right now, and will cause issues if