Merge branch 'develop' into feature/oidc-v2

This commit is contained in:
Michael Mayer 2021-10-13 16:19:43 +02:00
commit 0facf42981
19 changed files with 701 additions and 977 deletions

View file

@ -19,8 +19,8 @@ To get a first impression, you're welcome to play with our public demo at [demo.
## Features ##
* Browse all your photos and videos without worrying about duplicates, RAW images or video codecs
* Powerful [search filters](https://demo.photoprism.org/browse?q=mono%3Atrue%20quality%3A3%20photo%3Atrue) make finding the right picture a walk in the park
* Browse all your photos and videos without worrying about RAW conversion, duplicates or video formats
* Powerful [search filters](https://demo.photoprism.org/browse?q=mono%3Atrue%20quality%3A3%20photo%3Atrue) make it easy to find the right pictures
* Since the [user interface](https://demo.photoprism.org/) is a [Progressive Web App](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps),
it provides a native app-like experience, and you can easily install it on the home screen of all major operating systems and mobile devices
* Includes four high-resolution [world maps](https://demo.photoprism.org/places) to see where you've been and for rediscovering long-forgotten shots
@ -29,9 +29,9 @@ To get a first impression, you're welcome to play with our public demo at [demo.
* AI-powered [image classification](https://demo.photoprism.org/labels)
based on Google TensorFlow
* Metadata is extracted and merged from Exif, XMP, and proprietary formats such as Google Photos JSON
* Image properties like colors, chroma, luminance, quality, panoramic projection, and location type are automatically detected when you update the index or import files
* Use [PhotoSync](https://www.photosync-app.com/) to securely backup iOS and Android mobile devices in the background
* WebDAV clients such as Microsoft's Windows Explorer and Apple's Finder can [connect](https://docs.photoprism.org/user-guide/sync/webdav/) directly to PhotoPrism, allowing you to open, edit, and delete files from your computer or phone as if they were local
* Image properties like colors, chroma, luminance, quality, and location are automatically detected when you update the index or import files
* Use [PhotoSync](https://www.photosync-app.com/) to securely backup iOS and Android phones in the background
* WebDAV clients such as Microsoft's Windows Explorer and Apple's Finder can [connect](https://docs.photoprism.org/user-guide/sync/webdav/) directly to PhotoPrism, allowing you to open, edit, and delete files from your computer as if they were local
## Getting Started ##

File diff suppressed because it is too large Load diff

View file

@ -301,6 +301,101 @@ body.dark-theme #photoprism .v-tabs .v-badge__badge {
background: transparent;
}
/* Midnight Theme */
.theme-midnight .v-content__wrap,
.theme-midnight .p-page,
.theme-midnight .form,
.theme-midnight .v-content {
background: #212121 !important;
}
#photoprism.theme-midnight .theme--light.v-small-dialog__content,
#photoprism.theme-midnight .theme--light.v-sheet,
#photoprism.theme-midnight .theme--light.v-card {
background: #212121;
}
.theme-midnight .application.theme--light {
background: #212121;
}
#photoprism.theme-midnight .theme--light .v-table {
background: #262626;
}
#photoprism.theme-midnight .theme--light.v-table thead th,
#photoprism.theme-midnight .theme--light.v-table tbody td {
color: #fff;
}
#photoprism.theme-midnight .theme--light.v-table tbody tr:hover {
background: #333333;
}
#photoprism.theme-midnight .theme--light.v-chip,
#photoprism.theme-midnight .v-card__actions .theme--light.v-text-field--solo>.v-input__control>.v-input__slot {
background: #333;
}
#photoprism.theme-midnight .theme--light.v-text-field--solo>.v-input__control>.v-input__slot {
background: #262626;
}
#photoprism.theme-midnight .theme--light.v-input--selection-controls.v-input--is-disabled .v-icon {
color: #999 !important;
}
#photoprism.theme-midnight .theme--light.v-input--selection-controls.v-input--is-disabled .v-icon,
#photoprism.theme-midnight .theme--light.v-input--is-disabled .v-label,
#photoprism.theme-midnight .theme--light.v-input--is-disabled input,
#photoprism.theme-midnight .theme--light.v-input--is-disabled textarea {
color: #ccc;
}
#photoprism.theme-midnight,
#photoprism.theme-midnight .p-page a,
#photoprism.theme-midnight .v-datatable a,
#photoprism.theme-midnight .theme--light.v-expansion-panel .v-expansion-panel__container,
#photoprism.theme-midnight .theme--light.v-tabs__bar .v-tabs__div,
#photoprism.theme-midnight .theme--light {
color: #fff;
}
#photoprism.theme-midnight .theme--light.v-list {
background: #262626;
}
#photoprism.theme-midnight a.text-link {
color: #c8e3e7 !important;
}
#photoprism.theme-midnight .theme--light.v-select .v-select__selections {
color: #eee;
}
#photoprism.theme-midnight .theme--light.v-list .v-list__tile__sub-title,
#photoprism.theme-midnight .accent--text {
color: #919bd4 !important;
}
#photoprism.theme-midnight .theme--light.v-input:not(.v-input--is-disabled) input,
#photoprism.theme-theri .theme--light.v-input:not(.v-input--is-disabled) textarea {
color: #fff;
}
#photoprism.theme-midnight .theme--light.v-btn.v-btn--disabled,
#photoprism.theme-midnight .theme--light.v-btn.v-btn--disabled .v-btn__loading,
#photoprism.theme-midnight .theme--light.v-btn.v-btn--disabled .v-icon {
color: #999 !important;
}
#photoprism.theme-midnight .theme--light.v-list .v-list__tile__mask {
color: #cccccc;
background: transparent;
}
/* Exceptions */
#photoprism .theme--light.v-text-field--solo.background-inherit>.v-input__control>.v-input__slot {

Binary file not shown.

View file

@ -93,11 +93,11 @@ msgstr "Pridať súbory do vašej knižnice pomocou Web Upload."
#: src/dialog/share.vue:92
msgid "Add Link"
msgstr "Pridať link"
msgstr "Pridať odkaz"
#: src/pages/albums.vue:96
msgid "Add pictures from search results by selecting them."
msgstr "Pridanie obrázkov z výsledkov vyhľadávania ich výberom."
msgstr "Pridanie fotiek z výsledkov vyhľadávania ich výberom."
#: src/dialog/account/add.vue:6 src/pages/settings/sync.vue:46
msgid "Add Server"
@ -111,7 +111,7 @@ msgstr "Pridať do albumu"
#: src/dialog/photo/files.vue:157 src/dialog/photo/files.vue:154
msgid "Added"
msgstr "Pridaný"
msgstr "Pridané"
#: src/pages/settings.vue:52
msgid "Advanced"
@ -173,7 +173,7 @@ msgstr "Albumy odstránené"
#: src/pages/albums.vue:257 src/share/albums.vue:215
msgid "All %{n} albums loaded"
msgstr "Všetkých %{n} bolo načítaných"
msgstr "Všetkých %{n} albumov bolo načítaných"
#: src/pages/labels.vue:246
msgid "All %{n} labels loaded"
@ -181,16 +181,16 @@ msgstr "Všetkých %{n} štítkov načítaných"
#: src/pages/people/subjects.vue:335
msgid "All %{n} people loaded"
msgstr "Všetci %{n} ľudia načítaní"
msgstr "Všetkých %{n} ľudí načítaných"
#: src/component/album/toolbar.vue:17 src/component/photo/toolbar.vue:21
msgid "All Cameras"
msgstr "Všetky Kamery"
msgstr "Všetky kamery"
#: src/component/photo/toolbar.vue:24 src/pages/albums.vue:23
#: src/pages/albums.vue:447 src/share/albums.vue:23 src/share/albums.vue:405
msgid "All Categories"
msgstr "Všetky Kategórie"
msgstr "Všetky kategórie"
#: src/component/photo/toolbar.vue:23
msgid "All Colors"
@ -277,27 +277,27 @@ msgstr "Archivované"
#: src/dialog/photo/archive.vue:10
msgid "Are you sure you want to archive the selection?"
msgstr "Ste si istý že chcete archivovať výber?"
msgstr "Ste si istý, že chcete archivovať výber?"
#: src/dialog/album/delete.vue:10
msgid "Are you sure you want to delete these albums?"
msgstr "Ste si istý že chcete vymazať tieto albumy?"
msgstr "Ste si istý, že chcete vymazať tieto albumy?"
#: src/dialog/label/delete.vue:10
msgid "Are you sure you want to delete these labels?"
msgstr "Ste si istý že chcete vymazať tieto štítky?"
msgstr "Ste si istý, že chcete vymazať tieto štítky?"
#: src/dialog/account/remove.vue:10
msgid "Are you sure you want to delete this account?"
msgstr "Ste si istý že chcete vymazať tento účet?"
msgstr "Ste si istý, že chcete vymazať tento účet?"
#: src/dialog/photo/delete.vue:10
msgid "Are you sure you want to permanently delete these pictures?"
msgstr "Ste si istí, že chcete tieto obrázky natrvalo odstrániť?"
msgstr "Ste si istý, že chcete tieto obrázky natrvalo odstrániť?"
#: src/dialog/file/delete.vue:10
msgid "Are you sure you want to permanently delete this file?"
msgstr "Ste si istý že chcete permanentne vymazať tento účet?"
msgstr "Ste si istý že chcete permanentne vymazať tento súbor?"
#: src/dialog/photo/details.vue:506
msgid "Artist"
@ -361,11 +361,11 @@ msgstr "Prehliadať indexované súbory a zložky v Knižnici."
#: src/options/options.js:349
msgid "Bug Report"
msgstr "Nahlásenie chyby"
msgstr "Nahlásiť chybu"
#: src/common/notify.js:99
msgid "Busy, please wait…"
msgstr "Zaneprázdnený, prosím čakajte..."
msgstr "Som zaneprázdnený, prosím čakajte..."
#: src/component/navigation.vue:215 src/component/navigation.vue:835
#: src/routes.js:147 src/routes.js:154
@ -467,7 +467,7 @@ msgstr "Kompletné preskenovanie"
#: src/dialog/photo/labels.vue:19
msgid "Confidence"
msgstr "Dôvera"
msgstr "Zhoda"
#: src/dialog/account/add.vue:16
msgid "Connect"
@ -501,7 +501,7 @@ msgstr "Konvertuje sa"
#: src/dialog/share.vue:55 src/dialog/webdav.vue:36
msgid "Copied to clipboard"
msgstr "Skopírované"
msgstr "Skopírované do schránky"
#: src/dialog/photo/details.vue:529
msgid "Copyright"
@ -556,7 +556,6 @@ msgid "Daily"
msgstr "Denne"
#: src/options/options.js:95
#| msgid "Spanish"
msgid "Danish"
msgstr "Dánčina"
@ -610,7 +609,7 @@ msgstr "Posledná Záloha"
#: src/pages/settings/advanced.vue:166
msgid "Disable built-in WebDAV server. Requires a restart."
msgstr "Zakáže vstavaný server WebDAV. Vyžaduje sa reštart."
msgstr "Zakázať vstavaný server WebDAV. Vyžaduje reštart."
#: src/pages/settings/advanced.vue:484
msgid "Disable Darktable"
@ -626,7 +625,7 @@ msgstr "Zakázanie aplikácie FFmpeg"
#: src/pages/settings/advanced.vue:187
msgid "Disable Places"
msgstr "Vypnuté"
msgstr "Zakázať miesta"
#: src/pages/settings/advanced.vue:505
msgid "Disable RawTherapee"
@ -638,11 +637,11 @@ msgstr "Zakázať TensorFlow"
#: src/pages/settings/advanced.vue:165
msgid "Disable WebDAV"
msgstr "Vypnuté"
msgstr "Zakázať WebDAV"
#: src/dialog/account/edit.vue:67 src/dialog/account/edit.vue:112
msgid "Disabled"
msgstr "Vypnuté"
msgstr "Zakázané"
#: src/pages/settings/advanced.vue:188
msgid "Disables reverse geocoding and maps."
@ -654,32 +653,32 @@ msgstr "Objaviť"
#: src/pages/settings/advanced.vue:144
msgid "Don't backup photo and album metadata to YAML files."
msgstr "Nezálohujte metadáta fotografií a albumov do súborov YAML."
msgstr "Nezálohovať metadáta fotografií a albumov do súborov YAML."
#: src/pages/settings/advanced.vue:210
msgid "Don't create ExifTool JSON files for improved metadata extraction."
msgstr "Nevytvárajte súbory ExifTool JSON pre vylepšenú extrakciu metadát."
msgstr "Nevytvárať súbory ExifTool JSON pre vylepšenú extrakciu metadát."
#: src/pages/settings/advanced.vue:100
msgid "Don't modify originals folder. Disables import, upload, and delete."
msgstr ""
"Neupravujte priečinok s originálmi. Zakáže import, nahrávanie a mazanie."
"Neupravovať priečinok s originálmi. Zakáže import, nahrávanie a mazanie."
#: src/pages/settings/advanced.vue:527
msgid "Don't transcode videos with FFmpeg."
msgstr "Neprekladajte videá pomocou programu FFmpeg."
msgstr "Netranskódvať videá pomocou programu FFmpeg."
#: src/pages/settings/advanced.vue:485
msgid "Don't use Darktable to convert RAW files."
msgstr "Na konverziu súborov RAW nepoužívajte program Darktable."
msgstr "Nepoužívať Darktable pre konvertovanie RAW súborov."
#: src/pages/settings/advanced.vue:506
msgid "Don't use RawTherapee to convert RAW files."
msgstr "Nepoužívajte RawTherapee na konverziu súborov RAW."
msgstr "Nepoužívať RawTherapee na konverziu súborov RAW."
#: src/pages/settings/advanced.vue:232
msgid "Don't use TensorFlow for image classification."
msgstr "Prehliadať a upravovať triediace štítky fotiek."
msgstr "Nepoužívať TensorFlow pre triedenie fotografií"
#: src/options/options.js:350
msgid "Donations"
@ -705,7 +704,7 @@ msgstr "Stiahnuť"
#: src/dialog/account/edit.vue:321
msgid "Download remote files"
msgstr "Stiahnuť ovládané súbory"
msgstr "Stiahnuť vzdialené súbory"
#: src/pages/settings/general.vue:163
msgid "Download single files and zip archives."
@ -724,7 +723,7 @@ msgstr "Sťahovanie..."
#: src/pages/settings/advanced.vue:282
msgid "Downscaling Filter"
msgstr "Filter Kvality"
msgstr "Filter znižovania kvality"
#: src/pages/library/files.vue:37
msgid "Duplicates will be skipped and only appear once."
@ -736,19 +735,19 @@ msgstr "Holandsky"
#: src/pages/settings/advanced.vue:305
msgid "Dynamic Previews"
msgstr "Neuložené ukážky"
msgstr "Dynamické Ukážky"
#: src/pages/settings/advanced.vue:306
msgid ""
"Dynamic rendering requires a powerful server. It is not recommended for NAS "
"devices."
msgstr ""
"Vykresľovanie na požiadanie vyžaduje výkonný procesor a nedoporučuje sa pre "
"menšie domáce servery alebo zariadenia NAS."
"Dynamické vykresľovanie vyžaduje výkonný server. Neodporúčame používať na "
"NAS zariadeniach."
#: src/pages/settings/advanced.vue:348
msgid "Dynamic Size Limit: %{n}px"
msgstr "Limit veľkosti bez medzipamäte: %{n} px"
msgstr "Limit dynamickej pamäte: %{n} px"
#: src/pages/about/feedback.vue:167
msgid "E-Mail"
@ -766,7 +765,7 @@ msgstr "Upraviť %{name}"
#: src/dialog/account/edit.vue:141
msgid "Edit Account"
msgstr "Upraviť Účet"
msgstr "Upraviť učet"
#: src/dialog/photo/edit.vue:45
msgid "Edit Photo"
@ -778,7 +777,7 @@ msgstr "Upravené"
#: src/pages/settings/advanced.vue:122
msgid "Enable new features currently under development."
msgstr "Povoľte nové funkcie, ktoré sú momentálne vo vývoji."
msgstr "Povoliť nové funkcie, ktoré sú momentálne vo vývoji."
#: src/dialog/account/edit.vue:67 src/dialog/account/edit.vue:112
msgid "Enabled"
@ -798,11 +797,11 @@ msgstr "Chyby"
#: src/pages/settings/library.vue:72
msgid "Estimate the approximate location of pictures without coordinates."
msgstr "Odhad približnej polohy obrázkov bez súradníc."
msgstr "Odhadnúť približnú polohu fotiek bez súradníc."
#: src/pages/settings/library.vue:71
msgid "Estimates"
msgstr "Odhady"
msgstr "Odhaduje sa"
#: src/options/options.js:311
msgid "Every two days"
@ -821,7 +820,6 @@ msgid "Exclude hidden"
msgstr "Vylúčiť skryté"
#: src/component/navigation.vue:252
#| msgid "Expand Search"
msgid "Expand"
msgstr "Rozbaliť"
@ -847,7 +845,7 @@ msgstr "F Číslo"
#: src/model/face.js:159
msgid "Face"
msgstr "Tvar"
msgstr "Tvár"
#: src/dialog/photo/info.vue:73
msgid "Faces"
@ -859,11 +857,11 @@ msgstr "Zlyhalo kopírovanie do schránky"
#: src/dialog/share.vue:90
msgid "Failed removing link"
msgstr "Zlyhalo odstraňovanie linku"
msgstr "Zlyhalo odstraňovanie odkazu"
#: src/dialog/share.vue:78
msgid "Failed updating link"
msgstr "Zlyhalo aktualizovanie linku"
msgstr "Zlyhalo aktualizovanie odkazu"
#: src/dialog/upload.vue:159
msgid "Failure while importing uploaded files"
@ -956,7 +954,7 @@ msgstr "Zlatá"
#: src/options/options.js:199
msgid "Grayscale"
msgstr "Stupne šedej"
msgstr "Stupne sivej"
#: src/options/options.js:335
msgid "Green"
@ -1077,7 +1075,7 @@ msgid ""
"In case pictures you expect are missing, please rescan your library and wait "
"until indexing has been completed."
msgstr ""
"V prípade, že očakávané obrázky chýbajú, preskenujte svoju knižnicu znova a "
"V prípade, že niektoré fotky chýbajú, znova preskenujte svoju knižnicu a "
"počkajte, kým sa indexovanie neukončí."
#: src/pages/library.vue:32 src/pages/settings/library.vue:6
@ -1130,7 +1128,7 @@ msgstr "Limit veľkosti JPEG: %{n} px"
#: src/pages/library/import.vue:26
msgid "JPEGs and thumbnails are automatically rendered as needed."
msgstr "JPEG a náhľady sú automaticky zobrazené podľa potreby."
msgstr "JPEG a náhľady sú automaticky vykreslené podľa potreby."
#: src/dialog/photo/details.vue:598
msgid "Keywords"
@ -1185,8 +1183,7 @@ msgstr "Objektív"
#: src/pages/about/about.vue:37
msgid "Let us know when we mistakenly label an idea as unfunded."
msgstr ""
"Dajte nám vedieť, keď nejakú myšlienku omylom označíme za nefinancovanú."
msgstr "Dajte nám vedieť, ak nejaký nápad označíme ako nefinancovaný."
#: src/component/navigation.vue:301 src/component/navigation.vue:311
#: src/component/navigation.vue:4 src/component/navigation.vue:1135
@ -1210,15 +1207,15 @@ msgstr "Limetka"
#: src/pages/library/files.vue:307
msgid "Limit reached, showing first %{n} files"
msgstr "Limit dosiahnutý, zobrazovanie prvých %{n} súborov"
msgstr "Limit bol dosiahnutý, zobrazovanie prvých %{n} súborov"
#: src/options/options.js:358
msgid "Linear: Very Smooth, Best Performance"
msgstr "Lineárne: veľmi hladké, najlepší výkon"
msgstr "Lineárne: Veľmi hladké, Najlepší výkon"
#: src/model/link.js:120
msgid "Link"
msgstr "Link"
msgstr "Odkaz"
#: src/component/album/toolbar.vue:33 src/component/photo/toolbar.vue:32
msgid "List"
@ -1255,12 +1252,12 @@ msgstr ""
#: src/component/navigation.vue:401 src/component/navigation.vue:1471
msgid "Login"
msgstr "Prihlásiť"
msgstr "Prihlásiť sa"
#: src/component/navigation.vue:448 src/component/navigation.vue:1581
#: src/component/navigation.vue:1612
msgid "Logout"
msgstr "Odhlásiť"
msgstr "Odhlásiť sa"
#: src/pages/library.vue:55 src/pages/settings/general.vue:426
msgid "Logs"
@ -1330,7 +1327,7 @@ msgstr "Mesačný svit"
#: src/pages/album/photos.vue:343 src/pages/photos.vue:381
#: src/share/photos.vue:358
msgid "More than %{n} pictures found"
msgstr "Nájdených viac ako %{n} obrázkov"
msgstr "Našlo sa viac ako %{n} obrázkov"
#: src/pages/albums.vue:345 src/share/albums.vue:303
msgid "More than 20 albums found"
@ -1342,7 +1339,7 @@ msgstr "Našlo sa viac ako 20 štítkov"
#: src/pages/people/subjects.vue:435
msgid "More than 20 people found"
msgstr "Viac ako 20 ľudí našlo"
msgstr "Našlo sa viac ako 20 ľudí"
#: src/component/album/toolbar.vue:31 src/component/photo/toolbar.vue:30
msgid "Mosaic"
@ -1376,7 +1373,7 @@ msgstr "Meno"
#: src/pages/labels.vue:38 src/pages/library/files.vue:40
#: src/pages/people/faces.vue:42 src/pages/people/subjects.vue:40
msgid "Name too long"
msgstr "Príliš dlhé meno"
msgstr "Meno je príliš dlhé"
#: src/options/options.js:306 src/options/options.js:316
#: src/pages/settings/sync.vue:50
@ -1416,9 +1413,8 @@ msgstr "Nenašli sa žiadne štítky"
#: src/dialog/photo/people.vue:5 src/pages/people/faces.vue:30
#: src/pages/people/faces.vue:278 src/pages/people/faces.vue:364
#: src/pages/people/subjects.vue:33 src/pages/people/subjects.vue:428
#| msgid "No photos found"
msgid "No people found"
msgstr "Neboli nájdené žiadny členovia"
msgstr "Neboli nájdené žiadny ľudia"
#: src/component/photo/cards.vue:7 src/component/photo/list.vue:8
#: src/component/photo/mosaic.vue:7 src/pages/album/photos.vue:336
@ -1427,13 +1423,13 @@ msgstr "Neboli nájdené žiadny členovia"
#: src/share/photo/cards.vue:7 src/share/photo/list.vue:8
#: src/share/photo/mosaic.vue:7 src/share/photos.vue:351
msgid "No pictures found"
msgstr "Nenašli sa žiadne obrázky"
msgstr "Nenašli sa žiadne fotky"
#: src/component/photo/cards.vue:4 src/component/photo/list.vue:5
#: src/component/photo/mosaic.vue:4 src/share/photo/cards.vue:4
#: src/share/photo/list.vue:5 src/share/photo/mosaic.vue:4
msgid "No recently edited pictures"
msgstr "Žiadne nedávno upravené obrázky"
msgstr "Žiadne nedávno upravené fotky"
#: src/pages/settings/sync.vue:47
msgid "No servers configured."
@ -1479,8 +1475,8 @@ msgstr "Nebolo Nájdené"
msgid ""
"Note you may manually manage your originals folder and importing is optional."
msgstr ""
"Upozorňujeme, že priečinok s originálmi môžete spravovať ručne a import je "
"voliteľný."
"Upozorňujeme, že priečinok s originálmi by ste mali spravovať ručne a import "
"je voliteľný."
#: src/pages/settings/sync.vue:34
msgid "Note:"
@ -1492,7 +1488,7 @@ msgid ""
"as remote service for backup and file upload."
msgstr ""
"Poznámka: Iba WebDAV servery, ako napríklad Nextcloud alebo PhotoPrism, môžu "
"byť nakonfigurované ako ovládané služby pre zálohu a odovzdávanie súborov."
"byť nakonfigurované ako vzdialené služby pre zálohu a odovzdávanie súborov."
#: src/pages/settings/account.vue:20
msgid ""
@ -1526,29 +1522,29 @@ msgstr "Raz za týždeň"
#: src/pages/albums.vue:340 src/share/albums.vue:298
msgid "One album found"
msgstr "Jeden album nájdený"
msgstr "Našiel sa jeden album"
#: src/pages/library/files.vue:299
msgid "One file found"
msgstr "Jeden súbor nájdený"
msgstr "Našiel sa jeden súbor"
#: src/pages/library/files.vue:301
msgid "One folder found"
msgstr "Jedna zložka nájdená"
msgstr "Našla sa jedna zložka"
#: src/pages/labels.vue:337
msgid "One label found"
msgstr "Jeden štítok sa našiel"
msgstr "Našiel sa jeden štítok"
#: src/pages/people/faces.vue:280 src/pages/people/faces.vue:366
#: src/pages/people/subjects.vue:430
msgid "One person found"
msgstr "Jedna osoba našla"
msgstr "Našla sa jedna osoba"
#: src/pages/album/photos.vue:338 src/pages/photos.vue:376
#: src/share/photos.vue:353
msgid "One picture found"
msgstr "Jeden nájdený obrázok"
msgstr "Našla sa jedna fotka"
#: src/options/options.js:219
msgid "Onyx"
@ -1563,7 +1559,6 @@ msgid "Orange"
msgstr "Oranžová"
#: src/dialog/photo/files.vue:129 src/dialog/photo/files.vue:126
#| msgid "Animation"
msgid "Orientation"
msgstr "Orientácie"
@ -1627,7 +1622,7 @@ msgstr "Ľudia"
#: src/dialog/share.vue:72
msgid "People you share a link with will be able to view public contents."
msgstr "Ľudia s ktorými zdieľate link, budú vidieť verejný obsah."
msgstr "Ľudia s ktorými zdieľate odkaz, budú vidieť verejný obsah."
#: src/component/photo/clipboard.vue:67
msgid "Permanently deleted"
@ -1635,7 +1630,7 @@ msgstr "Trvalo vymazané"
#: src/pages/settings/general.vue:207
msgid "Permanently remove files to free up storage."
msgstr "Trvalé odstránenie súborov na uvoľnenie úložiska."
msgstr "Trvalo odstráňte súbory aby ste uvoľnili miesto."
#: src/model/photo.js:852
msgid "Photo"
@ -1679,7 +1674,7 @@ msgstr "Prehrať"
#: src/pages/settings/account.vue:105
msgid "Please confirm your new password."
msgstr "Prosím overte vaše nové heslo."
msgstr "Prosím potvrďte vaše nové heslo."
#: src/dialog/sponsor.vue:24
msgid ""
@ -1771,11 +1766,11 @@ msgstr "Raw"
#: src/component/photo/cards.vue:205 src/component/photo/mosaic.vue:180
#: src/share/photo/cards.vue:178 src/share/photo/mosaic.vue:161
msgid "RAW"
msgstr "Raw"
msgstr "RAW"
#: src/pages/settings/advanced.vue:96
msgid "RAW Conversion"
msgstr "Konvertuje sa"
msgstr "Konverzia súborov RAW"
#: src/pages/library/index.vue:124
msgid "Re-index all originals, including already indexed and unchanged files."
@ -1804,7 +1799,7 @@ msgstr "Rozpoznávanie sa začne po dokončení indexovania."
#: src/pages/people.vue:17
msgid "Recognized"
msgstr "Uznávané"
msgstr "Rozpoznané"
#: src/pages/settings/general.vue:339
msgid "Recognizes faces so that specific people can be found."
@ -1828,7 +1823,7 @@ msgstr "Znovu načítavanie..."
#: src/dialog/account/edit.vue:97
msgid "Remote Sync"
msgstr "Ovládaná Synchronizácia"
msgstr "Vzdialená Synchronizácia"
#: src/dialog/photo/people.vue:108
msgid "Remove"
@ -1934,7 +1929,7 @@ msgstr "Vybrať"
#: src/dialog/upload.vue:139
msgid "Select albums or create a new one"
msgstr "Označte album alebo vytvorte nový"
msgstr "Označte albumy alebo vytvorte nové"
#: src/component/photo/clipboard.vue:39
msgid "Selection approved"
@ -1984,7 +1979,7 @@ msgstr "Prvotné nastavenie"
#: src/options/options.js:234
msgid "Shadow"
msgstr "Bez tieňa"
msgstr "Tieň"
#: src/component/album/clipboard.vue:70 src/component/album/toolbar.vue:88
#: src/component/photo/clipboard.vue:77 src/pages/settings/general.vue:250
@ -2033,16 +2028,15 @@ msgstr "Zobrazí podrobnejšie správy denníka. Vyžaduje reštart."
#: src/model/file.js:185
msgid "Sidecar"
msgstr "Pripojenie"
msgstr "Pripojený súbor (sidecar)"
#: src/pages/login.vue:19
msgid "Sign in"
msgstr "Registrácia"
msgstr "Prihlásiť sa"
#: src/dialog/sponsor.vue:39
#| msgid "Sign in"
msgid "Sign Up"
msgstr "Registrácia"
msgstr "Registrovať sa"
#: src/pages/discover.vue:8
msgid "Similar"
@ -2080,14 +2074,13 @@ msgstr "Španielsky"
#: src/component/photo/cards.vue:235 src/component/photo/mosaic.vue:210
#: src/share/photo/cards.vue:208 src/share/photo/mosaic.vue:191
#| msgid "Stacks"
msgid "Stack"
msgstr "Zásobník"
msgstr "Naskladané fotky"
#: src/pages/settings/library.vue:195
msgid "Stack files sharing the same unique image or instance identifier."
msgstr ""
"Skladať súbory zdieľajúce rovnaký jedinečný obrázok alebo identifikátor "
"Naskladané súbory zdieľajúce rovnaký jedinečný obrázok alebo identifikátor "
"inštancie."
#: src/pages/settings/library.vue:174
@ -2095,23 +2088,23 @@ msgid ""
"Stack pictures taken at the exact same time and location based on their "
"metadata."
msgstr ""
"Skladajte obrázky nasnímané v rovnakom čase a na rovnakom mieste na základe "
"Naskladané fotky nasnímané v rovnakom čase a na rovnakom mieste na základe "
"ich metadát."
#: src/dialog/photo/info.vue:86
msgid "Stackable"
msgstr "Stohovateľné"
msgstr "Naskladateľné"
#: src/component/navigation.vue:92 src/pages/settings/library.vue:34
msgid "Stacks"
msgstr "Postupnosť"
msgstr "Naskladané"
#: src/pages/settings/library.vue:140
msgid ""
"Stacks group files with a similar frame of reference, but differences of "
"quality, format, size or color."
msgstr ""
"Skladá skupinové súbory s podobným referenčným rámcom, ale s rozdielmi v "
"Naskladá skupinové súbory s podobným referenčným rámcom, ale s rozdielmi v "
"kvalite, formáte, veľkosti alebo farbe."
#: src/pages/library/index.vue:31
@ -2128,7 +2121,7 @@ msgstr "Štáty"
#: src/pages/settings/advanced.vue:374
msgid "Static Size Limit: %{n}px"
msgstr "Limit veľkosti pred predbežným vykreslením: %{n} px"
msgstr "Statický limit veľkosti: %{n} px"
#: src/dialog/photo/files.vue:34
msgid "Status"
@ -2163,13 +2156,13 @@ msgstr "Synchronizácia"
#: src/dialog/account/edit.vue:372
msgid "Sync raw and video files"
msgstr "Synchronizovať fotky formátu raw"
msgstr "Synchronizovať súbory raw a videá"
#: src/component/photo/cards.vue:25 src/component/photo/list.vue:35
#: src/dialog/photo/info.vue:52 src/share/photo/cards.vue:25
#: src/share/photo/list.vue:31
msgid "Taken"
msgstr "Odobratý"
msgstr "Zachytené"
#: src/options/options.js:336
msgid "Teal"
@ -2185,7 +2178,7 @@ msgstr "Ďakujeme veľmi pekne!"
#: src/pages/library/index.vue:36
msgid "The index currently contains %{n} hidden files."
msgstr "Index obsahuje %{n} skrytých súborov."
msgstr "Index momentálne obsahuje %{n} skrytých súborov."
#: src/pages/about/about.vue:17
msgid ""
@ -2222,8 +2215,8 @@ msgid ""
"local."
msgstr ""
"Toto pripojí zložku originálov ako sieťový disk a umožní vám otvoriť, "
"upraviť a zmazať súbory z vášho počítača alebo smartphonu ak sú uložené "
"lokálne."
"upraviť a zmazať súbory z vášho počítača alebo smartphonu ako keby boli "
"uložené lokálne."
#: src/pages/about/about.vue:21
msgid "This open-source project is made possible thanks to our sponsors."
@ -2311,7 +2304,7 @@ msgstr "Nezoradené"
#: src/dialog/photo/files.vue:38 src/dialog/photo/files.vue:35
msgid "Unstack"
msgstr "Nepostupné"
msgstr "Rozdeliť naskladané"
#: src/dialog/photo/files.vue:166 src/dialog/photo/files.vue:163
#: src/dialog/photo/info.vue:175
@ -2320,7 +2313,7 @@ msgstr "Aktualizované"
#: src/pages/library/index.vue:153
msgid "Updating faces"
msgstr "Aktualizácia tvárí"
msgstr "Aktualizujú sa tváre"
#: src/pages/library/index.vue:157
msgid "Updating index"
@ -2332,11 +2325,11 @@ msgstr "Aktualizujú sa momenty"
#: src/pages/library/index.vue:155
msgid "Updating previews"
msgstr "Aktualizácia náhľadov"
msgstr "Aktualizujú sa náhľady"
#: src/pages/library/index.vue:149
msgid "Updating stacks"
msgstr "Nepostupné"
msgstr "Aktualizujú sa naskladané fotky"
#: src/component/album/toolbar.vue:176 src/component/navigation.vue:130
#: src/component/photo/toolbar.vue:125 src/dialog/share/upload.vue:35
@ -2364,7 +2357,7 @@ msgstr "Odovzdať lokálne súbory"
#: src/pages/settings/general.vue:251
msgid "Upload to WebDAV and share links with friends."
msgstr "Odovzdať do WebDAV a zdieľať linky s priateľmi."
msgstr "Odovzdať do WebDAV a zdieľať odkazy s priateľmi."
#: src/dialog/upload.vue:36
msgid "Uploading %{n} of %{t}…"
@ -2384,7 +2377,7 @@ msgstr "URL"
#: src/pages/settings/advanced.vue:463
msgid "Use Presets"
msgstr "Použite predvoľby"
msgstr "Použiť predvoľbu"
#: src/model/user.js:122
msgid "User"
@ -2430,7 +2423,7 @@ msgstr ""
#: src/dialog/webdav.vue:8
msgid "WebDAV clients can connect to PhotoPrism using the following URL:"
msgstr ""
"WebDAV klienti sa môžu pripojiť ku PhotoPrismu pomocou následujúcej URL:"
"WebDAV klienti sa môžu pripojiť ku PhotoPrismu pomocou nasledujúcej URL:"
#: src/pages/settings/sync.vue:35
msgid ""
@ -2442,7 +2435,7 @@ msgstr ""
#: src/dialog/share.vue:82 src/dialog/share/upload.vue:7
msgid "WebDAV Upload"
msgstr "WebDAV Odovzdávanie"
msgstr "Odovzdávanie cez WebDAV"
#: src/options/options.js:340
msgid "White"
@ -2481,12 +2474,12 @@ msgstr "Môžete stiahnuť iba jeden štítok"
#: src/component/album/clipboard.vue:32 src/component/album/clipboard.vue:45
msgid "You may only select one item"
msgstr "Mali by ste označiť len jednu položku"
msgstr "Mali by ste označiť iba jednu položku"
#: src/dialog/photo/people.vue:8 src/pages/people/faces.vue:33
#: src/pages/people/subjects.vue:37
msgid "You may rescan your library to find additional faces."
msgstr "Ak chcete nájsť ďalšie tváre, môžete svoju knižnicu preskenovať."
msgstr "Mali by ste preskenovať knižnicu pre nájdenie viac tvárí."
#: src/pages/about/about.vue:47
msgid ""
@ -2495,9 +2488,9 @@ msgid ""
"or services without prior written permission. In other words, please ask."
msgstr ""
"Mali by ste to používať ako je požadované pre opísanie nášho softwaru, "
"spusťte svoj vlastný server, pre edukačné účely, ale nie pre ponúkanie "
"reklamy, produktov alebo služieb bez povolenia. Inak povedané, prosím, "
"spýtajte sa."
"spustenie svojho vlastného serveru, pre edukačné účely, ale nie pre "
"ponúkanie reklamy, produktov alebo služieb bez povolenia. Inak povedané, "
"prosím, spýtajte sa."
#: src/dialog/sponsor.vue:21 src/pages/about/about.vue:32
msgid ""
@ -2505,14 +2498,14 @@ msgid ""
"satellite maps, and develop new features."
msgstr ""
"Vaša podpora nám pomáha financovať prevádzkové náklady, poskytovať služby, "
"ako sú satelitné mapy, a vyvíjať nové funkcie."
"ako sú satelitné mapy, a vyvíjanie nových funkcií."
#: src/pages/albums.vue:43 src/pages/albums.vue:1
msgid ""
"Your library is continuously analyzed to automatically create albums of "
"special moments, trips, and places."
msgstr ""
"Vaša knižnica sa priebežne analyzuje a automaticky vytvára albumy "
"Vaša knižnica sa priebežne analyzuje aby mohla automaticky vytvárať albumy "
"špeciálnych momentov, výletov a miest."
#: src/pages/about/feedback.vue:4

File diff suppressed because one or more lines are too long

View file

@ -46,15 +46,15 @@ msgstr ""
msgid "%{n} pictures found"
msgstr ""
#: src/options/options.js:307
#: src/options/options.js:312
msgid "1 hour"
msgstr ""
#: src/options/options.js:309
#: src/options/options.js:314
msgid "12 hours"
msgstr ""
#: src/options/options.js:308
#: src/options/options.js:313
msgid "4 hours"
msgstr ""
@ -70,6 +70,7 @@ msgstr ""
msgid "About"
msgstr ""
#: src/component/navigation.vue:44
#: src/dialog/share/upload.vue:113
#: src/model/account.js:96
#: src/pages/settings.vue:74
@ -129,23 +130,23 @@ msgstr ""
msgid "Advanced"
msgstr ""
#: src/options/options.js:317
#: src/options/options.js:322
msgid "After 1 day"
msgstr ""
#: src/options/options.js:318
#: src/options/options.js:323
msgid "After 3 days"
msgstr ""
#: src/options/options.js:319
#: src/options/options.js:324
msgid "After 7 days"
msgstr ""
#: src/options/options.js:321
#: src/options/options.js:326
msgid "After one month"
msgstr ""
#: src/options/options.js:323
#: src/options/options.js:328
msgid "After one year"
msgstr ""
@ -154,11 +155,11 @@ msgstr ""
msgid "After selecting pictures from search results, you can add them to an album using the context menu."
msgstr ""
#: src/options/options.js:322
#: src/options/options.js:327
msgid "After two months"
msgstr ""
#: src/options/options.js:320
#: src/options/options.js:325
msgid "After two weeks"
msgstr ""
@ -174,7 +175,7 @@ msgstr ""
#: src/component/navigation.vue:130
#: src/component/navigation.vue:140
#: src/component/navigation.vue:4
#: src/component/navigation.vue:545
#: src/component/navigation.vue:544
#: src/routes.js:134
#: src/routes.js:141
#: src/share/albums.vue:4
@ -350,15 +351,15 @@ msgstr ""
msgid "Bio"
msgstr ""
#: src/options/options.js:342
#: src/options/options.js:347
msgid "Black"
msgstr ""
#: src/options/options.js:355
#: src/options/options.js:360
msgid "Blackman: Lanczos Modification, Less Ringing Artifacts"
msgstr ""
#: src/options/options.js:338
#: src/options/options.js:343
msgid "Blue"
msgstr ""
@ -366,7 +367,7 @@ msgstr ""
msgid "Brazilian Portuguese"
msgstr ""
#: src/options/options.js:339
#: src/options/options.js:344
msgid "Brown"
msgstr ""
@ -378,7 +379,7 @@ msgstr ""
msgid "Browse indexed files and folders in Library."
msgstr ""
#: src/options/options.js:349
#: src/options/options.js:354
msgid "Bug Report"
msgstr ""
@ -387,7 +388,7 @@ msgid "Busy, please wait…"
msgstr ""
#: src/component/navigation.vue:215
#: src/component/navigation.vue:835
#: src/component/navigation.vue:834
#: src/routes.js:147
#: src/routes.js:154
msgid "Calendar"
@ -579,7 +580,7 @@ msgstr ""
msgid "Creating thumbnails for"
msgstr ""
#: src/options/options.js:357
#: src/options/options.js:362
msgid "Cubic: Moderate Quality, Good Performance"
msgstr ""
@ -587,15 +588,15 @@ msgstr ""
msgid "Current Password"
msgstr ""
#: src/options/options.js:346
#: src/options/options.js:351
msgid "Customer Support"
msgstr ""
#: src/options/options.js:337
#: src/options/options.js:342
msgid "Cyan"
msgstr ""
#: src/options/options.js:204
#: src/options/options.js:214
msgid "Cyano"
msgstr ""
@ -603,7 +604,7 @@ msgstr ""
msgid "Czech"
msgstr ""
#: src/options/options.js:310
#: src/options/options.js:315
msgid "Daily"
msgstr ""
@ -745,7 +746,7 @@ msgstr ""
msgid "Don't use TensorFlow for image classification."
msgstr ""
#: src/options/options.js:350
#: src/options/options.js:355
msgid "Donations"
msgstr ""
@ -883,7 +884,7 @@ msgstr ""
msgid "Estimates"
msgstr ""
#: src/options/options.js:311
#: src/options/options.js:316
msgid "Every two days"
msgstr ""
@ -896,7 +897,7 @@ msgstr ""
msgid "Exclude hidden"
msgstr ""
#: src/component/navigation.vue:252
#: src/component/navigation.vue:251
msgid "Expand"
msgstr ""
@ -946,7 +947,7 @@ msgstr ""
msgid "Failure while importing uploaded files"
msgstr ""
#: src/options/options.js:250
#: src/options/options.js:255
msgid "Fast"
msgstr ""
@ -955,12 +956,12 @@ msgid "Favorite"
msgstr ""
#: src/component/navigation.vue:189
#: src/component/navigation.vue:747
#: src/component/navigation.vue:746
#: src/routes.js:180
msgid "Favorites"
msgstr ""
#: src/options/options.js:348
#: src/options/options.js:353
msgid "Feature Request"
msgstr ""
@ -1009,7 +1010,7 @@ msgid "Folder is empty"
msgstr ""
#: src/component/navigation.vue:275
#: src/component/navigation.vue:1043
#: src/component/navigation.vue:1042
#: src/routes.js:160
#: src/routes.js:167
msgid "Folders"
@ -1031,7 +1032,7 @@ msgstr ""
msgid "German"
msgstr ""
#: src/options/options.js:332
#: src/options/options.js:337
msgid "Gold"
msgstr ""
@ -1039,11 +1040,11 @@ msgstr ""
msgid "Grayscale"
msgstr ""
#: src/options/options.js:335
#: src/options/options.js:340
msgid "Green"
msgstr ""
#: src/options/options.js:341
#: src/options/options.js:346
msgid "Grey"
msgstr ""
@ -1091,7 +1092,7 @@ msgstr ""
msgid "How can we help?"
msgstr ""
#: src/options/options.js:273
#: src/options/options.js:278
msgid "Hybrid"
msgstr ""
@ -1107,7 +1108,7 @@ msgstr ""
msgid "image"
msgstr ""
#: src/options/options.js:288
#: src/options/options.js:293
msgid "Image"
msgstr ""
@ -1229,7 +1230,7 @@ msgid "Label"
msgstr ""
#: src/component/navigation.vue:262
#: src/component/navigation.vue:998
#: src/component/navigation.vue:997
#: src/dialog/photo/edit.vue:39
#: src/dialog/photo/edit.vue:6
#: src/dialog/photo/edit.vue:216
@ -1242,7 +1243,7 @@ msgstr ""
msgid "Labels deleted"
msgstr ""
#: src/options/options.js:356
#: src/options/options.js:361
msgid "Lanczos: Detail Preservation, Minimal Artifacts"
msgstr ""
@ -1259,7 +1260,7 @@ msgstr ""
msgid "Latitude"
msgstr ""
#: src/options/options.js:209
#: src/options/options.js:219
msgid "Lavender"
msgstr ""
@ -1274,7 +1275,7 @@ msgstr ""
#: src/component/navigation.vue:301
#: src/component/navigation.vue:311
#: src/component/navigation.vue:4
#: src/component/navigation.vue:1135
#: src/component/navigation.vue:1134
#: src/pages/settings.vue:41
#: src/pages/settings/general.vue:404
#: src/routes.js:291
@ -1294,7 +1295,7 @@ msgstr ""
msgid "Like"
msgstr ""
#: src/options/options.js:334
#: src/options/options.js:339
msgid "Lime"
msgstr ""
@ -1302,7 +1303,7 @@ msgstr ""
msgid "Limit reached, showing first %{n} files"
msgstr ""
#: src/options/options.js:358
#: src/options/options.js:363
msgid "Linear: Very Smooth, Best Performance"
msgstr ""
@ -1316,11 +1317,11 @@ msgid "List"
msgstr ""
#: src/component/photo/cards.vue:215
#: src/component/photo/list.vue:188
#: src/component/photo/list.vue:186
#: src/component/photo/mosaic.vue:190
#: src/options/options.js:296
#: src/options/options.js:301
#: src/share/photo/cards.vue:188
#: src/share/photo/list.vue:167
#: src/share/photo/list.vue:165
#: src/share/photo/mosaic.vue:171
msgid "Live"
msgstr ""
@ -1348,13 +1349,13 @@ msgid "Log messages appear here whenever PhotoPrism comes across broken files, o
msgstr ""
#: src/component/navigation.vue:401
#: src/component/navigation.vue:1471
#: src/component/navigation.vue:1470
msgid "Login"
msgstr ""
#: src/component/navigation.vue:448
#: src/component/navigation.vue:1581
#: src/component/navigation.vue:1612
#: src/component/navigation.vue:1580
#: src/component/navigation.vue:1611
msgid "Logout"
msgstr ""
@ -1368,7 +1369,7 @@ msgstr ""
msgid "Longitude"
msgstr ""
#: src/options/options.js:328
#: src/options/options.js:333
msgid "Magenta"
msgstr ""
@ -1389,7 +1390,7 @@ msgstr ""
msgid "Marker"
msgstr ""
#: src/options/options.js:254
#: src/options/options.js:259
msgid "Medium"
msgstr ""
@ -1401,7 +1402,11 @@ msgstr ""
msgid "Message sent"
msgstr ""
#: src/component/navigation.vue:205
#: src/options/options.js:234
msgid "Midnight"
msgstr ""
#: src/component/navigation.vue:204
msgid "Minimize"
msgstr ""
@ -1411,7 +1416,7 @@ msgid "Missing"
msgstr ""
#: src/component/navigation.vue:202
#: src/component/navigation.vue:790
#: src/component/navigation.vue:789
#: src/pages/settings/general.vue:360
#: src/routes.js:121
#: src/routes.js:128
@ -1427,7 +1432,7 @@ msgstr ""
msgid "Month"
msgstr ""
#: src/options/options.js:214
#: src/options/options.js:204
msgid "Moonlight"
msgstr ""
@ -1467,7 +1472,7 @@ msgstr ""
#: src/component/photo/cards.vue:30
#: src/component/photo/list.vue:38
#: src/component/photo/list.vue:237
#: src/component/photo/list.vue:235
#: src/dialog/account/edit.vue:397
#: src/dialog/album/edit.vue:106
#: src/dialog/photo/files.vue:71
@ -1485,7 +1490,7 @@ msgstr ""
#: src/pages/people/subjects.vue:393
#: src/share/photo/cards.vue:30
#: src/share/photo/list.vue:34
#: src/share/photo/list.vue:216
#: src/share/photo/list.vue:214
msgid "Name"
msgstr ""
@ -1500,8 +1505,8 @@ msgstr ""
msgid "Name too long"
msgstr ""
#: src/options/options.js:306
#: src/options/options.js:316
#: src/options/options.js:311
#: src/options/options.js:321
#: src/pages/settings/sync.vue:50
msgid "Never"
msgstr ""
@ -1601,7 +1606,7 @@ msgstr ""
msgid "Non-photographic and low-quality images require a review before they appear in search results."
msgstr ""
#: src/options/options.js:246
#: src/options/options.js:251
msgid "None"
msgstr ""
@ -1638,8 +1643,8 @@ msgid "Nothing to see here yet. Be patient."
msgstr ""
#: src/component/navigation.vue:417
#: src/component/navigation.vue:1516
#: src/options/options.js:265
#: src/component/navigation.vue:1515
#: src/options/options.js:270
msgid "Offline"
msgstr ""
@ -1649,7 +1654,7 @@ msgstr ""
msgid "Oldest first"
msgstr ""
#: src/options/options.js:312
#: src/options/options.js:317
msgid "Once a week"
msgstr ""
@ -1682,7 +1687,7 @@ msgstr ""
msgid "One picture found"
msgstr ""
#: src/options/options.js:219
#: src/options/options.js:209
msgid "Onyx"
msgstr ""
@ -1690,7 +1695,7 @@ msgstr ""
msgid "Options"
msgstr ""
#: src/options/options.js:331
#: src/options/options.js:336
msgid "Orange"
msgstr ""
@ -1719,7 +1724,7 @@ msgstr ""
msgid "Originals"
msgstr ""
#: src/options/options.js:351
#: src/options/options.js:356
msgid "Other"
msgstr ""
@ -1727,7 +1732,7 @@ msgstr ""
msgid "Our vision is to provide the most user-friendly solution for browsing, organizing, and sharing your photo collection."
msgstr ""
#: src/options/options.js:281
#: src/options/options.js:286
msgid "Outdoor"
msgstr ""
@ -1751,7 +1756,7 @@ msgid "Password changed"
msgstr ""
#: src/component/navigation.vue:176
#: src/component/navigation.vue:702
#: src/component/navigation.vue:701
#: src/dialog/photo/edit.vue:52
#: src/dialog/photo/edit.vue:6
#: src/dialog/photo/edit.vue:267
@ -1789,7 +1794,7 @@ msgstr ""
msgid "Photos"
msgstr ""
#: src/options/options.js:329
#: src/options/options.js:334
msgid "Pink"
msgstr ""
@ -1804,7 +1809,7 @@ msgstr ""
#: src/component/navigation.vue:228
#: src/component/navigation.vue:238
#: src/component/navigation.vue:4
#: src/component/navigation.vue:880
#: src/component/navigation.vue:879
#: src/pages/settings/general.vue:108
#: src/pages/settings/general.vue:450
#: src/routes.js:215
@ -1877,14 +1882,14 @@ msgid "Primary"
msgstr ""
#: src/component/navigation.vue:288
#: src/component/navigation.vue:1088
#: src/component/navigation.vue:1087
#: src/dialog/photo/info.vue:102
#: src/pages/settings/general.vue:272
#: src/routes.js:201
msgid "Private"
msgstr ""
#: src/options/options.js:347
#: src/options/options.js:352
msgid "Product Feedback"
msgstr ""
@ -1893,7 +1898,7 @@ msgstr ""
msgid "Projection"
msgstr ""
#: src/options/options.js:327
#: src/options/options.js:332
msgid "Purple"
msgstr ""
@ -1913,7 +1918,7 @@ msgstr ""
msgid "Raspberry"
msgstr ""
#: src/options/options.js:292
#: src/options/options.js:297
msgid "Raw"
msgstr ""
@ -1962,7 +1967,7 @@ msgstr ""
msgid "Recognizes faces so that specific people can be found."
msgstr ""
#: src/options/options.js:330
#: src/options/options.js:335
msgid "Red"
msgstr ""
@ -2060,7 +2065,7 @@ msgstr ""
#: src/component/navigation.vue:56
#: src/component/navigation.vue:66
#: src/component/navigation.vue:4
#: src/component/navigation.vue:284
#: src/component/navigation.vue:283
#: src/component/photo/toolbar.vue:48
#: src/pages/albums.vue:109
#: src/pages/labels.vue:81
@ -2130,7 +2135,7 @@ msgstr ""
#: src/component/navigation.vue:8
#: src/component/navigation.vue:18
#: src/component/navigation.vue:4
#: src/component/navigation.vue:1309
#: src/component/navigation.vue:1308
#: src/routes.js:313
#: src/routes.js:325
#: src/routes.js:337
@ -2149,7 +2154,7 @@ msgstr ""
msgid "Setup"
msgstr ""
#: src/options/options.js:234
#: src/options/options.js:239
msgid "Shadow"
msgstr ""
@ -2229,7 +2234,7 @@ msgstr ""
msgid "Slovak"
msgstr ""
#: src/options/options.js:258
#: src/options/options.js:263
msgid "Slow"
msgstr ""
@ -2305,7 +2310,7 @@ msgstr ""
msgid "Storage Folder"
msgstr ""
#: src/options/options.js:269
#: src/options/options.js:274
msgid "Streets"
msgstr ""
@ -2339,7 +2344,7 @@ msgstr ""
msgid "Taken"
msgstr ""
#: src/options/options.js:336
#: src/options/options.js:341
msgid "Teal"
msgstr ""
@ -2423,7 +2428,7 @@ msgstr ""
msgid "Token"
msgstr ""
#: src/options/options.js:277
#: src/options/options.js:282
msgid "Topographic"
msgstr ""
@ -2519,7 +2524,7 @@ msgid "Updating stacks"
msgstr ""
#: src/component/album/toolbar.vue:176
#: src/component/navigation.vue:130
#: src/component/navigation.vue:129
#: src/component/photo/toolbar.vue:125
#: src/dialog/share/upload.vue:35
#: src/dialog/upload.vue:8
@ -2589,21 +2594,21 @@ msgstr ""
#: src/component/photo/cards.vue:29
#: src/component/photo/cards.vue:225
#: src/component/photo/list.vue:198
#: src/component/photo/list.vue:196
#: src/component/photo/mosaic.vue:200
#: src/model/file.js:183
#: src/model/photo.js:618
#: src/model/photo.js:632
#: src/options/options.js:300
#: src/options/options.js:305
#: src/share/photo/cards.vue:29
#: src/share/photo/cards.vue:198
#: src/share/photo/list.vue:177
#: src/share/photo/list.vue:175
#: src/share/photo/mosaic.vue:181
msgid "Video"
msgstr ""
#: src/component/navigation.vue:163
#: src/component/navigation.vue:658
#: src/component/navigation.vue:657
#: src/routes.js:187
msgid "Videos"
msgstr ""
@ -2633,7 +2638,7 @@ msgstr ""
msgid "WebDAV Upload"
msgstr ""
#: src/options/options.js:340
#: src/options/options.js:345
msgid "White"
msgstr ""
@ -2642,11 +2647,11 @@ msgstr ""
msgid "Year"
msgstr ""
#: src/options/options.js:333
#: src/options/options.js:338
msgid "Yellow"
msgstr ""
#: src/options/options.js:239
#: src/options/options.js:244
msgid "Yellowstone"
msgstr ""

View file

@ -200,16 +200,6 @@ export const Themes = () => [
value: "grayscale",
disabled: false,
},
{
text: $gettext("Cyano"),
value: "cyano",
disabled: false,
},
{
text: $gettext("Lavender"),
value: "lavender",
disabled: false,
},
{
text: $gettext("Moonlight"),
value: "moonlight",
@ -220,6 +210,16 @@ export const Themes = () => [
value: "onyx",
disabled: false,
},
{
text: $gettext("Cyano"),
value: "cyano",
disabled: false,
},
{
text: $gettext("Lavender"),
value: "lavender",
disabled: false,
},
{
text: $gettext("Raspberry"),
value: "raspberry",
@ -230,6 +230,11 @@ export const Themes = () => [
value: "seaweed",
disabled: false,
},
{
text: $gettext("Midnight"),
value: "midnight",
disabled: false,
},
{
text: $gettext("Shadow"),
value: "shadow",

View file

@ -288,5 +288,34 @@
"navigation": "#111",
"navigation-home": "#000000"
}
},
"midnight": {
"dark": true,
"sponsor": true,
"colors": {
"application": "#212121",
"form": "#AFB42B",
"primary": "#7e8acd",
"primary-button": "#444444",
"secondary-dark": "#5C6BC0",
"secondary": "#111111",
"secondary-light": "#1a1a1a",
"accent": "#090c10",
"error": "#e57373",
"info": "#00acc1",
"success": "#4db6ac",
"warning": "#ffd740",
"remove": "#e57373",
"restore": "#64b5f6",
"album": "#ffab00",
"download": "#00bfa5",
"private": "#00b8d4",
"edit": "#00b8d4",
"share": "#9575cd",
"love": "#ef5350",
"terminal": "#333333",
"navigation": "#0d0d0d",
"navigation-home": "#000000"
}
}
}

View file

@ -23,6 +23,8 @@ type PhotoSearch struct {
Stackable bool `form:"stackable"`
Video bool `form:"video"`
Photo bool `form:"photo"`
Raw bool `form:"raw"`
Live bool `form:"live"`
Scan bool `form:"scan"`
Panorama bool `form:"panorama"`
Error bool `form:"error"`

View file

@ -15,6 +15,10 @@ type PhotoSearchGeo struct {
Favorite bool `form:"favorite"`
Video bool `form:"video"`
Photo bool `form:"photo"`
Raw bool `form:"raw"`
Live bool `form:"live"`
Scan bool `form:"scan"`
Panorama bool `form:"panorama"`
Archived bool `form:"archived"`
Public bool `form:"public"`
Private bool `form:"private"`

View file

@ -16,10 +16,7 @@ func LikeAny(col, s string, keywords, exact bool) (wheres []string) {
return wheres
}
s = strings.ReplaceAll(s, txt.Or, " ")
s = strings.ReplaceAll(s, txt.OrEn, " ")
s = strings.ReplaceAll(s, txt.AndEn, txt.And)
s = strings.ReplaceAll(s, txt.Plus, txt.And)
s = txt.StripOr(txt.NormalizeQuery(s))
var wildcardThreshold int

View file

@ -135,7 +135,7 @@ func Photos(f form.PhotoSearch) (results PhotoResults, count int, err error) {
}
}
// Clip to reasonable size and normalize operators.
// Clip and normalize search query.
f.Query = txt.NormalizeQuery(f.Query)
// Set search filters based on search terms.
@ -158,12 +158,12 @@ func Photos(f form.PhotoSearch) (results PhotoResults, count int, err error) {
case terms["video"]:
f.Query = strings.ReplaceAll(f.Query, "video", "")
f.Video = true
case terms["photos"]:
f.Query = strings.ReplaceAll(f.Query, "photos", "")
f.Photo = true
case terms["photo"]:
f.Query = strings.ReplaceAll(f.Query, "photo", "")
f.Photo = true
case terms["live"]:
f.Query = strings.ReplaceAll(f.Query, "live", "")
f.Live = true
case terms["raws"]:
f.Query = strings.ReplaceAll(f.Query, "raws", "")
f.Raw = true
case terms["favorites"]:
f.Query = strings.ReplaceAll(f.Query, "favorites", "")
f.Favorite = true
@ -230,15 +230,16 @@ func Photos(f form.PhotoSearch) (results PhotoResults, count int, err error) {
}
}
// Filter by number of faces.
// Filter by number of faces?
if txt.IsUInt(f.Faces) {
s = s.Where("photos.photo_faces >= ?", txt.Int(f.Faces))
} else if txt.New(f.Faces) && f.Face == "" {
f.Face = f.Faces
f.Faces = ""
} else if txt.Yes(f.Faces) {
s = s.Where("photos.photo_faces > 0")
} else if txt.No(f.Faces) {
s = s.Where("photos.photo_faces = 0")
} else if txt.New(f.Faces) && f.Face == "" {
f.Face = f.Faces
}
// Filter for specific face clusters? Example: PLJ7A3G4MBGZJRMVDIUCBLC46IAP4N7O
@ -324,52 +325,67 @@ func Photos(f form.PhotoSearch) (results PhotoResults, count int, err error) {
s = s.Where(AnyInt("photos.photo_day", f.Day, txt.Or, entity.UnknownDay, txt.DayMax))
}
// Filter by main color?
if f.Color != "" {
s = s.Where("files.file_main_color IN (?)", strings.Split(strings.ToLower(f.Color), txt.Or))
}
// Find favorites only?
if f.Favorite {
s = s.Where("photos.photo_favorite = 1")
}
// Find scans only?
if f.Scan {
s = s.Where("photos.photo_scan = 1")
}
// Find panoramas only?
if f.Panorama {
s = s.Where("photos.photo_panorama = 1")
}
// Find portraits only?
if f.Portrait {
s = s.Where("files.file_portrait = 1")
}
if f.Stackable {
s = s.Where("photos.photo_stack > -1")
} else if f.Unstacked {
s = s.Where("photos.photo_stack = -1")
}
// Filter by location country?
if f.Country != "" {
s = s.Where("photos.photo_country IN (?)", strings.Split(strings.ToLower(f.Country), txt.Or))
}
// Filter by location state?
if f.State != "" {
s = s.Where("places.place_state IN (?)", strings.Split(f.State, txt.Or))
}
// Filter by location category?
if f.Category != "" {
s = s.Joins("JOIN cells ON photos.cell_id = cells.id").
Where("cells.cell_category IN (?)", strings.Split(strings.ToLower(f.Category), txt.Or))
}
// Filter by media type.
// Filter by media type?
if f.Type != "" {
s = s.Where("photos.photo_type IN (?)", strings.Split(strings.ToLower(f.Type), txt.Or))
}
if f.Video {
} else if f.Video {
s = s.Where("photos.photo_type = 'video'")
} else if f.Photo {
s = s.Where("photos.photo_type IN ('image','raw','live')")
} else if f.Raw {
s = s.Where("photos.photo_type = 'raw'")
} else if f.Live {
s = s.Where("photos.photo_type = 'live'")
}
// Filter by storage path?
if f.Path != "" {
p := f.Path
@ -397,33 +413,29 @@ func Photos(f form.PhotoSearch) (results PhotoResults, count int, err error) {
s = s.Where(where, names...)
}
// Filter by complete file names.
// Filter by complete file names?
if f.Filename != "" {
where, values := OrLike("files.file_name", f.Filename)
s = s.Where(where, values...)
}
// Filter by original file name.
// Filter by original file name?
if f.Original != "" {
where, values := OrLike("photos.original_name", f.Original)
s = s.Where(where, values...)
}
// Filter by photo title.
// Filter by photo title?
if f.Title != "" {
where, values := OrLike("photos.photo_title", f.Title)
s = s.Where(where, values...)
}
// Filter by file hash.
// Filter by file hash?
if f.Hash != "" {
s = s.Where("files.file_hash IN (?)", strings.Split(strings.ToLower(f.Hash), txt.Or))
}
if f.Portrait {
s = s.Where("files.file_portrait = 1")
}
if f.Mono {
s = s.Where("files.file_chroma = 0 OR file_colors = '111111111'")
} else if f.Chroma > 9 {

View file

@ -39,7 +39,7 @@ func PhotosGeo(f form.PhotoSearchGeo) (results GeoResults, err error) {
Where("photos.deleted_at IS NULL").
Where("photos.photo_lat <> 0")
// Clip to reasonable size and normalize operators.
// Clip and normalize search query.
f.Query = txt.NormalizeQuery(f.Query)
// Set search filters based on search terms.
@ -62,19 +62,25 @@ func PhotosGeo(f form.PhotoSearchGeo) (results GeoResults, err error) {
case terms["video"]:
f.Query = strings.ReplaceAll(f.Query, "video", "")
f.Video = true
case terms["photos"]:
f.Query = strings.ReplaceAll(f.Query, "photos", "")
f.Photo = true
case terms["photo"]:
f.Query = strings.ReplaceAll(f.Query, "photo", "")
f.Photo = true
case terms["live"]:
f.Query = strings.ReplaceAll(f.Query, "live", "")
f.Live = true
case terms["raws"]:
f.Query = strings.ReplaceAll(f.Query, "raws", "")
f.Raw = true
case terms["favorites"]:
f.Query = strings.ReplaceAll(f.Query, "favorites", "")
f.Favorite = true
case terms["panoramas"]:
f.Query = strings.ReplaceAll(f.Query, "panoramas", "")
f.Panorama = true
case terms["scans"]:
f.Query = strings.ReplaceAll(f.Query, "scans", "")
f.Scan = true
}
}
// Filter by label, label category and keywords.
// Filter by label, label category, and keywords?
if f.Query != "" {
var categories []entity.Category
var labels []entity.Label
@ -117,15 +123,16 @@ func PhotosGeo(f form.PhotoSearchGeo) (results GeoResults, err error) {
}
}
// Filter by number of faces.
// Filter by number of faces?
if txt.IsUInt(f.Faces) {
s = s.Where("photos.photo_faces >= ?", txt.Int(f.Faces))
} else if txt.New(f.Faces) && f.Face == "" {
f.Face = f.Faces
f.Faces = ""
} else if txt.Yes(f.Faces) {
s = s.Where("photos.photo_faces > 0")
} else if txt.No(f.Faces) {
s = s.Where("photos.photo_faces = 0")
} else if txt.New(f.Faces) && f.Face == "" {
f.Face = f.Faces
}
// Filter for specific face clusters? Example: PLJ7A3G4MBGZJRMVDIUCBLC46IAP4N7O
@ -134,6 +141,9 @@ func PhotosGeo(f form.PhotoSearchGeo) (results GeoResults, err error) {
s = s.Where(fmt.Sprintf("photos.id IN (SELECT photo_id FROM files f JOIN %s m ON f.file_uid = m.file_uid AND m.marker_invalid = 0 WHERE face_id IN (?))",
entity.Marker{}.TableName()), strings.Split(f, txt.Or))
}
} else if txt.New(f.Face) {
s = s.Where(fmt.Sprintf("photos.id IN (SELECT photo_id FROM files f JOIN %s m ON f.file_uid = m.file_uid AND m.marker_invalid = 0 AND m.marker_type = ? WHERE subj_uid IS NULL OR subj_uid = '')",
entity.Marker{}.TableName()), entity.MarkerFace)
} else if txt.No(f.Face) {
s = s.Where(fmt.Sprintf("photos.id IN (SELECT photo_id FROM files f JOIN %s m ON f.file_uid = m.file_uid AND m.marker_invalid = 0 AND m.marker_type = ? WHERE face_id IS NULL OR face_id = '')",
entity.Marker{}.TableName()), entity.MarkerFace)
@ -199,29 +209,45 @@ func PhotosGeo(f form.PhotoSearchGeo) (results GeoResults, err error) {
s = s.Where(AnyInt("photos.photo_day", f.Day, txt.Or, entity.UnknownDay, txt.DayMax))
}
// Filter by main color?
if f.Color != "" {
s = s.Where("files.file_main_color IN (?)", strings.Split(strings.ToLower(f.Color), txt.Or))
}
// Find favorites only?
if f.Favorite {
s = s.Where("photos.photo_favorite = 1")
}
// Find scans only?
if f.Scan {
s = s.Where("photos.photo_scan = 1")
}
// Find panoramas only?
if f.Panorama {
s = s.Where("photos.photo_panorama = 1")
}
// Filter by location country?
if f.Country != "" {
s = s.Where("photos.photo_country IN (?)", strings.Split(strings.ToLower(f.Country), txt.Or))
}
// Filter by media type.
// Filter by media type?
if f.Type != "" {
s = s.Where("photos.photo_type IN (?)", strings.Split(strings.ToLower(f.Type), txt.Or))
}
if f.Video {
} else if f.Video {
s = s.Where("photos.photo_type = 'video'")
} else if f.Photo {
s = s.Where("photos.photo_type IN ('image','raw','live')")
} else if f.Raw {
s = s.Where("photos.photo_type = 'raw'")
} else if f.Live {
s = s.Where("photos.photo_type = 'live'")
}
// Filter by storage path?
if f.Path != "" {
p := f.Path
@ -237,7 +263,7 @@ func PhotosGeo(f form.PhotoSearchGeo) (results GeoResults, err error) {
}
}
// Filter by primary file name without path and extension.
// Filter by primary file name without path and extension?
if f.Name != "" {
where, names := OrLike("photos.photo_name", f.Name)
@ -249,13 +275,13 @@ func PhotosGeo(f form.PhotoSearchGeo) (results GeoResults, err error) {
s = s.Where(where, names...)
}
// Filter by photo title.
// Filter by photo title?
if f.Title != "" {
where, values := OrLike("photos.photo_title", f.Title)
s = s.Where(where, values...)
}
// Filter by status.
// Filter by status?
if f.Archived {
s = s.Where("photos.photo_quality > -1")
s = s.Where("photos.deleted_at IS NOT NULL")
@ -275,10 +301,6 @@ func PhotosGeo(f form.PhotoSearchGeo) (results GeoResults, err error) {
}
}
if f.Favorite {
s = s.Where("photos.photo_favorite = 1")
}
if f.S2 != "" {
s2Min, s2Max := s2.PrefixedRange(f.S2, 7)
s = s.Where("photos.cell_id BETWEEN ? AND ?", s2Min, s2Max)

10
pkg/txt/en.go Normal file
View file

@ -0,0 +1,10 @@
package txt
const (
EnOr = "or"
EnAnd = "and"
EnWith = "with"
EnIn = "in"
EnAt = "at"
EnNew = "new"
)

View file

@ -5,27 +5,34 @@ import (
)
const (
Or = "|"
And = "&"
Plus = " + "
OrEn = " or "
AndEn = " and "
WithEn = " with "
InEn = " in "
AtEn = " at "
Space = " "
Empty = ""
Empty = ""
Space = " "
Or = "|"
And = "&"
Plus = "+"
SpacedPlus = Space + Plus + Space
)
// Spaced returns the string padded with a space left and right.
func Spaced(s string) string {
return Space + s + Space
}
// StripOr removes or operators from a query.
func StripOr(s string) string {
s = strings.ReplaceAll(s, Or, Space)
return s
}
// NormalizeQuery replaces search operator with default symbols.
func NormalizeQuery(s string) string {
s = strings.ToLower(Clip(s, ClipQuery))
s = strings.ReplaceAll(s, OrEn, Or)
s = strings.ReplaceAll(s, AndEn, And)
s = strings.ReplaceAll(s, WithEn, And)
s = strings.ReplaceAll(s, InEn, And)
s = strings.ReplaceAll(s, AtEn, And)
s = strings.ReplaceAll(s, Plus, And)
s = strings.ReplaceAll(s, Spaced(EnOr), Or)
s = strings.ReplaceAll(s, Spaced(EnAnd), And)
s = strings.ReplaceAll(s, Spaced(EnWith), And)
s = strings.ReplaceAll(s, Spaced(EnIn), And)
s = strings.ReplaceAll(s, Spaced(EnAt), And)
s = strings.ReplaceAll(s, SpacedPlus, And)
s = strings.ReplaceAll(s, "%", "*")
return strings.Trim(s, "+&|_-=!@$%^(){}\\<>,.;: ")
}

View file

@ -6,6 +6,36 @@ import (
"github.com/stretchr/testify/assert"
)
func TestSpaced(t *testing.T) {
t.Run("Empty", func(t *testing.T) {
assert.Equal(t, " ", Spaced(""))
})
t.Run("Space", func(t *testing.T) {
assert.Equal(t, " ", Spaced(" "))
})
t.Run("Chinese", func(t *testing.T) {
assert.Equal(t, " 李 ", Spaced("李"))
})
t.Run("And", func(t *testing.T) {
assert.Equal(t, " and ", Spaced("and"))
})
}
func TestStripOr(t *testing.T) {
t.Run("Empty", func(t *testing.T) {
assert.Equal(t, "", StripOr(""))
})
t.Run("EnOr", func(t *testing.T) {
assert.Equal(t, "or", StripOr("or"))
})
t.Run("SpacedEnOr", func(t *testing.T) {
assert.Equal(t, "李 or Foo", StripOr("李 or Foo"))
})
t.Run("Or", func(t *testing.T) {
assert.Equal(t, "李 Foo", StripOr("李 | Foo"))
})
}
func TestNormalizeQuery(t *testing.T) {
t.Run("Replace", func(t *testing.T) {
q := NormalizeQuery("table spoon & usa | img% json OR BILL!")

View file

@ -45,5 +45,5 @@ func New(s string) bool {
s = strings.ToLower(strings.TrimSpace(s))
return s == "new"
return s == EnNew
}

View file

@ -130,6 +130,12 @@ func TestNew(t *testing.T) {
t.Run("Empty", func(t *testing.T) {
assert.Equal(t, false, New(""))
})
t.Run("EnNew", func(t *testing.T) {
assert.Equal(t, true, New(EnNew))
})
t.Run("Spaces", func(t *testing.T) {
assert.Equal(t, true, New(" new "))
})
t.Run("Uppercase", func(t *testing.T) {
assert.Equal(t, true, New("NEW"))
})