From 929da08ea2c4d365068dbcd398b17ddf98fb550f Mon Sep 17 00:00:00 2001 From: viktorstrate Date: Sun, 26 Sep 2021 13:10:37 +0200 Subject: [PATCH] Add UI for album downloads --- api/graphql/models/media.go | 2 +- api/routes/authenticate_routes.go | 15 ++- api/routes/downloads.go | 2 +- ui/src/Pages/SharePage/SharePage.test.js | 2 +- ui/src/apolloClient.ts | 8 +- ui/src/components/sidebar/AlbumCovers.tsx | 2 +- ui/src/components/sidebar/AlbumSidebar.tsx | 4 + ui/src/components/sidebar/MediaSidebar.tsx | 4 +- .../sidebar/SidebarDownloadAlbum.tsx | 85 ++++++++++++ ...rDownload.tsx => SidebarDownloadMedia.tsx} | 121 ++++++++++------- .../extractedTranslations/da/translation.json | 45 +++++-- .../da/translation_old.json | 12 +- .../extractedTranslations/de/translation.json | 93 +++++++------ .../de/translation_old.json | 12 +- .../extractedTranslations/en/translation.json | 19 ++- .../en/translation_old.json | 3 +- .../extractedTranslations/es/translation.json | 101 ++++++++------ .../es/translation_old.json | 12 +- .../extractedTranslations/fr/translation.json | 29 ++++- .../fr/translation_old.json | 12 +- .../extractedTranslations/it/translation.json | 63 +++++---- .../it/translation_old.json | 12 +- .../extractedTranslations/pl/translation.json | 123 ++++++++++-------- .../pl/translation_old.json | 12 +- .../extractedTranslations/ru/translation.json | 85 +++++++----- .../ru/translation_old.json | 12 +- .../extractedTranslations/sv/translation.json | 103 +++++++++------ .../sv/translation_old.json | 12 +- ui/src/localization.ts | 1 + 29 files changed, 678 insertions(+), 328 deletions(-) create mode 100644 ui/src/components/sidebar/SidebarDownloadAlbum.tsx rename ui/src/components/sidebar/{SidebarDownload.tsx => SidebarDownloadMedia.tsx} (77%) diff --git a/api/graphql/models/media.go b/api/graphql/models/media.go index 44e06f92..6ed44859 100644 --- a/api/graphql/models/media.go +++ b/api/graphql/models/media.go @@ -102,7 +102,7 @@ func (p *MediaURL) CachedPath() (string, error) { return "", errors.New("mediaURL.Media is nil") } - if p.Purpose == PhotoThumbnail || p.Purpose == PhotoHighRes || p.Purpose == VideoThumbnail { + if p.Purpose == PhotoThumbnail || p.Purpose == PhotoHighRes || p.Purpose == VideoThumbnail || p.Purpose == VideoWeb { cachedPath = path.Join(utils.MediaCachePath(), strconv.Itoa(int(p.Media.AlbumID)), strconv.Itoa(int(p.MediaID)), p.MediaName) } else if p.Purpose == MediaOriginal { cachedPath = p.Media.Path diff --git a/api/routes/authenticate_routes.go b/api/routes/authenticate_routes.go index 9d9281d8..50a06acd 100644 --- a/api/routes/authenticate_routes.go +++ b/api/routes/authenticate_routes.go @@ -6,6 +6,7 @@ import ( "github.com/photoview/photoview/api/graphql/auth" "github.com/photoview/photoview/api/graphql/models" + "github.com/pkg/errors" "golang.org/x/crypto/bcrypt" "gorm.io/gorm" ) @@ -63,7 +64,7 @@ func shareTokenFromRequest(db *gorm.DB, r *http.Request, mediaID *int, albumID * // Check if photo is authorized with a share token token := r.URL.Query().Get("token") if token == "" { - return false, "unauthorized", http.StatusForbidden, nil + return false, "unauthorized", http.StatusForbidden, errors.New("share token not provided") } var shareToken models.ShareToken @@ -76,14 +77,14 @@ func shareTokenFromRequest(db *gorm.DB, r *http.Request, mediaID *int, albumID * if shareToken.Password != nil { tokenPasswordCookie, err := r.Cookie(fmt.Sprintf("share-token-pw-%s", shareToken.Value)) if err != nil { - return false, "unauthorized", http.StatusForbidden, nil + return false, "unauthorized", http.StatusForbidden, errors.Wrap(err, "get share token password cookie") } // tokenPassword := r.Header.Get("TokenPassword") tokenPassword := tokenPasswordCookie.Value if err := bcrypt.CompareHashAndPassword([]byte(*shareToken.Password), []byte(tokenPassword)); err != nil { if err == bcrypt.ErrMismatchedHashAndPassword { - return false, "unauthorized", http.StatusForbidden, nil + return false, "unauthorized", http.StatusForbidden, errors.New("incorrect password for share token") } else { return false, "internal server error", http.StatusInternalServerError, err } @@ -91,11 +92,11 @@ func shareTokenFromRequest(db *gorm.DB, r *http.Request, mediaID *int, albumID * } if shareToken.AlbumID != nil && albumID == nil { - return false, "unauthorized", http.StatusForbidden, nil + return false, "unauthorized", http.StatusForbidden, errors.New("share token is of type album, but no albumID was provided to function") } if shareToken.MediaID != nil && mediaID == nil { - return false, "unauthorized", http.StatusForbidden, nil + return false, "unauthorized", http.StatusForbidden, errors.New("share token is of type media, but no mediaID was provided to function") } if shareToken.AlbumID != nil && *albumID != *shareToken.AlbumID { @@ -116,12 +117,12 @@ func shareTokenFromRequest(db *gorm.DB, r *http.Request, mediaID *int, albumID * } if count == 0 { - return false, "unauthorized", http.StatusForbidden, nil + return false, "unauthorized", http.StatusForbidden, errors.New("no child albums found for share token") } } if shareToken.MediaID != nil && *mediaID != *shareToken.MediaID { - return false, "unauthorized", http.StatusForbidden, nil + return false, "unauthorized", http.StatusForbidden, errors.New("media share token does not match mediaID") } return true, "", 0, nil diff --git a/api/routes/downloads.go b/api/routes/downloads.go index 13b7b39a..b65e3cde 100644 --- a/api/routes/downloads.go +++ b/api/routes/downloads.go @@ -55,7 +55,7 @@ func RegisterDownloadRoutes(db *gorm.DB, router *mux.Router) { zipWriter := zip.NewWriter(w) for _, media := range mediaURLs { - zipFile, err := zipWriter.Create(media.MediaName) + zipFile, err := zipWriter.Create(fmt.Sprintf("%s/%s", album.Title, media.MediaName)) if err != nil { log.Printf("ERROR: Failed to create a file in zip, when downloading album (%d): %v\n", album.ID, err) w.WriteHeader(http.StatusInternalServerError) diff --git a/ui/src/Pages/SharePage/SharePage.test.js b/ui/src/Pages/SharePage/SharePage.test.js index baa2f188..e80bad95 100644 --- a/ui/src/Pages/SharePage/SharePage.test.js +++ b/ui/src/Pages/SharePage/SharePage.test.js @@ -13,7 +13,7 @@ import SharePage, { VALIDATE_TOKEN_PASSWORD_QUERY, } from './SharePage' -import { SIDEBAR_DOWNLOAD_QUERY } from '../../components/sidebar/SidebarDownload' +import { SIDEBAR_DOWNLOAD_QUERY } from '../../components/sidebar/SidebarDownloadMedia' import { SHARE_ALBUM_QUERY } from './AlbumSharePage' jest.mock('../../hooks/useScrollPagination') diff --git a/ui/src/apolloClient.ts b/ui/src/apolloClient.ts index 1b200bd5..dfc4b1e5 100644 --- a/ui/src/apolloClient.ts +++ b/ui/src/apolloClient.ts @@ -17,9 +17,11 @@ import { MessageState } from './components/messages/Messages' import { Message } from './components/messages/SubscriptionsHook' import { NotificationType } from './__generated__/globalTypes' -export const GRAPHQL_ENDPOINT = process.env.REACT_APP_API_ENDPOINT - ? urlJoin(process.env.REACT_APP_API_ENDPOINT as string, '/graphql') - : urlJoin(location.origin, '/api/graphql') +export const API_ENDPOINT = process.env.REACT_APP_API_ENDPOINT + ? (process.env.REACT_APP_API_ENDPOINT as string) + : urlJoin(location.origin, '/api') + +export const GRAPHQL_ENDPOINT = urlJoin(API_ENDPOINT, '/graphql') const httpLink = new HttpLink({ uri: GRAPHQL_ENDPOINT, diff --git a/ui/src/components/sidebar/AlbumCovers.tsx b/ui/src/components/sidebar/AlbumCovers.tsx index 5db328fd..d00cca71 100644 --- a/ui/src/components/sidebar/AlbumCovers.tsx +++ b/ui/src/components/sidebar/AlbumCovers.tsx @@ -65,7 +65,7 @@ export const SidebarPhotoCover = ({ cover_id }: SidebarPhotoCoverProps) => { return ( - {t('sidebar.album.cover_photo', 'Album cover')} + {t('sidebar.album.album_cover', 'Album cover')}
diff --git a/ui/src/components/sidebar/AlbumSidebar.tsx b/ui/src/components/sidebar/AlbumSidebar.tsx index 17b74af5..17074679 100644 --- a/ui/src/components/sidebar/AlbumSidebar.tsx +++ b/ui/src/components/sidebar/AlbumSidebar.tsx @@ -8,6 +8,7 @@ import { getAlbumSidebarVariables, } from './__generated__/getAlbumSidebar' import { SidebarAlbumCover } from './AlbumCovers' +import SidebarAlbumDownload from './SidebarDownloadAlbum' const albumQuery = gql` query getAlbumSidebar($id: ID!) { @@ -50,6 +51,9 @@ const AlbumSidebar = ({ albumId }: AlbumSidebarProps) => {
+
+ +
) } diff --git a/ui/src/components/sidebar/MediaSidebar.tsx b/ui/src/components/sidebar/MediaSidebar.tsx index a4ad814c..9f0b8a3a 100644 --- a/ui/src/components/sidebar/MediaSidebar.tsx +++ b/ui/src/components/sidebar/MediaSidebar.tsx @@ -8,7 +8,7 @@ import { ProtectedVideoProps_Media, } from '../photoGallery/ProtectedMedia' import { SidebarPhotoShare } from './Sharing' -import SidebarDownload from './SidebarDownload' +import SidebarMediaDownload from './SidebarDownloadMedia' import SidebarItem from './SidebarItem' import { SidebarFacesOverlay } from '../facesOverlay/FacesOverlay' import { isNil } from '../../helpers/utils' @@ -364,7 +364,7 @@ const SidebarContent = ({ media, hidePreview }: SidebarContentProps) => { )} - +
diff --git a/ui/src/components/sidebar/SidebarDownloadAlbum.tsx b/ui/src/components/sidebar/SidebarDownloadAlbum.tsx new file mode 100644 index 00000000..ab4c5384 --- /dev/null +++ b/ui/src/components/sidebar/SidebarDownloadAlbum.tsx @@ -0,0 +1,85 @@ +import React from 'react' +import { useTranslation } from 'react-i18next' +import { API_ENDPOINT } from '../../apolloClient' +import { SidebarSection, SidebarSectionTitle } from './SidebarComponents' + +type SidebarAlbumDownladProps = { + albumID: string +} + +const SidebarAlbumDownload = ({ albumID }: SidebarAlbumDownladProps) => { + const { t } = useTranslation() + + const downloads = [ + { + title: t('sidebar.album.download.thumbnails.title', 'Thumbnails'), + description: t( + 'sidebar.album.download.thumbnails.description', + 'Low resolution images, no videos' + ), + purpose: 'thumbnail,video-thumbnail', + }, + { + title: t( + 'sidebar.album.download.high-resolutions.title', + 'High resolutions' + ), + description: t( + 'sidebar.album.download.high-resolutions.description', + 'High resolution jpegs of RAW images' + ), + purpose: 'high-res', + }, + { + title: t('sidebar.album.download.originals.title', 'Originals'), + description: t( + 'sidebar.album.download.originals.description', + 'The original images and videos' + ), + purpose: 'original', + }, + { + title: t('sidebar.album.download.web-videos.title', 'Converted videos'), + description: t( + 'sidebar.album.download.web-videos.description', + 'Videos that have been optimized for web' + ), + purpose: 'video-web', + }, + ] + + const downloadRows = downloads.map(x => ( +
+ (location.href = `${API_ENDPOINT}/download/album/${albumID}/${x.purpose}`) + } + tabIndex={0} + > + + + + )) + + return ( + + + {t('sidebar.download.title', 'Download')} + + +
{`${x.title}`}{`${x.description}`}
+ + + + + + {downloadRows} +
+ {t('sidebar.download.table_columns.name', 'Name')} +
+ + ) +} + +export default SidebarAlbumDownload diff --git a/ui/src/components/sidebar/SidebarDownload.tsx b/ui/src/components/sidebar/SidebarDownloadMedia.tsx similarity index 77% rename from ui/src/components/sidebar/SidebarDownload.tsx rename to ui/src/components/sidebar/SidebarDownloadMedia.tsx index f9608221..261027b6 100644 --- a/ui/src/components/sidebar/SidebarDownload.tsx +++ b/ui/src/components/sidebar/SidebarDownloadMedia.tsx @@ -1,5 +1,4 @@ import React from 'react' -import PropTypes from 'prop-types' import { MessageState } from '../messages/Messages' import { useLazyQuery, gql } from '@apollo/client' import { authToken } from '../../helpers/authentication' @@ -187,11 +186,72 @@ const downloadBlob = async (blob: Blob, filename: string) => { window.URL.revokeObjectURL(objectUrl) } -type SidebarDownladProps = { +type SidebarDownloadTableRow = { + title: string + url: string + width: number + height: number + fileSize: number +} + +type SidebarDownloadTableProps = { + rows: SidebarDownloadTableRow[] +} + +const SidebarDownloadTable = ({ rows }: SidebarDownloadTableProps) => { + const { t } = useTranslation() + + const extractExtension = (url: string) => { + const urlMatch = url.split(/[#?]/) + if (urlMatch == null) return + + return urlMatch[0].split('.').pop()?.trim().toLowerCase() + } + + const download = downloadMedia(t) + const bytes = formatBytes(t) + const downloadRows = rows.map(x => ( + download(x.url)} + tabIndex={0} + > + {`${x.title}`} + {`${x.width} x ${x.height}`} + {`${bytes(x.fileSize)}`} + {extractExtension(x.url)} + + )) + + return ( + + + + + + + + + + {downloadRows} +
+ {t('sidebar.download.table_columns.name', 'Name')} + + {t('sidebar.download.table_columns.dimensions', 'Dimensions')} + + {t('sidebar.download.table_columns.file_size', 'Size')} + + {t('sidebar.download.table_columns.file_type', 'Type')} +
+ ) +} + +type SidebarMediaDownladProps = { media: MediaSidebarMedia } -const SidebarDownload = ({ media }: SidebarDownladProps) => { +const SidebarMediaDownload = ({ media }: SidebarMediaDownladProps) => { const { t } = useTranslation() if (!media || !media.id) return null @@ -214,28 +274,13 @@ const SidebarDownload = ({ media }: SidebarDownladProps) => { } } - const extractExtension = (url: string) => { - const urlMatch = url.split(/[#?]/) - if (urlMatch == null) return - - return urlMatch[0].split('.').pop()?.trim().toLowerCase() - } - - const download = downloadMedia(t) - const bytes = formatBytes(t) - const downloadRows = downloads.map(x => ( - download(x.mediaUrl.url)} - tabIndex={0} - > - {`${x.title}`} - {`${x.mediaUrl.width} x ${x.mediaUrl.height}`} - {`${bytes(x.mediaUrl.fileSize)}`} - {extractExtension(x.mediaUrl.url)} - - )) + const downloadRows = downloads.map(x => ({ + title: x.title, + url: x.mediaUrl.url, + width: x.mediaUrl.width, + height: x.mediaUrl.height, + fileSize: x.mediaUrl.fileSize, + })) return ( @@ -243,31 +288,9 @@ const SidebarDownload = ({ media }: SidebarDownladProps) => { {t('sidebar.download.title', 'Download')} - - - - - - - - - - {downloadRows} -
- {t('sidebar.download.table_columns.name', 'Name')} - - {t('sidebar.download.table_columns.dimensions', 'Dimensions')} - - {t('sidebar.download.table_columns.file_size', 'Size')} - - {t('sidebar.download.table_columns.file_type', 'Type')} -
+
) } -SidebarDownload.propTypes = { - photo: PropTypes.object, -} - -export default SidebarDownload +export default SidebarMediaDownload diff --git a/ui/src/extractedTranslations/da/translation.json b/ui/src/extractedTranslations/da/translation.json index 68349bec..fe49443d 100644 --- a/ui/src/extractedTranslations/da/translation.json +++ b/ui/src/extractedTranslations/da/translation.json @@ -62,10 +62,10 @@ }, "people_page": { "action_label": { - "change_label": null, - "detach_face": null, - "merge_face": null, - "move_faces": null + "change_label": "Ændre navn", + "detach_face": "Løsriv billeder", + "merge_face": "Sammenflet personer", + "move_faces": "Flyt ansigter" }, "face_group": { "label_placeholder": "Navn", @@ -215,10 +215,27 @@ }, "sidebar": { "album": { - "album_cover": null, - "cover_photo": null, - "reset_cover": null, - "set_cover": null, + "album_cover": "Album coverbillede", + "download": { + "high-resolutions": { + "description": "Høj opløsning JPEGs af RAW-billeder", + "title": "Høj opløsning" + }, + "originals": { + "description": "De originale billeder og video", + "title": "Originaler" + }, + "thumbnails": { + "description": "Billeder i lav opløsning, ingen videoer", + "title": "Thumbnails" + }, + "web-videos": { + "description": "Videoer som er blevet optimeret til web", + "title": "Konverterede videoer" + } + }, + "reset_cover": "Nulstil coverbillede", + "set_cover": "Set som album coverbillede", "title_placeholder": "Albumtitel" }, "download": { @@ -226,13 +243,13 @@ "byte": "{{count}} Byte", "byte_plural": "{{count}} Bytes", "giga_byte": "{{count}} GB", - "giga_byte_plural": null, + "giga_byte_plural": "", "kilo_byte": "{{count}} KB", - "kilo_byte_plural": null, + "kilo_byte_plural": "", "mega_byte": "{{count}} MB", - "mega_byte_plural": null, + "mega_byte_plural": "", "tera_byte": "{{count}} TB", - "tera_byte_plural": null + "tera_byte_plural": "" }, "table_columns": { "dimensions": "Dimension", @@ -301,8 +318,8 @@ }, "timeline_filter": { "date": { - "dropdown_all": null, - "label": null + "dropdown_all": "Fra i dag", + "label": "Dato" } }, "title": { diff --git a/ui/src/extractedTranslations/da/translation_old.json b/ui/src/extractedTranslations/da/translation_old.json index 9bba571f..a888751e 100644 --- a/ui/src/extractedTranslations/da/translation_old.json +++ b/ui/src/extractedTranslations/da/translation_old.json @@ -55,7 +55,11 @@ }, "sidebar": { "album": { - "title": "Indstillinger for album" + "title": "Indstillinger for album", + "album_cover": null, + "cover_photo": "", + "reset_cover": null, + "set_cover": null }, "sharing": { "table_header": "Offentlige delinger" @@ -68,5 +72,11 @@ "tera_byte_plural": null } } + }, + "timeline_filter": { + "date": { + "dropdown_all": null, + "label": null + } } } diff --git a/ui/src/extractedTranslations/de/translation.json b/ui/src/extractedTranslations/de/translation.json index 257ad17d..ee94dd12 100644 --- a/ui/src/extractedTranslations/de/translation.json +++ b/ui/src/extractedTranslations/de/translation.json @@ -1,7 +1,7 @@ { "album_filter": { "only_favorites": "Nur Favoriten anzeigen", - "sort": null, + "sort": "", "sorting_options": { "date_imported": "Importdatum", "date_shot": "Aufnahmedatum", @@ -35,7 +35,7 @@ "placeholder": "Suche", "result_type": { "albums": "Alben", - "media": null + "media": "" } } }, @@ -62,54 +62,54 @@ }, "people_page": { "action_label": { - "change_label": null, - "detach_face": null, - "merge_face": null, - "move_faces": null + "change_label": "", + "detach_face": "", + "merge_face": "", + "move_faces": "" }, "face_group": { "label_placeholder": "Zuordnung", "unlabeled": "Nicht zugeordnet", - "unlabeled_person": null + "unlabeled_person": "" }, "modal": { "action": { - "merge": null + "merge": "" }, "detach_image_faces": { "action": { - "detach": null, - "select_images": null + "detach": "", + "select_images": "" }, - "description": null, - "title": null + "description": "", + "title": "" }, "merge_face_groups": { - "description": null, + "description": "", "destination_table": { - "title": null + "title": "" }, - "title": null + "title": "" }, "move_image_faces": { - "description": null, + "description": "", "destination_face_group_table": { - "move_action": null, - "title": null + "move_action": "", + "title": "" }, "image_select_table": { - "next_action": null, - "title": null + "next_action": "", + "title": "" }, - "title": null + "title": "" } }, "recognize_unlabeled_faces_button": "Nicht zugeordnete Gesichter erkennen", "tableselect_face_group": { - "search_faces_placeholder": null + "search_faces_placeholder": "" }, "tableselect_image_faces": { - "search_images_placeholder": null + "search_images_placeholder": "" } }, "photos_page": { @@ -178,7 +178,7 @@ "table": { "column_names": { "action": "Aktion", - "capabilities": null, + "capabilities": "", "photo_path": "Pfad der Medien", "username": "Benutzername" }, @@ -206,7 +206,7 @@ }, "protected_share": { "description": "Diese Freigabe ist passwortgeschützt.", - "password_required_error": null, + "password_required_error": "", "title": "Passwortgeschützte Freigabe" }, "share_not_found": "Freigabe nicht gefunden", @@ -215,24 +215,41 @@ }, "sidebar": { "album": { - "album_cover": null, - "cover_photo": null, - "reset_cover": null, - "set_cover": null, - "title_placeholder": null + "album_cover": "", + "download": { + "high-resolutions": { + "description": "", + "title": "" + }, + "originals": { + "description": "", + "title": "" + }, + "thumbnails": { + "description": "", + "title": "" + }, + "web-videos": { + "description": "", + "title": "" + } + }, + "reset_cover": "", + "set_cover": "", + "title_placeholder": "" }, "download": { "filesize": { "byte": "{{count}} Byte", "byte_plural": "{{count}} Bytes", "giga_byte": "{{count}} GB", - "giga_byte_plural": null, + "giga_byte_plural": "", "kilo_byte": "{{count}} KB", - "kilo_byte_plural": null, + "kilo_byte_plural": "", "mega_byte": "{{count}} MB", - "mega_byte_plural": null, + "mega_byte_plural": "", "tera_byte": "{{count}} TB", - "tera_byte_plural": null + "tera_byte_plural": "" }, "table_columns": { "dimensions": "Dimension", @@ -285,8 +302,8 @@ "sharing": { "add_share": "Freigabe hinzufügen", "copy_link": "Link kopieren", - "delete": null, - "more": null, + "delete": "", + "more": "", "no_shares_found": "Keine Freigaben gefunden", "public_link": "Öffentlicher Link", "title": "Freigabeoptionen" @@ -301,8 +318,8 @@ }, "timeline_filter": { "date": { - "dropdown_all": null, - "label": null + "dropdown_all": "", + "label": "" } }, "title": { diff --git a/ui/src/extractedTranslations/de/translation_old.json b/ui/src/extractedTranslations/de/translation_old.json index 0c464715..aa432414 100644 --- a/ui/src/extractedTranslations/de/translation_old.json +++ b/ui/src/extractedTranslations/de/translation_old.json @@ -97,7 +97,11 @@ "sidebar": { "album": { "title": "Album Optionen", - "title_placeholder": null + "title_placeholder": null, + "album_cover": null, + "cover_photo": "", + "reset_cover": null, + "set_cover": null }, "sharing": { "table_header": "Öffentliche Freigabe", @@ -120,5 +124,11 @@ "protected_share": { "password_required_error": null } + }, + "timeline_filter": { + "date": { + "dropdown_all": null, + "label": null + } } } diff --git a/ui/src/extractedTranslations/en/translation.json b/ui/src/extractedTranslations/en/translation.json index 26bb3161..c64f063d 100644 --- a/ui/src/extractedTranslations/en/translation.json +++ b/ui/src/extractedTranslations/en/translation.json @@ -216,7 +216,24 @@ "sidebar": { "album": { "album_cover": "Album cover", - "cover_photo": "Album cover", + "download": { + "high-resolutions": { + "description": "High resolution jpegs of RAW images", + "title": "High resolutions" + }, + "originals": { + "description": "The original images and videos", + "title": "Originals" + }, + "thumbnails": { + "description": "Low resolution images, no videos", + "title": "Thumbnails" + }, + "web-videos": { + "description": "Videos that have been optimized for web", + "title": "Converted videos" + } + }, "reset_cover": "Reset cover photo", "set_cover": "Set as album cover photo", "title_placeholder": "Album title" diff --git a/ui/src/extractedTranslations/en/translation_old.json b/ui/src/extractedTranslations/en/translation_old.json index 0f64f882..fecc4be5 100644 --- a/ui/src/extractedTranslations/en/translation_old.json +++ b/ui/src/extractedTranslations/en/translation_old.json @@ -49,7 +49,8 @@ }, "sidebar": { "album": { - "title": "Album options" + "title": "Album options", + "cover_photo": "Album cover" }, "sharing": { "table_header": "Public shares" diff --git a/ui/src/extractedTranslations/es/translation.json b/ui/src/extractedTranslations/es/translation.json index 80b52368..7d1d0b7b 100644 --- a/ui/src/extractedTranslations/es/translation.json +++ b/ui/src/extractedTranslations/es/translation.json @@ -1,7 +1,7 @@ { "album_filter": { "only_favorites": "Solo mostrar favoritos", - "sort": null, + "sort": "", "sorting_options": { "date_imported": "Fecha de importado", "date_shot": "Fecha de la foto", @@ -35,7 +35,7 @@ "placeholder": "Buscar", "result_type": { "albums": "Álbumes", - "media": null + "media": "" } } }, @@ -62,54 +62,54 @@ }, "people_page": { "action_label": { - "change_label": null, - "detach_face": null, - "merge_face": null, - "move_faces": null + "change_label": "", + "detach_face": "", + "merge_face": "", + "move_faces": "" }, "face_group": { "label_placeholder": "Etiqueta", "unlabeled": "Sin etiquetar", - "unlabeled_person": null + "unlabeled_person": "" }, "modal": { "action": { - "merge": null + "merge": "" }, "detach_image_faces": { "action": { - "detach": null, - "select_images": null + "detach": "", + "select_images": "" }, - "description": null, - "title": null + "description": "", + "title": "" }, "merge_face_groups": { - "description": null, + "description": "", "destination_table": { - "title": null + "title": "" }, - "title": null + "title": "" }, "move_image_faces": { - "description": null, + "description": "", "destination_face_group_table": { - "move_action": null, - "title": null + "move_action": "", + "title": "" }, "image_select_table": { - "next_action": null, - "title": null + "next_action": "", + "title": "" }, - "title": null + "title": "" } }, "recognize_unlabeled_faces_button": "Reconocer caras sin etiquetar", "tableselect_face_group": { - "search_faces_placeholder": null + "search_faces_placeholder": "" }, "tableselect_image_faces": { - "search_images_placeholder": null + "search_images_placeholder": "" } }, "photos_page": { @@ -178,7 +178,7 @@ "table": { "column_names": { "action": "Acción", - "capabilities": null, + "capabilities": "", "photo_path": "Ruta de las fotos", "username": "Usuario" }, @@ -195,9 +195,9 @@ "title": "Usuarios" }, "version_info": { - "build_date_title": null, - "title": null, - "version_title": null + "build_date_title": "", + "title": "", + "version_title": "" } }, "share_page": { @@ -206,7 +206,7 @@ }, "protected_share": { "description": "Esta compartición está protegida por contraseña.", - "password_required_error": null, + "password_required_error": "", "title": "Compartición protegida" }, "share_not_found": "Compartición no encontrada", @@ -215,24 +215,41 @@ }, "sidebar": { "album": { - "album_cover": null, - "cover_photo": null, - "reset_cover": null, - "set_cover": null, - "title_placeholder": null + "album_cover": "", + "download": { + "high-resolutions": { + "description": "", + "title": "" + }, + "originals": { + "description": "", + "title": "" + }, + "thumbnails": { + "description": "", + "title": "" + }, + "web-videos": { + "description": "", + "title": "" + } + }, + "reset_cover": "", + "set_cover": "", + "title_placeholder": "" }, "download": { "filesize": { "byte": "{{count}} Byte", "byte_plural": "{{count}} Bytes", "giga_byte": "{{count}} GB", - "giga_byte_plural": null, + "giga_byte_plural": "", "kilo_byte": "{{count}} KB", - "kilo_byte_plural": null, + "kilo_byte_plural": "", "mega_byte": "{{count}} MB", - "mega_byte_plural": null, + "mega_byte_plural": "", "tera_byte": "{{count}} TB", - "tera_byte_plural": null + "tera_byte_plural": "" }, "table_columns": { "dimensions": "Dimensiones", @@ -285,8 +302,8 @@ "sharing": { "add_share": "Añadir compartido", "copy_link": "Copiar enlace", - "delete": null, - "more": null, + "delete": "", + "more": "", "no_shares_found": "No se encontraron compartidos", "public_link": "Enlace público", "title": "Opciones de compartir" @@ -301,13 +318,13 @@ }, "timeline_filter": { "date": { - "dropdown_all": null, - "label": null + "dropdown_all": "", + "label": "" } }, "title": { "loading_album": "Cargando álbum", - "login": null, + "login": "", "people": "Personas", "settings": "Opciones" } diff --git a/ui/src/extractedTranslations/es/translation_old.json b/ui/src/extractedTranslations/es/translation_old.json index d10e5797..94a8bb31 100644 --- a/ui/src/extractedTranslations/es/translation_old.json +++ b/ui/src/extractedTranslations/es/translation_old.json @@ -102,7 +102,11 @@ "sidebar": { "album": { "title": "opciones de álbum", - "title_placeholder": null + "title_placeholder": null, + "album_cover": null, + "cover_photo": "", + "reset_cover": null, + "set_cover": null }, "sharing": { "table_header": "Compartidos públicos", @@ -128,5 +132,11 @@ "protected_share": { "password_required_error": null } + }, + "timeline_filter": { + "date": { + "dropdown_all": null, + "label": null + } } } diff --git a/ui/src/extractedTranslations/fr/translation.json b/ui/src/extractedTranslations/fr/translation.json index e54a5a12..a7053572 100644 --- a/ui/src/extractedTranslations/fr/translation.json +++ b/ui/src/extractedTranslations/fr/translation.json @@ -215,10 +215,27 @@ }, "sidebar": { "album": { - "album_cover": null, - "cover_photo": null, - "reset_cover": null, - "set_cover": null, + "album_cover": "", + "download": { + "high-resolutions": { + "description": "", + "title": "" + }, + "originals": { + "description": "", + "title": "" + }, + "thumbnails": { + "description": "", + "title": "" + }, + "web-videos": { + "description": "", + "title": "" + } + }, + "reset_cover": "", + "set_cover": "", "title_placeholder": "Titre de l'Album" }, "download": { @@ -301,8 +318,8 @@ }, "timeline_filter": { "date": { - "dropdown_all": null, - "label": null + "dropdown_all": "", + "label": "" } }, "title": { diff --git a/ui/src/extractedTranslations/fr/translation_old.json b/ui/src/extractedTranslations/fr/translation_old.json index d2507b86..61e3c86d 100644 --- a/ui/src/extractedTranslations/fr/translation_old.json +++ b/ui/src/extractedTranslations/fr/translation_old.json @@ -87,7 +87,11 @@ }, "sidebar": { "album": { - "title": "Paramètres de l'album" + "title": "Paramètres de l'album", + "album_cover": null, + "cover_photo": "", + "reset_cover": null, + "set_cover": null }, "sharing": { "table_header": "Partages publics" @@ -95,5 +99,11 @@ }, "title": { "login": null + }, + "timeline_filter": { + "date": { + "dropdown_all": null, + "label": null + } } } diff --git a/ui/src/extractedTranslations/it/translation.json b/ui/src/extractedTranslations/it/translation.json index 84e269b9..b64f070f 100644 --- a/ui/src/extractedTranslations/it/translation.json +++ b/ui/src/extractedTranslations/it/translation.json @@ -1,7 +1,7 @@ { "album_filter": { "only_favorites": "Mostra solo i preferiti", - "sort": null, + "sort": "", "sorting_options": { "date_imported": "Data importazione", "date_shot": "Data scatto", @@ -35,7 +35,7 @@ "placeholder": "Cerca", "result_type": { "albums": "Album", - "media": null + "media": "" } } }, @@ -62,10 +62,10 @@ }, "people_page": { "action_label": { - "change_label": null, - "detach_face": null, - "merge_face": null, - "move_faces": null + "change_label": "", + "detach_face": "", + "merge_face": "", + "move_faces": "" }, "face_group": { "label_placeholder": "Etichetta", @@ -106,10 +106,10 @@ }, "recognize_unlabeled_faces_button": "Identifica facce senza etichetta", "tableselect_face_group": { - "search_faces_placeholder": null + "search_faces_placeholder": "" }, "tableselect_image_faces": { - "search_images_placeholder": null + "search_images_placeholder": "" } }, "photos_page": { @@ -178,7 +178,7 @@ "table": { "column_names": { "action": "Azioni", - "capabilities": null, + "capabilities": "", "photo_path": "Percorso foto", "username": "Username" }, @@ -206,7 +206,7 @@ }, "protected_share": { "description": "Questa condivisione è protetta da una password.", - "password_required_error": null, + "password_required_error": "", "title": "Condivisione protetta" }, "share_not_found": "Condivisone non trovata", @@ -215,24 +215,41 @@ }, "sidebar": { "album": { - "album_cover": null, - "cover_photo": null, - "reset_cover": null, - "set_cover": null, - "title_placeholder": null + "album_cover": "", + "download": { + "high-resolutions": { + "description": "", + "title": "" + }, + "originals": { + "description": "", + "title": "" + }, + "thumbnails": { + "description": "", + "title": "" + }, + "web-videos": { + "description": "", + "title": "" + } + }, + "reset_cover": "", + "set_cover": "", + "title_placeholder": "" }, "download": { "filesize": { "byte": "{{count}} Byte", "byte_plural": "{{count}} Bytes", "giga_byte": "{{count}} GB", - "giga_byte_plural": null, + "giga_byte_plural": "", "kilo_byte": "{{count}} KB", - "kilo_byte_plural": null, + "kilo_byte_plural": "", "mega_byte": "{{count}} MB", - "mega_byte_plural": null, + "mega_byte_plural": "", "tera_byte": "{{count}} TB", - "tera_byte_plural": null + "tera_byte_plural": "" }, "table_columns": { "dimensions": "Dimensioni", @@ -285,8 +302,8 @@ "sharing": { "add_share": "Aggiungi condivisione", "copy_link": "Copia il link", - "delete": null, - "more": null, + "delete": "", + "more": "", "no_shares_found": "Nessuna condivisione trovata", "public_link": "Link pubblico", "title": "Opzioni di condivisione" @@ -301,8 +318,8 @@ }, "timeline_filter": { "date": { - "dropdown_all": null, - "label": null + "dropdown_all": "", + "label": "" } }, "title": { diff --git a/ui/src/extractedTranslations/it/translation_old.json b/ui/src/extractedTranslations/it/translation_old.json index 73066123..b09cdcc0 100644 --- a/ui/src/extractedTranslations/it/translation_old.json +++ b/ui/src/extractedTranslations/it/translation_old.json @@ -64,7 +64,11 @@ "sidebar": { "album": { "title": "Opzioni Album", - "title_placeholder": null + "title_placeholder": null, + "album_cover": null, + "cover_photo": "", + "reset_cover": null, + "set_cover": null }, "sharing": { "table_header": "Condivisioni pubbliche", @@ -87,5 +91,11 @@ "protected_share": { "password_required_error": null } + }, + "timeline_filter": { + "date": { + "dropdown_all": null, + "label": null + } } } diff --git a/ui/src/extractedTranslations/pl/translation.json b/ui/src/extractedTranslations/pl/translation.json index bef1c60d..962ab269 100644 --- a/ui/src/extractedTranslations/pl/translation.json +++ b/ui/src/extractedTranslations/pl/translation.json @@ -1,7 +1,7 @@ { "album_filter": { "only_favorites": "Pokaż tylko ulubione", - "sort": null, + "sort": "", "sorting_options": { "date_imported": "Data zaimportowania", "date_shot": "Data wykonania", @@ -35,7 +35,7 @@ "placeholder": "Szukaj", "result_type": { "albums": "Albumy", - "media": null + "media": "" } } }, @@ -62,54 +62,54 @@ }, "people_page": { "action_label": { - "change_label": null, - "detach_face": null, - "merge_face": null, - "move_faces": null + "change_label": "", + "detach_face": "", + "merge_face": "", + "move_faces": "" }, "face_group": { "label_placeholder": "Etykieta", "unlabeled": "Nieoznakowany", - "unlabeled_person": null + "unlabeled_person": "" }, "modal": { "action": { - "merge": null + "merge": "" }, "detach_image_faces": { "action": { - "detach": null, - "select_images": null + "detach": "", + "select_images": "" }, - "description": null, - "title": null + "description": "", + "title": "" }, "merge_face_groups": { - "description": null, + "description": "", "destination_table": { - "title": null + "title": "" }, - "title": null + "title": "" }, "move_image_faces": { - "description": null, + "description": "", "destination_face_group_table": { - "move_action": null, - "title": null + "move_action": "", + "title": "" }, "image_select_table": { - "next_action": null, - "title": null + "next_action": "", + "title": "" }, - "title": null + "title": "" } }, "recognize_unlabeled_faces_button": "Rozpoznaj nieoznakowane twarze", "tableselect_face_group": { - "search_faces_placeholder": null + "search_faces_placeholder": "" }, "tableselect_image_faces": { - "search_images_placeholder": null + "search_images_placeholder": "" } }, "photos_page": { @@ -178,7 +178,7 @@ "table": { "column_names": { "action": "Akcja", - "capabilities": null, + "capabilities": "", "photo_path": "Ścieżka zdjęć", "username": "Nazwa użytkownika" }, @@ -195,9 +195,9 @@ "title": "Użytkownicy" }, "version_info": { - "build_date_title": null, - "title": null, - "version_title": null + "build_date_title": "", + "title": "", + "version_title": "" } }, "share_page": { @@ -206,7 +206,7 @@ }, "protected_share": { "description": "Ten udział jest chroniony hasłem.", - "password_required_error": null, + "password_required_error": "", "title": "Udział chroniony" }, "share_not_found": "Nie znaleziono udziału", @@ -215,29 +215,46 @@ }, "sidebar": { "album": { - "album_cover": null, - "cover_photo": null, - "reset_cover": null, - "set_cover": null, - "title_placeholder": null + "album_cover": "", + "download": { + "high-resolutions": { + "description": "", + "title": "" + }, + "originals": { + "description": "", + "title": "" + }, + "thumbnails": { + "description": "", + "title": "" + }, + "web-videos": { + "description": "", + "title": "" + } + }, + "reset_cover": "", + "set_cover": "", + "title_placeholder": "" }, "download": { "filesize": { - "byte_0": null, - "byte_1": null, - "byte_2": null, - "giga_byte_0": null, - "giga_byte_1": null, - "giga_byte_2": null, - "kilo_byte_0": null, - "kilo_byte_1": null, - "kilo_byte_2": null, - "mega_byte_0": null, - "mega_byte_1": null, - "mega_byte_2": null, - "tera_byte_0": null, - "tera_byte_1": null, - "tera_byte_2": null + "byte_0": "", + "byte_1": "", + "byte_2": "", + "giga_byte_0": "", + "giga_byte_1": "", + "giga_byte_2": "", + "kilo_byte_0": "", + "kilo_byte_1": "", + "kilo_byte_2": "", + "mega_byte_0": "", + "mega_byte_1": "", + "mega_byte_2": "", + "tera_byte_0": "", + "tera_byte_1": "", + "tera_byte_2": "" }, "table_columns": { "dimensions": "Wymiary", @@ -290,8 +307,8 @@ "sharing": { "add_share": "Dodaj udział", "copy_link": "Skopiuj link", - "delete": null, - "more": null, + "delete": "", + "more": "", "no_shares_found": "Nie znaleziono udostępnionych", "public_link": "Link publiczny", "title": "Opcje udostępniania" @@ -306,13 +323,13 @@ }, "timeline_filter": { "date": { - "dropdown_all": null, - "label": null + "dropdown_all": "", + "label": "" } }, "title": { "loading_album": "Ładowanie albumu", - "login": null, + "login": "", "people": "Ludzie", "settings": "Ustawienia" } diff --git a/ui/src/extractedTranslations/pl/translation_old.json b/ui/src/extractedTranslations/pl/translation_old.json index 024c4e53..19305fd2 100644 --- a/ui/src/extractedTranslations/pl/translation_old.json +++ b/ui/src/extractedTranslations/pl/translation_old.json @@ -102,7 +102,11 @@ "sidebar": { "album": { "title": "Opcje albumu", - "title_placeholder": null + "title_placeholder": null, + "album_cover": null, + "cover_photo": "", + "reset_cover": null, + "set_cover": null }, "download": { "filesize": { @@ -145,5 +149,11 @@ "protected_share": { "password_required_error": null } + }, + "timeline_filter": { + "date": { + "dropdown_all": null, + "label": null + } } } diff --git a/ui/src/extractedTranslations/ru/translation.json b/ui/src/extractedTranslations/ru/translation.json index 71e4b504..d6b1530a 100644 --- a/ui/src/extractedTranslations/ru/translation.json +++ b/ui/src/extractedTranslations/ru/translation.json @@ -1,7 +1,7 @@ { "album_filter": { "only_favorites": "Показать только избранные", - "sort": null, + "sort": "", "sorting_options": { "date_imported": "Дата импортирования", "date_shot": "Дата снимка", @@ -35,7 +35,7 @@ "placeholder": "Поиск", "result_type": { "albums": "Альбомы", - "media": null + "media": "" } } }, @@ -62,10 +62,10 @@ }, "people_page": { "action_label": { - "change_label": null, - "detach_face": null, - "merge_face": null, - "move_faces": null + "change_label": "", + "detach_face": "", + "merge_face": "", + "move_faces": "" }, "face_group": { "label_placeholder": "Метка", @@ -106,10 +106,10 @@ }, "recognize_unlabeled_faces_button": "Распознавать непомеченные лица", "tableselect_face_group": { - "search_faces_placeholder": null + "search_faces_placeholder": "" }, "tableselect_image_faces": { - "search_images_placeholder": null + "search_images_placeholder": "" } }, "photos_page": { @@ -178,7 +178,7 @@ "table": { "column_names": { "action": "Действие", - "capabilities": null, + "capabilities": "", "photo_path": "Путь к фото", "username": "Имя пользователя" }, @@ -206,7 +206,7 @@ }, "protected_share": { "description": "Это общее медиа защищено паролем.", - "password_required_error": null, + "password_required_error": "", "title": "Защищённое медиа" }, "share_not_found": "Общее медиа не найдено", @@ -215,29 +215,46 @@ }, "sidebar": { "album": { - "album_cover": null, - "cover_photo": null, - "reset_cover": null, - "set_cover": null, - "title_placeholder": null + "album_cover": "", + "download": { + "high-resolutions": { + "description": "", + "title": "" + }, + "originals": { + "description": "", + "title": "" + }, + "thumbnails": { + "description": "", + "title": "" + }, + "web-videos": { + "description": "", + "title": "" + } + }, + "reset_cover": "", + "set_cover": "", + "title_placeholder": "" }, "download": { "filesize": { - "byte_0": null, - "byte_1": null, - "byte_2": null, - "giga_byte_0": null, - "giga_byte_1": null, - "giga_byte_2": null, - "kilo_byte_0": null, - "kilo_byte_1": null, - "kilo_byte_2": null, - "mega_byte_0": null, - "mega_byte_1": null, - "mega_byte_2": null, - "tera_byte_0": null, - "tera_byte_1": null, - "tera_byte_2": null + "byte_0": "", + "byte_1": "", + "byte_2": "", + "giga_byte_0": "", + "giga_byte_1": "", + "giga_byte_2": "", + "kilo_byte_0": "", + "kilo_byte_1": "", + "kilo_byte_2": "", + "mega_byte_0": "", + "mega_byte_1": "", + "mega_byte_2": "", + "tera_byte_0": "", + "tera_byte_1": "", + "tera_byte_2": "" }, "table_columns": { "dimensions": "Габариты", @@ -290,8 +307,8 @@ "sharing": { "add_share": "Поделится", "copy_link": "Скопировать ссылку", - "delete": null, - "more": null, + "delete": "", + "more": "", "no_shares_found": "Нет доступа", "public_link": "Общедоступная ссылка", "title": "Настройки доступа" @@ -306,8 +323,8 @@ }, "timeline_filter": { "date": { - "dropdown_all": null, - "label": null + "dropdown_all": "", + "label": "" } }, "title": { diff --git a/ui/src/extractedTranslations/ru/translation_old.json b/ui/src/extractedTranslations/ru/translation_old.json index 9af3027d..9ade8238 100644 --- a/ui/src/extractedTranslations/ru/translation_old.json +++ b/ui/src/extractedTranslations/ru/translation_old.json @@ -64,7 +64,11 @@ "sidebar": { "album": { "title": "Свойства альбома", - "title_placeholder": null + "title_placeholder": null, + "album_cover": null, + "cover_photo": "", + "reset_cover": null, + "set_cover": null }, "download": { "filesize": { @@ -104,5 +108,11 @@ "protected_share": { "password_required_error": null } + }, + "timeline_filter": { + "date": { + "dropdown_all": null, + "label": null + } } } diff --git a/ui/src/extractedTranslations/sv/translation.json b/ui/src/extractedTranslations/sv/translation.json index 21f9d916..19c1aaec 100644 --- a/ui/src/extractedTranslations/sv/translation.json +++ b/ui/src/extractedTranslations/sv/translation.json @@ -1,7 +1,7 @@ { "album_filter": { "only_favorites": "Visa endast favoriter", - "sort": null, + "sort": "", "sorting_options": { "date_imported": "Datum för import", "date_shot": "Datum", @@ -35,7 +35,7 @@ "placeholder": "Sök", "result_type": { "albums": "Album", - "media": null + "media": "" } } }, @@ -62,61 +62,61 @@ }, "people_page": { "action_label": { - "change_label": null, - "detach_face": null, - "merge_face": null, - "move_faces": null + "change_label": "", + "detach_face": "", + "merge_face": "", + "move_faces": "" }, "face_group": { "label_placeholder": "Märkning", "unlabeled": "Omärkt", - "unlabeled_person": null + "unlabeled_person": "" }, "modal": { "action": { - "merge": null + "merge": "" }, "detach_image_faces": { "action": { - "detach": null, - "select_images": null + "detach": "", + "select_images": "" }, - "description": null, - "title": null + "description": "", + "title": "" }, "merge_face_groups": { - "description": null, + "description": "", "destination_table": { - "title": null + "title": "" }, - "title": null + "title": "" }, "move_image_faces": { - "description": null, + "description": "", "destination_face_group_table": { - "move_action": null, - "title": null + "move_action": "", + "title": "" }, "image_select_table": { - "next_action": null, - "title": null + "next_action": "", + "title": "" }, - "title": null + "title": "" } }, "recognize_unlabeled_faces_button": "Känna igen omärkta ansikten", "tableselect_face_group": { - "search_faces_placeholder": null + "search_faces_placeholder": "" }, "tableselect_image_faces": { - "search_images_placeholder": null + "search_images_placeholder": "" } }, "photos_page": { "title": "Bilder" }, "places_page": { - "title": null + "title": "" }, "routes": { "page_not_found": "Sidan hittades inte" @@ -178,7 +178,7 @@ "table": { "column_names": { "action": "Åtgärd", - "capabilities": null, + "capabilities": "", "photo_path": "Sökväg till bild", "username": "Användarnamn" }, @@ -195,9 +195,9 @@ "title": "Användare" }, "version_info": { - "build_date_title": null, - "title": null, - "version_title": null + "build_date_title": "", + "title": "", + "version_title": "" } }, "share_page": { @@ -206,7 +206,7 @@ }, "protected_share": { "description": "Denna delning är skyddad med ett lösenord.", - "password_required_error": null, + "password_required_error": "", "title": "Skyddad delning" }, "share_not_found": "Delning hittades inte", @@ -215,24 +215,41 @@ }, "sidebar": { "album": { - "album_cover": null, - "cover_photo": null, - "reset_cover": null, - "set_cover": null, - "title_placeholder": null + "album_cover": "", + "download": { + "high-resolutions": { + "description": "", + "title": "" + }, + "originals": { + "description": "", + "title": "" + }, + "thumbnails": { + "description": "", + "title": "" + }, + "web-videos": { + "description": "", + "title": "" + } + }, + "reset_cover": "", + "set_cover": "", + "title_placeholder": "" }, "download": { "filesize": { "byte": "{{count}} Byte", "byte_plural": "{{count}} Bytes", "giga_byte": "{{count}} GB", - "giga_byte_plural": null, + "giga_byte_plural": "", "kilo_byte": "{{count}} KB", - "kilo_byte_plural": null, + "kilo_byte_plural": "", "mega_byte": "{{count}} MB", - "mega_byte_plural": null, + "mega_byte_plural": "", "tera_byte": "{{count}} TB", - "tera_byte_plural": null + "tera_byte_plural": "" }, "table_columns": { "dimensions": "Mått", @@ -285,8 +302,8 @@ "sharing": { "add_share": "Dela", "copy_link": "Kopiera länk", - "delete": null, - "more": null, + "delete": "", + "more": "", "no_shares_found": "Inga delningar hittades", "public_link": "Publika länkar", "title": "Delningsinställningar" @@ -301,13 +318,13 @@ }, "timeline_filter": { "date": { - "dropdown_all": null, - "label": null + "dropdown_all": "", + "label": "" } }, "title": { "loading_album": "Laddar album", - "login": null, + "login": "", "people": "Personer", "settings": "Inställningar" } diff --git a/ui/src/extractedTranslations/sv/translation_old.json b/ui/src/extractedTranslations/sv/translation_old.json index cf086200..fb0943d0 100644 --- a/ui/src/extractedTranslations/sv/translation_old.json +++ b/ui/src/extractedTranslations/sv/translation_old.json @@ -105,7 +105,11 @@ "sidebar": { "album": { "title": "Albuminställningar", - "title_placeholder": null + "title_placeholder": null, + "album_cover": null, + "cover_photo": "", + "reset_cover": null, + "set_cover": null }, "sharing": { "table_header": "Publika delningar", @@ -131,5 +135,11 @@ "protected_share": { "password_required_error": null } + }, + "timeline_filter": { + "date": { + "dropdown_all": null, + "label": null + } } } diff --git a/ui/src/localization.ts b/ui/src/localization.ts index a43402a3..d16c1b37 100644 --- a/ui/src/localization.ts +++ b/ui/src/localization.ts @@ -21,6 +21,7 @@ export function setupLocalization(): void { lng: 'en', fallbackLng: 'en', returnNull: false, + returnEmptyString: false, interpolation: { escapeValue: false,