Merge branch 'master' into stable24
commit
a7430eecee
|
@ -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
|
||||
|
|
|
@ -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'],
|
||||
]
|
||||
];
|
||||
|
|
|
@ -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" : "Грешка от общ характер",
|
||||
|
|
|
@ -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" : "Грешка от общ характер",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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.",
|
||||
|
|
|
@ -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.",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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);");
|
||||
|
|
|
@ -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);"
|
||||
}
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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.",
|
||||
|
|
|
@ -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.",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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" : "日",
|
||||
|
|
|
@ -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" : "日",
|
||||
|
|
|
@ -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ė",
|
||||
|
|
|
@ -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ė",
|
||||
|
|
|
@ -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" : "Ден",
|
||||
|
|
|
@ -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" : "Ден",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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.",
|
||||
|
|
|
@ -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.",
|
||||
|
|
|
@ -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." : "Не удалось добавить файлы в избранное.",
|
||||
|
|
|
@ -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." : "Не удалось добавить файлы в избранное.",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -16,6 +16,7 @@ OC.L10N.register(
|
|||
"Favorite" : "Омиљени",
|
||||
"Unarchive" : "Врати из архиве",
|
||||
"View in folder" : "Види у фасцикли",
|
||||
"Sidebar" : "Бочна трака",
|
||||
"Public link" : "Јавна веза",
|
||||
"Back" : "Назад",
|
||||
"Save" : "Сачувај",
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
"Favorite" : "Омиљени",
|
||||
"Unarchive" : "Врати из архиве",
|
||||
"View in folder" : "Види у фасцикли",
|
||||
"Sidebar" : "Бочна трака",
|
||||
"Public link" : "Јавна веза",
|
||||
"Back" : "Назад",
|
||||
"Save" : "Сачувај",
|
||||
|
|
|
@ -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.",
|
||||
|
|
|
@ -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.",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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." : "Не вдалося видалити файли.",
|
||||
|
|
|
@ -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." : "Не вдалося видалити файли.",
|
||||
|
|
|
@ -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" : "日",
|
||||
|
|
|
@ -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" : "日",
|
||||
|
|
|
@ -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" : "一般故障",
|
||||
|
|
|
@ -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" : "一般故障",
|
||||
|
|
|
@ -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" : "一般失敗",
|
||||
|
|
|
@ -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" : "一般失敗",
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
}
|
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -13,6 +13,7 @@ class TimelineQuery
|
|||
use TimelineQueryDays;
|
||||
use TimelineQueryFaces;
|
||||
use TimelineQueryFilters;
|
||||
use TimelineQueryFolders;
|
||||
use TimelineQueryTags;
|
||||
|
||||
protected IDBConnection $connection;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
20
lib/Util.php
20
lib/Util.php
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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",
|
||||
|
|
|
@ -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>
|
|
@ -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"),
|
||||
};
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue