Merge branch 'master' into stable24

old_stable24
Varun Patil 2022-11-07 05:03:18 -08:00
commit a7430eecee
79 changed files with 2396 additions and 465 deletions

View File

@ -2,6 +2,15 @@
This file is manually updated. Please file an issue if something is missing.
## v4.6.1, v3.6.1 (2022-11-07)
- **Feature**: Native sharing from the viewer (images only)
- **Feature**: Deep linking to photos on opening viewer
- **Feature**: Password protected folder shares ([#165](https://github.com/pulsejet/memories/issues/165))
- **Feature**: Folders view will now show only folders with photos ([#163](https://github.com/pulsejet/memories/issues/163))
- Improvements to viewer UX
- Restore image editor (see v4.6.0)
## v4.6.0, v3.6.0 (2022-11-06)
- **Brand new photo viewer** with improved touch interface and UX

View File

@ -14,43 +14,53 @@ function w($base, $param) {
return [
'routes' => [
// Vue routes for deep links
['name' => 'page#main', 'url' => '/', 'verb' => 'GET'],
['name' => 'page#favorites', 'url' => '/favorites', 'verb' => 'GET'],
['name' => 'page#videos', 'url' => '/videos', 'verb' => 'GET'],
['name' => 'page#archive', 'url' => '/archive', 'verb' => 'GET'],
['name' => 'page#thisday', 'url' => '/thisday', 'verb' => 'GET'],
['name' => 'Page#main', 'url' => '/', 'verb' => 'GET'],
['name' => 'Page#favorites', 'url' => '/favorites', 'verb' => 'GET'],
['name' => 'Page#videos', 'url' => '/videos', 'verb' => 'GET'],
['name' => 'Page#archive', 'url' => '/archive', 'verb' => 'GET'],
['name' => 'Page#thisday', 'url' => '/thisday', 'verb' => 'GET'],
// Routes with params
w(['name' => 'page#folder', 'url' => '/folders/{path}', 'verb' => 'GET'], 'path'),
w(['name' => 'page#albums', 'url' => '/albums/{id}', 'verb' => 'GET'], 'id'),
w(['name' => 'page#people', 'url' => '/people/{name}', 'verb' => 'GET'], 'name'),
w(['name' => 'page#tags', 'url' => '/tags/{name}', 'verb' => 'GET'], 'name'),
w(['name' => 'Page#folder', 'url' => '/folders/{path}', 'verb' => 'GET'], 'path'),
w(['name' => 'Page#albums', 'url' => '/albums/{id}', 'verb' => 'GET'], 'id'),
w(['name' => 'Page#people', 'url' => '/people/{name}', 'verb' => 'GET'], 'name'),
w(['name' => 'Page#tags', 'url' => '/tags/{name}', 'verb' => 'GET'], 'name'),
// Public pages
['name' => 'page#sharedfolder', 'url' => '/s/{token}', 'verb' => 'GET'],
// Public folder share
['name' => 'Public#showShare', 'url' => '/s/{token}', 'verb' => 'GET'],
[
'name' => 'Public#showAuthenticate',
'url' => '/s/{token}/authenticate/{redirect}',
'verb' => 'GET',
],
[
'name' => 'Public#authenticate',
'url' => '/s/{token}/authenticate/{redirect}',
'verb' => 'POST',
],
// API Routes
['name' => 'days#days', 'url' => '/api/days', 'verb' => 'GET'],
['name' => 'days#day', 'url' => '/api/days/{id}', 'verb' => 'GET'],
['name' => 'days#dayPost', 'url' => '/api/days', 'verb' => 'POST'],
['name' => 'Days#days', 'url' => '/api/days', 'verb' => 'GET'],
['name' => 'Days#day', 'url' => '/api/days/{id}', 'verb' => 'GET'],
['name' => 'Days#dayPost', 'url' => '/api/days', 'verb' => 'POST'],
['name' => 'tags#tags', 'url' => '/api/tags', 'verb' => 'GET'],
['name' => 'tags#previews', 'url' => '/api/tag-previews', 'verb' => 'GET'],
['name' => 'Tags#tags', 'url' => '/api/tags', 'verb' => 'GET'],
['name' => 'Tags#previews', 'url' => '/api/tag-previews', 'verb' => 'GET'],
['name' => 'albums#albums', 'url' => '/api/albums', 'verb' => 'GET'],
['name' => 'Albums#albums', 'url' => '/api/albums', 'verb' => 'GET'],
['name' => 'faces#faces', 'url' => '/api/faces', 'verb' => 'GET'],
['name' => 'faces#preview', 'url' => '/api/faces/preview/{id}', 'verb' => 'GET'],
['name' => 'Faces#faces', 'url' => '/api/faces', 'verb' => 'GET'],
['name' => 'Faces#preview', 'url' => '/api/faces/preview/{id}', 'verb' => 'GET'],
['name' => 'image#info', 'url' => '/api/info/{id}', 'verb' => 'GET'],
['name' => 'image#edit', 'url' => '/api/edit/{id}', 'verb' => 'PATCH'],
['name' => 'Image#info', 'url' => '/api/info/{id}', 'verb' => 'GET'],
['name' => 'Image#edit', 'url' => '/api/edit/{id}', 'verb' => 'PATCH'],
['name' => 'archive#archive', 'url' => '/api/archive/{id}', 'verb' => 'PATCH'],
['name' => 'Archive#archive', 'url' => '/api/archive/{id}', 'verb' => 'PATCH'],
// Config API
['name' => 'other#setUserConfig', 'url' => '/api/config/{key}', 'verb' => 'PUT'],
['name' => 'Other#setUserConfig', 'url' => '/api/config/{key}', 'verb' => 'PUT'],
// Service worker
['name' => 'other#serviceWorker', 'url' => '/service-worker.js', 'verb' => 'GET'],
['name' => 'Other#serviceWorker', 'url' => '/service-worker.js', 'verb' => 'GET'],
]
];

7
l10n/bg.js vendored
View File

@ -47,6 +47,7 @@ OC.L10N.register(
"Choose the root for the folders view" : "Изберете основа за изгледа на папките",
"Your Timeline" : "Вашата времева линия",
"Failed to load some photos" : "Неуспешно зареждане на някои снимки",
"Sidebar" : "Странична лента",
"Processing … {n}/{m}" : "Обработва се ... {n}/{m}",
"{n} photos added to album" : "{n} снимки са добавени в албума",
"Search for collaborators" : "Търсене на сътрудници",
@ -74,18 +75,17 @@ OC.L10N.register(
"Location of the album" : "Местоположение на албума",
"Go back to the previous view." : "Връщане към предишния изглед.",
"Go to the add collaborators view." : "Отиване до изглед за добавяне на сътрудници.",
"Save." : "Запиши.",
"Create the album." : "Създаване на албума.",
"Back to the new album form." : "Обратно към формата на новия албум.",
"Back" : "Назад",
"Add collaborators" : "Добавяне на сътрудници",
"Save" : "Запиши",
"Create album" : "Създаване на албум",
"Add selection to album {albumName}" : "Добавяне на селекция към албум {ablumName}",
"Create a new album." : "Създаване на нов албум.",
"_Share with %n user_::_Share with %n users_" : ["Споделяне с %n потребители","Споделяне с %n потребители"],
"_%n item_::_%n items_" : ["%nелементи ","%n елементи"],
"Save collaborators for this album." : "Запис на сътрудници за този албум.",
"Share Album" : "Споделяне на Албум",
"Save" : "Запиши",
"Year" : "Година",
"Month" : "Месец",
"Day" : "Ден",
@ -120,7 +120,6 @@ OC.L10N.register(
"Share folder" : "Споделяне на папка",
"Move left" : "Преместване наляво",
"Move right" : "Преместване надясно",
"Cannot find this photo anymore!" : "Вече не мога да открия тази снимка!",
"Failed to create {albumName}." : "Неуспешно създаване на {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Неуспешно преименуване от {currentAlbumName} на {newAlbumName}.",
"General Failure" : "Грешка от общ характер",

7
l10n/bg.json vendored
View File

@ -45,6 +45,7 @@
"Choose the root for the folders view" : "Изберете основа за изгледа на папките",
"Your Timeline" : "Вашата времева линия",
"Failed to load some photos" : "Неуспешно зареждане на някои снимки",
"Sidebar" : "Странична лента",
"Processing … {n}/{m}" : "Обработва се ... {n}/{m}",
"{n} photos added to album" : "{n} снимки са добавени в албума",
"Search for collaborators" : "Търсене на сътрудници",
@ -72,18 +73,17 @@
"Location of the album" : "Местоположение на албума",
"Go back to the previous view." : "Връщане към предишния изглед.",
"Go to the add collaborators view." : "Отиване до изглед за добавяне на сътрудници.",
"Save." : "Запиши.",
"Create the album." : "Създаване на албума.",
"Back to the new album form." : "Обратно към формата на новия албум.",
"Back" : "Назад",
"Add collaborators" : "Добавяне на сътрудници",
"Save" : "Запиши",
"Create album" : "Създаване на албум",
"Add selection to album {albumName}" : "Добавяне на селекция към албум {ablumName}",
"Create a new album." : "Създаване на нов албум.",
"_Share with %n user_::_Share with %n users_" : ["Споделяне с %n потребители","Споделяне с %n потребители"],
"_%n item_::_%n items_" : ["%nелементи ","%n елементи"],
"Save collaborators for this album." : "Запис на сътрудници за този албум.",
"Share Album" : "Споделяне на Албум",
"Save" : "Запиши",
"Year" : "Година",
"Month" : "Месец",
"Day" : "Ден",
@ -118,7 +118,6 @@
"Share folder" : "Споделяне на папка",
"Move left" : "Преместване наляво",
"Move right" : "Преместване надясно",
"Cannot find this photo anymore!" : "Вече не мога да открия тази снимка!",
"Failed to create {albumName}." : "Неуспешно създаване на {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Неуспешно преименуване от {currentAlbumName} на {newAlbumName}.",
"General Failure" : "Грешка от общ характер",

8
l10n/cs.js vendored
View File

@ -48,6 +48,7 @@ OC.L10N.register(
"Choose the root for the folders view" : "Zvolte kořen pro zobrazení složek",
"Your Timeline" : "Vaše časová osa",
"Failed to load some photos" : "Některé fotky se nepodařilo načíst",
"Sidebar" : "Postranní panel",
"Processing … {n}/{m}" : "Zpracovávání… {n}/{m}",
"{n} photos added to album" : "{n} fotek přidáno do alba",
"Search for collaborators" : "Vyhledat spolupracující",
@ -75,19 +76,17 @@ OC.L10N.register(
"Location of the album" : "Umístění alba",
"Go back to the previous view." : "Jít zpět na předchozí pohled.",
"Go to the add collaborators view." : "Jít na pohled přidání spolupracujících.",
"Save." : "Uložit.",
"Create the album." : "Vytvořit album.",
"Back to the new album form." : "Zpět na formulář pro nové album.",
"Back" : "Zpět",
"Add collaborators" : "Přidat spolupracující",
"Save\") : t(\"photos\", \"Create album" : "uložit„) : t(„fotky“, „Vytvořit album",
"Save" : "Uložit",
"Create album" : "Vytvořit album",
"Add selection to album {albumName}" : "Přidat výběr do alba {albumName}",
"Create a new album." : "Vytvořit nové album.",
"_Share with %n user_::_Share with %n users_" : ["Nasdílet %n uživateli","Nasdílet %n uživatelům","Nasdílet %n uživatelům","Nasdílet %n uživatelům"],
"_%n item_::_%n items_" : ["%n položka","%n položky","%n položek","%n položky"],
"Save collaborators for this album." : "Uložit spolupracující pro toto album.",
"Share Album" : "Nasdílet album",
"Save" : "Uložit",
"Year" : "Rok",
"Month" : "Měsíc",
"Day" : "Den",
@ -127,7 +126,6 @@ OC.L10N.register(
"Move left" : "Přesunout doleva",
"Move right" : "Přesunout doprava",
"Shared Folder" : "Sdílená složka",
"Cannot find this photo anymore!" : "Tuto fotku už se nedaří nalézt!",
"Failed to create {albumName}." : "Nepodařilo se vytvořit {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Nepodařilo přejmenovat {currentAlbumName} to {newAlbumName}.",
"General Failure" : "Obecný nezdar",

8
l10n/cs.json vendored
View File

@ -46,6 +46,7 @@
"Choose the root for the folders view" : "Zvolte kořen pro zobrazení složek",
"Your Timeline" : "Vaše časová osa",
"Failed to load some photos" : "Některé fotky se nepodařilo načíst",
"Sidebar" : "Postranní panel",
"Processing … {n}/{m}" : "Zpracovávání… {n}/{m}",
"{n} photos added to album" : "{n} fotek přidáno do alba",
"Search for collaborators" : "Vyhledat spolupracující",
@ -73,19 +74,17 @@
"Location of the album" : "Umístění alba",
"Go back to the previous view." : "Jít zpět na předchozí pohled.",
"Go to the add collaborators view." : "Jít na pohled přidání spolupracujících.",
"Save." : "Uložit.",
"Create the album." : "Vytvořit album.",
"Back to the new album form." : "Zpět na formulář pro nové album.",
"Back" : "Zpět",
"Add collaborators" : "Přidat spolupracující",
"Save\") : t(\"photos\", \"Create album" : "uložit„) : t(„fotky“, „Vytvořit album",
"Save" : "Uložit",
"Create album" : "Vytvořit album",
"Add selection to album {albumName}" : "Přidat výběr do alba {albumName}",
"Create a new album." : "Vytvořit nové album.",
"_Share with %n user_::_Share with %n users_" : ["Nasdílet %n uživateli","Nasdílet %n uživatelům","Nasdílet %n uživatelům","Nasdílet %n uživatelům"],
"_%n item_::_%n items_" : ["%n položka","%n položky","%n položek","%n položky"],
"Save collaborators for this album." : "Uložit spolupracující pro toto album.",
"Share Album" : "Nasdílet album",
"Save" : "Uložit",
"Year" : "Rok",
"Month" : "Měsíc",
"Day" : "Den",
@ -125,7 +124,6 @@
"Move left" : "Přesunout doleva",
"Move right" : "Přesunout doprava",
"Shared Folder" : "Sdílená složka",
"Cannot find this photo anymore!" : "Tuto fotku už se nedaří nalézt!",
"Failed to create {albumName}." : "Nepodařilo se vytvořit {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Nepodařilo přejmenovat {currentAlbumName} to {newAlbumName}.",
"General Failure" : "Obecný nezdar",

6
l10n/da.js vendored
View File

@ -33,13 +33,12 @@ OC.L10N.register(
"Location of the album" : "Placering af albummet",
"Go back to the previous view." : "Gå tilbage til den forrige visning.",
"Go to the add collaborators view." : "Gå til visningen Tilføj samarbejdspartnere.",
"Save." : "Gem.",
"Create the album." : "Opret albummet.",
"Back to the new album form." : "Tilbage til den nye albumform.",
"Back" : "Tilbage",
"Add collaborators" : "Tilføj samarbejdspartnere",
"Create a new album." : "Opret et nyt album.",
"Save" : "Gem",
"Create album" : "Opret album",
"Create a new album." : "Opret et nyt album.",
"Year" : "År",
"Month" : "Måned",
"Day" : "Dag",
@ -50,7 +49,6 @@ OC.L10N.register(
"Loading …" : "Loading …",
"Refresh" : "Opdater",
"Share folder" : "Del mappe",
"Cannot find this photo anymore!" : "Kan ikke finde dette billede længere!",
"Failed to delete files." : "Kunne ikke slette filer.",
"Failed to delete {fileName}." : "Kunne ikke slette {fileName}.",
"Failed to favorite files." : "Kunne ikke vælge favorit filer.",

6
l10n/da.json vendored
View File

@ -31,13 +31,12 @@
"Location of the album" : "Placering af albummet",
"Go back to the previous view." : "Gå tilbage til den forrige visning.",
"Go to the add collaborators view." : "Gå til visningen Tilføj samarbejdspartnere.",
"Save." : "Gem.",
"Create the album." : "Opret albummet.",
"Back to the new album form." : "Tilbage til den nye albumform.",
"Back" : "Tilbage",
"Add collaborators" : "Tilføj samarbejdspartnere",
"Create a new album." : "Opret et nyt album.",
"Save" : "Gem",
"Create album" : "Opret album",
"Create a new album." : "Opret et nyt album.",
"Year" : "År",
"Month" : "Måned",
"Day" : "Dag",
@ -48,7 +47,6 @@
"Loading …" : "Loading …",
"Refresh" : "Opdater",
"Share folder" : "Del mappe",
"Cannot find this photo anymore!" : "Kan ikke finde dette billede længere!",
"Failed to delete files." : "Kunne ikke slette filer.",
"Failed to delete {fileName}." : "Kunne ikke slette {fileName}.",
"Failed to favorite files." : "Kunne ikke vælge favorit filer.",

7
l10n/de.js vendored
View File

@ -43,6 +43,7 @@ OC.L10N.register(
"Choose the root for the folders view" : "Wähle das Stammverzeichnis für die Ordneransicht",
"Your Timeline" : "Deine Zeitleiste",
"Failed to load some photos" : "Laden einiger Fotos fehlgeschlagen",
"Sidebar" : "Seitenleiste",
"Processing … {n}/{m}" : "Verarbeite … {n}/{m}",
"Search for collaborators" : "Suche nach Mitbearbeitenden",
"Search people or groups" : "Nach Benutzer oder Gruppen suchen",
@ -67,15 +68,14 @@ OC.L10N.register(
"Location of the album" : "Ort des Albums",
"Go back to the previous view." : "Zur vorherigen Ansicht zurückgehen",
"Go to the add collaborators view." : "Zur Ansicht Mitbearbeitende-hinzufügen wechseln.",
"Save." : "Speichern",
"Create the album." : "Das Album erstellen",
"Back to the new album form." : "Zurück zur neuen Albumform",
"Back" : "Zurück",
"Add collaborators" : "Mitbearbeitende hinzufügen",
"Save" : "Speichern",
"Create album" : "Album erstellen",
"Add selection to album {albumName}" : "Auswahl zum Album {albumName} hinzufügen",
"Create a new album." : "Ein neues Album erstellen",
"Save collaborators for this album." : "Mitbearbeitende für dieses Album speichern.",
"Save" : "Speichern",
"Year" : "Jahr",
"Month" : "Monat",
"Day" : "Tag",
@ -107,7 +107,6 @@ OC.L10N.register(
"Share folder" : "Ordner teilen",
"Move left" : "Nach links verschieben",
"Move right" : "Nach rechts verschieben",
"Cannot find this photo anymore!" : "Kann dieses Foto nicht mehr finden!",
"Failed to create {albumName}." : "{albumName} konnte nicht erstellt werden.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "{currentAlbumName} konnte nicht in {newAlbumName} umbenannt werden.",
"General Failure" : "Allgemeiner Fehler",

7
l10n/de.json vendored
View File

@ -41,6 +41,7 @@
"Choose the root for the folders view" : "Wähle das Stammverzeichnis für die Ordneransicht",
"Your Timeline" : "Deine Zeitleiste",
"Failed to load some photos" : "Laden einiger Fotos fehlgeschlagen",
"Sidebar" : "Seitenleiste",
"Processing … {n}/{m}" : "Verarbeite … {n}/{m}",
"Search for collaborators" : "Suche nach Mitbearbeitenden",
"Search people or groups" : "Nach Benutzer oder Gruppen suchen",
@ -65,15 +66,14 @@
"Location of the album" : "Ort des Albums",
"Go back to the previous view." : "Zur vorherigen Ansicht zurückgehen",
"Go to the add collaborators view." : "Zur Ansicht Mitbearbeitende-hinzufügen wechseln.",
"Save." : "Speichern",
"Create the album." : "Das Album erstellen",
"Back to the new album form." : "Zurück zur neuen Albumform",
"Back" : "Zurück",
"Add collaborators" : "Mitbearbeitende hinzufügen",
"Save" : "Speichern",
"Create album" : "Album erstellen",
"Add selection to album {albumName}" : "Auswahl zum Album {albumName} hinzufügen",
"Create a new album." : "Ein neues Album erstellen",
"Save collaborators for this album." : "Mitbearbeitende für dieses Album speichern.",
"Save" : "Speichern",
"Year" : "Jahr",
"Month" : "Monat",
"Day" : "Tag",
@ -105,7 +105,6 @@
"Share folder" : "Ordner teilen",
"Move left" : "Nach links verschieben",
"Move right" : "Nach rechts verschieben",
"Cannot find this photo anymore!" : "Kann dieses Foto nicht mehr finden!",
"Failed to create {albumName}." : "{albumName} konnte nicht erstellt werden.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "{currentAlbumName} konnte nicht in {newAlbumName} umbenannt werden.",
"General Failure" : "Allgemeiner Fehler",

8
l10n/de_DE.js vendored
View File

@ -48,6 +48,7 @@ OC.L10N.register(
"Choose the root for the folders view" : "Wählen Sie das Stammverzeichnis für die Ordneransicht",
"Your Timeline" : "Ihre Zeitleiste",
"Failed to load some photos" : "Laden einiger Fotos fehlgeschlagen",
"Sidebar" : "Seitenleiste",
"Processing … {n}/{m}" : "Verarbeite… {n}/{m}",
"{n} photos added to album" : "{n} Fotos zum Album hinzugefügt",
"Search for collaborators" : "Suche nach Mitbearbeitenden",
@ -75,19 +76,17 @@ OC.L10N.register(
"Location of the album" : "Ort des Albums",
"Go back to the previous view." : "Zur vorherigen Ansicht zurückgehen.",
"Go to the add collaborators view." : "Zur Ansicht Mitbearbeitende hinzufügen wechseln.",
"Save." : "Speichern.",
"Create the album." : "Das Album erstellen.",
"Back to the new album form." : "Zurück zur neuen Albumform.",
"Back" : "Zurück",
"Add collaborators" : "Mitarbeitende hinzufügen",
"Save\") : t(\"photos\", \"Create album" : "Speichern\") : t(\"Fotos\", \"Album erstellen",
"Save" : "Speichern",
"Create album" : "Erstelle Album",
"Add selection to album {albumName}" : "Auswahl zum Album {albumName} hinzufügen",
"Create a new album." : "Ein neues Album erstellen.",
"_Share with %n user_::_Share with %n users_" : ["Mit %n Benutzer teilen","Mit %n Benutzern telken"],
"_%n item_::_%n items_" : ["%n Element","%n Elemente"],
"Save collaborators for this album." : "Mitbearbeitende für dieses Album speichern.",
"Share Album" : "Album teilen",
"Save" : "Speichern",
"Year" : "Jahr",
"Month" : "Monat",
"Day" : "Tag",
@ -127,7 +126,6 @@ OC.L10N.register(
"Move left" : "Nach links verschieben",
"Move right" : "Nach rechts verschieben",
"Shared Folder" : "Geteilter Ordner",
"Cannot find this photo anymore!" : "Kann dieses Foto nicht mehr finden!",
"Failed to create {albumName}." : "{albumName} konnte nicht erstellt werden.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "{currentAlbumName} konnte nicht in {newAlbumName} umbenannt werden.",
"General Failure" : "Allgemeiner Fehler",

8
l10n/de_DE.json vendored
View File

@ -46,6 +46,7 @@
"Choose the root for the folders view" : "Wählen Sie das Stammverzeichnis für die Ordneransicht",
"Your Timeline" : "Ihre Zeitleiste",
"Failed to load some photos" : "Laden einiger Fotos fehlgeschlagen",
"Sidebar" : "Seitenleiste",
"Processing … {n}/{m}" : "Verarbeite… {n}/{m}",
"{n} photos added to album" : "{n} Fotos zum Album hinzugefügt",
"Search for collaborators" : "Suche nach Mitbearbeitenden",
@ -73,19 +74,17 @@
"Location of the album" : "Ort des Albums",
"Go back to the previous view." : "Zur vorherigen Ansicht zurückgehen.",
"Go to the add collaborators view." : "Zur Ansicht Mitbearbeitende hinzufügen wechseln.",
"Save." : "Speichern.",
"Create the album." : "Das Album erstellen.",
"Back to the new album form." : "Zurück zur neuen Albumform.",
"Back" : "Zurück",
"Add collaborators" : "Mitarbeitende hinzufügen",
"Save\") : t(\"photos\", \"Create album" : "Speichern\") : t(\"Fotos\", \"Album erstellen",
"Save" : "Speichern",
"Create album" : "Erstelle Album",
"Add selection to album {albumName}" : "Auswahl zum Album {albumName} hinzufügen",
"Create a new album." : "Ein neues Album erstellen.",
"_Share with %n user_::_Share with %n users_" : ["Mit %n Benutzer teilen","Mit %n Benutzern telken"],
"_%n item_::_%n items_" : ["%n Element","%n Elemente"],
"Save collaborators for this album." : "Mitbearbeitende für dieses Album speichern.",
"Share Album" : "Album teilen",
"Save" : "Speichern",
"Year" : "Jahr",
"Month" : "Monat",
"Day" : "Tag",
@ -125,7 +124,6 @@
"Move left" : "Nach links verschieben",
"Move right" : "Nach rechts verschieben",
"Shared Folder" : "Geteilter Ordner",
"Cannot find this photo anymore!" : "Kann dieses Foto nicht mehr finden!",
"Failed to create {albumName}." : "{albumName} konnte nicht erstellt werden.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "{currentAlbumName} konnte nicht in {newAlbumName} umbenannt werden.",
"General Failure" : "Allgemeiner Fehler",

3
l10n/en_GB.js vendored
View File

@ -24,7 +24,6 @@ OC.L10N.register(
"Name" : "Surname",
"Update" : "Update",
"Loading …" : "Loading …",
"Refresh" : "Refresh",
"Cannot find this photo anymore!" : "Cannot find this photo any more!"
"Refresh" : "Refresh"
},
"nplurals=2; plural=(n != 1);");

3
l10n/en_GB.json vendored
View File

@ -22,7 +22,6 @@
"Name" : "Surname",
"Update" : "Update",
"Loading …" : "Loading …",
"Refresh" : "Refresh",
"Cannot find this photo anymore!" : "Cannot find this photo any more!"
"Refresh" : "Refresh"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

8
l10n/es.js vendored
View File

@ -48,6 +48,7 @@ OC.L10N.register(
"Choose the root for the folders view" : "Seleccione la raíz de la vista de carpetas",
"Your Timeline" : "Su línea de tiempo",
"Failed to load some photos" : "Fallo al cargar algunas fotos",
"Sidebar" : "Barra lateral",
"Processing … {n}/{m}" : "Procesando ... {n}/{m}",
"{n} photos added to album" : "Se agregaron {n} fotos al álbum",
"Search for collaborators" : "Buscar colaboradores",
@ -75,19 +76,17 @@ OC.L10N.register(
"Location of the album" : "Ubicación del álbum",
"Go back to the previous view." : "Regresar a la vista anterior.",
"Go to the add collaborators view." : "Ir a la vista de añadir colaboradores.",
"Save." : "Guardar.",
"Create the album." : "Crear el álbum",
"Back to the new album form." : "Regresar al formulario de álbum nuevo.",
"Back" : "Atrás",
"Add collaborators" : "Añadir colaboradores",
"Save\") : t(\"photos\", \"Create album" : "Guardar\") : t(\"Fotos\", \"Crear álbum",
"Save" : "Guardar",
"Create album" : "Crear álbum",
"Add selection to album {albumName}" : "Añadir selección al álbum {albumName}",
"Create a new album." : "Crear un álbum nuevo.",
"_Share with %n user_::_Share with %n users_" : ["Compartir con %n usuario","Compartir con %n usuarios","Compartir con %n usuarios"],
"_%n item_::_%n items_" : ["%n ítem","%n ítems","%n ítems"],
"Save collaborators for this album." : "Guardar colaboradores para este álbum",
"Share Album" : "Compartir álbum",
"Save" : "Guardar",
"Year" : "Año",
"Month" : "Mes",
"Day" : "Día",
@ -127,7 +126,6 @@ OC.L10N.register(
"Move left" : "Mover a la izquierda",
"Move right" : "Mover a la derecha",
"Shared Folder" : "Carpeta compartida",
"Cannot find this photo anymore!" : "¡Ya no se puede conseguir esta foto!",
"Failed to create {albumName}." : "Fallo al crear {albumName}",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Fallo al renombrar {currentAlbumName} a {newAlbumName}.",
"General Failure" : "Fallo general",

8
l10n/es.json vendored
View File

@ -46,6 +46,7 @@
"Choose the root for the folders view" : "Seleccione la raíz de la vista de carpetas",
"Your Timeline" : "Su línea de tiempo",
"Failed to load some photos" : "Fallo al cargar algunas fotos",
"Sidebar" : "Barra lateral",
"Processing … {n}/{m}" : "Procesando ... {n}/{m}",
"{n} photos added to album" : "Se agregaron {n} fotos al álbum",
"Search for collaborators" : "Buscar colaboradores",
@ -73,19 +74,17 @@
"Location of the album" : "Ubicación del álbum",
"Go back to the previous view." : "Regresar a la vista anterior.",
"Go to the add collaborators view." : "Ir a la vista de añadir colaboradores.",
"Save." : "Guardar.",
"Create the album." : "Crear el álbum",
"Back to the new album form." : "Regresar al formulario de álbum nuevo.",
"Back" : "Atrás",
"Add collaborators" : "Añadir colaboradores",
"Save\") : t(\"photos\", \"Create album" : "Guardar\") : t(\"Fotos\", \"Crear álbum",
"Save" : "Guardar",
"Create album" : "Crear álbum",
"Add selection to album {albumName}" : "Añadir selección al álbum {albumName}",
"Create a new album." : "Crear un álbum nuevo.",
"_Share with %n user_::_Share with %n users_" : ["Compartir con %n usuario","Compartir con %n usuarios","Compartir con %n usuarios"],
"_%n item_::_%n items_" : ["%n ítem","%n ítems","%n ítems"],
"Save collaborators for this album." : "Guardar colaboradores para este álbum",
"Share Album" : "Compartir álbum",
"Save" : "Guardar",
"Year" : "Año",
"Month" : "Mes",
"Day" : "Día",
@ -125,7 +124,6 @@
"Move left" : "Mover a la izquierda",
"Move right" : "Mover a la derecha",
"Shared Folder" : "Carpeta compartida",
"Cannot find this photo anymore!" : "¡Ya no se puede conseguir esta foto!",
"Failed to create {albumName}." : "Fallo al crear {albumName}",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Fallo al renombrar {currentAlbumName} a {newAlbumName}.",
"General Failure" : "Fallo general",

7
l10n/eu.js vendored
View File

@ -31,6 +31,7 @@ OC.L10N.register(
"Show hidden folders" : "Erakutsi ezkutuko karpetak",
"Your Timeline" : "Zure denbora-lerroa",
"Failed to load some photos" : "Argazki batzuk kargatzeak huts egin du",
"Sidebar" : "Alboko barra",
"Processing … {n}/{m}" : "Prozesatzen ... {n}/{m}",
"Search for collaborators" : "Bilatu kolaboratzaileak",
"Search people or groups" : "Bilatu erabiltzaile edo taldeak",
@ -55,16 +56,15 @@ OC.L10N.register(
"Location of the album" : "Albumaren kokapena",
"Go back to the previous view." : "Itzuli aurreko ikuspegira.",
"Go to the add collaborators view." : "Joan kolaboratzaileak gehitzeko ikuspegira.",
"Save." : "Gorde.",
"Create the album." : "Sortu albuma.",
"Back to the new album form." : "Itzuli album berrien formulariora",
"Back" : "Atzera",
"Add collaborators" : "Gehitu kolaboratzaileak",
"Save" : "Gorde",
"Create album" : "Sortu albuma",
"Add selection to album {albumName}" : "Gehitu hautapena {albumName} albumera",
"Create a new album." : "Sortu album berria.",
"_Share with %n user_::_Share with %n users_" : ["Partekatu erabiltzaile %nekin","Partekatu %n erabiltzaileekin"],
"Save collaborators for this album." : "Gorde album honen kolaboratzaileak.",
"Save" : "Gorde",
"Year" : "Urtea",
"Month" : "Hilabetea",
"Day" : "Eguna",
@ -87,7 +87,6 @@ OC.L10N.register(
"Delete album" : "Ezabatu albuma",
"Merge with different person" : "Bateratu beste pertsona batekin",
"Share folder" : "Partekatu karpeta",
"Cannot find this photo anymore!" : "Ezin da argazki hau dagoeneko aurkitu!",
"Failed to create {albumName}." : "Ezin izan da {albumName} sortu.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Ezin izan da {currentAlbumName} berrizendatu {newAlbumName} gisa.",
"General Failure" : "Hutsegite orokorra",

7
l10n/eu.json vendored
View File

@ -29,6 +29,7 @@
"Show hidden folders" : "Erakutsi ezkutuko karpetak",
"Your Timeline" : "Zure denbora-lerroa",
"Failed to load some photos" : "Argazki batzuk kargatzeak huts egin du",
"Sidebar" : "Alboko barra",
"Processing … {n}/{m}" : "Prozesatzen ... {n}/{m}",
"Search for collaborators" : "Bilatu kolaboratzaileak",
"Search people or groups" : "Bilatu erabiltzaile edo taldeak",
@ -53,16 +54,15 @@
"Location of the album" : "Albumaren kokapena",
"Go back to the previous view." : "Itzuli aurreko ikuspegira.",
"Go to the add collaborators view." : "Joan kolaboratzaileak gehitzeko ikuspegira.",
"Save." : "Gorde.",
"Create the album." : "Sortu albuma.",
"Back to the new album form." : "Itzuli album berrien formulariora",
"Back" : "Atzera",
"Add collaborators" : "Gehitu kolaboratzaileak",
"Save" : "Gorde",
"Create album" : "Sortu albuma",
"Add selection to album {albumName}" : "Gehitu hautapena {albumName} albumera",
"Create a new album." : "Sortu album berria.",
"_Share with %n user_::_Share with %n users_" : ["Partekatu erabiltzaile %nekin","Partekatu %n erabiltzaileekin"],
"Save collaborators for this album." : "Gorde album honen kolaboratzaileak.",
"Save" : "Gorde",
"Year" : "Urtea",
"Month" : "Hilabetea",
"Day" : "Eguna",
@ -85,7 +85,6 @@
"Delete album" : "Ezabatu albuma",
"Merge with different person" : "Bateratu beste pertsona batekin",
"Share folder" : "Partekatu karpeta",
"Cannot find this photo anymore!" : "Ezin da argazki hau dagoeneko aurkitu!",
"Failed to create {albumName}." : "Ezin izan da {albumName} sortu.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Ezin izan da {currentAlbumName} berrizendatu {newAlbumName} gisa.",
"General Failure" : "Hutsegite orokorra",

7
l10n/fi.js vendored
View File

@ -46,6 +46,7 @@ OC.L10N.register(
"Choose the root for the folders view" : "Valitse kansionäkymän juurihakemisto",
"Your Timeline" : "Aikajanasi",
"Failed to load some photos" : "Joidenkin kuvien lataus epäonnistui",
"Sidebar" : "Sivupalkki",
"Processing … {n}/{m}" : "Käsitellään… {n}/{m}",
"{n} photos added to album" : "{n} kuvaa lisätty albumiin",
"Search people or groups" : "Etsi käyttäjiä tai ryhmiä",
@ -67,16 +68,15 @@ OC.L10N.register(
"Name of the album" : "Albumin nimi",
"Location of the album" : "Albumin sijainti",
"Go back to the previous view." : "Siirry takaisin edelliseen näkymään.",
"Save." : "Tallenna.",
"Create the album." : "Luo albumi.",
"Back to the new album form." : "Takaisin uuden albumin lomakkeeseen.",
"Back" : "Takaisin",
"Add collaborators" : "Lisää avustajia",
"Save" : "Tallenna",
"Create album" : "Luo albumi",
"Add selection to album {albumName}" : "Lisää valinta albumiin {albumName}",
"Create a new album." : "Luo uusi albumi.",
"_%n item_::_%n items_" : ["%n kohde","%n kohdetta"],
"Share Album" : "Jaa albumi",
"Save" : "Tallenna",
"Year" : "Vuosi",
"Month" : "Kuukausi",
"Day" : "Päivä",
@ -108,7 +108,6 @@ OC.L10N.register(
"Move left" : "Siirry vasemmalle",
"Move right" : "Siirry oikealle",
"Shared Folder" : "Jaa kansio",
"Cannot find this photo anymore!" : "Kuvaa ei enää löydy!",
"Failed to create {albumName}." : "Albumin {albumName} luominen epäonnistui.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Albumin {currentAlbumName} nimen muuttaminen muotoon {newAlbumName} epäonnistui.",
"General Failure" : "Yleinen virhe",

7
l10n/fi.json vendored
View File

@ -44,6 +44,7 @@
"Choose the root for the folders view" : "Valitse kansionäkymän juurihakemisto",
"Your Timeline" : "Aikajanasi",
"Failed to load some photos" : "Joidenkin kuvien lataus epäonnistui",
"Sidebar" : "Sivupalkki",
"Processing … {n}/{m}" : "Käsitellään… {n}/{m}",
"{n} photos added to album" : "{n} kuvaa lisätty albumiin",
"Search people or groups" : "Etsi käyttäjiä tai ryhmiä",
@ -65,16 +66,15 @@
"Name of the album" : "Albumin nimi",
"Location of the album" : "Albumin sijainti",
"Go back to the previous view." : "Siirry takaisin edelliseen näkymään.",
"Save." : "Tallenna.",
"Create the album." : "Luo albumi.",
"Back to the new album form." : "Takaisin uuden albumin lomakkeeseen.",
"Back" : "Takaisin",
"Add collaborators" : "Lisää avustajia",
"Save" : "Tallenna",
"Create album" : "Luo albumi",
"Add selection to album {albumName}" : "Lisää valinta albumiin {albumName}",
"Create a new album." : "Luo uusi albumi.",
"_%n item_::_%n items_" : ["%n kohde","%n kohdetta"],
"Share Album" : "Jaa albumi",
"Save" : "Tallenna",
"Year" : "Vuosi",
"Month" : "Kuukausi",
"Day" : "Päivä",
@ -106,7 +106,6 @@
"Move left" : "Siirry vasemmalle",
"Move right" : "Siirry oikealle",
"Shared Folder" : "Jaa kansio",
"Cannot find this photo anymore!" : "Kuvaa ei enää löydy!",
"Failed to create {albumName}." : "Albumin {albumName} luominen epäonnistui.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Albumin {currentAlbumName} nimen muuttaminen muotoon {newAlbumName} epäonnistui.",
"General Failure" : "Yleinen virhe",

7
l10n/fr.js vendored
View File

@ -30,6 +30,7 @@ OC.L10N.register(
"Timeline Path" : "Emplacement du Fil chronologique",
"Show hidden folders" : "Afficher les dossiers cachés",
"Failed to load some photos" : "Échec du chargement de certaines photos",
"Sidebar" : "Panneau latéral",
"Search for collaborators" : "Rechercher des collaborateurs",
"Search people or groups" : "Recherche des personnes ou des groupes",
"Add {collaboratorLabel} to the collaborators list" : "Ajouter {collaboratorLabel} à la liste des collaborateurs",
@ -53,15 +54,14 @@ OC.L10N.register(
"Location of the album" : "Emplacement de l'album",
"Go back to the previous view." : "Revenir à la vue précédente",
"Go to the add collaborators view." : "Allez à la vue d'ajout de collaborateurs",
"Save." : "Enregistrer",
"Create the album." : "Créer l'album",
"Back to the new album form." : "Retour au formulaire de nouvel album",
"Back" : "Retour",
"Add collaborators" : "Ajouter des collaborateurs",
"Save" : "Enregistrer",
"Create album" : "Créer un album",
"Add selection to album {albumName}" : "Ajouter la sélection à l'album {albumName}",
"Create a new album." : "Créer un nouvel album",
"Save collaborators for this album." : "Enregistrer les collaborateurs pour cet album.",
"Save" : "Enregistrer",
"Year" : "Année",
"Month" : "Mois",
"Day" : "Jour",
@ -84,7 +84,6 @@ OC.L10N.register(
"Delete album" : "Supprimer l'album",
"Merge with different person" : "Fusionner avec une différente personne",
"Share folder" : "Partager le dossier",
"Cannot find this photo anymore!" : "Impossible de trouver cette photo !",
"Failed to create {albumName}." : "Échec de la création de {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Échec du renommage de {currentAlbumName} en {newAlbumName}.",
"General Failure" : "Échec général",

7
l10n/fr.json vendored
View File

@ -28,6 +28,7 @@
"Timeline Path" : "Emplacement du Fil chronologique",
"Show hidden folders" : "Afficher les dossiers cachés",
"Failed to load some photos" : "Échec du chargement de certaines photos",
"Sidebar" : "Panneau latéral",
"Search for collaborators" : "Rechercher des collaborateurs",
"Search people or groups" : "Recherche des personnes ou des groupes",
"Add {collaboratorLabel} to the collaborators list" : "Ajouter {collaboratorLabel} à la liste des collaborateurs",
@ -51,15 +52,14 @@
"Location of the album" : "Emplacement de l'album",
"Go back to the previous view." : "Revenir à la vue précédente",
"Go to the add collaborators view." : "Allez à la vue d'ajout de collaborateurs",
"Save." : "Enregistrer",
"Create the album." : "Créer l'album",
"Back to the new album form." : "Retour au formulaire de nouvel album",
"Back" : "Retour",
"Add collaborators" : "Ajouter des collaborateurs",
"Save" : "Enregistrer",
"Create album" : "Créer un album",
"Add selection to album {albumName}" : "Ajouter la sélection à l'album {albumName}",
"Create a new album." : "Créer un nouvel album",
"Save collaborators for this album." : "Enregistrer les collaborateurs pour cet album.",
"Save" : "Enregistrer",
"Year" : "Année",
"Month" : "Mois",
"Day" : "Jour",
@ -82,7 +82,6 @@
"Delete album" : "Supprimer l'album",
"Merge with different person" : "Fusionner avec une différente personne",
"Share folder" : "Partager le dossier",
"Cannot find this photo anymore!" : "Impossible de trouver cette photo !",
"Failed to create {albumName}." : "Échec de la création de {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Échec du renommage de {currentAlbumName} en {newAlbumName}.",
"General Failure" : "Échec général",

7
l10n/hu.js vendored
View File

@ -32,6 +32,7 @@ OC.L10N.register(
"Show hidden folders" : "Rejtett mappák megjelenítése",
"Your Timeline" : "Saját idővonal",
"Failed to load some photos" : "Nem sikerült betölteni néhány fényképet",
"Sidebar" : "Oldalsáv",
"Processing … {n}/{m}" : "Feldolgozás… {n}/{m}",
"Search for collaborators" : "Közreműködők keresése",
"Search people or groups" : "Felhasználó vagy csoport keresése",
@ -55,14 +56,13 @@ OC.L10N.register(
"Location of the album" : "Az album helye",
"Go back to the previous view." : "Ugrás vissza az előző nézethez.",
"Go to the add collaborators view." : "Ugrás a közreműködők hozzáadása nézethez",
"Save." : "Mentés.",
"Create the album." : "Album létrehozása.",
"Back to the new album form." : "Vissza az új album űrlaphoz.",
"Back" : "Vissza",
"Add collaborators" : "Közreműködők hozzáadása",
"Save" : "Mentés",
"Create album" : "Album létrehozása",
"Create a new album." : "Új album létrehozása.",
"Save collaborators for this album." : "Közreműködők mentése ehhez az albumhoz.",
"Save" : "Mentés",
"Year" : "Év",
"Month" : "Hónap",
"Day" : "Nap",
@ -81,7 +81,6 @@ OC.L10N.register(
"Delete album" : "Album törlése",
"Merge with different person" : "Összevonás egy másik személlyel",
"Share folder" : "Mappa megosztása",
"Cannot find this photo anymore!" : "Ez a fénykép már nem található!",
"Failed to create {albumName}." : "A(z) {albumName} létrehozása sikertelen.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "A(z) {currentAlbumName} átnevezése a következőre sikertelen: {newAlbumName}.",
"Failed to delete files." : "A fájlok törlése sikertelen.",

7
l10n/hu.json vendored
View File

@ -30,6 +30,7 @@
"Show hidden folders" : "Rejtett mappák megjelenítése",
"Your Timeline" : "Saját idővonal",
"Failed to load some photos" : "Nem sikerült betölteni néhány fényképet",
"Sidebar" : "Oldalsáv",
"Processing … {n}/{m}" : "Feldolgozás… {n}/{m}",
"Search for collaborators" : "Közreműködők keresése",
"Search people or groups" : "Felhasználó vagy csoport keresése",
@ -53,14 +54,13 @@
"Location of the album" : "Az album helye",
"Go back to the previous view." : "Ugrás vissza az előző nézethez.",
"Go to the add collaborators view." : "Ugrás a közreműködők hozzáadása nézethez",
"Save." : "Mentés.",
"Create the album." : "Album létrehozása.",
"Back to the new album form." : "Vissza az új album űrlaphoz.",
"Back" : "Vissza",
"Add collaborators" : "Közreműködők hozzáadása",
"Save" : "Mentés",
"Create album" : "Album létrehozása",
"Create a new album." : "Új album létrehozása.",
"Save collaborators for this album." : "Közreműködők mentése ehhez az albumhoz.",
"Save" : "Mentés",
"Year" : "Év",
"Month" : "Hónap",
"Day" : "Nap",
@ -79,7 +79,6 @@
"Delete album" : "Album törlése",
"Merge with different person" : "Összevonás egy másik személlyel",
"Share folder" : "Mappa megosztása",
"Cannot find this photo anymore!" : "Ez a fénykép már nem található!",
"Failed to create {albumName}." : "A(z) {albumName} létrehozása sikertelen.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "A(z) {currentAlbumName} átnevezése a következőre sikertelen: {newAlbumName}.",
"Failed to delete files." : "A fájlok törlése sikertelen.",

5
l10n/it.js vendored
View File

@ -33,13 +33,12 @@ OC.L10N.register(
"Location of the album" : "Posizione dell'album",
"Go back to the previous view." : "Vai alla vista precedente.",
"Go to the add collaborators view." : "Vai alla vista per aggiungere collaboratori.",
"Save." : "Salva.",
"Create the album." : "Crea l'album.",
"Back" : "Indietro",
"Add collaborators" : "Aggiungi collaboratori",
"Save" : "Salva",
"Create album" : "Crea l'album",
"Create a new album." : "Crea un nuovo album",
"Save collaborators for this album." : "Salva i collaboratori per questo album.",
"Save" : "Salva",
"Year" : "Anno",
"Month" : "Mese",
"Day" : "Giorno",

5
l10n/it.json vendored
View File

@ -31,13 +31,12 @@
"Location of the album" : "Posizione dell'album",
"Go back to the previous view." : "Vai alla vista precedente.",
"Go to the add collaborators view." : "Vai alla vista per aggiungere collaboratori.",
"Save." : "Salva.",
"Create the album." : "Crea l'album.",
"Back" : "Indietro",
"Add collaborators" : "Aggiungi collaboratori",
"Save" : "Salva",
"Create album" : "Crea l'album",
"Create a new album." : "Crea un nuovo album",
"Save collaborators for this album." : "Salva i collaboratori per questo album.",
"Save" : "Salva",
"Year" : "Anno",
"Month" : "Mese",
"Day" : "Giorno",

5
l10n/ja.js vendored
View File

@ -23,12 +23,11 @@ OC.L10N.register(
"Name of the album" : "アルバム名",
"Location of the album" : "アルバムの場所",
"Go back to the previous view." : "前を表示",
"Save." : "保存",
"Create the album." : "アルバムを作成",
"Back" : "戻る",
"Add collaborators" : "共有者に追加",
"Create a new album." : "新しいアルバムを作成",
"Save" : "保存",
"Create album" : "アルバムを作成",
"Create a new album." : "新しいアルバムを作成",
"Year" : "年",
"Month" : "月",
"Day" : "日",

5
l10n/ja.json vendored
View File

@ -21,12 +21,11 @@
"Name of the album" : "アルバム名",
"Location of the album" : "アルバムの場所",
"Go back to the previous view." : "前を表示",
"Save." : "保存",
"Create the album." : "アルバムを作成",
"Back" : "戻る",
"Add collaborators" : "共有者に追加",
"Create a new album." : "新しいアルバムを作成",
"Save" : "保存",
"Create album" : "アルバムを作成",
"Create a new album." : "新しいアルバムを作成",
"Year" : "年",
"Month" : "月",
"Day" : "日",

7
l10n/lt_LT.js vendored
View File

@ -33,6 +33,7 @@ OC.L10N.register(
"Square grid mode" : "Kvadratinio tinklelio veiksena",
"Your Timeline" : "Jūsų laiko juostą",
"Failed to load some photos" : "Nepavyko įkelti kai kurių nuotraukų",
"Sidebar" : "Šoninė juosta",
"Processing … {n}/{m}" : "Apdorojama… {n}/{m}",
"Search people or groups" : "Ieškoti žmonių ar grupių",
"Copy the public link" : "Kopijuoti viešąją nuorodą",
@ -53,13 +54,12 @@ OC.L10N.register(
"Name of the album" : "Albumo pavadinimas",
"Location of the album" : "Albumo vieta",
"Go back to the previous view." : "Grįžti į ankstesnį rodinį.",
"Save." : "Įrašyti.",
"Create the album." : "Sukurti albumą.",
"Back to the new album form." : "Atgal į naujo albumo formą.",
"Back" : "Atgal",
"Save" : "Įrašyti",
"Create album" : "Sukurti albumą",
"Create a new album." : "Sukurti naują albumą.",
"Share Album" : "Bendrinti albumą",
"Save" : "Įrašyti",
"Year" : "Metai",
"Month" : "Mėnuo",
"Day" : "Diena",
@ -89,7 +89,6 @@ OC.L10N.register(
"Share folder" : "Bendrinti aplanką",
"Move left" : "Perkelti kairėn",
"Move right" : "Perkelti dešinėn",
"Cannot find this photo anymore!" : "Daugiau nebepavyksta rasti šios nuotraukos!",
"Failed to create {albumName}." : "Nepavyko sukurti {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Nepavyko pervadinti {currentAlbumName} į {newAlbumName}.",
"General Failure" : "Bendrinė nesėkmė",

7
l10n/lt_LT.json vendored
View File

@ -31,6 +31,7 @@
"Square grid mode" : "Kvadratinio tinklelio veiksena",
"Your Timeline" : "Jūsų laiko juostą",
"Failed to load some photos" : "Nepavyko įkelti kai kurių nuotraukų",
"Sidebar" : "Šoninė juosta",
"Processing … {n}/{m}" : "Apdorojama… {n}/{m}",
"Search people or groups" : "Ieškoti žmonių ar grupių",
"Copy the public link" : "Kopijuoti viešąją nuorodą",
@ -51,13 +52,12 @@
"Name of the album" : "Albumo pavadinimas",
"Location of the album" : "Albumo vieta",
"Go back to the previous view." : "Grįžti į ankstesnį rodinį.",
"Save." : "Įrašyti.",
"Create the album." : "Sukurti albumą.",
"Back to the new album form." : "Atgal į naujo albumo formą.",
"Back" : "Atgal",
"Save" : "Įrašyti",
"Create album" : "Sukurti albumą",
"Create a new album." : "Sukurti naują albumą.",
"Share Album" : "Bendrinti albumą",
"Save" : "Įrašyti",
"Year" : "Metai",
"Month" : "Mėnuo",
"Day" : "Diena",
@ -87,7 +87,6 @@
"Share folder" : "Bendrinti aplanką",
"Move left" : "Perkelti kairėn",
"Move right" : "Perkelti dešinėn",
"Cannot find this photo anymore!" : "Daugiau nebepavyksta rasti šios nuotraukos!",
"Failed to create {albumName}." : "Nepavyko sukurti {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Nepavyko pervadinti {currentAlbumName} į {newAlbumName}.",
"General Failure" : "Bendrinė nesėkmė",

6
l10n/mk.js vendored
View File

@ -18,6 +18,7 @@ OC.L10N.register(
"Favorite" : "Омилен",
"View in folder" : "Погледни во папката",
"Add to album" : "Додади во албум",
"Sidebar" : "Странична лента",
"Copy public link" : "Копирај јавен линк",
"Public link" : "Јавен линк",
"New album" : "Нов албум",
@ -25,13 +26,12 @@ OC.L10N.register(
"Name of the album" : "Име на албумот",
"Location of the album" : "Локација на албумот",
"Go to the add collaborators view." : "Оди за да додадеш соработници",
"Save." : "Зачувај.",
"Create the album." : "Креирај го албумот.",
"Back to the new album form." : "Врати се на формата за нов албум.",
"Back" : "Назад",
"Add collaborators" : "Додади соработници",
"Create a new album." : "Креирај нов албум.",
"Save" : "Зачувај",
"Create album" : "Креирај албум",
"Create a new album." : "Креирај нов албум.",
"Year" : "Година",
"Month" : "Месец",
"Day" : "Ден",

6
l10n/mk.json vendored
View File

@ -16,6 +16,7 @@
"Favorite" : "Омилен",
"View in folder" : "Погледни во папката",
"Add to album" : "Додади во албум",
"Sidebar" : "Странична лента",
"Copy public link" : "Копирај јавен линк",
"Public link" : "Јавен линк",
"New album" : "Нов албум",
@ -23,13 +24,12 @@
"Name of the album" : "Име на албумот",
"Location of the album" : "Локација на албумот",
"Go to the add collaborators view." : "Оди за да додадеш соработници",
"Save." : "Зачувај.",
"Create the album." : "Креирај го албумот.",
"Back to the new album form." : "Врати се на формата за нов албум.",
"Back" : "Назад",
"Add collaborators" : "Додади соработници",
"Create a new album." : "Креирај нов албум.",
"Save" : "Зачувај",
"Create album" : "Креирај албум",
"Create a new album." : "Креирај нов албум.",
"Year" : "Година",
"Month" : "Месец",
"Day" : "Ден",

7
l10n/pl.js vendored
View File

@ -29,6 +29,7 @@ OC.L10N.register(
"Timeline Path" : "Ścieżka osi czasu",
"Show hidden folders" : "Pokaż ukryte katalogi",
"Failed to load some photos" : "Nie udało się załadować niektórych zdjęć",
"Sidebar" : "Pasek boczny",
"Search for collaborators" : "Szukaj współpracowników",
"Search people or groups" : "Wyszukaj osoby lub grupy",
"Add {collaboratorLabel} to the collaborators list" : "Dodaj {collaboratorLabel} do listy współpracowników",
@ -51,15 +52,14 @@ OC.L10N.register(
"Location of the album" : "Lokalizacja albumu",
"Go back to the previous view." : "Wróć do poprzedniego widoku.",
"Go to the add collaborators view." : "Przejdź do widoku dodawania współpracowników.",
"Save." : "Zapisz.",
"Create the album." : "Utwórz album.",
"Back to the new album form." : "Powrót do nowej formy albumu.",
"Back" : "Poprzednia",
"Add collaborators" : "Dodaj współpracowników",
"Save" : "Zapisz",
"Create album" : "Utwórz album",
"Add selection to album {albumName}" : "Dodaj wybór do albumu {albumName}",
"Create a new album." : "Utwórz nowy album.",
"Save collaborators for this album." : "Zapisywanie współpracowników dla tego albumu.",
"Save" : "Zapisz",
"Year" : "Rok",
"Month" : "Miesiąc",
"Day" : "Dzień",
@ -80,7 +80,6 @@ OC.L10N.register(
"Delete album" : "Usuń album",
"Merge with different person" : "Połącz z inną osobą",
"Share folder" : "Udostępnij katalog",
"Cannot find this photo anymore!" : "Nie można już znaleźć tego zdjęcia!",
"Failed to create {albumName}." : "Nie udało się utworzyć {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Nie udało się zmienić nazwy {currentAlbumName} na {newAlbumName}.",
"General Failure" : "Ogólna awaria",

7
l10n/pl.json vendored
View File

@ -27,6 +27,7 @@
"Timeline Path" : "Ścieżka osi czasu",
"Show hidden folders" : "Pokaż ukryte katalogi",
"Failed to load some photos" : "Nie udało się załadować niektórych zdjęć",
"Sidebar" : "Pasek boczny",
"Search for collaborators" : "Szukaj współpracowników",
"Search people or groups" : "Wyszukaj osoby lub grupy",
"Add {collaboratorLabel} to the collaborators list" : "Dodaj {collaboratorLabel} do listy współpracowników",
@ -49,15 +50,14 @@
"Location of the album" : "Lokalizacja albumu",
"Go back to the previous view." : "Wróć do poprzedniego widoku.",
"Go to the add collaborators view." : "Przejdź do widoku dodawania współpracowników.",
"Save." : "Zapisz.",
"Create the album." : "Utwórz album.",
"Back to the new album form." : "Powrót do nowej formy albumu.",
"Back" : "Poprzednia",
"Add collaborators" : "Dodaj współpracowników",
"Save" : "Zapisz",
"Create album" : "Utwórz album",
"Add selection to album {albumName}" : "Dodaj wybór do albumu {albumName}",
"Create a new album." : "Utwórz nowy album.",
"Save collaborators for this album." : "Zapisywanie współpracowników dla tego albumu.",
"Save" : "Zapisz",
"Year" : "Rok",
"Month" : "Miesiąc",
"Day" : "Dzień",
@ -78,7 +78,6 @@
"Delete album" : "Usuń album",
"Merge with different person" : "Połącz z inną osobą",
"Share folder" : "Udostępnij katalog",
"Cannot find this photo anymore!" : "Nie można już znaleźć tego zdjęcia!",
"Failed to create {albumName}." : "Nie udało się utworzyć {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Nie udało się zmienić nazwy {currentAlbumName} na {newAlbumName}.",
"General Failure" : "Ogólna awaria",

7
l10n/pt_BR.js vendored
View File

@ -46,6 +46,7 @@ OC.L10N.register(
"Choose the root for the folders view" : "Escolha a raiz para a visualização de pastas",
"Your Timeline" : "Sua Linha-do-Tempo",
"Failed to load some photos" : "Falha ao carregar algumas fotos",
"Sidebar" : "Barra Lateral",
"Processing … {n}/{m}" : "Processando … {n}/{m}",
"Search for collaborators" : "Pesquisar colaboradores",
"Search people or groups" : "Pesquisar pessoas ou grupos",
@ -70,15 +71,14 @@ OC.L10N.register(
"Location of the album" : "Localização do álbum",
"Go back to the previous view." : "Ir para a visualização anterior.",
"Go to the add collaborators view." : "Ir para visualização de adicionar colaboradores.",
"Save." : "Salvar.",
"Create the album." : "Criar o álbum.",
"Back to the new album form." : "Voltar ao formulário de novo álbum.",
"Back" : "Voltar",
"Add collaborators" : "Adicionar colaboradores",
"Save" : "Salvar",
"Create album" : "Criar álbum",
"Add selection to album {albumName}" : "Adicionar seleção ao álbum {albumName}",
"Create a new album." : "Criar um novo álbum.",
"Save collaborators for this album." : "Salve os colaboradores deste álbum.",
"Save" : "Salvar",
"Year" : "Ano",
"Month" : "Mês",
"Day" : "Dia",
@ -111,7 +111,6 @@ OC.L10N.register(
"Share folder" : "Compartilhar pasta",
"Move left" : "Mover para a esquerda",
"Move right" : "Mover para a direita",
"Cannot find this photo anymore!" : "Não é mais possível encontrar esta foto!",
"Failed to create {albumName}." : "Falha ao criar {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Falha ao renomear {currentAlbumName} para {newAlbumName}.",
"General Failure" : "Falha Geral",

7
l10n/pt_BR.json vendored
View File

@ -44,6 +44,7 @@
"Choose the root for the folders view" : "Escolha a raiz para a visualização de pastas",
"Your Timeline" : "Sua Linha-do-Tempo",
"Failed to load some photos" : "Falha ao carregar algumas fotos",
"Sidebar" : "Barra Lateral",
"Processing … {n}/{m}" : "Processando … {n}/{m}",
"Search for collaborators" : "Pesquisar colaboradores",
"Search people or groups" : "Pesquisar pessoas ou grupos",
@ -68,15 +69,14 @@
"Location of the album" : "Localização do álbum",
"Go back to the previous view." : "Ir para a visualização anterior.",
"Go to the add collaborators view." : "Ir para visualização de adicionar colaboradores.",
"Save." : "Salvar.",
"Create the album." : "Criar o álbum.",
"Back to the new album form." : "Voltar ao formulário de novo álbum.",
"Back" : "Voltar",
"Add collaborators" : "Adicionar colaboradores",
"Save" : "Salvar",
"Create album" : "Criar álbum",
"Add selection to album {albumName}" : "Adicionar seleção ao álbum {albumName}",
"Create a new album." : "Criar um novo álbum.",
"Save collaborators for this album." : "Salve os colaboradores deste álbum.",
"Save" : "Salvar",
"Year" : "Ano",
"Month" : "Mês",
"Day" : "Dia",
@ -109,7 +109,6 @@
"Share folder" : "Compartilhar pasta",
"Move left" : "Mover para a esquerda",
"Move right" : "Mover para a direita",
"Cannot find this photo anymore!" : "Não é mais possível encontrar esta foto!",
"Failed to create {albumName}." : "Falha ao criar {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Falha ao renomear {currentAlbumName} para {newAlbumName}.",
"General Failure" : "Falha Geral",

1
l10n/pt_PT.js vendored
View File

@ -34,7 +34,6 @@ OC.L10N.register(
"Loading …" : "A carregar...",
"Refresh" : "Atualizar",
"Share folder" : "Partilhar pasta",
"Cannot find this photo anymore!" : "Já não é possível encontrar esta fotografia!",
"Failed to delete files." : "Não foi possível eliminar os ficheiros.",
"Failed to delete {fileName}." : "Não foi possível eliminar {fileName}.",
"Failed to favorite files." : "Não foi possível colocar os ficheiros nos favoritos.",

1
l10n/pt_PT.json vendored
View File

@ -32,7 +32,6 @@
"Loading …" : "A carregar...",
"Refresh" : "Atualizar",
"Share folder" : "Partilhar pasta",
"Cannot find this photo anymore!" : "Já não é possível encontrar esta fotografia!",
"Failed to delete files." : "Não foi possível eliminar os ficheiros.",
"Failed to delete {fileName}." : "Não foi possível eliminar {fileName}.",
"Failed to favorite files." : "Não foi possível colocar os ficheiros nos favoritos.",

2
l10n/ru.js vendored
View File

@ -25,6 +25,7 @@ OC.L10N.register(
"Timeline Path" : "Расположение",
"Show hidden folders" : "Показывать скрытые файлы",
"Failed to load some photos" : "Не удалось загрузить некоторые фотографии",
"Sidebar" : "Боковая панель",
"Copy public link" : "Скопировать общедоступную ссылку",
"Public link" : "Общедоступная ссылка",
"Back" : "Назад",
@ -40,7 +41,6 @@ OC.L10N.register(
"Loading …" : "Загрузка …",
"Refresh" : "Обновить",
"Share folder" : "Поделиться папкой",
"Cannot find this photo anymore!" : "Это фотография более недоступна.",
"Failed to delete files." : "Ошибка удаления файлов.",
"Failed to delete {fileName}." : "Ошибка удаления файла «{fileName}».",
"Failed to favorite files." : "Не удалось добавить файлы в избранное.",

2
l10n/ru.json vendored
View File

@ -23,6 +23,7 @@
"Timeline Path" : "Расположение",
"Show hidden folders" : "Показывать скрытые файлы",
"Failed to load some photos" : "Не удалось загрузить некоторые фотографии",
"Sidebar" : "Боковая панель",
"Copy public link" : "Скопировать общедоступную ссылку",
"Public link" : "Общедоступная ссылка",
"Back" : "Назад",
@ -38,7 +39,6 @@
"Loading …" : "Загрузка …",
"Refresh" : "Обновить",
"Share folder" : "Поделиться папкой",
"Cannot find this photo anymore!" : "Это фотография более недоступна.",
"Failed to delete files." : "Ошибка удаления файлов.",
"Failed to delete {fileName}." : "Ошибка удаления файла «{fileName}».",
"Failed to favorite files." : "Не удалось добавить файлы в избранное.",

7
l10n/sk.js vendored
View File

@ -31,6 +31,7 @@ OC.L10N.register(
"Show hidden folders" : "Zobraziť skryté priečinky",
"Your Timeline" : "Vaša časová os",
"Failed to load some photos" : "Načítanie akýchkoľvek fotiek zlyhalo",
"Sidebar" : "Bočný panel",
"Processing … {n}/{m}" : "Spracúvam ... {n}/{m}",
"Search for collaborators" : "Vyhľadať spolupracovníkov",
"Search people or groups" : "Vyhľadať užívateľov alebo skupiny",
@ -55,14 +56,13 @@ OC.L10N.register(
"Location of the album" : "Umiestnenie albumu",
"Go back to the previous view." : "Vrátiť sa na predchádzajúce zobrazenie.",
"Go to the add collaborators view." : "Ísť na zobrazenie pre pridanie spolupracujúcich.",
"Save." : "Uložiť.",
"Create the album." : "Vytvoriť album.",
"Back to the new album form." : "Späť na formulár pre pridanie nového albumu.",
"Back" : "Späť",
"Add collaborators" : "Pridať spolupracujúcich",
"Save" : "Uložiť",
"Create album" : "Vytvoriť album",
"Create a new album." : "Vytvoriť nový album.",
"Save collaborators for this album." : "Uložiť spolupracovníkov pre tento album.",
"Save" : "Uložiť",
"Year" : "Rok",
"Month" : "Mesiac",
"Day" : "Deň",
@ -90,7 +90,6 @@ OC.L10N.register(
"Delete album" : "Zmazať album",
"Merge with different person" : "Spojiť s inou osobou",
"Share folder" : "Zdieľať priečinok",
"Cannot find this photo anymore!" : "Túto fotografiu už nemožno nájsť!",
"Failed to create {albumName}." : "Zlyhalo vytváranie {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Chyba pri premenovávaní {currentAlbumName} na {newAlbumName}.",
"General Failure" : "Všeobecné zlyhanie",

7
l10n/sk.json vendored
View File

@ -29,6 +29,7 @@
"Show hidden folders" : "Zobraziť skryté priečinky",
"Your Timeline" : "Vaša časová os",
"Failed to load some photos" : "Načítanie akýchkoľvek fotiek zlyhalo",
"Sidebar" : "Bočný panel",
"Processing … {n}/{m}" : "Spracúvam ... {n}/{m}",
"Search for collaborators" : "Vyhľadať spolupracovníkov",
"Search people or groups" : "Vyhľadať užívateľov alebo skupiny",
@ -53,14 +54,13 @@
"Location of the album" : "Umiestnenie albumu",
"Go back to the previous view." : "Vrátiť sa na predchádzajúce zobrazenie.",
"Go to the add collaborators view." : "Ísť na zobrazenie pre pridanie spolupracujúcich.",
"Save." : "Uložiť.",
"Create the album." : "Vytvoriť album.",
"Back to the new album form." : "Späť na formulár pre pridanie nového albumu.",
"Back" : "Späť",
"Add collaborators" : "Pridať spolupracujúcich",
"Save" : "Uložiť",
"Create album" : "Vytvoriť album",
"Create a new album." : "Vytvoriť nový album.",
"Save collaborators for this album." : "Uložiť spolupracovníkov pre tento album.",
"Save" : "Uložiť",
"Year" : "Rok",
"Month" : "Mesiac",
"Day" : "Deň",
@ -88,7 +88,6 @@
"Delete album" : "Zmazať album",
"Merge with different person" : "Spojiť s inou osobou",
"Share folder" : "Zdieľať priečinok",
"Cannot find this photo anymore!" : "Túto fotografiu už nemožno nájsť!",
"Failed to create {albumName}." : "Zlyhalo vytváranie {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Chyba pri premenovávaní {currentAlbumName} na {newAlbumName}.",
"General Failure" : "Všeobecné zlyhanie",

1
l10n/sl.js vendored
View File

@ -18,6 +18,7 @@ OC.L10N.register(
"Favorite" : "Priljubljeno",
"Unarchive" : "Odarhiviraj",
"View in folder" : "Pokaži v mapi",
"Sidebar" : "Bočno okno",
"Copy public link" : "Kopiraj javno povezavo",
"Public link" : "Javna povezava",
"Name of the album" : "Ime albuma",

1
l10n/sl.json vendored
View File

@ -16,6 +16,7 @@
"Favorite" : "Priljubljeno",
"Unarchive" : "Odarhiviraj",
"View in folder" : "Pokaži v mapi",
"Sidebar" : "Bočno okno",
"Copy public link" : "Kopiraj javno povezavo",
"Public link" : "Javna povezava",
"Name of the album" : "Ime albuma",

1
l10n/sr.js vendored
View File

@ -16,6 +16,7 @@ OC.L10N.register(
"Favorite" : "Омиљени",
"Unarchive" : "Врати из архиве",
"View in folder" : "Види у фасцикли",
"Sidebar" : "Бочна трака",
"Public link" : "Јавна веза",
"Back" : "Назад",
"Save" : "Сачувај",

1
l10n/sr.json vendored
View File

@ -14,6 +14,7 @@
"Favorite" : "Омиљени",
"Unarchive" : "Врати из архиве",
"View in folder" : "Види у фасцикли",
"Sidebar" : "Бочна трака",
"Public link" : "Јавна веза",
"Back" : "Назад",
"Save" : "Сачувај",

6
l10n/sv.js vendored
View File

@ -34,11 +34,10 @@ OC.L10N.register(
"Public link" : "Publik länk",
"New album" : "Nytt album",
"Create new album" : "Skapa nytt album",
"Save." : "Spara.",
"Create the album." : "Skapa albumet.",
"Back" : "Tillbaka",
"Create a new album." : "Skapa ett nytt album.",
"Save" : "Spara",
"Create album" : "Skapa album",
"Create a new album." : "Skapa ett nytt album.",
"Year" : "År",
"Month" : "Månad",
"Day" : "Dag",
@ -51,7 +50,6 @@ OC.L10N.register(
"Loading …" : "Läser in …",
"Refresh" : "Uppdatera",
"Share folder" : "Dela mapp",
"Cannot find this photo anymore!" : "Kan inte längre hitta detta foto!",
"Failed to delete files." : "Misslyckades att radera filer.",
"Failed to delete {fileName}." : "Misslyckades att radera {fileName}.",
"Failed to favorite files." : "Misslyckades att favorisera filer.",

6
l10n/sv.json vendored
View File

@ -32,11 +32,10 @@
"Public link" : "Publik länk",
"New album" : "Nytt album",
"Create new album" : "Skapa nytt album",
"Save." : "Spara.",
"Create the album." : "Skapa albumet.",
"Back" : "Tillbaka",
"Create a new album." : "Skapa ett nytt album.",
"Save" : "Spara",
"Create album" : "Skapa album",
"Create a new album." : "Skapa ett nytt album.",
"Year" : "År",
"Month" : "Månad",
"Day" : "Dag",
@ -49,7 +48,6 @@
"Loading …" : "Läser in …",
"Refresh" : "Uppdatera",
"Share folder" : "Dela mapp",
"Cannot find this photo anymore!" : "Kan inte längre hitta detta foto!",
"Failed to delete files." : "Misslyckades att radera filer.",
"Failed to delete {fileName}." : "Misslyckades att radera {fileName}.",
"Failed to favorite files." : "Misslyckades att favorisera filer.",

8
l10n/tr.js vendored
View File

@ -48,6 +48,7 @@ OC.L10N.register(
"Choose the root for the folders view" : "Klasörler görünümünün kök klasörünü seçin",
"Your Timeline" : "Zaman tüneliniz",
"Failed to load some photos" : "Bazı fotoğraflar yüklenemedi",
"Sidebar" : "Yan çubuk",
"Processing … {n}/{m}" : "İşleniyor… {n}/{m}",
"{n} photos added to album" : "{n} fotoğraf albüme eklendi",
"Search for collaborators" : "Katılımcı arama",
@ -75,19 +76,17 @@ OC.L10N.register(
"Location of the album" : "Albümün konumu",
"Go back to the previous view." : "Önceki görünüme geri dön.",
"Go to the add collaborators view." : "Katılımcı ekleme görünümüne gider.",
"Save." : "Kaydeder.",
"Create the album." : "Albüm ekler.",
"Back to the new album form." : "Albüm ekleme formuna geri döner.",
"Back" : "Geri",
"Add collaborators" : "Katılımcı ekle",
"Save\") : t(\"photos\", \"Create album" : "Kaydet",
"Save" : "Kaydet",
"Create album" : "Albüm ekle",
"Add selection to album {albumName}" : "Seçilmişleri {albumName} albümüne ekle",
"Create a new album." : "Yeni bir albüm ekler.",
"_Share with %n user_::_Share with %n users_" : ["%n kullanıcı ile paylaş","%n kullanıcı ile paylaş"],
"_%n item_::_%n items_" : ["%n öge","%n öge"],
"Save collaborators for this album." : "Bu albümün katılımcılarını kaydet.",
"Share Album" : "Albümü paylaş",
"Save" : "Kaydet",
"Year" : "Yıl",
"Month" : "Ay",
"Day" : "Gün",
@ -127,7 +126,6 @@ OC.L10N.register(
"Move left" : "Sola taşı",
"Move right" : "Sağa taşı",
"Shared Folder" : "Paylaşılmış klasör",
"Cannot find this photo anymore!" : "Bu fotoğraf artık bulunmuyor!",
"Failed to create {albumName}." : "{albumName} albümü oluşturulamadı.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "{currentAlbumName} albümünün adı {newAlbumName} olarak değiştirilemedi.",
"General Failure" : "Genel sorun",

8
l10n/tr.json vendored
View File

@ -46,6 +46,7 @@
"Choose the root for the folders view" : "Klasörler görünümünün kök klasörünü seçin",
"Your Timeline" : "Zaman tüneliniz",
"Failed to load some photos" : "Bazı fotoğraflar yüklenemedi",
"Sidebar" : "Yan çubuk",
"Processing … {n}/{m}" : "İşleniyor… {n}/{m}",
"{n} photos added to album" : "{n} fotoğraf albüme eklendi",
"Search for collaborators" : "Katılımcı arama",
@ -73,19 +74,17 @@
"Location of the album" : "Albümün konumu",
"Go back to the previous view." : "Önceki görünüme geri dön.",
"Go to the add collaborators view." : "Katılımcı ekleme görünümüne gider.",
"Save." : "Kaydeder.",
"Create the album." : "Albüm ekler.",
"Back to the new album form." : "Albüm ekleme formuna geri döner.",
"Back" : "Geri",
"Add collaborators" : "Katılımcı ekle",
"Save\") : t(\"photos\", \"Create album" : "Kaydet",
"Save" : "Kaydet",
"Create album" : "Albüm ekle",
"Add selection to album {albumName}" : "Seçilmişleri {albumName} albümüne ekle",
"Create a new album." : "Yeni bir albüm ekler.",
"_Share with %n user_::_Share with %n users_" : ["%n kullanıcı ile paylaş","%n kullanıcı ile paylaş"],
"_%n item_::_%n items_" : ["%n öge","%n öge"],
"Save collaborators for this album." : "Bu albümün katılımcılarını kaydet.",
"Share Album" : "Albümü paylaş",
"Save" : "Kaydet",
"Year" : "Yıl",
"Month" : "Ay",
"Day" : "Gün",
@ -125,7 +124,6 @@
"Move left" : "Sola taşı",
"Move right" : "Sağa taşı",
"Shared Folder" : "Paylaşılmış klasör",
"Cannot find this photo anymore!" : "Bu fotoğraf artık bulunmuyor!",
"Failed to create {albumName}." : "{albumName} albümü oluşturulamadı.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "{currentAlbumName} albümünün adı {newAlbumName} olarak değiştirilemedi.",
"General Failure" : "Genel sorun",

7
l10n/uk.js vendored
View File

@ -29,6 +29,7 @@ OC.L10N.register(
"Timeline Path" : "Шлях шкали часу",
"Show hidden folders" : "Показати приховані каталоги",
"Failed to load some photos" : "Не вдалося завантажити деякі фотографії",
"Sidebar" : "Бокове меню",
"Search for collaborators" : "Пошук співавторів",
"Search people or groups" : "Пошук людей або груп",
"Add {collaboratorLabel} to the collaborators list" : "Додайте {collaboratorLabel} до списку співавторів",
@ -51,14 +52,13 @@ OC.L10N.register(
"Location of the album" : "Розташування альбому",
"Go back to the previous view." : "Повернутися до попереднього перегляду.",
"Go to the add collaborators view." : "Перейдіть до перегляду додавання співавторів.",
"Save." : "Зберегти.",
"Create the album." : "Створіть альбом.",
"Back to the new album form." : "Повернутися до форми нового альбому.",
"Back" : "Назад",
"Add collaborators" : "Додайте співавторів",
"Save" : "Зберегти",
"Create album" : "Створити альбом",
"Create a new album." : "Створіть новий альбом.",
"Save collaborators for this album." : "Зберегти співавторів для цього альбому.",
"Save" : "Зберегти",
"Year" : "Рік",
"Month" : "Місяць",
"Day" : "День",
@ -73,7 +73,6 @@ OC.L10N.register(
"Delete album" : "Видалити альбом",
"Merge with different person" : "Злитися з іншою людиною",
"Share folder" : "Спільний доступ для каталогу",
"Cannot find this photo anymore!" : "Більше не можу знайти це фото!",
"Failed to create {albumName}." : "Не вдалося створити {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Не вдалося перейменувати {currentAlbumName} на {newAlbumName}.",
"Failed to delete files." : "Не вдалося видалити файли.",

7
l10n/uk.json vendored
View File

@ -27,6 +27,7 @@
"Timeline Path" : "Шлях шкали часу",
"Show hidden folders" : "Показати приховані каталоги",
"Failed to load some photos" : "Не вдалося завантажити деякі фотографії",
"Sidebar" : "Бокове меню",
"Search for collaborators" : "Пошук співавторів",
"Search people or groups" : "Пошук людей або груп",
"Add {collaboratorLabel} to the collaborators list" : "Додайте {collaboratorLabel} до списку співавторів",
@ -49,14 +50,13 @@
"Location of the album" : "Розташування альбому",
"Go back to the previous view." : "Повернутися до попереднього перегляду.",
"Go to the add collaborators view." : "Перейдіть до перегляду додавання співавторів.",
"Save." : "Зберегти.",
"Create the album." : "Створіть альбом.",
"Back to the new album form." : "Повернутися до форми нового альбому.",
"Back" : "Назад",
"Add collaborators" : "Додайте співавторів",
"Save" : "Зберегти",
"Create album" : "Створити альбом",
"Create a new album." : "Створіть новий альбом.",
"Save collaborators for this album." : "Зберегти співавторів для цього альбому.",
"Save" : "Зберегти",
"Year" : "Рік",
"Month" : "Місяць",
"Day" : "День",
@ -71,7 +71,6 @@
"Delete album" : "Видалити альбом",
"Merge with different person" : "Злитися з іншою людиною",
"Share folder" : "Спільний доступ для каталогу",
"Cannot find this photo anymore!" : "Більше не можу знайти це фото!",
"Failed to create {albumName}." : "Не вдалося створити {albumName}.",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "Не вдалося перейменувати {currentAlbumName} на {newAlbumName}.",
"Failed to delete files." : "Не вдалося видалити файли.",

6
l10n/zh_CN.js vendored
View File

@ -19,6 +19,7 @@ OC.L10N.register(
"Unarchive" : "取消归档",
"View in folder" : "在文件夹中查看",
"Add to album" : "添加至相册",
"Sidebar" : "侧边栏",
"Search for collaborators" : "搜索协作者",
"Search people or groups" : "搜索用户或群组",
"Add {collaboratorLabel} to the collaborators list" : "将 {collaboratorLabel} 加入协作者列表",
@ -41,15 +42,14 @@ OC.L10N.register(
"Location of the album" : "相册位置",
"Go back to the previous view." : "返回上一个视图。",
"Go to the add collaborators view." : "到添加协作者视图。",
"Save." : "保存。",
"Create the album." : "创建相册。",
"Back to the new album form." : "回到创建新相册表单。",
"Back" : "返回",
"Add collaborators" : "添加协作者",
"Save" : "保存",
"Create album" : "创建相册",
"Add selection to album {albumName}" : "将所选项加入相册 {ablumName}",
"Create a new album." : "创建新相册。",
"Save collaborators for this album." : "保存此相册的协作者。",
"Save" : "保存",
"Year" : "年",
"Month" : "月",
"Day" : "日",

6
l10n/zh_CN.json vendored
View File

@ -17,6 +17,7 @@
"Unarchive" : "取消归档",
"View in folder" : "在文件夹中查看",
"Add to album" : "添加至相册",
"Sidebar" : "侧边栏",
"Search for collaborators" : "搜索协作者",
"Search people or groups" : "搜索用户或群组",
"Add {collaboratorLabel} to the collaborators list" : "将 {collaboratorLabel} 加入协作者列表",
@ -39,15 +40,14 @@
"Location of the album" : "相册位置",
"Go back to the previous view." : "返回上一个视图。",
"Go to the add collaborators view." : "到添加协作者视图。",
"Save." : "保存。",
"Create the album." : "创建相册。",
"Back to the new album form." : "回到创建新相册表单。",
"Back" : "返回",
"Add collaborators" : "添加协作者",
"Save" : "保存",
"Create album" : "创建相册",
"Add selection to album {albumName}" : "将所选项加入相册 {ablumName}",
"Create a new album." : "创建新相册。",
"Save collaborators for this album." : "保存此相册的协作者。",
"Save" : "保存",
"Year" : "年",
"Month" : "月",
"Day" : "日",

7
l10n/zh_HK.js vendored
View File

@ -48,6 +48,7 @@ OC.L10N.register(
"Choose the root for the folders view" : "選擇資料夾檢視的根",
"Your Timeline" : "您的時間線",
"Failed to load some photos" : "未能加載一些照片",
"Sidebar" : "側邊欄",
"Processing … {n}/{m}" : "處理中 ... {n}/{m}",
"{n} photos added to album" : "已新增 {n} 張照片至相簿",
"Search for collaborators" : "尋找協作者",
@ -75,18 +76,17 @@ OC.L10N.register(
"Location of the album" : "相簿位置",
"Go back to the previous view." : "回到前一個檢視。",
"Go to the add collaborators view." : "到添加協作者檢視。",
"Save." : "保存。",
"Create the album." : "創建相簿。",
"Back to the new album form." : "回到新相簿表格。",
"Back" : "返回",
"Add collaborators" : "添加協作者",
"Save" : "保存",
"Create album" : "創建相簿",
"Add selection to album {albumName}" : "將選擇添加至相簿 {albumName}",
"Create a new album." : "創建新相簿。",
"_Share with %n user_::_Share with %n users_" : ["與 %n 個用戶分享"],
"_%n item_::_%n items_" : ["%n 個項目"],
"Save collaborators for this album." : "保存此相簿的協作者。",
"Share Album" : "分享相簿",
"Save" : "保存",
"Year" : "年",
"Month" : "月",
"Day" : "日",
@ -126,7 +126,6 @@ OC.L10N.register(
"Move left" : "向左移動",
"Move right" : "向右移動",
"Shared Folder" : "分享資料夾",
"Cannot find this photo anymore!" : "再也找不到這張照片了!",
"Failed to create {albumName}." : "創建 {albumName} 失敗。",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "重新命名 {currentAlbumName} 為 {newAlbumName} 失敗。",
"General Failure" : "一般故障",

7
l10n/zh_HK.json vendored
View File

@ -46,6 +46,7 @@
"Choose the root for the folders view" : "選擇資料夾檢視的根",
"Your Timeline" : "您的時間線",
"Failed to load some photos" : "未能加載一些照片",
"Sidebar" : "側邊欄",
"Processing … {n}/{m}" : "處理中 ... {n}/{m}",
"{n} photos added to album" : "已新增 {n} 張照片至相簿",
"Search for collaborators" : "尋找協作者",
@ -73,18 +74,17 @@
"Location of the album" : "相簿位置",
"Go back to the previous view." : "回到前一個檢視。",
"Go to the add collaborators view." : "到添加協作者檢視。",
"Save." : "保存。",
"Create the album." : "創建相簿。",
"Back to the new album form." : "回到新相簿表格。",
"Back" : "返回",
"Add collaborators" : "添加協作者",
"Save" : "保存",
"Create album" : "創建相簿",
"Add selection to album {albumName}" : "將選擇添加至相簿 {albumName}",
"Create a new album." : "創建新相簿。",
"_Share with %n user_::_Share with %n users_" : ["與 %n 個用戶分享"],
"_%n item_::_%n items_" : ["%n 個項目"],
"Save collaborators for this album." : "保存此相簿的協作者。",
"Share Album" : "分享相簿",
"Save" : "保存",
"Year" : "年",
"Month" : "月",
"Day" : "日",
@ -124,7 +124,6 @@
"Move left" : "向左移動",
"Move right" : "向右移動",
"Shared Folder" : "分享資料夾",
"Cannot find this photo anymore!" : "再也找不到這張照片了!",
"Failed to create {albumName}." : "創建 {albumName} 失敗。",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "重新命名 {currentAlbumName} 為 {newAlbumName} 失敗。",
"General Failure" : "一般故障",

8
l10n/zh_TW.js vendored
View File

@ -48,6 +48,7 @@ OC.L10N.register(
"Choose the root for the folders view" : "選擇資料夾檢視的根",
"Your Timeline" : "您的時間軸",
"Failed to load some photos" : "載入部份照片時失敗",
"Sidebar" : "側邊欄",
"Processing … {n}/{m}" : "正在處理…… {n}/{m}",
"{n} photos added to album" : "已新增 {n} 張照片至相簿",
"Search for collaborators" : "搜尋協作者",
@ -75,19 +76,17 @@ OC.L10N.register(
"Location of the album" : "相簿位置",
"Go back to the previous view." : "回到上一個檢視。",
"Go to the add collaborators view." : "到新增協作者檢視",
"Save." : "儲存。",
"Create the album." : "建立相簿。",
"Back to the new album form." : "回到新相簿表單。",
"Back" : "返回",
"Add collaborators" : "新增協作者",
"Save\") : t(\"photos\", \"Create album" : "儲存\") : t(\"照片\", \"建立相簿",
"Save" : "儲存",
"Create album" : "建立相簿",
"Add selection to album {albumName}" : "新增選取範圍至相簿 {albumName}",
"Create a new album." : "建立新相簿。",
"_Share with %n user_::_Share with %n users_" : ["與 %n 個使用者分享"],
"_%n item_::_%n items_" : ["%n 個項目"],
"Save collaborators for this album." : "儲存此相簿的協作者。",
"Share Album" : "分享相簿",
"Save" : "儲存",
"Year" : "年",
"Month" : "月",
"Day" : "日",
@ -127,7 +126,6 @@ OC.L10N.register(
"Move left" : "向左移動",
"Move right" : "向右移動",
"Shared Folder" : "已分享的資料夾",
"Cannot find this photo anymore!" : "再也找不到這張照片了!",
"Failed to create {albumName}." : "建立 {albumName} 失敗。",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "重新命名 {currentAlbumName} 為 {newAlbumName} 失敗。",
"General Failure" : "一般失敗",

8
l10n/zh_TW.json vendored
View File

@ -46,6 +46,7 @@
"Choose the root for the folders view" : "選擇資料夾檢視的根",
"Your Timeline" : "您的時間軸",
"Failed to load some photos" : "載入部份照片時失敗",
"Sidebar" : "側邊欄",
"Processing … {n}/{m}" : "正在處理…… {n}/{m}",
"{n} photos added to album" : "已新增 {n} 張照片至相簿",
"Search for collaborators" : "搜尋協作者",
@ -73,19 +74,17 @@
"Location of the album" : "相簿位置",
"Go back to the previous view." : "回到上一個檢視。",
"Go to the add collaborators view." : "到新增協作者檢視",
"Save." : "儲存。",
"Create the album." : "建立相簿。",
"Back to the new album form." : "回到新相簿表單。",
"Back" : "返回",
"Add collaborators" : "新增協作者",
"Save\") : t(\"photos\", \"Create album" : "儲存\") : t(\"照片\", \"建立相簿",
"Save" : "儲存",
"Create album" : "建立相簿",
"Add selection to album {albumName}" : "新增選取範圍至相簿 {albumName}",
"Create a new album." : "建立新相簿。",
"_Share with %n user_::_Share with %n users_" : ["與 %n 個使用者分享"],
"_%n item_::_%n items_" : ["%n 個項目"],
"Save collaborators for this album." : "儲存此相簿的協作者。",
"Share Album" : "分享相簿",
"Save" : "儲存",
"Year" : "年",
"Month" : "月",
"Day" : "日",
@ -125,7 +124,6 @@
"Move left" : "向左移動",
"Move right" : "向右移動",
"Shared Folder" : "已分享的資料夾",
"Cannot find this photo anymore!" : "再也找不到這張照片了!",
"Failed to create {albumName}." : "建立 {albumName} 失敗。",
"Failed to rename {currentAlbumName} to {newAlbumName}." : "重新命名 {currentAlbumName} 為 {newAlbumName} 失敗。",
"General Failure" : "一般失敗",

View File

@ -25,11 +25,12 @@ namespace OCA\Memories\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
use OCP\Files\FileInfo;
use OCP\Files\Folder;
class DaysController extends ApiBase
{
use FoldersTrait;
/**
* @NoAdminRequired
*
@ -167,41 +168,6 @@ class DaysController extends ApiBase
return $this->day($id);
}
/**
* Get subfolders entry for days response.
*/
public function getSubfoldersEntry(Folder &$folder)
{
// Ugly: get the view of the folder with reflection
// This is unfortunately the only way to get the contents of a folder
// matching a MIME type without using SEARCH, which is deep
$rp = new \ReflectionProperty('\OC\Files\Node\Node', 'view');
$rp->setAccessible(true);
$view = $rp->getValue($folder);
// Get the subfolders
$folders = $view->getDirectoryContent($folder->getPath(), FileInfo::MIMETYPE_FOLDER, $folder);
// Sort by name
usort($folders, function ($a, $b) {
return strnatcmp($a->getName(), $b->getName());
});
// Process to response type
return [
'dayid' => \OCA\Memories\Util::$TAG_DAYID_FOLDERS,
'count' => \count($folders),
'detail' => array_map(function ($node) {
return [
'fileid' => $node->getId(),
'name' => $node->getName(),
'isfolder' => 1,
'path' => $node->getPath(),
];
}, $folders, []),
];
}
/**
* Get transformations depending on the request.
*

View File

@ -0,0 +1,58 @@
<?php
namespace OCA\Memories\Controller;
use OCA\Memories\Db\TimelineQuery;
use OCP\Files\FileInfo;
use OCP\Files\Folder;
trait FoldersTrait
{
protected TimelineQuery $timelineQuery;
/**
* Get subfolders entry for days response.
*/
public function getSubfoldersEntry(Folder &$folder)
{
// Ugly: get the view of the folder with reflection
// This is unfortunately the only way to get the contents of a folder
// matching a MIME type without using SEARCH, which is deep
$rp = new \ReflectionProperty('\OC\Files\Node\Node', 'view');
$rp->setAccessible(true);
$view = $rp->getValue($folder);
// Get the subfolders
$folders = $view->getDirectoryContent($folder->getPath(), FileInfo::MIMETYPE_FOLDER, $folder);
// Sort by name
usort($folders, function ($a, $b) {
return strnatcmp($a->getName(), $b->getName());
});
// Process to response type
return [
'dayid' => \OCA\Memories\Util::$TAG_DAYID_FOLDERS,
'count' => \count($folders),
'detail' => array_map(function (&$node) use (&$folder) {
return [
'fileid' => $node->getId(),
'name' => $node->getName(),
'isfolder' => 1,
'path' => $node->getPath(),
'previews' => $this->getFolderPreviews($folder, $node),
];
}, $folders, []),
];
}
private function getFolderPreviews(Folder &$parent, FileInfo &$fileInfo)
{
$folder = $parent->getById($fileInfo->getId());
if (0 === \count($folder)) {
return [];
}
return $this->timelineQuery->getFolderPreviews($folder[0]);
}
}

View File

@ -7,7 +7,6 @@ use OCA\Memories\AppInfo\Application;
use OCP\App\IAppManager;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\Template\PublicTemplateResponse;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
use OCP\EventDispatcher\IEventDispatcher;
@ -102,30 +101,6 @@ class PageController extends Controller
return $response;
}
/**
* @PublicPage
*
* @NoCSRFRequired
*/
public function sharedfolder(string $token)
{
// Scripts
Util::addScript($this->appName, 'memories-main');
$this->eventDispatcher->dispatchTyped(new LoadSidebar());
// App version
$this->initialState->provideInitialState('version', $this->appManager->getAppInfo('memories')['version']);
$policy = new ContentSecurityPolicy();
$policy->addAllowedWorkerSrcDomain("'self'");
$policy->addAllowedScriptDomain("'self'");
$response = new PublicTemplateResponse($this->appName, 'main');
$response->setContentSecurityPolicy($policy);
return $response;
}
/**
* @NoAdminRequired
*

View File

@ -0,0 +1,163 @@
<?php
namespace OCA\Memories\Controller;
use OCA\Files\Event\LoadSidebar;
use OCP\App\IAppManager;
use OCP\AppFramework\AuthPublicShareController;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\NotFoundException;
use OCP\IConfig;
use OCP\IRequest;
use OCP\ISession;
use OCP\IURLGenerator;
use OCP\IUserManager;
use OCP\Share\IManager as IShareManager;
use OCP\Share\IShare;
use OCP\Util;
class PublicController extends AuthPublicShareController
{
protected $appName;
protected IEventDispatcher $eventDispatcher;
protected IInitialState $initialState;
protected IShareManager $shareManager;
protected IUserManager $userManager;
protected IAppManager $appManager;
protected IConfig $config;
protected IShare $share;
public function __construct(
string $AppName,
IRequest $request,
ISession $session,
IURLGenerator $urlGenerator,
IEventDispatcher $eventDispatcher,
IInitialState $initialState,
IShareManager $shareManager,
IUserManager $userManager,
IAppManager $appManager,
IConfig $config
) {
parent::__construct($AppName, $request, $session, $urlGenerator);
$this->eventDispatcher = $eventDispatcher;
$this->initialState = $initialState;
$this->shareManager = $shareManager;
$this->userManager = $userManager;
$this->appManager = $appManager;
$this->config = $config;
}
/**
* @PublicPage
*
* @NoCSRFRequired
*
* Show the authentication page
* The form has to submit to the authenticate method route
*/
public function showAuthenticate(): TemplateResponse
{
$templateParameters = ['share' => $this->share];
return new TemplateResponse('core', 'publicshareauth', $templateParameters, 'guest');
}
public function isValidToken(): bool
{
try {
$this->share = $this->shareManager->getShareByToken($this->getToken());
return true;
} catch (\Exception $e) {
return false;
}
}
/**
* @PublicPage
*
* @NoCSRFRequired
*/
public function showShare(): TemplateResponse
{
\OC_User::setIncognitoMode(true);
// Check whether share exists
try {
$share = $this->shareManager->getShareByToken($this->getToken());
} catch (\Exception $e) {
throw new NotFoundException();
}
if (!$this->validateShare($share)) {
throw new NotFoundException();
}
// Scripts
Util::addScript($this->appName, 'memories-main');
$this->eventDispatcher->dispatchTyped(new LoadSidebar());
// App version
$this->initialState->provideInitialState('version', $this->appManager->getAppInfo('memories')['version']);
$policy = new ContentSecurityPolicy();
$policy->addAllowedWorkerSrcDomain("'self'");
$policy->addAllowedScriptDomain("'self'");
$response = new TemplateResponse($this->appName, 'main');
$response->setContentSecurityPolicy($policy);
return $response;
}
protected function showAuthFailed(): TemplateResponse
{
$templateParameters = ['share' => $this->share, 'wrongpw' => true];
return new TemplateResponse('core', 'publicshareauth', $templateParameters, 'guest');
}
protected function verifyPassword(string $password): bool
{
return $this->shareManager->checkPassword($this->share, $password);
}
protected function getPasswordHash(): string
{
return $this->share->getPassword();
}
protected function isPasswordProtected(): bool
{
return null !== $this->share->getPassword();
}
/**
* Validate the permissions of the share.
*
* @param Share\IShare $share
*
* @return bool
*/
private function validateShare(IShare $share)
{
// If the owner is disabled no access to the linke is granted
$owner = $this->userManager->get($share->getShareOwner());
if (null === $owner || !$owner->isEnabled()) {
return false;
}
// If the initiator of the share is disabled no access is granted
$initiator = $this->userManager->get($share->getSharedBy());
if (null === $initiator || !$initiator->isEnabled()) {
return false;
}
return $share->getNode()->isReadable() && $share->getNode()->isShareable();
}
}

View File

@ -13,6 +13,7 @@ class TimelineQuery
use TimelineQueryDays;
use TimelineQueryFaces;
use TimelineQueryFilters;
use TimelineQueryFolders;
use TimelineQueryTags;
protected IDBConnection $connection;

View File

@ -0,0 +1,41 @@
<?php
declare(strict_types=1);
namespace OCA\Memories\Db;
use OCP\Files\Folder;
use OCP\IDBConnection;
trait TimelineQueryFolders
{
protected IDBConnection $connection;
public function getFolderPreviews(Folder &$folder)
{
$query = $this->connection->getQueryBuilder();
// SELECT all photos
$query->select('f.fileid', 'f.etag')->from('memories', 'm');
// WHERE these photos are in the user's requested folder recursively
$query = $this->joinFilecache($query, $folder, true, false);
// ORDER descending by fileid
$query->orderBy('f.fileid', 'DESC');
// MAX 4
$query->setMaxResults(4);
// FETCH tag previews
$cursor = $this->executeQueryWithCTEs($query);
$ans = $cursor->fetchAll();
// Post-process
foreach ($ans as &$row) {
$row['fileid'] = (int) $row['fileid'];
}
return $ans;
}
}

View File

@ -68,4 +68,24 @@ class Util
return version_compare($v, '3.0.0-alpha', '>=');
}
/**
* Check if link sharing is allowed.
*
* @param mixed $config
*/
public static function isLinkSharingEnabled(&$config): bool
{
// Check if the shareAPI is enabled
if ('yes' !== $config->getAppValue('core', 'shareapi_enabled', 'yes')) {
return false;
}
// Check whether public sharing is enabled
if ('yes' !== $config->getAppValue('core', 'shareapi_allow_links', 'yes')) {
return false;
}
return true;
}
}

973
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -34,6 +34,7 @@
"@nextcloud/sharing": "^0.1.0",
"@nextcloud/vue": "^6.0.0",
"camelcase": "^7.0.0",
"filerobot-image-editor": "^4.3.7",
"justified-layout": "^4.1.0",
"moment": "^2.29.4",
"path-posix": "^1.0.0",

View File

@ -0,0 +1,593 @@
<template>
<div ref="editor" class="viewer__image-editor" v-bind="themeDataAttr" />
</template>
<script lang="ts">
import { Component, Prop, Mixins } from "vue-property-decorator";
import GlobalMixin from "../mixins/GlobalMixin";
import { basename, dirname, extname, join } from "path";
import { emit } from "@nextcloud/event-bus";
import { showError, showSuccess } from "@nextcloud/dialogs";
import axios from "@nextcloud/axios";
import FilerobotImageEditor from "filerobot-image-editor";
import { FilerobotImageEditorConfig } from "react-filerobot-image-editor";
import translations from "./ImageEditorTranslations";
const { TABS, TOOLS } = FilerobotImageEditor as any;
@Component({
components: {},
})
export default class ImageEditor extends Mixins(GlobalMixin) {
@Prop() fileid: number;
@Prop() mime: string;
@Prop() src: string;
private imageEditor: FilerobotImageEditor = null;
get config(): FilerobotImageEditorConfig & { theme: any } {
return {
source: this.src,
defaultSavedImageName: this.defaultSavedImageName,
defaultSavedImageType: this.defaultSavedImageType,
// We use our own translations
useBackendTranslations: false,
// Watch resize
observePluginContainerSize: true,
// Default tab and tool
defaultTabId: TABS.ADJUST,
defaultToolId: TOOLS.CROP,
// Displayed tabs, disabling watermark
tabsIds: Object.values(TABS)
.filter((tab) => tab !== TABS.WATERMARK)
.sort((a: string, b: string) => a.localeCompare(b)) as any[],
// onBeforeSave: this.onBeforeSave,
onClose: this.onClose,
// onModify: this.onModify,
onSave: this.onSave,
Rotate: {
angle: 90,
componentType: "buttons",
},
// Translations
translations,
theme: {
palette: {
"bg-secondary": "var(--color-main-background)",
"bg-primary": "var(--color-background-dark)",
// Accent
"accent-primary": "var(--color-primary)",
// Use by the slider
"border-active-bottom": "var(--color-primary)",
"icons-primary": "var(--color-main-text)",
// Active state
"bg-primary-active": "var(--color-background-dark)",
"bg-primary-hover": "var(--color-background-hover)",
"accent-primary-active": "var(--color-main-text)",
// Used by the save button
"accent-primary-hover": "var(--color-primary)",
warning: "var(--color-error)",
},
typography: {
fontFamily: "var(--font-face)",
},
},
savingPixelRatio: 1,
previewPixelRatio: 1,
};
}
get defaultSavedImageName() {
return basename(this.src, extname(this.src));
}
get defaultSavedImageType(): "jpeg" | "png" | "webp" {
const mime = extname(this.src).slice(1);
if (["jpeg", "png", "webp"].includes(mime)) {
return mime as any;
}
return "jpeg";
}
get hasHighContrastEnabled() {
const themes = globalThis.OCA?.Theming?.enabledThemes || [];
return themes.find((theme) => theme.indexOf("highcontrast") !== -1);
}
get themeDataAttr() {
if (this.hasHighContrastEnabled) {
return {
"data-theme-dark-highcontrast": true,
};
}
return {
"data-theme-dark": true,
};
}
mounted() {
this.imageEditor = new FilerobotImageEditor(
<any>this.$refs.editor,
<any>this.config
);
this.imageEditor.render();
window.addEventListener("keydown", this.handleKeydown, true);
window.addEventListener("DOMNodeInserted", this.handleSfxModal);
}
beforeDestroy() {
if (this.imageEditor) {
this.imageEditor.terminate();
}
window.removeEventListener("keydown", this.handleKeydown, true);
}
onClose(closingReason, haveNotSavedChanges) {
if (haveNotSavedChanges) {
this.onExitWithoutSaving();
return;
}
window.removeEventListener("keydown", this.handleKeydown, true);
this.$emit("close");
}
/**
* User saved the image
*
* @see https://github.com/scaleflex/filerobot-image-editor#onsave
* @param {object} props destructuring object
* @param {string} props.fullName the file name
* @param {HTMLCanvasElement} props.imageCanvas the image canvas
* @param {string} props.mimeType the image mime type
* @param {number} props.quality the image saving quality
*/
async onSave({
fullName,
imageCanvas,
mimeType,
quality,
}: {
fullName?: string;
imageCanvas?: HTMLCanvasElement;
mimeType?: string;
quality?: number;
}): Promise<void> {
const { origin, pathname } = new URL(this.src);
const putUrl = origin + join(dirname(pathname), fullName);
// toBlob is not very smart...
mimeType = mimeType.replace("jpg", "jpeg");
// Sanity check, 0 < quality < 1
quality = Math.max(Math.min(quality, 1), 0) || 1;
try {
const blob = await new Promise((resolve: BlobCallback) =>
imageCanvas.toBlob(resolve, mimeType, quality)
);
const response = await axios.put(putUrl, new File([blob], fullName));
showSuccess(this.t("memories", "Image saved successfully"));
if (putUrl !== this.src) {
emit("files:file:created", {
fileid:
parseInt(response?.headers?.["oc-fileid"]?.split("oc")[0]) || null,
});
} else {
emit("files:file:updated", { fileid: this.fileid });
}
this.onClose(undefined, false);
} catch (error) {
showError(this.t("memories", "Error saving image"));
}
}
/**
* Show warning if unsaved changes
*/
onExitWithoutSaving() {
(<any>OC.dialogs).confirmDestructive(
translations.changesLoseConfirmation +
"\n\n" +
translations.changesLoseConfirmationHint,
this.t("memories", "Unsaved changes"),
{
type: (<any>OC.dialogs).YES_NO_BUTTONS,
confirm: this.t("memories", "Drop changes"),
confirmClasses: "error",
cancel: translations.cancel,
},
(decision) => {
if (!decision) {
return;
}
this.onClose("warning-ignored", false);
}
);
}
// Key Handlers, override default Viewer arrow and escape key
handleKeydown(event) {
event.stopImmediatePropagation();
// escape key
if (event.key === "Escape") {
// Since we cannot call the closeMethod and know if there
// are unsaved changes, let's fake a close button trigger.
event.preventDefault();
(
document.querySelector(".FIE_topbar-close-button") as HTMLElement
).click();
}
// ctrl + S = save
if (event.ctrlKey && event.key === "s") {
event.preventDefault();
(
document.querySelector(".FIE_topbar-save-button") as HTMLElement
).click();
}
// ctrl + Z = undo
if (event.ctrlKey && event.key === "z") {
event.preventDefault();
(
document.querySelector(".FIE_topbar-undo-button") as HTMLElement
).click();
}
}
/**
* Watch out for Modal inject in document root
* That way we can adjust the focusTrap
*
* @param {Event} event Dom insertion event
*/
handleSfxModal(event) {
if (
event.target?.classList &&
event.target.classList.contains("SfxModal-Wrapper")
) {
emit("viewer:trapElements:changed", event.target);
}
}
}
</script>
<style lang="scss" scoped>
// Take full screen size ()
.viewer__image-editor {
position: absolute;
z-index: 10100;
top: 0;
left: 0;
width: 100%;
height: 100vh;
}
</style>
<style lang="scss">
// Make sure the editor and its modals are above everything
.SfxModal-Wrapper {
z-index: 10101 !important;
}
.SfxPopper-wrapper {
z-index: 10102 !important;
}
// Default styling
.viewer__image-editor,
.SfxModal-Wrapper,
.SfxPopper-wrapper {
* {
// Fix font size for the entire image editor
font-size: var(--default-font-size) !important;
}
label,
button {
color: var(--color-main-text);
> span {
font-size: var(--default-font-size) !important;
}
}
// Fix button ratio and center content
button {
display: flex;
align-items: center;
justify-content: center;
min-width: 44px;
min-height: 44px;
padding: 6px 12px;
}
}
// Input styling
.SfxInput-root {
height: auto !important;
padding: 0 !important;
.SfxInput-Base {
margin: 0 !important;
}
}
// Select styling
.SfxSelect-root {
padding: 8px !important;
}
// Global buttons
.SfxButton-root {
min-height: 44px !important;
margin: 0 !important;
border: transparent !important;
&[color="error"] {
color: white !important;
background-color: var(--color-error) !important;
&:hover,
&:focus {
border-color: white !important;
background-color: var(--color-error-hover) !important;
}
}
&[color="primary"] {
color: var(--color-primary-text) !important;
background-color: var(--color-primary-element) !important;
&:hover,
&:focus {
background-color: var(--color-primary-element-hover) !important;
}
}
}
// Menu items
.SfxMenuItem-root {
height: 44px;
padding-left: 8px !important;
// Center the menu entry icon and fix width
> div {
margin-right: 0;
padding: 14px;
// Minus the parent padding-left
padding: calc(14px - 8px);
cursor: pointer;
}
// Disable jpeg saving (jpg is already here)
&[value="jpeg"] {
display: none;
}
}
// Modal
.SfxModal-Container {
min-height: 300px;
padding: 22px;
// Fill height
.SfxModal-root,
.SfxModalTitle-root {
flex: 1 1 100%;
justify-content: center;
color: var(--color-main-text);
}
.SfxModalTitle-Icon {
margin-bottom: 22px !important;
background: none !important;
// Fit EmptyContent styling
svg {
width: 64px;
height: 64px;
opacity: 0.4;
// Override all coloured icons
--color-primary: var(--color-main-text);
--color-error: var(--color-main-text);
}
}
// Hide close icon (use cancel button)
.SfxModalTitle-Close {
display: none !important;
}
// Modal actions buttons display
.SfxModalActions-root {
justify-content: space-evenly !important;
}
}
// Header buttons
.FIE_topbar-center-options > button,
.FIE_topbar-center-options > label {
margin-left: 6px !important;
}
// Tabs
.FIE_tabs {
padding: 6px !important;
overflow: hidden;
overflow-y: auto;
}
.FIE_tab {
width: 80px !important;
height: 80px !important;
padding: 8px;
border-radius: var(--border-radius-large) !important;
svg {
width: 16px;
height: 16px;
}
&-label {
margin-top: 8px !important;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
white-space: nowrap;
display: block !important;
}
&:hover,
&:focus {
background-color: var(--color-background-hover) !important;
}
&[aria-selected="true"] {
color: var(--color-main-text);
background-color: var(--color-background-dark);
box-shadow: 0 0 0 2px var(--color-primary-element);
}
}
// Tools bar
.FIE_tools-bar {
&-wrapper {
max-height: max-content !important;
}
// Matching buttons tools
& > div[class$="-tool-button"],
& > div[class$="-tool"] {
display: flex;
align-items: center;
justify-content: center;
min-width: 44px;
height: 44px;
padding: 6px 16px;
border-radius: var(--border-radius-pill);
}
}
// Crop preset select button
.FIE_crop-presets-opener-button {
// override default button width
min-width: 0 !important;
padding: 5px !important;
padding-left: 10px !important;
border: none !important;
background-color: transparent !important;
}
// Force icon-only style
.FIE_topbar-history-buttons button,
.FIE_topbar-close-button,
.FIE_resize-ratio-locker {
border: none !important;
background-color: transparent !important;
&:hover,
&:focus {
background-color: var(--color-background-hover) !important;
}
svg {
width: 16px;
height: 16px;
}
}
// Left top bar buttons
.FIE_topbar-history-buttons button {
&.FIE_topbar-reset-button {
&::before {
content: attr(title);
font-weight: normal;
}
svg {
display: none;
}
}
}
// Save button fixes
.FIE_topbar-save-button {
color: var(--color-primary-text) !important;
border: none !important;
background-color: var(--color-primary-element) !important;
&:hover,
&:focus {
background-color: var(--color-primary-element-hover) !important;
}
}
// Save Modal fixes
.FIE_resize-tool-options {
.FIE_resize-width-option,
.FIE_resize-height-option {
flex: 1 1;
min-width: 0;
}
}
// Resize lock
.FIE_resize-ratio-locker {
margin-right: 8px !important;
// Icon is very thin
svg {
width: 20px;
height: 20px;
path {
stroke-width: 1;
stroke: var(--color-main-text);
fill: var(--color-main-text);
}
}
}
// Close editor button fixes
.FIE_topbar-close-button {
svg path {
// The path viewbox is weird and
// not correct, this fixes it
transform: scale(1.6);
}
}
// Canvas container
.FIE_canvas-container {
background-color: var(--color-main-background) !important;
}
// Loader
.FIE_spinner::after,
.FIE_spinner-label {
display: none !important;
}
.FIE_spinner-wrapper {
background-color: transparent !important;
}
.FIE_spinner::before {
position: absolute;
z-index: 2;
top: 50%;
left: 50%;
width: 28px;
height: 28px;
margin: -16px 0 0 -16px;
content: "";
-webkit-transform-origin: center;
-ms-transform-origin: center;
transform-origin: center;
-webkit-animation: rotate 0.8s infinite linear;
animation: rotate 0.8s infinite linear;
border: 2px solid var(--color-loading-light);
border-top-color: var(--color-loading-dark);
border-radius: 100%;
filter: var(--background-invert-if-dark);
}
</style>

View File

@ -0,0 +1,111 @@
import { translate as t } from "@nextcloud/l10n";
/**
* Translations file from library source
* We also use that to edit the end strings of
* some buttons, like resetOperations
*
* @see https://raw.githubusercontent.com/scaleflex/filerobot-image-editor/v4/packages/react-filerobot-image-editor/src/context/defaultTranslations.js
*/
export default {
name: t("memories", "Name"),
save: t("memories", "Save"),
saveAs: t("memories", "Save as"),
back: t("memories", "Back"),
loading: t("memories", "Loading …"),
// resetOperations: 'Reset/delete all operations',
resetOperations: t("memories", "Reset"),
changesLoseConfirmation: t("memories", "All changes will be lost."),
changesLoseConfirmationHint: t(
"memories",
"Are you sure you want to continue?"
),
cancel: t("memories", "Cancel"),
continue: t("memories", "Continue"),
undoTitle: t("memories", "Undo"),
redoTitle: t("memories", "Redo"),
showImageTitle: t("memories", "Show original image"),
zoomInTitle: t("memories", "Zoom in"),
zoomOutTitle: t("memories", "Zoom out"),
toggleZoomMenuTitle: t("memories", "Toggle zoom menu"),
adjustTab: t("memories", "Adjust"),
finetuneTab: t("memories", "Fine-tune"),
filtersTab: t("memories", "Filters"),
watermarkTab: t("memories", "Watermark"),
annotateTab: t("memories", "Draw"),
resize: t("memories", "Resize"),
resizeTab: t("memories", "Resize"),
invalidImageError: t("memories", "Invalid image."),
uploadImageError: t("memories", "Error while uploading the image."),
areNotImages: t("memories", "are not images"),
isNotImage: t("memories", "is not an image"),
toBeUploaded: t("memories", "to be uploaded"),
cropTool: t("memories", "Crop"),
original: t("memories", "Original"),
custom: t("memories", "Custom"),
square: t("memories", "Square"),
landscape: t("memories", "Landscape"),
portrait: t("memories", "Portrait"),
ellipse: t("memories", "Ellipse"),
classicTv: t("memories", "Classic TV"),
cinemascope: t("memories", "CinemaScope"),
arrowTool: t("memories", "Arrow"),
blurTool: t("memories", "Blur"),
brightnessTool: t("memories", "Brightness"),
contrastTool: t("memories", "Contrast"),
ellipseTool: t("memories", "Ellipse"),
unFlipX: t("memories", "Un-flip X"),
flipX: t("memories", "Flip X"),
unFlipY: t("memories", "Un-flip Y"),
flipY: t("memories", "Flip Y"),
hsvTool: t("memories", "HSV"),
hue: t("memories", "Hue"),
saturation: t("memories", "Saturation"),
value: t("memories", "Value"),
imageTool: t("memories", "Image"),
importing: t("memories", "Importing …"),
addImage: t("memories", "+ Add image"),
lineTool: t("memories", "Line"),
penTool: t("memories", "Pen"),
polygonTool: t("memories", "Polygon"),
sides: t("memories", "Sides"),
rectangleTool: t("memories", "Rectangle"),
cornerRadius: t("memories", "Corner Radius"),
resizeWidthTitle: t("memories", "Width in pixels"),
resizeHeightTitle: t("memories", "Height in pixels"),
toggleRatioLockTitle: t("memories", "Toggle ratio lock"),
reset: t("memories", "Reset"),
resetSize: t("memories", "Reset to original image size"),
rotateTool: t("memories", "Rotate"),
textTool: t("memories", "Text"),
textSpacings: t("memories", "Text spacing"),
textAlignment: t("memories", "Text alignment"),
fontFamily: t("memories", "Font family"),
size: t("memories", "Size"),
letterSpacing: t("memories", "Letter spacing"),
lineHeight: t("memories", "Line height"),
warmthTool: t("memories", "Warmth"),
addWatermark: t("memories", "+ Add watermark"),
addWatermarkTitle: t("memories", "Choose watermark type"),
uploadWatermark: t("memories", "Upload watermark"),
addWatermarkAsText: t("memories", "Add as text"),
padding: t("memories", "Padding"),
shadow: t("memories", "Shadow"),
horizontal: t("memories", "Horizontal"),
vertical: t("memories", "Vertical"),
blur: t("memories", "Blur"),
opacity: t("memories", "Opacity"),
position: t("memories", "Position"),
stroke: t("memories", "Stroke"),
saveAsModalLabel: t("memories", "Save image as"),
extension: t("memories", "Extension"),
nameIsRequired: t("memories", "Name is required."),
quality: t("memories", "Quality"),
imageDimensionsHoverTitle: t("memories", "Saved image size (width x height)"),
cropSizeLowerThanResizedWarning: t(
"memories",
"Note that the selected crop area is lower than the applied resize which might cause quality decrease"
),
actualSize: t("memories", "Actual size (100%)"),
fitSize: t("memories", "Fit size"),
};

View File

@ -569,7 +569,7 @@ export default class SelectionManager extends Mixins(GlobalMixin, UserConfig) {
> .text {
flex-grow: 1;
line-height: 40px;
line-height: 42px;
padding-left: 8px;
}

View File

@ -73,7 +73,7 @@
<div
class="photo"
v-for="photo of item.photos"
:key="photo.key || photo.fileid"
:key="photo.key"
:style="{
height: photo.dispH + 'px',
width: photo.dispW + 'px',
@ -227,12 +227,58 @@ export default class Timeline extends Mixins(GlobalMixin, UserConfig) {
mounted() {
this.selectionManager = this.$refs.selectionManager;
this.scrollerManager = this.$refs.scrollerManager;
this.createState();
this.routeChange(this.$route);
}
@Watch("$route")
async routeChange(from: any, to: any) {
await this.refresh();
async routeChange(to: any, from?: any) {
if (from?.path !== to.path) {
await this.refresh();
}
// Check if hash has changed
const viewerIsOpen = (this.$refs.viewer as any).isOpen;
if (from?.hash !== to.hash && to.hash?.startsWith("#v") && !viewerIsOpen) {
// Open viewer
const parts = to.hash.split("/");
if (parts.length !== 3) return;
// Get params
const dayid = parseInt(parts[1]);
const key = parts[2];
if (isNaN(dayid) || !key) return;
// Get day
const day = this.heads[dayid]?.day;
if (day && !day.detail) {
const state = this.state;
await this.fetchDay(dayid, true);
if (state !== this.state) return;
}
// Find photo
const photo = day?.detail?.find((p) => p.key === key);
if (!photo) return;
// Scroll to photo if initializing
if (!from) {
const index = this.list.findIndex(
(r) => r.day.dayid === dayid && r.photos?.includes(photo)
);
if (index !== -1) {
(this.$refs.recycler as any).scrollToItem(index);
}
}
(this.$refs.viewer as any).open(photo, this.list);
} else if (
from?.hash?.startsWith("#v") &&
!to.hash?.startsWith("#v") &&
viewerIsOpen
) {
// Close viewer
(this.$refs.viewer as any).close();
}
}
beforeDestroy() {
@ -784,7 +830,7 @@ export default class Timeline extends Mixins(GlobalMixin, UserConfig) {
}
/** Fetch image data for one dayId */
async fetchDay(dayId: number) {
async fetchDay(dayId: number, now = false) {
const head = this.heads[dayId];
if (!head) return;
@ -804,7 +850,7 @@ export default class Timeline extends Mixins(GlobalMixin, UserConfig) {
this.fetchDayQueue.push(dayId);
// Only single queries allowed for month vie
if (this.isMonthView()) {
if (now || this.isMonthView()) {
return this.fetchDayExpire();
}
@ -892,11 +938,14 @@ export default class Timeline extends Mixins(GlobalMixin, UserConfig) {
data.forEach(utils.convertFlags);
// Filter out items we don't want to show at all
if (!this.config_showHidden) {
// Hidden folders
if (!this.config_showHidden && dayId === this.TagDayID.FOLDERS) {
// Hidden folders and folders without previews
data = data.filter(
(p) =>
!(p.flag & this.c.FLAG_IS_FOLDER && (<IFolder>p).name.startsWith("."))
!(
p.flag & this.c.FLAG_IS_FOLDER &&
((<IFolder>p).name.startsWith(".") || !(<IFolder>p).previews.length)
)
);
}
@ -1048,7 +1097,7 @@ export default class Timeline extends Mixins(GlobalMixin, UserConfig) {
photo.key = `${photo.fileid}-${val}`;
seen.set(photo.fileid, val + 1);
} else {
photo.key = null;
photo.key = `${photo.fileid}`;
seen.set(photo.fileid, 1);
}
@ -1146,7 +1195,10 @@ export default class Timeline extends Mixins(GlobalMixin, UserConfig) {
// selection mode
this.selectionManager.selectPhoto(photo);
} else {
(<any>this.$refs.viewer).open(photo, this.list);
this.$router.push({
...this.$route,
hash: utils.getViewerHash(photo),
});
}
}

View File

@ -5,9 +5,29 @@
:class="{ fullyOpened }"
:style="{ width: outerWidth }"
>
<div class="inner" ref="inner">
<div class="top-bar" v-if="photoswipe" :class="{ opened }">
<NcActions :inline="3" container=".memories_viewer .pswp">
<ImageEditor
v-if="editorOpen"
:mime="currentPhoto.mimetype"
:src="currentDownloadLink"
:fileid="currentPhoto.fileid"
@close="editorOpen = false"
/>
<div class="inner" ref="inner" v-show="!editorOpen">
<div class="top-bar" v-if="photoswipe" :class="{ showControls }">
<NcActions
:inline="numInlineActions"
container=".memories_viewer .pswp"
>
<NcActionButton
:aria-label="t('memories', 'Share')"
@click="shareCurrent"
:close-after-click="true"
v-if="canShare"
>
{{ t("memories", "Share") }}
<template #icon> <ShareIcon :size="24" /> </template>
</NcActionButton>
<NcActionButton
:aria-label="t('memories', 'Delete')"
@click="deleteCurrent"
@ -37,6 +57,17 @@
<InfoIcon :size="24" />
</template>
</NcActionButton>
<NcActionButton
:aria-label="t('memories', 'Edit')"
v-if="canEdit"
@click="openEditor"
:close-after-click="true"
>
{{ t("memories", "Edit") }}
<template #icon>
<TuneIcon :size="24" />
</template>
</NcActionButton>
<NcActionButton
:aria-label="t('memories', 'Download')"
@click="downloadCurrent"
@ -65,13 +96,16 @@
<script lang="ts">
import { Component, Emit, Mixins } from "vue-property-decorator";
import GlobalMixin from "../mixins/GlobalMixin";
import { IDay, IPhoto, IRow, IRowType } from "../types";
import { NcActions, NcActionButton } from "@nextcloud/vue";
import { subscribe, unsubscribe } from "@nextcloud/event-bus";
import { generateUrl } from "@nextcloud/router";
import { showError } from "@nextcloud/dialogs";
import ImageEditor from "./ImageEditor.vue";
import * as dav from "../services/DavRequests";
import * as utils from "../services/Utils";
@ -84,23 +118,28 @@ import "photoswipe/style.css";
import videojs from "video.js";
import "video.js/dist/video-js.css";
import ShareIcon from "vue-material-design-icons/ShareVariant.vue";
import DeleteIcon from "vue-material-design-icons/Delete.vue";
import StarIcon from "vue-material-design-icons/Star.vue";
import StarOutlineIcon from "vue-material-design-icons/StarOutline.vue";
import DownloadIcon from "vue-material-design-icons/Download.vue";
import InfoIcon from "vue-material-design-icons/InformationOutline.vue";
import OpenInNewIcon from "vue-material-design-icons/OpenInNew.vue";
import TuneIcon from "vue-material-design-icons/Tune.vue";
@Component({
components: {
NcActions,
NcActionButton,
ImageEditor,
ShareIcon,
DeleteIcon,
StarIcon,
StarOutlineIcon,
DownloadIcon,
InfoIcon,
OpenInNewIcon,
TuneIcon,
},
})
export default class Viewer extends Mixins(GlobalMixin) {
@ -108,8 +147,12 @@ export default class Viewer extends Mixins(GlobalMixin) {
@Emit("fetchDay") fetchDay(dayId: number) {}
@Emit("updateLoading") updateLoading(delta: number) {}
public isOpen = false;
private originalTitle = null;
public editorOpen = false;
private show = false;
private opened = false;
private showControls = false;
private fullyOpened = false;
private sidebarOpen = false;
private sidebarWidth = 400;
@ -124,29 +167,76 @@ export default class Viewer extends Mixins(GlobalMixin) {
private globalCount = 0;
private globalAnchor = -1;
private currIndex = -1;
mounted() {
subscribe("files:sidebar:opened", this.handleAppSidebarOpen);
subscribe("files:sidebar:closed", this.handleAppSidebarClose);
subscribe("files:file:created", this.handleFileUpdated);
subscribe("files:file:updated", this.handleFileUpdated);
}
beforeDestroy() {
unsubscribe("files:sidebar:opened", this.handleAppSidebarOpen);
unsubscribe("files:sidebar:closed", this.handleAppSidebarClose);
unsubscribe("files:file:created", this.handleFileUpdated);
unsubscribe("files:file:updated", this.handleFileUpdated);
}
/** Number of buttons to show inline */
get numInlineActions() {
let base = 3;
if (this.canShare) base++;
if (this.canEdit) base++;
if (window.innerWidth < 768) {
return Math.min(base, 3);
} else {
return Math.min(base, 5);
}
}
/** Update the document title */
private updateTitle(photo: IPhoto | undefined) {
if (!this.originalTitle) {
this.originalTitle = document.title;
}
if (photo) {
document.title = `${photo.basename} - ${globalThis.OCA.Theming?.name}`;
} else {
document.title = this.originalTitle;
this.originalTitle = null;
}
}
/** Get the currently open photo */
private getCurrentPhoto() {
get currentPhoto() {
if (!this.list.length || !this.photoswipe) {
return null;
}
const idx = this.photoswipe.currIndex - this.globalAnchor;
const idx = this.currIndex - this.globalAnchor;
if (idx < 0 || idx >= this.list.length) {
return null;
}
return this.list[idx];
}
/** Get download link for current photo */
get currentDownloadLink() {
return this.currentPhoto
? window.location.origin + getDownloadLink(this.currentPhoto)
: null;
}
/** Event on file changed */
handleFileUpdated({ fileid }: { fileid: number }) {
console.log("file updated", fileid);
if (this.currentPhoto && this.currentPhoto.fileid === fileid) {
this.currentPhoto.etag += "_";
this.photoswipe.refreshSlideContent(this.currIndex);
}
}
/** Create the base photoswipe object */
private async createBase(args: PhotoSwipeOptions) {
this.show = true;
@ -216,8 +306,9 @@ export default class Viewer extends Mixins(GlobalMixin) {
if (navElem) navElem.style.zIndex = "0";
});
this.photoswipe.on("openingAnimationStart", () => {
this.isOpen = true;
this.fullyOpened = false;
this.opened = true;
this.showControls = true;
if (this.sidebarOpen) {
this.openSidebar();
}
@ -226,9 +317,12 @@ export default class Viewer extends Mixins(GlobalMixin) {
this.fullyOpened = true;
});
this.photoswipe.on("close", () => {
this.isOpen = false;
this.fullyOpened = false;
this.opened = false;
this.showControls = false;
this.hideSidebar();
this.setRouteHash(undefined);
this.updateTitle(undefined);
});
this.photoswipe.on("destroy", () => {
document.body.classList.remove(klass);
@ -236,8 +330,9 @@ export default class Viewer extends Mixins(GlobalMixin) {
// reset everything
this.show = false;
this.opened = false;
this.isOpen = false;
this.fullyOpened = false;
this.showControls = false;
this.photoswipe = null;
this.list = [];
this.days.clear();
@ -248,19 +343,27 @@ export default class Viewer extends Mixins(GlobalMixin) {
// toggle-controls
this.photoswipe.on("tapAction", () => {
this.opened = !this.opened;
this.showControls = !this.showControls;
});
// Update vue route for deep linking
this.photoswipe.on("slideActivate", (e) => {
this.currIndex = this.photoswipe.currIndex;
this.setRouteHash(e.slide?.data?.photo);
this.updateTitle(e.slide?.data?.photo);
});
// Video support
this.photoswipe.on("contentLoad", (e) => {
const { content, isLazy } = e;
if (content.data.photo.flag & this.c.FLAG_IS_VIDEO) {
if ((content.data?.photo?.flag || 0) & this.c.FLAG_IS_VIDEO) {
e.preventDefault();
content.type = "video";
// Create video element
content.videoElement = document.createElement("video") as any;
content.videoElement.setAttribute("preload", "none");
content.videoElement.classList.add("video-js");
// Get DAV URL for video
@ -281,7 +384,7 @@ export default class Viewer extends Mixins(GlobalMixin) {
fluid: true,
autoplay: content.data.playvideo,
controls: true,
preload: "metadata",
preload: "none",
muted: true,
html5: {
vhs: {
@ -295,7 +398,7 @@ export default class Viewer extends Mixins(GlobalMixin) {
// Play video on open slide
this.photoswipe.on("slideActivate", (e) => {
const { slide } = e;
if (slide.data.photo.flag & this.c.FLAG_IS_VIDEO) {
if ((slide.data?.photo?.flag || 0) & this.c.FLAG_IS_VIDEO) {
setTimeout(() => {
slide.content.element.querySelector("video")?.play();
}, 500);
@ -305,7 +408,7 @@ export default class Viewer extends Mixins(GlobalMixin) {
// Pause video on close slide
this.photoswipe.on("slideDeactivate", (e) => {
const { slide } = e;
if (slide.data.photo.flag & this.c.FLAG_IS_VIDEO) {
if ((slide.data?.photo?.flag || 0) & this.c.FLAG_IS_VIDEO) {
slide.content.element.querySelector("video")?.pause();
}
});
@ -318,14 +421,13 @@ export default class Viewer extends Mixins(GlobalMixin) {
this.list = [...anchorPhoto.d.detail];
let startIndex = -1;
// Get days list and map
for (const r of rows) {
if (r.type === IRowType.HEAD) {
if (this.TagDayIDValueSet.has(r.dayId)) continue;
if (r.day.dayid == anchorPhoto.d.dayid) {
startIndex = r.day.detail.findIndex(
(p) => p.fileid === anchorPhoto.fileid
);
startIndex = r.day.detail.indexOf(anchorPhoto);
this.globalAnchor = this.globalCount;
}
@ -335,10 +437,13 @@ export default class Viewer extends Mixins(GlobalMixin) {
}
}
// Create basic viewer
await this.createBase({
index: this.globalAnchor + startIndex,
});
// Lazy-generate item data.
// Load the next two days in the timeline.
this.photoswipe.addFilter("itemData", (itemData, index) => {
// Get photo object from list
let idx = index - this.globalAnchor;
@ -405,7 +510,7 @@ export default class Viewer extends Mixins(GlobalMixin) {
const thumbSrc: string =
photo.flag & this.c.FLAG_IS_VIDEO
? undefined
: this.thumbElem(photo)?.querySelector("img")?.getAttribute("src") ||
: this.thumbElem(photo)?.getAttribute("src") ||
getPreviewUrl(photo, false, 256);
// Get full image
@ -415,17 +520,36 @@ export default class Viewer extends Mixins(GlobalMixin) {
};
});
// Get the thumbnail image
this.photoswipe.addFilter("thumbEl", (thumbEl, data, index) => {
const photo = this.list[index - this.globalAnchor];
if (photo.flag & this.c.FLAG_IS_VIDEO) return thumbEl;
if (!photo || photo.flag & this.c.FLAG_IS_VIDEO) return thumbEl;
return this.thumbElem(photo) || thumbEl;
});
// Scroll to keep the thumbnail in view
this.photoswipe.on("slideActivate", (e) => {
const thumb = this.thumbElem(e.slide.data?.photo);
if (thumb && this.fullyOpened) {
const rect = thumb.getBoundingClientRect();
if (rect.bottom < 50 || rect.top > window.innerHeight - 50) {
thumb.scrollIntoView({
block: "center",
});
}
}
});
this.photoswipe.init();
}
/** Close the viewer */
public close() {
this.photoswipe?.close();
}
/** Open with a static list of photos */
public async openStatic(photo: IPhoto, list: IPhoto[]) {
public async openStatic(photo: IPhoto, list: IPhoto[], thumbSize?: number) {
this.list = list;
await this.createBase({
index: list.findIndex((p) => p.fileid === photo.fileid),
@ -434,10 +558,12 @@ export default class Viewer extends Mixins(GlobalMixin) {
this.globalCount = list.length;
this.globalAnchor = 0;
this.photoswipe.addFilter("itemData", (itemData, index) => {
return this.getItemData(this.list[index]);
});
this.photoswipe.addFilter("itemData", (itemData, index) => ({
...this.getItemData(this.list[index]),
msrc: thumbSize ? getPreviewUrl(photo, false, thumbSize) : undefined,
}));
this.isOpen = true;
this.photoswipe.init();
}
@ -453,11 +579,89 @@ export default class Viewer extends Mixins(GlobalMixin) {
}
/** Get element for thumbnail if it exists */
private thumbElem(photo: IPhoto) {
private thumbElem(photo: IPhoto): HTMLImageElement | undefined {
if (!photo) return;
return document.getElementById(
`memories-photo-${photo.key || photo.fileid}`
);
const elems = document.querySelectorAll(`.memories-thumb-${photo.key}`);
if (elems.length === 0) return;
if (elems.length === 1) return elems[0] as HTMLImageElement;
// Find element within 500px of the screen top
let elem: HTMLImageElement;
elems.forEach((e) => {
const rect = e.getBoundingClientRect();
if (rect.top > -500) {
elem = e as HTMLImageElement;
}
});
return elem;
}
/** Set the route hash to the given photo */
private setRouteHash(photo: IPhoto | undefined) {
const hash = photo ? utils.getViewerHash(photo) : "";
if (hash !== this.$route.hash) {
this.$router.replace({
...this.$route,
hash,
});
}
}
get canEdit() {
return ["image/jpeg", "image/png"].includes(this.currentPhoto?.mimetype);
}
private openEditor() {
// Only for JPEG for now
if (!this.canEdit) return;
this.editorOpen = true;
}
/** Does the browser support native share API */
get canShare() {
return "share" in navigator;
}
/** Share the current photo externally */
private async shareCurrent() {
try {
// Check navigator support
if (!this.canShare) throw new Error("Share not supported");
// Get image data from "img.pswp__img"
const img = document.querySelector("img.pswp__img") as HTMLImageElement;
if (!img?.src) return;
// Shre image data using navigator api
const photo = this.currentPhoto;
if (!photo) return;
// No videos yet
if (photo.flag & this.c.FLAG_IS_VIDEO)
throw new Error(this.t("memories", "Video sharing not supported yet"));
// Get image blob
const blob = await (await fetch(img.src)).blob();
const data = {
files: [
new File([blob], photo.basename, {
type: blob.type,
}),
],
title: photo.basename,
text: photo.basename,
};
if (!(<any>navigator).canShare(data)) {
throw new Error(this.t("memories", "Cannot share this type of data"));
}
await navigator.share(data);
} catch (err) {
console.error(err.name, err.message);
showError(err.message);
}
}
/** Delete this photo and refresh */
@ -484,14 +688,14 @@ export default class Viewer extends Mixins(GlobalMixin) {
/** Is the current photo a favorite */
private isFavorite() {
const p = this.getCurrentPhoto();
const p = this.currentPhoto;
if (!p) return false;
return Boolean(p.flag & this.c.FLAG_IS_FAVORITE);
}
/** Favorite the current photo */
private async favoriteCurrent() {
const photo = this.getCurrentPhoto();
const photo = this.currentPhoto;
const val = !this.isFavorite();
try {
this.updateLoading(1);
@ -513,14 +717,14 @@ export default class Viewer extends Mixins(GlobalMixin) {
/** Download the current photo */
private async downloadCurrent() {
const photo = this.getCurrentPhoto();
const photo = this.currentPhoto;
if (!photo) return;
dav.downloadFilesByPhotos([photo]);
}
/** Open the sidebar */
private async openSidebar(photo?: IPhoto) {
const fInfo = await dav.getFiles([photo || this.getCurrentPhoto()]);
const fInfo = await dav.getFiles([photo || this.currentPhoto]);
globalThis.OCA?.Files?.Sidebar?.setFullScreenMode?.(true);
globalThis.OCA.Files.Sidebar.open(fInfo[0].filename);
}
@ -578,8 +782,7 @@ export default class Viewer extends Mixins(GlobalMixin) {
* Open the files app with the current file.
*/
private async viewInFolder() {
const photo = this.getCurrentPhoto();
if (photo) dav.viewInFolder(photo);
if (this.currentPhoto) dav.viewInFolder(this.currentPhoto);
}
}
</script>
@ -609,7 +812,7 @@ export default class Viewer extends Mixins(GlobalMixin) {
transition: opacity 0.2s ease-in-out;
opacity: 0;
&.opened {
&.showControls {
opacity: 1;
}
}
@ -645,5 +848,12 @@ export default class Viewer extends Mixins(GlobalMixin) {
.pswp__icn-shadow {
display: none;
}
// Hide arrows on mobile
@media (max-width: 768px) {
.pswp__button--arrow {
opacity: 0 !important;
}
}
}
</style>

View File

@ -3,8 +3,8 @@
draggable="false"
class="folder fill-block"
:class="{
hasPreview: previewFileInfos.length > 0,
onePreview: previewFileInfos.length === 1,
hasPreview: previews.length > 0,
onePreview: previews.length === 1,
hasError: error,
}"
:to="target"
@ -15,17 +15,11 @@
</div>
<div class="previews fill-block">
<div
class="img-outer"
v-for="info of previewFileInfos"
:key="info.fileid"
>
<div class="img-outer" v-for="info of previews" :key="info.fileid">
<img
class="fill-block"
:class="{ error: info.flag & c.FLAG_LOAD_FAIL }"
:key="'fpreview-' + info.fileid"
:src="getPreviewUrl(info, true, 256)"
@error="info.flag |= c.FLAG_LOAD_FAIL"
@error="$event.target.classList.add('error')"
/>
</div>
</div>
@ -34,11 +28,10 @@
<script lang="ts">
import { Component, Prop, Watch, Mixins } from "vue-property-decorator";
import { IFileInfo, IFolder } from "../../types";
import { IFolder, IPhoto } from "../../types";
import GlobalMixin from "../../mixins/GlobalMixin";
import UserConfig from "../../mixins/UserConfig";
import * as dav from "../../services/DavRequests";
import { getPreviewUrl } from "../../services/FileUtils";
import FolderIcon from "vue-material-design-icons/Folder.vue";
@ -52,7 +45,7 @@ export default class Folder extends Mixins(GlobalMixin, UserConfig) {
@Prop() data: IFolder;
// Separate property because the one on data isn't reactive
private previewFileInfos: IFileInfo[] = [];
private previews: IPhoto[] = [];
// Error occured fetching thumbs
private error = false;
@ -81,29 +74,13 @@ export default class Folder extends Mixins(GlobalMixin, UserConfig) {
}
// Get preview infos
if (!this.data.previewFileInfos) {
const folderPath = this.data.path.split("/").slice(3).join("/");
dav
.getFolderPreviewFileIds(folderPath, 4)
.then((fileInfos) => {
fileInfos = fileInfos.filter((f) => f.hasPreview);
fileInfos.forEach((f) => (f.flag = 0));
if (fileInfos.length > 0 && fileInfos.length < 4) {
fileInfos = [fileInfos[0]];
}
this.data.previewFileInfos = fileInfos;
this.previewFileInfos = fileInfos;
})
.catch(() => {
this.data.previewFileInfos = [];
this.previewFileInfos = [];
// Something is wrong with the folder
// e.g. external storage not available
this.error = true;
});
} else {
this.previewFileInfos = this.data.previewFileInfos;
const previews = this.data.previews;
if (previews) {
if (previews.length > 0 && previews.length < 4) {
this.previews = [previews[0]];
} else {
this.previews = previews.slice(0, 4);
}
}
}

View File

@ -1,6 +1,5 @@
<template>
<div
:id="`memories-photo-${data.key || data.fileid}`"
class="p-outer fill-block"
:class="{
selected: data.flag & c.FLAG_SELECTED,
@ -30,7 +29,7 @@
>
<img
ref="img"
class="fill-block"
:class="['fill-block', `memories-thumb-${data.key}`]"
draggable="false"
:src="src"
:key="data.fileid"
@ -80,6 +79,12 @@ export default class Photo extends Mixins(GlobalMixin) {
}
}
@Watch("data.etag")
onEtagChange() {
this.hasFaceRect = false;
this.refresh();
}
mounted() {
this.hasFaceRect = false;
this.refresh();

View File

@ -209,7 +209,7 @@ img {
color: white;
padding: 0 5%;
text-align: center;
font-size: 1.2em;
font-size: 1.1em;
word-wrap: break-word;
text-overflow: ellipsis;
line-height: 1em;
@ -225,6 +225,10 @@ img {
bottom: 10%;
transform: unset;
}
@media (max-width: 768px) {
font-size: 0.95em;
}
}
.bbl {

View File

@ -122,6 +122,7 @@ export default class OnThisDay extends Mixins(GlobalMixin) {
for (const photo of photos) {
const dateTaken = utils.dayIdToDate(photo.dayid);
const year = dateTaken.getUTCFullYear();
photo.key = `${photo.fileid}`;
if (year !== currentYear) {
this.years.push({
@ -194,7 +195,7 @@ export default class OnThisDay extends Mixins(GlobalMixin) {
click(year: IYear) {
const allPhotos = this.years.flatMap((y) => y.photos);
this.viewer.openStatic(year.preview, allPhotos);
this.viewer.openStatic(year.preview, allPhotos, 512);
}
}
</script>

View File

@ -216,6 +216,13 @@ export function getFolderRoutePath(basePath: string) {
return path;
}
/**
* Get route hash for viewer for photo
*/
export function getViewerHash(photo: IPhoto) {
return `#v/${photo.dayid}/${photo.key}`;
}
/** Set a timer that renews if existing */
export function setRenewingTimeout(
ctx: any,

View File

@ -98,9 +98,9 @@ export function getDownloadLink(photo: IPhoto) {
route.params.name
);
if (fInfos.length) {
return `remote.php/dav/${fInfos[0].originalFilename}`;
return `/remote.php/dav${fInfos[0].originalFilename}`;
}
}
return `remote.php/dav/${photo.filename}`; // normal route
return `/remote.php/dav${photo.filename}`; // normal route
}

View File

@ -92,8 +92,8 @@ export type IPhoto = {
export interface IFolder extends IPhoto {
/** Path to folder */
path: string;
/** FileInfos for preview images */
previewFileInfos?: IFileInfo[];
/** Photos for preview images */
previews?: IPhoto[];
/** Name of folder */
name: string;
}