diff --git a/appinfo/info.xml b/appinfo/info.xml index 33726d20..c45c0aa9 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -33,7 +33,7 @@ Memories is a *batteries-included* photo management solution for Nextcloud with 1. Run `php ./occ memories:index` to generate metadata indices for existing photos. 1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos. ]]> - 4.10.2 + 4.10.3 agpl Varun Patil Memories diff --git a/l10n/bg.js b/l10n/bg.js index 6e12f31e..d633782d 100644 --- a/l10n/bg.js +++ b/l10n/bg.js @@ -41,6 +41,7 @@ OC.L10N.register( "Edit Date/Time" : "Редактиране на Дата/Час", "Edit EXIF Data" : "Редактиране на EXIF данни", "View in folder" : "Преглед в папката", + "Move to folder" : "Преместване в папка", "Add to album" : "Добавяне към албум", "Move to another person" : "Преминаване към друго лице", "Remove from person" : "Премахване от лице", @@ -112,6 +113,7 @@ OC.L10N.register( "Label" : "Име", "Camera Make" : "Марка на камера", "Camera Model" : "Модел на камера", + "Lens Model" : "Модел на обектива", "Copyright" : "Авторско право", "Remove person" : "Премахване на лице", "Are you sure you want to remove {name}?" : "Сигурни ли сте, че искате премахване на {name}?", @@ -131,6 +133,8 @@ OC.L10N.register( "Use the sidebar to share this folder." : "Използвайне на страничната лента, за споделяне на тази папка.", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Ако създадете публично споделяне на връзка, щракнете върху Опресняване и съответна връзка към приложението Спомени ще бъде показана по-долу.", "Refresh" : "Опресняване", + "Choose a folder" : "Избор на папка", + "_{n} item moved to folder_::_{n} items moved to folder_" : ["{n} елементa са преместени в папката","{n} елементa са преместени в папката"], "Remove" : "Премахване", "Add Path" : "Добавяне на път", "Add a root to your timeline" : "Избо на основа /начало/ към вашата времева линия ", @@ -140,6 +144,8 @@ OC.L10N.register( "Merge with different person" : "Обединяване с различно лице", "Mark person in preview" : "Маркиране на лице в предварителен преглед", "Share folder" : "Споделяне на папка", + "Folder View" : "Изглед на папка", + "Timeline View" : "Изглед на времева линия", "Move left" : "Преместване наляво", "Move right" : "Преместване надясно", "Failed to get Exif data. Metadata may be lost!" : "Неуспешно получаване на Exif данни. Възможно е метаданните да са загубени!", @@ -246,12 +252,16 @@ OC.L10N.register( "Direct" : "Директно", "Auto" : "Автоматично", "Shared Folder" : "Споделена папка", + "Shared Album" : "Споделен албум", "Failed to create {albumName}." : "Неуспешно създаване на {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Неуспешно преименуване от {currentAlbumName} на {newAlbumName}.", "General Failure" : "Грешка от общ характер", "Error: {msg}" : "Грешка: {msg}", "Failed to delete files." : "Неуспешно изтриване на файлове.", "Failed to delete {fileName}." : "Неуспешно изтриване на {fileName}.", + "Failed to move files." : "Неуспешно преместване на файлове.", + "Could not move {fileName}, target exists." : "Файлът {fileName} не може да бъде преместен, дестинацията съществува.", + "Failed to move {fileName}." : "Неуспешно преместване на {fileName}.", "Failed to download files" : "Неуспешно изтегляне на файлове", "Failed to favorite files." : "Неуспешно добавяне на файлове в любими.", "Failed to favorite some files." : "Неуспешно добавяне на някой файлове в любими.", diff --git a/l10n/bg.json b/l10n/bg.json index 59903ada..5098090e 100644 --- a/l10n/bg.json +++ b/l10n/bg.json @@ -39,6 +39,7 @@ "Edit Date/Time" : "Редактиране на Дата/Час", "Edit EXIF Data" : "Редактиране на EXIF данни", "View in folder" : "Преглед в папката", + "Move to folder" : "Преместване в папка", "Add to album" : "Добавяне към албум", "Move to another person" : "Преминаване към друго лице", "Remove from person" : "Премахване от лице", @@ -110,6 +111,7 @@ "Label" : "Име", "Camera Make" : "Марка на камера", "Camera Model" : "Модел на камера", + "Lens Model" : "Модел на обектива", "Copyright" : "Авторско право", "Remove person" : "Премахване на лице", "Are you sure you want to remove {name}?" : "Сигурни ли сте, че искате премахване на {name}?", @@ -129,6 +131,8 @@ "Use the sidebar to share this folder." : "Използвайне на страничната лента, за споделяне на тази папка.", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Ако създадете публично споделяне на връзка, щракнете върху Опресняване и съответна връзка към приложението Спомени ще бъде показана по-долу.", "Refresh" : "Опресняване", + "Choose a folder" : "Избор на папка", + "_{n} item moved to folder_::_{n} items moved to folder_" : ["{n} елементa са преместени в папката","{n} елементa са преместени в папката"], "Remove" : "Премахване", "Add Path" : "Добавяне на път", "Add a root to your timeline" : "Избо на основа /начало/ към вашата времева линия ", @@ -138,6 +142,8 @@ "Merge with different person" : "Обединяване с различно лице", "Mark person in preview" : "Маркиране на лице в предварителен преглед", "Share folder" : "Споделяне на папка", + "Folder View" : "Изглед на папка", + "Timeline View" : "Изглед на времева линия", "Move left" : "Преместване наляво", "Move right" : "Преместване надясно", "Failed to get Exif data. Metadata may be lost!" : "Неуспешно получаване на Exif данни. Възможно е метаданните да са загубени!", @@ -244,12 +250,16 @@ "Direct" : "Директно", "Auto" : "Автоматично", "Shared Folder" : "Споделена папка", + "Shared Album" : "Споделен албум", "Failed to create {albumName}." : "Неуспешно създаване на {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Неуспешно преименуване от {currentAlbumName} на {newAlbumName}.", "General Failure" : "Грешка от общ характер", "Error: {msg}" : "Грешка: {msg}", "Failed to delete files." : "Неуспешно изтриване на файлове.", "Failed to delete {fileName}." : "Неуспешно изтриване на {fileName}.", + "Failed to move files." : "Неуспешно преместване на файлове.", + "Could not move {fileName}, target exists." : "Файлът {fileName} не може да бъде преместен, дестинацията съществува.", + "Failed to move {fileName}." : "Неуспешно преместване на {fileName}.", "Failed to download files" : "Неуспешно изтегляне на файлове", "Failed to favorite files." : "Неуспешно добавяне на файлове в любими.", "Failed to favorite some files." : "Неуспешно добавяне на някой файлове в любими.", diff --git a/l10n/es.js b/l10n/es.js index 6c6e2435..1c69e95f 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -113,6 +113,7 @@ OC.L10N.register( "Label" : "Etiqueta", "Camera Make" : "Marca de la cámara", "Camera Model" : "Modelo de la cámara", + "Lens Model" : "Modelo del lente", "Copyright" : "Derechos de autor", "Remove person" : "Eliminar persona", "Are you sure you want to remove {name}?" : "¿Está seguro de que quiere quitar {name}?", @@ -133,6 +134,7 @@ OC.L10N.register( "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Si crea un enlace público de compartición, haga click en refrescar y se mostrará abajo el enlace correspondiente a Memories.", "Refresh" : "Actualizar", "Choose a folder" : "Elige una carpeta", + "_{n} item moved to folder_::_{n} items moved to folder_" : ["{n} ítem movidos a la carpeta","{n} ítems movidos a la carpeta","{n} ítems movidos a la carpeta"], "Remove" : "Quitar", "Add Path" : "Añadir ruta", "Add a root to your timeline" : "Añadir una raíz a su línea de tiempo", @@ -142,6 +144,8 @@ OC.L10N.register( "Merge with different person" : "Unir con una persona diferente", "Mark person in preview" : "Marcar persona en vista previa", "Share folder" : "Compartir carpeta", + "Folder View" : "Vista de Carpetas", + "Timeline View" : "Vista de línea de tiempo", "Move left" : "Mover a la izquierda", "Move right" : "Mover a la derecha", "Failed to get Exif data. Metadata may be lost!" : "Fallo al obtener los datos Exif. ¡Podrían haberse perdido los metadatos!", @@ -256,6 +260,8 @@ OC.L10N.register( "Failed to delete files." : "Fallo al eliminar archivos.", "Failed to delete {fileName}." : "Fallo al eliminar {fileName}.", "Failed to move files." : "Error al mover archivos.", + "Could not move {fileName}, target exists." : "No fue posible mover {fileName}, el destino existe.", + "Failed to move {fileName}." : "Fallo al mover {fileName}.", "Failed to download files" : "Fallo al descargar archivos", "Failed to favorite files." : "Fallo al marcar archivos como favoritos.", "Failed to favorite some files." : "Fallo al marcar algunos archivos como favoritos.", diff --git a/l10n/es.json b/l10n/es.json index dcd7c392..0f2a75c5 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -111,6 +111,7 @@ "Label" : "Etiqueta", "Camera Make" : "Marca de la cámara", "Camera Model" : "Modelo de la cámara", + "Lens Model" : "Modelo del lente", "Copyright" : "Derechos de autor", "Remove person" : "Eliminar persona", "Are you sure you want to remove {name}?" : "¿Está seguro de que quiere quitar {name}?", @@ -131,6 +132,7 @@ "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Si crea un enlace público de compartición, haga click en refrescar y se mostrará abajo el enlace correspondiente a Memories.", "Refresh" : "Actualizar", "Choose a folder" : "Elige una carpeta", + "_{n} item moved to folder_::_{n} items moved to folder_" : ["{n} ítem movidos a la carpeta","{n} ítems movidos a la carpeta","{n} ítems movidos a la carpeta"], "Remove" : "Quitar", "Add Path" : "Añadir ruta", "Add a root to your timeline" : "Añadir una raíz a su línea de tiempo", @@ -140,6 +142,8 @@ "Merge with different person" : "Unir con una persona diferente", "Mark person in preview" : "Marcar persona en vista previa", "Share folder" : "Compartir carpeta", + "Folder View" : "Vista de Carpetas", + "Timeline View" : "Vista de línea de tiempo", "Move left" : "Mover a la izquierda", "Move right" : "Mover a la derecha", "Failed to get Exif data. Metadata may be lost!" : "Fallo al obtener los datos Exif. ¡Podrían haberse perdido los metadatos!", @@ -254,6 +258,8 @@ "Failed to delete files." : "Fallo al eliminar archivos.", "Failed to delete {fileName}." : "Fallo al eliminar {fileName}.", "Failed to move files." : "Error al mover archivos.", + "Could not move {fileName}, target exists." : "No fue posible mover {fileName}, el destino existe.", + "Failed to move {fileName}." : "Fallo al mover {fileName}.", "Failed to download files" : "Fallo al descargar archivos", "Failed to favorite files." : "Fallo al marcar archivos como favoritos.", "Failed to favorite some files." : "Fallo al marcar algunos archivos como favoritos.", diff --git a/l10n/es_MX.js b/l10n/es_MX.js index 47179de7..24623c93 100644 --- a/l10n/es_MX.js +++ b/l10n/es_MX.js @@ -1,10 +1,12 @@ OC.L10N.register( "memories", { + "Memories" : "Recuerdos", "Settings" : "Ajustes", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", + "Albums" : "Álbumes", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", @@ -45,6 +47,7 @@ OC.L10N.register( "Text" : "Texto", "Size" : "Tamaño", "Position" : "Posición", - "Name is required." : "Nombre es requerido." + "Name is required." : "Nombre es requerido.", + "Quality" : "Calidad" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_MX.json b/l10n/es_MX.json index 955270bc..4f502a77 100644 --- a/l10n/es_MX.json +++ b/l10n/es_MX.json @@ -1,8 +1,10 @@ { "translations": { + "Memories" : "Recuerdos", "Settings" : "Ajustes", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", + "Albums" : "Álbumes", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", @@ -43,6 +45,7 @@ "Text" : "Texto", "Size" : "Tamaño", "Position" : "Posición", - "Name is required." : "Nombre es requerido." + "Name is required." : "Nombre es requerido.", + "Quality" : "Calidad" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/hu.js b/l10n/hu.js index 7b4b2af4..a5a44735 100644 --- a/l10n/hu.js +++ b/l10n/hu.js @@ -113,6 +113,7 @@ OC.L10N.register( "Label" : "Címke", "Camera Make" : "Kamera gyártmánya", "Camera Model" : "Kamera modellje", + "Lens Model" : "Lencse modellje", "Copyright" : "Szerzői jog", "Remove person" : "Személy eltávolítása", "Are you sure you want to remove {name}?" : "Biztos, hogy eltávolítja a következőt: {name}?", @@ -133,6 +134,7 @@ OC.L10N.register( "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Ha nyilvános hivatkozásos megosztást hoz létre, kattintson a frissítésre, és lent megjelenik az Emlékeknek megfelelő hivatkozás.", "Refresh" : "Frissítés", "Choose a folder" : "Válasszon mappát", + "_{n} item moved to folder_::_{n} items moved to folder_" : ["{n} elem áthelyezve a mappába","{n} elem áthelyezve a mappába"], "Remove" : "Eltávolítás", "Add Path" : "Útvonal hozzáadása", "Add a root to your timeline" : "Gyökér hozzáadása az idővonalához", diff --git a/l10n/hu.json b/l10n/hu.json index cb294df7..95154ed7 100644 --- a/l10n/hu.json +++ b/l10n/hu.json @@ -111,6 +111,7 @@ "Label" : "Címke", "Camera Make" : "Kamera gyártmánya", "Camera Model" : "Kamera modellje", + "Lens Model" : "Lencse modellje", "Copyright" : "Szerzői jog", "Remove person" : "Személy eltávolítása", "Are you sure you want to remove {name}?" : "Biztos, hogy eltávolítja a következőt: {name}?", @@ -131,6 +132,7 @@ "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Ha nyilvános hivatkozásos megosztást hoz létre, kattintson a frissítésre, és lent megjelenik az Emlékeknek megfelelő hivatkozás.", "Refresh" : "Frissítés", "Choose a folder" : "Válasszon mappát", + "_{n} item moved to folder_::_{n} items moved to folder_" : ["{n} elem áthelyezve a mappába","{n} elem áthelyezve a mappába"], "Remove" : "Eltávolítás", "Add Path" : "Útvonal hozzáadása", "Add a root to your timeline" : "Gyökér hozzáadása az idővonalához", diff --git a/l10n/nl.js b/l10n/nl.js index 0e4a5f10..023f4b0c 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -1,6 +1,8 @@ OC.L10N.register( "memories", { + "Memories" : "Herinneringen", + "Fast, modern and advanced photo management suite" : "Snelle, moderne en geavanceerde suite voor fotobeheer", "Settings" : "Instellingen", "People" : "Mensen", "Timeline" : "Tijdlijn", @@ -8,62 +10,169 @@ OC.L10N.register( "Favorites" : "Favorieten", "Videos" : "Videos", "Albums" : "Albums", - "Archive" : "Archiveren", + "Archive" : "Archief", "On this day" : "Vandaag", "Tags" : "Tags", "Maps" : "Kaarten", + "A better photos experience awaits you" : "Een betere foto-ervaring wacht op je", + "Choose the root folder of your timeline to begin" : "Kies de hoofdmap van je tijdlijn om te beginnen", + "If you just installed Memories, run:" : "Als je Herinneringen net hebt geïnstalleerd, voer je het volgende uit:", + "Continue to Memories" : "Doorgaan naar Herinneringen", + "Choose again" : "Opnieuw kiezen", + "Click here to start" : "Klik hier om te beginnen", + "You can always change this later in settings" : "Je kunt dit later altijd nog wijzigen in de instellingen", + "Choose the root of your timeline" : "Kies de hoofdmap van je tijdlijn", + "_Found {n} item in {path}_::_Found {n} items in {path}_" : ["{n} items gevonden in {path}","{n} items gevonden in {path}"], "Edit" : "Bewerk", + "No title" : "Geen titel", + "No description" : "Geen beschrijving", "Loading …" : "Laden …", "Cancel" : "Annuleren", "Delete" : "Verwijder", + "Remove from album" : "Verwijderen uit album", "Download" : "Download", "Favorite" : "Favoriet", "Unarchive" : "Terugzetten uit archief", + "Edit Date/Time" : "Datum/tijd bewerken", + "Edit EXIF Data" : "Bewerk EXIF gegevens", "View in folder" : "Bekijken in map", + "Move to folder" : "Verplaatsen naar map", + "Add to album" : "Toevoegen aan album", + "Your Timeline" : "Je tijdlijn", + "Processing … {n}/{m}" : "Verwerken … {n}/{m}", + "_{n} item added to album_::_{n} items added to album_" : ["{n} items toegevoegd aan album","{n} items toegevoegd aan album"], + "Search for collaborators" : "Zoeken naar bijdragers", + "Search people or groups" : "Zoek mensen of groepen", + "Add {collaboratorLabel} to the collaborators list" : "Voeg {collaboratorLabel} toe aan de bijdragerslijst", + "No collaborators available" : "Geen bijdragers beschikbaar", + "Remove {collaboratorLabel} from the collaborators list" : "Verwijder {collaboratorLabel} van de bijdragerslijst", + "Copy the public link" : "Kopieer de openbare link", + "Delete the public link" : "Verwijder de openbare link", + "Add people or groups who can edit your album" : "Voeg mensen of groepen toe die je album kunnen bewerken", + "Public link copied!" : "Openbare link gekopieerd!", "Copy public link" : "Kopieer openbare link", - "Public link" : "Openbare Link", + "Share via public link" : "Deel via openbare link", + "Failed to fetch collaborators list." : "Ophalen van bijdragerslijst is mislukt.", + "Public link" : "Openbare link", + "Failed to fetch album." : "Ophalen van album mislukt.", + "Failed to update album." : "Bijwerken van album mislukt.", + "New album" : "Nieuw album", + "Create new album" : "Maak nieuw album", + "Edit album details" : "Bewerk albumdetails", + "Could not load the selected album" : "Kon het geselecteerde album niet laden", + "Remove Album" : "Verwijder album", + "Failed to delete {name}." : "Verwijderen van {name} mislukt.", + "Name of the album" : "Naam van het album", + "Location of the album" : "Locatie van het album", + "Go back to the previous view." : "Ga terug naar de vorige weergave.", + "Go to the add collaborators view." : "Ga naar de bijdragers toevoegen weergave.", + "Back to the new album form." : "Terug naar het formulier voor nieuw album.", "Back" : "Terug", + "Add collaborators" : "Bijdragers toevoegen", "Save" : "Opslaan", + "Create album" : "Maak album", + "Add selection to album {albumName}" : "Selectie toevoegen aan album {albumName}", + "Create a new album." : "Maak een nieuw album.", + "_Share with %n user_::_Share with %n users_" : ["Delen met %n gebruiker","Delen met %n gebruikers"], + "Save collaborators for this album." : "Bewaar bijdragers voor dit album.", "Year" : "Jaar", "Month" : "Maand", "Day" : "Dag", "Time" : "Tijd", "Hour" : "Uur", "Minute" : "Minuut", + "Update Exif" : "Exif bijwerken", "Title" : "Titel", "Description" : "Beschrijving", + "Date Taken" : "Datum gemaakt", "Label" : "Label", + "Camera Make" : "Cameramerk", + "Camera Model" : "Cameramodel", + "Lens Model" : "Lensmodel", "Copyright" : "Auteursrecht", + "Remove person" : "Verwijder persoon", "Name" : "Naam", + "Rename person" : "Hernoem persoon", "Update" : "Update", + "Share Folder" : "Map delen", + "You cannot share the root folder" : "Je kunt de hoofdmap niet delen", + "Use the sidebar to share this folder." : "Gebruik de zijbalk om deze map te delen.", + "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Als je een openbare deellink maakt, klik op vernieuwen en een bijbehorende link naar Herinneringen wordt hieronder weergegeven.", "Refresh" : "Verversen", "Remove" : "Verwijderen", + "Share album" : "Album delen", + "Download album" : "Album downloaden", + "Delete album" : "Album verwijderen", + "Merge with different person" : "Samenvoegen met ander persoon", "Share folder" : "Map delen", + "Folder View" : "Mapweergave", + "Timeline View" : "Tijdlijnweergave", + "No Exif data found! Continue?" : "Geen Exif gegevens gevonden! Doorgaan?", "Unsaved changes" : "Niet opgeslagen veranderingen", "Share" : "Delen", + "Sidebar" : "Zijbalk", + "Slideshow" : "Diavoorstelling", "Close" : "Sluit", "Previous" : "Vorige", "Next" : "Volgende", "Are you sure you want to delete?" : "Weet je zeker dat je wilt verwijderen?", "Reset" : "Herstellen", + "All changes will be lost." : "Alle aanpassingen zullen verloren gaan.", + "Are you sure you want to continue?" : "Weet je zeker dat je wilt doorgaan?", "Continue" : "Doorgaan", "Undo" : "Ongedaan maken", "Redo" : "Opnieuw doen", - "Zoom in" : "Zoom in", - "Draw" : "Teken", + "Show original image" : "Toon originele afbeelding", + "Zoom in" : "Inzoomen", + "Zoom out" : "Uitzoomen", + "Toggle zoom menu" : "Toon/verberg zoommenu", + "Adjust" : "Aanpassen", + "Filters" : "Filters", + "Draw" : "Tekenen", "Original" : "Origineel", - "Custom" : "Maatwerk", - "Un-flip X" : "Ontspiegelen X", + "Custom" : "Aangepast", + "Landscape" : "Landschap", + "Portrait" : "Portret", + "Ellipse" : "Ovaal", + "Arrow" : "Pijl", + "Blur" : "Vervagen", + "Brightness" : "Helderheid", + "Contrast" : "Contrast", + "Un-flip X" : "Ontspiegel X", + "Flip X" : "Spiegel X", + "Un-flip Y" : "Spiegel Y", + "Flip Y" : "Ontspiegel Y", + "HSV" : "HSV", + "Hue" : "Tint", + "Saturation" : "Verzadiging", "Value" : "Waarden", "Image" : "Afbeelding", + "+ Add image" : "+ Afbeelding toevoegen", "Line" : "Lijn", + "Polygon" : "Veelhoek", + "Rectangle" : "Rechthoek", + "Corner Radius" : "Hoekradius", + "Height in pixels" : "Hoogte in pixels", + "Toggle ratio lock" : "In-/uitschakelen ratio vergrendeling", + "Rotate" : "Draaien", "Text" : "Tekst", "Size" : "Omvang", + "Line height" : "Regelhoogte", + "Warmth" : "Warmte", + "Shadow" : "Schaduw", + "Opacity" : "Doorzichtigheid", "Position" : "Positie", + "Stroke" : "Rand", "Extension" : "Extensie", "Name is required." : "Naam is verplicht.", "Quality" : "Kwaliteit", + "Saved image size (width x height)" : "Grootte van opgeslagen afbeelding (breedte x hoogte)", + "Actual size (100%)" : "Ware grootte (100%)", + "Fit size" : "Passend maken", "Direct" : "Direct", - "Auto" : "Automatisch" + "Auto" : "Automatisch", + "Failed to create {albumName}." : "Het maken van {albumName} is mislukt.", + "Failed to rename {currentAlbumName} to {newAlbumName}." : "Hernoemen van {currentAlbumName} naar {newAlbumName} mislukt.", + "Failed to delete {fileName}." : "Verwijderen van {fileName} mislukt." }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/nl.json b/l10n/nl.json index b48626b5..88f0b1e7 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -1,4 +1,6 @@ { "translations": { + "Memories" : "Herinneringen", + "Fast, modern and advanced photo management suite" : "Snelle, moderne en geavanceerde suite voor fotobeheer", "Settings" : "Instellingen", "People" : "Mensen", "Timeline" : "Tijdlijn", @@ -6,62 +8,169 @@ "Favorites" : "Favorieten", "Videos" : "Videos", "Albums" : "Albums", - "Archive" : "Archiveren", + "Archive" : "Archief", "On this day" : "Vandaag", "Tags" : "Tags", "Maps" : "Kaarten", + "A better photos experience awaits you" : "Een betere foto-ervaring wacht op je", + "Choose the root folder of your timeline to begin" : "Kies de hoofdmap van je tijdlijn om te beginnen", + "If you just installed Memories, run:" : "Als je Herinneringen net hebt geïnstalleerd, voer je het volgende uit:", + "Continue to Memories" : "Doorgaan naar Herinneringen", + "Choose again" : "Opnieuw kiezen", + "Click here to start" : "Klik hier om te beginnen", + "You can always change this later in settings" : "Je kunt dit later altijd nog wijzigen in de instellingen", + "Choose the root of your timeline" : "Kies de hoofdmap van je tijdlijn", + "_Found {n} item in {path}_::_Found {n} items in {path}_" : ["{n} items gevonden in {path}","{n} items gevonden in {path}"], "Edit" : "Bewerk", + "No title" : "Geen titel", + "No description" : "Geen beschrijving", "Loading …" : "Laden …", "Cancel" : "Annuleren", "Delete" : "Verwijder", + "Remove from album" : "Verwijderen uit album", "Download" : "Download", "Favorite" : "Favoriet", "Unarchive" : "Terugzetten uit archief", + "Edit Date/Time" : "Datum/tijd bewerken", + "Edit EXIF Data" : "Bewerk EXIF gegevens", "View in folder" : "Bekijken in map", + "Move to folder" : "Verplaatsen naar map", + "Add to album" : "Toevoegen aan album", + "Your Timeline" : "Je tijdlijn", + "Processing … {n}/{m}" : "Verwerken … {n}/{m}", + "_{n} item added to album_::_{n} items added to album_" : ["{n} items toegevoegd aan album","{n} items toegevoegd aan album"], + "Search for collaborators" : "Zoeken naar bijdragers", + "Search people or groups" : "Zoek mensen of groepen", + "Add {collaboratorLabel} to the collaborators list" : "Voeg {collaboratorLabel} toe aan de bijdragerslijst", + "No collaborators available" : "Geen bijdragers beschikbaar", + "Remove {collaboratorLabel} from the collaborators list" : "Verwijder {collaboratorLabel} van de bijdragerslijst", + "Copy the public link" : "Kopieer de openbare link", + "Delete the public link" : "Verwijder de openbare link", + "Add people or groups who can edit your album" : "Voeg mensen of groepen toe die je album kunnen bewerken", + "Public link copied!" : "Openbare link gekopieerd!", "Copy public link" : "Kopieer openbare link", - "Public link" : "Openbare Link", + "Share via public link" : "Deel via openbare link", + "Failed to fetch collaborators list." : "Ophalen van bijdragerslijst is mislukt.", + "Public link" : "Openbare link", + "Failed to fetch album." : "Ophalen van album mislukt.", + "Failed to update album." : "Bijwerken van album mislukt.", + "New album" : "Nieuw album", + "Create new album" : "Maak nieuw album", + "Edit album details" : "Bewerk albumdetails", + "Could not load the selected album" : "Kon het geselecteerde album niet laden", + "Remove Album" : "Verwijder album", + "Failed to delete {name}." : "Verwijderen van {name} mislukt.", + "Name of the album" : "Naam van het album", + "Location of the album" : "Locatie van het album", + "Go back to the previous view." : "Ga terug naar de vorige weergave.", + "Go to the add collaborators view." : "Ga naar de bijdragers toevoegen weergave.", + "Back to the new album form." : "Terug naar het formulier voor nieuw album.", "Back" : "Terug", + "Add collaborators" : "Bijdragers toevoegen", "Save" : "Opslaan", + "Create album" : "Maak album", + "Add selection to album {albumName}" : "Selectie toevoegen aan album {albumName}", + "Create a new album." : "Maak een nieuw album.", + "_Share with %n user_::_Share with %n users_" : ["Delen met %n gebruiker","Delen met %n gebruikers"], + "Save collaborators for this album." : "Bewaar bijdragers voor dit album.", "Year" : "Jaar", "Month" : "Maand", "Day" : "Dag", "Time" : "Tijd", "Hour" : "Uur", "Minute" : "Minuut", + "Update Exif" : "Exif bijwerken", "Title" : "Titel", "Description" : "Beschrijving", + "Date Taken" : "Datum gemaakt", "Label" : "Label", + "Camera Make" : "Cameramerk", + "Camera Model" : "Cameramodel", + "Lens Model" : "Lensmodel", "Copyright" : "Auteursrecht", + "Remove person" : "Verwijder persoon", "Name" : "Naam", + "Rename person" : "Hernoem persoon", "Update" : "Update", + "Share Folder" : "Map delen", + "You cannot share the root folder" : "Je kunt de hoofdmap niet delen", + "Use the sidebar to share this folder." : "Gebruik de zijbalk om deze map te delen.", + "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Als je een openbare deellink maakt, klik op vernieuwen en een bijbehorende link naar Herinneringen wordt hieronder weergegeven.", "Refresh" : "Verversen", "Remove" : "Verwijderen", + "Share album" : "Album delen", + "Download album" : "Album downloaden", + "Delete album" : "Album verwijderen", + "Merge with different person" : "Samenvoegen met ander persoon", "Share folder" : "Map delen", + "Folder View" : "Mapweergave", + "Timeline View" : "Tijdlijnweergave", + "No Exif data found! Continue?" : "Geen Exif gegevens gevonden! Doorgaan?", "Unsaved changes" : "Niet opgeslagen veranderingen", "Share" : "Delen", + "Sidebar" : "Zijbalk", + "Slideshow" : "Diavoorstelling", "Close" : "Sluit", "Previous" : "Vorige", "Next" : "Volgende", "Are you sure you want to delete?" : "Weet je zeker dat je wilt verwijderen?", "Reset" : "Herstellen", + "All changes will be lost." : "Alle aanpassingen zullen verloren gaan.", + "Are you sure you want to continue?" : "Weet je zeker dat je wilt doorgaan?", "Continue" : "Doorgaan", "Undo" : "Ongedaan maken", "Redo" : "Opnieuw doen", - "Zoom in" : "Zoom in", - "Draw" : "Teken", + "Show original image" : "Toon originele afbeelding", + "Zoom in" : "Inzoomen", + "Zoom out" : "Uitzoomen", + "Toggle zoom menu" : "Toon/verberg zoommenu", + "Adjust" : "Aanpassen", + "Filters" : "Filters", + "Draw" : "Tekenen", "Original" : "Origineel", - "Custom" : "Maatwerk", - "Un-flip X" : "Ontspiegelen X", + "Custom" : "Aangepast", + "Landscape" : "Landschap", + "Portrait" : "Portret", + "Ellipse" : "Ovaal", + "Arrow" : "Pijl", + "Blur" : "Vervagen", + "Brightness" : "Helderheid", + "Contrast" : "Contrast", + "Un-flip X" : "Ontspiegel X", + "Flip X" : "Spiegel X", + "Un-flip Y" : "Spiegel Y", + "Flip Y" : "Ontspiegel Y", + "HSV" : "HSV", + "Hue" : "Tint", + "Saturation" : "Verzadiging", "Value" : "Waarden", "Image" : "Afbeelding", + "+ Add image" : "+ Afbeelding toevoegen", "Line" : "Lijn", + "Polygon" : "Veelhoek", + "Rectangle" : "Rechthoek", + "Corner Radius" : "Hoekradius", + "Height in pixels" : "Hoogte in pixels", + "Toggle ratio lock" : "In-/uitschakelen ratio vergrendeling", + "Rotate" : "Draaien", "Text" : "Tekst", "Size" : "Omvang", + "Line height" : "Regelhoogte", + "Warmth" : "Warmte", + "Shadow" : "Schaduw", + "Opacity" : "Doorzichtigheid", "Position" : "Positie", + "Stroke" : "Rand", "Extension" : "Extensie", "Name is required." : "Naam is verplicht.", "Quality" : "Kwaliteit", + "Saved image size (width x height)" : "Grootte van opgeslagen afbeelding (breedte x hoogte)", + "Actual size (100%)" : "Ware grootte (100%)", + "Fit size" : "Passend maken", "Direct" : "Direct", - "Auto" : "Automatisch" + "Auto" : "Automatisch", + "Failed to create {albumName}." : "Het maken van {albumName} is mislukt.", + "Failed to rename {currentAlbumName} to {newAlbumName}." : "Hernoemen van {currentAlbumName} naar {newAlbumName} mislukt.", + "Failed to delete {fileName}." : "Verwijderen van {fileName} mislukt." },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/ru.js b/l10n/ru.js index 7aa0caa4..7cde7542 100644 --- a/l10n/ru.js +++ b/l10n/ru.js @@ -19,6 +19,8 @@ OC.L10N.register( "Click here to start" : "Нажмите здесь чтобы начать", "You can always change this later in settings" : "Эти параметры могут быть позднее изменены в разделе «Настройки»", "Edit" : "Редактировать", + "No title" : "Без названия", + "No description" : "Нет описания", "Loading …" : "Загрузка …", "Cancel" : "Отменить", "Delete" : "Удалить", @@ -27,20 +29,26 @@ OC.L10N.register( "Favorite" : "В избранное", "Unarchive" : "Восстановить из архива", "Edit Date/Time" : "Изменить дату и время", + "Edit EXIF Data" : "Редактировать EXIF", "View in folder" : "Посмотреть в каталоге", + "Move to folder" : "Переместить в папку", "Add to album" : "Добавить в альбом", "Move to another person" : "Объединить с другой меткой лица", "Remove from person" : "Снять отметку лица", "You are about to download a large number of files. Are you sure?" : "Подтвердите скачивание большого количества файлов.", "You are about to delete a large number of files. Are you sure?" : "Подтвердите удаление большого количества файлов.", "You are about to touch a large number of files. Are you sure?" : "Подтвердите выполнение действия для большого числа файлов.", + "_{n} selected_::_{n} selected_" : ["Выбран: {n}","Выбрано: {n}","Выбрано: {n}","Выбрано: {n}"], "Timeline Path" : "Расположение", "Folders Path" : "Верхний уровень для папок", "Show hidden folders" : "Показывать скрытые файлы", "Square grid mode" : "Квадратные миниатюры", "Choose Timeline Paths" : "Расположение для истории", "Your Timeline" : "Ваша история", + "You will find your friends soon. Please, be patient." : "Скоро вы найдете своих друзей. Пожалуйста, наберитесь терпения.", + "Face Recognition is disabled. Enable in settings to find your friends." : "Распознавание лиц отключено. Включите его в настройках для поиска своих друзей.", "Failed to load some photos" : "Не удалось загрузить некоторые фотографии", + "Processing … {n}/{m}" : "Обработка... {n}/{m}", "Search for collaborators" : "Поиск людей и групп для добавления в соавторы", "Search people or groups" : "Введите имя пользователя или название группы…", "Add {collaboratorLabel} to the collaborators list" : "Добавить {collaboratorLabel} в соавторы", @@ -83,9 +91,15 @@ OC.L10N.register( "Hour" : "Час", "Minute" : "Минута", "Update Exif" : "Обновить EXIF", + "Newest" : "Более новые", + "Oldest" : "Более старые", + "Loading data … {n}/{m}" : "Загрузка данных... {n}/{m}", "Title" : "Название", "Description" : "Описание", + "Date Taken" : "Дата съемки", "Label" : "Метка", + "Camera Model" : "Модель камеры", + "Lens Model" : "Модель линз", "Copyright" : "Авторские права", "Remove person" : "Удалить", "Name" : "Имя", @@ -98,12 +112,17 @@ OC.L10N.register( "You cannot share the root folder" : "Корневая папка не может быть опубликована", "Use the sidebar to share this folder." : "Чтобы опубликовать эту папку, воспользуйтесь боковым меню. ", "Refresh" : "Обновить", + "Choose a folder" : "Выберите папку", "Remove" : "Удалить", "Add Path" : "Добавть путь", "Share album" : "Опубликовать альбом", + "Download album" : "Скачать альбом", "Delete album" : "Удалить альбом", "Merge with different person" : "Объединить с другой меткой", + "Mark person in preview" : "Отметить человека в предварительном просмотре", "Share folder" : "Поделиться папкой", + "Folder View" : "Просмотр в виде папок", + "Timeline View" : "Просмотр в виде шкалы времени", "Move left" : "Переместить влево", "Move right" : "Переместить вправо", "Failed to get Exif data. Metadata may be lost!" : "Не удалось получить данные EXIF. Метаданные могут быть утеряны.", @@ -115,9 +134,13 @@ OC.L10N.register( "Share" : "Поделиться", "Sidebar" : "Боковая панель", "Download Video" : "Скачать видео", + "Slideshow" : "Слайд шоу", "Close" : "Закрыть", "Previous" : "Назад", "Next" : "Далее", + "Video sharing not supported yet" : "Публикация видео пока не поддерживается", + "Cannot share this type of data" : "Невозможно опубликовать такой тип данных", + "Are you sure you want to delete?" : "Вы уверены, что хотите удалить?", "Save as" : "Сохранить как", "Reset" : "Сброс", "All changes will be lost." : "Изменения не будут сохранены.", @@ -205,13 +228,20 @@ OC.L10N.register( "Transcoding failed." : "Ошибка транскодирования.", "Direct" : "Личное", "Auto" : "Автоматически", + "Shared Folder" : "Опубликованная Папка", + "Shared Album" : "Опубликованный альбом", "Failed to create {albumName}." : "Не удалось создать альбом «{albumName}».", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Не удалось переименовать альбом «{currentAlbumName}» в «{newAlbumName}».", "General Failure" : "Общий сбой", "Error: {msg}" : "Ошибка: {msg}", "Failed to delete files." : "Ошибка удаления файлов.", "Failed to delete {fileName}." : "Ошибка удаления файла «{fileName}».", + "Failed to move files." : "Не удалось переместить файлы.", + "Could not move {fileName}, target exists." : "Ошибка перемещения {fileName}, файл уже существует", + "Failed to move {fileName}." : "Не удалось переместить {fileName}", + "Failed to download files" : "Не удалось скачать файлы", "Failed to favorite files." : "Не удалось добавить файлы в избранное.", + "Failed to favorite some files." : "Некоторые файлы не удалось добавить в избранное ", "Failed to favorite {fileName}." : "Не удалось добавить файл «{fileName}» в избранное." }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/l10n/ru.json b/l10n/ru.json index 224108f1..7eb91ae9 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -17,6 +17,8 @@ "Click here to start" : "Нажмите здесь чтобы начать", "You can always change this later in settings" : "Эти параметры могут быть позднее изменены в разделе «Настройки»", "Edit" : "Редактировать", + "No title" : "Без названия", + "No description" : "Нет описания", "Loading …" : "Загрузка …", "Cancel" : "Отменить", "Delete" : "Удалить", @@ -25,20 +27,26 @@ "Favorite" : "В избранное", "Unarchive" : "Восстановить из архива", "Edit Date/Time" : "Изменить дату и время", + "Edit EXIF Data" : "Редактировать EXIF", "View in folder" : "Посмотреть в каталоге", + "Move to folder" : "Переместить в папку", "Add to album" : "Добавить в альбом", "Move to another person" : "Объединить с другой меткой лица", "Remove from person" : "Снять отметку лица", "You are about to download a large number of files. Are you sure?" : "Подтвердите скачивание большого количества файлов.", "You are about to delete a large number of files. Are you sure?" : "Подтвердите удаление большого количества файлов.", "You are about to touch a large number of files. Are you sure?" : "Подтвердите выполнение действия для большого числа файлов.", + "_{n} selected_::_{n} selected_" : ["Выбран: {n}","Выбрано: {n}","Выбрано: {n}","Выбрано: {n}"], "Timeline Path" : "Расположение", "Folders Path" : "Верхний уровень для папок", "Show hidden folders" : "Показывать скрытые файлы", "Square grid mode" : "Квадратные миниатюры", "Choose Timeline Paths" : "Расположение для истории", "Your Timeline" : "Ваша история", + "You will find your friends soon. Please, be patient." : "Скоро вы найдете своих друзей. Пожалуйста, наберитесь терпения.", + "Face Recognition is disabled. Enable in settings to find your friends." : "Распознавание лиц отключено. Включите его в настройках для поиска своих друзей.", "Failed to load some photos" : "Не удалось загрузить некоторые фотографии", + "Processing … {n}/{m}" : "Обработка... {n}/{m}", "Search for collaborators" : "Поиск людей и групп для добавления в соавторы", "Search people or groups" : "Введите имя пользователя или название группы…", "Add {collaboratorLabel} to the collaborators list" : "Добавить {collaboratorLabel} в соавторы", @@ -81,9 +89,15 @@ "Hour" : "Час", "Minute" : "Минута", "Update Exif" : "Обновить EXIF", + "Newest" : "Более новые", + "Oldest" : "Более старые", + "Loading data … {n}/{m}" : "Загрузка данных... {n}/{m}", "Title" : "Название", "Description" : "Описание", + "Date Taken" : "Дата съемки", "Label" : "Метка", + "Camera Model" : "Модель камеры", + "Lens Model" : "Модель линз", "Copyright" : "Авторские права", "Remove person" : "Удалить", "Name" : "Имя", @@ -96,12 +110,17 @@ "You cannot share the root folder" : "Корневая папка не может быть опубликована", "Use the sidebar to share this folder." : "Чтобы опубликовать эту папку, воспользуйтесь боковым меню. ", "Refresh" : "Обновить", + "Choose a folder" : "Выберите папку", "Remove" : "Удалить", "Add Path" : "Добавть путь", "Share album" : "Опубликовать альбом", + "Download album" : "Скачать альбом", "Delete album" : "Удалить альбом", "Merge with different person" : "Объединить с другой меткой", + "Mark person in preview" : "Отметить человека в предварительном просмотре", "Share folder" : "Поделиться папкой", + "Folder View" : "Просмотр в виде папок", + "Timeline View" : "Просмотр в виде шкалы времени", "Move left" : "Переместить влево", "Move right" : "Переместить вправо", "Failed to get Exif data. Metadata may be lost!" : "Не удалось получить данные EXIF. Метаданные могут быть утеряны.", @@ -113,9 +132,13 @@ "Share" : "Поделиться", "Sidebar" : "Боковая панель", "Download Video" : "Скачать видео", + "Slideshow" : "Слайд шоу", "Close" : "Закрыть", "Previous" : "Назад", "Next" : "Далее", + "Video sharing not supported yet" : "Публикация видео пока не поддерживается", + "Cannot share this type of data" : "Невозможно опубликовать такой тип данных", + "Are you sure you want to delete?" : "Вы уверены, что хотите удалить?", "Save as" : "Сохранить как", "Reset" : "Сброс", "All changes will be lost." : "Изменения не будут сохранены.", @@ -203,13 +226,20 @@ "Transcoding failed." : "Ошибка транскодирования.", "Direct" : "Личное", "Auto" : "Автоматически", + "Shared Folder" : "Опубликованная Папка", + "Shared Album" : "Опубликованный альбом", "Failed to create {albumName}." : "Не удалось создать альбом «{albumName}».", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Не удалось переименовать альбом «{currentAlbumName}» в «{newAlbumName}».", "General Failure" : "Общий сбой", "Error: {msg}" : "Ошибка: {msg}", "Failed to delete files." : "Ошибка удаления файлов.", "Failed to delete {fileName}." : "Ошибка удаления файла «{fileName}».", + "Failed to move files." : "Не удалось переместить файлы.", + "Could not move {fileName}, target exists." : "Ошибка перемещения {fileName}, файл уже существует", + "Failed to move {fileName}." : "Не удалось переместить {fileName}", + "Failed to download files" : "Не удалось скачать файлы", "Failed to favorite files." : "Не удалось добавить файлы в избранное.", + "Failed to favorite some files." : "Некоторые файлы не удалось добавить в избранное ", "Failed to favorite {fileName}." : "Не удалось добавить файл «{fileName}» в избранное." },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" } \ No newline at end of file diff --git a/l10n/sl.js b/l10n/sl.js index 3867112f..bdfc1fb5 100644 --- a/l10n/sl.js +++ b/l10n/sl.js @@ -1,9 +1,12 @@ OC.L10N.register( "memories", { + "Memories" : "Spomini", "Fast, modern and advanced photo management suite" : "Hiter, sodoben in zmogljiv urejevalnik fotografij", "Settings" : "Nastavitve", + "People (Recognize)" : "Ljudje (prepoznava)", "People" : "Osebe", + "People (Face Recognition)" : "Ljudje (prepoznava obraza)", "EXIF" : "EXIF", "Timeline" : "Časovnica", "Folders" : "Mape", @@ -14,17 +17,27 @@ OC.L10N.register( "On this day" : "Na današnji dan", "Tags" : "Oznake", "Maps" : "Zemljevidi", + "Continue to Memories" : "Nadaljujte med Spomine", + "Choose again" : "Ponovni izobor", + "Click here to start" : "Kliknite za začetek", "Edit" : "Uredi", "No title" : "Ni naslova", "No description" : "Ni opisa", "Loading …" : "Poteka nalaganje …", "Cancel" : "Prekliči", "Delete" : "Izbriši", + "Remove from album" : "Odstrani iz albuma", "Download" : "Prejmi", "Favorite" : "Priljubljeno", "Unarchive" : "Odpri iz arhiva", + "Edit Date/Time" : "Uredi datum in čas", + "Edit EXIF Data" : "Uredi podatke EXIF", "View in folder" : "Pokaži v mapi", + "Move to folder" : "Premakni v mapo", "Add to album" : "Dodaj album", + "Folders Path" : "Pot map", + "Show hidden folders" : "Pokaži skrite mape", + "Square grid mode" : "Način kvadratne mreže", "Search for collaborators" : "Iskanje sodelujočih", "Search people or groups" : "Iskanje oseb in skupin", "Add {collaboratorLabel} to the collaborators list" : "Dodaj {collaboratorLabel} na seznam sodelujočih", @@ -61,9 +74,17 @@ OC.L10N.register( "Time" : "Čas", "Hour" : "Ura", "Minute" : "Minuta", + "Update Exif" : "Posodobi EXIF", + "Newest" : "Najnovejše", + "Oldest" : "Najstarejše", + "Loading data … {n}/{m}" : "Poteka nalaganje podatkov … {n}/{m}", "Title" : "Naziv", "Description" : "Opis", + "Date Taken" : "Datum zajema", "Label" : "Oznaka", + "Camera Make" : "Vrsta fotoaparata", + "Camera Model" : "Model fotoaparata", + "Lens Model" : "Model leče", "Copyright" : "Avtorske pravice", "Remove person" : "Odstrani osebo", "Name" : "Ime", @@ -71,14 +92,23 @@ OC.L10N.register( "Update" : "Posodobi", "Refresh" : "Osveži", "Remove" : "Odstrani", + "Add Path" : "Dodaj pot", + "Download album" : "Prejmi album", "Delete album" : "Izbriši album", "Merge with different person" : "Združi z obstoječo osebo", "Share folder" : "Omogoči souporabo mape", + "Folder View" : "Pogled mape", + "Timeline View" : "Časovni pogled", + "Move left" : "Premakni levo", + "Move right" : "Premakni desno", + "Image saved successfully" : "Slika je uspešno shranjena", "Error saving image" : "Napaka shranjevanja slike", "Unsaved changes" : "Neshranjene spremembe", "Drop changes" : "Opusti spremembe", "Share" : "Souporaba", "Sidebar" : "Bočno okno", + "Download Video" : "Prejmi posnetek", + "Slideshow" : "Projekcija", "Close" : "Zapri", "Previous" : "Predhodni", "Next" : "Naslednji", @@ -95,9 +125,10 @@ OC.L10N.register( "Zoom out" : "Oddalji", "Toggle zoom menu" : "Meni preklopa približevanja", "Adjust" : "Prilagodi", + "Fine-tune" : "Podrobno prilagajanje", "Filters" : "Filtri", "Watermark" : "Vodni žig", - "Draw" : "Risba", + "Draw" : "Nariši", "Resize" : "Spremeni velikost", "Invalid image." : "Neveljavna slika", "Crop" : "Obreži", @@ -107,20 +138,68 @@ OC.L10N.register( "Landscape" : "Pokrajina", "Portrait" : "Portret", "Ellipse" : "Elipsa", + "Classic TV" : "Klasični TV", "Arrow" : "Puščica", + "Blur" : "Zameglitev", "Brightness" : "Svetlost", + "Contrast" : "Kontrast", + "Un-flip X" : "Prekliči zrcaljenje po osi X", + "Flip X" : "Zrcali po osi X", + "Un-flip Y" : "Prekliči zrcaljenje po osi Y", + "Flip Y" : "Zrcali po osi Y", + "HSV" : "HSV", + "Saturation" : "Nasičenost", "Value" : "Vrednost", "Image" : "Slika", - "Line" : "Črtni diagram", + "Importing …" : "Poteka uvažanje ...", + "+ Add image" : "+ Dodaj sliko", + "Line" : "Črta", + "Pen" : "Pisalo", + "Polygon" : "Mnogokotnik", + "Sides" : "Drsnicew", + "Rectangle" : "Pravokotnik", + "Corner Radius" : "Radij robu", + "Width in pixels" : "Širina v točkah", + "Height in pixels" : "Višina v točkah", + "Toggle ratio lock" : "Preklopi zaklep razmerja", + "Reset to original image size" : "Ponastavi na izvorno velikost slike", + "Rotate" : "Zavrti", "Text" : "Besedilo", + "Text spacing" : "Razmik besedila", + "Text alignment" : "Poravnava besedila", + "Font family" : "Družina pisave", "Size" : "Velikost", + "Letter spacing" : "Razmik med črkami", + "Line height" : "Višina vrstice", + "Warmth" : "Toplota", + "+ Add watermark" : "+ Dodaj vodni žig", + "Choose watermark type" : "Izbor vrste vodnega žiga", + "Upload watermark" : "Pošlji vodni žig", + "Add as text" : "Dodaj kot besedilo", + "Padding" : "Blazinjenje", + "Shadow" : "Senca", + "Horizontal" : "Vodoravno", + "Vertical" : "Navpično", + "Opacity" : "Prosojnost", "Position" : "Položaj", + "Save image as" : "Shrani sliko kot", "Extension" : "Pripona", "Name is required." : "Ime mora biti vpisano.", "Quality" : "Kakovost", - "Direct" : "Neposredno izbranim", + "Actual size (100%)" : "Prava velikost (100%)", + "Fit size" : "Prilagodi velikosti", + "Transcoding failed." : "Prekodiranje je spodletelo.", + "Direct" : "Neposredno", "Auto" : "Samodejno", + "Shared Folder" : "Mapa v souporabi", "Failed to create {albumName}." : "Ustvarjanje albuma {albumName} je spodletelo.", - "Failed to delete {fileName}." : "Brisanje datoteke {fileName} je spodletelo." + "General Failure" : "Splošna napaka", + "Error: {msg}" : "Napaka: {msg}", + "Failed to delete files." : "Brisanje datotek je spodletelo.", + "Failed to delete {fileName}." : "Brisanje datoteke {fileName} je spodletelo.", + "Failed to move files." : "Premikanje datotek je spodletelo.", + "Could not move {fileName}, target exists." : "Datoteke {fileName} ni mogoče premakniti, ker cilj že obstaja.", + "Failed to move {fileName}." : "Premikanje datoteke {fileName} je spodletelo.", + "Failed to download files" : "Prejemanje datotek je spodletelo." }, "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/l10n/sl.json b/l10n/sl.json index fd269495..2c7b1c56 100644 --- a/l10n/sl.json +++ b/l10n/sl.json @@ -1,7 +1,10 @@ { "translations": { + "Memories" : "Spomini", "Fast, modern and advanced photo management suite" : "Hiter, sodoben in zmogljiv urejevalnik fotografij", "Settings" : "Nastavitve", + "People (Recognize)" : "Ljudje (prepoznava)", "People" : "Osebe", + "People (Face Recognition)" : "Ljudje (prepoznava obraza)", "EXIF" : "EXIF", "Timeline" : "Časovnica", "Folders" : "Mape", @@ -12,17 +15,27 @@ "On this day" : "Na današnji dan", "Tags" : "Oznake", "Maps" : "Zemljevidi", + "Continue to Memories" : "Nadaljujte med Spomine", + "Choose again" : "Ponovni izobor", + "Click here to start" : "Kliknite za začetek", "Edit" : "Uredi", "No title" : "Ni naslova", "No description" : "Ni opisa", "Loading …" : "Poteka nalaganje …", "Cancel" : "Prekliči", "Delete" : "Izbriši", + "Remove from album" : "Odstrani iz albuma", "Download" : "Prejmi", "Favorite" : "Priljubljeno", "Unarchive" : "Odpri iz arhiva", + "Edit Date/Time" : "Uredi datum in čas", + "Edit EXIF Data" : "Uredi podatke EXIF", "View in folder" : "Pokaži v mapi", + "Move to folder" : "Premakni v mapo", "Add to album" : "Dodaj album", + "Folders Path" : "Pot map", + "Show hidden folders" : "Pokaži skrite mape", + "Square grid mode" : "Način kvadratne mreže", "Search for collaborators" : "Iskanje sodelujočih", "Search people or groups" : "Iskanje oseb in skupin", "Add {collaboratorLabel} to the collaborators list" : "Dodaj {collaboratorLabel} na seznam sodelujočih", @@ -59,9 +72,17 @@ "Time" : "Čas", "Hour" : "Ura", "Minute" : "Minuta", + "Update Exif" : "Posodobi EXIF", + "Newest" : "Najnovejše", + "Oldest" : "Najstarejše", + "Loading data … {n}/{m}" : "Poteka nalaganje podatkov … {n}/{m}", "Title" : "Naziv", "Description" : "Opis", + "Date Taken" : "Datum zajema", "Label" : "Oznaka", + "Camera Make" : "Vrsta fotoaparata", + "Camera Model" : "Model fotoaparata", + "Lens Model" : "Model leče", "Copyright" : "Avtorske pravice", "Remove person" : "Odstrani osebo", "Name" : "Ime", @@ -69,14 +90,23 @@ "Update" : "Posodobi", "Refresh" : "Osveži", "Remove" : "Odstrani", + "Add Path" : "Dodaj pot", + "Download album" : "Prejmi album", "Delete album" : "Izbriši album", "Merge with different person" : "Združi z obstoječo osebo", "Share folder" : "Omogoči souporabo mape", + "Folder View" : "Pogled mape", + "Timeline View" : "Časovni pogled", + "Move left" : "Premakni levo", + "Move right" : "Premakni desno", + "Image saved successfully" : "Slika je uspešno shranjena", "Error saving image" : "Napaka shranjevanja slike", "Unsaved changes" : "Neshranjene spremembe", "Drop changes" : "Opusti spremembe", "Share" : "Souporaba", "Sidebar" : "Bočno okno", + "Download Video" : "Prejmi posnetek", + "Slideshow" : "Projekcija", "Close" : "Zapri", "Previous" : "Predhodni", "Next" : "Naslednji", @@ -93,9 +123,10 @@ "Zoom out" : "Oddalji", "Toggle zoom menu" : "Meni preklopa približevanja", "Adjust" : "Prilagodi", + "Fine-tune" : "Podrobno prilagajanje", "Filters" : "Filtri", "Watermark" : "Vodni žig", - "Draw" : "Risba", + "Draw" : "Nariši", "Resize" : "Spremeni velikost", "Invalid image." : "Neveljavna slika", "Crop" : "Obreži", @@ -105,20 +136,68 @@ "Landscape" : "Pokrajina", "Portrait" : "Portret", "Ellipse" : "Elipsa", + "Classic TV" : "Klasični TV", "Arrow" : "Puščica", + "Blur" : "Zameglitev", "Brightness" : "Svetlost", + "Contrast" : "Kontrast", + "Un-flip X" : "Prekliči zrcaljenje po osi X", + "Flip X" : "Zrcali po osi X", + "Un-flip Y" : "Prekliči zrcaljenje po osi Y", + "Flip Y" : "Zrcali po osi Y", + "HSV" : "HSV", + "Saturation" : "Nasičenost", "Value" : "Vrednost", "Image" : "Slika", - "Line" : "Črtni diagram", + "Importing …" : "Poteka uvažanje ...", + "+ Add image" : "+ Dodaj sliko", + "Line" : "Črta", + "Pen" : "Pisalo", + "Polygon" : "Mnogokotnik", + "Sides" : "Drsnicew", + "Rectangle" : "Pravokotnik", + "Corner Radius" : "Radij robu", + "Width in pixels" : "Širina v točkah", + "Height in pixels" : "Višina v točkah", + "Toggle ratio lock" : "Preklopi zaklep razmerja", + "Reset to original image size" : "Ponastavi na izvorno velikost slike", + "Rotate" : "Zavrti", "Text" : "Besedilo", + "Text spacing" : "Razmik besedila", + "Text alignment" : "Poravnava besedila", + "Font family" : "Družina pisave", "Size" : "Velikost", + "Letter spacing" : "Razmik med črkami", + "Line height" : "Višina vrstice", + "Warmth" : "Toplota", + "+ Add watermark" : "+ Dodaj vodni žig", + "Choose watermark type" : "Izbor vrste vodnega žiga", + "Upload watermark" : "Pošlji vodni žig", + "Add as text" : "Dodaj kot besedilo", + "Padding" : "Blazinjenje", + "Shadow" : "Senca", + "Horizontal" : "Vodoravno", + "Vertical" : "Navpično", + "Opacity" : "Prosojnost", "Position" : "Položaj", + "Save image as" : "Shrani sliko kot", "Extension" : "Pripona", "Name is required." : "Ime mora biti vpisano.", "Quality" : "Kakovost", - "Direct" : "Neposredno izbranim", + "Actual size (100%)" : "Prava velikost (100%)", + "Fit size" : "Prilagodi velikosti", + "Transcoding failed." : "Prekodiranje je spodletelo.", + "Direct" : "Neposredno", "Auto" : "Samodejno", + "Shared Folder" : "Mapa v souporabi", "Failed to create {albumName}." : "Ustvarjanje albuma {albumName} je spodletelo.", - "Failed to delete {fileName}." : "Brisanje datoteke {fileName} je spodletelo." + "General Failure" : "Splošna napaka", + "Error: {msg}" : "Napaka: {msg}", + "Failed to delete files." : "Brisanje datotek je spodletelo.", + "Failed to delete {fileName}." : "Brisanje datoteke {fileName} je spodletelo.", + "Failed to move files." : "Premikanje datotek je spodletelo.", + "Could not move {fileName}, target exists." : "Datoteke {fileName} ni mogoče premakniti, ker cilj že obstaja.", + "Failed to move {fileName}." : "Premikanje datoteke {fileName} je spodletelo.", + "Failed to download files" : "Prejemanje datotek je spodletelo." },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" } \ No newline at end of file diff --git a/l10n/th.js b/l10n/th.js index deaba7ff..7896062e 100644 --- a/l10n/th.js +++ b/l10n/th.js @@ -42,7 +42,7 @@ OC.L10N.register( "Close" : "ปิด", "Previous" : "ก่อนหน้า", "Next" : "ถัดไป", - "Reset" : "ตั้งค่าใหม่", + "Reset" : "รีเซ็ต", "Continue" : "ดำเนินการต่อ", "Undo" : "เลิกทำ", "Custom" : "กำหนดเอง", diff --git a/l10n/th.json b/l10n/th.json index 255a6e3f..7d251fdc 100644 --- a/l10n/th.json +++ b/l10n/th.json @@ -40,7 +40,7 @@ "Close" : "ปิด", "Previous" : "ก่อนหน้า", "Next" : "ถัดไป", - "Reset" : "ตั้งค่าใหม่", + "Reset" : "รีเซ็ต", "Continue" : "ดำเนินการต่อ", "Undo" : "เลิกทำ", "Custom" : "กำหนดเอง", diff --git a/l10n/zh_TW.js b/l10n/zh_TW.js index 4749fda4..ec802b76 100644 --- a/l10n/zh_TW.js +++ b/l10n/zh_TW.js @@ -41,6 +41,7 @@ OC.L10N.register( "Edit Date/Time" : "編輯日期/時間", "Edit EXIF Data" : "編輯 EXIF 資料", "View in folder" : "在資料夾中檢視", + "Move to folder" : "移動至資料夾", "Add to album" : "新增至相簿", "Move to another person" : "移動到其他人", "Remove from person" : "從人中移除", @@ -112,6 +113,7 @@ OC.L10N.register( "Label" : "標籤", "Camera Make" : "相機品牌", "Camera Model" : "相機型號", + "Lens Model" : "鏡頭型號", "Copyright" : "著作權", "Remove person" : "移除人", "Are you sure you want to remove {name}?" : "您確定您想要移除 {name} 嗎?", @@ -131,6 +133,8 @@ OC.L10N.register( "Use the sidebar to share this folder." : "使用側邊欄以分享此資料夾。", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "若您建立公開連結分享,請點擊「重新整理」,下方將會顯示對應的 Memories 連結。", "Refresh" : "重新整理", + "Choose a folder" : "選擇資料夾", + "_{n} item moved to folder_::_{n} items moved to folder_" : ["已移動 {n} 個項目至資料夾"], "Remove" : "移除", "Add Path" : "新增路徑", "Add a root to your timeline" : "新增您時間軸的根", @@ -140,6 +144,8 @@ OC.L10N.register( "Merge with different person" : "與其他人合併", "Mark person in preview" : "在預覽中標記人", "Share folder" : "分享資料夾", + "Folder View" : "資料夾檢視", + "Timeline View" : "時間軸檢視", "Move left" : "向左移動", "Move right" : "向右移動", "Failed to get Exif data. Metadata may be lost!" : "取得 Exif 資料失敗。詮釋資料可能會遺失!", @@ -253,6 +259,9 @@ OC.L10N.register( "Error: {msg}" : "錯誤:{msg}", "Failed to delete files." : "刪除檔案失敗", "Failed to delete {fileName}." : "刪除 {fileName} 失敗。", + "Failed to move files." : "移動檔案失敗。", + "Could not move {fileName}, target exists." : "無法移動 {fileName},目標已存在。", + "Failed to move {fileName}." : "移動 {fileName} 失敗", "Failed to download files" : "下載檔案失敗", "Failed to favorite files." : "加入最愛檔案失敗。", "Failed to favorite some files." : "將部份檔案加入最愛失敗。", diff --git a/l10n/zh_TW.json b/l10n/zh_TW.json index fe812739..ca6642ad 100644 --- a/l10n/zh_TW.json +++ b/l10n/zh_TW.json @@ -39,6 +39,7 @@ "Edit Date/Time" : "編輯日期/時間", "Edit EXIF Data" : "編輯 EXIF 資料", "View in folder" : "在資料夾中檢視", + "Move to folder" : "移動至資料夾", "Add to album" : "新增至相簿", "Move to another person" : "移動到其他人", "Remove from person" : "從人中移除", @@ -110,6 +111,7 @@ "Label" : "標籤", "Camera Make" : "相機品牌", "Camera Model" : "相機型號", + "Lens Model" : "鏡頭型號", "Copyright" : "著作權", "Remove person" : "移除人", "Are you sure you want to remove {name}?" : "您確定您想要移除 {name} 嗎?", @@ -129,6 +131,8 @@ "Use the sidebar to share this folder." : "使用側邊欄以分享此資料夾。", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "若您建立公開連結分享,請點擊「重新整理」,下方將會顯示對應的 Memories 連結。", "Refresh" : "重新整理", + "Choose a folder" : "選擇資料夾", + "_{n} item moved to folder_::_{n} items moved to folder_" : ["已移動 {n} 個項目至資料夾"], "Remove" : "移除", "Add Path" : "新增路徑", "Add a root to your timeline" : "新增您時間軸的根", @@ -138,6 +142,8 @@ "Merge with different person" : "與其他人合併", "Mark person in preview" : "在預覽中標記人", "Share folder" : "分享資料夾", + "Folder View" : "資料夾檢視", + "Timeline View" : "時間軸檢視", "Move left" : "向左移動", "Move right" : "向右移動", "Failed to get Exif data. Metadata may be lost!" : "取得 Exif 資料失敗。詮釋資料可能會遺失!", @@ -251,6 +257,9 @@ "Error: {msg}" : "錯誤:{msg}", "Failed to delete files." : "刪除檔案失敗", "Failed to delete {fileName}." : "刪除 {fileName} 失敗。", + "Failed to move files." : "移動檔案失敗。", + "Could not move {fileName}, target exists." : "無法移動 {fileName},目標已存在。", + "Failed to move {fileName}." : "移動 {fileName} 失敗", "Failed to download files" : "下載檔案失敗", "Failed to favorite files." : "加入最愛檔案失敗。", "Failed to favorite some files." : "將部份檔案加入最愛失敗。", diff --git a/lib/Command/Index.php b/lib/Command/Index.php index 244b14ed..b2722d31 100644 --- a/lib/Command/Index.php +++ b/lib/Command/Index.php @@ -33,6 +33,7 @@ use OCP\Files\IRootFolder; use OCP\IConfig; use OCP\IDBConnection; use OCP\IPreview; +use OCP\ITempManager; use OCP\IUser; use OCP\IUserManager; use Symfony\Component\Console\Command\Command; @@ -68,6 +69,7 @@ class Index extends Command protected IDBConnection $connection; protected Connection $connectionForSchema; protected TimelineWrite $timelineWrite; + protected ITempManager $tempManager; // Stats private int $nUser = 0; @@ -85,7 +87,8 @@ class Index extends Command IPreview $preview, IConfig $config, IDBConnection $connection, - Connection $connectionForSchema + Connection $connectionForSchema, + ITempManager $tempManager ) { parent::__construct(); @@ -95,6 +98,7 @@ class Index extends Command $this->config = $config; $this->connection = $connection; $this->connectionForSchema = $connectionForSchema; + $this->tempManager = $tempManager; $this->timelineWrite = new TimelineWrite($connection); } @@ -306,6 +310,7 @@ class Index extends Command $progress = (float) (($progress_i / $progress_n) * 100); $this->outputSection->overwrite(sprintf('%.2f%%', $progress).' scanning '.$node->getPath()); $this->parseFile($node, $opts); + $this->tempManager->clean(); } } } catch (\Exception $e) { diff --git a/lib/Controller/DownloadController.php b/lib/Controller/DownloadController.php index 5ddb5924..4d82bf6e 100644 --- a/lib/Controller/DownloadController.php +++ b/lib/Controller/DownloadController.php @@ -27,6 +27,7 @@ use bantu\IniGetWrapper\IniGetWrapper; use OCP\AppFramework\Http; use OCP\AppFramework\Http\JSONResponse; use OCP\ISession; +use OCP\ITempManager; use OCP\Security\ISecureRandom; class DownloadController extends ApiBase @@ -193,6 +194,9 @@ class DownloadController extends ApiBase // So we need to add a number to the end of the name $nameCounts = []; + /** @var ITempManager for clearing temp files */ + $tempManager = \OC::$server->get(ITempManager::class); + // Send each file foreach ($fileIds as $fileId) { if (connection_aborted()) { @@ -265,6 +269,9 @@ class DownloadController extends ApiBase if (false !== $handle) { fclose($handle); } + + // Clear any temp files + $tempManager->clean(); } } diff --git a/lib/Controller/PageController.php b/lib/Controller/PageController.php index c6d5ff35..b38fc5d5 100644 --- a/lib/Controller/PageController.php +++ b/lib/Controller/PageController.php @@ -142,6 +142,7 @@ class PageController extends Controller // Video configuration $initialState->provideInitialState('notranscode', $config->getSystemValue('memories.no_transcode', 'UNSET')); + $initialState->provideInitialState('video_default_quality', $config->getSystemValue('memories.video_default_quality', '0')); } /** diff --git a/lib/Controller/VideoController.php b/lib/Controller/VideoController.php index 0e97ecb7..a58d9a65 100644 --- a/lib/Controller/VideoController.php +++ b/lib/Controller/VideoController.php @@ -139,6 +139,15 @@ class VideoController extends ApiBase } catch (\Exception $e) { return new JSONResponse(['message' => 'Embedded video not found'], Http::STATUS_NOT_FOUND); } + } elseif (str_starts_with($liveid, 'self__traileroffset=')) { + // Remove prefix + $offset = (int) substr($liveid, \strlen('self__traileroffset=')); + if ($offset <= 0) { + return new JSONResponse(['message' => 'Invalid offset'], Http::STATUS_BAD_REQUEST); + } + + // Read file from offset to end + $blob = file_get_contents($path, false, null, $offset); } else { // Get stored video file (Apple MOV) $lp = $this->timelineQuery->getLivePhoto($fileid); @@ -213,29 +222,45 @@ class VideoController extends ApiBase } // Check for environment variables - $env = ''; + $env = []; // QSV with VAAPI - $vaapi = $this->config->getSystemValue('memories.qsv', false); - if ($vaapi) { - $env .= 'VAAPI=1 '; + if ($this->config->getSystemValue('memories.qsv', false)) { + $env[] = 'VAAPI=1'; } // NVENC - $nvenc = $this->config->getSystemValue('memories.nvenc', false); - if ($nvenc) { - $env .= 'NVENC=1 '; + if ($this->config->getSystemValue('memories.nvenc', false)) { + $env[] = 'NVENC=1'; } + // Bind address / port + $port = $this->config->getSystemValue('memories.govod_port', 47788); + $env[] = "GOVOD_BIND='127.0.0.1:{$port}'"; + // Paths $ffmpegPath = $this->config->getSystemValue('memories.ffmpeg_path', 'ffmpeg'); $ffprobePath = $this->config->getSystemValue('memories.ffprobe_path', 'ffprobe'); - $tmpPath = $this->config->getSystemValue('memories.tmp_path', sys_get_temp_dir()); - $env .= "FFMPEG='{$ffmpegPath}' FFPROBE='{$ffprobePath}' GOVOD_TEMPDIR='{$tmpPath}/go-vod' "; + $env[] = "FFMPEG='{$ffmpegPath}'"; + $env[] = "FFPROBE='{$ffprobePath}'"; - // Check if already running + // (Re-)create Temp dir + $instanceId = $this->config->getSystemValue('instanceid', 'default'); + $defaultTmp = sys_get_temp_dir().'/go-vod/'.$instanceId; + $tmpPath = $this->config->getSystemValue('memories.tmp_path', $defaultTmp); + shell_exec("rm -rf '{$tmpPath}'"); + mkdir($tmpPath, 0755, true); + + // Remove trailing slash from temp path if present + if ('/' === substr($tmpPath, -1)) { + $tmpPath = substr($tmpPath, 0, -1); + } + $env[] = "GOVOD_TEMPDIR='{$tmpPath}'"; + + // Kill already running and start new \OCA\Memories\Util::pkill($transcoder); - shell_exec("{$env} nohup {$transcoder} > {$tmpPath}/go-vod.log 2>&1 & > /dev/null"); + $env = implode(' ', $env); + shell_exec("{$env} nohup {$transcoder} > '{$tmpPath}.log' 2>&1 & > /dev/null"); // wait for 1s and try again sleep(1); @@ -249,7 +274,8 @@ class VideoController extends ApiBase // Make sure query params are repeated // For example, in folder sharing, we need the params on every request - $url = "http://127.0.0.1:47788/{$client}{$path}/{$profile}"; + $port = $this->config->getSystemValue('memories.govod_port', 47788); + $url = "http://127.0.0.1:{$port}/{$client}{$path}/{$profile}"; if ($params = $_SERVER['QUERY_STRING']) { $url .= "?{$params}"; } diff --git a/lib/Db/LivePhoto.php b/lib/Db/LivePhoto.php index e0d1d2c5..0af0053a 100644 --- a/lib/Db/LivePhoto.php +++ b/lib/Db/LivePhoto.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace OCA\Memories\Db; +use OCA\Memories\Exif; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\Files\File; use OCP\IDBConnection; @@ -26,7 +27,7 @@ class LivePhoto } /** Get liveid from photo part */ - public function getLivePhotoId(array &$exif) + public function getLivePhotoId(File &$file, array &$exif) { // Apple JPEG (MOV has ContentIdentifier) if (\array_key_exists('MediaGroupUUID', $exif)) { @@ -41,7 +42,36 @@ class LivePhoto // Google JPEG and Samsung HEIC (Apple?) if (\array_key_exists('MotionPhoto', $exif)) { if ('image/jpeg' === $exif['MIMEType']) { - // Google JPEG -- image should hopefully be in trailer + // Google Motion Photo JPEG + + // We need to read the DirectoryItemLength key to get the length of the video + // These keys are duplicate, one for the image and one for the video + // With exiftool -G4, we get the following: + // + // "Unknown:DirectoryItemSemantic": "Primary" + // "Unknown:DirectoryItemLength": 0 + // "Copy1:DirectoryItemSemantic": "MotionPhoto" + // "Copy1:DirectoryItemLength": 3011435 // <-- this is the length of the video + // + // The video is then located at the end of the file, so we can get the offset. + // Match each DirectoryItemSemantic to find MotionPhoto, then get the length. + $path = $file->getStorage()->getLocalFile($file->getInternalPath()); + $extExif = Exif::getExifWithDuplicates($path); + + foreach ($extExif as $key => $value) { + if (str_ends_with($key, ':DirectoryItemSemantic')) { + if ('MotionPhoto' === $value) { + $videoLength = $extExif[str_replace('Semantic', 'Length', $key)]; + if (\is_int($videoLength) && $videoLength > 0) { + $videoOffset = $file->getSize() - $videoLength; + + return 'self__traileroffset='.((string) $videoOffset); + } + } + } + } + + // Fallback: video should hopefully be in trailer return 'self__trailer'; } if ('image/heic' === $exif['MIMEType']) { diff --git a/lib/Db/TimelineWrite.php b/lib/Db/TimelineWrite.php index 2593ca08..27d14679 100644 --- a/lib/Db/TimelineWrite.php +++ b/lib/Db/TimelineWrite.php @@ -120,7 +120,7 @@ class TimelineWrite $dayId = floor($dateTaken / 86400); $dateTaken = gmdate('Y-m-d H:i:s', $dateTaken); [$w, $h] = Exif::getDimensions($exif); - $liveid = $this->livePhoto->getLivePhotoId($exif); + $liveid = $this->livePhoto->getLivePhotoId($file, $exif); // Video parameters $videoDuration = 0; @@ -129,20 +129,21 @@ class TimelineWrite } // Clean up EXIF to keep only useful metadata - foreach ($exif as $key => &$value) { + $filteredExif = []; + foreach ($exif as $key => $value) { // Truncate any fields > 2048 chars if (\is_string($value) && \strlen($value) > 2048) { - $exif[$key] = substr($value, 0, 2048); + $value = substr($value, 0, 2048); } - // These are huge and not needed - if (!EXIF_FIELDS_LIST[$key] ?? false) { - unset($exif[$key]); + // Only keep fields in the whitelist + if (\array_key_exists($key, EXIF_FIELDS_LIST)) { + $filteredExif[$key] = $value; } } // Store JSON string - $exifJson = json_encode($exif); + $exifJson = json_encode($filteredExif); // Store error if data > 64kb if (\is_string($exifJson)) { diff --git a/lib/Exif.php b/lib/Exif.php index fab6f75f..85dc60de 100644 --- a/lib/Exif.php +++ b/lib/Exif.php @@ -282,6 +282,11 @@ class Exif } } + public static function getExifWithDuplicates(string $path) + { + return self::getExifFromLocalPathWithSeparateProc($path, ['-G4']); + } + /** Get path to exiftool binary */ private static function getExiftool() { @@ -407,10 +412,10 @@ class Exif } } - private static function getExifFromLocalPathWithSeparateProc(string &$path) + private static function getExifFromLocalPathWithSeparateProc(string &$path, array $extraArgs = []) { $pipes = []; - $proc = proc_open(array_merge(self::getExiftool(), ['-api', 'QuickTimeUTC=1', '-n', '-U', '-json', '--b', $path]), [ + $proc = proc_open(array_merge(self::getExiftool(), ['-api', 'QuickTimeUTC=1', '-n', '-U', '-json', '--b'], $extraArgs, [$path]), [ 1 => ['pipe', 'w'], 2 => ['pipe', 'w'], ], $pipes); diff --git a/scripts/get-exiftool.sh b/scripts/get-exiftool.sh index 8827f4b8..3e2b2a7a 100755 --- a/scripts/get-exiftool.sh +++ b/scripts/get-exiftool.sh @@ -20,7 +20,7 @@ mv "exiftool-$exifver" exiftool rm -rf *.zip exiftool/t exiftool/html chmod 755 exiftool/exiftool -govod="0.0.24" +govod="0.0.25" echo "Getting go-vod $govod" wget -q "https://github.com/pulsejet/go-vod/releases/download/$govod/go-vod-amd64" wget -q "https://github.com/pulsejet/go-vod/releases/download/$govod/go-vod-aarch64" diff --git a/src/components/viewer/PsVideo.ts b/src/components/viewer/PsVideo.ts index bf522f03..812407e4 100644 --- a/src/components/viewer/PsVideo.ts +++ b/src/components/viewer/PsVideo.ts @@ -14,6 +14,10 @@ const config_noTranscode = loadState( "UNSET" ) as boolean | string; +const config_video_default_quality = Number( + loadState("memories", "video_default_quality", "0") as string +); + /** * Check if slide has video content * @@ -271,26 +275,31 @@ class VideoContentSetup { let qualityNums: number[]; if (qualityList && qualityList.length > 1) { const s = new Set(); + let hasMax = false; for (let i = 0; i < qualityList?.length; i++) { const { width, height, label } = qualityList[i]; s.add(Math.min(width, height)); if (label?.includes("max.m3u8")) { - s.add(999999999); + hasMax = true; } } + qualityNums = Array.from(s).sort((a, b) => b - a); qualityNums.unshift(0); - qualityNums.unshift(-1); + if (hasMax) { + qualityNums.unshift(-1); + } + qualityNums.unshift(-2); } // Create the plyr instance const opts: Plyr.Options = { i18n: { qualityLabel: { - "-1": t("memories", "Direct"), - 0: t("memories", "Auto"), - 999999999: t("memories", "Original"), + "-2": t("memories", "Direct"), + "-1": t("memories", "Original"), + "0": t("memories", "Auto"), }, }, fullscreen: { @@ -304,14 +313,14 @@ class VideoContentSetup { if (qualityNums) { opts.quality = { - default: 0, + default: config_video_default_quality, options: qualityNums, forced: true, onChange: (quality: number) => { qualityList = content.videojs?.qualityLevels(); if (!qualityList || !content.videojs) return; - if (quality === -1) { + if (quality === -2) { // Direct playback // Prevent any useless transcodes for (let i = 0; i < qualityList.length; ++i) { @@ -340,7 +349,7 @@ class VideoContentSetup { qualityList[i].enabled = !quality || // auto pixels === quality || // exact match - (label?.includes("max.m3u8") && quality === 999999999); // max + (label?.includes("max.m3u8") && quality === -1); // max } }, };