From 6d310d629700a6a87c5ed9fcc0928c0a8ff532e7 Mon Sep 17 00:00:00 2001 From: Michael Manganiello Date: Sat, 18 Nov 2023 21:32:28 -0500 Subject: [PATCH] fix(mobile): Mark more strings for translation (#5132) * fix(mobile): Mark more strings for translation Moving more strings to the `i18n` JSON file, and also including their es-US translations. * Add more translatable strings --- mobile/assets/i18n/en-US.json | 53 +++++++++++++++++- mobile/assets/i18n/es-US.json | 56 ++++++++++++++++++- .../album/views/album_options_part.dart | 12 ++-- mobile/lib/modules/login/ui/login_form.dart | 2 +- .../modules/map/ui/map_page_bottom_sheet.dart | 2 +- .../modules/map/ui/map_settings_dialog.dart | 21 ++++--- .../modules/search/ui/curated_places_row.dart | 11 ++-- .../search/ui/person_name_edit_form.dart | 17 +++--- .../search/views/person_result_page.dart | 13 +++-- .../lib/modules/search/views/search_page.dart | 2 +- .../advanced_settings/advanced_settings.dart | 9 ++- .../local_storage_settings.dart | 8 +-- .../views/shared_link_edit_page.dart | 35 ++++++------ .../providers/server_info.provider.dart | 12 ++-- 14 files changed, 181 insertions(+), 72 deletions(-) diff --git a/mobile/assets/i18n/en-US.json b/mobile/assets/i18n/en-US.json index 2862279794..8233fcd7f2 100644 --- a/mobile/assets/i18n/en-US.json +++ b/mobile/assets/i18n/en-US.json @@ -1,6 +1,7 @@ { "add_to_album_bottom_sheet_added": "Added to {album}", "add_to_album_bottom_sheet_already_exists": "Already in {album}", + "advanced_settings_log_level_title": "Log level: {}", "advanced_settings_prefer_remote_subtitle": "Some devices are painfully slow to load thumbnails from assets on the device. Activate this setting to load remote images instead.", "advanced_settings_prefer_remote_title": "Prefer remote images", "advanced_settings_self_signed_ssl_subtitle": "Skips SSL certificate verification for the server endpoint. Required for self-signed certificates.", @@ -106,6 +107,9 @@ "cache_settings_album_thumbnails": "Library page thumbnails ({} assets)", "cache_settings_clear_cache_button": "Clear cache", "cache_settings_clear_cache_button_title": "Clears the app's cache. This will significantly impact the app's performance until the cache has rebuilt.", + "cache_settings_duplicated_assets_clear_button": "CLEAR", + "cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app", + "cache_settings_duplicated_assets_title": "Duplicated Assets ({})", "cache_settings_image_cache_size": "Image cache size ({} assets)", "cache_settings_statistics_album": "Library thumbnails", "cache_settings_statistics_assets": "{} assets ({})", @@ -195,6 +199,7 @@ "library_page_sort_title": "Album title", "login_disabled": "Login has been disabled", "login_form_api_exception": "API exception. Please check the server URL and try again.", + "login_form_back_button_text": "Back", "login_form_button_text": "Login", "login_form_email_hint": "youremail@email.com", "login_form_endpoint_hint": "http://your-server-ip:port/api", @@ -217,6 +222,10 @@ "login_form_server_error": "Could not connect to server.", "login_password_changed_error": "There was an error updating your password", "login_password_changed_success": "Password updated successfully", + "map_assets_in_bounds": { + "one": "{} photo", + "many": "{} photos" + }, "map_cannot_get_user_location": "Cannot get user's location", "map_location_dialog_cancel": "Cancel", "map_location_dialog_yes": "Yes", @@ -226,6 +235,15 @@ "map_no_location_permission_content": "Location permission is needed to display assets from your current location. Do you want to allow it now?", "map_no_location_permission_title": "Location Permission denied", "map_settings_dark_mode": "Dark mode", + "map_settings_date_range_option_all": "All", + "map_settings_date_range_option_days": { + "one": "Past 24 hours", + "other": "Past {} days" + }, + "map_settings_date_range_option_years": { + "one": "Past year", + "other": "Past {} years" + }, "map_settings_dialog_cancel": "Cancel", "map_settings_dialog_save": "Save", "map_settings_dialog_title": "Map Settings", @@ -261,9 +279,13 @@ "permission_onboarding_permission_limited": "Permission limited. To let Immich backup and manage your entire gallery collection, grant photo and video permissions in Settings.", "permission_onboarding_request": "Immich requires permission to view your photos and videos.", "profile_drawer_app_logs": "Logs", + "profile_drawer_client_out_of_date_major": "Mobile App is out of date. Please update to the latest major version.", + "profile_drawer_client_out_of_date_minor": "Mobile App is out of date. Please update to the latest minor version.", "profile_drawer_client_server_up_to_date": "Client and Server are up-to-date", "profile_drawer_documentation": "Documentation", "profile_drawer_github": "GitHub", + "profile_drawer_server_out_of_date_major": "Server is out of date. Please update to the latest major version.", + "profile_drawer_server_out_of_date_minor": "Server is out of date. Please update to the latest minor version.", "profile_drawer_settings": "Settings", "profile_drawer_sign_out": "Sign Out", "profile_drawer_trash": "Trash", @@ -275,6 +297,13 @@ "search_page_no_objects": "No Objects Info Available", "search_page_no_places": "No Places Info Available", "search_page_people": "People", + "search_page_person_add_name_dialog_cancel": "Cancel", + "search_page_person_add_name_dialog_save": "Save", + "search_page_person_add_name_dialog_hint": "Name", + "search_page_person_add_name_dialog_title": "Add a name", + "search_page_person_add_name_subtitle": "Find them fast by name with search", + "search_page_person_add_name_title": "Add a name", + "search_page_person_edit_name": "Edit name", "search_page_places": "Places", "search_page_recently_added": "Recently added", "search_page_screenshots": "Screenshots", @@ -283,6 +312,7 @@ "search_page_videos": "Videos", "search_page_view_all_button": "View all", "search_page_your_activity": "Your activity", + "search_page_your_map": "Your Map", "search_result_page_new_search_hint": "New Search", "search_suggestion_list_smart_search_hint_1": "Smart search is enabled by default, to search for metadata use the syntax ", "search_suggestion_list_smart_search_hint_2": "m:your-search-term", @@ -322,9 +352,17 @@ "shared_album_activity_remove_title": "Delete Activity", "shared_album_activity_setting_subtitle": "Let others respond", "shared_album_activity_setting_title": "Comments & likes", + "shared_album_section_people_action_error": "Error leaving/removing from album", + "shared_album_section_people_action_leave": "Remove user from album", + "shared_album_section_people_action_remove_user": "Remove user from album", + "shared_album_section_people_owner_label": "Owner", + "shared_album_section_people_title": "PEOPLE", "share_dialog_preparing": "Preparing...", "shared_link_app_bar_title": "Shared Links", + "shared_link_clipboard_copied_massage": "Copied to clipboard", + "shared_link_clipboard_text": "Link: {}\nPassword: {}", "shared_link_create_app_bar_title": "Create link to share", + "shared_link_create_error": "Error while creating shared link", "shared_link_create_info": "Let anyone with the link see the selected photo(s)", "shared_link_create_submit_button": "Create link", "shared_link_edit_allow_download": "Allow public user to download", @@ -334,6 +372,19 @@ "shared_link_edit_description": "Description", "shared_link_edit_description_hint": "Enter the share description", "shared_link_edit_expire_after": "Expire after", + "shared_link_edit_expire_after_option_days": { + "one": "{} day", + "other": "{} days" + }, + "shared_link_edit_expire_after_option_hours": { + "one": "{} hour", + "other": "{} hours" + }, + "shared_link_edit_expire_after_option_minutes": { + "one": "{} minute", + "other": "{} minutes" + }, + "shared_link_edit_expire_after_option_never": "Never", "shared_link_edit_password": "Password", "shared_link_edit_password_hint": "Enter the share password", "shared_link_edit_show_meta": "Show metadata", @@ -388,4 +439,4 @@ "viewer_remove_from_stack": "Remove from Stack", "viewer_stack_use_as_main_asset": "Use as Main Asset", "viewer_unstack": "Un-Stack" -} \ No newline at end of file +} diff --git a/mobile/assets/i18n/es-US.json b/mobile/assets/i18n/es-US.json index a932a6f881..24ea49a9df 100644 --- a/mobile/assets/i18n/es-US.json +++ b/mobile/assets/i18n/es-US.json @@ -1,6 +1,7 @@ { "add_to_album_bottom_sheet_added": "Agregado a {album}", "add_to_album_bottom_sheet_already_exists": "Ya se encuentra en {album}", + "advanced_settings_log_level_title": "Nivel de registro: {}", "advanced_settings_prefer_remote_subtitle": "Algunos dispositivos tardan mucho en cargar las miniaturas de recursos encontrados en el dispositivo. Activa esta opción para cargar imágenes remotas en su lugar.", "advanced_settings_prefer_remote_title": "Preferir imágenes remotas", "advanced_settings_self_signed_ssl_subtitle": "Omite la verificación del certificado SSL para la URL del servidor. Requerido para certificados autofirmados.", @@ -106,6 +107,9 @@ "cache_settings_album_thumbnails": "Miniaturas de la página de la biblioteca ({} recursos)", "cache_settings_clear_cache_button": "Borrar caché", "cache_settings_clear_cache_button_title": "Borra la caché de la aplicación. Esto afectará significativamente el rendimiento de la aplicación hasta que se reconstruya la caché.", + "cache_settings_duplicated_assets_clear_button": "BORRAR", + "cache_settings_duplicated_assets_subtitle": "Fotos y videos que son ignorados por la aplicación", + "cache_settings_duplicated_assets_title": "Recursos duplicados ({})", "cache_settings_image_cache_size": "Tamaño de la caché de imágenes ({} recursos)", "cache_settings_statistics_album": "Miniaturas de la biblioteca", "cache_settings_statistics_assets": "{} recursos ({})", @@ -174,6 +178,7 @@ "home_page_building_timeline": "Construyendo la línea de tiempo", "home_page_favorite_err_local": "Aún no se pueden marcar recursos locales como favoritos, omitiendo", "home_page_first_time_notice": "Si ésta es la primera vez que usas la app, por favor, asegúrate de elegir un álbum de respaldo para que la línea de tiempo pueda cargar fotos y videos en los álbumes.", + "home_page_share_err_local": "No se pueden compartir recursos locales a través de enlaces, omitiendo", "home_page_upload_err_limit": "Sólo se pueden subir un máximo de 30 recursos a la vez, omitiendo", "home_page_favorite_err_partner": "Aún no se pueden marcar recursos de compañeros como favoritos, omitiendo", "home_page_album_err_partner": "Aún no se pueden agregar recursos de compañeros a un álbum, omitiendo", @@ -194,6 +199,7 @@ "library_page_sort_title": "Título del álbum", "login_disabled": "El inicio de sesión ha sido deshabilitado", "login_form_api_exception": "Excepción de API. Por favor, verifica la URL del servidor e inténtalo de nuevo.", + "login_form_back_button_text": "Volver", "login_form_button_text": "Iniciar sesión", "login_form_email_hint": "tucorreo@correo.com", "login_form_endpoint_hint": "http://ip-de-tu-servidor:puerto/api", @@ -216,6 +222,10 @@ "login_form_server_error": "No se pudo conectar al servidor.", "login_password_changed_error": "Hubo un error al actualizar tu contraseña", "login_password_changed_success": "Contraseña actualizada exitosamente", + "map_assets_in_bounds": { + "one": "{} foto", + "other": "{} fotos" + }, "map_cannot_get_user_location": "No se puede obtener la ubicación del usuario", "map_location_dialog_cancel": "Cancelar", "map_location_dialog_yes": "Sí", @@ -225,6 +235,15 @@ "map_no_location_permission_content": "Se necesita permiso de ubicación para mostrar recursos desde tu ubicación actual. ¿Quieres permitirlo ahora?", "map_no_location_permission_title": "Permiso de ubicación denegado", "map_settings_dark_mode": "Modo oscuro", + "map_settings_date_range_option_all": "Todo", + "map_settings_date_range_option_days": { + "one": "Últimas 24 horas", + "other": "Últimos {} días" + }, + "map_settings_date_range_option_years": { + "one": "Último año", + "other": "Últimos {} años" + }, "map_settings_dialog_cancel": "Cancelar", "map_settings_dialog_save": "Guardar", "map_settings_dialog_title": "Configuración del mapa", @@ -249,6 +268,7 @@ "partner_page_stop_sharing_content": "{} ya no podrá acceder a tus fotos", "partner_page_stop_sharing_title": "¿Dejar de compartir tus fotos?", "partner_page_title": "Compañero", + "permission_onboarding_back": "Volver", "permission_onboarding_continue_anyway": "Continuar de todos modos", "permission_onboarding_get_started": "Empezar", "permission_onboarding_go_to_settings": "Ir a configuración", @@ -259,9 +279,13 @@ "permission_onboarding_permission_limited": "Permiso limitado. Para permitir que Immich haga copia de seguridad y gestione toda tu colección de galería, concede permisos de fotos y videos en Configuración.", "permission_onboarding_request": "Immich requiere permiso para ver tus fotos y videos.", "profile_drawer_app_logs": "Registros", + "profile_drawer_client_out_of_date_major": "La aplicación móvil está desactualizada. Actualiza a la última versión mayor.", + "profile_drawer_client_out_of_date_minor": "La aplicación móvil está desactualizada. Actualiza a la última versión menor.", "profile_drawer_client_server_up_to_date": "El cliente y el servidor están actualizados", "profile_drawer_documentation": "Documentación", "profile_drawer_github": "GitHub", + "profile_drawer_server_out_of_date_major": "El servidor está desactualizado. Actualiza a la última versión mayor.", + "profile_drawer_server_out_of_date_minor": "El servidor está desactualizado. Actualiza a la última versión menor.", "profile_drawer_settings": "Configuración", "profile_drawer_sign_out": "Cerrar sesión", "profile_drawer_trash": "Papelera", @@ -269,10 +293,17 @@ "search_bar_hint": "Busca tus fotos", "search_page_categories": "Categorías", "search_page_favorites": "Favoritos", - "search_page_motion_photos": "Fotos en .ovimiento", + "search_page_motion_photos": "Fotos en movimiento", "search_page_no_objects": "No hay información de objetos disponible", "search_page_no_places": "No hay información de lugares disponible", "search_page_people": "Personas", + "search_page_person_add_name_dialog_cancel": "Cancelar", + "search_page_person_add_name_dialog_hint": "Nombre", + "search_page_person_add_name_dialog_save": "Guardar", + "search_page_person_add_name_dialog_title": "Agregar nombre", + "search_page_person_add_name_subtitle": "Encuéntralos rápidamente por nombre", + "search_page_person_add_name_title": "Agregar un nombre", + "search_page_person_edit_name": "Editar nombre", "search_page_places": "Lugares", "search_page_recently_added": "Recién agregados", "search_page_screenshots": "Capturas de pantalla", @@ -281,6 +312,7 @@ "search_page_videos": "Videos", "search_page_view_all_button": "Ver todo", "search_page_your_activity": "Tu actividad", + "search_page_your_map": "Tu mapa", "search_result_page_new_search_hint": "Nueva búsqueda", "search_suggestion_list_smart_search_hint_1": "La búsqueda inteligente está habilitada por defecto, para buscar metadatos utiliza la sintaxis ", "search_suggestion_list_smart_search_hint_2": "m:tu-término-de-búsqueda", @@ -290,6 +322,7 @@ "server_info_box_app_version": "Versión de la Aplicación", "server_info_box_server_url": "URL del Servidor", "server_info_box_server_version": "Versión del Servidor", + "server_info_box_latest_release": "Última versión", "setting_image_viewer_help": "El visor de detalles carga primero la miniatura pequeña, luego carga la vista previa de tamaño mediano (si está habilitada), finalmente carga la original (si está habilitada).", "setting_image_viewer_original_subtitle": "Activar para cargar la imagen en resolución original (¡muy grande!). Deshabilitar para reducir el consumo de datos (de red y caché).", "setting_image_viewer_original_title": "Cargar imagen original", @@ -319,9 +352,17 @@ "shared_album_activity_remove_title": "Eliminar actividad", "shared_album_activity_setting_subtitle": "Permitir que otros respondan", "shared_album_activity_setting_title": "Comentarios y me gusta", + "shared_album_section_people_action_error": "Error al dejar/remover del álbum", + "shared_album_section_people_action_leave": "Dejar álbum", + "shared_album_section_people_action_remove_user": "Remover usuario del álbum", + "shared_album_section_people_owner_label": "Dueño", + "shared_album_section_people_title": "PERSONAS", "share_dialog_preparing": "Preparando...", "shared_link_app_bar_title": "Enlaces compartidos", + "shared_link_clipboard_copied_massage": "Copiado al portapapeles", + "shared_link_clipboard_text": "Enlace: {}\nContraseña: {}", "shared_link_create_app_bar_title": "Crear enlace para compartir", + "shared_link_create_error": "Error al crear enlace compartido", "shared_link_create_info": "Permitir que cualquiera con el enlace vea la(s) foto(s) seleccionada(s)", "shared_link_create_submit_button": "Crear enlace", "shared_link_edit_allow_download": "Permitir que el usuario público pueda descargar", @@ -331,6 +372,19 @@ "shared_link_edit_description": "Descripción", "shared_link_edit_description_hint": "Introduce la descripción del enlace", "shared_link_edit_expire_after": "Expirar después de", + "shared_link_edit_expire_after_option_days": { + "one": "{} día", + "other": "{} días" + }, + "shared_link_edit_expire_after_option_hours": { + "one": "{} hora", + "other": "{} horas" + }, + "shared_link_edit_expire_after_option_minutes": { + "one": "{} minuto", + "other": "{} minutos" + }, + "shared_link_edit_expire_after_option_never": "Nunca", "shared_link_edit_password": "Contraseña", "shared_link_edit_password_hint": "Introduce la contraseña del enlace", "shared_link_edit_show_meta": "Mostrar metadatos", diff --git a/mobile/lib/modules/album/views/album_options_part.dart b/mobile/lib/modules/album/views/album_options_part.dart index 5e5a3a6b86..cac70df75a 100644 --- a/mobile/lib/modules/album/views/album_options_part.dart +++ b/mobile/lib/modules/album/views/album_options_part.dart @@ -30,7 +30,7 @@ class AlbumOptionsPage extends HookConsumerWidget { Navigator.pop(context); ImmichToast.show( context: context, - msg: "Error leaving/removing from album", + msg: "shared_album_section_people_action_error".tr(), toastType: ToastType.error, gravity: ToastGravity.BOTTOM, ); @@ -81,7 +81,7 @@ class AlbumOptionsPage extends HookConsumerWidget { actions = [ ListTile( leading: const Icon(Icons.exit_to_app_rounded), - title: const Text("Leave album"), + title: const Text("shared_album_section_people_action_leave").tr(), onTap: leaveAlbum, ), ]; @@ -91,7 +91,7 @@ class AlbumOptionsPage extends HookConsumerWidget { actions = [ ListTile( leading: const Icon(Icons.person_remove_rounded), - title: const Text("Remove user from album"), + title: const Text("shared_album_section_people_remove_user").tr(), onTap: () => removeUserFromAlbum(user), ), ]; @@ -130,11 +130,11 @@ class AlbumOptionsPage extends HookConsumerWidget { style: TextStyle(color: Colors.grey[500]), ), trailing: const Text( - "Owner", + "shared_album_section_people_owner_label", style: TextStyle( fontWeight: FontWeight.bold, ), - ), + ).tr(), ); } @@ -215,7 +215,7 @@ class AlbumOptionsPage extends HookConsumerWidget { subtitle: const Text("shared_album_activity_setting_subtitle").tr(), ), - buildSectionTitle("PEOPLE"), + buildSectionTitle("shared_album_section_people_title".tr()), buildOwnerInfo(), buildSharedUsersList(), ], diff --git a/mobile/lib/modules/login/ui/login_form.dart b/mobile/lib/modules/login/ui/login_form.dart index 5cdcbe0341..835907d052 100644 --- a/mobile/lib/modules/login/ui/login_form.dart +++ b/mobile/lib/modules/login/ui/login_form.dart @@ -358,7 +358,7 @@ class LoginForm extends HookConsumerWidget { TextButton.icon( icon: const Icon(Icons.arrow_back), onPressed: () => serverEndpoint.value = null, - label: const Text('Back'), + label: const Text('login_form_back_button_text').tr(), ), ], ), diff --git a/mobile/lib/modules/map/ui/map_page_bottom_sheet.dart b/mobile/lib/modules/map/ui/map_page_bottom_sheet.dart index 0d0dfb4126..20d4654b6a 100644 --- a/mobile/lib/modules/map/ui/map_page_bottom_sheet.dart +++ b/mobile/lib/modules/map/ui/map_page_bottom_sheet.dart @@ -176,7 +176,7 @@ class AssetsInBoundBottomSheetState extends ConsumerState { Widget buildDragHandle(ScrollController scrollController) { final textToDisplay = assetsInBound.value.isNotEmpty - ? "${assetsInBound.value.length} photo${assetsInBound.value.length > 1 ? "s" : ""}" + ? "map_assets_in_bounds".plural(assetsInBound.value.length) : "map_no_assets_in_bounds".tr(); final dragHandle = Container( height: 60, diff --git a/mobile/lib/modules/map/ui/map_settings_dialog.dart b/mobile/lib/modules/map/ui/map_settings_dialog.dart index b7503cd525..1d1e8b4c0e 100644 --- a/mobile/lib/modules/map/ui/map_settings_dialog.dart +++ b/mobile/lib/modules/map/ui/map_settings_dialog.dart @@ -76,18 +76,21 @@ class MapSettingsDialog extends HookConsumerWidget { showRelativeDate.value = value!; }, dropdownMenuEntries: [ - const DropdownMenuEntry(value: 0, label: "All"), - const DropdownMenuEntry( + DropdownMenuEntry( + value: 0, + label: "map_settings_date_range_option_all".tr(), + ), + DropdownMenuEntry( value: 1, - label: "Past 24 hours", + label: "map_settings_date_range_option_days".plural(1), ), - const DropdownMenuEntry( + DropdownMenuEntry( value: 7, - label: "Past 7 days", + label: "map_settings_date_range_option_days".plural(7), ), - const DropdownMenuEntry( + DropdownMenuEntry( value: 30, - label: "Past 30 days", + label: "map_settings_date_range_option_days".plural(30), ), DropdownMenuEntry( value: now @@ -102,7 +105,7 @@ class MapSettingsDialog extends HookConsumerWidget { ), ) .inDays, - label: "Past year", + label: "map_settings_date_range_option_years".plural(1), ), DropdownMenuEntry( value: now @@ -117,7 +120,7 @@ class MapSettingsDialog extends HookConsumerWidget { ), ) .inDays, - label: "Past 3 years", + label: "map_settings_date_range_option_years".plural(3), ), ], ); diff --git a/mobile/lib/modules/search/ui/curated_places_row.dart b/mobile/lib/modules/search/ui/curated_places_row.dart index 9c6324daab..b0343f5ed5 100644 --- a/mobile/lib/modules/search/ui/curated_places_row.dart +++ b/mobile/lib/modules/search/ui/curated_places_row.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/modules/map/ui/map_thumbnail.dart'; @@ -64,18 +65,18 @@ class CuratedPlacesRow extends CuratedRow { ), ), ), - const Align( + Align( alignment: Alignment.bottomCenter, child: Padding( - padding: EdgeInsets.only(bottom: 10), - child: Text( - "Your Map", + padding: const EdgeInsets.only(bottom: 10), + child: const Text( + "search_page_your_map", style: TextStyle( color: Colors.white, fontWeight: FontWeight.bold, fontSize: 14, ), - ), + ).tr(), ), ), ], diff --git a/mobile/lib/modules/search/ui/person_name_edit_form.dart b/mobile/lib/modules/search/ui/person_name_edit_form.dart index 0dbb03825d..6e50131f9c 100644 --- a/mobile/lib/modules/search/ui/person_name_edit_form.dart +++ b/mobile/lib/modules/search/ui/person_name_edit_form.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -27,15 +28,15 @@ class PersonNameEditForm extends HookConsumerWidget { return AlertDialog( title: const Text( - "Add a name", + "search_page_person_add_name_dialog_title", style: TextStyle(fontWeight: FontWeight.bold), - ), + ).tr(), content: SingleChildScrollView( child: TextFormField( controller: controller, autofocus: true, - decoration: const InputDecoration( - hintText: 'Name', + decoration: InputDecoration( + hintText: 'search_page_person_add_name_dialog_hint'.tr(), ), ), ), @@ -49,12 +50,12 @@ class PersonNameEditForm extends HookConsumerWidget { ); }, child: Text( - "Cancel", + "search_page_person_add_name_dialog_cancel", style: TextStyle( color: Colors.red[300], fontWeight: FontWeight.bold, ), - ), + ).tr(), ), TextButton( onPressed: () { @@ -70,12 +71,12 @@ class PersonNameEditForm extends HookConsumerWidget { ); }, child: Text( - "Save", + "search_page_person_add_name_dialog_save", style: TextStyle( color: context.primaryColor, fontWeight: FontWeight.bold, ), - ), + ).tr(), ), ], ); diff --git a/mobile/lib/modules/search/views/person_result_page.dart b/mobile/lib/modules/search/views/person_result_page.dart index bec5e4f1b2..2e8637bc7e 100644 --- a/mobile/lib/modules/search/views/person_result_page.dart +++ b/mobile/lib/modules/search/views/person_result_page.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -52,9 +53,9 @@ class PersonResultPage extends HookConsumerWidget { ListTile( leading: const Icon(Icons.edit_outlined), title: const Text( - 'Edit name', + 'search_page_person_edit_name', style: TextStyle(fontWeight: FontWeight.bold), - ), + ).tr(), onTap: showEditNameDialog, ), ], @@ -72,15 +73,15 @@ class PersonResultPage extends HookConsumerWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'Add a name', + 'search_page_person_add_name_title', style: context.textTheme.titleSmall?.copyWith( color: context.themeData.colorScheme.secondary, ), - ), + ).tr(), Text( - 'Find them fast by name with search', + 'search_page_person_add_name_subtitle', style: context.textTheme.labelSmall, - ), + ).tr(), ], ), ); diff --git a/mobile/lib/modules/search/views/search_page.dart b/mobile/lib/modules/search/views/search_page.dart index c06db53a3f..562e42c326 100644 --- a/mobile/lib/modules/search/views/search_page.dart +++ b/mobile/lib/modules/search/views/search_page.dart @@ -198,7 +198,7 @@ class SearchPage extends HookConsumerWidget { ).tr(), ), ListTile( - title: Text('Screenshots', style: categoryTitleStyle).tr(), + title: Text('search_page_screenshots', style: categoryTitleStyle).tr(), leading: Icon( Icons.screenshot, color: categoryIconColor, diff --git a/mobile/lib/modules/settings/ui/advanced_settings/advanced_settings.dart b/mobile/lib/modules/settings/ui/advanced_settings/advanced_settings.dart index 83bf4bb948..e07c30dae2 100644 --- a/mobile/lib/modules/settings/ui/advanced_settings/advanced_settings.dart +++ b/mobile/lib/modules/settings/ui/advanced_settings/advanced_settings.dart @@ -68,11 +68,10 @@ class AdvancedSettings extends HookConsumerWidget { ), ListTile( dense: true, - title: Text( - // Not translated because the levels are only English - "Log level: $logLevel", - style: const TextStyle(fontWeight: FontWeight.bold), - ), + title: const Text( + "advanced_settings_log_level_title", + style: TextStyle(fontWeight: FontWeight.bold), + ).tr(args: [logLevel]), subtitle: Slider( value: levelId.value.toDouble(), onChanged: (double v) => levelId.value = v.toInt(), diff --git a/mobile/lib/modules/settings/ui/local_storage_settings/local_storage_settings.dart b/mobile/lib/modules/settings/ui/local_storage_settings/local_storage_settings.dart index cd753de31f..df1bcbdf7f 100644 --- a/mobile/lib/modules/settings/ui/local_storage_settings/local_storage_settings.dart +++ b/mobile/lib/modules/settings/ui/local_storage_settings/local_storage_settings.dart @@ -42,12 +42,12 @@ class LocalStorageSettings extends HookConsumerWidget { children: [ ListTile( title: Text( - "Duplicated Assets (${cacheItemCount.value})", + "cache_settings_duplicated_assets_title", style: context.textTheme.labelLarge ?.copyWith(fontWeight: FontWeight.bold), - ).tr(), + ).tr(args: ["${cacheItemCount.value}"]), subtitle: const Text( - "Photos and videos that are black listed by the app", + "cache_settings_duplicated_assets_subtitle", style: TextStyle( fontSize: 13, ), @@ -55,7 +55,7 @@ class LocalStorageSettings extends HookConsumerWidget { trailing: TextButton( onPressed: cacheItemCount.value > 0 ? clearCache : null, child: Text( - "CLEAR", + "cache_settings_duplicated_assets_clear_button", style: TextStyle( fontSize: 12, color: cacheItemCount.value > 0 ? Colors.red : Colors.grey, diff --git a/mobile/lib/modules/shared_link/views/shared_link_edit_page.dart b/mobile/lib/modules/shared_link/views/shared_link_edit_page.dart index 71f2648c0a..df14ba3d9d 100644 --- a/mobile/lib/modules/shared_link/views/shared_link_edit_page.dart +++ b/mobile/lib/modules/shared_link/views/shared_link_edit_page.dart @@ -230,31 +230,34 @@ class SharedLinkEditPage extends HookConsumerWidget { borderSide: BorderSide(color: Colors.grey), ), ), - dropdownMenuEntries: const [ - DropdownMenuEntry(value: 0, label: "Never"), + dropdownMenuEntries: [ + DropdownMenuEntry( + value: 0, + label: "shared_link_edit_expire_after_option_never".tr(), + ), DropdownMenuEntry( value: 30, - label: '30 minutes', + label: "shared_link_edit_expire_after_option_minutes".plural(30), ), DropdownMenuEntry( value: 60, - label: '1 hour', + label: "shared_link_edit_expire_after_option_hours".plural(1), ), DropdownMenuEntry( value: 60 * 6, - label: '6 hours', + label: "shared_link_edit_expire_after_option_hours".plural(6), ), DropdownMenuEntry( value: 60 * 24, - label: '1 day', + label: "shared_link_edit_expire_after_option_days".plural(1), ), DropdownMenuEntry( value: 60 * 24 * 7, - label: '7 days', + label: "shared_link_edit_expire_after_option_days".plural(7), ), DropdownMenuEntry( value: 60 * 24 * 30, - label: '30 days', + label: "shared_link_edit_expire_after_option_days".plural(30), ), ], ); @@ -265,15 +268,15 @@ class SharedLinkEditPage extends HookConsumerWidget { ClipboardData( text: passwordController.text.isEmpty ? newShareLink.value - : "Link: ${newShareLink.value}\nPassword: ${passwordController.text}", + : "shared_link_clipboard_text".tr( + args: [newShareLink.value, passwordController.text], + ), ), ).then((_) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text( - "Copied to clipboard", - ), - duration: Duration(seconds: 2), + SnackBar( + content: const Text("shared_link_clipboard_copied_massage").tr(), + duration: const Duration(seconds: 2), ), ); }); @@ -310,7 +313,7 @@ class SharedLinkEditPage extends HookConsumerWidget { context.autoPop(); }, child: const Text( - "Done", + "share_done", style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, @@ -353,7 +356,7 @@ class SharedLinkEditPage extends HookConsumerWidget { context: context, gravity: ToastGravity.BOTTOM, toastType: ToastType.error, - msg: 'Error while creating shared link', + msg: 'shared_link_create_error'.tr(), ); } } diff --git a/mobile/lib/shared/providers/server_info.provider.dart b/mobile/lib/shared/providers/server_info.provider.dart index a012379ef1..b7389824b6 100644 --- a/mobile/lib/shared/providers/server_info.provider.dart +++ b/mobile/lib/shared/providers/server_info.provider.dart @@ -74,8 +74,7 @@ class ServerInfoNotifier extends StateNotifier { if (appVersion["major"]! > serverVersion.major) { state = state.copyWith( isVersionMismatch: true, - versionMismatchErrorMessage: - "Server is out of date. Please update to the latest major version.", + versionMismatchErrorMessage: "profile_drawer_server_out_of_date_major".tr(), ); return; } @@ -83,8 +82,7 @@ class ServerInfoNotifier extends StateNotifier { if (appVersion["major"]! < serverVersion.major) { state = state.copyWith( isVersionMismatch: true, - versionMismatchErrorMessage: - "Mobile App is out of date. Please update to the latest major version.", + versionMismatchErrorMessage: "profile_drawer_client_out_of_date_major".tr(), ); return; } @@ -92,8 +90,7 @@ class ServerInfoNotifier extends StateNotifier { if (appVersion["minor"]! > serverVersion.minor) { state = state.copyWith( isVersionMismatch: true, - versionMismatchErrorMessage: - "Server is out of date. Please update to the latest minor version.", + versionMismatchErrorMessage: "profile_drawer_server_out_of_date_minor".tr(), ); return; } @@ -101,8 +98,7 @@ class ServerInfoNotifier extends StateNotifier { if (appVersion["minor"]! < serverVersion.minor) { state = state.copyWith( isVersionMismatch: true, - versionMismatchErrorMessage: - "Mobile App is out of date. Please update to the latest minor version.", + versionMismatchErrorMessage: "profile_drawer_client_out_of_date_minor".tr(), ); return; }