diff --git a/next.config.js b/next.config.js index 4a46dcfac..601f9534d 100644 --- a/next.config.js +++ b/next.config.js @@ -28,12 +28,6 @@ module.exports = (phase) => '@mui/system', '@mui/icons-material', ], - compiler: { - styledComponents: { - ssr: true, - displayName: true, - }, - }, env: { SENTRY_RELEASE: GIT_SHA, NEXT_PUBLIC_IS_TEST_APP: process.env.IS_TEST_RELEASE, diff --git a/package.json b/package.json index c8384085e..9e4486014 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,12 @@ }, "dependencies": { "@date-io/date-fns": "^2.14.0", + "@emotion/cache": "^11.10.5", + "@emotion/react": "^11.10.6", + "@emotion/server": "^11.10.0", + "@emotion/styled": "^11.10.6", "@mui/icons-material": "^5.6.2", "@mui/material": "^5.6.2", - "@mui/styled-engine": "npm:@mui/styled-engine-sc@latest", - "@mui/styled-engine-sc": "^5.6.1", "@mui/x-date-pickers": "^5.0.0-alpha.6", "@sentry/nextjs": "^6.7.1", "@stripe/stripe-js": "^1.13.2", @@ -99,7 +101,6 @@ "@types/react-select": "^4.0.15", "@types/react-window": "^1.8.2", "@types/react-window-infinite-loader": "^1.0.3", - "@types/styled-components": "^5.1.25", "@types/wicg-file-system-access": "^2020.9.5", "@types/yup": "^0.29.7", "@types/zxcvbn": "^4.4.1", @@ -114,8 +115,5 @@ }, "standard": { "parser": "babel-eslint" - }, - "resolutions": { - "@mui/styled-engine": "npm:@mui/styled-engine-sc@latest" } -} +} \ No newline at end of file diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json new file mode 100644 index 000000000..280e51edf --- /dev/null +++ b/public/locales/de/translation.json @@ -0,0 +1,592 @@ +{ + "HERO_SLIDE_1_TITLE": "", + "HERO_SLIDE_1": "", + "HERO_SLIDE_2_TITLE": "", + "HERO_SLIDE_2": "", + "HERO_SLIDE_3_TITLE": "", + "HERO_SLIDE_3": "", + "LOGIN": "", + "SIGN_UP": "", + "NEW_USER": "", + "EXISTING_USER": "", + "NAME": "", + "ENTER_NAME": "", + "PUBLIC_UPLOADER_NAME_MESSAGE": "", + "EMAIL": "", + "ENTER_EMAIL": "", + "DATA_DISCLAIMER": "", + "SUBMIT": "", + "EMAIL_ERROR": "", + "REQUIRED": "", + "VERIFY_EMAIL": "", + "EMAIL_SENT": "", + "CHECK_INBOX": "", + "ENTER_OTT": "", + "RESEND_MAIL": "", + "VERIFY": "", + "UNKNOWN_ERROR": "", + "INVALID_CODE": "", + "EXPIRED_CODE": "", + "SENDING": "", + "SENT": "", + "PASSWORD": "", + "LINK_PASSWORD": "", + "ENTER_PASSPHRASE": "", + "RETURN_PASSPHRASE_HINT": "", + "SET_PASSPHRASE": "", + "VERIFY_PASSPHRASE": "", + "INCORRECT_PASSPHRASE": "", + "ENTER_ENC_PASSPHRASE": "", + "PASSPHRASE_DISCLAIMER": "", + "WELCOME_TO_ENTE_HEADING": "", + "WELCOME_TO_ENTE_SUBHEADING": "", + "WHERE_YOUR_BEST_PHOTOS_LIVE": "", + "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", + "PASSPHRASE_HINT": "", + "CONFIRM_PASSPHRASE": "", + "PASSPHRASE_MATCH_ERROR": "", + "CONSOLE_WARNING_STOP": "", + "CONSOLE_WARNING_DESC": "", + "SELECT_COLLECTION": "", + "CREATE_COLLECTION": "", + "ENTER_ALBUM_NAME": "", + "CLOSE_OPTION": "", + "ENTER_FILE_NAME": "", + "CLOSE": "", + "NO": "", + "NOTHING_HERE": "", + "UPLOAD": "", + "IMPORT": "", + "ADD_PHOTOS": "", + "ADD_MORE_PHOTOS": "", + "add_photos_one": "", + "add_photos_other": "", + "SELECT_PHOTOS": "", + "FILE_UPLOAD": "", + "UPLOAD_STAGE_MESSAGE": { + "0": "", + "1": "", + "2": "", + "3": "", + "4": "", + "5": "" + }, + "UPLOADING_FILES": "", + "FILE_NOT_UPLOADED_LIST": "", + "SUBSCRIPTION_EXPIRED": "", + "SUBSCRIPTION_EXPIRED_MESSAGE": "", + "STORAGE_QUOTA_EXCEEDED": "", + "INITIAL_LOAD_DELAY_WARNING": "", + "USER_DOES_NOT_EXIST": "", + "UPLOAD_BUTTON_TEXT": "", + "NO_ACCOUNT": "", + "ACCOUNT_EXISTS": "", + "ALBUM_NAME": "", + "CREATE": "", + "DOWNLOAD": "", + "DOWNLOAD_OPTION": "", + "DOWNLOAD_FAVORITES": "", + "DOWNLOAD_UNCATEGORIZED": "", + "COPY_OPTION": "", + "TOGGLE_FULLSCREEN": "", + "ZOOM_IN_OUT": "", + "PREVIOUS": "", + "NEXT": "", + "NO_INTERNET_CONNECTION": "", + "TITLE": "", + "UPLOAD_FIRST_PHOTO": "", + "IMPORT_YOUR_FOLDERS": "", + "UPLOAD_DROPZONE_MESSAGE": "", + "WATCH_FOLDER_DROPZONE_MESSAGE": "", + "TRASH_FILES_TITLE": "", + "TRASH_FILE_TITLE": "", + "DELETE_FILES_TITLE": "", + "DELETE_FILES_MESSAGE": "", + "DELETE_FILE": "", + "DELETE": "", + "DELETE_OPTION": "", + "FAVORITE": "", + "FAVORITE_OPTION": "", + "UNFAVORITE_OPTION": "", + "UNFAVORITE": "", + "MULTI_FOLDER_UPLOAD": "", + "UPLOAD_STRATEGY_CHOICE": "", + "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", + "OR": "", + "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", + "SESSION_EXPIRED_MESSAGE": "", + "SESSION_EXPIRED": "", + "SYNC_FAILED": "", + "PASSWORD_GENERATION_FAILED": "", + "CHANGE_PASSWORD": "", + "GO_BACK": "", + "RECOVERY_KEY": "", + "SAVE_LATER": "", + "SAVE": "", + "RECOVERY_KEY_DESCRIPTION": "", + "RECOVER_KEY_GENERATION_FAILED": "", + "KEY_NOT_STORED_DISCLAIMER": "", + "FORGOT_PASSWORD": "", + "RECOVER_ACCOUNT": "", + "RECOVERY_KEY_HINT": "", + "RECOVER": "", + "NO_RECOVERY_KEY": "", + "INCORRECT_RECOVERY_KEY": "", + "SORRY": "", + "NO_RECOVERY_KEY_MESSAGE": "", + "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", + "CONTACT_SUPPORT": "", + "REQUEST_FEATURE": "", + "SUPPORT": "", + "CONFIRM": "", + "SKIP_SUBSCRIPTION_PURCHASE": "", + "CANCEL": "", + "LOGOUT": "", + "DELETE_ACCOUNT": "", + "DELETE_ACCOUNT_MESSAGE": "", + "LOGOUT_MESSAGE": "", + "CHANGE": "", + "CHANGE_EMAIL": "", + "OK": "", + "SUCCESS": "", + "ERROR": "", + "MESSAGE": "", + "INSTALL_MOBILE_APP": "", + "DOWNLOAD_APP_MESSAGE": "", + "DOWNLOAD_APP": "", + "EXPORT": "", + "SUBSCRIPTION": "", + "SUBSCRIBE": "", + "SUBSCRIPTION_PLAN": "", + "USAGE_DETAILS": "", + "MANAGE": "", + "MANAGEMENT_PORTAL": "", + "MANAGE_FAMILY_PORTAL": "", + "LEAVE_FAMILY_PLAN": "", + "LEAVE": "", + "LEAVE_FAMILY_CONFIRM": "", + "CHOOSE_PLAN": "", + "MANAGE_PLAN": "", + "ACTIVE": "", + "OFFLINE_MSG": "", + "FREE_SUBSCRIPTION_INFO": "", + "FAMILY_SUBSCRIPTION_INFO": "", + "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", + "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", + "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", + "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", + "SUBSCRIPTION_PURCHASE_SUCCESS": "", + "SUBSCRIPTION_PURCHASE_CANCELLED": "", + "SUBSCRIPTION_VERIFICATION_FAILED": "", + "SUBSCRIPTION_PURCHASE_FAILED": "", + "SUBSCRIPTION_UPDATE_FAILED": "", + "UPDATE_PAYMENT_METHOD_MESSAGE": "", + "STRIPE_AUTHENTICATION_FAILED": "", + "UPDATE_PAYMENT_METHOD": "", + "MONTHLY": "", + "YEARLY": "", + "UPDATE_SUBSCRIPTION_MESSAGE": "", + "UPDATE_SUBSCRIPTION": "", + "CANCEL_SUBSCRIPTION": "", + "CANCEL_SUBSCRIPTION_MESSAGE": "", + "SUBSCRIPTION_CANCEL_FAILED": "", + "SUBSCRIPTION_CANCEL_SUCCESS": "", + "REACTIVATE_SUBSCRIPTION": "", + "REACTIVATE_SUBSCRIPTION_MESSAGE": "", + "SUBSCRIPTION_ACTIVATE_SUCCESS": "", + "SUBSCRIPTION_ACTIVATE_FAILED": "", + "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", + "CANCEL_SUBSCRIPTION_ON_MOBILE": "", + "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", + "MAIL_TO_MANAGE_SUBSCRIPTION": "", + "RENAME": "", + "RENAME_FILE": "", + "RENAME_COLLECTION": "", + "DELETE_COLLECTION_TITLE": "", + "DELETE_COLLECTION": "", + "DELETE_COLLECTION_FAILED": "", + "DELETE_COLLECTION_MESSAGE": "", + "DELETE_PHOTOS": "", + "KEEP_PHOTOS": "", + "SHARE": "", + "SHARE_COLLECTION": "", + "SHARE_WITH_PEOPLE": "", + "SHAREES": "", + "PUBLIC_URL": "", + "SHARE_WITH_SELF": "", + "ALREADY_SHARED": "", + "SHARING_BAD_REQUEST_ERROR": "", + "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", + "DOWNLOAD_COLLECTION": "", + "DOWNLOAD_COLLECTION_MESSAGE": "", + "DOWNLOAD_COLLECTION_FAILED": "", + "CREATE_ALBUM_FAILED": "", + "SEARCH_RESULTS": "", + "SEARCH_HINT": "", + "SEARCH_TYPE": { + "COLLECTION": "", + "LOCATION": "", + "DATE": "", + "FILE_NAME": "", + "THING": "", + "FILE_CAPTION": "" + }, + "photos_count_zero": "", + "photos_count_one": "", + "photos_count_other": "", + "TERMS_AND_CONDITIONS": "", + "CONFIRM_PASSWORD_NOT_SAVED": "", + "ADD_TO_COLLECTION": "", + "SELECTED": "", + "VIDEO_PLAYBACK_FAILED": "", + "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", + "PEOPLE": "", + "INDEXING_SCHEDULED": "", + "ANALYZING_PHOTOS": "", + "INDEXING_PEOPLE": "", + "INDEXING_DONE": "", + "UNIDENTIFIED_FACES": "", + "OBJECTS": "", + "TEXT": "", + "METADATA": "", + "INFO": "", + "INFO_OPTION": "", + "FILE_ID": "", + "FILE_NAME": "", + "CAPTION": "", + "CAPTION_PLACEHOLDER": "", + "CREATION_TIME": "", + "UPDATED_ON": "", + "LOCATION": "", + "SHOW_ON_MAP": "", + "DETAILS": "", + "VIEW_EXIF": "", + "NO_EXIF": "", + "EXIF": "", + "DEVICE": "", + "IMAGE_SIZE": "", + "FLASH": "", + "FOCAL_LENGTH": "", + "APERTURE": "", + "ISO": "", + "SHOW_ALL": "", + "TWO_FACTOR": "", + "TWO_FACTOR_AUTHENTICATION": "", + "TWO_FACTOR_QR_INSTRUCTION": "", + "ENTER_CODE_MANUALLY": "", + "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", + "SCAN_QR_CODE": "", + "CONTINUE": "", + "BACK": "", + "ENABLE_TWO_FACTOR": "", + "ENABLE": "", + "LOST_DEVICE": "", + "INCORRECT_CODE": "", + "RECOVER_TWO_FACTOR": "", + "TWO_FACTOR_INFO": "", + "DISABLE_TWO_FACTOR_LABEL": "", + "UPDATE_TWO_FACTOR_LABEL": "", + "DISABLE": "", + "RECONFIGURE": "", + "UPDATE_TWO_FACTOR": "", + "UPDATE_TWO_FACTOR_MESSAGE": "", + "UPDATE": "", + "DISABLE_TWO_FACTOR": "", + "DISABLE_TWO_FACTOR_MESSAGE": "", + "TWO_FACTOR_SETUP_FAILED": "", + "TWO_FACTOR_SETUP_SUCCESS": "", + "TWO_FACTOR_DISABLE_SUCCESS": "", + "TWO_FACTOR_DISABLE_FAILED": "", + "EXPORT_DATA": "", + "SELECT_FOLDER": "", + "DESTINATION": "", + "START": "", + "EXPORT_IN_PROGRESS": "", + "PAUSE": "", + "RESUME": "", + "MINIMIZE": "", + "LAST_EXPORT_TIME": "", + "SUCCESSFULLY_EXPORTED_FILES": "", + "FAILED_EXPORTED_FILES": "", + "EXPORT_AGAIN": "", + "RETRY_EXPORT": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", + "RETRY": "", + "SEND_OTT": "", + "EMAIl_ALREADY_OWNED": "", + "EMAIL_UDPATE_SUCCESSFUL": "", + "UPLOAD_FAILED": "", + "ETAGS_BLOCKED": "", + "SKIPPED_VIDEOS_INFO": "", + "LIVE_PHOTOS_DETECTED": "", + "RETRY_FAILED": "", + "FAILED_UPLOADS": "", + "SKIPPED_FILES": "", + "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", + "UNSUPPORTED_FILES": "", + "SUCCESSFUL_UPLOADS": "", + "SKIPPED_INFO": "", + "UNSUPPORTED_INFO": "", + "BLOCKED_UPLOADS": "", + "SKIPPED_VIDEOS": "", + "INPROGRESS_METADATA_EXTRACTION": "", + "INPROGRESS_UPLOADS": "", + "TOO_LARGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", + "TOO_LARGE_INFO": "", + "THUMBNAIL_GENERATION_FAILED_INFO": "", + "UPLOAD_TO_COLLECTION": "", + "UNCATEGORIZED": "", + "MOVE_TO_UNCATEGORIZED": "", + "ARCHIVE": "", + "ARCHIVE_COLLECTION": "", + "ARCHIVE_SECTION_NAME": "", + "ALL_SECTION_NAME": "", + "MOVE_TO_COLLECTION": "", + "UNARCHIVE": "", + "UNARCHIVE_COLLECTION": "", + "MOVE": "", + "ADD": "", + "SORT": "", + "REMOVE": "", + "YES_REMOVE": "", + "CONFIRM_REMOVE": "", + "REMOVE_FROM_COLLECTION": "", + "TRASH": "", + "MOVE_TO_TRASH": "", + "TRASH_FILES_MESSAGE": "", + "TRASH_FILE_MESSAGE": "", + "DELETE_PERMANENTLY": "", + "RESTORE": "", + "CONFIRM_RESTORE": "", + "RESTORE_MESSAGE": "", + "RESTORE_TO_COLLECTION": "", + "EMPTY_TRASH": "", + "EMPTY_TRASH_TITLE": "", + "EMPTY_TRASH_MESSAGE": "", + "LEAVE_SHARED_ALBUM": "", + "LEAVE_ALBUM": "", + "LEAVE_SHARED_ALBUM_TITLE": "", + "LEAVE_SHARED_ALBUM_MESSAGE": "", + "NOT_FILE_OWNER": "", + "CONFIRM_SELF_REMOVE_MESSAGE": "", + "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", + "SORT_BY_CREATION_TIME_ASCENDING": "", + "SORT_BY_CREATION_TIME_DESCENDING": "", + "SORT_BY_UPDATION_TIME_DESCENDING": "", + "SORT_BY_NAME": "", + "COMPRESS_THUMBNAILS": "", + "THUMBNAIL_REPLACED": "", + "FIX_THUMBNAIL": "", + "FIX_THUMBNAIL_LATER": "", + "REPLACE_THUMBNAIL_NOT_STARTED": "", + "REPLACE_THUMBNAIL_COMPLETED": "", + "REPLACE_THUMBNAIL_NOOP": "", + "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", + "FIX_CREATION_TIME": "", + "FIX_CREATION_TIME_IN_PROGRESS": "", + "CREATION_TIME_UPDATED": "", + "UPDATE_CREATION_TIME_NOT_STARTED": "", + "UPDATE_CREATION_TIME_COMPLETED": "", + "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", + "FILE_NAME_CHARACTER_LIMIT": "", + "CAPTION_CHARACTER_LIMIT": "", + "DATE_TIME_ORIGINAL": "", + "DATE_TIME_DIGITIZED": "", + "CUSTOM_TIME": "", + "REOPEN_PLAN_SELECTOR_MODAL": "", + "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", + "COMMENT": "", + "ABUSE_REPORT_DESCRIPTION": "", + "OTHER_REASON_REQUIRES_COMMENTS": "", + "REPORT_SUBMIT_SUCCESS_CONTENT": "", + "REPORT_SUBMIT_SUCCESS_TITLE": "", + "REPORT_SUBMIT_FAILED": "", + "INSTALL": "", + "ALBUM_URL": "", + "SHARING_DETAILS": "", + "MODIFY_SHARING": "", + "NOT_FOUND": "", + "LINK_EXPIRED": "", + "LINK_EXPIRED_MESSAGE": "", + "MANAGE_LINK": "", + "LINK_TOO_MANY_REQUESTS": "", + "DISABLE_PUBLIC_SHARING": "", + "DISABLE_PUBLIC_SHARING_MESSAGE": "", + "FILE_DOWNLOAD": "", + "LINK_PASSWORD_LOCK": "", + "PUBLIC_COLLECT": "", + "LINK_DEVICE_LIMIT": "", + "LINK_EXPIRY": "", + "LINK_EXPIRY_NEVER": "", + "DISABLE_FILE_DOWNLOAD": "", + "DISABLE_FILE_DOWNLOAD_MESSAGE": "", + "ABUSE_REPORT": "", + "ABUSE_REPORT_BUTTON_TEXT": "", + "MALICIOUS_CONTENT": "", + "COPYRIGHT": "", + "ENTER_EMAIL_ADDRESS": "", + "SELECT_REASON": "", + "ENTER_FULL_NAME": "", + "ENTER_DIGITAL_SIGNATURE": "", + "ENTER_ON_BEHALF_OF": "", + "ENTER_ADDRESS": "", + "ENTER_JOB_TITLE": "", + "ENTER_CITY": "", + "ENTER_PHONE": "", + "ENTER_STATE": "", + "ENTER_POSTAL_CODE": "", + "ENTER_COUNTRY": "", + "JUDICIAL_DESCRIPTION": "", + "TERM_1": "", + "TERM_2": "", + "TERM_3": "", + "SHARED_USING": "", + "ENTE_IO": "", + "LIVE": "", + "DISABLE_PASSWORD": "", + "DISABLE_PASSWORD_MESSAGE": "", + "PASSWORD_LOCK": "", + "LOCK": "", + "DOWNLOAD_UPLOAD_LOGS": "", + "CHOOSE_UPLOAD_TYPE": "", + "UPLOAD_FILES": "", + "UPLOAD_DIRS": "", + "UPLOAD_GOOGLE_TAKEOUT": "", + "CANCEL_UPLOADS": "", + "DEDUPLICATE_FILES": "", + "NO_DUPLICATES_FOUND": "", + "CLUB_BY_CAPTURE_TIME": "", + "FILES": "", + "EACH": "", + "DEDUPLICATE_BASED_ON_SIZE": "", + "DEDUPLICATE_BASED_ON_SIZE_AND_CAPTURE_TIME": "", + "STOP_ALL_UPLOADS_MESSAGE": "", + "STOP_UPLOADS_HEADER": "", + "YES_STOP_UPLOADS": "", + "albums_one": "", + "albums_other": "", + "NEW": "", + "VIEW_ALL_ALBUMS": "", + "ALL_ALBUMS": "", + "ALBUMS": "", + "ENDS": "", + "ENTER_TWO_FACTOR_OTP": "", + "CREATE_ACCOUNT": "", + "COPIED": "", + "CANVAS_BLOCKED_TITLE": "", + "CANVAS_BLOCKED_MESSAGE": "", + "WATCH_FOLDERS": "", + "UPGRADE_NOW": "", + "RENEW_NOW": "", + "STORAGE": "", + "USED": "", + "YOU": "", + "FAMILY": "", + "FREE": "", + "OF": "", + "WATCHED_FOLDERS": "", + "NO_FOLDERS_ADDED": "", + "FOLDERS_AUTOMATICALLY_MONITORED": "", + "UPLOAD_NEW_FILES_TO_ENTE": "", + "REMOVE_DELETED_FILES_FROM_ENTE": "", + "ADD_FOLDER": "", + "STOP_WATCHING": "", + "STOP_WATCHING_FOLDER": "", + "STOP_WATCHING_DIALOG_MESSAGE": "", + "YES_STOP": "", + "MONTH_SHORT": "", + "YEAR": "", + "FAMILY_PLAN": "", + "DOWNLOAD_LOGS": "", + "DOWNLOAD_LOGS_MESSAGE": "", + "CHANGE_FOLDER": "", + "TWO_MONTHS_FREE": "", + "GB": "", + "POPULAR": "", + "FREE_PLAN_OPTION_LABEL": "", + "FREE_PLAN_DESCRIPTION": "", + "CURRENT_USAGE": "", + "WEAK_DEVICE": "", + "DRAG_AND_DROP_HINT": "", + "ASK_FOR_FEEDBACK": "", + "SEND_FEEDBACK": "", + "CONFIRM_ACCOUNT_DELETION_TITLE": "", + "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", + "AUTHENTICATE": "", + "UPLOADED_TO_SINGLE_COLLECTION": "", + "UPLOADED_TO_SEPARATE_COLLECTIONS": "", + "NEVERMIND": "", + "UPDATE_AVAILABLE": "", + "UPDATE_INSTALLABLE_MESSAGE": "", + "INSTALL_NOW": "", + "INSTALL_ON_NEXT_LAUNCH": "", + "UPDATE_AVAILABLE_MESSAGE": "", + "DOWNLOAD_AND_INSTALL": "", + "IGNORE_THIS_VERSION": "", + "TODAY": "", + "YESTERDAY": "", + "AT": "", + "NAME_PLACEHOLDER": "", + "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", + "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", + "CHOSE_THEME": "", + "ML_SEARCH": "", + "ENABLE_ML_SEARCH_DESCRIPTION": "", + "ML_MORE_DETAILS": "", + "ENABLE_FACE_SEARCH": "", + "ENABLE_FACE_SEARCH_TITLE": "", + "ENABLE_FACE_SEARCH_DESCRIPTION": "", + "DISABLE_BETA": "", + "DISABLE_FACE_SEARCH": "", + "DISABLE_FACE_SEARCH_TITLE": "", + "DISABLE_FACE_SEARCH_DESCRIPTION": "", + "ADVANCED": "", + "FACE_SEARCH_CONFIRMATION": "", + "LABS": "", + "YOURS": "", + "PASSPHRASE_STRENGTH": "", + "PREFERENCES": "", + "LANGUAGE": "", + "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", + "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", + "SUBSCRIPTION_VERIFICATION_ERROR": "", + "STORAGE_UNITS": { + "B": "", + "KB": "", + "MB": "", + "GB": "", + "TB": "" + }, + "AFTER_TIME": { + "HOUR": "", + "DAY": "", + "WEEK": "", + "MONTH": "", + "YEAR": "" + }, + "COPY_LINK": "", + "DONE": "", + "ADD_EMAIL_TITLE": "", + "LINK_SHARE_TITLE": "", + "REMOVE_LINK": "", + "CREATE_PUBLIC_SHARING": "", + "PUBLIC_LINK_CREATED": "", + "PUBLIC_LINK_ENABLED": "", + "COLLECT_PHOTOS": "", + "PUBLIC_COLLECT_SUBTEXT": "", + "STOP_EXPORT": "", + "EXPORT_PROGRESS": "", + "EXPORT_NOTIFICATION": { + "START": "", + "IN_PROGRESS": "", + "FINISH": "", + "UP_TO_DATE": "" + }, + "CONTINUOUS_EXPORT": "", + "TOTAL_ITEMS": "", + "PENDING_ITEMS": "", + "EXPORT_STARTING": "" +} \ No newline at end of file diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 879208e1c..a1e27bcfe 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -9,16 +9,11 @@ "SIGN_UP": "Signup", "NEW_USER": "New to ente", "EXISTING_USER": "Existing user", - "NAME": "Name", "ENTER_NAME": "Enter name", "PUBLIC_UPLOADER_NAME_MESSAGE": "Add a name so that your friends know who to thank for these great photos!", - "EMAIL": "Email", "ENTER_EMAIL": "Enter email address", - "DATA_DISCLAIMER": "We'll never share your data with anyone else.", - "SUBMIT": "Submit", "EMAIL_ERROR": "Enter a valid email", "REQUIRED": "Required", - "VERIFY_EMAIL": "Verify email", "EMAIL_SENT": "Verification code sent to {{email}}", "CHECK_INBOX": "Please check your inbox (and spam) to complete verification", "ENTER_OTT": "Verification code", @@ -31,7 +26,6 @@ "SENT": "Sent!", "PASSWORD": "Password", "LINK_PASSWORD": "Enter password to unlock the album", - "ENTER_PASSPHRASE": "Enter your password", "RETURN_PASSPHRASE_HINT": "Password", "SET_PASSPHRASE": "Set password", "VERIFY_PASSPHRASE": "Sign in", @@ -47,7 +41,6 @@ "PASSPHRASE_MATCH_ERROR": "Passwords don't match", "CONSOLE_WARNING_STOP": "STOP!", "CONSOLE_WARNING_DESC": "This is a browser feature intended for developers. Please don't copy-paste unverified code here.", - "SELECT_COLLECTION": "Select an album to upload to", "CREATE_COLLECTION": "New album", "ENTER_ALBUM_NAME": "Album name", "CLOSE_OPTION": "Close (Esc)", @@ -71,17 +64,14 @@ "4": "Cancelling remaining uploads", "5": "Backup complete" }, - "UPLOADING_FILES": "File upload", "FILE_NOT_UPLOADED_LIST": "The following files were not uploaded", "SUBSCRIPTION_EXPIRED": "Subscription expired", "SUBSCRIPTION_EXPIRED_MESSAGE": "Your subscription has expired, please renew", "STORAGE_QUOTA_EXCEEDED": "Storage limit exceeded", "INITIAL_LOAD_DELAY_WARNING": "First load may take some time", "USER_DOES_NOT_EXIST": "Sorry, could not find a user with that email", - "UPLOAD_BUTTON_TEXT": "Upload", "NO_ACCOUNT": "Don't have an account", "ACCOUNT_EXISTS": "Already have an account", - "ALBUM_NAME": "Album name", "CREATE": "Create", "DOWNLOAD": "Download", "DOWNLOAD_OPTION": "Download (D)", @@ -102,13 +92,10 @@ "TRASH_FILE_TITLE": "Delete file?", "DELETE_FILES_TITLE": "Delete immediately?", "DELETE_FILES_MESSAGE": "Selected files will be permanently deleted from your ente account.", - "DELETE_FILE": "Delete files", "DELETE": "Delete", "DELETE_OPTION": "Delete (DEL)", - "FAVORITE": "Favorite", "FAVORITE_OPTION": "Favorite (L)", "UNFAVORITE_OPTION": "Unfavorite (L)", - "UNFAVORITE": "Unfavorite", "MULTI_FOLDER_UPLOAD": "Multiple folders detected", "UPLOAD_STRATEGY_CHOICE": "Would you like to upload them into", "UPLOAD_STRATEGY_SINGLE_COLLECTION": "A single album", @@ -116,7 +103,6 @@ "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "Separate albums", "SESSION_EXPIRED_MESSAGE": "Your session has expired, please login again to continue", "SESSION_EXPIRED": "Session expired", - "SYNC_FAILED": "Failed to sync with server, please refresh this page", "PASSWORD_GENERATION_FAILED": "Your browser was unable to generate a strong key that meets ente's encryption standards, please try using the mobile app or another browser", "CHANGE_PASSWORD": "Change password", "GO_BACK": "Go back", @@ -139,13 +125,11 @@ "REQUEST_FEATURE": "Request Feature", "SUPPORT": "Support", "CONFIRM": "Confirm", - "SKIP_SUBSCRIPTION_PURCHASE": "Continue with free plan", "CANCEL": "Cancel", "LOGOUT": "Logout", "DELETE_ACCOUNT": "Delete account", "DELETE_ACCOUNT_MESSAGE": "

Please send an email to {{emailID}} from your registered email address.

Your request will be processed within 72 hours.

", "LOGOUT_MESSAGE": "Are you sure you want to logout?", - "CHANGE": "Change", "CHANGE_EMAIL": "Change email", "OK": "OK", "SUCCESS": "Success", @@ -157,9 +141,6 @@ "EXPORT": "Export Data", "SUBSCRIPTION": "Subscription", "SUBSCRIBE": "Subscribe", - "SUBSCRIPTION_PLAN": "Subscription plan", - "USAGE_DETAILS": "Usage", - "MANAGE": "Manage", "MANAGEMENT_PORTAL": "Manage payment method", "MANAGE_FAMILY_PORTAL": "Manage family", "LEAVE_FAMILY_PLAN": "Leave family plan", @@ -177,7 +158,6 @@ "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "You have exceeded your storage quota, please upgrade", "SUBSCRIPTION_PURCHASE_SUCCESS": "

We've received your payment

Your subscription is valid till {{date, dateTime}}

", "SUBSCRIPTION_PURCHASE_CANCELLED": "Your purchase was canceled, please try again if you want to subscribe", - "SUBSCRIPTION_VERIFICATION_FAILED": "We were not able to verify your purchase, verification can take few hours", "SUBSCRIPTION_PURCHASE_FAILED": "Subscription purchase failed , please try again", "SUBSCRIPTION_UPDATE_FAILED": "Subscription updated failed , please try again", "UPDATE_PAYMENT_METHOD_MESSAGE": "We are sorry, payment failed when we tried to charge your card, please update your payment method and try again", @@ -204,22 +184,18 @@ "RENAME_COLLECTION": "Rename album", "DELETE_COLLECTION_TITLE": "Delete album?", "DELETE_COLLECTION": "Delete album", - "DELETE_COLLECTION_FAILED": "Album deletion failed, please try again", "DELETE_COLLECTION_MESSAGE": "Also delete the photos (and videos) present in this album from all other albums they are part of?", "DELETE_PHOTOS": "Delete photos", "KEEP_PHOTOS": "Keep photos", "SHARE": "Share", "SHARE_COLLECTION": "Share album", - "SHARE_WITH_PEOPLE": "Share with your loved ones", "SHAREES": "Shared with", - "PUBLIC_URL": "Public link", "SHARE_WITH_SELF": "Oops, you cannot share with yourself", "ALREADY_SHARED": "Oops, you're already sharing this with {{email}}", "SHARING_BAD_REQUEST_ERROR": "Sharing album not allowed", "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Sharing is disabled for free accounts", "DOWNLOAD_COLLECTION": "Download album", "DOWNLOAD_COLLECTION_MESSAGE": "

Are you sure you want to download the complete album?

All files will be queued for download sequentially

", - "DOWNLOAD_COLLECTION_FAILED": "Album downloading failed, please try again", "CREATE_ALBUM_FAILED": "Failed to create album , please try again", "SEARCH_RESULTS": "Search results", "SEARCH_HINT": "Search for albums, dates ...", @@ -235,10 +211,8 @@ "photos_count_one": "1 memory", "photos_count_other": "{{count}} memories", "TERMS_AND_CONDITIONS": "I agree to the terms and privacy policy", - "CONFIRM_PASSWORD_NOT_SAVED": "

I understand that if I lose my password , I may lose my data since my data is <1>end-to-end encrypted with ente

", "ADD_TO_COLLECTION": "Add to album", "SELECTED": "selected", - "VIDEO_PLAYBACK_FAILED": "Video format not supported", "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "This video cannot be played on your browser", "PEOPLE": "People", "INDEXING_SCHEDULED": "indexing is scheduled...", @@ -248,41 +222,27 @@ "UNIDENTIFIED_FACES": "unidentified faces", "OBJECTS": "objects", "TEXT": "text", - "METADATA": "Metadata", "INFO": "Info ", "INFO_OPTION": "Info (I)", - "FILE_ID": "File ID", "FILE_NAME": "File name", - "CAPTION": "Description", "CAPTION_PLACEHOLDER": "Add a description", - "CREATION_TIME": "Creation time", - "UPDATED_ON": "Updated on", "LOCATION": "Location", "SHOW_ON_MAP": "View on OpenStreetMap", "DETAILS": "Details", "VIEW_EXIF": "View all EXIF data", "NO_EXIF": "No EXIF data", "EXIF": "EXIF", - "DEVICE": "Device", - "IMAGE_SIZE": "Image size", - "FLASH": "Flash", - "FOCAL_LENGTH": "Focal length", - "APERTURE": "Aperture", "ISO": "ISO", - "SHOW_ALL": "show all", "TWO_FACTOR": "Two-factor", "TWO_FACTOR_AUTHENTICATION": "Two-factor authentication", "TWO_FACTOR_QR_INSTRUCTION": "Scan the QR code below with your favorite authenticator app", "ENTER_CODE_MANUALLY": "Enter the code manually", "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "Please enter this code in your favorite authenticator app", "SCAN_QR_CODE": "Scan QR code instead", - "CONTINUE": "Continue", - "BACK": "Back", "ENABLE_TWO_FACTOR": "Enable two-factor", "ENABLE": "Enable", "LOST_DEVICE": "Lost two-factor device", "INCORRECT_CODE": "Incorrect code", - "RECOVER_TWO_FACTOR": "Recover two-factor", "TWO_FACTOR_INFO": "Add an additional layer of security by requiring more than your email and password to log in to your account", "DISABLE_TWO_FACTOR_LABEL": "Disable two-factor authentication", "UPDATE_TWO_FACTOR_LABEL": "Update your authenticator device", @@ -293,31 +253,17 @@ "UPDATE": "Update", "DISABLE_TWO_FACTOR": "Disable two-factor", "DISABLE_TWO_FACTOR_MESSAGE": "Are you sure you want to disable your two-factor authentication", - "TWO_FACTOR_SETUP_FAILED": "Failed to setup two factor, please try again", - "TWO_FACTOR_SETUP_SUCCESS": "Two factor authentication successfully configured", - "TWO_FACTOR_DISABLE_SUCCESS": "Two factor authentication disabled", "TWO_FACTOR_DISABLE_FAILED": "Failed to disable two factor, please try again", "EXPORT_DATA": "Export data", "SELECT_FOLDER": "Select folder", "DESTINATION": "Destination", - "EXPORT_SIZE": "Export size", "START": "Start", - "EXPORT_IN_PROGRESS": "Export in progress...", - "PAUSE": "Pause", - "RESUME": "Resume", - "MINIMIZE": "Minimize", "LAST_EXPORT_TIME": "Last export time", - "SUCCESSFULLY_EXPORTED_FILES": "Successful exports", - "FAILED_EXPORTED_FILES": "Failed exports", "EXPORT_AGAIN": "Resync", - "RETRY_EXPORT": "Retry failed exports", "LOCAL_STORAGE_NOT_ACCESSIBLE": "Local storage not accessible", "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "Your browser or an addon is blocking ente from saving data into local storage. please try loading this page after switching your browsing mode.", - "RETRY": "Retry", "SEND_OTT": "Send OTP", "EMAIl_ALREADY_OWNED": "Email already taken", - "EMAIL_UDPATE_SUCCESSFUL": "Your email has been updated successfully", - "UPLOAD_FAILED": "Upload failed", "ETAGS_BLOCKED": "

We were unable to upload the following files because of your browser configuration.

Please disable any addons that might be preventing ente from using eTags to upload large files, or use our desktop app for a more reliable import experience.

", "SKIPPED_VIDEOS_INFO": "

Presently we do not support adding videos via public links.

To share videos, please signup for ente and share with the intended recipients using their email.

", "LIVE_PHOTOS_DETECTED": "The photo and video files from your Live Photos have been merged into a single file", @@ -340,7 +286,6 @@ "THUMBNAIL_GENERATION_FAILED_INFO": "These files were uploaded, but unfortunately we could not generate the thumbnails for them.", "UPLOAD_TO_COLLECTION": "Upload to album", "UNCATEGORIZED": "Uncategorized", - "MOVE_TO_UNCATEGORIZED": "Move to uncategorized", "ARCHIVE": "Archive", "ARCHIVE_COLLECTION": "Archive album", "ARCHIVE_SECTION_NAME": "Archive", @@ -350,10 +295,8 @@ "UNARCHIVE_COLLECTION": "Unarchive album", "MOVE": "Move", "ADD": "Add", - "SORT": "Sort", "REMOVE": "Remove", "YES_REMOVE": "Yes, remove", - "CONFIRM_REMOVE": "Confirm removal", "REMOVE_FROM_COLLECTION": "Remove from album", "TRASH": "Trash", "MOVE_TO_TRASH": "Move to trash", @@ -361,8 +304,6 @@ "TRASH_FILE_MESSAGE": "The file will be removed from all albums and moved to trash.", "DELETE_PERMANENTLY": "Delete permanently", "RESTORE": "Restore", - "CONFIRM_RESTORE": "Confirm restoration", - "RESTORE_MESSAGE": "Restore selected files ?", "RESTORE_TO_COLLECTION": "Restore to album", "EMPTY_TRASH": "Empty trash", "EMPTY_TRASH_TITLE": "Empty trash?", @@ -375,7 +316,6 @@ "CONFIRM_SELF_REMOVE_MESSAGE": "Selected items will be removed from this album. Items which are only in this album will be moved to Uncategorized.", "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "Some of the items you are removing were added by other people, and you will lose access to them.", "SORT_BY_CREATION_TIME_ASCENDING": "Oldest", - "SORT_BY_CREATION_TIME_DESCENDING": "Newest", "SORT_BY_UPDATION_TIME_DESCENDING": "Last updated", "SORT_BY_NAME": "Name", "COMPRESS_THUMBNAILS": "Compress thumbnails", @@ -392,22 +332,13 @@ "UPDATE_CREATION_TIME_NOT_STARTED": "Select the option you want to use", "UPDATE_CREATION_TIME_COMPLETED": "Successfully updated all files", "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "File time updation failed for some files, please retry", - "FILE_NAME_CHARACTER_LIMIT": "100 characters max", "CAPTION_CHARACTER_LIMIT": "5000 characters max", "DATE_TIME_ORIGINAL": "EXIF:DateTimeOriginal", "DATE_TIME_DIGITIZED": "EXIF:DateTimeDigitized", "CUSTOM_TIME": "Custom time", "REOPEN_PLAN_SELECTOR_MODAL": "Re-open plans", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Failed to open plans", - "COMMENT": "Comment", - "ABUSE_REPORT_DESCRIPTION": "Submitting this report will notify the album owner.", - "OTHER_REASON_REQUIRES_COMMENTS": "Reason = other, require a mandatory comment ", - "REPORT_SUBMIT_SUCCESS_CONTENT": "Your report has been submitted", - "REPORT_SUBMIT_SUCCESS_TITLE": "Report sent", - "REPORT_SUBMIT_FAILED": "Failed to sent report, try again", "INSTALL": "Install", - "ALBUM_URL": "Album url", - "PUBLIC_SHARING": "Public link", "SHARING_DETAILS": "Sharing details", "MODIFY_SHARING": "Modify sharing", "NOT_FOUND": "404 - not found", @@ -415,8 +346,6 @@ "LINK_EXPIRED_MESSAGE": "This link has either expired or been disabled!", "MANAGE_LINK": "Manage link", "LINK_TOO_MANY_REQUESTS": "This album is too popular for us to handle!", - "DISABLE_PUBLIC_SHARING": "Disable public sharing", - "DISABLE_PUBLIC_SHARING_MESSAGE": "Are you sure you want to disable public sharing?", "FILE_DOWNLOAD": "Allow downloads", "LINK_PASSWORD_LOCK": "Password lock", "PUBLIC_COLLECT": "Allow adding photos", @@ -425,26 +354,8 @@ "LINK_EXPIRY_NEVER": "Never", "DISABLE_FILE_DOWNLOAD": "Disable download", "DISABLE_FILE_DOWNLOAD_MESSAGE": "

Are you sure that you want to disable the download button for files?

Viewers can still take screenshots or save a copy of your photos using external tools.

", - "ABUSE_REPORT": "Abuse report", - "ABUSE_REPORT_BUTTON_TEXT": "Report abuse?", "MALICIOUS_CONTENT": "Contains malicious content", "COPYRIGHT": "Infringes on the copyright of someone I am authorized to represent", - "ENTER_EMAIL_ADDRESS": "Email*", - "SELECT_REASON": "Select a reason*", - "ENTER_FULL_NAME": "Full name*", - "ENTER_DIGITAL_SIGNATURE": "Typing your full name in this box will act as your digital signature*", - "ENTER_ON_BEHALF_OF": "I am reporting on behalf of*", - "ENTER_ADDRESS": "Address*", - "ENTER_JOB_TITLE": "Job title*", - "ENTER_CITY": "City*", - "ENTER_PHONE": "Phone number*", - "ENTER_STATE": "State*", - "ENTER_POSTAL_CODE": "Zip/postal code*", - "ENTER_COUNTRY": "Country*", - "JUDICIAL_DESCRIPTION": "By checking the following boxes, I state UNDER PENALTY OF PERJURY of law that:", - "TERM_1": "I hereby state that I have a good faith belief that the sharing of copyrighted material at the location above is not authorized by the copyright owner, its agent, or the law (e.g., as a fair use). ", - "TERM_2": "I hereby state that the information in this Notice is accurate and, under penalty of perjury, that I am the owner, or authorized to act on behalf of, the owner, of the copyright or of an exclusive right under the copyright that is allegedly infringed. ", - "TERM_3": "I acknowledge that any person who knowingly materially misrepresents that material or activity is infringing may be subject to liability for damages. ", "SHARED_USING": "Shared using ", "ENTE_IO": "ente.io", "LIVE": "LIVE", @@ -453,11 +364,9 @@ "PASSWORD_LOCK": "Password lock", "LOCK": "Lock", "DOWNLOAD_UPLOAD_LOGS": "Debug logs", - "CHOOSE_UPLOAD_TYPE": "Upload", "UPLOAD_FILES": "File", "UPLOAD_DIRS": "Folder", "UPLOAD_GOOGLE_TAKEOUT": "Google takeout", - "CANCEL_UPLOADS": "Cancel uploads", "DEDUPLICATE_FILES": "Deduplicate files", "AUTHENTICATOR_SECTION": "Authenticator", "NO_DUPLICATES_FOUND": "You've no duplicate files that can be cleared", @@ -471,11 +380,8 @@ "YES_STOP_UPLOADS": "Yes, stop uploads", "albums_one": "1 Album", "albums_other": "{{count}} Albums", - "NEW": "New", - "VIEW_ALL_ALBUMS": "View all Albums", "ALL_ALBUMS": "All Albums", "ALBUMS": "Albums", - "ENDS": "Ends", "ENTER_TWO_FACTOR_OTP": "Enter the 6-digit code from your authenticator app.", "CREATE_ACCOUNT": "Create account", "COPIED": "Copied", @@ -531,7 +437,6 @@ "IGNORE_THIS_VERSION": "Ignore this version", "TODAY": "Today", "YESTERDAY": "Yesterday", - "AT": "at", "NAME_PLACEHOLDER": "Name...", "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "Cannot create albums from file/folder mix", "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

You have dragged and dropped a mixture of files and folders.

Please provide either only files, or only folders when selecting option to create separate albums

", @@ -550,7 +455,9 @@ "FACE_SEARCH_CONFIRMATION": "I understand, and wish to allow ente to process face geometry", "LABS": "Labs", "YOURS": "yours", - "PASSPHRASE_STRENGTH": "Password strength: {{passwordStrength}}", + "PASSPHRASE_STRENGTH_WEAK": "Password strength: Weak", + "PASSPHRASE_STRENGTH_MODERATE": "Password strength: Moderate", + "PASSPHRASE_STRENGTH_STRONG": "Password strength: Strong", "PREFERENCES": "Preferences", "LANGUAGE": "Language", "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Invalid export directory", @@ -569,5 +476,27 @@ "WEEK": "after a week", "MONTH": "after a month", "YEAR": "after a year" - } -} \ No newline at end of file + }, + "COPY_LINK": "Copy link", + "DONE": "Done", + "ADD_EMAIL_TITLE": "Share with specific people", + "LINK_SHARE_TITLE": "Or share a link", + "REMOVE_LINK": "Remove link", + "CREATE_PUBLIC_SHARING": "Create public link", + "PUBLIC_LINK_CREATED": "Public link created", + "PUBLIC_LINK_ENABLED": "Public link enabled", + "COLLECT_PHOTOS": "Collect photos", + "PUBLIC_COLLECT_SUBTEXT": "Allow people with the link to also add photos to the shared album.", + "STOP_EXPORT": "Stop", + "EXPORT_PROGRESS": "{{progress.current}} / {{progress.total}} files exported", + "EXPORT_NOTIFICATION": { + "START": "Export started", + "IN_PROGRESS": "Export already in progress", + "FINISH": "Export finished", + "UP_TO_DATE": "No new files to export" + }, + "CONTINUOUS_EXPORT": "Sync continuously", + "TOTAL_ITEMS": "Total items", + "PENDING_ITEMS": "Pending items", + "EXPORT_STARTING": "Export starting..." +} diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json new file mode 100644 index 000000000..280e51edf --- /dev/null +++ b/public/locales/es/translation.json @@ -0,0 +1,592 @@ +{ + "HERO_SLIDE_1_TITLE": "", + "HERO_SLIDE_1": "", + "HERO_SLIDE_2_TITLE": "", + "HERO_SLIDE_2": "", + "HERO_SLIDE_3_TITLE": "", + "HERO_SLIDE_3": "", + "LOGIN": "", + "SIGN_UP": "", + "NEW_USER": "", + "EXISTING_USER": "", + "NAME": "", + "ENTER_NAME": "", + "PUBLIC_UPLOADER_NAME_MESSAGE": "", + "EMAIL": "", + "ENTER_EMAIL": "", + "DATA_DISCLAIMER": "", + "SUBMIT": "", + "EMAIL_ERROR": "", + "REQUIRED": "", + "VERIFY_EMAIL": "", + "EMAIL_SENT": "", + "CHECK_INBOX": "", + "ENTER_OTT": "", + "RESEND_MAIL": "", + "VERIFY": "", + "UNKNOWN_ERROR": "", + "INVALID_CODE": "", + "EXPIRED_CODE": "", + "SENDING": "", + "SENT": "", + "PASSWORD": "", + "LINK_PASSWORD": "", + "ENTER_PASSPHRASE": "", + "RETURN_PASSPHRASE_HINT": "", + "SET_PASSPHRASE": "", + "VERIFY_PASSPHRASE": "", + "INCORRECT_PASSPHRASE": "", + "ENTER_ENC_PASSPHRASE": "", + "PASSPHRASE_DISCLAIMER": "", + "WELCOME_TO_ENTE_HEADING": "", + "WELCOME_TO_ENTE_SUBHEADING": "", + "WHERE_YOUR_BEST_PHOTOS_LIVE": "", + "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", + "PASSPHRASE_HINT": "", + "CONFIRM_PASSPHRASE": "", + "PASSPHRASE_MATCH_ERROR": "", + "CONSOLE_WARNING_STOP": "", + "CONSOLE_WARNING_DESC": "", + "SELECT_COLLECTION": "", + "CREATE_COLLECTION": "", + "ENTER_ALBUM_NAME": "", + "CLOSE_OPTION": "", + "ENTER_FILE_NAME": "", + "CLOSE": "", + "NO": "", + "NOTHING_HERE": "", + "UPLOAD": "", + "IMPORT": "", + "ADD_PHOTOS": "", + "ADD_MORE_PHOTOS": "", + "add_photos_one": "", + "add_photos_other": "", + "SELECT_PHOTOS": "", + "FILE_UPLOAD": "", + "UPLOAD_STAGE_MESSAGE": { + "0": "", + "1": "", + "2": "", + "3": "", + "4": "", + "5": "" + }, + "UPLOADING_FILES": "", + "FILE_NOT_UPLOADED_LIST": "", + "SUBSCRIPTION_EXPIRED": "", + "SUBSCRIPTION_EXPIRED_MESSAGE": "", + "STORAGE_QUOTA_EXCEEDED": "", + "INITIAL_LOAD_DELAY_WARNING": "", + "USER_DOES_NOT_EXIST": "", + "UPLOAD_BUTTON_TEXT": "", + "NO_ACCOUNT": "", + "ACCOUNT_EXISTS": "", + "ALBUM_NAME": "", + "CREATE": "", + "DOWNLOAD": "", + "DOWNLOAD_OPTION": "", + "DOWNLOAD_FAVORITES": "", + "DOWNLOAD_UNCATEGORIZED": "", + "COPY_OPTION": "", + "TOGGLE_FULLSCREEN": "", + "ZOOM_IN_OUT": "", + "PREVIOUS": "", + "NEXT": "", + "NO_INTERNET_CONNECTION": "", + "TITLE": "", + "UPLOAD_FIRST_PHOTO": "", + "IMPORT_YOUR_FOLDERS": "", + "UPLOAD_DROPZONE_MESSAGE": "", + "WATCH_FOLDER_DROPZONE_MESSAGE": "", + "TRASH_FILES_TITLE": "", + "TRASH_FILE_TITLE": "", + "DELETE_FILES_TITLE": "", + "DELETE_FILES_MESSAGE": "", + "DELETE_FILE": "", + "DELETE": "", + "DELETE_OPTION": "", + "FAVORITE": "", + "FAVORITE_OPTION": "", + "UNFAVORITE_OPTION": "", + "UNFAVORITE": "", + "MULTI_FOLDER_UPLOAD": "", + "UPLOAD_STRATEGY_CHOICE": "", + "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", + "OR": "", + "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", + "SESSION_EXPIRED_MESSAGE": "", + "SESSION_EXPIRED": "", + "SYNC_FAILED": "", + "PASSWORD_GENERATION_FAILED": "", + "CHANGE_PASSWORD": "", + "GO_BACK": "", + "RECOVERY_KEY": "", + "SAVE_LATER": "", + "SAVE": "", + "RECOVERY_KEY_DESCRIPTION": "", + "RECOVER_KEY_GENERATION_FAILED": "", + "KEY_NOT_STORED_DISCLAIMER": "", + "FORGOT_PASSWORD": "", + "RECOVER_ACCOUNT": "", + "RECOVERY_KEY_HINT": "", + "RECOVER": "", + "NO_RECOVERY_KEY": "", + "INCORRECT_RECOVERY_KEY": "", + "SORRY": "", + "NO_RECOVERY_KEY_MESSAGE": "", + "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", + "CONTACT_SUPPORT": "", + "REQUEST_FEATURE": "", + "SUPPORT": "", + "CONFIRM": "", + "SKIP_SUBSCRIPTION_PURCHASE": "", + "CANCEL": "", + "LOGOUT": "", + "DELETE_ACCOUNT": "", + "DELETE_ACCOUNT_MESSAGE": "", + "LOGOUT_MESSAGE": "", + "CHANGE": "", + "CHANGE_EMAIL": "", + "OK": "", + "SUCCESS": "", + "ERROR": "", + "MESSAGE": "", + "INSTALL_MOBILE_APP": "", + "DOWNLOAD_APP_MESSAGE": "", + "DOWNLOAD_APP": "", + "EXPORT": "", + "SUBSCRIPTION": "", + "SUBSCRIBE": "", + "SUBSCRIPTION_PLAN": "", + "USAGE_DETAILS": "", + "MANAGE": "", + "MANAGEMENT_PORTAL": "", + "MANAGE_FAMILY_PORTAL": "", + "LEAVE_FAMILY_PLAN": "", + "LEAVE": "", + "LEAVE_FAMILY_CONFIRM": "", + "CHOOSE_PLAN": "", + "MANAGE_PLAN": "", + "ACTIVE": "", + "OFFLINE_MSG": "", + "FREE_SUBSCRIPTION_INFO": "", + "FAMILY_SUBSCRIPTION_INFO": "", + "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", + "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", + "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", + "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", + "SUBSCRIPTION_PURCHASE_SUCCESS": "", + "SUBSCRIPTION_PURCHASE_CANCELLED": "", + "SUBSCRIPTION_VERIFICATION_FAILED": "", + "SUBSCRIPTION_PURCHASE_FAILED": "", + "SUBSCRIPTION_UPDATE_FAILED": "", + "UPDATE_PAYMENT_METHOD_MESSAGE": "", + "STRIPE_AUTHENTICATION_FAILED": "", + "UPDATE_PAYMENT_METHOD": "", + "MONTHLY": "", + "YEARLY": "", + "UPDATE_SUBSCRIPTION_MESSAGE": "", + "UPDATE_SUBSCRIPTION": "", + "CANCEL_SUBSCRIPTION": "", + "CANCEL_SUBSCRIPTION_MESSAGE": "", + "SUBSCRIPTION_CANCEL_FAILED": "", + "SUBSCRIPTION_CANCEL_SUCCESS": "", + "REACTIVATE_SUBSCRIPTION": "", + "REACTIVATE_SUBSCRIPTION_MESSAGE": "", + "SUBSCRIPTION_ACTIVATE_SUCCESS": "", + "SUBSCRIPTION_ACTIVATE_FAILED": "", + "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", + "CANCEL_SUBSCRIPTION_ON_MOBILE": "", + "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", + "MAIL_TO_MANAGE_SUBSCRIPTION": "", + "RENAME": "", + "RENAME_FILE": "", + "RENAME_COLLECTION": "", + "DELETE_COLLECTION_TITLE": "", + "DELETE_COLLECTION": "", + "DELETE_COLLECTION_FAILED": "", + "DELETE_COLLECTION_MESSAGE": "", + "DELETE_PHOTOS": "", + "KEEP_PHOTOS": "", + "SHARE": "", + "SHARE_COLLECTION": "", + "SHARE_WITH_PEOPLE": "", + "SHAREES": "", + "PUBLIC_URL": "", + "SHARE_WITH_SELF": "", + "ALREADY_SHARED": "", + "SHARING_BAD_REQUEST_ERROR": "", + "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", + "DOWNLOAD_COLLECTION": "", + "DOWNLOAD_COLLECTION_MESSAGE": "", + "DOWNLOAD_COLLECTION_FAILED": "", + "CREATE_ALBUM_FAILED": "", + "SEARCH_RESULTS": "", + "SEARCH_HINT": "", + "SEARCH_TYPE": { + "COLLECTION": "", + "LOCATION": "", + "DATE": "", + "FILE_NAME": "", + "THING": "", + "FILE_CAPTION": "" + }, + "photos_count_zero": "", + "photos_count_one": "", + "photos_count_other": "", + "TERMS_AND_CONDITIONS": "", + "CONFIRM_PASSWORD_NOT_SAVED": "", + "ADD_TO_COLLECTION": "", + "SELECTED": "", + "VIDEO_PLAYBACK_FAILED": "", + "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", + "PEOPLE": "", + "INDEXING_SCHEDULED": "", + "ANALYZING_PHOTOS": "", + "INDEXING_PEOPLE": "", + "INDEXING_DONE": "", + "UNIDENTIFIED_FACES": "", + "OBJECTS": "", + "TEXT": "", + "METADATA": "", + "INFO": "", + "INFO_OPTION": "", + "FILE_ID": "", + "FILE_NAME": "", + "CAPTION": "", + "CAPTION_PLACEHOLDER": "", + "CREATION_TIME": "", + "UPDATED_ON": "", + "LOCATION": "", + "SHOW_ON_MAP": "", + "DETAILS": "", + "VIEW_EXIF": "", + "NO_EXIF": "", + "EXIF": "", + "DEVICE": "", + "IMAGE_SIZE": "", + "FLASH": "", + "FOCAL_LENGTH": "", + "APERTURE": "", + "ISO": "", + "SHOW_ALL": "", + "TWO_FACTOR": "", + "TWO_FACTOR_AUTHENTICATION": "", + "TWO_FACTOR_QR_INSTRUCTION": "", + "ENTER_CODE_MANUALLY": "", + "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", + "SCAN_QR_CODE": "", + "CONTINUE": "", + "BACK": "", + "ENABLE_TWO_FACTOR": "", + "ENABLE": "", + "LOST_DEVICE": "", + "INCORRECT_CODE": "", + "RECOVER_TWO_FACTOR": "", + "TWO_FACTOR_INFO": "", + "DISABLE_TWO_FACTOR_LABEL": "", + "UPDATE_TWO_FACTOR_LABEL": "", + "DISABLE": "", + "RECONFIGURE": "", + "UPDATE_TWO_FACTOR": "", + "UPDATE_TWO_FACTOR_MESSAGE": "", + "UPDATE": "", + "DISABLE_TWO_FACTOR": "", + "DISABLE_TWO_FACTOR_MESSAGE": "", + "TWO_FACTOR_SETUP_FAILED": "", + "TWO_FACTOR_SETUP_SUCCESS": "", + "TWO_FACTOR_DISABLE_SUCCESS": "", + "TWO_FACTOR_DISABLE_FAILED": "", + "EXPORT_DATA": "", + "SELECT_FOLDER": "", + "DESTINATION": "", + "START": "", + "EXPORT_IN_PROGRESS": "", + "PAUSE": "", + "RESUME": "", + "MINIMIZE": "", + "LAST_EXPORT_TIME": "", + "SUCCESSFULLY_EXPORTED_FILES": "", + "FAILED_EXPORTED_FILES": "", + "EXPORT_AGAIN": "", + "RETRY_EXPORT": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", + "RETRY": "", + "SEND_OTT": "", + "EMAIl_ALREADY_OWNED": "", + "EMAIL_UDPATE_SUCCESSFUL": "", + "UPLOAD_FAILED": "", + "ETAGS_BLOCKED": "", + "SKIPPED_VIDEOS_INFO": "", + "LIVE_PHOTOS_DETECTED": "", + "RETRY_FAILED": "", + "FAILED_UPLOADS": "", + "SKIPPED_FILES": "", + "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", + "UNSUPPORTED_FILES": "", + "SUCCESSFUL_UPLOADS": "", + "SKIPPED_INFO": "", + "UNSUPPORTED_INFO": "", + "BLOCKED_UPLOADS": "", + "SKIPPED_VIDEOS": "", + "INPROGRESS_METADATA_EXTRACTION": "", + "INPROGRESS_UPLOADS": "", + "TOO_LARGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", + "TOO_LARGE_INFO": "", + "THUMBNAIL_GENERATION_FAILED_INFO": "", + "UPLOAD_TO_COLLECTION": "", + "UNCATEGORIZED": "", + "MOVE_TO_UNCATEGORIZED": "", + "ARCHIVE": "", + "ARCHIVE_COLLECTION": "", + "ARCHIVE_SECTION_NAME": "", + "ALL_SECTION_NAME": "", + "MOVE_TO_COLLECTION": "", + "UNARCHIVE": "", + "UNARCHIVE_COLLECTION": "", + "MOVE": "", + "ADD": "", + "SORT": "", + "REMOVE": "", + "YES_REMOVE": "", + "CONFIRM_REMOVE": "", + "REMOVE_FROM_COLLECTION": "", + "TRASH": "", + "MOVE_TO_TRASH": "", + "TRASH_FILES_MESSAGE": "", + "TRASH_FILE_MESSAGE": "", + "DELETE_PERMANENTLY": "", + "RESTORE": "", + "CONFIRM_RESTORE": "", + "RESTORE_MESSAGE": "", + "RESTORE_TO_COLLECTION": "", + "EMPTY_TRASH": "", + "EMPTY_TRASH_TITLE": "", + "EMPTY_TRASH_MESSAGE": "", + "LEAVE_SHARED_ALBUM": "", + "LEAVE_ALBUM": "", + "LEAVE_SHARED_ALBUM_TITLE": "", + "LEAVE_SHARED_ALBUM_MESSAGE": "", + "NOT_FILE_OWNER": "", + "CONFIRM_SELF_REMOVE_MESSAGE": "", + "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", + "SORT_BY_CREATION_TIME_ASCENDING": "", + "SORT_BY_CREATION_TIME_DESCENDING": "", + "SORT_BY_UPDATION_TIME_DESCENDING": "", + "SORT_BY_NAME": "", + "COMPRESS_THUMBNAILS": "", + "THUMBNAIL_REPLACED": "", + "FIX_THUMBNAIL": "", + "FIX_THUMBNAIL_LATER": "", + "REPLACE_THUMBNAIL_NOT_STARTED": "", + "REPLACE_THUMBNAIL_COMPLETED": "", + "REPLACE_THUMBNAIL_NOOP": "", + "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", + "FIX_CREATION_TIME": "", + "FIX_CREATION_TIME_IN_PROGRESS": "", + "CREATION_TIME_UPDATED": "", + "UPDATE_CREATION_TIME_NOT_STARTED": "", + "UPDATE_CREATION_TIME_COMPLETED": "", + "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", + "FILE_NAME_CHARACTER_LIMIT": "", + "CAPTION_CHARACTER_LIMIT": "", + "DATE_TIME_ORIGINAL": "", + "DATE_TIME_DIGITIZED": "", + "CUSTOM_TIME": "", + "REOPEN_PLAN_SELECTOR_MODAL": "", + "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", + "COMMENT": "", + "ABUSE_REPORT_DESCRIPTION": "", + "OTHER_REASON_REQUIRES_COMMENTS": "", + "REPORT_SUBMIT_SUCCESS_CONTENT": "", + "REPORT_SUBMIT_SUCCESS_TITLE": "", + "REPORT_SUBMIT_FAILED": "", + "INSTALL": "", + "ALBUM_URL": "", + "SHARING_DETAILS": "", + "MODIFY_SHARING": "", + "NOT_FOUND": "", + "LINK_EXPIRED": "", + "LINK_EXPIRED_MESSAGE": "", + "MANAGE_LINK": "", + "LINK_TOO_MANY_REQUESTS": "", + "DISABLE_PUBLIC_SHARING": "", + "DISABLE_PUBLIC_SHARING_MESSAGE": "", + "FILE_DOWNLOAD": "", + "LINK_PASSWORD_LOCK": "", + "PUBLIC_COLLECT": "", + "LINK_DEVICE_LIMIT": "", + "LINK_EXPIRY": "", + "LINK_EXPIRY_NEVER": "", + "DISABLE_FILE_DOWNLOAD": "", + "DISABLE_FILE_DOWNLOAD_MESSAGE": "", + "ABUSE_REPORT": "", + "ABUSE_REPORT_BUTTON_TEXT": "", + "MALICIOUS_CONTENT": "", + "COPYRIGHT": "", + "ENTER_EMAIL_ADDRESS": "", + "SELECT_REASON": "", + "ENTER_FULL_NAME": "", + "ENTER_DIGITAL_SIGNATURE": "", + "ENTER_ON_BEHALF_OF": "", + "ENTER_ADDRESS": "", + "ENTER_JOB_TITLE": "", + "ENTER_CITY": "", + "ENTER_PHONE": "", + "ENTER_STATE": "", + "ENTER_POSTAL_CODE": "", + "ENTER_COUNTRY": "", + "JUDICIAL_DESCRIPTION": "", + "TERM_1": "", + "TERM_2": "", + "TERM_3": "", + "SHARED_USING": "", + "ENTE_IO": "", + "LIVE": "", + "DISABLE_PASSWORD": "", + "DISABLE_PASSWORD_MESSAGE": "", + "PASSWORD_LOCK": "", + "LOCK": "", + "DOWNLOAD_UPLOAD_LOGS": "", + "CHOOSE_UPLOAD_TYPE": "", + "UPLOAD_FILES": "", + "UPLOAD_DIRS": "", + "UPLOAD_GOOGLE_TAKEOUT": "", + "CANCEL_UPLOADS": "", + "DEDUPLICATE_FILES": "", + "NO_DUPLICATES_FOUND": "", + "CLUB_BY_CAPTURE_TIME": "", + "FILES": "", + "EACH": "", + "DEDUPLICATE_BASED_ON_SIZE": "", + "DEDUPLICATE_BASED_ON_SIZE_AND_CAPTURE_TIME": "", + "STOP_ALL_UPLOADS_MESSAGE": "", + "STOP_UPLOADS_HEADER": "", + "YES_STOP_UPLOADS": "", + "albums_one": "", + "albums_other": "", + "NEW": "", + "VIEW_ALL_ALBUMS": "", + "ALL_ALBUMS": "", + "ALBUMS": "", + "ENDS": "", + "ENTER_TWO_FACTOR_OTP": "", + "CREATE_ACCOUNT": "", + "COPIED": "", + "CANVAS_BLOCKED_TITLE": "", + "CANVAS_BLOCKED_MESSAGE": "", + "WATCH_FOLDERS": "", + "UPGRADE_NOW": "", + "RENEW_NOW": "", + "STORAGE": "", + "USED": "", + "YOU": "", + "FAMILY": "", + "FREE": "", + "OF": "", + "WATCHED_FOLDERS": "", + "NO_FOLDERS_ADDED": "", + "FOLDERS_AUTOMATICALLY_MONITORED": "", + "UPLOAD_NEW_FILES_TO_ENTE": "", + "REMOVE_DELETED_FILES_FROM_ENTE": "", + "ADD_FOLDER": "", + "STOP_WATCHING": "", + "STOP_WATCHING_FOLDER": "", + "STOP_WATCHING_DIALOG_MESSAGE": "", + "YES_STOP": "", + "MONTH_SHORT": "", + "YEAR": "", + "FAMILY_PLAN": "", + "DOWNLOAD_LOGS": "", + "DOWNLOAD_LOGS_MESSAGE": "", + "CHANGE_FOLDER": "", + "TWO_MONTHS_FREE": "", + "GB": "", + "POPULAR": "", + "FREE_PLAN_OPTION_LABEL": "", + "FREE_PLAN_DESCRIPTION": "", + "CURRENT_USAGE": "", + "WEAK_DEVICE": "", + "DRAG_AND_DROP_HINT": "", + "ASK_FOR_FEEDBACK": "", + "SEND_FEEDBACK": "", + "CONFIRM_ACCOUNT_DELETION_TITLE": "", + "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", + "AUTHENTICATE": "", + "UPLOADED_TO_SINGLE_COLLECTION": "", + "UPLOADED_TO_SEPARATE_COLLECTIONS": "", + "NEVERMIND": "", + "UPDATE_AVAILABLE": "", + "UPDATE_INSTALLABLE_MESSAGE": "", + "INSTALL_NOW": "", + "INSTALL_ON_NEXT_LAUNCH": "", + "UPDATE_AVAILABLE_MESSAGE": "", + "DOWNLOAD_AND_INSTALL": "", + "IGNORE_THIS_VERSION": "", + "TODAY": "", + "YESTERDAY": "", + "AT": "", + "NAME_PLACEHOLDER": "", + "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", + "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", + "CHOSE_THEME": "", + "ML_SEARCH": "", + "ENABLE_ML_SEARCH_DESCRIPTION": "", + "ML_MORE_DETAILS": "", + "ENABLE_FACE_SEARCH": "", + "ENABLE_FACE_SEARCH_TITLE": "", + "ENABLE_FACE_SEARCH_DESCRIPTION": "", + "DISABLE_BETA": "", + "DISABLE_FACE_SEARCH": "", + "DISABLE_FACE_SEARCH_TITLE": "", + "DISABLE_FACE_SEARCH_DESCRIPTION": "", + "ADVANCED": "", + "FACE_SEARCH_CONFIRMATION": "", + "LABS": "", + "YOURS": "", + "PASSPHRASE_STRENGTH": "", + "PREFERENCES": "", + "LANGUAGE": "", + "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", + "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", + "SUBSCRIPTION_VERIFICATION_ERROR": "", + "STORAGE_UNITS": { + "B": "", + "KB": "", + "MB": "", + "GB": "", + "TB": "" + }, + "AFTER_TIME": { + "HOUR": "", + "DAY": "", + "WEEK": "", + "MONTH": "", + "YEAR": "" + }, + "COPY_LINK": "", + "DONE": "", + "ADD_EMAIL_TITLE": "", + "LINK_SHARE_TITLE": "", + "REMOVE_LINK": "", + "CREATE_PUBLIC_SHARING": "", + "PUBLIC_LINK_CREATED": "", + "PUBLIC_LINK_ENABLED": "", + "COLLECT_PHOTOS": "", + "PUBLIC_COLLECT_SUBTEXT": "", + "STOP_EXPORT": "", + "EXPORT_PROGRESS": "", + "EXPORT_NOTIFICATION": { + "START": "", + "IN_PROGRESS": "", + "FINISH": "", + "UP_TO_DATE": "" + }, + "CONTINUOUS_EXPORT": "", + "TOTAL_ITEMS": "", + "PENDING_ITEMS": "", + "EXPORT_STARTING": "" +} \ No newline at end of file diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 90d6f81da..5c50ddb60 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -1,7 +1,7 @@ { - "HERO_SLIDE_1_TITLE": "
Sauvegardes personnelles
de vos souvenirs
", + "HERO_SLIDE_1_TITLE": "
Sauvegardes personnelles
de vos souvenirs
", "HERO_SLIDE_1": "Chiffrement de bout en bout par défaut", - "HERO_SLIDE_2_TITLE": "
Sécurisé
dans un abri antiatomique
", + "HERO_SLIDE_2_TITLE": "
Sécurisé
dans un abri antiatomique
", "HERO_SLIDE_2": "Conçu pour survivre", "HERO_SLIDE_3_TITLE": "
Disponible
partout
", "HERO_SLIDE_3": "Android, iOS, Web, Ordinateur", @@ -19,10 +19,10 @@ "EMAIL_ERROR": "Saisir un e-mail valide", "REQUIRED": "Nécessaire", "VERIFY_EMAIL": "Vérifier l'e-mail", - "EMAIL_SENT": "Verification code sent to {{emailID}}", + "EMAIL_SENT": "Verification code sent to {{email}}", "CHECK_INBOX": "Veuillez consulter votre boite de réception (et indésirables) pour poursuivre la vérification", "ENTER_OTT": "Code de vérification", - "RESEND_MAIL": "envoyer le code", + "RESEND_MAIL": "Envoyer le code", "VERIFY": "Vérifier", "UNKNOWN_ERROR": "Quelque chose s'est mal passé, veuillez recommencer", "INVALID_CODE": "Code de vérification non valide", @@ -37,7 +37,7 @@ "VERIFY_PASSPHRASE": "Connexion", "INCORRECT_PASSPHRASE": "Mot de passe non valide", "ENTER_ENC_PASSPHRASE": "Veuillez saisir un mot de passe que nous pourrons utiliser pour chiffrer vos données", - "PASSPHRASE_DISCLAIMER": "Nous ne stockons pas votre mot de passe, donc si vous le perdez, nous ne pourrons pas vous aider à récupérer vosdonnées sans une clé de récupération.", + "PASSPHRASE_DISCLAIMER": "Nous ne stockons pas votre mot de passe, donc si vous le perdez, nous ne pourrons pas vous aider à récupérer vos données sans une clé de récupération.", "WELCOME_TO_ENTE_HEADING": "Bienvenue sur ", "WELCOME_TO_ENTE_SUBHEADING": "Stockage et partage photo avec cryptage de bout en bout", "WHERE_YOUR_BEST_PHOTOS_LIVE": "Là où vivent vos meilleures photos", @@ -56,23 +56,25 @@ "NO": "Non", "NOTHING_HERE": "Il n'y a encore rien à voir ici 👀", "UPLOAD": "Charger", - "IMPORT": "Import", + "IMPORT": "Importer", "ADD_PHOTOS": "Ajouter des photos", "ADD_MORE_PHOTOS": "Ajouter plus de photos", + "add_photos_one": "Ajouter une photo", + "add_photos_other": "Ajouter {{count}} photos", "SELECT_PHOTOS": "Sélectionner des photos", "FILE_UPLOAD": "Fichier chargé", "UPLOAD_STAGE_MESSAGE": { "0": "Préparation du chargement", "1": "Lire les fichiers métadonnées de Google", - "2": "{{uploadCounter.finished}} / {{uploadCounter.total}} files metadata extracted", - "3": "{{uploadCounter.finished}} / {{uploadCounter.total}} files backed up", + "2": "Métadonnées des fichiers {{uploadCounter.finished}} / {{uploadCounter.total}} extraites", + "3": "{{uploadCounter.finished}} / {{uploadCounter.total}} fichiers sauvegardés", "4": "Annulation des chargements restants", "5": "Sauvegarde terminée" }, "UPLOADING_FILES": "Chargement de fichiers", "FILE_NOT_UPLOADED_LIST": "Les fichiers suivants n'ont pas été chargés", "SUBSCRIPTION_EXPIRED": "Abonnement expiré", - "SUBSCRIPTION_EXPIRED_MESSAGE": "Votre abonnement a expiré, veuillezle renouvelleer", + "SUBSCRIPTION_EXPIRED_MESSAGE": "Votre abonnement a expiré, veuillez le renouveler ", "STORAGE_QUOTA_EXCEEDED": "Limite de stockage atteinte", "INITIAL_LOAD_DELAY_WARNING": "La première consultation peut prendre du temps", "USER_DOES_NOT_EXIST": "Désolé, impossible de trouver un utilisateur avec cet e-mail", @@ -93,7 +95,7 @@ "NO_INTERNET_CONNECTION": "Veuillez vérifier votre connexion internet puis réessayer", "TITLE": "ente Photos", "UPLOAD_FIRST_PHOTO": "Chargez votre 1ere photo", - "IMPORT_YOUR_FOLDERS": "Import your folders", + "IMPORT_YOUR_FOLDERS": "Importez vos dossiers", "UPLOAD_DROPZONE_MESSAGE": "Déposez pour sauvegarder vos fichiers", "WATCH_FOLDER_DROPZONE_MESSAGE": "Déposez pour ajouter un dossier surveillé", "TRASH_FILES_TITLE": "Supprimer les fichiers?", @@ -128,11 +130,11 @@ "RECOVER_ACCOUNT": "Récupérer le compte", "RECOVERY_KEY_HINT": "Clé de récupération", "RECOVER": "Récupérer", - "NO_RECOVERY_KEY": "Pas de clé de récuparation?", + "NO_RECOVERY_KEY": "Pas de clé de récupération?", "INCORRECT_RECOVERY_KEY": "Clé de récupération non valide", "SORRY": "Désolé", "NO_RECOVERY_KEY_MESSAGE": "En raison de notre protocole de chiffrement de bout en bout, vos données ne peuvent être décryptées sans votre mot de passe ou clé de récupération", - "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Veuillez envoyer un e-mail à{{emailID} depuis votre adresse enregistrée", + "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Veuillez envoyer un e-mail à {{emailID}} depuis votre adresse enregistrée", "CONTACT_SUPPORT": "Contacter le support", "REQUEST_FEATURE": "Soumettre une idée", "SUPPORT": "Support", @@ -141,11 +143,11 @@ "CANCEL": "Annuler", "LOGOUT": "Déconnexion", "DELETE_ACCOUNT": "Supprimer le compte", - "DELETE_ACCOUNT_MESSAGE": "

Veuillez envoyer un e-mail à <1>account-deletion@ente.io depuis votre adresse enregistrée.

Votre demande sera traitée dans les 72 heures.

", + "DELETE_ACCOUNT_MESSAGE": "

Veuillez envoyer un e-mail à {{emailID}}depuis Votre adresse enregistrée.

Votre demande sera traitée dans les 72 heures.

", "LOGOUT_MESSAGE": "Voulez-vous vraiment vous déconnecter?", "CHANGE": "Modifier", "CHANGE_EMAIL": "Modifier l'e-mail", - "OK": "OK", + "OK": "Ok", "SUCCESS": "Parfait", "ERROR": "Erreur", "MESSAGE": "Message", @@ -169,11 +171,11 @@ "OFFLINE_MSG": "Vous êtes hors-ligne, les mémoires cache sont affichées", "FREE_SUBSCRIPTION_INFO": "Vous êtes sur le plan gratuit qui expire le {{date, dateTime}}", "FAMILY_SUBSCRIPTION_INFO": "Vous êtes sur le plan famille géré par", - "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Renouveller le {{date, dateTime}}", + "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "Renouveler le {{date, dateTime}}", "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "Pris fin le {{date, dateTime}}", "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "Votre abonnement sera annulé le {{date, dateTime}}", - "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Vous avez dépassé votre quota de stockage,, veuillez mettre à niveau ", - "SUBSCRIPTION_PURCHASE_SUCCESS": "

Nous avons reçu votre paiement

Votre abonnement est valide jusqu'au {{date, dateTime}}

", + "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "Vous avez dépassé votre quota de stockage, veuillez mettre à niveau ", + "SUBSCRIPTION_PURCHASE_SUCCESS": "

Nous avons reçu votre paiement

Votre abonnement est valide jusqu'au {{date, dateTime}}

", "SUBSCRIPTION_PURCHASE_CANCELLED": "Votre achat est annulé, veuillez réessayer si vous souhaitez vous abonner", "SUBSCRIPTION_VERIFICATION_FAILED": "Nous ne sommes pas encore en mesure de vérifier votre achat, cela peut prendre quelques heures", "SUBSCRIPTION_PURCHASE_FAILED": "Échec lors de l'achat de l'abonnement, veuillez réessayer", @@ -211,7 +213,7 @@ "SHARE_WITH_PEOPLE": "Partager avec vos proches", "SHAREES": "Partager avec", "PUBLIC_URL": "Lien public", - "SHARE_WITH_SELF": "Oups, vous ne pouvez pas partager avec vous même", + "SHARE_WITH_SELF": "Oups, vous ne pouvez pas partager avec vous-même", "ALREADY_SHARED": "Oups, vous partager déjà cela avec {{email}}", "SHARING_BAD_REQUEST_ERROR": "Partage d'album non autorisé", "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Le partage est désactivé pour les comptes gratuits", @@ -230,22 +232,22 @@ "FILE_CAPTION": "Description" }, "photos_count_zero": "Pas de souvenirs", - "photos_count_one": "1 mémoire", + "photos_count_one": "1 souvenir", "photos_count_other": "{{count}} souvenirs", - "TERMS_AND_CONDITIONS": "I agree to the terms and privacy policy", + "TERMS_AND_CONDITIONS": "J'accepte les conditions et la politique de confidentialité", "CONFIRM_PASSWORD_NOT_SAVED": "

Je comprend que si je perd le mot de passe,je peux perdre mes données puisque mes données sont{' '}<1>chiffrées de bout en boutavec ente

", "ADD_TO_COLLECTION": "Ajouter à l'album", - "SELECTED": "sélectionné", + "SELECTED": "Sélectionné", "VIDEO_PLAYBACK_FAILED": "Le format vidéo n'est pas supporté", "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "Cette vidéo ne peut pas être lue sur votre navigateur", - "PEOPLE": "People", - "INDEXING_SCHEDULED": "indexing is scheduled...", - "ANALYZING_PHOTOS": "analyzing new photos {{indexStatus.nSyncedFiles}} of {{indexStatus.nTotalFiles}} done)...", - "INDEXING_PEOPLE": "indexing people in {{indexStatus.nSyncedFiles}} photos...", - "INDEXING_DONE": "indexed {{indexStatus.nSyncedFiles}} photos", - "UNIDENTIFIED_FACES": "unidentified faces", - "OBJECTS": "objects", - "TEXT": "text", + "PEOPLE": "Visages", + "INDEXING_SCHEDULED": "L'indexation est planifiée...", + "ANALYZING_PHOTOS": "analyse des nouvelles photos {{indexStatus.nSyncedFiles}} sur {{indexStatus.nTotalFiles}} effectué)...", + "INDEXING_PEOPLE": "indexation des visages dans {{indexStatus.nSyncedFiles}} photos...", + "INDEXING_DONE": "{{indexStatus.nSyncedFiles}} photos indexées", + "UNIDENTIFIED_FACES": "visages non-identifiés", + "OBJECTS": "objets", + "TEXT": "texte", "METADATA": "Metadonnées", "INFO": "Info ", "INFO_OPTION": "Info (I)", @@ -298,7 +300,6 @@ "EXPORT_DATA": "Exporter les données", "SELECT_FOLDER": "Sélectionner un dossier", "DESTINATION": "Destination", - "EXPORT_SIZE": "Taille d'export", "START": "Démarrer", "EXPORT_IN_PROGRESS": "Export en cours...", "PAUSE": "Pause", @@ -405,7 +406,6 @@ "REPORT_SUBMIT_FAILED": "Échec lors de l'envoi du commentaire, veuillez réessayer", "INSTALL": "Installer", "ALBUM_URL": "Lien de l'album", - "PUBLIC_SHARING": "Lien public", "SHARING_DETAILS": "Détails du partage", "MODIFY_SHARING": "Modifier le partage", "NOT_FOUND": "404 - non trouvé", @@ -454,11 +454,11 @@ "CHOOSE_UPLOAD_TYPE": "Charger", "UPLOAD_FILES": "Fichier", "UPLOAD_DIRS": "Dossier", - "UPLOAD_GOOGLE_TAKEOUT": "Google takeout", + "UPLOAD_GOOGLE_TAKEOUT": "Google Takeout", "CANCEL_UPLOADS": "Annuler les chargements", "DEDUPLICATE_FILES": "Déduplication de fichiers", "NO_DUPLICATES_FOUND": "Vous n'avez aucun fichier dédupliqué pouvant être nettoyé", - "CLUB_BY_CAPTURE_TIME": "Club by capture time", + "CLUB_BY_CAPTURE_TIME": "Durée de la capture par club", "FILES": "Fichiers", "EACH": "Chacun", "DEDUPLICATE_BASED_ON_SIZE": "Les fichiers suivants ont été clubbed, basé sur leurs tailles, veuillez corriger et supprimer les objets que vous pensez être dupliqués", @@ -466,13 +466,13 @@ "STOP_ALL_UPLOADS_MESSAGE": "Êtes-vous certains de vouloir arrêter tous les chargements en cours?", "STOP_UPLOADS_HEADER": "Arrêter les chargements?", "YES_STOP_UPLOADS": "Oui, arrêter tout", - "albums_one": "1 Album", - "albums_other": "{{count}} Albums", + "albums_one": "1 album", + "albums_other": "{{count}} albums", "NEW": "Nouveau", "VIEW_ALL_ALBUMS": "Voir tous les albums", "ALL_ALBUMS": "Tous les albums", "ALBUMS": "Albums", - "ENDS": "Ends", + "ENDS": "Fin", "ENTER_TWO_FACTOR_OTP": "Saisir le code à 6 caractères de votre appli d'authentification.", "CREATE_ACCOUNT": "Créer un compte", "COPIED": "Copieé", @@ -534,25 +534,25 @@ "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Vous avez glissé déposé un mélange de fichiers et dossiers.

Veuillez sélectionner soit uniquement des fichiers, ou des dossiers lors du choix d'options pour créer des albums séparés

", "CHOSE_THEME": "Choisir un thème", "ML_SEARCH": "ML search (beta)", - "ENABLE_ML_SEARCH_DESCRIPTION": "

This will enable on-device machine learning and face search which will start analyzing your uploaded photos locally.

For the first run after login or enabling this feature, it will download all images on local device to analyze them. So please only enable this if you are ok with bandwidth and local processing of all images in your photo library.

If this is the first time you're enabling this, we'll also ask your permission to process face data.

", - "ML_MORE_DETAILS": "More details", - "ENABLE_FACE_SEARCH": "Enable face search", - "ENABLE_FACE_SEARCH_TITLE": "Enable face search?", + "ENABLE_ML_SEARCH_DESCRIPTION": "

Ceci activera l'apprentissage automatique sur l'appareil et la recherche faciale qui commencera à analyser vos photos chargées.

Pour la première exécution après la connexion ou l'activation de cette fonctionnalité, cela téléchargera toutes les images sur l'appareil local pour les analyser. Veuillez donc activer ceci uniquement si vous avez de la bande passante et le traitement local de toutes les images dans votre photothèque.

Si c'est la première fois que vous activez ceci, nous vous demanderons également la permission de traiter les données faciales.

", + "ML_MORE_DETAILS": "Plus de détails", + "ENABLE_FACE_SEARCH": "Activer la recherche faciale", + "ENABLE_FACE_SEARCH_TITLE": "Activer la recherche faciale ?", "ENABLE_FACE_SEARCH_DESCRIPTION": "

If you enable face search, ente will extract face geometry from your photos. This will happen on your device, and any generated biometric data will be end-to-encrypted.

Please click here for more details about this feature in our privacy policy

", - "DISABLE_BETA": "Disable beta", - "DISABLE_FACE_SEARCH": "Disable face search", - "DISABLE_FACE_SEARCH_TITLE": "Disable face search?", + "DISABLE_BETA": "Désactiver la bêta", + "DISABLE_FACE_SEARCH": "Désactiver la recherche faciale", + "DISABLE_FACE_SEARCH_TITLE": "Désactiver la recherche faciale ?", "DISABLE_FACE_SEARCH_DESCRIPTION": "

ente will stop processing face geometry, and will also disable ML search (beta)

You can reenable face search again if you wish, so this operation is safe

", - "ADVANCED": "Advanced", - "FACE_SEARCH_CONFIRMATION": "I understand, and wish to allow ente to process face geometry", + "ADVANCED": "Avancé", + "FACE_SEARCH_CONFIRMATION": "Je comprends, et je souhaite permettre à ente de traiter la géométrie faciale", "LABS": "Labs", "YOURS": "Le vôtre", - "PASSPHRASE_STRENGTH": "Password strength: {{passwordStrength}}", + "PASSPHRASE_STRENGTH": "Force du mot de passe : {{passwordStrength}}", "PREFERENCES": "Préférences", "LANGUAGE": "Langue", "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Dossier d'export invalide", "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

Le dossier d'export que vous avez sélectionné n'existe pas

Veuillez sélectionner un dossier valide

", - "SUBSCRIPTION_VERIFICATION_ERROR": "Subscription verification failed", + "SUBSCRIPTION_VERIFICATION_ERROR": "Échec de la vérification de l'abonnement", "STORAGE_UNITS": { "B": "o", "KB": "Ko", @@ -566,5 +566,27 @@ "WEEK": "dans une semaine", "MONTH": "dans un mois", "YEAR": "dans un an" - } + }, + "COPY_LINK": "Copier le lien", + "DONE": "Terminé", + "ADD_EMAIL_TITLE": "Partager avec des personnes spécifiques", + "LINK_SHARE_TITLE": "Ou partager un lien", + "REMOVE_LINK": "Supprimer le lien", + "CREATE_PUBLIC_SHARING": "Créer un lien public", + "PUBLIC_LINK_CREATED": "Lien public créé", + "PUBLIC_LINK_ENABLED": "Lien public activé", + "COLLECT_PHOTOS": "Récupérer les photos", + "PUBLIC_COLLECT_SUBTEXT": "Autoriser les personnes ayant le lien d'ajouter des photos à l'album partagé.", + "STOP_EXPORT": "Stop", + "EXPORT_PROGRESS": "{{progress.current}} / {{progress.total}} fichiers exportés", + "EXPORT_NOTIFICATION": { + "START": "L'export a démarré", + "IN_PROGRESS": "Un export est déjà en cours", + "FINISH": "Export terminé", + "UP_TO_DATE": "Aucun nouveau fichier à exporter" + }, + "CONTINUOUS_EXPORT": "Synchronisation en continu", + "TOTAL_ITEMS": "Total d'objets", + "PENDING_ITEMS": "Objets en attente", + "EXPORT_STARTING": "Démarrage de l'export..." } \ No newline at end of file diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json new file mode 100644 index 000000000..280e51edf --- /dev/null +++ b/public/locales/it/translation.json @@ -0,0 +1,592 @@ +{ + "HERO_SLIDE_1_TITLE": "", + "HERO_SLIDE_1": "", + "HERO_SLIDE_2_TITLE": "", + "HERO_SLIDE_2": "", + "HERO_SLIDE_3_TITLE": "", + "HERO_SLIDE_3": "", + "LOGIN": "", + "SIGN_UP": "", + "NEW_USER": "", + "EXISTING_USER": "", + "NAME": "", + "ENTER_NAME": "", + "PUBLIC_UPLOADER_NAME_MESSAGE": "", + "EMAIL": "", + "ENTER_EMAIL": "", + "DATA_DISCLAIMER": "", + "SUBMIT": "", + "EMAIL_ERROR": "", + "REQUIRED": "", + "VERIFY_EMAIL": "", + "EMAIL_SENT": "", + "CHECK_INBOX": "", + "ENTER_OTT": "", + "RESEND_MAIL": "", + "VERIFY": "", + "UNKNOWN_ERROR": "", + "INVALID_CODE": "", + "EXPIRED_CODE": "", + "SENDING": "", + "SENT": "", + "PASSWORD": "", + "LINK_PASSWORD": "", + "ENTER_PASSPHRASE": "", + "RETURN_PASSPHRASE_HINT": "", + "SET_PASSPHRASE": "", + "VERIFY_PASSPHRASE": "", + "INCORRECT_PASSPHRASE": "", + "ENTER_ENC_PASSPHRASE": "", + "PASSPHRASE_DISCLAIMER": "", + "WELCOME_TO_ENTE_HEADING": "", + "WELCOME_TO_ENTE_SUBHEADING": "", + "WHERE_YOUR_BEST_PHOTOS_LIVE": "", + "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", + "PASSPHRASE_HINT": "", + "CONFIRM_PASSPHRASE": "", + "PASSPHRASE_MATCH_ERROR": "", + "CONSOLE_WARNING_STOP": "", + "CONSOLE_WARNING_DESC": "", + "SELECT_COLLECTION": "", + "CREATE_COLLECTION": "", + "ENTER_ALBUM_NAME": "", + "CLOSE_OPTION": "", + "ENTER_FILE_NAME": "", + "CLOSE": "", + "NO": "", + "NOTHING_HERE": "", + "UPLOAD": "", + "IMPORT": "", + "ADD_PHOTOS": "", + "ADD_MORE_PHOTOS": "", + "add_photos_one": "", + "add_photos_other": "", + "SELECT_PHOTOS": "", + "FILE_UPLOAD": "", + "UPLOAD_STAGE_MESSAGE": { + "0": "", + "1": "", + "2": "", + "3": "", + "4": "", + "5": "" + }, + "UPLOADING_FILES": "", + "FILE_NOT_UPLOADED_LIST": "", + "SUBSCRIPTION_EXPIRED": "", + "SUBSCRIPTION_EXPIRED_MESSAGE": "", + "STORAGE_QUOTA_EXCEEDED": "", + "INITIAL_LOAD_DELAY_WARNING": "", + "USER_DOES_NOT_EXIST": "", + "UPLOAD_BUTTON_TEXT": "", + "NO_ACCOUNT": "", + "ACCOUNT_EXISTS": "", + "ALBUM_NAME": "", + "CREATE": "", + "DOWNLOAD": "", + "DOWNLOAD_OPTION": "", + "DOWNLOAD_FAVORITES": "", + "DOWNLOAD_UNCATEGORIZED": "", + "COPY_OPTION": "", + "TOGGLE_FULLSCREEN": "", + "ZOOM_IN_OUT": "", + "PREVIOUS": "", + "NEXT": "", + "NO_INTERNET_CONNECTION": "", + "TITLE": "", + "UPLOAD_FIRST_PHOTO": "", + "IMPORT_YOUR_FOLDERS": "", + "UPLOAD_DROPZONE_MESSAGE": "", + "WATCH_FOLDER_DROPZONE_MESSAGE": "", + "TRASH_FILES_TITLE": "", + "TRASH_FILE_TITLE": "", + "DELETE_FILES_TITLE": "", + "DELETE_FILES_MESSAGE": "", + "DELETE_FILE": "", + "DELETE": "", + "DELETE_OPTION": "", + "FAVORITE": "", + "FAVORITE_OPTION": "", + "UNFAVORITE_OPTION": "", + "UNFAVORITE": "", + "MULTI_FOLDER_UPLOAD": "", + "UPLOAD_STRATEGY_CHOICE": "", + "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", + "OR": "", + "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", + "SESSION_EXPIRED_MESSAGE": "", + "SESSION_EXPIRED": "", + "SYNC_FAILED": "", + "PASSWORD_GENERATION_FAILED": "", + "CHANGE_PASSWORD": "", + "GO_BACK": "", + "RECOVERY_KEY": "", + "SAVE_LATER": "", + "SAVE": "", + "RECOVERY_KEY_DESCRIPTION": "", + "RECOVER_KEY_GENERATION_FAILED": "", + "KEY_NOT_STORED_DISCLAIMER": "", + "FORGOT_PASSWORD": "", + "RECOVER_ACCOUNT": "", + "RECOVERY_KEY_HINT": "", + "RECOVER": "", + "NO_RECOVERY_KEY": "", + "INCORRECT_RECOVERY_KEY": "", + "SORRY": "", + "NO_RECOVERY_KEY_MESSAGE": "", + "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", + "CONTACT_SUPPORT": "", + "REQUEST_FEATURE": "", + "SUPPORT": "", + "CONFIRM": "", + "SKIP_SUBSCRIPTION_PURCHASE": "", + "CANCEL": "", + "LOGOUT": "", + "DELETE_ACCOUNT": "", + "DELETE_ACCOUNT_MESSAGE": "", + "LOGOUT_MESSAGE": "", + "CHANGE": "", + "CHANGE_EMAIL": "", + "OK": "", + "SUCCESS": "", + "ERROR": "", + "MESSAGE": "", + "INSTALL_MOBILE_APP": "", + "DOWNLOAD_APP_MESSAGE": "", + "DOWNLOAD_APP": "", + "EXPORT": "", + "SUBSCRIPTION": "", + "SUBSCRIBE": "", + "SUBSCRIPTION_PLAN": "", + "USAGE_DETAILS": "", + "MANAGE": "", + "MANAGEMENT_PORTAL": "", + "MANAGE_FAMILY_PORTAL": "", + "LEAVE_FAMILY_PLAN": "", + "LEAVE": "", + "LEAVE_FAMILY_CONFIRM": "", + "CHOOSE_PLAN": "", + "MANAGE_PLAN": "", + "ACTIVE": "", + "OFFLINE_MSG": "", + "FREE_SUBSCRIPTION_INFO": "", + "FAMILY_SUBSCRIPTION_INFO": "", + "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", + "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", + "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", + "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", + "SUBSCRIPTION_PURCHASE_SUCCESS": "", + "SUBSCRIPTION_PURCHASE_CANCELLED": "", + "SUBSCRIPTION_VERIFICATION_FAILED": "", + "SUBSCRIPTION_PURCHASE_FAILED": "", + "SUBSCRIPTION_UPDATE_FAILED": "", + "UPDATE_PAYMENT_METHOD_MESSAGE": "", + "STRIPE_AUTHENTICATION_FAILED": "", + "UPDATE_PAYMENT_METHOD": "", + "MONTHLY": "", + "YEARLY": "", + "UPDATE_SUBSCRIPTION_MESSAGE": "", + "UPDATE_SUBSCRIPTION": "", + "CANCEL_SUBSCRIPTION": "", + "CANCEL_SUBSCRIPTION_MESSAGE": "", + "SUBSCRIPTION_CANCEL_FAILED": "", + "SUBSCRIPTION_CANCEL_SUCCESS": "", + "REACTIVATE_SUBSCRIPTION": "", + "REACTIVATE_SUBSCRIPTION_MESSAGE": "", + "SUBSCRIPTION_ACTIVATE_SUCCESS": "", + "SUBSCRIPTION_ACTIVATE_FAILED": "", + "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", + "CANCEL_SUBSCRIPTION_ON_MOBILE": "", + "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", + "MAIL_TO_MANAGE_SUBSCRIPTION": "", + "RENAME": "", + "RENAME_FILE": "", + "RENAME_COLLECTION": "", + "DELETE_COLLECTION_TITLE": "", + "DELETE_COLLECTION": "", + "DELETE_COLLECTION_FAILED": "", + "DELETE_COLLECTION_MESSAGE": "", + "DELETE_PHOTOS": "", + "KEEP_PHOTOS": "", + "SHARE": "", + "SHARE_COLLECTION": "", + "SHARE_WITH_PEOPLE": "", + "SHAREES": "", + "PUBLIC_URL": "", + "SHARE_WITH_SELF": "", + "ALREADY_SHARED": "", + "SHARING_BAD_REQUEST_ERROR": "", + "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", + "DOWNLOAD_COLLECTION": "", + "DOWNLOAD_COLLECTION_MESSAGE": "", + "DOWNLOAD_COLLECTION_FAILED": "", + "CREATE_ALBUM_FAILED": "", + "SEARCH_RESULTS": "", + "SEARCH_HINT": "", + "SEARCH_TYPE": { + "COLLECTION": "", + "LOCATION": "", + "DATE": "", + "FILE_NAME": "", + "THING": "", + "FILE_CAPTION": "" + }, + "photos_count_zero": "", + "photos_count_one": "", + "photos_count_other": "", + "TERMS_AND_CONDITIONS": "", + "CONFIRM_PASSWORD_NOT_SAVED": "", + "ADD_TO_COLLECTION": "", + "SELECTED": "", + "VIDEO_PLAYBACK_FAILED": "", + "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", + "PEOPLE": "", + "INDEXING_SCHEDULED": "", + "ANALYZING_PHOTOS": "", + "INDEXING_PEOPLE": "", + "INDEXING_DONE": "", + "UNIDENTIFIED_FACES": "", + "OBJECTS": "", + "TEXT": "", + "METADATA": "", + "INFO": "", + "INFO_OPTION": "", + "FILE_ID": "", + "FILE_NAME": "", + "CAPTION": "", + "CAPTION_PLACEHOLDER": "", + "CREATION_TIME": "", + "UPDATED_ON": "", + "LOCATION": "", + "SHOW_ON_MAP": "", + "DETAILS": "", + "VIEW_EXIF": "", + "NO_EXIF": "", + "EXIF": "", + "DEVICE": "", + "IMAGE_SIZE": "", + "FLASH": "", + "FOCAL_LENGTH": "", + "APERTURE": "", + "ISO": "", + "SHOW_ALL": "", + "TWO_FACTOR": "", + "TWO_FACTOR_AUTHENTICATION": "", + "TWO_FACTOR_QR_INSTRUCTION": "", + "ENTER_CODE_MANUALLY": "", + "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", + "SCAN_QR_CODE": "", + "CONTINUE": "", + "BACK": "", + "ENABLE_TWO_FACTOR": "", + "ENABLE": "", + "LOST_DEVICE": "", + "INCORRECT_CODE": "", + "RECOVER_TWO_FACTOR": "", + "TWO_FACTOR_INFO": "", + "DISABLE_TWO_FACTOR_LABEL": "", + "UPDATE_TWO_FACTOR_LABEL": "", + "DISABLE": "", + "RECONFIGURE": "", + "UPDATE_TWO_FACTOR": "", + "UPDATE_TWO_FACTOR_MESSAGE": "", + "UPDATE": "", + "DISABLE_TWO_FACTOR": "", + "DISABLE_TWO_FACTOR_MESSAGE": "", + "TWO_FACTOR_SETUP_FAILED": "", + "TWO_FACTOR_SETUP_SUCCESS": "", + "TWO_FACTOR_DISABLE_SUCCESS": "", + "TWO_FACTOR_DISABLE_FAILED": "", + "EXPORT_DATA": "", + "SELECT_FOLDER": "", + "DESTINATION": "", + "START": "", + "EXPORT_IN_PROGRESS": "", + "PAUSE": "", + "RESUME": "", + "MINIMIZE": "", + "LAST_EXPORT_TIME": "", + "SUCCESSFULLY_EXPORTED_FILES": "", + "FAILED_EXPORTED_FILES": "", + "EXPORT_AGAIN": "", + "RETRY_EXPORT": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", + "RETRY": "", + "SEND_OTT": "", + "EMAIl_ALREADY_OWNED": "", + "EMAIL_UDPATE_SUCCESSFUL": "", + "UPLOAD_FAILED": "", + "ETAGS_BLOCKED": "", + "SKIPPED_VIDEOS_INFO": "", + "LIVE_PHOTOS_DETECTED": "", + "RETRY_FAILED": "", + "FAILED_UPLOADS": "", + "SKIPPED_FILES": "", + "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", + "UNSUPPORTED_FILES": "", + "SUCCESSFUL_UPLOADS": "", + "SKIPPED_INFO": "", + "UNSUPPORTED_INFO": "", + "BLOCKED_UPLOADS": "", + "SKIPPED_VIDEOS": "", + "INPROGRESS_METADATA_EXTRACTION": "", + "INPROGRESS_UPLOADS": "", + "TOO_LARGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", + "TOO_LARGE_INFO": "", + "THUMBNAIL_GENERATION_FAILED_INFO": "", + "UPLOAD_TO_COLLECTION": "", + "UNCATEGORIZED": "", + "MOVE_TO_UNCATEGORIZED": "", + "ARCHIVE": "", + "ARCHIVE_COLLECTION": "", + "ARCHIVE_SECTION_NAME": "", + "ALL_SECTION_NAME": "", + "MOVE_TO_COLLECTION": "", + "UNARCHIVE": "", + "UNARCHIVE_COLLECTION": "", + "MOVE": "", + "ADD": "", + "SORT": "", + "REMOVE": "", + "YES_REMOVE": "", + "CONFIRM_REMOVE": "", + "REMOVE_FROM_COLLECTION": "", + "TRASH": "", + "MOVE_TO_TRASH": "", + "TRASH_FILES_MESSAGE": "", + "TRASH_FILE_MESSAGE": "", + "DELETE_PERMANENTLY": "", + "RESTORE": "", + "CONFIRM_RESTORE": "", + "RESTORE_MESSAGE": "", + "RESTORE_TO_COLLECTION": "", + "EMPTY_TRASH": "", + "EMPTY_TRASH_TITLE": "", + "EMPTY_TRASH_MESSAGE": "", + "LEAVE_SHARED_ALBUM": "", + "LEAVE_ALBUM": "", + "LEAVE_SHARED_ALBUM_TITLE": "", + "LEAVE_SHARED_ALBUM_MESSAGE": "", + "NOT_FILE_OWNER": "", + "CONFIRM_SELF_REMOVE_MESSAGE": "", + "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", + "SORT_BY_CREATION_TIME_ASCENDING": "", + "SORT_BY_CREATION_TIME_DESCENDING": "", + "SORT_BY_UPDATION_TIME_DESCENDING": "", + "SORT_BY_NAME": "", + "COMPRESS_THUMBNAILS": "", + "THUMBNAIL_REPLACED": "", + "FIX_THUMBNAIL": "", + "FIX_THUMBNAIL_LATER": "", + "REPLACE_THUMBNAIL_NOT_STARTED": "", + "REPLACE_THUMBNAIL_COMPLETED": "", + "REPLACE_THUMBNAIL_NOOP": "", + "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", + "FIX_CREATION_TIME": "", + "FIX_CREATION_TIME_IN_PROGRESS": "", + "CREATION_TIME_UPDATED": "", + "UPDATE_CREATION_TIME_NOT_STARTED": "", + "UPDATE_CREATION_TIME_COMPLETED": "", + "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", + "FILE_NAME_CHARACTER_LIMIT": "", + "CAPTION_CHARACTER_LIMIT": "", + "DATE_TIME_ORIGINAL": "", + "DATE_TIME_DIGITIZED": "", + "CUSTOM_TIME": "", + "REOPEN_PLAN_SELECTOR_MODAL": "", + "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", + "COMMENT": "", + "ABUSE_REPORT_DESCRIPTION": "", + "OTHER_REASON_REQUIRES_COMMENTS": "", + "REPORT_SUBMIT_SUCCESS_CONTENT": "", + "REPORT_SUBMIT_SUCCESS_TITLE": "", + "REPORT_SUBMIT_FAILED": "", + "INSTALL": "", + "ALBUM_URL": "", + "SHARING_DETAILS": "", + "MODIFY_SHARING": "", + "NOT_FOUND": "", + "LINK_EXPIRED": "", + "LINK_EXPIRED_MESSAGE": "", + "MANAGE_LINK": "", + "LINK_TOO_MANY_REQUESTS": "", + "DISABLE_PUBLIC_SHARING": "", + "DISABLE_PUBLIC_SHARING_MESSAGE": "", + "FILE_DOWNLOAD": "", + "LINK_PASSWORD_LOCK": "", + "PUBLIC_COLLECT": "", + "LINK_DEVICE_LIMIT": "", + "LINK_EXPIRY": "", + "LINK_EXPIRY_NEVER": "", + "DISABLE_FILE_DOWNLOAD": "", + "DISABLE_FILE_DOWNLOAD_MESSAGE": "", + "ABUSE_REPORT": "", + "ABUSE_REPORT_BUTTON_TEXT": "", + "MALICIOUS_CONTENT": "", + "COPYRIGHT": "", + "ENTER_EMAIL_ADDRESS": "", + "SELECT_REASON": "", + "ENTER_FULL_NAME": "", + "ENTER_DIGITAL_SIGNATURE": "", + "ENTER_ON_BEHALF_OF": "", + "ENTER_ADDRESS": "", + "ENTER_JOB_TITLE": "", + "ENTER_CITY": "", + "ENTER_PHONE": "", + "ENTER_STATE": "", + "ENTER_POSTAL_CODE": "", + "ENTER_COUNTRY": "", + "JUDICIAL_DESCRIPTION": "", + "TERM_1": "", + "TERM_2": "", + "TERM_3": "", + "SHARED_USING": "", + "ENTE_IO": "", + "LIVE": "", + "DISABLE_PASSWORD": "", + "DISABLE_PASSWORD_MESSAGE": "", + "PASSWORD_LOCK": "", + "LOCK": "", + "DOWNLOAD_UPLOAD_LOGS": "", + "CHOOSE_UPLOAD_TYPE": "", + "UPLOAD_FILES": "", + "UPLOAD_DIRS": "", + "UPLOAD_GOOGLE_TAKEOUT": "", + "CANCEL_UPLOADS": "", + "DEDUPLICATE_FILES": "", + "NO_DUPLICATES_FOUND": "", + "CLUB_BY_CAPTURE_TIME": "", + "FILES": "", + "EACH": "", + "DEDUPLICATE_BASED_ON_SIZE": "", + "DEDUPLICATE_BASED_ON_SIZE_AND_CAPTURE_TIME": "", + "STOP_ALL_UPLOADS_MESSAGE": "", + "STOP_UPLOADS_HEADER": "", + "YES_STOP_UPLOADS": "", + "albums_one": "", + "albums_other": "", + "NEW": "", + "VIEW_ALL_ALBUMS": "", + "ALL_ALBUMS": "", + "ALBUMS": "", + "ENDS": "", + "ENTER_TWO_FACTOR_OTP": "", + "CREATE_ACCOUNT": "", + "COPIED": "", + "CANVAS_BLOCKED_TITLE": "", + "CANVAS_BLOCKED_MESSAGE": "", + "WATCH_FOLDERS": "", + "UPGRADE_NOW": "", + "RENEW_NOW": "", + "STORAGE": "", + "USED": "", + "YOU": "", + "FAMILY": "", + "FREE": "", + "OF": "", + "WATCHED_FOLDERS": "", + "NO_FOLDERS_ADDED": "", + "FOLDERS_AUTOMATICALLY_MONITORED": "", + "UPLOAD_NEW_FILES_TO_ENTE": "", + "REMOVE_DELETED_FILES_FROM_ENTE": "", + "ADD_FOLDER": "", + "STOP_WATCHING": "", + "STOP_WATCHING_FOLDER": "", + "STOP_WATCHING_DIALOG_MESSAGE": "", + "YES_STOP": "", + "MONTH_SHORT": "", + "YEAR": "", + "FAMILY_PLAN": "", + "DOWNLOAD_LOGS": "", + "DOWNLOAD_LOGS_MESSAGE": "", + "CHANGE_FOLDER": "", + "TWO_MONTHS_FREE": "", + "GB": "", + "POPULAR": "", + "FREE_PLAN_OPTION_LABEL": "", + "FREE_PLAN_DESCRIPTION": "", + "CURRENT_USAGE": "", + "WEAK_DEVICE": "", + "DRAG_AND_DROP_HINT": "", + "ASK_FOR_FEEDBACK": "", + "SEND_FEEDBACK": "", + "CONFIRM_ACCOUNT_DELETION_TITLE": "", + "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", + "AUTHENTICATE": "", + "UPLOADED_TO_SINGLE_COLLECTION": "", + "UPLOADED_TO_SEPARATE_COLLECTIONS": "", + "NEVERMIND": "", + "UPDATE_AVAILABLE": "", + "UPDATE_INSTALLABLE_MESSAGE": "", + "INSTALL_NOW": "", + "INSTALL_ON_NEXT_LAUNCH": "", + "UPDATE_AVAILABLE_MESSAGE": "", + "DOWNLOAD_AND_INSTALL": "", + "IGNORE_THIS_VERSION": "", + "TODAY": "", + "YESTERDAY": "", + "AT": "", + "NAME_PLACEHOLDER": "", + "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", + "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", + "CHOSE_THEME": "", + "ML_SEARCH": "", + "ENABLE_ML_SEARCH_DESCRIPTION": "", + "ML_MORE_DETAILS": "", + "ENABLE_FACE_SEARCH": "", + "ENABLE_FACE_SEARCH_TITLE": "", + "ENABLE_FACE_SEARCH_DESCRIPTION": "", + "DISABLE_BETA": "", + "DISABLE_FACE_SEARCH": "", + "DISABLE_FACE_SEARCH_TITLE": "", + "DISABLE_FACE_SEARCH_DESCRIPTION": "", + "ADVANCED": "", + "FACE_SEARCH_CONFIRMATION": "", + "LABS": "", + "YOURS": "", + "PASSPHRASE_STRENGTH": "", + "PREFERENCES": "", + "LANGUAGE": "", + "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", + "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", + "SUBSCRIPTION_VERIFICATION_ERROR": "", + "STORAGE_UNITS": { + "B": "", + "KB": "", + "MB": "", + "GB": "", + "TB": "" + }, + "AFTER_TIME": { + "HOUR": "", + "DAY": "", + "WEEK": "", + "MONTH": "", + "YEAR": "" + }, + "COPY_LINK": "", + "DONE": "", + "ADD_EMAIL_TITLE": "", + "LINK_SHARE_TITLE": "", + "REMOVE_LINK": "", + "CREATE_PUBLIC_SHARING": "", + "PUBLIC_LINK_CREATED": "", + "PUBLIC_LINK_ENABLED": "", + "COLLECT_PHOTOS": "", + "PUBLIC_COLLECT_SUBTEXT": "", + "STOP_EXPORT": "", + "EXPORT_PROGRESS": "", + "EXPORT_NOTIFICATION": { + "START": "", + "IN_PROGRESS": "", + "FINISH": "", + "UP_TO_DATE": "" + }, + "CONTINUOUS_EXPORT": "", + "TOTAL_ITEMS": "", + "PENDING_ITEMS": "", + "EXPORT_STARTING": "" +} \ No newline at end of file diff --git a/public/locales/nl/translation.json b/public/locales/nl/translation.json new file mode 100644 index 000000000..582e88020 --- /dev/null +++ b/public/locales/nl/translation.json @@ -0,0 +1,592 @@ +{ + "HERO_SLIDE_1_TITLE": "
Privé back-ups
voor uw herinneringen
", + "HERO_SLIDE_1": "Standaard end-to-end versleuteld", + "HERO_SLIDE_2_TITLE": "
Veilig opgeslagen
in een kernbunker
", + "HERO_SLIDE_2": "Ontworpen om levenslang mee te gaan", + "HERO_SLIDE_3_TITLE": "
Overal
beschikbaar
", + "HERO_SLIDE_3": "Android, iOS, Web, Desktop", + "LOGIN": "Inloggen", + "SIGN_UP": "Registreren", + "NEW_USER": "Nieuw bij ente", + "EXISTING_USER": "Bestaande gebruiker", + "NAME": "Naam", + "ENTER_NAME": "Naam invoeren", + "PUBLIC_UPLOADER_NAME_MESSAGE": "Voeg een naam toe zodat je vrienden weten wie ze moeten bedanken voor deze geweldige foto's!", + "EMAIL": "E-mail", + "ENTER_EMAIL": "Vul e-mailadres in", + "DATA_DISCLAIMER": "We geven jouw data nooit door aan derden.", + "SUBMIT": "Verzenden", + "EMAIL_ERROR": "Vul een geldig e-mailadres in", + "REQUIRED": "Vereist", + "VERIFY_EMAIL": "Bevestig e-mail", + "EMAIL_SENT": "Verificatiecode verzonden naar {{email}}", + "CHECK_INBOX": "Controleer je inbox (en spam) om verificatie te voltooien", + "ENTER_OTT": "Verificatiecode", + "RESEND_MAIL": "Code opnieuw versturen", + "VERIFY": "Verifiëren", + "UNKNOWN_ERROR": "Er is iets fout gegaan, probeer het opnieuw", + "INVALID_CODE": "Ongeldige verificatiecode", + "EXPIRED_CODE": "Uw verificatiecode is verlopen", + "SENDING": "Verzenden...", + "SENT": "Verzonden!", + "PASSWORD": "Wachtwoord", + "LINK_PASSWORD": "Voer wachtwoord in om het album te ontgrendelen", + "ENTER_PASSPHRASE": "Voer je wachtwoord in", + "RETURN_PASSPHRASE_HINT": "Wachtwoord", + "SET_PASSPHRASE": "Wachtwoord instellen", + "VERIFY_PASSPHRASE": "Aanmelden", + "INCORRECT_PASSPHRASE": "Onjuist wachtwoord", + "ENTER_ENC_PASSPHRASE": "Voer een wachtwoord in dat we kunnen gebruiken om je gegevens te versleutelen", + "PASSPHRASE_DISCLAIMER": "We slaan je wachtwoord niet op, dus als je het vergeet, zullen we u niet kunnen helpen uw data te herstellen zonder een herstelcode.", + "WELCOME_TO_ENTE_HEADING": "Welkom bij ", + "WELCOME_TO_ENTE_SUBHEADING": "Foto opslag en delen met end to end encryptie", + "WHERE_YOUR_BEST_PHOTOS_LIVE": "Waar je beste foto's leven", + "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Encryptiecodes worden gegenereerd...", + "PASSPHRASE_HINT": "Wachtwoord", + "CONFIRM_PASSPHRASE": "Wachtwoord bevestigen", + "PASSPHRASE_MATCH_ERROR": "Wachtwoorden komen niet overeen", + "CONSOLE_WARNING_STOP": "STOP!", + "CONSOLE_WARNING_DESC": "Dit is een browserfunctie bedoeld voor ontwikkelaars. Gelieve hier geen niet-geverifieerde code te kopiëren/plakken.", + "SELECT_COLLECTION": "Selecteer een album om de foto's naar te uploaden", + "CREATE_COLLECTION": "Nieuw album", + "ENTER_ALBUM_NAME": "Album naam", + "CLOSE_OPTION": "Sluiten (Esc)", + "ENTER_FILE_NAME": "", + "CLOSE": "", + "NO": "", + "NOTHING_HERE": "", + "UPLOAD": "", + "IMPORT": "", + "ADD_PHOTOS": "", + "ADD_MORE_PHOTOS": "", + "add_photos_one": "", + "add_photos_other": "", + "SELECT_PHOTOS": "", + "FILE_UPLOAD": "", + "UPLOAD_STAGE_MESSAGE": { + "0": "", + "1": "", + "2": "", + "3": "", + "4": "", + "5": "" + }, + "UPLOADING_FILES": "", + "FILE_NOT_UPLOADED_LIST": "", + "SUBSCRIPTION_EXPIRED": "", + "SUBSCRIPTION_EXPIRED_MESSAGE": "", + "STORAGE_QUOTA_EXCEEDED": "", + "INITIAL_LOAD_DELAY_WARNING": "", + "USER_DOES_NOT_EXIST": "", + "UPLOAD_BUTTON_TEXT": "", + "NO_ACCOUNT": "", + "ACCOUNT_EXISTS": "", + "ALBUM_NAME": "", + "CREATE": "", + "DOWNLOAD": "", + "DOWNLOAD_OPTION": "", + "DOWNLOAD_FAVORITES": "", + "DOWNLOAD_UNCATEGORIZED": "", + "COPY_OPTION": "", + "TOGGLE_FULLSCREEN": "", + "ZOOM_IN_OUT": "", + "PREVIOUS": "", + "NEXT": "", + "NO_INTERNET_CONNECTION": "", + "TITLE": "", + "UPLOAD_FIRST_PHOTO": "", + "IMPORT_YOUR_FOLDERS": "", + "UPLOAD_DROPZONE_MESSAGE": "", + "WATCH_FOLDER_DROPZONE_MESSAGE": "", + "TRASH_FILES_TITLE": "", + "TRASH_FILE_TITLE": "", + "DELETE_FILES_TITLE": "", + "DELETE_FILES_MESSAGE": "", + "DELETE_FILE": "", + "DELETE": "", + "DELETE_OPTION": "", + "FAVORITE": "", + "FAVORITE_OPTION": "", + "UNFAVORITE_OPTION": "", + "UNFAVORITE": "", + "MULTI_FOLDER_UPLOAD": "", + "UPLOAD_STRATEGY_CHOICE": "", + "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", + "OR": "", + "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", + "SESSION_EXPIRED_MESSAGE": "", + "SESSION_EXPIRED": "", + "SYNC_FAILED": "", + "PASSWORD_GENERATION_FAILED": "", + "CHANGE_PASSWORD": "", + "GO_BACK": "", + "RECOVERY_KEY": "", + "SAVE_LATER": "", + "SAVE": "", + "RECOVERY_KEY_DESCRIPTION": "", + "RECOVER_KEY_GENERATION_FAILED": "", + "KEY_NOT_STORED_DISCLAIMER": "", + "FORGOT_PASSWORD": "", + "RECOVER_ACCOUNT": "", + "RECOVERY_KEY_HINT": "", + "RECOVER": "", + "NO_RECOVERY_KEY": "", + "INCORRECT_RECOVERY_KEY": "", + "SORRY": "", + "NO_RECOVERY_KEY_MESSAGE": "", + "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", + "CONTACT_SUPPORT": "", + "REQUEST_FEATURE": "", + "SUPPORT": "", + "CONFIRM": "", + "SKIP_SUBSCRIPTION_PURCHASE": "", + "CANCEL": "", + "LOGOUT": "", + "DELETE_ACCOUNT": "", + "DELETE_ACCOUNT_MESSAGE": "", + "LOGOUT_MESSAGE": "", + "CHANGE": "", + "CHANGE_EMAIL": "", + "OK": "", + "SUCCESS": "", + "ERROR": "", + "MESSAGE": "", + "INSTALL_MOBILE_APP": "", + "DOWNLOAD_APP_MESSAGE": "", + "DOWNLOAD_APP": "", + "EXPORT": "", + "SUBSCRIPTION": "", + "SUBSCRIBE": "", + "SUBSCRIPTION_PLAN": "", + "USAGE_DETAILS": "", + "MANAGE": "", + "MANAGEMENT_PORTAL": "", + "MANAGE_FAMILY_PORTAL": "", + "LEAVE_FAMILY_PLAN": "", + "LEAVE": "", + "LEAVE_FAMILY_CONFIRM": "", + "CHOOSE_PLAN": "", + "MANAGE_PLAN": "", + "ACTIVE": "", + "OFFLINE_MSG": "", + "FREE_SUBSCRIPTION_INFO": "", + "FAMILY_SUBSCRIPTION_INFO": "", + "RENEWAL_ACTIVE_SUBSCRIPTION_STATUS": "", + "RENEWAL_CANCELLED_SUBSCRIPTION_STATUS": "", + "RENEWAL_CANCELLED_SUBSCRIPTION_INFO": "", + "STORAGE_QUOTA_EXCEEDED_SUBSCRIPTION_INFO": "", + "SUBSCRIPTION_PURCHASE_SUCCESS": "", + "SUBSCRIPTION_PURCHASE_CANCELLED": "", + "SUBSCRIPTION_VERIFICATION_FAILED": "", + "SUBSCRIPTION_PURCHASE_FAILED": "", + "SUBSCRIPTION_UPDATE_FAILED": "", + "UPDATE_PAYMENT_METHOD_MESSAGE": "", + "STRIPE_AUTHENTICATION_FAILED": "", + "UPDATE_PAYMENT_METHOD": "", + "MONTHLY": "", + "YEARLY": "", + "UPDATE_SUBSCRIPTION_MESSAGE": "", + "UPDATE_SUBSCRIPTION": "", + "CANCEL_SUBSCRIPTION": "", + "CANCEL_SUBSCRIPTION_MESSAGE": "", + "SUBSCRIPTION_CANCEL_FAILED": "", + "SUBSCRIPTION_CANCEL_SUCCESS": "", + "REACTIVATE_SUBSCRIPTION": "", + "REACTIVATE_SUBSCRIPTION_MESSAGE": "", + "SUBSCRIPTION_ACTIVATE_SUCCESS": "", + "SUBSCRIPTION_ACTIVATE_FAILED": "", + "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", + "CANCEL_SUBSCRIPTION_ON_MOBILE": "", + "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", + "MAIL_TO_MANAGE_SUBSCRIPTION": "", + "RENAME": "", + "RENAME_FILE": "", + "RENAME_COLLECTION": "", + "DELETE_COLLECTION_TITLE": "", + "DELETE_COLLECTION": "", + "DELETE_COLLECTION_FAILED": "", + "DELETE_COLLECTION_MESSAGE": "", + "DELETE_PHOTOS": "", + "KEEP_PHOTOS": "", + "SHARE": "", + "SHARE_COLLECTION": "", + "SHARE_WITH_PEOPLE": "", + "SHAREES": "", + "PUBLIC_URL": "", + "SHARE_WITH_SELF": "", + "ALREADY_SHARED": "", + "SHARING_BAD_REQUEST_ERROR": "", + "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", + "DOWNLOAD_COLLECTION": "", + "DOWNLOAD_COLLECTION_MESSAGE": "", + "DOWNLOAD_COLLECTION_FAILED": "", + "CREATE_ALBUM_FAILED": "", + "SEARCH_RESULTS": "", + "SEARCH_HINT": "", + "SEARCH_TYPE": { + "COLLECTION": "", + "LOCATION": "", + "DATE": "", + "FILE_NAME": "", + "THING": "", + "FILE_CAPTION": "" + }, + "photos_count_zero": "", + "photos_count_one": "", + "photos_count_other": "", + "TERMS_AND_CONDITIONS": "", + "CONFIRM_PASSWORD_NOT_SAVED": "", + "ADD_TO_COLLECTION": "", + "SELECTED": "", + "VIDEO_PLAYBACK_FAILED": "", + "VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD": "", + "PEOPLE": "", + "INDEXING_SCHEDULED": "", + "ANALYZING_PHOTOS": "", + "INDEXING_PEOPLE": "", + "INDEXING_DONE": "", + "UNIDENTIFIED_FACES": "", + "OBJECTS": "", + "TEXT": "", + "METADATA": "", + "INFO": "", + "INFO_OPTION": "", + "FILE_ID": "", + "FILE_NAME": "", + "CAPTION": "", + "CAPTION_PLACEHOLDER": "", + "CREATION_TIME": "", + "UPDATED_ON": "", + "LOCATION": "", + "SHOW_ON_MAP": "", + "DETAILS": "", + "VIEW_EXIF": "", + "NO_EXIF": "", + "EXIF": "", + "DEVICE": "", + "IMAGE_SIZE": "", + "FLASH": "", + "FOCAL_LENGTH": "", + "APERTURE": "", + "ISO": "", + "SHOW_ALL": "", + "TWO_FACTOR": "", + "TWO_FACTOR_AUTHENTICATION": "", + "TWO_FACTOR_QR_INSTRUCTION": "", + "ENTER_CODE_MANUALLY": "", + "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", + "SCAN_QR_CODE": "", + "CONTINUE": "", + "BACK": "", + "ENABLE_TWO_FACTOR": "", + "ENABLE": "", + "LOST_DEVICE": "", + "INCORRECT_CODE": "", + "RECOVER_TWO_FACTOR": "", + "TWO_FACTOR_INFO": "", + "DISABLE_TWO_FACTOR_LABEL": "", + "UPDATE_TWO_FACTOR_LABEL": "", + "DISABLE": "", + "RECONFIGURE": "", + "UPDATE_TWO_FACTOR": "", + "UPDATE_TWO_FACTOR_MESSAGE": "", + "UPDATE": "", + "DISABLE_TWO_FACTOR": "", + "DISABLE_TWO_FACTOR_MESSAGE": "", + "TWO_FACTOR_SETUP_FAILED": "", + "TWO_FACTOR_SETUP_SUCCESS": "", + "TWO_FACTOR_DISABLE_SUCCESS": "", + "TWO_FACTOR_DISABLE_FAILED": "", + "EXPORT_DATA": "", + "SELECT_FOLDER": "", + "DESTINATION": "", + "START": "", + "EXPORT_IN_PROGRESS": "", + "PAUSE": "", + "RESUME": "", + "MINIMIZE": "", + "LAST_EXPORT_TIME": "", + "SUCCESSFULLY_EXPORTED_FILES": "", + "FAILED_EXPORTED_FILES": "", + "EXPORT_AGAIN": "", + "RETRY_EXPORT": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", + "RETRY": "", + "SEND_OTT": "", + "EMAIl_ALREADY_OWNED": "", + "EMAIL_UDPATE_SUCCESSFUL": "", + "UPLOAD_FAILED": "", + "ETAGS_BLOCKED": "", + "SKIPPED_VIDEOS_INFO": "", + "LIVE_PHOTOS_DETECTED": "", + "RETRY_FAILED": "", + "FAILED_UPLOADS": "", + "SKIPPED_FILES": "", + "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", + "UNSUPPORTED_FILES": "", + "SUCCESSFUL_UPLOADS": "", + "SKIPPED_INFO": "", + "UNSUPPORTED_INFO": "", + "BLOCKED_UPLOADS": "", + "SKIPPED_VIDEOS": "", + "INPROGRESS_METADATA_EXTRACTION": "", + "INPROGRESS_UPLOADS": "", + "TOO_LARGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", + "TOO_LARGE_INFO": "", + "THUMBNAIL_GENERATION_FAILED_INFO": "", + "UPLOAD_TO_COLLECTION": "", + "UNCATEGORIZED": "", + "MOVE_TO_UNCATEGORIZED": "", + "ARCHIVE": "", + "ARCHIVE_COLLECTION": "", + "ARCHIVE_SECTION_NAME": "", + "ALL_SECTION_NAME": "", + "MOVE_TO_COLLECTION": "", + "UNARCHIVE": "", + "UNARCHIVE_COLLECTION": "", + "MOVE": "", + "ADD": "", + "SORT": "", + "REMOVE": "", + "YES_REMOVE": "", + "CONFIRM_REMOVE": "", + "REMOVE_FROM_COLLECTION": "", + "TRASH": "", + "MOVE_TO_TRASH": "", + "TRASH_FILES_MESSAGE": "", + "TRASH_FILE_MESSAGE": "", + "DELETE_PERMANENTLY": "", + "RESTORE": "", + "CONFIRM_RESTORE": "", + "RESTORE_MESSAGE": "", + "RESTORE_TO_COLLECTION": "", + "EMPTY_TRASH": "", + "EMPTY_TRASH_TITLE": "", + "EMPTY_TRASH_MESSAGE": "", + "LEAVE_SHARED_ALBUM": "", + "LEAVE_ALBUM": "", + "LEAVE_SHARED_ALBUM_TITLE": "", + "LEAVE_SHARED_ALBUM_MESSAGE": "", + "NOT_FILE_OWNER": "", + "CONFIRM_SELF_REMOVE_MESSAGE": "", + "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", + "SORT_BY_CREATION_TIME_ASCENDING": "", + "SORT_BY_CREATION_TIME_DESCENDING": "", + "SORT_BY_UPDATION_TIME_DESCENDING": "", + "SORT_BY_NAME": "", + "COMPRESS_THUMBNAILS": "", + "THUMBNAIL_REPLACED": "", + "FIX_THUMBNAIL": "", + "FIX_THUMBNAIL_LATER": "", + "REPLACE_THUMBNAIL_NOT_STARTED": "", + "REPLACE_THUMBNAIL_COMPLETED": "", + "REPLACE_THUMBNAIL_NOOP": "", + "REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR": "", + "FIX_CREATION_TIME": "", + "FIX_CREATION_TIME_IN_PROGRESS": "", + "CREATION_TIME_UPDATED": "", + "UPDATE_CREATION_TIME_NOT_STARTED": "", + "UPDATE_CREATION_TIME_COMPLETED": "", + "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", + "FILE_NAME_CHARACTER_LIMIT": "", + "CAPTION_CHARACTER_LIMIT": "", + "DATE_TIME_ORIGINAL": "", + "DATE_TIME_DIGITIZED": "", + "CUSTOM_TIME": "", + "REOPEN_PLAN_SELECTOR_MODAL": "", + "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", + "COMMENT": "", + "ABUSE_REPORT_DESCRIPTION": "", + "OTHER_REASON_REQUIRES_COMMENTS": "", + "REPORT_SUBMIT_SUCCESS_CONTENT": "", + "REPORT_SUBMIT_SUCCESS_TITLE": "", + "REPORT_SUBMIT_FAILED": "", + "INSTALL": "", + "ALBUM_URL": "", + "SHARING_DETAILS": "", + "MODIFY_SHARING": "", + "NOT_FOUND": "", + "LINK_EXPIRED": "", + "LINK_EXPIRED_MESSAGE": "", + "MANAGE_LINK": "", + "LINK_TOO_MANY_REQUESTS": "", + "DISABLE_PUBLIC_SHARING": "", + "DISABLE_PUBLIC_SHARING_MESSAGE": "", + "FILE_DOWNLOAD": "", + "LINK_PASSWORD_LOCK": "", + "PUBLIC_COLLECT": "", + "LINK_DEVICE_LIMIT": "", + "LINK_EXPIRY": "", + "LINK_EXPIRY_NEVER": "", + "DISABLE_FILE_DOWNLOAD": "", + "DISABLE_FILE_DOWNLOAD_MESSAGE": "", + "ABUSE_REPORT": "", + "ABUSE_REPORT_BUTTON_TEXT": "", + "MALICIOUS_CONTENT": "", + "COPYRIGHT": "", + "ENTER_EMAIL_ADDRESS": "", + "SELECT_REASON": "", + "ENTER_FULL_NAME": "", + "ENTER_DIGITAL_SIGNATURE": "", + "ENTER_ON_BEHALF_OF": "", + "ENTER_ADDRESS": "", + "ENTER_JOB_TITLE": "", + "ENTER_CITY": "", + "ENTER_PHONE": "", + "ENTER_STATE": "", + "ENTER_POSTAL_CODE": "", + "ENTER_COUNTRY": "", + "JUDICIAL_DESCRIPTION": "", + "TERM_1": "", + "TERM_2": "", + "TERM_3": "", + "SHARED_USING": "", + "ENTE_IO": "", + "LIVE": "", + "DISABLE_PASSWORD": "", + "DISABLE_PASSWORD_MESSAGE": "", + "PASSWORD_LOCK": "", + "LOCK": "", + "DOWNLOAD_UPLOAD_LOGS": "", + "CHOOSE_UPLOAD_TYPE": "", + "UPLOAD_FILES": "", + "UPLOAD_DIRS": "", + "UPLOAD_GOOGLE_TAKEOUT": "", + "CANCEL_UPLOADS": "", + "DEDUPLICATE_FILES": "", + "NO_DUPLICATES_FOUND": "", + "CLUB_BY_CAPTURE_TIME": "", + "FILES": "", + "EACH": "", + "DEDUPLICATE_BASED_ON_SIZE": "", + "DEDUPLICATE_BASED_ON_SIZE_AND_CAPTURE_TIME": "", + "STOP_ALL_UPLOADS_MESSAGE": "", + "STOP_UPLOADS_HEADER": "", + "YES_STOP_UPLOADS": "", + "albums_one": "", + "albums_other": "", + "NEW": "", + "VIEW_ALL_ALBUMS": "", + "ALL_ALBUMS": "", + "ALBUMS": "", + "ENDS": "", + "ENTER_TWO_FACTOR_OTP": "", + "CREATE_ACCOUNT": "", + "COPIED": "", + "CANVAS_BLOCKED_TITLE": "", + "CANVAS_BLOCKED_MESSAGE": "", + "WATCH_FOLDERS": "", + "UPGRADE_NOW": "", + "RENEW_NOW": "", + "STORAGE": "", + "USED": "", + "YOU": "", + "FAMILY": "", + "FREE": "", + "OF": "", + "WATCHED_FOLDERS": "", + "NO_FOLDERS_ADDED": "", + "FOLDERS_AUTOMATICALLY_MONITORED": "", + "UPLOAD_NEW_FILES_TO_ENTE": "", + "REMOVE_DELETED_FILES_FROM_ENTE": "", + "ADD_FOLDER": "", + "STOP_WATCHING": "", + "STOP_WATCHING_FOLDER": "", + "STOP_WATCHING_DIALOG_MESSAGE": "", + "YES_STOP": "", + "MONTH_SHORT": "", + "YEAR": "", + "FAMILY_PLAN": "", + "DOWNLOAD_LOGS": "", + "DOWNLOAD_LOGS_MESSAGE": "", + "CHANGE_FOLDER": "", + "TWO_MONTHS_FREE": "", + "GB": "", + "POPULAR": "", + "FREE_PLAN_OPTION_LABEL": "", + "FREE_PLAN_DESCRIPTION": "", + "CURRENT_USAGE": "", + "WEAK_DEVICE": "", + "DRAG_AND_DROP_HINT": "", + "ASK_FOR_FEEDBACK": "", + "SEND_FEEDBACK": "", + "CONFIRM_ACCOUNT_DELETION_TITLE": "", + "CONFIRM_ACCOUNT_DELETION_MESSAGE": "", + "AUTHENTICATE": "", + "UPLOADED_TO_SINGLE_COLLECTION": "", + "UPLOADED_TO_SEPARATE_COLLECTIONS": "", + "NEVERMIND": "", + "UPDATE_AVAILABLE": "", + "UPDATE_INSTALLABLE_MESSAGE": "", + "INSTALL_NOW": "", + "INSTALL_ON_NEXT_LAUNCH": "", + "UPDATE_AVAILABLE_MESSAGE": "", + "DOWNLOAD_AND_INSTALL": "", + "IGNORE_THIS_VERSION": "", + "TODAY": "", + "YESTERDAY": "", + "AT": "", + "NAME_PLACEHOLDER": "", + "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", + "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", + "CHOSE_THEME": "", + "ML_SEARCH": "", + "ENABLE_ML_SEARCH_DESCRIPTION": "", + "ML_MORE_DETAILS": "", + "ENABLE_FACE_SEARCH": "", + "ENABLE_FACE_SEARCH_TITLE": "", + "ENABLE_FACE_SEARCH_DESCRIPTION": "", + "DISABLE_BETA": "", + "DISABLE_FACE_SEARCH": "", + "DISABLE_FACE_SEARCH_TITLE": "", + "DISABLE_FACE_SEARCH_DESCRIPTION": "", + "ADVANCED": "", + "FACE_SEARCH_CONFIRMATION": "", + "LABS": "", + "YOURS": "", + "PASSPHRASE_STRENGTH": "", + "PREFERENCES": "", + "LANGUAGE": "", + "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", + "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", + "SUBSCRIPTION_VERIFICATION_ERROR": "", + "STORAGE_UNITS": { + "B": "", + "KB": "", + "MB": "", + "GB": "", + "TB": "" + }, + "AFTER_TIME": { + "HOUR": "", + "DAY": "", + "WEEK": "", + "MONTH": "", + "YEAR": "" + }, + "COPY_LINK": "", + "DONE": "", + "ADD_EMAIL_TITLE": "", + "LINK_SHARE_TITLE": "", + "REMOVE_LINK": "", + "CREATE_PUBLIC_SHARING": "", + "PUBLIC_LINK_CREATED": "", + "PUBLIC_LINK_ENABLED": "", + "COLLECT_PHOTOS": "", + "PUBLIC_COLLECT_SUBTEXT": "", + "STOP_EXPORT": "", + "EXPORT_PROGRESS": "", + "EXPORT_NOTIFICATION": { + "START": "", + "IN_PROGRESS": "", + "FINISH": "", + "UP_TO_DATE": "" + }, + "CONTINUOUS_EXPORT": "", + "TOTAL_ITEMS": "", + "PENDING_ITEMS": "", + "EXPORT_STARTING": "" +} \ No newline at end of file diff --git a/scripts/purge_unused_strings.sh b/scripts/purge_unused_strings.sh new file mode 100755 index 000000000..246cefbbd --- /dev/null +++ b/scripts/purge_unused_strings.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# Set the path to the JSON file and folder +json_file_path="./public/locales/en/translation.json" +folder_path="./src" +tab_width=4 + +# Check if jq and grep are installed +if ! command -v jq &> /dev/null || ! command -v grep &> /dev/null +then + echo "jq or grep command not found. Please install jq and grep." + exit +fi + +# Recursive function to check for keys in nested JSON objects +check_keys() { + local keys="$1" + local parent_key="$2" + for key in $keys + do + local full_key="" + if [[ -z $parent_key ]]; then + full_key="$key" + else + full_key="$parent_key.$key" + fi + local children_keys=$(jq -r --arg key "$key" 'select(.[$key] | type == "object") | .[$key] | keys[]' "$json_file_path") + if [ -n "$children_keys" ]; then + # check first if the key is not in the ignore list + check_keys "$children_keys" "$full_key" + else + if ! grep -rqE "'$full_key'|\"$full_key\"" "$folder_path"; then + # Remove the key from the JSON file + # echo the command to remove the key from the JSON file + jq "del(.$(echo $full_key | sed 's/\./"."/g' | sed 's/^/"/' | sed 's/$/"/'))" "$json_file_path" > "$json_file_path.tmp" && mv "$json_file_path.tmp" "$json_file_path" + echo "Removing key \"$full_key\" from the JSON file" + else + echo "Key \"$full_key\" is being used." + fi + fi + done +} + +# Get the top-level keys from the JSON file +keys=$(jq -r 'keys[]' "$json_file_path") + +# Loop through the keys and recursively check for nested keys +check_keys "$keys" "" + +# Format the updated JSON using the specified tab width +jq --indent "$tab_width" '.' "$json_file_path" > "$json_file_path.tmp" && mv "$json_file_path.tmp" "$json_file_path" + + + + +echo "Done checking for missing keys." diff --git a/src/components/ChangeEmail.tsx b/src/components/ChangeEmail.tsx index f127059f9..b753393ca 100644 --- a/src/components/ChangeEmail.tsx +++ b/src/components/ChangeEmail.tsx @@ -41,7 +41,7 @@ function ChangeEmailForm() { ottInputRef.current?.focus(); }, 250); } catch (e) { - setFieldError('email', t('EMAIl_ALREADY_OWNED}')); + setFieldError('email', t('EMAIl_ALREADY_OWNED')); } setLoading(false); }; diff --git a/src/components/Collections/CollectionShare/index.tsx b/src/components/Collections/CollectionShare/index.tsx index 3bdae9bed..4b1ecaf5b 100644 --- a/src/components/Collections/CollectionShare/index.tsx +++ b/src/components/Collections/CollectionShare/index.tsx @@ -1,16 +1,13 @@ import EmailShare from './emailShare'; -import React, { useContext } from 'react'; +import React from 'react'; import { Collection } from 'types/collection'; -import DialogTitleWithCloseButton, { - dialogCloseHandler, -} from 'components/DialogBox/TitleWithCloseButton'; -import DialogContent from '@mui/material/DialogContent'; -import { Divider } from '@mui/material'; - -import { CollectionShareContainer } from './container'; +import { EnteDrawer } from 'components/EnteDrawer'; import PublicShare from './publicShare'; -import { AppContext } from 'pages/_app'; +import WorkspacesIcon from '@mui/icons-material/Workspaces'; import { t } from 'i18next'; +import MenuSectionTitle from 'components/Menu/MenuSectionTitle'; +import { DialogProps, Stack } from '@mui/material'; +import Titlebar from 'components/Titlebar'; interface Props { open: boolean; @@ -19,30 +16,48 @@ interface Props { } function CollectionShare(props: Props) { - const { isMobile } = useContext(AppContext); - const handleClose = dialogCloseHandler({ - onClose: props.onClose, - }); - + const handleRootClose = () => { + props.onClose(); + }; + const handleDrawerClose: DialogProps['onClose'] = (_, reason) => { + if (reason === 'backdropClick') { + handleRootClose(); + } else { + props.onClose(); + } + }; if (!props.collection) { return <>; } return ( <> - - - {t('SHARE_COLLECTION')} - - - - - - - + onClose={handleDrawerClose} + BackdropProps={{ + sx: { '&&&': { backgroundColor: 'transparent' } }, + }}> + + + + } + /> + + + + + ); } diff --git a/src/components/Collections/CollectionShare/publicShare/EnablePublicShareOptions.tsx b/src/components/Collections/CollectionShare/publicShare/EnablePublicShareOptions.tsx new file mode 100644 index 000000000..fc5a25fe8 --- /dev/null +++ b/src/components/Collections/CollectionShare/publicShare/EnablePublicShareOptions.tsx @@ -0,0 +1,101 @@ +import { Stack, Typography } from '@mui/material'; +import { GalleryContext } from 'pages/gallery'; +import React, { useContext, useState } from 'react'; +import { t } from 'i18next'; +import { + createShareableURL, + updateShareableURL, +} from 'services/collectionService'; +import { Collection, PublicURL } from 'types/collection'; +import { handleSharingErrors } from 'utils/error/ui'; +import { EnteMenuItem } from 'components/Menu/menuItem'; +import PublicIcon from '@mui/icons-material/Public'; +interface Iprops { + collection: Collection; + setPublicShareProp: (value: PublicURL) => void; + setCopyLinkModalView: (value: boolean) => void; +} +import LinkIcon from '@mui/icons-material/Link'; +import { EnteMenuItemGroup } from 'components/Menu/menuItemGroup'; +import MenuSectionTitle from 'components/Menu/MenuSectionTitle'; +import EnteMenuItemDivider from 'components/Menu/menuItemDivider'; + +export default function EnablePublicShareOptions({ + collection, + setPublicShareProp, + setCopyLinkModalView, +}: Iprops) { + const galleryContext = useContext(GalleryContext); + const [sharableLinkError, setSharableLinkError] = useState(null); + + const createSharableURLHelper = async () => { + try { + setSharableLinkError(null); + galleryContext.setBlockingLoad(true); + const publicURL = await createShareableURL(collection); + setPublicShareProp(publicURL); + setCopyLinkModalView(true); + galleryContext.syncWithRemote(false, true); + } catch (e) { + const errorMessage = handleSharingErrors(e); + setSharableLinkError(errorMessage); + } finally { + galleryContext.setBlockingLoad(false); + } + }; + + const createCollectPhotoShareableURLHelper = async () => { + try { + setSharableLinkError(null); + galleryContext.setBlockingLoad(true); + const publicURL = await createShareableURL(collection); + await updateShareableURL({ + collectionID: collection.id, + enableCollect: true, + }); + setPublicShareProp(publicURL); + setCopyLinkModalView(true); + galleryContext.syncWithRemote(false, true); + } catch (e) { + const errorMessage = handleSharingErrors(e); + setSharableLinkError(errorMessage); + } finally { + galleryContext.setBlockingLoad(false); + } + }; + + return ( + + } + /> + + } + color="primary" + onClick={createSharableURLHelper}> + {t('CREATE_PUBLIC_SHARING')} + + + } + color="primary" + onClick={createCollectPhotoShareableURLHelper}> + {t('COLLECT_PHOTOS')} + + + {sharableLinkError && ( + theme.palette.danger.main, + mt: 0.5, + }}> + {sharableLinkError} + + )} + + ); +} diff --git a/src/components/Collections/CollectionShare/publicShare/control.tsx b/src/components/Collections/CollectionShare/publicShare/control.tsx deleted file mode 100644 index 943b0a086..000000000 --- a/src/components/Collections/CollectionShare/publicShare/control.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { Box, Typography } from '@mui/material'; -import { FlexWrapper } from 'components/Container'; -import { GalleryContext } from 'pages/gallery'; -import { AppContext } from 'pages/_app'; -import React, { useContext, useState } from 'react'; -import { t } from 'i18next'; -import { - createShareableURL, - deleteShareableURL, -} from 'services/collectionService'; -import { Collection, PublicURL } from 'types/collection'; -import { handleSharingErrors } from 'utils/error/ui'; -import PublicShareSwitch from './switch'; -interface Iprops { - collection: Collection; - publicShareActive: boolean; - setPublicShareProp: (value: PublicURL) => void; -} - -export default function PublicShareControl({ - collection, - publicShareActive, - setPublicShareProp, -}: Iprops) { - const appContext = useContext(AppContext); - const galleryContext = useContext(GalleryContext); - const [sharableLinkError, setSharableLinkError] = useState(null); - - const createSharableURLHelper = async () => { - try { - appContext.startLoading(); - const publicURL = await createShareableURL(collection); - setPublicShareProp(publicURL); - await galleryContext.syncWithRemote(false, true); - } catch (e) { - const errorMessage = handleSharingErrors(e); - setSharableLinkError(errorMessage); - } finally { - appContext.finishLoading(); - } - }; - - const disablePublicSharing = async () => { - try { - appContext.startLoading(); - await deleteShareableURL(collection); - setPublicShareProp(null); - await galleryContext.syncWithRemote(false, true); - } catch (e) { - const errorMessage = handleSharingErrors(e); - setSharableLinkError(errorMessage); - } finally { - appContext.finishLoading(); - } - }; - - const confirmDisablePublicSharing = () => { - appContext.setDialogMessage({ - title: t('DISABLE_PUBLIC_SHARING'), - content: t('DISABLE_PUBLIC_SHARING_MESSAGE'), - close: { text: t('CANCEL') }, - proceed: { - text: t('DISABLE'), - action: disablePublicSharing, - variant: 'danger', - }, - }); - }; - - const handleCollectionPublicSharing = () => { - setSharableLinkError(null); - if (publicShareActive) { - confirmDisablePublicSharing(); - } else { - createSharableURLHelper(); - } - }; - return ( - - - {t('PUBLIC_SHARING')} - - - - {sharableLinkError && ( - theme.palette.danger.main, - mt: 0.5, - }}> - {sharableLinkError} - - )} - - ); -} diff --git a/src/components/Collections/CollectionShare/publicShare/copyLinkModal.tsx b/src/components/Collections/CollectionShare/publicShare/copyLinkModal.tsx new file mode 100644 index 000000000..aeaa1131c --- /dev/null +++ b/src/components/Collections/CollectionShare/publicShare/copyLinkModal.tsx @@ -0,0 +1,58 @@ +import DialogBoxBase from 'components/DialogBox/base'; +import { + DialogActions, + Button, + Typography, + DialogContent, + Box, +} from '@mui/material'; +import VerticallyCentered from 'components/Container'; +import Check from '@mui/icons-material/Check'; +import { t } from 'i18next'; +interface Iprops { + open: boolean; + onClose: () => void; + handleCancel: () => void; + copyToClipboardHelper: () => void; +} +export default function CopyLinkModal({ + open, + onClose, + handleCancel, + copyToClipboardHelper, +}: Iprops) { + return ( + + + + + {t('PUBLIC_LINK_CREATED')} + + + + + + + + + + + + ); +} diff --git a/src/components/Collections/CollectionShare/publicShare/index.tsx b/src/components/Collections/CollectionShare/publicShare/index.tsx index db103fb2c..d8bad6939 100644 --- a/src/components/Collections/CollectionShare/publicShare/index.tsx +++ b/src/components/Collections/CollectionShare/publicShare/index.tsx @@ -1,17 +1,20 @@ import React, { useEffect, useState } from 'react'; import { Collection, PublicURL } from 'types/collection'; import { appendCollectionKeyToShareURL } from 'utils/collection'; -import PublicShareControl from './control'; -import PublicShareLink from './link'; -import PublicShareManage from './manage'; +import EnablePublicShareOptions from './EnablePublicShareOptions'; +import CopyLinkModal from './copyLinkModal'; +import ManagePublicShare from './managePublicShare'; export default function PublicShare({ collection, + onRootClose, }: { collection: Collection; + onRootClose: () => void; }) { const [publicShareUrl, setPublicShareUrl] = useState(null); const [publicShareProp, setPublicShareProp] = useState(null); + const [copyLinkModalView, setCopyLinkModalView] = useState(false); useEffect(() => { if (collection.publicURLs?.length) { @@ -31,24 +34,38 @@ export default function PublicShare({ } }, [publicShareProp]); + const copyToClipboardHelper = () => { + navigator.clipboard.writeText(publicShareUrl); + handleCancel(); + }; + const handleCancel = () => { + setCopyLinkModalView(false); + }; + return ( <> - - {publicShareProp && ( - <> - - - - + {publicShareProp ? ( + + ) : ( + )} + ); } diff --git a/src/components/Collections/CollectionShare/publicShare/link.tsx b/src/components/Collections/CollectionShare/publicShare/link.tsx deleted file mode 100644 index c5cadf36b..000000000 --- a/src/components/Collections/CollectionShare/publicShare/link.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { Box } from '@mui/material'; -import CodeBlock from 'components/CodeBlock'; -import React from 'react'; - -export default function PublicShareLink({ publicShareUrl }) { - return ( - - - - ); -} diff --git a/src/components/Collections/CollectionShare/publicShare/manage/deviceLimit.tsx b/src/components/Collections/CollectionShare/publicShare/manage/deviceLimit.tsx index fe5b3d92f..4f817af30 100644 --- a/src/components/Collections/CollectionShare/publicShare/manage/deviceLimit.tsx +++ b/src/components/Collections/CollectionShare/publicShare/manage/deviceLimit.tsx @@ -1,22 +1,27 @@ -import { Box, Typography } from '@mui/material'; -import React from 'react'; +import ChevronRight from '@mui/icons-material/ChevronRight'; +import { DialogProps, Stack } from '@mui/material'; +import { EnteDrawer } from 'components/EnteDrawer'; +import { EnteMenuItem } from 'components/Menu/menuItem'; +import { EnteMenuItemGroup } from 'components/Menu/menuItemGroup'; +import Titlebar from 'components/Titlebar'; import { t } from 'i18next'; -import Select from 'react-select'; -import { DropdownStyle } from 'styles/dropdown'; +import React, { useMemo, useState } from 'react'; import { Collection, PublicURL, UpdatePublicURL } from 'types/collection'; import { getDeviceLimitOptions } from 'utils/collection'; -import { OptionWithDivider } from './selectComponents/OptionWithDivider'; +import EnteMenuItemDivider from 'components/Menu/menuItemDivider'; interface Iprops { publicShareProp: PublicURL; collection: Collection; updatePublicShareURLHelper: (req: UpdatePublicURL) => Promise; + onRootClose: () => void; } export function ManageDeviceLimit({ - publicShareProp, collection, + publicShareProp, updatePublicShareURLHelper, + onRootClose, }: Iprops) { const updateDeviceLimit = async (newLimit: number) => { return updatePublicShareURLHelper({ @@ -24,24 +29,68 @@ export function ManageDeviceLimit({ deviceLimit: newLimit, }); }; + const [isChangeDeviceLimitVisible, setIsChangeDeviceLimitVisible] = + useState(false); + const deviceLimitOptions = useMemo(() => getDeviceLimitOptions(), []); + + const closeDeviceLimitChangeModal = () => + setIsChangeDeviceLimitVisible(false); + const openDeviceLimitChangeModalView = () => + setIsChangeDeviceLimitVisible(true); + + const changeDeviceLimitValue = (value: number) => async () => { + await updateDeviceLimit(value); + setIsChangeDeviceLimitVisible(false); + }; + + const handleDrawerClose: DialogProps['onClose'] = (_, reason) => { + if (reason === 'backdropClick') { + onRootClose(); + } else { + closeDeviceLimitChangeModal(); + } + }; return ( - - {t('LINK_DEVICE_LIMIT')} - + } + subText={ publicShareProp?.validTill ? formatDateTime(publicShareProp?.validTill / 1000) : t('LINK_EXPIRY_NEVER') - } - onChange={(e) => { - updateDeviceExpiry(e.value); - }} - styles={linkExpiryStyle} - /> - + }> + {t('LINK_EXPIRY')} + + + + + + + {shareExpireOption.map((item, index) => ( + <> + + {item.label} + + {index !== shareExpireOption.length - 1 && ( + + )} + + ))} + + + + + ); } diff --git a/src/components/Collections/CollectionShare/publicShare/manage/linkPassword/index.tsx b/src/components/Collections/CollectionShare/publicShare/manage/linkPassword/index.tsx index 2f8d3bdba..abb15055b 100644 --- a/src/components/Collections/CollectionShare/publicShare/manage/linkPassword/index.tsx +++ b/src/components/Collections/CollectionShare/publicShare/manage/linkPassword/index.tsx @@ -1,9 +1,8 @@ -import { Box, Typography } from '@mui/material'; import { AppContext } from 'pages/_app'; import React, { useContext, useState } from 'react'; import { PublicURL, Collection, UpdatePublicURL } from 'types/collection'; import { PublicLinkSetPassword } from './setPassword'; -import PublicShareSwitch from '../../switch'; +import { EnteMenuItem } from 'components/Menu/menuItem'; import { t } from 'i18next'; interface Iprops { @@ -49,13 +48,12 @@ export function ManageLinkPassword({ return ( <> - - {t('LINK_PASSWORD_LOCK')} - - + + {t('LINK_PASSWORD_LOCK')} + - {t('PUBLIC_COLLECT')} - - + + + {t('PUBLIC_COLLECT')} + + + ); } diff --git a/src/components/Collections/CollectionShare/publicShare/managePublicShare.tsx b/src/components/Collections/CollectionShare/publicShare/managePublicShare.tsx new file mode 100644 index 000000000..ede962c20 --- /dev/null +++ b/src/components/Collections/CollectionShare/publicShare/managePublicShare.tsx @@ -0,0 +1,67 @@ +import { Stack, Typography } from '@mui/material'; +import { EnteMenuItem } from 'components/Menu/menuItem'; +import EnteMenuItemDivider from 'components/Menu/menuItemDivider'; +import { EnteMenuItemGroup } from 'components/Menu/menuItemGroup'; +import { Collection, PublicURL } from 'types/collection'; +import ManagePublicShareOptions from './manage'; +import PublicIcon from '@mui/icons-material/Public'; +import ContentCopyIcon from '@mui/icons-material/ContentCopyOutlined'; +import ChevronRightIcon from '@mui/icons-material/ChevronRight'; +import { SetPublicShareProp } from 'types/publicCollection'; +import LinkIcon from '@mui/icons-material/Link'; +import { useState } from 'react'; +import { t } from 'i18next'; + +interface Iprops { + publicShareProp: PublicURL; + collection: Collection; + setPublicShareProp: SetPublicShareProp; + onRootClose: () => void; + publicShareUrl: string; + copyToClipboardHelper: () => void; +} +export default function ManagePublicShare({ + publicShareProp, + setPublicShareProp, + collection, + onRootClose, + publicShareUrl, + copyToClipboardHelper, +}: Iprops) { + const [manageShareView, setManageShareView] = useState(false); + const closeManageShare = () => setManageShareView(false); + const openManageShare = () => setManageShareView(true); + return ( + <> + + + + {t('PUBLIC_LINK_ENABLED')} + + + } + onClick={copyToClipboardHelper}> + {t('COPY_LINK')} + + + } + endIcon={} + onClick={openManageShare}> + {t('MANAGE_LINK')} + + + + + + ); +} diff --git a/src/components/Collections/styledComponents.ts b/src/components/Collections/styledComponents.ts index 3a45be248..d80425615 100644 --- a/src/components/Collections/styledComponents.ts +++ b/src/components/Collections/styledComponents.ts @@ -1,7 +1,7 @@ import { Box } from '@mui/material'; import { styled } from '@mui/material'; import { Overlay } from 'components/Container'; -import { SpecialPadding } from 'styles/SpecialPadding'; +import { IMAGE_CONTAINER_MAX_WIDTH, MIN_COLUMNS } from 'constants/gallery'; export const CollectionListWrapper = styled(Box)` position: relative; overflow: hidden; @@ -10,7 +10,10 @@ export const CollectionListWrapper = styled(Box)` `; export const CollectionListBarWrapper = styled(Box)` - ${SpecialPadding} + padding: 0 24px; + @media (max-width: ${IMAGE_CONTAINER_MAX_WIDTH * MIN_COLUMNS}px) { + padding: 0 4px; + } margin-bottom: 16px; border-bottom: 1px solid ${({ theme }) => theme.palette.divider}; `; diff --git a/src/components/Container.ts b/src/components/Container.ts index bcb7464ca..317728e52 100644 --- a/src/components/Container.ts +++ b/src/components/Container.ts @@ -27,10 +27,6 @@ export const Row = styled('div')` flex: 1; `; -export const Label = styled('div')<{ width?: string }>` - width: ${(props) => props.width ?? '70%'}; - color: ${(props) => props.theme.palette.text.secondary}; -`; export const Value = styled('div')<{ width?: string }>` display: flex; justify-content: flex-start; @@ -77,3 +73,11 @@ export const IconButtonWithBG = styled(IconButton)(({ theme }) => ({ export const HorizontalFlex = styled(Box)({ display: 'flex', }); + +export const VerticalFlex = styled(HorizontalFlex)({ + flexDirection: 'column', +}); + +export const VerticallyCenteredFlex = styled(HorizontalFlex)({ + alignItems: 'center', +}); diff --git a/src/components/DialogBoxV2/index.tsx b/src/components/DialogBoxV2/index.tsx new file mode 100644 index 000000000..be9d76ef9 --- /dev/null +++ b/src/components/DialogBoxV2/index.tsx @@ -0,0 +1,126 @@ +import React from 'react'; +import { + Box, + Breakpoint, + Button, + Dialog, + DialogProps, + Stack, + Typography, +} from '@mui/material'; +import { t } from 'i18next'; +import { dialogCloseHandler } from 'components/DialogBox/TitleWithCloseButton'; +import { DialogBoxAttributesV2 } from 'types/dialogBox'; + +type IProps = React.PropsWithChildren< + Omit & { + onClose: () => void; + attributes: DialogBoxAttributesV2; + size?: Breakpoint; + titleCloseButton?: boolean; + } +>; + +export default function DialogBoxV2({ + attributes, + children, + open, + onClose, + ...props +}: IProps) { + if (!attributes) { + return <>; + } + + const handleClose = dialogCloseHandler({ + staticBackdrop: attributes.staticBackdrop, + nonClosable: attributes.nonClosable, + onClose: onClose, + }); + + return ( + + + + {attributes.icon && ( + svg': { + fontSize: '32px', + }, + }}> + {attributes.icon} + + )} + {attributes.title && ( + + {attributes.title} + + )} + {children || + (attributes?.content && ( + + {attributes.content} + + ))} + + + {attributes.proceed && ( + + )} + {attributes.close && ( + + )} + {attributes.buttons && + attributes.buttons.map((b) => ( + + ))} + + + + ); +} diff --git a/src/components/DropdownInput.tsx b/src/components/DropdownInput.tsx new file mode 100644 index 000000000..cd53ae1a0 --- /dev/null +++ b/src/components/DropdownInput.tsx @@ -0,0 +1,105 @@ +import ExpandMore from '@mui/icons-material/ExpandMore'; +import { + Box, + MenuItem, + Select, + SelectChangeEvent, + Stack, + Typography, + TypographyTypeMap, +} from '@mui/material'; + +export interface DropdownOption { + label: string; + value: T; +} + +interface Iprops { + label: string; + labelProps: TypographyTypeMap['props']; + options: DropdownOption[]; + message?: string; + selectedValue: string; + setSelectedValue: (selectedValue: T) => void; + placeholder?: string; +} + +export default function DropdownInput({ + label, + labelProps, + options, + message, + selectedValue, + placeholder, + setSelectedValue, +}: Iprops) { + return ( + + {label} + + {message && ( + + {message} + + )} + + ); +} diff --git a/src/components/EnteDrawer.tsx b/src/components/EnteDrawer.tsx index 5c860e9d6..beacae98a 100644 --- a/src/components/EnteDrawer.tsx +++ b/src/components/EnteDrawer.tsx @@ -1,5 +1,4 @@ -import { Drawer } from '@mui/material'; -import styled from 'styled-components'; +import { Drawer, styled } from '@mui/material'; export const EnteDrawer = styled(Drawer)(({ theme }) => ({ '& .MuiPaper-root': { diff --git a/src/components/ExportFinished.tsx b/src/components/ExportFinished.tsx index 4535b0ca9..c458e2b60 100644 --- a/src/components/ExportFinished.tsx +++ b/src/components/ExportFinished.tsx @@ -1,74 +1,53 @@ -import { Button, DialogActions, DialogContent, Stack } from '@mui/material'; +import { + Button, + DialogActions, + DialogContent, + Stack, + Typography, +} from '@mui/material'; import React from 'react'; import { t } from 'i18next'; -import { ExportStats } from 'types/export'; import { formatDateTime } from 'utils/time/format'; -import { FlexWrapper, Label, Value } from './Container'; -import { ComfySpan } from './ExportInProgress'; +import { SpaceBetweenFlex } from './Container'; interface Props { + pendingFileCount: number; onHide: () => void; lastExportTime: number; - exportStats: ExportStats; - exportFiles: () => void; - retryFailed: () => void; + startExport: () => void; } export default function ExportFinished(props: Props) { - const totalFiles = props.exportStats.failed + props.exportStats.success; return ( <> - - - - + + + + {t('PENDING_ITEMS')} + + {props.pendingFileCount} + + + + {t('LAST_EXPORT_TIME')} + + {formatDateTime(props.lastExportTime)} - - - - - - - {props.exportStats.success} / {totalFiles} - - - - {props.exportStats.failed > 0 && ( - - - - - {props.exportStats.failed} / {totalFiles} - - - - )} + + - {props.exportStats.failed !== 0 ? ( - - ) : ( - - )} + ); diff --git a/src/components/ExportInProgress.tsx b/src/components/ExportInProgress.tsx index 9f28eb401..e71504bbb 100644 --- a/src/components/ExportInProgress.tsx +++ b/src/components/ExportInProgress.tsx @@ -11,8 +11,10 @@ import { ExportStage } from 'constants/export'; import VerticallyCentered, { FlexWrapper } from './Container'; import { ProgressBar } from 'react-bootstrap'; import { t } from 'i18next'; +import { Trans } from 'react-i18next'; export const ComfySpan = styled('span')` + padding: 0 0.5rem; word-spacing: 1rem; color: #ddd; `; @@ -20,65 +22,57 @@ export const ComfySpan = styled('span')` interface Props { exportStage: ExportStage; exportProgress: ExportProgress; - resumeExport: () => void; - cancelExport: () => void; - pauseExport: () => void; + stopExport: () => void; + closeExportDialog: () => void; } export default function ExportInProgress(props: Props) { + const isLoading = props.exportProgress.total === 0; return ( <> - - {' '} - {props.exportProgress.current} /{' '} - {props.exportProgress.total}{' '} - {' '} - - {' '} - files exported{' '} - {props.exportStage === ExportStage.PAUSED && - `(paused)`} - + {isLoading ? ( + t('EXPORT_STARTING') + ) : ( + , + }} + values={{ + progress: props.exportProgress, + }} + /> + )} - {props.exportStage === ExportStage.PAUSED ? ( - - ) : ( - - )} + diff --git a/src/components/ExportModal.tsx b/src/components/ExportModal.tsx index 584920dbb..0de1db764 100644 --- a/src/components/ExportModal.tsx +++ b/src/components/ExportModal.tsx @@ -1,47 +1,41 @@ import isElectron from 'is-electron'; -import React, { useEffect, useMemo, useState, useContext } from 'react'; +import React, { useEffect, useState, useContext } from 'react'; import exportService from 'services/exportService'; -import { ExportProgress, ExportStats } from 'types/export'; -import { getLocalFiles } from 'services/fileService'; -import { User } from 'types/user'; +import { ExportProgress, ExportSettings, FileExportStats } from 'types/export'; import { + Box, Button, Dialog, DialogContent, Divider, - Stack, styled, + Switch, Tooltip, + Typography, } from '@mui/material'; -import { sleep } from 'utils/common'; -import { getExportRecordFileUID } from 'utils/export'; import { logError } from 'utils/sentry'; import { getData, LS_KEYS, setData } from 'utils/storage/localStorage'; -import { FlexWrapper, Label, Value } from './Container'; +import { SpaceBetweenFlex, VerticallyCenteredFlex } from './Container'; import ExportFinished from './ExportFinished'; import ExportInit from './ExportInit'; import ExportInProgress from './ExportInProgress'; import FolderIcon from '@mui/icons-material/Folder'; -import { ExportStage, ExportType } from 'constants/export'; -import EnteSpinner from './EnteSpinner'; +import { ExportStage } from 'constants/export'; import DialogTitleWithCloseButton from './DialogBox/TitleWithCloseButton'; import MoreHoriz from '@mui/icons-material/MoreHoriz'; import OverflowMenu from './OverflowMenu/menu'; import { OverflowMenuOption } from './OverflowMenu/option'; -import { convertBytesToHumanReadable } from 'utils/file/size'; -import { CustomError } from 'utils/error'; -import { getLocalUserDetails } from 'utils/user'; import { AppContext } from 'pages/_app'; import { getExportDirectoryDoesNotExistMessage } from 'utils/ui'; -import { addLogLine } from 'utils/logging'; import { t } from 'i18next'; +import LinkButton from './pages/gallery/LinkButton'; +import { CustomError } from 'utils/error'; -const ExportFolderPathContainer = styled('span')` +const ExportFolderPathContainer = styled(LinkButton)` + width: 262px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - width: 100%; - /* Beginning of string */ direction: rtl; text-align: left; @@ -53,17 +47,16 @@ interface Props { } export default function ExportModal(props: Props) { const appContext = useContext(AppContext); - const userDetails = useMemo(() => getLocalUserDetails(), []); const [exportStage, setExportStage] = useState(ExportStage.INIT); const [exportFolder, setExportFolder] = useState(''); - const [exportSize, setExportSize] = useState(''); + const [continuousExport, setContinuousExport] = useState(false); const [exportProgress, setExportProgress] = useState({ current: 0, total: 0, }); - const [exportStats, setExportStats] = useState({ - failed: 0, - success: 0, + const [fileExportStats, setFileExportStats] = useState({ + totalCount: 0, + pendingCount: 0, }); const [lastExportTime, setLastExportTime] = useState(0); @@ -75,43 +68,53 @@ export default function ExportModal(props: Props) { return; } try { - setExportFolder(getData(LS_KEYS.EXPORT)?.folder); - - exportService.electronAPIs.registerStopExportListener( - stopExportHandler - ); - exportService.electronAPIs.registerPauseExportListener( - pauseExportHandler - ); - exportService.electronAPIs.registerResumeExportListener( - resumeExportHandler - ); - exportService.electronAPIs.registerRetryFailedExportListener( - retryFailedExportHandler - ); + const exportSettings: ExportSettings = getData(LS_KEYS.EXPORT); + setExportFolder(exportSettings?.folder); + setContinuousExport(exportSettings?.continuousExport); + syncFileCounts(); } catch (e) { logError(e, 'error in exportModal'); } }, []); + useEffect(() => { + if (!props.show) { + return; + } + if (exportService.isExportInProgress()) { + setExportStage(ExportStage.INPROGRESS); + } + syncFileCounts(); + }, [props.show]); + + useEffect(() => { + try { + if (continuousExport) { + exportService.enableContinuousExport(startExport); + } else { + exportService.disableContinuousExport(); + } + } catch (e) { + logError(e, 'error handling continuousExport change'); + } + }, [continuousExport]); + useEffect(() => { if (!exportFolder) { return; } const main = async () => { try { - const exportInfo = await exportService.getExportRecord(); - setExportStage(exportInfo?.stage ?? ExportStage.INIT); - setLastExportTime(exportInfo?.lastAttemptTimestamp); - setExportProgress( - exportInfo?.progress ?? { current: 0, total: 0 } - ); - setExportStats({ - success: exportInfo?.exportedFiles?.length ?? 0, - failed: exportInfo?.failedFiles?.length ?? 0, - }); - if (exportInfo?.stage === ExportStage.INPROGRESS) { - await resumeExport(); + const exportRecord = await exportService.getExportRecord(); + if (!exportRecord) { + setExportStage(ExportStage.INIT); + return; + } + setExportStage(exportRecord.stage); + setLastExportTime(exportRecord.lastAttemptTimestamp); + await syncFileCounts(); + if (exportRecord.stage === ExportStage.INPROGRESS) { + await startExport(); } } catch (e) { logError(e, 'error handling exportFolder change'); @@ -120,62 +123,27 @@ export default function ExportModal(props: Props) { void main(); }, [exportFolder]); - useEffect(() => { - if (!props.show) { - return; - } - const main = async () => { - const user: User = getData(LS_KEYS.USER); - if (exportStage === ExportStage.FINISHED) { - try { - const localFiles = await getLocalFiles(); - const userPersonalFiles = localFiles.filter( - (file) => file.ownerID === user?.id - ); - const exportRecord = await exportService.getExportRecord(); - const exportedFileCnt = exportRecord.exportedFiles?.length; - const failedFilesCnt = exportRecord.failedFiles?.length; - const syncedFilesCnt = userPersonalFiles.length; - if (syncedFilesCnt > exportedFileCnt + failedFilesCnt) { - await updateExportProgress({ - current: exportedFileCnt + failedFilesCnt, - total: syncedFilesCnt, - }); - const exportFileUIDs = new Set([ - ...exportRecord.exportedFiles, - ...exportRecord.failedFiles, - ]); - const unExportedFiles = userPersonalFiles.filter( - (file) => - !exportFileUIDs.has( - getExportRecordFileUID(file) - ) - ); - await exportService.addFilesQueuedRecord( - exportFolder, - unExportedFiles - ); - await updateExportStage(ExportStage.PAUSED); - } - } catch (e) { - setExportStage(ExportStage.INIT); - logError(e, 'error while updating exportModal on reopen'); - } - } - }; - void main(); - }, [props.show]); - - useEffect(() => { - setExportSize(convertBytesToHumanReadable(userDetails?.usage)); - }, [userDetails]); - // ============= // STATE UPDATERS // ============== const updateExportFolder = (newFolder: string) => { + const exportSettings: ExportSettings = getData(LS_KEYS.EXPORT); + const updatedExportSettings: ExportSettings = { + ...exportSettings, + folder: newFolder, + }; + setData(LS_KEYS.EXPORT, updatedExportSettings); setExportFolder(newFolder); - setData(LS_KEYS.EXPORT, { folder: newFolder }); + }; + + const updateContinuousExport = (updatedContinuousExport: boolean) => { + const exportSettings: ExportSettings = getData(LS_KEYS.EXPORT); + const updatedExportSettings: ExportSettings = { + ...exportSettings, + continuousExport: updatedContinuousExport, + }; + setData(LS_KEYS.EXPORT, updatedExportSettings); + setContinuousExport(updatedContinuousExport); }; const updateExportStage = async (newStage: ExportStage) => { @@ -190,70 +158,65 @@ export default function ExportModal(props: Props) { }); }; - const updateExportProgress = async (newProgress: ExportProgress) => { - setExportProgress(newProgress); - await exportService.updateExportRecord({ progress: newProgress }); - }; - // ====================== // HELPER FUNCTIONS - // ========================= + // ======================= const preExportRun = async () => { const exportFolder = getData(LS_KEYS.EXPORT)?.folder; - if (!exportFolder) { - await selectExportDirectory(); - } const exportFolderExists = exportService.exists(exportFolder); if (!exportFolderExists) { appContext.setDialogMessage( getExportDirectoryDoesNotExistMessage() ); - return; + throw Error(CustomError.EXPORT_FOLDER_DOES_NOT_EXIST); } await updateExportStage(ExportStage.INPROGRESS); - await sleep(100); - }; - const postExportRun = async (exportResult?: { paused?: boolean }) => { - if (!exportResult?.paused) { - await updateExportStage(ExportStage.FINISHED); - await sleep(100); - await updateExportTime(Date.now()); - await syncExportStatsWithRecord(); - } }; - const selectExportDirectory = async () => { - const newFolder = await exportService.selectExportDirectory(); - if (newFolder) { - updateExportFolder(newFolder); - } else { - throw Error(CustomError.REQUEST_CANCELLED); - } + const postExportRun = async () => { + await updateExportStage(ExportStage.FINISHED); + await updateExportTime(Date.now()); + await syncFileCounts(); }; - const syncExportStatsWithRecord = async () => { - const exportRecord = await exportService.getExportRecord(); - const failed = exportRecord?.failedFiles?.length ?? 0; - const success = exportRecord?.exportedFiles?.length ?? 0; - setExportStats({ failed, success }); + const syncFileCounts = async () => { + try { + const fileExportStats = await exportService.getFileExportStats(); + setFileExportStats(fileExportStats); + } catch (e) { + logError(e, 'error updating file counts'); + } }; // ============= // UI functions // ============= + const handleChangeExportDirectoryClick = () => { + void exportService.changeExportDirectory(updateExportFolder); + }; + + const handleOpenExportDirectoryClick = () => { + void exportService.openExportDirectory(exportFolder); + }; + + const toggleContinuousExport = () => { + try { + updateContinuousExport(!continuousExport); + } catch (e) { + logError(e, 'toggleContinuousExport failed'); + } + }; + const startExport = async () => { try { await preExportRun(); - await updateExportProgress({ current: 0, total: 0 }); - const exportResult = await exportService.exportFiles( - updateExportProgress, - ExportType.NEW - ); - await postExportRun(exportResult); + setExportProgress({ current: 0, total: 0 }); + await exportService.exportFiles(setExportProgress); + await postExportRun(); } catch (e) { - if (e.message !== CustomError.REQUEST_CANCELLED) { + if (e.message !== CustomError.EXPORT_FOLDER_DOES_NOT_EXIST) { logError(e, 'startExport failed'); } } @@ -264,120 +227,7 @@ export default function ExportModal(props: Props) { exportService.stopRunningExport(); await postExportRun(); } catch (e) { - if (e.message !== CustomError.REQUEST_CANCELLED) { - logError(e, 'stopExport failed'); - } - } - }; - - const pauseExport = async () => { - try { - await updateExportStage(ExportStage.PAUSED); - exportService.pauseRunningExport(); - await postExportRun({ paused: true }); - } catch (e) { - if (e.message !== CustomError.REQUEST_CANCELLED) { - logError(e, 'pauseExport failed'); - } - } - }; - - const resumeExport = async () => { - try { - const exportRecord = await exportService.getExportRecord(); - await preExportRun(); - - const pausedStageProgress = exportRecord.progress; - setExportProgress(pausedStageProgress); - - addLogLine( - `resuming export, pausedStageProgress: ${JSON.stringify( - pausedStageProgress - )}` - ); - const updateExportStatsWithOffset = (progress: ExportProgress) => - updateExportProgress({ - current: pausedStageProgress.current + progress.current, - total: pausedStageProgress.current + progress.total, - }); - const exportResult = await exportService.exportFiles( - updateExportStatsWithOffset, - ExportType.PENDING - ); - - await postExportRun(exportResult); - } catch (e) { - if (e.message !== CustomError.REQUEST_CANCELLED) { - logError(e, 'resumeExport failed'); - } - } - }; - - const retryFailedExport = async () => { - try { - await preExportRun(); - await updateExportProgress({ - current: 0, - total: exportStats.failed, - }); - - const exportResult = await exportService.exportFiles( - updateExportProgress, - ExportType.RETRY_FAILED - ); - await postExportRun(exportResult); - } catch (e) { - if (e.message !== CustomError.REQUEST_CANCELLED) { - logError(e, 'retryFailedExport failed'); - } - } - }; - - const startExportHandler = () => { - void startExport(); - }; - const stopExportHandler = () => { - void stopExport(); - }; - const pauseExportHandler = () => { - void pauseExport(); - }; - const resumeExportHandler = () => { - void resumeExport(); - }; - const retryFailedExportHandler = () => { - void retryFailedExport(); - }; - - const ExportDynamicContent = () => { - switch (exportStage) { - case ExportStage.INIT: - return ; - - case ExportStage.INPROGRESS: - case ExportStage.PAUSED: - return ( - - ); - case ExportStage.FINISHED: - return ( - - ); - - default: - return <>; + logError(e, 'stopExport failed'); } }; @@ -387,71 +237,80 @@ export default function ExportModal(props: Props) { {t('EXPORT_DATA')} - - - - + + + + + {t('TOTAL_ITEMS')} + + + {fileExportStats.totalCount} + + - + ); } -function ExportDirectory({ exportFolder, selectExportDirectory, exportStage }) { +function ExportDirectory({ + exportFolder, + changeExportDirectory, + exportStage, + openExportDirectory, +}) { return ( - - - + + + {t('DESTINATION')} + + <> {!exportFolder ? ( - ) : ( - <> - - - {exportFolder} - - - {(exportStage === ExportStage.FINISHED || - exportStage === ExportStage.INIT) && ( + + + + {exportFolder} + + + + {exportStage === ExportStage.FINISHED || + exportStage === ExportStage.INIT ? ( + ) : ( + )} - + )} - - + + ); } -function ExportSize({ exportSize }) { - return ( - - - - {exportSize ? `${exportSize}` : } - - - ); -} - -function ExportDirectoryOption({ selectExportDirectory }) { - const handleClick = () => { - try { - selectExportDirectory(); - } catch (e) { - if (e.message !== CustomError.REQUEST_CANCELLED) { - logError(e, 'startExport failed'); - } - } - }; +function ExportDirectoryOption({ changeExportDirectory }) { return ( }> }> {t('CHANGE_FOLDER')} ); } + +function ContinuousExport({ continuousExport, toggleContinuousExport }) { + return ( + + + {t('CONTINUOUS_EXPORT')} + + + + + + ); +} + +const ExportDynamicContent = ({ + exportStage, + startExport, + stopExport, + onHide, + lastExportTime, + pendingFileCount, + exportProgress, +}: { + exportStage: ExportStage; + startExport: () => void; + stopExport: () => void; + onHide: () => void; + lastExportTime: number; + pendingFileCount: number; + exportProgress: ExportProgress; +}) => { + switch (exportStage) { + case ExportStage.INIT: + return ; + + case ExportStage.INPROGRESS: + return ( + + ); + case ExportStage.FINISHED: + return ( + + ); + + default: + return <>; + } +}; diff --git a/src/components/MachineLearning/ImageViews.tsx b/src/components/MachineLearning/ImageViews.tsx index f8c7bdf99..1b059359d 100644 --- a/src/components/MachineLearning/ImageViews.tsx +++ b/src/components/MachineLearning/ImageViews.tsx @@ -1,19 +1,18 @@ import React, { useState, useEffect } from 'react'; -import styled from 'styled-components'; +import { styled } from '@mui/material'; + import { imageBitmapToBlob } from 'utils/image'; import { logError } from 'utils/sentry'; import { getBlobFromCache } from 'utils/storage/cache'; -export const Image = styled.img``; - -export const FaceCropsRow = styled.div` +export const FaceCropsRow = styled('div')` & > img { width: 256px; height: 256px; } `; -export const FaceImagesRow = styled.div` +export const FaceImagesRow = styled('div')` & > img { width: 112px; height: 112px; @@ -92,9 +91,5 @@ export function ImageBlobView(props: { blob: Blob }) { } }, [props.blob]); - return ( - <> - - - ); + return ; } diff --git a/src/components/MachineLearning/MlDebug-disabled.tsx b/src/components/MachineLearning/MlDebug-disabled.tsx index cba276875..86405b3d2 100644 --- a/src/components/MachineLearning/MlDebug-disabled.tsx +++ b/src/components/MachineLearning/MlDebug-disabled.tsx @@ -24,7 +24,8 @@ export {}; // import mlIDbStorage from 'utils/storage/mlIDbStorage'; // import { getFaceCropBlobFromStorage } from 'utils/machineLearning/faceCrop'; // import { PeopleList } from './PeopleList'; -// import styled from 'styled-components'; +// import { styled } from '@mui/material'; + // import { RawNodeDatum } from 'react-d3-tree/lib/types/common'; // import { DebugInfo, mstToBinaryTree } from 'hdbscan'; // import { toD3Tree } from 'utils/machineLearning/clustering'; @@ -70,7 +71,7 @@ export {}; // ); // } -// const D3ImageContainer = styled.div` +// const D3ImageContainer = styled('div')` // & > img { // width: 100%; // height: 100%; diff --git a/src/components/MachineLearning/PeopleList.tsx b/src/components/MachineLearning/PeopleList.tsx index fec3c365d..d28a75b62 100644 --- a/src/components/MachineLearning/PeopleList.tsx +++ b/src/components/MachineLearning/PeopleList.tsx @@ -5,7 +5,7 @@ import { getPeopleList, getUnidentifiedFaces, } from 'utils/machineLearning'; -import styled from 'styled-components'; +import { styled } from '@mui/material'; import { EnteFile } from 'types/file'; import { ImageCacheView } from './ImageViews'; import { CACHES } from 'constants/cache'; @@ -14,7 +14,7 @@ import { addLogLine } from 'utils/logging'; import { logError } from 'utils/sentry'; import { t } from 'i18next'; -const FaceChipContainer = styled.div` +const FaceChipContainer = styled('div')` display: flex; flex-wrap: wrap; justify-content: center; @@ -24,7 +24,7 @@ const FaceChipContainer = styled.div` overflow: auto; `; -const FaceChip = styled.div<{ clickable?: boolean }>` +const FaceChip = styled('div')<{ clickable?: boolean }>` width: 112px; height: 112px; margin: 5px; diff --git a/src/components/Menu/menuItem.tsx b/src/components/Menu/menuItem.tsx new file mode 100644 index 000000000..c380961d0 --- /dev/null +++ b/src/components/Menu/menuItem.tsx @@ -0,0 +1,91 @@ +import { MenuItem, ButtonProps, Typography, Box } from '@mui/material'; +import PublicShareSwitch from 'components/Collections/CollectionShare/publicShare/switch'; +import { + FluidContainer, + HorizontalFlex, + SpaceBetweenFlex, +} from 'components/Container'; +import { DotSeparator } from 'components/Sidebar/styledComponents'; +import React from 'react'; + +interface Iprops { + onClick: () => void; + color?: ButtonProps['color']; + startIcon?: React.ReactNode; + endIcon?: React.ReactNode; + subText?: string; + children?: any; + hasSwitch?: boolean; + checked?: boolean; +} +export function EnteMenuItem({ + onClick, + color = 'primary', + startIcon, + endIcon, + subText, + children, + hasSwitch = false, + checked, +}: Iprops) { + const handleClick = () => { + onClick(); + }; + return ( + theme.palette[color].main, + backgroundColor: (theme) => theme.palette.background.overPaper, + padding: 2, + '& .MuiSvgIcon-root': { + fontSize: '20px', + }, + borderRadius: '8px', + }}> + + + {startIcon && ( + + {startIcon} + + )} + {children} + + {subText && ( + + + + {subText} + + )} + + + {endIcon && ( + + {endIcon} + + )} + {hasSwitch && ( + + )} + + + + ); +} diff --git a/src/components/Menu/menuItemDivider.tsx b/src/components/Menu/menuItemDivider.tsx new file mode 100644 index 000000000..3c8626751 --- /dev/null +++ b/src/components/Menu/menuItemDivider.tsx @@ -0,0 +1,16 @@ +import { Divider } from '@mui/material'; +interface Iprops { + hasIcon?: boolean; +} +export default function EnteMenuItemDivider({ hasIcon = false }: Iprops) { + return ( + + ); +} diff --git a/src/components/Menu/menuItemGroup.tsx b/src/components/Menu/menuItemGroup.tsx new file mode 100644 index 000000000..fb3f77b94 --- /dev/null +++ b/src/components/Menu/menuItemGroup.tsx @@ -0,0 +1,16 @@ +import { styled } from '@mui/material'; + +export const EnteMenuItemGroup = styled('div')( + ({ theme }) => ` + & > .MuiMenuItem-root:not(:last-of-type) { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + & > .MuiMenuItem-root:not(:first-of-type) { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + background-color: ${theme.palette.background.overPaper}; + border-radius: 4px; +` +); diff --git a/src/components/Navbar/base.tsx b/src/components/Navbar/base.tsx index 1c67b12fe..d4df73a5b 100644 --- a/src/components/Navbar/base.tsx +++ b/src/components/Navbar/base.tsx @@ -1,6 +1,6 @@ import { FlexWrapper } from 'components/Container'; import { styled } from '@mui/material'; -import { SpecialPadding } from 'styles/SpecialPadding'; +import { IMAGE_CONTAINER_MAX_WIDTH, MIN_COLUMNS } from 'constants/gallery'; const NavbarBase = styled(FlexWrapper)` min-height: 64px; position: sticky; @@ -10,7 +10,10 @@ const NavbarBase = styled(FlexWrapper)` border-bottom: 1px solid ${({ theme }) => theme.palette.divider}; background-color: ${({ theme }) => theme.palette.background.default}; margin-bottom: 16px; - ${SpecialPadding} + padding: 0 24px; + @media (max-width: ${IMAGE_CONTAINER_MAX_WIDTH * MIN_COLUMNS}px) { + padding: 0 4px; + } `; export default NavbarBase; diff --git a/src/components/PasswordStrength.tsx b/src/components/PasswordStrength.tsx index a96374d3e..fa1d1c0d1 100644 --- a/src/components/PasswordStrength.tsx +++ b/src/components/PasswordStrength.tsx @@ -28,7 +28,9 @@ export const PasswordStrengthHint = ({ })} textAlign={'left'} flex={1}> - {password ? t('PASSPHRASE_STRENGTH', { passwordStrength }) : ''} + {password + ? t('PASSPHRASE_STRENGTH', { context: passwordStrength }) + : ''} ); diff --git a/src/components/PhotoList.tsx b/src/components/PhotoList.tsx index e86f66484..3c293fe7a 100644 --- a/src/components/PhotoList.tsx +++ b/src/components/PhotoList.tsx @@ -19,7 +19,6 @@ import { DeduplicateContext } from 'pages/deduplicate'; import { FlexWrapper } from './Container'; import { Typography } from '@mui/material'; import { GalleryContext } from 'pages/gallery'; -import { SpecialPadding } from 'styles/SpecialPadding'; import { formatDate } from 'utils/time/format'; import { Trans } from 'react-i18next'; import { t } from 'i18next'; @@ -111,7 +110,10 @@ const ListContainer = styled(Box)<{ grid-column-gap: ${GAP_BTW_TILES}px; width: 100%; color: #fff; - ${SpecialPadding} + padding: 0 24px; + @media (max-width: ${IMAGE_CONTAINER_MAX_WIDTH * MIN_COLUMNS}px) { + padding: 0 4px; + } `; const ListItemContainer = styled(FlexWrapper)<{ span: number }>` diff --git a/src/components/PhotoViewer/FileInfo/RenderInfoItem.tsx b/src/components/PhotoViewer/FileInfo/RenderInfoItem.tsx deleted file mode 100644 index a538df52f..000000000 --- a/src/components/PhotoViewer/FileInfo/RenderInfoItem.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react'; -import { Label, Row, Value } from 'components/Container'; - -export const RenderInfoItem = (label: string, value: string | JSX.Element) => ( - - - {value} - -); diff --git a/src/components/Search/SearchBar/styledComponents.tsx b/src/components/Search/SearchBar/styledComponents.tsx index 07f183ffb..5723671d4 100644 --- a/src/components/Search/SearchBar/styledComponents.tsx +++ b/src/components/Search/SearchBar/styledComponents.tsx @@ -4,10 +4,13 @@ import { FluidContainer, } from 'components/Container'; import { css, styled } from '@mui/material'; -import { SpecialPadding } from 'styles/SpecialPadding'; +import { IMAGE_CONTAINER_MAX_WIDTH, MIN_COLUMNS } from 'constants/gallery'; export const SearchBarWrapper = styled(FlexWrapper)` - ${SpecialPadding} + padding: 0 24px; + @media (max-width: ${IMAGE_CONTAINER_MAX_WIDTH * MIN_COLUMNS}px) { + padding: 0 4px; + } `; export const SearchMobileBox = styled(FluidContainer)` diff --git a/src/components/Sidebar/Preferences/LanguageSelector.tsx b/src/components/Sidebar/Preferences/LanguageSelector.tsx index 74b39d367..5f67d649b 100644 --- a/src/components/Sidebar/Preferences/LanguageSelector.tsx +++ b/src/components/Sidebar/Preferences/LanguageSelector.tsx @@ -1,9 +1,8 @@ -import { OptionWithDivider } from 'components/Collections/CollectionShare/publicShare/manage/selectComponents/OptionWithDivider'; +import DropdownInput, { DropdownOption } from 'components/DropdownInput'; import { Language } from 'constants/locale'; import { useLocalState } from 'hooks/useLocalState'; +import { t } from 'i18next'; import { useRouter } from 'next/router'; -import Select from 'react-select'; -import { DropdownStyle } from 'styles/dropdown'; import { getBestPossibleUserLocale } from 'utils/i18n'; import { LS_KEYS } from 'utils/storage/localStorage'; @@ -16,7 +15,7 @@ const getLocaleDisplayName = (l: Language) => { } }; -const getLanguageOptions = () => { +const getLanguageOptions = (): DropdownOption[] => { return Object.values(Language).map((lang) => ({ label: getLocaleDisplayName(lang), value: lang, @@ -37,19 +36,12 @@ export const LanguageSelector = () => { }; return ( -