= ({
sx={{
mt: "6px",
mb: 0,
- /* Negative margin to extend to edges by counteracting the
- maximum margin that can be added by FileViewer. */
- mx: "-24px",
padding: "8px",
bgcolor: "accent.main",
color: "accent.contrastText",
diff --git a/web/apps/photos/src/utils/photoFrame/index.ts b/web/apps/photos/src/utils/photoFrame/index.ts
index 5680bd0309..672c85d2b7 100644
--- a/web/apps/photos/src/utils/photoFrame/index.ts
+++ b/web/apps/photos/src/utils/photoFrame/index.ts
@@ -11,18 +11,15 @@ export const handleSelectCreator =
userID: number | undefined,
activeCollectionID: number,
activePersonID: string | undefined,
- // @ts-expect-error Need to add types
- setRangeStart?,
+ setRangeStartIndex: (index: number | undefined) => void,
) =>
({ id, ownerID }: { id: number; ownerID: number }, index?: number) =>
(checked: boolean) => {
if (typeof index != "undefined") {
if (checked) {
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call
- setRangeStart(index);
+ setRangeStartIndex(index);
} else {
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call
- setRangeStart(undefined);
+ setRangeStartIndex(undefined);
}
}
setSelected((_selected) => {
diff --git a/web/package.json b/web/package.json
index bce3a8e7e9..54d327a93f 100644
--- a/web/package.json
+++ b/web/package.json
@@ -11,6 +11,7 @@
"build:accounts": "yarn workspace accounts next build",
"build:auth": "yarn workspace auth next build",
"build:cast": "yarn workspace cast next build",
+ "build:locker": "yarn workspace locker next build",
"build:payments": "yarn workspace payments build",
"build:photos": "yarn workspace photos next build",
"dev": "yarn dev:photos",
@@ -18,6 +19,7 @@
"dev:albums": "yarn workspace photos next dev -p 3002",
"dev:auth": "yarn workspace auth next dev -p 3003",
"dev:cast": "yarn workspace cast next dev -p 3004",
+ "dev:locker": "yarn workspace locker next dev -p 3005",
"dev:payments": "yarn workspace payments dev",
"dev:photos": "yarn workspace photos next dev -p 3000",
"lint": "concurrently --names 'prettier,eslint,tsc' \"yarn prettier --check --log-level warn .\" \"yarn workspaces run eslint\" \"yarn workspaces run tsc\"",
diff --git a/web/packages/accounts/services/redirect.ts b/web/packages/accounts/services/redirect.ts
index 19791d2894..1277963018 100644
--- a/web/packages/accounts/services/redirect.ts
+++ b/web/packages/accounts/services/redirect.ts
@@ -9,6 +9,7 @@ export const appHomeRoute: string = {
accounts: "/passkeys",
auth: "/auth",
cast: "/" /* The cast app doesn't use this, this is an arbitrary value. */,
+ locker: "/" /* The locker app also doesn't use this. */,
photos: "/gallery",
}[appName];
diff --git a/web/packages/base/app.ts b/web/packages/base/app.ts
index e330e41a83..014ec98a76 100644
--- a/web/packages/base/app.ts
+++ b/web/packages/base/app.ts
@@ -1,4 +1,10 @@
-export const appNames = ["accounts", "auth", "cast", "photos"] as const;
+export const appNames = [
+ "accounts",
+ "auth",
+ "cast",
+ "locker",
+ "photos",
+] as const;
/**
* Arbitrary names that we used as keys for indexing various constants
@@ -56,6 +62,7 @@ export const staticAppTitle = {
accounts: "Ente Accounts",
auth: "Ente Auth",
cast: "Ente Photos",
+ locker: "Ente Locker",
photos: "Ente Photos",
}[appName];
@@ -77,6 +84,7 @@ export const clientPackageName = (() => {
accounts: "io.ente.accounts.web",
auth: "io.ente.auth.web",
cast: "io.ente.cast.web",
+ locker: "io.ente.locker.web",
photos: "io.ente.photos.web",
}[appName];
})();
diff --git a/web/packages/base/components/utils/theme.ts b/web/packages/base/components/utils/theme.ts
index 2c1ea3aa14..0c79a7414e 100644
--- a/web/packages/base/components/utils/theme.ts
+++ b/web/packages/base/components/utils/theme.ts
@@ -125,7 +125,12 @@ const getColors = (appName: AppName) => ({
},
},
...{
- accent: appName == "auth" ? _colors.accentAuth : _colors.accentPhotos,
+ accent:
+ appName == "auth"
+ ? _colors.accentAuth
+ : appName == "locker"
+ ? _colors.accentLocker
+ : _colors.accentPhotos,
},
});
@@ -139,6 +144,7 @@ const getColors = (appName: AppName) => ({
const _colors = {
accentPhotos: { dark: "#00b33c", main: "#1db954", light: "#01de4d" },
accentAuth: { dark: "#8e0fcb", main: "#9610d6", light: "#8e2de2" },
+ accentLocker: { dark: "#615bff", main: "#5ba8ff", light: "#5bf9ff" },
fixed: {
white: "#fff",
black: "#000",
@@ -764,3 +770,8 @@ export const authTheme = getTheme("auth");
* This is the same as the dark theme for the photos app.
*/
export const castTheme = getTheme("cast");
+
+/**
+ * The MUI {@link Theme} to use for the locker app.
+ */
+export const lockerTheme = getTheme("locker");
diff --git a/web/packages/base/locales/de-DE/translation.json b/web/packages/base/locales/de-DE/translation.json
index c696095562..d38ba3147f 100644
--- a/web/packages/base/locales/de-DE/translation.json
+++ b/web/packages/base/locales/de-DE/translation.json
@@ -162,7 +162,7 @@
"ok": "OK",
"success": "Erfolgreich",
"error": "Fehler",
- "note": "",
+ "note": "Notiz",
"offline_message": "Du bist offline, gecachte Erinnerungen werden angezeigt",
"install": "Installieren",
"install_mobile_app": "Installiere unsere Android oder iOS App, um automatisch alle deine Fotos zu sichern",
@@ -685,5 +685,5 @@
"person_favorites": "{{name}}s Favoriten",
"shared_favorites": "Geteilte Favoriten",
"added_by_name": "Von {{name}} hinzugefügt",
- "unowned_files_not_processed": ""
+ "unowned_files_not_processed": "Von anderen Benutzern hinzugefügte Dateien wurden nicht verarbeitet"
}
diff --git a/web/packages/base/locales/es-ES/translation.json b/web/packages/base/locales/es-ES/translation.json
index d1a4378a02..1d3d91cf93 100644
--- a/web/packages/base/locales/es-ES/translation.json
+++ b/web/packages/base/locales/es-ES/translation.json
@@ -32,7 +32,7 @@
"set_password": "Definir contraseña",
"sign_in": "Ingresar",
"incorrect_password": "Contraseña incorrecta",
- "incorrect_password_or_no_account": "",
+ "incorrect_password_or_no_account": "Contraseña incorrecta o correo electrónico no registrado",
"pick_password_hint": "Introducir una contraseña que podamos usar para cifrar sus datos",
"pick_password_caution": "No guardamos su contraseña, así que si la olvida, no podremos ayudarte a recuperar tus datos sin una clave de recuperación.",
"key_generation_in_progress": "Generando claves de encriptación...",
@@ -40,7 +40,7 @@
"referral_source_hint": "¿Cómo conociste Ente? (opcional)",
"referral_source_info": "No rastreamos la instalación de las aplicaciones. ¡Nos ayudaría si nos dijera dónde nos encontró!",
"password_mismatch_error": "Las contraseñas no coinciden",
- "show_or_hide_password": "",
+ "show_or_hide_password": "Mostrar u ocultar la contraseña",
"welcome_to_ente_title": "Bienvenido a ",
"welcome_to_ente_subtitle": "Almacenamiento y compartición de fotos cifradas de extremo a extremo",
"new_album": "Nuevo álbum",
@@ -162,7 +162,7 @@
"ok": "OK",
"success": "Completado",
"error": "Error",
- "note": "",
+ "note": "Nota",
"offline_message": "Estás desconectado, se están mostrando recuerdos en caché",
"install": "Instalar",
"install_mobile_app": "Instala nuestra aplicación Android o iOS para hacer una copia de seguridad automática de todas usted fotos",
@@ -627,7 +627,7 @@
"faster_upload_description": "Enrutar subidas a través de servidores cercanos",
"open_ente_on_startup": "Abrir ente al iniciar",
"cast_album_to_tv": "Reproducir álbum en TV",
- "cast_to_tv": "",
+ "cast_to_tv": "Reproducir en el televisor",
"enter_cast_pin_code": "Introduce el código que ves en el televisor para emparejar este dispositivo.",
"code": "Código",
"pair_device_to_tv": "Emparejar dispositivos",
@@ -679,11 +679,11 @@
"system": "Sistema",
"light": "Claro",
"dark": "Oscuro",
- "streamable_videos": "",
- "processing_videos_status": "",
- "share_favorites": "",
- "person_favorites": "",
- "shared_favorites": "",
- "added_by_name": "",
- "unowned_files_not_processed": ""
+ "streamable_videos": "Vídeos en streaming",
+ "processing_videos_status": "Procesando vídeos...",
+ "share_favorites": "Compartir favoritos",
+ "person_favorites": "Los favoritos de {{name}}",
+ "shared_favorites": "Favoritos compartidos",
+ "added_by_name": "Añadido por {{name}}",
+ "unowned_files_not_processed": "Los archivos añadidos por otros usuarios no han sido procesados"
}
diff --git a/web/packages/base/locales/ms-BN/translation.json b/web/packages/base/locales/ms-BN/translation.json
new file mode 100644
index 0000000000..23a6018ed0
--- /dev/null
+++ b/web/packages/base/locales/ms-BN/translation.json
@@ -0,0 +1,689 @@
+{
+ "intro_slide_1_title": "",
+ "intro_slide_1": "",
+ "intro_slide_2_title": "",
+ "intro_slide_2": "",
+ "intro_slide_3_title": "",
+ "intro_slide_3": "",
+ "login": "",
+ "sign_up": "",
+ "new_to_ente": "",
+ "existing_user": "",
+ "enter_email": "",
+ "invalid_email_error": "",
+ "required": "",
+ "email_not_registered": "",
+ "email_already_registered": "",
+ "email_sent": "",
+ "check_inbox_hint": "",
+ "verification_code": "",
+ "resend_code": "",
+ "verify": "",
+ "send_otp": "",
+ "generic_error": "",
+ "generic_error_retry": "",
+ "invalid_code_error": "",
+ "expired_code_error": "",
+ "status_sending": "",
+ "status_sent": "",
+ "password": "",
+ "link_password_description": "",
+ "unlock": "",
+ "set_password": "",
+ "sign_in": "",
+ "incorrect_password": "",
+ "incorrect_password_or_no_account": "",
+ "pick_password_hint": "",
+ "pick_password_caution": "",
+ "key_generation_in_progress": "",
+ "confirm_password": "",
+ "referral_source_hint": "",
+ "referral_source_info": "",
+ "password_mismatch_error": "",
+ "show_or_hide_password": "",
+ "welcome_to_ente_title": "",
+ "welcome_to_ente_subtitle": "",
+ "new_album": "",
+ "create_albums": "",
+ "album_name": "",
+ "close": "",
+ "yes": "",
+ "no": "",
+ "nothing_here": "",
+ "upload": "",
+ "import": "",
+ "add_photos": "",
+ "add_more_photos": "",
+ "add_photos_count_one": "",
+ "add_photos_count": "",
+ "select_photos": "",
+ "file_upload": "",
+ "preparing": "",
+ "processed_counts": "",
+ "upload_reading_metadata_files": "",
+ "upload_cancelling": "",
+ "upload_done": "",
+ "upload_skipped": "",
+ "initial_load_delay_warning": "",
+ "no_account": "",
+ "existing_account": "",
+ "create": "",
+ "files_count": "",
+ "download": "",
+ "download_album": "",
+ "download_favorites": "",
+ "download_uncategorized": "",
+ "download_hidden_items": "",
+ "audio": "",
+ "more": "",
+ "mouse_scroll": "",
+ "pan": "",
+ "pinch": "",
+ "drag": "",
+ "tap_inside_image": "",
+ "tap_outside_image": "",
+ "shortcuts": "",
+ "show_shortcuts": "",
+ "zoom_preset": "",
+ "toggle_controls": "",
+ "toggle_live": "",
+ "toggle_audio": "",
+ "toggle_favorite": "",
+ "toggle_archive": "",
+ "view_info": "",
+ "copy_as_png": "",
+ "toggle_fullscreen": "",
+ "exit_fullscreen": "",
+ "go_fullscreen": "",
+ "zoom": "",
+ "play": "",
+ "pause": "",
+ "previous": "",
+ "next": "",
+ "video_seek": "",
+ "quality": "",
+ "auto": "",
+ "original": "",
+ "speed": "",
+ "title_photos": "",
+ "title_auth": "",
+ "title_accounts": "",
+ "upload_first_photo": "",
+ "import_your_folders": "",
+ "upload_dropzone_hint": "",
+ "watch_folder_dropzone_hint": "",
+ "trash_files_title": "",
+ "trash_file_title": "",
+ "delete_files_title": "",
+ "delete_files_message": "",
+ "selected_count": "",
+ "selected_and_yours_count": "",
+ "delete": "",
+ "favorite": "",
+ "convert": "",
+ "multi_folder_upload": "",
+ "upload_to_choice": "",
+ "upload_to_single_album": "",
+ "upload_to_album_per_folder": "",
+ "session_expired": "",
+ "session_expired_message": "",
+ "password_generation_failed": "",
+ "change_password": "",
+ "password_changed_elsewhere": "",
+ "password_changed_elsewhere_message": "",
+ "go_back": "",
+ "account": "",
+ "recovery_key": "",
+ "do_this_later": "",
+ "save_key": "",
+ "recovery_key_description": "",
+ "key_not_stored_note": "",
+ "recovery_key_generation_failed": "",
+ "forgot_password": "",
+ "recover_account": "",
+ "recover": "",
+ "no_recovery_key_title": "",
+ "incorrect_recovery_key": "",
+ "sorry": "",
+ "no_recovery_key_message": "",
+ "no_two_factor_recovery_key_message": "",
+ "contact_support": "",
+ "help": "",
+ "ente_help": "",
+ "blog": "",
+ "request_feature": "",
+ "support": "",
+ "cancel": "",
+ "logout": "",
+ "logout_message": "",
+ "delete_account": "",
+ "delete_account_manually_message": "",
+ "change_email": "",
+ "ok": "",
+ "success": "",
+ "error": "",
+ "note": "",
+ "offline_message": "",
+ "install": "",
+ "install_mobile_app": "",
+ "download_app": "",
+ "download_app_message": "",
+ "subscription": "",
+ "manage_payment_method": "",
+ "manage_family": "",
+ "family_plan": "",
+ "leave_family_plan": "",
+ "leave": "",
+ "leave_family_plan_confirm": "",
+ "choose_plan": "",
+ "manage_plan": "",
+ "current_usage": "",
+ "two_months_free": "",
+ "free_plan_option": "",
+ "free_plan_description": "",
+ "active": "",
+ "subscription_info_free": "",
+ "subscription_info_family": "",
+ "subscription_info_expired": "",
+ "subscription_info_renewal_cancelled": "",
+ "subscription_info_storage_quota_exceeded": "",
+ "subscription_status_renewal_active": "",
+ "subscription_status_renewal_cancelled": "",
+ "add_on_valid_till": "",
+ "subscription_expired": "",
+ "storage_quota_exceeded": "",
+ "subscription_purchase_success": "",
+ "subscription_purchase_cancelled": "",
+ "subscription_purchase_failed": "",
+ "subscription_verification_error": "",
+ "update_payment_method_message": "",
+ "payment_method_authentication_failed": "",
+ "update_payment_method": "",
+ "monthly": "",
+ "yearly": "",
+ "month_short": "",
+ "year": "",
+ "update_subscription": "",
+ "update_subscription_title": "",
+ "update_subscription_message": "",
+ "cancel_subscription": "",
+ "cancel_subscription_message": "",
+ "cancel_subscription_with_addon_message": "",
+ "subscription_cancel_success": "",
+ "reactivate_subscription": "",
+ "reactivate_subscription_message": "",
+ "subscription_activate_success": "",
+ "thank_you": "",
+ "cancel_subscription_on_mobile": "",
+ "cancel_subscription_on_mobile_message": "",
+ "mail_to_manage_subscription": "",
+ "rename": "",
+ "rename_file": "",
+ "rename_album": "",
+ "delete_album": "",
+ "delete_album_title": "",
+ "delete_album_message": "",
+ "delete_photos": "",
+ "keep_photos": "",
+ "share_album": "",
+ "sharing_with_self": "",
+ "sharing_already_shared": "",
+ "sharing_album_not_allowed": "",
+ "sharing_disabled_for_free_accounts": "",
+ "sharing_user_does_not_exist": "",
+ "search": "",
+ "search_results": "",
+ "no_results": "",
+ "search_hint": "",
+ "album": "",
+ "date": "",
+ "description": "",
+ "file_type": "",
+ "magic": "",
+ "photos_count_zero": "",
+ "photos_count_one": "",
+ "photos_count": "",
+ "terms_and_conditions": "",
+ "people": "",
+ "indexing_scheduled": "",
+ "indexing_photos": "",
+ "indexing_fetching": "",
+ "indexing_people": "",
+ "syncing_wait": "",
+ "people_empty_too_few": "",
+ "unnamed_person": "",
+ "add_a_name": "",
+ "new_person": "",
+ "add_name": "",
+ "rename_person": "",
+ "reset_person_confirm": "",
+ "reset_person_confirm_message": "",
+ "ignore": "",
+ "ignore_person_confirm": "",
+ "ignore_person_confirm_message": "",
+ "ignored": "",
+ "show_person": "",
+ "review_suggestions": "",
+ "saved_choices": "",
+ "discard_changes": "",
+ "discard_changes_confirm_message": "",
+ "people_suggestions_finding": "",
+ "people_suggestions_empty": "",
+ "info": "",
+ "file_name": "",
+ "caption_placeholder": "",
+ "location": "",
+ "view_on_map": "",
+ "map": "",
+ "enable_map": "",
+ "enable_maps_confirm": "",
+ "enable_maps_confirm_message": "",
+ "disable_map": "",
+ "disable_maps_confirm": "",
+ "disable_maps_confirm_message": "",
+ "details": "",
+ "view_exif": "",
+ "no_exif": "",
+ "exif": "",
+ "two_factor": "",
+ "two_factor_authentication": "",
+ "two_factor_qr_help": "",
+ "two_factor_manual_entry_title": "",
+ "two_factor_manual_entry_message": "",
+ "scan_qr_title": "",
+ "enable_two_factor": "",
+ "enable": "",
+ "enabled": "",
+ "lost_2fa_device": "",
+ "incorrect_code": "",
+ "two_factor_info": "",
+ "disable": "",
+ "reconfigure": "",
+ "reconfigure_two_factor_hint": "",
+ "update_two_factor": "",
+ "update_two_factor_message": "",
+ "update": "",
+ "disable_two_factor": "",
+ "disable_two_factor_message": "",
+ "export_data": "",
+ "select_folder": "",
+ "select_zips": "",
+ "faq": "",
+ "takeout_hint": "",
+ "destination": "",
+ "start": "",
+ "last_export_time": "",
+ "export_again": "",
+ "local_storage_not_accessible": "",
+ "email_already_taken": "",
+ "live_photos_detected": "",
+ "ignored_uploads": "",
+ "ignored_uploads_hint": "",
+ "file_not_uploaded_list": "",
+ "failed_uploads": "",
+ "failed_uploads_hint": "",
+ "retry_failed_uploads": "",
+ "thumbnail_generation_failed": "",
+ "thumbnail_generation_failed_hint": "",
+ "unsupported_files": "",
+ "unsupported_files_hint": "",
+ "blocked_uploads": "",
+ "blocked_uploads_hint": "",
+ "large_files": "",
+ "large_files_hint": "",
+ "insufficient_storage": "",
+ "insufficient_storage_hint": "",
+ "uploads_in_progress": "",
+ "successful_uploads": "",
+ "upload_to_album": "",
+ "add_to_album": "",
+ "move_to_album": "",
+ "unhide_to_album": "",
+ "restore_to_album": "",
+ "section_all": "",
+ "section_uncategorized": "",
+ "section_archive": "",
+ "section_hidden": "",
+ "section_trash": "",
+ "favorites": "",
+ "archive": "",
+ "archive_album": "",
+ "unarchive": "",
+ "unarchive_album": "",
+ "hide_collection": "",
+ "unhide_collection": "",
+ "move": "",
+ "add": "",
+ "remove": "",
+ "yes_remove": "",
+ "remove_from_album": "",
+ "move_to_trash": "",
+ "trash_files_message": "",
+ "trash_file_message": "",
+ "delete_permanently": "",
+ "restore": "",
+ "empty_trash": "",
+ "empty_trash_title": "",
+ "empty_trash_message": "",
+ "leave_album": "",
+ "leave_shared_album_title": "",
+ "leave_shared_album_message": "",
+ "leave_shared_album": "",
+ "confirm_remove_message": "",
+ "confirm_remove_incl_others_message": "",
+ "oldest": "",
+ "last_updated": "",
+ "name": "",
+ "fix_creation_time": "",
+ "fix_creation_time_in_progress": "",
+ "fix_creation_time_file_updated": "",
+ "fix_creation_time_completed": "",
+ "fix_creation_time_completed_with_errors": "",
+ "fix_creation_time_options": "",
+ "exif_date_time_original": "",
+ "exif_date_time_digitized": "",
+ "exif_metadata_date": "",
+ "custom_time": "",
+ "caption_character_limit": "",
+ "sharing_details": "",
+ "modify_sharing": "",
+ "add_collaborators": "",
+ "add_new_email": "",
+ "shared_with_people_count_zero": "",
+ "shared_with_people_count_one": "",
+ "shared_with_people_count": "",
+ "participants_count_zero": "",
+ "participants_count_one": "",
+ "participants_count": "",
+ "add_viewers": "",
+ "change_permission_to_viewer": "",
+ "change_permission_to_collaborator": "",
+ "change_permission_title": "",
+ "confirm_convert_to_viewer": "",
+ "confirm_convert_to_collaborator": "",
+ "manage": "",
+ "added_as": "",
+ "collaborator_hint": "",
+ "remove_participant": "",
+ "remove_participant_title": "",
+ "remove_participant_message": "",
+ "confirm_remove": "",
+ "owner": "",
+ "collaborators": "",
+ "viewers": "",
+ "add_more": "",
+ "or_add_existing": "",
+ "not_found": "",
+ "link_expired": "",
+ "link_expired_message": "",
+ "manage_link": "",
+ "link_request_limit_exceeded": "",
+ "allow_downloads": "",
+ "allow_adding_photos": "",
+ "allow_adding_photos_hint": "",
+ "device_limit": "",
+ "none": "",
+ "link_expiry": "",
+ "never": "",
+ "after_time": {
+ "hour": "",
+ "day": "",
+ "week": "",
+ "month": "",
+ "year": ""
+ },
+ "copy_link": "",
+ "done": "",
+ "share_link_section_title": "",
+ "remove_link": "",
+ "create_public_link": "",
+ "public_link_created": "",
+ "public_link_enabled": "",
+ "collect_photos": "",
+ "disable_file_download": "",
+ "disable_file_download_message": "",
+ "shared_using": "",
+ "sharing_referral_code": "",
+ "disable_password": "",
+ "disable_password_message": "",
+ "password_lock": "",
+ "lock": "",
+ "file": "",
+ "folder": "",
+ "google_takeout": "",
+ "deduplicate_files": "",
+ "remove_duplicates": "",
+ "total_size": "",
+ "count": "",
+ "deselect_all": "",
+ "no_duplicates": "",
+ "duplicate_group_description": "",
+ "remove_duplicates_button_count": "",
+ "stop_uploads_title": "",
+ "stop_uploads_message": "",
+ "yes_stop_uploads": "",
+ "stop_downloads_title": "",
+ "stop_downloads_message": "",
+ "yes_stop_downloads": "",
+ "albums": "",
+ "albums_count_one": "",
+ "albums_count": "",
+ "all_albums": "",
+ "all_hidden_albums": "",
+ "hidden_albums": "",
+ "hidden_items": "",
+ "enter_two_factor_otp": "",
+ "create_account": "",
+ "copied": "",
+ "upgrade_now": "",
+ "renew_now": "",
+ "storage": "",
+ "used": "",
+ "you": "",
+ "family": "",
+ "free": "",
+ "of": "",
+ "watch_folders": "",
+ "watched_folders": "",
+ "no_folders_added": "",
+ "watch_folders_hint_1": "",
+ "watch_folders_hint_2": "",
+ "watch_folders_hint_3": "",
+ "add_folder": "",
+ "stop_watching": "",
+ "stop_watching_folder_title": "",
+ "stop_watching_folder_message": "",
+ "yes_stop": "",
+ "change_folder": "",
+ "view_logs": "",
+ "view_logs_message": "",
+ "weak_device_hint": "",
+ "drag_and_drop_hint": "",
+ "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": "",
+ "enter_name": "",
+ "uploader_name_hint": "",
+ "name_placeholder": "",
+ "more_details": "",
+ "ml_search": "",
+ "ml_search_description": "",
+ "ml_search_footnote": "",
+ "indexing": "",
+ "processed": "",
+ "indexing_status_running": "",
+ "indexing_status_fetching": "",
+ "indexing_status_scheduled": "",
+ "indexing_status_done": "",
+ "ml_search_disable": "",
+ "ml_search_disable_confirm": "",
+ "ml_consent": "",
+ "ml_consent_title": "",
+ "ml_consent_description": "",
+ "ml_consent_confirmation": "",
+ "labs": "",
+ "password_strength_weak": "",
+ "password_strength_moderate": "",
+ "password_strength_strong": "",
+ "preferences": "",
+ "language": "",
+ "advanced": "",
+ "export_directory_does_not_exist": "",
+ "export_directory_does_not_exist_message": "",
+ "storage_unit": {
+ "b": "",
+ "kb": "",
+ "mb": "",
+ "gb": "",
+ "tb": ""
+ },
+ "stop": "",
+ "sync_continuously": "",
+ "export_starting": "",
+ "export_preparing": "",
+ "export_renaming_album_folders": "",
+ "export_trashing_deleted_files": "",
+ "export_trashing_deleted_albums": "",
+ "export_progress": "",
+ "pending_items": "",
+ "delete_account_reason_label": "",
+ "delete_account_reason_placeholder": "",
+ "delete_reason": {
+ "missing_feature": "",
+ "behaviour": "",
+ "found_another_service": "",
+ "not_listed": ""
+ },
+ "delete_account_feedback_label": "",
+ "delete_account_feedback_placeholder": "",
+ "delete_account_confirm_checkbox_label": "",
+ "delete_account_confirm": "",
+ "delete_account_confirm_message": "",
+ "feedback_required": "",
+ "feedback_required_found_another_service": "",
+ "recover_two_factor": "",
+ "at": "",
+ "auth_next": "",
+ "auth_download_mobile_app": "",
+ "no_codes_added_yet": "",
+ "hide": "",
+ "unhide": "",
+ "sort_by": "",
+ "newest_first": "",
+ "oldest_first": "",
+ "pin_album": "",
+ "unpin_album": "",
+ "unpreviewable_file_message": "",
+ "download_complete": "",
+ "downloading_album": "",
+ "download_failed": "",
+ "download_progress": "",
+ "christmas": "",
+ "christmas_eve": "",
+ "new_year": "",
+ "new_year_eve": "",
+ "image": "",
+ "video": "",
+ "live_photo": "",
+ "live": "",
+ "edit_image": "",
+ "photo_editor": "",
+ "confirm_editor_close": "",
+ "confirm_editor_close_message": "",
+ "brightness": "",
+ "contrast": "",
+ "saturation": "",
+ "blur": "",
+ "transform": "",
+ "crop": "",
+ "aspect_ratio": "",
+ "square": "",
+ "freehand": "",
+ "apply_crop": "",
+ "rotation": "",
+ "rotate_left": "",
+ "rotate_right": "",
+ "flip": "",
+ "flip_vertically": "",
+ "flip_horizontally": "",
+ "download_edited": "",
+ "save_a_copy_to_ente": "",
+ "restore_original": "",
+ "photo_edit_required_to_save": "",
+ "colors": "",
+ "invert_colors": "",
+ "reset": "",
+ "faster_upload": "",
+ "faster_upload_description": "",
+ "open_ente_on_startup": "",
+ "cast_album_to_tv": "",
+ "cast_to_tv": "",
+ "enter_cast_pin_code": "",
+ "code": "",
+ "pair_device_to_tv": "",
+ "tv_not_found": "",
+ "cast_auto_pair": "",
+ "cast_auto_pair_description": "",
+ "choose_device_from_browser": "",
+ "cast_auto_pair_failed": "",
+ "pair_with_pin": "",
+ "pair_with_pin_description": "",
+ "visit_cast_url": "",
+ "passkeys": "",
+ "passkey_fetch_failed": "",
+ "manage_passkey": "",
+ "delete_passkey": "",
+ "delete_passkey_confirmation": "",
+ "rename_passkey": "",
+ "add_passkey": "",
+ "enter_passkey_name": "",
+ "passkeys_description": "",
+ "created_at": "",
+ "passkey_add_failed": "",
+ "passkey_login_failed": "",
+ "passkey_login_invalid_url": "",
+ "passkey_login_already_claimed_session": "",
+ "passkey_login_generic_error": "",
+ "passkey_login_credential_hint": "",
+ "passkeys_not_supported": "",
+ "try_again": "",
+ "check_status": "",
+ "passkey_login_instructions": "",
+ "passkey_login": "",
+ "totp_login": "",
+ "passkey": "",
+ "passkey_verify_description": "",
+ "waiting_for_verification": "",
+ "verification_still_pending": "",
+ "passkey_verified": "",
+ "redirecting_back_to_app": "",
+ "redirect_close_instructions": "",
+ "redirect_again": "",
+ "autogenerated_first_album_name": "",
+ "autogenerated_default_album_name": "",
+ "developer_settings": "",
+ "server_endpoint": "",
+ "more_information": "",
+ "save": "",
+ "theme": "",
+ "system": "",
+ "light": "",
+ "dark": "",
+ "streamable_videos": "",
+ "processing_videos_status": "",
+ "share_favorites": "",
+ "person_favorites": "",
+ "shared_favorites": "",
+ "added_by_name": "",
+ "unowned_files_not_processed": ""
+}
diff --git a/web/packages/base/locales/ms-MY/translation.json b/web/packages/base/locales/ms-MY/translation.json
new file mode 100644
index 0000000000..23a6018ed0
--- /dev/null
+++ b/web/packages/base/locales/ms-MY/translation.json
@@ -0,0 +1,689 @@
+{
+ "intro_slide_1_title": "",
+ "intro_slide_1": "",
+ "intro_slide_2_title": "",
+ "intro_slide_2": "",
+ "intro_slide_3_title": "",
+ "intro_slide_3": "",
+ "login": "",
+ "sign_up": "",
+ "new_to_ente": "",
+ "existing_user": "",
+ "enter_email": "",
+ "invalid_email_error": "",
+ "required": "",
+ "email_not_registered": "",
+ "email_already_registered": "",
+ "email_sent": "",
+ "check_inbox_hint": "",
+ "verification_code": "",
+ "resend_code": "",
+ "verify": "",
+ "send_otp": "",
+ "generic_error": "",
+ "generic_error_retry": "",
+ "invalid_code_error": "",
+ "expired_code_error": "",
+ "status_sending": "",
+ "status_sent": "",
+ "password": "",
+ "link_password_description": "",
+ "unlock": "",
+ "set_password": "",
+ "sign_in": "",
+ "incorrect_password": "",
+ "incorrect_password_or_no_account": "",
+ "pick_password_hint": "",
+ "pick_password_caution": "",
+ "key_generation_in_progress": "",
+ "confirm_password": "",
+ "referral_source_hint": "",
+ "referral_source_info": "",
+ "password_mismatch_error": "",
+ "show_or_hide_password": "",
+ "welcome_to_ente_title": "",
+ "welcome_to_ente_subtitle": "",
+ "new_album": "",
+ "create_albums": "",
+ "album_name": "",
+ "close": "",
+ "yes": "",
+ "no": "",
+ "nothing_here": "",
+ "upload": "",
+ "import": "",
+ "add_photos": "",
+ "add_more_photos": "",
+ "add_photos_count_one": "",
+ "add_photos_count": "",
+ "select_photos": "",
+ "file_upload": "",
+ "preparing": "",
+ "processed_counts": "",
+ "upload_reading_metadata_files": "",
+ "upload_cancelling": "",
+ "upload_done": "",
+ "upload_skipped": "",
+ "initial_load_delay_warning": "",
+ "no_account": "",
+ "existing_account": "",
+ "create": "",
+ "files_count": "",
+ "download": "",
+ "download_album": "",
+ "download_favorites": "",
+ "download_uncategorized": "",
+ "download_hidden_items": "",
+ "audio": "",
+ "more": "",
+ "mouse_scroll": "",
+ "pan": "",
+ "pinch": "",
+ "drag": "",
+ "tap_inside_image": "",
+ "tap_outside_image": "",
+ "shortcuts": "",
+ "show_shortcuts": "",
+ "zoom_preset": "",
+ "toggle_controls": "",
+ "toggle_live": "",
+ "toggle_audio": "",
+ "toggle_favorite": "",
+ "toggle_archive": "",
+ "view_info": "",
+ "copy_as_png": "",
+ "toggle_fullscreen": "",
+ "exit_fullscreen": "",
+ "go_fullscreen": "",
+ "zoom": "",
+ "play": "",
+ "pause": "",
+ "previous": "",
+ "next": "",
+ "video_seek": "",
+ "quality": "",
+ "auto": "",
+ "original": "",
+ "speed": "",
+ "title_photos": "",
+ "title_auth": "",
+ "title_accounts": "",
+ "upload_first_photo": "",
+ "import_your_folders": "",
+ "upload_dropzone_hint": "",
+ "watch_folder_dropzone_hint": "",
+ "trash_files_title": "",
+ "trash_file_title": "",
+ "delete_files_title": "",
+ "delete_files_message": "",
+ "selected_count": "",
+ "selected_and_yours_count": "",
+ "delete": "",
+ "favorite": "",
+ "convert": "",
+ "multi_folder_upload": "",
+ "upload_to_choice": "",
+ "upload_to_single_album": "",
+ "upload_to_album_per_folder": "",
+ "session_expired": "",
+ "session_expired_message": "",
+ "password_generation_failed": "",
+ "change_password": "",
+ "password_changed_elsewhere": "",
+ "password_changed_elsewhere_message": "",
+ "go_back": "",
+ "account": "",
+ "recovery_key": "",
+ "do_this_later": "",
+ "save_key": "",
+ "recovery_key_description": "",
+ "key_not_stored_note": "",
+ "recovery_key_generation_failed": "",
+ "forgot_password": "",
+ "recover_account": "",
+ "recover": "",
+ "no_recovery_key_title": "",
+ "incorrect_recovery_key": "",
+ "sorry": "",
+ "no_recovery_key_message": "",
+ "no_two_factor_recovery_key_message": "",
+ "contact_support": "",
+ "help": "",
+ "ente_help": "",
+ "blog": "",
+ "request_feature": "",
+ "support": "",
+ "cancel": "",
+ "logout": "",
+ "logout_message": "",
+ "delete_account": "",
+ "delete_account_manually_message": "",
+ "change_email": "",
+ "ok": "",
+ "success": "",
+ "error": "",
+ "note": "",
+ "offline_message": "",
+ "install": "",
+ "install_mobile_app": "",
+ "download_app": "",
+ "download_app_message": "",
+ "subscription": "",
+ "manage_payment_method": "",
+ "manage_family": "",
+ "family_plan": "",
+ "leave_family_plan": "",
+ "leave": "",
+ "leave_family_plan_confirm": "",
+ "choose_plan": "",
+ "manage_plan": "",
+ "current_usage": "",
+ "two_months_free": "",
+ "free_plan_option": "",
+ "free_plan_description": "",
+ "active": "",
+ "subscription_info_free": "",
+ "subscription_info_family": "",
+ "subscription_info_expired": "",
+ "subscription_info_renewal_cancelled": "",
+ "subscription_info_storage_quota_exceeded": "",
+ "subscription_status_renewal_active": "",
+ "subscription_status_renewal_cancelled": "",
+ "add_on_valid_till": "",
+ "subscription_expired": "",
+ "storage_quota_exceeded": "",
+ "subscription_purchase_success": "",
+ "subscription_purchase_cancelled": "",
+ "subscription_purchase_failed": "",
+ "subscription_verification_error": "",
+ "update_payment_method_message": "",
+ "payment_method_authentication_failed": "",
+ "update_payment_method": "",
+ "monthly": "",
+ "yearly": "",
+ "month_short": "",
+ "year": "",
+ "update_subscription": "",
+ "update_subscription_title": "",
+ "update_subscription_message": "",
+ "cancel_subscription": "",
+ "cancel_subscription_message": "",
+ "cancel_subscription_with_addon_message": "",
+ "subscription_cancel_success": "",
+ "reactivate_subscription": "",
+ "reactivate_subscription_message": "",
+ "subscription_activate_success": "",
+ "thank_you": "",
+ "cancel_subscription_on_mobile": "",
+ "cancel_subscription_on_mobile_message": "",
+ "mail_to_manage_subscription": "",
+ "rename": "",
+ "rename_file": "",
+ "rename_album": "",
+ "delete_album": "",
+ "delete_album_title": "",
+ "delete_album_message": "",
+ "delete_photos": "",
+ "keep_photos": "",
+ "share_album": "",
+ "sharing_with_self": "",
+ "sharing_already_shared": "",
+ "sharing_album_not_allowed": "",
+ "sharing_disabled_for_free_accounts": "",
+ "sharing_user_does_not_exist": "",
+ "search": "",
+ "search_results": "",
+ "no_results": "",
+ "search_hint": "",
+ "album": "",
+ "date": "",
+ "description": "",
+ "file_type": "",
+ "magic": "",
+ "photos_count_zero": "",
+ "photos_count_one": "",
+ "photos_count": "",
+ "terms_and_conditions": "",
+ "people": "",
+ "indexing_scheduled": "",
+ "indexing_photos": "",
+ "indexing_fetching": "",
+ "indexing_people": "",
+ "syncing_wait": "",
+ "people_empty_too_few": "",
+ "unnamed_person": "",
+ "add_a_name": "",
+ "new_person": "",
+ "add_name": "",
+ "rename_person": "",
+ "reset_person_confirm": "",
+ "reset_person_confirm_message": "",
+ "ignore": "",
+ "ignore_person_confirm": "",
+ "ignore_person_confirm_message": "",
+ "ignored": "",
+ "show_person": "",
+ "review_suggestions": "",
+ "saved_choices": "",
+ "discard_changes": "",
+ "discard_changes_confirm_message": "",
+ "people_suggestions_finding": "",
+ "people_suggestions_empty": "",
+ "info": "",
+ "file_name": "",
+ "caption_placeholder": "",
+ "location": "",
+ "view_on_map": "",
+ "map": "",
+ "enable_map": "",
+ "enable_maps_confirm": "",
+ "enable_maps_confirm_message": "",
+ "disable_map": "",
+ "disable_maps_confirm": "",
+ "disable_maps_confirm_message": "",
+ "details": "",
+ "view_exif": "",
+ "no_exif": "",
+ "exif": "",
+ "two_factor": "",
+ "two_factor_authentication": "",
+ "two_factor_qr_help": "",
+ "two_factor_manual_entry_title": "",
+ "two_factor_manual_entry_message": "",
+ "scan_qr_title": "",
+ "enable_two_factor": "",
+ "enable": "",
+ "enabled": "",
+ "lost_2fa_device": "",
+ "incorrect_code": "",
+ "two_factor_info": "",
+ "disable": "",
+ "reconfigure": "",
+ "reconfigure_two_factor_hint": "",
+ "update_two_factor": "",
+ "update_two_factor_message": "",
+ "update": "",
+ "disable_two_factor": "",
+ "disable_two_factor_message": "",
+ "export_data": "",
+ "select_folder": "",
+ "select_zips": "",
+ "faq": "",
+ "takeout_hint": "",
+ "destination": "",
+ "start": "",
+ "last_export_time": "",
+ "export_again": "",
+ "local_storage_not_accessible": "",
+ "email_already_taken": "",
+ "live_photos_detected": "",
+ "ignored_uploads": "",
+ "ignored_uploads_hint": "",
+ "file_not_uploaded_list": "",
+ "failed_uploads": "",
+ "failed_uploads_hint": "",
+ "retry_failed_uploads": "",
+ "thumbnail_generation_failed": "",
+ "thumbnail_generation_failed_hint": "",
+ "unsupported_files": "",
+ "unsupported_files_hint": "",
+ "blocked_uploads": "",
+ "blocked_uploads_hint": "",
+ "large_files": "",
+ "large_files_hint": "",
+ "insufficient_storage": "",
+ "insufficient_storage_hint": "",
+ "uploads_in_progress": "",
+ "successful_uploads": "",
+ "upload_to_album": "",
+ "add_to_album": "",
+ "move_to_album": "",
+ "unhide_to_album": "",
+ "restore_to_album": "",
+ "section_all": "",
+ "section_uncategorized": "",
+ "section_archive": "",
+ "section_hidden": "",
+ "section_trash": "",
+ "favorites": "",
+ "archive": "",
+ "archive_album": "",
+ "unarchive": "",
+ "unarchive_album": "",
+ "hide_collection": "",
+ "unhide_collection": "",
+ "move": "",
+ "add": "",
+ "remove": "",
+ "yes_remove": "",
+ "remove_from_album": "",
+ "move_to_trash": "",
+ "trash_files_message": "",
+ "trash_file_message": "",
+ "delete_permanently": "",
+ "restore": "",
+ "empty_trash": "",
+ "empty_trash_title": "",
+ "empty_trash_message": "",
+ "leave_album": "",
+ "leave_shared_album_title": "",
+ "leave_shared_album_message": "",
+ "leave_shared_album": "",
+ "confirm_remove_message": "",
+ "confirm_remove_incl_others_message": "",
+ "oldest": "",
+ "last_updated": "",
+ "name": "",
+ "fix_creation_time": "",
+ "fix_creation_time_in_progress": "",
+ "fix_creation_time_file_updated": "",
+ "fix_creation_time_completed": "",
+ "fix_creation_time_completed_with_errors": "",
+ "fix_creation_time_options": "",
+ "exif_date_time_original": "",
+ "exif_date_time_digitized": "",
+ "exif_metadata_date": "",
+ "custom_time": "",
+ "caption_character_limit": "",
+ "sharing_details": "",
+ "modify_sharing": "",
+ "add_collaborators": "",
+ "add_new_email": "",
+ "shared_with_people_count_zero": "",
+ "shared_with_people_count_one": "",
+ "shared_with_people_count": "",
+ "participants_count_zero": "",
+ "participants_count_one": "",
+ "participants_count": "",
+ "add_viewers": "",
+ "change_permission_to_viewer": "",
+ "change_permission_to_collaborator": "",
+ "change_permission_title": "",
+ "confirm_convert_to_viewer": "",
+ "confirm_convert_to_collaborator": "",
+ "manage": "",
+ "added_as": "",
+ "collaborator_hint": "",
+ "remove_participant": "",
+ "remove_participant_title": "",
+ "remove_participant_message": "",
+ "confirm_remove": "",
+ "owner": "",
+ "collaborators": "",
+ "viewers": "",
+ "add_more": "",
+ "or_add_existing": "",
+ "not_found": "",
+ "link_expired": "",
+ "link_expired_message": "",
+ "manage_link": "",
+ "link_request_limit_exceeded": "",
+ "allow_downloads": "",
+ "allow_adding_photos": "",
+ "allow_adding_photos_hint": "",
+ "device_limit": "",
+ "none": "",
+ "link_expiry": "",
+ "never": "",
+ "after_time": {
+ "hour": "",
+ "day": "",
+ "week": "",
+ "month": "",
+ "year": ""
+ },
+ "copy_link": "",
+ "done": "",
+ "share_link_section_title": "",
+ "remove_link": "",
+ "create_public_link": "",
+ "public_link_created": "",
+ "public_link_enabled": "",
+ "collect_photos": "",
+ "disable_file_download": "",
+ "disable_file_download_message": "",
+ "shared_using": "",
+ "sharing_referral_code": "",
+ "disable_password": "",
+ "disable_password_message": "",
+ "password_lock": "",
+ "lock": "",
+ "file": "",
+ "folder": "",
+ "google_takeout": "",
+ "deduplicate_files": "",
+ "remove_duplicates": "",
+ "total_size": "",
+ "count": "",
+ "deselect_all": "",
+ "no_duplicates": "",
+ "duplicate_group_description": "",
+ "remove_duplicates_button_count": "",
+ "stop_uploads_title": "",
+ "stop_uploads_message": "",
+ "yes_stop_uploads": "",
+ "stop_downloads_title": "",
+ "stop_downloads_message": "",
+ "yes_stop_downloads": "",
+ "albums": "",
+ "albums_count_one": "",
+ "albums_count": "",
+ "all_albums": "",
+ "all_hidden_albums": "",
+ "hidden_albums": "",
+ "hidden_items": "",
+ "enter_two_factor_otp": "",
+ "create_account": "",
+ "copied": "",
+ "upgrade_now": "",
+ "renew_now": "",
+ "storage": "",
+ "used": "",
+ "you": "",
+ "family": "",
+ "free": "",
+ "of": "",
+ "watch_folders": "",
+ "watched_folders": "",
+ "no_folders_added": "",
+ "watch_folders_hint_1": "",
+ "watch_folders_hint_2": "",
+ "watch_folders_hint_3": "",
+ "add_folder": "",
+ "stop_watching": "",
+ "stop_watching_folder_title": "",
+ "stop_watching_folder_message": "",
+ "yes_stop": "",
+ "change_folder": "",
+ "view_logs": "",
+ "view_logs_message": "",
+ "weak_device_hint": "",
+ "drag_and_drop_hint": "",
+ "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": "",
+ "enter_name": "",
+ "uploader_name_hint": "",
+ "name_placeholder": "",
+ "more_details": "",
+ "ml_search": "",
+ "ml_search_description": "",
+ "ml_search_footnote": "",
+ "indexing": "",
+ "processed": "",
+ "indexing_status_running": "",
+ "indexing_status_fetching": "",
+ "indexing_status_scheduled": "",
+ "indexing_status_done": "",
+ "ml_search_disable": "",
+ "ml_search_disable_confirm": "",
+ "ml_consent": "",
+ "ml_consent_title": "",
+ "ml_consent_description": "",
+ "ml_consent_confirmation": "",
+ "labs": "",
+ "password_strength_weak": "",
+ "password_strength_moderate": "",
+ "password_strength_strong": "",
+ "preferences": "",
+ "language": "",
+ "advanced": "",
+ "export_directory_does_not_exist": "",
+ "export_directory_does_not_exist_message": "",
+ "storage_unit": {
+ "b": "",
+ "kb": "",
+ "mb": "",
+ "gb": "",
+ "tb": ""
+ },
+ "stop": "",
+ "sync_continuously": "",
+ "export_starting": "",
+ "export_preparing": "",
+ "export_renaming_album_folders": "",
+ "export_trashing_deleted_files": "",
+ "export_trashing_deleted_albums": "",
+ "export_progress": "",
+ "pending_items": "",
+ "delete_account_reason_label": "",
+ "delete_account_reason_placeholder": "",
+ "delete_reason": {
+ "missing_feature": "",
+ "behaviour": "",
+ "found_another_service": "",
+ "not_listed": ""
+ },
+ "delete_account_feedback_label": "",
+ "delete_account_feedback_placeholder": "",
+ "delete_account_confirm_checkbox_label": "",
+ "delete_account_confirm": "",
+ "delete_account_confirm_message": "",
+ "feedback_required": "",
+ "feedback_required_found_another_service": "",
+ "recover_two_factor": "",
+ "at": "",
+ "auth_next": "",
+ "auth_download_mobile_app": "",
+ "no_codes_added_yet": "",
+ "hide": "",
+ "unhide": "",
+ "sort_by": "",
+ "newest_first": "",
+ "oldest_first": "",
+ "pin_album": "",
+ "unpin_album": "",
+ "unpreviewable_file_message": "",
+ "download_complete": "",
+ "downloading_album": "",
+ "download_failed": "",
+ "download_progress": "",
+ "christmas": "",
+ "christmas_eve": "",
+ "new_year": "",
+ "new_year_eve": "",
+ "image": "",
+ "video": "",
+ "live_photo": "",
+ "live": "",
+ "edit_image": "",
+ "photo_editor": "",
+ "confirm_editor_close": "",
+ "confirm_editor_close_message": "",
+ "brightness": "",
+ "contrast": "",
+ "saturation": "",
+ "blur": "",
+ "transform": "",
+ "crop": "",
+ "aspect_ratio": "",
+ "square": "",
+ "freehand": "",
+ "apply_crop": "",
+ "rotation": "",
+ "rotate_left": "",
+ "rotate_right": "",
+ "flip": "",
+ "flip_vertically": "",
+ "flip_horizontally": "",
+ "download_edited": "",
+ "save_a_copy_to_ente": "",
+ "restore_original": "",
+ "photo_edit_required_to_save": "",
+ "colors": "",
+ "invert_colors": "",
+ "reset": "",
+ "faster_upload": "",
+ "faster_upload_description": "",
+ "open_ente_on_startup": "",
+ "cast_album_to_tv": "",
+ "cast_to_tv": "",
+ "enter_cast_pin_code": "",
+ "code": "",
+ "pair_device_to_tv": "",
+ "tv_not_found": "",
+ "cast_auto_pair": "",
+ "cast_auto_pair_description": "",
+ "choose_device_from_browser": "",
+ "cast_auto_pair_failed": "",
+ "pair_with_pin": "",
+ "pair_with_pin_description": "",
+ "visit_cast_url": "",
+ "passkeys": "",
+ "passkey_fetch_failed": "",
+ "manage_passkey": "",
+ "delete_passkey": "",
+ "delete_passkey_confirmation": "",
+ "rename_passkey": "",
+ "add_passkey": "",
+ "enter_passkey_name": "",
+ "passkeys_description": "",
+ "created_at": "",
+ "passkey_add_failed": "",
+ "passkey_login_failed": "",
+ "passkey_login_invalid_url": "",
+ "passkey_login_already_claimed_session": "",
+ "passkey_login_generic_error": "",
+ "passkey_login_credential_hint": "",
+ "passkeys_not_supported": "",
+ "try_again": "",
+ "check_status": "",
+ "passkey_login_instructions": "",
+ "passkey_login": "",
+ "totp_login": "",
+ "passkey": "",
+ "passkey_verify_description": "",
+ "waiting_for_verification": "",
+ "verification_still_pending": "",
+ "passkey_verified": "",
+ "redirecting_back_to_app": "",
+ "redirect_close_instructions": "",
+ "redirect_again": "",
+ "autogenerated_first_album_name": "",
+ "autogenerated_default_album_name": "",
+ "developer_settings": "",
+ "server_endpoint": "",
+ "more_information": "",
+ "save": "",
+ "theme": "",
+ "system": "",
+ "light": "",
+ "dark": "",
+ "streamable_videos": "",
+ "processing_videos_status": "",
+ "share_favorites": "",
+ "person_favorites": "",
+ "shared_favorites": "",
+ "added_by_name": "",
+ "unowned_files_not_processed": ""
+}
diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json
index e97679c9e8..ecbbff918f 100644
--- a/web/packages/base/locales/pl-PL/translation.json
+++ b/web/packages/base/locales/pl-PL/translation.json
@@ -59,7 +59,7 @@
"select_photos": "Wybierz zdjęcia",
"file_upload": "Przesył plików",
"preparing": "Przygotowywanie",
- "processed_counts": "",
+ "processed_counts": "{{count, number}} / {{total, number}}",
"upload_reading_metadata_files": "Czytanie plików metadanych",
"upload_cancelling": "Anulowanie pozostałych przesłań",
"upload_done": "",
@@ -74,7 +74,7 @@
"download_favorites": "Pobierz ulubione",
"download_uncategorized": "Pobierz nieskategoryzowane",
"download_hidden_items": "Pobierz ukryte elementy",
- "audio": "",
+ "audio": "Dźwięk",
"more": "Więcej",
"mouse_scroll": "Przewijanie kółkiem myszy",
"pan": "",
@@ -95,16 +95,16 @@
"toggle_fullscreen": "Przełącz tryb pełnoekranowy",
"exit_fullscreen": "Zamknij tryb pełnoekranowy",
"go_fullscreen": "Przejdź do trybu pełnoekranowego",
- "zoom": "",
- "play": "",
- "pause": "",
+ "zoom": "Powiększenie",
+ "play": "Odtwórz",
+ "pause": "Wstrzymaj",
"previous": "Poprzedni",
"next": "Następny",
"video_seek": "",
- "quality": "",
+ "quality": "Jakość",
"auto": "Automatycznie",
- "original": "",
- "speed": "",
+ "original": "Oryginał",
+ "speed": "Prędkość",
"title_photos": "Zdjęcia Ente",
"title_auth": "Ente Auth",
"title_accounts": "Konta Ente",
@@ -132,7 +132,7 @@
"password_changed_elsewhere": "Hasło zostało zmienione gdzie indziej",
"password_changed_elsewhere_message": "Zaloguj się ponownie na tym urządzeniu, aby użyć nowego hasła, aby się uwierzytelnić.",
"go_back": "Cofnij się",
- "account": "",
+ "account": "Konto",
"recovery_key": "Klucz odzyskiwania",
"do_this_later": "Zrób to później",
"save_key": "Zapisz Klucz",
@@ -230,7 +230,7 @@
"sharing_already_shared": "Już udostępniasz to {{email}}",
"sharing_album_not_allowed": "Udostępnianie albumu nie jest dozwolone",
"sharing_disabled_for_free_accounts": "Udostępnianie jest wyłączone dla darmowych kont",
- "sharing_user_does_not_exist": "",
+ "sharing_user_does_not_exist": "Nie można znaleźć użytkownika z tym adresem e-mail",
"search": "Szukaj",
"search_results": "Wyniki wyszukiwania",
"no_results": "Nie znaleziono wyników",
@@ -496,7 +496,7 @@
"yes_stop": "Tak, zatrzymaj",
"change_folder": "Zmień Folder",
"view_logs": "Wyświetl logi",
- "view_logs_message": "",
+ "view_logs_message": "Spowoduje to wyświetlenie logów debugowania, które możesz wysłać do nas na e-maila, aby pomóc w debugowaniu Twojego problemu.
Należy pamiętać, że nazwy plików będą dołączone, aby pomóc w śledzeniu problemów z konkretnymi plikami.
",
"weak_device_hint": "Przeglądarka, której używasz nie jest wystarczająco silna, aby zaszyfrować Twoje zdjęcia. Prosimy zalogować się do Ente na Twoim komputerze lub pobierz aplikacje mobilną/komputerową Ente.",
"drag_and_drop_hint": "Lub przeciągnij i upuść do okna Ente",
"authenticate": "Uwierzytelnij się",
@@ -625,9 +625,9 @@
"reset": "Zresetuj",
"faster_upload": "Szybsze przesłania",
"faster_upload_description": "Kieruj przesłania przez pobliskie serwery",
- "open_ente_on_startup": "",
+ "open_ente_on_startup": "Uruchom Ente przy starcie systemu",
"cast_album_to_tv": "Odtwórz album na telewizorze",
- "cast_to_tv": "",
+ "cast_to_tv": "Odtwarzaj na telewizorze",
"enter_cast_pin_code": "Wprowadź kod, który widzisz na telewizorze poniżej, aby sparować to urządzenie.",
"code": "Kod",
"pair_device_to_tv": "Sparuj urządzenia",
@@ -677,13 +677,13 @@
"save": "Zapisz",
"theme": "Motyw",
"system": "Systemowy",
- "light": "",
- "dark": "",
- "streamable_videos": "",
- "processing_videos_status": "",
- "share_favorites": "",
- "person_favorites": "",
- "shared_favorites": "",
- "added_by_name": "",
- "unowned_files_not_processed": ""
+ "light": "Jasny",
+ "dark": "Ciemny",
+ "streamable_videos": "Streamowalne wideo",
+ "processing_videos_status": "Przetwarzanie wideo...",
+ "share_favorites": "Udostępnij ulubione",
+ "person_favorites": "Ulubione użytkownika {{name}}",
+ "shared_favorites": "Udostępnione ulubione",
+ "added_by_name": "Dodane przez {{name}}",
+ "unowned_files_not_processed": "Pliki dodane przez innych użytkowników nie były przetwarzane"
}
diff --git a/web/packages/base/locales/tr-TR/translation.json b/web/packages/base/locales/tr-TR/translation.json
index b1cf846414..627ac8aa91 100644
--- a/web/packages/base/locales/tr-TR/translation.json
+++ b/web/packages/base/locales/tr-TR/translation.json
@@ -162,7 +162,7 @@
"ok": "Tamam",
"success": "Başarılı",
"error": "Hata",
- "note": "",
+ "note": "Not",
"offline_message": "Çevrimdışısın, önbelleğe alınmış anılar gösteriliyor",
"install": "Kur",
"install_mobile_app": "Tüm fotoğraflarını otomatik olarak yedeklemek için Android veya iOS uygulamamızı yükle",
@@ -685,5 +685,5 @@
"person_favorites": "{{name}}'in favorileri",
"shared_favorites": "Paylaşılan favoriler",
"added_by_name": "{{name}} tarafından eklendi",
- "unowned_files_not_processed": ""
+ "unowned_files_not_processed": "Diğer kullanıcılar tarafından eklenen dosyalar işlenmedi"
}
diff --git a/web/packages/base/locales/vi-VN/translation.json b/web/packages/base/locales/vi-VN/translation.json
index 6212bc57a2..d4a6197a5a 100644
--- a/web/packages/base/locales/vi-VN/translation.json
+++ b/web/packages/base/locales/vi-VN/translation.json
@@ -12,7 +12,7 @@
"enter_email": "Nhập địa chỉ email",
"invalid_email_error": "Nhập một email hợp lệ",
"required": "Bắt buộc",
- "email_not_registered": "Email chưa được đăng kí",
+ "email_not_registered": "Email chưa được đăng ký",
"email_already_registered": "Email đã được đăng ký",
"email_sent": "Mã xác minh đã được gửi đến {{email}}",
"check_inbox_hint": "Vui lòng kiểm tra hộp thư đến (và thư rác) để hoàn tất xác minh",
@@ -20,8 +20,8 @@
"resend_code": "Gửi lại mã",
"verify": "Xác minh",
"send_otp": "Gửi OTP",
- "generic_error": "Có gì đó không đúng",
- "generic_error_retry": "Có gì đó không đúng, vui lòng thử lại",
+ "generic_error": "Có gì đó không ổn",
+ "generic_error_retry": "Có gì đó không ổn, vui lòng thử lại",
"invalid_code_error": "Mã xác minh không hợp lệ",
"expired_code_error": "Mã xác minh của bạn đã hết hạn",
"status_sending": "Đang gửi...",
@@ -31,7 +31,7 @@
"unlock": "Mở khóa",
"set_password": "Đặt mật khẩu",
"sign_in": "Đăng nhập",
- "incorrect_password": "Mật khẩu không chính xác",
+ "incorrect_password": "Mật khẩu không đúng",
"incorrect_password_or_no_account": "Sai mật khẩu hoặc email chưa được đăng ký",
"pick_password_hint": "Vui lòng nhập một mật khẩu dùng để mã hóa dữ liệu của bạn",
"pick_password_caution": "Chúng tôi không lưu trữ mật khẩu của bạn, nên nếu bạn quên, chúng tôi sẽ không thể giúp bạn khôi phục dữ liệu nếu không có mã khôi phục.",
@@ -64,14 +64,14 @@
"upload_cancelling": "Hủy bỏ các lượt tải lên còn lại",
"upload_done": "Đã tải lên {{count, number}}",
"upload_skipped": "{{count, number}} bị bỏ qua",
- "initial_load_delay_warning": "Lần đầu tải có thể mất một ít thời gian",
+ "initial_load_delay_warning": "Lần đầu tải có thể mất ít phút",
"no_account": "Chưa có tài khoản",
"existing_account": "Đã có tài khoản",
"create": "Tạo",
"files_count": "{{count, number}} tệp",
"download": "Tải xuống",
"download_album": "Tải xuống album",
- "download_favorites": "Tải xuống mục yêu thích",
+ "download_favorites": "Tải xuống những mục đã thích",
"download_uncategorized": "Tải xuống mục chưa phân loại",
"download_hidden_items": "Tải xuống mục ẩn",
"audio": "Âm thanh",
@@ -86,7 +86,7 @@
"show_shortcuts": "Hiện phím tắt",
"zoom_preset": "Phóng to chi tiết",
"toggle_controls": "Bật/tắt điều khiển",
- "toggle_live": "Bật/tắt Live",
+ "toggle_live": "Bật/tắt ảnh động",
"toggle_audio": "Bật/tắt âm thanh",
"toggle_favorite": "Thích/bỏ thích",
"toggle_archive": "Lưu trữ/bỏ lưu trữ",
@@ -122,7 +122,7 @@
"favorite": "Thích",
"convert": "Chuyển đổi",
"multi_folder_upload": "Phát hiện nhiều thư mục",
- "upload_to_choice": "Bạn có muốn tải chúng thành",
+ "upload_to_choice": "Bạn sẽ tải lên thành",
"upload_to_single_album": "Một album duy nhất",
"upload_to_album_per_folder": "Các album riêng biệt",
"session_expired": "Phiên đã hết hạn",
@@ -137,7 +137,7 @@
"do_this_later": "Để sau",
"save_key": "Lưu mã",
"recovery_key_description": "Nếu bạn quên mật khẩu, cách duy nhất để khôi phục dữ liệu của bạn là dùng mã này.",
- "key_not_stored_note": "Chúng tôi không lưu trữ mã này, nên hãy lưu nó ở một nơi an toàn",
+ "key_not_stored_note": "Chúng tôi không lưu trữ mã này, nên hãy lưu nó ở nơi an toàn",
"recovery_key_generation_failed": "Không tạo được mã khôi phục, vui lòng thử lại",
"forgot_password": "Quên mật khẩu",
"recover_account": "Khôi phục tài khoản",
@@ -165,7 +165,7 @@
"note": "Ghi chú",
"offline_message": "Bạn đang ngoại tuyến, các kỷ niệm hiển thị là từ bộ nhớ đệm",
"install": "Cài đặt",
- "install_mobile_app": "Cài đặt ứng dụng Android hoặc iOS của chúng tôi để tự động sao lưu tất cả ảnh của bạn",
+ "install_mobile_app": "Cài đặt ứng dụng Android hoặc iOS để sao lưu tự động tất cả ảnh của bạn",
"download_app": "Tải xuống ứng dụng máy tính",
"download_app_message": "Rất tiếc, thao tác này hiện chỉ hỗ trợ trên ứng dụng máy tính",
"subscription": "Gói đăng ký",
@@ -179,7 +179,7 @@
"manage_plan": "Quản lý gói đăng ký",
"current_usage": "Hiện dùng {{usage}}",
"two_months_free": "Nhận 2 tháng miễn phí với các gói theo năm",
- "free_plan_option": "Dùng tiếp gói miễn phí",
+ "free_plan_option": "Tiếp tục dùng gói miễn phí",
"free_plan_description": "{{storage}} miễn phí vĩnh viễn",
"active": "Hoạt động",
"subscription_info_free": "Bạn đang dùng gói miễn phí",
@@ -222,7 +222,7 @@
"rename_album": "Đổi tên album",
"delete_album": "Xóa album",
"delete_album_title": "Xóa album?",
- "delete_album_message": "Xóa luôn các tấm ảnh (và video) có trong album này khỏi toàn bộ album khác cũng đang chứa chúng?",
+ "delete_album_message": "Xóa luôn ảnh (và video) trong album này khỏi toàn bộ album khác cũng đang chứa chúng?",
"delete_photos": "Xóa ảnh",
"keep_photos": "Giữ ảnh",
"share_album": "Chia sẻ album",
@@ -240,10 +240,10 @@
"description": "Mô tả",
"file_type": "Loại tệp",
"magic": "Ma thuật",
- "photos_count_zero": "Chưa có ảnh nào",
- "photos_count_one": "1 ảnh",
- "photos_count": "{{count, number}} ảnh",
- "terms_and_conditions": "Tôi đồng ý điều khoản và chính sách bảo mật",
+ "photos_count_zero": "Chưa có kỷ niệm",
+ "photos_count_one": "1 kỷ niệm",
+ "photos_count": "{{count, number}} kỷ niệm",
+ "terms_and_conditions": "Tôi đồng ý với điều khoản và chính sách bảo mật",
"people": "Người",
"indexing_scheduled": "Đã lên lịch lập chỉ mục...",
"indexing_photos": "Đang cập nhật chỉ mục...",
@@ -277,7 +277,7 @@
"map": "Bản đồ",
"enable_map": "Bật bản đồ",
"enable_maps_confirm": "Bật bản đồ?",
- "enable_maps_confirm_message": "Ảnh của bạn sẽ hiển thị trên bản đồ thế giới.
Bản đồ được lưu trữ bởi OpenStreetMap, và vị trí chính xác ảnh của bạn không bao giờ được chia sẻ.
Bạn có thể tắt tính năng này bất cứ lúc nào từ Cài đặt.
",
+ "enable_maps_confirm_message": "Ảnh của bạn sẽ hiển thị trên bản đồ thế giới.
Bản đồ được lưu trữ bởi OpenStreetMap và vị trí chính xác ảnh của bạn không bao giờ được chia sẻ.
Bạn có thể tắt tính năng này bất cứ lúc nào từ Cài đặt.
",
"disable_map": "Tắt bản đồ",
"disable_maps_confirm": "Tắt bản đồ?",
"disable_maps_confirm_message": "Ảnh của bạn sẽ thôi hiển thị trên bản đồ thế giới.
Bạn có thể bật tính năng này bất cứ lúc nào từ Cài đặt.
",
@@ -293,10 +293,10 @@
"scan_qr_title": "Quét mã QR",
"enable_two_factor": "Bật xác thực 2 bước",
"enable": "Bật",
- "enabled": "Đã bật",
+ "enabled": "Bật",
"lost_2fa_device": "Mất thiết bị xác thực 2 bước",
"incorrect_code": "Mã không chính xác",
- "two_factor_info": "Thêm một lớp bảo mật bổ sung bằng cách yêu cầu nhiều hơn email và mật khẩu của bạn để đăng nhập",
+ "two_factor_info": "Thêm một lớp bảo mật bằng cách yêu cầu nhiều hơn email và mật khẩu của bạn để đăng nhập",
"disable": "Tắt",
"reconfigure": "Cấu hình lại",
"reconfigure_two_factor_hint": "Cập nhật thiết bị xác thực của bạn",
@@ -309,7 +309,7 @@
"select_folder": "Chọn thư mục",
"select_zips": "Chọn tệp zip",
"faq": "Câu hỏi thường gặp",
- "takeout_hint": "Giải nén tất cả tệp zip vào cùng một thư mục và tải lên. Hoặc tải lên trực tiếp các tệp zip. Xem Câu hỏi thường gặp để biết thêm.",
+ "takeout_hint": "Giải nén tất cả tệp zip vào cùng một thư mục rồi tải lên. Hoặc tải lên trực tiếp các tệp zip. Xem Câu hỏi thường gặp để biết thêm.",
"destination": "Đích đến",
"start": "Bắt đầu",
"last_export_time": "Thời gian xuất gần nhất",
@@ -323,8 +323,8 @@
"failed_uploads": "Tải lên không thành công",
"failed_uploads_hint": "Sẽ có tùy chọn thử lại sau khi việc tải lên hoàn tất",
"retry_failed_uploads": "Thử tải lên lại các tệp không thành công",
- "thumbnail_generation_failed": "Tạo hình thu nhỏ không thành công",
- "thumbnail_generation_failed_hint": "Các tệp này đã được tải lên, nhưng rất tiếc chúng tôi không thể tạo hình thu nhỏ cho chúng.",
+ "thumbnail_generation_failed": "Tạo ảnh thu nhỏ không thành công",
+ "thumbnail_generation_failed_hint": "Các tệp này đã được tải lên, nhưng rất tiếc chúng tôi không thể tạo ảnh thu nhỏ cho chúng.",
"unsupported_files": "Tệp không được hỗ trợ",
"unsupported_files_hint": "Ente chưa hỗ trợ các định dạng tệp này",
"blocked_uploads": "Tải lên bị chặn",
@@ -415,7 +415,7 @@
"or_add_existing": "Hoặc chọn một cái có sẵn",
"not_found": "404 - Không tìm thấy",
"link_expired": "Liên kết đã hết hạn",
- "link_expired_message": "Liên kết này đã hết hạn hoặc đã bị vô hiệu hóa",
+ "link_expired_message": "Liên kết này đã hết hạn hoặc bị vô hiệu hóa",
"manage_link": "Quản lý liên kết",
"link_request_limit_exceeded": "Album này đang được xem trên quá nhiều thiết bị",
"allow_downloads": "Cho phép tải xuống",
@@ -441,7 +441,7 @@
"public_link_enabled": "Liên kết công khai đã được bật",
"collect_photos": "Thu thập ảnh",
"disable_file_download": "Tắt tải xuống",
- "disable_file_download_message": "Bạn có chắc muốn tắt nút tải xuống các tệp không?
Người xem vẫn có thể chụp ảnh màn hình hoặc sao chép ảnh của bạn bằng các công cụ bên ngoài.
",
+ "disable_file_download_message": "Bạn có chắc muốn tắt nút tải xuống các tệp không?
Người xem vẫn có thể chụp màn hình hoặc sao chép ảnh của bạn bằng các công cụ bên ngoài.
",
"shared_using": "Chia sẻ bằng {{url}}",
"sharing_referral_code": "Dùng mã {{referralCode}} để nhận 10 GB miễn phí",
"disable_password": "Vô hiệu hóa khóa mật khẩu",
@@ -477,13 +477,13 @@
"copied": "Đã sao chép",
"upgrade_now": "Nâng cấp ngay",
"renew_now": "Gia hạn ngay",
- "storage": "Lưu trữ",
+ "storage": "Dung lượng",
"used": "đã dùng",
"you": "Bạn",
"family": "Gia đình",
- "free": "miễn phí",
- "of": "của",
- "watch_folders": "Theo dõi thư mục",
+ "free": "trống",
+ "of": "/",
+ "watch_folders": "Thư mục theo dõi",
"watched_folders": "Thư mục đã theo dõi",
"no_folders_added": "Chưa thêm thư mục nào",
"watch_folders_hint_1": "Các thư mục bạn thêm ở đây sẽ được theo dõi tự động",
@@ -495,7 +495,7 @@
"stop_watching_folder_message": "Các tệp hiện có của bạn sẽ không bị xóa, nhưng Ente sẽ ngừng tự động cập nhật album Ente liên kết khi có thay đổi trong thư mục này.",
"yes_stop": "Có, dừng lại",
"change_folder": "Thay đổi Thư mục",
- "view_logs": "Xem log",
+ "view_logs": "Xem nhật ký",
"view_logs_message": "Tải xuống nhật ký lỗi, để bạn có thể gửi qua email cho chúng tôi.
Lưu ý rằng, trong nhật ký lỗi sẽ bao gồm tên các tệp để giúp theo dõi vấn đề với từng tệp cụ thể.
",
"weak_device_hint": "Trình duyệt bạn đang sử dụng không đủ mạnh để mã hóa ảnh. Vui lòng dùng Ente trên máy tính, hoặc tải xuống ứng dụng di động/máy tính của Ente.",
"drag_and_drop_hint": "Hoặc kéo thả vào cửa sổ Ente",
@@ -513,7 +513,7 @@
"today": "Hôm nay",
"yesterday": "Hôm qua",
"enter_name": "Nhập tên",
- "uploader_name_hint": "Thêm một tên để bạn bè biết ai là người chụp những tấm ảnh tuyệt vời này!",
+ "uploader_name_hint": "Thêm tên để bạn bè biết ai là người chụp những tấm ảnh tuyệt vời này!",
"name_placeholder": "Tên...",
"more_details": "Thêm chi tiết",
"ml_search": "Học máy",
@@ -589,17 +589,17 @@
"download_failed": "Tải xuống thất bại",
"download_progress": "{{count, number}} / {{total, number}} tệp",
"christmas": "Giáng Sinh",
- "christmas_eve": "Đêm Thánh",
+ "christmas_eve": "Đêm Vọng",
"new_year": "Năm Mới",
"new_year_eve": "Đêm Giao Thừa",
"image": "Hình ảnh",
"video": "Video",
- "live_photo": "Ảnh Live",
- "live": "Live",
+ "live_photo": "Ảnh động",
+ "live": "Ảnh động",
"edit_image": "Chỉnh sửa ảnh",
"photo_editor": "Trình chỉnh sửa ảnh",
"confirm_editor_close": "Bạn có chắc muốn đóng trình chỉnh sửa không?",
- "confirm_editor_close_message": "Tải xuống hình ảnh đã chỉnh sửa hoặc lưu bản sao vào Ente để giữ các thay đổi của bạn.",
+ "confirm_editor_close_message": "Tải xuống ảnh đã chỉnh sửa hoặc lưu bản sao vào Ente để giữ các thay đổi của bạn.",
"brightness": "Độ sáng",
"contrast": "Độ tương phản",
"saturation": "Độ bão hòa",
@@ -608,7 +608,7 @@
"crop": "Cắt",
"aspect_ratio": "Tỉ lệ khung hình",
"square": "Hình vuông",
- "freehand": "Vẽ tự do",
+ "freehand": "Chọn tự do",
"apply_crop": "Áp dụng cắt",
"rotation": "Xoay",
"rotate_left": "Xoay trái",
@@ -628,17 +628,17 @@
"open_ente_on_startup": "Mở Ente khi khởi động",
"cast_album_to_tv": "Phát album trên TV",
"cast_to_tv": "Phát trên TV",
- "enter_cast_pin_code": "Nhập mã bạn thấy trên TV bên dưới để ghép nối thiết bị này.",
+ "enter_cast_pin_code": "Nhập mã bạn thấy trên TV bên dưới để kết nối thiết bị này.",
"code": "Mã",
- "pair_device_to_tv": "Ghép nối thiết bị",
+ "pair_device_to_tv": "Kết nối thiết bị",
"tv_not_found": "Không tìm thấy TV. Bạn đã nhập mã PIN đúng chưa?",
- "cast_auto_pair": "Ghép nối tự động",
- "cast_auto_pair_description": "Ghép nối tự động chỉ hoạt động với các thiết bị hỗ trợ Chromecast.",
+ "cast_auto_pair": "Kết nối tự động",
+ "cast_auto_pair_description": "Kết nối tự động chỉ hoạt động với các thiết bị hỗ trợ Chromecast.",
"choose_device_from_browser": "Chọn một thiết bị phát tương thích từ cửa sổ trình duyệt.",
- "cast_auto_pair_failed": "Ghép nối tự động Chromecast thất bại. Vui lòng thử lại.",
- "pair_with_pin": "Ghép nối bằng PIN",
- "pair_with_pin_description": "Ghép nối bằng PIN hoạt động với bất kỳ màn hình nào bạn muốn xem album của mình.",
- "visit_cast_url": "Truy cập {{url}} trên thiết bị bạn muốn ghép nối.",
+ "cast_auto_pair_failed": "Kết nối tự động Chromecast thất bại. Vui lòng thử lại.",
+ "pair_with_pin": "Kết nối bằng PIN",
+ "pair_with_pin_description": "Kết nối bằng PIN hoạt động với bất kỳ màn hình nào bạn muốn.",
+ "visit_cast_url": "Truy cập {{url}} trên thiết bị bạn muốn kết nối.",
"passkeys": "Khóa truy cập",
"passkey_fetch_failed": "Không thể lấy khóa truy cập của bạn.",
"manage_passkey": "Quản lý khóa truy cập",
@@ -671,7 +671,7 @@
"redirect_again": "Chuyển hướng lại",
"autogenerated_first_album_name": "Album Đầu Tiên Của Tôi",
"autogenerated_default_album_name": "Album Mới",
- "developer_settings": "Cài đặt nhà phát triển",
+ "developer_settings": "Cài đặt Nhà phát triển",
"server_endpoint": "Điểm cuối máy chủ",
"more_information": "Thêm thông tin",
"save": "Lưu",
@@ -679,9 +679,9 @@
"system": "Giống hệ thống",
"light": "Sáng",
"dark": "Tối",
- "streamable_videos": "Video có thể phát",
+ "streamable_videos": "Phát trực tuyến video",
"processing_videos_status": "Đang xử lý video...",
- "share_favorites": "Chia sẻ những mục thích",
+ "share_favorites": "Chia sẻ những mục đã thích",
"person_favorites": "{{name}} đã thích",
"shared_favorites": "Những mục thích đã chia sẻ",
"added_by_name": "Được thêm bởi {{name}}",
diff --git a/web/packages/base/locales/zh-HK/translation.json b/web/packages/base/locales/zh-HK/translation.json
index f4e64f7bcf..bdfed3f70f 100644
--- a/web/packages/base/locales/zh-HK/translation.json
+++ b/web/packages/base/locales/zh-HK/translation.json
@@ -7,7 +7,7 @@
"intro_slide_3": "",
"login": "登入",
"sign_up": "註冊",
- "new_to_ente": "",
+ "new_to_ente": "新用戶",
"existing_user": "現有用戶",
"enter_email": "輸入電郵地址",
"invalid_email_error": "輸入有效的電郵地址",
@@ -27,22 +27,22 @@
"status_sending": "正在發送……",
"status_sent": "已發送!",
"password": "密碼",
- "link_password_description": "",
+ "link_password_description": "輸入密碼以解鎖相簿",
"unlock": "解鎖",
"set_password": "設定密碼",
"sign_in": "登入",
"incorrect_password": "密碼錯誤",
- "incorrect_password_or_no_account": "",
- "pick_password_hint": "",
- "pick_password_caution": "",
- "key_generation_in_progress": "",
+ "incorrect_password_or_no_account": "密碼錯誤或電郵未註冊",
+ "pick_password_hint": "請輸入用於加密數據的密碼",
+ "pick_password_caution": "我們不會儲存你的密碼,如果你忘記密碼, 我們無法協助你 在沒有復原金鑰的情況下復原數據。",
+ "key_generation_in_progress": "正在產生加密金鑰……",
"confirm_password": "確認密碼",
- "referral_source_hint": "",
+ "referral_source_hint": "你如何認識 Ente?(可選)",
"referral_source_info": "",
- "password_mismatch_error": "",
+ "password_mismatch_error": "密碼不相同",
"show_or_hide_password": "顯示或隱藏密碼",
"welcome_to_ente_title": "歡迎來到 ",
- "welcome_to_ente_subtitle": "",
+ "welcome_to_ente_subtitle": "端對端加密相片儲存及分享",
"new_album": "新相簿",
"create_albums": "創建相簿",
"album_name": "相簿名稱",
@@ -77,7 +77,7 @@
"audio": "音訊",
"more": "更多",
"mouse_scroll": "",
- "pan": "",
+ "pan": "橫移",
"pinch": "",
"drag": "拖曳",
"tap_inside_image": "",
@@ -92,7 +92,7 @@
"toggle_archive": "",
"view_info": "",
"copy_as_png": "複製為 PNG",
- "toggle_fullscreen": "",
+ "toggle_fullscreen": "切換全螢幕",
"exit_fullscreen": "退出全螢幕",
"go_fullscreen": "進入全螢幕",
"zoom": "縮放",
@@ -110,7 +110,7 @@
"title_accounts": "",
"upload_first_photo": "上載你的第一張照片",
"import_your_folders": "匯入你的資料夾",
- "upload_dropzone_hint": "",
+ "upload_dropzone_hint": "放開以上傳檔案",
"watch_folder_dropzone_hint": "",
"trash_files_title": "刪除多個檔案?",
"trash_file_title": "刪除檔案?",
@@ -130,14 +130,14 @@
"password_generation_failed": "",
"change_password": "更改密碼",
"password_changed_elsewhere": "",
- "password_changed_elsewhere_message": "",
+ "password_changed_elsewhere_message": "請以新密碼重新登入以作驗證。",
"go_back": "返回",
"account": "帳戶",
"recovery_key": "復原金鑰",
"do_this_later": "稍後再做",
"save_key": "儲存金鑰",
- "recovery_key_description": "",
- "key_not_stored_note": "",
+ "recovery_key_description": "如果你忘記密碼,你只可以使用此金鑰復原數據。",
+ "key_not_stored_note": "我們不會儲存此金鑰,請妥善保存此金鑰",
"recovery_key_generation_failed": "未能生成復原金鑰,請再試",
"forgot_password": "忘記密碼",
"recover_account": "復原帳戶",
@@ -167,30 +167,30 @@
"install": "安裝",
"install_mobile_app": "安裝我們的 Android 或 iOS 應用程式來自動備份所有照片",
"download_app": "下載桌面程式",
- "download_app_message": "",
+ "download_app_message": "對不起,此動作只在桌面版支援",
"subscription": "訂閱",
- "manage_payment_method": "",
- "manage_family": "",
+ "manage_payment_method": "管理支付方式",
+ "manage_family": "管理家庭",
"family_plan": "家庭計劃",
"leave_family_plan": "離開家庭計劃",
"leave": "離開",
- "leave_family_plan_confirm": "",
- "choose_plan": "",
- "manage_plan": "",
- "current_usage": "",
+ "leave_family_plan_confirm": "你確定要離開家庭計劃嗎?",
+ "choose_plan": "選擇你的計劃",
+ "manage_plan": "管理你的訂閲",
+ "current_usage": "目前已使用 {{usage}}",
"two_months_free": "",
- "free_plan_option": "",
+ "free_plan_option": "以免費計劃繼續",
"free_plan_description": "",
- "active": "",
- "subscription_info_free": "",
+ "active": "已啓用",
+ "subscription_info_free": "你正使用免費計劃",
"subscription_info_family": "",
- "subscription_info_expired": "",
- "subscription_info_renewal_cancelled": "",
+ "subscription_info_expired": "你的訂閲已過期,請 續訂",
+ "subscription_info_renewal_cancelled": "你的訂閲將於 {{date, date}} 取消",
"subscription_info_storage_quota_exceeded": "",
"subscription_status_renewal_active": "",
"subscription_status_renewal_cancelled": "",
"add_on_valid_till": "",
- "subscription_expired": "",
+ "subscription_expired": "訂閲已過期",
"storage_quota_exceeded": "",
"subscription_purchase_success": "",
"subscription_purchase_cancelled": "",
@@ -198,23 +198,23 @@
"subscription_verification_error": "",
"update_payment_method_message": "",
"payment_method_authentication_failed": "",
- "update_payment_method": "",
+ "update_payment_method": "更新支付方式",
"monthly": "每月",
"yearly": "每年",
"month_short": "月",
"year": "年",
- "update_subscription": "",
- "update_subscription_title": "",
+ "update_subscription": "更變計劃",
+ "update_subscription_title": "確定更變計劃",
"update_subscription_message": "",
"cancel_subscription": "取消訂閱",
"cancel_subscription_message": "",
"cancel_subscription_with_addon_message": "",
- "subscription_cancel_success": "",
- "reactivate_subscription": "",
+ "subscription_cancel_success": "訂閲成功取消",
+ "reactivate_subscription": "重新啓用訂閲",
"reactivate_subscription_message": "",
- "subscription_activate_success": "",
+ "subscription_activate_success": "訂閲成功啓用 ",
"thank_you": "感謝",
- "cancel_subscription_on_mobile": "",
+ "cancel_subscription_on_mobile": "取消手機訂閱",
"cancel_subscription_on_mobile_message": "",
"mail_to_manage_subscription": "",
"rename": "重新命名",
@@ -237,17 +237,17 @@
"search_hint": "",
"album": "相簿",
"date": "日期",
- "description": "",
+ "description": "描述",
"file_type": "檔案類型",
"magic": "魔術",
- "photos_count_zero": "",
- "photos_count_one": "",
- "photos_count": "",
- "terms_and_conditions": "",
+ "photos_count_zero": "沒有回憶",
+ "photos_count_one": "1 個回憶",
+ "photos_count": "{count, number} 個回憶",
+ "terms_and_conditions": "我同意 條款 及 私隱政策",
"people": "",
"indexing_scheduled": "",
- "indexing_photos": "",
- "indexing_fetching": "",
+ "indexing_photos": "正在更新索引……",
+ "indexing_fetching": "正在同步索引……",
"indexing_people": "",
"syncing_wait": "正在同步……",
"people_empty_too_few": "",
@@ -290,7 +290,7 @@
"two_factor_qr_help": "",
"two_factor_manual_entry_title": "",
"two_factor_manual_entry_message": "",
- "scan_qr_title": "",
+ "scan_qr_title": "以掃描 QR code 代替",
"enable_two_factor": "啟用兩步驟",
"enable": "啟用",
"enabled": "已啟用",
@@ -306,23 +306,23 @@
"disable_two_factor": "",
"disable_two_factor_message": "",
"export_data": "匯出數據",
- "select_folder": "",
+ "select_folder": "選擇資料夾",
"select_zips": "",
"faq": "常見問題",
"takeout_hint": "",
"destination": "目的地",
"start": "開始",
- "last_export_time": "",
- "export_again": "",
- "local_storage_not_accessible": "",
- "email_already_taken": "",
+ "last_export_time": "上次匯出時間",
+ "export_again": "重新同步",
+ "local_storage_not_accessible": "你的瀏覽器或插件正阻擋 Ente 儲存數據至本地儲存",
+ "email_already_taken": "電郵已被使用",
"live_photos_detected": "",
- "ignored_uploads": "",
+ "ignored_uploads": "無視上傳",
"ignored_uploads_hint": "",
"file_not_uploaded_list": "以下檔案未上傳",
- "failed_uploads": "",
+ "failed_uploads": "失敗上傳",
"failed_uploads_hint": "",
- "retry_failed_uploads": "",
+ "retry_failed_uploads": "重試失敗上傳",
"thumbnail_generation_failed": "",
"thumbnail_generation_failed_hint": "",
"unsupported_files": "",
@@ -342,25 +342,25 @@
"restore_to_album": "",
"section_all": "所有",
"section_uncategorized": "未分類",
- "section_archive": "",
+ "section_archive": "封存",
"section_hidden": "隱藏",
"section_trash": "垃圾箱",
- "favorites": "",
- "archive": "",
+ "favorites": "我的最愛",
+ "archive": "封存",
"archive_album": "",
- "unarchive": "",
- "unarchive_album": "",
- "hide_collection": "",
- "unhide_collection": "",
+ "unarchive": "解除封存",
+ "unarchive_album": "取消封存相簿",
+ "hide_collection": "隱藏相簿",
+ "unhide_collection": "取消隱藏相簿",
"move": "移動",
"add": "新增",
"remove": "移除",
- "yes_remove": "",
+ "yes_remove": "是,移除",
"remove_from_album": "從相簿移除",
"move_to_trash": "移至垃圾桶",
- "trash_files_message": "",
- "trash_file_message": "",
- "delete_permanently": "",
+ "trash_files_message": "被選擇的檔案將在所有相簿移除並移動至垃圾桶。",
+ "trash_file_message": "此檔案將在所有相簿移除並移動至垃圾桶。",
+ "delete_permanently": "永遠刪除",
"restore": "還原",
"empty_trash": "",
"empty_trash_title": "",
@@ -384,7 +384,7 @@
"exif_date_time_digitized": "",
"exif_metadata_date": "",
"custom_time": "",
- "caption_character_limit": "",
+ "caption_character_limit": "最多 5000 字元",
"sharing_details": "",
"modify_sharing": "",
"add_collaborators": "",
@@ -392,9 +392,9 @@
"shared_with_people_count_zero": "",
"shared_with_people_count_one": "",
"shared_with_people_count": "",
- "participants_count_zero": "",
- "participants_count_one": "",
- "participants_count": "",
+ "participants_count_zero": "沒有參加者",
+ "participants_count_one": "1 個參加者",
+ "participants_count": "{count, number} 個參加者",
"add_viewers": "",
"change_permission_to_viewer": "",
"change_permission_to_collaborator": "",
@@ -414,16 +414,16 @@
"add_more": "",
"or_add_existing": "",
"not_found": "",
- "link_expired": "",
- "link_expired_message": "",
- "manage_link": "",
+ "link_expired": "連結過期",
+ "link_expired_message": "此連結已過期或已被禁用",
+ "manage_link": "管理連結",
"link_request_limit_exceeded": "",
- "allow_downloads": "",
- "allow_adding_photos": "",
- "allow_adding_photos_hint": "",
- "device_limit": "",
- "none": "",
- "link_expiry": "",
+ "allow_downloads": "允許下載",
+ "allow_adding_photos": "允許加入相片",
+ "allow_adding_photos_hint": "允許持有連結的人加入相片到已分享的相簿。",
+ "device_limit": "裝置上限",
+ "none": "無",
+ "link_expiry": "連結過期",
"never": "永不",
"after_time": {
"hour": "一小時後",
@@ -434,13 +434,13 @@
},
"copy_link": "複製鏈接",
"done": "完成",
- "share_link_section_title": "",
- "remove_link": "",
+ "share_link_section_title": "或分享連結",
+ "remove_link": "移除連結",
"create_public_link": "",
"public_link_created": "",
"public_link_enabled": "",
"collect_photos": "",
- "disable_file_download": "",
+ "disable_file_download": "禁用下載",
"disable_file_download_message": "",
"shared_using": "",
"sharing_referral_code": "",
diff --git a/web/packages/new/photos/components/FileList.ts b/web/packages/new/photos/components/FileList.ts
deleted file mode 100644
index ce96218dad..0000000000
--- a/web/packages/new/photos/components/FileList.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export const GAP_BTW_TILES = 4;
-export const IMAGE_CONTAINER_MAX_HEIGHT = 180;
-export const IMAGE_CONTAINER_MAX_WIDTH = 180;
-export const MIN_COLUMNS = 4;
-
-// TODO: Move the FileList component here.
diff --git a/web/packages/new/photos/components/gallery/BarImpl.tsx b/web/packages/new/photos/components/gallery/BarImpl.tsx
index 757032f998..e7d6928f73 100644
--- a/web/packages/new/photos/components/gallery/BarImpl.tsx
+++ b/web/packages/new/photos/components/gallery/BarImpl.tsx
@@ -11,16 +11,16 @@ import { FilledIconButton } from "ente-base/components/mui";
import { Ellipsized2LineTypography } from "ente-base/components/Typography";
import { useIsSmallWidth } from "ente-base/components/utils/hooks";
import { CollectionsSortOptions } from "ente-new/photos/components/CollectionsSortOptions";
-import {
- IMAGE_CONTAINER_MAX_WIDTH,
- MIN_COLUMNS,
-} from "ente-new/photos/components/FileList";
import {
BarItemTile,
ItemCard,
TileTextOverlay,
} from "ente-new/photos/components/Tiles";
import { FocusVisibleUnstyledButton } from "ente-new/photos/components/UnstyledButton";
+import {
+ thumbnailLayoutMinColumns,
+ thumbnailMaxWidth,
+} from "ente-new/photos/components/utils/thumbnail-grid-layout";
import type {
CollectionSummary,
CollectionSummaryAttribute,
@@ -300,7 +300,7 @@ export const GalleryBarImpl: React.FC = ({
const BarWrapper = styled("div")`
padding-inline: 24px;
- @media (max-width: ${IMAGE_CONTAINER_MAX_WIDTH * MIN_COLUMNS}px) {
+ @media (max-width: ${thumbnailMaxWidth * thumbnailLayoutMinColumns}px) {
padding-inline: 4px;
}
margin-block-end: 16px;
diff --git a/web/packages/new/photos/components/utils/thumbnail-grid-layout.ts b/web/packages/new/photos/components/utils/thumbnail-grid-layout.ts
index 62cc057699..5ab7f7935e 100644
--- a/web/packages/new/photos/components/utils/thumbnail-grid-layout.ts
+++ b/web/packages/new/photos/components/utils/thumbnail-grid-layout.ts
@@ -1,3 +1,8 @@
+export const thumbnailGap = 4;
+export const thumbnailMaxHeight = 180;
+export const thumbnailMaxWidth = 180;
+export const thumbnailLayoutMinColumns = 4;
+
export interface ThumbnailGridLayoutParams {
/**
* The overall width available to us.
@@ -47,20 +52,20 @@ export const computeThumbnailGridLayoutParams = (
): ThumbnailGridLayoutParams => {
const isSmallerLayout = !(
containerWidth >
- MIN_COLUMNS * IMAGE_CONTAINER_MAX_WIDTH
+ thumbnailLayoutMinColumns * thumbnailMaxWidth
);
const paddingInline = getGapFromScreenEdge(containerWidth);
const fittableColumns = getFractionFittableColumns(containerWidth);
let columns = Math.floor(fittableColumns);
- if (columns < MIN_COLUMNS) {
- columns = MIN_COLUMNS;
+ if (columns < thumbnailLayoutMinColumns) {
+ columns = thumbnailLayoutMinColumns;
}
const shrinkRatio = getShrinkRatio(containerWidth, columns);
- const itemHeight = IMAGE_CONTAINER_MAX_HEIGHT * shrinkRatio;
- const itemWidth = IMAGE_CONTAINER_MAX_WIDTH * shrinkRatio;
- const gap = GAP_BTW_TILES;
+ const itemHeight = thumbnailMaxHeight * shrinkRatio;
+ const itemWidth = thumbnailMaxWidth * shrinkRatio;
+ const gap = thumbnailGap;
return {
containerWidth,
@@ -73,37 +78,13 @@ export const computeThumbnailGridLayoutParams = (
};
};
-/* TODO: Some of this code is also duplicated elsewhere. See if those places can
- reuse the same function as above, with some extra params if needed.
+const getFractionFittableColumns = (width: number): number =>
+ (width - 2 * getGapFromScreenEdge(width) + thumbnailGap) /
+ (thumbnailMaxWidth + thumbnailGap);
- So that the duplication is easier to identify, keeping the duplication
- verbatim for now */
+const getGapFromScreenEdge = (width: number) =>
+ width > thumbnailLayoutMinColumns * thumbnailMaxWidth ? 24 : 4;
-const GAP_BTW_TILES = 4;
-const IMAGE_CONTAINER_MAX_HEIGHT = 180;
-const IMAGE_CONTAINER_MAX_WIDTH = 180;
-const MIN_COLUMNS = 4;
-
-function getFractionFittableColumns(width: number): number {
- return (
- (width - 2 * getGapFromScreenEdge(width) + GAP_BTW_TILES) /
- (IMAGE_CONTAINER_MAX_WIDTH + GAP_BTW_TILES)
- );
-}
-
-function getGapFromScreenEdge(width: number) {
- if (width > MIN_COLUMNS * IMAGE_CONTAINER_MAX_WIDTH) {
- return 24;
- } else {
- return 4;
- }
-}
-
-function getShrinkRatio(width: number, columns: number) {
- return (
- (width -
- 2 * getGapFromScreenEdge(width) -
- (columns - 1) * GAP_BTW_TILES) /
- (columns * IMAGE_CONTAINER_MAX_WIDTH)
- );
-}
+const getShrinkRatio = (width: number, columns: number) =>
+ (width - 2 * getGapFromScreenEdge(width) - (columns - 1) * thumbnailGap) /
+ (columns * thumbnailMaxWidth);